IyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwpQSwMEFAAAAAAAAAAhAAAAAAAAAAAAAAAAAAsAAABfX2luaXRfXy5weVBLAwQUAAAAAAAAACEA9w/vmLEhAACxIQAACwAAAF9fbWFpbl9fLnB5IyBDb3B5cmlnaHQgMjAxNyBUaGUgQmF6ZWwgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIwojIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwojIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIwojICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAojCiMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQojIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAojIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoiIiJUaGUgcGlwdG9vbCBtb2R1bGUgaW1wb3J0cyBwaXAgcmVxdWlyZW1lbnRzIGludG8gQmF6ZWwgcnVsZXMuIiIiCgojIEJvaWxlcnBsYXRlIGFkZGVkIGJ5IHN1YnBhci9jb21waWxlci9weXRob25fYXJjaGl2ZS5weQpmcm9tIHN1YnBhci5ydW50aW1lIGltcG9ydCBzdXBwb3J0IGFzIF8KXy5zZXR1cChpbXBvcnRfcm9vdHM9WydwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAnLCAncGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMycsICdwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAnLCAnYmF6ZWxfdG9vbHMnLCAncGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMycsICdwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAnLCAncGlwdG9vbF9kZXBzX3B5cGlfX3doZWVsXzBfMzBfMGEwJywgJ3J1bGVzX3B5dGhvbiddLCB6aXBfc2FmZT1UcnVlKQpkZWwgXwojIEVuZCBib2lsZXJwbGF0ZQppbXBvcnQgYXJncGFyc2UKaW1wb3J0IGF0ZXhpdAppbXBvcnQganNvbgppbXBvcnQgb3MKaW1wb3J0IHBrZ3V0aWwKaW1wb3J0IHBrZ19yZXNvdXJjZXMKaW1wb3J0IHJlCmltcG9ydCBzaHV0aWwKaW1wb3J0IHN5cwppbXBvcnQgdGVtcGZpbGUKaW1wb3J0IHppcGZpbGUKCiMgTm90ZTogV2UgY2FyZWZ1bGx5IGltcG9ydCB0aGUgZm9sbG93aW5nIG1vZHVsZXMgaW4gYSBwYXJ0aWN1bGFyCiMgb3JkZXIsIHNpbmNlIHRoZXNlIG1vZHVsZXMgbW9kaWZ5IHRoZSBpbXBvcnQgcGF0aCBhbmQgbWFjaGluZXJ5LgppbXBvcnQgcGtnX3Jlc291cmNlcwoKCmRlZiBleHRyYWN0X3BhY2thZ2VzKHBhY2thZ2VfbmFtZXMpOgogICAgIiIiRXh0cmFjdCB6aXBmaWxlIGNvbnRlbnRzIHRvIGRpc2sgYW5kIGFkZCB0byBpbXBvcnQgcGF0aCIiIgoKICAgICMgU2V0IGEgc2FmZSBleHRyYWN0aW9uIGRpcgogICAgZXh0cmFjdGlvbl90bXBkaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKICAgIGF0ZXhpdC5yZWdpc3RlcihsYW1iZGE6IHNodXRpbC5ybXRyZWUoCiAgICAgICAgZXh0cmFjdGlvbl90bXBkaXIsIGlnbm9yZV9lcnJvcnM9VHJ1ZSkpCiAgICBwa2dfcmVzb3VyY2VzLnNldF9leHRyYWN0aW9uX3BhdGgoZXh0cmFjdGlvbl90bXBkaXIpCgogICAgIyBFeHRyYWN0IGVhY2ggcGFja2FnZSB0byBkaXNrCiAgICBkaXJzX3RvX2FkZCA9IFtdCiAgICBmb3IgcGFja2FnZV9uYW1lIGluIHBhY2thZ2VfbmFtZXM6CiAgICAgICAgcmVxID0gcGtnX3Jlc291cmNlcy5SZXF1aXJlbWVudC5wYXJzZShwYWNrYWdlX25hbWUpCiAgICAgICAgZXh0cmFjdGlvbl9kaXIgPSBwa2dfcmVzb3VyY2VzLnJlc291cmNlX2ZpbGVuYW1lKHJlcSwgJycpCiAgICAgICAgZGlyc190b19hZGQuYXBwZW5kKGV4dHJhY3Rpb25fZGlyKQoKICAgICMgQWRkIGV4dHJhY3RlZCBkaXJlY3RvcmllcyB0byBpbXBvcnQgcGF0aCBhaGVhZCBvZiB0aGVpciB6aXAgZmlsZQogICAgIyBjb3VudGVycGFydHMuCiAgICBzeXMucGF0aFswOjBdID0gZGlyc190b19hZGQKICAgIGV4aXN0aW5nX3B5dGhvbnBhdGggPSBvcy5lbnZpcm9uLmdldCgnUFlUSE9OUEFUSCcpCiAgICBpZiBleGlzdGluZ19weXRob25wYXRoOgogICAgICAgIGRpcnNfdG9fYWRkLmV4dGVuZChleGlzdGluZ19weXRob25wYXRoLnNwbGl0KCc6JykpCiAgICBvcy5lbnZpcm9uWydQWVRIT05QQVRIJ10gPSAnOicuam9pbihkaXJzX3RvX2FkZCkKCgojIFdoZWVsLCBwaXAsIGFuZCBzZXR1cHRvb2xzIGFyZSBtdWNoIGhhcHBpZXIgcnVubmluZyBmcm9tIGFjdHVhbAojIGZpbGVzIG9uIGRpc2ssIHJhdGhlciB0aGFuIGVudHJpZXMgaW4gYSB6aXBmaWxlLiAgRXh0cmFjdCB6aXBmaWxlCiMgY29udGVudHMsIGFkZCB0aG9zZSBjb250ZW50cyB0byB0aGUgcGF0aCwgdGhlbiBpbXBvcnQgdGhlbS4KZXh0cmFjdF9wYWNrYWdlcyhbJ3BpcCcsICdzZXR1cHRvb2xzJywgJ3doZWVsJ10pCgojIERlZmVhdCBwaXAncyBhdHRlbXB0IHRvIG1hbmdsZSBzeXMucGF0aApzYXZlZF9zeXNfcGF0aCA9IHN5cy5wYXRoCnN5cy5wYXRoID0gc3lzLnBhdGhbOl0KaW1wb3J0IHBpcApzeXMucGF0aCA9IHNhdmVkX3N5c19wYXRoCgppbXBvcnQgc2V0dXB0b29scwppbXBvcnQgd2hlZWwKCgpkZWYgcGlwX21haW4oYXJndik6CiAgICAjIEV4dHJhY3QgdGhlIGNlcnRpZmljYXRlcyBmcm9tIHRoZSBQQVIgZm9sbG93aW5nIHRoZSBleGFtcGxlIG9mIGdldC1waXAucHkKICAgICMgaHR0cHM6Ly9naXRodWIuY29tL3B5cGEvZ2V0LXBpcC9ibG9iLzQzMGJhMzc3NzZhZTJhZDg5L3RlbXBsYXRlLnB5I0wxNjQtTDE2OAogICAgY2VydF90bXBkaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKICAgIGNlcnRfcGF0aCA9IG9zLnBhdGguam9pbihjZXJ0X3RtcGRpciwgImNhY2VydC5wZW0iKQogICAgYXRleGl0LnJlZ2lzdGVyKGxhbWJkYTogc2h1dGlsLnJtdHJlZShjZXJ0X3RtcGRpciwgaWdub3JlX2Vycm9ycz1UcnVlKSkKICAgIHdpdGggb3BlbihjZXJ0X3BhdGgsICJ3YiIpIGFzIGNlcnQ6CiAgICAgIGNlcnQud3JpdGUocGtndXRpbC5nZXRfZGF0YSgicGlwLl92ZW5kb3IucmVxdWVzdHMiLCAiY2FjZXJ0LnBlbSIpKQogICAgYXJndiA9IFsiLS1pc29sYXRlZCIsICItLWRpc2FibGUtcGlwLXZlcnNpb24tY2hlY2siLCAiLS1jZXJ0IiwgY2VydF9wYXRoXSArIGFyZ3YKICAgIHJldHVybiBwaXAubWFpbihhcmd2KQoKZnJvbSBwYWNrYWdpbmcud2hsIGltcG9ydCBXaGVlbAoKcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoCiAgICBkZXNjcmlwdGlvbj0nSW1wb3J0IFB5dGhvbiBkZXBlbmRlbmNpZXMgaW50byBCYXplbC4nKQoKcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1weXRob25faW50ZXJwcmV0ZXInLCBhY3Rpb249J3N0b3JlJywKICAgICAgICAgICAgICAgICAgICBoZWxwPSgnVGhlIFB5dGhvbiBpbnRlcnByZXRlciB0byB1c2Ugd2hlbiBleHRyYWN0aW5nICcKICAgICAgICAgICAgICAgICAgICAgICAgICAnd2hlZWxzLicpKQoKcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1uYW1lJywgYWN0aW9uPSdzdG9yZScsCiAgICAgICAgICAgICAgICAgICAgaGVscD0oJ1RoZSBuYW1lc3BhY2Ugb2YgdGhlIGltcG9ydC4nKSkKCnBhcnNlci5hZGRfYXJndW1lbnQoJy0taW5wdXQnLCBhY3Rpb249J3N0b3JlJywKICAgICAgICAgICAgICAgICAgICBoZWxwPSgnVGhlIHJlcXVpcmVtZW50cy50eHQgZmlsZSB0byBpbXBvcnQuJykpCgpwYXJzZXIuYWRkX2FyZ3VtZW50KCctLW91dHB1dCcsIGFjdGlvbj0nc3RvcmUnLAogICAgICAgICAgICAgICAgICAgIGhlbHA9KCdUaGUgcmVxdWlyZW1lbnRzLmJ6bCBmaWxlIHRvIGV4cG9ydC4nKSkKCnBhcnNlci5hZGRfYXJndW1lbnQoJy0tZGlyZWN0b3J5JywgYWN0aW9uPSdzdG9yZScsCiAgICAgICAgICAgICAgICAgICAgaGVscD0oJ1RoZSBkaXJlY3RvcnkgaW50byB3aGljaCB0byBwdXQgLndobCBmaWxlcy4nKSkKCnBhcnNlci5hZGRfYXJndW1lbnQoJy0tZXh0cmFfcGlwX2FyZ3MnLCBhY3Rpb249J3N0b3JlJywKICAgICAgICAgICAgICAgICAgICBoZWxwPSgnRXh0cmEgYXJndW1lbnRzIHRvIHBhc3MgZG93biB0byBwaXAuJykpCgpkZWYgc29ydF93aGVlbHMod2hscyk6CiAgIiIiU29ydHMgYSBsaXN0IG9mIHdoZWVscyBkZXRlcm1pbmlzdGljYWxseS4iIiIKICByZXR1cm4gc29ydGVkKHdobHMsIGtleT1sYW1iZGEgdzogdy5kaXN0cmlidXRpb24oKSArICdfJyArIHcudmVyc2lvbigpKQoKZGVmIGRldGVybWluZV9wb3NzaWJsZV9leHRyYXMod2hscyk6CiAgIiIiRGV0ZXJtaW5lcyB0aGUgbGlzdCBvZiBwb3NzaWJsZSAiZXh0cmFzIiBmb3IgZWFjaCAud2hsCgogIFRoZSBwb3NzaWJpbGl0eSBvZiBhbiBleHRyYSBpcyBkZXRlcm1pbmVkIGJ5IGxvb2tpbmcgYXQgaXRzCiAgYWRkaXRpb25hbCByZXF1aXJlbWVudHMsIGFuZCBkZXRlcm1pbmluZSB3aGV0aGVyIHRoZXkgYXJlCiAgc2F0aXNmaWVkIGJ5IHRoZSBjb21wbGV0ZSBsaXN0IG9mIGF2YWlsYWJsZSB3aGVlbHMuCgogIEFyZ3M6CiAgICB3aGxzOiBhIGxpc3Qgb2YgV2hlZWwgb2JqZWN0cwoKICBSZXR1cm5zOgogICAgYSBkaWN0IHRoYXQgaXMga2V5ZWQgYnkgdGhlIFdoZWVsIG9iamVjdHMgaW4gd2hscywgYW5kIHdob3NlCiAgICB2YWx1ZXMgYXJlIGxpc3RzIG9mIHBvc3NpYmxlIGV4dHJhcy4KICAiIiIKICB3aGxfbWFwID0gewogICAgd2hsLmRpc3RyaWJ1dGlvbigpOiB3aGwKICAgIGZvciB3aGwgaW4gd2hscwogIH0KCiAgIyBUT0RPKG1hdHRtb29yKTogQ29uc2lkZXIgbWVtb2l6aW5nIGlmIHRoaXMgcmVjdXJzaW9uIGV2ZXIgYmVjb21lcwogICMgZXhwZW5zaXZlIGVub3VnaCB0byB3YXJyYW50IGl0LgogIGRlZiBpc19wb3NzaWJsZShkaXN0cm8sIGV4dHJhKToKICAgIGRpc3RybyA9IGRpc3Ryby5yZXBsYWNlKCItIiwgIl8iKQogICAgIyBJZiB3ZSBkb24ndCBoYXZlIHRoZSAud2hsIGF0IGFsbCwgdGhlbiB0aGlzIGlzbid0IHBvc3NpYmxlLgogICAgaWYgZGlzdHJvIG5vdCBpbiB3aGxfbWFwOgogICAgICByZXR1cm4gRmFsc2UKICAgIHdobCA9IHdobF9tYXBbZGlzdHJvXQogICAgIyBJZiB3ZSBoYXZlIHRoZSAud2hsLCBhbmQgd2UgZG9uJ3QgbmVlZCBhbnl0aGluZyBleHRyYSB0aGVuCiAgICAjIHdlIGNhbiBzYXRpc2Z5IHRoaXMgZGVwZW5kZW5jeS4KICAgIGlmIG5vdCBleHRyYToKICAgICAgcmV0dXJuIFRydWUKICAgICMgSWYgd2UgZG8gbmVlZCBzb21ldGhpbmcgZXh0cmEsIHRoZW4gY2hlY2sgdGhlIGV4dHJhJ3MKICAgICMgZGVwZW5kZW5jaWVzIHRvIG1ha2Ugc3VyZSB0aGV5IGFyZSBmdWxseSBzYXRpc2ZpZWQuCiAgICBmb3IgZXh0cmFfZGVwIGluIHdobC5kZXBlbmRlbmNpZXMoZXh0cmE9ZXh0cmEpOgogICAgICByZXEgPSBwa2dfcmVzb3VyY2VzLlJlcXVpcmVtZW50LnBhcnNlKGV4dHJhX2RlcCkKICAgICAgIyBDaGVjayB0aGF0IHRoZSBkZXAgYW5kIGFueSBleHRyYXMgYXJlIGFsbCBwb3NzaWJsZS4KICAgICAgaWYgbm90IGlzX3Bvc3NpYmxlKHJlcS5wcm9qZWN0X25hbWUsIE5vbmUpOgogICAgICAgIHJldHVybiBGYWxzZQogICAgICBmb3IgZSBpbiByZXEuZXh0cmFzOgogICAgICAgIGlmIG5vdCBpc19wb3NzaWJsZShyZXEucHJvamVjdF9uYW1lLCBlKToKICAgICAgICAgIHJldHVybiBGYWxzZQogICAgIyBJZiBhbGwgb2YgdGhlIGRlcGVuZGVuY2llcyBvZiB0aGUgZXh0cmEgYXJlIHNhdGlzZmlhYmxlIHRoZW4KICAgICMgaXQgaXMgcG9zc2libGUgdG8gY29uc3RydWN0IHRoaXMgZGVwZW5kZW5jeS4KICAgIHJldHVybiBUcnVlCgogIHJldHVybiB7CiAgICB3aGw6IFsKICAgICAgZXh0cmEKICAgICAgZm9yIGV4dHJhIGluIHNvcnRlZCh3aGwuZXh0cmFzKCkpCiAgICAgIGlmIGlzX3Bvc3NpYmxlKHdobC5kaXN0cmlidXRpb24oKSwgZXh0cmEpCiAgICBdCiAgICBmb3Igd2hsIGluIHdobHMKICB9CgpkZWYgbWFpbigpOgogIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCgogICMgaHR0cHM6Ly9naXRodWIuY29tL3B5cGEvcGlwL2Jsb2IvOS4wLjEvcGlwL19faW5pdF9fLnB5I0wyMDkKICBwaXBfYXJncyA9IFsid2hlZWwiLCAiLXciLCBhcmdzLmRpcmVjdG9yeSwgIi1yIiwgYXJncy5pbnB1dF0KICBpZiBhcmdzLmV4dHJhX3BpcF9hcmdzOgogICAgICBwaXBfYXJncyArPSBhcmdzLmV4dHJhX3BpcF9hcmdzLnN0cmlwKCJcIiIpLnNwbGl0KCkKICBpZiBwaXBfbWFpbihwaXBfYXJncyk6CiAgICBzeXMuZXhpdCgxKQoKICAjIEVudW1lcmF0ZSB0aGUgLndobCBmaWxlcyB3ZSBkb3dubG9hZGVkLgogIGRlZiBsaXN0X3dobHMoKToKICAgIGRpciA9IGFyZ3MuZGlyZWN0b3J5ICsgJy8nCiAgICBmb3Igcm9vdCwgdW51c2VkX2Rpcm5hbWVzLCBmaWxlbmFtZXMgaW4gb3Mud2FsayhkaXIpOgogICAgICBmb3IgZm5hbWUgaW4gZmlsZW5hbWVzOgogICAgICAgIGlmIGZuYW1lLmVuZHN3aXRoKCcud2hsJyk6CiAgICAgICAgICB5aWVsZCBvcy5wYXRoLmpvaW4ocm9vdCwgZm5hbWUpCgogIHdobHMgPSBzb3J0X3doZWVscyhXaGVlbChwYXRoKSBmb3IgcGF0aCBpbiBsaXN0X3dobHMoKSkKICBwb3NzaWJsZV9leHRyYXMgPSBkZXRlcm1pbmVfcG9zc2libGVfZXh0cmFzKHdobHMpCgogIGRlZiByZXBvc2l0b3J5X25hbWUod2hlZWwpOgogICAgcmV0dXJuIGFyZ3MubmFtZSArICJfIiArIHdoZWVsLnJlcG9zaXRvcnlfc3VmZml4KCkKCiAgZGVmIHdobF9saWJyYXJ5KHdoZWVsKToKICAgICMgSW5kZW50YXRpb24gaGVyZSBtYXR0ZXJzLiAgd2hsX2xpYnJhcnkgbXVzdCBiZSB3aXRoaW4gdGhlIHNjb3BlCiAgICAjIG9mIHRoZSBmdW5jdGlvbiBiZWxvdy4gIFdlIGFsc28gYXZvaWQgcmVpbXBvcnRpbmcgYW4gZXhpc3RpbmcgV0hMLgogICAgcmV0dXJuICIiIgogIGlmICJ7cmVwb19uYW1lfSIgbm90IGluIG5hdGl2ZS5leGlzdGluZ19ydWxlcygpOgogICAgd2hsX2xpYnJhcnkoCiAgICAgICAgbmFtZSA9ICJ7cmVwb19uYW1lfSIsCiAgICAgICAgcHl0aG9uX2ludGVycHJldGVyID0gIntweXRob25faW50ZXJwcmV0ZXJ9IiwKICAgICAgICB3aGwgPSAiQHtuYW1lfS8vOntwYXRofSIsCiAgICAgICAgcmVxdWlyZW1lbnRzID0gIkB7bmFtZX0vLzpyZXF1aXJlbWVudHMuYnpsIiwKICAgICAgICBleHRyYXMgPSBbe2V4dHJhc31dCiAgICApIiIiLmZvcm1hdChuYW1lPWFyZ3MubmFtZSwgcmVwb19uYW1lPXJlcG9zaXRvcnlfbmFtZSh3aGVlbCksCiAgICAgICAgICAgICAgICBweXRob25faW50ZXJwcmV0ZXI9YXJncy5weXRob25faW50ZXJwcmV0ZXIsCiAgICAgICAgICAgICAgICBwYXRoPXdoZWVsLmJhc2VuYW1lKCksCiAgICAgICAgICAgICAgICBleHRyYXM9JywnLmpvaW4oWwogICAgICAgICAgICAgICAgICAnIiVzIicgJSBleHRyYQogICAgICAgICAgICAgICAgICBmb3IgZXh0cmEgaW4gcG9zc2libGVfZXh0cmFzLmdldCh3aGVlbCwgW10pCiAgICAgICAgICAgICAgICBdKSkKCiAgd2hsX3RhcmdldHMgPSAnLCcuam9pbihbCiAgICAnLCcuam9pbihbCiAgICAgICciJXMiOiAiQCVzLy86cGtnIicgJSAod2hsLmRpc3RyaWJ1dGlvbigpLmxvd2VyKCksIHJlcG9zaXRvcnlfbmFtZSh3aGwpKQogICAgXSArIFsKICAgICAgIyBGb3IgZXZlcnkgZXh0cmEgdGhhdCBpcyBwb3NzaWJsZSBmcm9tIHRoaXMgcmVxdWlyZW1lbnRzLnR4dAogICAgICAnIiVzWyVzXSI6ICJAJXMvLzolcyInICUgKHdobC5kaXN0cmlidXRpb24oKS5sb3dlcigpLCBleHRyYS5sb3dlcigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9zaXRvcnlfbmFtZSh3aGwpLCBleHRyYSkKICAgICAgZm9yIGV4dHJhIGluIHBvc3NpYmxlX2V4dHJhcy5nZXQod2hsLCBbXSkKICAgIF0pCiAgICBmb3Igd2hsIGluIHdobHMKICBdKQoKICB3aXRoIG9wZW4oYXJncy5vdXRwdXQsICd3JykgYXMgZjoKICAgIGYud3JpdGUoIiIiXAojIEluc3RhbGwgcGlwIHJlcXVpcmVtZW50cy4KIwojIEdlbmVyYXRlZCBmcm9tIHtpbnB1dH0KCmxvYWQoIkBydWxlc19weXRob24vL3B5dGhvbjp3aGwuYnpsIiwgIndobF9saWJyYXJ5IikKCmRlZiBwaXBfaW5zdGFsbCgpOgogIHt3aGxfbGlicmFyaWVzfQoKX3JlcXVpcmVtZW50cyA9IHt7CiAge21hcHBpbmdzfQp9fQoKYWxsX3JlcXVpcmVtZW50cyA9IF9yZXF1aXJlbWVudHMudmFsdWVzKCkKCmRlZiByZXF1aXJlbWVudChuYW1lKToKICBuYW1lX2tleSA9IG5hbWUucmVwbGFjZSgiLSIsICJfIikubG93ZXIoKQogIGlmIG5hbWVfa2V5IG5vdCBpbiBfcmVxdWlyZW1lbnRzOgogICAgZmFpbCgiQ291bGQgbm90IGZpbmQgcGlwLXByb3ZpZGVkIGRlcGVuZGVuY3k6ICclcyciICUgbmFtZSkKICByZXR1cm4gX3JlcXVpcmVtZW50c1tuYW1lX2tleV0KIiIiLmZvcm1hdChpbnB1dD1hcmdzLmlucHV0LAogICAgICAgICAgIHdobF9saWJyYXJpZXM9J1xuJy5qb2luKG1hcCh3aGxfbGlicmFyeSwgd2hscykpIGlmIHdobHMgZWxzZSAicGFzcyIsCiAgICAgICAgICAgbWFwcGluZ3M9d2hsX3RhcmdldHMpKQoKaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICBtYWluKCkKUEsDBBQAAAAAAAAAIQBPOWlV4g0AAOINAAAmAAAAYmF6ZWxfdG9vbHMvdG9vbHMvcHl0aG9uL3B5M3dyYXBwZXIuc2gjIS9iaW4vc2gKCiMgRG9uJ3Qgc2V0IC1lIGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSByb2J1c3QgdHJhcHBpbmcgYW5kIHByaW50aW5nIG9mIGVycm9ycy4Kc2V0IC11CgojIFdlIHVzZSAvYmluL3NoIHJhdGhlciB0aGFuIC9iaW4vYmFzaCBmb3IgcG9ydGFiaWxpdHkuIFNlZSBkaXNjdXNzaW9uIGhlcmU6CiMgaHR0cHM6Ly9ncm91cHMuZ29vZ2xlLmNvbS9mb3J1bS8/bm9tb2JpbGU9dHJ1ZSMhdG9waWMvYmF6ZWwtZGV2LzRRbF83ZURjTEMwCiMgV2UgZG8gbG9zZSB0aGUgYWJpbGl0eSB0byBzZXQgLW8gcGlwZWZhaWwuCgpTVFJJQ1Q9IjEiCgppZiBbICIkU1RSSUNUIiA9ICIxIiBdOyB0aGVuCiAgRkFJTFVSRV9IRUFERVI9IlwKRXJyb3Igb2NjdXJyZWQgd2hpbGUgYXR0ZW1wdGluZyB0byB1c2UgdGhlIGRlZmF1bHQgUHl0aG9uIHRvb2xjaGFpbiBcCihAYmF6ZWxfdG9vbHMvL3Rvb2xzL3B5dGhvbjphdXRvZGV0ZWN0aW5nX3Rvb2xjaGFpbikuIgplbHNlCiAgRkFJTFVSRV9IRUFERVI9IlwKRXJyb3Igb2NjdXJyZWQgd2hpbGUgYXR0ZW1wdGluZyB0byB1c2UgdGhlIG5vbi1zdHJpY3QgYXV0b2RldGVjdGluZyBQeXRob24gXAp0b29sY2hhaW4gKEBiYXplbF90b29scy8vdG9vbHMvcHl0aG9uOmF1dG9kZXRlY3RpbmdfdG9vbGNoYWluX25vbnN0cmljdCkuIgpmaQoKZGllKCkgewogIGVjaG8gIiRGQUlMVVJFX0hFQURFUiIgMT4mMgogIGVjaG8gIiQxIiAxPiYyCiAgZXhpdCAxCn0KCiMgV2UgdXNlIGB3aGljaGAgdG8gbG9jYXRlIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIgY29tbWFuZCBvbiBQQVRILiBgY29tbWFuZCAtdmAKIyBpcyBhbm90aGVyIG9wdGlvbiwgYnV0IGl0IGRvZXNuJ3QgY2hlY2sgd2hldGhlciB0aGUgZmlsZSBpdCBmaW5kcyBoYXMgdGhlCiMgZXhlY3V0YWJsZSBiaXQuCiMKIyBBIHRyaWNreSBzaXR1YXRpb24gaGFwcGVucyB3aGVuIHRoaXMgd3JhcHBlciBpcyBpbnZva2VkIGFzIHBhcnQgb2YgcnVubmluZyBhCiMgdG9vbCwgZS5nLiBwYXNzaW5nIGEgcHlfYmluYXJ5IHRhcmdldCB0byBgY3R4LmFjdGlvbnMucnVuKClgLiBCYXplbCB3aWxsIHVuc2V0CiMgdGhlIFBBVEggdmFyaWFibGUuIFRoZW4gdGhlIHNoZWxsIHdpbGwgc2VlIHRoZXJlJ3Mgbm8gUEFUSCBhbmQgaW5pdGlhbGl6ZSBpdHMKIyBvd24sIHNvbWV0aW1lcyB3aXRob3V0IGV4cG9ydGluZyBpdC4gVGhpcyBjYXVzZXMgYHdoaWNoYCB0byBmYWlsIGFuZCB0aGlzCiMgc2NyaXB0IHRvIHRoaW5rIHRoZXJlJ3Mgbm8gUHl0aG9uIGludGVycHJldGVyIGluc3RhbGxlZC4gVG8gYXZvaWQgdGhpcyB3ZQojIGV4cGxpY2l0bHkgcGFzcyBQQVRIIHRvIGVhY2ggYHdoaWNoYCBpbnZvY2F0aW9uLiBXZSBjYW4ndCBqdXN0IGV4cG9ydCBQQVRICiMgYmVjYXVzZSB0aGF0IHdvdWxkIG1vZGlmeSB0aGUgZW52aXJvbm1lbnQgc2VlbiBieSB0aGUgZmluYWwgdXNlciBQeXRob24KIyBwcm9ncmFtLgojCiMgU2VlIGFsc286CiMKIyAgICAgaHR0cHM6Ly9naXRodWIuY29tL2JhemVsYnVpbGQvY29udGludW91cy1pbnRlZ3JhdGlvbi9pc3N1ZXMvNTc4CiMgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9iYXplbGJ1aWxkL2JhemVsL2lzc3Vlcy84NDE0CiMgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9iYXplbGJ1aWxkL2JhemVsL2lzc3Vlcy84NDE1CgojIFRyeSB0aGUgInB5dGhvbjMiIGNvbW1hbmQgbmFtZSBmaXJzdCwgdGhlbiBmYWxsIGJhY2sgb24gInB5dGhvbiIuClBZVEhPTl9CSU49IiQoUEFUSD0iJFBBVEgiIHdoaWNoIHB5dGhvbjMgMj4gL2Rldi9udWxsKSIKVVNFRF9GQUxMQkFDSz0iMCIKaWYgWyAteiAiJHtQWVRIT05fQklOOi19IiBdOyB0aGVuCiAgUFlUSE9OX0JJTj0iJChQQVRIPSIkUEFUSCIgd2hpY2ggcHl0aG9uIDI+L2Rldi9udWxsKSIKICBVU0VEX0ZBTExCQUNLPSIxIgpmaQppZiBbIC16ICIke1BZVEhPTl9CSU46LX0iIF07IHRoZW4KICBkaWUgIk5laXRoZXIgJ3B5dGhvbjMnIG5vciAncHl0aG9uJyB3ZXJlIGZvdW5kIG9uIHRoZSB0YXJnZXQgXApwbGF0Zm9ybSdzIFBBVEgsIHdoaWNoIGlzOgoKJFBBVEgKClBsZWFzZSBlbnN1cmUgYW4gaW50ZXJwcmV0ZXIgaXMgYXZhaWxhYmxlIG9uIHRoaXMgcGxhdGZvcm0gKGFuZCBtYXJrZWQgXApleGVjdXRhYmxlKSwgb3IgZWxzZSByZWdpc3RlciBhbiBhcHByb3ByaWF0ZSBQeXRob24gdG9vbGNoYWluIGFzIHBlciB0aGUgXApkb2N1bWVudGF0aW9uIGZvciBweV9ydW50aW1lX3BhaXIgXAooaHR0cHM6Ly9naXRodWIuY29tL2JhemVsYnVpbGQvYmF6ZWwvYmxvYi9tYXN0ZXIvdG9vbHMvcHl0aG9uL3Rvb2xjaGFpbi5iemwpLiIKZmkKCmlmIFsgIiRTVFJJQ1QiID0gIjEiIF07IHRoZW4KICAjIFZlcmlmeSB0aGF0IHdlIGdyYWJiZWQgYW4gaW50ZXJwcmV0ZXIgd2l0aCB0aGUgcmlnaHQgdmVyc2lvbi4KICBWRVJTSU9OX1NUUj0iJCgiJFBZVEhPTl9CSU4iIC1WIDI+JjEpIiBcCiAgICAgIHx8IGRpZSAiQ291bGQgbm90IGdldCBpbnRlcnByZXRlciB2ZXJzaW9uIHZpYSAnJFBZVEhPTl9CSU4gLVYnIgogIGlmICEgZWNobyAiJFZFUlNJT05fU1RSIiB8IGdyZXAgLXEgIiAzXC4iIDsgdGhlbgogICAgICBkaWUgIkFjY29yZGluZyB0byAnJFBZVEhPTl9CSU4gLVYnLCB2ZXJzaW9uIGlzICckVkVSU0lPTl9TVFInLCBidXQgd2UgXApuZWVkIHZlcnNpb24gMy4gUEFUSCBpczoKCiRQQVRICgpQbGVhc2UgZW5zdXJlIGFuIGludGVycHJldGVyIHdpdGggdmVyc2lvbiAzIGlzIGF2YWlsYWJsZSBvbiB0aGlzIFwKcGxhdGZvcm0gYXMgJ3B5dGhvbjMnIG9yICdweXRob24nLCBvciBlbHNlIHJlZ2lzdGVyIGFuIGFwcHJvcHJpYXRlIFwKUHl0aG9uIHRvb2xjaGFpbiBhcyBwZXIgdGhlIGRvY3VtZW50YXRpb24gZm9yIHB5X3J1bnRpbWVfcGFpciBcCihodHRwczovL2dpdGh1Yi5jb20vYmF6ZWxidWlsZC9iYXplbC9ibG9iL21hc3Rlci90b29scy9weXRob24vdG9vbGNoYWluLmJ6bCkuCgpOb3RlIHRoYXQgcHJpb3IgdG8gQmF6ZWwgMC4yNywgdGhlcmUgd2FzIG5vIGNoZWNrIHRvIGVuc3VyZSB0aGF0IHRoZSBcCmludGVycHJldGVyJ3MgdmVyc2lvbiBtYXRjaGVkIHRoZSB2ZXJzaW9uIGRlY2xhcmVkIGJ5IHRoZSB0YXJnZXQgKCM0ODE1KS4gSWYgXAp5b3VyIGJ1aWxkIHdvcmtlZCBwcmlvciB0byBCYXplbCAwLjI3LCBhbmQgeW91J3JlIHN1cmUgeW91ciB0YXJnZXRzIGRvIG5vdCBcCnJlcXVpcmUgUHl0aG9uIDMsIHlvdSBjYW4gb3B0IG91dCBvZiB0aGlzIHZlcnNpb24gY2hlY2sgYnkgdXNpbmcgdGhlIFwKbm9uLXN0cmljdCBhdXRvZGV0ZWN0aW5nIHRvb2xjaGFpbiBpbnN0ZWFkIG9mIHRoZSBzdGFuZGFyZCBhdXRvZGV0ZWN0aW5nIFwKdG9vbGNoYWluLiBUaGlzIGNhbiBiZSBkb25lIGJ5IHBhc3NpbmcgdGhlIGZsYWcgXApcYC0tZXh0cmFfdG9vbGNoYWlucz1AYmF6ZWxfdG9vbHMvL3Rvb2xzL3B5dGhvbjphdXRvZGV0ZWN0aW5nX3Rvb2xjaGFpbl9ub25zdHJpY3RcYCBcCm9uIHRoZSBjb21tYW5kIGxpbmUgb3IgYWRkaW5nIGl0IHRvIHlvdXIgYmF6ZWxyYy4iCiAgZmkKZmkKCmV4ZWMgIiRQWVRIT05fQklOIiAiJEAiClBLAwQUAAAAAAAAACEAAAAAAAAAAAAAAAAAKAAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvX19pbml0X18ucHlQSwMEFAAAAAAAAAAhAKtxNFcHBQAABwUAAEAAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC05LjAuMy5kaXN0LWluZm8vREVTQ1JJUFRJT04ucnN0cGlwCj09PQoKVGhlIGBQeVBBIHJlY29tbWVuZGVkCjxodHRwczovL3BhY2thZ2luZy5weXRob24ub3JnL2VuL2xhdGVzdC9jdXJyZW50Lz5gXwp0b29sIGZvciBpbnN0YWxsaW5nIFB5dGhvbiBwYWNrYWdlcy4KCiogYEluc3RhbGxhdGlvbiA8aHR0cHM6Ly9waXAucHlwYS5pby9lbi9zdGFibGUvaW5zdGFsbGluZy5odG1sPmBfCiogYERvY3VtZW50YXRpb24gPGh0dHBzOi8vcGlwLnB5cGEuaW8vPmBfCiogYENoYW5nZWxvZyA8aHR0cHM6Ly9waXAucHlwYS5pby9lbi9zdGFibGUvbmV3cy5odG1sPmBfCiogYEdpdGh1YiBQYWdlIDxodHRwczovL2dpdGh1Yi5jb20vcHlwYS9waXA+YF8KKiBgSXNzdWUgVHJhY2tpbmcgPGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3BpcC9pc3N1ZXM+YF8KKiBgVXNlciBtYWlsaW5nIGxpc3QgPGh0dHA6Ly9ncm91cHMuZ29vZ2xlLmNvbS9ncm91cC9weXRob24tdmlydHVhbGVudj5gXwoqIGBEZXYgbWFpbGluZyBsaXN0IDxodHRwOi8vZ3JvdXBzLmdvb2dsZS5jb20vZ3JvdXAvcHlwYS1kZXY+YF8KKiBVc2VyIElSQzogI3B5cGEgb24gRnJlZW5vZGUuCiogRGV2IElSQzogI3B5cGEtZGV2IG9uIEZyZWVub2RlLgoKCi4uIGltYWdlOjogaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9weXBpL3YvcGlwLnN2ZwogICA6dGFyZ2V0OiBodHRwczovL3B5cGkucHl0aG9uLm9yZy9weXBpL3BpcAoKLi4gaW1hZ2U6OiBodHRwczovL2ltZy5zaGllbGRzLmlvL3RyYXZpcy9weXBhL3BpcC9tYXN0ZXIuc3ZnCiAgIDp0YXJnZXQ6IGh0dHA6Ly90cmF2aXMtY2kub3JnL3B5cGEvcGlwCgouLiBpbWFnZTo6IGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vYXBwdmV5b3IvY2kvcHlwYS9waXAuc3ZnCiAgIDp0YXJnZXQ6IGh0dHBzOi8vY2kuYXBwdmV5b3IuY29tL3Byb2plY3QvcHlwYS9waXAvaGlzdG9yeQoKLi4gaW1hZ2U6OiBodHRwczovL3JlYWR0aGVkb2NzLm9yZy9wcm9qZWN0cy9waXAvYmFkZ2UvP3ZlcnNpb249c3RhYmxlCiAgIDp0YXJnZXQ6IGh0dHBzOi8vcGlwLnB5cGEuaW8vZW4vc3RhYmxlCgpDb2RlIG9mIENvbmR1Y3QKLS0tLS0tLS0tLS0tLS0tCgpFdmVyeW9uZSBpbnRlcmFjdGluZyBpbiB0aGUgcGlwIHByb2plY3QncyBjb2RlYmFzZXMsIGlzc3VlIHRyYWNrZXJzLCBjaGF0CnJvb21zLCBhbmQgbWFpbGluZyBsaXN0cyBpcyBleHBlY3RlZCB0byBmb2xsb3cgdGhlIGBQeVBBIENvZGUgb2YgQ29uZHVjdGBfLgoKLi4gX1B5UEEgQ29kZSBvZiBDb25kdWN0OiBodHRwczovL3d3dy5weXBhLmlvL2VuL2xhdGVzdC9jb2RlLW9mLWNvbmR1Y3QvCgoKUEsDBBQAAAAAAAAAIQA8UH8l+QkAAPkJAAA5AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAtOS4wLjMuZGlzdC1pbmZvL01FVEFEQVRBTWV0YWRhdGEtVmVyc2lvbjogMi4wCk5hbWU6IHBpcApWZXJzaW9uOiA5LjAuMwpTdW1tYXJ5OiBUaGUgUHlQQSByZWNvbW1lbmRlZCB0b29sIGZvciBpbnN0YWxsaW5nIFB5dGhvbiBwYWNrYWdlcy4KSG9tZS1wYWdlOiBodHRwczovL3BpcC5weXBhLmlvLwpBdXRob3I6IFRoZSBwaXAgZGV2ZWxvcGVycwpBdXRob3ItZW1haWw6IHB5dGhvbi12aXJ0dWFsZW52QGdyb3Vwcy5nb29nbGUuY29tCkxpY2Vuc2U6IE1JVApLZXl3b3JkczogZWFzeV9pbnN0YWxsIGRpc3R1dGlscyBzZXR1cHRvb2xzIGVnZyB2aXJ0dWFsZW52ClBsYXRmb3JtOiBVTktOT1dOCkNsYXNzaWZpZXI6IERldmVsb3BtZW50IFN0YXR1cyA6OiA1IC0gUHJvZHVjdGlvbi9TdGFibGUKQ2xhc3NpZmllcjogSW50ZW5kZWQgQXVkaWVuY2UgOjogRGV2ZWxvcGVycwpDbGFzc2lmaWVyOiBMaWNlbnNlIDo6IE9TSSBBcHByb3ZlZCA6OiBNSVQgTGljZW5zZQpDbGFzc2lmaWVyOiBUb3BpYyA6OiBTb2Z0d2FyZSBEZXZlbG9wbWVudCA6OiBCdWlsZCBUb29scwpDbGFzc2lmaWVyOiBQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMgpDbGFzc2lmaWVyOiBQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMi42CkNsYXNzaWZpZXI6IFByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAyLjcKQ2xhc3NpZmllcjogUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMKQ2xhc3NpZmllcjogUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMuMwpDbGFzc2lmaWVyOiBQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMy40CkNsYXNzaWZpZXI6IFByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzLjUKQ2xhc3NpZmllcjogUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IEltcGxlbWVudGF0aW9uIDo6IFB5UHkKUmVxdWlyZXMtUHl0aG9uOiA+PTIuNiwhPTMuMC4qLCE9My4xLiosIT0zLjIuKgpQcm92aWRlcy1FeHRyYTogdGVzdGluZwpQcm92aWRlcy1FeHRyYTogdGVzdGluZwpSZXF1aXJlcy1EaXN0OiBweXRlc3Q7IGV4dHJhID09ICd0ZXN0aW5nJwpSZXF1aXJlcy1EaXN0OiB2aXJ0dWFsZW52ICg+PTEuMTApOyBleHRyYSA9PSAndGVzdGluZycKUmVxdWlyZXMtRGlzdDogc2NyaXB0dGVzdCAoPj0xLjMpOyBleHRyYSA9PSAndGVzdGluZycKUmVxdWlyZXMtRGlzdDogbW9jazsgZXh0cmEgPT0gJ3Rlc3RpbmcnClJlcXVpcmVzLURpc3Q6IHByZXRlbmQ7IGV4dHJhID09ICd0ZXN0aW5nJwoKcGlwCj09PQoKVGhlIGBQeVBBIHJlY29tbWVuZGVkCjxodHRwczovL3BhY2thZ2luZy5weXRob24ub3JnL2VuL2xhdGVzdC9jdXJyZW50Lz5gXwp0b29sIGZvciBpbnN0YWxsaW5nIFB5dGhvbiBwYWNrYWdlcy4KCiogYEluc3RhbGxhdGlvbiA8aHR0cHM6Ly9waXAucHlwYS5pby9lbi9zdGFibGUvaW5zdGFsbGluZy5odG1sPmBfCiogYERvY3VtZW50YXRpb24gPGh0dHBzOi8vcGlwLnB5cGEuaW8vPmBfCiogYENoYW5nZWxvZyA8aHR0cHM6Ly9waXAucHlwYS5pby9lbi9zdGFibGUvbmV3cy5odG1sPmBfCiogYEdpdGh1YiBQYWdlIDxodHRwczovL2dpdGh1Yi5jb20vcHlwYS9waXA+YF8KKiBgSXNzdWUgVHJhY2tpbmcgPGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3BpcC9pc3N1ZXM+YF8KKiBgVXNlciBtYWlsaW5nIGxpc3QgPGh0dHA6Ly9ncm91cHMuZ29vZ2xlLmNvbS9ncm91cC9weXRob24tdmlydHVhbGVudj5gXwoqIGBEZXYgbWFpbGluZyBsaXN0IDxodHRwOi8vZ3JvdXBzLmdvb2dsZS5jb20vZ3JvdXAvcHlwYS1kZXY+YF8KKiBVc2VyIElSQzogI3B5cGEgb24gRnJlZW5vZGUuCiogRGV2IElSQzogI3B5cGEtZGV2IG9uIEZyZWVub2RlLgoKCi4uIGltYWdlOjogaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9weXBpL3YvcGlwLnN2ZwogICA6dGFyZ2V0OiBodHRwczovL3B5cGkucHl0aG9uLm9yZy9weXBpL3BpcAoKLi4gaW1hZ2U6OiBodHRwczovL2ltZy5zaGllbGRzLmlvL3RyYXZpcy9weXBhL3BpcC9tYXN0ZXIuc3ZnCiAgIDp0YXJnZXQ6IGh0dHA6Ly90cmF2aXMtY2kub3JnL3B5cGEvcGlwCgouLiBpbWFnZTo6IGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vYXBwdmV5b3IvY2kvcHlwYS9waXAuc3ZnCiAgIDp0YXJnZXQ6IGh0dHBzOi8vY2kuYXBwdmV5b3IuY29tL3Byb2plY3QvcHlwYS9waXAvaGlzdG9yeQoKLi4gaW1hZ2U6OiBodHRwczovL3JlYWR0aGVkb2NzLm9yZy9wcm9qZWN0cy9waXAvYmFkZ2UvP3ZlcnNpb249c3RhYmxlCiAgIDp0YXJnZXQ6IGh0dHBzOi8vcGlwLnB5cGEuaW8vZW4vc3RhYmxlCgpDb2RlIG9mIENvbmR1Y3QKLS0tLS0tLS0tLS0tLS0tCgpFdmVyeW9uZSBpbnRlcmFjdGluZyBpbiB0aGUgcGlwIHByb2plY3QncyBjb2RlYmFzZXMsIGlzc3VlIHRyYWNrZXJzLCBjaGF0CnJvb21zLCBhbmQgbWFpbGluZyBsaXN0cyBpcyBleHBlY3RlZCB0byBmb2xsb3cgdGhlIGBQeVBBIENvZGUgb2YgQ29uZHVjdGBfLgoKLi4gX1B5UEEgQ29kZSBvZiBDb25kdWN0OiBodHRwczovL3d3dy5weXBhLmlvL2VuL2xhdGVzdC9jb2RlLW9mLWNvbmR1Y3QvCgoKUEsDBBQAAAAAAAAAIQBX/iPlmGIAAJhiAAA3AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAtOS4wLjMuZGlzdC1pbmZvL1JFQ09SRHBpcC9fX2luaXRfXy5weSxzaGEyNTY9YXh2SWpXX01naG1HYjlWUUViUmZreXMxYTVqS0dzeXlaMGRmME0tYmVQVSwxMTk1Ng0KcGlwL19fbWFpbl9fLnB5LHNoYTI1Nj1WNktoLUlFREVGcHQxY2FoUkU2TWFqVUZfMTRxSlJfUXN2bjRNaldaWHpFLDU4NA0KcGlwL2Jhc2Vjb21tYW5kLnB5LHNoYTI1Nj1UVGxtWmVzUTRWdXhjdG8yS3F3WkdtZ21ONWlvSEVsX0RlRmV2OWllX1NBLDExOTEwDQpwaXAvYmFzZXBhcnNlci5weSxzaGEyNTY9QUtNT2VGM2ZUclJyb2l2MERtVFFiZGlMVzBEUXV4MktxR0NfZEpKQjlkMCwxMDQ2NQ0KcGlwL2NtZG9wdGlvbnMucHksc2hhMjU2PThKQ2NGMmtLQUYyY0ZuVjc3b1ctM0RzSEppZnI5akYyV3VDaHp6d2djd2csMTY0NzQNCnBpcC9kb3dubG9hZC5weSxzaGEyNTY9X1ZKYU5Hc2Rhd09OZDlzaGFzbDdNeE56VG84ZzBFQUNuMmdhNkdSak01bywzMjE1Mw0KcGlwL2V4Y2VwdGlvbnMucHksc2hhMjU2PUJ2cUgtSnczdFAyYi0ySUoya2pyUWVtT0FQTXFLclFNTFJJWkhaUXBKWGssODEyMQ0KcGlwL2luZGV4LnB5LHNoYTI1Nj1MNlVodEFFWmMycXc3QnFmUXJrUFFjdzJnQ2dFdzNHdWtMUlNBOTVCTnlJLDM5OTUwDQpwaXAvbG9jYXRpb25zLnB5LHNoYTI1Nj05ckpSbGdvbkM2UUMyekdESW5fN21YYW9aOV90Rl9JSE0yQlFoV1ZSZ2JvLDU2MjYNCnBpcC9wZXA0MjV0YWdzLnB5LHNoYTI1Nj1xM2tlYzRmNk5Ic3p1R1lJaEdJYlZ2czg5NkQwNnVKQW5LRmdKX3djZTQ0LDEwOTgwDQpwaXAvc3RhdHVzX2NvZGVzLnB5LHNoYTI1Nj1GNnVERzZHajdSTktRSlVEbmQ4N1FLcUkxNlVzLXQtQjB3UEZfNFFNcFdjLDE1Ng0KcGlwL3doZWVsLnB5LHNoYTI1Nj1RU1dtR3MydWktbjRVTVdtMEpVWTZhTUNjd05LdW5nVnpiV3N4STlLbEpRLDMyMDEwDQpwaXAvX3ZlbmRvci9fX2luaXRfXy5weSxzaGEyNTY9V2FhU0ozcm9TU0pfVXY0eUtBeGxHb2hLRUg5WVVBM2FJaDFYZzJJamZnVSw0NjcwDQpwaXAvX3ZlbmRvci9hcHBkaXJzLnB5LHNoYTI1Nj0tOVVPSVp5NjJhaENRVlk5LWI3Tm42XzVfNFk2b29IbnY3MnRNOGlIaTlZLDIyMzY4DQpwaXAvX3ZlbmRvci9kaXN0cm8ucHksc2hhMjU2PUE0RG91dzlwY3FkWXhEVHA1Yi1PUjAyZnhWWG5mV3Mtd0Mxd0E4OXJoUmssMzgzNDkNCnBpcC9fdmVuZG9yL2lwYWRkcmVzcy5weSxzaGEyNTY9d2ltYnFjRTdyd3dFVGx1Y244QV80UWRfLU5LWFBPQmNOeEpIYXJVb1huZyw4MDE3Ng0KcGlwL192ZW5kb3Ivb3JkZXJlZGRpY3QucHksc2hhMjU2PTRLc0Z1YzZWOElnSFJPQ0hVdS00dkNycjIxWlBQZWE3WjBjdlg5QWpRN3csNDA5NA0KcGlwL192ZW5kb3IvcHlwYXJzaW5nLnB5LHNoYTI1Nj03dkF1VVZiaDZ0eFVLUVIySXpKOF85REttRDV2dG01TURzc1drSTBrYThvLDIyNDE3MQ0KcGlwL192ZW5kb3IvcmUtdmVuZG9yLnB5LHNoYTI1Nj1QY2RaNDBkMG9oTXNkSm1BNHQwQWVBV2JQWGkxdEZzdkF3QTVLRTVGR2VZLDc3Mw0KcGlwL192ZW5kb3IvcmV0cnlpbmcucHksc2hhMjU2PWszZmZsZjVfTW0wWGNJSlloQjdUajM0YnFDQ1BoVURrWWJ4MU52VzJGUEUsOTk3Mg0KcGlwL192ZW5kb3Ivc2l4LnB5LHNoYTI1Nj1BNmhkSlpWakkzdF9nZWViWjlCelV2d1JySVhvMGxmd3pRbE0yTGNLeWFzLDMwMDk4DQpwaXAvX3ZlbmRvci9jYWNoZWNvbnRyb2wvX19pbml0X18ucHksc2hhMjU2PVVQeUZsejBkSWp4dXN1NUlUaWc5VURGSmRTWTVMVHdpamhsZG4wQWZ5elUsMzAyDQpwaXAvX3ZlbmRvci9jYWNoZWNvbnRyb2wvX2NtZC5weSxzaGEyNTY9TVB4WmZaZDJMS0R6VnJzNTVYM3dBMXJzSTJZdVA4ZXZMWlN3UWowZElrMCwxMzIwDQpwaXAvX3ZlbmRvci9jYWNoZWNvbnRyb2wvYWRhcHRlci5weSxzaGEyNTY9UmFHWXlSQS1SQTFKMEFuRTY3R3pFWUZQQnU0WUg0RVFVdlFxVEthNTdpTSw0NjA4DQpwaXAvX3ZlbmRvci9jYWNoZWNvbnRyb2wvY2FjaGUucHksc2hhMjU2PXh0bC1WLXByOUtTdDlWdkZEUkNCOXlySFBFdnF2YmstNU0xdkFJblpiNWssNzkwDQpwaXAvX3ZlbmRvci9jYWNoZWNvbnRyb2wvY29tcGF0LnB5LHNoYTI1Nj0yTVRPeUkxSmxHX2dKcGZ1eTMtVVFRbEtNUmlKaW1SLVhYQjBzcjQ0d2owLDM4MA0KcGlwL192ZW5kb3IvY2FjaGVjb250cm9sL2NvbnRyb2xsZXIucHksc2hhMjU2PWVsRHNMY2FZQTE1bmNvZFJtSG5XUXA2ZWtVX29jRUd0RGVHTGJzblRqem8sMTMwMjQNCnBpcC9fdmVuZG9yL2NhY2hlY29udHJvbC9maWxld3JhcHBlci5weSxzaGEyNTY9X0s4Y1N0bVhxRDMzbTE1UGZzUThybHBvNkZmWGpWYkttanZMWHlJQ1JnSSwyNTMxDQpwaXAvX3ZlbmRvci9jYWNoZWNvbnRyb2wvaGV1cmlzdGljcy5weSxzaGEyNTY9V3RKclZzeVdqcFA5V29VaURWZFRaWlJOQkN6NVpWcHRhUXBZbnFvZkRRVSw0MTQxDQpwaXAvX3ZlbmRvci9jYWNoZWNvbnRyb2wvc2VyaWFsaXplLnB5LHNoYTI1Nj1YTTZlbEc5RFNOZXh3YU9DZ01qVXRmckhIVzVOQUI2VFNiSWYzeDIzNXhzLDY1MzYNCnBpcC9fdmVuZG9yL2NhY2hlY29udHJvbC93cmFwcGVyLnB5LHNoYTI1Nj1LcXl1XzNUV181NFhEdWRoYTQtSEYyMXZ5RU9BSjRablJYRnlzVGlMbVhBLDQ5OA0KcGlwL192ZW5kb3IvY2FjaGVjb250cm9sL2NhY2hlcy9fX2luaXRfXy5weSxzaGEyNTY9dVduVXR5TXZIWV9MVUxhTF80X0lSMUZfeFBnSzV6SGZKeVJuQnE0RG5QRSwzNjkNCnBpcC9fdmVuZG9yL2NhY2hlY29udHJvbC9jYWNoZXMvZmlsZV9jYWNoZS5weSxzaGEyNTY9RnNEdWczYndVQVEzb2tqamZHenhsRGFCZjJmd1ZTbjFpQktNVEw2U3lHVSwzNTMyDQpwaXAvX3ZlbmRvci9jYWNoZWNvbnRyb2wvY2FjaGVzL3JlZGlzX2NhY2hlLnB5LHNoYTI1Nj1YeXdxeGtTOU1rQ2FmbFRPWV93anJFMDJuZUtkeXdCOVl3bE9CYlA3WXdjLDk3Mw0KcGlwL192ZW5kb3IvY2VydGlmaS9fX2luaXRfXy5weSxzaGEyNTY9UVNSeTFVenRFLWkwOUl1R0lLS3VjMTkwazA3bHQ2a3RhYmJlbFBNSVpvYyw2Mw0KcGlwL192ZW5kb3IvY2VydGlmaS9fX21haW5fXy5weSxzaGEyNTY9RmlPWXQxRmx0c3Q3d2s5RFJhNkdDb0JyOHFCVXhsTlF1X01LSmYwNEU2cyw0MQ0KcGlwL192ZW5kb3IvY2VydGlmaS9jYWNlcnQucGVtLHNoYTI1Nj03Q0VYZkxIeER3dkRwd1Z1MHlfMmxmSllrNjNjVS1LVUtJX0RMMUxxOFVvLDI3MTA4OA0KcGlwL192ZW5kb3IvY2VydGlmaS9jb3JlLnB5LHNoYTI1Nj14UFFEZEdfc2l5NUE3QmZxR1dhN1JKaGNBNjF4WEVxUGlTcnc5R055aEhFLDgzNg0KcGlwL192ZW5kb3IvY2hhcmRldC9fX2luaXRfXy5weSxzaGEyNTY9WXNQNXdRbHNISjJhdUYxUlpKZnlwaVNyQ0E3X2JRaVJtM0VTX05JNzYtWSwxNTU5DQpwaXAvX3ZlbmRvci9jaGFyZGV0L2JpZzVmcmVxLnB5LHNoYTI1Nj1EX3pLNUd5em9Wc1JlczBIa0xKemlsdEZRWDBiS0NMT3JGZTlfeER2T184LDMxMjU0DQpwaXAvX3ZlbmRvci9jaGFyZGV0L2JpZzVwcm9iZXIucHksc2hhMjU2PWtCeEhiZGV0QnBQZTd4cmxiLWU5OTBpb3Q2NGdfZUdTTGQzMmxCN19oM00sMTc1Nw0KcGlwL192ZW5kb3IvY2hhcmRldC9jaGFyZGlzdHJpYnV0aW9uLnB5LHNoYTI1Nj0zd29XUzYyS3JHb29LeXF6NHpRU25qRmJKcGE2VjdnMDJkYUFpYlR3Y2w4LDk0MTENCnBpcC9fdmVuZG9yL2NoYXJkZXQvY2hhcnNldGdyb3VwcHJvYmVyLnB5LHNoYTI1Nj02YkR1OFlJaVJ1U2NYNGNhOUlnYjBVNjlUQTJQR1hYRGVqNkNjNF85a080LDM3ODcNCnBpcC9fdmVuZG9yL2NoYXJkZXQvY2hhcnNldHByb2Jlci5weSxzaGEyNTY9S1Ntd0pFcmp5cHlqMGJSWm1DNUY1ZU03YzhZUWdMWUlqWlhpbnRaTnN0Zyw1MTEwDQpwaXAvX3ZlbmRvci9jaGFyZGV0L2NvZGluZ3N0YXRlbWFjaGluZS5weSxzaGEyNTY9VllwXzZjeXlraTVzSGdYRFNablhXNHExb2VsSGMzY3U5QXlRVFg3dXVnOCwzNTkwDQpwaXAvX3ZlbmRvci9jaGFyZGV0L2NvbXBhdC5weSxzaGEyNTY9UEtUekhrU2J0YkhEcVM5UHl1ak1iWDc0cTFhOG1NcGVRVERWc1FoWk1SdywxMTM0DQpwaXAvX3ZlbmRvci9jaGFyZGV0L2NwOTQ5cHJvYmVyLnB5LHNoYTI1Nj1UWjQzNFFYOHp6QnNuVXZMXzh3bTRBUVZUWjJaa3FFRVFMX2xOdzlmOW93LDE4NTUNCnBpcC9fdmVuZG9yL2NoYXJkZXQvZW51bXMucHksc2hhMjU2PUFpbXdkYjlhczFkSktaYUZOVUgyT2hXSVZCVmQ2WmtKSl9XSzVzTlk4Y1UsMTY2MQ0KcGlwL192ZW5kb3IvY2hhcmRldC9lc2Nwcm9iZXIucHksc2hhMjU2PWtreXFWZzFZdzNESU9BTUoyYmRseVFnVUZRaHVIQVc4ZFVHc2tUb05XU2MsMzk1MA0KcGlwL192ZW5kb3IvY2hhcmRldC9lc2NzbS5weSxzaGEyNTY9UnVYbGdOdlRJRGFybmR2bGxOQ2s1V1pCSXBkQ3hRMGtjZDlFQXV4VWg4NCwxMDUxMA0KcGlwL192ZW5kb3IvY2hhcmRldC9ldWNqcHByb2Jlci5weSxzaGEyNTY9aUQ4SmRwMElTUmpnamlWTjdmMGU4eEdlUUo1R00yb2VaMWRBOG5iU2VVdywzNzQ5DQpwaXAvX3ZlbmRvci9jaGFyZGV0L2V1Y2tyZnJlcS5weSxzaGEyNTY9LTdHZG12Z1dlejQtZU80U3VYcGE3dEJpRGk1dlJYUThXdmRGQXpWYVNmbywxMzU0Ng0KcGlwL192ZW5kb3IvY2hhcmRldC9ldWNrcnByb2Jlci5weSxzaGEyNTY9TXFGTVRRWHhXNEhieklwWjlsS0RIQjNHTjhTUDR5aUhlblRtZjhnX1B4WSwxNzQ4DQpwaXAvX3ZlbmRvci9jaGFyZGV0L2V1Y3R3ZnJlcS5weSxzaGEyNTY9Tm8xV3lkdUZPZ0I1VklUVUE3UEx5QzVvSlJOelJ5TWJCeGFLSTFsMTZNQSwzMTYyMQ0KcGlwL192ZW5kb3IvY2hhcmRldC9ldWN0d3Byb2Jlci5weSxzaGEyNTY9MTNwNkVQNHlSYXhxblA0aUh0eEhPSjZSMnp4SHExX204aFRSanpWWjk1YywxNzQ3DQpwaXAvX3ZlbmRvci9jaGFyZGV0L2diMjMxMmZyZXEucHksc2hhMjU2PUpYOGxzd2VLTG1uQ3dtazhVSEVRc0xna3JfclBfa0Vidml2QzRxUE9ybGMsMjA3MTUNCnBpcC9fdmVuZG9yL2NoYXJkZXQvZ2IyMzEycHJvYmVyLnB5LHNoYTI1Nj1nR3ZJV2k5V2hEakUteFFYSHZOSXlybkx2RWJNQVlneVVTWjY1SFVmeWx3LDE3NTQNCnBpcC9fdmVuZG9yL2NoYXJkZXQvaGVicmV3cHJvYmVyLnB5LHNoYTI1Nj1jM1NaLUs3aHZ5ekdZNkpSQVp4Smd3Sl9zVVM5azBXWWt2TVkwMFlCWUZvLDEzODM4DQpwaXAvX3ZlbmRvci9jaGFyZGV0L2ppc2ZyZXEucHksc2hhMjU2PXZwbUp2MkJ1MEo4Z25NVlJQSE1GZWZUUnZvX2hhMW1yeUxpZzhDQndnT2csMjU3NzcNCnBpcC9fdmVuZG9yL2NoYXJkZXQvanBjbnR4LnB5LHNoYTI1Nj1QWWxOcVJVUVQ4TE0zY1Q1Rm1IR1AwaWlzY0ZsVFdFRDkyTUFMdkJ1bmdvLDE5NjQzDQpwaXAvX3ZlbmRvci9jaGFyZGV0L2xhbmdidWxnYXJpYW5tb2RlbC5weSxzaGEyNTY9MUhxUVM5UGJ0bmoxeFFneGl0Sk12dzhYNmtLcjVPb2NrTkNaV2ZFUXJQRSwxMjgzOQ0KcGlwL192ZW5kb3IvY2hhcmRldC9sYW5nY3lyaWxsaWNtb2RlbC5weSxzaGEyNTY9TE9EYWp2c2V0SDg3eVlERFFLQTJDVUxYVUg4N3RJMjIzZGhmamg5Wng5YywxNzk0OA0KcGlwL192ZW5kb3IvY2hhcmRldC9sYW5nZ3JlZWttb2RlbC5weSxzaGEyNTY9OFlBVzdiVThZd1NKYXAwa0lKU2JQTXcxQkVxekdqV3pxY3FmMFdnVUtBQSwxMjY4OA0KcGlwL192ZW5kb3IvY2hhcmRldC9sYW5naGVicmV3bW9kZWwucHksc2hhMjU2PUpTbnFtRTVFNjJ0RExUUFR2THBRc2c1Z09NTzRQYmRXUnZWN0F2a2MwSEEsMTEzNDUNCnBpcC9fdmVuZG9yL2NoYXJkZXQvbGFuZ2h1bmdhcmlhbm1vZGVsLnB5LHNoYTI1Nj1SaGFwWVNHNWwwWmFPLVZWNEZhbjVzVzBXUkdRcWh3Qk02MXl4M3l4eU9BLDEyNTkyDQpwaXAvX3ZlbmRvci9jaGFyZGV0L2xhbmd0aGFpbW9kZWwucHksc2hhMjU2PThsMDE3M0d1X1c2RzhteG1RT1RFRjRsczJZZEU3RnhXZjNRa1N4RUdYSlEsMTEyOTANCnBpcC9fdmVuZG9yL2NoYXJkZXQvbGFuZ3R1cmtpc2htb2RlbC5weSxzaGEyNTY9VzIyZVJOSnNxSTZ1V0Fmd1hTS1ZXV25DZXJZcXJJOGRaUVRtX00wbFJGaywxMTEwMg0KcGlwL192ZW5kb3IvY2hhcmRldC9sYXRpbjFwcm9iZXIucHksc2hhMjU2PVMySW9PUmhGazM5RkVGT2xTRld0Z1Z5YlJpUDZoN0JsTGxkSFZjbE5rVTgsNTM3MA0KcGlwL192ZW5kb3IvY2hhcmRldC9tYmNoYXJzZXRwcm9iZXIucHksc2hhMjU2PUFSOTVlRkg5dnVxU2Z2TFFaTi1MNWlqZWEyNU5PQkNvWHF3OHM1Tzl4TFEsMzQxMw0KcGlwL192ZW5kb3IvY2hhcmRldC9tYmNzZ3JvdXBwcm9iZXIucHksc2hhMjU2PWg2VFJubllxMk94RzFXZEQ1Sk95eGNkVnBuN2RHMHEtdkI4bldyNW1iaDQsMjAxMg0KcGlwL192ZW5kb3IvY2hhcmRldC9tYmNzc20ucHksc2hhMjU2PVNZMzJ3VklGM0h6Y2pZM0JhRXNweTltZXRiTlNLeElJQjBSS1BuN3RqcEksMjU0ODENCnBpcC9fdmVuZG9yL2NoYXJkZXQvc2JjaGFyc2V0cHJvYmVyLnB5LHNoYTI1Nj1MRFNwQ2xkRENGbFl3VWtHa3dEMm9GeExsUFdJV1hUMDlha0hfMlBpWTc0LDU2NTcNCnBpcC9fdmVuZG9yL2NoYXJkZXQvc2Jjc2dyb3VwcHJvYmVyLnB5LHNoYTI1Nj0xSXByY0NCX2sxcWZtbnhHQzZNQmJ4RUxsS3FEM3NjVzZTOFlJd2RleVhBLDM1NDYNCnBpcC9fdmVuZG9yL2NoYXJkZXQvc2ppc3Byb2Jlci5weSxzaGEyNTY9SUl0LWxaajBXSnFLNHJtVVp6S1pQNEdKbEU4S1VFdEZZVnVZOTZlazVNUSwzNzc0DQpwaXAvX3ZlbmRvci9jaGFyZGV0L3VuaXZlcnNhbGRldGVjdG9yLnB5LHNoYTI1Nj1xTDAxNzRsU1pFNDQyZUIyMW5ua3RUOV9WY0F5ZTA3bGFGV1VlVXJqdHRZLDEyNDg1DQpwaXAvX3ZlbmRvci9jaGFyZGV0L3V0Zjhwcm9iZXIucHksc2hhMjU2PUlkRDh2M3pXT3NCOE9MaXlQaS15X2Zxd2lwUkZ4VjlOYzFlS0JMU3VJRXcsMjc2Ng0KcGlwL192ZW5kb3IvY2hhcmRldC92ZXJzaW9uLnB5LHNoYTI1Nj1zcDNCMDhtckRYQi1wZjNLOWZxSl96ZURIT0NMQzhScm5nUXlERmFwXzdnLDI0Mg0KcGlwL192ZW5kb3IvY2hhcmRldC9jbGkvX19pbml0X18ucHksc2hhMjU2PUFicEhHY2dMYi1rUnNKR253RkVrdGs3dXpwWk9DY0JZNzQtWUJkcktWR3MsMQ0KcGlwL192ZW5kb3IvY2hhcmRldC9jbGkvY2hhcmRldGVjdC5weSxzaGEyNTY9WUJPOEw0bVhvMFdSNl8tRmpoXzhReFBCb0VCTnFCOW9OeE5yZGM1NEFRcywyNzM4DQpwaXAvX3ZlbmRvci9jb2xvcmFtYS9fX2luaXRfXy5weSxzaGEyNTY9OXhCeXJUdms5dXBrTDVOR1Y1SXQyRWplNC1rek5Md2FfMWxHUFdwWG9OVSwyNDANCnBpcC9fdmVuZG9yL2NvbG9yYW1hL2Fuc2kucHksc2hhMjU2PUZpMHVuLVFMcVJtLXY3b19uS2lPcXlDOFBhcEJKSzdETFZfcTlMS3RUTzAsMjUyNA0KcGlwL192ZW5kb3IvY29sb3JhbWEvYW5zaXRvd2luMzIucHksc2hhMjU2PWdKWkIzNUxiZGphdHlrZDJ6clVVbm9rTXprdmNGZ3NjeW5fdE54eE1GSEEsOTY2OA0KcGlwL192ZW5kb3IvY29sb3JhbWEvaW5pdGlhbGlzZS5weSxzaGEyNTY9Y0hxVkp0YjgyT0c3SFVDeHZRMmpvRzdOX0NveGJJS2JJX2Zncnlaa2oyMCwxOTE3DQpwaXAvX3ZlbmRvci9jb2xvcmFtYS93aW4zMi5weSxzaGEyNTY9X1NDRW9US19HQTJ0VTFuaGJheUtLYWMtdjlKbjk4bENQSUZPZUZNR0NIUSw1MzY1DQpwaXAvX3ZlbmRvci9jb2xvcmFtYS93aW50ZXJtLnB5LHNoYTI1Nj1WN1U3b2p3RzFxNG42UEtyaXBqRXZXX2h0WVFpNXVlWFNNM0xVVW9xcURZLDYyOTANCnBpcC9fdmVuZG9yL2Rpc3RsaWIvX19pbml0X18ucHksc2hhMjU2PS1hVWVOTkNmaUlHXzFUcWYxOUJIMHhMTnVCS0dYMUk3bE5oY0xZZ0ZVRUEsNTgxDQpwaXAvX3ZlbmRvci9kaXN0bGliL2NvbXBhdC5weSxzaGEyNTY9RnpLbFA5ZE5VTUgtal8xTENWbmpneDZLZ1VicG5SalRqWWtUa0RZUlBsSSw0MDgwMQ0KcGlwL192ZW5kb3IvZGlzdGxpYi9kYXRhYmFzZS5weSxzaGEyNTY9am5pSm1ZazBNajJ0NmdaWWJubjY4VHZRd25WWjBrWHlldWZfM0F4RmNsayw0OTY3Mg0KcGlwL192ZW5kb3IvZGlzdGxpYi9pbmRleC5weSxzaGEyNTY9Q3c4Z3hGcV83eFh2ZGdFeEwzZWZqTEFZM0VBUERNU0wzVkE0MlJrYlFCcywyMTA4NQ0KcGlwL192ZW5kb3IvZGlzdGxpYi9sb2NhdG9ycy5weSxzaGEyNTY9aERfSG0zYVNMOURrbFk5Q3h5Y3Qybl83NGdaMHhORkZHQjVMN002ZHMxNCw1MTAxMw0KcGlwL192ZW5kb3IvZGlzdGxpYi9tYW5pZmVzdC5weSxzaGEyNTY9M3FFdVpoSGxEYnZ5WVoxQlpiZGFwREFpdmdNZ1V3V3BaMDBjbVhxY24xOCwxNDgxMA0KcGlwL192ZW5kb3IvZGlzdGxpYi9tYXJrZXJzLnB5LHNoYTI1Nj1pUnJWV3dweVZ3amtLSlNYOE5FUTkyX01STXdwUk9jZk5HS0NELUNoMVFNLDYyODINCnBpcC9fdmVuZG9yL2Rpc3RsaWIvbWV0YWRhdGEucHksc2hhMjU2PWhVc2Y3UWgyQWU0Q0NrTDMzcUs4cHB3QzhaVHpUN2VwNkhqOVJLcGlqS1UsMzg4MzMNCnBpcC9fdmVuZG9yL2Rpc3RsaWIvcmVzb3VyY2VzLnB5LHNoYTI1Nj1WRkJWYkZxTFZxREJTUURYY0ZRSHJYMUtFY3VvRHhUSzY5OVlkaV9iZXljLDEwNzY2DQpwaXAvX3ZlbmRvci9kaXN0bGliL3NjcmlwdHMucHksc2hhMjU2PXhwZWhOZklTR1BUTnhRWnUwMks5UncyUWJOeF8yUTRlbWVQdjNXNVgwaXcsMTUyMjQNCnBpcC9fdmVuZG9yL2Rpc3RsaWIvdDMyLmV4ZSxzaGEyNTY9Y3AwVUFVRERyMXRHQXg4YWRsS3hXYkNISWEtb0IzYnhldjV6WXpnQXI4RSw4OTA4OA0KcGlwL192ZW5kb3IvZGlzdGxpYi90NjQuZXhlLHNoYTI1Nj1GaWxqRFBjWDlxdm9lOUZZRV85cE5FSHFicU1uaGNDT3VJX29MSjRGOUY4LDk3NzkyDQpwaXAvX3ZlbmRvci9kaXN0bGliL3V0aWwucHksc2hhMjU2PUUyd1UtUlpTaFBNRlVNSnI5a1BtZW1UVUxpbk00cUR6b3NOUGloQ3VLRTAsNTI5OTENCnBpcC9fdmVuZG9yL2Rpc3RsaWIvdmVyc2lvbi5weSxzaGEyNTY9Q2dnaE9VeWx4R0Q3ZEVBMlMzTXZXang3bVlfMmJXc2x1RjBPZjNZeGw0WSwyMzcxMQ0KcGlwL192ZW5kb3IvZGlzdGxpYi93MzIuZXhlLHNoYTI1Nj1MSXRyQkplc0VxdDJRVFF1Qi15aGEyWWJNZWdVUkhtSG1kU3hoakJxbW5jLDg1NTA0DQpwaXAvX3ZlbmRvci9kaXN0bGliL3c2NC5leGUsc2hhMjU2PW5fUGlvQkM3bHR6N3NBazFXTGJMelpKZ1M0UjJheFN5XzBIUGY4WkNzRWcsOTQyMDgNCnBpcC9fdmVuZG9yL2Rpc3RsaWIvd2hlZWwucHksc2hhMjU2PVVQNTNjS3hPTTVyN2JIU1MtbjVwckY2aHdKRVZzTVc5Wk5KdXRPdUMyNmMsMzkxMTUNCnBpcC9fdmVuZG9yL2Rpc3RsaWIvX2JhY2twb3J0L19faW5pdF9fLnB5LHNoYTI1Nj1icVNfZFRPSDZ1VzlpR2dkMHV6ZnBQam82dlo0eHBQWjdreWZaSjJ2TmF3LDI3NA0KcGlwL192ZW5kb3IvZGlzdGxpYi9fYmFja3BvcnQvbWlzYy5weSxzaGEyNTY9S1dlY0lOZGJGTk94U09QMWZHRjY4MENKbmFDNlM0ZkJSZ0V0YVlUdzBpZyw5NzENCnBpcC9fdmVuZG9yL2Rpc3RsaWIvX2JhY2twb3J0L3NodXRpbC5weSxzaGEyNTY9VlcxdDN1WXFValdaSDdqVi02UWlpbUxobmxkb1Y1dUlwSDRFdWlUMWpmdywyNTY0Nw0KcGlwL192ZW5kb3IvZGlzdGxpYi9fYmFja3BvcnQvc3lzY29uZmlnLmNmZyxzaGEyNTY9c3daS3hxOVJZNWU5cjNQWENybHZRUE1zdk9kaVdaQlRITEVicVM4TEpMVSwyNjE3DQpwaXAvX3ZlbmRvci9kaXN0bGliL19iYWNrcG9ydC9zeXNjb25maWcucHksc2hhMjU2PWVTRXlKZzdqeEZfZUhsSEc4SU90bDkza2IwN1VvTUlScDF3WXNQZUdpOWssMjY5NTUNCnBpcC9fdmVuZG9yL2Rpc3RsaWIvX2JhY2twb3J0L3RhcmZpbGUucHksc2hhMjU2PUlocDdyWFJjamJJS3c4Q09tOXdTZVBWOUFSR1hiU0Y5Z0dYQU1uMlEtS1UsOTI2MjgNCnBpcC9fdmVuZG9yL2h0bWw1bGliL19faW5pdF9fLnB5LHNoYTI1Nj1Kc0l3bUZsZGstOXJhQmFkUFNUUzc0SnJmbUp2b3pjLTNhZWtNaTdIcjlzLDc4MA0KcGlwL192ZW5kb3IvaHRtbDVsaWIvX2loYXRleG1sLnB5LHNoYTI1Nj10elh5Z1ltaXNVbWlFVXQydjdFMUFiNTBBS1FzckQtU2dsUFJuWTc1dk1FLDE2NzA1DQpwaXAvX3ZlbmRvci9odG1sNWxpYi9faW5wdXRzdHJlYW0ucHksc2hhMjU2PUM0bFg1Z1VCd2ViT1d5NDFoWVAyWkJwa1BWTnZ4a19oWkJtM09WeVBaTTQsMzI1MzINCnBpcC9fdmVuZG9yL2h0bWw1bGliL190b2tlbml6ZXIucHksc2hhMjU2PVlBYU9FQkQ2cWM1SVNxOVh0OU5pZjFPRmdjeWJUVGZNZHdxQmtaaHBBcTQsNzY1ODANCnBpcC9fdmVuZG9yL2h0bWw1bGliL191dGlscy5weSxzaGEyNTY9YlM2VEhWbEw4WnlUY0k2Q0l4aU02eHh1SHNFOGkxajVPZ2QzSGExRzg0VSw0MDk2DQpwaXAvX3ZlbmRvci9odG1sNWxpYi9jb25zdGFudHMucHksc2hhMjU2PURmYzFGdjNfOWZya3RnV2pnNHRiai1Dak1NcDAyS285cU1lNGlsMUJWZG8sODMzODcNCnBpcC9fdmVuZG9yL2h0bWw1bGliL2h0bWw1cGFyc2VyLnB5LHNoYTI1Nj1EbWx1OWhscTV3X2lkNm1CWnlZX3NFNUx1a0lBQ2d2RzRrcGdJc2RlZDhRLDExNzE3MA0KcGlwL192ZW5kb3IvaHRtbDVsaWIvc2VyaWFsaXplci5weSxzaGEyNTY9VXJyc2EwY1BQTHFOWC1VYkpXUzJnVWhzXzA2cVZiTnhadlVucm1HWks2RSwxNDE3Nw0KcGlwL192ZW5kb3IvaHRtbDVsaWIvX3RyaWUvX19pbml0X18ucHksc2hhMjU2PThWUjFiY2dEMk9wZVMyWEV4cHU1eUJoUF9RMUstbHdLYkJLSUNCUGYxa1UsMjg5DQpwaXAvX3ZlbmRvci9odG1sNWxpYi9fdHJpZS9fYmFzZS5weSxzaGEyNTY9NlBfQWNJb0dqdHdCMnFBbGhWOEg0VlAtenRReG9YRkd3dDROeU1xR19Ldyw5NzkNCnBpcC9fdmVuZG9yL2h0bWw1bGliL190cmllL2RhdHJpZS5weSxzaGEyNTY9RVFwcVNma1pSdVRiRS1EdWhXN3hNZFZEeGRaTlowQ2ZtbllmSEFfM3p4TSwxMTc4DQpwaXAvX3ZlbmRvci9odG1sNWxpYi9fdHJpZS9weS5weSxzaGEyNTY9d1htUUxyWlJmNE15V055ZzBtM2g4MW05SW5oTFI3R0owMDJtSUlaaC04bywxNzc1DQpwaXAvX3ZlbmRvci9odG1sNWxpYi9maWx0ZXJzL19faW5pdF9fLnB5LHNoYTI1Nj00N0RFUXBqOEhCU2EtX1RJbVctNUpDZXVRZVJrbTVOTXBKV1pHM2hTdUZVLDANCnBpcC9fdmVuZG9yL2h0bWw1bGliL2ZpbHRlcnMvYWxwaGFiZXRpY2FsYXR0cmlidXRlcy5weSxzaGEyNTY9RFh2LVAydmRRNUYzT1RXTTZRWjZLaHlEbEFXbTkwcGJmckQxQms5RF9sMCw2MjENCnBpcC9fdmVuZG9yL2h0bWw1bGliL2ZpbHRlcnMvYmFzZS5weSxzaGEyNTY9ei1JVTlaQVlqcHNWc3FtVnQ3a3VXQzYzalIxMWhETXI2Q1ZydnVhbzhXMCwyODYNCnBpcC9fdmVuZG9yL2h0bWw1bGliL2ZpbHRlcnMvaW5qZWN0X21ldGFfY2hhcnNldC5weSxzaGEyNTY9MlFfSm5Nc2NuX3ROYlZfcXBnWU5fNU0zUG5CR2ZtdXZFQ01LREV4SFVjWSwyNzQyDQpwaXAvX3ZlbmRvci9odG1sNWxpYi9maWx0ZXJzL2xpbnQucHksc2hhMjU2PXFmNWNMclQ2eFhkOFY3R0gxUl8zbEt4SWp1SlNmcGJXVHBTd2FnbFlkRHcsMzM2NQ0KcGlwL192ZW5kb3IvaHRtbDVsaWIvZmlsdGVycy9vcHRpb25hbHRhZ3MucHksc2hhMjU2PUVIaWc0a00tUWlManV4VkozRkFBRk55LTEwazRhVjZISmJRekhLWl8zdTgsMTA1MzQNCnBpcC9fdmVuZG9yL2h0bWw1bGliL2ZpbHRlcnMvc2FuaXRpemVyLnB5LHNoYTI1Nj03UHFKcmhtNm1vM0p2YUhrMklRVzdpNzRPcjdRdGQtRlY4VWZ0Skl5RHlzLDI1MTEyDQpwaXAvX3ZlbmRvci9odG1sNWxpYi9maWx0ZXJzL3doaXRlc3BhY2UucHksc2hhMjU2PUtQdDA2N25ZVHFxaThLTFRDbHl5bm40ZVZ6TkRDXy1NQXBYTlZIUlhWWDAsMTEzOQ0KcGlwL192ZW5kb3IvaHRtbDVsaWIvdHJlZWFkYXB0ZXJzL19faW5pdF9fLnB5LHNoYTI1Nj1sM0xjcU1TRXlvaDk5SmhfZVdqR2V4SG5JdktoTEFYb1AtTER6ODh3aHVNLDIwOA0KcGlwL192ZW5kb3IvaHRtbDVsaWIvdHJlZWFkYXB0ZXJzL2dlbnNoaS5weSxzaGEyNTY9NlZJdUhETm9FeHYxSld2M2VQajZWNUNNLXRjeWlVU1dlNV9IZDJlamJ3WSwxNTU1DQpwaXAvX3ZlbmRvci9odG1sNWxpYi90cmVlYWRhcHRlcnMvc2F4LnB5LHNoYTI1Nj0zb2Y0dnZhVVlJQWljN3BuZ2Vid0pWMjRocE9TN1pnOWdnSmFfV1FlZ3k0LDE2NjENCnBpcC9fdmVuZG9yL2h0bWw1bGliL3RyZWVidWlsZGVycy9fX2luaXRfXy5weSxzaGEyNTY9VWxCNG9ya1RnWmhGSUtRZFhydGlXbjljcEtTc3Vobk9RT0lIZUQwRnY0aywzNDA2DQpwaXAvX3ZlbmRvci9odG1sNWxpYi90cmVlYnVpbGRlcnMvYmFzZS5weSxzaGEyNTY9NHZkam1fWjJmX0dUUUJ3S25XbHJ6VmNjdFRiLUs1c2ZOOHBYRGFXT0RpQSwxMzk0Mg0KcGlwL192ZW5kb3IvaHRtbDVsaWIvdHJlZWJ1aWxkZXJzL2RvbS5weSxzaGEyNTY9U1kzTXNpalh5emROUGM4YUs1SVFzdXBCb004SjY3eTU2RGdOdEd2c2I5Zyw4ODM1DQpwaXAvX3ZlbmRvci9odG1sNWxpYi90cmVlYnVpbGRlcnMvZXRyZWUucHksc2hhMjU2PWFxSUJPR2pfZEZZcUJVUkljVGVnR05CaEFJSk93NWlGREhiNGpya1lILTgsMTI3NjQNCnBpcC9fdmVuZG9yL2h0bWw1bGliL3RyZWVidWlsZGVycy9ldHJlZV9seG1sLnB5LHNoYTI1Nj1DRWd3SE1JUVp2SURGQXFjdDRrcVBrVnR5S0ltOWVmSEZxX1ZlRXhFUENBLDE0MTYxDQpwaXAvX3ZlbmRvci9odG1sNWxpYi90cmVld2Fsa2Vycy9fX2luaXRfXy5weSxzaGEyNTY9Q0ZwVU9DZkx1aEFnVko4TllrOXd2aUN1MWtoWW52N1hSU3R2eXpVMUZ3cyw1NTQ0DQpwaXAvX3ZlbmRvci9odG1sNWxpYi90cmVld2Fsa2Vycy9iYXNlLnB5LHNoYTI1Nj1laS0yY0ZiTkZkMGdSanlhRm14bnhaR0xOSUQ0bzBiSEZDSDliTXlaNUJrLDQ5MzkNCnBpcC9fdmVuZG9yL2h0bWw1bGliL3RyZWV3YWxrZXJzL2RvbS5weSxzaGEyNTY9RUh5RlI4RDhsWU5ueURVOWx4X0lLaWdWSlJ5ZWNVR3VhMG1PaTdIQnVrYywxNDEzDQpwaXAvX3ZlbmRvci9odG1sNWxpYi90cmVld2Fsa2Vycy9ldHJlZS5weSxzaGEyNTY9OGpWTEVZMkZqZ040UkZ1Z3doQWg0NGw5U2NWWW9EU3RRRkNubFB3dmFmSSw0Njg0DQpwaXAvX3ZlbmRvci9odG1sNWxpYi90cmVld2Fsa2Vycy9ldHJlZV9seG1sLnB5LHNoYTI1Nj1zWTZ3ZlJzaFdUbGx1Nm40OFRQV3BLc1FSUHAtMENRclQwaGpfQWR6SFNVLDYzMDkNCnBpcC9fdmVuZG9yL2h0bWw1bGliL3RyZWV3YWxrZXJzL2dlbnNoaS5weSxzaGEyNTY9NEQyUEVDWjVuM1pOM3F1M2pNbDl5WTdCODFqblFBcEJRU1ZsZmFJdVliQSwyMzA5DQpwaXAvX3ZlbmRvci9pZG5hL19faW5pdF9fLnB5LHNoYTI1Nj05TnQ3eHB5ZXQzRG1PclBVR29vRGRBd21IWlp1MXFVQXkyRWFKOTNrR2lRLDU4DQpwaXAvX3ZlbmRvci9pZG5hL2NvZGVjLnB5LHNoYTI1Nj1sdlliN3l1N1BoQXFGYUFJQWRXY3dnYVdJMlVtZ3NlVXVhLTFjMEFzRzBBLDMyOTkNCnBpcC9fdmVuZG9yL2lkbmEvY29tcGF0LnB5LHNoYTI1Nj1SLWgyOUQtNm1ybkp6Ylh4eW1yV1VXN2laVXZ5LTI2VFF3WjBpajU3aTRVLDIzMg0KcGlwL192ZW5kb3IvaWRuYS9jb3JlLnB5LHNoYTI1Nj1HYWZpV2RZUUlLNVRTaldkUnpDWUNobzcwNEFMdE1DclZfZG5YWG41N1UwLDExMzkwDQpwaXAvX3ZlbmRvci9pZG5hL2lkbmFkYXRhLnB5LHNoYTI1Nj0tQ2c4M2x1cktvQTlwN2xiMGxNQXNvczByRnoxZG5LckdlQkUzbzhVdUNBLDMyOTk5DQpwaXAvX3ZlbmRvci9pZG5hL2ludHJhbmdlcy5weSxzaGEyNTY9VFkxbHB4WklRV0VQNnROcWpaa0ZBNWhnb01XT2oxT0JtblVHOGloVDg3RSwxNzQ5DQpwaXAvX3ZlbmRvci9pZG5hL3BhY2thZ2VfZGF0YS5weSxzaGEyNTY9S01TVVRTX003Wlo3VWdsX1ZfRU94Vi1EM283djd5Vmt0NDVKS19icFcyNCwyMQ0KcGlwL192ZW5kb3IvaWRuYS91dHM0NmRhdGEucHksc2hhMjU2PVl5bFFZQmZsakF4X1dWcVIyRDdIZ2NHR3lWQ1d3UG02dUYzOGFFUnVoeXcsMTg0OTQ0DQpwaXAvX3ZlbmRvci9sb2NrZmlsZS9fX2luaXRfXy5weSxzaGEyNTY9VHFwejkwRHdLWWZoUHNmelZPSmw4NFRMODdwZEZFNWVQTkhkWEF4czRUayw5MzcxDQpwaXAvX3ZlbmRvci9sb2NrZmlsZS9saW5rbG9ja2ZpbGUucHksc2hhMjU2PUM3T0gzSDRHZEs2OHU0RlFncDhma1Aya080ZnlVVFN5ajNYNmJsZ2ZvYmMsMjY1Mg0KcGlwL192ZW5kb3IvbG9ja2ZpbGUvbWtkaXJsb2NrZmlsZS5weSxzaGEyNTY9ZTNxZ0lMLWV0Wk1Mc1MtM2Z0MTlpV184SVEzNjBITmtHT3FFM3lCS3NVdywzMDk2DQpwaXAvX3ZlbmRvci9sb2NrZmlsZS9waWRsb2NrZmlsZS5weSxzaGEyNTY9dWtIOXVrNk5GdXh5Vm1HNVFpV3c0aUtxM2ZUN01qcVVndVg5NWF2WVBJWSw2MDkwDQpwaXAvX3ZlbmRvci9sb2NrZmlsZS9zcWxpdGVsb2NrZmlsZS5weSxzaGEyNTY9bzJUTWtNUlkwaXduLWlMMVhNUlJJRlN0TVVrUzRpM2FqY2VlWU5udEtGZyw1NTA2DQpwaXAvX3ZlbmRvci9sb2NrZmlsZS9zeW1saW5rbG9ja2ZpbGUucHksc2hhMjU2PUFCd1hYbXZUSHZDbDV2aVBibFNoTDNQRy1nR3NMaVQxcm9BTWZEUndoaTgsMjYxNg0KcGlwL192ZW5kb3IvcGFja2FnaW5nL19fYWJvdXRfXy5weSxzaGEyNTY9emtjQ1BUTl82VGNMVzBOcmxnMDE3Ni1SMVFRX1dWUFRtOHN6MVI0LUhqTSw3MjANCnBpcC9fdmVuZG9yL3BhY2thZ2luZy9fX2luaXRfXy5weSxzaGEyNTY9X3ZOYWM1VHJ6d3NyemJPRkliRi01Y0hxY19ZMmFQVDJEN3pySVIwNkJPbyw1MTMNCnBpcC9fdmVuZG9yL3BhY2thZ2luZy9fY29tcGF0LnB5LHNoYTI1Nj1WaV9BMHJBUWVIYlUtYTlYMHR0MXlRbTlScWtnUWJEU3h6Unc4V2xVOWtBLDg2MA0KcGlwL192ZW5kb3IvcGFja2FnaW5nL19zdHJ1Y3R1cmVzLnB5LHNoYTI1Nj1SSW1FQ0o0Y193VGxhVFlZd1pZTEhFaWViRE1hQUptSzFvUEFSaHcxVDVvLDE0MTYNCnBpcC9fdmVuZG9yL3BhY2thZ2luZy9tYXJrZXJzLnB5LHNoYTI1Nj1tdGcybnBoSkUxb1FPMzlnMURnc2RQc01PLWd1QkJDbHBSLUFFWUZyYk1nLDgyMzANCnBpcC9fdmVuZG9yL3BhY2thZ2luZy9yZXF1aXJlbWVudHMucHksc2hhMjU2PVNEN2RWSkdqZFBVcXRvSGI0N3F3SzZ3V0pUUWQtWlhXanhwSmc4M1VjQkEsNDMyNw0KcGlwL192ZW5kb3IvcGFja2FnaW5nL3NwZWNpZmllcnMucHksc2hhMjU2PVNBTVJlcnpPM2ZLMklrRlpDYVprdXdaYUxfRUdxSE5PejRwbmk0dmhuTjAsMjgwMjUNCnBpcC9fdmVuZG9yL3BhY2thZ2luZy91dGlscy5weSxzaGEyNTY9M202V3ZQbTZOTnhFOHJrVEdtbjByNzVCX0daU0dnN2lrYWZ4SHNCTjFXQSw0MjENCnBpcC9fdmVuZG9yL3BhY2thZ2luZy92ZXJzaW9uLnB5LHNoYTI1Nj1Pd0dueFlmcjJnaE56WXg1OXFXSUJrckszU25CNm4tWmZkMVhhTHBubk0wLDExNTU2DQpwaXAvX3ZlbmRvci9wa2dfcmVzb3VyY2VzL19faW5pdF9fLnB5LHNoYTI1Nj1DY3d1SHRDQlpuOU9Ua21nRjljRnBhZElBTWhscm5aVFZLVE9vNFYycDU4LDEwMzIzMA0KcGlwL192ZW5kb3IvcHJvZ3Jlc3MvX19pbml0X18ucHksc2hhMjU2PVduMTA3NExVRFpvdmQ0emZvVllvam5QQmdPYzZjdEhiUVg3cnBfcDhsUkEsMzAyMw0KcGlwL192ZW5kb3IvcHJvZ3Jlc3MvYmFyLnB5LHNoYTI1Nj1ZTlBKZVJyd1lWS0ZPMm55YUV3c1FqWUJ5YW1NV1RnSk12UU8xTnBELUFZLDI2ODUNCnBpcC9fdmVuZG9yL3Byb2dyZXNzL2NvdW50ZXIucHksc2hhMjU2PWtFcUE4aldFZHdyYzZQXzlWYVJ4N2JqT0h3azlneGwtUTlvVmJRMDh2NWMsMTUwMg0KcGlwL192ZW5kb3IvcHJvZ3Jlc3MvaGVscGVycy5weSxzaGEyNTY9RmVoZndaVHYtNWNDZnNiY01sdmxVa20zeFowY1Joc2V2NlhWcG1lVEY0YywyODU0DQpwaXAvX3ZlbmRvci9wcm9ncmVzcy9zcGlubmVyLnB5LHNoYTI1Nj1pQ1Z0VVFiYUpVRkhUam4xWkxQUUxQWWVhbzRsQzlhWEFhX0h4SWVVSzZrLDEzMTQNCnBpcC9fdmVuZG9yL3JlcXVlc3RzL19faW5pdF9fLnB5LHNoYTI1Nj1KUkZWQnc2SnlWOThXUVNxdjhqc2hjNV9nOXhJYkxoZXZJNUxIYVZpOUk0LDM1NzUNCnBpcC9fdmVuZG9yL3JlcXVlc3RzL19fdmVyc2lvbl9fLnB5LHNoYTI1Nj1CUTI3OWJqcVFfOFBIaHZEX0ZOMzZVdUZxamJTVXFzbTdiTWV5SlYta1ZvLDQzNg0KcGlwL192ZW5kb3IvcmVxdWVzdHMvX2ludGVybmFsX3V0aWxzLnB5LHNoYTI1Nj1aeDNQbkVVY2N5ZnNCLWllMTFuWlZBVzhxQ2xKeTBneDFxTk1FN3JnVDE4LDEwOTYNCnBpcC9fdmVuZG9yL3JlcXVlc3RzL2FkYXB0ZXJzLnB5LHNoYTI1Nj1MQWF5M09IMFpidkk2YkRXX001T2YwNnRVNXoyZm5DZmxycF9YbTM4S3NZLDIxMDE2DQpwaXAvX3ZlbmRvci9yZXF1ZXN0cy9hcGkucHksc2hhMjU2PUJxVlpudnNXdTZQd20wdlEzZndfRGo5X0ktZ2NPUjlDYlNjQjJodFBBckEsNjIzNw0KcGlwL192ZW5kb3IvcmVxdWVzdHMvYXV0aC5weSxzaGEyNTY9NEtDRlFIckwxTGNveDN1TWg0dGpPaDNPckpody1GNXp0aTkxd1ktWnlUWSw5NzI4DQpwaXAvX3ZlbmRvci9yZXF1ZXN0cy9jYWNlcnQucGVtLHNoYTI1Nj03Q0VYZkxIeER3dkRwd1Z1MHlfMmxmSllrNjNjVS1LVUtJX0RMMUxxOFVvLDI3MTA4OA0KcGlwL192ZW5kb3IvcmVxdWVzdHMvY2VydHMucHksc2hhMjU2PW5YUlZxOUR0R212XzFBWWJ3alR1OVVyZ0FjZEp2MDVadmtOZWFvTE9aeFksNDY1DQpwaXAvX3ZlbmRvci9yZXF1ZXN0cy9jb21wYXQucHksc2hhMjU2PWtjcWhWN1U0M2M0aThPdWs1ZTVZZEpYTURFbVdOTFQ5N0xZbTZVb3ItNzQsMTYyNg0KcGlwL192ZW5kb3IvcmVxdWVzdHMvY29va2llcy5weSxzaGEyNTY9dTdRQzVobWxvTXdkVDktMnRhejVHcHdBdnpwMkxUVVM5Y1A0U1dVS25mTSwxODIwOA0KcGlwL192ZW5kb3IvcmVxdWVzdHMvZXhjZXB0aW9ucy5weSxzaGEyNTY9b1p3WXdDbTY1WTBGTXVGcW9qRWdVbFdVQlE0TWtYUnk1VVJIVjFiOThMNCwzMTE1DQpwaXAvX3ZlbmRvci9yZXF1ZXN0cy9oZWxwLnB5LHNoYTI1Nj1VdUJUdGM3dEVwblVfaXZucHVrMmhqZ3p1UzZ6N0duVEVrU2JFTmxjMVhRLDM2NjcNCnBpcC9fdmVuZG9yL3JlcXVlc3RzL2hvb2tzLnB5LHNoYTI1Nj1IWEFIb0MxRk5URlJaWDYtbE5kdlBNN1RzdDRrdkd3WVROLUFPS1J4b1JVLDc2Nw0KcGlwL192ZW5kb3IvcmVxdWVzdHMvbW9kZWxzLnB5LHNoYTI1Nj1sY3oyR0VPZTJlT3UtR3FBR2RwQTB2SlVwSTdFRTRlRFNsV0k3OFI4WTY0LDM0MDUxDQpwaXAvX3ZlbmRvci9yZXF1ZXN0cy9wYWNrYWdlcy5weSxzaGEyNTY9bmpKbVZpZlk0YVNjdHVXM1BQNUVGUkN4akV3TVJETzZKX2ZlRzJkS1dzSSw2OTUNCnBpcC9fdmVuZG9yL3JlcXVlc3RzL3Nlc3Npb25zLnB5LHNoYTI1Nj1fQTVxcGZyb2hIVkZZTEV1VnlFSjR2My1sSWxOd08zR3BIRy1MemtXRkNNLDI3NTQ2DQpwaXAvX3ZlbmRvci9yZXF1ZXN0cy9zdGF0dXNfY29kZXMucHksc2hhMjU2PWE5Ynd1VTdsTXI0SHNoc1JaZHpCYlVzWVZzSW80RnU5R1lnMVhGVEZGUGMsMzMyMw0KcGlwL192ZW5kb3IvcmVxdWVzdHMvc3RydWN0dXJlcy5weSxzaGEyNTY9eWV4Q3ZXYlg0ME02RThtTFFPcEFHWlotWm9BbnlhVDJkbmktQnAtYjQyZywzMDEyDQpwaXAvX3ZlbmRvci9yZXF1ZXN0cy91dGlscy5weSxzaGEyNTY9c1BFa1NWTFhuR2xmb2JiSk1ueDVFOVZjNGtmdjZUcEZXcEhLRkI4d084VSwyNzY1Mg0KcGlwL192ZW5kb3IvdXJsbGliMy9fX2luaXRfXy5weSxzaGEyNTY9RWZVUEY5Ukh2ZWFGOWc1ZGNLNWtCc0dEcDVMcklCLTM5Nk1wSzJSUWsxSSwyODUzDQpwaXAvX3ZlbmRvci91cmxsaWIzL19jb2xsZWN0aW9ucy5weSxzaGEyNTY9YjAteDQ1TEJBcnM5NlJ1bTV4R0FiUHNyaXdmQjNNWlZRYnN2N2xGaVV3RSwxMDIwNA0KcGlwL192ZW5kb3IvdXJsbGliMy9jb25uZWN0aW9uLnB5LHNoYTI1Nj00R0tSOHVYSHo2SXB6dFlodHVoS0JxWGo4NEhiYkZVRjNDdnd5bUdmTEQwLDEzMDAzDQpwaXAvX3ZlbmRvci91cmxsaWIzL2Nvbm5lY3Rpb25wb29sLnB5LHNoYTI1Nj01dWI4Q1huS3Mxd2MyWC1NeXVWVlBvM185c2NXTGdoU2diSE9KVHBRWHVFLDM1MzU4DQpwaXAvX3ZlbmRvci91cmxsaWIzL2V4Y2VwdGlvbnMucHksc2hhMjU2PWR6MWdCRWd0Uk9uTHJXOFY5MTFLaFZaV2VBbjNIMk9oREd6dFdOWFFwcjAsNjYwMw0KcGlwL192ZW5kb3IvdXJsbGliMy9maWVsZHMucHksc2hhMjU2PVlyTlJNOFJCVW1NOGd1WEtVUUZhM2t3ajZYdlFaNzhaOGluRTZsLVlLLUUsNTk0Mw0KcGlwL192ZW5kb3IvdXJsbGliMy9maWxlcG9zdC5weSxzaGEyNTY9TkY2Umx5NjZiaWxXVS1zZFVMWGpDZFFnTjF1UnhmRlJlZGVpZmNSTHprVSwyMzIxDQpwaXAvX3ZlbmRvci91cmxsaWIzL3Bvb2xtYW5hZ2VyLnB5LHNoYTI1Nj0tNTFCQVBsRDBNZ0VDWWR1SGhmYlpDRWlab1VfTkRGT0tZbGhTamlmZjJRLDE2MzQ1DQpwaXAvX3ZlbmRvci91cmxsaWIzL3JlcXVlc3QucHksc2hhMjU2PXdydDJEMFNXTExnVFJLclJuYVpvcGhxMnhYcEN2TlJkN1JNVDZGNW81aFksNTk0Ng0KcGlwL192ZW5kb3IvdXJsbGliMy9yZXNwb25zZS5weSxzaGEyNTY9N21HVUgzNUwySVB1WlZPWTdRdkRRMUdTU0tJZjZWNmdlSlhUaGRqbVFENCwyMjkwMw0KcGlwL192ZW5kb3IvdXJsbGliMy9jb250cmliL19faW5pdF9fLnB5LHNoYTI1Nj00N0RFUXBqOEhCU2EtX1RJbVctNUpDZXVRZVJrbTVOTXBKV1pHM2hTdUZVLDANCnBpcC9fdmVuZG9yL3VybGxpYjMvY29udHJpYi9hcHBlbmdpbmUucHksc2hhMjU2PTQxbDNhclR5LWtCQnBPZFZwU1BZVkM2NFFvN1JMblhuREVENmhjSXRoQTAsMTA4NjUNCnBpcC9fdmVuZG9yL3VybGxpYjMvY29udHJpYi9udGxtcG9vbC5weSxzaGEyNTY9UTktck81UmgyLUlxeUVkNFppY3BURGZNbk9sZjBJUFBDa2poQ2hCQ2pWNCw0NDc4DQpwaXAvX3ZlbmRvci91cmxsaWIzL2NvbnRyaWIvcHlvcGVuc3NsLnB5LHNoYTI1Nj1CeEoxeU1QRTYyZHV1SEpQNmpsWnhMel9GTlRLYldJMGItblZSS2xCRGdJLDE1MzU0DQpwaXAvX3ZlbmRvci91cmxsaWIzL2NvbnRyaWIvc2VjdXJldHJhbnNwb3J0LnB5LHNoYTI1Nj1aUlB6NlExdG5zdTlIMUJPQVFWVVNISXlvd1dtZmFCYjdwR2xiRzVpT1BrLDMwNTAxDQpwaXAvX3ZlbmRvci91cmxsaWIzL2NvbnRyaWIvc29ja3MucHksc2hhMjU2PXpQWVVLTWdfYzBuOUhGalpQRzluR04ya2pwYUg3cVVDWnhyRDVCN0cwX0ksNjE5NQ0KcGlwL192ZW5kb3IvdXJsbGliMy9jb250cmliL19zZWN1cmV0cmFuc3BvcnQvX19pbml0X18ucHksc2hhMjU2PTQ3REVRcGo4SEJTYS1fVEltVy01SkNldVFlUmttNU5NcEpXWkczaFN1RlUsMA0KcGlwL192ZW5kb3IvdXJsbGliMy9jb250cmliL19zZWN1cmV0cmFuc3BvcnQvYmluZGluZ3MucHksc2hhMjU2PXgya0xTaC1BU1pLc3VuMEZ4dHJhQnVMVmUzb0h1dGg0WVc2eVo1Vm9mLXcsMTc1NjANCnBpcC9fdmVuZG9yL3VybGxpYjMvY29udHJpYi9fc2VjdXJldHJhbnNwb3J0L2xvd19sZXZlbC5weSxzaGEyNTY9VWJoVXlrRUg2SFVJSnVkOV9ybl82WVdqaW9uazVpcV9ycTZZcmhWTTZDbywxMjA2Mg0KcGlwL192ZW5kb3IvdXJsbGliMy9wYWNrYWdlcy9fX2luaXRfXy5weSxzaGEyNTY9bmxDaHJHemtqQ2ttaENYOUhyRl9xSFBVZ29zZnNQUWtWSUp4aWlMaGs5ZywxMDkNCnBpcC9fdmVuZG9yL3VybGxpYjMvcGFja2FnZXMvb3JkZXJlZF9kaWN0LnB5LHNoYTI1Nj1WUWFQT05maFZNc2I4QjYzWGc3Wk95ZEpxSUVfanplTWhWTjNQZWM2b2d3LDg5MzUNCnBpcC9fdmVuZG9yL3VybGxpYjMvcGFja2FnZXMvc2l4LnB5LHNoYTI1Nj1BNmhkSlpWakkzdF9nZWViWjlCelV2d1JySVhvMGxmd3pRbE0yTGNLeWFzLDMwMDk4DQpwaXAvX3ZlbmRvci91cmxsaWIzL3BhY2thZ2VzL2JhY2twb3J0cy9fX2luaXRfXy5weSxzaGEyNTY9NDdERVFwajhIQlNhLV9USW1XLTVKQ2V1UWVSa201Tk1wSldaRzNoU3VGVSwwDQpwaXAvX3ZlbmRvci91cmxsaWIzL3BhY2thZ2VzL2JhY2twb3J0cy9tYWtlZmlsZS5weSxzaGEyNTY9cjFJQURvbF9wQkJxMlkxdWI0Q1B5dVMyaFh1U2hLNDduZkZuZ1pSY1JoSSwxNDYxDQpwaXAvX3ZlbmRvci91cmxsaWIzL3BhY2thZ2VzL3NzbF9tYXRjaF9ob3N0bmFtZS9fX2luaXRfXy5weSxzaGEyNTY9V0JWYnhRQm9qTkF4Zlp3TmF2a294M0JnSmlNQTlCSm1tLV9md2QwakRfbyw2ODgNCnBpcC9fdmVuZG9yL3VybGxpYjMvcGFja2FnZXMvc3NsX21hdGNoX2hvc3RuYW1lL19pbXBsZW1lbnRhdGlvbi5weSxzaGEyNTY9bEFqN3FHQ1pMT2xkaG44Z1pEWTZUcXA0bXZna2JUZnk0azRnRElEUm84Zyw1NzAyDQpwaXAvX3ZlbmRvci91cmxsaWIzL3V0aWwvX19pbml0X18ucHksc2hhMjU2PTZSYW40b0FWSXk0MEN1X29FUFduTlY5YndGNXJYeDZHMURVWjdvZWhqUFksMTA0NA0KcGlwL192ZW5kb3IvdXJsbGliMy91dGlsL2Nvbm5lY3Rpb24ucHksc2hhMjU2PV82XzVKWkpGM0hIUlhSN0hheEhnM21rN3FNS0szTjBubDNETDhnRkFmbzQsNDIzNw0KcGlwL192ZW5kb3IvdXJsbGliMy91dGlsL3JlcXVlc3QucHksc2hhMjU2PUg1X2xySHZ0d2wyVTJCYlQxVVlOOUhwcnVOYzFnc05GbHoybmpRbWhQclEsMzcwNQ0KcGlwL192ZW5kb3IvdXJsbGliMy91dGlsL3Jlc3BvbnNlLnB5LHNoYTI1Nj1TU05MODg4Vy1NUTh0M0hBaTQ0a05HZ0Y2ODJwNkhfX3l0RVh6Qll4Vl9NLDIzNDMNCnBpcC9fdmVuZG9yL3VybGxpYjMvdXRpbC9yZXRyeS5weSxzaGEyNTY9cDRMSG0tT1ZhTmROeVotaG9Bb2RUSW94Tm9jQXV1ZWdUMzZIeF9HY3drZywxNDYwMQ0KcGlwL192ZW5kb3IvdXJsbGliMy91dGlsL3NlbGVjdG9ycy5weSxzaGEyNTY9UElJTnp3amlENVo2SXlUS0ExdFI1bjFrQ09YeVRocERDRTJmQ1ZGekxlTSwyMTE0Nw0KcGlwL192ZW5kb3IvdXJsbGliMy91dGlsL3NzbF8ucHksc2hhMjU2PVlwY2lNMG1OX3JkMjd3Y2hMRU5TeFROYTdQV0VnWjJNUDlhdGVGdXJDZW8sMTIyMDgNCnBpcC9fdmVuZG9yL3VybGxpYjMvdXRpbC90aW1lb3V0LnB5LHNoYTI1Nj03bEhOcmdMNVlIMmNJMWoteVpuelZfSjhqQmxSVmRtRmhRYU55TTFfMmI4LDk3NTcNCnBpcC9fdmVuZG9yL3VybGxpYjMvdXRpbC91cmwucHksc2hhMjU2PXFDWV9ISFVYdm8wNXdBc0VFUkFMZ0V4dGxneExuQUhTUTdjZTFiLWczU00sNjQ4Nw0KcGlwL192ZW5kb3IvdXJsbGliMy91dGlsL3dhaXQucHksc2hhMjU2PVFfcGRfYkQ2aWFQZ1JLd0VtY2pUWURyU1BqNERkNG9qeWttcUEzOThiOG8sMTQ1MQ0KcGlwL192ZW5kb3Ivd2ViZW5jb2RpbmdzL19faW5pdF9fLnB5LHNoYTI1Nj10N3JBUVF4WHdhbFktYWs5aFRsNzNxSGpoaWE5VUgtc0wtZTAwcVFyQnBvLDEwNTc2DQpwaXAvX3ZlbmRvci93ZWJlbmNvZGluZ3MvbGFiZWxzLnB5LHNoYTI1Nj00QU9fS3hUZGRxR3RyTDluczdrQVBqYjBDY042eHNDSXhiSzM3SFk5cjNFLDg5NzkNCnBpcC9fdmVuZG9yL3dlYmVuY29kaW5ncy9ta2xhYmVscy5weSxzaGEyNTY9R1lJZXl3bnBhTG5QMEdTaWM4TEZXZ2QwVVZ2T19sMU5jNllvRi04N1JfNCwxMzA1DQpwaXAvX3ZlbmRvci93ZWJlbmNvZGluZ3MvdGVzdHMucHksc2hhMjU2PTd2VGs3TGdPSm5fdDFYdFRfdmlvZlpsRUo3Y0pDelBlX2h2VkhPa2NRbDgsNjU2Mg0KcGlwL192ZW5kb3Ivd2ViZW5jb2RpbmdzL3hfdXNlcl9kZWZpbmVkLnB5LHNoYTI1Nj03MmNmUFJoYmZrUkNHa2tBOFpudlZWN1Vub2lMYjV1UE1oWHdoclhpTFBrLDQzMDYNCnBpcC9jb21tYW5kcy9fX2luaXRfXy5weSxzaGEyNTY9MlVxM0hDZGpjaEpEOUZMMUxCN3JkNXY2VXlTVkFWaXpYMFczRVgzaElvRSwyMjQ0DQpwaXAvY29tbWFuZHMvY2hlY2sucHksc2hhMjU2PS1BN0dJMS1XWkJoOWE0UDZVb0hfYVItSjdJOEx6OGx5N20zd25Dam1ldnMsMTM4Mg0KcGlwL2NvbW1hbmRzL2NvbXBsZXRpb24ucHksc2hhMjU2PWtrUGdWWDdTVWNKXzhKdXc1R2tnV2F4SE45XzQ1d21BcjltR3MxelhFRXMsMjQ1Mw0KcGlwL2NvbW1hbmRzL2Rvd25sb2FkLnB5LHNoYTI1Nj04UnV1UG1TWWdBcTNpRURUcVpZXzFQRFhScVJFZFVVTEhOaldKZUF2N01vLDc4MTANCnBpcC9jb21tYW5kcy9mcmVlemUucHksc2hhMjU2PWg2LXlGTXBqQ2piTmo4LWdPbTVVdW9GNmNnMTRONXJQVjRUQ2kzX0NldUksMjgzNQ0KcGlwL2NvbW1hbmRzL2hhc2gucHksc2hhMjU2PU1DdDRqRUZ5Zm9jZTBsVmVORXoxeDQ5dWFUWS1WRGtLaUJ2dnhyVmNIa3csMTU5Nw0KcGlwL2NvbW1hbmRzL2hlbHAucHksc2hhMjU2PTg0SFdrRWRuR1BfQUVCSG5uOGdKUDJUZTBYVFhSS0ZvWHFYb3BiT1pUTm8sOTgyDQpwaXAvY29tbWFuZHMvaW5zdGFsbC5weSxzaGEyNTY9b3ZHOXA5bjFYMk5QcU1nRlZ0U3VUOWtNYkxBZHgxcjNZU1NpWFN2Z09LSSwxNzQxMg0KcGlwL2NvbW1hbmRzL2xpc3QucHksc2hhMjU2PTkzYkNpRnl0MlF1dF9ZSGtZSEpNWkhwWGxhZG14c2pTLXlPdFplYjN1cUksMTEzNjkNCnBpcC9jb21tYW5kcy9zZWFyY2gucHksc2hhMjU2PW9UczlRTmRlZm5ybUNWX0plZnRHMFBHaU11WVZtaUVERjFPVWFZc21EYW8sNDUwMg0KcGlwL2NvbW1hbmRzL3Nob3cucHksc2hhMjU2PVpZTTU3XzdVOEtQOU1RSUl5SEtRZFp4bWlFWkJ5eS1EUnpCNjk3VkZvVFksNTg5MQ0KcGlwL2NvbW1hbmRzL3VuaW5zdGFsbC5weSxzaGEyNTY9dHo4Y1h6NFdkcFVkbnQzUnZwZFF3SDZfU05NQjUwZWdCSVpXYTFkd2ZjYywyODg0DQpwaXAvY29tbWFuZHMvd2hlZWwucHksc2hhMjU2PXo1U0Vod3MyWVJNYjBNbDFJRWtnNmpGWk1MUnBMbDg2YkhDclFiWXQ1em8sNzcyOQ0KcGlwL2NvbXBhdC9fX2luaXRfXy5weSxzaGEyNTY9MlhzX0lwc21kUmdIYlFnUU8wYzhfbFB2SEpuUVhIeUdXeFBiTGJZSkw0Yyw0NjcyDQpwaXAvY29tcGF0L2RpY3Rjb25maWcucHksc2hhMjU2PWRScmVsUERXcmNlRFN6RlQ1MVJURVZZMkd1TTdVRHljNUlnaF90bjRGdmssMjMwOTYNCnBpcC9tb2RlbHMvX19pbml0X18ucHksc2hhMjU2PTBSczdfUkE0RHhlT2tXVDVDcTRDUXpEclNFaHZZY04zVEgyY2F6cjcyUEUsNzENCnBpcC9tb2RlbHMvaW5kZXgucHksc2hhMjU2PXBVZmJPX192M21EOWotMm5fQ2x3UFM4cFZ5eDRsMndJd3l2V3Q4R01DUkEsNDg3DQpwaXAvb3BlcmF0aW9ucy9fX2luaXRfXy5weSxzaGEyNTY9NDdERVFwajhIQlNhLV9USW1XLTVKQ2V1UWVSa201Tk1wSldaRzNoU3VGVSwwDQpwaXAvb3BlcmF0aW9ucy9jaGVjay5weSxzaGEyNTY9dXdVTjljczFzUG83YzBTajZwUnJTdjdiMjJQazI5U1hVSW1UZWxWY2hNUSwxNTkwDQpwaXAvb3BlcmF0aW9ucy9mcmVlemUucHksc2hhMjU2PWstN3c3THNNLVJwUHY3RVJCekhpUHBZa0gtR3VZZkhMeVItQ3BfMVZQTDAsNTE5NA0KcGlwL3JlcS9fX2luaXRfXy5weSxzaGEyNTY9dkZ3Wlk4X1ZjMVdVMXpGQWVzcGcxTXlfcl9BVDNuN2NOMFc5ZVgwRUZxaywyNzYNCnBpcC9yZXEvcmVxX2ZpbGUucHksc2hhMjU2PWZHOU1Ec1hVTlBobUd3eFVpd3JJWEV5bnlEOFE3czNMNDctaExaUERYcTAsMTE5MjYNCnBpcC9yZXEvcmVxX2luc3RhbGwucHksc2hhMjU2PWdZckgtbHdRTW10NTVWVmJhdl9FdFJJUHU5NGNRYkhGSG1fS3E2QWVIYmcsNDY0ODcNCnBpcC9yZXEvcmVxX3NldC5weSxzaGEyNTY9akhzcFhxY0EyRnhjRjA1ZGdVSUFaNWh1WVB2NmJuMHdSVVgwWjdQS21hQSwzNDQ2Mg0KcGlwL3JlcS9yZXFfdW5pbnN0YWxsLnB5LHNoYTI1Nj1mZEgyVmdDakVDOE5SWURTN2ZSdTNaSmFCQlVFeS1ONW11d3hEWDVNQk5NLDY4OTcNCnBpcC91dGlscy9fX2luaXRfXy5weSxzaGEyNTY9SFhfd1lTMTVvaVlPei1IM3FHMUtiaTFDWTdBR1dDTks1amxvaUQwZmF1YywyNzE4Nw0KcGlwL3V0aWxzL2FwcGRpcnMucHksc2hhMjU2PWtqMkxLLUkyZkM1UW5FaF9BX3YtZXZfSVFNY1hhV1dGNURFMzlzTnZDTFEsODgxMQ0KcGlwL3V0aWxzL2J1aWxkLnB5LHNoYTI1Nj00c21MUnJmU0NtWG1qRW5Wbk1GaDJ0QkVwTmNTTFJlNkowZWpaSi13V0pFLDEzMTINCnBpcC91dGlscy9kZXByZWNhdGlvbi5weSxzaGEyNTY9WF9GTWp0RGJNSnFmcUVrZFJya2ktbVl5SWRQQjZJNkRIVVRDQV9DaFk2TSwyMjMyDQpwaXAvdXRpbHMvZW5jb2RpbmcucHksc2hhMjU2PU5ReEdpRlM1R2JlQXZlTFpUbng5MnQ1cjBQWXF2dDBpUm5QMnU5U0dHMXcsOTcxDQpwaXAvdXRpbHMvZmlsZXN5c3RlbS5weSxzaGEyNTY9WkVWQnVZTTNmcXIyX2xnT0VTaDRZN2ZQRnN6R0Q0NzR6Vm1fTTNNYjVUayw4OTkNCnBpcC91dGlscy9nbGliYy5weSxzaGEyNTY9amNRWWp0X29KTFBLVlpCMjhLYXV5NFN3NzB6Uy13YXd4b1UxSEhYMzZfMCwyOTM5DQpwaXAvdXRpbHMvaGFzaGVzLnB5LHNoYTI1Nj1vTWs3Y2QzUGJKZ3pwU1F5WHExTXl0TXVkNWY2SDVPYTJZWTVoWXVDcTZJLDI4NjYNCnBpcC91dGlscy9sb2dnaW5nLnB5LHNoYTI1Nj03eVd1NGdady1RY2xqN1g4MFFWZHBHV2tkVFdHS1Q0TGlVVktjRTA0cHJvLDMzMjcNCnBpcC91dGlscy9vdXRkYXRlZC5weSxzaGEyNTY9Zk53T0NMNXIyRWZ0UEdoZ0NZR01LdTAzMkhDOGNWLUpBcjlscDBIbVRvTSw1NDU1DQpwaXAvdXRpbHMvcGFja2FnaW5nLnB5LHNoYTI1Nj1xaG1saTE0b2R3NkRJaFdKZ1FZUzJRMFJyU2JyOG5YTmNHNDhmNXlUUm1zLDIwODANCnBpcC91dGlscy9zZXR1cHRvb2xzX2J1aWxkLnB5LHNoYTI1Nj0wYmxmc2NtTkpXX2laNURjc3dKZURCX1BidFRFamZLOVJMMVIxV0VEVzJFLDI3OA0KcGlwL3V0aWxzL3VpLnB5LHNoYTI1Nj1wYkRrU0FldW1aNmpkWmNPSjJ5QWJ4OGlCZ2VQMnpmcHFObkxKSzFnc2tRLDExNTk3DQpwaXAvdmNzL19faW5pdF9fLnB5LHNoYTI1Nj1XYWZGbGlVVEhNbXNTSVNWOFBIcDFNNUVYRE5TV3lKcjc4ekthUW1QTGRZLDEyMzc0DQpwaXAvdmNzL2JhemFhci5weSxzaGEyNTY9dFlUd2M0YjRvZmY4bXIwTzJvOFNpR2VqcUJESnhjYkRCTVNNZDktSVNZYywzODAzDQpwaXAvdmNzL2dpdC5weSxzaGEyNTY9NUxmV3J5aTc4QS0yVUxqRVpKdkNUYXJKXzNsOHZlbndYQVNsd204aGl1ZywxMTE5Nw0KcGlwL3Zjcy9tZXJjdXJpYWwucHksc2hhMjU2PXhHNnJEaXdIQ1J5dEpFczIzU0lIQlhsX1N3UW8yamtrZERfNnJWVlA1aDQsMzQ3Mg0KcGlwL3Zjcy9zdWJ2ZXJzaW9uLnB5LHNoYTI1Nj1HQXVYMlNrN0ladkp5RXpFTktjVmxkX3dHQnJRM2ZwWERsWGphcFpFWWRJLDkzNTANCnBpcC05LjAuMy5kaXN0LWluZm8vREVTQ1JJUFRJT04ucnN0LHNoYTI1Nj1WYThXajFYQnBUYlZRMlo0MW1aUkpkQUxFZXppaVNfWmV3V24xSDJlY1k0LDEyODcNCnBpcC05LjAuMy5kaXN0LWluZm8vTUVUQURBVEEsc2hhMjU2PWtNMnpYRG9JUGlaMnFvamZrYURDN2FLcVRGd3V3Z01SVko3RllVdEFBVmssMjU1Mw0KcGlwLTkuMC4zLmRpc3QtaW5mby9SRUNPUkQsLA0KcGlwLTkuMC4zLmRpc3QtaW5mby9XSEVFTCxzaGEyNTY9a2RzTi01T0pBWklpSE4taU80UmhsODJLeVMwYkRXZjR1QndNYmtOYWZyOCwxMTANCnBpcC05LjAuMy5kaXN0LWluZm8vZW50cnlfcG9pbnRzLnR4dCxzaGEyNTY9US1mUjJ0Y3A5RFJkZVhvR24xd1I2N1hlY3kzMm81RXlRRW56RGdod3Fxayw2OA0KcGlwLTkuMC4zLmRpc3QtaW5mby9tZXRhZGF0YS5qc29uLHNoYTI1Nj00TG1ydWkza25MMGJnb3hsMThzY3lzMVV6dE9mdWdVZkN6QVJjcEtXNHpBLDE1NjUNCnBpcC05LjAuMy5kaXN0LWluZm8vdG9wX2xldmVsLnR4dCxzaGEyNTY9enV1dWU0a25veUotVXdQUFhnOGZlelM3VkNyWEpRckFQN3plTnV3dkZRZyw0DQpQSwMEFAAAAAAAAAAhAPbd0r5uAAAAbgAAADYAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC05LjAuMy5kaXN0LWluZm8vV0hFRUxXaGVlbC1WZXJzaW9uOiAxLjAKR2VuZXJhdG9yOiBiZGlzdF93aGVlbCAoMC4zMC4wKQpSb290LUlzLVB1cmVsaWI6IHRydWUKVGFnOiBweTItbm9uZS1hbnkKVGFnOiBweTMtbm9uZS1hbnkKClBLAwQUAAAAAAAAACEAtBeYxEQAAABEAAAAQQAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwLTkuMC4zLmRpc3QtaW5mby9lbnRyeV9wb2ludHMudHh0W2NvbnNvbGVfc2NyaXB0c10KcGlwID0gcGlwOm1haW4KcGlwMyA9IHBpcDptYWluCnBpcDMuNiA9IHBpcDptYWluCgpQSwMEFAAAAAAAAAAhAMjgt5sdBgAAHQYAAD4AAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC05LjAuMy5kaXN0LWluZm8vbWV0YWRhdGEuanNvbnsiY2xhc3NpZmllcnMiOiBbIkRldmVsb3BtZW50IFN0YXR1cyA6OiA1IC0gUHJvZHVjdGlvbi9TdGFibGUiLCAiSW50ZW5kZWQgQXVkaWVuY2UgOjogRGV2ZWxvcGVycyIsICJMaWNlbnNlIDo6IE9TSSBBcHByb3ZlZCA6OiBNSVQgTGljZW5zZSIsICJUb3BpYyA6OiBTb2Z0d2FyZSBEZXZlbG9wbWVudCA6OiBCdWlsZCBUb29scyIsICJQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMiIsICJQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMi42IiwgIlByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAyLjciLCAiUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMiLCAiUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMuMyIsICJQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMy40IiwgIlByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzLjUiLCAiUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IEltcGxlbWVudGF0aW9uIDo6IFB5UHkiXSwgImV4dGVuc2lvbnMiOiB7InB5dGhvbi5jb21tYW5kcyI6IHsid3JhcF9jb25zb2xlIjogeyJwaXAiOiAicGlwOm1haW4iLCAicGlwMyI6ICJwaXA6bWFpbiIsICJwaXAzLjYiOiAicGlwOm1haW4ifX0sICJweXRob24uZGV0YWlscyI6IHsiY29udGFjdHMiOiBbeyJlbWFpbCI6ICJweXRob24tdmlydHVhbGVudkBncm91cHMuZ29vZ2xlLmNvbSIsICJuYW1lIjogIlRoZSBwaXAgZGV2ZWxvcGVycyIsICJyb2xlIjogImF1dGhvciJ9XSwgImRvY3VtZW50X25hbWVzIjogeyJkZXNjcmlwdGlvbiI6ICJERVNDUklQVElPTi5yc3QifSwgInByb2plY3RfdXJscyI6IHsiSG9tZSI6ICJodHRwczovL3BpcC5weXBhLmlvLyJ9fSwgInB5dGhvbi5leHBvcnRzIjogeyJjb25zb2xlX3NjcmlwdHMiOiB7InBpcCI6ICJwaXA6bWFpbiIsICJwaXAzIjogInBpcDptYWluIiwgInBpcDMuNiI6ICJwaXA6bWFpbiJ9fX0sICJleHRyYXMiOiBbInRlc3RpbmciXSwgImdlbmVyYXRvciI6ICJiZGlzdF93aGVlbCAoMC4zMC4wKSIsICJrZXl3b3JkcyI6IFsiZWFzeV9pbnN0YWxsIiwgImRpc3R1dGlscyIsICJzZXR1cHRvb2xzIiwgImVnZyIsICJ2aXJ0dWFsZW52Il0sICJsaWNlbnNlIjogIk1JVCIsICJtZXRhZGF0YV92ZXJzaW9uIjogIjIuMCIsICJuYW1lIjogInBpcCIsICJyZXF1aXJlc19weXRob24iOiAiPj0yLjYsIT0zLjAuKiwhPTMuMS4qLCE9My4yLioiLCAicnVuX3JlcXVpcmVzIjogW3siZXh0cmEiOiAidGVzdGluZyIsICJyZXF1aXJlcyI6IFsibW9jayIsICJwcmV0ZW5kIiwgInB5dGVzdCIsICJzY3JpcHR0ZXN0ICg+PTEuMykiLCAidmlydHVhbGVudiAoPj0xLjEwKSJdfV0sICJzdW1tYXJ5IjogIlRoZSBQeVBBIHJlY29tbWVuZGVkIHRvb2wgZm9yIGluc3RhbGxpbmcgUHl0aG9uIHBhY2thZ2VzLiIsICJ0ZXN0X3JlcXVpcmVzIjogW3sicmVxdWlyZXMiOiBbIm1vY2siLCAicHJldGVuZCIsICJweXRlc3QiLCAic2NyaXB0dGVzdCAoPj0xLjMpIiwgInZpcnR1YWxlbnYgKD49MS4xMCkiXX1dLCAidmVyc2lvbiI6ICI5LjAuMyJ9UEsDBBQAAAAAAAAAIQDHH5fCBAAAAAQAAAA+AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAtOS4wLjMuZGlzdC1pbmZvL3RvcF9sZXZlbC50eHRwaXAKUEsDBBQAAAAAAAAAIQANW9B2tC4AALQuAAAsAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX19pbml0X18ucHkjIS91c3IvYmluL2VudiBweXRob24KZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBsb2NhbGUKaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IG9zCmltcG9ydCBvcHRwYXJzZQppbXBvcnQgd2FybmluZ3MKCmltcG9ydCBzeXMKaW1wb3J0IHJlCgojIDIwMTYtMDYtMTcgYmFycnlAZGViaWFuLm9yZzogdXJsbGliMyAxLjE0IGFkZGVkIG9wdGlvbmFsIHN1cHBvcnQgZm9yIHNvY2tzLAojIGJ1dCBpZiBpbnZva2VkIChpLmUuIGltcG9ydGVkKSwgaXQgd2lsbCBpc3N1ZSBhIHdhcm5pbmcgdG8gc3RkZXJyIGlmIHNvY2tzCiMgaXNuJ3QgYXZhaWxhYmxlLiAgcmVxdWVzdHMgdW5jb25kaXRpb25hbGx5IGltcG9ydHMgdXJsbGliMydzIHNvY2tzIGNvbnRyaWIKIyBtb2R1bGUsIHRyaWdnZXJpbmcgdGhpcyB3YXJuaW5nLiAgVGhlIHdhcm5pbmcgYnJlYWtzIERFUC04IHRlc3RzIChiZWNhdXNlIG9mCiMgdGhlIHN0ZGVyciBvdXRwdXQpIGFuZCBpcyBqdXN0IHBsYWluIGFubm95aW5nIGluIG5vcm1hbCB1c2FnZS4gIEkgZG9uJ3Qgd2FudAojIHRvIGFkZCBzb2NrcyBhcyB5ZXQgYW5vdGhlciBkZXBlbmRlbmN5IGZvciBwaXAsIG5vciBkbyBJIHdhbnQgdG8gYWxsb3ctc3RkZXIKIyBpbiB0aGUgREVQLTggdGVzdHMsIHNvIGp1c3Qgc3VwcHJlc3MgdGhlIHdhcm5pbmcuICBwZGIgdGVsbHMgbWUgdGhpcyBoYXMgdG8KIyBiZSBkb25lIGJlZm9yZSB0aGUgaW1wb3J0IG9mIHBpcC52Y3MuCmZyb20gcGlwLl92ZW5kb3IudXJsbGliMy5leGNlcHRpb25zIGltcG9ydCBEZXBlbmRlbmN5V2FybmluZwp3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygiaWdub3JlIiwgY2F0ZWdvcnk9RGVwZW5kZW5jeVdhcm5pbmcpICAjIG5vcWEKCiMgV2Ugd2FudCB0byBpbmplY3QgdGhlIHVzZSBvZiBTZWN1cmVUcmFuc3BvcnQgYXMgZWFybHkgYXMgcG9zc2libGUgc28gdGhhdCBhbnkKIyByZWZlcmVuY2VzIG9yIHNlc3Npb25zIG9yIHdoYXQgaGF2ZSB5b3UgYXJlIGVuc3VyZWQgdG8gaGF2ZSBpdCwgaG93ZXZlciB3ZQojIG9ubHkgd2FudCB0byBkbyB0aGlzIGluIHRoZSBjYXNlIHRoYXQgd2UncmUgcnVubmluZyBvbiBtYWNPUyBhbmQgdGhlIGxpbmtlZAojIE9wZW5TU0wgaXMgdG9vIG9sZCB0byBoYW5kbGUgVExTdjEuMgp0cnk6CiAgICBpbXBvcnQgc3NsCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIHBhc3MKZWxzZToKICAgIGlmIChzeXMucGxhdGZvcm0gPT0gImRhcndpbiIgYW5kCiAgICAgICAgICAgIGdldGF0dHIoc3NsLCAiT1BFTlNTTF9WRVJTSU9OX05VTUJFUiIsIDApIDwgMHgxMDAwMTAwZik6ICAjIE9wZW5TU0wgMS4wLjEKICAgICAgICB0cnk6CiAgICAgICAgICAgIGZyb20gcGlwLl92ZW5kb3IudXJsbGliMy5jb250cmliIGltcG9ydCBzZWN1cmV0cmFuc3BvcnQKICAgICAgICBleGNlcHQgKEltcG9ydEVycm9yLCBPU0Vycm9yKToKICAgICAgICAgICAgcGFzcwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlY3VyZXRyYW5zcG9ydC5pbmplY3RfaW50b191cmxsaWIzKCkKCmZyb20gcGlwLmV4Y2VwdGlvbnMgaW1wb3J0IEluc3RhbGxhdGlvbkVycm9yLCBDb21tYW5kRXJyb3IsIFBpcEVycm9yCmZyb20gcGlwLnV0aWxzIGltcG9ydCBnZXRfaW5zdGFsbGVkX2Rpc3RyaWJ1dGlvbnMsIGdldF9wcm9nCmZyb20gcGlwLnV0aWxzIGltcG9ydCBkZXByZWNhdGlvbiwgZGlzdF9pc19lZGl0YWJsZQpmcm9tIHBpcC52Y3MgaW1wb3J0IGdpdCwgbWVyY3VyaWFsLCBzdWJ2ZXJzaW9uLCBiYXphYXIgICMgbm9xYQpmcm9tIHBpcC5iYXNlcGFyc2VyIGltcG9ydCBDb25maWdPcHRpb25QYXJzZXIsIFVwZGF0aW5nRGVmYXVsdHNIZWxwRm9ybWF0dGVyCmZyb20gcGlwLmNvbW1hbmRzIGltcG9ydCBnZXRfc3VtbWFyaWVzLCBnZXRfc2ltaWxhcl9jb21tYW5kcwpmcm9tIHBpcC5jb21tYW5kcyBpbXBvcnQgY29tbWFuZHNfZGljdApmcm9tIHBpcC5fdmVuZG9yLnVybGxpYjMuZXhjZXB0aW9ucyBpbXBvcnQgSW5zZWN1cmVSZXF1ZXN0V2FybmluZwoKCiMgYXNzaWdubWVudCBmb3IgZmxha2U4IHRvIGJlIGhhcHB5CgojIFRoaXMgZml4ZXMgYSBwZWN1bGlhcml0eSB3aGVuIGltcG9ydGluZyB2aWEgX19pbXBvcnRfXyAtIGFzIHdlIGFyZQojIGluaXRpYWxpc2luZyB0aGUgcGlwIG1vZHVsZSwgImZyb20gcGlwIGltcG9ydCBjbWRvcHRpb25zIiBpcyByZWN1cnNpdmUKIyBhbmQgYXBwZWFycyBub3QgdG8gd29yayBwcm9wZXJseSBpbiB0aGF0IHNpdHVhdGlvbi4KaW1wb3J0IHBpcC5jbWRvcHRpb25zCmNtZG9wdGlvbnMgPSBwaXAuY21kb3B0aW9ucwoKIyBUaGUgdmVyc2lvbiBhcyB1c2VkIGluIHRoZSBzZXR1cC5weSBhbmQgdGhlIGRvY3MgY29uZi5weQpfX3ZlcnNpb25fXyA9ICI5LjAuMyIKCgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCiMgSGlkZSB0aGUgSW5zZWN1cmVSZXF1ZXN0V2FybmluZyBmcm9tIHVybGxpYjMKd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsIGNhdGVnb3J5PUluc2VjdXJlUmVxdWVzdFdhcm5pbmcpCgoKZGVmIGF1dG9jb21wbGV0ZSgpOgogICAgIiIiQ29tbWFuZCBhbmQgb3B0aW9uIGNvbXBsZXRpb24gZm9yIHRoZSBtYWluIG9wdGlvbiBwYXJzZXIgKGFuZCBvcHRpb25zKQogICAgYW5kIGl0cyBzdWJjb21tYW5kcyAoYW5kIG9wdGlvbnMpLgoKICAgIEVuYWJsZSBieSBzb3VyY2luZyBvbmUgb2YgdGhlIGNvbXBsZXRpb24gc2hlbGwgc2NyaXB0cyAoYmFzaCwgenNoIG9yIGZpc2gpLgogICAgIiIiCiAgICAjIERvbid0IGNvbXBsZXRlIGlmIHVzZXIgaGFzbid0IHNvdXJjZWQgYmFzaF9jb21wbGV0aW9uIGZpbGUuCiAgICBpZiAnUElQX0FVVE9fQ09NUExFVEUnIG5vdCBpbiBvcy5lbnZpcm9uOgogICAgICAgIHJldHVybgogICAgY3dvcmRzID0gb3MuZW52aXJvblsnQ09NUF9XT1JEUyddLnNwbGl0KClbMTpdCiAgICBjd29yZCA9IGludChvcy5lbnZpcm9uWydDT01QX0NXT1JEJ10pCiAgICB0cnk6CiAgICAgICAgY3VycmVudCA9IGN3b3Jkc1tjd29yZCAtIDFdCiAgICBleGNlcHQgSW5kZXhFcnJvcjoKICAgICAgICBjdXJyZW50ID0gJycKCiAgICBzdWJjb21tYW5kcyA9IFtjbWQgZm9yIGNtZCwgc3VtbWFyeSBpbiBnZXRfc3VtbWFyaWVzKCldCiAgICBvcHRpb25zID0gW10KICAgICMgc3ViY29tbWFuZAogICAgdHJ5OgogICAgICAgIHN1YmNvbW1hbmRfbmFtZSA9IFt3IGZvciB3IGluIGN3b3JkcyBpZiB3IGluIHN1YmNvbW1hbmRzXVswXQogICAgZXhjZXB0IEluZGV4RXJyb3I6CiAgICAgICAgc3ViY29tbWFuZF9uYW1lID0gTm9uZQoKICAgIHBhcnNlciA9IGNyZWF0ZV9tYWluX3BhcnNlcigpCiAgICAjIHN1YmNvbW1hbmQgb3B0aW9ucwogICAgaWYgc3ViY29tbWFuZF9uYW1lOgogICAgICAgICMgc3BlY2lhbCBjYXNlOiAnaGVscCcgc3ViY29tbWFuZCBoYXMgbm8gb3B0aW9ucwogICAgICAgIGlmIHN1YmNvbW1hbmRfbmFtZSA9PSAnaGVscCc6CiAgICAgICAgICAgIHN5cy5leGl0KDEpCiAgICAgICAgIyBzcGVjaWFsIGNhc2U6IGxpc3QgbG9jYWxseSBpbnN0YWxsZWQgZGlzdHMgZm9yIHVuaW5zdGFsbCBjb21tYW5kCiAgICAgICAgaWYgc3ViY29tbWFuZF9uYW1lID09ICd1bmluc3RhbGwnIGFuZCBub3QgY3VycmVudC5zdGFydHN3aXRoKCctJyk6CiAgICAgICAgICAgIGluc3RhbGxlZCA9IFtdCiAgICAgICAgICAgIGxjID0gY3VycmVudC5sb3dlcigpCiAgICAgICAgICAgIGZvciBkaXN0IGluIGdldF9pbnN0YWxsZWRfZGlzdHJpYnV0aW9ucyhsb2NhbF9vbmx5PVRydWUpOgogICAgICAgICAgICAgICAgaWYgZGlzdC5rZXkuc3RhcnRzd2l0aChsYykgYW5kIGRpc3Qua2V5IG5vdCBpbiBjd29yZHNbMTpdOgogICAgICAgICAgICAgICAgICAgIGluc3RhbGxlZC5hcHBlbmQoZGlzdC5rZXkpCiAgICAgICAgICAgICMgaWYgdGhlcmUgYXJlIG5vIGRpc3RzIGluc3RhbGxlZCwgZmFsbCBiYWNrIHRvIG9wdGlvbiBjb21wbGV0aW9uCiAgICAgICAgICAgIGlmIGluc3RhbGxlZDoKICAgICAgICAgICAgICAgIGZvciBkaXN0IGluIGluc3RhbGxlZDoKICAgICAgICAgICAgICAgICAgICBwcmludChkaXN0KQogICAgICAgICAgICAgICAgc3lzLmV4aXQoMSkKCiAgICAgICAgc3ViY29tbWFuZCA9IGNvbW1hbmRzX2RpY3Rbc3ViY29tbWFuZF9uYW1lXSgpCiAgICAgICAgb3B0aW9ucyArPSBbKG9wdC5nZXRfb3B0X3N0cmluZygpLCBvcHQubmFyZ3MpCiAgICAgICAgICAgICAgICAgICAgZm9yIG9wdCBpbiBzdWJjb21tYW5kLnBhcnNlci5vcHRpb25fbGlzdF9hbGwKICAgICAgICAgICAgICAgICAgICBpZiBvcHQuaGVscCAhPSBvcHRwYXJzZS5TVVBQUkVTU19IRUxQXQoKICAgICAgICAjIGZpbHRlciBvdXQgcHJldmlvdXNseSBzcGVjaWZpZWQgb3B0aW9ucyBmcm9tIGF2YWlsYWJsZSBvcHRpb25zCiAgICAgICAgcHJldl9vcHRzID0gW3guc3BsaXQoJz0nKVswXSBmb3IgeCBpbiBjd29yZHNbMTpjd29yZCAtIDFdXQogICAgICAgIG9wdGlvbnMgPSBbKHgsIHYpIGZvciAoeCwgdikgaW4gb3B0aW9ucyBpZiB4IG5vdCBpbiBwcmV2X29wdHNdCiAgICAgICAgIyBmaWx0ZXIgb3B0aW9ucyBieSBjdXJyZW50IGlucHV0CiAgICAgICAgb3B0aW9ucyA9IFsoaywgdikgZm9yIGssIHYgaW4gb3B0aW9ucyBpZiBrLnN0YXJ0c3dpdGgoY3VycmVudCldCiAgICAgICAgZm9yIG9wdGlvbiBpbiBvcHRpb25zOgogICAgICAgICAgICBvcHRfbGFiZWwgPSBvcHRpb25bMF0KICAgICAgICAgICAgIyBhcHBlbmQgJz0nIHRvIG9wdGlvbnMgd2hpY2ggcmVxdWlyZSBhcmdzCiAgICAgICAgICAgIGlmIG9wdGlvblsxXToKICAgICAgICAgICAgICAgIG9wdF9sYWJlbCArPSAnPScKICAgICAgICAgICAgcHJpbnQob3B0X2xhYmVsKQogICAgZWxzZToKICAgICAgICAjIHNob3cgbWFpbiBwYXJzZXIgb3B0aW9ucyBvbmx5IHdoZW4gbmVjZXNzYXJ5CiAgICAgICAgaWYgY3VycmVudC5zdGFydHN3aXRoKCctJykgb3IgY3VycmVudC5zdGFydHN3aXRoKCctLScpOgogICAgICAgICAgICBvcHRzID0gW2kub3B0aW9uX2xpc3QgZm9yIGkgaW4gcGFyc2VyLm9wdGlvbl9ncm91cHNdCiAgICAgICAgICAgIG9wdHMuYXBwZW5kKHBhcnNlci5vcHRpb25fbGlzdCkKICAgICAgICAgICAgb3B0cyA9IChvIGZvciBpdCBpbiBvcHRzIGZvciBvIGluIGl0KQoKICAgICAgICAgICAgc3ViY29tbWFuZHMgKz0gW2kuZ2V0X29wdF9zdHJpbmcoKSBmb3IgaSBpbiBvcHRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBpLmhlbHAgIT0gb3B0cGFyc2UuU1VQUFJFU1NfSEVMUF0KCiAgICAgICAgcHJpbnQoJyAnLmpvaW4oW3ggZm9yIHggaW4gc3ViY29tbWFuZHMgaWYgeC5zdGFydHN3aXRoKGN1cnJlbnQpXSkpCiAgICBzeXMuZXhpdCgxKQoKCmRlZiBjcmVhdGVfbWFpbl9wYXJzZXIoKToKICAgIHBhcnNlcl9rdyA9IHsKICAgICAgICAndXNhZ2UnOiAnXG4lcHJvZyA8Y29tbWFuZD4gW29wdGlvbnNdJywKICAgICAgICAnYWRkX2hlbHBfb3B0aW9uJzogRmFsc2UsCiAgICAgICAgJ2Zvcm1hdHRlcic6IFVwZGF0aW5nRGVmYXVsdHNIZWxwRm9ybWF0dGVyKCksCiAgICAgICAgJ25hbWUnOiAnZ2xvYmFsJywKICAgICAgICAncHJvZyc6IGdldF9wcm9nKCksCiAgICB9CgogICAgcGFyc2VyID0gQ29uZmlnT3B0aW9uUGFyc2VyKCoqcGFyc2VyX2t3KQogICAgcGFyc2VyLmRpc2FibGVfaW50ZXJzcGVyc2VkX2FyZ3MoKQoKICAgIHBpcF9wa2dfZGlyID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmFic3BhdGgoX19maWxlX18pKSkKICAgIHBhcnNlci52ZXJzaW9uID0gJ3BpcCAlcyBmcm9tICVzIChweXRob24gJXMpJyAlICgKICAgICAgICBfX3ZlcnNpb25fXywgcGlwX3BrZ19kaXIsIHN5cy52ZXJzaW9uWzozXSkKCiAgICAjIGFkZCB0aGUgZ2VuZXJhbCBvcHRpb25zCiAgICBnZW5fb3B0cyA9IGNtZG9wdGlvbnMubWFrZV9vcHRpb25fZ3JvdXAoY21kb3B0aW9ucy5nZW5lcmFsX2dyb3VwLCBwYXJzZXIpCiAgICBwYXJzZXIuYWRkX29wdGlvbl9ncm91cChnZW5fb3B0cykKCiAgICBwYXJzZXIubWFpbiA9IFRydWUgICMgc28gdGhlIGhlbHAgZm9ybWF0dGVyIGtub3dzCgogICAgIyBjcmVhdGUgY29tbWFuZCBsaXN0aW5nIGZvciBkZXNjcmlwdGlvbgogICAgY29tbWFuZF9zdW1tYXJpZXMgPSBnZXRfc3VtbWFyaWVzKCkKICAgIGRlc2NyaXB0aW9uID0gWycnXSArIFsnJS0yN3MgJXMnICUgKGksIGopIGZvciBpLCBqIGluIGNvbW1hbmRfc3VtbWFyaWVzXQogICAgcGFyc2VyLmRlc2NyaXB0aW9uID0gJ1xuJy5qb2luKGRlc2NyaXB0aW9uKQoKICAgIHJldHVybiBwYXJzZXIKCgpkZWYgcGFyc2VvcHRzKGFyZ3MpOgogICAgcGFyc2VyID0gY3JlYXRlX21haW5fcGFyc2VyKCkKCiAgICAjIE5vdGU6IHBhcnNlciBjYWxscyBkaXNhYmxlX2ludGVyc3BlcnNlZF9hcmdzKCksIHNvIHRoZSByZXN1bHQgb2YgdGhpcwogICAgIyBjYWxsIGlzIHRvIHNwbGl0IHRoZSBpbml0aWFsIGFyZ3MgaW50byB0aGUgZ2VuZXJhbCBvcHRpb25zIGJlZm9yZSB0aGUKICAgICMgc3ViY29tbWFuZCBhbmQgZXZlcnl0aGluZyBlbHNlLgogICAgIyBGb3IgZXhhbXBsZToKICAgICMgIGFyZ3M6IFsnLS10aW1lb3V0PTUnLCAnaW5zdGFsbCcsICctLXVzZXInLCAnSU5JVG9vbHMnXQogICAgIyAgZ2VuZXJhbF9vcHRpb25zOiBbJy0tdGltZW91dD09NSddCiAgICAjICBhcmdzX2Vsc2U6IFsnaW5zdGFsbCcsICctLXVzZXInLCAnSU5JVG9vbHMnXQogICAgZ2VuZXJhbF9vcHRpb25zLCBhcmdzX2Vsc2UgPSBwYXJzZXIucGFyc2VfYXJncyhhcmdzKQoKICAgICMgLS12ZXJzaW9uCiAgICBpZiBnZW5lcmFsX29wdGlvbnMudmVyc2lvbjoKICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKHBhcnNlci52ZXJzaW9uKQogICAgICAgIHN5cy5zdGRvdXQud3JpdGUob3MubGluZXNlcCkKICAgICAgICBzeXMuZXhpdCgpCgogICAgIyBwaXAgfHwgcGlwIGhlbHAgLT4gcHJpbnRfaGVscCgpCiAgICBpZiBub3QgYXJnc19lbHNlIG9yIChhcmdzX2Vsc2VbMF0gPT0gJ2hlbHAnIGFuZCBsZW4oYXJnc19lbHNlKSA9PSAxKToKICAgICAgICBwYXJzZXIucHJpbnRfaGVscCgpCiAgICAgICAgc3lzLmV4aXQoKQoKICAgICMgdGhlIHN1YmNvbW1hbmQgbmFtZQogICAgY21kX25hbWUgPSBhcmdzX2Vsc2VbMF0KCiAgICBpZiBjbWRfbmFtZSBub3QgaW4gY29tbWFuZHNfZGljdDoKICAgICAgICBndWVzcyA9IGdldF9zaW1pbGFyX2NvbW1hbmRzKGNtZF9uYW1lKQoKICAgICAgICBtc2cgPSBbJ3Vua25vd24gY29tbWFuZCAiJXMiJyAlIGNtZF9uYW1lXQogICAgICAgIGlmIGd1ZXNzOgogICAgICAgICAgICBtc2cuYXBwZW5kKCdtYXliZSB5b3UgbWVhbnQgIiVzIicgJSBndWVzcykKCiAgICAgICAgcmFpc2UgQ29tbWFuZEVycm9yKCcgLSAnLmpvaW4obXNnKSkKCiAgICAjIGFsbCB0aGUgYXJncyB3aXRob3V0IHRoZSBzdWJjb21tYW5kCiAgICBjbWRfYXJncyA9IGFyZ3NbOl0KICAgIGNtZF9hcmdzLnJlbW92ZShjbWRfbmFtZSkKCiAgICByZXR1cm4gY21kX25hbWUsIGNtZF9hcmdzCgoKZGVmIGNoZWNrX2lzb2xhdGVkKGFyZ3MpOgogICAgaXNvbGF0ZWQgPSBGYWxzZQoKICAgIGlmICItLWlzb2xhdGVkIiBpbiBhcmdzOgogICAgICAgIGlzb2xhdGVkID0gVHJ1ZQoKICAgIHJldHVybiBpc29sYXRlZAoKCmRlZiBtYWluKGFyZ3M9Tm9uZSk6CiAgICBpZiBhcmdzIGlzIE5vbmU6CiAgICAgICAgYXJncyA9IHN5cy5hcmd2WzE6XQoKICAgICMgQ29uZmlndXJlIG91ciBkZXByZWNhdGlvbiB3YXJuaW5ncyB0byBiZSBzZW50IHRocm91Z2ggbG9nZ2VycwogICAgZGVwcmVjYXRpb24uaW5zdGFsbF93YXJuaW5nX2xvZ2dlcigpCgogICAgYXV0b2NvbXBsZXRlKCkKCiAgICB0cnk6CiAgICAgICAgY21kX25hbWUsIGNtZF9hcmdzID0gcGFyc2VvcHRzKGFyZ3MpCiAgICBleGNlcHQgUGlwRXJyb3IgYXMgZXhjOgogICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIkVSUk9SOiAlcyIgJSBleGMpCiAgICAgICAgc3lzLnN0ZGVyci53cml0ZShvcy5saW5lc2VwKQogICAgICAgIHN5cy5leGl0KDEpCgogICAgIyBOZWVkZWQgZm9yIGxvY2FsZS5nZXRwcmVmZXJyZWRlbmNvZGluZyhGYWxzZSkgdG8gd29yawogICAgIyBpbiBwaXAudXRpbHMuZW5jb2RpbmcuYXV0b19kZWNvZGUKICAgIHRyeToKICAgICAgICBsb2NhbGUuc2V0bG9jYWxlKGxvY2FsZS5MQ19BTEwsICcnKQogICAgZXhjZXB0IGxvY2FsZS5FcnJvciBhcyBlOgogICAgICAgICMgc2V0bG9jYWxlIGNhbiBhcHBhcmVudGx5IGNyYXNoIGlmIGxvY2FsZSBhcmUgdW5pbml0aWFsaXplZAogICAgICAgIGxvZ2dlci5kZWJ1ZygiSWdub3JpbmcgZXJyb3IgJXMgd2hlbiBzZXR0aW5nIGxvY2FsZSIsIGUpCiAgICBjb21tYW5kID0gY29tbWFuZHNfZGljdFtjbWRfbmFtZV0oaXNvbGF0ZWQ9Y2hlY2tfaXNvbGF0ZWQoY21kX2FyZ3MpKQogICAgcmV0dXJuIGNvbW1hbmQubWFpbihjbWRfYXJncykKCgojICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgIyBXcml0aW5nIGZyZWV6ZSBmaWxlcwoKY2xhc3MgRnJvemVuUmVxdWlyZW1lbnQob2JqZWN0KToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgcmVxLCBlZGl0YWJsZSwgY29tbWVudHM9KCkpOgogICAgICAgIHNlbGYubmFtZSA9IG5hbWUKICAgICAgICBzZWxmLnJlcSA9IHJlcQogICAgICAgIHNlbGYuZWRpdGFibGUgPSBlZGl0YWJsZQogICAgICAgIHNlbGYuY29tbWVudHMgPSBjb21tZW50cwoKICAgIF9yZXZfcmUgPSByZS5jb21waWxlKHInLXIoXGQrKSQnKQogICAgX2RhdGVfcmUgPSByZS5jb21waWxlKHInLSgyMFxkXGRcZFxkXGRcZCkkJykKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBmcm9tX2Rpc3QoY2xzLCBkaXN0LCBkZXBlbmRlbmN5X2xpbmtzKToKICAgICAgICBsb2NhdGlvbiA9IG9zLnBhdGgubm9ybWNhc2Uob3MucGF0aC5hYnNwYXRoKGRpc3QubG9jYXRpb24pKQogICAgICAgIGNvbW1lbnRzID0gW10KICAgICAgICBmcm9tIHBpcC52Y3MgaW1wb3J0IHZjcywgZ2V0X3NyY19yZXF1aXJlbWVudAogICAgICAgIGlmIGRpc3RfaXNfZWRpdGFibGUoZGlzdCkgYW5kIHZjcy5nZXRfYmFja2VuZF9uYW1lKGxvY2F0aW9uKToKICAgICAgICAgICAgZWRpdGFibGUgPSBUcnVlCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHJlcSA9IGdldF9zcmNfcmVxdWlyZW1lbnQoZGlzdCwgbG9jYXRpb24pCiAgICAgICAgICAgIGV4Y2VwdCBJbnN0YWxsYXRpb25FcnJvciBhcyBleGM6CiAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICAgICAiRXJyb3Igd2hlbiB0cnlpbmcgdG8gZ2V0IHJlcXVpcmVtZW50IGZvciBWQ1Mgc3lzdGVtICVzLCAiCiAgICAgICAgICAgICAgICAgICAgImZhbGxpbmcgYmFjayB0byB1bmVkaXRhYmxlIGZvcm1hdCIsIGV4YwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgcmVxID0gTm9uZQogICAgICAgICAgICBpZiByZXEgaXMgTm9uZToKICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgICAgICdDb3VsZCBub3QgZGV0ZXJtaW5lIHJlcG9zaXRvcnkgbG9jYXRpb24gb2YgJXMnLCBsb2NhdGlvbgogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgY29tbWVudHMuYXBwZW5kKAogICAgICAgICAgICAgICAgICAgICcjIyAhISBDb3VsZCBub3QgZGV0ZXJtaW5lIHJlcG9zaXRvcnkgbG9jYXRpb24nCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICByZXEgPSBkaXN0LmFzX3JlcXVpcmVtZW50KCkKICAgICAgICAgICAgICAgIGVkaXRhYmxlID0gRmFsc2UKICAgICAgICBlbHNlOgogICAgICAgICAgICBlZGl0YWJsZSA9IEZhbHNlCiAgICAgICAgICAgIHJlcSA9IGRpc3QuYXNfcmVxdWlyZW1lbnQoKQogICAgICAgICAgICBzcGVjcyA9IHJlcS5zcGVjcwogICAgICAgICAgICBhc3NlcnQgbGVuKHNwZWNzKSA9PSAxIGFuZCBzcGVjc1swXVswXSBpbiBbIj09IiwgIj09PSJdLCBcCiAgICAgICAgICAgICAgICAnRXhwZWN0ZWQgMSBzcGVjIHdpdGggPT0gb3IgPT09OyBzcGVjcyA9ICVyOyBkaXN0ID0gJXInICUgXAogICAgICAgICAgICAgICAgKHNwZWNzLCBkaXN0KQogICAgICAgICAgICB2ZXJzaW9uID0gc3BlY3NbMF1bMV0KICAgICAgICAgICAgdmVyX21hdGNoID0gY2xzLl9yZXZfcmUuc2VhcmNoKHZlcnNpb24pCiAgICAgICAgICAgIGRhdGVfbWF0Y2ggPSBjbHMuX2RhdGVfcmUuc2VhcmNoKHZlcnNpb24pCiAgICAgICAgICAgIGlmIHZlcl9tYXRjaCBvciBkYXRlX21hdGNoOgogICAgICAgICAgICAgICAgc3ZuX2JhY2tlbmQgPSB2Y3MuZ2V0X2JhY2tlbmQoJ3N2bicpCiAgICAgICAgICAgICAgICBpZiBzdm5fYmFja2VuZDoKICAgICAgICAgICAgICAgICAgICBzdm5fbG9jYXRpb24gPSBzdm5fYmFja2VuZCgpLmdldF9sb2NhdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgZGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jeV9saW5rcywKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBpZiBub3Qgc3ZuX2xvY2F0aW9uOgogICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgICAgICAgICAnV2FybmluZzogY2Fubm90IGZpbmQgc3ZuIGxvY2F0aW9uIGZvciAlcycsIHJlcSkKICAgICAgICAgICAgICAgICAgICBjb21tZW50cy5hcHBlbmQoCiAgICAgICAgICAgICAgICAgICAgICAgICcjIyBGSVhNRTogY291bGQgbm90IGZpbmQgc3ZuIFVSTCBpbiBkZXBlbmRlbmN5X2xpbmtzICcKICAgICAgICAgICAgICAgICAgICAgICAgJ2ZvciB0aGlzIHBhY2thZ2U6JwogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgY29tbWVudHMuYXBwZW5kKAogICAgICAgICAgICAgICAgICAgICAgICAnIyBJbnN0YWxsaW5nIGFzIGVkaXRhYmxlIHRvIHNhdGlzZnkgcmVxdWlyZW1lbnQgJXM6JyAlCiAgICAgICAgICAgICAgICAgICAgICAgIHJlcQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICBpZiB2ZXJfbWF0Y2g6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldiA9IHZlcl9tYXRjaC5ncm91cCgxKQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldiA9ICd7JXN9JyAlIGRhdGVfbWF0Y2guZ3JvdXAoMSkKICAgICAgICAgICAgICAgICAgICBlZGl0YWJsZSA9IFRydWUKICAgICAgICAgICAgICAgICAgICByZXEgPSAnJXNAJXMjZWdnPSVzJyAlICgKICAgICAgICAgICAgICAgICAgICAgICAgc3ZuX2xvY2F0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICByZXYsCiAgICAgICAgICAgICAgICAgICAgICAgIGNscy5lZ2dfbmFtZShkaXN0KQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICByZXR1cm4gY2xzKGRpc3QucHJvamVjdF9uYW1lLCByZXEsIGVkaXRhYmxlLCBjb21tZW50cykKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgZWdnX25hbWUoZGlzdCk6CiAgICAgICAgbmFtZSA9IGRpc3QuZWdnX25hbWUoKQogICAgICAgIG1hdGNoID0gcmUuc2VhcmNoKHInLXB5XGRcLlxkJCcsIG5hbWUpCiAgICAgICAgaWYgbWF0Y2g6CiAgICAgICAgICAgIG5hbWUgPSBuYW1lWzptYXRjaC5zdGFydCgpXQogICAgICAgIHJldHVybiBuYW1lCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmVxID0gc2VsZi5yZXEKICAgICAgICBpZiBzZWxmLmVkaXRhYmxlOgogICAgICAgICAgICByZXEgPSAnLWUgJXMnICUgcmVxCiAgICAgICAgcmV0dXJuICdcbicuam9pbihsaXN0KHNlbGYuY29tbWVudHMpICsgW3N0cihyZXEpXSkgKyAnXG4nCgoKaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgIHN5cy5leGl0KG1haW4oKSkKUEsDBBQAAAAAAAAAIQBLSaRlSAIAAEgCAAAsAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX19tYWluX18ucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IG9zCmltcG9ydCBzeXMKCiMgSWYgd2UgYXJlIHJ1bm5pbmcgZnJvbSBhIHdoZWVsLCBhZGQgdGhlIHdoZWVsIHRvIHN5cy5wYXRoCiMgVGhpcyBhbGxvd3MgdGhlIHVzYWdlIHB5dGhvbiBwaXAtKi53aGwvcGlwIGluc3RhbGwgcGlwLSoud2hsCmlmIF9fcGFja2FnZV9fID09ICcnOgogICAgIyBfX2ZpbGVfXyBpcyBwaXAtKi53aGwvcGlwL19fbWFpbl9fLnB5CiAgICAjIGZpcnN0IGRpcm5hbWUgY2FsbCBzdHJpcHMgb2YgJy9fX21haW5fXy5weScsIHNlY29uZCBzdHJpcHMgb2ZmICcvcGlwJwogICAgIyBSZXN1bHRpbmcgcGF0aCBpcyB0aGUgbmFtZSBvZiB0aGUgd2hlZWwgaXRzZWxmCiAgICAjIEFkZCB0aGF0IHRvIHN5cy5wYXRoIHNvIHdlIGNhbiBpbXBvcnQgcGlwCiAgICBwYXRoID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpCiAgICBzeXMucGF0aC5pbnNlcnQoMCwgcGF0aCkKCmltcG9ydCBwaXAgICMgbm9xYQoKaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgIHN5cy5leGl0KHBpcC5tYWluKCkpClBLAwQUAAAAAAAAACEAT73MSD4SAAA+EgAANAAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvX19pbml0X18ucHkiIiIKcGlwLl92ZW5kb3IgaXMgZm9yIHZlbmRvcmluZyBkZXBlbmRlbmNpZXMgb2YgcGlwIHRvIHByZXZlbnQgbmVlZGluZyBwaXAgdG8KZGVwZW5kIG9uIHNvbWV0aGluZyBleHRlcm5hbC4KCkZpbGVzIGluc2lkZSBvZiBwaXAuX3ZlbmRvciBzaG91bGQgYmUgY29uc2lkZXJlZCBpbW11dGFibGUgYW5kIHNob3VsZCBvbmx5IGJlCnVwZGF0ZWQgdG8gdmVyc2lvbnMgZnJvbSB1cHN0cmVhbS4KIiIiCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgZ2xvYgppbXBvcnQgb3MucGF0aAppbXBvcnQgc3lzCgojIERvd25zdHJlYW0gcmVkaXN0cmlidXRvcnMgd2hpY2ggaGF2ZSBkZWJ1bmRsZWQgb3VyIGRlcGVuZGVuY2llcyBzaG91bGQgYWxzbwojIHBhdGNoIHRoaXMgdmFsdWUgdG8gYmUgdHJ1ZS4gVGhpcyB3aWxsIHRyaWdnZXIgdGhlIGFkZGl0aW9uYWwgcGF0Y2hpbmcKIyB0byBjYXVzZSB0aGluZ3MgbGlrZSAic2l4IiB0byBiZSBhdmFpbGFibGUgYXMgcGlwLgpERUJVTkRMRUQgPSBGYWxzZQoKIyBCeSBkZWZhdWx0LCBsb29rIGluIHRoaXMgZGlyZWN0b3J5IGZvciBhIGJ1bmNoIG9mIC53aGwgZmlsZXMgd2hpY2ggd2Ugd2lsbAojIGFkZCB0byB0aGUgYmVnaW5uaW5nIG9mIHN5cy5wYXRoIGJlZm9yZSBhdHRlbXB0aW5nIHRvIGltcG9ydCBhbnl0aGluZy4gVGhpcwojIGlzIGRvbmUgdG8gc3VwcG9ydCBkb3duc3RyZWFtIHJlLWRpc3RyaWJ1dG9ycyBsaWtlIERlYmlhbiBhbmQgRmVkb3JhIHdobwojIHdpc2ggdG8gY3JlYXRlIHRoZWlyIG93biBXaGVlbHMgZm9yIG91ciBkZXBlbmRlbmNpZXMgdG8gYWlkIGluIGRlYnVuZGxpbmcuCldIRUVMX0RJUiA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pKQoKCiMgRGVmaW5lIGEgc21hbGwgaGVscGVyIGZ1bmN0aW9uIHRvIGFsaWFzIG91ciB2ZW5kb3JlZCBtb2R1bGVzIHRvIHRoZSByZWFsIG9uZXMKIyBpZiB0aGUgdmVuZG9yZWQgb25lcyBkbyBub3QgZXhpc3QuIFRoaXMgaWRlYSBvZiB0aGlzIHdhcyB0YWtlbiBmcm9tCiMgaHR0cHM6Ly9naXRodWIuY29tL2tlbm5ldGhyZWl0ei9yZXF1ZXN0cy9wdWxsLzI1NjcuCmRlZiB2ZW5kb3JlZChtb2R1bGVuYW1lKToKICAgIHZlbmRvcmVkX25hbWUgPSAiezB9LnsxfSIuZm9ybWF0KF9fbmFtZV9fLCBtb2R1bGVuYW1lKQoKICAgIHRyeToKICAgICAgICBfX2ltcG9ydF9fKHZlbmRvcmVkX25hbWUsIGdsb2JhbHMoKSwgbG9jYWxzKCksIGxldmVsPTApCiAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBfX2ltcG9ydF9fKG1vZHVsZW5hbWUsIGdsb2JhbHMoKSwgbG9jYWxzKCksIGxldmVsPTApCiAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgICAgICAjIFdlIGNhbiBqdXN0IHNpbGVudGx5IGFsbG93IGltcG9ydCBmYWlsdXJlcyB0byBwYXNzIGhlcmUuIElmIHdlCiAgICAgICAgICAgICMgZ290IHRvIHRoaXMgcG9pbnQgaXQgbWVhbnMgdGhhdCBgYGltcG9ydCBwaXAuX3ZlbmRvci53aGF0ZXZlcmBgCiAgICAgICAgICAgICMgZmFpbGVkIGFuZCBzbyBkaWQgYGBpbXBvcnQgd2hhdGV2ZXJgYC4gU2luY2Ugd2UncmUgaW1wb3J0aW5nIHRoaXMKICAgICAgICAgICAgIyB1cGZyb250IGluIGFuIGF0dGVtcHQgdG8gYWxpYXMgaW1wb3J0cywgbm90IGVycm9yaW5nIGhlcmUgd2lsbAogICAgICAgICAgICAjIGp1c3QgbWVhbiB3ZSBnZXQgYSByZWd1bGFyIGltcG9ydCBlcnJvciB3aGVuZXZlciBwaXAgKmFjdHVhbGx5KgogICAgICAgICAgICAjIHRyaWVzIHRvIGltcG9ydCBvbmUgb2YgdGhlc2UgbW9kdWxlcyB0byB1c2UgaXQsIHdoaWNoIGFjdHVhbGx5CiAgICAgICAgICAgICMgZ2l2ZXMgdXMgYSBiZXR0ZXIgZXJyb3IgbWVzc2FnZSB0aGFuIHdlIHdvdWxkIGhhdmUgb3RoZXJ3aXNlCiAgICAgICAgICAgICMgZ290dGVuLgogICAgICAgICAgICBwYXNzCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc3lzLm1vZHVsZXNbdmVuZG9yZWRfbmFtZV0gPSBzeXMubW9kdWxlc1ttb2R1bGVuYW1lXQogICAgICAgICAgICBiYXNlLCBoZWFkID0gdmVuZG9yZWRfbmFtZS5yc3BsaXQoIi4iLCAxKQogICAgICAgICAgICBzZXRhdHRyKHN5cy5tb2R1bGVzW2Jhc2VdLCBoZWFkLCBzeXMubW9kdWxlc1ttb2R1bGVuYW1lXSkKCgojIElmIHdlJ3JlIG9wZXJhdGluZyBpbiBhIGRlYnVuZGxlZCBzZXR1cCwgdGhlbiB3ZSB3YW50IHRvIGdvIGFoZWFkIGFuZCB0cmlnZ2VyCiMgdGhlIGFsaWFzaW5nIG9mIG91ciB2ZW5kb3JlZCBsaWJyYXJpZXMgYXMgd2VsbCBhcyBsb29raW5nIGZvciB3aGVlbHMgdG8gYWRkCiMgdG8gb3VyIHN5cy5wYXRoLiBUaGlzIHdpbGwgY2F1c2UgYWxsIG9mIHRoaXMgY29kZSB0byBiZSBhIG5vLW9wIHR5cGljYWxseQojIGhvd2V2ZXIgZG93bnN0cmVhbSByZWRpc3RyaWJ1dG9ycyBjYW4gZW5hYmxlIGl0IGluIGEgY29uc2lzdGVudCB3YXkgYWNyb3NzCiMgYWxsIHBsYXRmb3Jtcy4KaWYgREVCVU5ETEVEOgogICAgIyBBY3R1YWxseSBsb29rIGluc2lkZSBvZiBXSEVFTF9ESVIgdG8gZmluZCAud2hsIGZpbGVzIGFuZCBhZGQgdGhlbSB0byB0aGUKICAgICMgZnJvbnQgb2Ygb3VyIHN5cy5wYXRoLgogICAgc3lzLnBhdGhbOl0gPSBnbG9iLmdsb2Iob3MucGF0aC5qb2luKFdIRUVMX0RJUiwgIioud2hsIikpICsgc3lzLnBhdGgKCiAgICAjIEFjdHVhbGx5IGFsaWFzIGFsbCBvZiBvdXIgdmVuZG9yZWQgZGVwZW5kZW5jaWVzLgogICAgdmVuZG9yZWQoImNhY2hlY29udHJvbCIpCiAgICB2ZW5kb3JlZCgiY29sb3JhbWEiKQogICAgdmVuZG9yZWQoImRpc3RsaWIiKQogICAgdmVuZG9yZWQoImRpc3RybyIpCiAgICB2ZW5kb3JlZCgiaHRtbDVsaWIiKQogICAgdmVuZG9yZWQoImxvY2tmaWxlIikKICAgIHZlbmRvcmVkKCJzaXgiKQogICAgdmVuZG9yZWQoInNpeC5tb3ZlcyIpCiAgICB2ZW5kb3JlZCgic2l4Lm1vdmVzLnVybGxpYiIpCiAgICB2ZW5kb3JlZCgicGFja2FnaW5nIikKICAgIHZlbmRvcmVkKCJwYWNrYWdpbmcudmVyc2lvbiIpCiAgICB2ZW5kb3JlZCgicGFja2FnaW5nLnNwZWNpZmllcnMiKQogICAgdmVuZG9yZWQoInBrZ19yZXNvdXJjZXMiKQogICAgdmVuZG9yZWQoInByb2dyZXNzIikKICAgIHZlbmRvcmVkKCJyZXRyeWluZyIpCiAgICB2ZW5kb3JlZCgicmVxdWVzdHMiKQogICAgdmVuZG9yZWQoInJlcXVlc3RzLnBhY2thZ2VzIikKICAgIHZlbmRvcmVkKCJyZXF1ZXN0cy5wYWNrYWdlcy51cmxsaWIzIikKICAgIHZlbmRvcmVkKCJyZXF1ZXN0cy5wYWNrYWdlcy51cmxsaWIzLl9jb2xsZWN0aW9ucyIpCiAgICB2ZW5kb3JlZCgicmVxdWVzdHMucGFja2FnZXMudXJsbGliMy5jb25uZWN0aW9uIikKICAgIHZlbmRvcmVkKCJyZXF1ZXN0cy5wYWNrYWdlcy51cmxsaWIzLmNvbm5lY3Rpb25wb29sIikKICAgIHZlbmRvcmVkKCJyZXF1ZXN0cy5wYWNrYWdlcy51cmxsaWIzLmNvbnRyaWIiKQogICAgdmVuZG9yZWQoInJlcXVlc3RzLnBhY2thZ2VzLnVybGxpYjMuY29udHJpYi5udGxtcG9vbCIpCiAgICB2ZW5kb3JlZCgicmVxdWVzdHMucGFja2FnZXMudXJsbGliMy5jb250cmliLnB5b3BlbnNzbCIpCiAgICB2ZW5kb3JlZCgicmVxdWVzdHMucGFja2FnZXMudXJsbGliMy5leGNlcHRpb25zIikKICAgIHZlbmRvcmVkKCJyZXF1ZXN0cy5wYWNrYWdlcy51cmxsaWIzLmZpZWxkcyIpCiAgICB2ZW5kb3JlZCgicmVxdWVzdHMucGFja2FnZXMudXJsbGliMy5maWxlcG9zdCIpCiAgICB2ZW5kb3JlZCgicmVxdWVzdHMucGFja2FnZXMudXJsbGliMy5wYWNrYWdlcyIpCiAgICB2ZW5kb3JlZCgicmVxdWVzdHMucGFja2FnZXMudXJsbGliMy5wYWNrYWdlcy5vcmRlcmVkX2RpY3QiKQogICAgdmVuZG9yZWQoInJlcXVlc3RzLnBhY2thZ2VzLnVybGxpYjMucGFja2FnZXMuc2l4IikKICAgIHZlbmRvcmVkKCJyZXF1ZXN0cy5wYWNrYWdlcy51cmxsaWIzLnBhY2thZ2VzLnNzbF9tYXRjaF9ob3N0bmFtZSIpCiAgICB2ZW5kb3JlZCgicmVxdWVzdHMucGFja2FnZXMudXJsbGliMy5wYWNrYWdlcy5zc2xfbWF0Y2hfaG9zdG5hbWUuIgogICAgICAgICAgICAgIl9pbXBsZW1lbnRhdGlvbiIpCiAgICB2ZW5kb3JlZCgicmVxdWVzdHMucGFja2FnZXMudXJsbGliMy5wb29sbWFuYWdlciIpCiAgICB2ZW5kb3JlZCgicmVxdWVzdHMucGFja2FnZXMudXJsbGliMy5yZXF1ZXN0IikKICAgIHZlbmRvcmVkKCJyZXF1ZXN0cy5wYWNrYWdlcy51cmxsaWIzLnJlc3BvbnNlIikKICAgIHZlbmRvcmVkKCJyZXF1ZXN0cy5wYWNrYWdlcy51cmxsaWIzLnV0aWwiKQogICAgdmVuZG9yZWQoInJlcXVlc3RzLnBhY2thZ2VzLnVybGxpYjMudXRpbC5jb25uZWN0aW9uIikKICAgIHZlbmRvcmVkKCJyZXF1ZXN0cy5wYWNrYWdlcy51cmxsaWIzLnV0aWwucmVxdWVzdCIpCiAgICB2ZW5kb3JlZCgicmVxdWVzdHMucGFja2FnZXMudXJsbGliMy51dGlsLnJlc3BvbnNlIikKICAgIHZlbmRvcmVkKCJyZXF1ZXN0cy5wYWNrYWdlcy51cmxsaWIzLnV0aWwucmV0cnkiKQogICAgdmVuZG9yZWQoInJlcXVlc3RzLnBhY2thZ2VzLnVybGxpYjMudXRpbC5zc2xfIikKICAgIHZlbmRvcmVkKCJyZXF1ZXN0cy5wYWNrYWdlcy51cmxsaWIzLnV0aWwudGltZW91dCIpCiAgICB2ZW5kb3JlZCgicmVxdWVzdHMucGFja2FnZXMudXJsbGliMy51dGlsLnVybCIpClBLAwQUAAAAAAAAACEAhYmWimBXAABgVwAAMwAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvYXBwZGlycy5weSMhL3Vzci9iaW4vZW52IHB5dGhvbgojIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQojIENvcHlyaWdodCAoYykgMjAwNS0yMDEwIEFjdGl2ZVN0YXRlIFNvZnR3YXJlIEluYy4KIyBDb3B5cmlnaHQgKGMpIDIwMTMgRWRkeSBQZXRyaciZb3IKCiIiIlV0aWxpdGllcyBmb3IgZGV0ZXJtaW5pbmcgYXBwbGljYXRpb24tc3BlY2lmaWMgZGlycy4KClNlZSA8aHR0cDovL2dpdGh1Yi5jb20vQWN0aXZlU3RhdGUvYXBwZGlycz4gZm9yIGRldGFpbHMgYW5kIHVzYWdlLgoiIiIKIyBEZXYgTm90ZXM6CiMgLSBNU0ROIG9uIHdoZXJlIHRvIHN0b3JlIGFwcCBkYXRhIGZpbGVzOgojICAgaHR0cDovL3N1cHBvcnQubWljcm9zb2Z0LmNvbS9kZWZhdWx0LmFzcHg/c2NpZD1rYjtlbi11czszMTAyOTQjWFNMVEgzMTk0MTIxMTIzMTIwMTIxMTIwMTIwCiMgLSBtYWNPUzogaHR0cDovL2RldmVsb3Blci5hcHBsZS5jb20vZG9jdW1lbnRhdGlvbi9NYWNPU1gvQ29uY2VwdHVhbC9CUEZpbGVTeXN0ZW0vaW5kZXguaHRtbAojIC0gWERHIHNwZWMgZm9yIFVuKng6IGh0dHA6Ly9zdGFuZGFyZHMuZnJlZWRlc2t0b3Aub3JnL2Jhc2VkaXItc3BlYy9iYXNlZGlyLXNwZWMtbGF0ZXN0Lmh0bWwKCl9fdmVyc2lvbl9pbmZvX18gPSAoMSwgNCwgMCkKX192ZXJzaW9uX18gPSAnLicuam9pbihtYXAoc3RyLCBfX3ZlcnNpb25faW5mb19fKSkKCgppbXBvcnQgc3lzCmltcG9ydCBvcwoKUFkzID0gc3lzLnZlcnNpb25faW5mb1swXSA9PSAzCgppZiBQWTM6CiAgICB1bmljb2RlID0gc3RyCgppZiBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnamF2YScpOgogICAgaW1wb3J0IHBsYXRmb3JtCiAgICBvc19uYW1lID0gcGxhdGZvcm0uamF2YV92ZXIoKVszXVswXQogICAgaWYgb3NfbmFtZS5zdGFydHN3aXRoKCdXaW5kb3dzJyk6ICMgIldpbmRvd3MgWFAiLCAiV2luZG93cyA3IiwgZXRjLgogICAgICAgIHN5c3RlbSA9ICd3aW4zMicKICAgIGVsaWYgb3NfbmFtZS5zdGFydHN3aXRoKCdNYWMnKTogIyAibWFjT1MiLCBldGMuCiAgICAgICAgc3lzdGVtID0gJ2RhcndpbicKICAgIGVsc2U6ICMgIkxpbnV4IiwgIlN1bk9TIiwgIkZyZWVCU0QiLCBldGMuCiAgICAgICAgIyBTZXR0aW5nIHRoaXMgdG8gImxpbnV4MiIgaXMgbm90IGlkZWFsLCBidXQgb25seSBXaW5kb3dzIG9yIE1hYwogICAgICAgICMgYXJlIGFjdHVhbGx5IGNoZWNrZWQgZm9yIGFuZCB0aGUgcmVzdCBvZiB0aGUgbW9kdWxlIGV4cGVjdHMKICAgICAgICAjICpzeXMucGxhdGZvcm0qIHN0eWxlIHN0cmluZ3MuCiAgICAgICAgc3lzdGVtID0gJ2xpbnV4MicKZWxzZToKICAgIHN5c3RlbSA9IHN5cy5wbGF0Zm9ybQoKCgpkZWYgdXNlcl9kYXRhX2RpcihhcHBuYW1lPU5vbmUsIGFwcGF1dGhvcj1Ob25lLCB2ZXJzaW9uPU5vbmUsIHJvYW1pbmc9RmFsc2UpOgogICAgciIiIlJldHVybiBmdWxsIHBhdGggdG8gdGhlIHVzZXItc3BlY2lmaWMgZGF0YSBkaXIgZm9yIHRoaXMgYXBwbGljYXRpb24uCgogICAgICAgICJhcHBuYW1lIiBpcyB0aGUgbmFtZSBvZiBhcHBsaWNhdGlvbi4KICAgICAgICAgICAgSWYgTm9uZSwganVzdCB0aGUgc3lzdGVtIGRpcmVjdG9yeSBpcyByZXR1cm5lZC4KICAgICAgICAiYXBwYXV0aG9yIiAob25seSB1c2VkIG9uIFdpbmRvd3MpIGlzIHRoZSBuYW1lIG9mIHRoZQogICAgICAgICAgICBhcHBhdXRob3Igb3IgZGlzdHJpYnV0aW5nIGJvZHkgZm9yIHRoaXMgYXBwbGljYXRpb24uIFR5cGljYWxseQogICAgICAgICAgICBpdCBpcyB0aGUgb3duaW5nIGNvbXBhbnkgbmFtZS4gVGhpcyBmYWxscyBiYWNrIHRvIGFwcG5hbWUuIFlvdSBtYXkKICAgICAgICAgICAgcGFzcyBGYWxzZSB0byBkaXNhYmxlIGl0LgogICAgICAgICJ2ZXJzaW9uIiBpcyBhbiBvcHRpb25hbCB2ZXJzaW9uIHBhdGggZWxlbWVudCB0byBhcHBlbmQgdG8gdGhlCiAgICAgICAgICAgIHBhdGguIFlvdSBtaWdodCB3YW50IHRvIHVzZSB0aGlzIGlmIHlvdSB3YW50IG11bHRpcGxlIHZlcnNpb25zCiAgICAgICAgICAgIG9mIHlvdXIgYXBwIHRvIGJlIGFibGUgdG8gcnVuIGluZGVwZW5kZW50bHkuIElmIHVzZWQsIHRoaXMKICAgICAgICAgICAgd291bGQgdHlwaWNhbGx5IGJlICI8bWFqb3I+LjxtaW5vcj4iLgogICAgICAgICAgICBPbmx5IGFwcGxpZWQgd2hlbiBhcHBuYW1lIGlzIHByZXNlbnQuCiAgICAgICAgInJvYW1pbmciIChib29sZWFuLCBkZWZhdWx0IEZhbHNlKSBjYW4gYmUgc2V0IFRydWUgdG8gdXNlIHRoZSBXaW5kb3dzCiAgICAgICAgICAgIHJvYW1pbmcgYXBwZGF0YSBkaXJlY3RvcnkuIFRoYXQgbWVhbnMgdGhhdCBmb3IgdXNlcnMgb24gYSBXaW5kb3dzCiAgICAgICAgICAgIG5ldHdvcmsgc2V0dXAgZm9yIHJvYW1pbmcgcHJvZmlsZXMsIHRoaXMgdXNlciBkYXRhIHdpbGwgYmUKICAgICAgICAgICAgc3luYydkIG9uIGxvZ2luLiBTZWUKICAgICAgICAgICAgPGh0dHA6Ly90ZWNobmV0Lm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9jYzc2NjQ4OShXUy4xMCkuYXNweD4KICAgICAgICAgICAgZm9yIGEgZGlzY3Vzc2lvbiBvZiBpc3N1ZXMuCgogICAgVHlwaWNhbCB1c2VyIGRhdGEgZGlyZWN0b3JpZXMgYXJlOgogICAgICAgIG1hY09TOiAgICAgICAgICAgICAgICAgIH4vTGlicmFyeS9BcHBsaWNhdGlvbiBTdXBwb3J0LzxBcHBOYW1lPgogICAgICAgIFVuaXg6ICAgICAgICAgICAgICAgICAgIH4vLmxvY2FsL3NoYXJlLzxBcHBOYW1lPiAgICAjIG9yIGluICRYREdfREFUQV9IT01FLCBpZiBkZWZpbmVkCiAgICAgICAgV2luIFhQIChub3Qgcm9hbWluZyk6ICAgQzpcRG9jdW1lbnRzIGFuZCBTZXR0aW5nc1w8dXNlcm5hbWU+XEFwcGxpY2F0aW9uIERhdGFcPEFwcEF1dGhvcj5cPEFwcE5hbWU+CiAgICAgICAgV2luIFhQIChyb2FtaW5nKTogICAgICAgQzpcRG9jdW1lbnRzIGFuZCBTZXR0aW5nc1w8dXNlcm5hbWU+XExvY2FsIFNldHRpbmdzXEFwcGxpY2F0aW9uIERhdGFcPEFwcEF1dGhvcj5cPEFwcE5hbWU+CiAgICAgICAgV2luIDcgIChub3Qgcm9hbWluZyk6ICAgQzpcVXNlcnNcPHVzZXJuYW1lPlxBcHBEYXRhXExvY2FsXDxBcHBBdXRob3I+XDxBcHBOYW1lPgogICAgICAgIFdpbiA3ICAocm9hbWluZyk6ICAgICAgIEM6XFVzZXJzXDx1c2VybmFtZT5cQXBwRGF0YVxSb2FtaW5nXDxBcHBBdXRob3I+XDxBcHBOYW1lPgoKICAgIEZvciBVbml4LCB3ZSBmb2xsb3cgdGhlIFhERyBzcGVjIGFuZCBzdXBwb3J0ICRYREdfREFUQV9IT01FLgogICAgVGhhdCBtZWFucywgYnkgZGVmYXVsdCAifi8ubG9jYWwvc2hhcmUvPEFwcE5hbWU+Ii4KICAgICIiIgogICAgaWYgc3lzdGVtID09ICJ3aW4zMiI6CiAgICAgICAgaWYgYXBwYXV0aG9yIGlzIE5vbmU6CiAgICAgICAgICAgIGFwcGF1dGhvciA9IGFwcG5hbWUKICAgICAgICBjb25zdCA9IHJvYW1pbmcgYW5kICJDU0lETF9BUFBEQVRBIiBvciAiQ1NJRExfTE9DQUxfQVBQREFUQSIKICAgICAgICBwYXRoID0gb3MucGF0aC5ub3JtcGF0aChfZ2V0X3dpbl9mb2xkZXIoY29uc3QpKQogICAgICAgIGlmIGFwcG5hbWU6CiAgICAgICAgICAgIGlmIGFwcGF1dGhvciBpcyBub3QgRmFsc2U6CiAgICAgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIGFwcGF1dGhvciwgYXBwbmFtZSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgYXBwbmFtZSkKICAgIGVsaWYgc3lzdGVtID09ICdkYXJ3aW4nOgogICAgICAgIHBhdGggPSBvcy5wYXRoLmV4cGFuZHVzZXIoJ34vTGlicmFyeS9BcHBsaWNhdGlvbiBTdXBwb3J0LycpCiAgICAgICAgaWYgYXBwbmFtZToKICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCBhcHBuYW1lKQogICAgZWxzZToKICAgICAgICBwYXRoID0gb3MuZ2V0ZW52KCdYREdfREFUQV9IT01FJywgb3MucGF0aC5leHBhbmR1c2VyKCJ+Ly5sb2NhbC9zaGFyZSIpKQogICAgICAgIGlmIGFwcG5hbWU6CiAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgYXBwbmFtZSkKICAgIGlmIGFwcG5hbWUgYW5kIHZlcnNpb246CiAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCB2ZXJzaW9uKQogICAgcmV0dXJuIHBhdGgKCgpkZWYgc2l0ZV9kYXRhX2RpcihhcHBuYW1lPU5vbmUsIGFwcGF1dGhvcj1Ob25lLCB2ZXJzaW9uPU5vbmUsIG11bHRpcGF0aD1GYWxzZSk6CiAgICAiIiJSZXR1cm4gZnVsbCBwYXRoIHRvIHRoZSB1c2VyLXNoYXJlZCBkYXRhIGRpciBmb3IgdGhpcyBhcHBsaWNhdGlvbi4KCiAgICAgICAgImFwcG5hbWUiIGlzIHRoZSBuYW1lIG9mIGFwcGxpY2F0aW9uLgogICAgICAgICAgICBJZiBOb25lLCBqdXN0IHRoZSBzeXN0ZW0gZGlyZWN0b3J5IGlzIHJldHVybmVkLgogICAgICAgICJhcHBhdXRob3IiIChvbmx5IHVzZWQgb24gV2luZG93cykgaXMgdGhlIG5hbWUgb2YgdGhlCiAgICAgICAgICAgIGFwcGF1dGhvciBvciBkaXN0cmlidXRpbmcgYm9keSBmb3IgdGhpcyBhcHBsaWNhdGlvbi4gVHlwaWNhbGx5CiAgICAgICAgICAgIGl0IGlzIHRoZSBvd25pbmcgY29tcGFueSBuYW1lLiBUaGlzIGZhbGxzIGJhY2sgdG8gYXBwbmFtZS4gWW91IG1heQogICAgICAgICAgICBwYXNzIEZhbHNlIHRvIGRpc2FibGUgaXQuCiAgICAgICAgInZlcnNpb24iIGlzIGFuIG9wdGlvbmFsIHZlcnNpb24gcGF0aCBlbGVtZW50IHRvIGFwcGVuZCB0byB0aGUKICAgICAgICAgICAgcGF0aC4gWW91IG1pZ2h0IHdhbnQgdG8gdXNlIHRoaXMgaWYgeW91IHdhbnQgbXVsdGlwbGUgdmVyc2lvbnMKICAgICAgICAgICAgb2YgeW91ciBhcHAgdG8gYmUgYWJsZSB0byBydW4gaW5kZXBlbmRlbnRseS4gSWYgdXNlZCwgdGhpcwogICAgICAgICAgICB3b3VsZCB0eXBpY2FsbHkgYmUgIjxtYWpvcj4uPG1pbm9yPiIuCiAgICAgICAgICAgIE9ubHkgYXBwbGllZCB3aGVuIGFwcG5hbWUgaXMgcHJlc2VudC4KICAgICAgICAibXVsdGlwYXRoIiBpcyBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgb25seSBhcHBsaWNhYmxlIHRvICpuaXgKICAgICAgICAgICAgd2hpY2ggaW5kaWNhdGVzIHRoYXQgdGhlIGVudGlyZSBsaXN0IG9mIGRhdGEgZGlycyBzaG91bGQgYmUKICAgICAgICAgICAgcmV0dXJuZWQuIEJ5IGRlZmF1bHQsIHRoZSBmaXJzdCBpdGVtIGZyb20gWERHX0RBVEFfRElSUyBpcwogICAgICAgICAgICByZXR1cm5lZCwgb3IgJy91c3IvbG9jYWwvc2hhcmUvPEFwcE5hbWU+JywKICAgICAgICAgICAgaWYgWERHX0RBVEFfRElSUyBpcyBub3Qgc2V0CgogICAgVHlwaWNhbCB1c2VyIGRhdGEgZGlyZWN0b3JpZXMgYXJlOgogICAgICAgIG1hY09TOiAgICAgIC9MaWJyYXJ5L0FwcGxpY2F0aW9uIFN1cHBvcnQvPEFwcE5hbWU+CiAgICAgICAgVW5peDogICAgICAgL3Vzci9sb2NhbC9zaGFyZS88QXBwTmFtZT4gb3IgL3Vzci9zaGFyZS88QXBwTmFtZT4KICAgICAgICBXaW4gWFA6ICAgICBDOlxEb2N1bWVudHMgYW5kIFNldHRpbmdzXEFsbCBVc2Vyc1xBcHBsaWNhdGlvbiBEYXRhXDxBcHBBdXRob3I+XDxBcHBOYW1lPgogICAgICAgIFZpc3RhOiAgICAgIChGYWlsISAiQzpcUHJvZ3JhbURhdGEiIGlzIGEgaGlkZGVuICpzeXN0ZW0qIGRpcmVjdG9yeSBvbiBWaXN0YS4pCiAgICAgICAgV2luIDc6ICAgICAgQzpcUHJvZ3JhbURhdGFcPEFwcEF1dGhvcj5cPEFwcE5hbWU+ICAgIyBIaWRkZW4sIGJ1dCB3cml0ZWFibGUgb24gV2luIDcuCgogICAgRm9yIFVuaXgsIHRoaXMgaXMgdXNpbmcgdGhlICRYREdfREFUQV9ESVJTWzBdIGRlZmF1bHQuCgogICAgV0FSTklORzogRG8gbm90IHVzZSB0aGlzIG9uIFdpbmRvd3MuIFNlZSB0aGUgVmlzdGEtRmFpbCBub3RlIGFib3ZlIGZvciB3aHkuCiAgICAiIiIKICAgIGlmIHN5c3RlbSA9PSAid2luMzIiOgogICAgICAgIGlmIGFwcGF1dGhvciBpcyBOb25lOgogICAgICAgICAgICBhcHBhdXRob3IgPSBhcHBuYW1lCiAgICAgICAgcGF0aCA9IG9zLnBhdGgubm9ybXBhdGgoX2dldF93aW5fZm9sZGVyKCJDU0lETF9DT01NT05fQVBQREFUQSIpKQogICAgICAgIGlmIGFwcG5hbWU6CiAgICAgICAgICAgIGlmIGFwcGF1dGhvciBpcyBub3QgRmFsc2U6CiAgICAgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIGFwcGF1dGhvciwgYXBwbmFtZSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgYXBwbmFtZSkKICAgIGVsaWYgc3lzdGVtID09ICdkYXJ3aW4nOgogICAgICAgIHBhdGggPSBvcy5wYXRoLmV4cGFuZHVzZXIoJy9MaWJyYXJ5L0FwcGxpY2F0aW9uIFN1cHBvcnQnKQogICAgICAgIGlmIGFwcG5hbWU6CiAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgYXBwbmFtZSkKICAgIGVsc2U6CiAgICAgICAgIyBYREcgZGVmYXVsdCBmb3IgJFhER19EQVRBX0RJUlMKICAgICAgICAjIG9ubHkgZmlyc3QsIGlmIG11bHRpcGF0aCBpcyBGYWxzZQogICAgICAgIHBhdGggPSBvcy5nZXRlbnYoJ1hER19EQVRBX0RJUlMnLAogICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aHNlcC5qb2luKFsnL3Vzci9sb2NhbC9zaGFyZScsICcvdXNyL3NoYXJlJ10pKQogICAgICAgIHBhdGhsaXN0ID0gW29zLnBhdGguZXhwYW5kdXNlcih4LnJzdHJpcChvcy5zZXApKSBmb3IgeCBpbiBwYXRoLnNwbGl0KG9zLnBhdGhzZXApXQogICAgICAgIGlmIGFwcG5hbWU6CiAgICAgICAgICAgIGlmIHZlcnNpb246CiAgICAgICAgICAgICAgICBhcHBuYW1lID0gb3MucGF0aC5qb2luKGFwcG5hbWUsIHZlcnNpb24pCiAgICAgICAgICAgIHBhdGhsaXN0ID0gW29zLnNlcC5qb2luKFt4LCBhcHBuYW1lXSkgZm9yIHggaW4gcGF0aGxpc3RdCgogICAgICAgIGlmIG11bHRpcGF0aDoKICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGhzZXAuam9pbihwYXRobGlzdCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBwYXRoID0gcGF0aGxpc3RbMF0KICAgICAgICByZXR1cm4gcGF0aAoKICAgIGlmIGFwcG5hbWUgYW5kIHZlcnNpb246CiAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCB2ZXJzaW9uKQogICAgcmV0dXJuIHBhdGgKCgpkZWYgdXNlcl9jb25maWdfZGlyKGFwcG5hbWU9Tm9uZSwgYXBwYXV0aG9yPU5vbmUsIHZlcnNpb249Tm9uZSwgcm9hbWluZz1GYWxzZSk6CiAgICByIiIiUmV0dXJuIGZ1bGwgcGF0aCB0byB0aGUgdXNlci1zcGVjaWZpYyBjb25maWcgZGlyIGZvciB0aGlzIGFwcGxpY2F0aW9uLgoKICAgICAgICAiYXBwbmFtZSIgaXMgdGhlIG5hbWUgb2YgYXBwbGljYXRpb24uCiAgICAgICAgICAgIElmIE5vbmUsIGp1c3QgdGhlIHN5c3RlbSBkaXJlY3RvcnkgaXMgcmV0dXJuZWQuCiAgICAgICAgImFwcGF1dGhvciIgKG9ubHkgdXNlZCBvbiBXaW5kb3dzKSBpcyB0aGUgbmFtZSBvZiB0aGUKICAgICAgICAgICAgYXBwYXV0aG9yIG9yIGRpc3RyaWJ1dGluZyBib2R5IGZvciB0aGlzIGFwcGxpY2F0aW9uLiBUeXBpY2FsbHkKICAgICAgICAgICAgaXQgaXMgdGhlIG93bmluZyBjb21wYW55IG5hbWUuIFRoaXMgZmFsbHMgYmFjayB0byBhcHBuYW1lLiBZb3UgbWF5CiAgICAgICAgICAgIHBhc3MgRmFsc2UgdG8gZGlzYWJsZSBpdC4KICAgICAgICAidmVyc2lvbiIgaXMgYW4gb3B0aW9uYWwgdmVyc2lvbiBwYXRoIGVsZW1lbnQgdG8gYXBwZW5kIHRvIHRoZQogICAgICAgICAgICBwYXRoLiBZb3UgbWlnaHQgd2FudCB0byB1c2UgdGhpcyBpZiB5b3Ugd2FudCBtdWx0aXBsZSB2ZXJzaW9ucwogICAgICAgICAgICBvZiB5b3VyIGFwcCB0byBiZSBhYmxlIHRvIHJ1biBpbmRlcGVuZGVudGx5LiBJZiB1c2VkLCB0aGlzCiAgICAgICAgICAgIHdvdWxkIHR5cGljYWxseSBiZSAiPG1ham9yPi48bWlub3I+Ii4KICAgICAgICAgICAgT25seSBhcHBsaWVkIHdoZW4gYXBwbmFtZSBpcyBwcmVzZW50LgogICAgICAgICJyb2FtaW5nIiAoYm9vbGVhbiwgZGVmYXVsdCBGYWxzZSkgY2FuIGJlIHNldCBUcnVlIHRvIHVzZSB0aGUgV2luZG93cwogICAgICAgICAgICByb2FtaW5nIGFwcGRhdGEgZGlyZWN0b3J5LiBUaGF0IG1lYW5zIHRoYXQgZm9yIHVzZXJzIG9uIGEgV2luZG93cwogICAgICAgICAgICBuZXR3b3JrIHNldHVwIGZvciByb2FtaW5nIHByb2ZpbGVzLCB0aGlzIHVzZXIgZGF0YSB3aWxsIGJlCiAgICAgICAgICAgIHN5bmMnZCBvbiBsb2dpbi4gU2VlCiAgICAgICAgICAgIDxodHRwOi8vdGVjaG5ldC5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvY2M3NjY0ODkoV1MuMTApLmFzcHg+CiAgICAgICAgICAgIGZvciBhIGRpc2N1c3Npb24gb2YgaXNzdWVzLgoKICAgIFR5cGljYWwgdXNlciBkYXRhIGRpcmVjdG9yaWVzIGFyZToKICAgICAgICBtYWNPUzogICAgICAgICAgICAgICAgICBzYW1lIGFzIHVzZXJfZGF0YV9kaXIKICAgICAgICBVbml4OiAgICAgICAgICAgICAgICAgICB+Ly5jb25maWcvPEFwcE5hbWU+ICAgICAjIG9yIGluICRYREdfQ09ORklHX0hPTUUsIGlmIGRlZmluZWQKICAgICAgICBXaW4gKjogICAgICAgICAgICAgICAgICBzYW1lIGFzIHVzZXJfZGF0YV9kaXIKCiAgICBGb3IgVW5peCwgd2UgZm9sbG93IHRoZSBYREcgc3BlYyBhbmQgc3VwcG9ydCAkWERHX0NPTkZJR19IT01FLgogICAgVGhhdCBtZWFucywgYnkgZGVhZnVsdCAifi8uY29uZmlnLzxBcHBOYW1lPiIuCiAgICAiIiIKICAgIGlmIHN5c3RlbSBpbiBbIndpbjMyIiwgImRhcndpbiJdOgogICAgICAgIHBhdGggPSB1c2VyX2RhdGFfZGlyKGFwcG5hbWUsIGFwcGF1dGhvciwgTm9uZSwgcm9hbWluZykKICAgIGVsc2U6CiAgICAgICAgcGF0aCA9IG9zLmdldGVudignWERHX0NPTkZJR19IT01FJywgb3MucGF0aC5leHBhbmR1c2VyKCJ+Ly5jb25maWciKSkKICAgICAgICBpZiBhcHBuYW1lOgogICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIGFwcG5hbWUpCiAgICBpZiBhcHBuYW1lIGFuZCB2ZXJzaW9uOgogICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgdmVyc2lvbikKICAgIHJldHVybiBwYXRoCgoKZGVmIHNpdGVfY29uZmlnX2RpcihhcHBuYW1lPU5vbmUsIGFwcGF1dGhvcj1Ob25lLCB2ZXJzaW9uPU5vbmUsIG11bHRpcGF0aD1GYWxzZSk6CiAgICAiIiJSZXR1cm4gZnVsbCBwYXRoIHRvIHRoZSB1c2VyLXNoYXJlZCBkYXRhIGRpciBmb3IgdGhpcyBhcHBsaWNhdGlvbi4KCiAgICAgICAgImFwcG5hbWUiIGlzIHRoZSBuYW1lIG9mIGFwcGxpY2F0aW9uLgogICAgICAgICAgICBJZiBOb25lLCBqdXN0IHRoZSBzeXN0ZW0gZGlyZWN0b3J5IGlzIHJldHVybmVkLgogICAgICAgICJhcHBhdXRob3IiIChvbmx5IHVzZWQgb24gV2luZG93cykgaXMgdGhlIG5hbWUgb2YgdGhlCiAgICAgICAgICAgIGFwcGF1dGhvciBvciBkaXN0cmlidXRpbmcgYm9keSBmb3IgdGhpcyBhcHBsaWNhdGlvbi4gVHlwaWNhbGx5CiAgICAgICAgICAgIGl0IGlzIHRoZSBvd25pbmcgY29tcGFueSBuYW1lLiBUaGlzIGZhbGxzIGJhY2sgdG8gYXBwbmFtZS4gWW91IG1heQogICAgICAgICAgICBwYXNzIEZhbHNlIHRvIGRpc2FibGUgaXQuCiAgICAgICAgInZlcnNpb24iIGlzIGFuIG9wdGlvbmFsIHZlcnNpb24gcGF0aCBlbGVtZW50IHRvIGFwcGVuZCB0byB0aGUKICAgICAgICAgICAgcGF0aC4gWW91IG1pZ2h0IHdhbnQgdG8gdXNlIHRoaXMgaWYgeW91IHdhbnQgbXVsdGlwbGUgdmVyc2lvbnMKICAgICAgICAgICAgb2YgeW91ciBhcHAgdG8gYmUgYWJsZSB0byBydW4gaW5kZXBlbmRlbnRseS4gSWYgdXNlZCwgdGhpcwogICAgICAgICAgICB3b3VsZCB0eXBpY2FsbHkgYmUgIjxtYWpvcj4uPG1pbm9yPiIuCiAgICAgICAgICAgIE9ubHkgYXBwbGllZCB3aGVuIGFwcG5hbWUgaXMgcHJlc2VudC4KICAgICAgICAibXVsdGlwYXRoIiBpcyBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgb25seSBhcHBsaWNhYmxlIHRvICpuaXgKICAgICAgICAgICAgd2hpY2ggaW5kaWNhdGVzIHRoYXQgdGhlIGVudGlyZSBsaXN0IG9mIGNvbmZpZyBkaXJzIHNob3VsZCBiZQogICAgICAgICAgICByZXR1cm5lZC4gQnkgZGVmYXVsdCwgdGhlIGZpcnN0IGl0ZW0gZnJvbSBYREdfQ09ORklHX0RJUlMgaXMKICAgICAgICAgICAgcmV0dXJuZWQsIG9yICcvZXRjL3hkZy88QXBwTmFtZT4nLCBpZiBYREdfQ09ORklHX0RJUlMgaXMgbm90IHNldAoKICAgIFR5cGljYWwgdXNlciBkYXRhIGRpcmVjdG9yaWVzIGFyZToKICAgICAgICBtYWNPUzogICAgICBzYW1lIGFzIHNpdGVfZGF0YV9kaXIKICAgICAgICBVbml4OiAgICAgICAvZXRjL3hkZy88QXBwTmFtZT4gb3IgJFhER19DT05GSUdfRElSU1tpXS88QXBwTmFtZT4gZm9yIGVhY2ggdmFsdWUgaW4KICAgICAgICAgICAgICAgICAgICAkWERHX0NPTkZJR19ESVJTCiAgICAgICAgV2luICo6ICAgICAgc2FtZSBhcyBzaXRlX2RhdGFfZGlyCiAgICAgICAgVmlzdGE6ICAgICAgKEZhaWwhICJDOlxQcm9ncmFtRGF0YSIgaXMgYSBoaWRkZW4gKnN5c3RlbSogZGlyZWN0b3J5IG9uIFZpc3RhLikKCiAgICBGb3IgVW5peCwgdGhpcyBpcyB1c2luZyB0aGUgJFhER19DT05GSUdfRElSU1swXSBkZWZhdWx0LCBpZiBtdWx0aXBhdGg9RmFsc2UKCiAgICBXQVJOSU5HOiBEbyBub3QgdXNlIHRoaXMgb24gV2luZG93cy4gU2VlIHRoZSBWaXN0YS1GYWlsIG5vdGUgYWJvdmUgZm9yIHdoeS4KICAgICIiIgogICAgaWYgc3lzdGVtIGluIFsid2luMzIiLCAiZGFyd2luIl06CiAgICAgICAgcGF0aCA9IHNpdGVfZGF0YV9kaXIoYXBwbmFtZSwgYXBwYXV0aG9yKQogICAgICAgIGlmIGFwcG5hbWUgYW5kIHZlcnNpb246CiAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgdmVyc2lvbikKICAgIGVsc2U6CiAgICAgICAgIyBYREcgZGVmYXVsdCBmb3IgJFhER19DT05GSUdfRElSUwogICAgICAgICMgb25seSBmaXJzdCwgaWYgbXVsdGlwYXRoIGlzIEZhbHNlCiAgICAgICAgcGF0aCA9IG9zLmdldGVudignWERHX0NPTkZJR19ESVJTJywgJy9ldGMveGRnJykKICAgICAgICBwYXRobGlzdCA9IFtvcy5wYXRoLmV4cGFuZHVzZXIoeC5yc3RyaXAob3Muc2VwKSkgZm9yIHggaW4gcGF0aC5zcGxpdChvcy5wYXRoc2VwKV0KICAgICAgICBpZiBhcHBuYW1lOgogICAgICAgICAgICBpZiB2ZXJzaW9uOgogICAgICAgICAgICAgICAgYXBwbmFtZSA9IG9zLnBhdGguam9pbihhcHBuYW1lLCB2ZXJzaW9uKQogICAgICAgICAgICBwYXRobGlzdCA9IFtvcy5zZXAuam9pbihbeCwgYXBwbmFtZV0pIGZvciB4IGluIHBhdGhsaXN0XQoKICAgICAgICBpZiBtdWx0aXBhdGg6CiAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoc2VwLmpvaW4ocGF0aGxpc3QpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcGF0aCA9IHBhdGhsaXN0WzBdCiAgICByZXR1cm4gcGF0aAoKCmRlZiB1c2VyX2NhY2hlX2RpcihhcHBuYW1lPU5vbmUsIGFwcGF1dGhvcj1Ob25lLCB2ZXJzaW9uPU5vbmUsIG9waW5pb249VHJ1ZSk6CiAgICByIiIiUmV0dXJuIGZ1bGwgcGF0aCB0byB0aGUgdXNlci1zcGVjaWZpYyBjYWNoZSBkaXIgZm9yIHRoaXMgYXBwbGljYXRpb24uCgogICAgICAgICJhcHBuYW1lIiBpcyB0aGUgbmFtZSBvZiBhcHBsaWNhdGlvbi4KICAgICAgICAgICAgSWYgTm9uZSwganVzdCB0aGUgc3lzdGVtIGRpcmVjdG9yeSBpcyByZXR1cm5lZC4KICAgICAgICAiYXBwYXV0aG9yIiAob25seSB1c2VkIG9uIFdpbmRvd3MpIGlzIHRoZSBuYW1lIG9mIHRoZQogICAgICAgICAgICBhcHBhdXRob3Igb3IgZGlzdHJpYnV0aW5nIGJvZHkgZm9yIHRoaXMgYXBwbGljYXRpb24uIFR5cGljYWxseQogICAgICAgICAgICBpdCBpcyB0aGUgb3duaW5nIGNvbXBhbnkgbmFtZS4gVGhpcyBmYWxscyBiYWNrIHRvIGFwcG5hbWUuIFlvdSBtYXkKICAgICAgICAgICAgcGFzcyBGYWxzZSB0byBkaXNhYmxlIGl0LgogICAgICAgICJ2ZXJzaW9uIiBpcyBhbiBvcHRpb25hbCB2ZXJzaW9uIHBhdGggZWxlbWVudCB0byBhcHBlbmQgdG8gdGhlCiAgICAgICAgICAgIHBhdGguIFlvdSBtaWdodCB3YW50IHRvIHVzZSB0aGlzIGlmIHlvdSB3YW50IG11bHRpcGxlIHZlcnNpb25zCiAgICAgICAgICAgIG9mIHlvdXIgYXBwIHRvIGJlIGFibGUgdG8gcnVuIGluZGVwZW5kZW50bHkuIElmIHVzZWQsIHRoaXMKICAgICAgICAgICAgd291bGQgdHlwaWNhbGx5IGJlICI8bWFqb3I+LjxtaW5vcj4iLgogICAgICAgICAgICBPbmx5IGFwcGxpZWQgd2hlbiBhcHBuYW1lIGlzIHByZXNlbnQuCiAgICAgICAgIm9waW5pb24iIChib29sZWFuKSBjYW4gYmUgRmFsc2UgdG8gZGlzYWJsZSB0aGUgYXBwZW5kaW5nIG9mCiAgICAgICAgICAgICJDYWNoZSIgdG8gdGhlIGJhc2UgYXBwIGRhdGEgZGlyIGZvciBXaW5kb3dzLiBTZWUKICAgICAgICAgICAgZGlzY3Vzc2lvbiBiZWxvdy4KCiAgICBUeXBpY2FsIHVzZXIgY2FjaGUgZGlyZWN0b3JpZXMgYXJlOgogICAgICAgIG1hY09TOiAgICAgIH4vTGlicmFyeS9DYWNoZXMvPEFwcE5hbWU+CiAgICAgICAgVW5peDogICAgICAgfi8uY2FjaGUvPEFwcE5hbWU+IChYREcgZGVmYXVsdCkKICAgICAgICBXaW4gWFA6ICAgICBDOlxEb2N1bWVudHMgYW5kIFNldHRpbmdzXDx1c2VybmFtZT5cTG9jYWwgU2V0dGluZ3NcQXBwbGljYXRpb24gRGF0YVw8QXBwQXV0aG9yPlw8QXBwTmFtZT5cQ2FjaGUKICAgICAgICBWaXN0YTogICAgICBDOlxVc2Vyc1w8dXNlcm5hbWU+XEFwcERhdGFcTG9jYWxcPEFwcEF1dGhvcj5cPEFwcE5hbWU+XENhY2hlCgogICAgT24gV2luZG93cyB0aGUgb25seSBzdWdnZXN0aW9uIGluIHRoZSBNU0ROIGRvY3MgaXMgdGhhdCBsb2NhbCBzZXR0aW5ncyBnbyBpbgogICAgdGhlIGBDU0lETF9MT0NBTF9BUFBEQVRBYCBkaXJlY3RvcnkuIFRoaXMgaXMgaWRlbnRpY2FsIHRvIHRoZSBub24tcm9hbWluZwogICAgYXBwIGRhdGEgZGlyICh0aGUgZGVmYXVsdCByZXR1cm5lZCBieSBgdXNlcl9kYXRhX2RpcmAgYWJvdmUpLiBBcHBzIHR5cGljYWxseQogICAgcHV0IGNhY2hlIGRhdGEgc29tZXdoZXJlICp1bmRlciogdGhlIGdpdmVuIGRpciBoZXJlLiBTb21lIGV4YW1wbGVzOgogICAgICAgIC4uLlxNb3ppbGxhXEZpcmVmb3hcUHJvZmlsZXNcPFByb2ZpbGVOYW1lPlxDYWNoZQogICAgICAgIC4uLlxBY21lXFN1cGVyQXBwXENhY2hlXDEuMAogICAgT1BJTklPTjogVGhpcyBmdW5jdGlvbiBhcHBlbmRzICJDYWNoZSIgdG8gdGhlIGBDU0lETF9MT0NBTF9BUFBEQVRBYCB2YWx1ZS4KICAgIFRoaXMgY2FuIGJlIGRpc2FibGVkIHdpdGggdGhlIGBvcGluaW9uPUZhbHNlYCBvcHRpb24uCiAgICAiIiIKICAgIGlmIHN5c3RlbSA9PSAid2luMzIiOgogICAgICAgIGlmIGFwcGF1dGhvciBpcyBOb25lOgogICAgICAgICAgICBhcHBhdXRob3IgPSBhcHBuYW1lCiAgICAgICAgcGF0aCA9IG9zLnBhdGgubm9ybXBhdGgoX2dldF93aW5fZm9sZGVyKCJDU0lETF9MT0NBTF9BUFBEQVRBIikpCiAgICAgICAgaWYgYXBwbmFtZToKICAgICAgICAgICAgaWYgYXBwYXV0aG9yIGlzIG5vdCBGYWxzZToKICAgICAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgYXBwYXV0aG9yLCBhcHBuYW1lKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCBhcHBuYW1lKQogICAgICAgICAgICBpZiBvcGluaW9uOgogICAgICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCAiQ2FjaGUiKQogICAgZWxpZiBzeXN0ZW0gPT0gJ2Rhcndpbic6CiAgICAgICAgcGF0aCA9IG9zLnBhdGguZXhwYW5kdXNlcignfi9MaWJyYXJ5L0NhY2hlcycpCiAgICAgICAgaWYgYXBwbmFtZToKICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCBhcHBuYW1lKQogICAgZWxzZToKICAgICAgICBwYXRoID0gb3MuZ2V0ZW52KCdYREdfQ0FDSEVfSE9NRScsIG9zLnBhdGguZXhwYW5kdXNlcignfi8uY2FjaGUnKSkKICAgICAgICBpZiBhcHBuYW1lOgogICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIGFwcG5hbWUpCiAgICBpZiBhcHBuYW1lIGFuZCB2ZXJzaW9uOgogICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgdmVyc2lvbikKICAgIHJldHVybiBwYXRoCgoKZGVmIHVzZXJfbG9nX2RpcihhcHBuYW1lPU5vbmUsIGFwcGF1dGhvcj1Ob25lLCB2ZXJzaW9uPU5vbmUsIG9waW5pb249VHJ1ZSk6CiAgICByIiIiUmV0dXJuIGZ1bGwgcGF0aCB0byB0aGUgdXNlci1zcGVjaWZpYyBsb2cgZGlyIGZvciB0aGlzIGFwcGxpY2F0aW9uLgoKICAgICAgICAiYXBwbmFtZSIgaXMgdGhlIG5hbWUgb2YgYXBwbGljYXRpb24uCiAgICAgICAgICAgIElmIE5vbmUsIGp1c3QgdGhlIHN5c3RlbSBkaXJlY3RvcnkgaXMgcmV0dXJuZWQuCiAgICAgICAgImFwcGF1dGhvciIgKG9ubHkgdXNlZCBvbiBXaW5kb3dzKSBpcyB0aGUgbmFtZSBvZiB0aGUKICAgICAgICAgICAgYXBwYXV0aG9yIG9yIGRpc3RyaWJ1dGluZyBib2R5IGZvciB0aGlzIGFwcGxpY2F0aW9uLiBUeXBpY2FsbHkKICAgICAgICAgICAgaXQgaXMgdGhlIG93bmluZyBjb21wYW55IG5hbWUuIFRoaXMgZmFsbHMgYmFjayB0byBhcHBuYW1lLiBZb3UgbWF5CiAgICAgICAgICAgIHBhc3MgRmFsc2UgdG8gZGlzYWJsZSBpdC4KICAgICAgICAidmVyc2lvbiIgaXMgYW4gb3B0aW9uYWwgdmVyc2lvbiBwYXRoIGVsZW1lbnQgdG8gYXBwZW5kIHRvIHRoZQogICAgICAgICAgICBwYXRoLiBZb3UgbWlnaHQgd2FudCB0byB1c2UgdGhpcyBpZiB5b3Ugd2FudCBtdWx0aXBsZSB2ZXJzaW9ucwogICAgICAgICAgICBvZiB5b3VyIGFwcCB0byBiZSBhYmxlIHRvIHJ1biBpbmRlcGVuZGVudGx5LiBJZiB1c2VkLCB0aGlzCiAgICAgICAgICAgIHdvdWxkIHR5cGljYWxseSBiZSAiPG1ham9yPi48bWlub3I+Ii4KICAgICAgICAgICAgT25seSBhcHBsaWVkIHdoZW4gYXBwbmFtZSBpcyBwcmVzZW50LgogICAgICAgICJvcGluaW9uIiAoYm9vbGVhbikgY2FuIGJlIEZhbHNlIHRvIGRpc2FibGUgdGhlIGFwcGVuZGluZyBvZgogICAgICAgICAgICAiTG9ncyIgdG8gdGhlIGJhc2UgYXBwIGRhdGEgZGlyIGZvciBXaW5kb3dzLCBhbmQgImxvZyIgdG8gdGhlCiAgICAgICAgICAgIGJhc2UgY2FjaGUgZGlyIGZvciBVbml4LiBTZWUgZGlzY3Vzc2lvbiBiZWxvdy4KCiAgICBUeXBpY2FsIHVzZXIgY2FjaGUgZGlyZWN0b3JpZXMgYXJlOgogICAgICAgIG1hY09TOiAgICAgIH4vTGlicmFyeS9Mb2dzLzxBcHBOYW1lPgogICAgICAgIFVuaXg6ICAgICAgIH4vLmNhY2hlLzxBcHBOYW1lPi9sb2cgICMgb3IgdW5kZXIgJFhER19DQUNIRV9IT01FIGlmIGRlZmluZWQKICAgICAgICBXaW4gWFA6ICAgICBDOlxEb2N1bWVudHMgYW5kIFNldHRpbmdzXDx1c2VybmFtZT5cTG9jYWwgU2V0dGluZ3NcQXBwbGljYXRpb24gRGF0YVw8QXBwQXV0aG9yPlw8QXBwTmFtZT5cTG9ncwogICAgICAgIFZpc3RhOiAgICAgIEM6XFVzZXJzXDx1c2VybmFtZT5cQXBwRGF0YVxMb2NhbFw8QXBwQXV0aG9yPlw8QXBwTmFtZT5cTG9ncwoKICAgIE9uIFdpbmRvd3MgdGhlIG9ubHkgc3VnZ2VzdGlvbiBpbiB0aGUgTVNETiBkb2NzIGlzIHRoYXQgbG9jYWwgc2V0dGluZ3MKICAgIGdvIGluIHRoZSBgQ1NJRExfTE9DQUxfQVBQREFUQWAgZGlyZWN0b3J5LiAoTm90ZTogSSdtIGludGVyZXN0ZWQgaW4KICAgIGV4YW1wbGVzIG9mIHdoYXQgc29tZSB3aW5kb3dzIGFwcHMgdXNlIGZvciBhIGxvZ3MgZGlyLikKCiAgICBPUElOSU9OOiBUaGlzIGZ1bmN0aW9uIGFwcGVuZHMgIkxvZ3MiIHRvIHRoZSBgQ1NJRExfTE9DQUxfQVBQREFUQWAKICAgIHZhbHVlIGZvciBXaW5kb3dzIGFuZCBhcHBlbmRzICJsb2ciIHRvIHRoZSB1c2VyIGNhY2hlIGRpciBmb3IgVW5peC4KICAgIFRoaXMgY2FuIGJlIGRpc2FibGVkIHdpdGggdGhlIGBvcGluaW9uPUZhbHNlYCBvcHRpb24uCiAgICAiIiIKICAgIGlmIHN5c3RlbSA9PSAiZGFyd2luIjoKICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKAogICAgICAgICAgICBvcy5wYXRoLmV4cGFuZHVzZXIoJ34vTGlicmFyeS9Mb2dzJyksCiAgICAgICAgICAgIGFwcG5hbWUpCiAgICBlbGlmIHN5c3RlbSA9PSAid2luMzIiOgogICAgICAgIHBhdGggPSB1c2VyX2RhdGFfZGlyKGFwcG5hbWUsIGFwcGF1dGhvciwgdmVyc2lvbikKICAgICAgICB2ZXJzaW9uID0gRmFsc2UKICAgICAgICBpZiBvcGluaW9uOgogICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsICJMb2dzIikKICAgIGVsc2U6CiAgICAgICAgcGF0aCA9IHVzZXJfY2FjaGVfZGlyKGFwcG5hbWUsIGFwcGF1dGhvciwgdmVyc2lvbikKICAgICAgICB2ZXJzaW9uID0gRmFsc2UKICAgICAgICBpZiBvcGluaW9uOgogICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsICJsb2ciKQogICAgaWYgYXBwbmFtZSBhbmQgdmVyc2lvbjoKICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIHZlcnNpb24pCiAgICByZXR1cm4gcGF0aAoKCmNsYXNzIEFwcERpcnMob2JqZWN0KToKICAgICIiIkNvbnZlbmllbmNlIHdyYXBwZXIgZm9yIGdldHRpbmcgYXBwbGljYXRpb24gZGlycy4iIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhcHBuYW1lLCBhcHBhdXRob3I9Tm9uZSwgdmVyc2lvbj1Ob25lLCByb2FtaW5nPUZhbHNlLAogICAgICAgICAgICAgICAgIG11bHRpcGF0aD1GYWxzZSk6CiAgICAgICAgc2VsZi5hcHBuYW1lID0gYXBwbmFtZQogICAgICAgIHNlbGYuYXBwYXV0aG9yID0gYXBwYXV0aG9yCiAgICAgICAgc2VsZi52ZXJzaW9uID0gdmVyc2lvbgogICAgICAgIHNlbGYucm9hbWluZyA9IHJvYW1pbmcKICAgICAgICBzZWxmLm11bHRpcGF0aCA9IG11bHRpcGF0aAoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHVzZXJfZGF0YV9kaXIoc2VsZik6CiAgICAgICAgcmV0dXJuIHVzZXJfZGF0YV9kaXIoc2VsZi5hcHBuYW1lLCBzZWxmLmFwcGF1dGhvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uPXNlbGYudmVyc2lvbiwgcm9hbWluZz1zZWxmLnJvYW1pbmcpCgogICAgQHByb3BlcnR5CiAgICBkZWYgc2l0ZV9kYXRhX2RpcihzZWxmKToKICAgICAgICByZXR1cm4gc2l0ZV9kYXRhX2RpcihzZWxmLmFwcG5hbWUsIHNlbGYuYXBwYXV0aG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb249c2VsZi52ZXJzaW9uLCBtdWx0aXBhdGg9c2VsZi5tdWx0aXBhdGgpCgogICAgQHByb3BlcnR5CiAgICBkZWYgdXNlcl9jb25maWdfZGlyKHNlbGYpOgogICAgICAgIHJldHVybiB1c2VyX2NvbmZpZ19kaXIoc2VsZi5hcHBuYW1lLCBzZWxmLmFwcGF1dGhvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb249c2VsZi52ZXJzaW9uLCByb2FtaW5nPXNlbGYucm9hbWluZykKCiAgICBAcHJvcGVydHkKICAgIGRlZiBzaXRlX2NvbmZpZ19kaXIoc2VsZik6CiAgICAgICAgcmV0dXJuIHNpdGVfY29uZmlnX2RpcihzZWxmLmFwcG5hbWUsIHNlbGYuYXBwYXV0aG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb249c2VsZi52ZXJzaW9uLCBtdWx0aXBhdGg9c2VsZi5tdWx0aXBhdGgpCgogICAgQHByb3BlcnR5CiAgICBkZWYgdXNlcl9jYWNoZV9kaXIoc2VsZik6CiAgICAgICAgcmV0dXJuIHVzZXJfY2FjaGVfZGlyKHNlbGYuYXBwbmFtZSwgc2VsZi5hcHBhdXRob3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb249c2VsZi52ZXJzaW9uKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHVzZXJfbG9nX2RpcihzZWxmKToKICAgICAgICByZXR1cm4gdXNlcl9sb2dfZGlyKHNlbGYuYXBwbmFtZSwgc2VsZi5hcHBhdXRob3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uPXNlbGYudmVyc2lvbikKCgojLS0tLSBpbnRlcm5hbCBzdXBwb3J0IHN0dWZmCgpkZWYgX2dldF93aW5fZm9sZGVyX2Zyb21fcmVnaXN0cnkoY3NpZGxfbmFtZSk6CiAgICAiIiJUaGlzIGlzIGEgZmFsbGJhY2sgdGVjaG5pcXVlIGF0IGJlc3QuIEknbSBub3Qgc3VyZSBpZiB1c2luZyB0aGUKICAgIHJlZ2lzdHJ5IGZvciB0aGlzIGd1YXJhbnRlZXMgdXMgdGhlIGNvcnJlY3QgYW5zd2VyIGZvciBhbGwgQ1NJRExfKgogICAgbmFtZXMuCiAgICAiIiIKICAgIGltcG9ydCBfd2lucmVnCgogICAgc2hlbGxfZm9sZGVyX25hbWUgPSB7CiAgICAgICAgIkNTSURMX0FQUERBVEEiOiAiQXBwRGF0YSIsCiAgICAgICAgIkNTSURMX0NPTU1PTl9BUFBEQVRBIjogIkNvbW1vbiBBcHBEYXRhIiwKICAgICAgICAiQ1NJRExfTE9DQUxfQVBQREFUQSI6ICJMb2NhbCBBcHBEYXRhIiwKICAgIH1bY3NpZGxfbmFtZV0KCiAgICBrZXkgPSBfd2lucmVnLk9wZW5LZXkoCiAgICAgICAgX3dpbnJlZy5IS0VZX0NVUlJFTlRfVVNFUiwKICAgICAgICByIlNvZnR3YXJlXE1pY3Jvc29mdFxXaW5kb3dzXEN1cnJlbnRWZXJzaW9uXEV4cGxvcmVyXFNoZWxsIEZvbGRlcnMiCiAgICApCiAgICBkaXIsIHR5cGUgPSBfd2lucmVnLlF1ZXJ5VmFsdWVFeChrZXksIHNoZWxsX2ZvbGRlcl9uYW1lKQogICAgcmV0dXJuIGRpcgoKCmRlZiBfZ2V0X3dpbl9mb2xkZXJfd2l0aF9weXdpbjMyKGNzaWRsX25hbWUpOgogICAgZnJvbSB3aW4zMmNvbS5zaGVsbCBpbXBvcnQgc2hlbGxjb24sIHNoZWxsCiAgICBkaXIgPSBzaGVsbC5TSEdldEZvbGRlclBhdGgoMCwgZ2V0YXR0cihzaGVsbGNvbiwgY3NpZGxfbmFtZSksIDAsIDApCiAgICAjIFRyeSB0byBtYWtlIHRoaXMgYSB1bmljb2RlIHBhdGggYmVjYXVzZSBTSEdldEZvbGRlclBhdGggZG9lcwogICAgIyBub3QgcmV0dXJuIHVuaWNvZGUgc3RyaW5ncyB3aGVuIHRoZXJlIGlzIHVuaWNvZGUgZGF0YSBpbiB0aGUKICAgICMgcGF0aC4KICAgIHRyeToKICAgICAgICBkaXIgPSB1bmljb2RlKGRpcikKCiAgICAgICAgIyBEb3duZ3JhZGUgdG8gc2hvcnQgcGF0aCBuYW1lIGlmIGhhdmUgaGlnaGJpdCBjaGFycy4gU2VlCiAgICAgICAgIyA8aHR0cDovL2J1Z3MuYWN0aXZlc3RhdGUuY29tL3Nob3dfYnVnLmNnaT9pZD04NTA5OT4uCiAgICAgICAgaGFzX2hpZ2hfY2hhciA9IEZhbHNlCiAgICAgICAgZm9yIGMgaW4gZGlyOgogICAgICAgICAgICBpZiBvcmQoYykgPiAyNTU6CiAgICAgICAgICAgICAgICBoYXNfaGlnaF9jaGFyID0gVHJ1ZQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICBpZiBoYXNfaGlnaF9jaGFyOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBpbXBvcnQgd2luMzJhcGkKICAgICAgICAgICAgICAgIGRpciA9IHdpbjMyYXBpLkdldFNob3J0UGF0aE5hbWUoZGlyKQogICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgICAgICAgICBwYXNzCiAgICBleGNlcHQgVW5pY29kZUVycm9yOgogICAgICAgIHBhc3MKICAgIHJldHVybiBkaXIKCgpkZWYgX2dldF93aW5fZm9sZGVyX3dpdGhfY3R5cGVzKGNzaWRsX25hbWUpOgogICAgaW1wb3J0IGN0eXBlcwoKICAgIGNzaWRsX2NvbnN0ID0gewogICAgICAgICJDU0lETF9BUFBEQVRBIjogMjYsCiAgICAgICAgIkNTSURMX0NPTU1PTl9BUFBEQVRBIjogMzUsCiAgICAgICAgIkNTSURMX0xPQ0FMX0FQUERBVEEiOiAyOCwKICAgIH1bY3NpZGxfbmFtZV0KCiAgICBidWYgPSBjdHlwZXMuY3JlYXRlX3VuaWNvZGVfYnVmZmVyKDEwMjQpCiAgICBjdHlwZXMud2luZGxsLnNoZWxsMzIuU0hHZXRGb2xkZXJQYXRoVyhOb25lLCBjc2lkbF9jb25zdCwgTm9uZSwgMCwgYnVmKQoKICAgICMgRG93bmdyYWRlIHRvIHNob3J0IHBhdGggbmFtZSBpZiBoYXZlIGhpZ2hiaXQgY2hhcnMuIFNlZQogICAgIyA8aHR0cDovL2J1Z3MuYWN0aXZlc3RhdGUuY29tL3Nob3dfYnVnLmNnaT9pZD04NTA5OT4uCiAgICBoYXNfaGlnaF9jaGFyID0gRmFsc2UKICAgIGZvciBjIGluIGJ1ZjoKICAgICAgICBpZiBvcmQoYykgPiAyNTU6CiAgICAgICAgICAgIGhhc19oaWdoX2NoYXIgPSBUcnVlCiAgICAgICAgICAgIGJyZWFrCiAgICBpZiBoYXNfaGlnaF9jaGFyOgogICAgICAgIGJ1ZjIgPSBjdHlwZXMuY3JlYXRlX3VuaWNvZGVfYnVmZmVyKDEwMjQpCiAgICAgICAgaWYgY3R5cGVzLndpbmRsbC5rZXJuZWwzMi5HZXRTaG9ydFBhdGhOYW1lVyhidWYudmFsdWUsIGJ1ZjIsIDEwMjQpOgogICAgICAgICAgICBidWYgPSBidWYyCgogICAgcmV0dXJuIGJ1Zi52YWx1ZQoKZGVmIF9nZXRfd2luX2ZvbGRlcl93aXRoX2puYShjc2lkbF9uYW1lKToKICAgIGltcG9ydCBhcnJheQogICAgZnJvbSBjb20uc3VuIGltcG9ydCBqbmEKICAgIGZyb20gY29tLnN1bi5qbmEucGxhdGZvcm0gaW1wb3J0IHdpbjMyCgogICAgYnVmX3NpemUgPSB3aW4zMi5XaW5EZWYuTUFYX1BBVEggKiAyCiAgICBidWYgPSBhcnJheS56ZXJvcygnYycsIGJ1Zl9zaXplKQogICAgc2hlbGwgPSB3aW4zMi5TaGVsbDMyLklOU1RBTkNFCiAgICBzaGVsbC5TSEdldEZvbGRlclBhdGgoTm9uZSwgZ2V0YXR0cih3aW4zMi5TaGxPYmosIGNzaWRsX25hbWUpLCBOb25lLCB3aW4zMi5TaGxPYmouU0hHRlBfVFlQRV9DVVJSRU5ULCBidWYpCiAgICBkaXIgPSBqbmEuTmF0aXZlLnRvU3RyaW5nKGJ1Zi50b3N0cmluZygpKS5yc3RyaXAoIlwwIikKCiAgICAjIERvd25ncmFkZSB0byBzaG9ydCBwYXRoIG5hbWUgaWYgaGF2ZSBoaWdoYml0IGNoYXJzLiBTZWUKICAgICMgPGh0dHA6Ly9idWdzLmFjdGl2ZXN0YXRlLmNvbS9zaG93X2J1Zy5jZ2k/aWQ9ODUwOTk+LgogICAgaGFzX2hpZ2hfY2hhciA9IEZhbHNlCiAgICBmb3IgYyBpbiBkaXI6CiAgICAgICAgaWYgb3JkKGMpID4gMjU1OgogICAgICAgICAgICBoYXNfaGlnaF9jaGFyID0gVHJ1ZQogICAgICAgICAgICBicmVhawogICAgaWYgaGFzX2hpZ2hfY2hhcjoKICAgICAgICBidWYgPSBhcnJheS56ZXJvcygnYycsIGJ1Zl9zaXplKQogICAgICAgIGtlcm5lbCA9IHdpbjMyLktlcm5lbDMyLklOU1RBTkNFCiAgICAgICAgaWYga2VybmFsLkdldFNob3J0UGF0aE5hbWUoZGlyLCBidWYsIGJ1Zl9zaXplKToKICAgICAgICAgICAgZGlyID0gam5hLk5hdGl2ZS50b1N0cmluZyhidWYudG9zdHJpbmcoKSkucnN0cmlwKCJcMCIpCgogICAgcmV0dXJuIGRpcgoKaWYgc3lzdGVtID09ICJ3aW4zMiI6CiAgICB0cnk6CiAgICAgICAgaW1wb3J0IHdpbjMyY29tLnNoZWxsCiAgICAgICAgX2dldF93aW5fZm9sZGVyID0gX2dldF93aW5fZm9sZGVyX3dpdGhfcHl3aW4zMgogICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgIHRyeToKICAgICAgICAgICAgZnJvbSBjdHlwZXMgaW1wb3J0IHdpbmRsbAogICAgICAgICAgICBfZ2V0X3dpbl9mb2xkZXIgPSBfZ2V0X3dpbl9mb2xkZXJfd2l0aF9jdHlwZXMKICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGltcG9ydCBjb20uc3VuLmpuYQogICAgICAgICAgICAgICAgX2dldF93aW5fZm9sZGVyID0gX2dldF93aW5fZm9sZGVyX3dpdGhfam5hCiAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICAgICAgICAgIF9nZXRfd2luX2ZvbGRlciA9IF9nZXRfd2luX2ZvbGRlcl9mcm9tX3JlZ2lzdHJ5CgoKIy0tLS0gc2VsZiB0ZXN0IGNvZGUKCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICBhcHBuYW1lID0gIk15QXBwIgogICAgYXBwYXV0aG9yID0gIk15Q29tcGFueSIKCiAgICBwcm9wcyA9ICgidXNlcl9kYXRhX2RpciIsICJzaXRlX2RhdGFfZGlyIiwKICAgICAgICAgICAgICJ1c2VyX2NvbmZpZ19kaXIiLCAic2l0ZV9jb25maWdfZGlyIiwKICAgICAgICAgICAgICJ1c2VyX2NhY2hlX2RpciIsICJ1c2VyX2xvZ19kaXIiKQoKICAgIHByaW50KCItLSBhcHAgZGlycyAod2l0aCBvcHRpb25hbCAndmVyc2lvbicpIikKICAgIGRpcnMgPSBBcHBEaXJzKGFwcG5hbWUsIGFwcGF1dGhvciwgdmVyc2lvbj0iMS4wIikKICAgIGZvciBwcm9wIGluIHByb3BzOgogICAgICAgIHByaW50KCIlczogJXMiICUgKHByb3AsIGdldGF0dHIoZGlycywgcHJvcCkpKQoKICAgIHByaW50KCJcbi0tIGFwcCBkaXJzICh3aXRob3V0IG9wdGlvbmFsICd2ZXJzaW9uJykiKQogICAgZGlycyA9IEFwcERpcnMoYXBwbmFtZSwgYXBwYXV0aG9yKQogICAgZm9yIHByb3AgaW4gcHJvcHM6CiAgICAgICAgcHJpbnQoIiVzOiAlcyIgJSAocHJvcCwgZ2V0YXR0cihkaXJzLCBwcm9wKSkpCgogICAgcHJpbnQoIlxuLS0gYXBwIGRpcnMgKHdpdGhvdXQgb3B0aW9uYWwgJ2FwcGF1dGhvcicpIikKICAgIGRpcnMgPSBBcHBEaXJzKGFwcG5hbWUpCiAgICBmb3IgcHJvcCBpbiBwcm9wczoKICAgICAgICBwcmludCgiJXM6ICVzIiAlIChwcm9wLCBnZXRhdHRyKGRpcnMsIHByb3ApKSkKCiAgICBwcmludCgiXG4tLSBhcHAgZGlycyAod2l0aCBkaXNhYmxlZCAnYXBwYXV0aG9yJykiKQogICAgZGlycyA9IEFwcERpcnMoYXBwbmFtZSwgYXBwYXV0aG9yPUZhbHNlKQogICAgZm9yIHByb3AgaW4gcHJvcHM6CiAgICAgICAgcHJpbnQoIiVzOiAlcyIgJSAocHJvcCwgZ2V0YXR0cihkaXJzLCBwcm9wKSkpClBLAwQUAAAAAAAAACEAAFasOi4BAAAuAQAAQQAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2FjaGVjb250cm9sL19faW5pdF9fLnB5IiIiQ2FjaGVDb250cm9sIGltcG9ydCBJbnRlcmZhY2UuCgpNYWtlIGl0IGVhc3kgdG8gaW1wb3J0IGZyb20gY2FjaGVjb250cm9sIHdpdGhvdXQgbG9uZyBuYW1lc3BhY2VzLgoiIiIKX19hdXRob3JfXyA9ICdFcmljIExhcnNvbicKX19lbWFpbF9fID0gJ2VyaWNAaW9ucm9jay5vcmcnCl9fdmVyc2lvbl9fID0gJzAuMTEuNycKCmZyb20gLndyYXBwZXIgaW1wb3J0IENhY2hlQ29udHJvbApmcm9tIC5hZGFwdGVyIGltcG9ydCBDYWNoZUNvbnRyb2xBZGFwdGVyCmZyb20gLmNvbnRyb2xsZXIgaW1wb3J0IENhY2hlQ29udHJvbGxlcgpQSwMEFAAAAAAAAAAhANpURqUoBQAAKAUAAD0AAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NhY2hlY29udHJvbC9fY21kLnB5aW1wb3J0IGxvZ2dpbmcKCmZyb20gcGlwLl92ZW5kb3IgaW1wb3J0IHJlcXVlc3RzCgpmcm9tIHBpcC5fdmVuZG9yLmNhY2hlY29udHJvbC5hZGFwdGVyIGltcG9ydCBDYWNoZUNvbnRyb2xBZGFwdGVyCmZyb20gcGlwLl92ZW5kb3IuY2FjaGVjb250cm9sLmNhY2hlIGltcG9ydCBEaWN0Q2FjaGUKZnJvbSBwaXAuX3ZlbmRvci5jYWNoZWNvbnRyb2wuY29udHJvbGxlciBpbXBvcnQgbG9nZ2VyCgpmcm9tIGFyZ3BhcnNlIGltcG9ydCBBcmd1bWVudFBhcnNlcgoKCmRlZiBzZXR1cF9sb2dnaW5nKCk6CiAgICBsb2dnZXIuc2V0TGV2ZWwobG9nZ2luZy5ERUJVRykKICAgIGhhbmRsZXIgPSBsb2dnaW5nLlN0cmVhbUhhbmRsZXIoKQogICAgbG9nZ2VyLmFkZEhhbmRsZXIoaGFuZGxlcikKCgpkZWYgZ2V0X3Nlc3Npb24oKToKICAgIGFkYXB0ZXIgPSBDYWNoZUNvbnRyb2xBZGFwdGVyKAogICAgICAgIERpY3RDYWNoZSgpLAogICAgICAgIGNhY2hlX2V0YWdzPVRydWUsCiAgICAgICAgc2VyaWFsaXplcj1Ob25lLAogICAgICAgIGhldXJpc3RpYz1Ob25lLAogICAgKQogICAgc2VzcyA9IHJlcXVlc3RzLlNlc3Npb24oKQogICAgc2Vzcy5tb3VudCgnaHR0cDovLycsIGFkYXB0ZXIpCiAgICBzZXNzLm1vdW50KCdodHRwczovLycsIGFkYXB0ZXIpCgogICAgc2Vzcy5jYWNoZV9jb250cm9sbGVyID0gYWRhcHRlci5jb250cm9sbGVyCiAgICByZXR1cm4gc2VzcwoKCmRlZiBnZXRfYXJncygpOgogICAgcGFyc2VyID0gQXJndW1lbnRQYXJzZXIoKQogICAgcGFyc2VyLmFkZF9hcmd1bWVudCgndXJsJywgaGVscD0nVGhlIFVSTCB0byB0cnkgYW5kIGNhY2hlJykKICAgIHJldHVybiBwYXJzZXIucGFyc2VfYXJncygpCgoKZGVmIG1haW4oYXJncz1Ob25lKToKICAgIGFyZ3MgPSBnZXRfYXJncygpCiAgICBzZXNzID0gZ2V0X3Nlc3Npb24oKQoKICAgICMgTWFrZSBhIHJlcXVlc3QgdG8gZ2V0IGEgcmVzcG9uc2UKICAgIHJlc3AgPSBzZXNzLmdldChhcmdzLnVybCkKCiAgICAjIFR1cm4gb24gbG9nZ2luZwogICAgc2V0dXBfbG9nZ2luZygpCgogICAgIyB0cnkgc2V0dGluZyB0aGUgY2FjaGUKICAgIHNlc3MuY2FjaGVfY29udHJvbGxlci5jYWNoZV9yZXNwb25zZShyZXNwLnJlcXVlc3QsIHJlc3AucmF3KQoKICAgICMgTm93IHRyeSB0byBnZXQgaXQKICAgIGlmIHNlc3MuY2FjaGVfY29udHJvbGxlci5jYWNoZWRfcmVxdWVzdChyZXNwLnJlcXVlc3QpOgogICAgICAgIHByaW50KCdDYWNoZWQhJykKICAgIGVsc2U6CiAgICAgICAgcHJpbnQoJ05vdCBjYWNoZWQgOignKQoKCmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICBtYWluKCkKUEsDBBQAAAAAAAAAIQBQ5qksABIAAAASAABAAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jYWNoZWNvbnRyb2wvYWRhcHRlci5weWltcG9ydCB0eXBlcwppbXBvcnQgZnVuY3Rvb2xzCgpmcm9tIHBpcC5fdmVuZG9yLnJlcXVlc3RzLmFkYXB0ZXJzIGltcG9ydCBIVFRQQWRhcHRlcgoKZnJvbSAuY29udHJvbGxlciBpbXBvcnQgQ2FjaGVDb250cm9sbGVyCmZyb20gLmNhY2hlIGltcG9ydCBEaWN0Q2FjaGUKZnJvbSAuZmlsZXdyYXBwZXIgaW1wb3J0IENhbGxiYWNrRmlsZVdyYXBwZXIKCgpjbGFzcyBDYWNoZUNvbnRyb2xBZGFwdGVyKEhUVFBBZGFwdGVyKToKICAgIGludmFsaWRhdGluZ19tZXRob2RzID0gc2V0KFsnUFVUJywgJ0RFTEVURSddKQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjYWNoZT1Ob25lLAogICAgICAgICAgICAgICAgIGNhY2hlX2V0YWdzPVRydWUsCiAgICAgICAgICAgICAgICAgY29udHJvbGxlcl9jbGFzcz1Ob25lLAogICAgICAgICAgICAgICAgIHNlcmlhbGl6ZXI9Tm9uZSwKICAgICAgICAgICAgICAgICBoZXVyaXN0aWM9Tm9uZSwKICAgICAgICAgICAgICAgICAqYXJncywgKiprdyk6CiAgICAgICAgc3VwZXIoQ2FjaGVDb250cm9sQWRhcHRlciwgc2VsZikuX19pbml0X18oKmFyZ3MsICoqa3cpCiAgICAgICAgc2VsZi5jYWNoZSA9IGNhY2hlIG9yIERpY3RDYWNoZSgpCiAgICAgICAgc2VsZi5oZXVyaXN0aWMgPSBoZXVyaXN0aWMKCiAgICAgICAgY29udHJvbGxlcl9mYWN0b3J5ID0gY29udHJvbGxlcl9jbGFzcyBvciBDYWNoZUNvbnRyb2xsZXIKICAgICAgICBzZWxmLmNvbnRyb2xsZXIgPSBjb250cm9sbGVyX2ZhY3RvcnkoCiAgICAgICAgICAgIHNlbGYuY2FjaGUsCiAgICAgICAgICAgIGNhY2hlX2V0YWdzPWNhY2hlX2V0YWdzLAogICAgICAgICAgICBzZXJpYWxpemVyPXNlcmlhbGl6ZXIsCiAgICAgICAgKQoKICAgIGRlZiBzZW5kKHNlbGYsIHJlcXVlc3QsICoqa3cpOgogICAgICAgICIiIgogICAgICAgIFNlbmQgYSByZXF1ZXN0LiBVc2UgdGhlIHJlcXVlc3QgaW5mb3JtYXRpb24gdG8gc2VlIGlmIGl0CiAgICAgICAgZXhpc3RzIGluIHRoZSBjYWNoZSBhbmQgY2FjaGUgdGhlIHJlc3BvbnNlIGlmIHdlIG5lZWQgdG8gYW5kIGNhbi4KICAgICAgICAiIiIKICAgICAgICBpZiByZXF1ZXN0Lm1ldGhvZCA9PSAnR0VUJzoKICAgICAgICAgICAgY2FjaGVkX3Jlc3BvbnNlID0gc2VsZi5jb250cm9sbGVyLmNhY2hlZF9yZXF1ZXN0KHJlcXVlc3QpCiAgICAgICAgICAgIGlmIGNhY2hlZF9yZXNwb25zZToKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmJ1aWxkX3Jlc3BvbnNlKHJlcXVlc3QsIGNhY2hlZF9yZXNwb25zZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21fY2FjaGU9VHJ1ZSkKCiAgICAgICAgICAgICMgY2hlY2sgZm9yIGV0YWdzIGFuZCBhZGQgaGVhZGVycyBpZiBhcHByb3ByaWF0ZQogICAgICAgICAgICByZXF1ZXN0LmhlYWRlcnMudXBkYXRlKAogICAgICAgICAgICAgICAgc2VsZi5jb250cm9sbGVyLmNvbmRpdGlvbmFsX2hlYWRlcnMocmVxdWVzdCkKICAgICAgICAgICAgKQoKICAgICAgICByZXNwID0gc3VwZXIoQ2FjaGVDb250cm9sQWRhcHRlciwgc2VsZikuc2VuZChyZXF1ZXN0LCAqKmt3KQoKICAgICAgICByZXR1cm4gcmVzcAoKICAgIGRlZiBidWlsZF9yZXNwb25zZShzZWxmLCByZXF1ZXN0LCByZXNwb25zZSwgZnJvbV9jYWNoZT1GYWxzZSk6CiAgICAgICAgIiIiCiAgICAgICAgQnVpbGQgYSByZXNwb25zZSBieSBtYWtpbmcgYSByZXF1ZXN0IG9yIHVzaW5nIHRoZSBjYWNoZS4KCiAgICAgICAgVGhpcyB3aWxsIGVuZCB1cCBjYWxsaW5nIHNlbmQgYW5kIHJldHVybmluZyBhIHBvdGVudGlhbGx5CiAgICAgICAgY2FjaGVkIHJlc3BvbnNlCiAgICAgICAgIiIiCiAgICAgICAgaWYgbm90IGZyb21fY2FjaGUgYW5kIHJlcXVlc3QubWV0aG9kID09ICdHRVQnOgogICAgICAgICAgICAjIENoZWNrIGZvciBhbnkgaGV1cmlzdGljcyB0aGF0IG1pZ2h0IHVwZGF0ZSBoZWFkZXJzCiAgICAgICAgICAgICMgYmVmb3JlIHRyeWluZyB0byBjYWNoZS4KICAgICAgICAgICAgaWYgc2VsZi5oZXVyaXN0aWM6CiAgICAgICAgICAgICAgICByZXNwb25zZSA9IHNlbGYuaGV1cmlzdGljLmFwcGx5KHJlc3BvbnNlKQoKICAgICAgICAgICAgIyBhcHBseSBhbnkgZXhwaXJhdGlvbiBoZXVyaXN0aWNzCiAgICAgICAgICAgIGlmIHJlc3BvbnNlLnN0YXR1cyA9PSAzMDQ6CiAgICAgICAgICAgICAgICAjIFdlIG11c3QgaGF2ZSBzZW50IGFuIEVUYWcgcmVxdWVzdC4gVGhpcyBjb3VsZCBtZWFuCiAgICAgICAgICAgICAgICAjIHRoYXQgd2UndmUgYmVlbiBleHBpcmVkIGFscmVhZHkgb3IgdGhhdCB3ZSBzaW1wbHkKICAgICAgICAgICAgICAgICMgaGF2ZSBhbiBldGFnLiBJbiBlaXRoZXIgY2FzZSwgd2Ugd2FudCB0byB0cnkgYW5kCiAgICAgICAgICAgICAgICAjIHVwZGF0ZSB0aGUgY2FjaGUgaWYgdGhhdCBpcyB0aGUgY2FzZS4KICAgICAgICAgICAgICAgIGNhY2hlZF9yZXNwb25zZSA9IHNlbGYuY29udHJvbGxlci51cGRhdGVfY2FjaGVkX3Jlc3BvbnNlKAogICAgICAgICAgICAgICAgICAgIHJlcXVlc3QsIHJlc3BvbnNlCiAgICAgICAgICAgICAgICApCgogICAgICAgICAgICAgICAgaWYgY2FjaGVkX3Jlc3BvbnNlIGlzIG5vdCByZXNwb25zZToKICAgICAgICAgICAgICAgICAgICBmcm9tX2NhY2hlID0gVHJ1ZQoKICAgICAgICAgICAgICAgICMgV2UgYXJlIGRvbmUgd2l0aCB0aGUgc2VydmVyIHJlc3BvbnNlLCByZWFkIGEKICAgICAgICAgICAgICAgICMgcG9zc2libGUgcmVzcG9uc2UgYm9keSAoY29tcGxpYW50IHNlcnZlcnMgd2lsbAogICAgICAgICAgICAgICAgIyBub3QgcmV0dXJuIG9uZSwgYnV0IHdlIGNhbm5vdCBiZSAxMDAlIHN1cmUpIGFuZAogICAgICAgICAgICAgICAgIyByZWxlYXNlIHRoZSBjb25uZWN0aW9uIGJhY2sgdG8gdGhlIHBvb2wuCiAgICAgICAgICAgICAgICByZXNwb25zZS5yZWFkKGRlY29kZV9jb250ZW50PUZhbHNlKQogICAgICAgICAgICAgICAgcmVzcG9uc2UucmVsZWFzZV9jb25uKCkKCiAgICAgICAgICAgICAgICByZXNwb25zZSA9IGNhY2hlZF9yZXNwb25zZQoKICAgICAgICAgICAgIyBXZSBhbHdheXMgY2FjaGUgdGhlIDMwMSByZXNwb25zZXMKICAgICAgICAgICAgZWxpZiByZXNwb25zZS5zdGF0dXMgPT0gMzAxOgogICAgICAgICAgICAgICAgc2VsZi5jb250cm9sbGVyLmNhY2hlX3Jlc3BvbnNlKHJlcXVlc3QsIHJlc3BvbnNlKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBXcmFwIHRoZSByZXNwb25zZSBmaWxlIHdpdGggYSB3cmFwcGVyIHRoYXQgd2lsbCBjYWNoZSB0aGUKICAgICAgICAgICAgICAgICMgICByZXNwb25zZSB3aGVuIHRoZSBzdHJlYW0gaGFzIGJlZW4gY29uc3VtZWQuCiAgICAgICAgICAgICAgICByZXNwb25zZS5fZnAgPSBDYWxsYmFja0ZpbGVXcmFwcGVyKAogICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLl9mcCwKICAgICAgICAgICAgICAgICAgICBmdW5jdG9vbHMucGFydGlhbCgKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sbGVyLmNhY2hlX3Jlc3BvbnNlLAogICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LAogICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSwKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBpZiByZXNwb25zZS5jaHVua2VkOgogICAgICAgICAgICAgICAgICAgIHN1cGVyX3VwZGF0ZV9jaHVua19sZW5ndGggPSByZXNwb25zZS5fdXBkYXRlX2NodW5rX2xlbmd0aAoKICAgICAgICAgICAgICAgICAgICBkZWYgX3VwZGF0ZV9jaHVua19sZW5ndGgoc2VsZik6CiAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyX3VwZGF0ZV9jaHVua19sZW5ndGgoKQogICAgICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmNodW5rX2xlZnQgPT0gMDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2ZwLl9jbG9zZSgpCiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuX3VwZGF0ZV9jaHVua19sZW5ndGggPSB0eXBlcy5NZXRob2RUeXBlKF91cGRhdGVfY2h1bmtfbGVuZ3RoLCByZXNwb25zZSkKCiAgICAgICAgcmVzcCA9IHN1cGVyKENhY2hlQ29udHJvbEFkYXB0ZXIsIHNlbGYpLmJ1aWxkX3Jlc3BvbnNlKAogICAgICAgICAgICByZXF1ZXN0LCByZXNwb25zZQogICAgICAgICkKCiAgICAgICAgIyBTZWUgaWYgd2Ugc2hvdWxkIGludmFsaWRhdGUgdGhlIGNhY2hlLgogICAgICAgIGlmIHJlcXVlc3QubWV0aG9kIGluIHNlbGYuaW52YWxpZGF0aW5nX21ldGhvZHMgYW5kIHJlc3Aub2s6CiAgICAgICAgICAgIGNhY2hlX3VybCA9IHNlbGYuY29udHJvbGxlci5jYWNoZV91cmwocmVxdWVzdC51cmwpCiAgICAgICAgICAgIHNlbGYuY2FjaGUuZGVsZXRlKGNhY2hlX3VybCkKCiAgICAgICAgIyBHaXZlIHRoZSByZXF1ZXN0IGEgZnJvbV9jYWNoZSBhdHRyIHRvIGxldCBwZW9wbGUgdXNlIGl0CiAgICAgICAgcmVzcC5mcm9tX2NhY2hlID0gZnJvbV9jYWNoZQoKICAgICAgICByZXR1cm4gcmVzcAoKICAgIGRlZiBjbG9zZShzZWxmKToKICAgICAgICBzZWxmLmNhY2hlLmNsb3NlKCkKICAgICAgICBzdXBlcihDYWNoZUNvbnRyb2xBZGFwdGVyLCBzZWxmKS5jbG9zZSgpClBLAwQUAAAAAAAAACEAEqrG8BYDAAAWAwAAPgAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2FjaGVjb250cm9sL2NhY2hlLnB5IiIiClRoZSBjYWNoZSBvYmplY3QgQVBJIGZvciBpbXBsZW1lbnRpbmcgY2FjaGVzLiBUaGUgZGVmYXVsdCBpcyBhIHRocmVhZApzYWZlIGluLW1lbW9yeSBkaWN0aW9uYXJ5LgoiIiIKZnJvbSB0aHJlYWRpbmcgaW1wb3J0IExvY2sKCgpjbGFzcyBCYXNlQ2FjaGUob2JqZWN0KToKCiAgICBkZWYgZ2V0KHNlbGYsIGtleSk6CiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWQoKQoKICAgIGRlZiBzZXQoc2VsZiwga2V5LCB2YWx1ZSk6CiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWQoKQoKICAgIGRlZiBkZWxldGUoc2VsZiwga2V5KToKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZCgpCgogICAgZGVmIGNsb3NlKHNlbGYpOgogICAgICAgIHBhc3MKCgpjbGFzcyBEaWN0Q2FjaGUoQmFzZUNhY2hlKToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgaW5pdF9kaWN0PU5vbmUpOgogICAgICAgIHNlbGYubG9jayA9IExvY2soKQogICAgICAgIHNlbGYuZGF0YSA9IGluaXRfZGljdCBvciB7fQoKICAgIGRlZiBnZXQoc2VsZiwga2V5KToKICAgICAgICByZXR1cm4gc2VsZi5kYXRhLmdldChrZXksIE5vbmUpCgogICAgZGVmIHNldChzZWxmLCBrZXksIHZhbHVlKToKICAgICAgICB3aXRoIHNlbGYubG9jazoKICAgICAgICAgICAgc2VsZi5kYXRhLnVwZGF0ZSh7a2V5OiB2YWx1ZX0pCgogICAgZGVmIGRlbGV0ZShzZWxmLCBrZXkpOgogICAgICAgIHdpdGggc2VsZi5sb2NrOgogICAgICAgICAgICBpZiBrZXkgaW4gc2VsZi5kYXRhOgogICAgICAgICAgICAgICAgc2VsZi5kYXRhLnBvcChrZXkpClBLAwQUAAAAAAAAACEAnh1W/HEBAABxAQAASAAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2FjaGVjb250cm9sL2NhY2hlcy9fX2luaXRfXy5weWZyb20gdGV4dHdyYXAgaW1wb3J0IGRlZGVudAoKdHJ5OgogICAgZnJvbSAuZmlsZV9jYWNoZSBpbXBvcnQgRmlsZUNhY2hlCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIG5vdGljZSA9IGRlZGVudCgnJycKICAgIE5PVEU6IEluIG9yZGVyIHRvIHVzZSB0aGUgRmlsZUNhY2hlIHlvdSBtdXN0IGhhdmUKICAgIGxvY2tmaWxlIGluc3RhbGxlZC4gWW91IGNhbiBpbnN0YWxsIGl0IHZpYSBwaXA6CiAgICAgIHBpcCBpbnN0YWxsIGxvY2tmaWxlCiAgICAnJycpCiAgICBwcmludChub3RpY2UpCgoKdHJ5OgogICAgaW1wb3J0IHJlZGlzCiAgICBmcm9tIC5yZWRpc19jYWNoZSBpbXBvcnQgUmVkaXNDYWNoZQpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBwYXNzClBLAwQUAAAAAAAAACEAwacG/8wNAADMDQAASgAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2FjaGVjb250cm9sL2NhY2hlcy9maWxlX2NhY2hlLnB5aW1wb3J0IGhhc2hsaWIKaW1wb3J0IG9zCgpmcm9tIHBpcC5fdmVuZG9yLmxvY2tmaWxlIGltcG9ydCBMb2NrRmlsZQpmcm9tIHBpcC5fdmVuZG9yLmxvY2tmaWxlLm1rZGlybG9ja2ZpbGUgaW1wb3J0IE1rZGlyTG9ja0ZpbGUKCmZyb20gLi5jYWNoZSBpbXBvcnQgQmFzZUNhY2hlCmZyb20gLi5jb250cm9sbGVyIGltcG9ydCBDYWNoZUNvbnRyb2xsZXIKCgpkZWYgX3NlY3VyZV9vcGVuX3dyaXRlKGZpbGVuYW1lLCBmbW9kZSk6CiAgICAjIFdlIG9ubHkgd2FudCB0byB3cml0ZSB0byB0aGlzIGZpbGUsIHNvIG9wZW4gaXQgaW4gd3JpdGUgb25seSBtb2RlCiAgICBmbGFncyA9IG9zLk9fV1JPTkxZCgogICAgIyBvcy5PX0NSRUFUIHwgb3MuT19FWENMIHdpbGwgZmFpbCBpZiB0aGUgZmlsZSBhbHJlYWR5IGV4aXN0cywgc28gd2Ugb25seQogICAgIyAgd2lsbCBvcGVuICpuZXcqIGZpbGVzLgogICAgIyBXZSBzcGVjaWZ5IHRoaXMgYmVjYXVzZSB3ZSB3YW50IHRvIGVuc3VyZSB0aGF0IHRoZSBtb2RlIHdlIHBhc3MgaXMgdGhlCiAgICAjIG1vZGUgb2YgdGhlIGZpbGUuCiAgICBmbGFncyB8PSBvcy5PX0NSRUFUIHwgb3MuT19FWENMCgogICAgIyBEbyBub3QgZm9sbG93IHN5bWxpbmtzIHRvIHByZXZlbnQgc29tZW9uZSBmcm9tIG1ha2luZyBhIHN5bWxpbmsgdGhhdAogICAgIyB3ZSBmb2xsb3cgYW5kIGluc2VjdXJlbHkgb3BlbiBhIGNhY2hlIGZpbGUuCiAgICBpZiBoYXNhdHRyKG9zLCAiT19OT0ZPTExPVyIpOgogICAgICAgIGZsYWdzIHw9IG9zLk9fTk9GT0xMT1cKCiAgICAjIE9uIFdpbmRvd3Mgd2UnbGwgbWFyayB0aGlzIGZpbGUgYXMgYmluYXJ5CiAgICBpZiBoYXNhdHRyKG9zLCAiT19CSU5BUlkiKToKICAgICAgICBmbGFncyB8PSBvcy5PX0JJTkFSWQoKICAgICMgQmVmb3JlIHdlIG9wZW4gb3VyIGZpbGUsIHdlIHdhbnQgdG8gZGVsZXRlIGFueSBleGlzdGluZyBmaWxlIHRoYXQgaXMKICAgICMgdGhlcmUKICAgIHRyeToKICAgICAgICBvcy5yZW1vdmUoZmlsZW5hbWUpCiAgICBleGNlcHQgKElPRXJyb3IsIE9TRXJyb3IpOgogICAgICAgICMgVGhlIGZpbGUgbXVzdCBub3QgZXhpc3QgYWxyZWFkeSwgc28gd2UgY2FuIGp1c3Qgc2tpcCBhaGVhZCB0byBvcGVuaW5nCiAgICAgICAgcGFzcwoKICAgICMgT3BlbiBvdXIgZmlsZSwgdGhlIHVzZSBvZiBvcy5PX0NSRUFUIHwgb3MuT19FWENMIHdpbGwgZW5zdXJlIHRoYXQgaWYgYQogICAgIyByYWNlIGNvbmRpdGlvbiBoYXBwZW5zIGJldHdlZW4gdGhlIG9zLnJlbW92ZSBhbmQgdGhpcyBsaW5lLCB0aGF0IGFuCiAgICAjIGVycm9yIHdpbGwgYmUgcmFpc2VkLiBCZWNhdXNlIHdlIHV0aWxpemUgYSBsb2NrZmlsZSB0aGlzIHNob3VsZCBvbmx5CiAgICAjIGhhcHBlbiBpZiBzb21lb25lIGlzIGF0dGVtcHRpbmcgdG8gYXR0YWNrIHVzLgogICAgZmQgPSBvcy5vcGVuKGZpbGVuYW1lLCBmbGFncywgZm1vZGUpCiAgICB0cnk6CiAgICAgICAgcmV0dXJuIG9zLmZkb3BlbihmZCwgIndiIikKICAgIGV4Y2VwdDoKICAgICAgICAjIEFuIGVycm9yIG9jY3VycmVkIHdyYXBwaW5nIG91ciBGRCBpbiBhIGZpbGUgb2JqZWN0CiAgICAgICAgb3MuY2xvc2UoZmQpCiAgICAgICAgcmFpc2UKCgpjbGFzcyBGaWxlQ2FjaGUoQmFzZUNhY2hlKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkaXJlY3RvcnksIGZvcmV2ZXI9RmFsc2UsIGZpbGVtb2RlPTBvMDYwMCwKICAgICAgICAgICAgICAgICBkaXJtb2RlPTBvMDcwMCwgdXNlX2Rpcl9sb2NrPU5vbmUsIGxvY2tfY2xhc3M9Tm9uZSk6CgogICAgICAgIGlmIHVzZV9kaXJfbG9jayBpcyBub3QgTm9uZSBhbmQgbG9ja19jbGFzcyBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiQ2Fubm90IHVzZSB1c2VfZGlyX2xvY2sgYW5kIGxvY2tfY2xhc3MgdG9nZXRoZXIiKQoKICAgICAgICBpZiB1c2VfZGlyX2xvY2s6CiAgICAgICAgICAgIGxvY2tfY2xhc3MgPSBNa2RpckxvY2tGaWxlCgogICAgICAgIGlmIGxvY2tfY2xhc3MgaXMgTm9uZToKICAgICAgICAgICAgbG9ja19jbGFzcyA9IExvY2tGaWxlCgogICAgICAgIHNlbGYuZGlyZWN0b3J5ID0gZGlyZWN0b3J5CiAgICAgICAgc2VsZi5mb3JldmVyID0gZm9yZXZlcgogICAgICAgIHNlbGYuZmlsZW1vZGUgPSBmaWxlbW9kZQogICAgICAgIHNlbGYuZGlybW9kZSA9IGRpcm1vZGUKICAgICAgICBzZWxmLmxvY2tfY2xhc3MgPSBsb2NrX2NsYXNzCgoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBlbmNvZGUoeCk6CiAgICAgICAgcmV0dXJuIGhhc2hsaWIuc2hhMjI0KHguZW5jb2RlKCkpLmhleGRpZ2VzdCgpCgogICAgZGVmIF9mbihzZWxmLCBuYW1lKToKICAgICAgICAjIE5PVEU6IFRoaXMgbWV0aG9kIHNob3VsZCBub3QgY2hhbmdlIGFzIHNvbWUgbWF5IGRlcGVuZCBvbiBpdC4KICAgICAgICAjICAgICAgIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2lvbnJvY2svY2FjaGVjb250cm9sL2lzc3Vlcy82MwogICAgICAgIGhhc2hlZCA9IHNlbGYuZW5jb2RlKG5hbWUpCiAgICAgICAgcGFydHMgPSBsaXN0KGhhc2hlZFs6NV0pICsgW2hhc2hlZF0KICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKHNlbGYuZGlyZWN0b3J5LCAqcGFydHMpCgogICAgZGVmIGdldChzZWxmLCBrZXkpOgogICAgICAgIG5hbWUgPSBzZWxmLl9mbihrZXkpCiAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKG5hbWUpOgogICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgICAgICB3aXRoIG9wZW4obmFtZSwgJ3JiJykgYXMgZmg6CiAgICAgICAgICAgIHJldHVybiBmaC5yZWFkKCkKCiAgICBkZWYgc2V0KHNlbGYsIGtleSwgdmFsdWUpOgogICAgICAgIG5hbWUgPSBzZWxmLl9mbihrZXkpCgogICAgICAgICMgTWFrZSBzdXJlIHRoZSBkaXJlY3RvcnkgZXhpc3RzCiAgICAgICAgdHJ5OgogICAgICAgICAgICBvcy5tYWtlZGlycyhvcy5wYXRoLmRpcm5hbWUobmFtZSksIHNlbGYuZGlybW9kZSkKICAgICAgICBleGNlcHQgKElPRXJyb3IsIE9TRXJyb3IpOgogICAgICAgICAgICBwYXNzCgogICAgICAgIHdpdGggc2VsZi5sb2NrX2NsYXNzKG5hbWUpIGFzIGxvY2s6CiAgICAgICAgICAgICMgV3JpdGUgb3VyIGFjdHVhbCBmaWxlCiAgICAgICAgICAgIHdpdGggX3NlY3VyZV9vcGVuX3dyaXRlKGxvY2sucGF0aCwgc2VsZi5maWxlbW9kZSkgYXMgZmg6CiAgICAgICAgICAgICAgICBmaC53cml0ZSh2YWx1ZSkKCiAgICBkZWYgZGVsZXRlKHNlbGYsIGtleSk6CiAgICAgICAgbmFtZSA9IHNlbGYuX2ZuKGtleSkKICAgICAgICBpZiBub3Qgc2VsZi5mb3JldmVyOgogICAgICAgICAgICBvcy5yZW1vdmUobmFtZSkKCgpkZWYgdXJsX3RvX2ZpbGVfcGF0aCh1cmwsIGZpbGVjYWNoZSk6CiAgICAiIiJSZXR1cm4gdGhlIGZpbGUgY2FjaGUgcGF0aCBiYXNlZCBvbiB0aGUgVVJMLgoKICAgIFRoaXMgZG9lcyBub3QgZW5zdXJlIHRoZSBmaWxlIGV4aXN0cyEKICAgICIiIgogICAga2V5ID0gQ2FjaGVDb250cm9sbGVyLmNhY2hlX3VybCh1cmwpCiAgICByZXR1cm4gZmlsZWNhY2hlLl9mbihrZXkpClBLAwQUAAAAAAAAACEA04jGVM0DAADNAwAASwAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2FjaGVjb250cm9sL2NhY2hlcy9yZWRpc19jYWNoZS5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgZGl2aXNpb24KCmZyb20gZGF0ZXRpbWUgaW1wb3J0IGRhdGV0aW1lCgoKZGVmIHRvdGFsX3NlY29uZHModGQpOgogICAgIiIiUHl0aG9uIDIuNiBjb21wYXRhYmlsaXR5IiIiCiAgICBpZiBoYXNhdHRyKHRkLCAndG90YWxfc2Vjb25kcycpOgogICAgICAgIHJldHVybiB0ZC50b3RhbF9zZWNvbmRzKCkKCiAgICBtcyA9IHRkLm1pY3Jvc2Vjb25kcwogICAgc2VjcyA9ICh0ZC5zZWNvbmRzICsgdGQuZGF5cyAqIDI0ICogMzYwMCkKICAgIHJldHVybiAobXMgKyBzZWNzICogMTAqKjYpIC8gMTAqKjYKCgpjbGFzcyBSZWRpc0NhY2hlKG9iamVjdCk6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbm4pOgogICAgICAgIHNlbGYuY29ubiA9IGNvbm4KCiAgICBkZWYgZ2V0KHNlbGYsIGtleSk6CiAgICAgICAgcmV0dXJuIHNlbGYuY29ubi5nZXQoa2V5KQoKICAgIGRlZiBzZXQoc2VsZiwga2V5LCB2YWx1ZSwgZXhwaXJlcz1Ob25lKToKICAgICAgICBpZiBub3QgZXhwaXJlczoKICAgICAgICAgICAgc2VsZi5jb25uLnNldChrZXksIHZhbHVlKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGV4cGlyZXMgPSBleHBpcmVzIC0gZGF0ZXRpbWUubm93KCkKICAgICAgICAgICAgc2VsZi5jb25uLnNldGV4KGtleSwgdG90YWxfc2Vjb25kcyhleHBpcmVzKSwgdmFsdWUpCgogICAgZGVmIGRlbGV0ZShzZWxmLCBrZXkpOgogICAgICAgIHNlbGYuY29ubi5kZWxldGUoa2V5KQoKICAgIGRlZiBjbGVhcihzZWxmKToKICAgICAgICAiIiJIZWxwZXIgZm9yIGNsZWFyaW5nIGFsbCB0aGUga2V5cyBpbiBhIGRhdGFiYXNlLiBVc2Ugd2l0aAogICAgICAgIGNhdXRpb24hIiIiCiAgICAgICAgZm9yIGtleSBpbiBzZWxmLmNvbm4ua2V5cygpOgogICAgICAgICAgICBzZWxmLmNvbm4uZGVsZXRlKGtleSkKCiAgICBkZWYgY2xvc2Uoc2VsZik6CiAgICAgICAgc2VsZi5jb25uLmRpc2Nvbm5lY3QoKQpQSwMEFAAAAAAAAAAhAC08LTN8AQAAfAEAAD8AAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NhY2hlY29udHJvbC9jb21wYXQucHl0cnk6CiAgICBmcm9tIHVybGxpYi5wYXJzZSBpbXBvcnQgdXJsam9pbgpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBmcm9tIHVybHBhcnNlIGltcG9ydCB1cmxqb2luCgoKdHJ5OgogICAgaW1wb3J0IGNQaWNrbGUgYXMgcGlja2xlCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGltcG9ydCBwaWNrbGUKCgpmcm9tIHBpcC5fdmVuZG9yLnVybGxpYjMucmVzcG9uc2UgaW1wb3J0IEhUVFBSZXNwb25zZQpmcm9tIHBpcC5fdmVuZG9yLnVybGxpYjMudXRpbCBpbXBvcnQgaXNfZnBfY2xvc2VkCgojIFJlcGxpY2F0ZSBzb21lIHNpeCBiZWhhdmlvdXIKdHJ5OgogICAgdGV4dF90eXBlID0gKHVuaWNvZGUsKQpleGNlcHQgTmFtZUVycm9yOgogICAgdGV4dF90eXBlID0gKHN0ciwpClBLAwQUAAAAAAAAACEAx2C53uAyAADgMgAAQwAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2FjaGVjb250cm9sL2NvbnRyb2xsZXIucHkiIiIKVGhlIGh0dHBsaWIyIGFsZ29yaXRobXMgcG9ydGVkIGZvciB1c2Ugd2l0aCByZXF1ZXN0cy4KIiIiCmltcG9ydCBsb2dnaW5nCmltcG9ydCByZQppbXBvcnQgY2FsZW5kYXIKaW1wb3J0IHRpbWUKZnJvbSBlbWFpbC51dGlscyBpbXBvcnQgcGFyc2VkYXRlX3R6Cgpmcm9tIHBpcC5fdmVuZG9yLnJlcXVlc3RzLnN0cnVjdHVyZXMgaW1wb3J0IENhc2VJbnNlbnNpdGl2ZURpY3QKCmZyb20gLmNhY2hlIGltcG9ydCBEaWN0Q2FjaGUKZnJvbSAuc2VyaWFsaXplIGltcG9ydCBTZXJpYWxpemVyCgoKbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgpVUkkgPSByZS5jb21waWxlKHIiXigoW146Lz8jXSspOik/KC8vKFteLz8jXSopKT8oW14/I10qKShcPyhbXiNdKikpPygjKC4qKSk/IikKCgpkZWYgcGFyc2VfdXJpKHVyaSk6CiAgICAiIiJQYXJzZXMgYSBVUkkgdXNpbmcgdGhlIHJlZ2V4IGdpdmVuIGluIEFwcGVuZGl4IEIgb2YgUkZDIDM5ODYuCgogICAgICAgIChzY2hlbWUsIGF1dGhvcml0eSwgcGF0aCwgcXVlcnksIGZyYWdtZW50KSA9IHBhcnNlX3VyaSh1cmkpCiAgICAiIiIKICAgIGdyb3VwcyA9IFVSSS5tYXRjaCh1cmkpLmdyb3VwcygpCiAgICByZXR1cm4gKGdyb3Vwc1sxXSwgZ3JvdXBzWzNdLCBncm91cHNbNF0sIGdyb3Vwc1s2XSwgZ3JvdXBzWzhdKQoKCmNsYXNzIENhY2hlQ29udHJvbGxlcihvYmplY3QpOgogICAgIiIiQW4gaW50ZXJmYWNlIHRvIHNlZSBpZiByZXF1ZXN0IHNob3VsZCBjYWNoZWQgb3Igbm90LgogICAgIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgY2FjaGU9Tm9uZSwgY2FjaGVfZXRhZ3M9VHJ1ZSwgc2VyaWFsaXplcj1Ob25lKToKICAgICAgICBzZWxmLmNhY2hlID0gY2FjaGUgb3IgRGljdENhY2hlKCkKICAgICAgICBzZWxmLmNhY2hlX2V0YWdzID0gY2FjaGVfZXRhZ3MKICAgICAgICBzZWxmLnNlcmlhbGl6ZXIgPSBzZXJpYWxpemVyIG9yIFNlcmlhbGl6ZXIoKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF91cmxub3JtKGNscywgdXJpKToKICAgICAgICAiIiJOb3JtYWxpemUgdGhlIFVSTCB0byBjcmVhdGUgYSBzYWZlIGtleSBmb3IgdGhlIGNhY2hlIiIiCiAgICAgICAgKHNjaGVtZSwgYXV0aG9yaXR5LCBwYXRoLCBxdWVyeSwgZnJhZ21lbnQpID0gcGFyc2VfdXJpKHVyaSkKICAgICAgICBpZiBub3Qgc2NoZW1lIG9yIG5vdCBhdXRob3JpdHk6CiAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiT25seSBhYnNvbHV0ZSBVUklzIGFyZSBhbGxvd2VkLiB1cmkgPSAlcyIgJSB1cmkpCgogICAgICAgIHNjaGVtZSA9IHNjaGVtZS5sb3dlcigpCiAgICAgICAgYXV0aG9yaXR5ID0gYXV0aG9yaXR5Lmxvd2VyKCkKCiAgICAgICAgaWYgbm90IHBhdGg6CiAgICAgICAgICAgIHBhdGggPSAiLyIKCiAgICAgICAgIyBDb3VsZCBkbyBzeW50YXggYmFzZWQgbm9ybWFsaXphdGlvbiBvZiB0aGUgVVJJIGJlZm9yZQogICAgICAgICMgY29tcHV0aW5nIHRoZSBkaWdlc3QuIFNlZSBTZWN0aW9uIDYuMi4yIG9mIFN0ZCA2Ni4KICAgICAgICByZXF1ZXN0X3VyaSA9IHF1ZXJ5IGFuZCAiPyIuam9pbihbcGF0aCwgcXVlcnldKSBvciBwYXRoCiAgICAgICAgZGVmcmFnX3VyaSA9IHNjaGVtZSArICI6Ly8iICsgYXV0aG9yaXR5ICsgcmVxdWVzdF91cmkKCiAgICAgICAgcmV0dXJuIGRlZnJhZ191cmkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBjYWNoZV91cmwoY2xzLCB1cmkpOgogICAgICAgIHJldHVybiBjbHMuX3VybG5vcm0odXJpKQoKICAgIGRlZiBwYXJzZV9jYWNoZV9jb250cm9sKHNlbGYsIGhlYWRlcnMpOgogICAgICAgICIiIgogICAgICAgIFBhcnNlIHRoZSBjYWNoZSBjb250cm9sIGhlYWRlcnMgcmV0dXJuaW5nIGEgZGljdGlvbmFyeSB3aXRoIHZhbHVlcwogICAgICAgIGZvciB0aGUgZGlmZmVyZW50IGRpcmVjdGl2ZXMuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dmFsID0ge30KCiAgICAgICAgY2NfaGVhZGVyID0gJ2NhY2hlLWNvbnRyb2wnCiAgICAgICAgaWYgJ0NhY2hlLUNvbnRyb2wnIGluIGhlYWRlcnM6CiAgICAgICAgICAgIGNjX2hlYWRlciA9ICdDYWNoZS1Db250cm9sJwoKICAgICAgICBpZiBjY19oZWFkZXIgaW4gaGVhZGVyczoKICAgICAgICAgICAgcGFydHMgPSBoZWFkZXJzW2NjX2hlYWRlcl0uc3BsaXQoJywnKQogICAgICAgICAgICBwYXJ0c193aXRoX2FyZ3MgPSBbCiAgICAgICAgICAgICAgICB0dXBsZShbeC5zdHJpcCgpLmxvd2VyKCkgZm9yIHggaW4gcGFydC5zcGxpdCgiPSIsIDEpXSkKICAgICAgICAgICAgICAgIGZvciBwYXJ0IGluIHBhcnRzIGlmIC0xICE9IHBhcnQuZmluZCgiPSIpCiAgICAgICAgICAgIF0KICAgICAgICAgICAgcGFydHNfd29fYXJncyA9IFsKICAgICAgICAgICAgICAgIChuYW1lLnN0cmlwKCkubG93ZXIoKSwgMSkKICAgICAgICAgICAgICAgIGZvciBuYW1lIGluIHBhcnRzIGlmIC0xID09IG5hbWUuZmluZCgiPSIpCiAgICAgICAgICAgIF0KICAgICAgICAgICAgcmV0dmFsID0gZGljdChwYXJ0c193aXRoX2FyZ3MgKyBwYXJ0c193b19hcmdzKQogICAgICAgIHJldHVybiByZXR2YWwKCiAgICBkZWYgY2FjaGVkX3JlcXVlc3Qoc2VsZiwgcmVxdWVzdCk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIGEgY2FjaGVkIHJlc3BvbnNlIGlmIGl0IGV4aXN0cyBpbiB0aGUgY2FjaGUsIG90aGVyd2lzZQogICAgICAgIHJldHVybiBGYWxzZS4KICAgICAgICAiIiIKICAgICAgICBjYWNoZV91cmwgPSBzZWxmLmNhY2hlX3VybChyZXF1ZXN0LnVybCkKICAgICAgICBsb2dnZXIuZGVidWcoJ0xvb2tpbmcgdXAgIiVzIiBpbiB0aGUgY2FjaGUnLCBjYWNoZV91cmwpCiAgICAgICAgY2MgPSBzZWxmLnBhcnNlX2NhY2hlX2NvbnRyb2wocmVxdWVzdC5oZWFkZXJzKQoKICAgICAgICAjIEJhaWwgb3V0IGlmIHRoZSByZXF1ZXN0IGluc2lzdHMgb24gZnJlc2ggZGF0YQogICAgICAgIGlmICduby1jYWNoZScgaW4gY2M6CiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnUmVxdWVzdCBoZWFkZXIgaGFzICJuby1jYWNoZSIsIGNhY2hlIGJ5cGFzc2VkJykKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgIGlmICdtYXgtYWdlJyBpbiBjYyBhbmQgY2NbJ21heC1hZ2UnXSA9PSAwOgogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1JlcXVlc3QgaGVhZGVyIGhhcyAibWF4X2FnZSIgYXMgMCwgY2FjaGUgYnlwYXNzZWQnKQogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgIyBSZXF1ZXN0IGFsbG93cyBzZXJ2aW5nIGZyb20gdGhlIGNhY2hlLCBsZXQncyBzZWUgaWYgd2UgZmluZCBzb21ldGhpbmcKICAgICAgICBjYWNoZV9kYXRhID0gc2VsZi5jYWNoZS5nZXQoY2FjaGVfdXJsKQogICAgICAgIGlmIGNhY2hlX2RhdGEgaXMgTm9uZToKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdObyBjYWNoZSBlbnRyeSBhdmFpbGFibGUnKQogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgIyBDaGVjayB3aGV0aGVyIGl0IGNhbiBiZSBkZXNlcmlhbGl6ZWQKICAgICAgICByZXNwID0gc2VsZi5zZXJpYWxpemVyLmxvYWRzKHJlcXVlc3QsIGNhY2hlX2RhdGEpCiAgICAgICAgaWYgbm90IHJlc3A6CiAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdDYWNoZSBlbnRyeSBkZXNlcmlhbGl6YXRpb24gZmFpbGVkLCBlbnRyeSBpZ25vcmVkJykKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgICMgSWYgd2UgaGF2ZSBhIGNhY2hlZCAzMDEsIHJldHVybiBpdCBpbW1lZGlhdGVseS4gV2UgZG9uJ3QKICAgICAgICAjIG5lZWQgdG8gdGVzdCBvdXIgcmVzcG9uc2UgZm9yIG90aGVyIGhlYWRlcnMgYi9jIGl0IGlzCiAgICAgICAgIyBpbnRyaW5zaWNhbGx5ICJjYWNoZWFibGUiIGFzIGl0IGlzIFBlcm1hbmVudC4KICAgICAgICAjIFNlZToKICAgICAgICAjICAgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzEjc2VjdGlvbi02LjQuMgogICAgICAgICMKICAgICAgICAjIENsaWVudCBjYW4gdHJ5IHRvIHJlZnJlc2ggdGhlIHZhbHVlIGJ5IHJlcGVhdGluZyB0aGUgcmVxdWVzdAogICAgICAgICMgd2l0aCBjYWNoZSBidXN0aW5nIGhlYWRlcnMgYXMgdXN1YWwgKGllIG5vLWNhY2hlKS4KICAgICAgICBpZiByZXNwLnN0YXR1cyA9PSAzMDE6CiAgICAgICAgICAgIG1zZyA9ICgnUmV0dXJuaW5nIGNhY2hlZCAiMzAxIE1vdmVkIFBlcm1hbmVudGx5IiByZXNwb25zZSAnCiAgICAgICAgICAgICAgICAgICAnKGlnbm9yaW5nIGRhdGUgYW5kIGV0YWcgaW5mb3JtYXRpb24pJykKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKG1zZykKICAgICAgICAgICAgcmV0dXJuIHJlc3AKCiAgICAgICAgaGVhZGVycyA9IENhc2VJbnNlbnNpdGl2ZURpY3QocmVzcC5oZWFkZXJzKQogICAgICAgIGlmIG5vdCBoZWFkZXJzIG9yICdkYXRlJyBub3QgaW4gaGVhZGVyczoKICAgICAgICAgICAgaWYgJ2V0YWcnIG5vdCBpbiBoZWFkZXJzOgogICAgICAgICAgICAgICAgIyBXaXRob3V0IGRhdGUgb3IgZXRhZywgdGhlIGNhY2hlZCByZXNwb25zZSBjYW4gbmV2ZXIgYmUgdXNlZAogICAgICAgICAgICAgICAgIyBhbmQgc2hvdWxkIGJlIGRlbGV0ZWQuCiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1B1cmdpbmcgY2FjaGVkIHJlc3BvbnNlOiBubyBkYXRlIG9yIGV0YWcnKQogICAgICAgICAgICAgICAgc2VsZi5jYWNoZS5kZWxldGUoY2FjaGVfdXJsKQogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0lnbm9yaW5nIGNhY2hlZCByZXNwb25zZTogbm8gZGF0ZScpCiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICBub3cgPSB0aW1lLnRpbWUoKQogICAgICAgIGRhdGUgPSBjYWxlbmRhci50aW1lZ20oCiAgICAgICAgICAgIHBhcnNlZGF0ZV90eihoZWFkZXJzWydkYXRlJ10pCiAgICAgICAgKQogICAgICAgIGN1cnJlbnRfYWdlID0gbWF4KDAsIG5vdyAtIGRhdGUpCiAgICAgICAgbG9nZ2VyLmRlYnVnKCdDdXJyZW50IGFnZSBiYXNlZCBvbiBkYXRlOiAlaScsIGN1cnJlbnRfYWdlKQoKICAgICAgICAjIFRPRE86IFRoZXJlIGlzIGFuIGFzc3VtcHRpb24gdGhhdCB0aGUgcmVzdWx0IHdpbGwgYmUgYQogICAgICAgICMgICAgICAgdXJsbGliMyByZXNwb25zZSBvYmplY3QuIFRoaXMgbWF5IG5vdCBiZSBiZXN0IHNpbmNlIHdlCiAgICAgICAgIyAgICAgICBjb3VsZCBwcm9iYWJseSBhdm9pZCBpbnN0YW50aWF0aW5nIG9yIGNvbnN0cnVjdGluZyB0aGUKICAgICAgICAjICAgICAgIHJlc3BvbnNlIHVudGlsIHdlIGtub3cgd2UgbmVlZCBpdC4KICAgICAgICByZXNwX2NjID0gc2VsZi5wYXJzZV9jYWNoZV9jb250cm9sKGhlYWRlcnMpCgogICAgICAgICMgZGV0ZXJtaW5lIGZyZXNobmVzcwogICAgICAgIGZyZXNobmVzc19saWZldGltZSA9IDAKCiAgICAgICAgIyBDaGVjayB0aGUgbWF4LWFnZSBwcmFnbWEgaW4gdGhlIGNhY2hlIGNvbnRyb2wgaGVhZGVyCiAgICAgICAgaWYgJ21heC1hZ2UnIGluIHJlc3BfY2MgYW5kIHJlc3BfY2NbJ21heC1hZ2UnXS5pc2RpZ2l0KCk6CiAgICAgICAgICAgIGZyZXNobmVzc19saWZldGltZSA9IGludChyZXNwX2NjWydtYXgtYWdlJ10pCiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnRnJlc2huZXNzIGxpZmV0aW1lIGZyb20gbWF4LWFnZTogJWknLAogICAgICAgICAgICAgICAgICAgICAgICAgZnJlc2huZXNzX2xpZmV0aW1lKQoKICAgICAgICAjIElmIHRoZXJlIGlzbid0IGEgbWF4LWFnZSwgY2hlY2sgZm9yIGFuIGV4cGlyZXMgaGVhZGVyCiAgICAgICAgZWxpZiAnZXhwaXJlcycgaW4gaGVhZGVyczoKICAgICAgICAgICAgZXhwaXJlcyA9IHBhcnNlZGF0ZV90eihoZWFkZXJzWydleHBpcmVzJ10pCiAgICAgICAgICAgIGlmIGV4cGlyZXMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBleHBpcmVfdGltZSA9IGNhbGVuZGFyLnRpbWVnbShleHBpcmVzKSAtIGRhdGUKICAgICAgICAgICAgICAgIGZyZXNobmVzc19saWZldGltZSA9IG1heCgwLCBleHBpcmVfdGltZSkKICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygiRnJlc2huZXNzIGxpZmV0aW1lIGZyb20gZXhwaXJlczogJWkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZXNobmVzc19saWZldGltZSkKCiAgICAgICAgIyBEZXRlcm1pbmUgaWYgd2UgYXJlIHNldHRpbmcgZnJlc2huZXNzIGxpbWl0IGluIHRoZQogICAgICAgICMgcmVxdWVzdC4gTm90ZSwgdGhpcyBvdmVycmlkZXMgd2hhdCB3YXMgaW4gdGhlIHJlc3BvbnNlLgogICAgICAgIGlmICdtYXgtYWdlJyBpbiBjYzoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgZnJlc2huZXNzX2xpZmV0aW1lID0gaW50KGNjWydtYXgtYWdlJ10pCiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0ZyZXNobmVzcyBsaWZldGltZSBmcm9tIHJlcXVlc3QgbWF4LWFnZTogJWknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZXNobmVzc19saWZldGltZSkKICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICAgICBmcmVzaG5lc3NfbGlmZXRpbWUgPSAwCgogICAgICAgIGlmICdtaW4tZnJlc2gnIGluIGNjOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBtaW5fZnJlc2ggPSBpbnQoY2NbJ21pbi1mcmVzaCddKQogICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgIG1pbl9mcmVzaCA9IDAKICAgICAgICAgICAgIyBhZGp1c3Qgb3VyIGN1cnJlbnQgYWdlIGJ5IG91ciBtaW4gZnJlc2gKICAgICAgICAgICAgY3VycmVudF9hZ2UgKz0gbWluX2ZyZXNoCiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnQWRqdXN0ZWQgY3VycmVudCBhZ2UgZnJvbSBtaW4tZnJlc2g6ICVpJywKICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfYWdlKQoKICAgICAgICAjIFJldHVybiBlbnRyeSBpZiBpdCBpcyBmcmVzaCBlbm91Z2gKICAgICAgICBpZiBmcmVzaG5lc3NfbGlmZXRpbWUgPiBjdXJyZW50X2FnZToKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdUaGUgcmVzcG9uc2UgaXMgImZyZXNoIiwgcmV0dXJuaW5nIGNhY2hlZCByZXNwb25zZScpCiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnJWkgPiAlaScsIGZyZXNobmVzc19saWZldGltZSwgY3VycmVudF9hZ2UpCiAgICAgICAgICAgIHJldHVybiByZXNwCgogICAgICAgICMgd2UncmUgbm90IGZyZXNoLiBJZiB3ZSBkb24ndCBoYXZlIGFuIEV0YWcsIGNsZWFyIGl0IG91dAogICAgICAgIGlmICdldGFnJyBub3QgaW4gaGVhZGVyczoKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKAogICAgICAgICAgICAgICAgJ1RoZSBjYWNoZWQgcmVzcG9uc2UgaXMgInN0YWxlIiB3aXRoIG5vIGV0YWcsIHB1cmdpbmcnCiAgICAgICAgICAgICkKICAgICAgICAgICAgc2VsZi5jYWNoZS5kZWxldGUoY2FjaGVfdXJsKQoKICAgICAgICAjIHJldHVybiB0aGUgb3JpZ2luYWwgaGFuZGxlcgogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGRlZiBjb25kaXRpb25hbF9oZWFkZXJzKHNlbGYsIHJlcXVlc3QpOgogICAgICAgIGNhY2hlX3VybCA9IHNlbGYuY2FjaGVfdXJsKHJlcXVlc3QudXJsKQogICAgICAgIHJlc3AgPSBzZWxmLnNlcmlhbGl6ZXIubG9hZHMocmVxdWVzdCwgc2VsZi5jYWNoZS5nZXQoY2FjaGVfdXJsKSkKICAgICAgICBuZXdfaGVhZGVycyA9IHt9CgogICAgICAgIGlmIHJlc3A6CiAgICAgICAgICAgIGhlYWRlcnMgPSBDYXNlSW5zZW5zaXRpdmVEaWN0KHJlc3AuaGVhZGVycykKCiAgICAgICAgICAgIGlmICdldGFnJyBpbiBoZWFkZXJzOgogICAgICAgICAgICAgICAgbmV3X2hlYWRlcnNbJ0lmLU5vbmUtTWF0Y2gnXSA9IGhlYWRlcnNbJ0VUYWcnXQoKICAgICAgICAgICAgaWYgJ2xhc3QtbW9kaWZpZWQnIGluIGhlYWRlcnM6CiAgICAgICAgICAgICAgICBuZXdfaGVhZGVyc1snSWYtTW9kaWZpZWQtU2luY2UnXSA9IGhlYWRlcnNbJ0xhc3QtTW9kaWZpZWQnXQoKICAgICAgICByZXR1cm4gbmV3X2hlYWRlcnMKCiAgICBkZWYgY2FjaGVfcmVzcG9uc2Uoc2VsZiwgcmVxdWVzdCwgcmVzcG9uc2UsIGJvZHk9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgQWxnb3JpdGhtIGZvciBjYWNoaW5nIHJlcXVlc3RzLgoKICAgICAgICBUaGlzIGFzc3VtZXMgYSByZXF1ZXN0cyBSZXNwb25zZSBvYmplY3QuCiAgICAgICAgIiIiCiAgICAgICAgIyBGcm9tIGh0dHBsaWIyOiBEb24ndCBjYWNoZSAyMDYncyBzaW5jZSB3ZSBhcmVuJ3QgZ29pbmcgdG8KICAgICAgICAjICAgICAgICAgICAgICAgIGhhbmRsZSBieXRlIHJhbmdlIHJlcXVlc3RzCiAgICAgICAgY2FjaGVhYmxlX3N0YXR1c19jb2RlcyA9IFsyMDAsIDIwMywgMzAwLCAzMDFdCiAgICAgICAgaWYgcmVzcG9uc2Uuc3RhdHVzIG5vdCBpbiBjYWNoZWFibGVfc3RhdHVzX2NvZGVzOgogICAgICAgICAgICBsb2dnZXIuZGVidWcoCiAgICAgICAgICAgICAgICAnU3RhdHVzIGNvZGUgJXMgbm90IGluICVzJywKICAgICAgICAgICAgICAgIHJlc3BvbnNlLnN0YXR1cywKICAgICAgICAgICAgICAgIGNhY2hlYWJsZV9zdGF0dXNfY29kZXMKICAgICAgICAgICAgKQogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgcmVzcG9uc2VfaGVhZGVycyA9IENhc2VJbnNlbnNpdGl2ZURpY3QocmVzcG9uc2UuaGVhZGVycykKCiAgICAgICAgIyBJZiB3ZSd2ZSBiZWVuIGdpdmVuIGEgYm9keSwgb3VyIHJlc3BvbnNlIGhhcyBhIENvbnRlbnQtTGVuZ3RoLCB0aGF0CiAgICAgICAgIyBDb250ZW50LUxlbmd0aCBpcyB2YWxpZCB0aGVuIHdlIGNhbiBjaGVjayB0byBzZWUgaWYgdGhlIGJvZHkgd2UndmUKICAgICAgICAjIGJlZW4gZ2l2ZW4gbWF0Y2hlcyB0aGUgZXhwZWN0ZWQgc2l6ZSwgYW5kIGlmIGl0IGRvZXNuJ3Qgd2UnbGwganVzdAogICAgICAgICMgc2tpcCB0cnlpbmcgdG8gY2FjaGUgaXQuCiAgICAgICAgaWYgKGJvZHkgaXMgbm90IE5vbmUgYW5kCiAgICAgICAgICAgICAgICAiY29udGVudC1sZW5ndGgiIGluIHJlc3BvbnNlX2hlYWRlcnMgYW5kCiAgICAgICAgICAgICAgICByZXNwb25zZV9oZWFkZXJzWyJjb250ZW50LWxlbmd0aCJdLmlzZGlnaXQoKSBhbmQKICAgICAgICAgICAgICAgIGludChyZXNwb25zZV9oZWFkZXJzWyJjb250ZW50LWxlbmd0aCJdKSAhPSBsZW4oYm9keSkpOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgY2NfcmVxID0gc2VsZi5wYXJzZV9jYWNoZV9jb250cm9sKHJlcXVlc3QuaGVhZGVycykKICAgICAgICBjYyA9IHNlbGYucGFyc2VfY2FjaGVfY29udHJvbChyZXNwb25zZV9oZWFkZXJzKQoKICAgICAgICBjYWNoZV91cmwgPSBzZWxmLmNhY2hlX3VybChyZXF1ZXN0LnVybCkKICAgICAgICBsb2dnZXIuZGVidWcoJ1VwZGF0aW5nIGNhY2hlIHdpdGggcmVzcG9uc2UgZnJvbSAiJXMiJywgY2FjaGVfdXJsKQoKICAgICAgICAjIERlbGV0ZSBpdCBmcm9tIHRoZSBjYWNoZSBpZiB3ZSBoYXBwZW4gdG8gaGF2ZSBpdCBzdG9yZWQgdGhlcmUKICAgICAgICBub19zdG9yZSA9IEZhbHNlCiAgICAgICAgaWYgY2MuZ2V0KCduby1zdG9yZScpOgogICAgICAgICAgICBub19zdG9yZSA9IFRydWUKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdSZXNwb25zZSBoZWFkZXIgaGFzICJuby1zdG9yZSInKQogICAgICAgIGlmIGNjX3JlcS5nZXQoJ25vLXN0b3JlJyk6CiAgICAgICAgICAgIG5vX3N0b3JlID0gVHJ1ZQogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1JlcXVlc3QgaGVhZGVyIGhhcyAibm8tc3RvcmUiJykKICAgICAgICBpZiBub19zdG9yZSBhbmQgc2VsZi5jYWNoZS5nZXQoY2FjaGVfdXJsKToKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdQdXJnaW5nIGV4aXN0aW5nIGNhY2hlIGVudHJ5IHRvIGhvbm9yICJuby1zdG9yZSInKQogICAgICAgICAgICBzZWxmLmNhY2hlLmRlbGV0ZShjYWNoZV91cmwpCgogICAgICAgICMgSWYgd2UndmUgYmVlbiBnaXZlbiBhbiBldGFnLCB0aGVuIGtlZXAgdGhlIHJlc3BvbnNlCiAgICAgICAgaWYgc2VsZi5jYWNoZV9ldGFncyBhbmQgJ2V0YWcnIGluIHJlc3BvbnNlX2hlYWRlcnM6CiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnQ2FjaGluZyBkdWUgdG8gZXRhZycpCiAgICAgICAgICAgIHNlbGYuY2FjaGUuc2V0KAogICAgICAgICAgICAgICAgY2FjaGVfdXJsLAogICAgICAgICAgICAgICAgc2VsZi5zZXJpYWxpemVyLmR1bXBzKHJlcXVlc3QsIHJlc3BvbnNlLCBib2R5PWJvZHkpLAogICAgICAgICAgICApCgogICAgICAgICMgQWRkIHRvIHRoZSBjYWNoZSBhbnkgMzAxcy4gV2UgZG8gdGhpcyBiZWZvcmUgbG9va2luZyB0aGF0CiAgICAgICAgIyB0aGUgRGF0ZSBoZWFkZXJzLgogICAgICAgIGVsaWYgcmVzcG9uc2Uuc3RhdHVzID09IDMwMToKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdDYWNoaW5nIHBlcm1hbmFudCByZWRpcmVjdCcpCiAgICAgICAgICAgIHNlbGYuY2FjaGUuc2V0KAogICAgICAgICAgICAgICAgY2FjaGVfdXJsLAogICAgICAgICAgICAgICAgc2VsZi5zZXJpYWxpemVyLmR1bXBzKHJlcXVlc3QsIHJlc3BvbnNlKQogICAgICAgICAgICApCgogICAgICAgICMgQWRkIHRvIHRoZSBjYWNoZSBpZiB0aGUgcmVzcG9uc2UgaGVhZGVycyBkZW1hbmQgaXQuIElmIHRoZXJlCiAgICAgICAgIyBpcyBubyBkYXRlIGhlYWRlciB0aGVuIHdlIGNhbid0IGRvIGFueXRoaW5nIGFib3V0IGV4cGlyaW5nCiAgICAgICAgIyB0aGUgY2FjaGUuCiAgICAgICAgZWxpZiAnZGF0ZScgaW4gcmVzcG9uc2VfaGVhZGVyczoKICAgICAgICAgICAgIyBjYWNoZSB3aGVuIHRoZXJlIGlzIGEgbWF4LWFnZSA+IDAKICAgICAgICAgICAgaWYgY2MgYW5kIGNjLmdldCgnbWF4LWFnZScpOgogICAgICAgICAgICAgICAgaWYgY2NbJ21heC1hZ2UnXS5pc2RpZ2l0KCkgYW5kIGludChjY1snbWF4LWFnZSddKSA+IDA6CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdDYWNoaW5nIGIvYyBkYXRlIGV4aXN0cyBhbmQgbWF4LWFnZSA+IDAnKQogICAgICAgICAgICAgICAgICAgIHNlbGYuY2FjaGUuc2V0KAogICAgICAgICAgICAgICAgICAgICAgICBjYWNoZV91cmwsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2VyaWFsaXplci5kdW1wcyhyZXF1ZXN0LCByZXNwb25zZSwgYm9keT1ib2R5KSwKICAgICAgICAgICAgICAgICAgICApCgogICAgICAgICAgICAjIElmIHRoZSByZXF1ZXN0IGNhbiBleHBpcmUsIGl0IG1lYW5zIHdlIHNob3VsZCBjYWNoZSBpdAogICAgICAgICAgICAjIGluIHRoZSBtZWFudGltZS4KICAgICAgICAgICAgZWxpZiAnZXhwaXJlcycgaW4gcmVzcG9uc2VfaGVhZGVyczoKICAgICAgICAgICAgICAgIGlmIHJlc3BvbnNlX2hlYWRlcnNbJ2V4cGlyZXMnXToKICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0NhY2hpbmcgYi9jIG9mIGV4cGlyZXMgaGVhZGVyJykKICAgICAgICAgICAgICAgICAgICBzZWxmLmNhY2hlLnNldCgKICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVfdXJsLAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNlcmlhbGl6ZXIuZHVtcHMocmVxdWVzdCwgcmVzcG9uc2UsIGJvZHk9Ym9keSksCiAgICAgICAgICAgICAgICAgICAgKQoKICAgIGRlZiB1cGRhdGVfY2FjaGVkX3Jlc3BvbnNlKHNlbGYsIHJlcXVlc3QsIHJlc3BvbnNlKToKICAgICAgICAiIiJPbiBhIDMwNCB3ZSB3aWxsIGdldCBhIG5ldyBzZXQgb2YgaGVhZGVycyB0aGF0IHdlIHdhbnQgdG8KICAgICAgICB1cGRhdGUgb3VyIGNhY2hlZCB2YWx1ZSB3aXRoLCBhc3N1bWluZyB3ZSBoYXZlIG9uZS4KCiAgICAgICAgVGhpcyBzaG91bGQgb25seSBldmVyIGJlIGNhbGxlZCB3aGVuIHdlJ3ZlIHNlbnQgYW4gRVRhZyBhbmQKICAgICAgICBnb3R0ZW4gYSAzMDQgYXMgdGhlIHJlc3BvbnNlLgogICAgICAgICIiIgogICAgICAgIGNhY2hlX3VybCA9IHNlbGYuY2FjaGVfdXJsKHJlcXVlc3QudXJsKQoKICAgICAgICBjYWNoZWRfcmVzcG9uc2UgPSBzZWxmLnNlcmlhbGl6ZXIubG9hZHMoCiAgICAgICAgICAgIHJlcXVlc3QsCiAgICAgICAgICAgIHNlbGYuY2FjaGUuZ2V0KGNhY2hlX3VybCkKICAgICAgICApCgogICAgICAgIGlmIG5vdCBjYWNoZWRfcmVzcG9uc2U6CiAgICAgICAgICAgICMgd2UgZGlkbid0IGhhdmUgYSBjYWNoZWQgcmVzcG9uc2UKICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlCgogICAgICAgICMgTGV0cyB1cGRhdGUgb3VyIGhlYWRlcnMgd2l0aCB0aGUgaGVhZGVycyBmcm9tIHRoZSBuZXcgcmVxdWVzdDoKICAgICAgICAjIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL2RyYWZ0LWlldGYtaHR0cGJpcy1wNC1jb25kaXRpb25hbC0yNiNzZWN0aW9uLTQuMQogICAgICAgICMKICAgICAgICAjIFRoZSBzZXJ2ZXIgaXNuJ3Qgc3VwcG9zZWQgdG8gc2VuZCBoZWFkZXJzIHRoYXQgd291bGQgbWFrZQogICAgICAgICMgdGhlIGNhY2hlZCBib2R5IGludmFsaWQuIEJ1dC4uLiBqdXN0IGluIGNhc2UsIHdlJ2xsIGJlIHN1cmUKICAgICAgICAjIHRvIHN0cmlwIG91dCBvbmVzIHdlIGtub3cgdGhhdCBtaWdodCBiZSBwcm9ibG1hdGljIGR1ZSB0bwogICAgICAgICMgdHlwaWNhbCBhc3N1bXB0aW9ucy4KICAgICAgICBleGNsdWRlZF9oZWFkZXJzID0gWwogICAgICAgICAgICAiY29udGVudC1sZW5ndGgiLAogICAgICAgIF0KCiAgICAgICAgY2FjaGVkX3Jlc3BvbnNlLmhlYWRlcnMudXBkYXRlKAogICAgICAgICAgICBkaWN0KChrLCB2KSBmb3IgaywgdiBpbiByZXNwb25zZS5oZWFkZXJzLml0ZW1zKCkKICAgICAgICAgICAgICAgICBpZiBrLmxvd2VyKCkgbm90IGluIGV4Y2x1ZGVkX2hlYWRlcnMpCiAgICAgICAgKQoKICAgICAgICAjIHdlIHdhbnQgYSAyMDAgYi9jIHdlIGhhdmUgY29udGVudCB2aWEgdGhlIGNhY2hlCiAgICAgICAgY2FjaGVkX3Jlc3BvbnNlLnN0YXR1cyA9IDIwMAoKICAgICAgICAjIHVwZGF0ZSBvdXIgY2FjaGUKICAgICAgICBzZWxmLmNhY2hlLnNldCgKICAgICAgICAgICAgY2FjaGVfdXJsLAogICAgICAgICAgICBzZWxmLnNlcmlhbGl6ZXIuZHVtcHMocmVxdWVzdCwgY2FjaGVkX3Jlc3BvbnNlKSwKICAgICAgICApCgogICAgICAgIHJldHVybiBjYWNoZWRfcmVzcG9uc2UKUEsDBBQAAAAAAAAAIQBsJjR84wkAAOMJAABEAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jYWNoZWNvbnRyb2wvZmlsZXdyYXBwZXIucHlmcm9tIGlvIGltcG9ydCBCeXRlc0lPCgoKY2xhc3MgQ2FsbGJhY2tGaWxlV3JhcHBlcihvYmplY3QpOgogICAgIiIiCiAgICBTbWFsbCB3cmFwcGVyIGFyb3VuZCBhIGZwIG9iamVjdCB3aGljaCB3aWxsIHRlZSBldmVyeXRoaW5nIHJlYWQgaW50byBhCiAgICBidWZmZXIsIGFuZCB3aGVuIHRoYXQgZmlsZSBpcyBjbG9zZWQgaXQgd2lsbCBleGVjdXRlIGEgY2FsbGJhY2sgd2l0aCB0aGUKICAgIGNvbnRlbnRzIG9mIHRoYXQgYnVmZmVyLgoKICAgIEFsbCBhdHRyaWJ1dGVzIGFyZSBwcm94aWVkIHRvIHRoZSB1bmRlcmx5aW5nIGZpbGUgb2JqZWN0LgoKICAgIFRoaXMgY2xhc3MgdXNlcyBtZW1iZXJzIHdpdGggYSBkb3VibGUgdW5kZXJzY29yZSAoX18pIGxlYWRpbmcgcHJlZml4IHNvIGFzCiAgICBub3QgdG8gYWNjaWRlbnRhbGx5IHNoYWRvdyBhbiBhdHRyaWJ1dGUuCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgZnAsIGNhbGxiYWNrKToKICAgICAgICBzZWxmLl9fYnVmID0gQnl0ZXNJTygpCiAgICAgICAgc2VsZi5fX2ZwID0gZnAKICAgICAgICBzZWxmLl9fY2FsbGJhY2sgPSBjYWxsYmFjawoKICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBuYW1lKToKICAgICAgICAjIFRoZSB2YWd1YXJpZXMgb2YgZ2FyYmFnZSBjb2xsZWN0aW9uIG1lYW5zIHRoYXQgc2VsZi5fX2ZwIGlzCiAgICAgICAgIyBub3QgYWx3YXlzIHNldC4gIEJ5IHVzaW5nIF9fZ2V0YXR0cmlidXRlX18gYW5kIHRoZSBwcml2YXRlCiAgICAgICAgIyBuYW1lWzBdIGFsbG93cyBsb29raW5nIHVwIHRoZSBhdHRyaWJ1dGUgdmFsdWUgYW5kIHJhaXNpbmcgYW4KICAgICAgICAjIEF0dHJpYnV0ZUVycm9yIHdoZW4gaXQgZG9lc24ndCBleGlzdC4gVGhpcyBzdG9wIHRoaWducyBmcm9tCiAgICAgICAgIyBpbmZpbml0ZWx5IHJlY3Vyc2luZyBjYWxscyB0byBnZXRhdHRyIGluIHRoZSBjYXNlIHdoZXJlCiAgICAgICAgIyBzZWxmLl9fZnAgaGFzbid0IGJlZW4gc2V0LgogICAgICAgICMKICAgICAgICAjIFswXSBodHRwczovL2RvY3MucHl0aG9uLm9yZy8yL3JlZmVyZW5jZS9leHByZXNzaW9ucy5odG1sI2F0b20taWRlbnRpZmllcnMKICAgICAgICBmcCA9IHNlbGYuX19nZXRhdHRyaWJ1dGVfXygnX0NhbGxiYWNrRmlsZVdyYXBwZXJfX2ZwJykKICAgICAgICByZXR1cm4gZ2V0YXR0cihmcCwgbmFtZSkKCiAgICBkZWYgX19pc19mcF9jbG9zZWQoc2VsZik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc2VsZi5fX2ZwLmZwIGlzIE5vbmUKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIHBhc3MKCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc2VsZi5fX2ZwLmNsb3NlZAogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgcGFzcwoKICAgICAgICAjIFdlIGp1c3QgZG9uJ3QgY2FjaGUgaXQgdGhlbi4KICAgICAgICAjIFRPRE86IEFkZCBzb21lIGxvZ2dpbmcgaGVyZS4uLgogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGRlZiBfY2xvc2Uoc2VsZik6CiAgICAgICAgaWYgc2VsZi5fX2NhbGxiYWNrOgogICAgICAgICAgICBzZWxmLl9fY2FsbGJhY2soc2VsZi5fX2J1Zi5nZXR2YWx1ZSgpKQoKICAgICAgICAjIFdlIGFzc2lnbiB0aGlzIHRvIE5vbmUgaGVyZSwgYmVjYXVzZSBvdGhlcndpc2Ugd2UgY2FuIGdldCBpbnRvCiAgICAgICAgIyByZWFsbHkgdHJpY2t5IHByb2JsZW1zIHdoZXJlIHRoZSBDUHl0aG9uIGludGVycHJldGVyIGRlYWQgbG9ja3MKICAgICAgICAjIGJlY2F1c2UgdGhlIGNhbGxiYWNrIGlzIGhvbGRpbmcgYSByZWZlcmVuY2UgdG8gc29tZXRoaW5nIHdoaWNoCiAgICAgICAgIyBoYXMgYSBfX2RlbF9fIG1ldGhvZC4gU2V0dGluZyB0aGlzIHRvIE5vbmUgYnJlYWtzIHRoZSBjeWNsZQogICAgICAgICMgYW5kIGFsbG93cyB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IgdG8gZG8gaXQncyB0aGluZyBub3JtYWxseS4KICAgICAgICBzZWxmLl9fY2FsbGJhY2sgPSBOb25lCgogICAgZGVmIHJlYWQoc2VsZiwgYW10PU5vbmUpOgogICAgICAgIGRhdGEgPSBzZWxmLl9fZnAucmVhZChhbXQpCiAgICAgICAgc2VsZi5fX2J1Zi53cml0ZShkYXRhKQogICAgICAgIGlmIHNlbGYuX19pc19mcF9jbG9zZWQoKToKICAgICAgICAgICAgc2VsZi5fY2xvc2UoKQoKICAgICAgICByZXR1cm4gZGF0YQoKICAgIGRlZiBfc2FmZV9yZWFkKHNlbGYsIGFtdCk6CiAgICAgICAgZGF0YSA9IHNlbGYuX19mcC5fc2FmZV9yZWFkKGFtdCkKICAgICAgICBpZiBhbXQgPT0gMiBhbmQgZGF0YSA9PSBiJ1xyXG4nOgogICAgICAgICAgICAjIHVybGxpYiBleGVjdXRlcyB0aGlzIHJlYWQgdG8gdG9zcyB0aGUgQ1JMRiBhdCB0aGUgZW5kCiAgICAgICAgICAgICMgb2YgdGhlIGNodW5rLgogICAgICAgICAgICByZXR1cm4gZGF0YQoKICAgICAgICBzZWxmLl9fYnVmLndyaXRlKGRhdGEpCiAgICAgICAgaWYgc2VsZi5fX2lzX2ZwX2Nsb3NlZCgpOgogICAgICAgICAgICBzZWxmLl9jbG9zZSgpCgogICAgICAgIHJldHVybiBkYXRhClBLAwQUAAAAAAAAACEADlQe/C0QAAAtEAAAQwAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2FjaGVjb250cm9sL2hldXJpc3RpY3MucHlpbXBvcnQgY2FsZW5kYXIKaW1wb3J0IHRpbWUKCmZyb20gZW1haWwudXRpbHMgaW1wb3J0IGZvcm1hdGRhdGUsIHBhcnNlZGF0ZSwgcGFyc2VkYXRlX3R6Cgpmcm9tIGRhdGV0aW1lIGltcG9ydCBkYXRldGltZSwgdGltZWRlbHRhCgpUSU1FX0ZNVCA9ICIlYSwgJWQgJWIgJVkgJUg6JU06JVMgR01UIgoKCmRlZiBleHBpcmVfYWZ0ZXIoZGVsdGEsIGRhdGU9Tm9uZSk6CiAgICBkYXRlID0gZGF0ZSBvciBkYXRldGltZS5ub3coKQogICAgcmV0dXJuIGRhdGUgKyBkZWx0YQoKCmRlZiBkYXRldGltZV90b19oZWFkZXIoZHQpOgogICAgcmV0dXJuIGZvcm1hdGRhdGUoY2FsZW5kYXIudGltZWdtKGR0LnRpbWV0dXBsZSgpKSkKCgpjbGFzcyBCYXNlSGV1cmlzdGljKG9iamVjdCk6CgogICAgZGVmIHdhcm5pbmcoc2VsZiwgcmVzcG9uc2UpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBhIHZhbGlkIDF4eCB3YXJuaW5nIGhlYWRlciB2YWx1ZSBkZXNjcmliaW5nIHRoZSBjYWNoZQogICAgICAgIGFkanVzdG1lbnRzLgoKICAgICAgICBUaGUgcmVzcG9uc2UgaXMgcHJvdmlkZWQgdG9vIGFsbG93IHdhcm5pbmdzIGxpa2UgMTEzCiAgICAgICAgaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzNCNzZWN0aW9uLTUuNS40IHdoZXJlIHdlIG5lZWQKICAgICAgICB0byBleHBsaWNpdGx5IHNheSByZXNwb25zZSBpcyBvdmVyIDI0IGhvdXJzIG9sZC4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gJzExMCAtICJSZXNwb25zZSBpcyBTdGFsZSInCgogICAgZGVmIHVwZGF0ZV9oZWFkZXJzKHNlbGYsIHJlc3BvbnNlKToKICAgICAgICAiIiJVcGRhdGUgdGhlIHJlc3BvbnNlIGhlYWRlcnMgd2l0aCBhbnkgbmV3IGhlYWRlcnMuCgogICAgICAgIE5PVEU6IFRoaXMgU0hPVUxEIGFsd2F5cyBpbmNsdWRlIHNvbWUgV2FybmluZyBoZWFkZXIgdG8KICAgICAgICAgICAgICBzaWduaWZ5IHRoYXQgdGhlIHJlc3BvbnNlIHdhcyBjYWNoZWQgYnkgdGhlIGNsaWVudCwgbm90CiAgICAgICAgICAgICAgYnkgd2F5IG9mIHRoZSBwcm92aWRlZCBoZWFkZXJzLgogICAgICAgICIiIgogICAgICAgIHJldHVybiB7fQoKICAgIGRlZiBhcHBseShzZWxmLCByZXNwb25zZSk6CiAgICAgICAgdXBkYXRlZF9oZWFkZXJzID0gc2VsZi51cGRhdGVfaGVhZGVycyhyZXNwb25zZSkKCiAgICAgICAgaWYgdXBkYXRlZF9oZWFkZXJzOgogICAgICAgICAgICByZXNwb25zZS5oZWFkZXJzLnVwZGF0ZSh1cGRhdGVkX2hlYWRlcnMpCiAgICAgICAgICAgIHdhcm5pbmdfaGVhZGVyX3ZhbHVlID0gc2VsZi53YXJuaW5nKHJlc3BvbnNlKQogICAgICAgICAgICBpZiB3YXJuaW5nX2hlYWRlcl92YWx1ZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIHJlc3BvbnNlLmhlYWRlcnMudXBkYXRlKHsnV2FybmluZyc6IHdhcm5pbmdfaGVhZGVyX3ZhbHVlfSkKCiAgICAgICAgcmV0dXJuIHJlc3BvbnNlCgoKY2xhc3MgT25lRGF5Q2FjaGUoQmFzZUhldXJpc3RpYyk6CiAgICAiIiIKICAgIENhY2hlIHRoZSByZXNwb25zZSBieSBwcm92aWRpbmcgYW4gZXhwaXJlcyAxIGRheSBpbiB0aGUKICAgIGZ1dHVyZS4KICAgICIiIgogICAgZGVmIHVwZGF0ZV9oZWFkZXJzKHNlbGYsIHJlc3BvbnNlKToKICAgICAgICBoZWFkZXJzID0ge30KCiAgICAgICAgaWYgJ2V4cGlyZXMnIG5vdCBpbiByZXNwb25zZS5oZWFkZXJzOgogICAgICAgICAgICBkYXRlID0gcGFyc2VkYXRlKHJlc3BvbnNlLmhlYWRlcnNbJ2RhdGUnXSkKICAgICAgICAgICAgZXhwaXJlcyA9IGV4cGlyZV9hZnRlcih0aW1lZGVsdGEoZGF5cz0xKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlPWRhdGV0aW1lKCpkYXRlWzo2XSkpCiAgICAgICAgICAgIGhlYWRlcnNbJ2V4cGlyZXMnXSA9IGRhdGV0aW1lX3RvX2hlYWRlcihleHBpcmVzKQogICAgICAgICAgICBoZWFkZXJzWydjYWNoZS1jb250cm9sJ10gPSAncHVibGljJwogICAgICAgIHJldHVybiBoZWFkZXJzCgoKY2xhc3MgRXhwaXJlc0FmdGVyKEJhc2VIZXVyaXN0aWMpOgogICAgIiIiCiAgICBDYWNoZSAqKmFsbCoqIHJlcXVlc3RzIGZvciBhIGRlZmluZWQgdGltZSBwZXJpb2QuCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgKiprdyk6CiAgICAgICAgc2VsZi5kZWx0YSA9IHRpbWVkZWx0YSgqKmt3KQoKICAgIGRlZiB1cGRhdGVfaGVhZGVycyhzZWxmLCByZXNwb25zZSk6CiAgICAgICAgZXhwaXJlcyA9IGV4cGlyZV9hZnRlcihzZWxmLmRlbHRhKQogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICdleHBpcmVzJzogZGF0ZXRpbWVfdG9faGVhZGVyKGV4cGlyZXMpLAogICAgICAgICAgICAnY2FjaGUtY29udHJvbCc6ICdwdWJsaWMnLAogICAgICAgIH0KCiAgICBkZWYgd2FybmluZyhzZWxmLCByZXNwb25zZSk6CiAgICAgICAgdG1wbCA9ICcxMTAgLSBBdXRvbWF0aWNhbGx5IGNhY2hlZCBmb3IgJXMuIFJlc3BvbnNlIG1pZ2h0IGJlIHN0YWxlJwogICAgICAgIHJldHVybiB0bXBsICUgc2VsZi5kZWx0YQoKCmNsYXNzIExhc3RNb2RpZmllZChCYXNlSGV1cmlzdGljKToKICAgICIiIgogICAgSWYgdGhlcmUgaXMgbm8gRXhwaXJlcyBoZWFkZXIgYWxyZWFkeSwgZmFsbCBiYWNrIG9uIExhc3QtTW9kaWZpZWQKICAgIHVzaW5nIHRoZSBoZXVyaXN0aWMgZnJvbQogICAgaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzNCNzZWN0aW9uLTQuMi4yCiAgICB0byBjYWxjdWxhdGUgYSByZWFzb25hYmxlIHZhbHVlLgoKICAgIEZpcmVmb3ggYWxzbyBkb2VzIHNvbWV0aGluZyBsaWtlIHRoaXMgcGVyCiAgICBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVFRQL0NhY2hpbmdfRkFRCiAgICBodHRwOi8vbHhyLm1vemlsbGEub3JnL21vemlsbGEtcmVsZWFzZS9zb3VyY2UvbmV0d2Vyay9wcm90b2NvbC9odHRwL25zSHR0cFJlc3BvbnNlSGVhZC5jcHAjMzk3CiAgICBVbmxpa2UgbW96aWxsYSB3ZSBsaW1pdCB0aGlzIHRvIDI0LWhyLgogICAgIiIiCiAgICBjYWNoZWFibGVfYnlfZGVmYXVsdF9zdGF0dXNlcyA9IHNldChbCiAgICAgICAgMjAwLCAyMDMsIDIwNCwgMjA2LCAzMDAsIDMwMSwgNDA0LCA0MDUsIDQxMCwgNDE0LCA1MDEKICAgIF0pCgogICAgZGVmIHVwZGF0ZV9oZWFkZXJzKHNlbGYsIHJlc3ApOgogICAgICAgIGhlYWRlcnMgPSByZXNwLmhlYWRlcnMKCiAgICAgICAgaWYgJ2V4cGlyZXMnIGluIGhlYWRlcnM6CiAgICAgICAgICAgIHJldHVybiB7fQoKICAgICAgICBpZiAnY2FjaGUtY29udHJvbCcgaW4gaGVhZGVycyBhbmQgaGVhZGVyc1snY2FjaGUtY29udHJvbCddICE9ICdwdWJsaWMnOgogICAgICAgICAgICByZXR1cm4ge30KCiAgICAgICAgaWYgcmVzcC5zdGF0dXMgbm90IGluIHNlbGYuY2FjaGVhYmxlX2J5X2RlZmF1bHRfc3RhdHVzZXM6CiAgICAgICAgICAgIHJldHVybiB7fQoKICAgICAgICBpZiAnZGF0ZScgbm90IGluIGhlYWRlcnMgb3IgJ2xhc3QtbW9kaWZpZWQnIG5vdCBpbiBoZWFkZXJzOgogICAgICAgICAgICByZXR1cm4ge30KCiAgICAgICAgZGF0ZSA9IGNhbGVuZGFyLnRpbWVnbShwYXJzZWRhdGVfdHooaGVhZGVyc1snZGF0ZSddKSkKICAgICAgICBsYXN0X21vZGlmaWVkID0gcGFyc2VkYXRlKGhlYWRlcnNbJ2xhc3QtbW9kaWZpZWQnXSkKICAgICAgICBpZiBkYXRlIGlzIE5vbmUgb3IgbGFzdF9tb2RpZmllZCBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4ge30KCiAgICAgICAgbm93ID0gdGltZS50aW1lKCkKICAgICAgICBjdXJyZW50X2FnZSA9IG1heCgwLCBub3cgLSBkYXRlKQogICAgICAgIGRlbHRhID0gZGF0ZSAtIGNhbGVuZGFyLnRpbWVnbShsYXN0X21vZGlmaWVkKQogICAgICAgIGZyZXNobmVzc19saWZldGltZSA9IG1heCgwLCBtaW4oZGVsdGEgLyAxMCwgMjQgKiAzNjAwKSkKICAgICAgICBpZiBmcmVzaG5lc3NfbGlmZXRpbWUgPD0gY3VycmVudF9hZ2U6CiAgICAgICAgICAgIHJldHVybiB7fQoKICAgICAgICBleHBpcmVzID0gZGF0ZSArIGZyZXNobmVzc19saWZldGltZQogICAgICAgIHJldHVybiB7J2V4cGlyZXMnOiB0aW1lLnN0cmZ0aW1lKFRJTUVfRk1ULCB0aW1lLmdtdGltZShleHBpcmVzKSl9CgogICAgZGVmIHdhcm5pbmcoc2VsZiwgcmVzcCk6CiAgICAgICAgcmV0dXJuIE5vbmUKUEsDBBQAAAAAAAAAIQASYYC4iBkAAIgZAABCAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jYWNoZWNvbnRyb2wvc2VyaWFsaXplLnB5aW1wb3J0IGJhc2U2NAppbXBvcnQgaW8KaW1wb3J0IGpzb24KaW1wb3J0IHpsaWIKCmZyb20gcGlwLl92ZW5kb3IucmVxdWVzdHMuc3RydWN0dXJlcyBpbXBvcnQgQ2FzZUluc2Vuc2l0aXZlRGljdAoKZnJvbSAuY29tcGF0IGltcG9ydCBIVFRQUmVzcG9uc2UsIHBpY2tsZSwgdGV4dF90eXBlCgoKZGVmIF9iNjRfZW5jb2RlX2J5dGVzKGIpOgogICAgcmV0dXJuIGJhc2U2NC5iNjRlbmNvZGUoYikuZGVjb2RlKCJhc2NpaSIpCgoKZGVmIF9iNjRfZW5jb2RlX3N0cihzKToKICAgIHJldHVybiBfYjY0X2VuY29kZV9ieXRlcyhzLmVuY29kZSgidXRmOCIpKQoKCmRlZiBfYjY0X2VuY29kZShzKToKICAgIGlmIGlzaW5zdGFuY2UocywgdGV4dF90eXBlKToKICAgICAgICByZXR1cm4gX2I2NF9lbmNvZGVfc3RyKHMpCiAgICByZXR1cm4gX2I2NF9lbmNvZGVfYnl0ZXMocykKCgpkZWYgX2I2NF9kZWNvZGVfYnl0ZXMoYik6CiAgICByZXR1cm4gYmFzZTY0LmI2NGRlY29kZShiLmVuY29kZSgiYXNjaWkiKSkKCgpkZWYgX2I2NF9kZWNvZGVfc3RyKHMpOgogICAgcmV0dXJuIF9iNjRfZGVjb2RlX2J5dGVzKHMpLmRlY29kZSgidXRmOCIpCgoKY2xhc3MgU2VyaWFsaXplcihvYmplY3QpOgoKICAgIGRlZiBkdW1wcyhzZWxmLCByZXF1ZXN0LCByZXNwb25zZSwgYm9keT1Ob25lKToKICAgICAgICByZXNwb25zZV9oZWFkZXJzID0gQ2FzZUluc2Vuc2l0aXZlRGljdChyZXNwb25zZS5oZWFkZXJzKQoKICAgICAgICBpZiBib2R5IGlzIE5vbmU6CiAgICAgICAgICAgIGJvZHkgPSByZXNwb25zZS5yZWFkKGRlY29kZV9jb250ZW50PUZhbHNlKQoKICAgICAgICAgICAgIyBOT1RFOiA5OSUgc3VyZSB0aGlzIGlzIGRlYWQgY29kZS4gSSdtIG9ubHkgbGVhdmluZyBpdAogICAgICAgICAgICAjICAgICAgIGhlcmUgYi9jIEkgZG9uJ3QgaGF2ZSBhIHRlc3QgeWV0IHRvIHByb3ZlCiAgICAgICAgICAgICMgICAgICAgaXQuIEJhc2ljYWxseSwgYmVmb3JlIHVzaW5nCiAgICAgICAgICAgICMgICAgICAgYGNhY2hlY29udHJvbC5maWxld3JhcHBlci5DYWxsYmFja0ZpbGVXcmFwcGVyYCwKICAgICAgICAgICAgIyAgICAgICB0aGlzIG1hZGUgYW4gZWZmb3J0IHRvIHJlc2V0IHRoZSBmaWxlIGhhbmRsZS4gVGhlCiAgICAgICAgICAgICMgICAgICAgYENhbGxiYWNrRmlsZVdyYXBwZXJgIHNob3J0IGNpcmN1aXRzIHRoaXMgY29kZSBieQogICAgICAgICAgICAjICAgICAgIHNldHRpbmcgdGhlIGJvZHkgYXMgdGhlIGNvbnRlbnQgaXMgY29uc3VtZWQsIHRoZQogICAgICAgICAgICAjICAgICAgIHJlc3VsdCBiZWluZyBhIGBib2R5YCBhcmd1bWVudCBpcyAqYWx3YXlzKiBwYXNzZWQKICAgICAgICAgICAgIyAgICAgICBpbnRvIGNhY2hlX3Jlc3BvbnNlLCBhbmQgaW4gdHVybiwKICAgICAgICAgICAgIyAgICAgICBgU2VyaWFsaXplci5kdW1wYC4KICAgICAgICAgICAgcmVzcG9uc2UuX2ZwID0gaW8uQnl0ZXNJTyhib2R5KQoKICAgICAgICBkYXRhID0gewogICAgICAgICAgICAicmVzcG9uc2UiOiB7CiAgICAgICAgICAgICAgICAiYm9keSI6IF9iNjRfZW5jb2RlX2J5dGVzKGJvZHkpLAogICAgICAgICAgICAgICAgImhlYWRlcnMiOiBkaWN0KAogICAgICAgICAgICAgICAgICAgIChfYjY0X2VuY29kZShrKSwgX2I2NF9lbmNvZGUodikpCiAgICAgICAgICAgICAgICAgICAgZm9yIGssIHYgaW4gcmVzcG9uc2UuaGVhZGVycy5pdGVtcygpCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHJlc3BvbnNlLnN0YXR1cywKICAgICAgICAgICAgICAgICJ2ZXJzaW9uIjogcmVzcG9uc2UudmVyc2lvbiwKICAgICAgICAgICAgICAgICJyZWFzb24iOiBfYjY0X2VuY29kZV9zdHIocmVzcG9uc2UucmVhc29uKSwKICAgICAgICAgICAgICAgICJzdHJpY3QiOiByZXNwb25zZS5zdHJpY3QsCiAgICAgICAgICAgICAgICAiZGVjb2RlX2NvbnRlbnQiOiByZXNwb25zZS5kZWNvZGVfY29udGVudCwKICAgICAgICAgICAgfSwKICAgICAgICB9CgogICAgICAgICMgQ29uc3RydWN0IG91ciB2YXJ5IGhlYWRlcnMKICAgICAgICBkYXRhWyJ2YXJ5Il0gPSB7fQogICAgICAgIGlmICJ2YXJ5IiBpbiByZXNwb25zZV9oZWFkZXJzOgogICAgICAgICAgICB2YXJpZWRfaGVhZGVycyA9IHJlc3BvbnNlX2hlYWRlcnNbJ3ZhcnknXS5zcGxpdCgnLCcpCiAgICAgICAgICAgIGZvciBoZWFkZXIgaW4gdmFyaWVkX2hlYWRlcnM6CiAgICAgICAgICAgICAgICBoZWFkZXIgPSBoZWFkZXIuc3RyaXAoKQogICAgICAgICAgICAgICAgZGF0YVsidmFyeSJdW2hlYWRlcl0gPSByZXF1ZXN0LmhlYWRlcnMuZ2V0KGhlYWRlciwgTm9uZSkKCiAgICAgICAgIyBFbmNvZGUgb3VyIFZhcnkgaGVhZGVycyB0byBlbnN1cmUgdGhleSBjYW4gYmUgc2VyaWFsaXplZCBhcyBKU09OCiAgICAgICAgZGF0YVsidmFyeSJdID0gZGljdCgKICAgICAgICAgICAgKF9iNjRfZW5jb2RlKGspLCBfYjY0X2VuY29kZSh2KSBpZiB2IGlzIG5vdCBOb25lIGVsc2UgdikKICAgICAgICAgICAgZm9yIGssIHYgaW4gZGF0YVsidmFyeSJdLml0ZW1zKCkKICAgICAgICApCgogICAgICAgIHJldHVybiBiIiwiLmpvaW4oWwogICAgICAgICAgICBiImNjPTIiLAogICAgICAgICAgICB6bGliLmNvbXByZXNzKAogICAgICAgICAgICAgICAganNvbi5kdW1wcygKICAgICAgICAgICAgICAgICAgICBkYXRhLCBzZXBhcmF0b3JzPSgiLCIsICI6IiksIHNvcnRfa2V5cz1UcnVlLAogICAgICAgICAgICAgICAgKS5lbmNvZGUoInV0ZjgiKSwKICAgICAgICAgICAgKSwKICAgICAgICBdKQoKICAgIGRlZiBsb2FkcyhzZWxmLCByZXF1ZXN0LCBkYXRhKToKICAgICAgICAjIFNob3J0IGNpcmN1aXQgaWYgd2UndmUgYmVlbiBnaXZlbiBhbiBlbXB0eSBzZXQgb2YgZGF0YQogICAgICAgIGlmIG5vdCBkYXRhOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgIyBEZXRlcm1pbmUgd2hhdCB2ZXJzaW9uIG9mIHRoZSBzZXJpYWxpemVyIHRoZSBkYXRhIHdhcyBzZXJpYWxpemVkCiAgICAgICAgIyB3aXRoCiAgICAgICAgdHJ5OgogICAgICAgICAgICB2ZXIsIGRhdGEgPSBkYXRhLnNwbGl0KGIiLCIsIDEpCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgIHZlciA9IGIiY2M9MCIKCiAgICAgICAgIyBNYWtlIHN1cmUgdGhhdCBvdXIgInZlciIgaXMgYWN0dWFsbHkgYSB2ZXJzaW9uIGFuZCBpc24ndCBhIGZhbHNlCiAgICAgICAgIyBwb3NpdGl2ZSBmcm9tIGEgLCBiZWluZyBpbiB0aGUgZGF0YSBzdHJlYW0uCiAgICAgICAgaWYgdmVyWzozXSAhPSBiImNjPSI6CiAgICAgICAgICAgIGRhdGEgPSB2ZXIgKyBkYXRhCiAgICAgICAgICAgIHZlciA9IGIiY2M9MCIKCiAgICAgICAgIyBHZXQgdGhlIHZlcnNpb24gbnVtYmVyIG91dCBvZiB0aGUgY2M9TgogICAgICAgIHZlciA9IHZlci5zcGxpdChiIj0iLCAxKVstMV0uZGVjb2RlKCJhc2NpaSIpCgogICAgICAgICMgRGlzcGF0Y2ggdG8gdGhlIGFjdHVhbCBsb2FkIG1ldGhvZCBmb3IgdGhlIGdpdmVuIHZlcnNpb24KICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYsICJfbG9hZHNfdnswfSIuZm9ybWF0KHZlcikpKHJlcXVlc3QsIGRhdGEpCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICAjIFRoaXMgaXMgYSB2ZXJzaW9uIHdlIGRvbid0IGhhdmUgYSBsb2FkcyBmdW5jdGlvbiBmb3IsIHNvIHdlJ2xsCiAgICAgICAgICAgICMganVzdCB0cmVhdCBpdCBhcyBhIG1pc3MgYW5kIHJldHVybiBOb25lCiAgICAgICAgICAgIHJldHVybgoKICAgIGRlZiBwcmVwYXJlX3Jlc3BvbnNlKHNlbGYsIHJlcXVlc3QsIGNhY2hlZCk6CiAgICAgICAgIiIiVmVyaWZ5IG91ciB2YXJ5IGhlYWRlcnMgbWF0Y2ggYW5kIGNvbnN0cnVjdCBhIHJlYWwgdXJsbGliMwogICAgICAgIEhUVFBSZXNwb25zZSBvYmplY3QuCiAgICAgICAgIiIiCiAgICAgICAgIyBTcGVjaWFsIGNhc2UgdGhlICcqJyBWYXJ5IHZhbHVlIGFzIGl0IG1lYW5zIHdlIGNhbm5vdCBhY3R1YWxseQogICAgICAgICMgZGV0ZXJtaW5lIGlmIHRoZSBjYWNoZWQgcmVzcG9uc2UgaXMgc3VpdGFibGUgZm9yIHRoaXMgcmVxdWVzdC4KICAgICAgICBpZiAiKiIgaW4gY2FjaGVkLmdldCgidmFyeSIsIHt9KToKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICMgRW5zdXJlIHRoYXQgdGhlIFZhcnkgaGVhZGVycyBmb3IgdGhlIGNhY2hlZCByZXNwb25zZSBtYXRjaCBvdXIKICAgICAgICAjIHJlcXVlc3QKICAgICAgICBmb3IgaGVhZGVyLCB2YWx1ZSBpbiBjYWNoZWQuZ2V0KCJ2YXJ5Iiwge30pLml0ZW1zKCk6CiAgICAgICAgICAgIGlmIHJlcXVlc3QuaGVhZGVycy5nZXQoaGVhZGVyLCBOb25lKSAhPSB2YWx1ZToKICAgICAgICAgICAgICAgIHJldHVybgoKICAgICAgICBib2R5X3JhdyA9IGNhY2hlZFsicmVzcG9uc2UiXS5wb3AoImJvZHkiKQoKICAgICAgICBoZWFkZXJzID0gQ2FzZUluc2Vuc2l0aXZlRGljdChkYXRhPWNhY2hlZFsncmVzcG9uc2UnXVsnaGVhZGVycyddKQogICAgICAgIGlmIGhlYWRlcnMuZ2V0KCd0cmFuc2Zlci1lbmNvZGluZycsICcnKSA9PSAnY2h1bmtlZCc6CiAgICAgICAgICAgIGhlYWRlcnMucG9wKCd0cmFuc2Zlci1lbmNvZGluZycpCgogICAgICAgIGNhY2hlZFsncmVzcG9uc2UnXVsnaGVhZGVycyddID0gaGVhZGVycwoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGJvZHkgPSBpby5CeXRlc0lPKGJvZHlfcmF3KQogICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CiAgICAgICAgICAgICMgVGhpcyBjYW4gaGFwcGVuIGlmIGNhY2hlY29udHJvbCBzZXJpYWxpemVkIHRvIHYxIGZvcm1hdCAocGlja2xlKQogICAgICAgICAgICAjIHVzaW5nIFB5dGhvbiAyLiBBIFB5dGhvbiAyIHN0cihieXRlIHN0cmluZykgd2lsbCBiZSB1bnBpY2tsZWQgYXMKICAgICAgICAgICAgIyBhIFB5dGhvbiAzIHN0ciAodW5pY29kZSBzdHJpbmcpLCB3aGljaCB3aWxsIGNhdXNlIHRoZSBhYm92ZSB0bwogICAgICAgICAgICAjIGZhaWwgd2l0aDoKICAgICAgICAgICAgIwogICAgICAgICAgICAjICAgICBUeXBlRXJyb3I6ICdzdHInIGRvZXMgbm90IHN1cHBvcnQgdGhlIGJ1ZmZlciBpbnRlcmZhY2UKICAgICAgICAgICAgYm9keSA9IGlvLkJ5dGVzSU8oYm9keV9yYXcuZW5jb2RlKCd1dGY4JykpCgogICAgICAgIHJldHVybiBIVFRQUmVzcG9uc2UoCiAgICAgICAgICAgIGJvZHk9Ym9keSwKICAgICAgICAgICAgcHJlbG9hZF9jb250ZW50PUZhbHNlLAogICAgICAgICAgICAqKmNhY2hlZFsicmVzcG9uc2UiXQogICAgICAgICkKCiAgICBkZWYgX2xvYWRzX3YwKHNlbGYsIHJlcXVlc3QsIGRhdGEpOgogICAgICAgICMgVGhlIG9yaWdpbmFsIGxlZ2FjeSBjYWNoZSBkYXRhLiBUaGlzIGRvZXNuJ3QgY29udGFpbiBlbm91Z2gKICAgICAgICAjIGluZm9ybWF0aW9uIHRvIGNvbnN0cnVjdCBldmVyeXRoaW5nIHdlIG5lZWQsIHNvIHdlJ2xsIHRyZWF0IHRoaXMgYXMKICAgICAgICAjIGEgbWlzcy4KICAgICAgICByZXR1cm4KCiAgICBkZWYgX2xvYWRzX3YxKHNlbGYsIHJlcXVlc3QsIGRhdGEpOgogICAgICAgIHRyeToKICAgICAgICAgICAgY2FjaGVkID0gcGlja2xlLmxvYWRzKGRhdGEpCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICByZXR1cm4gc2VsZi5wcmVwYXJlX3Jlc3BvbnNlKHJlcXVlc3QsIGNhY2hlZCkKCiAgICBkZWYgX2xvYWRzX3YyKHNlbGYsIHJlcXVlc3QsIGRhdGEpOgogICAgICAgIHRyeToKICAgICAgICAgICAgY2FjaGVkID0ganNvbi5sb2Fkcyh6bGliLmRlY29tcHJlc3MoZGF0YSkuZGVjb2RlKCJ1dGY4IikpCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICAjIFdlIG5lZWQgdG8gZGVjb2RlIHRoZSBpdGVtcyB0aGF0IHdlJ3ZlIGJhc2U2NCBlbmNvZGVkCiAgICAgICAgY2FjaGVkWyJyZXNwb25zZSJdWyJib2R5Il0gPSBfYjY0X2RlY29kZV9ieXRlcygKICAgICAgICAgICAgY2FjaGVkWyJyZXNwb25zZSJdWyJib2R5Il0KICAgICAgICApCiAgICAgICAgY2FjaGVkWyJyZXNwb25zZSJdWyJoZWFkZXJzIl0gPSBkaWN0KAogICAgICAgICAgICAoX2I2NF9kZWNvZGVfc3RyKGspLCBfYjY0X2RlY29kZV9zdHIodikpCiAgICAgICAgICAgIGZvciBrLCB2IGluIGNhY2hlZFsicmVzcG9uc2UiXVsiaGVhZGVycyJdLml0ZW1zKCkKICAgICAgICApCiAgICAgICAgY2FjaGVkWyJyZXNwb25zZSJdWyJyZWFzb24iXSA9IF9iNjRfZGVjb2RlX3N0cigKICAgICAgICAgICAgY2FjaGVkWyJyZXNwb25zZSJdWyJyZWFzb24iXSwKICAgICAgICApCiAgICAgICAgY2FjaGVkWyJ2YXJ5Il0gPSBkaWN0KAogICAgICAgICAgICAoX2I2NF9kZWNvZGVfc3RyKGspLCBfYjY0X2RlY29kZV9zdHIodikgaWYgdiBpcyBub3QgTm9uZSBlbHNlIHYpCiAgICAgICAgICAgIGZvciBrLCB2IGluIGNhY2hlZFsidmFyeSJdLml0ZW1zKCkKICAgICAgICApCgogICAgICAgIHJldHVybiBzZWxmLnByZXBhcmVfcmVzcG9uc2UocmVxdWVzdCwgY2FjaGVkKQpQSwMEFAAAAAAAAAAhAIt7xULyAQAA8gEAAEAAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NhY2hlY29udHJvbC93cmFwcGVyLnB5ZnJvbSAuYWRhcHRlciBpbXBvcnQgQ2FjaGVDb250cm9sQWRhcHRlcgpmcm9tIC5jYWNoZSBpbXBvcnQgRGljdENhY2hlCgoKZGVmIENhY2hlQ29udHJvbChzZXNzLAogICAgICAgICAgICAgICAgIGNhY2hlPU5vbmUsCiAgICAgICAgICAgICAgICAgY2FjaGVfZXRhZ3M9VHJ1ZSwKICAgICAgICAgICAgICAgICBzZXJpYWxpemVyPU5vbmUsCiAgICAgICAgICAgICAgICAgaGV1cmlzdGljPU5vbmUpOgoKICAgIGNhY2hlID0gY2FjaGUgb3IgRGljdENhY2hlKCkKICAgIGFkYXB0ZXIgPSBDYWNoZUNvbnRyb2xBZGFwdGVyKAogICAgICAgIGNhY2hlLAogICAgICAgIGNhY2hlX2V0YWdzPWNhY2hlX2V0YWdzLAogICAgICAgIHNlcmlhbGl6ZXI9c2VyaWFsaXplciwKICAgICAgICBoZXVyaXN0aWM9aGV1cmlzdGljLAogICAgKQogICAgc2Vzcy5tb3VudCgnaHR0cDovLycsIGFkYXB0ZXIpCiAgICBzZXNzLm1vdW50KCdodHRwczovLycsIGFkYXB0ZXIpCgogICAgcmV0dXJuIHNlc3MKUEsDBBQAAAAAAAAAIQAUcAVHPwAAAD8AAAA8AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jZXJ0aWZpL19faW5pdF9fLnB5ZnJvbSAuY29yZSBpbXBvcnQgd2hlcmUsIG9sZF93aGVyZQoKX192ZXJzaW9uX18gPSAiMjAxOC4wMS4xOCIKUEsDBBQAAAAAAAAAIQCDK9rBKQAAACkAAAA8AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jZXJ0aWZpL19fbWFpbl9fLnB5ZnJvbSBjZXJ0aWZpIGltcG9ydCB3aGVyZQpwcmludCh3aGVyZSgpKQpQSwMEFAAAAAAAAAAhAAWh2vXwIgQA8CIEADsAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NlcnRpZmkvY2FjZXJ0LnBlbQojIElzc3VlcjogQ049R2xvYmFsU2lnbiBSb290IENBIE89R2xvYmFsU2lnbiBudi1zYSBPVT1Sb290IENBCiMgU3ViamVjdDogQ049R2xvYmFsU2lnbiBSb290IENBIE89R2xvYmFsU2lnbiBudi1zYSBPVT1Sb290IENBCiMgTGFiZWw6ICJHbG9iYWxTaWduIFJvb3QgQ0EiCiMgU2VyaWFsOiA0ODM1NzAzMjc4NDU5NzA3NjY5MDA1MjA0CiMgTUQ1IEZpbmdlcnByaW50OiAzZTo0NTo1MjoxNTowOTo1MTo5MjplMTpiNzo1ZDozNzo5ZjpiMTo4NzoyOTo4YQojIFNIQTEgRmluZ2VycHJpbnQ6IGIxOmJjOjk2OjhiOmQ0OmY0OjlkOjYyOjJhOmE4OjlhOjgxOmYyOjE1OjAxOjUyOmE0OjFkOjgyOjljCiMgU0hBMjU2IEZpbmdlcnByaW50OiBlYjpkNDoxMDo0MDplNDpiYjozZTpjNzo0MjpjOTplMzo4MTpkMzoxZTpmMjphNDoxYTo0ODpiNjo2ODo1Yzo5NjplNzpjZTpmMzpjMTpkZjo2YzpkNDozMzoxYzo5OQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRGRUQ0NBbDJnQXdJQkFnSUxCQUFBQUFBQkZVdGF3NVF3RFFZSktvWklodmNOQVFFRkJRQXdWekVMTUFrRwpBMVVFQmhNQ1FrVXhHVEFYQmdOVkJBb1RFRWRzYjJKaGJGTnBaMjRnYm5ZdGMyRXhFREFPQmdOVkJBc1RCMUp2CmIzUWdRMEV4R3pBWkJnTlZCQU1URWtkc2IySmhiRk5wWjI0Z1VtOXZkQ0JEUVRBZUZ3MDVPREE1TURFeE1qQXcKTURCYUZ3MHlPREF4TWpneE1qQXdNREJhTUZjeEN6QUpCZ05WQkFZVEFrSkZNUmt3RndZRFZRUUtFeEJIYkc5aQpZV3hUYVdkdUlHNTJMWE5oTVJBd0RnWURWUVFMRXdkU2IyOTBJRU5CTVJzd0dRWURWUVFERXhKSGJHOWlZV3hUCmFXZHVJRkp2YjNRZ1EwRXdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFEYUR1YVoKamM2ajQwK0tmdnZ4aTRNbGErcElIL0Vxc0xtVkVRUzk4R1BSNG1kbXp4emR6eHRJSys2TmlZNmFyeW1BWmF2cAp4eTBTeTZzY1RIQUhvVDBLTU0wVmpVLzQzZFNNVUJVYzcxRHV4QzczL09sUzhwRjk0RzNWTlRDT1hrTno4a0hwCjFXcmpzb2s2VmprNGJ3WThpR2xiS2szRnAxUzRiSW5NbS9rOHl1WDlpZlVTUEpKNGx0YmNkRzZUUkdIUmpjZEcKc25VT2h1Z1ppdFZ0Yk5WNEZwV2k2Y2dLT092eUpCTlBjMVNURTRVNkc3d2VOTFdMQll5NWQ0dXgyeDhna2FzSgpVMjZRem5zM2RMbHdSNUVpVVdNV2VhNnhya0VtQ01nWks5Rkdxa2pXWkNyWGd6VC9MQ3JCYkJsRFNnZUY1OU44CjlpRm83K3J5VXA5L2s1RFBBZ01CQUFHalFqQkFNQTRHQTFVZER3RUIvd1FFQXdJQkJqQVBCZ05WSFJNQkFmOEUKQlRBREFRSC9NQjBHQTFVZERnUVdCQlJnZTJZYVJRMlh5b2xRTDMwRXpUU28vL3o5U3pBTkJna3Foa2lHOXcwQgpBUVVGQUFPQ0FRRUExblBuZkU5MjBJMi83THFpdmpURktESzFmUHhzbkN3cnZRbWVVNzlyWHFvUlNMYmxDS096CnlqMWhUZE5HQ2JNK3c2RGpZMVViOHJydnJUbmhRN2s0bytZdmlpWTc3NkJRVnZuR0N2MDR6Y1FMY0ZHVWw1Z0UKMzhOZmxOVVZ5UlJCbk1SZGRXUVZEZjlWTU95R2ovOE43eXk1WTBiMnF2emZ2R245TGhKSVpKcmdsZkNtN3ltUApBYkVWdFF3ZHBmNXBMR2trZUI2enB4eHhZdTdLeUplc0YxMkt3dmhIaG00cXhGWXhsZEJuaVlVcitXeW1YVWFkCkRLcUM1SmxSM1hDMzIxWTlZZVJxNFZ6Vzl2NDkza0hNQjY1alVyOVRVL1FyNmNmOXR2ZUNYNFhTUVJqYmdiTUUKSE1VZnBJQnZGU0RKM2d5SUNoM1dabFhpL0VqSktTWnA0QT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1HbG9iYWxTaWduIE89R2xvYmFsU2lnbiBPVT1HbG9iYWxTaWduIFJvb3QgQ0EgLSBSMgojIFN1YmplY3Q6IENOPUdsb2JhbFNpZ24gTz1HbG9iYWxTaWduIE9VPUdsb2JhbFNpZ24gUm9vdCBDQSAtIFIyCiMgTGFiZWw6ICJHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMiIKIyBTZXJpYWw6IDQ4MzU3MDMyNzg0NTk2ODI4ODU2NTgxMjUKIyBNRDUgRmluZ2VycHJpbnQ6IDk0OjE0Ojc3OjdlOjNlOjVlOmZkOjhmOjMwOmJkOjQxOmIwOmNmOmU3OmQwOjMwCiMgU0hBMSBGaW5nZXJwcmludDogNzU6ZTA6YWI6YjY6MTM6ODU6MTI6Mjc6MWM6MDQ6Zjg6NWY6ZGQ6ZGU6Mzg6ZTQ6Yjc6MjQ6MmU6ZmUKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGNhOjQyOmRkOjQxOjc0OjVmOmQwOmI4OjFlOmI5OjAyOjM2OjJjOmY5OmQ4OmJmOjcxOjlkOmExOmJkOjFiOjFlOmZjOjk0OjZmOjViOjRjOjk5OmY0OjJjOjFiOjllCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEdWpDQ0FxS2dBd0lCQWdJTEJBQUFBQUFCRDRZbTVnMHdEUVlKS29aSWh2Y05BUUVGQlFBd1RERWdNQjRHCkExVUVDeE1YUjJ4dlltRnNVMmxuYmlCU2IyOTBJRU5CSUMwZ1VqSXhFekFSQmdOVkJBb1RDa2RzYjJKaGJGTnAKWjI0eEV6QVJCZ05WQkFNVENrZHNiMkpoYkZOcFoyNHdIaGNOTURZeE1qRTFNRGd3TURBd1doY05NakV4TWpFMQpNRGd3TURBd1dqQk1NU0F3SGdZRFZRUUxFeGRIYkc5aVlXeFRhV2R1SUZKdmIzUWdRMEVnTFNCU01qRVRNQkVHCkExVUVDaE1LUjJ4dlltRnNVMmxuYmpFVE1CRUdBMVVFQXhNS1IyeHZZbUZzVTJsbmJqQ0NBU0l3RFFZSktvWkkKaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFLYlBKQTYrTG04b21VVkN4S3MrSVZTYkM5Ti9oSEQ2RXJQTAp2NGRmeG4rRzA3SXdYTmI5cmZGNzNPWDRZSllKa2hEMTBGUGUrM3QrYzRpc1VvaDdTcWJLU2FaZXFLZU1XaEc4CmVvTHJ2b3pwczZ5V0pRZVhTcGtxQnkrMEhuZS9pZysxQW53YmxyakZ1VG9zdk5ZU3VldFpmZUxRQm9aZlhrbHEKdFRsZWlEVHN2SGdNQ0ppRWJLak5TN1NnZlF4NVRmQzRMY3NoeXRWc1czM2hvQ21Fb2ZuVGxFbkxKR0tSSUx6ZApDOVhaelBucUp3b3JjNUhHblJ1c3lNdm80S0QwTDVDTFRmdXdOaHYyR1hxRjRHM3lZUk9JWEovZ2t3cFJsNHBhCnpxK3IxZmVxQ2FwZ3ZkelpYOTl5cVdBVFhnQUJ5VXI2UDZUcUJ3TWhBbzZDeWdQQ200OENBd0VBQWFPQm5EQ0IKbVRBT0JnTlZIUThCQWY4RUJBTUNBUVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVbStJSApWMmNjSHNCcUJ0NVp0Sm90Mzl3WmhpNHdOZ1lEVlIwZkJDOHdMVEFyb0NtZ0o0WWxhSFIwY0RvdkwyTnliQzVuCmJHOWlZV3h6YVdkdUxtNWxkQzl5YjI5MExYSXlMbU55YkRBZkJnTlZIU01FR0RBV2dCU2I0Z2RYWnh3ZXdHb0cKM2xtMG1pM2YzQm1HTGpBTkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQW1ZRlRoeHhvbDRhUjdPQkt1RVFMcTRHcwpKMC9Xd2JnY1EzaXpESnI4Nml3OGJtRWJUVXNwOVo4RkhTYkJ1T21EQUdKRnRxa0lrN21wTTBzWW1zTDRoNGhPCjI5MXhOQnJCVk5wR1ArRFRLcXR0VkNMMU9tTE5JRys2S1luWDNaSHUwMXlpUHFGYlFmWGY1V1JETGVuVk9hdlMKb3QrM2k5REFnQmtjUmNBdGpPajRMYVIwVmtuRkJiVlBGZDV1UkhnNWg2aCt1L041R0pHNzlHK2R3ZkNNTll4ZApBZnZEYmJudlJHMTVSakYrQ3Y2cGdzSC83NnR1SU1SUXlWK2RUWnNYakF6bEFjbWdRV3B6VS9xbFVMUnVKUS83ClRCajAvVkxaam1teDZCRVAzb2pZK3gxSjk2cmVsYzhnZU1KZ0V0c2xRSXhxL0g1Q09FQmtFdmVlZ2VHVExnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMyBPPVZlcmlTaWduLCBJbmMuIE9VPVZlcmlTaWduIFRydXN0IE5ldHdvcmsvKGMpIDE5OTkgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIFN1YmplY3Q6IENOPVZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMyBPPVZlcmlTaWduLCBJbmMuIE9VPVZlcmlTaWduIFRydXN0IE5ldHdvcmsvKGMpIDE5OTkgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIExhYmVsOiAiVmVyaXNpZ24gQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczIgojIFNlcmlhbDogMjA2Njg0Njk2Mjc5NDcyMzEwMjU0Mjc3ODcwMTgwOTY2NzIzNDE1CiMgTUQ1IEZpbmdlcnByaW50OiBjZDo2ODpiNjphNzpjNzpjNDpjZTo3NTplMDoxZDo0Zjo1Nzo0NDo2MTo5MjowOQojIFNIQTEgRmluZ2VycHJpbnQ6IDEzOjJkOjBkOjQ1OjUzOjRiOjY5Ojk3OmNkOmIyOmQ1OmMzOjM5OmUyOjU1Ojc2OjYwOjliOjVjOmM2CiMgU0hBMjU2IEZpbmdlcnByaW50OiBlYjowNDpjZjo1ZTpiMTpmMzo5YTpmYTo3NjoyZjoyYjpiMToyMDpmMjo5NjpjYjphNToyMDpjMTpiOTo3ZDpiMTo1ODo5NTo2NTpiODoxYzpiOTphMTo3Yjo3Mjo0NAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRUdqQ0NBd0lDRVFDYmZnWkpvejVpdWRYdWtFaHhLZTlYTUEwR0NTcUdTSWIzRFFFQkJRVUFNSUhLTVFzdwpDUVlEVlFRR0V3SlZVekVYTUJVR0ExVUVDaE1PVm1WeWFWTnBaMjRzSUVsdVl5NHhIekFkQmdOVkJBc1RGbFpsCmNtbFRhV2R1SUZSeWRYTjBJRTVsZEhkdmNtc3hPakE0QmdOVkJBc1RNU2hqS1NBeE9UazVJRlpsY21sVGFXZHUKTENCSmJtTXVJQzBnUm05eUlHRjFkR2h2Y21sNlpXUWdkWE5sSUc5dWJIa3hSVEJEQmdOVkJBTVRQRlpsY21sVAphV2R1SUVOc1lYTnpJRE1nVUhWaWJHbGpJRkJ5YVcxaGNua2dRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwCmRIa2dMU0JITXpBZUZ3MDVPVEV3TURFd01EQXdNREJhRncwek5qQTNNVFl5TXpVNU5UbGFNSUhLTVFzd0NRWUQKVlFRR0V3SlZVekVYTUJVR0ExVUVDaE1PVm1WeWFWTnBaMjRzSUVsdVl5NHhIekFkQmdOVkJBc1RGbFpsY21sVAphV2R1SUZSeWRYTjBJRTVsZEhkdmNtc3hPakE0QmdOVkJBc1RNU2hqS1NBeE9UazVJRlpsY21sVGFXZHVMQ0JKCmJtTXVJQzBnUm05eUlHRjFkR2h2Y21sNlpXUWdkWE5sSUc5dWJIa3hSVEJEQmdOVkJBTVRQRlpsY21sVGFXZHUKSUVOc1lYTnpJRE1nVUhWaWJHbGpJRkJ5YVcxaGNua2dRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrZwpMU0JITXpDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTXU2bkZMOGVCOGFIbThiCk4zTzkrTWxybEJJd1QvQTJSL1hRa1FyMUY4aWxZY0VXUUUzN2ltR1E1WFlnd1JFR2Zhc3NicWIxRVVHTytpMnQKS21GWnBHY21UTkRvdkZKYmNDQUVXTkY2eWFScHZJTVhaSzBGaTd6UVdNNk5qUFhyOEVKSkM1MlhKMmN5YnVHdQpreFVjY0x3Z1RTOFkzcEtJNkd5RlZ4RWE2WDdqSmhGVW9rV1dWWVBLTUlubzNOaWo3U3FBUDM5NVpWYytGU0JtCkNDK1ZrNytxUnkrb1JwZndFdUwrd2dvclVlWjI1cmRHdCtJTnBzeW93MHhaVllubTZGTmNIT3FkOEdJV0M2ZkoKWHd6dzNzSjJ6cS8zYXZMNlFhYWlNeFRKNVhwajA1NWlOOVdGWlo0TzVsTWtkQnRlSFJKVFc4Y3M1NE5KT3hXdQppbWk1VjVjQ0F3RUFBVEFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBRVJTV3dhdVNDUGMvTDhteS91UmFuMlRlCjJ5RlBocGswZGpaWDNkQVZMOFd0ZnhVZk4ySnpQdFRuWDg0WEE5czEraXZicm1BSlh4NWZqMjY3Q3ozcVdoTWUKREdCdnRjQzFJeUl1Qnd2THFYVExSN3Nkd2RlbGE4d3Ywa0w5U2QybmljOVR1dG9BV2lpL2d0LzR1aE1kVUlhQwovWTR3anlsR3NCNDlOZG80WWhZWVNxM210bEZzM3E5aTZ3SFFIaVQrZW84U0doSm91UHRtbVJRVVJWeXU1NjVwCkY0RXJXamZKWGlyMHh1S2hYRlNicGxRQXovRHh3Y2VZTUJvN05oYmJvMjdxL2EyeXd0cnZBa2NUaXNEeHN6R3QKVHh6aFQ1eXZEd3lkOTNnTjJQUTFWb0RhdDIwWGo1MGVnV1RoL3NWRnVxMXJ1UXA2VGs5TGhPNUw4WDNkRVE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049RW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpIE89RW50cnVzdC5uZXQgT1U9d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKS8oYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVkCiMgU3ViamVjdDogQ049RW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpIE89RW50cnVzdC5uZXQgT1U9d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKS8oYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVkCiMgTGFiZWw6ICJFbnRydXN0Lm5ldCBQcmVtaXVtIDIwNDggU2VjdXJlIFNlcnZlciBDQSIKIyBTZXJpYWw6IDk0NjA2OTI0MAojIE1ENSBGaW5nZXJwcmludDogZWU6Mjk6MzE6YmM6MzI6N2U6OWE6ZTY6ZTg6YjU6Zjc6NTE6YjQ6MzQ6NzE6OTAKIyBTSEExIEZpbmdlcnByaW50OiA1MDozMDowNjowOToxZDo5NzpkNDpmNTphZTozOTpmNzpjYjplNzo5Mjo3ZDo3ZDo2NToyZDozNDozMQojIFNIQTI1NiBGaW5nZXJwcmludDogNmQ6YzQ6NzE6NzI6ZTA6MWM6YmM6YjA6YmY6NjI6NTg6MGQ6ODk6NWY6ZTI6Yjg6YWM6OWE6ZDQ6Zjg6NzM6ODA6MWU6MGM6MTA6Yjk6Yzg6Mzc6ZDI6MWU6YjE6NzcKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVLakNDQXhLZ0F3SUJBZ0lFT0dQZStEQU5CZ2txaGtpRzl3MEJBUVVGQURDQnRERVVNQklHQTFVRUNoTUwKUlc1MGNuVnpkQzV1WlhReFFEQStCZ05WQkFzVU4zZDNkeTVsYm5SeWRYTjBMbTVsZEM5RFVGTmZNakEwT0NCcApibU52Y25BdUlHSjVJSEpsWmk0Z0tHeHBiV2wwY3lCc2FXRmlMaWt4SlRBakJnTlZCQXNUSENoaktTQXhPVGs1CklFVnVkSEoxYzNRdWJtVjBJRXhwYldsMFpXUXhNekF4QmdOVkJBTVRLa1Z1ZEhKMWMzUXVibVYwSUVObGNuUnAKWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1SUNneU1EUTRLVEFlRncwNU9URXlNalF4TnpVd05URmFGdzB5T1RBMwpNalF4TkRFMU1USmFNSUcwTVJRd0VnWURWUVFLRXd0RmJuUnlkWE4wTG01bGRERkFNRDRHQTFVRUN4UTNkM2QzCkxtVnVkSEoxYzNRdWJtVjBMME5RVTE4eU1EUTRJR2x1WTI5eWNDNGdZbmtnY21WbUxpQW9iR2x0YVhSeklHeHAKWVdJdUtURWxNQ01HQTFVRUN4TWNLR01wSURFNU9Ua2dSVzUwY25WemRDNXVaWFFnVEdsdGFYUmxaREV6TURFRwpBMVVFQXhNcVJXNTBjblZ6ZEM1dVpYUWdRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrZ0tESXdORGdwCk1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBclUxTHFSS0dzdXFqSUFjVkZtUXEKSzB2UnZ3dEtUWTd0Z0hhbFo3ZDRRTUJ6UXNob3dOdFRLOTFldUhhWU5aT0xHcDE4RXpvT0gxdTNIcy9sSkJRZQpzWUdwalgyNHpHdExBL0VDRE55cnBVQWtBSDkwbEtHZENDbXppQXYxaDNlZFZjM2t3MzdYYW1TcmhSU0dsVnVYCk1sQnZQY2k2Wmd6ai9MMjRTY0YyaVVrWi9jQ292WW1qWnkvR243eHhHV0M0TGVrc3laQjJabnVVNHE5NDFtVlQKWFR6V25MTFBLUVA1TDZSUXN0Ukl6Z1V5VllyOXNtUk1EdVNZQjNYYmY5KzVDRlZnaFRBcCtYdElwR21HNHpVLwpIb1pkZW5vVnZlOEFqaFVpVkJjQWtDYVR2QTVKYUpHLytFZlRuWlZDd1E1TjMyOG16OE1ZSVdKbVEzRFcxY0FICjRRSURBUUFCbzBJd1FEQU9CZ05WSFE4QkFmOEVCQU1DQVFZd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlYKSFE0RUZnUVVWZVNCMFJHQXZ0aUp1UWlqTWZtaEpBa1d1WEF3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCQUR1YgpqMWFiTU9kVG1YeDZlYWRObDljWmxaRDdCaC9LTTN4R1k0K1daaVQ2UUJzaEo4cm1jblB5VC80eG1mM0lERXhvClU4YUFnaE9ZK3JhdDJsMDk4YzV1OWhVUmxJSU03aitWcnhHckQ5Y3YzaDhEajFjc0hzbTdtaHBFbGVzWVQ2WWYKelgxWEVDK2JCQWxhaExWdTJCMDY0ZGFlMFd4NVhua2NGTVhqMEV5VE8yVTg3ZDg5dnFibGxSckR0Um5EdlY1Ygp1LzhqNzJnWnl4S1RKMXdETFc4dzBCNjJHcXplV3ZmUnFxZ25wdjU1Z2NSNW1UTlh1aEt3cWVCQ2JKUEtWdDcrCmJZUUxDSXQramVyWG1DSEc4K2M4ZVM5ZW5ORk1GWTNoN0NJM3pKcERDNWZjZ0pDTnMyZWJiMGdJRlZiUHYvRXIKZkY2YWR1bFprTVY4Z3pVUlpWRT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUJhbHRpbW9yZSBDeWJlclRydXN0IFJvb3QgTz1CYWx0aW1vcmUgT1U9Q3liZXJUcnVzdAojIFN1YmplY3Q6IENOPUJhbHRpbW9yZSBDeWJlclRydXN0IFJvb3QgTz1CYWx0aW1vcmUgT1U9Q3liZXJUcnVzdAojIExhYmVsOiAiQmFsdGltb3JlIEN5YmVyVHJ1c3QgUm9vdCIKIyBTZXJpYWw6IDMzNTU0NjE3CiMgTUQ1IEZpbmdlcnByaW50OiBhYzpiNjo5NDphNTo5YzoxNzplMDpkNzo5MTo1Mjo5YjpiMTo5NzowNjphNjplNAojIFNIQTEgRmluZ2VycHJpbnQ6IGQ0OmRlOjIwOmQwOjVlOjY2OmZjOjUzOmZlOjFhOjUwOjg4OjJjOjc4OmRiOjI4OjUyOmNhOmU0Ojc0CiMgU0hBMjU2IEZpbmdlcnByaW50OiAxNjphZjo1NzphOTpmNjo3NjpiMDphYjoxMjo2MDo5NTphYTo1ZTpiYTpkZTpmMjoyYTpiMzoxMToxOTpkNjo0NDphYzo5NTpjZDo0Yjo5MzpkYjpmMzpmMjo2YTplYgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRGR6Q0NBbCtnQXdJQkFnSUVBZ0FBdVRBTkJna3Foa2lHOXcwQkFRVUZBREJhTVFzd0NRWURWUVFHRXdKSgpSVEVTTUJBR0ExVUVDaE1KUW1Gc2RHbHRiM0psTVJNd0VRWURWUVFMRXdwRGVXSmxjbFJ5ZFhOME1TSXdJQVlEClZRUURFeGxDWVd4MGFXMXZjbVVnUTNsaVpYSlVjblZ6ZENCU2IyOTBNQjRYRFRBd01EVXhNakU0TkRZd01Gb1gKRFRJMU1EVXhNakl6TlRrd01Gb3dXakVMTUFrR0ExVUVCaE1DU1VVeEVqQVFCZ05WQkFvVENVSmhiSFJwYlc5eQpaVEVUTUJFR0ExVUVDeE1LUTNsaVpYSlVjblZ6ZERFaU1DQUdBMVVFQXhNWlFtRnNkR2x0YjNKbElFTjVZbVZ5ClZISjFjM1FnVW05dmREQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUtNRXV5S3IKbUQxWDZDWnltclY1MUNuaTRlaVZnTEd3NDF1T0t5bWFaTitoWGUyd0NRVnQyeWd1em1LaVl2NjBpTm9TNnpqcgpJWjNBUVNzQlVudUlkOU1jajhlNnVZaTFhZ25uYytnUlFLZlJ6TXBpalMzbGp3dW1VTktvVU1NbzZ2V3JKWWVLCm1wWWNxV2U0UHd6VjkvbFNFeS9DRzlWd2NQQ1B3QkxLQnN1YTRkbktNM3AzMXZqc3VmRm9SRUpJRTlMQXdxU3UKWG1EK3RxWUYvTFRkQjFrQzFGa1ltR1AxcFdQZ2tBeDlYYklHZXZPRjZ1dlVBNjVlaEQ1Zi94WHRhYno1T1RaeQpkYzkzVWszenlaQXN1VDNseVNOVFB4OGttQ0ZjQjVrcHZjWTY3T2R1aGpwcmwzUmpNNzFvR0RId2VJMTJ2L3llCmpsMHFocWROa053bkdqa0NBd0VBQWFORk1FTXdIUVlEVlIwT0JCWUVGT1dkV1RDQ1Ixak1yUG9JVkRhR2V6cTEKQkUzd01CSUdBMVVkRXdFQi93UUlNQVlCQWY4Q0FRTXdEZ1lEVlIwUEFRSC9CQVFEQWdFR01BMEdDU3FHU0liMwpEUUVCQlFVQUE0SUJBUUNGREYyTzVHOVJhRUlGb04yN1R5Y2xoQU85OTJUOUxkY3c0NlFRRit2YUtTbTJlVDkyCjloa1RJN2dRQ3ZsWXBOUmhjTDBFWVdvU2loZlZDcjNGdkRCODF1a01KWTJHUUUvc3pLTitPTVkzRVUvdDNXZ3gKamt6U3N3RjA3cjUxWGdkSUduOXcveFpjaE1CNWhiZ0YvWCsrWlJHakQ4QUN0UGhTTnprRTFha3hlaGkvb0NyMApFcG4zbzBXQzR6eGU5WjJldGNpZWZDN0lwSjVPQ0JSTGJmMXdiV3NhWTcxazVoKzN6dkR5bnk2N0c3ZnlVSWh6CmtzTGk0eGFObWpJQ3E0NFkzZWtRRWU1K05hdVFyejR3bEhyUU16Mm5aUS8xL0k2ZVlzOUhSQ3dCWGJzZHRUTFMKUjlJNEx0RCtnZHd5YWg2MTdqelYvT2VCSFJuREpFTHFZem1wCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1BZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290IE89QWRkVHJ1c3QgQUIgT1U9QWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsKIyBTdWJqZWN0OiBDTj1BZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290IE89QWRkVHJ1c3QgQUIgT1U9QWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsKIyBMYWJlbDogIkFkZFRydXN0IEV4dGVybmFsIFJvb3QiCiMgU2VyaWFsOiAxCiMgTUQ1IEZpbmdlcnByaW50OiAxZDozNTo1NDowNDo4NTo3ODpiMDozZjo0Mjo0Mjo0ZDpiZjoyMDo3MzowYTozZgojIFNIQTEgRmluZ2VycHJpbnQ6IDAyOmZhOmYzOmUyOjkxOjQzOjU0OjY4OjYwOjc4OjU3OjY5OjRkOmY1OmU0OjViOjY4Ojg1OjE4OjY4CiMgU0hBMjU2IEZpbmdlcnByaW50OiA2ODo3ZjphNDo1MTozODoyMjo3ODpmZjpmMDpjODpiMToxZjo4ZDo0MzpkNTo3Njo2NzoxYzo2ZTpiMjpiYzplYTpiNDoxMzpmYjo4MzpkOTo2NTpkMDo2ZDoyZjpmMgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRU5qQ0NBeDZnQXdJQkFnSUJBVEFOQmdrcWhraUc5dzBCQVFVRkFEQnZNUXN3Q1FZRFZRUUdFd0pUUlRFVQpNQklHQTFVRUNoTUxRV1JrVkhKMWMzUWdRVUl4SmpBa0JnTlZCQXNUSFVGa1pGUnlkWE4wSUVWNGRHVnlibUZzCklGUlVVQ0JPWlhSM2IzSnJNU0l3SUFZRFZRUURFeGxCWkdSVWNuVnpkQ0JGZUhSbGNtNWhiQ0JEUVNCU2IyOTAKTUI0WERUQXdNRFV6TURFd05EZ3pPRm9YRFRJd01EVXpNREV3TkRnek9Gb3diekVMTUFrR0ExVUVCaE1DVTBVeApGREFTQmdOVkJBb1RDMEZrWkZSeWRYTjBJRUZDTVNZd0pBWURWUVFMRXgxQlpHUlVjblZ6ZENCRmVIUmxjbTVoCmJDQlVWRkFnVG1WMGQyOXlhekVpTUNBR0ExVUVBeE1aUVdSa1ZISjFjM1FnUlhoMFpYSnVZV3dnUTBFZ1VtOXYKZERDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTGYzR2pQbThnQUVMVG5nVGx2dApIN3hzRDgyMStpTzJ6dDZiRVRPWHBDbE1mWk9mdlVxOGsrMERHdU9QeitWdFVGcldseW1VV29Dd1NYcmJMcFg5CnVNcS9Oemd0SGo2UlFhMXdWc2Z3VHovb01wNTB5c2lRVk9uR1h3OTRuWnBBUEE2c1lhcGVGSStlaDZGcVVOelgKbWs2dkJiT21jWlNjY2JOUVlBckhFNTA0QjRZQ3FPbW9hU1lZa0t0TXNFOGpxenBQaE5qZnpwL2hhVys3MTBMWAphMFRreDYzdWJVRmZjbHB4Q0RlemVXV2tXYUNVTi9jQUx3M0NrbkxhMERoeTJ4U29SY1JkS24yM3ROYkU3cXpOCkUwUzN5U3ZkUXdBbCttRzVhV3BZSXhHM3B6T1BWblZaOWMwcDEwYTNDaXRsdHROQ2J4V3l1SHY3NytsZFU5VTAKV2ljQ0F3RUFBYU9CM0RDQjJUQWRCZ05WSFE0RUZnUVVyYjJZZWpTMEp2ZjZ4Q1pVN3dPOTRDVExWQm93Q3dZRApWUjBQQkFRREFnRUdNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdnWmtHQTFVZEl3U0JrVENCam9BVXJiMlllalMwCkp2ZjZ4Q1pVN3dPOTRDVExWQnFoYzZSeE1HOHhDekFKQmdOVkJBWVRBbE5GTVJRd0VnWURWUVFLRXd0QlpHUlUKY25WemRDQkJRakVtTUNRR0ExVUVDeE1kUVdSa1ZISjFjM1FnUlhoMFpYSnVZV3dnVkZSUUlFNWxkSGR2Y21zeApJakFnQmdOVkJBTVRHVUZrWkZSeWRYTjBJRVY0ZEdWeWJtRnNJRU5CSUZKdmIzU0NBUUV3RFFZSktvWklodmNOCkFRRUZCUUFEZ2dFQkFMQ2I0SVVsd3RZajRnK1dCcEtkUVppYzJZUjVnZGtlV3hRSEl6WmxqN0RZZDd1c1FXeEgKWUlOUnNQa3lQZWY4OWlZVHg0QVdwYjlhL0lmUGVIbUpJWnJpVEFjS2hqVzg4dDVSeE5LV3Q5eCtUdTV3L1J3NQo2d3dDVVJRdGpyMFc0TUhmUm5YbkpLM3M5RUswaFpOd0VHZTZuUVkxU2hqVEszck1VVUtoZW1QUjVydWh4U3ZDCk5yNFREZWE5WTM1NWU2Y0pEVUNyYXQyUGlzUDI5b3dhUWdWUjFFWDFuNmRpSVdnVklFTThtZWQ4dlNUWXFaRVgKYzRnL1Zoc3hPQmkwY1ErYXpjZ09ubzR1RytHTW1JUExIekh4UkV6R0JITkpkbUFQeC9pOUY0QnJMdW5NVEE1YQptbmtQSUFvdTFaNWpKaDVWa3BUWWdoZGFlOUM4eDQ5T2hnUT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPUVudHJ1c3QsIEluYy4gT1U9d3d3LmVudHJ1c3QubmV0L0NQUyBpcyBpbmNvcnBvcmF0ZWQgYnkgcmVmZXJlbmNlLyhjKSAyMDA2IEVudHJ1c3QsIEluYy4KIyBTdWJqZWN0OiBDTj1FbnRydXN0IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1FbnRydXN0LCBJbmMuIE9VPXd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZS8oYykgMjAwNiBFbnRydXN0LCBJbmMuCiMgTGFiZWw6ICJFbnRydXN0IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkiCiMgU2VyaWFsOiAxMTY0NjYwODIwCiMgTUQ1IEZpbmdlcnByaW50OiBkNjphNTpjMzplZDo1ZDpkZDozZTowMDpjMTozZDo4Nzo5MjoxZjoxZDozZjplNAojIFNIQTEgRmluZ2VycHJpbnQ6IGIzOjFlOmIxOmI3OjQwOmUzOjZjOjg0OjAyOmRhOmRjOjM3OmQ0OjRkOmY1OmQ0OjY3OjQ5OjUyOmY5CiMgU0hBMjU2IEZpbmdlcnByaW50OiA3MzpjMTo3Njo0Mzo0ZjoxYjpjNjpkNTphZDpmNDo1YjowZTo3NjplNzoyNzoyODo3Yzo4ZDplNTo3NjoxNjpjMTplNjplNjoxNDoxYToyYjoyYzpiYzo3ZDo4ZTo0YwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRWtUQ0NBM21nQXdJQkFnSUVSV3RRVkRBTkJna3Foa2lHOXcwQkFRVUZBRENCc0RFTE1Ba0dBMVVFQmhNQwpWVk14RmpBVUJnTlZCQW9URFVWdWRISjFjM1FzSUVsdVl5NHhPVEEzQmdOVkJBc1RNSGQzZHk1bGJuUnlkWE4wCkxtNWxkQzlEVUZNZ2FYTWdhVzVqYjNKd2IzSmhkR1ZrSUdKNUlISmxabVZ5Wlc1alpURWZNQjBHQTFVRUN4TVcKS0dNcElESXdNRFlnUlc1MGNuVnpkQ3dnU1c1akxqRXRNQ3NHQTFVRUF4TWtSVzUwY25WemRDQlNiMjkwSUVObApjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1TUI0WERUQTJNVEV5TnpJd01qTTBNbG9YRFRJMk1URXlOekl3Ck5UTTBNbG93Z2JBeEN6QUpCZ05WQkFZVEFsVlRNUll3RkFZRFZRUUtFdzFGYm5SeWRYTjBMQ0JKYm1NdU1Ua3cKTndZRFZRUUxFekIzZDNjdVpXNTBjblZ6ZEM1dVpYUXZRMUJUSUdseklHbHVZMjl5Y0c5eVlYUmxaQ0JpZVNCeQpaV1psY21WdVkyVXhIekFkQmdOVkJBc1RGaWhqS1NBeU1EQTJJRVZ1ZEhKMWMzUXNJRWx1WXk0eExUQXJCZ05WCkJBTVRKRVZ1ZEhKMWMzUWdVbTl2ZENCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVENDQVNJd0RRWUoKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTGFWdGtOQytzWnRLbTlJMzVSTU9WY0Y3c041RVVGbwpOdTNzL3BvQmo2RTRLUHozRUVabUxrMGVHckVhVHNiUndKV0lzTW4vTVlzekE5dTNnM3MrSUlSZTdiSldLS2Y0CjRMbEFjVGZGeTBjT2x5cG93Q0tWWWhYYlI5bjEwQ3YvZ2t2SnJUN2VUTnVRZ0ZBL0NZcUVBT3d3Q2owWXpmdjkKS2xtYUk1VVhMRVdlSDI1RGVXME1YSmorU0tmRkkwZGNYdjF1NXg2MDltaEYwWWFEVzZLS2piSGpLWUQrSlhHSQpyYjY4ajZ4U2xrdXFVWTNrRXpFWjZFNU5uOXVzczJyVnZEbFVjY3A2ZW4rUTNYMGRnTm1CdTFrbXdoSCs1cFBpCjk0RGtaZnMwTnc0cGdIQk5yemlHTHA1L1Y2K2VGNjdySE1zb0lWKzJITmpub2dRaStkUGEyTXNDQXdFQUFhT0IKc0RDQnJUQU9CZ05WSFE4QkFmOEVCQU1DQVFZd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBckJnTlZIUkFFSkRBaQpnQTh5TURBMk1URXlOekl3TWpNME1scUJEekl3TWpZeE1USTNNakExTXpReVdqQWZCZ05WSFNNRUdEQVdnQlJvCmtPUm5wS1pUZ01lR1pxVHg5MHREKzRTOWJUQWRCZ05WSFE0RUZnUVVhSkRrWjZTbVU0REhobWFrOGZkTFEvdUUKdlcwd0hRWUpLb1pJaHZaOUIwRUFCQkF3RGhzSVZqY3VNVG8wTGpBREFnU1FNQTBHQ1NxR1NJYjNEUUVCQlFVQQpBNElCQVFDVDFEQ3cxd01nS3RENVkraVJEQVVncVY4WnludHlUdFN4MjlDVysxUmFHU3dNQ1BleXZJV29uWDl0Ck8xS3pLdHZuMUlTTVkvWVB5eVlCa1ZCczlGOFU0cE4wd0JPZU1EcFE0N1JneFJ6d0lrU05jVWVzeUJySjZadWEKQUdBVC8zQitYeEZOU1J1ekZWSjd5VlRhdjUyVnIydWEySjdwOGVSRGplSVJSRHEvcjcyRFFuTlNpNnE3cHluUAo5V1FjQ2szUnZLcXNueXJRLzM5LzJuM3FzZTB3SmNHRTJqVFNXM2lEVnV5Y05zTW00aEgyWjBrZGtxdU0rK3YvCmV1NkZTcWRRZ1BDblhFcVVMbDhGbVR4U1FlRE50R1BQQVVPNm5JUGNqMkE3ODFxMHRIdXUyZ3VRT0hYdmdSMW0KMHZkWGNEYXp2L3dvcjNFbGhWc1QvaDUvV3JROAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049R2VvVHJ1c3QgR2xvYmFsIENBIE89R2VvVHJ1c3QgSW5jLgojIFN1YmplY3Q6IENOPUdlb1RydXN0IEdsb2JhbCBDQSBPPUdlb1RydXN0IEluYy4KIyBMYWJlbDogIkdlb1RydXN0IEdsb2JhbCBDQSIKIyBTZXJpYWw6IDE0NDQ3MAojIE1ENSBGaW5nZXJwcmludDogZjc6NzU6YWI6Mjk6ZmI6NTE6NGU6Yjc6Nzc6NWU6ZmY6MDU6M2M6OTk6OGU6ZjUKIyBTSEExIEZpbmdlcnByaW50OiBkZToyODpmNDphNDpmZjplNTpiOToyZjphMzpjNTowMzpkMTphMzo0OTphNzpmOTo5NjoyYTo4MjoxMgojIFNIQTI1NiBGaW5nZXJwcmludDogZmY6ODU6NmE6MmQ6MjU6MWQ6Y2Q6ODg6ZDM6NjY6NTY6ZjQ6NTA6MTI6Njc6OTg6Y2Y6YWI6YWE6ZGU6NDA6Nzk6OWM6NzI6MmQ6ZTQ6ZDI6YjU6ZGI6MzY6YTc6M2EKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURWRENDQWp5Z0F3SUJBZ0lEQWpSV01BMEdDU3FHU0liM0RRRUJCUVVBTUVJeEN6QUpCZ05WQkFZVEFsVlQKTVJZd0ZBWURWUVFLRXcxSFpXOVVjblZ6ZENCSmJtTXVNUnN3R1FZRFZRUURFeEpIWlc5VWNuVnpkQ0JIYkc5aQpZV3dnUTBFd0hoY05NREl3TlRJeE1EUXdNREF3V2hjTk1qSXdOVEl4TURRd01EQXdXakJDTVFzd0NRWURWUVFHCkV3SlZVekVXTUJRR0ExVUVDaE1OUjJWdlZISjFjM1FnU1c1akxqRWJNQmtHQTFVRUF4TVNSMlZ2VkhKMWMzUWcKUjJ4dlltRnNJRU5CTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUEyc3dZWXpEOQo5QmNqR2xaK1c5ODhiRGprY2JkNGtkUzhvZGhNK0toRHRnUHBUU0VIQ0lqYVdDOW1PU205QlhpTG5Uam9CYmRxCmZuR2s1c1JncHJEdmdPU0pLQStlSmRidGcvT3RwcEhIbU1sQ0dEVVVuYTJZUnBJdVQ4cnhoMFBCRnBWWExWRHYKaVMyQWVsZXQ4dTVmYTlJQWpia1UrQlFWTmRuQVJxTjdjc2lSdjhsVks4M1FsejZjSm1UTTM4NkRHWEhLVHViVQoxWHVwR2MxVjNzanMwbDQ0VStWY1Q0d3QvbEFqTnZ4bTVzdU9wRGtaQUxlVkFqbVJDdzcrT0M3UkhRV2E5azArCmJ3OEhIYThzSG85Z09lTDZObE1UT2RSZUppdmJQYWdVdlRMckdBTW9VZ1J4NWFzelBlRTR1d2MyaEdLY2Vlb1cKTVBSZndDdm9jV3ZrK1FJREFRQUJvMU13VVRBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJUQQplcGhvalluN3F3VmtEQkY5cW4xbHVNck1UakFmQmdOVkhTTUVHREFXZ0JUQWVwaG9qWW43cXdWa0RCRjlxbjFsCnVNck1UakFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBTmVNcGF1VXZYVlNPS1ZDVW41a2FGT1NQZUNwaWxLSW4KWjU3UXp4cGVSK25Cc3FUUDNVRWFCVTZiUys1S2IxVlNzeVNoTndyclpIWXFMaXp6L1R0MWtMLzZjZGpIUFRmUwp0UVdWWXJtbTNvazlObnM0ZDBpWHJLWWdqeTZteVF6Q3NwbEZBTWZPRVZFaUl1Q2w2cllWU0FsazZsNVBkUGNGClBzZUtVZ3piRmJTOWJadmx4ckZVYUtuamFaQzJtcVVQdUxrL0lIMnVTclc0bk9RZHRxdm1sS1hCeDRPdDIvVW4KaHc0RWJOWC8zYUJkN1lkU3R5c1ZBcTQ1cG1wMDZkckU1N3hOTkI2cFhFMHpYNUlKTDRobVhYZVh4eDEyRTZuVgo1ZkVXQ1JFMTFhemJKSEZ3TEpoV0M5a1h0TkhqVVN0ZWRlalYwTnhQTk8zQ0JXYUFvY3ZtTXc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049R2VvVHJ1c3QgVW5pdmVyc2FsIENBIE89R2VvVHJ1c3QgSW5jLgojIFN1YmplY3Q6IENOPUdlb1RydXN0IFVuaXZlcnNhbCBDQSBPPUdlb1RydXN0IEluYy4KIyBMYWJlbDogIkdlb1RydXN0IFVuaXZlcnNhbCBDQSIKIyBTZXJpYWw6IDEKIyBNRDUgRmluZ2VycHJpbnQ6IDkyOjY1OjU4OjhiOmEyOjFhOjMxOjcyOjczOjY4OjVjOmI0OmE1OjdhOjA3OjQ4CiMgU0hBMSBGaW5nZXJwcmludDogZTY6MjE6ZjM6MzU6NDM6Nzk6MDU6OWE6NGI6Njg6MzA6OWQ6OGE6MmY6NzQ6MjI6MTU6ODc6ZWM6NzkKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGEwOjQ1OjliOjlmOjYzOmIyOjI1OjU5OmY1OmZhOjVkOjRjOjZkOmIzOmY5OmY3OjJmOmYxOjkzOjQyOjAzOjM1Ojc4OmYwOjczOmJmOjFkOjFiOjQ2OmNiOmI5OjEyCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGYURDQ0ExQ2dBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURCRk1Rc3dDUVlEVlFRR0V3SlZVekVXCk1CUUdBMVVFQ2hNTlIyVnZWSEoxYzNRZ1NXNWpMakVlTUJ3R0ExVUVBeE1WUjJWdlZISjFjM1FnVlc1cGRtVnkKYzJGc0lFTkJNQjRYRFRBME1ETXdOREExTURBd01Gb1hEVEk1TURNd05EQTFNREF3TUZvd1JURUxNQWtHQTFVRQpCaE1DVlZNeEZqQVVCZ05WQkFvVERVZGxiMVJ5ZFhOMElFbHVZeTR4SGpBY0JnTlZCQU1URlVkbGIxUnlkWE4wCklGVnVhWFpsY25OaGJDQkRRVENDQWlJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFLWVYKVmFDanh1QWZqSjBoVU5mQnZpdGJ0YVNlb2RseVdMMEFHMHkvWWNrVUhVV0NxOFlkZ05ZOTZ4Q2NPcTl0SlBpOApjUUdlQnZWOFh4N0JEbFhLZzVwWk1LNFp5ekJJbGUwaU40MzBTcHB5Wmo2dGxjRGdGZ0RnRUI4ck1RN1hsRlRUClFqT2dOQjBlUlhiZFQ4b1lOK3lGRlhvWkNQelZ4NXp3OHFrdUVLbVM1ajFZUGFrV2FEd3ZkU0VZZnloM3BlRmgKRjdlbTZmZ2VtZHR6YnZRS29pRnM3dHFxaFpKbXIvWjZhNExhdWlJSU5RL1BRdkUxK21ydWZpc2x6RG9SNUcydgpjN0oySGEzUXNuaG5HcVE1SEZFTFoxYUQvVGhkRGM3ZDhMc3JsaC9lZXpKUy9SMjd0UWFoc2lGZXBkYVZhSC93Cm1aN2NSUWcrNTlJSkRUV1UzWUJPVTVmWHRRbEVJR1FXRndNQ1RGTU5hTjdWcW5KTmsyMkNEdHVjdmMrMDgxeGQKVkhwcENaYlcyeEhCalhXb3RNODV5TTQ4dkNSODVtTEs0YjE5cDcxWFpRdmsvaVh0dG1rUTNDZ2FScjBCSGRDWAp0ZUdZTzhBM1pOWTlsTzRMNGZVb3JndFd2M0dMSXlsQmpvYkZTMUo3MkhHckg0b1ZwanVEV3RkWUFWSEdURUhaCmY5aEJaM0tpS045Z2c2bWV5SHY4VTNOeVdmV1RlaGQyRHM3MzVWelpDMVUwb3FwYnRXcFU1eFBLVit5WGJmUmUKQmk5RmkxalVJeGFTNUJadUtHTlpNTjlRQVp4amlScWYyeGVVZ25BM3d5U2Vta2ZXV3NwT3FHbUpjaCtSYk50KwpuaHV0eHg5ejNTeFBHV1g5ZjVOQUVDN1M4TzA4bmk0b1Bta21NOFY3QWdNQkFBR2pZekJoTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZOcTdMcXF3RExpSUpsRjBYRzBEMDhEWWozcldNQjhHQTFVZEl3UVkKTUJhQUZOcTdMcXF3RExpSUpsRjBYRzBEMDhEWWozcldNQTRHQTFVZER3RUIvd1FFQXdJQmhqQU5CZ2txaGtpRwo5dzBCQVFVRkFBT0NBZ0VBTVhqbXg3WGZ1SlJBeVhIRXFEWHNSaDNDaGZNb1dJYXdDL3lPc2ptUFJGV3JaSVJjCmFhblFtamc4K3VVZk5lVkU0NEI1bEdpa3U4U2ZQZUUwelRCR2kxUXJsYVh2OXorWmhQMDE1czh4eHR4cXY2ZlgKSXdqaG1GN0RXZ2gycWFhdmR5KzNZTDFFUm1ydmwvOXpsY0dPNkpQNy9URzM3RmNSRVVXYk1QRWFpRG5CVHp5bgpBTlhIL0t0dGdDSndwUXpnWFFRcEF2dkxvSkhSZk5iRGZsRFZuVmkrUVRqcnVYVThGZG1ieVVxRFdjRGFVLzB6CnV6WVltNFVQRmQzdUxheDJrN25aQVkxSUVLajc5VGlHOGRzS3hyMkVveU5CM3RaM2I0WFVoUnhRNEs1UmlycU4KUG5iaXVjb244bCtmNzI1WkRRYllLeGVrMG54cnUxOFVHa2lQR2t6bnMwY2Nqa3hGS3lEdVNOL24zUW1PR0tqYQpRSTJTSmhGVFlYTmQ2NzNueEUwcE4ySHJyRGt0Wnk0VzF2VUFnNFdoekg5MnhIM2t0MHRtN3dORllHbTJERktXCmtvUmVwcU8xcEQ0cjJjellHMGVxOGtUYVQva0Q2UEFVeXovemc5N1F3VlRqdCtnS04wMkxJRmtETUJtaExNaTkKRVIvZnJzbEt4Zk1uWm1hR3JHaVIvOW5tVXh3UGkxeHBaUW9teUI0MHcxMVJlOWVwbkFhaE50M1ZpWlM4MmVRdApERjRKYkFpWGZLTTlmSlAvUDZFVXA4KzFYZXZiMnh6RWR0K0l1YjFGQlpVYnJ2eEdha3l2U09QT3JnL1NmdXZtCmJKeFBnV3A2Wkt5N1B0WG55M1l1eGFkSXdWeVFEOHZJUC9ybU11R05HMitrNW83WStTbElpczV6L2l3PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049R2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIgTz1HZW9UcnVzdCBJbmMuCiMgU3ViamVjdDogQ049R2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIgTz1HZW9UcnVzdCBJbmMuCiMgTGFiZWw6ICJHZW9UcnVzdCBVbml2ZXJzYWwgQ0EgMiIKIyBTZXJpYWw6IDEKIyBNRDUgRmluZ2VycHJpbnQ6IDM0OmZjOmI4OmQwOjM2OmRiOjllOjE0OmIzOmMyOmYyOmRiOjhmOmU0Ojk0OmM3CiMgU0hBMSBGaW5nZXJwcmludDogMzc6OWE6MTk6N2I6NDE6ODU6NDU6MzU6MGM6YTY6MDM6Njk6ZjM6M2M6MmU6YWY6NDc6NGY6MjA6NzkKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGEwOjIzOjRmOjNiOmM4OjUyOjdjOmE1OjYyOjhlOmVjOjgxOmFkOjVkOjY5Ojg5OjVkOmE1OjY4OjBkOmM5OjFkOjFjOmI4OjQ3OjdmOjMzOmY4Ojc4OmI5OjViOjBiCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGYkRDQ0ExU2dBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURCSE1Rc3dDUVlEVlFRR0V3SlZVekVXCk1CUUdBMVVFQ2hNTlIyVnZWSEoxYzNRZ1NXNWpMakVnTUI0R0ExVUVBeE1YUjJWdlZISjFjM1FnVlc1cGRtVnkKYzJGc0lFTkJJREl3SGhjTk1EUXdNekEwTURVd01EQXdXaGNOTWprd016QTBNRFV3TURBd1dqQkhNUXN3Q1FZRApWUVFHRXdKVlV6RVdNQlFHQTFVRUNoTU5SMlZ2VkhKMWMzUWdTVzVqTGpFZ01CNEdBMVVFQXhNWFIyVnZWSEoxCmMzUWdWVzVwZG1WeWMyRnNJRU5CSURJd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUMKQVFDelZGTEJ5VDd5MmR5eFV4cFpLZWV4dzBVbzVkZlI3Y1hGUzZHcWRIdFhyMG9tL05qMVhxZHVHZHQwREU4MQpXeklMQWVQYjYzcDNOZXFxV3VEVzZLRlhsUENRbzNSV2xFUXdBeDVjVGl1RkpuU0NlZ3gyb0c5TnprRXRvQlVHCkZGKzNRczE3ajFoaE5Od3FDUGt1d3dHbUlrUWNUQWVDNWx2TzBFcDhCTk1aY3lmd3FwaC9McTlPNjRjZUpIZHEKWGJib1cwVzYzTU9oQlc5V2pvOFFKcVZKd3k3WFFZY2k0RStHeW1DMTZxRmp3QUdYRUhtOUFEd1NiU3NWc2F4TApzZTRZdVU2VzNOeDIvenUrejE4RHdQdzc2TDVHRy8vYVFNSlM5LzdqT3ZkcWR6WFEybzNyWGhocU1jY2V1andiCktOWnJWTWFxVzllaUxCc1p6S0lDOXB0WnZUZHJoclZ0Z3JyWTZzbFd2S2syV1AwK0dmUHREQ2Fwa3pqNFQ4RmQKSWdiUWwrcmhyY1pWNElFcktJTTYrdlI3SVZFQXZsSTR6czFtZWFqMGdWYmkwSU1KUjFGYlVHclAyMGdhWFQ3Mwp5L1psOTJ6eGxmZ0NPekpXZ2psNlc3MHZpUnUvb2JUby8zK05qTjhEOFdCT1dCRk02Nk0vRUN1RG1nRnoyWlJ0CmhBQW5acXp3Y0VBSlFwS3RUNU1OWVFsUkpOaVMxUXVVWWJLSHN1My9talgvaFZUSzdVUkRyQnM4Rm10SVNnb2MKUUlnZmtzSUxBQVgvOHNnQ1NxU3FxY3labHB3dldPQjk0YjY3Qjl4ZkJISmNNVFREN0Y4dDREMWtrQ0xtMGV5NApMdDFacnRtaE43OVVOZHh6TWsrTUJCNHpzc2xHOGRoY3lGVlF5V2k5cUxvMkNRSURBUUFCbzJNd1lUQVBCZ05WCkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVdCQlIyODFYaCtxUTIrL0NmWEdKeDdUejBSemdRS3pBZkJnTlYKSFNNRUdEQVdnQlIyODFYaCtxUTIrL0NmWEdKeDdUejBSemdRS3pBT0JnTlZIUThCQWY4RUJBTUNBWVl3RFFZSgpLb1pJaHZjTkFRRUZCUUFEZ2dJQkFHYkJ4aVB6MmVBdWJsL296NjZ3c0NWTksvZzdXSnRBSkRkYXk2c1dTZit6CmRYa3pvUzl0Y0JjMGtmNW5mby9zbStWZWdxbFZIeS9jMUZFSEV2NnNGajRzTmNaai9Od1E2dzJqcXRCOHpOSFEKTDFFdXhCUmEzdWdaNFQ3R3pLUXA1eTZFcWdZd2VIWlVjeWlZV1RqZ0FBMWkwMEo5SVordVBUcU0xZnAzRFJncgpGZzVmTnVIOEtyVXdKTS9nWXd4N1dCcittYnBDRXJHUjlIeG80c2pvcnl6cXlYNnV1eW85RFJYY05KVzJHSFNvCmFnL0h0UFFUeE9SYjdRclNwSmRNS3UwdmJCS0pQZkVuY0twcUExSWhuMENvWjFEeTgxb2YzOThqOXR4NFR1YVkKVDFVNlUrUHY4dlNmeDN6WVdLOHBJcGU0NEwyUkxyQjI3RmNSeis4cFJQUHBoWHBnWStSZE00a1gyVEdxMnRiegpHRFZ5ejRjckwyTWpoRjJFakQ5WG9JajhtWkVvSm1tWjFJK1hSTDZPMVVpeHBDZ3A4UlcwNGVXZTNmaVBwbThtCjF3azhPaHdSRHFac04vZXRSSWNzS01mWWRJS3owRzlLVjdzMUtTZWdpK2docDRka05sM00yQmFzeDdJblFKSlYKT0NpTlVXN2RGR2RUYkhGY0pvUk5kVnEyZm1CV3FVMnQrNXNlbC9NTjJkS1hWSGZhUFJLMzRCN3ZDQWFzK1lXSAo2YUxjcjM0WUVvUDlWaGRCTHRVcGduMlo5REgyY2FuUExBRW5wUVc1cXJKSVRpcnZuNU5TVVpVOFVuT09Wa3dYClFNQUpLT1NMYWtoVDIrek5WVlh4eHZqcG9peE1wdEVtWDM2dldremFINmJ5SEN4K3JnSVcwbGJRTDFkVFIraVMKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVZpc2EgZUNvbW1lcmNlIFJvb3QgTz1WSVNBIE9VPVZpc2EgSW50ZXJuYXRpb25hbCBTZXJ2aWNlIEFzc29jaWF0aW9uCiMgU3ViamVjdDogQ049VmlzYSBlQ29tbWVyY2UgUm9vdCBPPVZJU0EgT1U9VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24KIyBMYWJlbDogIlZpc2EgZUNvbW1lcmNlIFJvb3QiCiMgU2VyaWFsOiAyNTk1MjE4MDc3NjI4NTgzNjA0ODAyNDg5MDI0MTUwNTU2NTc5NAojIE1ENSBGaW5nZXJwcmludDogZmM6MTE6Yjg6ZDg6MDg6OTM6MzA6MDA6NmQ6MjM6Zjk6N2U6ZWI6NTI6MWU6MDIKIyBTSEExIEZpbmdlcnByaW50OiA3MDoxNzo5Yjo4Njo4YzowMDphNDpmYTo2MDo5MTo1MjoyMjozZjo5ZjozZTozMjpiZDplMDowNTo2MgojIFNIQTI1NiBGaW5nZXJwcmludDogNjk6ZmE6Yzk6YmQ6NTU6ZmI6MGE6Yzc6OGQ6NTM6YmI6ZWU6NWM6ZjE6ZDU6OTc6OTg6OWY6ZDA6YWE6YWI6MjA6YTI6NTE6NTE6YmQ6ZjE6NzM6M2U6ZTc6ZDE6MjIKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURvakNDQW9xZ0F3SUJBZ0lRRTRZMVRSMC9CdkxCK1dVRjFaQWNZakFOQmdrcWhraUc5dzBCQVFVRkFEQnIKTVFzd0NRWURWUVFHRXdKVlV6RU5NQXNHQTFVRUNoTUVWa2xUUVRFdk1DMEdBMVVFQ3hNbVZtbHpZU0JKYm5SbApjbTVoZEdsdmJtRnNJRk5sY25acFkyVWdRWE56YjJOcFlYUnBiMjR4SERBYUJnTlZCQU1URTFacGMyRWdaVU52CmJXMWxjbU5sSUZKdmIzUXdIaGNOTURJd05qSTJNREl4T0RNMldoY05Nakl3TmpJME1EQXhOakV5V2pCck1Rc3cKQ1FZRFZRUUdFd0pWVXpFTk1Bc0dBMVVFQ2hNRVZrbFRRVEV2TUMwR0ExVUVDeE1tVm1sellTQkpiblJsY201aApkR2x2Ym1Gc0lGTmxjblpwWTJVZ1FYTnpiMk5wWVhScGIyNHhIREFhQmdOVkJBTVRFMVpwYzJFZ1pVTnZiVzFsCmNtTmxJRkp2YjNRd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUN2Vjk1V0htNmgKMm1DeGxDZkxGOXNIUDRDRlQ4aWN0dEQwYjAvUG1kamgyOEpJWERxc09UUEhIMnFMSmowck5mVklzWkhCQWs0RQpscEY3c0RQd3NSUk9FVysxUUs4YlJhVks3MzYyclBLZ0gxZy9Fa1pnUEkyaDRIM1BWejR6SHZ0SDhhb1Zsd2RWClpxVzFMUzdZZ0ZteXB3MjNSdXdoWS84MXE2VUN6eXIwVFA1NzlaUmRoRTJvOG1DUDJ3NGxQSjl6Y2MrVTMwcnEKMjk5eU9JenpscjN4Rjd6U3VqdEZXc2FuOXNZWGl3R2QvQm1vS29NV3VEcEkvazQrb0tzR0dlbFQ4NEFUQiswdAp2ejhLUEZVZ09Td3NBR2wwbFVxOElMS3BlZVVZaVpHbzNCeE43N3QrTnd0ZC9qbWxpRktNQUd6c0dIeEJ2ZmFMCmRYZTZZSjJFNS80dEFnTUJBQUdqUWpCQU1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUUQKQWdFR01CMEdBMVVkRGdRV0JCUVZPSU1QUHl3L2NETWV6VWIrQjR3ZzROZkR0ekFOQmdrcWhraUc5dzBCQVFVRgpBQU9DQVFFQVgvRkJmWHhjQ0xrcjROV1NSL3BuWEtVVHd3TWhteXRNaVViUFdVM0ovcVZBdG1QTjNYRW9sV2NSCnpDU3MwMFJzY2E0QklHc0RvbzhZdHlrNmZlVVdZRk40UE1DdkZZUDNqMUl6Skwxa2s1ZnVpL2ZiR0todGNiUDMKTEJmUWRDVnA5LzVyUEpTK1RVdEJqRTdpYzlEamtDSnpRODN6NytwenprV0tzS1pKLzB4OW5YR0l4SFlka0ZzZAo3djNNOSs3OVlLV3hlaFp4MFJiUWZCSThiR21YMjY1Zk9acHdMd1U4R1VZRW1TQTIwR0J1WVFhN0ZrS01jUGN3CisrRGJacU1BQWIzbUxOcVJYNkJHaTAxcW5EMDkzUVZHL25hL29Bbzg1QURtSjdmL2hDM2V1aUlubGhCeDZ5THQKMzk4em5NL2pyYTZPMUk3bVQxR3ZGcExnWFBZSER3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlcyBPPUNvbW9kbyBDQSBMaW1pdGVkCiMgU3ViamVjdDogQ049QUFBIENlcnRpZmljYXRlIFNlcnZpY2VzIE89Q29tb2RvIENBIExpbWl0ZWQKIyBMYWJlbDogIkNvbW9kbyBBQUEgU2VydmljZXMgcm9vdCIKIyBTZXJpYWw6IDEKIyBNRDUgRmluZ2VycHJpbnQ6IDQ5Ojc5OjA0OmIwOmViOjg3OjE5OmFjOjQ3OmIwOmJjOjExOjUxOjliOjc0OmQwCiMgU0hBMSBGaW5nZXJwcmludDogZDE6ZWI6MjM6YTQ6NmQ6MTc6ZDY6OGY6ZDk6MjU6NjQ6YzI6ZjE6ZjE6NjA6MTc6NjQ6ZDg6ZTM6NDkKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGQ3OmE3OmEwOmZiOjVkOjdlOjI3OjMxOmQ3OjcxOmU5OjQ4OjRlOmJjOmRlOmY3OjFkOjVmOjBjOjNlOjBhOjI5OjQ4Ojc4OjJiOmM4OjNlOmUwOmVhOjY5OjllOmY0Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFTWpDQ0F4cWdBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURCN01Rc3dDUVlEVlFRR0V3SkhRakViCk1Ca0dBMVVFQ0F3U1IzSmxZWFJsY2lCTllXNWphR1Z6ZEdWeU1SQXdEZ1lEVlFRSERBZFRZV3htYjNKa01Sb3cKR0FZRFZRUUtEQkZEYjIxdlpHOGdRMEVnVEdsdGFYUmxaREVoTUI4R0ExVUVBd3dZUVVGQklFTmxjblJwWm1sagpZWFJsSUZObGNuWnBZMlZ6TUI0WERUQTBNREV3TVRBd01EQXdNRm9YRFRJNE1USXpNVEl6TlRrMU9Wb3dlekVMCk1Ba0dBMVVFQmhNQ1IwSXhHekFaQmdOVkJBZ01Fa2R5WldGMFpYSWdUV0Z1WTJobGMzUmxjakVRTUE0R0ExVUUKQnd3SFUyRnNabTl5WkRFYU1CZ0dBMVVFQ2d3UlEyOXRiMlJ2SUVOQklFeHBiV2wwWldReElUQWZCZ05WQkFNTQpHRUZCUVNCRFpYSjBhV1pwWTJGMFpTQlRaWEoyYVdObGN6Q0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQCkFEQ0NBUW9DZ2dFQkFMNUFuZlJ1NGVwMmh4eE5SVVNPdmtiSWd3YWR3U3IrR0IrTzVBTDY4NnRkVUlvV01RdWEKQnRERmNDTE5TUzFVWTh5MmJtaEdDMVBxeTB3a3dMeHlUdXJ4RmE3MFZKb1NDc042c2pOZzR0cUpWZk1pV1BQZQozTS92ZzRhaWpKUlBuMmp5bUpCR2hDZkhkci9qekRVc2kxNEhaR1dDd0Vpd3FKSDVZWjkySUZDb2tjZG10ZXQ0CllnTlc4SW9hRStveG94NmdtZjA0OXZZbk1saHZCL1ZydVBzVUs2KzNxc3pXWTE5empOb0ZtYWc0cU1zWGVEWlIKck9tZTlIZzZqYzhQMlVMaW1BeXJMNThPQWQ3dm41bEo4UzNmckhSTkc1aTFSOFhsS2RINWtCakhZcHkrZzhjbQplejZLSmNmQTNaM21OV2dRSUoyUDJON1N3NFNjRFY3b0w4a0NBd0VBQWFPQndEQ0J2VEFkQmdOVkhRNEVGZ1FVCm9CRUtJejZXOFFmczRxOHA3NEtsZjlBd3BMUXdEZ1lEVlIwUEFRSC9CQVFEQWdFR01BOEdBMVVkRXdFQi93UUYKTUFNQkFmOHdld1lEVlIwZkJIUXdjakE0b0RhZ05JWXlhSFIwY0RvdkwyTnliQzVqYjIxdlpHOWpZUzVqYjIwdgpRVUZCUTJWeWRHbG1hV05oZEdWVFpYSjJhV05sY3k1amNtd3dOcUEwb0RLR01HaDBkSEE2THk5amNtd3VZMjl0CmIyUnZMbTVsZEM5QlFVRkRaWEowYVdacFkyRjBaVk5sY25acFkyVnpMbU55YkRBTkJna3Foa2lHOXcwQkFRVUYKQUFPQ0FRRUFDRmI4QXZDYjZQK2srdFo3eGtTQXprL0V4ZllBV015bXRyd1VTV2dFZHVqbTdsM3NBZzlnMW8xUQpHRThtVGdIajVyQ2w3cis4ZEZSQnYvMzhFcmpIVDFyMGlXQUZmMkMzQlVyejl2SEN2OFM1ZElhMkxYMXJ6Tkx6ClJ0MHZ4dUJxdzhNMEF5eDlsdDFhd2c2bkNwbkJCWXVyREMvelhEclBiRGRWQ1lmZVUwQnNXTy84dHF0bGJnVDIKRzl3ODRGb1Z4cDdaOFZsSU1DRmxBMnpzNlNGejdKc0RvZUEzcmFBVkdJLzZ1Z0xPcHl5cEVCTXMxT1VJSnFzaQpsMkQ0a0Y1MDFLS2FVNzN5cVdqZ29tN0MxMnl4b3crZXYrdG81MWJ5cnZMakt6ZzZDWUcxYTRYWHZpM3RQeHEzCnNtUGk5V0lzZ3RScUFFRlE4VG1EbjVYcE5wYVliZz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1RdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89UXVvVmFkaXMgTGltaXRlZCBPVT1Sb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5CiMgU3ViamVjdDogQ049UXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPVF1b1ZhZGlzIExpbWl0ZWQgT1U9Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQojIExhYmVsOiAiUXVvVmFkaXMgUm9vdCBDQSIKIyBTZXJpYWw6IDk4NTAyNjY5OQojIE1ENSBGaW5nZXJwcmludDogMjc6ZGU6MzY6ZmU6NzI6Yjc6MDA6MDM6MDA6OWQ6ZjQ6ZjA6MWU6NmM6MDQ6MjQKIyBTSEExIEZpbmdlcnByaW50OiBkZTozZjo0MDpiZDo1MDo5MzpkMzo5Yjo2Yzo2MDpmNjpkYTpiYzowNzo2MjowMTowMDo4OTo3NjpjOQojIFNIQTI1NiBGaW5nZXJwcmludDogYTQ6NWU6ZGU6M2I6YmI6ZjA6OWM6OGE6ZTE6NWM6NzI6ZWY6YzA6NzI6Njg6ZDY6OTM6YTI6MWM6OTk6NmY6ZDU6MWU6Njc6Y2E6MDc6OTQ6NjA6ZmQ6NmQ6ODg6NzMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUYwRENDQkxpZ0F3SUJBZ0lFT3JaUWl6QU5CZ2txaGtpRzl3MEJBUVVGQURCL01Rc3dDUVlEVlFRR0V3SkMKVFRFWk1CY0dBMVVFQ2hNUVVYVnZWbUZrYVhNZ1RHbHRhWFJsWkRFbE1DTUdBMVVFQ3hNY1VtOXZkQ0JEWlhKMAphV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVEV1TUN3R0ExVUVBeE1sVVhWdlZtRmthWE1nVW05dmRDQkRaWEowCmFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVUQWVGdzB3TVRBek1Ua3hPRE16TXpOYUZ3MHlNVEF6TVRjeE9ETXoKTXpOYU1IOHhDekFKQmdOVkJBWVRBa0pOTVJrd0Z3WURWUVFLRXhCUmRXOVdZV1JwY3lCTWFXMXBkR1ZrTVNVdwpJd1lEVlFRTEV4eFNiMjkwSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNUzR3TEFZRFZRUURFeVZSCmRXOVdZV1JwY3lCU2IyOTBJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1JSUJJakFOQmdrcWhraUcKOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXYyRzFsVk82Vi96NjhtY0xPaHJmRVlCa2xiVFJ2TTE2ei9ZcApsaTRrVkVBa09QY2FoZHhZVE11a0owS1gwSitEaXNQa0JnTmJBS1ZSSG5BRWRPTEIxRHFyMTYwN0J4Z0ZqdjJECnJPcG0yUmdiYUlyMVZ4cVl1dlh0ZGoxODJkNlVhanRMRjhIVmo3MWxPRHFWMEQxVk5rN2ZlVmN4S2g3WVdXVkoKV0NDWWZxdGZmcC9wMWszc2czU3B4MnpZN2lsS2hTb0dGUGxVNXRQYVpRZUxZemNTMTlEc3czc2dRVVNqN2N1ZwpGK0Z4WmM0ZFpqSDNkZ0VaeUgwRFdMYVZTUjJtRWlib3hneDI0T05teStwZHBpYnU1Y3hmdldlbkFTY09vc3BVCnhiRjZsUjF4SGtvcGlnUGNha1hCcEJsZWJ6Yk53Nkt3dC81Y09PSlN2UGhFUSthUXV3SURBUUFCbzRJQ1VqQ0MKQWs0d1BRWUlLd1lCQlFVSEFRRUVNVEF2TUMwR0NDc0dBUVVGQnpBQmhpRm9kSFJ3Y3pvdkwyOWpjM0F1Y1hWdgpkbUZrYVhOdlptWnphRzl5WlM1amIyMHdEd1lEVlIwVEFRSC9CQVV3QXdFQi96Q0NBUm9HQTFVZElBU0NBUkV3CmdnRU5NSUlCQ1FZSkt3WUJCQUcrV0FBQk1JSDdNSUhVQmdnckJnRUZCUWNDQWpDQnh4cUJ4RkpsYkdsaGJtTmwKSUc5dUlIUm9aU0JSZFc5V1lXUnBjeUJTYjI5MElFTmxjblJwWm1sallYUmxJR0o1SUdGdWVTQndZWEowZVNCaApjM04xYldWeklHRmpZMlZ3ZEdGdVkyVWdiMllnZEdobElIUm9aVzRnWVhCd2JHbGpZV0pzWlNCemRHRnVaR0Z5ClpDQjBaWEp0Y3lCaGJtUWdZMjl1WkdsMGFXOXVjeUJ2WmlCMWMyVXNJR05sY25ScFptbGpZWFJwYjI0Z2NISmgKWTNScFkyVnpMQ0JoYm1RZ2RHaGxJRkYxYjFaaFpHbHpJRU5sY25ScFptbGpZWFJsSUZCdmJHbGplUzR3SWdZSQpLd1lCQlFVSEFnRVdGbWgwZEhBNkx5OTNkM2N1Y1hWdmRtRmthWE11WW0wd0hRWURWUjBPQkJZRUZJdExiZTNUCktia0dHZXc1T2Fud2w0UnF5Ky9mTUlHdUJnTlZIU01FZ2FZd2dhT0FGSXRMYmUzVEtia0dHZXc1T2Fud2w0UnEKeSsvZm9ZR0VwSUdCTUg4eEN6QUpCZ05WQkFZVEFrSk5NUmt3RndZRFZRUUtFeEJSZFc5V1lXUnBjeUJNYVcxcApkR1ZrTVNVd0l3WURWUVFMRXh4U2IyOTBJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1TNHdMQVlEClZRUURFeVZSZFc5V1lXUnBjeUJTYjI5MElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1Z2dRNnRsQ0wKTUE0R0ExVWREd0VCL3dRRUF3SUJCakFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBaXRRVXRmNzBtcEtuR2RTawpmbklZajlsb2ZGSWszV2R2T1hyRXFsNDk0bGl3VFhDWWhHSG9HK05wR0E3TyswZFFvRTcvOENRZnZiTE85U2Y4CjdDOVRxbk43QXoxMGJ1WVdudXVsTHNTL1ZpZFFLMks2dmtzY1BGVmNRUjBrdm9JZ1IxM1ZSSDU2Rm1qZmZVMVIKY0hoWEhUTWUvUUtabkF6TkNnVlB4N3VPcEhYNlNtMnhnSTRKVnJtY0dtRCtYY0hYZXR3UmVORFdYY0czMWEweQptUU02aXN4VUpUa3hnWHNUSWxHNlJteWh1NTc2Qkd4SkpuU1AwblByekRDaTV1cFpJb2Y0bC9VTy9lck1rcVFXCnhGSVk2aUhPc2ZIbWhJSGx1cW1HS1BKRFdsMFNuYXdlMmFqbENtcW5mNkNIS2MveWlVM1U3TVhpNW5yUU5pT0sKU25RMitRPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVF1b1ZhZGlzIFJvb3QgQ0EgMiBPPVF1b1ZhZGlzIExpbWl0ZWQKIyBTdWJqZWN0OiBDTj1RdW9WYWRpcyBSb290IENBIDIgTz1RdW9WYWRpcyBMaW1pdGVkCiMgTGFiZWw6ICJRdW9WYWRpcyBSb290IENBIDIiCiMgU2VyaWFsOiAxMjg5CiMgTUQ1IEZpbmdlcnByaW50OiA1ZTozOTo3YjpkZDpmODpiYTplYzo4MjplOTphYzo2MjpiYTowYzo1NDowMDoyYgojIFNIQTEgRmluZ2VycHJpbnQ6IGNhOjNhOmZiOmNmOjEyOjQwOjM2OjRiOjQ0OmIyOjE2OjIwOjg4OjgwOjQ4OjM5OjE5OjkzOjdjOmY3CiMgU0hBMjU2IEZpbmdlcnByaW50OiA4NTphMDpkZDo3ZDpkNzoyMDphZDpiNzpmZjowNTpmODozZDo1NDoyYjoyMDo5ZDpjNzpmZjo0NToyODpmNzpkNjo3NzpiMTo4Mzo4OTpmZTphNTplNTpjNDo5ZTo4NgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRnR6Q0NBNStnQXdJQkFnSUNCUWt3RFFZSktvWklodmNOQVFFRkJRQXdSVEVMTUFrR0ExVUVCaE1DUWsweApHVEFYQmdOVkJBb1RFRkYxYjFaaFpHbHpJRXhwYldsMFpXUXhHekFaQmdOVkJBTVRFbEYxYjFaaFpHbHpJRkp2CmIzUWdRMEVnTWpBZUZ3MHdOakV4TWpReE9ESTNNREJhRncwek1URXhNalF4T0RJek16TmFNRVV4Q3pBSkJnTlYKQkFZVEFrSk5NUmt3RndZRFZRUUtFeEJSZFc5V1lXUnBjeUJNYVcxcGRHVmtNUnN3R1FZRFZRUURFeEpSZFc5VwpZV1JwY3lCU2IyOTBJRU5CSURJd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUNhCkdNcExsQTBBTGE4REtZcndENEhJcmt3WmhSMEluNnNwUklYekw0R3RNaDZRUnIramhpWWFIdjUrSEJnNlhKeGcKRnlvNmRJTXpNSDFoVkJITDdhdmc1dEtpZnZWcmJ4aTNDZ3N0L2VrKzd3ckdzeERwM01KR0YvaGQvYVRhLzU1SgpXcHptTStZa2x2Yy91bHNySEhvMXd0Wm4vcXRtVUl0dEtHQXI3OWRndzhlVHZJMDJrZk4vK05zUkU4U2NkM2JCCnJyY0Nhb0Y2cVVXRDRnWG11VmJCbERlUFNIRmpJdXdYWlFlVmlrdmZqOFphQ3VXdzQxOWVheEdyRFBtRjYwVHAKK0FSejh1bitYSmlNOVhPdmE3Uit6ZFJjQWl0TU9lR3lsWlV0UW9mWDFiT1FRN2RzRS9IZTNmYkUrSWsvMFhYMQprc09SMVlxSTBKRHMzRzNlaWNKbGNaYUxEUVA5bkw5YkZxeVMyK3IrZVh5dDY2LzNGc3ZielNVcjVSLzdtcC9pClVjdzZVd3hJNWc2OXliUjJCbExtRVJPRmNtTURCT0FFTmlzZ0dRTG9kS2NmdHNsV1p2QjFKZHhud1E1aFlJaXoKUHRHby9LUGFIYkRSc1NOVTMwUjJiZTFCMk1HeUlyWlRITjgxSGR5aGR5b3g1QzMxNWVYYnlPRC81WURYQzJPZwovek9oRDdvc0ZSWHFsN1BTb3JXKzhveVdIaHFQSFd5a1lUZTVobk16MTVlV25pTjlncVJNZ2VLaDBicG5YNVVICm95Y1I3aFlRZTd4RlNreXlCTktyNzlYOURGSE9VR29JTWZtUjJneVBaRndEd3pxTElEOXVqV2M5T3RiK2ZWdUkKeVY3N3pHSGNpek4zMDBReU5RbGlCSklXRU5pZUowZjdPeUhqK09zZFd3SURBUUFCbzRHd01JR3RNQThHQTFVZApFd0VCL3dRRk1BTUJBZjh3Q3dZRFZSMFBCQVFEQWdFR01CMEdBMVVkRGdRV0JCUWFoR0s4U0V3ekpRVFU3dEQyCkE4UVpSdEdVYXpCdUJnTlZIU01FWnpCbGdCUWFoR0s4U0V3ekpRVFU3dEQyQThRWlJ0R1VhNkZKcEVjd1JURUwKTUFrR0ExVUVCaE1DUWsweEdUQVhCZ05WQkFvVEVGRjFiMVpoWkdseklFeHBiV2wwWldReEd6QVpCZ05WQkFNVApFbEYxYjFaaFpHbHpJRkp2YjNRZ1EwRWdNb0lDQlFrd0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dJQkFENEtGazJmCkJsdW9ybkZkTHdVdlorWVRSWVBFTnZiendDWU1EYlZIWkYzNHRITEpScVVER0NkVmlYaDlkdXFXTklBWElOem4KZy9pTi9BZTQybDlOTG1leWhQM1pSUHgzVUlIbWZMVEpEUXR5VS9oMkJ3ZEJSNVlNKytDQ0pwTlZqUDRpSDJCbApmRi9uSnJQM01wQ1lVTlEzY1ZYMmtpRjQ5NVY1K3ZndEpvZG1WakIzcGpkNE0xSVFXSzQvWVk3eWFySHZHSDVLCldXUEtqYUpXMWFjdnZGWWZ6em5CNHZzS3FCVXNmVTE2WThac2wwUTgwbS9EU2hjSytKRFNWNklaVWFVdGwwSGEKQjArcFVOcVFqWlJHNFQ3d2xQMFFBRGoxTytoQTRiUnVWaG9nekc5WWplMHVSWS9XNlpNLzU3RXMzenJXSW96YwpoTHNpYjlENDVNWTU2UVNJUE1PNjYxVjZiWUNaSlBWc0FmdjRsN0NVVyt2OTBtL3hkMmdOTldRanJMaFZvUVBSClRVSVozUGgxV1ZhaithaEplZml2RHJrUm9IeTNhdTAwMExZbVlqZ2Fod3o0NlAwdTA1Qi9CNUVxSGRaK1hJV0QKbWJBNENEL3BYdmsxQitUSlltNVhmNmRRbGZlNnlKdm1qcUlCeGRabXYzbGg4endjNGJtQ1hGMmd3K25ZU0wwWgpvaEVVR1c2eWhodG9Qa2czR29pM1haWmVuTWZ2SjJJSTRwRVpYTkx4SWQyNkYwS0NsM0dCVXpHcG4vWjlZcjl5CjRhT1RIY3lLSmxvSk9ORE8xdzJBRnJSNHBUcUhUSTJLcGRWR2wvSXNFTG04VkNMQUFWQnBRNTcwc3U5dCtPemEKOGVPeDc5K1JqMVFxQ3lYQkpobkVVaEFGWmRXQ0VPckNNYzB1Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1RdW9WYWRpcyBSb290IENBIDMgTz1RdW9WYWRpcyBMaW1pdGVkCiMgU3ViamVjdDogQ049UXVvVmFkaXMgUm9vdCBDQSAzIE89UXVvVmFkaXMgTGltaXRlZAojIExhYmVsOiAiUXVvVmFkaXMgUm9vdCBDQSAzIgojIFNlcmlhbDogMTQ3OAojIE1ENSBGaW5nZXJwcmludDogMzE6ODU6M2M6NjI6OTQ6OTc6NjM6Yjk6YWE6ZmQ6ODk6NGU6YWY6NmY6ZTA6Y2YKIyBTSEExIEZpbmdlcnByaW50OiAxZjo0OToxNDpmNzpkODo3NDo5NToxZDpkZDphZTowMjpjMDpiZTpmZDozYToyZDo4Mjo3NTo1MTo4NQojIFNIQTI1NiBGaW5nZXJwcmludDogMTg6ZjE6ZmM6N2Y6MjA6NWQ6Zjg6YWQ6ZGQ6ZWI6N2Y6ZTA6MDc6ZGQ6NTc6ZTM6YWY6Mzc6NWE6OWM6NGQ6OGQ6NzM6NTQ6NmI6ZjQ6ZjE6ZmU6ZDE6ZTE6OGQ6MzUKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUduVENDQklXZ0F3SUJBZ0lDQmNZd0RRWUpLb1pJaHZjTkFRRUZCUUF3UlRFTE1Ba0dBMVVFQmhNQ1FrMHgKR1RBWEJnTlZCQW9URUZGMWIxWmhaR2x6SUV4cGJXbDBaV1F4R3pBWkJnTlZCQU1URWxGMWIxWmhaR2x6SUZKdgpiM1FnUTBFZ016QWVGdzB3TmpFeE1qUXhPVEV4TWpOYUZ3MHpNVEV4TWpReE9UQTJORFJhTUVVeEN6QUpCZ05WCkJBWVRBa0pOTVJrd0Z3WURWUVFLRXhCUmRXOVdZV1JwY3lCTWFXMXBkR1ZrTVJzd0dRWURWUVFERXhKUmRXOVcKWVdScGN5QlNiMjkwSUVOQklETXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFETQpWMElXVkp6bW1OUFRUZTcrN2NlZlF6bEtaYlBvRm9nMDJ3MVprWFRQa3JnRVFLMENTekdydkkyUmFOZ2dEaG9CCjRocDdUaGRkNG9xM1A1a2F6ZXRocThKbHBoKzN0NzIzai96OWNJOExvR2UrQWFKWnozSG1EeWwyLzdGV2VVVXIKSDU1NlZPaWpLVFZvcEFGUEQ2UXVOKzhiditPUEVLaHlxMWhYNTFTR3lNbnpXOW9zMmwyT2JqeWpQdHI3Z3VYZAo4bHl5QlROdmlqYk8wQk5PLzc5S0REUk1wc01odlZBRVZldXh1NTM3UlI1a0ZkNVZBWXdDZHJYTG9UOUNhYnd2CnZXaERGbGFKS2pkaGtmMm1yazdBeXhSbGxEZExrZ2J2Qk5ESW5JamJDM3VCcjdFOUtzUmxPbmkyN3R5QXNkTFQKbVp3NjdtdGFhN09OdDlYT25NSytwVXN2RnJHZWFEc0diNjU5bi9qZTdNd3BwNWlqSlVNdjcvRmZKdUdJVGZoZQpidGZaRkc0Wk0ybW5PNFNKazhSVFZST2hVWGhBK0xqSm91NTd1bEpDZzU0VTdRVlNXbGxXcDVmOG5UOEtLZGpjClQ1RU9FN3plbGFUZmk1bStySnN6aU8rMWdhOGJ4aUpUeVBiSDdwY1VzTVY4ZUZMSThNNXVkMkNFcHVrcWRpRHQKV0FFWE1KUHBHb3ZnYzJQWmFwS1VTVTYwclVxRnhLTWlNUHdKN1dnaWM2YUlERlVoV01YaE9wOHEzY3Joa09EWgpjNnRzZ0xqb0MyU1RvSnlNR2YrejBnenNrU2FIaXJPaTRYQ1BMQXJselcxb1VldmFQd1YvaXpMbUUxeHIvbDlBCjRpTEl0TFJrVDlhNmZVZytxR2tNMTd1R2NjbHp1RDg3blNWTDJ2OUE2d0lEQVFBQm80SUJsVENDQVpFd0R3WUQKVlIwVEFRSC9CQVV3QXdFQi96Q0I0UVlEVlIwZ0JJSFpNSUhXTUlIVEJna3JCZ0VFQWI1WUFBTXdnY1V3Z1pNRwpDQ3NHQVFVRkJ3SUNNSUdHR29HRFFXNTVJSFZ6WlNCdlppQjBhR2x6SUVObGNuUnBabWxqWVhSbElHTnZibk4wCmFYUjFkR1Z6SUdGalkyVndkR0Z1WTJVZ2IyWWdkR2hsSUZGMWIxWmhaR2x6SUZKdmIzUWdRMEVnTXlCRFpYSjAKYVdacFkyRjBaU0JRYjJ4cFkza2dMeUJEWlhKMGFXWnBZMkYwYVc5dUlGQnlZV04wYVdObElGTjBZWFJsYldWdQpkQzR3TFFZSUt3WUJCUVVIQWdFV0lXaDBkSEE2THk5M2QzY3VjWFZ2ZG1Ga2FYTm5iRzlpWVd3dVkyOXRMMk53CmN6QUxCZ05WSFE4RUJBTUNBUVl3SFFZRFZSME9CQllFRlBMQUUrQ0NRejc3N2k5bk1wWTFYTnU0eXdMUU1HNEcKQTFVZEl3Um5NR1dBRlBMQUUrQ0NRejc3N2k5bk1wWTFYTnU0eXdMUW9VbWtSekJGTVFzd0NRWURWUVFHRXdKQwpUVEVaTUJjR0ExVUVDaE1RVVhWdlZtRmthWE1nVEdsdGFYUmxaREViTUJrR0ExVUVBeE1TVVhWdlZtRmthWE1nClVtOXZkQ0JEUVNBemdnSUZ4akFOQmdrcWhraUc5dzBCQVFVRkFBT0NBZ0VBVDYyZ0xFejZ3UEp2OTJaVnF5TTAKN3VjcDJzTmJ0ckNEMmREUTRpSDc4MkNuTzExZ1V5ZWltL1lJSWlybnY2Qnk1WndrYWpHeGtIb24yNFFSaVNlbQpkMW80MTcrc2h2enVYWU84QnNiUmQyc1BiU1F2UzNwc3B3ZVd5dU9FbjYySWl4MnJGbzFiWmhmWkZ2U0xnTkxkCitMSjJ3L3c0RTZvTTNrSnBLMjd6UE91QUo5djFwa1FObjFwVldRdlZEVkpJeGE2ZjhpK0F4ZW95VURVU2x5N0IKNGYveEk0aFJPSi95WmxaMjV3OVJsNlZTREUxSlVaVTJQYitpU3d3UUhZYVpUS3J6Y2hHVDVPcjJtOXFvWGFkTgp0NTRDcm5NQXlOb2pBK2o1NmhsMFlnQ1V5eUlndnBTbldiV0NhcjZaZVhxcDhrb2tVdmQwL2JwTzVxZ2RBbTZ4CkRZQkV3YTdUSXpkZnU0VjhLNUl1Nkg2bGk5Mlo0YjhuYnkxZHFudUgvZ3JkUy95TzlTYmtibkJDYmpQc01aNTcKazhIa3lXa2FQY0JyVGlKdDdxdFlUY2JRUWNFcjZrOFNoMTdyUmRoczlaZ0MwNkRZVllvR21SbWlvSGZSTUo2cwp6SFh1Zy9Xd1lqblBiRmZpVE5LUkN3NTFLQnVhdi8wYVEvSEtkL3M3ajJHNGFTZ1dRZ1JlY0NvY0lkaVA0YjBqCld5MTBRSkxaWXhrTmM5MXB2R0pIdk9CMEs3THJmYjVCRzdYQVJzV2hJc3RmVHNFb2t0NFl1dFVxS0xzUml4ZVQKbUpsZ2xGd2p6MW9ubDE0TEJRYVROeDQ3YVRicnFaNWhIWTh5Mm80TTFuUStld2trMmdGM1I4UTd6VFNNbWZYSwo0U1ZoTTdKWkcrSnUxemRYdGcycEV0bz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IE89U0VDT00gVHJ1c3QubmV0IE9VPVNlY3VyaXR5IENvbW11bmljYXRpb24gUm9vdENBMQojIFN1YmplY3Q6IE89U0VDT00gVHJ1c3QubmV0IE9VPVNlY3VyaXR5IENvbW11bmljYXRpb24gUm9vdENBMQojIExhYmVsOiAiU2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290IENBIgojIFNlcmlhbDogMAojIE1ENSBGaW5nZXJwcmludDogZjE6YmM6NjM6NmE6NTQ6ZTA6YjU6Mjc6ZjU6Y2Q6ZTc6MWE6ZTM6NGQ6NmU6NGEKIyBTSEExIEZpbmdlcnByaW50OiAzNjpiMToyYjo0OTpmOTo4MTo5ZTpkNzo0Yzo5ZTpiYzozODowZjpjNjo1Njo4Zjo1ZDphYzpiMjpmNwojIFNIQTI1NiBGaW5nZXJwcmludDogZTc6NWU6NzI6ZWQ6OWY6NTY6MGU6ZWM6NmU6YjQ6ODA6MDA6NzM6YTQ6M2Y6YzM6YWQ6MTk6MTk6NWE6Mzk6MjI6ODI6MDE6Nzg6OTU6OTc6NGE6OTk6MDI6NmI6NmMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURXakNDQWtLZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRVUZBREJRTVFzd0NRWURWUVFHRXdKS1VERVkKTUJZR0ExVUVDaE1QVTBWRFQwMGdWSEoxYzNRdWJtVjBNU2N3SlFZRFZRUUxFeDVUWldOMWNtbDBlU0JEYjIxdApkVzVwWTJGMGFXOXVJRkp2YjNSRFFURXdIaGNOTURNd09UTXdNRFF5TURRNVdoY05Nak13T1RNd01EUXlNRFE1CldqQlFNUXN3Q1FZRFZRUUdFd0pLVURFWU1CWUdBMVVFQ2hNUFUwVkRUMDBnVkhKMWMzUXVibVYwTVNjd0pRWUQKVlFRTEV4NVRaV04xY21sMGVTQkRiMjF0ZFc1cFkyRjBhVzl1SUZKdmIzUkRRVEV3Z2dFaU1BMEdDU3FHU0liMwpEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUN6cy81LzAyMng3eFo4VjZVTWJYYUtMMHUvWlB0TTdvcnc4eWw4CjlmL3VLdURwNmJwYlpDS2FtbThzT2lacFVRV1pKdHpWSEdweHhwcDlIcDNkZkd6R2pHZG5Tajc0Y2JBWko2a0oKREthVnYwdU1EUHBWbUR2WTZDS2hTM0U0ZWF5WGttbXppWDdxSVdnR21CU1doOUpoTnJ4dEoxYWVWKzdBd0ZiOQpNcytrMlk3Q0k5ZU5xUFBZSmF5WDVIQTQ5TFk2dEowN2x5WkRvNkc4U1ZseVRDTXdod0ZZOWs2K0hHaFdacS9OClFWM0lzMDBxVlVhckg5b2U0a0E5MjgxOXVaS0FuRGZkREpaa25kd2k5MlNMMzJIZUZaUlNGYUI5VXNsTHFDSEoKeHJIdHk4T1ZZTkVQOEt0dytOL0xUWDdzMXZxcjJiMS9WUEtsNlhuNjJkWjJKQ2h6QWdNQkFBR2pQekE5TUIwRwpBMVVkRGdRV0JCU2djMG1aYU55RlcyWGpteWd2VjUrOU03d0hTREFMQmdOVkhROEVCQU1DQVFZd0R3WURWUjBUCkFRSC9CQVV3QXdFQi96QU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFhRUNwcUx2a1QxMTVzd1cxRjdOZ0UrdkcKa2wzZzBkTnEvdnUrbTIyL3h3VnRXU0RFSFBDMzJvUllBbVA2U0JidlQ2VUw5MHFZOGorZUc2MUhhMlBPQ0VmcgpVajk0bks5TnJ2alZUOCthbUNvUVFUbFN4TjNabXc3dmt3R3VzaTdLYUVJa1FteXdzem8remVuYVNNUVZ5K241CkJ3K1NVRW1LM1RHWFg4bnBONm83V1dXWGxETEpzNTgrT21KWXhVbXRZZzV4cFRLcUw4YUpka05BRXhOblBhSlUKSlJETDhUcnkyZnJiU1ZhN3B2Nm5RVFhENEloaHlZakgzellRSXBoWjZyQksrMVlXYzI2c1RmY2lvVSt0SFhvdApSU2ZsTU1GZTh0b1R5eVZDVVpWSEE0eHNJY3gwUXUxVC96T0xqdzlYQVJZdno2YnV5WEFpRkwzOXZtd0xBdz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1Tb25lcmEgQ2xhc3MyIENBIE89U29uZXJhCiMgU3ViamVjdDogQ049U29uZXJhIENsYXNzMiBDQSBPPVNvbmVyYQojIExhYmVsOiAiU29uZXJhIENsYXNzIDIgUm9vdCBDQSIKIyBTZXJpYWw6IDI5CiMgTUQ1IEZpbmdlcnByaW50OiBhMzplYzo3NTowZjoyZTo4ODpkZjpmYTo0ODowMTo0ZTowYjo1Yzo0ODo2ZjpmYgojIFNIQTEgRmluZ2VycHJpbnQ6IDM3OmY3OjZkOmU2OjA3OjdjOjkwOmM1OmIxOjNlOjkzOjFhOmI3OjQxOjEwOmI0OmYyOmU0OjlhOjI3CiMgU0hBMjU2IEZpbmdlcnByaW50OiA3OTowODpiNDowMzoxNDpjMTozODoxMDowYjo1MTo4ZDowNzozNTo4MDo3ZjpmYjpmYzpmODo1MTo4YTowMDo5NTozMzo3MTowNTpiYTozODo2YjoxNTozZDpkOToyNwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRElEQ0NBZ2lnQXdJQkFnSUJIVEFOQmdrcWhraUc5dzBCQVFVRkFEQTVNUXN3Q1FZRFZRUUdFd0pHU1RFUApNQTBHQTFVRUNoTUdVMjl1WlhKaE1Sa3dGd1lEVlFRREV4QlRiMjVsY21FZ1EyeGhjM015SUVOQk1CNFhEVEF4Ck1EUXdOakEzTWprME1Gb1hEVEl4TURRd05qQTNNamswTUZvd09URUxNQWtHQTFVRUJoTUNSa2t4RHpBTkJnTlYKQkFvVEJsTnZibVZ5WVRFWk1CY0dBMVVFQXhNUVUyOXVaWEpoSUVOc1lYTnpNaUJEUVRDQ0FTSXdEUVlKS29aSQpodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUpBWFNqV2R5dkFObHNkRStoWTMvRWk5dlgrQUxUVTc0VytvClo2bS9BeHhOakc4eVI5VkJhS1FUQk1FMURKcUVRL3hjSGYrSnMrZ1hHTTJSWC91SjQrcS9UbDE4R3liVGRYbnQKNW9UalYrV3RLY1QwT2lqbnBYdUVObW16L1Y1MnZhTXRtZE9RVGlNb2ZSaGo4VlE3SnAxMlc1ZENzdit1OEU3cwozVG1WVG9NR2YrZEpRTWpGQWJKVVdtWWRQZno1NlR3S25vRzRjUEFCaStRalZIeklydmlRSGdDV2N0UlV6MkVqCnZPcjduUUtWMGJhNWNUcHBDRDhQdE9GQ3g0ajFQNWlvcDdvYzRIRng3MWhYZ1ZCNlhHdDBSZzZEQTVqRGpxaHUKOG5ZeWJpZUR3blB6M0Jqb3RKUHFkVVJyQkdBZ2NWZUhuZk8rb0pBalBZb2s0ZG9oMjhNQ0F3RUFBYU16TURFdwpEd1lEVlIwVEFRSC9CQVV3QXdFQi96QVJCZ05WSFE0RUNnUUlTcUNxV0lUVFhqd3dDd1lEVlIwUEJBUURBZ0VHCk1BMEdDU3FHU0liM0RRRUJCUVVBQTRJQkFRQmF6b2Y1Rm5JVlYwc2QyWnZub2lZdzdKTm4zOVl0MGpTdjl6aWwKenFzV3Vhc3ZmRFhMck5BUHRFd3IvSUR2YTR5Ulh6WjI5OXV6R3hucTlMSVIvV0Z4Ukw4b3N6b2R2N05ENkorLwozREVJY2JDZGpkWTBSektReG1Vazk2QktmQVJ6anpsdkY0eHl0YjFMeUhyNGU0UERLRTZjQ2VwblA3Sm5CQnZECkZOcjQ1MGtra2RBZGF2cGhPZTlyNXlGMUJnZllFclFoSUhCQ2NZSGFQSm8ydnFaYkRXcHNtaCtSZS9uNTcwSzYKVGs2ZXpBeU5sTnpaUlp4ZTdFSlFZNjcwWGNTeEV0ektPNmd1blJSYUJYVzM3TmRqNHJvMXRnUUlrZWphblp6MgpaclVZckFxbVZDWTBNOUlid2RSL0dqcU9DNm95YnR2OFR5V2YyVExIbGxwd3JOOU0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVhSYW1wIEdsb2JhbCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPVhSYW1wIFNlY3VyaXR5IFNlcnZpY2VzIEluYyBPVT13d3cueHJhbXBzZWN1cml0eS5jb20KIyBTdWJqZWN0OiBDTj1YUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1YUmFtcCBTZWN1cml0eSBTZXJ2aWNlcyBJbmMgT1U9d3d3LnhyYW1wc2VjdXJpdHkuY29tCiMgTGFiZWw6ICJYUmFtcCBHbG9iYWwgQ0EgUm9vdCIKIyBTZXJpYWw6IDEwNzEwODkwODgwMzY1MTUwOTY5Mjk4MDEyNDIzMzc0NTAxNDk1NwojIE1ENSBGaW5nZXJwcmludDogYTE6MGI6NDQ6YjM6Y2E6MTA6ZDg6MDA6NmU6OWQ6MGY6ZDg6MGY6OTI6MGE6ZDEKIyBTSEExIEZpbmdlcnByaW50OiBiODowMTo4NjpkMTplYjo5Yzo4NjphNTo0MTowNDpjZjozMDo1NDpmMzo0Yzo1MjpiNzplNTo1ODpjNgojIFNIQTI1NiBGaW5nZXJwcmludDogY2U6Y2Q6ZGM6OTA6NTA6OTk6ZDg6ZGE6ZGY6YzU6YjE6ZDI6MDk6Yjc6Mzc6Y2I6ZTI6YzE6OGM6ZmI6MmM6MTA6YzA6ZmY6MGI6Y2Y6MGQ6MzI6ODY6ZmM6MWE6YTIKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVNRENDQXhpZ0F3SUJBZ0lRVUpSczdCanExWnhOMVpmdmRZK2dyVEFOQmdrcWhraUc5dzBCQVFVRkFEQ0IKZ2pFTE1Ba0dBMVVFQmhNQ1ZWTXhIakFjQmdOVkJBc1RGWGQzZHk1NGNtRnRjSE5sWTNWeWFYUjVMbU52YlRFawpNQ0lHQTFVRUNoTWJXRkpoYlhBZ1UyVmpkWEpwZEhrZ1UyVnlkbWxqWlhNZ1NXNWpNUzB3S3dZRFZRUURFeVJZClVtRnRjQ0JIYkc5aVlXd2dRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrd0hoY05NRFF4TVRBeE1UY3gKTkRBMFdoY05NelV3TVRBeE1EVXpOekU1V2pDQmdqRUxNQWtHQTFVRUJoTUNWVk14SGpBY0JnTlZCQXNURlhkMwpkeTU0Y21GdGNITmxZM1Z5YVhSNUxtTnZiVEVrTUNJR0ExVUVDaE1iV0ZKaGJYQWdVMlZqZFhKcGRIa2dVMlZ5CmRtbGpaWE1nU1c1ak1TMHdLd1lEVlFRREV5UllVbUZ0Y0NCSGJHOWlZV3dnUTJWeWRHbG1hV05oZEdsdmJpQkIKZFhSb2IzSnBkSGt3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ1lKQjY5RmJTNgozOGVNcFNlMk9BdHA4N1pPcUN3dUlSMWNSTjhoWFg0amRQNWVmclJLdDZhdEg2N2dCaGJpbTF2WlozUnJYWUNQCktaMkdHOW1jRFpodGRoQW9XT1Jsc0g5S21IbWY0TU14Zm9BcnRZekFRRHNSaHRETG9vWTJZS1RWTUlKdDJXN1EKRHhJRU01ZGZUMkZhOE9UNWthdm5IVHU4Nk0vMGF5MDBmT0pJWVJ5TzgyRkV6RytnU3FtVXNFM2E1NmswZW5JNApxRUhNUEpRUmZldklwb3kzaHN2S016dlpQVGVMKzNvK2hpem5jOWNLVjZ4a214bnI5QThFQ0lxc0F4Y1paUFJhCkpTS05OQ3l5OW1nZEVtM1RpaDRVMnNTUHB1SWpoZFY2RGIxcTRPbnM3QmU3UWh0bnFpWHRSWU1oL01ISmZOVmkKUHZyeXhTM1QvZFJsQWdNQkFBR2pnWjh3Z1p3d0V3WUpLd1lCQkFHQ054UUNCQVllQkFCREFFRXdDd1lEVlIwUApCQVFEQWdHR01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZNWlBvajBHWTRRSm5NNWk1QVNzCmpWeTE2YlliTURZR0ExVWRId1F2TUMwd0s2QXBvQ2VHSldoMGRIQTZMeTlqY213dWVISmhiWEJ6WldOMWNtbDAKZVM1amIyMHZXRWREUVM1amNtd3dFQVlKS3dZQkJBR0NOeFVCQkFNQ0FRRXdEUVlKS29aSWh2Y05BUUVGQlFBRApnZ0VCQUpFVk9RTUJHMmY3U2h6NUNtQmJvZHBObDJMNUpGTW4xNEprVHBBdXcwa2JLNXJjL0toNFp6WHhIZkFSCnZiZEk0eEQyRGQ4LzBzbTJxbFdrU0xvQzI5NVpMaFZiTzUwV2ZVZlhOK3BmVFhZU05yc2YxNkdCQkVZZ295eHQKcVo0QmZqOHB6Z0NUMy8zSmtuT0ppV1NlNXl2a0hKRXMwcm5PZmM1dk1ablQ1cjdTSHBEd0NSUjVYQ09yVGRMYQpJUjlObVhtZDRjOG5ueENiSElnTnNJcGtRVEc0RG15UUpLU2JYSEdQdXJ0K0hCdmJhb0FQSWJ6cDI2YTNRUFN5Cmk2bXg1TythR3RBOWFabnVxQ2lqNFR5ejhMSVJuTTk4UU9iZDUwTjlvdGc2dGFtTjhqU1p4TlFRNFFiOUNZUVEKTys3RVRQVHNKM3hDd25SOGdvb0p5YlFESmJ3PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogTz1UaGUgR28gRGFkZHkgR3JvdXAsIEluYy4gT1U9R28gRGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQojIFN1YmplY3Q6IE89VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuIE9VPUdvIERhZGR5IENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKIyBMYWJlbDogIkdvIERhZGR5IENsYXNzIDIgQ0EiCiMgU2VyaWFsOiAwCiMgTUQ1IEZpbmdlcnByaW50OiA5MTpkZTowNjoyNTphYjpkYTpmZDozMjoxNzowYzpiYjoyNToxNzoyYTo4NDo2NwojIFNIQTEgRmluZ2VycHJpbnQ6IDI3Ojk2OmJhOmU2OjNmOjE4OjAxOmUyOjc3OjI2OjFiOmEwOmQ3Ojc3OjcwOjAyOjhmOjIwOmVlOmU0CiMgU0hBMjU2IEZpbmdlcnByaW50OiBjMzo4NDo2YjpmMjo0Yjo5ZTo5MzpjYTo2NDoyNzo0YzowZTpjNjo3YzoxZTpjYzo1ZTowMjo0ZjpmYzphYzpkMjpkNzo0MDoxOTozNTowZTo4MTpmZTo1NDo2YTplNAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRUFEQ0NBdWlnQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFVRkFEQmpNUXN3Q1FZRFZRUUdFd0pWVXpFaApNQjhHQTFVRUNoTVlWR2hsSUVkdklFUmhaR1I1SUVkeWIzVndMQ0JKYm1NdU1URXdMd1lEVlFRTEV5aEhieUJFCllXUmtlU0JEYkdGemN5QXlJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1CNFhEVEEwTURZeU9URTMKTURZeU1Gb1hEVE0wTURZeU9URTNNRFl5TUZvd1l6RUxNQWtHQTFVRUJoTUNWVk14SVRBZkJnTlZCQW9UR0ZSbwpaU0JIYnlCRVlXUmtlU0JIY205MWNDd2dTVzVqTGpFeE1DOEdBMVVFQ3hNb1IyOGdSR0ZrWkhrZ1EyeGhjM01nCk1pQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVRDQ0FTQXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRU4KQURDQ0FRZ0NnZ0VCQU42ZDErcFhHRW1oVyt2WFgwaUc2cjdkLytUdlp4ejBaV2l6VjNHZ1huZTc3WnRKNlhDQQpQVllZWXdodjJ2TE0wRDkvQWxRaVZCRFlzb0hVd0hVOVMzL0hkOE0rZUtzYUE3VWdheTlxSzdIRmlIN0V1eDZ3CndkaEZKMitxTjFqM2h5YlgyQzMycVJlM0gzSTJUcVlYUDJXWWt0c3FibDJpL29qZ0M5NS81WTBWNGV2TE90WGkKRXFJVExkaU9yMThTUGFBSUJRaTJYS1ZsT0FSRm1SNmpZR0IweFVHbGNtSWJZc1VmYjE4YVFyNENVV1dvcmlNWQphdng0QTZsTmY0REQrcXRhL0tGQXBNb1pGdjZ5eU85ZWN3M3VkNzJhOW5tWXZMRUhaNklWRGQyZ1dNWkVld28rCllpaGZ1a0VIVTFqUEVYNDRkTVg0LzdWcGtJK0VkT3FYRzY4Q0FRT2pnY0F3Z2Iwd0hRWURWUjBPQkJZRUZOTEUKc05LUjFFd1JjYk5oeXoyaC90Mm9hdFRqTUlHTkJnTlZIU01FZ1lVd2dZS0FGTkxFc05LUjFFd1JjYk5oeXoyaAovdDJvYXRUam9XZWtaVEJqTVFzd0NRWURWUVFHRXdKVlV6RWhNQjhHQTFVRUNoTVlWR2hsSUVkdklFUmhaR1I1CklFZHliM1Z3TENCSmJtTXVNVEV3THdZRFZRUUxFeWhIYnlCRVlXUmtlU0JEYkdGemN5QXlJRU5sY25ScFptbGoKWVhScGIyNGdRWFYwYUc5eWFYUjVnZ0VBTUF3R0ExVWRFd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVGQlFBRApnZ0VCQURKTDg3TEtQcEg4RXNhaEI0eU9kNkF6QmhSY2tCNFk5d2ltUFFvWitZZUFFVzVwNUpZWE1QODBrV055Ck9PN01IQUdqSFpRb3BESDJlc1JVMS9ibE1WZ0Rvc3pPWXR1VVJYTzF2MFhKSkxYVmdnS3RJM2xwamJpMlRjN1AKVE1vekkrZ2NpS3FkaTBGdUZza2c1WW1lelR2YWNQZCttU1lnRkZRbHEyNXpoZWFiSVowS2JJSU9xUGpDRFBvUQpIbXlXNzRjTnhBOWhpNjN1Z3l1VitJNlNoSEk1NnlEcWcrMkR6WmR1Q0x6clRpYTJjeXZrMC9aTS9pWng0bUVSCmRFci9WeHFIRDNWSUxzOVJhUmVnQWhKaGxkWFJRTElRVE83RXJCQkRwcVdlQ3RXVllwb056NGlDeFRJTTVDdWYKUmVZTm55aWNzYmtxV2xldE53K3ZIWC9idlo4PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogTz1TdGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuIE9VPVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5CiMgU3ViamVjdDogTz1TdGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuIE9VPVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5CiMgTGFiZWw6ICJTdGFyZmllbGQgQ2xhc3MgMiBDQSIKIyBTZXJpYWw6IDAKIyBNRDUgRmluZ2VycHJpbnQ6IDMyOjRhOjRiOmJiOmM4OjYzOjY5OjliOmJlOjc0OjlhOmM2OmRkOjFkOjQ2OjI0CiMgU0hBMSBGaW5nZXJwcmludDogYWQ6N2U6MWM6Mjg6YjA6NjQ6ZWY6OGY6NjA6MDM6NDA6MjA6MTQ6YzM6ZDA6ZTM6Mzc6MGU6YjU6OGEKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDE0OjY1OmZhOjIwOjUzOjk3OmI4Ojc2OmZhOmE2OmYwOmE5Ojk1OjhlOjU1OjkwOmU0OjBmOmNjOjdmOmFhOjRmOmI3OmMyOmM4OjY3Ojc1OjIxOmZiOjVmOmI2OjU4Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFRHpDQ0F2ZWdBd0lCQWdJQkFEQU5CZ2txaGtpRzl3MEJBUVVGQURCb01Rc3dDUVlEVlFRR0V3SlZVekVsCk1DTUdBMVVFQ2hNY1UzUmhjbVpwWld4a0lGUmxZMmh1YjJ4dloybGxjeXdnU1c1akxqRXlNREFHQTFVRUN4TXAKVTNSaGNtWnBaV3hrSUVOc1lYTnpJRElnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa3dIaGNOTURRdwpOakk1TVRjek9URTJXaGNOTXpRd05qSTVNVGN6T1RFMldqQm9NUXN3Q1FZRFZRUUdFd0pWVXpFbE1DTUdBMVVFCkNoTWNVM1JoY21acFpXeGtJRlJsWTJodWIyeHZaMmxsY3l3Z1NXNWpMakV5TURBR0ExVUVDeE1wVTNSaGNtWnAKWld4a0lFTnNZWE56SURJZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGt3Z2dFZ01BMEdDU3FHU0liMwpEUUVCQVFVQUE0SUJEUUF3Z2dFSUFvSUJBUUMzTXNqKzZYR21CSVd0REJGazM4NU43OGdER0ljL29hdjdQS2FmCjhNT2gydFRZYml0VGtQc2twRDZFOEo3b1gremxKMFQxS0tZL2U5N2dLdkRJcjFNdm5zb0ZBWk1lajJZY09hZE4KK2xxMmN3UWxadXQzZitkWnhrcVpKUlJVNnliSDgzOFoxVEJ3ajYrd1Jpci9yZXNwN2RlZnFnU0hvOVQ1aWFVMApYOXREa1lJMjJXWThzYmk1Z3YyY09qNFF5RHZ2Qm1WbWVwc1pHRDMvY1ZFOE1DNWZ2ajEzYzdKZEJtekRJMWFhCks0VW1raHluQXJQa1B3MnZDSG1DdURZOTZwelROYk84YWNyMXpKM28vV1NORjRBemJsNUtYWm5KSG9lMG5SckEKMVc0VE5TTmUzNXRmUGUvVzkzYkM2ajY3ZUEwY1FtZHJCTmo0MXRwdmkvSkVvQUdyQWdFRG80SEZNSUhDTUIwRwpBMVVkRGdRV0JCUy9YN2ZSenQwZmh2UmJWYXpjMXhEQ0RxbUk1ekNCa2dZRFZSMGpCSUdLTUlHSGdCUy9YN2ZSCnp0MGZodlJiVmF6YzF4RENEcW1JNTZGc3BHb3dhREVMTUFrR0ExVUVCaE1DVlZNeEpUQWpCZ05WQkFvVEhGTjAKWVhKbWFXVnNaQ0JVWldOb2JtOXNiMmRwWlhNc0lFbHVZeTR4TWpBd0JnTlZCQXNUS1ZOMFlYSm1hV1ZzWkNCRApiR0Z6Y3lBeUlFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1Z2dFQU1Bd0dBMVVkRXdRRk1BTUJBZjh3CkRRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFBV2RQNGlkMGNrYVZhR3NhZlB6V2RxYkFZY2FUMWVwb1hrSkt0djMKTDdJZXpNZGVhdGlEaDZHWDcwazFQbmNHUVZoaXY0NVl1QXBuUCt5ejNTRm1IOGxVK25MTVBVeEEySUd2ZDU2RAplcnVpeC9VMEY0N1pFVUQwL0N3cVRSVi9wMkpkTGlYVEFBc2dHaDFvK1JlNDlMMkw3U2haM1UwV2l4ZUR5TEpsCnh5MTZwYXE4VTRadDNWZWt5dmdnUVF0bzhQVDdkTDVXWFhwNTlma2RoZU10bGI3MWNaQkR6STBmbWdBS2h5bnAKVlNKWUFDUHE0eEpES1Z0SENOMk1RV3BsQnFqbElhcEJ0SlVobGJsOTBUU3JFOWF0dk56aVBUbk52VDUxY0tFWQpXUVBKSXJTUG5OVmVLdGVsdHRRS2JmaTNRQkZHbWg5NURtSy9ENWZzNEM4ZkY1UT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IE89R292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5CiMgU3ViamVjdDogTz1Hb3Zlcm5tZW50IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKIyBMYWJlbDogIlRhaXdhbiBHUkNBIgojIFNlcmlhbDogNDIwMjMwNzA4MDc3MDg3MjQxNTk5OTExNDA1NTY1MjcwNjY4NzAKIyBNRDUgRmluZ2VycHJpbnQ6IDM3Ojg1OjQ0OjUzOjMyOjQ1OjFmOjIwOmYwOmYzOjk1OmUxOjI1OmM0OjQzOjRlCiMgU0hBMSBGaW5nZXJwcmludDogZjQ6OGI6MTE6YmY6ZGU6YWI6YmU6OTQ6NTQ6MjA6NzE6ZTY6NDE6ZGU6NmI6YmU6ODg6MmI6NDA6YjkKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDc2OjAwOjI5OjVlOmVmOmU4OjViOjllOjFmOmQ2OjI0OmRiOjc2OjA2OjJhOmFhOmFlOjU5OjgxOjhhOjU0OmQyOjc3OjRjOmQ0OmMwOmIyOmMwOjExOjMxOmUxOmIzCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGY2pDQ0ExcWdBd0lCQWdJUUg1MVpXdGN2d2daRXBZQUlhZU5lOWpBTkJna3Foa2lHOXcwQkFRVUZBREEvCk1Rc3dDUVlEVlFRR0V3SlVWekV3TUM0R0ExVUVDZ3duUjI5MlpYSnViV1Z1ZENCU2IyOTBJRU5sY25ScFptbGoKWVhScGIyNGdRWFYwYUc5eWFYUjVNQjRYRFRBeU1USXdOVEV6TWpNek0xb1hEVE15TVRJd05URXpNak16TTFvdwpQekVMTUFrR0ExVUVCaE1DVkZjeE1EQXVCZ05WQkFvTUowZHZkbVZ5Ym0xbGJuUWdVbTl2ZENCRFpYSjBhV1pwClkyRjBhVzl1SUVGMWRHaHZjbWwwZVRDQ0FpSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUIKQUpvbHVPek1vbldvZS9mT1cxbUt5ZEdHRWdoVTdKenk1MGIyaVBOODZhWGZURWMycEJzQkhIOGVWNHFOdzhYUgpJZVBhSkQ5SUsvdWZMcUdVNXl3Y2s5Ry9Hd0dIVTVuT3AvVUtJWFozLzZtM3huT1VUMGIzRUVrMytxaFpTVjFxCmdRZFc4b3I1QnREM2NDSk50TGRCdVRLNHNmQ3h3NXcvY1AxVDNZR3EyR040OXRoVGJxR3Nhb1FrY2xTR3h0S3kKeWh3T2VZSFd0WEJpQ0FFdVRrOE8xUkd2cWEvbG1yL2N6SWR0SnVUSlY2TDdsdm5NNFQ5VGpHeE1mcHRUQ0F0cwpGL3RueU1LdHNjMkF0SmZjZGdFV0ZlbHExNlRoZUVmT2h0WDdNZlA2TWI0MHFpajdjRXdkU2NldkxKMXRacWEyCmpXUit0U0JxblR1QnRvOUFBR2RMaVlhNHpHWCtGVlBwQk1IV1h4MUUxd292SjVwR2ZhRU5kYTFVaGhYY1NUdngKbHM0UG02RHNvM3BkdnRVcWRVTGxlOTZsdHFxdktLeXNrS3c0dDlWb05TWjYzUGM3OC8xRm05RzdRM2h1Yi9GQwpWR3FZOEEydGwrbFNYdW5WYW5MZWF2Y2JZQlQwcGVTMmNXZXFIK3JpVGNGQ1FQNW5SaGM0TDBjL2NaeXU1U0hLCllTMXRCNmlFZkMzdVVTWHhZNUNlL2VGWGlHdnZpaU50c2VhOVA2M1JQWllMaFkzTmF5ZTd0d1diN0x1UnFRb0gKRWdLWFRpQ1E4UDhOSHVKQk85TkFPdWVOWGRwbTVBS3dCMUtZWEE2T001ekNwcFg3VlJsdVRJNnVTdys5d1RoTgpYbytFSFdiTnhXQ1d0RkphQlltT2xYcVl3WkU4bFNPeUR2UjV0TWw4d1VvaEFnTUJBQUdqYWpCb01CMEdBMVVkCkRnUVdCQlRNek8vTUtXQ2tPN0dTdGp6Nk1tS1ByQ1VWT3pBTUJnTlZIUk1FQlRBREFRSC9NRGtHQkdjcUJ3QUUKTVRBdk1DMENBUUF3Q1FZRkt3NERBaG9GQURBSEJnVm5LZ01BQUFRVUE1dndJaFAvbFNnMjA5eWV3REw3TVRxSwpVV1V3RFFZSktvWklodmNOQVFFRkJRQURnZ0lCQUVDQVN2b215YzVlTU4xUGhuUjJXUFd1czRNemVLUjZkQmNaClR1bFN0Ym5nQ25SaXFtaktlS0JNbW80c0l5N1ZhaElrdjlSbzA0clEySnlmdEI4TTNqaCtWemo4amVKUFhneWYKcXp2Uy8zV1h5NlRqWndqLzVjQVd0VWdCZmVuNUN2OGI1V3BwdjNnaHFNS25JNm1HcTNaVzZBNE05aFBkS21hSwpaRWs5R2hpSGtBU2ZRbEszVDh2K1IwRjJOZS8vQUhZMlJUS2J4a2FGWGVJa3NCN2pTSmFZVjBlVVZYb1BRYkZFCkpQUEIvaHBydjRqOXdhYmFrMkJlZ1VxWklKeElaaG0xQUhsVUQ3Z3NMMHU4cVYxYllIK01oNlhnVW1NcXZ0ZzcKaFVBVi9oNjJaVC9GUzlwK3RYbzFLYU11ZXBoZ0lxUDBmU2RPTGVxMGREenBENlF6RHhBUnZCTUIxdVVPMDcrMQpFcUxoUlNQQXpBaHVZYmVKcTRQakpCN21YUWZuSHlBK3oyZkk1Nnd3YlNkTGFHNUxLbHdDQ0RUYitIYmtaNk1tCm5EK2lNc0pLeFlFWU1SQldxb1R2TFFyL3VCOTMwcitsV0tCaTVOZExrWFdOaVlDWWZtM0xVMDVlci9heWw0V1gKdWRwVkJya2s3dGZHT0I1akd4STdsZUZZclBMZmhOVmZtUzhOVlZ2bU9Oc3VQM0xwU0lYTHV5a1RqeDQ0VmJuegpzc1F3bVNOT1hmSklvUklNM0JLUUNaQlVrUU04UitYVnlXWGd0MHQ5N0VmVHN3cytyWjdRZEFBTzY3MVJyY0RlCkxNRERhdjd2M0F1bitrYmZZTnVjcGxsUWRTTnBjNU95K2Z3QzAwZm1jYzRRQXU0bmpJVC9yRVVORTF5RE11QWwKcFlZc2ZQUVMKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPURpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBDQSBPPURpZ2lDZXJ0IEluYyBPVT13d3cuZGlnaWNlcnQuY29tCiMgU3ViamVjdDogQ049RGlnaUNlcnQgQXNzdXJlZCBJRCBSb290IENBIE89RGlnaUNlcnQgSW5jIE9VPXd3dy5kaWdpY2VydC5jb20KIyBMYWJlbDogIkRpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBDQSIKIyBTZXJpYWw6IDE3MTU0NzE3OTM0MTIwNTg3ODYyMTY3Nzk0OTE0MDcxNDI1MDgxCiMgTUQ1IEZpbmdlcnByaW50OiA4NzpjZTowYjo3YjoyYTowZTo0OTowMDplMTo1ODo3MTo5YjozNzphODo5Mzo3MgojIFNIQTEgRmluZ2VycHJpbnQ6IDA1OjYzOmI4OjYzOjBkOjYyOmQ3OjVhOmJiOmM4OmFiOjFlOjRiOmRmOmI1OmE4Ojk5OmIyOjRkOjQzCiMgU0hBMjU2IEZpbmdlcnByaW50OiAzZTo5MDo5OTpiNTowMTo1ZTo4Zjo0ODo2YzowMDpiYzplYTo5ZDoxMToxZTplNzoyMTpmYTpiYTozNTo1YTo4OTpiYzpmMTpkZjo2OTo1NjoxZTozZDpjNjozMjo1YwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRHR6Q0NBcCtnQXdJQkFnSVFET2ZnNVJmWVJ2NlA1V0Q4Ry9Bd09UQU5CZ2txaGtpRzl3MEJBUVVGQURCbApNUXN3Q1FZRFZRUUdFd0pWVXpFVk1CTUdBMVVFQ2hNTVJHbG5hVU5sY25RZ1NXNWpNUmt3RndZRFZRUUxFeEIzCmQzY3VaR2xuYVdObGNuUXVZMjl0TVNRd0lnWURWUVFERXh0RWFXZHBRMlZ5ZENCQmMzTjFjbVZrSUVsRUlGSnYKYjNRZ1EwRXdIaGNOTURZeE1URXdNREF3TURBd1doY05NekV4TVRFd01EQXdNREF3V2pCbE1Rc3dDUVlEVlFRRwpFd0pWVXpFVk1CTUdBMVVFQ2hNTVJHbG5hVU5sY25RZ1NXNWpNUmt3RndZRFZRUUxFeEIzZDNjdVpHbG5hV05sCmNuUXVZMjl0TVNRd0lnWURWUVFERXh0RWFXZHBRMlZ5ZENCQmMzTjFjbVZrSUVsRUlGSnZiM1FnUTBFd2dnRWkKTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDdERoWE81RU9BWExHSDg3ZGcrWEVTcGE3YwpKcFNJcXZUTzlTQTVLRmhnRFBpQTJxa1ZsVEpoUExXeEtJU0tpdHlmQ2d5REYzcVBrS3lLNTNsVFhER0VLdllQCm1ESTJkc3plM1R5b291OXEreUh5VW1IZm55RFhIK0t4MmY0WVpOSVNXMS81V0JnMXZFZk5vVGI1YTMvVXNEZysKd1J2RGpEUFoyQzhZL2lnUHM2ZUQxc051Uk1CaE5aWVcvbG1jaTNadDEvR2lTdzByL3d0eTJwNWcwSTZRTmNaNApWWWNnb2MvbGJRcklTWHd4bUROc0l1bUgwREphb3JvVGdoSHRPUmVkbVRweW9lYjZwTm5WRnpGMXJvVjlJcTQvCkFVYUc5aWg1eUxIYTVGY1h4SDRjRHJDMGtxWldzNzJ5bCsycXAvQzN4YWcvbFJiUS82R1c2d2hmR0hkUEFnTUIKQUFHall6QmhNQTRHQTFVZER3RUIvd1FFQXdJQmhqQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01CMEdBMVVkRGdRVwpCQlJGNjZLdjlKTExnakV0VVl1bnB5R2Q4MjNJRHpBZkJnTlZIU01FR0RBV2dCUkY2Nkt2OUpMTGdqRXRVWXVuCnB5R2Q4MjNJRHpBTkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQW9nNjgzK0x0OE9OeWMzcGtsTC8zY21iWU11UkMKZFdLdWgrdnkxZG5lVnJPZnpNNFVLTGtObDJCY0VreFk1Tk05ZzBsRldKYzFhUnFvUitwV3hubXJFdGhuZ1lUZgpmd2s4bE9hNEppd2d2VDJ6S0luM1gvOGk0cGVFSCtsbDc0ZmczOEZuU2JOZDY3SUpLdXNtN1hpK2ZUOHI4N2NtCk5XMWZpUUcyU1Z1ZkFRV2JxejBsd2N5MmY4THhiNGJHK21SbzY0RXRsT3RDdC9xTUh0MWk4YjVRWjdkc3ZmUHgKSDJzTU5nY1dmemQ4cVZ0dGV2RVNSbUNEMXljRXZrdk9sNzdEWnlwb0VkK0E1d3d6WnI4VERSUnU4MzhmWXhBZQorbzBiSlcxc2o2VzNZUUd4MHFNbW9SQnhuYTNpdy9uRG1WRzNLd2NJemk3bVVMS24rZ3BGTDZMdzhnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPURpZ2lDZXJ0IEdsb2JhbCBSb290IENBIE89RGlnaUNlcnQgSW5jIE9VPXd3dy5kaWdpY2VydC5jb20KIyBTdWJqZWN0OiBDTj1EaWdpQ2VydCBHbG9iYWwgUm9vdCBDQSBPPURpZ2lDZXJ0IEluYyBPVT13d3cuZGlnaWNlcnQuY29tCiMgTGFiZWw6ICJEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQSIKIyBTZXJpYWw6IDEwOTQ0NzE5NTk4OTUyMDQwMzc0OTUxODMyOTYzNzk0NDU0MzQ2CiMgTUQ1IEZpbmdlcnByaW50OiA3OTplNDphOTo4NDowZDo3ZDozYTo5NjpkNzpjMDo0ZjplMjo0Mzo0Yzo4OToyZQojIFNIQTEgRmluZ2VycHJpbnQ6IGE4Ojk4OjVkOjNhOjY1OmU1OmU1OmM0OmIyOmQ3OmQ2OjZkOjQwOmM2OmRkOjJmOmIxOjljOjU0OjM2CiMgU0hBMjU2IEZpbmdlcnByaW50OiA0Mzo0ODphMDplOTo0NDo0Yzo3ODpjYjoyNjo1ZTowNTo4ZDo1ZTo4OTo0NDpiNDpkODo0Zjo5Njo2MjpiZDoyNjpkYjoyNTo3Zjo4OTozNDphNDo0MzpjNzowMTo2MQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRHJ6Q0NBcGVnQXdJQkFnSVFDRHZnVnBCQ1JyR2hkV3JKV1pISFNqQU5CZ2txaGtpRzl3MEJBUVVGQURCaApNUXN3Q1FZRFZRUUdFd0pWVXpFVk1CTUdBMVVFQ2hNTVJHbG5hVU5sY25RZ1NXNWpNUmt3RndZRFZRUUxFeEIzCmQzY3VaR2xuYVdObGNuUXVZMjl0TVNBd0hnWURWUVFERXhkRWFXZHBRMlZ5ZENCSGJHOWlZV3dnVW05dmRDQkQKUVRBZUZ3MHdOakV4TVRBd01EQXdNREJhRncwek1URXhNVEF3TURBd01EQmFNR0V4Q3pBSkJnTlZCQVlUQWxWVApNUlV3RXdZRFZRUUtFd3hFYVdkcFEyVnlkQ0JKYm1NeEdUQVhCZ05WQkFzVEVIZDNkeTVrYVdkcFkyVnlkQzVqCmIyMHhJREFlQmdOVkJBTVRGMFJwWjJsRFpYSjBJRWRzYjJKaGJDQlNiMjkwSUVOQk1JSUJJakFOQmdrcWhraUcKOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQTRqdmhFWExlcUtUVG8xZXFVS0tQQzNlUXlhS2w3aExPbGxzQgpDU0RNQVpPblRqQzNVL2REeEdrQVY1M2lqU0xkaHdaQUFJRUp6czRiZzcvZnpUdHhSdUxXWnNjRnMzWW5Gbzk3Cm5oNlZmZTYzU0tNSTJ0YXZlZ3c1Qm1WL1NsMGZ2QmY0cTc3dUtOZDBmM3A0bVZtRmFHNWNJekpMdjA3QTZGcHQKNDNDL2R4Qy8vQUgyaGRtb1JCQllNcWwxR05YUm9yNUg0aWRxOUpveitFa0lZSXZVWDdRNmhMK2hxa3BNZlQ3UApUMTlzZGw2Z1N6ZVJudHdpNW0zT0ZCcU9hc3YremJNVVpCZkhXeW1lTXIveTd2clRDMExVcTdkQk10b00xTy80CmdkVzdqVmcvdFJ2b1NTaWljTm94Qk4zM3NoYnlUQXBPQjZqdFNqMWV0WCtqa01Pdkp3SURBUUFCbzJNd1lUQU8KQmdOVkhROEJBZjhFQkFNQ0FZWXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QWRCZ05WSFE0RUZnUVVBOTVRTlZiUgpUTHRtOEtQaUd4dkRsN0k5MFZVd0h3WURWUjBqQkJnd0ZvQVVBOTVRTlZiUlRMdG04S1BpR3h2RGw3STkwVlV3CkRRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFNdWNONnBJRXhJSyt0MUVuRTlTc1BUZnJnVDFlWGtJb3lRWS9Fc3IKaE1BdHVkWEgvdlRCSDFqTHVHMmNlblRubUNtckViWGpjS0NoelV5SW1aT01rWERpcXc4Y3ZwT3AvMlBWNUFkZwowNk8vblZzSjhkV080MVAwam1QNlA2ZmJ0R2JmWW1iVzBXNUJqZkl0dGVwM1NwK2RXT0lyV2NCQUkrMHRLSUpGClBubFVraWFZNElCSXFEZnY4Tlo1WUJiZXJPZ096VzZzUkJjNEwwbmE0VVUrS3JrMlU4ODZVQWIzTHVqRVYwbHMKWVNFWTFRU3RlRHdzT29CcnArdXZGUlRwMkluQnVUaHM0cEZzaXY5a3VYY2xWekRBR3lTajRkenAzMGQ4dGJRawpDQVV3N0MyOUM3OUZ2MUM1cWZQcm1BRVNyY2lJeHBnMFg0MEtQTWJwMVpXVmJkND0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPURpZ2lDZXJ0IEhpZ2ggQXNzdXJhbmNlIEVWIFJvb3QgQ0EgTz1EaWdpQ2VydCBJbmMgT1U9d3d3LmRpZ2ljZXJ0LmNvbQojIFN1YmplY3Q6IENOPURpZ2lDZXJ0IEhpZ2ggQXNzdXJhbmNlIEVWIFJvb3QgQ0EgTz1EaWdpQ2VydCBJbmMgT1U9d3d3LmRpZ2ljZXJ0LmNvbQojIExhYmVsOiAiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2UgRVYgUm9vdCBDQSIKIyBTZXJpYWw6IDM1NTM0MDAwNzY0MTA1NDc5MTk3MjQ3MzA3MzQzNzgxMDAwODcKIyBNRDUgRmluZ2VycHJpbnQ6IGQ0Ojc0OmRlOjU3OjVjOjM5OmIyOmQzOjljOjg1OjgzOmM1OmMwOjY1OjQ5OjhhCiMgU0hBMSBGaW5nZXJwcmludDogNWY6Yjc6ZWU6MDY6MzM6ZTI6NTk6ZGI6YWQ6MGM6NGM6OWE6ZTY6ZDM6OGY6MWE6NjE6Yzc6ZGM6MjUKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDc0OjMxOmU1OmY0OmMzOmMxOmNlOjQ2OjkwOjc3OjRmOjBiOjYxOmUwOjU0OjQwOjg4OjNiOmE5OmEwOjFlOmQwOjBiOmE2OmFiOmQ3OjgwOjZlOmQzOmIxOjE4OmNmCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEeFRDQ0FxMmdBd0lCQWdJUUFxeGNKbW9MUUp1UEMzbnlya1lsZHpBTkJna3Foa2lHOXcwQkFRVUZBREJzCk1Rc3dDUVlEVlFRR0V3SlZVekVWTUJNR0ExVUVDaE1NUkdsbmFVTmxjblFnU1c1ak1Sa3dGd1lEVlFRTEV4QjMKZDNjdVpHbG5hV05sY25RdVkyOXRNU3N3S1FZRFZRUURFeUpFYVdkcFEyVnlkQ0JJYVdkb0lFRnpjM1Z5WVc1agpaU0JGVmlCU2IyOTBJRU5CTUI0WERUQTJNVEV4TURBd01EQXdNRm9YRFRNeE1URXhNREF3TURBd01Gb3diREVMCk1Ba0dBMVVFQmhNQ1ZWTXhGVEFUQmdOVkJBb1RERVJwWjJsRFpYSjBJRWx1WXpFWk1CY0dBMVVFQ3hNUWQzZDMKTG1ScFoybGpaWEowTG1OdmJURXJNQ2tHQTFVRUF4TWlSR2xuYVVObGNuUWdTR2xuYUNCQmMzTjFjbUZ1WTJVZwpSVllnVW05dmRDQkRRVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFNYk01WFBtCis5Uzc1UzB0TXFiZjVZRS95YzBsU2JaeEtzUFZsRFJub2dvY3NGOXBwa0N4eExleWo5Q1lwS2xCV1RyVDNKVFcKUE50ME9LUkt6RTBsZ3ZkS3BWTVNPTzd6U1cxeGtYNWp0cXVtWDhPa2hQaFBZbEcrK01YczJ6aVM0d2JsQ0pFTQp4Q2hCVmZ2TFdva1ZmbkhvTmI5TmNnazl2am80VUZ0M01SdU5zOGNrUlpxbnJHMEFGRm9FdDdvVDYxRUttRUZCCklrNWxZWWVCUVZDbWVWeUozaGxLVjlVdTVsMGNVeXgrbU0wYUJoYWthSFBRTkFRVFhLRngwMXA4VmR0ZVpPRTMKaHpCV0JPVVJ0Q21BRXZGNU9ZaWlBaEY4SjJhM2lMZDQ4c29LcURpckNtVEN2MlpkbFlUQm9TVWVoMTBhVUFzZwpFc3hCdTI0TFVUaTRTOHNDQXdFQUFhTmpNR0V3RGdZRFZSMFBBUUgvQkFRREFnR0dNQThHQTFVZEV3RUIvd1FGCk1BTUJBZjh3SFFZRFZSME9CQllFRkxFK3cya0QrTDlIQWRTWUpob0lBdTlqWkN2RE1COEdBMVVkSXdRWU1CYUEKRkxFK3cya0QrTDlIQWRTWUpob0lBdTlqWkN2RE1BMEdDU3FHU0liM0RRRUJCUVVBQTRJQkFRQWNHZ2FYM05lYwpuenlJWmdZSVZ5SGJJVWY0S21lcXZ4Z3lka0FRVjhHSzgzclpFV1dPTmZxZS9FVzFudGxNTVV1NGtlaERMSTZ6CmVNN2I0MU41Y2RibElaUUIybFdIbWlSazlvcG16TjZjTjgyb05MRnBteVBJbm5naUszQkQ0MVZITVdFWjcxakYKaFM5T01QYWdNUllqeU9maVpSWXp5NzhhRzZBOStNcGVpekdMWUFpSkxRd0dYRkszeFBrS21ORVZYNThTdm53MgpZemk5UktSLzVDWXJDc1NYYVEzcGpPTEFFRmU0eUhZU2tWWHlTR25ZdkNvQ1d3OUUxQ0F4Mi9TNmNDWmRrR0NlCnZFc1hDUysweXg1RGFNa0hKOEhTWFBmcUlibG9FcHc4bkwrZS9JQmNtMlBON0VlcUpTZG5vRGZ6QUlKOVZOZXAKK09rdUU2TjM2QjlLCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1DbGFzcyAyIFByaW1hcnkgQ0EgTz1DZXJ0cGx1cwojIFN1YmplY3Q6IENOPUNsYXNzIDIgUHJpbWFyeSBDQSBPPUNlcnRwbHVzCiMgTGFiZWw6ICJDZXJ0cGx1cyBDbGFzcyAyIFByaW1hcnkgQ0EiCiMgU2VyaWFsOiAxNzc3NzAyMDgwNDU5MzQwNDAyNDE0Njg3NjA0ODgzMjc1OTUwNDMKIyBNRDUgRmluZ2VycHJpbnQ6IDg4OjJjOjhjOjUyOmI4OmEyOjNjOmYzOmY3OmJiOjAzOmVhOmFlOmFjOjQyOjBiCiMgU0hBMSBGaW5nZXJwcmludDogNzQ6MjA6NzQ6NDE6NzI6OWM6ZGQ6OTI6ZWM6Nzk6MzE6ZDg6MjM6MTA6OGQ6YzI6ODE6OTI6ZTI6YmIKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDBmOjk5OjNjOjhhOmVmOjk3OmJhOmFmOjU2Ojg3OjE0OjBlOmQ1OjlhOmQxOjgyOjFiOmI0OmFmOmFjOmYwOmFhOjlhOjU4OmI1OmQ1OjdhOjMzOjhhOjNhOmZiOmNiCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEa2pDQ0FucWdBd0lCQWdJUkFJVzlTL1BZMnVOcDlwVFhYOE9sUkNNd0RRWUpLb1pJaHZjTkFRRUZCUUF3ClBURUxNQWtHQTFVRUJoTUNSbEl4RVRBUEJnTlZCQW9UQ0VObGNuUndiSFZ6TVJzd0dRWURWUVFERXhKRGJHRnoKY3lBeUlGQnlhVzFoY25rZ1EwRXdIaGNOT1Rrd056QTNNVGN3TlRBd1doY05NVGt3TnpBMk1qTTFPVFU1V2pBOQpNUXN3Q1FZRFZRUUdFd0pHVWpFUk1BOEdBMVVFQ2hNSVEyVnlkSEJzZFhNeEd6QVpCZ05WQkFNVEVrTnNZWE56CklESWdVSEpwYldGeWVTQkRRVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFOeFEKbHRBUytEWFNDSGg2dGxKdy9XL3V6N2tSeTExMzRlenBmZ1NOMXN4dmMwTlhZS3d6Q2tUc0ExOGNnQ1NSNWFpUgpWaEtDOStBcjlOdXVZUzZKRUkxcmJMcXpBcjNWTnNWSU55UGk4Rm8zVWpNWEV1TFJZRTIrTDBFUjQvWVhKUXlMCmtjQWJtWHVaVmcydjd0SzhSMWZqZVVsN05Ja25KSVRlc2V6cFdFNytUdDlhdmtHdHJBakZHQTd2MGxQdWJOQ2QKRWdFVGpkeUFZdmVWcVVTSVNuRk9ZRldlMnlNWmVWWUhERDlqQzF5dzRyNStGZnlVTTFoQk9IVEU0WStMM3lhcwpIN1dMTzdkRFdXdXdKS1p0a0l2RWN1cGRNNWkzeTk1ZWUrK1U4UnMreXNraHdjV1lBcXFpOWx0M20vVitsbFUwCkhHZHB3UEZDNDBlcy9DZ2NabFVDQXdFQUFhT0JqRENCaVRBUEJnTlZIUk1FQ0RBR0FRSC9BZ0VLTUFzR0ExVWQKRHdRRUF3SUJCakFkQmdOVkhRNEVGZ1FVNDNNdDM4c09LQXplM2JPa3lubTRqcnZvTUlrd0VRWUpZSVpJQVliNApRZ0VCQkFRREFnRUdNRGNHQTFVZEh3UXdNQzR3TEtBcW9DaUdKbWgwZEhBNkx5OTNkM2N1WTJWeWRIQnNkWE11ClkyOXRMME5TVEM5amJHRnpjekl1WTNKc01BMEdDU3FHU0liM0RRRUJCUVVBQTRJQkFRQ25WTStJUkJuTDM5Ui8KQU45V00ySzE5MUVCa092RFA5R0lST2trWGUvbkZMMGd0NW84QVA1dG45dVEzTmYwWXRhTGNGM241UVJJcVdoOAp5ZkZDODJ4L3hYcDhIVkdJdXRJS1BpZGQzaTFSVHRNVFpHbmtMdVBUNTVzSm1hYmdsWnZPR3RkL3Zqek9Vck1SCkZjRVBGODBEdTV3bEZicWlkb244QnZFWTBKTkxEbnlDdDZYMDlsLys3VUNtbllSME9ibmNIb1VXMmlrYmhpTUEKeWJ1SmZtNkFpQjR2RkxRREpLZ3lid09hUnl3d3ZsYkdwMElDY0J2cVFOaTZCUU53QjZTVy8vMUlNd3JoM0tXQgprSnROM1gzbjU3TE5YTWhxbGZpbDlvM0VYWGdJdm5zRzFrblBHVFpRSXk0STVwNEZUVWNZMVJicHNkYTJFTlc3Cmw3K2lqclJVCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1EU1QgUm9vdCBDQSBYMyBPPURpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLgojIFN1YmplY3Q6IENOPURTVCBSb290IENBIFgzIE89RGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uCiMgTGFiZWw6ICJEU1QgUm9vdCBDQSBYMyIKIyBTZXJpYWw6IDkxMjk5NzM1NTc1MzM5OTUzMzM1OTE5MjY2OTY1ODAzNzc4MTU1CiMgTUQ1IEZpbmdlcnByaW50OiA0MTowMzo1MjpkYzowZjpmNzo1MDoxYjoxNjpmMDowMjo4ZTpiYTo2Zjo0NTpjNQojIFNIQTEgRmluZ2VycHJpbnQ6IGRhOmM5OjAyOjRmOjU0OmQ4OmY2OmRmOjk0OjkzOjVmOmIxOjczOjI2OjM4OmNhOjZhOmQ3OjdjOjEzCiMgU0hBMjU2IEZpbmdlcnByaW50OiAwNjo4NzoyNjowMzozMTphNzoyNDowMzpkOTowOTpmMTowNTplNjo5YjpjZjowZDozMjplMTpiZDoyNDo5MzpmZjpjNjpkOToyMDo2ZDoxMTpiYzpkNjo3NzowNzozOQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRFNqQ0NBaktnQXdJQkFnSVFSSyt3Z05hako3cUpNRG1HTHZoQWF6QU5CZ2txaGtpRzl3MEJBUVVGQURBLwpNU1F3SWdZRFZRUUtFeHRFYVdkcGRHRnNJRk5wWjI1aGRIVnlaU0JVY25WemRDQkRieTR4RnpBVkJnTlZCQU1UCkRrUlRWQ0JTYjI5MElFTkJJRmd6TUI0WERUQXdNRGt6TURJeE1USXhPVm9YRFRJeE1Ea3pNREUwTURFeE5Wb3cKUHpFa01DSUdBMVVFQ2hNYlJHbG5hWFJoYkNCVGFXZHVZWFIxY21VZ1ZISjFjM1FnUTI4dU1SY3dGUVlEVlFRRApFdzVFVTFRZ1VtOXZkQ0JEUVNCWU16Q0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCCkFOK3Y2WmRRQ0lOWHRNeGlaZmFRZ3V6SDB5eHJNTXBiN05uRGZjZEF3UmdVaStEb00zWkpLdU0vSVVtVHJFNE8Kcno1SXkyWHUvTk1oRDJYU0t0a3lqNHpsOTNld0VudTFsY0NKbzZtNjdYTXVlZ3dHTW9PaWZvb1VNTTBSb09FcQpPTGw1Q2pIOVVMMkFaZCszVVdPRHlPS0lZZXBMWVlIc1VtdTVvdUpMR2lpZlNLT2VETm9Kamo0WExoN2RJTjliCnhpcUtxeTY5Y0szRkN4b2xrSFJ5eFh0cXF6VFdNSW4vNVdnVGUxUUx5TmF1N0ZxY2toNDlaTE9NeHQrL3lVRncKN0JaeTFTYnNPRlU1UTlEOC9SaGNRUEdYNjlXYW00MGR1dG9sdWNiWTM4RVZBanFyMm03eFBpNzFYQWljUE5hRAphZVFRbXhrcXRpbFg0K1U5bTUvd0FsMENBd0VBQWFOQ01FQXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WCkhROEJBZjhFQkFNQ0FRWXdIUVlEVlIwT0JCWUVGTVNuc2FSN0xISDYyK0ZMa0hYL3hCVmdoWWtRTUEwR0NTcUcKU0liM0RRRUJCUVVBQTRJQkFRQ2pHaXliRndCY3FSN3VLR1kzT3IrRHh6OUx3d21nbFNCZDQ5bFpSTkkrRFQ2OQppa3VnZEIvT0VJS2NkQm9kZnBnYTNjc1RTN01nUk9TUjZjejhmYVhiYXVYKzV2M2dUdDIzQURxMWNFbXY4dVhyCkF2SFJBb3NaeTVRNlhrakVHQjVZR1Y4ZUFscndEUEd4cmFuY1dZYUxidW1SOVliSytybG1NNnBaVzg3aXB4WnoKUjhzcnpKbXdOMGpQNDFaTDljOFBESEl5aDhid1JMdFRjbTFEOVNaSW1sSm50MWlyL21kMmNYamJEYUpXRkJNNQpKREdGb3FnQ1dqQkg0ZDFRQjd3Q0NaQUE2MlJqWUpzV3ZJakpFdWJTZlpHTCtUMHlqV1cwNlh5eFYzYnF4YllvCk9iOFZaUnpJOW5lV2FncU5kd3ZZa1FzRWpnZmJLYllLN3AyQ05UVVEKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVN3aXNzU2lnbiBHb2xkIENBIC0gRzIgTz1Td2lzc1NpZ24gQUcKIyBTdWJqZWN0OiBDTj1Td2lzc1NpZ24gR29sZCBDQSAtIEcyIE89U3dpc3NTaWduIEFHCiMgTGFiZWw6ICJTd2lzc1NpZ24gR29sZCBDQSAtIEcyIgojIFNlcmlhbDogMTM0OTI4MTU1NjE4MDY5OTEyODAKIyBNRDUgRmluZ2VycHJpbnQ6IDI0Ojc3OmQ5OmE4OjkxOmQxOjNiOmZhOjg4OjJkOmMyOmZmOmY4OmNkOjMzOjkzCiMgU0hBMSBGaW5nZXJwcmludDogZDg6YzU6Mzg6OGE6Yjc6MzA6MWI6MWI6NmU6ZDQ6N2E6ZTY6NDU6MjU6M2E6NmY6OWY6MWE6Mjc6NjEKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDYyOmRkOjBiOmU5OmI5OmY1OjBhOjE2OjNlOmEwOmY4OmU3OjVjOjA1OjNiOjFlOmNhOjU3OmVhOjU1OmM4OjY4OjhmOjY0OjdjOjY4OjgxOmYyOmM4OjM1OjdiOjk1Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGdWpDQ0E2S2dBd0lCQWdJSkFMdEFIRVAxWGsrd01BMEdDU3FHU0liM0RRRUJCUVVBTUVVeEN6QUpCZ05WCkJBWVRBa05JTVJVd0V3WURWUVFLRXd4VGQybHpjMU5wWjI0Z1FVY3hIekFkQmdOVkJBTVRGbE4zYVhOelUybG4KYmlCSGIyeGtJRU5CSUMwZ1J6SXdIaGNOTURZeE1ESTFNRGd6TURNMVdoY05Nell4TURJMU1EZ3pNRE0xV2pCRgpNUXN3Q1FZRFZRUUdFd0pEU0RFVk1CTUdBMVVFQ2hNTVUzZHBjM05UYVdkdUlFRkhNUjh3SFFZRFZRUURFeFpUCmQybHpjMU5wWjI0Z1IyOXNaQ0JEUVNBdElFY3lNSUlDSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQWc4QU1JSUMKQ2dLQ0FnRUFyK1R1Zm9za0RoSnVxVkF0RmtRN2twSmN5cmhkaEpKQ0V5cThaVmVDUUQ1WEpNMVFpeVVxdDIvOAo3NkxRd0I4Q0pFb1RsbzhqRStZb1dBQ2pSOGNHcDRRaks3dTlsaXQvVmN5THdWY2ZEbUpsRDkwOVZvcHoycTUrCmJicUJISDVDakNBMTJVTk5oUHFFMjFJczh3NG5kd3RydnhFdmNuaWZMdGcrNWhnM1dpcHkrZHBpa0pLVnloK2MKNmJNOEs4dnpBUk8vV3MvQnRRcGd2ZDIxbVdSVHVLQ1dzMi9pSm5lUmpPQmlFQUtmTkErazFaSXpVZDYramJxRQplbUE4YXR1ZksremUzZ0UvYmszbFVJYkx0Sy90UkVERnlscU0ydElyZktqdXZxYmxDcW9PcGQ4RlVyZFZ4eUpkCk1tcVhsMk1UMjhuYmVUWjdoVHBLeFZLSitTVG5uWGVwZ3Y5VkhLVnhhU3ZSQWlUeXN5YlVhOW9FVmVYQkNzZHQKTURlUUt1U2VGRE5lRmhkVnhWdTF5elNKa3ZHZEpvK2hCOVRHc25oUTJ3d01DM3dMakVIWHVlbmRqSWozbzAyeQpNc3pZRjlyTnQ4NW1uZFQ5WHYrOWx6NHBkZWQrcDJKWXJ5VTBwVUhIUGJ3TlVNb0RBdzhJV2grVmMzaGl2Njl5CkZHa09wZVVERG5pT0ppaEM4QWNMWWlBUVp6bEcrcWtEekFRNGVtYnZJSU8xakVwV2pwRUEvSTVjZ3Q2SW9NUGkKYUc1OWplODgzV1gwWGF4Ujd5U0FycXBXbDIvNXJYM2FZVCtZZHp5bGtiWWNqQ2JhWmFJSmJjSGlWT081eWt4TQpnSTkzZTJDYUh0KzI4a2dlRHJwT1ZHMlk0T0dpR3FKM1VNL0VZNUxzUnhtZDYrWnJ6c0VDQXdFQUFhT0JyRENCCnFUQU9CZ05WSFE4QkFmOEVCQU1DQVFZd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVVd5VjcKbHFSbFVYNjRPZlBBZUdaZTZEcm44TzR3SHdZRFZSMGpCQmd3Rm9BVVd5VjdscVJsVVg2NE9mUEFlR1plNkRybgo4TzR3UmdZRFZSMGdCRDh3UFRBN0JnbGdoWFFCV1FFQ0FRRXdMakFzQmdnckJnRUZCUWNDQVJZZ2FIUjBjRG92CkwzSmxjRzl6YVhSdmNua3VjM2RwYzNOemFXZHVMbU52YlM4d0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dJQkFDZTYKNDVSODhhN0EzaGZtNWRqVjlWU3dnL1M3elY0RmUwK2ZkV2F2UE9oV2Z2eHllRGdEMlN0aUd3QzUrT2xnemN6TwpVWXJIVURGdTRVcCtHQzlwV2JZOVpJRXI0NE9FNWlLSGpuM2c3Z0taWWJnZTlMZ3JpQklXaE1JeGt6aVdNYWE1Ck8xTS93eVNUVmx0cGt1ekZ3YnM0QU9Qc0Y2bTQzTWQ4QVlPZk1rZTZVaUkwSFRKNkNWYW5mQ1UycVQxTDJzQ0MKYndxN0VzaUhTeWNSK1I0dHg1TS9udHRmSm10UzJTNks4UlRHUkkwVnFiZS92ZDZtR3U2dUxmdElkeGYrdSt5dgpHUFVxVWZBNWhKZVZiRzRid3l2RWRHQjVKYkFLSjkvZlh0STV6MFY5UWt2ZnN5d2V4Y1pkeWxVNm9KeHBtby9hCjc3S3dQSitIYkJJclpYQVZVakVhSk05dk1TTlFINHhQanlQRGRFRmpIRldvRk4wKzRGRlF6L0ViTUZZT2tyQ0MKaGRpRHl5Smt2QzI0SmRWVW9yZ0c2cTJTcENTZ3dZYTFTaE5xUjg4dUMxYVZWTXZPbXR0cXRLYXkyMEVJaGlkMwo5MnFnUW13TE9NN1hkVkF5a3NMZkt6QWlTTkRWUVRnbFhhVHBYWi9HbEhYUVJmMHdsME9Qa0tzS3g0WnpZRXBwCkxkNmxlTmNHMm1xZVN6NTNPaUFUSWdIUXYyaWVZMkJyTlUwTGJicWhQY0NUNEg4anMxV3RjaVZPUnZuU0Z1K3cKWk1FQm51bktvR3FZRHMvWVlQSXZTYmprUXVFNE5SYjB5RzVQOTRGVzZMcWp2aU92cnYxdkErQUNPekIyK2h0dApRYzhCc2VtNHlXYjAyeWJ6T3FSMDhra2tXOG13MEZmQitqNTY0WmZKCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1Td2lzc1NpZ24gU2lsdmVyIENBIC0gRzIgTz1Td2lzc1NpZ24gQUcKIyBTdWJqZWN0OiBDTj1Td2lzc1NpZ24gU2lsdmVyIENBIC0gRzIgTz1Td2lzc1NpZ24gQUcKIyBMYWJlbDogIlN3aXNzU2lnbiBTaWx2ZXIgQ0EgLSBHMiIKIyBTZXJpYWw6IDU3MDAzODMwNTMxMTc1OTk1NjMKIyBNRDUgRmluZ2VycHJpbnQ6IGUwOjA2OmExOmM5OjdkOmNmOmM5OmZjOjBkOmMwOjU2Ojc1Ojk2OmQ4OjYyOjEzCiMgU0hBMSBGaW5nZXJwcmludDogOWI6YWE6ZTU6OWY6NTY6ZWU6MjE6Y2I6NDM6NWE6YmU6MjU6OTM6ZGY6YTc6ZjA6NDA6ZDE6MWQ6Y2IKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGJlOjZjOjRkOmEyOmJiOmI5OmJhOjU5OmI2OmYzOjkzOjk3OjY4OjM3OjQyOjQ2OmMzOmMwOjA1Ojk5OjNmOmE5OjhmOjAyOjBkOjFkOmVkOmJlOmQ0OjhhOjgxOmQ1Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGdlRDQ0E2V2dBd0lCQWdJSVR4dlVMMVM3TDBzd0RRWUpLb1pJaHZjTkFRRUZCUUF3UnpFTE1Ba0dBMVVFCkJoTUNRMGd4RlRBVEJnTlZCQW9UREZOM2FYTnpVMmxuYmlCQlJ6RWhNQjhHQTFVRUF4TVlVM2RwYzNOVGFXZHUKSUZOcGJIWmxjaUJEUVNBdElFY3lNQjRYRFRBMk1UQXlOVEE0TXpJME5sb1hEVE0yTVRBeU5UQTRNekkwTmxvdwpSekVMTUFrR0ExVUVCaE1DUTBneEZUQVRCZ05WQkFvVERGTjNhWE56VTJsbmJpQkJSekVoTUI4R0ExVUVBeE1ZClUzZHBjM05UYVdkdUlGTnBiSFpsY2lCRFFTQXRJRWN5TUlJQ0lqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FnOEEKTUlJQ0NnS0NBZ0VBeFBHSGY5TjRNZmM0eWZqRG1VTzh4L2U4TitkT2NicExqNlZ6SFZ4dW1LNERWNjQ0TjBNdgpGejBmeU01b0VNRjRyaGtES3hENkxIbUQ5dWk1YUxsVjhnUkVwem41L0FTTEh2R2lUU2Y1WVh1NnQrV2lFN2JyCllUN1FiTkhtKy9wZTdSMjBucUExVzZHU3kvQkprdjZGQ2dVKzV0a0w0ays3M0pVMy9KSHBNalVpMFI4NlRpZUYKbmJBVmxETGFZUTFIVFdCQ3JwSkg2SU5hVUZqcGlvdTVYYUhjM1psS0h6Wm51MGprZzdZMzYwZzZydzluanhjSAo2QVRLNzJveGg5VEF0dm1VY1h0blpMaTJrVXBDZTJVdU1Hb005WkR1bGVieXpZTHMyYUZLN1BheVMrVkZoZVp0CmVKTUVMcHlDYlRhcHhERmtINGFEQ3lyME5RcDR5VlhQUWJCSDZUQ2ZtYjVocUFhRXVTaDZYempaRzZrNHNJTi8KYzhIRE8wZ3FnZzhobTdqTXFEWERoQnVEc3o2K3BKVnBBVHFKQUhnRTJjbjBtUm1yVm41Ymk0WTVGWkdrRUN3SgpNb0JnczVQQUtyWVlDNTEralVueUVFcC8rZFZHTHhtU281bW5KcXk3akR6bURyeEhCOXh6VWZGd1pDOEkrYlJICkhUQnNST29wTjRXU2FHYThnemorZXprdTAxRHdIL3RlWUxhcHB2b25RZkdiR0hMeTlZUjBTc2xueEZTdVNHVGYKak5GdXNCM2hCNDhJSHBtY2NlbE0yS1gzUnhJZmRORlJub2J6d3FJalFBdHoyMHVtNTNNR2pNR2c2Y0ZackViNgo1aS80ejNHY1JtMjV4QldOT0hrRFJVanZ4RjNYQ082SE9TS0dzZzBQV0VQM2NhbElMdjNxMWg4Q0F3RUFBYU9CCnJEQ0JxVEFPQmdOVkhROEJBZjhFQkFNQ0FRWXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QWRCZ05WSFE0RUZnUVUKRjZETndlUkJ0anBiTzh0Rm5iMGN3cGo2aGxnd0h3WURWUjBqQkJnd0ZvQVVGNkROd2VSQnRqcGJPOHRGbmIwYwp3cGo2aGxnd1JnWURWUjBnQkQ4d1BUQTdCZ2xnaFhRQldRRURBUUV3TGpBc0JnZ3JCZ0VGQlFjQ0FSWWdhSFIwCmNEb3ZMM0psY0c5emFYUnZjbmt1YzNkcGMzTnphV2R1TG1OdmJTOHdEUVlKS29aSWh2Y05BUUVGQlFBRGdnSUIKQUhQR2dlQW4waTBQNEpVdzRwcEJmMUFzWDE5aVlhbUdhbWtZREhSSjFsMkU2a0ZTR0c5WXJWQldJR3JHdlNocApXSkhja1JFMXFUb2R2QnFsWUo3WUgzOUZrV25aZnJ0NGNzRUdEeXJPajRWd1lheWd6UXU0T1NsV2hESk9ocnM5CnhDcloxeDl5N3Y1Um9TSkJzWEVDWXhxQ3NHS3JYbGNTSDkvTDNYV2d3RjE1a0l3YjRGRG0zakgrbUh0d1g2V1EKMkszNEFyWnYwMkRkUUVzaXhUMnRPbnFmR2hwSGtYa3p1b0xjTW1rRGxtNGZTL0J4L3VObmNxQ3h2MXlMNVBxWgpJc2VFdVJ1Tkk1Yy83U1hnejJXNzlXRUU3OTBlc2xwQklscWhuMTBzNkZ2SmJha01ESGlxWU1aV2p3RmFER2k4CmFSbDV4QjkrbHdXL3hla2tVVjdVMVV0VDdka2pXallEWmFQQkE2MUJNUE5HRzRXUXIyVzExYkhrRmx0NGRSMlgKZW0xWnFTcVBlOTdEaDRrUW1VbHplTWc5dlZFMWRDclY4WDVwR3lxN083MGx1SnBhUFhKaGtHYUg3Z3pXVGRRUgpkQXRxL2dzRC9LTlZWNG4rU3N1dVd4Y0Z5UEtOSXpGVE9OSXRhaitDdVkwSWF2ZGVRWFJ1d3hGK0I2d3BZSkUvCk9NcFhFQTI5TUMvSHBlWkJvTnF1QlllYW9LUmxiRXdKREltNnVOTzV3Sk9LTVBxTjVacHJGUUZPWjZyYVlsWSsKaEFobTBzUTJmYWMrRVB5STROU0E1UUM5cXZOT0JxTjZhdmxpY3VNSlQrdWJEZ0VqOForN2ZOemNiQkdYSmJMeQp0R01VMGdZcVo0eUQ5YzdxQjlpYWFoN3M1QXE3S2t6ckNXQTV6c3BpMkM1dQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPUdlb1RydXN0IEluYy4KIyBTdWJqZWN0OiBDTj1HZW9UcnVzdCBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89R2VvVHJ1c3QgSW5jLgojIExhYmVsOiAiR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSIKIyBTZXJpYWw6IDMyNzk4MjI2NTUxMjU2OTYzMzI0MzEzODA2NDM2OTgxOTgyMzY5CiMgTUQ1IEZpbmdlcnByaW50OiAwMjoyNjpjMzowMTo1ZTowODozMDozNzo0MzphOTpkMDo3ZDpjZjozNzplNjpiZgojIFNIQTEgRmluZ2VycHJpbnQ6IDMyOjNjOjExOjhlOjFiOmY3OmI4OmI2OjUyOjU0OmUyOmUyOjEwOjBkOmQ2OjAyOjkwOjM3OmYwOjk2CiMgU0hBMjU2IEZpbmdlcnByaW50OiAzNzpkNToxMDowNjpjNToxMjplYTphYjo2Mjo2NDoyMTpmMTplYzo4Yzo5MjowMTozZjpjNTpmODoyYTplOTo4ZTplNTozMzplYjo0NjoxOTpiODpkZTpiNDpkMDo2YwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRGZEQ0NBbVNnQXdJQkFnSVFHS3kxYXYxcHRoVTZZMnl2MnZyRW9UQU5CZ2txaGtpRzl3MEJBUVVGQURCWQpNUXN3Q1FZRFZRUUdFd0pWVXpFV01CUUdBMVVFQ2hNTlIyVnZWSEoxYzNRZ1NXNWpMakV4TUM4R0ExVUVBeE1vClIyVnZWSEoxYzNRZ1VISnBiV0Z5ZVNCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVEFlRncwd05qRXgKTWpjd01EQXdNREJhRncwek5qQTNNVFl5TXpVNU5UbGFNRmd4Q3pBSkJnTlZCQVlUQWxWVE1SWXdGQVlEVlFRSwpFdzFIWlc5VWNuVnpkQ0JKYm1NdU1URXdMd1lEVlFRREV5aEhaVzlVY25WemRDQlFjbWx0WVhKNUlFTmxjblJwClptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0MKQVFFQXZyZ1ZlLy9VZkgxbnJZTmtlOGhDVXkzZjlvUUlJR0hXQVZscW5FUVJyKzkyL1pWK3ptRXd1M3FEWHdLOQpBV2JLN2hXTmI2RXduTDJoaFo2VU92TldpQUF4ejlqdWFwWUMyZTBEalB0MWJlZnF1RlVXQlJhYTlPQmVzWWpBClpJVmNGVTJJeDdlNjRIWHByUVU5bmNlSlNPQzdLTWdENFRDVFpGNVN3Rmx3SWpWWGlJcnhsUXFEMTd3eGN3RTAKN2U5R2NlQnJBcWcxY211WG0yYmd5eHg1WDlnYUJHZ2VSd0xtbldEaU5wY0IzODQxa3QrK1o4ZHRkMWs3ajUzVwprQldVdkVJMEVNRTUrYkVuUG43V2luWEZzcStXMDZMZW0rU1l2bjNoNllHdHRtLzgxdzdhNERTd0RScDM1K01JCm1POVkrcHlFdHphdnd0K3MwdlFRQm5CeE5RSURBUUFCbzBJd1FEQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BNEcKQTFVZER3RUIvd1FFQXdJQkJqQWRCZ05WSFE0RUZnUVVMTlZRUVpjVmkvQ1BObUZiU3Z0cjJabkpNNUl3RFFZSgpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFGcHdmeXpkdHpSUDlZWlJxU2ErUzdpcThYRU4zR0hIb09vMEhucDNEd1ExCjZDZVBiSkMva1JZa1JqNUtUczRyRnRVTFVoMzhIMmVpQWtVeFQ4N3orZ09uZVoxVGF0bmFZenI0Z05mVG1lR2wKNGI3VVZYR1lOVHEraytxdXJVS3lrRy9nL0NGTk5XTXppVW5XbTA3S3grZE9DUUQzMnNmdm1XS1pkN2FWSWw2SwpvS3YwdUhpWXlqZ1ptY2x5bm5qTlM2eXZHYUJ6RWkzOHdrRzZnWkhhRmxveHQvbTBjWUFTU0pseWMxcFpVOEZqClVqUHRwOG5TT1FKdyt1Q3hRbVlwcXB0UjdUQlVJaFJmMmFzZHdlU1U4UGoxSy9mcXluaEcxcmlSL2FZTkt4b1UKQVQ2QThFS2dsUWRlYmMzTVM2UkZqYXNTNkxQZVd1V2dmT2dQSWgxYTZWaz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPXRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgTz10aGF3dGUsIEluYy4gT1U9Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbi8oYykgMjAwNiB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIFN1YmplY3Q6IENOPXRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgTz10aGF3dGUsIEluYy4gT1U9Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbi8oYykgMjAwNiB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIExhYmVsOiAidGhhd3RlIFByaW1hcnkgUm9vdCBDQSIKIyBTZXJpYWw6IDY5NTI5MTgxOTkyMDM5MjAzNTY2Mjk4OTUzNzg3NzEyOTQwOTA5CiMgTUQ1IEZpbmdlcnByaW50OiA4YzpjYTpkYzowYjoyMjpjZTpmNTpiZTo3MjphYzo0MToxYToxMTphODpkODoxMgojIFNIQTEgRmluZ2VycHJpbnQ6IDkxOmM2OmQ2OmVlOjNlOjhhOmM4OjYzOjg0OmU1OjQ4OmMyOjk5OjI5OjVjOjc1OjZjOjgxOjdiOjgxCiMgU0hBMjU2IEZpbmdlcnByaW50OiA4ZDo3MjoyZjo4MTphOTpjMToxMzpjMDo3OToxZDpmMTozNjphMjo5Njo2ZDpiMjo2Yzo5NTowYTo5NzoxZDpiNDo2Yjo0MTo5OTpmNDplYTo1NDpiNzo4YjpmYjo5ZgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRUlEQ0NBd2lnQXdJQkFnSVFORTdWVnlEVjdleEo5Qy9PTjlzcmJUQU5CZ2txaGtpRzl3MEJBUVVGQURDQgpxVEVMTUFrR0ExVUVCaE1DVlZNeEZUQVRCZ05WQkFvVERIUm9ZWGQwWlN3Z1NXNWpMakVvTUNZR0ExVUVDeE1mClEyVnlkR2xtYVdOaGRHbHZiaUJUWlhKMmFXTmxjeUJFYVhacGMybHZiakU0TURZR0ExVUVDeE12S0dNcElESXcKTURZZ2RHaGhkM1JsTENCSmJtTXVJQzBnUm05eUlHRjFkR2h2Y21sNlpXUWdkWE5sSUc5dWJIa3hIekFkQmdOVgpCQU1URm5Sb1lYZDBaU0JRY21sdFlYSjVJRkp2YjNRZ1EwRXdIaGNOTURZeE1URTNNREF3TURBd1doY05Nell3Ck56RTJNak0xT1RVNVdqQ0JxVEVMTUFrR0ExVUVCaE1DVlZNeEZUQVRCZ05WQkFvVERIUm9ZWGQwWlN3Z1NXNWoKTGpFb01DWUdBMVVFQ3hNZlEyVnlkR2xtYVdOaGRHbHZiaUJUWlhKMmFXTmxjeUJFYVhacGMybHZiakU0TURZRwpBMVVFQ3hNdktHTXBJREl3TURZZ2RHaGhkM1JsTENCSmJtTXVJQzBnUm05eUlHRjFkR2h2Y21sNlpXUWdkWE5sCklHOXViSGt4SHpBZEJnTlZCQU1URm5Sb1lYZDBaU0JRY21sdFlYSjVJRkp2YjNRZ1EwRXdnZ0VpTUEwR0NTcUcKU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ3NvUEQ3Z0ZuVW5NZWt6NTJoV1hNSkVFVU1EU3h1YVBGcwpXMGhvU1ZrMy9Bc3pHY0ozZjh3UUxaVTBIT2JyVFFtbkhOSzR5WmMyQXJlSjFDUmZCc0RNUkpTVWpRSmliK3RhCjNSR05LSnBjaEpBUWVnMjlkR1l2YWppZzR0VlVST3NkQjU4SHVtL3U2ZjFPQ3luMVBvU2dBZkdjcS9nY2ZvbWsKNktIWWNXVU5vMUY3N3J6U0ltQU51VnVkMzdyOFVWc0xyNWl5NlM3cEJPaGloOTRyeU5kT3dVeGtIdDNQaDFpNgpTay9LYUFjZEhKMUt4dFV2a2N4OGNYSWN4Y0JuNnpMOXlaSmNsTnFGd0p1L1UzMHJDZlNNblpFZmwycFN5OTRKCk5xUjMySHVIVUVUVlBtNHBhZnM1U1NZZUNhV0FlMEF0NitnbmhjbitZZjErNW55WEhkV2RBZ01CQUFHalFqQkEKTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RGdZRFZSMFBBUUgvQkFRREFnRUdNQjBHQTFVZERnUVdCQlI3VzBYUApyODdMZXYweGtocHF0dk5HNjFkSVVEQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFlUkhBUzdPUnR2enc2V2ZVCkRXNUZ2bFhvazlMT0F6L3QyaVd3SFZmTEhqcDJvRXpzVUhib1pISU1wS254dUl2VzFvZUV1ekxsUVJIQWQ5bXoKWUozckc5WFJia1JFcWFZQjdGVmlIWGU0WEk1SVNYeWNPMWNScksxek40NHZlRnlRYUVmWllHRG0vQWM5SWlBWAp4UGNXNmNUWWN2bkljM3pmRmk4VnFUNzlhaWUyb2V0YXVwZ2YxZU5OWkFxZEU4aGh1dlU1SEllNnVMMTdJbi8yCi9xeEFlZVdzRUc4OWp4dDVkb3ZFTjdNaEdJVGxOZ0RyWXlDWnVlbitNd1M3UWNqQkF2bEVZeUNlZ2M1QzA5WS8KTEhiVFk1eFozWSttNFE2Z0xrSDNMcFZIejd6OU0vUDJDMkYrZnBFcmdVZkNKekR1cHhCZE40OWNPU3ZrQlBCNwpqVmFNYUE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049VmVyaVNpZ24gQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc1IE89VmVyaVNpZ24sIEluYy4gT1U9VmVyaVNpZ24gVHJ1c3QgTmV0d29yay8oYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgU3ViamVjdDogQ049VmVyaVNpZ24gQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc1IE89VmVyaVNpZ24sIEluYy4gT1U9VmVyaVNpZ24gVHJ1c3QgTmV0d29yay8oYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgTGFiZWw6ICJWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUiCiMgU2VyaWFsOiAzMzAzNzY0NDE2NzU2ODA1ODk3MDE2NDcxOTQ3NTY3NjEwMTQ1MAojIE1ENSBGaW5nZXJwcmludDogY2I6MTc6ZTQ6MzE6Njc6M2U6ZTI6MDk6ZmU6NDU6NTc6OTM6ZjM6MGE6ZmE6MWMKIyBTSEExIEZpbmdlcnByaW50OiA0ZTpiNjpkNTo3ODo0OTo5YjoxYzpjZjo1Zjo1ODoxZTphZDo1NjpiZTozZDo5Yjo2Nzo0NDphNTplNQojIFNIQTI1NiBGaW5nZXJwcmludDogOWE6Y2Y6YWI6N2U6NDM6Yzg6ZDg6ODA6ZDA6NmI6MjY6MmE6OTQ6ZGU6ZWU6ZTQ6YjQ6NjU6OTk6ODk6YzM6ZDA6Y2E6ZjE6OWI6YWY6NjQ6MDU6ZTQ6MWE6Yjc6ZGYKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUUwekNDQTd1Z0F3SUJBZ0lRR05yUm5pWjk2THRLSVZqTnpHczdTakFOQmdrcWhraUc5dzBCQVFVRkFEQ0IKeWpFTE1Ba0dBMVVFQmhNQ1ZWTXhGekFWQmdOVkJBb1REbFpsY21sVGFXZHVMQ0JKYm1NdU1SOHdIUVlEVlFRTApFeFpXWlhKcFUybG5iaUJVY25WemRDQk9aWFIzYjNKck1Ub3dPQVlEVlFRTEV6RW9ZeWtnTWpBd05pQldaWEpwClUybG5iaXdnU1c1akxpQXRJRVp2Y2lCaGRYUm9iM0pwZW1Wa0lIVnpaU0J2Ym14NU1VVXdRd1lEVlFRREV6eFcKWlhKcFUybG5iaUJEYkdGemN5QXpJRkIxWW14cFl5QlFjbWx0WVhKNUlFTmxjblJwWm1sallYUnBiMjRnUVhWMAphRzl5YVhSNUlDMGdSelV3SGhjTk1EWXhNVEE0TURBd01EQXdXaGNOTXpZd056RTJNak0xT1RVNVdqQ0J5akVMCk1Ba0dBMVVFQmhNQ1ZWTXhGekFWQmdOVkJBb1REbFpsY21sVGFXZHVMQ0JKYm1NdU1SOHdIUVlEVlFRTEV4WlcKWlhKcFUybG5iaUJVY25WemRDQk9aWFIzYjNKck1Ub3dPQVlEVlFRTEV6RW9ZeWtnTWpBd05pQldaWEpwVTJsbgpiaXdnU1c1akxpQXRJRVp2Y2lCaGRYUm9iM0pwZW1Wa0lIVnpaU0J2Ym14NU1VVXdRd1lEVlFRREV6eFdaWEpwClUybG5iaUJEYkdGemN5QXpJRkIxWW14cFl5QlFjbWx0WVhKNUlFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXkKYVhSNUlDMGdSelV3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ3ZKQWdJS1hvMQpubUFNcXVkTE8wN2NmTHc4UlJ5N0srRCtLUUw1VndpalpJVVZKL1h4cmNneGlWMGk2Q3FxcGtLemovaTVWYmV4CnQwdXovbzkrQjFmczcwUGJabUlWWWM5Z0RhVFkzdmpndzJJSVBWUVQ2MG5LV1ZTRkp1VXJqeHVmNi9XaGtjSXoKU2RoRFkycFNTOUtQNkhCUlRkR0phWHZIY1BhejNCSjAyM3RkUzFiVGxyOFZkNkd3OUtJbDhxOGNrbWNZNWZRRwpCTytRdWVRQTVOMDZ0Um4vQXJyMFBPN2dpK3MzaSt6MDE2enk5dkE5cjkxMWtUTVpIUnhBeTNRa0dTR1QyUlQrCnJDcFN4NC9WQkVua2pXTkhpRHhwZzh2K1I3MHJmay9GbGE0T25kVFJROEJuYytNVUNIN2xQNTl6dURNS3oxMC8KTkllV2l1NVQ2Q1VWQWdNQkFBR2pnYkl3Z2E4d0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RQpCQU1DQVFZd2JRWUlLd1lCQlFVSEFRd0VZVEJmb1YyZ1d6QlpNRmN3VlJZSmFXMWhaMlV2WjJsbU1DRXdIekFICkJnVXJEZ01DR2dRVWorWFRHb2Fzalk1cnc4K0FhdFJJR0N4N0dTNHdKUllqYUhSMGNEb3ZMMnh2WjI4dWRtVnkKYVhOcFoyNHVZMjl0TDNaemJHOW5ieTVuYVdZd0hRWURWUjBPQkJZRUZIL1RaYWZDM2V5NzhEQUo4ME01K2dLdgpNekV6TUEwR0NTcUdTSWIzRFFFQkJRVUFBNElCQVFDVEpFb3dYMkxQMkJxWUx6M3EzSmt0dlhmMnBYa2lPT3pFCnA2QjRFcTFpRGtWd1pNWG5sMll0bUFsK1g2L1d6Q2hsOGdHcUNCcEgzdm41ZkpKYUNHa2dEZGsrYlc0OERXN1kKNWdhUlFCaTUrTUh0Mzl0QnF1Q1dJTW5OWkJVNGdjbVU3cUtFS1FzVGI0N2JETjBsQXR1a2l4bEUwa0Y2QldsSwpXRTlneW42Q2Fnc0NxaVVYT2JYYmYrZUVaU3FWaXIyRzNsNkJGb010RU16ZS9haUNLbTBvSHcwTHhPWG5HaVlaCjRmUVJieEMxbGZ6blFnVXkyODZkVVY0b3RwNkYwMXZ2cFgxRlFIS090dzVyRGdiN016VkljYmlkSjR2RVpWOE4KaG5hY1JIcjJsVnoyWFRJSU02UlV0aGcvYUZ6eVFrcUZPRlNEWDlIb0xQS3NFZGFvN1dOcQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049U2VjdXJlVHJ1c3QgQ0EgTz1TZWN1cmVUcnVzdCBDb3Jwb3JhdGlvbgojIFN1YmplY3Q6IENOPVNlY3VyZVRydXN0IENBIE89U2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24KIyBMYWJlbDogIlNlY3VyZVRydXN0IENBIgojIFNlcmlhbDogMTcxOTk3NzQ1ODkxMjUyNzc3ODgzNjI3NTcwMTQyNjY4NjIwMzIKIyBNRDUgRmluZ2VycHJpbnQ6IGRjOjMyOmMzOmE3OjZkOjI1OjU3OmM3OjY4OjA5OjlkOmVhOjJkOmE5OmEyOmQxCiMgU0hBMSBGaW5nZXJwcmludDogODc6ODI6YzY6YzM6MDQ6MzU6M2I6Y2Y6ZDI6OTY6OTI6ZDI6NTk6M2U6N2Q6NDQ6ZDk6MzQ6ZmY6MTEKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGYxOmMxOmI1OjBhOmU1OmEyOjBkOmQ4OjAzOjBlOmM5OmY2OmJjOjI0OjgyOjNkOmQzOjY3OmI1OjI1OjU3OjU5OmI0OmU3OjFiOjYxOmZjOmU5OmY3OjM3OjVkOjczCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEdURDQ0FxQ2dBd0lCQWdJUURQQ09YQWdXcGExQ2YvRHJKeGhaMERBTkJna3Foa2lHOXcwQkFRVUZBREJJCk1Rc3dDUVlEVlFRR0V3SlZVekVnTUI0R0ExVUVDaE1YVTJWamRYSmxWSEoxYzNRZ1EyOXljRzl5WVhScGIyNHgKRnpBVkJnTlZCQU1URGxObFkzVnlaVlJ5ZFhOMElFTkJNQjRYRFRBMk1URXdOekU1TXpFeE9Gb1hEVEk1TVRJegpNVEU1TkRBMU5Wb3dTREVMTUFrR0ExVUVCaE1DVlZNeElEQWVCZ05WQkFvVEYxTmxZM1Z5WlZSeWRYTjBJRU52CmNuQnZjbUYwYVc5dU1SY3dGUVlEVlFRREV3NVRaV04xY21WVWNuVnpkQ0JEUVRDQ0FTSXdEUVlKS29aSWh2Y04KQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUt1a2dlV1Z6ZlgyRkk3Q1Q4clU0bmlWV0p4QjRRMlpRQ1FYT1pFegpadW0rNFlPdllseUowZndrVzJHejRCRVJRUndkYnZDNHUvamVwNEc2cGtqR254Mjl2bzZwUVQ2NGxPMHBHdFNPCjBnTWRBKzl0RFdjY1Y5Y0dyY3JJOWY0T3IyWWxTQVNXQzEyanVoYkRDRS9SUnZnVVhQTElYZ0daYmYySXpJYW8Kd1c4eFFteFNQbWpMOHhrMDM3dUhHRmFBSnNUUTNNQnYzOTZnd3BFV29HUVJTMFM4SHZibittUGVacXgycEhHago3RGFVYUhwM3BMSG5EaStCZXVLMWNvYnZvbXVMOEEvYjAxay91bks4UkNTYzQzT3o5NjlYTDBJbW5hbDB1Z0JTCjhrdk5VM3hIQ3phRkRtYXBDSmNXTkZmQlp2ZUE0KzF3Vk1lVDRDNG9GVm1IdXJzQ0F3RUFBYU9CblRDQm1qQVQKQmdrckJnRUVBWUkzRkFJRUJoNEVBRU1BUVRBTEJnTlZIUThFQkFNQ0FZWXdEd1lEVlIwVEFRSC9CQVV3QXdFQgovekFkQmdOVkhRNEVGZ1FVUWpLMkZ2b0UvZjVkUzNyRC9mZE1RQjFhUTY4d05BWURWUjBmQkMwd0t6QXBvQ2VnCkpZWWphSFIwY0RvdkwyTnliQzV6WldOMWNtVjBjblZ6ZEM1amIyMHZVMVJEUVM1amNtd3dFQVlKS3dZQkJBR0MKTnhVQkJBTUNBUUF3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCQUREdFQwcmhXRHBTY2x1MXBxTmxHS2E3VVR0Mwo2WjNxMDU5YzRFVmxldzNLVytKd1VMS1VCUlN1U2NlTlFRY1NjNVIrRENNaC9id1FmMkFRV25MMW1BNnM3TGwvCjNYcHZYZE1jOVArSUJXbENxUVZ4eUxlc0p1Z3V0SXhxLzNIY3VMSGZtYng4SVZRcjVGaWl1MWNwcnA2cG94a20KRDVrdUNMRHYvV25QbVJvSmplT25ueXZKTmpSN0pMTjRUSlVYcEFZbUhyWmtValpmWUdmWm5NVUZkQXZuWnlQUwpDUHlJNmE2TGYrRXc5RGQrL2NZeTJpMmVSREF3Yk80SDN0STAvTkwvUVBaTDlHWkdCbFNtOGpJS1l5WXdhNXZSCjNJdEh1dUc1MVdMUW9xRDBad1Y0S1dNYWJ3VFcrTVpNbzVxeE43U041U2hMSFo0c3dyaG92TzBDN2pFPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049U2VjdXJlIEdsb2JhbCBDQSBPPVNlY3VyZVRydXN0IENvcnBvcmF0aW9uCiMgU3ViamVjdDogQ049U2VjdXJlIEdsb2JhbCBDQSBPPVNlY3VyZVRydXN0IENvcnBvcmF0aW9uCiMgTGFiZWw6ICJTZWN1cmUgR2xvYmFsIENBIgojIFNlcmlhbDogOTc1MTgzNjE2NzczMTA1MTU1NDIzMjExOTQ4MTQ1Njk3ODU5NwojIE1ENSBGaW5nZXJwcmludDogY2Y6ZjQ6Mjc6MGQ6ZDQ6ZWQ6ZGM6NjU6MTY6NDk6NmQ6M2Q6ZGE6YmY6NmU6ZGUKIyBTSEExIEZpbmdlcnByaW50OiAzYTo0NDo3Mzo1YTplNTo4MTo5MDoxZjoyNDo4Njo2MTo0NjoxZTozYjo5YzpjNDo1ZjpmNTozYToxYgojIFNIQTI1NiBGaW5nZXJwcmludDogNDI6MDA6ZjU6MDQ6M2E6Yzg6NTk6MGU6YmI6NTI6N2Q6MjA6OWU6ZDE6NTA6MzA6Mjk6ZmI6Y2I6ZDQ6MWM6YTE6YjU6MDY6ZWM6Mjc6ZjE6NWE6ZGU6N2Q6YWM6NjkKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR2RENDQXFTZ0F3SUJBZ0lRQjFZaXBPalVpb2xOOUJQSThQanFwVEFOQmdrcWhraUc5dzBCQVFVRkFEQksKTVFzd0NRWURWUVFHRXdKVlV6RWdNQjRHQTFVRUNoTVhVMlZqZFhKbFZISjFjM1FnUTI5eWNHOXlZWFJwYjI0eApHVEFYQmdOVkJBTVRFRk5sWTNWeVpTQkhiRzlpWVd3Z1EwRXdIaGNOTURZeE1UQTNNVGswTWpJNFdoY05Namt4Ck1qTXhNVGsxTWpBMldqQktNUXN3Q1FZRFZRUUdFd0pWVXpFZ01CNEdBMVVFQ2hNWFUyVmpkWEpsVkhKMWMzUWcKUTI5eWNHOXlZWFJwYjI0eEdUQVhCZ05WQkFNVEVGTmxZM1Z5WlNCSGJHOWlZV3dnUTBFd2dnRWlNQTBHQ1NxRwpTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDdk5TN1lyR3hWYVFaeDVSTm9KTE5QMk13aFIvanhZRGlKCmlRUHB2ZXBlUmxNSjNGejFXdWozUlNvQzZ6RmgxeWt6VE03SGZBbzNmZys2TXBqaEhaZXZqOGZjeVRpVzg5c2EKL0ZIdGFNYlFicVI4Sk5HdVFzaVdVR011NFA1MS9waW5YMGt1bGVNNU0yU09IcVJma05KblBMTFova0c1VmFjSgpqbklGSG92ZFJJV0NRdEJKd0IxZzhORVhMSlhyOXFYQmtxUEZ3cWNJWUExZ0JCQ1dlWjRXTk9hcHR2b2xSVG5JCkhtWDVrL1dxOFZMY21aZzlwWVlhRERVeitrdWxCQVlWSERHQTc2b1lhOEo3MTlyTytUTWcxZlc5YWpNdGdRVDcKc0Z6VW5LUGlYQjNqcVVKMVhudlVkKzg1VkxySkNoZ2JFcGxKTDRoTC9WQmkwWFBuajNwREFnTUJBQUdqZ1owdwpnWm93RXdZSkt3WUJCQUdDTnhRQ0JBWWVCQUJEQUVFd0N3WURWUjBQQkFRREFnR0dNQThHQTFVZEV3RUIvd1FGCk1BTUJBZjh3SFFZRFZSME9CQllFRks5RUJNSkJma2lEMjA0NUF1enNoSHJtenNta01EUUdBMVVkSHdRdE1Dc3cKS2FBbm9DV0dJMmgwZEhBNkx5OWpjbXd1YzJWamRYSmxkSEoxYzNRdVkyOXRMMU5IUTBFdVkzSnNNQkFHQ1NzRwpBUVFCZ2pjVkFRUURBZ0VBTUEwR0NTcUdTSWIzRFFFQkJRVUFBNElCQVFCakdnaEFmYVJlVXcxMzJIcXVIdzBMClVSWUQ3eGg4eU9PdmFsaVRGR0NSc29UY2lFNitPWW82OCthQ2lWMEJON09ySktRVkRwSTFXa3BFWGs1WCtuWE8KSDBqT1p2UThRQ2FTbUd3YjdpUkdEQmV6VXFYYnBaR1J6emZUYitjbkNEcE9HUjg2cDFoY0Y4OTVQNHZrcDlNbQpJNTBtRDFocC9FZCtzdENOaTVPL0tVOURhWFIyWjB2UEI0em1BdmUxNGJSRHRVc3RGSi81M0NZTnY2WkhkQWJZCmlORTZLVENFenRJNWdHSWJxTWRYU2J4cVZWRm5GVXErTlFmazFYV1lOM2t3Rk5zcG5XekZhY3hIVmFJdzk4eGMKZjhMRG1CeHJUaGFBNjNwNFpVV2lBQnF2REExVlpEUkl1Sks1OGJSUUtmSlBJeC9hYkt3ZlJPSGRJM2hSVzhjVwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049Q09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89Q09NT0RPIENBIExpbWl0ZWQKIyBTdWJqZWN0OiBDTj1DT01PRE8gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1DT01PRE8gQ0EgTGltaXRlZAojIExhYmVsOiAiQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IgojIFNlcmlhbDogMTA0MzUwNTEzNjQ4MjQ5MjMyOTQxOTk4NTA4OTg1ODM0NDY0NTczCiMgTUQ1IEZpbmdlcnByaW50OiA1Yzo0ODpkYzpmNzo0Mjo3MjplYzo1Njo5NDo2ZDoxYzpjYzo3MTozNTo4MDo3NQojIFNIQTEgRmluZ2VycHJpbnQ6IDY2OjMxOmJmOjllOmY3OjRmOjllOmI2OmM5OmQ1OmE2OjBjOmJhOjZhOmJlOmQxOmY3OmJkOmVmOjdiCiMgU0hBMjU2IEZpbmdlcnByaW50OiAwYzoyYzpkNjozZDpmNzo4MDo2ZjphMzo5OTplZDplODowOToxMTo2Yjo1Nzo1YjpmODo3OTo4OTpmMDo2NToxODpmOTo4MDo4Yzo4NjowNTowMzoxNzo4YjphZjo2NgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRUhUQ0NBd1dnQXdJQkFnSVFUb0V0aW9KbDRBc0M3ajQxQWtibFBUQU5CZ2txaGtpRzl3MEJBUVVGQURDQgpnVEVMTUFrR0ExVUVCaE1DUjBJeEd6QVpCZ05WQkFnVEVrZHlaV0YwWlhJZ1RXRnVZMmhsYzNSbGNqRVFNQTRHCkExVUVCeE1IVTJGc1ptOXlaREVhTUJnR0ExVUVDaE1SUTA5TlQwUlBJRU5CSUV4cGJXbDBaV1F4SnpBbEJnTlYKQkFNVEhrTlBUVTlFVHlCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVEFlRncwd05qRXlNREV3TURBdwpNREJhRncweU9URXlNekV5TXpVNU5UbGFNSUdCTVFzd0NRWURWUVFHRXdKSFFqRWJNQmtHQTFVRUNCTVNSM0psCllYUmxjaUJOWVc1amFHVnpkR1Z5TVJBd0RnWURWUVFIRXdkVFlXeG1iM0prTVJvd0dBWURWUVFLRXhGRFQwMVAKUkU4Z1EwRWdUR2x0YVhSbFpERW5NQ1VHQTFVRUF4TWVRMDlOVDBSUElFTmxjblJwWm1sallYUnBiMjRnUVhWMAphRzl5YVhSNU1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBMEVDTGkzTGprUnYzClVjRWJWQVNZMDZtL3dlYUtYVHVIKzd1SXpnM2pMejhHbHZDaUtWQ1pydHM3b1Zld2RGRnh6ZTFDa1UxQi9xbkkKMkdxR2QwUzdXV2FYVUY2MDFDeHdSTS9hTjVWQ2FUd3d4SEd6VXZBaFRhSFl1amw4SEo2akpKM3lneGFZcWhaOApRNXNWVzdldU5KSCsxR0ltR0VhYVArdkIrZkdRVit1c2VnMkwyM0l3YW1iVjRFYWpjTnhvMmY4RVNJbDMzclhwCisyZHRRZW04T2IweTJXSUM4YkdvUFc0M25PSXY0dE9pSm92R3VGVkRpT0VqUHFYU0pEbHFSNnNBMUtHenFTWCsKRFQrbkhiclRVY0VMcE5xc09POVZVQ1FGWlVhVE5FOHRqYTNHMUNFWjBvN0tCV0Z4QjNOSDVZb1pFcjBFVGM1TwpuS1ZJckxzbTl3SURBUUFCbzRHT01JR0xNQjBHQTFVZERnUVdCQlFMV09XTHhrd1ZONlJBcVRDcEliNUhObHBXCi96QU9CZ05WSFE4QkFmOEVCQU1DQVFZd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pCSkJnTlZIUjhFUWpCQU1ENmcKUEtBNmhqaG9kSFJ3T2k4dlkzSnNMbU52Ylc5a2IyTmhMbU52YlM5RFQwMVBSRTlEWlhKMGFXWnBZMkYwYVc5dQpRWFYwYUc5eWFYUjVMbU55YkRBTkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQVBwaWVtL1liNmRjNXQzaXVIWElZClNkT0g1RU9DNnovSnF2V290ZTlWZkNGU1pmblZEZUZzOUQ2TWszT1JMZ0xFVGdkeGI4Q1BPR0VJcUI2QkNzQXYKSUM5Qmk1SGNTRVc4OGNiZXVuWnJNOGdBTFRGR1RPM25uYytJbFA4endGYm9KSVltdU5nNE9OOHFhOTBTek1jLwpSeGRNb3NJR2xnblcyLzQvUEVaQjMxamlWZzg4TzhFY2t6WFpPRktzN3Nqc0xqQk9sRFcwSkI5TGVHbmE4Z0k0CnpKVlNrL0J3SlZtY0lHZkU3dm1MVjJIMGtuWjlQNFNOVmJmbzVhelY4ZlVaVnFaYSs1QWNyNVByNVJ6VVo1ZGQKQkE2K0M0T21GNE81TUJLZ3hUTVZCYmtOKzhjRmR1UFlTbzM4TkJlanhpRW92akJGTVI3SGVMNVlZVGlzTytJQgpaUT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1OZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgTz1OZXR3b3JrIFNvbHV0aW9ucyBMLkwuQy4KIyBTdWJqZWN0OiBDTj1OZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgTz1OZXR3b3JrIFNvbHV0aW9ucyBMLkwuQy4KIyBMYWJlbDogIk5ldHdvcmsgU29sdXRpb25zIENlcnRpZmljYXRlIEF1dGhvcml0eSIKIyBTZXJpYWw6IDExNjY5NzkxNTE1MjkzNzQ5NzQ5MDQzNzU1NjM4NjgxMjQ4NzkwNAojIE1ENSBGaW5nZXJwcmludDogZDM6ZjM6YTY6MTY6YzA6ZmE6NmI6MWQ6NTk6YjE6MmQ6OTY6NGQ6MGU6MTE6MmUKIyBTSEExIEZpbmdlcnByaW50OiA3NDpmODphMzpjMzplZjplNzpiMzo5MDowNjo0Yjo4Mzo5MDozYzoyMTo2NDo2MDoyMDplNTpkZjpjZQojIFNIQTI1NiBGaW5nZXJwcmludDogMTU6ZjA6YmE6MDA6YTM6YWM6N2E6ZjM6YWM6ODg6NGM6MDc6MmI6MTA6MTE6YTA6Nzc6YmQ6Nzc6YzA6OTc6ZjQ6MDE6NjQ6YjI6Zjg6NTk6OGE6YmQ6ODM6ODY6MGMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUQ1akNDQXM2Z0F3SUJBZ0lRVjhzemI4SmNGdVpIRmhmamtERm80REFOQmdrcWhraUc5dzBCQVFVRkFEQmkKTVFzd0NRWURWUVFHRXdKVlV6RWhNQjhHQTFVRUNoTVlUbVYwZDI5eWF5QlRiMngxZEdsdmJuTWdUQzVNTGtNdQpNVEF3TGdZRFZRUURFeWRPWlhSM2IzSnJJRk52YkhWMGFXOXVjeUJEWlhKMGFXWnBZMkYwWlNCQmRYUm9iM0pwCmRIa3dIaGNOTURZeE1qQXhNREF3TURBd1doY05Namt4TWpNeE1qTTFPVFU1V2pCaU1Rc3dDUVlEVlFRR0V3SlYKVXpFaE1COEdBMVVFQ2hNWVRtVjBkMjl5YXlCVGIyeDFkR2x2Ym5NZ1RDNU1Ma011TVRBd0xnWURWUVFERXlkTwpaWFIzYjNKcklGTnZiSFYwYVc5dWN5QkRaWEowYVdacFkyRjBaU0JCZFhSb2IzSnBkSGt3Z2dFaU1BMEdDU3FHClNJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUURrdkg2U01HM0cySTRyQzd4R3p1QW5sdDdlK2ZvUzB6d3oKYzdNRUw3eHhqT1dmdGlKZ1BsOWR6Z24vZ2d3Ym1sRlFHaWFKM2RWaFhSbmNFZzh0Q3FKRFhSZlFOSklnNm5QUApPQ3dHSmdsNmN2ZjZVREw0d3BQVGFhSWp6a0d4ek9UVkh6YlJpanI0akdQaUZGbHA3UTNUZjJ2b3VBUGxUMnJsCm1HTnBTQVcrTHY4enR1bVhXV240WnhtdWsyR1dSQlhUY3JBL3ZHcDk3RWgvamNPcnFuRXJVMmxCVXpTMXNMbkYKQmdyRXNFWDFRVjF1aVVWN1BUc21qSFRDNWRMUmZiSVIxUHRZTWlLYWdNbmMvUXpwZjE0RGw4NDdBQlNISjNBNApxWTV1c3lkMm1GSGdCZU1ocXhyVmhTSThLYldhRnNXQXFQUzdhekNQTDBZQ29yRU1JdURUQWdNQkFBR2pnWmN3CmdaUXdIUVlEVlIwT0JCWUVGQ0V3eWZzQTEwNlkyb2VxS3RDbkxyRkFNYWRNTUE0R0ExVWREd0VCL3dRRUF3SUIKQmpBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUZJR0ExVWRId1JMTUVrd1I2QkZvRU9HUVdoMGRIQTZMeTlqY213dQpibVYwYzI5c2MzTnNMbU52YlM5T1pYUjNiM0pyVTI5c2RYUnBiMjV6UTJWeWRHbG1hV05oZEdWQmRYUm9iM0pwCmRIa3VZM0pzTUEwR0NTcUdTSWIzRFFFQkJRVUFBNElCQVFDN3Jrdm50MWZyZjZvdHQzTkhoV3JCNUtVZDVPYzgKNmZSWlpYZTFlbHRhalNVMjRIcVhMampBVjJDRG1BYURuN2wyZW01UTRMcUlMUHhGekJpd21aVlJEdXdkdUlqLwpoMUFjZ3NMajRES0F2NkFMUjhqRE1lK1paektBVHhjaGVReHBYTjVlTks0Q3RTYnFVTjkvR0dVc3lmSmo0YWtICi9ueHhIMnN6SkdvZUJmY0ZhTUJxRXNzdVhtSExyaWpUZnNLMFpwRW1Yend1SkYvTFdBL3JLT3l2RVpiejNIdHYKd0tlSThsTjNzMkJlcnE0bzJqVXNielJGMHliaDN1eGJUeWRyRm55OVJBUVlnck9KZVJjUWNUMTZvaFpPOVFITgpwR3hsYUtGSmRseER5ZGk4Tm1kc3BaUzExTXk1dldvMVZpSGUyTVByKzh1a1lFeXdWYUNnZTFleQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049Q09NT0RPIEVDQyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPUNPTU9ETyBDQSBMaW1pdGVkCiMgU3ViamVjdDogQ049Q09NT0RPIEVDQyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPUNPTU9ETyBDQSBMaW1pdGVkCiMgTGFiZWw6ICJDT01PRE8gRUNDIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IgojIFNlcmlhbDogNDE1NzgyODM4NjcwODY2OTI2MzgyNTY5MjE1ODk3MDc5MzgwOTAKIyBNRDUgRmluZ2VycHJpbnQ6IDdjOjYyOmZmOjc0OjlkOjMxOjUzOjVlOjY4OjRhOmQ1Ojc4OmFhOjFlOmJmOjIzCiMgU0hBMSBGaW5nZXJwcmludDogOWY6NzQ6NGU6OWY6MmI6NGQ6YmE6ZWM6MGY6MzE6MmM6NTA6YjY6NTY6M2I6OGU6MmQ6OTM6YzM6MTEKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDE3OjkzOjkyOjdhOjA2OjE0OjU0Ojk3Ojg5OmFkOmNlOjJmOjhmOjM0OmY3OmYwOmI2OjZkOjBmOjNhOmUzOmEzOmI4OjRkOjIxOmVjOjE1OmRiOmJhOjRmOmFkOmM3Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDaVRDQ0FnK2dBd0lCQWdJUUgwZXZxbUlBY0ZCVVRBR2VtMk9aS2pBS0JnZ3Foa2pPUFFRREF6Q0JoVEVMCk1Ba0dBMVVFQmhNQ1IwSXhHekFaQmdOVkJBZ1RFa2R5WldGMFpYSWdUV0Z1WTJobGMzUmxjakVRTUE0R0ExVUUKQnhNSFUyRnNabTl5WkRFYU1CZ0dBMVVFQ2hNUlEwOU5UMFJQSUVOQklFeHBiV2wwWldReEt6QXBCZ05WQkFNVApJa05QVFU5RVR5QkZRME1nUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa3dIaGNOTURnd016QTJNREF3Ck1EQXdXaGNOTXpnd01URTRNak0xT1RVNVdqQ0JoVEVMTUFrR0ExVUVCaE1DUjBJeEd6QVpCZ05WQkFnVEVrZHkKWldGMFpYSWdUV0Z1WTJobGMzUmxjakVRTUE0R0ExVUVCeE1IVTJGc1ptOXlaREVhTUJnR0ExVUVDaE1SUTA5TgpUMFJQSUVOQklFeHBiV2wwWldReEt6QXBCZ05WQkFNVElrTlBUVTlFVHlCRlEwTWdRMlZ5ZEdsbWFXTmhkR2x2CmJpQkJkWFJvYjNKcGRIa3dkakFRQmdjcWhrak9QUUlCQmdVcmdRUUFJZ05pQUFRRFIzc3ZkY21DRllYN2RlU1IKRnRTcllwbjFQbElMQnM1QkFIK1g0UW9rUEIwQkJPNDkwbzBKbHd6Z2RlVDYrM2VLS3ZVRFlFczJpeFlqRnEwSgpjZlJLOUNoUXRQNklIRzQvYkM4dkNWbGJwVnNMTTVuaXd6MkorV29zNzdMVEJ1bWpRakJBTUIwR0ExVWREZ1FXCkJCUjFjYWNaU0JtOG5aM3FRVWZmbE1SSWQ1blRlVEFPQmdOVkhROEJBZjhFQkFNQ0FRWXdEd1lEVlIwVEFRSC8KQkFVd0F3RUIvekFLQmdncWhrak9QUVFEQXdOb0FEQmxBakVBN3dOYmVxeTNlQXB5dDRqZi83VkdGQWtLK3FEbQpmUWpHR29lOUdLaHp2U2JLWUF5ZHpwbWZ6MXdQTU9HK0ZESHFBakFVOUpNOFNhY3plcEJHUjdOamZST2JUcmR2CkdEZUFVLzdkSU9BMW1qYlJ4d0c1NXR6ZDgvOGRMRG9XVjltU09kWT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPU9JU1RFIFdJU2VLZXkgR2xvYmFsIFJvb3QgR0EgQ0EgTz1XSVNlS2V5IE9VPUNvcHlyaWdodCAoYykgMjAwNS9PSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkCiMgU3ViamVjdDogQ049T0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQSBPPVdJU2VLZXkgT1U9Q29weXJpZ2h0IChjKSAyMDA1L09JU1RFIEZvdW5kYXRpb24gRW5kb3JzZWQKIyBMYWJlbDogIk9JU1RFIFdJU2VLZXkgR2xvYmFsIFJvb3QgR0EgQ0EiCiMgU2VyaWFsOiA4NjcxODg3Nzg3MTEzMzE1OTA5MDA4MDU1NTkxMTgyMzU0ODMxNAojIE1ENSBGaW5nZXJwcmludDogYmM6NmM6NTE6MzM6YTc6ZTk6ZDM6NjY6NjM6NTQ6MTU6NzI6MWI6MjE6OTI6OTMKIyBTSEExIEZpbmdlcnByaW50OiA1OToyMjphMTplMTo1YTplYToxNjozNToyMTpmODo5ODozOTo2YTo0Njo0NjpiMDo0NDoxYjowZjphOQojIFNIQTI1NiBGaW5nZXJwcmludDogNDE6Yzk6MjM6ODY6NmE6YjQ6Y2E6ZDY6Yjc6YWQ6NTc6ODA6ODE6NTg6MmU6MDI6MDc6OTc6YTY6Y2I6ZGY6NGY6ZmY6Nzg6Y2U6ODM6OTY6YjM6ODk6Mzc6ZDc6ZjUKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUQ4VENDQXRtZ0F3SUJBZ0lRUVQxeXgvUnJINEZEZmZIU0tGVGZtakFOQmdrcWhraUc5dzBCQVFVRkFEQ0IKaWpFTE1Ba0dBMVVFQmhNQ1EwZ3hFREFPQmdOVkJBb1RCMWRKVTJWTFpYa3hHekFaQmdOVkJBc1RFa052Y0hseQphV2RvZENBb1l5a2dNakF3TlRFaU1DQUdBMVVFQ3hNWlQwbFRWRVVnUm05MWJtUmhkR2x2YmlCRmJtUnZjbk5sClpERW9NQ1lHQTFVRUF4TWZUMGxUVkVVZ1YwbFRaVXRsZVNCSGJHOWlZV3dnVW05dmRDQkhRU0JEUVRBZUZ3MHcKTlRFeU1URXhOakF6TkRSYUZ3MHpOekV5TVRFeE5qQTVOVEZhTUlHS01Rc3dDUVlEVlFRR0V3SkRTREVRTUE0RwpBMVVFQ2hNSFYwbFRaVXRsZVRFYk1Ca0dBMVVFQ3hNU1EyOXdlWEpwWjJoMElDaGpLU0F5TURBMU1TSXdJQVlEClZRUUxFeGxQU1ZOVVJTQkdiM1Z1WkdGMGFXOXVJRVZ1Wkc5eWMyVmtNU2d3SmdZRFZRUURFeDlQU1ZOVVJTQlgKU1ZObFMyVjVJRWRzYjJKaGJDQlNiMjkwSUVkQklFTkJNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QQpNSUlCQ2dLQ0FRRUF5MCt6QUpzOU50MzUwVWxxYXhCSkgrellLN0xHK0RLQktVT1ZUSm9aSXlFVlJkN2p5QnhSClZWdXVrK2czL3l0cjZkVHF2aXJkcUZFcjEyYkRZVnhnQXNqMXpuSjdPN2p5VG1VSW1zMmthaG5CQWJ0enB0ZjIKdzkzTnZLU0x0WmxodUFHaW85Uk4xQVU5a2EzNHRBaHhaSzl3OFJ4cmZ2YkRkNTBrYzN2a0RJemgyVGJobVlzRgptUXZ0UlRFSnlzSUEyL2R5b0phcWxZZlFqc2UyWVhNTmRtYU0zQnUwWTZLZmY1TVRNUEdoSjl2Wi95eFZpSkdnCjRFOEhzQ2hXakJnYmwwU09pZDNnRjI3bkt1K1BPUW94aElMWVFCUkpMbnBCNUtmKzQyVE13Vmx4U3l3aHAxdDkKNEIzUkxvR2J3OWhvOTcyV0c2eHdzUllVQzl0Z3VTWUJCUUlEQVFBQm8xRXdUekFMQmdOVkhROEVCQU1DQVlZdwpEd1lEVlIwVEFRSC9CQVV3QXdFQi96QWRCZ05WSFE0RUZnUVVzd04rcmphOHNIblIzSlFtdGhHK0liSnBocFF3CkVBWUpLd1lCQkFHQ054VUJCQU1DQVFBd0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFFdWgvd3VIYnJQNXdVT3gKU1BNb3dCMHV5UWxCK3BRQUhLU2txMGxQanowZTcwMXZ2YnlrOXZJbU1Na1F5aDJJKzNRWkg0VkZ2YkJzVWZrMgpmdHYxVERJNlFVOWJSOC9vQ3kyMnhCbWRkTVZIeGp0cUQ2d1UyenowYzV5cEJkOEEzSFI0K3ZnMVlGa0NFeGg4CnZQdE5zQ0J0UTd0Z01IcG5NMXpGbWRINExUbFNjL3VNcXBjbFhITFpDQjZyVGp6amdUR2ZBNmI3d1A0cGlGWGEKaE5WUUE3YmloS09tTnFvUk9nSGhHRXZXUkdpelBmbFRkSVN6UnBGR2xnQzNnQ3kyNGVNUTR0dWk1eWlQQVpaaQpGajRBNHh5bE5vRVlva3hTZHNBUm8yN21IYnJqV3I0MlU4VStkWStHYVNsWVU3V2N1MitmWE1VWTdOMHY0WmpKCi9MN2ZDZzA9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1DZXJ0aWduYSBPPURoaW15b3RpcwojIFN1YmplY3Q6IENOPUNlcnRpZ25hIE89RGhpbXlvdGlzCiMgTGFiZWw6ICJDZXJ0aWduYSIKIyBTZXJpYWw6IDE4MzY0ODAyOTc0MjA5MzYyMTc1CiMgTUQ1IEZpbmdlcnByaW50OiBhYjo1NzphNjo1Yjo3ZDo0Mjo4MjoxOTpiNTpkODo1ODoyNjoyODo1ZTpmZDpmZgojIFNIQTEgRmluZ2VycHJpbnQ6IGIxOjJlOjEzOjYzOjQ1Ojg2OmE0OjZmOjFhOmIyOjYwOjY4OjM3OjU4OjJkOmM0OmFjOmZkOjk0Ojk3CiMgU0hBMjU2IEZpbmdlcnByaW50OiBlMzpiNjphMjpkYjoyZTpkNzpjZTo0ODo4NDoyZjo3YTpjNTozMjo0MTpjNzpiNzoxZDo1NDoxNDo0YjpmYjo0MDpjMToxZjozZjoxZDowYjo0MjpmNTplZTphMToyZAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRHFEQ0NBcENnQXdJQkFnSUpBUDdjNHdFUHlVai9NQTBHQ1NxR1NJYjNEUUVCQlFVQU1EUXhDekFKQmdOVgpCQVlUQWtaU01SSXdFQVlEVlFRS0RBbEVhR2x0ZVc5MGFYTXhFVEFQQmdOVkJBTU1DRU5sY25ScFoyNWhNQjRYCkRUQTNNRFl5T1RFMU1UTXdOVm9YRFRJM01EWXlPVEUxTVRNd05Wb3dOREVMTUFrR0ExVUVCaE1DUmxJeEVqQVEKQmdOVkJBb01DVVJvYVcxNWIzUnBjekVSTUE4R0ExVUVBd3dJUTJWeWRHbG5ibUV3Z2dFaU1BMEdDU3FHU0liMwpEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUURJYVBISjF0YXpOSFVtZ2g3c3RMN3FYT0VtN1JGSFllR2lmQlo0ClFDSGtZSjVheUdQaHhMR1drdjhZYldrajRTdGk5OTNpTmkrUkI3bEl6dzdzZWJZczV6UkxjQWdsb3p5SEd4bnkKZ1FjUE9KQVoweEgraHJUeTBWNGVIcGJOZ0d6T096R1R0dktnMEttVkVuMmxtc3hyeUlSV2lqT3A1eUlWVXhidwp6QmZzVjEvcG9ncVlDZDdqWDV4djNFampoUXNWV3FhNm42eEk0d215OS9ReTNsNDB2aHg0WFVKYnpnNGlqMDJRCjEzMHlHTE1MTEdxL2pqOFVFWWtnRG5jVXRUMlVDSWYzSlI3VnNtQUE3RzhxS0NWdUtqNFlZeGNsUHo1RUlCYjIKSnNnbHJnVkt0T2RqTFBPTUZsTitYUHNSR2dqQlJtS2ZJcmp4d28xcDNQbzZXQWJmQWdNQkFBR2pnYnd3Z2JrdwpEd1lEVlIwVEFRSC9CQVV3QXdFQi96QWRCZ05WSFE0RUZnUVVHdTMrUVRtUXRDUlp2Z0h5VXRWRjlsbzUzQkV3ClpBWURWUjBqQkYwd1c0QVVHdTMrUVRtUXRDUlp2Z0h5VXRWRjlsbzUzQkdoT0tRMk1EUXhDekFKQmdOVkJBWVQKQWtaU01SSXdFQVlEVlFRS0RBbEVhR2x0ZVc5MGFYTXhFVEFQQmdOVkJBTU1DRU5sY25ScFoyNWhnZ2tBL3R6agpBUS9KU1A4d0RnWURWUjBQQVFIL0JBUURBZ0VHTUJFR0NXQ0dTQUdHK0VJQkFRUUVBd0lBQnpBTkJna3Foa2lHCjl3MEJBUVVGQUFPQ0FRRUFoUU1la25IMlFxL2hvMkdlNi9QQUQvS2wxTnFWNXRhK2FEWTlmbTRmVElydjBROGgKYlY2bFVtUE9Fdmp2S3RwdjZ6ZitFd0xIeXpzK0ltdmFZUzUvMUhJOTNURGhIa3hBR1l3UDE1elJnekI3bUZuYwpmY2E1RENsTW9UT2k2MmM2WllUVGx1THRka1Z3ajdVcjN2a2oxa2x1UEJTMXhwODFIbERRd1k5cWNFUUNZc3V1CkhXaEJwNnBYNkZPcUI5SUc5dFVVQmd1UkEzVXNiSEsxWVpXYURZdTVEZWYxMzFUTjN1YlkxZ2tJbDJQbHdTNncKdDBRbXdDYkFyMVV3bmp2Vk5pb1pCUFJjSHYvUExMZi8wUDJIUUJIVkVTTzdTTUFocWFRb0xmMFYrTEJPSy9RdwpXeUg4RVpFMHZrSHZlNTJYZGYrWGxjQ1dXQy9xdTBiWHUrVFpMZz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1EZXV0c2NoZSBUZWxla29tIFJvb3QgQ0EgMiBPPURldXRzY2hlIFRlbGVrb20gQUcgT1U9VC1UZWxlU2VjIFRydXN0IENlbnRlcgojIFN1YmplY3Q6IENOPURldXRzY2hlIFRlbGVrb20gUm9vdCBDQSAyIE89RGV1dHNjaGUgVGVsZWtvbSBBRyBPVT1ULVRlbGVTZWMgVHJ1c3QgQ2VudGVyCiMgTGFiZWw6ICJEZXV0c2NoZSBUZWxla29tIFJvb3QgQ0EgMiIKIyBTZXJpYWw6IDM4CiMgTUQ1IEZpbmdlcnByaW50OiA3NDowMTo0YTo5MTpiMTowODpjNDo1ODpjZTo0NzpjZDpmMDpkZDoxMTo1MzowOAojIFNIQTEgRmluZ2VycHJpbnQ6IDg1OmE0OjA4OmMwOjljOjE5OjNlOjVkOjUxOjU4OjdkOmNkOmQ2OjEzOjMwOmZkOjhjOmRlOjM3OmJmCiMgU0hBMjU2IEZpbmdlcnByaW50OiBiNjoxOToxYTo1MDpkMDpjMzo5Nzo3Zjo3ZDphOTo5YjpjZDphYTpjODo2YToyMjo3ZDphZTpiOTo2Nzo5ZTpjNzowYjphMzpiMDpjOTpkOToyMjo3MTpjMTo3MDpkMwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRG56Q0NBb2VnQXdJQkFnSUJKakFOQmdrcWhraUc5dzBCQVFVRkFEQnhNUXN3Q1FZRFZRUUdFd0pFUlRFYwpNQm9HQTFVRUNoTVRSR1YxZEhOamFHVWdWR1ZzWld0dmJTQkJSekVmTUIwR0ExVUVDeE1XVkMxVVpXeGxVMlZqCklGUnlkWE4wSUVObGJuUmxjakVqTUNFR0ExVUVBeE1hUkdWMWRITmphR1VnVkdWc1pXdHZiU0JTYjI5MElFTkIKSURJd0hoY05PVGt3TnpBNU1USXhNVEF3V2hjTk1Ua3dOekE1TWpNMU9UQXdXakJ4TVFzd0NRWURWUVFHRXdKRQpSVEVjTUJvR0ExVUVDaE1UUkdWMWRITmphR1VnVkdWc1pXdHZiU0JCUnpFZk1CMEdBMVVFQ3hNV1ZDMVVaV3hsClUyVmpJRlJ5ZFhOMElFTmxiblJsY2pFak1DRUdBMVVFQXhNYVJHVjFkSE5qYUdVZ1ZHVnNaV3R2YlNCU2IyOTAKSUVOQklESXdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDckM2TTE0SXNwRkxFVQpoYTg4RU9RNWJ6VmRTcTdkNm1HTmxVbjBiMlNqR21CbXBLbEFJb1RaMUtYbGVKTU9hQUd0dVUxY09zN1R1S2hDClFOL1BvN3FDV1dxU0c2d2NtdG9JS3lVbitXa2pSL0hnNnl4Nm0vVVRBdEIrTkh6Q25qd0FXYXYxMmd6MU1qd3IKckZEYTFzUGVnNVRLcUF5Wk1nNElTRlpiYXZ2YTRWaFlBVWxmY2tFOEZRWUJqbDJ0cXJpVHRNMmU2NmZvYWkxUwpOTnM2NzF4MVVkcmI4ekg1N25HWU1zUlVGVVFNK1p0VjdhM2ZHQWlnbzRhS1NlNVRCWThaVE5YZVdIbWIwbW9jClFxdkYxYWZQYUErVzVPRmhtSFpoeUpGODFqNEE0cEZRaCtHZEN1YXRsOUlkeGpwOXk3emFBelRWamxzQjlXb0gKdHhhMmJrcC9BZ01CQUFHalFqQkFNQjBHQTFVZERnUVdCQlF4dzNrYnV2VlQxeGZnaVhvdEYyd0tzeXVkTXpBUApCZ05WSFJNRUNEQUdBUUgvQWdFRk1BNEdBMVVkRHdFQi93UUVBd0lCQmpBTkJna3Foa2lHOXcwQkFRVUZBQU9DCkFRRUFsR1JaclRsazV5bnJFLzVhdzRzVFY4Z0VKUEIwZDhCZzQyZjc2WW1tZzcrV2dueHUxTU05NzU2QWJyc3AKdEpoNnNUdFU2emtYUjM0YWpndjhIekZaTVFTeXpoZnpMTWRpTmxYaUl0aUpWYlNZU0twayt0WWNOdGhFZUZwYQpJenBYbC9WNk1FK3VuMnBNU3l1T29BUGpQdUNwMU5KNzByT280bkk4clo3L2dGbmttMFcwOWp1d3pUa1ptRExsCjZpRmhrT1F4SVk0MHNmY3ZOVXFGRU5ybmlqY2h2bGxqNFBLRmlERlQxRlFVaFhCNTlDNEdkeWQxTHgrNGl2bisKeGJyWU51U0Q3T2RsdDc5ald2TkdyNEdVTjlSQmpOWWoxaDdQOVdnYlJHT2lXcnFuTlZtaDVYQUZtdzRqVjVtVQpDbTI2T1dNb2hwTHpHSVRZKzlIUEJWWmtWdz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1DeWJlcnRydXN0IEdsb2JhbCBSb290IE89Q3liZXJ0cnVzdCwgSW5jCiMgU3ViamVjdDogQ049Q3liZXJ0cnVzdCBHbG9iYWwgUm9vdCBPPUN5YmVydHJ1c3QsIEluYwojIExhYmVsOiAiQ3liZXJ0cnVzdCBHbG9iYWwgUm9vdCIKIyBTZXJpYWw6IDQ4MzU3MDMyNzg0NTk2ODI4Nzc0ODQzNjAKIyBNRDUgRmluZ2VycHJpbnQ6IDcyOmU0OjRhOjg3OmUzOjY5OjQwOjgwOjc3OmVhOmJjOmUzOmY0OmZmOmYwOmUxCiMgU0hBMSBGaW5nZXJwcmludDogNWY6NDM6ZTU6YjE6YmY6Zjg6Nzg6OGM6YWM6MWM6Yzc6Y2E6NGE6OWE6YzY6MjI6MmI6Y2M6MzQ6YzYKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDk2OjBhOmRmOjAwOjYzOmU5OjYzOjU2Ojc1OjBjOjI5OjY1OmRkOjBhOjA4OjY3OmRhOjBiOjljOmJkOjZlOjc3OjcxOjRhOmVhOmZiOjIzOjQ5OmFiOjM5OjNkOmEzCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEb1RDQ0FvbWdBd0lCQWdJTEJBQUFBQUFCRDRXcUxVZ3dEUVlKS29aSWh2Y05BUUVGQlFBd096RVlNQllHCkExVUVDaE1QUTNsaVpYSjBjblZ6ZEN3Z1NXNWpNUjh3SFFZRFZRUURFeFpEZVdKbGNuUnlkWE4wSUVkc2IySmgKYkNCU2IyOTBNQjRYRFRBMk1USXhOVEE0TURBd01Gb1hEVEl4TVRJeE5UQTRNREF3TUZvd096RVlNQllHQTFVRQpDaE1QUTNsaVpYSjBjblZ6ZEN3Z1NXNWpNUjh3SFFZRFZRUURFeFpEZVdKbGNuUnlkWE4wSUVkc2IySmhiQ0JTCmIyOTBNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQStNaTh2UlJRWmhQLzhOTjUKN0NQeXR4ckhqb1h4RW5PbUdhb1EyNXlpWlhSYWR6NVJmVmIyM0NPMjFPMWZXTEUzVGRWSkRtNzFhb2ZXMG96UwpKOGJpL3phZm1HV2dFMDdHS21TYjFaQVN6eFFHOUR2ajFDaSs2QTc0cTA1SWxHMk9sVEVRWE8yaUxiM1ZPbTJ5CkhMdGd3RVpMQWZWSnJuNUdpdEIwamFFTUFzN3UvT2VQdUd0bTgzOUVBTDltSlJRcjNSQXdIUWVXUDAzMmE3aVAKdDNzTXBUanIza2ZiMVYwNS9JaW44OWNxZFBIb1dxSTduMUM2cG94Rk5jSlFaWlhjWTRMdjNiOTNUWnhpeVdOegpGdEFwRDBtcFNQQ3pxcmRzeGFjd09VQmRyc1RpWFNaVDhNNGNJd2hocUpRWnVnUmlRT3dmT0hCM0VnWnhwekFZClhTVW5wUUlEQVFBQm80R2xNSUdpTUE0R0ExVWREd0VCL3dRRUF3SUJCakFQQmdOVkhSTUJBZjhFQlRBREFRSC8KTUIwR0ExVWREZ1FXQkJTMkNIc05lc3lzSUV5R1ZqSmV6NnR1aFMxd1Z6QS9CZ05WSFI4RU9EQTJNRFNnTXFBdwpoaTVvZEhSd09pOHZkM2QzTWk1d2RXSnNhV010ZEhKMWMzUXVZMjl0TDJOeWJDOWpkQzlqZEhKdmIzUXVZM0pzCk1COEdBMVVkSXdRWU1CYUFGTFlJZXcxNnpLd2dUSVpXTWw3UHEyNkZMWEJYTUEwR0NTcUdTSWIzRFFFQkJRVUEKQTRJQkFRQlc3d29qb0ZST2xaZkorSW5hUmNIVW93QWw5QjhUcTdlamhWaHB3akN0MkJXS0xlUEp6WUZhK0hNagpXcWQ4QmZQOUlqc08wUWJFMnpaTWN3U081YkFpNU1YekxxWFpJK080VGtvZ3AyNENKSjhpWUdkN2l4MXlDY1V4ClhPbDVuNEJIUGEyaEN3Y1VQVWYvQTJrYURBdEU1Mk1scDMreXliaDJoTzBqOW4wSHEwViswOSt6dittS3RzMm8Kb21jclV0VzNaZkE1VEdPZ2tYbVRVZzlVM1lPN245R1BwMU56dzh2L01PeDhCTGpZUkIrVFgzRUpJcmR1UHVvYwpBMDZkR2lCaCs0RTM3Rjc4Q2tXcjErY1hWZENnNm1DYnB2YmpqRnNwd2daZ0ZKMHRsMHlwa3hXZFljUUJYMGpXCldMMVdNUkpPRWNnaDRMTVJrV1hidEthSU9NNVYKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IE89Q2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4gT1U9ZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5CiMgU3ViamVjdDogTz1DaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLiBPVT1lUEtJIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKIyBMYWJlbDogImVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSIKIyBTZXJpYWw6IDI4OTU2MDg4NjgyNzM1MTg5NjU1MDMwNTI5MDU3MzUyNzYwNDc3CiMgTUQ1IEZpbmdlcnByaW50OiAxYjoyZTowMDpjYToyNjowNjo5MDozZDphZDpmZTo2ZjoxNTo2ODpkMzo2YjpiMwojIFNIQTEgRmluZ2VycHJpbnQ6IDY3OjY1OjBkOmYxOjdlOjhlOjdlOjViOjgyOjQwOmE0OmY0OjU2OjRiOmNmOmUyOjNkOjY5OmM2OmYwCiMgU0hBMjU2IEZpbmdlcnByaW50OiBjMDphNjpmNDpkYzo2MzphMjo0YjpmZDpjZjo1NDplZjoyYTo2YTowODoyYTowYTo3MjpkZTozNTo4MDozZToyZjpmNTpmZjo1Mjo3YTplNTpkODo3MjowNjpkZjpkNQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRnNEQ0NBNWlnQXdJQkFnSVFGY2k5WlVkY3I3aVhBRjdrQnRLOG5UQU5CZ2txaGtpRzl3MEJBUVVGQURCZQpNUXN3Q1FZRFZRUUdFd0pVVnpFak1DRUdBMVVFQ2d3YVEyaDFibWRvZDJFZ1ZHVnNaV052YlNCRGJ5NHNJRXgwClpDNHhLakFvQmdOVkJBc01JV1ZRUzBrZ1VtOXZkQ0JEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVUQWUKRncwd05ERXlNakF3TWpNeE1qZGFGdzB6TkRFeU1qQXdNak14TWpkYU1GNHhDekFKQmdOVkJBWVRBbFJYTVNNdwpJUVlEVlFRS0RCcERhSFZ1WjJoM1lTQlVaV3hsWTI5dElFTnZMaXdnVEhSa0xqRXFNQ2dHQTFVRUN3d2haVkJMClNTQlNiMjkwSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNSUlDSWpBTkJna3Foa2lHOXcwQkFRRUYKQUFPQ0FnOEFNSUlDQ2dLQ0FnRUE0U1VQN28zYmlETjFaODJ0SDMwNlRtMmQweThVODJOMHl3RWhhamZxaEZBSApTeVpiQ1VOc0laNXF5TlVEOVdCcGo4endJdVFmNS9kcUlqRzNMQlh5NFA0QWFrUC9oMlhHdFJyQnAweHRJbkFoCmlqSHlsM1NKQ1JJbUhKN0syUktpbFR6YTZXZS9DS0JrNDlaQ3QwWHZsL1QyOWRlMVNoVUNXSDJZV0V0Z3ZNM1gKRFpvVE0xUFJZZmw2MWRkNHM1b3o5d0NHemgxTmxEaXZxT3g0VVhDS1hCQ0RVU0gzRVQwMGhsN2xTTTJYZ1lJMQpUQm5zWmZacnhRV2g3a2NUMXJNaEo1UVFDdGtrTzdxK1JCTkdNRCtYUE5qWDEycnVPempqSzlTWERya2I1d2RKCmZ6Y3ErWGQ0ejFUdFcwYWRvNEFPa1VQQjFsdGZGTHFmcG8wa1IwQlp2M0k0c2pac04vK1owVjBPV1FxcmFmZkEKc2dSRmVsUUFycjVUOXJYbjRmZzhvekhTcWY0aFVtVEZwbWZ3ZFFjR2xCU0JWY1luNUFHUEY4RnFjZGUrUy91VQpXSDErRVRPeFF2ZGliQmpXendsb1BuOXM5aDZQWXEybFk5c0pweDhpUWtFZWI1bUtQdGY1UDBCNmViQ2xBWkxTCm5UMElGYVVRQVMyek1uYW9sUTJ6ZXByN0J4QjRFVy9oajhlNkR5VWFkQ3JsSEpoQm1kOGhoK2lWQm1vS3MycEgKZG1YMk9zK1BZaGNaZXdvb3pSclNneDRoeHl5L3Z2OWhhTGRuRzd0NFRZM09aK1hrd1k2M0kyYmluWkIxTkppcApOaXVLbXBTNW5lek1pckg0SllsY1dyWXZqQjl0ZVNTblVtakRoRFhpWm8xakRpVk4xUm15NW5rM3B5S2RWREVDCkF3RUFBYU5xTUdnd0hRWURWUjBPQkJZRUZCNE05N1puOHVHU0pnbEZ3RlU1TG5jL1FrcWlNQXdHQTFVZEV3UUYKTUFNQkFmOHdPUVlFWnlvSEFBUXhNQzh3TFFJQkFEQUpCZ1VyRGdNQ0dnVUFNQWNHQldjcUF3QUFCQlJGc01MSApDbFo4N2x0NERKWDVHRlBCcGh6WUVEQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FnRUFDYk9EVTFrQlBwVkp1ZkdCCnV2bDJJQ08xSjJCMDFHcVpORjVzQUZQWm4vS21zU1FIUkdvcXhxV09lQkxvUjlsWUd4TXFYbm1ibndvcVo2WWwKUHdacFZuUERpbVpJK3ltQlYzUUd5cHpxS09nNFp5WXI4ZFcxUDJXVCtEWmRqbzJOUUNDSEdlcnZKOEE5dERrUApKWHRvVUhSVm5BeFpmVm85UVpRbFVnamdSeXdWTVJuVnZ3ZFZ4cnNTdFpmMFg0T0Z1bkhCMld5QkVYWUtDckMvCmdwZjM2ajM2K3V3dHFTaVVPMWJkMGxFdXJzQzlDQldNZDFJMGx0YWJyTk1kam1FUE5YdWJyamxwQzJKZ1FDQTIKajYvN051NHRDRW9kdUwrYlhQanFwUnVnYzZiWStHN2dNd1JmYUtvbmgrM1p3WkNjN2IzamFqV3ZZOStyR05tNgo1dWxLNmxDS0QyR1RIdUl0R2VJd2xEV1NYUTYyQjY4WmdJOUhrRkZMTGszZGhlTFNDbElLRjVyOEdyQlFBdVVCCm8yTTNJVXhFeEp0Um1SRU9jNXdHajFRdXB5aGVSRG1IVmkwM3ZZVkVsT0VNU3l5Y3c1S0ZOR0hMRDdpYlNrTlMKL2pRNmZianBLZHgycWNndytCUnhnTVllTmtoMElrRmNoNExvR0hHTFFZbEU1MzVZVzZpNGpSUHBwMnpEUisyegpHcDFpcm8yQzZwU2UzVmtRdzYzZDRrM2pNZFhIN09qeXNQNlNIaFlLR3Z6WjgvZ250c20rSGJSc1pKQi85T1RFClc5YzNya0lPM2FRYWIzeUlWTVVXYnVGNmFDNzRPcjhOcER5Sk8zaW5UbU9EQkNFSVo0M3lna25RVy8yeHpRK0QKaE5RK0lJWDNTajByblAwcUNnbE42b0g0RVp3PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogTz1jZXJ0U0lHTiBPVT1jZXJ0U0lHTiBST09UIENBCiMgU3ViamVjdDogTz1jZXJ0U0lHTiBPVT1jZXJ0U0lHTiBST09UIENBCiMgTGFiZWw6ICJjZXJ0U0lHTiBST09UIENBIgojIFNlcmlhbDogMzUyMTAyMjcyNDkxNTQKIyBNRDUgRmluZ2VycHJpbnQ6IDE4Ojk4OmMwOmQ2OmU5OjNhOmZjOmY5OmIwOmY1OjBjOmY3OjRiOjAxOjQ0OjE3CiMgU0hBMSBGaW5nZXJwcmludDogZmE6Yjc6ZWU6MzY6OTc6MjY6NjI6ZmI6MmQ6YjA6MmE6ZjY6YmY6MDM6ZmQ6ZTg6N2M6NGI6MmY6OWIKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGVhOmE5OjYyOmM0OmZhOjRhOjZiOmFmOmViOmU0OjE1OjE5OjZkOjM1OjFjOmNkOjg4OjhkOjRmOjUzOmYzOmZhOjhhOmU2OmQ3OmM0OjY2OmE5OjRlOjYwOjQyOmJiCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlET0RDQ0FpQ2dBd0lCQWdJR0lBWUZGbkFDTUEwR0NTcUdTSWIzRFFFQkJRVUFNRHN4Q3pBSkJnTlZCQVlUCkFsSlBNUkV3RHdZRFZRUUtFd2hqWlhKMFUwbEhUakVaTUJjR0ExVUVDeE1RWTJWeWRGTkpSMDRnVWs5UFZDQkQKUVRBZUZ3MHdOakEzTURReE56SXdNRFJhRncwek1UQTNNRFF4TnpJd01EUmFNRHN4Q3pBSkJnTlZCQVlUQWxKUApNUkV3RHdZRFZRUUtFd2hqWlhKMFUwbEhUakVaTUJjR0ExVUVDeE1RWTJWeWRGTkpSMDRnVWs5UFZDQkRRVENDCkFTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTGN6dVg3SUpVcU90ZHUwS0J1cVY1RG8KMFNMVFpMclRrK2pVcklaaFFHcGdWMmhVaEUyOGFsUUNCZi9mbTVvcXJsMEhqMHJES0gvdit5djZlZkhIcmZBUQpVeVNRaTJiSnFJaXJyMXFqQU9tK3VrYnVXM043TEJlQ2dWNWlMS0VDWmJPOXhTc0Fmc1Q4QXpOWERlM2krczVkClJkWTR6VFcyc3NIUW5JRktxdVN5QVZ3ZGoxK1p4TEd0MjRnaDY1QUlnb0R6TUtORDVwQ0NybFVvU2UxYjE2a1EKT0E3K2oweGJtMGJxUWZXd0NIVEQwSWd6dG56WGROL2NoTkZERG5VNW9TVkFLT3A0eXc0c0xqbWRqSXR1Rmh3dgpKb0lRNHVObGxBb0V3RjczWFZ2NEVPTFF1bnBMKzk0M0FBQWFXeWpqMHB4elBqS0htS0hKVVMvWDNxd3pzMDhDCkF3RUFBYU5DTUVBd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUNBY1l3SFFZRFZSME8KQkJZRUZPQ01tOXNsU2JQeGZJYldza0tIQzlCcm9ObmtNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUJBUUErMGh5SgpMalg4K0hYZDVuOWxpUFJ5VE1rczF6Sk84OTBaZVVlOWpqdGJrdzlRU1NRVGF4UUdjdThKMDZHaDQwQ0V5ZWNZCk1uUThTRzRQbjB2VTl4N1RrNFprVkpkamNsRFZWYy82SUpNQ29wdkRJNU5PRmxWMm9IQjViYzBoSDg4dkxid1oKNDRneCtGa2FnUW5JbDZaMHgyREVXOHhYanJKMS9Sc0NDZHRaYjNLVGFmY3hRZGFJT0wrSHNyMFdlZm1xNUw2SQpKZDFoSnlNY3RURUhCRGEwR3BDOW9IUnhVSWx0dkJUakQ0YXU4YXMreDZBSnpLTkkwZURiWk9lU3RjK3Zja053CmkvbkRoRHdUcW42U20xZFRrL3B3d3BFT01mbWJaMTNwbGpoZVg3TnpUb2dWWjk2ZWRoQmlJTDVWYVpWREFEbE4KOXU2d1drNUpSRlJZWDBLRAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczIE89R2VvVHJ1c3QgSW5jLiBPVT0oYykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBTdWJqZWN0OiBDTj1HZW9UcnVzdCBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzMgTz1HZW9UcnVzdCBJbmMuIE9VPShjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIExhYmVsOiAiR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczIgojIFNlcmlhbDogMjg4MDkxMDU3Njk5Mjg1NjQzMTM5ODQwODUyMDk5NzU4ODU1OTkKIyBNRDUgRmluZ2VycHJpbnQ6IGI1OmU4OjM0OjM2OmM5OjEwOjQ0OjU4OjQ4OjcwOjZkOjJlOjgzOmQ0OmI4OjA1CiMgU0hBMSBGaW5nZXJwcmludDogMDM6OWU6ZWQ6Yjg6MGI6ZTc6YTA6M2M6Njk6NTM6ODk6M2I6MjA6ZDI6ZDk6MzI6M2E6NGM6MmE6ZmQKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGI0Ojc4OmI4OjEyOjI1OjBkOmY4Ojc4OjYzOjVjOjJhOmE3OmVjOjdkOjE1OjVlOmFhOjYyOjVlOmU4OjI5OjE2OmUyOmNkOjI5OjQzOjYxOjg4OjZjOmQxOmZiOmQ0Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEL2pDQ0F1YWdBd0lCQWdJUUZheHVsQm15ZVV0QjlpZXB3eGdQSHpBTkJna3Foa2lHOXcwQkFRc0ZBRENCCm1ERUxNQWtHQTFVRUJoTUNWVk14RmpBVUJnTlZCQW9URFVkbGIxUnlkWE4wSUVsdVl5NHhPVEEzQmdOVkJBc1QKTUNoaktTQXlNREE0SUVkbGIxUnlkWE4wSUVsdVl5NGdMU0JHYjNJZ1lYVjBhRzl5YVhwbFpDQjFjMlVnYjI1cwplVEUyTURRR0ExVUVBeE10UjJWdlZISjFjM1FnVUhKcGJXRnllU0JEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2CmNtbDBlU0F0SUVjek1CNFhEVEE0TURRd01qQXdNREF3TUZvWERUTTNNVEl3TVRJek5UazFPVm93Z1pneEN6QUoKQmdOVkJBWVRBbFZUTVJZd0ZBWURWUVFLRXcxSFpXOVVjblZ6ZENCSmJtTXVNVGt3TndZRFZRUUxFekFvWXlrZwpNakF3T0NCSFpXOVVjblZ6ZENCSmJtTXVJQzBnUm05eUlHRjFkR2h2Y21sNlpXUWdkWE5sSUc5dWJIa3hOakEwCkJnTlZCQU1UTFVkbGIxUnlkWE4wSUZCeWFXMWhjbmtnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa2cKTFNCSE16Q0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQU56aVhtSllIVE5YT1RJegordXZMaDR5bjFFcmRCb2pxWkk0eG1LVTRrQjZZenk1aksvQkd2RVN5aWFIQUtBeEpjQ0dWbjJUQXBwTVNBbVVtCmhzYWxpZkQ2MTRTZ2NLOVBHcGMvQmtUVnlldHlFSDNrTVNqN0hHSG1LQWRFYzVJaWFhY0RpR3lkWThoUzJwZ24KNXdoTWNENjB5UkxCeFdlRFhUUHpBeEhzYXRCVDR0RzZObUNVZ0x0aFkyeGJGMzdmUUpRZXF3M0NJU2h3aVAvVwpKbXhzWUFRbFRsVitmZSsvbEVqZXR4M2RjSTBGWDRpbG0vTEM3dXJSUUVGdFlqZ2RWZ2JGQTBkUklCbjhleEFMCkRtS3VkbFcvWDNlK1Bra0JVejJZSlFOMkpGb2R0TnVKNm5ubHRyTTdQN3BNS0VGL0JxeHFqc0hROWdVZGZlWkMKaHVPbDFVY0NBd0VBQWFOQ01FQXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DQVFZdwpIUVlEVlIwT0JCWUVGTVI1eW82aFRnTWRITnhyMnpGYmxENC9NSDh0TUEwR0NTcUdTSWIzRFFFQkN3VUFBNElCCkFRQXR4UlBQVm9CN2VuaTluNjRzbWVmdjJ0K1VYZ2xwcCtkdWFJeTljcjVIcVE2WEVyaEs4V1RUT2Q4bE5OVEIKelU2QjhBOEV4Q1N6TkpiR3Bxb3czMmhoYzlmNWpvV0o3dzVlbFNoS0tpZVBFSTR1ZkliRUFwN2FESGRsRGtRTgprdjM5c3hZMitoRU5IWXdPQjRscUtWYjNjdlRkRlp4M05XWlhxeE5UMkk3QlFNWFhFeFphY3NlM2FRSEVlckdECkFXaDlqVUdobEJqQkpWejg4UDZEQW9kOERRM1BMZ2hjU2tBTlB1eUJZZVlrMjhyZ0RpMEhzajVXM0kzMVFZVUgKU0pzTUM4dEpQMzNzdC8zTGpXZUpHcXZ0dXg2akFBZ0lGeXFDWERGZFJvb3RENGFiZE5sRis5UkFzWHFxYUMyRwpzcGtpNGNFcng1ejQ4MStvZ2hMckdSRXQKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPXRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMiBPPXRoYXd0ZSwgSW5jLiBPVT0oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIFN1YmplY3Q6IENOPXRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMiBPPXRoYXd0ZSwgSW5jLiBPVT0oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIExhYmVsOiAidGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcyIgojIFNlcmlhbDogNzE3NTgzMjA2NzI4MjU0MTAwMjA2NjE2MjEwODUyNTY0NzI0MDYKIyBNRDUgRmluZ2VycHJpbnQ6IDc0OjlkOmVhOjYwOjI0OmM0OmZkOjIyOjUzOjNlOmNjOjNhOjcyOmQ5OjI5OjRmCiMgU0hBMSBGaW5nZXJwcmludDogYWE6ZGI6YmM6MjI6MjM6OGY6YzQ6MDE6YTE6Mjc6YmI6Mzg6ZGQ6ZjQ6MWQ6ZGI6MDg6OWU6ZjA6MTIKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGE0OjMxOjBkOjUwOmFmOjE4OmE2OjQ0OjcxOjkwOjM3OjJhOjg2OmFmOmFmOjhiOjk1OjFmOmZiOjQzOjFkOjgzOjdmOjFlOjU2Ojg4OmI0OjU5OjcxOmVkOjE1OjU3Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDaURDQ0FnMmdBd0lCQWdJUU5md21YTm1FVDhrOUpqMVhtNjdYVmpBS0JnZ3Foa2pPUFFRREF6Q0JoREVMCk1Ba0dBMVVFQmhNQ1ZWTXhGVEFUQmdOVkJBb1RESFJvWVhkMFpTd2dTVzVqTGpFNE1EWUdBMVVFQ3hNdktHTXAKSURJd01EY2dkR2hoZDNSbExDQkpibU11SUMwZ1JtOXlJR0YxZEdodmNtbDZaV1FnZFhObElHOXViSGt4SkRBaQpCZ05WQkFNVEczUm9ZWGQwWlNCUWNtbHRZWEo1SUZKdmIzUWdRMEVnTFNCSE1qQWVGdzB3TnpFeE1EVXdNREF3Ck1EQmFGdzB6T0RBeE1UZ3lNelU1TlRsYU1JR0VNUXN3Q1FZRFZRUUdFd0pWVXpFVk1CTUdBMVVFQ2hNTWRHaGgKZDNSbExDQkpibU11TVRnd05nWURWUVFMRXk4b1l5a2dNakF3TnlCMGFHRjNkR1VzSUVsdVl5NGdMU0JHYjNJZwpZWFYwYUc5eWFYcGxaQ0IxYzJVZ2IyNXNlVEVrTUNJR0ExVUVBeE1iZEdoaGQzUmxJRkJ5YVcxaGNua2dVbTl2CmRDQkRRU0F0SUVjeU1IWXdFQVlIS29aSXpqMENBUVlGSzRFRUFDSURZZ0FFb3RXY2dudVZuZkZTZUlmK2loYS8KQmViZm93SlBEUWZHQUZHNkRBSlNMU0trUWpuRS9vL3F5Y0crMUUzL24zcWU0ckY4bXEybmhnbHpoOUhubXVONgpwYXB1KzdxemNNQm5pS0kxMUtPYXNmMnR3dTh4K3FpNTgvc0l4cEhSK3ltVm8wSXdRREFQQmdOVkhSTUJBZjhFCkJUQURBUUgvTUE0R0ExVWREd0VCL3dRRUF3SUJCakFkQmdOVkhRNEVGZ1FVbXRnQU1BRG5hMytGR082THRzNksKRFBnUjRic3dDZ1lJS29aSXpqMEVBd01EYVFBd1pnSXhBTjM0NEZkSFc2Zm1Dc085OVlDS2x6VU5HNGs4VklaMwpLTXFoOUhuZXRlWTRzUEJsY0l4L0FsVEN2Ly9Zb1Q3Wnp3SXhBTVNObFB6Y1U5TGNuWGdXSHhVekkxTlM0MW94ClhaM0tycjBUS1VRTkoxdW81MmljRXZkWVB5NXlBbGVqajZFVUxnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPXRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMyBPPXRoYXd0ZSwgSW5jLiBPVT1DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uLyhjKSAyMDA4IHRoYXd0ZSwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgU3ViamVjdDogQ049dGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczIE89dGhhd3RlLCBJbmMuIE9VPUNlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24vKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBMYWJlbDogInRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMyIKIyBTZXJpYWw6IDEyNzYxNDE1NzA1NjY4MTI5OTgwNTU1NjQ3NjI3NTk5NTQxNDc3OQojIE1ENSBGaW5nZXJwcmludDogZmI6MWI6NWQ6NDM6OGE6OTQ6Y2Q6NDQ6YzY6NzY6ZjI6NDM6NGI6NDc6ZTc6MzEKIyBTSEExIEZpbmdlcnByaW50OiBmMTo4Yjo1Mzo4ZDoxYjplOTowMzpiNjphNjpmMDo1Njo0Mzo1YjoxNzoxNTo4OTpjYTpmMzo2YjpmMgojIFNIQTI1NiBGaW5nZXJwcmludDogNGI6MDM6ZjQ6NTg6MDc6YWQ6NzA6ZjI6MWI6ZmM6MmM6YWU6NzE6Yzk6ZmQ6ZTQ6NjA6NGM6MDY6NGM6ZjU6ZmY6YjY6ODY6YmE6ZTU6ZGI6YWE6ZDc6ZmQ6ZDM6NGMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVLakNDQXhLZ0F3SUJBZ0lRWUFHWHQwYW42clMwbXRaTEwvZVErekFOQmdrcWhraUc5dzBCQVFzRkFEQ0IKcmpFTE1Ba0dBMVVFQmhNQ1ZWTXhGVEFUQmdOVkJBb1RESFJvWVhkMFpTd2dTVzVqTGpFb01DWUdBMVVFQ3hNZgpRMlZ5ZEdsbWFXTmhkR2x2YmlCVFpYSjJhV05sY3lCRWFYWnBjMmx2YmpFNE1EWUdBMVVFQ3hNdktHTXBJREl3Ck1EZ2dkR2hoZDNSbExDQkpibU11SUMwZ1JtOXlJR0YxZEdodmNtbDZaV1FnZFhObElHOXViSGt4SkRBaUJnTlYKQkFNVEczUm9ZWGQwWlNCUWNtbHRZWEo1SUZKdmIzUWdRMEVnTFNCSE16QWVGdzB3T0RBME1ESXdNREF3TURCYQpGdzB6TnpFeU1ERXlNelU1TlRsYU1JR3VNUXN3Q1FZRFZRUUdFd0pWVXpFVk1CTUdBMVVFQ2hNTWRHaGhkM1JsCkxDQkpibU11TVNnd0pnWURWUVFMRXg5RFpYSjBhV1pwWTJGMGFXOXVJRk5sY25acFkyVnpJRVJwZG1semFXOXUKTVRnd05nWURWUVFMRXk4b1l5a2dNakF3T0NCMGFHRjNkR1VzSUVsdVl5NGdMU0JHYjNJZ1lYVjBhRzl5YVhwbApaQ0IxYzJVZ2IyNXNlVEVrTUNJR0ExVUVBeE1iZEdoaGQzUmxJRkJ5YVcxaGNua2dVbTl2ZENCRFFTQXRJRWN6Ck1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBc3I4bkxQdmIyRnZkZUhzYm5uZG0KZ2NzK3ZIeXU4NllubWpTamFERnhPRE5pNVBOeFpubXhxV1dqcFl2VmoyQXRQMExNcW1zeXdDUExMRUhkNU4vOApZWnppYzdJaWxSRkRHRi9FdGg5WGJBb0ZXQ0xJTmt3NmZLWFJ6NGF2aUtkRUFoTjBjWE1LUWxrQytCc1VhMExmCmIxKzZhNEtpblZ2blNyMGVBWExiUzNUb08zOS9mUjhFdENhYjRMUmFyRWM5VmJqWHNDWlNLQUV4UUdiWTJTUzkKOWlyWTdDRkpYSnYyZXVsL1ZUVitsbXVOazVNbnk1Szc2cXhBd0ovQytJRFBYZlJhM001MGhxWStiQXRUeXIyUwp6aGtHY3VZTVhEaHB4d1RXdkd6T1cvYjNhSnpjSlJWSWlLSHBxZmlZbk9EejFURW9ZUkZzWjVhTk9abkx3a1VrCk9RSURBUUFCbzBJd1FEQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BNEdBMVVkRHdFQi93UUVBd0lCQmpBZEJnTlYKSFE0RUZnUVVyV3lxbEdDYzdlVC8rajRLZEN0akEvZTJXYjh3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQUJwQQoySlZsckFtU2ljWTU5QkRscVE1bVUxMTQzdm9ra2J2blJGSGZ4aFkwQ3U5cVJGSHFLd2VLQTNyRDZ6OEtMRklXCm9DdER1U1dRUDNDcE15VnRSUm9vT3lmUHFzTXBRaHZmTzB6QU16UmJRWWkvYXl0bHJ5anZzdlhEcW1iT2UxYnUKdDhqTFo4SEpuQm9ZdU1URFNRUHhZQTVRelViRjgzZDU5N1lWNERqYnh5OG9vQXcvZHlaMDJTVVMyakhhR2g3YwpLVUdSSWp4cHA3c0M4clpjSndPSjlBYnFtK1J5Z3VPaENjSHBBQm5UUHRSd2E3cHhwcXBZcnZTNzZXeTI3NGZNCm03di9PZVpXWWRNS3A4UmNUR0I3QlhjbWVyL1lCMUlzWXZkd1k5azV2Rzhjd25uY2RpbXZ6c1VzWkFSZWlEWnUKTWRSQUdtSTBOajgxQWE2c1k2QT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMiBPPUdlb1RydXN0IEluYy4gT1U9KGMpIDIwMDcgR2VvVHJ1c3QgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgU3ViamVjdDogQ049R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyIE89R2VvVHJ1c3QgSW5jLiBPVT0oYykgMjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBMYWJlbDogIkdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMiIKIyBTZXJpYWw6IDgwNjgyODYzMjAzMzgxMDY1NzgyMTc3OTA4NzUxNzk0NjE5MjQzCiMgTUQ1IEZpbmdlcnByaW50OiAwMTo1ZTpkODo2YjpiZDo2ZjozZDo4ZTphMTozMTpmODoxMjplMDo5ODo3Mzo2YQojIFNIQTEgRmluZ2VycHJpbnQ6IDhkOjE3Ojg0OmQ1OjM3OmYzOjAzOjdkOmVjOjcwOmZlOjU3OjhiOjUxOjlhOjk5OmU2OjEwOmQ3OmIwCiMgU0hBMjU2IEZpbmdlcnByaW50OiA1ZTpkYjo3YTpjNDozYjo4MjphMDo2YTo4Nzo2MTplODpkNzpiZTo0OTo3OTplYjpmMjo2MToxZjo3ZDpkNzo5YjpmOToxYzoxYzo2Yjo1Njo2YToyMTo5ZTpkNzo2NgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ3JqQ0NBaldnQXdJQkFnSVFQTEwwU0FvQTR2N3JKRHRlWUQ3RGF6QUtCZ2dxaGtqT1BRUURBekNCbURFTApNQWtHQTFVRUJoTUNWVk14RmpBVUJnTlZCQW9URFVkbGIxUnlkWE4wSUVsdVl5NHhPVEEzQmdOVkJBc1RNQ2hqCktTQXlNREEzSUVkbGIxUnlkWE4wSUVsdVl5NGdMU0JHYjNJZ1lYVjBhRzl5YVhwbFpDQjFjMlVnYjI1c2VURTIKTURRR0ExVUVBeE10UjJWdlZISjFjM1FnVUhKcGJXRnllU0JEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMAplU0F0SUVjeU1CNFhEVEEzTVRFd05UQXdNREF3TUZvWERUTTRNREV4T0RJek5UazFPVm93Z1pneEN6QUpCZ05WCkJBWVRBbFZUTVJZd0ZBWURWUVFLRXcxSFpXOVVjblZ6ZENCSmJtTXVNVGt3TndZRFZRUUxFekFvWXlrZ01qQXcKTnlCSFpXOVVjblZ6ZENCSmJtTXVJQzBnUm05eUlHRjFkR2h2Y21sNlpXUWdkWE5sSUc5dWJIa3hOakEwQmdOVgpCQU1UTFVkbGIxUnlkWE4wSUZCeWFXMWhjbmtnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa2dMU0JICk1qQjJNQkFHQnlxR1NNNDlBZ0VHQlN1QkJBQWlBMklBQkJXeDZQMERGVVBsck91SE54Rmk3OUtETmxKOVJWY0wKU28xN1ZEczZibDhWQXNCUXBzOGxMMzNLU0xqSFVHTWNLaUVJZkpvMjJBdiswU2JGV0RFd0tDWHpYVjJqdUxhbAp0Skx0YkN5ZjY5MURpYUk4UzBpUkhWRHNKdC9XWUM2OUlhTkNNRUF3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPCkJnTlZIUThCQWY4RUJBTUNBUVl3SFFZRFZSME9CQllFRkJWZk5WZFJWZnNsc3EwRGFmd0JvL3ErRVZYVk1Bb0cKQ0NxR1NNNDlCQU1EQTJjQU1HUUNNR1NXV2Fib0NkNkx1dnBhaUlqd0g1SFRScWp5U2t3Q1kvdHNYempiTGtHVApxUTdtbmR3eEhMS2dweGdjZWVISE5nSXdPbGF2bW5Sczl2dUQ0RFBUQ0YraG5NSmJuMGJXdHN1UkJtT2lCdWN6CnJENm9nUkxReTdyUWtndTJucGFxQkErSwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049VmVyaVNpZ24gVW5pdmVyc2FsIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1WZXJpU2lnbiwgSW5jLiBPVT1WZXJpU2lnbiBUcnVzdCBOZXR3b3JrLyhjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBTdWJqZWN0OiBDTj1WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPVZlcmlTaWduLCBJbmMuIE9VPVZlcmlTaWduIFRydXN0IE5ldHdvcmsvKGMpIDIwMDggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIExhYmVsOiAiVmVyaVNpZ24gVW5pdmVyc2FsIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkiCiMgU2VyaWFsOiA4NTIwOTU3NDczNDA4NDU4MTkxNzc2Mzc1MjY0NDAzMTcyNjg3NwojIE1ENSBGaW5nZXJwcmludDogOGU6YWQ6YjU6MDE6YWE6NGQ6ODE6ZTQ6OGM6MWQ6ZDE6ZTE6MTQ6MDA6OTU6MTkKIyBTSEExIEZpbmdlcnByaW50OiAzNjo3OTpjYTozNTo2Njo4Nzo3MjozMDo0ZDozMDphNTpmYjo4NzozYjowZjphNzo3YjpiNzowZDo1NAojIFNIQTI1NiBGaW5nZXJwcmludDogMjM6OTk6NTY6MTE6Mjc6YTU6NzE6MjU6ZGU6OGM6ZWY6ZWE6NjE6MGQ6ZGY6MmY6YTA6Nzg6YjU6Yzg6MDY6N2Y6NGU6ODI6ODI6OTA6YmY6Yjg6NjA6ZTg6NGI6M2MKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUV1VENDQTZHZ0F3SUJBZ0lRUUJyRVpDR3pFeUVERHJ2a0VockZIVEFOQmdrcWhraUc5dzBCQVFzRkFEQ0IKdlRFTE1Ba0dBMVVFQmhNQ1ZWTXhGekFWQmdOVkJBb1REbFpsY21sVGFXZHVMQ0JKYm1NdU1SOHdIUVlEVlFRTApFeFpXWlhKcFUybG5iaUJVY25WemRDQk9aWFIzYjNKck1Ub3dPQVlEVlFRTEV6RW9ZeWtnTWpBd09DQldaWEpwClUybG5iaXdnU1c1akxpQXRJRVp2Y2lCaGRYUm9iM0pwZW1Wa0lIVnpaU0J2Ym14NU1UZ3dOZ1lEVlFRREV5OVcKWlhKcFUybG5iaUJWYm1sMlpYSnpZV3dnVW05dmRDQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVRBZQpGdzB3T0RBME1ESXdNREF3TURCYUZ3MHpOekV5TURFeU16VTVOVGxhTUlHOU1Rc3dDUVlEVlFRR0V3SlZVekVYCk1CVUdBMVVFQ2hNT1ZtVnlhVk5wWjI0c0lFbHVZeTR4SHpBZEJnTlZCQXNURmxabGNtbFRhV2R1SUZSeWRYTjAKSUU1bGRIZHZjbXN4T2pBNEJnTlZCQXNUTVNoaktTQXlNREE0SUZabGNtbFRhV2R1TENCSmJtTXVJQzBnUm05eQpJR0YxZEdodmNtbDZaV1FnZFhObElHOXViSGt4T0RBMkJnTlZCQU1UTDFabGNtbFRhV2R1SUZWdWFYWmxjbk5oCmJDQlNiMjkwSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUYKQUFPQ0FROEFNSUlCQ2dLQ0FRRUF4MkUzWHJFQk5OdGkxeFdiLzFoYWpDTWoxbUNPa2RlUW1JTjY1bGdaT0l6Rgo5dVZraGJTaWNmdnR2Ym5helUwQXRNZ3RjNlhIYVhHVkh6azhza1FIbk9nTytrMUt4Q0hmS1dHUE1pSmhnc1dICkgyNk1mRjhXSUZGRTBYQlBWK3JqSE9QTWVlNVkyQTdDczBXVHdDem5taGNyZXdBM2VrRXplT0V6NHZNUUduK0gKTEw3MjlmZEM0dVcvaDJLSlh3QkwzOFhkNUhWRU1rRTZIbkZ1YWNzTGRVWUkwY3JTSzVYUXovdTVRR3RrakZkTgovQk1SZVlUdFhsVDJOSjhJQWZNUUpRWVhTdHJ4SFhwbWE1aGdacVRaNzlJdWd2SHc3d25xUk1rVmF1SURialBUCnJKOVZBTWYyQ0dxVXVWL2M0RFB4aEdENVd5Y1J0UHdXOHJ0V2FvQWxqUUlEQVFBQm80R3lNSUd2TUE4R0ExVWQKRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUURBZ0VHTUcwR0NDc0dBUVVGQndFTUJHRXdYNkZkb0ZzdwpXVEJYTUZVV0NXbHRZV2RsTDJkcFpqQWhNQjh3QndZRkt3NERBaG9FRkkvbDB4cUdySTJPYThQUGdHclVTQmdzCmV4a3VNQ1VXSTJoMGRIQTZMeTlzYjJkdkxuWmxjbWx6YVdkdUxtTnZiUzkyYzJ4dloyOHVaMmxtTUIwR0ExVWQKRGdRV0JCUzJkL3BwU0VlZlV4TFZ3dW9ITW5ZSDBaY0hHVEFOQmdrcWhraUc5dzBCQVFzRkFBT0NBUUVBU3ZqNApzQVBtTEdkNzVKUjNZOHh1VFBsOURnM2N5TGsxdVhCUFkvb2srbXlEakVlZE8yUHptdmwyTXBXUnNYZThySnErCnNlUXhJY2FCbFZaYURySEMxTEdtV2F6eFk4dTRUQjFaa0VydmtCWW9IMXF1RVB1QlVEZ01iTXp4UGNQMVkrT3oKNHlISkpEbnAvUlZtUnZRYkVkQk5jNk45UnZrOTdhaGZZdFR4UC9qZ2RGY3JHSjJCdE1RbzJwU1hwWERyckIyKwpCeEh3MWR2ZDVZencxVEt3ZytaWDRvKy92cUdxdnowZHRkUTQ2dGV3WERwUGFqK1B3R1pzWTZycDJhUVc5SUhSCmxSUU9mYzJWTk5uU2ozQnpnWHVjZnIyWVlkaEZoNWlReGV1R01NWTF2L0QvdzFXSWcwdnZCWklHY2ZLNG1KTzMKN00yQ1lmRTQ1aytYbUNwYWpRPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHNCBPPVZlcmlTaWduLCBJbmMuIE9VPVZlcmlTaWduIFRydXN0IE5ldHdvcmsvKGMpIDIwMDcgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIFN1YmplY3Q6IENOPVZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHNCBPPVZlcmlTaWduLCBJbmMuIE9VPVZlcmlTaWduIFRydXN0IE5ldHdvcmsvKGMpIDIwMDcgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIExhYmVsOiAiVmVyaVNpZ24gQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc0IgojIFNlcmlhbDogNjMxNDM0ODQzNDgxNTM1MDY2NjUzMTE5ODU1MDE0NTg2NDAwNTEKIyBNRDUgRmluZ2VycHJpbnQ6IDNhOjUyOmUxOmU3OmZkOjZmOjNhOmUzOjZmOmYzOjZmOjk5OjFiOmY5OjIyOjQxCiMgU0hBMSBGaW5nZXJwcmludDogMjI6ZDU6ZDg6ZGY6OGY6MDI6MzE6ZDE6OGQ6Zjc6OWQ6Yjc6Y2Y6OGE6MmQ6NjQ6Yzk6M2Y6NmM6M2EKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDY5OmRkOmQ3OmVhOjkwOmJiOjU3OmM5OjNlOjEzOjVkOmM4OjVlOmE2OmZjOmQ1OjQ4OjBiOjYwOjMyOjM5OmJkOmM0OjU0OmZjOjc1OjhiOjJhOjI2OmNmOjdmOjc5Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEaERDQ0F3cWdBd0lCQWdJUUw0RCtJNHdPSWc5SVp4SW9rWWVzc3pBS0JnZ3Foa2pPUFFRREF6Q0J5akVMCk1Ba0dBMVVFQmhNQ1ZWTXhGekFWQmdOVkJBb1REbFpsY21sVGFXZHVMQ0JKYm1NdU1SOHdIUVlEVlFRTEV4WlcKWlhKcFUybG5iaUJVY25WemRDQk9aWFIzYjNKck1Ub3dPQVlEVlFRTEV6RW9ZeWtnTWpBd055QldaWEpwVTJsbgpiaXdnU1c1akxpQXRJRVp2Y2lCaGRYUm9iM0pwZW1Wa0lIVnpaU0J2Ym14NU1VVXdRd1lEVlFRREV6eFdaWEpwClUybG5iaUJEYkdGemN5QXpJRkIxWW14cFl5QlFjbWx0WVhKNUlFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXkKYVhSNUlDMGdSelF3SGhjTk1EY3hNVEExTURBd01EQXdXaGNOTXpnd01URTRNak0xT1RVNVdqQ0J5akVMTUFrRwpBMVVFQmhNQ1ZWTXhGekFWQmdOVkJBb1REbFpsY21sVGFXZHVMQ0JKYm1NdU1SOHdIUVlEVlFRTEV4WldaWEpwClUybG5iaUJVY25WemRDQk9aWFIzYjNKck1Ub3dPQVlEVlFRTEV6RW9ZeWtnTWpBd055QldaWEpwVTJsbmJpd2cKU1c1akxpQXRJRVp2Y2lCaGRYUm9iM0pwZW1Wa0lIVnpaU0J2Ym14NU1VVXdRd1lEVlFRREV6eFdaWEpwVTJsbgpiaUJEYkdGemN5QXpJRkIxWW14cFl5QlFjbWx0WVhKNUlFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1CklDMGdSelF3ZGpBUUJnY3Foa2pPUFFJQkJnVXJnUVFBSWdOaUFBU25WbnA4VXRwa213NHRYTmhlckpJOS9nSG0KR1VvOUZBTkwrbUFuSU5tRGlXbjZWTWFhR0Y1VkttVGVCdmFOU2p1dEVEeGxQWkNJQkluZ01HR3pybDBCcDN2ZQpmTEsreW1WaEFJYXUybzk3MEltdFRSMVpta0d4dkVlQTNKNWl3L21qZ2JJd2dhOHdEd1lEVlIwVEFRSC9CQVV3CkF3RUIvekFPQmdOVkhROEJBZjhFQkFNQ0FRWXdiUVlJS3dZQkJRVUhBUXdFWVRCZm9WMmdXekJaTUZjd1ZSWUoKYVcxaFoyVXZaMmxtTUNFd0h6QUhCZ1VyRGdNQ0dnUVVqK1hUR29hc2pZNXJ3OCtBYXRSSUdDeDdHUzR3SlJZagphSFIwY0RvdkwyeHZaMjh1ZG1WeWFYTnBaMjR1WTI5dEwzWnpiRzluYnk1bmFXWXdIUVlEVlIwT0JCWUVGTE1XCmtmM3VwbTdrdFM1Smo0ZDRnWURzNWJHMU1Bb0dDQ3FHU000OUJBTURBMmdBTUdVQ01HWWhEQmdtWUZvNGUxWkMKNEtmOE5vUlJrU0FzZGsxRFBjUWRoQ1BRck5aOE5RYk96V205a0EzYmJFaENIUTZxUWdJeEFKdzlTRGtqT1ZnYQpGUkpaYXA3djFWbXlIVklzbVhITnh5bmZHeXBoZTNIUjN2UEE1UTA2U3FvdHA5aUdLdDB1RUE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049TmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRlx1MDE1MXRhblx4ZmFzXHhlZHR2XHhlMW55IE89TmV0TG9jayBLZnQuIE9VPVRhblx4ZmFzXHhlZHR2XHhlMW55a2lhZFx4ZjNrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKQojIFN1YmplY3Q6IENOPU5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEZcdTAxNTF0YW5ceGZhc1x4ZWR0dlx4ZTFueSBPPU5ldExvY2sgS2Z0LiBPVT1UYW5ceGZhc1x4ZWR0dlx4ZTFueWtpYWRceGYzayAoQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcykKIyBMYWJlbDogIk5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEZcdTAxNTF0YW5ceGZhc1x4ZWR0dlx4ZTFueSIKIyBTZXJpYWw6IDgwNTQ0Mjc0ODQxNjE2CiMgTUQ1IEZpbmdlcnByaW50OiBjNTphMTpiNzpmZjo3MzpkZDpkNjpkNzozNDozMjoxODpkZjpmYzozYzphZDo4OAojIFNIQTEgRmluZ2VycHJpbnQ6IDA2OjA4OjNmOjU5OjNmOjE1OmExOjA0OmEwOjY5OmE0OjZiOmE5OjAzOmQwOjA2OmI3Ojk3OjA5OjkxCiMgU0hBMjU2IEZpbmdlcnByaW50OiA2Yzo2MTpkYTpjMzphMjpkZTpmMDozMTo1MDo2YjplMDozNjpkMjphNjpmZTo0MDoxOTo5NDpmYjpkMTozZDpmOTpjODpkNDo2Njo1OTo5Mjo3NDpjNDo0NjplYzo5OAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRUZUQ0NBdjJnQXdJQkFnSUdTVUVzNUFBUU1BMEdDU3FHU0liM0RRRUJDd1VBTUlHbk1Rc3dDUVlEVlFRRwpFd0pJVlRFUk1BOEdBMVVFQnd3SVFuVmtZWEJsYzNReEZUQVRCZ05WQkFvTURFNWxkRXh2WTJzZ1MyWjBMakUzCk1EVUdBMVVFQ3d3dVZHRnV3N3B6dzYxMGRzT2hibmxyYVdGa3c3TnJJQ2hEWlhKMGFXWnBZMkYwYVc5dUlGTmwKY25acFkyVnpLVEUxTURNR0ExVUVBd3dzVG1WMFRHOWpheUJCY21GdWVTQW9RMnhoYzNNZ1IyOXNaQ2tnUnNXUgpkR0Z1dzdwenc2MTBkc09oYm5rd0hoY05NRGd4TWpFeE1UVXdPREl4V2hjTk1qZ3hNakEyTVRVd09ESXhXakNCCnB6RUxNQWtHQTFVRUJoTUNTRlV4RVRBUEJnTlZCQWNNQ0VKMVpHRndaWE4wTVJVd0V3WURWUVFLREF4T1pYUk0KYjJOcklFdG1kQzR4TnpBMUJnTlZCQXNNTGxSaGJzTzZjOE90ZEhiRG9XNTVhMmxoWk1PemF5QW9RMlZ5ZEdsbQphV05oZEdsdmJpQlRaWEoyYVdObGN5a3hOVEF6QmdOVkJBTU1MRTVsZEV4dlkyc2dRWEpoYm5rZ0tFTnNZWE56CklFZHZiR1FwSUViRmtYUmhic082YzhPdGRIYkRvVzU1TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEEKTUlJQkNnS0NBUUVBeENSZWM3NUxiUlREb2ZUamw1QnUwakJGSGp6dVo5bGs0QnFLZjhvd3lvUGpJTUhqOURyVApsRjhhZkZ0dHZ6QlBoQ2Yybng5SnZNYVpDcER5RC9WL1E0UTNZMUdMZXFWdy9IcFl6WTZiN2NOR2JJUndYZHJ6CkFaQWovRTR3cVg3aEoyUG43V1E4b0xqSk0yUCtGcEQvc0xqOTE2akF3SlJEQzdiVldhYWVWdEFrSDNCNXI5czUKVkExbGRka1ZRWlFCcjE3czlvM3gvNjFrL2lDYTExenIvcVlmQ0dTamkzWlZyUjQ3S0dBdWh5WG9xcThmeG1SRwpJTGR3Znp6ZVNOdVdVN2M1ZCtRYTRzY1doSGFYV3krN0dSV0YrR21GOVptbnFmSTBwNm0ycGdQOGI0WTlWSHgyCkJKdHIrVUJkQURUSExwbDFuZVdJQTZwTitBUFNRbmJBR3dJREFLaUxvMFV3UXpBU0JnTlZIUk1CQWY4RUNEQUcKQVFIL0FnRUVNQTRHQTFVZER3RUIvd1FFQXdJQkJqQWRCZ05WSFE0RUZnUVV6UHBuay9DMnVOQ2x3Qjd6VS8yTQpVOStEMTVZd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFLdC83aHdXcVp3OFVRQ2d3QkVJQmFlWjVtOEJpRlJoCmJ2RzVHSzFLcmY2QlFDT1VML3QxZkM4b1MySWtnWUlMOVdIeEhHNjRZVGpyZ2ZwaW9UdGFZdE9VWmNUaDVtMkMKK0M4bGNMSWhKc0Z5VVIrTUxNT0VrTU5hajdyUDlLZGxwZXVZMGZzRnNrWjFGU05xYjRWak1JRHcxWjRmS1J6QwpiTEJRV1YyUVd6dW9EVERQdjMxL3p2R2RnNzNKUm00Z3B2bGhVYm9oTDN1K3BSVmpvZFNWaC9HZXVmT0o4ejJGCnVMamJ2clc1S2ZuYU53VUFTWlFEaEVUbnYwTXh6M1dMSmRIMHBtVDFrdmFyQmVzOTZhVUxObUxhekFaZk5vdTIKWGpHNEt2dGU5bkhmUkNhZXhPWU5rYlF1ZFpXQVVXcExNS2F3WXFHVDhadll6c1JqZFQ5WlI3RT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVN0YWF0IGRlciBOZWRlcmxhbmRlbiBSb290IENBIC0gRzIgTz1TdGFhdCBkZXIgTmVkZXJsYW5kZW4KIyBTdWJqZWN0OiBDTj1TdGFhdCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEcyIE89U3RhYXQgZGVyIE5lZGVybGFuZGVuCiMgTGFiZWw6ICJTdGFhdCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEcyIgojIFNlcmlhbDogMTAwMDAwMTIKIyBNRDUgRmluZ2VycHJpbnQ6IDdjOmE1OjBmOmY4OjViOjlhOjdkOjZkOjMwOmFlOjU0OjVhOmUzOjQyOmEyOjhhCiMgU0hBMSBGaW5nZXJwcmludDogNTk6YWY6ODI6Nzk6OTE6ODY6Yzc6YjQ6NzU6MDc6Y2I6Y2Y6MDM6NTc6NDY6ZWI6MDQ6ZGQ6Yjc6MTYKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDY2OjhjOjgzOjk0OjdkOmE2OjNiOjcyOjRiOmVjOmUxOjc0OjNjOjMxOmEwOmU2OmFlOmQwOmRiOjhlOmM1OmIzOjFiOmUzOjc3OmJiOjc4OjRmOjkxOmI2OjcxOjZmCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGeWpDQ0E3S2dBd0lCQWdJRUFKaVdqREFOQmdrcWhraUc5dzBCQVFzRkFEQmFNUXN3Q1FZRFZRUUdFd0pPClRERWVNQndHQTFVRUNnd1ZVM1JoWVhRZ1pHVnlJRTVsWkdWeWJHRnVaR1Z1TVNzd0tRWURWUVFERENKVGRHRmgKZENCa1pYSWdUbVZrWlhKc1lXNWtaVzRnVW05dmRDQkRRU0F0SUVjeU1CNFhEVEE0TURNeU5qRXhNVGd4TjFvWApEVEl3TURNeU5URXhNRE14TUZvd1dqRUxNQWtHQTFVRUJoTUNUa3d4SGpBY0JnTlZCQW9NRlZOMFlXRjBJR1JsCmNpQk9aV1JsY214aGJtUmxiakVyTUNrR0ExVUVBd3dpVTNSaFlYUWdaR1Z5SUU1bFpHVnliR0Z1WkdWdUlGSnYKYjNRZ1EwRWdMU0JITWpDQ0FpSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUJBTVZaNTI5MQpxajVMbkxXNHJKNEw1UG5aeXF0ZGo3VTVFSUxYcjFIZ08rRUFTR3JQMnVFR1F4R1pxaFFsRXEwaTZBQnRROFNwCnVPVWZpVXRudldGSTcvM1M0R0NJNWJrWVlDakRkeXV0c0RlcU45NWtXU3BHVitSTHVmZzNmTlUyNTREQnR2UFUKWjV1VzZNN1h4Z3BUMEd0Smx2T2pDd1YzU1BjbDVYQ3NNQlFnSmVOL2RWcmxTUGhPZXdNSEJQcUNZWWR1OER2RQpwTWZROVhRK3BWMGFDUEtiSmRMMnJBUW1QbFU2WWlpbGU3SXdyL2czd3RHNjFqajk5TzlKTURlWkppRkloUUdwCjVSYm4zSkJWM3cvb09NMlpOeUZQWGZVaWIyckZFaFpnRjFYeVpXYW1wekNST01FNEhZWUVoTG9hSlhoZW5hL00KVUdEV0U0ZFM3V01mYldWOXdoVVlkTXJoZm1RcGpITFlGaE45QzBsSzhTZ2JJSFJyeFQzZHNLcElDVDB1Z3BUTgpHbVhaSzRpYW1id1lmcC91ZldaOFByMlV1SUhPelpnd2VNRnZaOUMrWCtCbzdkN2lzY2tzV1hpU3F0OHJZR1B5CjVWNjU0OHI2ZjFDR1BxSTBHQXdKYUNnUkhPVGh1VncrUjdveVB4ak1XNFQxODJ0MHhISjA0ZU9Mb0VxOWpXWXYKNnEwMTJpRFRpSUpoOEJJaXRyelExYVRzcjFTSUpTUThwMjJ4Y2lrL1BsZW1mMVd2YmliRy91Zk1RRnhSUklFSwplTjVLemxXL0hkWFp0MWJ2OEhiL0MzbTFyNzM3cVdtUlJwZG9nQlEySGJOL3V5bVlOcVVnK29KZ1lqT2s3TmE2CkI2ZHV4YzhVcHVmV2tqVFlnZlg4SFYycVhCNzJvMDA3dVBjNUFnTUJBQUdqZ1pjd2daUXdEd1lEVlIwVEFRSC8KQkFVd0F3RUIvekJTQmdOVkhTQUVTekJKTUVjR0JGVWRJQUF3UHpBOUJnZ3JCZ0VGQlFjQ0FSWXhhSFIwY0RvdgpMM2QzZHk1d2EybHZkbVZ5YUdWcFpDNXViQzl3YjJ4cFkybGxjeTl5YjI5MExYQnZiR2xqZVMxSE1qQU9CZ05WCkhROEJBZjhFQkFNQ0FRWXdIUVlEVlIwT0JCWUVGSkZvTW9jVkhZbml0ZkdzTmlnMGpRdDhZb2pyTUEwR0NTcUcKU0liM0RRRUJDd1VBQTRJQ0FRQ29RVXBuS3BLQmdsQnU0ZGZZc3prNzh3SVZDVkJSN3kyOUpIdUloanY1dEx5UwpDWmE1OXNDckkyQUdlWXdSVGxIU2VZQXorNTFJdnV4QlE0RWZma2RBSE9WNkNNcXFpM1d0Rk1UQzZHWThnZ2VuCjVpZUNXeGptRDI3WlVENktRaGdweHJSVy9GWVFvQVVYdlF3amYvU1Q3WndhVWI3ZFJVRy9rU1MwSDR6cFg4OTcKSVptZmxaODVPa1ljYlBuTmU1eVF6U2lweDZsVnU2eGlOR0kxRTBzVU9sV0R1WWFOa3FiRzlBY2xWTXdXVnhKSwpnbmpJRk5rWGdpWXRYU0FmZWE3KzFIQVdGcFdEMkRVNS8xSmRkUndXeFJOVnowZk1kV1ZTU3Q3d3NLZmtDcFlMCis2M0M0aVdFc3Qza3ZYNVpiSnZ3OE5qbnl2THBsemgraWI3TSt6a1hZVDl5MnpxUjJHVUJHUjJ0VUtSWENueEwKdkp4eGN5cEZVUm1Gekk3OVI2ZDBsUjJvMGE5T0Y3RnBKc0txZUZkYnhVMm41WjRGRjVUS3NsK2dTUmlOTk9rbQpiRWdlcW1pU0JlR0NjMXFiM0FkYkNHMTluZGVOSWRuOEZDQ3F3a1hmUCtjQXNsSGt3dmdGdVhrYWpEVHpubHZrCk4xdHJTdDhzVjRwQVdqYTYzWFZFQ0RkQ2NBeiszRjRob0tPS3dKQ2NhTnBRNWtVUVIzaTJUdEpseWNNMzMrRkMKWTdCWE4wVXRlNHFjdndYcVpWVXo5emtReFNncUlYb2Jpc1FrK1Q4VnlKb1ZJUFZWWXBidGJaTlF2T1NxZUszWgp5d3BsaDZabXdjU0JvM2M2V0I0TDdvT0xuUjdTVXFUTUhXK3dtRzJVTWJYNGNRcmN1Zng5TW1EbTY2K0tBUT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1Ib25na29uZyBQb3N0IFJvb3QgQ0EgMSBPPUhvbmdrb25nIFBvc3QKIyBTdWJqZWN0OiBDTj1Ib25na29uZyBQb3N0IFJvb3QgQ0EgMSBPPUhvbmdrb25nIFBvc3QKIyBMYWJlbDogIkhvbmdrb25nIFBvc3QgUm9vdCBDQSAxIgojIFNlcmlhbDogMTAwMAojIE1ENSBGaW5nZXJwcmludDogYTg6MGQ6NmY6Mzk6Nzg6Yjk6NDM6NmQ6Nzc6NDI6NmQ6OTg6NWE6Y2M6MjM6Y2EKIyBTSEExIEZpbmdlcnByaW50OiBkNjpkYTphODoyMDo4ZDowOTpkMjoxNTo0ZDoyNDpiNToyZjpjYjozNDo2ZTpiMjo1ODpiMjo4YTo1OAojIFNIQTI1NiBGaW5nZXJwcmludDogZjk6ZTY6N2Q6MzM6NmM6NTE6MDA6MmE6YzA6NTQ6YzY6MzI6MDI6MmQ6NjY6ZGQ6YTI6ZTc6ZTM6ZmY6ZjE6MGE6ZDA6NjE6ZWQ6MzE6ZDg6YmI6YjQ6MTA6Y2Y6YjIKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURNRENDQWhpZ0F3SUJBZ0lDQStnd0RRWUpLb1pJaHZjTkFRRUZCUUF3UnpFTE1Ba0dBMVVFQmhNQ1NFc3gKRmpBVUJnTlZCQW9URFVodmJtZHJiMjVuSUZCdmMzUXhJREFlQmdOVkJBTVRGMGh2Ym1kcmIyNW5JRkJ2YzNRZwpVbTl2ZENCRFFTQXhNQjRYRFRBek1EVXhOVEExTVRNeE5Gb1hEVEl6TURVeE5UQTBOVEl5T1Zvd1J6RUxNQWtHCkExVUVCaE1DU0VzeEZqQVVCZ05WQkFvVERVaHZibWRyYjI1bklGQnZjM1F4SURBZUJnTlZCQU1URjBodmJtZHIKYjI1bklGQnZjM1FnVW05dmRDQkRRU0F4TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQwpBUUVBclA4NHR1bG1Ba25qb3JUaGtQbEFqM241NHIxNS9nSzk3aVNTSFNMMjJvVnlhZjdYUHduVTNaRzFBcHpRCmpWcmhWY05RaHJrcEpzTGoyYUR4YVFNb0lJQkZJaTFXcHp0VWxWWWlXUjhvM3g4Z1BXMmlOcjRqb0xGdXRiRW4KUHpsVENlcXJhdWgwc3NKbFhJNi9mTU40aE0yZUZ2ejFMazhnS2dpZmQvUEZIc1NhVW1ZZVNGN2pFQWFQSXBqaApaWTRiWFNObU83aWxNbEhJaHFxaHFaNS9kcFRDcG15M1FmRFZ5QVk0NXRRTTR2TTdURzFRak1TREo4RVRoRms5Cm5uVjB0dGdDWGpxUWVzQkNObkxzYWszYzc4UUEzeE1ZVjE4bWVNaldDbmwzdi9ldnQzYTVwUXVFRjEwUTZtL2gKcTVVUlgyMDhvMXhOZzF2eXN4bUtnSXNMaHdJREFRQUJveVl3SkRBU0JnTlZIUk1CQWY4RUNEQUdBUUgvQWdFRApNQTRHQTFVZER3RUIvd1FFQXdJQnhqQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFEa2JWUEs3aWg5bGVnWXNDCm1FRUlqRXk4MnR2dUp4dUM1MnBGN0JhTFQ0V2c4N0p3dlZxV3VzcHViZTVHaTI3bktpNldzeGt6NjdTZnFMSTMKN3Bpb2w3WXV0bWNuMUtaSi9SeVRaWGFlUWkvY0lteWFUL0phRlRteGNkY3JVZWh0SEpqQTJTcjBvWUo3MWNsQgpvaU1CZERoVml3KzVMbWVpSUFRMzJwd0wweGNoNEkrWGVUUnZoRWdDSURNYjVqUkVuNUZ3OUlCZWhFUENLZEpzCkVoVGtZWTJzRUpDZWhGQzc4Slp2UlorSzg4cHNUL29ST2hVVlJzUE5INE5iTFVFUzdWQm5RUk05SWF1VWlxcE8KZk1HeCs2Zld0U2N2bDZ0dTRCM2kwUndzSDBUaS9MNlJvWno3MWlsVGM0YWZVOWhERGwzV1k0SnhIWUIweXZiaQpBbXZaV2c9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049U2VjdXJlU2lnbiBSb290Q0ExMSBPPUphcGFuIENlcnRpZmljYXRpb24gU2VydmljZXMsIEluYy4KIyBTdWJqZWN0OiBDTj1TZWN1cmVTaWduIFJvb3RDQTExIE89SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLgojIExhYmVsOiAiU2VjdXJlU2lnbiBSb290Q0ExMSIKIyBTZXJpYWw6IDEKIyBNRDUgRmluZ2VycHJpbnQ6IGI3OjUyOjc0OmUyOjkyOmI0OjgwOjkzOmYyOjc1OmU0OmNjOmQ3OmYyOmVhOjI2CiMgU0hBMSBGaW5nZXJwcmludDogM2I6YzQ6OWY6NDg6Zjg6ZjM6NzM6YTA6OWM6MWU6YmQ6Zjg6NWI6YjE6YzM6NjU6Yzc6ZDg6MTE6YjMKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGJmOjBmOmVlOmZiOjllOjNhOjU4OjFhOmQ1OmY5OmU5OmRiOjc1Ojg5Ojk4OjU3OjQzOmQyOjYxOjA4OjVjOjRkOjMxOjRmOjZmOjVkOjcyOjU5OmFhOjQyOjE2OjEyCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEYlRDQ0FsV2dBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURCWU1Rc3dDUVlEVlFRR0V3SktVREVyCk1Da0dBMVVFQ2hNaVNtRndZVzRnUTJWeWRHbG1hV05oZEdsdmJpQlRaWEoyYVdObGN5d2dTVzVqTGpFY01Cb0cKQTFVRUF4TVRVMlZqZFhKbFUybG5iaUJTYjI5MFEwRXhNVEFlRncwd09UQTBNRGd3TkRVMk5EZGFGdzB5T1RBMApNRGd3TkRVMk5EZGFNRmd4Q3pBSkJnTlZCQVlUQWtwUU1Tc3dLUVlEVlFRS0V5SktZWEJoYmlCRFpYSjBhV1pwClkyRjBhVzl1SUZObGNuWnBZMlZ6TENCSmJtTXVNUnd3R2dZRFZRUURFeE5UWldOMWNtVlRhV2R1SUZKdmIzUkQKUVRFeE1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBL1hlcXBSeVFCVHZMVEpzegppMW9VUmFUbmtCYlIzMWZTSVJDa0YvM2ZyTllmcCtUYmZQZnMzN2dEMnBSWS9WMXlmSXcvWHdGbmRCV1c0d0k4Cmg5dXV5d0dPd3ZObXhvVkY5QUxHT3JWaXNxLzZuTCtrNXRTQU1KanpEYmFUajZuVTJEYnlzUHlLeWl5aEZUT1YKTWRyQUcvTHVZcG1HWXorLzNaTXFnNmgydVJNZnQ4NU9Rb1dQSXVjdUd2S1ZDYklGdFVST2Q2RWd2YW55VGdwOQpVSzMxQlExRlQwWngvU2crVS9zRTJDM1haUjFLRy9yUE83QXhtalZ1eUlzRzB3Q1I4cFFJWlV5eE5BWUFlb25pCjhNY0RXYy9WMXVpbk1yUG1tRUNHeGMwbkVvdk1lODYzRVR4aVlBY2pQaXRBYnBTQUNXMjJzMjkzYnpVSVVQc0MKaDhVK2lRSURBUUFCbzBJd1FEQWRCZ05WSFE0RUZnUVVXL2hOVDdLbGh0UTYwdkZqbXFDK0NmWlh0OTR3RGdZRApWUjBQQVFIL0JBUURBZ0VHTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCCkFLQ2hPQlptTHFkV0h5R2NCdm9kN2JraXhUZ20yRTVQN0tOL2VkNUdJYUdIZDQ4SENKcXlwTVd2RHpLWUMzeG0KS2JhYmZTVlNTVU9yVEM0cmJucHdyeFlPNHdKcyswTG1HSjFGMkZYSTZEdmQ1K0gwTGdzY05GeHNXRXI3akloUQpYNVVjdisycklyVmxzNFc2bmcrNHJlVjZHNHBRT2gyOURieDdWRkFMdVVLdlZhQVlnYTFsbWUrKzVKeS94SVdyClFiSlViOXdsemUxNDRvNE1qUWxKM1dON1dtbVdBaUdvdlZKWjZYMDF5OGhTeW4rQi90bHIwL2NSN1NYZitPZjUKcFBweWw0UlREYVhRTWhoUmRsa1ViQS9yN0YrQWpIVkRnOE9GbVA5TW5pME41SGVEazA2MWxnZUxLQk9iakJtTgpRU2RKUU83ZTVpTkVPZHloSXRhNkEvST0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOSBPPU1pY3Jvc2VjIEx0ZC4KIyBTdWJqZWN0OiBDTj1NaWNyb3NlYyBlLVN6aWdubyBSb290IENBIDIwMDkgTz1NaWNyb3NlYyBMdGQuCiMgTGFiZWw6ICJNaWNyb3NlYyBlLVN6aWdubyBSb290IENBIDIwMDkiCiMgU2VyaWFsOiAxNDAxNDcxMjc3NjE5NTc4NDQ3MwojIE1ENSBGaW5nZXJwcmludDogZjg6NDk6ZjQ6MDM6YmM6NDQ6MmQ6ODM6YmU6NDg6Njk6N2Q6Mjk6NjQ6ZmM6YjEKIyBTSEExIEZpbmdlcnByaW50OiA4OTpkZjo3NDpmZTo1YzpmNDowZjo0YTo4MDpmOTplMzozNzo3ZDo1NDpkYTo5MTplMTowMTozMTo4ZQojIFNIQTI1NiBGaW5nZXJwcmludDogM2M6NWY6ODE6ZmU6YTU6ZmE6Yjg6MmM6NjQ6YmY6YTI6ZWE6ZWM6YWY6Y2Q6ZTg6ZTA6Nzc6ZmM6ODY6MjA6YTc6Y2E6ZTU6Mzc6MTY6M2Q6ZjM6NmU6ZGI6ZjM6NzgKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVDakNDQXZLZ0F3SUJBZ0lKQU1KK1F3Uk9SejhaTUEwR0NTcUdTSWIzRFFFQkN3VUFNSUdDTVFzd0NRWUQKVlFRR0V3SklWVEVSTUE4R0ExVUVCd3dJUW5Wa1lYQmxjM1F4RmpBVUJnTlZCQW9NRFUxcFkzSnZjMlZqSUV4MApaQzR4SnpBbEJnTlZCQU1NSGsxcFkzSnZjMlZqSUdVdFUzcHBaMjV2SUZKdmIzUWdRMEVnTWpBd09URWZNQjBHCkNTcUdTSWIzRFFFSkFSWVFhVzVtYjBCbExYTjZhV2R1Ynk1b2RUQWVGdzB3T1RBMk1UWXhNVE13TVRoYUZ3MHkKT1RFeU16QXhNVE13TVRoYU1JR0NNUXN3Q1FZRFZRUUdFd0pJVlRFUk1BOEdBMVVFQnd3SVFuVmtZWEJsYzNReApGakFVQmdOVkJBb01EVTFwWTNKdmMyVmpJRXgwWkM0eEp6QWxCZ05WQkFNTUhrMXBZM0p2YzJWaklHVXRVM3BwCloyNXZJRkp2YjNRZ1EwRWdNakF3T1RFZk1CMEdDU3FHU0liM0RRRUpBUllRYVc1bWIwQmxMWE42YVdkdWJ5NW8KZFRDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBT240ai9OanJkcUcyS2ZnUXZ2UAprZDZtSnZpWnBXTndyWnV1eWpOQWZXMldicUVPUk83aEU1MlVRbEthdlhXRmRDeW9EaDJUdGhpM2pDeW96L3RjCmNibmE3UDdvZm8va0x4MnlxSFdIMkxlaDVUdlBtVXBHMElNWmZjQ2hFaHlWYlVyMDJNZWxUVE11aFRsQWRYNFUKZklBU21GREhRV2U0b0lCaFZLWnNUaC9nblE0SDZjbTZNK2Yrd0ZVb0xBS0FweG4xbnR4VlV3T1hld2RJLzVuNwpONG9reEZuTVVCQmpqcXFwR3JDRUdvYjVYN3V4VUc2azBRck0xWEYrSDZjYmZQVlRiaUpmeXl2bTFIeGRydGJDCnhremxCUUhaN1ZmOHdTTjUvUHJJSklPVjg3VnFVUUhRZDlicEVxSDVHb1A3Z2h1NXNKZjBkZ1l6UTBtZy93dTEKK3JVQ0F3RUFBYU9CZ0RCK01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUURBZ0VHTUIwRwpBMVVkRGdRV0JCVExEOGJmUWtQTVBjdTFTQ09oR25xbUtyczBhREFmQmdOVkhTTUVHREFXZ0JUTEQ4YmZRa1BNClBjdTFTQ09oR25xbUtyczBhREFiQmdOVkhSRUVGREFTZ1JCcGJtWnZRR1V0YzNwcFoyNXZMbWgxTUEwR0NTcUcKU0liM0RRRUJDd1VBQTRJQkFRREowUTVlTHRYTXMzdyt5L3c5L3cwb2xaTUV5TC9helhtNFE1RHdwTDd2OHU4aAptTHpVMUYwRzl1NUM3REJzb0txcHl2R3Zpdm8vQzNOcVB1b3VRSDRmcmxSaGVlc3VDRGZYSS9PTW43NGRzZUdrCmRkdWc0bFFVc2JvY0thUVk5aEs2b2hRVTR6RTF5RUQvdCtBRmRsZkJIRm55K0wvazdTVmlYSVR3Zm40ZnM3NzUKdHlFUnpBTUJWbkNuRUpJZUd6U0JIcTJjR3NNRVBPMENZZFllQnZOZk9vZnlLL0ZGaCtVOXJOSEhWNFM5YTY3YwoyUG0yRzJKd0N6MDJ5VUx5TXRkNlllYlMyejNQeUtuSm05emJXRVRYYnppdmYzalRvNjBhZGJvY3dUWjhqeDV0CkhNTjFScTQxQmFiMlhEMGg3bGJ3eVlJaUxYcFVxM0REZlNKbGduQ1cKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUdsb2JhbFNpZ24gTz1HbG9iYWxTaWduIE9VPUdsb2JhbFNpZ24gUm9vdCBDQSAtIFIzCiMgU3ViamVjdDogQ049R2xvYmFsU2lnbiBPPUdsb2JhbFNpZ24gT1U9R2xvYmFsU2lnbiBSb290IENBIC0gUjMKIyBMYWJlbDogIkdsb2JhbFNpZ24gUm9vdCBDQSAtIFIzIgojIFNlcmlhbDogNDgzNTcwMzI3ODQ1OTc1OTQyNjIwOTk1NAojIE1ENSBGaW5nZXJwcmludDogYzU6ZGY6Yjg6NDk6Y2E6MDU6MTM6NTU6ZWU6MmQ6YmE6MWE6YzM6M2U6YjA6MjgKIyBTSEExIEZpbmdlcnByaW50OiBkNjo5Yjo1NjoxMTo0ODpmMDoxYzo3NzpjNTo0NTo3ODpjMTowOToyNjpkZjo1Yjo4NTo2OTo3NjphZAojIFNIQTI1NiBGaW5nZXJwcmludDogY2I6YjU6MjI6ZDc6Yjc6ZjE6Mjc6YWQ6NmE6MDE6MTM6ODY6NWI6ZGY6MWM6ZDQ6MTA6MmU6N2Q6MDc6NTk6YWY6NjM6NWE6N2M6ZjQ6NzI6MGQ6Yzk6NjM6YzU6M2IKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURYekNDQWtlZ0F3SUJBZ0lMQkFBQUFBQUJJVmhUQ0tJd0RRWUpLb1pJaHZjTkFRRUxCUUF3VERFZ01CNEcKQTFVRUN4TVhSMnh2WW1Gc1UybG5iaUJTYjI5MElFTkJJQzBnVWpNeEV6QVJCZ05WQkFvVENrZHNiMkpoYkZOcApaMjR4RXpBUkJnTlZCQU1UQ2tkc2IySmhiRk5wWjI0d0hoY05NRGt3TXpFNE1UQXdNREF3V2hjTk1qa3dNekU0Ck1UQXdNREF3V2pCTU1TQXdIZ1lEVlFRTEV4ZEhiRzlpWVd4VGFXZHVJRkp2YjNRZ1EwRWdMU0JTTXpFVE1CRUcKQTFVRUNoTUtSMnh2WW1Gc1UybG5iakVUTUJFR0ExVUVBeE1LUjJ4dlltRnNVMmxuYmpDQ0FTSXdEUVlKS29aSQpodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQU13bGRwQjVCbmdpRnZYQWc3YUV5aWllL1FWMkVjV3RpSEw4ClJnSkR4N0tLblFSZkpNc3VTK0ZnZ2tiaFVxc01nVWR3Yk4xazBldjFMS01QZ2owTUs2NlgxN1lVaGhCNXV6c1QKZ0hlTUNPRkowbXBpTHg5ZStwWm8zNGtubFRpZkJ0Yyt5Y3NtV1ExejNyREk2U1lPZ3hYRzcxdUwwZ1JneWttbQpLUFpwTy9iTHlDaVI1WjJLWVZjM3JIUVUzSFRnT3U1eUx5NmMrOUM3di9VOUFPRUdNK2lDSzY1VHBqb1djNHpkClFRNGdPc0MwcDZIcHNrK1FMakpnNlZmTHVRU1NhR2psT0NaZ2RiS2ZkLytSRk8rdUlFbjhyVUFWU05FQ01XRVoKWHJpWDc2MTN0MlNhZXI5ZndSUHZtMkw3RFd6Z1ZHa1dxUVBhYnVtRGszRjJ4bW1GZ2hjQ0F3RUFBYU5DTUVBdwpEZ1lEVlIwUEFRSC9CQVFEQWdFR01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZJL3dTMytvCkxrVWtyazFRK21PYWk5N2kzUnU4TUEwR0NTcUdTSWIzRFFFQkN3VUFBNElCQVFCTFFOdkFVS3IreUF6djk1WlUKUlVtN2xnQUpRYXl6RTRhR0tBY3p5bXZtZExtNkFDMnVwQXJUOWZIeEQ0cS9jMmRLZzhkRWUzamdyMjVzYndNcApqak01UmNPTzVMbFhiS3I4RXBic1U4WXQ1Q1JzdVpSais5eFRhR2RXUG9PNHp6VWh3OGxvL3M3YXdsT3F6SkNLCjZmQmRSb3lWM1hwWUtCb3ZIZDdOQURkQmorMUViZGRUS0pkKzgyY0VIaFhYaXBhMDA5NU1KNlJNRzNOemR2UVgKbWNJZmVnN2pMUWl0Q2h3cy96eXJWUTRQa1g0MjY4TlhTYjdoTGkxOFlJdkRRVkVUSTUzTzl6SnJsQUdvbWVjcwpNeDg2T3lYU2hrRE9PeXlHZU1saEx4UzY3dHRWYjkrRTdnVUpUYjBvMkhMTzAySlFaUjdya3BlRE1kbXp0Y3BICldEOWYKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2OAojIFN1YmplY3Q6IENOPUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2OAojIExhYmVsOiAiQXV0b3JpZGFkIGRlIENlcnRpZmljYWNpb24gRmlybWFwcm9mZXNpb25hbCBDSUYgQTYyNjM0MDY4IgojIFNlcmlhbDogNjA0NzI3NDI5NzI2Mjc1Mzg4NwojIE1ENSBGaW5nZXJwcmludDogNzM6M2E6NzQ6N2E6ZWM6YmI6YTM6OTY6YTY6YzI6ZTQ6ZTI6Yzg6OWI6YzA6YzMKIyBTSEExIEZpbmdlcnByaW50OiBhZTpjNTpmYjozZjpjODplMTpiZjpjNDplNTo0ZjowMzowNzo1YTo5YTplODowMDpiNzpmNzpiNjpmYQojIFNIQTI1NiBGaW5nZXJwcmludDogMDQ6MDQ6ODA6Mjg6YmY6MWY6Mjg6NjQ6ZDQ6OGY6OWE6ZDQ6ZDg6MzI6OTQ6MzY6NmE6ODI6ODg6NTY6NTU6M2Y6M2I6MTQ6MzA6M2Y6OTA6MTQ6N2Y6NWQ6NDA6ZWYKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUdGRENDQS95Z0F3SUJBZ0lJVSt3Nzd2dXlTRjh3RFFZSktvWklodmNOQVFFRkJRQXdVVEVMTUFrR0ExVUUKQmhNQ1JWTXhRakJBQmdOVkJBTU1PVUYxZEc5eWFXUmhaQ0JrWlNCRFpYSjBhV1pwWTJGamFXOXVJRVpwY20xaApjSEp2Wm1WemFXOXVZV3dnUTBsR0lFRTJNall6TkRBMk9EQWVGdzB3T1RBMU1qQXdPRE00TVRWYUZ3MHpNREV5Ck16RXdPRE00TVRWYU1GRXhDekFKQmdOVkJBWVRBa1ZUTVVJd1FBWURWUVFERERsQmRYUnZjbWxrWVdRZ1pHVWcKUTJWeWRHbG1hV05oWTJsdmJpQkdhWEp0WVhCeWIyWmxjMmx2Ym1Gc0lFTkpSaUJCTmpJMk16UXdOamd3Z2dJaQpNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUURLbG11TzZ2ajc4YUkxNEg5TTJ1RERVdGQ5CnRoRElBbDZ6UXlyRVQycXl5aHhkS0pwNEVScHBXVmV2dFNCQzVJc1A1dDlicGdPU0wvVVI1R0xYTW5FNDJRUU0KY2FzOVVYNFBCOTlqQlZ6cHY1UnZ3U21Dd0xUYVViREJQTHV0TjBwY3l2RkxOZzRrcTcvRGhIZjlxRkQwc2VmRwpMOUl0V1kxNkNrNldhVklDcWphWTdQejZGSU1NTngvSmtqZC8xNEV0NWNTNTRENDAvbWYwUG1iUjAvUkF6MTVpCk5BOXdCajRnR0ZyTzkzSWJKV3lUZEJTVG8zT3hEcXFIRUNOWlh5QUZHVWZ0YUk2U0VzcGQvTllyc3BJOElNL2gKWDY4Z3ZxQjJmM2JsN0JxR1lUTSs1M3UwUDZBUGpxSzVhbSs1aHladlFXeUlwbEQ5YW1NTDlaTVdHeG1Qc3UyYgptOG1ROVFFTTN4azlEejQ0SThrdmp3elJBdjRiVmRaTzBJMDhyMCtrOC82dkt0TUZuWGtJb2N0WE1iU2N5SkN5ClovUVlGcE02L0VmWTBYaVdNUis2S3d4ZlhabXRZNGxhSkNCMjJOLzlxMDZtSXFxZFh1WW5pbjFvS2FQbmlyamEKRWJzWExabWRFeVJHOThYaTJKK09mOGVQZEcxYXN1aHk5YXp1SkJDdEx4VGEveTJhUm5GSHZrTGZ1d0hiOUgvVApLSTh4V1Z2VHlRS210RkxLYnBmN1E4VUlKbStLOUx2OW55aXFEZFZGOHhNNkhkakFlSTlCWnp3ZWxHU3Vld3ZGCjZOa0JpRGthbDRaa1FkVTdod3h1K2cvR3ZVZ1V2emxOMUo1QnRvK1dIV09XazltVkJuZ3hhSjQzQmp1QWlVVmgKT1NQSEcwU2pGZVVjK0pJd3V3SURBUUFCbzRIdk1JSHNNQklHQTFVZEV3RUIvd1FJTUFZQkFmOENBUUV3RGdZRApWUjBQQVFIL0JBUURBZ0VHTUIwR0ExVWREZ1FXQkJSbHpldXJOUjRBUG43VmRNQWN0SE5IRGhwa0x6Q0JwZ1lEClZSMGdCSUdlTUlHYk1JR1lCZ1JWSFNBQU1JR1BNQzhHQ0NzR0FRVUZCd0lCRmlOb2RIUndPaTh2ZDNkM0xtWnAKY20xaGNISnZabVZ6YVc5dVlXd3VZMjl0TDJOd2N6QmNCZ2dyQmdFRkJRY0NBakJRSGs0QVVBQmhBSE1BWlFCdgpBQ0FBWkFCbEFDQUFiQUJoQUNBQVFnQnZBRzRBWVFCdUFHOEFkZ0JoQUNBQU5BQTNBQ0FBUWdCaEFISUFZd0JsCkFHd0Fid0J1QUdFQUlBQXdBRGdBTUFBeEFEY3dEUVlKS29aSWh2Y05BUUVGQlFBRGdnSUJBQmQ5b1BtMDNjWEYKNjYxTEpMV2hBcXZkcFloS3NnOVZTeXRYakR2bE1kMyt4REx4NTF0a2xqWXlHT3lsTW5mWDQwUzJ3QkVxZ0xrOQphbTU4bTlPdC9NUFdvK1prS1h6UjRUZ2VnaXYvSjJXdit4WVZ4QzV4aE9XMS8vcWtSNzFrTXJ2MkpZU2lKMEwxCklMRENFeEFSelJBVnVrS1FLdEpFNFpZbTZ6RklFdjBxMnNrR3ozUWVxVXZWaHlqNWVUU1NQaTVFNlBhUFQ0ODEKUHlXek9keGpLcEJySUYvRVVoSk9seXdxckoyWDNranlvMmJid3RLRGxhWm1wNTRsRCtrTE01RmxDbHJEMlZRUwozYS9EVGc0ZkpsNE4zTE9ON05XQmNON1NUeVFGODJ4TzlVeEpabzNSLzlJTEpVRkkvbEdFeGtLdmdBVFAwSDVrClNlVHkzNkxzc1V6QUtoM250TEZsb3NTODhaajBxbkFIWTdTNDJqdE0ra0FpTUZzUnB2QUZEc1lDQTBpcmhwdUYKM2R2ZDZxSjJnSE45OVp3RXhFV041N2tjaTU3cTEzWFJjckhlZFVUblFuM2lWMnQ5M0ptOFBZTW82b0NUamNWTQpaY0Z3Z2JnNC9FTXhzdllETkVleXJQc2lCc3NlM1JkSEhGOW11ZE1hb3RvUnNhUzhJOG5rdm9mL3VaUzIrRjBnClN0UmY1NzFvZTJYeUZSN1NPcWt0NmRockpLeVhXRVJIclZrWThTRmxjTjdPTkdDb1FQSHpQS1RES0NPTS9pY3oKUTBDZ0Z6enI2anV3Y3FhanVVcExYaFpJOUxLOHlJeVN4WjJmckhJMnZEU0FOR3VwaTVMQXVCZnQ3SFpUOVNRQgpqTE1pNkV0OFZjYWQrcU1VdTJXRmJtNVBFbjRLUEoyVgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049SXplbnBlLmNvbSBPPUlaRU5QRSBTLkEuCiMgU3ViamVjdDogQ049SXplbnBlLmNvbSBPPUlaRU5QRSBTLkEuCiMgTGFiZWw6ICJJemVucGUuY29tIgojIFNlcmlhbDogOTE3NTYzMDY1NDkwMzg5MjQxNTk1NTM2Njg2OTkxNDAyNjIxCiMgTUQ1IEZpbmdlcnByaW50OiBhNjpiMDpjZDo4NTo4MDpkYTo1Yzo1MDozNDphMzozOTo5MDoyZjo1NTo2Nzo3MwojIFNIQTEgRmluZ2VycHJpbnQ6IDJmOjc4OjNkOjI1OjUyOjE4OmE3OjRhOjY1OjM5OjcxOmI1OjJjOmEyOjljOjQ1OjE1OjZmOmU5OjE5CiMgU0hBMjU2IEZpbmdlcnByaW50OiAyNTozMDpjYzo4ZTo5ODozMjoxNTowMjpiYTpkOTo2Zjo5YjoxZjpiYToxYjowOTo5ZToyZDoyOTo5ZTowZjo0NTo0ODpiYjo5MTo0ZjozNjozYjpjMDpkNDo1MzoxZgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRjhUQ0NBOW1nQXdJQkFnSVFBTEMzV2haSVg3L2h5L1dMMXhubWZUQU5CZ2txaGtpRzl3MEJBUXNGQURBNApNUXN3Q1FZRFZRUUdFd0pGVXpFVU1CSUdBMVVFQ2d3TFNWcEZUbEJGSUZNdVFTNHhFekFSQmdOVkJBTU1Da2w2ClpXNXdaUzVqYjIwd0hoY05NRGN4TWpFek1UTXdPREk0V2hjTk16Y3hNakV6TURneU56STFXakE0TVFzd0NRWUQKVlFRR0V3SkZVekVVTUJJR0ExVUVDZ3dMU1ZwRlRsQkZJRk11UVM0eEV6QVJCZ05WQkFNTUNrbDZaVzV3WlM1agpiMjB3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRREowM3JLRHg2c3A0Ym9GbVZxCnNjSWJSVEp4bGRuK0VGdk1yK2VsZVFHUGljUEs4bFZ4OTNlK2Q1VHpjcVFzUk5pZWtwc1VPcUhuSkpBS0NsYU8KeGRnbWxPSFpTT0V0UHRvS2N0MmptUlhhZ2FLSDlIdHVKbmVKV0szVzZ3eXlRWHB6Ym0zYmVuaEI2UWlJRW42SApMbVlSWTJ4VSt6eWRjc0M4THYvQ3Q5ME5kdU02MS9lMGFMNmk5ZU9CYnNGR2IxMk40RTNHVkZXSkdqTXhDckZYCnVhT0ttTVBzT3pURmxVRnBmblhDUENERllicFJSNkFna0pPaGtFdnpUbnlGUlZTYTBRVW1RYkMxVFIwenZzUUQKeUNWOHdYRGJPL1FKTFZRblNLd3Y0Y1NzUHNqTGtreFRPVGNqN05NQitlQUpSRTFOWk1EaERWcUhJcnl0RzZQKwpKclVWODZmOGhCbnA3S0dJdEVScGhJUHppZEYwQnFuTUM5YkMzaWVGVUNiS0Y3akplb2RXTEJvQkhteStFNjBRCnJMVWs5VGlSb2RaTDJ2RzcwdDVIdGZHOGdmWlphODhaVSttTkZjdEt5Nmx2Uk9VYlFjL2hocWZLMEdxZnZFeU4KQmpOYW9vWGxrRFdnWWx3V1R2RGpvdm9ER3JRc2NiTllMTjU3QzlzYUQrdmVJUjhHZHdZRHNNbnZtZnpBdVU4TApoaWorMHJucTQ5cWx3MGRwRXVEYjhQWVppKzE3Y05jQzF1MkhHQ2dzQkNSTWQrUklpaHJHTzVyVUQ4cjZkZElCClFGcU5lYitMejB2UHFoYkJsZVN0VElvK0Y1SFVzV0xsZ3VXQUJLUURmbzIvMm4raUQ1ZFBETk1OKzlmUjVYSisKSE1oMy8xdWFEN2V1QlVibDhhZ1c3RWVrRndJREFRQUJvNEgyTUlIek1JR3dCZ05WSFJFRWdhZ3dnYVdCRDJsdQpabTlBYVhwbGJuQmxMbU52YmFTQmtUQ0JqakZITUVVR0ExVUVDZ3crU1ZwRlRsQkZJRk11UVM0Z0xTQkRTVVlnClFUQXhNek0zTWpZd0xWSk5aWEpqTGxacGRHOXlhV0V0UjJGemRHVnBlaUJVTVRBMU5TQkdOaklnVXpneFF6QkIKQmdOVkJBa01Pa0YyWkdFZ1pHVnNJRTFsWkdsMFpYSnlZVzVsYnlCRmRHOXlZbWxrWldFZ01UUWdMU0F3TVRBeApNQ0JXYVhSdmNtbGhMVWRoYzNSbGFYb3dEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DCkFRWXdIUVlEVlIwT0JCWUVGQjBjWlE2bzhpVjd0SkhQNUxHeDVyMVZkR3dGTUEwR0NTcUdTSWIzRFFFQkN3VUEKQTRJQ0FRQjRwZ3dXU3A5TWlEckF5dzZsRm4yZnVVaGZHSThOWWpiMnpSbHJyS3ZWOXBGOXJuSHpQN01PZUlXYgpsYVFuSVVkQ1NueElPdlZGZkxNTWpsRjRySlVUM3NiOWZiZ2FrRXlya2dQSDdVSUJ6Zy9Zc2ZxaWt1RmdiYTU2CmF3bXF4aW51YUVsbk1JQWtlakVXT1Z0KzhSd3UzV3dKcmZJeHdZSk91YnY1dnI4cWhUL0FRS002V2Z4WlN6d28KSk51MEZYV3VEWWk2TG5QQXZWaUg1VUx5NjE3dUhqQWltY3MzMGNRaGJJSHN2bTBtNWh6a1FpQ2VSN0NzZzFsdwpMRFhXcnpZMHRNMDcrREtvNytONGlmdU5SU3phbkxoK1FCeGg1ejZpa2l4TDhzMzZtTFlwLy9QeWU2a2ZMcUNUClZ5dmVoUVA1YVRmTG5uaHFCYlRGTVhpSjdIcW5oZUc1ZXp6ZXZoNTVoTTZmY0E1WndqVXVrQ294MmVSRmVrR2sKTGhPYk5BNW1lMG1yWkpmUVJzTjVuWEpRWTZhWVd3YTlTRzNZT1lOdzZEWHdCZEdxdk9QYnlBTHFmUDJDMnNKYgpVald1bURxdHVqV1RJNmNmU04wMVJwaXlFR2prcFRIQ0NsZ3VHWUVReVZCMS9PcGFGczRSMSs3dlVJZ3RZZjgvClFuTUZsRVBWamp4T0FUb1pwUjlHVG5mUVhlV0JJaUdIL3BSOWhOaVRyZFpvUTBpeTIrdHpKT2VSZjFTa3RvQSsKbmFNOFRITENWOFNnMU13NEo4N1ZCcDZpU05ucG44NkNjRGFUbWp2ZmxpSGpXYmNNMnBFMzhQMVpXck9aeUdscwpReVlCTldOZ1ZZa0RPblhZdWtyWlZQL3Uzb0RZTGRFNDFWNHRDNWg5UG16Yi9DYUl4dz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1DaGFtYmVycyBvZiBDb21tZXJjZSBSb290IC0gMjAwOCBPPUFDIENhbWVyZmlybWEgUy5BLgojIFN1YmplY3Q6IENOPUNoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4IE89QUMgQ2FtZXJmaXJtYSBTLkEuCiMgTGFiZWw6ICJDaGFtYmVycyBvZiBDb21tZXJjZSBSb290IC0gMjAwOCIKIyBTZXJpYWw6IDExODA2ODIyNDg0ODAxNTk3MTQ2CiMgTUQ1IEZpbmdlcnByaW50OiA1ZTo4MDo5ZTo4NDo1YTowZTo2NTowYjoxNzowMjpmMzo1NToxODoyYTozZTpkNwojIFNIQTEgRmluZ2VycHJpbnQ6IDc4OjZhOjc0OmFjOjc2OmFiOjE0OjdmOjljOjZhOjMwOjUwOmJhOjllOmE4OjdlOmZlOjlhOmNlOjNjCiMgU0hBMjU2IEZpbmdlcnByaW50OiAwNjozZTo0YTpmYTpjNDo5MTpkZjpkMzozMjpmMzowODo5Yjo4NTo0MjplOTo0NjoxNzpkODo5MzpkNzpmZTo5NDo0ZToxMDphNzo5Mzo3ZTplMjo5ZDo5Njo5MzpjMAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJSFR6Q0NCVGVnQXdJQkFnSUpBS1BhUW42a3NhN2FNQTBHQ1NxR1NJYjNEUUVCQlFVQU1JR3VNUXN3Q1FZRApWUVFHRXdKRlZURkRNRUVHQTFVRUJ4TTZUV0ZrY21sa0lDaHpaV1VnWTNWeWNtVnVkQ0JoWkdSeVpYTnpJR0YwCklIZDNkeTVqWVcxbGNtWnBjbTFoTG1OdmJTOWhaR1J5WlhOektURVNNQkFHQTFVRUJSTUpRVGd5TnpRek1qZzMKTVJzd0dRWURWUVFLRXhKQlF5QkRZVzFsY21acGNtMWhJRk11UVM0eEtUQW5CZ05WQkFNVElFTm9ZVzFpWlhKegpJRzltSUVOdmJXMWxjbU5sSUZKdmIzUWdMU0F5TURBNE1CNFhEVEE0TURnd01URXlNamsxTUZvWERUTTRNRGN6Ck1URXlNamsxTUZvd2dhNHhDekFKQmdOVkJBWVRBa1ZWTVVNd1FRWURWUVFIRXpwTllXUnlhV1FnS0hObFpTQmoKZFhKeVpXNTBJR0ZrWkhKbGMzTWdZWFFnZDNkM0xtTmhiV1Z5Wm1seWJXRXVZMjl0TDJGa1pISmxjM01wTVJJdwpFQVlEVlFRRkV3bEJPREkzTkRNeU9EY3hHekFaQmdOVkJBb1RFa0ZESUVOaGJXVnlabWx5YldFZ1V5NUJMakVwCk1DY0dBMVVFQXhNZ1EyaGhiV0psY25NZ2IyWWdRMjl0YldWeVkyVWdVbTl2ZENBdElESXdNRGd3Z2dJaU1BMEcKQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUN2QU10d055dUFXa282YkhpVWZhTi9HaC8yTmRXOQoyOHNOUkhJK0pyS1FVcnBqT3loWWI2V3piWlNtODkxa0RGWDI5dWZ5SWlLQVh1Rml4cllwNFlGczhyL2xmVEpxClZLQXlHVm4rSDR2WFBXQ0doU1J2NHhHemR6NGdsalVoYTdNSTJYQXVaUGVFa2xQV0RyQ1Fpb3JqaDQwRzA3MlEKRHVLWm9SdUdEdHFhQ3JzTFlWQUdVdkdlZjNic3l3L1FIZzNQbVRBOUhNUkZFRmlzMXRQbzErWHF4UUVIZDlaUgo1Z04vaWtpbFRXaDF1ZW04bms0WmNmVXlTNXh0WUJrTCs4eWRkZHkvSnMyUGszZzVlWE5lSlE3S1hPdDNFZ2ZMClpFRkhjcE9yVU1QckNYWmtOTkk1dDNZUkNRMTJSY1NwcmoxcXI3VjlaUytVV0JEc1hIeXZmdUsyR05uUW0wNWEKU2QrcFpndk1QTVo0ZktlY0hlUE9qbE8rQmQ1Z0QydmxHdHMvNCtFaHlTbkI4ZXNIbkZJYkFVUlJQSHNsMThUbApVbFJkSlFmS0ZpQzRyZVJCN25vSS9wbHZnNmFSQXJCc05sVnE1MzMxbHViS2dkYVg4WlNENmUyd3NXc1NhUjZzCisxMnB4WmpwdEZ0WWVyNDlva1E2WTFuVUN5WGVHMCs5NVFHZXpkSXAxWjhYR1FwdnZ3eVEwd2xmMmVPS05jeDUKV2swWk41SzN4TUd0ci9SNUpKcXlBUXV4cjF5Vzg0QXkrMXc5bVBHZ1AwcmV2cStVTHRsVm1oZHVZSjFqYkxoagp5YTZCWEJnMTRKQzd2anhQTnlLNWZ1dlBubmNocGowNGdmdEkyakU5SytPSjlkQzF2WDdnVU1RU2liTWptaEF4CmhkdXViKzg0TXhoMkVRSURBUUFCbzRJQmJEQ0NBV2d3RWdZRFZSMFRBUUgvQkFnd0JnRUIvd0lCRERBZEJnTlYKSFE0RUZnUVUrU1NzRDdLMStIbkErbUNJRzhUWlRRS2VGeGt3Z2VNR0ExVWRJd1NCMnpDQjJJQVUrU1NzRDdLMQorSG5BK21DSUc4VFpUUUtlRnhtaGdiU2tnYkV3Z2E0eEN6QUpCZ05WQkFZVEFrVlZNVU13UVFZRFZRUUhFenBOCllXUnlhV1FnS0hObFpTQmpkWEp5Wlc1MElHRmtaSEpsYzNNZ1lYUWdkM2QzTG1OaGJXVnlabWx5YldFdVkyOXQKTDJGa1pISmxjM01wTVJJd0VBWURWUVFGRXdsQk9ESTNORE15T0RjeEd6QVpCZ05WQkFvVEVrRkRJRU5oYldWeQpabWx5YldFZ1V5NUJMakVwTUNjR0ExVUVBeE1nUTJoaGJXSmxjbk1nYjJZZ1EyOXRiV1Z5WTJVZ1VtOXZkQ0F0CklESXdNRGlDQ1FDajJrSitwTEd1MmpBT0JnTlZIUThCQWY4RUJBTUNBUVl3UFFZRFZSMGdCRFl3TkRBeUJnUlYKSFNBQU1Db3dLQVlJS3dZQkJRVUhBZ0VXSEdoMGRIQTZMeTl3YjJ4cFkza3VZMkZ0WlhKbWFYSnRZUzVqYjIwdwpEUVlKS29aSWh2Y05BUUVGQlFBRGdnSUJBSkFTcnlJMXdxTTU4QzdlNmJYcGVIeEl2ajk5UlpKZTZkcXhHZndXClBKKzBXMmFlYXVmRHVWMkk2QSt0enlNUDNpVTZYc3hQcGNHMUxhd2swbGdIM3FMUGFZUmdNK2dRRFJPcEk5Q0YKNVk1N3BwNDljaE55TS9XcWZjWmpId2owL2dGL0pNOHJMRlFKM3VJcmJaTEdPVThXNmp4K2VrYlVSV3BHcU90MQpnbGFucTZCOGFCTXo5cDB3OEc4bk9TUWpLcEQ5a0NrMThwUGZOS1hHOS9qdmpBOWlTbnl1MC9WVStJMjJtbGFICkZvSTZNNnRhSWdqM2dycnFMdUJIbXJTMVJhTUZPOW5jTGtWQU8rcmNmK2c3NjlIc0p0ZzFwRERGT3F4WG5yTjIKcFNCNytSNUtCV0lCcGloMVlKZVNEVzQrVFRkRERaSVZuQmdpelZHWm9Da2FQRitLTWpOYk1NZUpMMGVZRDZNRAp4dmJ4ck44eThObUJHdVNjdmZhQUZQRFJMTG1GOWRpanNjaWxJZVVjRTVmdURyM2ZLYW52TkZOYjArUnFFNFFHCnRqSUN4Rkt1SXRMY3NpRkNHdHBBOENuSjdBb01YT0xRdXN4STB6Y0t6QklLaW5td1BRTi9hVXYwTkNCOXN6VHEKamt0azlUNzlzeU5uRlEwRXVQQXR3UWxSUExKc0ZmQ2xJOWVEZE9UbExzbittQ2RDeHF2R25yRFFXemlsbTFEZQpmaGlZdFVVNzlubTA2UGNhZXdhRCs5Q0wycnZIdlJpckNHODhnR3RBUHhrWnVtV0s1cjdWWE5NMjErOUFVaVJnCk9HY0VNZXlQODRMRzNybFY4enN4a1ZyY3RRZ1ZyWFlsQ2cxN0xvZmlES1lHdkNZUWJUZWQ3TjE0akh5QXhmRFoKZDBqUQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049R2xvYmFsIENoYW1iZXJzaWduIFJvb3QgLSAyMDA4IE89QUMgQ2FtZXJmaXJtYSBTLkEuCiMgU3ViamVjdDogQ049R2xvYmFsIENoYW1iZXJzaWduIFJvb3QgLSAyMDA4IE89QUMgQ2FtZXJmaXJtYSBTLkEuCiMgTGFiZWw6ICJHbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDgiCiMgU2VyaWFsOiAxNDU0MTUxMTc3MzExMTc4ODQ5NAojIE1ENSBGaW5nZXJwcmludDogOWU6ODA6ZmY6Nzg6MDE6MGM6MmU6YzE6MzY6YmQ6ZmU6OTY6OTA6NmU6MDg6ZjMKIyBTSEExIEZpbmdlcnByaW50OiA0YTpiZDplZTplYzo5NTowZDozNTo5Yzo4OTphZTpjNzo1MjphMToyYzo1YjoyOTpmNjpkNjphYTowYwojIFNIQTI1NiBGaW5nZXJwcmludDogMTM6NjM6MzU6NDM6OTM6MzQ6YTc6Njk6ODA6MTY6YTA6ZDM6MjQ6ZGU6NzI6Mjg6NGU6MDc6OWQ6N2I6NTI6MjA6YmI6OGY6YmQ6NzQ6Nzg6MTY6ZWU6YmU6YmE6Y2EKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUhTVENDQlRHZ0F3SUJBZ0lKQU1uTjArblZmU1BPTUEwR0NTcUdTSWIzRFFFQkJRVUFNSUdzTVFzd0NRWUQKVlFRR0V3SkZWVEZETUVFR0ExVUVCeE02VFdGa2NtbGtJQ2h6WldVZ1kzVnljbVZ1ZENCaFpHUnlaWE56SUdGMApJSGQzZHk1allXMWxjbVpwY20xaExtTnZiUzloWkdSeVpYTnpLVEVTTUJBR0ExVUVCUk1KUVRneU56UXpNamczCk1Sc3dHUVlEVlFRS0V4SkJReUJEWVcxbGNtWnBjbTFoSUZNdVFTNHhKekFsQmdOVkJBTVRIa2RzYjJKaGJDQkQKYUdGdFltVnljMmxuYmlCU2IyOTBJQzBnTWpBd09EQWVGdzB3T0RBNE1ERXhNak14TkRCYUZ3MHpPREEzTXpFeApNak14TkRCYU1JR3NNUXN3Q1FZRFZRUUdFd0pGVlRGRE1FRUdBMVVFQnhNNlRXRmtjbWxrSUNoelpXVWdZM1Z5CmNtVnVkQ0JoWkdSeVpYTnpJR0YwSUhkM2R5NWpZVzFsY21acGNtMWhMbU52YlM5aFpHUnlaWE56S1RFU01CQUcKQTFVRUJSTUpRVGd5TnpRek1qZzNNUnN3R1FZRFZRUUtFeEpCUXlCRFlXMWxjbVpwY20xaElGTXVRUzR4SnpBbApCZ05WQkFNVEhrZHNiMkpoYkNCRGFHRnRZbVZ5YzJsbmJpQlNiMjkwSUMwZ01qQXdPRENDQWlJd0RRWUpLb1pJCmh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUJBTURmVnRQa09wdDJSYlFUMi8vQnRobUxOMEVZbFZKSDZ4ZWQKS1lpT05Xd0dNaTVIWXZOSkJMOTlSRGF4Y2N5OVdnbHoxZG1GUlArUlZ5WGZYamFPY05GY2NVTWQyZHJ2WE5MNwpHNzA2dGN1dG84eEVwdzJ1SVJVL3VYcGJrblhZcEJJNGlSbUt0NERTNGpKdlZweVIxb2dRQzdOMFpKSjBZUFAyCnp4aFBZTElqME1jN3ptRkxtWS9DRE5CQXNwamNEYWhPbzdrS3JtQ2dyVVZTWTdwbXZXamcrYjRhcUlHN0hrRjQKZGRQQi9nQlZzSWRVNkNlUU5SMU1NNjJYL0pjdW1JUy9MTW1qdjlHWUVSVHRZL2pLbUloWUY1bnRSUU9YZmp5RwpIb2lNdnZLUmhJOWxOTmdBVEgyM01SZGFLWG9LR0NRd296ZTFlcWtCZlNiVytRNk9XZkg5R3pPMUtUc1hPMEcyCklkM1V3RDJsbjU4ZlExREp1N3hzZXBlWTdzMk1IL3VjVWE2TGNMMG5uM0hBYTZ4OWtHYm8xMTA2RGJEVndvM1YKeUoyZHdXM1EwTDlSNU9QNHd6ZzJydGFuZGVhdmhFTmRrNUlNYWdmZU94MllJdGFzd1RYYm82QWwvM0sxZGgzZQpiZWtzWml4U2hOQkZrczRjNWVVekhkd0hVMVNqcW9JN21qY3YzTjJnWk9ubTNiMnUvR1NGSFR5bnlRYmVoUDlyCjZHc2FQTVdpczBMN2l3aytYd2hTeDJMRTFBVnh2OFJrNVBpaGcrZytFcHVvSHRRMlRTOXg5bzBvOW9PcEU5SmgKd1pHN1NNQTBqMEdNUzB6YmFSTC9VSlNjSUlOWmMrMThvZkx4L2QzM1NkTkRXS0JXWThvOVBlVTFWbG5wRHNvZwp6Q3RMa3lrUEFnTUJBQUdqZ2dGcU1JSUJaakFTQmdOVkhSTUJBZjhFQ0RBR0FRSC9BZ0VNTUIwR0ExVWREZ1FXCkJCUzVDY3FjSHR2VGJEcHJydTFVOFZ1VEJqVXVYakNCNFFZRFZSMGpCSUhaTUlIV2dCUzVDY3FjSHR2VGJEcHIKcnUxVThWdVRCalV1WHFHQnNxU0JyekNCckRFTE1Ba0dBMVVFQmhNQ1JWVXhRekJCQmdOVkJBY1RPazFoWkhKcApaQ0FvYzJWbElHTjFjbkpsYm5RZ1lXUmtjbVZ6Y3lCaGRDQjNkM2N1WTJGdFpYSm1hWEp0WVM1amIyMHZZV1JrCmNtVnpjeWt4RWpBUUJnTlZCQVVUQ1VFNE1qYzBNekk0TnpFYk1Ca0dBMVVFQ2hNU1FVTWdRMkZ0WlhKbWFYSnQKWVNCVExrRXVNU2N3SlFZRFZRUURFeDVIYkc5aVlXd2dRMmhoYldKbGNuTnBaMjRnVW05dmRDQXRJREl3TURpQwpDUURKemRQcDFYMGp6akFPQmdOVkhROEJBZjhFQkFNQ0FRWXdQUVlEVlIwZ0JEWXdOREF5QmdSVkhTQUFNQ293CktBWUlLd1lCQlFVSEFnRVdIR2gwZEhBNkx5OXdiMnhwWTNrdVkyRnRaWEptYVhKdFlTNWpiMjB3RFFZSktvWkkKaHZjTkFRRUZCUUFEZ2dJQkFJQ0lmM0Rla2lqWkJaUkcvNUJYcWZFdjN4b05hL3A4RGh4SkpIa24yRWFxYnlsWgpVb2h3RXVyZFBmV2JVMVJ2NFdDaXFBbTU3T3RaZk1ZMThkd1k2ZkZuNWErNlJlQUozc3BFRDhJWERuZVJSWG96ClgxK1dMR2lMd1VlUG1Kczl3T3pMOWRXQ2tvUTEwYjQyT0ZaeU1WdEhMYW9YcEdOUjZ3b0JyWC9zZFo3TG9SL3gKZnhLeHVlUmtmMmZXSXlyMHVEbGRtT2docCtHOVBVSWFkSnB3cjJoc1VGMUp6Ly83RGwzbUxFZlhnVHBaQUxWegphMk1nOWpGRkNEa085SEIrUUhCYVA5QnJRcWwwUFNndkFtMTFjcFVKalVoanhzWWpWNUtUWGpYQmpma0s5eXlkClloejJyWHpkcGpFZXRySEhmb1VtK3FScXRkcGpNTkh2a3pleVppOTlCZmZudDB1WWxEWEEyVG9wd1oyeVVETWQKU3FsYXBza0Q3KzMwNTZodWlyUlhoT3VrUDlEdXFxcUhXMlBvaytKcnFOUzRjbmhyRyswNTVGM0xtNnFIMVU5TwpBUDdaYXA4OE1ROG9BZ0Y5bU9pbnNLSmtubm40U1BJVnFjem15RVRyUDNpWjhudHhQanp4bUtmRkdCSS81cnNvCk0wTHBSUXA4YmZLR2VTL0ZnaGw5Q1lsOHNsUjJpSzdld2ZQTTRXN2JNZGFUcnBtZzd5VnFjNWlKV3pvdUU0Z2UKdjhDU2xEUWI0eWUzaXg1dlF2L242VGViVUIwdG92a0M3c3RZV0RweHZHampxc0d2SENnZm90d2paVCtCNnE2WgowOWd3enhNTlR4WEpoTHluU0MzNE1DTjMyRVpMZVczMmpPMDZmMkFSZVBUcG02N1ZWTUIwZ05FTFFwL0IKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUdvIERhZGR5IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzIgTz1Hb0RhZGR5LmNvbSwgSW5jLgojIFN1YmplY3Q6IENOPUdvIERhZGR5IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzIgTz1Hb0RhZGR5LmNvbSwgSW5jLgojIExhYmVsOiAiR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMiIKIyBTZXJpYWw6IDAKIyBNRDUgRmluZ2VycHJpbnQ6IDgwOjNhOmJjOjIyOmMxOmU2OmZiOjhkOjliOjNiOjI3OjRhOjMyOjFiOjlhOjAxCiMgU0hBMSBGaW5nZXJwcmludDogNDc6YmU6YWI6Yzk6MjI6ZWE6ZTg6MGU6Nzg6Nzg6MzQ6NjI6YTc6OWY6NDU6YzI6NTQ6ZmQ6ZTY6OGIKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDQ1OjE0OjBiOjMyOjQ3OmViOjljOmM4OmM1OmI0OmYwOmQ3OmI1OjMwOjkxOmY3OjMyOjkyOjA4OjllOjZlOjVhOjYzOmUyOjc0OjlkOmQzOmFjOmE5OjE5OjhlOmRhCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEeFRDQ0FxMmdBd0lCQWdJQkFEQU5CZ2txaGtpRzl3MEJBUXNGQURDQmd6RUxNQWtHQTFVRUJoTUNWVk14CkVEQU9CZ05WQkFnVEIwRnlhWHB2Ym1FeEV6QVJCZ05WQkFjVENsTmpiM1IwYzJSaGJHVXhHakFZQmdOVkJBb1QKRVVkdlJHRmtaSGt1WTI5dExDQkpibU11TVRFd0x3WURWUVFERXloSGJ5QkVZV1JrZVNCU2IyOTBJRU5sY25ScApabWxqWVhSbElFRjFkR2h2Y21sMGVTQXRJRWN5TUI0WERUQTVNRGt3TVRBd01EQXdNRm9YRFRNM01USXpNVEl6Ck5UazFPVm93Z1lNeEN6QUpCZ05WQkFZVEFsVlRNUkF3RGdZRFZRUUlFd2RCY21sNmIyNWhNUk13RVFZRFZRUUgKRXdwVFkyOTBkSE5rWVd4bE1Sb3dHQVlEVlFRS0V4RkhiMFJoWkdSNUxtTnZiU3dnU1c1akxqRXhNQzhHQTFVRQpBeE1vUjI4Z1JHRmtaSGtnVW05dmRDQkRaWEowYVdacFkyRjBaU0JCZFhSb2IzSnBkSGtnTFNCSE1qQ0NBU0l3CkRRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFMOXhZZ2p4K2xrMDl4dkpHS1AzZ0VsWTZTS0QKRTZiRklFTUJPNFR4NW9WSm55ZnE5b1FiVHFDMDIzQ1l4eklCc1FVK0IwN3U5UHBQTDFrd0l1ZXJHVlpyNG9BSAovUE1XZFlBNVVYdmwrVFcyZEU2cGpZSVQ1TFkvcVFPRCtxSytpaFZxZjk0THc3WVpGQVhLNnNPb0JKUTdSbnd5CkRmTUFaaUxJaldsdE5vd1JHTGZUc2h4Z3REajZBb3pPMDkxR0I5NEtQdXRkZk1oOCs3QXJVNlNTWW1sUkpRVmgKR2tTQmpDeXBRNVlqMzZ3Nmdab09LY1VjcWVsZEhyYWVuakFLT2M3eGlJRDdTMTNNTXV5RllrTWxOQUpXSndHUgp0RHR3S2o5dXNlaWNpQUY5bjlUNTIxTnRZSjIvTE9kWXE3aGZSdnpPeEJzRFBBbnJTVEZjYVVhejRFY0NBd0VBCkFhTkNNRUF3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVkhROEJBZjhFQkFNQ0FRWXdIUVlEVlIwT0JCWUUKRkRxYWhRY1FaeWkyNy9hOUJVRnVJTUdVMmcvZU1BMEdDU3FHU0liM0RRRUJDd1VBQTRJQkFRQ1oyMTE1MWZtWApXV2NEWWZGK093WXhkUzJoSUk1UFpZZTA5NmFjdk5qcEw5RGJXdTdQZEl4enREaEMyZ1Y3K0FKMXVQMmxzZGV1Cjl0ZmVFOHRURUg2S1J0R1grcmN1S3hHcmtMQW5nUG5vbjFycE41K3I1TjlzczRVWG5UM1pKRTk1a1RYV1h3VHIKZ0lPcm1nSXR0UkQwMkpESEJITkE3WElsb0ttZjdKNnJhQktaVjhhUEVqb0pwTDFFL1FZVk44R2I1REtqN1RqbwoyR1R6TEg0VS9BTHFuODMvQjJnWDJ5S1FPQzE2amRGVThXbmpYelBLZWoxN0N1UEtmMTg1NWVKMXVzVjJHRFBPCkxQQXZUSzMzc2VmT1Q2akVtMHBVQnNWL2ZkVUlEK0ljL240WHVLeGU5dFFXc2tNSkRFMzJwMnUwbVlSbHlucUkKNHVKRXZsejM2aHoxCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1TdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMiBPPVN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4KIyBTdWJqZWN0OiBDTj1TdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMiBPPVN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4KIyBMYWJlbDogIlN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyIgojIFNlcmlhbDogMAojIE1ENSBGaW5nZXJwcmludDogZDY6Mzk6ODE6YzY6NTI6N2U6OTY6Njk6ZmM6ZmM6Y2E6NjY6ZWQ6MDU6ZjI6OTYKIyBTSEExIEZpbmdlcnByaW50OiBiNToxYzowNjo3YzplZToyYjowYzozZDpmODo1NTphYjoyZDo5MjpmNDpmZTozOTpkNDplNzowZjowZQojIFNIQTI1NiBGaW5nZXJwcmludDogMmM6ZTE6Y2I6MGI6Zjk6ZDI6Zjk6ZTE6MDI6OTk6M2Y6YmU6MjE6NTE6NTI6YzM6YjI6ZGQ6MGM6YWI6ZGU6MWM6Njg6ZTU6MzE6OWI6ODM6OTE6NTQ6ZGI6Yjc6ZjUKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUQzVENDQXNXZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBRENCanpFTE1Ba0dBMVVFQmhNQ1ZWTXgKRURBT0JnTlZCQWdUQjBGeWFYcHZibUV4RXpBUkJnTlZCQWNUQ2xOamIzUjBjMlJoYkdVeEpUQWpCZ05WQkFvVApIRk4wWVhKbWFXVnNaQ0JVWldOb2JtOXNiMmRwWlhNc0lFbHVZeTR4TWpBd0JnTlZCQU1US1ZOMFlYSm1hV1ZzClpDQlNiMjkwSUVObGNuUnBabWxqWVhSbElFRjFkR2h2Y21sMGVTQXRJRWN5TUI0WERUQTVNRGt3TVRBd01EQXcKTUZvWERUTTNNVEl6TVRJek5UazFPVm93Z1k4eEN6QUpCZ05WQkFZVEFsVlRNUkF3RGdZRFZRUUlFd2RCY21sNgpiMjVoTVJNd0VRWURWUVFIRXdwVFkyOTBkSE5rWVd4bE1TVXdJd1lEVlFRS0V4eFRkR0Z5Wm1sbGJHUWdWR1ZqCmFHNXZiRzluYVdWekxDQkpibU11TVRJd01BWURWUVFERXlsVGRHRnlabWxsYkdRZ1VtOXZkQ0JEWlhKMGFXWnAKWTJGMFpTQkJkWFJvYjNKcGRIa2dMU0JITWpDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQwpnZ0VCQUwzdHdRUDg5by84QXJGdlc1OUkyWjE1NHFLM0EyRldHTU5IdHRmS1BUVXVpVVAzb1dtYjNvb2EvUk1nCm5MUkpkeklwVnYyNTdJemRJdnB5M0NkaGwrNzJXb1RzYmhtNWlTemNoRnZWZFB0clg4V0pwUkJTaVVaVjlMaDEKSE9aLzVGU3VTL2hWY2xjQ0dmZ1hjVm5ySGlnSGRNV2RTTDVzdFBTa3NQTmtOM21Td094R1huL2hiVk5NWXEvTgpId3RqdXpxZCsveDVBSmhoZE04bWdrQmo4N0p5YWhrTm1jclVEblhNTi91TGljRlo4V0ovWDdOZlpURDRwN2ROCmRsb2VkbDQwd09pV1ZwbUtzL0IvcE0yOTNESXhmSkhQNEY4UitHdXFTVnpSbVpUUm91TmpXd2wydFZaaTRVdDAKSFpiVUp0UUlCRm5RbUE0TzV0Nzh3K3dma1BFQ0F3RUFBYU5DTUVBd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBTwpCZ05WSFE4QkFmOEVCQU1DQVFZd0hRWURWUjBPQkJZRUZId01NaCtuMlRCL3hIMW9vMktvb2M2ckIxc25NQTBHCkNTcUdTSWIzRFFFQkN3VUFBNElCQVFBUldmb2xUd052bEprN21oK0NoVG5VZGdXVVh1RW9rMjFpWFFuQ29LalUKc0hVNDhUUnFuZVNmaW9ZbVVlWXMwY1l0YnBVZ1NwSUI3TGlLWjNzeDRtY3VqSlVESmk1RG5Vb3g5ZzYxREx1Mwo0amQvSXJvQW93NTdVdnRydXp2RTAzbFJUczJROUdjSEdjZzhSbm9OQVgzRldPZHQ1b1V3RjVva3hCRGdCUGZnCjhuL1VxZ3IvUWgwMzdaVGxaRmtTSUhjNDB6SStPSUYxbG5QNmFJK3h5ODRmeGV6Nm5IN1Bmckh4QnkyMi9ML0sKcEwvUWx3Vkt2T29ZS0FLUXZWUjRDU0Z4MDlGOUhka1dzS2xoUGRBS0FDTDh4M3ZMQ1dSRkN6dEFnZmQ5ZkRMMQptTXBZam4wcTdwQlpjMlQ1Tm5SZUphSDFaZ1V1ZnprVnFTcjdVSXVPaFduMAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049U3RhcmZpZWxkIFNlcnZpY2VzIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzIgTz1TdGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuCiMgU3ViamVjdDogQ049U3RhcmZpZWxkIFNlcnZpY2VzIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzIgTz1TdGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuCiMgTGFiZWw6ICJTdGFyZmllbGQgU2VydmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMiIKIyBTZXJpYWw6IDAKIyBNRDUgRmluZ2VycHJpbnQ6IDE3OjM1Ojc0OmFmOjdiOjYxOjFjOmViOmY0OmY5OjNjOmUyOmVlOjQwOmY5OmEyCiMgU0hBMSBGaW5nZXJwcmludDogOTI6NWE6OGY6OGQ6MmM6NmQ6MDQ6ZTA6NjY6NWY6NTk6NmE6ZmY6MjI6ZDg6NjM6ZTg6MjU6NmY6M2YKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDU2OjhkOjY5OjA1OmEyOmM4Ojg3OjA4OmE0OmIzOjAyOjUxOjkwOmVkOmNmOmVkOmIxOjk3OjRhOjYwOjZhOjEzOmM2OmU1OjI5OjBmOmNiOjJhOmU2OjNlOmRhOmI1Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEN3pDQ0F0ZWdBd0lCQWdJQkFEQU5CZ2txaGtpRzl3MEJBUXNGQURDQm1ERUxNQWtHQTFVRUJoTUNWVk14CkVEQU9CZ05WQkFnVEIwRnlhWHB2Ym1FeEV6QVJCZ05WQkFjVENsTmpiM1IwYzJSaGJHVXhKVEFqQmdOVkJBb1QKSEZOMFlYSm1hV1ZzWkNCVVpXTm9ibTlzYjJkcFpYTXNJRWx1WXk0eE96QTVCZ05WQkFNVE1sTjBZWEptYVdWcwpaQ0JUWlhKMmFXTmxjeUJTYjI5MElFTmxjblJwWm1sallYUmxJRUYxZEdodmNtbDBlU0F0SUVjeU1CNFhEVEE1Ck1Ea3dNVEF3TURBd01Gb1hEVE0zTVRJek1USXpOVGsxT1Zvd2daZ3hDekFKQmdOVkJBWVRBbFZUTVJBd0RnWUQKVlFRSUV3ZEJjbWw2YjI1aE1STXdFUVlEVlFRSEV3cFRZMjkwZEhOa1lXeGxNU1V3SXdZRFZRUUtFeHhUZEdGeQpabWxsYkdRZ1ZHVmphRzV2Ykc5bmFXVnpMQ0JKYm1NdU1Uc3dPUVlEVlFRREV6SlRkR0Z5Wm1sbGJHUWdVMlZ5CmRtbGpaWE1nVW05dmRDQkRaWEowYVdacFkyRjBaU0JCZFhSb2IzSnBkSGtnTFNCSE1qQ0NBU0l3RFFZSktvWkkKaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFOVU1Pc1FxK1U3aTliNFpsMStPaUZPeEh6L0x6NThnRTIwcApPc2dQZlR6M2EzWTRZOWsyWUtpYlhsd0FnTEl2V1gvMmgva2xRNGJuYVJ0U21wRGhjZVBZTFExT2IvYklTZG0yCjh4cFdyaXUyZEJUcnovc200eHE2SFpZdWFqdFlsSWxIVnY4bG9KTndVNFBhaEhRVXcyZWVCR2c2MzQ1QVdoMUsKVHM5RGtUdm5WdFlBY010UzdudDlyanJudkRINVJmYkNZTThUV1FJcmdNdzBSOSs1M3BCbGJRTFBMSkdtcHVmZQpoUmhKZkdaT296cHRxYlh1TkM2NkRRTzRNOTlINjdGcmpTWFptODZCMFVWR01wWndoOTRDRGtsRGhiWnNjN3RrCjZtRkJyTW5VVk4rSEw4Y2lzaWJNbjFsVWFKLzh2aW92eEZVY2RVQmdGNFVDVlRtTGZ3VUNBd0VBQWFOQ01FQXcKRHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVkhROEJBZjhFQkFNQ0FRWXdIUVlEVlIwT0JCWUVGSnhmQU4rcQpBZGN3S3ppSW9yaHRTcHp5RVpHRE1BMEdDU3FHU0liM0RRRUJDd1VBQTRJQkFRQkxOcWFFZDJuZE94bWZaeU1JCmJ3NWh5ZjJFM0YvWU5vSE4yQnRCTFo5ZzNjY2FhTm5SYm9iaGlDUFBFOTVEeitJMHN3U2RIeW5Wdi9oZXlOWEIKdmU2U2J6SjA4cEdDTDcyQ1FucXRLcmNnZlUyOGVsVVN3aFhxdmZkcWxTNXNkSi9QSExUeXhRR2poZEJ5UHExegpxd3ViZFF4dFJiZU9sS3lXTjdXZzBJOFZSdzdqNklQZGovM3ZRUUYzekNlcFlvVXo4amNJNzNIUGR3YmV5QmtkCmlFRFBmVVlkL3g3SDRjNy9JOXZHK28xVlRxa0M1MGNSUmo3MC9iMTdLU2E3cVdGaU55aTJMU3IyRUlaa3lYQ24KMHEyM0tYQjU2anphWXlXZi9XaTNNT3h3KzNXS3QyMWdaN0lleUxucDJLaHZBb3RuRFUwbVYzSGFJUHpCU2xDTgpzU2k2Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1BZmZpcm1UcnVzdCBDb21tZXJjaWFsIE89QWZmaXJtVHJ1c3QKIyBTdWJqZWN0OiBDTj1BZmZpcm1UcnVzdCBDb21tZXJjaWFsIE89QWZmaXJtVHJ1c3QKIyBMYWJlbDogIkFmZmlybVRydXN0IENvbW1lcmNpYWwiCiMgU2VyaWFsOiA4NjA4MzU1OTc3OTY0MTM4ODc2CiMgTUQ1IEZpbmdlcnByaW50OiA4Mjo5MjpiYTo1YjplZjpjZDo4YTo2ZjphNjozZDo1NTpmOTo4NDpmNjpkNjpiNwojIFNIQTEgRmluZ2VycHJpbnQ6IGY5OmI1OmI2OjMyOjQ1OjVmOjljOmJlOmVjOjU3OjVmOjgwOmRjOmU5OjZlOjJjOmM3OmIyOjc4OmI3CiMgU0hBMjU2IEZpbmdlcnByaW50OiAwMzo3NjphYjoxZDo1NDpjNTpmOTo4MDozYzplNDpiMjplMjowMTphMDplZTo3ZTplZjo3Yjo1NzpiNjozNjplODphOTozYzo5Yjo4ZDo0ODo2MDpjOTo2Zjo1ZjphNwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRFREQ0NBalNnQXdJQkFnSUlkM2NHSnlhcHNYd3dEUVlKS29aSWh2Y05BUUVMQlFBd1JERUxNQWtHQTFVRQpCaE1DVlZNeEZEQVNCZ05WQkFvTUMwRm1abWx5YlZSeWRYTjBNUjh3SFFZRFZRUUREQlpCWm1acGNtMVVjblZ6CmRDQkRiMjF0WlhKamFXRnNNQjRYRFRFd01ERXlPVEUwTURZd05sb1hEVE13TVRJek1URTBNRFl3Tmxvd1JERUwKTUFrR0ExVUVCaE1DVlZNeEZEQVNCZ05WQkFvTUMwRm1abWx5YlZSeWRYTjBNUjh3SFFZRFZRUUREQlpCWm1acApjbTFVY25WemRDQkRiMjF0WlhKamFXRnNNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDCkFRRUE5aHRQWndjcm9SWDFCaUxMSHdHeTQzTkZCa1JKTEx0SkpSVFd6c08zcXl4UHhrRXlsRmY2RXFkYkR1S1AKSHg2R0dhZXF0UzI1WHcyS3dxK0ZOWGt5TGJzY1lqZnlzVnRLUGNyTmNWL3BRcjZVNk1qZStTSklaTWJscThZcgpiYTBGOFByVkM4K2E1ZkJRcElzN1I2VWpXM3A2K0RNL3VPK1psK01nd2RZb2ljK1UrN2xGN2VOQUZ4SFVkUEFMCk1lSXJKbXFiVEZldXJDQSt1a1Y2QmZPOW0ya1ZybjFPSUdQRU5YWTZCd0xKTi8zSFIrN284WFlkY3hYeWw2UzEKeUhwNTJVS3FLMzljL3M0bVQ2Tm1nVFd2UkxwVUhod3dNbVdkNWp5VFhsQk9ldU02MUc3TUd2djUwamV1SkNxcgpWd01pS0ExSmRYKzNLTnAxdjQ3ajNBNTVNUUlEQVFBQm8wSXdRREFkQmdOVkhRNEVGZ1FVblpQR1U0dGV5cTgvCm54NFA1Wm1WdkNUMmxJOHdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DQVFZd0RRWUoKS29aSWh2Y05BUUVMQlFBRGdnRUJBRmlzOUFRT3pjQU4vd3I5MUxvV1h5bTllMmlaV0VuU3RCMDNUWDhuZlVZRwpYVVBHaGk0K2M3SW1mVStUcWJiRUtwcXJJWmNVc2Q2TTA2dUpGZGhySk5UeEZxN1lwRnpVZjFHTzdSZ0JzWk5qCnZiejRZWUNhbnJIT1FuRGlxWDBHSlgwbm9mNXY3TE1lSk5yalMxVWFBRHMxdER2WjExMHcvWUVUaWZMQ0JpdnQKWjhTT3lVT3lYR3NWaVFLOFl2eE84clV6cXJKdjB3cWlVT1AyTytndVJNTGJaamlwTTFaSThXMGJNNDBOakQ5ZwpONTNUeW0xK05INE5uM0oyaXh1ZmN2MVNOVUZGQXBZdkhMS2FjMGtoc1VsSFJVZTA3Mm8wRWNsTm1zeFp0OVlDCm5scE9aYldVcmh2ZktiQVc4YjhBbmdjNkYyUzFCTFVqSVprS2xUdVhmTzg9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1BZmZpcm1UcnVzdCBOZXR3b3JraW5nIE89QWZmaXJtVHJ1c3QKIyBTdWJqZWN0OiBDTj1BZmZpcm1UcnVzdCBOZXR3b3JraW5nIE89QWZmaXJtVHJ1c3QKIyBMYWJlbDogIkFmZmlybVRydXN0IE5ldHdvcmtpbmciCiMgU2VyaWFsOiA4OTU3MzgyODI3MjA2NTQ3NzU3CiMgTUQ1IEZpbmdlcnByaW50OiA0Mjo2NTpjYTpiZTowMTo5YTo5YTo0YzphOTo4Yzo0MTo0OTpjZDpjMDpkNTo3ZgojIFNIQTEgRmluZ2VycHJpbnQ6IDI5OjM2OjIxOjAyOjhiOjIwOmVkOjAyOmY1OjY2OmM1OjMyOmQxOmQ2OmVkOjkwOjlmOjQ1OjAwOjJmCiMgU0hBMjU2IEZpbmdlcnByaW50OiAwYTo4MTplYzo1YTo5Mjo5Nzo3NzpmMTo0NTo5MDo0YTpmMzo4ZDo1ZDo1MDo5Zjo2NjpiNTplMjpjNTo4ZjpjZDpiNTozMTowNTo4YjowZToxNzpmMzpmMDpiNDoxYgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRFREQ0NBalNnQXdJQkFnSUlmRThFT1J6VW1TMHdEUVlKS29aSWh2Y05BUUVGQlFBd1JERUxNQWtHQTFVRQpCaE1DVlZNeEZEQVNCZ05WQkFvTUMwRm1abWx5YlZSeWRYTjBNUjh3SFFZRFZRUUREQlpCWm1acGNtMVVjblZ6CmRDQk9aWFIzYjNKcmFXNW5NQjRYRFRFd01ERXlPVEUwTURneU5Gb1hEVE13TVRJek1URTBNRGd5TkZvd1JERUwKTUFrR0ExVUVCaE1DVlZNeEZEQVNCZ05WQkFvTUMwRm1abWx5YlZSeWRYTjBNUjh3SFFZRFZRUUREQlpCWm1acApjbTFVY25WemRDQk9aWFIzYjNKcmFXNW5NSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDCkFRRUF0SVRNTXhjdWE1UnNhMkZTb091anozbVVUT1dVZ0puTFZXUkVaWTluWk9JRzQxdzNTZll2bTRTRUhpM3kKWUowd1RzeUVoZUlzeng2ZS9qYXJNM2MxUk5nMWxobzlOdWg2RHRqVlI2RnFhWXZaL0xzNnJubGExZlRXY2J1YQprQ05ybXJlSWRJY01IbCs1bmkzNnExTXIzTHQyUHBOTUNBaU1IcUlqSE5ScXJTSzZtUUV1YldYTHZpUm1WU1JMClFFU3hHOWZod29YQTNoQS9QZTI0L1BIeEkxUGN2MldYYjluNVFIR05mYjJWMU02K29GNG5JOTc5cHRBbURnQXAKNnp4RzhEMWd2ejlRMHR3bVFWR2VGRGRDQktOd1Y2Z2JoKzB0K252dWpBcmpxV2FKR2N0QitkMUVObUhQNG5kRwp5SDMyOUpLQk52M2JOUEZ5ZnZNTUZyMjBGUUlEQVFBQm8wSXdRREFkQmdOVkhRNEVGZ1FVQngvUzU1emF3bTZpClFMU3dlbEFRVUhURXlMMHdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DQVFZd0RRWUoKS29aSWh2Y05BUUVGQlFBRGdnRUJBSWxYc2haNnFNTDkxdG1ibXpUQ25MUXlGRTJucE4vc3ZxZSsrRVBia1RmTwp0REl1VUZVYU5VNTJRM0VnNzVOM1RoVndMb2ZEd1IxdDNNdTFKOVFzVnRGU1V6cEUwblBJeEJzRlpWcGlrcHp1ClFZMHgyK2MwNmxraDFRRjYxMlM0WkRuTnllMnY3VXNEU0tlZ21RR0EzR1dqTnE1bFdVaFBna3ZJWmZGWEhlVloKTGdvL2JOalI5ZVVKdEd4VUFBcmdGVTJIZFcyM1dKWmEzVzNTQUtEMG0waSt3emVrdWpiZ2ZJZUZseG9Wb3Q0dQpvbHU5cnhqNWtGRE5jRm40SjJkSHk4ZWdCenA5MFN4ZGJCazZaclY5L1pGdmdyRytDSlBiRkVmeG9qZkhSWjQ4CngzZXZaS2lUMy9acGc0Smc4a2xDTk8xYUFGU0ZIQlkya2d4YytxYXR2OXM9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1BZmZpcm1UcnVzdCBQcmVtaXVtIE89QWZmaXJtVHJ1c3QKIyBTdWJqZWN0OiBDTj1BZmZpcm1UcnVzdCBQcmVtaXVtIE89QWZmaXJtVHJ1c3QKIyBMYWJlbDogIkFmZmlybVRydXN0IFByZW1pdW0iCiMgU2VyaWFsOiA3ODkzNzA2NTQwNzM0MzUyMTEwCiMgTUQ1IEZpbmdlcnByaW50OiBjNDo1ZDowZTo0ODpiNjphYzoyODozMDo0ZTowYTpiYzpmOTozODoxNjo4Nzo1NwojIFNIQTEgRmluZ2VycHJpbnQ6IGQ4OmE2OjMzOjJjOmUwOjAzOjZmOmIxOjg1OmY2OjYzOjRmOjdkOjZhOjA2OjY1OjI2OjMyOjI4OjI3CiMgU0hBMjU2IEZpbmdlcnByaW50OiA3MDphNzozZjo3ZjozNzo2Yjo2MDowNzo0Mjo0ODo5MDo0NTozNDpiMToxNDo4MjpkNTpiZjowZTo2OTo4ZTpjYzo0OTo4ZDpmNToyNTo3NzplYjpmMjplOTozYjo5YQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRlJqQ0NBeTZnQXdJQkFnSUliWXdVUnJHbUN1NHdEUVlKS29aSWh2Y05BUUVNQlFBd1FURUxNQWtHQTFVRQpCaE1DVlZNeEZEQVNCZ05WQkFvTUMwRm1abWx5YlZSeWRYTjBNUnd3R2dZRFZRUUREQk5CWm1acGNtMVVjblZ6CmRDQlFjbVZ0YVhWdE1CNFhEVEV3TURFeU9URTBNVEF6TmxvWERUUXdNVEl6TVRFME1UQXpObG93UVRFTE1Ba0cKQTFVRUJoTUNWVk14RkRBU0JnTlZCQW9NQzBGbVptbHliVlJ5ZFhOME1Sd3dHZ1lEVlFRRERCTkJabVpwY20xVQpjblZ6ZENCUWNtVnRhWFZ0TUlJQ0lqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FnOEFNSUlDQ2dLQ0FnRUF4QkxmCnFWLytRZDNkOVorSzQvYXM0VHg0bXJ6WThIOTZvRE1xM0kwZ1c2NHRiK2VUMlRad2FtalBqbEdqaFZ0bkJLQVEKSkc5ZEtJTEJsMWZZU0NrVHR1RytrVTNmaFF4VEdKb2VKS0pQai9DaWhRdkw5Q2wvMHFSWTdpWk55YXFvZTVyWgoramplUkZjVjVmaU15TmxJNGcwV0p4MGV5SU9GSmJlNnFsVkJ6QU1pU3kyUmpZdm1pYTlteCtuL0srazhyTnJTCnM4UGhhSnlKK0hvQVZ0NzBWWlZzKzdwazNXS0wzd3QzTXV0aXpDYWFtN3VxWW9OTXRBWjZNTWdwdiswR1RaZTUKSE1ReEs5VmZ2Rk1TRjV5WlZ5bG1kMkVoTVFjdUpVbWRHUEx1OHl0eGpMVzZPUWRKZC96dkxwS1FCWTB0TDNkNwo3ME8vTmJ1YTJQbHpweXp5MEZmdUtFNG1YNCtRYUFrdnVQamNCdWt1bWo1UnA5RWl4QXFuT0Voc3Mvbi9mYXVHClYrTzYxb1Y0ZDdwRDZraC85dGkrSTIwZXY5RTJiRmhjOGU2a0dWUWE5UVBTZHViaGpMMDhzOU5JUytMSStIK1MKcUhaR25FSmxQcVFld1FjRFdrWXR1SmZ6dDlXeVZTSHZ1dHhNQUpmN0ZKVW5NNy9vUTBkRzBnaVpGbUE3bW43Uwo1dTA0NnV3QkhqeElWa2tKeDB3M0FKNklEc0J6NFc5bTZYSkhNRDRRNVFzRHlacENBR3pGbEg1aHhJcmZmNElhCkMxbkVXVEozczd4Z2FWWTUvYlFHZXl6V1pEYlp2VWp0aEI5K3BTS1BLcmhDOUlLMzFGT1FlRTR0R3YyQmIwVFgKT3dGMGxrTGdBT0l1YStyRjduS3N1Ny8rNnFxbytOejJzbm1LdG1jQ0F3RUFBYU5DTUVBd0hRWURWUjBPQkJZRQpGSjNBWjZZTUl0a205VVdycG1WU0VTZllSYXhqTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RGdZRFZSMFBBUUgvCkJBUURBZ0VHTUEwR0NTcUdTSWIzRFFFQkRBVUFBNElDQVFDelYwMFFZazQ2NUt6cXVCeXZNaVBJczBsYVVaeDIKS0kxNXFsZEdGOVgxVXZhM1JPZ0lSTDhZaE5JTGdNM0ZFdjBBVlFWaGgwSGN0U1NlUE1UWXlQdHduaTk0bG9NZwpOdDU4RDJrVGlLVjFOcGdJcHNiZnJNN2pXTmEzUHQ2NjgrczBRTmlpZ2ZWNFB5L1ZwZnpab3RSZUJBNFhyZjVCCjhPV3ljdnBFZ2pOQzZDMVk5MWFNWWorNlFyQ2NERngrTG1VbVhGTlBBTEo0ZnFFTm1TMk51QjJPb3NTdy9XRFEKTUtTT3lBUmlxY1R0TmQ1NmwrME9PRjZTTDVOd3BhbWNiNmQ5RXgxK3hnaElzVjVuNjFFSUplbm1KV3RTS1pHYwowamx6Q0ZmZW1RYTBXNTBRQnVIQ0FLaTRIRW9DQ2hUUXdVSEsrNHcxSVgyQ09QS3BWSkVaTlpPVWJXbzZ4YkxRCnU0bUdrK2lieVE4NnAzcTRvZkI0UnZyOE55L2xpb1R6My80RTJhRm9vQzhrNGdtVkJ0V1Z5dUVrbHV0ODlwTUYKdSsxejZTM1JkVG5YNXlUYjJFNWZRNCtlMEJRNXYxVndTSmxYTWJTYzdrcVlBNVl3SDJBRzdoc2ovb0ZnSXhwSApZb1dsekJrMGdHK3pyQnJqbi9CN1NLM1ZBZGxudHFseWsrb3Racld5dU9ROVBMTHZUSXpxNndlL3F6V2FWWWE4CkdLYTFxRjYwZzJ4cmFVRFRuOXp4dzJscnVlRnRDZlR4cWxCMkNucDllaGVoVlpaQ21URUozV0FSalFVd2Z1YU8KUnRHZEZOckhGK1FGbG96RUpMVWJ6eFFIc2tENG81NUJocndFMEd1V3lDcUFOUDIvN3dhajNWakZoVDArai82ZQpLZUMydUFsb0dSd1lRdz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1BZmZpcm1UcnVzdCBQcmVtaXVtIEVDQyBPPUFmZmlybVRydXN0CiMgU3ViamVjdDogQ049QWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MgTz1BZmZpcm1UcnVzdAojIExhYmVsOiAiQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MiCiMgU2VyaWFsOiA4NDAxMjI0OTA3ODYxNDkwMjYwCiMgTUQ1IEZpbmdlcnByaW50OiA2NDpiMDowOTo1NTpjZjpiMTpkNTo5OTplMjpiZToxMzphYjphNjo1ZDplYTo0ZAojIFNIQTEgRmluZ2VycHJpbnQ6IGI4OjIzOjZiOjAwOjJmOjFkOjE2Ojg2OjUzOjAxOjU1OjZjOjExOmE0OjM3OmNhOmViOmZmOmMzOmJiCiMgU0hBMjU2IEZpbmdlcnByaW50OiBiZDo3MTpmZDpmNjpkYTo5NzplNDpjZjo2MjpkMTo2NDo3YTpkZDoyNTo4MTpiMDo3ZDo3OTphZDpmODozOTo3ZTpiNDplYzpiYTo5Yzo1ZTo4NDo4ODo4MjoxNDoyMwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQi9qQ0NBWVdnQXdJQkFnSUlkSmNsaXNjL2VsUXdDZ1lJS29aSXpqMEVBd013UlRFTE1Ba0dBMVVFQmhNQwpWVk14RkRBU0JnTlZCQW9NQzBGbVptbHliVlJ5ZFhOME1TQXdIZ1lEVlFRRERCZEJabVpwY20xVWNuVnpkQ0JRCmNtVnRhWFZ0SUVWRFF6QWVGdzB4TURBeE1qa3hOREl3TWpSYUZ3MDBNREV5TXpFeE5ESXdNalJhTUVVeEN6QUoKQmdOVkJBWVRBbFZUTVJRd0VnWURWUVFLREF0QlptWnBjbTFVY25WemRERWdNQjRHQTFVRUF3d1hRV1ptYVhKdApWSEoxYzNRZ1VISmxiV2wxYlNCRlEwTXdkakFRQmdjcWhrak9QUUlCQmdVcmdRUUFJZ05pQUFRTk1GNGJGWjBECjBLRjVOYmM2UEpKNnloVWN6V0x6bkNaY0J6M2xWUHFqMXN3UzZ2UVVYK2lPR2Fzdkxram1yQmhEZUt6UU44TzkKc3MwczVrZmlHdVpqdUQwdUwzakVUOXYwRDZSb1RGVnlhNVVkVGhoQ2xYak1OenlSNHB0bEt5bWpRakJBTUIwRwpBMVVkRGdRV0JCU2FyeWw2d0JFMU5TWlJNQUREYXY1QTFhN1dQREFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQTRHCkExVWREd0VCL3dRRUF3SUJCakFLQmdncWhrak9QUVFEQXdObkFEQmtBakFYQ2ZPSGlGQmFyOGpBUXI5SFgvVnMKYW9iZ3hDZDA1RGhUMXdWL0d6VGp4aSt6eWdrOE41M1g1N2hHOGYyaDRuRUNNRUpaaDBQVVVkKzYwd2t5V3M2SQpmbGM5bkY5Q2EvVUhMYlh3Z3BQNVdXK3VaUHBZNVlzZTQyTyt0WUhOYndLTWVRPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EgTz1Vbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuIE9VPUNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQojIFN1YmplY3Q6IENOPUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EgTz1Vbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuIE9VPUNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQojIExhYmVsOiAiQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSIKIyBTZXJpYWw6IDI3OTc0NAojIE1ENSBGaW5nZXJwcmludDogZDU6ZTk6ODE6NDA6YzU6MTg6Njk6ZmM6NDY6MmM6ODk6NzU6NjI6MGY6YWE6NzgKIyBTSEExIEZpbmdlcnByaW50OiAwNzplMDozMjplMDoyMDpiNzoyYzozZjoxOToyZjowNjoyODphMjo1OTozYToxOTphNzowZjowNjo5ZQojIFNIQTI1NiBGaW5nZXJwcmludDogNWM6NTg6NDY6OGQ6NTU6ZjU6OGU6NDk6N2U6NzQ6Mzk6ODI6ZDI6YjU6MDA6MTA6YjY6ZDE6NjU6Mzc6NGE6Y2Y6ODM6YTc6ZDQ6YTM6MmQ6Yjc6Njg6YzQ6NDA6OGUKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR1ekNDQXFPZ0F3SUJBZ0lEQkVUQU1BMEdDU3FHU0liM0RRRUJCUVVBTUg0eEN6QUpCZ05WQkFZVEFsQk0KTVNJd0lBWURWUVFLRXhsVmJtbDZaWFJ2SUZSbFkyaHViMnh2WjJsbGN5QlRMa0V1TVNjd0pRWURWUVFMRXg1RApaWEowZFcwZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGt4SWpBZ0JnTlZCQU1UR1VObGNuUjFiU0JVCmNuVnpkR1ZrSUU1bGRIZHZjbXNnUTBFd0hoY05NRGd4TURJeU1USXdOek0zV2hjTk1qa3hNak14TVRJd056TTMKV2pCK01Rc3dDUVlEVlFRR0V3SlFUREVpTUNBR0ExVUVDaE1aVlc1cGVtVjBieUJVWldOb2JtOXNiMmRwWlhNZwpVeTVCTGpFbk1DVUdBMVVFQ3hNZVEyVnlkSFZ0SUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNU0l3CklBWURWUVFERXhsRFpYSjBkVzBnVkhKMWMzUmxaQ0JPWlhSM2IzSnJJRU5CTUlJQklqQU5CZ2txaGtpRzl3MEIKQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBNC90OW8zSzZ3dkRKRklmMWF3Rk80VzVBQjdwdEoxMS85MXN0czFySApVVitycERLbVlZZTJiZytHMGpBQ2wvalhhVmVoR0RsZGFtUjV4Z0ZackR3eFNqaDgwZ1RTU3lqb0lGODdCNkxNClRYUGI4NjVQeDFiVldxZVdpZnJ6cTJqVUk0WlpKODhKSjd5c2JuS0RIREJ5MytDaTZkTGhkSFVadlNxZWV4VlUKQkJ2WFF6bXRWU2pGNGhxNzlNRGtyamhKTTh4MmhaODVSZEtrbnZJU2pGSDRmT1F0Zi9Xc1grc1duN0V0MGJyTQprVUozVENYSmtEaHYyL0RNKzQ0ZWwxaysxV0JPNWdVbzdVbDVFMHU2U05zditYTFRPY3IrSDlnMGN2VzBRTTh4CkFjUHMzaEV0RjEwZnVGRFJYaG1uYWQ0SE15aktVSlg1cDFUTFZJWlFSYW41U1FJREFRQUJvMEl3UURBUEJnTlYKSFJNQkFmOEVCVEFEQVFIL01CMEdBMVVkRGdRV0JCUUlkczNMQi84azlzWE43YnVRdk9LRU4wWjE5ekFPQmdOVgpIUThCQWY4RUJBTUNBUVl3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCQUthb3JTTE9BVDJtby85aTBFaWRpMTV5CnNIaEU0OXdjcnduOUkwajZ2U3JFdVZVRXRSQ2pqU2ZlQzRKajBPN2VERGQ1UVZzaXNyQ2FRVnltY09EVTBIZkwKSTlNQTRHeFdMK0ZwRFEzWnFyOGhnVkRaQnFXby81VTMwS3IrNHJQMW1TMUZoSXJsUWduWGRBSXY5NG5ZbWVtOApKOVJIamJvTlJoeDN6eFNrSExta01jU2NLSFFETlA4ekdTYWw2UTEwdHo2WHhuYm9KNWFqWnQzaHJ2SkJXOHFZClZvTnpjT1NHR3RJeFFib3Z2aTBUV25adlR1aE9nUTQvV3dNaW9CSytabGdSU3NzRHhMUXFLaTJXRitBNVZMeEkKMDNZbm5ab3RCcWJKN0RuU3E5dWZtZ3NuQWpVcHNVQ1Y1L25vbkZXSUdVYld0elQxZnM0NW10azQ4VkgzVHl3PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049VFdDQSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89VEFJV0FOLUNBIE9VPVJvb3QgQ0EKIyBTdWJqZWN0OiBDTj1UV0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1UQUlXQU4tQ0EgT1U9Um9vdCBDQQojIExhYmVsOiAiVFdDQSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IgojIFNlcmlhbDogMQojIE1ENSBGaW5nZXJwcmludDogYWE6MDg6OGY6ZjY6Zjk6N2I6Yjc6ZjI6YjE6YTc6MWU6OWI6ZWE6ZWE6YmQ6NzkKIyBTSEExIEZpbmdlcnByaW50OiBjZjo5ZTo4Nzo2ZDpkMzplYjpmYzo0MjoyNjo5NzphMzpiNTphMzo3YTphMDo3NjphOTowNjoyMzo0OAojIFNIQTI1NiBGaW5nZXJwcmludDogYmY6ZDg6OGY6ZTE6MTA6MWM6NDE6YWU6M2U6ODA6MWI6Zjg6YmU6NTY6MzU6MGU6ZTk6YmE6ZDE6YTY6Yjk6YmQ6NTE6NWU6ZGM6NWM6NmQ6NWI6ODc6MTE6YWM6NDQKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURlekNDQW1PZ0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRVUZBREJmTVFzd0NRWURWUVFHRXdKVVZ6RVMKTUJBR0ExVUVDZ3dKVkVGSlYwRk9MVU5CTVJBd0RnWURWUVFMREFkU2IyOTBJRU5CTVNvd0tBWURWUVFERENGVQpWME5CSUZKdmIzUWdRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrd0hoY05NRGd3T0RJNE1EY3lORE16CldoY05NekF4TWpNeE1UVTFPVFU1V2pCZk1Rc3dDUVlEVlFRR0V3SlVWekVTTUJBR0ExVUVDZ3dKVkVGSlYwRk8KTFVOQk1SQXdEZ1lEVlFRTERBZFNiMjkwSUVOQk1Tb3dLQVlEVlFRRERDRlVWME5CSUZKdmIzUWdRMlZ5ZEdsbQphV05oZEdsdmJpQkJkWFJvYjNKcGRIa3dnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCCkFRQ3dmbks0cEFPVTVxZmVDVGlSU2hGQWg2ZDhXV1FVZTdVUkVOMyt2OVhBdTFiaWhTWDBOWElQK0ZQUVFlRkUKQWNLMEhNTXhRaFpIaFRNaWRySUtidy9sSlZCUGhZYSt2NWd1RUdjZXZoRUZoZ1dReEZuUWZIZ1FzSUJjdCtISApLM1hMZkordXRkR2RJemRqcDl4Q29pMlNCQnRRd1h1NFBodkpWZ1NMTDFLYnJhbFc2Y0gvcmFsWWh6QzJnZmVYClJmd1pWenNyYitSSDlKbEYvaDN4K0plamlCMDNIRnlQNEhZbG1sRDRvRlQvUkpCMkk5SXl4c09yQnIvOCs3L3oKclgyU1lnSmJLZE0xbzVPYVEyUmdYYkw2TXY4N0JLOU5RR3I1eCtQdkkvMXJ5K1VQaXpnTjdncjgvZytZbnpBeAozV3hTWmZtTGdiNGk0UnhZQTdxUkc0a0hBZ01CQUFHalFqQkFNQTRHQTFVZER3RUIvd1FFQXdJQkJqQVBCZ05WCkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVdCQlJxT0ZzbWpkNkxXdkpQZWxTREdSampDRFdtdWpBTkJna3EKaGtpRzl3MEJBUVVGQUFPQ0FRRUFQTlYzUGRyZmlicUhEQWhVYWlCUWtyNndRVDI1Sm1TRENpL29RTUNYS0NlQwpNRXJKay85cTU2WUFmNGxDbXRZUjVWUE9MOHp5MmdYRS91SlF4RHFHZmN6YWZoQUpPNUkxS2xPeS91c3JCZGxzClhlYlE3OU5xWnA0VktJVjY2SUlBckI2bkNXbFdRdE5vVVJpK1ZKcS9SRUc2U2I0Z3VtbGM3cmgzemM1c0g2MkQKbGhoOURyVVVPWVR4S09rdG81NTdIbnB5V29PemVXL3Z0UHpRQ3FWWVQwYmYrMjE1V2ZLRUlsS3VEOHo3ZkR2bgphc3BIWWNONitOT1NCQis0SUlUaE5sUVd4MERlTzRwejNOL0dDVXpmN05yLzFGTkNvY255WWgwaWd6eVh4ZmtaCllpZXNaU0xYMHp6RzVZNnlVOHhKenJ3dy9uc09NNUQ3N2RJVWtSOEhydz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBPPVNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4gT1U9U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyCiMgU3ViamVjdDogTz1TRUNPTSBUcnVzdCBTeXN0ZW1zIENPLixMVEQuIE9VPVNlY3VyaXR5IENvbW11bmljYXRpb24gUm9vdENBMgojIExhYmVsOiAiU2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyIgojIFNlcmlhbDogMAojIE1ENSBGaW5nZXJwcmludDogNmM6Mzk6N2Q6YTQ6MGU6NTU6NTk6YjI6M2Y6ZDY6NDE6YjE6MTI6NTA6ZGU6NDMKIyBTSEExIEZpbmdlcnByaW50OiA1ZjozYjo4YzpmMjpmODoxMDpiMzo3ZDo3ODpiNDpjZTplYzoxOToxOTpjMzo3MzozNDpiOTpjNzo3NAojIFNIQTI1NiBGaW5nZXJwcmludDogNTE6M2I6MmM6ZWM6Yjg6MTA6ZDQ6Y2Q6ZTU6ZGQ6ODU6Mzk6MWE6ZGY6YzY6YzI6ZGQ6NjA6ZDg6N2I6Yjc6MzY6ZDI6YjU6MjE6NDg6NGE6YTQ6N2E6MGU6YmU6ZjYKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURkekNDQWwrZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREJkTVFzd0NRWURWUVFHRXdKS1VERWwKTUNNR0ExVUVDaE1jVTBWRFQwMGdWSEoxYzNRZ1UzbHpkR1Z0Y3lCRFR5NHNURlJFTGpFbk1DVUdBMVVFQ3hNZQpVMlZqZFhKcGRIa2dRMjl0YlhWdWFXTmhkR2x2YmlCU2IyOTBRMEV5TUI0WERUQTVNRFV5T1RBMU1EQXpPVm9YCkRUSTVNRFV5T1RBMU1EQXpPVm93WFRFTE1Ba0dBMVVFQmhNQ1NsQXhKVEFqQmdOVkJBb1RIRk5GUTA5TklGUnkKZFhOMElGTjVjM1JsYlhNZ1EwOHVMRXhVUkM0eEp6QWxCZ05WQkFzVEhsTmxZM1Z5YVhSNUlFTnZiVzExYm1sagpZWFJwYjI0Z1VtOXZkRU5CTWpDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTkFWCk9WS3hVck82eFZtQ3hGMVNyanBEWllCTHgvS1d2TnMybDlhbVpJeW9YdkRqQ2h6MzM1YzlTNjcyWGV3aHRVR3IKemJsK2RwKysrVDQyTktBN3dmWXhFVVYwa3oxWGdNWDVpWm5LNWF0cTFMWGFRWkFRd2RiV1FvbkN2L1E0RXBWTQpWQVgzTnVSRmczc1VaZGJjREUzUjNuNE1xenZFRmI0NlZxWmFiM1pwVXFsNnVjanJhcHBkVXRBdENtczFGZ2tRCmhOQnF5am9HQURkSDVINVhUeitMNjJlNGlLckZ2bE5Wc3BIRWZibXdoUmtHZUM3YllScjZoZlZLa2FIbkZ0V08Kb2puZmxMaHdIeWcvaS94QVhtT0RQSU1xR3Bscno5NVphanY4YnhiWEgvMUtFT3RPZ2hZNnJDY01VL0d0MVNTdwphd05Rd1MwOEZ0MUVOQ2NhZGZzQ0F3RUFBYU5DTUVBd0hRWURWUjBPQkJZRUZBcUZxWGRsQlpoOFFJSDRENWNzCk9QRUs3RHpQTUE0R0ExVWREd0VCL3dRRUF3SUJCakFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQTBHQ1NxR1NJYjMKRFFFQkN3VUFBNElCQVFCTU9xTkVyTGxGc2NlVGZzZ0xDa0xmWk9vYzdsbHNDTHFKWDJyS1NwV2VlbzhIeGRwRgpjb0p4RGpyU3pHK250S0VqdS9Za244c1gvb3ltenNMUzI4eU4vSEg4QXluQmJGMHpYMlMyWlR1SmJ4aDJlUFhjCm9rZ2ZHVCtPayt2eCtoZnV6VTdqQkJKVjF1WGszZnMrQlh6aUhWN0dwN3lYVDJnNjlla3VDa08ycjFkY1ltaDgKdC8yamlvU2dyR0srS3dtSE5QQnFBYnViS1ZZOC9nQTN6eU5zOFU2cXRuUkdFbXlSN2pUVjdKcVI1MFMra0RGeQoxVWtDOWdMbDlCL3JmTm1XVmFuLzdJcjVtVWYvTlZvQ3FnVExpbHVIY1NtUnZhUzBlZzI5bXZWWEl3QUhJUmMvClNqblJCVWtMcDdZM2dhVmRqS296WG9Fb2ZLZDlKK3NBcm8wMwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMSBPPUhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5CiMgU3ViamVjdDogQ049SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMSBPPUhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5CiMgTGFiZWw6ICJIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDExIgojIFNlcmlhbDogMAojIE1ENSBGaW5nZXJwcmludDogNzM6OWY6NGM6NGI6NzM6NWI6Nzk6ZTk6ZmE6YmE6MWM6ZWY6NmU6Y2I6ZDU6YzkKIyBTSEExIEZpbmdlcnByaW50OiBmZTo0NTo2NTo5Yjo3OTowMzo1Yjo5ODphMTo2MTpiNTo1MToyZTphYzpkYTo1ODowOTo0ODoyMjo0ZAojIFNIQTI1NiBGaW5nZXJwcmludDogYmM6MTA6NGY6MTU6YTQ6OGI6ZTc6MDk6ZGM6YTU6NDI6YTc6ZTE6ZDQ6Yjk6ZGY6NmY6MDU6NDU6Mjc6ZTg6MDI6ZWE6YTk6MmQ6NTk6NTQ6NDQ6MjU6OGE6ZmU6NzEKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVNVENDQXhtZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRVUZBRENCbFRFTE1Ba0dBMVVFQmhNQ1IxSXgKUkRCQ0JnTlZCQW9UTzBobGJHeGxibWxqSUVGallXUmxiV2xqSUdGdVpDQlNaWE5sWVhKamFDQkpibk4wYVhSMQpkR2x2Ym5NZ1EyVnlkQzRnUVhWMGFHOXlhWFI1TVVBd1BnWURWUVFERXpkSVpXeHNaVzVwWXlCQlkyRmtaVzFwCll5QmhibVFnVW1WelpXRnlZMmdnU1c1emRHbDBkWFJwYjI1eklGSnZiM1JEUVNBeU1ERXhNQjRYRFRFeE1USXcKTmpFek5EazFNbG9YRFRNeE1USXdNVEV6TkRrMU1sb3dnWlV4Q3pBSkJnTlZCQVlUQWtkU01VUXdRZ1lEVlFRSwpFenRJWld4c1pXNXBZeUJCWTJGa1pXMXBZeUJoYm1RZ1VtVnpaV0Z5WTJnZ1NXNXpkR2wwZFhScGIyNXpJRU5sCmNuUXVJRUYxZEdodmNtbDBlVEZBTUQ0R0ExVUVBeE0zU0dWc2JHVnVhV01nUVdOaFpHVnRhV01nWVc1a0lGSmwKYzJWaGNtTm9JRWx1YzNScGRIVjBhVzl1Y3lCU2IyOTBRMEVnTWpBeE1UQ0NBU0l3RFFZSktvWklodmNOQVFFQgpCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFLbFRBT011cHZhTyttRFlMWlUrK0N3cVZFN051WVJobEZoUGp6Mkw1RVB6CmRZbU5VZVRETjlLS2lFMTVIcmNTM1VONFNvcVM1dGRJMVEra09pbEVOYmdIOW1nZFZjMDRVZkNNSkRHRnI0UEoKZmVsM3IrMGFlNTBYK2JPZE9GQVBwbHA1a1lDdk42Nm0wekg3dFNZSm5UeGE3MUhGSzkrV1hlc3lIZ0xhY0VucwpiZ3pJbWplTjkvRTJZRXNtTElLZTBIanpEUTlqcEZFdzRma3JKeElIMk9xOUdHS1lzRmszZmI3dTh5QlJRbHFECjc1TzZhUlh4WXAyZm1UbUNvYmQwTG92VXhRdDdML0RJQ3RvOWVRcWFreHlsS0hKemtVT2FwOUZOaFlTNXFYU1AKRkVESDNONnNRV1JzdEJtYkFtTnRKR1NQUkxJbDZzNWRkQXhqTWx5TmgrVUNBd0VBQWFPQmlUQ0JoakFQQmdOVgpIUk1CQWY4RUJUQURBUUgvTUFzR0ExVWREd1FFQXdJQkJqQWRCZ05WSFE0RUZnUVVwcEZDL1JOaFNpT2VDS1FwCjVkZ1RCQ1B1UVNVd1J3WURWUjBlQkVBd1BxQThNQVdDQXk1bmNqQUZnZ011WlhVd0JvSUVMbVZrZFRBR2dnUXUKYjNKbk1BV0JBeTVuY2pBRmdRTXVaWFV3Qm9FRUxtVmtkVEFHZ1FRdWIzSm5NQTBHQ1NxR1NJYjNEUUVCQlFVQQpBNElCQVFBZjczbEI0WHR1UDdLTWhqZENTazRjTng2Tlpyb2tnY2xQRWc4aHdBT1hoaVZ0WGRNaUthaHNvZzJwCjZ6MEdXNWs2eDh6RG1qUi9xdzdJVGh6aCt1VGN6UTIrdnlUK2JPZHJ3ZzNJQnA1T2pXRW9wbXI5NWZaaTZoZzgKVHFCVG5iSTZuT3VsbkpFV3RrMkM0QXdGU0tsczljejR5NTFKdFBBQ3BmMXdBKzJLSWFXdUU0Wkp3ek56dm9jNwpkSXNYUlNaTUZwR0QvbWQ5elUxalovcnpBeEtXZUFhTnNXZnRqaisrbjA4QzliTUpML05NaDk4cXk1VjhBY3lzCk5ucS9vbk42OTQvQnRacWhGTEtQTTU4Tjd5TGNabnVFdlVVWEJqMDh5cmwzTkkvSzZzOC9NVDdqaU9PQVNTWEkKbDdXZG1wbE5zRHo0U2dDYlpOMmZPVXZSSjllNAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049QWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBIE89QWN0YWxpcyBTLnAuQS4vMDMzNTg1MjA5NjcKIyBTdWJqZWN0OiBDTj1BY3RhbGlzIEF1dGhlbnRpY2F0aW9uIFJvb3QgQ0EgTz1BY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NwojIExhYmVsOiAiQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBIgojIFNlcmlhbDogNjI3MTg0NDc3MjQyNDc3MDUwOAojIE1ENSBGaW5nZXJwcmludDogNjk6YzE6MGQ6NGY6MDc6YTM6MWI6YzM6ZmU6NTY6M2Q6MDQ6YmM6MTE6ZjY6YTYKIyBTSEExIEZpbmdlcnByaW50OiBmMzo3MzpiMzo4NzowNjo1YToyODo4NDo4YTpmMjpmMzo0YTpjZToxOToyYjpkZDpjNzo4ZTo5YzphYwojIFNIQTI1NiBGaW5nZXJwcmludDogNTU6OTI6NjA6ODQ6ZWM6OTY6M2E6NjQ6Yjk6NmU6MmE6YmU6MDE6Y2U6MGI6YTg6NmE6NjQ6ZmI6ZmU6YmM6Yzc6YWE6YjU6YWY6YzE6NTU6YjM6N2Y6ZDc6NjA6NjYKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZ1ekNDQTZPZ0F3SUJBZ0lJVndvUmwwTEU0OHd3RFFZSktvWklodmNOQVFFTEJRQXdhekVMTUFrR0ExVUUKQmhNQ1NWUXhEakFNQmdOVkJBY01CVTFwYkdGdU1TTXdJUVlEVlFRS0RCcEJZM1JoYkdseklGTXVjQzVCTGk4dwpNek0xT0RVeU1EazJOekVuTUNVR0ExVUVBd3dlUVdOMFlXeHBjeUJCZFhSb1pXNTBhV05oZEdsdmJpQlNiMjkwCklFTkJNQjRYRFRFeE1Ea3lNakV4TWpJd01sb1hEVE13TURreU1qRXhNakl3TWxvd2F6RUxNQWtHQTFVRUJoTUMKU1ZReERqQU1CZ05WQkFjTUJVMXBiR0Z1TVNNd0lRWURWUVFLREJwQlkzUmhiR2x6SUZNdWNDNUJMaTh3TXpNMQpPRFV5TURrMk56RW5NQ1VHQTFVRUF3d2VRV04wWVd4cGN5QkJkWFJvWlc1MGFXTmhkR2x2YmlCU2IyOTBJRU5CCk1JSUNJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBZzhBTUlJQ0NnS0NBZ0VBcDhiRXBTbWtMTy9sR01Xd1VLTnYKVVR1ZkNsckp3a2c0Q3NJY29CaC9rYldIdVVBLzNSMW9Id2lEMVMwZWlLRDRqMWFQYlprQ2twQVcxVjhJYkluWAo0YXk4SU1LeDRJTlJpbWxOQUpaYWJ5L0FSSDZqRHVTUnpWanUzUHZISGtWSDNTZTVDQUdmcGlFZDlVRXRMMHo5CktLM2dpcTBpdEZabGpvWlVqNU5ES2Q0NVJuaWpNQ082emZCOUUxZkFYZEtEYTBoTXhLdWZnRnBiT3IzSnB5SS8KZ0Njeld3NjNpZ3hkQnpjSXkyelNla2NpUkRYRnpNd3VqdDBxN2JkOVpnMWZZVkVpVlJ2alJ1UGpQZEExWXByYgpyeFRJVzZITWlSdmhNQ2I4b0pzZmdhZEhId1Ryb3ptU0JwK1owNy9UNms5UW5Cbitsb2NlUEdYMm94Z2tnNFlRCjUxUStxRHAySkUrQkljWGpEd0w0azVSSElMdisxQTdUYUxuZHhIcUVndU5UVkhuZDI1elM4Z2ViTHJhOFB1MkYKYmU4bEVmS1hHa0poOTBxWDZJdXhFQWY2WllHeW9qblA5enovR1B2RzhWcUxXZUlDckh1UzBFNFVUMWxGOWd4ZQpLRit3NkQ5Rno4K3ZtMi83aE5OM1dwVnZySlNFbnU2OHdFcVBTcFA0UkNIaU1VVmhVRTRRMk9NMWZFd1p0TjRGCnY2TUduOGkxemVRZjF4Y0dEWHFWZEZVTmFCcjhFQnRpWkoxdDRKV2d3NVFIVncwVTVyMEYrN2lmNXQrTDRzYm4KZnBiMlU4V0FORkFvV1BBU1VIRVhNTHJtZUdPODlMS3RteXV5L3VFNWpGNjZDeUNVM251RHVQL2pWbzIzRWVrNwpqUEt4d1YyZHBBdE1LOW15R1BXMW4wc0NBd0VBQWFOak1HRXdIUVlEVlIwT0JCWUVGRkxZaURySW4zaG03WW56CmV6aHdsTWtDQWpiUU1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0h3WURWUjBqQkJnd0ZvQVVVdGlJT3NpZmVHYnQKaWZON09IQ1V5UUlDTnRBd0RnWURWUjBQQVFIL0JBUURBZ0VHTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElDQVFBTAplM0tId0dDbVNVeUlXT1lkaVBjVVpFaW0yRmdLRGs4VE5kODFIZFR0QmpISWdUNXExZDA3R2pMdWtEMFIwaTcwCmpzTmpMaU5tc0dlK2I3YkFFemxncXFJMEpaTjFVdDZubmEwT2g0bFNjV29XUEJrZGcvaWFLV1crOUQrYTJmRHoKV29jaGNZQk55K0E0bXorNyt1QXdUYytHMDJVUUdSalJsd0t4SzNKQ2FLeWd2VTVhMmhpL2E1aUIwUDJhdmw0VgpTTTBSRmJuQUtWeTA2SWozUGphdXQyTDlIbUxlY0hnUUhFaGIycnlrT0xwbjdWVStYbGZmMUFOQVRJR2swazlqCnB3bENDUlQ4QUtuQ2dITlBMc0JBMlJGN1NPcDZBc0RUNnlnQkpsaDB3Y0J6SW0yVGxmMDVmYnNxNC9hQzR5eVgKWDA0ZmtaVDYvaXlqMkhZYXVFMnlPRStiK2gxSVlIa200dlA5cWRDYTZIQ1BTWHJXNWIwS0R0c3Q4NDIvNitPawpmY3ZIbFhIbzJxTjh4Y0w0ZEpJRUc0YXNwQ0pUUUxhcy9reDJ6L3VVTXNBMW4zWS9idVdRYnFDbUpxSzRMTDdSCks0WDlwMmpJdWdFcnNXeDBIYmh6bGVmdXQ4Y2w4QUJNQUxKK3RndUxIUFBBVUo0bHVlQUkzalptL3plbDBidFUKWkN6Sko3VkxrbjVsLzlNdDRibE92SCtrUVNHUVFYZW1PUi9xbnVPZjBHWnZCZXlxZG42L2F4YWc2N1hIL0pKVQpMeXNSSnlVM2VFeFJhckR6ekZoZEZQRnFTQlgvd2dlMnNZMFBqbHhRUnJNOXZ3R1lUN0paVkVjK05IdDRiVmFUCkxuUHFaaWg0elIwVXY2Q1BMeTY0TG83eUZJck02YlY4KzJ5ZERLWGhsZz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBPPVRydXN0aXMgTGltaXRlZCBPVT1UcnVzdGlzIEZQUyBSb290IENBCiMgU3ViamVjdDogTz1UcnVzdGlzIExpbWl0ZWQgT1U9VHJ1c3RpcyBGUFMgUm9vdCBDQQojIExhYmVsOiAiVHJ1c3RpcyBGUFMgUm9vdCBDQSIKIyBTZXJpYWw6IDM2MDUzNjQwMzc1Mzk5MDM0MzA0NzI0OTg4OTc1NTYzNzEwNTUzCiMgTUQ1IEZpbmdlcnByaW50OiAzMDpjOTplNzoxZTo2YjplNjoxNDplYjo2NTpiMjoxNjo2OToyMDozMTo2Nzo0ZAojIFNIQTEgRmluZ2VycHJpbnQ6IDNiOmMwOjM4OjBiOjMzOmMzOmY2OmE2OjBjOjg2OjE1OjIyOjkzOmQ5OmRmOmY1OjRiOjgxOmMwOjA0CiMgU0hBMjU2IEZpbmdlcnByaW50OiBjMTpiNDo4Mjo5OTphYjphNToyMDo4ZjplOTo2MzowYTpjZTo1NTpjYTo2ODphMDozZTpkYTo1YTo1MTo5Yzo4ODowMjphMDpkMzphNjo3MzpiZTo4Zjo4ZTo1NTo3ZAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRFp6Q0NBaytnQXdJQkFnSVFHeCt0dGlENUpOTTJhL2ZIOFl5Z1dUQU5CZ2txaGtpRzl3MEJBUVVGQURCRgpNUXN3Q1FZRFZRUUdFd0pIUWpFWU1CWUdBMVVFQ2hNUFZISjFjM1JwY3lCTWFXMXBkR1ZrTVJ3d0dnWURWUVFMCkV4TlVjblZ6ZEdseklFWlFVeUJTYjI5MElFTkJNQjRYRFRBek1USXlNekV5TVRRd05sb1hEVEkwTURFeU1URXgKTXpZMU5Gb3dSVEVMTUFrR0ExVUVCaE1DUjBJeEdEQVdCZ05WQkFvVEQxUnlkWE4wYVhNZ1RHbHRhWFJsWkRFYwpNQm9HQTFVRUN4TVRWSEoxYzNScGN5QkdVRk1nVW05dmRDQkRRVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFECmdnRVBBRENDQVFvQ2dnRUJBTVZRZTU0N05kRGZ4SXpOanB2dG84QTJtZlJDNnFjK2dJTVBwcWRaaDhtUVJVTisKQU9xR2VTb0R2VDAzbVlsbXQrV0tWb2FUbkdoTGFBU01rNU1DUGpEU056b2lZWWtjaFU1OWo5V3ZlelgyZmloSAppVEhjRG5sa0g1blNXN3IrZjJDL3Jldm5QRGdwYWkvbGtRdFYvK3h2V05VdHlkNU1abkdQRE5jRTJnZm1IaGpqCnZTa0NxUG9jNFZ1NWc2aEJTTHdhY1kzbll1VXRzdXZmZk0vYnExcktNZkZNSXZNRkUvZUMrWE41REw3WFN4ekEKMFJVOGswRmswZWErSXhjaUFJbGVIMnVsckc2blM0enRvM0xtcjJOTkw0WFNGRFdhTGs2TTZqS1lLSWFoa1FsQgpPclRoNC9MNjhNa0tva0hkcWVNRHg0Z1ZPeHpVR3BUWG4yUlpFbTBDQXdFQUFhTlRNRkV3RHdZRFZSMFRBUUgvCkJBVXdBd0VCL3pBZkJnTlZIU01FR0RBV2dCUzYrbkVsZVl0WFFTVWhoZ3R4NjdKa0Rvc2haekFkQmdOVkhRNEUKRmdRVXV2cHhKWG1MVjBFbElZWUxjZXV5WkE2TElXY3dEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUJBSDVZLy8wMQpHWDJjR0UrZXNDdThqb3dVL3l5ZzJrZGJ3KytCTGE4RjZuUklXL00rVGdmSGJjV3prODhpTlZ5MlAzVW5Yd21XCnphRCt2a0FNWEJKVitKT0N5aW5wWGo5V1Y0czROdmRGR2t3b3paNUJ1TzFXVElTa1FNaTRzS1VyYVhBRWFzUDQKMUJJeStRN0RzZHd5aEVRc2I4dEdEK3BtUVE5UDhWaWxwZzBORDJIZXBaNWRmV1doUEJmbnFGVk83NkRIN2NaRQpmMVQxbytDUDhIeFZJbzhwdG9HajRXMU9MQnVBWit5dElKOE1ZbUhWbC85RDdTM0IybDBwS29VL3JHWHVoZzhGCmpaQmYzKzZmOUwvdUhmdVk1SCtRSzRSNEVBNXNTVlB2RlZ0bFJrcGRyN3I3T25JZHpmWWxpQjZYekNHY0tRRU4KWmV0WDJmTlhscnRJellFPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049QnV5cGFzcyBDbGFzcyAyIFJvb3QgQ0EgTz1CdXlwYXNzIEFTLTk4MzE2MzMyNwojIFN1YmplY3Q6IENOPUJ1eXBhc3MgQ2xhc3MgMiBSb290IENBIE89QnV5cGFzcyBBUy05ODMxNjMzMjcKIyBMYWJlbDogIkJ1eXBhc3MgQ2xhc3MgMiBSb290IENBIgojIFNlcmlhbDogMgojIE1ENSBGaW5nZXJwcmludDogNDY6YTc6ZDI6ZmU6NDU6ZmI6NjQ6NWE6YTg6NTk6OTA6OWI6Nzg6NDQ6OWI6MjkKIyBTSEExIEZpbmdlcnByaW50OiA0OTowYTo3NTo3NDpkZTo4NzowYTo0NzpmZTo1ODplZTpmNjpjNzo2YjplYjpjNjowYjoxMjo0MDo5OQojIFNIQTI1NiBGaW5nZXJwcmludDogOWE6MTE6NDA6MjU6MTk6N2M6NWI6Yjk6NWQ6OTQ6ZTY6M2Q6NTU6Y2Q6NDM6Nzk6MDg6NDc6YjY6NDY6YjI6M2M6ZGY6MTE6YWQ6YTQ6YTA6MGU6ZmY6MTU6ZmI6NDgKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZXVENDQTBHZ0F3SUJBZ0lCQWpBTkJna3Foa2lHOXcwQkFRc0ZBREJPTVFzd0NRWURWUVFHRXdKT1R6RWQKTUJzR0ExVUVDZ3dVUW5WNWNHRnpjeUJCVXkwNU9ETXhOak16TWpjeElEQWVCZ05WQkFNTUYwSjFlWEJoYzNNZwpRMnhoYzNNZ01pQlNiMjkwSUVOQk1CNFhEVEV3TVRBeU5qQTRNemd3TTFvWERUUXdNVEF5TmpBNE16Z3dNMW93ClRqRUxNQWtHQTFVRUJoTUNUazh4SFRBYkJnTlZCQW9NRkVKMWVYQmhjM01nUVZNdE9UZ3pNVFl6TXpJM01TQXcKSGdZRFZRUUREQmRDZFhsd1lYTnpJRU5zWVhOeklESWdVbTl2ZENCRFFUQ0NBaUl3RFFZSktvWklodmNOQVFFQgpCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFOZkhYdmZCQjlSMyswTWg5UFQxYWVUdU1nSGJvNFlmNUZrTnV1ZDFnMUxyCjZoeGhGVWk3SFFmS2pLNnczSmFkNnNOZ2tvYUNLSE9jVmdiL1MyVHdEQ28zU2JYbHp3eDg3dkZLdTNNd1pmUFYKTDRPMmZ1UG45WjZyWVBuVDhaMlNkSXJrSEphc1c0RHB0ZlF4aDZOUi9NZCtvVytPVTNmVWw4RlZNNUkrR0M5MQoxSzJHU2N1VnIxUUdiTmdHRTQxYi8rRW1HVm5BSkxxQmNYbVFSRkJvSkpSZnVMTVI4U2xCWWFOQnl5TTIxY0h4Ck1sQVFUbi8waHBQc2hOT092RXUvWEFGT0J6M2NGSXFVQ3FUcWMvc0xVZWdUQnhqNkR2RXIwVlFWZlR6aDk3UVoKUW1kaVhuZmdvbFhzdHRscEY5VTZyMFR0U3NXZTVIb25mT1YxMTZyTEplZmZhd3JiRDAyVFRxaWd6WHN1OGxrQgphcmNOdUFlQmZvczRHemptQ2xlWlBlNGg2S1AxREJiZGkrdzBqcHdxSEFBVkY0MW9nOUp3bnhnSXpSRm8xY2xyClVzM0VSby9jdGZQWVYzTWU2WlE1QkwvVDNqamV0RlBzYVJ5aWZzU1A1QnR3cmZLaStmdjNGbVJtYVo5SlVhTGkKRlJobkJrcC8xV3kxVGJNejRHSHJYYjdwbUE4eTF4MUxQQzVhQVZLUkNmTGY2bzNZQmtCanFoSGsvc00zbmhSUwpQL1RpelBKaGs5SDlaMnZYVXE2L2FLdEFRNkJYTlZONDhGUDRZVUlIWk1iWGI1dE1PQTFqckdLdk5vdWljd29OCjlTRzlkS3BONm5JRFNkdkhYeDFpWThmOTNaSHNNKzcxYmJSdU1HamV5Tlltc0hWZWU3UUhJSmloZGpLNFRXeFAKQWdNQkFBR2pRakJBTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SFFZRFZSME9CQllFRk1tQWQrQmlrb0wxUnB6egp1dmRNdzk2NG82MDVNQTRHQTFVZER3RUIvd1FFQXdJQkJqQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FnRUFVMThoCjlicXdPbEk1TEpLd2JBREo3ODRnN3dieWxwN3BwSFIvZWhiOHQvVzIreFViUDZ1bXdISmRFTEZ4N3J4UDQ2MnMKQTIwdWNTNnZ4T090bzcwTUVhZTAvMHF5ZXhBUUg2ZFhRYkxBcnZRc1dkWkhFSWp6SVZFcE1NcGdocTlHcXgzdApPbHV3bE41RTQwRUlvc0hzSGRiOVQ3YldSOUFVQzhybXlyVjdkMzVCSDE2RHg3YU1PWmF3UDVhQlFXOWdrT0xvCitmc2ljZGw5c3oxR3Y3U0VyNUFjRDQ4U2FxL3Y3aDU2cmdKS2loY3JkdjZzVklra0xFOC90cktuVG95b2taZjcKS2NaN1hDMjV5MmEydDZoYkVsR0Z0UWwrWW5ody9xbHFZTFlkRG5rTS9jcnFKSUJ5dzVjLzhuZXJReUlLeCt1MgpESVNDTElCclFZb0l3T3VsYTkrWkVzdUsxVjZBREpIZ0pnZzJTTVg2T0JFMS95V0RMZko2djlyOWp2Nmx5MFVzCkg4U0lVNjUzRHRtYWRzV09MQjJqdXRYc01xN0FxcXozMFhwTjY5UUg0a2ozSW82d3BKOXF6bzZ5c21EMG95TFEKSSt1VVducHAzUSsvUUZlc2ExbFEyYU9aNFc3K2pRRjVKeU1WM3BLZGV3bE5XdWRMU0RCYUdPWUtiZWFQNE5LNwo1dDk4YmlHQ3dXZzVUYlNZV0daaXpFcVFYc1A2SndTeGVSVjBtY3krclNEZUptQWM2MVpScHFQcTVLTS9wLzloCjNQRmFUV3d5STBQdXJLanU3a29TQ1R4ZGNjSytlZnJDaDJnZEMvMWNhY3dHMEpwOVZKa3F5VGthR2E5TEtrUHoKWTExYVdPSXY0eDNrcWRiUUN0Q2V2OWVCQ2ZISnh5WU5ySmdXVnFBPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049QnV5cGFzcyBDbGFzcyAzIFJvb3QgQ0EgTz1CdXlwYXNzIEFTLTk4MzE2MzMyNwojIFN1YmplY3Q6IENOPUJ1eXBhc3MgQ2xhc3MgMyBSb290IENBIE89QnV5cGFzcyBBUy05ODMxNjMzMjcKIyBMYWJlbDogIkJ1eXBhc3MgQ2xhc3MgMyBSb290IENBIgojIFNlcmlhbDogMgojIE1ENSBGaW5nZXJwcmludDogM2Q6M2I6MTg6OWU6MmM6NjQ6NWE6ZTg6ZDU6ODg6Y2U6MGU6Zjk6Mzc6YzI6ZWMKIyBTSEExIEZpbmdlcnByaW50OiBkYTpmYTpmNzpmYTo2Njo4NDplYzowNjo4ZjoxNDo1MDpiZDpjNzpjMjo4MTphNTpiYzphOTo2NDo1NwojIFNIQTI1NiBGaW5nZXJwcmludDogZWQ6Zjc6ZWI6YmM6YTI6N2E6MmE6Mzg6NGQ6Mzg6N2I6N2Q6NDA6MTA6YzY6NjY6ZTI6ZWQ6YjQ6ODQ6M2U6NGM6Mjk6YjQ6YWU6MWQ6NWI6OTM6MzI6ZTY6YjI6NGQKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZXVENDQTBHZ0F3SUJBZ0lCQWpBTkJna3Foa2lHOXcwQkFRc0ZBREJPTVFzd0NRWURWUVFHRXdKT1R6RWQKTUJzR0ExVUVDZ3dVUW5WNWNHRnpjeUJCVXkwNU9ETXhOak16TWpjeElEQWVCZ05WQkFNTUYwSjFlWEJoYzNNZwpRMnhoYzNNZ015QlNiMjkwSUVOQk1CNFhEVEV3TVRBeU5qQTRNamcxT0ZvWERUUXdNVEF5TmpBNE1qZzFPRm93ClRqRUxNQWtHQTFVRUJoTUNUazh4SFRBYkJnTlZCQW9NRkVKMWVYQmhjM01nUVZNdE9UZ3pNVFl6TXpJM01TQXcKSGdZRFZRUUREQmRDZFhsd1lYTnpJRU5zWVhOeklETWdVbTl2ZENCRFFUQ0NBaUl3RFFZSktvWklodmNOQVFFQgpCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFLWGFDcFVXVU9PVjhsNmRkakVHTW5xYjhSQjJ1QUNhdFZJMnpTUkhzSjhZClpMeWE5dnJWZWRpUVlrd2lMOTQ0UGRiZ3FPa2NMTnQ0RWVtT2FGRVZjc2Z6TTRma29GMExYT0JYQnlvdzljM0UKTjNjb1RSaVI1ci9WVXYxeExYQSs1OGJFaXVQd0tBdjBkcGloaTRkVnNqb1QvTGMrSnplT0l1T29UeXJ2WUxzOQp0em5ERGdGSG1WMFNUOXREK2xlaDdmbWR2aEZISmxzVG1LdGRGb3F3Tnh4WG5VWC9pSlkydjd2S0IzdHZoMlBYCjBESnExbDFzRFBHemJqbmlhekV1T1FBbkZONDR3T3daWm9ZUzZKMXlGaE5rVXNlcE54ejlnakR0aEJnZDlLNWMKLzNBVEFPdXg5VE42UzlaVitBV05TMm13OWJNb05sd1V4RkZ6VFdzTDhUUUgyeGM1MTl3b2UydjFuL011d1U4WApLaER6ek1ybzYvMXJxeTZhbnkyQ2JnVFVVZ0dUTFQyRy9INzgzKzlDSGFacjc3a2d4dmU5b0tlVi9hZm1pU1RZCnpJdzBiT0lqTDlrU0dpRzVWWkZ2QzVGNUdReXRRSWdMY09KNjBnN1lhRWk3Z2hNNUVGanAyQ29IeGhMYldOdlMKTzFVUVJ3VVZaMkorR0dPbVJqOEpEbFF5WHI4Tllub243NERvMjlsTEJsbzNXaVhRQ0JKMzFHOEpVSmM5eUIzRAozNHhGTUZiRzAyU3JadlBBWHBhY3c4VHZ3M3hyaXpwNWY3Tkp6ejNpaVorZ01FdUZ1WnlVSkhtUGZXdXBSV2dQCks5RHgyaHpMYWJqS1NXSnR5TkJqWXQxZ0QxaXFqNkc4QmFWbW9zOGJkcktFWkxGTU9WTEFNTHJ3akVzQ3NMYTMKQWdNQkFBR2pRakJBTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SFFZRFZSME9CQllFRkVlNHpmL2xiKzc0c3V3dgpUZzc1SmJDT1BHdkRNQTRHQTFVZER3RUIvd1FFQXdJQkJqQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FnRUFBQ0FqClFUVUVrTUpBWW1EdjRqVk0xeitzNGpTUXVLRnZkdm9XRnFSSU55enBrTUx5UFBnS245aUI1YnRiMmlVc3BLZFYKY1NReTlzZ0w4cnhxK0pPc3NnZkNYNS9iek1pS3FyNXFiK0ZKRU13eDE0Qzd1OGpZb2c1a1YrcWk5Y0twTVJYUwpJR3JzL0NJQktNK0d1SUFlcWN3UnBUenlGck5IbmZ6U2dDSEV5OUJIY0VHaHlvTVpDQ3h0OGwxM25Jb1VFOVEyCkhKTHc1UVkzM0tibWtKczRqMXhyRzBhR1EwSmZQZ0VIVTFSZFpYMzNpbk9obWxSYUh5bERGQ2ZDaFErMWlIc2EKTzVTM0hXQ250WnpuS1dsWFdwdVRla013R3dQWFlzaEFwcXI4Wk9SSzE1RlRBYWdnaUc2Y1gwUzV5MkNCTk94dgowMzNhU0YvcnRKQzhMYWtjQzZ3YzFhSm9JSUFFMXZ5eGp5KzdTakVOU29ZYzYrSTJLU2IxMnRqRThuVmh6MzZ1CmRtTktla0JsazRmNEhvQ01odVdHMW84Ty9GTXNZT2dXWVJxaVBrTjd6VGxnVkdyMThva21BV2lEU0tJejZNa0UKa2JJUk5CRSs2dEJER1I4RGs1QU0vMUU5Vi9SQmJ1SExvTDdyeVdQTmJjemsrRGFxYUozdHZWMlhjRVFOdGc0MQozT0VNWGJ1Z1VaVExmaGJyRVMramtrWElUSEhadk1tWlVsZEdMMURQdlRWcDlEMFZ6Z2FsTEE4KzlvRzZsTHZECnU3OWxlTktHZWY5Sk94cUREUERlZU96SThrMU1HdDZDS2ZqQld0cnQ3dVluWHVoRjBKMGNVYWhvcTBUajBJdHEKNC9nN3U5eE4xMlR5VWI3bXFxdGE2VEh1QnJ4enZ4TmlDcC9IdVpjPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049VC1UZWxlU2VjIEdsb2JhbFJvb3QgQ2xhc3MgMyBPPVQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkggT1U9VC1TeXN0ZW1zIFRydXN0IENlbnRlcgojIFN1YmplY3Q6IENOPVQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMgTz1ULVN5c3RlbXMgRW50ZXJwcmlzZSBTZXJ2aWNlcyBHbWJIIE9VPVQtU3lzdGVtcyBUcnVzdCBDZW50ZXIKIyBMYWJlbDogIlQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMiCiMgU2VyaWFsOiAxCiMgTUQ1IEZpbmdlcnByaW50OiBjYTpmYjo0MDphODo0ZTozOTo5Mjo4YToxZDpmZTo4ZToyZjpjNDoyNzplYTplZgojIFNIQTEgRmluZ2VycHJpbnQ6IDU1OmE2OjcyOjNlOmNiOmYyOmVjOmNkOmMzOjIzOjc0OjcwOjE5OjlkOjJhOmJlOjExOmUzOjgxOmQxCiMgU0hBMjU2IEZpbmdlcnByaW50OiBmZDo3MzpkYTpkMzoxYzo2NDo0ZjpmMTpiNDozYjplZjowYzpjZDpkYTo5Njo3MTowYjo5YzpkOTo4Nzo1ZTpjYTo3ZTozMTo3MDo3YTpmMzplOTo2ZDo1MjoyYjpiZAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRHd6Q0NBcXVnQXdJQkFnSUJBVEFOQmdrcWhraUc5dzBCQVFzRkFEQ0JnakVMTUFrR0ExVUVCaE1DUkVVeApLekFwQmdOVkJBb01JbFF0VTNsemRHVnRjeUJGYm5SbGNuQnlhWE5sSUZObGNuWnBZMlZ6SUVkdFlrZ3hIekFkCkJnTlZCQXNNRmxRdFUzbHpkR1Z0Y3lCVWNuVnpkQ0JEWlc1MFpYSXhKVEFqQmdOVkJBTU1IRlF0VkdWc1pWTmwKWXlCSGJHOWlZV3hTYjI5MElFTnNZWE56SURNd0hoY05NRGd4TURBeE1UQXlPVFUyV2hjTk16TXhNREF4TWpNMQpPVFU1V2pDQmdqRUxNQWtHQTFVRUJoTUNSRVV4S3pBcEJnTlZCQW9NSWxRdFUzbHpkR1Z0Y3lCRmJuUmxjbkJ5CmFYTmxJRk5sY25acFkyVnpJRWR0WWtneEh6QWRCZ05WQkFzTUZsUXRVM2x6ZEdWdGN5QlVjblZ6ZENCRFpXNTAKWlhJeEpUQWpCZ05WQkFNTUhGUXRWR1ZzWlZObFl5QkhiRzlpWVd4U2IyOTBJRU5zWVhOeklETXdnZ0VpTUEwRwpDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQzlkWlB3WWlKdkpLN2dlbmFzZmIzWkpOVzR0L3pOCjhFTGc2M2lJVmw2Ym1sUWRUUXlLOXRQUGNQUlN0ZGlUQk9OR2huRkJTaXZ3S2l4VkE5Wkl3K0E1T08zeVhEdy8KUkx5VFBXR3JUczBOdnZBZ0oxZ09SSDhFR29lbDE1WVVOcERRU1h1aGRmc2FhM094K002cENTenlVOVhERkVTNApocVgyaXlzNTJxTXpWTm42Y2hyM0loVWNpSkZyZjJibHcycUFzQ1R6MzRaRmlQMFpmM1dISHgreEd3cHpKRnU1ClplQXNWTWhnMDJZWFArSE1WRE56a1FJNnBuOTdkam1pSDVhMk9LNjF5Sk4wSFo2NXRPVmduUzlXMGVEclhsdE0KRW5BTWJFUWdxeEhZOUJuMjBweFNOK2Y2dHNJeE8wclVGSm10eHhyMVhWLzZCN2g4RFIvV2d4NnpBZ01CQUFHagpRakJBTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RGdZRFZSMFBBUUgvQkFRREFnRUdNQjBHQTFVZERnUVdCQlMxCkEvZDJPMkdDYWhLcUdGUHJBeUdVdi83T3lqQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FRRUFWajN2bE5XOTJuT3kKV0w2dWtLMllKNWYrQWJHd1VnQzRUZVFiSVhRYmZzRHVYbWtxSmE5YzFoM2Ewbm5KODVjcDRJYUgzZ1JaRC9GWgoxR1NGUzVtdkpRUWV5VWFwbDk2Q3NodHduNXoycjNFeDNYc0ZwU3pUdWNwSDlzcnk5dWV0dVVnL3ZCYTN3VzMwCjZnbXY3UE8xNXdXZXBoNktVMUhXazRITWRKUDJ1ZHFtSlFWMGVWcCtRRDZDU3lZUk1HN2hQMEhIUndBMTFmWFQKOTFRK2dUM2FTV3Fhcys4UVBlYnJiOUhJSWtmTHpNOEJNWkxaR09NaXZna2VHajVhc3VSckRGUjZmVU5PdUltbAplOWVpUFphR3pQSW1OQzFxa3AyYUd0QXc0bDFPQkxCZml5QitkOEU5bFlMUlJwbzdQSGk0YjZIUURXU2llQjRwClRwUERwRlFVV3c9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049RUUgQ2VydGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQSBPPUFTIFNlcnRpZml0c2VlcmltaXNrZXNrdXMKIyBTdWJqZWN0OiBDTj1FRSBDZXJ0aWZpY2F0aW9uIENlbnRyZSBSb290IENBIE89QVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1cwojIExhYmVsOiAiRUUgQ2VydGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQSIKIyBTZXJpYWw6IDExMjMyNDgyODY3NjIwMDI5MTg3MTkyNjQzMTg4ODQ5NDk0NTg2NgojIE1ENSBGaW5nZXJwcmludDogNDM6NWU6ODg6ZDQ6N2Q6MWE6NGE6N2U6ZmQ6ODQ6MmU6NTI6ZWI6MDE6ZDQ6NmYKIyBTSEExIEZpbmdlcnByaW50OiBjOTphODpiOTplNzo1NTo4MDo1ZTo1ODplMzo1Mzo3NzphNzoyNTplYjphZjpjMzo3YjoyNzpjYzpkNwojIFNIQTI1NiBGaW5nZXJwcmludDogM2U6ODQ6YmE6NDM6NDI6OTA6ODU6MTY6ZTc6NzU6NzM6YzA6OTk6MmY6MDk6Nzk6Y2E6MDg6NGU6NDY6ODU6Njg6MWY6ZjE6OTU6Y2M6YmE6OGE6MjI6OWI6OGE6NzYKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVBekNDQXV1Z0F3SUJBZ0lRVklENW9IUHRQd0JNeW9uWTQzSG1TakFOQmdrcWhraUc5dzBCQVFVRkFEQjEKTVFzd0NRWURWUVFHRXdKRlJURWlNQ0FHQTFVRUNnd1pRVk1nVTJWeWRHbG1hWFJ6WldWeWFXMXBjMnRsYzJ0MQpjekVvTUNZR0ExVUVBd3dmUlVVZ1EyVnlkR2xtYVdOaGRHbHZiaUJEWlc1MGNtVWdVbTl2ZENCRFFURVlNQllHCkNTcUdTSWIzRFFFSkFSWUpjR3RwUUhOckxtVmxNQ0lZRHpJd01UQXhNRE13TVRBeE1ETXdXaGdQTWpBek1ERXkKTVRjeU16VTVOVGxhTUhVeEN6QUpCZ05WQkFZVEFrVkZNU0l3SUFZRFZRUUtEQmxCVXlCVFpYSjBhV1pwZEhObApaWEpwYldsemEyVnphM1Z6TVNnd0pnWURWUVFEREI5RlJTQkRaWEowYVdacFkyRjBhVzl1SUVObGJuUnlaU0JTCmIyOTBJRU5CTVJnd0ZnWUpLb1pJaHZjTkFRa0JGZ2x3YTJsQWMyc3VaV1V3Z2dFaU1BMEdDU3FHU0liM0RRRUIKQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUURJSU1EczRNVkxxd2Q0bGZORTd2c0xEUDkwam1HN3NXTHFJOWlyb1dVeQpldXVPRjArVzJBcDdrYUpqYk1lTVRDNTV2NmtGL0dsY2xZMWkrYmx3N2NOUmZkQ1Q1bXpyTUV2aHZIMi9VcHZPCmJudGw4aml4d0tJeTcyS3lhT0JoVThFMmxmL3NsTG8ycnB3Y3B6SVA1WHkweG05MC9Yc1k2S3hYN1FZZ1N6SXcKV0Z2OXpham1vZnh3dkk2U2M5dVhwM3docmozQjlVaUhiQ2U5bnlWMGdWV3c5M1gyUGFSa2E5WlA1ODVBclEvZApNdE84aWhKVG1NbUoreEFkVFg3TmZoOVdEU0Z3aGZZZ2d4LzJ1aDhFaitwM2lEWEUvK3BPb1l0TlAyTWJSTU5FCjFDVjJ5cmVOMXg1S1ptVE5YTVdjZytIQ0NJaWE3RTZqOFQ0Y0xObHNIYUZMQWdNQkFBR2pnWW93Z1ljd0R3WUQKVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DQVFZd0hRWURWUjBPQkJZRUZCTHlXajdxVmh5Lwp6UWFzOGZFbHlhbEwxQlNaTUVVR0ExVWRKUVErTUR3R0NDc0dBUVVGQndNQ0JnZ3JCZ0VGQlFjREFRWUlLd1lCCkJRVUhBd01HQ0NzR0FRVUZCd01FQmdnckJnRUZCUWNEQ0FZSUt3WUJCUVVIQXdrd0RRWUpLb1pJaHZjTkFRRUYKQlFBRGdnRUJBSHYyNU1BTnFobEh0MDFYby82dHU3RnExUStlMitSanhZNmhVRmFUbHJnNHdDUWlacnhURkdHVgp2OURIS3BZNVAzMG9zeEJBSVdyRXI3QlNkeGpobHRoV1hlUGRObDRkcDFCVW9NVXE1S3FNbElwUG5UWC9kcVFHCkU1R2lvbjBBUkQ5VjA0SThHdFZidkZaTUlpNUdRNG9rUUMzekVyZzdjQnFrbHJrYXI0ZEJHbW9ZRFFaUHh6NXUKdVNsTkRVbUpFWWN5VytaTEJNamtYT1owYzVSZEZwZ1RsZjc3MjdGRTVUcHdyRGRyNXJNemNpakpzMWVnOWdJVwppQVlMdHFaTElDalUzajJMclRjRlUzVCtic3k4UXhkeFh2bkZ6QnFwWWU3M2RnenpjdlJ5cmM5eUFqWUhSOC92CkdWQ0pZTXpwSkpVUHdzc2Q4bTkya01mTWRjR1d4WjA9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1ELVRSVVNUIFJvb3QgQ2xhc3MgMyBDQSAyIDIwMDkgTz1ELVRydXN0IEdtYkgKIyBTdWJqZWN0OiBDTj1ELVRSVVNUIFJvb3QgQ2xhc3MgMyBDQSAyIDIwMDkgTz1ELVRydXN0IEdtYkgKIyBMYWJlbDogIkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOSIKIyBTZXJpYWw6IDYyMzYwMwojIE1ENSBGaW5nZXJwcmludDogY2Q6ZTA6MjU6Njk6OGQ6NDc6YWM6OWM6ODk6MzU6OTA6Zjc6ZmQ6NTE6M2Q6MmYKIyBTSEExIEZpbmdlcnByaW50OiA1ODplODphYjpiMDozNjoxNTozMzpmYjo4MDpmNzo5YjoxYjo2ZDoyOTpkMzpmZjo4ZDo1ZjowMDpmMAojIFNIQTI1NiBGaW5nZXJwcmludDogNDk6ZTc6YTQ6NDI6YWM6ZjA6ZWE6NjI6ODc6MDU6MDA6NTQ6YjU6MjU6NjQ6YjY6NTA6ZTQ6ZjQ6OWU6NDI6ZTM6NDg6ZDY6YWE6Mzg6ZTA6Mzk6ZTk6NTc6YjE6YzEKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVNekNDQXh1Z0F3SUJBZ0lEQ1lQek1BMEdDU3FHU0liM0RRRUJDd1VBTUUweEN6QUpCZ05WQkFZVEFrUkYKTVJVd0V3WURWUVFLREF4RUxWUnlkWE4wSUVkdFlrZ3hKekFsQmdOVkJBTU1Ia1F0VkZKVlUxUWdVbTl2ZENCRApiR0Z6Y3lBeklFTkJJRElnTWpBd09UQWVGdzB3T1RFeE1EVXdPRE0xTlRoYUZ3MHlPVEV4TURVd09ETTFOVGhhCk1FMHhDekFKQmdOVkJBWVRBa1JGTVJVd0V3WURWUVFLREF4RUxWUnlkWE4wSUVkdFlrZ3hKekFsQmdOVkJBTU0KSGtRdFZGSlZVMVFnVW05dmRDQkRiR0Z6Y3lBeklFTkJJRElnTWpBd09UQ0NBU0l3RFFZSktvWklodmNOQVFFQgpCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFOT3lTczk2Uis5MW15UDZPaS9XVUVXSk5UckdhOXYrMndCb3FPQURFUjAzClVBaWZUVXBvbERXelU5R1VZNmNnVnEvZVVYanNLajN6U0VoUVBncmZSbFdMSjIzREVFME5rVkpEMklmZ1hVNDIKdFNIS1h6bEFCRjliZnN5anhpdXBRQjdaTm9UV1NQT1NIalJHSUNUQnBGR09TaHJ2VUQ5cFhSbC9SY1BIQVk5Ugp5U1BvY3E2MHZGWUpmeExMSExHdktaQUt5VlhNRDlPMEd1MUhOVnBLN1p4ekJDSFFxcjBNRTdVQXlpWnN4R3NNCmxGcVZsTnBRbXZIL3BTdG1NYVRKT0tEZkhSKzRDUzd6cCtoblVxdVZIK0JHUHRpa3c4cGF4VEdBNkVpYW41UnAKL2huZDJITjhnY3FXM283dHN6SUZaWVEwNXViOVZ4QzFYM2EvTDdBUURjVUNBd0VBQWFPQ0FSb3dnZ0VXTUE4RwpBMVVkRXdFQi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZQM2FGTVNmTU40aHZSNUNPZnlyWXlOSjRQR0VNQTRHCkExVWREd0VCL3dRRUF3SUJCakNCMHdZRFZSMGZCSUhMTUlISU1JR0FvSDZnZklaNmJHUmhjRG92TDJScGNtVmoKZEc5eWVTNWtMWFJ5ZFhOMExtNWxkQzlEVGoxRUxWUlNWVk5VSlRJd1VtOXZkQ1V5TUVOc1lYTnpKVEl3TXlVeQpNRU5CSlRJd01pVXlNREl3TURrc1R6MUVMVlJ5ZFhOMEpUSXdSMjFpU0N4RFBVUkZQMk5sY25ScFptbGpZWFJsCmNtVjJiMk5oZEdsdmJteHBjM1F3UTZCQm9EK0dQV2gwZEhBNkx5OTNkM2N1WkMxMGNuVnpkQzV1WlhRdlkzSnMKTDJRdGRISjFjM1JmY205dmRGOWpiR0Z6YzE4elgyTmhYekpmTWpBd09TNWpjbXd3RFFZSktvWklodmNOQVFFTApCUUFEZ2dFQkFIK1gyekRJMzZTY2ZTRjZnSERPRkJKcGlCU1ZZRVFCckxMcE1FK2JVTUptMkg2Tk1MVndNZW5pCmFjZnpjTnNnRlliUURmQytyQUYxaE01K24wMi90MkE3blBQS0hlSmVhTmlqblpmbFFHRFNOaUgrMExTNEY5cDAKbzMvVTM3Q1lBcXh2YTJzc0pTUnlvV1h1SlZybDVqTG44dCtyU2ZyemtHa2oyd1RaNTF4WS9HWFVsNzdNL0M0Swp6Q1VxTlFUNFlKRVZkVDFCL3lNZkdjaHM2NEpUQktia1RDSk5qWXk2emx0ejdHUlVVRzNSbkZYN2FjTTJ3NHk4ClBJV21hd29tRGVDVG1HQ3Vmc1lrbDRwaFg1R09acElKaHpiTmk1c3RQdlpSMUZEVVdTaTlnL0xNS0h0VGhtM1kKSm9odzErcVJ6VDY1eXNDUWJsckdYblJsMTF6K28rST0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOSBPPUQtVHJ1c3QgR21iSAojIFN1YmplY3Q6IENOPUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOSBPPUQtVHJ1c3QgR21iSAojIExhYmVsOiAiRC1UUlVTVCBSb290IENsYXNzIDMgQ0EgMiBFViAyMDA5IgojIFNlcmlhbDogNjIzNjA0CiMgTUQ1IEZpbmdlcnByaW50OiBhYTpjNjo0MzoyYzo1ZToyZDpjZDpjNDozNDpjMDo1MDo0ZjoxMTowMjo0ZjpiNgojIFNIQTEgRmluZ2VycHJpbnQ6IDk2OmM5OjFiOjBiOjk1OmI0OjEwOjk4OjQyOmZhOmQwOmQ4OjIyOjc5OmZlOjYwOmZhOmI5OjE2OjgzCiMgU0hBMjU2IEZpbmdlcnByaW50OiBlZTpjNTo0OTo2Yjo5ODo4YzplOTo4NjoyNTpiOTozNDowOToyZTplYzoyOTowODpiZTpkMDpiMDpmMzoxNjpjMjpkNDo3MzowYzo4NDplYTpmMTpmMzpkMzo0ODo4MQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRVF6Q0NBeXVnQXdJQkFnSURDWVAwTUEwR0NTcUdTSWIzRFFFQkN3VUFNRkF4Q3pBSkJnTlZCQVlUQWtSRgpNUlV3RXdZRFZRUUtEQXhFTFZSeWRYTjBJRWR0WWtneEtqQW9CZ05WQkFNTUlVUXRWRkpWVTFRZ1VtOXZkQ0JECmJHRnpjeUF6SUVOQklESWdSVllnTWpBd09UQWVGdzB3T1RFeE1EVXdPRFV3TkRaYUZ3MHlPVEV4TURVd09EVXcKTkRaYU1GQXhDekFKQmdOVkJBWVRBa1JGTVJVd0V3WURWUVFLREF4RUxWUnlkWE4wSUVkdFlrZ3hLakFvQmdOVgpCQU1NSVVRdFZGSlZVMVFnVW05dmRDQkRiR0Z6Y3lBeklFTkJJRElnUlZZZ01qQXdPVENDQVNJd0RRWUpLb1pJCmh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBSm54aERSd3VpKzNNS0NPdlh3RXo3NWl2Sm45Z3BmU2VncG4KbGpnSjloQk9sU0p6bVkzYUZTM25CZndaY3lLM2pwZ0F2RHc5cktGcys5WjVKVXV0OE14azJvZytLYmdQQ2RNMAozVFAxWXRIaHpSbnA3aGhQVEZpdTRoN1dERnNWV3RnNnVNUVlaQjdqTTdLMWlYZE9ETC9abEdzVGwyOFNvLzZaCnFRVE1GZXhnYURidENIdTM5YitUN1dZeGc0ekdjVFNIVGhmcXI0dVJqUnhXUWE0aU4xNDM4aDNaMFMwTkwybFIKcDc1bXBvbzZLcjNIR3JIaEZQQytPaDI1ejF1eGF2NjBzVVlnb3ZzZU8zRHZrNWg5akhPVzhzWHZoWEN0S1NiOApIZ1ErSEtEWUQ4dFNnMko4N290VGxaQ3BWNkxxWVFYWStVM0VKL3B1cmUzNTExSDNhNlVDQXdFQUFhT0NBU1F3CmdnRWdNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdIUVlEVlIwT0JCWUVGTk9VaWt4aUV5b1pMc3l2Y29wOU50ZWEKSE54bk1BNEdBMVVkRHdFQi93UUVBd0lCQmpDQjNRWURWUjBmQklIVk1JSFNNSUdIb0lHRW9JR0JobjlzWkdGdwpPaTh2WkdseVpXTjBiM0o1TG1RdGRISjFjM1F1Ym1WMEwwTk9QVVF0VkZKVlUxUWxNakJTYjI5MEpUSXdRMnhoCmMzTWxNakF6SlRJd1EwRWxNakF5SlRJd1JWWWxNakF5TURBNUxFODlSQzFVY25WemRDVXlNRWR0WWtnc1F6MUUKUlQ5alpYSjBhV1pwWTJGMFpYSmxkbTlqWVhScGIyNXNhWE4wTUVhZ1JLQkNoa0JvZEhSd09pOHZkM2QzTG1RdApkSEoxYzNRdWJtVjBMMk55YkM5a0xYUnlkWE4wWDNKdmIzUmZZMnhoYzNOZk0xOWpZVjh5WDJWMlh6SXdNRGt1ClkzSnNNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUJBUUEwN1h0YVBLU1VpTzhhRVhVSEw3UCtQUG9lVVNicmgvWXAKM3VEeDFNWWtDZW5CejFVYnRERFp6aHIrQmxHbUZhUXQ3N0pMdnlBb0pVblJwalozTk9oazMxS3hFY2R6ZXMwNQpuc0t0akhFaDhscHJyOTg4VGxXdnNvUmxGSW01ZDhzcU1iN1BvMjNQYjBpVU1rWnY1M0dNb0thRUdUY0g4Z05GCkNTdUdkWHpmWDJsWEFOdHUyS1p5SWt0UTFIV1lWdCszR1A5RFExQ3Vla1I3OEhsUjEwTTlwOU9CMC9ESlQ3bmEKeHBlRzBJTEQ1RUp0L3JEaVpFNE9KdWRBTkNhMUNJblhDR05qT0NkMUhqUHFicWpkbjVsUGRFMkJpWUJMM1pxWApLVnd2dm9GQnVZei82bjFnQnA3TjF6M1RMcU1WdktqbUp1VnZ3OXk0QXlIcW54YnhMRlMxCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1DQSBEaXNpZyBSb290IFIyIE89RGlzaWcgYS5zLgojIFN1YmplY3Q6IENOPUNBIERpc2lnIFJvb3QgUjIgTz1EaXNpZyBhLnMuCiMgTGFiZWw6ICJDQSBEaXNpZyBSb290IFIyIgojIFNlcmlhbDogMTA1NzIzNTA2MDIzOTMzMzgyMTEKIyBNRDUgRmluZ2VycHJpbnQ6IDI2OjAxOmZiOmQ4OjI3OmE3OjE3OjlhOjQ1OjU0OjM4OjFhOjQzOjAxOjNiOjAzCiMgU0hBMSBGaW5nZXJwcmludDogYjU6NjE6ZWI6ZWE6YTQ6ZGU6ZTQ6MjU6NGI6Njk6MWE6OTg6YTU6NTc6NDc6YzI6MzQ6Yzc6ZDk6NzEKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGUyOjNkOjRhOjAzOjZkOjdiOjcwOmU5OmY1Ojk1OmIxOjQyOjIwOjc5OmQyOmI5OjFlOmRmOmJiOjFmOmI2OjUxOmEwOjYzOjNlOmFhOjhhOjlkOmM1OmY4OjA3OjAzCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGYVRDQ0ExR2dBd0lCQWdJSkFKSzRpTnV3aXNGak1BMEdDU3FHU0liM0RRRUJDd1VBTUZJeEN6QUpCZ05WCkJBWVRBbE5MTVJNd0VRWURWUVFIRXdwQ2NtRjBhWE5zWVhaaE1STXdFUVlEVlFRS0V3cEVhWE5wWnlCaExuTXUKTVJrd0Z3WURWUVFERXhCRFFTQkVhWE5wWnlCU2IyOTBJRkl5TUI0WERURXlNRGN4T1RBNU1UVXpNRm9YRFRReQpNRGN4T1RBNU1UVXpNRm93VWpFTE1Ba0dBMVVFQmhNQ1Uwc3hFekFSQmdOVkJBY1RDa0p5WVhScGMyeGhkbUV4CkV6QVJCZ05WQkFvVENrUnBjMmxuSUdFdWN5NHhHVEFYQmdOVkJBTVRFRU5CSUVScGMybG5JRkp2YjNRZ1VqSXcKZ2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQ2lvOFFBQ2RhRlhTMXRGUGJDdzNPZQpOY0p4Vlg2Qis2dEdVT0RCZkVsNDVxdDVXRHphLzN3Y245aVhBbmcrYTBFRTZVRzl2Z01zUmZZdlpOU3JYYU5IClBXU2I2V2lheHN3YlA3cStzb3MwQWk2WVZSbjhqRytxWDlwTXprMERJYVBZMGpTVFZwYkxUQXdBRmp4ZkdzM0kKeDJ5bXJkTXhwN3pvNWVGbTF0TDdBN1JCWmNrUXJnNEZZOGFBYW1rdy9kTHVrTzhOSjkrZmxYUDA0U1hhYkJiZQpRVGcwNm92ODBlZ0VGR0V0UVg2c3gzZE95MUZVKzE2U0dCc0VXbWpHeWNUNnR4T2dtTGNSSzdmV1Y4eDhuaGZSCnl5WCtoazRrTGxZTWVFMmVBUkttSzZjQlpXNThZaDJFaE4vcXdHdTFwU3FWZzhOVEVReHpIUXV5UnBEUlFqck8KUUc2VnJmL0dsSzF1bDRTT2ZXK2Vpb0FOU1cxejRudVNIc1B6d2ZQckxnVnYyUnZQTjNZRXlMUmE1QmVueTkxMgpIOUFaZHVnc0JiUFduRFRZbHR4aGg1RUY1RVFJTThIYXVRaGwxSzZ5TmczcnVqaTZET1dibnV1Tlp0Mlp6OWFKClFmWUVrb29wS1cxck9oem5kWDBDY1E3endPZTl5eG5kbldDeXdtWmd0ckVFN3NubWhybWFaa0NvNXhIdGdVVUQKaS9abldlakJCaEc5M2MrQUFrOWxRSGhjUjFESW0rWWZnWHZrUktoYmhacmkzbHJWeC9rNlJHWkw1REpVZk9ScwpuTE1PUFJlaXNqUVMxbjZ5cUVtNzBYb29RTDZpRmgvZjVEY2ZFWFA3a0FwbFE2SU5mUGdHQVZVemZiQU51UFQxCnJxVkNWM3cyRVl4N1hzUURuWXg1blFJREFRQUJvMEl3UURBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUE0R0ExVWQKRHdFQi93UUVBd0lCQmpBZEJnTlZIUTRFRmdRVXRabjRyN0NVOWVNZzFncXR6azVXcEM1dVF1MHdEUVlKS29aSQpodmNOQVFFTEJRQURnZ0lCQUNZR1huRG5aVFBJZ203Wm5CYzZHM3Btc2dIMmVEdHBYaS9xLzA3NUtNT1lLbUZNCnRDUVNpbjF0RVJUM25MWEs1cnllSjQ1TUdjaXB2WHJBMXpZT2JZVnlicWpHb20zMituTmpmN3h1ZVFnY25ZcWYKR29wVHB0aTcyVFZWc1JIRnFRT3pWanU1aEpNaVhuN0I5aEpTaStvc1o3eitOa3oxdU0vUnMwbVNPOU1wRHBrYgpsdmRodUR2RUs3WjRiTFFqYi9EOTA3SmVkUitabGFpczl0cmh4VEY3KzlGR3M5SzhaN1JpVkxvSjkyT3drNkthCitlbFNMb3RnRXF2ODlXQlc3eEJjaThRYVF0eURXMlFPeTdXODFrL0JmRHh1alJOdCszdnJNTkRjVGEvRjFiYWwKVEZ0eHllZ3h2dWc0QmtpaEd1THEwdDRTT1ZnYS80QU9nblhtdDhrSGJBN3Yvemp4bUhIRXQzOE9GZEFsYWIwaQpuU3Z0QmZaR1I2enR3UERVTytMczdwWmJrQk5PSGxZNjY3RHZscnVXSXhHNjhrT0dkR1NWeUNoMTN4MDF1dEkzCmd6aFRPRFk3ejJ6cCtXc08wUHNFNkU5MzEyVUJlSVlNZWo0aFl2Ri9ZM0VNeVo5RTI2Z25vblcrYm9FKzE4RHIKRzVnUGNGdzBzb3JNd0lVWTYyNTZzL2Rhb1FlL3FVS1M4MkFpbCtRVW9RZWJUbmJBam4zOXBDWEhSKzMvSDNPcwp6TU9sNlc4S2pwdGx3bENGdGFPZ1V4TE1WWWRoODRHdUVFWmh2VVFodU1JOWRNOStKRFg2SEFjT216MGl5dTh4Ckw0eXNFcjN2UUNqOEtXZWZzaE5QWmlURVV4bnBIaWtWNytadHNIOHRaLzN6YkJ0MVJxUGxTaGZwcE5jTAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049QUNDVlJBSVoxIE89QUNDViBPVT1QS0lBQ0NWCiMgU3ViamVjdDogQ049QUNDVlJBSVoxIE89QUNDViBPVT1QS0lBQ0NWCiMgTGFiZWw6ICJBQ0NWUkFJWjEiCiMgU2VyaWFsOiA2ODI4NTAzMzg0NzQ4Njk2ODAwCiMgTUQ1IEZpbmdlcnByaW50OiBkMDphMDo1YTplZTowNTpiNjowOTo5NDoyMTphMTo3ZDpmMTpiMjoyOTo4MjowMgojIFNIQTEgRmluZ2VycHJpbnQ6IDkzOjA1OjdhOjg4OjE1OmM2OjRmOmNlOjg4OjJmOmZhOjkxOjE2OjUyOjI4Ojc4OmJjOjUzOjY0OjE3CiMgU0hBMjU2IEZpbmdlcnByaW50OiA5YTo2ZTpjMDoxMjplMTphNzpkYTo5ZDpiZTozNDoxOTo0ZDo0Nzo4YTpkNzpjMDpkYjoxODoyMjpmYjowNzoxZDpmMToyOTo4MTo0OTo2ZTpkMTowNDozODo0MToxMwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJSDB6Q0NCYnVnQXdJQkFnSUlYc08zcGtOL3BPQXdEUVlKS29aSWh2Y05BUUVGQlFBd1FqRVNNQkFHQTFVRQpBd3dKUVVORFZsSkJTVm94TVJBd0RnWURWUVFMREFkUVMwbEJRME5XTVEwd0N3WURWUVFLREFSQlEwTldNUXN3CkNRWURWUVFHRXdKRlV6QWVGdzB4TVRBMU1EVXdPVE0zTXpkYUZ3MHpNREV5TXpFd09UTTNNemRhTUVJeEVqQVEKQmdOVkJBTU1DVUZEUTFaU1FVbGFNVEVRTUE0R0ExVUVDd3dIVUV0SlFVTkRWakVOTUFzR0ExVUVDZ3dFUVVORApWakVMTUFrR0ExVUVCaE1DUlZNd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUNiCnFhdS9ZVXFYcnkrWFpwcDBYOURabHYzUDR1Um03eDhmUnpQQ1JLUGZtdDRmdFZUZEZYeHBOUkZ2dThnTWptb1kKSHRpUDJSYThFRWcyWFBCanM1QmFYQ1EzMTZQV3l3bHh1ZkVCY29Td2ZkdE5nTTM4MDIvSitOcTJEb0xTUllXbwpHMmlvUGVqMFJHeTlvY0xMQTc2TVBoTUFoTjlLU01Eaklncm82VGVuR0V5eENRMGpWbjhFVGRrWGhCaWx5TnBBCmxIUHJ6ZzVYUEFPQk9wMEtvVmREYWF4WGJYbVFlT1cxdER2WXZFeU5LS0dubzZlNkFrNGwwU3F1N2E0RElyaHIKSUE4d0tGU1ZmK0R1emdwbW5kRkFMVzRpcjUwYXdRVVowbS9BOHAvNGU3TUNRdnRRcVIwdGt3OGpxOGJCRDVMLwowS0lWOVZNSmNSei9SUk9FNWlaZStPQ0lIQXI4RnJhb2N3YTQ4R09FQXFER1d1em5kTjl3cnFPREplcld4NWVICms2Zkdpb296bDJBM0VENlhQbTRwRmRhaEQ5R0lMQktmYjZxa3hrTHJRYUxqbFVQVEFZVnRqcnM3OHlNMngvNDcKNEtFbEIwaXJ5WWwwL3dpUGdML0FsbVh6N3V4TGFMMmRpTU14czBEeDZNLzJPTHVjNU5GLzFPVlltM3o2MVBNTwptM1dSNUxwU0xobCswZlhOV2huOHVnYjIrMUtvUzVrRTNmajV0SXRRbzA1aWlmQ0hKUHFEUXNHSCt0VXRLU3BhCmNYcGthdGNuWUdNTjI4NUo5WTBma0lreUYvaHpRN2pTV3BPR1lkYmhkUXJxZVdaMmlFOXg2d1FsMWdwYWVwUGwKdVVzWFFBK3h0cm4xM2svYzRMT3NPeEZ3WUlSS1EyNlpJTUFwY1FyQVpRSURBUUFCbzRJQ3l6Q0NBc2N3ZlFZSQpLd1lCQlFVSEFRRUVjVEJ2TUV3R0NDc0dBUVVGQnpBQ2hrQm9kSFJ3T2k4dmQzZDNMbUZqWTNZdVpYTXZabWxzClpXRmtiV2x1TDBGeVkyaHBkbTl6TDJObGNuUnBabWxqWVdSdmN5OXlZV2w2WVdOamRqRXVZM0owTUI4R0NDc0cKQVFVRkJ6QUJoaE5vZEhSd09pOHZiMk56Y0M1aFkyTjJMbVZ6TUIwR0ExVWREZ1FXQkJUU2g3VGozemNuazFYMgpWdXFCNVRiTWpCNC92VEFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQjhHQTFVZEl3UVlNQmFBRk5LSHRPUGZOeWVUClZmWlc2b0hsTnN5TUhqKzlNSUlCY3dZRFZSMGdCSUlCYWpDQ0FXWXdnZ0ZpQmdSVkhTQUFNSUlCV0RDQ0FTSUcKQ0NzR0FRVUZCd0lDTUlJQkZCNkNBUkFBUVFCMUFIUUFid0J5QUdrQVpBQmhBR1FBSUFCa0FHVUFJQUJEQUdVQQpjZ0IwQUdrQVpnQnBBR01BWVFCakFHa0E4d0J1QUNBQVVnQmhBTzBBZWdBZ0FHUUFaUUFnQUd3QVlRQWdBRUVBClF3QkRBRllBSUFBb0FFRUFad0JsQUc0QVl3QnBBR0VBSUFCa0FHVUFJQUJVQUdVQVl3QnVBRzhBYkFCdkFHY0EKN1FCaEFDQUFlUUFnQUVNQVpRQnlBSFFBYVFCbUFHa0FZd0JoQUdNQWFRRHpBRzRBSUFCRkFHd0FaUUJqQUhRQQpjZ0R6QUc0QWFRQmpBR0VBTEFBZ0FFTUFTUUJHQUNBQVVRQTBBRFlBTUFBeEFERUFOUUEyQUVVQUtRQXVBQ0FBClF3QlFBRk1BSUFCbEFHNEFJQUJvQUhRQWRBQndBRG9BTHdBdkFIY0Fkd0IzQUM0QVlRQmpBR01BZGdBdUFHVUEKY3pBd0JnZ3JCZ0VGQlFjQ0FSWWthSFIwY0RvdkwzZDNkeTVoWTJOMkxtVnpMMnhsWjJsemJHRmphVzl1WDJNdQphSFJ0TUZVR0ExVWRId1JPTUV3d1NxQklvRWFHUkdoMGRIQTZMeTkzZDNjdVlXTmpkaTVsY3k5bWFXeGxZV1J0CmFXNHZRWEpqYUdsMmIzTXZZMlZ5ZEdsbWFXTmhaRzl6TDNKaGFYcGhZMk4yTVY5a1pYSXVZM0pzTUE0R0ExVWQKRHdFQi93UUVBd0lCQmpBWEJnTlZIUkVFRURBT2dReGhZMk4yUUdGalkzWXVaWE13RFFZSktvWklodmNOQVFFRgpCUUFEZ2dJQkFKY3hBcC9uL1VOblNFUVU1Q21IN1V3b1p0Q1BOZHBOWWJkS2wwMjEyNURnQlM0T3hublE4cGRwCkQ3MEVSOW0rMjdVcDJwdlpycW1aMWRNOE1KUDFqYUdvL0FhTlJQVEtGcFY4TTl4aWk2ZzMrQ2ZZQ1MwYjc4Z1UKSnlDcFpFVC9MdFoxcW14TllFQVpTVU5VWTlyaXpMcG01VTlFZWx2WmFvRXJRTlYvK1FFbldDekk3VWlSZkQrbQpBTS9FS1hNUk50NkdHVDZkN2htS0c5V3c3WTQ5bkNyQURkZzladU04RGIzVmxGemk0cWMxR3dRQTlqOWFqZXBECnZWK0pIYW5Cc015WjRrMEFDdHJKSjF2bkU1QmM1UFV6b2xWdDNPQUpUUyt4SmxzbmRRQUp4R0ozS1FoZm5sbXMKdG42dG4xUXdJZ1BCSG5Gay92azRDcFlZM1FJVXJDUExCaHdlcEgyTkRkNG5RZWl0MmhXM3NDUGRLNmpUMmlXSAo3ZWhWUkUySTlEWitoSnA0clBjT1Zra08xak1sMW9SUVFtd2dFaDBxMWI2ODhuQ0JwSEJndmdXMW01NEVSTDVoCkk2enBwU1NNRVlDVVdxS2l1VW5Td2R6UnArMHhFU3llR2FidTRWWGh3T3JQRFlUa0Y3ZWlmS1hlVlNVRzdzekEKaDF4QTJzeVZQMVhnTmNlNGhMNjBYYzE2Z3dGeTdvZm1YeDJ1dFlYR0p0L213WnJwSGdKSG55cW9iYWxieit4RgpkMytZSjVveVhTcmpoTzdGbUdZdmxpQWQzZGpESjlldytmN1pmYzNRbjQ4TEZGaFJueStMd3pndDN1aVAxbzJICnBQVldReGFaTFBTa1ZyUTB1R0UzeWNKWWdCdWdsNkg4V1kzcEVmYlJEMHRWTkVZcWk0WTcKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVRXQ0EgR2xvYmFsIFJvb3QgQ0EgTz1UQUlXQU4tQ0EgT1U9Um9vdCBDQQojIFN1YmplY3Q6IENOPVRXQ0EgR2xvYmFsIFJvb3QgQ0EgTz1UQUlXQU4tQ0EgT1U9Um9vdCBDQQojIExhYmVsOiAiVFdDQSBHbG9iYWwgUm9vdCBDQSIKIyBTZXJpYWw6IDMyNjIKIyBNRDUgRmluZ2VycHJpbnQ6IGY5OjAzOjdlOmNmOmU2OjllOjNjOjczOjdhOjJhOjkwOjA3OjY5OmZmOjJiOjk2CiMgU0hBMSBGaW5nZXJwcmludDogOWM6YmI6NDg6NTM6ZjY6YTQ6ZjY6ZDM6NTI6YTQ6ZTg6MzI6NTI6NTU6NjA6MTM6ZjU6YWQ6YWY6NjUKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDU5Ojc2OjkwOjA3OmY3OjY4OjVkOjBmOmNkOjUwOjg3OjJmOjlmOjk1OmQ1Ojc1OjVhOjViOjJiOjQ1OjdkOjgxOmYzOjY5OjJiOjYxOjBhOjk4OjY3OjJmOjBlOjFiCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGUVRDQ0F5bWdBd0lCQWdJQ0RMNHdEUVlKS29aSWh2Y05BUUVMQlFBd1VURUxNQWtHQTFVRUJoTUNWRmN4CkVqQVFCZ05WQkFvVENWUkJTVmRCVGkxRFFURVFNQTRHQTFVRUN4TUhVbTl2ZENCRFFURWNNQm9HQTFVRUF4TVQKVkZkRFFTQkhiRzlpWVd3Z1VtOXZkQ0JEUVRBZUZ3MHhNakEyTWpjd05qSTRNek5hRncwek1ERXlNekV4TlRVNQpOVGxhTUZFeEN6QUpCZ05WQkFZVEFsUlhNUkl3RUFZRFZRUUtFd2xVUVVsWFFVNHRRMEV4RURBT0JnTlZCQXNUCkIxSnZiM1FnUTBFeEhEQWFCZ05WQkFNVEUxUlhRMEVnUjJ4dlltRnNJRkp2YjNRZ1EwRXdnZ0lpTUEwR0NTcUcKU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQ3dCZHZJNjR6RWJvb2g3NDVObkhFS0gxSnc3VzJDbkpmRgoxMHhPUlVuTFFFSzFFalJzR2NKMHBERmZoUUtYN0VNekNsUFNuSXlPdDdoNTJ5dlZhdktPWnNUdUt3RUhrdFN6CjBBTGZVUFpWcjJZT3krQkhZQzhyTWprMVVqb29nL2g3RnNZWXVHTFdSeVdSenZBWkVrMnRZL1hUUDNWZktmQ2gKTUJ3cW9KaW1GYjN1L1JrMjhPS1JRNC82eXRZUUowbE03OTNCOFlWd204cnFxRnBEL0cyR2IzUHBOMFdwOERiSAp6SWgxSHJ0c0J2K2JhejRYN0dHcWNYekdIYUwzU2VrVnRUeldvV0gxRWZjRmJ4MzlFYjdRTUFmQ0tiQUpUaWJjCjQ2S29rV29md3BGRmlGemxtTGh4cFJVWnlYeDFFY3h3ZEU4dG14MlJSUDFXS0tEK3U0WnF5UHBjQzFqY3hrdDIKeUtzaTJYTVBwZlJhQW9rL1Q1NGlndTZpZEZNcVBWTW5hUjFzampJc1pBQW1ZMkUyVHFOR3R6OTlzeTJzYlpDaQpsYUxPejlxQzV3YzBHWmJwdUNHcUtYNm1PTDZPS1VvaFpua2ZzOE8xQ1dmZTF0UUhSdk1xMnVZaU4yRExnYllQCm9BL3B5SlYvdjFXUkJYclBQUlhBYjk0SmxBR0QxelFiekVDbDhMaWJaOVdZa1R1bmhIaVZKcVJhQ1BncmRMUUEKQkR6ZnVCU082Titwald4bmtqTWR3TGZTN0pMSXZnbS9MQ2tGYndKcm51Kzh2eXE4VzhCUWowRndjWWV5VGJjRQpxWVNqTXErdTdtc1hpN0t4L216aGtJeUlxSmRJenNoTnkvTUd6MTlxQ2tLeEhoNTNMNDZnNXBJT0J2d0ZJdEltCjRURlJmVExjRHdJREFRQUJveU13SVRBT0JnTlZIUThCQWY4RUJBTUNBUVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIKL3pBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQWdFQVh6U0JkdStXSGRYbHRka0NZNFFXd2E2Z2NGR245MHhITmNnTAoxeWc5aVhIWnFqTkI2aFFiYkNFQXdHeENHWDZmYVZzZ1F0K2kwdHJFZkpkTGpiRG9yTWp1cFdrRW1RcVNwcXNuCkxocE5nYitFMUhBZXJVZisvVXFkTStEeXVjUkZDQ0VLMm1scGMzSU52alQrbEl1dHd4NDExNktENytVNHg2V0YKSDZ2UE5Pdy9LUDRNOFZlR1RzbFY5eHpVMktWOUJucHYxZDhRMzRGT0lXV3h0dUVYZVpWRkJzNWZ6TnhHaVdObwpSSTJUOUdSd29EMmRLQVhET1hDNFluc2cvZVRiNlFpaHVKNDlDY2RQK3l6NGszWkIzbExnNFZmU25RTzhkNTcrCm5pbGU5OEZSWUIvZTJndXlMWFczUTBpVDUvWjV4b1JkZ0ZsZ2xQeDRtSTg4azFIdFFKQUgzMlJqSk10T2NRV2gKMTVRYWlETHhJblFpcnFXbTJCSnBUR0NqQXU0cjdOUmprZ3Rldmk5MmE2TzJKcnlQQTlnSzhreGtScjA1WXVXVwo2elJqRVNqTWxmR3Q3Ky9jZ0ZoSTZVdTQ2bVdzNmZ5QXRiWElSZm1zd1ovWnVlcGlpSTdFOFV1REVxM21pNFRXCm5zTHJneGlmYXJzYkpHQXpjTXpzOXpMelhObDVmZStlcFA3Skk4TWs3aFdTc1QyUlR5YUd2V1p6SkJQcXBLNWoKd2ExOWhBTThFSGlHRzNuanhQUHlCSlVncmlPQ3hMTTZBR0svNWpZazRWZTZ4eDZRZGRWZlA1VmhLOEU3emVXegphR0hRUmlhcElWSnBMZXN1eCt0M3pxWTZ0UU16VDNiUjUxeFVBVjNMZVBUSkRML1BFbzRYTFNOb2xPZXIvcW15Ckt3YlFCTTA9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1UZWxpYVNvbmVyYSBSb290IENBIHYxIE89VGVsaWFTb25lcmEKIyBTdWJqZWN0OiBDTj1UZWxpYVNvbmVyYSBSb290IENBIHYxIE89VGVsaWFTb25lcmEKIyBMYWJlbDogIlRlbGlhU29uZXJhIFJvb3QgQ0EgdjEiCiMgU2VyaWFsOiAxOTkwNDE5NjY3NDEwOTAxMDc5NjQ5MDQyODcyMTc3ODY4MDE1NTgKIyBNRDUgRmluZ2VycHJpbnQ6IDM3OjQxOjQ5OjFiOjE4OjU2OjlhOjI2OmY1OmFkOmMyOjY2OmZiOjQwOmE1OjRjCiMgU0hBMSBGaW5nZXJwcmludDogNDM6MTM6YmI6OTY6ZjE6ZDU6ODY6OWI6YzE6NGU6NmE6OTI6ZjY6Y2Y6ZjY6MzQ6Njk6ODc6ODI6MzcKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGRkOjY5OjM2OmZlOjIxOmY4OmYwOjc3OmMxOjIzOmExOmE1OjIxOmMxOjIyOjI0OmY3OjIyOjU1OmI3OjNlOjAzOmE3OjI2OjA2OjkzOmU4OmEyOjRiOjBmOmEzOjg5Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGT0RDQ0F5Q2dBd0lCQWdJUkFKVytGcUQzTGtieGV6bUNjdnFMelpZd0RRWUpLb1pJaHZjTkFRRUZCUUF3Ck56RVVNQklHQTFVRUNnd0xWR1ZzYVdGVGIyNWxjbUV4SHpBZEJnTlZCQU1NRmxSbGJHbGhVMjl1WlhKaElGSnYKYjNRZ1EwRWdkakV3SGhjTk1EY3hNREU0TVRJd01EVXdXaGNOTXpJeE1ERTRNVEl3TURVd1dqQTNNUlF3RWdZRApWUVFLREF0VVpXeHBZVk52Ym1WeVlURWZNQjBHQTFVRUF3d1dWR1ZzYVdGVGIyNWxjbUVnVW05dmRDQkRRU0IyCk1UQ0NBaUl3RFFZSktvWklodmNOQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQU1LKzZ5ZndJYVB6YVNaVmZwM0YKVlJhUlhQM3ZJYjlUZ0hvdDBwR01Zekh3N0NUd3c2WFNjbndRYmZRM3QrWG1mSG5xakxXQ2k2NUl0cXdBM0dWMQo3Q3BOWDhHSDlTQmxLNEdvUno2Skk1VXdGcEIvNkZjSFNPY1pycjlGWjdFM0d3WXEvdDc1ckgyRCsxNjY1SStYClo3NUxqbzFrQjFjNFZXazBOajBUU085UDR0Tm1IcVRQR3JkZU5qUFV0QWE5R0FIOWQ0UlFBRVgxakYzb0k3eCsKL2pYaDdWQjdxVENOR2RNSmptaG5YYjg4bHhoVHV5bGl4Y3BlY3NISGx0VGJMYUMwSDJrRDdPcmlVUEVNUFBDcwo4MU10OEJ6MTdXdzVPWE9BRnNoU3NDUE40RDdjM1R4SG9MczFpdUtZYUl1KzViOXk3dEw2cGUwUzdmeVlHS2ttCmR0d29TeEFnSE5OL0ZuY3Q3VytBOTBtN1V3VzdYV2pIMU1oMUZqK0pXb3YzRjBmVVRQSFNpWGsrVFQyWXFHSGUKT2g3UytGNEQ0TUhKSEl6VGpVM1RsVGF6TjE5alk1c3pGUEF0Sm10VGZJbU1Nc0p1N0QwaEFEbkpvV2ppVUlNdQpzRG9yOHphZ3JDL2tiMkhDVVFrNVBvdFR1YnRuMnR4VHVYWlpOcDFENVNEZ1BUSmdoU0pSdDhjenU5MFZMNlI0CnBnZDdnVVkyQkliZGVUWEhsU3c3c0tNWE5lVnpIN1JjV2UvYTZoQmxlM3JRZjUrenRDbzNPM0NMbTF1NUs3ZnMKc2xFU2wxTXBXdFR3RWhEY1R3SzdFcEl2WXRRL2FVTjhEZGI4V0hVQmlKMVlGa3ZldXBEL1J3R0pCbXIyWDdLUQphck1DcGdLSXY3TkhmaXJaMWZwb2VEVk5BZ01CQUFHalB6QTlNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdDd1lEClZSMFBCQVFEQWdFR01CMEdBMVVkRGdRV0JCVHdqMWs0QUxQMWo1cVdETlhyK251cUYrZ1RFakFOQmdrcWhraUcKOXcwQkFRVUZBQU9DQWdFQXZ1UmNZazRrOUF3SS8vRFRER2prazBraVAwUW5iN3R0M29ObXpxak1EZnoxbWdibApkeFNSNjUxQmU1a3FoT1gvL0NIQlhmRGtIMWUzZGFtaFh3SW0vOWZIOTA3ZVQvajNIRWJBZWs5QUxDSTE4Qm14CjBHdG5MTENvNE1CQU56WDJoRnhjNDY5Q2VQNm55UTFRNmcyRWR2WlI3NE5UeG5yL0RsWkpMbzk2MWd6bUoxVGoKVFFwZ2NtTE5rUWZXcGIvSW1XdnR4Qm5tcTB3Uk9NVnZNZUp1U2NnL2RvQW1BeVlwNERiMjlpQlQ0eGR3TkJlZApZMmdlYSt6RFRZYTRFekF2WFVZTlIwUFZHNnBaRHJsY2pRWklyWFNIWDhmOE1WUkJFK0xISVE2ZTRCNE40Y0I3ClE0V1F4WXBZeG1VS2VGZnl4aU1QQWRrZ1M5NFArNUtGZFNwY2M0MXRleVdSeXU1RnJnWkxBTXpUc1ZsUTJqcUkKT3lsRFJsNlhLMVRPVTIrTlN1ZVcrcjl4RGtLTGZQMG9vTkJJeXRyRWdVeTdvbk9USnNqckROWW1pTGJBSk0rNwp2VnZyZFgzcENJNkdNeXg1ZHdscHBZbjhzM0NRaDNhUDB5SzdRczY5Y3dzZ0ppclFtejF3SGlSc3pZZDJxUmVXCnQ4OE5rdnVPR0ttWVNkR2UvbUJFY2lHNUdlM0M5VEh4T1VpSWtDUjFWQmF0enZUNGFSUmtPZnVqdUxwd1FNY24KSEwvRVZsUDZZMlhROHh3T0Z2VnJobGhOR05Ua0RZNmxuVnVSM0hZa1VEL0dLdnZadDV5MTF1YlEyZWdaaXhWeApTSzIzNnRoWmlOU1F2eGF6MmVtc1dXRlV5Qnk2eXNISzRia2dUSTg2azRtbG9NeS8wL1oxcEhXV2JWWT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUUtVHVncmEgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1FLVR1XHUwMTFmcmEgRUJHIEJpbGlcdTAxNWZpbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxlcmkgQS5cdTAxNWUuIE9VPUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppCiMgU3ViamVjdDogQ049RS1UdWdyYSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPUUtVHVcdTAxMWZyYSBFQkcgQmlsaVx1MDE1ZmltIFRla25vbG9qaWxlcmkgdmUgSGl6bWV0bGVyaSBBLlx1MDE1ZS4gT1U9RS1UdWdyYSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkKIyBMYWJlbDogIkUtVHVncmEgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkiCiMgU2VyaWFsOiA3NjY3NDQ3MjA2NzAzMjU0MzU1CiMgTUQ1IEZpbmdlcnByaW50OiBiODphMTowMzo2MzpiMDpiZDoyMTo3MTo3MDo4YTo2ZjoxMzozYTpiYjo3OTo0OQojIFNIQTEgRmluZ2VycHJpbnQ6IDUxOmM2OmU3OjA4OjQ5OjA2OjZlOmYzOjkyOmQ0OjVjOmEwOjBkOjZkOmEzOjYyOjhmOmMzOjUyOjM5CiMgU0hBMjU2IEZpbmdlcnByaW50OiBiMDpiZjpkNToyYjpiMDpkNzpkOTpiZDo5MjpiZjo1ZDo0ZDpjMTozZDphMjo1NTpjMDoyYzo1NDoyZjozNzo4Mzo2NTplYTo4OTozOToxMTpmNTo1ZTo1NTpmMjozYwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJR1N6Q0NCRE9nQXdJQkFnSUlhbWcrbkZHYnkxTXdEUVlKS29aSWh2Y05BUUVMQlFBd2diSXhDekFKQmdOVgpCQVlUQWxSU01ROHdEUVlEVlFRSERBWkJibXRoY21FeFFEQStCZ05WQkFvTU4wVXRWSFhFbjNKaElFVkNSeUJDCmFXeHB4WjlwYlNCVVpXdHViMnh2YW1sc1pYSnBJSFpsSUVocGVtMWxkR3hsY21rZ1FTN0ZuaTR4SmpBa0JnTlYKQkFzTUhVVXRWSFZuY21FZ1UyVnlkR2xtYVd0aGMzbHZiaUJOWlhKclpYcHBNU2d3SmdZRFZRUUREQjlGTFZSMQpaM0poSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNQjRYRFRFek1ETXdOVEV5TURrME9Gb1hEVEl6Ck1ETXdNekV5TURrME9Gb3dnYkl4Q3pBSkJnTlZCQVlUQWxSU01ROHdEUVlEVlFRSERBWkJibXRoY21FeFFEQSsKQmdOVkJBb01OMFV0VkhYRW4zSmhJRVZDUnlCQ2FXeHB4WjlwYlNCVVpXdHViMnh2YW1sc1pYSnBJSFpsSUVocAplbTFsZEd4bGNta2dRUzdGbmk0eEpqQWtCZ05WQkFzTUhVVXRWSFZuY21FZ1UyVnlkR2xtYVd0aGMzbHZiaUJOClpYSnJaWHBwTVNnd0pnWURWUVFEREI5RkxWUjFaM0poSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjUKTUlJQ0lqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FnOEFNSUlDQ2dLQ0FnRUE0dlUva3dWUkhvVmlWRjU2Qy9VWQpCNE91ZnE5ODk5U0thNlZqUXptNVMvZkR4bVNKUFpRdVZJQlNPVGtIUzB2ZGhRZDJoOHkvTDVWTXpIMm5QYnhICkQ1aHcrSXlGSG5TT2ttMGJRTkdaRGJ0MWJzaXBhNXJBaERHdnlrUEw2eXMwNkkrWGF3R2IxUTVLQ0twYmtuU0YKUTlPQXJxR0lXNjZ6Nmw3TEZwcDNSTWloOWxSb3p0NlBseXU2VzBBQ0RHUVh3TFdUemVIeEUyYk9ESG52MFpFbwpxMStnRWxJd2N4bU9qK0dNQjZMRHUwcnc2aDhWcU80bHpLUkcrQnNpNzdNT1E3b3NKTGpGTEZ6VUhQaGRaTDNECmsxNG9wejhuOFk0ZTB5cFFCYU5WMmN2bk9WUEFtSjZNVkdLTEpyRDNmWTE4NU1hZVprSlZna2Zuc2xpTlp2Y0gKZkM0MjVsQWNQOXRESk1XL2hrZDVzM2tjOTFyMEUreHMrRC9pV1IrVjdrSSt1YTJvTW9WSmwwYitTekdQV3N1dApkRWNmNlpHMzN5Z0VJcURVRDEzaWVVL3FiSVdHdmFpbXp1VDZ3K0d6cnQ0OFVlN0xFM3dCZjRRT1hWR1VuaE1NCnRpNmxUUGs1Y0Radmxzb3VERVJWeGNyNlhRS2ozOVprakZxekFRcXB0UXBIRi8vdmtVQXFqcUZHT2pHWTVSSDgKekx0SlZvcjh1ZEJobW05bGJPYkR5ejUxU2Y2UHArS0p4V2ZYblVZVFRqRjJPeVN6bmhGbGhxdC83eDNVK0x6bgpyRnBjdDFwSFhGWE9WYlFpY1Z0YkMvRFAzS0JoWk9xcDEyZ0tZNmZnRFQrZ3I5T3Ewbjd2VWFEbVVTdFZraFVYClU4dTNaZzVtVFBqNWRVeVE1eEp3eDBVQ0F3RUFBYU5qTUdFd0hRWURWUjBPQkJZRUZDN2oyN0pKMEp4VWVWejYKSnlyK3pFN1M2RTVVTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SHdZRFZSMGpCQmd3Rm9BVUx1UGJza25RbkZSNQpYUG9uS3Y3TVR0TG9UbFF3RGdZRFZSMFBBUUgvQkFRREFnRUdNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUNBUUFGCk56cjBUYmRGNGtWMUpJKzJkMUxvSE5nUWsyWHo4bGtHcEQ0ZUtleGQwZENyZk9BS2tFaDQ3VTZZQTVuK0tHQ1IKSFRBZHVHTjhxT1kxdGZyVFlYYm0xZ2RMeW1tYXNvUjZkNU5GRnhXZkpOQ1lFeEwvdTZBdS9VNU1oL2pPWEtxWQpHd1hnQUVaS2dvQ2xNNHNvM08wNDA5L2xQdW4rKzFuZFlZUlAwbFNXRTJFVFBvK0FhYjZUUjdVMVE5SmF1ejFjCjc3TkNSODA3VlJNR3NBbmIvV1AyT29nS21XOSs0YzRiVTJwRVppTlJDSHU4VzFLaS9RWTNPRUJoajBxV3VKQTMKK0diSGVKQUFGUzZMclZFMVV3ZW9hMml1K1U0OEJ5Yk5DQVZ3ekRrL2RyMmwwMmNtQVlhbVU5SmdPM3hEZjFXSwp2SlVhd1NnNVRCOUQwcEgwY2xtS3VWYjhQN1NkMm5DY2RscU1RMUR1ampCeVRkLy9TZmZHcVdmWmJhd0NFZUk2CkZpV25XQWpMYjFOQm5FZzRSMmd6MGRmSGo5UjBJZFREQlpCNi84NldpTEVWS1YwanE5QmdvUkpQM3ZRWHpUTGwKeWIvSVE2MzlMbzd4citMMG1Qb1NIeURZd0tjTWhjV1E5RHN0bGlheExMNU1xK3V4MG9ySjIzZ1REeDRKblcyUApBSjhDMnNINkgzcDZDY1JLNW9ncWw1K0ppLzAzWDE4NnpqaFpoa3V2Y1F1MDJQSndUNTh5RStPd3AxZmwydHBECnk0UTA4aWpFNm0zMEt1L0JhM2JhKzM2N2hUelNVOEpOdm5IaFJkSDlJMmNORTNYN3oyVm5JcDJ1c0FuUkNmOGQKTkwvK0k1YzMwam42UFEwR0M3VGJPNk9yYjF3ZHRuN29zNEkwN1FaY0pBPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIgTz1ULVN5c3RlbXMgRW50ZXJwcmlzZSBTZXJ2aWNlcyBHbWJIIE9VPVQtU3lzdGVtcyBUcnVzdCBDZW50ZXIKIyBTdWJqZWN0OiBDTj1ULVRlbGVTZWMgR2xvYmFsUm9vdCBDbGFzcyAyIE89VC1TeXN0ZW1zIEVudGVycHJpc2UgU2VydmljZXMgR21iSCBPVT1ULVN5c3RlbXMgVHJ1c3QgQ2VudGVyCiMgTGFiZWw6ICJULVRlbGVTZWMgR2xvYmFsUm9vdCBDbGFzcyAyIgojIFNlcmlhbDogMQojIE1ENSBGaW5nZXJwcmludDogMmI6OWI6OWU6ZTQ6N2I6NmM6MWY6MDA6NzI6MWE6Y2M6YzE6Nzc6Nzk6ZGY6NmEKIyBTSEExIEZpbmdlcnByaW50OiA1OTowZDoyZDo3ZDo4ODo0Zjo0MDoyZTo2MTo3ZTphNTo2MjozMjoxNzo2NTpjZjoxNzpkODo5NDplOQojIFNIQTI1NiBGaW5nZXJwcmludDogOTE6ZTI6ZjU6Nzg6OGQ6NTg6MTA6ZWI6YTc6YmE6NTg6NzM6N2Q6ZTE6NTQ6OGE6OGU6Y2E6Y2Q6MDE6NDU6OTg6YmM6MGI6MTQ6M2U6MDQ6MWI6MTc6MDU6MjU6NTIKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR3ekNDQXF1Z0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRc0ZBRENCZ2pFTE1Ba0dBMVVFQmhNQ1JFVXgKS3pBcEJnTlZCQW9NSWxRdFUzbHpkR1Z0Y3lCRmJuUmxjbkJ5YVhObElGTmxjblpwWTJWeklFZHRZa2d4SHpBZApCZ05WQkFzTUZsUXRVM2x6ZEdWdGN5QlVjblZ6ZENCRFpXNTBaWEl4SlRBakJnTlZCQU1NSEZRdFZHVnNaVk5sCll5QkhiRzlpWVd4U2IyOTBJRU5zWVhOeklESXdIaGNOTURneE1EQXhNVEEwTURFMFdoY05Nek14TURBeE1qTTEKT1RVNVdqQ0JnakVMTUFrR0ExVUVCaE1DUkVVeEt6QXBCZ05WQkFvTUlsUXRVM2x6ZEdWdGN5QkZiblJsY25CeQphWE5sSUZObGNuWnBZMlZ6SUVkdFlrZ3hIekFkQmdOVkJBc01GbFF0VTNsemRHVnRjeUJVY25WemRDQkRaVzUwClpYSXhKVEFqQmdOVkJBTU1IRlF0VkdWc1pWTmxZeUJIYkc5aVlXeFNiMjkwSUVOc1lYTnpJREl3Z2dFaU1BMEcKQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUNxWDlvYlgraHprZVhhWFBTaTVrZmw4MmhWWUFVZApBcVN6bTFuekhvcXZOSzM4RGNMWlNCbnVhWS9KSVB3aHFnY1o3YkJjckdYSFgrMENmSHQ4TFJ2V3VybUF3aGlDCkZvVDZackFJeGxRamdlVE51VWsvOWs5dU4wZ29PQS9GdnVkb2NQMDVsMDNTeDVpUlVLckVSTE1qZlRsSDZWSmkKMWhLVFhyY3hsa0lGKzNhbkhxUDF3dnpwZXNWc3FYRlA2c3Q0dkdDdng5NzAyY3UrZmpPbGJwU0Q4RFQ2SWF2cQpqbktnUDZUZU1GdnZoazFxbFZ0RFJLZ1FGUnpsQVZmRm1QSG1CaWlScWlERnQxTW1VVU95Q3hHVldPSEFEM2JaCndJMThnZk55Y0o1di9ocU8yVjgxeHJKdk5IeStTRS9pV2puWDJKMTRucCtHUGdOZUdZdEVvdFhIQWdNQkFBR2oKUWpCQU1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUURBZ0VHTUIwR0ExVWREZ1FXQkJTLwpXU0EyQUhtZ29DSnJqTlh5WWRLNExNdUNTakFOQmdrcWhraUc5dzBCQVFzRkFBT0NBUUVBTVFPaVlRc2ZkT2h5Ck5zWnQrVTJlK2lLbzRZRld6ODI3bitxcmtSazRyNnA4RlUzenRxT05wZlNPOWtTcHArZ2hsYTArQUdJV2lQQUMKdXZ4aEkrWXptekI2YXpaaWU2MEVJNFJZWmVMYks0cm5KVk0zWWxOZnZOb0JZaW1pcGlkeDVqb2lmc0Z2SFpWdwpJRW9ITk4vcS94V0E1YnJYZXRoYmRYd0ZlaWxIZmtDb01STjN6VUE3dEZGSGVpNFI0MGNSM3AxbTBJdlZWR2I2CmcxWHFmTUlwaVJ2cGI3UE80Z1dFeVM4K2VJVmlic2xmd1hoamRGakFTQmdNbVRucnBNd2F0WGxhalJXYzJCUU4KOW5vSFY4Y2lnd1V0UEpzbEpqMFlzNmxEZk1qSXEyU1BEcU8vbkJ1ZE1OdmEwQmt1cWp6eCt6T0FkdVROclJsUApCU2VPRTZGdXdnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUF0b3MgVHJ1c3RlZFJvb3QgMjAxMSBPPUF0b3MKIyBTdWJqZWN0OiBDTj1BdG9zIFRydXN0ZWRSb290IDIwMTEgTz1BdG9zCiMgTGFiZWw6ICJBdG9zIFRydXN0ZWRSb290IDIwMTEiCiMgU2VyaWFsOiA2NjQzODc3NDk3ODEzMzE2NDAyCiMgTUQ1IEZpbmdlcnByaW50OiBhZTpiOTpjNDozMjo0YjphYzo3Zjo1ZDo2NjpjYzo3Nzo5NDpiYjoyYTo3Nzo1NgojIFNIQTEgRmluZ2VycHJpbnQ6IDJiOmIxOmY1OjNlOjU1OjBjOjFkOmM1OmYxOmQ0OmU2OmI3OjZhOjQ2OjRiOjU1OjA2OjAyOmFjOjIxCiMgU0hBMjU2IEZpbmdlcnByaW50OiBmMzo1NjpiZTphMjo0NDpiNzphOToxZTpiMzo1ZDo1MzpjYTo5YTpkNzo4Njo0YTpjZTowMTo4ZToyZDozNTpkNTpmODpmOTo2ZDpkZjo2ODphNjpmNDoxYTphNDo3NAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRGR6Q0NBbCtnQXdJQkFnSUlYRFBMWWl4ZnN6SXdEUVlKS29aSWh2Y05BUUVMQlFBd1BERWVNQndHQTFVRQpBd3dWUVhSdmN5QlVjblZ6ZEdWa1VtOXZkQ0F5TURFeE1RMHdDd1lEVlFRS0RBUkJkRzl6TVFzd0NRWURWUVFHCkV3SkVSVEFlRncweE1UQTNNRGN4TkRVNE16QmFGdzB6TURFeU16RXlNelU1TlRsYU1Ed3hIakFjQmdOVkJBTU0KRlVGMGIzTWdWSEoxYzNSbFpGSnZiM1FnTWpBeE1URU5NQXNHQTFVRUNnd0VRWFJ2Y3pFTE1Ba0dBMVVFQmhNQwpSRVV3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ1ZoVHVYYnlvN0xqdlBwdk1wCk5iN1BHS3crcXRuNFRhQStHa2U1dkpyZjh2N01Qa2ZvZXBiQ0pJNDE5S2tNL0lMOWJjRnlZaWU5Nm12cjU0ck0KVkQ2UVVNK0ExSlg3NkxXQzFCVEZ0cWxWSlZmYnNWRDJzR0JrV1hwcHp3TzNidzIreWo1dmRITHFxakFxYzJLKwpTWkZoeUJIK0RnTXE5Mm9nM0FJVkRWNFZhdnpqZ3NHMXhaMWtDV3lqV1pnSEo4Y2JsaXRoZEhGc1EvSDNOWWtRCjRKN3NWYUUzSXFLSEJBVXNSMzIwSExsaUtXWW95cmZoay9Xa2xBT1p1WENGdGVaSTZvMVEvTm5lekc4SER0MEwKY3AyQU1CWUhsVDhvRHYzRmRVOVQxblNhdENRdWpnS1J6M2JGbXg1VmRKeDRJYkh3TGZFTG44TFZsaGdmOEZRaQplb3dIQWdNQkFBR2pmVEI3TUIwR0ExVWREZ1FXQkJTbnBRYXhMS1lKWU83UmwrbHdycnc3R1d6YklUQVBCZ05WCkhSTUJBZjhFQlRBREFRSC9NQjhHQTFVZEl3UVlNQmFBRktlbEJyRXNwZ2xnN3RHWDZYQ3V2RHNaYk5zaE1CZ0cKQTFVZElBUVJNQTh3RFFZTEt3WUJCQUd3TFFNRUFRRXdEZ1lEVlIwUEFRSC9CQVFEQWdHR01BMEdDU3FHU0liMwpEUUVCQ3dVQUE0SUJBUUFtZHpUYmxFaUdLa0dkTEQ0R2tHREVqS3dMVkxnZnVYdlRCem5rK2o1N3NqMU83WjhqCnZaZnphMXp2N3YxQXB0K2hrNkVLaHF6dklOQjVBYjE0OXhuWUpERTBCQUdtdWhXYXd5ZmMyRThQekJoai81a1AKRHBGcmRSYmhJZnpZSnNkSHQ2YlBXSEp4ZnJyaFRaVkhPOG12YmFHMHdleUo5clFQT0xYaVpOd2x6NmJiNjVwYwptYUhGQ043OTV0clYxbHBGRE1TM3dyVVU3N1FSL3c0VnRmWDEyOGE5NjFxbjhGWWlxVHhsVk1ZVnFMMkduczJECmxtaDZjWUdKNFF2aDZoRWJhQWpNYVo3c25rR2VSREltZXVLSENuRTk2K1JhcE5MYnhjM0czbUIvdWZOUFJKTHYKS3JjWVBxY1oyUXQ5c1RkQlFyQzZZQjN5L2drUnNQQ0hlNmVkCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1RdW9WYWRpcyBSb290IENBIDEgRzMgTz1RdW9WYWRpcyBMaW1pdGVkCiMgU3ViamVjdDogQ049UXVvVmFkaXMgUm9vdCBDQSAxIEczIE89UXVvVmFkaXMgTGltaXRlZAojIExhYmVsOiAiUXVvVmFkaXMgUm9vdCBDQSAxIEczIgojIFNlcmlhbDogNjg3MDQ5NjQ5NjI2NjY5MjUwNzM2MjcxMDM3NjA2NTU0NjI0MDc4NzIwMDM0MTk1CiMgTUQ1IEZpbmdlcnByaW50OiBhNDpiYzo1YjozZjpmZTozNzo5YTpmYTo2NDpmMDplMjpmYTowNTozZDowYjphYgojIFNIQTEgRmluZ2VycHJpbnQ6IDFiOjhlOmVhOjU3Ojk2OjI5OjFhOmM5OjM5OmVhOmI4OjBhOjgxOjFhOjczOjczOmMwOjkzOjc5OjY3CiMgU0hBMjU2IEZpbmdlcnByaW50OiA4YTo4Njo2ZjpkMTpiMjo3NjpiNTo3ZTo1Nzo4ZTo5MjoxYzo2NTo4Mjo4YToyYjplZDo1ODplOTpmMjpmMjo4ODowNTo0MTozNDpiNzpmMTpmNDpiZjpjOTpjYzo3NAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRllEQ0NBMGlnQXdJQkFnSVVlRmhmTHEwc0dVdmpOd2MxTkJNb3RaYlVaWk13RFFZSktvWklodmNOQVFFTApCUUF3U0RFTE1Ba0dBMVVFQmhNQ1FrMHhHVEFYQmdOVkJBb1RFRkYxYjFaaFpHbHpJRXhwYldsMFpXUXhIakFjCkJnTlZCQU1URlZGMWIxWmhaR2x6SUZKdmIzUWdRMEVnTVNCSE16QWVGdzB4TWpBeE1USXhOekkzTkRSYUZ3MDAKTWpBeE1USXhOekkzTkRSYU1FZ3hDekFKQmdOVkJBWVRBa0pOTVJrd0Z3WURWUVFLRXhCUmRXOVdZV1JwY3lCTQphVzFwZEdWa01SNHdIQVlEVlFRREV4VlJkVzlXWVdScGN5QlNiMjkwSUVOQklERWdSek13Z2dJaU1BMEdDU3FHClNJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUNndmxBUWp1bnliRUMwQkp5RnVUSEszQzNrRWFrRVBCdFYKd2VkWU1CMGt0TVB2aGQ2TUxPSEJQZCtDNWsrdFI0ZHM3RnRKd1VyVnU0L3NoNngvZ3BxRzdEMERtVklCMGpXZQpyTnJ3VThsbVBOU3NBZ0hhSk5NN3FBSkdyNlFjNC9oeldIYTM5ZzZRRGJYd3o4ejYrY1pNNWNPR01BcU5GMzQxCjY4WGZ1dzZjd0kySDQ0ZzRoV2Y2UHNlcjRCT2NCUmlZejVQMXNaSzAvQ1BUejlYRUowbmduanliQ0tPTFhTb2gKNFB3NXFsUGFmWDdQR2dsVHZGMEZCTStoU28rTGRvSU5vZmpTeHhSM1c1QTJCNEdiUGdiNlVsNWp4YVlBL3FYcApVaHRTdFpJNWNnTUpZcjJ3WUJadXB0MGx3Z05tM2ZNRTBVRGlUb3VHOUcvbGc2QW5oRjRFd2ZXUXZUQTl4TytvCmFidzRtNlNrbHRGaTJtbkFBWmF1eThSUk5Pb01xdjhoamxtUFNsemtZWnFuMHVrcWVJMVJQVG9WN3FKWmpxbGMKM3NYNWtDTGxpRVZ4M1pHWmJIcWZQVDJZZkY3MnZoWm9vRjZ1Q3lQOFdnK3FJbll0eWFFUUhlVFRSQ09RaUovRwpLdWJYOVpxeldCNHZNSWtJRzFTaXRaZ2o3QWgzSEpWZFlkSExpWnhmb2txUm11OGhxa2tXQ0tpOVlTZ3h5WFN0CmhmYlp4YkdMMGVVUU1rMWZpeUE2UEVrZk00VlpEZHZMQ1hWRGFYUDdhM0Y5OE4vRVRIM0dveTdJbFhuTGM2S08KVGswaysxN2tCTDV5RzZZbkxVbGFtWHJYWEFrZ3QzK1V1VS94RFJ4ZWlFSWJFYmZua2R1ZWJQUnEzNHdHbUFPdAp6Q2p2cFVmelV3SURBUUFCbzBJd1FEQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BNEdBMVVkRHdFQi93UUVBd0lCCkJqQWRCZ05WSFE0RUZnUVVvNWZXODE2aUVPR3JSWjg4RjJRODdnRnduTXd3RFFZSktvWklodmNOQVFFTEJRQUQKZ2dJQkFCajZXM1g4UG5ySFgzZkh5dC9QWDhNU3hFQmQxREtxdUdyWDFSVVZScGdqcGVhUVd4aVpUT090UXFPQwpNVGFJemVuN3hBU1dTSXNCeDQwQnoxc3pCcFpHWm5RZFQrM0J0cm0wRFdITVkzN1hMbmVNbGh3cUkyaHJoVmQyCmNETVQvdUZQcGlOM0dQb2FqT2k5WmNuUFAvVEpGOXpyeDd6QUJDNHRSaTlwWnNNYmovN3NQdFBLbEw5MkNpVU4KcVhzQ0hLblFPMThMd0lFNlBXVGh2NmN0VHIxTnhOZ3B4aUlZME1Xc2NnS0NQNm82b2pvaWx6SGRDR1BEZFJTNQpZQ2d0VzJqZ0ZxbG1naU5SOWV0VDJER2JlK20zblV2cmlCYlArVjA0aWtrd2orM3g2eG4wZHhveEdFMW5WR3d2CmIyWDUyejNzSWV4ZTlQU0x5bUJsVk5GeFpQVDVwcU9CTXpZemNmQ2tlRjlPcllNaDNqUkpqZWhackozeWRsbzIKOGhQMHIrQUp4MkVxYlBmZ25hNjdoa29vYnk3dXRIbk5rRFBEczNiNjlmQnNuUUdRK3A2UTlweHl6MGZhd3gvawpOU0JUOGxUUjMyR0RwZ0xpSlRqZWhUSXRYbk9RVWwxQ3hNNDlTK0g1R1lRZDFhSlF6RUg3UVJURHZkYkpXcU5qClpnS0F2UVU2TzBlYzdBQW1UUFdJVWIrb0kzOFlCN0FMN1lzbW9XVFRZVXJyWEovZXM2OW5BN01mM1cxZGFXaHAKcTE0NjdIeHB2TWM3aFU2ZUZibTBGVS9EbFhwWTE4bHM2V3k1OHlsalhyUXM4QzA5N1ZwbDRLbGJRTUpJbVlGdApuaDhHS2p3U3RJc1BtNklrOEthTjFucmdTN1prbG1PVmhNSkt6Und1SkljellPWEQKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVF1b1ZhZGlzIFJvb3QgQ0EgMiBHMyBPPVF1b1ZhZGlzIExpbWl0ZWQKIyBTdWJqZWN0OiBDTj1RdW9WYWRpcyBSb290IENBIDIgRzMgTz1RdW9WYWRpcyBMaW1pdGVkCiMgTGFiZWw6ICJRdW9WYWRpcyBSb290IENBIDIgRzMiCiMgU2VyaWFsOiAzOTAxNTYwNzk0NTg5NTkyNTc0NDYxMzMxNjkyNjYwNzk5NjIwMjY4MjQ3MjU4MDAKIyBNRDUgRmluZ2VycHJpbnQ6IGFmOjBjOjg2OjZlOmJmOjQwOjJkOjdmOjBiOjNlOjEyOjUwOmJhOjEyOjNkOjA2CiMgU0hBMSBGaW5nZXJwcmludDogMDk6M2M6NjE6ZjM6OGI6OGI6ZGM6N2Q6NTU6ZGY6NzU6Mzg6MDI6MDU6MDA6ZTE6MjU6ZjU6Yzg6MzYKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDhmOmU0OmZiOjBhOmY5OjNhOjRkOjBkOjY3OmRiOjBiOmViOmIyOjNlOjM3OmM3OjFiOmYzOjI1OmRjOmJjOmRkOjI0OjBlOmEwOjRkOmFmOjU4OmI0OjdlOjE4OjQwCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGWURDQ0EwaWdBd0lCQWdJVVJGYzBKRnVCaVpzMThzNjRLenRicHlid2RTZ3dEUVlKS29aSWh2Y05BUUVMCkJRQXdTREVMTUFrR0ExVUVCaE1DUWsweEdUQVhCZ05WQkFvVEVGRjFiMVpoWkdseklFeHBiV2wwWldReEhqQWMKQmdOVkJBTVRGVkYxYjFaaFpHbHpJRkp2YjNRZ1EwRWdNaUJITXpBZUZ3MHhNakF4TVRJeE9EVTVNekphRncwMApNakF4TVRJeE9EVTVNekphTUVneEN6QUpCZ05WQkFZVEFrSk5NUmt3RndZRFZRUUtFeEJSZFc5V1lXUnBjeUJNCmFXMXBkR1ZrTVI0d0hBWURWUVFERXhWUmRXOVdZV1JwY3lCU2IyOTBJRU5CSURJZ1J6TXdnZ0lpTUEwR0NTcUcKU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQ2hyaVd5QVJqY1Y0Zy9SdXY1citMckkzSGltdEZoWmlGZgpxcThuVWVWdUd4YlVMWDFRc0ZOM3ZYZzZZT0prQXB0OGhwdldHbzZ0L3g4VmY5V1ZIaExMNWhTRUJNSGZOck1XCm40cmp5ZHVZTk03WU14Y29SdnlueWZEU3ROVk5DWEpKK2ZLSDQ2bmFmYUY5YTdJNkphbHRVa1NzK0w1dSs5eW0KYzVHUVlhWURGQ0R5NTRlamlLMnRvSXovcGdzbFVpWG5GZ0hWeTdnMWdReWpPL0RoNGZ4YVhjNkFjVzM0U2FzKwpPN3E0MTRBQis2WHJXN1BGWG1BcU1hQ3ZOK2dnT3Arb01pd016QWtkMDU2T1hieE1tTzdGR21oNzdGT202UlExCm85L05nSjhNU1BzYzlQRy9Tcmo2MVl4eFNzY2ZyZjVCbXJPRFhmS0VWdStsVjBQT0thMk1xMVcveFB0YkFkMGoKSWFGWUFJN0QwR29UN1JQakVpdUEzR2ZtbGJMTkhpSnVLdmhCMVBMS0ZBZU5pbFVTeG1uMXVJWm9MMU5lc05LcQpJY0dZNWpEaloxWEhtMjZzR2FoVnBrVUcwQ002Mit0bFhTb1JFZkE3VDhwdDlEVEVjZVQvQUZyMlhLNGpZSVZ6CjhlUVFzU1d1MVpLN0U4RU00RG5hdERsWHRhczFxbkloTzRNMTV6SGZlaUZ1dURJSWZSMHlrUlZLWW5MUDQzZWgKdk5VUkczWUJad2pnUVF2RDZ4VnUrS1FaMmFLcnIrSW5VbFlyQW9vc0ZDVDV2MElDdnliSXhvL2diamg5VXkzbAo3Wml6bFdOb2YvazE5TitJeFdBMWtzQjhhUnhobFJiUTY5NExyejRFRUVWbFdGQTRyMGp5V2JZVzhqd05rQUxHCmNDNEJyVHdWMXdJREFRQUJvMEl3UURBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUE0R0ExVWREd0VCL3dRRUF3SUIKQmpBZEJnTlZIUTRFRmdRVTdlZHZkbHEvWU94Slc4YWxkN3R5Rm5HYnhEMHdEUVlKS29aSWh2Y05BUUVMQlFBRApnZ0lCQUpIZmdEOURDWDV4d3ZmcnM0aVA0Vkd5dkQxMStTaGR5THlabTN0ZHF1WEs0UXIzNkxMVG45MW5NWDY2CkFhckhha0U3a05RSVhMSmdhcER3eU00RFl2bUw3ZnR1S3R3R1RUd3BENGtXaWxoTVNBL29oR0hxUEhLbWQrUkMKcm9palExaDVmcTdLcFZNTnFUMXd2U0FaWWFSc09QeERNdUhCUi8vNDdQRVJJaktXbk1MMlcybVdleUFNUTBHYQpXL1paR1lqZVZZZzNVUXQ0WEFvZW8wTDl4NTJJRDhEeWVBSWtWSk92aVllSXlVcUFIZXJRYmo1aExqYTdOUTRuCmx2MW1ORHRoY25QeEZseEhCbFJKQUhwWUVyQUs3NFg5c2JnemRXcVRIQkxtWUY1dkhYL0pIeVBMaEdHZkhvSkUKK1YrdFlsVWttbEtZN1ZIbm9YNlhPdVl2SHhIYVU0QXNoWjZyTlJEYklsOXF4VjZYVS9JeUFna3dvMWp3RFFIVgpjc2F4ZkdsN3cvVTJSY3hoYmw1TWxNVmVydWdPWG91Lzk4M2c3YUVPR3pQdVZCaitENzd2Zm9SclErTndtTnRkCmRiSU5XUWVGRlNNNTF2SGZxU1lQMWtqSHM2WWk5VE0zV3BWSG4zdTZHQlZ2LzlZVVpJTkowZ3BuSWRzUE5XTmcKS0NManNaV0R6WVdtM1M4UDUyZFNicnN2aFh6MVNuUG54VDdBdlNFU0JULzh0d05KQWx2SUplYmlWRGoxZVllTQpIVk95VG9WN0JqakhMUGo0c0hLTkplVjNVdlFESEVpbVVGK0lJREJ1OG9KRHF6MlhoT2RUK3lIQlR3OGltb2E0CldTcjJSejBaaUMzb2hlR2U3SVVJYXJGc05Na2Q3RWdyTzNqdFpzU09lV21EM24rTQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049UXVvVmFkaXMgUm9vdCBDQSAzIEczIE89UXVvVmFkaXMgTGltaXRlZAojIFN1YmplY3Q6IENOPVF1b1ZhZGlzIFJvb3QgQ0EgMyBHMyBPPVF1b1ZhZGlzIExpbWl0ZWQKIyBMYWJlbDogIlF1b1ZhZGlzIFJvb3QgQ0EgMyBHMyIKIyBTZXJpYWw6IDI2ODA5MDc2MTE3MDQ2MTQ2MjQ2Mzk5NTk1MjE1NzMyNzI0MjEzNzA4OTIzOTU4MQojIE1ENSBGaW5nZXJwcmludDogZGY6N2Q6Yjk6YWQ6NTQ6NmY6Njg6YTE6ZGY6ODk6NTc6MDM6OTc6NDM6YjA6ZDcKIyBTSEExIEZpbmdlcnByaW50OiA0ODoxMjpiZDo5MjozYzphODpjNDozOTowNjplNzozMDo2ZDoyNzo5NjplNjphNDpjZjoyMjoyZTo3ZAojIFNIQTI1NiBGaW5nZXJwcmludDogODg6ZWY6ODE6ZGU6MjA6MmU6YjA6MTg6NDU6MmU6NDM6Zjg6NjQ6NzI6NWM6ZWE6NWY6YmQ6MWY6YzI6ZDk6ZDI6MDU6NzM6MDc6MDk6YzU6ZDg6Yjg6Njk6MGY6NDYKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZZRENDQTBpZ0F3SUJBZ0lVTHZXYkFpaW4yM3IvMWFPcDdyMERvTThTYWgwd0RRWUpLb1pJaHZjTkFRRUwKQlFBd1NERUxNQWtHQTFVRUJoTUNRazB4R1RBWEJnTlZCQW9URUZGMWIxWmhaR2x6SUV4cGJXbDBaV1F4SGpBYwpCZ05WQkFNVEZWRjFiMVpoWkdseklGSnZiM1FnUTBFZ015QkhNekFlRncweE1qQXhNVEl5TURJMk16SmFGdzAwCk1qQXhNVEl5TURJMk16SmFNRWd4Q3pBSkJnTlZCQVlUQWtKTk1Sa3dGd1lEVlFRS0V4QlJkVzlXWVdScGN5Qk0KYVcxcGRHVmtNUjR3SEFZRFZRUURFeFZSZFc5V1lXUnBjeUJTYjI5MElFTkJJRE1nUnpNd2dnSWlNQTBHQ1NxRwpTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFDenl3NFFaNDdxRkplbk1pb0tWalovYUV6SHMyODZJeFNSCi94bC9wY3FzN3JOMm5YcnBpeHVyYXpIYitndFRUSy9GcFJwNVBJcE0vNnpmSmQ1TzJZSXlDMFRleXR1TXJLTnUKRm9NN3BtUkxNb243RmhZNGZ1dEQ0dE4wU3NKaUNuTUszVW16VjlLd0NvV2RjVHplbzh2QU12TUJPU0JER3pYUgpVN094N3NXVGFZSStGclVvUnFIZTZva0o3VU80QlVhS2h2VlpSNzRiYndFaEVMbjlxZElveWhBNUNjb1ROcytjCnJhMUFkSGtyQWo4MC8vb2dhWDNUN21IMXVyUG5NTkEzSTRaeVlVVXBTRmxvYjNlbUxvRytCMDF2cjg3RVJST1IKRkhBR2p4K2YrSWRwc1E3dnc0a1o2K29jWWZ4NmJJcmMxZ01MbmlhNkV0M1VWRG1ySnFNejZuV0IyaTNORDAvawpBOUh2RlpjYmE1REZBcENUWmdJaHNVZmVpNXBLZ0xsVmo3V2lMOERXTTJmYWZzU250QVJFNjBmNzVsaTU5d3p3CmV5dXh3SEFwdzBCaUxUdElhZHdqUEVqcmV3bDVxVzNhcURDWXo0QnlBNGltVzBhdWNubDhDQU1oWmE2MzRSeWwKc1NxaU1kNW1CUGZBZE9oeDN2ODlXY3lXSmhLTGhaVlhHcXRyZFF0RVBSRW9QSHRodCtLUFowL2w3RHhNWUlCcApWemdlQVZ1TlZlakgzOERNZHlNMFNYVjg5cGdSNnkzZTdVRXVGQVVDZitEK0lPczE1eEdzSXM1WFBkN0pNRzBRCkE0WE44ZitNRnJYQnNqNkliR0Iva0UrVjkvWXRyUUU1QndUNmRZQjl2MGxRN2UvSnhId2M2NEIrMjdiUTNSUCsKeWRPYzE3S1hxUUlEQVFBQm8wSXdRREFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQTRHQTFVZER3RUIvd1FFQXdJQgpCakFkQmdOVkhRNEVGZ1FVeGhmUXZLanFBa1B5R3dhWlhTdVFJTG5Ybk9Rd0RRWUpLb1pJaHZjTkFRRUxCUUFECmdnSUJBRFJoMlZhMUVvZFZUZDJqTlRGR3U2UUhjcnhmWVdMb3Bmc0xON0U4dHJQNktaMS9BdldreWFpVHQzcHgKS0dtUGMrRlNrTnJWdmpybHQzWnFWb0FoMzEzbTZUcWU1VDcyb21uSEtncXdHRWZjSUhCOVVxTStXWHpCdXNuSQpGVUJoeW5MV2NLelN0L0FjNUlZcDhNN3ZhR1BRdFNDS0ZXR2Fmb2FZdE1uQ2R2dk11akFXektOaHhuUVQ1V3Z2Cm94WHFBLzRUaTJUazA4SFM2SVQ3U2RFUVRYbG02NnI5OUkweEhuQVVyZHplWnhOTWdSVmh2TGZaa1hkeEdZRmcKdS9CWXBiV2NDL2VQSWxVbndFc0JiVHVaRGRRZG0yTm5MOUR1RGNwbXZKUlBwcTN0L081anJGYy9aU1hQc29hUAowQWovdUhZVWJ0N2xKK3lyZUxWVHViWS82Q0Q1MHFpK1lVYktoNHlFOC9ueG9HaWJJaDZCSnBzUUJKRnh3QVlmCjNLRFR1VmFuNDVndGY0T2QzNHdybkRLT01wVHdBVHdpS3A5RHdpN0RtRGtIT0h2OFhnQkNIL015Sm5tRGhQYmwKOE1GUkVzQUxIZ1FqREZTbFRDOUp4VXJSdG01Z0RXdjhhNHVGSkdTM2lRNnJKVWRiUE05K1NiM0g2UXJHMnZkKwpEaGNJMDBpWDBIR1M4QTg1UGpScUhIM1k4aUt1dTJuME03U21TRlhSRHc0bTZPeTJDeTJuaFRYTi9WbkluOUhOClBsb3BOTGs5aE02eFpkUlprWkZXZFNIQmQ1NzVldUZnbmRPdEJCajBmT3RlazQ5VFNpSXArRWdyUGsyR3JGdC8KeXdhWldXRFlXR1dWalVUUjkzOStKMzk5cm9EMUIweTJQcHh4VkprRVMvMVkrWmowCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1EaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIgTz1EaWdpQ2VydCBJbmMgT1U9d3d3LmRpZ2ljZXJ0LmNvbQojIFN1YmplY3Q6IENOPURpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBHMiBPPURpZ2lDZXJ0IEluYyBPVT13d3cuZGlnaWNlcnQuY29tCiMgTGFiZWw6ICJEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIiCiMgU2VyaWFsOiAxNTM4NTM0ODE2MDg0MDIxMzkzODY0MzAzMzYyMDg5NDkwNTQxOQojIE1ENSBGaW5nZXJwcmludDogOTI6Mzg6Yjk6Zjg6NjM6MjQ6ODI6NjU6MmM6NTc6MzM6ZTY6ZmU6ODE6OGY6OWQKIyBTSEExIEZpbmdlcnByaW50OiBhMTo0Yjo0ODpkOTo0MzplZTowYTowZTo0MDo5MDo0ZjozYzplMDphNDpjMDo5MTo5Mzo1MTo1ZDozZgojIFNIQTI1NiBGaW5nZXJwcmludDogN2Q6MDU6ZWI6YjY6ODI6MzM6OWY6OGM6OTQ6NTE6ZWU6MDk6NGU6ZWI6ZmU6ZmE6Nzk6NTM6YTE6MTQ6ZWQ6YjI6ZjQ6NDk6NDk6NDU6MmY6YWI6N2Q6MmY6YzE6ODUKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURsakNDQW42Z0F3SUJBZ0lRQzVNY090WTVaK3BuSTcvRHI1cjBTekFOQmdrcWhraUc5dzBCQVFzRkFEQmwKTVFzd0NRWURWUVFHRXdKVlV6RVZNQk1HQTFVRUNoTU1SR2xuYVVObGNuUWdTVzVqTVJrd0Z3WURWUVFMRXhCMwpkM2N1WkdsbmFXTmxjblF1WTI5dE1TUXdJZ1lEVlFRREV4dEVhV2RwUTJWeWRDQkJjM04xY21Wa0lFbEVJRkp2CmIzUWdSekl3SGhjTk1UTXdPREF4TVRJd01EQXdXaGNOTXpnd01URTFNVEl3TURBd1dqQmxNUXN3Q1FZRFZRUUcKRXdKVlV6RVZNQk1HQTFVRUNoTU1SR2xuYVVObGNuUWdTVzVqTVJrd0Z3WURWUVFMRXhCM2QzY3VaR2xuYVdObApjblF1WTI5dE1TUXdJZ1lEVlFRREV4dEVhV2RwUTJWeWRDQkJjM04xY21Wa0lFbEVJRkp2YjNRZ1J6SXdnZ0VpCk1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRRFo1eWd2VWo4MmNrbUlrelR6K0dvZU1WU0EKbjYxVVFiVkgzNWFvMUsrQUxia0t6M1g5aWFWOUpQcmpJZ3dydkpVWEN6Ty9HVTFCQnBBQXZReE5FUDRIdGVjYwpiaUpWTVdXWHZkTVgwaDVpODl2cWJGQ01QNFFNbHMrM3l3UGd5bTJoRkV3YmlkM3RBTEJTZksrUmJMRTRFOUhwCkVnakFBTEFjS3hIYWQzQTJtNjdPZVlmY2duRG1DWFJ3Vldtdm8yaWZ2OTIyZWJQeW5YQXBWZlNyLzVWaDg4bEEKYngzUnZwTzcwNGdxdTUyL2NscFdjVHMvMVBQUkN2NG83NlB1MlptdkE5T1BZTGZ5a3FHeHZZbUpIekROdzZZdQpZak91RmdKM1JGcm5nUW84cDBRdWViZy9CTHhjb0lmaEc2OVJqczNzTFByNC9tM3dPbnlxaStSbmxUR05BZ01CCkFBR2pRakJBTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RGdZRFZSMFBBUUgvQkFRREFnR0dNQjBHQTFVZERnUVcKQkJUT3cwcTVtVlh5dU50Z3Y2bCt2VmExbHphbjFqQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FRRUF5cVZWak9QSQpRVzVwSjZkMUVlODhoalp2MHAzR2VEZ2RhWmFpa21rdU9HeWJmUVRVaWFXeE1UZUt5U0hNcTJ6Tml4eWExcjlJCjBqSm13WXJBOHk4Njc4RGoxSkdHMFZEakE5dHpkMjlLT1ZQdDNpYkh0WDJ2SzBMUmRXTGpTaXNDeDFCTDRHbmkKbG13T1JHWVFSSSt0QmV2NGVheW1HK2czTkoxVHlXR3FvbEt2U25BV2hzSTZ5TEVUY0RiWXorNzBDalRWVzB6OQpCNXlpdXRrQmNsenpUY0hkRHJFY0RjUmp2cTMwRlB1SjdLSkJEa3pNeUZkQTBHNERxczBNam9tWm1XendQREN2Ck9OOXZ2S08rS1NBbnEzVC9FeUo0M3BkU1ZSNkR0VlFnQSs2dXdFOVczamZNdzMrcUJDZTcwM2U0WXRzWGZKd28KSWhOemJNOG05WW9wNXc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049RGlnaUNlcnQgQXNzdXJlZCBJRCBSb290IEczIE89RGlnaUNlcnQgSW5jIE9VPXd3dy5kaWdpY2VydC5jb20KIyBTdWJqZWN0OiBDTj1EaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMgTz1EaWdpQ2VydCBJbmMgT1U9d3d3LmRpZ2ljZXJ0LmNvbQojIExhYmVsOiAiRGlnaUNlcnQgQXNzdXJlZCBJRCBSb290IEczIgojIFNlcmlhbDogMTU0NTkzMTI5ODEwMDg1NTM3MzE5MjgzODQ5NTMxMzU0MjY3OTYKIyBNRDUgRmluZ2VycHJpbnQ6IDdjOjdmOjY1OjMxOjBjOjgxOmRmOjhkOmJhOjNlOjk5OmUyOjVjOmFkOjZlOmZiCiMgU0hBMSBGaW5nZXJwcmludDogZjU6MTc6YTI6NGY6OWE6NDg6YzY6Yzk6Zjg6YTI6MDA6MjY6OWY6ZGM6MGY6NDg6MmM6YWI6MzA6ODkKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDdlOjM3OmNiOjhiOjRjOjQ3OjA5OjBjOmFiOjM2OjU1OjFiOmE2OmY0OjVkOmI4OjQwOjY4OjBmOmJhOjE2OjZhOjk1OjJkOmIxOjAwOjcxOjdmOjQzOjA1OjNmOmMyCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDUmpDQ0FjMmdBd0lCQWdJUUM2RmEraDNmb0xWSlJLL05KS0JzN0RBS0JnZ3Foa2pPUFFRREF6QmxNUXN3CkNRWURWUVFHRXdKVlV6RVZNQk1HQTFVRUNoTU1SR2xuYVVObGNuUWdTVzVqTVJrd0Z3WURWUVFMRXhCM2QzY3UKWkdsbmFXTmxjblF1WTI5dE1TUXdJZ1lEVlFRREV4dEVhV2RwUTJWeWRDQkJjM04xY21Wa0lFbEVJRkp2YjNRZwpSek13SGhjTk1UTXdPREF4TVRJd01EQXdXaGNOTXpnd01URTFNVEl3TURBd1dqQmxNUXN3Q1FZRFZRUUdFd0pWClV6RVZNQk1HQTFVRUNoTU1SR2xuYVVObGNuUWdTVzVqTVJrd0Z3WURWUVFMRXhCM2QzY3VaR2xuYVdObGNuUXUKWTI5dE1TUXdJZ1lEVlFRREV4dEVhV2RwUTJWeWRDQkJjM04xY21Wa0lFbEVJRkp2YjNRZ1J6TXdkakFRQmdjcQpoa2pPUFFJQkJnVXJnUVFBSWdOaUFBUVo1N3lzUkdYdHpiZy9XUHVOc1ZlcFJDMEZGZkx2Qy84UWRKKzFZbEpmClpuNGY1ZHdiUlhrTHpNWlRDcDJOWFFMWnFWbmVBbHIybFNvT2pUaEtpa25Hdk1ZRE9BZGZWZHArQ1c3aWYxN1EKUlNBUFdYWVExcUFrOEMzZU52SnNLVG1qUWpCQU1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFILwpCQVFEQWdHR01CMEdBMVVkRGdRV0JCVEwwTDJwNFpnRlVhRk5ONktEZWM2TkhTcmtoREFLQmdncWhrak9QUVFECkF3Tm5BREJrQWpBbHBJRkZBbXNTUzNWMFQ4Z2o0M0R5ZFhMZWZJbnd6NUZ5WVo1ZUVKSlpWcm1EeHhEbk9PbFkKSmpaOTFlUTBoamtDTUh3MlUvQXc1V0pqT3BuaXRxTTdtelQ2SHRvUWtuRmVrUk9uM2FSdWtzd3kxdlVoWnNjdgo2cFpqYW1WRmtwVUJ0QT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1EaWdpQ2VydCBHbG9iYWwgUm9vdCBHMiBPPURpZ2lDZXJ0IEluYyBPVT13d3cuZGlnaWNlcnQuY29tCiMgU3ViamVjdDogQ049RGlnaUNlcnQgR2xvYmFsIFJvb3QgRzIgTz1EaWdpQ2VydCBJbmMgT1U9d3d3LmRpZ2ljZXJ0LmNvbQojIExhYmVsOiAiRGlnaUNlcnQgR2xvYmFsIFJvb3QgRzIiCiMgU2VyaWFsOiA0MjkzNzQzNTQwMDQ2OTc1Mzc4NTM0ODc5NTAzMjAyMjUzNTQxCiMgTUQ1IEZpbmdlcnByaW50OiBlNDphNjo4YTpjODo1NDphYzo1Mjo0Mjo0NjowYTpmZDo3Mjo0ODoxYjoyYTo0NAojIFNIQTEgRmluZ2VycHJpbnQ6IGRmOjNjOjI0OmY5OmJmOmQ2OjY2Ojc2OjFiOjI2OjgwOjczOmZlOjA2OmQxOmNjOjhkOjRmOjgyOmE0CiMgU0hBMjU2IEZpbmdlcnByaW50OiBjYjozYzpjYjpiNzo2MDozMTplNTplMDoxMzo4Zjo4ZDpkMzo5YToyMzpmOTpkZTo0NzpmZjpjMzo1ZTo0MzpjMToxNDo0YzplYToyNzpkNDo2YTo1YTpiMTpjYjo1ZgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRGpqQ0NBbmFnQXdJQkFnSVFBenJ4NXFjUnFhQzdLR1N4SFFuNjVUQU5CZ2txaGtpRzl3MEJBUXNGQURCaApNUXN3Q1FZRFZRUUdFd0pWVXpFVk1CTUdBMVVFQ2hNTVJHbG5hVU5sY25RZ1NXNWpNUmt3RndZRFZRUUxFeEIzCmQzY3VaR2xuYVdObGNuUXVZMjl0TVNBd0hnWURWUVFERXhkRWFXZHBRMlZ5ZENCSGJHOWlZV3dnVW05dmRDQkgKTWpBZUZ3MHhNekE0TURFeE1qQXdNREJhRncwek9EQXhNVFV4TWpBd01EQmFNR0V4Q3pBSkJnTlZCQVlUQWxWVApNUlV3RXdZRFZRUUtFd3hFYVdkcFEyVnlkQ0JKYm1NeEdUQVhCZ05WQkFzVEVIZDNkeTVrYVdkcFkyVnlkQzVqCmIyMHhJREFlQmdOVkJBTVRGMFJwWjJsRFpYSjBJRWRzYjJKaGJDQlNiMjkwSUVjeU1JSUJJakFOQmdrcWhraUcKOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXV6Zk5OTng3YThteWFKQ3RTblgvUnJvaENnaU45UmxVeWZ1SQoyL091OGpxSmtUeDY1cXNHR212UHJDM29YZ2trUkxwaW1uN1dvNmgrNEZSMUlBV3NVTGVjWXhwc01OemFIeG14CjF4N2UvZGZneTVTRE42N3NIME5PM1hzczByMHVwUy9rcWJpdE90U1pwTFlsNlp0ckFHQ1NZUDlQSVVrWTkyZVEKcTJFR25JL3l1dW0wNlpJeWE3WHpWK2hkRzgyTUhhdVZCSlZKOHpVdGx1TkpiZDEzNC90SlM3U3NWUWVwajVXegp0Q083VEcxRjhQYXBzcFV3dFAxTVZZd25TbGNVZklLZHpYT1MweFpLQmd5TVVOR1BIZ20rRjZIbUljcjlnK1VRCnZJT2xDc1JuS1BaekZCUTlSbmJEaHhTSklUUk5ydzlGREtaSm9icTduTVd4TTRNcGhRSURBUUFCbzBJd1FEQVAKQmdOVkhSTUJBZjhFQlRBREFRSC9NQTRHQTFVZER3RUIvd1FFQXdJQmhqQWRCZ05WSFE0RUZnUVVUaUpVSUJpVgo1dU51NWcvNitya1M3UVlYanprd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFHQm5LSlJ2RGtoajZ6SGQ2bWNZCjFZbDlQTVdMU24vcHZ0c3JGOSt3WDNOM0tqSVRPWUZuUW9RajhrVm5OZXlJdi9pUHNHRU1OS1N1SUV5RXh0djQKTmVGMjJkK21RcnZIUkFpR2Z6WjBKRnJhYkEwVVdUVzk4a25kdGgvSnN3MUhLajJaTDd0Y3U3WFVJT0daWDFORwpGZHRvbS9Eek1OVStNZUtOaEo3aml0cmFsajQxRTZWZjhQbHdVSEJIUVJGWEdVN0FqNjRHeEpVVEZ5OGJKWjkxCjhyR09tYUZ2RTdGQmNmNklLc2hQRUNCVjEvTVVSZVhnUlBUcWg1VXlrdzcrVTBiNkxKMy9peUs1UzlrSlJhVGUKcExpYVdOMGJmVktmamxsRGlJR2tuaWJWYjYzZERjWTNmZTBEa2h2bGQxOTI3anlOeEYxV1c2TFpabTZ6TlRmbApNclk9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1EaWdpQ2VydCBHbG9iYWwgUm9vdCBHMyBPPURpZ2lDZXJ0IEluYyBPVT13d3cuZGlnaWNlcnQuY29tCiMgU3ViamVjdDogQ049RGlnaUNlcnQgR2xvYmFsIFJvb3QgRzMgTz1EaWdpQ2VydCBJbmMgT1U9d3d3LmRpZ2ljZXJ0LmNvbQojIExhYmVsOiAiRGlnaUNlcnQgR2xvYmFsIFJvb3QgRzMiCiMgU2VyaWFsOiA3MDg5MjQ0NDY5MDMwMjkzMjkxNzYwMDgzMzMzODg0MzY0MTQ2CiMgTUQ1IEZpbmdlcnByaW50OiBmNTo1ZDphNDo1MDphNTpmYjoyODo3ZToxZTowZjowZDpjYzo5Njo1Nzo1NjpjYQojIFNIQTEgRmluZ2VycHJpbnQ6IDdlOjA0OmRlOjg5OjZhOjNlOjY2OjZkOjAwOmU2Ojg3OmQzOjNmOmZhOmQ5OjNiOmU4OjNkOjM0OjllCiMgU0hBMjU2IEZpbmdlcnByaW50OiAzMTphZDo2Njo0ODpmODoxMDo0MTozODpjNzozODpmMzo5ZTphNDozMjowMTozMzozOTozZTozYToxODpjYzowMjoyOTo2ZTpmOTo3YzoyYTpjOTplZjo2NzozMTpkMAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ1B6Q0NBY1dnQXdJQkFnSVFCVlZXdlBKZXBEVTF3NlFQMWF0RmNqQUtCZ2dxaGtqT1BRUURBekJoTVFzdwpDUVlEVlFRR0V3SlZVekVWTUJNR0ExVUVDaE1NUkdsbmFVTmxjblFnU1c1ak1Sa3dGd1lEVlFRTEV4QjNkM2N1ClpHbG5hV05sY25RdVkyOXRNU0F3SGdZRFZRUURFeGRFYVdkcFEyVnlkQ0JIYkc5aVlXd2dVbTl2ZENCSE16QWUKRncweE16QTRNREV4TWpBd01EQmFGdzB6T0RBeE1UVXhNakF3TURCYU1HRXhDekFKQmdOVkJBWVRBbFZUTVJVdwpFd1lEVlFRS0V3eEVhV2RwUTJWeWRDQkpibU14R1RBWEJnTlZCQXNURUhkM2R5NWthV2RwWTJWeWRDNWpiMjB4CklEQWVCZ05WQkFNVEYwUnBaMmxEWlhKMElFZHNiMkpoYkNCU2IyOTBJRWN6TUhZd0VBWUhLb1pJemowQ0FRWUYKSzRFRUFDSURZZ0FFM2FmWnU0cTRDL3NMZnlIUzhMNitjL016WFJxOE5PcmV4cHU4MEpYMjhNelFDN3BoVzFGRwpmcDR0bis2T1l3d1g3QWR3OWMrRUxrQ0RuT2cvUVcwN3JkT2tGRmsyZUowRFErNFFFMnh5M3E2SXA2RnJ0VVBPClo5d2ovd01jbytJK28wSXdRREFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQTRHQTFVZER3RUIvd1FFQXdJQmhqQWQKQmdOVkhRNEVGZ1FVczl0SXBQbWh4ZGl1TmtITUVXTnBZaW04UzhZd0NnWUlLb1pJemowRUF3TURhQUF3WlFJeApBSzI4OG13L0VrclJMVG5EQ2dtWGMvU0lOb3lJSjd2bWlJMVFoYWRqK1o0eTNtYVREL0hNc1FtUDNXeXIrbXQvCm9BSXdPV1pid21TTnVKNVEzS2pWU2FMdHg5elJTWDhYQWJqSWhvOU9qSWdycUpxcGlzWFJBTDM0Vk9LYTVWdDgKc3ljWAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049RGlnaUNlcnQgVHJ1c3RlZCBSb290IEc0IE89RGlnaUNlcnQgSW5jIE9VPXd3dy5kaWdpY2VydC5jb20KIyBTdWJqZWN0OiBDTj1EaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQgTz1EaWdpQ2VydCBJbmMgT1U9d3d3LmRpZ2ljZXJ0LmNvbQojIExhYmVsOiAiRGlnaUNlcnQgVHJ1c3RlZCBSb290IEc0IgojIFNlcmlhbDogNzQ1MTUwMDU1ODk3NzM3MDc3NzkzMDA4NDg2OTAxNjYxNDIzNgojIE1ENSBGaW5nZXJwcmludDogNzg6ZjI6ZmM6YWE6NjA6MWY6MmY6YjQ6ZWI6Yzk6Mzc6YmE6NTM6MmU6NzU6NDkKIyBTSEExIEZpbmdlcnByaW50OiBkZDpmYjoxNjpjZDo0OTozMTpjOTo3MzphMjowMzo3ZDozZjpjODozYTo0ZDo3ZDo3Nzo1ZDowNTplNAojIFNIQTI1NiBGaW5nZXJwcmludDogNTU6MmY6N2I6ZGM6ZjE6YTc6YWY6OWU6NmM6ZTY6NzI6MDE6N2Y6NGY6MTI6YWI6Zjc6NzI6NDA6Yzc6OGU6NzY6MWE6YzI6MDM6ZDE6ZDk6ZDI6MGE6Yzg6OTk6ODgKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZrRENDQTNpZ0F3SUJBZ0lRQlpzYlY1Nk9JVExpT1FlOXAzZDFYREFOQmdrcWhraUc5dzBCQVF3RkFEQmkKTVFzd0NRWURWUVFHRXdKVlV6RVZNQk1HQTFVRUNoTU1SR2xuYVVObGNuUWdTVzVqTVJrd0Z3WURWUVFMRXhCMwpkM2N1WkdsbmFXTmxjblF1WTI5dE1TRXdId1lEVlFRREV4aEVhV2RwUTJWeWRDQlVjblZ6ZEdWa0lGSnZiM1FnClJ6UXdIaGNOTVRNd09EQXhNVEl3TURBd1doY05Nemd3TVRFMU1USXdNREF3V2pCaU1Rc3dDUVlEVlFRR0V3SlYKVXpFVk1CTUdBMVVFQ2hNTVJHbG5hVU5sY25RZ1NXNWpNUmt3RndZRFZRUUxFeEIzZDNjdVpHbG5hV05sY25RdQpZMjl0TVNFd0h3WURWUVFERXhoRWFXZHBRMlZ5ZENCVWNuVnpkR1ZrSUZKdmIzUWdSelF3Z2dJaU1BMEdDU3FHClNJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUMvNXBCemFONjc1RjFLUERBaU1Ha3o3TUtuSlM3SklUM3kKaXRoWnd1RXBwejFZcTNhYXphNTdHNFFOeERBZjh4dWtPQmJyVnNhWGJSMnJzbm55eWhIUzVGL1dCVHhTRDFJZgp4cDRWcFg2K242bFhGbGxWY3E5b2szRENzcnAxbVdwek1wVFJFRVFRTHQrQzh3ZUU1blE3YlhIaUxRd2I3aURWCnlTQWRZeWt0enV4ZVRzaVQrQ0ZobXpUckJjWmU3RnNhdk92Sno4MnNORUJmc1hwbTduZklTS2htVjFlZlZGaU8KREN1M1Q2Y3cyVmJ1eW50ZDQ2M0pUMTdsTmVjeHk5cVRYdHlPajREYXRwR1lRSkI1dzNqSHRySEV0V29ZT0FNUQpqZGpVTjZRdUJYMkk5WUkrRUpGd3ExV0NRVExYMndSekttNlJBWHdoVE5TOHJoc0RkVjE0WnRrNk1VU2FNMEMvCkNOZGFTYVRDNXFtZ1o5MmtKN3loVHptMUVWZ1g5eVJjUm85azk4RnBpSGFZZGoxWlhVSjJoNG1YYVhwSThPQ2kKRWh0bW1uVEsza3NlNXc1anJ1YlU3NUtTT3A0OTNBRGtSU1dKdHBwRUdTdCt3SlMwMG1GdDZ6UFp4ZDlMQkFETQpmUnlWdzQvM0liS3lFYmU3Zi9MVmpIQXNRV0Nxc1dNWVJKVWFkbUorOW9DdysraGtwalBSaVFmaHZiZm1RNlFZCnVLWjNBZUVQbEF3aEhiSlVLU1dKYk9VT1VsRkhkTDRtckxaQmRkNTZyRitOUDhtODAwRVJFbHZsRUZEck1jWEsKY2hZaUNkOThUSFUvWSt3aFg4UWdVV3R2c2F1R2kwL0Mxa1ZmblNEOG9SN0Z3SStpc1g0S0pwbjE1R2t2bUIwdAo5ZG1wc2gzbEd3SURBUUFCbzBJd1FEQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BNEdBMVVkRHdFQi93UUVBd0lCCmhqQWRCZ05WSFE0RUZnUVU3TmZqZ3RKeFhXUk0zeTVuUCtlNm1LNGNEMDh3RFFZSktvWklodmNOQVFFTUJRQUQKZ2dJQkFMdGgyWDJwYkw0WHhKRWJ3NkdpQUkzalpHZ1BWczkzcm5ENS9acEttYm5KZUZ3TURGL2s1aFFwVmdzMgpTVjFFWStDdG5KWVlaaHNqRFQxNTZXMXIxbFQ0MGp6QlEwQ3VIVkQxVXZ5UU83dVltV2xyeDhHbnFHaWtKOXlkCitTZXVNSVc1OW1kTk9qNlBXVGtpVTBUcnlGMER5dTFRZW4xaUlRcUF5SE5tMGFBRllGL29wYlNucjZqM2JUV2MKZkZxSzFxSTRtZk40aS9STjBpQUwzZ1R1akp0SGdYSU53QlF5N3pCWkxxN2djZkpXNUdxWGI1SlFiWmFOYUhxYQpzallVZWdieUpMa0pFVkRYQ0xHNGlYcUVJMkZDS2VXanphSWdRZGZSbkdUWjZpYWhpeFRYVEJteVVFRnhQVDlOCmNDT0dERXJjZ2RMTU1wU0VEUWdKbHh4UHdPNXJJSFF3MHVBNU5CQ0ZJUlVCQ09oVk10NXhTZGtvRjFCTjVyNU4KMFhXczBNcjdRYmhEcGFyVHd3VkVUeXcybStMNjRrVzRJMU5zQm05blZYOUd0VXcvYmloYWVTYlNwS2hpbDlJZQo0dTFLaTd3Yi9VZEtEZDluWm42eVcwSFFPK1QwTy9RRVkrbnZ3bFFBVWFDS0tzbk9lTXpWNm9jRUdMUE9yMG1JCnIvT1NtYmF6NW1FUDBvVUE1MUFhNUJ1Vm5SbWh1Wnl4bTdFQUh1L1FEMDlDYk1rS3ZPNUQranB4cGNoTkpxVTEKL1lsZHZJVmlIVExTb0N0VTdacFh3ZHY2RU04WnQ0dEtHNDhCdGllVlUraTJpVzFidkdqVUkraUxVYUpXK2ZDbQpnS0RXSHJPOER3OVRkU21xNmhOMzVONk1nU0d0QnhCSEVhMkhQUWZSZGJ6UDgyWisKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1DT01PRE8gQ0EgTGltaXRlZAojIFN1YmplY3Q6IENOPUNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1DT01PRE8gQ0EgTGltaXRlZAojIExhYmVsOiAiQ09NT0RPIFJTQSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSIKIyBTZXJpYWw6IDEwMTkwOTA4NDUzNzU4MjA5MzMwODk0MTM2MzUyNDg3MzE5MzExNwojIE1ENSBGaW5nZXJwcmludDogMWI6MzE6YjA6NzE6NDA6MzY6Y2M6MTQ6MzY6OTE6YWQ6YzQ6M2U6ZmQ6ZWM6MTgKIyBTSEExIEZpbmdlcnByaW50OiBhZjplNTpkMjo0NDphODpkMToxOTo0MjozMDpmZjo0Nzo5ZjplMjpmODo5NzpiYjpjZDo3YTo4YzpiNAojIFNIQTI1NiBGaW5nZXJwcmludDogNTI6ZjA6ZTE6YzQ6ZTU6OGU6YzY6Mjk6Mjk6MWI6NjA6MzE6N2Y6MDc6NDY6NzE6Yjg6NWQ6N2U6YTg6MGQ6NWI6MDc6Mjc6MzQ6NjM6NTM6NGI6MzI6YjQ6MDI6MzQKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUYyRENDQThDZ0F3SUJBZ0lRVEtyNXl0dGpiK0FmOTA3WVd3T0duVEFOQmdrcWhraUc5dzBCQVF3RkFEQ0IKaFRFTE1Ba0dBMVVFQmhNQ1IwSXhHekFaQmdOVkJBZ1RFa2R5WldGMFpYSWdUV0Z1WTJobGMzUmxjakVRTUE0RwpBMVVFQnhNSFUyRnNabTl5WkRFYU1CZ0dBMVVFQ2hNUlEwOU5UMFJQSUVOQklFeHBiV2wwWldReEt6QXBCZ05WCkJBTVRJa05QVFU5RVR5QlNVMEVnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa3dIaGNOTVRBd01URTUKTURBd01EQXdXaGNOTXpnd01URTRNak0xT1RVNVdqQ0JoVEVMTUFrR0ExVUVCaE1DUjBJeEd6QVpCZ05WQkFnVApFa2R5WldGMFpYSWdUV0Z1WTJobGMzUmxjakVRTUE0R0ExVUVCeE1IVTJGc1ptOXlaREVhTUJnR0ExVUVDaE1SClEwOU5UMFJQSUVOQklFeHBiV2wwWldReEt6QXBCZ05WQkFNVElrTlBUVTlFVHlCU1UwRWdRMlZ5ZEdsbWFXTmgKZEdsdmJpQkJkWFJvYjNKcGRIa3dnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFDUgo2RlNTMGdwV3Nhd05KTjNGejBSbmRKa3JONk45STNBQWNieFQzOFQ2S2hLUFMzOFFWcjJmY0hLM1lYL0pTdzhYCnB6M2pzQVJoN3Y4Umw4ZjBoajRLK2o1YytaUG1OSHJaRkd2bm5MT0ZvSUo2ZHE5eGtOZnMvUTM2bkd6NjM3Q0MKOUJSKytiN0VwaTlQZjVsL3RmeG5RM0s5REFEV2lldHJMTlB0ajVnY0ZLdCs1ZU51L05pbzVKSWsya05yWXJoVgovZXJCdkd5MmkvTU9qWnJrbTJ4cG1maDRTREJGMWEzaERUeEZZUHd5bGxFbnZHZkR5aTYyYStwR3g4Y2dvTEVmClpkNUlDTHFrVHFueWcwWTNoT3ZveklGSVEyZE9jaXFiWEwxTUd5aUtYQ0o3dEt1WTJlN2dVWVBEQ1VaT2JUNloKK3BVWDJud3pWMEU4alZIdEM3WmNyeXhqR3Q5WHlEKzg2VjNFbTY5Rm1lS2pXaVMwdXFsV1BjOXZxdjlKV0w3dwpxUC8wdUszcE4vdTZ1UFFMT3Zub1EwSWVpZGlFeXhQeDJidmhpV0M0akNoV3JCUWRuQXJuY2V2UER0MDlxWmFoClNMMDg5NisxRFNKTXdCR0I3Rlk3OXRPaTRsdTNzZ1FpVXBXQWsybm9qa3hsOFpFRExYQjBBdXFMWnhVcGFWSUMKdTlmZlVHcFZScitnb3loaGYzRFF3NktxTENHcVI4NG9uQVpGZHIrQ0dDZTAxYTYweTFEbWEvUk1obkV3NmFiZgpGb2JnMlA5QTNmdlFRb2gvb3pNNkxsd2VRUkdCWTg0WWNXc3I3S2FLdHpGY09tcEg0TU41V2RZZ0dxL3lhcGlxCmNyeFhTdEpMbmJzUS9MQk1RZVh0SFQxZUtKMmN6TCt6VWRxblIrV0VVd0lEQVFBQm8wSXdRREFkQmdOVkhRNEUKRmdRVXU2OStBajM2cHZFOGhJNnQ3amlZN05reU10UXdEZ1lEVlIwUEFRSC9CQVFEQWdFR01BOEdBMVVkRXdFQgovd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVNQlFBRGdnSUJBQXJ4MVVhRXQ2NVJ1Mnl5VFVFVUFKTk1uTXZsCndGVFBvQ1dPQXZuOXNLSU45U0NZUEJNdHJGYWlzTlorRVpMcExycWVMcHB5c2IwWlJHeGhOYUthdEJZU2FWcU0KNGRjK3BCcm9Md1Awcm1FZEVCc3FwSXQ2eGY0RnB1SEExc2orbnE2UEs3bzltZmpZY3dsWVJtNm1uUFRYSjlPVgoyamVEY2h6VGMrQ2lSNWtET0YzVlNYa0FLUnpIN0pzZ0hBY2thVmQ0c2puOE9vU2d0Wng4amI4dWsySW50em5hCkZ4aXV2VHdKYVArRW16elYxZ3NENDFlZUZQZlI2MC9JdlljanQ3WkpRM21GWExycmtndWh4dWhvcUV3V3NScVoKQ3VoVExKSzdvUWtZZFF4bHFIdkxJN2Nhd2lpRnd4di8wQ3RpNzZSN0NaR1laNHdVQWMxb0JtcGpJWFVEZ0lpSwpib0hHaGZLcHBDM245S1VrRUVlRHlzMzBqWGxZc1FhYjV4b3EyWjBCMTVSOTdRTkt5dkRiNktrQlB2VldtY2tlCmprazl1K1VKdWVCUFNaSTlGb0pBek14Wnh1WTY3Ukl1YVR4c2xiSDlxaDE3ZjRhK0hnNHlSdnY3RTQ5MWYweUwKUzBaai9nQTBRSERCdzdtaDNhWnc0Z1N6UWJ6cGdKSHFaSng2NFNJRHFaeHVidzVsVDJ5SGgxN3picUQ1ZGFXYgpRT2hUc2llZFNybkFkeUdOLzRmeTNyeU03eGZmdDBrTDBmSnVNQXNhRGs1MjdSSDg5ZWxXc24yL3gyMEtrNHlsCjBNQzJIYjQ2VHBTaTEyNXNDOEtLZlBvZzg4VGs1YzBOcU11UmtyRjhoZXkxRkdsbURvTG56YzdJTGFaUmZ5SEIKTlZPRkJrcGRuNjI3RzE5MAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049VVNFUlRydXN0IFJTQSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPVRoZSBVU0VSVFJVU1QgTmV0d29yawojIFN1YmplY3Q6IENOPVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1UaGUgVVNFUlRSVVNUIE5ldHdvcmsKIyBMYWJlbDogIlVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkiCiMgU2VyaWFsOiAyNjQ1MDkzNzY0NzgxMDU4Nzg3NTkxODcxNjQ1NjY1Nzg4NzE3CiMgTUQ1IEZpbmdlcnByaW50OiAxYjpmZTo2OTpkMTo5MTpiNzoxOTozMzphMzo3MjphODowZjplMTo1NTplNTpiNQojIFNIQTEgRmluZ2VycHJpbnQ6IDJiOjhmOjFiOjU3OjMzOjBkOmJiOmEyOmQwOjdhOjZjOjUxOmY3OjBlOmU5OjBkOmRhOmI5OmFkOjhlCiMgU0hBMjU2IEZpbmdlcnByaW50OiBlNzo5MzpjOTpiMDoyZjpkODphYToxMzplMjoxYzozMToyMjo4YTpjYzpiMDo4MToxOTo2NDozYjo3NDo5Yzo4OTo4OTo2NDpiMTo3NDo2ZDo0NjpjMzpkNDpjYjpkMgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRjNqQ0NBOGFnQXdJQkFnSVFBZjF0TVB5anlsR29HN3hrRGpVRExUQU5CZ2txaGtpRzl3MEJBUXdGQURDQgppREVMTUFrR0ExVUVCaE1DVlZNeEV6QVJCZ05WQkFnVENrNWxkeUJLWlhKelpYa3hGREFTQmdOVkJBY1RDMHBsCmNuTmxlU0JEYVhSNU1SNHdIQVlEVlFRS0V4VlVhR1VnVlZORlVsUlNWVk5VSUU1bGRIZHZjbXN4TGpBc0JnTlYKQkFNVEpWVlRSVkpVY25WemRDQlNVMEVnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa3dIaGNOTVRBdwpNakF4TURBd01EQXdXaGNOTXpnd01URTRNak0xT1RVNVdqQ0JpREVMTUFrR0ExVUVCaE1DVlZNeEV6QVJCZ05WCkJBZ1RDazVsZHlCS1pYSnpaWGt4RkRBU0JnTlZCQWNUQzBwbGNuTmxlU0JEYVhSNU1SNHdIQVlEVlFRS0V4VlUKYUdVZ1ZWTkZVbFJTVlZOVUlFNWxkSGR2Y21zeExqQXNCZ05WQkFNVEpWVlRSVkpVY25WemRDQlNVMEVnUTJWeQpkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGt3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLCkFvSUNBUUNBRW1VWE5nN0Qyd2l6MEt4WERYYnR6U2ZUVEsxUWcySGlxaUJOQ1Mxa0Nkek9pWi9NUGFuczlzL0IKM1BIVHNkWjdOeWdSSzBmYU9jYThPaG0wWDZhOWZaMmpZMEsyZHZLcE95dVIrT0p2ME93V0lKQUpQdUxvZE1rWQp0SkhVWW1UYmY2TUc4WWdZYXBBaVBMeitFL0NIRkh2MjVCK08xT1JSeGhGblJnaFJ5NFlVVkQrOE0vNStiSnovCkZwMFl2VkdPTmFhblpzaHlaOXNoWnJIVW0zZ0R3RkE2Nk16dzNMeWVUUDZ2QlpZMUgxZGF0Ly9PK1QyM0xMYjIKVk4zSTV4STZUYTVNaXJkY21yUzNJRDNLZnlJMHJuNDdhR1lCUk9jQlRrWlRtek5nOTVTK1V6ZVFjMFB6TXNOVAo3OXVxL25ST2FjZHJqR0NUM3NUSEROL2hNcTdNa3p0UmVKVm5pKzQ5VnY0TTBHa1BHdy96SlNack0yMzNia2Y2CmMwUGxmZzZsWnJFcGZES0VZMVdKeEEzQmsxUXdHUk9zMDMwM3ArdGRPbXcxWE50QjF4TGFxVWtMMzlpQWlnbVQKWW82MVpzOGxpTTJFdUxFL3BEa1AyUUtlNnhKTWxYenphd1dwWGhhRHpMaG40dWdUbmN4Ymd0Tk1zKzFiLzk3bApjNndqT3kwQXZ6VlZkQWxKMkVsWUduK1NOdVpSa2c3ekpuMGNUUmU4eWV4REp0Qy9RVjlBcVVSRTlKbm5WNGVlClVCOVhWS2crL1hSakw3RlFaUW5tV0VJdVF4cE10UEFsUjFuNkJCNlQxQ1pHU2xDQnN0NitlTGY4WnhYaHlWZUUKSGc5ajF1bGl1dFpmVlM3cVhNWW9DQVFsT2JnT0s2bnlUSmNjQno4TlV2WHQ3eStDRHdJREFRQUJvMEl3UURBZApCZ05WSFE0RUZnUVVVM20vV3FvclNzOVVnT0hZbThDZDhySURac3N3RGdZRFZSMFBBUUgvQkFRREFnRUdNQThHCkExVWRFd0VCL3dRRk1BTUJBZjh3RFFZSktvWklodmNOQVFFTUJRQURnZ0lCQUZ6VWZBM1A5d0Y5UVpsbERIUEYKVXAvTCtNK1pCbjhiMmtNVm41NENWVmVXRlBGU1BDZUhsQ2p0SHpvQk42SjIvRk5Rd0lTYnhtdE91b3doVDZLTwpWV0tSODJrVjJMeUk0OFNxQy8zdnFPbExWU29HSUcxVmVDa1o3bDh3WEVza0VWWC9KSnB1WGlvcjdndE5uMy8zCkFUaVVGSlZEQnduN1lLbnVIS3NTaktDYVhxZVlhbGx0aXo4SSs4alJSYThZRldTUUVnOXpLQzdGNGlSTy9GanMKOFBSRi9pS3o2eStPMHRsRllRWEJsMitvZG5LUGk0dzJyNzhOQmM1eGplYW1ieDlzcG5GaXhkalFnM0lNOFdjUgppUXljRTB4eU5OKzgxWEhmcW5IZDRibHNqRHdTWFdYYXZWY1N0a05yLytYZVRXWVJVYytacnV3WHR1aHhrWXplClNmN2ROWEdpRlNlVUhNOWg0eWE3YjZObkpTRmQ1dDBkQ3k1b0d6dUNyK3lEWjRYVW1GRjBzYm1aZ0luL2YzZ1oKWEhsS1lDNlNRSzVNTnlvc3ljZGl5QTVkOXpaYnl1QWxKUUcwM1JvSG5IY0FQOURjMWV3OTFQcTdQOHlGMW05LwpxUzNmdVFMMzlaZWF0VFhhdzJld2gwcXBLSjRqanY5Y0oydmhzRS96Qis0QUx0UlpoOHRTUVpYcTlFZlg3bVJCClZYeU5XUUtWM1dLZHdybnVXaWgwaEtXYnQ1REhEQWZmOVlrMmRETFdLTUd3c0F2Z25FekRITmI4NDJtMVIwYUIKTDZLQ3E5TmpSSERFamY4dE03cXRqM3UxY0lpdVBoblBRQ2pZL01pUXUxMlpJdlZTNWxqRkg0Z3hRKzZJSGRmRwpqanhEYWgybkdONTlQUmJ4WXZuS2tLajkKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1UaGUgVVNFUlRSVVNUIE5ldHdvcmsKIyBTdWJqZWN0OiBDTj1VU0VSVHJ1c3QgRUNDIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89VGhlIFVTRVJUUlVTVCBOZXR3b3JrCiMgTGFiZWw6ICJVU0VSVHJ1c3QgRUNDIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IgojIFNlcmlhbDogMTIzMDEzODIzNzIwMTk5NDgxNDU2NTY5NzIwNDQzOTk3NTcyMTM0CiMgTUQ1IEZpbmdlcnByaW50OiBmYTo2ODpiYzpkOTpiNTo3ZjphZDpmZDpjOToxZDowNjo4MzoyODpjYzoyNDpjMQojIFNIQTEgRmluZ2VycHJpbnQ6IGQxOmNiOmNhOjVkOmIyOmQ1OjJhOjdmOjY5OjNiOjY3OjRkOmU1OmYwOjVhOjFkOjBjOjk1OjdkOmYwCiMgU0hBMjU2IEZpbmdlcnByaW50OiA0ZjpmNDo2MDpkNTo0Yjo5Yzo4NjpkYTpiZjpiYzpmYzo1NzoxMjplMDo0MDowZDoyYjplZDozZjpiYzo0ZDo0ZjpiZDphYTo4NjplMDo2YTpkYzpkMjphOTphZDo3YQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ2p6Q0NBaFdnQXdJQkFnSVFYSXVaeFZxVXhkSnhWdDdOaVlETUpqQUtCZ2dxaGtqT1BRUURBekNCaURFTApNQWtHQTFVRUJoTUNWVk14RXpBUkJnTlZCQWdUQ2s1bGR5QktaWEp6WlhreEZEQVNCZ05WQkFjVEMwcGxjbk5sCmVTQkRhWFI1TVI0d0hBWURWUVFLRXhWVWFHVWdWVk5GVWxSU1ZWTlVJRTVsZEhkdmNtc3hMakFzQmdOVkJBTVQKSlZWVFJWSlVjblZ6ZENCRlEwTWdRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrd0hoY05NVEF3TWpBeApNREF3TURBd1doY05Nemd3TVRFNE1qTTFPVFU1V2pDQmlERUxNQWtHQTFVRUJoTUNWVk14RXpBUkJnTlZCQWdUCkNrNWxkeUJLWlhKelpYa3hGREFTQmdOVkJBY1RDMHBsY25ObGVTQkRhWFI1TVI0d0hBWURWUVFLRXhWVWFHVWcKVlZORlVsUlNWVk5VSUU1bGRIZHZjbXN4TGpBc0JnTlZCQU1USlZWVFJWSlVjblZ6ZENCRlEwTWdRMlZ5ZEdsbQphV05oZEdsdmJpQkJkWFJvYjNKcGRIa3dkakFRQmdjcWhrak9QUUlCQmdVcmdRUUFJZ05pQUFRYXJGUmFxZmxvCkkrZDYxU1J2VThaYTJFdXJ4dFcyMGVaemNhN2RuTllNWWYzYm9Ja0R1QVVVN0ZmTzdsMC80aUd6enZmVWlubmcKbzROK0xaZlFZY1R4bWR3bGtXT3JmekNqdEhEaXg2RXpuUE8vTGx4VHNWK3pmVEovaWpUamVYbWpRakJBTUIwRwpBMVVkRGdRV0JCUTY0UW1HMU04WndwWjJkRWwyM09BMXhtTmptakFPQmdOVkhROEJBZjhFQkFNQ0FRWXdEd1lEClZSMFRBUUgvQkFVd0F3RUIvekFLQmdncWhrak9QUVFEQXdOb0FEQmxBakEyWjZFV0NOemtsd0JCSFU2KzRXTUIKenp1cVFoRmtvSjJVT1FJUmVWeDdIZnBrdWU0V1FyTy9pc0lKeE96a3NVMENNUURwS21GSGpGSktTMDRZY1BiVwpSTlp1OVlPNmJWaTlKTmxXU09ydnhLSkdnWWhxT2tiUnFadE55V0hhMFYxWGFoZz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUdsb2JhbFNpZ24gTz1HbG9iYWxTaWduIE9VPUdsb2JhbFNpZ24gRUNDIFJvb3QgQ0EgLSBSNAojIFN1YmplY3Q6IENOPUdsb2JhbFNpZ24gTz1HbG9iYWxTaWduIE9VPUdsb2JhbFNpZ24gRUNDIFJvb3QgQ0EgLSBSNAojIExhYmVsOiAiR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0IgojIFNlcmlhbDogMTQzNjcxNDgyOTQ5MjI5NjQ0ODA4NTkwMjIxMjU4MDA5Nzc4OTc0NzQKIyBNRDUgRmluZ2VycHJpbnQ6IDIwOmYwOjI3OjY4OmQxOjdlOmEwOjlkOjBlOmU2OjJhOmNhOmRmOjVjOjg5OjhlCiMgU0hBMSBGaW5nZXJwcmludDogNjk6Njk6NTY6MmU6NDA6ODA6ZjQ6MjQ6YTE6ZTc6MTk6OWY6MTQ6YmE6ZjM6ZWU6NTg6YWI6NmE6YmIKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGJlOmM5OjQ5OjExOmMyOjk1OjU2Ojc2OmRiOjZjOjBhOjU1OjA5Ojg2OmQ3OjZlOjNiOmEwOjA1OjY2OjdjOjQ0OjJjOjk3OjYyOmI0OmZiOmI3OjczOmRlOjIyOjhjCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlCNFRDQ0FZZWdBd0lCQWdJUktqaWtISllLQk41Q3NpaWxDK2cwbUFJd0NnWUlLb1pJemowRUF3SXdVREVrCk1DSUdBMVVFQ3hNYlIyeHZZbUZzVTJsbmJpQkZRME1nVW05dmRDQkRRU0F0SUZJME1STXdFUVlEVlFRS0V3cEgKYkc5aVlXeFRhV2R1TVJNd0VRWURWUVFERXdwSGJHOWlZV3hUYVdkdU1CNFhEVEV5TVRFeE16QXdNREF3TUZvWApEVE00TURFeE9UQXpNVFF3TjFvd1VERWtNQ0lHQTFVRUN4TWJSMnh2WW1Gc1UybG5iaUJGUTBNZ1VtOXZkQ0JEClFTQXRJRkkwTVJNd0VRWURWUVFLRXdwSGJHOWlZV3hUYVdkdU1STXdFUVlEVlFRREV3cEhiRzlpWVd4VGFXZHUKTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFdU1aNTA0OXNKUTZmTGprWkhBT2tycHJsT1FjSgpGc3Bqc2JtRytJcFh3VmZPUXZwem9mZGxRdjhld1FDeWJuTU8vOGNoNVJpa3F0bHhQNmpVdWM2TUhhTkNNRUF3CkRnWURWUjBQQVFIL0JBUURBZ0VHTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SFFZRFZSME9CQllFRkZTd2U2MUYKdU9KQWYvc0tidnUrTThrOG80VFZNQW9HQ0NxR1NNNDlCQU1DQTBnQU1FVUNJUURja3FHZ0U2YlBBN0RteENHWAprUG9VVnkwRDdPNDgwMjdLcUd4MnZLTGV1d0lnSjZpRkp6V2JWc2FqOGtmU3QyNGJBZ0FYcW1lbUZaSGUrcFRzCmV3djRuNFE9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1HbG9iYWxTaWduIE89R2xvYmFsU2lnbiBPVT1HbG9iYWxTaWduIEVDQyBSb290IENBIC0gUjUKIyBTdWJqZWN0OiBDTj1HbG9iYWxTaWduIE89R2xvYmFsU2lnbiBPVT1HbG9iYWxTaWduIEVDQyBSb290IENBIC0gUjUKIyBMYWJlbDogIkdsb2JhbFNpZ24gRUNDIFJvb3QgQ0EgLSBSNSIKIyBTZXJpYWw6IDMyNzg1NzkyMDk5OTkwNTA3MjI2NjgwNjk4MDExNTYwOTQ3OTMxMjQ0CiMgTUQ1IEZpbmdlcnByaW50OiA5ZjphZDozYjoxYzowMjoxZTo4YTpiYToxNzo3NDozODo4MTowYzphMjpiYzowOAojIFNIQTEgRmluZ2VycHJpbnQ6IDFmOjI0OmM2OjMwOmNkOmE0OjE4OmVmOjIwOjY5OmZmOmFkOjRmOmRkOjVmOjQ2OjNhOjFiOjY5OmFhCiMgU0hBMjU2IEZpbmdlcnByaW50OiAxNzo5ZjpiYzoxNDo4YTozZDpkMDowZjpkMjo0ZTphMTozNDo1ODpjYzo0MzpiZjphNzpmNTo5Yzo4MTo4MjpkNzo4MzphNToxMzpmNjplYjplYzoxMDowYzo4OToyNAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ0hqQ0NBYVNnQXdJQkFnSVJZRmxKNENZdXUxWDVDbmVLY2ZsSzJHd3dDZ1lJS29aSXpqMEVBd013VURFawpNQ0lHQTFVRUN4TWJSMnh2WW1Gc1UybG5iaUJGUTBNZ1VtOXZkQ0JEUVNBdElGSTFNUk13RVFZRFZRUUtFd3BICmJHOWlZV3hUYVdkdU1STXdFUVlEVlFRREV3cEhiRzlpWVd4VGFXZHVNQjRYRFRFeU1URXhNekF3TURBd01Gb1gKRFRNNE1ERXhPVEF6TVRRd04xb3dVREVrTUNJR0ExVUVDeE1iUjJ4dlltRnNVMmxuYmlCRlEwTWdVbTl2ZENCRApRU0F0SUZJMU1STXdFUVlEVlFRS0V3cEhiRzlpWVd4VGFXZHVNUk13RVFZRFZRUURFd3BIYkc5aVlXeFRhV2R1Ck1IWXdFQVlIS29aSXpqMENBUVlGSzRFRUFDSURZZ0FFUjBVT2x2dDlYYi9wT2RFaCtKOEx0dFY3SHBJNlNGa2MKOEdJeExjQjZLUDRhcDF5enRzeVg1MFhVV1ByUmQyMURvc0NIWlRRS0gzcmQ2end6b2NXZFRhUnZRWlU0ZjhrZQpoT3ZSbmttU2g1U0hERHFGU21hZm5WbVRUWmRoQm9aS28wSXdRREFPQmdOVkhROEJBZjhFQkFNQ0FRWXdEd1lEClZSMFRBUUgvQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVUGVZcFNKdnFCOG9oUkVvbTNtN2Uwb1BRbjFrd0NnWUkKS29aSXpqMEVBd01EYUFBd1pRSXhBT1ZwRXNsdTI4WXh1Z2xCNFpmNCsvMmE0bjBTeWUxOFpOUExCU1dMVnRtZwo1MTVkVGd1RG5GdDJLYUFKSmlGcVlnSXdjZEsxajF6cU8rRjRDWVdvZFpJN3lGejlTTzhOZENLb0NPSnV4VW5PCnh3eThwMkZwOGZjNzRTckwrU3Z6WnBBMwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049U3RhYXQgZGVyIE5lZGVybGFuZGVuIFJvb3QgQ0EgLSBHMyBPPVN0YWF0IGRlciBOZWRlcmxhbmRlbgojIFN1YmplY3Q6IENOPVN0YWF0IGRlciBOZWRlcmxhbmRlbiBSb290IENBIC0gRzMgTz1TdGFhdCBkZXIgTmVkZXJsYW5kZW4KIyBMYWJlbDogIlN0YWF0IGRlciBOZWRlcmxhbmRlbiBSb290IENBIC0gRzMiCiMgU2VyaWFsOiAxMDAwMzAwMQojIE1ENSBGaW5nZXJwcmludDogMGI6NDY6Njc6MDc6ZGI6MTA6MmY6MTk6OGM6MzU6NTA6NjA6ZDE6MGI6ZjQ6MzcKIyBTSEExIEZpbmdlcnByaW50OiBkODplYjo2Yjo0MTo1MTo5Mjo1OTplMDpmMzplNzo4NTowMDpjMDozZDpiNjo4ODo5NzpjOTplZTpmYwojIFNIQTI1NiBGaW5nZXJwcmludDogM2M6NGY6YjA6Yjk6NWE6Yjg6YjM6MDA6MzI6ZjQ6MzI6Yjg6NmY6NTM6NWY6ZTE6NzI6YzE6ODU6ZDA6ZmQ6Mzk6ODY6NTg6Mzc6Y2Y6MzY6MTg6N2Y6YTY6ZjQ6MjgKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZkRENDQTF5Z0F3SUJBZ0lFQUppaU9UQU5CZ2txaGtpRzl3MEJBUXNGQURCYU1Rc3dDUVlEVlFRR0V3Sk8KVERFZU1Cd0dBMVVFQ2d3VlUzUmhZWFFnWkdWeUlFNWxaR1Z5YkdGdVpHVnVNU3N3S1FZRFZRUUREQ0pUZEdGaApkQ0JrWlhJZ1RtVmtaWEpzWVc1a1pXNGdVbTl2ZENCRFFTQXRJRWN6TUI0WERURXpNVEV4TkRFeE1qZzBNbG9YCkRUSTRNVEV4TXpJek1EQXdNRm93V2pFTE1Ba0dBMVVFQmhNQ1Rrd3hIakFjQmdOVkJBb01GVk4wWVdGMElHUmwKY2lCT1pXUmxjbXhoYm1SbGJqRXJNQ2tHQTFVRUF3d2lVM1JoWVhRZ1pHVnlJRTVsWkdWeWJHRnVaR1Z1SUZKdgpiM1FnUTBFZ0xTQkhNekNDQWlJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFMNHlvbFFQCmNQc3NYRm5yYk1Ta1VlaUZLclBNU2pUeXNGL3pEc2NjUFZNZWlBaG8yRzg5cmNLZXpJSm5CeWVIYUhFNm4zV1cKSWtZRnNPMnR4MXVlS3Q2Yy9EckdsYWYxRjJjWTV5OUpDQXhjeitiTU5PMTQrMUN4M0dzeThLTCt0anprN0ZxWAp4ejhlY0Fnd29OekZzMjF2MElKeUVhdlNnV2haZ2hlM2VKSmcrc3plUDRUcmpUZ3prQXB5SS9vMXpDWnhNZEZ5CktKTFpXeU50WnJWdEIwTHJwalBPa3R2QTlteGplTTNLVGoyMTVWS2I4YjQ3NWxSZ3NHWWVDYXNIL2xTSkVVTFIKOXlTNllIZ2FtUGZKRWYwV3dUVWFWSFh2UTlQbHJrN081M3ZEeGs1aFVVdXJta1ZMb1I5QnZVaFRGWEZrQzRhego1UzYrenFRYndTbUVvclhMQ0NOMlF5SWtIeGNFMUc2Y3h2eC9LMllhN0lybDFzOU45V01KdHhVNTFudXM2K044CjZVNzhkVUxJN1ZpVkRBWkNvcHozNUhDejMzSnZXamRBaWRpRnBOZnhDOTVER2RSS1dDeU1pam1ldjRTSDhSWTcKTmd6cDA3VEtiQmxCVWdtaEhiQnF2NEx2Y0ZFaE10d0Zkb3pMOTJUa0ExQ3ZqSkZucThYeTdsalkzcjczNXpIUApiTWs3Y2NIVmlMVmx2TURvRnhjSEVyVmMwcXNnazdUbWdvTndOc1hObzQydGkreWp3VU9INWtQaU5MNlZpelh0CkJ6bmFxQjE2bnphZUVyQU1aUktRRldEWkprQkU0MVpncFJEVWFqejlRZHdPV2tlMjc1ZGhkVS9aL3NleUhkVHQKWFVtenFXckxab1FUMVZ5ZzNOOXVkd2JSY1hYSVYyK3ZEM2RiQWdNQkFBR2pRakJBTUE4R0ExVWRFd0VCL3dRRgpNQU1CQWY4d0RnWURWUjBQQVFIL0JBUURBZ0VHTUIwR0ExVWREZ1FXQkJSVXJmckhrbGV1eWpXY0xoTDc1THBkCklOeVVWekFOQmdrcWhraUc5dzBCQVFzRkFBT0NBZ0VBTUptZEJUTElYZzQ3bUFFNmlxVG5CL2Q2K09lYTMxQkQKVTVjcVBjbzhSNWd1NFJWNzhaTHpZZHFRSlJabHdKOVVYUTRETzF0M0FweUV0ZzJZWHpUZE8yUEN3eWlCd3B3cApMaW5peU1NQjhqUHFLcXJNQ1FqM1pXZkd6ZC9UdGl1bnZjelJEbkJmdUNQUnk1Rk9DdlRJZXVYWll6YkIxTi84CklwZjNZRjNxS1M5WXNyMVl2WTJXVHhCMXYwaDdQVkdIb1R4MElzTDhCMytBM01Tcy9tckJjREN3Nlk1cDRpeHAKZ1pRSnV0MytUY0NEakpSWXdFWWdyNXdmQXZnMVZVa3ZSdFRBOEtDV0FnOHp4WEh6bmlOOWxMZjlPdE1KZ3dZaAovV0E5cmpMQTB1Nk5wdkRudElKOENzeHd5WG1BK1A1TTl6V0VHWW94K3dyWjEzK2I4S0thYThNRlN1MUJZQlF3CjBhb1JRbTdUSXdJRUM4WmwzZDFTZDlxQmE3S28rZ0U0dVpicUtteG5sNG1VbnJ6aFZOWGthbmp2U3Iwcm1qMUEKZnNiQWRkSnUrMmd3N095TG5mbEpOWm9hTE5temxUblZIcEwzcHJsbEwrVTliVHBJVEFqYzVDZ1NLTDU5TlZ6cQo0QlorRXh0cTF6N1hudnd0ZGJMQkZOVWpBOXRiYndzK2VDOE4zak9ORnJkSTU0T2FnUTk3d1VOTlZRUVhPRXBSCjFWbWlpWFRUbjc0ZVM5ZkdiYmVJSkc5Z2thU0NoVnRXUWJ6UVJLdHFFNzdSTEZpM0VqTllzamRqM0JQMWxCMC8KUUZIMVQvVTY3Y2pGNjhJZUhSYVZlc2QrUW5HVGJrc1Z0ekRmcXUxWGhVaXNIV3JkT1duazRYbDR2czRGdjZFTQo5NEI3SVdjbk1Gaz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVN0YWF0IGRlciBOZWRlcmxhbmRlbiBFViBSb290IENBIE89U3RhYXQgZGVyIE5lZGVybGFuZGVuCiMgU3ViamVjdDogQ049U3RhYXQgZGVyIE5lZGVybGFuZGVuIEVWIFJvb3QgQ0EgTz1TdGFhdCBkZXIgTmVkZXJsYW5kZW4KIyBMYWJlbDogIlN0YWF0IGRlciBOZWRlcmxhbmRlbiBFViBSb290IENBIgojIFNlcmlhbDogMTAwMDAwMTMKIyBNRDUgRmluZ2VycHJpbnQ6IGZjOjA2OmFmOjdiOmU4OjFhOmYxOjlhOmI0OmU4OmQyOjcwOjFmOmMwOmY1OmJhCiMgU0hBMSBGaW5nZXJwcmludDogNzY6ZTI6N2U6YzE6NGY6ZGI6ODI6YzE6YzA6YTY6NzU6YjU6MDU6YmU6M2Q6Mjk6YjQ6ZWQ6ZGI6YmIKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDRkOjI0OjkxOjQxOjRjOmZlOjk1OjY3OjQ2OmVjOjRjOmVmOmE2OmNmOjZmOjcyOmUyOjhhOjEzOjI5OjQzOjJmOjlkOjhhOjkwOjdhOmM0OmNiOjVkOmFkOmMxOjVhCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGY0RDQ0ExaWdBd0lCQWdJRUFKaVdqVEFOQmdrcWhraUc5dzBCQVFzRkFEQllNUXN3Q1FZRFZRUUdFd0pPClRERWVNQndHQTFVRUNnd1ZVM1JoWVhRZ1pHVnlJRTVsWkdWeWJHRnVaR1Z1TVNrd0p3WURWUVFERENCVGRHRmgKZENCa1pYSWdUbVZrWlhKc1lXNWtaVzRnUlZZZ1VtOXZkQ0JEUVRBZUZ3MHhNREV5TURneE1URTVNamxhRncweQpNakV5TURneE1URXdNamhhTUZneEN6QUpCZ05WQkFZVEFrNU1NUjR3SEFZRFZRUUtEQlZUZEdGaGRDQmtaWElnClRtVmtaWEpzWVc1a1pXNHhLVEFuQmdOVkJBTU1JRk4wWVdGMElHUmxjaUJPWldSbGNteGhibVJsYmlCRlZpQlMKYjI5MElFTkJNSUlDSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQWc4QU1JSUNDZ0tDQWdFQTQ4ZCtpZmtrU3pyUwpNNE0xTEduczNBbWs0MUdvSlN0NXVBZzk0Skc2aElYR2hhVEs1c2t1VTZUSkpCNzlWV1p4WFN6RllHZ0V0OW5DClVpWTRpS1RXTzBDbXdzMC96WmlUczFRVVdKWlYxVkQraHEya1kzOWNoL2FPNWllU1p4ZVNBZ01zM05abWRPM2QKWi8vQllZMWpUdytiYlJjd0p1K3IwaDhRb1BuRmZ4WnBnUU5IN1I1b2pYS2hUYklteHJwc1gyM1dyOUd4RTQ2cApyZk5lYVhVbUdENUJLeUYvN290ZEJ3YWRROFFwQ2l2OEtqNkd5enlET3ZuSkRkckZtZUs4ZUVFemR1Ry9MMTNsCnBKaFFEQlhkNFBxY2Z6aG8wTEttZXFmUk1iMStpbGduUTdPNk01SFRwNWdWWEpybTB3OTEyZnhCbUpjK3FpWGIKajVJdXNIc01YL0ZqcVRmNW0zVnBUQ2dtSmRyVjhoSndSVlhqMzNOZU4vVWhiSkNPTlZySjB5UHIwOEMrZUt4QwpLRmhtcFVadGNBTFhFUGxMVlB4ZGhrcUh6My9LUmF3UldyVWdVWTB2aUVlWE9jRFB1c0JDQVVDWlNDRUxhNmZTCi9aYlYwYjVHblVuZ0M2YWdJazQ0ME1FOE1MeHdqeXgxek5ERmpGRTdQWlFJWkNaaGZibkRaWThVbkNIUXF2MFgKY2dPUHZadU01bDVUbnJtZDc0Szc0YnppY2tGYklaVFRSVGVVMGQ4Sk9WM25JNnFhSGNwdHFBcUdoWXFDdmtJSAoxdkk0Z25QYWgxdmxQTk9lUHFjN252UURzL254ZlJOMEF2KzdvZVg2QUhrY3BtWkJpRnhnVjZZdUNjUzYvWnJQCnB4OUF3N3ZNV2dwVlN6czRkbEc0WTR1RWxCYm1Wdk1DQXdFQUFhTkNNRUF3RHdZRFZSMFRBUUgvQkFVd0F3RUIKL3pBT0JnTlZIUThCQWY4RUJBTUNBUVl3SFFZRFZSME9CQllFRlA2ckFKQ1luaVQ4cWN3YWl2c251TDh3YnFnNwpNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUNBUURQZHl4dVZyNU9zN2FFQUpTclI4a04wbmJIaHA4ZEI5TzJ0THNJCmVLOXAwZ3RKM2pQRnJLM0NpQUo5QnJjMUFzRmd5Yi9FNkpUZTFOT3BFeVZhL202aXJuMEYzSDN6YlBCK3BvM3UKMmRmT1dCZm9xU211YzBpSDU1dktiaW1oWkY4WkUvZXVCaEQvVWNhYlRWVWxUNU9aRUFGVGRmRVR6c2VtUVVIUwp2NGlsZjBYOHJMaWx0VE1NZ3NUN0IvWnE1U1dFWHdiS3dZWTVFZHRZelhjN0xNSk1EMTZhNC9DclBtRWJVQ1RDCndQVHhHZkFSS2JhbEdBS2IxMk5NY0l4SG93TkRYTGxkUnFBTmIvOVpqcjdkbjNMRFd5dmZqRnZPNVF4R2JKS3kKQ3FOTVZFSVlGUklZdmRyOHVuUnUvOEcyb0dUWXFWOVZycDljYW5hVzJITm5oL3ROZjF6dWFjcHpFUHVLcWYyZQp2VFk0U1VtSDlBNFU4T21IdUQrblQzcGFqbm5VaytTN2FGS0VyR3pwODVod1ZYSXkrVFNySzBtMXpTQmk1RHA2CloyT3JsdHh0cnBmcy9KOTJWb2d1WnM5YnRzbWtzTmNGdXVFbkw1TzdKaXFpazdBYjg0NitIVUNqdVRhUFBvSWEKR2w2STZsRDRXZUtEUmlrTDQwUmM0WlcyYVpDYUZHK1hyb0hQYU8rWm1yNjE1K0YvK1BvVFJ4Wk16RzBJUU9lTAplRzlRZ2tSUVAyWUdpcXREaEZaS0R5QXRoZzcxMHR2U2VvcEx6YVhvVHZGZUppVUJXU09nZnRMMmZpRlgxeWU4CkZWZE1wRWJCNElNZURFeE5IMDhHR2VMNXFQUTZncUd5ZVVONTFxMXZlaWVRQTZUcUpJYy8yYjNaNmZKZlVFa2MKN3V6WExnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUlkZW5UcnVzdCBDb21tZXJjaWFsIFJvb3QgQ0EgMSBPPUlkZW5UcnVzdAojIFN1YmplY3Q6IENOPUlkZW5UcnVzdCBDb21tZXJjaWFsIFJvb3QgQ0EgMSBPPUlkZW5UcnVzdAojIExhYmVsOiAiSWRlblRydXN0IENvbW1lcmNpYWwgUm9vdCBDQSAxIgojIFNlcmlhbDogMTMyOTg4MjEwMzQ5NDYzNDIzOTA1MjAwMDM4Nzc3OTY4Mzk0MjYKIyBNRDUgRmluZ2VycHJpbnQ6IGIzOjNlOjc3OjczOjc1OmVlOmEwOmQzOmUzOjdlOjQ5OjYzOjQ5OjU5OmJiOmM3CiMgU0hBMSBGaW5nZXJwcmludDogZGY6NzE6N2U6YWE6NGE6ZDk6NGU6Yzk6NTU6ODQ6OTk6NjA6MmQ6NDg6ZGU6NWY6YmM6ZjA6M2E6MjUKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDVkOjU2OjQ5OjliOmU0OmQyOmUwOjhiOmNmOmNhOmQwOjhhOjNlOjM4OjcyOjNkOjUwOjUwOjNiOmRlOjcwOjY5OjQ4OmU0OjJmOjU1OjYwOjMwOjE5OmU1OjI4OmFlCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGWURDQ0EwaWdBd0lCQWdJUUNnRkNnQUFBQVVVanlFUzFBQUFBQWpBTkJna3Foa2lHOXcwQkFRc0ZBREJLCk1Rc3dDUVlEVlFRR0V3SlZVekVTTUJBR0ExVUVDaE1KU1dSbGJsUnlkWE4wTVNjd0pRWURWUVFERXg1SlpHVnUKVkhKMWMzUWdRMjl0YldWeVkybGhiQ0JTYjI5MElFTkJJREV3SGhjTk1UUXdNVEUyTVRneE1qSXpXaGNOTXpRdwpNVEUyTVRneE1qSXpXakJLTVFzd0NRWURWUVFHRXdKVlV6RVNNQkFHQTFVRUNoTUpTV1JsYmxSeWRYTjBNU2N3CkpRWURWUVFERXg1SlpHVnVWSEoxYzNRZ1EyOXRiV1Z5WTJsaGJDQlNiMjkwSUVOQklERXdnZ0lpTUEwR0NTcUcKU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQ25VQm5lUDVrOTFETkc4VzlSWVlLeXFVK1BaNGxkaE5sVAozUXdvMmRmdy82NlZRM0taK2JWZGZJckJRdUV4VUhUUmdRMTh6WnNocTBQaXJLMWVobTd6Q1lvZldqSzlvdXVVCitlaGNDdXovbU5LdmNiTzBVNTlPaCsrU3ZMM3NUekl3aUVzWFhsZkVVOEwyQXBlTjJXSXJ2eVFmWW8zZnc3Z3AKUzBsNFBKTmdpQ0w4bWRvMnlNS2kxQ3hVQUdjMWJuTy9BbGp3cE4zbHNLSW1lc3JnTnFVWkZ2WDl0Kyt1UDBEMQpiVm9FL2M0MHlpVGNkQ01iWFRNVEVsM0VBU1gyTU4wQ1haL2cxVWU5dE9zYm9idEpTZGlmV3dMeml1UWtrT1JpClQwL0JyNHNPZEJlbzBYS0lhbm9CU2N5MFJubkdGN0hhbUI0SFdmcDFJWVZsM1pCV3p2dXJwV0NkeEozNVVyQ0wKdllmNWp5c2pDaU4yTy9jejRja0E4Mm41UzZMZ1RyeCtrem1FQi9kRWNINytCMXJsc2F6UkdNenlOZVZKU1FqSwpWc2s5K3c4WWZZczd3UlBDVFkvSlR3NDM2UitoRG1yZllpN0xOUVpSZVN6SUpUajAra3VuaVZ5YzB1TU5PWVpLCmRIelZXWWZDUDA0TVhGTDBQZmRTZ3ZIcW82ejlTVFFhS1BOQmlEb1Q3dWplLzVrZFg3ckw2Qjd5dVZCZ3dESFQKYytYdnZxRHRNd3QwdmlBZ3hHZHM4QWdEZWxXQWYwWk9scWYwSGo3aDl0Z0o0VE5rSzJQWE1sNmYrY0I3RDNodgpsN3lUbXZtY0VwQjRlb0NIRmRkeWRKeFZkSGl4dXVGdWNBUzZUNkM2YU1ONy96SHdjejA5bENxeEMwRU9vUDVOCmlHVnJlVE8wMXdJREFRQUJvMEl3UURBT0JnTlZIUThCQWY4RUJBTUNBUVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIKL3pBZEJnTlZIUTRFRmdRVTdVUVp3TlB3Qm92dXBIdStRdWNtVk1pT05uWXdEUVlKS29aSWh2Y05BUUVMQlFBRApnZ0lCQUEydWtETDJwa3Q4UkhZWllSNG5LTTFlVk84bHZPTUlrUGtwMTY1b0NPR1VBRmp2TGk1K1UxS010bHdICjZvaTZtWXRRbE5lQ2dOOWhDUUNUclEwVTVzN0I4amVVZUxCZm5MT2ljN2lQQlpNNHpZMCtzTGo3d00reDh1d3QKTFJ2TTdLcWFzNnBnZ2hzdE84T0VQVmVLbGg2Y2RialRNTTFnQ0lPUTA0NVU4VTFtd0YxMEEwQ2o3b1Yrd2g5MwpuQWJvd2FjWVhWS1Y3Y25kSlo1dCtxbnRvem8wMEZsNzJ1MVE4elcvN2VzVVRUSEhZUFRhOFllYzRraml4c1UzCit3WVErblZaWmpGSEtkcDJtaHpwZ3E3dm1ybFI5NGdqbW1tVllqemxWWUEyMTFRQy8vRzVYYzdVSTIvWVJZUksKVzJYdmlRemRGS2NneXhpbEpiUU4rUUh3b3RMMEFNaDBqcUVxU0k1bDJ4UEU0aVVYZmV1K2gxc1hJRlJSazBwVApBd3ZzWGNvejdXTDlSY2N2Vzl4WW9JQTU1dnJYL2hNVXB1MDlsRXBDZE5URGQxbHp6WTlHdmxVNDcvcm9rVExxCmwxZ0VJdDQ0dzh5OGJja3pPbW9LYVQrZ3lPcHlqNHhqaGlPOWJUeVducFhnU1V5cW9ya3FHNXcyZ1hqdHcraEcKNGlaWlJIVWUyWFdKVWMwUWhKMWhZTXRkK1pjaVRZNlk1dU4vOWx1N3JzM0tTb0ZyWGd2elVlRjBLK2wrSjZmWgptVWxPK0tXQTJ5VVBIR05paXNreloyczhFSVBHcmQ2b3pSYU9qZkFITjNHZjhxdjhRZlhCaSt3QU4xMEo1VTZBCjcvcXhYRGdHcFJ0SzRkdzRMVHpjcXgrUUd0VktuTzdSY0d6TTd2UlgrQmk2aEc2SAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049SWRlblRydXN0IFB1YmxpYyBTZWN0b3IgUm9vdCBDQSAxIE89SWRlblRydXN0CiMgU3ViamVjdDogQ049SWRlblRydXN0IFB1YmxpYyBTZWN0b3IgUm9vdCBDQSAxIE89SWRlblRydXN0CiMgTGFiZWw6ICJJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEiCiMgU2VyaWFsOiAxMzI5ODgyMTAzNDk0NjM0MjM5MDUyMTk3NjE1Njg0MzkzMzY5OAojIE1ENSBGaW5nZXJwcmludDogMzc6MDY6YTU6YjA6ZmM6ODk6OWQ6YmE6ZjQ6NmI6OGM6MWE6NjQ6Y2Q6ZDU6YmEKIyBTSEExIEZpbmdlcnByaW50OiBiYToyOTo0MTo2MDo3Nzo5ODozZjpmNDpmMzplZjpmMjozMTowNTozYjoyZTplYTo2ZDo0ZDo0NTpmZAojIFNIQTI1NiBGaW5nZXJwcmludDogMzA6ZDA6ODk6NWE6OWE6NDQ6OGE6MjY6MjA6OTE6NjM6NTU6MjI6ZDE6ZjU6MjA6MTA6YjU6ODY6N2E6Y2E6ZTE6MmM6Nzg6ZWY6OTU6OGY6ZDQ6ZjQ6Mzg6OWY6MmYKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZaakNDQTA2Z0F3SUJBZ0lRQ2dGQ2dBQUFBVVVqejBaOEFBQUFBakFOQmdrcWhraUc5dzBCQVFzRkFEQk4KTVFzd0NRWURWUVFHRXdKVlV6RVNNQkFHQTFVRUNoTUpTV1JsYmxSeWRYTjBNU293S0FZRFZRUURFeUZKWkdWdQpWSEoxYzNRZ1VIVmliR2xqSUZObFkzUnZjaUJTYjI5MElFTkJJREV3SGhjTk1UUXdNVEUyTVRjMU16TXlXaGNOCk16UXdNVEUyTVRjMU16TXlXakJOTVFzd0NRWURWUVFHRXdKVlV6RVNNQkFHQTFVRUNoTUpTV1JsYmxSeWRYTjAKTVNvd0tBWURWUVFERXlGSlpHVnVWSEoxYzNRZ1VIVmliR2xqSUZObFkzUnZjaUJTYjI5MElFTkJJREV3Z2dJaQpNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUMySXBUOHBFaXY2RWRyQ3ZzbmR1VHlQNG83CmVrb3NNU3FNamJDcHd6RnJxSGQyaENhMnJJRkNEUWpyVlZpN2V2aThaWDN5b0cyTHFFZnBZblllRWU0SUZOR3kKUkJiMDZ0RDZIaTllMjh0elFhNjhBTEJLSzBDeXJPRTdTOEl0bmVTaG0rd2FPaDd3Q0xQUTVDUTFCNStjdE1sUwpiZHNIeW8rMVcvQ0Q4MC9ITGFYSXJjdVZJS1F4S0ZkWVd1U05HNXFybmcwTThnb3pPU0k1Q3BjdTgxTjN1VVJGCi9ZVExOaUNCV1MyYWIyMUlTR0hLVE45VDBhOVN2RVNmcXk5cmczTHZkWURhQmpNYlhjamFZOFpOemF4bU1jM1IKM2o2SEVEYmh1YVI2NzJCUXNzdktwbGJnTjYrck5CTTVKZWc1WnVTWWVxb1NtSnhaWm9ZK3JmR3d5ajRHRDN2dwpFVXMzb0VSdGU4dW9qSEgwMWJXUk5zendGY1lyM2xFWHNaZE1VRDJ4bFZsOEJYMHRJZFVBdndGbm9sNTdwbHp5Cjl5THhrQTJUMjZwRVVXYk1mWFlENjJxb0tqZ1psM1lOYTRwaCtiejI3bmI5Y0N2ZEtUejRDaDViUWh5TFZpOVYKR3h5aExyWEhGdWI0cWp5U2ptbTJBY0cxaHAySkR3czRsRlRvNnR5ZVBTVzhVeWJ0MWFzNXFzVkFURlNyc3JUWgoyZmpYY3RzY3ZHMjlaVi92aURVcVppL3U5ck5sOERPTmZKaEJhVVlQUXh4cCtwdTEwR0ZxemNwTDJVeVFScXNWCldhRkhWQ2t1Z3loZkhNS2lxM0lYQUFhT1JleUw0ak05ZjlvWlJPUmljc1BmSXNieVZ0VGRYNVZ5N1cxZjkwZ0QKVy8zRktxRDJjeU9FRUJzQjV3SURBUUFCbzBJd1FEQU9CZ05WSFE4QkFmOEVCQU1DQVFZd0R3WURWUjBUQVFILwpCQVV3QXdFQi96QWRCZ05WSFE0RUZnUVU0M0hnbnRpblF0bmJjWkZybEpQcnc2UFJGS013RFFZSktvWklodmNOCkFRRUxCUUFEZ2dJQkFFZjYzUXF3RVpFNHJVMWQ5K1VPbDFRWmdraUhWSXlxWkpuWVd2NklBY1ZZcFpteEkxUWoKdDJvZElGZmxBV0pCRjlNSjIzWExibFNRZGY0YW40RUt3dDNYOXduUVczSVY1QjRKYWowejh5R2E1aFYrclZIVgpEUkR0ZlVMQWorN0FtZ2pWUWRaY0RpRnBib0JoRGhYQXVNL0ZTUkpTekw0NnpOUXVPQVhlTmYwZmI3aUFhSmc5ClRhREtRR1hTYzN6MWk5a0tsVC9ZUHlOdEd0RXFKQm5aaGJNWDczaHVxVmpSSTlQSEUrMXlKWDlkc1hOdzBIOEcKbHdtRUtZQmhIZnBlLzNPc29PT0p1Qnh4RmNiZU1YOFMzT0Z0bTYvbjZKOTFlRXlyUmp1YXpyOEZHRjFORlR3VwptaGxRQkpxeW1tOWxpMUpmUEZnRUtDWEFabUV4ZnJuZ2Ria2FxSUhXY2hlenhRTXhOUkY0ZUtMZzZUQ01mNERmCldOODh1aWVXNG9BMGJlT1kwMlFuckVoK0tIZGN4aVZoSmZpRkRHWDZ4REl2cFpnRjVQZ0xaeFlXeG9LNE1objUKK2JsNTNCL042NityRHQwYjIwWGtldWNDNHBWZC9HbndVMmxobFhWNUMxNVY1amdjbEtsWk01N0ljWFI1ZjFHSgp0c2hxdURESWFqakRicDdoTnhicUJXSk1XeEpIN2FlMHMxaFd4MG56ZnhKb0NURng4RzM0VGtmNzFvWHV4VmhBCkdhUWRwL2xMUXpmY2FGcFB6K3ZDWkhUZXRCWFo5RlJVR2k4YzE1ZHhWSkNPMlNDZFV5dC9xNC9pNmpDOFVEZnYKOFVlMWZYd3NCT3hvbmJSSlJCRDBja3NjWk9mODVtdVEzV2w5YWYwQVZxVzNyTGF0dDhvK0FlK2MKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyIE89RW50cnVzdCwgSW5jLiBPVT1TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2FsLXRlcm1zLyhjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIFN1YmplY3Q6IENOPUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyIE89RW50cnVzdCwgSW5jLiBPVT1TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2FsLXRlcm1zLyhjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIExhYmVsOiAiRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIiCiMgU2VyaWFsOiAxMjQ2OTg5MzUyCiMgTUQ1IEZpbmdlcnByaW50OiA0YjplMjpjOTo5MTo5Njo2NTowYzpmNDowZTo1YTo5Mzo5MjphMDowYTpmZTpiMgojIFNIQTEgRmluZ2VycHJpbnQ6IDhjOmY0OjI3OmZkOjc5OjBjOjNhOmQxOjY2OjA2OjhkOmU4OjFlOjU3OmVmOmJiOjkzOjIyOjcyOmQ0CiMgU0hBMjU2IEZpbmdlcnByaW50OiA0MzpkZjo1Nzo3NDpiMDozZTo3ZjplZjo1ZjplNDowZDo5MzoxYTo3YjplZDpmMTpiYjoyZTo2Yjo0Mjo3Mzo4Yzo0ZTo2ZDozODo0MToxMDozZDozYTphNzpmMzozOQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRVBqQ0NBeWFnQXdJQkFnSUVTbE9NS0RBTkJna3Foa2lHOXcwQkFRc0ZBRENCdmpFTE1Ba0dBMVVFQmhNQwpWVk14RmpBVUJnTlZCQW9URFVWdWRISjFjM1FzSUVsdVl5NHhLREFtQmdOVkJBc1RIMU5sWlNCM2QzY3VaVzUwCmNuVnpkQzV1WlhRdmJHVm5ZV3d0ZEdWeWJYTXhPVEEzQmdOVkJBc1RNQ2hqS1NBeU1EQTVJRVZ1ZEhKMWMzUXMKSUVsdVl5NGdMU0JtYjNJZ1lYVjBhRzl5YVhwbFpDQjFjMlVnYjI1c2VURXlNREFHQTFVRUF4TXBSVzUwY25WegpkQ0JTYjI5MElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1SUMwZ1J6SXdIaGNOTURrd056QTNNVGN5Ck5UVTBXaGNOTXpBeE1qQTNNVGMxTlRVMFdqQ0J2akVMTUFrR0ExVUVCaE1DVlZNeEZqQVVCZ05WQkFvVERVVnUKZEhKMWMzUXNJRWx1WXk0eEtEQW1CZ05WQkFzVEgxTmxaU0IzZDNjdVpXNTBjblZ6ZEM1dVpYUXZiR1ZuWVd3dApkR1Z5YlhNeE9UQTNCZ05WQkFzVE1DaGpLU0F5TURBNUlFVnVkSEoxYzNRc0lFbHVZeTRnTFNCbWIzSWdZWFYwCmFHOXlhWHBsWkNCMWMyVWdiMjVzZVRFeU1EQUdBMVVFQXhNcFJXNTBjblZ6ZENCU2IyOTBJRU5sY25ScFptbGoKWVhScGIyNGdRWFYwYUc5eWFYUjVJQzBnUnpJd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFSwpBb0lCQVFDNmhMWnkyNTRNYStLWjZUQUJwM2JxTXJpVlFSckoybUZPV0hMUC92YUNlYjl6WVFZS3BTZllzMS9UClJVNGNjdFpPTXZKeWlnLzNneG5RYW9DQUFFVWVzTWZubXI4U1Z5Y2NvMmd2Q29lOWFtc09YbVh6SEhmVjFJV04KY0NHMHN6TG5pNkxWaGprQ3NialNSODdreVVuRU82ZmUrMVI5Vjc3dzZHN0NlYkk2QzFYaVVKZ1dNaE5jTDNoVwp3Y0tVcy9KYTVDZWFueVRYeHV6UW15V0M0OHpDeEVYRmpKZDZCbXNxRVorcENtNUlPMi9iMUJFWlF2ZVBCNy8xClUxK2NQdlFYTE9acHJFNHlUR0ozNnJmbzViczB2Qm1McnB4UjU3ZCt0Vk94TXlMbGJjOXdQQnI2NHB0bnRvUDAKamFXdllreE40RmlzWkRRU0EvaTJqWlJqSktSeEFnTUJBQUdqUWpCQU1BNEdBMVVkRHdFQi93UUVBd0lCQmpBUApCZ05WSFJNQkFmOEVCVEFEQVFIL01CMEdBMVVkRGdRV0JCUnFjaVo2MEI3dmZlYzdhVkhVYkkyZmtCSm1xekFOCkJna3Foa2lHOXcwQkFRc0ZBQU9DQVFFQWVaOGRsc2EyZVQ4aWpZZlRod01FWUdwcm1pNVppWE1SckVQUjlSUC8KalRrcndQSzlUM0NNcVMvcUY4UUxWSjdVRzVhWU16eW9yV0tpQUhhcldXbHVCaDEreExsRWpaaXZFdFJoMndvWgpSa2Z6Ni9kandVQUZRS1hTdC9TMW1qYS9xWWgyaUFSVkJDdWNoMzhhTnp4K0xhVWEyTlNKWHNxOXJEMXMyRzJ2CjFmTjJEODA3aURnaW5XeVRtc1E5djRJYlpUK21EMTJxL09XeUZjcTFyY2E4UGRDRTZPb0djckJOT1RKNHZ6NFIKbkF1a25ab2g4L0NiQ3pCNDI4SGNoMFArdkdPYXlzWENITW5IamY4N0VsZ0k1clk5N0hvc1R2dURsczRNUEdtSApWSE9rYzhLVC8xRVFyQlZVQWRqOEJiR0pvWDkwZzVwSjE5eE9lNHBJYjR0RjlnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMSBPPUVudHJ1c3QsIEluYy4gT1U9U2VlIHd3dy5lbnRydXN0Lm5ldC9sZWdhbC10ZXJtcy8oYykgMjAxMiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBTdWJqZWN0OiBDTj1FbnRydXN0IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBFQzEgTz1FbnRydXN0LCBJbmMuIE9VPVNlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMvKGMpIDIwMTIgRW50cnVzdCwgSW5jLiAtIGZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgTGFiZWw6ICJFbnRydXN0IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBFQzEiCiMgU2VyaWFsOiA1MTU0MzEyNDQ4MTkzMDY0OTExNDExNjEzMzM2OQojIE1ENSBGaW5nZXJwcmludDogYjY6N2U6MWQ6ZjA6NTg6YzU6NDk6NmM6MjQ6M2I6M2Q6ZWQ6OTg6MTg6ZWQ6YmMKIyBTSEExIEZpbmdlcnByaW50OiAyMDpkODowNjo0MDpkZjo5YjoyNTpmNToxMjoyNTozYToxMTplYTpmNzo1OTo4YTplYjoxNDpiNTo0NwojIFNIQTI1NiBGaW5nZXJwcmludDogMDI6ZWQ6MGU6YjI6OGM6MTQ6ZGE6NDU6MTY6NWM6NTY6Njc6OTE6NzA6MGQ6NjQ6NTE6ZDc6ZmI6NTY6ZjA6YjI6YWI6MWQ6M2I6OGU6YjA6NzA6ZTU6NmU6ZGY6ZjUKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUMrVENDQW9DZ0F3SUJBZ0lOQUthTGVTa0FBQUFBVU5DUitUQUtCZ2dxaGtqT1BRUURBekNCdnpFTE1Ba0cKQTFVRUJoTUNWVk14RmpBVUJnTlZCQW9URFVWdWRISjFjM1FzSUVsdVl5NHhLREFtQmdOVkJBc1RIMU5sWlNCMwpkM2N1Wlc1MGNuVnpkQzV1WlhRdmJHVm5ZV3d0ZEdWeWJYTXhPVEEzQmdOVkJBc1RNQ2hqS1NBeU1ERXlJRVZ1CmRISjFjM1FzSUVsdVl5NGdMU0JtYjNJZ1lYVjBhRzl5YVhwbFpDQjFjMlVnYjI1c2VURXpNREVHQTFVRUF4TXEKUlc1MGNuVnpkQ0JTYjI5MElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1SUMwZ1JVTXhNQjRYRFRFeQpNVEl4T0RFMU1qVXpObG9YRFRNM01USXhPREUxTlRVek5sb3dnYjh4Q3pBSkJnTlZCQVlUQWxWVE1SWXdGQVlEClZRUUtFdzFGYm5SeWRYTjBMQ0JKYm1NdU1TZ3dKZ1lEVlFRTEV4OVRaV1VnZDNkM0xtVnVkSEoxYzNRdWJtVjAKTDJ4bFoyRnNMWFJsY20xek1Ua3dOd1lEVlFRTEV6QW9ZeWtnTWpBeE1pQkZiblJ5ZFhOMExDQkpibU11SUMwZwpabTl5SUdGMWRHaHZjbWw2WldRZ2RYTmxJRzl1YkhreE16QXhCZ05WQkFNVEtrVnVkSEoxYzNRZ1VtOXZkQ0JEClpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlU0F0SUVWRE1UQjJNQkFHQnlxR1NNNDlBZ0VHQlN1QkJBQWkKQTJJQUJJUVR5ZEM2YlVGNzRtelE2MVZmWmdJYUpQUmJpV2xINDdqQ2ZmSHlBc1dmb1BaYjFZc0dHWVpQVXhCdApCeVFub2FENDFVY1pZVXg5eXBNbjZuUU03MitXQ2Y1ajdIQmROcTFuZDY3Sm5YeFZSRHFpWTFFZjllTmkxS2xICkJ6N01JS05DTUVBd0RnWURWUjBQQVFIL0JBUURBZ0VHTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SFFZRFZSME8KQkJZRUZMZGo1eHJkamVrSXBsV0RwT0JxVUVGbEVVSkpNQW9HQ0NxR1NNNDlCQU1EQTJjQU1HUUNNR0Y1Mk9WQwpSOThjcmxPWkY3WnZISDNodnhHVTBRT0lkZVNOaWFTS2QwYmViV0h2QXZYN3RkL00vazcvL3FubXB3SXdXNW5YCmhUY0d0WHNJL2VzbmkwcVUrZUg2cDQ0bUNPaDhrbWh0Yzlodkpxd2hBcmladHlaQld5VmdydEJJR3U0RwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049Q0ZDQSBFViBST09UIE89Q2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5CiMgU3ViamVjdDogQ049Q0ZDQSBFViBST09UIE89Q2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5CiMgTGFiZWw6ICJDRkNBIEVWIFJPT1QiCiMgU2VyaWFsOiA0MDc1NTUyODYKIyBNRDUgRmluZ2VycHJpbnQ6IDc0OmUxOmI2OmVkOjI2OjdhOjdhOjQ0OjMwOjMzOjk0OmFiOjdiOjI3OjgxOjMwCiMgU0hBMSBGaW5nZXJwcmludDogZTI6Yjg6Mjk6NGI6NTU6ODQ6YWI6NmI6NTg6YzI6OTA6NDY6NmM6YWM6M2Y6Yjg6Mzk6OGY6ODQ6ODMKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDVjOmMzOmQ3OjhlOjRlOjFkOjVlOjQ1OjU0OjdhOjA0OmU2Ojg3OjNlOjY0OmY5OjBjOmY5OjUzOjZkOjFjOmNjOjJlOmY4OjAwOmYzOjU1OmM0OmM1OmZkOjcwOmZkCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGalRDQ0EzV2dBd0lCQWdJRUdFck0xakFOQmdrcWhraUc5dzBCQVFzRkFEQldNUXN3Q1FZRFZRUUdFd0pEClRqRXdNQzRHQTFVRUNnd25RMmhwYm1FZ1JtbHVZVzVqYVdGc0lFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXkKYVhSNU1SVXdFd1lEVlFRRERBeERSa05CSUVWV0lGSlBUMVF3SGhjTk1USXdPREE0TURNd056QXhXaGNOTWpreApNak14TURNd056QXhXakJXTVFzd0NRWURWUVFHRXdKRFRqRXdNQzRHQTFVRUNnd25RMmhwYm1FZ1JtbHVZVzVqCmFXRnNJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1SVXdFd1lEVlFRRERBeERSa05CSUVWV0lGSlAKVDFRd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUURYWFd2TkVEOGZCVm5WQlUwMwpzUTdzbUN1T0ZSMzZrMHNYZ2lGeEVGTFhVV1J3RnNKVmFVMk9GVzJmdnd3Ynd1Q2paOVlNck04aXJxOTNWQ3BMClRJcFRVbnJEN2k3ZXMzRWx3ZWxkUGU2aEw2UDNLanpKSXgxcXF4MmhwL0h6N0tEVlJNOFZ6M0l2SFdPWDZKbjUKL1pPa1ZJQk1VdFJTcXk1SjM1RE51RisrUDk2aHlrMGcxQ1hvaENsVHQ3R0lILy82MnBDZkNxa3RRVCt4OFJncAo3aFpaTERSSkdxZ0cxNmlJMGdOeWVqTGk2bWhOYml5V1pYdktXZnJ5NHQzdU1Dejd6RWFzeEdQcmIzODJLelJ6CkVwUi8zOHdtbnZGeVhWQmxXWTlwczRkZU1tL0RHSXExbFkrd2VqZmVXa1U3eHpiaDcyZlJPZE9YVzNOaUdVZ3QKaHh3RyszU1lJRWx6OEFYU0c3R2dvN2NiY05PSWFibGExamowWXR3bGkzaS8rT2grdUZ6SmxVOWZweTI1SUd2UAphOTMxRGZTQ3QvU3laaTRRS1BhWFdudVdGbzhCR1Mxc2JuODVXQVprZ3dHRGc4Tk5rdDB5eG9la04ra1d6cW90CmFLOEtnV1U2Y01HYnJVMXRWTW9xTFV1Rkc3T0E1bkJGRFd0ZU5mQi9PN2ljNUFSd2lSSWxrOW9LbVNKZ2FtTmcKVG5ZR21FNjlnNjBkV0lvbGhkTEhaUjR0anNiZnRzYmhmNG9FSVJVcGRQQStuSkNkREM3eGlqNWFxZ3dKSHNmVgpQS1B0bDhNZU5QbzQrUWdPNDhCZEs0UFJWbXJKdHFoVVV5NTRNbWM5Z245MDBQdmh0Z1ZndVhEYmpndjVFMWh2CmNXQVFVaEM1d1VFSjczSWZaekY0LzVZRmpRSURBUUFCbzJNd1lUQWZCZ05WSFNNRUdEQVdnQlRqL2kzOUtOQUwKdGJxMm9zUy9CcW9GakpQN0x6QVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BNEdBMVVkRHdFQi93UUVBd0lCQmpBZApCZ05WSFE0RUZnUVU0LzR0L1NqUUM3VzZ0cUxFdndhcUJZeVQreTh3RFFZSktvWklodmNOQVFFTEJRQURnZ0lCCkFDWEd1bXZyaDh2ZWdqbVdQZkJFcDJ1RWN3UGVuU3RQdWlCL3ZIaXl6NWV3RzV6ejEza3U5VWkyMHZzWGlPYlQKZWovdFV4UFE0aTlxZWNzQUl5am1IamRYTlltRXduWlBORGF0WjhQT1FRYUl4ZmZ1MkJxNDFndC9VUCtUcWhkTApqT3p0VW1DeXBBYnFUdXYwYXhuOTYvVWE0Q1VxbXR6SFFUYjN5SFFGaERtVk9kWUxPNlFuK2dqWVhCNzRCR0JTCkVTZ29BLy92VTJZQXBVbzBGbVo4L1Fta3JwNW5HbTlCQzJzR0U1dVBobkVGdEMrTmlXWXpLWFpVbWhINEovcXkKUDVIZ3pnMGI4ekFhcmI4aVhSdlR2eVVGVGVHU0duK1puenhFazhyVVFFbHNnSWZYQkRyRE1sSTFEbGI0cGQxOQp4SXNORVI5VHl4NnlGN1pvZDFyZzFNdklCNjcxT2k2T043ZlFBVXRES1hlTU9aZVBnbHI0VWVXSm9Cam5hSDlkCkNpNzdvMGNPUGFZamVzWUJ4NC9JWHI5dGdGYStpaVM2TStxZjRUSVJudkhTVDREMkcwQ3ZPSjRSVUhsekVoTE4KNW15ZExJaHlQRENCQnBFaTZsbXQyaGt1SXNLTnVZeUg0R2E4Y3lOZklXUmpnRWoxb0R3WVBaVElTRUVkUUxwZQovdjVXT2FISXoxNmVHV1JHRU5vWGtiY0ZnS3lMbVpKOTU2TFlCd3MySitkSWVXQ0t3OWNUWFBoeVFOOUt5OCtaCkFBb0FDeEdWMmxaRkE0Z0tuMmZRMVhteHFJMUFiUTNDZWtENjgxOWtSNUxMVTdtN1djNVAvZEFWVXdIWTMrdloKNW5idjBDTzdPNmw1czlVQ0tjMkpvNVlQU2pYblRrTEFkYzBIeitZczYzc3UKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVRceGRjUktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2FcdTAxMWZsYXlcdTAxMzFjXHUwMTMxc1x1MDEzMSBINSBPPVRceGRjUktUUlVTVCBCaWxnaSBcdTAxMzBsZXRpXHUwMTVmaW0gdmUgQmlsaVx1MDE1ZmltIEdceGZjdmVubGlcdTAxMWZpIEhpem1ldGxlcmkgQS5cdTAxNWUuCiMgU3ViamVjdDogQ049VFx4ZGNSS1RSVVNUIEVsZWt0cm9uaWsgU2VydGlmaWthIEhpem1ldCBTYVx1MDExZmxheVx1MDEzMWNcdTAxMzFzXHUwMTMxIEg1IE89VFx4ZGNSS1RSVVNUIEJpbGdpIFx1MDEzMGxldGlcdTAxNWZpbSB2ZSBCaWxpXHUwMTVmaW0gR1x4ZmN2ZW5saVx1MDExZmkgSGl6bWV0bGVyaSBBLlx1MDE1ZS4KIyBMYWJlbDogIlRceGRjUktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2FcdTAxMWZsYXlcdTAxMzFjXHUwMTMxc1x1MDEzMSBINSIKIyBTZXJpYWw6IDE1NjIzMzY5OTE3MjQ4MQojIE1ENSBGaW5nZXJwcmludDogZGE6NzA6OGU6ZjA6MjI6ZGY6OTM6MjY6ZjY6NWY6OWY6ZDM6MTU6MDY6NTI6NGUKIyBTSEExIEZpbmdlcnByaW50OiBjNDoxODpmNjo0ZDo0NjpkMTpkZjowMDozZDoyNzozMDoxMzo3Mjo0MzphOToxMjoxMTpjNjo3NTpmYgojIFNIQTI1NiBGaW5nZXJwcmludDogNDk6MzU6MWI6OTA6MzQ6NDQ6YzE6ODU6Y2M6ZGM6NWM6Njk6M2Q6MjQ6ZDg6NTU6NWM6YjI6MDg6ZDY6YTg6MTQ6MTM6MDc6Njk6OWY6NGE6ZjA6NjM6MTk6OWQ6NzgKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVKekNDQXcrZ0F3SUJBZ0lIQUk0WC9pUWdnVEFOQmdrcWhraUc5dzBCQVFzRkFEQ0JzVEVMTUFrR0ExVUUKQmhNQ1ZGSXhEekFOQmdOVkJBY01Ca0Z1YTJGeVlURk5NRXNHQTFVRUNneEVWTU9jVWt0VVVsVlRWQ0JDYVd4bgphU0RFc0d4bGRHbkZuMmx0SUhabElFSnBiR25GbjJsdElFZkR2SFpsYm14cHhKOXBJRWhwZW0xbGRHeGxjbWtnClFTN0ZuaTR4UWpCQUJnTlZCQU1NT1ZURG5GSkxWRkpWVTFRZ1JXeGxhM1J5YjI1cGF5QlRaWEowYVdacGEyRWcKU0dsNmJXVjBJRk5oeEo5c1lYbkVzV1BFc1hQRXNTQklOVEFlRncweE16QTBNekF3T0RBM01ERmFGdzB5TXpBMApNamd3T0RBM01ERmFNSUd4TVFzd0NRWURWUVFHRXdKVVVqRVBNQTBHQTFVRUJ3d0dRVzVyWVhKaE1VMHdTd1lEClZRUUtERVJVdzV4U1MxUlNWVk5VSUVKcGJHZHBJTVN3YkdWMGFjV2ZhVzBnZG1VZ1FtbHNhY1dmYVcwZ1I4TzgKZG1WdWJHbkVuMmtnU0dsNmJXVjBiR1Z5YVNCQkxzV2VMakZDTUVBR0ExVUVBd3c1Vk1PY1VrdFVVbFZUVkNCRgpiR1ZyZEhKdmJtbHJJRk5sY25ScFptbHJZU0JJYVhwdFpYUWdVMkhFbjJ4aGVjU3hZOFN4YzhTeElFZzFNSUlCCklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUFwQ1VaNFdXZTYwZ2hVRW9JNVJId1dyb20KLzROWnprUXFMLzdoem1BRC9JMERwZTMvYTZpNnpEUUduMWsxOXV3c3U1MzdqVkpwNDV3bkVGUHpwQUxGcC9rUgpHbWwxYnNNZGk5R1lqWk9IcDNHWERTSEhtZmxTMHl4alhWVzg2QjhCU0xsZy9rSks5c2lBcnMxbWVwNUZpbWgzCjRraG9uNkxhOGVIQkVKL3JQQ21CcCtFeUNOU2dCYkdNKzQyV0FBNCtKZDlUaGlJNy9QUzk4d2wrZCt5RzZ3OHoKNVVOUDlGUjFiU21aTG1aYVE5L0xYTXJJNVRqeGZqczFuUS8weFZxaHpQTWdnQ1RUVit3VnVuVWxtK2hrUzdNMApoTzhFdVBiSmJLb0NQclpWNGpJM1gveG1sMS9OMXA3SElMOU54cXcvZFY4YzdUS2NmR2tBYVpIakl4aFQ2UUlECkFRQUJvMEl3UURBZEJnTlZIUTRFRmdRVVZwa0hIdE9zREdsa3RBeFFSOTVETEw0Z3dQc3dEZ1lEVlIwUEFRSC8KQkFRREFnRUdNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBSjVGZG5zWApTREx5T0lzcHZlNldTazZCR0xGUlJ5RE4wR1N4RHNuWkFka0p6c2laM0dnbEU5UmM4cVBvQlA1eUNjY0xxaDBsClZYNldtbGUzdXNVUmVobm1wMzQ5aFE3MStTNHBMK2Y1YkZnV1YxQWw5ajR1UHFydGQzR3FxcG1XUmdxdWp1d3EKVVJhd1hzM3Fad1FjV0REMVlJcTlwcjFONVphMC9FS0pBV3YyY01oUU9Rd3QxV2JaeU5Lek1yY2JHVzNMTS9uZgpwZVlWaERmd3d2SmxscEtRZC9DdDlKRHBFWGpYazRuQVBRdTZLZlRvbVoxeWp1MmRMKzZTZmFIeC8xMjZNMkNGCll2NEhBcUdFVmthK2xncWFFOWNoVExkOEI1OU9UaitSZFBzbm5SSE0zZWF4eW5GTkV4YzVKc1VwSVN1VEtXcVcKK3F0QjRVdTJOUXZBbXhVPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049Q2VydGlub21pcyAtIFJvb3QgQ0EgTz1DZXJ0aW5vbWlzIE9VPTAwMDIgNDMzOTk4OTAzCiMgU3ViamVjdDogQ049Q2VydGlub21pcyAtIFJvb3QgQ0EgTz1DZXJ0aW5vbWlzIE9VPTAwMDIgNDMzOTk4OTAzCiMgTGFiZWw6ICJDZXJ0aW5vbWlzIC0gUm9vdCBDQSIKIyBTZXJpYWw6IDEKIyBNRDUgRmluZ2VycHJpbnQ6IDE0OjBhOmZkOjhkOmE4OjI4OmI1OjM4OjY5OmRiOjU2OjdlOjYxOjIyOjAzOjNmCiMgU0hBMSBGaW5nZXJwcmludDogOWQ6NzA6YmI6MDE6YTU6YTQ6YTA6MTg6MTE6MmU6Zjc6MWM6MDE6Yjk6MzI6YzU6MzQ6ZTc6ODg6YTgKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDJhOjk5OmY1OmJjOjExOjc0OmI3OjNjOmJiOjFkOjYyOjA4Ojg0OmUwOjFjOjM0OmU1OjFjOmNiOjM5Ojc4OmRhOjEyOjVmOjBlOjMzOjI2Ojg4OjgzOmJmOjQxOjU4Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGa2pDQ0EzcWdBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUXNGQURCYU1Rc3dDUVlEVlFRR0V3SkdVakVUCk1CRUdBMVVFQ2hNS1EyVnlkR2x1YjIxcGN6RVhNQlVHQTFVRUN4TU9NREF3TWlBME16TTVPVGc1TURNeEhUQWIKQmdOVkJBTVRGRU5sY25ScGJtOXRhWE1nTFNCU2IyOTBJRU5CTUI0WERURXpNVEF5TVRBNU1UY3hPRm9YRFRNegpNVEF5TVRBNU1UY3hPRm93V2pFTE1Ba0dBMVVFQmhNQ1JsSXhFekFSQmdOVkJBb1RDa05sY25ScGJtOXRhWE14CkZ6QVZCZ05WQkFzVERqQXdNRElnTkRNek9UazRPVEF6TVIwd0d3WURWUVFERXhSRFpYSjBhVzV2YldseklDMGcKVW05dmRDQkRRVENDQWlJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFOVE1DUW9zUDVMMgpmeFNlQzV5YWFoMUFNR1Q5cXQ4T0hnWmJuMUNGNnMyTnEwTm4zckQ2Zm9DV25vUjRra2pXNHpudXp1UlpXSmZsCkxpZVk2cE9vZDV0SzhPOTBnQzNyTUIrMTJjZUFuR0lua1lqd1NvbmQzSWptRlBuVkF5Ly9sZHU5bit3cytoUVYKV1pVS3hrZDhhUmk1cHdQNXluYXB6OGR2dEY0Ri91N0JVckoxTW9mczdTbG1PL05LRm9MMjFwcmJjcGpwM3ZERgpUS1dydGVvQjRvd3VaSDlrYi8yakpaT0x5S0lPU1kwMDhCL3NXRVV1TktxRVVMM25za29UdUxBUHJqaGRzS2tiCjVuUEpXcUhaWmtDcXFVMm1OQUt0aEg2eUk4SDdLc1puOURTMnNKVnFNMDl4UkxXdHdIa3ppT0MvN2FPZ0ZMU2MKQ2JBSzQyQysrUGhtaU0xYjhYY0Y0TFZ6YnNGOVJpNk9TeWVtelRVSy9lVk5mYW9xb3luSFdtZ0U2T1hXazZSaQp3c1htOUUvRytaOGFqWUpKR1lyS1dVTTY2QTB5d2ZSTUV3TnZicVkva1hQTHluTnZFaUNMN3NDQ2VONUxMc0pKCnd4M3RGdllrOUNjYlhGY3gzRlh1cUI1dmJLemlSY3hYVjRwMVZ4bmd0VmlaU1RZeFBETUJiUlpLemJncWc0U0cKbS9sZzBoOXRrUVBUWUtiVlBacmRkNUE5TmFTZkQxNzFVa1JwdWNDNjNNOTkzM3paeEt5R0lqSzhlMnVSNzNyNApGMml3NGxOVllDMnZQc0tEMk5rSksvREFaTnVIaTVITWtlc0UvWGEwbFpybUZBWWIxVFFkdnRqL2RCeFRoWm5nCldWSktZZTJJbm10SmlVWitJRnJaNTBybGF1N1NaUkZEQWdNQkFBR2pZekJoTUE0R0ExVWREd0VCL3dRRUF3SUIKQmpBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJUdmtVejFwY013NkM4STZ0TnhJcVNTYUhoMAoyVEFmQmdOVkhTTUVHREFXZ0JUdmtVejFwY013NkM4STZ0TnhJcVNTYUhoMDJUQU5CZ2txaGtpRzl3MEJBUXNGCkFBT0NBZ0VBZmoxVTJpSmRHbGcrTzFRbnVyck15T01hYXVvKytSTHJWbDg5VU03ZzZrZ21Kczk1Vm42UkhKay8KMEtHUkhDd1BUNWlWV1ZPOTBDTFlpRjJjTi96N1pNRjRqSXVhWUFucTFmb2hYOUIwWmVkUXhiOHV1UXNMcmJXdwpGNllTak5SaWVPcFdhdXdLMGtERFBBVXdQazJVdDU5S0E5TjlKMHUyL2tUTytoa3pHbTJrUXRIZHpNakkxeFpTCmcwODFsTE1TVlgzbDRrTHI1SnlUQ2NCTVd3ZXJ4MjBSb0ZBWGxDT290UXFTRDdKNndXQXNPTXdhcGx2LzhnemoKcWg4YzNMaWdreWZlWStOL0laODY1Wjc2NEJOcWRldVdYR0tSbEk1blU3YUorQklKeTI5U1d3TnlobENWQ05TTgpoNFlWSDVVazJLUnZtczZrblp0dDBySjJCb2JHVmdqRjZ3bmFOc0liVzBHK1lTcmpjT2E0cHZpMldzUzlJZmYvCnFsK2hiSFk1WnRicVRGWGhBRE9iRTVoanlXL1FBU0FKTjFMbkRFOCt6YnoxWDVZbnB5QUNsZUF1NkFkQkJSOFYKYnRhdzVCbmdEd0tUQUNkeXhZdlJWQjlkU3NOQWwzNVZwbnpCTXdRVUFSMUpJR2tMR1pPZGJsZ2k5MEFNUmd3agpZL001MG45MlVhZjB5S0h4REhZaUkwWlNLUzNpbzBFSFZtbVkwZ1VKdkduSFdtSE5qNEZnRlUyQTNaRGlmY1JRCjhvdzdia3JIeHVhQUt6eUJ2QkdBRmhBbjEvRE5QM25NY3lyRGZsT1IxbTc0OWZQSDBGRk5qa3VsVytZWkZ6dlcKZ1FuY0l0enVqcm5FajFQaFo3c3p1SWdWUnMvdGFUWC9kUTFHODg1eDRjVnJoa0lHdVVFPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049T0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQiBDQSBPPVdJU2VLZXkgT1U9T0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZAojIFN1YmplY3Q6IENOPU9JU1RFIFdJU2VLZXkgR2xvYmFsIFJvb3QgR0IgQ0EgTz1XSVNlS2V5IE9VPU9JU1RFIEZvdW5kYXRpb24gRW5kb3JzZWQKIyBMYWJlbDogIk9JU1RFIFdJU2VLZXkgR2xvYmFsIFJvb3QgR0IgQ0EiCiMgU2VyaWFsOiAxNTc3Njg1OTU2MTY1ODg0MTQ0MjIxNTkyNzg5NjY3NTA3NTc1NjgKIyBNRDUgRmluZ2VycHJpbnQ6IGE0OmViOmI5OjYxOjI4OjJlOmI3OjJmOjk4OmIwOjM1OjI2OjkwOjk5OjUxOjFkCiMgU0hBMSBGaW5nZXJwcmludDogMGY6Zjk6NDA6NzY6MTg6ZDM6ZDc6NmE6NGI6OTg6ZjA6YTg6MzU6OWU6MGM6ZmQ6Mjc6YWM6Y2M6ZWQKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDZiOjljOjA4OmU4OjZlOmIwOmY3OjY3OmNmOmFkOjY1OmNkOjk4OmI2OjIxOjQ5OmU1OjQ5OjRhOjY3OmY1Ojg0OjVlOjdiOmQxOmVkOjAxOjlmOjI3OmI4OjZiOmQ2Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEdFRDQ0FwMmdBd0lCQWdJUWRyRWdVblR3aFlkR3MvZ2pHdmJDd0RBTkJna3Foa2lHOXcwQkFRc0ZBREJ0Ck1Rc3dDUVlEVlFRR0V3SkRTREVRTUE0R0ExVUVDaE1IVjBsVFpVdGxlVEVpTUNBR0ExVUVDeE1aVDBsVFZFVWcKUm05MWJtUmhkR2x2YmlCRmJtUnZjbk5sWkRFb01DWUdBMVVFQXhNZlQwbFRWRVVnVjBsVFpVdGxlU0JIYkc5aQpZV3dnVW05dmRDQkhRaUJEUVRBZUZ3MHhOREV5TURFeE5UQXdNekphRncwek9URXlNREV4TlRFd016RmFNRzB4CkN6QUpCZ05WQkFZVEFrTklNUkF3RGdZRFZRUUtFd2RYU1ZObFMyVjVNU0l3SUFZRFZRUUxFeGxQU1ZOVVJTQkcKYjNWdVpHRjBhVzl1SUVWdVpHOXljMlZrTVNnd0pnWURWUVFERXg5UFNWTlVSU0JYU1ZObFMyVjVJRWRzYjJKaApiQ0JTYjI5MElFZENJRU5CTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUEyQmUzCkhFb2tLdGFYc2NyaUh2dDlPTytZOWJJNW1FNG51QkZkZTlJbGxJaUNGU1pxR3pHN3FGc2hJU3ZZRDA2Zld2R3gKV3VSNTFqSWpLK0ZUekpsRlhIdFByYnkvaDBvTFM1ZGFxUFpJN0gxN0RjMGhCdCtlRmYxQmlraTNJUFNoZWh0WAoxRjFRLzdwbjJDT1pIOGcvNDk3L2IxdDNzV3R1dU1sazkrSEtRVVlPS1hIUXVTUDh5WUZmVHZkdjM3K0VyWE5rCnU3ZENqbW4yMUhZZGZwMm51RmVLVVdkeTE5U291SlZVUUhNRDl1cjA2LzRvUW5jL25TTWJzclk5Z0JRSFRDNVAKOTlVS0ZnMjlaa00zZmlORGVjTkFodlZNS2RxT21xME5wUVNIaUI2RjQrbFQxWnZJaXdOamVPdmdHVXB1dXk5cgpNMlJZazYxcHY0OGI3NEpJeHdJREFRQUJvMUV3VHpBTEJnTlZIUThFQkFNQ0FZWXdEd1lEVlIwVEFRSC9CQVV3CkF3RUIvekFkQmdOVkhRNEVGZ1FVTlEvSU5tTmU0cVBzK1R0bUZjNVJVdU9SbWowd0VBWUpLd1lCQkFHQ054VUIKQkFNQ0FRQXdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBRUJNKzRleW1ZR1FmcDNGc0xBbXpZaDdLektOYnJnaApjVmlYZmE0M0ZLOCs1L2VhNG4zMmNaaVpCS3BEZEhpajQwbGhQbk9NVFpUZytYSEV0aFlPVTNnZjFxS0hMd0k1CmdTazhyeFdZSVREK0tKQUFqTkhoeS9wZXlQMzRFRVk3b25oQ2tSZDBWUXJlVUdkTlp0R24vLzNad0xXb280ck8KWnZVUFE4Mm5LMWQ3WTBacXFpNVMyUFR0NFcydEtaQjRTTHJoSTZxamlleTFxNWJBdEV1aUhaZWVldkp1UUhIZgphUEZsVGM1OEJkOVRaYW1sOExHWEJIQVZSZ09ZMU5LL1ZMU2dXSDFTYjlwV0ptTFUyTnVKTVc4YzhDTEMwMkljCk5jMU1hUlZVR3BDWTN1c2VYOHAzeDh1T1BVTnBuSnBZMENRNzN4dEFsbjQxcllISFRuRzZpQk09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1TWkFGSVIgUk9PVCBDQTIgTz1LcmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuCiMgU3ViamVjdDogQ049U1pBRklSIFJPT1QgQ0EyIE89S3Jham93YSBJemJhIFJvemxpY3plbmlvd2EgUy5BLgojIExhYmVsOiAiU1pBRklSIFJPT1QgQ0EyIgojIFNlcmlhbDogMzU3MDQzMDM0NzY3MTg2OTE0MjE3Mjc3MzQ0NTg3Mzg2NzQzMzc3NTU4Mjk2MjkyCiMgTUQ1IEZpbmdlcnByaW50OiAxMTo2NDpjMTo4OTpiMDoyNDpiMTo4YzpiMTowNzo3ZTo4OTo5ZTo1MTo5ZTo5OQojIFNIQTEgRmluZ2VycHJpbnQ6IGUyOjUyOmZhOjk1OjNmOmVkOmRiOjI0OjYwOmJkOjZlOjI4OmYzOjljOmNjOmNmOjVlOmIzOjNmOmRlCiMgU0hBMjU2IEZpbmdlcnByaW50OiBhMTozMzo5ZDozMzoyODoxYTowYjo1NjplNTo1NzpkMzpkMzoyYjoxYzplNzpmOTozNjo3ZTpiMDo5NDpiZDo1ZjphNzoyYTo3ZTo1MDowNDpjODpkZTpkNzpjYTpmZQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRGNqQ0NBbHFnQXdJQkFnSVVQb3BkQit4VjBqTFZ0K08yWHdIckxkemsxdVF3RFFZSktvWklodmNOQVFFTApCUUF3VVRFTE1Ba0dBMVVFQmhNQ1VFd3hLREFtQmdOVkJBb01IMHR5WVdwdmQyRWdTWHBpWVNCU2IzcHNhV042ClpXNXBiM2RoSUZNdVFTNHhHREFXQmdOVkJBTU1EMU5hUVVaSlVpQlNUMDlVSUVOQk1qQWVGdzB4TlRFd01Ua3cKTnpRek16QmFGdzB6TlRFd01Ua3dOelF6TXpCYU1GRXhDekFKQmdOVkJBWVRBbEJNTVNnd0pnWURWUVFLREI5TApjbUZxYjNkaElFbDZZbUVnVW05NmJHbGplbVZ1YVc5M1lTQlRMa0V1TVJnd0ZnWURWUVFEREE5VFdrRkdTVklnClVrOVBWQ0JEUVRJd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUMzdkQ1UXFFdk4KUUxYT1llZVd5clNoMmd3aXNQcTFlM1lBZDR3THozMm9oc3dtVWVRZ1BZVU0xbGpqNS9RcUdKM2EwYTRtN3V0VAozUFNRMWhOS0RKQTh3L1RhMG80TmtqcmNzYkgvT043RHVpMWZnTGtDdlVxZEd3KzB3OExCWndQZDNCdWNQYk93CjNnQWVxRFJIdTVyci9nc1V2VGFFMmcwZ3YvcGJ5NmtXSUswNVlPNHZkYmJubDV6NVB2MStUVzlOTCsrSURXcjYKM2ZFOWJpQ2xvQkswVFhDNXp0ZHlPNG1UcDRDRUhDZEpja20xL3p1Vm5zSE15QUhzNkE2S0NwYm5zNmFINWRiNQpCU3NObDBCd1BMcXNkVnFjMVUyZEFnclNTNXRtUzBZSEYyV3RuMnlJQU53aWllRGhaTlJudkRGNVlUeTd5a0hOClhHb0F5RHc0amxpdkFnTUJBQUdqUWpCQU1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUUQKQWdFR01CMEdBMVVkRGdRV0JCUXVGcWxLR0xYTHpQVnZVUE1qWC9oZDU2end5REFOQmdrcWhraUc5dzBCQVFzRgpBQU9DQVFFQXRYUDRBOXhaV3gxMjZhTXFlNUFvc2szQU0wK3FtckhVdU9Rbi82bVdtYzVHNEcxOFRLSTRwQVp3CjhQUkJFZXcvUjQwL2NvZjVPLzJrYnl0VEFPRC9PYmxxQnc3ckhSejJvbktReTRJOUVZS0wwcnVmS3E4aDVtT0cKblhrWjcvZTdERFdRdzRydFR3LzF6QkxacEQ2N29Qd2dsVjlQSmk4Ukk0Tk9kUWNQdjV2UnRCM3BFQVQreW1DUApva3k0cmMvaGtBL05yZ3JIWFh1M1VOTFVZZnJWRmR2WG40ZFJWT3VsNCt2SmhhQWxJRGY3anM0TU5JVGhQSUd5CmQwNURwWWhmaG1laFBlYTBYR0cyUHR2K3R5akZvZ2V1dGNyS2pTb1M3NWZ0d2pDa3lTcDYrL05OSXh1Wk16U2cKTHZXcEN6L1VYZUhQaEovaUdjSmZpdFlnSHVOenR3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EgMiBPPVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4gT1U9Q2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5CiMgU3ViamVjdDogQ049Q2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSAyIE89VW5pemV0byBUZWNobm9sb2dpZXMgUy5BLiBPVT1DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKIyBMYWJlbDogIkNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EgMiIKIyBTZXJpYWw6IDQ0OTc5OTAwMDE3MjA0MzgzMDk5NDYzNzY0MzU3NTEyNTk2OTY5CiMgTUQ1IEZpbmdlcnByaW50OiA2ZDo0Njo5ZTpkOToyNTo2ZDowODoyMzo1Yjo1ZTo3NDo3ZDoxZToyNzpkYjpmMgojIFNIQTEgRmluZ2VycHJpbnQ6IGQzOmRkOjQ4OjNlOjJiOmJmOjRjOjA1OmU4OmFmOjEwOmY1OmZhOjc2OjI2OmNmOmQzOmRjOjMwOjkyCiMgU0hBMjU2IEZpbmdlcnByaW50OiBiNjo3NjpmMjplZDpkYTplODo3Nzo1YzpkMzo2YzpiMDpmNjozYzpkMTpkNDo2MDozOTo2MTpmNDo5ZTo2Mjo2NTpiYTowMTozYToyZjowMzowNzpiNjpkMDpiODowNAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRjBqQ0NBN3FnQXdJQkFnSVFJZGJRU2s4bEQ4a3lOL3lxWGhLTjZUQU5CZ2txaGtpRzl3MEJBUTBGQURDQgpnREVMTUFrR0ExVUVCaE1DVUV3eElqQWdCZ05WQkFvVEdWVnVhWHBsZEc4Z1ZHVmphRzV2Ykc5bmFXVnpJRk11ClFTNHhKekFsQmdOVkJBc1RIa05sY25SMWJTQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVRFa01DSUcKQTFVRUF4TWJRMlZ5ZEhWdElGUnlkWE4wWldRZ1RtVjBkMjl5YXlCRFFTQXlNQ0lZRHpJd01URXhNREEyTURnegpPVFUyV2hnUE1qQTBOakV3TURZd09ETTVOVFphTUlHQU1Rc3dDUVlEVlFRR0V3SlFUREVpTUNBR0ExVUVDaE1aClZXNXBlbVYwYnlCVVpXTm9ibTlzYjJkcFpYTWdVeTVCTGpFbk1DVUdBMVVFQ3hNZVEyVnlkSFZ0SUVObGNuUnAKWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1TVNRd0lnWURWUVFERXh0RFpYSjBkVzBnVkhKMWMzUmxaQ0JPWlhSMwpiM0pySUVOQklESXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFDOStYajQ1dFdBCkRHU2RoaHVXWkdjL0lqb2VkUUY5Ny90Y1o0ekp6RnhycVpIbXVVTGxJRXViMnB0N3VabGQyWnVBUzllRVFDc24KMCtpNk1McytDUnFuU1pYdkswQWt3cGZIcCs2YkplK29DZ0NYaFZxcW5kd3B5ZUkxQit0d1RVcld3Yk5XdUtGQgpPSnZSK3pGL2orQmY0YkUvRDQ0V1NXRFhCbzBZK2FvbUVLc3EwOURSWjQwYlJyNUhNTlV1Y3RIRlk5cm5ZM2xFCmZrdGpKSW1HTGpRL0tVeFNpeXFud09LUktJbTV3RnY1SGRubko2My9tZ0tYd2NaUWtwc0NMTDJwdVRSWkNyK0UKU3YvZi9yT2Y2OW1lNEpnajdLWnJkeFlxMjh5dE94eWtoOXhHYzE0WlltaEZWK1NRZ2tLN1F0YndZZURCb3oxbQpvMTMwR082SXlZMFhSU21aTW5VQ01lNHBKc2hyQXVhMVlrVi9OeFZhSTJpSjFEN2VUaWV3OEVBTXZFMFh5MDJpCnN4N1FCbHJkOXBQUFYzV1o5ZnFHR21kNHM3K1cvalRjdmVkU1Z1V3o1WFY3MTBHUkJkeGRhZU9WRFVPNS9JT1cKT1pWN2JJQmFUeE55eHRkOUtYcEV1bEtrS3RWQlJna2cvaUtndGxzd2pieUpETlhYY1BpSFV2M2E3NnhSTGdlegpUdjdRQ2Rwdzc1ajZWdVp0MjdWWFM5emxMQ1VWeUo0dWVFNzQycHllaGl6S1YvTWE1Y2lTaXhxQ2xuckR2RkFTCmFkZ09Xa2FMT3VzbStpUEp0ckNCdmtJQXBQalcvakF1eDlKRzl1V09kZjN5ekxuUWgxdk1CaEJndTRNMXQxNW4KM2tmc21VanhwS0VWL3EyTVlvNDVWVTg1RnJteFk1My90d0lEQVFBQm8wSXdRREFQQmdOVkhSTUJBZjhFQlRBRApBUUgvTUIwR0ExVWREZ1FXQkJTMm9WUTVBc09nUDQ2S3ZQclUrQnltMFRvTy9UQU9CZ05WSFE4QkFmOEVCQU1DCkFRWXdEUVlKS29aSWh2Y05BUUVOQlFBRGdnSUJBSEdsRHM3azZiOC9PTldKV3NRQ1lmdE14UlFYTFl0UFUyc1EKRi94bGhNY1FTWkRlMjhjbWs0Z21iM0RXQWw0NW9QZVBxNWExcFJOY2dSUnREb0dDRVJ1S1RzWlBwZDFpSGtUZgpDVm4wVzNjTE4rbUxJTWI0Q2s0dVdCenJNOURQaG1ESjJ2dUFMNTVNWUlSNFBTRmsxdnRCSHhnUDU4bDFjYjI5ClhONDBoejVCc0E3MnVkWS9DUk9XRkMvZW1oMWF1VmJPTlRxd1gzQk5YdU1wOFNNb2NsbTJxOEtNWmlZY2R5d20KZGpXTEtLZHBvUGs3OVNQZGhSQjB5WkFEVnBIbnI3cEgxQktYRVNMam9rbVViT2UzbEV1NkxhVGFNNHRNcGtULwpXanpHSFdUWXRUSGtwang2cUZjTDIrMWhHc3Z4em5OM1k2U0hiMHhST05ia1g4ZWZ0b0VxNUlWSWVWaGVPL2piCkFvSm53VG5idzNSTFBUWWUrU21UaUdoYnFFUVpJZkNuNklFTkxPaVROclEzc3Nxd0d5WjZtaVVmbXBxQW5rc3EKUC91am12NXpNbkhDbnNaeTRZcG9KL0hrRDdURVRLVmhrL2lYRUFjcU1DV3B1Y2h4dU85b3pDMSs5ZUIrRDRLbwpiN2E2YklORGQ4MktraGVobmx0NEZqMUY0ak55M2VGbXlwblR5Y1VtL1Exb0JFYXV0dG1iakw0WnZySEc4aG5qClhBTEtMTmh2U2dmWnlUWGFRSFh5eEtjWmI1NUNFSmgxNXBXTFlMenR4UkxYaXM3Vm1GeFdsZ1BGN25jR05mL1AKNU80L0UySHUyOW90aGZETnJwMnlHQWxGdzVLaGNoZjhSN2FnQ3l6eHhONURhQWhxWHp2d2RtUDd6QVlzcHNiaQpEclc1dmlTUAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxNSBPPUhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5CiMgU3ViamVjdDogQ049SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxNSBPPUhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5CiMgTGFiZWw6ICJIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDE1IgojIFNlcmlhbDogMAojIE1ENSBGaW5nZXJwcmludDogY2E6ZmY6ZTI6ZGI6MDM6ZDk6Y2I6NGI6ZTk6MGY6YWQ6ODQ6ZmQ6N2I6MTg6Y2UKIyBTSEExIEZpbmdlcnByaW50OiAwMTowYzowNjo5NTphNjo5ODoxOToxNDpmZjpiZjo1ZjpjNjpiMDpiNjo5NTplYToyOTplOToxMjphNgojIFNIQTI1NiBGaW5nZXJwcmludDogYTA6NDA6OTI6OWE6MDI6Y2U6NTM6YjQ6YWM6ZjQ6ZjI6ZmY6YzY6OTg6MWM6ZTQ6NDk6NmY6NzU6NWU6NmQ6NDU6ZmU6MGI6MmE6Njk6MmI6Y2Q6NTI6NTI6M2Y6MzYKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUdDekNDQS9PZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBRENCcGpFTE1Ba0dBMVVFQmhNQ1IxSXgKRHpBTkJnTlZCQWNUQmtGMGFHVnVjekZFTUVJR0ExVUVDaE03U0dWc2JHVnVhV01nUVdOaFpHVnRhV01nWVc1awpJRkpsYzJWaGNtTm9JRWx1YzNScGRIVjBhVzl1Y3lCRFpYSjBMaUJCZFhSb2IzSnBkSGt4UURBK0JnTlZCQU1UCk4waGxiR3hsYm1saklFRmpZV1JsYldsaklHRnVaQ0JTWlhObFlYSmphQ0JKYm5OMGFYUjFkR2x2Ym5NZ1VtOXYKZEVOQklESXdNVFV3SGhjTk1UVXdOekEzTVRBeE1USXhXaGNOTkRBd05qTXdNVEF4TVRJeFdqQ0JwakVMTUFrRwpBMVVFQmhNQ1IxSXhEekFOQmdOVkJBY1RCa0YwYUdWdWN6RkVNRUlHQTFVRUNoTTdTR1ZzYkdWdWFXTWdRV05oClpHVnRhV01nWVc1a0lGSmxjMlZoY21Ob0lFbHVjM1JwZEhWMGFXOXVjeUJEWlhKMExpQkJkWFJvYjNKcGRIa3gKUURBK0JnTlZCQU1UTjBobGJHeGxibWxqSUVGallXUmxiV2xqSUdGdVpDQlNaWE5sWVhKamFDQkpibk4wYVhSMQpkR2x2Ym5NZ1VtOXZkRU5CSURJd01UVXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDCkFRREMrS2svRzRuOFBEd0VYVDJRTnJDUk9uazhabHJ2YlRrQlNScTB0ODkvVFNOVHQ1QUE0eE1xS0tZeDhaRUEKNHlqc3JpRkJ6aC9hL1gwU1d3R0REN213WDVuaDhoS0RnRTBHUHQrc3IrZWhpR3N4ci9DTDBCZ3p1TnRGYWpUMApBb0FrS0FvQ0ZaVmVkaW9ObVRvVVcvYkx5MU84RTAwQmlEZVVKUnRDdkNMWWpxT1dYanJaTXRzKzZQQVFaZTEwCjRTK25mSzhuTkxzcGZadTJ6d25JNWRNSy9JaGxaWFFLM0hNY1hNMUFzUnpVdG9TTVRGRFBhSTZvV2E3Q0owNkMKb2pYZEZQUWYvN0ozMVljdnFtNTlKQ2ZueHNzbTV1WCtad2RqMkVVTjNUcFpaVGxZZXBLWmNqMmNoRjZJSWJqVgo5Q3o4MlhCU1QzaTR2VHdyaTVXWTliUFJhTThnRkg1TVhGL25pK1gxTllFWk45Y1JDTGRtdnROS3pvTlhBRHJECmdmZ1h5NUkyWGRHajJIVWI0WXNuNm5wSVFmMUZHUWF0SjVsT3dYQkgzYldmZ1ZNUzViR01TRjB4UXhmampNWjYKWTVaTEtUQk9oRTVpR1Y0OHpwZVFwWDhCNjUzZytJdUozU1dZUFpLMmZ1L1o4VkZSZlMwbXlHbFpZZUNzYXJncQpOaEVFZWxDOU1vUytMOXh5MWRjZEZrZmtSMllnUC9TV3hhK09BWHFsRDNwazlRMFloOW11aU5YNmhNRTZ3R2tvCkxmSU5hRkdxNDZWM3hxU1FEcUUzaXpFalI4RUpDT3R1OTNpYjE0TDhoQ0NaU1JtMkVrYXgrMFZWRnFtalpheWMKQncvcWE5d2ZMZ1p5N0lhSUV1UXQyMThGTCtUd0E5TW1NK2VBd3MxQ29SYzBDd0lEQVFBQm8wSXdRREFQQmdOVgpIUk1CQWY4RUJUQURBUUgvTUE0R0ExVWREd0VCL3dRRUF3SUJCakFkQmdOVkhRNEVGZ1FVY1JWbnlNakp2WFZkCmN0QTRHR3FkODNFa1ZBc3dEUVlKS29aSWh2Y05BUUVMQlFBRGdnSUJBSFc3YlZSTHFoQllSalR5WXRjV05sMEkKWHRWc3lJZTl0QzVHOGpINGZPcEN0Wk1XVmR5aERCS2cybUYrRDFoWWMyUnl4K2hGanR5cDhpWS94bm1Nc1ZNSQpNNEd3VmhPKzVsRmMySnNLVDB1Y1ZsTUM2VS8yRFdEcVRVSlY2SHdiSVNIVEd6ck1kL0s0a1BGb3gvbGEvdm90CjlML0o5VVViempnUUtqZUtlYU8wNHdsc2hZYVQvNG1XSjNpQmoyZmpSblJVanRrTmFlSks5RTEwQS8reWQrMlYKWjVma3NjV3J2Mm9qNk5TVTRrUW9Zc1JMNHZEWTRpbHJHbkIrSkdHVGUwOERNaVVOUlNRcmxyUkdhcjlLQy9lYQpqOEdzR3NWbjgyODAwdnB6WTR6dkZyQ29wRVlxK09zUzdISzA3L2dyZm94U3dJdUVWUGt2UHVOVnFOeG1zZG5oClg5aXpqRmswV2FTclQyeTdIeGpiZGF2WXk1TE5sRGhoRGdjR0gwdEdFUEVWdm8yRlhEdEtLNEY1RDdScG4wbFEKbDAzM0RsWmR3SlZxd2piREcyako5U3JjUjVxK3NzN0ZKZWo2QTduYStSWnVrWVQxSENqSS9DYk0xeHlRVnFkZgpiem9Fdk0xNGlRdU9EeStqcWsraUd4STlGZ2hBRC9GR1ROZXFld2pCQ3ZWdEo5NENqOHJEdFN2SzZldklJVk00CnBjdzcySGMzTUtKUDJXL1I4a0N0UVhvWHhkWktOWW0zUWRWOGhuOVZUWU5LcFhNZ3dEcXZrUEdhSkk3WmpuSEsKZTdpRzJyS1BtVDRkRXcwU0VlN1VxL0RwRlhZQzVPRGZxaUFlVzJHRlpFQ3BrSmNOclZQU1doMkhhZ0NYWldLMAp2bTlxcC9Vc1F1MHlyYllobnI2OAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBFQ0MgUm9vdENBIDIwMTUgTz1IZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENlcnQuIEF1dGhvcml0eQojIFN1YmplY3Q6IENOPUhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgRUNDIFJvb3RDQSAyMDE1IE89SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkKIyBMYWJlbDogIkhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgRUNDIFJvb3RDQSAyMDE1IgojIFNlcmlhbDogMAojIE1ENSBGaW5nZXJwcmludDogODE6ZTU6YjQ6MTc6ZWI6YzI6ZjU6ZTE6NGI6MGQ6NDE6N2I6NDk6OTI6ZmU6ZWYKIyBTSEExIEZpbmdlcnByaW50OiA5ZjpmMTo3MTo4ZDo5MjpkNTo5YTpmMzo3ZDo3NDo5NzpiNDpiYzo2Zjo4NDo2ODowYjpiYTpiNjo2NgojIFNIQTI1NiBGaW5nZXJwcmludDogNDQ6YjU6NDU6YWE6OGE6MjU6ZTY6NWE6NzM6Y2E6MTU6ZGM6Mjc6ZmM6MzY6ZDI6NGM6MWM6Yjk6OTU6M2E6MDY6NjU6Mzk6YjE6MTU6ODI6ZGM6NDg6N2I6NDg6MzMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN3ekNDQWtxZ0F3SUJBZ0lCQURBS0JnZ3Foa2pPUFFRREFqQ0JxakVMTUFrR0ExVUVCaE1DUjFJeER6QU4KQmdOVkJBY1RCa0YwYUdWdWN6RkVNRUlHQTFVRUNoTTdTR1ZzYkdWdWFXTWdRV05oWkdWdGFXTWdZVzVrSUZKbApjMlZoY21Ob0lFbHVjM1JwZEhWMGFXOXVjeUJEWlhKMExpQkJkWFJvYjNKcGRIa3hSREJDQmdOVkJBTVRPMGhsCmJHeGxibWxqSUVGallXUmxiV2xqSUdGdVpDQlNaWE5sWVhKamFDQkpibk4wYVhSMWRHbHZibk1nUlVORElGSnYKYjNSRFFTQXlNREUxTUI0WERURTFNRGN3TnpFd016Y3hNbG9YRFRRd01EWXpNREV3TXpjeE1sb3dnYW94Q3pBSgpCZ05WQkFZVEFrZFNNUTh3RFFZRFZRUUhFd1pCZEdobGJuTXhSREJDQmdOVkJBb1RPMGhsYkd4bGJtbGpJRUZqCllXUmxiV2xqSUdGdVpDQlNaWE5sWVhKamFDQkpibk4wYVhSMWRHbHZibk1nUTJWeWRDNGdRWFYwYUc5eWFYUjUKTVVRd1FnWURWUVFERXp0SVpXeHNaVzVwWXlCQlkyRmtaVzFwWXlCaGJtUWdVbVZ6WldGeVkyZ2dTVzV6ZEdsMApkWFJwYjI1eklFVkRReUJTYjI5MFEwRWdNakF4TlRCMk1CQUdCeXFHU000OUFnRUdCU3VCQkFBaUEySUFCSktnClFlaExnb1JjNHZneEVabUdaRTRKSlMrZFFTOEtyalZQZEpXeVVXUnJqV3ZtUDNDVjhBVkVSNlp5T0ZCMmxRSmEKanE0b252a3RUcG52TEVodlRDVXA2TkZ4Vzk4ZHdYVTN0TmY2ZTNwQ25Hb0tWbHA4YVF1cWdBa2tiSDdCUnFOQwpNRUF3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVkhROEJBZjhFQkFNQ0FRWXdIUVlEVlIwT0JCWUVGTFFpCkM0S1pKQUVPbkx2a0R2Mi8rNWNnazVrcU1Bb0dDQ3FHU000OUJBTUNBMmNBTUdRQ01HZk9GbUk0b3F4aVJhZXAKbFNUQUdpZWNNanZBd05XNnFlZjRCRU5UaGU1U0lkNmQ5U1dEUHA1WVN5L1haeE1PSVFJd0JlRjFBZDVvN1NvZgpUVXdKQ0Ezc1M2MWtGeWpuZGM1RlpYSWhGOHNpUVE2TUU1ZzRtbFJ0bThyaWZPb0NXQ0tSCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1DZXJ0cGx1cyBSb290IENBIEcxIE89Q2VydHBsdXMKIyBTdWJqZWN0OiBDTj1DZXJ0cGx1cyBSb290IENBIEcxIE89Q2VydHBsdXMKIyBMYWJlbDogIkNlcnRwbHVzIFJvb3QgQ0EgRzEiCiMgU2VyaWFsOiAxNDkxOTExNTY1Nzc5ODk4MzU2NzA5NzMxMTc2OTY1NjE1NTY0NjM3NzEzCiMgTUQ1IEZpbmdlcnByaW50OiA3ZjowOTo5YzpmNzpkOTpiOTo1Yzo2OTo2OTo1NjpkNTozNzozZToxNDowZDo0MgojIFNIQTEgRmluZ2VycHJpbnQ6IDIyOmZkOmQwOmI3OmZkOmEyOjRlOjBkOmFjOjQ5OjJjOmEwOmFjOmE2OjdiOjZhOjFmOmUzOmY3OjY2CiMgU0hBMjU2IEZpbmdlcnByaW50OiAxNToyYTo0MDoyYjpmYzpkZjoyYzpkNTo0ODowNTo0ZDoyMjo3NTpiMzo5Yzo3ZjpjYTozZTpjMDo5Nzo4MDo3ODpiMDpmMDplYTo3NjplNTo2MTphNjpjNzo0MzozZQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmF6Q0NBMU9nQXdJQkFnSVNFU0JWZytRdFBsUldoUzJETjdjczNFWVJNQTBHQ1NxR1NJYjNEUUVCRFFVQQpNRDR4Q3pBSkJnTlZCQVlUQWtaU01SRXdEd1lEVlFRS0RBaERaWEowY0d4MWN6RWNNQm9HQTFVRUF3d1RRMlZ5CmRIQnNkWE1nVW05dmRDQkRRU0JITVRBZUZ3MHhOREExTWpZd01EQXdNREJhRncwek9EQXhNVFV3TURBd01EQmEKTUQ0eEN6QUpCZ05WQkFZVEFrWlNNUkV3RHdZRFZRUUtEQWhEWlhKMGNHeDFjekVjTUJvR0ExVUVBd3dUUTJWeQpkSEJzZFhNZ1VtOXZkQ0JEUVNCSE1UQ0NBaUl3RFFZSktvWklodmNOQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCCkFOcFFoN2JhdUtrK25XVDZWak9hVmowVzVRT1ZzalFjbW0xaUJkVFlqK2VKWkorNjIyU0xaT1o1S21ITnI0OWEKaVpGbHVWajh0QU5ma1Q4dEVCWGdmcys4L0g5RFo2aXRYallqMkppelRmTkRuamw4S3Z6c2lOV0k3bkM5aFJZdAo2a3VKUEtOeFF2NGMvZE1jTFJDNGhsVHFRN2pieG9mYXFLNkFKYzk2SmgycWtiQkliNjYxM3A3WTEvb0EvY2FQCjBGRzdZbjJrc1l5eS95QVJ1alZqQllaSFlFTXprUFpIb2dOUGxrMmRUOEhxNnB5aS9qUXUzcmZLRzNha3Q2MmYKNmFqVWVEOTQvdkk0Q1RZZDBoWUN5T3dxYUsvMWpwVHZMUk42SGtKS0hSVXhyZ3dFVi94aGMvTXhWb1l4Z0tERQpFVzR3ZHVPVThGOEV4S3lIY29tWXhaM01Wd2lhOUF6OGZYb0ZPdnBIZ0RtMno0UVRkMjhuNnYrV1p4Y0liZWtOCjFpTlFNTEFWZEJNKzVTLy9EczNFQzBwZDhOZ0FNMGxtNjZFWWZGa3VQU2k1WVhITHRhVzZ1T3JjNG5CdkNHcmMKaDJjMDc5OHdjdDN6eVQ4ai96WGh2aUVwSURDQjVCbWxJT2tseW5NeGRDbSs0a0xWODdJbVpzZG8vUm16NXlDVAptZWhkNEY2SDUwYm9KWndLS1NUVXpWaUdVa0Frc25zUG1CSWdKUGFRYkVmSURic1lJQzdaL2Z5TDhpbnFoM1NWCjRFSlFlSVFFUVdHdzlDRWpqeTNMS0NIeWFtejBHcWJGRkxRM1pVK1YvWURJK0hMbEpXdkVZTEY3Ylk1S2luUE8KV2Z0d2VuTUdFOW5UZERja1FRb1JiNWZjNStSK29iMFY4cnFIRHoxb2loWUhBZ01CQUFHall6QmhNQTRHQTFVZApEd0VCL3dRRUF3SUJCakFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVdCQlNvd2NDYmthaERGWHhkCkJpZTBLbEhZbHd1QnNUQWZCZ05WSFNNRUdEQVdnQlNvd2NDYmthaERGWHhkQmllMEtsSFlsd3VCc1RBTkJna3EKaGtpRzl3MEJBUTBGQUFPQ0FnRUFuRlp2QVg3UnZVejFpc2J3SmgvazREZ1l6RExES1R1ZFFTazBZY2JYOEFDaAo2NlJ5ajVRWHZCTXNkYlJYN2dwOENYcmMxY3FoMERRVCtIZXJuK1grMkI1MGlvVUhqMy9NZVhyS2xzM04vVS83Ci9TTU5rUFgwWHRQR1lYMmVFZUFDN2drRTJRZmRwb3EzRElNa3U0TlFrdjVnZFJFKzJKMndpbnExNEoyYnk1QlMKUzdDVEt0UStGalBsbnNabEZUNWtPd1EvMnd5UFgxd2RhUit2OCtraGpQUHZsL2FhdHhtMmhIU2NvMVMxY0U1agoyRmRkVXlHYlFKSkQrdFozVlROUFpOWDcwQ3hxam0wbHB1K0Y2QUxFVXo2NW5vZTh6RFVhM3FIcGltT0haUjRSCkt0dGpkNWNVdnBvVW1SR3l3TzZ3VC9nVUlUSkRUNStyb3N1b0Q2bzdCbFhHRWlsWENOUTMxNGNuclVsWnA1R3IKUkhwZWpYRGJsODVJVUxGemsvYndnMkQ1emZIaE1mMWJmSEVoWXhRVXFxL0YzcE4rYUxIc0lxS3FrSFdldFVOeQo2bVNqaEV2OURLZ21hM0dYN2xaalp1aENWUG5ISGQvUWoxdmZ5REJ2aVA0TnhETWNVNmlqL1VnUTh1UUtUdUVWClYveHVaRERDVlJIYzZxbk5TbFNzS1dORXowcEFvTlpvV1JzeitlODZpOXNna3R4Q2hMOEJxNGZBMVNDQzI4YTUKZzRWQ1hBOURPMnBKTmRXWTlCVy8rbUdCREFrZ0dOTFFGd3pMU0FCUTZYYUNqR1RYT3FBSFZjd2VNY0R2T3JSbAorK08vUW11ZUQ2aTlhNWpjMk52TGk2VGQxMW4wYnQzK3FzT1IwQzVDQjhBTVRWUE5KTEZNV3g1UjlOL3Brdm89Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1DZXJ0cGx1cyBSb290IENBIEcyIE89Q2VydHBsdXMKIyBTdWJqZWN0OiBDTj1DZXJ0cGx1cyBSb290IENBIEcyIE89Q2VydHBsdXMKIyBMYWJlbDogIkNlcnRwbHVzIFJvb3QgQ0EgRzIiCiMgU2VyaWFsOiAxNDkyMDg3MDk2MTMxNTM2ODQ0MjA5NTYzNTA5MjI4OTUxODc1ODYxNTg5CiMgTUQ1IEZpbmdlcnByaW50OiBhNzplZTpjNDo3ODoyZDoxYjplZToyZDpiOToyOTpjZTpkNjphNzo5NjozMjozMQojIFNIQTEgRmluZ2VycHJpbnQ6IDRmOjY1OjhlOjFmOmU5OjA2OmQ4OjI4OjAyOmU5OjU0OjQ3OjQxOmM5OjU0OjI1OjVkOjY5OmNjOjFhCiMgU0hBMjU2IEZpbmdlcnByaW50OiA2YzpjMDo1MDo0MTplNjo0NDo1ZTo3NDo2OTo2Yzo0YzpmYjpjOTpmODowZjo1NDozYjo3ZTphYjpiYjo0NDpiNDpjZTo2Zjo3ODo3Yzo2YTo5OTo3MTpjNDoyZjoxNwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ0hEQ0NBYUtnQXdJQkFnSVNFU0Raa2M2dW8rakY1Ly9wQXEvUGM3eFZNQW9HQ0NxR1NNNDlCQU1ETUQ0eApDekFKQmdOVkJBWVRBa1pTTVJFd0R3WURWUVFLREFoRFpYSjBjR3gxY3pFY01Cb0dBMVVFQXd3VFEyVnlkSEJzCmRYTWdVbTl2ZENCRFFTQkhNakFlRncweE5EQTFNall3TURBd01EQmFGdzB6T0RBeE1UVXdNREF3TURCYU1ENHgKQ3pBSkJnTlZCQVlUQWtaU01SRXdEd1lEVlFRS0RBaERaWEowY0d4MWN6RWNNQm9HQTFVRUF3d1RRMlZ5ZEhCcwpkWE1nVW05dmRDQkRRU0JITWpCMk1CQUdCeXFHU000OUFnRUdCU3VCQkFBaUEySUFCTTBQVzFhQzMvQkZHdGF0CjkzbndIY21zbHRhZVRwd2Z0RUlSeW9hL2JmdUZvOFhsR1Z6WDdxWS9hV2ZZZU9LbXljVGJMWGt1NTR1TkFtOHgKSWswRzQyQnlSWjBPUW5lZXpzL2xmNFdiR09UOHpDNXkweGFUVHNxWlkxeWhCU3BzQnFOak1HRXdEZ1lEVlIwUApBUUgvQkFRREFnRUdNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdIUVlEVlIwT0JCWUVGTnFEWXdKNWp0cE14andqCkZOaVB3eUNyS0dCWk1COEdBMVVkSXdRWU1CYUFGTnFEWXdKNWp0cE14andqRk5pUHd5Q3JLR0JaTUFvR0NDcUcKU000OUJBTURBMmdBTUdVQ01IRCtzQXZaOTRPWDdQTlZIZFRjc3dZTy9qT1luWXM1a0d1VUllMjIxMTNXVE5jaApwK2UvSVE4cnpmY3EzSVVIblFJeEFJWVVGdVhjc0dYQ3dJNFVuNzhrRm1qbHZQbDVhZHl0UlN2M3RqRnp6QWFsClU1T1JHcE91Y0dwbnV0ZWU1V0VhWHc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049T3BlblRydXN0IFJvb3QgQ0EgRzEgTz1PcGVuVHJ1c3QKIyBTdWJqZWN0OiBDTj1PcGVuVHJ1c3QgUm9vdCBDQSBHMSBPPU9wZW5UcnVzdAojIExhYmVsOiAiT3BlblRydXN0IFJvb3QgQ0EgRzEiCiMgU2VyaWFsOiAxNDkyMDM2NTc3ODExOTQ3MDEzNzcwNDAwMTI3MDM0ODI1MTc4ODQ0Nzc1CiMgTUQ1IEZpbmdlcnByaW50OiA3NjowMDpjYzo4MToyOTpjZDo1NTo1ZTo4ODo2YTo3YToyZTpmNzo0ZDozOTpkYQojIFNIQTEgRmluZ2VycHJpbnQ6IDc5OjkxOmU4OjM0OmY3OmUyOmVlOmRkOjA4Ojk1OjAxOjUyOmU5OjU1OjJkOjE0OmU5OjU4OmQ1OjdlCiMgU0hBMjU2IEZpbmdlcnByaW50OiA1NjpjNzo3MToyODpkOTo4YzoxODpkOToxYjo0YzpmZDpmZjpiYzoyNTplZTo5MTowMzpkNDo3NTo4ZTphMjphYjphZDo4Mjo2YTo5MDpmMzo0NTo3ZDo0NjowZTpiNAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmJ6Q0NBMWVnQXdJQkFnSVNFU0N6a0ZVNWZYODJiV1RDcDU5clk0NW5NQTBHQ1NxR1NJYjNEUUVCQ3dVQQpNRUF4Q3pBSkJnTlZCQVlUQWtaU01SSXdFQVlEVlFRS0RBbFBjR1Z1VkhKMWMzUXhIVEFiQmdOVkJBTU1GRTl3ClpXNVVjblZ6ZENCU2IyOTBJRU5CSUVjeE1CNFhEVEUwTURVeU5qQTRORFUxTUZvWERUTTRNREV4TlRBd01EQXcKTUZvd1FERUxNQWtHQTFVRUJoTUNSbEl4RWpBUUJnTlZCQW9NQ1U5d1pXNVVjblZ6ZERFZE1Cc0dBMVVFQXd3VQpUM0JsYmxSeWRYTjBJRkp2YjNRZ1EwRWdSekV3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLCkFvSUNBUUQ0ZVViYWxzVXdYb3B4QXkxd3BMdXd4UWpjemVZMXdJQ2tFUzNkNW9ldVhUMlIwb2RzTjdmYVlwNmIKd2lUWGovSGJwcWJmUm05UnBuSExQaHN4WjJMM0VWczBKOVY1VG95YldMMGlFQTFjSnd6ZE1PV28wMTBoT0hRWAovdU1mdGs4N2F5M2JmV0FmakgxTUJjTHJBUllWbUJTTzBaQjNJai9zd2ptNGVUcndTU1RpbFpIY1lUU1NqRlIwCjc3RjlqQUhpT0gzQlgycGZKTEtPWWhldGVTQ3RxeDIzNExTV1NFOW1ReEFHRmlRRDRlQ2Nqc1pHVDQ0YW1lR1AKdVk0emJHbmVXSzJnRHFka1ZCRnBSR1pQVEJLbmppeDl4TlJieFFBME1NSFptZjR5emdlRXRFN05DdjgyVFdMeApwMk5YNU50cXA2Ni9LN25KNXJJbmllVittaHhOYU1iQkdONHpLMUZHU3h5Tzl6ME0rWW8wRk1UN016VWo4Y3p4CktzZWx1N0NpenY1VGEwMUJHMllvc3BiNnA2NEtUcms1TTBTY2RNR1RIUGpnbmlRbFEvR2JJNEtxM3l3Z3NOdzIKVGdPemZBTFU1bnNhcW9jVHZ6NmhkTHViRHVIQWs1L1hwR2JLdXhzNzR6RDBNMW1LQjNJRFZlZHphZ014Ym0rVwpHK09pbjYrU3grMzFRcmNsVERzVEJNOGNscThjSXFQUXF3V3lUQklqVXR6OUdWc25uQjQ3ZXYxQ0k5c2pnQlB3CnZGRVZWSlNtZHo3UWRGRzlVUlFJT1RmTEh6U3BNSjFTaEM1VmtMRzYzMVVBQzloV0xiRkpTWEtBcVdMWHdQWVkKRVFSVnpYUjd6MkZ3ZWZSN0xGeGNrdnpsdUZxclRKT1ZvU2Z1cGI3UGNTTkN1cHQyTFFJREFRQUJvMk13WVRBTwpCZ05WSFE4QkFmOEVCQU1DQVFZd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVWwwWWhWeUUxCjJqWlZ4L1B4TjNEbENQYVRLYll3SHdZRFZSMGpCQmd3Rm9BVWwwWWhWeUUxMmpaVngvUHhOM0RsQ1BhVEtiWXcKRFFZSktvWklodmNOQVFFTEJRQURnZ0lCQUIzZEFtQjg0RFduNXBoNzZrVE9aMEJQOHBOdVp0UTVpU2FzMDAwRQpQTHVISVQ4MzlIRWwya3U2cTVhQ2daRzI3ZG14cEdXWDRtOWtXYVNXN21ES0h5UDdSYnIvanlUd3lxa3hmM2tmCmdMTXRNcnBrWjJDdnVWbk4zNXBKMDZpQ3NmbVlsSXJNNEx2Z0JCdVpZTEZHWmR3SW9ySkdua1NJNnBOK1Z4YlMKRlhKZkxrdXIxSjFqdU9OSTVmNkVMbGdLbjBNZC9yY1lrb1pEU3c2Y01vWXNZUFhwU09xVjdYQXA4ZFV2L1RXMApWOC9iaFVpWnVjSnZiSS9OZUpXc1pDajlWckREYjhPK1dWTGhYNFNQZ1BMMERUYXRkck9qdGVGa2RqcFkzSDFQClhsWnM1VlZaVjZYZjhZcG1NSXpVVW1JNGQ3UytLTmZLTnNTYkJmRDRGZHZiOGU4MG5SMTRTb2hXWjI1Zy80L0kKaStHT3ZVS3BNd3BaUWhJU0t2cXhuVU9PQlp1WjJtS3RWemF6SGJZTmVTMld1T3Z5REVzTXBaVEdNS2NtR1MzdApUQVpRTVBIOVdEMjVTeGRmR2JScWhGUzBPRTg1b2cyV2FNTW9sUDN0TFI5S2EwT1dMcEFCRVBzNHBvRUwwTDkxCjA5UzV6dkUvYnc0Y0hqZHg1UmlIZFJrL1VMbGVwRVUwcmJESzV1VVRkZzh4RkttT0xaVFcxWVZOY3hWUFMvS3kKUHUxc3ZmME9uV1p6c0QyMDk3K280QkdreEs1MUNVcGpBRWdncHNhZEN3bUt0T0Rtemo3SFBpWTQ2U3ZlcGdoSgpBd1NRaXVtUHYraTJ0Q3FqSTQwY0hMSTVrcWlQQWx4QU9YWFVjMEVDZDk3TjRFT0gxdVM2U3NOc0VuLytLdVlqCjFveHgKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPU9wZW5UcnVzdCBSb290IENBIEcyIE89T3BlblRydXN0CiMgU3ViamVjdDogQ049T3BlblRydXN0IFJvb3QgQ0EgRzIgTz1PcGVuVHJ1c3QKIyBMYWJlbDogIk9wZW5UcnVzdCBSb290IENBIEcyIgojIFNlcmlhbDogMTQ5MjAxMjQ0ODA0MjcwMjA5Njk4Njg3NTk4NzY3NjkzNTU3MzQxNTQ0MQojIE1ENSBGaW5nZXJwcmludDogNTc6MjQ6YjY6NTk6MjQ6NmI6YWU6Yzg6ZmU6MWM6MGM6MjA6ZjI6YzA6NGU6ZWIKIyBTSEExIEZpbmdlcnByaW50OiA3OTo1Zjo4ODo2MDpjNTphYjo3YzozZDo5MjplNjpjYjpmNDo4ZDplMTo0NTpjZDoxMTplZjo2MDowYgojIFNIQTI1NiBGaW5nZXJwcmludDogMjc6OTk6NTg6Mjk6ZmU6NmE6NzU6MTU6YzE6YmY6ZTg6NDg6Zjk6YzQ6NzY6MWQ6YjE6NmM6MjI6NTk6Mjk6MjU6N2I6ZjQ6MGQ6MDg6OTQ6ZjI6OWU6YTg6YmE6ZjIKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZiekNDQTFlZ0F3SUJBZ0lTRVNDaGFSdS92Ym05VXBhUEkraEl2eVlSTUEwR0NTcUdTSWIzRFFFQkRRVUEKTUVBeEN6QUpCZ05WQkFZVEFrWlNNUkl3RUFZRFZRUUtEQWxQY0dWdVZISjFjM1F4SFRBYkJnTlZCQU1NRkU5dwpaVzVVY25WemRDQlNiMjkwSUVOQklFY3lNQjRYRFRFME1EVXlOakF3TURBd01Gb1hEVE00TURFeE5UQXdNREF3Ck1Gb3dRREVMTUFrR0ExVUVCaE1DUmxJeEVqQVFCZ05WQkFvTUNVOXdaVzVVY25WemRERWRNQnNHQTFVRUF3d1UKVDNCbGJsUnlkWE4wSUZKdmIzUWdRMEVnUnpJd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJSwpBb0lDQVFETXRsZWxNNVFRZ1RKVDMyRitEM1k1ejF6Q1UzVWRTWHFXT04yaWMycnhiOTVlb2xxNWNTRytOdG1oCi9MenViS2g4TkJweEd1Z2EyRjhPUkFidHArRHowbUVMNERLaWx0RTQ4TUxhQVJmODVLeFA2TzZKSG5TclQ3OGUKQ2JZMmFsYno0ZTZXaVdZa0J1VE5RanBLM2VDYXNNU0NSYlAreWF0Y2ZEN0o2eGN2REgxdXJxV1B5S3dsQ20vNgoxVVdZMGpVSjlnTkRsUDdadnlDVmVZQ1lpdG1KTmJ0Ukc2UTNmZnlaTzZ2L3Y2d05qME94bVhzV0VINGRiMGZFCkZZOEVsZ2dHUWdUNGhOWWR2SkdtUXI1SjFXcUlQN3d0VWRHZWplQlN6RmZkTlRWWTI3U1BKSWpraTkvY2ExVFMKZ1N1eXpwSkxIQjlHK2gzWWtzdDJaN1VKbVFubHJCY1VWWERHUEtCV0NnT3ozR0laMzhpMU1ILzFQQ1oxRWIzWApHN09IbmdldlpYSGxvTThhcHdrUUhaT0pabHZvUEdJeXRiVTZidW1GQVl1ZVE0eG5jeWhaVyt2ajNDek1wU1p5ClloSzA1cHlEUlBaUnBPTEFlaVJYeWc2bFB6cTFPNHZsZHU1dzVwTGVGbHdvVzVjWko1TCtlcEpVenBNNUNoYUgKdkdPejliR1RYT0J1dDlEcStXSXlpRVQ3dnljb3RqQ1ZYUklvdVpXK2oxTVk1YUlZRnVKV3BMSXNFUFVkTjZiNAp0L2JRV1Z5Sjk4TFZ0WlIwMGRYK0c3Ync1dFllZTlJOHk2amo5Ump6SVI5dTcwMW9CbnN0WFc1RGlhYkErYUMvCmdoN1BVMyswNnl6YlhmWnFmVUFrQlhLSk9BR1R5M0hDT1YwR0VmWnZlUGczRFRtRUp3SURBUUFCbzJNd1lUQU8KQmdOVkhROEJBZjhFQkFNQ0FRWXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QWRCZ05WSFE0RUZnUVVham42UWlMMwo1b2tBVFY1OU00UEx1RzUzaHE4d0h3WURWUjBqQkJnd0ZvQVVham42UWlMMzVva0FUVjU5TTRQTHVHNTNocTh3CkRRWUpLb1pJaHZjTkFRRU5CUUFEZ2dJQkFKakxxMEE4NVRNQ2wzOHRoNmFQMUY1S3I3Z2U1N3R4KzRCa0phbXoKR2o1b1hTY21wN29xNGZCWGd3cGtUeDRpZEJ2cGtGL3dyTS8vVDJoNk9LUVFiQTJ4eDZSM2dCaTJvaWhFZHFjMApuWEdFTDhwWjBrZUltVUVpeVRDWVlXNDlxS2dGYmRFZndGRkVWbjhuTlFMZFhwZ0tRdXN3djQyaG0xR3FPK3FUClJtVEZBSG5lSVd2MlY2Q0cxd1p5N0hCR1M0dHozYUFoZFQ3Y0hjQ1AwMDl6SElYWi9uOWl5SlZ2dHRON2pMcFQKd20rYlJFeDUwQjF3czllZkF2U3lCN0RINWZpdEl3Nm1Wc2twRW5kSTJTOUcvVHZ3L0hSd2txV09PQWdmWkRDMgp0MHY3TnF3UWpxQlNNMk9kQXpWV3hXbTl4aU5hSjVUMnBCTDRMVE04b1ZhbFg5WVo2ZTE4Q0wxM3pTZGt6SlRhClRrWlFoK0Q1d1ZPQUhydXQrMGRTaXh2OW92bmVEaUszUFROWmJOVGU5WlVHTWcxUkdVRmNQazhHOTdrcmdDZjIKbzZwNmZBYmhROE1UT1dJYU5yM2dLQzZVQXVRcExtQlZya0E5c0hTU1h2QWdaSlkvWDBWZGlMV0syZ0tnVzBWVQozamc5Q2NDb1NtVkdGdnlxdjFST1RWdStPRU8zS01xTE02b2FKYm9sWENrdlcwcHVqT290bkNyMkJYYmdkNWVBCmlOMW5FMjhkYUNTTFQ3ZDBnZVgwWUo5NlZkYytOOW9XYXo1M3JLNFljSlVJZVNrRGl2N0JPN00vR2cra08xNGYKV0tHVnlhc3ZjMHJRTFc2YVdROVZHSGd0UEZHbWw0dm11N0p3cWt3UjN2OThLemZVZXRGM05JL24rVUwzUElFTQpTMUlLCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1PcGVuVHJ1c3QgUm9vdCBDQSBHMyBPPU9wZW5UcnVzdAojIFN1YmplY3Q6IENOPU9wZW5UcnVzdCBSb290IENBIEczIE89T3BlblRydXN0CiMgTGFiZWw6ICJPcGVuVHJ1c3QgUm9vdCBDQSBHMyIKIyBTZXJpYWw6IDE0OTIxMDQ5MDgyNzE0ODU2NTMwNzEyMTk5NDE4NjQxNzExNzA0NTU2MTUKIyBNRDUgRmluZ2VycHJpbnQ6IDIxOjM3OmI0OjE3OjE2OjkyOjdiOjY3OjQ2OjcwOmE5Ojk2OmQ3OmE4OjEzOjI0CiMgU0hBMSBGaW5nZXJwcmludDogNmU6MjY6NjQ6ZjM6NTY6YmY6MzQ6NTU6YmY6ZDE6OTM6M2Y6N2M6MDE6ZGU6ZDg6MTM6ZGE6OGE6YTYKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGI3OmMzOjYyOjMxOjcwOjZlOjgxOjA3OjhjOjM2OjdjOmI4Ojk2OjE5OjhmOjFlOjMyOjA4OmRkOjkyOjY5OjQ5OmRkOjhmOjU3OjA5OmE0OjEwOmY3OjViOjYyOjkyCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDSVRDQ0FhYWdBd0lCQWdJU0VTRG0rRXo4SkxDK0JVQ3Myb01iTkdBL01Bb0dDQ3FHU000OUJBTURNRUF4CkN6QUpCZ05WQkFZVEFrWlNNUkl3RUFZRFZRUUtEQWxQY0dWdVZISjFjM1F4SFRBYkJnTlZCQU1NRkU5d1pXNVUKY25WemRDQlNiMjkwSUVOQklFY3pNQjRYRFRFME1EVXlOakF3TURBd01Gb1hEVE00TURFeE5UQXdNREF3TUZvdwpRREVMTUFrR0ExVUVCaE1DUmxJeEVqQVFCZ05WQkFvTUNVOXdaVzVVY25WemRERWRNQnNHQTFVRUF3d1VUM0JsCmJsUnlkWE4wSUZKdmIzUWdRMEVnUnpNd2RqQVFCZ2NxaGtqT1BRSUJCZ1VyZ1FRQUlnTmlBQVJLN2xpdVRjcG0KM2dZNm94SDg0Qmp3Ymh5NkxUQU1pZG5XN3B0emc2a2pGWXd2V1lwYTNSVHFuVmtyUTdjRzdESzJ1dTVCdGExZApvWVhNNmgwVVpxTm5ma2JpbFBQbnRsYWhGVm1oVHplWHVTSWV2UkhyOUxJZlhzTVVtdVhabDVtall6QmhNQTRHCkExVWREd0VCL3dRRUF3SUJCakFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVdCQlJIZDhNVWkySTUKRE1sdjRWQk4wQkJZM0pXSWJUQWZCZ05WSFNNRUdEQVdnQlJIZDhNVWkySTVETWx2NFZCTjBCQlkzSldJYlRBSwpCZ2dxaGtqT1BRUURBd05wQURCbUFqRUFqNmpjbmJvTUJCZjZGZWs5THlrQmw3K0JGak5BazJ6OCtlMkFjRytxCmo5dUV3b3YxTmNvRzNHUnZhQmJoajVHNUFqRUEyRXVseThMUUNHenBHUHRhM1UxZkpBdXdBQ0VsNzQrbkJDWngKNG54cDVWMmErRUVmT3ptVGs1MVY2czJOOGZ2QgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049SVNSRyBSb290IFgxIE89SW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAKIyBTdWJqZWN0OiBDTj1JU1JHIFJvb3QgWDEgTz1JbnRlcm5ldCBTZWN1cml0eSBSZXNlYXJjaCBHcm91cAojIExhYmVsOiAiSVNSRyBSb290IFgxIgojIFNlcmlhbDogMTcyODg2OTI4NjY5NzkwNDc2MDY0NjcwMjQzNTA0MTY5MDYxMTIwCiMgTUQ1IEZpbmdlcnByaW50OiAwYzpkMjpmOTplMDpkYToxNzo3MzplOTplZDo4Njo0ZDphNTplMzo3MDplNzo0ZQojIFNIQTEgRmluZ2VycHJpbnQ6IGNhOmJkOjJhOjc5OmExOjA3OjZhOjMxOmYyOjFkOjI1OjM2OjM1OmNiOjAzOjlkOjQzOjI5OmE1OmU4CiMgU0hBMjU2IEZpbmdlcnByaW50OiA5NjpiYzplYzowNjoyNjo0OTo3NjpmMzo3NDo2MDo3Nzo5YTpjZjoyODpjNTphNzpjZjplODphMzpjMDphYTplMToxYTo4ZjpmYzplZTowNTpjMDpiZDpkZjowODpjNgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmF6Q0NBMU9nQXdJQkFnSVJBSUlRejdEU1FPTlpSR1BndTJPQ2l3QXdEUVlKS29aSWh2Y05BUUVMQlFBdwpUekVMTUFrR0ExVUVCaE1DVlZNeEtUQW5CZ05WQkFvVElFbHVkR1Z5Ym1WMElGTmxZM1Z5YVhSNUlGSmxjMlZoCmNtTm9JRWR5YjNWd01SVXdFd1lEVlFRREV3eEpVMUpISUZKdmIzUWdXREV3SGhjTk1UVXdOakEwTVRFd05ETTQKV2hjTk16VXdOakEwTVRFd05ETTRXakJQTVFzd0NRWURWUVFHRXdKVlV6RXBNQ2NHQTFVRUNoTWdTVzUwWlhKdQpaWFFnVTJWamRYSnBkSGtnVW1WelpXRnlZMmdnUjNKdmRYQXhGVEFUQmdOVkJBTVRERWxUVWtjZ1VtOXZkQ0JZCk1UQ0NBaUl3RFFZSktvWklodmNOQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQUszb0pIUDBGRGZ6bTU0clZ5Z2MKaDc3Y3Q5ODRrSXh1UE9aWG9IajNkY0tpL3ZWcWJ2WUFUeWpiM21pR2JFU1R0ckZqL1JRU2E3OGYwdW94bXlGKwowVE04dWtqMTNYbmZzN2ovRXZFaG1rdkJpb1p4YVVwbVpteVBmanh3djYwcElnYno1TURtZ0s3aVM0KzNtWDZVCkE1L1RSNWQ4bVVnalUrZzRyazhLYjRNdTBVbFhqSUIwdHRvdjBEaU5ld053SVJ0MThqQTgrbyt1M2RwanErc1cKVDhLT0VVdCt6d3ZvLzdWM0x2U3llMHJnVEJJbERIQ05BeW1nNFZNazdCUFo3aG0vRUxOS2pEK0pvMkZSM3F5SApCNVQwWTNIc0x1SnZXNWlCNFlsY05IbHNkdTg3a0dKNTV0dWttaThteGRBUTRRN2UyUkNPRnZ1Mzk2ajN4K1VDCkI1aVBOZ2lWNStJM2xnMDJkWjc3RG5LeEhadThBL2xKQmRpQjNRVzBLdFpCNmF3QmRwVUtEOWpmMWIwU0h6VXYKS0JkczBwakJxQWxrZDI1SE43ck9yRmxlYUoxL2N0YUp4UVpCS1Q1WlB0MG05U1RKRWFkYW8weEFIMGFobWJXbgpPbEZ1aGp1ZWZYS25FZ1Y0V2UwK1VYZ1ZDd09QamRBdkJiSStlMG9jUzNNRkV2ekc2dUJRRTN4RGszU3p5blRuCmpoOEJDTkF3MUZ0eE5yUUh1c0V3TUZ4SXQ0STdtS1o5WUlxaW95bUN6THE5Z3dRYm9vTURRYUhXQmZFYndyYncKcUh5R08wYW9TQ3FJM0hhYWRyOGZhcVU5R1kvck9QTmszc2dyRFFvby8vZmI0aFZDMUNMUUoxM2hlZjRZNTNDSQpyVTdtMllzNnh0MG5VVzcvdkdUMU0wTlBBZ01CQUFHalFqQkFNQTRHQTFVZER3RUIvd1FFQXdJQkJqQVBCZ05WCkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVdCQlI1dEZubWU3Ymw1QUZ6Z0FpSXlCcFk5dW1iYmpBTkJna3EKaGtpRzl3MEJBUXNGQUFPQ0FnRUFWUjlZcWJ5eXFGRFFETEhZR21rZ0p5a0lyR0YxWElwdStJTGxhUy9WOWxaTAp1Ymh6RUZuVElaZCs1MHh4KzdMU1lLMDVxQXZxRnlGV2hmRlFEbG5yenVCWjZickpGZStHblkrRWdQYms2WkdRCjNCZWJZaHRGOEdhVjBueHZ3dW83N3gvUHk5YXVKL0dwc01pdS9YMSttdm9pQk92LzJYL3FrU3Npc1JjT2ovS0sKTkZ0WTJQd0J5VlM1dUNiTWlvZ3ppVXd0aER5QzMrNldWd1c2TEx2M3hMZkhUanVDdmpISUluTnprdEhDZ0tRNQpPUkF6STRKTVBKK0dzbFdZSGI0cGhvd2ltNTdpYXp0WE9vSndUZHdKeDRuTENnZE5iT2hkanNudnpxdkh1N1VyClRrWFdTdEFtek9WeXlnaHFwWlhqRmFIM3BPM0pMRitsKy8rc0tBSXV2dGQ3dStOeGU1QVcwd2RlUmxOOE53ZEMKak5QRWxwelZtYlVxNEpVYWdFaXVURGtIenN4SHBGS1ZLN3E0KzYzU00xTjk1UjFOYmRXaHNjZENiK1pBSnpWYwpveWkzQjQzbmpUT1E1eU9mKzFDY2VXeEcxYlFWczVadWZwc01sanE0VWkwLzFsdmgrd2pDaFA0a3FLT0oycXhxCjRSZ3FzYWhEWVZ2VEg5dzdqWGJ5TGVpTmRkOFhNMnc5VS90N3kwRmYvOXlpMEdFNDRaYTRyRjJMTjlkMTFUUEEKbVJHdW5VSEJjbldFdmdKQlFsOW5KRWlVMFpzbnZnYy91YmhQZ1hSUjRYcTM3WjBqNHI3ZzFTZ0VFend4QTU3ZAplbXlQeGdjWXhuL2VSNDQvS0o0RUJzK2xWRFIzdmV5Sm0ra1hROTliMjEvK2poNVhvczFBblg1aUl0cmVHQ2M9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBPPUZOTVQtUkNNIE9VPUFDIFJBSVogRk5NVC1SQ00KIyBTdWJqZWN0OiBPPUZOTVQtUkNNIE9VPUFDIFJBSVogRk5NVC1SQ00KIyBMYWJlbDogIkFDIFJBSVogRk5NVC1SQ00iCiMgU2VyaWFsOiA0ODU4NzYzMDgyMDY0NDg4MDQ3MDE1NTQ2ODI3NjA1NTQ3NTkKIyBNRDUgRmluZ2VycHJpbnQ6IGUyOjA5OjA0OmI0OmQzOmJkOmQxOmEwOjE0OmZkOjFhOmQyOjQ3OmM0OjU3OjFkCiMgU0hBMSBGaW5nZXJwcmludDogZWM6NTA6MzU6MDc6YjI6MTU6YzQ6OTU6NjI6MTk6ZTI6YTg6OWE6NWI6NDI6OTk6MmM6NGM6MmM6MjAKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGViOmM1OjU3OjBjOjI5OjAxOjhjOjRkOjY3OmIxOmFhOjEyOjdiOmFmOjEyOmY3OjAzOmI0OjYxOjFlOmJjOjE3OmI3OmRhOmI1OjU3OjM4Ojk0OjE3OjliOjkzOmZhCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGZ3pDQ0EydWdBd0lCQWdJUFhaT05NR2MyeUFZZEdzZFVoR2tITUEwR0NTcUdTSWIzRFFFQkN3VUFNRHN4CkN6QUpCZ05WQkFZVEFrVlRNUkV3RHdZRFZRUUtEQWhHVGsxVUxWSkRUVEVaTUJjR0ExVUVDd3dRUVVNZ1VrRkoKV2lCR1RrMVVMVkpEVFRBZUZ3MHdPREV3TWpreE5UVTVOVFphRncwek1EQXhNREV3TURBd01EQmFNRHN4Q3pBSgpCZ05WQkFZVEFrVlRNUkV3RHdZRFZRUUtEQWhHVGsxVUxWSkRUVEVaTUJjR0ExVUVDd3dRUVVNZ1VrRkpXaUJHClRrMVVMVkpEVFRDQ0FpSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUJBTHB4Z0hwTWhtNS8KeUJOdHdNWjlIQUNYanl3TUk3c1Fta0NwR3JlSGlQaWJWbXI3NW51T2k1S09weVZkV1JIYk5pNjNVUmNmcVFnZgpCQmNrV0tvM1NoamY1VG5VVi8zWHdTeVJBWkhpSXRRRHdGajhkMGZzano1MFE3cXNOSTFOT0habmpyREliekF6CldIRmN0UFZyYnRRQlVMZ1RmbXhLbzBuUklCbnV2TUFwR0dXbjN2N3YzUXFRSWVjYVo1SkNFSmhmVHpDOFBoeEYKdEJEWGFFQVV3RUQ2NTNjWGV1WUxqMlZiUE5tYVV0dTF2WjVHenozcmtRVUN3SmF5ZGt4TkVKWTdrdnFjZncrWgozNzRqTlVVZUFseit0YWlibVNYYVh2TWl3em4xNUNvdTA4WWZ4R3lxeFJ4cUFRVktMOUxGd2FnMEpsMW1wZElDCklma1l0d2IxVHBsdnFLdE1VZWpQVUJqRmQ4ZzVDU3hKa2pLWnFMc1hGM213V3NYbW84UlpaVWMxZzE2cDZEVUwKbWJ2a3pTREdtMG9HT2JWby9DSzY3bFdNSzA3cTg3SGovTGFabXRWQytuRk5DTStISG1weGZmblR0T21sY1lGNwp3azVIbHFYMmRvV2pLSS9wZ0c2QlU2VnRYN2hJK2NMNU5xWXVTZis0bHNLTUI3T2JpRmo4NnhzYzNpMXc0cGVTCk1LR0o0N3hWcUNmV1MrMlFyWXY2WXlWWkxhZzEzY3FYTTd6bHpjZWQwZXp2WGc1S2tBWW1ZNjI1MlRVdEI3cDIKWlN5c1Y0OTk5QWVVMTRFQ2xsMmpCMG5WZXRCWCtSdm5VMFoxcXJCNVFzdG9jUWpwWUwwNWFjNzByOE5XUU1ldApVcUlKNUcrR1I0b2Y2eWduWFlNZ3J3VEpiRmFhaTBiMUFnTUJBQUdqZ1lNd2dZQXdEd1lEVlIwVEFRSC9CQVV3CkF3RUIvekFPQmdOVkhROEJBZjhFQkFNQ0FRWXdIUVlEVlIwT0JCWUVGUGQ5eGYzRTZKb2JkMlNuOVIyZ3pMK0gKWUpwdE1ENEdBMVVkSUFRM01EVXdNd1lFVlIwZ0FEQXJNQ2tHQ0NzR0FRVUZCd0lCRmgxb2RIUndPaTh2ZDNkMwpMbU5sY25RdVptNXRkQzVsY3k5a2NHTnpMekFOQmdrcWhraUc5dzBCQVFzRkFBT0NBZ0VBQjVCSzMvTWpUdkRECm5GRmxtNXdpb29vTWhmTnpLV3ROL2dIaXFReGpBYjhFWjZXZG1GLzlBUlA2N0pwaTZZYit0bUxTYmt5VSs4QjEKUlh4bERQaXlOOCtzRDgrTmIva1o5NC9zSHZKd252REt1TyszLzNZM2RsdjJib2p6cjJJeUlwTU5PbXFPRkdZTQpMVk4wVjJVZTFiTGRJNEU3cFdZakoyY0pqK0YzcWtQTlpWRUk3VkZZL3VZNStjdEhoS1FWOFhhN3BPNmtPOFJmCjc3SXpsaEVZdDhsbHZoamhvNlRjK2hqNTA3d1Rtemw2TkxyVFFmdjZNb29xdHl1R0MybURPTDdOaWk0TGNLMk4KSnBMdUh2VUJLd3JaMXBlYmJ1Q29HUnc2SVlzTUhrQ3RBK2ZkWm43MXVTQU5BK2lXK1lKRjFEbmdvQUJkMTVqbQpmWjVuYzhPYUt2ZXJpNkU2Rk84MHZGSU9pWmlhQkVDRUhYNUZhWk5YenV2TytGQjhUeHh1QkVPYitkWTdJeGpwCjZvN1JUVWFOOFR2a2FzcTYreU8zbS9xWkFTbGFXRm90NC9uVWJRNG1yY0Z1Tkx3eStBd0YrbVdqMnpzM2d5THAKMXR4eU0vMWQ4aUM5ZGp3ajJpajMrUnZyV1dUVjNGOXlmaUQ4elltMWtHZE5Zbm8vVHEwZHd6bitldlFvRnQ5Qgo5a2lBQmRjUFVYbXNFS3ZVN0FObTVtcXd1akdTUWtCcXZqclRjdUZxTjFXOHJCMlZ0MmxoOGtPUmRPYWcwd29rClJxRUlyOWJhUlJtVzFGTWRXNFI1OE1EM1IrK0xqOFVHcnAxTVlwMy9SZ1Q0MDhtMkVDVkFkZjRXcXNsS1lJWXYKdXU4d2QrUlU0cmlFbVZpQXFoT0xVVHBQU1BhTHRyTT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUFtYXpvbiBSb290IENBIDEgTz1BbWF6b24KIyBTdWJqZWN0OiBDTj1BbWF6b24gUm9vdCBDQSAxIE89QW1hem9uCiMgTGFiZWw6ICJBbWF6b24gUm9vdCBDQSAxIgojIFNlcmlhbDogMTQzMjY2OTc4OTE2NjU1ODU2ODc4MDM0NzEyMzE3MjMwMDU0NTM4MzY5OTk0CiMgTUQ1IEZpbmdlcnByaW50OiA0MzpjNjpiZjphZTplYzpmZTphZDoyZjoxODpjNjo4ODo2ODozMDpmYzpjODplNgojIFNIQTEgRmluZ2VycHJpbnQ6IDhkOmE3OmY5OjY1OmVjOjVlOmZjOjM3OjkxOjBmOjFjOjZlOjU5OmZkOmMxOmNjOjZhOjZlOmRlOjE2CiMgU0hBMjU2IEZpbmdlcnByaW50OiA4ZTpjZDplNjo4ODo0ZjozZDo4NzpiMToxMjo1YjphMzoxYTpjMzpmYzpiMTozZDo3MDoxNjpkZTo3Zjo1NzpjYzo5MDo0ZjplMTpjYjo5NzpjNjphZTo5ODoxOTo2ZQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRFFUQ0NBaW1nQXdJQkFnSVRCbXlmejVtL2pBbzU0dkI0aWtQbWxqWmJ5akFOQmdrcWhraUc5dzBCQVFzRgpBREE1TVFzd0NRWURWUVFHRXdKVlV6RVBNQTBHQTFVRUNoTUdRVzFoZW05dU1Sa3dGd1lEVlFRREV4QkJiV0Y2CmIyNGdVbTl2ZENCRFFTQXhNQjRYRFRFMU1EVXlOakF3TURBd01Gb1hEVE00TURFeE56QXdNREF3TUZvd09URUwKTUFrR0ExVUVCaE1DVlZNeER6QU5CZ05WQkFvVEJrRnRZWHB2YmpFWk1CY0dBMVVFQXhNUVFXMWhlbTl1SUZKdgpiM1FnUTBFZ01UQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUxKNGdISEtlTlhqCmNhOUhnRkIwZlc3WTE0aDI5SmxvOTFnaFlQbDBoQUV2ckFJdGh0T2dRM3BPc3FUUU5yb0J2bzNiU01nSEZ6Wk0KOU82SUk4Yys2emYxdFJuNFNXaXczdGU1ZGpnZFlaNmsvb0kycGVWS1Z1UkY0Zm45dEJiNmROcWNtelU1TC9xdwpJRkFHYkhyUWdMS20rYS9zUnhtUFVEZ0gzS0tIT1ZqNHV0V3ArVWhuTUpidWxIaGViNG1qVWNBd2htYWhSV2E2ClZPdWp3NUg1U056LzBlZ3dMWDB0ZEhBMTE0Z2s5NTdFV1c2N2M0Y1g4akpHS0xoRCtyY2Rxc3EwOHA4a0RpMUwKOTNGY1htbi82cFVDeXppS3JsQTRiOXY3TFdJYnhjY2VWT0YzNEdmSUQ1eUhJOVkvUUNCL0lJREVnRXcrT3lRbQpqZ1N1YkpySXFnMENBd0VBQWFOQ01FQXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DCkFZWXdIUVlEVlIwT0JCWUVGSVFZeklVMDdMd01sSlF1Q0ZtY3g3SVFUZ29JTUEwR0NTcUdTSWIzRFFFQkN3VUEKQTRJQkFRQ1k4amRhUVpDaEdzVjJVU2dnTmlNT3J1WW91NnI0bEs1SXBEQi9HL3dralV1MHlLR1g5cmJ4ZW5ESQpVNVBNQ0Nqam1DWFBJNlQ1M2lIVGZJVUpyVTZhZFRyQ0MycUplSFpFUnhobGJJMUJqanQvbXN2MHRhZFExd1VzCk4rZ0RTNjNwWWFBQ2J2WHk4TVd5N1Z1MzNQcVVYSGVlRTZWL1VxMlY4dmlUTzk2TFhGdktXbEpiWUs4VTkwdnYKby91ZlFKVnRNVlQ4UXRQSFJoOGpyZGtQU0hDYTJYVjRjZEZ5UXpSMWJsZFp3Z0pjSm1BcHp5TVpGbzZJUTZYVQo1TXNJK3lNUlEraERLWEppb2FsZFhnalVrSzY0Mk00VXd0QlY4b2IyeEpORGQyWmh3TG5vUWRlWGVHQURia3B5CnJxWFJmYm9Rbm9ac0c0cTVXVFA0NjhTUXZ2RzUKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUFtYXpvbiBSb290IENBIDIgTz1BbWF6b24KIyBTdWJqZWN0OiBDTj1BbWF6b24gUm9vdCBDQSAyIE89QW1hem9uCiMgTGFiZWw6ICJBbWF6b24gUm9vdCBDQSAyIgojIFNlcmlhbDogMTQzMjY2OTgyODg1OTYzNTUxODE4MzQ5MTYwNjU4OTI1MDA2OTcwNjUzMjM5CiMgTUQ1IEZpbmdlcnByaW50OiBjODplNTo4ZDpjZTphODo0MjplMjo3YTpjMDoyYTo1Yzo3Yzo5ZToyNjpiZjo2NgojIFNIQTEgRmluZ2VycHJpbnQ6IDVhOjhjOmVmOjQ1OmQ3OmE2Ojk4OjU5Ojc2OjdhOjhjOjhiOjQ0Ojk2OmI1Ojc4OmNmOjQ3OjRiOjFhCiMgU0hBMjU2IEZpbmdlcnByaW50OiAxYjphNTpiMjphYTo4Yzo2NTo0MDoxYTo4Mjo5NjowMToxODpmODowYjplYzo0Zjo2MjozMDo0ZDo4MzpjZTpjNDo3MTozYToxOTpjMzo5YzowMToxZTphNDo2ZDpiNAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRlFUQ0NBeW1nQXdJQkFnSVRCbXlmMHBZMWhwOEtEK1dHZVBoYkpydUtOekFOQmdrcWhraUc5dzBCQVF3RgpBREE1TVFzd0NRWURWUVFHRXdKVlV6RVBNQTBHQTFVRUNoTUdRVzFoZW05dU1Sa3dGd1lEVlFRREV4QkJiV0Y2CmIyNGdVbTl2ZENCRFFTQXlNQjRYRFRFMU1EVXlOakF3TURBd01Gb1hEVFF3TURVeU5qQXdNREF3TUZvd09URUwKTUFrR0ExVUVCaE1DVlZNeER6QU5CZ05WQkFvVEJrRnRZWHB2YmpFWk1CY0dBMVVFQXhNUVFXMWhlbTl1SUZKdgpiM1FnUTBFZ01qQ0NBaUl3RFFZSktvWklodmNOQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQUsyV255MmNTa3hLCmdYbFJtZXlLeTJ0Z1VSTzhUVzBHL0xBSWpkMFpFR3JISmd3MTJNQnZJSVRwbExHYmhRUERXOXRLNk1qNGtIYloKVzAvalRPZ0dOazNNbXF3OURKQXJrdFFHR1dDc04wUjVoWUdDclZvMzRBM01uYVpNVW5icVE1MjNCTkZROWxYZwoxZEttU1lYcE4rbktmcTVjbFUxSW1qK3VJRnB0aUpYWk5MaFNHa09Rc0w5c0JibTJlTGZxME9RNlBCSlRZdjlLCjhudStOUVdwRWpUajgyUjBZaXc5QUVsYUtQNHlSTHVIM1dVbkFuRTcya3IzSDlyTjl5RlZrRThQN0s2QzRaOXIKMlVYVHUvQmZoKzA4TERtRzJqL2U3SEpWNjNtanJkdmRmTEM2SE03ODNrODFkczhQK0hnZmFqWlJSaWRoVyttZQp6L0NpVlgxOEpZcHZMN1RGejRRdUsvME5VUkJzKzE4YnZCdCt4YTQ3bUFFeGt2OExWL1Nhc3JsWDZhdnZEWGJSCjhPNzB6b2FuNEc3cHRHbWgzMm4yTThacExwY1RucVdIc0ZjUWdUZkpVN083Zi9hUzBaelFHUFNTYnRxRFQ2WmoKbVV5bCsxN3ZJV1I2SUY5c1pJVVZ5emZwWWd3TEtoYmNBUzR5Mmo1TDlaNDY5aGRBbE8rZWtRaUcrcjVqcUZvego3TXQwUTVYNWJHbFNOc2NwYi94VkExd2YrNSs5Uit2blNVZVZDMDZKSWdsSjRQVmhIdkcvTG9weWJvQlovMWM2CitYVXlvMDVmN08wb1l0bE5jL0xNZ1JkZzdjM3IzTnVueXNWK0FyM3lWQWhVL2JRdENTd1hWRXFZMFZUaFVXY0kKMHUxdWZtOC8waTJCV1NsbXk1QTVsUkVlZENmKzNldXZBZ01CQUFHalFqQkFNQThHQTFVZEV3RUIvd1FGTUFNQgpBZjh3RGdZRFZSMFBBUUgvQkFRREFnR0dNQjBHQTFVZERnUVdCQlN3RFBCTU1QUUZXQUpJL1RQbFVxOUxoT05tClVqQU5CZ2txaGtpRzl3MEJBUXdGQUFPQ0FnRUFxcWlBanc1NG8rQ2kxTTNtOVpoNk8rb0FBN0NYRHBPOFdxajIKTEl4eWg2bXgvSDl6L1dOeGVLV0hXYzh3NFEwUXNoTmFiWUwxYXVhQW42QUZDMmprUjJ2SGF0KzIvWGN5Y3VVWQorZ24wb0pNc1hkS01kWVYyWlpBTUEzbTNNU05qclhpRENZWm9oTXIvK2M4bW1wSjU1ODFMeGVkaHB4Zkw4NmtTCms1TnJwK2d2VTVMRVlGaXd6QUpSR0Z1RmpXSlpZN2F0dE42YSt5YjNBQ2ZBWFZVM2RKbkpVSC9qV1M1RTR5d2wKN3V4TU1uZTBueHJwUzEwZ3hkcjlISWNXeGtQbzFMc21ta1Z3WHFrTE4xUGlSbnNuL2VCRzhvbTN6RUsyeXlnbQpidG1seVRySVFSTmc5MUNNRmE2eWJSb1ZHbGQ0NXBJcTJXV1FnajlzQXErdUVqb25sallFMXgyaWdHT3BtL0hsCnVyUjhGTEJPeWJFZmRGODQ5bEhxbS9vc29oSFVxUzBuR2tXeHI3Sk9jUTNBV0ViV2FRYkxVOHV6L210QnpVRisKZlV3UGZISjVlbG5OWGtvT3JKdXBtSE41ZkxUMHpMbTRCd3l5ZEZ5NHgyK0lvWkNuOUtyNXYyYzY5Qm9WWWg2MwpuNzQ5c1Ntdlo2RVM4bGdRR1ZNRE1CdTRHb24ybkwyWEE0NmpDZk1kaXlIeHROL2tITkdmWlFJRzZseldFN09FCjc2S2xYSXgzS2Fkb3dHdXVRTktvdE9yTjhJMUxPSndabWhzb1ZMaUprTy9LZFlFK0h2SmtKTWNZcjA3L1I1NEgKOWpWbHBOTUtWdi8xRjJSczc2Z2lKVW1UdHQ4QUY5cFlmbDN1eFJ1dzBkRmZJUkRIK2ZPNkFnb25COFh4MXNmVAo0UHNKWUd3PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049QW1hem9uIFJvb3QgQ0EgMyBPPUFtYXpvbgojIFN1YmplY3Q6IENOPUFtYXpvbiBSb290IENBIDMgTz1BbWF6b24KIyBMYWJlbDogIkFtYXpvbiBSb290IENBIDMiCiMgU2VyaWFsOiAxNDMyNjY5ODY2OTkwOTA3NjYyOTQ3MDA2MzUzODEyMzA5MzQ3ODg2NjU5MzAKIyBNRDUgRmluZ2VycHJpbnQ6IGEwOmQ0OmVmOjBiOmY3OmI1OmQ4OjQ5Ojk1OjJhOmVjOmY1OmM0OmZjOjgxOjg3CiMgU0hBMSBGaW5nZXJwcmludDogMGQ6NDQ6ZGQ6OGM6M2M6OGM6MWE6MWE6NTg6NzU6NjQ6ODE6ZTk6MGY6MmU6MmE6ZmY6YjM6ZDI6NmUKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDE4OmNlOjZjOmZlOjdiOmYxOjRlOjYwOmIyOmUzOjQ3OmI4OmRmOmU4OjY4OmNiOjMxOmQwOjJlOmJiOjNhOmRhOjI3OjE1OjY5OmY1OjAzOjQzOmI0OjZkOmIzOmE0Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlCdGpDQ0FWdWdBd0lCQWdJVEJteWYxWFNYTm1ZL093dWEyZWllZGdQeVNqQUtCZ2dxaGtqT1BRUURBakE1Ck1Rc3dDUVlEVlFRR0V3SlZVekVQTUEwR0ExVUVDaE1HUVcxaGVtOXVNUmt3RndZRFZRUURFeEJCYldGNmIyNGcKVW05dmRDQkRRU0F6TUI0WERURTFNRFV5TmpBd01EQXdNRm9YRFRRd01EVXlOakF3TURBd01Gb3dPVEVMTUFrRwpBMVVFQmhNQ1ZWTXhEekFOQmdOVkJBb1RCa0Z0WVhwdmJqRVpNQmNHQTFVRUF4TVFRVzFoZW05dUlGSnZiM1FnClEwRWdNekJaTUJNR0J5cUdTTTQ5QWdFR0NDcUdTTTQ5QXdFSEEwSUFCQ21YcDhaQmY4QU5tK2dCRzFiRzhsS2wKdWkyeUV1alNMdGY2eWNYWXFtMGZjNEU3TzVock9Yd3pwY1ZPaG82QUYyaGlSVmQ5UkZnZHN6Zmxad2pyWnQ2agpRakJBTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RGdZRFZSMFBBUUgvQkFRREFnR0dNQjBHQTFVZERnUVdCQlNyCnR0dlhCcDQzckRDR0I1Rnd4NXpFR2JGNHdEQUtCZ2dxaGtqT1BRUURBZ05KQURCR0FpRUE0SVdTb3hlM2pma3IKQnFXVHJCcVlhR0Z5K3VHaDBQc2NlR0NtUTVuRnVNUUNJUUNjQXUveGxKeXpsdm5yeGlyNHRpeitPcEFVRnRlTQpZeVJJSE44d2ZkVm9Pdz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1BbWF6b24gUm9vdCBDQSA0IE89QW1hem9uCiMgU3ViamVjdDogQ049QW1hem9uIFJvb3QgQ0EgNCBPPUFtYXpvbgojIExhYmVsOiAiQW1hem9uIFJvb3QgQ0EgNCIKIyBTZXJpYWw6IDE0MzI2Njk4OTc1ODA4MDc2Mzk3NDEwNTIwMDYzMDc2Mzg3Nzg0OTI4NDg3OAojIE1ENSBGaW5nZXJwcmludDogODk6YmM6Mjc6ZDU6ZWI6MTc6OGQ6MDY6NmE6Njk6ZDU6ZmQ6ODk6NDc6YjQ6Y2QKIyBTSEExIEZpbmdlcnByaW50OiBmNjoxMDo4NDowNzpkNjpmODpiYjo2Nzo5ODowYzpjMjplMjo0NDpjMjplYjphZToxYzplZjo2MzpiZQojIFNIQTI1NiBGaW5nZXJwcmludDogZTM6NWQ6Mjg6NDE6OWU6ZDA6MjA6MjU6Y2Y6YTY6OTA6Mzg6Y2Q6NjI6Mzk6NjI6NDU6OGQ6YTU6YzY6OTU6ZmI6ZGU6YTM6YzI6MmI6MGI6ZmI6MjU6ODk6NzA6OTIKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUI4akNDQVhpZ0F3SUJBZ0lUQm15ZjE4RzdFRXdwUStWeGUzc3N5QnJCRGpBS0JnZ3Foa2pPUFFRREF6QTUKTVFzd0NRWURWUVFHRXdKVlV6RVBNQTBHQTFVRUNoTUdRVzFoZW05dU1Sa3dGd1lEVlFRREV4QkJiV0Y2YjI0ZwpVbTl2ZENCRFFTQTBNQjRYRFRFMU1EVXlOakF3TURBd01Gb1hEVFF3TURVeU5qQXdNREF3TUZvd09URUxNQWtHCkExVUVCaE1DVlZNeER6QU5CZ05WQkFvVEJrRnRZWHB2YmpFWk1CY0dBMVVFQXhNUVFXMWhlbTl1SUZKdmIzUWcKUTBFZ05EQjJNQkFHQnlxR1NNNDlBZ0VHQlN1QkJBQWlBMklBQk5LcmlqZFBvMU1OL3NHS2UwdW9lMFpMWTdCaQo5aTBiMndoeElkSUE2R085bWlmNzhEbHVYZW85cGNtQnFxTmJJSmhGWFJiYi9lZ1FiZU9jNE9POVg0Umk4M0JrCk02RExKQzl3dW9paEtxQjErSUd1WWdiRWdkczViaW13SHZvdVhLTkNNRUF3RHdZRFZSMFRBUUgvQkFVd0F3RUIKL3pBT0JnTlZIUThCQWY4RUJBTUNBWVl3SFFZRFZSME9CQllFRk5Qc3h6cGxic3poMm5hYVZ2dWM4NFp0VitXQgpNQW9HQ0NxR1NNNDlCQU1EQTJnQU1HVUNNRHFMSWZHOWZoR3QwTzlZbGkvVzY1MStrSTByejJaVnd5empLS2x3CkNrY084RGRaRXY4dG1aUW9UaXBQTlUweldnSXhBT3AxQUU0N3hEcVVFcEhKV0VhZElSTnlwNGljaXVSTVN0dVcKMUt5TGEydEpFbE16cmRma3ZpVDh0UXAyMUtXOEVBPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUx1eFRydXN0IEdsb2JhbCBSb290IDIgTz1MdXhUcnVzdCBTLkEuCiMgU3ViamVjdDogQ049THV4VHJ1c3QgR2xvYmFsIFJvb3QgMiBPPUx1eFRydXN0IFMuQS4KIyBMYWJlbDogIkx1eFRydXN0IEdsb2JhbCBSb290IDIiCiMgU2VyaWFsOiA1OTkxNDMzODIyNTczNDE0NzEyMzk0MTA1ODM3Njc4ODExMDMwNTgyMjQ4OTUyMQojIE1ENSBGaW5nZXJwcmludDogYjI6ZTE6MDk6MDA6NjE6YWY6Zjc6ZjE6OTE6NmY6YzQ6YWQ6OGQ6NWU6M2I6N2MKIyBTSEExIEZpbmdlcnByaW50OiAxZTowZTo1NjoxOTowYTpkMTo4YjoyNTo5ODpiMjowNDo0NDpmZjo2Njo4YTowNDoxNzo5OTo1ZjozZgojIFNIQTI1NiBGaW5nZXJwcmludDogNTQ6NDU6NWY6NzE6Mjk6YzI6MGI6MTQ6NDc6YzQ6MTg6Zjk6OTc6MTY6OGY6MjQ6YzU6OGY6YzU6MDI6M2I6ZjU6ZGE6NWI6ZTI6ZWI6NmU6MWQ6ZDg6OTA6MmU6ZDUKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZ3ekNDQTZ1Z0F3SUJBZ0lVQ242bTMwdEVudHBxSklXZTVyZ1YweFovdTdFd0RRWUpLb1pJaHZjTkFRRUwKQlFBd1JqRUxNQWtHQTFVRUJoTUNURlV4RmpBVUJnTlZCQW9NRFV4MWVGUnlkWE4wSUZNdVFTNHhIekFkQmdOVgpCQU1NRmt4MWVGUnlkWE4wSUVkc2IySmhiQ0JTYjI5MElESXdIaGNOTVRVd016QTFNVE15TVRVM1doY05NelV3Ck16QTFNVE15TVRVM1dqQkdNUXN3Q1FZRFZRUUdFd0pNVlRFV01CUUdBMVVFQ2d3TlRIVjRWSEoxYzNRZ1V5NUIKTGpFZk1CMEdBMVVFQXd3V1RIVjRWSEoxYzNRZ1IyeHZZbUZzSUZKdmIzUWdNakNDQWlJd0RRWUpLb1pJaHZjTgpBUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUJBTmVGbDc4Um1PbndZb05NUElmNVUybzNDL0lQUElmT2I5d21LYjNGCmlickpnejMzN3NwYnhtMUpjN1RKUnFNYk5CTS93WWxGVi9UWnNmczJaVXY3Q09KSWNSSElianVlbmQrSlpUZW0KaGZZN1JCaTJ4amN3WWtTU2wybDlRakFrNUEwTWlXdGozc1hoMzA2cEZHeFQ0R0hPOWhjdkhUeTk1aUpNSFpQMQpFTVNoZHV4cTNzVnMzNWEwVmtCQ3dHS1NNS0V0RlpTZzBpQUdDVzVxYmVYcnQ3N1U4UEVWZkl2bVRyb1R6RXNuClhwazhGMTJQZ1g4elBVL1RQeHZzWEQvd1BFeDFidkttMVozYUxRZGpBc1p5NlpTOFRFbVZUNGhTeU52b2FZTDQKekRSYkl2Q0dwNG05U0FwdFpvRnR5TWhrK3dIaDlPSGUyWjdkMjF2VUtwa21GUnNlVEpJcGdwN1Zrb0dTUVhBWgo5NlRsazB1OGQyY3gzUno5TVhBTkY1a00rUXc1R1NvWHRUQnhWZFVQcmxqaFBTODBtOCtmOW5pRndwTjZjajVtCmo1d1dFV0NQbm9sdlo3N2dSMW83REpwbmk4OUd4cTQ0by9LbnZPYldoV3N6SkhBaVM4c0ltN3ZJK0FJcEhiNGcKREVhL2E0ZWJzeXBtUWpWR2JLcTZyZm1ZZStsUVZSUXh2N0hhTGUyQXJXZ2srMm1yMkhFVE1PWm5zNGRBL1lsKwo4a1BSRWQ4dlpTOWt6bDhVdWJHL01iMkhlRnBaWllpcS9Ga3lTSWJXVExrcFM1WFRkdk4zSlcxQ0hEaURUZjJqClg1dC9MYXg1R3c1Q01aZGpwUHVLYWRVaURUU1FNQzZvdE9CdHRwU3N2SXRPMTNEOHhUaU9aQ1hoVFRtUXpzbUgKaEZoeEFnTUJBQUdqZ2Fnd2dhVXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QkNCZ05WSFNBRU96QTVNRGNHQnl1QgpLd0VCQVFvd0xEQXFCZ2dyQmdFRkJRY0NBUlllYUhSMGNITTZMeTl5WlhCdmMybDBiM0o1TG14MWVIUnlkWE4wCkxteDFNQTRHQTFVZER3RUIvd1FFQXdJQkJqQWZCZ05WSFNNRUdEQVdnQlQvR0NoMitVZ0ZMS0d1OFNzYks3SlQKK0V0OHN6QWRCZ05WSFE0RUZnUVUveGdvZHZsSUJTeWhydkVyR3l1eVUvaExmTE13RFFZSktvWklodmNOQVFFTApCUUFEZ2dJQkFHb1pGTzF1ZWNFc2g5UU5jSDdYOW5qSkN3Uk94TEhPazNEK3NGVEFNczJaTUdRWHZ3L2w0alA5CkJ6WkFjZzRhdG1wWjFnRGxhQ0RkTG5JTkgycGtNU0NFZlVtbVdqZnJSY21GOWRUSEY1a0g1cHRWNUF6b3FiVE8KakZ1MUVWelBpZzROMXF4M2dmNHluQ1NlY3M1VTg5QnZvbGJXN01NM0xHVll2bGNBR3ZJMSt1dDdNVjNDd1JJOQpsb0dJbG9uQldWeDY1bjl3Tk9lRDRySGg0YmhZNzlTVjVHQ2M4SmFYY296cmhBSXVaWStrdDlKL1o5M0kwNTVjCnFxbWtvQ1VVQnB2c1QzNHRDMzhkZGZFejJPM091SFZ0UGx1NW1CMHhEVmJZUXc4d2tiSUVhOTFXdnBXQVZXZSsKMk0yRDJSanVMZytHTFpLZWNCUHMzbEhKUTNnQ3BVM0krVi9Fa1ZoR0ZuZGFkS3BBdkFlZk1MbXg5eElYM2VQLwpKRUFkZW1yUlR4Z0txcEFkNjBBZTM2RWVSSklRbXZLTjRkRkxScDdvUlVLWDZrV1o4K3htMVFMNjhxWktKS3JlCnpybksrVCtUYi9tanV1cWxQcG10L2Y5N21mVmw3dkJaS0dmWGtKV2tFNFNwaE1Ib3pzNTFrMk1hdkR6cTFXUWYKTFNvU09jYkRXakx0UjVFV0RydzR3VkRlajhvcWtEUWM3a0dVbkY0Wkx2aEZTWmwwa2JBRWIrTUVXckdyS3F2Kwp4OUNXdHRyaFNtUUdibUJOdlVKTy8zamFKTW9idE5lV09XeXU4UTZxcDMxSWl5Qk16MlRXdUpkR3NFN1JLbFk2Cm9KTzlyNEFrNEFwKzU4clZ5dWlGVmR3Mkt1R1VhSlBIWm5KRUQ0QWhNbXdseHlPQWd3cnIKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRpZmlrYXNpIC0gU3VydW0gMSBPPVR1cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmFzdGlybWEgS3VydW11IC0gVFVCSVRBSyBPVT1LYW11IFNlcnRpZmlrYXN5b24gTWVya2V6aSAtIEthbXUgU00KIyBTdWJqZWN0OiBDTj1UVUJJVEFLIEthbXUgU00gU1NMIEtvayBTZXJ0aWZpa2FzaSAtIFN1cnVtIDEgTz1UdXJraXllIEJpbGltc2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklUQUsgT1U9S2FtdSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkgLSBLYW11IFNNCiMgTGFiZWw6ICJUVUJJVEFLIEthbXUgU00gU1NMIEtvayBTZXJ0aWZpa2FzaSAtIFN1cnVtIDEiCiMgU2VyaWFsOiAxCiMgTUQ1IEZpbmdlcnByaW50OiBkYzowMDo4MTpkYzo2OToyZjozZToyZjpiMDozYjpmNjozZDo1YTo5MTo4ZTo0OQojIFNIQTEgRmluZ2VycHJpbnQ6IDMxOjQzOjY0OjliOmVjOmNlOjI3OmVjOmVkOjNhOjNmOjBiOjhmOjBkOmU0OmU4OjkxOmRkOmVlOmNhCiMgU0hBMjU2IEZpbmdlcnByaW50OiA0NjplZDpjMzo2ODo5MDo0NjpkNTozYTo0NTozZjpiMzoxMDo0YTpiODowZDpjYTplYzo2NTo4YjoyNjo2MDplYToxNjoyOTpkZDo3ZTo4Njo3OTo5MDo2NDo4NzoxNgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRVl6Q0NBMHVnQXdJQkFnSUJBVEFOQmdrcWhraUc5dzBCQVFzRkFEQ0IwakVMTUFrR0ExVUVCaE1DVkZJeApHREFXQmdOVkJBY1REMGRsWW5wbElDMGdTMjlqWVdWc2FURkNNRUFHQTFVRUNoTTVWSFZ5YTJsNVpTQkNhV3hwCmJYTmxiQ0IyWlNCVVpXdHViMnh2YW1scklFRnlZWE4wYVhKdFlTQkxkWEoxYlhVZ0xTQlVWVUpKVkVGTE1TMHcKS3dZRFZRUUxFeVJMWVcxMUlGTmxjblJwWm1scllYTjViMjRnVFdWeWEyVjZhU0F0SUV0aGJYVWdVMDB4TmpBMApCZ05WQkFNVExWUlZRa2xVUVVzZ1MyRnRkU0JUVFNCVFUwd2dTMjlySUZObGNuUnBabWxyWVhOcElDMGdVM1Z5CmRXMGdNVEFlRncweE16RXhNalV3T0RJMU5UVmFGdzAwTXpFd01qVXdPREkxTlRWYU1JSFNNUXN3Q1FZRFZRUUcKRXdKVVVqRVlNQllHQTFVRUJ4TVBSMlZpZW1VZ0xTQkxiMk5oWld4cE1VSXdRQVlEVlFRS0V6bFVkWEpyYVhsbApJRUpwYkdsdGMyVnNJSFpsSUZSbGEyNXZiRzlxYVdzZ1FYSmhjM1JwY20xaElFdDFjblZ0ZFNBdElGUlZRa2xVClFVc3hMVEFyQmdOVkJBc1RKRXRoYlhVZ1UyVnlkR2xtYVd0aGMzbHZiaUJOWlhKclpYcHBJQzBnUzJGdGRTQlQKVFRFMk1EUUdBMVVFQXhNdFZGVkNTVlJCU3lCTFlXMTFJRk5OSUZOVFRDQkxiMnNnVTJWeWRHbG1hV3RoYzJrZwpMU0JUZFhKMWJTQXhNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXIzVXdNNnE3CmE5T1pMQkkzaE5tTmU1ZUEwMjduLzV0UWxUNlFsVlpDMXhsOEpvU05rdm9CSFRvUDRtUTR0NHk4NklqNWl5U3IKTHFQMU4rUkFqaGdsZVlOMUh6di9iS2pGeGxiNHRPMktSS09yYkV6OEhkRGM3Mmk5eitTcXp2QlY5NkkwMUlOcgpOM3djd3Y2MUEreFh6cnkwdGNYdEFBOVROeXBOOUU4TWcvdUd6OHYrakU2OWgvbW5peUZYbkhyZkEyZUpMSjJYCllhY1F1RldRZnc0dEp6aDAzK2Y5Mms0UzQwMFZJZ0xJNE9EOEQ2MksxOGxVVU13N0Q4b1dnSVRRVVZiRGpsWi8KaVNJekwrYUZDcjJscUJzMjN0UGNMRzA3eHhPOVdTTXM1dVdrOTlnTDdlcVFRRVNvbGJ1VDFkQ0FOTFpHZUE0ZgpBSk5HNGU3cCtleFBGd0lEQVFBQm8wSXdRREFkQmdOVkhRNEVGZ1FVWlQvSGlvYkdQTjA4VkZ3MStEcnRVZ3hIClY4Z3dEZ1lEVlIwUEFRSC9CQVFEQWdFR01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUwKQlFBRGdnRUJBQ28vNGZFeWpxN2htRnhMWHM5ckhtb0owaUtwRXNkZVYzMXpWbVNBaEhxVDVBbTVFTTJmS2lmaApBSGUrU01nMXFJR2Y1TGdzeVg4T3NOSkxOMTNxdWRVTFhqUzk5SE1wdyswbUZaeCtDRk9LV0kzUVN5amZ3YlBmCklQUDU0K002Mzh5Y2xOaE9UOE5yRjdmM2N1aXRaak8xSlZPcjRQaE1xWjM5OGcyNnJyblpxc1pyK1pPN3JxdTQKbHp3REdycER4cGE1UlhJNHM2ZWhsajJSZTM3QUlWTk1oKzN5QzFTVlVaUFZJcVVOaXZHVERqNVVEckRZeVU3Ywo4akV5VnVwaytlcTFuUlptUW5MemY5T3hNVVA4cEk0WDhXMGpxNVJtK0szN0R3aHVKaTEvRndjSnNvejdVTUNmCmxvM1B0djBBblZvVW1yOENSUFhCd3A4aVhxSVBvZU09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1HRENBIFRydXN0QVVUSCBSNSBST09UIE89R1VBTkcgRE9ORyBDRVJUSUZJQ0FURSBBVVRIT1JJVFkgQ08uLExURC4KIyBTdWJqZWN0OiBDTj1HRENBIFRydXN0QVVUSCBSNSBST09UIE89R1VBTkcgRE9ORyBDRVJUSUZJQ0FURSBBVVRIT1JJVFkgQ08uLExURC4KIyBMYWJlbDogIkdEQ0EgVHJ1c3RBVVRIIFI1IFJPT1QiCiMgU2VyaWFsOiA5MDA5ODk5NjUwNzQwMTIwMTg2CiMgTUQ1IEZpbmdlcnByaW50OiA2MzpjYzpkOTozZDozNDozNTo1Yzo2Zjo1MzphMzplMjowODo3MDo0ODoxZjpiNAojIFNIQTEgRmluZ2VycHJpbnQ6IDBmOjM2OjM4OjViOjgxOjFhOjI1OmMzOjliOjMxOjRlOjgzOmNhOmU5OjM0OjY2OjcwOmNjOjc0OmI0CiMgU0hBMjU2IEZpbmdlcnByaW50OiBiZjpmZjo4ZjpkMDo0NDozMzo0ODo3ZDo2YTo4YTphNjowYzoxYToyOTo3Njo3YTo5ZjpjMjpiYjpiMDo1ZTo0MjowZjo3MTozYToxMzpiOTo5Mjo4OToxZDozODo5MwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmlEQ0NBM0NnQXdJQkFnSUlmUW1YL3ZCSDZub3dEUVlKS29aSWh2Y05BUUVMQlFBd1lqRUxNQWtHQTFVRQpCaE1DUTA0eE1qQXdCZ05WQkFvTUtVZFZRVTVISUVSUFRrY2dRMFZTVkVsR1NVTkJWRVVnUVZWVVNFOVNTVlJaCklFTlBMaXhNVkVRdU1SOHdIUVlEVlFRRERCWkhSRU5CSUZSeWRYTjBRVlZVU0NCU05TQlNUMDlVTUI0WERURTAKTVRFeU5qQTFNVE14TlZvWERUUXdNVEl6TVRFMU5UazFPVm93WWpFTE1Ba0dBMVVFQmhNQ1EwNHhNakF3QmdOVgpCQW9NS1VkVlFVNUhJRVJQVGtjZ1EwVlNWRWxHU1VOQlZFVWdRVlZVU0U5U1NWUlpJRU5QTGl4TVZFUXVNUjh3CkhRWURWUVFEREJaSFJFTkJJRlJ5ZFhOMFFWVlVTQ0JTTlNCU1QwOVVNSUlDSWpBTkJna3Foa2lHOXcwQkFRRUYKQUFPQ0FnOEFNSUlDQ2dLQ0FnRUEyYU1XOE1oMGRIZWI3ek1OT3daK1ZmeTFZSTkyaGhKQ2ZWWm1Qb2lDN1hKagpEcDZMM1RRc0FsRlJ3eG45V1ZTRXlmRnJzMHl3NmVoR1hUakdvcWN1RVZlNmdoV2luSTl0c0psS0N2THJpWEJqClRubkV0MXU5b2wyeDhrRUNLNjJwT3FQc2VRcnNYenJqL2UrQVBLMDBteHFyaUNaN1ZxS0NoaC9yTlltRGYxK3UKS1U0OXRtN3Nyc0h3SjV1dTQvVHM3NjUvOTRZOWNucnJwZnRaVHFmcmxZd2lPWG5oTFFpUHpMeVJ1RUgzRk1FagpxY090bWtWRXM3TFhMTTNHS2VKUUVLNWN5NEtPRnhnMmZaZm1pSnF3VFRRSjlDeTVXbVlxc0JlYm5oNTJuVXBtCk1VSGZQL3ZGQnU4YnRuNGFSamIzWkdNNzR6a1lJK2RuZFJUVmRWZVNONzIrYWhzbVVQSTJKZ2FReFhBQlpHMTIKWnVHUjIyNEh3R0dBTHJJdUw0eHdwOUU3UExPUjVHNjJ4RHR3OG15U2x3bk5SMzBZd1BPN25nL1dpNjRIdGxvUAp6Z3NNUjZmbFByaTlmY2ViTmFCaGx6cEJkUmZNSzVaM0twSWhIdG1WZGlCbmFNOE52ZC9XSHdscW11TE1jM0drCkwzMFNnTGRUTUVaZVMxU1pEMmZKcGNqeUlNR0M3SjBSMzhJQyt4bzcwZTBnbXU5bFpKSVFEU3JpM25EeEdHZUMKakdIZXVMelJMNXo3RDlBcjdSdDJ1ZVE1VmZqNG9SMjRxb0FBVElMbnNuOEp1THd3b0M4TjlWS2VqdmVTc3dvQQpIUUJVbHdiZ3NRZlp4dzljWlgwOGJWbFg1TzJsamVsQVU1OFZTNkJ4OWhvaDQ5cHdCaUZZRkllRmQzbXFnbmtDCkF3RUFBYU5DTUVBd0hRWURWUjBPQkJZRUZPTEpRSjlOenVpYW9YelBEajlseFNtSWFobFJNQThHQTFVZEV3RUIKL3dRRk1BTUJBZjh3RGdZRFZSMFBBUUgvQkFRREFnR0dNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUNBUURSU1ZmZwpwOHhvV0xvQkR5c1p6WTJ3WVVXc0VlMWpVR240SDMrK0ZvLzluZXNMcWpKSGR0Sm5KTzI5ZkRNeWx5ckhCWVptCkRSZDlGQlViMU92OUg1cjJYcGRwdHhvbHBBcXprVDlmTnF5TDdGZW9QdWVCaWhoWE9ZVjBHa0xINlZzVFg0LzUKQ09tU2RJMzFSOUtyTzliN2VHWk9ObjM1NlpMcEJONzlTV1A4YmZzVWNaTm5MMGRLdDduL0hpcHpjRVl3djFyeQpMM21sNFkwTTJmbXlZemVNTjJXRmNHcGNXd2x5dWExalBMSGQrUHd5dnplRzVMdU9tQ2QrdWg4VzRYQVI4Z1BmCkpXSXlKeVlZTW9TZi93QTZFN3FhVGZSUHVCUndJckhLSzVET0tjRnc5QytkZi9LUUh0WmEzN2RHL09hRytzdmcKSUhaNnVxYkw5WHplWXFXeGkrN2VnbWFLVGpvd0h6K0F5NjBudWd4ZTE5Q3hWc3AzY2JLMWRhRlFxVUJERjhJbwoyYzlTaTF2SVk5UkNQcUF6ZWtZdTl3b2dSbFIrYWs4eDhZRitRblE0WlhNbjdzWjh1STdYcFRyWG1LR2NqQkJWCjA5dEw3RUNROHMxdVY5SmlEbnhYazdHbmJjMmRnN3NxNStXMk8zRllyZjNSUmJ4YWtlNVRGVy9UUlFsMWJycVEKWFI0RXp6ZmZIcWhtc1l6bUlHcnYvRWhPZEpoQ3J5bHZMbXJIKzMzUlpqRWl6SVlBZm1hRERFTDB2VFNTd3hycQpUOHArY2swTGNJeW1TTHVtb1JUMisxaEVtUlN1cWd1VGFhQXBKVXFseXl2ZGltWUhGbmdWVjNFYjdQVkhoUE9lCk1UZDYxWDhrcmVTOC9mM01ib1BvREtpM1FXd0gzYjA4aHBjdjBnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVRydXN0Q29yIFJvb3RDZXJ0IENBLTEgTz1UcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4gT1U9VHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5CiMgU3ViamVjdDogQ049VHJ1c3RDb3IgUm9vdENlcnQgQ0EtMSBPPVRydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLiBPVT1UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkKIyBMYWJlbDogIlRydXN0Q29yIFJvb3RDZXJ0IENBLTEiCiMgU2VyaWFsOiAxNTc1MjQ0NDA5NTgxMTAwNjQ4OQojIE1ENSBGaW5nZXJwcmludDogNmU6ODU6ZjE6ZGM6MWE6MDA6ZDM6MjI6ZDU6YjI6YjI6YWM6NmI6Mzc6MDU6NDUKIyBTSEExIEZpbmdlcnByaW50OiBmZjpiZDpjZDplNzo4MjpjODo0Mzo1ZTozYzo2ZjoyNjo4Njo1YzpjYTphODozYTo0NTo1YjpjMzowYQojIFNIQTI1NiBGaW5nZXJwcmludDogZDQ6MGU6OWM6ODY6Y2Q6OGY6ZTQ6Njg6YzE6Nzc6Njk6NTk6ZjQ6OWU6YTc6NzQ6ZmE6NTQ6ODY6ODQ6YjY6YzQ6MDY6ZjM6OTA6OTI6NjE6ZjQ6ZGM6ZTI6NTc6NWMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVNRENDQXhpZ0F3SUJBZ0lKQU5xYjdISHpBN0FaTUEwR0NTcUdTSWIzRFFFQkN3VUFNSUdrTVFzd0NRWUQKVlFRR0V3SlFRVEVQTUEwR0ExVUVDQXdHVUdGdVlXMWhNUlF3RWdZRFZRUUhEQXRRWVc1aGJXRWdRMmwwZVRFawpNQ0lHQTFVRUNnd2JWSEoxYzNSRGIzSWdVM2x6ZEdWdGN5QlRMaUJrWlNCU0xrd3VNU2N3SlFZRFZRUUxEQjVVCmNuVnpkRU52Y2lCRFpYSjBhV1pwWTJGMFpTQkJkWFJvYjNKcGRIa3hIekFkQmdOVkJBTU1GbFJ5ZFhOMFEyOXkKSUZKdmIzUkRaWEowSUVOQkxURXdIaGNOTVRZd01qQTBNVEl6TWpFMldoY05Namt4TWpNeE1UY3lNekUyV2pDQgpwREVMTUFrR0ExVUVCaE1DVUVFeER6QU5CZ05WQkFnTUJsQmhibUZ0WVRFVU1CSUdBMVVFQnd3TFVHRnVZVzFoCklFTnBkSGt4SkRBaUJnTlZCQW9NRzFSeWRYTjBRMjl5SUZONWMzUmxiWE1nVXk0Z1pHVWdVaTVNTGpFbk1DVUcKQTFVRUN3d2VWSEoxYzNSRGIzSWdRMlZ5ZEdsbWFXTmhkR1VnUVhWMGFHOXlhWFI1TVI4d0hRWURWUVFEREJaVQpjblZ6ZEVOdmNpQlNiMjkwUTJWeWRDQkRRUzB4TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCCkNnS0NBUUVBdjQ2M2xlTENKaEpyTXhuSFFGZ0txMW1xalFDai9JREhVSHVPMUNBbXVqSVMyQ05VU1NVUUlwaWQKUnRMQnlaNU9HeTRzRGpqekdpVm9IS1phQmVZZWkwaS9tSlowUG1uSzZiVjRwUWE4MVFCZUNRcnlKM3BTL0MzVgpzZXEwaVdFazh4b1QyNm5QVXUwTUpMcTVudXgrQUhUNms2MXNLWkt1VWJTNzAxZS9zL09valp6MEpFc3ExcG1lCjlKNyt3SDVDT3VjTGxWUGF0MmdPa0V6N2NEK1BTaXlVOHliZFkybXBsTmdRVHNWSENKQ1pHeGROdVd4dTcyQ1YKRVk0aGdMVzlvSFBZMExKM3hFWHFXaWI3Wm5aMitBWWZZVzBQVmNXRHR4QldjZ1lIcGZPeEdnTUZaQTZkV29yVwpobkFiSk43K0tJb3IwR3F3L0hxaTNMSjVEb3RsRHdJREFRQUJvMk13WVRBZEJnTlZIUTRFRmdRVTdtdEpQSG8vCkRlT3hDYmVLeUtzWm4zTXpVT2N3SHdZRFZSMGpCQmd3Rm9BVTdtdEpQSG8vRGVPeENiZUt5S3NabjNNelVPY3cKRHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVkhROEJBZjhFQkFNQ0FZWXdEUVlKS29aSWh2Y05BUUVMQlFBRApnZ0VCQUNVWTFKR1BFKzZQSGgwUlU5b3RSQ2tab0I1ck1aNU5EcDZ0UFZ4QmI1VXJKS0Y1bURvNE52dTdacDVJCi81Q1E3ejNVdUp1MGgzVS9JSnZPY3MraFZjRk5aS0laQnFFSE13d0xLZVh4NnF1ajdMVUtkSkRIZlhMeTExeWYKa2UrUmk3ZmM3V2FpejQ1bU83eWZPZ0xnSjkwV21NQ1YxQXFrNUlHYWRaUTFuSkJmaURjR3JWbVZDckRSWjlNWgp5b25uTWxvMkhENkNxRnFUdnNiUVpKRzJ6OW0yR00vYmZ0SmxvNmJFamhjeHdmdCtkdHZUaGVOWXNuZDZkanRzCkwxQWM1OXYyWjNrZjlZS1ZtZ2VuRksrUDNDZ2had25TMWsxYUhCa2NqbmRjdzVRa1BUSnJTMzdVZUpTRHZqZE4KemwvSEhrNDg0SWt6bFFzUHBUTFdQRnA1TEJrPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049VHJ1c3RDb3IgUm9vdENlcnQgQ0EtMiBPPVRydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLiBPVT1UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkKIyBTdWJqZWN0OiBDTj1UcnVzdENvciBSb290Q2VydCBDQS0yIE89VHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuIE9VPVRydXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eQojIExhYmVsOiAiVHJ1c3RDb3IgUm9vdENlcnQgQ0EtMiIKIyBTZXJpYWw6IDI3MTE2OTQ1MTAxOTkxMDE2OTgKIyBNRDUgRmluZ2VycHJpbnQ6IGEyOmUxOmY4OjE4OjBiOmJhOjQ1OmQ1OmM3OjQxOjJhOmJiOjM3OjUyOjQ1OjY0CiMgU0hBMSBGaW5nZXJwcmludDogYjg6YmU6NmQ6Y2I6NTY6ZjE6NTU6Yjk6NjM6ZDQ6MTI6Y2E6NGU6MDY6MzQ6Yzc6OTQ6YjI6MWM6YzAKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDA3OjUzOmU5OjQwOjM3OjhjOjFiOmQ1OmUzOjgzOjZlOjM5OjVkOmFlOmE1OmNiOjgzOjllOjUwOjQ2OmYxOmJkOjBlOmFlOjE5OjUxOmNmOjEwOmZlOmM3OmM5OjY1Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlHTHpDQ0JCZWdBd0lCQWdJSUphSGZ5alBMV1FJd0RRWUpLb1pJaHZjTkFRRUxCUUF3Z2FReEN6QUpCZ05WCkJBWVRBbEJCTVE4d0RRWURWUVFJREFaUVlXNWhiV0V4RkRBU0JnTlZCQWNNQzFCaGJtRnRZU0JEYVhSNU1TUXcKSWdZRFZRUUtEQnRVY25WemRFTnZjaUJUZVhOMFpXMXpJRk11SUdSbElGSXVUQzR4SnpBbEJnTlZCQXNNSGxSeQpkWE4wUTI5eUlFTmxjblJwWm1sallYUmxJRUYxZEdodmNtbDBlVEVmTUIwR0ExVUVBd3dXVkhKMWMzUkRiM0lnClVtOXZkRU5sY25RZ1EwRXRNakFlRncweE5qQXlNRFF4TWpNeU1qTmFGdzB6TkRFeU16RXhOekkyTXpsYU1JR2sKTVFzd0NRWURWUVFHRXdKUVFURVBNQTBHQTFVRUNBd0dVR0Z1WVcxaE1SUXdFZ1lEVlFRSERBdFFZVzVoYldFZwpRMmwwZVRFa01DSUdBMVVFQ2d3YlZISjFjM1JEYjNJZ1UzbHpkR1Z0Y3lCVExpQmtaU0JTTGt3dU1TY3dKUVlEClZRUUxEQjVVY25WemRFTnZjaUJEWlhKMGFXWnBZMkYwWlNCQmRYUm9iM0pwZEhreEh6QWRCZ05WQkFNTUZsUnkKZFhOMFEyOXlJRkp2YjNSRFpYSjBJRU5CTFRJd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJSwpBb0lDQVFDbklHN0NLcUppSkpXUWRzZzRmb0RTcThHYlpRV1U5TUVLRU5VQ3JPMmZrOGVIeUxBbkswSU1QUW8rClFWcWVkZDJOeXVDYjdHZ3lwR21TYUl3TGdRNVdvRDRhM1N3bEZJSXZsOU5rUnZSVXFkdzZWQzB4SzVtQzh0a3EKMSs5eEFMZ3hwTDU2SkFmRFFpRHlpdFNTQkJ0bFZreHMxUHUyWVZwSEk3VFlhYlMzT3RCMFBBeDFvWXhPZHFIcAoyeXFsTy9yT3NQOSthaWo5Snh6SXNla3A4VmR1WkxUUXdSVnREcjR1RGtiSVh2UlIvdThPWXpvN2NiclBiMW5LCkRPT2JYVW00VE9KWHNaaUtRbGVjZHUvdnZkRm9xTkwwQ2J0M05iNGxnZ2pFRml4RUlGYXBSQkYzNzEyMEhhcGUKYXo2TE12WUhMMWNFa3NyMS9wM0M2ZWl6amt4TEFqSFo1RHhJZ2lmM0dJSjJTRHB4c1JPaE9kVXV4VFRDSFdLRgozd1ArVGZTdlBkOWNXNDM2Y09HbGZpZkhoaTVxanhMR2hGNURVVkNjR1p0NDV2ejI3VWQrZXoxbTd4TVRpRjg4Cm9XUDcrYXlITlovemdwNmtQd3FjTVdtTG1hU0lTbzV1WmszdkZzUVBlU2doWUEyRkZuM1hWRGp4a2xiOXRUTk0KZzl6WEVKOUwvY2I0UXIyNmZITUM0UDk5elZ2aDFLeGhlMWZWU250YjFJVllKMTIvK0N0Z3JLQW1yaFFoSjhaMwptak9BUEY1R1AvZkRzYU9HTThib1hnMjVOU3lxUnNHRkFuV0FvT3NrK3hXcTVHZC9ibmMvOUFTS0wzeDc0eGRoCjhOMEpxU0RJdmdtazBINUV3N0l3U2ppcXFld1ltZ2VDSzl1NG5CaXQydUJHRjZ6UFhRSURBUUFCbzJNd1lUQWQKQmdOVkhRNEVGZ1FVMmY0aFFHNlVucnliUFp4OW1DQVo1WXd3WXJJd0h3WURWUjBqQkJnd0ZvQVUyZjRoUUc2VQpucnliUFp4OW1DQVo1WXd3WXJJd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUNBWVl3CkRRWUpLb1pJaHZjTkFRRUxCUUFEZ2dJQkFKNUZuZ3c3dHUvaE9zaDgwUUE5eitMcUJyV3lPcnNHUzJoNjBDT1gKZEtjczhBalllVnJYV29TSzJCS2FHOWw5WEUxd3hhWDVxK1dqaVluZEFmcnMzZm5wa3BmYnNFWkM4OU5pcXBYKwpNV2NVYVZpUUNxb0w3amNqeDFCUnRQVitudU43OStUTVFqSXRTUXpMLzBrTW14NDAvVzV1bG9wNUE3WnYyd25MCi9WOWxGRGZoT1BYellSWlk1TFZ0RFFzRUd6OVFMWCt6eDNvYUZvQmcrSW9mNlJzcXh2bTZBUnBwdjlKWXgxUlgKQ0kvaE9XQjNTNnhaaEJxSThkM0xUM2pYNStFekxmenVRZm9nc0w3TDl6aVV3T0hRaFErNzdTeHpxKzMra25ZYQpaSDliRFRNSkJ6TjdCajhScEZ4d1BJWEF6K09RcUlOMyt0dm14WXhvWnhCbnBWSXQ4TVNaajMrLzBXdml0VWZXCjJkQ0ZtVTJVbXc5TGplNEFXa2NkRVFPc1FSaXZoN2R2RERxUHlzL2NBOEdpQ2NqbC9ZQmV5R0JDQVJzYVUxcTcKTjZhM3ZMcUU2UjVzR3RSazJ0UkQvcE9MUy9Jc2VSWVExSk1MaUkraDJJWVVScEZIbXlnazcxZFNUbHhDbktyMwpTZXduNkVBZXM2YUpJbktjOVEwenRGaWpNRHZkMUdwVWs3NGFUZk9UbFBmOGhBcy9oQ0JjTkFORXhkcXR2QXJCCkFzOGU1WlRaODQ1YjJFenduZXhoRjdzVU1sUU1BaW1USHBLRzluL3Y1NUlGRGxuZG1RZ3VMdnFjQUZMVHhXWXAKNUtlWFJLUU9LSUVUTmNYMmIyVG1RY1RWTDh3MFJTWFBRUUNXUFVvdXdwYVlUMDVLbkplMzJ4K1NNc2ovRDFGdQoxdXdKCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1UcnVzdENvciBFQ0EtMSBPPVRydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLiBPVT1UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkKIyBTdWJqZWN0OiBDTj1UcnVzdENvciBFQ0EtMSBPPVRydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLiBPVT1UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkKIyBMYWJlbDogIlRydXN0Q29yIEVDQS0xIgojIFNlcmlhbDogOTU0ODI0Mjk0Njk4ODYyNTk4NAojIE1ENSBGaW5nZXJwcmludDogMjc6OTI6MjM6MWQ6MGE6ZjU6NDA6N2M6ZTk6ZTY6NmI6OWQ6ZDg6ZjU6ZTc6NmMKIyBTSEExIEZpbmdlcnByaW50OiA1ODpkMTpkZjo5NTo5NTo2Nzo2Yjo2MzpjMDpmMDo1YjoxYzoxNzo0ZDo4Yjo4NDowYjpjODo3ODpiZAojIFNIQTI1NiBGaW5nZXJwcmludDogNWE6ODg6NWQ6YjE6OWM6MDE6ZDk6MTI6YzU6NzU6OTM6ODg6OTM6OGM6YWY6YmI6ZGY6MDM6MWE6YjI6ZDQ6OGU6OTE6ZWU6MTU6NTg6OWI6NDI6OTc6MWQ6MDM6OWMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVJRENDQXdpZ0F3SUJBZ0lKQUlTQ0xGOGNZdEJBTUEwR0NTcUdTSWIzRFFFQkN3VUFNSUdjTVFzd0NRWUQKVlFRR0V3SlFRVEVQTUEwR0ExVUVDQXdHVUdGdVlXMWhNUlF3RWdZRFZRUUhEQXRRWVc1aGJXRWdRMmwwZVRFawpNQ0lHQTFVRUNnd2JWSEoxYzNSRGIzSWdVM2x6ZEdWdGN5QlRMaUJrWlNCU0xrd3VNU2N3SlFZRFZRUUxEQjVVCmNuVnpkRU52Y2lCRFpYSjBhV1pwWTJGMFpTQkJkWFJvYjNKcGRIa3hGekFWQmdOVkJBTU1EbFJ5ZFhOMFEyOXkKSUVWRFFTMHhNQjRYRFRFMk1ESXdOREV5TXpJek0xb1hEVEk1TVRJek1URTNNamd3TjFvd2dad3hDekFKQmdOVgpCQVlUQWxCQk1ROHdEUVlEVlFRSURBWlFZVzVoYldFeEZEQVNCZ05WQkFjTUMxQmhibUZ0WVNCRGFYUjVNU1F3CklnWURWUVFLREJ0VWNuVnpkRU52Y2lCVGVYTjBaVzF6SUZNdUlHUmxJRkl1VEM0eEp6QWxCZ05WQkFzTUhsUnkKZFhOMFEyOXlJRU5sY25ScFptbGpZWFJsSUVGMWRHaHZjbWwwZVRFWE1CVUdBMVVFQXd3T1ZISjFjM1JEYjNJZwpSVU5CTFRFd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUURQaitBUnRaK29kbmJiCjN3OVU3M05qS1lLdFI4YWphKzMrWHpQNFExSHBHak9STVJlZ2RNVFVwd0htc3BJK2FwM3REdmwwbUVEVFB3T0EKQm9KQTZMSGlwMUduSFlNbWE2dmUraGVSSzlqR3JCNnhuaGtCMVplbTZnMjN4RlVmSjN6U0NOVjJIeWtWaDBBNQozVGhGRVhYUW1xYzA0TC9OeUZJZHVVZCtEYmk3eGd6MmMxY1dXbjVEa1I5Vk9zWnRSQVNxbkttY3AweUpGNE91Cm93UmVVb0NMSGhJbEVSblhESDE5TVVSQjZ0dXZzQnp2Z2RBc3hab2htejN0UWp0UUp2THN6bkZoQm1JaFZFNS8Kd1owK2Z5Q01nTXNxMkpkaXlJTXprWDJ3b2xvUFYrZzd6UElsc3RSOEwreE54cUU2RlhybnRsMDE5ZlpJU2paRgpadFM2bUZqQkFnTUJBQUdqWXpCaE1CMEdBMVVkRGdRV0JCUkVua2oxekcxSTFLQkxmLzVaSkMrRGw1bWFoakFmCkJnTlZIU01FR0RBV2dCUkVua2oxekcxSTFLQkxmLzVaSkMrRGw1bWFoakFQQmdOVkhSTUJBZjhFQlRBREFRSC8KTUE0R0ExVWREd0VCL3dRRUF3SUJoakFOQmdrcWhraUc5dzBCQVFzRkFBT0NBUUVBQlQ0MVhCVndtOG5IYzJGdgpjaXZVd28veVExMEN6c1NVdVpRUmcyZGQ0bWRzZFhhL3V3eXFOc2F0UjVOajNCNSsxdDR1L3VrWk1qZ0RmeFQyCkFITXNXYkVoQnVIN3JCaVZES1AvbVpiM0t5ZWIxU1RNSGQzQk91Q1lSTERFNUQ1M3NYT3BaQ3oySEFGOFAxMUYKaGNDRjV5V1BsZHdYOHp5ZkdtNnd5dU1kS3VsTVkvb2tZV0xXMm42MkhHejFBaDNVS3QxVmtPc3FFVWM4TGw1MApzb0lpcFgxVEgwWHNKNUY5NXlJVzZNQm9OdGpHOFUrQVJETDU0ZEhSSGFyZXFLdWNCSyt0SUE1a21FMmxhOEJJCldKWnBUZHdIakZHVG90K2ZEejJMWUxTQ2phb0lUbUpGNFBrTDB1RGdQRnZlWEhFbkpjTG1BNEdMRUZQangxV2kKdEovWDVnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBSU0EgTz1TU0wgQ29ycG9yYXRpb24KIyBTdWJqZWN0OiBDTj1TU0wuY29tIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIE89U1NMIENvcnBvcmF0aW9uCiMgTGFiZWw6ICJTU0wuY29tIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIgojIFNlcmlhbDogODg3NTY0MDI5NjU1ODMxMDA0MQojIE1ENSBGaW5nZXJwcmludDogODY6Njk6MTI6YzA6NzA6ZjE6ZWM6YWM6YWM6YzI6ZDU6YmM6YTU6NWI6YTE6MjkKIyBTSEExIEZpbmdlcnByaW50OiBiNzphYjozMzowODpkMTplYTo0NDo3NzpiYToxNDo4MDoxMjo1YTo2ZjpiZDphOTozNjo0OTowYzpiYgojIFNIQTI1NiBGaW5nZXJwcmludDogODU6NjY6NmE6NTY6MmU6ZTA6YmU6NWM6ZTk6MjU6YzE6ZDg6ODk6MGE6NmY6NzY6YTg6N2U6YzE6NmQ6NGQ6N2Q6NWY6Mjk6ZWE6NzQ6MTk6Y2Y6MjA6MTI6M2I6NjkKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUYzVENDQThXZ0F3SUJBZ0lJZXl5YjB4YUFNcGt3RFFZSktvWklodmNOQVFFTEJRQXdmREVMTUFrR0ExVUUKQmhNQ1ZWTXhEakFNQmdOVkJBZ01CVlJsZUdGek1SQXdEZ1lEVlFRSERBZEliM1Z6ZEc5dU1SZ3dGZ1lEVlFRSwpEQTlUVTB3Z1EyOXljRzl5WVhScGIyNHhNVEF2QmdOVkJBTU1LRk5UVEM1amIyMGdVbTl2ZENCRFpYSjBhV1pwClkyRjBhVzl1SUVGMWRHaHZjbWwwZVNCU1UwRXdIaGNOTVRZd01qRXlNVGN6T1RNNVdoY05OREV3TWpFeU1UY3oKT1RNNVdqQjhNUXN3Q1FZRFZRUUdFd0pWVXpFT01Bd0dBMVVFQ0F3RlZHVjRZWE14RURBT0JnTlZCQWNNQjBodgpkWE4wYjI0eEdEQVdCZ05WQkFvTUQxTlRUQ0JEYjNKd2IzSmhkR2x2YmpFeE1DOEdBMVVFQXd3b1UxTk1MbU52CmJTQlNiMjkwSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVJRkpUUVRDQ0FpSXdEUVlKS29aSWh2Y04KQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQVBrUDNhTXJmY3ZRS3Y3c1o0V201eTRidW5maDQvV3ZwT3o2U2wyUgp4RmRIYXhoM2EzYnkvWlBrUFEvQ0ZwNExac05XbEo0WGc0WE9WdS95RnYwQVl2VWlDVlRvWlJkT1FibmdUMGFYCnFodkl1RzVpWG1teFg5c3FBbjc4Yk1yelFkanQwT2o4UDJGSTdiQURGQjBRRGtzWjRMdE83SVpsL3pielhtY0MKQzUyR1ZXSDllamp0L3VJWkFMZHZvVkJpZFhROG9QcklKWkswYm5vaXgvZ2VvZU95M1pFeHF5c2RCUCtsU2dRMwo2WVdrTXl2OTR0WlZOSHdacEVwb3g3S28wN2ZLb1pPSTY4R1h2SXo1SGRraWhDUjB4d1E5YXFrcGs4enJ1RnZoCi9sOGxxalJZeU1FalZKMGJtQkhET0p4K1BZWnNwUTlBaG53QzlGd0NUeWpMcm5HZkR6cklNLzRSSlRYcS9MckYKWUQzWmZCalZzcW5UZFhnRGNpTEtPc01mN3l6bExxbjZuaXkyVVViOXJ3UFc2bUJvNm9VV05tdUY2UjdBczkzRQpKTnlBS29GQmJaUSt5T0RKZ1VFQW5sNi9mOFVJbUtJWUxFSkFzL2x2T0NkTFRvRDBQWUZINEloODZoek90WFZjClVTNGNLMzhhY2lqbkFMWFJkTWJYNUordEI1TzJVelUxL0Rma3cvWmRGcjRoYzk2U0N2aWdZMnE4bHBKcVB2aTgKWlZXYjN2VU5pU1lFL0NVYXBpVnB5OEp0eW56aVdWK1hyT3Z2THNpODF4dFpQQ3ZNOGhuSWsyc25ZeG5QL09rbQorTXB4bTMrVC9qUm5oRTZaNi95emVBa3pjTHBtcG5idEczUHJHcVVOeENJVElKUldDazRzYkU2eC9jK2NDYnFpCk0rMkhBZ01CQUFHall6QmhNQjBHQTFVZERnUVdCQlRkQkFrSG92VjZmVkpURXBLVjdqaUFKUTJtV1RBUEJnTlYKSFJNQkFmOEVCVEFEQVFIL01COEdBMVVkSXdRWU1CYUFGTjBFQ1FlaTlYcDlVbE1Ta3BYdU9JQWxEYVpaTUE0RwpBMVVkRHdFQi93UUVBd0lCaGpBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQWdFQUlCZ1JsQ243SnAwY0hoNXdZZkdWCmNwTnhKSzFvazFpT01xOGJzM0FEL0NVcmRJV1FQWGhxOUxtTHBaYzd0UmlSdXg2bitVQmJrZmxWbWE4ZUVkQmMKSGFkbTQ3R1VCd3d5T2FicUc3QjUyQjJjY0VUaml0M0UrWlVmaWpoRFB3R0ZwVWVuUFVheXZPVWlhUGQ3bk5ncwpQZ29oeUMwenJML0ZnWmt4ZE1GMWNjVytzZkFqUmZTZGEvd1pZNTJqdkFUR0dBc2x1MU9KRDdPQVVONUY3a1IvCnE1UjRaSmpUOWlqZGg5aHdaWFQ3RHJrVDY2Y1BZYWt5bHN6ZXUrMWpUQmk3cVVEM29GUnVJSWh4ZFJqcWVyUTAKY3VBakozZGN0cERxaGlWQXErOHpEOHVmZ3I2aUlQdjJ0UzBhNXNLRnNYUVArOGhsQXFSU0FVZmRTU0xCdjlqcgphNngrM3V4ak14VzNJd2lQeGcrTlFWcmRqc1c1aitWRlAzamJ1dEliUUxIK2NVMC80SUdpdWw2MDdCWGdrOTBJCkgzN2hWWmtMSWQ2VG5ncjc1cU5KdlRZdy91ZDNzcUIxbDdVdGdZZ1haU0QzMnBBQW44bFN6RExLTlh6MVBRL1kKSzlmMUptekpCalNXRnVwd1dSb3llWGtMdG9oL0QxSklQYjlzMktKRUx0Rk90M0pZMDRrVGxmNUVxL2pYaXh0dQpuTHdzb0Z2VmFnQ3ZYemZoMWZvUUM1aWNodWNtajg3dzdHNktWd3VBNDA2eXdLQmpZWkM2VldnM2RHcTJrdHVmCm9ZWWl0bVVuRHV5Mm4wSmc1R2ZDdGRwQkM4VFRpMkVidlBvZmtTdlhSQWRldWltczJjWHA3MU5JV3V1QThTaFkKSWMyd0JsWDdKejlUa0hDcEJCNVhKN2s9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1TU0wuY29tIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgRUNDIE89U1NMIENvcnBvcmF0aW9uCiMgU3ViamVjdDogQ049U1NMLmNvbSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQyBPPVNTTCBDb3Jwb3JhdGlvbgojIExhYmVsOiAiU1NMLmNvbSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQyIKIyBTZXJpYWw6IDg0OTU3MjM4MTMyOTcyMTY0MjQKIyBNRDUgRmluZ2VycHJpbnQ6IDJlOmRhOmU0OjM5OjdmOjljOjhmOjM3OmQxOjcwOjlmOjI2OjE3OjUxOjNhOjhlCiMgU0hBMSBGaW5nZXJwcmludDogYzM6MTk6N2M6Mzk6MjQ6ZTY6NTQ6YWY6MWI6YzQ6YWI6MjA6OTU6N2E6ZTI6YzM6MGU6MTM6MDI6NmEKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDM0OjE3OmJiOjA2OmNjOjYwOjA3OmRhOjFiOjk2OjFjOjkyOjBiOjhhOmI0OmNlOjNmOmFkOjgyOjBlOjRhOmEzOjBiOjlhOmNiOmM0OmE3OjRlOmJkOmNlOmJjOjY1Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDalRDQ0FoU2dBd0lCQWdJSWRlYmZ5OEZvVzZnd0NnWUlLb1pJemowRUF3SXdmREVMTUFrR0ExVUVCaE1DClZWTXhEakFNQmdOVkJBZ01CVlJsZUdGek1SQXdEZ1lEVlFRSERBZEliM1Z6ZEc5dU1SZ3dGZ1lEVlFRS0RBOVQKVTB3Z1EyOXljRzl5WVhScGIyNHhNVEF2QmdOVkJBTU1LRk5UVEM1amIyMGdVbTl2ZENCRFpYSjBhV1pwWTJGMAphVzl1SUVGMWRHaHZjbWwwZVNCRlEwTXdIaGNOTVRZd01qRXlNVGd4TkRBeldoY05OREV3TWpFeU1UZ3hOREF6CldqQjhNUXN3Q1FZRFZRUUdFd0pWVXpFT01Bd0dBMVVFQ0F3RlZHVjRZWE14RURBT0JnTlZCQWNNQjBodmRYTjAKYjI0eEdEQVdCZ05WQkFvTUQxTlRUQ0JEYjNKd2IzSmhkR2x2YmpFeE1DOEdBMVVFQXd3b1UxTk1MbU52YlNCUwpiMjkwSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVJRVZEUXpCMk1CQUdCeXFHU000OUFnRUdCU3VCCkJBQWlBMklBQkVWdXFWREVwaU0ybmw4b2pSZkxsaUprUDl4NmpoM01DTE9pY1NTNmprbTVCQnRIbGxpckxaWEkKN1o0SU5jZ242NG1NVTFqcllvcis4RnNQYXpGU1kwRTdpYzNzN0xhTkdkTTBCOXk3eGdaL3drV1Y3TXQvcUNQZwpDZW1CK3ZOSDA2TmpNR0V3SFFZRFZSME9CQllFRklMUmhYTXc1elVFMDQ0Q2t2dmxwTkhFSWVqTk1BOEdBMVVkCkV3RUIvd1FGTUFNQkFmOHdId1lEVlIwakJCZ3dGb0FVZ3RHRmN6RG5OUVRUamdLUysrV2swY1FoNk0wd0RnWUQKVlIwUEFRSC9CQVFEQWdHR01Bb0dDQ3FHU000OUJBTUNBMmNBTUdRQ01HL242MWtScEdEUFliQ1dlKzBGK1M4VAprZHp0NWZ4UWF4RkdSck1jSVFCaXU3N0Q1K2pOQjVuNURRdGRjajdFcWdJd0g3eTZDK0l3SlB0OGJZQlZDcGsrCmdBMHo1V2FqczZPN3BkV0xqd2tzcGwxKzR2QUhDR2h0MG54cGJsL2Y1V3BsCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyIE89U1NMIENvcnBvcmF0aW9uCiMgU3ViamVjdDogQ049U1NMLmNvbSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQSBSMiBPPVNTTCBDb3Jwb3JhdGlvbgojIExhYmVsOiAiU1NMLmNvbSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQSBSMiIKIyBTZXJpYWw6IDYyNDgyMjc0OTQzNTI5NDMzNTAKIyBNRDUgRmluZ2VycHJpbnQ6IGUxOjFlOjMxOjU4OjFhOmFlOjU0OjUzOjAyOmY2OjE3OjZhOjExOjdiOjRkOjk1CiMgU0hBMSBGaW5nZXJwcmludDogNzQ6M2E6ZjA6NTI6OWI6ZDA6MzI6YTA6ZjQ6NGE6ODM6Y2Q6ZDQ6YmE6YTk6N2I6N2M6MmU6YzQ6OWEKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDJlOjdiOmYxOjZjOmMyOjI0Ojg1OmE3OmJiOmUyOmFhOjg2Ojk2Ojc1OjA3OjYxOmIwOmFlOjM5OmJlOjNiOjJmOmU5OmQwOmNjOjZkOjRlOmY3OjM0OjkxOjQyOjVjCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGNnpDQ0E5T2dBd0lCQWdJSVZyWXB6VFM4ZVBZd0RRWUpLb1pJaHZjTkFRRUxCUUF3Z1lJeEN6QUpCZ05WCkJBWVRBbFZUTVE0d0RBWURWUVFJREFWVVpYaGhjekVRTUE0R0ExVUVCd3dIU0c5MWMzUnZiakVZTUJZR0ExVUUKQ2d3UFUxTk1JRU52Y25CdmNtRjBhVzl1TVRjd05RWURWUVFEREM1VFUwd3VZMjl0SUVWV0lGSnZiM1FnUTJWeQpkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGtnVWxOQklGSXlNQjRYRFRFM01EVXpNVEU0TVRRek4xb1hEVFF5Ck1EVXpNREU0TVRRek4xb3dnWUl4Q3pBSkJnTlZCQVlUQWxWVE1RNHdEQVlEVlFRSURBVlVaWGhoY3pFUU1BNEcKQTFVRUJ3d0hTRzkxYzNSdmJqRVlNQllHQTFVRUNnd1BVMU5NSUVOdmNuQnZjbUYwYVc5dU1UY3dOUVlEVlFRRApEQzVUVTB3dVkyOXRJRVZXSUZKdmIzUWdRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrZ1VsTkJJRkl5Ck1JSUNJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBZzhBTUlJQ0NnS0NBZ0VBanpabFFPSFdUY0RYdE9sRzJtdnEKTTBmTlRQbDlmYjY5TFQzdzIzamhocVhadWdsWGFPMVhQcURRQ0VHRDV5aEJKQi9qY2hYUUFScjdYbkFqc3N1ZgpPZVBQeFU3R2ttMG14bnU3czlvbm5RcUc2WUUzQmY3d2NYSHN3eHpwWTZJWEZKM3ZHMmZUaFZVQ0F0Wkp5Y3hhCjRiSDNiektmeWRRN2lFR29uTDNMcTl0dGV3a2Zva3h5a05vckNQelBQRlRPWncrb3oxMldHUXZFNDNMcnJkRjkKSFNmdmt1c1F2MXZyTzYvUGdOM0IwcFlFVzNwK3BLazhPSGFrWW82Z09WN3FkODlkQUZtUFppdytCNktqQlNZUgphWmZxaGJjUGxndEx5RURoVUxvdWlzdjNENW9pNTMrYU54UE44azBUYXlIUndNd2k4cUZHOWtScG5NcGhOUWNBCmI5WmhDQkhxdXJqMjZiTmc1VTI1N0o4VVpzbFhXTnZOaDJuNGlvWVNBMGUvWmhOMnJIZDlOQ1NGZzgzWHFweVEKR3A4aExIOTR0MlM0Mk9pbTlIaXpWY3VFMGpMRWVLNmpqMkhkemdoVHJleUkvQlhrbWczbW54cDN6a3lQdUJRVgpQV0tjaGpnR0FHWVM1RmwyV2xQQUFwaWlFQ3RvUkh1T2VjNHpTbmFxVzRFV0c3V0syTkFBZTE1aXRBbldobU1PCnBnV1ZTYm9vaTRpVHNqUWMyS1JWYnJjYzBONlpWVHNqOUNMZytTbG1KdXdnVUhmYlNndVB2dVVDWUhCQlh0U3UKVURraUZDYkxzanR6ZEZWSEIzbUJPYWd3RTBUbEJJcXVsaE1sUWcrNVU4U2IvTTNrSE40OCtxdldCa29mWjZhWQpNQnpkTE52Y0dKVlhac2IvWEl0VzlYY0NBd0VBQWFOak1HRXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QWZCZ05WCkhTTUVHREFXZ0JUNVlMdlU0OVUwOXJqMUJvQWxwM1BiUm1tb25qQWRCZ05WSFE0RUZnUVUrV0M3MU9QVk5QYTQKOVFhQUphZHoyMFpwcUo0d0RnWURWUjBQQVFIL0JBUURBZ0dHTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElDQVFCVwpzNDdMQ3AxSmpyK2t4Skc3WmhjRlVaaDErK1ZRTEhxZThSVDZxOU9LUHYrUktZOWppOWkwcVZRQkRiNlRoaS81ClNtM0hYdlZYK2NwVkhCSytSdzgyeGQ5cXQ5dDF3a2NsZjdueFkvaG9MVlVFMGZLTnNLVFB2RHhlSDNqbnBhQWcKY0xBRXhiZjNjcWZlSWcyOU15VkdqR1NTSnVNK0xtT1cycHVNUGZnWUNkY0R6SDJHZ3VES0JBZFJVTmYva3RVTQo3OXFHbjVuWDY3ZXZhT0k1SnBTNmFMZS9nOVBxZW1jOVltZXVKZVZ5Nk9MazdLNFM5a3NyUEovcHNFRHpPRlN6Ci9iZG95TnJHajFFOHN2dVIzQnpubTUzaHR3MXlqK0treEtsNCtlc1VyTVpEQmNKbE9TZ1lBc09Dc3AwRnZtWHQKbGw5bGREejdDVFV1ZTV3VC9Sc1BYY2R0Z1RwV0Q4dzc0YThDTHlLc1JzcEdQS0FjVE5aRXRGNHVYQlZtQ2VFbQpLZjdHVW1HNnNYUC93d3ljNVd4cWxEOFV5a0FXbFlUeldhbXNYMHhoazIzUk84eWlsUXdpcG1kblJDNjUyZEtLClFiTm1DMXI3ZlNPbDhocXcvOTZiZzVRdTBUL2ZrcmVScndVN1pjZWdiTEhOWWhMRGtCdmpKYzQwdkc5M2RyRVEKdy9jRkdzRFdyM1JpU0JkM2ttbVFZUnplbFlCMFZJOFlITVB6QTlDL3BFTjFobE1ZZWdvdUNSdzJuNUg5Z29vaQpTOUVPVUNYZHl3TU1GOG1EQUFoT05VMktpKzN3QXBSbUxFUi95NVVubGhldENUQ3N0bkVYYm9zWDlod0oxQzA3Cm1LVngwMVFUMldEejlVdG1UL3J4N2lBU2piU3NWN0ZGWTZHc2RxbkMrdz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgRUNDIE89U1NMIENvcnBvcmF0aW9uCiMgU3ViamVjdDogQ049U1NMLmNvbSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQyBPPVNTTCBDb3Jwb3JhdGlvbgojIExhYmVsOiAiU1NMLmNvbSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQyIKIyBTZXJpYWw6IDMxODIyNDY1MjY3NTQ1NTUyODUKIyBNRDUgRmluZ2VycHJpbnQ6IDU5OjUzOjIyOjY1OjgzOjQyOjAxOjU0OmMwOmNlOjQyOmI5OjVhOjdjOmYyOjkwCiMgU0hBMSBGaW5nZXJwcmludDogNGM6ZGQ6NTE6YTM6ZDE6ZjU6MjA6MzI6MTQ6YjA6YzY6YzU6MzI6MjM6MDM6OTE6Yzc6NDY6NDI6NmQKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDIyOmEyOmMxOmY3OmJkOmVkOjcwOjRjOmMxOmU3OjAxOmI1OmY0OjA4OmMzOjEwOjg4OjBmOmU5OjU2OmI1OmRlOjJhOjRhOjQ0OmY5OjljOjg3OjNhOjI1OmE3OmM4Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDbERDQ0FocWdBd0lCQWdJSUxDbWNXeGJ0QlpVd0NnWUlLb1pJemowRUF3SXdmekVMTUFrR0ExVUVCaE1DClZWTXhEakFNQmdOVkJBZ01CVlJsZUdGek1SQXdEZ1lEVlFRSERBZEliM1Z6ZEc5dU1SZ3dGZ1lEVlFRS0RBOVQKVTB3Z1EyOXljRzl5WVhScGIyNHhOREF5QmdOVkJBTU1LMU5UVEM1amIyMGdSVllnVW05dmRDQkRaWEowYVdacApZMkYwYVc5dUlFRjFkR2h2Y21sMGVTQkZRME13SGhjTk1UWXdNakV5TVRneE5USXpXaGNOTkRFd01qRXlNVGd4Ck5USXpXakIvTVFzd0NRWURWUVFHRXdKVlV6RU9NQXdHQTFVRUNBd0ZWR1Y0WVhNeEVEQU9CZ05WQkFjTUIwaHYKZFhOMGIyNHhHREFXQmdOVkJBb01EMU5UVENCRGIzSndiM0poZEdsdmJqRTBNRElHQTFVRUF3d3JVMU5NTG1OdgpiU0JGVmlCU2IyOTBJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNUlFVkRRekIyTUJBR0J5cUdTTTQ5CkFnRUdCU3VCQkFBaUEySUFCS29TUjVDWUcvdnZ3MEFIZ3lCTzhUQ0NvZ2JSOHBLR1lmTDJJV2pLQU1USDZrTUEKVkliYy9SL2ZBTGhCWWx6Y2NCWXkzaCtaMU16RkI4Z0lIMkVXQjFFOWZWd0hVK00xT0l6ZnpaL1pMZzFLdGhrdQpXbkJhQnUyKzhLR3d5dEFKS2FOak1HRXdIUVlEVlIwT0JCWUVGRnZLWHVYZTBvR3F6YWd0WkZHMjJYS2JsK1pQCk1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0h3WURWUjBqQkJnd0ZvQVVXOHBlNWQ3U2dhck5xQzFrVWJiWmNwdVgKNWs4d0RnWURWUjBQQVFIL0JBUURBZ0dHTUFvR0NDcUdTTTQ5QkFNQ0EyZ0FNR1VDTVFDSzVrQ0pOK3ZwMVJQWgp5dFJySlBPd1BZZEdXQnJzc2Q5disxYTZjR3ZIT016b3NZeFBEL2Z4WjNZT2c5QWVVWThDTUQzMkl5Z21UTVpnCmg1TW1tN0kxSHJyVzl6elJITTc2SlR5bUdvRVZXL01TRDJ6dVpZckpoNmo1QitCaW1veGNTZz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KUEsDBBQAAAAAAAAAIQAJE0JHRAMAAEQDAAA4AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jZXJ0aWZpL2NvcmUucHkjIS91c3IvYmluL2VudiBweXRob24KIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KCiIiIgpjZXJ0aWZpLnB5Cn5+fn5+fn5+fn4KClRoaXMgbW9kdWxlIHJldHVybnMgdGhlIGluc3RhbGxhdGlvbiBsb2NhdGlvbiBvZiBjYWNlcnQucGVtLgoiIiIKaW1wb3J0IG9zCmltcG9ydCB3YXJuaW5ncwoKCmNsYXNzIERlcHJlY2F0ZWRCdW5kbGVXYXJuaW5nKERlcHJlY2F0aW9uV2FybmluZyk6CiAgICAiIiIKICAgIFRoZSB3ZWFrIHNlY3VyaXR5IGJ1bmRsZSBpcyBiZWluZyBkZXByZWNhdGVkLiBQbGVhc2UgYm90aGVyIHlvdXIgc2VydmljZQogICAgcHJvdmlkZXIgdG8gZ2V0IHRoZW0gdG8gc3RvcCB1c2luZyBjcm9zcy1zaWduZWQgcm9vdHMuCiAgICAiIiIKCgpkZWYgd2hlcmUoKToKICAgIGYgPSBvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pCgogICAgcmV0dXJuIG9zLnBhdGguam9pbihmLCAnY2FjZXJ0LnBlbScpCgoKZGVmIG9sZF93aGVyZSgpOgogICAgd2FybmluZ3Mud2FybigKICAgICAgICAiVGhlIHdlYWsgc2VjdXJpdHkgYnVuZGxlIGhhcyBiZWVuIHJlbW92ZWQuIGNlcnRpZmkub2xkX3doZXJlKCkgaXMgbm93IGFuIGFsaWFzICIKICAgICAgICAib2YgY2VydGlmaS53aGVyZSgpLiBQbGVhc2UgdXBkYXRlIHlvdXIgY29kZSB0byB1c2UgY2VydGlmaS53aGVyZSgpIGluc3RlYWQuICIKICAgICAgICAiY2VydGlmaS5vbGRfd2hlcmUoKSB3aWxsIGJlIHJlbW92ZWQgaW4gMjAxOC4iLAogICAgICAgIERlcHJlY2F0ZWRCdW5kbGVXYXJuaW5nCiAgICApCiAgICByZXR1cm4gd2hlcmUoKQoKaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgIHByaW50KHdoZXJlKCkpClBLAwQUAAAAAAAAACEA8M8PUxcGAAAXBgAAPAAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9fX2luaXRfXy5weSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBCRUdJTiBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCiMgMDIxMTAtMTMwMSAgVVNBCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRU5EIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKCmZyb20gLmNvbXBhdCBpbXBvcnQgUFkyLCBQWTMKZnJvbSAudW5pdmVyc2FsZGV0ZWN0b3IgaW1wb3J0IFVuaXZlcnNhbERldGVjdG9yCmZyb20gLnZlcnNpb24gaW1wb3J0IF9fdmVyc2lvbl9fLCBWRVJTSU9OCgoKZGVmIGRldGVjdChieXRlX3N0cik6CiAgICAiIiIKICAgIERldGVjdCB0aGUgZW5jb2Rpbmcgb2YgdGhlIGdpdmVuIGJ5dGUgc3RyaW5nLgoKICAgIDpwYXJhbSBieXRlX3N0cjogICAgIFRoZSBieXRlIHNlcXVlbmNlIHRvIGV4YW1pbmUuCiAgICA6dHlwZSBieXRlX3N0cjogICAgICBgYGJ5dGVzYGAgb3IgYGBieXRlYXJyYXlgYAogICAgIiIiCiAgICBpZiBub3QgaXNpbnN0YW5jZShieXRlX3N0ciwgYnl0ZWFycmF5KToKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShieXRlX3N0ciwgYnl0ZXMpOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ0V4cGVjdGVkIG9iamVjdCBvZiB0eXBlIGJ5dGVzIG9yIGJ5dGVhcnJheSwgZ290OiAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnezB9Jy5mb3JtYXQodHlwZShieXRlX3N0cikpKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGJ5dGVfc3RyID0gYnl0ZWFycmF5KGJ5dGVfc3RyKQogICAgZGV0ZWN0b3IgPSBVbml2ZXJzYWxEZXRlY3RvcigpCiAgICBkZXRlY3Rvci5mZWVkKGJ5dGVfc3RyKQogICAgcmV0dXJuIGRldGVjdG9yLmNsb3NlKCkKUEsDBBQAAAAAAAAAIQA5v4QQFnoAABZ6AAA8AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2JpZzVmcmVxLnB5IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEJFR0lOIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgVGhlIE9yaWdpbmFsIENvZGUgaXMgTW96aWxsYSBDb21tdW5pY2F0b3IgY2xpZW50IGNvZGUuCiMKIyBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKIyBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi4KIyBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAxOTk4CiMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgojCiMgQ29udHJpYnV0b3Iocyk6CiMgICBNYXJrIFBpbGdyaW0gLSBwb3J0IHRvIFB5dGhvbgojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKIyAwMjExMC0xMzAxICBVU0EKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFTkQgTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgojIEJpZzUgZnJlcXVlbmN5IHRhYmxlCiMgYnkgVGFpd2FuJ3MgTWFuZGFyaW4gUHJvbW90aW9uIENvdW5jaWwKIyA8aHR0cDovL3d3dy5lZHUudHc6ODEvbWFuZHIvPgojCiMgMTI4ICAtLT4gMC40MjI2MQojIDI1NiAgLS0+IDAuNTc4NTEKIyA1MTIgIC0tPiAwLjc0ODUxCiMgMTAyNCAtLT4gMC44OTM4NAojIDIwNDggLS0+IDAuOTc1ODMKIwojIElkZWFsIERpc3RyaWJ1dGlvbiBSYXRpbyA9IDAuNzQ4NTEvKDEtMC43NDg1MSkgPTIuOTgKIyBSYW5kb20gRGlzdHJpYnV0aW9uIFJhdGlvbiA9IDUxMi8oNTQwMS01MTIpPTAuMTA1CiMKIyBUeXBpY2FsIERpc3RyaWJ1dGlvbiBSYXRpbyBhYm91dCAyNSUgb2YgSWRlYWwgb25lLCBzdGlsbCBtdWNoIGhpZ2hlciB0aGFuIFJEUgoKQklHNV9UWVBJQ0FMX0RJU1RSSUJVVElPTl9SQVRJTyA9IDAuNzUKCiNDaGFyIHRvIEZyZXFPcmRlciB0YWJsZQpCSUc1X1RBQkxFX1NJWkUgPSA1Mzc2CgpCSUc1X0NIQVJfVE9fRlJFUV9PUkRFUiA9ICgKICAgMSwxODAxLDE1MDYsIDI1NSwxNDMxLCAxOTgsICAgOSwgIDgyLCAgIDYsNTAwOCwgMTc3LCAyMDIsMzY4MSwxMjU2LDI4MjEsIDExMCwgIyAgIDE2CjM4MTQsICAzMywzMjc0LCAyNjEsICA3NiwgIDQ0LDIxMTQsICAxNiwyOTQ2LDIxODcsMTE3NiwgNjU5LDM5NzEsICAyNiwzNDUxLDI2NTMsICMgICAzMgoxMTk4LDM5NzIsMzM1MCw0MjAyLCA0MTAsMjIxNSwgMzAyLCA1OTAsIDM2MSwxOTY0LCAgIDgsIDIwNCwgIDU4LDQ1MTAsNTAwOSwxOTMyLCAjICAgNDgKICA2Myw1MDEwLDUwMTEsIDMxNywxNjE0LCAgNzUsIDIyMiwgMTU5LDQyMDMsMjQxNywxNDgwLDUwMTIsMzU1NSwzMDkxLCAyMjQsMjgyMiwgIyAgIDY0CjM2ODIsICAgMywgIDEwLDM5NzMsMTQ3MSwgIDI5LDI3ODcsMTEzNSwyODY2LDE5NDAsIDg3MywgMTMwLDMyNzUsMTEyMywgMzEyLDUwMTMsICMgICA4MAo0NTExLDIwNTIsIDUwNywgMjUyLCA2ODIsNTAxNCwgMTQyLDE5MTUsIDEyNCwgMjA2LDI5NDcsICAzNCwzNTU2LDMyMDQsICA2NCwgNjA0LCAjICAgOTYKNTAxNSwyNTAxLDE5NzcsMTk3OCwgMTU1LDE5OTEsIDY0NSwgNjQxLDE2MDYsNTAxNiwzNDUyLCAzMzcsICA3MiwgNDA2LDUwMTcsICA4MCwgIyAgMTEyCiA2MzAsIDIzOCwzMjA1LDE1MDksIDI2MywgOTM5LDEwOTIsMjY1NCwgNzU2LDE0NDAsMTA5NCwzNDUzLCA0NDksICA2OSwyOTg3LCA1OTEsICMgIDEyOAogMTc5LDIwOTYsIDQ3MSwgMTE1LDIwMzUsMTg0NCwgIDYwLCAgNTAsMjk4OCwgMTM0LCA4MDYsMTg2OSwgNzM0LDIwMzYsMzQ1NCwgMTgwLCAjICAxNDQKIDk5NSwxNjA3LCAxNTYsIDUzNywyOTA3LCA2ODgsNTAxOCwgMzE5LDEzMDUsIDc3OSwyMTQ1LCA1MTQsMjM3OSwgMjk4LDQ1MTIsIDM1OSwgIyAgMTYwCjI1MDIsICA5MCwyNzE2LDEzMzgsIDY2MywgIDExLCA5MDYsMTA5OSwyNTUzLCAgMjAsMjQ0MSwgMTgyLCA1MzIsMTcxNiw1MDE5LCA3MzIsICMgIDE3NgoxMzc2LDQyMDQsMTMxMSwxNDIwLDMyMDYsICAyNSwyMzE3LDEwNTYsIDExMywgMzk5LCAzODIsMTk1MCwgMjQyLDM0NTUsMjQ3NCwgNTI5LCAjICAxOTIKMzI3NiwgNDc1LDE0NDcsMzY4Myw1MDIwLCAxMTcsICAyMSwgNjU2LCA4MTAsMTI5NywyMzAwLDIzMzQsMzU1Nyw1MDIxLCAxMjYsNDIwNSwgIyAgMjA4CiA3MDYsIDQ1NiwgMTUwLCA2MTMsNDUxMywgIDcxLDExMTgsMjAzNyw0MjA2LCAxNDUsMzA5MiwgIDg1LCA4MzUsIDQ4NiwyMTE1LDEyNDYsICMgIDIyNAoxNDI2LCA0MjgsIDcyNywxMjg1LDEwMTUsIDgwMCwgMTA2LCA2MjMsIDMwMywxMjgxLDUwMjIsMjEyOCwyMzU5LCAzNDcsMzgxNSwgMjIxLCAjICAyNDAKMzU1OCwzMTM1LDUwMjMsMTk1NiwxMTUzLDQyMDcsICA4MywgMjk2LDExOTksMzA5MywgMTkyLCA2MjQsICA5Myw1MDI0LCA4MjIsMTg5OCwgIyAgMjU2CjI4MjMsMzEzNiwgNzk1LDIwNjUsIDk5MSwxNTU0LDE1NDIsMTU5MiwgIDI3LCAgNDMsMjg2NywgODU5LCAxMzksMTQ1NiwgODYwLDQ1MTQsICMgIDI3MgogNDM3LCA3MTIsMzk3NCwgMTY0LDIzOTcsMzEzNywgNjk1LCAyMTEsMzAzNywyMDk3LCAxOTUsMzk3NSwxNjA4LDM1NTksMzU2MCwzNjg0LCAjICAyODgKMzk3NiwgMjM0LCA4MTEsMjk4OSwyMDk4LDM5NzcsMjIzMywxNDQxLDM1NjEsMTYxNSwyMzgwLCA2NjgsMjA3NywxNjM4LCAzMDUsIDIyOCwgIyAgMzA0CjE2NjQsNDUxNSwgNDY3LCA0MTUsNTAyNSwgMjYyLDIwOTksMTU5MywgMjM5LCAxMDgsIDMwMCwgMjAwLDEwMzMsIDUxMiwxMjQ3LDIwNzgsICMgIDMyMAo1MDI2LDUwMjcsMjE3NiwzMjA3LDM2ODUsMjY4MiwgNTkzLCA4NDUsMTA2MiwzMjc3LCAgODgsMTcyMywyMDM4LDM5NzgsMTk1MSwgMjEyLCAjICAzMzYKIDI2NiwgMTUyLCAxNDksIDQ2OCwxODk5LDQyMDgsNDUxNiwgIDc3LCAxODcsNTAyOCwzMDM4LCAgMzcsICAgNSwyOTkwLDUwMjksMzk3OSwgIyAgMzUyCjUwMzAsNTAzMSwgIDM5LDI1MjQsNDUxNywyOTA4LDMyMDgsMjA3OSwgIDU1LCAxNDgsICA3NCw0NTE4LCA1NDUsIDQ4MywxNDc0LDEwMjksICMgIDM2OAoxNjY1LCAyMTcsMTg3MCwxNTMxLDMxMzgsMTEwNCwyNjU1LDQyMDksICAyNCwgMTcyLDM1NjIsIDkwMCwzOTgwLDM1NjMsMzU2NCw0NTE5LCAjICAzODQKICAzMiwxNDA4LDI4MjQsMTMxMiwgMzI5LCA0ODcsMjM2MCwyMjUxLDI3MTcsIDc4NCwyNjgzLCAgIDQsMzAzOSwzMzUxLDE0MjcsMTc4OSwgIyAgNDAwCiAxODgsIDEwOSwgNDk5LDUwMzIsMzY4NiwxNzE3LDE3OTAsIDg4OCwxMjE3LDMwNDAsNDUyMCw1MDMzLDM1NjUsNTAzNCwzMzUyLDE1MjAsICMgIDQxNgozNjg3LDM5ODEsIDE5NiwxMDM0LCA3NzUsNTAzNSw1MDM2LCA5MjksMTgxNiwgMjQ5LCA0MzksICAzOCw1MDM3LDEwNjMsNTAzOCwgNzk0LCAjICA0MzIKMzk4MiwxNDM1LDIzMDEsICA0NiwgMTc4LDMyNzgsMjA2Niw1MDM5LDIzODEsNTA0MCwgMjE0LDE3MDksNDUyMSwgODA0LCAgMzUsIDcwNywgIyAgNDQ4CiAzMjQsMzY4OCwxNjAxLDI1NTQsIDE0MCwgNDU5LDQyMTAsNTA0MSw1MDQyLDEzNjUsIDgzOSwgMjcyLCA5NzgsMjI2MiwyNTgwLDM0NTYsICMgIDQ2NAoyMTI5LDEzNjMsMzY4OSwxNDIzLCA2OTcsIDEwMCwzMDk0LCAgNDgsICA3MCwxMjMxLCA0OTUsMzEzOSwyMTk2LDUwNDMsMTI5NCw1MDQ0LCAjICA0ODAKMjA4MCwgNDYyLCA1ODYsMTA0MiwzMjc5LCA4NTMsIDI1NiwgOTg4LCAxODUsMjM4MiwzNDU3LDE2OTgsIDQzNCwxMDg0LDUwNDUsMzQ1OCwgIyAgNDk2CiAzMTQsMjYyNSwyNzg4LDQ1MjIsMjMzNSwyMzM2LCA1NjksMjI4NSwgNjM3LDE4MTcsMjUyNSwgNzU3LDExNjIsMTg3OSwxNjE2LDM0NTksICMgIDUxMgogMjg3LDE1NzcsMjExNiwgNzY4LDQ1MjMsMTY3MSwyODY4LDM1NjYsMjUyNiwxMzIxLDM4MTYsIDkwOSwyNDE4LDUwNDYsNDIxMSwgOTMzLCAjICA1MjgKMzgxNyw0MjEyLDIwNTMsMjM2MSwxMjIyLDQ1MjQsIDc2NSwyNDE5LDEzMjIsIDc4Niw0NTI1LDUwNDcsMTkyMCwxNDYyLDE2NzcsMjkwOSwgIyAgNTQ0CjE2OTksNTA0OCw0NTI2LDE0MjQsMjQ0MiwzMTQwLDM2OTAsMjYwMCwzMzUzLDE3NzUsMTk0MSwzNDYwLDM5ODMsNDIxMywgMzA5LDEzNjksICMgIDU2MAoxMTMwLDI4MjUsIDM2NCwyMjM0LDE2NTMsMTI5OSwzOTg0LDM1NjcsMzk4NSwzOTg2LDI2NTYsIDUyNSwxMDg1LDMwNDEsIDkwMiwyMDAxLCAjICA1NzYKMTQ3NSwgOTY0LDQ1MjcsIDQyMSwxODQ1LDE0MTUsMTA1NywyMjg2LCA5NDAsMTM2NCwzMTQxLCAzNzYsNDUyOCw0NTI5LDEzODEsICAgNywgIyAgNTkyCjI1MjcsIDk4MywyMzgzLCAzMzYsMTcxMCwyNjg0LDE4NDYsIDMyMSwzNDYxLCA1NTksMTEzMSwzMDQyLDI3NTIsMTgwOSwxMTMyLDEzMTMsICMgIDYwOAogMjY1LDE0ODEsMTg1OCw1MDQ5LCAzNTIsMTIwMywyODI2LDMyODAsIDE2NywxMDg5LCA0MjAsMjgyNywgNzc2LCA3OTIsMTcyNCwzNTY4LCAjICA2MjQKNDIxNCwyNDQzLDMyODEsNTA1MCw0MjE1LDUwNTEsIDQ0NiwgMjI5LCAzMzMsMjc1MywgOTAxLDM4MTgsMTIwMCwxNTU3LDQ1MzAsMjY1NywgIyAgNjQwCjE5MjEsIDM5NSwyNzU0LDI2ODUsMzgxOSw0MjE2LDE4MzYsIDEyNSwgOTE2LDMyMDksMjYyNiw0NTMxLDUwNTIsNTA1MywzODIwLDUwNTQsICMgIDY1Ngo1MDU1LDUwNTYsNDUzMiwzMTQyLDM2OTEsMTEzMywyNTU1LDE3NTcsMzQ2MiwxNTEwLDIzMTgsMTQwOSwzNTY5LDUwNTcsMjE0NiwgNDM4LCAjICA2NzIKMjYwMSwyOTEwLDIzODQsMzM1NCwxMDY4LCA5NTgsMzA0MywgNDYxLCAzMTEsMjg2OSwyNjg2LDQyMTcsMTkxNiwzMjEwLDQyMTgsMTk3OSwgIyAgNjg4CiAzODMsIDc1MCwyNzU1LDI2MjcsNDIxOSwgMjc0LCA1MzksIDM4NSwxMjc4LDE0NDIsNTA1OCwxMTU0LDE5NjUsIDM4NCwgNTYxLCAyMTAsICMgIDcwNAogIDk4LDEyOTUsMjU1NiwzNTcwLDUwNTksMTcxMSwyNDIwLDE0ODIsMzQ2MywzOTg3LDI5MTEsMTI1NywgMTI5LDUwNjAsMzgyMSwgNjQyLCAjICA3MjAKIDUyMywyNzg5LDI3OTAsMjY1OCw1MDYxLCAxNDEsMjIzNSwxMzMzLCAgNjgsIDE3NiwgNDQxLCA4NzYsIDkwNyw0MjIwLCA2MDMsMjYwMiwgIyAgNzM2CiA3MTAsIDE3MSwzNDY0LCA0MDQsIDU0OSwgIDE4LDMxNDMsMjM5OCwxNDEwLDM2OTIsMTY2Niw1MDYyLDM1NzEsNDUzMywyOTEyLDQ1MzQsICMgIDc1Mgo1MDYzLDI5OTEsIDM2OCw1MDY0LCAxNDYsIDM2NiwgIDk5LCA4NzEsMzY5MywxNTQzLCA3NDgsIDgwNywxNTg2LDExODUsICAyMiwyMjYzLCAjICA3NjgKIDM3OSwzODIyLDMyMTEsNTA2NSwzMjEyLCA1MDUsMTk0MiwyNjI4LDE5OTIsMTM4MiwyMzE5LDUwNjYsIDM4MCwyMzYyLCAyMTgsIDcwMiwgIyAgNzg0CjE4MTgsMTI0OCwzNDY1LDMwNDQsMzU3MiwzMzU1LDMyODIsNTA2NywyOTkyLDM2OTQsIDkzMCwzMjgzLDM4MjMsNTA2OCwgIDU5LDUwNjksICMgIDgwMAogNTg1LCA2MDEsNDIyMSwgNDk3LDM0NjYsMTExMiwxMzE0LDQ1MzUsMTgwMiw1MDcwLDEyMjMsMTQ3MiwyMTc3LDUwNzEsIDc0OSwxODM3LCAjICA4MTYKIDY5MCwxOTAwLDM4MjQsMTc3MywzOTg4LDE0NzYsIDQyOSwxMDQzLDE3OTEsMjIzNiwyMTE3LCA5MTcsNDIyMiwgNDQ3LDEwODYsMTYyOSwgIyAgODMyCjUwNzIsIDU1Niw1MDczLDUwNzQsMjAyMSwxNjU0LCA4NDQsMTA5MCwgMTA1LCA1NTAsIDk2NiwxNzU4LDI4MjgsMTAwOCwxNzgzLCA2ODYsICMgIDg0OAoxMDk1LDUwNzUsMjI4NywgNzkzLDE2MDIsNTA3NiwzNTczLDI2MDMsNDUzNiw0MjIzLDI5NDgsMjMwMiw0NTM3LDM4MjUsIDk4MCwyNTAzLCAjICA4NjQKIDU0NCwgMzUzLCA1MjcsNDUzOCwgOTA4LDI2ODcsMjkxMyw1MDc3LCAzODEsMjYyOSwxOTQzLDEzNDgsNTA3OCwxMzQxLDEyNTIsIDU2MCwgIyAgODgwCjMwOTUsNTA3OSwzNDY3LDI4NzAsNTA4MCwyMDU0LCA5NzMsIDg4NiwyMDgxLCAxNDMsNDUzOSw1MDgxLDUwODIsIDE1NywzOTg5LCA0OTYsICMgIDg5Ngo0MjI0LCAgNTcsIDg0MCwgNTQwLDIwMzksNDU0MCw0NTQxLDM0NjgsMjExOCwxNDQ1LCA5NzAsMjI2NCwxNzQ4LDE5NjYsMjA4Miw0MjI1LCAjICA5MTIKMzE0NCwxMjM0LDE3NzYsMzI4NCwyODI5LDM2OTUsIDc3MywxMjA2LDIxMzAsMTA2NiwyMDQwLDEzMjYsMzk5MCwxNzM4LDE3MjUsNDIyNiwgIyAgOTI4CiAyNzksMzE0NSwgIDUxLDE1NDQsMjYwNCwgNDIzLDE1NzgsMjEzMSwyMDY3LCAxNzMsNDU0MiwxODgwLDUwODMsNTA4NCwxNTgzLCAyNjQsICMgIDk0NAogNjEwLDM2OTYsNDU0MywyNDQ0LCAyODAsIDE1NCw1MDg1LDUwODYsNTA4NywxNzM5LCAzMzgsMTI4MiwzMDk2LCA2OTMsMjg3MSwxNDExLCAjICA5NjAKMTA3NCwzODI2LDI0NDUsNTA4OCw0NTQ0LDUwODksNTA5MCwxMjQwLCA5NTIsMjM5OSw1MDkxLDI5MTQsMTUzOCwyNjg4LCA2ODUsMTQ4MywgIyAgOTc2CjQyMjcsMjQ3NSwxNDM2LCA5NTMsNDIyOCwyMDU1LDQ1NDUsIDY3MSwyNDAwLCAgNzksNDIyOSwyNDQ2LDMyODUsIDYwOCwgNTY3LDI2ODksICMgIDk5MgozNDY5LDQyMzAsNDIzMSwxNjkxLCAzOTMsMTI2MSwxNzkyLDI0MDEsNTA5Miw0NTQ2LDUwOTMsNTA5NCw1MDk1LDUwOTYsMTM4MywxNjcyLCAjIDEwMDgKMzgyNywzMjEzLDE0NjQsIDUyMiwxMTE5LCA2NjEsMTE1MCwgMjE2LCA2NzUsNDU0NywzOTkxLDE0MzIsMzU3NCwgNjA5LDQ1NDgsMjY5MCwgIyAxMDI0CjI0MDIsNTA5Nyw1MDk4LDUwOTksNDIzMiwzMDQ1LCAgIDAsNTEwMCwyNDc2LCAzMTUsIDIzMSwyNDQ3LCAzMDEsMzM1Niw0NTQ5LDIzODUsICMgMTA0MAo1MTAxLCAyMzMsNDIzMywzNjk3LDE4MTksNDU1MCw0NTUxLDUxMDIsICA5NiwxNzc3LDEzMTUsMjA4Myw1MTAzLCAyNTcsNTEwNCwxODEwLCAjIDEwNTYKMzY5OCwyNzE4LDExMzksMTgyMCw0MjM0LDIwMjIsMTEyNCwyMTY0LDI3OTEsMTc3OCwyNjU5LDUxMDUsMzA5NywgMzYzLDE2NTUsMzIxNCwgIyAxMDcyCjUxMDYsMjk5Myw1MTA3LDUxMDgsNTEwOSwzOTkyLDE1NjcsMzk5MywgNzE4LCAxMDMsMzIxNSwgODQ5LDE0NDMsIDM0MSwzMzU3LDI5NDksICMgMTA4OAoxNDg0LDUxMTAsMTcxMiwgMTI3LCAgNjcsIDMzOSw0MjM1LDI0MDMsIDY3OSwxNDEyLCA4MjEsNTExMSw1MTEyLCA4MzQsIDczOCwgMzUxLCAjIDExMDQKMjk5NCwyMTQ3LCA4NDYsIDIzNSwxNDk3LDE4ODEsIDQxOCwxOTkzLDM4MjgsMjcxOSwgMTg2LDExMDAsMjE0OCwyNzU2LDM1NzUsMTU0NSwgIyAxMTIwCjEzNTUsMjk1MCwyODcyLDEzNzcsIDU4MywzOTk0LDQyMzYsMjU4MSwyOTk1LDUxMTMsMTI5OCwzNjk5LDEwNzgsMjU1NywzNzAwLDIzNjMsICMgMTEzNgogIDc4LDM4MjksMzgzMCwgMjY3LDEyODksMjEwMCwyMDAyLDE1OTQsNDIzNywgMzQ4LCAzNjksMTI3NCwyMTk3LDIxNzgsMTgzOCw0NTUyLCAjIDExNTIKMTgyMSwyODMwLDM3MDEsMjc1NywyMjg4LDIwMDMsNDU1MywyOTUxLDI3NTgsIDE0NCwzMzU4LCA4ODIsNDU1NCwzOTk1LDI3NTksMzQ3MCwgIyAxMTY4CjQ1NTUsMjkxNSw1MTE0LDQyMzgsMTcyNiwgMzIwLDUxMTUsMzk5NiwzMDQ2LCA3ODgsMjk5Niw1MTE2LDI4MzEsMTc3NCwxMzI3LDI4NzMsICMgMTE4NAozOTk3LDI4MzIsNTExNywxMzA2LDQ1NTYsMjAwNCwxNzAwLDM4MzEsMzU3NiwyMzY0LDI2NjAsIDc4NywyMDIzLCA1MDYsIDgyNCwzNzAyLCAjIDEyMDAKIDUzNCwgMzIzLDQ1NTcsMTA0NCwzMzU5LDIwMjQsMTkwMSwgOTQ2LDM0NzEsNTExOCwxNzc5LDE1MDAsMTY3OCw1MTE5LDE4ODIsNDU1OCwgIyAxMjE2CiAxNjUsIDI0Myw0NTU5LDM3MDMsMjUyOCwgMTIzLCA2ODMsNDIzOSwgNzY0LDQ1NjAsICAzNiwzOTk4LDE3OTMsIDU4OSwyOTE2LCA4MTYsICMgMTIzMgogNjI2LDE2NjcsMzA0NywyMjM3LDE2MzksMTU1NSwxNjIyLDM4MzIsMzk5OSw1MTIwLDQwMDAsMjg3NCwxMzcwLDEyMjgsMTkzMywgODkxLCAjIDEyNDgKMjA4NCwyOTE3LCAzMDQsNDI0MCw1MTIxLCAyOTIsMjk5NywyNzIwLDM1NzcsIDY5MSwyMTAxLDQyNDEsMTExNSw0NTYxLCAxMTgsIDY2MiwgIyAxMjY0CjUxMjIsIDYxMSwxMTU2LCA4NTQsMjM4NiwxMzE2LDI4NzUsICAgMiwgMzg2LCA1MTUsMjkxOCw1MTIzLDUxMjQsMzI4NiwgODY4LDIyMzgsICMgMTI4MAoxNDg2LCA4NTUsMjY2MSwgNzg1LDIyMTYsMzA0OCw1MTI1LDEwNDAsMzIxNiwzNTc4LDUxMjYsMzE0NiwgNDQ4LDUxMjcsMTUyNSw1MTI4LCAjIDEyOTYKMjE2NSw0NTYyLDUxMjksMzgzMyw1MTMwLDQyNDIsMjgzMywzNTc5LDMxNDcsIDUwMywgODE4LDQwMDEsMzE0OCwxNTY4LCA4MTQsIDY3NiwgIyAxMzEyCjE0NDQsIDMwNiwxNzQ5LDUxMzEsMzgzNCwxNDE2LDEwMzAsIDE5NywxNDI4LCA4MDUsMjgzNCwxNTAxLDQ1NjMsNTEzMiw1MTMzLDUxMzQsICMgMTMyOAoxOTk0LDUxMzUsNDU2NCw1MTM2LDUxMzcsMjE5OCwgIDEzLDI3OTIsMzcwNCwyOTk4LDMxNDksMTIyOSwxOTE3LDUxMzgsMzgzNSwyMTMyLCAjIDEzNDQKNTEzOSw0MjQzLDQ1NjUsMjQwNCwzNTgwLDUxNDAsMjIxNywxNTExLDE3MjcsMTEyMCw1MTQxLDUxNDIsIDY0NiwzODM2LDI0NDgsIDMwNywgIyAxMzYwCjUxNDMsNTE0NCwxNTk1LDMyMTcsNTE0NSw1MTQ2LDUxNDcsMzcwNSwxMTEzLDEzNTYsNDAwMiwxNDY1LDI1MjksMjUzMCw1MTQ4LCA1MTksICMgMTM3Ngo1MTQ5LCAxMjgsMjEzMywgIDkyLDIyODksMTk4MCw1MTUwLDQwMDMsMTUxMiwgMzQyLDMxNTAsMjE5OSw1MTUxLDI3OTMsMjIxOCwxOTgxLCAjIDEzOTIKMzM2MCw0MjQ0LCAyOTAsMTY1NiwxMzE3LCA3ODksIDgyNywyMzY1LDUxNTIsMzgzNyw0NTY2LCA1NjIsIDU4MSw0MDA0LDUxNTMsIDQwMSwgIyAxNDA4CjQ1NjcsMjI1MiwgIDk0LDQ1NjgsNTE1NCwxMzk5LDI3OTQsNTE1NSwxNDYzLDIwMjUsNDU2OSwzMjE4LDE5NDQsNTE1NiwgODI4LDExMDUsICMgMTQyNAo0MjQ1LDEyNjIsMTM5NCw1MTU3LDQyNDYsIDYwNSw0NTcwLDUxNTgsMTc4NCwyODc2LDUxNTksMjgzNSwgODE5LDIxMDIsIDU3OCwyMjAwLCAjIDE0NDAKMjk1Miw1MTYwLDE1MDIsIDQzNiwzMjg3LDQyNDcsMzI4OCwyODM2LDQwMDUsMjkxOSwzNDcyLDM0NzMsNTE2MSwyNzIxLDIzMjAsNTE2MiwgIyAxNDU2CjUxNjMsMjMzNywyMDY4LCAgMjMsNDU3MSwgMTkzLCA4MjYsMzgzOCwyMTAzLCA2OTksMTYzMCw0MjQ4LDMwOTgsIDM5MCwxNzk0LDEwNjQsICMgMTQ3MgozNTgxLDUxNjQsMTU3OSwzMDk5LDMxMDAsMTQwMCw1MTY1LDQyNDksMTgzOSwxNjQwLDI4NzcsNTE2Niw0NTcyLDQ1NzMsIDEzNyw0MjUwLCAjIDE0ODgKIDU5OCwzMTAxLDE5NjcsIDc4MCwgMTA0LCA5NzQsMjk1Myw1MTY3LCAyNzgsIDg5OSwgMjUzLCA0MDIsIDU3MiwgNTA0LCA0OTMsMTMzOSwgIyAxNTA0CjUxNjgsNDAwNiwxMjc1LDQ1NzQsMjU4MiwyNTU4LDUxNjksMzcwNiwzMDQ5LDMxMDIsMjI1MywgNTY1LDEzMzQsMjcyMiwgODYzLCAgNDEsICMgMTUyMAo1MTcwLDUxNzEsNDU3NSw1MTcyLDE2NTcsMjMzOCwgIDE5LCA0NjMsMjc2MCw0MjUxLCA2MDYsNTE3MywyOTk5LDMyODksMTA4NywyMDg1LCAjIDE1MzYKMTMyMywyNjYyLDMwMDAsNTE3NCwxNjMxLDE2MjMsMTc1MCw0MjUyLDI2OTEsNTE3NSwyODc4LCA3OTEsMjcyMywyNjYzLDIzMzksIDIzMiwgIyAxNTUyCjI0MjEsNTE3NiwzMDAxLDE0OTgsNTE3NywyNjY0LDI2MzAsIDc1NSwxMzY2LDM3MDcsMzI5MCwzMTUxLDIwMjYsMTYwOSwgMTE5LDE5MTgsICMgMTU2OAozNDc0LCA4NjIsMTAyNiw0MjUzLDUxNzgsNDAwNywzODM5LDQ1NzYsNDAwOCw0NTc3LDIyNjUsMTk1MiwyNDc3LDUxNzksMTEyNSwgODE3LCAjIDE1ODQKNDI1NCw0MjU1LDQwMDksMTUxMywxNzY2LDIwNDEsMTQ4Nyw0MjU2LDMwNTAsMzI5MSwyODM3LDM4NDAsMzE1Miw1MTgwLDUxODEsMTUwNywgIyAxNjAwCjUxODIsMjY5MiwgNzMzLCAgNDAsMTYzMiwxMTA2LDI4NzksIDM0NSw0MjU3LCA4NDEsMjUzMSwgMjMwLDQ1NzgsMzAwMiwxODQ3LDMyOTIsICMgMTYxNgozNDc1LDUxODMsMTI2MywgOTg2LDM0NzYsNTE4NCwgNzM1LCA4NzksIDI1NCwxMTM3LCA4NTcsIDYyMiwxMzAwLDExODAsMTM4OCwxNTYyLCAjIDE2MzIKNDAxMCw0MDExLDI5NTQsIDk2NywyNzYxLDI2NjUsMTM0OSwgNTkyLDIxMzQsMTY5MiwzMzYxLDMwMDMsMTk5NSw0MjU4LDE2NzksNDAxMiwgIyAxNjQ4CjE5MDIsMjE4OCw1MTg1LCA3MzksMzcwOCwyNzI0LDEyOTYsMTI5MCw1MTg2LDQyNTksMjIwMSwyMjAyLDE5MjIsMTU2MywyNjA1LDI1NTksICMgMTY2NAoxODcxLDI3NjIsMzAwNCw1MTg3LCA0MzUsNTE4OCwgMzQzLDExMDgsIDU5NiwgIDE3LDE3NTEsNDU3OSwyMjM5LDM0NzcsMzcwOSw1MTg5LCAjIDE2ODAKNDU4MCwgMjk0LDM1ODIsMjk1NSwxNjkzLCA0NzcsIDk3OSwgMjgxLDIwNDIsMzU4MywgNjQzLDIwNDMsMzcxMCwyNjMxLDI3OTUsMjI2NiwgIyAxNjk2CjEwMzEsMjM0MCwyMTM1LDIzMDMsMzU4NCw0NTgxLCAzNjcsMTI0OSwyNTYwLDUxOTAsMzU4NSw1MTkxLDQ1ODIsMTI4MywzMzYyLDIwMDUsICMgMTcxMgogMjQwLDE3NjIsMzM2Myw0NTgzLDQ1ODQsIDgzNiwxMDY5LDMxNTMsIDQ3NCw1MTkyLDIxNDksMjUzMiwgMjY4LDM1ODYsNTE5MywzMjE5LCAjIDE3MjgKMTUyMSwxMjg0LDUxOTQsMTY1OCwxNTQ2LDQyNjAsNTE5NSwzNTg3LDM1ODgsNTE5Niw0MjYxLDMzNjQsMjY5MywxNjg1LDQyNjIsIDk2MSwgIyAxNzQ0CjE2NzMsMjYzMiwgMTkwLDIwMDYsMjIwMywzODQxLDQ1ODUsNDU4Niw1MTk3LCA1NzAsMjUwNCwzNzExLDE0OTAsNTE5OCw0NTg3LDI2MzMsICMgMTc2MAozMjkzLDE5NTcsNDU4OCwgNTg0LDE1MTQsIDM5NiwxMDQ1LDE5NDUsNTE5OSw0NTg5LDE5NjgsMjQ0OSw1MjAwLDUyMDEsNDU5MCw0MDEzLCAjIDE3NzYKIDYxOSw1MjAyLDMxNTQsMzI5NCwgMjE1LDIwMDcsMjc5NiwyNTYxLDMyMjAsNDU5MSwzMjIxLDQ1OTIsIDc2Myw0MjYzLDM4NDIsNDU5MywgIyAxNzkyCjUyMDMsNTIwNCwxOTU4LDE3NjcsMjk1NiwzMzY1LDM3MTIsMTE3NCwgNDUyLDE0NzcsNDU5NCwzMzY2LDMxNTUsNTIwNSwyODM4LDEyNTMsICMgMTgwOAoyMzg3LDIxODksMTA5MSwyMjkwLDQyNjQsIDQ5Miw1MjA2LCA2MzgsMTE2OSwxODI1LDIxMzYsMTc1Miw0MDE0LCA2NDgsIDkyNiwxMDIxLCAjIDE4MjQKMTMyNCw0NTk1LCA1MjAsNDU5NiwgOTk3LCA4NDcsMTAwNywgODkyLDQ1OTcsMzg0MywyMjY3LDE4NzIsMzcxMywyNDA1LDE3ODUsNDU5OCwgIyAxODQwCjE5NTMsMjk1NywzMTAzLDMyMjIsMTcyOCw0MjY1LDIwNDQsMzcxNCw0NTk5LDIwMDgsMTcwMSwzMTU2LDE1NTEsICAzMCwyMjY4LDQyNjYsICMgMTg1Ngo1MjA3LDIwMjcsNDYwMCwzNTg5LDUyMDgsIDUwMSw1MjA5LDQyNjcsIDU5NCwzNDc4LDIxNjYsMTgyMiwzNTkwLDM0NzksMzU5MSwzMjIzLCAjIDE4NzIKIDgyOSwyODM5LDQyNjgsNTIxMCwxNjgwLDMxNTcsMTIyNSw0MjY5LDUyMTEsMzI5NSw0NjAxLDQyNzAsMzE1OCwyMzQxLDUyMTIsNDYwMiwgIyAxODg4CjQyNzEsNTIxMyw0MDE1LDQwMTYsNTIxNCwxODQ4LDIzODgsMjYwNiwzMzY3LDUyMTUsNDYwMywgMzc0LDQwMTcsIDY1Miw0MjcyLDQyNzMsICMgMTkwNAogMzc1LDExNDAsIDc5OCw1MjE2LDUyMTcsNTIxOCwyMzY2LDQ2MDQsMjI2OSwgNTQ2LDE2NTksIDEzOCwzMDUxLDI0NTAsNDYwNSw1MjE5LCAjIDE5MjAKMjI1NCwgNjEyLDE4NDksIDkxMCwgNzk2LDM4NDQsMTc0MCwxMzcxLCA4MjUsMzg0NSwzODQ2LDUyMjAsMjkyMCwyNTYyLDUyMjEsIDY5MiwgIyAxOTM2CiA0NDQsMzA1MiwyNjM0LCA4MDEsNDYwNiw0Mjc0LDUyMjIsMTQ5MSwgMjQ0LDEwNTMsMzA1Myw0Mjc1LDQyNzYsIDM0MCw1MjIzLDQwMTgsICMgMTk1MgoxMDQxLDMwMDUsIDI5MywxMTY4LCAgODcsMTM1Nyw1MjI0LDE1MzksIDk1OSw1MjI1LDIyNDAsIDcyMSwgNjk0LDQyNzcsMzg0NywgMjE5LCAjIDE5NjgKMTQ3OCwgNjQ0LDE0MTcsMzM2OCwyNjY2LDE0MTMsMTQwMSwxMzM1LDEzODksNDAxOSw1MjI2LDUyMjcsMzAwNiwyMzY3LDMxNTksMTgyNiwgIyAxOTg0CiA3MzAsMTUxNSwgMTg0LDI4NDAsICA2Niw0NjA3LDUyMjgsMTY2MCwyOTU4LCAyNDYsMzM2OSwgMzc4LDE0NTcsIDIyNiwzNDgwLCA5NzUsICMgMjAwMAo0MDIwLDI5NTksMTI2NCwzNTkyLCA2NzQsIDY5Niw1MjI5LCAxNjMsNTIzMCwxMTQxLDI0MjIsMjE2NywgNzEzLDM1OTMsMzM3MCw0NjA4LCAjIDIwMTYKNDAyMSw1MjMxLDUyMzIsMTE4NiwgIDE1LDUyMzMsMTA3OSwxMDcwLDUyMzQsMTUyMiwzMjI0LDM1OTQsIDI3NiwxMDUwLDI3MjUsIDc1OCwgIyAyMDMyCjExMjYsIDY1MywyOTYwLDMyOTYsNTIzNSwyMzQyLCA4ODksMzU5NSw0MDIyLDMxMDQsMzAwNywgOTAzLDEyNTAsNDYwOSw0MDIzLDM0ODEsICMgMjA0OAozNTk2LDEzNDIsMTY4MSwxNzE4LCA3NjYsMzI5NywgMjg2LCAgODksMjk2MSwzNzE1LDUyMzYsMTcxMyw1MjM3LDI2MDcsMzM3MSwzMDA4LCAjIDIwNjQKNTIzOCwyOTYyLDIyMTksMzIyNSwyODgwLDUyMzksNDYxMCwyNTA1LDI1MzMsIDE4MSwgMzg3LDEwNzUsNDAyNCwgNzMxLDIxOTAsMzM3MiwgIyAyMDgwCjUyNDAsMzI5OCwgMzEwLCAzMTMsMzQ4MiwyMzA0LCA3NzAsNDI3OCwgIDU0LDMwNTQsIDE4OSw0NjExLDMxMDUsMzg0OCw0MDI1LDUyNDEsICMgMjA5NgoxMjMwLDE2MTcsMTg1MCwgMzU1LDM1OTcsNDI3OSw0NjEyLDMzNzMsIDExMSw0MjgwLDM3MTYsMTM1MCwzMTYwLDM0ODMsMzA1NSw0MjgxLCAjIDIxMTIKMjE1MCwzMjk5LDM1OTgsNTI0MiwyNzk3LDQwMjYsNDAyNywzMDA5LCA3MjIsMjAwOSw1MjQzLDEwNzEsIDI0NywxMjA3LDIzNDMsMjQ3OCwgIyAyMTI4CjEzNzgsNDYxMywyMDEwLCA4NjQsMTQzNywxMjE0LDQ2MTQsIDM3MywzODQ5LDExNDIsMjIyMCwgNjY3LDQ2MTUsIDQ0MiwyNzYzLDI1NjMsICMgMjE0NAozODUwLDQwMjgsMTk2OSw0MjgyLDMzMDAsMTg0MCwgODM3LCAxNzAsMTEwNywgOTM0LDEzMzYsMTg4Myw1MjQ0LDUyNDUsMjExOSw0MjgzLCAjIDIxNjAKMjg0MSwgNzQzLDE1NjksNTI0Niw0NjE2LDQyODQsIDU4MiwyMzg5LDE0MTgsMzQ4NCw1MjQ3LDE4MDMsNTI0OCwgMzU3LDEzOTUsMTcyOSwgIyAyMTc2CjM3MTcsMzMwMSwyNDIzLDE1NjQsMjI0MSw1MjQ5LDMxMDYsMzg1MSwxNjMzLDQ2MTcsMTExNCwyMDg2LDQyODUsMTUzMiw1MjUwLCA0ODIsICMgMjE5MgoyNDUxLDQ2MTgsNTI1MSw1MjUyLDE0OTIsIDgzMywxNDY2LDUyNTMsMjcyNiwzNTk5LDE2NDEsMjg0Miw1MjU0LDE1MjYsMTI3MiwzNzE4LCAjIDIyMDgKNDI4NiwxNjg2LDE3OTUsIDQxNiwyNTY0LDE5MDMsMTk1NCwxODA0LDUyNTUsMzg1MiwyNzk4LDM4NTMsMTE1OSwyMzIxLDUyNTYsMjg4MSwgIyAyMjI0CjQ2MTksMTYxMCwxNTg0LDMwNTYsMjQyNCwyNzY0LCA0NDMsMzMwMiwxMTYzLDMxNjEsNTI1Nyw1MjU4LDQwMjksNTI1OSw0Mjg3LDI1MDYsICMgMjI0MAozMDU3LDQ2MjAsNDAzMCwzMTYyLDIxMDQsMTY0NywzNjAwLDIwMTEsMTg3Myw0Mjg4LDUyNjAsNDI4OSwgNDMxLDM0ODUsNTI2MSwgMjUwLCAjIDIyNTYKICA5NywgIDgxLDQyOTAsNTI2MiwxNjQ4LDE4NTEsMTU1OCwgMTYwLCA4NDgsNTI2MywgODY2LCA3NDAsMTY5NCw1MjY0LDIyMDQsMjg0MywgIyAyMjcyCjMyMjYsNDI5MSw0NjIxLDM3MTksMTY4NywgOTUwLDI0NzksIDQyNiwgNDY5LDMyMjcsMzcyMCwzNzIxLDQwMzEsNTI2NSw1MjY2LDExODgsICMgMjI4OAogNDI0LDE5OTYsIDg2MSwzNjAxLDQyOTIsMzg1NCwyMjA1LDI2OTQsIDE2OCwxMjM1LDM2MDIsNDI5Myw1MjY3LDIwODcsMTY3NCw0NjIyLCAjIDIzMDQKMzM3NCwzMzAzLCAyMjAsMjU2NSwxMDA5LDUyNjgsMzg1NSwgNjcwLDMwMTAsIDMzMiwxMjA4LCA3MTcsNTI2OSw1MjcwLDM2MDMsMjQ1MiwgIyAyMzIwCjQwMzIsMzM3NSw1MjcxLCA1MTMsNTI3MiwxMjA5LDI4ODIsMzM3NiwzMTYzLDQ2MjMsMTA4MCw1MjczLDUyNzQsNTI3NSw1Mjc2LDI1MzQsICMgMjMzNgozNzIyLDM2MDQsIDgxNSwxNTg3LDQwMzMsNDAzNCw1Mjc3LDM2MDUsMzQ4NiwzODU2LDEyNTQsNDYyNCwxMzI4LDMwNTgsMTM5MCw0MDM1LCAjIDIzNTIKMTc0MSw0MDM2LDM4NTcsNDAzNyw1Mjc4LCAyMzYsMzg1OCwyNDUzLDMzMDQsNTI3OSw1MjgwLDM3MjMsMzg1OSwxMjczLDM4NjAsNDYyNSwgIyAyMzY4CjUyODEsIDMwOCw1MjgyLDQ2MjYsIDI0NSw0NjI3LDE4NTIsMjQ4MCwxMzA3LDI1ODMsIDQzMCwgNzE1LDIxMzcsMjQ1NCw1MjgzLCAyNzAsICMgMjM4NAogMTk5LDI4ODMsNDAzOCw1Mjg0LDM2MDYsMjcyNywxNzUzLCA3NjEsMTc1NCwgNzI1LDE2NjEsMTg0MSw0NjI4LDM0ODcsMzcyNCw1Mjg1LCAjIDI0MDAKNTI4NiwgNTg3LCAgMTQsMzMwNSwgMjI3LDI2MDgsIDMyNiwgNDgwLDIyNzAsIDk0MywyNzY1LDM2MDcsIDI5MSwgNjUwLDE4ODQsNTI4NywgIyAyNDE2CjE3MDIsMTIyNiwgMTAyLDE1NDcsICA2MiwzNDg4LCA5MDQsNDYyOSwzNDg5LDExNjQsNDI5NCw1Mjg4LDUyODksMTIyNCwxNTQ4LDI3NjYsICMgMjQzMgogMzkxLCA0OTgsMTQ5Myw1MjkwLDEzODYsMTQxOSw1MjkxLDIwNTYsMTE3Nyw0NjMwLCA4MTMsIDg4MCwxMDgxLDIzNjgsIDU2NiwxMTQ1LCAjIDI0NDgKNDYzMSwyMjkxLDEwMDEsMTAzNSwyNTY2LDI2MDksMjI0MiwgMzk0LDEyODYsNTI5Miw1MjkzLDIwNjksNTI5NCwgIDg2LDE0OTQsMTczMCwgIyAyNDY0CjQwMzksIDQ5MSwxNTg4LCA3NDUsIDg5NywyOTYzLCA4NDMsMzM3Nyw0MDQwLDI3NjcsMjg4NCwzMzA2LDE3NjgsIDk5OCwyMjIxLDIwNzAsICMgMjQ4MAogMzk3LDE4MjcsMTE5NSwxOTcwLDM3MjUsMzAxMSwzMzc4LCAyODQsNTI5NSwzODYxLDI1MDcsMjEzOCwyMTIwLDE5MDQsNTI5Niw0MDQxLCAjIDI0OTYKMjE1MSw0MDQyLDQyOTUsMTAzNiwzNDkwLDE5MDUsIDExNCwyNTY3LDQyOTYsIDIwOSwxNTI3LDUyOTcsNTI5OCwyOTY0LDI4NDQsMjYzNSwgIyAyNTEyCjIzOTAsMjcyOCwzMTY0LCA4MTIsMjU2OCw1Mjk5LDMzMDcsNTMwMCwxNTU5LCA3MzcsMTg4NSwzNzI2LDEyMTAsIDg4NSwgIDI4LDI2OTUsICMgMjUyOAozNjA4LDM4NjIsNTMwMSw0Mjk3LDEwMDQsMTc4MCw0NjMyLDUzMDIsIDM0NiwxOTgyLDIyMjIsMjY5Niw0NjMzLDM4NjMsMTc0MiwgNzk3LCAjIDI1NDQKMTY0Miw0MDQzLDE5MzQsMTA3MiwxMzg0LDIxNTIsIDg5Niw0MDQ0LDMzMDgsMzcyNywzMjI4LDI4ODUsMzYwOSw1MzAzLDI1NjksMTk1OSwgIyAyNTYwCjQ2MzQsMjQ1NSwxNzg2LDUzMDQsNTMwNSw1MzA2LDQwNDUsNDI5OCwxMDA1LDEzMDgsMzcyOCw0Mjk5LDI3MjksNDYzNSw0NjM2LDE1MjgsICMgMjU3NgoyNjEwLCAxNjEsMTE3OCw0MzAwLDE5ODMsIDk4Nyw0NjM3LDExMDEsNDMwMSwgNjMxLDQwNDYsMTE1NywzMjI5LDI0MjUsMTM0MywxMjQxLCAjIDI1OTIKMTAxNiwyMjQzLDI1NzAsIDM3MiwgODc3LDIzNDQsMjUwOCwxMTYwLCA1NTUsMTkzNSwgOTExLDQwNDcsNTMwNywgNDY2LDExNzAsIDE2OSwgIyAyNjA4CjEwNTEsMjkyMSwyNjk3LDM3MjksMjQ4MSwzMDEyLDExODIsMjAxMiwyNTcxLDEyNTEsMjYzNiw1MzA4LCA5OTIsMjM0NSwzNDkxLDE1NDAsICMgMjYyNAoyNzMwLDEyMDEsMjA3MSwyNDA2LDE5OTcsMjQ4Miw1MzA5LDQ2MzgsIDUyOCwxOTIzLDIxOTEsMTUwMywxODc0LDE1NzAsMjM2OSwzMzc5LCAjIDI2NDAKMzMwOSw1MzEwLCA1NTcsMTA3Myw1MzExLDE4MjgsMzQ5MiwyMDg4LDIyNzEsMzE2NSwzMDU5LDMxMDcsIDc2NywzMTA4LDI3OTksNDYzOSwgIyAyNjU2CjEwMDYsNDMwMiw0NjQwLDIzNDYsMTI2NywyMTc5LDM3MzAsMzIzMCwgNzc4LDQwNDgsMzIzMSwyNzMxLDE1OTcsMjY2Nyw1MzEyLDQ2NDEsICMgMjY3Mgo1MzEzLDM0OTMsNTMxNCw1MzE1LDUzMTYsMzMxMCwyNjk4LDE0MzMsMzMxMSwgMTMxLCAgOTUsMTUwNCw0MDQ5LCA3MjMsNDMwMywzMTY2LCAjIDI2ODgKMTg0MiwzNjEwLDI3NjgsMjE5Miw0MDUwLDIwMjgsMjEwNSwzNzMxLDUzMTcsMzAxMyw0MDUxLDEyMTgsNTMxOCwzMzgwLDMyMzIsNDA1MiwgIyAyNzA0CjQzMDQsMjU4NCwgMjQ4LDE2MzQsMzg2NCwgOTEyLDUzMTksMjg0NSwzNzMyLDMwNjAsMzg2NSwgNjU0LCAgNTMsNTMyMCwzMDE0LDUzMjEsICMgMjcyMAoxNjg4LDQ2NDIsIDc3NywzNDk0LDEwMzIsNDA1MywxNDI1LDUzMjIsIDE5MSwgODIwLDIxMjEsMjg0NiwgOTcxLDQ2NDMsIDkzMSwzMjMzLCAjIDI3MzYKIDEzNSwgNjY0LCA3ODMsMzg2NiwxOTk4LCA3NzIsMjkyMiwxOTM2LDQwNTQsMzg2Nyw0NjQ0LDI5MjMsMzIzNCwgMjgyLDI3MzIsIDY0MCwgIyAyNzUyCjEzNzIsMzQ5NSwxMTI3LCA5MjIsIDMyNSwzMzgxLDUzMjMsNTMyNCwgNzExLDIwNDUsNTMyNSw1MzI2LDQwNTUsMjIyMywyODAwLDE5MzcsICMgMjc2OAo0MDU2LDMzODIsMjIyNCwyMjU1LDM4NjgsMjMwNSw1MzI3LDQ2NDUsMzg2OSwxMjU4LDMzMTIsNDA1NywzMjM1LDIxMzksMjk2NSw0MDU4LCAjIDI3ODQKNDA1OSw1MzI4LDIyMjUsIDI1OCwzMjM2LDQ2NDYsIDEwMSwxMjI3LDUzMjksMzMxMywxNzU1LDUzMzAsMTM5MSwzMzE0LDUzMzEsMjkyNCwgIyAyODAwCjIwNTcsIDg5Myw1MzMyLDUzMzMsNTMzNCwxNDAyLDQzMDUsMjM0Nyw1MzM1LDUzMzYsMzIzNywzNjExLDUzMzcsNTMzOCwgODc4LDEzMjUsICMgMjgxNgoxNzgxLDI4MDEsNDY0NywgMjU5LDEzODUsMjU4NSwgNzQ0LDExODMsMjI3Miw0NjQ4LDUzMzksNDA2MCwyNTA5LDUzNDAsIDY4NCwxMDI0LCAjIDI4MzIKNDMwNiw1MzQxLCA0NzIsMzYxMiwzNDk2LDExNjUsMzMxNSw0MDYxLDQwNjIsIDMyMiwyMTUzLCA4ODEsIDQ1NSwxNjk1LDExNTIsMTM0MCwgIyAyODQ4CiA2NjAsIDU1NCwyMTU0LDQ2NDksMTA1OCw0NjUwLDQzMDcsIDgzMCwxMDY1LDMzODMsNDA2Myw0NjUxLDE5MjQsNTM0MiwxNzAzLDE5MTksICMgMjg2NAo1MzQzLCA5MzIsMjI3MywgMTIyLDUzNDQsNDY1MiwgOTQ3LCA2NzcsNTM0NSwzODcwLDI2MzcsIDI5NywxOTA2LDE5MjUsMjI3NCw0NjUzLCAjIDI4ODAKMjMyMiwzMzE2LDUzNDYsNTM0Nyw0MzA4LDUzNDgsNDMwOSwgIDg0LDQzMTAsIDExMiwgOTg5LDUzNDksIDU0NywxMDU5LDQwNjQsIDcwMSwgIyAyODk2CjM2MTMsMTAxOSw1MzUwLDQzMTEsNTM1MSwzNDk3LCA5NDIsIDYzOSwgNDU3LDIzMDYsMjQ1NiwgOTkzLDI5NjYsIDQwNywgODUxLCA0OTQsICMgMjkxMgo0NjU0LDMzODQsIDkyNyw1MzUyLDEyMzcsNTM1MywyNDI2LDMzODUsIDU3Myw0MzEyLCA2ODAsIDkyMSwyOTI1LDEyNzksMTg3NSwgMjg1LCAjIDI5MjgKIDc5MCwxNDQ4LDE5ODQsIDcxOSwyMTY4LDUzNTQsNTM1NSw0NjU1LDQwNjUsNDA2NiwxNjQ5LDUzNTYsMTU0MSwgNTYzLDUzNTcsMTA3NywgIyAyOTQ0CjUzNTgsMzM4NiwzMDYxLDM0OTgsIDUxMSwzMDE1LDQwNjcsNDA2OCwzNzMzLDQwNjksMTI2OCwyNTcyLDMzODcsMzIzOCw0NjU2LDQ2NTcsICMgMjk2MAo1MzU5LCA1MzUsMTA0OCwxMjc2LDExODksMjkyNiwyMDI5LDMxNjcsMTQzOCwxMzczLDI4NDcsMjk2NywxMTM0LDIwMTMsNTM2MCw0MzEzLCAjIDI5NzYKMTIzOCwyNTg2LDMxMDksMTI1OSw1MzYxLCA3MDAsNTM2MiwyOTY4LDMxNjgsMzczNCw0MzE0LDUzNjMsNDMxNSwxMTQ2LDE4NzYsMTkwNywgIyAyOTkyCjQ2NTgsMjYxMSw0MDcwLCA3ODEsMjQyNywgMTMyLDE1ODksIDIwMywgMTQ3LCAyNzMsMjgwMiwyNDA3LCA4OTgsMTc4NywyMTU1LDQwNzEsICMgMzAwOAo0MDcyLDUzNjQsMzg3MSwyODAzLDUzNjUsNTM2Niw0NjU5LDQ2NjAsNTM2NywzMjM5LDUzNjgsMTYzNSwzODcyLCA5NjUsNTM2OSwxODA1LCAjIDMwMjQKMjY5OSwxNTE2LDM2MTQsMTEyMSwxMDgyLDEzMjksMzMxNyw0MDczLDE0NDksMzg3MywgIDY1LDExMjgsMjg0OCwyOTI3LDI3NjksMTU5MCwgIyAzMDQwCjM4NzQsNTM3MCw1MzcxLCAgMTIsMjY2OCwgIDQ1LCA5NzYsMjU4NywzMTY5LDQ2NjEsIDUxNywyNTM1LDEwMTMsMTAzNywzMjQwLDUzNzIsICMgMzA1NgozODc1LDI4NDksNTM3MywzODc2LDUzNzQsMzQ5OSw1Mzc1LDI2MTIsIDYxNCwxOTk5LDIzMjMsMzg3NywzMTEwLDI3MzMsMjYzOCw1Mzc2LCAjIDMwNzIKMjU4OCw0MzE2LCA1OTksMTI2OSw1Mzc3LDE4MTEsMzczNSw1Mzc4LDI3MDAsMzExMSwgNzU5LDEwNjAsIDQ4OSwxODA2LDMzODgsMzMxOCwgIyAzMDg4CjEzNTgsNTM3OSw1MzgwLDIzOTEsMTM4NywxMjE1LDI2MzksMjI1NiwgNDkwLDUzODEsNTM4Miw0MzE3LDE3NTksMjM5MiwyMzQ4LDUzODMsICMgMzEwNAo0NjYyLDM4NzgsMTkwOCw0MDc0LDI2NDAsMTgwNywzMjQxLDQ2NjMsMzUwMCwzMzE5LDI3NzAsMjM0OSwgODc0LDUzODQsNTM4NSwzNTAxLCAjIDMxMjAKMzczNiwxODU5LCAgOTEsMjkyOCwzNzM3LDMwNjIsMzg3OSw0NjY0LDUzODYsMzE3MCw0MDc1LDI2NjksNTM4NywzNTAyLDEyMDIsMTQwMywgIyAzMTM2CjM4ODAsMjk2OSwyNTM2LDE1MTcsMjUxMCw0NjY1LDM1MDMsMjUxMSw1Mzg4LDQ2NjYsNTM4OSwyNzAxLDE4ODYsMTQ5NSwxNzMxLDQwNzYsICMgMzE1MgoyMzcwLDQ2NjcsNTM5MCwyMDMwLDUzOTEsNTM5Miw0MDc3LDI3MDIsMTIxNiwgMjM3LDI1ODksNDMxOCwyMzI0LDQwNzgsMzg4MSw0NjY4LCAjIDMxNjgKNDY2OSwyNzAzLDM2MTUsMzUwNCwgNDQ1LDQ2NzAsNTM5Myw1Mzk0LDUzOTUsNTM5NiwyNzcxLCAgNjEsNDA3OSwzNzM4LDE4MjMsNDA4MCwgIyAzMTg0CjUzOTcsIDY4NywyMDQ2LCA5MzUsIDkyNSwgNDA1LDI2NzAsIDcwMywxMDk2LDE4NjAsMjczNCw0NjcxLDQwODEsMTg3NywxMzY3LDI3MDQsICMgMzIwMAozMzg5LCA5MTgsMjEwNiwxNzgyLDI0ODMsIDMzNCwzMzIwLDE2MTEsMTA5Myw0NjcyLCA1NjQsMzE3MSwzNTA1LDM3MzksMzM5MCwgOTQ1LCAjIDMyMTYKMjY0MSwyMDU4LDQ2NzMsNTM5OCwxOTI2LCA4NzIsNDMxOSw1Mzk5LDM1MDYsMjcwNSwzMTEyLCAzNDksNDMyMCwzNzQwLDQwODIsNDY3NCwgIyAzMjMyCjM4ODIsNDMyMSwzNzQxLDIxNTYsNDA4Myw0Njc1LDQ2NzYsNDMyMiw0Njc3LDI0MDgsMjA0NywgNzgyLDQwODQsIDQwMCwgMjUxLDQzMjMsICMgMzI0OAoxNjI0LDU0MDAsNTQwMSwgMjc3LDM3NDIsIDI5OSwxMjY1LCA0NzYsMTE5MSwzODgzLDIxMjIsNDMyNCw0MzI1LDExMDksIDIwNSw1NDAyLCAjIDMyNjQKMjU5MCwxMDAwLDIxNTcsMzYxNiwxODYxLDU0MDMsNTQwNCw1NDA1LDQ2NzgsNTQwNiw0Njc5LDI1NzMsIDEwNywyNDg0LDIxNTgsNDA4NSwgIyAzMjgwCjM1MDcsMzE3Miw1NDA3LDE1MzMsIDU0MSwxMzAxLCAxNTgsIDc1Myw0MzI2LDI4ODYsMzYxNyw1NDA4LDE2OTYsIDM3MCwxMDg4LDQzMjcsICMgMzI5Ngo0NjgwLDM2MTgsIDU3OSwgMzI3LCA0NDAsIDE2MiwyMjQ0LCAyNjksMTkzOCwxMzc0LDM1MDgsIDk2OCwzMDYzLCAgNTYsMTM5NiwzMTEzLCAjIDMzMTIKMjEwNywzMzIxLDMzOTEsNTQwOSwxOTI3LDIxNTksNDY4MSwzMDE2LDU0MTAsMzYxOSw1NDExLDU0MTIsMzc0Myw0NjgyLDI0ODUsNTQxMywgIyAzMzI4CjI4MDQsNTQxNCwxNjUwLDQ2ODMsNTQxNSwyNjEzLDU0MTYsNTQxNyw0MDg2LDI2NzEsMzM5MiwxMTQ5LDMzOTMsNDA4NywzODg0LDQwODgsICMgMzM0NAo1NDE4LDEwNzYsICA0OSw1NDE5LCA5NTEsMzI0MiwzMzIyLDMzMjMsIDQ1MCwyODUwLCA5MjAsNTQyMCwxODEyLDI4MDUsMjM3MSw0MzI4LCAjIDMzNjAKMTkwOSwxMTM4LDIzNzIsMzg4NSwzNTA5LDU0MjEsMzI0Myw0Njg0LDE5MTAsMTE0NywxNTE4LDI0MjgsNDY4NSwzODg2LDU0MjIsNDY4NiwgIyAzMzc2CjIzOTMsMjYxNCwgMjYwLDE3OTYsMzI0NCw1NDIzLDU0MjQsMzg4NywzMzI0LCA3MDgsNTQyNSwzNjIwLDE3MDQsNTQyNiwzNjIxLDEzNTEsICMgMzM5MgoxNjE4LDMzOTQsMzAxNywxODg3LCA5NDQsNDMyOSwzMzk1LDQzMzAsMzA2NCwzMzk2LDQzMzEsNTQyNywzNzQ0LCA0MjIsIDQxMywxNzE0LCAjIDM0MDgKMzMyNSwgNTAwLDIwNTksMjM1MCw0MzMyLDI0ODYsNTQyOCwxMzQ0LDE5MTEsIDk1NCw1NDI5LDE2NjgsNTQzMCw1NDMxLDQwODksMjQwOSwgIyAzNDI0CjQzMzMsMzYyMiwzODg4LDQzMzQsNTQzMiwyMzA3LDEzMTgsMjUxMiwzMTE0LCAxMzMsMzExNSwyODg3LDQ2ODcsIDYyOSwgIDMxLDI4NTEsICMgMzQ0MAoyNzA2LDM4ODksNDY4OCwgODUwLCA5NDksNDY4OSw0MDkwLDI5NzAsMTczMiwyMDg5LDQzMzUsMTQ5NiwxODUzLDU0MzMsNDA5MSwgNjIwLCAjIDM0NTYKMzI0NSwgOTgxLDEyNDIsMzc0NSwzMzk3LDE2MTksMzc0NiwxNjQzLDMzMjYsMjE0MCwyNDU3LDE5NzEsMTcxOSwzNTEwLDIxNjksNTQzNCwgIyAzNDcyCjMyNDYsNTQzNSw1NDM2LDMzOTgsMTgyOSw1NDM3LDEyNzcsNDY5MCwxNTY1LDIwNDgsNTQzOCwxNjM2LDM2MjMsMzExNiw1NDM5LCA4NjksICMgMzQ4OAoyODUyLCA2NTUsMzg5MCwzODkxLDMxMTcsNDA5MiwzMDE4LDM4OTIsMTMxMCwzNjI0LDQ2OTEsNTQ0MCw1NDQxLDU0NDIsMTczMywgNTU4LCAjIDM1MDQKNDY5MiwzNzQ3LCAzMzUsMTU0OSwzMDY1LDE3NTYsNDMzNiwzNzQ4LDE5NDYsMzUxMSwxODMwLDEyOTEsMTE5MiwgNDcwLDI3MzUsMjEwOCwgIyAzNTIwCjI4MDYsIDkxMywxMDU0LDQwOTMsNTQ0MywxMDI3LDU0NDQsMzA2Niw0MDk0LDQ2OTMsIDk4MiwyNjcyLDMzOTksMzE3MywzNTEyLDMyNDcsICMgMzUzNgozMjQ4LDE5NDcsMjgwNyw1NDQ1LCA1NzEsNDY5NCw1NDQ2LDE4MzEsNTQ0NywzNjI1LDI1OTEsMTUyMywyNDI5LDU0NDgsMjA5MCwgOTg0LCAjIDM1NTIKNDY5NSwzNzQ5LDE5NjAsNTQ0OSwzNzUwLCA4NTIsIDkyMywyODA4LDM1MTMsMzc1MSwgOTY5LDE1MTksIDk5OSwyMDQ5LDIzMjUsMTcwNSwgIyAzNTY4CjU0NTAsMzExOCwgNjE1LDE2NjIsIDE1MSwgNTk3LDQwOTUsMjQxMCwyMzI2LDEwNDksIDI3NSw0Njk2LDM3NTIsNDMzNywgNTY4LDM3NTMsICMgMzU4NAozNjI2LDI0ODcsNDMzOCwzNzU0LDU0NTEsMjQzMCwyMjc1LCA0MDksMzI0OSw1NDUyLDE1NjYsMjg4OCwzNTE0LDEwMDIsIDc2OSwyODUzLCAjIDM2MDAKIDE5NCwyMDkxLDMxNzQsMzc1NSwyMjI2LDMzMjcsNDMzOSwgNjI4LDE1MDUsNTQ1Myw1NDU0LDE3NjMsMjE4MCwzMDE5LDQwOTYsIDUyMSwgIyAzNjE2CjExNjEsMjU5MiwxNzg4LDIyMDYsMjQxMSw0Njk3LDQwOTcsMTYyNSw0MzQwLDQzNDEsIDQxMiwgIDQyLDMxMTksIDQ2NCw1NDU1LDI2NDIsICMgMzYzMgo0Njk4LDM0MDAsMTc2MCwxNTcxLDI4ODksMzUxNSwyNTM3LDEyMTksMjIwNywzODkzLDI2NDMsMjE0MSwyMzczLDQ2OTksNDcwMCwzMzI4LCAjIDM2NDgKMTY1MSwzNDAxLDM2MjcsNTQ1Niw1NDU3LDM2MjgsMjQ4OCwzNTE2LDU0NTgsMzc1Niw1NDU5LDU0NjAsMjI3NiwyMDkyLCA0NjAsNTQ2MSwgIyAzNjY0CjQ3MDEsNTQ2MiwzMDIwLCA5NjIsIDU4OCwzNjI5LCAyODksMzI1MCwyNjQ0LDExMTYsICA1Miw1NDYzLDMwNjcsMTc5Nyw1NDY0LDU0NjUsICMgMzY4MAo1NDY2LDE0NjcsNTQ2NywxNTk4LDExNDMsMzc1Nyw0MzQyLDE5ODUsMTczNCwxMDY3LDQ3MDIsMTI4MCwzNDAyLCA0NjUsNDcwMywxNTcyLCAjIDM2OTYKIDUxMCw1NDY4LDE5MjgsMjI0NSwxODEzLDE2NDQsMzYzMCw1NDY5LDQ3MDQsMzc1OCw1NDcwLDU0NzEsMjY3MywxNTczLDE1MzQsNTQ3MiwgIyAzNzEyCjU0NzMsIDUzNiwxODA4LDE3NjEsMzUxNywzODk0LDMxNzUsMjY0NSw1NDc0LDU0NzUsNTQ3Niw0NzA1LDM1MTgsMjkyOSwxOTEyLDI4MDksICMgMzcyOAo1NDc3LDMzMjksMTEyMiwgMzc3LDMyNTEsNTQ3OCwgMzYwLDU0NzksNTQ4MCw0MzQzLDE1MjksIDU1MSw1NDgxLDIwNjAsMzc1OSwxNzY5LCAjIDM3NDQKMjQzMSw1NDgyLDI5MzAsNDM0NCwzMzMwLDMxMjAsMjMyNywyMTA5LDIwMzEsNDcwNiwxNDA0LCAxMzYsMTQ2OCwxNDc5LCA2NzIsMTE3MSwgIyAzNzYwCjMyNTIsMjMwOCwgMjcxLDMxNzYsNTQ4MywyNzcyLDU0ODQsMjA1MCwgNjc4LDI3MzYsIDg2NSwxOTQ4LDQ3MDcsNTQ4NSwyMDE0LDQwOTgsICMgMzc3NgoyOTcxLDU0ODYsMjczNywyMjI3LDEzOTcsMzA2OCwzNzYwLDQ3MDgsNDcwOSwxNzM1LDI5MzEsMzQwMywzNjMxLDU0ODcsMzg5NSwgNTA5LCAjIDM3OTIKMjg1NCwyNDU4LDI4OTAsMzg5Niw1NDg4LDU0ODksMzE3NywzMTc4LDQ3MTAsNDM0NSwyNTM4LDQ3MTEsMjMwOSwxMTY2LDEwMTAsIDU1MiwgIyAzODA4CiA2ODEsMTg4OCw1NDkwLDU0OTEsMjk3MiwyOTczLDQwOTksMTI4NywxNTk2LDE4NjIsMzE3OSwgMzU4LCA0NTMsIDczNiwgMTc1LCA0NzgsICMgMzgyNAoxMTE3LCA5MDUsMTE2NywxMDk3LDU0OTIsMTg1NCwxNTMwLDU0OTMsMTcwNiw1NDk0LDIxODEsMzUxOSwyMjkyLDM3NjEsMzUyMCwzNjMyLCAjIDM4NDAKNDM0NiwyMDkzLDQzNDcsNTQ5NSwzNDA0LDExOTMsMjQ4OSw0MzQ4LDE0NTgsMjE5MywyMjA4LDE4NjMsMTg4OSwxNDIxLDMzMzEsMjkzMiwgIyAzODU2CjMwNjksMjE4MiwzNTIxLCA1OTUsMjEyMyw1NDk2LDQxMDAsNTQ5Nyw1NDk4LDQzNDksMTcwNywyNjQ2LCAyMjMsMzc2MiwxMzU5LCA3NTEsICMgMzg3MgozMTIxLCAxODMsMzUyMiw1NDk5LDI4MTAsMzAyMSwgNDE5LDIzNzQsIDYzMywgNzA0LDM4OTcsMjM5NCwgMjQxLDU1MDAsNTUwMSw1NTAyLCAjIDM4ODgKIDgzOCwzMDIyLDM3NjMsMjI3NywyNzczLDI0NTksMzg5OCwxOTM5LDIwNTEsNDEwMSwxMzA5LDMxMjIsMjI0NiwxMTgxLDU1MDMsMTEzNiwgIyAzOTA0CjIyMDksMzg5OSwyMzc1LDE0NDYsNDM1MCwyMzEwLDQ3MTIsNTUwNCw1NTA1LDQzNTEsMTA1NSwyNjE1LCA0ODQsMzc2NCw1NTA2LDQxMDIsICMgMzkyMAogNjI1LDQzNTIsMjI3OCwzNDA1LDE0OTksNDM1Myw0MTAzLDU1MDcsNDEwNCw0MzU0LDMyNTMsMjI3OSwyMjgwLDM1MjMsNTUwOCw1NTA5LCAjIDM5MzYKMjc3NCwgODA4LDI2MTYsMzc2NSwzNDA2LDQxMDUsNDM1NSwzMTIzLDI1MzksIDUyNiwzNDA3LDM5MDAsNDM1NiwgOTU1LDU1MTAsMTYyMCwgIyAzOTUyCjQzNTcsMjY0NywyNDMyLDU1MTEsMTQyOSwzNzY2LDE2NjksMTgzMiwgOTk0LCA5MjgsNTUxMiwzNjMzLDEyNjAsNTUxMyw1NTE0LDU1MTUsICMgMzk2OAoxOTQ5LDIyOTMsIDc0MSwyOTMzLDE2MjYsNDM1OCwyNzM4LDI0NjAsIDg2NywxMTg0LCAzNjIsMzQwOCwxMzkyLDU1MTYsNTUxNyw0MTA2LCAjIDM5ODQKNDM1OSwxNzcwLDE3MzYsMzI1NCwyOTM0LDQ3MTMsNDcxNCwxOTI5LDI3MDcsMTQ1OSwxMTU4LDU1MTgsMzA3MCwzNDA5LDI4OTEsMTI5MiwgIyA0MDAwCjE5MzAsMjUxMywyODU1LDM3NjcsMTk4NiwxMTg3LDIwNzIsMjAxNSwyNjE3LDQzNjAsNTUxOSwyNTc0LDI1MTQsMjE3MCwzNzY4LDI0OTAsICMgNDAxNgozMzMyLDU1MjAsMzc2OSw0NzE1LDU1MjEsNTUyMiwgNjY2LDEwMDMsMzAyMywxMDIyLDM2MzQsNDM2MSw1NTIzLDQ3MTYsMTgxNCwyMjU3LCAjIDQwMzIKIDU3NCwzOTAxLDE2MDMsIDI5NSwxNTM1LCA3MDUsMzkwMiw0MzYyLCAyODMsIDg1OCwgNDE3LDU1MjQsNTUyNSwzMjU1LDQ3MTcsNDcxOCwgIyA0MDQ4CjMwNzEsMTIyMCwxODkwLDEwNDYsMjI4MSwyNDYxLDQxMDcsMTM5MywxNTk5LCA2ODksMjU3NSwgMzg4LDQzNjMsNTUyNiwyNDkxLCA4MDIsICMgNDA2NAo1NTI3LDI4MTEsMzkwMywyMDYxLDE0MDUsMjI1OCw1NTI4LDQ3MTksMzkwNCwyMTEwLDEwNTIsMTM0NSwzMjU2LDE1ODUsNTUyOSwgODA5LCAjIDQwODAKNTUzMCw1NTMxLDU1MzIsIDU3NSwyNzM5LDM1MjQsIDk1NiwxNTUyLDE0NjksMTE0NCwyMzI4LDU1MzMsMjMyOSwxNTYwLDI0NjIsMzYzNSwgIyA0MDk2CjMyNTcsNDEwOCwgNjE2LDIyMTAsNDM2NCwzMTgwLDIxODMsMjI5NCw1NTM0LDE4MzMsNTUzNSwzNTI1LDQ3MjAsNTUzNiwxMzE5LDM3NzAsICMgNDExMgozNzcxLDEyMTEsMzYzNiwxMDIzLDMyNTgsMTI5MywyODEyLDU1MzcsNTUzOCw1NTM5LDM5MDUsIDYwNywyMzExLDM5MDYsIDc2MiwyODkyLCAjIDQxMjgKMTQzOSw0MzY1LDEzNjAsNDcyMSwxNDg1LDMwNzIsNTU0MCw0NzIyLDEwMzgsNDM2NiwxNDUwLDIwNjIsMjY0OCw0MzY3LDEzNzksNDcyMywgIyA0MTQ0CjI1OTMsNTU0MSw1NTQyLDQzNjgsMTM1MiwxNDE0LDIzMzAsMjkzNSwxMTcyLDU1NDMsNTU0NCwzOTA3LDM5MDgsNDcyNCwxNzk4LDE0NTEsICMgNDE2MAo1NTQ1LDU1NDYsNTU0Nyw1NTQ4LDI5MzYsNDEwOSw0MTEwLDI0OTIsMjM1MSwgNDExLDQxMTEsNDExMiwzNjM3LDMzMzMsMzEyNCw0NzI1LCAjIDQxNzYKMTU2MSwyNjc0LDE0NTIsNDExMywxMzc1LDU1NDksNTU1MCwgIDQ3LDI5NzQsIDMxNiw1NTUxLDE0MDYsMTU5MSwyOTM3LDMxODEsNTU1MiwgIyA0MTkyCjEwMjUsMjE0MiwzMTI1LDMxODIsIDM1NCwyNzQwLCA4ODQsMjIyOCw0MzY5LDI0MTIsIDUwOCwzNzcyLCA3MjYsMzYzOCwgOTk2LDI0MzMsICMgNDIwOAozNjM5LCA3MjksNTU1MywgMzkyLDIxOTQsMTQ1Myw0MTE0LDQ3MjYsMzc3Myw1NTU0LDU1NTUsMjQ2MywzNjQwLDI2MTgsMTY3NSwyODEzLCAjIDQyMjQKIDkxOSwyMzUyLDI5NzUsMjM1MywxMjcwLDQ3MjcsNDExNSwgIDczLDU1NTYsNTU1NywgNjQ3LDU1NTgsMzI1OSwyODU2LDIyNTksMTU1MCwgIyA0MjQwCjEzNDYsMzAyNCw1NTU5LDEzMzIsIDg4MywzNTI2LDU1NjAsNTU2MSw1NTYyLDU1NjMsMzMzNCwyNzc1LDU1NjQsMTIxMiwgODMxLDEzNDcsICMgNDI1Ngo0MzcwLDQ3MjgsMjMzMSwzOTA5LDE4NjQsMzA3MywgNzIwLDM5MTAsNDcyOSw0NzMwLDM5MTEsNTU2NSw0MzcxLDU1NjYsNTU2Nyw0NzMxLCAjIDQyNzIKNTU2OCw1NTY5LDE3OTksNDczMiwzNzc0LDI2MTksNDczMywzNjQxLDE2NDUsMjM3Niw0NzM0LDU1NzAsMjkzOCwgNjY5LDIyMTEsMjY3NSwgIyA0Mjg4CjI0MzQsNTU3MSwyODkzLDU1NzIsNTU3MywxMDI4LDMyNjAsNTU3NCw0MzcyLDI0MTMsNTU3NSwyMjYwLDEzNTMsNTU3Niw1NTc3LDQ3MzUsICMgNDMwNAozMTgzLCA1MTgsNTU3OCw0MTE2LDU1NzksNDM3MywxOTYxLDU1ODAsMjE0Myw0Mzc0LDU1ODEsNTU4MiwzMDI1LDIzNTQsMjM1NSwzOTEyLCAjIDQzMjAKIDUxNiwxODM0LDE0NTQsNDExNywyNzA4LDQzNzUsNDczNiwyMjI5LDI2MjAsMTk3MiwxMTI5LDM2NDIsNTU4MywyNzc2LDU1ODQsMjk3NiwgIyA0MzM2CjE0MjIsIDU3NywxNDcwLDMwMjYsMTUyNCwzNDEwLDU1ODUsNTU4NiwgNDMyLDQzNzYsMzA3NCwzNTI3LDU1ODcsMjU5NCwxNDU1LDI1MTUsICMgNDM1MgoyMjMwLDE5NzMsMTE3NSw1NTg4LDEwMjAsMjc0MSw0MTE4LDM1MjgsNDczNyw1NTg5LDI3NDIsNTU5MCwxNzQzLDEzNjEsMzA3NSwzNTI5LCAjIDQzNjgKMjY0OSw0MTE5LDQzNzcsNDczOCwyMjk1LCA4OTUsIDkyNCw0Mzc4LDIxNzEsIDMzMSwyMjQ3LDMwNzYsIDE2NiwxNjI3LDMwNzcsMTA5OCwgIyA0Mzg0CjU1OTEsMTIzMiwyODk0LDIyMzEsMzQxMSw0NzM5LCA2NTcsIDQwMywxMTk2LDIzNzcsIDU0MiwzNzc1LDM0MTIsMTYwMCw0Mzc5LDM1MzAsICMgNDQwMAo1NTkyLDQ3NDAsMjc3NywzMjYxLCA1NzYsIDUzMCwxMzYyLDQ3NDEsNDc0MiwyNTQwLDI2NzYsMzc3Niw0MTIwLDU1OTMsIDg0MiwzOTEzLCAjIDQ0MTYKNTU5NCwyODE0LDIwMzIsMTAxNCw0MTIxLCAyMTMsMjcwOSwzNDEzLCA2NjUsIDYyMSw0MzgwLDU1OTUsMzc3NywyOTM5LDI0MzUsNTU5NiwgIyA0NDMyCjI0MzYsMzMzNSwzNjQzLDM0MTQsNDc0Myw0MzgxLDI1NDEsNDM4Miw0NzQ0LDM2NDQsMTY4Miw0MzgzLDM1MzEsMTM4MCw1NTk3LCA3MjQsICMgNDQ0OAoyMjgyLCA2MDAsMTY3MCw1NTk4LDEzMzcsMTIzMyw0NzQ1LDMxMjYsMjI0OCw1NTk5LDE2MjEsNDc0Niw1NjAwLCA2NTEsNDM4NCw1NjAxLCAjIDQ0NjQKMTYxMiw0Mzg1LDI2MjEsNTYwMiwyODU3LDU2MDMsMjc0MywyMzEyLDMwNzgsNTYwNCwgNzE2LDI0NjQsMzA3OSwgMTc0LDEyNTUsMjcxMCwgIyA0NDgwCjQxMjIsMzY0NSwgNTQ4LDEzMjAsMTM5OCwgNzI4LDQxMjMsMTU3NCw1NjA1LDE4OTEsMTE5NywzMDgwLDQxMjQsNTYwNiwzMDgxLDMwODIsICMgNDQ5NgozNzc4LDM2NDYsMzc3OSwgNzQ3LDU2MDcsIDYzNSw0Mzg2LDQ3NDcsNTYwOCw1NjA5LDU2MTAsNDM4Nyw1NjExLDU2MTIsNDc0OCw1NjEzLCAjIDQ1MTIKMzQxNSw0NzQ5LDI0MzcsIDQ1MSw1NjE0LDM3ODAsMjU0MiwyMDczLDQzODgsMjc0NCw0Mzg5LDQxMjUsNTYxNSwxNzY0LDQ3NTAsNTYxNiwgIyA0NTI4CjQzOTAsIDM1MCw0NzUxLDIyODMsMjM5NSwyNDkzLDU2MTcsNDM5MSw0MTI2LDIyNDksMTQzNCw0MTI3LCA0ODgsNDc1MiwgNDU4LDQzOTIsICMgNDU0NAo0MTI4LDM3ODEsIDc3MSwxMzMwLDIzOTYsMzkxNCwyNTc2LDMxODQsMjE2MCwyNDE0LDE1NTMsMjY3NywzMTg1LDQzOTMsNTYxOCwyNDk0LCAjIDQ1NjAKMjg5NSwyNjIyLDE3MjAsMjcxMSw0Mzk0LDM0MTYsNDc1Myw1NjE5LDI1NDMsNDM5NSw1NjIwLDMyNjIsNDM5NiwyNzc4LDU2MjEsMjAxNiwgIyA0NTc2CjI3NDUsNTYyMiwxMTU1LDEwMTcsMzc4MiwzOTE1LDU2MjMsMzMzNiwyMzEzLCAyMDEsMTg2NSw0Mzk3LDE0MzAsNTYyNCw0MTI5LDU2MjUsICMgNDU5Mgo1NjI2LDU2MjcsNTYyOCw1NjI5LDQzOTgsMTYwNCw1NjMwLCA0MTQsMTg2NiwgMzcxLDI1OTUsNDc1NCw0NzU1LDM1MzIsMjAxNywzMTI3LCAjIDQ2MDgKNDc1NiwxNzA4LCA5NjAsNDM5OSwgODg3LCAzODksMjE3MiwxNTM2LDE2NjMsMTcyMSw1NjMxLDIyMzIsNDEzMCwyMzU2LDI5NDAsMTU4MCwgIyA0NjI0CjU2MzIsNTYzMywxNzQ0LDQ3NTcsMjU0NCw0NzU4LDQ3NTksNTYzNCw0NzYwLDU2MzUsMjA3NCw1NjM2LDQ3NjEsMzY0NywzNDE3LDI4OTYsICMgNDY0MAo0NDAwLDU2MzcsNDQwMSwyNjUwLDM0MTgsMjgxNSwgNjczLDI3MTIsMjQ2NSwgNzA5LDM1MzMsNDEzMSwzNjQ4LDQ0MDIsNTYzOCwxMTQ4LCAjIDQ2NTYKIDUwMiwgNjM0LDU2MzksNTY0MCwxMjA0LDQ3NjIsMzY0OSwxNTc1LDQ3NjMsMjYyMywzNzgzLDU2NDEsMzc4NCwzMTI4LCA5NDgsMzI2MywgIyA0NjcyCiAxMjEsMTc0NSwzOTE2LDExMTAsNTY0Miw0NDAzLDMwODMsMjUxNiwzMDI3LDQxMzIsMzc4NSwxMTUxLDE3NzEsMzkxNywxNDg4LDQxMzMsICMgNDY4OAoxOTg3LDU2NDMsMjQzOCwzNTM0LDU2NDQsNTY0NSwyMDk0LDU2NDYsNDQwNCwzOTE4LDEyMTMsMTQwNywyODE2LCA1MzEsMjc0NiwyNTQ1LCAjIDQ3MDQKMzI2NCwxMDExLDE1MzcsNDc2NCwyNzc5LDQ0MDUsMzEyOSwxMDYxLDU2NDcsMzc4NiwzNzg3LDE4NjcsMjg5Nyw1NjQ4LDIwMTgsIDEyMCwgIyA0NzIwCjQ0MDYsNDQwNywyMDYzLDM2NTAsMzI2NSwyMzE0LDM5MTksMjY3OCwzNDE5LDE5NTUsNDc2NSw0MTM0LDU2NDksMzUzNSwxMDQ3LDI3MTMsICMgNDczNgoxMjY2LDU2NTAsMTM2OCw0NzY2LDI4NTgsIDY0OSwzNDIwLDM5MjAsMjU0NiwyNzQ3LDExMDIsMjg1OSwyNjc5LDU2NTEsNTY1MiwyMDAwLCAjIDQ3NTIKNTY1MywxMTExLDM2NTEsMjk3Nyw1NjU0LDI0OTUsMzkyMSwzNjUyLDI4MTcsMTg1NSwzNDIxLDM3ODgsNTY1NSw1NjU2LDM0MjIsMjQxNSwgIyA0NzY4CjI4OTgsMzMzNywzMjY2LDM2NTMsNTY1NywyNTc3LDU2NTgsMzY1NCwyODE4LDQxMzUsMTQ2MCwgODU2LDU2NTksMzY1NSw1NjYwLDI4OTksICMgNDc4NAoyOTc4LDU2NjEsMjkwMCwzOTIyLDU2NjIsNDQwOCwgNjMyLDI1MTcsIDg3NSwzOTIzLDE2OTcsMzkyNCwyMjk2LDU2NjMsNTY2NCw0NzY3LCAjIDQ4MDAKMzAyOCwxMjM5LCA1ODAsNDc2OCw0NDA5LDU2NjUsIDkxNCwgOTM2LDIwNzUsMTE5MCw0MTM2LDEwMzksMjEyNCw1NjY2LDU2NjcsNTY2OCwgIyA0ODE2CjU2NjksMzQyMywxNDczLDU2NzAsMTM1NCw0NDEwLDM5MjUsNDc2OSwyMTczLDMwODQsNDEzNywgOTE1LDMzMzgsNDQxMSw0NDEyLDMzMzksICMgNDgzMgoxNjA1LDE4MzUsNTY3MSwyNzQ4LCAzOTgsMzY1Niw0NDEzLDM5MjYsNDEzOCwgMzI4LDE5MTMsMjg2MCw0MTM5LDM5MjcsMTMzMSw0NDE0LCAjIDQ4NDgKMzAyOSwgOTM3LDQ0MTUsNTY3MiwzNjU3LDQxNDAsNDE0MSwzNDI0LDIxNjEsNDc3MCwzNDI1LCA1MjQsIDc0MiwgNTM4LDMwODUsMTAxMiwgIyA0ODY0CjU2NzMsNTY3NCwzOTI4LDI0NjYsNTY3NSwgNjU4LDExMDMsIDIyNSwzOTI5LDU2NzYsNTY3Nyw0NzcxLDU2NzgsNDc3Miw1Njc5LDMyNjcsICMgNDg4MAoxMjQzLDU2ODAsNDE0MiwgOTYzLDIyNTAsNDc3Myw1NjgxLDI3MTQsMzY1OCwzMTg2LDU2ODIsNTY4MywyNTk2LDIzMzIsNTY4NCw0Nzc0LCAjIDQ4OTYKNTY4NSw1Njg2LDU2ODcsMzUzNiwgOTU3LDM0MjYsMjU0NywyMDMzLDE5MzEsMjk0MSwyNDY3LCA4NzAsMjAxOSwzNjU5LDE3NDYsMjc4MCwgIyA0OTEyCjI3ODEsMjQzOSwyNDY4LDU2ODgsMzkzMCw1Njg5LDM3ODksMzEzMCwzNzkwLDM1MzcsMzQyNywzNzkxLDU2OTAsMTE3OSwzMDg2LDU2OTEsICMgNDkyOAozMTg3LDIzNzgsNDQxNiwzNzkyLDI1NDgsMzE4OCwzMTMxLDI3NDksNDE0Myw1NjkyLDM0MjgsMTU1NiwyNTQ5LDIyOTcsIDk3NywyOTAxLCAjIDQ5NDQKMjAzNCw0MTQ0LDEyMDUsMzQyOSw1NjkzLDE3NjUsMzQzMCwzMTg5LDIxMjUsMTI3MSwgNzE0LDE2ODksNDc3NSwzNTM4LDU2OTQsMjMzMywgIyA0OTYwCjM5MzEsIDUzMyw0NDE3LDM2NjAsMjE4NCwgNjE3LDU2OTUsMjQ2OSwzMzQwLDM1MzksMjMxNSw1Njk2LDU2OTcsMzE5MCw1Njk4LDU2OTksICMgNDk3NgozOTMyLDE5ODgsIDYxOCwgNDI3LDI2NTEsMzU0MCwzNDMxLDU3MDAsNTcwMSwxMjQ0LDE2OTAsNTcwMiwyODE5LDQ0MTgsNDc3Niw1NzAzLCAjIDQ5OTIKMzU0MSw0Nzc3LDU3MDQsMjI4NCwxNTc2LCA0NzMsMzY2MSw0NDE5LDM0MzIsIDk3Miw1NzA1LDM2NjIsNTcwNiwzMDg3LDU3MDcsNTcwOCwgIyA1MDA4CjQ3NzgsNDc3OSw1NzA5LDM3OTMsNDE0NSw0MTQ2LDU3MTAsIDE1Myw0NzgwLCAzNTYsNTcxMSwxODkyLDI5MDIsNDQyMCwyMTQ0LCA0MDgsICMgNTAyNAogODAzLDIzNTcsNTcxMiwzOTMzLDU3MTMsNDQyMSwxNjQ2LDI1NzgsMjUxOCw0NzgxLDQ3ODIsMzkzNCw1NzE0LDM5MzUsNDQyMiw1NzE1LCAjIDUwNDAKMjQxNiwzNDMzLCA3NTIsNTcxNiw1NzE3LDE5NjIsMzM0MSwyOTc5LDU3MTgsIDc0NiwzMDMwLDI0NzAsNDc4Myw0NDIzLDM3OTQsIDY5OCwgIyA1MDU2CjQ3ODQsMTg5Myw0NDI0LDM2NjMsMjU1MCw0Nzg1LDM2NjQsMzkzNiw1NzE5LDMxOTEsMzQzNCw1NzIwLDE4MjQsMTMwMiw0MTQ3LDI3MTUsICMgNTA3MgozOTM3LDE5NzQsNDQyNSw1NzIxLDQ0MjYsMzE5MiwgODIzLDEzMDMsMTI4OCwxMjM2LDI4NjEsMzU0Miw0MTQ4LDM0MzUsIDc3NCwzOTM4LCAjIDUwODgKNTcyMiwxNTgxLDQ3ODYsMTMwNCwyODYyLDM5MzksNDc4Nyw1NzIzLDI0NDAsMjE2MiwxMDgzLDMyNjgsNDQyNyw0MTQ5LDQ0MjgsIDM0NCwgIyA1MTA0CjExNzMsIDI4OCwyMzE2LCA0NTQsMTY4Myw1NzI0LDU3MjUsMTQ2MSw0Nzg4LDQxNTAsMjU5Nyw1NzI2LDU3MjcsNDc4OSwgOTg1LCA4OTQsICMgNTEyMAo1NzI4LDM0MzYsMzE5Myw1NzI5LDE5MTQsMjk0MiwzNzk1LDE5ODksNTczMCwyMTExLDE5NzUsNTczMSw0MTUxLDU3MzIsMjU3OSwxMTk0LCAjIDUxMzYKIDQyNSw1NzMzLDQ3OTAsMzE5NCwxMjQ1LDM3OTYsNDQyOSw1NzM0LDU3MzUsMjg2Myw1NzM2LCA2MzYsNDc5MSwxODU2LDM5NDAsIDc2MCwgIyA1MTUyCjE4MDAsNTczNyw0NDMwLDIyMTIsMTUwOCw0NzkyLDQxNTIsMTg5NCwxNjg0LDIyOTgsNTczOCw1NzM5LDQ3OTMsNDQzMSw0NDMyLDIyMTMsICMgNTE2OAogNDc5LDU3NDAsNTc0MSwgODMyLDU3NDIsNDE1MywyNDk2LDU3NDMsMjk4MCwyNDk3LDM3OTcsIDk5MCwzMTMyLCA2MjcsMTgxNSwyNjUyLCAjIDUxODQKNDQzMywxNTgyLDQ0MzQsMjEyNiwyMTEyLDM1NDMsNDc5NCw1NzQ0LCA3OTksNDQzNSwzMTk1LDU3NDUsNDc5NSwyMTEzLDE3MzcsMzAzMSwgIyA1MjAwCjEwMTgsIDU0MywgNzU0LDQ0MzYsMzM0MiwxNjc2LDQ3OTYsNDc5Nyw0MTU0LDQ3OTgsMTQ4OSw1NzQ2LDM1NDQsNTc0NywyNjI0LDI5MDMsICMgNTIxNgo0MTU1LDU3NDgsNTc0OSwyOTgxLDU3NTAsNTc1MSw1NzUyLDU3NTMsMzE5Niw0Nzk5LDQ4MDAsMjE4NSwxNzIyLDU3NTQsMzI2OSwzMjcwLCAjIDUyMzIKMTg0MywzNjY1LDE3MTUsIDQ4MSwgMzY1LDE5NzYsMTg1Nyw1NzU1LDU3NTYsMTk2MywyNDk4LDQ4MDEsNTc1NywyMTI3LDM2NjYsMzI3MSwgIyA1MjQ4CiA0MzMsMTg5NSwyMDY0LDIwNzYsNTc1OCwgNjAyLDI3NTAsNTc1OSw1NzYwLDU3NjEsNTc2Miw1NzYzLDMwMzIsMTYyOCwzNDM3LDU3NjQsICMgNTI2NAozMTk3LDQ4MDIsNDE1NiwyOTA0LDQ4MDMsMjUxOSw1NzY1LDI1NTEsMjc4Miw1NzY2LDU3NjcsNTc2OCwzMzQzLDQ4MDQsMjkwNSw1NzY5LCAjIDUyODAKNDgwNSw1NzcwLDI4NjQsNDgwNiw0ODA3LDEyMjEsMjk4Miw0MTU3LDI1MjAsNTc3MSw1NzcyLDU3NzMsMTg2OCwxOTkwLDU3NzQsNTc3NSwgIyA1Mjk2CjU3NzYsMTg5Niw1Nzc3LDU3NzgsNDgwOCwxODk3LDQxNTgsIDMxOCw1Nzc5LDIwOTUsNDE1OSw0NDM3LDU3ODAsNTc4MSwgNDg1LDU3ODIsICMgNTMxMgogOTM4LDM5NDEsIDU1MywyNjgwLCAxMTYsNTc4MywzOTQyLDM2NjcsNTc4NCwzNTQ1LDI2ODEsMjc4MywzNDM4LDMzNDQsMjgyMCw1Nzg1LCAjIDUzMjgKMzY2OCwyOTQzLDQxNjAsMTc0NywyOTQ0LDI5ODMsNTc4Niw1Nzg3LCAyMDcsNTc4OCw0ODA5LDU3ODksNDgxMCwyNTIxLDU3OTAsMzAzMywgIyA1MzQ0CiA4OTAsMzY2OSwzOTQzLDU3OTEsMTg3OCwzNzk4LDM0MzksNTc5MiwyMTg2LDIzNTgsMzQ0MCwxNjUyLDU3OTMsNTc5NCw1Nzk1LCA5NDEsICMgNTM2MAoyMjk5LCAyMDgsMzU0Niw0MTYxLDIwMjAsIDMzMCw0NDM4LDM5NDQsMjkwNiwyNDk5LDM3OTksNDQzOSw0ODExLDU3OTYsNTc5Nyw1Nzk4LCAjIDUzNzYKKQoKUEsDBBQAAAAAAAAAIQDL52dm3QYAAN0GAAA+AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2JpZzVwcm9iZXIucHkjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQkVHSU4gTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBUaGUgT3JpZ2luYWwgQ29kZSBpcyBNb3ppbGxhIENvbW11bmljYXRvciBjbGllbnQgY29kZS4KIwojIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwojIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uLgojIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDE5OTgKIyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiMKIyBDb250cmlidXRvcihzKToKIyAgIE1hcmsgUGlsZ3JpbSAtIHBvcnQgdG8gUHl0aG9uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgojIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQojIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQojIDAyMTEwLTEzMDEgIFVTQQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVORCBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCmZyb20gLm1iY2hhcnNldHByb2JlciBpbXBvcnQgTXVsdGlCeXRlQ2hhclNldFByb2Jlcgpmcm9tIC5jb2RpbmdzdGF0ZW1hY2hpbmUgaW1wb3J0IENvZGluZ1N0YXRlTWFjaGluZQpmcm9tIC5jaGFyZGlzdHJpYnV0aW9uIGltcG9ydCBCaWc1RGlzdHJpYnV0aW9uQW5hbHlzaXMKZnJvbSAubWJjc3NtIGltcG9ydCBCSUc1X1NNX01PREVMCgoKY2xhc3MgQmlnNVByb2JlcihNdWx0aUJ5dGVDaGFyU2V0UHJvYmVyKToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzdXBlcihCaWc1UHJvYmVyLCBzZWxmKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5jb2Rpbmdfc20gPSBDb2RpbmdTdGF0ZU1hY2hpbmUoQklHNV9TTV9NT0RFTCkKICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbl9hbmFseXplciA9IEJpZzVEaXN0cmlidXRpb25BbmFseXNpcygpCiAgICAgICAgc2VsZi5yZXNldCgpCgogICAgQHByb3BlcnR5CiAgICBkZWYgY2hhcnNldF9uYW1lKHNlbGYpOgogICAgICAgIHJldHVybiAiQmlnNSIKCiAgICBAcHJvcGVydHkKICAgIGRlZiBsYW5ndWFnZShzZWxmKToKICAgICAgICByZXR1cm4gIkNoaW5lc2UiClBLAwQUAAAAAAAAACEA4FkoPcMkAADDJAAARAAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9jaGFyZGlzdHJpYnV0aW9uLnB5IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEJFR0lOIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgVGhlIE9yaWdpbmFsIENvZGUgaXMgTW96aWxsYSBDb21tdW5pY2F0b3IgY2xpZW50IGNvZGUuCiMKIyBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKIyBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi4KIyBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAxOTk4CiMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgojCiMgQ29udHJpYnV0b3Iocyk6CiMgICBNYXJrIFBpbGdyaW0gLSBwb3J0IHRvIFB5dGhvbgojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKIyAwMjExMC0xMzAxICBVU0EKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFTkQgTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpmcm9tIC5ldWN0d2ZyZXEgaW1wb3J0IChFVUNUV19DSEFSX1RPX0ZSRVFfT1JERVIsIEVVQ1RXX1RBQkxFX1NJWkUsCiAgICAgICAgICAgICAgICAgICAgICAgIEVVQ1RXX1RZUElDQUxfRElTVFJJQlVUSU9OX1JBVElPKQpmcm9tIC5ldWNrcmZyZXEgaW1wb3J0IChFVUNLUl9DSEFSX1RPX0ZSRVFfT1JERVIsIEVVQ0tSX1RBQkxFX1NJWkUsCiAgICAgICAgICAgICAgICAgICAgICAgIEVVQ0tSX1RZUElDQUxfRElTVFJJQlVUSU9OX1JBVElPKQpmcm9tIC5nYjIzMTJmcmVxIGltcG9ydCAoR0IyMzEyX0NIQVJfVE9fRlJFUV9PUkRFUiwgR0IyMzEyX1RBQkxFX1NJWkUsCiAgICAgICAgICAgICAgICAgICAgICAgICBHQjIzMTJfVFlQSUNBTF9ESVNUUklCVVRJT05fUkFUSU8pCmZyb20gLmJpZzVmcmVxIGltcG9ydCAoQklHNV9DSEFSX1RPX0ZSRVFfT1JERVIsIEJJRzVfVEFCTEVfU0laRSwKICAgICAgICAgICAgICAgICAgICAgICBCSUc1X1RZUElDQUxfRElTVFJJQlVUSU9OX1JBVElPKQpmcm9tIC5qaXNmcmVxIGltcG9ydCAoSklTX0NIQVJfVE9fRlJFUV9PUkRFUiwgSklTX1RBQkxFX1NJWkUsCiAgICAgICAgICAgICAgICAgICAgICBKSVNfVFlQSUNBTF9ESVNUUklCVVRJT05fUkFUSU8pCgoKY2xhc3MgQ2hhckRpc3RyaWJ1dGlvbkFuYWx5c2lzKG9iamVjdCk6CiAgICBFTk9VR0hfREFUQV9USFJFU0hPTEQgPSAxMDI0CiAgICBTVVJFX1lFUyA9IDAuOTkKICAgIFNVUkVfTk8gPSAwLjAxCiAgICBNSU5JTVVNX0RBVEFfVEhSRVNIT0xEID0gMwoKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICAjIE1hcHBpbmcgdGFibGUgdG8gZ2V0IGZyZXF1ZW5jeSBvcmRlciBmcm9tIGNoYXIgb3JkZXIgKGdldCBmcm9tCiAgICAgICAgIyBHZXRPcmRlcigpKQogICAgICAgIHNlbGYuX2NoYXJfdG9fZnJlcV9vcmRlciA9IE5vbmUKICAgICAgICBzZWxmLl90YWJsZV9zaXplID0gTm9uZSAgIyBTaXplIG9mIGFib3ZlIHRhYmxlCiAgICAgICAgIyBUaGlzIGlzIGEgY29uc3RhbnQgdmFsdWUgd2hpY2ggdmFyaWVzIGZyb20gbGFuZ3VhZ2UgdG8gbGFuZ3VhZ2UsCiAgICAgICAgIyB1c2VkIGluIGNhbGN1bGF0aW5nIGNvbmZpZGVuY2UuICBTZWUKICAgICAgICAjIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvcHJvamVjdHMvaW50bC9Vbml2ZXJzYWxDaGFyc2V0RGV0ZWN0aW9uLmh0bWwKICAgICAgICAjIGZvciBmdXJ0aGVyIGRldGFpbC4KICAgICAgICBzZWxmLnR5cGljYWxfZGlzdHJpYnV0aW9uX3JhdGlvID0gTm9uZQogICAgICAgIHNlbGYuX2RvbmUgPSBOb25lCiAgICAgICAgc2VsZi5fdG90YWxfY2hhcnMgPSBOb25lCiAgICAgICAgc2VsZi5fZnJlcV9jaGFycyA9IE5vbmUKICAgICAgICBzZWxmLnJlc2V0KCkKCiAgICBkZWYgcmVzZXQoc2VsZik6CiAgICAgICAgIiIicmVzZXQgYW5hbHlzZXIsIGNsZWFyIGFueSBzdGF0ZSIiIgogICAgICAgICMgSWYgdGhpcyBmbGFnIGlzIHNldCB0byBUcnVlLCBkZXRlY3Rpb24gaXMgZG9uZSBhbmQgY29uY2x1c2lvbiBoYXMKICAgICAgICAjIGJlZW4gbWFkZQogICAgICAgIHNlbGYuX2RvbmUgPSBGYWxzZQogICAgICAgIHNlbGYuX3RvdGFsX2NoYXJzID0gMCAgIyBUb3RhbCBjaGFyYWN0ZXJzIGVuY291bnRlcmVkCiAgICAgICAgIyBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgd2hvc2UgZnJlcXVlbmN5IG9yZGVyIGlzIGxlc3MgdGhhbiA1MTIKICAgICAgICBzZWxmLl9mcmVxX2NoYXJzID0gMAoKICAgIGRlZiBmZWVkKHNlbGYsIGNoYXIsIGNoYXJfbGVuKToKICAgICAgICAiIiJmZWVkIGEgY2hhcmFjdGVyIHdpdGgga25vd24gbGVuZ3RoIiIiCiAgICAgICAgaWYgY2hhcl9sZW4gPT0gMjoKICAgICAgICAgICAgIyB3ZSBvbmx5IGNhcmUgYWJvdXQgMi1ieXRlcyBjaGFyYWN0ZXIgaW4gb3VyIGRpc3RyaWJ1dGlvbiBhbmFseXNpcwogICAgICAgICAgICBvcmRlciA9IHNlbGYuZ2V0X29yZGVyKGNoYXIpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgb3JkZXIgPSAtMQogICAgICAgIGlmIG9yZGVyID49IDA6CiAgICAgICAgICAgIHNlbGYuX3RvdGFsX2NoYXJzICs9IDEKICAgICAgICAgICAgIyBvcmRlciBpcyB2YWxpZAogICAgICAgICAgICBpZiBvcmRlciA8IHNlbGYuX3RhYmxlX3NpemU6CiAgICAgICAgICAgICAgICBpZiA1MTIgPiBzZWxmLl9jaGFyX3RvX2ZyZXFfb3JkZXJbb3JkZXJdOgogICAgICAgICAgICAgICAgICAgIHNlbGYuX2ZyZXFfY2hhcnMgKz0gMQoKICAgIGRlZiBnZXRfY29uZmlkZW5jZShzZWxmKToKICAgICAgICAiIiJyZXR1cm4gY29uZmlkZW5jZSBiYXNlZCBvbiBleGlzdGluZyBkYXRhIiIiCiAgICAgICAgIyBpZiB3ZSBkaWRuJ3QgcmVjZWl2ZSBhbnkgY2hhcmFjdGVyIGluIG91ciBjb25zaWRlcmF0aW9uIHJhbmdlLAogICAgICAgICMgcmV0dXJuIG5lZ2F0aXZlIGFuc3dlcgogICAgICAgIGlmIHNlbGYuX3RvdGFsX2NoYXJzIDw9IDAgb3Igc2VsZi5fZnJlcV9jaGFycyA8PSBzZWxmLk1JTklNVU1fREFUQV9USFJFU0hPTEQ6CiAgICAgICAgICAgIHJldHVybiBzZWxmLlNVUkVfTk8KCiAgICAgICAgaWYgc2VsZi5fdG90YWxfY2hhcnMgIT0gc2VsZi5fZnJlcV9jaGFyczoKICAgICAgICAgICAgciA9IChzZWxmLl9mcmVxX2NoYXJzIC8gKChzZWxmLl90b3RhbF9jaGFycyAtIHNlbGYuX2ZyZXFfY2hhcnMpCiAgICAgICAgICAgICAgICAgKiBzZWxmLnR5cGljYWxfZGlzdHJpYnV0aW9uX3JhdGlvKSkKICAgICAgICAgICAgaWYgciA8IHNlbGYuU1VSRV9ZRVM6CiAgICAgICAgICAgICAgICByZXR1cm4gcgoKICAgICAgICAjIG5vcm1hbGl6ZSBjb25maWRlbmNlICh3ZSBkb24ndCB3YW50IHRvIGJlIDEwMCUgc3VyZSkKICAgICAgICByZXR1cm4gc2VsZi5TVVJFX1lFUwoKICAgIGRlZiBnb3RfZW5vdWdoX2RhdGEoc2VsZik6CiAgICAgICAgIyBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIHJlY2VpdmUgYWxsIGRhdGEgdG8gZHJhdyBjb25jbHVzaW9uLgogICAgICAgICMgRm9yIGNoYXJzZXQgZGV0ZWN0aW9uLCBjZXJ0YWluIGFtb3VudCBvZiBkYXRhIGlzIGVub3VnaAogICAgICAgIHJldHVybiBzZWxmLl90b3RhbF9jaGFycyA+IHNlbGYuRU5PVUdIX0RBVEFfVEhSRVNIT0xECgogICAgZGVmIGdldF9vcmRlcihzZWxmLCBieXRlX3N0cik6CiAgICAgICAgIyBXZSBkbyBub3QgaGFuZGxlIGNoYXJhY3RlcnMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIGVuY29kaW5nIHN0cmluZywKICAgICAgICAjIGJ1dCBjb252ZXJ0IHRoaXMgZW5jb2Rpbmcgc3RyaW5nIHRvIGEgbnVtYmVyLCBoZXJlIGNhbGxlZCBvcmRlci4KICAgICAgICAjIFRoaXMgYWxsb3dzIG11bHRpcGxlIGVuY29kaW5ncyBvZiBhIGxhbmd1YWdlIHRvIHNoYXJlIG9uZSBmcmVxdWVuY3kKICAgICAgICAjIHRhYmxlLgogICAgICAgIHJldHVybiAtMQoKCmNsYXNzIEVVQ1RXRGlzdHJpYnV0aW9uQW5hbHlzaXMoQ2hhckRpc3RyaWJ1dGlvbkFuYWx5c2lzKToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzdXBlcihFVUNUV0Rpc3RyaWJ1dGlvbkFuYWx5c2lzLCBzZWxmKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5fY2hhcl90b19mcmVxX29yZGVyID0gRVVDVFdfQ0hBUl9UT19GUkVRX09SREVSCiAgICAgICAgc2VsZi5fdGFibGVfc2l6ZSA9IEVVQ1RXX1RBQkxFX1NJWkUKICAgICAgICBzZWxmLnR5cGljYWxfZGlzdHJpYnV0aW9uX3JhdGlvID0gRVVDVFdfVFlQSUNBTF9ESVNUUklCVVRJT05fUkFUSU8KCiAgICBkZWYgZ2V0X29yZGVyKHNlbGYsIGJ5dGVfc3RyKToKICAgICAgICAjIGZvciBldWMtVFcgZW5jb2RpbmcsIHdlIGFyZSBpbnRlcmVzdGVkCiAgICAgICAgIyAgIGZpcnN0ICBieXRlIHJhbmdlOiAweGM0IC0tIDB4ZmUKICAgICAgICAjICAgc2Vjb25kIGJ5dGUgcmFuZ2U6IDB4YTEgLS0gMHhmZQogICAgICAgICMgbm8gdmFsaWRhdGlvbiBuZWVkZWQgaGVyZS4gU3RhdGUgbWFjaGluZSBoYXMgZG9uZSB0aGF0CiAgICAgICAgZmlyc3RfY2hhciA9IGJ5dGVfc3RyWzBdCiAgICAgICAgaWYgZmlyc3RfY2hhciA+PSAweEM0OgogICAgICAgICAgICByZXR1cm4gOTQgKiAoZmlyc3RfY2hhciAtIDB4QzQpICsgYnl0ZV9zdHJbMV0gLSAweEExCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIC0xCgoKY2xhc3MgRVVDS1JEaXN0cmlidXRpb25BbmFseXNpcyhDaGFyRGlzdHJpYnV0aW9uQW5hbHlzaXMpOgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHN1cGVyKEVVQ0tSRGlzdHJpYnV0aW9uQW5hbHlzaXMsIHNlbGYpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLl9jaGFyX3RvX2ZyZXFfb3JkZXIgPSBFVUNLUl9DSEFSX1RPX0ZSRVFfT1JERVIKICAgICAgICBzZWxmLl90YWJsZV9zaXplID0gRVVDS1JfVEFCTEVfU0laRQogICAgICAgIHNlbGYudHlwaWNhbF9kaXN0cmlidXRpb25fcmF0aW8gPSBFVUNLUl9UWVBJQ0FMX0RJU1RSSUJVVElPTl9SQVRJTwoKICAgIGRlZiBnZXRfb3JkZXIoc2VsZiwgYnl0ZV9zdHIpOgogICAgICAgICMgZm9yIGV1Yy1LUiBlbmNvZGluZywgd2UgYXJlIGludGVyZXN0ZWQKICAgICAgICAjICAgZmlyc3QgIGJ5dGUgcmFuZ2U6IDB4YjAgLS0gMHhmZQogICAgICAgICMgICBzZWNvbmQgYnl0ZSByYW5nZTogMHhhMSAtLSAweGZlCiAgICAgICAgIyBubyB2YWxpZGF0aW9uIG5lZWRlZCBoZXJlLiBTdGF0ZSBtYWNoaW5lIGhhcyBkb25lIHRoYXQKICAgICAgICBmaXJzdF9jaGFyID0gYnl0ZV9zdHJbMF0KICAgICAgICBpZiBmaXJzdF9jaGFyID49IDB4QjA6CiAgICAgICAgICAgIHJldHVybiA5NCAqIChmaXJzdF9jaGFyIC0gMHhCMCkgKyBieXRlX3N0clsxXSAtIDB4QTEKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gLTEKCgpjbGFzcyBHQjIzMTJEaXN0cmlidXRpb25BbmFseXNpcyhDaGFyRGlzdHJpYnV0aW9uQW5hbHlzaXMpOgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHN1cGVyKEdCMjMxMkRpc3RyaWJ1dGlvbkFuYWx5c2lzLCBzZWxmKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5fY2hhcl90b19mcmVxX29yZGVyID0gR0IyMzEyX0NIQVJfVE9fRlJFUV9PUkRFUgogICAgICAgIHNlbGYuX3RhYmxlX3NpemUgPSBHQjIzMTJfVEFCTEVfU0laRQogICAgICAgIHNlbGYudHlwaWNhbF9kaXN0cmlidXRpb25fcmF0aW8gPSBHQjIzMTJfVFlQSUNBTF9ESVNUUklCVVRJT05fUkFUSU8KCiAgICBkZWYgZ2V0X29yZGVyKHNlbGYsIGJ5dGVfc3RyKToKICAgICAgICAjIGZvciBHQjIzMTIgZW5jb2RpbmcsIHdlIGFyZSBpbnRlcmVzdGVkCiAgICAgICAgIyAgZmlyc3QgIGJ5dGUgcmFuZ2U6IDB4YjAgLS0gMHhmZQogICAgICAgICMgIHNlY29uZCBieXRlIHJhbmdlOiAweGExIC0tIDB4ZmUKICAgICAgICAjIG5vIHZhbGlkYXRpb24gbmVlZGVkIGhlcmUuIFN0YXRlIG1hY2hpbmUgaGFzIGRvbmUgdGhhdAogICAgICAgIGZpcnN0X2NoYXIsIHNlY29uZF9jaGFyID0gYnl0ZV9zdHJbMF0sIGJ5dGVfc3RyWzFdCiAgICAgICAgaWYgKGZpcnN0X2NoYXIgPj0gMHhCMCkgYW5kIChzZWNvbmRfY2hhciA+PSAweEExKToKICAgICAgICAgICAgcmV0dXJuIDk0ICogKGZpcnN0X2NoYXIgLSAweEIwKSArIHNlY29uZF9jaGFyIC0gMHhBMQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiAtMQoKCmNsYXNzIEJpZzVEaXN0cmlidXRpb25BbmFseXNpcyhDaGFyRGlzdHJpYnV0aW9uQW5hbHlzaXMpOgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHN1cGVyKEJpZzVEaXN0cmlidXRpb25BbmFseXNpcywgc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYuX2NoYXJfdG9fZnJlcV9vcmRlciA9IEJJRzVfQ0hBUl9UT19GUkVRX09SREVSCiAgICAgICAgc2VsZi5fdGFibGVfc2l6ZSA9IEJJRzVfVEFCTEVfU0laRQogICAgICAgIHNlbGYudHlwaWNhbF9kaXN0cmlidXRpb25fcmF0aW8gPSBCSUc1X1RZUElDQUxfRElTVFJJQlVUSU9OX1JBVElPCgogICAgZGVmIGdldF9vcmRlcihzZWxmLCBieXRlX3N0cik6CiAgICAgICAgIyBmb3IgYmlnNSBlbmNvZGluZywgd2UgYXJlIGludGVyZXN0ZWQKICAgICAgICAjICAgZmlyc3QgIGJ5dGUgcmFuZ2U6IDB4YTQgLS0gMHhmZQogICAgICAgICMgICBzZWNvbmQgYnl0ZSByYW5nZTogMHg0MCAtLSAweDdlICwgMHhhMSAtLSAweGZlCiAgICAgICAgIyBubyB2YWxpZGF0aW9uIG5lZWRlZCBoZXJlLiBTdGF0ZSBtYWNoaW5lIGhhcyBkb25lIHRoYXQKICAgICAgICBmaXJzdF9jaGFyLCBzZWNvbmRfY2hhciA9IGJ5dGVfc3RyWzBdLCBieXRlX3N0clsxXQogICAgICAgIGlmIGZpcnN0X2NoYXIgPj0gMHhBNDoKICAgICAgICAgICAgaWYgc2Vjb25kX2NoYXIgPj0gMHhBMToKICAgICAgICAgICAgICAgIHJldHVybiAxNTcgKiAoZmlyc3RfY2hhciAtIDB4QTQpICsgc2Vjb25kX2NoYXIgLSAweEExICsgNjMKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJldHVybiAxNTcgKiAoZmlyc3RfY2hhciAtIDB4QTQpICsgc2Vjb25kX2NoYXIgLSAweDQwCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIC0xCgoKY2xhc3MgU0pJU0Rpc3RyaWJ1dGlvbkFuYWx5c2lzKENoYXJEaXN0cmlidXRpb25BbmFseXNpcyk6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc3VwZXIoU0pJU0Rpc3RyaWJ1dGlvbkFuYWx5c2lzLCBzZWxmKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5fY2hhcl90b19mcmVxX29yZGVyID0gSklTX0NIQVJfVE9fRlJFUV9PUkRFUgogICAgICAgIHNlbGYuX3RhYmxlX3NpemUgPSBKSVNfVEFCTEVfU0laRQogICAgICAgIHNlbGYudHlwaWNhbF9kaXN0cmlidXRpb25fcmF0aW8gPSBKSVNfVFlQSUNBTF9ESVNUUklCVVRJT05fUkFUSU8KCiAgICBkZWYgZ2V0X29yZGVyKHNlbGYsIGJ5dGVfc3RyKToKICAgICAgICAjIGZvciBzamlzIGVuY29kaW5nLCB3ZSBhcmUgaW50ZXJlc3RlZAogICAgICAgICMgICBmaXJzdCAgYnl0ZSByYW5nZTogMHg4MSAtLSAweDlmICwgMHhlMCAtLSAweGZlCiAgICAgICAgIyAgIHNlY29uZCBieXRlIHJhbmdlOiAweDQwIC0tIDB4N2UsICAweDgxIC0tIG94ZmUKICAgICAgICAjIG5vIHZhbGlkYXRpb24gbmVlZGVkIGhlcmUuIFN0YXRlIG1hY2hpbmUgaGFzIGRvbmUgdGhhdAogICAgICAgIGZpcnN0X2NoYXIsIHNlY29uZF9jaGFyID0gYnl0ZV9zdHJbMF0sIGJ5dGVfc3RyWzFdCiAgICAgICAgaWYgKGZpcnN0X2NoYXIgPj0gMHg4MSkgYW5kIChmaXJzdF9jaGFyIDw9IDB4OUYpOgogICAgICAgICAgICBvcmRlciA9IDE4OCAqIChmaXJzdF9jaGFyIC0gMHg4MSkKICAgICAgICBlbGlmIChmaXJzdF9jaGFyID49IDB4RTApIGFuZCAoZmlyc3RfY2hhciA8PSAweEVGKToKICAgICAgICAgICAgb3JkZXIgPSAxODggKiAoZmlyc3RfY2hhciAtIDB4RTAgKyAzMSkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gLTEKICAgICAgICBvcmRlciA9IG9yZGVyICsgc2Vjb25kX2NoYXIgLSAweDQwCiAgICAgICAgaWYgc2Vjb25kX2NoYXIgPiAweDdGOgogICAgICAgICAgICBvcmRlciA9IC0xCiAgICAgICAgcmV0dXJuIG9yZGVyCgoKY2xhc3MgRVVDSlBEaXN0cmlidXRpb25BbmFseXNpcyhDaGFyRGlzdHJpYnV0aW9uQW5hbHlzaXMpOgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHN1cGVyKEVVQ0pQRGlzdHJpYnV0aW9uQW5hbHlzaXMsIHNlbGYpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLl9jaGFyX3RvX2ZyZXFfb3JkZXIgPSBKSVNfQ0hBUl9UT19GUkVRX09SREVSCiAgICAgICAgc2VsZi5fdGFibGVfc2l6ZSA9IEpJU19UQUJMRV9TSVpFCiAgICAgICAgc2VsZi50eXBpY2FsX2Rpc3RyaWJ1dGlvbl9yYXRpbyA9IEpJU19UWVBJQ0FMX0RJU1RSSUJVVElPTl9SQVRJTwoKICAgIGRlZiBnZXRfb3JkZXIoc2VsZiwgYnl0ZV9zdHIpOgogICAgICAgICMgZm9yIGV1Yy1KUCBlbmNvZGluZywgd2UgYXJlIGludGVyZXN0ZWQKICAgICAgICAjICAgZmlyc3QgIGJ5dGUgcmFuZ2U6IDB4YTAgLS0gMHhmZQogICAgICAgICMgICBzZWNvbmQgYnl0ZSByYW5nZTogMHhhMSAtLSAweGZlCiAgICAgICAgIyBubyB2YWxpZGF0aW9uIG5lZWRlZCBoZXJlLiBTdGF0ZSBtYWNoaW5lIGhhcyBkb25lIHRoYXQKICAgICAgICBjaGFyID0gYnl0ZV9zdHJbMF0KICAgICAgICBpZiBjaGFyID49IDB4QTA6CiAgICAgICAgICAgIHJldHVybiA5NCAqIChjaGFyIC0gMHhBMSkgKyBieXRlX3N0clsxXSAtIDB4YTEKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gLTEKUEsDBBQAAAAAAAAAIQCJWSSIyw4AAMsOAABGAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2NoYXJzZXRncm91cHByb2Jlci5weSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBCRUdJTiBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFRoZSBPcmlnaW5hbCBDb2RlIGlzIE1vemlsbGEgQ29tbXVuaWNhdG9yIGNsaWVudCBjb2RlLgojCiMgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiMgTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24uCiMgUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMTk5OAojIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIwojIENvbnRyaWJ1dG9yKHMpOgojICAgTWFyayBQaWxncmltIC0gcG9ydCB0byBQeXRob24KIwojIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCiMgMDIxMTAtMTMwMSAgVVNBCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRU5EIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKZnJvbSAuZW51bXMgaW1wb3J0IFByb2JpbmdTdGF0ZQpmcm9tIC5jaGFyc2V0cHJvYmVyIGltcG9ydCBDaGFyU2V0UHJvYmVyCgoKY2xhc3MgQ2hhclNldEdyb3VwUHJvYmVyKENoYXJTZXRQcm9iZXIpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGxhbmdfZmlsdGVyPU5vbmUpOgogICAgICAgIHN1cGVyKENoYXJTZXRHcm91cFByb2Jlciwgc2VsZikuX19pbml0X18obGFuZ19maWx0ZXI9bGFuZ19maWx0ZXIpCiAgICAgICAgc2VsZi5fYWN0aXZlX251bSA9IDAKICAgICAgICBzZWxmLnByb2JlcnMgPSBbXQogICAgICAgIHNlbGYuX2Jlc3RfZ3Vlc3NfcHJvYmVyID0gTm9uZQoKICAgIGRlZiByZXNldChzZWxmKToKICAgICAgICBzdXBlcihDaGFyU2V0R3JvdXBQcm9iZXIsIHNlbGYpLnJlc2V0KCkKICAgICAgICBzZWxmLl9hY3RpdmVfbnVtID0gMAogICAgICAgIGZvciBwcm9iZXIgaW4gc2VsZi5wcm9iZXJzOgogICAgICAgICAgICBpZiBwcm9iZXI6CiAgICAgICAgICAgICAgICBwcm9iZXIucmVzZXQoKQogICAgICAgICAgICAgICAgcHJvYmVyLmFjdGl2ZSA9IFRydWUKICAgICAgICAgICAgICAgIHNlbGYuX2FjdGl2ZV9udW0gKz0gMQogICAgICAgIHNlbGYuX2Jlc3RfZ3Vlc3NfcHJvYmVyID0gTm9uZQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGNoYXJzZXRfbmFtZShzZWxmKToKICAgICAgICBpZiBub3Qgc2VsZi5fYmVzdF9ndWVzc19wcm9iZXI6CiAgICAgICAgICAgIHNlbGYuZ2V0X2NvbmZpZGVuY2UoKQogICAgICAgICAgICBpZiBub3Qgc2VsZi5fYmVzdF9ndWVzc19wcm9iZXI6CiAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIHJldHVybiBzZWxmLl9iZXN0X2d1ZXNzX3Byb2Jlci5jaGFyc2V0X25hbWUKCiAgICBAcHJvcGVydHkKICAgIGRlZiBsYW5ndWFnZShzZWxmKToKICAgICAgICBpZiBub3Qgc2VsZi5fYmVzdF9ndWVzc19wcm9iZXI6CiAgICAgICAgICAgIHNlbGYuZ2V0X2NvbmZpZGVuY2UoKQogICAgICAgICAgICBpZiBub3Qgc2VsZi5fYmVzdF9ndWVzc19wcm9iZXI6CiAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIHJldHVybiBzZWxmLl9iZXN0X2d1ZXNzX3Byb2Jlci5sYW5ndWFnZQoKICAgIGRlZiBmZWVkKHNlbGYsIGJ5dGVfc3RyKToKICAgICAgICBmb3IgcHJvYmVyIGluIHNlbGYucHJvYmVyczoKICAgICAgICAgICAgaWYgbm90IHByb2JlcjoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlmIG5vdCBwcm9iZXIuYWN0aXZlOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgc3RhdGUgPSBwcm9iZXIuZmVlZChieXRlX3N0cikKICAgICAgICAgICAgaWYgbm90IHN0YXRlOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYgc3RhdGUgPT0gUHJvYmluZ1N0YXRlLkZPVU5EX0lUOgogICAgICAgICAgICAgICAgc2VsZi5fYmVzdF9ndWVzc19wcm9iZXIgPSBwcm9iZXIKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnN0YXRlCiAgICAgICAgICAgIGVsaWYgc3RhdGUgPT0gUHJvYmluZ1N0YXRlLk5PVF9NRToKICAgICAgICAgICAgICAgIHByb2Jlci5hY3RpdmUgPSBGYWxzZQogICAgICAgICAgICAgICAgc2VsZi5fYWN0aXZlX251bSAtPSAxCiAgICAgICAgICAgICAgICBpZiBzZWxmLl9hY3RpdmVfbnVtIDw9IDA6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fc3RhdGUgPSBQcm9iaW5nU3RhdGUuTk9UX01FCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuc3RhdGUKICAgICAgICByZXR1cm4gc2VsZi5zdGF0ZQoKICAgIGRlZiBnZXRfY29uZmlkZW5jZShzZWxmKToKICAgICAgICBzdGF0ZSA9IHNlbGYuc3RhdGUKICAgICAgICBpZiBzdGF0ZSA9PSBQcm9iaW5nU3RhdGUuRk9VTkRfSVQ6CiAgICAgICAgICAgIHJldHVybiAwLjk5CiAgICAgICAgZWxpZiBzdGF0ZSA9PSBQcm9iaW5nU3RhdGUuTk9UX01FOgogICAgICAgICAgICByZXR1cm4gMC4wMQogICAgICAgIGJlc3RfY29uZiA9IDAuMAogICAgICAgIHNlbGYuX2Jlc3RfZ3Vlc3NfcHJvYmVyID0gTm9uZQogICAgICAgIGZvciBwcm9iZXIgaW4gc2VsZi5wcm9iZXJzOgogICAgICAgICAgICBpZiBub3QgcHJvYmVyOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYgbm90IHByb2Jlci5hY3RpdmU6CiAgICAgICAgICAgICAgICBzZWxmLmxvZ2dlci5kZWJ1ZygnJXMgbm90IGFjdGl2ZScsIHByb2Jlci5jaGFyc2V0X25hbWUpCiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBjb25mID0gcHJvYmVyLmdldF9jb25maWRlbmNlKCkKICAgICAgICAgICAgc2VsZi5sb2dnZXIuZGVidWcoJyVzICVzIGNvbmZpZGVuY2UgPSAlcycsIHByb2Jlci5jaGFyc2V0X25hbWUsIHByb2Jlci5sYW5ndWFnZSwgY29uZikKICAgICAgICAgICAgaWYgYmVzdF9jb25mIDwgY29uZjoKICAgICAgICAgICAgICAgIGJlc3RfY29uZiA9IGNvbmYKICAgICAgICAgICAgICAgIHNlbGYuX2Jlc3RfZ3Vlc3NfcHJvYmVyID0gcHJvYmVyCiAgICAgICAgaWYgbm90IHNlbGYuX2Jlc3RfZ3Vlc3NfcHJvYmVyOgogICAgICAgICAgICByZXR1cm4gMC4wCiAgICAgICAgcmV0dXJuIGJlc3RfY29uZgpQSwMEFAAAAAAAAAAhAOCXYVr2EwAA9hMAAEEAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvY2hhcnNldHByb2Jlci5weSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBCRUdJTiBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFRoZSBPcmlnaW5hbCBDb2RlIGlzIE1vemlsbGEgVW5pdmVyc2FsIGNoYXJzZXQgZGV0ZWN0b3IgY29kZS4KIwojIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwojIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uLgojIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMDEKIyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiMKIyBDb250cmlidXRvcihzKToKIyAgIE1hcmsgUGlsZ3JpbSAtIHBvcnQgdG8gUHl0aG9uCiMgICBTaHkgU2hhbG9tIC0gb3JpZ2luYWwgQyBjb2RlCiMKIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgojIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQojIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQojIDAyMTEwLTEzMDEgIFVTQQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVORCBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCmltcG9ydCBsb2dnaW5nCmltcG9ydCByZQoKZnJvbSAuZW51bXMgaW1wb3J0IFByb2JpbmdTdGF0ZQoKCmNsYXNzIENoYXJTZXRQcm9iZXIob2JqZWN0KToKCiAgICBTSE9SVENVVF9USFJFU0hPTEQgPSAwLjk1CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGxhbmdfZmlsdGVyPU5vbmUpOgogICAgICAgIHNlbGYuX3N0YXRlID0gTm9uZQogICAgICAgIHNlbGYubGFuZ19maWx0ZXIgPSBsYW5nX2ZpbHRlcgogICAgICAgIHNlbGYubG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgogICAgZGVmIHJlc2V0KHNlbGYpOgogICAgICAgIHNlbGYuX3N0YXRlID0gUHJvYmluZ1N0YXRlLkRFVEVDVElORwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGNoYXJzZXRfbmFtZShzZWxmKToKICAgICAgICByZXR1cm4gTm9uZQoKICAgIGRlZiBmZWVkKHNlbGYsIGJ1Zik6CiAgICAgICAgcGFzcwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHN0YXRlKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9zdGF0ZQoKICAgIGRlZiBnZXRfY29uZmlkZW5jZShzZWxmKToKICAgICAgICByZXR1cm4gMC4wCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIGZpbHRlcl9oaWdoX2J5dGVfb25seShidWYpOgogICAgICAgIGJ1ZiA9IHJlLnN1YihiJyhbXHgwMC1ceDdGXSkrJywgYicgJywgYnVmKQogICAgICAgIHJldHVybiBidWYKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgZmlsdGVyX2ludGVybmF0aW9uYWxfd29yZHMoYnVmKToKICAgICAgICAiIiIKICAgICAgICBXZSBkZWZpbmUgdGhyZWUgdHlwZXMgb2YgYnl0ZXM6CiAgICAgICAgYWxwaGFiZXQ6IGVuZ2xpc2ggYWxwaGFiZXRzIFthLXpBLVpdCiAgICAgICAgaW50ZXJuYXRpb25hbDogaW50ZXJuYXRpb25hbCBjaGFyYWN0ZXJzIFtceDgwLVx4RkZdCiAgICAgICAgbWFya2VyOiBldmVyeXRoaW5nIGVsc2UgW15hLXpBLVpceDgwLVx4RkZdCgogICAgICAgIFRoZSBpbnB1dCBidWZmZXIgY2FuIGJlIHRob3VnaHQgdG8gY29udGFpbiBhIHNlcmllcyBvZiB3b3JkcyBkZWxpbWl0ZWQKICAgICAgICBieSBtYXJrZXJzLiBUaGlzIGZ1bmN0aW9uIHdvcmtzIHRvIGZpbHRlciBhbGwgd29yZHMgdGhhdCBjb250YWluIGF0CiAgICAgICAgbGVhc3Qgb25lIGludGVybmF0aW9uYWwgY2hhcmFjdGVyLiBBbGwgY29udGlndW91cyBzZXF1ZW5jZXMgb2YgbWFya2VycwogICAgICAgIGFyZSByZXBsYWNlZCBieSBhIHNpbmdsZSBzcGFjZSBhc2NpaSBjaGFyYWN0ZXIuCgogICAgICAgIFRoaXMgZmlsdGVyIGFwcGxpZXMgdG8gYWxsIHNjcmlwdHMgd2hpY2ggZG8gbm90IHVzZSBFbmdsaXNoIGNoYXJhY3RlcnMuCiAgICAgICAgIiIiCiAgICAgICAgZmlsdGVyZWQgPSBieXRlYXJyYXkoKQoKICAgICAgICAjIFRoaXMgcmVnZXggZXhwcmVzc2lvbiBmaWx0ZXJzIG91dCBvbmx5IHdvcmRzIHRoYXQgaGF2ZSBhdC1sZWFzdCBvbmUKICAgICAgICAjIGludGVybmF0aW9uYWwgY2hhcmFjdGVyLiBUaGUgd29yZCBtYXkgaW5jbHVkZSBvbmUgbWFya2VyIGNoYXJhY3RlciBhdAogICAgICAgICMgdGhlIGVuZC4KICAgICAgICB3b3JkcyA9IHJlLmZpbmRhbGwoYidbYS16QS1aXSpbXHg4MC1ceEZGXStbYS16QS1aXSpbXmEtekEtWlx4ODAtXHhGRl0/JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmKQoKICAgICAgICBmb3Igd29yZCBpbiB3b3JkczoKICAgICAgICAgICAgZmlsdGVyZWQuZXh0ZW5kKHdvcmRbOi0xXSkKCiAgICAgICAgICAgICMgSWYgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSB3b3JkIGlzIGEgbWFya2VyLCByZXBsYWNlIGl0IHdpdGggYQogICAgICAgICAgICAjIHNwYWNlIGFzIG1hcmtlcnMgc2hvdWxkbid0IGFmZmVjdCBvdXIgYW5hbHlzaXMgKHRoZXkgYXJlIHVzZWQKICAgICAgICAgICAgIyBzaW1pbGFybHkgYWNyb3NzIGFsbCBsYW5ndWFnZXMgYW5kIG1heSB0aHVzIGhhdmUgc2ltaWxhcgogICAgICAgICAgICAjIGZyZXF1ZW5jaWVzKS4KICAgICAgICAgICAgbGFzdF9jaGFyID0gd29yZFstMTpdCiAgICAgICAgICAgIGlmIG5vdCBsYXN0X2NoYXIuaXNhbHBoYSgpIGFuZCBsYXN0X2NoYXIgPCBiJ1x4ODAnOgogICAgICAgICAgICAgICAgbGFzdF9jaGFyID0gYicgJwogICAgICAgICAgICBmaWx0ZXJlZC5leHRlbmQobGFzdF9jaGFyKQoKICAgICAgICByZXR1cm4gZmlsdGVyZWQKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgZmlsdGVyX3dpdGhfZW5nbGlzaF9sZXR0ZXJzKGJ1Zik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJucyBhIGNvcHkgb2YgYGBidWZgYCB0aGF0IHJldGFpbnMgb25seSB0aGUgc2VxdWVuY2VzIG9mIEVuZ2xpc2gKICAgICAgICBhbHBoYWJldCBhbmQgaGlnaCBieXRlIGNoYXJhY3RlcnMgdGhhdCBhcmUgbm90IGJldHdlZW4gPD4gY2hhcmFjdGVycy4KICAgICAgICBBbHNvIHJldGFpbnMgRW5nbGlzaCBhbHBoYWJldCBhbmQgaGlnaCBieXRlIGNoYXJhY3RlcnMgaW1tZWRpYXRlbHkKICAgICAgICBiZWZvcmUgb2NjdXJyZW5jZXMgb2YgPi4KCiAgICAgICAgVGhpcyBmaWx0ZXIgY2FuIGJlIGFwcGxpZWQgdG8gYWxsIHNjcmlwdHMgd2hpY2ggY29udGFpbiBib3RoIEVuZ2xpc2gKICAgICAgICBjaGFyYWN0ZXJzIGFuZCBleHRlbmRlZCBBU0NJSSBjaGFyYWN0ZXJzLCBidXQgaXMgY3VycmVudGx5IG9ubHkgdXNlZCBieQogICAgICAgIGBgTGF0aW4xUHJvYmVyYGAuCiAgICAgICAgIiIiCiAgICAgICAgZmlsdGVyZWQgPSBieXRlYXJyYXkoKQogICAgICAgIGluX3RhZyA9IEZhbHNlCiAgICAgICAgcHJldiA9IDAKCiAgICAgICAgZm9yIGN1cnIgaW4gcmFuZ2UobGVuKGJ1ZikpOgogICAgICAgICAgICAjIFNsaWNlIGhlcmUgdG8gZ2V0IGJ5dGVzIGluc3RlYWQgb2YgYW4gaW50IHdpdGggUHl0aG9uIDMKICAgICAgICAgICAgYnVmX2NoYXIgPSBidWZbY3VycjpjdXJyICsgMV0KICAgICAgICAgICAgIyBDaGVjayBpZiB3ZSdyZSBjb21pbmcgb3V0IG9mIG9yIGVudGVyaW5nIGFuIEhUTUwgdGFnCiAgICAgICAgICAgIGlmIGJ1Zl9jaGFyID09IGInPic6CiAgICAgICAgICAgICAgICBpbl90YWcgPSBGYWxzZQogICAgICAgICAgICBlbGlmIGJ1Zl9jaGFyID09IGInPCc6CiAgICAgICAgICAgICAgICBpbl90YWcgPSBUcnVlCgogICAgICAgICAgICAjIElmIGN1cnJlbnQgY2hhcmFjdGVyIGlzIG5vdCBleHRlbmRlZC1BU0NJSSBhbmQgbm90IGFscGhhYmV0aWMuLi4KICAgICAgICAgICAgaWYgYnVmX2NoYXIgPCBiJ1x4ODAnIGFuZCBub3QgYnVmX2NoYXIuaXNhbHBoYSgpOgogICAgICAgICAgICAgICAgIyAuLi5hbmQgd2UncmUgbm90IGluIGEgdGFnCiAgICAgICAgICAgICAgICBpZiBjdXJyID4gcHJldiBhbmQgbm90IGluX3RhZzoKICAgICAgICAgICAgICAgICAgICAjIEtlZXAgZXZlcnl0aGluZyBhZnRlciBsYXN0IG5vbi1leHRlbmRlZC1BU0NJSSwKICAgICAgICAgICAgICAgICAgICAjIG5vbi1hbHBoYWJldGljIGNoYXJhY3RlcgogICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkLmV4dGVuZChidWZbcHJldjpjdXJyXSkKICAgICAgICAgICAgICAgICAgICAjIE91dHB1dCBhIHNwYWNlIHRvIGRlbGltaXQgc3RyZXRjaCB3ZSBrZXB0CiAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWQuZXh0ZW5kKGInICcpCiAgICAgICAgICAgICAgICBwcmV2ID0gY3VyciArIDEKCiAgICAgICAgIyBJZiB3ZSdyZSBub3QgaW4gYSB0YWcuLi4KICAgICAgICBpZiBub3QgaW5fdGFnOgogICAgICAgICAgICAjIEtlZXAgZXZlcnl0aGluZyBhZnRlciBsYXN0IG5vbi1leHRlbmRlZC1BU0NJSSwgbm9uLWFscGhhYmV0aWMKICAgICAgICAgICAgIyBjaGFyYWN0ZXIKICAgICAgICAgICAgZmlsdGVyZWQuZXh0ZW5kKGJ1ZltwcmV2Ol0pCgogICAgICAgIHJldHVybiBmaWx0ZXJlZApQSwMEFAAAAAAAAAAhAJMG1zIBAAAAAQAAAEAAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvY2xpL19faW5pdF9fLnB5ClBLAwQUAAAAAAAAACEAX92tubIKAACyCgAAQgAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9jbGkvY2hhcmRldGVjdC5weSMhL3Vzci9iaW4vZW52IHB5dGhvbgoiIiIKU2NyaXB0IHdoaWNoIHRha2VzIG9uZSBvciBtb3JlIGZpbGUgcGF0aHMgYW5kIHJlcG9ydHMgb24gdGhlaXIgZGV0ZWN0ZWQKZW5jb2RpbmdzCgpFeGFtcGxlOjoKCiAgICAlIGNoYXJkZXRlY3Qgc29tZWZpbGUgc29tZW90aGVyZmlsZQogICAgc29tZWZpbGU6IHdpbmRvd3MtMTI1MiB3aXRoIGNvbmZpZGVuY2UgMC41CiAgICBzb21lb3RoZXJmaWxlOiBhc2NpaSB3aXRoIGNvbmZpZGVuY2UgMS4wCgpJZiBubyBwYXRocyBhcmUgcHJvdmlkZWQsIGl0IHRha2VzIGl0cyBpbnB1dCBmcm9tIHN0ZGluLgoKIiIiCgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgcHJpbnRfZnVuY3Rpb24sIHVuaWNvZGVfbGl0ZXJhbHMKCmltcG9ydCBhcmdwYXJzZQppbXBvcnQgc3lzCgpmcm9tIGNoYXJkZXQgaW1wb3J0IF9fdmVyc2lvbl9fCmZyb20gY2hhcmRldC5jb21wYXQgaW1wb3J0IFBZMgpmcm9tIGNoYXJkZXQudW5pdmVyc2FsZGV0ZWN0b3IgaW1wb3J0IFVuaXZlcnNhbERldGVjdG9yCgoKZGVmIGRlc2NyaXB0aW9uX29mKGxpbmVzLCBuYW1lPSdzdGRpbicpOgogICAgIiIiCiAgICBSZXR1cm4gYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgcHJvYmFibGUgZW5jb2Rpbmcgb2YgYSBmaWxlIG9yCiAgICBsaXN0IG9mIHN0cmluZ3MuCgogICAgOnBhcmFtIGxpbmVzOiBUaGUgbGluZXMgdG8gZ2V0IHRoZSBlbmNvZGluZyBvZi4KICAgIDp0eXBlIGxpbmVzOiBJdGVyYWJsZSBvZiBieXRlcwogICAgOnBhcmFtIG5hbWU6IE5hbWUgb2YgZmlsZSBvciBjb2xsZWN0aW9uIG9mIGxpbmVzCiAgICA6dHlwZSBuYW1lOiBzdHIKICAgICIiIgogICAgdSA9IFVuaXZlcnNhbERldGVjdG9yKCkKICAgIGZvciBsaW5lIGluIGxpbmVzOgogICAgICAgIGxpbmUgPSBieXRlYXJyYXkobGluZSkKICAgICAgICB1LmZlZWQobGluZSkKICAgICAgICAjIHNob3J0Y3V0IG91dCBvZiB0aGUgbG9vcCB0byBzYXZlIHJlYWRpbmcgZnVydGhlciAtIHBhcnRpY3VsYXJseSB1c2VmdWwgaWYgd2UgcmVhZCBhIEJPTS4KICAgICAgICBpZiB1LmRvbmU6CiAgICAgICAgICAgIGJyZWFrCiAgICB1LmNsb3NlKCkKICAgIHJlc3VsdCA9IHUucmVzdWx0CiAgICBpZiBQWTI6CiAgICAgICAgbmFtZSA9IG5hbWUuZGVjb2RlKHN5cy5nZXRmaWxlc3lzdGVtZW5jb2RpbmcoKSwgJ2lnbm9yZScpCiAgICBpZiByZXN1bHRbJ2VuY29kaW5nJ106CiAgICAgICAgcmV0dXJuICd7MH06IHsxfSB3aXRoIGNvbmZpZGVuY2UgezJ9Jy5mb3JtYXQobmFtZSwgcmVzdWx0WydlbmNvZGluZyddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFsnY29uZmlkZW5jZSddKQogICAgZWxzZToKICAgICAgICByZXR1cm4gJ3swfTogbm8gcmVzdWx0Jy5mb3JtYXQobmFtZSkKCgpkZWYgbWFpbihhcmd2PU5vbmUpOgogICAgIiIiCiAgICBIYW5kbGVzIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgYW5kIGdldHMgdGhpbmdzIHN0YXJ0ZWQuCgogICAgOnBhcmFtIGFyZ3Y6IExpc3Qgb2YgYXJndW1lbnRzLCBhcyBpZiBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQtbGluZS4KICAgICAgICAgICAgICAgICBJZiBOb25lLCBgYHN5cy5hcmd2WzE6XWBgIGlzIHVzZWQgaW5zdGVhZC4KICAgIDp0eXBlIGFyZ3Y6IGxpc3Qgb2Ygc3RyCiAgICAiIiIKICAgICMgR2V0IGNvbW1hbmQgbGluZSBhcmd1bWVudHMKICAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKAogICAgICAgIGRlc2NyaXB0aW9uPSJUYWtlcyBvbmUgb3IgbW9yZSBmaWxlIHBhdGhzIGFuZCByZXBvcnRzIHRoZWlyIGRldGVjdGVkIFwKICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdzIikKICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJ2lucHV0JywKICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nRmlsZSB3aG9zZSBlbmNvZGluZyB3ZSB3b3VsZCBsaWtlIHRvIGRldGVybWluZS4gXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdDogc3RkaW4pJywKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1hcmdwYXJzZS5GaWxlVHlwZSgncmInKSwgbmFyZ3M9JyonLAogICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PVtzeXMuc3RkaW4gaWYgUFkyIGVsc2Ugc3lzLnN0ZGluLmJ1ZmZlcl0pCiAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXZlcnNpb24nLCBhY3Rpb249J3ZlcnNpb24nLAogICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uPSclKHByb2cpcyB7MH0nLmZvcm1hdChfX3ZlcnNpb25fXykpCiAgICBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoYXJndikKCiAgICBmb3IgZiBpbiBhcmdzLmlucHV0OgogICAgICAgIGlmIGYuaXNhdHR5KCk6CiAgICAgICAgICAgIHByaW50KCJZb3UgYXJlIHJ1bm5pbmcgY2hhcmRldGVjdCBpbnRlcmFjdGl2ZWx5LiBQcmVzcyAiICsKICAgICAgICAgICAgICAgICAgIkNUUkwtRCB0d2ljZSBhdCB0aGUgc3RhcnQgb2YgYSBibGFuayBsaW5lIHRvIHNpZ25hbCB0aGUgIiArCiAgICAgICAgICAgICAgICAgICJlbmQgb2YgeW91ciBpbnB1dC4gSWYgeW91IHdhbnQgaGVscCwgcnVuIGNoYXJkZXRlY3QgIiArCiAgICAgICAgICAgICAgICAgICItLWhlbHBcbiIsIGZpbGU9c3lzLnN0ZGVycikKICAgICAgICBwcmludChkZXNjcmlwdGlvbl9vZihmLCBmLm5hbWUpKQoKCmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICBtYWluKCkKUEsDBBQAAAAAAAAAIQBc+zdIBg4AAAYOAABGAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2NvZGluZ3N0YXRlbWFjaGluZS5weSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBCRUdJTiBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFRoZSBPcmlnaW5hbCBDb2RlIGlzIG1vemlsbGEub3JnIGNvZGUuCiMKIyBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKIyBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi4KIyBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAxOTk4CiMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgojCiMgQ29udHJpYnV0b3Iocyk6CiMgICBNYXJrIFBpbGdyaW0gLSBwb3J0IHRvIFB5dGhvbgojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKIyAwMjExMC0xMzAxICBVU0EKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFTkQgTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgppbXBvcnQgbG9nZ2luZwoKZnJvbSAuZW51bXMgaW1wb3J0IE1hY2hpbmVTdGF0ZQoKCmNsYXNzIENvZGluZ1N0YXRlTWFjaGluZShvYmplY3QpOgogICAgIiIiCiAgICBBIHN0YXRlIG1hY2hpbmUgdG8gdmVyaWZ5IGEgYnl0ZSBzZXF1ZW5jZSBmb3IgYSBwYXJ0aWN1bGFyIGVuY29kaW5nLiBGb3IKICAgIGVhY2ggYnl0ZSB0aGUgZGV0ZWN0b3IgcmVjZWl2ZXMsIGl0IHdpbGwgZmVlZCB0aGF0IGJ5dGUgdG8gZXZlcnkgYWN0aXZlCiAgICBzdGF0ZSBtYWNoaW5lIGF2YWlsYWJsZSwgb25lIGJ5dGUgYXQgYSB0aW1lLiBUaGUgc3RhdGUgbWFjaGluZSBjaGFuZ2VzIGl0cwogICAgc3RhdGUgYmFzZWQgb24gaXRzIHByZXZpb3VzIHN0YXRlIGFuZCB0aGUgYnl0ZSBpdCByZWNlaXZlcy4gVGhlcmUgYXJlIDMKICAgIHN0YXRlcyBpbiBhIHN0YXRlIG1hY2hpbmUgdGhhdCBhcmUgb2YgaW50ZXJlc3QgdG8gYW4gYXV0by1kZXRlY3RvcjoKCiAgICBTVEFSVCBzdGF0ZTogVGhpcyBpcyB0aGUgc3RhdGUgdG8gc3RhcnQgd2l0aCwgb3IgYSBsZWdhbCBieXRlIHNlcXVlbmNlCiAgICAgICAgICAgICAgICAgKGkuZS4gYSB2YWxpZCBjb2RlIHBvaW50KSBmb3IgY2hhcmFjdGVyIGhhcyBiZWVuIGlkZW50aWZpZWQuCgogICAgTUUgc3RhdGU6ICBUaGlzIGluZGljYXRlcyB0aGF0IHRoZSBzdGF0ZSBtYWNoaW5lIGlkZW50aWZpZWQgYSBieXRlIHNlcXVlbmNlCiAgICAgICAgICAgICAgIHRoYXQgaXMgc3BlY2lmaWMgdG8gdGhlIGNoYXJzZXQgaXQgaXMgZGVzaWduZWQgZm9yIGFuZCB0aGF0CiAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIG90aGVyIHBvc3NpYmxlIGVuY29kaW5nIHdoaWNoIGNhbiBjb250YWluIHRoaXMgYnl0ZQogICAgICAgICAgICAgICBzZXF1ZW5jZS4gVGhpcyB3aWxsIHRvIGxlYWQgdG8gYW4gaW1tZWRpYXRlIHBvc2l0aXZlIGFuc3dlciBmb3IKICAgICAgICAgICAgICAgdGhlIGRldGVjdG9yLgoKICAgIEVSUk9SIHN0YXRlOiBUaGlzIGluZGljYXRlcyB0aGUgc3RhdGUgbWFjaGluZSBpZGVudGlmaWVkIGFuIGlsbGVnYWwgYnl0ZQogICAgICAgICAgICAgICAgIHNlcXVlbmNlIGZvciB0aGF0IGVuY29kaW5nLiBUaGlzIHdpbGwgbGVhZCB0byBhbiBpbW1lZGlhdGUKICAgICAgICAgICAgICAgICBuZWdhdGl2ZSBhbnN3ZXIgZm9yIHRoaXMgZW5jb2RpbmcuIERldGVjdG9yIHdpbGwgZXhjbHVkZSB0aGlzCiAgICAgICAgICAgICAgICAgZW5jb2RpbmcgZnJvbSBjb25zaWRlcmF0aW9uIGZyb20gaGVyZSBvbi4KICAgICIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHNtKToKICAgICAgICBzZWxmLl9tb2RlbCA9IHNtCiAgICAgICAgc2VsZi5fY3Vycl9ieXRlX3BvcyA9IDAKICAgICAgICBzZWxmLl9jdXJyX2NoYXJfbGVuID0gMAogICAgICAgIHNlbGYuX2N1cnJfc3RhdGUgPSBOb25lCiAgICAgICAgc2VsZi5sb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKICAgICAgICBzZWxmLnJlc2V0KCkKCiAgICBkZWYgcmVzZXQoc2VsZik6CiAgICAgICAgc2VsZi5fY3Vycl9zdGF0ZSA9IE1hY2hpbmVTdGF0ZS5TVEFSVAoKICAgIGRlZiBuZXh0X3N0YXRlKHNlbGYsIGMpOgogICAgICAgICMgZm9yIGVhY2ggYnl0ZSB3ZSBnZXQgaXRzIGNsYXNzCiAgICAgICAgIyBpZiBpdCBpcyBmaXJzdCBieXRlLCB3ZSBhbHNvIGdldCBieXRlIGxlbmd0aAogICAgICAgIGJ5dGVfY2xhc3MgPSBzZWxmLl9tb2RlbFsnY2xhc3NfdGFibGUnXVtjXQogICAgICAgIGlmIHNlbGYuX2N1cnJfc3RhdGUgPT0gTWFjaGluZVN0YXRlLlNUQVJUOgogICAgICAgICAgICBzZWxmLl9jdXJyX2J5dGVfcG9zID0gMAogICAgICAgICAgICBzZWxmLl9jdXJyX2NoYXJfbGVuID0gc2VsZi5fbW9kZWxbJ2NoYXJfbGVuX3RhYmxlJ11bYnl0ZV9jbGFzc10KICAgICAgICAjIGZyb20gYnl0ZSdzIGNsYXNzIGFuZCBzdGF0ZV90YWJsZSwgd2UgZ2V0IGl0cyBuZXh0IHN0YXRlCiAgICAgICAgY3Vycl9zdGF0ZSA9IChzZWxmLl9jdXJyX3N0YXRlICogc2VsZi5fbW9kZWxbJ2NsYXNzX2ZhY3RvciddCiAgICAgICAgICAgICAgICAgICAgICArIGJ5dGVfY2xhc3MpCiAgICAgICAgc2VsZi5fY3Vycl9zdGF0ZSA9IHNlbGYuX21vZGVsWydzdGF0ZV90YWJsZSddW2N1cnJfc3RhdGVdCiAgICAgICAgc2VsZi5fY3Vycl9ieXRlX3BvcyArPSAxCiAgICAgICAgcmV0dXJuIHNlbGYuX2N1cnJfc3RhdGUKCiAgICBkZWYgZ2V0X2N1cnJlbnRfY2hhcmxlbihzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fY3Vycl9jaGFyX2xlbgoKICAgIGRlZiBnZXRfY29kaW5nX3N0YXRlX21hY2hpbmUoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX21vZGVsWyduYW1lJ10KCiAgICBAcHJvcGVydHkKICAgIGRlZiBsYW5ndWFnZShzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fbW9kZWxbJ2xhbmd1YWdlJ10KUEsDBBQAAAAAAAAAIQB8huVlbgQAAG4EAAA6AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2NvbXBhdC5weSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBCRUdJTiBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIENvbnRyaWJ1dG9yKHMpOgojICAgRGFuIEJsYW5jaGFyZAojICAgSWFuIENvcmRhc2NvCiMKIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgojIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQojIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQojIDAyMTEwLTEzMDEgIFVTQQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVORCBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCmltcG9ydCBzeXMKCgppZiBzeXMudmVyc2lvbl9pbmZvIDwgKDMsIDApOgogICAgUFkyID0gVHJ1ZQogICAgUFkzID0gRmFsc2UKICAgIGJhc2Vfc3RyID0gKHN0ciwgdW5pY29kZSkKICAgIHRleHRfdHlwZSA9IHVuaWNvZGUKZWxzZToKICAgIFBZMiA9IEZhbHNlCiAgICBQWTMgPSBUcnVlCiAgICBiYXNlX3N0ciA9IChieXRlcywgc3RyKQogICAgdGV4dF90eXBlID0gc3RyClBLAwQUAAAAAAAAACEAvUKaMT8HAAA/BwAAPwAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9jcDk0OXByb2Jlci5weSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBCRUdJTiBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFRoZSBPcmlnaW5hbCBDb2RlIGlzIG1vemlsbGEub3JnIGNvZGUuCiMKIyBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKIyBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi4KIyBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAxOTk4CiMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgojCiMgQ29udHJpYnV0b3Iocyk6CiMgICBNYXJrIFBpbGdyaW0gLSBwb3J0IHRvIFB5dGhvbgojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKIyAwMjExMC0xMzAxICBVU0EKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFTkQgTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpmcm9tIC5jaGFyZGlzdHJpYnV0aW9uIGltcG9ydCBFVUNLUkRpc3RyaWJ1dGlvbkFuYWx5c2lzCmZyb20gLmNvZGluZ3N0YXRlbWFjaGluZSBpbXBvcnQgQ29kaW5nU3RhdGVNYWNoaW5lCmZyb20gLm1iY2hhcnNldHByb2JlciBpbXBvcnQgTXVsdGlCeXRlQ2hhclNldFByb2Jlcgpmcm9tIC5tYmNzc20gaW1wb3J0IENQOTQ5X1NNX01PREVMCgoKY2xhc3MgQ1A5NDlQcm9iZXIoTXVsdGlCeXRlQ2hhclNldFByb2Jlcik6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc3VwZXIoQ1A5NDlQcm9iZXIsIHNlbGYpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLmNvZGluZ19zbSA9IENvZGluZ1N0YXRlTWFjaGluZShDUDk0OV9TTV9NT0RFTCkKICAgICAgICAjIE5PVEU6IENQOTQ5IGlzIGEgc3VwZXJzZXQgb2YgRVVDLUtSLCBzbyB0aGUgZGlzdHJpYnV0aW9uIHNob3VsZCBiZQogICAgICAgICMgICAgICAgbm90IGRpZmZlcmVudC4KICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbl9hbmFseXplciA9IEVVQ0tSRGlzdHJpYnV0aW9uQW5hbHlzaXMoKQogICAgICAgIHNlbGYucmVzZXQoKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGNoYXJzZXRfbmFtZShzZWxmKToKICAgICAgICByZXR1cm4gIkNQOTQ5IgoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGxhbmd1YWdlKHNlbGYpOgogICAgICAgIHJldHVybiAiS29yZWFuIgpQSwMEFAAAAAAAAAAhAEQErMl9BgAAfQYAADkAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvZW51bXMucHkiIiIKQWxsIG9mIHRoZSBFbnVtcyB0aGF0IGFyZSB1c2VkIHRocm91Z2hvdXQgdGhlIGNoYXJkZXQgcGFja2FnZS4KCjphdXRob3I6IERhbiBCbGFuY2hhcmQgKGRhbi5ibGFuY2hhcmRAZ21haWwuY29tKQoiIiIKCgpjbGFzcyBJbnB1dFN0YXRlKG9iamVjdCk6CiAgICAiIiIKICAgIFRoaXMgZW51bSByZXByZXNlbnRzIHRoZSBkaWZmZXJlbnQgc3RhdGVzIGEgdW5pdmVyc2FsIGRldGVjdG9yIGNhbiBiZSBpbi4KICAgICIiIgogICAgUFVSRV9BU0NJSSA9IDAKICAgIEVTQ19BU0NJSSA9IDEKICAgIEhJR0hfQllURSA9IDIKCgpjbGFzcyBMYW5ndWFnZUZpbHRlcihvYmplY3QpOgogICAgIiIiCiAgICBUaGlzIGVudW0gcmVwcmVzZW50cyB0aGUgZGlmZmVyZW50IGxhbmd1YWdlIGZpbHRlcnMgd2UgY2FuIGFwcGx5IHRvIGEKICAgIGBgVW5pdmVyc2FsRGV0ZWN0b3JgYC4KICAgICIiIgogICAgQ0hJTkVTRV9TSU1QTElGSUVEID0gMHgwMQogICAgQ0hJTkVTRV9UUkFESVRJT05BTCA9IDB4MDIKICAgIEpBUEFORVNFID0gMHgwNAogICAgS09SRUFOID0gMHgwOAogICAgTk9OX0NKSyA9IDB4MTAKICAgIEFMTCA9IDB4MUYKICAgIENISU5FU0UgPSBDSElORVNFX1NJTVBMSUZJRUQgfCBDSElORVNFX1RSQURJVElPTkFMCiAgICBDSksgPSBDSElORVNFIHwgSkFQQU5FU0UgfCBLT1JFQU4KCgpjbGFzcyBQcm9iaW5nU3RhdGUob2JqZWN0KToKICAgICIiIgogICAgVGhpcyBlbnVtIHJlcHJlc2VudHMgdGhlIGRpZmZlcmVudCBzdGF0ZXMgYSBwcm9iZXIgY2FuIGJlIGluLgogICAgIiIiCiAgICBERVRFQ1RJTkcgPSAwCiAgICBGT1VORF9JVCA9IDEKICAgIE5PVF9NRSA9IDIKCgpjbGFzcyBNYWNoaW5lU3RhdGUob2JqZWN0KToKICAgICIiIgogICAgVGhpcyBlbnVtIHJlcHJlc2VudHMgdGhlIGRpZmZlcmVudCBzdGF0ZXMgYSBzdGF0ZSBtYWNoaW5lIGNhbiBiZSBpbi4KICAgICIiIgogICAgU1RBUlQgPSAwCiAgICBFUlJPUiA9IDEKICAgIElUU19NRSA9IDIKCgpjbGFzcyBTZXF1ZW5jZUxpa2VsaWhvb2Qob2JqZWN0KToKICAgICIiIgogICAgVGhpcyBlbnVtIHJlcHJlc2VudHMgdGhlIGxpa2VsaWhvb2Qgb2YgYSBjaGFyYWN0ZXIgZm9sbG93aW5nIHRoZSBwcmV2aW91cyBvbmUuCiAgICAiIiIKICAgIE5FR0FUSVZFID0gMAogICAgVU5MSUtFTFkgPSAxCiAgICBMSUtFTFkgPSAyCiAgICBQT1NJVElWRSA9IDMKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBnZXRfbnVtX2NhdGVnb3JpZXMoY2xzKToKICAgICAgICAiIiI6cmV0dXJuczogVGhlIG51bWJlciBvZiBsaWtlbGlob29kIGNhdGVnb3JpZXMgaW4gdGhlIGVudW0uIiIiCiAgICAgICAgcmV0dXJuIDQKCgpjbGFzcyBDaGFyYWN0ZXJDYXRlZ29yeShvYmplY3QpOgogICAgIiIiCiAgICBUaGlzIGVudW0gcmVwcmVzZW50cyB0aGUgZGlmZmVyZW50IGNhdGVnb3JpZXMgbGFuZ3VhZ2UgbW9kZWxzIGZvcgogICAgYGBTaW5nbGVCeXRlQ2hhcnNldFByb2JlcmBgIHB1dCBjaGFyYWN0ZXJzIGludG8uCgogICAgQW55dGhpbmcgbGVzcyB0aGFuIENPTlRST0wgaXMgY29uc2lkZXJlZCBhIGxldHRlci4KICAgICIiIgogICAgVU5ERUZJTkVEID0gMjU1CiAgICBMSU5FX0JSRUFLID0gMjU0CiAgICBTWU1CT0wgPSAyNTMKICAgIERJR0lUID0gMjUyCiAgICBDT05UUk9MID0gMjUxClBLAwQUAAAAAAAAACEABIgFPW4PAABuDwAAPQAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9lc2Nwcm9iZXIucHkjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQkVHSU4gTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBUaGUgT3JpZ2luYWwgQ29kZSBpcyBtb3ppbGxhLm9yZyBjb2RlLgojCiMgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiMgTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24uCiMgUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMTk5OAojIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIwojIENvbnRyaWJ1dG9yKHMpOgojICAgTWFyayBQaWxncmltIC0gcG9ydCB0byBQeXRob24KIwojIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCiMgMDIxMTAtMTMwMSAgVVNBCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRU5EIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKZnJvbSAuY2hhcnNldHByb2JlciBpbXBvcnQgQ2hhclNldFByb2Jlcgpmcm9tIC5jb2RpbmdzdGF0ZW1hY2hpbmUgaW1wb3J0IENvZGluZ1N0YXRlTWFjaGluZQpmcm9tIC5lbnVtcyBpbXBvcnQgTGFuZ3VhZ2VGaWx0ZXIsIFByb2JpbmdTdGF0ZSwgTWFjaGluZVN0YXRlCmZyb20gLmVzY3NtIGltcG9ydCAoSFpfU01fTU9ERUwsIElTTzIwMjJDTl9TTV9NT0RFTCwgSVNPMjAyMkpQX1NNX01PREVMLAogICAgICAgICAgICAgICAgICAgIElTTzIwMjJLUl9TTV9NT0RFTCkKCgpjbGFzcyBFc2NDaGFyU2V0UHJvYmVyKENoYXJTZXRQcm9iZXIpOgogICAgIiIiCiAgICBUaGlzIENoYXJTZXRQcm9iZXIgdXNlcyBhICJjb2RlIHNjaGVtZSIgYXBwcm9hY2ggZm9yIGRldGVjdGluZyBlbmNvZGluZ3MsCiAgICB3aGVyZWJ5IGVhc2lseSByZWNvZ25pemFibGUgZXNjYXBlIG9yIHNoaWZ0IHNlcXVlbmNlcyBhcmUgcmVsaWVkIG9uIHRvCiAgICBpZGVudGlmeSB0aGVzZSBlbmNvZGluZ3MuCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbGFuZ19maWx0ZXI9Tm9uZSk6CiAgICAgICAgc3VwZXIoRXNjQ2hhclNldFByb2Jlciwgc2VsZikuX19pbml0X18obGFuZ19maWx0ZXI9bGFuZ19maWx0ZXIpCiAgICAgICAgc2VsZi5jb2Rpbmdfc20gPSBbXQogICAgICAgIGlmIHNlbGYubGFuZ19maWx0ZXIgJiBMYW5ndWFnZUZpbHRlci5DSElORVNFX1NJTVBMSUZJRUQ6CiAgICAgICAgICAgIHNlbGYuY29kaW5nX3NtLmFwcGVuZChDb2RpbmdTdGF0ZU1hY2hpbmUoSFpfU01fTU9ERUwpKQogICAgICAgICAgICBzZWxmLmNvZGluZ19zbS5hcHBlbmQoQ29kaW5nU3RhdGVNYWNoaW5lKElTTzIwMjJDTl9TTV9NT0RFTCkpCiAgICAgICAgaWYgc2VsZi5sYW5nX2ZpbHRlciAmIExhbmd1YWdlRmlsdGVyLkpBUEFORVNFOgogICAgICAgICAgICBzZWxmLmNvZGluZ19zbS5hcHBlbmQoQ29kaW5nU3RhdGVNYWNoaW5lKElTTzIwMjJKUF9TTV9NT0RFTCkpCiAgICAgICAgaWYgc2VsZi5sYW5nX2ZpbHRlciAmIExhbmd1YWdlRmlsdGVyLktPUkVBTjoKICAgICAgICAgICAgc2VsZi5jb2Rpbmdfc20uYXBwZW5kKENvZGluZ1N0YXRlTWFjaGluZShJU08yMDIyS1JfU01fTU9ERUwpKQogICAgICAgIHNlbGYuYWN0aXZlX3NtX2NvdW50ID0gTm9uZQogICAgICAgIHNlbGYuX2RldGVjdGVkX2NoYXJzZXQgPSBOb25lCiAgICAgICAgc2VsZi5fZGV0ZWN0ZWRfbGFuZ3VhZ2UgPSBOb25lCiAgICAgICAgc2VsZi5fc3RhdGUgPSBOb25lCiAgICAgICAgc2VsZi5yZXNldCgpCgogICAgZGVmIHJlc2V0KHNlbGYpOgogICAgICAgIHN1cGVyKEVzY0NoYXJTZXRQcm9iZXIsIHNlbGYpLnJlc2V0KCkKICAgICAgICBmb3IgY29kaW5nX3NtIGluIHNlbGYuY29kaW5nX3NtOgogICAgICAgICAgICBpZiBub3QgY29kaW5nX3NtOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgY29kaW5nX3NtLmFjdGl2ZSA9IFRydWUKICAgICAgICAgICAgY29kaW5nX3NtLnJlc2V0KCkKICAgICAgICBzZWxmLmFjdGl2ZV9zbV9jb3VudCA9IGxlbihzZWxmLmNvZGluZ19zbSkKICAgICAgICBzZWxmLl9kZXRlY3RlZF9jaGFyc2V0ID0gTm9uZQogICAgICAgIHNlbGYuX2RldGVjdGVkX2xhbmd1YWdlID0gTm9uZQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGNoYXJzZXRfbmFtZShzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fZGV0ZWN0ZWRfY2hhcnNldAoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGxhbmd1YWdlKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9kZXRlY3RlZF9sYW5ndWFnZQoKICAgIGRlZiBnZXRfY29uZmlkZW5jZShzZWxmKToKICAgICAgICBpZiBzZWxmLl9kZXRlY3RlZF9jaGFyc2V0OgogICAgICAgICAgICByZXR1cm4gMC45OQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiAwLjAwCgogICAgZGVmIGZlZWQoc2VsZiwgYnl0ZV9zdHIpOgogICAgICAgIGZvciBjIGluIGJ5dGVfc3RyOgogICAgICAgICAgICBmb3IgY29kaW5nX3NtIGluIHNlbGYuY29kaW5nX3NtOgogICAgICAgICAgICAgICAgaWYgbm90IGNvZGluZ19zbSBvciBub3QgY29kaW5nX3NtLmFjdGl2ZToKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgY29kaW5nX3N0YXRlID0gY29kaW5nX3NtLm5leHRfc3RhdGUoYykKICAgICAgICAgICAgICAgIGlmIGNvZGluZ19zdGF0ZSA9PSBNYWNoaW5lU3RhdGUuRVJST1I6CiAgICAgICAgICAgICAgICAgICAgY29kaW5nX3NtLmFjdGl2ZSA9IEZhbHNlCiAgICAgICAgICAgICAgICAgICAgc2VsZi5hY3RpdmVfc21fY291bnQgLT0gMQogICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuYWN0aXZlX3NtX2NvdW50IDw9IDA6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3N0YXRlID0gUHJvYmluZ1N0YXRlLk5PVF9NRQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5zdGF0ZQogICAgICAgICAgICAgICAgZWxpZiBjb2Rpbmdfc3RhdGUgPT0gTWFjaGluZVN0YXRlLklUU19NRToKICAgICAgICAgICAgICAgICAgICBzZWxmLl9zdGF0ZSA9IFByb2JpbmdTdGF0ZS5GT1VORF9JVAogICAgICAgICAgICAgICAgICAgIHNlbGYuX2RldGVjdGVkX2NoYXJzZXQgPSBjb2Rpbmdfc20uZ2V0X2NvZGluZ19zdGF0ZV9tYWNoaW5lKCkKICAgICAgICAgICAgICAgICAgICBzZWxmLl9kZXRlY3RlZF9sYW5ndWFnZSA9IGNvZGluZ19zbS5sYW5ndWFnZQogICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnN0YXRlCgogICAgICAgIHJldHVybiBzZWxmLnN0YXRlClBLAwQUAAAAAAAAACEAwQpgog4pAAAOKQAAOQAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9lc2NzbS5weSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBCRUdJTiBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFRoZSBPcmlnaW5hbCBDb2RlIGlzIG1vemlsbGEub3JnIGNvZGUuCiMKIyBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKIyBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi4KIyBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAxOTk4CiMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgojCiMgQ29udHJpYnV0b3Iocyk6CiMgICBNYXJrIFBpbGdyaW0gLSBwb3J0IHRvIFB5dGhvbgojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKIyAwMjExMC0xMzAxICBVU0EKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFTkQgTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpmcm9tIC5lbnVtcyBpbXBvcnQgTWFjaGluZVN0YXRlCgpIWl9DTFMgPSAoCjEsMCwwLDAsMCwwLDAsMCwgICMgMDAgLSAwNwowLDAsMCwwLDAsMCwwLDAsICAjIDA4IC0gMGYKMCwwLDAsMCwwLDAsMCwwLCAgIyAxMCAtIDE3CjAsMCwwLDEsMCwwLDAsMCwgICMgMTggLSAxZgowLDAsMCwwLDAsMCwwLDAsICAjIDIwIC0gMjcKMCwwLDAsMCwwLDAsMCwwLCAgIyAyOCAtIDJmCjAsMCwwLDAsMCwwLDAsMCwgICMgMzAgLSAzNwowLDAsMCwwLDAsMCwwLDAsICAjIDM4IC0gM2YKMCwwLDAsMCwwLDAsMCwwLCAgIyA0MCAtIDQ3CjAsMCwwLDAsMCwwLDAsMCwgICMgNDggLSA0ZgowLDAsMCwwLDAsMCwwLDAsICAjIDUwIC0gNTcKMCwwLDAsMCwwLDAsMCwwLCAgIyA1OCAtIDVmCjAsMCwwLDAsMCwwLDAsMCwgICMgNjAgLSA2NwowLDAsMCwwLDAsMCwwLDAsICAjIDY4IC0gNmYKMCwwLDAsMCwwLDAsMCwwLCAgIyA3MCAtIDc3CjAsMCwwLDQsMCw1LDIsMCwgICMgNzggLSA3ZgoxLDEsMSwxLDEsMSwxLDEsICAjIDgwIC0gODcKMSwxLDEsMSwxLDEsMSwxLCAgIyA4OCAtIDhmCjEsMSwxLDEsMSwxLDEsMSwgICMgOTAgLSA5NwoxLDEsMSwxLDEsMSwxLDEsICAjIDk4IC0gOWYKMSwxLDEsMSwxLDEsMSwxLCAgIyBhMCAtIGE3CjEsMSwxLDEsMSwxLDEsMSwgICMgYTggLSBhZgoxLDEsMSwxLDEsMSwxLDEsICAjIGIwIC0gYjcKMSwxLDEsMSwxLDEsMSwxLCAgIyBiOCAtIGJmCjEsMSwxLDEsMSwxLDEsMSwgICMgYzAgLSBjNwoxLDEsMSwxLDEsMSwxLDEsICAjIGM4IC0gY2YKMSwxLDEsMSwxLDEsMSwxLCAgIyBkMCAtIGQ3CjEsMSwxLDEsMSwxLDEsMSwgICMgZDggLSBkZgoxLDEsMSwxLDEsMSwxLDEsICAjIGUwIC0gZTcKMSwxLDEsMSwxLDEsMSwxLCAgIyBlOCAtIGVmCjEsMSwxLDEsMSwxLDEsMSwgICMgZjAgLSBmNwoxLDEsMSwxLDEsMSwxLDEsICAjIGY4IC0gZmYKKQoKSFpfU1QgPSAoCk1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuRVJST1IsICAgICAzLE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsIyAwMC0wNwpNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSwjIDA4LTBmCk1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsICAgICA0LE1hY2hpbmVTdGF0ZS5FUlJPUiwjIDEwLTE3CiAgICAgNSxNYWNoaW5lU3RhdGUuRVJST1IsICAgICA2LE1hY2hpbmVTdGF0ZS5FUlJPUiwgICAgIDUsICAgICA1LCAgICAgNCxNYWNoaW5lU3RhdGUuRVJST1IsIyAxOC0xZgogICAgIDQsTWFjaGluZVN0YXRlLkVSUk9SLCAgICAgNCwgICAgIDQsICAgICA0LE1hY2hpbmVTdGF0ZS5FUlJPUiwgICAgIDQsTWFjaGluZVN0YXRlLkVSUk9SLCMgMjAtMjcKICAgICA0LE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsIyAyOC0yZgopCgpIWl9DSEFSX0xFTl9UQUJMRSA9ICgwLCAwLCAwLCAwLCAwLCAwKQoKSFpfU01fTU9ERUwgPSB7J2NsYXNzX3RhYmxlJzogSFpfQ0xTLAogICAgICAgICAgICAgICAnY2xhc3NfZmFjdG9yJzogNiwKICAgICAgICAgICAgICAgJ3N0YXRlX3RhYmxlJzogSFpfU1QsCiAgICAgICAgICAgICAgICdjaGFyX2xlbl90YWJsZSc6IEhaX0NIQVJfTEVOX1RBQkxFLAogICAgICAgICAgICAgICAnbmFtZSc6ICJIWi1HQi0yMzEyIiwKICAgICAgICAgICAgICAgJ2xhbmd1YWdlJzogJ0NoaW5lc2UnfQoKSVNPMjAyMkNOX0NMUyA9ICgKMiwwLDAsMCwwLDAsMCwwLCAgIyAwMCAtIDA3CjAsMCwwLDAsMCwwLDAsMCwgICMgMDggLSAwZgowLDAsMCwwLDAsMCwwLDAsICAjIDEwIC0gMTcKMCwwLDAsMSwwLDAsMCwwLCAgIyAxOCAtIDFmCjAsMCwwLDAsMCwwLDAsMCwgICMgMjAgLSAyNwowLDMsMCwwLDAsMCwwLDAsICAjIDI4IC0gMmYKMCwwLDAsMCwwLDAsMCwwLCAgIyAzMCAtIDM3CjAsMCwwLDAsMCwwLDAsMCwgICMgMzggLSAzZgowLDAsMCw0LDAsMCwwLDAsICAjIDQwIC0gNDcKMCwwLDAsMCwwLDAsMCwwLCAgIyA0OCAtIDRmCjAsMCwwLDAsMCwwLDAsMCwgICMgNTAgLSA1NwowLDAsMCwwLDAsMCwwLDAsICAjIDU4IC0gNWYKMCwwLDAsMCwwLDAsMCwwLCAgIyA2MCAtIDY3CjAsMCwwLDAsMCwwLDAsMCwgICMgNjggLSA2ZgowLDAsMCwwLDAsMCwwLDAsICAjIDcwIC0gNzcKMCwwLDAsMCwwLDAsMCwwLCAgIyA3OCAtIDdmCjIsMiwyLDIsMiwyLDIsMiwgICMgODAgLSA4NwoyLDIsMiwyLDIsMiwyLDIsICAjIDg4IC0gOGYKMiwyLDIsMiwyLDIsMiwyLCAgIyA5MCAtIDk3CjIsMiwyLDIsMiwyLDIsMiwgICMgOTggLSA5ZgoyLDIsMiwyLDIsMiwyLDIsICAjIGEwIC0gYTcKMiwyLDIsMiwyLDIsMiwyLCAgIyBhOCAtIGFmCjIsMiwyLDIsMiwyLDIsMiwgICMgYjAgLSBiNwoyLDIsMiwyLDIsMiwyLDIsICAjIGI4IC0gYmYKMiwyLDIsMiwyLDIsMiwyLCAgIyBjMCAtIGM3CjIsMiwyLDIsMiwyLDIsMiwgICMgYzggLSBjZgoyLDIsMiwyLDIsMiwyLDIsICAjIGQwIC0gZDcKMiwyLDIsMiwyLDIsMiwyLCAgIyBkOCAtIGRmCjIsMiwyLDIsMiwyLDIsMiwgICMgZTAgLSBlNwoyLDIsMiwyLDIsMiwyLDIsICAjIGU4IC0gZWYKMiwyLDIsMiwyLDIsMiwyLCAgIyBmMCAtIGY3CjIsMiwyLDIsMiwyLDIsMiwgICMgZjggLSBmZgopCgpJU08yMDIyQ05fU1QgPSAoCk1hY2hpbmVTdGF0ZS5TVEFSVCwgICAgIDMsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsIyAwMC0wNwpNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCMgMDgtMGYKTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSwjIDEwLTE3Ck1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCAgICAgNCxNYWNoaW5lU3RhdGUuRVJST1IsIyAxOC0xZgpNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjIDIwLTI3CiAgICAgNSwgICAgIDYsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsIyAyOC0yZgpNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjIDMwLTM3Ck1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLlNUQVJULCMgMzgtM2YKKQoKSVNPMjAyMkNOX0NIQVJfTEVOX1RBQkxFID0gKDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDApCgpJU08yMDIyQ05fU01fTU9ERUwgPSB7J2NsYXNzX3RhYmxlJzogSVNPMjAyMkNOX0NMUywKICAgICAgICAgICAgICAgICAgICAgICdjbGFzc19mYWN0b3InOiA5LAogICAgICAgICAgICAgICAgICAgICAgJ3N0YXRlX3RhYmxlJzogSVNPMjAyMkNOX1NULAogICAgICAgICAgICAgICAgICAgICAgJ2NoYXJfbGVuX3RhYmxlJzogSVNPMjAyMkNOX0NIQVJfTEVOX1RBQkxFLAogICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAiSVNPLTIwMjItQ04iLAogICAgICAgICAgICAgICAgICAgICAgJ2xhbmd1YWdlJzogJ0NoaW5lc2UnfQoKSVNPMjAyMkpQX0NMUyA9ICgKMiwwLDAsMCwwLDAsMCwwLCAgIyAwMCAtIDA3CjAsMCwwLDAsMCwwLDIsMiwgICMgMDggLSAwZgowLDAsMCwwLDAsMCwwLDAsICAjIDEwIC0gMTcKMCwwLDAsMSwwLDAsMCwwLCAgIyAxOCAtIDFmCjAsMCwwLDAsNywwLDAsMCwgICMgMjAgLSAyNwozLDAsMCwwLDAsMCwwLDAsICAjIDI4IC0gMmYKMCwwLDAsMCwwLDAsMCwwLCAgIyAzMCAtIDM3CjAsMCwwLDAsMCwwLDAsMCwgICMgMzggLSAzZgo2LDAsNCwwLDgsMCwwLDAsICAjIDQwIC0gNDcKMCw5LDUsMCwwLDAsMCwwLCAgIyA0OCAtIDRmCjAsMCwwLDAsMCwwLDAsMCwgICMgNTAgLSA1NwowLDAsMCwwLDAsMCwwLDAsICAjIDU4IC0gNWYKMCwwLDAsMCwwLDAsMCwwLCAgIyA2MCAtIDY3CjAsMCwwLDAsMCwwLDAsMCwgICMgNjggLSA2ZgowLDAsMCwwLDAsMCwwLDAsICAjIDcwIC0gNzcKMCwwLDAsMCwwLDAsMCwwLCAgIyA3OCAtIDdmCjIsMiwyLDIsMiwyLDIsMiwgICMgODAgLSA4NwoyLDIsMiwyLDIsMiwyLDIsICAjIDg4IC0gOGYKMiwyLDIsMiwyLDIsMiwyLCAgIyA5MCAtIDk3CjIsMiwyLDIsMiwyLDIsMiwgICMgOTggLSA5ZgoyLDIsMiwyLDIsMiwyLDIsICAjIGEwIC0gYTcKMiwyLDIsMiwyLDIsMiwyLCAgIyBhOCAtIGFmCjIsMiwyLDIsMiwyLDIsMiwgICMgYjAgLSBiNwoyLDIsMiwyLDIsMiwyLDIsICAjIGI4IC0gYmYKMiwyLDIsMiwyLDIsMiwyLCAgIyBjMCAtIGM3CjIsMiwyLDIsMiwyLDIsMiwgICMgYzggLSBjZgoyLDIsMiwyLDIsMiwyLDIsICAjIGQwIC0gZDcKMiwyLDIsMiwyLDIsMiwyLCAgIyBkOCAtIGRmCjIsMiwyLDIsMiwyLDIsMiwgICMgZTAgLSBlNwoyLDIsMiwyLDIsMiwyLDIsICAjIGU4IC0gZWYKMiwyLDIsMiwyLDIsMiwyLCAgIyBmMCAtIGY3CjIsMiwyLDIsMiwyLDIsMiwgICMgZjggLSBmZgopCgpJU08yMDIySlBfU1QgPSAoCk1hY2hpbmVTdGF0ZS5TVEFSVCwgICAgIDMsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsIyAwMC0wNwpNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCMgMDgtMGYKTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsIyAxMC0xNwpNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCMgMTgtMWYKTWFjaGluZVN0YXRlLkVSUk9SLCAgICAgNSxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwgICAgIDQsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjIDIwLTI3Ck1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCAgICAgNixNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5FUlJPUiwjIDI4LTJmCk1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSwjIDMwLTM3Ck1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCMgMzgtM2YKTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsIyA0MC00NwopCgpJU08yMDIySlBfQ0hBUl9MRU5fVEFCTEUgPSAoMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCkKCklTTzIwMjJKUF9TTV9NT0RFTCA9IHsnY2xhc3NfdGFibGUnOiBJU08yMDIySlBfQ0xTLAogICAgICAgICAgICAgICAgICAgICAgJ2NsYXNzX2ZhY3Rvcic6IDEwLAogICAgICAgICAgICAgICAgICAgICAgJ3N0YXRlX3RhYmxlJzogSVNPMjAyMkpQX1NULAogICAgICAgICAgICAgICAgICAgICAgJ2NoYXJfbGVuX3RhYmxlJzogSVNPMjAyMkpQX0NIQVJfTEVOX1RBQkxFLAogICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAiSVNPLTIwMjItSlAiLAogICAgICAgICAgICAgICAgICAgICAgJ2xhbmd1YWdlJzogJ0phcGFuZXNlJ30KCklTTzIwMjJLUl9DTFMgPSAoCjIsMCwwLDAsMCwwLDAsMCwgICMgMDAgLSAwNwowLDAsMCwwLDAsMCwwLDAsICAjIDA4IC0gMGYKMCwwLDAsMCwwLDAsMCwwLCAgIyAxMCAtIDE3CjAsMCwwLDEsMCwwLDAsMCwgICMgMTggLSAxZgowLDAsMCwwLDMsMCwwLDAsICAjIDIwIC0gMjcKMCw0LDAsMCwwLDAsMCwwLCAgIyAyOCAtIDJmCjAsMCwwLDAsMCwwLDAsMCwgICMgMzAgLSAzNwowLDAsMCwwLDAsMCwwLDAsICAjIDM4IC0gM2YKMCwwLDAsNSwwLDAsMCwwLCAgIyA0MCAtIDQ3CjAsMCwwLDAsMCwwLDAsMCwgICMgNDggLSA0ZgowLDAsMCwwLDAsMCwwLDAsICAjIDUwIC0gNTcKMCwwLDAsMCwwLDAsMCwwLCAgIyA1OCAtIDVmCjAsMCwwLDAsMCwwLDAsMCwgICMgNjAgLSA2NwowLDAsMCwwLDAsMCwwLDAsICAjIDY4IC0gNmYKMCwwLDAsMCwwLDAsMCwwLCAgIyA3MCAtIDc3CjAsMCwwLDAsMCwwLDAsMCwgICMgNzggLSA3ZgoyLDIsMiwyLDIsMiwyLDIsICAjIDgwIC0gODcKMiwyLDIsMiwyLDIsMiwyLCAgIyA4OCAtIDhmCjIsMiwyLDIsMiwyLDIsMiwgICMgOTAgLSA5NwoyLDIsMiwyLDIsMiwyLDIsICAjIDk4IC0gOWYKMiwyLDIsMiwyLDIsMiwyLCAgIyBhMCAtIGE3CjIsMiwyLDIsMiwyLDIsMiwgICMgYTggLSBhZgoyLDIsMiwyLDIsMiwyLDIsICAjIGIwIC0gYjcKMiwyLDIsMiwyLDIsMiwyLCAgIyBiOCAtIGJmCjIsMiwyLDIsMiwyLDIsMiwgICMgYzAgLSBjNwoyLDIsMiwyLDIsMiwyLDIsICAjIGM4IC0gY2YKMiwyLDIsMiwyLDIsMiwyLCAgIyBkMCAtIGQ3CjIsMiwyLDIsMiwyLDIsMiwgICMgZDggLSBkZgoyLDIsMiwyLDIsMiwyLDIsICAjIGUwIC0gZTcKMiwyLDIsMiwyLDIsMiwyLCAgIyBlOCAtIGVmCjIsMiwyLDIsMiwyLDIsMiwgICMgZjAgLSBmNwoyLDIsMiwyLDIsMiwyLDIsICAjIGY4IC0gZmYKKQoKSVNPMjAyMktSX1NUID0gKApNYWNoaW5lU3RhdGUuU1RBUlQsICAgICAzLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCMgMDAtMDcKTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsIyAwOC0wZgpNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsICAgICA0LE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsIyAxMC0xNwpNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsICAgICA1LE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCMgMTgtMWYKTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsIyAyMC0yNwopCgpJU08yMDIyS1JfQ0hBUl9MRU5fVEFCTEUgPSAoMCwgMCwgMCwgMCwgMCwgMCkKCklTTzIwMjJLUl9TTV9NT0RFTCA9IHsnY2xhc3NfdGFibGUnOiBJU08yMDIyS1JfQ0xTLAogICAgICAgICAgICAgICAgICAgICAgJ2NsYXNzX2ZhY3Rvcic6IDYsCiAgICAgICAgICAgICAgICAgICAgICAnc3RhdGVfdGFibGUnOiBJU08yMDIyS1JfU1QsCiAgICAgICAgICAgICAgICAgICAgICAnY2hhcl9sZW5fdGFibGUnOiBJU08yMDIyS1JfQ0hBUl9MRU5fVEFCTEUsCiAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICJJU08tMjAyMi1LUiIsCiAgICAgICAgICAgICAgICAgICAgICAnbGFuZ3VhZ2UnOiAnS29yZWFuJ30KCgpQSwMEFAAAAAAAAAAhACA3xNClDgAApQ4AAD8AAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvZXVjanBwcm9iZXIucHkjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQkVHSU4gTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBUaGUgT3JpZ2luYWwgQ29kZSBpcyBtb3ppbGxhLm9yZyBjb2RlLgojCiMgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiMgTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24uCiMgUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMTk5OAojIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIwojIENvbnRyaWJ1dG9yKHMpOgojICAgTWFyayBQaWxncmltIC0gcG9ydCB0byBQeXRob24KIwojIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCiMgMDIxMTAtMTMwMSAgVVNBCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRU5EIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKZnJvbSAuZW51bXMgaW1wb3J0IFByb2JpbmdTdGF0ZSwgTWFjaGluZVN0YXRlCmZyb20gLm1iY2hhcnNldHByb2JlciBpbXBvcnQgTXVsdGlCeXRlQ2hhclNldFByb2Jlcgpmcm9tIC5jb2RpbmdzdGF0ZW1hY2hpbmUgaW1wb3J0IENvZGluZ1N0YXRlTWFjaGluZQpmcm9tIC5jaGFyZGlzdHJpYnV0aW9uIGltcG9ydCBFVUNKUERpc3RyaWJ1dGlvbkFuYWx5c2lzCmZyb20gLmpwY250eCBpbXBvcnQgRVVDSlBDb250ZXh0QW5hbHlzaXMKZnJvbSAubWJjc3NtIGltcG9ydCBFVUNKUF9TTV9NT0RFTAoKCmNsYXNzIEVVQ0pQUHJvYmVyKE11bHRpQnl0ZUNoYXJTZXRQcm9iZXIpOgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHN1cGVyKEVVQ0pQUHJvYmVyLCBzZWxmKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5jb2Rpbmdfc20gPSBDb2RpbmdTdGF0ZU1hY2hpbmUoRVVDSlBfU01fTU9ERUwpCiAgICAgICAgc2VsZi5kaXN0cmlidXRpb25fYW5hbHl6ZXIgPSBFVUNKUERpc3RyaWJ1dGlvbkFuYWx5c2lzKCkKICAgICAgICBzZWxmLmNvbnRleHRfYW5hbHl6ZXIgPSBFVUNKUENvbnRleHRBbmFseXNpcygpCiAgICAgICAgc2VsZi5yZXNldCgpCgogICAgZGVmIHJlc2V0KHNlbGYpOgogICAgICAgIHN1cGVyKEVVQ0pQUHJvYmVyLCBzZWxmKS5yZXNldCgpCiAgICAgICAgc2VsZi5jb250ZXh0X2FuYWx5emVyLnJlc2V0KCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBjaGFyc2V0X25hbWUoc2VsZik6CiAgICAgICAgcmV0dXJuICJFVUMtSlAiCgogICAgQHByb3BlcnR5CiAgICBkZWYgbGFuZ3VhZ2Uoc2VsZik6CiAgICAgICAgcmV0dXJuICJKYXBhbmVzZSIKCiAgICBkZWYgZmVlZChzZWxmLCBieXRlX3N0cik6CiAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGJ5dGVfc3RyKSk6CiAgICAgICAgICAgICMgUFkzSzogYnl0ZV9zdHIgaXMgYSBieXRlIGFycmF5LCBzbyBieXRlX3N0cltpXSBpcyBhbiBpbnQsIG5vdCBhIGJ5dGUKICAgICAgICAgICAgY29kaW5nX3N0YXRlID0gc2VsZi5jb2Rpbmdfc20ubmV4dF9zdGF0ZShieXRlX3N0cltpXSkKICAgICAgICAgICAgaWYgY29kaW5nX3N0YXRlID09IE1hY2hpbmVTdGF0ZS5FUlJPUjoKICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyLmRlYnVnKCclcyAlcyBwcm9iZXIgaGl0IGVycm9yIGF0IGJ5dGUgJXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jaGFyc2V0X25hbWUsIHNlbGYubGFuZ3VhZ2UsIGkpCiAgICAgICAgICAgICAgICBzZWxmLl9zdGF0ZSA9IFByb2JpbmdTdGF0ZS5OT1RfTUUKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGVsaWYgY29kaW5nX3N0YXRlID09IE1hY2hpbmVTdGF0ZS5JVFNfTUU6CiAgICAgICAgICAgICAgICBzZWxmLl9zdGF0ZSA9IFByb2JpbmdTdGF0ZS5GT1VORF9JVAogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgZWxpZiBjb2Rpbmdfc3RhdGUgPT0gTWFjaGluZVN0YXRlLlNUQVJUOgogICAgICAgICAgICAgICAgY2hhcl9sZW4gPSBzZWxmLmNvZGluZ19zbS5nZXRfY3VycmVudF9jaGFybGVuKCkKICAgICAgICAgICAgICAgIGlmIGkgPT0gMDoKICAgICAgICAgICAgICAgICAgICBzZWxmLl9sYXN0X2NoYXJbMV0gPSBieXRlX3N0clswXQogICAgICAgICAgICAgICAgICAgIHNlbGYuY29udGV4dF9hbmFseXplci5mZWVkKHNlbGYuX2xhc3RfY2hhciwgY2hhcl9sZW4pCiAgICAgICAgICAgICAgICAgICAgc2VsZi5kaXN0cmlidXRpb25fYW5hbHl6ZXIuZmVlZChzZWxmLl9sYXN0X2NoYXIsIGNoYXJfbGVuKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRleHRfYW5hbHl6ZXIuZmVlZChieXRlX3N0cltpIC0gMTppICsgMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJfbGVuKQogICAgICAgICAgICAgICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uX2FuYWx5emVyLmZlZWQoYnl0ZV9zdHJbaSAtIDE6aSArIDFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJfbGVuKQoKICAgICAgICBzZWxmLl9sYXN0X2NoYXJbMF0gPSBieXRlX3N0clstMV0KCiAgICAgICAgaWYgc2VsZi5zdGF0ZSA9PSBQcm9iaW5nU3RhdGUuREVURUNUSU5HOgogICAgICAgICAgICBpZiAoc2VsZi5jb250ZXh0X2FuYWx5emVyLmdvdF9lbm91Z2hfZGF0YSgpIGFuZAogICAgICAgICAgICAgICAoc2VsZi5nZXRfY29uZmlkZW5jZSgpID4gc2VsZi5TSE9SVENVVF9USFJFU0hPTEQpKToKICAgICAgICAgICAgICAgIHNlbGYuX3N0YXRlID0gUHJvYmluZ1N0YXRlLkZPVU5EX0lUCgogICAgICAgIHJldHVybiBzZWxmLnN0YXRlCgogICAgZGVmIGdldF9jb25maWRlbmNlKHNlbGYpOgogICAgICAgIGNvbnRleHRfY29uZiA9IHNlbGYuY29udGV4dF9hbmFseXplci5nZXRfY29uZmlkZW5jZSgpCiAgICAgICAgZGlzdHJpYl9jb25mID0gc2VsZi5kaXN0cmlidXRpb25fYW5hbHl6ZXIuZ2V0X2NvbmZpZGVuY2UoKQogICAgICAgIHJldHVybiBtYXgoY29udGV4dF9jb25mLCBkaXN0cmliX2NvbmYpClBLAwQUAAAAAAAAACEA9EEDeeo0AADqNAAAPQAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9ldWNrcmZyZXEucHkjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQkVHSU4gTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBUaGUgT3JpZ2luYWwgQ29kZSBpcyBNb3ppbGxhIENvbW11bmljYXRvciBjbGllbnQgY29kZS4KIwojIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwojIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uLgojIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDE5OTgKIyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiMKIyBDb250cmlidXRvcihzKToKIyAgIE1hcmsgUGlsZ3JpbSAtIHBvcnQgdG8gUHl0aG9uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgojIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQojIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQojIDAyMTEwLTEzMDEgIFVTQQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVORCBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiMgU2FtcGxpbmcgZnJvbSBhYm91dCAyME0gdGV4dCBtYXRlcmlhbHMgaW5jbHVkZSBsaXRlcmF0dXJlIGFuZCBjb21wdXRlciB0ZWNobm9sb2d5CgojIDEyOCAgLS0+IDAuNzkKIyAyNTYgIC0tPiAwLjkyCiMgNTEyICAtLT4gMC45ODYKIyAxMDI0IC0tPiAwLjk5OTQ0CiMgMjA0OCAtLT4gMC45OTk5OQojCiMgSWRlYSBEaXN0cmlidXRpb24gUmF0aW8gPSAwLjk4NjUzIC8gKDEtMC45ODY1MykgPSA3My4yNAojIFJhbmRvbSBEaXN0cmlidXRpb24gUmF0aW9uID0gNTEyIC8gKDIzNTAtNTEyKSA9IDAuMjc5LgojCiMgVHlwaWNhbCBEaXN0cmlidXRpb24gUmF0aW8KCkVVQ0tSX1RZUElDQUxfRElTVFJJQlVUSU9OX1JBVElPID0gNi4wCgpFVUNLUl9UQUJMRV9TSVpFID0gMjM1MgoKIyBDaGFyIHRvIEZyZXFPcmRlciB0YWJsZSAsCkVVQ0tSX0NIQVJfVE9fRlJFUV9PUkRFUiA9ICgKICAxMywgMTMwLCAxMjAsMTM5NiwgNDgxLDE3MTksMTcyMCwgMzI4LCA2MDksIDIxMiwxNzIxLCA3MDcsIDQwMCwgMjk5LDE3MjIsICA4NywKMTM5NywxNzIzLCAxMDQsIDUzNiwxMTE3LDEyMDMsMTcyNCwxMjY3LCA2ODUsMTI2OCwgNTA4LDE3MjUsMTcyNiwxNzI3LDE3MjgsMTM5OCwKMTM5OSwxNzI5LDE3MzAsMTczMSwgMTQxLCA2MjEsIDMyNiwxMDU3LCAzNjgsMTczMiwgMjY3LCA0ODgsICAyMCwxNzMzLDEyNjksMTczNCwKIDk0NSwxNDAwLDE3MzUsICA0NywgOTA0LDEyNzAsMTczNiwxNzM3LCA3NzMsIDI0OCwxNzM4LCA0MDksIDMxMywgNzg2LCA0MjksMTczOSwKIDExNiwgOTg3LCA4MTMsMTQwMSwgNjgzLCAgNzUsMTIwNCwgMTQ1LDE3NDAsMTc0MSwxNzQyLDE3NDMsICAxNiwgODQ3LCA2NjcsIDYyMiwKIDcwOCwxNzQ0LDE3NDUsMTc0NiwgOTY2LCA3ODcsIDMwNCwgMTI5LDE3NDcsICA2MCwgODIwLCAxMjMsIDY3NiwxNzQ4LDE3NDksMTc1MCwKMTc1MSwgNjE3LDE3NTIsIDYyNiwxNzUzLDE3NTQsMTc1NSwxNzU2LCA2NTMsMTc1NywxNzU4LDE3NTksMTc2MCwxNzYxLDE3NjIsIDg1NiwKIDM0NCwxNzYzLDE3NjQsMTc2NSwxNzY2LCAgODksIDQwMSwgNDE4LCA4MDYsIDkwNSwgODQ4LDE3NjcsMTc2OCwxNzY5LCA5NDYsMTIwNSwKIDcwOSwxNzcwLDExMTgsMTc3MSwgMjQxLDE3NzIsMTc3MywxNzc0LDEyNzEsMTc3NSwgNTY5LDE3NzYsIDk5OSwxNzc3LDE3NzgsMTc3OSwKMTc4MCwgMzM3LCA3NTEsMTA1OCwgIDI4LCA2MjgsIDI1NCwxNzgxLCAxNzcsIDkwNiwgMjcwLCAzNDksIDg5MSwxMDc5LDE3ODIsICAxOSwKMTc4MywgMzc5LDE3ODQsIDMxNSwxNzg1LCA2MjksIDc1NCwxNDAyLCA1NTksMTc4NiwgNjM2LCAyMDMsMTIwNiwxNzg3LCA3MTAsIDU2NywKMTc4OCwgOTM1LCA4MTQsMTc4OSwxNzkwLDEyMDcsIDc2NiwgNTI4LDE3OTEsMTc5MiwxMjA4LDE3OTMsMTc5NCwxNzk1LDE3OTYsMTc5NywKMTQwMywxNzk4LDE3OTksIDUzMywxMDU5LDE0MDQsMTQwNSwxMTU2LDE0MDYsIDkzNiwgODg0LDEwODAsMTgwMCwgMzUxLDE4MDEsMTgwMiwKMTgwMywxODA0LDE4MDUsIDgwMSwxODA2LDE4MDcsMTgwOCwxMTE5LDE4MDksMTE1NywgNzE0LCA0NzQsMTQwNywxODEwLCAyOTgsIDg5OSwKIDg4NSwxODExLDExMjAsIDgwMiwxMTU4LDE4MTIsIDg5MiwxODEzLDE4MTQsMTQwOCwgNjU5LDE4MTUsMTgxNiwxMTIxLDE4MTcsMTgxOCwKMTgxOSwxODIwLDE4MjEsMTgyMiwgMzE5LDE4MjMsIDU5NCwgNTQ1LDE4MjQsIDgxNSwgOTM3LDEyMDksMTgyNSwxODI2LCA1NzMsMTQwOSwKMTAyMiwxODI3LDEyMTAsMTgyOCwxODI5LDE4MzAsMTgzMSwxODMyLDE4MzMsIDU1NiwgNzIyLCA4MDcsMTEyMiwxMDYwLDE4MzQsIDY5NywKMTgzNSwgOTAwLCA1NTcsIDcxNSwxODM2LDE0MTAsIDU0MCwxNDExLCA3NTIsMTE1OSwgMjk0LCA1OTcsMTIxMSwgOTc2LCA4MDMsIDc3MCwKMTQxMiwxODM3LDE4MzgsICAzOSwgNzk0LDE0MTMsIDM1OCwxODM5LCAzNzEsIDkyNSwxODQwLCA0NTMsIDY2MSwgNzg4LCA1MzEsIDcyMywKIDU0NCwxMDIzLDEwODEsIDg2OSwgIDkxLDE4NDEsIDM5MiwgNDMwLCA3OTAsIDYwMiwxNDE0LCA2NzcsMTA4MiwgNDU3LDE0MTUsMTQxNiwKMTg0MiwxODQzLCA0NzUsIDMyNywxMDI0LDE0MTcsIDc5NSwgMTIxLDE4NDQsIDczMywgNDAzLDE0MTgsMTg0NSwxODQ2LDE4NDcsIDMwMCwKIDExOSwgNzExLDEyMTIsIDYyNywxODQ4LDEyNzIsIDIwNywxODQ5LDE4NTAsIDc5NiwxMjEzLCAzODIsMTg1MSwgNTE5LDE4NTIsMTA4MywKIDg5MywxODUzLDE4NTQsMTg1NSwgMzY3LCA4MDksIDQ4NywgNjcxLDE4NTYsIDY2MywxODU3LDE4NTgsIDk1NiwgNDcxLCAzMDYsIDg1NywKMTg1OSwxODYwLDExNjAsMTA4NCwxODYxLDE4NjIsMTg2MywxODY0LDE4NjUsMTA2MSwxODY2LDE4NjcsMTg2OCwxODY5LDE4NzAsMTg3MSwKIDI4MiwgIDk2LCA1NzQsMTg3MiwgNTAyLDEwODUsMTg3MywxMjE0LDE4NzQsIDkwNywxODc1LDE4NzYsIDgyNywgOTc3LDE0MTksMTQyMCwKMTQyMSwgMjY4LDE4NzcsMTQyMiwxODc4LDE4NzksMTg4MCwgMzA4LDE4ODEsICAgMiwgNTM3LDE4ODIsMTg4MywxMjE1LDE4ODQsMTg4NSwKIDEyNywgNzkxLDE4ODYsMTI3MywxNDIzLDE4ODcsICAzNCwgMzM2LCA0MDQsIDY0MywxODg4LCA1NzEsIDY1NCwgODk0LCA4NDAsMTg4OSwKICAgMCwgODg2LDEyNzQsIDEyMiwgNTc1LCAyNjAsIDkwOCwgOTM4LDE4OTAsMTI3NSwgNDEwLCAzMTYsMTg5MSwxODkyLCAxMDAsMTg5MywKMTg5NCwxMTIzLCAgNDgsMTE2MSwxMTI0LDEwMjUsMTg5NSwgNjMzLCA5MDEsMTI3NiwxODk2LDE4OTcsIDExNSwgODE2LDE4OTgsIDMxNywKMTg5OSwgNjk0LDE5MDAsIDkwOSwgNzM0LDE0MjQsIDU3MiwgODY2LDE0MjUsIDY5MSwgIDg1LCA1MjQsMTAxMCwgNTQzLCAzOTQsIDg0MSwKMTkwMSwxOTAyLDE5MDMsMTAyNiwxOTA0LDE5MDUsMTkwNiwxOTA3LDE5MDgsMTkwOSwgIDMwLCA0NTEsIDY1MSwgOTg4LCAzMTAsMTkxMCwKMTkxMSwxNDI2LCA4MTAsMTIxNiwgIDkzLDE5MTIsMTkxMywxMjc3LDEyMTcsMTkxNCwgODU4LCA3NTksICA0NSwgIDU4LCAxODEsIDYxMCwKIDI2OSwxOTE1LDE5MTYsIDEzMSwxMDYyLCA1NTEsIDQ0MywxMDAwLCA4MjEsMTQyNywgOTU3LCA4OTUsMTA4NiwxOTE3LDE5MTgsIDM3NSwKMTkxOSwgMzU5LDE5MjAsIDY4NywxOTIxLCA4MjIsMTkyMiwgMjkzLDE5MjMsMTkyNCwgIDQwLCA2NjIsIDExOCwgNjkyLCAgMjksIDkzOSwKIDg4NywgNjQwLCA0ODIsIDE3NCwxOTI1LCAgNjksMTE2MiwgNzI4LDE0MjgsIDkxMCwxOTI2LDEyNzgsMTIxOCwxMjc5LCAzODYsIDg3MCwKIDIxNywgODU0LDExNjMsIDgyMywxOTI3LDE5MjgsMTkyOSwxOTMwLCA4MzQsMTkzMSwgIDc4LDE5MzIsIDg1OSwxOTMzLDEwNjMsMTkzNCwKMTkzNSwxOTM2LDE5MzcsIDQzOCwxMTY0LCAyMDgsIDU5NSwxOTM4LDE5MzksMTk0MCwxOTQxLDEyMTksMTEyNSwxOTQyLCAyODAsIDg4OCwKMTQyOSwxNDMwLDEyMjAsMTQzMSwxOTQzLDE5NDQsMTk0NSwxOTQ2LDE5NDcsMTI4MCwgMTUwLCA1MTAsMTQzMiwxOTQ4LDE5NDksMTk1MCwKMTk1MSwxOTUyLDE5NTMsMTk1NCwxMDExLDEwODcsMTk1NSwxNDMzLDEwNDMsMTk1NiwgODgxLDE5NTcsIDYxNCwgOTU4LDEwNjQsMTA2NSwKMTIyMSwxOTU4LCA2MzgsMTAwMSwgODYwLCA5NjcsIDg5NiwxNDM0LCA5ODksIDQ5MiwgNTUzLDEyODEsMTE2NSwxOTU5LDEyODIsMTAwMiwKMTI4MywxMjIyLDE5NjAsMTk2MSwxOTYyLDE5NjMsICAzNiwgMzgzLCAyMjgsIDc1MywgMjQ3LCA0NTQsMTk2NCwgODc2LCA2NzgsMTk2NSwKMTk2NiwxMjg0LCAxMjYsIDQ2NCwgNDkwLCA4MzUsIDEzNiwgNjcyLCA1MjksIDk0MCwxMDg4LDE0MzUsIDQ3MywxOTY3LDE5NjgsIDQ2NywKICA1MCwgMzkwLCAyMjcsIDU4NywgMjc5LCAzNzgsIDU5OCwgNzkyLCA5NjgsIDI0MCwgMTUxLCAxNjAsIDg0OSwgODgyLDExMjYsMTI4NSwKIDYzOSwxMDQ0LCAxMzMsIDE0MCwgMjg4LCAzNjAsIDgxMSwgNTYzLDEwMjcsIDU2MSwgMTQyLCA1MjMsMTk2OSwxOTcwLDE5NzEsICAgNywKIDEwMywgMjk2LCA0MzksIDQwNywgNTA2LCA2MzQsIDk5MCwxOTcyLDE5NzMsMTk3NCwxOTc1LCA2NDUsMTk3NiwxOTc3LDE5NzgsMTk3OSwKMTk4MCwxOTgxLCAyMzYsMTk4MiwxNDM2LDE5ODMsMTk4NCwxMDg5LCAxOTIsIDgyOCwgNjE4LCA1MTgsMTE2NiwgMzMzLDExMjcsMTk4NSwKIDgxOCwxMjIzLDE5ODYsMTk4NywxOTg4LDE5ODksMTk5MCwxOTkxLDE5OTIsMTk5MywgMzQyLDExMjgsMTI4NiwgNzQ2LCA4NDIsMTk5NCwKMTk5NSwgNTYwLCAyMjMsMTI4NywgIDk4LCAgIDgsIDE4OSwgNjUwLCA5NzgsMTI4OCwxOTk2LDE0MzcsMTk5NywgIDE3LCAzNDUsIDI1MCwKIDQyMywgMjc3LCAyMzQsIDUxMiwgMjI2LCAgOTcsIDI4OSwgIDQyLCAxNjcsMTk5OCwgMjAxLDE5OTksMjAwMCwgODQzLCA4MzYsIDgyNCwKIDUzMiwgMzM4LCA3ODMsMTA5MCwgMTgyLCA1NzYsIDQzNiwxNDM4LDE0MzksIDUyNywgNTAwLDIwMDEsIDk0NywgODg5LDIwMDIsMjAwMywKMjAwNCwyMDA1LCAyNjIsIDYwMCwgMzE0LCA0NDcsMjAwNiwgNTQ3LDIwMDcsIDY5MywgNzM4LDExMjksMjAwOCwgIDcxLDE0NDAsIDc0NSwKIDYxOSwgNjg4LDIwMDksIDgyOSwyMDEwLDIwMTEsIDE0NywyMDEyLCAgMzMsIDk0OCwyMDEzLDIwMTQsICA3NCwgMjI0LDIwMTUsICA2MSwKIDE5MSwgOTE4LCAzOTksIDYzNywyMDE2LDEwMjgsMTEzMCwgMjU3LCA5MDIsMjAxNywyMDE4LDIwMTksMjAyMCwyMDIxLDIwMjIsMjAyMywKMjAyNCwyMDI1LDIwMjYsIDgzNywyMDI3LDIwMjgsMjAyOSwyMDMwLCAxNzksIDg3NCwgNTkxLCAgNTIsIDcyNCwgMjQ2LDIwMzEsMjAzMiwKMjAzMywyMDM0LDExNjcsIDk2OSwyMDM1LDEyODksIDYzMCwgNjA1LCA5MTEsMTA5MSwxMTY4LDIwMzYsMjAzNywyMDM4LDE0NDEsIDkxMiwKMjAzOSwgNjIzLDIwNDAsMjA0MSwgMjUzLDExNjksMTI5MCwyMDQyLDE0NDIsIDE0NiwgNjIwLCA2MTEsIDU3NywgNDMzLDIwNDMsMTIyNCwKIDcxOSwxMTcwLCA5NTksIDQ0MCwgNDM3LCA1MzQsICA4NCwgMzg4LCA0ODAsMTEzMSwgMTU5LCAyMjAsIDE5OCwgNjc5LDIwNDQsMTAxMiwKIDgxOSwxMDY2LDE0NDMsIDExMywxMjI1LCAxOTQsIDMxOCwxMDAzLDEwMjksMjA0NSwyMDQ2LDIwNDcsMjA0OCwxMDY3LDIwNDksMjA1MCwKMjA1MSwyMDUyLDIwNTMsICA1OSwgOTEzLCAxMTIsMjA1NCwgNjMyLDIwNTUsIDQ1NSwgMTQ0LCA3MzksMTI5MSwyMDU2LCAyNzMsIDY4MSwKIDQ5OSwyMDU3LCA0NDgsMjA1OCwyMDU5LCA3NjAsMjA2MCwyMDYxLCA5NzAsIDM4NCwgMTY5LCAyNDUsMTEzMiwyMDYyLDIwNjMsIDQxNCwKMTQ0NCwyMDY0LDIwNjUsICA0MSwgMjM1LDIwNjYsIDE1NywgMjUyLCA4NzcsIDU2OCwgOTE5LCA3ODksIDU4MCwyMDY3LCA3MjUsMjA2OCwKMjA2OSwxMjkyLDIwNzAsMjA3MSwxNDQ1LDIwNzIsMTQ0NiwyMDczLDIwNzQsICA1NSwgNTg4LCAgNjYsMTQ0NywgMjcxLDEwOTIsMjA3NSwKMTIyNiwyMDc2LCA5NjAsMTAxMywgMzcyLDIwNzcsMjA3OCwyMDc5LDIwODAsMjA4MSwxMjkzLDIwODIsMjA4MywyMDg0LDIwODUsIDg1MCwKMjA4NiwyMDg3LDIwODgsMjA4OSwyMDkwLCAxODYsMjA5MSwxMDY4LCAxODAsMjA5MiwyMDkzLDIwOTQsIDEwOSwxMjI3LCA1MjIsIDYwNiwKMjA5NSwgODY3LDE0NDgsMTA5MywgOTkxLDExNzEsIDkyNiwgMzUzLDExMzMsMjA5NiwgNTgxLDIwOTcsMjA5OCwyMDk5LDEyOTQsMTQ0OSwKMTQ1MCwyMTAwLCA1OTYsMTE3MiwxMDE0LDEyMjgsMjEwMSwxNDUxLDEyOTUsMTE3MywxMjI5LDIxMDIsMjEwMywxMjk2LDExMzQsMTQ1MiwKIDk0OSwxMTM1LDIxMDQsMjEwNSwxMDk0LDE0NTMsMTQ1NCwxNDU1LDIxMDYsMTA5NSwyMTA3LDIxMDgsMjEwOSwyMTEwLDIxMTEsMjExMiwKMjExMywyMTE0LDIxMTUsMjExNiwyMTE3LCA4MDQsMjExOCwyMTE5LDEyMzAsMTIzMSwgODA1LDE0NTYsIDQwNSwxMTM2LDIxMjAsMjEyMSwKMjEyMiwyMTIzLDIxMjQsIDcyMCwgNzAxLDEyOTcsIDk5MiwxNDU3LCA5MjcsMTAwNCwyMTI1LDIxMjYsMjEyNywyMTI4LDIxMjksMjEzMCwKICAyMiwgNDE3LDIxMzEsIDMwMywyMTMyLCAzODUsMjEzMywgOTcxLCA1MjAsIDUxMywyMTM0LDExNzQsICA3MywxMDk2LCAyMzEsIDI3NCwKIDk2MiwxNDU4LCA2NzMsMjEzNSwxNDU5LDIxMzYsIDE1MiwxMTM3LDIxMzcsMjEzOCwyMTM5LDIxNDAsMTAwNSwxMTM4LDE0NjAsMTEzOSwKMjE0MSwyMTQyLDIxNDMsMjE0NCwgIDExLCAzNzQsIDg0NCwyMTQ1LCAxNTQsMTIzMiwgIDQ2LDE0NjEsMjE0NiwgODM4LCA4MzAsIDcyMSwKMTIzMywgMTA2LDIxNDcsICA5MCwgNDI4LCA0NjIsIDU3OCwgNTY2LDExNzUsIDM1MiwyMTQ4LDIxNDksIDUzOCwxMjM0LCAxMjQsMTI5OCwKMjE1MCwxNDYyLCA3NjEsIDU2NSwyMTUxLCA2ODYsMjE1MiwgNjQ5LDIxNTMsICA3MiwgMTczLDIxNTQsIDQ2MCwgNDE1LDIxNTUsMTQ2MywKMjE1NiwxMjM1LCAzMDUsMjE1NywyMTU4LDIxNTksMjE2MCwyMTYxLDIxNjIsIDU3OSwyMTYzLDIxNjQsMjE2NSwyMTY2LDIxNjcsIDc0NywKMjE2OCwyMTY5LDIxNzAsMjE3MSwxNDY0LCA2NjksMjE3MiwyMTczLDIxNzQsMjE3NSwyMTc2LDE0NjUsMjE3NywgIDIzLCA1MzAsIDI4NSwKMjE3OCwgMzM1LCA3MjksMjE3OSwgMzk3LDIxODAsMjE4MSwyMTgyLDEwMzAsMjE4MywyMTg0LCA2OTgsMjE4NSwyMTg2LCAzMjUsMjE4NywKMjE4OCwgMzY5LDIxODksIDc5OSwxMDk3LDEwMTUsIDM0OCwyMTkwLDEwNjksIDY4MCwyMTkxLCA4NTEsMTQ2NiwyMTkyLDIxOTMsICAxMCwKMjE5NCwgNjEzLCA0MjQsMjE5NSwgOTc5LCAxMDgsIDQ0OSwgNTg5LCAgMjcsIDE3MiwgIDgxLDEwMzEsICA4MCwgNzc0LCAyODEsIDM1MCwKMTAzMiwgNTI1LCAzMDEsIDU4MiwxMTc2LDIxOTYsIDY3NCwxMDQ1LDIxOTcsMjE5OCwxNDY3LCA3MzAsIDc2MiwyMTk5LDIyMDAsMjIwMSwKMjIwMiwxNDY4LDIyMDMsIDk5MywyMjA0LDIyMDUsIDI2NiwxMDcwLCA5NjMsMTE0MCwyMjA2LDIyMDcsMjIwOCwgNjY0LDEwOTgsIDk3MiwKMjIwOSwyMjEwLDIyMTEsMTE3NywxNDY5LDE0NzAsIDg3MSwyMjEyLDIyMTMsMjIxNCwyMjE1LDIyMTYsMTQ3MSwyMjE3LDIyMTgsMjIxOSwKMjIyMCwyMjIxLDIyMjIsMjIyMywyMjI0LDIyMjUsMjIyNiwyMjI3LDE0NzIsMTIzNiwyMjI4LDIyMjksMjIzMCwyMjMxLDIyMzIsMjIzMywKMjIzNCwyMjM1LDEyOTksMjIzNiwyMjM3LCAyMDAsMjIzOCwgNDc3LCAzNzMsMjIzOSwyMjQwLCA3MzEsIDgyNSwgNzc3LDIyNDEsMjI0MiwKMjI0MywgNTIxLCA0ODYsIDU0OCwyMjQ0LDIyNDUsMjI0NiwxNDczLDEzMDAsICA1MywgNTQ5LCAxMzcsIDg3NSwgIDc2LCAxNTgsMjI0NywKMTMwMSwxNDc0LCA0NjksIDM5NiwxMDE2LCAyNzgsIDcxMiwyMjQ4LCAzMjEsIDQ0MiwgNTAzLCA3NjcsIDc0NCwgOTQxLDEyMzcsMTE3OCwKMTQ3NSwyMjQ5LCAgODIsIDE3OCwxMTQxLDExNzksIDk3MywyMjUwLDEzMDIsMjI1MSwgMjk3LDIyNTIsMjI1MywgNTcwLDIyNTQsMjI1NSwKMjI1NiwgIDE4LCA0NTAsIDIwNiwyMjU3LCAyOTAsIDI5MiwxMTQyLDIyNTgsIDUxMSwgMTYyLCAgOTksIDM0NiwgMTY0LCA3MzUsMjI1OSwKMTQ3NiwxNDc3LCAgIDQsIDU1NCwgMzQzLCA3OTgsMTA5OSwyMjYwLDExMDAsMjI2MSwgIDQzLCAxNzEsMTMwMywgMTM5LCAyMTUsMjI2MiwKMjI2MywgNzE3LCA3NzUsMjI2NCwxMDMzLCAzMjIsIDIxNiwyMjY1LCA4MzEsMjI2NiwgMTQ5LDIyNjcsMTMwNCwyMjY4LDIyNjksIDcwMiwKMTIzOCwgMTM1LCA4NDUsIDM0NywgMzA5LDIyNzAsIDQ4NCwyMjcxLCA4NzgsIDY1NSwgMjM4LDEwMDYsMTQ3OCwyMjcyLCAgNjcsMjI3MywKIDI5NSwyMjc0LDIyNzUsIDQ2MSwyMjc2LCA0NzgsIDk0MiwgNDEyLDIyNzcsMTAzNCwyMjc4LDIyNzksMjI4MCwgMjY1LDIyODEsIDU0MSwKMjI4MiwyMjgzLDIyODQsMjI4NSwyMjg2LCAgNzAsIDg1MiwxMDcxLDIyODcsMjI4OCwyMjg5LDIyOTAsICAyMSwgIDU2LCA1MDksIDExNywKIDQzMiwyMjkxLDIyOTIsIDMzMSwgOTgwLCA1NTIsMTEwMSwgMTQ4LCAyODQsIDEwNSwgMzkzLDExODAsMTIzOSwgNzU1LDIyOTMsIDE4NywKMjI5NCwxMDQ2LDE0NzksMjI5NSwgMzQwLDIyOTYsICA2MywxMDQ3LCAyMzAsMjI5NywyMjk4LDEzMDUsIDc2MywxMzA2LCAxMDEsIDgwMCwKIDgwOCwgNDk0LDIyOTksMjMwMCwyMzAxLCA5MDMsMjMwMiwgIDM3LDEwNzIsICAxNCwgICA1LDIzMDMsICA3OSwgNjc1LDIzMDQsIDMxMiwKMjMwNSwyMzA2LDIzMDcsMjMwOCwyMzA5LDE0ODAsICAgNiwxMzA3LDIzMTAsMjMxMSwyMzEyLCAgIDEsIDQ3MCwgIDM1LCAgMjQsIDIyOSwKMjMxMywgNjk1LCAyMTAsICA4NiwgNzc4LCAgMTUsIDc4NCwgNTkyLCA3NzksICAzMiwgIDc3LCA4NTUsIDk2NCwyMzE0LCAyNTksMjMxNSwKIDUwMSwgMzgwLDIzMTYsMjMxNywgIDgzLCA5ODEsIDE1MywgNjg5LDEzMDgsMTQ4MSwxNDgyLDE0ODMsMjMxOCwyMzE5LCA3MTYsMTQ4NCwKMjMyMCwyMzIxLDIzMjIsMjMyMywyMzI0LDIzMjUsMTQ4NSwyMzI2LDIzMjcsIDEyOCwgIDU3LCAgNjgsIDI2MSwxMDQ4LCAyMTEsIDE3MCwKMTI0MCwgIDMxLDIzMjgsICA1MSwgNDM1LCA3NDIsMjMyOSwyMzMwLDIzMzEsIDYzNSwyMzMyLCAyNjQsIDQ1NiwyMzMzLDIzMzQsMjMzNSwKIDQyNSwyMzM2LDE0ODYsIDE0MywgNTA3LCAyNjMsIDk0MywyMzM3LCAzNjMsIDkyMCwxNDg3LCAyNTYsMTQ4OCwxMTAyLCAyNDMsIDYwMSwKMTQ4OSwyMzM4LDIzMzksMjM0MCwyMzQxLDIzNDIsMjM0MywyMzQ0LCA4NjEsMjM0NSwyMzQ2LDIzNDcsMjM0OCwyMzQ5LDIzNTAsIDM5NSwKMjM1MSwxNDkwLDE0OTEsICA2MiwgNTM1LCAxNjYsIDIyNSwyMzUyLDIzNTMsIDY2OCwgNDE5LDEyNDEsIDEzOCwgNjA0LCA5MjgsMjM1NCwKMTE4MSwyMzU1LDE0OTIsMTQ5MywyMzU2LDIzNTcsMjM1OCwxMTQzLDIzNTksIDY5NiwyMzYwLCAzODcsIDMwNywxMzA5LCA2ODIsIDQ3NiwKMjM2MSwyMzYyLCAzMzIsICAxMiwgMjIyLCAxNTYsMjM2MywgMjMyLDIzNjQsIDY0MSwgMjc2LCA2NTYsIDUxNywxNDk0LDE0OTUsMTAzNSwKIDQxNiwgNzM2LDE0OTYsMjM2NSwxMDE3LCA1ODYsMjM2NiwyMzY3LDIzNjgsMTQ5NywyMzY5LCAyNDIsMjM3MCwyMzcxLDIzNzIsMTQ5OCwKMjM3MywgOTY1LCA3MTMsMjM3NCwyMzc1LDIzNzYsMjM3NywgNzQwLCA5ODIsMTQ5OSwgOTQ0LDE1MDAsMTAwNywyMzc4LDIzNzksMTMxMCwKMTUwMSwyMzgwLDIzODEsMjM4MiwgNzg1LCAzMjksMjM4MywyMzg0LDE1MDIsMjM4NSwyMzg2LDIzODcsIDkzMiwyMzg4LDE1MDMsMjM4OSwKMjM5MCwyMzkxLDIzOTIsMTI0MiwyMzkzLDIzOTQsMjM5NSwyMzk2LDIzOTcsIDk5NCwgOTUwLDIzOTgsMjM5OSwyNDAwLDI0MDEsMTUwNCwKMTMxMSwyNDAyLDI0MDMsMjQwNCwyNDA1LDEwNDksIDc0OSwyNDA2LDI0MDcsIDg1MywgNzE4LDExNDQsMTMxMiwyNDA4LDExODIsMTUwNSwKMjQwOSwyNDEwLCAyNTUsIDUxNiwgNDc5LCA1NjQsIDU1MCwgMjE0LDE1MDYsMTUwNywxMzEzLCA0MTMsIDIzOSwgNDQ0LCAzMzksMTE0NSwKMTAzNiwxNTA4LDE1MDksMTMxNCwxMDM3LDE1MTAsMTMxNSwyNDExLDE1MTEsMjQxMiwyNDEzLDI0MTQsIDE3NiwgNzAzLCA0OTcsIDYyNCwKIDU5MywgOTIxLCAzMDIsMjQxNSwgMzQxLCAxNjUsMTEwMywxNTEyLDI0MTYsMTUxMywyNDE3LDI0MTgsMjQxOSwgMzc2LDI0MjAsIDcwMCwKMjQyMSwyNDIyLDI0MjMsIDI1OCwgNzY4LDEzMTYsMjQyNCwxMTgzLDI0MjUsIDk5NSwgNjA4LDI0MjYsMjQyNywyNDI4LDI0MjksIDIyMSwKMjQzMCwyNDMxLDI0MzIsMjQzMywyNDM0LDI0MzUsMjQzNiwyNDM3LCAxOTUsIDMyMywgNzI2LCAxODgsIDg5NywgOTgzLDEzMTcsIDM3NywKIDY0NCwxMDUwLCA4NzksMjQzOCwgNDUyLDI0MzksMjQ0MCwyNDQxLDI0NDIsMjQ0MywyNDQ0LCA5MTQsMjQ0NSwyNDQ2LDI0NDcsMjQ0OCwKIDkxNSwgNDg5LDI0NDksMTUxNCwxMTg0LDI0NTAsMjQ1MSwgNTE1LCAgNjQsIDQyNywgNDk1LDI0NTIsIDU4MywyNDUzLCA0ODMsIDQ4NSwKMTAzOCwgNTYyLCAyMTMsMTUxNSwgNzQ4LCA2NjYsMjQ1NCwyNDU1LDI0NTYsMjQ1NywgMzM0LDI0NTgsIDc4MCwgOTk2LDEwMDgsIDcwNSwKMTI0MywyNDU5LDI0NjAsMjQ2MSwyNDYyLDI0NjMsIDExNCwyNDY0LCA0OTMsMTE0NiwgMzY2LCAxNjMsMTUxNiwgOTYxLDExMDQsMjQ2NSwKIDI5MSwyNDY2LDEzMTgsMTEwNSwyNDY3LDE1MTcsIDM2NSwyNDY4LCAzNTUsIDk1MSwxMjQ0LDI0NjksMTMxOSwyNDcwLCA2MzEsMjQ3MSwKMjQ3MiwgMjE4LDEzMjAsIDM2NCwgMzIwLCA3NTYsMTUxOCwxNTE5LDEzMjEsMTUyMCwxMzIyLDI0NzMsMjQ3NCwyNDc1LDI0NzYsIDk5NywKMjQ3NywyNDc4LDI0NzksMjQ4MCwgNjY1LDExODUsMjQ4MSwgOTE2LDE1MjEsMjQ4MiwyNDgzLDI0ODQsIDU4NCwgNjg0LDI0ODUsMjQ4NiwKIDc5NywyNDg3LDEwNTEsMTE4NiwyNDg4LDI0ODksMjQ5MCwxNTIyLDI0OTEsMjQ5MiwgMzcwLDI0OTMsMTAzOSwxMTg3LCAgNjUsMjQ5NCwKIDQzNCwgMjA1LCA0NjMsMTE4OCwyNDk1LCAxMjUsIDgxMiwgMzkxLCA0MDIsIDgyNiwgNjk5LCAyODYsIDM5OCwgMTU1LCA3ODEsIDc3MSwKIDU4NSwyNDk2LCA1OTAsIDUwNSwxMDczLDI0OTcsIDU5OSwgMjQ0LCAyMTksIDkxNywxMDE4LCA5NTIsIDY0NiwxNTIzLDI0OTgsMTMyMywKMjQ5OSwyNTAwLCAgNDksIDk4NCwgMzU0LCA3NDEsMjUwMSwgNjI1LDI1MDIsMTMyNCwyNTAzLDEwMTksIDE5MCwgMzU3LCA3NTcsIDQ5MSwKICA5NSwgNzgyLCA4NjgsMjUwNCwyNTA1LDI1MDYsMjUwNywyNTA4LDI1MDksIDEzNCwxNTI0LDEwNzQsIDQyMiwxNTI1LCA4OTgsMjUxMCwKIDE2MSwyNTExLDI1MTIsMjUxMywyNTE0LCA3NjksMjUxNSwxNTI2LDI1MTYsMjUxNywgNDExLDEzMjUsMjUxOCwgNDcyLDE1MjcsMjUxOSwKMjUyMCwyNTIxLDI1MjIsMjUyMywyNTI0LCA5ODUsMjUyNSwyNTI2LDI1MjcsMjUyOCwyNTI5LDI1MzAsIDc2NCwyNTMxLDEyNDUsMjUzMiwKMjUzMywgIDI1LCAyMDQsIDMxMSwyNTM0LCA0OTYsMjUzNSwxMDUyLDI1MzYsMjUzNywyNTM4LDI1MzksMjU0MCwyNTQxLDI1NDIsIDE5OSwKIDcwNCwgNTA0LCA0NjgsIDc1OCwgNjU3LDE1MjgsIDE5NiwgIDQ0LCA4MzksMTI0NiwgMjcyLCA3NTAsMjU0MywgNzY1LCA4NjIsMjU0NCwKMjU0NSwxMzI2LDI1NDYsIDEzMiwgNjE1LCA5MzMsMjU0NywgNzMyLDI1NDgsMjU0OSwyNTUwLDExODksMTUyOSwyNTUxLCAyODMsMTI0NywKMTA1MywgNjA3LCA5MjksMjU1MiwyNTUzLDI1NTQsIDkzMCwgMTgzLCA4NzIsIDYxNiwxMDQwLDExNDcsMjU1NSwxMTQ4LDEwMjAsIDQ0MSwKIDI0OSwxMDc1LDI1NTYsMjU1NywyNTU4LCA0NjYsIDc0MywyNTU5LDI1NjAsMjU2MSwgIDkyLCA1MTQsIDQyNiwgNDIwLCA1MjYsMjU2MiwKMjU2MywyNTY0LDI1NjUsMjU2NiwyNTY3LDI1NjgsIDE4NSwyNTY5LDI1NzAsMjU3MSwyNTcyLCA3NzYsMTUzMCwgNjU4LDI1NzMsIDM2MiwKMjU3NCwgMzYxLCA5MjIsMTA3NiwgNzkzLDI1NzUsMjU3NiwyNTc3LDI1NzgsMjU3OSwyNTgwLDE1MzEsIDI1MSwyNTgxLDI1ODIsMjU4MywKMjU4NCwxNTMyLCAgNTQsIDYxMiwgMjM3LDEzMjcsMjU4NSwyNTg2LCAyNzUsIDQwOCwgNjQ3LCAxMTEsMjU4NywxNTMzLDExMDYsIDQ2NSwKICAgMywgNDU4LCAgIDksICAzOCwyNTg4LCAxMDcsIDExMCwgODkwLCAyMDksICAyNiwgNzM3LCA0OTgsMjU4OSwxNTM0LDI1OTAsIDQzMSwKIDIwMiwgIDg4LDE1MzUsIDM1NiwgMjg3LDExMDcsIDY2MCwxMTQ5LDI1OTEsIDM4MSwxNTM2LCA5ODYsMTE1MCwgNDQ1LDEyNDgsMTE1MSwKIDk3NCwyNTkyLDI1OTMsIDg0NiwyNTk0LCA0NDYsIDk1MywgMTg0LDEyNDksMTI1MCwgNzI3LDI1OTUsIDkyMywgMTkzLCA4ODMsMjU5NiwKMjU5NywyNTk4LCAxMDIsIDMyNCwgNTM5LCA4MTcsMjU5OSwgNDIxLDEwNDEsMjYwMCwgODMyLDI2MDEsICA5NCwgMTc1LCAxOTcsIDQwNiwKMjYwMiwgNDU5LDI2MDMsMjYwNCwyNjA1LDI2MDYsMjYwNywgMzMwLCA1NTUsMjYwOCwyNjA5LDI2MTAsIDcwNiwxMTA4LCAzODksMjYxMSwKMjYxMiwyNjEzLDI2MTQsIDIzMywyNjE1LCA4MzMsIDU1OCwgOTMxLCA5NTQsMTI1MSwyNjE2LDI2MTcsMTUzNywgNTQ2LDI2MTgsMjYxOSwKMTAwOSwyNjIwLDI2MjEsMjYyMiwxNTM4LCA2OTAsMTMyOCwyNjIzLCA5NTUsMjYyNCwxNTM5LDI2MjUsMjYyNiwgNzcyLDI2MjcsMjYyOCwKMjYyOSwyNjMwLDI2MzEsIDkyNCwgNjQ4LCA4NjMsIDYwMywyNjMyLDI2MzMsIDkzNCwxNTQwLCA4NjQsIDg2NSwyNjM0LCA2NDIsMTA0MiwKIDY3MCwxMTkwLDI2MzUsMjYzNiwyNjM3LDI2MzgsIDE2OCwyNjM5LCA2NTIsIDg3MywgNTQyLDEwNTQsMTU0MSwyNjQwLDI2NDEsMjY0MiwgICMgNTEyLCAyNTYKKQoKUEsDBBQAAAAAAAAAIQAmBZf41AYAANQGAAA/AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2V1Y2tycHJvYmVyLnB5IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEJFR0lOIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgVGhlIE9yaWdpbmFsIENvZGUgaXMgbW96aWxsYS5vcmcgY29kZS4KIwojIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwojIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uLgojIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDE5OTgKIyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiMKIyBDb250cmlidXRvcihzKToKIyAgIE1hcmsgUGlsZ3JpbSAtIHBvcnQgdG8gUHl0aG9uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgojIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQojIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQojIDAyMTEwLTEzMDEgIFVTQQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVORCBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCmZyb20gLm1iY2hhcnNldHByb2JlciBpbXBvcnQgTXVsdGlCeXRlQ2hhclNldFByb2Jlcgpmcm9tIC5jb2RpbmdzdGF0ZW1hY2hpbmUgaW1wb3J0IENvZGluZ1N0YXRlTWFjaGluZQpmcm9tIC5jaGFyZGlzdHJpYnV0aW9uIGltcG9ydCBFVUNLUkRpc3RyaWJ1dGlvbkFuYWx5c2lzCmZyb20gLm1iY3NzbSBpbXBvcnQgRVVDS1JfU01fTU9ERUwKCgpjbGFzcyBFVUNLUlByb2JlcihNdWx0aUJ5dGVDaGFyU2V0UHJvYmVyKToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzdXBlcihFVUNLUlByb2Jlciwgc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYuY29kaW5nX3NtID0gQ29kaW5nU3RhdGVNYWNoaW5lKEVVQ0tSX1NNX01PREVMKQogICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uX2FuYWx5emVyID0gRVVDS1JEaXN0cmlidXRpb25BbmFseXNpcygpCiAgICAgICAgc2VsZi5yZXNldCgpCgogICAgQHByb3BlcnR5CiAgICBkZWYgY2hhcnNldF9uYW1lKHNlbGYpOgogICAgICAgIHJldHVybiAiRVVDLUtSIgoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGxhbmd1YWdlKHNlbGYpOgogICAgICAgIHJldHVybiAiS29yZWFuIgpQSwMEFAAAAAAAAAAhAMzbSdWFewAAhXsAAD0AAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvZXVjdHdmcmVxLnB5IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEJFR0lOIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgVGhlIE9yaWdpbmFsIENvZGUgaXMgTW96aWxsYSBDb21tdW5pY2F0b3IgY2xpZW50IGNvZGUuCiMKIyBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKIyBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi4KIyBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAxOTk4CiMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgojCiMgQ29udHJpYnV0b3Iocyk6CiMgICBNYXJrIFBpbGdyaW0gLSBwb3J0IHRvIFB5dGhvbgojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKIyAwMjExMC0xMzAxICBVU0EKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFTkQgTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgojIEVVQ1RXIGZyZXF1ZW5jeSB0YWJsZQojIENvbnZlcnRlZCBmcm9tIGJpZzUgd29yawojIGJ5IFRhaXdhbidzIE1hbmRhcmluIFByb21vdGlvbiBDb3VuY2lsCiMgPGh0dHA6I3d3dy5lZHUudHc6ODEvbWFuZHIvPgoKIyAxMjggIC0tPiAwLjQyMjYxCiMgMjU2ICAtLT4gMC41Nzg1MQojIDUxMiAgLS0+IDAuNzQ4NTEKIyAxMDI0IC0tPiAwLjg5Mzg0CiMgMjA0OCAtLT4gMC45NzU4MwojCiMgSWRlYSBEaXN0cmlidXRpb24gUmF0aW8gPSAwLjc0ODUxLygxLTAuNzQ4NTEpID0yLjk4CiMgUmFuZG9tIERpc3RyaWJ1dGlvbiBSYXRpb24gPSA1MTIvKDU0MDEtNTEyKT0wLjEwNQojCiMgVHlwaWNhbCBEaXN0cmlidXRpb24gUmF0aW8gYWJvdXQgMjUlIG9mIElkZWFsIG9uZSwgc3RpbGwgbXVjaCBoaWdoZXIgdGhhbiBSRFIKCkVVQ1RXX1RZUElDQUxfRElTVFJJQlVUSU9OX1JBVElPID0gMC43NQoKIyBDaGFyIHRvIEZyZXFPcmRlciB0YWJsZSAsCkVVQ1RXX1RBQkxFX1NJWkUgPSA1Mzc2CgpFVUNUV19DSEFSX1RPX0ZSRVFfT1JERVIgPSAoCiAgIDEsMTgwMCwxNTA2LCAyNTUsMTQzMSwgMTk4LCAgIDksICA4MiwgICA2LDczMTAsIDE3NywgMjAyLDM2MTUsMTI1NiwyODA4LCAxMTAsICAjIDI3NDIKMzczNSwgIDMzLDMyNDEsIDI2MSwgIDc2LCAgNDQsMjExMywgIDE2LDI5MzEsMjE4NCwxMTc2LCA2NTksMzg2OCwgIDI2LDM0MDQsMjY0MywgICMgMjc1OAoxMTk4LDM4NjksMzMxMyw0MDYwLCA0MTAsMjIxMSwgMzAyLCA1OTAsIDM2MSwxOTYzLCAgIDgsIDIwNCwgIDU4LDQyOTYsNzMxMSwxOTMxLCAgIyAyNzc0CiAgNjMsNzMxMiw3MzEzLCAzMTcsMTYxNCwgIDc1LCAyMjIsIDE1OSw0MDYxLDI0MTIsMTQ4MCw3MzE0LDM1MDAsMzA2OCwgMjI0LDI4MDksICAjIDI3OTAKMzYxNiwgICAzLCAgMTAsMzg3MCwxNDcxLCAgMjksMjc3NCwxMTM1LDI4NTIsMTkzOSwgODczLCAxMzAsMzI0MiwxMTIzLCAzMTIsNzMxNSwgICMgMjgwNgo0Mjk3LDIwNTEsIDUwNywgMjUyLCA2ODIsNzMxNiwgMTQyLDE5MTQsIDEyNCwgMjA2LDI5MzIsICAzNCwzNTAxLDMxNzMsICA2NCwgNjA0LCAgIyAyODIyCjczMTcsMjQ5NCwxOTc2LDE5NzcsIDE1NSwxOTkwLCA2NDUsIDY0MSwxNjA2LDczMTgsMzQwNSwgMzM3LCAgNzIsIDQwNiw3MzE5LCAgODAsICAjIDI4MzgKIDYzMCwgMjM4LDMxNzQsMTUwOSwgMjYzLCA5MzksMTA5MiwyNjQ0LCA3NTYsMTQ0MCwxMDk0LDM0MDYsIDQ0OSwgIDY5LDI5NjksIDU5MSwgICMgMjg1NAogMTc5LDIwOTUsIDQ3MSwgMTE1LDIwMzQsMTg0MywgIDYwLCAgNTAsMjk3MCwgMTM0LCA4MDYsMTg2OCwgNzM0LDIwMzUsMzQwNywgMTgwLCAgIyAyODcwCiA5OTUsMTYwNywgMTU2LCA1MzcsMjg5MywgNjg4LDczMjAsIDMxOSwxMzA1LCA3NzksMjE0NCwgNTE0LDIzNzQsIDI5OCw0Mjk4LCAzNTksICAjIDI4ODYKMjQ5NSwgIDkwLDI3MDcsMTMzOCwgNjYzLCAgMTEsIDkwNiwxMDk5LDI1NDUsICAyMCwyNDM2LCAxODIsIDUzMiwxNzE2LDczMjEsIDczMiwgICMgMjkwMgoxMzc2LDQwNjIsMTMxMSwxNDIwLDMxNzUsICAyNSwyMzEyLDEwNTYsIDExMywgMzk5LCAzODIsMTk0OSwgMjQyLDM0MDgsMjQ2NywgNTI5LCAgIyAyOTE4CjMyNDMsIDQ3NSwxNDQ3LDM2MTcsNzMyMiwgMTE3LCAgMjEsIDY1NiwgODEwLDEyOTcsMjI5NSwyMzI5LDM1MDIsNzMyMywgMTI2LDQwNjMsICAjIDI5MzQKIDcwNiwgNDU2LCAxNTAsIDYxMyw0Mjk5LCAgNzEsMTExOCwyMDM2LDQwNjQsIDE0NSwzMDY5LCAgODUsIDgzNSwgNDg2LDIxMTQsMTI0NiwgICMgMjk1MAoxNDI2LCA0MjgsIDcyNywxMjg1LDEwMTUsIDgwMCwgMTA2LCA2MjMsIDMwMywxMjgxLDczMjQsMjEyNywyMzU0LCAzNDcsMzczNiwgMjIxLCAgIyAyOTY2CjM1MDMsMzExMCw3MzI1LDE5NTUsMTE1Myw0MDY1LCAgODMsIDI5NiwxMTk5LDMwNzAsIDE5MiwgNjI0LCAgOTMsNzMyNiwgODIyLDE4OTcsICAjIDI5ODIKMjgxMCwzMTExLCA3OTUsMjA2NCwgOTkxLDE1NTQsMTU0MiwxNTkyLCAgMjcsICA0MywyODUzLCA4NTksIDEzOSwxNDU2LCA4NjAsNDMwMCwgICMgMjk5OAogNDM3LCA3MTIsMzg3MSwgMTY0LDIzOTIsMzExMiwgNjk1LCAyMTEsMzAxNywyMDk2LCAxOTUsMzg3MiwxNjA4LDM1MDQsMzUwNSwzNjE4LCAgIyAzMDE0CjM4NzMsIDIzNCwgODExLDI5NzEsMjA5NywzODc0LDIyMjksMTQ0MSwzNTA2LDE2MTUsMjM3NSwgNjY4LDIwNzYsMTYzOCwgMzA1LCAyMjgsICAjIDMwMzAKMTY2NCw0MzAxLCA0NjcsIDQxNSw3MzI3LCAyNjIsMjA5OCwxNTkzLCAyMzksIDEwOCwgMzAwLCAyMDAsMTAzMywgNTEyLDEyNDcsMjA3NywgICMgMzA0Ngo3MzI4LDczMjksMjE3MywzMTc2LDM2MTksMjY3MywgNTkzLCA4NDUsMTA2MiwzMjQ0LCAgODgsMTcyMywyMDM3LDM4NzUsMTk1MCwgMjEyLCAgIyAzMDYyCiAyNjYsIDE1MiwgMTQ5LCA0NjgsMTg5OCw0MDY2LDQzMDIsICA3NywgMTg3LDczMzAsMzAxOCwgIDM3LCAgIDUsMjk3Miw3MzMxLDM4NzYsICAjIDMwNzgKNzMzMiw3MzMzLCAgMzksMjUxNyw0MzAzLDI4OTQsMzE3NywyMDc4LCAgNTUsIDE0OCwgIDc0LDQzMDQsIDU0NSwgNDgzLDE0NzQsMTAyOSwgICMgMzA5NAoxNjY1LCAyMTcsMTg2OSwxNTMxLDMxMTMsMTEwNCwyNjQ1LDQwNjcsICAyNCwgMTcyLDM1MDcsIDkwMCwzODc3LDM1MDgsMzUwOSw0MzA1LCAgIyAzMTEwCiAgMzIsMTQwOCwyODExLDEzMTIsIDMyOSwgNDg3LDIzNTUsMjI0NywyNzA4LCA3ODQsMjY3NCwgICA0LDMwMTksMzMxNCwxNDI3LDE3ODgsICAjIDMxMjYKIDE4OCwgMTA5LCA0OTksNzMzNCwzNjIwLDE3MTcsMTc4OSwgODg4LDEyMTcsMzAyMCw0MzA2LDczMzUsMzUxMCw3MzM2LDMzMTUsMTUyMCwgICMgMzE0MgozNjIxLDM4NzgsIDE5NiwxMDM0LCA3NzUsNzMzNyw3MzM4LCA5MjksMTgxNSwgMjQ5LCA0MzksICAzOCw3MzM5LDEwNjMsNzM0MCwgNzk0LCAgIyAzMTU4CjM4NzksMTQzNSwyMjk2LCAgNDYsIDE3OCwzMjQ1LDIwNjUsNzM0MSwyMzc2LDczNDIsIDIxNCwxNzA5LDQzMDcsIDgwNCwgIDM1LCA3MDcsICAjIDMxNzQKIDMyNCwzNjIyLDE2MDEsMjU0NiwgMTQwLCA0NTksNDA2OCw3MzQzLDczNDQsMTM2NSwgODM5LCAyNzIsIDk3OCwyMjU3LDI1NzIsMzQwOSwgICMgMzE5MAoyMTI4LDEzNjMsMzYyMywxNDIzLCA2OTcsIDEwMCwzMDcxLCAgNDgsICA3MCwxMjMxLCA0OTUsMzExNCwyMTkzLDczNDUsMTI5NCw3MzQ2LCAgIyAzMjA2CjIwNzksIDQ2MiwgNTg2LDEwNDIsMzI0NiwgODUzLCAyNTYsIDk4OCwgMTg1LDIzNzcsMzQxMCwxNjk4LCA0MzQsMTA4NCw3MzQ3LDM0MTEsICAjIDMyMjIKIDMxNCwyNjE1LDI3NzUsNDMwOCwyMzMwLDIzMzEsIDU2OSwyMjgwLCA2MzcsMTgxNiwyNTE4LCA3NTcsMTE2MiwxODc4LDE2MTYsMzQxMiwgICMgMzIzOAogMjg3LDE1NzcsMjExNSwgNzY4LDQzMDksMTY3MSwyODU0LDM1MTEsMjUxOSwxMzIxLDM3MzcsIDkwOSwyNDEzLDczNDgsNDA2OSwgOTMzLCAgIyAzMjU0CjM3MzgsNzM0OSwyMDUyLDIzNTYsMTIyMiw0MzEwLCA3NjUsMjQxNCwxMzIyLCA3ODYsNDMxMSw3MzUwLDE5MTksMTQ2MiwxNjc3LDI4OTUsICAjIDMyNzAKMTY5OSw3MzUxLDQzMTIsMTQyNCwyNDM3LDMxMTUsMzYyNCwyNTkwLDMzMTYsMTc3NCwxOTQwLDM0MTMsMzg4MCw0MDcwLCAzMDksMTM2OSwgICMgMzI4NgoxMTMwLDI4MTIsIDM2NCwyMjMwLDE2NTMsMTI5OSwzODgxLDM1MTIsMzg4MiwzODgzLDI2NDYsIDUyNSwxMDg1LDMwMjEsIDkwMiwyMDAwLCAgIyAzMzAyCjE0NzUsIDk2NCw0MzEzLCA0MjEsMTg0NCwxNDE1LDEwNTcsMjI4MSwgOTQwLDEzNjQsMzExNiwgMzc2LDQzMTQsNDMxNSwxMzgxLCAgIDcsICAjIDMzMTgKMjUyMCwgOTgzLDIzNzgsIDMzNiwxNzEwLDI2NzUsMTg0NSwgMzIxLDM0MTQsIDU1OSwxMTMxLDMwMjIsMjc0MiwxODA4LDExMzIsMTMxMywgICMgMzMzNAogMjY1LDE0ODEsMTg1Nyw3MzUyLCAzNTIsMTIwMywyODEzLDMyNDcsIDE2NywxMDg5LCA0MjAsMjgxNCwgNzc2LCA3OTIsMTcyNCwzNTEzLCAgIyAzMzUwCjQwNzEsMjQzOCwzMjQ4LDczNTMsNDA3Miw3MzU0LCA0NDYsIDIyOSwgMzMzLDI3NDMsIDkwMSwzNzM5LDEyMDAsMTU1Nyw0MzE2LDI2NDcsICAjIDMzNjYKMTkyMCwgMzk1LDI3NDQsMjY3NiwzNzQwLDQwNzMsMTgzNSwgMTI1LCA5MTYsMzE3OCwyNjE2LDQzMTcsNzM1NSw3MzU2LDM3NDEsNzM1NywgICMgMzM4Mgo3MzU4LDczNTksNDMxOCwzMTE3LDM2MjUsMTEzMywyNTQ3LDE3NTcsMzQxNSwxNTEwLDIzMTMsMTQwOSwzNTE0LDczNjAsMjE0NSwgNDM4LCAgIyAzMzk4CjI1OTEsMjg5NiwyMzc5LDMzMTcsMTA2OCwgOTU4LDMwMjMsIDQ2MSwgMzExLDI4NTUsMjY3Nyw0MDc0LDE5MTUsMzE3OSw0MDc1LDE5NzgsICAjIDM0MTQKIDM4MywgNzUwLDI3NDUsMjYxNyw0MDc2LCAyNzQsIDUzOSwgMzg1LDEyNzgsMTQ0Miw3MzYxLDExNTQsMTk2NCwgMzg0LCA1NjEsIDIxMCwgICMgMzQzMAogIDk4LDEyOTUsMjU0OCwzNTE1LDczNjIsMTcxMSwyNDE1LDE0ODIsMzQxNiwzODg0LDI4OTcsMTI1NywgMTI5LDczNjMsMzc0MiwgNjQyLCAgIyAzNDQ2CiA1MjMsMjc3NiwyNzc3LDI2NDgsNzM2NCwgMTQxLDIyMzEsMTMzMywgIDY4LCAxNzYsIDQ0MSwgODc2LCA5MDcsNDA3NywgNjAzLDI1OTIsICAjIDM0NjIKIDcxMCwgMTcxLDM0MTcsIDQwNCwgNTQ5LCAgMTgsMzExOCwyMzkzLDE0MTAsMzYyNiwxNjY2LDczNjUsMzUxNiw0MzE5LDI4OTgsNDMyMCwgICMgMzQ3OAo3MzY2LDI5NzMsIDM2OCw3MzY3LCAxNDYsIDM2NiwgIDk5LCA4NzEsMzYyNywxNTQzLCA3NDgsIDgwNywxNTg2LDExODUsICAyMiwyMjU4LCAgIyAzNDk0CiAzNzksMzc0MywzMTgwLDczNjgsMzE4MSwgNTA1LDE5NDEsMjYxOCwxOTkxLDEzODIsMjMxNCw3MzY5LCAzODAsMjM1NywgMjE4LCA3MDIsICAjIDM1MTAKMTgxNywxMjQ4LDM0MTgsMzAyNCwzNTE3LDMzMTgsMzI0OSw3MzcwLDI5NzQsMzYyOCwgOTMwLDMyNTAsMzc0NCw3MzcxLCAgNTksNzM3MiwgICMgMzUyNgogNTg1LCA2MDEsNDA3OCwgNDk3LDM0MTksMTExMiwxMzE0LDQzMjEsMTgwMSw3MzczLDEyMjMsMTQ3MiwyMTc0LDczNzQsIDc0OSwxODM2LCAgIyAzNTQyCiA2OTAsMTg5OSwzNzQ1LDE3NzIsMzg4NSwxNDc2LCA0MjksMTA0MywxNzkwLDIyMzIsMjExNiwgOTE3LDQwNzksIDQ0NywxMDg2LDE2MjksICAjIDM1NTgKNzM3NSwgNTU2LDczNzYsNzM3NywyMDIwLDE2NTQsIDg0NCwxMDkwLCAxMDUsIDU1MCwgOTY2LDE3NTgsMjgxNSwxMDA4LDE3ODIsIDY4NiwgICMgMzU3NAoxMDk1LDczNzgsMjI4MiwgNzkzLDE2MDIsNzM3OSwzNTE4LDI1OTMsNDMyMiw0MDgwLDI5MzMsMjI5Nyw0MzIzLDM3NDYsIDk4MCwyNDk2LCAgIyAzNTkwCiA1NDQsIDM1MywgNTI3LDQzMjQsIDkwOCwyNjc4LDI4OTksNzM4MCwgMzgxLDI2MTksMTk0MiwxMzQ4LDczODEsMTM0MSwxMjUyLCA1NjAsICAjIDM2MDYKMzA3Miw3MzgyLDM0MjAsMjg1Niw3MzgzLDIwNTMsIDk3MywgODg2LDIwODAsIDE0Myw0MzI1LDczODQsNzM4NSwgMTU3LDM4ODYsIDQ5NiwgICMgMzYyMgo0MDgxLCAgNTcsIDg0MCwgNTQwLDIwMzgsNDMyNiw0MzI3LDM0MjEsMjExNywxNDQ1LCA5NzAsMjI1OSwxNzQ4LDE5NjUsMjA4MSw0MDgyLCAgIyAzNjM4CjMxMTksMTIzNCwxNzc1LDMyNTEsMjgxNiwzNjI5LCA3NzMsMTIwNiwyMTI5LDEwNjYsMjAzOSwxMzI2LDM4ODcsMTczOCwxNzI1LDQwODMsICAjIDM2NTQKIDI3OSwzMTIwLCAgNTEsMTU0NCwyNTk0LCA0MjMsMTU3OCwyMTMwLDIwNjYsIDE3Myw0MzI4LDE4NzksNzM4Niw3Mzg3LDE1ODMsIDI2NCwgICMgMzY3MAogNjEwLDM2MzAsNDMyOSwyNDM5LCAyODAsIDE1NCw3Mzg4LDczODksNzM5MCwxNzM5LCAzMzgsMTI4MiwzMDczLCA2OTMsMjg1NywxNDExLCAgIyAzNjg2CjEwNzQsMzc0NywyNDQwLDczOTEsNDMzMCw3MzkyLDczOTMsMTI0MCwgOTUyLDIzOTQsNzM5NCwyOTAwLDE1MzgsMjY3OSwgNjg1LDE0ODMsICAjIDM3MDIKNDA4NCwyNDY4LDE0MzYsIDk1Myw0MDg1LDIwNTQsNDMzMSwgNjcxLDIzOTUsICA3OSw0MDg2LDI0NDEsMzI1MiwgNjA4LCA1NjcsMjY4MCwgICMgMzcxOAozNDIyLDQwODcsNDA4OCwxNjkxLCAzOTMsMTI2MSwxNzkxLDIzOTYsNzM5NSw0MzMyLDczOTYsNzM5Nyw3Mzk4LDczOTksMTM4MywxNjcyLCAgIyAzNzM0CjM3NDgsMzE4MiwxNDY0LCA1MjIsMTExOSwgNjYxLDExNTAsIDIxNiwgNjc1LDQzMzMsMzg4OCwxNDMyLDM1MTksIDYwOSw0MzM0LDI2ODEsICAjIDM3NTAKMjM5Nyw3NDAwLDc0MDEsNzQwMiw0MDg5LDMwMjUsICAgMCw3NDAzLDI0NjksIDMxNSwgMjMxLDI0NDIsIDMwMSwzMzE5LDQzMzUsMjM4MCwgICMgMzc2Ngo3NDA0LCAyMzMsNDA5MCwzNjMxLDE4MTgsNDMzNiw0MzM3LDc0MDUsICA5NiwxNzc2LDEzMTUsMjA4Miw3NDA2LCAyNTcsNzQwNywxODA5LCAgIyAzNzgyCjM2MzIsMjcwOSwxMTM5LDE4MTksNDA5MSwyMDIxLDExMjQsMjE2MywyNzc4LDE3NzcsMjY0OSw3NDA4LDMwNzQsIDM2MywxNjU1LDMxODMsICAjIDM3OTgKNzQwOSwyOTc1LDc0MTAsNzQxMSw3NDEyLDM4ODksMTU2NywzODkwLCA3MTgsIDEwMywzMTg0LCA4NDksMTQ0MywgMzQxLDMzMjAsMjkzNCwgICMgMzgxNAoxNDg0LDc0MTMsMTcxMiwgMTI3LCAgNjcsIDMzOSw0MDkyLDIzOTgsIDY3OSwxNDEyLCA4MjEsNzQxNCw3NDE1LCA4MzQsIDczOCwgMzUxLCAgIyAzODMwCjI5NzYsMjE0NiwgODQ2LCAyMzUsMTQ5NywxODgwLCA0MTgsMTk5MiwzNzQ5LDI3MTAsIDE4NiwxMTAwLDIxNDcsMjc0NiwzNTIwLDE1NDUsICAjIDM4NDYKMTM1NSwyOTM1LDI4NTgsMTM3NywgNTgzLDM4OTEsNDA5MywyNTczLDI5NzcsNzQxNiwxMjk4LDM2MzMsMTA3OCwyNTQ5LDM2MzQsMjM1OCwgICMgMzg2MgogIDc4LDM3NTAsMzc1MSwgMjY3LDEyODksMjA5OSwyMDAxLDE1OTQsNDA5NCwgMzQ4LCAzNjksMTI3NCwyMTk0LDIxNzUsMTgzNyw0MzM4LCAgIyAzODc4CjE4MjAsMjgxNywzNjM1LDI3NDcsMjI4MywyMDAyLDQzMzksMjkzNiwyNzQ4LCAxNDQsMzMyMSwgODgyLDQzNDAsMzg5MiwyNzQ5LDM0MjMsICAjIDM4OTQKNDM0MSwyOTAxLDc0MTcsNDA5NSwxNzI2LCAzMjAsNzQxOCwzODkzLDMwMjYsIDc4OCwyOTc4LDc0MTksMjgxOCwxNzczLDEzMjcsMjg1OSwgICMgMzkxMAozODk0LDI4MTksNzQyMCwxMzA2LDQzNDIsMjAwMywxNzAwLDM3NTIsMzUyMSwyMzU5LDI2NTAsIDc4NywyMDIyLCA1MDYsIDgyNCwzNjM2LCAgIyAzOTI2CiA1MzQsIDMyMyw0MzQzLDEwNDQsMzMyMiwyMDIzLDE5MDAsIDk0NiwzNDI0LDc0MjEsMTc3OCwxNTAwLDE2NzgsNzQyMiwxODgxLDQzNDQsICAjIDM5NDIKIDE2NSwgMjQzLDQzNDUsMzYzNywyNTIxLCAxMjMsIDY4Myw0MDk2LCA3NjQsNDM0NiwgIDM2LDM4OTUsMTc5MiwgNTg5LDI5MDIsIDgxNiwgICMgMzk1OAogNjI2LDE2NjcsMzAyNywyMjMzLDE2MzksMTU1NSwxNjIyLDM3NTMsMzg5Niw3NDIzLDM4OTcsMjg2MCwxMzcwLDEyMjgsMTkzMiwgODkxLCAgIyAzOTc0CjIwODMsMjkwMywgMzA0LDQwOTcsNzQyNCwgMjkyLDI5NzksMjcxMSwzNTIyLCA2OTEsMjEwMCw0MDk4LDExMTUsNDM0NywgMTE4LCA2NjIsICAjIDM5OTAKNzQyNSwgNjExLDExNTYsIDg1NCwyMzgxLDEzMTYsMjg2MSwgICAyLCAzODYsIDUxNSwyOTA0LDc0MjYsNzQyNywzMjUzLCA4NjgsMjIzNCwgICMgNDAwNgoxNDg2LCA4NTUsMjY1MSwgNzg1LDIyMTIsMzAyOCw3NDI4LDEwNDAsMzE4NSwzNTIzLDc0MjksMzEyMSwgNDQ4LDc0MzAsMTUyNSw3NDMxLCAgIyA0MDIyCjIxNjQsNDM0OCw3NDMyLDM3NTQsNzQzMyw0MDk5LDI4MjAsMzUyNCwzMTIyLCA1MDMsIDgxOCwzODk4LDMxMjMsMTU2OCwgODE0LCA2NzYsICAjIDQwMzgKMTQ0NCwgMzA2LDE3NDksNzQzNCwzNzU1LDE0MTYsMTAzMCwgMTk3LDE0MjgsIDgwNSwyODIxLDE1MDEsNDM0OSw3NDM1LDc0MzYsNzQzNywgICMgNDA1NAoxOTkzLDc0MzgsNDM1MCw3NDM5LDc0NDAsMjE5NSwgIDEzLDI3NzksMzYzOCwyOTgwLDMxMjQsMTIyOSwxOTE2LDc0NDEsMzc1NiwyMTMxLCAgIyA0MDcwCjc0NDIsNDEwMCw0MzUxLDIzOTksMzUyNSw3NDQzLDIyMTMsMTUxMSwxNzI3LDExMjAsNzQ0NCw3NDQ1LCA2NDYsMzc1NywyNDQzLCAzMDcsICAjIDQwODYKNzQ0Niw3NDQ3LDE1OTUsMzE4Niw3NDQ4LDc0NDksNzQ1MCwzNjM5LDExMTMsMTM1NiwzODk5LDE0NjUsMjUyMiwyNTIzLDc0NTEsIDUxOSwgICMgNDEwMgo3NDUyLCAxMjgsMjEzMiwgIDkyLDIyODQsMTk3OSw3NDUzLDM5MDAsMTUxMiwgMzQyLDMxMjUsMjE5Niw3NDU0LDI3ODAsMjIxNCwxOTgwLCAgIyA0MTE4CjMzMjMsNzQ1NSwgMjkwLDE2NTYsMTMxNywgNzg5LCA4MjcsMjM2MCw3NDU2LDM3NTgsNDM1MiwgNTYyLCA1ODEsMzkwMSw3NDU3LCA0MDEsICAjIDQxMzQKNDM1MywyMjQ4LCAgOTQsNDM1NCwxMzk5LDI3ODEsNzQ1OCwxNDYzLDIwMjQsNDM1NSwzMTg3LDE5NDMsNzQ1OSwgODI4LDExMDUsNDEwMSwgICMgNDE1MAoxMjYyLDEzOTQsNzQ2MCw0MTAyLCA2MDUsNDM1Niw3NDYxLDE3ODMsMjg2Miw3NDYyLDI4MjIsIDgxOSwyMTAxLCA1NzgsMjE5NywyOTM3LCAgIyA0MTY2Cjc0NjMsMTUwMiwgNDM2LDMyNTQsNDEwMywzMjU1LDI4MjMsMzkwMiwyOTA1LDM0MjUsMzQyNiw3NDY0LDI3MTIsMjMxNSw3NDY1LDc0NjYsICAjIDQxODIKMjMzMiwyMDY3LCAgMjMsNDM1NywgMTkzLCA4MjYsMzc1OSwyMTAyLCA2OTksMTYzMCw0MTA0LDMwNzUsIDM5MCwxNzkzLDEwNjQsMzUyNiwgICMgNDE5OAo3NDY3LDE1NzksMzA3NiwzMDc3LDE0MDAsNzQ2OCw0MTA1LDE4MzgsMTY0MCwyODYzLDc0NjksNDM1OCw0MzU5LCAxMzcsNDEwNiwgNTk4LCAgIyA0MjE0CjMwNzgsMTk2NiwgNzgwLCAxMDQsIDk3NCwyOTM4LDc0NzAsIDI3OCwgODk5LCAyNTMsIDQwMiwgNTcyLCA1MDQsIDQ5MywxMzM5LDc0NzEsICAjIDQyMzAKMzkwMywxMjc1LDQzNjAsMjU3NCwyNTUwLDc0NzIsMzY0MCwzMDI5LDMwNzksMjI0OSwgNTY1LDEzMzQsMjcxMywgODYzLCAgNDEsNzQ3MywgICMgNDI0Ngo3NDc0LDQzNjEsNzQ3NSwxNjU3LDIzMzMsICAxOSwgNDYzLDI3NTAsNDEwNywgNjA2LDc0NzYsMjk4MSwzMjU2LDEwODcsMjA4NCwxMzIzLCAgIyA0MjYyCjI2NTIsMjk4Miw3NDc3LDE2MzEsMTYyMywxNzUwLDQxMDgsMjY4Miw3NDc4LDI4NjQsIDc5MSwyNzE0LDI2NTMsMjMzNCwgMjMyLDI0MTYsICAjIDQyNzgKNzQ3OSwyOTgzLDE0OTgsNzQ4MCwyNjU0LDI2MjAsIDc1NSwxMzY2LDM2NDEsMzI1NywzMTI2LDIwMjUsMTYwOSwgMTE5LDE5MTcsMzQyNywgICMgNDI5NAogODYyLDEwMjYsNDEwOSw3NDgxLDM5MDQsMzc2MCw0MzYyLDM5MDUsNDM2MywyMjYwLDE5NTEsMjQ3MCw3NDgyLDExMjUsIDgxNyw0MTEwLCAgIyA0MzEwCjQxMTEsMzkwNiwxNTEzLDE3NjYsMjA0MCwxNDg3LDQxMTIsMzAzMCwzMjU4LDI4MjQsMzc2MSwzMTI3LDc0ODMsNzQ4NCwxNTA3LDc0ODUsICAjIDQzMjYKMjY4MywgNzMzLCAgNDAsMTYzMiwxMTA2LDI4NjUsIDM0NSw0MTEzLCA4NDEsMjUyNCwgMjMwLDQzNjQsMjk4NCwxODQ2LDMyNTksMzQyOCwgICMgNDM0Mgo3NDg2LDEyNjMsIDk4NiwzNDI5LDc0ODcsIDczNSwgODc5LCAyNTQsMTEzNywgODU3LCA2MjIsMTMwMCwxMTgwLDEzODgsMTU2MiwzOTA3LCAgIyA0MzU4CjM5MDgsMjkzOSwgOTY3LDI3NTEsMjY1NSwxMzQ5LCA1OTIsMjEzMywxNjkyLDMzMjQsMjk4NSwxOTk0LDQxMTQsMTY3OSwzOTA5LDE5MDEsICAjIDQzNzQKMjE4NSw3NDg4LCA3MzksMzY0MiwyNzE1LDEyOTYsMTI5MCw3NDg5LDQxMTUsMjE5OCwyMTk5LDE5MjEsMTU2MywyNTk1LDI1NTEsMTg3MCwgICMgNDM5MAoyNzUyLDI5ODYsNzQ5MCwgNDM1LDc0OTEsIDM0MywxMTA4LCA1OTYsICAxNywxNzUxLDQzNjUsMjIzNSwzNDMwLDM2NDMsNzQ5Miw0MzY2LCAgIyA0NDA2CiAyOTQsMzUyNywyOTQwLDE2OTMsIDQ3NywgOTc5LCAyODEsMjA0MSwzNTI4LCA2NDMsMjA0MiwzNjQ0LDI2MjEsMjc4MiwyMjYxLDEwMzEsICAjIDQ0MjIKMjMzNSwyMTM0LDIyOTgsMzUyOSw0MzY3LCAzNjcsMTI0OSwyNTUyLDc0OTMsMzUzMCw3NDk0LDQzNjgsMTI4MywzMzI1LDIwMDQsIDI0MCwgICMgNDQzOAoxNzYyLDMzMjYsNDM2OSw0MzcwLCA4MzYsMTA2OSwzMTI4LCA0NzQsNzQ5NSwyMTQ4LDI1MjUsIDI2OCwzNTMxLDc0OTYsMzE4OCwxNTIxLCAgIyA0NDU0CjEyODQsNzQ5NywxNjU4LDE1NDYsNDExNiw3NDk4LDM1MzIsMzUzMyw3NDk5LDQxMTcsMzMyNywyNjg0LDE2ODUsNDExOCwgOTYxLDE2NzMsICAjIDQ0NzAKMjYyMiwgMTkwLDIwMDUsMjIwMCwzNzYyLDQzNzEsNDM3Miw3NTAwLCA1NzAsMjQ5NywzNjQ1LDE0OTAsNzUwMSw0MzczLDI2MjMsMzI2MCwgICMgNDQ4NgoxOTU2LDQzNzQsIDU4NCwxNTE0LCAzOTYsMTA0NSwxOTQ0LDc1MDIsNDM3NSwxOTY3LDI0NDQsNzUwMyw3NTA0LDQzNzYsMzkxMCwgNjE5LCAgIyA0NTAyCjc1MDUsMzEyOSwzMjYxLCAyMTUsMjAwNiwyNzgzLDI1NTMsMzE4OSw0Mzc3LDMxOTAsNDM3OCwgNzYzLDQxMTksMzc2Myw0Mzc5LDc1MDYsICAjIDQ1MTgKNzUwNywxOTU3LDE3NjcsMjk0MSwzMzI4LDM2NDYsMTE3NCwgNDUyLDE0NzcsNDM4MCwzMzI5LDMxMzAsNzUwOCwyODI1LDEyNTMsMjM4MiwgICMgNDUzNAoyMTg2LDEwOTEsMjI4NSw0MTIwLCA0OTIsNzUwOSwgNjM4LDExNjksMTgyNCwyMTM1LDE3NTIsMzkxMSwgNjQ4LCA5MjYsMTAyMSwxMzI0LCAgIyA0NTUwCjQzODEsIDUyMCw0MzgyLCA5OTcsIDg0NywxMDA3LCA4OTIsNDM4MywzNzY0LDIyNjIsMTg3MSwzNjQ3LDc1MTAsMjQwMCwxNzg0LDQzODQsICAjIDQ1NjYKMTk1MiwyOTQyLDMwODAsMzE5MSwxNzI4LDQxMjEsMjA0MywzNjQ4LDQzODUsMjAwNywxNzAxLDMxMzEsMTU1MSwgIDMwLDIyNjMsNDEyMiwgICMgNDU4Mgo3NTExLDIwMjYsNDM4NiwzNTM0LDc1MTIsIDUwMSw3NTEzLDQxMjMsIDU5NCwzNDMxLDIxNjUsMTgyMSwzNTM1LDM0MzIsMzUzNiwzMTkyLCAgIyA0NTk4CiA4MjksMjgyNiw0MTI0LDc1MTQsMTY4MCwzMTMyLDEyMjUsNDEyNSw3NTE1LDMyNjIsNDM4Nyw0MTI2LDMxMzMsMjMzNiw3NTE2LDQzODgsICAjIDQ2MTQKNDEyNyw3NTE3LDM5MTIsMzkxMyw3NTE4LDE4NDcsMjM4MywyNTk2LDMzMzAsNzUxOSw0Mzg5LCAzNzQsMzkxNCwgNjUyLDQxMjgsNDEyOSwgICMgNDYzMAogMzc1LDExNDAsIDc5OCw3NTIwLDc1MjEsNzUyMiwyMzYxLDQzOTAsMjI2NCwgNTQ2LDE2NTksIDEzOCwzMDMxLDI0NDUsNDM5MSw3NTIzLCAgIyA0NjQ2CjIyNTAsIDYxMiwxODQ4LCA5MTAsIDc5NiwzNzY1LDE3NDAsMTM3MSwgODI1LDM3NjYsMzc2Nyw3NTI0LDI5MDYsMjU1NCw3NTI1LCA2OTIsICAjIDQ2NjIKIDQ0NCwzMDMyLDI2MjQsIDgwMSw0MzkyLDQxMzAsNzUyNiwxNDkxLCAyNDQsMTA1MywzMDMzLDQxMzEsNDEzMiwgMzQwLDc1MjcsMzkxNSwgICMgNDY3OAoxMDQxLDI5ODcsIDI5MywxMTY4LCAgODcsMTM1Nyw3NTI4LDE1MzksIDk1OSw3NTI5LDIyMzYsIDcyMSwgNjk0LDQxMzMsMzc2OCwgMjE5LCAgIyA0Njk0CjE0NzgsIDY0NCwxNDE3LDMzMzEsMjY1NiwxNDEzLDE0MDEsMTMzNSwxMzg5LDM5MTYsNzUzMCw3NTMxLDI5ODgsMjM2MiwzMTM0LDE4MjUsICAjIDQ3MTAKIDczMCwxNTE1LCAxODQsMjgyNywgIDY2LDQzOTMsNzUzMiwxNjYwLDI5NDMsIDI0NiwzMzMyLCAzNzgsMTQ1NywgMjI2LDM0MzMsIDk3NSwgICMgNDcyNgozOTE3LDI5NDQsMTI2NCwzNTM3LCA2NzQsIDY5Niw3NTMzLCAxNjMsNzUzNCwxMTQxLDI0MTcsMjE2NiwgNzEzLDM1MzgsMzMzMyw0Mzk0LCAgIyA0NzQyCjM5MTgsNzUzNSw3NTM2LDExODYsICAxNSw3NTM3LDEwNzksMTA3MCw3NTM4LDE1MjIsMzE5MywzNTM5LCAyNzYsMTA1MCwyNzE2LCA3NTgsICAjIDQ3NTgKMTEyNiwgNjUzLDI5NDUsMzI2Myw3NTM5LDIzMzcsIDg4OSwzNTQwLDM5MTksMzA4MSwyOTg5LCA5MDMsMTI1MCw0Mzk1LDM5MjAsMzQzNCwgICMgNDc3NAozNTQxLDEzNDIsMTY4MSwxNzE4LCA3NjYsMzI2NCwgMjg2LCAgODksMjk0NiwzNjQ5LDc1NDAsMTcxMyw3NTQxLDI1OTcsMzMzNCwyOTkwLCAgIyA0NzkwCjc1NDIsMjk0NywyMjE1LDMxOTQsMjg2Niw3NTQzLDQzOTYsMjQ5OCwyNTI2LCAxODEsIDM4NywxMDc1LDM5MjEsIDczMSwyMTg3LDMzMzUsICAjIDQ4MDYKNzU0NCwzMjY1LCAzMTAsIDMxMywzNDM1LDIyOTksIDc3MCw0MTM0LCAgNTQsMzAzNCwgMTg5LDQzOTcsMzA4MiwzNzY5LDM5MjIsNzU0NSwgICMgNDgyMgoxMjMwLDE2MTcsMTg0OSwgMzU1LDM1NDIsNDEzNSw0Mzk4LDMzMzYsIDExMSw0MTM2LDM2NTAsMTM1MCwzMTM1LDM0MzYsMzAzNSw0MTM3LCAgIyA0ODM4CjIxNDksMzI2NiwzNTQzLDc1NDYsMjc4NCwzOTIzLDM5MjQsMjk5MSwgNzIyLDIwMDgsNzU0NywxMDcxLCAyNDcsMTIwNywyMzM4LDI0NzEsICAjIDQ4NTQKMTM3OCw0Mzk5LDIwMDksIDg2NCwxNDM3LDEyMTQsNDQwMCwgMzczLDM3NzAsMTE0MiwyMjE2LCA2NjcsNDQwMSwgNDQyLDI3NTMsMjU1NSwgICMgNDg3MAozNzcxLDM5MjUsMTk2OCw0MTM4LDMyNjcsMTgzOSwgODM3LCAxNzAsMTEwNywgOTM0LDEzMzYsMTg4Miw3NTQ4LDc1NDksMjExOCw0MTM5LCAgIyA0ODg2CjI4MjgsIDc0MywxNTY5LDc1NTAsNDQwMiw0MTQwLCA1ODIsMjM4NCwxNDE4LDM0MzcsNzU1MSwxODAyLDc1NTIsIDM1NywxMzk1LDE3MjksICAjIDQ5MDIKMzY1MSwzMjY4LDI0MTgsMTU2NCwyMjM3LDc1NTMsMzA4MywzNzcyLDE2MzMsNDQwMywxMTE0LDIwODUsNDE0MSwxNTMyLDc1NTQsIDQ4MiwgICMgNDkxOAoyNDQ2LDQ0MDQsNzU1NSw3NTU2LDE0OTIsIDgzMywxNDY2LDc1NTcsMjcxNywzNTQ0LDE2NDEsMjgyOSw3NTU4LDE1MjYsMTI3MiwzNjUyLCAgIyA0OTM0CjQxNDIsMTY4NiwxNzk0LCA0MTYsMjU1NiwxOTAyLDE5NTMsMTgwMyw3NTU5LDM3NzMsMjc4NSwzNzc0LDExNTksMjMxNiw3NTYwLDI4NjcsICAjIDQ5NTAKNDQwNSwxNjEwLDE1ODQsMzAzNiwyNDE5LDI3NTQsIDQ0MywzMjY5LDExNjMsMzEzNiw3NTYxLDc1NjIsMzkyNiw3NTYzLDQxNDMsMjQ5OSwgICMgNDk2NgozMDM3LDQ0MDYsMzkyNywzMTM3LDIxMDMsMTY0NywzNTQ1LDIwMTAsMTg3Miw0MTQ0LDc1NjQsNDE0NSwgNDMxLDM0MzgsNzU2NSwgMjUwLCAgIyA0OTgyCiAgOTcsICA4MSw0MTQ2LDc1NjYsMTY0OCwxODUwLDE1NTgsIDE2MCwgODQ4LDc1NjcsIDg2NiwgNzQwLDE2OTQsNzU2OCwyMjAxLDI4MzAsICAjIDQ5OTgKMzE5NSw0MTQ3LDQ0MDcsMzY1MywxNjg3LCA5NTAsMjQ3MiwgNDI2LCA0NjksMzE5NiwzNjU0LDM2NTUsMzkyOCw3NTY5LDc1NzAsMTE4OCwgICMgNTAxNAogNDI0LDE5OTUsIDg2MSwzNTQ2LDQxNDgsMzc3NSwyMjAyLDI2ODUsIDE2OCwxMjM1LDM1NDcsNDE0OSw3NTcxLDIwODYsMTY3NCw0NDA4LCAgIyA1MDMwCjMzMzcsMzI3MCwgMjIwLDI1NTcsMTAwOSw3NTcyLDM3NzYsIDY3MCwyOTkyLCAzMzIsMTIwOCwgNzE3LDc1NzMsNzU3NCwzNTQ4LDI0NDcsICAjIDUwNDYKMzkyOSwzMzM4LDc1NzUsIDUxMyw3NTc2LDEyMDksMjg2OCwzMzM5LDMxMzgsNDQwOSwxMDgwLDc1NzcsNzU3OCw3NTc5LDc1ODAsMjUyNywgICMgNTA2MgozNjU2LDM1NDksIDgxNSwxNTg3LDM5MzAsMzkzMSw3NTgxLDM1NTAsMzQzOSwzNzc3LDEyNTQsNDQxMCwxMzI4LDMwMzgsMTM5MCwzOTMyLCAgIyA1MDc4CjE3NDEsMzkzMywzNzc4LDM5MzQsNzU4MiwgMjM2LDM3NzksMjQ0OCwzMjcxLDc1ODMsNzU4NCwzNjU3LDM3ODAsMTI3MywzNzgxLDQ0MTEsICAjIDUwOTQKNzU4NSwgMzA4LDc1ODYsNDQxMiwgMjQ1LDQ0MTMsMTg1MSwyNDczLDEzMDcsMjU3NSwgNDMwLCA3MTUsMjEzNiwyNDQ5LDc1ODcsIDI3MCwgICMgNTExMAogMTk5LDI4NjksMzkzNSw3NTg4LDM1NTEsMjcxOCwxNzUzLCA3NjEsMTc1NCwgNzI1LDE2NjEsMTg0MCw0NDE0LDM0NDAsMzY1OCw3NTg5LCAgIyA1MTI2Cjc1OTAsIDU4NywgIDE0LDMyNzIsIDIyNywyNTk4LCAzMjYsIDQ4MCwyMjY1LCA5NDMsMjc1NSwzNTUyLCAyOTEsIDY1MCwxODgzLDc1OTEsICAjIDUxNDIKMTcwMiwxMjI2LCAxMDIsMTU0NywgIDYyLDM0NDEsIDkwNCw0NDE1LDM0NDIsMTE2NCw0MTUwLDc1OTIsNzU5MywxMjI0LDE1NDgsMjc1NiwgICMgNTE1OAogMzkxLCA0OTgsMTQ5Myw3NTk0LDEzODYsMTQxOSw3NTk1LDIwNTUsMTE3Nyw0NDE2LCA4MTMsIDg4MCwxMDgxLDIzNjMsIDU2NiwxMTQ1LCAgIyA1MTc0CjQ0MTcsMjI4NiwxMDAxLDEwMzUsMjU1OCwyNTk5LDIyMzgsIDM5NCwxMjg2LDc1OTYsNzU5NywyMDY4LDc1OTgsICA4NiwxNDk0LDE3MzAsICAjIDUxOTAKMzkzNiwgNDkxLDE1ODgsIDc0NSwgODk3LDI5NDgsIDg0MywzMzQwLDM5MzcsMjc1NywyODcwLDMyNzMsMTc2OCwgOTk4LDIyMTcsMjA2OSwgICMgNTIwNgogMzk3LDE4MjYsMTE5NSwxOTY5LDM2NTksMjk5MywzMzQxLCAyODQsNzU5OSwzNzgyLDI1MDAsMjEzNywyMTE5LDE5MDMsNzYwMCwzOTM4LCAgIyA1MjIyCjIxNTAsMzkzOSw0MTUxLDEwMzYsMzQ0MywxOTA0LCAxMTQsMjU1OSw0MTUyLCAyMDksMTUyNyw3NjAxLDc2MDIsMjk0OSwyODMxLDI2MjUsICAjIDUyMzgKMjM4NSwyNzE5LDMxMzksIDgxMiwyNTYwLDc2MDMsMzI3NCw3NjA0LDE1NTksIDczNywxODg0LDM2NjAsMTIxMCwgODg1LCAgMjgsMjY4NiwgICMgNTI1NAozNTUzLDM3ODMsNzYwNSw0MTUzLDEwMDQsMTc3OSw0NDE4LDc2MDYsIDM0NiwxOTgxLDIyMTgsMjY4Nyw0NDE5LDM3ODQsMTc0MiwgNzk3LCAgIyA1MjcwCjE2NDIsMzk0MCwxOTMzLDEwNzIsMTM4NCwyMTUxLCA4OTYsMzk0MSwzMjc1LDM2NjEsMzE5NywyODcxLDM1NTQsNzYwNywyNTYxLDE5NTgsICAjIDUyODYKNDQyMCwyNDUwLDE3ODUsNzYwOCw3NjA5LDc2MTAsMzk0Miw0MTU0LDEwMDUsMTMwOCwzNjYyLDQxNTUsMjcyMCw0NDIxLDQ0MjIsMTUyOCwgICMgNTMwMgoyNjAwLCAxNjEsMTE3OCw0MTU2LDE5ODIsIDk4Nyw0NDIzLDExMDEsNDE1NywgNjMxLDM5NDMsMTE1NywzMTk4LDI0MjAsMTM0MywxMjQxLCAgIyA1MzE4CjEwMTYsMjIzOSwyNTYyLCAzNzIsIDg3NywyMzM5LDI1MDEsMTE2MCwgNTU1LDE5MzQsIDkxMSwzOTQ0LDc2MTEsIDQ2NiwxMTcwLCAxNjksICAjIDUzMzQKMTA1MSwyOTA3LDI2ODgsMzY2MywyNDc0LDI5OTQsMTE4MiwyMDExLDI1NjMsMTI1MSwyNjI2LDc2MTIsIDk5MiwyMzQwLDM0NDQsMTU0MCwgICMgNTM1MAoyNzIxLDEyMDEsMjA3MCwyNDAxLDE5OTYsMjQ3NSw3NjEzLDQ0MjQsIDUyOCwxOTIyLDIxODgsMTUwMywxODczLDE1NzAsMjM2NCwzMzQyLCAgIyA1MzY2CjMyNzYsNzYxNCwgNTU3LDEwNzMsNzYxNSwxODI3LDM0NDUsMjA4NywyMjY2LDMxNDAsMzAzOSwzMDg0LCA3NjcsMzA4NSwyNzg2LDQ0MjUsICAjIDUzODIKMTAwNiw0MTU4LDQ0MjYsMjM0MSwxMjY3LDIxNzYsMzY2NCwzMTk5LCA3NzgsMzk0NSwzMjAwLDI3MjIsMTU5NywyNjU3LDc2MTYsNDQyNywgICMgNTM5OAo3NjE3LDM0NDYsNzYxOCw3NjE5LDc2MjAsMzI3NywyNjg5LDE0MzMsMzI3OCwgMTMxLCAgOTUsMTUwNCwzOTQ2LCA3MjMsNDE1OSwzMTQxLCAgIyA1NDE0CjE4NDEsMzU1NSwyNzU4LDIxODksMzk0NywyMDI3LDIxMDQsMzY2NSw3NjIxLDI5OTUsMzk0OCwxMjE4LDc2MjIsMzM0MywzMjAxLDM5NDksICAjIDU0MzAKNDE2MCwyNTc2LCAyNDgsMTYzNCwzNzg1LCA5MTIsNzYyMywyODMyLDM2NjYsMzA0MCwzNzg2LCA2NTQsICA1Myw3NjI0LDI5OTYsNzYyNSwgICMgNTQ0NgoxNjg4LDQ0MjgsIDc3NywzNDQ3LDEwMzIsMzk1MCwxNDI1LDc2MjYsIDE5MSwgODIwLDIxMjAsMjgzMywgOTcxLDQ0MjksIDkzMSwzMjAyLCAgIyA1NDYyCiAxMzUsIDY2NCwgNzgzLDM3ODcsMTk5NywgNzcyLDI5MDgsMTkzNSwzOTUxLDM3ODgsNDQzMCwyOTA5LDMyMDMsIDI4MiwyNzIzLCA2NDAsICAjIDU0NzgKMTM3MiwzNDQ4LDExMjcsIDkyMiwgMzI1LDMzNDQsNzYyNyw3NjI4LCA3MTEsMjA0NCw3NjI5LDc2MzAsMzk1MiwyMjE5LDI3ODcsMTkzNiwgICMgNTQ5NAozOTUzLDMzNDUsMjIyMCwyMjUxLDM3ODksMjMwMCw3NjMxLDQ0MzEsMzc5MCwxMjU4LDMyNzksMzk1NCwzMjA0LDIxMzgsMjk1MCwzOTU1LCAgIyA1NTEwCjM5NTYsNzYzMiwyMjIxLCAyNTgsMzIwNSw0NDMyLCAxMDEsMTIyNyw3NjMzLDMyODAsMTc1NSw3NjM0LDEzOTEsMzI4MSw3NjM1LDI5MTAsICAjIDU1MjYKMjA1NiwgODkzLDc2MzYsNzYzNyw3NjM4LDE0MDIsNDE2MSwyMzQyLDc2MzksNzY0MCwzMjA2LDM1NTYsNzY0MSw3NjQyLCA4NzgsMTMyNSwgICMgNTU0MgoxNzgwLDI3ODgsNDQzMywgMjU5LDEzODUsMjU3NywgNzQ0LDExODMsMjI2Nyw0NDM0LDc2NDMsMzk1NywyNTAyLDc2NDQsIDY4NCwxMDI0LCAgIyA1NTU4CjQxNjIsNzY0NSwgNDcyLDM1NTcsMzQ0OSwxMTY1LDMyODIsMzk1OCwzOTU5LCAzMjIsMjE1MiwgODgxLCA0NTUsMTY5NSwxMTUyLDEzNDAsICAjIDU1NzQKIDY2MCwgNTU0LDIxNTMsNDQzNSwxMDU4LDQ0MzYsNDE2MywgODMwLDEwNjUsMzM0NiwzOTYwLDQ0MzcsMTkyMyw3NjQ2LDE3MDMsMTkxOCwgICMgNTU5MAo3NjQ3LCA5MzIsMjI2OCwgMTIyLDc2NDgsNDQzOCwgOTQ3LCA2NzcsNzY0OSwzNzkxLDI2MjcsIDI5NywxOTA1LDE5MjQsMjI2OSw0NDM5LCAgIyA1NjA2CjIzMTcsMzI4Myw3NjUwLDc2NTEsNDE2NCw3NjUyLDQxNjUsICA4NCw0MTY2LCAxMTIsIDk4OSw3NjUzLCA1NDcsMTA1OSwzOTYxLCA3MDEsICAjIDU2MjIKMzU1OCwxMDE5LDc2NTQsNDE2Nyw3NjU1LDM0NTAsIDk0MiwgNjM5LCA0NTcsMjMwMSwyNDUxLCA5OTMsMjk1MSwgNDA3LCA4NTEsIDQ5NCwgICMgNTYzOAo0NDQwLDMzNDcsIDkyNyw3NjU2LDEyMzcsNzY1NywyNDIxLDMzNDgsIDU3Myw0MTY4LCA2ODAsIDkyMSwyOTExLDEyNzksMTg3NCwgMjg1LCAgIyA1NjU0CiA3OTAsMTQ0OCwxOTgzLCA3MTksMjE2Nyw3NjU4LDc2NTksNDQ0MSwzOTYyLDM5NjMsMTY0OSw3NjYwLDE1NDEsIDU2Myw3NjYxLDEwNzcsICAjIDU2NzAKNzY2MiwzMzQ5LDMwNDEsMzQ1MSwgNTExLDI5OTcsMzk2NCwzOTY1LDM2NjcsMzk2NiwxMjY4LDI1NjQsMzM1MCwzMjA3LDQ0NDIsNDQ0MywgICMgNTY4Ngo3NjYzLCA1MzUsMTA0OCwxMjc2LDExODksMjkxMiwyMDI4LDMxNDIsMTQzOCwxMzczLDI4MzQsMjk1MiwxMTM0LDIwMTIsNzY2NCw0MTY5LCAgIyA1NzAyCjEyMzgsMjU3OCwzMDg2LDEyNTksNzY2NSwgNzAwLDc2NjYsMjk1MywzMTQzLDM2NjgsNDE3MCw3NjY3LDQxNzEsMTE0NiwxODc1LDE5MDYsICAjIDU3MTgKNDQ0NCwyNjAxLDM5NjcsIDc4MSwyNDIyLCAxMzIsMTU4OSwgMjAzLCAxNDcsIDI3MywyNzg5LDI0MDIsIDg5OCwxNzg2LDIxNTQsMzk2OCwgICMgNTczNAozOTY5LDc2NjgsMzc5MiwyNzkwLDc2NjksNzY3MCw0NDQ1LDQ0NDYsNzY3MSwzMjA4LDc2NzIsMTYzNSwzNzkzLCA5NjUsNzY3MywxODA0LCAgIyA1NzUwCjI2OTAsMTUxNiwzNTU5LDExMjEsMTA4MiwxMzI5LDMyODQsMzk3MCwxNDQ5LDM3OTQsICA2NSwxMTI4LDI4MzUsMjkxMywyNzU5LDE1OTAsICAjIDU3NjYKMzc5NSw3Njc0LDc2NzUsICAxMiwyNjU4LCAgNDUsIDk3NiwyNTc5LDMxNDQsNDQ0NywgNTE3LDI1MjgsMTAxMywxMDM3LDMyMDksNzY3NiwgICMgNTc4MgozNzk2LDI4MzYsNzY3NywzNzk3LDc2NzgsMzQ1Miw3Njc5LDI2MDIsIDYxNCwxOTk4LDIzMTgsMzc5OCwzMDg3LDI3MjQsMjYyOCw3NjgwLCAgIyA1Nzk4CjI1ODAsNDE3MiwgNTk5LDEyNjksNzY4MSwxODEwLDM2NjksNzY4MiwyNjkxLDMwODgsIDc1OSwxMDYwLCA0ODksMTgwNSwzMzUxLDMyODUsICAjIDU4MTQKMTM1OCw3NjgzLDc2ODQsMjM4NiwxMzg3LDEyMTUsMjYyOSwyMjUyLCA0OTAsNzY4NSw3Njg2LDQxNzMsMTc1OSwyMzg3LDIzNDMsNzY4NywgICMgNTgzMAo0NDQ4LDM3OTksMTkwNywzOTcxLDI2MzAsMTgwNiwzMjEwLDQ0NDksMzQ1MywzMjg2LDI3NjAsMjM0NCwgODc0LDc2ODgsNzY4OSwzNDU0LCAgIyA1ODQ2CjM2NzAsMTg1OCwgIDkxLDI5MTQsMzY3MSwzMDQyLDM4MDAsNDQ1MCw3NjkwLDMxNDUsMzk3MiwyNjU5LDc2OTEsMzQ1NSwxMjAyLDE0MDMsICAjIDU4NjIKMzgwMSwyOTU0LDI1MjksMTUxNywyNTAzLDQ0NTEsMzQ1NiwyNTA0LDc2OTIsNDQ1Miw3NjkzLDI2OTIsMTg4NSwxNDk1LDE3MzEsMzk3MywgICMgNTg3OAoyMzY1LDQ0NTMsNzY5NCwyMDI5LDc2OTUsNzY5NiwzOTc0LDI2OTMsMTIxNiwgMjM3LDI1ODEsNDE3NCwyMzE5LDM5NzUsMzgwMiw0NDU0LCAgIyA1ODk0CjQ0NTUsMjY5NCwzNTYwLDM0NTcsIDQ0NSw0NDU2LDc2OTcsNzY5OCw3Njk5LDc3MDAsMjc2MSwgIDYxLDM5NzYsMzY3MiwxODIyLDM5NzcsICAjIDU5MTAKNzcwMSwgNjg3LDIwNDUsIDkzNSwgOTI1LCA0MDUsMjY2MCwgNzAzLDEwOTYsMTg1OSwyNzI1LDQ0NTcsMzk3OCwxODc2LDEzNjcsMjY5NSwgICMgNTkyNgozMzUyLCA5MTgsMjEwNSwxNzgxLDI0NzYsIDMzNCwzMjg3LDE2MTEsMTA5Myw0NDU4LCA1NjQsMzE0NiwzNDU4LDM2NzMsMzM1MywgOTQ1LCAgIyA1OTQyCjI2MzEsMjA1Nyw0NDU5LDc3MDIsMTkyNSwgODcyLDQxNzUsNzcwMywzNDU5LDI2OTYsMzA4OSwgMzQ5LDQxNzYsMzY3NCwzOTc5LDQ0NjAsICAjIDU5NTgKMzgwMyw0MTc3LDM2NzUsMjE1NSwzOTgwLDQ0NjEsNDQ2Miw0MTc4LDQ0NjMsMjQwMywyMDQ2LCA3ODIsMzk4MSwgNDAwLCAyNTEsNDE3OSwgICMgNTk3NAoxNjI0LDc3MDQsNzcwNSwgMjc3LDM2NzYsIDI5OSwxMjY1LCA0NzYsMTE5MSwzODA0LDIxMjEsNDE4MCw0MTgxLDExMDksIDIwNSw3NzA2LCAgIyA1OTkwCjI1ODIsMTAwMCwyMTU2LDM1NjEsMTg2MCw3NzA3LDc3MDgsNzcwOSw0NDY0LDc3MTAsNDQ2NSwyNTY1LCAxMDcsMjQ3NywyMTU3LDM5ODIsICAjIDYwMDYKMzQ2MCwzMTQ3LDc3MTEsMTUzMywgNTQxLDEzMDEsIDE1OCwgNzUzLDQxODIsMjg3MiwzNTYyLDc3MTIsMTY5NiwgMzcwLDEwODgsNDE4MywgICMgNjAyMgo0NDY2LDM1NjMsIDU3OSwgMzI3LCA0NDAsIDE2MiwyMjQwLCAyNjksMTkzNywxMzc0LDM0NjEsIDk2OCwzMDQzLCAgNTYsMTM5NiwzMDkwLCAgIyA2MDM4CjIxMDYsMzI4OCwzMzU0LDc3MTMsMTkyNiwyMTU4LDQ0NjcsMjk5OCw3NzE0LDM1NjQsNzcxNSw3NzE2LDM2NzcsNDQ2OCwyNDc4LDc3MTcsICAjIDYwNTQKMjc5MSw3NzE4LDE2NTAsNDQ2OSw3NzE5LDI2MDMsNzcyMCw3NzIxLDM5ODMsMjY2MSwzMzU1LDExNDksMzM1NiwzOTg0LDM4MDUsMzk4NSwgICMgNjA3MAo3NzIyLDEwNzYsICA0OSw3NzIzLCA5NTEsMzIxMSwzMjg5LDMyOTAsIDQ1MCwyODM3LCA5MjAsNzcyNCwxODExLDI3OTIsMjM2Niw0MTg0LCAgIyA2MDg2CjE5MDgsMTEzOCwyMzY3LDM4MDYsMzQ2Miw3NzI1LDMyMTIsNDQ3MCwxOTA5LDExNDcsMTUxOCwyNDIzLDQ0NzEsMzgwNyw3NzI2LDQ0NzIsICAjIDYxMDIKMjM4OCwyNjA0LCAyNjAsMTc5NSwzMjEzLDc3MjcsNzcyOCwzODA4LDMyOTEsIDcwOCw3NzI5LDM1NjUsMTcwNCw3NzMwLDM1NjYsMTM1MSwgICMgNjExOAoxNjE4LDMzNTcsMjk5OSwxODg2LCA5NDQsNDE4NSwzMzU4LDQxODYsMzA0NCwzMzU5LDQxODcsNzczMSwzNjc4LCA0MjIsIDQxMywxNzE0LCAgIyA2MTM0CjMyOTIsIDUwMCwyMDU4LDIzNDUsNDE4OCwyNDc5LDc3MzIsMTM0NCwxOTEwLCA5NTQsNzczMywxNjY4LDc3MzQsNzczNSwzOTg2LDI0MDQsICAjIDYxNTAKNDE4OSwzNTY3LDM4MDksNDE5MCw3NzM2LDIzMDIsMTMxOCwyNTA1LDMwOTEsIDEzMywzMDkyLDI4NzMsNDQ3MywgNjI5LCAgMzEsMjgzOCwgICMgNjE2NgoyNjk3LDM4MTAsNDQ3NCwgODUwLCA5NDksNDQ3NSwzOTg3LDI5NTUsMTczMiwyMDg4LDQxOTEsMTQ5NiwxODUyLDc3MzcsMzk4OCwgNjIwLCAgIyA2MTgyCjMyMTQsIDk4MSwxMjQyLDM2NzksMzM2MCwxNjE5LDM2ODAsMTY0MywzMjkzLDIxMzksMjQ1MiwxOTcwLDE3MTksMzQ2MywyMTY4LDc3MzgsICAjIDYxOTgKMzIxNSw3NzM5LDc3NDAsMzM2MSwxODI4LDc3NDEsMTI3Nyw0NDc2LDE1NjUsMjA0Nyw3NzQyLDE2MzYsMzU2OCwzMDkzLDc3NDMsIDg2OSwgICMgNjIxNAoyODM5LCA2NTUsMzgxMSwzODEyLDMwOTQsMzk4OSwzMDAwLDM4MTMsMTMxMCwzNTY5LDQ0NzcsNzc0NCw3NzQ1LDc3NDYsMTczMywgNTU4LCAgIyA2MjMwCjQ0NzgsMzY4MSwgMzM1LDE1NDksMzA0NSwxNzU2LDQxOTIsMzY4MiwxOTQ1LDM0NjQsMTgyOSwxMjkxLDExOTIsIDQ3MCwyNzI2LDIxMDcsICAjIDYyNDYKMjc5MywgOTEzLDEwNTQsMzk5MCw3NzQ3LDEwMjcsNzc0OCwzMDQ2LDM5OTEsNDQ3OSwgOTgyLDI2NjIsMzM2MiwzMTQ4LDM0NjUsMzIxNiwgICMgNjI2MgozMjE3LDE5NDYsMjc5NCw3NzQ5LCA1NzEsNDQ4MCw3NzUwLDE4MzAsNzc1MSwzNTcwLDI1ODMsMTUyMywyNDI0LDc3NTIsMjA4OSwgOTg0LCAgIyA2Mjc4CjQ0ODEsMzY4MywxOTU5LDc3NTMsMzY4NCwgODUyLCA5MjMsMjc5NSwzNDY2LDM2ODUsIDk2OSwxNTE5LCA5OTksMjA0OCwyMzIwLDE3MDUsICAjIDYyOTQKNzc1NCwzMDk1LCA2MTUsMTY2MiwgMTUxLCA1OTcsMzk5MiwyNDA1LDIzMjEsMTA0OSwgMjc1LDQ0ODIsMzY4Niw0MTkzLCA1NjgsMzY4NywgICMgNjMxMAozNTcxLDI0ODAsNDE5NCwzNjg4LDc3NTUsMjQyNSwyMjcwLCA0MDksMzIxOCw3NzU2LDE1NjYsMjg3NCwzNDY3LDEwMDIsIDc2OSwyODQwLCAgIyA2MzI2CiAxOTQsMjA5MCwzMTQ5LDM2ODksMjIyMiwzMjk0LDQxOTUsIDYyOCwxNTA1LDc3NTcsNzc1OCwxNzYzLDIxNzcsMzAwMSwzOTkzLCA1MjEsICAjIDYzNDIKMTE2MSwyNTg0LDE3ODcsMjIwMywyNDA2LDQ0ODMsMzk5NCwxNjI1LDQxOTYsNDE5NywgNDEyLCAgNDIsMzA5NiwgNDY0LDc3NTksMjYzMiwgICMgNjM1OAo0NDg0LDMzNjMsMTc2MCwxNTcxLDI4NzUsMzQ2OCwyNTMwLDEyMTksMjIwNCwzODE0LDI2MzMsMjE0MCwyMzY4LDQ0ODUsNDQ4NiwzMjk1LCAgIyA2Mzc0CjE2NTEsMzM2NCwzNTcyLDc3NjAsNzc2MSwzNTczLDI0ODEsMzQ2OSw3NzYyLDM2OTAsNzc2Myw3NzY0LDIyNzEsMjA5MSwgNDYwLDc3NjUsICAjIDYzOTAKNDQ4Nyw3NzY2LDMwMDIsIDk2MiwgNTg4LDM1NzQsIDI4OSwzMjE5LDI2MzQsMTExNiwgIDUyLDc3NjcsMzA0NywxNzk2LDc3NjgsNzc2OSwgICMgNjQwNgo3NzcwLDE0NjcsNzc3MSwxNTk4LDExNDMsMzY5MSw0MTk4LDE5ODQsMTczNCwxMDY3LDQ0ODgsMTI4MCwzMzY1LCA0NjUsNDQ4OSwxNTcyLCAgIyA2NDIyCiA1MTAsNzc3MiwxOTI3LDIyNDEsMTgxMiwxNjQ0LDM1NzUsNzc3Myw0NDkwLDM2OTIsNzc3NCw3Nzc1LDI2NjMsMTU3MywxNTM0LDc3NzYsICAjIDY0MzgKNzc3Nyw0MTk5LCA1MzYsMTgwNywxNzYxLDM0NzAsMzgxNSwzMTUwLDI2MzUsNzc3OCw3Nzc5LDc3ODAsNDQ5MSwzNDcxLDI5MTUsMTkxMSwgICMgNjQ1NAoyNzk2LDc3ODEsMzI5NiwxMTIyLCAzNzcsMzIyMCw3NzgyLCAzNjAsNzc4Myw3Nzg0LDQyMDAsMTUyOSwgNTUxLDc3ODUsMjA1OSwzNjkzLCAgIyA2NDcwCjE3NjksMjQyNiw3Nzg2LDI5MTYsNDIwMSwzMjk3LDMwOTcsMjMyMiwyMTA4LDIwMzAsNDQ5MiwxNDA0LCAxMzYsMTQ2OCwxNDc5LCA2NzIsICAjIDY0ODYKMTE3MSwzMjIxLDIzMDMsIDI3MSwzMTUxLDc3ODcsMjc2Miw3Nzg4LDIwNDksIDY3OCwyNzI3LCA4NjUsMTk0Nyw0NDkzLDc3ODksMjAxMywgICMgNjUwMgozOTk1LDI5NTYsNzc5MCwyNzI4LDIyMjMsMTM5NywzMDQ4LDM2OTQsNDQ5NCw0NDk1LDE3MzUsMjkxNywzMzY2LDM1NzYsNzc5MSwzODE2LCAgIyA2NTE4CiA1MDksMjg0MSwyNDUzLDI4NzYsMzgxNyw3NzkyLDc3OTMsMzE1MiwzMTUzLDQ0OTYsNDIwMiwyNTMxLDQ0OTcsMjMwNCwxMTY2LDEwMTAsICAjIDY1MzQKIDU1MiwgNjgxLDE4ODcsNzc5NCw3Nzk1LDI5NTcsMjk1OCwzOTk2LDEyODcsMTU5NiwxODYxLDMxNTQsIDM1OCwgNDUzLCA3MzYsIDE3NSwgICMgNjU1MAogNDc4LDExMTcsIDkwNSwxMTY3LDEwOTcsNzc5NiwxODUzLDE1MzAsNzc5NywxNzA2LDc3OTgsMjE3OCwzNDcyLDIyODcsMzY5NSwzNDczLCAgIyA2NTY2CjM1NzcsNDIwMywyMDkyLDQyMDQsNzc5OSwzMzY3LDExOTMsMjQ4Miw0MjA1LDE0NTgsMjE5MCwyMjA1LDE4NjIsMTg4OCwxNDIxLDMyOTgsICAjIDY1ODIKMjkxOCwzMDQ5LDIxNzksMzQ3NCwgNTk1LDIxMjIsNzgwMCwzOTk3LDc4MDEsNzgwMiw0MjA2LDE3MDcsMjYzNiwgMjIzLDM2OTYsMTM1OSwgICMgNjU5OAogNzUxLDMwOTgsIDE4MywzNDc1LDc4MDMsMjc5NywzMDAzLCA0MTksMjM2OSwgNjMzLCA3MDQsMzgxOCwyMzg5LCAyNDEsNzgwNCw3ODA1LCAgIyA2NjE0Cjc4MDYsIDgzOCwzMDA0LDM2OTcsMjI3MiwyNzYzLDI0NTQsMzgxOSwxOTM4LDIwNTAsMzk5OCwxMzA5LDMwOTksMjI0MiwxMTgxLDc4MDcsICAjIDY2MzAKMTEzNiwyMjA2LDM4MjAsMjM3MCwxNDQ2LDQyMDcsMjMwNSw0NDk4LDc4MDgsNzgwOSw0MjA4LDEwNTUsMjYwNSwgNDg0LDM2OTgsNzgxMCwgICMgNjY0NgozOTk5LCA2MjUsNDIwOSwyMjczLDMzNjgsMTQ5OSw0MjEwLDQwMDAsNzgxMSw0MDAxLDQyMTEsMzIyMiwyMjc0LDIyNzUsMzQ3Niw3ODEyLCAgIyA2NjYyCjc4MTMsMjc2NCwgODA4LDI2MDYsMzY5OSwzMzY5LDQwMDIsNDIxMiwzMTAwLDI1MzIsIDUyNiwzMzcwLDM4MjEsNDIxMywgOTU1LDc4MTQsICAjIDY2NzgKMTYyMCw0MjE0LDI2MzcsMjQyNyw3ODE1LDE0MjksMzcwMCwxNjY5LDE4MzEsIDk5NCwgOTI4LDc4MTYsMzU3OCwxMjYwLDc4MTcsNzgxOCwgICMgNjY5NAo3ODE5LDE5NDgsMjI4OCwgNzQxLDI5MTksMTYyNiw0MjE1LDI3MjksMjQ1NSwgODY3LDExODQsIDM2MiwzMzcxLDEzOTIsNzgyMCw3ODIxLCAgIyA2NzEwCjQwMDMsNDIxNiwxNzcwLDE3MzYsMzIyMywyOTIwLDQ0OTksNDUwMCwxOTI4LDI2OTgsMTQ1OSwxMTU4LDc4MjIsMzA1MCwzMzcyLDI4NzcsICAjIDY3MjYKMTI5MiwxOTI5LDI1MDYsMjg0MiwzNzAxLDE5ODUsMTE4NywyMDcxLDIwMTQsMjYwNyw0MjE3LDc4MjMsMjU2NiwyNTA3LDIxNjksMzcwMiwgICMgNjc0MgoyNDgzLDMyOTksNzgyNCwzNzAzLDQ1MDEsNzgyNSw3ODI2LCA2NjYsMTAwMywzMDA1LDEwMjIsMzU3OSw0MjE4LDc4MjcsNDUwMiwxODEzLCAgIyA2NzU4CjIyNTMsIDU3NCwzODIyLDE2MDMsIDI5NSwxNTM1LCA3MDUsMzgyMyw0MjE5LCAyODMsIDg1OCwgNDE3LDc4MjgsNzgyOSwzMjI0LDQ1MDMsICAjIDY3NzQKNDUwNCwzMDUxLDEyMjAsMTg4OSwxMDQ2LDIyNzYsMjQ1Niw0MDA0LDEzOTMsMTU5OSwgNjg5LDI1NjcsIDM4OCw0MjIwLDc4MzAsMjQ4NCwgICMgNjc5MAogODAyLDc4MzEsMjc5OCwzODI0LDIwNjAsMTQwNSwyMjU0LDc4MzIsNDUwNSwzODI1LDIxMDksMTA1MiwxMzQ1LDMyMjUsMTU4NSw3ODMzLCAgIyA2ODA2CiA4MDksNzgzNCw3ODM1LDc4MzYsIDU3NSwyNzMwLDM0NzcsIDk1NiwxNTUyLDE0NjksMTE0NCwyMzIzLDc4MzcsMjMyNCwxNTYwLDI0NTcsICAjIDY4MjIKMzU4MCwzMjI2LDQwMDUsIDYxNiwyMjA3LDMxNTUsMjE4MCwyMjg5LDc4MzgsMTgzMiw3ODM5LDM0NzgsNDUwNiw3ODQwLDEzMTksMzcwNCwgICMgNjgzOAozNzA1LDEyMTEsMzU4MSwxMDIzLDMyMjcsMTI5MywyNzk5LDc4NDEsNzg0Miw3ODQzLDM4MjYsIDYwNywyMzA2LDM4MjcsIDc2MiwyODc4LCAgIyA2ODU0CjE0MzksNDIyMSwxMzYwLDc4NDQsMTQ4NSwzMDUyLDc4NDUsNDUwNywxMDM4LDQyMjIsMTQ1MCwyMDYxLDI2MzgsNDIyMywxMzc5LDQ1MDgsICAjIDY4NzAKMjU4NSw3ODQ2LDc4NDcsNDIyNCwxMzUyLDE0MTQsMjMyNSwyOTIxLDExNzIsNzg0OCw3ODQ5LDM4MjgsMzgyOSw3ODUwLDE3OTcsMTQ1MSwgICMgNjg4Ngo3ODUxLDc4NTIsNzg1Myw3ODU0LDI5MjIsNDAwNiw0MDA3LDI0ODUsMjM0NiwgNDExLDQwMDgsNDAwOSwzNTgyLDMzMDAsMzEwMSw0NTA5LCAgIyA2OTAyCjE1NjEsMjY2NCwxNDUyLDQwMTAsMTM3NSw3ODU1LDc4NTYsICA0NywyOTU5LCAzMTYsNzg1NywxNDA2LDE1OTEsMjkyMywzMTU2LDc4NTgsICAjIDY5MTgKMTAyNSwyMTQxLDMxMDIsMzE1NywgMzU0LDI3MzEsIDg4NCwyMjI0LDQyMjUsMjQwNywgNTA4LDM3MDYsIDcyNiwzNTgzLCA5OTYsMjQyOCwgICMgNjkzNAozNTg0LCA3MjksNzg1OSwgMzkyLDIxOTEsMTQ1Myw0MDExLDQ1MTAsMzcwNyw3ODYwLDc4NjEsMjQ1OCwzNTg1LDI2MDgsMTY3NSwyODAwLCAgIyA2OTUwCiA5MTksMjM0NywyOTYwLDIzNDgsMTI3MCw0NTExLDQwMTIsICA3Myw3ODYyLDc4NjMsIDY0Nyw3ODY0LDMyMjgsMjg0MywyMjU1LDE1NTAsICAjIDY5NjYKMTM0NiwzMDA2LDc4NjUsMTMzMiwgODgzLDM0NzksNzg2Niw3ODY3LDc4NjgsNzg2OSwzMzAxLDI3NjUsNzg3MCwxMjEyLCA4MzEsMTM0NywgICMgNjk4Mgo0MjI2LDQ1MTIsMjMyNiwzODMwLDE4NjMsMzA1MywgNzIwLDM4MzEsNDUxMyw0NTE0LDM4MzIsNzg3MSw0MjI3LDc4NzIsNzg3Myw0NTE1LCAgIyA2OTk4Cjc4NzQsNzg3NSwxNzk4LDQ1MTYsMzcwOCwyNjA5LDQ1MTcsMzU4NiwxNjQ1LDIzNzEsNzg3Niw3ODc3LDI5MjQsIDY2OSwyMjA4LDI2NjUsICAjIDcwMTQKMjQyOSw3ODc4LDI4NzksNzg3OSw3ODgwLDEwMjgsMzIyOSw3ODgxLDQyMjgsMjQwOCw3ODgyLDIyNTYsMTM1Myw3ODgzLDc4ODQsNDUxOCwgICMgNzAzMAozMTU4LCA1MTgsNzg4NSw0MDEzLDc4ODYsNDIyOSwxOTYwLDc4ODcsMjE0Miw0MjMwLDc4ODgsNzg4OSwzMDA3LDIzNDksMjM1MCwzODMzLCAgIyA3MDQ2CiA1MTYsMTgzMywxNDU0LDQwMTQsMjY5OSw0MjMxLDQ1MTksMjIyNSwyNjEwLDE5NzEsMTEyOSwzNTg3LDc4OTAsMjc2Niw3ODkxLDI5NjEsICAjIDcwNjIKMTQyMiwgNTc3LDE0NzAsMzAwOCwxNTI0LDMzNzMsNzg5Miw3ODkzLCA0MzIsNDIzMiwzMDU0LDM0ODAsNzg5NCwyNTg2LDE0NTUsMjUwOCwgICMgNzA3OAoyMjI2LDE5NzIsMTE3NSw3ODk1LDEwMjAsMjczMiw0MDE1LDM0ODEsNDUyMCw3ODk2LDI3MzMsNzg5NywxNzQzLDEzNjEsMzA1NSwzNDgyLCAgIyA3MDk0CjI2MzksNDAxNiw0MjMzLDQ1MjEsMjI5MCwgODk1LCA5MjQsNDIzNCwyMTcwLCAzMzEsMjI0MywzMDU2LCAxNjYsMTYyNywzMDU3LDEwOTgsICAjIDcxMTAKNzg5OCwxMjMyLDI4ODAsMjIyNywzMzc0LDQ1MjIsIDY1NywgNDAzLDExOTYsMjM3MiwgNTQyLDM3MDksMzM3NSwxNjAwLDQyMzUsMzQ4MywgICMgNzEyNgo3ODk5LDQ1MjMsMjc2NywzMjMwLCA1NzYsIDUzMCwxMzYyLDc5MDAsNDUyNCwyNTMzLDI2NjYsMzcxMCw0MDE3LDc5MDEsIDg0MiwzODM0LCAgIyA3MTQyCjc5MDIsMjgwMSwyMDMxLDEwMTQsNDAxOCwgMjEzLDI3MDAsMzM3NiwgNjY1LCA2MjEsNDIzNiw3OTAzLDM3MTEsMjkyNSwyNDMwLDc5MDQsICAjIDcxNTgKMjQzMSwzMzAyLDM1ODgsMzM3Nyw3OTA1LDQyMzcsMjUzNCw0MjM4LDQ1MjUsMzU4OSwxNjgyLDQyMzksMzQ4NCwxMzgwLDc5MDYsIDcyNCwgICMgNzE3NAoyMjc3LCA2MDAsMTY3MCw3OTA3LDEzMzcsMTIzMyw0NTI2LDMxMDMsMjI0NCw3OTA4LDE2MjEsNDUyNyw3OTA5LCA2NTEsNDI0MCw3OTEwLCAgIyA3MTkwCjE2MTIsNDI0MSwyNjExLDc5MTEsMjg0NCw3OTEyLDI3MzQsMjMwNywzMDU4LDc5MTMsIDcxNiwyNDU5LDMwNTksIDE3NCwxMjU1LDI3MDEsICAjIDcyMDYKNDAxOSwzNTkwLCA1NDgsMTMyMCwxMzk4LCA3MjgsNDAyMCwxNTc0LDc5MTQsMTg5MCwxMTk3LDMwNjAsNDAyMSw3OTE1LDMwNjEsMzA2MiwgICMgNzIyMgozNzEyLDM1OTEsMzcxMywgNzQ3LDc5MTYsIDYzNSw0MjQyLDQ1MjgsNzkxNyw3OTE4LDc5MTksNDI0Myw3OTIwLDc5MjEsNDUyOSw3OTIyLCAgIyA3MjM4CjMzNzgsNDUzMCwyNDMyLCA0NTEsNzkyMywzNzE0LDI1MzUsMjA3Miw0MjQ0LDI3MzUsNDI0NSw0MDIyLDc5MjQsMTc2NCw0NTMxLDc5MjUsICAjIDcyNTQKNDI0NiwgMzUwLDc5MjYsMjI3OCwyMzkwLDI0ODYsNzkyNyw0MjQ3LDQwMjMsMjI0NSwxNDM0LDQwMjQsIDQ4OCw0NTMyLCA0NTgsNDI0OCwgICMgNzI3MAo0MDI1LDM3MTUsIDc3MSwxMzMwLDIzOTEsMzgzNSwyNTY4LDMxNTksMjE1OSwyNDA5LDE1NTMsMjY2NywzMTYwLDQyNDksNzkyOCwyNDg3LCAgIyA3Mjg2CjI4ODEsMjYxMiwxNzIwLDI3MDIsNDI1MCwzMzc5LDQ1MzMsNzkyOSwyNTM2LDQyNTEsNzkzMCwzMjMxLDQyNTIsMjc2OCw3OTMxLDIwMTUsICAjIDczMDIKMjczNiw3OTMyLDExNTUsMTAxNywzNzE2LDM4MzYsNzkzMywzMzAzLDIzMDgsIDIwMSwxODY0LDQyNTMsMTQzMCw3OTM0LDQwMjYsNzkzNSwgICMgNzMxOAo3OTM2LDc5MzcsNzkzOCw3OTM5LDQyNTQsMTYwNCw3OTQwLCA0MTQsMTg2NSwgMzcxLDI1ODcsNDUzNCw0NTM1LDM0ODUsMjAxNiwzMTA0LCAgIyA3MzM0CjQ1MzYsMTcwOCwgOTYwLDQyNTUsIDg4NywgMzg5LDIxNzEsMTUzNiwxNjYzLDE3MjEsNzk0MSwyMjI4LDQwMjcsMjM1MSwyOTI2LDE1ODAsICAjIDczNTAKNzk0Miw3OTQzLDc5NDQsMTc0NCw3OTQ1LDI1MzcsNDUzNyw0NTM4LDc5NDYsNDUzOSw3OTQ3LDIwNzMsNzk0OCw3OTQ5LDM1OTIsMzM4MCwgICMgNzM2NgoyODgyLDQyNTYsNzk1MCw0MjU3LDI2NDAsMzM4MSwyODAyLCA2NzMsMjcwMywyNDYwLCA3MDksMzQ4Niw0MDI4LDM1OTMsNDI1OCw3OTUxLCAgIyA3MzgyCjExNDgsIDUwMiwgNjM0LDc5NTIsNzk1MywxMjA0LDQ1NDAsMzU5NCwxNTc1LDQ1NDEsMjYxMywzNzE3LDc5NTQsMzcxOCwzMTA1LCA5NDgsICAjIDczOTgKMzIzMiwgMTIxLDE3NDUsMzgzNywxMTEwLDc5NTUsNDI1OSwzMDYzLDI1MDksMzAwOSw0MDI5LDM3MTksMTE1MSwxNzcxLDM4MzgsMTQ4OCwgICMgNzQxNAo0MDMwLDE5ODYsNzk1NiwyNDMzLDM0ODcsNzk1Nyw3OTU4LDIwOTMsNzk1OSw0MjYwLDM4MzksMTIxMywxNDA3LDI4MDMsIDUzMSwyNzM3LCAgIyA3NDMwCjI1MzgsMzIzMywxMDExLDE1MzcsNzk2MCwyNzY5LDQyNjEsMzEwNiwxMDYxLDc5NjEsMzcyMCwzNzIxLDE4NjYsMjg4Myw3OTYyLDIwMTcsICAjIDc0NDYKIDEyMCw0MjYyLDQyNjMsMjA2MiwzNTk1LDMyMzQsMjMwOSwzODQwLDI2NjgsMzM4MiwxOTU0LDQ1NDIsNzk2Myw3OTY0LDM0ODgsMTA0NywgICMgNzQ2MgoyNzA0LDEyNjYsNzk2NSwxMzY4LDQ1NDMsMjg0NSwgNjQ5LDMzODMsMzg0MSwyNTM5LDI3MzgsMTEwMiwyODQ2LDI2NjksNzk2Niw3OTY3LCAgIyA3NDc4CjE5OTksNzk2OCwxMTExLDM1OTYsMjk2Miw3OTY5LDI0ODgsMzg0MiwzNTk3LDI4MDQsMTg1NCwzMzg0LDM3MjIsNzk3MCw3OTcxLDMzODUsICAjIDc0OTQKMjQxMCwyODg0LDMzMDQsMzIzNSwzNTk4LDc5NzIsMjU2OSw3OTczLDM1OTksMjgwNSw0MDMxLDE0NjAsIDg1Niw3OTc0LDM2MDAsNzk3NSwgICMgNzUxMAoyODg1LDI5NjMsNzk3NiwyODg2LDM4NDMsNzk3Nyw0MjY0LCA2MzIsMjUxMCwgODc1LDM4NDQsMTY5NywzODQ1LDIyOTEsNzk3OCw3OTc5LCAgIyA3NTI2CjQ1NDQsMzAxMCwxMjM5LCA1ODAsNDU0NSw0MjY1LDc5ODAsIDkxNCwgOTM2LDIwNzQsMTE5MCw0MDMyLDEwMzksMjEyMyw3OTgxLDc5ODIsICAjIDc1NDIKNzk4MywzMzg2LDE0NzMsNzk4NCwxMzU0LDQyNjYsMzg0Niw3OTg1LDIxNzIsMzA2NCw0MDMzLCA5MTUsMzMwNSw0MjY3LDQyNjgsMzMwNiwgICMgNzU1OAoxNjA1LDE4MzQsNzk4NiwyNzM5LCAzOTgsMzYwMSw0MjY5LDM4NDcsNDAzNCwgMzI4LDE5MTIsMjg0Nyw0MDM1LDM4NDgsMTMzMSw0MjcwLCAgIyA3NTc0CjMwMTEsIDkzNyw0MjcxLDc5ODcsMzYwMiw0MDM2LDQwMzcsMzM4NywyMTYwLDQ1NDYsMzM4OCwgNTI0LCA3NDIsIDUzOCwzMDY1LDEwMTIsICAjIDc1OTAKNzk4OCw3OTg5LDM4NDksMjQ2MSw3OTkwLCA2NTgsMTEwMywgMjI1LDM4NTAsNzk5MSw3OTkyLDQ1NDcsNzk5Myw0NTQ4LDc5OTQsMzIzNiwgICMgNzYwNgoxMjQzLDc5OTUsNDAzOCwgOTYzLDIyNDYsNDU0OSw3OTk2LDI3MDUsMzYwMywzMTYxLDc5OTcsNzk5OCwyNTg4LDIzMjcsNzk5OSw0NTUwLCAgIyA3NjIyCjgwMDAsODAwMSw4MDAyLDM0ODksMzMwNywgOTU3LDMzODksMjU0MCwyMDMyLDE5MzAsMjkyNywyNDYyLCA4NzAsMjAxOCwzNjA0LDE3NDYsICAjIDc2MzgKMjc3MCwyNzcxLDI0MzQsMjQ2Myw4MDAzLDM4NTEsODAwNCwzNzIzLDMxMDcsMzcyNCwzNDkwLDMzOTAsMzcyNSw4MDA1LDExNzksMzA2NiwgICMgNzY1NAo4MDA2LDMxNjIsMjM3Myw0MjcyLDM3MjYsMjU0MSwzMTYzLDMxMDgsMjc0MCw0MDM5LDgwMDcsMzM5MSwxNTU2LDI1NDIsMjI5MiwgOTc3LCAgIyA3NjcwCjI4ODcsMjAzMyw0MDQwLDEyMDUsMzM5Miw4MDA4LDE3NjUsMzM5MywzMTY0LDIxMjQsMTI3MSwxNjg5LCA3MTQsNDU1MSwzNDkxLDgwMDksICAjIDc2ODYKMjMyOCwzODUyLCA1MzMsNDI3MywzNjA1LDIxODEsIDYxNyw4MDEwLDI0NjQsMzMwOCwzNDkyLDIzMTAsODAxMSw4MDEyLDMxNjUsODAxMywgICMgNzcwMgo4MDE0LDM4NTMsMTk4NywgNjE4LCA0MjcsMjY0MSwzNDkzLDMzOTQsODAxNSw4MDE2LDEyNDQsMTY5MCw4MDE3LDI4MDYsNDI3NCw0NTUyLCAgIyA3NzE4CjgwMTgsMzQ5NCw4MDE5LDgwMjAsMjI3OSwxNTc2LCA0NzMsMzYwNiw0Mjc1LDMzOTUsIDk3Miw4MDIxLDM2MDcsODAyMiwzMDY3LDgwMjMsICAjIDc3MzQKODAyNCw0NTUzLDQ1NTQsODAyNSwzNzI3LDQwNDEsNDA0Miw4MDI2LCAxNTMsNDU1NSwgMzU2LDgwMjcsMTg5MSwyODg4LDQyNzYsMjE0MywgICMgNzc1MAogNDA4LCA4MDMsMjM1Miw4MDI4LDM4NTQsODAyOSw0Mjc3LDE2NDYsMjU3MCwyNTExLDQ1NTYsNDU1NywzODU1LDgwMzAsMzg1Niw0Mjc4LCAgIyA3NzY2CjgwMzEsMjQxMSwzMzk2LCA3NTIsODAzMiw4MDMzLDE5NjEsMjk2NCw4MDM0LCA3NDYsMzAxMiwyNDY1LDgwMzUsNDI3OSwzNzI4LCA2OTgsICAjIDc3ODIKNDU1OCwxODkyLDQyODAsMzYwOCwyNTQzLDQ1NTksMzYwOSwzODU3LDgwMzYsMzE2NiwzMzk3LDgwMzcsMTgyMywxMzAyLDQwNDMsMjcwNiwgICMgNzc5OAozODU4LDE5NzMsNDI4MSw4MDM4LDQyODIsMzE2NywgODIzLDEzMDMsMTI4OCwxMjM2LDI4NDgsMzQ5NSw0MDQ0LDMzOTgsIDc3NCwzODU5LCAgIyA3ODE0CjgwMzksMTU4MSw0NTYwLDEzMDQsMjg0OSwzODYwLDQ1NjEsODA0MCwyNDM1LDIxNjEsMTA4MywzMjM3LDQyODMsNDA0NSw0Mjg0LCAzNDQsICAjIDc4MzAKMTE3MywgMjg4LDIzMTEsIDQ1NCwxNjgzLDgwNDEsODA0MiwxNDYxLDQ1NjIsNDA0NiwyNTg5LDgwNDMsODA0NCw0NTYzLCA5ODUsIDg5NCwgICMgNzg0Ngo4MDQ1LDMzOTksMzE2OCw4MDQ2LDE5MTMsMjkyOCwzNzI5LDE5ODgsODA0NywyMTEwLDE5NzQsODA0OCw0MDQ3LDgwNDksMjU3MSwxMTk0LCAgIyA3ODYyCiA0MjUsODA1MCw0NTY0LDMxNjksMTI0NSwzNzMwLDQyODUsODA1MSw4MDUyLDI4NTAsODA1MywgNjM2LDQ1NjUsMTg1NSwzODYxLCA3NjAsICAjIDc4NzgKMTc5OSw4MDU0LDQyODYsMjIwOSwxNTA4LDQ1NjYsNDA0OCwxODkzLDE2ODQsMjI5Myw4MDU1LDgwNTYsODA1Nyw0Mjg3LDQyODgsMjIxMCwgICMgNzg5NAogNDc5LDgwNTgsODA1OSwgODMyLDgwNjAsNDA0OSwyNDg5LDgwNjEsMjk2NSwyNDkwLDM3MzEsIDk5MCwzMTA5LCA2MjcsMTgxNCwyNjQyLCAgIyA3OTEwCjQyODksMTU4Miw0MjkwLDIxMjUsMjExMSwzNDk2LDQ1NjcsODA2MiwgNzk5LDQyOTEsMzE3MCw4MDYzLDQ1NjgsMjExMiwxNzM3LDMwMTMsICAjIDc5MjYKMTAxOCwgNTQzLCA3NTQsNDI5MiwzMzA5LDE2NzYsNDU2OSw0NTcwLDQwNTAsODA2NCwxNDg5LDgwNjUsMzQ5Nyw4MDY2LDI2MTQsMjg4OSwgICMgNzk0Mgo0MDUxLDgwNjcsODA2OCwyOTY2LDgwNjksODA3MCw4MDcxLDgwNzIsMzE3MSw0NTcxLDQ1NzIsMjE4MiwxNzIyLDgwNzMsMzIzOCwzMjM5LCAgIyA3OTU4CjE4NDIsMzYxMCwxNzE1LCA0ODEsIDM2NSwxOTc1LDE4NTYsODA3NCw4MDc1LDE5NjIsMjQ5MSw0NTczLDgwNzYsMjEyNiwzNjExLDMyNDAsICAjIDc5NzQKIDQzMywxODk0LDIwNjMsMjA3NSw4MDc3LCA2MDIsMjc0MSw4MDc4LDgwNzksODA4MCw4MDgxLDgwODIsMzAxNCwxNjI4LDM0MDAsODA4MywgICMgNzk5MAozMTcyLDQ1NzQsNDA1MiwyODkwLDQ1NzUsMjUxMiw4MDg0LDI1NDQsMjc3Miw4MDg1LDgwODYsODA4NywzMzEwLDQ1NzYsMjg5MSw4MDg4LCAgIyA4MDA2CjQ1NzcsODA4OSwyODUxLDQ1NzgsNDU3OSwxMjIxLDI5NjcsNDA1MywyNTEzLDgwOTAsODA5MSw4MDkyLDE4NjcsMTk4OSw4MDkzLDgwOTQsICAjIDgwMjIKODA5NSwxODk1LDgwOTYsODA5Nyw0NTgwLDE4OTYsNDA1NCwgMzE4LDgwOTgsMjA5NCw0MDU1LDQyOTMsODA5OSw4MTAwLCA0ODUsODEwMSwgICMgODAzOAogOTM4LDM4NjIsIDU1MywyNjcwLCAxMTYsODEwMiwzODYzLDM2MTIsODEwMywzNDk4LDI2NzEsMjc3MywzNDAxLDMzMTEsMjgwNyw4MTA0LCAgIyA4MDU0CjM2MTMsMjkyOSw0MDU2LDE3NDcsMjkzMCwyOTY4LDgxMDUsODEwNiwgMjA3LDgxMDcsODEwOCwyNjcyLDQ1ODEsMjUxNCw4MTA5LDMwMTUsICAjIDgwNzAKIDg5MCwzNjE0LDM4NjQsODExMCwxODc3LDM3MzIsMzQwMiw4MTExLDIxODMsMjM1MywzNDAzLDE2NTIsODExMiw4MTEzLDgxMTQsIDk0MSwgICMgODA4NgoyMjk0LCAyMDgsMzQ5OSw0MDU3LDIwMTksIDMzMCw0Mjk0LDM4NjUsMjg5MiwyNDkyLDM3MzMsNDI5NSw4MTE1LDgxMTYsODExNyw4MTE4LCAgIyA4MTAyCikKClBLAwQUAAAAAAAAACEAoEGNGNMGAADTBgAAPwAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9ldWN0d3Byb2Jlci5weSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBCRUdJTiBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFRoZSBPcmlnaW5hbCBDb2RlIGlzIG1vemlsbGEub3JnIGNvZGUuCiMKIyBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKIyBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi4KIyBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAxOTk4CiMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgojCiMgQ29udHJpYnV0b3Iocyk6CiMgICBNYXJrIFBpbGdyaW0gLSBwb3J0IHRvIFB5dGhvbgojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKIyAwMjExMC0xMzAxICBVU0EKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFTkQgTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpmcm9tIC5tYmNoYXJzZXRwcm9iZXIgaW1wb3J0IE11bHRpQnl0ZUNoYXJTZXRQcm9iZXIKZnJvbSAuY29kaW5nc3RhdGVtYWNoaW5lIGltcG9ydCBDb2RpbmdTdGF0ZU1hY2hpbmUKZnJvbSAuY2hhcmRpc3RyaWJ1dGlvbiBpbXBvcnQgRVVDVFdEaXN0cmlidXRpb25BbmFseXNpcwpmcm9tIC5tYmNzc20gaW1wb3J0IEVVQ1RXX1NNX01PREVMCgpjbGFzcyBFVUNUV1Byb2JlcihNdWx0aUJ5dGVDaGFyU2V0UHJvYmVyKToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzdXBlcihFVUNUV1Byb2Jlciwgc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYuY29kaW5nX3NtID0gQ29kaW5nU3RhdGVNYWNoaW5lKEVVQ1RXX1NNX01PREVMKQogICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uX2FuYWx5emVyID0gRVVDVFdEaXN0cmlidXRpb25BbmFseXNpcygpCiAgICAgICAgc2VsZi5yZXNldCgpCgogICAgQHByb3BlcnR5CiAgICBkZWYgY2hhcnNldF9uYW1lKHNlbGYpOgogICAgICAgIHJldHVybiAiRVVDLVRXIgoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGxhbmd1YWdlKHNlbGYpOgogICAgICAgIHJldHVybiAiVGFpd2FuIgpQSwMEFAAAAAAAAAAhABlF0tfrUAAA61AAAD4AAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvZ2IyMzEyZnJlcS5weSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBCRUdJTiBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFRoZSBPcmlnaW5hbCBDb2RlIGlzIE1vemlsbGEgQ29tbXVuaWNhdG9yIGNsaWVudCBjb2RlLgojCiMgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiMgTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24uCiMgUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMTk5OAojIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIwojIENvbnRyaWJ1dG9yKHMpOgojICAgTWFyayBQaWxncmltIC0gcG9ydCB0byBQeXRob24KIwojIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCiMgMDIxMTAtMTMwMSAgVVNBCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRU5EIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKIyBHQjIzMTIgbW9zdCBmcmVxdWVudGx5IHVzZWQgY2hhcmFjdGVyIHRhYmxlCiMKIyBDaGFyIHRvIEZyZXFPcmRlciB0YWJsZSAsIGZyb20gaHo2NzYzCgojIDUxMiAgLS0+IDAuNzkgIC0tIDAuNzkKIyAxMDI0IC0tPiAwLjkyICAtLSAwLjEzCiMgMjA0OCAtLT4gMC45OCAgLS0gMC4wNgojIDY3NjggLS0+IDEuMDAgIC0tIDAuMDIKIwojIElkZWFsIERpc3RyaWJ1dGlvbiBSYXRpbyA9IDAuNzkxMzUvKDEtMC43OTEzNSkgPSAzLjc5CiMgUmFuZG9tIERpc3RyaWJ1dGlvbiBSYXRpb24gPSA1MTIgLyAoMzc1NSAtIDUxMikgPSAwLjE1NwojCiMgVHlwaWNhbCBEaXN0cmlidXRpb24gUmF0aW8gYWJvdXQgMjUlIG9mIElkZWFsIG9uZSwgc3RpbGwgbXVjaCBoaWdoZXIgdGhhdCBSRFIKCkdCMjMxMl9UWVBJQ0FMX0RJU1RSSUJVVElPTl9SQVRJTyA9IDAuOQoKR0IyMzEyX1RBQkxFX1NJWkUgPSAzNzYwCgpHQjIzMTJfQ0hBUl9UT19GUkVRX09SREVSID0gKAoxNjcxLCA3NDksMTQ0MywyMzY0LDM5MjQsMzgwNywyMzMwLDM5MjEsMTcwNCwzNDYzLDI2OTEsMTUxMSwxNTE1LCA1NzIsMzE5MSwyMjA1LAoyMzYxLCAyMjQsMjU1OCwgNDc5LDE3MTEsIDk2MywzMTYyLCA0NDAsNDA2MCwxOTA1LDI5NjYsMjk0NywzNTgwLDI2NDcsMzk2MSwzODQyLAoyMjA0LCA4NjksNDIwNywgOTcwLDI2NzgsNTYyNiwyOTQ0LDI5NTYsMTQ3OSw0MDQ4LCA1MTQsMzU5NSwgNTg4LDEzNDYsMjgyMCwzNDA5LAogMjQ5LDQwODgsMTc0NiwxODczLDIwNDcsMTc3NCwgNTgxLDE4MTMsIDM1OCwxMTc0LDM1OTAsMTAxNCwxNTYxLDQ4NDQsMjI0NSwgNjcwLAoxNjM2LDMxMTIsIDg4OSwxMjg2LCA5NTMsIDU1NiwyMzI3LDMwNjAsMTI5MCwzMTQxLCA2MTMsIDE4NSwzNDc3LDEzNjcsIDg1MCwzODIwLAoxNzE1LDI0MjgsMjY0MiwyMzAzLDI3MzIsMzA0MSwyNTYyLDI2NDgsMzU2NiwzOTQ2LDEzNDksIDM4OCwzMDk4LDIwOTEsMTM2MCwzNTg1LAogMTUyLDE2ODcsMTUzOSwgNzM4LDE1NTksICA1OSwxMjMyLDI5MjUsMjI2NywxMzg4LDEyNDksMTc0MSwxNjc5LDI5NjAsIDE1MSwxNTY2LAoxMTI1LDEzNTIsNDI3MSwgOTI0LDQyOTYsIDM4NSwzMTY2LDQ0NTksIDMxMCwxMjQ1LDI4NTAsICA3MCwzMjg1LDI3MjksMzUzNCwzNTc1LAoyMzk4LDMyOTgsMzQ2NiwxOTYwLDIyNjUsIDIxNywzNjQ3LCA4NjQsMTkwOSwyMDg0LDQ0MDEsMjc3MywxMDEwLDMyNjksNTE1MiwgODUzLAozMDUxLDMxMjEsMTI0NCw0MjUxLDE4OTUsIDM2NCwxNDk5LDE1NDAsMjMxMywxMTgwLDM2NTUsMjI2OCwgNTYyLCA3MTUsMjQxNywzMDYxLAogNTQ0LCAzMzYsMzc2OCwyMzgwLDE3NTIsNDA3NSwgOTUwLCAyODAsMjQyNSw0MzgyLCAxODMsMjc1OSwzMjcyLCAzMzMsNDI5NywyMTU1LAoxNjg4LDIzNTYsMTQ0NCwxMDM5LDQ1NDAsIDczNiwxMTc3LDMzNDksMjQ0MywyMzY4LDIxNDQsMjIyNSwgNTY1LCAxOTYsMTQ4MiwzNDA2LAogOTI3LDEzMzUsNDE0NywgNjkyLCA4NzgsMTMxMSwxNjUzLDM5MTEsMzYyMiwxMzc4LDQyMDAsMTg0MCwyOTY5LDMxNDksMjEyNiwxODE2LAoyNTM0LDE1NDYsMjM5MywyNzYwLCA3MzcsMjQ5NCwgIDEzLCA0NDcsIDI0NSwyNzQ3LCAgMzgsMjc2NSwyMTI5LDI1ODksMTA3OSwgNjA2LAogMzYwLCA0NzEsMzc1NSwyODkwLCA0MDQsIDg0OCwgNjk5LDE3ODUsMTIzNiwgMzcwLDIyMjEsMTAyMywzNzQ2LDIwNzQsMjAyNiwyMDIzLAoyMzg4LDE1ODEsMjExOSwgODEyLDExNDEsMzA5MSwyNTM2LDE1MTksIDgwNCwyMDUzLCA0MDYsMTU5NiwxMDkwLCA3ODQsIDU0OCw0NDE0LAoxODA2LDIyNjQsMjkzNiwxMTAwLCAzNDMsNDExNCw1MDk2LCA2MjIsMzM1OCwgNzQzLDM2NjgsMTUxMCwxNjI2LDUwMjAsMzU2NywyNTEzLAozMTk1LDQxMTUsNTYyNywyNDg5LDI5OTEsICAyNCwyMDY1LDI2OTcsMTA4NywyNzE5LCAgNDgsMTYzNCwgMzE1LCAgNjgsIDk4NSwyMDUyLAogMTk4LDIyMzksMTM0NywxMTA3LDE0MzksIDU5NywyMzY2LDIxNzIsIDg3MSwzMzA3LCA5MTksMjQ4NywyNzkwLDE4NjcsIDIzNiwyNTcwLAoxNDEzLDM3OTQsIDkwNiwzMzY1LDMzODEsMTcwMSwxOTgyLDE4MTgsMTUyNCwyOTI0LDEyMDUsIDYxNiwyNTg2LDIwNzIsMjAwNCwgNTc1LAogMjUzLDMwOTksICAzMiwxMzY1LDExODIsIDE5NywxNzE0LDI0NTQsMTIwMSwgNTU0LDMzODgsMzIyNCwyNzQ4LCA3NTYsMjU4NywgMjUwLAoyNTY3LDE1MDcsMTUxNywzNTI5LDE5MjIsMjc2MSwyMzM3LDM0MTYsMTk2MSwxNjc3LDI0NTIsMjIzOCwzMTUzLCA2MTUsIDkxMSwxNTA2LAoxNDc0LDI0OTUsMTI2NSwxOTA2LDI3NDksMzc1NiwzMjgwLDIxNjEsIDg5OCwyNzE0LDE3NTksMzQ1MCwyMjQzLDI0NDQsIDU2MywgIDI2LAozMjg2LDIyNjYsMzc2OSwzMzQ0LDI3MDcsMzY3NywgNjExLDE0MDIsIDUzMSwxMDI4LDI4NzEsNDU0OCwxMzc1LCAyNjEsMjk0OCwgODM1LAoxMTkwLDQxMzQsIDM1MywgODQwLDI2ODQsMTkwMCwzMDgyLDE0MzUsMjEwOSwxMjA3LDE2NzQsIDMyOSwxODcyLDI3ODEsNDA1NSwyNjg2LAoyMTA0LCA2MDgsMzMxOCwyNDIzLDI5NTcsMjc2OCwxMTA4LDM3MzksMzUxMiwzMjcxLDM5ODUsMjIwMywxNzcxLDM1MjAsMTQxOCwyMDU0LAoxNjgxLDExNTMsIDIyNSwxNjI3LDI5MjksIDE2MiwyMDUwLDI1MTEsMzY4NywxOTU0LCAxMjQsMTg1OSwyNDMxLDE2ODQsMzAzMiwyODk0LAogNTg1LDQ4MDUsMzk2OSwyODY5LDI3MDQsMjA4OCwyMDMyLDIwOTUsMzY1NiwyNjM1LDQzNjIsMjIwOSwgMjU2LCA1MTgsMjA0MiwyMTA1LAozNzc3LDM2NTcsIDY0MywyMjk4LDExNDgsMTc3OSwgMTkwLCA5ODksMzU0NCwgNDE0LCAgMTEsMjEzNSwyMDYzLDI5NzksMTQ3MSwgNDAzLAozNjc4LCAxMjYsIDc3MCwxNTYzLCA2NzEsMjQ5OSwzMjE2LDI4NzcsIDYwMCwxMTc5LCAzMDcsMjgwNSw0OTM3LDEyNjgsMTI5NywyNjk0LAogMjUyLDQwMzIsMTQ0OCwxNDk0LDEzMzEsMTM5NCwgMTI3LDIyNTYsIDIyMiwxNjQ3LDEwMzUsMTQ4MSwzMDU2LDE5MTUsMTA0OCwgODczLAozNjUxLCAyMTAsICAzMywxNjA4LDI1MTYsIDIwMCwxNTIwLCA0MTUsIDEwMiwgICAwLDMzODksMTI4NywgODE3LCAgOTEsMzI5OSwyOTQwLAogODM2LDE4MTQsIDU0OSwyMTk3LDEzOTYsMTY2OSwyOTg3LDM1ODIsMjI5NywyODQ4LDQ1MjgsMTA3MCwgNjg3LCAgMjAsMTgxOSwgMTIxLAoxNTUyLDEzNjQsMTQ2MSwxOTY4LDI2MTcsMzU0MCwyODI0LDIwODMsIDE3NywgOTQ4LDQ5MzgsMjI5MSwgMTEwLDQ1NDksMjA2NiwgNjQ4LAozMzU5LDE3NTUsMjExMCwyMTE0LDQ2NDIsNDg0NSwxNjkzLDM5MzcsMzMwOCwxMjU3LDE4NjksMjEyMywgMjA4LDE4MDQsMzE1OSwyOTkyLAoyNTMxLDI1NDksMzM2MSwyNDE4LDEzNTAsMjM0NywyODAwLDI1NjgsMTI5MSwyMDM2LDI2ODAsICA3MiwgODQyLDE5OTAsIDIxMiwxMjMzLAoxMTU0LDE1ODYsICA3NSwyMDI3LDM0MTAsNDkwMCwxODIzLDEzMzcsMjcxMCwyNjc2LCA3MjgsMjgxMCwxNTIyLDMwMjYsNDk5NSwgMTU3LAogNzU1LDEwNTAsNDAyMiwgNzEwLCA3ODUsMTkzNiwyMTk0LDIwODUsMTQwNiwyNzc3LDI0MDAsIDE1MCwxMjUwLDQwNDksMTIwNiwgODA3LAoxOTEwLCA1MzQsIDUyOSwzMzA5LDE3MjEsMTY2MCwgMjc0LCAgMzksMjgyNywgNjYxLDI2NzAsMTU3OCwgOTI1LDMyNDgsMzgxNSwxMDk0LAo0Mjc4LDQ5MDEsNDI1MiwgIDQxLDExNTAsMzc0NywyNTcyLDIyMjcsNDUwMSwzNjU4LDQ5MDIsMzgxMywzMzU3LDM2MTcsMjg4NCwyMjU4LAogODg3LCA1MzgsNDE4NywzMTk5LDEyOTQsMjQzOSwzMDQyLDIzMjksMjM0MywyNDk3LDEyNTUsIDEwNywgNTQzLDE1MjcsIDUyMSwzNDc4LAozNTY4LCAxOTQsNTA2MiwgIDE1LCA5NjEsMzg3MCwxMjQxLDExOTIsMjY2NCwgIDY2LDUyMTUsMzI2MCwyMTExLDEyOTUsMTEyNywyMTUyLAozODA1LDQxMzUsIDkwMSwxMTY0LDE5NzYsIDM5OCwxMjc4LCA1MzAsMTQ2MCwgNzQ4LCA5MDQsMTA1NCwxOTY2LDE0MjYsICA1MywyOTA5LAogNTA5LCA1MjMsMjI3OSwxNTM0LCA1MzYsMTAxOSwgMjM5LDE2ODUsIDQ2MCwyMzUzLCA2NzMsMTA2NSwyNDAxLDM2MDAsNDI5OCwyMjcyLAoxMjcyLDIzNjMsIDI4NCwxNzUzLDM2NzksNDA2NCwxNjk1LCAgODEsIDgxNSwyNjc3LDI3NTcsMjczMSwxMzg2LCA4NTksIDUwMCw0MjIxLAoyMTkwLDI1NjYsIDc1NywxMDA2LDI1MTksMjA2OCwxMTY2LDE0NTUsIDMzNywyNjU0LDMyMDMsMTg2MywxNjgyLDE5MTQsMzAyNSwxMjUyLAoxNDA5LDEzNjYsIDg0NywgNzE0LDI4MzQsMjAzOCwzMjA5LCA5NjQsMjk3MCwxOTAxLCA4ODUsMjU1MywxMDc4LDE3NTYsMzA0OSwgMzAxLAoxNTcyLDMzMjYsIDY4OCwyMTMwLDE5OTYsMjQyOSwxODA1LDE2NDgsMjkzMCwzNDIxLDI3NTAsMzY1MiwzMDg4LCAyNjIsMTE1OCwxMjU0LAogMzg5LDE2NDEsMTgxMiwgNTI2LDE3MTksIDkyMywyMDczLDEwNzMsMTkwMiwgNDY4LCA0ODksNDYyNSwxMTQwLCA4NTcsMjM3NSwzMDcwLAozMzE5LDI4NjMsIDM4MCwgMTE2LDEzMjgsMjY5MywxMTYxLDIyNDQsIDI3MywxMjEyLDE4ODQsMjc2OSwzMDExLDE3NzUsMTE0MiwgNDYxLAozMDY2LDEyMDAsMjE0NywyMjEyLCA3OTAsIDcwMiwyNjk1LDQyMjIsMTYwMSwxMDU4LCA0MzQsMjMzOCw1MTUzLDM2NDAsICA2NywyMzYwLAo0MDk5LDI1MDIsIDYxOCwzNDcyLDEzMjksIDQxNiwxMTMyLCA4MzAsMjc4MiwxODA3LDI2NTMsMzIxMSwzNTEwLDE2NjIsIDE5MiwyMTI0LAogMjk2LDM5NzksMTczOSwxNjExLDM2ODQsICAyMywgMTE4LCAzMjQsIDQ0NiwxMjM5LDEyMjUsIDI5MywyNTIwLDM4MTQsMzc5NSwyNTM1LAozMTE2LCAgMTcsMTA3NCwgNDY3LDI2OTIsMjIwMSwgMzg3LDI5MjIsICA0NSwxMzI2LDMwNTUsMTY0NSwzNjU5LDI4MTcsIDk1OCwgMjQzLAoxOTAzLDIzMjAsMTMzOSwyODI1LDE3ODQsMzI4OSwgMzU2LCA1NzYsIDg2NSwyMzE1LDIzODEsMzM3NywzOTE2LDEwODgsMzEyMiwxNzEzLAoxNjU1LCA5MzUsIDYyOCw0Njg5LDEwMzQsMTMyNywgNDQxLCA4MDAsIDcyMCwgODk0LDE5NzksMjE4MywxNTI4LDUyODksMjcwMiwxMDcxLAo0MDQ2LDM1NzIsMjM5OSwxNTcxLDMyODEsICA3OSwgNzYxLDExMDMsIDMyNywgMTM0LCA3NTgsMTg5OSwxMzcxLDE2MTUsIDg3OSwgNDQyLAogMjE1LDI2MDUsMjU3OSwgMTczLDIwNDgsMjQ4NSwxMDU3LDI5NzUsMzMxNywxMDk3LDIyNTMsMzgwMSw0MjYzLDE0MDMsMTY1MCwyOTQ2LAogODE0LDQ5NjgsMzQ4NywxNTQ4LDI2NDQsMTU2NywxMjg1LCAgIDIsIDI5NSwyNjM2LCAgOTcsIDk0NiwzNTc2LCA4MzIsIDE0MSw0MjU3LAozMjczLCA3NjAsMzgyMSwzNTIxLDMxNTYsMjYwNywgOTQ5LDEwMjQsMTczMywxNTE2LDE4MDMsMTkyMCwyMTI1LDIyODMsMjY2NSwzMTgwLAoxNTAxLDIwNjQsMzU2MCwyMTcxLDE1OTIsIDgwMywzNTE4LDE0MTYsIDczMiwzODk3LDQyNTgsMTM2MywxMzYyLDI0NTgsIDExOSwxNDI3LAogNjAyLDE1MjUsMjYwOCwxNjA1LDE2MzksMzE3NSwgNjk0LDMwNjQsICAxMCwgNDY1LCAgNzYsMjAwMCw0ODQ2LDQyMDgsIDQ0NCwzNzgxLAoxNjE5LDMzNTMsMjIwNiwxMjczLDM3OTYsIDc0MCwyNDgzLCAzMjAsMTcyMywyMzc3LDM2NjAsMjYxOSwxMzU5LDExMzcsMTc2MiwxNzI0LAoyMzQ1LDI4NDIsMTg1MCwxODYyLCA5MTIsIDgyMSwxODY2LCA2MTIsMjYyNSwxNzM1LDI1NzMsMzM2OSwxMDkzLCA4NDQsICA4OSwgOTM3LAogOTMwLDE0MjQsMzU2NCwyNDEzLDI5NzIsMTAwNCwzMDQ2LDMwMTksMjAxMSwgNzExLDMxNzEsMTQ1Miw0MTc4LCA0MjgsIDgwMSwxOTQzLAogNDMyLCA0NDUsMjgxMSwgMjA2LDQxMzYsMTQ3MiwgNzMwLCAzNDksICA3MywgMzk3LDI4MDIsMjU0NywgOTk4LDE2MzcsMTE2NywgNzg5LAogMzk2LDMyMTcsIDE1NCwxMjE4LCA3MTYsMTEyMCwxNzgwLDI4MTksNDgyNiwxOTMxLDMzMzQsMzc2MiwyMTM5LDEyMTUsMjYyNywgNTUyLAozNjY0LDM2MjgsMzIzMiwxNDA1LDIzODMsMzExMSwxMzU2LDI2NTIsMzU3NywzMzIwLDMxMDEsMTcwMywgNjQwLDEwNDUsMTM3MCwxMjQ2LAo0OTk2LCAzNzEsMTU3NSwyNDM2LDE2MjEsMjIxMCwgOTg0LDQwMzMsMTczNCwyNjM4LCAgMTYsNDUyOSwgNjYzLDI3NTUsMzI1NSwxNDUxLAozOTE3LDIyNTcsMTI1MywxOTU1LDIyMzQsMTI2MywyOTUxLCAyMTQsMTIyOSwgNjE3LCA0ODUsIDM1OSwxODMxLDE5NjksIDQ3MywyMzEwLAogNzUwLDIwNTgsIDE2NSwgIDgwLDI4NjQsMjQxOSwgMzYxLDQzNDQsMjQxNiwyNDc5LDExMzQsIDc5NiwzNzI2LDEyNjYsMjk0MywgODYwLAoyNzE1LCA5MzgsIDM5MCwyNzM0LDEzMTMsMTM4NCwgMjQ4LCAyMDIsIDg3NywxMDY0LDI4NTQsIDUyMiwzOTA3LCAyNzksMTYwMiwgMjk3LAoyMzU3LCAzOTUsMzc0MCwgMTM3LDIwNzUsIDk0NCw0MDg5LDI1ODQsMTI2NywzODAyLCAgNjIsMTUzMywyMjg1LCAxNzgsIDE3NiwgNzgwLAoyNDQwLCAyMDEsMzcwNywgNTkwLCA0NzgsMTU2MCw0MzU0LDIxMTcsMTA3NSwgIDMwLCAgNzQsNDY0Myw0MDA0LDE2MzUsMTQ0MSwyNzQ1LAogNzc2LDI1OTYsIDIzOCwxMDc3LDE2OTIsMTkxMiwyODQ0LCA2MDUsIDQ5OSwxNzQyLDM5NDcsIDI0MSwzMDUzLCA5ODAsMTc0OSwgOTM2LAoyNjQwLDQ1MTEsMjU4MiwgNTE1LDE1NDMsMjE2Miw1MzIyLDI4OTIsMjk5MywgODkwLDIxNDgsMTkyNCwgNjY1LDE4MjcsMzU4MSwxMDMyLAogOTY4LDMxNjMsIDMzOSwxMDQ0LDE4OTYsIDI3MCwgNTgzLDE3OTEsMTcyMCw0MzY3LDExOTQsMzQ4OCwzNjY5LCAgNDMsMjUyMywxNjU3LAogMTYzLDIxNjcsIDI5MCwxMjA5LDE2MjIsMzM3OCwgNTUwLCA2MzQsMjUwOCwyNTEwLCA2OTUsMjYzNCwyMzg0LDI1MTIsMTQ3NiwxNDE0LAogMjIwLDE0NjksMjM0MSwyMTM4LDI4NTIsMzE4MywyOTAwLDQ5MzksMjg2NSwzNTAyLDEyMTEsMzY4MCwgODU0LDMyMjcsMTI5OSwyOTc2LAozMTcyLCAxODYsMjk5OCwxNDU5LCA0NDMsMTA2NywzMjUxLDE0OTUsIDMyMSwxOTMyLDMwNTQsIDkwOSwgNzUzLDE0MTAsMTgyOCwgNDM2LAoyNDQxLDExMTksMTU4NywzMTY0LDIxODYsMTI1OCwgMjI3LCAyMzEsMTQyNSwxODkwLDMyMDAsMzk0MiwgMjQ3LCA5NTksIDcyNSw1MjU0LAoyNzQxLCA1NzcsMjE1OCwyMDc5LCA5MjksIDEyMCwgMTc0LCA4MzgsMjgxMywgNTkxLDExMTUsIDQxNywyMDI0LCAgNDAsMzI0MCwxNTM2LAoxMDM3LCAyOTEsNDE1MSwyMzU0LCA2MzIsMTI5OCwyNDA2LDI1MDAsMzUzNSwxODI1LDE4NDYsMzQ1MSwgMjA1LDExNzEsIDM0NSw0MjM4LAogIDE4LDExNjMsIDgxMSwgNjg1LDIyMDgsMTIxNywgNDI1LDEzMTIsMTUwOCwxMTc1LDQzMDgsMjU1MiwxMDMzLCA1ODcsMTM4MSwzMDU5LAoyOTg0LDM0ODIsIDM0MCwxMzE2LDQwMjMsMzk3MiwgNzkyLDMxNzYsIDUxOSwgNzc3LDQ2OTAsIDkxOCwgOTMzLDQxMzAsMjk4MSwzNzQxLAogIDkwLDMzNjAsMjkxMSwyMjAwLDUxODQsNDU1MCwgNjA5LDMwNzksMjAzMCwgMjcyLDMzNzksMjczNiwgMzYzLDM4ODEsMTEzMCwxNDQ3LAogMjg2LCA3NzksIDM1NywxMTY5LDMzNTAsMzEzNywxNjMwLDEyMjAsMjY4NywyMzkxLCA3NDcsMTI3NywzNjg4LDI2MTgsMjY4MiwyNjAxLAoxMTU2LDMxOTYsNTI5MCw0MDM0LDMxMDIsMTY4OSwzNTk2LDMxMjgsIDg3NCwgMjE5LDI3ODMsIDc5OCwgNTA4LDE4NDMsMjQ2MSwgMjY5LAoxNjU4LDE3NzYsMTM5MiwxOTEzLDI5ODMsMzI4NywyODY2LDIxNTksMjM3MiwgODI5LDQwNzYsICA0Niw0MjUzLDI4NzMsMTg4OSwxODk0LAogOTE1LDE4MzQsMTYzMSwyMTgxLDIzMTgsIDI5OCwgNjY0LDI4MTgsMzU1NSwyNzM1LCA5NTQsMzIyOCwzMTE3LCA1MjcsMzUxMSwyMTczLAogNjgxLDI3MTIsMzAzMywyMjQ3LDIzNDYsMzQ2NywxNjUyLCAxNTUsMjE2NCwzMzgyLCAxMTMsMTk5NCwgNDUwLCA4OTksIDQ5NCwgOTk0LAoxMjM3LDI5NTgsMTg3NSwyMzM2LDE5MjYsMzcyNywgNTQ1LDE1NzcsMTU1MCwgNjMzLDM0NzMsIDIwNCwxMzA1LDMwNzIsMjQxMCwxOTU2LAoyNDcxLCA3MDcsMjEzNCwgODQxLDIxOTUsMjE5NiwyNjYzLDM4NDMsMTAyNiw0OTQwLCA5OTAsMzI1Miw0OTk3LCAzNjgsMTA5MiwgNDM3LAozMjEyLDMyNTgsMTkzMywxODI5LCA2NzUsMjk3NywyODkzLCA0MTIsIDk0MywzNzIzLDQ2NDQsMzI5NCwzMjgzLDIyMzAsMjM3Myw1MTU0LAoyMzg5LDIyNDEsMjY2MSwyMzIzLDE0MDQsMjUyNCwgNTkzLCA3ODcsIDY3NywzMDA4LDEyNzUsMjA1OSwgNDM4LDI3MDksMjYwOSwyMjQwLAoyMjY5LDIyNDYsMTQ0NiwgIDM2LDE1NjgsMTM3MywzODkyLDE1NzQsMjMwMSwxNDU2LDM5NjIsIDY5MywyMjc2LDUyMTYsMjAzNSwxMTQzLAoyNzIwLDE5MTksMTc5NywxODExLDI3NjMsNDEzNywyNTk3LDE4MzAsMTY5OSwxNDg4LDExOTgsMjA5MCwgNDI0LDE2OTQsIDMxMiwzNjM0LAozMzkwLDQxNzksMzMzNSwyMjUyLDEyMTQsIDU2MSwxMDU5LDMyNDMsMjI5NSwyNTYxLCA5NzUsNTE1NSwyMzIxLDI3NTEsMzc3MiwgNDcyLAoxNTM3LDMyODIsMzM5OCwxMDQ3LDIwNzcsMjM0OCwyODc4LDEzMjMsMzM0MCwzMDc2LCA2OTAsMjkwNiwgIDUxLCAzNjksIDE3MCwzNTQxLAoxMDYwLDIxODcsMjY4OCwzNjcwLDI1NDEsMTA4MywxNjgzLCA5MjgsMzkxOCwgNDU5LCAxMDksNDQyNywgNTk5LDM3NDQsNDI4NiwgMTQzLAoyMTAxLDI3MzAsMjQ5MCwgIDgyLDE1ODgsMzAzNiwyMTIxLCAyODEsMTg2MCwgNDc3LDQwMzUsMTIzOCwyODEyLDMwMjAsMjcxNiwzMzEyLAoxNTMwLDIxODgsMjA1NSwxMzE3LCA4NDMsIDYzNiwxODA4LDExNzMsMzQ5NSwgNjQ5LCAxODEsMTAwMiwgMTQ3LDM2NDEsMTE1OSwyNDE0LAozNzUwLDIyODksMjc5NSwgODEzLDMxMjMsMjYxMCwxMTM2LDQzNjgsICAgNSwzMzkxLDQ1NDEsMjE3NCwgNDIwLCA0MjksMTcyOCwgNzU0LAoxMjI4LDIxMTUsMjIxOSwgMzQ3LDIyMjMsMjczMywgNzM1LDE1MTgsMzAwMywyMzU1LDMxMzQsMTc2NCwzOTQ4LDMzMjksMTg4OCwyNDI0LAoxMDAxLDEyMzQsMTk3MiwzMzIxLDMzNjMsMTY3MiwxMDIxLDE0NTAsMTU4NCwgMjI2LCA3NjUsIDY1NSwyNTI2LDM0MDQsMzI0NCwyMzAyLAozNjY1LCA3MzEsIDU5NCwyMTg0LCAzMTksMTU3NiwgNjIxLCA2NTgsMjY1Niw0Mjk5LDIwOTksMzg2NCwxMjc5LDIwNzEsMjU5OCwyNzM5LAogNzk1LDMwODYsMzY5OSwzOTA4LDE3MDcsMjM1MiwyNDAyLDEzODIsMzEzNiwyNDc1LDE0NjUsNDg0NywzNDk2LDM4NjUsMTA4NSwzMDA0LAoyNTkxLDEwODQsIDIxMywyMjg3LDE5NjMsMzU2NSwyMjUwLCA4MjIsIDc5Myw0NTc0LDMxODcsMTc3MiwxNzg5LDMwNTAsIDU5NSwxNDg0LAoxOTU5LDI3NzAsMTA4MCwyNjUwLCA0NTYsIDQyMiwyOTk2LCA5NDAsMzMyMiw0MzI4LDQzNDUsMzA5MiwyNzQyLCA5NjUsMjc4NCwgNzM5LAo0MTI0LCA5NTIsMTM1OCwyNDk4LDI5NDksMjU2NSwgMzMyLDI2OTgsMjM3OCwgNjYwLDIyNjAsMjQ3Myw0MTk0LDM4NTYsMjkxOSwgNTM1LAoxMjYwLDI2NTEsMTIwOCwxNDI4LDEzMDAsMTk0OSwxMzAzLDI5NDIsIDQzMywyNDU1LDI0NTAsMTI1MSwxOTQ2LCA2MTQsMTI2OSwgNjQxLAoxMzA2LDE4MTAsMjczNywzMDc4LDI5MTIsIDU2NCwyMzY1LDE0MTksMTQxNSwxNDk3LDQ0NjAsMjM2NywyMTg1LDEzNzksMzAwNSwxMzA3LAozMjE4LDIxNzUsMTg5NywzMDYzLCA2ODIsMTE1Nyw0MDQwLDQwMDUsMTcxMiwxMTYwLDE5NDEsMTM5OSwgMzk0LCA0MDIsMjk1MiwxNTczLAoxMTUxLDI5ODYsMjQwNCwgODYyLCAyOTksMjAzMywxNDg5LDMwMDYsIDM0NiwgMTcxLDI4ODYsMzQwMSwxNzI2LDI5MzIsIDE2OCwyNTMzLAogIDQ3LDI1MDcsMTAzMCwzNzM1LDExNDUsMzM3MCwxMzk1LDEzMTgsMTU3OSwzNjA5LDQ1NjAsMjg1Nyw0MTE2LDE0NTcsMjUyOSwxOTY1LAogNTA0LDEwMzYsMjY5MCwyOTg4LDI0MDUsIDc0NSw1ODcxLCA4NDksMjM5NywyMDU2LDMwODEsIDg2MywyMzU5LDM4NTcsMjA5NiwgIDk5LAoxMzk3LDE3NjksMjMwMCw0NDI4LDE2NDMsMzQ1NSwxOTc4LDE3NTcsMzcxOCwxNDQwLCAgMzUsNDg3OSwzNzQyLDEyOTYsNDIyOCwyMjgwLAogMTYwLDUwNjMsMTU5OSwyMDEzLCAxNjYsIDUyMCwzNDc5LDE2NDYsMzM0NSwzMDEyLCA0OTAsMTkzNywxNTQ1LDEyNjQsMjE4MiwyNTA1LAoxMDk2LDExODgsMTM2OSwxNDM2LDI0MjEsMTY2NywyNzkyLDI0NjAsMTI3MCwyMTIyLCA3MjcsMzE2NywyMTQzLCA4MDYsMTcwNiwxMDEyLAoxODAwLDMwMzcsIDk2MCwyMjE4LDE4ODIsIDgwNSwgMTM5LDI0NTYsMTEzOSwxNTIxLCA4NTEsMTA1MiwzMDkzLDMwODksIDM0MiwyMDM5LAogNzQ0LDUwOTcsMTQ2OCwxNTAyLDE1ODUsMjA4NywgMjIzLCA5MzksIDMyNiwyMTQwLDI1NzcsIDg5MiwyNDgxLDE2MjMsNDA3NywgOTgyLAozNzA4LCAxMzUsMjEzMSwgIDg3LDI1MDMsMzExNCwyMzI2LDExMDYsIDg3NiwxNjE2LCA1NDcsMjk5NywyODMxLDIwOTMsMzQ0MSw0NTMwLAo0MzE0LCAgIDksMzI1Niw0MjI5LDQxNDgsIDY1OSwxNDYyLDE5ODYsMTcxMCwyMDQ2LDI5MTMsMjIzMSw0MDkwLDQ4ODAsNTI1NSwzMzkyLAozMjc0LDEzNjgsMzY4OSw0NjQ1LDE0NzcsIDcwNSwzMzg0LDM2MzUsMTA2OCwxNTI5LDI5NDEsMTQ1OCwzNzgyLDE1MDksIDEwMCwxNjU2LAoyNTQ4LCA3MTgsMjMzOSwgNDA4LDE1OTAsMjc4MCwzNTQ4LDE4MzgsNDExNywzNzE5LDEzNDUsMzUzMCwgNzE3LDM0NDIsMjc3OCwzMjIwLAoyODk4LDE4OTIsNDU5MCwzNjE0LDMzNzEsMjA0MywxOTk4LDEyMjQsMzQ4MywgODkxLCA2MzUsIDU4NCwyNTU5LDMzNTUsIDczMywxNzY2LAoxNzI5LDExNzIsMzc4OSwxODkxLDIzMDcsIDc4MSwyOTgyLDIyNzEsMTk1NywxNTgwLDU3NzMsMjYzMywyMDA1LDQxOTUsMzA5NywxNTM1LAozMjEzLDExODksMTkzNCw1NjkzLDMyNjIsIDU4NiwzMTE4LDEzMjQsMTU5OCwgNTE3LDE1NjQsMjIxNywxODY4LDE4OTMsNDQ0NSwzNzI4LAoyNzAzLDMxMzksMTUyNiwxNzg3LDE5OTIsMzg4MiwyODc1LDE1NDksMTE5OSwxMDU2LDIyMjQsMTkwNCwyNzExLDUwOTgsNDI4NywgMzM4LAoxOTkzLDMxMjksMzQ4OSwyNjg5LDE4MDksMjgxNSwxOTk3LCA5NTcsMTg1NSwzODk4LDI1NTAsMzI3NSwzMDU3LDExMDUsMTMxOSwgNjI3LAoxNTA1LDE5MTEsMTg4MywzNTI2LCA2OTgsMzYyOSwzNDU2LDE4MzMsMTQzMSwgNzQ2LCAgNzcsMTI2MSwyMDE3LDIyOTYsMTk3NywxODg1LAogMTI1LDEzMzQsMTYwMCwgNTI1LDE3OTgsMTEwOSwyMjIyLDE0NzAsMTk0NSwgNTU5LDIyMzYsMTE4NiwzNDQzLDI0NzYsMTkyOSwxNDExLAoyNDExLDMxMzUsMTc3NywzMzcyLDI2MjEsMTg0MSwxNjEzLDMyMjksIDY2OCwxNDMwLDE4MzksMjY0MywyOTE2LCAxOTUsMTk4OSwyNjcxLAoyMzU4LDEzODcsIDYyOSwzMjA1LDIyOTMsNTI1Niw0NDM5LCAxMjMsMTMxMCwgODg4LDE4NzksNDMwMCwzMDIxLDM2MDUsMTAwMywxMTYyLAozMTkyLDI5MTAsMjAxMCwgMTQwLDIzOTUsMjg1OSwgIDU1LDEwODIsMjAxMiwyOTAxLCA2NjIsIDQxOSwyMDgxLDE0MzgsIDY4MCwyNzc0LAo0NjU0LDM5MTIsMTYyMCwxNzMxLDE2MjUsNTAzNSw0MDY1LDIzMjgsIDUxMiwxMzQ0LCA4MDIsNTQ0MywyMTYzLDIzMTEsMjUzNywgNTI0LAozMzk5LCAgOTgsMTE1NSwyMTAzLDE5MTgsMjYwNiwzOTI1LDI4MTYsMTM5MywyNDY1LDE1MDQsMzc3MywyMTc3LDM5NjMsMTQ3OCw0MzQ2LAogMTgwLDExMTMsNDY1NSwzNDYxLDIwMjgsMTY5OCwgODMzLDI2OTYsMTIzNSwxMzIyLDE1OTQsNDQwOCwzNjIzLDMwMTMsMzIyNSwyMDQwLAozMDIyLCA1NDEsMjg4MSwgNjA3LDM2MzIsMjAyOSwxNjY1LDEyMTksIDYzOSwxMzg1LDE2ODYsMTA5OSwyODAzLDMyMzEsMTkzOCwzMTg4LAoyODU4LCA0MjcsIDY3NiwyNzcyLDExNjgsMjAyNSwgNDU0LDMyNTMsMjQ4NiwzNTU2LCAyMzAsMTk1MCwgNTgwLCA3OTEsMTk5MSwxMjgwLAoxMDg2LDE5NzQsMjAzNCwgNjMwLCAyNTcsMzMzOCwyNzg4LDQ5MDMsMTAxNywgIDg2LDQ3OTAsIDk2NiwyNzg5LDE5OTUsMTY5NiwxMTMxLAogMjU5LDMwOTUsNDE4OCwxMzA4LCAxNzksMTQ2Myw1MjU3LCAyODksNDEwNywxMjQ4LCAgNDIsMzQxMywxNzI1LDIyODgsIDg5NiwxOTQ3LAogNzc0LDQ0NzQsNDI1NCwgNjA0LDM0MzAsNDI2NCwgMzkyLDI1MTQsMjU4OCwgNDUyLCAyMzcsMTQwOCwzMDE4LCA5ODgsNDUzMSwxOTcwLAozMDM0LDMzMTAsIDU0MCwyMzcwLDE1NjIsMTI4OCwyOTkwLCA1MDIsNDc2NSwxMTQ3LCAgIDQsMTg1MywyNzA4LCAyMDcsIDI5NCwyODE0LAo0MDc4LDI5MDIsMjUwOSwgNjg0LCAgMzQsMzEwNSwzNTMyLDI1NTEsIDY0NCwgNzA5LDI4MDEsMjM0NCwgNTczLDE3MjcsMzU3MywzNTU3LAoyMDIxLDEwODEsMzEwMCw0MzE1LDIxMDAsMzY4MSwgMTk5LDIyNjMsMTgzNywyMzg1LCAxNDYsMzQ4NCwxMTk1LDI3NzYsMzk0OSwgOTk3LAoxOTM5LDM5NzMsMTAwOCwxMDkxLDEyMDIsMTk2MiwxODQ3LDExNDksNDIwOSw1NDQ0LDEwNzYsIDQ5MywgMTE3LDU0MDAsMjUyMSwgOTcyLAoxNDkwLDI5MzQsMTc5Niw0NTQyLDIzNzQsMTUxMiwyOTMzLDI2NTcsIDQxMywyODg4LDExMzUsMjc2MiwyMzE0LDIxNTYsMTM1NSwyMzY5LAogNzY2LDIwMDcsMjUyNywyMTcwLDMxMjQsMjQ5MSwyNTkzLDI2MzIsNDc1NywyNDM3LCAyMzQsMzEyNSwzNTkxLDE4OTgsMTc1MCwxMzc2LAoxOTQyLDM0NjgsMzEzOCwgNTcwLDIxMjcsMjE0NSwzMjc2LDQxMzEsIDk2MiwgMTMyLDE0NDUsNDE5NiwgIDE5LCA5NDEsMzYyNCwzNDgwLAozMzY2LDE5NzMsMTM3NCw0NDYxLDM0MzEsMjYyOSwgMjgzLDI0MTUsMjI3NSwgODA4LDI4ODcsMzYyMCwyMTEyLDI1NjMsMTM1MywzNjEwLAogOTU1LDEwODksMzEwMywxMDUzLCAgOTYsICA4OCw0MDk3LCA4MjMsMzgwOCwxNTgzLCAzOTksIDI5Miw0MDkxLDMzMTMsIDQyMSwxMTI4LAogNjQyLDQwMDYsIDkwMywyNTM5LDE4NzcsMjA4MiwgNTk2LCAgMjksNDA2NiwxNzkwLCA3MjIsMjE1NywgMTMwLCA5OTUsMTU2OSwgNzY5LAoxNDg1LCA0NjQsIDUxMywyMjEzLCAyODgsMTkyMywxMTAxLDI0NTMsNDMxNiwgMTMzLCA0ODYsMjQ0NSwgIDUwLCA2MjUsIDQ4NywyMjA3LAogIDU3LCA0MjMsIDQ4MSwyOTYyLCAxNTksMzcyOSwxNTU4LCA0OTEsIDMwMywgNDgyLCA1MDEsIDI0MCwyODM3LCAxMTIsMzY0OCwyMzkyLAoxNzgzLCAzNjIsICAgOCwzNDMzLDM0MjIsIDYxMCwyNzkzLDMyNzcsMTM5MCwxMjg0LDE2NTQsICAyMSwzODIzLCA3MzQsIDM2NywgNjIzLAogMTkzLCAyODcsIDM3NCwxMDA5LDE0ODMsIDgxNiwgNDc2LCAzMTMsMjI1NSwyMzQwLDEyNjIsMjE1MCwyODk5LDExNDYsMjU4MSwgNzgyLAoyMTE2LDE2NTksMjAxOCwxODgwLCAyNTUsMzU4NiwzMzE0LDExMTAsMjg2NywyMTM3LDI1NjQsIDk4NiwyNzY3LDUxODUsMjAwNiwgNjUwLAogMTU4LCA5MjYsIDc2MiwgODgxLDMxNTcsMjcxNywyMzYyLDM1ODcsIDMwNiwzNjkwLDMyNDUsMTU0MiwzMDc3LDI0MjcsMTY5MSwyNDc4LAoyMTE4LDI5ODUsMzQ5MCwyNDM4LCA1MzksMjMwNSwgOTgzLCAxMjksMTc1NCwgMzU1LDQyMDEsMjM4NiwgODI3LDI5MjMsIDEwNCwxNzczLAoyODM4LDI3NzEsIDQxMSwyOTA1LDM5MTksIDM3NiwgNzY3LCAxMjIsMTExNCwgODI4LDI0MjIsMTgxNywzNTA2LCAyNjYsMzQ2MCwxMDA3LAoxNjA5LDQ5OTgsIDk0NSwyNjEyLDQ0MjksMjI3NCwgNzI2LDEyNDcsMTk2NCwyOTE0LDIxOTksMjA3MCw0MDAyLDQxMDgsIDY1NywzMzIzLAoxNDIyLCA1NzksIDQ1NSwyNzY0LDQ3MzcsMTIyMiwyODk1LDE2NzAsIDgyNCwxMjIzLDE0ODcsMjUyNSwgNTU4LCA4NjEsMzA4MCwgNTk4LAoyNjU5LDI1MTUsMTk2NywgNzUyLDI1ODMsMjM3NiwyMjE0LDQxODAsIDk3NywgNzA0LDI0NjQsNDk5OSwyNjIyLDQxMDksMTIxMCwyOTYxLAogODE5LDE1NDEsIDE0MiwyMjg0LCAgNDQsIDQxOCwgNDU3LDExMjYsMzczMCw0MzQ3LDQ2MjYsMTY0NCwxODc2LDM2NzEsMTg2NCwgMzAyLAoxMDYzLDU2OTQsIDYyNCwgNzIzLDE5ODQsMzc0NSwxMzE0LDE2NzYsMjQ4OCwxNjEwLDE0NDksMzU1OCwzNTY5LDIxNjYsMjA5OCwgNDA5LAoxMDExLDIzMjUsMzcwNCwyMzA2LCA4MTgsMTczMiwxMzgzLDE4MjQsMTg0NCwzNzU3LCA5OTksMjcwNSwzNDk3LDEyMTYsMTQyMywyNjgzLAoyNDI2LDI5NTQsMjUwMSwyNzI2LDIyMjksMTQ3NSwyNTU0LDUwNjQsMTk3MSwxNzk0LDE2NjYsMjAxNCwxMzQzLCA3ODMsIDcyNCwgMTkxLAoyNDM0LDEzNTQsMjIyMCw1MDY1LDE3NjMsMjc1MiwyNDcyLDQxNTIsIDEzMSwgMTc1LDI4ODUsMzQzNCwgIDkyLDE0NjYsNDkyMCwyNjE2LAozODcxLDM4NzIsMzg2NiwgMTI4LDE1NTEsMTYzMiwgNjY5LDE4NTQsMzY4Miw0NjkxLDQxMjUsMTIzMCwgMTg4LDI5NzMsMzI5MCwxMzAyLAoxMjEzLCA1NjAsMzI2NiwgOTE3LCA3NjMsMzkwOSwzMjQ5LDE3NjAsIDg2OCwxOTU4LCA3NjQsMTc4MiwyMDk3LCAxNDUsMjI3NywzNzc0LAo0NDYyLCAgNjQsMTQ5MSwzMDYyLCA5NzEsMjEzMiwzNjA2LDI0NDIsIDIyMSwxMjI2LDE2MTcsIDIxOCwgMzIzLDExODUsMzIwNywzMTQ3LAogNTcxLCA2MTksMTQ3MywxMDA1LDE3NDQsMjI4MSwgNDQ5LDE4ODcsMjM5NiwzNjg1LCAyNzUsIDM3NSwzODE2LDE3NDMsMzg0NCwzNzMxLAogODQ1LDE5ODMsMjM1MCw0MjEwLDEzNzcsIDc3MywgOTY3LDM0OTksMzA1MiwzNzQzLDI3MjUsNDAwNywxNjk3LDEwMjIsMzk0MywxNDY0LAozMjY0LDI4NTUsMjcyMiwxOTUyLDEwMjksMjgzOSwyNDY3LCAgODQsNDM4MywyMjE1LCA4MjAsMTM5MSwyMDE1LDI0NDgsMzY3MiwgMzc3LAoxOTQ4LDIxNjgsIDc5NywyNTQ1LDM1MzYsMjU3OCwyNjQ1LCAgOTQsMjg3NCwxNjc4LCA0MDUsMTI1OSwzMDcxLCA3NzEsIDU0NiwxMzE1LAogNDcwLDEyNDMsMzA4MywgODk1LDI0NjgsIDk4MSwgOTY5LDIwMzcsIDg0Niw0MTgxLCA2NTMsMTI3NiwyOTI4LCAgMTQsMjU5NCwgNTU3LAozMDA3LDI0NzQsIDE1NiwgOTAyLDEzMzgsMTc0MCwyNTc0LCA1MzcsMjUxOCwgOTczLDIyODIsMjIxNiwyNDMzLDE5MjgsIDEzOCwyOTAzLAoxMjkzLDI2MzEsMTYxMiwgNjQ2LDM0NTcsIDgzOSwyOTM1LCAxMTEsIDQ5NiwyMTkxLDI4NDcsIDU4OSwzMTg2LCAxNDksMzk5NCwyMDYwLAo0MDMxLDI2NDEsNDA2NywzMTQ1LDE4NzAsICAzNywzNTk3LDIxMzYsMTAyNSwyMDUxLDMwMDksMzM4MywzNTQ5LDExMjEsMTAxNiwzMjYxLAoxMzAxLCAyNTEsMjQ0NiwyNTk5LDIxNTMsIDg3MiwzMjQ2LCA2MzcsIDMzNCwzNzA1LCA4MzEsIDg4NCwgOTIxLDMwNjUsMzE0MCw0MDkyLAoyMTk4LDE5NDQsIDI0NiwyOTY0LCAxMDgsMjA0NSwxMTUyLDE5MjEsMjMwOCwxMDMxLCAyMDMsMzE3Myw0MTcwLDE5MDcsMzg5MCwgODEwLAoxNDAxLDIwMDMsMTY5MCwgNTA2LCA2NDcsMTI0MiwyODI4LDE3NjEsMTY0OSwzMjA4LDIyNDksMTU4OSwzNzA5LDI5MzEsNTE1NiwxNzA4LAogNDk4LCA2NjYsMjYxMywgODM0LDM4MTcsMTIzMSwgMTg0LDI4NTEsMTEyNCwgODgzLDMxOTcsMjI2MSwzNzEwLDE3NjUsMTU1MywyNjU4LAoxMTc4LDI2MzksMjM1MSwgIDkzLDExOTMsIDk0MiwyNTM4LDIxNDEsNDQwMiwgMjM1LDE4MjEsIDg3MCwxNTkxLDIxOTIsMTcwOSwxODcxLAozMzQxLDE2MTgsNDEyNiwyNTk1LDIzMzQsIDYwMywgNjUxLCAgNjksIDcwMSwgMjY4LDI2NjIsMzQxMSwyNTU1LDEzODAsMTYwNiwgNTAzLAogNDQ4LCAyNTQsMjM3MSwyNjQ2LCA1NzQsMTE4NywyMzA5LDE3NzAsIDMyMiwyMjM1LDEyOTIsMTgwMSwgMzA1LCA1NjYsMTEzMywgMjI5LAoyMDY3LDIwNTcsIDcwNiwgMTY3LCA0ODMsMjAwMiwyNjcyLDMyOTUsMTgyMCwzNTYxLDMwNjcsIDMxNiwgMzc4LDI3NDYsMzQ1MiwxMTEyLAogMTM2LDE5ODEsIDUwNywxNjUxLDI5MTcsMTExNywgMjg1LDQ1OTEsIDE4MiwyNTgwLDM1MjIsMTMwNCwgMzM1LDMzMDMsMTgzNSwyNTA0LAoxNzk1LDE3OTIsMjI0OCwgNjc0LDEwMTgsMjEwNiwyNDQ5LDE4NTcsMjI5MiwyODQ1LCA5NzYsMzA0NywxNzgxLDI2MDAsMjcyNywxMzg5LAoxMjgxLCAgNTIsMzE1MiwgMTUzLCAyNjUsMzk1MCwgNjcyLDM0ODUsMzk1MSw0NDYzLCA0MzAsMTE4MywgMzY1LCAyNzgsMjE2OSwgIDI3LAoxNDA3LDEzMzYsMjMwNCwgMjA5LDEzNDAsMTczMCwyMjAyLDE4NTIsMjQwMywyODgzLCA5NzksMTczNywxMDYyLCA2MzEsMjgyOSwyNTQyLAozODc2LDI1OTIsIDgyNSwyMDg2LDIyMjYsMzA0OCwzNjI1LCAzNTIsMTQxNywzNzI0LCA1NDIsIDk5MSwgNDMxLDEzNTEsMzkzOCwxODYxLAoyMjk0LCA4MjYsMTM2MSwyOTI3LDMxNDIsMzUwMywxNzM4LCA0NjMsMjQ2MiwyNzIzLCA1ODIsMTkxNiwxNTk1LDI4MDgsIDQwMCwzODQ1LAozODkxLDI4NjgsMzYyMSwyMjU0LCAgNTgsMjQ5MiwxMTIzLCA5MTAsMjE2MCwyNjE0LDEzNzIsMTYwMywxMTk2LDEwNzIsMzM4NSwxNzAwLAozMjY3LDE5ODAsIDY5NiwgNDgwLDI0MzAsIDkyMCwgNzk5LDE1NzAsMjkyMCwxOTUxLDIwNDEsNDA0NywyNTQwLDEzMjEsNDIyMywyNDY5LAozNTYyLDIyMjgsMTI3MSwyNjAyLCA0MDEsMjgzMywzMzUxLDI1NzUsNTE1NywgOTA3LDIzMTIsMTI1NiwgNDEwLCAyNjMsMzUwNywxNTgyLAogOTk2LCA2NzgsMTg0OSwyMzE2LDE0ODAsIDkwOCwzNTQ1LDIyMzcsIDcwMywyMzIyLCA2NjcsMTgyNiwyODQ5LDE1MzEsMjYwNCwyOTk5LAoyNDA3LDMxNDYsMjE1MSwyNjMwLDE3ODYsMzcxMSwgNDY5LDM1NDIsIDQ5NywzODk5LDI0MDksIDg1OCwgODM3LDQ0NDYsMzM5MywxMjc0LAogNzg2LCA2MjAsMTg0NSwyMDAxLDMzMTEsIDQ4NCwgMzA4LDMzNjcsMTIwNCwxODE1LDM2OTEsMjMzMiwxNTMyLDI1NTcsMTg0MiwyMDIwLAoyNzI0LDE5MjcsMjMzMyw0NDQwLCA1NjcsICAyMiwxNjczLDI3MjgsNDQ3NSwxOTg3LDE4NTgsMTE0NCwxNTk3LCAxMDEsMTgzMiwzNjAxLAogIDEyLCA5NzQsMzc4Myw0MzkxLCA5NTEsMTQxMiwgICAxLDM3MjAsIDQ1Myw0NjA4LDQwNDEsIDUyOCwxMDQxLDEwMjcsMzIzMCwyNjI4LAoxMTI5LCA4NzUsMTA1MSwzMjkxLDEyMDMsMjI2MiwxMDY5LDI4NjAsMjc5OSwyMTQ5LDI2MTUsMzI3OCwgMTQ0LDE3NTgsMzA0MCwgIDMxLAogNDc1LDE2ODAsIDM2NiwyNjg1LDMxODQsIDMxMSwxNjQyLDQwMDgsMjQ2Niw1MDM2LDE1OTMsMTQ5MywyODA5LCAyMTYsMTQyMCwxNjY4LAogMjMzLCAzMDQsMjEyOCwzMjg0LCAyMzIsMTQyOSwxNzY4LDEwNDAsMjAwOCwzNDA3LDI3NDAsMjk2NywyNTQzLCAyNDIsMjEzMywgNzc4LAoxNTY1LDIwMjIsMjYyMCwgNTA1LDIxODksMjc1NiwxMDk4LDIyNzMsIDM3MiwxNjE0LCA3MDgsIDU1MywyODQ2LDIwOTQsMjI3OCwgMTY5LAozNjI2LDI4MzUsNDE2MSwgMjI4LDI2NzQsMzE2NSwgODA5LDE0NTQsMTMwOSwgNDY2LDE3MDUsMTA5NSwgOTAwLDM0MjMsIDg4MCwyNjY3LAozNzUxLDUyNTgsMjMxNywzMTA5LDI1NzEsNDMxNywyNzY2LDE1MDMsMTM0MiwgODY2LDQ0NDcsMTExOCwgIDYzLDIwNzYsIDMxNCwxODgxLAoxMzQ4LDEwNjEsIDE3MiwgOTc4LDM1MTUsMTc0NywgNTMyLCA1MTEsMzk3MCwgICA2LCA2MDEsIDkwNSwyNjk5LDMzMDAsMTc1MSwgMjc2LAoxNDY3LDM3MjUsMjY2OCwgIDY1LDQyMzksMjU0NCwyNzc5LDI1NTYsMTYwNCwgNTc4LDI0NTEsMTgwMiwgOTkyLDIzMzEsMjYyNCwxMzIwLAozNDQ2LCA3MTMsMTUxMywxMDEzLCAxMDMsMjc4NiwyNDQ3LDE2NjEsIDg4NiwxNzAyLCA5MTYsIDY1NCwzNTc0LDIwMzEsMTU1NiwgNzUxLAoyMTc4LDI4MjEsMjE3OSwxNDk4LDE1MzgsMjE3NiwgMjcxLCA5MTQsMjI1MSwyMDgwLDEzMjUsIDYzOCwxOTUzLDI5MzcsMzg3NywyNDMyLAoyNzU0LCAgOTUsMzI2NSwxNzE2LCAyNjAsMTIyNyw0MDgzLCA3NzUsIDEwNiwxMzU3LDMyNTQsIDQyNiwxNjA3LCA1NTUsMjQ4MCwgNzcyLAoxOTg1LCAyNDQsMjU0NiwgNDc0LCA0OTUsMTA0NiwyNjExLDE4NTEsMjA2MSwgIDcxLDIwODksMTY3NSwyNTkwLCA3NDIsMzc1OCwyODQzLAozMjIyLDE0MzMsIDI2NywyMTgwLDI1NzYsMjgyNiwyMjMzLDIwOTIsMzkxMywyNDM1LCA5NTYsMTc0NSwzMDc1LCA4NTYsMjExMywxMTE2LAogNDUxLCAgIDMsMTk4OCwyODk2LDEzOTgsIDk5MywyNDYzLDE4NzgsMjA0OSwxMzQxLDI3MTgsMjcyMSwyODcwLDIxMDgsIDcxMiwyOTA0LAo0MzYzLDI3NTMsMjMyNCwgMjc3LDI4NzIsMjM0OSwyNjQ5LCAzODQsIDk4NywgNDM1LCA2OTEsMzAwMCwgOTIyLCAxNjQsMzkzOSwgNjUyLAoxNTAwLDExODQsNDE1MywyNDgyLDMzNzMsMjE2NSw0ODQ4LDIzMzUsMzc3NSwzNTA4LDMxNTQsMjgwNiwyODMwLDE1NTQsMjEwMiwxNjY0LAoyNTMwLDE0MzQsMjQwOCwgODkzLDE1NDcsMjYyMywzNDQ3LDI4MzIsMjI0MiwyNTMyLDMxNjksMjg1NiwzMjIzLDIwNzgsICA0OSwzNzcwLAozNDY5LCA0NjIsIDMxOCwgNjU2LDIyNTksMzI1MCwzMDY5LCA2NzksMTYyOSwyNzU4LCAzNDQsMTEzOCwxMTA0LDMxMjAsMTgzNiwxMjgzLAozMTE1LDIxNTQsMTQzNyw0NDQ4LCA5MzQsIDc1OSwxOTk5LCA3OTQsMjg2MiwxMDM4LCA1MzMsMjU2MCwxNzIyLDIzNDIsIDg1NSwyNjI2LAoxMTk3LDE2NjMsNDQ3NiwzMTI3LCAgODUsNDI0MCwyNTI4LCAgMjUsMTExMSwxMTgxLDM2NzMsIDQwNywzNDcwLDQ1NjEsMjY3OSwyNzEzLAogNzY4LDE5MjUsMjg0MSwzOTg2LDE1NDQsMTE2NSwgOTMyLCAzNzMsMTI0MCwyMTQ2LDE5MzAsMjY3MywgNzIxLDQ3NjYsIDM1NCw0MzMzLAogMzkxLDI5NjMsIDE4NywgIDYxLDMzNjQsMTQ0MiwxMTAyLCAzMzAsMTk0MCwxNzY3LCAzNDEsMzgwOSw0MTE4LCAzOTMsMjQ5NiwyMDYyLAoyMjExLCAxMDUsIDMzMSwgMzAwLCA0MzksIDkxMywxMzMyLCA2MjYsIDM3OSwzMzA0LDE1NTcsIDMyOCwgNjg5LDM5NTIsIDMwOSwxNTU1LAogOTMxLCAzMTcsMjUxNywzMDI3LCAzMjUsIDU2OSwgNjg2LDIxMDcsMzA4NCwgIDYwLDEwNDIsMTMzMywyNzk0LCAyNjQsMzE3Nyw0MDE0LAoxNjI4LCAyNTgsMzcxMiwgICA3LDQ0NjQsMTE3NiwxMDQzLDE3NzgsIDY4MywgMTE0LDE5NzUsICA3OCwxNDkyLCAzODMsMTg4NiwgNTEwLAogMzg2LCA2NDUsNTI5MSwyODkxLDIwNjksMzMwNSw0MTM4LDM4NjcsMjkzOSwyNjAzLDI0OTMsMTkzNSwxMDY2LDE4NDgsMzU4OCwxMDE1LAoxMjgyLDEyODksNDYwOSwgNjk3LDE0NTMsMzA0NCwyNjY2LDM2MTEsMTg1NiwyNDEyLCAgNTQsIDcxOSwxMzMwLCA1NjgsMzc3OCwyNDU5LAoxNzQ4LCA3ODgsIDQ5MiwgNTUxLDExOTEsMTAwMCwgNDg4LDMzOTQsMzc2MywgMjgyLDE3OTksIDM0OCwyMDE2LDE1MjMsMzE1NSwyMzkwLAoxMDQ5LCAzODIsMjAxOSwxNzg4LDExNzAsIDcyOSwyOTY4LDM1MjMsIDg5NywzOTI2LDI3ODUsMjkzOCwzMjkyLCAzNTAsMjMxOSwzMjM4LAoxNzE4LDE3MTcsMjY1NSwzNDUzLDMxNDMsNDQ2NSwgMTYxLDI4ODksMjk4MCwyMDA5LDE0MjEsICA1NiwxOTA4LDE2NDAsMjM4NywyMjMyLAoxOTE3LDE4NzQsMjQ3Nyw0OTIxLCAxNDgsICA4MywzNDM4LCA1OTIsNDI0NSwyODgyLDE4MjIsMTA1NSwgNzQxLCAxMTUsMTQ5NiwxNjI0LAogMzgxLDE2MzgsNDU5MiwxMDIwLCA1MTYsMzIxNCwgNDU4LCA5NDcsNDU3NSwxNDMyLCAyMTEsMTUxNCwyOTI2LDE4NjUsMjE0MiwgMTg5LAogODUyLDEyMjEsMTQwMCwxNDg2LCA4ODIsMjI5OSw0MDM2LCAzNTEsICAyOCwxMTIyLCA3MDAsNjQ3OSw2NDgwLDY0ODEsNjQ4Miw2NDgzLCAgI2xhc3QgNTEyCikKClBLAwQUAAAAAAAAACEAfqv+j9oGAADaBgAAQAAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9nYjIzMTJwcm9iZXIucHkjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQkVHSU4gTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBUaGUgT3JpZ2luYWwgQ29kZSBpcyBtb3ppbGxhLm9yZyBjb2RlLgojCiMgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiMgTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24uCiMgUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMTk5OAojIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIwojIENvbnRyaWJ1dG9yKHMpOgojICAgTWFyayBQaWxncmltIC0gcG9ydCB0byBQeXRob24KIwojIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCiMgMDIxMTAtMTMwMSAgVVNBCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRU5EIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKZnJvbSAubWJjaGFyc2V0cHJvYmVyIGltcG9ydCBNdWx0aUJ5dGVDaGFyU2V0UHJvYmVyCmZyb20gLmNvZGluZ3N0YXRlbWFjaGluZSBpbXBvcnQgQ29kaW5nU3RhdGVNYWNoaW5lCmZyb20gLmNoYXJkaXN0cmlidXRpb24gaW1wb3J0IEdCMjMxMkRpc3RyaWJ1dGlvbkFuYWx5c2lzCmZyb20gLm1iY3NzbSBpbXBvcnQgR0IyMzEyX1NNX01PREVMCgpjbGFzcyBHQjIzMTJQcm9iZXIoTXVsdGlCeXRlQ2hhclNldFByb2Jlcik6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc3VwZXIoR0IyMzEyUHJvYmVyLCBzZWxmKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5jb2Rpbmdfc20gPSBDb2RpbmdTdGF0ZU1hY2hpbmUoR0IyMzEyX1NNX01PREVMKQogICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uX2FuYWx5emVyID0gR0IyMzEyRGlzdHJpYnV0aW9uQW5hbHlzaXMoKQogICAgICAgIHNlbGYucmVzZXQoKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGNoYXJzZXRfbmFtZShzZWxmKToKICAgICAgICByZXR1cm4gIkdCMjMxMiIKCiAgICBAcHJvcGVydHkKICAgIGRlZiBsYW5ndWFnZShzZWxmKToKICAgICAgICByZXR1cm4gIkNoaW5lc2UiClBLAwQUAAAAAAAAACEADSnTsg42AAAONgAAQAAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9oZWJyZXdwcm9iZXIucHkjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQkVHSU4gTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBUaGUgT3JpZ2luYWwgQ29kZSBpcyBNb3ppbGxhIFVuaXZlcnNhbCBjaGFyc2V0IGRldGVjdG9yIGNvZGUuCiMKIyBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKIyAgICAgICAgICBTaHkgU2hhbG9tCiMgUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAwNQojIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIwojIENvbnRyaWJ1dG9yKHMpOgojICAgTWFyayBQaWxncmltIC0gcG9ydCB0byBQeXRob24KIwojIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCiMgMDIxMTAtMTMwMSAgVVNBCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRU5EIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKZnJvbSAuY2hhcnNldHByb2JlciBpbXBvcnQgQ2hhclNldFByb2Jlcgpmcm9tIC5lbnVtcyBpbXBvcnQgUHJvYmluZ1N0YXRlCgojIFRoaXMgcHJvYmVyIGRvZXNuJ3QgYWN0dWFsbHkgcmVjb2duaXplIGEgbGFuZ3VhZ2Ugb3IgYSBjaGFyc2V0LgojIEl0IGlzIGEgaGVscGVyIHByb2JlciBmb3IgdGhlIHVzZSBvZiB0aGUgSGVicmV3IG1vZGVsIHByb2JlcnMKCiMjIyBHZW5lcmFsIGlkZWFzIG9mIHRoZSBIZWJyZXcgY2hhcnNldCByZWNvZ25pdGlvbiAjIyMKIwojIEZvdXIgbWFpbiBjaGFyc2V0cyBleGlzdCBpbiBIZWJyZXc6CiMgIklTTy04ODU5LTgiIC0gVmlzdWFsIEhlYnJldwojICJ3aW5kb3dzLTEyNTUiIC0gTG9naWNhbCBIZWJyZXcKIyAiSVNPLTg4NTktOC1JIiAtIExvZ2ljYWwgSGVicmV3CiMgIngtbWFjLWhlYnJldyIgLSA/PyBMb2dpY2FsIEhlYnJldyA/PwojCiMgQm90aCAiSVNPIiBjaGFyc2V0cyB1c2UgYSBjb21wbGV0ZWx5IGlkZW50aWNhbCBzZXQgb2YgY29kZSBwb2ludHMsIHdoZXJlYXMKIyAid2luZG93cy0xMjU1IiBhbmQgIngtbWFjLWhlYnJldyIgYXJlIHR3byBkaWZmZXJlbnQgcHJvcGVyIHN1cGVyc2V0cyBvZgojIHRoZXNlIGNvZGUgcG9pbnRzLiB3aW5kb3dzLTEyNTUgZGVmaW5lcyBhZGRpdGlvbmFsIGNoYXJhY3RlcnMgaW4gdGhlIHJhbmdlCiMgMHg4MC0weDlGIGFzIHNvbWUgbWlzYyBwdW5jdHVhdGlvbiBtYXJrcyBhcyB3ZWxsIGFzIHNvbWUgSGVicmV3LXNwZWNpZmljCiMgZGlhY3JpdGljcyBhbmQgYWRkaXRpb25hbCAnWWlkZGlzaCcgbGlnYXR1cmUgbGV0dGVycyBpbiB0aGUgcmFuZ2UgMHhjMC0weGQ2LgojIHgtbWFjLWhlYnJldyBkZWZpbmVzIHNpbWlsYXIgYWRkaXRpb25hbCBjb2RlIHBvaW50cyBidXQgd2l0aCBhIGRpZmZlcmVudAojIG1hcHBpbmcuCiMKIyBBcyBmYXIgYXMgYW4gYXZlcmFnZSBIZWJyZXcgdGV4dCB3aXRoIG5vIGRpYWNyaXRpY3MgaXMgY29uY2VybmVkLCBhbGwgZm91cgojIGNoYXJzZXRzIGFyZSBpZGVudGljYWwgd2l0aCByZXNwZWN0IHRvIGNvZGUgcG9pbnRzLiBNZWFuaW5nIHRoYXQgZm9yIHRoZQojIG1haW4gSGVicmV3IGFscGhhYmV0LCBhbGwgZm91ciBtYXAgdGhlIHNhbWUgdmFsdWVzIHRvIGFsbCAyNyBIZWJyZXcgbGV0dGVycwojIChpbmNsdWRpbmcgZmluYWwgbGV0dGVycykuCiMKIyBUaGUgZG9taW5hbnQgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZXNlIGNoYXJzZXRzIGlzIHRoZWlyIGRpcmVjdGlvbmFsaXR5LgojICJWaXN1YWwiIGRpcmVjdGlvbmFsaXR5IG1lYW5zIHRoYXQgdGhlIHRleHQgaXMgb3JkZXJlZCBhcyBpZiB0aGUgcmVuZGVyZXIgaXMKIyBub3QgYXdhcmUgb2YgYSBCSURJIHJlbmRlcmluZyBhbGdvcml0aG0uIFRoZSByZW5kZXJlciBzZWVzIHRoZSB0ZXh0IGFuZAojIGRyYXdzIGl0IGZyb20gbGVmdCB0byByaWdodC4gVGhlIHRleHQgaXRzZWxmIHdoZW4gb3JkZXJlZCBuYXR1cmFsbHkgaXMgcmVhZAojIGJhY2t3YXJkcy4gQSBidWZmZXIgb2YgVmlzdWFsIEhlYnJldyBnZW5lcmFsbHkgbG9va3MgbGlrZSBzbzoKIyAiW2xhc3Qgd29yZCBvZiBmaXJzdCBsaW5lIHNwZWxsZWQgYmFja3dhcmRzXSBbd2hvbGUgbGluZSBvcmRlcmVkIGJhY2t3YXJkcwojIGFuZCBzcGVsbGVkIGJhY2t3YXJkc10gW2ZpcnN0IHdvcmQgb2YgZmlyc3QgbGluZSBzcGVsbGVkIGJhY2t3YXJkc10KIyBbZW5kIG9mIGxpbmVdIFtsYXN0IHdvcmQgb2Ygc2Vjb25kIGxpbmVdIC4uLiBldGMnICIKIyBhZGRpbmcgcHVuY3R1YXRpb24gbWFya3MsIG51bWJlcnMgYW5kIEVuZ2xpc2ggdGV4dCB0byB2aXN1YWwgdGV4dCBpcwojIG5hdHVyYWxseSBhbHNvICJ2aXN1YWwiIGFuZCBmcm9tIGxlZnQgdG8gcmlnaHQuCiMKIyAiTG9naWNhbCIgZGlyZWN0aW9uYWxpdHkgbWVhbnMgdGhlIHRleHQgaXMgb3JkZXJlZCAibmF0dXJhbGx5IiBhY2NvcmRpbmcgdG8KIyB0aGUgb3JkZXIgaXQgaXMgcmVhZC4gSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSByZW5kZXJlciB0byBkaXNwbGF5CiMgdGhlIHRleHQgZnJvbSByaWdodCB0byBsZWZ0LiBBIEJJREkgYWxnb3JpdGhtIGlzIHVzZWQgdG8gcGxhY2UgZ2VuZXJhbAojIHB1bmN0dWF0aW9uIG1hcmtzLCBudW1iZXJzIGFuZCBFbmdsaXNoIHRleHQgaW4gdGhlIHRleHQuCiMKIyBUZXh0cyBpbiB4LW1hYy1oZWJyZXcgYXJlIGFsbW9zdCBpbXBvc3NpYmxlIHRvIGZpbmQgb24gdGhlIEludGVybmV0LiBGcm9tCiMgd2hhdCBsaXR0bGUgZXZpZGVuY2UgSSBjb3VsZCBmaW5kLCBpdCBzZWVtcyB0aGF0IGl0cyBnZW5lcmFsIGRpcmVjdGlvbmFsaXR5CiMgaXMgTG9naWNhbC4KIwojIFRvIHN1bSB1cCBhbGwgb2YgdGhlIGFib3ZlLCB0aGUgSGVicmV3IHByb2JpbmcgbWVjaGFuaXNtIGtub3dzIGFib3V0IHR3bwojIGNoYXJzZXRzOgojIFZpc3VhbCBIZWJyZXcgLSAiSVNPLTg4NTktOCIgLSBiYWNrd2FyZHMgdGV4dCAtIFdvcmRzIGFuZCBzZW50ZW5jZXMgYXJlCiMgICAgYmFja3dhcmRzIHdoaWxlIGxpbmUgb3JkZXIgaXMgbmF0dXJhbC4gRm9yIGNoYXJzZXQgcmVjb2duaXRpb24gcHVycG9zZXMKIyAgICB0aGUgbGluZSBvcmRlciBpcyB1bmltcG9ydGFudCAoSW4gZmFjdCwgZm9yIHRoaXMgaW1wbGVtZW50YXRpb24sIGV2ZW4KIyAgICB3b3JkIG9yZGVyIGlzIHVuaW1wb3J0YW50KS4KIyBMb2dpY2FsIEhlYnJldyAtICJ3aW5kb3dzLTEyNTUiIC0gbm9ybWFsLCBuYXR1cmFsbHkgb3JkZXJlZCB0ZXh0LgojCiMgIklTTy04ODU5LTgtSSIgaXMgYSBzdWJzZXQgb2Ygd2luZG93cy0xMjU1IGFuZCBkb2Vzbid0IG5lZWQgdG8gYmUKIyAgICBzcGVjaWZpY2FsbHkgaWRlbnRpZmllZC4KIyAieC1tYWMtaGVicmV3IiBpcyBhbHNvIGlkZW50aWZpZWQgYXMgd2luZG93cy0xMjU1LiBBIHRleHQgaW4geC1tYWMtaGVicmV3CiMgICAgdGhhdCBjb250YWluIHNwZWNpYWwgcHVuY3R1YXRpb24gbWFya3Mgb3IgZGlhY3JpdGljcyBpcyBkaXNwbGF5ZWQgd2l0aAojICAgIHNvbWUgdW5jb252ZXJ0ZWQgY2hhcmFjdGVycyBzaG93aW5nIGFzIHF1ZXN0aW9uIG1hcmtzLiBUaGlzIHByb2JsZW0gbWlnaHQKIyAgICBiZSBjb3JyZWN0ZWQgdXNpbmcgYW5vdGhlciBtb2RlbCBwcm9iZXIgZm9yIHgtbWFjLWhlYnJldy4gRHVlIHRvIHRoZSBmYWN0CiMgICAgdGhhdCB4LW1hYy1oZWJyZXcgdGV4dHMgYXJlIHNvIHJhcmUsIHdyaXRpbmcgYW5vdGhlciBtb2RlbCBwcm9iZXIgaXNuJ3QKIyAgICB3b3J0aCB0aGUgZWZmb3J0IGFuZCBwZXJmb3JtYW5jZSBoaXQuCiMKIyMjIyBUaGUgUHJvYmVyICMjIyMKIwojIFRoZSBwcm9iZXIgaXMgZGl2aWRlZCBiZXR3ZWVuIHR3byBTQkNoYXJTZXRQcm9iZXJzIGFuZCBhIEhlYnJld1Byb2JlciwKIyBhbGwgb2Ygd2hpY2ggYXJlIG1hbmFnZWQsIGNyZWF0ZWQsIGZlZCBkYXRhLCBpbnF1aXJlZCBhbmQgZGVsZXRlZCBieSB0aGUKIyBTQkNTR3JvdXBQcm9iZXIuIFRoZSB0d28gU0JDaGFyU2V0UHJvYmVycyBpZGVudGlmeSB0aGF0IHRoZSB0ZXh0IGlzIGluCiMgZmFjdCBzb21lIGtpbmQgb2YgSGVicmV3LCBMb2dpY2FsIG9yIFZpc3VhbC4gVGhlIGZpbmFsIGRlY2lzaW9uIGFib3V0IHdoaWNoCiMgb25lIGlzIGl0IGlzIG1hZGUgYnkgdGhlIEhlYnJld1Byb2JlciBieSBjb21iaW5pbmcgZmluYWwtbGV0dGVyIHNjb3JlcwojIHdpdGggdGhlIHNjb3JlcyBvZiB0aGUgdHdvIFNCQ2hhclNldFByb2JlcnMgdG8gcHJvZHVjZSBhIGZpbmFsIGFuc3dlci4KIwojIFRoZSBTQkNTR3JvdXBQcm9iZXIgaXMgcmVzcG9uc2libGUgZm9yIHN0cmlwcGluZyB0aGUgb3JpZ2luYWwgdGV4dCBvZiBIVE1MCiMgdGFncywgRW5nbGlzaCBjaGFyYWN0ZXJzLCBudW1iZXJzLCBsb3ctQVNDSUkgcHVuY3R1YXRpb24gY2hhcmFjdGVycywgc3BhY2VzCiMgYW5kIG5ldyBsaW5lcy4gSXQgcmVkdWNlcyBhbnkgc2VxdWVuY2Ugb2Ygc3VjaCBjaGFyYWN0ZXJzIHRvIGEgc2luZ2xlIHNwYWNlLgojIFRoZSBidWZmZXIgZmVkIHRvIGVhY2ggcHJvYmVyIGluIHRoZSBTQkNTIGdyb3VwIHByb2JlciBpcyBwdXJlIHRleHQgaW4KIyBoaWdoLUFTQ0lJLgojIFRoZSB0d28gU0JDaGFyU2V0UHJvYmVycyAobW9kZWwgcHJvYmVycykgc2hhcmUgdGhlIHNhbWUgbGFuZ3VhZ2UgbW9kZWw6CiMgV2luMTI1NU1vZGVsLgojIFRoZSBmaXJzdCBTQkNoYXJTZXRQcm9iZXIgdXNlcyB0aGUgbW9kZWwgbm9ybWFsbHkgYXMgYW55IG90aGVyCiMgU0JDaGFyU2V0UHJvYmVyIGRvZXMsIHRvIHJlY29nbml6ZSB3aW5kb3dzLTEyNTUsIHVwb24gd2hpY2ggdGhpcyBtb2RlbCB3YXMKIyBidWlsdC4gVGhlIHNlY29uZCBTQkNoYXJTZXRQcm9iZXIgaXMgdG9sZCB0byBtYWtlIHRoZSBwYWlyLW9mLWxldHRlcgojIGxvb2t1cCBpbiB0aGUgbGFuZ3VhZ2UgbW9kZWwgYmFja3dhcmRzLiBUaGlzIGluIHByYWN0aWNlIGV4YWN0bHkgc2ltdWxhdGVzCiMgYSB2aXN1YWwgSGVicmV3IG1vZGVsIHVzaW5nIHRoZSB3aW5kb3dzLTEyNTUgbG9naWNhbCBIZWJyZXcgbW9kZWwuCiMKIyBUaGUgSGVicmV3UHJvYmVyIGlzIG5vdCB1c2luZyBhbnkgbGFuZ3VhZ2UgbW9kZWwuIEFsbCBpdCBkb2VzIGlzIGxvb2sgZm9yCiMgZmluYWwtbGV0dGVyIGV2aWRlbmNlIHN1Z2dlc3RpbmcgdGhlIHRleHQgaXMgZWl0aGVyIGxvZ2ljYWwgSGVicmV3IG9yIHZpc3VhbAojIEhlYnJldy4gRGlzam9pbnRlZCBmcm9tIHRoZSBtb2RlbCBwcm9iZXJzLCB0aGUgcmVzdWx0cyBvZiB0aGUgSGVicmV3UHJvYmVyCiMgYWxvbmUgYXJlIG1lYW5pbmdsZXNzLiBIZWJyZXdQcm9iZXIgYWx3YXlzIHJldHVybnMgMC4wMCBhcyBjb25maWRlbmNlCiMgc2luY2UgaXQgbmV2ZXIgaWRlbnRpZmllcyBhIGNoYXJzZXQgYnkgaXRzZWxmLiBJbnN0ZWFkLCB0aGUgcG9pbnRlciB0byB0aGUKIyBIZWJyZXdQcm9iZXIgaXMgcGFzc2VkIHRvIHRoZSBtb2RlbCBwcm9iZXJzIGFzIGEgaGVscGVyICJOYW1lIFByb2JlciIuCiMgV2hlbiB0aGUgR3JvdXAgcHJvYmVyIHJlY2VpdmVzIGEgcG9zaXRpdmUgaWRlbnRpZmljYXRpb24gZnJvbSBhbnkgcHJvYmVyLAojIGl0IGFza3MgZm9yIHRoZSBuYW1lIG9mIHRoZSBjaGFyc2V0IGlkZW50aWZpZWQuIElmIHRoZSBwcm9iZXIgcXVlcmllZCBpcyBhCiMgSGVicmV3IG1vZGVsIHByb2JlciwgdGhlIG1vZGVsIHByb2JlciBmb3J3YXJkcyB0aGUgY2FsbCB0byB0aGUKIyBIZWJyZXdQcm9iZXIgdG8gbWFrZSB0aGUgZmluYWwgZGVjaXNpb24uIEluIHRoZSBIZWJyZXdQcm9iZXIsIHRoZQojIGRlY2lzaW9uIGlzIG1hZGUgYWNjb3JkaW5nIHRvIHRoZSBmaW5hbC1sZXR0ZXJzIHNjb3JlcyBtYWludGFpbmVkIGFuZCBCb3RoCiMgbW9kZWwgcHJvYmVycyBzY29yZXMuIFRoZSBhbnN3ZXIgaXMgcmV0dXJuZWQgaW4gdGhlIGZvcm0gb2YgdGhlIG5hbWUgb2YgdGhlCiMgY2hhcnNldCBpZGVudGlmaWVkLCBlaXRoZXIgIndpbmRvd3MtMTI1NSIgb3IgIklTTy04ODU5LTgiLgoKY2xhc3MgSGVicmV3UHJvYmVyKENoYXJTZXRQcm9iZXIpOgogICAgIyB3aW5kb3dzLTEyNTUgLyBJU08tODg1OS04IGNvZGUgcG9pbnRzIG9mIGludGVyZXN0CiAgICBGSU5BTF9LQUYgPSAweGVhCiAgICBOT1JNQUxfS0FGID0gMHhlYgogICAgRklOQUxfTUVNID0gMHhlZAogICAgTk9STUFMX01FTSA9IDB4ZWUKICAgIEZJTkFMX05VTiA9IDB4ZWYKICAgIE5PUk1BTF9OVU4gPSAweGYwCiAgICBGSU5BTF9QRSA9IDB4ZjMKICAgIE5PUk1BTF9QRSA9IDB4ZjQKICAgIEZJTkFMX1RTQURJID0gMHhmNQogICAgTk9STUFMX1RTQURJID0gMHhmNgoKICAgICMgTWluaW11bSBWaXN1YWwgdnMgTG9naWNhbCBmaW5hbCBsZXR0ZXIgc2NvcmUgZGlmZmVyZW5jZS4KICAgICMgSWYgdGhlIGRpZmZlcmVuY2UgaXMgYmVsb3cgdGhpcywgZG9uJ3QgcmVseSBzb2xlbHkgb24gdGhlIGZpbmFsIGxldHRlciBzY29yZQogICAgIyBkaXN0YW5jZS4KICAgIE1JTl9GSU5BTF9DSEFSX0RJU1RBTkNFID0gNQoKICAgICMgTWluaW11bSBWaXN1YWwgdnMgTG9naWNhbCBtb2RlbCBzY29yZSBkaWZmZXJlbmNlLgogICAgIyBJZiB0aGUgZGlmZmVyZW5jZSBpcyBiZWxvdyB0aGlzLCBkb24ndCByZWx5IGF0IGFsbCBvbiB0aGUgbW9kZWwgc2NvcmUKICAgICMgZGlzdGFuY2UuCiAgICBNSU5fTU9ERUxfRElTVEFOQ0UgPSAwLjAxCgogICAgVklTVUFMX0hFQlJFV19OQU1FID0gIklTTy04ODU5LTgiCiAgICBMT0dJQ0FMX0hFQlJFV19OQU1FID0gIndpbmRvd3MtMTI1NSIKCiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc3VwZXIoSGVicmV3UHJvYmVyLCBzZWxmKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5fZmluYWxfY2hhcl9sb2dpY2FsX3Njb3JlID0gTm9uZQogICAgICAgIHNlbGYuX2ZpbmFsX2NoYXJfdmlzdWFsX3Njb3JlID0gTm9uZQogICAgICAgIHNlbGYuX3ByZXYgPSBOb25lCiAgICAgICAgc2VsZi5fYmVmb3JlX3ByZXYgPSBOb25lCiAgICAgICAgc2VsZi5fbG9naWNhbF9wcm9iZXIgPSBOb25lCiAgICAgICAgc2VsZi5fdmlzdWFsX3Byb2JlciA9IE5vbmUKICAgICAgICBzZWxmLnJlc2V0KCkKCiAgICBkZWYgcmVzZXQoc2VsZik6CiAgICAgICAgc2VsZi5fZmluYWxfY2hhcl9sb2dpY2FsX3Njb3JlID0gMAogICAgICAgIHNlbGYuX2ZpbmFsX2NoYXJfdmlzdWFsX3Njb3JlID0gMAogICAgICAgICMgVGhlIHR3byBsYXN0IGNoYXJhY3RlcnMgc2VlbiBpbiB0aGUgcHJldmlvdXMgYnVmZmVyLAogICAgICAgICMgbVByZXYgYW5kIG1CZWZvcmVQcmV2IGFyZSBpbml0aWFsaXplZCB0byBzcGFjZSBpbiBvcmRlciB0byBzaW11bGF0ZQogICAgICAgICMgYSB3b3JkIGRlbGltaXRlciBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBkYXRhCiAgICAgICAgc2VsZi5fcHJldiA9ICcgJwogICAgICAgIHNlbGYuX2JlZm9yZV9wcmV2ID0gJyAnCiAgICAgICAgIyBUaGVzZSBwcm9iZXJzIGFyZSBvd25lZCBieSB0aGUgZ3JvdXAgcHJvYmVyLgoKICAgIGRlZiBzZXRfbW9kZWxfcHJvYmVycyhzZWxmLCBsb2dpY2FsUHJvYmVyLCB2aXN1YWxQcm9iZXIpOgogICAgICAgIHNlbGYuX2xvZ2ljYWxfcHJvYmVyID0gbG9naWNhbFByb2JlcgogICAgICAgIHNlbGYuX3Zpc3VhbF9wcm9iZXIgPSB2aXN1YWxQcm9iZXIKCiAgICBkZWYgaXNfZmluYWwoc2VsZiwgYyk6CiAgICAgICAgcmV0dXJuIGMgaW4gW3NlbGYuRklOQUxfS0FGLCBzZWxmLkZJTkFMX01FTSwgc2VsZi5GSU5BTF9OVU4sCiAgICAgICAgICAgICAgICAgICAgIHNlbGYuRklOQUxfUEUsIHNlbGYuRklOQUxfVFNBREldCgogICAgZGVmIGlzX25vbl9maW5hbChzZWxmLCBjKToKICAgICAgICAjIFRoZSBub3JtYWwgVHNhZGkgaXMgbm90IGEgZ29vZCBOb24tRmluYWwgbGV0dGVyIGR1ZSB0byB3b3JkcyBsaWtlCiAgICAgICAgIyAnbGVjaG90ZXQnICh0byBjaGF0KSBjb250YWluaW5nIGFuIGFwb3N0cm9waGUgYWZ0ZXIgdGhlIHRzYWRpLiBUaGlzCiAgICAgICAgIyBhcG9zdHJvcGhlIGlzIGNvbnZlcnRlZCB0byBhIHNwYWNlIGluIEZpbHRlcldpdGhvdXRFbmdsaXNoTGV0dGVycwogICAgICAgICMgY2F1c2luZyB0aGUgTm9uLUZpbmFsIHRzYWRpIHRvIGFwcGVhciBhdCBhbiBlbmQgb2YgYSB3b3JkIGV2ZW4KICAgICAgICAjIHRob3VnaCB0aGlzIGlzIG5vdCB0aGUgY2FzZSBpbiB0aGUgb3JpZ2luYWwgdGV4dC4KICAgICAgICAjIFRoZSBsZXR0ZXJzIFBlIGFuZCBLYWYgcmFyZWx5IGRpc3BsYXkgYSByZWxhdGVkIGJlaGF2aW9yIG9mIG5vdCBiZWluZwogICAgICAgICMgYSBnb29kIE5vbi1GaW5hbCBsZXR0ZXIuIFdvcmRzIGxpa2UgJ1BvcCcsICdXaW5hbXAnIGFuZCAnTXViYXJhaycKICAgICAgICAjIGZvciBleGFtcGxlIGxlZ2FsbHkgZW5kIHdpdGggYSBOb24tRmluYWwgUGUgb3IgS2FmLiBIb3dldmVyLCB0aGUKICAgICAgICAjIGJlbmVmaXQgb2YgdGhlc2UgbGV0dGVycyBhcyBOb24tRmluYWwgbGV0dGVycyBvdXR3ZWlnaHMgdGhlIGRhbWFnZQogICAgICAgICMgc2luY2UgdGhlc2Ugd29yZHMgYXJlIHF1aXRlIHJhcmUuCiAgICAgICAgcmV0dXJuIGMgaW4gW3NlbGYuTk9STUFMX0tBRiwgc2VsZi5OT1JNQUxfTUVNLAogICAgICAgICAgICAgICAgICAgICBzZWxmLk5PUk1BTF9OVU4sIHNlbGYuTk9STUFMX1BFXQoKICAgIGRlZiBmZWVkKHNlbGYsIGJ5dGVfc3RyKToKICAgICAgICAjIEZpbmFsIGxldHRlciBhbmFseXNpcyBmb3IgbG9naWNhbC12aXN1YWwgZGVjaXNpb24uCiAgICAgICAgIyBMb29rIGZvciBldmlkZW5jZSB0aGF0IHRoZSByZWNlaXZlZCBidWZmZXIgaXMgZWl0aGVyIGxvZ2ljYWwgSGVicmV3CiAgICAgICAgIyBvciB2aXN1YWwgSGVicmV3LgogICAgICAgICMgVGhlIGZvbGxvd2luZyBjYXNlcyBhcmUgY2hlY2tlZDoKICAgICAgICAjIDEpIEEgd29yZCBsb25nZXIgdGhhbiAxIGxldHRlciwgZW5kaW5nIHdpdGggYSBmaW5hbCBsZXR0ZXIuIFRoaXMgaXMKICAgICAgICAjICAgIGFuIGluZGljYXRpb24gdGhhdCB0aGUgdGV4dCBpcyBsYWlkIG91dCAibmF0dXJhbGx5IiBzaW5jZSB0aGUKICAgICAgICAjICAgIGZpbmFsIGxldHRlciByZWFsbHkgYXBwZWFycyBhdCB0aGUgZW5kLiArMSBmb3IgbG9naWNhbCBzY29yZS4KICAgICAgICAjIDIpIEEgd29yZCBsb25nZXIgdGhhbiAxIGxldHRlciwgZW5kaW5nIHdpdGggYSBOb24tRmluYWwgbGV0dGVyLiBJbgogICAgICAgICMgICAgbm9ybWFsIEhlYnJldywgd29yZHMgZW5kaW5nIHdpdGggS2FmLCBNZW0sIE51biwgUGUgb3IgVHNhZGksCiAgICAgICAgIyAgICBzaG91bGQgbm90IGVuZCB3aXRoIHRoZSBOb24tRmluYWwgZm9ybSBvZiB0aGF0IGxldHRlci4gRXhjZXB0aW9ucwogICAgICAgICMgICAgdG8gdGhpcyBydWxlIGFyZSBtZW50aW9uZWQgYWJvdmUgaW4gaXNOb25GaW5hbCgpLiBUaGlzIGlzIGFuCiAgICAgICAgIyAgICBpbmRpY2F0aW9uIHRoYXQgdGhlIHRleHQgaXMgbGFpZCBvdXQgYmFja3dhcmRzLiArMSBmb3IgdmlzdWFsCiAgICAgICAgIyAgICBzY29yZQogICAgICAgICMgMykgQSB3b3JkIGxvbmdlciB0aGFuIDEgbGV0dGVyLCBzdGFydGluZyB3aXRoIGEgZmluYWwgbGV0dGVyLiBGaW5hbAogICAgICAgICMgICAgbGV0dGVycyBzaG91bGQgbm90IGFwcGVhciBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgd29yZC4gVGhpcyBpcyBhbgogICAgICAgICMgICAgaW5kaWNhdGlvbiB0aGF0IHRoZSB0ZXh0IGlzIGxhaWQgb3V0IGJhY2t3YXJkcy4gKzEgZm9yIHZpc3VhbAogICAgICAgICMgICAgc2NvcmUuCiAgICAgICAgIwogICAgICAgICMgVGhlIHZpc3VhbCBzY29yZSBhbmQgbG9naWNhbCBzY29yZSBhcmUgYWNjdW11bGF0ZWQgdGhyb3VnaG91dCB0aGUKICAgICAgICAjIHRleHQgYW5kIGFyZSBmaW5hbGx5IGNoZWNrZWQgYWdhaW5zdCBlYWNoIG90aGVyIGluIEdldENoYXJTZXROYW1lKCkuCiAgICAgICAgIyBObyBjaGVja2luZyBmb3IgZmluYWwgbGV0dGVycyBpbiB0aGUgbWlkZGxlIG9mIHdvcmRzIGlzIGRvbmUgc2luY2UKICAgICAgICAjIHRoYXQgY2FzZSBpcyBub3QgYW4gaW5kaWNhdGlvbiBmb3IgZWl0aGVyIExvZ2ljYWwgb3IgVmlzdWFsIHRleHQuCiAgICAgICAgIwogICAgICAgICMgV2UgYXV0b21hdGljYWxseSBmaWx0ZXIgb3V0IGFsbCA3LWJpdCBjaGFyYWN0ZXJzIChyZXBsYWNlIHRoZW0gd2l0aAogICAgICAgICMgc3BhY2VzKSBzbyB0aGUgd29yZCBib3VuZGFyeSBkZXRlY3Rpb24gd29ya3MgcHJvcGVybHkuIFtNQVBdCgogICAgICAgIGlmIHNlbGYuc3RhdGUgPT0gUHJvYmluZ1N0YXRlLk5PVF9NRToKICAgICAgICAgICAgIyBCb3RoIG1vZGVsIHByb2JlcnMgc2F5IGl0J3Mgbm90IHRoZW0uIE5vIHJlYXNvbiB0byBjb250aW51ZS4KICAgICAgICAgICAgcmV0dXJuIFByb2JpbmdTdGF0ZS5OT1RfTUUKCiAgICAgICAgYnl0ZV9zdHIgPSBzZWxmLmZpbHRlcl9oaWdoX2J5dGVfb25seShieXRlX3N0cikKCiAgICAgICAgZm9yIGN1ciBpbiBieXRlX3N0cjoKICAgICAgICAgICAgaWYgY3VyID09ICcgJzoKICAgICAgICAgICAgICAgICMgV2Ugc3RhbmQgb24gYSBzcGFjZSAtIGEgd29yZCBqdXN0IGVuZGVkCiAgICAgICAgICAgICAgICBpZiBzZWxmLl9iZWZvcmVfcHJldiAhPSAnICc6CiAgICAgICAgICAgICAgICAgICAgIyBuZXh0LXRvLWxhc3QgY2hhciB3YXMgbm90IGEgc3BhY2Ugc28gc2VsZi5fcHJldiBpcyBub3QgYQogICAgICAgICAgICAgICAgICAgICMgMSBsZXR0ZXIgd29yZAogICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuaXNfZmluYWwoc2VsZi5fcHJldik6CiAgICAgICAgICAgICAgICAgICAgICAgICMgY2FzZSAoMSkgWy0yOm5vdCBzcGFjZV1bLTE6ZmluYWwgbGV0dGVyXVtjdXI6c3BhY2VdCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2ZpbmFsX2NoYXJfbG9naWNhbF9zY29yZSArPSAxCiAgICAgICAgICAgICAgICAgICAgZWxpZiBzZWxmLmlzX25vbl9maW5hbChzZWxmLl9wcmV2KToKICAgICAgICAgICAgICAgICAgICAgICAgIyBjYXNlICgyKSBbLTI6bm90IHNwYWNlXVstMTpOb24tRmluYWwgbGV0dGVyXVsKICAgICAgICAgICAgICAgICAgICAgICAgIyAgY3VyOnNwYWNlXQogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9maW5hbF9jaGFyX3Zpc3VhbF9zY29yZSArPSAxCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIE5vdCBzdGFuZGluZyBvbiBhIHNwYWNlCiAgICAgICAgICAgICAgICBpZiAoKHNlbGYuX2JlZm9yZV9wcmV2ID09ICcgJykgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgIChzZWxmLmlzX2ZpbmFsKHNlbGYuX3ByZXYpKSBhbmQgKGN1ciAhPSAnICcpKToKICAgICAgICAgICAgICAgICAgICAjIGNhc2UgKDMpIFstMjpzcGFjZV1bLTE6ZmluYWwgbGV0dGVyXVtjdXI6bm90IHNwYWNlXQogICAgICAgICAgICAgICAgICAgIHNlbGYuX2ZpbmFsX2NoYXJfdmlzdWFsX3Njb3JlICs9IDEKICAgICAgICAgICAgc2VsZi5fYmVmb3JlX3ByZXYgPSBzZWxmLl9wcmV2CiAgICAgICAgICAgIHNlbGYuX3ByZXYgPSBjdXIKCiAgICAgICAgIyBGb3JldmVyIGRldGVjdGluZywgdGlsbCB0aGUgZW5kIG9yIHVudGlsIGJvdGggbW9kZWwgcHJvYmVycyByZXR1cm4KICAgICAgICAjIFByb2JpbmdTdGF0ZS5OT1RfTUUgKGhhbmRsZWQgYWJvdmUpCiAgICAgICAgcmV0dXJuIFByb2JpbmdTdGF0ZS5ERVRFQ1RJTkcKCiAgICBAcHJvcGVydHkKICAgIGRlZiBjaGFyc2V0X25hbWUoc2VsZik6CiAgICAgICAgIyBNYWtlIHRoZSBkZWNpc2lvbjogaXMgaXQgTG9naWNhbCBvciBWaXN1YWw/CiAgICAgICAgIyBJZiB0aGUgZmluYWwgbGV0dGVyIHNjb3JlIGRpc3RhbmNlIGlzIGRvbWluYW50IGVub3VnaCwgcmVseSBvbiBpdC4KICAgICAgICBmaW5hbHN1YiA9IHNlbGYuX2ZpbmFsX2NoYXJfbG9naWNhbF9zY29yZSAtIHNlbGYuX2ZpbmFsX2NoYXJfdmlzdWFsX3Njb3JlCiAgICAgICAgaWYgZmluYWxzdWIgPj0gc2VsZi5NSU5fRklOQUxfQ0hBUl9ESVNUQU5DRToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuTE9HSUNBTF9IRUJSRVdfTkFNRQogICAgICAgIGlmIGZpbmFsc3ViIDw9IC1zZWxmLk1JTl9GSU5BTF9DSEFSX0RJU1RBTkNFOgogICAgICAgICAgICByZXR1cm4gc2VsZi5WSVNVQUxfSEVCUkVXX05BTUUKCiAgICAgICAgIyBJdCdzIG5vdCBkb21pbmFudCBlbm91Z2gsIHRyeSB0byByZWx5IG9uIHRoZSBtb2RlbCBzY29yZXMgaW5zdGVhZC4KICAgICAgICBtb2RlbHN1YiA9IChzZWxmLl9sb2dpY2FsX3Byb2Jlci5nZXRfY29uZmlkZW5jZSgpCiAgICAgICAgICAgICAgICAgICAgLSBzZWxmLl92aXN1YWxfcHJvYmVyLmdldF9jb25maWRlbmNlKCkpCiAgICAgICAgaWYgbW9kZWxzdWIgPiBzZWxmLk1JTl9NT0RFTF9ESVNUQU5DRToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuTE9HSUNBTF9IRUJSRVdfTkFNRQogICAgICAgIGlmIG1vZGVsc3ViIDwgLXNlbGYuTUlOX01PREVMX0RJU1RBTkNFOgogICAgICAgICAgICByZXR1cm4gc2VsZi5WSVNVQUxfSEVCUkVXX05BTUUKCiAgICAgICAgIyBTdGlsbCBubyBnb29kLCBiYWNrIHRvIGZpbmFsIGxldHRlciBkaXN0YW5jZSwgbWF5YmUgaXQnbGwgc2F2ZSB0aGUKICAgICAgICAjIGRheS4KICAgICAgICBpZiBmaW5hbHN1YiA8IDAuMDoKICAgICAgICAgICAgcmV0dXJuIHNlbGYuVklTVUFMX0hFQlJFV19OQU1FCgogICAgICAgICMgKGZpbmFsc3ViID4gMCAtIExvZ2ljYWwpIG9yIChkb24ndCBrbm93IHdoYXQgdG8gZG8pIGRlZmF1bHQgdG8KICAgICAgICAjIExvZ2ljYWwuCiAgICAgICAgcmV0dXJuIHNlbGYuTE9HSUNBTF9IRUJSRVdfTkFNRQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGxhbmd1YWdlKHNlbGYpOgogICAgICAgIHJldHVybiAnSGVicmV3JwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHN0YXRlKHNlbGYpOgogICAgICAgICMgUmVtYWluIGFjdGl2ZSBhcyBsb25nIGFzIGFueSBvZiB0aGUgbW9kZWwgcHJvYmVycyBhcmUgYWN0aXZlLgogICAgICAgIGlmIChzZWxmLl9sb2dpY2FsX3Byb2Jlci5zdGF0ZSA9PSBQcm9iaW5nU3RhdGUuTk9UX01FKSBhbmQgXAogICAgICAgICAgIChzZWxmLl92aXN1YWxfcHJvYmVyLnN0YXRlID09IFByb2JpbmdTdGF0ZS5OT1RfTUUpOgogICAgICAgICAgICByZXR1cm4gUHJvYmluZ1N0YXRlLk5PVF9NRQogICAgICAgIHJldHVybiBQcm9iaW5nU3RhdGUuREVURUNUSU5HClBLAwQUAAAAAAAAACEAwho5YbFkAACxZAAAOwAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9qaXNmcmVxLnB5IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEJFR0lOIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgVGhlIE9yaWdpbmFsIENvZGUgaXMgTW96aWxsYSBDb21tdW5pY2F0b3IgY2xpZW50IGNvZGUuCiMKIyBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKIyBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi4KIyBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAxOTk4CiMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgojCiMgQ29udHJpYnV0b3Iocyk6CiMgICBNYXJrIFBpbGdyaW0gLSBwb3J0IHRvIFB5dGhvbgojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKIyAwMjExMC0xMzAxICBVU0EKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFTkQgTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgojIFNhbXBsaW5nIGZyb20gYWJvdXQgMjBNIHRleHQgbWF0ZXJpYWxzIGluY2x1ZGUgbGl0ZXJhdHVyZSBhbmQgY29tcHV0ZXIgdGVjaG5vbG9neQojCiMgSmFwYW5lc2UgZnJlcXVlbmN5IHRhYmxlLCBhcHBsaWVkIHRvIGJvdGggUy1KSVMgYW5kIEVVQy1KUAojIFRoZXkgYXJlIHNvcnRlZCBpbiBvcmRlci4KCiMgMTI4ICAtLT4gMC43NzA5NAojIDI1NiAgLS0+IDAuODU3MTAKIyA1MTIgIC0tPiAwLjkyNjM1CiMgMTAyNCAtLT4gMC45NzEzMAojIDIwNDggLS0+IDAuOTk0MzEKIwojIElkZWFsIERpc3RyaWJ1dGlvbiBSYXRpbyA9IDAuOTI2MzUgLyAoMS0wLjkyNjM1KSA9IDEyLjU4CiMgUmFuZG9tIERpc3RyaWJ1dGlvbiBSYXRpb24gPSA1MTIgLyAoMjk2NSs2Mis4Mys4Ni01MTIpID0gMC4xOTEKIwojIFR5cGljYWwgRGlzdHJpYnV0aW9uIFJhdGlvLCAyNSUgb2YgSURSCgpKSVNfVFlQSUNBTF9ESVNUUklCVVRJT05fUkFUSU8gPSAzLjAKCiMgQ2hhciB0byBGcmVxT3JkZXIgdGFibGUgLApKSVNfVEFCTEVfU0laRSA9IDQzNjgKCkpJU19DSEFSX1RPX0ZSRVFfT1JERVIgPSAoCiAgNDAsICAgMSwgICA2LCAxODIsIDE1MiwgMTgwLCAyOTUsMjEyNywgMjg1LCAzODEsMzI5NSw0MzA0LDMwNjgsNDYwNiwzMTY1LDM1MTAsICMgICAxNgozNTExLDE4MjIsMjc4NSw0NjA3LDExOTMsMjIyNiw1MDcwLDQ2MDgsIDE3MSwyOTk2LDEyNDcsICAxOCwgMTc5LDUwNzEsIDg1NiwxNjYxLCAjICAgMzIKMTI2Miw1MDcyLCA2MTksIDEyNywzNDMxLDM1MTIsMzIzMCwxODk5LDE3MDAsIDIzMiwgMjI4LDEyOTQsMTI5OCwgMjg0LCAyODMsMjA0MSwgIyAgIDQ4CjIwNDIsMTA2MSwxMDYyLCAgNDgsICA0OSwgIDQ0LCAgNDUsIDQzMywgNDM0LDEwNDAsMTA0MSwgOTk2LCA3ODcsMjk5NywxMjU1LDQzMDUsICMgICA2NAoyMTA4LDQ2MDksMTY4NCwxNjQ4LDUwNzMsNTA3NCw1MDc1LDUwNzYsNTA3Nyw1MDc4LDM2ODcsNTA3OSw0NjEwLDUwODAsMzkyNywzOTI4LCAjICAgODAKNTA4MSwzMjk2LDM0MzIsIDI5MCwyMjg1LDE0NzEsMjE4Nyw1MDgyLDI1ODAsMjgyNSwxMzAzLDIxNDAsMTczOSwxNDQ1LDI2OTEsMzM3NSwgIyAgIDk2CjE2OTEsMzI5Nyw0MzA2LDQzMDcsNDYxMSwgNDUyLDMzNzYsMTE4MiwyNzEzLDM2ODgsMzA2OSw0MzA4LDUwODMsNTA4NCw1MDg1LDUwODYsICMgIDExMgo1MDg3LDUwODgsNTA4OSw1MDkwLDUwOTEsNTA5Miw1MDkzLDUwOTQsNTA5NSw1MDk2LDUwOTcsNTA5OCw1MDk5LDUxMDAsNTEwMSw1MTAyLCAjICAxMjgKNTEwMyw1MTA0LDUxMDUsNTEwNiw1MTA3LDUxMDgsNTEwOSw1MTEwLDUxMTEsNTExMiw0MDk3LDUxMTMsNTExNCw1MTE1LDUxMTYsNTExNywgIyAgMTQ0CjUxMTgsNTExOSw1MTIwLDUxMjEsNTEyMiw1MTIzLDUxMjQsNTEyNSw1MTI2LDUxMjcsNTEyOCw1MTI5LDUxMzAsNTEzMSw1MTMyLDUxMzMsICMgIDE2MAo1MTM0LDUxMzUsNTEzNiw1MTM3LDUxMzgsNTEzOSw1MTQwLDUxNDEsNTE0Miw1MTQzLDUxNDQsNTE0NSw1MTQ2LDUxNDcsNTE0OCw1MTQ5LCAjICAxNzYKNTE1MCw1MTUxLDUxNTIsNDYxMiw1MTUzLDUxNTQsNTE1NSw1MTU2LDUxNTcsNTE1OCw1MTU5LDUxNjAsNTE2MSw1MTYyLDUxNjMsNTE2NCwgIyAgMTkyCjUxNjUsNTE2Niw1MTY3LDUxNjgsNTE2OSw1MTcwLDUxNzEsNTE3Miw1MTczLDUxNzQsNTE3NSwxNDcyLCA1OTgsIDYxOCwgODIwLDEyMDUsICMgIDIwOAoxMzA5LDE0MTIsMTg1OCwxMzA3LDE2OTIsNTE3Niw1MTc3LDUxNzgsNTE3OSw1MTgwLDUxODEsNTE4MiwxMTQyLDE0NTIsMTIzNCwxMTcyLCAjICAyMjQKMTg3NSwyMDQzLDIxNDksMTc5MywxMzgyLDI5NzMsIDkyNSwyNDA0LDEwNjcsMTI0MSwgOTYwLDEzNzcsMjkzNSwxNDkxLCA5MTksMTIxNywgIyAgMjQwCjE4NjUsMjAzMCwxNDA2LDE0OTksMjc0OSw0MDk4LDUxODMsNTE4NCw1MTg1LDUxODYsNTE4Nyw1MTg4LDI1NjEsNDA5OSwzMTE3LDE4MDQsICMgIDI1NgoyMDQ5LDM2ODksNDMwOSwzNTEzLDE2NjMsNTE4OSwzMTY2LDMxMTgsMzI5OCwxNTg3LDE1NjEsMzQzMyw1MTkwLDMxMTksMTYyNSwyOTk4LCAjICAyNzIKMzI5OSw0NjEzLDE3NjYsMzY5MCwyNzg2LDQ2MTQsNTE5MSw1MTkyLDUxOTMsNTE5NCwyMTYxLCAgMjYsMzM3NywgICAyLDM5MjksICAyMCwgIyAgMjg4CjM2OTEsICA0Nyw0MTAwLCAgNTAsICAxNywgIDE2LCAgMzUsIDI2OCwgIDI3LCAyNDMsICA0MiwgMTU1LCAgMjQsIDE1NCwgIDI5LCAxODQsICMgIDMwNAogICA0LCAgOTEsICAxNCwgIDkyLCAgNTMsIDM5NiwgIDMzLCAyODksICAgOSwgIDM3LCAgNjQsIDYyMCwgIDIxLCAgMzksIDMyMSwgICA1LCAjICAzMjAKICAxMiwgIDExLCAgNTIsICAxMywgICAzLCAyMDgsIDEzOCwgICAwLCAgIDcsICA2MCwgNTI2LCAxNDEsIDE1MSwxMDY5LCAxODEsIDI3NSwgIyAgMzM2CjE1OTEsICA4MywgMTMyLDE0NzUsIDEyNiwgMzMxLCA4MjksICAxNSwgIDY5LCAxNjAsICA1OSwgIDIyLCAxNTcsICA1NSwxMDc5LCAzMTIsICMgIDM1MgogMTA5LCAgMzgsICAyMywgIDI1LCAgMTAsICAxOSwgIDc5LDUxOTUsICA2MSwgMzgyLDExMjQsICAgOCwgIDMwLDUxOTYsNTE5Nyw1MTk4LCAjICAzNjgKNTE5OSw1MjAwLDUyMDEsNTIwMiw1MjAzLDUyMDQsNTIwNSw1MjA2LCAgODksICA2MiwgIDc0LCAgMzQsMjQxNiwgMTEyLCAxMzksIDE5NiwgIyAgMzg0CiAyNzEsIDE0OSwgIDg0LCA2MDcsIDEzMSwgNzY1LCAgNDYsICA4OCwgMTUzLCA2ODMsICA3NiwgODc0LCAxMDEsIDI1OCwgIDU3LCAgODAsICMgIDQwMAogIDMyLCAzNjQsIDEyMSwxNTA4LCAxNjksMTU0NywgIDY4LCAyMzUsIDE0NSwyOTk5LCAgNDEsIDM2MCwzMDI3LCAgNzAsICA2MywgIDMxLCAjICA0MTYKICA0MywgMjU5LCAyNjIsMTM4MywgIDk5LCA1MzMsIDE5NCwgIDY2LCAgOTMsIDg0NiwgMjE3LCAxOTIsICA1NiwgMTA2LCAgNTgsIDU2NSwgIyAgNDMyCiAyODAsIDI3MiwgMzExLCAyNTYsIDE0NiwgIDgyLCAzMDgsICA3MSwgMTAwLCAxMjgsIDIxNCwgNjU1LCAxMTAsIDI2MSwgMTA0LDExNDAsICMgIDQ0OAogIDU0LCAgNTEsICAzNiwgIDg3LCAgNjcsMzA3MCwgMTg1LDI2MTgsMjkzNiwyMDIwLCAgMjgsMTA2NiwyMzkwLDIwNTksNTIwNyw1MjA4LCAjICA0NjQKNTIwOSw1MjEwLDUyMTEsNTIxMiw1MjEzLDUyMTQsNTIxNSw1MjE2LDQ2MTUsNTIxNyw1MjE4LDUyMTksNTIyMCw1MjIxLDUyMjIsNTIyMywgIyAgNDgwCjUyMjQsNTIyNSw1MjI2LDUyMjcsNTIyOCw1MjI5LDUyMzAsNTIzMSw1MjMyLDUyMzMsNTIzNCw1MjM1LDUyMzYsMzUxNCw1MjM3LDUyMzgsICMgIDQ5Ngo1MjM5LDUyNDAsNTI0MSw1MjQyLDUyNDMsNTI0NCwyMjk3LDIwMzEsNDYxNiw0MzEwLDM2OTIsNTI0NSwzMDcxLDUyNDYsMzU5OCw1MjQ3LCAjICA1MTIKNDYxNywzMjMxLDM1MTUsNTI0OCw0MTAxLDQzMTEsNDYxOCwzODA4LDQzMTIsNDEwMiw1MjQ5LDQxMDMsNDEwNCwzNTk5LDUyNTAsNTI1MSwgIyAgNTI4CjUyNTIsNTI1Myw1MjU0LDUyNTUsNTI1Niw1MjU3LDUyNTgsNTI1OSw1MjYwLDUyNjEsNTI2Miw1MjYzLDUyNjQsNTI2NSw1MjY2LDUyNjcsICMgIDU0NAo1MjY4LDUyNjksNTI3MCw1MjcxLDUyNzIsNTI3Myw1Mjc0LDUyNzUsNTI3Niw1Mjc3LDUyNzgsNTI3OSw1MjgwLDUyODEsNTI4Miw1MjgzLCAjICA1NjAKNTI4NCw1Mjg1LDUyODYsNTI4Nyw1Mjg4LDUyODksNTI5MCw1MjkxLDUyOTIsNTI5Myw1Mjk0LDUyOTUsNTI5Niw1Mjk3LDUyOTgsNTI5OSwgIyAgNTc2CjUzMDAsNTMwMSw1MzAyLDUzMDMsNTMwNCw1MzA1LDUzMDYsNTMwNyw1MzA4LDUzMDksNTMxMCw1MzExLDUzMTIsNTMxMyw1MzE0LDUzMTUsICMgIDU5Mgo1MzE2LDUzMTcsNTMxOCw1MzE5LDUzMjAsNTMyMSw1MzIyLDUzMjMsNTMyNCw1MzI1LDUzMjYsNTMyNyw1MzI4LDUzMjksNTMzMCw1MzMxLCAjICA2MDgKNTMzMiw1MzMzLDUzMzQsNTMzNSw1MzM2LDUzMzcsNTMzOCw1MzM5LDUzNDAsNTM0MSw1MzQyLDUzNDMsNTM0NCw1MzQ1LDUzNDYsNTM0NywgIyAgNjI0CjUzNDgsNTM0OSw1MzUwLDUzNTEsNTM1Miw1MzUzLDUzNTQsNTM1NSw1MzU2LDUzNTcsNTM1OCw1MzU5LDUzNjAsNTM2MSw1MzYyLDUzNjMsICMgIDY0MAo1MzY0LDUzNjUsNTM2Niw1MzY3LDUzNjgsNTM2OSw1MzcwLDUzNzEsNTM3Miw1MzczLDUzNzQsNTM3NSw1Mzc2LDUzNzcsNTM3OCw1Mzc5LCAjICA2NTYKNTM4MCw1MzgxLCAzNjMsIDY0MiwyNzg3LDI4NzgsMjc4OCwyNzg5LDIzMTYsMzIzMiwyMzE3LDM0MzQsMjAxMSwgMTY1LDE5NDIsMzkzMCwgIyAgNjcyCjM5MzEsMzkzMiwzOTMzLDUzODIsNDYxOSw1MzgzLDQ2MjAsNTM4NCw1Mzg1LDUzODYsNTM4Nyw1Mzg4LDUzODksNTM5MCw1MzkxLDUzOTIsICMgIDY4OAo1MzkzLDUzOTQsNTM5NSw1Mzk2LDUzOTcsNTM5OCw1Mzk5LDU0MDAsNTQwMSw1NDAyLDU0MDMsNTQwNCw1NDA1LDU0MDYsNTQwNyw1NDA4LCAjICA3MDQKNTQwOSw1NDEwLDU0MTEsNTQxMiw1NDEzLDU0MTQsNTQxNSw1NDE2LDU0MTcsNTQxOCw1NDE5LDU0MjAsNTQyMSw1NDIyLDU0MjMsNTQyNCwgIyAgNzIwCjU0MjUsNTQyNiw1NDI3LDU0MjgsNTQyOSw1NDMwLDU0MzEsNTQzMiw1NDMzLDU0MzQsNTQzNSw1NDM2LDU0MzcsNTQzOCw1NDM5LDU0NDAsICMgIDczNgo1NDQxLDU0NDIsNTQ0Myw1NDQ0LDU0NDUsNTQ0Niw1NDQ3LDU0NDgsNTQ0OSw1NDUwLDU0NTEsNTQ1Miw1NDUzLDU0NTQsNTQ1NSw1NDU2LCAjICA3NTIKNTQ1Nyw1NDU4LDU0NTksNTQ2MCw1NDYxLDU0NjIsNTQ2Myw1NDY0LDU0NjUsNTQ2Niw1NDY3LDU0NjgsNTQ2OSw1NDcwLDU0NzEsNTQ3MiwgIyAgNzY4CjU0NzMsNTQ3NCw1NDc1LDU0NzYsNTQ3Nyw1NDc4LDU0NzksNTQ4MCw1NDgxLDU0ODIsNTQ4Myw1NDg0LDU0ODUsNTQ4Niw1NDg3LDU0ODgsICMgIDc4NAo1NDg5LDU0OTAsNTQ5MSw1NDkyLDU0OTMsNTQ5NCw1NDk1LDU0OTYsNTQ5Nyw1NDk4LDU0OTksNTUwMCw1NTAxLDU1MDIsNTUwMyw1NTA0LCAjICA4MDAKNTUwNSw1NTA2LDU1MDcsNTUwOCw1NTA5LDU1MTAsNTUxMSw1NTEyLDU1MTMsNTUxNCw1NTE1LDU1MTYsNTUxNyw1NTE4LDU1MTksNTUyMCwgIyAgODE2CjU1MjEsNTUyMiw1NTIzLDU1MjQsNTUyNSw1NTI2LDU1MjcsNTUyOCw1NTI5LDU1MzAsNTUzMSw1NTMyLDU1MzMsNTUzNCw1NTM1LDU1MzYsICMgIDgzMgo1NTM3LDU1MzgsNTUzOSw1NTQwLDU1NDEsNTU0Miw1NTQzLDU1NDQsNTU0NSw1NTQ2LDU1NDcsNTU0OCw1NTQ5LDU1NTAsNTU1MSw1NTUyLCAjICA4NDgKNTU1Myw1NTU0LDU1NTUsNTU1Niw1NTU3LDU1NTgsNTU1OSw1NTYwLDU1NjEsNTU2Miw1NTYzLDU1NjQsNTU2NSw1NTY2LDU1NjcsNTU2OCwgIyAgODY0CjU1NjksNTU3MCw1NTcxLDU1NzIsNTU3Myw1NTc0LDU1NzUsNTU3Niw1NTc3LDU1NzgsNTU3OSw1NTgwLDU1ODEsNTU4Miw1NTgzLDU1ODQsICMgIDg4MAo1NTg1LDU1ODYsNTU4Nyw1NTg4LDU1ODksNTU5MCw1NTkxLDU1OTIsNTU5Myw1NTk0LDU1OTUsNTU5Niw1NTk3LDU1OTgsNTU5OSw1NjAwLCAjICA4OTYKNTYwMSw1NjAyLDU2MDMsNTYwNCw1NjA1LDU2MDYsNTYwNyw1NjA4LDU2MDksNTYxMCw1NjExLDU2MTIsNTYxMyw1NjE0LDU2MTUsNTYxNiwgIyAgOTEyCjU2MTcsNTYxOCw1NjE5LDU2MjAsNTYyMSw1NjIyLDU2MjMsNTYyNCw1NjI1LDU2MjYsNTYyNyw1NjI4LDU2MjksNTYzMCw1NjMxLDU2MzIsICMgIDkyOAo1NjMzLDU2MzQsNTYzNSw1NjM2LDU2MzcsNTYzOCw1NjM5LDU2NDAsNTY0MSw1NjQyLDU2NDMsNTY0NCw1NjQ1LDU2NDYsNTY0Nyw1NjQ4LCAjICA5NDQKNTY0OSw1NjUwLDU2NTEsNTY1Miw1NjUzLDU2NTQsNTY1NSw1NjU2LDU2NTcsNTY1OCw1NjU5LDU2NjAsNTY2MSw1NjYyLDU2NjMsNTY2NCwgIyAgOTYwCjU2NjUsNTY2Niw1NjY3LDU2NjgsNTY2OSw1NjcwLDU2NzEsNTY3Miw1NjczLDU2NzQsNTY3NSw1Njc2LDU2NzcsNTY3OCw1Njc5LDU2ODAsICMgIDk3Ngo1NjgxLDU2ODIsNTY4Myw1Njg0LDU2ODUsNTY4Niw1Njg3LDU2ODgsNTY4OSw1NjkwLDU2OTEsNTY5Miw1NjkzLDU2OTQsNTY5NSw1Njk2LCAjICA5OTIKNTY5Nyw1Njk4LDU2OTksNTcwMCw1NzAxLDU3MDIsNTcwMyw1NzA0LDU3MDUsNTcwNiw1NzA3LDU3MDgsNTcwOSw1NzEwLDU3MTEsNTcxMiwgIyAxMDA4CjU3MTMsNTcxNCw1NzE1LDU3MTYsNTcxNyw1NzE4LDU3MTksNTcyMCw1NzIxLDU3MjIsNTcyMyw1NzI0LDU3MjUsNTcyNiw1NzI3LDU3MjgsICMgMTAyNAo1NzI5LDU3MzAsNTczMSw1NzMyLDU3MzMsNTczNCw1NzM1LDU3MzYsNTczNyw1NzM4LDU3MzksNTc0MCw1NzQxLDU3NDIsNTc0Myw1NzQ0LCAjIDEwNDAKNTc0NSw1NzQ2LDU3NDcsNTc0OCw1NzQ5LDU3NTAsNTc1MSw1NzUyLDU3NTMsNTc1NCw1NzU1LDU3NTYsNTc1Nyw1NzU4LDU3NTksNTc2MCwgIyAxMDU2CjU3NjEsNTc2Miw1NzYzLDU3NjQsNTc2NSw1NzY2LDU3NjcsNTc2OCw1NzY5LDU3NzAsNTc3MSw1NzcyLDU3NzMsNTc3NCw1Nzc1LDU3NzYsICMgMTA3Mgo1Nzc3LDU3NzgsNTc3OSw1NzgwLDU3ODEsNTc4Miw1NzgzLDU3ODQsNTc4NSw1Nzg2LDU3ODcsNTc4OCw1Nzg5LDU3OTAsNTc5MSw1NzkyLCAjIDEwODgKNTc5Myw1Nzk0LDU3OTUsNTc5Niw1Nzk3LDU3OTgsNTc5OSw1ODAwLDU4MDEsNTgwMiw1ODAzLDU4MDQsNTgwNSw1ODA2LDU4MDcsNTgwOCwgIyAxMTA0CjU4MDksNTgxMCw1ODExLDU4MTIsNTgxMyw1ODE0LDU4MTUsNTgxNiw1ODE3LDU4MTgsNTgxOSw1ODIwLDU4MjEsNTgyMiw1ODIzLDU4MjQsICMgMTEyMAo1ODI1LDU4MjYsNTgyNyw1ODI4LDU4MjksNTgzMCw1ODMxLDU4MzIsNTgzMyw1ODM0LDU4MzUsNTgzNiw1ODM3LDU4MzgsNTgzOSw1ODQwLCAjIDExMzYKNTg0MSw1ODQyLDU4NDMsNTg0NCw1ODQ1LDU4NDYsNTg0Nyw1ODQ4LDU4NDksNTg1MCw1ODUxLDU4NTIsNTg1Myw1ODU0LDU4NTUsNTg1NiwgIyAxMTUyCjU4NTcsNTg1OCw1ODU5LDU4NjAsNTg2MSw1ODYyLDU4NjMsNTg2NCw1ODY1LDU4NjYsNTg2Nyw1ODY4LDU4NjksNTg3MCw1ODcxLDU4NzIsICMgMTE2OAo1ODczLDU4NzQsNTg3NSw1ODc2LDU4NzcsNTg3OCw1ODc5LDU4ODAsNTg4MSw1ODgyLDU4ODMsNTg4NCw1ODg1LDU4ODYsNTg4Nyw1ODg4LCAjIDExODQKNTg4OSw1ODkwLDU4OTEsNTg5Miw1ODkzLDU4OTQsNTg5NSw1ODk2LDU4OTcsNTg5OCw1ODk5LDU5MDAsNTkwMSw1OTAyLDU5MDMsNTkwNCwgIyAxMjAwCjU5MDUsNTkwNiw1OTA3LDU5MDgsNTkwOSw1OTEwLDU5MTEsNTkxMiw1OTEzLDU5MTQsNTkxNSw1OTE2LDU5MTcsNTkxOCw1OTE5LDU5MjAsICMgMTIxNgo1OTIxLDU5MjIsNTkyMyw1OTI0LDU5MjUsNTkyNiw1OTI3LDU5MjgsNTkyOSw1OTMwLDU5MzEsNTkzMiw1OTMzLDU5MzQsNTkzNSw1OTM2LCAjIDEyMzIKNTkzNyw1OTM4LDU5MzksNTk0MCw1OTQxLDU5NDIsNTk0Myw1OTQ0LDU5NDUsNTk0Niw1OTQ3LDU5NDgsNTk0OSw1OTUwLDU5NTEsNTk1MiwgIyAxMjQ4CjU5NTMsNTk1NCw1OTU1LDU5NTYsNTk1Nyw1OTU4LDU5NTksNTk2MCw1OTYxLDU5NjIsNTk2Myw1OTY0LDU5NjUsNTk2Niw1OTY3LDU5NjgsICMgMTI2NAo1OTY5LDU5NzAsNTk3MSw1OTcyLDU5NzMsNTk3NCw1OTc1LDU5NzYsNTk3Nyw1OTc4LDU5NzksNTk4MCw1OTgxLDU5ODIsNTk4Myw1OTg0LCAjIDEyODAKNTk4NSw1OTg2LDU5ODcsNTk4OCw1OTg5LDU5OTAsNTk5MSw1OTkyLDU5OTMsNTk5NCw1OTk1LDU5OTYsNTk5Nyw1OTk4LDU5OTksNjAwMCwgIyAxMjk2CjYwMDEsNjAwMiw2MDAzLDYwMDQsNjAwNSw2MDA2LDYwMDcsNjAwOCw2MDA5LDYwMTAsNjAxMSw2MDEyLDYwMTMsNjAxNCw2MDE1LDYwMTYsICMgMTMxMgo2MDE3LDYwMTgsNjAxOSw2MDIwLDYwMjEsNjAyMiw2MDIzLDYwMjQsNjAyNSw2MDI2LDYwMjcsNjAyOCw2MDI5LDYwMzAsNjAzMSw2MDMyLCAjIDEzMjgKNjAzMyw2MDM0LDYwMzUsNjAzNiw2MDM3LDYwMzgsNjAzOSw2MDQwLDYwNDEsNjA0Miw2MDQzLDYwNDQsNjA0NSw2MDQ2LDYwNDcsNjA0OCwgIyAxMzQ0CjYwNDksNjA1MCw2MDUxLDYwNTIsNjA1Myw2MDU0LDYwNTUsNjA1Niw2MDU3LDYwNTgsNjA1OSw2MDYwLDYwNjEsNjA2Miw2MDYzLDYwNjQsICMgMTM2MAo2MDY1LDYwNjYsNjA2Nyw2MDY4LDYwNjksNjA3MCw2MDcxLDYwNzIsNjA3Myw2MDc0LDYwNzUsNjA3Niw2MDc3LDYwNzgsNjA3OSw2MDgwLCAjIDEzNzYKNjA4MSw2MDgyLDYwODMsNjA4NCw2MDg1LDYwODYsNjA4Nyw2MDg4LDYwODksNjA5MCw2MDkxLDYwOTIsNjA5Myw2MDk0LDYwOTUsNjA5NiwgIyAxMzkyCjYwOTcsNjA5OCw2MDk5LDYxMDAsNjEwMSw2MTAyLDYxMDMsNjEwNCw2MTA1LDYxMDYsNjEwNyw2MTA4LDYxMDksNjExMCw2MTExLDYxMTIsICMgMTQwOAo2MTEzLDYxMTQsMjA0NCwyMDYwLDQ2MjEsIDk5NywxMjM1LCA0NzMsMTE4Niw0NjIyLCA5MjAsMzM3OCw2MTE1LDYxMTYsIDM3OSwxMTA4LCAjIDE0MjQKNDMxMywyNjU3LDI3MzUsMzkzNCw2MTE3LDM4MDksIDYzNiwzMjMzLCA1NzMsMTAyNiwzNjkzLDM0MzUsMjk3NCwzMzAwLDIyOTgsNDEwNSwgIyAxNDQwCiA4NTQsMjkzNywyNDYzLCAzOTMsMjU4MSwyNDE3LCA1MzksIDc1MiwxMjgwLDI3NTAsMjQ4MCwgMTQwLDExNjEsIDQ0MCwgNzA4LDE1NjksICMgMTQ1NgogNjY1LDI0OTcsMTc0NiwxMjkxLDE1MjMsMzAwMCwgMTY0LDE2MDMsIDg0NywxMzMxLCA1MzcsMTk5NywgNDg2LCA1MDgsMTY5MywyNDE4LCAjIDE0NzIKMTk3MCwyMjI3LCA4NzgsMTIyMCwgMjk5LDEwMzAsIDk2OSwgNjUyLDI3NTEsIDYyNCwxMTM3LDMzMDEsMjYxOSwgIDY1LDMzMDIsMjA0NSwgIyAxNDg4CjE3NjEsMTg1OSwzMTIwLDE5MzAsMzY5NCwzNTE2LCA2NjMsMTc2NywgODUyLCA4MzUsMzY5NSwgMjY5LCA3NjcsMjgyNiwyMzM5LDEzMDUsICMgMTUwNAogODk2LDExNTAsIDc3MCwxNjE2LDYxMTgsIDUwNiwxNTAyLDIwNzUsMTAxMiwyNTE5LCA3NzUsMjUyMCwyOTc1LDIzNDAsMjkzOCw0MzE0LCAjIDE1MjAKMzAyOCwyMDg2LDEyMjQsMTk0MywyMjg2LDYxMTksMzA3Miw0MzE1LDIyNDAsMTI3MywxOTg3LDM5MzUsMTU1NywgMTc1LCA1OTcsIDk4NSwgIyAxNTM2CjM1MTcsMjQxOSwyNTIxLDE0MTYsMzAyOSwgNTg1LCA5MzgsMTkzMSwxMDA3LDEwNTIsMTkzMiwxNjg1LDYxMjAsMzM3OSw0MzE2LDQ2MjMsICMgMTU1MgogODA0LCA1OTksMzEyMSwxMzMzLDIxMjgsMjUzOSwxMTU5LDE1NTQsMjAzMiwzODEwLCA2ODcsMjAzMywyOTA0LCA5NTIsIDY3NSwxNDY3LCAjIDE1NjgKMzQzNiw2MTIxLDIyNDEsMTA5NiwxNzg2LDI0NDAsMTU0MywxOTI0LCA5ODAsMTgxMywyMjI4LCA3ODEsMjY5MiwxODc5LCA3MjgsMTkxOCwgIyAxNTg0CjM2OTYsNDYyNCwgNTQ4LDE5NTAsNDYyNSwxODA5LDEwODgsMTM1NiwzMzAzLDI1MjIsMTk0NCwgNTAyLCA5NzIsIDM3MywgNTEzLDI4MjcsICMgMTYwMAogNTg2LDIzNzcsMjM5MSwxMDAzLDE5NzYsMTYzMSw2MTIyLDI0NjQsMTA4NCwgNjQ4LDE3NzYsNDYyNiwyMTQxLCAzMjQsIDk2MiwyMDEyLCAjIDE2MTYKMjE3NywyMDc2LDEzODQsIDc0MiwyMTc4LDE0NDgsMTE3MywxODEwLCAyMjIsIDEwMiwgMzAxLCA0NDUsIDEyNSwyNDIwLCA2NjIsMjQ5OCwgIyAxNjMyCiAyNzcsIDIwMCwxNDc2LDExNjUsMTA2OCwgMjI0LDI1NjIsMTM3OCwxNDQ2LCA0NTAsMTg4MCwgNjU5LCA3OTEsIDU4Miw0NjI3LDI5MzksICMgMTY0OAozOTM2LDE1MTYsMTI3NCwgNTU1LDIwOTksMzY5NywxMDIwLDEzODksMTUyNiwzMzgwLDE3NjIsMTcyMywxNzg3LDIyMjksIDQxMiwyMTE0LCAjIDE2NjQKMTkwMCwyMzkyLDM1MTgsIDUxMiwyNTk3LCA0MjcsMTkyNSwyMzQxLDMxMjIsMTY1MywxNjg2LDI0NjUsMjQ5OSwgNjk3LCAzMzAsIDI3MywgIyAxNjgwCiAzODAsMjE2MiwgOTUxLCA4MzIsIDc4MCwgOTkxLDEzMDEsMzA3MywgOTY1LDIyNzAsMzUxOSwgNjY4LDI1MjMsMjYzNiwxMjg2LCA1MzUsICMgMTY5NgoxNDA3LCA1MTgsIDY3MSwgOTU3LDI2NTgsMjM3OCwgMjY3LCA2MTEsMjE5NywzMDMwLDYxMjMsIDI0OCwyMjk5LCA5NjcsMTc5OSwyMzU2LCAjIDE3MTIKIDg1MCwxNDE4LDM0MzcsMTg3NiwxMjU2LDE0ODAsMjgyOCwxNzE4LDYxMjQsNjEyNSwxNzU1LDE2NjQsMjQwNSw2MTI2LDQ2MjgsMjg3OSwgIyAxNzI4CjI4MjksIDQ5OSwyMTc5LCA2NzYsNDYyOSwgNTU3LDIzMjksMjIxNCwyMDkwLCAzMjUsMzIzNCwgNDY0LCA4MTEsMzAwMSwgOTkyLDIzNDIsICMgMTc0NAoyNDgxLDEyMzIsMTQ2OSwgMzAzLDIyNDIsIDQ2NiwxMDcwLDIxNjMsIDYwMywxNzc3LDIwOTEsNDYzMCwyNzUyLDQ2MzEsMjcxNCwgMzIyLCAjIDE3NjAKMjY1OSwxOTY0LDE3NjgsIDQ4MSwyMTg4LDE0NjMsMjMzMCwyODU3LDM2MDAsMjA5MiwzMDMxLDI0MjEsNDYzMiwyMzE4LDIwNzAsMTg0OSwgIyAxNzc2CjI1OTgsNDYzMywxMzAyLDIyNTQsMTY2OCwxNzAxLDI0MjIsMzgxMSwyOTA1LDMwMzIsMzEyMywyMDQ2LDQxMDYsMTc2MywxNjk0LDQ2MzQsICMgMTc5MgoxNjA0LCA5NDMsMTcyNCwxNDU0LCA5MTcsIDg2OCwyMjE1LDExNjksMjk0MCwgNTUyLDExNDUsMTgwMCwxMjI4LDE4MjMsMTk1NSwgMzE2LCAjIDE4MDgKMTA4MCwyNTEwLCAzNjEsMTgwNywyODMwLDQxMDcsMjY2MCwzMzgxLDEzNDYsMTQyMywxMTM0LDQxMDgsNjEyNywgNTQxLDEyNjMsMTIyOSwgIyAxODI0CjExNDgsMjU0MCwgNTQ1LCA0NjUsMTgzMywyODgwLDM0MzgsMTkwMSwzMDc0LDI0ODIsIDgxNiwzOTM3LCA3MTMsMTc4OCwyNTAwLCAxMjIsICMgMTg0MAoxNTc1LCAxOTUsMTQ1MSwyNTAxLDExMTEsNjEyOCwgODU5LCAzNzQsMTIyNSwyMjQzLDI0ODMsNDMxNywgMzkwLDEwMzMsMzQzOSwzMDc1LCAjIDE4NTYKMjUyNCwxNjg3LCAyNjYsIDc5MywxNDQwLDI1OTksIDk0NiwgNzc5LCA4MDIsIDUwNywgODk3LDEwODEsIDUyOCwyMTg5LDEyOTIsIDcxMSwgIyAxODcyCjE4NjYsMTcyNSwxMTY3LDE2NDAsIDc1MywgMzk4LDI2NjEsMTA1MywgMjQ2LCAzNDgsNDMxOCwgMTM3LDEwMjQsMzQ0MCwxNjAwLDIwNzcsICMgMTg4OAoyMTI5LCA4MjUsNDMxOSwgNjk4LCAyMzgsIDUyMSwgMTg3LDIzMDAsMTE1NywyNDIzLDE2NDEsMTYwNSwxNDY0LDE2MTAsMTA5NywyNTQxLCAjIDE5MDQKMTI2MCwxNDM2LCA3NTksMjI1NSwxODE0LDIxNTAsIDcwNSwzMjM1LCA0MDksMjU2MywzMzA0LCA1NjEsMzAzMywyMDA1LDI1NjQsIDcyNiwgIyAxOTIwCjE5NTYsMjM0MywzNjk4LDQxMDksIDk0OSwzODEyLDM4MTMsMzUyMCwxNjY5LCA2NTMsMTM3OSwyNTI1LCA4ODEsMjE5OCwgNjMyLDIyNTYsICMgMTkzNgoxMDI3LCA3NzgsMTA3NCwgNzMzLDE5NTcsIDUxNCwxNDgxLDI0NjYsIDU1NCwyMTgwLCA3MDIsMzkzOCwxNjA2LDEwMTcsMTM5OCw2MTI5LCAjIDE5NTIKMTM4MCwzNTIxLCA5MjEsIDk5MywxMzEzLCA1OTQsIDQ0OSwxNDg5LDE2MTcsMTE2NiwgNzY4LDE0MjYsMTM2MCwgNDk1LDE3OTQsMzYwMSwgIyAxOTY4CjExNzcsMzYwMiwxMTcwLDQzMjAsMjM0NCwgNDc2LCA0MjUsMzE2Nyw0NjM1LDMxNjgsMTQyNCwgNDAxLDI2NjIsMTE3MSwzMzgyLDE5OTgsICMgMTk4NAoxMDg5LDQxMTAsIDQ3NywzMTY5LCA0NzQsNjEzMCwxOTA5LCA1OTYsMjgzMSwxODQyLCA0OTQsIDY5MywxMDUxLDEwMjgsMTIwNywzMDc2LCAjIDIwMDAKIDYwNiwyMTE1LCA3MjcsMjc5MCwxNDczLDExMTUsIDc0MywzNTIyLCA2MzAsIDgwNSwxNTMyLDQzMjEsMjAyMSwgMzY2LDEwNTcsIDgzOCwgIyAyMDE2CiA2ODQsMTExNCwyMTQyLDQzMjIsMjA1MCwxNDkyLDE4OTIsMTgwOCwyMjcxLDM4MTQsMjQyNCwxOTcxLDE0NDcsMTM3MywzMzA1LDEwOTAsICMgMjAzMgoxNTM2LDM5MzksMzUyMywzMzA2LDE0NTUsMjE5OSwgMzM2LCAzNjksMjMzMSwxMDM1LCA1ODQsMjM5MywgOTAyLCA3MTgsMjYwMCw2MTMxLCAjIDIwNDgKMjc1MywgNDYzLDIxNTEsMTE0OSwxNjExLDI0NjcsIDcxNSwxMzA4LDMxMjQsMTI2OCwgMzQzLDE0MTMsMzIzNiwxNTE3LDEzNDcsMjY2MywgIyAyMDY0CjIwOTMsMzk0MCwyMDIyLDExMzEsMTU1MywyMTAwLDI5NDEsMTQyNywzNDQxLDI5NDIsMTMyMywyNDg0LDYxMzIsMTk4MCwgODcyLDIzNjgsICMgMjA4MAoyNDQxLDI5NDMsIDMyMCwyMzY5LDIxMTYsMTA4MiwgNjc5LDE5MzMsMzk0MSwyNzkxLDM4MTUsIDYyNSwxMTQzLDIwMjMsIDQyMiwyMjAwLCAjIDIwOTYKMzgxNiw2MTMzLCA3MzAsMTY5NSwgMzU2LDIyNTcsMTYyNiwyMzAxLDI4NTgsMjYzNywxNjI3LDE3NzgsIDkzNywgODgzLDI5MDYsMjY5MywgIyAyMTEyCjMwMDIsMTc2OSwxMDg2LCA0MDAsMTA2MywxMzI1LDMzMDcsMjc5Miw0MTExLDMwNzcsIDQ1NiwyMzQ1LDEwNDYsIDc0Nyw2MTM0LDE1MjQsICMgMjEyOAogODg0LDEwOTQsMzM4MywxNDc0LDIxNjQsMTA1OSwgOTc0LDE2ODgsMjE4MSwyMjU4LDEwNDcsIDM0NSwxNjY1LDExODcsIDM1OCwgODc1LCAjIDIxNDQKMzE3MCwgMzA1LCA2NjAsMzUyNCwyMTkwLDEzMzQsMTEzNSwzMTcxLDE1NDAsMTY0OSwyNTQyLDE1MjcsIDkyNywgOTY4LDI3OTMsIDg4NSwgIyAyMTYwCjE5NzIsMTg1MCwgNDgyLCA1MDAsMjYzOCwxMjE4LDExMDksMTA4NSwyNTQzLDE2NTQsMjAzNCwgODc2LCAgNzgsMjI4NywxNDgyLDEyNzcsICMgMjE3NgogODYxLDE2NzUsMTA4MywxNzc5LCA3MjQsMjc1NCwgNDU0LCAzOTcsMTEzMiwxNjEyLDIzMzIsIDg5MywgNjcyLDEyMzcsIDI1NywyMjU5LCAjIDIxOTIKMjM3MCwgMTM1LDMzODQsIDMzNywyMjQ0LCA1NDcsIDM1MiwgMzQwLCA3MDksMjQ4NSwxNDAwLCA3ODgsMTEzOCwyNTExLCA1NDAsIDc3MiwgIyAyMjA4CjE2ODIsMjI2MCwyMjcyLDI1NDQsMjAxMywxODQzLDE5MDIsNDYzNiwxOTk5LDE1NjIsMjI4OCw0NjM3LDIyMDEsMTQwMywxNTMzLCA0MDcsICMgMjIyNAogNTc2LDMzMDgsMTI1NCwyMDcxLCA5NzgsMzM4NSwgMTcwLCAxMzYsMTIwMSwzMTI1LDI2NjQsMzE3MiwyMzk0LCAyMTMsIDkxMiwgODczLCAjIDIyNDAKMzYwMywxNzEzLDIyMDIsIDY5OSwzNjA0LDM2OTksIDgxMywzNDQyLCA0OTMsIDUzMSwxMDU0LCA0NjgsMjkwNywxNDgzLCAzMDQsIDI4MSwgIyAyMjU2CjQxMTIsMTcyNiwxMjUyLDIwOTQsIDMzOSwyMzE5LDIxMzAsMjYzOSwgNzU2LDE1NjMsMjk0NCwgNzQ4LCA1NzEsMjk3NiwxNTg4LDI0MjUsICMgMjI3MgoyNzE1LDE4NTEsMTQ2MCwyNDI2LDE1MjgsMTM5MiwxOTczLDMyMzcsIDI4OCwzMzA5LCA2ODUsMzM4NiwgMjk2LCA4OTIsMjcxNiwyMjE2LCAjIDIyODgKMTU3MCwyMjQ1LCA3MjIsMTc0NywyMjE3LCA5MDUsMzIzOCwxMTAzLDYxMzUsMTg5MywxNDQxLDE5NjUsIDI1MSwxODA1LDIzNzEsMzcwMCwgIyAyMzA0CjI2MDEsMTkxOSwxMDc4LCAgNzUsMjE4MiwxNTA5LDE1OTIsMTI3MCwyNjQwLDQ2MzgsMjE1Miw2MTM2LDMzMTAsMzgxNywgNTI0LCA3MDYsICMgMjMyMAoxMDc1LCAyOTIsMzgxOCwxNzU2LDI2MDIsIDMxNywgIDk4LDMxNzMsMzYwNSwzNTI1LDE4NDQsMjIxOCwzODE5LDI1MDIsIDgxNCwgNTY3LCAjIDIzMzYKIDM4NSwyOTA4LDE1MzQsNjEzNywgNTM0LDE2NDIsMzIzOSwgNzk3LDYxMzgsMTY3MCwxNTI5LCA5NTMsNDMyMywgMTg4LDEwNzEsIDUzOCwgIyAyMzUyCiAxNzgsIDcyOSwzMjQwLDIxMDksMTIyNiwxMzc0LDIwMDAsMjM1NywyOTc3LCA3MzEsMjQ2OCwxMTE2LDIwMTQsMjA1MSw2MTM5LDEyNjEsICMgMjM2OAoxNTkzLCA4MDMsMjg1OSwyNzM2LDM0NDMsIDU1NiwgNjgyLCA4MjMsMTU0MSw2MTQwLDEzNjksMjI4OSwxNzA2LDI3OTQsIDg0NSwgNDYyLCAjIDIzODQKMjYwMywyNjY1LDEzNjEsIDM4NywgMTYyLDIzNTgsMTc0MCwgNzM5LDE3NzAsMTcyMCwxMzA0LDE0MDEsMzI0MSwxMDQ5LCA2MjcsMTU3MSwgIyAyNDAwCjI0MjcsMzUyNiwxODc3LDM5NDIsMTg1MiwxNTAwLCA0MzEsMTkxMCwxNTAzLCA2NzcsIDI5NywyNzk1LCAyODYsMTQzMywxMDM4LDExOTgsICMgMjQxNgoyMjkwLDExMzMsMTU5Niw0MTEzLDQ2MzksMjQ2OSwxNTEwLDE0ODQsMzk0Myw2MTQxLDI0NDIsIDEwOCwgNzEyLDQ2NDAsMjM3MiwgODY2LCAjIDI0MzIKMzcwMSwyNzU1LDMyNDIsMTM0OCwgODM0LDE5NDUsMTQwOCwzNTI3LDIzOTUsMzI0MywxODExLCA4MjQsIDk5NCwxMTc5LDIxMTAsMTU0OCwgIyAyNDQ4CjE0NTMsIDc5MCwzMDAzLCA2OTAsNDMyNCw0MzI1LDI4MzIsMjkwOSwzODIwLDE4NjAsMzgyMSwgMjI1LDE3NDgsIDMxMCwgMzQ2LDE3ODAsICMgMjQ2NAoyNDcwLCA4MjEsMTk5MywyNzE3LDI3OTYsIDgyOCwgODc3LDM1MjgsMjg2MCwyNDcxLDE3MDIsMjE2NSwyOTEwLDI0ODYsMTc4OSwgNDUzLCAjIDI0ODAKIDM1OSwyMjkxLDE2NzYsICA3MywxMTY0LDE0NjEsMTEyNywzMzExLCA0MjEsIDYwNCwgMzE0LDEwMzcsIDU4OSwgMTE2LDI0ODcsIDczNywgIyAyNDk2CiA4MzcsMTE4MCwgMTExLCAyNDQsIDczNSw2MTQyLDIyNjEsMTg2MSwxMzYyLCA5ODYsIDUyMywgNDE4LCA1ODEsMjY2NiwzODIyLCAxMDMsICMgMjUxMgogODU1LCA1MDMsMTQxNCwxODY3LDI0ODgsMTA5MSwgNjU3LDE1OTcsIDk3OSwgNjA1LDEzMTYsNDY0MSwxMDIxLDI0NDMsMjA3OCwyMDAxLCAjIDI1MjgKMTIwOSwgIDk2LCA1ODcsMjE2NiwxMDMyLCAyNjAsMTA3MiwyMTUzLCAxNzMsICA5NCwgMjI2LDMyNDQsIDgxOSwyMDA2LDQ2NDIsNDExNCwgIyAyNTQ0CjIyMDMsIDIzMSwxNzQ0LCA3ODIsICA5NywyNjY3LCA3ODYsMzM4NywgODg3LCAzOTEsIDQ0MiwyMjE5LDQzMjYsMTQyNSw2MTQzLDI2OTQsICMgMjU2MAogNjMzLDE1NDQsMTIwMiwgNDgzLDIwMTUsIDU5MiwyMDUyLDE5NTgsMjQ3MiwxNjU1LCA0MTksIDEyOSw0MzI3LDM0NDQsMzMxMiwxNzE0LCAjIDI1NzYKMTI1NywzMDc4LDQzMjgsMTUxOCwxMDk4LCA4NjUsMTMxMCwxMDE5LDE4ODUsMTUxMiwxNzM0LCA0NjksMjQ0NCwgMTQ4LCA3NzMsIDQzNiwgIyAyNTkyCjE4MTUsMTg2OCwxMTI4LDEwNTUsNDMyOSwxMjQ1LDI3NTYsMzQ0NSwyMTU0LDE5MzQsMTAzOSw0NjQzLCA1NzksMTIzOCwgOTMyLDIzMjAsICMgMjYwOAogMzUzLCAyMDUsIDgwMSwgMTE1LDI0MjgsIDk0NCwyMzIxLDE4ODEsIDM5OSwyNTY1LDEyMTEsIDY3OCwgNzY2LDM5NDQsIDMzNSwyMTAxLCAjIDI2MjQKMTQ1OSwxNzgxLDE0MDIsMzk0NSwyNzM3LDIxMzEsMTAxMCwgODQ0LCA5ODEsMTMyNiwxMDEzLCA1NTAsMTgxNiwxNTQ1LDI2MjAsMTMzNSwgIyAyNjQwCjEwMDgsIDM3MSwyODgxLCA5MzYsMTQxOSwxNjEzLDM1MjksMTQ1NiwxMzk1LDIyNzMsMTgzNCwyNjA0LDEzMTcsMjczOCwyNTAzLCA0MTYsICMgMjY1NgoxNjQzLDQzMzAsIDgwNiwxMTI2LCAyMjksIDU5MSwzOTQ2LDEzMTQsMTk4MSwxNTc2LDE4MzcsMTY2NiwgMzQ3LDE3OTAsIDk3NywzMzEzLCAjIDI2NzIKIDc2NCwyODYxLDE4NTMsIDY4OCwyNDI5LDE5MjAsMTQ2MiwgIDc3LCA1OTUsIDQxNSwyMDAyLDMwMzQsIDc5OCwxMTkyLDQxMTUsNjE0NCwgIyAyNjg4CjI5NzgsNDMzMSwzMDM1LDI2OTUsMjU4MiwyMDcyLDI1NjYsIDQzMCwyNDMwLDE3MjcsIDg0MiwxMzk2LDM5NDcsMzcwMiwgNjEzLCAzNzcsICMgMjcwNAogMjc4LCAyMzYsMTQxNywzMzg4LDMzMTQsMzE3NCwgNzU3LDE4NjksIDEwNywzNTMwLDYxNDUsMTE5NCwgNjIzLDIyNjIsIDIwNywxMjUzLCAjIDI3MjAKMjE2NywzNDQ2LDM5NDgsIDQ5MiwxMTE3LDE5MzUsIDUzNiwxODM4LDI3NTcsMTI0Niw0MzMyLCA2OTYsMjA5NSwyNDA2LDEzOTMsMTU3MiwgIyAyNzM2CjMxNzUsMTc4MiwgNTgzLCAxOTAsIDI1MywxMzkwLDIyMzAsIDgzMCwzMTI2LDMzODksIDkzNCwzMjQ1LDE3MDMsMTc0OSwyOTc5LDE4NzAsICMgMjc1MgoyNTQ1LDE2NTYsMjIwNCwgODY5LDIzNDYsNDExNiwzMTc2LDE4MTcsIDQ5NiwxNzY0LDQ2NDQsIDk0MiwxNTA0LCA0MDQsMTkwMywxMTIyLCAjIDI3NjgKMTU4MCwzNjA2LDI5NDUsMTAyMiwgNTE1LCAzNzIsMTczNSwgOTU1LDI0MzEsMzAzNiw2MTQ2LDI3OTcsMTExMCwyMzAyLDI3OTgsIDYxNywgIyAyNzg0CjYxNDcsIDQ0MSwgNzYyLDE3NzEsMzQ0NywzNjA3LDM2MDgsMTkwNCwgODQwLDMwMzcsICA4NiwgOTM5LDEzODUsIDU3MiwxMzcwLDI0NDUsICMgMjgwMAoxMzM2LCAxMTQsMzcwMywgODk4LCAyOTQsIDIwMywzMzE1LCA3MDMsMTU4MywyMjc0LCA0MjksIDk2MSw0MzMzLDE4NTQsMTk1MSwzMzkwLCAjIDI4MTYKMjM3MywzNzA0LDQzMzQsMTMxOCwxMzgxLCA5NjYsMTkxMSwyMzIyLDEwMDYsMTE1NSwgMzA5LCA5ODksIDQ1OCwyNzE4LDE3OTUsMTM3MiwgIyAyODMyCjEyMDMsIDI1MiwxNjg5LDEzNjMsMzE3NywgNTE3LDE5MzYsIDE2OCwxNDkwLCA1NjIsIDE5MywzODIzLDEwNDIsNDExNywxODM1LCA1NTEsICMgMjg0OAogNDcwLDQ2NDUsIDM5NSwgNDg5LDM0NDgsMTg3MSwxNDY1LDI1ODMsMjY0MSwgNDE3LDE0OTMsIDI3OSwxMjk1LCA1MTEsMTIzNiwxMTE5LCAjIDI4NjQKICA3MiwxMjMxLDE5ODIsMTgxMiwzMDA0LCA4NzEsMTU2NCwgOTg0LDM0NDksMTY2NywyNjk2LDIwOTYsNDY0NiwyMzQ3LDI4MzMsMTY3MywgIyAyODgwCjM2MDksIDY5NSwzMjQ2LDI2NjgsIDgwNywxMTgzLDQ2NDcsIDg5MCwgMzg4LDIzMzMsMTgwMSwxNDU3LDI5MTEsMTc2NSwxNDc3LDEwMzEsICMgMjg5NgozMzE2LDMzMTcsMTI3OCwzMzkxLDI3OTksMjI5MiwyNTI2LCAxNjMsMzQ1MCw0MzM1LDI2NjksMTQwNCwxODAyLDYxNDgsMjMyMywyNDA3LCAjIDI5MTIKMTU4NCwxNzI4LDE0OTQsMTgyNCwxMjY5LCAyOTgsIDkwOSwzMzE4LDEwMzQsMTYzMiwgMzc1LCA3NzYsMTY4MywyMDYxLCAyOTEsIDIxMCwgIyAyOTI4CjExMjMsIDgwOSwxMjQ5LDEwMDIsMjY0MiwzMDM4LCAyMDYsMTAxMSwyMTMyLCAxNDQsIDk3NSwgODgyLDE1NjUsIDM0MiwgNjY3LCA3NTQsICMgMjk0NAoxNDQyLDIxNDMsMTI5OSwyMzAzLDIwNjIsIDQ0NywgNjI2LDIyMDUsMTIyMSwyNzM5LDI5MTIsMTE0NCwxMjE0LDIyMDYsMjU4NCwgNzYwLCAjIDI5NjAKMTcxNSwgNjE0LCA5NTAsMTI4MSwyNjcwLDI2MjEsIDgxMCwgNTc3LDEyODcsMjU0Niw0NjQ4LCAyNDIsMjE2OCwgMjUwLDI2NDMsIDY5MSwgIyAyOTc2CiAxMjMsMjY0NCwgNjQ3LCAzMTMsMTAyOSwgNjg5LDEzNTcsMjk0NiwxNjUwLCAyMTYsIDc3MSwxMzM5LDEzMDYsIDgwOCwyMDYzLCA1NDksICMgMjk5MgogOTEzLDEzNzEsMjkxMywyOTE0LDYxNDksMTQ2NiwxMDkyLDExNzQsMTE5NiwxMzExLDI2MDUsMjM5NiwxNzgzLDE3OTYsMzA3OSwgNDA2LCAjIDMwMDgKMjY3MSwyMTE3LDM5NDksNDY0OSwgNDg3LDE4MjUsMjIyMCw2MTUwLDI5MTUsIDQ0OCwyMzQ4LDEwNzMsNjE1MSwyMzk3LDE3MDcsIDEzMCwgIyAzMDI0CiA5MDAsMTU5OCwgMzI5LCAxNzYsMTk1OSwyNTI3LDE2MjAsNjE1MiwyMjc1LDQzMzYsMzMxOSwxOTgzLDIxOTEsMzcwNSwzNjEwLDIxNTUsICMgMzA0MAozNzA2LDE5MTIsMTUxMywxNjE0LDYxNTMsMTk4OCwgNjQ2LCAzOTIsMjMwNCwxNTg5LDMzMjAsMzAzOSwxODI2LDEyMzksMTM1MiwxMzQwLCAjIDMwNTYKMjkxNiwgNTA1LDI1NjcsMTcwOSwxNDM3LDI0MDgsMjU0NywgOTA2LDYxNTQsMjY3MiwgMzg0LDE0NTgsMTU5NCwxMTAwLDEzMjksIDcxMCwgIyAzMDcyCiA0MjMsMzUzMSwyMDY0LDIyMzEsMjYyMiwxOTg5LDI2NzMsMTA4NywxODgyLCAzMzMsIDg0MSwzMDA1LDEyOTYsMjg4MiwyMzc5LCA1ODAsICMgMzA4OAoxOTM3LDE4MjcsMTI5MywyNTg1LCA2MDEsIDU3NCwgMjQ5LDE3NzIsNDExOCwyMDc5LDExMjAsIDY0NSwgOTAxLDExNzYsMTY5MCwgNzk1LCAjIDMxMDQKMjIwNywgNDc4LDE0MzQsIDUxNiwxMTkwLDE1MzAsIDc2MSwyMDgwLCA5MzAsMTI2NCwgMzU1LCA0MzUsMTU1MiwgNjQ0LDE3OTEsIDk4NywgIyAzMTIwCiAyMjAsMTM2NCwxMTYzLDExMjEsMTUzOCwgMzA2LDIxNjksMTMyNywxMjIyLCA1NDYsMjY0NSwgMjE4LCAyNDEsIDYxMCwxNzA0LDMzMjEsICMgMzEzNgoxOTg0LDE4MzksMTk2NiwyNTI4LCA0NTEsNjE1NSwyNTg2LDM3MDcsMjU2OCwgOTA3LDMxNzgsIDI1NCwyOTQ3LCAxODYsMTg0NSw0NjUwLCAjIDMxNTIKIDc0NSwgNDMyLDE3NTcsIDQyOCwxNjMzLCA4ODgsMjI0NiwyMjIxLDI0ODksMzYxMSwyMTE4LDEyNTgsMTI2NSwgOTU2LDMxMjcsMTc4NCwgIyAzMTY4CjQzMzcsMjQ5MCwgMzE5LCA1MTAsIDExOSwgNDU3LDM2MTIsIDI3NCwyMDM1LDIwMDcsNDY1MSwxNDA5LDMxMjgsIDk3MCwyNzU4LCA1OTAsICMgMzE4NAoyODAwLCA2NjEsMjI0Nyw0NjUyLDIwMDgsMzk1MCwxNDIwLDE1NDksMzA4MCwzMzIyLDM5NTEsMTY1MSwxMzc1LDIxMTEsIDQ4NSwyNDkxLCAjIDMyMDAKMTQyOSwxMTU2LDYxNTYsMjU0OCwyMTgzLDE0OTUsIDgzMSwxODQwLDI1MjksMjQ0NiwgNTAxLDE2NTcsIDMwNywxODk0LDMyNDcsMTM0MSwgIyAzMjE2CiA2NjYsIDg5OSwyMTU2LDE1MzksMjU0OSwxNTU5LCA4ODYsIDM0OSwyMjA4LDMwODEsMjMwNSwxNzM2LDM4MjQsMjE3MCwyNzU5LDEwMTQsICMgMzIzMgoxOTEzLDEzODYsIDU0MiwxMzk3LDI5NDgsIDQ5MCwgMzY4LCA3MTYsIDM2MiwgMTU5LCAyODIsMjU2OSwxMTI5LDE2NTgsMTI4OCwxNzUwLCAjIDMyNDgKMjY3NCwgMjc2LCA2NDksMjAxNiwgNzUxLDE0OTYsIDY1OCwxODE4LDEyODQsMTg2MiwyMjA5LDIwODcsMjUxMiwzNDUxLCA2MjIsMjgzNCwgIyAzMjY0CiAzNzYsIDExNywxMDYwLDIwNTMsMTIwOCwxNzIxLDExMDEsMTQ0MywgMjQ3LDEyNTAsMzE3OSwxNzkyLDM5NTIsMjc2MCwyMzk4LDM5NTMsICMgMzI4MAo2MTU3LDIxNDQsMzcwOCwgNDQ2LDI0MzIsMTE1MSwyNTcwLDM0NTIsMjQ0NywyNzYxLDI4MzUsMTIxMCwyNDQ4LDMwODIsIDQyNCwyMjIyLCAjIDMyOTYKMTI1MSwyNDQ5LDIxMTksMjgzNiwgNTA0LDE1ODEsNDMzOCwgNjAyLCA4MTcsIDg1NywzODI1LDIzNDksMjMwNiwgMzU3LDM4MjYsMTQ3MCwgIyAzMzEyCjE4ODMsMjg4MywgMjU1LCA5NTgsIDkyOSwyOTE3LDMyNDgsIDMwMiw0NjUzLDEwNTAsMTI3MSwxNzUxLDIzMDcsMTk1MiwxNDMwLDI2OTcsICMgMzMyOAoyNzE5LDIzNTksIDM1NCwzMTgwLCA3NzcsIDE1OCwyMDM2LDQzMzksMTY1OSw0MzQwLDQ2NTQsMjMwOCwyOTQ5LDIyNDgsMTE0NiwyMjMyLCAjIDMzNDQKMzUzMiwyNzIwLDE2OTYsMjYyMywzODI3LDYxNTgsMzEyOSwxNTUwLDI2OTgsMTQ4NSwxMjk3LDE0MjgsIDYzNywgOTMxLDI3MjEsMjE0NSwgIyAzMzYwCiA5MTQsMjU1MCwyNTg3LCAgODEsMjQ1MCwgNjEyLCA4MjcsMjY0NiwxMjQyLDQ2NTUsMTExOCwyODg0LCA0NzIsMTg1NSwzMTgxLDM1MzMsICMgMzM3NgozNTM0LCA1NjksMTM1MywyNjk5LDEyNDQsMTc1OCwyNTg4LDQxMTksMjAwOSwyNzYyLDIxNzEsMzcwOSwxMzEyLDE1MzEsNjE1OSwxMTUyLCAjIDMzOTIKMTkzOCwgMTM0LDE4MzAsIDQ3MSwzNzEwLDIyNzYsMTExMiwxNTM1LDMzMjMsMzQ1MywzNTM1LCA5ODIsMTMzNywyOTUwLCA0ODgsIDgyNiwgIyAzNDA4CiA2NzQsMTA1OCwxNjI4LDQxMjAsMjAxNywgNTIyLDIzOTksIDIxMSwgNTY4LDEzNjcsMzQ1NCwgMzUwLCAyOTMsMTg3MiwxMTM5LDMyNDksICMgMzQyNAoxMzk5LDE5NDYsMzAwNiwxMzAwLDIzNjAsMzMyNCwgNTg4LCA3MzYsNjE2MCwyNjA2LCA3NDQsIDY2OSwzNTM2LDM4MjgsNjE2MSwxMzU4LCAjIDM0NDAKIDE5OSwgNzIzLCA4NDgsIDkzMywgODUxLDE5MzksMTUwNSwxNTE0LDEzMzgsMTYxOCwxODMxLDQ2NTYsMTYzNCwzNjEzLCA0NDMsMjc0MCwgIyAzNDU2CjM4MjksIDcxNywxOTQ3LCA0OTEsMTkxNCw2MTYyLDI1NTEsMTU0Miw0MTIxLDEwMjUsNjE2MywxMDk5LDEyMjMsIDE5OCwzMDQwLDI3MjIsICMgMzQ3MgogMzcwLCA0MTAsMTkwNSwyNTg5LCA5OTgsMTI0OCwzMTgyLDIzODAsIDUxOSwxNDQ5LDQxMjIsMTcxMCwgOTQ3LCA5MjgsMTE1Myw0MzQxLCAjIDM0ODgKMjI3NywgMzQ0LDI2MjQsMTUxMSwgNjE1LCAxMDUsIDE2MSwxMjEyLDEwNzYsMTk2MCwzMTMwLDIwNTQsMTkyNiwxMTc1LDE5MDYsMjQ3MywgIyAzNTA0CiA0MTQsMTg3MywyODAxLDYxNjQsMjMwOSwgMzE1LDEzMTksMzMyNSwgMzE4LDIwMTgsMjE0NiwyMTU3LCA5NjMsIDYzMSwgMjIzLDQzNDIsICMgMzUyMAo0MzQzLDI2NzUsIDQ3OSwzNzExLDExOTcsMjYyNSwzNzEyLDI2NzYsMjM2MSw2MTY1LDQzNDQsNDEyMyw2MTY2LDI0NTEsMzE4MywxODg2LCAjIDM1MzYKMjE4NCwxNjc0LDEzMzAsMTcxMSwxNjM1LDE1MDYsIDc5OSwgMjE5LDMyNTAsMzA4MywzOTU0LDE2NzcsMzcxMywzMzI2LDIwODEsMzYxNCwgIyAzNTUyCjE2NTIsMjA3Myw0NjU3LDExNDcsMzA0MSwxNzUyLCA2NDMsMTk2MSwgMTQ3LDE5NzQsMzk1NSw2MTY3LDE3MTYsMjAzNywgOTE4LDMwMDcsICMgMzU2OAoxOTk0LCAxMjAsMTUzNywgMTE4LCA2MDksMzE4NCw0MzQ1LCA3NDAsMzQ1NSwxMjE5LCAzMzIsMTYxNSwzODMwLDYxNjgsMTYyMSwyOTgwLCAjIDM1ODQKMTU4MiwgNzgzLCAyMTIsIDU1MywyMzUwLDM3MTQsMTM0OSwyNDMzLDIwODIsNDEyNCwgODg5LDYxNjksMjMxMCwxMjc1LDE0MTAsIDk3MywgIyAzNjAwCiAxNjYsMTMyMCwzNDU2LDE3OTcsMTIxNSwzMTg1LDI4ODUsMTg0NiwyNTkwLDI3NjMsNDY1OCwgNjI5LCA4MjIsMzAwOCwgNzYzLCA5NDAsICMgMzYxNgoxOTkwLDI4NjIsIDQzOSwyNDA5LDE1NjYsMTI0MCwxNjIyLCA5MjYsMTI4MiwxOTA3LDI3NjQsIDY1NCwyMjEwLDE2MDcsIDMyNywxMTMwLCAjIDM2MzIKMzk1NiwxNjc4LDE2MjMsNjE3MCwyNDM0LDIxOTIsIDY4NiwgNjA4LDM4MzEsMzcxNSwgOTAzLDM5NTcsMzA0Miw2MTcxLDI3NDEsMTUyMiwgIyAzNjQ4CjE5MTUsMTEwNSwxNTU1LDI1NTIsMTM1OSwgMzIzLDMyNTEsNDM0NiwzNDU3LCA3MzgsMTM1NCwyNTUzLDIzMTEsMjMzNCwxODI4LDIwMDMsICMgMzY2NAozODMyLDE3NTMsMjM1MSwxMjI3LDYxNzIsMTg4Nyw0MTI1LDE0NzgsNjE3MywyNDEwLDE4NzQsMTcxMiwxODQ3LCA1MjAsMTIwNCwyNjA3LCAjIDM2ODAKIDI2NCw0NjU5LCA4MzYsMjY3NywyMTAyLCA2MDAsNDY2MCwzODMzLDIyNzgsMzA4NCw2MTc0LDQzNDcsMzYxNSwxMzQyLCA2NDAsIDUzMiwgIyAzNjk2CiA1NDMsMjYwOCwxODg4LDI0MDAsMjU5MSwxMDA5LDQzNDgsMTQ5NywgMzQxLDE3MzcsMzYxNiwyNzIzLDEzOTQsIDUyOSwzMjUyLDEzMjEsICMgMzcxMgogOTgzLDQ2NjEsMTUxNSwyMTIwLCA5NzEsMjU5MiwgOTI0LCAyODcsMTY2MiwzMTg2LDQzNDksMjcwMCw0MzUwLDE1MTksIDkwOCwxOTQ4LCAjIDM3MjgKMjQ1MiwgMTU2LCA3OTYsMTYyOSwxNDg2LDIyMjMsMjA1NSwgNjk0LDQxMjYsMTI1OSwxMDM2LDMzOTIsMTIxMywyMjQ5LDI3NDIsMTg4OSwgIyAzNzQ0CjEyMzAsMzk1OCwxMDE1LCA5MTAsIDQwOCwgNTU5LDM2MTcsNDY2MiwgNzQ2LCA3MjUsIDkzNSw0NjYzLDM5NTksMzAwOSwxMjg5LCA1NjMsICMgMzc2MAogODY3LDQ2NjQsMzk2MCwxNTY3LDI5ODEsMjAzOCwyNjI2LCA5ODgsMjI2MywyMzgxLDQzNTEsIDE0MywyMzc0LCA3MDQsMTg5NSw2MTc1LCAjIDM3NzYKMTE4OCwzNzE2LDIwODgsIDY3MywzMDg1LDIzNjIsNDM1MiwgNDg0LDE2MDgsMTkyMSwyNzY1LDI5MTgsIDIxNSwgOTA0LDM2MTgsMzUzNywgIyAzNzkyCiA4OTQsIDUwOSwgOTc2LDMwNDMsMjcwMSwzOTYxLDQzNTMsMjgzNywyOTgyLCA0OTgsNjE3Niw2MTc3LDExMDIsMzUzOCwxMzMyLDMzOTMsICMgMzgwOAoxNDg3LDE2MzYsMTYzNywgMjMzLCAyNDUsMzk2MiwgMzgzLCA2NTAsIDk5NSwzMDQ0LCA0NjAsMTUyMCwxMjA2LDIzNTIsIDc0OSwzMzI3LCAjIDM4MjQKIDUzMCwgNzAwLCAzODksMTQzOCwxNTYwLDE3NzMsMzk2MywyMjY0LCA3MTksMjk1MSwyNzI0LDM4MzQsIDg3MCwxODMyLDE2NDQsMTAwMCwgIyAzODQwCiA4MzksMjQ3NCwzNzE3LCAxOTcsMTYzMCwzMzk0LCAzNjUsMjg4NiwzOTY0LDEyODUsMjEzMywgNzM0LCA5MjIsIDgxOCwxMTA2LCA3MzIsICMgMzg1NgogNDgwLDIwODMsMTc3NCwzNDU4LCA5MjMsMjI3OSwxMzUwLCAyMjEsMzA4NiwgIDg1LDIyMzMsMjIzNCwzODM1LDE1ODUsMzAxMCwyMTQ3LCAjIDM4NzIKMTM4NywxNzA1LDIzODIsMTYxOSwyNDc1LCAxMzMsIDIzOSwyODAyLDE5OTEsMTAxNiwyMDg0LDIzODMsIDQxMSwyODM4LDExMTMsIDY1MSwgIyAzODg4CjE5ODUsMTE2MCwzMzI4LCA5OTAsMTg2MywzMDg3LDEwNDgsMTI3NiwyNjQ3LCAyNjUsMjYyNywxNTk5LDMyNTMsMjA1NiwgMTUwLCA2MzgsICMgMzkwNAoyMDE5LCA2NTYsIDg1MywgMzI2LDE0NzksIDY4MCwxNDM5LDQzNTQsMTAwMSwxNzU5LCA0MTMsMzQ1OSwzMzk1LDI0OTIsMTQzMSwgNDU5LCAjIDM5MjAKNDM1NSwxMTI1LDMzMjksMjI2NSwxOTUzLDE0NTAsMjA2NSwyODYzLCA4NDksIDM1MSwyNjc4LDMxMzEsMzI1NCwzMjU1LDExMDQsMTU3NywgIyAzOTM2CiAyMjcsMTM1MSwxNjQ1LDI0NTMsMjE5MywxNDIxLDI4ODcsIDgxMiwyMTIxLCA2MzQsICA5NSwyNDM1LCAyMDEsMjMxMiw0NjY1LDE2NDYsICMgMzk1MgoxNjcxLDI3NDMsMTYwMSwyNTU0LDI3MDIsMjY0OCwyMjgwLDEzMTUsMTM2NiwyMDg5LDMxMzIsMTU3MywzNzE4LDM5NjUsMTcyOSwxMTg5LCAjIDM5NjgKIDMyOCwyNjc5LDEwNzcsMTk0MCwxMTM2LCA1NTgsMTI4MywgOTY0LDExOTUsIDYyMSwyMDc0LDExOTksMTc0MywzNDYwLDM2MTksMTg5NiwgIyAzOTg0CjE5MTYsMTg5MCwzODM2LDI5NTIsMTE1NCwyMTEyLDEwNjQsIDg2MiwgMzc4LDMwMTEsMjA2NiwyMTEzLDI4MDMsMTU2OCwyODM5LDYxNzgsICMgNDAwMAozMDg4LDI5MTksMTk0MSwxNjYwLDIwMDQsMTk5MiwyMTk0LCAxNDIsIDcwNywxNTkwLDE3MDgsMTYyNCwxOTIyLDEwMjMsMTgzNiwxMjMzLCAjIDQwMTYKMTAwNCwyMzEzLCA3ODksIDc0MSwzNjIwLDYxNzksMTYwOSwyNDExLDEyMDAsNDEyNywzNzE5LDM3MjAsNDY2NiwyMDU3LDM3MjEsIDU5MywgIyA0MDMyCjI4NDAsIDM2NywyOTIwLDE4NzgsNjE4MCwzNDYxLDE1MjEsIDYyOCwxMTY4LCA2OTIsMjIxMSwyNjQ5LCAzMDAsIDcyMCwyMDY3LDI1NzEsICMgNDA0OAoyOTUzLDMzOTYsIDk1OSwyNTA0LDM5NjYsMzUzOSwzNDYyLDE5NzcsIDcwMSw2MTgxLCA5NTQsMTA0MywgODAwLCA2ODEsIDE4MywzNzIyLCAjIDQwNjQKMTgwMywxNzMwLDM1NDAsNDEyOCwyMTAzLCA4MTUsMjMxNCwgMTc0LCA0NjcsIDIzMCwyNDU0LDEwOTMsMjEzNCwgNzU1LDM1NDEsMzM5NywgIyA0MDgwCjExNDEsMTE2Miw2MTgyLDE3MzgsMjAzOSwgMjcwLDMyNTYsMjUxMywxMDA1LDE2NDcsMjE4NSwzODM3LCA4NTgsMTY3OSwxODk3LDE3MTksICMgNDA5NgoyOTU0LDIzMjQsMTgwNiwgNDAyLCA2NzAsIDE2Nyw0MTI5LDE0OTgsMjE1OCwyMTA0LCA3NTAsNjE4MywgOTE1LCAxODksMTY4MCwxNTUxLCAjIDQxMTIKIDQ1NSw0MzU2LDE1MDEsMjQ1NSwgNDA1LDEwOTUsMjk1NSwgMzM4LDE1ODYsMTI2NiwxODE5LCA1NzAsIDY0MSwxMzI0LCAyMzcsMTU1NiwgIyA0MTI4CjI2NTAsMTM4OCwzNzIzLDYxODQsMTM2OCwyMzg0LDEzNDMsMTk3OCwzMDg5LDI0MzYsIDg3OSwzNzI0LCA3OTIsMTE5MSwgNzU4LDMwMTIsICMgNDE0NAoxNDExLDIxMzUsMTMyMiw0MzU3LCAyNDAsNDY2NywxODQ4LDM3MjUsMTU3NCw2MTg1LCA0MjAsMzA0NSwxNTQ2LDEzOTEsIDcxNCw0MzU4LCAjIDQxNjAKMTk2NywgOTQxLDE4NjQsIDg2MywgNjY0LCA0MjYsIDU2MCwxNzMxLDI2ODAsMTc4NSwyODY0LDE5NDksMjM2MywgNDAzLDMzMzAsMTQxNSwgIyA0MTc2CjEyNzksMjEzNiwxNjk3LDIzMzUsIDIwNCwgNzIxLDIwOTcsMzgzOCwgIDkwLDYxODYsMjA4NSwyNTA1LCAxOTEsMzk2NywgMTI0LDIxNDgsICMgNDE5MgoxMzc2LDE3OTgsMTE3OCwxMTA3LDE4OTgsMTQwNSwgODYwLDQzNTksMTI0MywxMjcyLDIzNzUsMjk4MywxNTU4LDI0NTYsMTYzOCwgMTEzLCAjIDQyMDgKMzYyMSwgNTc4LDE5MjMsMjYwOSwgODgwLCAzODYsNDEzMCwgNzg0LDIxODYsMjI2NiwxNDIyLDI5NTYsMjE3MiwxNzIyLCA0OTcsIDI2MywgIyA0MjI0CjI1MTQsMTI2NywyNDEyLDI2MTAsIDE3NywyNzAzLDM1NDIsIDc3NCwxOTI3LDEzNDQsIDYxNiwxNDMyLDE1OTUsMTAxOCwgMTcyLDQzNjAsICMgNDI0MAoyMzI1LCA5MTEsNDM2MSwgNDM4LDE0NjgsMzYyMiwgNzk0LDM5NjgsMjAyNCwyMTczLDE2ODEsMTgyOSwyOTU3LCA5NDUsIDg5NSwzMDkwLCAjIDQyNTYKIDU3NSwyMjEyLDI0NzYsIDQ3NSwyNDAxLDI2ODEsIDc4NSwyNzQ0LDE3NDUsMjI5MywyNTU1LDE5NzUsMzEzMywyODY1LCAzOTQsNDY2OCwgIyA0MjcyCjM4MzksIDYzNSw0MTMxLCA2MzksIDIwMiwxNTA3LDIxOTUsMjc2NiwxMzQ1LDE0MzUsMjU3MiwzNzI2LDE5MDgsMTE4NCwxMTgxLDI0NTcsICMgNDI4OAozNzI3LDMxMzQsNDM2MiwgODQzLDI2MTEsIDQzNywgOTE2LDQ2NjksIDIzNCwgNzY5LDE4ODQsMzA0NiwzMDQ3LDM2MjMsIDgzMyw2MTg3LCAjIDQzMDQKMTYzOSwyMjUwLDI0MDIsMTM1NSwxMTg1LDIwMTAsMjA0NywgOTk5LCA1MjUsMTczMiwxMjkwLDE0ODgsMjYxMiwgOTQ4LDE1NzgsMzcyOCwgIyA0MzIwCjI0MTMsMjQ3NywxMjE2LDI3MjUsMjE1OSwgMzM0LDM4NDAsMTMyOCwzNjI0LDI5MjEsMTUyNSw0MTMyLCA1NjQsMTA1NiwgODkxLDQzNjMsICMgNDMzNgoxNDQ0LDE2OTgsMjM4NSwyMjUxLDM3MjksMTM2NSwyMjgxLDIyMzUsMTcxNyw2MTg4LCA4NjQsMzg0MSwyNTE1LCA0NDQsIDUyNywyNzY3LCAjIDQzNTIKMjkyMiwzNjI1LCA1NDQsIDQ2MSw2MTg5LCA1NjYsIDIwOSwyNDM3LDMzOTgsMjA5OCwxMDY1LDIwNjgsMzMzMSwzNjI2LDMyNTcsMjEzNywgIyA0MzY4ICAjbGFzdCA1MTIKKQoKClBLAwQUAAAAAAAAACEABnklartMAAC7TAAAOgAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9qcGNudHgucHkjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQkVHSU4gTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBUaGUgT3JpZ2luYWwgQ29kZSBpcyBNb3ppbGxhIENvbW11bmljYXRvciBjbGllbnQgY29kZS4KIwojIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwojIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uLgojIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDE5OTgKIyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiMKIyBDb250cmlidXRvcihzKToKIyAgIE1hcmsgUGlsZ3JpbSAtIHBvcnQgdG8gUHl0aG9uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgojIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQojIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQojIDAyMTEwLTEzMDEgIFVTQQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVORCBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCgojIFRoaXMgaXMgaGlyYWdhbmEgMi1jaGFyIHNlcXVlbmNlIHRhYmxlLCB0aGUgbnVtYmVyIGluIGVhY2ggY2VsbCByZXByZXNlbnRzIGl0cyBmcmVxdWVuY3kgY2F0ZWdvcnkKanAyQ2hhckNvbnRleHQgPSAoCigwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDEpLAooMiw0LDAsNCwwLDMsMCw0LDAsMyw0LDQsNCwyLDQsMywzLDQsMywyLDMsMyw0LDIsMywzLDMsMiw0LDEsNCwzLDMsMSw1LDQsMyw0LDMsNCwzLDUsMywwLDMsNSw0LDIsMCwzLDEsMCwzLDMsMCwzLDMsMCwxLDEsMCw0LDMsMCwzLDMsMCw0LDAsMiwwLDMsNSw1LDUsNSw0LDAsNCwxLDAsMyw0KSwKKDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiksCigwLDQsMCw1LDAsNSwwLDQsMCw0LDUsNCw0LDMsNSwzLDUsMSw1LDMsNCwzLDQsNCwzLDQsMywzLDQsMyw1LDQsNCwzLDUsNSwzLDUsNSw1LDMsNSw1LDMsNCw1LDUsMywxLDMsMiwwLDMsNCwwLDQsMiwwLDQsMiwxLDUsMywyLDMsNSwwLDQsMCwyLDAsNSw0LDQsNSw0LDUsMCw0LDAsMCw0LDQpLAooMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwKSwKKDAsMywwLDQsMCwzLDAsMywwLDQsNSw0LDMsMywzLDMsNCwzLDUsNCw0LDMsNSw0LDQsMyw0LDMsNCw0LDQsNCw1LDMsNCw0LDMsNCw1LDUsNCw1LDUsMSw0LDUsNCwzLDAsMywzLDEsMywzLDAsNCw0LDAsMywzLDEsNSwzLDMsMyw1LDAsNCwwLDMsMCw0LDQsMyw0LDMsMywwLDQsMSwxLDMsNCksCigwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDApLAooMCw0LDAsMywwLDMsMCw0LDAsMyw0LDQsMywyLDIsMSwyLDEsMywxLDMsMywzLDMsMyw0LDMsMSwzLDMsNSwzLDMsMCw0LDMsMCw1LDQsMywzLDUsNCw0LDMsNCw0LDUsMCwxLDIsMCwxLDIsMCwyLDIsMCwxLDAsMCw1LDIsMiwxLDQsMCwzLDAsMSwwLDQsNCwzLDUsNCwzLDAsMiwxLDAsNCwzKSwKKDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCksCigwLDMsMCw1LDAsNCwwLDIsMSw0LDQsMiw0LDEsNCwyLDQsMiw0LDMsMywzLDQsMywzLDMsMywxLDQsMiwzLDMsMywxLDQsNCwxLDEsMSw0LDMsMywyLDAsMiw0LDMsMiwwLDMsMywwLDMsMSwxLDAsMCwwLDMsMywwLDQsMiwyLDMsNCwwLDQsMCwzLDAsNCw0LDUsMyw0LDQsMCwzLDAsMCwxLDQpLAooMSw0LDAsNCwwLDQsMCw0LDAsMyw1LDQsNCwzLDQsMyw1LDQsMywzLDQsMyw1LDQsNCw0LDQsMyw0LDIsNCwzLDMsMSw1LDQsMywyLDQsNSw0LDUsNSw0LDQsNSw0LDQsMCwzLDIsMiwzLDMsMCw0LDMsMSwzLDIsMSw0LDMsMyw0LDUsMCwzLDAsMiwwLDQsNSw1LDQsNSw0LDAsNCwwLDAsNSw0KSwKKDAsNSwwLDUsMCw0LDAsMywwLDQsNCwzLDQsMywzLDMsNCwwLDQsNCw0LDMsNCwzLDQsMywzLDEsNCwyLDQsMyw0LDAsNSw0LDEsNCw1LDQsNCw1LDMsMiw0LDMsNCwzLDIsNCwxLDMsMywzLDIsMywyLDAsNCwzLDMsNCwzLDMsMyw0LDAsNCwwLDMsMCw0LDUsNCw0LDQsMywwLDQsMSwwLDEsMyksCigwLDMsMSw0LDAsMywwLDIsMCwzLDQsNCwzLDEsNCwyLDMsMyw0LDMsNCwzLDQsMyw0LDQsMywyLDMsMSw1LDQsNCwxLDQsNCwzLDUsNCw0LDMsNSw1LDQsMyw0LDQsMywxLDIsMywxLDIsMiwwLDMsMiwwLDMsMSwwLDUsMywzLDMsNCwzLDMsMywzLDQsNCw0LDQsNSw0LDIsMCwzLDMsMiw0LDMpLAooMCwyLDAsMywwLDEsMCwxLDAsMCwzLDIsMCwwLDIsMCwxLDAsMiwxLDMsMywzLDEsMiwzLDEsMCwxLDAsNCwyLDEsMSwzLDMsMCw0LDMsMywxLDQsMywzLDAsMywzLDIsMCwwLDAsMCwxLDAsMCwyLDAsMCwwLDAsMCw0LDEsMCwyLDMsMiwyLDIsMSwzLDMsMyw0LDQsMywyLDAsMywxLDAsMywzKSwKKDAsNCwwLDQsMCwzLDAsMywwLDQsNCw0LDMsMywzLDMsMywzLDQsMyw0LDIsNCwzLDQsMywzLDIsNCwzLDQsNSw0LDEsNCw1LDMsNSw0LDUsMyw1LDQsMCwzLDUsNSwzLDEsMywzLDIsMiwzLDAsMyw0LDEsMywzLDIsNCwzLDMsMyw0LDAsNCwwLDMsMCw0LDUsNCw0LDUsMywwLDQsMSwwLDMsNCksCigwLDIsMCwzLDAsMywwLDAsMCwyLDIsMiwxLDAsMSwwLDAsMCwzLDAsMywwLDMsMCwxLDMsMSwwLDMsMSwzLDMsMywxLDMsMywzLDAsMSwzLDEsMyw0LDAsMCwzLDEsMSwwLDMsMiwwLDAsMCwwLDEsMywwLDEsMCwwLDMsMywyLDAsMywwLDAsMCwwLDAsMyw0LDMsNCwzLDMsMCwzLDAsMCwyLDMpLAooMiwzLDAsMywwLDIsMCwxLDAsMywzLDQsMywxLDMsMSwxLDEsMywxLDQsMyw0LDMsMywzLDAsMCwzLDEsNSw0LDMsMSw0LDMsMiw1LDUsNCw0LDQsNCwzLDMsNCw0LDQsMCwyLDEsMSwzLDIsMCwxLDIsMCwwLDEsMCw0LDEsMywzLDMsMCwzLDAsMSwwLDQsNCw0LDUsNSwzLDAsMiwwLDAsNCw0KSwKKDAsMiwwLDEsMCwzLDEsMywwLDIsMywzLDMsMCwzLDEsMCwwLDMsMCwzLDIsMywxLDMsMiwxLDEsMCwwLDQsMiwxLDAsMiwzLDEsNCwzLDIsMCw0LDQsMywxLDMsMSwzLDAsMSwwLDAsMSwwLDAsMCwxLDAsMCwwLDAsNCwxLDEsMSwyLDAsMywwLDAsMCwzLDQsMiw0LDMsMiwwLDEsMCwwLDMsMyksCigwLDEsMCw0LDAsNSwwLDQsMCwyLDQsNCwyLDMsMywyLDMsMyw1LDMsMywzLDQsMyw0LDIsMywwLDQsMywzLDMsNCwxLDQsMywyLDEsNSw1LDMsNCw1LDEsMyw1LDQsMiwwLDMsMywwLDEsMywwLDQsMiwwLDEsMywxLDQsMywzLDMsMywwLDMsMCwxLDAsMyw0LDQsNCw1LDUsMCwzLDAsMSw0LDUpLAooMCwyLDAsMywwLDMsMCwwLDAsMiwzLDEsMywwLDQsMCwxLDEsMywwLDMsNCwzLDIsMywxLDAsMywzLDIsMywxLDMsMCwyLDMsMCwyLDEsNCwxLDIsMiwwLDAsMywzLDAsMCwyLDAsMCwwLDEsMCwwLDAsMCwyLDIsMCwzLDIsMSwzLDMsMCwyLDAsMiwwLDAsMywzLDEsMiw0LDAsMywwLDIsMiwzKSwKKDIsNCwwLDUsMCw0LDAsNCwwLDIsNCw0LDQsMyw0LDMsMywzLDEsMiw0LDMsNCwzLDQsNCw1LDAsMywzLDMsMywyLDAsNCwzLDEsNCwzLDQsMSw0LDQsMywzLDQsNCwzLDEsMiwzLDAsNCwyLDAsNCwxLDAsMywzLDAsNCwzLDMsMyw0LDAsNCwwLDIsMCwzLDUsMyw0LDUsMiwwLDMsMCwwLDQsNSksCigwLDMsMCw0LDAsMSwwLDEsMCwxLDMsMiwyLDEsMywwLDMsMCwyLDAsMiwwLDMsMCwyLDAsMCwwLDEsMCwxLDEsMCwwLDMsMSwwLDAsMCw0LDAsMywxLDAsMiwxLDMsMCwwLDAsMCwwLDAsMywwLDAsMCwwLDAsMCwwLDQsMiwyLDMsMSwwLDMsMCwwLDAsMSw0LDQsNCwzLDAsMCw0LDAsMCwxLDQpLAooMSw0LDEsNSwwLDMsMCwzLDAsNCw1LDQsNCwzLDUsMywzLDQsNCwzLDQsMSwzLDMsMywzLDIsMSw0LDEsNSw0LDMsMSw0LDQsMyw1LDQsNCwzLDUsNCwzLDMsNCw0LDQsMCwzLDMsMSwyLDMsMCwzLDEsMCwzLDMsMCw1LDQsNCw0LDQsNCw0LDMsMyw1LDQsNCwzLDMsNSw0LDAsMywyLDAsNCw0KSwKKDAsMiwwLDMsMCwxLDAsMCwwLDEsMywzLDMsMiw0LDEsMywwLDMsMSwzLDAsMiwyLDEsMSwwLDAsMiwwLDQsMywxLDAsNCwzLDAsNCw0LDQsMSw0LDMsMSwxLDMsMywxLDAsMiwwLDAsMSwzLDAsMCwwLDAsMiwwLDAsNCwzLDIsNCwzLDUsNCwzLDMsMyw0LDMsMyw0LDMsMywwLDIsMSwwLDMsMyksCigwLDIsMCw0LDAsMywwLDIsMCwyLDUsNSwzLDQsNCw0LDQsMSw0LDMsMywwLDQsMyw0LDMsMSwzLDMsMiw0LDMsMCwzLDQsMywwLDMsNCw0LDIsNCw0LDAsNCw1LDMsMywyLDIsMSwxLDEsMiwwLDEsNSwwLDMsMywyLDQsMywzLDMsNCwwLDMsMCwyLDAsNCw0LDMsNSw1LDAsMCwzLDAsMiwzLDMpLAooMCwzLDAsNCwwLDMsMCwxLDAsMyw0LDMsMywxLDMsMywzLDAsMywxLDMsMCw0LDMsMywxLDEsMCwzLDAsMywzLDAsMCw0LDQsMCwxLDUsNCwzLDMsNSwwLDMsMyw0LDMsMCwyLDAsMSwxLDEsMCwxLDMsMCwxLDIsMSwzLDMsMiwzLDMsMCwzLDAsMSwwLDEsMywzLDQsNCwxLDAsMSwyLDIsMSwzKSwKKDAsMSwwLDQsMCw0LDAsMywwLDEsMywzLDMsMiwzLDEsMSwwLDMsMCwzLDMsNCwzLDIsNCwyLDAsMSwwLDQsMywyLDAsNCwzLDAsNSwzLDMsMiw0LDQsNCwzLDMsMyw0LDAsMSwzLDAsMCwxLDAsMCwxLDAsMCwwLDAsNCwyLDMsMywzLDAsMywwLDAsMCw0LDQsNCw1LDMsMiwwLDMsMywwLDMsNSksCigwLDIsMCwzLDAsMCwwLDMsMCwxLDMsMCwyLDAsMCwwLDEsMCwzLDEsMSwzLDMsMCwwLDMsMCwwLDMsMCwyLDMsMSwwLDMsMSwwLDMsMywyLDAsNCwyLDIsMCwyLDAsMCwwLDQsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMSwyLDAsMSwwLDEsMCwwLDAsMSwzLDEsMiwwLDAsMCwxLDAsMCwxLDQpLAooMCwzLDAsMywwLDUsMCwxLDAsMiw0LDMsMSwzLDMsMiwxLDEsNSwyLDEsMCw1LDEsMiwwLDAsMCwzLDMsMiwyLDMsMiw0LDMsMCwwLDMsMywxLDMsMywwLDIsNSwzLDQsMCwzLDMsMCwxLDIsMCwyLDIsMCwzLDIsMCwyLDIsMywzLDMsMCwyLDAsMSwwLDMsNCw0LDIsNSw0LDAsMywwLDAsMyw1KSwKKDAsMywwLDMsMCwzLDAsMSwwLDMsMywzLDMsMCwzLDAsMiwwLDIsMSwxLDAsMiwwLDEsMCwwLDAsMiwxLDAsMCwxLDAsMywyLDAsMCwzLDMsMSwyLDMsMSwwLDMsMywwLDAsMSwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMiwzLDEsMiwzLDAsMywwLDEsMCwzLDIsMSwwLDQsMywwLDEsMSwwLDMsMyksCigwLDQsMCw1LDAsMywwLDMsMCw0LDUsNSw0LDMsNSwzLDQsMyw1LDMsMywyLDUsMyw0LDQsNCwzLDQsMyw0LDUsNSwzLDQsNCwzLDQsNCw1LDQsNCw0LDMsNCw1LDUsNCwyLDMsNCwyLDMsNCwwLDMsMywxLDQsMywyLDQsMywzLDUsNSwwLDMsMCwzLDAsNSw1LDUsNSw0LDQsMCw0LDAsMSw0LDQpLAooMCw0LDAsNCwwLDMsMCwzLDAsMyw1LDQsNCwyLDMsMiw1LDEsMywyLDUsMSw0LDIsMywyLDMsMyw0LDMsMywzLDMsMiw1LDQsMSwzLDMsNSwzLDQsNCwwLDQsNCwzLDEsMSwzLDEsMCwyLDMsMCwyLDMsMCwzLDAsMCw0LDMsMSwzLDQsMCwzLDAsMiwwLDQsNCw0LDMsNCw1LDAsNCwwLDAsMyw0KSwKKDAsMywwLDMsMCwzLDEsMiwwLDMsNCw0LDMsMywzLDAsMiwyLDQsMywzLDEsMywzLDMsMSwxLDAsMywxLDQsMywyLDMsNCw0LDIsNCw0LDQsMyw0LDQsMywyLDQsNCwzLDEsMywzLDEsMywzLDAsNCwxLDAsMiwyLDEsNCwzLDIsMywzLDUsNCwzLDMsNSw0LDQsMywzLDAsNCwwLDMsMiwyLDQsNCksCigwLDIsMCwxLDAsMCwwLDAsMCwxLDIsMSwzLDAsMCwwLDAsMCwyLDAsMSwyLDEsMCwwLDEsMCwwLDAsMCwzLDAsMCwxLDAsMSwxLDMsMSwwLDAsMCwxLDEsMCwxLDEsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDEsMSwyLDIsMCwzLDQsMCwwLDAsMSwxLDAsMCwxLDAsMCwwLDAsMCwxLDEpLAooMCwxLDAsMCwwLDEsMCwwLDAsMCw0LDAsNCwxLDQsMCwzLDAsNCwwLDMsMCw0LDAsMywwLDMsMCw0LDEsNSwxLDQsMCwwLDMsMCw1LDAsNSwyLDAsMSwwLDAsMCwyLDEsNCwwLDEsMywwLDAsMywwLDAsMywxLDEsNCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwKSwKKDEsNCwwLDUsMCwzLDAsMiwwLDMsNSw0LDQsMyw0LDMsNSwzLDQsMywzLDAsNCwzLDMsMywzLDMsMywyLDQsNCwzLDEsMyw0LDQsNSw0LDQsMyw0LDQsMSwzLDUsNCwzLDMsMywxLDIsMiwzLDMsMSwzLDEsMywzLDMsNSwzLDMsNCw1LDAsMywwLDMsMCwzLDQsMyw0LDQsMywwLDMsMCwyLDQsMyksCigwLDEsMCw0LDAsMCwwLDAsMCwxLDQsMCw0LDEsNCwyLDQsMCwzLDAsMSwwLDEsMCwwLDAsMCwwLDIsMCwzLDEsMSwxLDAsMywwLDAsMCwxLDIsMSwwLDAsMSwxLDEsMSwwLDEsMCwwLDAsMSwwLDAsMywwLDAsMCwwLDMsMiwwLDIsMiwwLDEsMCwwLDAsMiwzLDIsMywzLDAsMCwwLDAsMiwxLDApLAooMCw1LDEsNSwwLDMsMCwzLDAsNSw0LDQsNSwxLDUsMywzLDAsNCwzLDQsMyw1LDMsNCwzLDMsMiw0LDMsNCwzLDMsMCwzLDMsMSw0LDQsMyw0LDQsNCwzLDQsNSw1LDMsMiwzLDEsMSwzLDMsMSwzLDEsMSwzLDMsMiw0LDUsMywzLDUsMCw0LDAsMywwLDQsNCwzLDUsMywzLDAsMyw0LDAsNCwzKSwKKDAsNSwwLDUsMCwzLDAsMiwwLDQsNCwzLDUsMiw0LDMsMywzLDQsNCw0LDMsNSwzLDUsMywzLDEsNCwwLDQsMywzLDAsMywzLDAsNCw0LDQsNCw1LDQsMywzLDUsNSwzLDIsMywxLDIsMywyLDAsMSwwLDAsMywyLDIsNCw0LDMsMSw1LDAsNCwwLDMsMCw0LDMsMSwzLDIsMSwwLDMsMywwLDMsMyksCigwLDQsMCw1LDAsNSwwLDQsMCw0LDUsNSw1LDMsNCwzLDMsMiw1LDQsNCwzLDUsMyw1LDMsNCwwLDQsMyw0LDQsMywyLDQsNCwzLDQsNSw0LDQsNSw1LDAsMyw1LDUsNCwxLDMsMywyLDMsMywxLDMsMSwwLDQsMywxLDQsNCwzLDQsNSwwLDQsMCwyLDAsNCwzLDQsNCwzLDMsMCw0LDAsMCw1LDUpLAooMCw0LDAsNCwwLDUsMCwxLDEsMywzLDQsNCwzLDQsMSwzLDAsNSwxLDMsMCwzLDEsMywxLDEsMCwzLDAsMywzLDQsMCw0LDMsMCw0LDQsNCwzLDQsNCwwLDMsNSw0LDEsMCwzLDAsMCwyLDMsMCwzLDEsMCwzLDEsMCwzLDIsMSwzLDUsMCwzLDAsMSwwLDMsMiwzLDMsNCw0LDAsMiwyLDAsNCw0KSwKKDIsNCwwLDUsMCw0LDAsMywwLDQsNSw1LDQsMyw1LDMsNSwzLDUsMyw1LDIsNSwzLDQsMywzLDQsMyw0LDUsMywyLDEsNSw0LDMsMiwzLDQsNSwzLDQsMSwyLDUsNCwzLDAsMywzLDAsMywyLDAsMiwzLDAsNCwxLDAsMyw0LDMsMyw1LDAsMywwLDEsMCw0LDUsNSw1LDQsMywwLDQsMiwwLDMsNSksCigwLDUsMCw0LDAsNCwwLDIsMCw1LDQsMyw0LDMsNCwzLDMsMyw0LDMsNCwyLDUsMyw1LDMsNCwxLDQsMyw0LDQsNCwwLDMsNSwwLDQsNCw0LDQsNSwzLDEsMyw0LDUsMywzLDMsMywzLDMsMywwLDIsMiwwLDMsMywyLDQsMywzLDMsNSwzLDQsMSwzLDMsNSwzLDIsMCwwLDAsMCw0LDMsMSwzLDMpLAooMCwxLDAsMywwLDMsMCwxLDAsMSwzLDMsMywyLDMsMywzLDAsMywwLDAsMCwzLDEsMywwLDAsMCwyLDIsMiwzLDAsMCwzLDIsMCwxLDIsNCwxLDMsMywwLDAsMywzLDMsMCwxLDAsMCwyLDEsMCwwLDMsMCwzLDEsMCwzLDAsMCwxLDMsMCwyLDAsMSwwLDMsMywxLDMsMywwLDAsMSwxLDAsMywzKSwKKDAsMiwwLDMsMCwyLDEsNCwwLDIsMiwzLDEsMSwzLDEsMSwwLDIsMCwzLDEsMiwzLDEsMywwLDAsMSwwLDQsMywyLDMsMywzLDEsNCwyLDMsMywzLDMsMSwwLDMsMSw0LDAsMSwxLDAsMSwyLDAsMSwxLDAsMSwxLDAsMywxLDMsMiwyLDAsMSwwLDAsMCwyLDMsMywzLDEsMCwwLDAsMCwwLDIsMyksCigwLDUsMCw0LDAsNSwwLDIsMCw0LDUsNSwzLDMsNCwzLDMsMSw1LDQsNCwyLDQsNCw0LDMsNCwyLDQsMyw1LDUsNCwzLDMsNCwzLDMsNSw1LDQsNSw1LDEsMyw0LDUsMywxLDQsMywxLDMsMywwLDMsMywxLDQsMywxLDQsNSwzLDMsNSwwLDQsMCwzLDAsNSwzLDMsMSw0LDMsMCw0LDAsMSw1LDMpLAooMCw1LDAsNSwwLDQsMCwyLDAsNCw0LDMsNCwzLDMsMywzLDMsNSw0LDQsNCw0LDQsNCw1LDMsMyw1LDIsNCw0LDQsMyw0LDQsMywzLDQsNCw1LDUsMywzLDQsMyw0LDMsMyw0LDMsMywzLDMsMSwyLDIsMSw0LDMsMyw1LDQsNCwzLDQsMCw0LDAsMywwLDQsNCw0LDQsNCwxLDAsNCwyLDAsMiw0KSwKKDAsNCwwLDQsMCwzLDAsMSwwLDMsNSwyLDMsMCwzLDAsMiwxLDQsMiwzLDMsNCwxLDQsMywzLDIsNCwxLDMsMywzLDAsMywzLDAsMCwzLDMsMyw1LDMsMywzLDMsMywyLDAsMiwwLDAsMiwwLDAsMiwwLDAsMSwwLDAsMywxLDIsMiwzLDAsMywwLDIsMCw0LDQsMywzLDQsMSwwLDMsMCwwLDIsNCksCigwLDAsMCw0LDAsMCwwLDAsMCwwLDEsMCwxLDAsMiwwLDAsMCwwLDAsMSwwLDIsMCwxLDAsMCwwLDAsMCwzLDEsMywwLDMsMiwwLDAsMCwxLDAsMywyLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwzLDQsMCwyLDAsMCwwLDAsMCwwLDIpLAooMCwyLDEsMywwLDIsMCwyLDAsMywzLDMsMywxLDMsMSwzLDMsMywzLDMsMyw0LDIsMiwxLDIsMSw0LDAsNCwzLDEsMywzLDMsMiw0LDMsNSw0LDMsMywzLDMsMywzLDMsMCwxLDMsMCwyLDAsMCwxLDAsMCwxLDAsMCw0LDIsMCwyLDMsMCwzLDMsMCwzLDMsNCwyLDMsMSw0LDAsMSwyLDAsMiwzKSwKKDAsMywwLDMsMCwxLDAsMywwLDIsMywzLDMsMCwzLDEsMiwwLDMsMywyLDMsMywyLDMsMiwzLDEsMywwLDQsMywyLDAsMywzLDEsNCwzLDMsMiwzLDQsMywxLDMsMywxLDEsMCwxLDEsMCwxLDAsMSwwLDEsMCwwLDAsNCwxLDEsMCwzLDAsMywxLDAsMiwzLDMsMywzLDMsMSwwLDAsMiwwLDMsMyksCigwLDAsMCwwLDAsMCwwLDAsMCwwLDMsMCwyLDAsMywwLDAsMCwwLDAsMCwwLDMsMCwwLDAsMCwwLDAsMCwzLDAsMywwLDMsMSwwLDEsMCwxLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMywwLDIsMCwyLDMsMCwwLDAsMCwwLDAsMCwwLDMpLAooMCwyLDAsMywxLDMsMCwzLDAsMiwzLDMsMywxLDMsMSwzLDEsMywxLDMsMywzLDEsMywwLDIsMywxLDEsNCwzLDMsMiwzLDMsMSwyLDIsNCwxLDMsMywwLDEsNCwyLDMsMCwxLDMsMCwzLDAsMCwxLDMsMCwyLDAsMCwzLDMsMiwxLDMsMCwzLDAsMiwwLDMsNCw0LDQsMywxLDAsMywwLDAsMywzKSwKKDAsMiwwLDEsMCwyLDAsMCwwLDEsMywyLDIsMSwzLDAsMSwxLDMsMCwzLDIsMywxLDIsMCwyLDAsMSwxLDMsMywzLDAsMywzLDEsMSwyLDMsMiwzLDMsMSwyLDMsMiwwLDAsMSwwLDAsMCwwLDAsMCwzLDAsMSwwLDAsMiwxLDIsMSwzLDAsMywwLDAsMCwzLDQsNCw0LDMsMiwwLDIsMCwwLDIsNCksCigwLDAsMCwxLDAsMSwwLDAsMCwwLDEsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLDIsMiwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwxLDMsMSwwLDAsMCwwLDAsMCwwLDMpLAooMCwzLDAsMywwLDIsMCwzLDAsMywzLDMsMiwzLDIsMiwyLDAsMywxLDMsMywzLDIsMywzLDAsMCwzLDAsMywyLDIsMCwyLDMsMSw0LDMsNCwzLDMsMiwzLDEsNSw0LDQsMCwzLDEsMiwxLDMsMCwzLDEsMSwyLDAsMiwzLDEsMywxLDMsMCwzLDAsMSwwLDMsMyw0LDQsMiwxLDAsMiwxLDAsMiw0KSwKKDAsMSwwLDMsMCwxLDAsMiwwLDEsNCwyLDUsMSw0LDAsMiwwLDIsMSwzLDEsNCwwLDIsMSwwLDAsMiwxLDQsMSwxLDAsMywzLDAsNSwxLDMsMiwzLDMsMSwwLDMsMiwzLDAsMSwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsNCwwLDEsMCwzLDAsMiwwLDEsMCwzLDMsMyw0LDMsMywwLDAsMCwwLDIsMyksCigwLDAsMCwxLDAsMCwwLDAsMCwwLDIsMCwxLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwzLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDEsMCwwLDEsMCwwLDAsMCwwLDMpLAooMCwxLDAsMywwLDQsMCwzLDAsMiw0LDMsMSwwLDMsMiwyLDEsMywxLDIsMiwzLDEsMSwxLDIsMSwzLDAsMSwyLDAsMSwzLDIsMSwzLDAsNSw1LDEsMCwwLDEsMywyLDEsMCwzLDAsMCwxLDAsMCwwLDAsMCwzLDQsMCwxLDEsMSwzLDIsMCwyLDAsMSwwLDIsMywzLDEsMiwzLDAsMSwwLDEsMCw0KSwKKDAsMCwwLDEsMCwzLDAsMywwLDIsMiwxLDAsMCw0LDAsMywwLDMsMSwzLDAsMywwLDMsMCwxLDAsMywwLDMsMSwzLDAsMywzLDAsMCwxLDIsMSwxLDEsMCwxLDIsMCwwLDAsMSwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMiwyLDEsMiwwLDAsMiwwLDAsMCwwLDIsMywzLDMsMywwLDAsMCwwLDEsNCksCigwLDAsMCwzLDAsMywwLDAsMCwwLDMsMSwxLDAsMywwLDEsMCwyLDAsMSwwLDAsMCwwLDAsMCwwLDEsMCwzLDAsMiwwLDIsMywwLDAsMiwyLDMsMSwyLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDMsMCwwLDIsMCwwLDAsMCwyLDMpLAooMiw0LDAsNSwwLDUsMCw0LDAsMyw0LDMsMywzLDQsMywzLDMsNCwzLDQsNCw1LDQsNSw1LDUsMiwzLDAsNSw1LDQsMSw1LDQsMywxLDUsNCwzLDQsNCwzLDMsNCwzLDMsMCwzLDIsMCwyLDMsMCwzLDAsMCwzLDMsMCw1LDMsMiwzLDMsMCwzLDAsMywwLDMsNCw1LDQsNSwzLDAsNCwzLDAsMyw0KSwKKDAsMywwLDMsMCwzLDAsMywwLDMsMyw0LDMsMiwzLDIsMywwLDQsMywzLDMsMywzLDMsMywzLDAsMywyLDQsMywzLDEsMyw0LDMsNCw0LDQsMyw0LDQsMywyLDQsNCwxLDAsMiwwLDAsMSwxLDAsMiwwLDAsMywxLDAsNSwzLDIsMSwzLDAsMywwLDEsMiw0LDMsMiw0LDMsMywwLDMsMiwwLDQsNCksCigwLDMsMCwzLDAsMSwwLDAsMCwxLDQsMywzLDIsMywxLDMsMSw0LDIsMywyLDQsMiwzLDQsMywwLDIsMiwzLDMsMywwLDMsMywzLDAsMyw0LDEsMywzLDAsMyw0LDMsMywwLDEsMSwwLDEsMCwwLDAsNCwwLDMsMCwwLDMsMSwyLDEsMywwLDQsMCwxLDAsNCwzLDMsNCwzLDMsMCwyLDAsMCwzLDMpLAooMCwzLDAsNCwwLDEsMCwzLDAsMyw0LDMsMywwLDMsMywzLDEsMywxLDMsMyw0LDMsMywzLDAsMCwzLDEsNSwzLDMsMSwzLDMsMiw1LDQsMywzLDQsNSwzLDIsNSwzLDQsMCwxLDAsMCwwLDAsMCwyLDAsMCwxLDEsMCw0LDIsMiwxLDMsMCwzLDAsMiwwLDQsNCwzLDUsMywyLDAsMSwxLDAsMyw0KSwKKDAsNSwwLDQsMCw1LDAsMiwwLDQsNCwzLDMsMiwzLDMsMywxLDQsMyw0LDEsNSwzLDQsMyw0LDAsNCwyLDQsMyw0LDEsNSw0LDAsNCw0LDQsNCw1LDQsMSwzLDUsNCwyLDEsNCwxLDEsMywyLDAsMywxLDAsMywyLDEsNCwzLDMsMyw0LDAsNCwwLDMsMCw0LDQsNCwzLDMsMywwLDQsMiwwLDMsNCksCigxLDQsMCw0LDAsMywwLDEsMCwzLDMsMywxLDEsMywzLDIsMiwzLDMsMSwwLDMsMiwyLDEsMiwwLDMsMSwyLDEsMiwwLDMsMiwwLDIsMiwzLDMsNCwzLDAsMywzLDEsMiwwLDEsMSwzLDEsMiwwLDAsMywwLDEsMSwwLDMsMiwyLDMsMywwLDMsMCwwLDAsMiwzLDMsNCwzLDMsMCwxLDAsMCwxLDQpLAooMCw0LDAsNCwwLDQsMCwwLDAsMyw0LDQsMywxLDQsMiwzLDIsMywzLDMsMSw0LDMsNCwwLDMsMCw0LDIsMywzLDIsMiw1LDQsMiwxLDMsNCwzLDQsMywxLDMsMyw0LDIsMCwyLDEsMCwzLDMsMCwwLDIsMCwzLDEsMCw0LDQsMyw0LDMsMCw0LDAsMSwwLDIsNCw0LDQsNCw0LDAsMywyLDAsMywzKSwKKDAsMCwwLDEsMCw0LDAsMCwwLDAsMCwwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwxLDAsMywyLDAsMCwxLDAsMCwwLDEsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMiksCigwLDIsMCwzLDAsNCwwLDQsMCwxLDMsMywzLDAsNCwwLDIsMSwyLDEsMSwxLDIsMCwzLDEsMSwwLDEsMCwzLDEsMCwwLDMsMywyLDAsMSwxLDAsMCwwLDAsMCwxLDAsMiwwLDIsMiwwLDMsMSwwLDAsMSwwLDEsMSwwLDEsMiwwLDMsMCwwLDAsMCwxLDAsMCwzLDMsNCwzLDEsMCwxLDAsMywwLDIpLAooMCwwLDAsMywwLDUsMCwwLDAsMCwxLDAsMiwwLDMsMSwwLDEsMywwLDAsMCwyLDAsMCwwLDEsMCwwLDAsMSwxLDAsMCw0LDAsMCwwLDIsMywwLDEsNCwxLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDMsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwyLDAsMCwzLDAsMCwwLDAsMCwzKSwKKDAsMiwwLDUsMCw1LDAsMSwwLDIsNCwzLDMsMiw1LDEsMywyLDMsMywzLDAsNCwxLDIsMCwzLDAsNCwwLDIsMiwxLDEsNSwzLDAsMCwxLDQsMiwzLDIsMCwzLDMsMywyLDAsMiw0LDEsMSwyLDAsMSwxLDAsMywxLDAsMSwzLDEsMiwzLDAsMiwwLDAsMCwxLDMsNSw0LDQsNCwwLDMsMCwwLDEsMyksCigwLDQsMCw1LDAsNCwwLDQsMCw0LDUsNCwzLDMsNCwzLDMsMyw0LDMsNCw0LDUsMyw0LDUsNCwyLDQsMiwzLDQsMywxLDQsNCwxLDMsNSw0LDQsNSw1LDQsNCw1LDUsNSwyLDMsMywxLDQsMywxLDMsMywwLDMsMywxLDQsMyw0LDQsNCwwLDMsMCw0LDAsMywzLDQsNCw1LDAsMCw0LDMsMCw0LDUpLAooMCw0LDAsNCwwLDMsMCwzLDAsMyw0LDQsNCwzLDMsMiw0LDMsNCwzLDQsMyw1LDMsNCwzLDIsMSw0LDIsNCw0LDMsMSwzLDQsMiw0LDUsNSwzLDQsNSw0LDEsNSw0LDMsMCwzLDIsMiwzLDIsMSwzLDEsMCwzLDMsMyw1LDMsMywzLDUsNCw0LDIsMywzLDQsMywzLDMsMiwxLDAsMywyLDEsNCwzKSwKKDAsNCwwLDUsMCw0LDAsMywwLDMsNSw1LDMsMiw0LDMsNCwwLDUsNCw0LDEsNCw0LDQsMywzLDMsNCwzLDUsNSwyLDMsMyw0LDEsMiw1LDUsMyw1LDUsMiwzLDUsNSw0LDAsMywyLDAsMywzLDEsMSw1LDEsNCwxLDAsNCwzLDIsMyw1LDAsNCwwLDMsMCw1LDQsMyw0LDMsMCwwLDQsMSwwLDQsNCksCigxLDMsMCw0LDAsMiwwLDIsMCwyLDUsNSwzLDMsMywzLDMsMCw0LDIsMyw0LDQsNCwzLDQsMCwwLDMsNCw1LDQsMywzLDMsMywyLDUsNSw0LDUsNSw1LDQsMyw1LDUsNSwxLDMsMSwwLDEsMCwwLDMsMiwwLDQsMiwwLDUsMiwzLDIsNCwxLDMsMCwzLDAsNCw1LDQsNSw0LDMsMCw0LDIsMCw1LDQpLAooMCwzLDAsNCwwLDUsMCwzLDAsMyw0LDQsMywyLDMsMiwzLDMsMywzLDMsMiw0LDMsMywyLDIsMCwzLDMsMywzLDMsMSwzLDMsMywwLDQsNCwzLDQsNCwxLDEsNCw0LDIsMCwzLDEsMCwxLDEsMCw0LDEsMCwyLDMsMSwzLDMsMSwzLDQsMCwzLDAsMSwwLDMsMSwzLDAsMCwxLDAsMiwwLDAsNCw0KSwKKDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCksCigwLDMsMCwzLDAsMiwwLDMsMCwxLDUsNCwzLDMsMywxLDQsMiwxLDIsMyw0LDQsMiw0LDQsNSwwLDMsMSw0LDMsNCwwLDQsMywzLDMsMiwzLDIsNSwzLDQsMywyLDIsMywwLDAsMywwLDIsMSwwLDEsMiwwLDAsMCwwLDIsMSwxLDMsMSwwLDIsMCw0LDAsMyw0LDQsNCw1LDIsMCwyLDAsMCwxLDMpLAooMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDEsMSwxLDAsMCwxLDEsMCwwLDAsNCwyLDEsMSwwLDEsMCwzLDIsMCwwLDMsMSwxLDEsMiwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwzLDAsMSwwLDAsMCwyLDAsMCwwLDEsNCwwLDQsMiwxLDAsMCwwLDAsMCwxKSwKKDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwxLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwxLDAsMSwwLDAsMCwwLDMsMSwwLDAsMCwyLDAsMiwxLDAsMCwxLDIsMSwwLDEsMSwwLDAsMywwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwzLDEsMCwwLDAsMCwwLDEsMCwwLDIsMSwwLDAsMCwwLDAsMCwwLDAsMiksCigwLDQsMCw0LDAsNCwwLDMsMCw0LDQsMyw0LDIsNCwzLDIsMCw0LDQsNCwzLDUsMyw1LDMsMywyLDQsMiw0LDMsNCwzLDEsNCwwLDIsMyw0LDQsNCwzLDMsMyw0LDQsNCwzLDQsMSwzLDQsMywyLDEsMiwxLDMsMywzLDQsNCwzLDMsNSwwLDQsMCwzLDAsNCwzLDMsMywyLDEsMCwzLDAsMCwzLDMpLAooMCw0LDAsMywwLDMsMCwzLDAsMyw1LDUsMywzLDMsMyw0LDMsNCwzLDMsMyw0LDQsNCwzLDMsMywzLDQsMyw1LDMsMywxLDMsMiw0LDUsNSw1LDUsNCwzLDQsNSw1LDMsMiwyLDMsMywzLDMsMiwzLDMsMSwyLDMsMiw0LDMsMywzLDQsMCw0LDAsMiwwLDQsMywyLDIsMSwyLDAsMywwLDAsNCwxKSwKKQoKY2xhc3MgSmFwYW5lc2VDb250ZXh0QW5hbHlzaXMob2JqZWN0KToKICAgIE5VTV9PRl9DQVRFR09SWSA9IDYKICAgIERPTlRfS05PVyA9IC0xCiAgICBFTk9VR0hfUkVMX1RIUkVTSE9MRCA9IDEwMAogICAgTUFYX1JFTF9USFJFU0hPTEQgPSAxMDAwCiAgICBNSU5JTVVNX0RBVEFfVEhSRVNIT0xEID0gNAoKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzZWxmLl90b3RhbF9yZWwgPSBOb25lCiAgICAgICAgc2VsZi5fcmVsX3NhbXBsZSA9IE5vbmUKICAgICAgICBzZWxmLl9uZWVkX3RvX3NraXBfY2hhcl9udW0gPSBOb25lCiAgICAgICAgc2VsZi5fbGFzdF9jaGFyX29yZGVyID0gTm9uZQogICAgICAgIHNlbGYuX2RvbmUgPSBOb25lCiAgICAgICAgc2VsZi5yZXNldCgpCgogICAgZGVmIHJlc2V0KHNlbGYpOgogICAgICAgIHNlbGYuX3RvdGFsX3JlbCA9IDAgICMgdG90YWwgc2VxdWVuY2UgcmVjZWl2ZWQKICAgICAgICAjIGNhdGVnb3J5IGNvdW50ZXJzLCBlYWNoIGludGVnZXIgY291bnRzIHNlcXVlbmNlIGluIGl0cyBjYXRlZ29yeQogICAgICAgIHNlbGYuX3JlbF9zYW1wbGUgPSBbMF0gKiBzZWxmLk5VTV9PRl9DQVRFR09SWQogICAgICAgICMgaWYgbGFzdCBieXRlIGluIGN1cnJlbnQgYnVmZmVyIGlzIG5vdCB0aGUgbGFzdCBieXRlIG9mIGEgY2hhcmFjdGVyLAogICAgICAgICMgd2UgbmVlZCB0byBrbm93IGhvdyBtYW55IGJ5dGVzIHRvIHNraXAgaW4gbmV4dCBidWZmZXIKICAgICAgICBzZWxmLl9uZWVkX3RvX3NraXBfY2hhcl9udW0gPSAwCiAgICAgICAgc2VsZi5fbGFzdF9jaGFyX29yZGVyID0gLTEgICMgVGhlIG9yZGVyIG9mIHByZXZpb3VzIGNoYXIKICAgICAgICAjIElmIHRoaXMgZmxhZyBpcyBzZXQgdG8gVHJ1ZSwgZGV0ZWN0aW9uIGlzIGRvbmUgYW5kIGNvbmNsdXNpb24gaGFzCiAgICAgICAgIyBiZWVuIG1hZGUKICAgICAgICBzZWxmLl9kb25lID0gRmFsc2UKCiAgICBkZWYgZmVlZChzZWxmLCBieXRlX3N0ciwgbnVtX2J5dGVzKToKICAgICAgICBpZiBzZWxmLl9kb25lOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgIyBUaGUgYnVmZmVyIHdlIGdvdCBpcyBieXRlIG9yaWVudGVkLCBhbmQgYSBjaGFyYWN0ZXIgbWF5IHNwYW4gaW4gbW9yZSB0aGFuIG9uZQogICAgICAgICMgYnVmZmVycy4gSW4gY2FzZSB0aGUgbGFzdCBvbmUgb3IgdHdvIGJ5dGUgaW4gbGFzdCBidWZmZXIgaXMgbm90CiAgICAgICAgIyBjb21wbGV0ZSwgd2UgcmVjb3JkIGhvdyBtYW55IGJ5dGUgbmVlZGVkIHRvIGNvbXBsZXRlIHRoYXQgY2hhcmFjdGVyCiAgICAgICAgIyBhbmQgc2tpcCB0aGVzZSBieXRlcyBoZXJlLiAgV2UgY2FuIGNob29zZSB0byByZWNvcmQgdGhvc2UgYnl0ZXMgYXMKICAgICAgICAjIHdlbGwgYW5kIGFuYWx5c2UgdGhlIGNoYXJhY3RlciBvbmNlIGl0IGlzIGNvbXBsZXRlLCBidXQgc2luY2UgYQogICAgICAgICMgY2hhcmFjdGVyIHdpbGwgbm90IG1ha2UgbXVjaCBkaWZmZXJlbmNlLCBieSBzaW1wbHkgc2tpcHBpbmcKICAgICAgICAjIHRoaXMgY2hhcmFjdGVyIHdpbGwgc2ltcGx5IG91ciBsb2dpYyBhbmQgaW1wcm92ZSBwZXJmb3JtYW5jZS4KICAgICAgICBpID0gc2VsZi5fbmVlZF90b19za2lwX2NoYXJfbnVtCiAgICAgICAgd2hpbGUgaSA8IG51bV9ieXRlczoKICAgICAgICAgICAgb3JkZXIsIGNoYXJfbGVuID0gc2VsZi5nZXRfb3JkZXIoYnl0ZV9zdHJbaTppICsgMl0pCiAgICAgICAgICAgIGkgKz0gY2hhcl9sZW4KICAgICAgICAgICAgaWYgaSA+IG51bV9ieXRlczoKICAgICAgICAgICAgICAgIHNlbGYuX25lZWRfdG9fc2tpcF9jaGFyX251bSA9IGkgLSBudW1fYnl0ZXMKICAgICAgICAgICAgICAgIHNlbGYuX2xhc3RfY2hhcl9vcmRlciA9IC0xCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBpZiAob3JkZXIgIT0gLTEpIGFuZCAoc2VsZi5fbGFzdF9jaGFyX29yZGVyICE9IC0xKToKICAgICAgICAgICAgICAgICAgICBzZWxmLl90b3RhbF9yZWwgKz0gMQogICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuX3RvdGFsX3JlbCA+IHNlbGYuTUFYX1JFTF9USFJFU0hPTEQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2RvbmUgPSBUcnVlCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICAgICAgc2VsZi5fcmVsX3NhbXBsZVtqcDJDaGFyQ29udGV4dFtzZWxmLl9sYXN0X2NoYXJfb3JkZXJdW29yZGVyXV0gKz0gMQogICAgICAgICAgICAgICAgc2VsZi5fbGFzdF9jaGFyX29yZGVyID0gb3JkZXIKCiAgICBkZWYgZ290X2Vub3VnaF9kYXRhKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl90b3RhbF9yZWwgPiBzZWxmLkVOT1VHSF9SRUxfVEhSRVNIT0xECgogICAgZGVmIGdldF9jb25maWRlbmNlKHNlbGYpOgogICAgICAgICMgVGhpcyBpcyBqdXN0IG9uZSB3YXkgdG8gY2FsY3VsYXRlIGNvbmZpZGVuY2UuIEl0IHdvcmtzIHdlbGwgZm9yIG1lLgogICAgICAgIGlmIHNlbGYuX3RvdGFsX3JlbCA+IHNlbGYuTUlOSU1VTV9EQVRBX1RIUkVTSE9MRDoKICAgICAgICAgICAgcmV0dXJuIChzZWxmLl90b3RhbF9yZWwgLSBzZWxmLl9yZWxfc2FtcGxlWzBdKSAvIHNlbGYuX3RvdGFsX3JlbAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBzZWxmLkRPTlRfS05PVwoKICAgIGRlZiBnZXRfb3JkZXIoc2VsZiwgYnl0ZV9zdHIpOgogICAgICAgIHJldHVybiAtMSwgMQoKY2xhc3MgU0pJU0NvbnRleHRBbmFseXNpcyhKYXBhbmVzZUNvbnRleHRBbmFseXNpcyk6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc3VwZXIoU0pJU0NvbnRleHRBbmFseXNpcywgc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYuX2NoYXJzZXRfbmFtZSA9ICJTSElGVF9KSVMiCgogICAgQHByb3BlcnR5CiAgICBkZWYgY2hhcnNldF9uYW1lKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9jaGFyc2V0X25hbWUKCiAgICBkZWYgZ2V0X29yZGVyKHNlbGYsIGJ5dGVfc3RyKToKICAgICAgICBpZiBub3QgYnl0ZV9zdHI6CiAgICAgICAgICAgIHJldHVybiAtMSwgMQogICAgICAgICMgZmluZCBvdXQgY3VycmVudCBjaGFyJ3MgYnl0ZSBsZW5ndGgKICAgICAgICBmaXJzdF9jaGFyID0gYnl0ZV9zdHJbMF0KICAgICAgICBpZiAoMHg4MSA8PSBmaXJzdF9jaGFyIDw9IDB4OUYpIG9yICgweEUwIDw9IGZpcnN0X2NoYXIgPD0gMHhGQyk6CiAgICAgICAgICAgIGNoYXJfbGVuID0gMgogICAgICAgICAgICBpZiAoZmlyc3RfY2hhciA9PSAweDg3KSBvciAoMHhGQSA8PSBmaXJzdF9jaGFyIDw9IDB4RkMpOgogICAgICAgICAgICAgICAgc2VsZi5fY2hhcnNldF9uYW1lID0gIkNQOTMyIgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGNoYXJfbGVuID0gMQoKICAgICAgICAjIHJldHVybiBpdHMgb3JkZXIgaWYgaXQgaXMgaGlyYWdhbmEKICAgICAgICBpZiBsZW4oYnl0ZV9zdHIpID4gMToKICAgICAgICAgICAgc2Vjb25kX2NoYXIgPSBieXRlX3N0clsxXQogICAgICAgICAgICBpZiAoZmlyc3RfY2hhciA9PSAyMDIpIGFuZCAoMHg5RiA8PSBzZWNvbmRfY2hhciA8PSAweEYxKToKICAgICAgICAgICAgICAgIHJldHVybiBzZWNvbmRfY2hhciAtIDB4OUYsIGNoYXJfbGVuCgogICAgICAgIHJldHVybiAtMSwgY2hhcl9sZW4KCmNsYXNzIEVVQ0pQQ29udGV4dEFuYWx5c2lzKEphcGFuZXNlQ29udGV4dEFuYWx5c2lzKToKICAgIGRlZiBnZXRfb3JkZXIoc2VsZiwgYnl0ZV9zdHIpOgogICAgICAgIGlmIG5vdCBieXRlX3N0cjoKICAgICAgICAgICAgcmV0dXJuIC0xLCAxCiAgICAgICAgIyBmaW5kIG91dCBjdXJyZW50IGNoYXIncyBieXRlIGxlbmd0aAogICAgICAgIGZpcnN0X2NoYXIgPSBieXRlX3N0clswXQogICAgICAgIGlmIChmaXJzdF9jaGFyID09IDB4OEUpIG9yICgweEExIDw9IGZpcnN0X2NoYXIgPD0gMHhGRSk6CiAgICAgICAgICAgIGNoYXJfbGVuID0gMgogICAgICAgIGVsaWYgZmlyc3RfY2hhciA9PSAweDhGOgogICAgICAgICAgICBjaGFyX2xlbiA9IDMKICAgICAgICBlbHNlOgogICAgICAgICAgICBjaGFyX2xlbiA9IDEKCiAgICAgICAgIyByZXR1cm4gaXRzIG9yZGVyIGlmIGl0IGlzIGhpcmFnYW5hCiAgICAgICAgaWYgbGVuKGJ5dGVfc3RyKSA+IDE6CiAgICAgICAgICAgIHNlY29uZF9jaGFyID0gYnl0ZV9zdHJbMV0KICAgICAgICAgICAgaWYgKGZpcnN0X2NoYXIgPT0gMHhBNCkgYW5kICgweEExIDw9IHNlY29uZF9jaGFyIDw9IDB4RjMpOgogICAgICAgICAgICAgICAgcmV0dXJuIHNlY29uZF9jaGFyIC0gMHhBMSwgY2hhcl9sZW4KCiAgICAgICAgcmV0dXJuIC0xLCBjaGFyX2xlbgoKClBLAwQUAAAAAAAAACEA8GjJyicyAAAnMgAARgAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9sYW5nYnVsZ2FyaWFubW9kZWwucHkjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQkVHSU4gTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBUaGUgT3JpZ2luYWwgQ29kZSBpcyBNb3ppbGxhIENvbW11bmljYXRvciBjbGllbnQgY29kZS4KIwojIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwojIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uLgojIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDE5OTgKIyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiMKIyBDb250cmlidXRvcihzKToKIyAgIE1hcmsgUGlsZ3JpbSAtIHBvcnQgdG8gUHl0aG9uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgojIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQojIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQojIDAyMTEwLTEzMDEgIFVTQQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVORCBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiMgMjU1OiBDb250cm9sIGNoYXJhY3RlcnMgdGhhdCB1c3VhbGx5IGRvZXMgbm90IGV4aXN0IGluIGFueSB0ZXh0CiMgMjU0OiBDYXJyaWFnZS9SZXR1cm4KIyAyNTM6IHN5bWJvbCAocHVuY3R1YXRpb24pIHRoYXQgZG9lcyBub3QgYmVsb25nIHRvIHdvcmQKIyAyNTI6IDAgLSA5CgojIENoYXJhY3RlciBNYXBwaW5nIFRhYmxlOgojIHRoaXMgdGFibGUgaXMgbW9kaWZpZWQgYmFzZSBvbiB3aW4xMjUxQnVsZ2FyaWFuQ2hhclRvT3JkZXJNYXAsIHNvCiMgb25seSBudW1iZXIgPDY0IGlzIHN1cmUgdmFsaWQKCkxhdGluNV9CdWxnYXJpYW5DaGFyVG9PcmRlck1hcCA9ICgKMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NCwyNTUsMjU1LDI1NCwyNTUsMjU1LCAgIyAwMAoyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsICAjIDEwCjI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgMjAKMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyAzMAoyNTMsIDc3LCA5MCwgOTksMTAwLCA3MiwxMDksMTA3LDEwMSwgNzksMTg1LCA4MSwxMDIsIDc2LCA5NCwgODIsICAjIDQwCjExMCwxODYsMTA4LCA5MSwgNzQsMTE5LCA4NCwgOTYsMTExLDE4NywxMTUsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgNTAKMjUzLCA2NSwgNjksIDcwLCA2NiwgNjMsIDY4LDExMiwxMDMsIDkyLDE5NCwxMDQsIDk1LCA4NiwgODcsIDcxLCAgIyA2MAoxMTYsMTk1LCA4NSwgOTMsIDk3LDExMywxOTYsMTk3LDE5OCwxOTksMjAwLDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDcwCjE5NCwxOTUsMTk2LDE5NywxOTgsMTk5LDIwMCwyMDEsMjAyLDIwMywyMDQsMjA1LDIwNiwyMDcsMjA4LDIwOSwgICMgODAKMjEwLDIxMSwyMTIsMjEzLDIxNCwyMTUsMjE2LDIxNywyMTgsMjE5LDIyMCwyMjEsMjIyLDIyMywyMjQsMjI1LCAgIyA5MAogODEsMjI2LDIyNywyMjgsMjI5LDIzMCwxMDUsMjMxLDIzMiwyMzMsMjM0LDIzNSwyMzYsIDQ1LDIzNywyMzgsICAjIGEwCiAzMSwgMzIsIDM1LCA0MywgMzcsIDQ0LCA1NSwgNDcsIDQwLCA1OSwgMzMsIDQ2LCAzOCwgMzYsIDQxLCAzMCwgICMgYjAKIDM5LCAyOCwgMzQsIDUxLCA0OCwgNDksIDUzLCA1MCwgNTQsIDU3LCA2MSwyMzksIDY3LDI0MCwgNjAsIDU2LCAgIyBjMAogIDEsIDE4LCAgOSwgMjAsIDExLCAgMywgMjMsIDE1LCAgMiwgMjYsIDEyLCAxMCwgMTQsICA2LCAgNCwgMTMsICAjIGQwCiAgNywgIDgsICA1LCAxOSwgMjksIDI1LCAyMiwgMjEsIDI3LCAyNCwgMTcsIDc1LCA1MiwyNDEsIDQyLCAxNiwgICMgZTAKIDYyLDI0MiwyNDMsMjQ0LCA1OCwyNDUsIDk4LDI0NiwyNDcsMjQ4LDI0OSwyNTAsMjUxLCA5MSwyNTIsMjUzLCAgIyBmMAopCgp3aW4xMjUxQnVsZ2FyaWFuQ2hhclRvT3JkZXJNYXAgPSAoCjI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTQsMjU1LDI1NSwyNTQsMjU1LDI1NSwgICMgMDAKMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LCAgIyAxMAoyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDIwCjI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgMzAKMjUzLCA3NywgOTAsIDk5LDEwMCwgNzIsMTA5LDEwNywxMDEsIDc5LDE4NSwgODEsMTAyLCA3NiwgOTQsIDgyLCAgIyA0MAoxMTAsMTg2LDEwOCwgOTEsIDc0LDExOSwgODQsIDk2LDExMSwxODcsMTE1LDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDUwCjI1MywgNjUsIDY5LCA3MCwgNjYsIDYzLCA2OCwxMTIsMTAzLCA5MiwxOTQsMTA0LCA5NSwgODYsIDg3LCA3MSwgICMgNjAKMTE2LDE5NSwgODUsIDkzLCA5NywxMTMsMTk2LDE5NywxOTgsMTk5LDIwMCwyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyA3MAoyMDYsMjA3LDIwOCwyMDksMjEwLDIxMSwyMTIsMjEzLDEyMCwyMTQsMjE1LDIxNiwyMTcsMjE4LDIxOSwyMjAsICAjIDgwCjIyMSwgNzgsIDY0LCA4MywxMjEsIDk4LDExNywxMDUsMjIyLDIyMywyMjQsMjI1LDIyNiwyMjcsMjI4LDIyOSwgICMgOTAKIDg4LDIzMCwyMzEsMjMyLDIzMywxMjIsIDg5LDEwNiwyMzQsMjM1LDIzNiwyMzcsMjM4LCA0NSwyMzksMjQwLCAgIyBhMAogNzMsIDgwLDExOCwxMTQsMjQxLDI0MiwyNDMsMjQ0LDI0NSwgNjIsIDU4LDI0NiwyNDcsMjQ4LDI0OSwyNTAsICAjIGIwCiAzMSwgMzIsIDM1LCA0MywgMzcsIDQ0LCA1NSwgNDcsIDQwLCA1OSwgMzMsIDQ2LCAzOCwgMzYsIDQxLCAzMCwgICMgYzAKIDM5LCAyOCwgMzQsIDUxLCA0OCwgNDksIDUzLCA1MCwgNTQsIDU3LCA2MSwyNTEsIDY3LDI1MiwgNjAsIDU2LCAgIyBkMAogIDEsIDE4LCAgOSwgMjAsIDExLCAgMywgMjMsIDE1LCAgMiwgMjYsIDEyLCAxMCwgMTQsICA2LCAgNCwgMTMsICAjIGUwCiAgNywgIDgsICA1LCAxOSwgMjksIDI1LCAyMiwgMjEsIDI3LCAyNCwgMTcsIDc1LCA1MiwyNTMsIDQyLCAxNiwgICMgZjAKKQoKIyBNb2RlbCBUYWJsZToKIyB0b3RhbCBzZXF1ZW5jZXM6IDEwMCUKIyBmaXJzdCA1MTIgc2VxdWVuY2VzOiA5Ni45MzkyJQojIGZpcnN0IDEwMjQgc2VxdWVuY2VzOjMuMDYxOCUKIyByZXN0ICBzZXF1ZW5jZXM6ICAgICAwLjI5OTIlCiMgbmVnYXRpdmUgc2VxdWVuY2VzOiAgMC4wMDIwJQpCdWxnYXJpYW5MYW5nTW9kZWwgPSAoCjAsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywyLDMsMywzLDMsMywzLDMsMywyLDMsMywzLDMsMywKMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDAsMywzLDMsMiwyLDMsMiwyLDEsMiwyLAozLDEsMywzLDIsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMCwzLDMsMywzLDMsMywzLDMsMywzLDAsMywwLDEsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwKMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDIsMywyLDMsMywzLDMsMywzLDMsMywwLDMsMSwwLAowLDEsMCwwLDAsMCwwLDAsMCwwLDEsMSwwLDEsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsCjMsMiwyLDIsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywxLDMsMiwzLDMsMywzLDMsMywzLDMsMCwzLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDIsMywzLDIsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMSwzLDIsMywzLDMsMywzLDMsMywzLDAsMywwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDMsMywzLDMsMywzLDMsMywzLDIsMywyLDIsMSwzLDMsMywzLDIsMiwyLDEsMSwyLDAsMSwwLDEsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsCjMsMywzLDMsMywzLDMsMiwzLDIsMiwzLDMsMSwxLDIsMywzLDIsMywzLDMsMywyLDEsMiwwLDIsMCwzLDAsMCwKMCwwLDAsMCwwLDAsMCwxLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLAozLDMsMywzLDMsMywzLDEsMywzLDMsMywzLDIsMywyLDMsMywzLDMsMywyLDMsMywxLDMsMCwzLDAsMiwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwKMywzLDMsMywzLDMsMywzLDEsMywzLDIsMywzLDMsMSwzLDMsMiwzLDIsMiwyLDAsMCwyLDAsMiwwLDIsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsCjMsMywzLDMsMywzLDMsMywzLDAsMywzLDMsMiwyLDMsMywzLDEsMiwyLDMsMiwxLDEsMiwwLDIsMCwwLDAsMCwKMSwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwxLDAsMCwxLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLAozLDMsMywzLDMsMywzLDIsMywzLDEsMiwzLDIsMiwyLDMsMywzLDMsMywyLDIsMywxLDIsMCwyLDEsMiwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMywwLDAsMSwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwKMywzLDMsMywzLDEsMywzLDMsMywzLDIsMywzLDMsMiwzLDMsMiwzLDIsMiwyLDMsMSwyLDAsMSwwLDEsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsCjMsMywzLDMsMywzLDMsMywzLDMsMywxLDEsMSwyLDIsMSwzLDEsMywyLDIsMywwLDAsMSwwLDEsMCwxLDAsMCwKMCwwLDAsMSwwLDAsMCwwLDEsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLAozLDMsMywzLDMsMiwyLDMsMiwyLDMsMSwyLDEsMSwxLDIsMywxLDMsMSwyLDIsMCwxLDEsMSwxLDAsMSwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwKMywzLDMsMywzLDEsMywyLDIsMywzLDEsMiwzLDEsMSwzLDMsMywzLDEsMiwyLDEsMSwxLDAsMiwwLDIsMCwxLAowLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsCjMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDEsMiwyLDMsMywzLDIsMiwxLDEsMiwwLDIsMCwxLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLAozLDAsMSwyLDEsMywzLDIsMywzLDMsMywzLDIsMywyLDEsMCwzLDEsMiwxLDIsMSwyLDMsMiwxLDAsMSwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMSwxLDEsMiwzLDMsMywzLDMsMywzLDMsMywzLDMsMywwLDAsMywxLDMsMywyLDMsMywyLDIsMiwwLDEsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjIsMywzLDMsMywwLDMsMywzLDMsMywyLDEsMSwyLDEsMywzLDAsMywxLDEsMSwxLDMsMiwwLDEsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLAozLDMsMiwyLDIsMywzLDMsMywzLDMsMywzLDMsMywzLDEsMSwzLDEsMywzLDIsMywyLDIsMiwzLDAsMiwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDMsMywzLDIsMywzLDIsMiwzLDIsMSwxLDEsMSwxLDMsMSwzLDEsMSwwLDAsMCwxLDAsMCwwLDEsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywzLDMsMywyLDMsMiwwLDMsMiwwLDMsMCwyLDAsMCwyLDEsMywxLDAsMCwxLDAsMCwwLDEsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLAozLDMsMywzLDIsMSwxLDEsMSwyLDEsMSwyLDEsMSwxLDIsMiwxLDIsMSwxLDEsMCwxLDEsMCwxLDAsMSwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwKMywzLDMsMywyLDEsMywxLDEsMiwxLDMsMiwxLDEsMCwxLDIsMywyLDEsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjIsMywzLDMsMywyLDIsMSwwLDEsMCwwLDEsMCwwLDAsMiwxLDAsMywwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLAozLDMsMywyLDMsMiwzLDMsMSwzLDIsMSwxLDEsMiwxLDEsMiwxLDMsMCwxLDAsMCwwLDEsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywxLDEsMiwyLDMsMywyLDMsMiwyLDIsMywxLDIsMiwxLDEsMiwxLDEsMiwyLDAsMSwxLDAsMSwwLDIsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywzLDMsMiwxLDMsMSwwLDIsMiwxLDMsMiwxLDAsMCwyLDAsMiwwLDEsMCwwLDAsMCwwLDAsMCwxLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLAozLDMsMywzLDMsMywxLDIsMCwyLDMsMSwyLDMsMiwwLDEsMywxLDIsMSwxLDEsMCwwLDEsMCwwLDIsMiwyLDMsCjIsMiwyLDIsMSwyLDEsMSwyLDIsMSwxLDIsMCwxLDEsMSwwLDAsMSwxLDAsMCwxLDEsMCwwLDAsMSwxLDAsMSwKMywzLDMsMywzLDIsMSwyLDIsMSwyLDAsMiwwLDEsMCwxLDIsMSwyLDEsMSwwLDAsMCwxLDAsMSwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsCjMsMywyLDMsMywxLDEsMywxLDAsMywyLDEsMCwwLDAsMSwyLDAsMiwwLDEsMCwwLDAsMSwwLDEsMiwxLDIsMiwKMSwxLDEsMSwxLDEsMSwyLDIsMiwxLDEsMSwxLDEsMSwxLDAsMSwyLDEsMSwxLDAsMCwwLDAsMCwxLDEsMCwwLAozLDEsMCwxLDAsMiwzLDIsMiwyLDMsMiwyLDIsMiwyLDEsMCwyLDEsMiwxLDEsMSwwLDEsMiwxLDIsMiwyLDEsCjEsMSwyLDIsMiwyLDEsMiwxLDEsMCwxLDIsMSwyLDIsMiwxLDEsMSwwLDEsMSwxLDEsMiwwLDEsMCwwLDAsMCwKMiwzLDIsMywzLDAsMCwyLDEsMCwyLDEsMCwwLDAsMCwyLDMsMCwyLDAsMCwwLDAsMCwxLDAsMCwyLDAsMSwyLAoyLDEsMiwxLDIsMiwxLDEsMSwyLDEsMSwxLDAsMSwyLDIsMSwxLDEsMSwxLDAsMSwxLDEsMCwwLDEsMiwwLDAsCjMsMywyLDIsMywwLDIsMywxLDEsMiwwLDAsMCwxLDAsMCwyLDAsMiwwLDAsMCwxLDAsMSwwLDEsMiwwLDIsMiwKMSwxLDEsMSwyLDEsMCwxLDIsMiwyLDEsMSwxLDEsMSwxLDEsMCwxLDEsMSwwLDAsMCwwLDAsMCwxLDEsMCwwLAoyLDMsMiwzLDMsMCwwLDMsMCwxLDEsMCwxLDAsMCwwLDIsMiwxLDIsMCwwLDAsMCwwLDAsMCwwLDIsMCwxLDIsCjIsMiwxLDEsMSwxLDEsMiwyLDIsMSwwLDIsMCwxLDAsMSwwLDAsMSwwLDEsMCwwLDEsMCwwLDAsMCwxLDAsMCwKMywzLDMsMywyLDIsMiwyLDIsMCwyLDEsMSwxLDEsMiwxLDIsMSwxLDAsMiwwLDEsMCwxLDAsMCwyLDAsMSwyLAoxLDEsMSwxLDEsMSwxLDIsMiwxLDEsMCwyLDAsMSwwLDIsMCwwLDEsMSwxLDAsMCwyLDAsMCwwLDEsMSwwLDAsCjIsMywzLDMsMywxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMSwxLDAsMCwwLDAsMCwwLDEsMiwwLDEsMiwKMiwyLDIsMSwxLDIsMSwxLDIsMiwyLDEsMiwwLDEsMSwxLDEsMSwxLDAsMSwxLDEsMSwwLDAsMSwxLDEsMCwwLAoyLDMsMywzLDMsMCwyLDIsMCwyLDEsMCwwLDAsMSwxLDEsMiwwLDIsMCwwLDAsMywwLDAsMCwwLDIsMCwyLDIsCjEsMSwxLDIsMSwyLDEsMSwyLDIsMiwxLDIsMCwxLDEsMSwwLDEsMSwxLDEsMCwyLDEsMCwwLDAsMSwxLDAsMCwKMiwzLDMsMywzLDAsMiwxLDAsMCwyLDAsMCwwLDAsMCwxLDIsMCwyLDAsMCwwLDAsMCwwLDAsMCwyLDAsMSwyLAoxLDEsMSwyLDEsMSwxLDEsMiwyLDIsMCwxLDAsMSwxLDEsMCwwLDEsMSwxLDAsMCwxLDAsMCwwLDAsMSwwLDAsCjMsMywyLDIsMywwLDEsMCwxLDAsMCwwLDAsMCwwLDAsMSwxLDAsMywwLDAsMCwwLDAsMCwwLDAsMSwwLDIsMiwKMSwxLDEsMSwxLDIsMSwxLDIsMiwxLDIsMiwxLDAsMSwxLDEsMSwxLDAsMSwwLDAsMSwwLDAsMCwxLDEsMCwwLAozLDEsMCwxLDAsMiwyLDIsMiwzLDIsMSwxLDEsMiwzLDAsMCwxLDAsMiwxLDEsMCwxLDEsMSwxLDIsMSwxLDEsCjEsMiwyLDEsMiwxLDIsMiwxLDEsMCwxLDIsMSwyLDIsMSwxLDEsMCwwLDEsMSwxLDIsMSwwLDEsMCwwLDAsMCwKMiwxLDAsMSwwLDMsMSwyLDIsMiwyLDEsMiwyLDEsMSwxLDAsMiwxLDIsMiwxLDEsMiwxLDEsMCwyLDEsMSwxLAoxLDIsMiwyLDIsMiwyLDIsMSwyLDAsMSwxLDAsMiwxLDEsMSwxLDEsMCwwLDEsMSwxLDEsMCwxLDAsMCwwLDAsCjIsMSwxLDEsMSwyLDIsMiwyLDEsMiwyLDIsMSwyLDIsMSwxLDIsMSwyLDMsMiwyLDEsMSwxLDEsMCwxLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoyLDIsMiwzLDIsMCwxLDIsMCwxLDIsMSwxLDAsMSwwLDEsMiwxLDIsMCwwLDAsMSwxLDAsMCwwLDEsMCwwLDIsCjEsMSwwLDAsMSwxLDAsMSwxLDEsMSwwLDIsMCwxLDEsMSwwLDAsMSwxLDAsMCwwLDAsMSwwLDAsMCwxLDAsMCwKMiwwLDAsMCwwLDEsMiwyLDIsMiwyLDIsMiwxLDIsMSwxLDEsMSwxLDEsMSwwLDEsMSwxLDEsMSwyLDEsMSwxLAoxLDIsMiwyLDIsMSwxLDIsMSwyLDEsMSwxLDAsMiwxLDIsMSwxLDEsMCwyLDEsMSwxLDEsMCwxLDAsMCwwLDAsCjMsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDEsMCwKMSwxLDAsMSwwLDEsMSwxLDEsMSwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoyLDIsMiwzLDIsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDEsMSwwLDIsMCwwLDAsMCwwLDAsMCwwLDEsMCwxLDIsCjEsMSwxLDEsMSwxLDAsMCwyLDIsMiwyLDIsMCwxLDEsMCwxLDEsMSwxLDEsMCwwLDEsMCwwLDAsMSwxLDAsMSwKMiwzLDEsMiwxLDAsMSwxLDAsMiwyLDIsMCwwLDEsMCwwLDEsMSwxLDEsMCwwLDAsMCwwLDAsMCwxLDAsMSwyLAoxLDEsMSwxLDIsMSwxLDEsMSwxLDEsMSwxLDAsMSwxLDAsMSwwLDEsMCwxLDAsMCwxLDAsMCwwLDAsMSwwLDAsCjIsMiwyLDIsMiwwLDAsMiwwLDAsMiwwLDAsMCwwLDAsMCwxLDAsMSwwLDAsMCwwLDAsMCwwLDAsMiwwLDIsMiwKMSwxLDEsMSwxLDAsMCwxLDIsMSwxLDAsMSwwLDEsMCwwLDAsMCwxLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoxLDIsMiwyLDIsMCwwLDIsMCwxLDEsMCwwLDAsMSwwLDAsMiwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDEsCjAsMCwwLDEsMSwxLDEsMSwxLDEsMSwxLDEsMCwxLDAsMCwxLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMSwyLDIsMywyLDAsMCwxLDAsMCwxLDAsMCwwLDAsMCwwLDEsMCwyLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwyLAoxLDEsMCwwLDEsMCwwLDAsMSwxLDAsMCwxLDAsMSwxLDAsMCwwLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjIsMSwyLDIsMiwxLDIsMSwyLDIsMSwxLDIsMSwxLDEsMCwxLDEsMSwxLDIsMCwxLDAsMSwxLDEsMSwwLDEsMSwKMSwxLDIsMSwxLDEsMSwxLDEsMCwwLDEsMiwxLDEsMSwxLDEsMSwwLDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwLAoxLDAsMCwxLDMsMSwxLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMiwyLDIsMiwxLDAsMCwxLDAsMiwwLDAsMCwwLDAsMSwxLDEsMCwxLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwxLAowLDIsMCwxLDAsMCwxLDEsMiwwLDEsMCwxLDAsMSwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjEsMiwyLDIsMiwwLDEsMSwwLDIsMSwwLDEsMSwxLDAsMCwxLDAsMiwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMSwKMCwxLDAsMCwxLDAsMCwwLDEsMSwwLDAsMSwwLDAsMSwwLDAsMCwxLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoyLDIsMiwyLDIsMCwwLDEsMCwwLDAsMSwwLDEsMCwwLDAsMSwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsCjAsMSwwLDEsMSwxLDAsMCwxLDEsMSwwLDEsMCwwLDAsMCwwLDAsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMiwwLDEsMCwwLDEsMiwxLDEsMSwxLDEsMSwyLDIsMSwwLDAsMSwwLDEsMCwwLDAsMCwxLDEsMSwxLDAsMCwwLAoxLDEsMiwxLDEsMSwxLDAsMCwwLDEsMSwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjIsMiwxLDIsMSwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMSwxLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwKMCwwLDAsMCwwLDAsMCwwLDEsMSwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMSwwLDAsMSwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLAowLDEsMSwwLDEsMSwxLDAsMCwxLDAsMCwxLDAsMSwwLDAsMCwxLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsCjEsMCwxLDAsMCwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMCwwLDEsMCwyLDAsMCwyLDAsMSwwLDAsMSwwLDAsMSwKMSwxLDAsMCwxLDEsMCwxLDAsMCwwLDEsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwxLDEsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwxLDAsCjEsMSwxLDEsMSwxLDEsMiwwLDAsMCwwLDAsMCwyLDEsMCwxLDEsMCwwLDEsMSwxLDAsMSwwLDAsMCwwLDAsMCwKMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjEsMCwwLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwwLDEsMCwxLDEsMCwxLDEsMSwxLDEsMCwxLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLAopCgpMYXRpbjVCdWxnYXJpYW5Nb2RlbCA9IHsKICAnY2hhcl90b19vcmRlcl9tYXAnOiBMYXRpbjVfQnVsZ2FyaWFuQ2hhclRvT3JkZXJNYXAsCiAgJ3ByZWNlZGVuY2VfbWF0cml4JzogQnVsZ2FyaWFuTGFuZ01vZGVsLAogICd0eXBpY2FsX3Bvc2l0aXZlX3JhdGlvJzogMC45NjkzOTIsCiAgJ2tlZXBfZW5nbGlzaF9sZXR0ZXInOiBGYWxzZSwKICAnY2hhcnNldF9uYW1lJzogIklTTy04ODU5LTUiLAogICdsYW5ndWFnZSc6ICdCdWxnYWlyYW4nLAp9CgpXaW4xMjUxQnVsZ2FyaWFuTW9kZWwgPSB7CiAgJ2NoYXJfdG9fb3JkZXJfbWFwJzogd2luMTI1MUJ1bGdhcmlhbkNoYXJUb09yZGVyTWFwLAogICdwcmVjZWRlbmNlX21hdHJpeCc6IEJ1bGdhcmlhbkxhbmdNb2RlbCwKICAndHlwaWNhbF9wb3NpdGl2ZV9yYXRpbyc6IDAuOTY5MzkyLAogICdrZWVwX2VuZ2xpc2hfbGV0dGVyJzogRmFsc2UsCiAgJ2NoYXJzZXRfbmFtZSc6ICJ3aW5kb3dzLTEyNTEiLAogICdsYW5ndWFnZSc6ICdCdWxnYXJpYW4nLAp9ClBLAwQUAAAAAAAAACEAyPFWmxxGAAAcRgAARQAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9sYW5nY3lyaWxsaWNtb2RlbC5weSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBCRUdJTiBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFRoZSBPcmlnaW5hbCBDb2RlIGlzIE1vemlsbGEgQ29tbXVuaWNhdG9yIGNsaWVudCBjb2RlLgojCiMgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiMgTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24uCiMgUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMTk5OAojIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIwojIENvbnRyaWJ1dG9yKHMpOgojICAgTWFyayBQaWxncmltIC0gcG9ydCB0byBQeXRob24KIwojIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCiMgMDIxMTAtMTMwMSAgVVNBCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRU5EIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKIyBLT0k4LVIgbGFuZ3VhZ2UgbW9kZWwKIyBDaGFyYWN0ZXIgTWFwcGluZyBUYWJsZToKS09JOFJfY2hhcl90b19vcmRlcl9tYXAgPSAoCjI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTQsMjU1LDI1NSwyNTQsMjU1LDI1NSwgICMgMDAKMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LCAgIyAxMAoyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDIwCjI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgMzAKMjUzLDE0MiwxNDMsMTQ0LDE0NSwxNDYsMTQ3LDE0OCwxNDksMTUwLDE1MSwxNTIsIDc0LDE1MywgNzUsMTU0LCAgIyA0MAoxNTUsMTU2LDE1NywxNTgsMTU5LDE2MCwxNjEsMTYyLDE2MywxNjQsMTY1LDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDUwCjI1MywgNzEsMTcyLCA2NiwxNzMsIDY1LDE3NCwgNzYsMTc1LCA2NCwxNzYsMTc3LCA3NywgNzIsMTc4LCA2OSwgICMgNjAKIDY3LDE3OSwgNzgsIDczLDE4MCwxODEsIDc5LDE4MiwxODMsMTg0LDE4NSwyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyA3MAoxOTEsMTkyLDE5MywxOTQsMTk1LDE5NiwxOTcsMTk4LDE5OSwyMDAsMjAxLDIwMiwyMDMsMjA0LDIwNSwyMDYsICAjIDgwCjIwNywyMDgsMjA5LDIxMCwyMTEsMjEyLDIxMywyMTQsMjE1LDIxNiwyMTcsMjE4LDIxOSwyMjAsMjIxLDIyMiwgICMgOTAKMjIzLDIyNCwyMjUsIDY4LDIyNiwyMjcsMjI4LDIyOSwyMzAsMjMxLDIzMiwyMzMsMjM0LDIzNSwyMzYsMjM3LCAgIyBhMAoyMzgsMjM5LDI0MCwyNDEsMjQyLDI0MywyNDQsMjQ1LDI0NiwyNDcsMjQ4LDI0OSwyNTAsMjUxLDI1MiwyNTMsICAjIGIwCiAyNywgIDMsIDIxLCAyOCwgMTMsICAyLCAzOSwgMTksIDI2LCAgNCwgMjMsIDExLCAgOCwgMTIsICA1LCAgMSwgICMgYzAKIDE1LCAxNiwgIDksICA3LCAgNiwgMTQsIDI0LCAxMCwgMTcsIDE4LCAyMCwgMjUsIDMwLCAyOSwgMjIsIDU0LCAgIyBkMAogNTksIDM3LCA0NCwgNTgsIDQxLCA0OCwgNTMsIDQ2LCA1NSwgNDIsIDYwLCAzNiwgNDksIDM4LCAzMSwgMzQsICAjIGUwCiAzNSwgNDMsIDQ1LCAzMiwgNDAsIDUyLCA1NiwgMzMsIDYxLCA2MiwgNTEsIDU3LCA0NywgNjMsIDUwLCA3MCwgICMgZjAKKQoKd2luMTI1MV9jaGFyX3RvX29yZGVyX21hcCA9ICgKMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NCwyNTUsMjU1LDI1NCwyNTUsMjU1LCAgIyAwMAoyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsICAjIDEwCjI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgMjAKMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyAzMAoyNTMsMTQyLDE0MywxNDQsMTQ1LDE0NiwxNDcsMTQ4LDE0OSwxNTAsMTUxLDE1MiwgNzQsMTUzLCA3NSwxNTQsICAjIDQwCjE1NSwxNTYsMTU3LDE1OCwxNTksMTYwLDE2MSwxNjIsMTYzLDE2NCwxNjUsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgNTAKMjUzLCA3MSwxNzIsIDY2LDE3MywgNjUsMTc0LCA3NiwxNzUsIDY0LDE3NiwxNzcsIDc3LCA3MiwxNzgsIDY5LCAgIyA2MAogNjcsMTc5LCA3OCwgNzMsMTgwLDE4MSwgNzksMTgyLDE4MywxODQsMTg1LDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDcwCjE5MSwxOTIsMTkzLDE5NCwxOTUsMTk2LDE5NywxOTgsMTk5LDIwMCwyMDEsMjAyLDIwMywyMDQsMjA1LDIwNiwKMjA3LDIwOCwyMDksMjEwLDIxMSwyMTIsMjEzLDIxNCwyMTUsMjE2LDIxNywyMTgsMjE5LDIyMCwyMjEsMjIyLAoyMjMsMjI0LDIyNSwyMjYsMjI3LDIyOCwyMjksMjMwLDIzMSwyMzIsMjMzLDIzNCwyMzUsMjM2LDIzNywyMzgsCjIzOSwyNDAsMjQxLDI0MiwyNDMsMjQ0LDI0NSwyNDYsIDY4LDI0NywyNDgsMjQ5LDI1MCwyNTEsMjUyLDI1MywKIDM3LCA0NCwgMzMsIDQ2LCA0MSwgNDgsIDU2LCA1MSwgNDIsIDYwLCAzNiwgNDksIDM4LCAzMSwgMzQsIDM1LAogNDUsIDMyLCA0MCwgNTIsIDUzLCA1NSwgNTgsIDUwLCA1NywgNjMsIDcwLCA2MiwgNjEsIDQ3LCA1OSwgNDMsCiAgMywgMjEsIDEwLCAxOSwgMTMsICAyLCAyNCwgMjAsICA0LCAyMywgMTEsICA4LCAxMiwgIDUsICAxLCAxNSwKICA5LCAgNywgIDYsIDE0LCAzOSwgMjYsIDI4LCAyMiwgMjUsIDI5LCA1NCwgMTgsIDE3LCAzMCwgMjcsIDE2LAopCgpsYXRpbjVfY2hhcl90b19vcmRlcl9tYXAgPSAoCjI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTQsMjU1LDI1NSwyNTQsMjU1LDI1NSwgICMgMDAKMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LCAgIyAxMAoyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDIwCjI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgMzAKMjUzLDE0MiwxNDMsMTQ0LDE0NSwxNDYsMTQ3LDE0OCwxNDksMTUwLDE1MSwxNTIsIDc0LDE1MywgNzUsMTU0LCAgIyA0MAoxNTUsMTU2LDE1NywxNTgsMTU5LDE2MCwxNjEsMTYyLDE2MywxNjQsMTY1LDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDUwCjI1MywgNzEsMTcyLCA2NiwxNzMsIDY1LDE3NCwgNzYsMTc1LCA2NCwxNzYsMTc3LCA3NywgNzIsMTc4LCA2OSwgICMgNjAKIDY3LDE3OSwgNzgsIDczLDE4MCwxODEsIDc5LDE4MiwxODMsMTg0LDE4NSwyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyA3MAoxOTEsMTkyLDE5MywxOTQsMTk1LDE5NiwxOTcsMTk4LDE5OSwyMDAsMjAxLDIwMiwyMDMsMjA0LDIwNSwyMDYsCjIwNywyMDgsMjA5LDIxMCwyMTEsMjEyLDIxMywyMTQsMjE1LDIxNiwyMTcsMjE4LDIxOSwyMjAsMjIxLDIyMiwKMjIzLDIyNCwyMjUsMjI2LDIyNywyMjgsMjI5LDIzMCwyMzEsMjMyLDIzMywyMzQsMjM1LDIzNiwyMzcsMjM4LAogMzcsIDQ0LCAzMywgNDYsIDQxLCA0OCwgNTYsIDUxLCA0MiwgNjAsIDM2LCA0OSwgMzgsIDMxLCAzNCwgMzUsCiA0NSwgMzIsIDQwLCA1MiwgNTMsIDU1LCA1OCwgNTAsIDU3LCA2MywgNzAsIDYyLCA2MSwgNDcsIDU5LCA0MywKICAzLCAyMSwgMTAsIDE5LCAxMywgIDIsIDI0LCAyMCwgIDQsIDIzLCAxMSwgIDgsIDEyLCAgNSwgIDEsIDE1LAogIDksICA3LCAgNiwgMTQsIDM5LCAyNiwgMjgsIDIyLCAyNSwgMjksIDU0LCAxOCwgMTcsIDMwLCAyNywgMTYsCjIzOSwgNjgsMjQwLDI0MSwyNDIsMjQzLDI0NCwyNDUsMjQ2LDI0NywyNDgsMjQ5LDI1MCwyNTEsMjUyLDI1NSwKKQoKbWFjQ3lyaWxsaWNfY2hhcl90b19vcmRlcl9tYXAgPSAoCjI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTQsMjU1LDI1NSwyNTQsMjU1LDI1NSwgICMgMDAKMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LCAgIyAxMAoyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDIwCjI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgMzAKMjUzLDE0MiwxNDMsMTQ0LDE0NSwxNDYsMTQ3LDE0OCwxNDksMTUwLDE1MSwxNTIsIDc0LDE1MywgNzUsMTU0LCAgIyA0MAoxNTUsMTU2LDE1NywxNTgsMTU5LDE2MCwxNjEsMTYyLDE2MywxNjQsMTY1LDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDUwCjI1MywgNzEsMTcyLCA2NiwxNzMsIDY1LDE3NCwgNzYsMTc1LCA2NCwxNzYsMTc3LCA3NywgNzIsMTc4LCA2OSwgICMgNjAKIDY3LDE3OSwgNzgsIDczLDE4MCwxODEsIDc5LDE4MiwxODMsMTg0LDE4NSwyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyA3MAogMzcsIDQ0LCAzMywgNDYsIDQxLCA0OCwgNTYsIDUxLCA0MiwgNjAsIDM2LCA0OSwgMzgsIDMxLCAzNCwgMzUsCiA0NSwgMzIsIDQwLCA1MiwgNTMsIDU1LCA1OCwgNTAsIDU3LCA2MywgNzAsIDYyLCA2MSwgNDcsIDU5LCA0MywKMTkxLDE5MiwxOTMsMTk0LDE5NSwxOTYsMTk3LDE5OCwxOTksMjAwLDIwMSwyMDIsMjAzLDIwNCwyMDUsMjA2LAoyMDcsMjA4LDIwOSwyMTAsMjExLDIxMiwyMTMsMjE0LDIxNSwyMTYsMjE3LDIxOCwyMTksMjIwLDIyMSwyMjIsCjIyMywyMjQsMjI1LDIyNiwyMjcsMjI4LDIyOSwyMzAsMjMxLDIzMiwyMzMsMjM0LDIzNSwyMzYsMjM3LDIzOCwKMjM5LDI0MCwyNDEsMjQyLDI0MywyNDQsMjQ1LDI0NiwyNDcsMjQ4LDI0OSwyNTAsMjUxLDI1MiwgNjgsIDE2LAogIDMsIDIxLCAxMCwgMTksIDEzLCAgMiwgMjQsIDIwLCAgNCwgMjMsIDExLCAgOCwgMTIsICA1LCAgMSwgMTUsCiAgOSwgIDcsICA2LCAxNCwgMzksIDI2LCAyOCwgMjIsIDI1LCAyOSwgNTQsIDE4LCAxNywgMzAsIDI3LDI1NSwKKQoKSUJNODU1X2NoYXJfdG9fb3JkZXJfbWFwID0gKAoyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU0LDI1NSwyNTUsMjU0LDI1NSwyNTUsICAjIDAwCjI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwgICMgMTAKMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyAyMAoyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDMwCjI1MywxNDIsMTQzLDE0NCwxNDUsMTQ2LDE0NywxNDgsMTQ5LDE1MCwxNTEsMTUyLCA3NCwxNTMsIDc1LDE1NCwgICMgNDAKMTU1LDE1NiwxNTcsMTU4LDE1OSwxNjAsMTYxLDE2MiwxNjMsMTY0LDE2NSwyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyA1MAoyNTMsIDcxLDE3MiwgNjYsMTczLCA2NSwxNzQsIDc2LDE3NSwgNjQsMTc2LDE3NywgNzcsIDcyLDE3OCwgNjksICAjIDYwCiA2NywxNzksIDc4LCA3MywxODAsMTgxLCA3OSwxODIsMTgzLDE4NCwxODUsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgNzAKMTkxLDE5MiwxOTMsMTk0LCA2OCwxOTUsMTk2LDE5NywxOTgsMTk5LDIwMCwyMDEsMjAyLDIwMywyMDQsMjA1LAoyMDYsMjA3LDIwOCwyMDksMjEwLDIxMSwyMTIsMjEzLDIxNCwyMTUsMjE2LDIxNywgMjcsIDU5LCA1NCwgNzAsCiAgMywgMzcsIDIxLCA0NCwgMjgsIDU4LCAxMywgNDEsICAyLCA0OCwgMzksIDUzLCAxOSwgNDYsMjE4LDIxOSwKMjIwLDIyMSwyMjIsMjIzLDIyNCwgMjYsIDU1LCAgNCwgNDIsMjI1LDIyNiwyMjcsMjI4LCAyMywgNjAsMjI5LAoyMzAsMjMxLDIzMiwyMzMsMjM0LDIzNSwgMTEsIDM2LDIzNiwyMzcsMjM4LDIzOSwyNDAsMjQxLDI0MiwyNDMsCiAgOCwgNDksIDEyLCAzOCwgIDUsIDMxLCAgMSwgMzQsIDE1LDI0NCwyNDUsMjQ2LDI0NywgMzUsIDE2LDI0OCwKIDQzLCAgOSwgNDUsICA3LCAzMiwgIDYsIDQwLCAxNCwgNTIsIDI0LCA1NiwgMTAsIDMzLCAxNywgNjEsMjQ5LAoyNTAsIDE4LCA2MiwgMjAsIDUxLCAyNSwgNTcsIDMwLCA0NywgMjksIDYzLCAyMiwgNTAsMjUxLDI1MiwyNTUsCikKCklCTTg2Nl9jaGFyX3RvX29yZGVyX21hcCA9ICgKMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NCwyNTUsMjU1LDI1NCwyNTUsMjU1LCAgIyAwMAoyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsICAjIDEwCjI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgMjAKMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyAzMAoyNTMsMTQyLDE0MywxNDQsMTQ1LDE0NiwxNDcsMTQ4LDE0OSwxNTAsMTUxLDE1MiwgNzQsMTUzLCA3NSwxNTQsICAjIDQwCjE1NSwxNTYsMTU3LDE1OCwxNTksMTYwLDE2MSwxNjIsMTYzLDE2NCwxNjUsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgNTAKMjUzLCA3MSwxNzIsIDY2LDE3MywgNjUsMTc0LCA3NiwxNzUsIDY0LDE3NiwxNzcsIDc3LCA3MiwxNzgsIDY5LCAgIyA2MAogNjcsMTc5LCA3OCwgNzMsMTgwLDE4MSwgNzksMTgyLDE4MywxODQsMTg1LDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDcwCiAzNywgNDQsIDMzLCA0NiwgNDEsIDQ4LCA1NiwgNTEsIDQyLCA2MCwgMzYsIDQ5LCAzOCwgMzEsIDM0LCAzNSwKIDQ1LCAzMiwgNDAsIDUyLCA1MywgNTUsIDU4LCA1MCwgNTcsIDYzLCA3MCwgNjIsIDYxLCA0NywgNTksIDQzLAogIDMsIDIxLCAxMCwgMTksIDEzLCAgMiwgMjQsIDIwLCAgNCwgMjMsIDExLCAgOCwgMTIsICA1LCAgMSwgMTUsCjE5MSwxOTIsMTkzLDE5NCwxOTUsMTk2LDE5NywxOTgsMTk5LDIwMCwyMDEsMjAyLDIwMywyMDQsMjA1LDIwNiwKMjA3LDIwOCwyMDksMjEwLDIxMSwyMTIsMjEzLDIxNCwyMTUsMjE2LDIxNywyMTgsMjE5LDIyMCwyMjEsMjIyLAoyMjMsMjI0LDIyNSwyMjYsMjI3LDIyOCwyMjksMjMwLDIzMSwyMzIsMjMzLDIzNCwyMzUsMjM2LDIzNywyMzgsCiAgOSwgIDcsICA2LCAxNCwgMzksIDI2LCAyOCwgMjIsIDI1LCAyOSwgNTQsIDE4LCAxNywgMzAsIDI3LCAxNiwKMjM5LCA2OCwyNDAsMjQxLDI0MiwyNDMsMjQ0LDI0NSwyNDYsMjQ3LDI0OCwyNDksMjUwLDI1MSwyNTIsMjU1LAopCgojIE1vZGVsIFRhYmxlOgojIHRvdGFsIHNlcXVlbmNlczogMTAwJQojIGZpcnN0IDUxMiBzZXF1ZW5jZXM6IDk3LjY2MDElCiMgZmlyc3QgMTAyNCBzZXF1ZW5jZXM6IDIuMzM4OSUKIyByZXN0ICBzZXF1ZW5jZXM6ICAgICAgMC4xMjM3JQojIG5lZ2F0aXZlIHNlcXVlbmNlczogICAwLjAwMDklClJ1c3NpYW5MYW5nTW9kZWwgPSAoCjAsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywxLDEsMywzLDMsMywxLDMsMywzLDIsMywyLDMsMywKMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywwLDMsMiwyLDIsMiwyLDAsMCwyLAozLDMsMywyLDMsMywzLDMsMywzLDMsMywzLDMsMiwzLDMsMCwwLDMsMywzLDMsMywzLDMsMywzLDIsMywyLDAsCjAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDMsMiwyLDMsMywzLDMsMywzLDMsMywzLDIsMywzLDAsMCwzLDMsMywzLDMsMywzLDMsMiwzLDMsMSwwLAowLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMiwzLDIsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywwLDAsMywzLDMsMywzLDMsMywzLDMsMywzLDIsMSwKMCwwLDAsMCwwLDAsMCwyLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMiwzLDMsMCwwLDMsMywzLDMsMywzLDMsMywzLDMsMywyLDEsCjAsMCwwLDAsMCwxLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDMsMywzLDMsMywzLDIsMiwyLDMsMSwzLDMsMSwzLDMsMywzLDIsMiwzLDAsMiwyLDIsMywzLDIsMSwwLAowLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywzLDMsMywzLDIsMywzLDMsMywzLDIsMiwzLDIsMywzLDMsMiwxLDIsMiwwLDEsMiwyLDIsMiwyLDIsMCwKMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDIsMiwyLDMsMCwyLDIsMywzLDIsMSwyLDAsCjAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDMsMywzLDMsMiwzLDMsMSwyLDMsMiwyLDMsMiwzLDMsMywzLDIsMiwzLDAsMywyLDIsMywxLDEsMSwwLAowLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywzLDMsMywzLDMsMywyLDIsMywzLDMsMywzLDIsMywzLDMsMywyLDIsMiwwLDMsMywzLDIsMiwyLDIsMCwKMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMywzLDMsMywzLDMsMywzLDIsMywyLDMsMywzLDMsMywzLDIsMywyLDIsMCwxLDMsMiwxLDIsMiwxLDAsCjAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDMsMywzLDMsMywzLDMsMywzLDIsMSwxLDMsMCwxLDEsMSwxLDIsMSwxLDAsMiwyLDIsMSwyLDAsMSwwLAowLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywzLDMsMywzLDIsMywzLDIsMiwyLDIsMSwzLDIsMywyLDMsMiwxLDIsMiwwLDEsMSwyLDEsMiwxLDIsMCwKMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMywzLDMsMywzLDMsMywzLDMsMywyLDIsMywyLDMsMywzLDIsMiwyLDIsMCwyLDIsMiwyLDMsMSwxLDAsCjAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwKMywyLDMsMiwyLDMsMywzLDMsMywzLDMsMywzLDEsMywyLDAsMCwzLDMsMywzLDIsMywzLDMsMywyLDMsMiwwLAowLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjIsMywzLDMsMywzLDIsMiwzLDMsMCwyLDEsMCwzLDIsMywyLDMsMCwwLDEsMiwwLDAsMSwwLDEsMiwxLDEsMCwKMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDAsMywwLDIsMywzLDMsMywyLDMsMywzLDMsMSwyLDIsMCwwLDIsMywyLDIsMiwzLDIsMywyLDIsMywwLDAsCjAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywyLDMsMCwyLDMsMiwzLDAsMSwyLDMsMywyLDAsMiwzLDAsMCwyLDMsMiwyLDAsMSwzLDEsMywyLDIsMSwwLAowLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMSwzLDAsMiwzLDMsMywzLDMsMywzLDMsMiwxLDMsMiwwLDAsMiwyLDMsMywzLDIsMywzLDAsMiwyLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMywzLDMsMywyLDIsMywzLDIsMiwyLDMsMywwLDAsMSwxLDEsMSwxLDIsMCwwLDEsMSwxLDEsMCwxLDAsCjAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDMsMywzLDMsMiwyLDMsMywzLDMsMywzLDMsMCwzLDIsMywzLDIsMywyLDAsMiwxLDAsMSwxLDAsMSwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywzLDMsMywzLDIsMywzLDMsMiwyLDIsMiwzLDEsMywyLDMsMSwxLDIsMSwwLDIsMiwyLDIsMSwzLDEsMCwKMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLAoyLDIsMywzLDMsMywzLDEsMiwyLDEsMywxLDAsMywwLDAsMywwLDAsMCwxLDEsMCwxLDIsMSwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywyLDIsMSwxLDMsMywzLDIsMiwxLDIsMiwzLDEsMSwyLDAsMCwyLDIsMSwzLDAsMCwyLDEsMSwyLDEsMSwwLAowLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMiwzLDMsMywzLDEsMiwyLDIsMSwyLDEsMywzLDEsMSwyLDEsMiwxLDIsMiwwLDIsMCwwLDEsMSwwLDEsMCwKMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoyLDMsMywzLDMsMywyLDEsMywyLDIsMywyLDAsMywyLDAsMywwLDEsMCwxLDEsMCwwLDEsMSwxLDEsMCwxLDAsCjAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDIsMywzLDMsMiwyLDIsMywzLDEsMiwxLDIsMSwwLDEsMCwxLDEsMCwxLDAsMCwyLDEsMSwxLDAsMSwwLAowLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMSwxLDIsMSwyLDMsMywyLDIsMSwyLDIsMywwLDIsMSwwLDAsMiwyLDMsMiwxLDIsMiwyLDIsMiwzLDEsMCwKMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMywzLDMsMSwxLDAsMSwxLDIsMiwxLDEsMywwLDAsMSwzLDEsMSwxLDAsMCwwLDEsMCwxLDEsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMiwxLDMsMywzLDIsMCwwLDAsMiwxLDAsMSwwLDIsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjIsMCwxLDAsMCwyLDMsMiwyLDIsMSwyLDIsMiwxLDIsMSwwLDAsMSwxLDEsMCwyLDAsMSwxLDEsMCwwLDEsMSwKMSwwLDAsMCwwLDAsMSwyLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLAoyLDMsMywzLDMsMCwwLDAsMCwxLDAsMCwwLDAsMywwLDEsMiwxLDAsMCwwLDAsMCwwLDAsMSwxLDAsMCwxLDEsCjEsMCwxLDAsMSwyLDAsMCwxLDEsMiwxLDAsMSwxLDEsMSwwLDEsMSwxLDEsMCwxLDAsMCwxLDAsMCwxLDEsMCwKMiwyLDMsMiwyLDIsMywxLDIsMiwyLDIsMiwyLDIsMiwxLDEsMSwxLDEsMSwxLDAsMSwwLDEsMSwxLDAsMiwxLAoxLDEsMSwxLDEsMSwxLDEsMiwxLDEsMSwxLDEsMSwxLDEsMSwxLDAsMSwwLDEsMSwwLDEsMSwxLDAsMSwxLDAsCjMsMywzLDIsMiwyLDIsMywyLDIsMSwxLDIsMiwyLDIsMSwxLDMsMSwyLDEsMiwwLDAsMSwxLDAsMSwwLDIsMSwKMSwxLDEsMSwxLDIsMSwwLDEsMSwxLDEsMCwxLDAsMCwxLDEsMCwwLDEsMCwxLDAsMCwxLDAsMCwwLDEsMSwwLAoyLDAsMCwxLDAsMywyLDIsMiwyLDEsMiwxLDIsMSwyLDAsMCwwLDIsMSwyLDIsMSwxLDIsMiwwLDEsMSwwLDIsCjEsMSwxLDEsMSwwLDEsMSwxLDIsMSwxLDEsMiwxLDAsMSwyLDEsMSwxLDEsMCwxLDEsMSwwLDAsMSwwLDAsMSwKMSwzLDIsMiwyLDEsMSwxLDIsMywwLDAsMCwwLDIsMCwyLDIsMSwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMSwxLAoxLDAsMSwxLDAsMSwwLDEsMSwwLDEsMSwwLDIsMCwwLDEsMSwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMSwxLDAsCjIsMywyLDMsMiwxLDIsMiwyLDIsMSwwLDAsMCwyLDAsMCwxLDEsMCwwLDAsMCwwLDAsMCwxLDEsMCwwLDIsMSwKMSwxLDIsMSwwLDIsMCwwLDEsMCwxLDAsMCwxLDAsMCwxLDEsMCwxLDEsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLAozLDAsMCwxLDAsMiwyLDIsMywyLDIsMiwyLDIsMiwyLDAsMCwwLDIsMSwyLDEsMSwxLDIsMiwwLDAsMCwxLDIsCjEsMSwxLDEsMSwwLDEsMiwxLDEsMSwxLDEsMSwxLDAsMSwxLDEsMSwxLDEsMCwxLDEsMSwxLDEsMSwwLDAsMSwKMiwzLDIsMywzLDIsMCwxLDEsMSwwLDAsMSwwLDIsMCwxLDEsMywxLDAsMCwwLDAsMCwwLDAsMSwwLDAsMiwxLAoxLDEsMSwxLDEsMSwxLDAsMSwwLDEsMSwxLDEsMCwxLDEsMSwwLDAsMSwxLDAsMSwwLDAsMCwwLDAsMCwxLDAsCjIsMywzLDMsMywxLDIsMiwyLDIsMCwxLDEsMCwyLDEsMSwxLDIsMSwwLDEsMSwwLDAsMSwwLDEsMCwwLDIsMCwKMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoyLDMsMywzLDIsMCwwLDEsMSwyLDIsMSwwLDAsMiwwLDEsMSwzLDAsMCwxLDAsMCwwLDAsMCwxLDAsMSwyLDEsCjEsMSwyLDAsMSwxLDEsMCwxLDAsMSwxLDAsMSwwLDEsMSwxLDEsMCwxLDAsMCwwLDAsMCwwLDEsMCwxLDEsMCwKMSwzLDIsMywyLDEsMCwwLDIsMiwyLDAsMSwwLDIsMCwxLDEsMSwwLDEsMCwwLDAsMywwLDEsMSwwLDAsMiwxLAoxLDEsMSwwLDEsMSwwLDAsMCwwLDEsMSwwLDEsMCwwLDIsMSwxLDAsMSwwLDAsMCwxLDAsMSwwLDAsMSwxLDAsCjMsMSwyLDEsMSwyLDIsMiwyLDIsMiwxLDIsMiwxLDEsMCwwLDAsMiwyLDIsMCwwLDAsMSwyLDEsMCwxLDAsMSwKMiwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMCwyLDEsMSwxLDAsMSwwLDEsMSwwLDEsMSwxLDAsMCwxLAozLDAsMCwwLDAsMiwwLDEsMSwxLDEsMSwxLDEsMCwxLDAsMCwwLDEsMSwxLDAsMSwwLDEsMSwwLDAsMSwwLDEsCjEsMSwwLDAsMSwwLDAsMCwxLDAsMSwxLDAsMCwxLDAsMSwwLDEsMCwwLDAsMCwxLDAsMCwwLDEsMCwwLDAsMSwKMSwzLDMsMiwyLDAsMCwwLDIsMiwwLDAsMCwxLDIsMCwxLDEsMiwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMiwxLAowLDEsMSwwLDAsMSwxLDAsMCwwLDEsMSwwLDEsMSwwLDEsMSwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsCjIsMywyLDMsMiwwLDAsMCwwLDEsMSwwLDAsMCwyLDAsMiwwLDIsMCwwLDAsMCwwLDEsMCwwLDEsMCwwLDEsMSwKMSwxLDIsMCwxLDIsMSwwLDEsMSwyLDEsMSwxLDEsMSwyLDEsMSwwLDEsMCwwLDEsMSwxLDEsMSwwLDEsMSwwLAoxLDMsMiwyLDIsMSwwLDAsMiwyLDEsMCwxLDIsMiwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwxLDEsCjAsMCwxLDEsMCwxLDEsMCwwLDEsMSwwLDEsMSwwLDAsMSwxLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMSwwLDAsMSwwLDIsMywxLDIsMiwyLDIsMiwyLDEsMSwwLDAsMCwxLDAsMSwwLDIsMSwxLDEsMCwwLDAsMCwxLAoxLDEsMCwxLDEsMCwxLDEsMSwxLDAsMCwwLDEsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsCjIsMCwyLDAsMCwxLDAsMywyLDEsMiwxLDIsMiwwLDEsMCwwLDAsMiwxLDAsMCwyLDEsMSwxLDEsMCwyLDAsMiwKMiwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwyLDEsMCwxLDEsMSwxLDAsMCwwLDEsMSwxLDEsMCwxLDAsMCwxLAoxLDIsMiwyLDIsMSwwLDAsMSwwLDAsMCwwLDAsMiwwLDEsMSwxLDEsMCwwLDAsMCwxLDAsMSwyLDAsMCwyLDAsCjEsMCwxLDEsMSwyLDEsMCwxLDAsMSwxLDAsMCwxLDAsMSwxLDEsMCwxLDAsMCwwLDEsMCwwLDEsMCwxLDEsMCwKMiwxLDIsMiwyLDAsMywwLDEsMSwwLDAsMCwwLDIsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLAowLDAsMCwxLDEsMSwwLDAsMSwwLDEsMCwwLDAsMCwwLDEsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsCjEsMiwyLDMsMiwyLDAsMCwxLDEsMiwwLDEsMiwxLDAsMSwwLDEsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMSwKMCwxLDEsMCwwLDEsMSwwLDAsMSwxLDAsMCwxLDEsMCwxLDEsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDEsMSwwLAoyLDIsMSwxLDIsMSwyLDIsMiwyLDIsMSwyLDIsMCwxLDAsMCwwLDEsMiwyLDIsMSwyLDEsMSwxLDEsMSwyLDEsCjEsMSwxLDEsMSwxLDEsMSwxLDEsMCwwLDEsMSwxLDAsMSwxLDEsMCwwLDAsMCwxLDEsMSwwLDEsMSwwLDAsMSwKMSwyLDIsMiwyLDAsMSwwLDIsMiwwLDAsMCwwLDIsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLAowLDAsMSwwLDAsMSwwLDAsMCwwLDEsMCwxLDEsMCwwLDEsMSwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoxLDIsMiwyLDIsMCwwLDAsMiwyLDIsMCwxLDAsMSwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDEsCjAsMSwxLDAsMCwxLDEsMCwwLDAsMSwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMSwyLDIsMiwyLDAsMCwwLDAsMSwwLDAsMSwxLDIsMCwwLDAsMCwxLDAsMSwwLDAsMSwwLDAsMiwwLDAsMCwxLAowLDAsMSwwLDAsMSwwLDAsMCwxLDEsMCwwLDAsMCwwLDEsMCwwLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjEsMiwyLDIsMSwxLDIsMCwyLDEsMSwxLDEsMCwyLDIsMCwwLDAsMCwwLDAsMCwwLDAsMSwxLDAsMCwwLDEsMSwKMCwwLDEsMCwxLDEsMCwwLDAsMCwxLDAsMCwwLDAsMCwxLDEsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoxLDAsMiwxLDIsMCwwLDAsMCwwLDEsMCwwLDAsMSwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsCjAsMCwxLDAsMSwxLDAsMCwwLDAsMSwwLDAsMCwwLDAsMSwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwKMSwwLDAsMCwwLDIsMCwxLDIsMSwwLDEsMSwxLDAsMSwwLDAsMCwxLDAsMSwwLDAsMSwwLDEsMCwwLDAsMCwxLAowLDAsMCwwLDAsMSwwLDAsMSwxLDAsMCwxLDEsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsCjIsMiwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwKMSwwLDAsMCwxLDAsMCwwLDEsMSwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDEsMCwwLDEsMCwwLDAsMCwwLAoyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsCjEsMSwxLDAsMSwwLDEsMCwwLDEsMSwxLDEsMCwwLDAsMSwwLDAsMCwwLDEsMCwwLDAsMSwwLDEsMCwwLDAsMCwKMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLAoxLDEsMCwxLDEsMCwxLDAsMSwwLDAsMCwwLDEsMSwwLDEsMSwwLDAsMCwwLDAsMSwwLDEsMSwwLDEsMCwwLDAsCjAsMSwxLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDEsMCwwLDAsMCwxLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLAopCgpLb2k4ck1vZGVsID0gewogICdjaGFyX3RvX29yZGVyX21hcCc6IEtPSThSX2NoYXJfdG9fb3JkZXJfbWFwLAogICdwcmVjZWRlbmNlX21hdHJpeCc6IFJ1c3NpYW5MYW5nTW9kZWwsCiAgJ3R5cGljYWxfcG9zaXRpdmVfcmF0aW8nOiAwLjk3NjYwMSwKICAna2VlcF9lbmdsaXNoX2xldHRlcic6IEZhbHNlLAogICdjaGFyc2V0X25hbWUnOiAiS09JOC1SIiwKICAnbGFuZ3VhZ2UnOiAnUnVzc2lhbicsCn0KCldpbjEyNTFDeXJpbGxpY01vZGVsID0gewogICdjaGFyX3RvX29yZGVyX21hcCc6IHdpbjEyNTFfY2hhcl90b19vcmRlcl9tYXAsCiAgJ3ByZWNlZGVuY2VfbWF0cml4JzogUnVzc2lhbkxhbmdNb2RlbCwKICAndHlwaWNhbF9wb3NpdGl2ZV9yYXRpbyc6IDAuOTc2NjAxLAogICdrZWVwX2VuZ2xpc2hfbGV0dGVyJzogRmFsc2UsCiAgJ2NoYXJzZXRfbmFtZSc6ICJ3aW5kb3dzLTEyNTEiLAogICdsYW5ndWFnZSc6ICdSdXNzaWFuJywKfQoKTGF0aW41Q3lyaWxsaWNNb2RlbCA9IHsKICAnY2hhcl90b19vcmRlcl9tYXAnOiBsYXRpbjVfY2hhcl90b19vcmRlcl9tYXAsCiAgJ3ByZWNlZGVuY2VfbWF0cml4JzogUnVzc2lhbkxhbmdNb2RlbCwKICAndHlwaWNhbF9wb3NpdGl2ZV9yYXRpbyc6IDAuOTc2NjAxLAogICdrZWVwX2VuZ2xpc2hfbGV0dGVyJzogRmFsc2UsCiAgJ2NoYXJzZXRfbmFtZSc6ICJJU08tODg1OS01IiwKICAnbGFuZ3VhZ2UnOiAnUnVzc2lhbicsCn0KCk1hY0N5cmlsbGljTW9kZWwgPSB7CiAgJ2NoYXJfdG9fb3JkZXJfbWFwJzogbWFjQ3lyaWxsaWNfY2hhcl90b19vcmRlcl9tYXAsCiAgJ3ByZWNlZGVuY2VfbWF0cml4JzogUnVzc2lhbkxhbmdNb2RlbCwKICAndHlwaWNhbF9wb3NpdGl2ZV9yYXRpbyc6IDAuOTc2NjAxLAogICdrZWVwX2VuZ2xpc2hfbGV0dGVyJzogRmFsc2UsCiAgJ2NoYXJzZXRfbmFtZSc6ICJNYWNDeXJpbGxpYyIsCiAgJ2xhbmd1YWdlJzogJ1J1c3NpYW4nLAp9CgpJYm04NjZNb2RlbCA9IHsKICAnY2hhcl90b19vcmRlcl9tYXAnOiBJQk04NjZfY2hhcl90b19vcmRlcl9tYXAsCiAgJ3ByZWNlZGVuY2VfbWF0cml4JzogUnVzc2lhbkxhbmdNb2RlbCwKICAndHlwaWNhbF9wb3NpdGl2ZV9yYXRpbyc6IDAuOTc2NjAxLAogICdrZWVwX2VuZ2xpc2hfbGV0dGVyJzogRmFsc2UsCiAgJ2NoYXJzZXRfbmFtZSc6ICJJQk04NjYiLAogICdsYW5ndWFnZSc6ICdSdXNzaWFuJywKfQoKSWJtODU1TW9kZWwgPSB7CiAgJ2NoYXJfdG9fb3JkZXJfbWFwJzogSUJNODU1X2NoYXJfdG9fb3JkZXJfbWFwLAogICdwcmVjZWRlbmNlX21hdHJpeCc6IFJ1c3NpYW5MYW5nTW9kZWwsCiAgJ3R5cGljYWxfcG9zaXRpdmVfcmF0aW8nOiAwLjk3NjYwMSwKICAna2VlcF9lbmdsaXNoX2xldHRlcic6IEZhbHNlLAogICdjaGFyc2V0X25hbWUnOiAiSUJNODU1IiwKICAnbGFuZ3VhZ2UnOiAnUnVzc2lhbicsCn0KUEsDBBQAAAAAAAAAIQD+u68pkDEAAJAxAABCAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2xhbmdncmVla21vZGVsLnB5IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEJFR0lOIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgVGhlIE9yaWdpbmFsIENvZGUgaXMgTW96aWxsYSBDb21tdW5pY2F0b3IgY2xpZW50IGNvZGUuCiMKIyBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKIyBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi4KIyBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAxOTk4CiMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgojCiMgQ29udHJpYnV0b3Iocyk6CiMgICBNYXJrIFBpbGdyaW0gLSBwb3J0IHRvIFB5dGhvbgojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKIyAwMjExMC0xMzAxICBVU0EKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFTkQgTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgojIDI1NTogQ29udHJvbCBjaGFyYWN0ZXJzIHRoYXQgdXN1YWxseSBkb2VzIG5vdCBleGlzdCBpbiBhbnkgdGV4dAojIDI1NDogQ2FycmlhZ2UvUmV0dXJuCiMgMjUzOiBzeW1ib2wgKHB1bmN0dWF0aW9uKSB0aGF0IGRvZXMgbm90IGJlbG9uZyB0byB3b3JkCiMgMjUyOiAwIC0gOQoKIyBDaGFyYWN0ZXIgTWFwcGluZyBUYWJsZToKTGF0aW43X2NoYXJfdG9fb3JkZXJfbWFwID0gKAoyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU0LDI1NSwyNTUsMjU0LDI1NSwyNTUsICAjIDAwCjI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwgICMgMTAKMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyAyMAoyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDMwCjI1MywgODIsMTAwLDEwNCwgOTQsIDk4LDEwMSwxMTYsMTAyLDExMSwxODcsMTE3LCA5MiwgODgsMTEzLCA4NSwgICMgNDAKIDc5LDExOCwxMDUsIDgzLCA2NywxMTQsMTE5LCA5NSwgOTksMTA5LDE4OCwyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyA1MAoyNTMsIDcyLCA3MCwgODAsIDgxLCA2MCwgOTYsIDkzLCA4OSwgNjgsMTIwLCA5NywgNzcsIDg2LCA2OSwgNTUsICAjIDYwCiA3OCwxMTUsIDY1LCA2NiwgNTgsIDc2LDEwNiwxMDMsIDg3LDEwNywxMTIsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgNzAKMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LCAgIyA4MAoyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsICAjIDkwCjI1MywyMzMsIDkwLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywgNzQsMjUzLDI1MywgICMgYTAKMjUzLDI1MywyNTMsMjUzLDI0NywyNDgsIDYxLCAzNiwgNDYsIDcxLCA3MywyNTMsIDU0LDI1MywxMDgsMTIzLCAgIyBiMAoxMTAsIDMxLCA1MSwgNDMsIDQxLCAzNCwgOTEsIDQwLCA1MiwgNDcsIDQ0LCA1MywgMzgsIDQ5LCA1OSwgMzksICAjIGMwCiAzNSwgNDgsMjUwLCAzNywgMzMsIDQ1LCA1NiwgNTAsIDg0LCA1NywxMjAsMTIxLCAxNywgMTgsIDIyLCAxNSwgICMgZDAKMTI0LCAgMSwgMjksIDIwLCAyMSwgIDMsIDMyLCAxMywgMjUsICA1LCAxMSwgMTYsIDEwLCAgNiwgMzAsICA0LCAgIyBlMAogIDksICA4LCAxNCwgIDcsICAyLCAxMiwgMjgsIDIzLCA0MiwgMjQsIDY0LCA3NSwgMTksIDI2LCAyNywyNTMsICAjIGYwCikKCndpbjEyNTNfY2hhcl90b19vcmRlcl9tYXAgPSAoCjI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTQsMjU1LDI1NSwyNTQsMjU1LDI1NSwgICMgMDAKMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LCAgIyAxMAoyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDIwCjI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgMzAKMjUzLCA4MiwxMDAsMTA0LCA5NCwgOTgsMTAxLDExNiwxMDIsMTExLDE4NywxMTcsIDkyLCA4OCwxMTMsIDg1LCAgIyA0MAogNzksMTE4LDEwNSwgODMsIDY3LDExNCwxMTksIDk1LCA5OSwxMDksMTg4LDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDUwCjI1MywgNzIsIDcwLCA4MCwgODEsIDYwLCA5NiwgOTMsIDg5LCA2OCwxMjAsIDk3LCA3NywgODYsIDY5LCA1NSwgICMgNjAKIDc4LDExNSwgNjUsIDY2LCA1OCwgNzYsMTA2LDEwMywgODcsMTA3LDExMiwyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyA3MAoyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsICAjIDgwCjI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwgICMgOTAKMjUzLDIzMywgNjEsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLCA3NCwyNTMsMjUzLCAgIyBhMAoyNTMsMjUzLDI1MywyNTMsMjQ3LDI1MywyNTMsIDM2LCA0NiwgNzEsIDczLDI1MywgNTQsMjUzLDEwOCwxMjMsICAjIGIwCjExMCwgMzEsIDUxLCA0MywgNDEsIDM0LCA5MSwgNDAsIDUyLCA0NywgNDQsIDUzLCAzOCwgNDksIDU5LCAzOSwgICMgYzAKIDM1LCA0OCwyNTAsIDM3LCAzMywgNDUsIDU2LCA1MCwgODQsIDU3LDEyMCwxMjEsIDE3LCAxOCwgMjIsIDE1LCAgIyBkMAoxMjQsICAxLCAyOSwgMjAsIDIxLCAgMywgMzIsIDEzLCAyNSwgIDUsIDExLCAxNiwgMTAsICA2LCAzMCwgIDQsICAjIGUwCiAgOSwgIDgsIDE0LCAgNywgIDIsIDEyLCAyOCwgMjMsIDQyLCAyNCwgNjQsIDc1LCAxOSwgMjYsIDI3LDI1MywgICMgZjAKKQoKIyBNb2RlbCBUYWJsZToKIyB0b3RhbCBzZXF1ZW5jZXM6IDEwMCUKIyBmaXJzdCA1MTIgc2VxdWVuY2VzOiA5OC4yODUxJQojIGZpcnN0IDEwMjQgc2VxdWVuY2VzOjEuNzAwMSUKIyByZXN0ICBzZXF1ZW5jZXM6ICAgICAwLjAzNTklCiMgbmVnYXRpdmUgc2VxdWVuY2VzOiAgMC4wMTQ4JQpHcmVla0xhbmdNb2RlbCA9ICgKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwzLDIsMiwzLDMsMywzLDMsMywzLDMsMSwzLDMsMywwLDIsMiwzLDMsMCwzLDAsMywyLDAsMywzLDMsMCwKMywwLDAsMCwyLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDMsMywzLDMsMywwLDMsMywwLDMsMiwzLDMsMCwzLDIsMywzLDMsMCwwLDMsMCwzLDAsMywzLDIsMCwwLDAsCjIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwKMCwyLDMsMiwyLDMsMywzLDMsMywzLDMsMywwLDMsMywzLDMsMCwyLDMsMywwLDMsMywzLDMsMiwzLDMsMywwLAoyLDAsMCwwLDIsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMiwzLDMsMiwzLDMsMywzLDMsMywzLDMsMywzLDMsMywwLDIsMSwzLDMsMywzLDIsMywzLDIsMywzLDIsMCwKMCwwLDAsMCwyLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDMsMywzLDMsMCwzLDMsMywzLDMsMywwLDMsMywwLDMsMywzLDMsMywzLDMsMywzLDMsMCwzLDIsMywzLDAsCjIsMCwxLDAsMiwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwKMCwzLDMsMywzLDMsMiwzLDAsMCwwLDAsMywzLDAsMywxLDMsMywzLDAsMywzLDAsMywzLDMsMywwLDAsMCwwLAoyLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMywzLDMsMywzLDAsMywwLDMsMywzLDMsMywwLDMsMiwyLDIsMywwLDIsMywzLDMsMywzLDIsMywzLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDMsMywzLDMsMywzLDIsMiwyLDMsMywzLDMsMCwzLDEsMywzLDMsMywyLDMsMywzLDMsMywzLDMsMiwyLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwzLDMsMywzLDMsMiwwLDMsMCwwLDAsMywzLDIsMywzLDMsMywzLDAsMCwzLDIsMywwLDIsMywwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMywwLDMsMywzLDMsMCwwLDMsMywwLDIsMywwLDMsMCwzLDMsMywwLDAsMywwLDMsMCwyLDIsMywzLDAsMCwKMCwwLDEsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDMsMywzLDMsMywyLDAsMywyLDMsMywzLDMsMCwzLDMsMywzLDMsMCwzLDMsMiwzLDIsMywzLDIsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwzLDMsMiwzLDIsMywzLDMsMywzLDMsMCwyLDMsMiwzLDIsMiwyLDMsMiwzLDMsMiwzLDAsMiwyLDIsMywwLAoyLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwzLDAsMCwwLDMsMywzLDIsMywzLDAsMCwzLDAsMywwLDAsMCwzLDIsMCwzLDAsMywwLDAsMiwwLDIsMCwKMCwwLDAsMCwyLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwzLDMsMywzLDAsMywzLDMsMywzLDMsMCwzLDMsMCwzLDAsMCwwLDMsMywwLDMsMywzLDAsMCwxLDIsMywwLAozLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMywzLDMsMywzLDIsMCwwLDMsMiwyLDMsMywwLDMsMywzLDMsMywyLDEsMywwLDMsMiwzLDMsMiwxLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMywzLDAsMiwzLDMsMywzLDMsMywwLDAsMywwLDMsMCwwLDAsMywzLDAsMywyLDMsMCwwLDMsMywzLDAsCjMsMCwwLDAsMiwwLDAsMCwwLDAsMywwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwzLDMsMywzLDAsMywzLDMsMywzLDMsMCwwLDMsMCwzLDAsMCwwLDMsMiwwLDMsMiwzLDAsMCwzLDIsMywwLAoyLDAsMCwwLDAsMCwwLDAsMCwwLDMsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwzLDEsMiwyLDMsMywzLDMsMywzLDAsMiwzLDAsMywwLDAsMCwzLDMsMCwzLDAsMiwwLDAsMiwzLDEsMCwKMiwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDMsMCwzLDMsMywzLDAsMywwLDMsMywyLDMsMCwzLDMsMywzLDMsMywwLDMsMywzLDAsMiwzLDAsMCwzLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwzLDAsMywzLDMsMCwwLDMsMCwwLDAsMywzLDAsMywwLDIsMywzLDAsMCwzLDAsMywwLDMsMywwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwzLDAsMCwwLDMsMywzLDMsMywzLDAsMCwzLDAsMiwwLDAsMCwzLDMsMCwzLDAsMywwLDAsMiwwLDIsMCwKMCwwLDAsMCwxLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDMsMywzLDMsMywzLDAsMywwLDIsMCwzLDIsMCwzLDIsMywyLDMsMCwwLDMsMiwzLDIsMywzLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDMsMCwwLDIsMywzLDMsMywzLDAsMCwwLDMsMCwyLDEsMCwwLDMsMiwyLDIsMCwzLDAsMCwyLDIsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMywwLDMsMywzLDIsMCwzLDAsMywwLDMsMywwLDIsMSwyLDMsMywwLDAsMywwLDMsMCwzLDMsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDIsMywzLDMsMCwzLDMsMywzLDMsMywwLDIsMywwLDMsMCwwLDAsMiwxLDAsMiwyLDMsMCwwLDIsMiwyLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDMsMCwwLDIsMywzLDMsMiwzLDAsMCwxLDMsMCwyLDAsMCwwLDAsMywwLDEsMCwyLDAsMCwxLDEsMSwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMywzLDMsMywzLDEsMCwzLDAsMCwwLDMsMiwwLDMsMiwzLDMsMywwLDAsMywwLDMsMiwyLDIsMSwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDMsMCwzLDMsMywwLDAsMywwLDAsMCwwLDIsMCwyLDMsMywyLDIsMiwyLDMsMCwyLDAsMiwyLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwzLDMsMywzLDIsMCwwLDAsMCwwLDAsMiwzLDAsMiwwLDIsMywyLDAsMCwzLDAsMywwLDMsMSwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDMsMiwzLDMsMiwyLDMsMCwyLDAsMywwLDAsMCwyLDAsMCwwLDAsMSwyLDAsMiwwLDIsMCwKMCwyLDAsMiwwLDIsMiwwLDAsMSwwLDIsMiwyLDAsMiwyLDIsMCwyLDIsMiwwLDAsMiwwLDAsMSwwLDAsMCwwLAowLDIsMCwzLDMsMiwwLDAsMCwwLDAsMCwxLDMsMCwyLDAsMiwyLDIsMCwwLDIsMCwzLDAsMCwyLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwzLDAsMiwzLDIsMCwyLDIsMCwyLDAsMiwyLDAsMiwwLDIsMiwyLDAsMCwwLDAsMCwwLDIsMywwLDAsMCwyLAowLDEsMiwwLDAsMCwwLDIsMiwwLDAsMCwyLDEsMCwyLDIsMCwwLDAsMCwwLDAsMSwwLDIsMCwwLDAsMCwwLDAsCjAsMCwyLDEsMCwyLDMsMiwyLDMsMiwzLDIsMCwwLDMsMywzLDAsMCwzLDIsMCwwLDAsMSwxLDAsMiwwLDIsMiwKMCwyLDAsMiwwLDIsMiwwLDAsMiwwLDIsMiwyLDAsMiwyLDIsMiwwLDAsMiwwLDAsMCwyLDAsMSwwLDAsMCwwLAowLDMsMCwzLDMsMiwyLDAsMywwLDAsMCwyLDIsMCwyLDIsMiwxLDIsMCwwLDEsMiwyLDAsMCwzLDAsMCwwLDIsCjAsMSwyLDAsMCwwLDEsMiwwLDAsMCwwLDAsMCwwLDIsMiwwLDEsMCwwLDIsMCwwLDAsMiwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMiwzLDMsMiwyLDAsMCwwLDIsMCwyLDMsMywwLDIsMCwwLDAsMCwwLDAsMiwyLDIsMCwyLDIsMCwyLDAsMiwKMCwyLDIsMCwwLDIsMiwyLDIsMSwwLDAsMiwyLDAsMiwwLDAsMiwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLAowLDIsMCwzLDIsMywwLDAsMCwzLDAsMCwyLDIsMCwyLDAsMiwyLDIsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDIsCjAsMCwyLDIsMCwwLDIsMiwyLDAsMCwwLDAsMCwwLDIsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDIsMCwwLDMsMiwwLDIsMiwyLDIsMiwwLDAsMCwyLDAsMCwwLDAsMiwwLDEsMCwwLDIsMCwxLDAsMCwwLAowLDIsMiwyLDAsMiwyLDAsMSwyLDAsMiwyLDIsMCwyLDIsMiwyLDEsMiwyLDAsMCwyLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwKMCwyLDAsMiwwLDIsMiwwLDAsMCwwLDEsMiwxLDAsMCwyLDIsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwzLDIsMywwLDAsMiwwLDAsMCwyLDIsMCwyLDAsMCwwLDEsMCwwLDIsMCwyLDAsMiwyLDAsMCwwLDAsCjAsMCwyLDAsMCwwLDAsMiwyLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwKMCwyLDIsMywyLDIsMCwwLDAsMCwwLDAsMSwzLDAsMiwwLDIsMiwwLDAsMCwxLDAsMiwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMiwwLDIsMCwzLDIsMCwyLDAsMCwwLDAsMCwwLDIsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwKMCwwLDIsMCwwLDAsMCwxLDEsMCwwLDIsMSwyLDAsMiwyLDAsMSwwLDAsMSwwLDAsMCwyLDAsMCwwLDAsMCwwLAowLDMsMCwyLDIsMiwwLDAsMiwwLDAsMCwyLDAsMCwwLDIsMywwLDIsMCwwLDAsMCwwLDAsMiwyLDAsMCwwLDIsCjAsMSwyLDAsMCwwLDEsMiwyLDEsMCwwLDAsMiwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMywwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDIsMSwyLDAsMiwyLDAsMiwwLDAsMiwwLDAsMCwwLDEsMiwxLDAsMiwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwyLDAsMCwwLDMsMSwyLDIsMCwyLDAsMCwwLDAsMiwwLDAsMCwyLDAsMCwzLDAsMCwwLDAsMiwyLDIsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDIsMSwwLDIsMCwxLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwxLDAsMCwwLDAsMCwwLDIsCjAsMiwyLDAsMCwyLDIsMiwyLDIsMCwxLDIsMCwwLDAsMiwyLDAsMSwwLDIsMCwwLDIsMiwwLDAsMCwwLDAsMCwKMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMywwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMiwwLDIsMCwwLDAsMCwyLAowLDEsMiwwLDAsMCwwLDIsMiwxLDAsMSwwLDEsMCwyLDIsMiwxLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsCjAsMiwwLDEsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDIsMiwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMiwKMCwyLDIsMCwwLDAsMCwyLDIsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwyLDAsMCwwLAowLDIsMiwyLDIsMCwwLDAsMywwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDEsCjAsMCwyLDAsMCwwLDAsMSwyLDAsMCwwLDAsMCwwLDIsMiwxLDEsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwKMCwyLDAsMiwyLDIsMCwwLDIsMCwwLDAsMCwwLDAsMCwyLDIsMiwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwyLAowLDAsMSwwLDAsMCwwLDIsMSwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMywwLDIsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMiwKMCwwLDIsMCwwLDAsMCwyLDIsMCwwLDAsMCwxLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDIsMCwyLDIsMSwwLDAsMCwwLDAsMCwyLDAsMCwyLDAsMiwyLDIsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDIsCjAsMCwyLDAsMCwyLDAsMiwyLDAsMCwwLDAsMiwwLDIsMCwwLDAsMCwwLDIsMCwwLDAsMiwwLDAsMCwwLDAsMCwKMCwwLDMsMCwwLDAsMiwyLDAsMiwyLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDIsMCwwLDAsMCwwLAowLDIsMiwyLDIsMiwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwxLDAsMCwwLDEsCjAsMCwwLDAsMCwwLDAsMiwxLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwyLDIsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLAowLDIsMCwwLDAsMiwwLDAsMCwwLDAsMSwwLDAsMCwwLDIsMiwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDEsMCwyLDAsMCwwLAowLDIsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwxLDAsMCwwLDAsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMSwwLDAsMiwwLDIsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwyLDEsMCwwLDAsMCwwLDAsMiwwLDAsMCwxLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCikKCkxhdGluN0dyZWVrTW9kZWwgPSB7CiAgJ2NoYXJfdG9fb3JkZXJfbWFwJzogTGF0aW43X2NoYXJfdG9fb3JkZXJfbWFwLAogICdwcmVjZWRlbmNlX21hdHJpeCc6IEdyZWVrTGFuZ01vZGVsLAogICd0eXBpY2FsX3Bvc2l0aXZlX3JhdGlvJzogMC45ODI4NTEsCiAgJ2tlZXBfZW5nbGlzaF9sZXR0ZXInOiBGYWxzZSwKICAnY2hhcnNldF9uYW1lJzogIklTTy04ODU5LTciLAogICdsYW5ndWFnZSc6ICdHcmVlaycsCn0KCldpbjEyNTNHcmVla01vZGVsID0gewogICdjaGFyX3RvX29yZGVyX21hcCc6IHdpbjEyNTNfY2hhcl90b19vcmRlcl9tYXAsCiAgJ3ByZWNlZGVuY2VfbWF0cml4JzogR3JlZWtMYW5nTW9kZWwsCiAgJ3R5cGljYWxfcG9zaXRpdmVfcmF0aW8nOiAwLjk4Mjg1MSwKICAna2VlcF9lbmdsaXNoX2xldHRlcic6IEZhbHNlLAogICdjaGFyc2V0X25hbWUnOiAid2luZG93cy0xMjUzIiwKICAnbGFuZ3VhZ2UnOiAnR3JlZWsnLAp9ClBLAwQUAAAAAAAAACEAj2atGFEsAABRLAAAQwAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9sYW5naGVicmV3bW9kZWwucHkjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQkVHSU4gTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBUaGUgT3JpZ2luYWwgQ29kZSBpcyBNb3ppbGxhIFVuaXZlcnNhbCBjaGFyc2V0IGRldGVjdG9yIGNvZGUuCiMKIyBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKIyAgICAgICAgICBTaW1vbiBNb250YWd1CiMgUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAwNQojIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIwojIENvbnRyaWJ1dG9yKHMpOgojICAgTWFyayBQaWxncmltIC0gcG9ydCB0byBQeXRob24KIyAgIFNoeSBTaGFsb20gLSBvcmlnaW5hbCBDIGNvZGUKIyAgIFNob3NoYW5uYWggRm9yYmVzIC0gb3JpZ2luYWwgQyBjb2RlICg/KQojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKIyAwMjExMC0xMzAxICBVU0EKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFTkQgTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgojIDI1NTogQ29udHJvbCBjaGFyYWN0ZXJzIHRoYXQgdXN1YWxseSBkb2VzIG5vdCBleGlzdCBpbiBhbnkgdGV4dAojIDI1NDogQ2FycmlhZ2UvUmV0dXJuCiMgMjUzOiBzeW1ib2wgKHB1bmN0dWF0aW9uKSB0aGF0IGRvZXMgbm90IGJlbG9uZyB0byB3b3JkCiMgMjUyOiAwIC0gOQoKIyBXaW5kb3dzLTEyNTUgbGFuZ3VhZ2UgbW9kZWwKIyBDaGFyYWN0ZXIgTWFwcGluZyBUYWJsZToKV0lOMTI1NV9DSEFSX1RPX09SREVSX01BUCA9ICgKMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NCwyNTUsMjU1LDI1NCwyNTUsMjU1LCAgIyAwMAoyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsICAjIDEwCjI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgMjAKMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyAzMAoyNTMsIDY5LCA5MSwgNzksIDgwLCA5MiwgODksIDk3LCA5MCwgNjgsMTExLDExMiwgODIsIDczLCA5NSwgODUsICAjIDQwCiA3OCwxMjEsIDg2LCA3MSwgNjcsMTAyLDEwNywgODQsMTE0LDEwMywxMTUsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgNTAKMjUzLCA1MCwgNzQsIDYwLCA2MSwgNDIsIDc2LCA3MCwgNjQsIDUzLDEwNSwgOTMsIDU2LCA2NSwgNTQsIDQ5LCAgIyA2MAogNjYsMTEwLCA1MSwgNDMsIDQ0LCA2MywgODEsIDc3LCA5OCwgNzUsMTA4LDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDcwCjEyNCwyMDIsMjAzLDIwNCwyMDUsIDQwLCA1OCwyMDYsMjA3LDIwOCwyMDksMjEwLDIxMSwyMTIsMjEzLDIxNCwKMjE1LCA4MywgNTIsIDQ3LCA0NiwgNzIsIDMyLCA5NCwyMTYsMTEzLDIxNywxMDksMjE4LDIxOSwyMjAsMjIxLAogMzQsMTE2LDIyMiwxMTgsMTAwLDIyMywyMjQsMTE3LDExOSwxMDQsMTI1LDIyNSwyMjYsIDg3LCA5OSwyMjcsCjEwNiwxMjIsMTIzLDIyOCwgNTUsMjI5LDIzMCwxMDEsMjMxLDIzMiwxMjAsMjMzLCA0OCwgMzksIDU3LDIzNCwKIDMwLCA1OSwgNDEsIDg4LCAzMywgMzcsIDM2LCAzMSwgMjksIDM1LDIzNSwgNjIsIDI4LDIzNiwxMjYsMjM3LAoyMzgsIDM4LCA0NSwyMzksMjQwLDI0MSwyNDIsMjQzLDEyNywyNDQsMjQ1LDI0NiwyNDcsMjQ4LDI0OSwyNTAsCiAgOSwgIDgsIDIwLCAxNiwgIDMsICAyLCAyNCwgMTQsIDIyLCAgMSwgMjUsIDE1LCAgNCwgMTEsICA2LCAyMywKIDEyLCAxOSwgMTMsIDI2LCAxOCwgMjcsIDIxLCAxNywgIDcsIDEwLCAgNSwyNTEsMjUyLDEyOCwgOTYsMjUzLAopCgojIE1vZGVsIFRhYmxlOgojIHRvdGFsIHNlcXVlbmNlczogMTAwJQojIGZpcnN0IDUxMiBzZXF1ZW5jZXM6IDk4LjQwMDQlCiMgZmlyc3QgMTAyNCBzZXF1ZW5jZXM6IDEuNTk4MSUKIyByZXN0ICBzZXF1ZW5jZXM6ICAgICAgMC4wODclCiMgbmVnYXRpdmUgc2VxdWVuY2VzOiAgIDAuMDAxNSUKSEVCUkVXX0xBTkdfTU9ERUwgPSAoCjAsMywzLDMsMywzLDMsMywzLDMsMywyLDMsMywzLDMsMywzLDMsMywzLDMsMywyLDMsMiwxLDIsMCwxLDAsMCwKMywwLDMsMSwwLDAsMSwzLDIsMCwxLDEsMiwwLDIsMiwyLDEsMSwxLDEsMiwxLDEsMSwyLDAsMCwyLDIsMCwxLAozLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDIsMiwyLDIsCjEsMiwxLDIsMSwyLDAsMCwyLDAsMCwwLDAsMCwxLDAsMSwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDEsMCwKMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDIsMiwyLAoxLDIsMSwzLDEsMSwwLDAsMiwwLDAsMCwxLDAsMSwwLDEsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsCjMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMSwwLDEsMiwyLDEsMywKMSwyLDEsMSwyLDIsMCwwLDIsMiwwLDAsMCwwLDEsMCwxLDAsMCwwLDEsMCwwLDAsMCwwLDAsMSwwLDEsMSwwLAozLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMiwzLDMsMiwyLDIsMiwzLDIsCjEsMiwxLDIsMiwyLDAsMCwxLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDEsMCwKMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywyLDMsMywyLDMsMiwyLDMsMiwyLDIsMSwyLDIsMiwyLAoxLDIsMSwxLDIsMiwwLDEsMiwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsCjMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMiwwLDIsMiwyLDIsMiwKMCwyLDAsMiwyLDIsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMSwwLAozLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMiwzLDAsMiwyLDIsCjAsMiwxLDIsMiwyLDAsMCwyLDEsMCwwLDAsMCwxLDAsMSwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDEsMCwKMywzLDMsMywzLDMsMywzLDMsMywzLDIsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywyLDEsMiwzLDIsMiwyLAoxLDIsMSwyLDIsMiwwLDAsMSwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMSwxLDAsCjMsMywzLDMsMywzLDMsMywzLDIsMywzLDMsMiwzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDEsMCwyLDAsMiwKMCwyLDEsMiwyLDIsMCwwLDEsMiwwLDAsMCwwLDEsMCwxLDAsMCwwLDAsMCwwLDEsMCwwLDAsMiwwLDAsMSwwLAozLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDIsMywyLDMsMiwyLDMsMiwxLDIsMSwxLDEsCjAsMSwxLDEsMSwxLDMsMCwxLDAsMCwwLDAsMiwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwKMywxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwwLDEsMSwwLDEsMSwwLDAsMSwwLDAsMSwwLDAsMCwwLAowLDAsMSwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMiwyLDIsMiwyLDIsMiwKMCwyLDAsMSwyLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLAozLDMsMywzLDMsMywzLDMsMywyLDMsMywzLDIsMSwyLDMsMywyLDMsMywzLDMsMiwzLDIsMSwyLDAsMiwxLDIsCjAsMiwwLDIsMiwyLDAsMCwxLDIsMCwwLDAsMCwxLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDEsMCwKMywzLDMsMywzLDMsMywzLDMsMiwzLDMsMywxLDIsMiwzLDMsMiwzLDIsMywyLDIsMywxLDIsMiwwLDIsMiwyLAowLDIsMSwyLDIsMiwwLDAsMSwyLDAsMCwwLDAsMSwwLDAsMCwwLDAsMSwwLDAsMSwwLDAsMCwxLDAsMCwxLDAsCjMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMiwzLDMsMywyLDMsMywyLDIsMiwzLDMsMywzLDEsMywyLDIsMiwKMCwyLDAsMSwyLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLAozLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMiwyLDMsMywzLDIsMywyLDIsMiwxLDIsMiwwLDIsMiwyLDIsCjAsMiwwLDIsMiwyLDAsMCwxLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwKMywzLDMsMywzLDMsMywzLDMsMywzLDIsMywzLDMsMSwzLDIsMywzLDIsMywzLDIsMiwxLDIsMiwyLDIsMiwyLAowLDIsMSwyLDEsMiwwLDAsMSwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMSwwLDAsMSwwLDAsMCwwLDAsMCwxLDAsCjMsMywzLDMsMywzLDIsMywyLDMsMywyLDMsMywzLDMsMiwzLDIsMywzLDMsMywzLDIsMiwyLDIsMiwyLDIsMSwKMCwyLDAsMSwyLDEsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMSwwLAozLDMsMywzLDMsMywzLDMsMywyLDEsMiwzLDMsMywzLDMsMywzLDIsMywyLDMsMiwxLDIsMywwLDIsMSwyLDIsCjAsMiwxLDEsMiwxLDAsMCwxLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDIsMCwKMywzLDMsMywzLDMsMywzLDMsMiwzLDMsMywzLDIsMSwzLDEsMiwyLDIsMSwyLDMsMywxLDIsMSwyLDIsMiwyLAowLDEsMSwxLDEsMSwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMSwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsCjMsMywzLDMsMywzLDMsMywzLDMsMCwyLDMsMywzLDEsMywzLDMsMSwyLDIsMiwyLDEsMSwyLDIsMiwyLDIsMiwKMCwyLDAsMSwxLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMSwwLAozLDMsMywzLDMsMywyLDMsMywzLDIsMiwzLDMsMywyLDEsMiwzLDIsMywyLDIsMiwyLDEsMiwxLDEsMSwyLDIsCjAsMiwxLDEsMSwxLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwKMywxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMCwxLDAsMCwwLDEsMCwwLDAsMCwwLAoxLDAsMSwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMSwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywzLDMsMywyLDMsMywyLDMsMSwyLDIsMiwyLDMsMiwzLDEsMSwyLDIsMSwyLDIsMSwxLDAsMiwyLDIsMiwKMCwxLDAsMSwyLDIsMCwwLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMSwwLAozLDAsMCwxLDEsMCwxLDAsMCwxLDEsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMiwyLDAsCjAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywwLDEsMCwxLDAsMSwxLDAsMSwxLDAsMCwwLDEsMSwwLDEsMSwxLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMCwwLDAsMSwxLDAsMSwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLAozLDIsMiwxLDIsMiwyLDIsMiwyLDIsMSwyLDIsMSwyLDIsMSwxLDEsMSwxLDEsMSwxLDIsMSwxLDAsMywzLDMsCjAsMywwLDIsMiwyLDIsMCwwLDEsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwKMiwyLDIsMywyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwxLDIsMiwxLDIsMiwyLDEsMSwxLDIsMCwxLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjIsMiwyLDIsMiwyLDIsMiwyLDIsMiwxLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwwLDIsMiwwLDAsMCwwLDAsMCwKMCwwLDAsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoyLDMsMSwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDEsMiwxLDAsMiwxLDAsCjAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywxLDEsMSwxLDEsMSwxLDEsMSwxLDAsMCwxLDEsMSwxLDAsMSwxLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMywxLDEsMiwyLDIsMiwyLDEsMiwyLDIsMSwxLDIsMiwyLDIsMiwyLDIsMSwyLDIsMSwwLDEsMSwxLDEsMCwKMCwxLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDIsMSwxLDEsMSwyLDEsMSwyLDEsMCwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMCwxLDAsMCwwLDAsMCwwLDAsCjAsMCwyLDAsMCwwLDAsMCwwLDAsMCwxLDEsMCwwLDAsMCwxLDEsMCwwLDEsMSwwLDAsMCwwLDAsMCwxLDAsMCwKMiwxLDEsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDEsMiwyLDIsMiwyLDEsMiwxLDIsMSwxLDEsMSwwLDAsMCwwLAowLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjEsMiwxLDIsMiwyLDIsMiwyLDIsMiwyLDIsMSwyLDEsMiwxLDEsMiwxLDEsMSwyLDEsMiwxLDIsMCwxLDAsMSwKMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDMsMSwyLDIsMiwxLDIsMiwyLDIsMiwyLDIsMiwxLDIsMSwxLDEsMSwxLDEsMiwxLDIsMSwxLDAsMSwwLDEsCjAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMiwxLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMiwyLAowLDIsMCwxLDIsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsCjMsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwxLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoyLDEsMSwxLDEsMSwxLDEsMCwxLDEsMCwxLDAsMCwxLDAsMCwxLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwyLDAsMSwxLDEsMCwxLDAsMCwwLDEsMSwwLDEsMSwwLDAsMCwwLDAsMSwxLDAsMCwKMCwxLDEsMSwyLDEsMiwyLDIsMCwyLDAsMiwwLDEsMSwyLDEsMSwxLDEsMiwxLDAsMSwxLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMSwwLDEsMCwwLDAsMCwwLDEsMCwxLDIsMiwwLDEsMCwwLDEsMSwyLDIsMSwyLDAsMiwwLDAsMCwxLDIsMCwxLAoyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwyLDAsMiwxLDIsMCwyLDAsMCwxLDEsMSwxLDEsMSwwLDEsMCwwLDAsMSwwLDAsMSwKMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMSwwLDAsMCwwLDAsMSwwLDIsMSwxLDAsMSwwLDAsMSwxLDEsMiwyLDAsMCwxLDAsMCwwLDEsMCwwLDEsCjEsMSwyLDEsMCwxLDEsMSwwLDEsMCwxLDEsMSwxLDAsMCwwLDEsMCwxLDAsMCwwLDAsMCwwLDAsMCwyLDIsMSwKMCwyLDAsMSwyLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoyLDEsMCwwLDEsMCwxLDEsMSwxLDAsMCwwLDAsMCwxLDAsMCwwLDAsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMSwxLDEsMSwxLDEsMSwxLDEsMiwxLDAsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDAsMSwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDEsMSwxLDAsMCwwLDAsMSwxLDEsMCwxLDEsMCwxLDAsMCwwLDEsMSwwLDEsCjIsMCwxLDAsMSwwLDEsMCwwLDEsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwxLDAsMSwxLDEsMCwxLDAsMCwxLDEsMiwxLDEsMiwwLDEsMCwwLDAsMSwxLDAsMSwKMSwwLDAsMSwwLDAsMSwwLDAsMCwxLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMSwwLDEsMSwyLDAsMSwwLDAsMCwwLDIsMSwxLDIsMCwyLDAsMCwwLDEsMSwwLDEsCjEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDEsMCwyLDEsMSwwLDEsMCwwLDIsMiwxLDIsMSwxLDAsMSwwLDAsMCwxLDEsMCwxLAoyLDAsMSwwLDAsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMSwyLDIsMCwwLDAsMCwwLDEsMSwwLDEsMCwwLDEsMCwwLDAsMCwxLDAsMSwKMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDEsMiwyLDAsMCwwLDAsMiwxLDEsMSwwLDIsMSwxLDAsMCwwLDIsMSwwLDEsCjEsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDEsMCwxLDEsMiwwLDEsMCwwLDEsMSwwLDIsMSwxLDAsMSwwLDAsMCwxLDEsMCwxLAoyLDIsMSwxLDEsMCwxLDEsMCwxLDEsMCwxLDAsMCwwLDAsMCwwLDEsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMSwwLDIsMSwxLDAsMSwwLDAsMSwxLDAsMSwyLDEsMCwyLDAsMCwwLDEsMSwwLDEsCjIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwKMCwxLDAsMCwyLDAsMiwxLDEsMCwxLDAsMSwwLDAsMSwwLDAsMCwwLDEsMCwwLDAsMSwwLDAsMCwwLDAsMSwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjEsMCwwLDEsMCwwLDEsMCwwLDEsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDEsMCwxLDEsMiwwLDEsMCwwLDEsMSwxLDAsMSwwLDAsMSwwLDAsMCwxLDAsMCwxLAoxLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjEsMCwwLDAsMCwwLDAsMCwxLDAsMSwxLDAsMCwxLDAsMCwyLDEsMSwxLDEsMSwwLDEsMCwwLDAsMCwxLDAsMSwKMCwxLDEsMSwyLDEsMSwxLDEsMCwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwwLDEsMSwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDIsMSwwLDAsMCwwLDAsMSwxLDEsMSwxLDAsMSwwLDAsMCwxLDEsMCwwLAopCgpXaW4xMjU1SGVicmV3TW9kZWwgPSB7CiAgJ2NoYXJfdG9fb3JkZXJfbWFwJzogV0lOMTI1NV9DSEFSX1RPX09SREVSX01BUCwKICAncHJlY2VkZW5jZV9tYXRyaXgnOiBIRUJSRVdfTEFOR19NT0RFTCwKICAndHlwaWNhbF9wb3NpdGl2ZV9yYXRpbyc6IDAuOTg0MDA0LAogICdrZWVwX2VuZ2xpc2hfbGV0dGVyJzogRmFsc2UsCiAgJ2NoYXJzZXRfbmFtZSc6ICJ3aW5kb3dzLTEyNTUiLAogICdsYW5ndWFnZSc6ICdIZWJyZXcnLAp9ClBLAwQUAAAAAAAAACEAw8FVgDAxAAAwMQAARgAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9sYW5naHVuZ2FyaWFubW9kZWwucHkjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQkVHSU4gTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBUaGUgT3JpZ2luYWwgQ29kZSBpcyBNb3ppbGxhIENvbW11bmljYXRvciBjbGllbnQgY29kZS4KIwojIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwojIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uLgojIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDE5OTgKIyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiMKIyBDb250cmlidXRvcihzKToKIyAgIE1hcmsgUGlsZ3JpbSAtIHBvcnQgdG8gUHl0aG9uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgojIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQojIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQojIDAyMTEwLTEzMDEgIFVTQQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVORCBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiMgMjU1OiBDb250cm9sIGNoYXJhY3RlcnMgdGhhdCB1c3VhbGx5IGRvZXMgbm90IGV4aXN0IGluIGFueSB0ZXh0CiMgMjU0OiBDYXJyaWFnZS9SZXR1cm4KIyAyNTM6IHN5bWJvbCAocHVuY3R1YXRpb24pIHRoYXQgZG9lcyBub3QgYmVsb25nIHRvIHdvcmQKIyAyNTI6IDAgLSA5CgojIENoYXJhY3RlciBNYXBwaW5nIFRhYmxlOgpMYXRpbjJfSHVuZ2FyaWFuQ2hhclRvT3JkZXJNYXAgPSAoCjI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTQsMjU1LDI1NSwyNTQsMjU1LDI1NSwgICMgMDAKMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LCAgIyAxMAoyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDIwCjI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgMzAKMjUzLCAyOCwgNDAsIDU0LCA0NSwgMzIsIDUwLCA0OSwgMzgsIDM5LCA1MywgMzYsIDQxLCAzNCwgMzUsIDQ3LAogNDYsIDcxLCA0MywgMzMsIDM3LCA1NywgNDgsIDY0LCA2OCwgNTUsIDUyLDI1MywyNTMsMjUzLDI1MywyNTMsCjI1MywgIDIsIDE4LCAyNiwgMTcsICAxLCAyNywgMTIsIDIwLCAgOSwgMjIsICA3LCAgNiwgMTMsICA0LCAgOCwKIDIzLCA2NywgMTAsICA1LCAgMywgMjEsIDE5LCA2NSwgNjIsIDE2LCAxMSwyNTMsMjUzLDI1MywyNTMsMjUzLAoxNTksMTYwLDE2MSwxNjIsMTYzLDE2NCwxNjUsMTY2LDE2NywxNjgsMTY5LDE3MCwxNzEsMTcyLDE3MywxNzQsCjE3NSwxNzYsMTc3LDE3OCwxNzksMTgwLDE4MSwxODIsMTgzLDE4NCwxODUsMTg2LDE4NywxODgsMTg5LDE5MCwKMTkxLDE5MiwxOTMsMTk0LDE5NSwxOTYsMTk3LCA3NSwxOTgsMTk5LDIwMCwyMDEsMjAyLDIwMywyMDQsMjA1LAogNzksMjA2LDIwNywyMDgsMjA5LDIxMCwyMTEsMjEyLDIxMywyMTQsMjE1LDIxNiwyMTcsMjE4LDIxOSwyMjAsCjIyMSwgNTEsIDgxLDIyMiwgNzgsMjIzLDIyNCwyMjUsMjI2LCA0NCwyMjcsMjI4LDIyOSwgNjEsMjMwLDIzMSwKMjMyLDIzMywyMzQsIDU4LDIzNSwgNjYsIDU5LDIzNiwyMzcsMjM4LCA2MCwgNjksIDYzLDIzOSwyNDAsMjQxLAogODIsIDE0LCA3NCwyNDIsIDcwLCA4MCwyNDMsIDcyLDI0NCwgMTUsIDgzLCA3NywgODQsIDMwLCA3NiwgODUsCjI0NSwyNDYsMjQ3LCAyNSwgNzMsIDQyLCAyNCwyNDgsMjQ5LDI1MCwgMzEsIDU2LCAyOSwyNTEsMjUyLDI1MywKKQoKd2luMTI1MEh1bmdhcmlhbkNoYXJUb09yZGVyTWFwID0gKAoyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU0LDI1NSwyNTUsMjU0LDI1NSwyNTUsICAjIDAwCjI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwgICMgMTAKMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyAyMAoyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDMwCjI1MywgMjgsIDQwLCA1NCwgNDUsIDMyLCA1MCwgNDksIDM4LCAzOSwgNTMsIDM2LCA0MSwgMzQsIDM1LCA0NywKIDQ2LCA3MiwgNDMsIDMzLCAzNywgNTcsIDQ4LCA2NCwgNjgsIDU1LCA1MiwyNTMsMjUzLDI1MywyNTMsMjUzLAoyNTMsICAyLCAxOCwgMjYsIDE3LCAgMSwgMjcsIDEyLCAyMCwgIDksIDIyLCAgNywgIDYsIDEzLCAgNCwgIDgsCiAyMywgNjcsIDEwLCAgNSwgIDMsIDIxLCAxOSwgNjUsIDYyLCAxNiwgMTEsMjUzLDI1MywyNTMsMjUzLDI1MywKMTYxLDE2MiwxNjMsMTY0LDE2NSwxNjYsMTY3LDE2OCwxNjksMTcwLDE3MSwxNzIsMTczLDE3NCwxNzUsMTc2LAoxNzcsMTc4LDE3OSwxODAsIDc4LDE4MSwgNjksMTgyLDE4MywxODQsMTg1LDE4NiwxODcsMTg4LDE4OSwxOTAsCjE5MSwxOTIsMTkzLDE5NCwxOTUsMTk2LDE5NywgNzYsMTk4LDE5OSwyMDAsMjAxLDIwMiwyMDMsMjA0LDIwNSwKIDgxLDIwNiwyMDcsMjA4LDIwOSwyMTAsMjExLDIxMiwyMTMsMjE0LDIxNSwyMTYsMjE3LDIxOCwyMTksMjIwLAoyMjEsIDUxLCA4MywyMjIsIDgwLDIyMywyMjQsMjI1LDIyNiwgNDQsMjI3LDIyOCwyMjksIDYxLDIzMCwyMzEsCjIzMiwyMzMsMjM0LCA1OCwyMzUsIDY2LCA1OSwyMzYsMjM3LDIzOCwgNjAsIDcwLCA2MywyMzksMjQwLDI0MSwKIDg0LCAxNCwgNzUsMjQyLCA3MSwgODIsMjQzLCA3MywyNDQsIDE1LCA4NSwgNzksIDg2LCAzMCwgNzcsIDg3LAoyNDUsMjQ2LDI0NywgMjUsIDc0LCA0MiwgMjQsMjQ4LDI0OSwyNTAsIDMxLCA1NiwgMjksMjUxLDI1MiwyNTMsCikKCiMgTW9kZWwgVGFibGU6CiMgdG90YWwgc2VxdWVuY2VzOiAxMDAlCiMgZmlyc3QgNTEyIHNlcXVlbmNlczogOTQuNzM2OCUKIyBmaXJzdCAxMDI0IHNlcXVlbmNlczo1LjI2MjMlCiMgcmVzdCAgc2VxdWVuY2VzOiAgICAgMC44ODk0JQojIG5lZ2F0aXZlIHNlcXVlbmNlczogIDAuMDAwOSUKSHVuZ2FyaWFuTGFuZ01vZGVsID0gKAowLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDEsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsCjMsMywzLDMsMywzLDMsMywzLDMsMiwzLDMsMywzLDMsMywzLDMsMiwyLDMsMywxLDEsMiwyLDIsMiwyLDEsMiwKMywyLDIsMywzLDMsMywzLDIsMywzLDMsMywzLDMsMSwyLDMsMywzLDMsMiwzLDMsMSwxLDMsMywwLDEsMSwxLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsCjMsMiwxLDMsMywzLDMsMywyLDMsMywzLDMsMywxLDEsMiwzLDMsMywzLDMsMywzLDEsMSwzLDIsMCwxLDEsMSwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLAozLDMsMywzLDMsMywzLDMsMywzLDMsMSwxLDIsMywzLDMsMSwzLDMsMywzLDMsMSwzLDMsMiwyLDAsMywyLDMsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMywwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwKMywzLDMsMywzLDMsMiwzLDMsMywyLDMsMywyLDMsMywzLDMsMywyLDMsMywyLDIsMywyLDMsMiwwLDMsMiwyLAowLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwxLDAsCjMsMywzLDMsMywzLDIsMywzLDMsMywzLDIsMywzLDMsMSwyLDMsMiwyLDMsMSwyLDMsMywyLDIsMCwzLDMsMywKMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLAozLDMsMywzLDMsMywzLDMsMywzLDIsMiwzLDMsMywzLDMsMywyLDMsMywzLDMsMiwzLDMsMywzLDAsMiwzLDIsCjAsMCwwLDEsMSwwLDAsMCwwLDAsMywwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwKMywzLDMsMywzLDMsMywzLDMsMywzLDEsMSwxLDMsMywyLDEsMywyLDIsMywyLDEsMywyLDIsMSwwLDMsMywxLAowLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsCjMsMiwyLDMsMywzLDMsMywxLDIsMywzLDMsMywxLDIsMSwzLDMsMywzLDIsMiwzLDEsMSwzLDIsMCwxLDEsMSwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLAozLDMsMywzLDMsMywzLDMsMiwyLDMsMywzLDMsMywyLDEsMywzLDMsMywzLDIsMiwxLDMsMywzLDAsMSwxLDIsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDEsMCwKMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywyLDMsMywzLDIsMywzLDIsMywzLDMsMiwwLDMsMiwzLAowLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwxLDAsCjMsMywzLDMsMywzLDIsMywzLDMsMiwzLDIsMywzLDMsMSwzLDIsMiwyLDMsMSwxLDMsMywxLDEsMCwzLDMsMiwKMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLAozLDMsMywzLDMsMywzLDIsMywzLDMsMiwzLDIsMywzLDMsMiwzLDMsMywzLDMsMSwyLDMsMiwyLDAsMiwyLDIsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwKMywzLDMsMiwyLDIsMywxLDMsMywyLDIsMSwzLDMsMywxLDEsMywxLDIsMywyLDMsMiwyLDIsMSwwLDIsMiwyLAowLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsCjMsMSwxLDMsMywzLDMsMywxLDIsMywzLDMsMywxLDIsMSwzLDMsMywyLDIsMywyLDEsMCwzLDIsMCwxLDEsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDEsMSwzLDMsMywzLDMsMSwyLDMsMywzLDMsMSwxLDAsMywzLDMsMywwLDIsMywwLDAsMiwxLDAsMSwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDMsMywzLDMsMiwyLDMsMywyLDIsMiwyLDMsMywwLDEsMiwzLDIsMywyLDIsMywyLDEsMiwwLDIsMiwyLAowLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsCjMsMywzLDMsMywzLDEsMiwzLDMsMywyLDEsMiwzLDMsMiwyLDIsMywyLDMsMywxLDMsMywxLDEsMCwyLDMsMiwKMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLAozLDMsMywxLDIsMiwyLDIsMywzLDMsMSwxLDEsMywzLDEsMSwzLDEsMSwzLDIsMSwyLDMsMSwxLDAsMiwyLDIsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwKMywzLDMsMiwxLDIsMSwxLDMsMywxLDEsMSwxLDMsMywxLDEsMiwyLDEsMiwxLDEsMiwyLDEsMSwwLDIsMiwxLAowLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsCjMsMywzLDEsMSwyLDEsMSwzLDMsMSwwLDEsMSwzLDMsMiwwLDEsMSwyLDMsMSwwLDIsMiwxLDAsMCwxLDMsMiwKMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLAozLDIsMSwzLDMsMywzLDMsMSwyLDMsMiwzLDMsMiwxLDEsMywyLDMsMiwxLDIsMiwwLDEsMiwxLDAsMCwxLDEsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwKMywzLDMsMywyLDIsMiwyLDMsMSwyLDIsMSwxLDMsMywwLDMsMiwxLDIsMywyLDEsMywzLDEsMSwwLDIsMSwzLAowLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsCjMsMywzLDIsMiwyLDMsMiwzLDMsMywyLDEsMSwzLDMsMSwxLDEsMiwyLDMsMiwzLDIsMiwyLDEsMCwyLDIsMSwKMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLAoxLDAsMCwzLDMsMywzLDMsMCwwLDMsMywyLDMsMCwwLDAsMiwzLDMsMSwwLDEsMiwwLDAsMSwxLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywxLDIsMywzLDMsMywzLDEsMiwzLDMsMiwyLDEsMSwwLDMsMywyLDIsMSwyLDIsMSwwLDIsMiwwLDEsMSwxLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywyLDIsMSwzLDEsMiwzLDMsMiwyLDEsMSwyLDIsMSwxLDEsMSwzLDIsMSwxLDEsMSwyLDEsMCwxLDIsMSwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLAoyLDMsMywxLDEsMSwxLDEsMywzLDMsMCwxLDEsMywzLDEsMSwxLDEsMSwyLDIsMCwzLDEsMSwyLDAsMiwxLDEsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwKMywxLDAsMSwyLDEsMiwyLDAsMSwyLDMsMSwyLDAsMCwwLDIsMSwxLDEsMSwxLDIsMCwwLDEsMSwwLDAsMCwwLAoxLDIsMSwyLDIsMiwxLDIsMSwyLDAsMiwwLDIsMiwxLDEsMiwxLDEsMiwxLDEsMSwwLDEsMCwwLDAsMSwxLDAsCjEsMSwxLDIsMywyLDMsMywwLDEsMiwyLDMsMSwwLDEsMCwyLDEsMiwyLDAsMSwxLDAsMCwxLDEsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoxLDAsMCwzLDMsMiwyLDEsMCwwLDMsMiwzLDIsMCwwLDAsMSwxLDMsMCwwLDEsMSwwLDAsMiwxLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywxLDEsMiwyLDMsMywxLDAsMSwzLDIsMywxLDEsMSwwLDEsMSwxLDEsMSwzLDEsMCwwLDIsMiwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMSwxLDEsMiwyLDIsMSwwLDEsMiwzLDMsMiwwLDAsMCwyLDEsMSwxLDIsMSwxLDEsMCwxLDEsMSwwLDAsMCwKMSwyLDIsMiwyLDIsMSwxLDEsMiwwLDIsMSwxLDEsMSwxLDIsMSwxLDEsMSwxLDEsMCwxLDEsMSwwLDAsMSwxLAozLDIsMiwxLDAsMCwxLDEsMiwyLDAsMywwLDEsMiwxLDEsMCwwLDEsMSwxLDAsMSwxLDEsMSwwLDIsMSwxLDEsCjIsMiwxLDEsMSwyLDEsMiwxLDEsMSwxLDEsMSwxLDIsMSwxLDEsMiwzLDEsMSwxLDEsMSwxLDEsMSwxLDAsMSwKMiwzLDMsMCwxLDAsMCwwLDMsMywxLDAsMCwxLDIsMiwxLDAsMCwwLDAsMiwwLDAsMSwxLDEsMCwyLDEsMSwxLAoyLDEsMSwxLDEsMSwxLDIsMSwxLDAsMSwxLDAsMSwxLDEsMCwxLDIsMSwxLDAsMSwxLDEsMSwxLDEsMSwwLDEsCjIsMywzLDAsMSwwLDAsMCwyLDIsMCwwLDAsMCwxLDIsMiwwLDAsMCwwLDEsMCwwLDEsMSwwLDAsMiwwLDEsMCwKMiwxLDEsMSwxLDIsMSwxLDEsMSwxLDEsMSwyLDEsMSwxLDEsMSwxLDEsMSwxLDIsMCwxLDEsMSwxLDEsMCwxLAozLDIsMiwwLDEsMCwxLDAsMiwzLDIsMCwwLDEsMiwyLDEsMCwwLDEsMSwxLDAsMCwyLDEsMCwxLDIsMiwxLDEsCjIsMSwxLDEsMSwxLDEsMiwxLDEsMSwxLDEsMSwwLDIsMSwwLDEsMSwwLDEsMSwxLDAsMSwxLDIsMSwxLDAsMSwKMiwyLDIsMCwwLDEsMCwwLDIsMiwxLDEsMCwwLDIsMSwxLDAsMCwwLDEsMiwwLDAsMiwxLDAsMCwyLDEsMSwxLAoyLDEsMSwxLDEsMiwxLDIsMSwxLDEsMiwyLDEsMSwyLDEsMSwxLDIsMSwxLDEsMSwxLDEsMSwxLDEsMSwwLDEsCjEsMiwzLDAsMCwwLDEsMCwzLDIsMSwwLDAsMSwyLDEsMSwwLDAsMCwwLDIsMSwwLDEsMSwwLDAsMiwxLDIsMSwKMSwxLDAsMCwwLDEsMCwxLDEsMSwxLDEsMiwwLDAsMSwwLDAsMCwyLDAsMCwxLDEsMSwxLDEsMSwxLDEsMCwxLAozLDAsMCwyLDEsMiwyLDEsMCwwLDIsMSwyLDIsMCwwLDAsMiwxLDEsMSwwLDEsMSwwLDAsMSwxLDIsMCwwLDAsCjEsMiwxLDIsMiwxLDEsMiwxLDIsMCwxLDEsMSwxLDEsMSwxLDEsMSwyLDEsMSwwLDAsMSwxLDEsMSwwLDAsMSwKMSwzLDIsMCwwLDAsMSwwLDIsMiwyLDAsMCwwLDIsMiwxLDAsMCwwLDAsMywxLDEsMSwxLDAsMCwyLDEsMSwxLAoyLDEsMCwxLDEsMSwwLDEsMSwxLDEsMSwxLDEsMCwyLDEsMCwwLDEsMCwxLDEsMCwxLDEsMSwxLDEsMSwwLDEsCjIsMywyLDAsMCwwLDEsMCwyLDIsMCwwLDAsMCwyLDEsMSwwLDAsMCwwLDIsMSwwLDEsMSwwLDAsMiwxLDEsMCwKMiwxLDEsMSwxLDIsMSwyLDEsMiwwLDEsMSwxLDAsMiwxLDEsMSwyLDEsMSwxLDEsMCwxLDEsMSwxLDEsMCwxLAozLDEsMSwyLDIsMiwzLDIsMSwxLDIsMiwxLDEsMCwxLDAsMiwyLDEsMSwxLDEsMSwwLDAsMSwxLDAsMSwxLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMiwyLDIsMCwwLDAsMCwwLDIsMiwwLDAsMCwwLDIsMiwxLDAsMCwwLDEsMSwwLDAsMSwyLDAsMCwyLDEsMSwxLAoyLDIsMSwxLDEsMiwxLDIsMSwxLDAsMSwxLDEsMSwyLDEsMSwxLDIsMSwxLDEsMSwwLDEsMiwxLDEsMSwwLDEsCjEsMCwwLDEsMiwzLDIsMSwwLDAsMiwwLDEsMSwwLDAsMCwxLDEsMSwxLDAsMSwxLDAsMCwxLDAsMCwwLDAsMCwKMSwyLDEsMiwxLDIsMSwxLDEsMiwwLDIsMSwxLDEsMCwxLDIsMCwwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLAoyLDMsMiwwLDAsMCwwLDAsMSwxLDIsMSwwLDAsMSwxLDEsMCwwLDAsMCwyLDAsMCwxLDEsMCwwLDIsMSwxLDEsCjIsMSwxLDEsMSwxLDEsMiwxLDAsMSwxLDEsMSwwLDIsMSwxLDEsMSwxLDEsMCwxLDAsMSwxLDEsMSwxLDAsMSwKMSwyLDIsMCwxLDEsMSwwLDIsMiwyLDAsMCwwLDMsMiwxLDAsMCwwLDEsMSwwLDAsMSwxLDAsMSwxLDEsMCwwLAoxLDEsMCwxLDEsMSwxLDEsMSwxLDEsMiwxLDEsMSwxLDEsMSwxLDIsMSwxLDEsMCwwLDEsMSwxLDAsMSwwLDEsCjIsMSwwLDIsMSwxLDIsMiwxLDEsMiwxLDEsMSwwLDAsMCwxLDEsMCwxLDEsMSwxLDAsMCwxLDEsMSwwLDAsMCwKMSwyLDIsMiwyLDIsMSwxLDEsMiwwLDIsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMCwxLDEsMCwwLDAsMSwwLAoxLDIsMywwLDAsMCwxLDAsMiwyLDAsMCwwLDAsMiwyLDAsMCwwLDAsMCwxLDAsMCwxLDAsMCwwLDIsMCwxLDAsCjIsMSwxLDEsMSwxLDAsMiwwLDAsMCwxLDIsMSwxLDEsMSwwLDEsMiwwLDEsMCwxLDAsMSwxLDEsMCwxLDAsMSwKMiwyLDIsMCwwLDAsMSwwLDIsMSwyLDAsMCwwLDEsMSwyLDAsMCwwLDAsMSwwLDAsMSwxLDAsMCwyLDEsMCwxLAoyLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMiwwLDEsMSwxLDEsMSwwLDEsCjEsMiwyLDAsMCwwLDEsMCwyLDIsMiwwLDAsMCwxLDEsMCwwLDAsMCwwLDEsMSwwLDIsMCwwLDEsMSwxLDAsMSwKMSwwLDEsMSwxLDEsMSwxLDAsMSwxLDEsMSwwLDAsMSwwLDAsMSwxLDAsMSwwLDEsMSwxLDEsMSwwLDAsMCwxLAoxLDAsMCwxLDAsMSwyLDEsMCwwLDEsMSwxLDIsMCwwLDAsMSwxLDAsMSwwLDEsMSwwLDAsMSwwLDAsMCwwLDAsCjAsMiwxLDIsMSwxLDEsMSwxLDIsMCwyLDAsMSwxLDAsMSwyLDEsMCwxLDEsMSwwLDAsMCwwLDAsMCwxLDAsMCwKMiwxLDEsMCwxLDIsMCwwLDEsMSwxLDAsMCwwLDEsMSwwLDAsMCwwLDAsMSwwLDAsMSwwLDAsMCwyLDEsMCwxLAoyLDIsMSwxLDEsMSwxLDIsMSwxLDAsMSwxLDEsMSwyLDEsMSwxLDIsMSwxLDAsMSwwLDEsMSwxLDEsMSwwLDEsCjEsMiwyLDAsMCwwLDAsMCwxLDEsMCwwLDAsMCwyLDEsMCwwLDAsMCwwLDIsMCwwLDIsMiwwLDAsMiwwLDAsMSwKMiwxLDEsMSwxLDEsMSwxLDAsMSwxLDAsMSwxLDAsMSwwLDAsMCwxLDEsMSwxLDAsMCwxLDEsMSwxLDAsMCwxLAoxLDEsMiwwLDAsMywxLDAsMiwxLDEsMSwwLDAsMSwxLDEsMCwwLDAsMSwxLDAsMCwwLDEsMCwwLDEsMCwxLDAsCjEsMiwxLDAsMSwxLDEsMiwxLDEsMCwxLDEsMSwxLDEsMCwwLDAsMSwxLDEsMSwxLDAsMSwwLDAsMCwxLDAsMCwKMiwxLDEsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDEsMCwxLDAsMCwwLDEsMCwwLDAsMCwyLDAsMCwwLAoyLDEsMSwxLDEsMSwxLDEsMSwxLDAsMSwxLDEsMSwxLDEsMSwxLDEsMiwxLDEsMCwwLDEsMSwxLDEsMSwwLDEsCjIsMSwxLDEsMiwxLDEsMSwwLDEsMSwyLDEsMCwwLDAsMCwxLDEsMSwxLDAsMSwwLDAsMCwwLDEsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoxLDEsMCwxLDEsMSwxLDEsMCwwLDEsMSwyLDEsMCwwLDAsMSwxLDAsMCwwLDEsMSwwLDAsMSwwLDEsMCwwLDAsCjEsMiwxLDEsMSwxLDEsMSwxLDEsMCwxLDAsMSwxLDEsMSwxLDEsMCwxLDEsMSwwLDAsMCwwLDAsMCwxLDAsMCwKMiwwLDAsMCwxLDEsMSwxLDAsMCwxLDEsMCwwLDAsMCwwLDEsMSwxLDIsMCwwLDEsMCwwLDEsMCwxLDAsMCwwLAowLDEsMSwxLDEsMSwxLDEsMSwyLDAsMSwxLDEsMSwwLDEsMSwxLDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwLDAsCjEsMCwwLDEsMSwxLDEsMSwwLDAsMiwxLDAsMSwwLDAsMCwxLDAsMSwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwKMCwxLDEsMSwxLDEsMSwwLDEsMSwwLDEsMCwxLDEsMCwxLDEsMCwwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLAoxLDAsMCwxLDEsMSwwLDAsMCwwLDEsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMSwxLDEsMSwxLDAsMCwxLDEsMCwxLDAsMSwwLDAsMSwxLDEsMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMSwwLDAsMCwwLDAsMCwxLDEsMiwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDEsMSwxLDAsMSwwLDAsMSwxLDAsMSwwLDEsMSwwLDEsMSwxLDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwLDAsCjIsMSwxLDEsMSwxLDEsMSwxLDEsMSwwLDAsMSwxLDEsMCwwLDEsMCwwLDEsMCwxLDAsMSwxLDEsMCwwLDEsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoxLDAsMCwxLDEsMSwxLDAsMCwwLDEsMSwxLDAsMCwwLDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMSwxLDEsMSwxLDEsMCwxLDEsMCwxLDAsMSwwLDAsMSwxLDAsMCwxLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKQoKTGF0aW4ySHVuZ2FyaWFuTW9kZWwgPSB7CiAgJ2NoYXJfdG9fb3JkZXJfbWFwJzogTGF0aW4yX0h1bmdhcmlhbkNoYXJUb09yZGVyTWFwLAogICdwcmVjZWRlbmNlX21hdHJpeCc6IEh1bmdhcmlhbkxhbmdNb2RlbCwKICAndHlwaWNhbF9wb3NpdGl2ZV9yYXRpbyc6IDAuOTQ3MzY4LAogICdrZWVwX2VuZ2xpc2hfbGV0dGVyJzogVHJ1ZSwKICAnY2hhcnNldF9uYW1lJzogIklTTy04ODU5LTIiLAogICdsYW5ndWFnZSc6ICdIdW5nYXJpYW4nLAp9CgpXaW4xMjUwSHVuZ2FyaWFuTW9kZWwgPSB7CiAgJ2NoYXJfdG9fb3JkZXJfbWFwJzogd2luMTI1MEh1bmdhcmlhbkNoYXJUb09yZGVyTWFwLAogICdwcmVjZWRlbmNlX21hdHJpeCc6IEh1bmdhcmlhbkxhbmdNb2RlbCwKICAndHlwaWNhbF9wb3NpdGl2ZV9yYXRpbyc6IDAuOTQ3MzY4LAogICdrZWVwX2VuZ2xpc2hfbGV0dGVyJzogVHJ1ZSwKICAnY2hhcnNldF9uYW1lJzogIndpbmRvd3MtMTI1MCIsCiAgJ2xhbmd1YWdlJzogJ0h1bmdhcmlhbicsCn0KUEsDBBQAAAAAAAAAIQAiD9I/GiwAABosAABBAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2xhbmd0aGFpbW9kZWwucHkjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQkVHSU4gTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBUaGUgT3JpZ2luYWwgQ29kZSBpcyBNb3ppbGxhIENvbW11bmljYXRvciBjbGllbnQgY29kZS4KIwojIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwojIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uLgojIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDE5OTgKIyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiMKIyBDb250cmlidXRvcihzKToKIyAgIE1hcmsgUGlsZ3JpbSAtIHBvcnQgdG8gUHl0aG9uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgojIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQojIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQojIDAyMTEwLTEzMDEgIFVTQQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVORCBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiMgMjU1OiBDb250cm9sIGNoYXJhY3RlcnMgdGhhdCB1c3VhbGx5IGRvZXMgbm90IGV4aXN0IGluIGFueSB0ZXh0CiMgMjU0OiBDYXJyaWFnZS9SZXR1cm4KIyAyNTM6IHN5bWJvbCAocHVuY3R1YXRpb24pIHRoYXQgZG9lcyBub3QgYmVsb25nIHRvIHdvcmQKIyAyNTI6IDAgLSA5CgojIFRoZSBmb2xsb3dpbmcgcmVzdWx0IGZvciB0aGFpIHdhcyBjb2xsZWN0ZWQgZnJvbSBhIGxpbWl0ZWQgc2FtcGxlICgxTSkuCgojIENoYXJhY3RlciBNYXBwaW5nIFRhYmxlOgpUSVM2MjBDaGFyVG9PcmRlck1hcCA9ICgKMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NCwyNTUsMjU1LDI1NCwyNTUsMjU1LCAgIyAwMAoyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsICAjIDEwCjI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgMjAKMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyAzMAoyNTMsMTgyLDEwNiwxMDcsMTAwLDE4MywxODQsMTg1LDEwMSwgOTQsMTg2LDE4NywxMDgsMTA5LDExMCwxMTEsICAjIDQwCjE4OCwxODksMTkwLCA4OSwgOTUsMTEyLDExMywxOTEsMTkyLDE5MywxOTQsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgNTAKMjUzLCA2NCwgNzIsIDczLDExNCwgNzQsMTE1LDExNiwxMDIsIDgxLDIwMSwxMTcsIDkwLDEwMywgNzgsIDgyLCAgIyA2MAogOTYsMjAyLCA5MSwgNzksIDg0LDEwNCwxMDUsIDk3LCA5OCwgOTIsMjAzLDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDcwCjIwOSwyMTAsMjExLDIxMiwyMTMsIDg4LDIxNCwyMTUsMjE2LDIxNywyMTgsMjE5LDIyMCwxMTgsMjIxLDIyMiwKMjIzLDIyNCwgOTksIDg1LCA4MywyMjUsMjI2LDIyNywyMjgsMjI5LDIzMCwyMzEsMjMyLDIzMywyMzQsMjM1LAoyMzYsICA1LCAzMCwyMzcsIDI0LDIzOCwgNzUsICA4LCAyNiwgNTIsIDM0LCA1MSwxMTksIDQ3LCA1OCwgNTcsCiA0OSwgNTMsIDU1LCA0MywgMjAsIDE5LCA0NCwgMTQsIDQ4LCAgMywgMTcsIDI1LCAzOSwgNjIsIDMxLCA1NCwKIDQ1LCAgOSwgMTYsICAyLCA2MSwgMTUsMjM5LCAxMiwgNDIsIDQ2LCAxOCwgMjEsIDc2LCAgNCwgNjYsIDYzLAogMjIsIDEwLCAgMSwgMzYsIDIzLCAxMywgNDAsIDI3LCAzMiwgMzUsIDg2LDI0MCwyNDEsMjQyLDI0MywyNDQsCiAxMSwgMjgsIDQxLCAyOSwgMzMsMjQ1LCA1MCwgMzcsICA2LCAgNywgNjcsIDc3LCAzOCwgOTMsMjQ2LDI0NywKIDY4LCA1NiwgNTksIDY1LCA2OSwgNjAsIDcwLCA4MCwgNzEsIDg3LDI0OCwyNDksMjUwLDI1MSwyNTIsMjUzLAopCgojIE1vZGVsIFRhYmxlOgojIHRvdGFsIHNlcXVlbmNlczogMTAwJQojIGZpcnN0IDUxMiBzZXF1ZW5jZXM6IDkyLjYzODYlCiMgZmlyc3QgMTAyNCBzZXF1ZW5jZXM6Ny4zMTc3JQojIHJlc3QgIHNlcXVlbmNlczogICAgIDEuMDIzMCUKIyBuZWdhdGl2ZSBzZXF1ZW5jZXM6ICAwLjA0MzYlClRoYWlMYW5nTW9kZWwgPSAoCjAsMSwzLDMsMywzLDAsMCwzLDMsMCwzLDMsMCwzLDMsMywzLDMsMywzLDMsMCwwLDMsMywzLDAsMywzLDMsMywKMCwzLDMsMCwwLDAsMSwzLDAsMywzLDIsMywzLDAsMSwyLDMsMywzLDMsMCwyLDAsMiwwLDAsMywyLDEsMiwyLAozLDAsMywzLDIsMywwLDAsMywzLDAsMywzLDAsMywzLDMsMywzLDMsMywzLDMsMCwzLDIsMywwLDIsMiwyLDMsCjAsMiwzLDAsMCwwLDAsMSwwLDEsMiwzLDEsMSwzLDIsMiwwLDEsMSwwLDAsMSwwLDAsMCwwLDAsMCwwLDEsMSwKMywzLDMsMiwzLDMsMywzLDMsMywzLDMsMywzLDMsMiwyLDIsMiwyLDIsMiwzLDMsMiwzLDIsMywzLDIsMiwyLAozLDEsMiwzLDAsMywzLDIsMiwxLDIsMywzLDEsMiwwLDEsMywwLDEsMCwwLDEsMCwwLDAsMCwwLDAsMCwxLDEsCjMsMywyLDIsMywzLDMsMywxLDIsMywzLDMsMywzLDIsMiwyLDIsMywzLDIsMiwzLDMsMiwyLDMsMiwzLDIsMiwKMywzLDEsMiwzLDEsMiwyLDMsMywxLDAsMiwxLDAsMCwzLDEsMiwxLDAsMCwxLDAsMCwwLDAsMCwwLDEsMCwxLAozLDMsMywzLDMsMywyLDIsMywzLDMsMywyLDMsMiwyLDMsMywyLDIsMywyLDIsMiwyLDEsMSwzLDEsMiwxLDEsCjMsMiwxLDAsMiwxLDAsMSwwLDEsMSwwLDEsMSwwLDAsMSwwLDEsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDMsMiwzLDIsMywzLDIsMiwzLDIsMywzLDIsMywxLDEsMiwzLDIsMiwyLDMsMiwyLDIsMiwyLDEsMiwxLAoyLDIsMSwxLDMsMywyLDEsMCwxLDIsMiwwLDEsMywwLDAsMCwxLDEsMCwwLDAsMCwwLDIsMywwLDAsMiwxLDEsCjMsMywyLDMsMywyLDAsMCwzLDMsMCwzLDMsMCwyLDIsMywxLDIsMiwxLDEsMSwwLDIsMiwyLDAsMiwyLDEsMSwKMCwyLDEsMCwyLDAsMCwyLDAsMSwwLDAsMSwwLDAsMCwxLDEsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLAozLDMsMiwzLDMsMiwwLDAsMywzLDAsMiwzLDAsMiwxLDIsMiwyLDIsMSwyLDAsMCwyLDIsMiwwLDIsMiwxLDEsCjAsMiwxLDAsMiwwLDAsMiwwLDEsMSwwLDEsMCwwLDAsMCwwLDAsMSwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDIsMywyLDMsMiwwLDIsMiwxLDMsMiwxLDMsMiwxLDIsMywyLDIsMywwLDIsMywyLDIsMSwyLDIsMiwyLAoxLDIsMiwwLDAsMCwwLDIsMCwxLDIsMCwxLDEsMSwwLDEsMCwzLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsCjMsMywyLDMsMywyLDMsMiwyLDIsMywyLDIsMywyLDIsMSwyLDMsMiwyLDMsMSwzLDIsMiwyLDMsMiwyLDIsMywKMywyLDEsMywwLDEsMSwxLDAsMiwxLDEsMSwxLDEsMCwxLDAsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLAoxLDAsMCwzLDAsMywzLDMsMywzLDAsMCwzLDAsMiwyLDMsMywzLDMsMywwLDAsMCwxLDEsMywwLDAsMCwwLDIsCjAsMCwxLDAsMCwwLDAsMCwwLDAsMiwzLDAsMCwwLDMsMCwyLDAsMCwwLDAsMCwzLDAsMCwwLDAsMCwwLDAsMCwKMiwwLDMsMywzLDMsMCwwLDIsMywwLDAsMywwLDMsMywyLDMsMywzLDMsMywwLDAsMywzLDMsMCwwLDAsMywzLAowLDAsMywwLDAsMCwwLDIsMCwwLDIsMSwxLDMsMCwwLDEsMCwwLDIsMywwLDEsMCwwLDAsMCwwLDAsMCwxLDAsCjMsMywzLDMsMiwzLDMsMywzLDMsMywzLDEsMiwxLDMsMywyLDIsMSwyLDIsMiwzLDEsMSwyLDAsMiwxLDIsMSwKMiwyLDEsMCwwLDAsMSwxLDAsMSwwLDEsMSwwLDAsMCwwLDAsMSwxLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLAozLDAsMiwxLDIsMywzLDMsMCwyLDAsMiwyLDAsMiwxLDMsMiwyLDEsMiwxLDAsMCwyLDIsMSwwLDIsMSwyLDIsCjAsMSwxLDAsMCwwLDAsMSwwLDEsMSwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDMsMywyLDEsMywzLDEsMSwzLDAsMiwzLDEsMSwzLDIsMSwxLDIsMCwyLDIsMywyLDEsMSwxLDEsMSwyLAozLDAsMCwxLDMsMSwyLDEsMiwwLDMsMCwwLDAsMSwwLDMsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsCjMsMywxLDEsMywyLDMsMywzLDEsMywyLDEsMywyLDEsMywyLDIsMiwyLDEsMywzLDEsMiwxLDMsMSwyLDMsMCwKMiwxLDEsMywyLDIsMiwxLDIsMSwwLDAsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLAozLDMsMiwzLDIsMywzLDIsMywyLDMsMiwzLDMsMiwxLDAsMywyLDIsMiwxLDIsMiwyLDEsMiwyLDEsMiwxLDEsCjIsMiwyLDMsMCwxLDMsMSwxLDEsMSwwLDEsMSwwLDIsMSwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDMsMywyLDMsMiwyLDEsMSwzLDIsMywyLDMsMiwwLDMsMiwyLDEsMiwwLDIsMiwyLDEsMiwyLDIsMiwxLAozLDIsMSwyLDIsMSwwLDIsMCwxLDAsMCwxLDEsMCwwLDAsMCwwLDEsMSwwLDEsMCwwLDAsMCwwLDAsMCwwLDEsCjMsMywzLDMsMywyLDMsMSwyLDMsMywyLDIsMywwLDEsMSwyLDAsMywzLDIsMiwzLDAsMSwxLDMsMCwwLDAsMCwKMywxLDAsMywzLDAsMiwwLDIsMSwwLDAsMywyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMywyLDMsMiwzLDMsMCwxLDMsMSwxLDIsMSwyLDEsMSwzLDEsMSwwLDIsMywxLDEsMSwxLDEsMSwxLDEsCjMsMSwxLDIsMiwyLDIsMSwxLDEsMCwwLDIsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwKMywyLDIsMSwxLDIsMSwzLDMsMiwzLDIsMiwzLDIsMiwzLDEsMiwyLDEsMiwwLDMsMiwxLDIsMiwyLDIsMiwxLAozLDIsMSwyLDIsMiwxLDEsMSwxLDAsMCwxLDEsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywzLDMsMywzLDMsMywxLDMsMywwLDIsMSwwLDMsMiwwLDAsMywxLDAsMSwxLDAsMSwwLDAsMCwwLDAsMSwKMSwwLDAsMSwwLDMsMiwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDAsMiwyLDIsMywwLDAsMSwzLDAsMywyLDAsMywyLDIsMywzLDMsMywzLDEsMCwyLDIsMiwwLDIsMiwxLDIsCjAsMiwzLDAsMCwwLDAsMSwwLDEsMCwwLDEsMSwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwKMywwLDIsMywxLDMsMywyLDMsMywwLDMsMywwLDMsMiwyLDMsMiwzLDMsMywwLDAsMiwyLDMsMCwxLDEsMSwzLAowLDAsMywwLDAsMCwyLDIsMCwxLDMsMCwxLDIsMiwyLDMsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDEsCjMsMiwzLDMsMiwwLDMsMywyLDIsMywxLDMsMiwxLDMsMiwwLDEsMiwyLDAsMiwzLDIsMSwwLDMsMCwwLDAsMCwKMywwLDAsMiwzLDEsMywwLDAsMywwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDEsMywyLDIsMiwxLDIsMCwxLDMsMSwxLDMsMSwzLDAsMCwyLDEsMSwxLDEsMiwxLDEsMSwwLDIsMSwwLDEsCjEsMiwwLDAsMCwzLDEsMSwwLDAsMCwwLDEsMCwxLDAsMCwxLDAsMSwwLDAsMCwwLDAsMywxLDAsMCwwLDEsMCwKMywzLDMsMywyLDIsMiwyLDIsMSwzLDEsMSwxLDIsMCwxLDEsMiwxLDIsMSwzLDIsMCwwLDMsMSwxLDEsMSwxLAozLDEsMCwyLDMsMCwwLDAsMywwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDIsMywwLDMsMywwLDIsMCwwLDAsMCwwLDAsMCwzLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMiwzLDEsMywwLDAsMSwyLDAsMCwyLDAsMywzLDIsMywzLDMsMiwzLDAsMCwyLDIsMiwwLDAsMCwyLDIsCjAsMCwxLDAsMCwwLDAsMywwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMywwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDIsMywxLDMsMywwLDAsMSwwLDMsMCwwLDAsMCwwLAowLDAsMywwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywxLDIsMywxLDIsMywxLDAsMywwLDIsMiwxLDAsMiwxLDEsMiwwLDEsMCwwLDEsMSwxLDEsMCwxLDAsMCwKMSwwLDAsMCwwLDEsMSwwLDMsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMywzLDIsMSwwLDEsMSwxLDMsMSwyLDIsMiwyLDIsMiwxLDEsMSwxLDAsMywxLDAsMSwzLDEsMSwxLDEsCjEsMSwwLDIsMCwxLDMsMSwxLDAsMCwxLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMSwKMywwLDIsMiwxLDMsMywyLDMsMywwLDEsMSwwLDIsMiwxLDIsMSwzLDMsMSwwLDAsMywyLDAsMCwwLDAsMiwxLAowLDEsMCwwLDAsMCwxLDIsMCwxLDEsMywxLDEsMiwyLDEsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsCjAsMCwzLDAsMCwxLDAsMCwwLDMsMCwwLDMsMCwzLDEsMCwxLDEsMSwzLDIsMCwwLDAsMywwLDAsMCwwLDIsMCwKMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMSwzLDIsMSwzLDMsMSwyLDIsMCwxLDIsMSwwLDEsMiwwLDAsMCwwLDAsMywwLDAsMCwzLDAsMCwwLDAsCjMsMCwwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywwLDEsMiwwLDMsMywzLDIsMiwwLDEsMSwwLDEsMywwLDAsMCwyLDIsMCwwLDAsMCwzLDEsMCwxLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwxLDAsMSwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMCwyLDMsMSwyLDAsMCwyLDEsMCwzLDEsMCwxLDIsMCwxLDEsMSwxLDMsMCwwLDMsMSwxLDAsMiwyLDEsMSwKMCwyLDAsMCwwLDAsMCwxLDAsMSwwLDAsMSwxLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDAsMCwzLDEsMiwwLDAsMiwyLDAsMSwyLDAsMSwwLDEsMywxLDIsMSwwLDAsMCwyLDAsMywwLDAsMCwxLDAsCjAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywwLDEsMSwyLDIsMCwwLDAsMiwwLDIsMSwwLDEsMSwwLDEsMSwxLDIsMSwwLDAsMSwxLDEsMCwyLDEsMSwxLAowLDEsMSwwLDAsMCwwLDAsMCwxLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMSwwLDEsCjAsMCwwLDIsMCwxLDMsMSwxLDEsMSwwLDAsMCwwLDMsMiwwLDEsMCwwLDAsMSwyLDAsMCwwLDEsMCwwLDAsMCwKMCwwLDAsMywwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMywzLDMsMywxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMSwwLDIsMywyLDIsMCwwLDAsMSwwLDAsMCwwLDIsMywyLDEsMiwyLDMsMCwwLDAsMiwzLDEsMCwwLDAsMSwxLAowLDAsMSwwLDAsMCwwLDAsMCwwLDEsMCwwLDEsMCwwLDAsMCwwLDEsMSwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywyLDIsMCwxLDAsMCwwLDAsMiwwLDIsMCwxLDAsMCwwLDEsMSwwLDAsMCwyLDEsMCwxLDAsMSwxLDAsMCwKMCwxLDAsMiwwLDAsMSwwLDMsMCwxLDAsMCwwLDIsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMSwwLDAsMSwwLDAsMCwwLDAsMSwxLDIsMCwwLDAsMCwxLDAsMCwxLDMsMSwwLDAsMCwwLDEsMSwwLDAsCjAsMSwwLDAsMCwwLDMsMCwwLDAsMCwwLDAsMywwLDAsMCwwLDAsMCwwLDMsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDEsMSwxLDEsMiwzLDAsMCwyLDEsMSwxLDEsMSwwLDIsMSwxLDAsMCwwLDIsMSwwLDEsMiwxLDEsMCwxLAoyLDEsMCwzLDAsMCwwLDAsMywwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjEsMywxLDAsMCwwLDAsMCwwLDAsMywwLDAsMCwzLDAsMCwwLDAsMCwwLDAsMCwxLDEsMCwwLDAsMCwwLDAsMSwKMCwwLDAsMiwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMiwwLDAsMCwwLDAsMCwxLDIsMSwwLDEsMSwwLDIsMCwwLDEsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDIsMCwwLDAsMSwzLDAsMSwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMSwyLDAsMCwwLDAsMCwKMywzLDAsMCwxLDEsMiwwLDAsMSwyLDEsMCwxLDEsMSwwLDEsMSwwLDAsMiwxLDEsMCwxLDAsMCwxLDEsMSwwLAowLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwzLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjIsMiwyLDEsMCwwLDAsMCwxLDAsMCwwLDAsMywwLDAsMCwwLDAsMCwwLDAsMCwzLDAsMCwwLDAsMCwwLDAsMCwKMiwwLDAsMCwwLDAsMywwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoyLDMsMCwwLDEsMSwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDEsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjEsMSwwLDEsMiwwLDEsMiwwLDAsMSwxLDAsMiwwLDEsMCwwLDEsMCwwLDAsMCwxLDAsMCwwLDIsMCwwLDAsMCwKMSwwLDAsMSwwLDEsMSwwLDMsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDEsMCwwLDAsMCwwLDAsMCwxLDEsMCwxLDEsMCwyLDEsMywwLDAsMCwwLDEsMSwwLDAsMCwwLDAsMCwwLDMsCjEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwzLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjIsMCwxLDAsMSwwLDAsMiwwLDAsMiwwLDAsMSwxLDIsMCwwLDEsMSwwLDAsMCwxLDAsMCwwLDEsMSwwLDAsMCwKMSwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLAoxLDAsMCwzLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDEsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwxLDEsMCwwLDAsCjIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwzLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoyLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwxLDAsMSwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwxLDMsMCwwLDAsCjIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMSwwLDAsMCwwLAoxLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMiwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDEsMSwwLDAsMiwxLDAsMCwxLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAopCgpUSVM2MjBUaGFpTW9kZWwgPSB7CiAgJ2NoYXJfdG9fb3JkZXJfbWFwJzogVElTNjIwQ2hhclRvT3JkZXJNYXAsCiAgJ3ByZWNlZGVuY2VfbWF0cml4JzogVGhhaUxhbmdNb2RlbCwKICAndHlwaWNhbF9wb3NpdGl2ZV9yYXRpbyc6IDAuOTI2Mzg2LAogICdrZWVwX2VuZ2xpc2hfbGV0dGVyJzogRmFsc2UsCiAgJ2NoYXJzZXRfbmFtZSc6ICJUSVMtNjIwIiwKICAnbGFuZ3VhZ2UnOiAnVGhhaScsCn0KUEsDBBQAAAAAAAAAIQC1MsNkXisAAF4rAABEAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2xhbmd0dXJraXNobW9kZWwucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQkVHSU4gTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBUaGUgT3JpZ2luYWwgQ29kZSBpcyBNb3ppbGxhIENvbW11bmljYXRvciBjbGllbnQgY29kZS4KIwojIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwojIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uLgojIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDE5OTgKIyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiMKIyBDb250cmlidXRvcihzKToKIyAgIE1hcmsgUGlsZ3JpbSAtIHBvcnQgdG8gUHl0aG9uCiMgICDDlnpnw7xyIEJhc2vEsW4gLSBUdXJraXNoIExhbmd1YWdlIE1vZGVsCiMKIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgojIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQojIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQojIDAyMTEwLTEzMDEgIFVTQQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVORCBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiMgMjU1OiBDb250cm9sIGNoYXJhY3RlcnMgdGhhdCB1c3VhbGx5IGRvZXMgbm90IGV4aXN0IGluIGFueSB0ZXh0CiMgMjU0OiBDYXJyaWFnZS9SZXR1cm4KIyAyNTM6IHN5bWJvbCAocHVuY3R1YXRpb24pIHRoYXQgZG9lcyBub3QgYmVsb25nIHRvIHdvcmQKIyAyNTI6IDAgLSA5CgojIENoYXJhY3RlciBNYXBwaW5nIFRhYmxlOgpMYXRpbjVfVHVya2lzaENoYXJUb09yZGVyTWFwID0gKAoyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCjI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAoyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCjI1NSwgMjMsIDM3LCA0NywgMzksIDI5LCA1MiwgMzYsIDQ1LCA1MywgNjAsIDE2LCA0OSwgMjAsIDQ2LCA0MiwKIDQ4LCA2OSwgNDQsIDM1LCAzMSwgNTEsIDM4LCA2MiwgNjUsIDQzLCA1NiwyNTUsMjU1LDI1NSwyNTUsMjU1LAoyNTUsICAxLCAyMSwgMjgsIDEyLCAgMiwgMTgsIDI3LCAyNSwgIDMsIDI0LCAxMCwgIDUsIDEzLCAgNCwgMTUsCiAyNiwgNjQsICA3LCAgOCwgIDksIDE0LCAzMiwgNTcsIDU4LCAxMSwgMjIsMjU1LDI1NSwyNTUsMjU1LDI1NSwKMTgwLDE3OSwxNzgsMTc3LDE3NiwxNzUsMTc0LDE3MywxNzIsMTcxLDE3MCwxNjksMTY4LDE2NywxNjYsMTY1LAoxNjQsMTYzLDE2MiwxNjEsMTYwLDE1OSwxMDEsMTU4LDE1NywxNTYsMTU1LDE1NCwxNTMsMTUyLDE1MSwxMDYsCjE1MCwxNDksMTQ4LDE0NywxNDYsMTQ1LDE0NCwxMDAsMTQzLDE0MiwxNDEsMTQwLDEzOSwxMzgsMTM3LDEzNiwKIDk0LCA4MCwgOTMsMTM1LDEwNSwxMzQsMTMzLCA2MywxMzIsMTMxLDEzMCwxMjksMTI4LDEyNywxMjYsMTI1LAoxMjQsMTA0LCA3MywgOTksIDc5LCA4NSwxMjMsIDU0LDEyMiwgOTgsIDkyLDEyMSwxMjAsIDkxLDEwMywxMTksCiA2OCwxMTgsMTE3LCA5NywxMTYsMTE1LCA1MCwgOTAsMTE0LDExMywxMTIsMTExLCA1NSwgNDEsIDQwLCA4NiwKIDg5LCA3MCwgNTksIDc4LCA3MSwgODIsIDg4LCAzMywgNzcsIDY2LCA4NCwgODMsMTEwLCA3NSwgNjEsIDk2LAogMzAsIDY3LDEwOSwgNzQsIDg3LDEwMiwgMzQsIDk1LCA4MSwxMDgsIDc2LCA3MiwgMTcsICA2LCAxOSwxMDcsCikKClR1cmtpc2hMYW5nTW9kZWwgPSAoCjMsMiwzLDMsMywxLDMsMywzLDMsMywzLDMsMywyLDEsMSwzLDMsMSwzLDMsMCwzLDMsMywzLDMsMCwzLDEsMywKMywyLDEsMCwwLDEsMSwwLDAsMCwxLDAsMCwxLDEsMSwxLDAsMCwwLDAsMCwwLDAsMiwyLDAsMCwxLDAsMCwxLAozLDIsMiwzLDMsMCwzLDMsMywzLDMsMywzLDIsMywxLDAsMywzLDEsMywzLDAsMywzLDMsMywzLDAsMywwLDMsCjMsMSwxLDAsMSwwLDEsMCwwLDAsMCwwLDAsMSwxLDEsMSwwLDAsMCwwLDAsMCwwLDIsMiwwLDAsMCwxLDAsMSwKMywzLDIsMywzLDAsMywzLDMsMywzLDMsMywyLDMsMSwxLDMsMywwLDMsMywxLDIsMywzLDMsMywwLDMsMCwzLAozLDEsMSwwLDAsMCwxLDAsMCwwLDAsMSwxLDAsMSwyLDEsMCwwLDAsMSwwLDAsMCwwLDIsMCwwLDAsMCwwLDEsCjMsMywzLDMsMywzLDIsMywzLDMsMywzLDMsMywzLDEsMywzLDIsMCwzLDIsMSwyLDIsMSwzLDMsMCwwLDAsMiwKMiwyLDAsMSwwLDAsMSwwLDAsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwxLDEsMCwxLDAsMCwxLAozLDMsMywyLDMsMywxLDIsMywzLDMsMywzLDMsMywxLDMsMiwxLDAsMywyLDAsMSwyLDMsMywyLDEsMCwwLDIsCjIsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMiwwLDAsMCwKMSwwLDEsMywzLDEsMywzLDMsMywzLDMsMywxLDIsMCwwLDIsMywwLDIsMywwLDAsMiwyLDIsMywwLDMsMCwxLAoyLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDAsMywzLDMsMCwzLDIsMCwyLDMsMiwzLDMsMSwwLDAsMiwKMywyLDAsMCwxLDAsMCwwLDAsMCwwLDIsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMSwxLDEsMCwyLDAsMCwxLAozLDMsMywyLDMsMywyLDMsMywzLDMsMiwzLDMsMywwLDMsMywwLDAsMiwxLDAsMCwyLDMsMiwyLDAsMCwwLDIsCjIsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwxLDAsMCwwLDEsMCwxLDAsMiwwLDAsMSwKMywzLDMsMiwzLDMsMywzLDMsMywzLDIsMywzLDMsMCwzLDIsMCwxLDMsMiwxLDEsMywyLDMsMiwxLDAsMCwyLAoyLDIsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMSwwLDAsMCwwLDAsCjMsMywzLDIsMywzLDMsMywzLDMsMywyLDMsMywzLDAsMywyLDIsMCwyLDMsMCwwLDIsMiwyLDIsMCwwLDAsMiwKMywzLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDIsMCwxLDAsMCwwLAozLDMsMywzLDMsMywzLDIsMiwyLDIsMywyLDMsMywwLDMsMywxLDEsMiwyLDAsMCwyLDIsMywyLDAsMCwxLDMsCjAsMywxLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwxLDAsMCwwLDAsMSwKMywzLDMsMiwzLDMsMywyLDEsMiwyLDMsMiwzLDMsMCwzLDIsMCwwLDEsMSwwLDEsMSwyLDEsMiwwLDAsMCwxLAowLDMsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMSwwLDEsMCwwLDAsCjMsMywzLDIsMywzLDIsMywyLDIsMiwzLDMsMywzLDEsMywxLDEsMCwzLDIsMSwxLDMsMywyLDMsMSwwLDAsMSwKMSwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwyLDAsMCwxLAozLDIsMiwzLDMsMCwzLDMsMywzLDMsMywzLDIsMiwxLDAsMywzLDEsMywzLDAsMSwzLDMsMiwzLDAsMywwLDMsCjIsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwKMiwyLDIsMywzLDAsMywzLDMsMywzLDMsMywzLDMsMCwwLDMsMiwwLDMsMywwLDMsMiwzLDMsMywwLDMsMSwzLAoyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDEsMiwwLDEsMCwwLDAsMCwwLDAsMCwyLDIsMCwwLDEsMCwwLDEsCjMsMywzLDEsMiwzLDMsMSwwLDAsMSwwLDAsMywzLDIsMywwLDAsMiwwLDAsMiwwLDIsMCwwLDAsMiwwLDIsMCwKMCwzLDEsMCwxLDAsMCwwLDIsMiwxLDAsMSwxLDIsMSwyLDIsMiwwLDIsMSwxLDAsMCwwLDIsMCwwLDAsMCwwLAoxLDIsMSwzLDMsMCwzLDMsMywzLDMsMiwzLDAsMCwwLDAsMiwzLDAsMiwzLDEsMCwyLDMsMSwzLDAsMywwLDIsCjMsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDMsMSwzLDMsMiwyLDMsMiwyLDAsMSwyLDMsMCwxLDIsMSwwLDEsMCwwLDAsMSwwLDIsMiwwLDAsMCwxLAoxLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwxLDEsMCwwLDEsMCwwLDAsCjMsMywzLDEsMywzLDEsMSwzLDMsMSwxLDMsMywxLDAsMiwxLDIsMCwyLDEsMCwwLDEsMSwyLDEsMCwwLDAsMiwKMiwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMywxLDAsMiwxLDMsMCwwLDIsMCwwLDMsMywwLDMsMCwwLDEsMCwxLDIsMCwwLDEsMSwyLDIsMCwxLDAsCjAsMSwyLDEsMSwwLDEsMCwxLDEsMSwxLDEsMCwxLDEsMSwyLDIsMSwyLDAsMSwwLDAsMCwwLDAsMCwxLDAsMCwKMywzLDMsMiwzLDIsMywzLDAsMiwyLDIsMywzLDMsMCwzLDAsMCwwLDIsMiwwLDEsMiwxLDEsMSwwLDAsMCwxLAowLDMsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsCjMsMywzLDMsMywzLDIsMSwyLDIsMywzLDMsMywyLDAsMiwwLDAsMCwyLDIsMCwwLDIsMSwzLDMsMCwwLDEsMSwKMSwxLDAsMCwxLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwxLDAsMCwwLAoxLDEsMiwzLDMsMCwzLDMsMywzLDMsMywyLDIsMCwyLDAsMiwzLDIsMywyLDIsMiwyLDIsMiwyLDEsMywyLDMsCjIsMCwyLDEsMiwyLDIsMiwxLDEsMiwyLDEsMiwyLDEsMiwwLDAsMiwxLDEsMCwyLDEsMCwwLDEsMCwwLDAsMSwKMiwzLDMsMSwxLDEsMCwxLDEsMSwyLDMsMiwxLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMSwwLDAsMCwwLAowLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywzLDIsMiwyLDMsMiwzLDIsMiwxLDMsMywzLDAsMiwxLDIsMCwyLDEsMCwwLDEsMSwxLDEsMSwwLDAsMSwKMiwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMSwwLDIsMCwxLDAsMCwwLAozLDMsMywyLDMsMywzLDMsMywyLDMsMSwyLDMsMywxLDIsMCwwLDAsMCwwLDAsMCwzLDIsMSwxLDAsMCwwLDAsCjIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwKMywzLDMsMiwyLDMsMywyLDEsMSwxLDEsMSwzLDMsMCwzLDEsMCwwLDEsMSwwLDAsMywxLDIsMSwwLDAsMCwwLAowLDMsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsCjMsMywzLDIsMiwzLDIsMiwyLDMsMiwxLDEsMywzLDAsMywwLDAsMCwwLDEsMCwwLDMsMSwxLDIsMCwwLDAsMSwKMSwwLDAsMSwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLAoxLDEsMSwzLDMsMCwzLDMsMywzLDMsMiwyLDIsMSwyLDAsMiwxLDIsMiwxLDEsMCwxLDIsMiwyLDIsMiwyLDIsCjAsMCwyLDEsMiwxLDIsMSwwLDEsMSwzLDEsMiwxLDEsMiwwLDAsMiwwLDEsMCwxLDAsMSwwLDAsMCwxLDAsMSwKMywzLDMsMSwzLDMsMywwLDEsMSwwLDIsMiwzLDEsMCwzLDAsMCwwLDEsMCwwLDAsMSwwLDAsMSwwLDEsMCwwLAoxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywyLDAsMCwyLDIsMSwwLDAsMSwwLDAsMywzLDEsMywwLDAsMSwxLDAsMiwwLDMsMCwwLDAsMiwwLDEsMSwKMCwxLDIsMCwxLDIsMiwwLDIsMiwyLDIsMSwwLDIsMSwxLDAsMiwwLDIsMSwyLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMywxLDMsMiwzLDIsMCwyLDIsMiwxLDMsMiwwLDIsMSwyLDAsMSwyLDAsMCwxLDAsMiwyLDAsMCwwLDIsCjEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwxLDAsMSwwLDAsMCwKMywzLDMsMCwzLDMsMSwxLDIsMywxLDAsMywyLDMsMCwzLDAsMCwwLDEsMCwwLDAsMSwwLDEsMCwwLDAsMCwwLAoxLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDMsMywwLDMsMywyLDMsMywyLDIsMCwwLDAsMCwxLDIsMCwxLDMsMCwwLDAsMywxLDEsMCwzLDAsMiwKMiwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMywxLDIsMiwxLDAsMywxLDEsMSwxLDMsMywyLDMsMCwwLDEsMCwxLDIsMCwyLDIsMCwyLDIsMCwyLDEsCjAsMiwyLDEsMSwxLDEsMCwyLDEsMSwwLDEsMSwxLDEsMiwxLDIsMSwyLDAsMSwwLDEsMCwwLDAsMCwwLDAsMCwKMywzLDMsMCwxLDEsMywwLDAsMSwxLDAsMCwyLDIsMCwzLDAsMCwxLDEsMCwxLDAsMCwwLDAsMCwyLDAsMCwwLAowLDMsMSwwLDEsMCwxLDAsMiwwLDAsMSwwLDEsMCwxLDEsMSwyLDEsMSwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywzLDAsMiwwLDIsMCwxLDEsMSwwLDAsMywzLDAsMiwwLDAsMSwwLDAsMiwxLDEsMCwxLDAsMSwwLDEsMCwKMCwyLDAsMSwyLDAsMiwwLDIsMSwxLDAsMSwwLDIsMSwxLDAsMiwxLDEsMCwxLDAsMCwwLDEsMSwwLDAsMCwwLAozLDIsMywwLDEsMCwwLDAsMCwwLDAsMCwwLDEsMiwwLDEsMCwwLDEsMCwwLDEsMCwwLDAsMCwwLDIsMCwwLDAsCjAsMCwxLDEsMCwwLDEsMCwxLDAsMCwxLDAsMCwwLDIsMSwwLDEsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDMsMCwwLDIsMywwLDAsMSwwLDEsMCwyLDMsMiwzLDAsMCwxLDMsMCwyLDEsMCwwLDAsMCwyLDAsMSwwLAowLDIsMSwwLDAsMSwxLDAsMiwxLDAsMCwxLDAsMCwxLDEsMCwxLDEsMiwwLDEsMCwwLDAsMCwxLDAsMCwwLDAsCjMsMiwyLDAsMCwxLDEsMCwwLDAsMCwwLDAsMywxLDEsMSwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMiwwLDEsMCwKMCwxLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDEsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwzLDMsMCwyLDMsMiwyLDEsMiwyLDEsMSwyLDAsMSwzLDIsMiwyLDAsMCwyLDIsMCwwLDAsMSwyLDEsCjMsMCwyLDEsMSwwLDEsMSwxLDAsMSwyLDIsMiwxLDEsMiwwLDAsMCwwLDEsMCwxLDEsMCwwLDAsMCwwLDAsMCwKMCwxLDEsMiwzLDAsMywzLDMsMiwyLDIsMiwxLDAsMSwwLDEsMCwxLDIsMiwwLDAsMiwyLDEsMywxLDEsMiwxLAowLDAsMSwxLDIsMCwxLDEsMCwwLDEsMiwwLDIsMSwxLDIsMCwwLDEsMCwwLDAsMSwwLDEsMCwxLDAsMCwwLDAsCjMsMywyLDAsMCwzLDEsMCwwLDAsMCwwLDAsMywyLDEsMiwwLDAsMSwwLDAsMiwwLDAsMCwwLDAsMiwwLDEsMCwKMCwyLDEsMSwwLDAsMSwwLDEsMiwwLDAsMSwxLDAsMCwyLDEsMSwxLDEsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMiwwLDAsMSwwLDAsMCwwLDEsMCwwLDMsMywyLDIsMCwwLDEsMCwwLDIsMCwxLDAsMCwwLDIsMCwxLDAsCjAsMCwxLDEsMCwwLDIsMCwyLDEsMCwwLDEsMSwyLDEsMiwwLDIsMSwyLDEsMSwxLDAsMCwxLDEsMCwwLDAsMCwKMywzLDIsMCwwLDIsMiwwLDAsMCwxLDEsMCwyLDIsMSwzLDEsMCwxLDAsMSwyLDAsMCwwLDAsMCwxLDAsMSwwLAowLDEsMSwwLDAsMCwwLDAsMSwwLDAsMSwwLDAsMCwxLDEsMCwxLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywzLDIsMCwwLDAsMSwwLDAsMSwwLDAsMiwzLDEsMiwwLDAsMSwwLDAsMiwwLDAsMCwxLDAsMiwwLDIsMCwKMCwxLDEsMiwyLDEsMiwwLDIsMSwxLDAsMCwxLDEsMCwxLDEsMSwxLDIsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMywwLDIsMSwyLDEsMCwwLDEsMSwwLDMsMywxLDIsMCwwLDEsMCwwLDIsMCwyLDAsMSwxLDIsMCwwLDAsCjAsMCwxLDEsMSwxLDIsMCwxLDEsMCwxLDEsMSwxLDAsMCwwLDEsMSwxLDAsMSwwLDAsMCwxLDAsMCwwLDAsMCwKMywzLDMsMCwyLDIsMywyLDAsMCwxLDAsMCwyLDMsMSwwLDAsMCwwLDAsMCwyLDAsMiwwLDAsMCwyLDAsMCwwLAowLDEsMSwwLDAsMCwxLDAsMCwxLDAsMSwxLDAsMSwwLDEsMSwxLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMiwzLDAsMCwwLDAsMCwwLDAsMSwwLDAsMiwyLDIsMiwwLDAsMSwwLDAsMiwwLDAsMCwwLDAsMiwwLDEsMCwKMCwwLDIsMSwxLDAsMSwwLDIsMSwxLDAsMCwxLDEsMiwxLDAsMiwwLDIsMCwxLDAsMCwwLDIsMCwwLDAsMCwwLAowLDAsMCwyLDIsMCwyLDEsMSwxLDEsMiwyLDAsMCwxLDAsMSwwLDAsMSwzLDAsMCwwLDAsMSwwLDAsMiwxLDAsCjAsMCwxLDAsMSwwLDAsMCwwLDAsMiwxLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwKMiwwLDAsMiwzLDAsMiwzLDEsMiwyLDAsMiwwLDAsMiwwLDIsMSwxLDEsMiwxLDAsMCwxLDIsMSwxLDIsMSwwLAoxLDAsMiwwLDEsMCwxLDEsMCwwLDIsMiwxLDIsMSwxLDIsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywzLDAsMiwxLDIsMCwwLDAsMSwwLDAsMywyLDAsMSwwLDAsMSwwLDAsMiwwLDAsMCwxLDIsMSwwLDEsMCwKMCwwLDAsMCwxLDAsMSwwLDAsMSwwLDAsMCwwLDEsMCwxLDAsMSwxLDEsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwyLDIsMCwyLDIsMSwxLDAsMSwxLDEsMSwxLDAsMCwxLDIsMSwxLDEsMCwxLDAsMCwwLDEsMSwxLDEsCjAsMCwyLDEsMCwxLDEsMSwwLDEsMSwyLDEsMiwxLDEsMiwwLDEsMSwyLDEsMCwyLDAsMCwwLDAsMCwwLDAsMCwKMywyLDIsMCwwLDIsMCwwLDAsMCwwLDAsMCwyLDIsMCwyLDAsMCwxLDAsMCwyLDAsMCwwLDAsMCwyLDAsMCwwLAowLDIsMSwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMSwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDMsMiwwLDIsMiwwLDEsMSwwLDEsMCwwLDEsMCwwLDAsMSwwLDEsMCwwLDAsMCwwLDEsMCwwLDAsMCwKMiwwLDEsMCwxLDAsMSwxLDAsMCwxLDIsMCwxLDAsMSwxLDAsMCwxLDAsMSwwLDIsMCwwLDAsMCwwLDAsMCwwLAoyLDIsMiwwLDEsMSwwLDAsMCwxLDAsMCwwLDEsMiwwLDEsMCwwLDEsMCwwLDEsMCwwLDAsMCwxLDIsMCwxLDAsCjAsMCwxLDAsMCwwLDEsMCwwLDEsMCwwLDAsMCwwLDAsMSwwLDEsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMiwyLDIsMiwxLDAsMSwxLDEsMCwwLDAsMCwxLDIsMCwwLDEsMCwwLDAsMSwwLDAsMSwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsCjEsMSwyLDAsMSwwLDAsMCwxLDAsMSwwLDAsMCwxLDAsMCwxLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwxLAowLDAsMSwyLDIsMCwyLDEsMiwxLDEsMiwyLDAsMCwwLDAsMSwwLDAsMSwxLDAsMCwyLDAsMCwwLDAsMSwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwKMiwyLDIsMCwwLDAsMSwwLDAsMCwwLDAsMCwyLDIsMSwxLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDEsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDEsMSwwLDAsMCwxLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwxLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoyLDIsMiwwLDEsMCwxLDAsMCwwLDAsMCwwLDEsMSwwLDAsMCwwLDAsMCwwLDEsMCwxLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwxLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAopCgpMYXRpbjVUdXJraXNoTW9kZWwgPSB7CiAgJ2NoYXJfdG9fb3JkZXJfbWFwJzogTGF0aW41X1R1cmtpc2hDaGFyVG9PcmRlck1hcCwKICAncHJlY2VkZW5jZV9tYXRyaXgnOiBUdXJraXNoTGFuZ01vZGVsLAogICd0eXBpY2FsX3Bvc2l0aXZlX3JhdGlvJzogMC45NzAyOTAsCiAgJ2tlZXBfZW5nbGlzaF9sZXR0ZXInOiBUcnVlLAogICdjaGFyc2V0X25hbWUnOiAiSVNPLTg4NTktOSIsCiAgJ2xhbmd1YWdlJzogJ1R1cmtpc2gnLAp9ClBLAwQUAAAAAAAAACEA5OzwpPoUAAD6FAAAQAAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9sYXRpbjFwcm9iZXIucHkjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQkVHSU4gTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBUaGUgT3JpZ2luYWwgQ29kZSBpcyBNb3ppbGxhIFVuaXZlcnNhbCBjaGFyc2V0IGRldGVjdG9yIGNvZGUuCiMKIyBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKIyBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi4KIyBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDAxCiMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgojCiMgQ29udHJpYnV0b3Iocyk6CiMgICBNYXJrIFBpbGdyaW0gLSBwb3J0IHRvIFB5dGhvbgojICAgU2h5IFNoYWxvbSAtIG9yaWdpbmFsIEMgY29kZQojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKIyAwMjExMC0xMzAxICBVU0EKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFTkQgTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpmcm9tIC5jaGFyc2V0cHJvYmVyIGltcG9ydCBDaGFyU2V0UHJvYmVyCmZyb20gLmVudW1zIGltcG9ydCBQcm9iaW5nU3RhdGUKCkZSRVFfQ0FUX05VTSA9IDQKClVERiA9IDAgICMgdW5kZWZpbmVkCk9USCA9IDEgICMgb3RoZXIKQVNDID0gMiAgIyBhc2NpaSBjYXBpdGFsIGxldHRlcgpBU1MgPSAzICAjIGFzY2lpIHNtYWxsIGxldHRlcgpBQ1YgPSA0ICAjIGFjY2VudCBjYXBpdGFsIHZvd2VsCkFDTyA9IDUgICMgYWNjZW50IGNhcGl0YWwgb3RoZXIKQVNWID0gNiAgIyBhY2NlbnQgc21hbGwgdm93ZWwKQVNPID0gNyAgIyBhY2NlbnQgc21hbGwgb3RoZXIKQ0xBU1NfTlVNID0gOCAgIyB0b3RhbCBjbGFzc2VzCgpMYXRpbjFfQ2hhclRvQ2xhc3MgPSAoCiAgICBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgICAjIDAwIC0gMDcKICAgIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCAgICMgMDggLSAwRgogICAgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsICAgIyAxMCAtIDE3CiAgICBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgICAjIDE4IC0gMUYKICAgIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCAgICMgMjAgLSAyNwogICAgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsICAgIyAyOCAtIDJGCiAgICBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgICAjIDMwIC0gMzcKICAgIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCAgICMgMzggLSAzRgogICAgT1RILCBBU0MsIEFTQywgQVNDLCBBU0MsIEFTQywgQVNDLCBBU0MsICAgIyA0MCAtIDQ3CiAgICBBU0MsIEFTQywgQVNDLCBBU0MsIEFTQywgQVNDLCBBU0MsIEFTQywgICAjIDQ4IC0gNEYKICAgIEFTQywgQVNDLCBBU0MsIEFTQywgQVNDLCBBU0MsIEFTQywgQVNDLCAgICMgNTAgLSA1NwogICAgQVNDLCBBU0MsIEFTQywgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsICAgIyA1OCAtIDVGCiAgICBPVEgsIEFTUywgQVNTLCBBU1MsIEFTUywgQVNTLCBBU1MsIEFTUywgICAjIDYwIC0gNjcKICAgIEFTUywgQVNTLCBBU1MsIEFTUywgQVNTLCBBU1MsIEFTUywgQVNTLCAgICMgNjggLSA2RgogICAgQVNTLCBBU1MsIEFTUywgQVNTLCBBU1MsIEFTUywgQVNTLCBBU1MsICAgIyA3MCAtIDc3CiAgICBBU1MsIEFTUywgQVNTLCBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgICAjIDc4IC0gN0YKICAgIE9USCwgVURGLCBPVEgsIEFTTywgT1RILCBPVEgsIE9USCwgT1RILCAgICMgODAgLSA4NwogICAgT1RILCBPVEgsIEFDTywgT1RILCBBQ08sIFVERiwgQUNPLCBVREYsICAgIyA4OCAtIDhGCiAgICBVREYsIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgICAjIDkwIC0gOTcKICAgIE9USCwgT1RILCBBU08sIE9USCwgQVNPLCBVREYsIEFTTywgQUNPLCAgICMgOTggLSA5RgogICAgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsICAgIyBBMCAtIEE3CiAgICBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgICAjIEE4IC0gQUYKICAgIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCAgICMgQjAgLSBCNwogICAgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsICAgIyBCOCAtIEJGCiAgICBBQ1YsIEFDViwgQUNWLCBBQ1YsIEFDViwgQUNWLCBBQ08sIEFDTywgICAjIEMwIC0gQzcKICAgIEFDViwgQUNWLCBBQ1YsIEFDViwgQUNWLCBBQ1YsIEFDViwgQUNWLCAgICMgQzggLSBDRgogICAgQUNPLCBBQ08sIEFDViwgQUNWLCBBQ1YsIEFDViwgQUNWLCBPVEgsICAgIyBEMCAtIEQ3CiAgICBBQ1YsIEFDViwgQUNWLCBBQ1YsIEFDViwgQUNPLCBBQ08sIEFDTywgICAjIEQ4IC0gREYKICAgIEFTViwgQVNWLCBBU1YsIEFTViwgQVNWLCBBU1YsIEFTTywgQVNPLCAgICMgRTAgLSBFNwogICAgQVNWLCBBU1YsIEFTViwgQVNWLCBBU1YsIEFTViwgQVNWLCBBU1YsICAgIyBFOCAtIEVGCiAgICBBU08sIEFTTywgQVNWLCBBU1YsIEFTViwgQVNWLCBBU1YsIE9USCwgICAjIEYwIC0gRjcKICAgIEFTViwgQVNWLCBBU1YsIEFTViwgQVNWLCBBU08sIEFTTywgQVNPLCAgICMgRjggLSBGRgopCgojIDAgOiBpbGxlZ2FsCiMgMSA6IHZlcnkgdW5saWtlbHkKIyAyIDogbm9ybWFsCiMgMyA6IHZlcnkgbGlrZWx5CkxhdGluMUNsYXNzTW9kZWwgPSAoCiMgVURGIE9USCBBU0MgQVNTIEFDViBBQ08gQVNWIEFTTwogICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAjIFVERgogICAgMCwgIDMsICAzLCAgMywgIDMsICAzLCAgMywgIDMsICAjIE9USAogICAgMCwgIDMsICAzLCAgMywgIDMsICAzLCAgMywgIDMsICAjIEFTQwogICAgMCwgIDMsICAzLCAgMywgIDEsICAxLCAgMywgIDMsICAjIEFTUwogICAgMCwgIDMsICAzLCAgMywgIDEsICAyLCAgMSwgIDIsICAjIEFDVgogICAgMCwgIDMsICAzLCAgMywgIDMsICAzLCAgMywgIDMsICAjIEFDTwogICAgMCwgIDMsICAxLCAgMywgIDEsICAxLCAgMSwgIDMsICAjIEFTVgogICAgMCwgIDMsICAxLCAgMywgIDEsICAxLCAgMywgIDMsICAjIEFTTwopCgoKY2xhc3MgTGF0aW4xUHJvYmVyKENoYXJTZXRQcm9iZXIpOgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHN1cGVyKExhdGluMVByb2Jlciwgc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYuX2xhc3RfY2hhcl9jbGFzcyA9IE5vbmUKICAgICAgICBzZWxmLl9mcmVxX2NvdW50ZXIgPSBOb25lCiAgICAgICAgc2VsZi5yZXNldCgpCgogICAgZGVmIHJlc2V0KHNlbGYpOgogICAgICAgIHNlbGYuX2xhc3RfY2hhcl9jbGFzcyA9IE9USAogICAgICAgIHNlbGYuX2ZyZXFfY291bnRlciA9IFswXSAqIEZSRVFfQ0FUX05VTQogICAgICAgIENoYXJTZXRQcm9iZXIucmVzZXQoc2VsZikKCiAgICBAcHJvcGVydHkKICAgIGRlZiBjaGFyc2V0X25hbWUoc2VsZik6CiAgICAgICAgcmV0dXJuICJJU08tODg1OS0xIgoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGxhbmd1YWdlKHNlbGYpOgogICAgICAgIHJldHVybiAiIgoKICAgIGRlZiBmZWVkKHNlbGYsIGJ5dGVfc3RyKToKICAgICAgICBieXRlX3N0ciA9IHNlbGYuZmlsdGVyX3dpdGhfZW5nbGlzaF9sZXR0ZXJzKGJ5dGVfc3RyKQogICAgICAgIGZvciBjIGluIGJ5dGVfc3RyOgogICAgICAgICAgICBjaGFyX2NsYXNzID0gTGF0aW4xX0NoYXJUb0NsYXNzW2NdCiAgICAgICAgICAgIGZyZXEgPSBMYXRpbjFDbGFzc01vZGVsWyhzZWxmLl9sYXN0X2NoYXJfY2xhc3MgKiBDTEFTU19OVU0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY2hhcl9jbGFzc10KICAgICAgICAgICAgaWYgZnJlcSA9PSAwOgogICAgICAgICAgICAgICAgc2VsZi5fc3RhdGUgPSBQcm9iaW5nU3RhdGUuTk9UX01FCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBzZWxmLl9mcmVxX2NvdW50ZXJbZnJlcV0gKz0gMQogICAgICAgICAgICBzZWxmLl9sYXN0X2NoYXJfY2xhc3MgPSBjaGFyX2NsYXNzCgogICAgICAgIHJldHVybiBzZWxmLnN0YXRlCgogICAgZGVmIGdldF9jb25maWRlbmNlKHNlbGYpOgogICAgICAgIGlmIHNlbGYuc3RhdGUgPT0gUHJvYmluZ1N0YXRlLk5PVF9NRToKICAgICAgICAgICAgcmV0dXJuIDAuMDEKCiAgICAgICAgdG90YWwgPSBzdW0oc2VsZi5fZnJlcV9jb3VudGVyKQogICAgICAgIGlmIHRvdGFsIDwgMC4wMToKICAgICAgICAgICAgY29uZmlkZW5jZSA9IDAuMAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGNvbmZpZGVuY2UgPSAoKHNlbGYuX2ZyZXFfY291bnRlclszXSAtIHNlbGYuX2ZyZXFfY291bnRlclsxXSAqIDIwLjApCiAgICAgICAgICAgICAgICAgICAgICAgICAgLyB0b3RhbCkKICAgICAgICBpZiBjb25maWRlbmNlIDwgMC4wOgogICAgICAgICAgICBjb25maWRlbmNlID0gMC4wCiAgICAgICAgIyBsb3dlciB0aGUgY29uZmlkZW5jZSBvZiBsYXRpbjEgc28gdGhhdCBvdGhlciBtb3JlIGFjY3VyYXRlCiAgICAgICAgIyBkZXRlY3RvciBjYW4gdGFrZSBwcmlvcml0eS4KICAgICAgICBjb25maWRlbmNlID0gY29uZmlkZW5jZSAqIDAuNzMKICAgICAgICByZXR1cm4gY29uZmlkZW5jZQpQSwMEFAAAAAAAAAAhADZ1GE1VDQAAVQ0AAEMAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvbWJjaGFyc2V0cHJvYmVyLnB5IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEJFR0lOIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgVGhlIE9yaWdpbmFsIENvZGUgaXMgTW96aWxsYSBVbml2ZXJzYWwgY2hhcnNldCBkZXRlY3RvciBjb2RlLgojCiMgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiMgTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24uCiMgUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAwMQojIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIwojIENvbnRyaWJ1dG9yKHMpOgojICAgTWFyayBQaWxncmltIC0gcG9ydCB0byBQeXRob24KIyAgIFNoeSBTaGFsb20gLSBvcmlnaW5hbCBDIGNvZGUKIyAgIFByb29mcG9pbnQsIEluYy4KIwojIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCiMgMDIxMTAtMTMwMSAgVVNBCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRU5EIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKZnJvbSAuY2hhcnNldHByb2JlciBpbXBvcnQgQ2hhclNldFByb2Jlcgpmcm9tIC5lbnVtcyBpbXBvcnQgUHJvYmluZ1N0YXRlLCBNYWNoaW5lU3RhdGUKCgpjbGFzcyBNdWx0aUJ5dGVDaGFyU2V0UHJvYmVyKENoYXJTZXRQcm9iZXIpOgogICAgIiIiCiAgICBNdWx0aUJ5dGVDaGFyU2V0UHJvYmVyCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbGFuZ19maWx0ZXI9Tm9uZSk6CiAgICAgICAgc3VwZXIoTXVsdGlCeXRlQ2hhclNldFByb2Jlciwgc2VsZikuX19pbml0X18obGFuZ19maWx0ZXI9bGFuZ19maWx0ZXIpCiAgICAgICAgc2VsZi5kaXN0cmlidXRpb25fYW5hbHl6ZXIgPSBOb25lCiAgICAgICAgc2VsZi5jb2Rpbmdfc20gPSBOb25lCiAgICAgICAgc2VsZi5fbGFzdF9jaGFyID0gWzAsIDBdCgogICAgZGVmIHJlc2V0KHNlbGYpOgogICAgICAgIHN1cGVyKE11bHRpQnl0ZUNoYXJTZXRQcm9iZXIsIHNlbGYpLnJlc2V0KCkKICAgICAgICBpZiBzZWxmLmNvZGluZ19zbToKICAgICAgICAgICAgc2VsZi5jb2Rpbmdfc20ucmVzZXQoKQogICAgICAgIGlmIHNlbGYuZGlzdHJpYnV0aW9uX2FuYWx5emVyOgogICAgICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbl9hbmFseXplci5yZXNldCgpCiAgICAgICAgc2VsZi5fbGFzdF9jaGFyID0gWzAsIDBdCgogICAgQHByb3BlcnR5CiAgICBkZWYgY2hhcnNldF9uYW1lKHNlbGYpOgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKCiAgICBAcHJvcGVydHkKICAgIGRlZiBsYW5ndWFnZShzZWxmKToKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCgogICAgZGVmIGZlZWQoc2VsZiwgYnl0ZV9zdHIpOgogICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihieXRlX3N0cikpOgogICAgICAgICAgICBjb2Rpbmdfc3RhdGUgPSBzZWxmLmNvZGluZ19zbS5uZXh0X3N0YXRlKGJ5dGVfc3RyW2ldKQogICAgICAgICAgICBpZiBjb2Rpbmdfc3RhdGUgPT0gTWFjaGluZVN0YXRlLkVSUk9SOgogICAgICAgICAgICAgICAgc2VsZi5sb2dnZXIuZGVidWcoJyVzICVzIHByb2JlciBoaXQgZXJyb3IgYXQgYnl0ZSAlcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNoYXJzZXRfbmFtZSwgc2VsZi5sYW5ndWFnZSwgaSkKICAgICAgICAgICAgICAgIHNlbGYuX3N0YXRlID0gUHJvYmluZ1N0YXRlLk5PVF9NRQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgZWxpZiBjb2Rpbmdfc3RhdGUgPT0gTWFjaGluZVN0YXRlLklUU19NRToKICAgICAgICAgICAgICAgIHNlbGYuX3N0YXRlID0gUHJvYmluZ1N0YXRlLkZPVU5EX0lUCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBlbGlmIGNvZGluZ19zdGF0ZSA9PSBNYWNoaW5lU3RhdGUuU1RBUlQ6CiAgICAgICAgICAgICAgICBjaGFyX2xlbiA9IHNlbGYuY29kaW5nX3NtLmdldF9jdXJyZW50X2NoYXJsZW4oKQogICAgICAgICAgICAgICAgaWYgaSA9PSAwOgogICAgICAgICAgICAgICAgICAgIHNlbGYuX2xhc3RfY2hhclsxXSA9IGJ5dGVfc3RyWzBdCiAgICAgICAgICAgICAgICAgICAgc2VsZi5kaXN0cmlidXRpb25fYW5hbHl6ZXIuZmVlZChzZWxmLl9sYXN0X2NoYXIsIGNoYXJfbGVuKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbl9hbmFseXplci5mZWVkKGJ5dGVfc3RyW2kgLSAxOmkgKyAxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJfbGVuKQoKICAgICAgICBzZWxmLl9sYXN0X2NoYXJbMF0gPSBieXRlX3N0clstMV0KCiAgICAgICAgaWYgc2VsZi5zdGF0ZSA9PSBQcm9iaW5nU3RhdGUuREVURUNUSU5HOgogICAgICAgICAgICBpZiAoc2VsZi5kaXN0cmlidXRpb25fYW5hbHl6ZXIuZ290X2Vub3VnaF9kYXRhKCkgYW5kCiAgICAgICAgICAgICAgICAgICAgKHNlbGYuZ2V0X2NvbmZpZGVuY2UoKSA+IHNlbGYuU0hPUlRDVVRfVEhSRVNIT0xEKSk6CiAgICAgICAgICAgICAgICBzZWxmLl9zdGF0ZSA9IFByb2JpbmdTdGF0ZS5GT1VORF9JVAoKICAgICAgICByZXR1cm4gc2VsZi5zdGF0ZQoKICAgIGRlZiBnZXRfY29uZmlkZW5jZShzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5kaXN0cmlidXRpb25fYW5hbHl6ZXIuZ2V0X2NvbmZpZGVuY2UoKQpQSwMEFAAAAAAAAAAhAK3TEajcBwAA3AcAAEMAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvbWJjc2dyb3VwcHJvYmVyLnB5IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEJFR0lOIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgVGhlIE9yaWdpbmFsIENvZGUgaXMgTW96aWxsYSBVbml2ZXJzYWwgY2hhcnNldCBkZXRlY3RvciBjb2RlLgojCiMgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiMgTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24uCiMgUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAwMQojIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIwojIENvbnRyaWJ1dG9yKHMpOgojICAgTWFyayBQaWxncmltIC0gcG9ydCB0byBQeXRob24KIyAgIFNoeSBTaGFsb20gLSBvcmlnaW5hbCBDIGNvZGUKIyAgIFByb29mcG9pbnQsIEluYy4KIwojIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCiMgMDIxMTAtMTMwMSAgVVNBCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRU5EIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKZnJvbSAuY2hhcnNldGdyb3VwcHJvYmVyIGltcG9ydCBDaGFyU2V0R3JvdXBQcm9iZXIKZnJvbSAudXRmOHByb2JlciBpbXBvcnQgVVRGOFByb2Jlcgpmcm9tIC5zamlzcHJvYmVyIGltcG9ydCBTSklTUHJvYmVyCmZyb20gLmV1Y2pwcHJvYmVyIGltcG9ydCBFVUNKUFByb2Jlcgpmcm9tIC5nYjIzMTJwcm9iZXIgaW1wb3J0IEdCMjMxMlByb2Jlcgpmcm9tIC5ldWNrcnByb2JlciBpbXBvcnQgRVVDS1JQcm9iZXIKZnJvbSAuY3A5NDlwcm9iZXIgaW1wb3J0IENQOTQ5UHJvYmVyCmZyb20gLmJpZzVwcm9iZXIgaW1wb3J0IEJpZzVQcm9iZXIKZnJvbSAuZXVjdHdwcm9iZXIgaW1wb3J0IEVVQ1RXUHJvYmVyCgoKY2xhc3MgTUJDU0dyb3VwUHJvYmVyKENoYXJTZXRHcm91cFByb2Jlcik6CiAgICBkZWYgX19pbml0X18oc2VsZiwgbGFuZ19maWx0ZXI9Tm9uZSk6CiAgICAgICAgc3VwZXIoTUJDU0dyb3VwUHJvYmVyLCBzZWxmKS5fX2luaXRfXyhsYW5nX2ZpbHRlcj1sYW5nX2ZpbHRlcikKICAgICAgICBzZWxmLnByb2JlcnMgPSBbCiAgICAgICAgICAgIFVURjhQcm9iZXIoKSwKICAgICAgICAgICAgU0pJU1Byb2JlcigpLAogICAgICAgICAgICBFVUNKUFByb2JlcigpLAogICAgICAgICAgICBHQjIzMTJQcm9iZXIoKSwKICAgICAgICAgICAgRVVDS1JQcm9iZXIoKSwKICAgICAgICAgICAgQ1A5NDlQcm9iZXIoKSwKICAgICAgICAgICAgQmlnNVByb2JlcigpLAogICAgICAgICAgICBFVUNUV1Byb2JlcigpCiAgICAgICAgXQogICAgICAgIHNlbGYucmVzZXQoKQpQSwMEFAAAAAAAAAAhAGn24Q+JYwAAiWMAADoAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvbWJjc3NtLnB5IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEJFR0lOIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgVGhlIE9yaWdpbmFsIENvZGUgaXMgbW96aWxsYS5vcmcgY29kZS4KIwojIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwojIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uLgojIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDE5OTgKIyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiMKIyBDb250cmlidXRvcihzKToKIyAgIE1hcmsgUGlsZ3JpbSAtIHBvcnQgdG8gUHl0aG9uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgojIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQojIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQojIDAyMTEwLTEzMDEgIFVTQQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVORCBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCmZyb20gLmVudW1zIGltcG9ydCBNYWNoaW5lU3RhdGUKCiMgQklHNQoKQklHNV9DTFMgPSAoCiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDAwIC0gMDcgICAgI2FsbG93IDB4MDAgYXMgbGVnYWwgdmFsdWUKICAgIDEsMSwxLDEsMSwxLDAsMCwgICMgMDggLSAwZgogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyAxMCAtIDE3CiAgICAxLDEsMSwwLDEsMSwxLDEsICAjIDE4IC0gMWYKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgMjAgLSAyNwogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyAyOCAtIDJmCiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDMwIC0gMzcKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgMzggLSAzZgogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyA0MCAtIDQ3CiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIDQ4IC0gNGYKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgNTAgLSA1NwogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyA1OCAtIDVmCiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIDYwIC0gNjcKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgNjggLSA2ZgogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyA3MCAtIDc3CiAgICAyLDIsMiwyLDIsMiwyLDEsICAjIDc4IC0gN2YKICAgIDQsNCw0LDQsNCw0LDQsNCwgICMgODAgLSA4NwogICAgNCw0LDQsNCw0LDQsNCw0LCAgIyA4OCAtIDhmCiAgICA0LDQsNCw0LDQsNCw0LDQsICAjIDkwIC0gOTcKICAgIDQsNCw0LDQsNCw0LDQsNCwgICMgOTggLSA5ZgogICAgNCwzLDMsMywzLDMsMywzLCAgIyBhMCAtIGE3CiAgICAzLDMsMywzLDMsMywzLDMsICAjIGE4IC0gYWYKICAgIDMsMywzLDMsMywzLDMsMywgICMgYjAgLSBiNwogICAgMywzLDMsMywzLDMsMywzLCAgIyBiOCAtIGJmCiAgICAzLDMsMywzLDMsMywzLDMsICAjIGMwIC0gYzcKICAgIDMsMywzLDMsMywzLDMsMywgICMgYzggLSBjZgogICAgMywzLDMsMywzLDMsMywzLCAgIyBkMCAtIGQ3CiAgICAzLDMsMywzLDMsMywzLDMsICAjIGQ4IC0gZGYKICAgIDMsMywzLDMsMywzLDMsMywgICMgZTAgLSBlNwogICAgMywzLDMsMywzLDMsMywzLCAgIyBlOCAtIGVmCiAgICAzLDMsMywzLDMsMywzLDMsICAjIGYwIC0gZjcKICAgIDMsMywzLDMsMywzLDMsMCAgIyBmOCAtIGZmCikKCkJJRzVfU1QgPSAoCiAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCwgICAgIDMsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCMwMC0wNwogICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLkVSUk9SLCMwOC0wZgogICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCMxMC0xNwopCgpCSUc1X0NIQVJfTEVOX1RBQkxFID0gKDAsIDEsIDEsIDIsIDApCgpCSUc1X1NNX01PREVMID0geydjbGFzc190YWJsZSc6IEJJRzVfQ0xTLAogICAgICAgICAgICAgICAgICdjbGFzc19mYWN0b3InOiA1LAogICAgICAgICAgICAgICAgICdzdGF0ZV90YWJsZSc6IEJJRzVfU1QsCiAgICAgICAgICAgICAgICAgJ2NoYXJfbGVuX3RhYmxlJzogQklHNV9DSEFSX0xFTl9UQUJMRSwKICAgICAgICAgICAgICAgICAnbmFtZSc6ICdCaWc1J30KCiMgQ1A5NDkKCkNQOTQ5X0NMUyAgPSAoCiAgICAxLDEsMSwxLDEsMSwxLDEsIDEsMSwxLDEsMSwxLDAsMCwgICMgMDAgLSAwZgogICAgMSwxLDEsMSwxLDEsMSwxLCAxLDEsMSwwLDEsMSwxLDEsICAjIDEwIC0gMWYKICAgIDEsMSwxLDEsMSwxLDEsMSwgMSwxLDEsMSwxLDEsMSwxLCAgIyAyMCAtIDJmCiAgICAxLDEsMSwxLDEsMSwxLDEsIDEsMSwxLDEsMSwxLDEsMSwgICMgMzAgLSAzZgogICAgMSw0LDQsNCw0LDQsNCw0LCA0LDQsNCw0LDQsNCw0LDQsICAjIDQwIC0gNGYKICAgIDQsNCw1LDUsNSw1LDUsNSwgNSw1LDUsMSwxLDEsMSwxLCAgIyA1MCAtIDVmCiAgICAxLDUsNSw1LDUsNSw1LDUsIDUsNSw1LDUsNSw1LDUsNSwgICMgNjAgLSA2ZgogICAgNSw1LDUsNSw1LDUsNSw1LCA1LDUsNSwxLDEsMSwxLDEsICAjIDcwIC0gN2YKICAgIDAsNiw2LDYsNiw2LDYsNiwgNiw2LDYsNiw2LDYsNiw2LCAgIyA4MCAtIDhmCiAgICA2LDYsNiw2LDYsNiw2LDYsIDYsNiw2LDYsNiw2LDYsNiwgICMgOTAgLSA5ZgogICAgNiw3LDcsNyw3LDcsNyw3LCA3LDcsNyw3LDcsOCw4LDgsICAjIGEwIC0gYWYKICAgIDcsNyw3LDcsNyw3LDcsNywgNyw3LDcsNyw3LDcsNyw3LCAgIyBiMCAtIGJmCiAgICA3LDcsNyw3LDcsNyw5LDIsIDIsMywyLDIsMiwyLDIsMiwgICMgYzAgLSBjZgogICAgMiwyLDIsMiwyLDIsMiwyLCAyLDIsMiwyLDIsMiwyLDIsICAjIGQwIC0gZGYKICAgIDIsMiwyLDIsMiwyLDIsMiwgMiwyLDIsMiwyLDIsMiwyLCAgIyBlMCAtIGVmCiAgICAyLDIsMiwyLDIsMiwyLDIsIDIsMiwyLDIsMiwyLDIsMCwgICMgZjAgLSBmZgopCgpDUDk0OV9TVCA9ICgKI2Nscz0gICAgMCAgICAgIDEgICAgICAyICAgICAgMyAgICAgIDQgICAgICA1ICAgICAgNiAgICAgIDcgICAgICA4ICAgICAgOSAgIyBwcmV2aW91cyBzdGF0ZSA9CiAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLlNUQVJULCAgICAgMyxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCwgICAgIDQsICAgICA1LE1hY2hpbmVTdGF0ZS5FUlJPUiwgICAgIDYsICMgTWFjaGluZVN0YXRlLlNUQVJUCiAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsICMgTWFjaGluZVN0YXRlLkVSUk9SCiAgICBNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLCAjIE1hY2hpbmVTdGF0ZS5JVFNfTUUKICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCwgIyAzCiAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsICMgNAogICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULCAjIDUKICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCwgIyA2CikKCkNQOTQ5X0NIQVJfTEVOX1RBQkxFID0gKDAsIDEsIDIsIDAsIDEsIDEsIDIsIDIsIDAsIDIpCgpDUDk0OV9TTV9NT0RFTCA9IHsnY2xhc3NfdGFibGUnOiBDUDk0OV9DTFMsCiAgICAgICAgICAgICAgICAgICdjbGFzc19mYWN0b3InOiAxMCwKICAgICAgICAgICAgICAgICAgJ3N0YXRlX3RhYmxlJzogQ1A5NDlfU1QsCiAgICAgICAgICAgICAgICAgICdjaGFyX2xlbl90YWJsZSc6IENQOTQ5X0NIQVJfTEVOX1RBQkxFLAogICAgICAgICAgICAgICAgICAnbmFtZSc6ICdDUDk0OSd9CgojIEVVQy1KUAoKRVVDSlBfQ0xTID0gKAogICAgNCw0LDQsNCw0LDQsNCw0LCAgIyAwMCAtIDA3CiAgICA0LDQsNCw0LDQsNCw1LDUsICAjIDA4IC0gMGYKICAgIDQsNCw0LDQsNCw0LDQsNCwgICMgMTAgLSAxNwogICAgNCw0LDQsNSw0LDQsNCw0LCAgIyAxOCAtIDFmCiAgICA0LDQsNCw0LDQsNCw0LDQsICAjIDIwIC0gMjcKICAgIDQsNCw0LDQsNCw0LDQsNCwgICMgMjggLSAyZgogICAgNCw0LDQsNCw0LDQsNCw0LCAgIyAzMCAtIDM3CiAgICA0LDQsNCw0LDQsNCw0LDQsICAjIDM4IC0gM2YKICAgIDQsNCw0LDQsNCw0LDQsNCwgICMgNDAgLSA0NwogICAgNCw0LDQsNCw0LDQsNCw0LCAgIyA0OCAtIDRmCiAgICA0LDQsNCw0LDQsNCw0LDQsICAjIDUwIC0gNTcKICAgIDQsNCw0LDQsNCw0LDQsNCwgICMgNTggLSA1ZgogICAgNCw0LDQsNCw0LDQsNCw0LCAgIyA2MCAtIDY3CiAgICA0LDQsNCw0LDQsNCw0LDQsICAjIDY4IC0gNmYKICAgIDQsNCw0LDQsNCw0LDQsNCwgICMgNzAgLSA3NwogICAgNCw0LDQsNCw0LDQsNCw0LCAgIyA3OCAtIDdmCiAgICA1LDUsNSw1LDUsNSw1LDUsICAjIDgwIC0gODcKICAgIDUsNSw1LDUsNSw1LDEsMywgICMgODggLSA4ZgogICAgNSw1LDUsNSw1LDUsNSw1LCAgIyA5MCAtIDk3CiAgICA1LDUsNSw1LDUsNSw1LDUsICAjIDk4IC0gOWYKICAgIDUsMiwyLDIsMiwyLDIsMiwgICMgYTAgLSBhNwogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyBhOCAtIGFmCiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIGIwIC0gYjcKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgYjggLSBiZgogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyBjMCAtIGM3CiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIGM4IC0gY2YKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgZDAgLSBkNwogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyBkOCAtIGRmCiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIGUwIC0gZTcKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgZTggLSBlZgogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyBmMCAtIGY3CiAgICAwLDAsMCwwLDAsMCwwLDUgICMgZjggLSBmZgopCgpFVUNKUF9TVCA9ICgKICAgICAgICAgIDMsICAgICA0LCAgICAgMywgICAgIDUsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCMwMC0wNwogICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLCMwOC0wZgogICAgIE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjMTAtMTcKICAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwgICAgIDMsTWFjaGluZVN0YXRlLkVSUk9SLCMxOC0xZgogICAgICAgICAgMyxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQjMjAtMjcKKQoKRVVDSlBfQ0hBUl9MRU5fVEFCTEUgPSAoMiwgMiwgMiwgMywgMSwgMCkKCkVVQ0pQX1NNX01PREVMID0geydjbGFzc190YWJsZSc6IEVVQ0pQX0NMUywKICAgICAgICAgICAgICAgICAgJ2NsYXNzX2ZhY3Rvcic6IDYsCiAgICAgICAgICAgICAgICAgICdzdGF0ZV90YWJsZSc6IEVVQ0pQX1NULAogICAgICAgICAgICAgICAgICAnY2hhcl9sZW5fdGFibGUnOiBFVUNKUF9DSEFSX0xFTl9UQUJMRSwKICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnRVVDLUpQJ30KCiMgRVVDLUtSCgpFVUNLUl9DTFMgID0gKAogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyAwMCAtIDA3CiAgICAxLDEsMSwxLDEsMSwwLDAsICAjIDA4IC0gMGYKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgMTAgLSAxNwogICAgMSwxLDEsMCwxLDEsMSwxLCAgIyAxOCAtIDFmCiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDIwIC0gMjcKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgMjggLSAyZgogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyAzMCAtIDM3CiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDM4IC0gM2YKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgNDAgLSA0NwogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyA0OCAtIDRmCiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDUwIC0gNTcKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgNTggLSA1ZgogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyA2MCAtIDY3CiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDY4IC0gNmYKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgNzAgLSA3NwogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyA3OCAtIDdmCiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIDgwIC0gODcKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgODggLSA4ZgogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyA5MCAtIDk3CiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIDk4IC0gOWYKICAgIDAsMiwyLDIsMiwyLDIsMiwgICMgYTAgLSBhNwogICAgMiwyLDIsMiwyLDMsMywzLCAgIyBhOCAtIGFmCiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIGIwIC0gYjcKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgYjggLSBiZgogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyBjMCAtIGM3CiAgICAyLDMsMiwyLDIsMiwyLDIsICAjIGM4IC0gY2YKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgZDAgLSBkNwogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyBkOCAtIGRmCiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIGUwIC0gZTcKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgZTggLSBlZgogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyBmMCAtIGY3CiAgICAyLDIsMiwyLDIsMiwyLDAgICAjIGY4IC0gZmYKKQoKRVVDS1JfU1QgPSAoCiAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLlNUQVJULCAgICAgMyxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCMwMC0wNwogICAgTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQgIzA4LTBmCikKCkVVQ0tSX0NIQVJfTEVOX1RBQkxFID0gKDAsIDEsIDIsIDApCgpFVUNLUl9TTV9NT0RFTCA9IHsnY2xhc3NfdGFibGUnOiBFVUNLUl9DTFMsCiAgICAgICAgICAgICAgICAnY2xhc3NfZmFjdG9yJzogNCwKICAgICAgICAgICAgICAgICdzdGF0ZV90YWJsZSc6IEVVQ0tSX1NULAogICAgICAgICAgICAgICAgJ2NoYXJfbGVuX3RhYmxlJzogRVVDS1JfQ0hBUl9MRU5fVEFCTEUsCiAgICAgICAgICAgICAgICAnbmFtZSc6ICdFVUMtS1InfQoKIyBFVUMtVFcKCkVVQ1RXX0NMUyA9ICgKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgMDAgLSAwNwogICAgMiwyLDIsMiwyLDIsMCwwLCAgIyAwOCAtIDBmCiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIDEwIC0gMTcKICAgIDIsMiwyLDAsMiwyLDIsMiwgICMgMTggLSAxZgogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyAyMCAtIDI3CiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIDI4IC0gMmYKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgMzAgLSAzNwogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyAzOCAtIDNmCiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIDQwIC0gNDcKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgNDggLSA0ZgogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyA1MCAtIDU3CiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIDU4IC0gNWYKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgNjAgLSA2NwogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyA2OCAtIDZmCiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIDcwIC0gNzcKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgNzggLSA3ZgogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyA4MCAtIDg3CiAgICAwLDAsMCwwLDAsMCw2LDAsICAjIDg4IC0gOGYKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgOTAgLSA5NwogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyA5OCAtIDlmCiAgICAwLDMsNCw0LDQsNCw0LDQsICAjIGEwIC0gYTcKICAgIDUsNSwxLDEsMSwxLDEsMSwgICMgYTggLSBhZgogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyBiMCAtIGI3CiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIGI4IC0gYmYKICAgIDEsMSwzLDEsMywzLDMsMywgICMgYzAgLSBjNwogICAgMywzLDMsMywzLDMsMywzLCAgIyBjOCAtIGNmCiAgICAzLDMsMywzLDMsMywzLDMsICAjIGQwIC0gZDcKICAgIDMsMywzLDMsMywzLDMsMywgICMgZDggLSBkZgogICAgMywzLDMsMywzLDMsMywzLCAgIyBlMCAtIGU3CiAgICAzLDMsMywzLDMsMywzLDMsICAjIGU4IC0gZWYKICAgIDMsMywzLDMsMywzLDMsMywgICMgZjAgLSBmNwogICAgMywzLDMsMywzLDMsMywwICAgIyBmOCAtIGZmCikKCkVVQ1RXX1NUID0gKAogICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuU1RBUlQsICAgICAzLCAgICAgMywgICAgIDMsICAgICA0LE1hY2hpbmVTdGF0ZS5FUlJPUiwjMDAtMDcKICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSwjMDgtMGYKICAgIE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5FUlJPUiwjMTAtMTcKICAgIE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsIzE4LTFmCiAgICAgICAgIDUsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULCMyMC0yNwogICAgTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCAjMjgtMmYKKQoKRVVDVFdfQ0hBUl9MRU5fVEFCTEUgPSAoMCwgMCwgMSwgMiwgMiwgMiwgMykKCkVVQ1RXX1NNX01PREVMID0geydjbGFzc190YWJsZSc6IEVVQ1RXX0NMUywKICAgICAgICAgICAgICAgICdjbGFzc19mYWN0b3InOiA3LAogICAgICAgICAgICAgICAgJ3N0YXRlX3RhYmxlJzogRVVDVFdfU1QsCiAgICAgICAgICAgICAgICAnY2hhcl9sZW5fdGFibGUnOiBFVUNUV19DSEFSX0xFTl9UQUJMRSwKICAgICAgICAgICAgICAgICduYW1lJzogJ3gtZXVjLXR3J30KCiMgR0IyMzEyCgpHQjIzMTJfQ0xTID0gKAogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyAwMCAtIDA3CiAgICAxLDEsMSwxLDEsMSwwLDAsICAjIDA4IC0gMGYKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgMTAgLSAxNwogICAgMSwxLDEsMCwxLDEsMSwxLCAgIyAxOCAtIDFmCiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDIwIC0gMjcKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgMjggLSAyZgogICAgMywzLDMsMywzLDMsMywzLCAgIyAzMCAtIDM3CiAgICAzLDMsMSwxLDEsMSwxLDEsICAjIDM4IC0gM2YKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgNDAgLSA0NwogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyA0OCAtIDRmCiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIDUwIC0gNTcKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgNTggLSA1ZgogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyA2MCAtIDY3CiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIDY4IC0gNmYKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgNzAgLSA3NwogICAgMiwyLDIsMiwyLDIsMiw0LCAgIyA3OCAtIDdmCiAgICA1LDYsNiw2LDYsNiw2LDYsICAjIDgwIC0gODcKICAgIDYsNiw2LDYsNiw2LDYsNiwgICMgODggLSA4ZgogICAgNiw2LDYsNiw2LDYsNiw2LCAgIyA5MCAtIDk3CiAgICA2LDYsNiw2LDYsNiw2LDYsICAjIDk4IC0gOWYKICAgIDYsNiw2LDYsNiw2LDYsNiwgICMgYTAgLSBhNwogICAgNiw2LDYsNiw2LDYsNiw2LCAgIyBhOCAtIGFmCiAgICA2LDYsNiw2LDYsNiw2LDYsICAjIGIwIC0gYjcKICAgIDYsNiw2LDYsNiw2LDYsNiwgICMgYjggLSBiZgogICAgNiw2LDYsNiw2LDYsNiw2LCAgIyBjMCAtIGM3CiAgICA2LDYsNiw2LDYsNiw2LDYsICAjIGM4IC0gY2YKICAgIDYsNiw2LDYsNiw2LDYsNiwgICMgZDAgLSBkNwogICAgNiw2LDYsNiw2LDYsNiw2LCAgIyBkOCAtIGRmCiAgICA2LDYsNiw2LDYsNiw2LDYsICAjIGUwIC0gZTcKICAgIDYsNiw2LDYsNiw2LDYsNiwgICMgZTggLSBlZgogICAgNiw2LDYsNiw2LDYsNiw2LCAgIyBmMCAtIGY3CiAgICA2LDYsNiw2LDYsNiw2LDAgICAjIGY4IC0gZmYKKQoKR0IyMzEyX1NUID0gKAogICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsICAgICAzLE1hY2hpbmVTdGF0ZS5FUlJPUiwjMDAtMDcKICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSwjMDgtMGYKICAgIE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5TVEFSVCwjMTAtMTcKICAgICAgICAgNCxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsIzE4LTFmCiAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCAgICAgNSxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5FUlJPUiwjMjAtMjcKICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQgIzI4LTJmCikKCiMgVG8gYmUgYWNjdXJhdGUsIHRoZSBsZW5ndGggb2YgY2xhc3MgNiBjYW4gYmUgZWl0aGVyIDIgb3IgNC4KIyBCdXQgaXQgaXMgbm90IG5lY2Vzc2FyeSB0byBkaXNjcmltaW5hdGUgYmV0d2VlbiB0aGUgdHdvIHNpbmNlCiMgaXQgaXMgdXNlZCBmb3IgZnJlcXVlbmN5IGFuYWx5c2lzIG9ubHksIGFuZCB3ZSBhcmUgdmFsaWRhdGluZwojIGVhY2ggY29kZSByYW5nZSB0aGVyZSBhcyB3ZWxsLiBTbyBpdCBpcyBzYWZlIHRvIHNldCBpdCB0byBiZQojIDIgaGVyZS4KR0IyMzEyX0NIQVJfTEVOX1RBQkxFID0gKDAsIDEsIDEsIDEsIDEsIDEsIDIpCgpHQjIzMTJfU01fTU9ERUwgPSB7J2NsYXNzX3RhYmxlJzogR0IyMzEyX0NMUywKICAgICAgICAgICAgICAgICAgICdjbGFzc19mYWN0b3InOiA3LAogICAgICAgICAgICAgICAgICAgJ3N0YXRlX3RhYmxlJzogR0IyMzEyX1NULAogICAgICAgICAgICAgICAgICAgJ2NoYXJfbGVuX3RhYmxlJzogR0IyMzEyX0NIQVJfTEVOX1RBQkxFLAogICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnR0IyMzEyJ30KCiMgU2hpZnRfSklTCgpTSklTX0NMUyA9ICgKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgMDAgLSAwNwogICAgMSwxLDEsMSwxLDEsMCwwLCAgIyAwOCAtIDBmCiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDEwIC0gMTcKICAgIDEsMSwxLDAsMSwxLDEsMSwgICMgMTggLSAxZgogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyAyMCAtIDI3CiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDI4IC0gMmYKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgMzAgLSAzNwogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyAzOCAtIDNmCiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIDQwIC0gNDcKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgNDggLSA0ZgogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyA1MCAtIDU3CiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIDU4IC0gNWYKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgNjAgLSA2NwogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyA2OCAtIDZmCiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIDcwIC0gNzcKICAgIDIsMiwyLDIsMiwyLDIsMSwgICMgNzggLSA3ZgogICAgMywzLDMsMywzLDIsMiwzLCAgIyA4MCAtIDg3CiAgICAzLDMsMywzLDMsMywzLDMsICAjIDg4IC0gOGYKICAgIDMsMywzLDMsMywzLDMsMywgICMgOTAgLSA5NwogICAgMywzLDMsMywzLDMsMywzLCAgIyA5OCAtIDlmCiAgICAjMHhhMCBpcyBpbGxlZ2FsIGluIHNqaXMgZW5jb2RpbmcsIGJ1dCBzb21lIHBhZ2VzIGRvZXMKICAgICNjb250YWluIHN1Y2ggYnl0ZS4gV2UgbmVlZCB0byBiZSBtb3JlIGVycm9yIGZvcmdpdmVuLgogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyBhMCAtIGE3CiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIGE4IC0gYWYKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgYjAgLSBiNwogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyBiOCAtIGJmCiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIGMwIC0gYzcKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgYzggLSBjZgogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyBkMCAtIGQ3CiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIGQ4IC0gZGYKICAgIDMsMywzLDMsMywzLDMsMywgICMgZTAgLSBlNwogICAgMywzLDMsMywzLDQsNCw0LCAgIyBlOCAtIGVmCiAgICAzLDMsMywzLDMsMywzLDMsICAjIGYwIC0gZjcKICAgIDMsMywzLDMsMywwLDAsMCkgICMgZjggLSBmZgoKClNKSVNfU1QgPSAoCiAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCwgICAgIDMsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCMwMC0wNwogICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsIzA4LTBmCiAgICBNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQgIzEwLTE3CikKClNKSVNfQ0hBUl9MRU5fVEFCTEUgPSAoMCwgMSwgMSwgMiwgMCwgMCkKClNKSVNfU01fTU9ERUwgPSB7J2NsYXNzX3RhYmxlJzogU0pJU19DTFMsCiAgICAgICAgICAgICAgICdjbGFzc19mYWN0b3InOiA2LAogICAgICAgICAgICAgICAnc3RhdGVfdGFibGUnOiBTSklTX1NULAogICAgICAgICAgICAgICAnY2hhcl9sZW5fdGFibGUnOiBTSklTX0NIQVJfTEVOX1RBQkxFLAogICAgICAgICAgICAgICAnbmFtZSc6ICdTaGlmdF9KSVMnfQoKIyBVQ1MyLUJFCgpVQ1MyQkVfQ0xTID0gKAogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyAwMCAtIDA3CiAgICAwLDAsMSwwLDAsMiwwLDAsICAjIDA4IC0gMGYKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgMTAgLSAxNwogICAgMCwwLDAsMywwLDAsMCwwLCAgIyAxOCAtIDFmCiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIDIwIC0gMjcKICAgIDAsMywzLDMsMywzLDAsMCwgICMgMjggLSAyZgogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyAzMCAtIDM3CiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIDM4IC0gM2YKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgNDAgLSA0NwogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyA0OCAtIDRmCiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIDUwIC0gNTcKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgNTggLSA1ZgogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyA2MCAtIDY3CiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIDY4IC0gNmYKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgNzAgLSA3NwogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyA3OCAtIDdmCiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIDgwIC0gODcKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgODggLSA4ZgogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyA5MCAtIDk3CiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIDk4IC0gOWYKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgYTAgLSBhNwogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyBhOCAtIGFmCiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIGIwIC0gYjcKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgYjggLSBiZgogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyBjMCAtIGM3CiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIGM4IC0gY2YKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgZDAgLSBkNwogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyBkOCAtIGRmCiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIGUwIC0gZTcKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgZTggLSBlZgogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyBmMCAtIGY3CiAgICAwLDAsMCwwLDAsMCw0LDUgICAjIGY4IC0gZmYKKQoKVUNTMkJFX1NUICA9ICgKICAgICAgICAgIDUsICAgICA3LCAgICAgNyxNYWNoaW5lU3RhdGUuRVJST1IsICAgICA0LCAgICAgMyxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCMwMC0wNwogICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLCMwOC0wZgogICAgIE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSwgICAgIDYsICAgICA2LCAgICAgNiwgICAgIDYsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjMTAtMTcKICAgICAgICAgIDYsICAgICA2LCAgICAgNiwgICAgIDYsICAgICA2LE1hY2hpbmVTdGF0ZS5JVFNfTUUsICAgICA2LCAgICAgNiwjMTgtMWYKICAgICAgICAgIDYsICAgICA2LCAgICAgNiwgICAgIDYsICAgICA1LCAgICAgNywgICAgIDcsTWFjaGluZVN0YXRlLkVSUk9SLCMyMC0yNwogICAgICAgICAgNSwgICAgIDgsICAgICA2LCAgICAgNixNYWNoaW5lU3RhdGUuRVJST1IsICAgICA2LCAgICAgNiwgICAgIDYsIzI4LTJmCiAgICAgICAgICA2LCAgICAgNiwgICAgIDYsICAgICA2LE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCAjMzAtMzcKKQoKVUNTMkJFX0NIQVJfTEVOX1RBQkxFID0gKDIsIDIsIDIsIDAsIDIsIDIpCgpVQ1MyQkVfU01fTU9ERUwgPSB7J2NsYXNzX3RhYmxlJzogVUNTMkJFX0NMUywKICAgICAgICAgICAgICAgICAgICdjbGFzc19mYWN0b3InOiA2LAogICAgICAgICAgICAgICAgICAgJ3N0YXRlX3RhYmxlJzogVUNTMkJFX1NULAogICAgICAgICAgICAgICAgICAgJ2NoYXJfbGVuX3RhYmxlJzogVUNTMkJFX0NIQVJfTEVOX1RBQkxFLAogICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnVVRGLTE2QkUnfQoKIyBVQ1MyLUxFCgpVQ1MyTEVfQ0xTID0gKAogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyAwMCAtIDA3CiAgICAwLDAsMSwwLDAsMiwwLDAsICAjIDA4IC0gMGYKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgMTAgLSAxNwogICAgMCwwLDAsMywwLDAsMCwwLCAgIyAxOCAtIDFmCiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIDIwIC0gMjcKICAgIDAsMywzLDMsMywzLDAsMCwgICMgMjggLSAyZgogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyAzMCAtIDM3CiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIDM4IC0gM2YKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgNDAgLSA0NwogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyA0OCAtIDRmCiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIDUwIC0gNTcKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgNTggLSA1ZgogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyA2MCAtIDY3CiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIDY4IC0gNmYKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgNzAgLSA3NwogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyA3OCAtIDdmCiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIDgwIC0gODcKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgODggLSA4ZgogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyA5MCAtIDk3CiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIDk4IC0gOWYKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgYTAgLSBhNwogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyBhOCAtIGFmCiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIGIwIC0gYjcKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgYjggLSBiZgogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyBjMCAtIGM3CiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIGM4IC0gY2YKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgZDAgLSBkNwogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyBkOCAtIGRmCiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIGUwIC0gZTcKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgZTggLSBlZgogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyBmMCAtIGY3CiAgICAwLDAsMCwwLDAsMCw0LDUgICAjIGY4IC0gZmYKKQoKVUNTMkxFX1NUID0gKAogICAgICAgICAgNiwgICAgIDYsICAgICA3LCAgICAgNiwgICAgIDQsICAgICAzLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsIzAwLTA3CiAgICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsIzA4LTBmCiAgICAgTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLCAgICAgNSwgICAgIDUsICAgICA1LE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5FUlJPUiwjMTAtMTcKICAgICAgICAgIDUsICAgICA1LCAgICAgNSxNYWNoaW5lU3RhdGUuRVJST1IsICAgICA1LE1hY2hpbmVTdGF0ZS5FUlJPUiwgICAgIDYsICAgICA2LCMxOC0xZgogICAgICAgICAgNywgICAgIDYsICAgICA4LCAgICAgOCwgICAgIDUsICAgICA1LCAgICAgNSxNYWNoaW5lU3RhdGUuRVJST1IsIzIwLTI3CiAgICAgICAgICA1LCAgICAgNSwgICAgIDUsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsICAgICA1LCAgICAgNSwjMjgtMmYKICAgICAgICAgIDUsICAgICA1LCAgICAgNSxNYWNoaW5lU3RhdGUuRVJST1IsICAgICA1LE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJUICMzMC0zNwopCgpVQ1MyTEVfQ0hBUl9MRU5fVEFCTEUgPSAoMiwgMiwgMiwgMiwgMiwgMikKClVDUzJMRV9TTV9NT0RFTCA9IHsnY2xhc3NfdGFibGUnOiBVQ1MyTEVfQ0xTLAogICAgICAgICAgICAgICAgICdjbGFzc19mYWN0b3InOiA2LAogICAgICAgICAgICAgICAgICdzdGF0ZV90YWJsZSc6IFVDUzJMRV9TVCwKICAgICAgICAgICAgICAgICAnY2hhcl9sZW5fdGFibGUnOiBVQ1MyTEVfQ0hBUl9MRU5fVEFCTEUsCiAgICAgICAgICAgICAgICAgJ25hbWUnOiAnVVRGLTE2TEUnfQoKIyBVVEYtOAoKVVRGOF9DTFMgPSAoCiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDAwIC0gMDcgICNhbGxvdyAweDAwIGFzIGEgbGVnYWwgdmFsdWUKICAgIDEsMSwxLDEsMSwxLDAsMCwgICMgMDggLSAwZgogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyAxMCAtIDE3CiAgICAxLDEsMSwwLDEsMSwxLDEsICAjIDE4IC0gMWYKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgMjAgLSAyNwogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyAyOCAtIDJmCiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDMwIC0gMzcKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgMzggLSAzZgogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyA0MCAtIDQ3CiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDQ4IC0gNGYKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgNTAgLSA1NwogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyA1OCAtIDVmCiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDYwIC0gNjcKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgNjggLSA2ZgogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyA3MCAtIDc3CiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDc4IC0gN2YKICAgIDIsMiwyLDIsMywzLDMsMywgICMgODAgLSA4NwogICAgNCw0LDQsNCw0LDQsNCw0LCAgIyA4OCAtIDhmCiAgICA0LDQsNCw0LDQsNCw0LDQsICAjIDkwIC0gOTcKICAgIDQsNCw0LDQsNCw0LDQsNCwgICMgOTggLSA5ZgogICAgNSw1LDUsNSw1LDUsNSw1LCAgIyBhMCAtIGE3CiAgICA1LDUsNSw1LDUsNSw1LDUsICAjIGE4IC0gYWYKICAgIDUsNSw1LDUsNSw1LDUsNSwgICMgYjAgLSBiNwogICAgNSw1LDUsNSw1LDUsNSw1LCAgIyBiOCAtIGJmCiAgICAwLDAsNiw2LDYsNiw2LDYsICAjIGMwIC0gYzcKICAgIDYsNiw2LDYsNiw2LDYsNiwgICMgYzggLSBjZgogICAgNiw2LDYsNiw2LDYsNiw2LCAgIyBkMCAtIGQ3CiAgICA2LDYsNiw2LDYsNiw2LDYsICAjIGQ4IC0gZGYKICAgIDcsOCw4LDgsOCw4LDgsOCwgICMgZTAgLSBlNwogICAgOCw4LDgsOCw4LDksOCw4LCAgIyBlOCAtIGVmCiAgICAxMCwxMSwxMSwxMSwxMSwxMSwxMSwxMSwgICMgZjAgLSBmNwogICAgMTIsMTMsMTMsMTMsMTQsMTUsMCwwICAgICMgZjggLSBmZgopCgpVVEY4X1NUID0gKAogICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsICAgICAxMiwgICAxMCwjMDAtMDcKICAgICAgICAgOSwgICAgIDExLCAgICAgOCwgICAgIDcsICAgICA2LCAgICAgNSwgICAgIDQsICAgIDMsIzA4LTBmCiAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCMxMC0xNwogICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjMTgtMWYKICAgIE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSwjMjAtMjcKICAgIE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSwjMjgtMmYKICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsICAgICA1LCAgICAgNSwgICAgIDUsICAgICA1LE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsIzMwLTM3CiAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCMzOC0zZgogICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsICAgICA1LCAgICAgNSwgICAgIDUsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjNDAtNDcKICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsIzQ4LTRmCiAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCAgICAgNywgICAgIDcsICAgICA3LCAgICAgNyxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCM1MC01NwogICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjNTgtNWYKICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwgICAgIDcsICAgICA3LE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsIzYwLTY3CiAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCM2OC02ZgogICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwgICAgIDksICAgICA5LCAgICAgOSwgICAgIDksTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjNzAtNzcKICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsIzc4LTdmCiAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCAgICAgOSxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCM4MC04NwogICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjODgtOGYKICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsICAgIDEyLCAgICAxMiwgICAgMTIsICAgIDEyLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsIzkwLTk3CiAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCM5OC05ZgogICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwgICAgMTIsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjYTAtYTcKICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsI2E4LWFmCiAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCAgICAxMiwgICAgMTIsICAgIDEyLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCNiMC1iNwogICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjYjgtYmYKICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsI2MwLWM3CiAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SICNjOC1jZgopCgpVVEY4X0NIQVJfTEVOX1RBQkxFID0gKDAsIDEsIDAsIDAsIDAsIDAsIDIsIDMsIDMsIDMsIDQsIDQsIDUsIDUsIDYsIDYpCgpVVEY4X1NNX01PREVMID0geydjbGFzc190YWJsZSc6IFVURjhfQ0xTLAogICAgICAgICAgICAgICAgICdjbGFzc19mYWN0b3InOiAxNiwKICAgICAgICAgICAgICAgICAnc3RhdGVfdGFibGUnOiBVVEY4X1NULAogICAgICAgICAgICAgICAgICdjaGFyX2xlbl90YWJsZSc6IFVURjhfQ0hBUl9MRU5fVEFCTEUsCiAgICAgICAgICAgICAgICAgJ25hbWUnOiAnVVRGLTgnfQpQSwMEFAAAAAAAAAAhAB517x4ZFgAAGRYAAEMAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvc2JjaGFyc2V0cHJvYmVyLnB5IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEJFR0lOIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgVGhlIE9yaWdpbmFsIENvZGUgaXMgTW96aWxsYSBVbml2ZXJzYWwgY2hhcnNldCBkZXRlY3RvciBjb2RlLgojCiMgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiMgTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24uCiMgUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAwMQojIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIwojIENvbnRyaWJ1dG9yKHMpOgojICAgTWFyayBQaWxncmltIC0gcG9ydCB0byBQeXRob24KIyAgIFNoeSBTaGFsb20gLSBvcmlnaW5hbCBDIGNvZGUKIwojIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCiMgMDIxMTAtMTMwMSAgVVNBCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRU5EIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKZnJvbSAuY2hhcnNldHByb2JlciBpbXBvcnQgQ2hhclNldFByb2Jlcgpmcm9tIC5lbnVtcyBpbXBvcnQgQ2hhcmFjdGVyQ2F0ZWdvcnksIFByb2JpbmdTdGF0ZSwgU2VxdWVuY2VMaWtlbGlob29kCgoKY2xhc3MgU2luZ2xlQnl0ZUNoYXJTZXRQcm9iZXIoQ2hhclNldFByb2Jlcik6CiAgICBTQU1QTEVfU0laRSA9IDY0CiAgICBTQl9FTk9VR0hfUkVMX1RIUkVTSE9MRCA9IDEwMjQgICMgIDAuMjUgKiBTQU1QTEVfU0laRV4yCiAgICBQT1NJVElWRV9TSE9SVENVVF9USFJFU0hPTEQgPSAwLjk1CiAgICBORUdBVElWRV9TSE9SVENVVF9USFJFU0hPTEQgPSAwLjA1CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG1vZGVsLCByZXZlcnNlZD1GYWxzZSwgbmFtZV9wcm9iZXI9Tm9uZSk6CiAgICAgICAgc3VwZXIoU2luZ2xlQnl0ZUNoYXJTZXRQcm9iZXIsIHNlbGYpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLl9tb2RlbCA9IG1vZGVsCiAgICAgICAgIyBUUlVFIGlmIHdlIG5lZWQgdG8gcmV2ZXJzZSBldmVyeSBwYWlyIGluIHRoZSBtb2RlbCBsb29rdXAKICAgICAgICBzZWxmLl9yZXZlcnNlZCA9IHJldmVyc2VkCiAgICAgICAgIyBPcHRpb25hbCBhdXhpbGlhcnkgcHJvYmVyIGZvciBuYW1lIGRlY2lzaW9uCiAgICAgICAgc2VsZi5fbmFtZV9wcm9iZXIgPSBuYW1lX3Byb2JlcgogICAgICAgIHNlbGYuX2xhc3Rfb3JkZXIgPSBOb25lCiAgICAgICAgc2VsZi5fc2VxX2NvdW50ZXJzID0gTm9uZQogICAgICAgIHNlbGYuX3RvdGFsX3NlcXMgPSBOb25lCiAgICAgICAgc2VsZi5fdG90YWxfY2hhciA9IE5vbmUKICAgICAgICBzZWxmLl9mcmVxX2NoYXIgPSBOb25lCiAgICAgICAgc2VsZi5yZXNldCgpCgogICAgZGVmIHJlc2V0KHNlbGYpOgogICAgICAgIHN1cGVyKFNpbmdsZUJ5dGVDaGFyU2V0UHJvYmVyLCBzZWxmKS5yZXNldCgpCiAgICAgICAgIyBjaGFyIG9yZGVyIG9mIGxhc3QgY2hhcmFjdGVyCiAgICAgICAgc2VsZi5fbGFzdF9vcmRlciA9IDI1NQogICAgICAgIHNlbGYuX3NlcV9jb3VudGVycyA9IFswXSAqIFNlcXVlbmNlTGlrZWxpaG9vZC5nZXRfbnVtX2NhdGVnb3JpZXMoKQogICAgICAgIHNlbGYuX3RvdGFsX3NlcXMgPSAwCiAgICAgICAgc2VsZi5fdG90YWxfY2hhciA9IDAKICAgICAgICAjIGNoYXJhY3RlcnMgdGhhdCBmYWxsIGluIG91ciBzYW1wbGluZyByYW5nZQogICAgICAgIHNlbGYuX2ZyZXFfY2hhciA9IDAKCiAgICBAcHJvcGVydHkKICAgIGRlZiBjaGFyc2V0X25hbWUoc2VsZik6CiAgICAgICAgaWYgc2VsZi5fbmFtZV9wcm9iZXI6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9uYW1lX3Byb2Jlci5jaGFyc2V0X25hbWUKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fbW9kZWxbJ2NoYXJzZXRfbmFtZSddCgogICAgQHByb3BlcnR5CiAgICBkZWYgbGFuZ3VhZ2Uoc2VsZik6CiAgICAgICAgaWYgc2VsZi5fbmFtZV9wcm9iZXI6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9uYW1lX3Byb2Jlci5sYW5ndWFnZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9tb2RlbC5nZXQoJ2xhbmd1YWdlJykKCiAgICBkZWYgZmVlZChzZWxmLCBieXRlX3N0cik6CiAgICAgICAgaWYgbm90IHNlbGYuX21vZGVsWydrZWVwX2VuZ2xpc2hfbGV0dGVyJ106CiAgICAgICAgICAgIGJ5dGVfc3RyID0gc2VsZi5maWx0ZXJfaW50ZXJuYXRpb25hbF93b3JkcyhieXRlX3N0cikKICAgICAgICBpZiBub3QgYnl0ZV9zdHI6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnN0YXRlCiAgICAgICAgY2hhcl90b19vcmRlcl9tYXAgPSBzZWxmLl9tb2RlbFsnY2hhcl90b19vcmRlcl9tYXAnXQogICAgICAgIGZvciBpLCBjIGluIGVudW1lcmF0ZShieXRlX3N0cik6CiAgICAgICAgICAgICMgWFhYOiBPcmRlciBpcyBpbiByYW5nZSAxLTY0LCBzbyBvbmUgd291bGQgdGhpbmsgd2Ugd2FudCAwLTYzIGhlcmUsCiAgICAgICAgICAgICMgICAgICBidXQgdGhhdCBsZWFkcyB0byAyNyBtb3JlIHRlc3QgZmFpbHVyZXMgdGhhbiBiZWZvcmUuCiAgICAgICAgICAgIG9yZGVyID0gY2hhcl90b19vcmRlcl9tYXBbY10KICAgICAgICAgICAgIyBYWFg6IFRoaXMgd2FzIFNZTUJPTF9DQVRfT1JERVIgYmVmb3JlLCB3aXRoIGEgdmFsdWUgb2YgMjUwLCBidXQKICAgICAgICAgICAgIyAgICAgIENoYXJhY3RlckNhdGVnb3J5LlNZTUJPTCBpcyBhY3R1YWxseSAyNTMsIHNvIHdlIHVzZSBDT05UUk9MCiAgICAgICAgICAgICMgICAgICB0byBtYWtlIGl0IGNsb3NlciB0byB0aGUgb3JpZ2luYWwgaW50ZW50LiBUaGUgb25seSBkaWZmZXJlbmNlCiAgICAgICAgICAgICMgICAgICBpcyB3aGV0aGVyIG9yIG5vdCB3ZSBjb3VudCBkaWdpdHMgYW5kIGNvbnRyb2wgY2hhcmFjdGVycyBmb3IKICAgICAgICAgICAgIyAgICAgIF90b3RhbF9jaGFyIHB1cnBvc2VzLgogICAgICAgICAgICBpZiBvcmRlciA8IENoYXJhY3RlckNhdGVnb3J5LkNPTlRST0w6CiAgICAgICAgICAgICAgICBzZWxmLl90b3RhbF9jaGFyICs9IDEKICAgICAgICAgICAgaWYgb3JkZXIgPCBzZWxmLlNBTVBMRV9TSVpFOgogICAgICAgICAgICAgICAgc2VsZi5fZnJlcV9jaGFyICs9IDEKICAgICAgICAgICAgICAgIGlmIHNlbGYuX2xhc3Rfb3JkZXIgPCBzZWxmLlNBTVBMRV9TSVpFOgogICAgICAgICAgICAgICAgICAgIHNlbGYuX3RvdGFsX3NlcXMgKz0gMQogICAgICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9yZXZlcnNlZDoKICAgICAgICAgICAgICAgICAgICAgICAgaSA9IChzZWxmLl9sYXN0X29yZGVyICogc2VsZi5TQU1QTEVfU0laRSkgKyBvcmRlcgogICAgICAgICAgICAgICAgICAgICAgICBtb2RlbCA9IHNlbGYuX21vZGVsWydwcmVjZWRlbmNlX21hdHJpeCddW2ldCiAgICAgICAgICAgICAgICAgICAgZWxzZTogICMgcmV2ZXJzZSB0aGUgb3JkZXIgb2YgdGhlIGxldHRlcnMgaW4gdGhlIGxvb2t1cAogICAgICAgICAgICAgICAgICAgICAgICBpID0gKG9yZGVyICogc2VsZi5TQU1QTEVfU0laRSkgKyBzZWxmLl9sYXN0X29yZGVyCiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsID0gc2VsZi5fbW9kZWxbJ3ByZWNlZGVuY2VfbWF0cml4J11baV0KICAgICAgICAgICAgICAgICAgICBzZWxmLl9zZXFfY291bnRlcnNbbW9kZWxdICs9IDEKICAgICAgICAgICAgc2VsZi5fbGFzdF9vcmRlciA9IG9yZGVyCgogICAgICAgIGNoYXJzZXRfbmFtZSA9IHNlbGYuX21vZGVsWydjaGFyc2V0X25hbWUnXQogICAgICAgIGlmIHNlbGYuc3RhdGUgPT0gUHJvYmluZ1N0YXRlLkRFVEVDVElORzoKICAgICAgICAgICAgaWYgc2VsZi5fdG90YWxfc2VxcyA+IHNlbGYuU0JfRU5PVUdIX1JFTF9USFJFU0hPTEQ6CiAgICAgICAgICAgICAgICBjb25maWRlbmNlID0gc2VsZi5nZXRfY29uZmlkZW5jZSgpCiAgICAgICAgICAgICAgICBpZiBjb25maWRlbmNlID4gc2VsZi5QT1NJVElWRV9TSE9SVENVVF9USFJFU0hPTEQ6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2dnZXIuZGVidWcoJyVzIGNvbmZpZGVuY2UgPSAlcywgd2UgaGF2ZSBhIHdpbm5lcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnNldF9uYW1lLCBjb25maWRlbmNlKQogICAgICAgICAgICAgICAgICAgIHNlbGYuX3N0YXRlID0gUHJvYmluZ1N0YXRlLkZPVU5EX0lUCiAgICAgICAgICAgICAgICBlbGlmIGNvbmZpZGVuY2UgPCBzZWxmLk5FR0FUSVZFX1NIT1JUQ1VUX1RIUkVTSE9MRDoKICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZ2dlci5kZWJ1ZygnJXMgY29uZmlkZW5jZSA9ICVzLCBiZWxvdyBuZWdhdGl2ZSAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Nob3J0Y3V0IHRocmVzaGhvbGQgJXMnLCBjaGFyc2V0X25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlkZW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLk5FR0FUSVZFX1NIT1JUQ1VUX1RIUkVTSE9MRCkKICAgICAgICAgICAgICAgICAgICBzZWxmLl9zdGF0ZSA9IFByb2JpbmdTdGF0ZS5OT1RfTUUKCiAgICAgICAgcmV0dXJuIHNlbGYuc3RhdGUKCiAgICBkZWYgZ2V0X2NvbmZpZGVuY2Uoc2VsZik6CiAgICAgICAgciA9IDAuMDEKICAgICAgICBpZiBzZWxmLl90b3RhbF9zZXFzID4gMDoKICAgICAgICAgICAgciA9ICgoMS4wICogc2VsZi5fc2VxX2NvdW50ZXJzW1NlcXVlbmNlTGlrZWxpaG9vZC5QT1NJVElWRV0pIC8KICAgICAgICAgICAgICAgICBzZWxmLl90b3RhbF9zZXFzIC8gc2VsZi5fbW9kZWxbJ3R5cGljYWxfcG9zaXRpdmVfcmF0aW8nXSkKICAgICAgICAgICAgciA9IHIgKiBzZWxmLl9mcmVxX2NoYXIgLyBzZWxmLl90b3RhbF9jaGFyCiAgICAgICAgICAgIGlmIHIgPj0gMS4wOgogICAgICAgICAgICAgICAgciA9IDAuOTkKICAgICAgICByZXR1cm4gcgpQSwMEFAAAAAAAAAAhAIr+T6DaDQAA2g0AAEMAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvc2Jjc2dyb3VwcHJvYmVyLnB5IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEJFR0lOIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgVGhlIE9yaWdpbmFsIENvZGUgaXMgTW96aWxsYSBVbml2ZXJzYWwgY2hhcnNldCBkZXRlY3RvciBjb2RlLgojCiMgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiMgTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24uCiMgUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAwMQojIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIwojIENvbnRyaWJ1dG9yKHMpOgojICAgTWFyayBQaWxncmltIC0gcG9ydCB0byBQeXRob24KIyAgIFNoeSBTaGFsb20gLSBvcmlnaW5hbCBDIGNvZGUKIwojIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCiMgMDIxMTAtMTMwMSAgVVNBCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRU5EIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKZnJvbSAuY2hhcnNldGdyb3VwcHJvYmVyIGltcG9ydCBDaGFyU2V0R3JvdXBQcm9iZXIKZnJvbSAuc2JjaGFyc2V0cHJvYmVyIGltcG9ydCBTaW5nbGVCeXRlQ2hhclNldFByb2Jlcgpmcm9tIC5sYW5nY3lyaWxsaWNtb2RlbCBpbXBvcnQgKFdpbjEyNTFDeXJpbGxpY01vZGVsLCBLb2k4ck1vZGVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExhdGluNUN5cmlsbGljTW9kZWwsIE1hY0N5cmlsbGljTW9kZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWJtODY2TW9kZWwsIElibTg1NU1vZGVsKQpmcm9tIC5sYW5nZ3JlZWttb2RlbCBpbXBvcnQgTGF0aW43R3JlZWtNb2RlbCwgV2luMTI1M0dyZWVrTW9kZWwKZnJvbSAubGFuZ2J1bGdhcmlhbm1vZGVsIGltcG9ydCBMYXRpbjVCdWxnYXJpYW5Nb2RlbCwgV2luMTI1MUJ1bGdhcmlhbk1vZGVsCiMgZnJvbSAubGFuZ2h1bmdhcmlhbm1vZGVsIGltcG9ydCBMYXRpbjJIdW5nYXJpYW5Nb2RlbCwgV2luMTI1MEh1bmdhcmlhbk1vZGVsCmZyb20gLmxhbmd0aGFpbW9kZWwgaW1wb3J0IFRJUzYyMFRoYWlNb2RlbApmcm9tIC5sYW5naGVicmV3bW9kZWwgaW1wb3J0IFdpbjEyNTVIZWJyZXdNb2RlbApmcm9tIC5oZWJyZXdwcm9iZXIgaW1wb3J0IEhlYnJld1Byb2Jlcgpmcm9tIC5sYW5ndHVya2lzaG1vZGVsIGltcG9ydCBMYXRpbjVUdXJraXNoTW9kZWwKCgpjbGFzcyBTQkNTR3JvdXBQcm9iZXIoQ2hhclNldEdyb3VwUHJvYmVyKToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzdXBlcihTQkNTR3JvdXBQcm9iZXIsIHNlbGYpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLnByb2JlcnMgPSBbCiAgICAgICAgICAgIFNpbmdsZUJ5dGVDaGFyU2V0UHJvYmVyKFdpbjEyNTFDeXJpbGxpY01vZGVsKSwKICAgICAgICAgICAgU2luZ2xlQnl0ZUNoYXJTZXRQcm9iZXIoS29pOHJNb2RlbCksCiAgICAgICAgICAgIFNpbmdsZUJ5dGVDaGFyU2V0UHJvYmVyKExhdGluNUN5cmlsbGljTW9kZWwpLAogICAgICAgICAgICBTaW5nbGVCeXRlQ2hhclNldFByb2JlcihNYWNDeXJpbGxpY01vZGVsKSwKICAgICAgICAgICAgU2luZ2xlQnl0ZUNoYXJTZXRQcm9iZXIoSWJtODY2TW9kZWwpLAogICAgICAgICAgICBTaW5nbGVCeXRlQ2hhclNldFByb2JlcihJYm04NTVNb2RlbCksCiAgICAgICAgICAgIFNpbmdsZUJ5dGVDaGFyU2V0UHJvYmVyKExhdGluN0dyZWVrTW9kZWwpLAogICAgICAgICAgICBTaW5nbGVCeXRlQ2hhclNldFByb2JlcihXaW4xMjUzR3JlZWtNb2RlbCksCiAgICAgICAgICAgIFNpbmdsZUJ5dGVDaGFyU2V0UHJvYmVyKExhdGluNUJ1bGdhcmlhbk1vZGVsKSwKICAgICAgICAgICAgU2luZ2xlQnl0ZUNoYXJTZXRQcm9iZXIoV2luMTI1MUJ1bGdhcmlhbk1vZGVsKSwKICAgICAgICAgICAgIyBUT0RPOiBSZXN0b3JlIEh1bmdhcmlhbiBlbmNvZGluZ3MgKGlzby04ODU5LTIgYW5kIHdpbmRvd3MtMTI1MCkKICAgICAgICAgICAgIyAgICAgICBhZnRlciB3ZSByZXRyYWluIG1vZGVsLgogICAgICAgICAgICAjIFNpbmdsZUJ5dGVDaGFyU2V0UHJvYmVyKExhdGluMkh1bmdhcmlhbk1vZGVsKSwKICAgICAgICAgICAgIyBTaW5nbGVCeXRlQ2hhclNldFByb2JlcihXaW4xMjUwSHVuZ2FyaWFuTW9kZWwpLAogICAgICAgICAgICBTaW5nbGVCeXRlQ2hhclNldFByb2JlcihUSVM2MjBUaGFpTW9kZWwpLAogICAgICAgICAgICBTaW5nbGVCeXRlQ2hhclNldFByb2JlcihMYXRpbjVUdXJraXNoTW9kZWwpLAogICAgICAgIF0KICAgICAgICBoZWJyZXdfcHJvYmVyID0gSGVicmV3UHJvYmVyKCkKICAgICAgICBsb2dpY2FsX2hlYnJld19wcm9iZXIgPSBTaW5nbGVCeXRlQ2hhclNldFByb2JlcihXaW4xMjU1SGVicmV3TW9kZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFsc2UsIGhlYnJld19wcm9iZXIpCiAgICAgICAgdmlzdWFsX2hlYnJld19wcm9iZXIgPSBTaW5nbGVCeXRlQ2hhclNldFByb2JlcihXaW4xMjU1SGVicmV3TW9kZWwsIFRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWJyZXdfcHJvYmVyKQogICAgICAgIGhlYnJld19wcm9iZXIuc2V0X21vZGVsX3Byb2JlcnMobG9naWNhbF9oZWJyZXdfcHJvYmVyLCB2aXN1YWxfaGVicmV3X3Byb2JlcikKICAgICAgICBzZWxmLnByb2JlcnMuZXh0ZW5kKFtoZWJyZXdfcHJvYmVyLCBsb2dpY2FsX2hlYnJld19wcm9iZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlzdWFsX2hlYnJld19wcm9iZXJdKQoKICAgICAgICBzZWxmLnJlc2V0KCkKUEsDBBQAAAAAAAAAIQDWkWcyvg4AAL4OAAA+AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L3NqaXNwcm9iZXIucHkjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQkVHSU4gTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBUaGUgT3JpZ2luYWwgQ29kZSBpcyBtb3ppbGxhLm9yZyBjb2RlLgojCiMgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiMgTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24uCiMgUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMTk5OAojIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIwojIENvbnRyaWJ1dG9yKHMpOgojICAgTWFyayBQaWxncmltIC0gcG9ydCB0byBQeXRob24KIwojIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCiMgMDIxMTAtMTMwMSAgVVNBCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRU5EIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKZnJvbSAubWJjaGFyc2V0cHJvYmVyIGltcG9ydCBNdWx0aUJ5dGVDaGFyU2V0UHJvYmVyCmZyb20gLmNvZGluZ3N0YXRlbWFjaGluZSBpbXBvcnQgQ29kaW5nU3RhdGVNYWNoaW5lCmZyb20gLmNoYXJkaXN0cmlidXRpb24gaW1wb3J0IFNKSVNEaXN0cmlidXRpb25BbmFseXNpcwpmcm9tIC5qcGNudHggaW1wb3J0IFNKSVNDb250ZXh0QW5hbHlzaXMKZnJvbSAubWJjc3NtIGltcG9ydCBTSklTX1NNX01PREVMCmZyb20gLmVudW1zIGltcG9ydCBQcm9iaW5nU3RhdGUsIE1hY2hpbmVTdGF0ZQoKCmNsYXNzIFNKSVNQcm9iZXIoTXVsdGlCeXRlQ2hhclNldFByb2Jlcik6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc3VwZXIoU0pJU1Byb2Jlciwgc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYuY29kaW5nX3NtID0gQ29kaW5nU3RhdGVNYWNoaW5lKFNKSVNfU01fTU9ERUwpCiAgICAgICAgc2VsZi5kaXN0cmlidXRpb25fYW5hbHl6ZXIgPSBTSklTRGlzdHJpYnV0aW9uQW5hbHlzaXMoKQogICAgICAgIHNlbGYuY29udGV4dF9hbmFseXplciA9IFNKSVNDb250ZXh0QW5hbHlzaXMoKQogICAgICAgIHNlbGYucmVzZXQoKQoKICAgIGRlZiByZXNldChzZWxmKToKICAgICAgICBzdXBlcihTSklTUHJvYmVyLCBzZWxmKS5yZXNldCgpCiAgICAgICAgc2VsZi5jb250ZXh0X2FuYWx5emVyLnJlc2V0KCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBjaGFyc2V0X25hbWUoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuY29udGV4dF9hbmFseXplci5jaGFyc2V0X25hbWUKCiAgICBAcHJvcGVydHkKICAgIGRlZiBsYW5ndWFnZShzZWxmKToKICAgICAgICByZXR1cm4gIkphcGFuZXNlIgoKICAgIGRlZiBmZWVkKHNlbGYsIGJ5dGVfc3RyKToKICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oYnl0ZV9zdHIpKToKICAgICAgICAgICAgY29kaW5nX3N0YXRlID0gc2VsZi5jb2Rpbmdfc20ubmV4dF9zdGF0ZShieXRlX3N0cltpXSkKICAgICAgICAgICAgaWYgY29kaW5nX3N0YXRlID09IE1hY2hpbmVTdGF0ZS5FUlJPUjoKICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyLmRlYnVnKCclcyAlcyBwcm9iZXIgaGl0IGVycm9yIGF0IGJ5dGUgJXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jaGFyc2V0X25hbWUsIHNlbGYubGFuZ3VhZ2UsIGkpCiAgICAgICAgICAgICAgICBzZWxmLl9zdGF0ZSA9IFByb2JpbmdTdGF0ZS5OT1RfTUUKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGVsaWYgY29kaW5nX3N0YXRlID09IE1hY2hpbmVTdGF0ZS5JVFNfTUU6CiAgICAgICAgICAgICAgICBzZWxmLl9zdGF0ZSA9IFByb2JpbmdTdGF0ZS5GT1VORF9JVAogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgZWxpZiBjb2Rpbmdfc3RhdGUgPT0gTWFjaGluZVN0YXRlLlNUQVJUOgogICAgICAgICAgICAgICAgY2hhcl9sZW4gPSBzZWxmLmNvZGluZ19zbS5nZXRfY3VycmVudF9jaGFybGVuKCkKICAgICAgICAgICAgICAgIGlmIGkgPT0gMDoKICAgICAgICAgICAgICAgICAgICBzZWxmLl9sYXN0X2NoYXJbMV0gPSBieXRlX3N0clswXQogICAgICAgICAgICAgICAgICAgIHNlbGYuY29udGV4dF9hbmFseXplci5mZWVkKHNlbGYuX2xhc3RfY2hhclsyIC0gY2hhcl9sZW46XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyX2xlbikKICAgICAgICAgICAgICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbl9hbmFseXplci5mZWVkKHNlbGYuX2xhc3RfY2hhciwgY2hhcl9sZW4pCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHNlbGYuY29udGV4dF9hbmFseXplci5mZWVkKGJ5dGVfc3RyW2kgKyAxIC0gY2hhcl9sZW46aSArIDMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGNoYXJfbGVuXSwgY2hhcl9sZW4pCiAgICAgICAgICAgICAgICAgICAgc2VsZi5kaXN0cmlidXRpb25fYW5hbHl6ZXIuZmVlZChieXRlX3N0cltpIC0gMTppICsgMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyX2xlbikKCiAgICAgICAgc2VsZi5fbGFzdF9jaGFyWzBdID0gYnl0ZV9zdHJbLTFdCgogICAgICAgIGlmIHNlbGYuc3RhdGUgPT0gUHJvYmluZ1N0YXRlLkRFVEVDVElORzoKICAgICAgICAgICAgaWYgKHNlbGYuY29udGV4dF9hbmFseXplci5nb3RfZW5vdWdoX2RhdGEoKSBhbmQKICAgICAgICAgICAgICAgKHNlbGYuZ2V0X2NvbmZpZGVuY2UoKSA+IHNlbGYuU0hPUlRDVVRfVEhSRVNIT0xEKSk6CiAgICAgICAgICAgICAgICBzZWxmLl9zdGF0ZSA9IFByb2JpbmdTdGF0ZS5GT1VORF9JVAoKICAgICAgICByZXR1cm4gc2VsZi5zdGF0ZQoKICAgIGRlZiBnZXRfY29uZmlkZW5jZShzZWxmKToKICAgICAgICBjb250ZXh0X2NvbmYgPSBzZWxmLmNvbnRleHRfYW5hbHl6ZXIuZ2V0X2NvbmZpZGVuY2UoKQogICAgICAgIGRpc3RyaWJfY29uZiA9IHNlbGYuZGlzdHJpYnV0aW9uX2FuYWx5emVyLmdldF9jb25maWRlbmNlKCkKICAgICAgICByZXR1cm4gbWF4KGNvbnRleHRfY29uZiwgZGlzdHJpYl9jb25mKQpQSwMEFAAAAAAAAAAhAHWARz3FMAAAxTAAAEUAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvdW5pdmVyc2FsZGV0ZWN0b3IucHkjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQkVHSU4gTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBUaGUgT3JpZ2luYWwgQ29kZSBpcyBNb3ppbGxhIFVuaXZlcnNhbCBjaGFyc2V0IGRldGVjdG9yIGNvZGUuCiMKIyBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKIyBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi4KIyBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDAxCiMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgojCiMgQ29udHJpYnV0b3Iocyk6CiMgICBNYXJrIFBpbGdyaW0gLSBwb3J0IHRvIFB5dGhvbgojICAgU2h5IFNoYWxvbSAtIG9yaWdpbmFsIEMgY29kZQojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKIyAwMjExMC0xMzAxICBVU0EKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFTkQgTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiIiIgpNb2R1bGUgY29udGFpbmluZyB0aGUgVW5pdmVyc2FsRGV0ZWN0b3IgZGV0ZWN0b3IgY2xhc3MsIHdoaWNoIGlzIHRoZSBwcmltYXJ5CmNsYXNzIGEgdXNlciBvZiBgYGNoYXJkZXRgYCBzaG91bGQgdXNlLgoKOmF1dGhvcjogTWFyayBQaWxncmltIChpbml0aWFsIHBvcnQgdG8gUHl0aG9uKQo6YXV0aG9yOiBTaHkgU2hhbG9tIChvcmlnaW5hbCBDIGNvZGUpCjphdXRob3I6IERhbiBCbGFuY2hhcmQgKG1ham9yIHJlZmFjdG9yaW5nIGZvciAzLjApCjphdXRob3I6IElhbiBDb3JkYXNjbwoiIiIKCgppbXBvcnQgY29kZWNzCmltcG9ydCBsb2dnaW5nCmltcG9ydCByZQoKZnJvbSAuY2hhcnNldGdyb3VwcHJvYmVyIGltcG9ydCBDaGFyU2V0R3JvdXBQcm9iZXIKZnJvbSAuZW51bXMgaW1wb3J0IElucHV0U3RhdGUsIExhbmd1YWdlRmlsdGVyLCBQcm9iaW5nU3RhdGUKZnJvbSAuZXNjcHJvYmVyIGltcG9ydCBFc2NDaGFyU2V0UHJvYmVyCmZyb20gLmxhdGluMXByb2JlciBpbXBvcnQgTGF0aW4xUHJvYmVyCmZyb20gLm1iY3Nncm91cHByb2JlciBpbXBvcnQgTUJDU0dyb3VwUHJvYmVyCmZyb20gLnNiY3Nncm91cHByb2JlciBpbXBvcnQgU0JDU0dyb3VwUHJvYmVyCgoKY2xhc3MgVW5pdmVyc2FsRGV0ZWN0b3Iob2JqZWN0KToKICAgICIiIgogICAgVGhlIGBgVW5pdmVyc2FsRGV0ZWN0b3JgYCBjbGFzcyB1bmRlcmxpZXMgdGhlIGBgY2hhcmRldC5kZXRlY3RgYCBmdW5jdGlvbgogICAgYW5kIGNvb3JkaW5hdGVzIGFsbCBvZiB0aGUgZGlmZmVyZW50IGNoYXJzZXQgcHJvYmVycy4KCiAgICBUbyBnZXQgYSBgYGRpY3RgYCBjb250YWluaW5nIGFuIGVuY29kaW5nIGFuZCBpdHMgY29uZmlkZW5jZSwgeW91IGNhbiBzaW1wbHkKICAgIHJ1bjoKCiAgICAuLiBjb2RlOjoKCiAgICAgICAgICAgIHUgPSBVbml2ZXJzYWxEZXRlY3RvcigpCiAgICAgICAgICAgIHUuZmVlZChzb21lX2J5dGVzKQogICAgICAgICAgICB1LmNsb3NlKCkKICAgICAgICAgICAgZGV0ZWN0ZWQgPSB1LnJlc3VsdAoKICAgICIiIgoKICAgIE1JTklNVU1fVEhSRVNIT0xEID0gMC4yMAogICAgSElHSF9CWVRFX0RFVEVDVE9SID0gcmUuY29tcGlsZShiJ1tceDgwLVx4RkZdJykKICAgIEVTQ19ERVRFQ1RPUiA9IHJlLmNvbXBpbGUoYicoXDAzM3x+eyknKQogICAgV0lOX0JZVEVfREVURUNUT1IgPSByZS5jb21waWxlKGInW1x4ODAtXHg5Rl0nKQogICAgSVNPX1dJTl9NQVAgPSB7J2lzby04ODU5LTEnOiAnV2luZG93cy0xMjUyJywKICAgICAgICAgICAgICAgICAgICdpc28tODg1OS0yJzogJ1dpbmRvd3MtMTI1MCcsCiAgICAgICAgICAgICAgICAgICAnaXNvLTg4NTktNSc6ICdXaW5kb3dzLTEyNTEnLAogICAgICAgICAgICAgICAgICAgJ2lzby04ODU5LTYnOiAnV2luZG93cy0xMjU2JywKICAgICAgICAgICAgICAgICAgICdpc28tODg1OS03JzogJ1dpbmRvd3MtMTI1MycsCiAgICAgICAgICAgICAgICAgICAnaXNvLTg4NTktOCc6ICdXaW5kb3dzLTEyNTUnLAogICAgICAgICAgICAgICAgICAgJ2lzby04ODU5LTknOiAnV2luZG93cy0xMjU0JywKICAgICAgICAgICAgICAgICAgICdpc28tODg1OS0xMyc6ICdXaW5kb3dzLTEyNTcnfQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsYW5nX2ZpbHRlcj1MYW5ndWFnZUZpbHRlci5BTEwpOgogICAgICAgIHNlbGYuX2VzY19jaGFyc2V0X3Byb2JlciA9IE5vbmUKICAgICAgICBzZWxmLl9jaGFyc2V0X3Byb2JlcnMgPSBbXQogICAgICAgIHNlbGYucmVzdWx0ID0gTm9uZQogICAgICAgIHNlbGYuZG9uZSA9IE5vbmUKICAgICAgICBzZWxmLl9nb3RfZGF0YSA9IE5vbmUKICAgICAgICBzZWxmLl9pbnB1dF9zdGF0ZSA9IE5vbmUKICAgICAgICBzZWxmLl9sYXN0X2NoYXIgPSBOb25lCiAgICAgICAgc2VsZi5sYW5nX2ZpbHRlciA9IGxhbmdfZmlsdGVyCiAgICAgICAgc2VsZi5sb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKICAgICAgICBzZWxmLl9oYXNfd2luX2J5dGVzID0gTm9uZQogICAgICAgIHNlbGYucmVzZXQoKQoKICAgIGRlZiByZXNldChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXNldCB0aGUgVW5pdmVyc2FsRGV0ZWN0b3IgYW5kIGFsbCBvZiBpdHMgcHJvYmVycyBiYWNrIHRvIHRoZWlyCiAgICAgICAgaW5pdGlhbCBzdGF0ZXMuICBUaGlzIGlzIGNhbGxlZCBieSBgYF9faW5pdF9fYGAsIHNvIHlvdSBvbmx5IG5lZWQgdG8KICAgICAgICBjYWxsIHRoaXMgZGlyZWN0bHkgaW4gYmV0d2VlbiBhbmFseXNlcyBvZiBkaWZmZXJlbnQgZG9jdW1lbnRzLgogICAgICAgICIiIgogICAgICAgIHNlbGYucmVzdWx0ID0geydlbmNvZGluZyc6IE5vbmUsICdjb25maWRlbmNlJzogMC4wLCAnbGFuZ3VhZ2UnOiBOb25lfQogICAgICAgIHNlbGYuZG9uZSA9IEZhbHNlCiAgICAgICAgc2VsZi5fZ290X2RhdGEgPSBGYWxzZQogICAgICAgIHNlbGYuX2hhc193aW5fYnl0ZXMgPSBGYWxzZQogICAgICAgIHNlbGYuX2lucHV0X3N0YXRlID0gSW5wdXRTdGF0ZS5QVVJFX0FTQ0lJCiAgICAgICAgc2VsZi5fbGFzdF9jaGFyID0gYicnCiAgICAgICAgaWYgc2VsZi5fZXNjX2NoYXJzZXRfcHJvYmVyOgogICAgICAgICAgICBzZWxmLl9lc2NfY2hhcnNldF9wcm9iZXIucmVzZXQoKQogICAgICAgIGZvciBwcm9iZXIgaW4gc2VsZi5fY2hhcnNldF9wcm9iZXJzOgogICAgICAgICAgICBwcm9iZXIucmVzZXQoKQoKICAgIGRlZiBmZWVkKHNlbGYsIGJ5dGVfc3RyKToKICAgICAgICAiIiIKICAgICAgICBUYWtlcyBhIGNodW5rIG9mIGEgZG9jdW1lbnQgYW5kIGZlZWRzIGl0IHRocm91Z2ggYWxsIG9mIHRoZSByZWxldmFudAogICAgICAgIGNoYXJzZXQgcHJvYmVycy4KCiAgICAgICAgQWZ0ZXIgY2FsbGluZyBgYGZlZWRgYCwgeW91IGNhbiBjaGVjayB0aGUgdmFsdWUgb2YgdGhlIGBgZG9uZWBgCiAgICAgICAgYXR0cmlidXRlIHRvIHNlZSBpZiB5b3UgbmVlZCB0byBjb250aW51ZSBmZWVkaW5nIHRoZQogICAgICAgIGBgVW5pdmVyc2FsRGV0ZWN0b3JgYCBtb3JlIGRhdGEsIG9yIGlmIGl0IGhhcyBtYWRlIGEgcHJlZGljdGlvbgogICAgICAgIChpbiB0aGUgYGByZXN1bHRgYCBhdHRyaWJ1dGUpLgoKICAgICAgICAuLiBub3RlOjoKICAgICAgICAgICBZb3Ugc2hvdWxkIGFsd2F5cyBjYWxsIGBgY2xvc2VgYCB3aGVuIHlvdSdyZSBkb25lIGZlZWRpbmcgaW4geW91cgogICAgICAgICAgIGRvY3VtZW50IGlmIGBgZG9uZWBgIGlzIG5vdCBhbHJlYWR5IGBgVHJ1ZWBgLgogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYuZG9uZToKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGlmIG5vdCBsZW4oYnl0ZV9zdHIpOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoYnl0ZV9zdHIsIGJ5dGVhcnJheSk6CiAgICAgICAgICAgIGJ5dGVfc3RyID0gYnl0ZWFycmF5KGJ5dGVfc3RyKQoKICAgICAgICAjIEZpcnN0IGNoZWNrIGZvciBrbm93biBCT01zLCBzaW5jZSB0aGVzZSBhcmUgZ3VhcmFudGVlZCB0byBiZSBjb3JyZWN0CiAgICAgICAgaWYgbm90IHNlbGYuX2dvdF9kYXRhOgogICAgICAgICAgICAjIElmIHRoZSBkYXRhIHN0YXJ0cyB3aXRoIEJPTSwgd2Uga25vdyBpdCBpcyBVVEYKICAgICAgICAgICAgaWYgYnl0ZV9zdHIuc3RhcnRzd2l0aChjb2RlY3MuQk9NX1VURjgpOgogICAgICAgICAgICAgICAgIyBFRiBCQiBCRiAgVVRGLTggd2l0aCBCT00KICAgICAgICAgICAgICAgIHNlbGYucmVzdWx0ID0geydlbmNvZGluZyc6ICJVVEYtOC1TSUciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmZpZGVuY2UnOiAxLjAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGFuZ3VhZ2UnOiAnJ30KICAgICAgICAgICAgZWxpZiBieXRlX3N0ci5zdGFydHN3aXRoKChjb2RlY3MuQk9NX1VURjMyX0xFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5CT01fVVRGMzJfQkUpKToKICAgICAgICAgICAgICAgICMgRkYgRkUgMDAgMDAgIFVURi0zMiwgbGl0dGxlLWVuZGlhbiBCT00KICAgICAgICAgICAgICAgICMgMDAgMDAgRkUgRkYgIFVURi0zMiwgYmlnLWVuZGlhbiBCT00KICAgICAgICAgICAgICAgIHNlbGYucmVzdWx0ID0geydlbmNvZGluZyc6ICJVVEYtMzIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmZpZGVuY2UnOiAxLjAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGFuZ3VhZ2UnOiAnJ30KICAgICAgICAgICAgZWxpZiBieXRlX3N0ci5zdGFydHN3aXRoKGInXHhGRVx4RkZceDAwXHgwMCcpOgogICAgICAgICAgICAgICAgIyBGRSBGRiAwMCAwMCAgVUNTLTQsIHVudXN1YWwgb2N0ZXQgb3JkZXIgQk9NICgzNDEyKQogICAgICAgICAgICAgICAgc2VsZi5yZXN1bHQgPSB7J2VuY29kaW5nJzogIlgtSVNPLTEwNjQ2LVVDUy00LTM0MTIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmZpZGVuY2UnOiAxLjAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGFuZ3VhZ2UnOiAnJ30KICAgICAgICAgICAgZWxpZiBieXRlX3N0ci5zdGFydHN3aXRoKGInXHgwMFx4MDBceEZGXHhGRScpOgogICAgICAgICAgICAgICAgIyAwMCAwMCBGRiBGRSAgVUNTLTQsIHVudXN1YWwgb2N0ZXQgb3JkZXIgQk9NICgyMTQzKQogICAgICAgICAgICAgICAgc2VsZi5yZXN1bHQgPSB7J2VuY29kaW5nJzogIlgtSVNPLTEwNjQ2LVVDUy00LTIxNDMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmZpZGVuY2UnOiAxLjAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGFuZ3VhZ2UnOiAnJ30KICAgICAgICAgICAgZWxpZiBieXRlX3N0ci5zdGFydHN3aXRoKChjb2RlY3MuQk9NX0xFLCBjb2RlY3MuQk9NX0JFKSk6CiAgICAgICAgICAgICAgICAjIEZGIEZFICBVVEYtMTYsIGxpdHRsZSBlbmRpYW4gQk9NCiAgICAgICAgICAgICAgICAjIEZFIEZGICBVVEYtMTYsIGJpZyBlbmRpYW4gQk9NCiAgICAgICAgICAgICAgICBzZWxmLnJlc3VsdCA9IHsnZW5jb2RpbmcnOiAiVVRGLTE2IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb25maWRlbmNlJzogMS4wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xhbmd1YWdlJzogJyd9CgogICAgICAgICAgICBzZWxmLl9nb3RfZGF0YSA9IFRydWUKICAgICAgICAgICAgaWYgc2VsZi5yZXN1bHRbJ2VuY29kaW5nJ10gaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBzZWxmLmRvbmUgPSBUcnVlCiAgICAgICAgICAgICAgICByZXR1cm4KCiAgICAgICAgIyBJZiBub25lIG9mIHRob3NlIG1hdGNoZWQgYW5kIHdlJ3ZlIG9ubHkgc2VlIEFTQ0lJIHNvIGZhciwgY2hlY2sKICAgICAgICAjIGZvciBoaWdoIGJ5dGVzIGFuZCBlc2NhcGUgc2VxdWVuY2VzCiAgICAgICAgaWYgc2VsZi5faW5wdXRfc3RhdGUgPT0gSW5wdXRTdGF0ZS5QVVJFX0FTQ0lJOgogICAgICAgICAgICBpZiBzZWxmLkhJR0hfQllURV9ERVRFQ1RPUi5zZWFyY2goYnl0ZV9zdHIpOgogICAgICAgICAgICAgICAgc2VsZi5faW5wdXRfc3RhdGUgPSBJbnB1dFN0YXRlLkhJR0hfQllURQogICAgICAgICAgICBlbGlmIHNlbGYuX2lucHV0X3N0YXRlID09IElucHV0U3RhdGUuUFVSRV9BU0NJSSBhbmQgXAogICAgICAgICAgICAgICAgICAgIHNlbGYuRVNDX0RFVEVDVE9SLnNlYXJjaChzZWxmLl9sYXN0X2NoYXIgKyBieXRlX3N0cik6CiAgICAgICAgICAgICAgICBzZWxmLl9pbnB1dF9zdGF0ZSA9IElucHV0U3RhdGUuRVNDX0FTQ0lJCgogICAgICAgIHNlbGYuX2xhc3RfY2hhciA9IGJ5dGVfc3RyWy0xOl0KCiAgICAgICAgIyBJZiB3ZSd2ZSBzZWVuIGVzY2FwZSBzZXF1ZW5jZXMsIHVzZSB0aGUgRXNjQ2hhclNldFByb2Jlciwgd2hpY2gKICAgICAgICAjIHVzZXMgYSBzaW1wbGUgc3RhdGUgbWFjaGluZSB0byBjaGVjayBmb3Iga25vd24gZXNjYXBlIHNlcXVlbmNlcyBpbgogICAgICAgICMgSFogYW5kIElTTy0yMDIyIGVuY29kaW5ncywgc2luY2UgdGhvc2UgYXJlIHRoZSBvbmx5IGVuY29kaW5ncyB0aGF0CiAgICAgICAgIyB1c2Ugc3VjaCBzZXF1ZW5jZXMuCiAgICAgICAgaWYgc2VsZi5faW5wdXRfc3RhdGUgPT0gSW5wdXRTdGF0ZS5FU0NfQVNDSUk6CiAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9lc2NfY2hhcnNldF9wcm9iZXI6CiAgICAgICAgICAgICAgICBzZWxmLl9lc2NfY2hhcnNldF9wcm9iZXIgPSBFc2NDaGFyU2V0UHJvYmVyKHNlbGYubGFuZ19maWx0ZXIpCiAgICAgICAgICAgIGlmIHNlbGYuX2VzY19jaGFyc2V0X3Byb2Jlci5mZWVkKGJ5dGVfc3RyKSA9PSBQcm9iaW5nU3RhdGUuRk9VTkRfSVQ6CiAgICAgICAgICAgICAgICBzZWxmLnJlc3VsdCA9IHsnZW5jb2RpbmcnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZXNjX2NoYXJzZXRfcHJvYmVyLmNoYXJzZXRfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb25maWRlbmNlJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2VzY19jaGFyc2V0X3Byb2Jlci5nZXRfY29uZmlkZW5jZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xhbmd1YWdlJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2VzY19jaGFyc2V0X3Byb2Jlci5sYW5ndWFnZX0KICAgICAgICAgICAgICAgIHNlbGYuZG9uZSA9IFRydWUKICAgICAgICAjIElmIHdlJ3ZlIHNlZW4gaGlnaCBieXRlcyAoaS5lLiwgdGhvc2Ugd2l0aCB2YWx1ZXMgZ3JlYXRlciB0aGFuIDEyNyksCiAgICAgICAgIyB3ZSBuZWVkIHRvIGRvIG1vcmUgY29tcGxpY2F0ZWQgY2hlY2tzIHVzaW5nIGFsbCBvdXIgbXVsdGktYnl0ZSBhbmQKICAgICAgICAjIHNpbmdsZS1ieXRlIHByb2JlcnMgdGhhdCBhcmUgbGVmdC4gIFRoZSBzaW5nbGUtYnl0ZSBwcm9iZXJzCiAgICAgICAgIyB1c2UgY2hhcmFjdGVyIGJpZ3JhbSBkaXN0cmlidXRpb25zIHRvIGRldGVybWluZSB0aGUgZW5jb2RpbmcsIHdoZXJlYXMKICAgICAgICAjIHRoZSBtdWx0aS1ieXRlIHByb2JlcnMgdXNlIGEgY29tYmluYXRpb24gb2YgY2hhcmFjdGVyIHVuaWdyYW0gYW5kCiAgICAgICAgIyBiaWdyYW0gZGlzdHJpYnV0aW9ucy4KICAgICAgICBlbGlmIHNlbGYuX2lucHV0X3N0YXRlID09IElucHV0U3RhdGUuSElHSF9CWVRFOgogICAgICAgICAgICBpZiBub3Qgc2VsZi5fY2hhcnNldF9wcm9iZXJzOgogICAgICAgICAgICAgICAgc2VsZi5fY2hhcnNldF9wcm9iZXJzID0gW01CQ1NHcm91cFByb2JlcihzZWxmLmxhbmdfZmlsdGVyKV0KICAgICAgICAgICAgICAgICMgSWYgd2UncmUgY2hlY2tpbmcgbm9uLUNKSyBlbmNvZGluZ3MsIHVzZSBzaW5nbGUtYnl0ZSBwcm9iZXIKICAgICAgICAgICAgICAgIGlmIHNlbGYubGFuZ19maWx0ZXIgJiBMYW5ndWFnZUZpbHRlci5OT05fQ0pLOgogICAgICAgICAgICAgICAgICAgIHNlbGYuX2NoYXJzZXRfcHJvYmVycy5hcHBlbmQoU0JDU0dyb3VwUHJvYmVyKCkpCiAgICAgICAgICAgICAgICBzZWxmLl9jaGFyc2V0X3Byb2JlcnMuYXBwZW5kKExhdGluMVByb2JlcigpKQogICAgICAgICAgICBmb3IgcHJvYmVyIGluIHNlbGYuX2NoYXJzZXRfcHJvYmVyczoKICAgICAgICAgICAgICAgIGlmIHByb2Jlci5mZWVkKGJ5dGVfc3RyKSA9PSBQcm9iaW5nU3RhdGUuRk9VTkRfSVQ6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXN1bHQgPSB7J2VuY29kaW5nJzogcHJvYmVyLmNoYXJzZXRfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29uZmlkZW5jZSc6IHByb2Jlci5nZXRfY29uZmlkZW5jZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsYW5ndWFnZSc6IHByb2Jlci5sYW5ndWFnZX0KICAgICAgICAgICAgICAgICAgICBzZWxmLmRvbmUgPSBUcnVlCiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgaWYgc2VsZi5XSU5fQllURV9ERVRFQ1RPUi5zZWFyY2goYnl0ZV9zdHIpOgogICAgICAgICAgICAgICAgc2VsZi5faGFzX3dpbl9ieXRlcyA9IFRydWUKCiAgICBkZWYgY2xvc2Uoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgU3RvcCBhbmFseXppbmcgdGhlIGN1cnJlbnQgZG9jdW1lbnQgYW5kIGNvbWUgdXAgd2l0aCBhIGZpbmFsCiAgICAgICAgcHJlZGljdGlvbi4KCiAgICAgICAgOnJldHVybnM6ICBUaGUgYGByZXN1bHRgYCBhdHRyaWJ1dGUsIGEgYGBkaWN0YGAgd2l0aCB0aGUga2V5cwogICAgICAgICAgICAgICAgICAgYGVuY29kaW5nYCwgYGNvbmZpZGVuY2VgLCBhbmQgYGxhbmd1YWdlYC4KICAgICAgICAiIiIKICAgICAgICAjIERvbid0IGJvdGhlciB3aXRoIGNoZWNrcyBpZiB3ZSdyZSBhbHJlYWR5IGRvbmUKICAgICAgICBpZiBzZWxmLmRvbmU6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnJlc3VsdAogICAgICAgIHNlbGYuZG9uZSA9IFRydWUKCiAgICAgICAgaWYgbm90IHNlbGYuX2dvdF9kYXRhOgogICAgICAgICAgICBzZWxmLmxvZ2dlci5kZWJ1Zygnbm8gZGF0YSByZWNlaXZlZCEnKQoKICAgICAgICAjIERlZmF1bHQgdG8gQVNDSUkgaWYgaXQgaXMgYWxsIHdlJ3ZlIHNlZW4gc28gZmFyCiAgICAgICAgZWxpZiBzZWxmLl9pbnB1dF9zdGF0ZSA9PSBJbnB1dFN0YXRlLlBVUkVfQVNDSUk6CiAgICAgICAgICAgIHNlbGYucmVzdWx0ID0geydlbmNvZGluZyc6ICdhc2NpaScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb25maWRlbmNlJzogMS4wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAnbGFuZ3VhZ2UnOiAnJ30KCiAgICAgICAgIyBJZiB3ZSBoYXZlIHNlZW4gbm9uLUFTQ0lJLCByZXR1cm4gdGhlIGJlc3QgdGhhdCBtZXQgTUlOSU1VTV9USFJFU0hPTEQKICAgICAgICBlbGlmIHNlbGYuX2lucHV0X3N0YXRlID09IElucHV0U3RhdGUuSElHSF9CWVRFOgogICAgICAgICAgICBwcm9iZXJfY29uZmlkZW5jZSA9IE5vbmUKICAgICAgICAgICAgbWF4X3Byb2Jlcl9jb25maWRlbmNlID0gMC4wCiAgICAgICAgICAgIG1heF9wcm9iZXIgPSBOb25lCiAgICAgICAgICAgIGZvciBwcm9iZXIgaW4gc2VsZi5fY2hhcnNldF9wcm9iZXJzOgogICAgICAgICAgICAgICAgaWYgbm90IHByb2JlcjoKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgcHJvYmVyX2NvbmZpZGVuY2UgPSBwcm9iZXIuZ2V0X2NvbmZpZGVuY2UoKQogICAgICAgICAgICAgICAgaWYgcHJvYmVyX2NvbmZpZGVuY2UgPiBtYXhfcHJvYmVyX2NvbmZpZGVuY2U6CiAgICAgICAgICAgICAgICAgICAgbWF4X3Byb2Jlcl9jb25maWRlbmNlID0gcHJvYmVyX2NvbmZpZGVuY2UKICAgICAgICAgICAgICAgICAgICBtYXhfcHJvYmVyID0gcHJvYmVyCiAgICAgICAgICAgIGlmIG1heF9wcm9iZXIgYW5kIChtYXhfcHJvYmVyX2NvbmZpZGVuY2UgPiBzZWxmLk1JTklNVU1fVEhSRVNIT0xEKToKICAgICAgICAgICAgICAgIGNoYXJzZXRfbmFtZSA9IG1heF9wcm9iZXIuY2hhcnNldF9uYW1lCiAgICAgICAgICAgICAgICBsb3dlcl9jaGFyc2V0X25hbWUgPSBtYXhfcHJvYmVyLmNoYXJzZXRfbmFtZS5sb3dlcigpCiAgICAgICAgICAgICAgICBjb25maWRlbmNlID0gbWF4X3Byb2Jlci5nZXRfY29uZmlkZW5jZSgpCiAgICAgICAgICAgICAgICAjIFVzZSBXaW5kb3dzIGVuY29kaW5nIG5hbWUgaW5zdGVhZCBvZiBJU08tODg1OSBpZiB3ZSBzYXcgYW55CiAgICAgICAgICAgICAgICAjIGV4dHJhIFdpbmRvd3Mtc3BlY2lmaWMgYnl0ZXMKICAgICAgICAgICAgICAgIGlmIGxvd2VyX2NoYXJzZXRfbmFtZS5zdGFydHN3aXRoKCdpc28tODg1OScpOgogICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuX2hhc193aW5fYnl0ZXM6CiAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzZXRfbmFtZSA9IHNlbGYuSVNPX1dJTl9NQVAuZ2V0KGxvd2VyX2NoYXJzZXRfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnNldF9uYW1lKQogICAgICAgICAgICAgICAgc2VsZi5yZXN1bHQgPSB7J2VuY29kaW5nJzogY2hhcnNldF9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmZpZGVuY2UnOiBjb25maWRlbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xhbmd1YWdlJzogbWF4X3Byb2Jlci5sYW5ndWFnZX0KCiAgICAgICAgIyBMb2cgYWxsIHByb2JlciBjb25maWRlbmNlcyBpZiBub25lIG1ldCBNSU5JTVVNX1RIUkVTSE9MRAogICAgICAgIGlmIHNlbGYubG9nZ2VyLmdldEVmZmVjdGl2ZUxldmVsKCkgPT0gbG9nZ2luZy5ERUJVRzoKICAgICAgICAgICAgaWYgc2VsZi5yZXN1bHRbJ2VuY29kaW5nJ10gaXMgTm9uZToKICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyLmRlYnVnKCdubyBwcm9iZXJzIGhpdCBtaW5pbXVtIHRocmVzaG9sZCcpCiAgICAgICAgICAgICAgICBmb3IgZ3JvdXBfcHJvYmVyIGluIHNlbGYuX2NoYXJzZXRfcHJvYmVyczoKICAgICAgICAgICAgICAgICAgICBpZiBub3QgZ3JvdXBfcHJvYmVyOgogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZ3JvdXBfcHJvYmVyLCBDaGFyU2V0R3JvdXBQcm9iZXIpOgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgcHJvYmVyIGluIGdyb3VwX3Byb2Jlci5wcm9iZXJzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2dnZXIuZGVidWcoJyVzICVzIGNvbmZpZGVuY2UgPSAlcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9iZXIuY2hhcnNldF9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvYmVyLmxhbmd1YWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvYmVyLmdldF9jb25maWRlbmNlKCkpCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2dnZXIuZGVidWcoJyVzICVzIGNvbmZpZGVuY2UgPSAlcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Jlci5jaGFyc2V0X25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Jlci5sYW5ndWFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvYmVyLmdldF9jb25maWRlbmNlKCkpCiAgICAgICAgcmV0dXJuIHNlbGYucmVzdWx0ClBLAwQUAAAAAAAAACEA9b+8Pc4KAADOCgAAPgAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC91dGY4cHJvYmVyLnB5IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEJFR0lOIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgVGhlIE9yaWdpbmFsIENvZGUgaXMgbW96aWxsYS5vcmcgY29kZS4KIwojIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwojIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uLgojIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDE5OTgKIyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiMKIyBDb250cmlidXRvcihzKToKIyAgIE1hcmsgUGlsZ3JpbSAtIHBvcnQgdG8gUHl0aG9uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgojIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQojIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQojIDAyMTEwLTEzMDEgIFVTQQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVORCBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCmZyb20gLmNoYXJzZXRwcm9iZXIgaW1wb3J0IENoYXJTZXRQcm9iZXIKZnJvbSAuZW51bXMgaW1wb3J0IFByb2JpbmdTdGF0ZSwgTWFjaGluZVN0YXRlCmZyb20gLmNvZGluZ3N0YXRlbWFjaGluZSBpbXBvcnQgQ29kaW5nU3RhdGVNYWNoaW5lCmZyb20gLm1iY3NzbSBpbXBvcnQgVVRGOF9TTV9NT0RFTAoKCgpjbGFzcyBVVEY4UHJvYmVyKENoYXJTZXRQcm9iZXIpOgogICAgT05FX0NIQVJfUFJPQiA9IDAuNQoKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzdXBlcihVVEY4UHJvYmVyLCBzZWxmKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5jb2Rpbmdfc20gPSBDb2RpbmdTdGF0ZU1hY2hpbmUoVVRGOF9TTV9NT0RFTCkKICAgICAgICBzZWxmLl9udW1fbWJfY2hhcnMgPSBOb25lCiAgICAgICAgc2VsZi5yZXNldCgpCgogICAgZGVmIHJlc2V0KHNlbGYpOgogICAgICAgIHN1cGVyKFVURjhQcm9iZXIsIHNlbGYpLnJlc2V0KCkKICAgICAgICBzZWxmLmNvZGluZ19zbS5yZXNldCgpCiAgICAgICAgc2VsZi5fbnVtX21iX2NoYXJzID0gMAoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGNoYXJzZXRfbmFtZShzZWxmKToKICAgICAgICByZXR1cm4gInV0Zi04IgoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGxhbmd1YWdlKHNlbGYpOgogICAgICAgIHJldHVybiAiIgoKICAgIGRlZiBmZWVkKHNlbGYsIGJ5dGVfc3RyKToKICAgICAgICBmb3IgYyBpbiBieXRlX3N0cjoKICAgICAgICAgICAgY29kaW5nX3N0YXRlID0gc2VsZi5jb2Rpbmdfc20ubmV4dF9zdGF0ZShjKQogICAgICAgICAgICBpZiBjb2Rpbmdfc3RhdGUgPT0gTWFjaGluZVN0YXRlLkVSUk9SOgogICAgICAgICAgICAgICAgc2VsZi5fc3RhdGUgPSBQcm9iaW5nU3RhdGUuTk9UX01FCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBlbGlmIGNvZGluZ19zdGF0ZSA9PSBNYWNoaW5lU3RhdGUuSVRTX01FOgogICAgICAgICAgICAgICAgc2VsZi5fc3RhdGUgPSBQcm9iaW5nU3RhdGUuRk9VTkRfSVQKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGVsaWYgY29kaW5nX3N0YXRlID09IE1hY2hpbmVTdGF0ZS5TVEFSVDoKICAgICAgICAgICAgICAgIGlmIHNlbGYuY29kaW5nX3NtLmdldF9jdXJyZW50X2NoYXJsZW4oKSA+PSAyOgogICAgICAgICAgICAgICAgICAgIHNlbGYuX251bV9tYl9jaGFycyArPSAxCgogICAgICAgIGlmIHNlbGYuc3RhdGUgPT0gUHJvYmluZ1N0YXRlLkRFVEVDVElORzoKICAgICAgICAgICAgaWYgc2VsZi5nZXRfY29uZmlkZW5jZSgpID4gc2VsZi5TSE9SVENVVF9USFJFU0hPTEQ6CiAgICAgICAgICAgICAgICBzZWxmLl9zdGF0ZSA9IFByb2JpbmdTdGF0ZS5GT1VORF9JVAoKICAgICAgICByZXR1cm4gc2VsZi5zdGF0ZQoKICAgIGRlZiBnZXRfY29uZmlkZW5jZShzZWxmKToKICAgICAgICB1bmxpa2UgPSAwLjk5CiAgICAgICAgaWYgc2VsZi5fbnVtX21iX2NoYXJzIDwgNjoKICAgICAgICAgICAgdW5saWtlICo9IHNlbGYuT05FX0NIQVJfUFJPQiAqKiBzZWxmLl9udW1fbWJfY2hhcnMKICAgICAgICAgICAgcmV0dXJuIDEuMCAtIHVubGlrZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiB1bmxpa2UKUEsDBBQAAAAAAAAAIQBHx5DX8gAAAPIAAAA7AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L3ZlcnNpb24ucHkiIiIKVGhpcyBtb2R1bGUgZXhpc3RzIG9ubHkgdG8gc2ltcGxpZnkgcmV0cmlldmluZyB0aGUgdmVyc2lvbiBudW1iZXIgb2YgY2hhcmRldApmcm9tIHdpdGhpbiBzZXR1cC5weSBhbmQgZnJvbSBjaGFyZGV0IHN1YnBhY2thZ2VzLgoKOmF1dGhvcjogRGFuIEJsYW5jaGFyZCAoZGFuLmJsYW5jaGFyZEBnbWFpbC5jb20pCiIiIgoKX192ZXJzaW9uX18gPSAiMy4wLjQiClZFUlNJT04gPSBfX3ZlcnNpb25fXy5zcGxpdCgnLicpClBLAwQUAAAAAAAAACEAWNRpOfAAAADwAAAAPQAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY29sb3JhbWEvX19pbml0X18ucHkjIENvcHlyaWdodCBKb25hdGhhbiBIYXJ0bGV5IDIwMTMuIEJTRCAzLUNsYXVzZSBsaWNlbnNlLCBzZWUgTElDRU5TRSBmaWxlLgpmcm9tIC5pbml0aWFsaXNlIGltcG9ydCBpbml0LCBkZWluaXQsIHJlaW5pdCwgY29sb3JhbWFfdGV4dApmcm9tIC5hbnNpIGltcG9ydCBGb3JlLCBCYWNrLCBTdHlsZSwgQ3Vyc29yCmZyb20gLmFuc2l0b3dpbjMyIGltcG9ydCBBbnNpVG9XaW4zMgoKX192ZXJzaW9uX18gPSAnMC4zLjcnCgpQSwMEFAAAAAAAAAAhAD4Vp1/cCQAA3AkAADkAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NvbG9yYW1hL2Fuc2kucHkjIENvcHlyaWdodCBKb25hdGhhbiBIYXJ0bGV5IDIwMTMuIEJTRCAzLUNsYXVzZSBsaWNlbnNlLCBzZWUgTElDRU5TRSBmaWxlLgonJycKVGhpcyBtb2R1bGUgZ2VuZXJhdGVzIEFOU0kgY2hhcmFjdGVyIGNvZGVzIHRvIHByaW50aW5nIGNvbG9ycyB0byB0ZXJtaW5hbHMuClNlZTogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9BTlNJX2VzY2FwZV9jb2RlCicnJwoKQ1NJID0gJ1wwMzNbJwpPU0MgPSAnXDAzM10nCkJFTCA9ICdcMDA3JwoKCmRlZiBjb2RlX3RvX2NoYXJzKGNvZGUpOgogICAgcmV0dXJuIENTSSArIHN0cihjb2RlKSArICdtJwoKZGVmIHNldF90aXRsZSh0aXRsZSk6CiAgICByZXR1cm4gT1NDICsgJzI7JyArIHRpdGxlICsgQkVMCgpkZWYgY2xlYXJfc2NyZWVuKG1vZGU9Mik6CiAgICByZXR1cm4gQ1NJICsgc3RyKG1vZGUpICsgJ0onCgpkZWYgY2xlYXJfbGluZShtb2RlPTIpOgogICAgcmV0dXJuIENTSSArIHN0cihtb2RlKSArICdLJwoKCmNsYXNzIEFuc2lDb2RlcyhvYmplY3QpOgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgICMgdGhlIHN1YmNsYXNzZXMgZGVjbGFyZSBjbGFzcyBhdHRyaWJ1dGVzIHdoaWNoIGFyZSBudW1iZXJzLgogICAgICAgICMgVXBvbiBpbnN0YW50aWF0aW9uIHdlIGRlZmluZSBpbnN0YW5jZSBhdHRyaWJ1dGVzLCB3aGljaCBhcmUgdGhlIHNhbWUKICAgICAgICAjIGFzIHRoZSBjbGFzcyBhdHRyaWJ1dGVzIGJ1dCB3cmFwcGVkIHdpdGggdGhlIEFOU0kgZXNjYXBlIHNlcXVlbmNlCiAgICAgICAgZm9yIG5hbWUgaW4gZGlyKHNlbGYpOgogICAgICAgICAgICBpZiBub3QgbmFtZS5zdGFydHN3aXRoKCdfJyk6CiAgICAgICAgICAgICAgICB2YWx1ZSA9IGdldGF0dHIoc2VsZiwgbmFtZSkKICAgICAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgbmFtZSwgY29kZV90b19jaGFycyh2YWx1ZSkpCgoKY2xhc3MgQW5zaUN1cnNvcihvYmplY3QpOgogICAgZGVmIFVQKHNlbGYsIG49MSk6CiAgICAgICAgcmV0dXJuIENTSSArIHN0cihuKSArICdBJwogICAgZGVmIERPV04oc2VsZiwgbj0xKToKICAgICAgICByZXR1cm4gQ1NJICsgc3RyKG4pICsgJ0InCiAgICBkZWYgRk9SV0FSRChzZWxmLCBuPTEpOgogICAgICAgIHJldHVybiBDU0kgKyBzdHIobikgKyAnQycKICAgIGRlZiBCQUNLKHNlbGYsIG49MSk6CiAgICAgICAgcmV0dXJuIENTSSArIHN0cihuKSArICdEJwogICAgZGVmIFBPUyhzZWxmLCB4PTEsIHk9MSk6CiAgICAgICAgcmV0dXJuIENTSSArIHN0cih5KSArICc7JyArIHN0cih4KSArICdIJwoKCmNsYXNzIEFuc2lGb3JlKEFuc2lDb2Rlcyk6CiAgICBCTEFDSyAgICAgICAgICAgPSAzMAogICAgUkVEICAgICAgICAgICAgID0gMzEKICAgIEdSRUVOICAgICAgICAgICA9IDMyCiAgICBZRUxMT1cgICAgICAgICAgPSAzMwogICAgQkxVRSAgICAgICAgICAgID0gMzQKICAgIE1BR0VOVEEgICAgICAgICA9IDM1CiAgICBDWUFOICAgICAgICAgICAgPSAzNgogICAgV0hJVEUgICAgICAgICAgID0gMzcKICAgIFJFU0VUICAgICAgICAgICA9IDM5CgogICAgIyBUaGVzZSBhcmUgZmFpcmx5IHdlbGwgc3VwcG9ydGVkLCBidXQgbm90IHBhcnQgb2YgdGhlIHN0YW5kYXJkLgogICAgTElHSFRCTEFDS19FWCAgID0gOTAKICAgIExJR0hUUkVEX0VYICAgICA9IDkxCiAgICBMSUdIVEdSRUVOX0VYICAgPSA5MgogICAgTElHSFRZRUxMT1dfRVggID0gOTMKICAgIExJR0hUQkxVRV9FWCAgICA9IDk0CiAgICBMSUdIVE1BR0VOVEFfRVggPSA5NQogICAgTElHSFRDWUFOX0VYICAgID0gOTYKICAgIExJR0hUV0hJVEVfRVggICA9IDk3CgoKY2xhc3MgQW5zaUJhY2soQW5zaUNvZGVzKToKICAgIEJMQUNLICAgICAgICAgICA9IDQwCiAgICBSRUQgICAgICAgICAgICAgPSA0MQogICAgR1JFRU4gICAgICAgICAgID0gNDIKICAgIFlFTExPVyAgICAgICAgICA9IDQzCiAgICBCTFVFICAgICAgICAgICAgPSA0NAogICAgTUFHRU5UQSAgICAgICAgID0gNDUKICAgIENZQU4gICAgICAgICAgICA9IDQ2CiAgICBXSElURSAgICAgICAgICAgPSA0NwogICAgUkVTRVQgICAgICAgICAgID0gNDkKCiAgICAjIFRoZXNlIGFyZSBmYWlybHkgd2VsbCBzdXBwb3J0ZWQsIGJ1dCBub3QgcGFydCBvZiB0aGUgc3RhbmRhcmQuCiAgICBMSUdIVEJMQUNLX0VYICAgPSAxMDAKICAgIExJR0hUUkVEX0VYICAgICA9IDEwMQogICAgTElHSFRHUkVFTl9FWCAgID0gMTAyCiAgICBMSUdIVFlFTExPV19FWCAgPSAxMDMKICAgIExJR0hUQkxVRV9FWCAgICA9IDEwNAogICAgTElHSFRNQUdFTlRBX0VYID0gMTA1CiAgICBMSUdIVENZQU5fRVggICAgPSAxMDYKICAgIExJR0hUV0hJVEVfRVggICA9IDEwNwoKCmNsYXNzIEFuc2lTdHlsZShBbnNpQ29kZXMpOgogICAgQlJJR0hUICAgID0gMQogICAgRElNICAgICAgID0gMgogICAgTk9STUFMICAgID0gMjIKICAgIFJFU0VUX0FMTCA9IDAKCkZvcmUgICA9IEFuc2lGb3JlKCkKQmFjayAgID0gQW5zaUJhY2soKQpTdHlsZSAgPSBBbnNpU3R5bGUoKQpDdXJzb3IgPSBBbnNpQ3Vyc29yKCkKUEsDBBQAAAAAAAAAIQDHY8DZxCUAAMQlAABAAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jb2xvcmFtYS9hbnNpdG93aW4zMi5weSMgQ29weXJpZ2h0IEpvbmF0aGFuIEhhcnRsZXkgMjAxMy4gQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsIHNlZSBMSUNFTlNFIGZpbGUuCmltcG9ydCByZQppbXBvcnQgc3lzCmltcG9ydCBvcwoKZnJvbSAuYW5zaSBpbXBvcnQgQW5zaUZvcmUsIEFuc2lCYWNrLCBBbnNpU3R5bGUsIFN0eWxlCmZyb20gLndpbnRlcm0gaW1wb3J0IFdpblRlcm0sIFdpbkNvbG9yLCBXaW5TdHlsZQpmcm9tIC53aW4zMiBpbXBvcnQgd2luZGxsLCB3aW5hcGlfdGVzdAoKCndpbnRlcm0gPSBOb25lCmlmIHdpbmRsbCBpcyBub3QgTm9uZToKICAgIHdpbnRlcm0gPSBXaW5UZXJtKCkKCgpkZWYgaXNfc3RyZWFtX2Nsb3NlZChzdHJlYW0pOgogICAgcmV0dXJuIG5vdCBoYXNhdHRyKHN0cmVhbSwgJ2Nsb3NlZCcpIG9yIHN0cmVhbS5jbG9zZWQKCgpkZWYgaXNfYV90dHkoc3RyZWFtKToKICAgIHJldHVybiBoYXNhdHRyKHN0cmVhbSwgJ2lzYXR0eScpIGFuZCBzdHJlYW0uaXNhdHR5KCkKCgpjbGFzcyBTdHJlYW1XcmFwcGVyKG9iamVjdCk6CiAgICAnJycKICAgIFdyYXBzIGEgc3RyZWFtIChzdWNoIGFzIHN0ZG91dCksIGFjdGluZyBhcyBhIHRyYW5zcGFyZW50IHByb3h5IGZvciBhbGwKICAgIGF0dHJpYnV0ZSBhY2Nlc3MgYXBhcnQgZnJvbSBtZXRob2QgJ3dyaXRlKCknLCB3aGljaCBpcyBkZWxlZ2F0ZWQgdG8gb3VyCiAgICBDb252ZXJ0ZXIgaW5zdGFuY2UuCiAgICAnJycKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB3cmFwcGVkLCBjb252ZXJ0ZXIpOgogICAgICAgICMgZG91YmxlLXVuZGVyc2NvcmUgZXZlcnl0aGluZyB0byBwcmV2ZW50IGNsYXNoZXMgd2l0aCBuYW1lcyBvZgogICAgICAgICMgYXR0cmlidXRlcyBvbiB0aGUgd3JhcHBlZCBzdHJlYW0gb2JqZWN0LgogICAgICAgIHNlbGYuX193cmFwcGVkID0gd3JhcHBlZAogICAgICAgIHNlbGYuX19jb252ZXJ0b3IgPSBjb252ZXJ0ZXIKCiAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgbmFtZSk6CiAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZi5fX3dyYXBwZWQsIG5hbWUpCgogICAgZGVmIHdyaXRlKHNlbGYsIHRleHQpOgogICAgICAgIHNlbGYuX19jb252ZXJ0b3Iud3JpdGUodGV4dCkKCgpjbGFzcyBBbnNpVG9XaW4zMihvYmplY3QpOgogICAgJycnCiAgICBJbXBsZW1lbnRzIGEgJ3dyaXRlKCknIG1ldGhvZCB3aGljaCwgb24gV2luZG93cywgd2lsbCBzdHJpcCBBTlNJIGNoYXJhY3RlcgogICAgc2VxdWVuY2VzIGZyb20gdGhlIHRleHQsIGFuZCBpZiBvdXRwdXR0aW5nIHRvIGEgdHR5LCB3aWxsIGNvbnZlcnQgdGhlbSBpbnRvCiAgICB3aW4zMiBmdW5jdGlvbiBjYWxscy4KICAgICcnJwogICAgQU5TSV9DU0lfUkUgPSByZS5jb21waWxlKCdcMDAxP1wwMzNcWygoPzpcZHw7KSopKFthLXpBLVpdKVwwMDI/JykgICAgICMgQ29udHJvbCBTZXF1ZW5jZSBJbnRyb2R1Y2VyCiAgICBBTlNJX09TQ19SRSA9IHJlLmNvbXBpbGUoJ1wwMDE/XDAzM1xdKCg/Oi58OykqPykoXHgwNylcMDAyPycpICAgICAgICAgIyBPcGVyYXRpbmcgU3lzdGVtIENvbW1hbmQKCiAgICBkZWYgX19pbml0X18oc2VsZiwgd3JhcHBlZCwgY29udmVydD1Ob25lLCBzdHJpcD1Ob25lLCBhdXRvcmVzZXQ9RmFsc2UpOgogICAgICAgICMgVGhlIHdyYXBwZWQgc3RyZWFtIChub3JtYWxseSBzeXMuc3Rkb3V0IG9yIHN5cy5zdGRlcnIpCiAgICAgICAgc2VsZi53cmFwcGVkID0gd3JhcHBlZAoKICAgICAgICAjIHNob3VsZCB3ZSByZXNldCBjb2xvcnMgdG8gZGVmYXVsdHMgYWZ0ZXIgZXZlcnkgLndyaXRlKCkKICAgICAgICBzZWxmLmF1dG9yZXNldCA9IGF1dG9yZXNldAoKICAgICAgICAjIGNyZWF0ZSB0aGUgcHJveHkgd3JhcHBpbmcgb3VyIG91dHB1dCBzdHJlYW0KICAgICAgICBzZWxmLnN0cmVhbSA9IFN0cmVhbVdyYXBwZXIod3JhcHBlZCwgc2VsZikKCiAgICAgICAgb25fd2luZG93cyA9IG9zLm5hbWUgPT0gJ250JwogICAgICAgICMgV2UgdGVzdCBpZiB0aGUgV2luQVBJIHdvcmtzLCBiZWNhdXNlIGV2ZW4gaWYgd2UgYXJlIG9uIFdpbmRvd3MKICAgICAgICAjIHdlIG1heSBiZSB1c2luZyBhIHRlcm1pbmFsIHRoYXQgZG9lc24ndCBzdXBwb3J0IHRoZSBXaW5BUEkKICAgICAgICAjIChlLmcuIEN5Z3dpbiBUZXJtaW5hbCkuIEluIHRoaXMgY2FzZSBpdCdzIHVwIHRvIHRoZSB0ZXJtaW5hbAogICAgICAgICMgdG8gc3VwcG9ydCB0aGUgQU5TSSBjb2Rlcy4KICAgICAgICBjb252ZXJzaW9uX3N1cHBvcnRlZCA9IG9uX3dpbmRvd3MgYW5kIHdpbmFwaV90ZXN0KCkKCiAgICAgICAgIyBzaG91bGQgd2Ugc3RyaXAgQU5TSSBzZXF1ZW5jZXMgZnJvbSBvdXIgb3V0cHV0PwogICAgICAgIGlmIHN0cmlwIGlzIE5vbmU6CiAgICAgICAgICAgIHN0cmlwID0gY29udmVyc2lvbl9zdXBwb3J0ZWQgb3IgKG5vdCBpc19zdHJlYW1fY2xvc2VkKHdyYXBwZWQpIGFuZCBub3QgaXNfYV90dHkod3JhcHBlZCkpCiAgICAgICAgc2VsZi5zdHJpcCA9IHN0cmlwCgogICAgICAgICMgc2hvdWxkIHdlIHNob3VsZCBjb252ZXJ0IEFOU0kgc2VxdWVuY2VzIGludG8gd2luMzIgY2FsbHM/CiAgICAgICAgaWYgY29udmVydCBpcyBOb25lOgogICAgICAgICAgICBjb252ZXJ0ID0gY29udmVyc2lvbl9zdXBwb3J0ZWQgYW5kIG5vdCBpc19zdHJlYW1fY2xvc2VkKHdyYXBwZWQpIGFuZCBpc19hX3R0eSh3cmFwcGVkKQogICAgICAgIHNlbGYuY29udmVydCA9IGNvbnZlcnQKCiAgICAgICAgIyBkaWN0IG9mIGFuc2kgY29kZXMgdG8gd2luMzIgZnVuY3Rpb25zIGFuZCBwYXJhbWV0ZXJzCiAgICAgICAgc2VsZi53aW4zMl9jYWxscyA9IHNlbGYuZ2V0X3dpbjMyX2NhbGxzKCkKCiAgICAgICAgIyBhcmUgd2Ugd3JhcHBpbmcgc3RkZXJyPwogICAgICAgIHNlbGYub25fc3RkZXJyID0gc2VsZi53cmFwcGVkIGlzIHN5cy5zdGRlcnIKCiAgICBkZWYgc2hvdWxkX3dyYXAoc2VsZik6CiAgICAgICAgJycnCiAgICAgICAgVHJ1ZSBpZiB0aGlzIGNsYXNzIGlzIGFjdHVhbGx5IG5lZWRlZC4gSWYgZmFsc2UsIHRoZW4gdGhlIG91dHB1dAogICAgICAgIHN0cmVhbSB3aWxsIG5vdCBiZSBhZmZlY3RlZCwgbm9yIHdpbGwgd2luMzIgY2FsbHMgYmUgaXNzdWVkLCBzbwogICAgICAgIHdyYXBwaW5nIHN0ZG91dCBpcyBub3QgYWN0dWFsbHkgcmVxdWlyZWQuIFRoaXMgd2lsbCBnZW5lcmFsbHkgYmUKICAgICAgICBGYWxzZSBvbiBub24tV2luZG93cyBwbGF0Zm9ybXMsIHVubGVzcyBvcHRpb25hbCBmdW5jdGlvbmFsaXR5IGxpa2UKICAgICAgICBhdXRvcmVzZXQgaGFzIGJlZW4gcmVxdWVzdGVkIHVzaW5nIGt3YXJncyB0byBpbml0KCkKICAgICAgICAnJycKICAgICAgICByZXR1cm4gc2VsZi5jb252ZXJ0IG9yIHNlbGYuc3RyaXAgb3Igc2VsZi5hdXRvcmVzZXQKCiAgICBkZWYgZ2V0X3dpbjMyX2NhbGxzKHNlbGYpOgogICAgICAgIGlmIHNlbGYuY29udmVydCBhbmQgd2ludGVybToKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIEFuc2lTdHlsZS5SRVNFVF9BTEw6ICh3aW50ZXJtLnJlc2V0X2FsbCwgKSwKICAgICAgICAgICAgICAgIEFuc2lTdHlsZS5CUklHSFQ6ICh3aW50ZXJtLnN0eWxlLCBXaW5TdHlsZS5CUklHSFQpLAogICAgICAgICAgICAgICAgQW5zaVN0eWxlLkRJTTogKHdpbnRlcm0uc3R5bGUsIFdpblN0eWxlLk5PUk1BTCksCiAgICAgICAgICAgICAgICBBbnNpU3R5bGUuTk9STUFMOiAod2ludGVybS5zdHlsZSwgV2luU3R5bGUuTk9STUFMKSwKICAgICAgICAgICAgICAgIEFuc2lGb3JlLkJMQUNLOiAod2ludGVybS5mb3JlLCBXaW5Db2xvci5CTEFDSyksCiAgICAgICAgICAgICAgICBBbnNpRm9yZS5SRUQ6ICh3aW50ZXJtLmZvcmUsIFdpbkNvbG9yLlJFRCksCiAgICAgICAgICAgICAgICBBbnNpRm9yZS5HUkVFTjogKHdpbnRlcm0uZm9yZSwgV2luQ29sb3IuR1JFRU4pLAogICAgICAgICAgICAgICAgQW5zaUZvcmUuWUVMTE9XOiAod2ludGVybS5mb3JlLCBXaW5Db2xvci5ZRUxMT1cpLAogICAgICAgICAgICAgICAgQW5zaUZvcmUuQkxVRTogKHdpbnRlcm0uZm9yZSwgV2luQ29sb3IuQkxVRSksCiAgICAgICAgICAgICAgICBBbnNpRm9yZS5NQUdFTlRBOiAod2ludGVybS5mb3JlLCBXaW5Db2xvci5NQUdFTlRBKSwKICAgICAgICAgICAgICAgIEFuc2lGb3JlLkNZQU46ICh3aW50ZXJtLmZvcmUsIFdpbkNvbG9yLkNZQU4pLAogICAgICAgICAgICAgICAgQW5zaUZvcmUuV0hJVEU6ICh3aW50ZXJtLmZvcmUsIFdpbkNvbG9yLkdSRVkpLAogICAgICAgICAgICAgICAgQW5zaUZvcmUuUkVTRVQ6ICh3aW50ZXJtLmZvcmUsICksCiAgICAgICAgICAgICAgICBBbnNpRm9yZS5MSUdIVEJMQUNLX0VYOiAod2ludGVybS5mb3JlLCBXaW5Db2xvci5CTEFDSywgVHJ1ZSksCiAgICAgICAgICAgICAgICBBbnNpRm9yZS5MSUdIVFJFRF9FWDogKHdpbnRlcm0uZm9yZSwgV2luQ29sb3IuUkVELCBUcnVlKSwKICAgICAgICAgICAgICAgIEFuc2lGb3JlLkxJR0hUR1JFRU5fRVg6ICh3aW50ZXJtLmZvcmUsIFdpbkNvbG9yLkdSRUVOLCBUcnVlKSwKICAgICAgICAgICAgICAgIEFuc2lGb3JlLkxJR0hUWUVMTE9XX0VYOiAod2ludGVybS5mb3JlLCBXaW5Db2xvci5ZRUxMT1csIFRydWUpLAogICAgICAgICAgICAgICAgQW5zaUZvcmUuTElHSFRCTFVFX0VYOiAod2ludGVybS5mb3JlLCBXaW5Db2xvci5CTFVFLCBUcnVlKSwKICAgICAgICAgICAgICAgIEFuc2lGb3JlLkxJR0hUTUFHRU5UQV9FWDogKHdpbnRlcm0uZm9yZSwgV2luQ29sb3IuTUFHRU5UQSwgVHJ1ZSksCiAgICAgICAgICAgICAgICBBbnNpRm9yZS5MSUdIVENZQU5fRVg6ICh3aW50ZXJtLmZvcmUsIFdpbkNvbG9yLkNZQU4sIFRydWUpLAogICAgICAgICAgICAgICAgQW5zaUZvcmUuTElHSFRXSElURV9FWDogKHdpbnRlcm0uZm9yZSwgV2luQ29sb3IuR1JFWSwgVHJ1ZSksCiAgICAgICAgICAgICAgICBBbnNpQmFjay5CTEFDSzogKHdpbnRlcm0uYmFjaywgV2luQ29sb3IuQkxBQ0spLAogICAgICAgICAgICAgICAgQW5zaUJhY2suUkVEOiAod2ludGVybS5iYWNrLCBXaW5Db2xvci5SRUQpLAogICAgICAgICAgICAgICAgQW5zaUJhY2suR1JFRU46ICh3aW50ZXJtLmJhY2ssIFdpbkNvbG9yLkdSRUVOKSwKICAgICAgICAgICAgICAgIEFuc2lCYWNrLllFTExPVzogKHdpbnRlcm0uYmFjaywgV2luQ29sb3IuWUVMTE9XKSwKICAgICAgICAgICAgICAgIEFuc2lCYWNrLkJMVUU6ICh3aW50ZXJtLmJhY2ssIFdpbkNvbG9yLkJMVUUpLAogICAgICAgICAgICAgICAgQW5zaUJhY2suTUFHRU5UQTogKHdpbnRlcm0uYmFjaywgV2luQ29sb3IuTUFHRU5UQSksCiAgICAgICAgICAgICAgICBBbnNpQmFjay5DWUFOOiAod2ludGVybS5iYWNrLCBXaW5Db2xvci5DWUFOKSwKICAgICAgICAgICAgICAgIEFuc2lCYWNrLldISVRFOiAod2ludGVybS5iYWNrLCBXaW5Db2xvci5HUkVZKSwKICAgICAgICAgICAgICAgIEFuc2lCYWNrLlJFU0VUOiAod2ludGVybS5iYWNrLCApLAogICAgICAgICAgICAgICAgQW5zaUJhY2suTElHSFRCTEFDS19FWDogKHdpbnRlcm0uYmFjaywgV2luQ29sb3IuQkxBQ0ssIFRydWUpLAogICAgICAgICAgICAgICAgQW5zaUJhY2suTElHSFRSRURfRVg6ICh3aW50ZXJtLmJhY2ssIFdpbkNvbG9yLlJFRCwgVHJ1ZSksCiAgICAgICAgICAgICAgICBBbnNpQmFjay5MSUdIVEdSRUVOX0VYOiAod2ludGVybS5iYWNrLCBXaW5Db2xvci5HUkVFTiwgVHJ1ZSksCiAgICAgICAgICAgICAgICBBbnNpQmFjay5MSUdIVFlFTExPV19FWDogKHdpbnRlcm0uYmFjaywgV2luQ29sb3IuWUVMTE9XLCBUcnVlKSwKICAgICAgICAgICAgICAgIEFuc2lCYWNrLkxJR0hUQkxVRV9FWDogKHdpbnRlcm0uYmFjaywgV2luQ29sb3IuQkxVRSwgVHJ1ZSksCiAgICAgICAgICAgICAgICBBbnNpQmFjay5MSUdIVE1BR0VOVEFfRVg6ICh3aW50ZXJtLmJhY2ssIFdpbkNvbG9yLk1BR0VOVEEsIFRydWUpLAogICAgICAgICAgICAgICAgQW5zaUJhY2suTElHSFRDWUFOX0VYOiAod2ludGVybS5iYWNrLCBXaW5Db2xvci5DWUFOLCBUcnVlKSwKICAgICAgICAgICAgICAgIEFuc2lCYWNrLkxJR0hUV0hJVEVfRVg6ICh3aW50ZXJtLmJhY2ssIFdpbkNvbG9yLkdSRVksIFRydWUpLAogICAgICAgICAgICB9CiAgICAgICAgcmV0dXJuIGRpY3QoKQoKICAgIGRlZiB3cml0ZShzZWxmLCB0ZXh0KToKICAgICAgICBpZiBzZWxmLnN0cmlwIG9yIHNlbGYuY29udmVydDoKICAgICAgICAgICAgc2VsZi53cml0ZV9hbmRfY29udmVydCh0ZXh0KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYud3JhcHBlZC53cml0ZSh0ZXh0KQogICAgICAgICAgICBzZWxmLndyYXBwZWQuZmx1c2goKQogICAgICAgIGlmIHNlbGYuYXV0b3Jlc2V0OgogICAgICAgICAgICBzZWxmLnJlc2V0X2FsbCgpCgoKICAgIGRlZiByZXNldF9hbGwoc2VsZik6CiAgICAgICAgaWYgc2VsZi5jb252ZXJ0OgogICAgICAgICAgICBzZWxmLmNhbGxfd2luMzIoJ20nLCAoMCwpKQogICAgICAgIGVsaWYgbm90IHNlbGYuc3RyaXAgYW5kIG5vdCBpc19zdHJlYW1fY2xvc2VkKHNlbGYud3JhcHBlZCk6CiAgICAgICAgICAgIHNlbGYud3JhcHBlZC53cml0ZShTdHlsZS5SRVNFVF9BTEwpCgoKICAgIGRlZiB3cml0ZV9hbmRfY29udmVydChzZWxmLCB0ZXh0KToKICAgICAgICAnJycKICAgICAgICBXcml0ZSB0aGUgZ2l2ZW4gdGV4dCB0byBvdXIgd3JhcHBlZCBzdHJlYW0sIHN0cmlwcGluZyBhbnkgQU5TSQogICAgICAgIHNlcXVlbmNlcyBmcm9tIHRoZSB0ZXh0LCBhbmQgb3B0aW9uYWxseSBjb252ZXJ0aW5nIHRoZW0gaW50byB3aW4zMgogICAgICAgIGNhbGxzLgogICAgICAgICcnJwogICAgICAgIGN1cnNvciA9IDAKICAgICAgICB0ZXh0ID0gc2VsZi5jb252ZXJ0X29zYyh0ZXh0KQogICAgICAgIGZvciBtYXRjaCBpbiBzZWxmLkFOU0lfQ1NJX1JFLmZpbmRpdGVyKHRleHQpOgogICAgICAgICAgICBzdGFydCwgZW5kID0gbWF0Y2guc3BhbigpCiAgICAgICAgICAgIHNlbGYud3JpdGVfcGxhaW5fdGV4dCh0ZXh0LCBjdXJzb3IsIHN0YXJ0KQogICAgICAgICAgICBzZWxmLmNvbnZlcnRfYW5zaSgqbWF0Y2guZ3JvdXBzKCkpCiAgICAgICAgICAgIGN1cnNvciA9IGVuZAogICAgICAgIHNlbGYud3JpdGVfcGxhaW5fdGV4dCh0ZXh0LCBjdXJzb3IsIGxlbih0ZXh0KSkKCgogICAgZGVmIHdyaXRlX3BsYWluX3RleHQoc2VsZiwgdGV4dCwgc3RhcnQsIGVuZCk6CiAgICAgICAgaWYgc3RhcnQgPCBlbmQ6CiAgICAgICAgICAgIHNlbGYud3JhcHBlZC53cml0ZSh0ZXh0W3N0YXJ0OmVuZF0pCiAgICAgICAgICAgIHNlbGYud3JhcHBlZC5mbHVzaCgpCgoKICAgIGRlZiBjb252ZXJ0X2Fuc2koc2VsZiwgcGFyYW1zdHJpbmcsIGNvbW1hbmQpOgogICAgICAgIGlmIHNlbGYuY29udmVydDoKICAgICAgICAgICAgcGFyYW1zID0gc2VsZi5leHRyYWN0X3BhcmFtcyhjb21tYW5kLCBwYXJhbXN0cmluZykKICAgICAgICAgICAgc2VsZi5jYWxsX3dpbjMyKGNvbW1hbmQsIHBhcmFtcykKCgogICAgZGVmIGV4dHJhY3RfcGFyYW1zKHNlbGYsIGNvbW1hbmQsIHBhcmFtc3RyaW5nKToKICAgICAgICBpZiBjb21tYW5kIGluICdIZic6CiAgICAgICAgICAgIHBhcmFtcyA9IHR1cGxlKGludChwKSBpZiBsZW4ocCkgIT0gMCBlbHNlIDEgZm9yIHAgaW4gcGFyYW1zdHJpbmcuc3BsaXQoJzsnKSkKICAgICAgICAgICAgd2hpbGUgbGVuKHBhcmFtcykgPCAyOgogICAgICAgICAgICAgICAgIyBkZWZhdWx0czoKICAgICAgICAgICAgICAgIHBhcmFtcyA9IHBhcmFtcyArICgxLCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBwYXJhbXMgPSB0dXBsZShpbnQocCkgZm9yIHAgaW4gcGFyYW1zdHJpbmcuc3BsaXQoJzsnKSBpZiBsZW4ocCkgIT0gMCkKICAgICAgICAgICAgaWYgbGVuKHBhcmFtcykgPT0gMDoKICAgICAgICAgICAgICAgICMgZGVmYXVsdHM6CiAgICAgICAgICAgICAgICBpZiBjb21tYW5kIGluICdKS20nOgogICAgICAgICAgICAgICAgICAgIHBhcmFtcyA9ICgwLCkKICAgICAgICAgICAgICAgIGVsaWYgY29tbWFuZCBpbiAnQUJDRCc6CiAgICAgICAgICAgICAgICAgICAgcGFyYW1zID0gKDEsKQoKICAgICAgICByZXR1cm4gcGFyYW1zCgoKICAgIGRlZiBjYWxsX3dpbjMyKHNlbGYsIGNvbW1hbmQsIHBhcmFtcyk6CiAgICAgICAgaWYgY29tbWFuZCA9PSAnbSc6CiAgICAgICAgICAgIGZvciBwYXJhbSBpbiBwYXJhbXM6CiAgICAgICAgICAgICAgICBpZiBwYXJhbSBpbiBzZWxmLndpbjMyX2NhbGxzOgogICAgICAgICAgICAgICAgICAgIGZ1bmNfYXJncyA9IHNlbGYud2luMzJfY2FsbHNbcGFyYW1dCiAgICAgICAgICAgICAgICAgICAgZnVuYyA9IGZ1bmNfYXJnc1swXQogICAgICAgICAgICAgICAgICAgIGFyZ3MgPSBmdW5jX2FyZ3NbMTpdCiAgICAgICAgICAgICAgICAgICAga3dhcmdzID0gZGljdChvbl9zdGRlcnI9c2VsZi5vbl9zdGRlcnIpCiAgICAgICAgICAgICAgICAgICAgZnVuYygqYXJncywgKiprd2FyZ3MpCiAgICAgICAgZWxpZiBjb21tYW5kIGluICdKJzoKICAgICAgICAgICAgd2ludGVybS5lcmFzZV9zY3JlZW4ocGFyYW1zWzBdLCBvbl9zdGRlcnI9c2VsZi5vbl9zdGRlcnIpCiAgICAgICAgZWxpZiBjb21tYW5kIGluICdLJzoKICAgICAgICAgICAgd2ludGVybS5lcmFzZV9saW5lKHBhcmFtc1swXSwgb25fc3RkZXJyPXNlbGYub25fc3RkZXJyKQogICAgICAgIGVsaWYgY29tbWFuZCBpbiAnSGYnOiAgICAgIyBjdXJzb3IgcG9zaXRpb24gLSBhYnNvbHV0ZQogICAgICAgICAgICB3aW50ZXJtLnNldF9jdXJzb3JfcG9zaXRpb24ocGFyYW1zLCBvbl9zdGRlcnI9c2VsZi5vbl9zdGRlcnIpCiAgICAgICAgZWxpZiBjb21tYW5kIGluICdBQkNEJzogICAjIGN1cnNvciBwb3NpdGlvbiAtIHJlbGF0aXZlCiAgICAgICAgICAgIG4gPSBwYXJhbXNbMF0KICAgICAgICAgICAgIyBBIC0gdXAsIEIgLSBkb3duLCBDIC0gZm9yd2FyZCwgRCAtIGJhY2sKICAgICAgICAgICAgeCwgeSA9IHsnQSc6ICgwLCAtbiksICdCJzogKDAsIG4pLCAnQyc6IChuLCAwKSwgJ0QnOiAoLW4sIDApfVtjb21tYW5kXQogICAgICAgICAgICB3aW50ZXJtLmN1cnNvcl9hZGp1c3QoeCwgeSwgb25fc3RkZXJyPXNlbGYub25fc3RkZXJyKQoKCiAgICBkZWYgY29udmVydF9vc2Moc2VsZiwgdGV4dCk6CiAgICAgICAgZm9yIG1hdGNoIGluIHNlbGYuQU5TSV9PU0NfUkUuZmluZGl0ZXIodGV4dCk6CiAgICAgICAgICAgIHN0YXJ0LCBlbmQgPSBtYXRjaC5zcGFuKCkKICAgICAgICAgICAgdGV4dCA9IHRleHRbOnN0YXJ0XSArIHRleHRbZW5kOl0KICAgICAgICAgICAgcGFyYW1zdHJpbmcsIGNvbW1hbmQgPSBtYXRjaC5ncm91cHMoKQogICAgICAgICAgICBpZiBjb21tYW5kIGluICdceDA3JzogICAgICAgIyBceDA3ID0gQkVMCiAgICAgICAgICAgICAgICBwYXJhbXMgPSBwYXJhbXN0cmluZy5zcGxpdCgiOyIpCiAgICAgICAgICAgICAgICAjIDAgLSBjaGFuZ2UgdGl0bGUgYW5kIGljb24gKHdlIHdpbGwgb25seSBjaGFuZ2UgdGl0bGUpCiAgICAgICAgICAgICAgICAjIDEgLSBjaGFuZ2UgaWNvbiAod2UgZG9uJ3Qgc3VwcG9ydCB0aGlzKQogICAgICAgICAgICAgICAgIyAyIC0gY2hhbmdlIHRpdGxlCiAgICAgICAgICAgICAgICBpZiBwYXJhbXNbMF0gaW4gJzAyJzoKICAgICAgICAgICAgICAgICAgICB3aW50ZXJtLnNldF90aXRsZShwYXJhbXNbMV0pCiAgICAgICAgcmV0dXJuIHRleHQKUEsDBBQAAAAAAAAAIQB91tgvfQcAAH0HAAA/AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jb2xvcmFtYS9pbml0aWFsaXNlLnB5IyBDb3B5cmlnaHQgSm9uYXRoYW4gSGFydGxleSAyMDEzLiBCU0QgMy1DbGF1c2UgbGljZW5zZSwgc2VlIExJQ0VOU0UgZmlsZS4KaW1wb3J0IGF0ZXhpdAppbXBvcnQgY29udGV4dGxpYgppbXBvcnQgc3lzCgpmcm9tIC5hbnNpdG93aW4zMiBpbXBvcnQgQW5zaVRvV2luMzIKCgpvcmlnX3N0ZG91dCA9IE5vbmUKb3JpZ19zdGRlcnIgPSBOb25lCgp3cmFwcGVkX3N0ZG91dCA9IE5vbmUKd3JhcHBlZF9zdGRlcnIgPSBOb25lCgphdGV4aXRfZG9uZSA9IEZhbHNlCgoKZGVmIHJlc2V0X2FsbCgpOgogICAgaWYgQW5zaVRvV2luMzIgaXMgbm90IE5vbmU6ICAgICMgSXNzdWUgIzc0OiBvYmplY3RzIG1pZ2h0IGJlY29tZSBOb25lIGF0IGV4aXQKICAgICAgICBBbnNpVG9XaW4zMihvcmlnX3N0ZG91dCkucmVzZXRfYWxsKCkKCgpkZWYgaW5pdChhdXRvcmVzZXQ9RmFsc2UsIGNvbnZlcnQ9Tm9uZSwgc3RyaXA9Tm9uZSwgd3JhcD1UcnVlKToKCiAgICBpZiBub3Qgd3JhcCBhbmQgYW55KFthdXRvcmVzZXQsIGNvbnZlcnQsIHN0cmlwXSk6CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignd3JhcD1GYWxzZSBjb25mbGljdHMgd2l0aCBhbnkgb3RoZXIgYXJnPVRydWUnKQoKICAgIGdsb2JhbCB3cmFwcGVkX3N0ZG91dCwgd3JhcHBlZF9zdGRlcnIKICAgIGdsb2JhbCBvcmlnX3N0ZG91dCwgb3JpZ19zdGRlcnIKCiAgICBvcmlnX3N0ZG91dCA9IHN5cy5zdGRvdXQKICAgIG9yaWdfc3RkZXJyID0gc3lzLnN0ZGVycgoKICAgIGlmIHN5cy5zdGRvdXQgaXMgTm9uZToKICAgICAgICB3cmFwcGVkX3N0ZG91dCA9IE5vbmUKICAgIGVsc2U6CiAgICAgICAgc3lzLnN0ZG91dCA9IHdyYXBwZWRfc3Rkb3V0ID0gXAogICAgICAgICAgICB3cmFwX3N0cmVhbShvcmlnX3N0ZG91dCwgY29udmVydCwgc3RyaXAsIGF1dG9yZXNldCwgd3JhcCkKICAgIGlmIHN5cy5zdGRlcnIgaXMgTm9uZToKICAgICAgICB3cmFwcGVkX3N0ZGVyciA9IE5vbmUKICAgIGVsc2U6CiAgICAgICAgc3lzLnN0ZGVyciA9IHdyYXBwZWRfc3RkZXJyID0gXAogICAgICAgICAgICB3cmFwX3N0cmVhbShvcmlnX3N0ZGVyciwgY29udmVydCwgc3RyaXAsIGF1dG9yZXNldCwgd3JhcCkKCiAgICBnbG9iYWwgYXRleGl0X2RvbmUKICAgIGlmIG5vdCBhdGV4aXRfZG9uZToKICAgICAgICBhdGV4aXQucmVnaXN0ZXIocmVzZXRfYWxsKQogICAgICAgIGF0ZXhpdF9kb25lID0gVHJ1ZQoKCmRlZiBkZWluaXQoKToKICAgIGlmIG9yaWdfc3Rkb3V0IGlzIG5vdCBOb25lOgogICAgICAgIHN5cy5zdGRvdXQgPSBvcmlnX3N0ZG91dAogICAgaWYgb3JpZ19zdGRlcnIgaXMgbm90IE5vbmU6CiAgICAgICAgc3lzLnN0ZGVyciA9IG9yaWdfc3RkZXJyCgoKQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKZGVmIGNvbG9yYW1hX3RleHQoKmFyZ3MsICoqa3dhcmdzKToKICAgIGluaXQoKmFyZ3MsICoqa3dhcmdzKQogICAgdHJ5OgogICAgICAgIHlpZWxkCiAgICBmaW5hbGx5OgogICAgICAgIGRlaW5pdCgpCgoKZGVmIHJlaW5pdCgpOgogICAgaWYgd3JhcHBlZF9zdGRvdXQgaXMgbm90IE5vbmU6CiAgICAgICAgc3lzLnN0ZG91dCA9IHdyYXBwZWRfc3Rkb3V0CiAgICBpZiB3cmFwcGVkX3N0ZGVyciBpcyBub3QgTm9uZToKICAgICAgICBzeXMuc3RkZXJyID0gd3JhcHBlZF9zdGRlcnIKCgpkZWYgd3JhcF9zdHJlYW0oc3RyZWFtLCBjb252ZXJ0LCBzdHJpcCwgYXV0b3Jlc2V0LCB3cmFwKToKICAgIGlmIHdyYXA6CiAgICAgICAgd3JhcHBlciA9IEFuc2lUb1dpbjMyKHN0cmVhbSwKICAgICAgICAgICAgY29udmVydD1jb252ZXJ0LCBzdHJpcD1zdHJpcCwgYXV0b3Jlc2V0PWF1dG9yZXNldCkKICAgICAgICBpZiB3cmFwcGVyLnNob3VsZF93cmFwKCk6CiAgICAgICAgICAgIHN0cmVhbSA9IHdyYXBwZXIuc3RyZWFtCiAgICByZXR1cm4gc3RyZWFtCgoKUEsDBBQAAAAAAAAAIQANbaI99RQAAPUUAAA6AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jb2xvcmFtYS93aW4zMi5weSMgQ29weXJpZ2h0IEpvbmF0aGFuIEhhcnRsZXkgMjAxMy4gQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsIHNlZSBMSUNFTlNFIGZpbGUuCgojIGZyb20gd2luYmFzZS5oClNURE9VVCA9IC0xMQpTVERFUlIgPSAtMTIKCnRyeToKICAgIGltcG9ydCBjdHlwZXMKICAgIGZyb20gY3R5cGVzIGltcG9ydCBMaWJyYXJ5TG9hZGVyCiAgICB3aW5kbGwgPSBMaWJyYXJ5TG9hZGVyKGN0eXBlcy5XaW5ETEwpCiAgICBmcm9tIGN0eXBlcyBpbXBvcnQgd2ludHlwZXMKZXhjZXB0IChBdHRyaWJ1dGVFcnJvciwgSW1wb3J0RXJyb3IpOgogICAgd2luZGxsID0gTm9uZQogICAgU2V0Q29uc29sZVRleHRBdHRyaWJ1dGUgPSBsYW1iZGEgKl86IE5vbmUKICAgIHdpbmFwaV90ZXN0ID0gbGFtYmRhICpfOiBOb25lCmVsc2U6CiAgICBmcm9tIGN0eXBlcyBpbXBvcnQgYnlyZWYsIFN0cnVjdHVyZSwgY19jaGFyLCBQT0lOVEVSCgogICAgQ09PUkQgPSB3aW50eXBlcy5fQ09PUkQKCiAgICBjbGFzcyBDT05TT0xFX1NDUkVFTl9CVUZGRVJfSU5GTyhTdHJ1Y3R1cmUpOgogICAgICAgICIiInN0cnVjdCBpbiB3aW5jb24uaC4iIiIKICAgICAgICBfZmllbGRzXyA9IFsKICAgICAgICAgICAgKCJkd1NpemUiLCBDT09SRCksCiAgICAgICAgICAgICgiZHdDdXJzb3JQb3NpdGlvbiIsIENPT1JEKSwKICAgICAgICAgICAgKCJ3QXR0cmlidXRlcyIsIHdpbnR5cGVzLldPUkQpLAogICAgICAgICAgICAoInNyV2luZG93Iiwgd2ludHlwZXMuU01BTExfUkVDVCksCiAgICAgICAgICAgICgiZHdNYXhpbXVtV2luZG93U2l6ZSIsIENPT1JEKSwKICAgICAgICBdCiAgICAgICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgICAgIHJldHVybiAnKCVkLCVkLCVkLCVkLCVkLCVkLCVkLCVkLCVkLCVkLCVkKScgJSAoCiAgICAgICAgICAgICAgICBzZWxmLmR3U2l6ZS5ZLCBzZWxmLmR3U2l6ZS5YCiAgICAgICAgICAgICAgICAsIHNlbGYuZHdDdXJzb3JQb3NpdGlvbi5ZLCBzZWxmLmR3Q3Vyc29yUG9zaXRpb24uWAogICAgICAgICAgICAgICAgLCBzZWxmLndBdHRyaWJ1dGVzCiAgICAgICAgICAgICAgICAsIHNlbGYuc3JXaW5kb3cuVG9wLCBzZWxmLnNyV2luZG93LkxlZnQsIHNlbGYuc3JXaW5kb3cuQm90dG9tLCBzZWxmLnNyV2luZG93LlJpZ2h0CiAgICAgICAgICAgICAgICAsIHNlbGYuZHdNYXhpbXVtV2luZG93U2l6ZS5ZLCBzZWxmLmR3TWF4aW11bVdpbmRvd1NpemUuWAogICAgICAgICAgICApCgogICAgX0dldFN0ZEhhbmRsZSA9IHdpbmRsbC5rZXJuZWwzMi5HZXRTdGRIYW5kbGUKICAgIF9HZXRTdGRIYW5kbGUuYXJndHlwZXMgPSBbCiAgICAgICAgd2ludHlwZXMuRFdPUkQsCiAgICBdCiAgICBfR2V0U3RkSGFuZGxlLnJlc3R5cGUgPSB3aW50eXBlcy5IQU5ETEUKCiAgICBfR2V0Q29uc29sZVNjcmVlbkJ1ZmZlckluZm8gPSB3aW5kbGwua2VybmVsMzIuR2V0Q29uc29sZVNjcmVlbkJ1ZmZlckluZm8KICAgIF9HZXRDb25zb2xlU2NyZWVuQnVmZmVySW5mby5hcmd0eXBlcyA9IFsKICAgICAgICB3aW50eXBlcy5IQU5ETEUsCiAgICAgICAgUE9JTlRFUihDT05TT0xFX1NDUkVFTl9CVUZGRVJfSU5GTyksCiAgICBdCiAgICBfR2V0Q29uc29sZVNjcmVlbkJ1ZmZlckluZm8ucmVzdHlwZSA9IHdpbnR5cGVzLkJPT0wKCiAgICBfU2V0Q29uc29sZVRleHRBdHRyaWJ1dGUgPSB3aW5kbGwua2VybmVsMzIuU2V0Q29uc29sZVRleHRBdHRyaWJ1dGUKICAgIF9TZXRDb25zb2xlVGV4dEF0dHJpYnV0ZS5hcmd0eXBlcyA9IFsKICAgICAgICB3aW50eXBlcy5IQU5ETEUsCiAgICAgICAgd2ludHlwZXMuV09SRCwKICAgIF0KICAgIF9TZXRDb25zb2xlVGV4dEF0dHJpYnV0ZS5yZXN0eXBlID0gd2ludHlwZXMuQk9PTAoKICAgIF9TZXRDb25zb2xlQ3Vyc29yUG9zaXRpb24gPSB3aW5kbGwua2VybmVsMzIuU2V0Q29uc29sZUN1cnNvclBvc2l0aW9uCiAgICBfU2V0Q29uc29sZUN1cnNvclBvc2l0aW9uLmFyZ3R5cGVzID0gWwogICAgICAgIHdpbnR5cGVzLkhBTkRMRSwKICAgICAgICBDT09SRCwKICAgIF0KICAgIF9TZXRDb25zb2xlQ3Vyc29yUG9zaXRpb24ucmVzdHlwZSA9IHdpbnR5cGVzLkJPT0wKCiAgICBfRmlsbENvbnNvbGVPdXRwdXRDaGFyYWN0ZXJBID0gd2luZGxsLmtlcm5lbDMyLkZpbGxDb25zb2xlT3V0cHV0Q2hhcmFjdGVyQQogICAgX0ZpbGxDb25zb2xlT3V0cHV0Q2hhcmFjdGVyQS5hcmd0eXBlcyA9IFsKICAgICAgICB3aW50eXBlcy5IQU5ETEUsCiAgICAgICAgY19jaGFyLAogICAgICAgIHdpbnR5cGVzLkRXT1JELAogICAgICAgIENPT1JELAogICAgICAgIFBPSU5URVIod2ludHlwZXMuRFdPUkQpLAogICAgXQogICAgX0ZpbGxDb25zb2xlT3V0cHV0Q2hhcmFjdGVyQS5yZXN0eXBlID0gd2ludHlwZXMuQk9PTAoKICAgIF9GaWxsQ29uc29sZU91dHB1dEF0dHJpYnV0ZSA9IHdpbmRsbC5rZXJuZWwzMi5GaWxsQ29uc29sZU91dHB1dEF0dHJpYnV0ZQogICAgX0ZpbGxDb25zb2xlT3V0cHV0QXR0cmlidXRlLmFyZ3R5cGVzID0gWwogICAgICAgIHdpbnR5cGVzLkhBTkRMRSwKICAgICAgICB3aW50eXBlcy5XT1JELAogICAgICAgIHdpbnR5cGVzLkRXT1JELAogICAgICAgIENPT1JELAogICAgICAgIFBPSU5URVIod2ludHlwZXMuRFdPUkQpLAogICAgXQogICAgX0ZpbGxDb25zb2xlT3V0cHV0QXR0cmlidXRlLnJlc3R5cGUgPSB3aW50eXBlcy5CT09MCgogICAgX1NldENvbnNvbGVUaXRsZVcgPSB3aW5kbGwua2VybmVsMzIuU2V0Q29uc29sZVRpdGxlQQogICAgX1NldENvbnNvbGVUaXRsZVcuYXJndHlwZXMgPSBbCiAgICAgICAgd2ludHlwZXMuTFBDU1RSCiAgICBdCiAgICBfU2V0Q29uc29sZVRpdGxlVy5yZXN0eXBlID0gd2ludHlwZXMuQk9PTAoKICAgIGhhbmRsZXMgPSB7CiAgICAgICAgU1RET1VUOiBfR2V0U3RkSGFuZGxlKFNURE9VVCksCiAgICAgICAgU1RERVJSOiBfR2V0U3RkSGFuZGxlKFNUREVSUiksCiAgICB9CgogICAgZGVmIHdpbmFwaV90ZXN0KCk6CiAgICAgICAgaGFuZGxlID0gaGFuZGxlc1tTVERPVVRdCiAgICAgICAgY3NiaSA9IENPTlNPTEVfU0NSRUVOX0JVRkZFUl9JTkZPKCkKICAgICAgICBzdWNjZXNzID0gX0dldENvbnNvbGVTY3JlZW5CdWZmZXJJbmZvKAogICAgICAgICAgICBoYW5kbGUsIGJ5cmVmKGNzYmkpKQogICAgICAgIHJldHVybiBib29sKHN1Y2Nlc3MpCgogICAgZGVmIEdldENvbnNvbGVTY3JlZW5CdWZmZXJJbmZvKHN0cmVhbV9pZD1TVERPVVQpOgogICAgICAgIGhhbmRsZSA9IGhhbmRsZXNbc3RyZWFtX2lkXQogICAgICAgIGNzYmkgPSBDT05TT0xFX1NDUkVFTl9CVUZGRVJfSU5GTygpCiAgICAgICAgc3VjY2VzcyA9IF9HZXRDb25zb2xlU2NyZWVuQnVmZmVySW5mbygKICAgICAgICAgICAgaGFuZGxlLCBieXJlZihjc2JpKSkKICAgICAgICByZXR1cm4gY3NiaQoKICAgIGRlZiBTZXRDb25zb2xlVGV4dEF0dHJpYnV0ZShzdHJlYW1faWQsIGF0dHJzKToKICAgICAgICBoYW5kbGUgPSBoYW5kbGVzW3N0cmVhbV9pZF0KICAgICAgICByZXR1cm4gX1NldENvbnNvbGVUZXh0QXR0cmlidXRlKGhhbmRsZSwgYXR0cnMpCgogICAgZGVmIFNldENvbnNvbGVDdXJzb3JQb3NpdGlvbihzdHJlYW1faWQsIHBvc2l0aW9uLCBhZGp1c3Q9VHJ1ZSk6CiAgICAgICAgcG9zaXRpb24gPSBDT09SRCgqcG9zaXRpb24pCiAgICAgICAgIyBJZiB0aGUgcG9zaXRpb24gaXMgb3V0IG9mIHJhbmdlLCBkbyBub3RoaW5nLgogICAgICAgIGlmIHBvc2l0aW9uLlkgPD0gMCBvciBwb3NpdGlvbi5YIDw9IDA6CiAgICAgICAgICAgIHJldHVybgogICAgICAgICMgQWRqdXN0IGZvciBXaW5kb3dzJyBTZXRDb25zb2xlQ3Vyc29yUG9zaXRpb246CiAgICAgICAgIyAgICAxLiBiZWluZyAwLWJhc2VkLCB3aGlsZSBBTlNJIGlzIDEtYmFzZWQuCiAgICAgICAgIyAgICAyLiBleHBlY3RpbmcgKHgseSksIHdoaWxlIEFOU0kgdXNlcyAoeSx4KS4KICAgICAgICBhZGp1c3RlZF9wb3NpdGlvbiA9IENPT1JEKHBvc2l0aW9uLlkgLSAxLCBwb3NpdGlvbi5YIC0gMSkKICAgICAgICBpZiBhZGp1c3Q6CiAgICAgICAgICAgICMgQWRqdXN0IGZvciB2aWV3cG9ydCdzIHNjcm9sbCBwb3NpdGlvbgogICAgICAgICAgICBzciA9IEdldENvbnNvbGVTY3JlZW5CdWZmZXJJbmZvKFNURE9VVCkuc3JXaW5kb3cKICAgICAgICAgICAgYWRqdXN0ZWRfcG9zaXRpb24uWSArPSBzci5Ub3AKICAgICAgICAgICAgYWRqdXN0ZWRfcG9zaXRpb24uWCArPSBzci5MZWZ0CiAgICAgICAgIyBSZXN1bWUgbm9ybWFsIHByb2Nlc3NpbmcKICAgICAgICBoYW5kbGUgPSBoYW5kbGVzW3N0cmVhbV9pZF0KICAgICAgICByZXR1cm4gX1NldENvbnNvbGVDdXJzb3JQb3NpdGlvbihoYW5kbGUsIGFkanVzdGVkX3Bvc2l0aW9uKQoKICAgIGRlZiBGaWxsQ29uc29sZU91dHB1dENoYXJhY3RlcihzdHJlYW1faWQsIGNoYXIsIGxlbmd0aCwgc3RhcnQpOgogICAgICAgIGhhbmRsZSA9IGhhbmRsZXNbc3RyZWFtX2lkXQogICAgICAgIGNoYXIgPSBjX2NoYXIoY2hhci5lbmNvZGUoKSkKICAgICAgICBsZW5ndGggPSB3aW50eXBlcy5EV09SRChsZW5ndGgpCiAgICAgICAgbnVtX3dyaXR0ZW4gPSB3aW50eXBlcy5EV09SRCgwKQogICAgICAgICMgTm90ZSB0aGF0IHRoaXMgaXMgaGFyZC1jb2RlZCBmb3IgQU5TSSAodnMgd2lkZSkgYnl0ZXMuCiAgICAgICAgc3VjY2VzcyA9IF9GaWxsQ29uc29sZU91dHB1dENoYXJhY3RlckEoCiAgICAgICAgICAgIGhhbmRsZSwgY2hhciwgbGVuZ3RoLCBzdGFydCwgYnlyZWYobnVtX3dyaXR0ZW4pKQogICAgICAgIHJldHVybiBudW1fd3JpdHRlbi52YWx1ZQoKICAgIGRlZiBGaWxsQ29uc29sZU91dHB1dEF0dHJpYnV0ZShzdHJlYW1faWQsIGF0dHIsIGxlbmd0aCwgc3RhcnQpOgogICAgICAgICcnJyBGaWxsQ29uc29sZU91dHB1dEF0dHJpYnV0ZSggaENvbnNvbGUsIGNzYmkud0F0dHJpYnV0ZXMsIGR3Q29uU2l6ZSwgY29vcmRTY3JlZW4sICZjQ2hhcnNXcml0dGVuICknJycKICAgICAgICBoYW5kbGUgPSBoYW5kbGVzW3N0cmVhbV9pZF0KICAgICAgICBhdHRyaWJ1dGUgPSB3aW50eXBlcy5XT1JEKGF0dHIpCiAgICAgICAgbGVuZ3RoID0gd2ludHlwZXMuRFdPUkQobGVuZ3RoKQogICAgICAgIG51bV93cml0dGVuID0gd2ludHlwZXMuRFdPUkQoMCkKICAgICAgICAjIE5vdGUgdGhhdCB0aGlzIGlzIGhhcmQtY29kZWQgZm9yIEFOU0kgKHZzIHdpZGUpIGJ5dGVzLgogICAgICAgIHJldHVybiBfRmlsbENvbnNvbGVPdXRwdXRBdHRyaWJ1dGUoCiAgICAgICAgICAgIGhhbmRsZSwgYXR0cmlidXRlLCBsZW5ndGgsIHN0YXJ0LCBieXJlZihudW1fd3JpdHRlbikpCgogICAgZGVmIFNldENvbnNvbGVUaXRsZSh0aXRsZSk6CiAgICAgICAgcmV0dXJuIF9TZXRDb25zb2xlVGl0bGVXKHRpdGxlKQpQSwMEFAAAAAAAAAAhAHd7ZyGSGAAAkhgAADwAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NvbG9yYW1hL3dpbnRlcm0ucHkjIENvcHlyaWdodCBKb25hdGhhbiBIYXJ0bGV5IDIwMTMuIEJTRCAzLUNsYXVzZSBsaWNlbnNlLCBzZWUgTElDRU5TRSBmaWxlLgpmcm9tIC4gaW1wb3J0IHdpbjMyCgoKIyBmcm9tIHdpbmNvbi5oCmNsYXNzIFdpbkNvbG9yKG9iamVjdCk6CiAgICBCTEFDSyAgID0gMAogICAgQkxVRSAgICA9IDEKICAgIEdSRUVOICAgPSAyCiAgICBDWUFOICAgID0gMwogICAgUkVEICAgICA9IDQKICAgIE1BR0VOVEEgPSA1CiAgICBZRUxMT1cgID0gNgogICAgR1JFWSAgICA9IDcKCiMgZnJvbSB3aW5jb24uaApjbGFzcyBXaW5TdHlsZShvYmplY3QpOgogICAgTk9STUFMICAgICAgICAgICAgICA9IDB4MDAgIyBkaW0gdGV4dCwgZGltIGJhY2tncm91bmQKICAgIEJSSUdIVCAgICAgICAgICAgICAgPSAweDA4ICMgYnJpZ2h0IHRleHQsIGRpbSBiYWNrZ3JvdW5kCiAgICBCUklHSFRfQkFDS0dST1VORCAgID0gMHg4MCAjIGRpbSB0ZXh0LCBicmlnaHQgYmFja2dyb3VuZAoKY2xhc3MgV2luVGVybShvYmplY3QpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzZWxmLl9kZWZhdWx0ID0gd2luMzIuR2V0Q29uc29sZVNjcmVlbkJ1ZmZlckluZm8od2luMzIuU1RET1VUKS53QXR0cmlidXRlcwogICAgICAgIHNlbGYuc2V0X2F0dHJzKHNlbGYuX2RlZmF1bHQpCiAgICAgICAgc2VsZi5fZGVmYXVsdF9mb3JlID0gc2VsZi5fZm9yZQogICAgICAgIHNlbGYuX2RlZmF1bHRfYmFjayA9IHNlbGYuX2JhY2sKICAgICAgICBzZWxmLl9kZWZhdWx0X3N0eWxlID0gc2VsZi5fc3R5bGUKICAgICAgICAjIEluIG9yZGVyIHRvIGVtdWxhdGUgTElHSFRfRVggaW4gd2luZG93cywgd2UgYm9ycm93IHRoZSBCUklHSFQgc3R5bGUuCiAgICAgICAgIyBTbyB0aGF0IExJR0hUX0VYIGNvbG9ycyBhbmQgQlJJR0hUIHN0eWxlIGRvIG5vdCBjbG9iYmVyIGVhY2ggb3RoZXIsCiAgICAgICAgIyB3ZSB0cmFjayB0aGVtIHNlcGFyYXRlbHksIHNpbmNlIExJR0hUX0VYIGlzIG92ZXJ3cml0dGVuIGJ5IEZvcmUvQmFjawogICAgICAgICMgYW5kIEJSSUdIVCBpcyBvdmVyd3JpdHRlbiBieSBTdHlsZSBjb2Rlcy4KICAgICAgICBzZWxmLl9saWdodCA9IDAKCiAgICBkZWYgZ2V0X2F0dHJzKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9mb3JlICsgc2VsZi5fYmFjayAqIDE2ICsgKHNlbGYuX3N0eWxlIHwgc2VsZi5fbGlnaHQpCgogICAgZGVmIHNldF9hdHRycyhzZWxmLCB2YWx1ZSk6CiAgICAgICAgc2VsZi5fZm9yZSA9IHZhbHVlICYgNwogICAgICAgIHNlbGYuX2JhY2sgPSAodmFsdWUgPj4gNCkgJiA3CiAgICAgICAgc2VsZi5fc3R5bGUgPSB2YWx1ZSAmIChXaW5TdHlsZS5CUklHSFQgfCBXaW5TdHlsZS5CUklHSFRfQkFDS0dST1VORCkKCiAgICBkZWYgcmVzZXRfYWxsKHNlbGYsIG9uX3N0ZGVycj1Ob25lKToKICAgICAgICBzZWxmLnNldF9hdHRycyhzZWxmLl9kZWZhdWx0KQogICAgICAgIHNlbGYuc2V0X2NvbnNvbGUoYXR0cnM9c2VsZi5fZGVmYXVsdCkKCiAgICBkZWYgZm9yZShzZWxmLCBmb3JlPU5vbmUsIGxpZ2h0PUZhbHNlLCBvbl9zdGRlcnI9RmFsc2UpOgogICAgICAgIGlmIGZvcmUgaXMgTm9uZToKICAgICAgICAgICAgZm9yZSA9IHNlbGYuX2RlZmF1bHRfZm9yZQogICAgICAgIHNlbGYuX2ZvcmUgPSBmb3JlCiAgICAgICAgIyBFbXVsYXRlIExJR0hUX0VYIHdpdGggQlJJR0hUIFN0eWxlCiAgICAgICAgaWYgbGlnaHQ6CiAgICAgICAgICAgIHNlbGYuX2xpZ2h0IHw9IFdpblN0eWxlLkJSSUdIVAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuX2xpZ2h0ICY9IH5XaW5TdHlsZS5CUklHSFQKICAgICAgICBzZWxmLnNldF9jb25zb2xlKG9uX3N0ZGVycj1vbl9zdGRlcnIpCgogICAgZGVmIGJhY2soc2VsZiwgYmFjaz1Ob25lLCBsaWdodD1GYWxzZSwgb25fc3RkZXJyPUZhbHNlKToKICAgICAgICBpZiBiYWNrIGlzIE5vbmU6CiAgICAgICAgICAgIGJhY2sgPSBzZWxmLl9kZWZhdWx0X2JhY2sKICAgICAgICBzZWxmLl9iYWNrID0gYmFjawogICAgICAgICMgRW11bGF0ZSBMSUdIVF9FWCB3aXRoIEJSSUdIVF9CQUNLR1JPVU5EIFN0eWxlCiAgICAgICAgaWYgbGlnaHQ6CiAgICAgICAgICAgIHNlbGYuX2xpZ2h0IHw9IFdpblN0eWxlLkJSSUdIVF9CQUNLR1JPVU5ECiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5fbGlnaHQgJj0gfldpblN0eWxlLkJSSUdIVF9CQUNLR1JPVU5ECiAgICAgICAgc2VsZi5zZXRfY29uc29sZShvbl9zdGRlcnI9b25fc3RkZXJyKQoKICAgIGRlZiBzdHlsZShzZWxmLCBzdHlsZT1Ob25lLCBvbl9zdGRlcnI9RmFsc2UpOgogICAgICAgIGlmIHN0eWxlIGlzIE5vbmU6CiAgICAgICAgICAgIHN0eWxlID0gc2VsZi5fZGVmYXVsdF9zdHlsZQogICAgICAgIHNlbGYuX3N0eWxlID0gc3R5bGUKICAgICAgICBzZWxmLnNldF9jb25zb2xlKG9uX3N0ZGVycj1vbl9zdGRlcnIpCgogICAgZGVmIHNldF9jb25zb2xlKHNlbGYsIGF0dHJzPU5vbmUsIG9uX3N0ZGVycj1GYWxzZSk6CiAgICAgICAgaWYgYXR0cnMgaXMgTm9uZToKICAgICAgICAgICAgYXR0cnMgPSBzZWxmLmdldF9hdHRycygpCiAgICAgICAgaGFuZGxlID0gd2luMzIuU1RET1VUCiAgICAgICAgaWYgb25fc3RkZXJyOgogICAgICAgICAgICBoYW5kbGUgPSB3aW4zMi5TVERFUlIKICAgICAgICB3aW4zMi5TZXRDb25zb2xlVGV4dEF0dHJpYnV0ZShoYW5kbGUsIGF0dHJzKQoKICAgIGRlZiBnZXRfcG9zaXRpb24oc2VsZiwgaGFuZGxlKToKICAgICAgICBwb3NpdGlvbiA9IHdpbjMyLkdldENvbnNvbGVTY3JlZW5CdWZmZXJJbmZvKGhhbmRsZSkuZHdDdXJzb3JQb3NpdGlvbgogICAgICAgICMgQmVjYXVzZSBXaW5kb3dzIGNvb3JkaW5hdGVzIGFyZSAwLWJhc2VkLAogICAgICAgICMgYW5kIHdpbjMyLlNldENvbnNvbGVDdXJzb3JQb3NpdGlvbiBleHBlY3RzIDEtYmFzZWQuCiAgICAgICAgcG9zaXRpb24uWCArPSAxCiAgICAgICAgcG9zaXRpb24uWSArPSAxCiAgICAgICAgcmV0dXJuIHBvc2l0aW9uCgogICAgZGVmIHNldF9jdXJzb3JfcG9zaXRpb24oc2VsZiwgcG9zaXRpb249Tm9uZSwgb25fc3RkZXJyPUZhbHNlKToKICAgICAgICBpZiBwb3NpdGlvbiBpcyBOb25lOgogICAgICAgICAgICAjIEknbSBub3QgY3VycmVudGx5IHRyYWNraW5nIHRoZSBwb3NpdGlvbiwgc28gdGhlcmUgaXMgbm8gZGVmYXVsdC4KICAgICAgICAgICAgIyBwb3NpdGlvbiA9IHNlbGYuZ2V0X3Bvc2l0aW9uKCkKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgaGFuZGxlID0gd2luMzIuU1RET1VUCiAgICAgICAgaWYgb25fc3RkZXJyOgogICAgICAgICAgICBoYW5kbGUgPSB3aW4zMi5TVERFUlIKICAgICAgICB3aW4zMi5TZXRDb25zb2xlQ3Vyc29yUG9zaXRpb24oaGFuZGxlLCBwb3NpdGlvbikKCiAgICBkZWYgY3Vyc29yX2FkanVzdChzZWxmLCB4LCB5LCBvbl9zdGRlcnI9RmFsc2UpOgogICAgICAgIGhhbmRsZSA9IHdpbjMyLlNURE9VVAogICAgICAgIGlmIG9uX3N0ZGVycjoKICAgICAgICAgICAgaGFuZGxlID0gd2luMzIuU1RERVJSCiAgICAgICAgcG9zaXRpb24gPSBzZWxmLmdldF9wb3NpdGlvbihoYW5kbGUpCiAgICAgICAgYWRqdXN0ZWRfcG9zaXRpb24gPSAocG9zaXRpb24uWSArIHksIHBvc2l0aW9uLlggKyB4KQogICAgICAgIHdpbjMyLlNldENvbnNvbGVDdXJzb3JQb3NpdGlvbihoYW5kbGUsIGFkanVzdGVkX3Bvc2l0aW9uLCBhZGp1c3Q9RmFsc2UpCgogICAgZGVmIGVyYXNlX3NjcmVlbihzZWxmLCBtb2RlPTAsIG9uX3N0ZGVycj1GYWxzZSk6CiAgICAgICAgIyAwIHNob3VsZCBjbGVhciBmcm9tIHRoZSBjdXJzb3IgdG8gdGhlIGVuZCBvZiB0aGUgc2NyZWVuLgogICAgICAgICMgMSBzaG91bGQgY2xlYXIgZnJvbSB0aGUgY3Vyc29yIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNjcmVlbi4KICAgICAgICAjIDIgc2hvdWxkIGNsZWFyIHRoZSBlbnRpcmUgc2NyZWVuLCBhbmQgbW92ZSBjdXJzb3IgdG8gKDEsMSkKICAgICAgICBoYW5kbGUgPSB3aW4zMi5TVERPVVQKICAgICAgICBpZiBvbl9zdGRlcnI6CiAgICAgICAgICAgIGhhbmRsZSA9IHdpbjMyLlNUREVSUgogICAgICAgIGNzYmkgPSB3aW4zMi5HZXRDb25zb2xlU2NyZWVuQnVmZmVySW5mbyhoYW5kbGUpCiAgICAgICAgIyBnZXQgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXIgY2VsbHMgaW4gdGhlIGN1cnJlbnQgYnVmZmVyCiAgICAgICAgY2VsbHNfaW5fc2NyZWVuID0gY3NiaS5kd1NpemUuWCAqIGNzYmkuZHdTaXplLlkKICAgICAgICAjIGdldCBudW1iZXIgb2YgY2hhcmFjdGVyIGNlbGxzIGJlZm9yZSBjdXJyZW50IGN1cnNvciBwb3NpdGlvbgogICAgICAgIGNlbGxzX2JlZm9yZV9jdXJzb3IgPSBjc2JpLmR3U2l6ZS5YICogY3NiaS5kd0N1cnNvclBvc2l0aW9uLlkgKyBjc2JpLmR3Q3Vyc29yUG9zaXRpb24uWAogICAgICAgIGlmIG1vZGUgPT0gMDoKICAgICAgICAgICAgZnJvbV9jb29yZCA9IGNzYmkuZHdDdXJzb3JQb3NpdGlvbgogICAgICAgICAgICBjZWxsc190b19lcmFzZSA9IGNlbGxzX2luX3NjcmVlbiAtIGNlbGxzX2JlZm9yZV9jdXJzb3IKICAgICAgICBpZiBtb2RlID09IDE6CiAgICAgICAgICAgIGZyb21fY29vcmQgPSB3aW4zMi5DT09SRCgwLCAwKQogICAgICAgICAgICBjZWxsc190b19lcmFzZSA9IGNlbGxzX2JlZm9yZV9jdXJzb3IKICAgICAgICBlbGlmIG1vZGUgPT0gMjoKICAgICAgICAgICAgZnJvbV9jb29yZCA9IHdpbjMyLkNPT1JEKDAsIDApCiAgICAgICAgICAgIGNlbGxzX3RvX2VyYXNlID0gY2VsbHNfaW5fc2NyZWVuCiAgICAgICAgIyBmaWxsIHRoZSBlbnRpcmUgc2NyZWVuIHdpdGggYmxhbmtzCiAgICAgICAgd2luMzIuRmlsbENvbnNvbGVPdXRwdXRDaGFyYWN0ZXIoaGFuZGxlLCAnICcsIGNlbGxzX3RvX2VyYXNlLCBmcm9tX2Nvb3JkKQogICAgICAgICMgbm93IHNldCB0aGUgYnVmZmVyJ3MgYXR0cmlidXRlcyBhY2NvcmRpbmdseQogICAgICAgIHdpbjMyLkZpbGxDb25zb2xlT3V0cHV0QXR0cmlidXRlKGhhbmRsZSwgc2VsZi5nZXRfYXR0cnMoKSwgY2VsbHNfdG9fZXJhc2UsIGZyb21fY29vcmQpCiAgICAgICAgaWYgbW9kZSA9PSAyOgogICAgICAgICAgICAjIHB1dCB0aGUgY3Vyc29yIHdoZXJlIG5lZWRlZAogICAgICAgICAgICB3aW4zMi5TZXRDb25zb2xlQ3Vyc29yUG9zaXRpb24oaGFuZGxlLCAoMSwgMSkpCgogICAgZGVmIGVyYXNlX2xpbmUoc2VsZiwgbW9kZT0wLCBvbl9zdGRlcnI9RmFsc2UpOgogICAgICAgICMgMCBzaG91bGQgY2xlYXIgZnJvbSB0aGUgY3Vyc29yIHRvIHRoZSBlbmQgb2YgdGhlIGxpbmUuCiAgICAgICAgIyAxIHNob3VsZCBjbGVhciBmcm9tIHRoZSBjdXJzb3IgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZS4KICAgICAgICAjIDIgc2hvdWxkIGNsZWFyIHRoZSBlbnRpcmUgbGluZS4KICAgICAgICBoYW5kbGUgPSB3aW4zMi5TVERPVVQKICAgICAgICBpZiBvbl9zdGRlcnI6CiAgICAgICAgICAgIGhhbmRsZSA9IHdpbjMyLlNUREVSUgogICAgICAgIGNzYmkgPSB3aW4zMi5HZXRDb25zb2xlU2NyZWVuQnVmZmVySW5mbyhoYW5kbGUpCiAgICAgICAgaWYgbW9kZSA9PSAwOgogICAgICAgICAgICBmcm9tX2Nvb3JkID0gY3NiaS5kd0N1cnNvclBvc2l0aW9uCiAgICAgICAgICAgIGNlbGxzX3RvX2VyYXNlID0gY3NiaS5kd1NpemUuWCAtIGNzYmkuZHdDdXJzb3JQb3NpdGlvbi5YCiAgICAgICAgaWYgbW9kZSA9PSAxOgogICAgICAgICAgICBmcm9tX2Nvb3JkID0gd2luMzIuQ09PUkQoMCwgY3NiaS5kd0N1cnNvclBvc2l0aW9uLlkpCiAgICAgICAgICAgIGNlbGxzX3RvX2VyYXNlID0gY3NiaS5kd0N1cnNvclBvc2l0aW9uLlgKICAgICAgICBlbGlmIG1vZGUgPT0gMjoKICAgICAgICAgICAgZnJvbV9jb29yZCA9IHdpbjMyLkNPT1JEKDAsIGNzYmkuZHdDdXJzb3JQb3NpdGlvbi5ZKQogICAgICAgICAgICBjZWxsc190b19lcmFzZSA9IGNzYmkuZHdTaXplLlgKICAgICAgICAjIGZpbGwgdGhlIGVudGlyZSBzY3JlZW4gd2l0aCBibGFua3MKICAgICAgICB3aW4zMi5GaWxsQ29uc29sZU91dHB1dENoYXJhY3RlcihoYW5kbGUsICcgJywgY2VsbHNfdG9fZXJhc2UsIGZyb21fY29vcmQpCiAgICAgICAgIyBub3cgc2V0IHRoZSBidWZmZXIncyBhdHRyaWJ1dGVzIGFjY29yZGluZ2x5CiAgICAgICAgd2luMzIuRmlsbENvbnNvbGVPdXRwdXRBdHRyaWJ1dGUoaGFuZGxlLCBzZWxmLmdldF9hdHRycygpLCBjZWxsc190b19lcmFzZSwgZnJvbV9jb29yZCkKCiAgICBkZWYgc2V0X3RpdGxlKHNlbGYsIHRpdGxlKToKICAgICAgICB3aW4zMi5TZXRDb25zb2xlVGl0bGUodGl0bGUpClBLAwQUAAAAAAAAACEAJpxRl0UCAABFAgAAPAAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvZGlzdGxpYi9fX2luaXRfXy5weSMgLSotIGNvZGluZzogdXRmLTggLSotCiMKIyBDb3B5cmlnaHQgKEMpIDIwMTItMjAxNiBWaW5heSBTYWppcC4KIyBMaWNlbnNlZCB0byB0aGUgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24gdW5kZXIgYSBjb250cmlidXRvciBhZ3JlZW1lbnQuCiMgU2VlIExJQ0VOU0UudHh0IGFuZCBDT05UUklCVVRPUlMudHh0LgojCmltcG9ydCBsb2dnaW5nCgpfX3ZlcnNpb25fXyA9ICcwLjIuNCcKCmNsYXNzIERpc3RsaWJFeGNlcHRpb24oRXhjZXB0aW9uKToKICAgIHBhc3MKCnRyeToKICAgIGZyb20gbG9nZ2luZyBpbXBvcnQgTnVsbEhhbmRsZXIKZXhjZXB0IEltcG9ydEVycm9yOiAjIHByYWdtYTogbm8gY292ZXIKICAgIGNsYXNzIE51bGxIYW5kbGVyKGxvZ2dpbmcuSGFuZGxlcik6CiAgICAgICAgZGVmIGhhbmRsZShzZWxmLCByZWNvcmQpOiBwYXNzCiAgICAgICAgZGVmIGVtaXQoc2VsZiwgcmVjb3JkKTogcGFzcwogICAgICAgIGRlZiBjcmVhdGVMb2NrKHNlbGYpOiBzZWxmLmxvY2sgPSBOb25lCgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKbG9nZ2VyLmFkZEhhbmRsZXIoTnVsbEhhbmRsZXIoKSkKUEsDBBQAAAAAAAAAIQAj72f8EgEAABIBAABGAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0bGliL19iYWNrcG9ydC9fX2luaXRfXy5weSIiIk1vZHVsZXMgY29waWVkIGZyb20gUHl0aG9uIDMgc3RhbmRhcmQgbGlicmFyaWVzLCBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuCgpJbmRpdmlkdWFsIGNsYXNzZXMgYW5kIGZ1bmN0aW9ucyBhcmUgZm91bmQgaW4gZDIuX2JhY2twb3J0Lm1pc2MuICBJbnRlbmRlZAp1c2FnZSBpcyB0byBhbHdheXMgaW1wb3J0IHRoaW5ncyBtaXNzaW5nIGZyb20gMy4xIGZyb20gdGhhdCBtb2R1bGU6IHRoZQpidWlsdC1pbi9zdGRsaWIgb2JqZWN0cyB3aWxsIGJlIHVzZWQgaWYgZm91bmQuCiIiIgpQSwMEFAAAAAAAAAAhAK+KL2XLAwAAywMAAEIAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvX2JhY2twb3J0L21pc2MucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQojCiMgQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbi4KIyBTZWUgTElDRU5TRS50eHQgYW5kIENPTlRSSUJVVE9SUy50eHQuCiMKIiIiQmFja3BvcnRzIGZvciBpbmRpdmlkdWFsIGNsYXNzZXMgYW5kIGZ1bmN0aW9ucy4iIiIKCmltcG9ydCBvcwppbXBvcnQgc3lzCgpfX2FsbF9fID0gWydjYWNoZV9mcm9tX3NvdXJjZScsICdjYWxsYWJsZScsICdmc2VuY29kZSddCgoKdHJ5OgogICAgZnJvbSBpbXAgaW1wb3J0IGNhY2hlX2Zyb21fc291cmNlCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGRlZiBjYWNoZV9mcm9tX3NvdXJjZShweV9maWxlLCBkZWJ1Zz1fX2RlYnVnX18pOgogICAgICAgIGV4dCA9IGRlYnVnIGFuZCAnYycgb3IgJ28nCiAgICAgICAgcmV0dXJuIHB5X2ZpbGUgKyBleHQKCgp0cnk6CiAgICBjYWxsYWJsZSA9IGNhbGxhYmxlCmV4Y2VwdCBOYW1lRXJyb3I6CiAgICBmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBDYWxsYWJsZQoKICAgIGRlZiBjYWxsYWJsZShvYmopOgogICAgICAgIHJldHVybiBpc2luc3RhbmNlKG9iaiwgQ2FsbGFibGUpCgoKdHJ5OgogICAgZnNlbmNvZGUgPSBvcy5mc2VuY29kZQpleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICBkZWYgZnNlbmNvZGUoZmlsZW5hbWUpOgogICAgICAgIGlmIGlzaW5zdGFuY2UoZmlsZW5hbWUsIGJ5dGVzKToKICAgICAgICAgICAgcmV0dXJuIGZpbGVuYW1lCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKGZpbGVuYW1lLCBzdHIpOgogICAgICAgICAgICByZXR1cm4gZmlsZW5hbWUuZW5jb2RlKHN5cy5nZXRmaWxlc3lzdGVtZW5jb2RpbmcoKSkKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoImV4cGVjdCBieXRlcyBvciBzdHIsIG5vdCAlcyIgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZShmaWxlbmFtZSkuX19uYW1lX18pClBLAwQUAAAAAAAAACEA4mI90C9kAAAvZAAARAAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvZGlzdGxpYi9fYmFja3BvcnQvc2h1dGlsLnB5IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KIwojIENvcHlyaWdodCAoQykgMjAxMiBUaGUgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24uCiMgU2VlIExJQ0VOU0UudHh0IGFuZCBDT05UUklCVVRPUlMudHh0LgojCiIiIlV0aWxpdHkgZnVuY3Rpb25zIGZvciBjb3B5aW5nIGFuZCBhcmNoaXZpbmcgZmlsZXMgYW5kIGRpcmVjdG9yeSB0cmVlcy4KClhYWCBUaGUgZnVuY3Rpb25zIGhlcmUgZG9uJ3QgY29weSB0aGUgcmVzb3VyY2UgZm9yayBvciBvdGhlciBtZXRhZGF0YSBvbiBNYWMuCgoiIiIKCmltcG9ydCBvcwppbXBvcnQgc3lzCmltcG9ydCBzdGF0CmZyb20gb3MucGF0aCBpbXBvcnQgYWJzcGF0aAppbXBvcnQgZm5tYXRjaAppbXBvcnQgY29sbGVjdGlvbnMKaW1wb3J0IGVycm5vCmZyb20gLiBpbXBvcnQgdGFyZmlsZQoKdHJ5OgogICAgaW1wb3J0IGJ6MgogICAgX0JaMl9TVVBQT1JURUQgPSBUcnVlCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIF9CWjJfU1VQUE9SVEVEID0gRmFsc2UKCnRyeToKICAgIGZyb20gcHdkIGltcG9ydCBnZXRwd25hbQpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBnZXRwd25hbSA9IE5vbmUKCnRyeToKICAgIGZyb20gZ3JwIGltcG9ydCBnZXRncm5hbQpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBnZXRncm5hbSA9IE5vbmUKCl9fYWxsX18gPSBbImNvcHlmaWxlb2JqIiwgImNvcHlmaWxlIiwgImNvcHltb2RlIiwgImNvcHlzdGF0IiwgImNvcHkiLCAiY29weTIiLAogICAgICAgICAgICJjb3B5dHJlZSIsICJtb3ZlIiwgInJtdHJlZSIsICJFcnJvciIsICJTcGVjaWFsRmlsZUVycm9yIiwKICAgICAgICAgICAiRXhlY0Vycm9yIiwgIm1ha2VfYXJjaGl2ZSIsICJnZXRfYXJjaGl2ZV9mb3JtYXRzIiwKICAgICAgICAgICAicmVnaXN0ZXJfYXJjaGl2ZV9mb3JtYXQiLCAidW5yZWdpc3Rlcl9hcmNoaXZlX2Zvcm1hdCIsCiAgICAgICAgICAgImdldF91bnBhY2tfZm9ybWF0cyIsICJyZWdpc3Rlcl91bnBhY2tfZm9ybWF0IiwKICAgICAgICAgICAidW5yZWdpc3Rlcl91bnBhY2tfZm9ybWF0IiwgInVucGFja19hcmNoaXZlIiwgImlnbm9yZV9wYXR0ZXJucyJdCgpjbGFzcyBFcnJvcihFbnZpcm9ubWVudEVycm9yKToKICAgIHBhc3MKCmNsYXNzIFNwZWNpYWxGaWxlRXJyb3IoRW52aXJvbm1lbnRFcnJvcik6CiAgICAiIiJSYWlzZWQgd2hlbiB0cnlpbmcgdG8gZG8gYSBraW5kIG9mIG9wZXJhdGlvbiAoZS5nLiBjb3B5aW5nKSB3aGljaCBpcwogICAgbm90IHN1cHBvcnRlZCBvbiBhIHNwZWNpYWwgZmlsZSAoZS5nLiBhIG5hbWVkIHBpcGUpIiIiCgpjbGFzcyBFeGVjRXJyb3IoRW52aXJvbm1lbnRFcnJvcik6CiAgICAiIiJSYWlzZWQgd2hlbiBhIGNvbW1hbmQgY291bGQgbm90IGJlIGV4ZWN1dGVkIiIiCgpjbGFzcyBSZWFkRXJyb3IoRW52aXJvbm1lbnRFcnJvcik6CiAgICAiIiJSYWlzZWQgd2hlbiBhbiBhcmNoaXZlIGNhbm5vdCBiZSByZWFkIiIiCgpjbGFzcyBSZWdpc3RyeUVycm9yKEV4Y2VwdGlvbik6CiAgICAiIiJSYWlzZWQgd2hlbiBhIHJlZ2lzdHJ5IG9wZXJhdGlvbiB3aXRoIHRoZSBhcmNoaXZpbmcKICAgIGFuZCB1bnBhY2tpbmcgcmVnaXN0cmllcyBmYWlscyIiIgoKCnRyeToKICAgIFdpbmRvd3NFcnJvcgpleGNlcHQgTmFtZUVycm9yOgogICAgV2luZG93c0Vycm9yID0gTm9uZQoKZGVmIGNvcHlmaWxlb2JqKGZzcmMsIGZkc3QsIGxlbmd0aD0xNioxMDI0KToKICAgICIiImNvcHkgZGF0YSBmcm9tIGZpbGUtbGlrZSBvYmplY3QgZnNyYyB0byBmaWxlLWxpa2Ugb2JqZWN0IGZkc3QiIiIKICAgIHdoaWxlIDE6CiAgICAgICAgYnVmID0gZnNyYy5yZWFkKGxlbmd0aCkKICAgICAgICBpZiBub3QgYnVmOgogICAgICAgICAgICBicmVhawogICAgICAgIGZkc3Qud3JpdGUoYnVmKQoKZGVmIF9zYW1lZmlsZShzcmMsIGRzdCk6CiAgICAjIE1hY2ludG9zaCwgVW5peC4KICAgIGlmIGhhc2F0dHIob3MucGF0aCwgJ3NhbWVmaWxlJyk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gb3MucGF0aC5zYW1lZmlsZShzcmMsIGRzdCkKICAgICAgICBleGNlcHQgT1NFcnJvcjoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgIyBBbGwgb3RoZXIgcGxhdGZvcm1zOiBjaGVjayBmb3Igc2FtZSBwYXRobmFtZS4KICAgIHJldHVybiAob3MucGF0aC5ub3JtY2FzZShvcy5wYXRoLmFic3BhdGgoc3JjKSkgPT0KICAgICAgICAgICAgb3MucGF0aC5ub3JtY2FzZShvcy5wYXRoLmFic3BhdGgoZHN0KSkpCgpkZWYgY29weWZpbGUoc3JjLCBkc3QpOgogICAgIiIiQ29weSBkYXRhIGZyb20gc3JjIHRvIGRzdCIiIgogICAgaWYgX3NhbWVmaWxlKHNyYywgZHN0KToKICAgICAgICByYWlzZSBFcnJvcigiYCVzYCBhbmQgYCVzYCBhcmUgdGhlIHNhbWUgZmlsZSIgJSAoc3JjLCBkc3QpKQoKICAgIGZvciBmbiBpbiBbc3JjLCBkc3RdOgogICAgICAgIHRyeToKICAgICAgICAgICAgc3QgPSBvcy5zdGF0KGZuKQogICAgICAgIGV4Y2VwdCBPU0Vycm9yOgogICAgICAgICAgICAjIEZpbGUgbW9zdCBsaWtlbHkgZG9lcyBub3QgZXhpc3QKICAgICAgICAgICAgcGFzcwogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgWFhYIFdoYXQgYWJvdXQgb3RoZXIgc3BlY2lhbCBmaWxlcz8gKHNvY2tldHMsIGRldmljZXMuLi4pCiAgICAgICAgICAgIGlmIHN0YXQuU19JU0ZJRk8oc3Quc3RfbW9kZSk6CiAgICAgICAgICAgICAgICByYWlzZSBTcGVjaWFsRmlsZUVycm9yKCJgJXNgIGlzIGEgbmFtZWQgcGlwZSIgJSBmbikKCiAgICB3aXRoIG9wZW4oc3JjLCAncmInKSBhcyBmc3JjOgogICAgICAgIHdpdGggb3Blbihkc3QsICd3YicpIGFzIGZkc3Q6CiAgICAgICAgICAgIGNvcHlmaWxlb2JqKGZzcmMsIGZkc3QpCgpkZWYgY29weW1vZGUoc3JjLCBkc3QpOgogICAgIiIiQ29weSBtb2RlIGJpdHMgZnJvbSBzcmMgdG8gZHN0IiIiCiAgICBpZiBoYXNhdHRyKG9zLCAnY2htb2QnKToKICAgICAgICBzdCA9IG9zLnN0YXQoc3JjKQogICAgICAgIG1vZGUgPSBzdGF0LlNfSU1PREUoc3Quc3RfbW9kZSkKICAgICAgICBvcy5jaG1vZChkc3QsIG1vZGUpCgpkZWYgY29weXN0YXQoc3JjLCBkc3QpOgogICAgIiIiQ29weSBhbGwgc3RhdCBpbmZvIChtb2RlIGJpdHMsIGF0aW1lLCBtdGltZSwgZmxhZ3MpIGZyb20gc3JjIHRvIGRzdCIiIgogICAgc3QgPSBvcy5zdGF0KHNyYykKICAgIG1vZGUgPSBzdGF0LlNfSU1PREUoc3Quc3RfbW9kZSkKICAgIGlmIGhhc2F0dHIob3MsICd1dGltZScpOgogICAgICAgIG9zLnV0aW1lKGRzdCwgKHN0LnN0X2F0aW1lLCBzdC5zdF9tdGltZSkpCiAgICBpZiBoYXNhdHRyKG9zLCAnY2htb2QnKToKICAgICAgICBvcy5jaG1vZChkc3QsIG1vZGUpCiAgICBpZiBoYXNhdHRyKG9zLCAnY2hmbGFncycpIGFuZCBoYXNhdHRyKHN0LCAnc3RfZmxhZ3MnKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIG9zLmNoZmxhZ3MoZHN0LCBzdC5zdF9mbGFncykKICAgICAgICBleGNlcHQgT1NFcnJvciBhcyB3aHk6CiAgICAgICAgICAgIGlmIChub3QgaGFzYXR0cihlcnJubywgJ0VPUE5PVFNVUFAnKSBvcgogICAgICAgICAgICAgICAgd2h5LmVycm5vICE9IGVycm5vLkVPUE5PVFNVUFApOgogICAgICAgICAgICAgICAgcmFpc2UKCmRlZiBjb3B5KHNyYywgZHN0KToKICAgICIiIkNvcHkgZGF0YSBhbmQgbW9kZSBiaXRzICgiY3Agc3JjIGRzdCIpLgoKICAgIFRoZSBkZXN0aW5hdGlvbiBtYXkgYmUgYSBkaXJlY3RvcnkuCgogICAgIiIiCiAgICBpZiBvcy5wYXRoLmlzZGlyKGRzdCk6CiAgICAgICAgZHN0ID0gb3MucGF0aC5qb2luKGRzdCwgb3MucGF0aC5iYXNlbmFtZShzcmMpKQogICAgY29weWZpbGUoc3JjLCBkc3QpCiAgICBjb3B5bW9kZShzcmMsIGRzdCkKCmRlZiBjb3B5MihzcmMsIGRzdCk6CiAgICAiIiJDb3B5IGRhdGEgYW5kIGFsbCBzdGF0IGluZm8gKCJjcCAtcCBzcmMgZHN0IikuCgogICAgVGhlIGRlc3RpbmF0aW9uIG1heSBiZSBhIGRpcmVjdG9yeS4KCiAgICAiIiIKICAgIGlmIG9zLnBhdGguaXNkaXIoZHN0KToKICAgICAgICBkc3QgPSBvcy5wYXRoLmpvaW4oZHN0LCBvcy5wYXRoLmJhc2VuYW1lKHNyYykpCiAgICBjb3B5ZmlsZShzcmMsIGRzdCkKICAgIGNvcHlzdGF0KHNyYywgZHN0KQoKZGVmIGlnbm9yZV9wYXR0ZXJucygqcGF0dGVybnMpOgogICAgIiIiRnVuY3Rpb24gdGhhdCBjYW4gYmUgdXNlZCBhcyBjb3B5dHJlZSgpIGlnbm9yZSBwYXJhbWV0ZXIuCgogICAgUGF0dGVybnMgaXMgYSBzZXF1ZW5jZSBvZiBnbG9iLXN0eWxlIHBhdHRlcm5zCiAgICB0aGF0IGFyZSB1c2VkIHRvIGV4Y2x1ZGUgZmlsZXMiIiIKICAgIGRlZiBfaWdub3JlX3BhdHRlcm5zKHBhdGgsIG5hbWVzKToKICAgICAgICBpZ25vcmVkX25hbWVzID0gW10KICAgICAgICBmb3IgcGF0dGVybiBpbiBwYXR0ZXJuczoKICAgICAgICAgICAgaWdub3JlZF9uYW1lcy5leHRlbmQoZm5tYXRjaC5maWx0ZXIobmFtZXMsIHBhdHRlcm4pKQogICAgICAgIHJldHVybiBzZXQoaWdub3JlZF9uYW1lcykKICAgIHJldHVybiBfaWdub3JlX3BhdHRlcm5zCgpkZWYgY29weXRyZWUoc3JjLCBkc3QsIHN5bWxpbmtzPUZhbHNlLCBpZ25vcmU9Tm9uZSwgY29weV9mdW5jdGlvbj1jb3B5MiwKICAgICAgICAgICAgIGlnbm9yZV9kYW5nbGluZ19zeW1saW5rcz1GYWxzZSk6CiAgICAiIiJSZWN1cnNpdmVseSBjb3B5IGEgZGlyZWN0b3J5IHRyZWUuCgogICAgVGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBtdXN0IG5vdCBhbHJlYWR5IGV4aXN0LgogICAgSWYgZXhjZXB0aW9uKHMpIG9jY3VyLCBhbiBFcnJvciBpcyByYWlzZWQgd2l0aCBhIGxpc3Qgb2YgcmVhc29ucy4KCiAgICBJZiB0aGUgb3B0aW9uYWwgc3ltbGlua3MgZmxhZyBpcyB0cnVlLCBzeW1ib2xpYyBsaW5rcyBpbiB0aGUKICAgIHNvdXJjZSB0cmVlIHJlc3VsdCBpbiBzeW1ib2xpYyBsaW5rcyBpbiB0aGUgZGVzdGluYXRpb24gdHJlZTsgaWYKICAgIGl0IGlzIGZhbHNlLCB0aGUgY29udGVudHMgb2YgdGhlIGZpbGVzIHBvaW50ZWQgdG8gYnkgc3ltYm9saWMKICAgIGxpbmtzIGFyZSBjb3BpZWQuIElmIHRoZSBmaWxlIHBvaW50ZWQgYnkgdGhlIHN5bWxpbmsgZG9lc24ndAogICAgZXhpc3QsIGFuIGV4Y2VwdGlvbiB3aWxsIGJlIGFkZGVkIGluIHRoZSBsaXN0IG9mIGVycm9ycyByYWlzZWQgaW4KICAgIGFuIEVycm9yIGV4Y2VwdGlvbiBhdCB0aGUgZW5kIG9mIHRoZSBjb3B5IHByb2Nlc3MuCgogICAgWW91IGNhbiBzZXQgdGhlIG9wdGlvbmFsIGlnbm9yZV9kYW5nbGluZ19zeW1saW5rcyBmbGFnIHRvIHRydWUgaWYgeW91CiAgICB3YW50IHRvIHNpbGVuY2UgdGhpcyBleGNlcHRpb24uIE5vdGljZSB0aGF0IHRoaXMgaGFzIG5vIGVmZmVjdCBvbgogICAgcGxhdGZvcm1zIHRoYXQgZG9uJ3Qgc3VwcG9ydCBvcy5zeW1saW5rLgoKICAgIFRoZSBvcHRpb25hbCBpZ25vcmUgYXJndW1lbnQgaXMgYSBjYWxsYWJsZS4gSWYgZ2l2ZW4sIGl0CiAgICBpcyBjYWxsZWQgd2l0aCB0aGUgYHNyY2AgcGFyYW1ldGVyLCB3aGljaCBpcyB0aGUgZGlyZWN0b3J5CiAgICBiZWluZyB2aXNpdGVkIGJ5IGNvcHl0cmVlKCksIGFuZCBgbmFtZXNgIHdoaWNoIGlzIHRoZSBsaXN0IG9mCiAgICBgc3JjYCBjb250ZW50cywgYXMgcmV0dXJuZWQgYnkgb3MubGlzdGRpcigpOgoKICAgICAgICBjYWxsYWJsZShzcmMsIG5hbWVzKSAtPiBpZ25vcmVkX25hbWVzCgogICAgU2luY2UgY29weXRyZWUoKSBpcyBjYWxsZWQgcmVjdXJzaXZlbHksIHRoZSBjYWxsYWJsZSB3aWxsIGJlCiAgICBjYWxsZWQgb25jZSBmb3IgZWFjaCBkaXJlY3RvcnkgdGhhdCBpcyBjb3BpZWQuIEl0IHJldHVybnMgYQogICAgbGlzdCBvZiBuYW1lcyByZWxhdGl2ZSB0byB0aGUgYHNyY2AgZGlyZWN0b3J5IHRoYXQgc2hvdWxkCiAgICBub3QgYmUgY29waWVkLgoKICAgIFRoZSBvcHRpb25hbCBjb3B5X2Z1bmN0aW9uIGFyZ3VtZW50IGlzIGEgY2FsbGFibGUgdGhhdCB3aWxsIGJlIHVzZWQKICAgIHRvIGNvcHkgZWFjaCBmaWxlLiBJdCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBzb3VyY2UgcGF0aCBhbmQgdGhlCiAgICBkZXN0aW5hdGlvbiBwYXRoIGFzIGFyZ3VtZW50cy4gQnkgZGVmYXVsdCwgY29weTIoKSBpcyB1c2VkLCBidXQgYW55CiAgICBmdW5jdGlvbiB0aGF0IHN1cHBvcnRzIHRoZSBzYW1lIHNpZ25hdHVyZSAobGlrZSBjb3B5KCkpIGNhbiBiZSB1c2VkLgoKICAgICIiIgogICAgbmFtZXMgPSBvcy5saXN0ZGlyKHNyYykKICAgIGlmIGlnbm9yZSBpcyBub3QgTm9uZToKICAgICAgICBpZ25vcmVkX25hbWVzID0gaWdub3JlKHNyYywgbmFtZXMpCiAgICBlbHNlOgogICAgICAgIGlnbm9yZWRfbmFtZXMgPSBzZXQoKQoKICAgIG9zLm1ha2VkaXJzKGRzdCkKICAgIGVycm9ycyA9IFtdCiAgICBmb3IgbmFtZSBpbiBuYW1lczoKICAgICAgICBpZiBuYW1lIGluIGlnbm9yZWRfbmFtZXM6CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgc3JjbmFtZSA9IG9zLnBhdGguam9pbihzcmMsIG5hbWUpCiAgICAgICAgZHN0bmFtZSA9IG9zLnBhdGguam9pbihkc3QsIG5hbWUpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBpZiBvcy5wYXRoLmlzbGluayhzcmNuYW1lKToKICAgICAgICAgICAgICAgIGxpbmt0byA9IG9zLnJlYWRsaW5rKHNyY25hbWUpCiAgICAgICAgICAgICAgICBpZiBzeW1saW5rczoKICAgICAgICAgICAgICAgICAgICBvcy5zeW1saW5rKGxpbmt0bywgZHN0bmFtZSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgIyBpZ25vcmUgZGFuZ2xpbmcgc3ltbGluayBpZiB0aGUgZmxhZyBpcyBvbgogICAgICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhsaW5rdG8pIGFuZCBpZ25vcmVfZGFuZ2xpbmdfc3ltbGlua3M6CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgICAgIyBvdGhlcndpc2UgbGV0IHRoZSBjb3B5IG9jY3Vycy4gY29weTIgd2lsbCByYWlzZSBhbiBlcnJvcgogICAgICAgICAgICAgICAgICAgIGNvcHlfZnVuY3Rpb24oc3JjbmFtZSwgZHN0bmFtZSkKICAgICAgICAgICAgZWxpZiBvcy5wYXRoLmlzZGlyKHNyY25hbWUpOgogICAgICAgICAgICAgICAgY29weXRyZWUoc3JjbmFtZSwgZHN0bmFtZSwgc3ltbGlua3MsIGlnbm9yZSwgY29weV9mdW5jdGlvbikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgV2lsbCByYWlzZSBhIFNwZWNpYWxGaWxlRXJyb3IgZm9yIHVuc3VwcG9ydGVkIGZpbGUgdHlwZXMKICAgICAgICAgICAgICAgIGNvcHlfZnVuY3Rpb24oc3JjbmFtZSwgZHN0bmFtZSkKICAgICAgICAjIGNhdGNoIHRoZSBFcnJvciBmcm9tIHRoZSByZWN1cnNpdmUgY29weXRyZWUgc28gdGhhdCB3ZSBjYW4KICAgICAgICAjIGNvbnRpbnVlIHdpdGggb3RoZXIgZmlsZXMKICAgICAgICBleGNlcHQgRXJyb3IgYXMgZXJyOgogICAgICAgICAgICBlcnJvcnMuZXh0ZW5kKGVyci5hcmdzWzBdKQogICAgICAgIGV4Y2VwdCBFbnZpcm9ubWVudEVycm9yIGFzIHdoeToKICAgICAgICAgICAgZXJyb3JzLmFwcGVuZCgoc3JjbmFtZSwgZHN0bmFtZSwgc3RyKHdoeSkpKQogICAgdHJ5OgogICAgICAgIGNvcHlzdGF0KHNyYywgZHN0KQogICAgZXhjZXB0IE9TRXJyb3IgYXMgd2h5OgogICAgICAgIGlmIFdpbmRvd3NFcnJvciBpcyBub3QgTm9uZSBhbmQgaXNpbnN0YW5jZSh3aHksIFdpbmRvd3NFcnJvcik6CiAgICAgICAgICAgICMgQ29weWluZyBmaWxlIGFjY2VzcyB0aW1lcyBtYXkgZmFpbCBvbiBXaW5kb3dzCiAgICAgICAgICAgIHBhc3MKICAgICAgICBlbHNlOgogICAgICAgICAgICBlcnJvcnMuZXh0ZW5kKChzcmMsIGRzdCwgc3RyKHdoeSkpKQogICAgaWYgZXJyb3JzOgogICAgICAgIHJhaXNlIEVycm9yKGVycm9ycykKCmRlZiBybXRyZWUocGF0aCwgaWdub3JlX2Vycm9ycz1GYWxzZSwgb25lcnJvcj1Ob25lKToKICAgICIiIlJlY3Vyc2l2ZWx5IGRlbGV0ZSBhIGRpcmVjdG9yeSB0cmVlLgoKICAgIElmIGlnbm9yZV9lcnJvcnMgaXMgc2V0LCBlcnJvcnMgYXJlIGlnbm9yZWQ7IG90aGVyd2lzZSwgaWYgb25lcnJvcgogICAgaXMgc2V0LCBpdCBpcyBjYWxsZWQgdG8gaGFuZGxlIHRoZSBlcnJvciB3aXRoIGFyZ3VtZW50cyAoZnVuYywKICAgIHBhdGgsIGV4Y19pbmZvKSB3aGVyZSBmdW5jIGlzIG9zLmxpc3RkaXIsIG9zLnJlbW92ZSwgb3Igb3Mucm1kaXI7CiAgICBwYXRoIGlzIHRoZSBhcmd1bWVudCB0byB0aGF0IGZ1bmN0aW9uIHRoYXQgY2F1c2VkIGl0IHRvIGZhaWw7IGFuZAogICAgZXhjX2luZm8gaXMgYSB0dXBsZSByZXR1cm5lZCBieSBzeXMuZXhjX2luZm8oKS4gIElmIGlnbm9yZV9lcnJvcnMKICAgIGlzIGZhbHNlIGFuZCBvbmVycm9yIGlzIE5vbmUsIGFuIGV4Y2VwdGlvbiBpcyByYWlzZWQuCgogICAgIiIiCiAgICBpZiBpZ25vcmVfZXJyb3JzOgogICAgICAgIGRlZiBvbmVycm9yKCphcmdzKToKICAgICAgICAgICAgcGFzcwogICAgZWxpZiBvbmVycm9yIGlzIE5vbmU6CiAgICAgICAgZGVmIG9uZXJyb3IoKmFyZ3MpOgogICAgICAgICAgICByYWlzZQogICAgdHJ5OgogICAgICAgIGlmIG9zLnBhdGguaXNsaW5rKHBhdGgpOgogICAgICAgICAgICAjIHN5bWxpbmtzIHRvIGRpcmVjdG9yaWVzIGFyZSBmb3JiaWRkZW4sIHNlZSBidWcgIzE2NjkKICAgICAgICAgICAgcmFpc2UgT1NFcnJvcigiQ2Fubm90IGNhbGwgcm10cmVlIG9uIGEgc3ltYm9saWMgbGluayIpCiAgICBleGNlcHQgT1NFcnJvcjoKICAgICAgICBvbmVycm9yKG9zLnBhdGguaXNsaW5rLCBwYXRoLCBzeXMuZXhjX2luZm8oKSkKICAgICAgICAjIGNhbid0IGNvbnRpbnVlIGV2ZW4gaWYgb25lcnJvciBob29rIHJldHVybnMKICAgICAgICByZXR1cm4KICAgIG5hbWVzID0gW10KICAgIHRyeToKICAgICAgICBuYW1lcyA9IG9zLmxpc3RkaXIocGF0aCkKICAgIGV4Y2VwdCBvcy5lcnJvcjoKICAgICAgICBvbmVycm9yKG9zLmxpc3RkaXIsIHBhdGgsIHN5cy5leGNfaW5mbygpKQogICAgZm9yIG5hbWUgaW4gbmFtZXM6CiAgICAgICAgZnVsbG5hbWUgPSBvcy5wYXRoLmpvaW4ocGF0aCwgbmFtZSkKICAgICAgICB0cnk6CiAgICAgICAgICAgIG1vZGUgPSBvcy5sc3RhdChmdWxsbmFtZSkuc3RfbW9kZQogICAgICAgIGV4Y2VwdCBvcy5lcnJvcjoKICAgICAgICAgICAgbW9kZSA9IDAKICAgICAgICBpZiBzdGF0LlNfSVNESVIobW9kZSk6CiAgICAgICAgICAgIHJtdHJlZShmdWxsbmFtZSwgaWdub3JlX2Vycm9ycywgb25lcnJvcikKICAgICAgICBlbHNlOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBvcy5yZW1vdmUoZnVsbG5hbWUpCiAgICAgICAgICAgIGV4Y2VwdCBvcy5lcnJvcjoKICAgICAgICAgICAgICAgIG9uZXJyb3Iob3MucmVtb3ZlLCBmdWxsbmFtZSwgc3lzLmV4Y19pbmZvKCkpCiAgICB0cnk6CiAgICAgICAgb3Mucm1kaXIocGF0aCkKICAgIGV4Y2VwdCBvcy5lcnJvcjoKICAgICAgICBvbmVycm9yKG9zLnJtZGlyLCBwYXRoLCBzeXMuZXhjX2luZm8oKSkKCgpkZWYgX2Jhc2VuYW1lKHBhdGgpOgogICAgIyBBIGJhc2VuYW1lKCkgdmFyaWFudCB3aGljaCBmaXJzdCBzdHJpcHMgdGhlIHRyYWlsaW5nIHNsYXNoLCBpZiBwcmVzZW50LgogICAgIyBUaHVzIHdlIGFsd2F5cyBnZXQgdGhlIGxhc3QgY29tcG9uZW50IG9mIHRoZSBwYXRoLCBldmVuIGZvciBkaXJlY3Rvcmllcy4KICAgIHJldHVybiBvcy5wYXRoLmJhc2VuYW1lKHBhdGgucnN0cmlwKG9zLnBhdGguc2VwKSkKCmRlZiBtb3ZlKHNyYywgZHN0KToKICAgICIiIlJlY3Vyc2l2ZWx5IG1vdmUgYSBmaWxlIG9yIGRpcmVjdG9yeSB0byBhbm90aGVyIGxvY2F0aW9uLiBUaGlzIGlzCiAgICBzaW1pbGFyIHRvIHRoZSBVbml4ICJtdiIgY29tbWFuZC4KCiAgICBJZiB0aGUgZGVzdGluYXRpb24gaXMgYSBkaXJlY3Rvcnkgb3IgYSBzeW1saW5rIHRvIGEgZGlyZWN0b3J5LCB0aGUgc291cmNlCiAgICBpcyBtb3ZlZCBpbnNpZGUgdGhlIGRpcmVjdG9yeS4gVGhlIGRlc3RpbmF0aW9uIHBhdGggbXVzdCBub3QgYWxyZWFkeQogICAgZXhpc3QuCgogICAgSWYgdGhlIGRlc3RpbmF0aW9uIGFscmVhZHkgZXhpc3RzIGJ1dCBpcyBub3QgYSBkaXJlY3RvcnksIGl0IG1heSBiZQogICAgb3ZlcndyaXR0ZW4gZGVwZW5kaW5nIG9uIG9zLnJlbmFtZSgpIHNlbWFudGljcy4KCiAgICBJZiB0aGUgZGVzdGluYXRpb24gaXMgb24gb3VyIGN1cnJlbnQgZmlsZXN5c3RlbSwgdGhlbiByZW5hbWUoKSBpcyB1c2VkLgogICAgT3RoZXJ3aXNlLCBzcmMgaXMgY29waWVkIHRvIHRoZSBkZXN0aW5hdGlvbiBhbmQgdGhlbiByZW1vdmVkLgogICAgQSBsb3QgbW9yZSBjb3VsZCBiZSBkb25lIGhlcmUuLi4gIEEgbG9vayBhdCBhIG12LmMgc2hvd3MgYSBsb3Qgb2YKICAgIHRoZSBpc3N1ZXMgdGhpcyBpbXBsZW1lbnRhdGlvbiBnbG9zc2VzIG92ZXIuCgogICAgIiIiCiAgICByZWFsX2RzdCA9IGRzdAogICAgaWYgb3MucGF0aC5pc2Rpcihkc3QpOgogICAgICAgIGlmIF9zYW1lZmlsZShzcmMsIGRzdCk6CiAgICAgICAgICAgICMgV2UgbWlnaHQgYmUgb24gYSBjYXNlIGluc2Vuc2l0aXZlIGZpbGVzeXN0ZW0sCiAgICAgICAgICAgICMgcGVyZm9ybSB0aGUgcmVuYW1lIGFueXdheS4KICAgICAgICAgICAgb3MucmVuYW1lKHNyYywgZHN0KQogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgcmVhbF9kc3QgPSBvcy5wYXRoLmpvaW4oZHN0LCBfYmFzZW5hbWUoc3JjKSkKICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhyZWFsX2RzdCk6CiAgICAgICAgICAgIHJhaXNlIEVycm9yKCJEZXN0aW5hdGlvbiBwYXRoICclcycgYWxyZWFkeSBleGlzdHMiICUgcmVhbF9kc3QpCiAgICB0cnk6CiAgICAgICAgb3MucmVuYW1lKHNyYywgcmVhbF9kc3QpCiAgICBleGNlcHQgT1NFcnJvcjoKICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKHNyYyk6CiAgICAgICAgICAgIGlmIF9kZXN0aW5zcmMoc3JjLCBkc3QpOgogICAgICAgICAgICAgICAgcmFpc2UgRXJyb3IoIkNhbm5vdCBtb3ZlIGEgZGlyZWN0b3J5ICclcycgaW50byBpdHNlbGYgJyVzJy4iICUgKHNyYywgZHN0KSkKICAgICAgICAgICAgY29weXRyZWUoc3JjLCByZWFsX2RzdCwgc3ltbGlua3M9VHJ1ZSkKICAgICAgICAgICAgcm10cmVlKHNyYykKICAgICAgICBlbHNlOgogICAgICAgICAgICBjb3B5MihzcmMsIHJlYWxfZHN0KQogICAgICAgICAgICBvcy51bmxpbmsoc3JjKQoKZGVmIF9kZXN0aW5zcmMoc3JjLCBkc3QpOgogICAgc3JjID0gYWJzcGF0aChzcmMpCiAgICBkc3QgPSBhYnNwYXRoKGRzdCkKICAgIGlmIG5vdCBzcmMuZW5kc3dpdGgob3MucGF0aC5zZXApOgogICAgICAgIHNyYyArPSBvcy5wYXRoLnNlcAogICAgaWYgbm90IGRzdC5lbmRzd2l0aChvcy5wYXRoLnNlcCk6CiAgICAgICAgZHN0ICs9IG9zLnBhdGguc2VwCiAgICByZXR1cm4gZHN0LnN0YXJ0c3dpdGgoc3JjKQoKZGVmIF9nZXRfZ2lkKG5hbWUpOgogICAgIiIiUmV0dXJucyBhIGdpZCwgZ2l2ZW4gYSBncm91cCBuYW1lLiIiIgogICAgaWYgZ2V0Z3JuYW0gaXMgTm9uZSBvciBuYW1lIGlzIE5vbmU6CiAgICAgICAgcmV0dXJuIE5vbmUKICAgIHRyeToKICAgICAgICByZXN1bHQgPSBnZXRncm5hbShuYW1lKQogICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgIHJlc3VsdCA9IE5vbmUKICAgIGlmIHJlc3VsdCBpcyBub3QgTm9uZToKICAgICAgICByZXR1cm4gcmVzdWx0WzJdCiAgICByZXR1cm4gTm9uZQoKZGVmIF9nZXRfdWlkKG5hbWUpOgogICAgIiIiUmV0dXJucyBhbiB1aWQsIGdpdmVuIGEgdXNlciBuYW1lLiIiIgogICAgaWYgZ2V0cHduYW0gaXMgTm9uZSBvciBuYW1lIGlzIE5vbmU6CiAgICAgICAgcmV0dXJuIE5vbmUKICAgIHRyeToKICAgICAgICByZXN1bHQgPSBnZXRwd25hbShuYW1lKQogICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgIHJlc3VsdCA9IE5vbmUKICAgIGlmIHJlc3VsdCBpcyBub3QgTm9uZToKICAgICAgICByZXR1cm4gcmVzdWx0WzJdCiAgICByZXR1cm4gTm9uZQoKZGVmIF9tYWtlX3RhcmJhbGwoYmFzZV9uYW1lLCBiYXNlX2RpciwgY29tcHJlc3M9Imd6aXAiLCB2ZXJib3NlPTAsIGRyeV9ydW49MCwKICAgICAgICAgICAgICAgICAgb3duZXI9Tm9uZSwgZ3JvdXA9Tm9uZSwgbG9nZ2VyPU5vbmUpOgogICAgIiIiQ3JlYXRlIGEgKHBvc3NpYmx5IGNvbXByZXNzZWQpIHRhciBmaWxlIGZyb20gYWxsIHRoZSBmaWxlcyB1bmRlcgogICAgJ2Jhc2VfZGlyJy4KCiAgICAnY29tcHJlc3MnIG11c3QgYmUgImd6aXAiICh0aGUgZGVmYXVsdCksICJiemlwMiIsIG9yIE5vbmUuCgogICAgJ293bmVyJyBhbmQgJ2dyb3VwJyBjYW4gYmUgdXNlZCB0byBkZWZpbmUgYW4gb3duZXIgYW5kIGEgZ3JvdXAgZm9yIHRoZQogICAgYXJjaGl2ZSB0aGF0IGlzIGJlaW5nIGJ1aWx0LiBJZiBub3QgcHJvdmlkZWQsIHRoZSBjdXJyZW50IG93bmVyIGFuZCBncm91cAogICAgd2lsbCBiZSB1c2VkLgoKICAgIFRoZSBvdXRwdXQgdGFyIGZpbGUgd2lsbCBiZSBuYW1lZCAnYmFzZV9uYW1lJyArICAiLnRhciIsIHBvc3NpYmx5IHBsdXMKICAgIHRoZSBhcHByb3ByaWF0ZSBjb21wcmVzc2lvbiBleHRlbnNpb24gKCIuZ3oiLCBvciAiLmJ6MiIpLgoKICAgIFJldHVybnMgdGhlIG91dHB1dCBmaWxlbmFtZS4KICAgICIiIgogICAgdGFyX2NvbXByZXNzaW9uID0geydnemlwJzogJ2d6JywgTm9uZTogJyd9CiAgICBjb21wcmVzc19leHQgPSB7J2d6aXAnOiAnLmd6J30KCiAgICBpZiBfQloyX1NVUFBPUlRFRDoKICAgICAgICB0YXJfY29tcHJlc3Npb25bJ2J6aXAyJ10gPSAnYnoyJwogICAgICAgIGNvbXByZXNzX2V4dFsnYnppcDInXSA9ICcuYnoyJwoKICAgICMgZmxhZ3MgZm9yIGNvbXByZXNzaW9uIHByb2dyYW0sIGVhY2ggZWxlbWVudCBvZiBsaXN0IHdpbGwgYmUgYW4gYXJndW1lbnQKICAgIGlmIGNvbXByZXNzIGlzIG5vdCBOb25lIGFuZCBjb21wcmVzcyBub3QgaW4gY29tcHJlc3NfZXh0OgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImJhZCB2YWx1ZSBmb3IgJ2NvbXByZXNzJywgb3IgY29tcHJlc3Npb24gZm9ybWF0IG5vdCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAic3VwcG9ydGVkIDogezB9Ii5mb3JtYXQoY29tcHJlc3MpKQoKICAgIGFyY2hpdmVfbmFtZSA9IGJhc2VfbmFtZSArICcudGFyJyArIGNvbXByZXNzX2V4dC5nZXQoY29tcHJlc3MsICcnKQogICAgYXJjaGl2ZV9kaXIgPSBvcy5wYXRoLmRpcm5hbWUoYXJjaGl2ZV9uYW1lKQoKICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhhcmNoaXZlX2Rpcik6CiAgICAgICAgaWYgbG9nZ2VyIGlzIG5vdCBOb25lOgogICAgICAgICAgICBsb2dnZXIuaW5mbygiY3JlYXRpbmcgJXMiLCBhcmNoaXZlX2RpcikKICAgICAgICBpZiBub3QgZHJ5X3J1bjoKICAgICAgICAgICAgb3MubWFrZWRpcnMoYXJjaGl2ZV9kaXIpCgogICAgIyBjcmVhdGluZyB0aGUgdGFyYmFsbAogICAgaWYgbG9nZ2VyIGlzIG5vdCBOb25lOgogICAgICAgIGxvZ2dlci5pbmZvKCdDcmVhdGluZyB0YXIgYXJjaGl2ZScpCgogICAgdWlkID0gX2dldF91aWQob3duZXIpCiAgICBnaWQgPSBfZ2V0X2dpZChncm91cCkKCiAgICBkZWYgX3NldF91aWRfZ2lkKHRhcmluZm8pOgogICAgICAgIGlmIGdpZCBpcyBub3QgTm9uZToKICAgICAgICAgICAgdGFyaW5mby5naWQgPSBnaWQKICAgICAgICAgICAgdGFyaW5mby5nbmFtZSA9IGdyb3VwCiAgICAgICAgaWYgdWlkIGlzIG5vdCBOb25lOgogICAgICAgICAgICB0YXJpbmZvLnVpZCA9IHVpZAogICAgICAgICAgICB0YXJpbmZvLnVuYW1lID0gb3duZXIKICAgICAgICByZXR1cm4gdGFyaW5mbwoKICAgIGlmIG5vdCBkcnlfcnVuOgogICAgICAgIHRhciA9IHRhcmZpbGUub3BlbihhcmNoaXZlX25hbWUsICd3fCVzJyAlIHRhcl9jb21wcmVzc2lvbltjb21wcmVzc10pCiAgICAgICAgdHJ5OgogICAgICAgICAgICB0YXIuYWRkKGJhc2VfZGlyLCBmaWx0ZXI9X3NldF91aWRfZ2lkKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIHRhci5jbG9zZSgpCgogICAgcmV0dXJuIGFyY2hpdmVfbmFtZQoKZGVmIF9jYWxsX2V4dGVybmFsX3ppcChiYXNlX2RpciwgemlwX2ZpbGVuYW1lLCB2ZXJib3NlPUZhbHNlLCBkcnlfcnVuPUZhbHNlKToKICAgICMgWFhYIHNlZSBpZiB3ZSB3YW50IHRvIGtlZXAgYW4gZXh0ZXJuYWwgY2FsbCBoZXJlCiAgICBpZiB2ZXJib3NlOgogICAgICAgIHppcG9wdGlvbnMgPSAiLXIiCiAgICBlbHNlOgogICAgICAgIHppcG9wdGlvbnMgPSAiLXJxIgogICAgZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNFeGVjRXJyb3IKICAgIGZyb20gZGlzdHV0aWxzLnNwYXduIGltcG9ydCBzcGF3bgogICAgdHJ5OgogICAgICAgIHNwYXduKFsiemlwIiwgemlwb3B0aW9ucywgemlwX2ZpbGVuYW1lLCBiYXNlX2Rpcl0sIGRyeV9ydW49ZHJ5X3J1bikKICAgIGV4Y2VwdCBEaXN0dXRpbHNFeGVjRXJyb3I6CiAgICAgICAgIyBYWFggcmVhbGx5IHNob3VsZCBkaXN0aW5ndWlzaCBiZXR3ZWVuICJjb3VsZG4ndCBmaW5kCiAgICAgICAgIyBleHRlcm5hbCAnemlwJyBjb21tYW5kIiBhbmQgInppcCBmYWlsZWQiLgogICAgICAgIHJhaXNlIEV4ZWNFcnJvcigidW5hYmxlIHRvIGNyZWF0ZSB6aXAgZmlsZSAnJXMnOiAiCiAgICAgICAgICAgICJjb3VsZCBuZWl0aGVyIGltcG9ydCB0aGUgJ3ppcGZpbGUnIG1vZHVsZSBub3IgIgogICAgICAgICAgICAiZmluZCBhIHN0YW5kYWxvbmUgemlwIHV0aWxpdHkiKSAlIHppcF9maWxlbmFtZQoKZGVmIF9tYWtlX3ppcGZpbGUoYmFzZV9uYW1lLCBiYXNlX2RpciwgdmVyYm9zZT0wLCBkcnlfcnVuPTAsIGxvZ2dlcj1Ob25lKToKICAgICIiIkNyZWF0ZSBhIHppcCBmaWxlIGZyb20gYWxsIHRoZSBmaWxlcyB1bmRlciAnYmFzZV9kaXInLgoKICAgIFRoZSBvdXRwdXQgemlwIGZpbGUgd2lsbCBiZSBuYW1lZCAnYmFzZV9uYW1lJyArICIuemlwIi4gIFVzZXMgZWl0aGVyIHRoZQogICAgInppcGZpbGUiIFB5dGhvbiBtb2R1bGUgKGlmIGF2YWlsYWJsZSkgb3IgdGhlIEluZm9aSVAgInppcCIgdXRpbGl0eQogICAgKGlmIGluc3RhbGxlZCBhbmQgZm91bmQgb24gdGhlIGRlZmF1bHQgc2VhcmNoIHBhdGgpLiAgSWYgbmVpdGhlciB0b29sIGlzCiAgICBhdmFpbGFibGUsIHJhaXNlcyBFeGVjRXJyb3IuICBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBvdXRwdXQgemlwCiAgICBmaWxlLgogICAgIiIiCiAgICB6aXBfZmlsZW5hbWUgPSBiYXNlX25hbWUgKyAiLnppcCIKICAgIGFyY2hpdmVfZGlyID0gb3MucGF0aC5kaXJuYW1lKGJhc2VfbmFtZSkKCiAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoYXJjaGl2ZV9kaXIpOgogICAgICAgIGlmIGxvZ2dlciBpcyBub3QgTm9uZToKICAgICAgICAgICAgbG9nZ2VyLmluZm8oImNyZWF0aW5nICVzIiwgYXJjaGl2ZV9kaXIpCiAgICAgICAgaWYgbm90IGRyeV9ydW46CiAgICAgICAgICAgIG9zLm1ha2VkaXJzKGFyY2hpdmVfZGlyKQoKICAgICMgSWYgemlwZmlsZSBtb2R1bGUgaXMgbm90IGF2YWlsYWJsZSwgdHJ5IHNwYXduaW5nIGFuIGV4dGVybmFsICd6aXAnCiAgICAjIGNvbW1hbmQuCiAgICB0cnk6CiAgICAgICAgaW1wb3J0IHppcGZpbGUKICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICB6aXBmaWxlID0gTm9uZQoKICAgIGlmIHppcGZpbGUgaXMgTm9uZToKICAgICAgICBfY2FsbF9leHRlcm5hbF96aXAoYmFzZV9kaXIsIHppcF9maWxlbmFtZSwgdmVyYm9zZSwgZHJ5X3J1bikKICAgIGVsc2U6CiAgICAgICAgaWYgbG9nZ2VyIGlzIG5vdCBOb25lOgogICAgICAgICAgICBsb2dnZXIuaW5mbygiY3JlYXRpbmcgJyVzJyBhbmQgYWRkaW5nICclcycgdG8gaXQiLAogICAgICAgICAgICAgICAgICAgICAgICB6aXBfZmlsZW5hbWUsIGJhc2VfZGlyKQoKICAgICAgICBpZiBub3QgZHJ5X3J1bjoKICAgICAgICAgICAgemlwID0gemlwZmlsZS5aaXBGaWxlKHppcF9maWxlbmFtZSwgInciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3Npb249emlwZmlsZS5aSVBfREVGTEFURUQpCgogICAgICAgICAgICBmb3IgZGlycGF0aCwgZGlybmFtZXMsIGZpbGVuYW1lcyBpbiBvcy53YWxrKGJhc2VfZGlyKToKICAgICAgICAgICAgICAgIGZvciBuYW1lIGluIGZpbGVuYW1lczoKICAgICAgICAgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5ub3JtcGF0aChvcy5wYXRoLmpvaW4oZGlycGF0aCwgbmFtZSkpCiAgICAgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUocGF0aCk6CiAgICAgICAgICAgICAgICAgICAgICAgIHppcC53cml0ZShwYXRoLCBwYXRoKQogICAgICAgICAgICAgICAgICAgICAgICBpZiBsb2dnZXIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygiYWRkaW5nICclcyciLCBwYXRoKQogICAgICAgICAgICB6aXAuY2xvc2UoKQoKICAgIHJldHVybiB6aXBfZmlsZW5hbWUKCl9BUkNISVZFX0ZPUk1BVFMgPSB7CiAgICAnZ3p0YXInOiAoX21ha2VfdGFyYmFsbCwgWygnY29tcHJlc3MnLCAnZ3ppcCcpXSwgImd6aXAnZWQgdGFyLWZpbGUiKSwKICAgICdienRhcic6IChfbWFrZV90YXJiYWxsLCBbKCdjb21wcmVzcycsICdiemlwMicpXSwgImJ6aXAyJ2VkIHRhci1maWxlIiksCiAgICAndGFyJzogICAoX21ha2VfdGFyYmFsbCwgWygnY29tcHJlc3MnLCBOb25lKV0sICJ1bmNvbXByZXNzZWQgdGFyIGZpbGUiKSwKICAgICd6aXAnOiAgIChfbWFrZV96aXBmaWxlLCBbXSwgIlpJUCBmaWxlIiksCiAgICB9CgppZiBfQloyX1NVUFBPUlRFRDoKICAgIF9BUkNISVZFX0ZPUk1BVFNbJ2J6dGFyJ10gPSAoX21ha2VfdGFyYmFsbCwgWygnY29tcHJlc3MnLCAnYnppcDInKV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ6aXAyJ2VkIHRhci1maWxlIikKCmRlZiBnZXRfYXJjaGl2ZV9mb3JtYXRzKCk6CiAgICAiIiJSZXR1cm5zIGEgbGlzdCBvZiBzdXBwb3J0ZWQgZm9ybWF0cyBmb3IgYXJjaGl2aW5nIGFuZCB1bmFyY2hpdmluZy4KCiAgICBFYWNoIGVsZW1lbnQgb2YgdGhlIHJldHVybmVkIHNlcXVlbmNlIGlzIGEgdHVwbGUgKG5hbWUsIGRlc2NyaXB0aW9uKQogICAgIiIiCiAgICBmb3JtYXRzID0gWyhuYW1lLCByZWdpc3RyeVsyXSkgZm9yIG5hbWUsIHJlZ2lzdHJ5IGluCiAgICAgICAgICAgICAgIF9BUkNISVZFX0ZPUk1BVFMuaXRlbXMoKV0KICAgIGZvcm1hdHMuc29ydCgpCiAgICByZXR1cm4gZm9ybWF0cwoKZGVmIHJlZ2lzdGVyX2FyY2hpdmVfZm9ybWF0KG5hbWUsIGZ1bmN0aW9uLCBleHRyYV9hcmdzPU5vbmUsIGRlc2NyaXB0aW9uPScnKToKICAgICIiIlJlZ2lzdGVycyBhbiBhcmNoaXZlIGZvcm1hdC4KCiAgICBuYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBmb3JtYXQuIGZ1bmN0aW9uIGlzIHRoZSBjYWxsYWJsZSB0aGF0IHdpbGwgYmUKICAgIHVzZWQgdG8gY3JlYXRlIGFyY2hpdmVzLiBJZiBwcm92aWRlZCwgZXh0cmFfYXJncyBpcyBhIHNlcXVlbmNlIG9mCiAgICAobmFtZSwgdmFsdWUpIHR1cGxlcyB0aGF0IHdpbGwgYmUgcGFzc2VkIGFzIGFyZ3VtZW50cyB0byB0aGUgY2FsbGFibGUuCiAgICBkZXNjcmlwdGlvbiBjYW4gYmUgcHJvdmlkZWQgdG8gZGVzY3JpYmUgdGhlIGZvcm1hdCwgYW5kIHdpbGwgYmUgcmV0dXJuZWQKICAgIGJ5IHRoZSBnZXRfYXJjaGl2ZV9mb3JtYXRzKCkgZnVuY3Rpb24uCiAgICAiIiIKICAgIGlmIGV4dHJhX2FyZ3MgaXMgTm9uZToKICAgICAgICBleHRyYV9hcmdzID0gW10KICAgIGlmIG5vdCBpc2luc3RhbmNlKGZ1bmN0aW9uLCBjb2xsZWN0aW9ucy5DYWxsYWJsZSk6CiAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdUaGUgJXMgb2JqZWN0IGlzIG5vdCBjYWxsYWJsZScgJSBmdW5jdGlvbikKICAgIGlmIG5vdCBpc2luc3RhbmNlKGV4dHJhX2FyZ3MsICh0dXBsZSwgbGlzdCkpOgogICAgICAgIHJhaXNlIFR5cGVFcnJvcignZXh0cmFfYXJncyBuZWVkcyB0byBiZSBhIHNlcXVlbmNlJykKICAgIGZvciBlbGVtZW50IGluIGV4dHJhX2FyZ3M6CiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZWxlbWVudCwgKHR1cGxlLCBsaXN0KSkgb3IgbGVuKGVsZW1lbnQpICE9MjoKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdleHRyYV9hcmdzIGVsZW1lbnRzIGFyZSA6IChhcmdfbmFtZSwgdmFsdWUpJykKCiAgICBfQVJDSElWRV9GT1JNQVRTW25hbWVdID0gKGZ1bmN0aW9uLCBleHRyYV9hcmdzLCBkZXNjcmlwdGlvbikKCmRlZiB1bnJlZ2lzdGVyX2FyY2hpdmVfZm9ybWF0KG5hbWUpOgogICAgZGVsIF9BUkNISVZFX0ZPUk1BVFNbbmFtZV0KCmRlZiBtYWtlX2FyY2hpdmUoYmFzZV9uYW1lLCBmb3JtYXQsIHJvb3RfZGlyPU5vbmUsIGJhc2VfZGlyPU5vbmUsIHZlcmJvc2U9MCwKICAgICAgICAgICAgICAgICBkcnlfcnVuPTAsIG93bmVyPU5vbmUsIGdyb3VwPU5vbmUsIGxvZ2dlcj1Ob25lKToKICAgICIiIkNyZWF0ZSBhbiBhcmNoaXZlIGZpbGUgKGVnLiB6aXAgb3IgdGFyKS4KCiAgICAnYmFzZV9uYW1lJyBpcyB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0byBjcmVhdGUsIG1pbnVzIGFueSBmb3JtYXQtc3BlY2lmaWMKICAgIGV4dGVuc2lvbjsgJ2Zvcm1hdCcgaXMgdGhlIGFyY2hpdmUgZm9ybWF0OiBvbmUgb2YgInppcCIsICJ0YXIiLCAiYnp0YXIiCiAgICBvciAiZ3p0YXIiLgoKICAgICdyb290X2RpcicgaXMgYSBkaXJlY3RvcnkgdGhhdCB3aWxsIGJlIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGUKICAgIGFyY2hpdmU7IGllLiB3ZSB0eXBpY2FsbHkgY2hkaXIgaW50byAncm9vdF9kaXInIGJlZm9yZSBjcmVhdGluZyB0aGUKICAgIGFyY2hpdmUuICAnYmFzZV9kaXInIGlzIHRoZSBkaXJlY3Rvcnkgd2hlcmUgd2Ugc3RhcnQgYXJjaGl2aW5nIGZyb207CiAgICBpZS4gJ2Jhc2VfZGlyJyB3aWxsIGJlIHRoZSBjb21tb24gcHJlZml4IG9mIGFsbCBmaWxlcyBhbmQKICAgIGRpcmVjdG9yaWVzIGluIHRoZSBhcmNoaXZlLiAgJ3Jvb3RfZGlyJyBhbmQgJ2Jhc2VfZGlyJyBib3RoIGRlZmF1bHQKICAgIHRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4gIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGFyY2hpdmUgZmlsZS4KCiAgICAnb3duZXInIGFuZCAnZ3JvdXAnIGFyZSB1c2VkIHdoZW4gY3JlYXRpbmcgYSB0YXIgYXJjaGl2ZS4gQnkgZGVmYXVsdCwKICAgIHVzZXMgdGhlIGN1cnJlbnQgb3duZXIgYW5kIGdyb3VwLgogICAgIiIiCiAgICBzYXZlX2N3ZCA9IG9zLmdldGN3ZCgpCiAgICBpZiByb290X2RpciBpcyBub3QgTm9uZToKICAgICAgICBpZiBsb2dnZXIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygiY2hhbmdpbmcgaW50byAnJXMnIiwgcm9vdF9kaXIpCiAgICAgICAgYmFzZV9uYW1lID0gb3MucGF0aC5hYnNwYXRoKGJhc2VfbmFtZSkKICAgICAgICBpZiBub3QgZHJ5X3J1bjoKICAgICAgICAgICAgb3MuY2hkaXIocm9vdF9kaXIpCgogICAgaWYgYmFzZV9kaXIgaXMgTm9uZToKICAgICAgICBiYXNlX2RpciA9IG9zLmN1cmRpcgoKICAgIGt3YXJncyA9IHsnZHJ5X3J1bic6IGRyeV9ydW4sICdsb2dnZXInOiBsb2dnZXJ9CgogICAgdHJ5OgogICAgICAgIGZvcm1hdF9pbmZvID0gX0FSQ0hJVkVfRk9STUFUU1tmb3JtYXRdCiAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigidW5rbm93biBhcmNoaXZlIGZvcm1hdCAnJXMnIiAlIGZvcm1hdCkKCiAgICBmdW5jID0gZm9ybWF0X2luZm9bMF0KICAgIGZvciBhcmcsIHZhbCBpbiBmb3JtYXRfaW5mb1sxXToKICAgICAgICBrd2FyZ3NbYXJnXSA9IHZhbAoKICAgIGlmIGZvcm1hdCAhPSAnemlwJzoKICAgICAgICBrd2FyZ3NbJ293bmVyJ10gPSBvd25lcgogICAgICAgIGt3YXJnc1snZ3JvdXAnXSA9IGdyb3VwCgogICAgdHJ5OgogICAgICAgIGZpbGVuYW1lID0gZnVuYyhiYXNlX25hbWUsIGJhc2VfZGlyLCAqKmt3YXJncykKICAgIGZpbmFsbHk6CiAgICAgICAgaWYgcm9vdF9kaXIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGlmIGxvZ2dlciBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygiY2hhbmdpbmcgYmFjayB0byAnJXMnIiwgc2F2ZV9jd2QpCiAgICAgICAgICAgIG9zLmNoZGlyKHNhdmVfY3dkKQoKICAgIHJldHVybiBmaWxlbmFtZQoKCmRlZiBnZXRfdW5wYWNrX2Zvcm1hdHMoKToKICAgICIiIlJldHVybnMgYSBsaXN0IG9mIHN1cHBvcnRlZCBmb3JtYXRzIGZvciB1bnBhY2tpbmcuCgogICAgRWFjaCBlbGVtZW50IG9mIHRoZSByZXR1cm5lZCBzZXF1ZW5jZSBpcyBhIHR1cGxlCiAgICAobmFtZSwgZXh0ZW5zaW9ucywgZGVzY3JpcHRpb24pCiAgICAiIiIKICAgIGZvcm1hdHMgPSBbKG5hbWUsIGluZm9bMF0sIGluZm9bM10pIGZvciBuYW1lLCBpbmZvIGluCiAgICAgICAgICAgICAgIF9VTlBBQ0tfRk9STUFUUy5pdGVtcygpXQogICAgZm9ybWF0cy5zb3J0KCkKICAgIHJldHVybiBmb3JtYXRzCgpkZWYgX2NoZWNrX3VucGFja19vcHRpb25zKGV4dGVuc2lvbnMsIGZ1bmN0aW9uLCBleHRyYV9hcmdzKToKICAgICIiIkNoZWNrcyB3aGF0IGdldHMgcmVnaXN0ZXJlZCBhcyBhbiB1bnBhY2tlci4iIiIKICAgICMgZmlyc3QgbWFrZSBzdXJlIG5vIG90aGVyIHVucGFja2VyIGlzIHJlZ2lzdGVyZWQgZm9yIHRoaXMgZXh0ZW5zaW9uCiAgICBleGlzdGluZ19leHRlbnNpb25zID0ge30KICAgIGZvciBuYW1lLCBpbmZvIGluIF9VTlBBQ0tfRk9STUFUUy5pdGVtcygpOgogICAgICAgIGZvciBleHQgaW4gaW5mb1swXToKICAgICAgICAgICAgZXhpc3RpbmdfZXh0ZW5zaW9uc1tleHRdID0gbmFtZQoKICAgIGZvciBleHRlbnNpb24gaW4gZXh0ZW5zaW9uczoKICAgICAgICBpZiBleHRlbnNpb24gaW4gZXhpc3RpbmdfZXh0ZW5zaW9uczoKICAgICAgICAgICAgbXNnID0gJyVzIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCBmb3IgIiVzIicKICAgICAgICAgICAgcmFpc2UgUmVnaXN0cnlFcnJvcihtc2cgJSAoZXh0ZW5zaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ19leHRlbnNpb25zW2V4dGVuc2lvbl0pKQoKICAgIGlmIG5vdCBpc2luc3RhbmNlKGZ1bmN0aW9uLCBjb2xsZWN0aW9ucy5DYWxsYWJsZSk6CiAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdUaGUgcmVnaXN0ZXJlZCBmdW5jdGlvbiBtdXN0IGJlIGEgY2FsbGFibGUnKQoKCmRlZiByZWdpc3Rlcl91bnBhY2tfZm9ybWF0KG5hbWUsIGV4dGVuc2lvbnMsIGZ1bmN0aW9uLCBleHRyYV9hcmdzPU5vbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPScnKToKICAgICIiIlJlZ2lzdGVycyBhbiB1bnBhY2sgZm9ybWF0LgoKICAgIGBuYW1lYCBpcyB0aGUgbmFtZSBvZiB0aGUgZm9ybWF0LiBgZXh0ZW5zaW9uc2AgaXMgYSBsaXN0IG9mIGV4dGVuc2lvbnMKICAgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGZvcm1hdC4KCiAgICBgZnVuY3Rpb25gIGlzIHRoZSBjYWxsYWJsZSB0aGF0IHdpbGwgYmUKICAgIHVzZWQgdG8gdW5wYWNrIGFyY2hpdmVzLiBUaGUgY2FsbGFibGUgd2lsbCByZWNlaXZlIGFyY2hpdmVzIHRvIHVucGFjay4KICAgIElmIGl0J3MgdW5hYmxlIHRvIGhhbmRsZSBhbiBhcmNoaXZlLCBpdCBuZWVkcyB0byByYWlzZSBhIFJlYWRFcnJvcgogICAgZXhjZXB0aW9uLgoKICAgIElmIHByb3ZpZGVkLCBgZXh0cmFfYXJnc2AgaXMgYSBzZXF1ZW5jZSBvZgogICAgKG5hbWUsIHZhbHVlKSB0dXBsZXMgdGhhdCB3aWxsIGJlIHBhc3NlZCBhcyBhcmd1bWVudHMgdG8gdGhlIGNhbGxhYmxlLgogICAgZGVzY3JpcHRpb24gY2FuIGJlIHByb3ZpZGVkIHRvIGRlc2NyaWJlIHRoZSBmb3JtYXQsIGFuZCB3aWxsIGJlIHJldHVybmVkCiAgICBieSB0aGUgZ2V0X3VucGFja19mb3JtYXRzKCkgZnVuY3Rpb24uCiAgICAiIiIKICAgIGlmIGV4dHJhX2FyZ3MgaXMgTm9uZToKICAgICAgICBleHRyYV9hcmdzID0gW10KICAgIF9jaGVja191bnBhY2tfb3B0aW9ucyhleHRlbnNpb25zLCBmdW5jdGlvbiwgZXh0cmFfYXJncykKICAgIF9VTlBBQ0tfRk9STUFUU1tuYW1lXSA9IGV4dGVuc2lvbnMsIGZ1bmN0aW9uLCBleHRyYV9hcmdzLCBkZXNjcmlwdGlvbgoKZGVmIHVucmVnaXN0ZXJfdW5wYWNrX2Zvcm1hdChuYW1lKToKICAgICIiIlJlbW92ZXMgdGhlIHBhY2sgZm9ybWF0IGZyb20gdGhlIHJlZ2lzdHJ5LiIiIgogICAgZGVsIF9VTlBBQ0tfRk9STUFUU1tuYW1lXQoKZGVmIF9lbnN1cmVfZGlyZWN0b3J5KHBhdGgpOgogICAgIiIiRW5zdXJlIHRoYXQgdGhlIHBhcmVudCBkaXJlY3Rvcnkgb2YgYHBhdGhgIGV4aXN0cyIiIgogICAgZGlybmFtZSA9IG9zLnBhdGguZGlybmFtZShwYXRoKQogICAgaWYgbm90IG9zLnBhdGguaXNkaXIoZGlybmFtZSk6CiAgICAgICAgb3MubWFrZWRpcnMoZGlybmFtZSkKCmRlZiBfdW5wYWNrX3ppcGZpbGUoZmlsZW5hbWUsIGV4dHJhY3RfZGlyKToKICAgICIiIlVucGFjayB6aXAgYGZpbGVuYW1lYCB0byBgZXh0cmFjdF9kaXJgCiAgICAiIiIKICAgIHRyeToKICAgICAgICBpbXBvcnQgemlwZmlsZQogICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgIHJhaXNlIFJlYWRFcnJvcignemxpYiBub3Qgc3VwcG9ydGVkLCBjYW5ub3QgdW5wYWNrIHRoaXMgYXJjaGl2ZS4nKQoKICAgIGlmIG5vdCB6aXBmaWxlLmlzX3ppcGZpbGUoZmlsZW5hbWUpOgogICAgICAgIHJhaXNlIFJlYWRFcnJvcigiJXMgaXMgbm90IGEgemlwIGZpbGUiICUgZmlsZW5hbWUpCgogICAgemlwID0gemlwZmlsZS5aaXBGaWxlKGZpbGVuYW1lKQogICAgdHJ5OgogICAgICAgIGZvciBpbmZvIGluIHppcC5pbmZvbGlzdCgpOgogICAgICAgICAgICBuYW1lID0gaW5mby5maWxlbmFtZQoKICAgICAgICAgICAgIyBkb24ndCBleHRyYWN0IGFic29sdXRlIHBhdGhzIG9yIG9uZXMgd2l0aCAuLiBpbiB0aGVtCiAgICAgICAgICAgIGlmIG5hbWUuc3RhcnRzd2l0aCgnLycpIG9yICcuLicgaW4gbmFtZToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICB0YXJnZXQgPSBvcy5wYXRoLmpvaW4oZXh0cmFjdF9kaXIsICpuYW1lLnNwbGl0KCcvJykpCiAgICAgICAgICAgIGlmIG5vdCB0YXJnZXQ6CiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgX2Vuc3VyZV9kaXJlY3RvcnkodGFyZ2V0KQogICAgICAgICAgICBpZiBub3QgbmFtZS5lbmRzd2l0aCgnLycpOgogICAgICAgICAgICAgICAgIyBmaWxlCiAgICAgICAgICAgICAgICBkYXRhID0gemlwLnJlYWQoaW5mby5maWxlbmFtZSkKICAgICAgICAgICAgICAgIGYgPSBvcGVuKHRhcmdldCwgJ3diJykKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBmLndyaXRlKGRhdGEpCiAgICAgICAgICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgICAgICAgIGYuY2xvc2UoKQogICAgICAgICAgICAgICAgICAgIGRlbCBkYXRhCiAgICBmaW5hbGx5OgogICAgICAgIHppcC5jbG9zZSgpCgpkZWYgX3VucGFja190YXJmaWxlKGZpbGVuYW1lLCBleHRyYWN0X2Rpcik6CiAgICAiIiJVbnBhY2sgdGFyL3Rhci5nei90YXIuYnoyIGBmaWxlbmFtZWAgdG8gYGV4dHJhY3RfZGlyYAogICAgIiIiCiAgICB0cnk6CiAgICAgICAgdGFyb2JqID0gdGFyZmlsZS5vcGVuKGZpbGVuYW1lKQogICAgZXhjZXB0IHRhcmZpbGUuVGFyRXJyb3I6CiAgICAgICAgcmFpc2UgUmVhZEVycm9yKAogICAgICAgICAgICAiJXMgaXMgbm90IGEgY29tcHJlc3NlZCBvciB1bmNvbXByZXNzZWQgdGFyIGZpbGUiICUgZmlsZW5hbWUpCiAgICB0cnk6CiAgICAgICAgdGFyb2JqLmV4dHJhY3RhbGwoZXh0cmFjdF9kaXIpCiAgICBmaW5hbGx5OgogICAgICAgIHRhcm9iai5jbG9zZSgpCgpfVU5QQUNLX0ZPUk1BVFMgPSB7CiAgICAnZ3p0YXInOiAoWycudGFyLmd6JywgJy50Z3onXSwgX3VucGFja190YXJmaWxlLCBbXSwgImd6aXAnZWQgdGFyLWZpbGUiKSwKICAgICd0YXInOiAgIChbJy50YXInXSwgX3VucGFja190YXJmaWxlLCBbXSwgInVuY29tcHJlc3NlZCB0YXIgZmlsZSIpLAogICAgJ3ppcCc6ICAgKFsnLnppcCddLCBfdW5wYWNrX3ppcGZpbGUsIFtdLCAiWklQIGZpbGUiKQogICAgfQoKaWYgX0JaMl9TVVBQT1JURUQ6CiAgICBfVU5QQUNLX0ZPUk1BVFNbJ2J6dGFyJ10gPSAoWycuYnoyJ10sIF91bnBhY2tfdGFyZmlsZSwgW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ6aXAyJ2VkIHRhci1maWxlIikKCmRlZiBfZmluZF91bnBhY2tfZm9ybWF0KGZpbGVuYW1lKToKICAgIGZvciBuYW1lLCBpbmZvIGluIF9VTlBBQ0tfRk9STUFUUy5pdGVtcygpOgogICAgICAgIGZvciBleHRlbnNpb24gaW4gaW5mb1swXToKICAgICAgICAgICAgaWYgZmlsZW5hbWUuZW5kc3dpdGgoZXh0ZW5zaW9uKToKICAgICAgICAgICAgICAgIHJldHVybiBuYW1lCiAgICByZXR1cm4gTm9uZQoKZGVmIHVucGFja19hcmNoaXZlKGZpbGVuYW1lLCBleHRyYWN0X2Rpcj1Ob25lLCBmb3JtYXQ9Tm9uZSk6CiAgICAiIiJVbnBhY2sgYW4gYXJjaGl2ZS4KCiAgICBgZmlsZW5hbWVgIGlzIHRoZSBuYW1lIG9mIHRoZSBhcmNoaXZlLgoKICAgIGBleHRyYWN0X2RpcmAgaXMgdGhlIG5hbWUgb2YgdGhlIHRhcmdldCBkaXJlY3RvcnksIHdoZXJlIHRoZSBhcmNoaXZlCiAgICBpcyB1bnBhY2tlZC4gSWYgbm90IHByb3ZpZGVkLCB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBpcyB1c2VkLgoKICAgIGBmb3JtYXRgIGlzIHRoZSBhcmNoaXZlIGZvcm1hdDogb25lIG9mICJ6aXAiLCAidGFyIiwgb3IgImd6dGFyIi4gT3IgYW55CiAgICBvdGhlciByZWdpc3RlcmVkIGZvcm1hdC4gSWYgbm90IHByb3ZpZGVkLCB1bnBhY2tfYXJjaGl2ZSB3aWxsIHVzZSB0aGUKICAgIGZpbGVuYW1lIGV4dGVuc2lvbiBhbmQgc2VlIGlmIGFuIHVucGFja2VyIHdhcyByZWdpc3RlcmVkIGZvciB0aGF0CiAgICBleHRlbnNpb24uCgogICAgSW4gY2FzZSBub25lIGlzIGZvdW5kLCBhIFZhbHVlRXJyb3IgaXMgcmFpc2VkLgogICAgIiIiCiAgICBpZiBleHRyYWN0X2RpciBpcyBOb25lOgogICAgICAgIGV4dHJhY3RfZGlyID0gb3MuZ2V0Y3dkKCkKCiAgICBpZiBmb3JtYXQgaXMgbm90IE5vbmU6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBmb3JtYXRfaW5mbyA9IF9VTlBBQ0tfRk9STUFUU1tmb3JtYXRdCiAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJVbmtub3duIHVucGFjayBmb3JtYXQgJ3swfSciLmZvcm1hdChmb3JtYXQpKQoKICAgICAgICBmdW5jID0gZm9ybWF0X2luZm9bMV0KICAgICAgICBmdW5jKGZpbGVuYW1lLCBleHRyYWN0X2RpciwgKipkaWN0KGZvcm1hdF9pbmZvWzJdKSkKICAgIGVsc2U6CiAgICAgICAgIyB3ZSBuZWVkIHRvIGxvb2sgYXQgdGhlIHJlZ2lzdGVyZWQgdW5wYWNrZXJzIHN1cHBvcnRlZCBleHRlbnNpb25zCiAgICAgICAgZm9ybWF0ID0gX2ZpbmRfdW5wYWNrX2Zvcm1hdChmaWxlbmFtZSkKICAgICAgICBpZiBmb3JtYXQgaXMgTm9uZToKICAgICAgICAgICAgcmFpc2UgUmVhZEVycm9yKCJVbmtub3duIGFyY2hpdmUgZm9ybWF0ICd7MH0nIi5mb3JtYXQoZmlsZW5hbWUpKQoKICAgICAgICBmdW5jID0gX1VOUEFDS19GT1JNQVRTW2Zvcm1hdF1bMV0KICAgICAgICBrd2FyZ3MgPSBkaWN0KF9VTlBBQ0tfRk9STUFUU1tmb3JtYXRdWzJdKQogICAgICAgIGZ1bmMoZmlsZW5hbWUsIGV4dHJhY3RfZGlyLCAqKmt3YXJncykKUEsDBBQAAAAAAAAAIQBvFgCtOQoAADkKAABIAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0bGliL19iYWNrcG9ydC9zeXNjb25maWcuY2ZnW3Bvc2l4X3ByZWZpeF0KIyBDb25maWd1cmF0aW9uIGRpcmVjdG9yaWVzLiAgU29tZSBvZiB0aGVzZSBjb21lIHN0cmFpZ2h0IG91dCBvZiB0aGUKIyBjb25maWd1cmUgc2NyaXB0LiAgVGhleSBhcmUgZm9yIGltcGxlbWVudGluZyB0aGUgb3RoZXIgdmFyaWFibGVzLCBub3QgdG8KIyBiZSB1c2VkIGRpcmVjdGx5IGluIFtyZXNvdXJjZV9sb2NhdGlvbnNdLgpjb25mZGlyID0gL2V0YwpkYXRhZGlyID0gL3Vzci9zaGFyZQpsaWJkaXIgPSAvdXNyL2xpYgpzdGF0ZWRpciA9IC92YXIKIyBVc2VyIHJlc291cmNlIGRpcmVjdG9yeQpsb2NhbCA9IH4vLmxvY2FsL3tkaXN0cmlidXRpb24ubmFtZX0KCnN0ZGxpYiA9IHtiYXNlfS9saWIvcHl0aG9ue3B5X3ZlcnNpb25fc2hvcnR9CnBsYXRzdGRsaWIgPSB7cGxhdGJhc2V9L2xpYi9weXRob257cHlfdmVyc2lvbl9zaG9ydH0KcHVyZWxpYiA9IHtiYXNlfS9saWIvcHl0aG9ue3B5X3ZlcnNpb25fc2hvcnR9L3NpdGUtcGFja2FnZXMKcGxhdGxpYiA9IHtwbGF0YmFzZX0vbGliL3B5dGhvbntweV92ZXJzaW9uX3Nob3J0fS9zaXRlLXBhY2thZ2VzCmluY2x1ZGUgPSB7YmFzZX0vaW5jbHVkZS9weXRob257cHlfdmVyc2lvbl9zaG9ydH17YWJpZmxhZ3N9CnBsYXRpbmNsdWRlID0ge3BsYXRiYXNlfS9pbmNsdWRlL3B5dGhvbntweV92ZXJzaW9uX3Nob3J0fXthYmlmbGFnc30KZGF0YSA9IHtiYXNlfQoKW3Bvc2l4X2hvbWVdCnN0ZGxpYiA9IHtiYXNlfS9saWIvcHl0aG9uCnBsYXRzdGRsaWIgPSB7YmFzZX0vbGliL3B5dGhvbgpwdXJlbGliID0ge2Jhc2V9L2xpYi9weXRob24KcGxhdGxpYiA9IHtiYXNlfS9saWIvcHl0aG9uCmluY2x1ZGUgPSB7YmFzZX0vaW5jbHVkZS9weXRob24KcGxhdGluY2x1ZGUgPSB7YmFzZX0vaW5jbHVkZS9weXRob24Kc2NyaXB0cyA9IHtiYXNlfS9iaW4KZGF0YSA9IHtiYXNlfQoKW250XQpzdGRsaWIgPSB7YmFzZX0vTGliCnBsYXRzdGRsaWIgPSB7YmFzZX0vTGliCnB1cmVsaWIgPSB7YmFzZX0vTGliL3NpdGUtcGFja2FnZXMKcGxhdGxpYiA9IHtiYXNlfS9MaWIvc2l0ZS1wYWNrYWdlcwppbmNsdWRlID0ge2Jhc2V9L0luY2x1ZGUKcGxhdGluY2x1ZGUgPSB7YmFzZX0vSW5jbHVkZQpzY3JpcHRzID0ge2Jhc2V9L1NjcmlwdHMKZGF0YSA9IHtiYXNlfQoKW29zMl0Kc3RkbGliID0ge2Jhc2V9L0xpYgpwbGF0c3RkbGliID0ge2Jhc2V9L0xpYgpwdXJlbGliID0ge2Jhc2V9L0xpYi9zaXRlLXBhY2thZ2VzCnBsYXRsaWIgPSB7YmFzZX0vTGliL3NpdGUtcGFja2FnZXMKaW5jbHVkZSA9IHtiYXNlfS9JbmNsdWRlCnBsYXRpbmNsdWRlID0ge2Jhc2V9L0luY2x1ZGUKc2NyaXB0cyA9IHtiYXNlfS9TY3JpcHRzCmRhdGEgPSB7YmFzZX0KCltvczJfaG9tZV0Kc3RkbGliID0ge3VzZXJiYXNlfS9saWIvcHl0aG9ue3B5X3ZlcnNpb25fc2hvcnR9CnBsYXRzdGRsaWIgPSB7dXNlcmJhc2V9L2xpYi9weXRob257cHlfdmVyc2lvbl9zaG9ydH0KcHVyZWxpYiA9IHt1c2VyYmFzZX0vbGliL3B5dGhvbntweV92ZXJzaW9uX3Nob3J0fS9zaXRlLXBhY2thZ2VzCnBsYXRsaWIgPSB7dXNlcmJhc2V9L2xpYi9weXRob257cHlfdmVyc2lvbl9zaG9ydH0vc2l0ZS1wYWNrYWdlcwppbmNsdWRlID0ge3VzZXJiYXNlfS9pbmNsdWRlL3B5dGhvbntweV92ZXJzaW9uX3Nob3J0fQpzY3JpcHRzID0ge3VzZXJiYXNlfS9iaW4KZGF0YSA9IHt1c2VyYmFzZX0KCltudF91c2VyXQpzdGRsaWIgPSB7dXNlcmJhc2V9L1B5dGhvbntweV92ZXJzaW9uX25vZG90fQpwbGF0c3RkbGliID0ge3VzZXJiYXNlfS9QeXRob257cHlfdmVyc2lvbl9ub2RvdH0KcHVyZWxpYiA9IHt1c2VyYmFzZX0vUHl0aG9ue3B5X3ZlcnNpb25fbm9kb3R9L3NpdGUtcGFja2FnZXMKcGxhdGxpYiA9IHt1c2VyYmFzZX0vUHl0aG9ue3B5X3ZlcnNpb25fbm9kb3R9L3NpdGUtcGFja2FnZXMKaW5jbHVkZSA9IHt1c2VyYmFzZX0vUHl0aG9ue3B5X3ZlcnNpb25fbm9kb3R9L0luY2x1ZGUKc2NyaXB0cyA9IHt1c2VyYmFzZX0vU2NyaXB0cwpkYXRhID0ge3VzZXJiYXNlfQoKW3Bvc2l4X3VzZXJdCnN0ZGxpYiA9IHt1c2VyYmFzZX0vbGliL3B5dGhvbntweV92ZXJzaW9uX3Nob3J0fQpwbGF0c3RkbGliID0ge3VzZXJiYXNlfS9saWIvcHl0aG9ue3B5X3ZlcnNpb25fc2hvcnR9CnB1cmVsaWIgPSB7dXNlcmJhc2V9L2xpYi9weXRob257cHlfdmVyc2lvbl9zaG9ydH0vc2l0ZS1wYWNrYWdlcwpwbGF0bGliID0ge3VzZXJiYXNlfS9saWIvcHl0aG9ue3B5X3ZlcnNpb25fc2hvcnR9L3NpdGUtcGFja2FnZXMKaW5jbHVkZSA9IHt1c2VyYmFzZX0vaW5jbHVkZS9weXRob257cHlfdmVyc2lvbl9zaG9ydH0Kc2NyaXB0cyA9IHt1c2VyYmFzZX0vYmluCmRhdGEgPSB7dXNlcmJhc2V9Cgpbb3N4X2ZyYW1ld29ya191c2VyXQpzdGRsaWIgPSB7dXNlcmJhc2V9L2xpYi9weXRob24KcGxhdHN0ZGxpYiA9IHt1c2VyYmFzZX0vbGliL3B5dGhvbgpwdXJlbGliID0ge3VzZXJiYXNlfS9saWIvcHl0aG9uL3NpdGUtcGFja2FnZXMKcGxhdGxpYiA9IHt1c2VyYmFzZX0vbGliL3B5dGhvbi9zaXRlLXBhY2thZ2VzCmluY2x1ZGUgPSB7dXNlcmJhc2V9L2luY2x1ZGUKc2NyaXB0cyA9IHt1c2VyYmFzZX0vYmluCmRhdGEgPSB7dXNlcmJhc2V9ClBLAwQUAAAAAAAAACEANg9S1ktpAABLaQAARwAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvZGlzdGxpYi9fYmFja3BvcnQvc3lzY29uZmlnLnB5IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KIwojIENvcHlyaWdodCAoQykgMjAxMiBUaGUgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24uCiMgU2VlIExJQ0VOU0UudHh0IGFuZCBDT05UUklCVVRPUlMudHh0LgojCiIiIkFjY2VzcyB0byBQeXRob24ncyBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLiIiIgoKaW1wb3J0IGNvZGVjcwppbXBvcnQgb3MKaW1wb3J0IHJlCmltcG9ydCBzeXMKZnJvbSBvcy5wYXRoIGltcG9ydCBwYXJkaXIsIHJlYWxwYXRoCnRyeToKICAgIGltcG9ydCBjb25maWdwYXJzZXIKZXhjZXB0IEltcG9ydEVycm9yOgogICAgaW1wb3J0IENvbmZpZ1BhcnNlciBhcyBjb25maWdwYXJzZXIKCgpfX2FsbF9fID0gWwogICAgJ2dldF9jb25maWdfaF9maWxlbmFtZScsCiAgICAnZ2V0X2NvbmZpZ192YXInLAogICAgJ2dldF9jb25maWdfdmFycycsCiAgICAnZ2V0X21ha2VmaWxlX2ZpbGVuYW1lJywKICAgICdnZXRfcGF0aCcsCiAgICAnZ2V0X3BhdGhfbmFtZXMnLAogICAgJ2dldF9wYXRocycsCiAgICAnZ2V0X3BsYXRmb3JtJywKICAgICdnZXRfcHl0aG9uX3ZlcnNpb24nLAogICAgJ2dldF9zY2hlbWVfbmFtZXMnLAogICAgJ3BhcnNlX2NvbmZpZ19oJywKXQoKCmRlZiBfc2FmZV9yZWFscGF0aChwYXRoKToKICAgIHRyeToKICAgICAgICByZXR1cm4gcmVhbHBhdGgocGF0aCkKICAgIGV4Y2VwdCBPU0Vycm9yOgogICAgICAgIHJldHVybiBwYXRoCgoKaWYgc3lzLmV4ZWN1dGFibGU6CiAgICBfUFJPSkVDVF9CQVNFID0gb3MucGF0aC5kaXJuYW1lKF9zYWZlX3JlYWxwYXRoKHN5cy5leGVjdXRhYmxlKSkKZWxzZToKICAgICMgc3lzLmV4ZWN1dGFibGUgY2FuIGJlIGVtcHR5IGlmIGFyZ3ZbMF0gaGFzIGJlZW4gY2hhbmdlZCBhbmQgUHl0aG9uIGlzCiAgICAjIHVuYWJsZSB0byByZXRyaWV2ZSB0aGUgcmVhbCBwcm9ncmFtIG5hbWUKICAgIF9QUk9KRUNUX0JBU0UgPSBfc2FmZV9yZWFscGF0aChvcy5nZXRjd2QoKSkKCmlmIG9zLm5hbWUgPT0gIm50IiBhbmQgInBjYnVpbGQiIGluIF9QUk9KRUNUX0JBU0VbLTg6XS5sb3dlcigpOgogICAgX1BST0pFQ1RfQkFTRSA9IF9zYWZlX3JlYWxwYXRoKG9zLnBhdGguam9pbihfUFJPSkVDVF9CQVNFLCBwYXJkaXIpKQojIFBDL1ZTNy4xCmlmIG9zLm5hbWUgPT0gIm50IiBhbmQgIlxccGNcXHYiIGluIF9QUk9KRUNUX0JBU0VbLTEwOl0ubG93ZXIoKToKICAgIF9QUk9KRUNUX0JBU0UgPSBfc2FmZV9yZWFscGF0aChvcy5wYXRoLmpvaW4oX1BST0pFQ1RfQkFTRSwgcGFyZGlyLCBwYXJkaXIpKQojIFBDL0FNRDY0CmlmIG9zLm5hbWUgPT0gIm50IiBhbmQgIlxccGNidWlsZFxcYW1kNjQiIGluIF9QUk9KRUNUX0JBU0VbLTE0Ol0ubG93ZXIoKToKICAgIF9QUk9KRUNUX0JBU0UgPSBfc2FmZV9yZWFscGF0aChvcy5wYXRoLmpvaW4oX1BST0pFQ1RfQkFTRSwgcGFyZGlyLCBwYXJkaXIpKQoKCmRlZiBpc19weXRob25fYnVpbGQoKToKICAgIGZvciBmbiBpbiAoIlNldHVwLmRpc3QiLCAiU2V0dXAubG9jYWwiKToKICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShvcy5wYXRoLmpvaW4oX1BST0pFQ1RfQkFTRSwgIk1vZHVsZXMiLCBmbikpOgogICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgcmV0dXJuIEZhbHNlCgpfUFlUSE9OX0JVSUxEID0gaXNfcHl0aG9uX2J1aWxkKCkKCl9jZmdfcmVhZCA9IEZhbHNlCgpkZWYgX2Vuc3VyZV9jZmdfcmVhZCgpOgogICAgZ2xvYmFsIF9jZmdfcmVhZAogICAgaWYgbm90IF9jZmdfcmVhZDoKICAgICAgICBmcm9tIC4ucmVzb3VyY2VzIGltcG9ydCBmaW5kZXIKICAgICAgICBiYWNrcG9ydF9wYWNrYWdlID0gX19uYW1lX18ucnNwbGl0KCcuJywgMSlbMF0KICAgICAgICBfZmluZGVyID0gZmluZGVyKGJhY2twb3J0X3BhY2thZ2UpCiAgICAgICAgX2NmZ2ZpbGUgPSBfZmluZGVyLmZpbmQoJ3N5c2NvbmZpZy5jZmcnKQogICAgICAgIGFzc2VydCBfY2ZnZmlsZSwgJ3N5c2NvbmZpZy5jZmcgZXhpc3RzJwogICAgICAgIHdpdGggX2NmZ2ZpbGUuYXNfc3RyZWFtKCkgYXMgczoKICAgICAgICAgICAgX1NDSEVNRVMucmVhZGZwKHMpCiAgICAgICAgaWYgX1BZVEhPTl9CVUlMRDoKICAgICAgICAgICAgZm9yIHNjaGVtZSBpbiAoJ3Bvc2l4X3ByZWZpeCcsICdwb3NpeF9ob21lJyk6CiAgICAgICAgICAgICAgICBfU0NIRU1FUy5zZXQoc2NoZW1lLCAnaW5jbHVkZScsICd7c3JjZGlyfS9JbmNsdWRlJykKICAgICAgICAgICAgICAgIF9TQ0hFTUVTLnNldChzY2hlbWUsICdwbGF0aW5jbHVkZScsICd7cHJvamVjdGJhc2V9Ly4nKQoKICAgICAgICBfY2ZnX3JlYWQgPSBUcnVlCgoKX1NDSEVNRVMgPSBjb25maWdwYXJzZXIuUmF3Q29uZmlnUGFyc2VyKCkKX1ZBUl9SRVBMID0gcmUuY29tcGlsZShyJ1x7KFtee10qPylcfScpCgpkZWYgX2V4cGFuZF9nbG9iYWxzKGNvbmZpZyk6CiAgICBfZW5zdXJlX2NmZ19yZWFkKCkKICAgIGlmIGNvbmZpZy5oYXNfc2VjdGlvbignZ2xvYmFscycpOgogICAgICAgIGdsb2JhbHMgPSBjb25maWcuaXRlbXMoJ2dsb2JhbHMnKQogICAgZWxzZToKICAgICAgICBnbG9iYWxzID0gdHVwbGUoKQoKICAgIHNlY3Rpb25zID0gY29uZmlnLnNlY3Rpb25zKCkKICAgIGZvciBzZWN0aW9uIGluIHNlY3Rpb25zOgogICAgICAgIGlmIHNlY3Rpb24gPT0gJ2dsb2JhbHMnOgogICAgICAgICAgICBjb250aW51ZQogICAgICAgIGZvciBvcHRpb24sIHZhbHVlIGluIGdsb2JhbHM6CiAgICAgICAgICAgIGlmIGNvbmZpZy5oYXNfb3B0aW9uKHNlY3Rpb24sIG9wdGlvbik6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBjb25maWcuc2V0KHNlY3Rpb24sIG9wdGlvbiwgdmFsdWUpCiAgICBjb25maWcucmVtb3ZlX3NlY3Rpb24oJ2dsb2JhbHMnKQoKICAgICMgbm93IGV4cGFuZGluZyBsb2NhbCB2YXJpYWJsZXMgZGVmaW5lZCBpbiB0aGUgY2ZnIGZpbGUKICAgICMKICAgIGZvciBzZWN0aW9uIGluIGNvbmZpZy5zZWN0aW9ucygpOgogICAgICAgIHZhcmlhYmxlcyA9IGRpY3QoY29uZmlnLml0ZW1zKHNlY3Rpb24pKQoKICAgICAgICBkZWYgX3JlcGxhY2VyKG1hdGNob2JqKToKICAgICAgICAgICAgbmFtZSA9IG1hdGNob2JqLmdyb3VwKDEpCiAgICAgICAgICAgIGlmIG5hbWUgaW4gdmFyaWFibGVzOgogICAgICAgICAgICAgICAgcmV0dXJuIHZhcmlhYmxlc1tuYW1lXQogICAgICAgICAgICByZXR1cm4gbWF0Y2hvYmouZ3JvdXAoMCkKCiAgICAgICAgZm9yIG9wdGlvbiwgdmFsdWUgaW4gY29uZmlnLml0ZW1zKHNlY3Rpb24pOgogICAgICAgICAgICBjb25maWcuc2V0KHNlY3Rpb24sIG9wdGlvbiwgX1ZBUl9SRVBMLnN1YihfcmVwbGFjZXIsIHZhbHVlKSkKCiNfZXhwYW5kX2dsb2JhbHMoX1NDSEVNRVMpCgogIyBGSVhNRSBkb24ndCByZWx5IG9uIHN5cy52ZXJzaW9uIGhlcmUsIGl0cyBmb3JtYXQgaXMgYW4gaW1wbGVtZW50YXRpb24gZGV0YWlsCiAjIG9mIENQeXRob24sIHVzZSBzeXMudmVyc2lvbl9pbmZvIG9yIHN5cy5oZXh2ZXJzaW9uCl9QWV9WRVJTSU9OID0gc3lzLnZlcnNpb24uc3BsaXQoKVswXQpfUFlfVkVSU0lPTl9TSE9SVCA9IHN5cy52ZXJzaW9uWzozXQpfUFlfVkVSU0lPTl9TSE9SVF9OT19ET1QgPSBfUFlfVkVSU0lPTlswXSArIF9QWV9WRVJTSU9OWzJdCl9QUkVGSVggPSBvcy5wYXRoLm5vcm1wYXRoKHN5cy5wcmVmaXgpCl9FWEVDX1BSRUZJWCA9IG9zLnBhdGgubm9ybXBhdGgoc3lzLmV4ZWNfcHJlZml4KQpfQ09ORklHX1ZBUlMgPSBOb25lCl9VU0VSX0JBU0UgPSBOb25lCgoKZGVmIF9zdWJzdF92YXJzKHBhdGgsIGxvY2FsX3ZhcnMpOgogICAgIiIiSW4gdGhlIHN0cmluZyBgcGF0aGAsIHJlcGxhY2UgdG9rZW5zIGxpa2Uge3NvbWUudGhpbmd9IHdpdGggdGhlCiAgICBjb3JyZXNwb25kaW5nIHZhbHVlIGZyb20gdGhlIG1hcCBgbG9jYWxfdmFyc2AuCgogICAgSWYgdGhlcmUgaXMgbm8gY29ycmVzcG9uZGluZyB2YWx1ZSwgbGVhdmUgdGhlIHRva2VuIHVuY2hhbmdlZC4KICAgICIiIgogICAgZGVmIF9yZXBsYWNlcihtYXRjaG9iaik6CiAgICAgICAgbmFtZSA9IG1hdGNob2JqLmdyb3VwKDEpCiAgICAgICAgaWYgbmFtZSBpbiBsb2NhbF92YXJzOgogICAgICAgICAgICByZXR1cm4gbG9jYWxfdmFyc1tuYW1lXQogICAgICAgIGVsaWYgbmFtZSBpbiBvcy5lbnZpcm9uOgogICAgICAgICAgICByZXR1cm4gb3MuZW52aXJvbltuYW1lXQogICAgICAgIHJldHVybiBtYXRjaG9iai5ncm91cCgwKQogICAgcmV0dXJuIF9WQVJfUkVQTC5zdWIoX3JlcGxhY2VyLCBwYXRoKQoKCmRlZiBfZXh0ZW5kX2RpY3QodGFyZ2V0X2RpY3QsIG90aGVyX2RpY3QpOgogICAgdGFyZ2V0X2tleXMgPSB0YXJnZXRfZGljdC5rZXlzKCkKICAgIGZvciBrZXksIHZhbHVlIGluIG90aGVyX2RpY3QuaXRlbXMoKToKICAgICAgICBpZiBrZXkgaW4gdGFyZ2V0X2tleXM6CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgdGFyZ2V0X2RpY3Rba2V5XSA9IHZhbHVlCgoKZGVmIF9leHBhbmRfdmFycyhzY2hlbWUsIHZhcnMpOgogICAgcmVzID0ge30KICAgIGlmIHZhcnMgaXMgTm9uZToKICAgICAgICB2YXJzID0ge30KICAgIF9leHRlbmRfZGljdCh2YXJzLCBnZXRfY29uZmlnX3ZhcnMoKSkKCiAgICBmb3Iga2V5LCB2YWx1ZSBpbiBfU0NIRU1FUy5pdGVtcyhzY2hlbWUpOgogICAgICAgIGlmIG9zLm5hbWUgaW4gKCdwb3NpeCcsICdudCcpOgogICAgICAgICAgICB2YWx1ZSA9IG9zLnBhdGguZXhwYW5kdXNlcih2YWx1ZSkKICAgICAgICByZXNba2V5XSA9IG9zLnBhdGgubm9ybXBhdGgoX3N1YnN0X3ZhcnModmFsdWUsIHZhcnMpKQogICAgcmV0dXJuIHJlcwoKCmRlZiBmb3JtYXRfdmFsdWUodmFsdWUsIHZhcnMpOgogICAgZGVmIF9yZXBsYWNlcihtYXRjaG9iaik6CiAgICAgICAgbmFtZSA9IG1hdGNob2JqLmdyb3VwKDEpCiAgICAgICAgaWYgbmFtZSBpbiB2YXJzOgogICAgICAgICAgICByZXR1cm4gdmFyc1tuYW1lXQogICAgICAgIHJldHVybiBtYXRjaG9iai5ncm91cCgwKQogICAgcmV0dXJuIF9WQVJfUkVQTC5zdWIoX3JlcGxhY2VyLCB2YWx1ZSkKCgpkZWYgX2dldF9kZWZhdWx0X3NjaGVtZSgpOgogICAgaWYgb3MubmFtZSA9PSAncG9zaXgnOgogICAgICAgICMgdGhlIGRlZmF1bHQgc2NoZW1lIGZvciBwb3NpeCBpcyBwb3NpeF9wcmVmaXgKICAgICAgICByZXR1cm4gJ3Bvc2l4X3ByZWZpeCcKICAgIHJldHVybiBvcy5uYW1lCgoKZGVmIF9nZXR1c2VyYmFzZSgpOgogICAgZW52X2Jhc2UgPSBvcy5lbnZpcm9uLmdldCgiUFlUSE9OVVNFUkJBU0UiLCBOb25lKQoKICAgIGRlZiBqb2ludXNlcigqYXJncyk6CiAgICAgICAgcmV0dXJuIG9zLnBhdGguZXhwYW5kdXNlcihvcy5wYXRoLmpvaW4oKmFyZ3MpKQoKICAgICMgd2hhdCBhYm91dCAnb3MyZW14JywgJ3Jpc2NvcycgPwogICAgaWYgb3MubmFtZSA9PSAibnQiOgogICAgICAgIGJhc2UgPSBvcy5lbnZpcm9uLmdldCgiQVBQREFUQSIpIG9yICJ+IgogICAgICAgIGlmIGVudl9iYXNlOgogICAgICAgICAgICByZXR1cm4gZW52X2Jhc2UKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gam9pbnVzZXIoYmFzZSwgIlB5dGhvbiIpCgogICAgaWYgc3lzLnBsYXRmb3JtID09ICJkYXJ3aW4iOgogICAgICAgIGZyYW1ld29yayA9IGdldF9jb25maWdfdmFyKCJQWVRIT05GUkFNRVdPUksiKQogICAgICAgIGlmIGZyYW1ld29yazoKICAgICAgICAgICAgaWYgZW52X2Jhc2U6CiAgICAgICAgICAgICAgICByZXR1cm4gZW52X2Jhc2UKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJldHVybiBqb2ludXNlcigifiIsICJMaWJyYXJ5IiwgZnJhbWV3b3JrLCAiJWQuJWQiICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXMudmVyc2lvbl9pbmZvWzoyXSkKCiAgICBpZiBlbnZfYmFzZToKICAgICAgICByZXR1cm4gZW52X2Jhc2UKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIGpvaW51c2VyKCJ+IiwgIi5sb2NhbCIpCgoKZGVmIF9wYXJzZV9tYWtlZmlsZShmaWxlbmFtZSwgdmFycz1Ob25lKToKICAgICIiIlBhcnNlIGEgTWFrZWZpbGUtc3R5bGUgZmlsZS4KCiAgICBBIGRpY3Rpb25hcnkgY29udGFpbmluZyBuYW1lL3ZhbHVlIHBhaXJzIGlzIHJldHVybmVkLiAgSWYgYW4KICAgIG9wdGlvbmFsIGRpY3Rpb25hcnkgaXMgcGFzc2VkIGluIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQsIGl0IGlzCiAgICB1c2VkIGluc3RlYWQgb2YgYSBuZXcgZGljdGlvbmFyeS4KICAgICIiIgogICAgIyBSZWdleGVzIG5lZWRlZCBmb3IgcGFyc2luZyBNYWtlZmlsZSAoYW5kIHNpbWlsYXIgc3ludGF4ZXMsCiAgICAjIGxpa2Ugb2xkLXN0eWxlIFNldHVwIGZpbGVzKS4KICAgIF92YXJpYWJsZV9yeCA9IHJlLmNvbXBpbGUoIihbYS16QS1aXVthLXpBLVowLTlfXSspXHMqPVxzKiguKikiKQogICAgX2ZpbmR2YXIxX3J4ID0gcmUuY29tcGlsZShyIlwkXCgoW0EtWmEtel1bQS1aYS16MC05X10qKVwpIikKICAgIF9maW5kdmFyMl9yeCA9IHJlLmNvbXBpbGUociJcJHsoW0EtWmEtel1bQS1aYS16MC05X10qKX0iKQoKICAgIGlmIHZhcnMgaXMgTm9uZToKICAgICAgICB2YXJzID0ge30KICAgIGRvbmUgPSB7fQogICAgbm90ZG9uZSA9IHt9CgogICAgd2l0aCBjb2RlY3Mub3BlbihmaWxlbmFtZSwgZW5jb2Rpbmc9J3V0Zi04JywgZXJyb3JzPSJzdXJyb2dhdGVlc2NhcGUiKSBhcyBmOgogICAgICAgIGxpbmVzID0gZi5yZWFkbGluZXMoKQoKICAgIGZvciBsaW5lIGluIGxpbmVzOgogICAgICAgIGlmIGxpbmUuc3RhcnRzd2l0aCgnIycpIG9yIGxpbmUuc3RyaXAoKSA9PSAnJzoKICAgICAgICAgICAgY29udGludWUKICAgICAgICBtID0gX3ZhcmlhYmxlX3J4Lm1hdGNoKGxpbmUpCiAgICAgICAgaWYgbToKICAgICAgICAgICAgbiwgdiA9IG0uZ3JvdXAoMSwgMikKICAgICAgICAgICAgdiA9IHYuc3RyaXAoKQogICAgICAgICAgICAjIGAkJCcgaXMgYSBsaXRlcmFsIGAkJyBpbiBtYWtlCiAgICAgICAgICAgIHRtcHYgPSB2LnJlcGxhY2UoJyQkJywgJycpCgogICAgICAgICAgICBpZiAiJCIgaW4gdG1wdjoKICAgICAgICAgICAgICAgIG5vdGRvbmVbbl0gPSB2CiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgdiA9IGludCh2KQogICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgIyBpbnNlcnQgbGl0ZXJhbCBgJCcKICAgICAgICAgICAgICAgICAgICBkb25lW25dID0gdi5yZXBsYWNlKCckJCcsICckJykKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgZG9uZVtuXSA9IHYKCiAgICAjIGRvIHZhcmlhYmxlIGludGVycG9sYXRpb24gaGVyZQogICAgdmFyaWFibGVzID0gbGlzdChub3Rkb25lLmtleXMoKSkKCiAgICAjIFZhcmlhYmxlcyB3aXRoIGEgJ1BZXycgcHJlZml4IGluIHRoZSBtYWtlZmlsZS4gVGhlc2UgbmVlZCB0bwogICAgIyBiZSBtYWRlIGF2YWlsYWJsZSB3aXRob3V0IHRoYXQgcHJlZml4IHRocm91Z2ggc3lzY29uZmlnLgogICAgIyBTcGVjaWFsIGNhcmUgaXMgbmVlZGVkIHRvIGVuc3VyZSB0aGF0IHZhcmlhYmxlIGV4cGFuc2lvbiB3b3JrcywgZXZlbgogICAgIyBpZiB0aGUgZXhwYW5zaW9uIHVzZXMgdGhlIG5hbWUgd2l0aG91dCBhIHByZWZpeC4KICAgIHJlbmFtZWRfdmFyaWFibGVzID0gKCdDRkxBR1MnLCAnTERGTEFHUycsICdDUFBGTEFHUycpCgogICAgd2hpbGUgbGVuKHZhcmlhYmxlcykgPiAwOgogICAgICAgIGZvciBuYW1lIGluIHR1cGxlKHZhcmlhYmxlcyk6CiAgICAgICAgICAgIHZhbHVlID0gbm90ZG9uZVtuYW1lXQogICAgICAgICAgICBtID0gX2ZpbmR2YXIxX3J4LnNlYXJjaCh2YWx1ZSkgb3IgX2ZpbmR2YXIyX3J4LnNlYXJjaCh2YWx1ZSkKICAgICAgICAgICAgaWYgbSBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIG4gPSBtLmdyb3VwKDEpCiAgICAgICAgICAgICAgICBmb3VuZCA9IFRydWUKICAgICAgICAgICAgICAgIGlmIG4gaW4gZG9uZToKICAgICAgICAgICAgICAgICAgICBpdGVtID0gc3RyKGRvbmVbbl0pCiAgICAgICAgICAgICAgICBlbGlmIG4gaW4gbm90ZG9uZToKICAgICAgICAgICAgICAgICAgICAjIGdldCBpdCBvbiBhIHN1YnNlcXVlbnQgcm91bmQKICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IEZhbHNlCiAgICAgICAgICAgICAgICBlbGlmIG4gaW4gb3MuZW52aXJvbjoKICAgICAgICAgICAgICAgICAgICAjIGRvIGl0IGxpa2UgbWFrZTogZmFsbCBiYWNrIHRvIGVudmlyb25tZW50CiAgICAgICAgICAgICAgICAgICAgaXRlbSA9IG9zLmVudmlyb25bbl0KCiAgICAgICAgICAgICAgICBlbGlmIG4gaW4gcmVuYW1lZF92YXJpYWJsZXM6CiAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUuc3RhcnRzd2l0aCgnUFlfJykgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVbMzpdIGluIHJlbmFtZWRfdmFyaWFibGVzKToKICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSA9ICIiCgogICAgICAgICAgICAgICAgICAgIGVsaWYgJ1BZXycgKyBuIGluIG5vdGRvbmU6CiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gRmFsc2UKCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSA9IHN0cihkb25lWydQWV8nICsgbl0pCgogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBkb25lW25dID0gaXRlbSA9ICIiCgogICAgICAgICAgICAgICAgaWYgZm91bmQ6CiAgICAgICAgICAgICAgICAgICAgYWZ0ZXIgPSB2YWx1ZVttLmVuZCgpOl0KICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlWzptLnN0YXJ0KCldICsgaXRlbSArIGFmdGVyCiAgICAgICAgICAgICAgICAgICAgaWYgIiQiIGluIGFmdGVyOgogICAgICAgICAgICAgICAgICAgICAgICBub3Rkb25lW25hbWVdID0gdmFsdWUKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGludCh2YWx1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lW25hbWVdID0gdmFsdWUuc3RyaXAoKQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZVtuYW1lXSA9IHZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlcy5yZW1vdmUobmFtZSkKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lLnN0YXJ0c3dpdGgoJ1BZXycpIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZVszOl0gaW4gcmVuYW1lZF92YXJpYWJsZXMpOgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBuYW1lWzM6XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbmFtZSBub3QgaW4gZG9uZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lW25hbWVdID0gdmFsdWUKCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIGJvZ3VzIHZhcmlhYmxlIHJlZmVyZW5jZSAoZS5nLiAicHJlZml4PSQvb3B0L3B5dGhvbiIpOwogICAgICAgICAgICAgICAgIyBqdXN0IGRyb3AgaXQgc2luY2Ugd2UgY2FuJ3QgZGVhbAogICAgICAgICAgICAgICAgZG9uZVtuYW1lXSA9IHZhbHVlCiAgICAgICAgICAgICAgICB2YXJpYWJsZXMucmVtb3ZlKG5hbWUpCgogICAgIyBzdHJpcCBzcHVyaW91cyBzcGFjZXMKICAgIGZvciBrLCB2IGluIGRvbmUuaXRlbXMoKToKICAgICAgICBpZiBpc2luc3RhbmNlKHYsIHN0cik6CiAgICAgICAgICAgIGRvbmVba10gPSB2LnN0cmlwKCkKCiAgICAjIHNhdmUgdGhlIHJlc3VsdHMgaW4gdGhlIGdsb2JhbCBkaWN0aW9uYXJ5CiAgICB2YXJzLnVwZGF0ZShkb25lKQogICAgcmV0dXJuIHZhcnMKCgpkZWYgZ2V0X21ha2VmaWxlX2ZpbGVuYW1lKCk6CiAgICAiIiJSZXR1cm4gdGhlIHBhdGggb2YgdGhlIE1ha2VmaWxlLiIiIgogICAgaWYgX1BZVEhPTl9CVUlMRDoKICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKF9QUk9KRUNUX0JBU0UsICJNYWtlZmlsZSIpCiAgICBpZiBoYXNhdHRyKHN5cywgJ2FiaWZsYWdzJyk6CiAgICAgICAgY29uZmlnX2Rpcl9uYW1lID0gJ2NvbmZpZy0lcyVzJyAlIChfUFlfVkVSU0lPTl9TSE9SVCwgc3lzLmFiaWZsYWdzKQogICAgZWxzZToKICAgICAgICBjb25maWdfZGlyX25hbWUgPSAnY29uZmlnJwogICAgcmV0dXJuIG9zLnBhdGguam9pbihnZXRfcGF0aCgnc3RkbGliJyksIGNvbmZpZ19kaXJfbmFtZSwgJ01ha2VmaWxlJykKCgpkZWYgX2luaXRfcG9zaXgodmFycyk6CiAgICAiIiJJbml0aWFsaXplIHRoZSBtb2R1bGUgYXMgYXBwcm9wcmlhdGUgZm9yIFBPU0lYIHN5c3RlbXMuIiIiCiAgICAjIGxvYWQgdGhlIGluc3RhbGxlZCBNYWtlZmlsZToKICAgIG1ha2VmaWxlID0gZ2V0X21ha2VmaWxlX2ZpbGVuYW1lKCkKICAgIHRyeToKICAgICAgICBfcGFyc2VfbWFrZWZpbGUobWFrZWZpbGUsIHZhcnMpCiAgICBleGNlcHQgSU9FcnJvciBhcyBlOgogICAgICAgIG1zZyA9ICJpbnZhbGlkIFB5dGhvbiBpbnN0YWxsYXRpb246IHVuYWJsZSB0byBvcGVuICVzIiAlIG1ha2VmaWxlCiAgICAgICAgaWYgaGFzYXR0cihlLCAic3RyZXJyb3IiKToKICAgICAgICAgICAgbXNnID0gbXNnICsgIiAoJXMpIiAlIGUuc3RyZXJyb3IKICAgICAgICByYWlzZSBJT0Vycm9yKG1zZykKICAgICMgbG9hZCB0aGUgaW5zdGFsbGVkIHB5Y29uZmlnLmg6CiAgICBjb25maWdfaCA9IGdldF9jb25maWdfaF9maWxlbmFtZSgpCiAgICB0cnk6CiAgICAgICAgd2l0aCBvcGVuKGNvbmZpZ19oKSBhcyBmOgogICAgICAgICAgICBwYXJzZV9jb25maWdfaChmLCB2YXJzKQogICAgZXhjZXB0IElPRXJyb3IgYXMgZToKICAgICAgICBtc2cgPSAiaW52YWxpZCBQeXRob24gaW5zdGFsbGF0aW9uOiB1bmFibGUgdG8gb3BlbiAlcyIgJSBjb25maWdfaAogICAgICAgIGlmIGhhc2F0dHIoZSwgInN0cmVycm9yIik6CiAgICAgICAgICAgIG1zZyA9IG1zZyArICIgKCVzKSIgJSBlLnN0cmVycm9yCiAgICAgICAgcmFpc2UgSU9FcnJvcihtc2cpCiAgICAjIE9uIEFJWCwgdGhlcmUgYXJlIHdyb25nIHBhdGhzIHRvIHRoZSBsaW5rZXIgc2NyaXB0cyBpbiB0aGUgTWFrZWZpbGUKICAgICMgLS0gdGhlc2UgcGF0aHMgYXJlIHJlbGF0aXZlIHRvIHRoZSBQeXRob24gc291cmNlLCBidXQgd2hlbiBpbnN0YWxsZWQKICAgICMgdGhlIHNjcmlwdHMgYXJlIGluIGFub3RoZXIgZGlyZWN0b3J5LgogICAgaWYgX1BZVEhPTl9CVUlMRDoKICAgICAgICB2YXJzWydMRFNIQVJFRCddID0gdmFyc1snQkxEU0hBUkVEJ10KCgpkZWYgX2luaXRfbm9uX3Bvc2l4KHZhcnMpOgogICAgIiIiSW5pdGlhbGl6ZSB0aGUgbW9kdWxlIGFzIGFwcHJvcHJpYXRlIGZvciBOVCIiIgogICAgIyBzZXQgYmFzaWMgaW5zdGFsbCBkaXJlY3RvcmllcwogICAgdmFyc1snTElCREVTVCddID0gZ2V0X3BhdGgoJ3N0ZGxpYicpCiAgICB2YXJzWydCSU5MSUJERVNUJ10gPSBnZXRfcGF0aCgncGxhdHN0ZGxpYicpCiAgICB2YXJzWydJTkNMVURFUFknXSA9IGdldF9wYXRoKCdpbmNsdWRlJykKICAgIHZhcnNbJ1NPJ10gPSAnLnB5ZCcKICAgIHZhcnNbJ0VYRSddID0gJy5leGUnCiAgICB2YXJzWydWRVJTSU9OJ10gPSBfUFlfVkVSU0lPTl9TSE9SVF9OT19ET1QKICAgIHZhcnNbJ0JJTkRJUiddID0gb3MucGF0aC5kaXJuYW1lKF9zYWZlX3JlYWxwYXRoKHN5cy5leGVjdXRhYmxlKSkKCiMKIyBwdWJsaWMgQVBJcwojCgoKZGVmIHBhcnNlX2NvbmZpZ19oKGZwLCB2YXJzPU5vbmUpOgogICAgIiIiUGFyc2UgYSBjb25maWcuaC1zdHlsZSBmaWxlLgoKICAgIEEgZGljdGlvbmFyeSBjb250YWluaW5nIG5hbWUvdmFsdWUgcGFpcnMgaXMgcmV0dXJuZWQuICBJZiBhbgogICAgb3B0aW9uYWwgZGljdGlvbmFyeSBpcyBwYXNzZWQgaW4gYXMgdGhlIHNlY29uZCBhcmd1bWVudCwgaXQgaXMKICAgIHVzZWQgaW5zdGVhZCBvZiBhIG5ldyBkaWN0aW9uYXJ5LgogICAgIiIiCiAgICBpZiB2YXJzIGlzIE5vbmU6CiAgICAgICAgdmFycyA9IHt9CiAgICBkZWZpbmVfcnggPSByZS5jb21waWxlKCIjZGVmaW5lIChbQS1aXVtBLVphLXowLTlfXSspICguKilcbiIpCiAgICB1bmRlZl9yeCA9IHJlLmNvbXBpbGUoIi9bKl0gI3VuZGVmIChbQS1aXVtBLVphLXowLTlfXSspIFsqXS9cbiIpCgogICAgd2hpbGUgVHJ1ZToKICAgICAgICBsaW5lID0gZnAucmVhZGxpbmUoKQogICAgICAgIGlmIG5vdCBsaW5lOgogICAgICAgICAgICBicmVhawogICAgICAgIG0gPSBkZWZpbmVfcngubWF0Y2gobGluZSkKICAgICAgICBpZiBtOgogICAgICAgICAgICBuLCB2ID0gbS5ncm91cCgxLCAyKQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICB2ID0gaW50KHYpCiAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICB2YXJzW25dID0gdgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG0gPSB1bmRlZl9yeC5tYXRjaChsaW5lKQogICAgICAgICAgICBpZiBtOgogICAgICAgICAgICAgICAgdmFyc1ttLmdyb3VwKDEpXSA9IDAKICAgIHJldHVybiB2YXJzCgoKZGVmIGdldF9jb25maWdfaF9maWxlbmFtZSgpOgogICAgIiIiUmV0dXJuIHRoZSBwYXRoIG9mIHB5Y29uZmlnLmguIiIiCiAgICBpZiBfUFlUSE9OX0JVSUxEOgogICAgICAgIGlmIG9zLm5hbWUgPT0gIm50IjoKICAgICAgICAgICAgaW5jX2RpciA9IG9zLnBhdGguam9pbihfUFJPSkVDVF9CQVNFLCAiUEMiKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGluY19kaXIgPSBfUFJPSkVDVF9CQVNFCiAgICBlbHNlOgogICAgICAgIGluY19kaXIgPSBnZXRfcGF0aCgncGxhdGluY2x1ZGUnKQogICAgcmV0dXJuIG9zLnBhdGguam9pbihpbmNfZGlyLCAncHljb25maWcuaCcpCgoKZGVmIGdldF9zY2hlbWVfbmFtZXMoKToKICAgICIiIlJldHVybiBhIHR1cGxlIGNvbnRhaW5pbmcgdGhlIHNjaGVtZXMgbmFtZXMuIiIiCiAgICByZXR1cm4gdHVwbGUoc29ydGVkKF9TQ0hFTUVTLnNlY3Rpb25zKCkpKQoKCmRlZiBnZXRfcGF0aF9uYW1lcygpOgogICAgIiIiUmV0dXJuIGEgdHVwbGUgY29udGFpbmluZyB0aGUgcGF0aHMgbmFtZXMuIiIiCiAgICAjIHh4eCBzZWUgaWYgd2Ugd2FudCBhIHN0YXRpYyBsaXN0CiAgICByZXR1cm4gX1NDSEVNRVMub3B0aW9ucygncG9zaXhfcHJlZml4JykKCgpkZWYgZ2V0X3BhdGhzKHNjaGVtZT1fZ2V0X2RlZmF1bHRfc2NoZW1lKCksIHZhcnM9Tm9uZSwgZXhwYW5kPVRydWUpOgogICAgIiIiUmV0dXJuIGEgbWFwcGluZyBjb250YWluaW5nIGFuIGluc3RhbGwgc2NoZW1lLgoKICAgIGBgc2NoZW1lYGAgaXMgdGhlIGluc3RhbGwgc2NoZW1lIG5hbWUuIElmIG5vdCBwcm92aWRlZCwgaXQgd2lsbAogICAgcmV0dXJuIHRoZSBkZWZhdWx0IHNjaGVtZSBmb3IgdGhlIGN1cnJlbnQgcGxhdGZvcm0uCiAgICAiIiIKICAgIF9lbnN1cmVfY2ZnX3JlYWQoKQogICAgaWYgZXhwYW5kOgogICAgICAgIHJldHVybiBfZXhwYW5kX3ZhcnMoc2NoZW1lLCB2YXJzKQogICAgZWxzZToKICAgICAgICByZXR1cm4gZGljdChfU0NIRU1FUy5pdGVtcyhzY2hlbWUpKQoKCmRlZiBnZXRfcGF0aChuYW1lLCBzY2hlbWU9X2dldF9kZWZhdWx0X3NjaGVtZSgpLCB2YXJzPU5vbmUsIGV4cGFuZD1UcnVlKToKICAgICIiIlJldHVybiBhIHBhdGggY29ycmVzcG9uZGluZyB0byB0aGUgc2NoZW1lLgoKICAgIGBgc2NoZW1lYGAgaXMgdGhlIGluc3RhbGwgc2NoZW1lIG5hbWUuCiAgICAiIiIKICAgIHJldHVybiBnZXRfcGF0aHMoc2NoZW1lLCB2YXJzLCBleHBhbmQpW25hbWVdCgoKZGVmIGdldF9jb25maWdfdmFycygqYXJncyk6CiAgICAiIiJXaXRoIG5vIGFyZ3VtZW50cywgcmV0dXJuIGEgZGljdGlvbmFyeSBvZiBhbGwgY29uZmlndXJhdGlvbgogICAgdmFyaWFibGVzIHJlbGV2YW50IGZvciB0aGUgY3VycmVudCBwbGF0Zm9ybS4KCiAgICBPbiBVbml4LCB0aGlzIG1lYW5zIGV2ZXJ5IHZhcmlhYmxlIGRlZmluZWQgaW4gUHl0aG9uJ3MgaW5zdGFsbGVkIE1ha2VmaWxlOwogICAgT24gV2luZG93cyBhbmQgTWFjIE9TIGl0J3MgYSBtdWNoIHNtYWxsZXIgc2V0LgoKICAgIFdpdGggYXJndW1lbnRzLCByZXR1cm4gYSBsaXN0IG9mIHZhbHVlcyB0aGF0IHJlc3VsdCBmcm9tIGxvb2tpbmcgdXAKICAgIGVhY2ggYXJndW1lbnQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gdmFyaWFibGUgZGljdGlvbmFyeS4KICAgICIiIgogICAgZ2xvYmFsIF9DT05GSUdfVkFSUwogICAgaWYgX0NPTkZJR19WQVJTIGlzIE5vbmU6CiAgICAgICAgX0NPTkZJR19WQVJTID0ge30KICAgICAgICAjIE5vcm1hbGl6ZWQgdmVyc2lvbnMgb2YgcHJlZml4IGFuZCBleGVjX3ByZWZpeCBhcmUgaGFuZHkgdG8gaGF2ZTsKICAgICAgICAjIGluIGZhY3QsIHRoZXNlIGFyZSB0aGUgc3RhbmRhcmQgdmVyc2lvbnMgdXNlZCBtb3N0IHBsYWNlcyBpbiB0aGUKICAgICAgICAjIGRpc3R1dGlsczIgbW9kdWxlLgogICAgICAgIF9DT05GSUdfVkFSU1sncHJlZml4J10gPSBfUFJFRklYCiAgICAgICAgX0NPTkZJR19WQVJTWydleGVjX3ByZWZpeCddID0gX0VYRUNfUFJFRklYCiAgICAgICAgX0NPTkZJR19WQVJTWydweV92ZXJzaW9uJ10gPSBfUFlfVkVSU0lPTgogICAgICAgIF9DT05GSUdfVkFSU1sncHlfdmVyc2lvbl9zaG9ydCddID0gX1BZX1ZFUlNJT05fU0hPUlQKICAgICAgICBfQ09ORklHX1ZBUlNbJ3B5X3ZlcnNpb25fbm9kb3QnXSA9IF9QWV9WRVJTSU9OWzBdICsgX1BZX1ZFUlNJT05bMl0KICAgICAgICBfQ09ORklHX1ZBUlNbJ2Jhc2UnXSA9IF9QUkVGSVgKICAgICAgICBfQ09ORklHX1ZBUlNbJ3BsYXRiYXNlJ10gPSBfRVhFQ19QUkVGSVgKICAgICAgICBfQ09ORklHX1ZBUlNbJ3Byb2plY3RiYXNlJ10gPSBfUFJPSkVDVF9CQVNFCiAgICAgICAgdHJ5OgogICAgICAgICAgICBfQ09ORklHX1ZBUlNbJ2FiaWZsYWdzJ10gPSBzeXMuYWJpZmxhZ3MKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgICMgc3lzLmFiaWZsYWdzIG1heSBub3QgYmUgZGVmaW5lZCBvbiBhbGwgcGxhdGZvcm1zLgogICAgICAgICAgICBfQ09ORklHX1ZBUlNbJ2FiaWZsYWdzJ10gPSAnJwoKICAgICAgICBpZiBvcy5uYW1lIGluICgnbnQnLCAnb3MyJyk6CiAgICAgICAgICAgIF9pbml0X25vbl9wb3NpeChfQ09ORklHX1ZBUlMpCiAgICAgICAgaWYgb3MubmFtZSA9PSAncG9zaXgnOgogICAgICAgICAgICBfaW5pdF9wb3NpeChfQ09ORklHX1ZBUlMpCiAgICAgICAgIyBTZXR0aW5nICd1c2VyYmFzZScgaXMgZG9uZSBiZWxvdyB0aGUgY2FsbCB0byB0aGUKICAgICAgICAjIGluaXQgZnVuY3Rpb24gdG8gZW5hYmxlIHVzaW5nICdnZXRfY29uZmlnX3ZhcicgaW4KICAgICAgICAjIHRoZSBpbml0LWZ1bmN0aW9uLgogICAgICAgIGlmIHN5cy52ZXJzaW9uID49ICcyLjYnOgogICAgICAgICAgICBfQ09ORklHX1ZBUlNbJ3VzZXJiYXNlJ10gPSBfZ2V0dXNlcmJhc2UoKQoKICAgICAgICBpZiAnc3JjZGlyJyBub3QgaW4gX0NPTkZJR19WQVJTOgogICAgICAgICAgICBfQ09ORklHX1ZBUlNbJ3NyY2RpciddID0gX1BST0pFQ1RfQkFTRQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIF9DT05GSUdfVkFSU1snc3JjZGlyJ10gPSBfc2FmZV9yZWFscGF0aChfQ09ORklHX1ZBUlNbJ3NyY2RpciddKQoKICAgICAgICAjIENvbnZlcnQgc3JjZGlyIGludG8gYW4gYWJzb2x1dGUgcGF0aCBpZiBpdCBhcHBlYXJzIG5lY2Vzc2FyeS4KICAgICAgICAjIE5vcm1hbGx5IGl0IGlzIHJlbGF0aXZlIHRvIHRoZSBidWlsZCBkaXJlY3RvcnkuICBIb3dldmVyLCBkdXJpbmcKICAgICAgICAjIHRlc3RpbmcsIGZvciBleGFtcGxlLCB3ZSBtaWdodCBiZSBydW5uaW5nIGEgbm9uLWluc3RhbGxlZCBweXRob24KICAgICAgICAjIGZyb20gYSBkaWZmZXJlbnQgZGlyZWN0b3J5LgogICAgICAgIGlmIF9QWVRIT05fQlVJTEQgYW5kIG9zLm5hbWUgPT0gInBvc2l4IjoKICAgICAgICAgICAgYmFzZSA9IF9QUk9KRUNUX0JBU0UKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgY3dkID0gb3MuZ2V0Y3dkKCkKICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6CiAgICAgICAgICAgICAgICBjd2QgPSBOb25lCiAgICAgICAgICAgIGlmIChub3Qgb3MucGF0aC5pc2FicyhfQ09ORklHX1ZBUlNbJ3NyY2RpciddKSBhbmQKICAgICAgICAgICAgICAgIGJhc2UgIT0gY3dkKToKICAgICAgICAgICAgICAgICMgc3JjZGlyIGlzIHJlbGF0aXZlIGFuZCB3ZSBhcmUgbm90IGluIHRoZSBzYW1lIGRpcmVjdG9yeQogICAgICAgICAgICAgICAgIyBhcyB0aGUgZXhlY3V0YWJsZS4gQXNzdW1lIGV4ZWN1dGFibGUgaXMgaW4gdGhlIGJ1aWxkCiAgICAgICAgICAgICAgICAjIGRpcmVjdG9yeSBhbmQgbWFrZSBzcmNkaXIgYWJzb2x1dGUuCiAgICAgICAgICAgICAgICBzcmNkaXIgPSBvcy5wYXRoLmpvaW4oYmFzZSwgX0NPTkZJR19WQVJTWydzcmNkaXInXSkKICAgICAgICAgICAgICAgIF9DT05GSUdfVkFSU1snc3JjZGlyJ10gPSBvcy5wYXRoLm5vcm1wYXRoKHNyY2RpcikKCiAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nOgogICAgICAgICAgICBrZXJuZWxfdmVyc2lvbiA9IG9zLnVuYW1lKClbMl0gICMgS2VybmVsIHZlcnNpb24gKDguNC4zKQogICAgICAgICAgICBtYWpvcl92ZXJzaW9uID0gaW50KGtlcm5lbF92ZXJzaW9uLnNwbGl0KCcuJylbMF0pCgogICAgICAgICAgICBpZiBtYWpvcl92ZXJzaW9uIDwgODoKICAgICAgICAgICAgICAgICMgT24gbWFjT1MgYmVmb3JlIDEwLjQsIGNoZWNrIGlmIC1hcmNoIGFuZCAtaXN5c3Jvb3QKICAgICAgICAgICAgICAgICMgYXJlIGluIENGTEFHUyBvciBMREZMQUdTIGFuZCByZW1vdmUgdGhlbSBpZiB0aGV5IGFyZS4KICAgICAgICAgICAgICAgICMgVGhpcyBpcyBuZWVkZWQgd2hlbiBidWlsZGluZyBleHRlbnNpb25zIG9uIGEgMTAuMyBzeXN0ZW0KICAgICAgICAgICAgICAgICMgdXNpbmcgYSB1bml2ZXJzYWwgYnVpbGQgb2YgcHl0aG9uLgogICAgICAgICAgICAgICAgZm9yIGtleSBpbiAoJ0xERkxBR1MnLCAnQkFTRUNGTEFHUycsCiAgICAgICAgICAgICAgICAgICAgICAgICMgYSBudW1iZXIgb2YgZGVyaXZlZCB2YXJpYWJsZXMuIFRoZXNlIG5lZWQgdG8gYmUKICAgICAgICAgICAgICAgICAgICAgICAgIyBwYXRjaGVkIHVwIGFzIHdlbGwuCiAgICAgICAgICAgICAgICAgICAgICAgICdDRkxBR1MnLCAnUFlfQ0ZMQUdTJywgJ0JMRFNIQVJFRCcpOgogICAgICAgICAgICAgICAgICAgIGZsYWdzID0gX0NPTkZJR19WQVJTW2tleV0KICAgICAgICAgICAgICAgICAgICBmbGFncyA9IHJlLnN1YignLWFyY2hccytcdytccycsICcgJywgZmxhZ3MpCiAgICAgICAgICAgICAgICAgICAgZmxhZ3MgPSByZS5zdWIoJy1pc3lzcm9vdCBbXiBcdF0qJywgJyAnLCBmbGFncykKICAgICAgICAgICAgICAgICAgICBfQ09ORklHX1ZBUlNba2V5XSA9IGZsYWdzCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIEFsbG93IHRoZSB1c2VyIHRvIG92ZXJyaWRlIHRoZSBhcmNoaXRlY3R1cmUgZmxhZ3MgdXNpbmcKICAgICAgICAgICAgICAgICMgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUuCiAgICAgICAgICAgICAgICAjIE5PVEU6IFRoaXMgbmFtZSB3YXMgaW50cm9kdWNlZCBieSBBcHBsZSBpbiBPU1ggMTAuNSBhbmQKICAgICAgICAgICAgICAgICMgaXMgdXNlZCBieSBzZXZlcmFsIHNjcmlwdGluZyBsYW5ndWFnZXMgZGlzdHJpYnV0ZWQgd2l0aAogICAgICAgICAgICAgICAgIyB0aGF0IE9TIHJlbGVhc2UuCiAgICAgICAgICAgICAgICBpZiAnQVJDSEZMQUdTJyBpbiBvcy5lbnZpcm9uOgogICAgICAgICAgICAgICAgICAgIGFyY2ggPSBvcy5lbnZpcm9uWydBUkNIRkxBR1MnXQogICAgICAgICAgICAgICAgICAgIGZvciBrZXkgaW4gKCdMREZMQUdTJywgJ0JBU0VDRkxBR1MnLAogICAgICAgICAgICAgICAgICAgICAgICAjIGEgbnVtYmVyIG9mIGRlcml2ZWQgdmFyaWFibGVzLiBUaGVzZSBuZWVkIHRvIGJlCiAgICAgICAgICAgICAgICAgICAgICAgICMgcGF0Y2hlZCB1cCBhcyB3ZWxsLgogICAgICAgICAgICAgICAgICAgICAgICAnQ0ZMQUdTJywgJ1BZX0NGTEFHUycsICdCTERTSEFSRUQnKToKCiAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzID0gX0NPTkZJR19WQVJTW2tleV0KICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgPSByZS5zdWIoJy1hcmNoXHMrXHcrXHMnLCAnICcsIGZsYWdzKQogICAgICAgICAgICAgICAgICAgICAgICBmbGFncyA9IGZsYWdzICsgJyAnICsgYXJjaAogICAgICAgICAgICAgICAgICAgICAgICBfQ09ORklHX1ZBUlNba2V5XSA9IGZsYWdzCgogICAgICAgICAgICAgICAgIyBJZiB3ZSdyZSBvbiBPU1ggMTAuNSBvciBsYXRlciBhbmQgdGhlIHVzZXIgdHJpZXMgdG8KICAgICAgICAgICAgICAgICMgY29tcGlsZXMgYW4gZXh0ZW5zaW9uIHVzaW5nIGFuIFNESyB0aGF0IGlzIG5vdCBwcmVzZW50CiAgICAgICAgICAgICAgICAjIG9uIHRoZSBjdXJyZW50IG1hY2hpbmUgaXQgaXMgYmV0dGVyIHRvIG5vdCB1c2UgYW4gU0RLCiAgICAgICAgICAgICAgICAjIHRoYW4gdG8gZmFpbC4KICAgICAgICAgICAgICAgICMKICAgICAgICAgICAgICAgICMgVGhlIG1ham9yIHVzZWNhc2UgZm9yIHRoaXMgaXMgdXNlcnMgdXNpbmcgYSBQeXRob24ub3JnCiAgICAgICAgICAgICAgICAjIGJpbmFyeSBpbnN0YWxsZXIgIG9uIE9TWCAxMC42OiB0aGF0IGluc3RhbGxlciB1c2VzCiAgICAgICAgICAgICAgICAjIHRoZSAxMC40dSBTREssIGJ1dCB0aGF0IFNESyBpcyBub3QgaW5zdGFsbGVkIGJ5IGRlZmF1bHQKICAgICAgICAgICAgICAgICMgd2hlbiB5b3UgaW5zdGFsbCBYY29kZS4KICAgICAgICAgICAgICAgICMKICAgICAgICAgICAgICAgIENGTEFHUyA9IF9DT05GSUdfVkFSUy5nZXQoJ0NGTEFHUycsICcnKQogICAgICAgICAgICAgICAgbSA9IHJlLnNlYXJjaCgnLWlzeXNyb290XHMrKFxTKyknLCBDRkxBR1MpCiAgICAgICAgICAgICAgICBpZiBtIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgIHNkayA9IG0uZ3JvdXAoMSkKICAgICAgICAgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoc2RrKToKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGtleSBpbiAoJ0xERkxBR1MnLCAnQkFTRUNGTEFHUycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhIG51bWJlciBvZiBkZXJpdmVkIHZhcmlhYmxlcy4gVGhlc2UgbmVlZCB0byBiZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcGF0Y2hlZCB1cCBhcyB3ZWxsLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NGTEFHUycsICdQWV9DRkxBR1MnLCAnQkxEU0hBUkVEJyk6CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgPSBfQ09ORklHX1ZBUlNba2V5XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgPSByZS5zdWIoJy1pc3lzcm9vdFxzK1xTKyhcc3wkKScsICcgJywgZmxhZ3MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ09ORklHX1ZBUlNba2V5XSA9IGZsYWdzCgogICAgaWYgYXJnczoKICAgICAgICB2YWxzID0gW10KICAgICAgICBmb3IgbmFtZSBpbiBhcmdzOgogICAgICAgICAgICB2YWxzLmFwcGVuZChfQ09ORklHX1ZBUlMuZ2V0KG5hbWUpKQogICAgICAgIHJldHVybiB2YWxzCiAgICBlbHNlOgogICAgICAgIHJldHVybiBfQ09ORklHX1ZBUlMKCgpkZWYgZ2V0X2NvbmZpZ192YXIobmFtZSk6CiAgICAiIiJSZXR1cm4gdGhlIHZhbHVlIG9mIGEgc2luZ2xlIHZhcmlhYmxlIHVzaW5nIHRoZSBkaWN0aW9uYXJ5IHJldHVybmVkIGJ5CiAgICAnZ2V0X2NvbmZpZ192YXJzKCknLgoKICAgIEVxdWl2YWxlbnQgdG8gZ2V0X2NvbmZpZ192YXJzKCkuZ2V0KG5hbWUpCiAgICAiIiIKICAgIHJldHVybiBnZXRfY29uZmlnX3ZhcnMoKS5nZXQobmFtZSkKCgpkZWYgZ2V0X3BsYXRmb3JtKCk6CiAgICAiIiJSZXR1cm4gYSBzdHJpbmcgdGhhdCBpZGVudGlmaWVzIHRoZSBjdXJyZW50IHBsYXRmb3JtLgoKICAgIFRoaXMgaXMgdXNlZCBtYWlubHkgdG8gZGlzdGluZ3Vpc2ggcGxhdGZvcm0tc3BlY2lmaWMgYnVpbGQgZGlyZWN0b3JpZXMgYW5kCiAgICBwbGF0Zm9ybS1zcGVjaWZpYyBidWlsdCBkaXN0cmlidXRpb25zLiAgVHlwaWNhbGx5IGluY2x1ZGVzIHRoZSBPUyBuYW1lCiAgICBhbmQgdmVyc2lvbiBhbmQgdGhlIGFyY2hpdGVjdHVyZSAoYXMgc3VwcGxpZWQgYnkgJ29zLnVuYW1lKCknKSwKICAgIGFsdGhvdWdoIHRoZSBleGFjdCBpbmZvcm1hdGlvbiBpbmNsdWRlZCBkZXBlbmRzIG9uIHRoZSBPUzsgZWcuIGZvciBJUklYCiAgICB0aGUgYXJjaGl0ZWN0dXJlIGlzbid0IHBhcnRpY3VsYXJseSBpbXBvcnRhbnQgKElSSVggb25seSBydW5zIG9uIFNHSQogICAgaGFyZHdhcmUpLCBidXQgZm9yIExpbnV4IHRoZSBrZXJuZWwgdmVyc2lvbiBpc24ndCBwYXJ0aWN1bGFybHkKICAgIGltcG9ydGFudC4KCiAgICBFeGFtcGxlcyBvZiByZXR1cm5lZCB2YWx1ZXM6CiAgICAgICBsaW51eC1pNTg2CiAgICAgICBsaW51eC1hbHBoYSAoPykKICAgICAgIHNvbGFyaXMtMi42LXN1bjR1CiAgICAgICBpcml4LTUuMwogICAgICAgaXJpeDY0LTYuMgoKICAgIFdpbmRvd3Mgd2lsbCByZXR1cm4gb25lIG9mOgogICAgICAgd2luLWFtZDY0ICg2NGJpdCBXaW5kb3dzIG9uIEFNRDY0IChha2EgeDg2XzY0LCBJbnRlbDY0LCBFTTY0VCwgZXRjKQogICAgICAgd2luLWlhNjQgKDY0Yml0IFdpbmRvd3Mgb24gSXRhbml1bSkKICAgICAgIHdpbjMyIChhbGwgb3RoZXJzIC0gc3BlY2lmaWNhbGx5LCBzeXMucGxhdGZvcm0gaXMgcmV0dXJuZWQpCgogICAgRm9yIG90aGVyIG5vbi1QT1NJWCBwbGF0Zm9ybXMsIGN1cnJlbnRseSBqdXN0IHJldHVybnMgJ3N5cy5wbGF0Zm9ybScuCiAgICAiIiIKICAgIGlmIG9zLm5hbWUgPT0gJ250JzoKICAgICAgICAjIHNuaWZmIHN5cy52ZXJzaW9uIGZvciBhcmNoaXRlY3R1cmUuCiAgICAgICAgcHJlZml4ID0gIiBiaXQgKCIKICAgICAgICBpID0gc3lzLnZlcnNpb24uZmluZChwcmVmaXgpCiAgICAgICAgaWYgaSA9PSAtMToKICAgICAgICAgICAgcmV0dXJuIHN5cy5wbGF0Zm9ybQogICAgICAgIGogPSBzeXMudmVyc2lvbi5maW5kKCIpIiwgaSkKICAgICAgICBsb29rID0gc3lzLnZlcnNpb25baStsZW4ocHJlZml4KTpqXS5sb3dlcigpCiAgICAgICAgaWYgbG9vayA9PSAnYW1kNjQnOgogICAgICAgICAgICByZXR1cm4gJ3dpbi1hbWQ2NCcKICAgICAgICBpZiBsb29rID09ICdpdGFuaXVtJzoKICAgICAgICAgICAgcmV0dXJuICd3aW4taWE2NCcKICAgICAgICByZXR1cm4gc3lzLnBsYXRmb3JtCgogICAgaWYgb3MubmFtZSAhPSAicG9zaXgiIG9yIG5vdCBoYXNhdHRyKG9zLCAndW5hbWUnKToKICAgICAgICAjIFhYWCB3aGF0IGFib3V0IHRoZSBhcmNoaXRlY3R1cmU/IE5UIGlzIEludGVsIG9yIEFscGhhLAogICAgICAgICMgTWFjIE9TIGlzIE02OGsgb3IgUFBDLCBldGMuCiAgICAgICAgcmV0dXJuIHN5cy5wbGF0Zm9ybQoKICAgICMgVHJ5IHRvIGRpc3Rpbmd1aXNoIHZhcmlvdXMgZmxhdm91cnMgb2YgVW5peAogICAgb3NuYW1lLCBob3N0LCByZWxlYXNlLCB2ZXJzaW9uLCBtYWNoaW5lID0gb3MudW5hbWUoKQoKICAgICMgQ29udmVydCB0aGUgT1MgbmFtZSB0byBsb3dlcmNhc2UsIHJlbW92ZSAnLycgY2hhcmFjdGVycwogICAgIyAodG8gYWNjb21tb2RhdGUgQlNEL09TKSwgYW5kIHRyYW5zbGF0ZSBzcGFjZXMgKGZvciAiUG93ZXIgTWFjaW50b3NoIikKICAgIG9zbmFtZSA9IG9zbmFtZS5sb3dlcigpLnJlcGxhY2UoJy8nLCAnJykKICAgIG1hY2hpbmUgPSBtYWNoaW5lLnJlcGxhY2UoJyAnLCAnXycpCiAgICBtYWNoaW5lID0gbWFjaGluZS5yZXBsYWNlKCcvJywgJy0nKQoKICAgIGlmIG9zbmFtZVs6NV0gPT0gImxpbnV4IjoKICAgICAgICAjIEF0IGxlYXN0IG9uIExpbnV4L0ludGVsLCAnbWFjaGluZScgaXMgdGhlIHByb2Nlc3NvciAtLQogICAgICAgICMgaTM4NiwgZXRjLgogICAgICAgICMgWFhYIHdoYXQgYWJvdXQgQWxwaGEsIFNQQVJDLCBldGM/CiAgICAgICAgcmV0dXJuICAiJXMtJXMiICUgKG9zbmFtZSwgbWFjaGluZSkKICAgIGVsaWYgb3NuYW1lWzo1XSA9PSAic3Vub3MiOgogICAgICAgIGlmIHJlbGVhc2VbMF0gPj0gIjUiOiAgICAgICAgICAgIyBTdW5PUyA1ID09IFNvbGFyaXMgMgogICAgICAgICAgICBvc25hbWUgPSAic29sYXJpcyIKICAgICAgICAgICAgcmVsZWFzZSA9ICIlZC4lcyIgJSAoaW50KHJlbGVhc2VbMF0pIC0gMywgcmVsZWFzZVsyOl0pCiAgICAgICAgIyBmYWxsIHRocm91Z2ggdG8gc3RhbmRhcmQgb3NuYW1lLXJlbGVhc2UtbWFjaGluZSByZXByZXNlbnRhdGlvbgogICAgZWxpZiBvc25hbWVbOjRdID09ICJpcml4IjogICAgICAgICAgICAgICMgY291bGQgYmUgImlyaXg2NCIhCiAgICAgICAgcmV0dXJuICIlcy0lcyIgJSAob3NuYW1lLCByZWxlYXNlKQogICAgZWxpZiBvc25hbWVbOjNdID09ICJhaXgiOgogICAgICAgIHJldHVybiAiJXMtJXMuJXMiICUgKG9zbmFtZSwgdmVyc2lvbiwgcmVsZWFzZSkKICAgIGVsaWYgb3NuYW1lWzo2XSA9PSAiY3lnd2luIjoKICAgICAgICBvc25hbWUgPSAiY3lnd2luIgogICAgICAgIHJlbF9yZSA9IHJlLmNvbXBpbGUocidbXGQuXSsnKQogICAgICAgIG0gPSByZWxfcmUubWF0Y2gocmVsZWFzZSkKICAgICAgICBpZiBtOgogICAgICAgICAgICByZWxlYXNlID0gbS5ncm91cCgpCiAgICBlbGlmIG9zbmFtZVs6Nl0gPT0gImRhcndpbiI6CiAgICAgICAgIwogICAgICAgICMgRm9yIG91ciBwdXJwb3Nlcywgd2UnbGwgYXNzdW1lIHRoYXQgdGhlIHN5c3RlbSB2ZXJzaW9uIGZyb20KICAgICAgICAjIGRpc3R1dGlscycgcGVyc3BlY3RpdmUgaXMgd2hhdCBNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQgaXMgc2V0CiAgICAgICAgIyB0by4gVGhpcyBtYWtlcyB0aGUgY29tcGF0aWJpbGl0eSBzdG9yeSBhIGJpdCBtb3JlIHNhbmUgYmVjYXVzZSB0aGUKICAgICAgICAjIG1hY2hpbmUgaXMgZ29pbmcgdG8gY29tcGlsZSBhbmQgbGluayBhcyBpZiBpdCB3ZXJlCiAgICAgICAgIyBNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQuCiAgICAgICAgY2ZndmFycyA9IGdldF9jb25maWdfdmFycygpCiAgICAgICAgbWFjdmVyID0gY2ZndmFycy5nZXQoJ01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVCcpCgogICAgICAgIGlmIFRydWU6CiAgICAgICAgICAgICMgQWx3YXlzIGNhbGN1bGF0ZSB0aGUgcmVsZWFzZSBvZiB0aGUgcnVubmluZyBtYWNoaW5lLAogICAgICAgICAgICAjIG5lZWRlZCB0byBkZXRlcm1pbmUgaWYgd2UgY2FuIGJ1aWxkIGZhdCBiaW5hcmllcyBvciBub3QuCgogICAgICAgICAgICBtYWNyZWxlYXNlID0gbWFjdmVyCiAgICAgICAgICAgICMgR2V0IHRoZSBzeXN0ZW0gdmVyc2lvbi4gUmVhZGluZyB0aGlzIHBsaXN0IGlzIGEgZG9jdW1lbnRlZAogICAgICAgICAgICAjIHdheSB0byBnZXQgdGhlIHN5c3RlbSB2ZXJzaW9uIChzZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yCiAgICAgICAgICAgICMgdGhlIEdlc3RhbHQgTWFuYWdlcikKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgZiA9IG9wZW4oJy9TeXN0ZW0vTGlicmFyeS9Db3JlU2VydmljZXMvU3lzdGVtVmVyc2lvbi5wbGlzdCcpCiAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgogICAgICAgICAgICAgICAgIyBXZSdyZSBvbiBhIHBsYWluIGRhcndpbiBib3gsIGZhbGwgYmFjayB0byB0aGUgZGVmYXVsdAogICAgICAgICAgICAgICAgIyBiZWhhdmlvdXIuCiAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgbSA9IHJlLnNlYXJjaChyJzxrZXk+UHJvZHVjdFVzZXJWaXNpYmxlVmVyc2lvbjwva2V5PlxzKicKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHInPHN0cmluZz4oLio/KTwvc3RyaW5nPicsIGYucmVhZCgpKQogICAgICAgICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgICAgICAgICBmLmNsb3NlKCkKICAgICAgICAgICAgICAgIGlmIG0gaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgbWFjcmVsZWFzZSA9ICcuJy5qb2luKG0uZ3JvdXAoMSkuc3BsaXQoJy4nKVs6Ml0pCiAgICAgICAgICAgICAgICAjIGVsc2U6IGZhbGwgYmFjayB0byB0aGUgZGVmYXVsdCBiZWhhdmlvdXIKCiAgICAgICAgaWYgbm90IG1hY3ZlcjoKICAgICAgICAgICAgbWFjdmVyID0gbWFjcmVsZWFzZQoKICAgICAgICBpZiBtYWN2ZXI6CiAgICAgICAgICAgIHJlbGVhc2UgPSBtYWN2ZXIKICAgICAgICAgICAgb3NuYW1lID0gIm1hY29zeCIKCiAgICAgICAgICAgIGlmICgobWFjcmVsZWFzZSArICcuJykgPj0gJzEwLjQuJyBhbmQKICAgICAgICAgICAgICAgICctYXJjaCcgaW4gZ2V0X2NvbmZpZ192YXJzKCkuZ2V0KCdDRkxBR1MnLCAnJykuc3RyaXAoKSk6CiAgICAgICAgICAgICAgICAjIFRoZSB1bml2ZXJzYWwgYnVpbGQgd2lsbCBidWlsZCBmYXQgYmluYXJpZXMsIGJ1dCBub3Qgb24KICAgICAgICAgICAgICAgICMgc3lzdGVtcyBiZWZvcmUgMTAuNAogICAgICAgICAgICAgICAgIwogICAgICAgICAgICAgICAgIyBUcnkgdG8gZGV0ZWN0IDQtd2F5IHVuaXZlcnNhbCBidWlsZHMsIHRob3NlIGhhdmUgbWFjaGluZS10eXBlCiAgICAgICAgICAgICAgICAjICd1bml2ZXJzYWwnIGluc3RlYWQgb2YgJ2ZhdCcuCgogICAgICAgICAgICAgICAgbWFjaGluZSA9ICdmYXQnCiAgICAgICAgICAgICAgICBjZmxhZ3MgPSBnZXRfY29uZmlnX3ZhcnMoKS5nZXQoJ0NGTEFHUycpCgogICAgICAgICAgICAgICAgYXJjaHMgPSByZS5maW5kYWxsKCctYXJjaFxzKyhcUyspJywgY2ZsYWdzKQogICAgICAgICAgICAgICAgYXJjaHMgPSB0dXBsZShzb3J0ZWQoc2V0KGFyY2hzKSkpCgogICAgICAgICAgICAgICAgaWYgbGVuKGFyY2hzKSA9PSAxOgogICAgICAgICAgICAgICAgICAgIG1hY2hpbmUgPSBhcmNoc1swXQogICAgICAgICAgICAgICAgZWxpZiBhcmNocyA9PSAoJ2kzODYnLCAncHBjJyk6CiAgICAgICAgICAgICAgICAgICAgbWFjaGluZSA9ICdmYXQnCiAgICAgICAgICAgICAgICBlbGlmIGFyY2hzID09ICgnaTM4NicsICd4ODZfNjQnKToKICAgICAgICAgICAgICAgICAgICBtYWNoaW5lID0gJ2ludGVsJwogICAgICAgICAgICAgICAgZWxpZiBhcmNocyA9PSAoJ2kzODYnLCAncHBjJywgJ3g4Nl82NCcpOgogICAgICAgICAgICAgICAgICAgIG1hY2hpbmUgPSAnZmF0MycKICAgICAgICAgICAgICAgIGVsaWYgYXJjaHMgPT0gKCdwcGM2NCcsICd4ODZfNjQnKToKICAgICAgICAgICAgICAgICAgICBtYWNoaW5lID0gJ2ZhdDY0JwogICAgICAgICAgICAgICAgZWxpZiBhcmNocyA9PSAoJ2kzODYnLCAncHBjJywgJ3BwYzY0JywgJ3g4Nl82NCcpOgogICAgICAgICAgICAgICAgICAgIG1hY2hpbmUgPSAndW5pdmVyc2FsJwogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICJEb24ndCBrbm93IG1hY2hpbmUgdmFsdWUgZm9yIGFyY2hzPSVyIiAlIChhcmNocywpKQoKICAgICAgICAgICAgZWxpZiBtYWNoaW5lID09ICdpMzg2JzoKICAgICAgICAgICAgICAgICMgT24gT1NYIHRoZSBtYWNoaW5lIHR5cGUgcmV0dXJuZWQgYnkgdW5hbWUgaXMgYWx3YXlzIHRoZQogICAgICAgICAgICAgICAgIyAzMi1iaXQgdmFyaWFudCwgZXZlbiBpZiB0aGUgZXhlY3V0YWJsZSBhcmNoaXRlY3R1cmUgaXMKICAgICAgICAgICAgICAgICMgdGhlIDY0LWJpdCB2YXJpYW50CiAgICAgICAgICAgICAgICBpZiBzeXMubWF4c2l6ZSA+PSAyKiozMjoKICAgICAgICAgICAgICAgICAgICBtYWNoaW5lID0gJ3g4Nl82NCcKCiAgICAgICAgICAgIGVsaWYgbWFjaGluZSBpbiAoJ1Bvd2VyUEMnLCAnUG93ZXJfTWFjaW50b3NoJyk6CiAgICAgICAgICAgICAgICAjIFBpY2sgYSBzYW5lIG5hbWUgZm9yIHRoZSBQUEMgYXJjaGl0ZWN0dXJlLgogICAgICAgICAgICAgICAgIyBTZWUgJ2kzODYnIGNhc2UKICAgICAgICAgICAgICAgIGlmIHN5cy5tYXhzaXplID49IDIqKjMyOgogICAgICAgICAgICAgICAgICAgIG1hY2hpbmUgPSAncHBjNjQnCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIG1hY2hpbmUgPSAncHBjJwoKICAgIHJldHVybiAiJXMtJXMtJXMiICUgKG9zbmFtZSwgcmVsZWFzZSwgbWFjaGluZSkKCgpkZWYgZ2V0X3B5dGhvbl92ZXJzaW9uKCk6CiAgICByZXR1cm4gX1BZX1ZFUlNJT05fU0hPUlQKCgpkZWYgX3ByaW50X2RpY3QodGl0bGUsIGRhdGEpOgogICAgZm9yIGluZGV4LCAoa2V5LCB2YWx1ZSkgaW4gZW51bWVyYXRlKHNvcnRlZChkYXRhLml0ZW1zKCkpKToKICAgICAgICBpZiBpbmRleCA9PSAwOgogICAgICAgICAgICBwcmludCgnJXM6ICcgJSAodGl0bGUpKQogICAgICAgIHByaW50KCdcdCVzID0gIiVzIicgJSAoa2V5LCB2YWx1ZSkpCgoKZGVmIF9tYWluKCk6CiAgICAiIiJEaXNwbGF5IGFsbCBpbmZvcm1hdGlvbiBzeXNjb25maWcgZGV0YWlucy4iIiIKICAgIHByaW50KCdQbGF0Zm9ybTogIiVzIicgJSBnZXRfcGxhdGZvcm0oKSkKICAgIHByaW50KCdQeXRob24gdmVyc2lvbjogIiVzIicgJSBnZXRfcHl0aG9uX3ZlcnNpb24oKSkKICAgIHByaW50KCdDdXJyZW50IGluc3RhbGxhdGlvbiBzY2hlbWU6ICIlcyInICUgX2dldF9kZWZhdWx0X3NjaGVtZSgpKQogICAgcHJpbnQoKQogICAgX3ByaW50X2RpY3QoJ1BhdGhzJywgZ2V0X3BhdGhzKCkpCiAgICBwcmludCgpCiAgICBfcHJpbnRfZGljdCgnVmFyaWFibGVzJywgZ2V0X2NvbmZpZ192YXJzKCkpCgoKaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgIF9tYWluKCkKUEsDBBQAAAAAAAAAIQBEQh9D1GkBANRpAQBFAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0bGliL19iYWNrcG9ydC90YXJmaWxlLnB5Iy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyB0YXJmaWxlLnB5CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQ29weXJpZ2h0IChDKSAyMDAyIExhcnMgR3VzdGFlYmVsIDxsYXJzQGd1c3RhZWJlbC5kZT4KIyBBbGwgcmlnaHRzIHJlc2VydmVkLgojCiMgUGVybWlzc2lvbiAgaXMgIGhlcmVieSBncmFudGVkLCAgZnJlZSAgb2YgY2hhcmdlLCAgdG8gIGFueSBwZXJzb24KIyBvYnRhaW5pbmcgYSAgY29weSBvZiAgdGhpcyBzb2Z0d2FyZSAgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgojIGZpbGVzICAodGhlICAiU29mdHdhcmUiKSwgIHRvICAgZGVhbCAgaW4gIHRoZSAgU29mdHdhcmUgICB3aXRob3V0CiMgcmVzdHJpY3Rpb24sICBpbmNsdWRpbmcgIHdpdGhvdXQgbGltaXRhdGlvbiAgdGhlICByaWdodHMgdG8gIHVzZSwKIyBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAojIGNvcGllcyAgb2YgIHRoZSAgU29mdHdhcmUsICBhbmQgdG8gIHBlcm1pdCAgcGVyc29ucyAgdG8gIHdob20gdGhlCiMgU29mdHdhcmUgIGlzICBmdXJuaXNoZWQgIHRvICBkbyAgc28sICBzdWJqZWN0ICB0byAgdGhlICBmb2xsb3dpbmcKIyBjb25kaXRpb25zOgojCiMgVGhlIGFib3ZlIGNvcHlyaWdodCAgbm90aWNlIGFuZCB0aGlzICBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCAgYmUKIyBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KIwojIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgIEtJTkQsCiMgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgIEJVVCBOT1QgTElNSVRFRCBUTyAgVEhFIFdBUlJBTlRJRVMKIyBPRiAgTUVSQ0hBTlRBQklMSVRZLCAgRklUTkVTUyAgIEZPUiAgQSAgUEFSVElDVUxBUiAgIFBVUlBPU0UgIEFORAojIE5PTklORlJJTkdFTUVOVC4gIElOICBOTyAgRVZFTlQgU0hBTEwgIFRIRSAgQVVUSE9SUyAgT1IgQ09QWVJJR0hUCiMgSE9MREVSUyAgQkUgTElBQkxFICBGT1IgQU5ZICBDTEFJTSwgREFNQUdFUyAgT1IgT1RIRVIgIExJQUJJTElUWSwKIyBXSEVUSEVSICBJTiBBTiAgQUNUSU9OIE9GICBDT05UUkFDVCwgVE9SVCAgT1IgT1RIRVJXSVNFLCAgQVJJU0lORwojIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKIyBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCiMKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgoKIiIiUmVhZCBmcm9tIGFuZCB3cml0ZSB0byB0YXIgZm9ybWF0IGFyY2hpdmVzLgoiIiIKCl9fdmVyc2lvbl9fID0gIiRSZXZpc2lvbiQiCgp2ZXJzaW9uICAgICA9ICIwLjkuMCIKX19hdXRob3JfXyAgPSAiTGFycyBHdXN0XHUwMGU0YmVsIChsYXJzQGd1c3RhZWJlbC5kZSkiCl9fZGF0ZV9fICAgID0gIiREYXRlOiAyMDExLTAyLTI1IDE3OjQyOjAxICswMjAwIChGcmksIDI1IEZlYiAyMDExKSAkIgpfX2N2c2lkX18gICA9ICIkSWQ6IHRhcmZpbGUucHkgODg1ODYgMjAxMS0wMi0yNSAxNTo0MjowMVogbWFyYy1hbmRyZS5sZW1idXJnICQiCl9fY3JlZGl0c19fID0gIkd1c3Rhdm8gTmllbWV5ZXIsIE5pZWxzIEd1c3RcdTAwZTRiZWwsIFJpY2hhcmQgVG93bnNlbmQuIgoKIy0tLS0tLS0tLQojIEltcG9ydHMKIy0tLS0tLS0tLQppbXBvcnQgc3lzCmltcG9ydCBvcwppbXBvcnQgc3RhdAppbXBvcnQgZXJybm8KaW1wb3J0IHRpbWUKaW1wb3J0IHN0cnVjdAppbXBvcnQgY29weQppbXBvcnQgcmUKCnRyeToKICAgIGltcG9ydCBncnAsIHB3ZApleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBncnAgPSBwd2QgPSBOb25lCgojIG9zLnN5bWxpbmsgb24gV2luZG93cyBwcmlvciB0byA2LjAgcmFpc2VzIE5vdEltcGxlbWVudGVkRXJyb3IKc3ltbGlua19leGNlcHRpb24gPSAoQXR0cmlidXRlRXJyb3IsIE5vdEltcGxlbWVudGVkRXJyb3IpCnRyeToKICAgICMgV2luZG93c0Vycm9yICgxMzE0KSB3aWxsIGJlIHJhaXNlZCBpZiB0aGUgY2FsbGVyIGRvZXMgbm90IGhvbGQgdGhlCiAgICAjIFNlQ3JlYXRlU3ltYm9saWNMaW5rUHJpdmlsZWdlIHByaXZpbGVnZQogICAgc3ltbGlua19leGNlcHRpb24gKz0gKFdpbmRvd3NFcnJvciwpCmV4Y2VwdCBOYW1lRXJyb3I6CiAgICBwYXNzCgojIGZyb20gdGFyZmlsZSBpbXBvcnQgKgpfX2FsbF9fID0gWyJUYXJGaWxlIiwgIlRhckluZm8iLCAiaXNfdGFyZmlsZSIsICJUYXJFcnJvciJdCgppZiBzeXMudmVyc2lvbl9pbmZvWzBdIDwgMzoKICAgIGltcG9ydCBfX2J1aWx0aW5fXyBhcyBidWlsdGlucwplbHNlOgogICAgaW1wb3J0IGJ1aWx0aW5zCgpfb3BlbiA9IGJ1aWx0aW5zLm9wZW4gICAjIFNpbmNlICdvcGVuJyBpcyBUYXJGaWxlLm9wZW4KCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyB0YXIgY29uc3RhbnRzCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KTlVMID0gYiJcMCIgICAgICAgICAgICAgICAgICAgICAjIHRoZSBudWxsIGNoYXJhY3RlcgpCTE9DS1NJWkUgPSA1MTIgICAgICAgICAgICAgICAgICMgbGVuZ3RoIG9mIHByb2Nlc3NpbmcgYmxvY2tzClJFQ09SRFNJWkUgPSBCTE9DS1NJWkUgKiAyMCAgICAgIyBsZW5ndGggb2YgcmVjb3JkcwpHTlVfTUFHSUMgPSBiInVzdGFyICBcMCIgICAgICAgICMgbWFnaWMgZ251IHRhciBzdHJpbmcKUE9TSVhfTUFHSUMgPSBiInVzdGFyXHgwMDAwIiAgICAjIG1hZ2ljIHBvc2l4IHRhciBzdHJpbmcKCkxFTkdUSF9OQU1FID0gMTAwICAgICAgICAgICAgICAgIyBtYXhpbXVtIGxlbmd0aCBvZiBhIGZpbGVuYW1lCkxFTkdUSF9MSU5LID0gMTAwICAgICAgICAgICAgICAgIyBtYXhpbXVtIGxlbmd0aCBvZiBhIGxpbmtuYW1lCkxFTkdUSF9QUkVGSVggPSAxNTUgICAgICAgICAgICAgIyBtYXhpbXVtIGxlbmd0aCBvZiB0aGUgcHJlZml4IGZpZWxkCgpSRUdUWVBFID0gYiIwIiAgICAgICAgICAgICAgICAgICMgcmVndWxhciBmaWxlCkFSRUdUWVBFID0gYiJcMCIgICAgICAgICAgICAgICAgIyByZWd1bGFyIGZpbGUKTE5LVFlQRSA9IGIiMSIgICAgICAgICAgICAgICAgICAjIGxpbmsgKGluc2lkZSB0YXJmaWxlKQpTWU1UWVBFID0gYiIyIiAgICAgICAgICAgICAgICAgICMgc3ltYm9saWMgbGluawpDSFJUWVBFID0gYiIzIiAgICAgICAgICAgICAgICAgICMgY2hhcmFjdGVyIHNwZWNpYWwgZGV2aWNlCkJMS1RZUEUgPSBiIjQiICAgICAgICAgICAgICAgICAgIyBibG9jayBzcGVjaWFsIGRldmljZQpESVJUWVBFID0gYiI1IiAgICAgICAgICAgICAgICAgICMgZGlyZWN0b3J5CkZJRk9UWVBFID0gYiI2IiAgICAgICAgICAgICAgICAgIyBmaWZvIHNwZWNpYWwgZGV2aWNlCkNPTlRUWVBFID0gYiI3IiAgICAgICAgICAgICAgICAgIyBjb250aWd1b3VzIGZpbGUKCkdOVVRZUEVfTE9OR05BTUUgPSBiIkwiICAgICAgICAgIyBHTlUgdGFyIGxvbmduYW1lCkdOVVRZUEVfTE9OR0xJTksgPSBiIksiICAgICAgICAgIyBHTlUgdGFyIGxvbmdsaW5rCkdOVVRZUEVfU1BBUlNFID0gYiJTIiAgICAgICAgICAgIyBHTlUgdGFyIHNwYXJzZSBmaWxlCgpYSERUWVBFID0gYiJ4IiAgICAgICAgICAgICAgICAgICMgUE9TSVguMS0yMDAxIGV4dGVuZGVkIGhlYWRlcgpYR0xUWVBFID0gYiJnIiAgICAgICAgICAgICAgICAgICMgUE9TSVguMS0yMDAxIGdsb2JhbCBoZWFkZXIKU09MQVJJU19YSERUWVBFID0gYiJYIiAgICAgICAgICAjIFNvbGFyaXMgZXh0ZW5kZWQgaGVhZGVyCgpVU1RBUl9GT1JNQVQgPSAwICAgICAgICAgICAgICAgICMgUE9TSVguMS0xOTg4ICh1c3RhcikgZm9ybWF0CkdOVV9GT1JNQVQgPSAxICAgICAgICAgICAgICAgICAgIyBHTlUgdGFyIGZvcm1hdApQQVhfRk9STUFUID0gMiAgICAgICAgICAgICAgICAgICMgUE9TSVguMS0yMDAxIChwYXgpIGZvcm1hdApERUZBVUxUX0ZPUk1BVCA9IEdOVV9GT1JNQVQKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyB0YXJmaWxlIGNvbnN0YW50cwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgRmlsZSB0eXBlcyB0aGF0IHRhcmZpbGUgc3VwcG9ydHM6ClNVUFBPUlRFRF9UWVBFUyA9IChSRUdUWVBFLCBBUkVHVFlQRSwgTE5LVFlQRSwKICAgICAgICAgICAgICAgICAgIFNZTVRZUEUsIERJUlRZUEUsIEZJRk9UWVBFLAogICAgICAgICAgICAgICAgICAgQ09OVFRZUEUsIENIUlRZUEUsIEJMS1RZUEUsCiAgICAgICAgICAgICAgICAgICBHTlVUWVBFX0xPTkdOQU1FLCBHTlVUWVBFX0xPTkdMSU5LLAogICAgICAgICAgICAgICAgICAgR05VVFlQRV9TUEFSU0UpCgojIEZpbGUgdHlwZXMgdGhhdCB3aWxsIGJlIHRyZWF0ZWQgYXMgYSByZWd1bGFyIGZpbGUuClJFR1VMQVJfVFlQRVMgPSAoUkVHVFlQRSwgQVJFR1RZUEUsCiAgICAgICAgICAgICAgICAgQ09OVFRZUEUsIEdOVVRZUEVfU1BBUlNFKQoKIyBGaWxlIHR5cGVzIHRoYXQgYXJlIHBhcnQgb2YgdGhlIEdOVSB0YXIgZm9ybWF0LgpHTlVfVFlQRVMgPSAoR05VVFlQRV9MT05HTkFNRSwgR05VVFlQRV9MT05HTElOSywKICAgICAgICAgICAgIEdOVVRZUEVfU1BBUlNFKQoKIyBGaWVsZHMgZnJvbSBhIHBheCBoZWFkZXIgdGhhdCBvdmVycmlkZSBhIFRhckluZm8gYXR0cmlidXRlLgpQQVhfRklFTERTID0gKCJwYXRoIiwgImxpbmtwYXRoIiwgInNpemUiLCAibXRpbWUiLAogICAgICAgICAgICAgICJ1aWQiLCAiZ2lkIiwgInVuYW1lIiwgImduYW1lIikKCiMgRmllbGRzIGZyb20gYSBwYXggaGVhZGVyIHRoYXQgYXJlIGFmZmVjdGVkIGJ5IGhkcmNoYXJzZXQuClBBWF9OQU1FX0ZJRUxEUyA9IHNldCgoInBhdGgiLCAibGlua3BhdGgiLCAidW5hbWUiLCAiZ25hbWUiKSkKCiMgRmllbGRzIGluIGEgcGF4IGhlYWRlciB0aGF0IGFyZSBudW1iZXJzLCBhbGwgb3RoZXIgZmllbGRzCiMgYXJlIHRyZWF0ZWQgYXMgc3RyaW5ncy4KUEFYX05VTUJFUl9GSUVMRFMgPSB7CiAgICAiYXRpbWUiOiBmbG9hdCwKICAgICJjdGltZSI6IGZsb2F0LAogICAgIm10aW1lIjogZmxvYXQsCiAgICAidWlkIjogaW50LAogICAgImdpZCI6IGludCwKICAgICJzaXplIjogaW50Cn0KCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBCaXRzIHVzZWQgaW4gdGhlIG1vZGUgZmllbGQsIHZhbHVlcyBpbiBvY3RhbC4KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpTX0lGTE5LID0gMG8xMjAwMDAgICAgICAgICMgc3ltYm9saWMgbGluawpTX0lGUkVHID0gMG8xMDAwMDAgICAgICAgICMgcmVndWxhciBmaWxlClNfSUZCTEsgPSAwbzA2MDAwMCAgICAgICAgIyBibG9jayBkZXZpY2UKU19JRkRJUiA9IDBvMDQwMDAwICAgICAgICAjIGRpcmVjdG9yeQpTX0lGQ0hSID0gMG8wMjAwMDAgICAgICAgICMgY2hhcmFjdGVyIGRldmljZQpTX0lGSUZPID0gMG8wMTAwMDAgICAgICAgICMgZmlmbwoKVFNVSUQgICA9IDBvNDAwMCAgICAgICAgICAjIHNldCBVSUQgb24gZXhlY3V0aW9uClRTR0lEICAgPSAwbzIwMDAgICAgICAgICAgIyBzZXQgR0lEIG9uIGV4ZWN1dGlvbgpUU1ZUWCAgID0gMG8xMDAwICAgICAgICAgICMgcmVzZXJ2ZWQKClRVUkVBRCAgPSAwbzQwMCAgICAgICAgICAgIyByZWFkIGJ5IG93bmVyClRVV1JJVEUgPSAwbzIwMCAgICAgICAgICAgIyB3cml0ZSBieSBvd25lcgpUVUVYRUMgID0gMG8xMDAgICAgICAgICAgICMgZXhlY3V0ZS9zZWFyY2ggYnkgb3duZXIKVEdSRUFEICA9IDBvMDQwICAgICAgICAgICAjIHJlYWQgYnkgZ3JvdXAKVEdXUklURSA9IDBvMDIwICAgICAgICAgICAjIHdyaXRlIGJ5IGdyb3VwClRHRVhFQyAgPSAwbzAxMCAgICAgICAgICAgIyBleGVjdXRlL3NlYXJjaCBieSBncm91cApUT1JFQUQgID0gMG8wMDQgICAgICAgICAgICMgcmVhZCBieSBvdGhlcgpUT1dSSVRFID0gMG8wMDIgICAgICAgICAgICMgd3JpdGUgYnkgb3RoZXIKVE9FWEVDICA9IDBvMDAxICAgICAgICAgICAjIGV4ZWN1dGUvc2VhcmNoIGJ5IG90aGVyCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgaW5pdGlhbGl6YXRpb24KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppZiBvcy5uYW1lIGluICgibnQiLCAiY2UiKToKICAgIEVOQ09ESU5HID0gInV0Zi04IgplbHNlOgogICAgRU5DT0RJTkcgPSBzeXMuZ2V0ZmlsZXN5c3RlbWVuY29kaW5nKCkKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBTb21lIHVzZWZ1bCBmdW5jdGlvbnMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKZGVmIHN0bihzLCBsZW5ndGgsIGVuY29kaW5nLCBlcnJvcnMpOgogICAgIiIiQ29udmVydCBhIHN0cmluZyB0byBhIG51bGwtdGVybWluYXRlZCBieXRlcyBvYmplY3QuCiAgICAiIiIKICAgIHMgPSBzLmVuY29kZShlbmNvZGluZywgZXJyb3JzKQogICAgcmV0dXJuIHNbOmxlbmd0aF0gKyAobGVuZ3RoIC0gbGVuKHMpKSAqIE5VTAoKZGVmIG50cyhzLCBlbmNvZGluZywgZXJyb3JzKToKICAgICIiIkNvbnZlcnQgYSBudWxsLXRlcm1pbmF0ZWQgYnl0ZXMgb2JqZWN0IHRvIGEgc3RyaW5nLgogICAgIiIiCiAgICBwID0gcy5maW5kKGIiXDAiKQogICAgaWYgcCAhPSAtMToKICAgICAgICBzID0gc1s6cF0KICAgIHJldHVybiBzLmRlY29kZShlbmNvZGluZywgZXJyb3JzKQoKZGVmIG50aShzKToKICAgICIiIkNvbnZlcnQgYSBudW1iZXIgZmllbGQgdG8gYSBweXRob24gbnVtYmVyLgogICAgIiIiCiAgICAjIFRoZXJlIGFyZSB0d28gcG9zc2libGUgZW5jb2RpbmdzIGZvciBhIG51bWJlciBmaWVsZCwgc2VlCiAgICAjIGl0bigpIGJlbG93LgogICAgaWYgc1swXSAhPSBjaHIoMG8yMDApOgogICAgICAgIHRyeToKICAgICAgICAgICAgbiA9IGludChudHMocywgImFzY2lpIiwgInN0cmljdCIpIG9yICIwIiwgOCkKICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgcmFpc2UgSW52YWxpZEhlYWRlckVycm9yKCJpbnZhbGlkIGhlYWRlciIpCiAgICBlbHNlOgogICAgICAgIG4gPSAwCiAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHMpIC0gMSk6CiAgICAgICAgICAgIG4gPDw9IDgKICAgICAgICAgICAgbiArPSBvcmQoc1tpICsgMV0pCiAgICByZXR1cm4gbgoKZGVmIGl0bihuLCBkaWdpdHM9OCwgZm9ybWF0PURFRkFVTFRfRk9STUFUKToKICAgICIiIkNvbnZlcnQgYSBweXRob24gbnVtYmVyIHRvIGEgbnVtYmVyIGZpZWxkLgogICAgIiIiCiAgICAjIFBPU0lYIDEwMDMuMS0xOTg4IHJlcXVpcmVzIG51bWJlcnMgdG8gYmUgZW5jb2RlZCBhcyBhIHN0cmluZyBvZgogICAgIyBvY3RhbCBkaWdpdHMgZm9sbG93ZWQgYnkgYSBudWxsLWJ5dGUsIHRoaXMgYWxsb3dzIHZhbHVlcyB1cCB0bwogICAgIyAoOCoqKGRpZ2l0cy0xKSktMS4gR05VIHRhciBhbGxvd3Mgc3RvcmluZyBudW1iZXJzIGdyZWF0ZXIgdGhhbgogICAgIyB0aGF0IGlmIG5lY2Vzc2FyeS4gQSBsZWFkaW5nIDBvMjAwIGJ5dGUgaW5kaWNhdGVzIHRoaXMgcGFydGljdWxhcgogICAgIyBlbmNvZGluZywgdGhlIGZvbGxvd2luZyBkaWdpdHMtMSBieXRlcyBhcmUgYSBiaWctZW5kaWFuCiAgICAjIHJlcHJlc2VudGF0aW9uLiBUaGlzIGFsbG93cyB2YWx1ZXMgdXAgdG8gKDI1NioqKGRpZ2l0cy0xKSktMS4KICAgIGlmIDAgPD0gbiA8IDggKiogKGRpZ2l0cyAtIDEpOgogICAgICAgIHMgPSAoIiUwKm8iICUgKGRpZ2l0cyAtIDEsIG4pKS5lbmNvZGUoImFzY2lpIikgKyBOVUwKICAgIGVsc2U6CiAgICAgICAgaWYgZm9ybWF0ICE9IEdOVV9GT1JNQVQgb3IgbiA+PSAyNTYgKiogKGRpZ2l0cyAtIDEpOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJvdmVyZmxvdyBpbiBudW1iZXIgZmllbGQiKQoKICAgICAgICBpZiBuIDwgMDoKICAgICAgICAgICAgIyBYWFggV2UgbWltaWMgR05VIHRhcidzIGJlaGF2aW91ciB3aXRoIG5lZ2F0aXZlIG51bWJlcnMsCiAgICAgICAgICAgICMgdGhpcyBjb3VsZCByYWlzZSBPdmVyZmxvd0Vycm9yLgogICAgICAgICAgICBuID0gc3RydWN0LnVucGFjaygiTCIsIHN0cnVjdC5wYWNrKCJsIiwgbikpWzBdCgogICAgICAgIHMgPSBieXRlYXJyYXkoKQogICAgICAgIGZvciBpIGluIHJhbmdlKGRpZ2l0cyAtIDEpOgogICAgICAgICAgICBzLmluc2VydCgwLCBuICYgMG8zNzcpCiAgICAgICAgICAgIG4gPj49IDgKICAgICAgICBzLmluc2VydCgwLCAwbzIwMCkKICAgIHJldHVybiBzCgpkZWYgY2FsY19jaGtzdW1zKGJ1Zik6CiAgICAiIiJDYWxjdWxhdGUgdGhlIGNoZWNrc3VtIGZvciBhIG1lbWJlcidzIGhlYWRlciBieSBzdW1taW5nIHVwIGFsbAogICAgICAgY2hhcmFjdGVycyBleGNlcHQgZm9yIHRoZSBjaGtzdW0gZmllbGQgd2hpY2ggaXMgdHJlYXRlZCBhcyBpZgogICAgICAgaXQgd2FzIGZpbGxlZCB3aXRoIHNwYWNlcy4gQWNjb3JkaW5nIHRvIHRoZSBHTlUgdGFyIHNvdXJjZXMsCiAgICAgICBzb21lIHRhcnMgKFN1biBhbmQgTmVYVCkgY2FsY3VsYXRlIGNoa3N1bSB3aXRoIHNpZ25lZCBjaGFyLAogICAgICAgd2hpY2ggd2lsbCBiZSBkaWZmZXJlbnQgaWYgdGhlcmUgYXJlIGNoYXJzIGluIHRoZSBidWZmZXIgd2l0aAogICAgICAgdGhlIGhpZ2ggYml0IHNldC4gU28gd2UgY2FsY3VsYXRlIHR3byBjaGVja3N1bXMsIHVuc2lnbmVkIGFuZAogICAgICAgc2lnbmVkLgogICAgIiIiCiAgICB1bnNpZ25lZF9jaGtzdW0gPSAyNTYgKyBzdW0oc3RydWN0LnVucGFjaygiMTQ4QiIsIGJ1Zls6MTQ4XSkgKyBzdHJ1Y3QudW5wYWNrKCIzNTZCIiwgYnVmWzE1Njo1MTJdKSkKICAgIHNpZ25lZF9jaGtzdW0gPSAyNTYgKyBzdW0oc3RydWN0LnVucGFjaygiMTQ4YiIsIGJ1Zls6MTQ4XSkgKyBzdHJ1Y3QudW5wYWNrKCIzNTZiIiwgYnVmWzE1Njo1MTJdKSkKICAgIHJldHVybiB1bnNpZ25lZF9jaGtzdW0sIHNpZ25lZF9jaGtzdW0KCmRlZiBjb3B5ZmlsZW9iaihzcmMsIGRzdCwgbGVuZ3RoPU5vbmUpOgogICAgIiIiQ29weSBsZW5ndGggYnl0ZXMgZnJvbSBmaWxlb2JqIHNyYyB0byBmaWxlb2JqIGRzdC4KICAgICAgIElmIGxlbmd0aCBpcyBOb25lLCBjb3B5IHRoZSBlbnRpcmUgY29udGVudC4KICAgICIiIgogICAgaWYgbGVuZ3RoID09IDA6CiAgICAgICAgcmV0dXJuCiAgICBpZiBsZW5ndGggaXMgTm9uZToKICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICBidWYgPSBzcmMucmVhZCgxNioxMDI0KQogICAgICAgICAgICBpZiBub3QgYnVmOgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgZHN0LndyaXRlKGJ1ZikKICAgICAgICByZXR1cm4KCiAgICBCVUZTSVpFID0gMTYgKiAxMDI0CiAgICBibG9ja3MsIHJlbWFpbmRlciA9IGRpdm1vZChsZW5ndGgsIEJVRlNJWkUpCiAgICBmb3IgYiBpbiByYW5nZShibG9ja3MpOgogICAgICAgIGJ1ZiA9IHNyYy5yZWFkKEJVRlNJWkUpCiAgICAgICAgaWYgbGVuKGJ1ZikgPCBCVUZTSVpFOgogICAgICAgICAgICByYWlzZSBJT0Vycm9yKCJlbmQgb2YgZmlsZSByZWFjaGVkIikKICAgICAgICBkc3Qud3JpdGUoYnVmKQoKICAgIGlmIHJlbWFpbmRlciAhPSAwOgogICAgICAgIGJ1ZiA9IHNyYy5yZWFkKHJlbWFpbmRlcikKICAgICAgICBpZiBsZW4oYnVmKSA8IHJlbWFpbmRlcjoKICAgICAgICAgICAgcmFpc2UgSU9FcnJvcigiZW5kIG9mIGZpbGUgcmVhY2hlZCIpCiAgICAgICAgZHN0LndyaXRlKGJ1ZikKICAgIHJldHVybgoKZmlsZW1vZGVfdGFibGUgPSAoCiAgICAoKFNfSUZMTkssICAgICAgImwiKSwKICAgICAoU19JRlJFRywgICAgICAiLSIpLAogICAgIChTX0lGQkxLLCAgICAgICJiIiksCiAgICAgKFNfSUZESVIsICAgICAgImQiKSwKICAgICAoU19JRkNIUiwgICAgICAiYyIpLAogICAgIChTX0lGSUZPLCAgICAgICJwIikpLAoKICAgICgoVFVSRUFELCAgICAgICAiciIpLCksCiAgICAoKFRVV1JJVEUsICAgICAgInciKSwpLAogICAgKChUVUVYRUN8VFNVSUQsICJzIiksCiAgICAgKFRTVUlELCAgICAgICAgIlMiKSwKICAgICAoVFVFWEVDLCAgICAgICAieCIpKSwKCiAgICAoKFRHUkVBRCwgICAgICAgInIiKSwpLAogICAgKChUR1dSSVRFLCAgICAgICJ3IiksKSwKICAgICgoVEdFWEVDfFRTR0lELCAicyIpLAogICAgIChUU0dJRCwgICAgICAgICJTIiksCiAgICAgKFRHRVhFQywgICAgICAgIngiKSksCgogICAgKChUT1JFQUQsICAgICAgICJyIiksKSwKICAgICgoVE9XUklURSwgICAgICAidyIpLCksCiAgICAoKFRPRVhFQ3xUU1ZUWCwgInQiKSwKICAgICAoVFNWVFgsICAgICAgICAiVCIpLAogICAgIChUT0VYRUMsICAgICAgICJ4IikpCikKCmRlZiBmaWxlbW9kZShtb2RlKToKICAgICIiIkNvbnZlcnQgYSBmaWxlJ3MgbW9kZSB0byBhIHN0cmluZyBvZiB0aGUgZm9ybQogICAgICAgLXJ3eHJ3eHJ3eC4KICAgICAgIFVzZWQgYnkgVGFyRmlsZS5saXN0KCkKICAgICIiIgogICAgcGVybSA9IFtdCiAgICBmb3IgdGFibGUgaW4gZmlsZW1vZGVfdGFibGU6CiAgICAgICAgZm9yIGJpdCwgY2hhciBpbiB0YWJsZToKICAgICAgICAgICAgaWYgbW9kZSAmIGJpdCA9PSBiaXQ6CiAgICAgICAgICAgICAgICBwZXJtLmFwcGVuZChjaGFyKQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICBlbHNlOgogICAgICAgICAgICBwZXJtLmFwcGVuZCgiLSIpCiAgICByZXR1cm4gIiIuam9pbihwZXJtKQoKY2xhc3MgVGFyRXJyb3IoRXhjZXB0aW9uKToKICAgICIiIkJhc2UgZXhjZXB0aW9uLiIiIgogICAgcGFzcwpjbGFzcyBFeHRyYWN0RXJyb3IoVGFyRXJyb3IpOgogICAgIiIiR2VuZXJhbCBleGNlcHRpb24gZm9yIGV4dHJhY3QgZXJyb3JzLiIiIgogICAgcGFzcwpjbGFzcyBSZWFkRXJyb3IoVGFyRXJyb3IpOgogICAgIiIiRXhjZXB0aW9uIGZvciB1bnJlYWRhYmxlIHRhciBhcmNoaXZlcy4iIiIKICAgIHBhc3MKY2xhc3MgQ29tcHJlc3Npb25FcnJvcihUYXJFcnJvcik6CiAgICAiIiJFeGNlcHRpb24gZm9yIHVuYXZhaWxhYmxlIGNvbXByZXNzaW9uIG1ldGhvZHMuIiIiCiAgICBwYXNzCmNsYXNzIFN0cmVhbUVycm9yKFRhckVycm9yKToKICAgICIiIkV4Y2VwdGlvbiBmb3IgdW5zdXBwb3J0ZWQgb3BlcmF0aW9ucyBvbiBzdHJlYW0tbGlrZSBUYXJGaWxlcy4iIiIKICAgIHBhc3MKY2xhc3MgSGVhZGVyRXJyb3IoVGFyRXJyb3IpOgogICAgIiIiQmFzZSBleGNlcHRpb24gZm9yIGhlYWRlciBlcnJvcnMuIiIiCiAgICBwYXNzCmNsYXNzIEVtcHR5SGVhZGVyRXJyb3IoSGVhZGVyRXJyb3IpOgogICAgIiIiRXhjZXB0aW9uIGZvciBlbXB0eSBoZWFkZXJzLiIiIgogICAgcGFzcwpjbGFzcyBUcnVuY2F0ZWRIZWFkZXJFcnJvcihIZWFkZXJFcnJvcik6CiAgICAiIiJFeGNlcHRpb24gZm9yIHRydW5jYXRlZCBoZWFkZXJzLiIiIgogICAgcGFzcwpjbGFzcyBFT0ZIZWFkZXJFcnJvcihIZWFkZXJFcnJvcik6CiAgICAiIiJFeGNlcHRpb24gZm9yIGVuZCBvZiBmaWxlIGhlYWRlcnMuIiIiCiAgICBwYXNzCmNsYXNzIEludmFsaWRIZWFkZXJFcnJvcihIZWFkZXJFcnJvcik6CiAgICAiIiJFeGNlcHRpb24gZm9yIGludmFsaWQgaGVhZGVycy4iIiIKICAgIHBhc3MKY2xhc3MgU3Vic2VxdWVudEhlYWRlckVycm9yKEhlYWRlckVycm9yKToKICAgICIiIkV4Y2VwdGlvbiBmb3IgbWlzc2luZyBhbmQgaW52YWxpZCBleHRlbmRlZCBoZWFkZXJzLiIiIgogICAgcGFzcwoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIGludGVybmFsIHN0cmVhbSBpbnRlcmZhY2UKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpjbGFzcyBfTG93TGV2ZWxGaWxlKG9iamVjdCk6CiAgICAiIiJMb3ctbGV2ZWwgZmlsZSBvYmplY3QuIFN1cHBvcnRzIHJlYWRpbmcgYW5kIHdyaXRpbmcuCiAgICAgICBJdCBpcyB1c2VkIGluc3RlYWQgb2YgYSByZWd1bGFyIGZpbGUgb2JqZWN0IGZvciBzdHJlYW1pbmcKICAgICAgIGFjY2Vzcy4KICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBtb2RlKToKICAgICAgICBtb2RlID0gewogICAgICAgICAgICAiciI6IG9zLk9fUkRPTkxZLAogICAgICAgICAgICAidyI6IG9zLk9fV1JPTkxZIHwgb3MuT19DUkVBVCB8IG9zLk9fVFJVTkMsCiAgICAgICAgfVttb2RlXQogICAgICAgIGlmIGhhc2F0dHIob3MsICJPX0JJTkFSWSIpOgogICAgICAgICAgICBtb2RlIHw9IG9zLk9fQklOQVJZCiAgICAgICAgc2VsZi5mZCA9IG9zLm9wZW4obmFtZSwgbW9kZSwgMG82NjYpCgogICAgZGVmIGNsb3NlKHNlbGYpOgogICAgICAgIG9zLmNsb3NlKHNlbGYuZmQpCgogICAgZGVmIHJlYWQoc2VsZiwgc2l6ZSk6CiAgICAgICAgcmV0dXJuIG9zLnJlYWQoc2VsZi5mZCwgc2l6ZSkKCiAgICBkZWYgd3JpdGUoc2VsZiwgcyk6CiAgICAgICAgb3Mud3JpdGUoc2VsZi5mZCwgcykKCmNsYXNzIF9TdHJlYW0ob2JqZWN0KToKICAgICIiIkNsYXNzIHRoYXQgc2VydmVzIGFzIGFuIGFkYXB0ZXIgYmV0d2VlbiBUYXJGaWxlIGFuZAogICAgICAgYSBzdHJlYW0tbGlrZSBvYmplY3QuICBUaGUgc3RyZWFtLWxpa2Ugb2JqZWN0IG9ubHkKICAgICAgIG5lZWRzIHRvIGhhdmUgYSByZWFkKCkgb3Igd3JpdGUoKSBtZXRob2QgYW5kIGlzIGFjY2Vzc2VkCiAgICAgICBibG9ja3dpc2UuICBVc2Ugb2YgZ3ppcCBvciBiemlwMiBjb21wcmVzc2lvbiBpcyBwb3NzaWJsZS4KICAgICAgIEEgc3RyZWFtLWxpa2Ugb2JqZWN0IGNvdWxkIGJlIGZvciBleGFtcGxlOiBzeXMuc3RkaW4sCiAgICAgICBzeXMuc3Rkb3V0LCBhIHNvY2tldCwgYSB0YXBlIGRldmljZSBldGMuCgogICAgICAgX1N0cmVhbSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9ubHkgaW50ZXJuYWxseS4KICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBtb2RlLCBjb21wdHlwZSwgZmlsZW9iaiwgYnVmc2l6ZSk6CiAgICAgICAgIiIiQ29uc3RydWN0IGEgX1N0cmVhbSBvYmplY3QuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5fZXh0ZmlsZW9iaiA9IFRydWUKICAgICAgICBpZiBmaWxlb2JqIGlzIE5vbmU6CiAgICAgICAgICAgIGZpbGVvYmogPSBfTG93TGV2ZWxGaWxlKG5hbWUsIG1vZGUpCiAgICAgICAgICAgIHNlbGYuX2V4dGZpbGVvYmogPSBGYWxzZQoKICAgICAgICBpZiBjb21wdHlwZSA9PSAnKic6CiAgICAgICAgICAgICMgRW5hYmxlIHRyYW5zcGFyZW50IGNvbXByZXNzaW9uIGRldGVjdGlvbiBmb3IgdGhlCiAgICAgICAgICAgICMgc3RyZWFtIGludGVyZmFjZQogICAgICAgICAgICBmaWxlb2JqID0gX1N0cmVhbVByb3h5KGZpbGVvYmopCiAgICAgICAgICAgIGNvbXB0eXBlID0gZmlsZW9iai5nZXRjb21wdHlwZSgpCgogICAgICAgIHNlbGYubmFtZSAgICAgPSBuYW1lIG9yICIiCiAgICAgICAgc2VsZi5tb2RlICAgICA9IG1vZGUKICAgICAgICBzZWxmLmNvbXB0eXBlID0gY29tcHR5cGUKICAgICAgICBzZWxmLmZpbGVvYmogID0gZmlsZW9iagogICAgICAgIHNlbGYuYnVmc2l6ZSAgPSBidWZzaXplCiAgICAgICAgc2VsZi5idWYgICAgICA9IGIiIgogICAgICAgIHNlbGYucG9zICAgICAgPSAwCiAgICAgICAgc2VsZi5jbG9zZWQgICA9IEZhbHNlCgogICAgICAgIHRyeToKICAgICAgICAgICAgaWYgY29tcHR5cGUgPT0gImd6IjoKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBpbXBvcnQgemxpYgogICAgICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIENvbXByZXNzaW9uRXJyb3IoInpsaWIgbW9kdWxlIGlzIG5vdCBhdmFpbGFibGUiKQogICAgICAgICAgICAgICAgc2VsZi56bGliID0gemxpYgogICAgICAgICAgICAgICAgc2VsZi5jcmMgPSB6bGliLmNyYzMyKGIiIikKICAgICAgICAgICAgICAgIGlmIG1vZGUgPT0gInIiOgogICAgICAgICAgICAgICAgICAgIHNlbGYuX2luaXRfcmVhZF9neigpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHNlbGYuX2luaXRfd3JpdGVfZ3ooKQoKICAgICAgICAgICAgaWYgY29tcHR5cGUgPT0gImJ6MiI6CiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgaW1wb3J0IGJ6MgogICAgICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIENvbXByZXNzaW9uRXJyb3IoImJ6MiBtb2R1bGUgaXMgbm90IGF2YWlsYWJsZSIpCiAgICAgICAgICAgICAgICBpZiBtb2RlID09ICJyIjoKICAgICAgICAgICAgICAgICAgICBzZWxmLmRidWYgPSBiIiIKICAgICAgICAgICAgICAgICAgICBzZWxmLmNtcCA9IGJ6Mi5CWjJEZWNvbXByZXNzb3IoKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBzZWxmLmNtcCA9IGJ6Mi5CWjJDb21wcmVzc29yKCkKICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9leHRmaWxlb2JqOgogICAgICAgICAgICAgICAgc2VsZi5maWxlb2JqLmNsb3NlKCkKICAgICAgICAgICAgc2VsZi5jbG9zZWQgPSBUcnVlCiAgICAgICAgICAgIHJhaXNlCgogICAgZGVmIF9fZGVsX18oc2VsZik6CiAgICAgICAgaWYgaGFzYXR0cihzZWxmLCAiY2xvc2VkIikgYW5kIG5vdCBzZWxmLmNsb3NlZDoKICAgICAgICAgICAgc2VsZi5jbG9zZSgpCgogICAgZGVmIF9pbml0X3dyaXRlX2d6KHNlbGYpOgogICAgICAgICIiIkluaXRpYWxpemUgZm9yIHdyaXRpbmcgd2l0aCBnemlwIGNvbXByZXNzaW9uLgogICAgICAgICIiIgogICAgICAgIHNlbGYuY21wID0gc2VsZi56bGliLmNvbXByZXNzb2JqKDksIHNlbGYuemxpYi5ERUZMQVRFRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtc2VsZi56bGliLk1BWF9XQklUUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnpsaWIuREVGX01FTV9MRVZFTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKQogICAgICAgIHRpbWVzdGFtcCA9IHN0cnVjdC5wYWNrKCI8TCIsIGludCh0aW1lLnRpbWUoKSkpCiAgICAgICAgc2VsZi5fX3dyaXRlKGIiXDAzN1wyMTNcMDEwXDAxMCIgKyB0aW1lc3RhbXAgKyBiIlwwMDJcMzc3IikKICAgICAgICBpZiBzZWxmLm5hbWUuZW5kc3dpdGgoIi5neiIpOgogICAgICAgICAgICBzZWxmLm5hbWUgPSBzZWxmLm5hbWVbOi0zXQogICAgICAgICMgUkZDMTk1MiBzYXlzIHdlIG11c3QgdXNlIElTTy04ODU5LTEgZm9yIHRoZSBGTkFNRSBmaWVsZC4KICAgICAgICBzZWxmLl9fd3JpdGUoc2VsZi5uYW1lLmVuY29kZSgiaXNvLTg4NTktMSIsICJyZXBsYWNlIikgKyBOVUwpCgogICAgZGVmIHdyaXRlKHNlbGYsIHMpOgogICAgICAgICIiIldyaXRlIHN0cmluZyBzIHRvIHRoZSBzdHJlYW0uCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5jb21wdHlwZSA9PSAiZ3oiOgogICAgICAgICAgICBzZWxmLmNyYyA9IHNlbGYuemxpYi5jcmMzMihzLCBzZWxmLmNyYykKICAgICAgICBzZWxmLnBvcyArPSBsZW4ocykKICAgICAgICBpZiBzZWxmLmNvbXB0eXBlICE9ICJ0YXIiOgogICAgICAgICAgICBzID0gc2VsZi5jbXAuY29tcHJlc3MocykKICAgICAgICBzZWxmLl9fd3JpdGUocykKCiAgICBkZWYgX193cml0ZShzZWxmLCBzKToKICAgICAgICAiIiJXcml0ZSBzdHJpbmcgcyB0byB0aGUgc3RyZWFtIGlmIGEgd2hvbGUgbmV3IGJsb2NrCiAgICAgICAgICAgaXMgcmVhZHkgdG8gYmUgd3JpdHRlbi4KICAgICAgICAiIiIKICAgICAgICBzZWxmLmJ1ZiArPSBzCiAgICAgICAgd2hpbGUgbGVuKHNlbGYuYnVmKSA+IHNlbGYuYnVmc2l6ZToKICAgICAgICAgICAgc2VsZi5maWxlb2JqLndyaXRlKHNlbGYuYnVmWzpzZWxmLmJ1ZnNpemVdKQogICAgICAgICAgICBzZWxmLmJ1ZiA9IHNlbGYuYnVmW3NlbGYuYnVmc2l6ZTpdCgogICAgZGVmIGNsb3NlKHNlbGYpOgogICAgICAgICIiIkNsb3NlIHRoZSBfU3RyZWFtIG9iamVjdC4gTm8gb3BlcmF0aW9uIHNob3VsZCBiZQogICAgICAgICAgIGRvbmUgb24gaXQgYWZ0ZXJ3YXJkcy4KICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLmNsb3NlZDoKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGlmIHNlbGYubW9kZSA9PSAidyIgYW5kIHNlbGYuY29tcHR5cGUgIT0gInRhciI6CiAgICAgICAgICAgIHNlbGYuYnVmICs9IHNlbGYuY21wLmZsdXNoKCkKCiAgICAgICAgaWYgc2VsZi5tb2RlID09ICJ3IiBhbmQgc2VsZi5idWY6CiAgICAgICAgICAgIHNlbGYuZmlsZW9iai53cml0ZShzZWxmLmJ1ZikKICAgICAgICAgICAgc2VsZi5idWYgPSBiIiIKICAgICAgICAgICAgaWYgc2VsZi5jb21wdHlwZSA9PSAiZ3oiOgogICAgICAgICAgICAgICAgIyBUaGUgbmF0aXZlIHpsaWIgY3JjIGlzIGFuIHVuc2lnbmVkIDMyLWJpdCBpbnRlZ2VyLCBidXQKICAgICAgICAgICAgICAgICMgdGhlIFB5dGhvbiB3cmFwcGVyIGltcGxpY2l0bHkgY2FzdHMgdGhhdCB0byBhIHNpZ25lZCBDCiAgICAgICAgICAgICAgICAjIGxvbmcuICBTbywgb24gYSAzMi1iaXQgYm94IHNlbGYuY3JjIG1heSAibG9vayBuZWdhdGl2ZSIsCiAgICAgICAgICAgICAgICAjIHdoaWxlIHRoZSBzYW1lIGNyYyBvbiBhIDY0LWJpdCBib3ggbWF5ICJsb29rIHBvc2l0aXZlIi4KICAgICAgICAgICAgICAgICMgVG8gYXZvaWQgaXJrc29tZSB3YXJuaW5ncyBmcm9tIHRoZSBgc3RydWN0YCBtb2R1bGUsIGZvcmNlCiAgICAgICAgICAgICAgICAjIGl0IHRvIGxvb2sgcG9zaXRpdmUgb24gYWxsIGJveGVzLgogICAgICAgICAgICAgICAgc2VsZi5maWxlb2JqLndyaXRlKHN0cnVjdC5wYWNrKCI8TCIsIHNlbGYuY3JjICYgMHhmZmZmZmZmZikpCiAgICAgICAgICAgICAgICBzZWxmLmZpbGVvYmoud3JpdGUoc3RydWN0LnBhY2soIjxMIiwgc2VsZi5wb3MgJiAweGZmZmZGRkZGKSkKCiAgICAgICAgaWYgbm90IHNlbGYuX2V4dGZpbGVvYmo6CiAgICAgICAgICAgIHNlbGYuZmlsZW9iai5jbG9zZSgpCgogICAgICAgIHNlbGYuY2xvc2VkID0gVHJ1ZQoKICAgIGRlZiBfaW5pdF9yZWFkX2d6KHNlbGYpOgogICAgICAgICIiIkluaXRpYWxpemUgZm9yIHJlYWRpbmcgYSBnemlwIGNvbXByZXNzZWQgZmlsZW9iai4KICAgICAgICAiIiIKICAgICAgICBzZWxmLmNtcCA9IHNlbGYuemxpYi5kZWNvbXByZXNzb2JqKC1zZWxmLnpsaWIuTUFYX1dCSVRTKQogICAgICAgIHNlbGYuZGJ1ZiA9IGIiIgoKICAgICAgICAjIHRha2VuIGZyb20gZ3ppcC5HemlwRmlsZSB3aXRoIHNvbWUgYWx0ZXJhdGlvbnMKICAgICAgICBpZiBzZWxmLl9fcmVhZCgyKSAhPSBiIlwwMzdcMjEzIjoKICAgICAgICAgICAgcmFpc2UgUmVhZEVycm9yKCJub3QgYSBnemlwIGZpbGUiKQogICAgICAgIGlmIHNlbGYuX19yZWFkKDEpICE9IGIiXDAxMCI6CiAgICAgICAgICAgIHJhaXNlIENvbXByZXNzaW9uRXJyb3IoInVuc3VwcG9ydGVkIGNvbXByZXNzaW9uIG1ldGhvZCIpCgogICAgICAgIGZsYWcgPSBvcmQoc2VsZi5fX3JlYWQoMSkpCiAgICAgICAgc2VsZi5fX3JlYWQoNikKCiAgICAgICAgaWYgZmxhZyAmIDQ6CiAgICAgICAgICAgIHhsZW4gPSBvcmQoc2VsZi5fX3JlYWQoMSkpICsgMjU2ICogb3JkKHNlbGYuX19yZWFkKDEpKQogICAgICAgICAgICBzZWxmLnJlYWQoeGxlbikKICAgICAgICBpZiBmbGFnICYgODoKICAgICAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgICAgIHMgPSBzZWxmLl9fcmVhZCgxKQogICAgICAgICAgICAgICAgaWYgbm90IHMgb3IgcyA9PSBOVUw6CiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICBpZiBmbGFnICYgMTY6CiAgICAgICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgICAgICBzID0gc2VsZi5fX3JlYWQoMSkKICAgICAgICAgICAgICAgIGlmIG5vdCBzIG9yIHMgPT0gTlVMOgogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgaWYgZmxhZyAmIDI6CiAgICAgICAgICAgIHNlbGYuX19yZWFkKDIpCgogICAgZGVmIHRlbGwoc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIHRoZSBzdHJlYW0ncyBmaWxlIHBvaW50ZXIgcG9zaXRpb24uCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYucG9zCgogICAgZGVmIHNlZWsoc2VsZiwgcG9zPTApOgogICAgICAgICIiIlNldCB0aGUgc3RyZWFtJ3MgZmlsZSBwb2ludGVyIHRvIHBvcy4gTmVnYXRpdmUgc2Vla2luZwogICAgICAgICAgIGlzIGZvcmJpZGRlbi4KICAgICAgICAiIiIKICAgICAgICBpZiBwb3MgLSBzZWxmLnBvcyA+PSAwOgogICAgICAgICAgICBibG9ja3MsIHJlbWFpbmRlciA9IGRpdm1vZChwb3MgLSBzZWxmLnBvcywgc2VsZi5idWZzaXplKQogICAgICAgICAgICBmb3IgaSBpbiByYW5nZShibG9ja3MpOgogICAgICAgICAgICAgICAgc2VsZi5yZWFkKHNlbGYuYnVmc2l6ZSkKICAgICAgICAgICAgc2VsZi5yZWFkKHJlbWFpbmRlcikKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBTdHJlYW1FcnJvcigic2Vla2luZyBiYWNrd2FyZHMgaXMgbm90IGFsbG93ZWQiKQogICAgICAgIHJldHVybiBzZWxmLnBvcwoKICAgIGRlZiByZWFkKHNlbGYsIHNpemU9Tm9uZSk6CiAgICAgICAgIiIiUmV0dXJuIHRoZSBuZXh0IHNpemUgbnVtYmVyIG9mIGJ5dGVzIGZyb20gdGhlIHN0cmVhbS4KICAgICAgICAgICBJZiBzaXplIGlzIG5vdCBkZWZpbmVkLCByZXR1cm4gYWxsIGJ5dGVzIG9mIHRoZSBzdHJlYW0KICAgICAgICAgICB1cCB0byBFT0YuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2l6ZSBpcyBOb25lOgogICAgICAgICAgICB0ID0gW10KICAgICAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgICAgIGJ1ZiA9IHNlbGYuX3JlYWQoc2VsZi5idWZzaXplKQogICAgICAgICAgICAgICAgaWYgbm90IGJ1ZjoKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgdC5hcHBlbmQoYnVmKQogICAgICAgICAgICBidWYgPSAiIi5qb2luKHQpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgYnVmID0gc2VsZi5fcmVhZChzaXplKQogICAgICAgIHNlbGYucG9zICs9IGxlbihidWYpCiAgICAgICAgcmV0dXJuIGJ1ZgoKICAgIGRlZiBfcmVhZChzZWxmLCBzaXplKToKICAgICAgICAiIiJSZXR1cm4gc2l6ZSBieXRlcyBmcm9tIHRoZSBzdHJlYW0uCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5jb21wdHlwZSA9PSAidGFyIjoKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19yZWFkKHNpemUpCgogICAgICAgIGMgPSBsZW4oc2VsZi5kYnVmKQogICAgICAgIHdoaWxlIGMgPCBzaXplOgogICAgICAgICAgICBidWYgPSBzZWxmLl9fcmVhZChzZWxmLmJ1ZnNpemUpCiAgICAgICAgICAgIGlmIG5vdCBidWY6CiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBidWYgPSBzZWxmLmNtcC5kZWNvbXByZXNzKGJ1ZikKICAgICAgICAgICAgZXhjZXB0IElPRXJyb3I6CiAgICAgICAgICAgICAgICByYWlzZSBSZWFkRXJyb3IoImludmFsaWQgY29tcHJlc3NlZCBkYXRhIikKICAgICAgICAgICAgc2VsZi5kYnVmICs9IGJ1ZgogICAgICAgICAgICBjICs9IGxlbihidWYpCiAgICAgICAgYnVmID0gc2VsZi5kYnVmWzpzaXplXQogICAgICAgIHNlbGYuZGJ1ZiA9IHNlbGYuZGJ1ZltzaXplOl0KICAgICAgICByZXR1cm4gYnVmCgogICAgZGVmIF9fcmVhZChzZWxmLCBzaXplKToKICAgICAgICAiIiJSZXR1cm4gc2l6ZSBieXRlcyBmcm9tIHN0cmVhbS4gSWYgaW50ZXJuYWwgYnVmZmVyIGlzIGVtcHR5LAogICAgICAgICAgIHJlYWQgYW5vdGhlciBibG9jayBmcm9tIHRoZSBzdHJlYW0uCiAgICAgICAgIiIiCiAgICAgICAgYyA9IGxlbihzZWxmLmJ1ZikKICAgICAgICB3aGlsZSBjIDwgc2l6ZToKICAgICAgICAgICAgYnVmID0gc2VsZi5maWxlb2JqLnJlYWQoc2VsZi5idWZzaXplKQogICAgICAgICAgICBpZiBub3QgYnVmOgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgc2VsZi5idWYgKz0gYnVmCiAgICAgICAgICAgIGMgKz0gbGVuKGJ1ZikKICAgICAgICBidWYgPSBzZWxmLmJ1Zls6c2l6ZV0KICAgICAgICBzZWxmLmJ1ZiA9IHNlbGYuYnVmW3NpemU6XQogICAgICAgIHJldHVybiBidWYKIyBjbGFzcyBfU3RyZWFtCgpjbGFzcyBfU3RyZWFtUHJveHkob2JqZWN0KToKICAgICIiIlNtYWxsIHByb3h5IGNsYXNzIHRoYXQgZW5hYmxlcyB0cmFuc3BhcmVudCBjb21wcmVzc2lvbgogICAgICAgZGV0ZWN0aW9uIGZvciB0aGUgU3RyZWFtIGludGVyZmFjZSAobW9kZSAncnwqJykuCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZW9iaik6CiAgICAgICAgc2VsZi5maWxlb2JqID0gZmlsZW9iagogICAgICAgIHNlbGYuYnVmID0gc2VsZi5maWxlb2JqLnJlYWQoQkxPQ0tTSVpFKQoKICAgIGRlZiByZWFkKHNlbGYsIHNpemUpOgogICAgICAgIHNlbGYucmVhZCA9IHNlbGYuZmlsZW9iai5yZWFkCiAgICAgICAgcmV0dXJuIHNlbGYuYnVmCgogICAgZGVmIGdldGNvbXB0eXBlKHNlbGYpOgogICAgICAgIGlmIHNlbGYuYnVmLnN0YXJ0c3dpdGgoYiJcMDM3XDIxM1wwMTAiKToKICAgICAgICAgICAgcmV0dXJuICJneiIKICAgICAgICBpZiBzZWxmLmJ1Zi5zdGFydHN3aXRoKGIiQlpoOTEiKToKICAgICAgICAgICAgcmV0dXJuICJiejIiCiAgICAgICAgcmV0dXJuICJ0YXIiCgogICAgZGVmIGNsb3NlKHNlbGYpOgogICAgICAgIHNlbGYuZmlsZW9iai5jbG9zZSgpCiMgY2xhc3MgU3RyZWFtUHJveHkKCmNsYXNzIF9CWjJQcm94eShvYmplY3QpOgogICAgIiIiU21hbGwgcHJveHkgY2xhc3MgdGhhdCBlbmFibGVzIGV4dGVybmFsIGZpbGUgb2JqZWN0CiAgICAgICBzdXBwb3J0IGZvciAicjpiejIiIGFuZCAidzpiejIiIG1vZGVzLiBUaGlzIGlzIGFjdHVhbGx5CiAgICAgICBhIHdvcmthcm91bmQgZm9yIGEgbGltaXRhdGlvbiBpbiBiejIgbW9kdWxlJ3MgQloyRmlsZQogICAgICAgY2xhc3Mgd2hpY2ggKHVubGlrZSBnemlwLkd6aXBGaWxlKSBoYXMgbm8gc3VwcG9ydCBmb3IKICAgICAgIGEgZmlsZSBvYmplY3QgYXJndW1lbnQuCiAgICAiIiIKCiAgICBibG9ja3NpemUgPSAxNiAqIDEwMjQKCiAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZW9iaiwgbW9kZSk6CiAgICAgICAgc2VsZi5maWxlb2JqID0gZmlsZW9iagogICAgICAgIHNlbGYubW9kZSA9IG1vZGUKICAgICAgICBzZWxmLm5hbWUgPSBnZXRhdHRyKHNlbGYuZmlsZW9iaiwgIm5hbWUiLCBOb25lKQogICAgICAgIHNlbGYuaW5pdCgpCgogICAgZGVmIGluaXQoc2VsZik6CiAgICAgICAgaW1wb3J0IGJ6MgogICAgICAgIHNlbGYucG9zID0gMAogICAgICAgIGlmIHNlbGYubW9kZSA9PSAiciI6CiAgICAgICAgICAgIHNlbGYuYnoyb2JqID0gYnoyLkJaMkRlY29tcHJlc3NvcigpCiAgICAgICAgICAgIHNlbGYuZmlsZW9iai5zZWVrKDApCiAgICAgICAgICAgIHNlbGYuYnVmID0gYiIiCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5iejJvYmogPSBiejIuQloyQ29tcHJlc3NvcigpCgogICAgZGVmIHJlYWQoc2VsZiwgc2l6ZSk6CiAgICAgICAgeCA9IGxlbihzZWxmLmJ1ZikKICAgICAgICB3aGlsZSB4IDwgc2l6ZToKICAgICAgICAgICAgcmF3ID0gc2VsZi5maWxlb2JqLnJlYWQoc2VsZi5ibG9ja3NpemUpCiAgICAgICAgICAgIGlmIG5vdCByYXc6CiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBkYXRhID0gc2VsZi5iejJvYmouZGVjb21wcmVzcyhyYXcpCiAgICAgICAgICAgIHNlbGYuYnVmICs9IGRhdGEKICAgICAgICAgICAgeCArPSBsZW4oZGF0YSkKCiAgICAgICAgYnVmID0gc2VsZi5idWZbOnNpemVdCiAgICAgICAgc2VsZi5idWYgPSBzZWxmLmJ1ZltzaXplOl0KICAgICAgICBzZWxmLnBvcyArPSBsZW4oYnVmKQogICAgICAgIHJldHVybiBidWYKCiAgICBkZWYgc2VlayhzZWxmLCBwb3MpOgogICAgICAgIGlmIHBvcyA8IHNlbGYucG9zOgogICAgICAgICAgICBzZWxmLmluaXQoKQogICAgICAgIHNlbGYucmVhZChwb3MgLSBzZWxmLnBvcykKCiAgICBkZWYgdGVsbChzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5wb3MKCiAgICBkZWYgd3JpdGUoc2VsZiwgZGF0YSk6CiAgICAgICAgc2VsZi5wb3MgKz0gbGVuKGRhdGEpCiAgICAgICAgcmF3ID0gc2VsZi5iejJvYmouY29tcHJlc3MoZGF0YSkKICAgICAgICBzZWxmLmZpbGVvYmoud3JpdGUocmF3KQoKICAgIGRlZiBjbG9zZShzZWxmKToKICAgICAgICBpZiBzZWxmLm1vZGUgPT0gInciOgogICAgICAgICAgICByYXcgPSBzZWxmLmJ6Mm9iai5mbHVzaCgpCiAgICAgICAgICAgIHNlbGYuZmlsZW9iai53cml0ZShyYXcpCiMgY2xhc3MgX0JaMlByb3h5CgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgRXh0cmFjdGlvbiBmaWxlIG9iamVjdAojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmNsYXNzIF9GaWxlSW5GaWxlKG9iamVjdCk6CiAgICAiIiJBIHRoaW4gd3JhcHBlciBhcm91bmQgYW4gZXhpc3RpbmcgZmlsZSBvYmplY3QgdGhhdAogICAgICAgcHJvdmlkZXMgYSBwYXJ0IG9mIGl0cyBkYXRhIGFzIGFuIGluZGl2aWR1YWwgZmlsZQogICAgICAgb2JqZWN0LgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGVvYmosIG9mZnNldCwgc2l6ZSwgYmxvY2tpbmZvPU5vbmUpOgogICAgICAgIHNlbGYuZmlsZW9iaiA9IGZpbGVvYmoKICAgICAgICBzZWxmLm9mZnNldCA9IG9mZnNldAogICAgICAgIHNlbGYuc2l6ZSA9IHNpemUKICAgICAgICBzZWxmLnBvc2l0aW9uID0gMAoKICAgICAgICBpZiBibG9ja2luZm8gaXMgTm9uZToKICAgICAgICAgICAgYmxvY2tpbmZvID0gWygwLCBzaXplKV0KCiAgICAgICAgIyBDb25zdHJ1Y3QgYSBtYXAgd2l0aCBkYXRhIGFuZCB6ZXJvIGJsb2Nrcy4KICAgICAgICBzZWxmLm1hcF9pbmRleCA9IDAKICAgICAgICBzZWxmLm1hcCA9IFtdCiAgICAgICAgbGFzdHBvcyA9IDAKICAgICAgICByZWFscG9zID0gc2VsZi5vZmZzZXQKICAgICAgICBmb3Igb2Zmc2V0LCBzaXplIGluIGJsb2NraW5mbzoKICAgICAgICAgICAgaWYgb2Zmc2V0ID4gbGFzdHBvczoKICAgICAgICAgICAgICAgIHNlbGYubWFwLmFwcGVuZCgoRmFsc2UsIGxhc3Rwb3MsIG9mZnNldCwgTm9uZSkpCiAgICAgICAgICAgIHNlbGYubWFwLmFwcGVuZCgoVHJ1ZSwgb2Zmc2V0LCBvZmZzZXQgKyBzaXplLCByZWFscG9zKSkKICAgICAgICAgICAgcmVhbHBvcyArPSBzaXplCiAgICAgICAgICAgIGxhc3Rwb3MgPSBvZmZzZXQgKyBzaXplCiAgICAgICAgaWYgbGFzdHBvcyA8IHNlbGYuc2l6ZToKICAgICAgICAgICAgc2VsZi5tYXAuYXBwZW5kKChGYWxzZSwgbGFzdHBvcywgc2VsZi5zaXplLCBOb25lKSkKCiAgICBkZWYgc2Vla2FibGUoc2VsZik6CiAgICAgICAgaWYgbm90IGhhc2F0dHIoc2VsZi5maWxlb2JqLCAic2Vla2FibGUiKToKICAgICAgICAgICAgIyBYWFggZ3ppcC5HemlwRmlsZSBhbmQgYnoyLkJaMkZpbGUKICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICByZXR1cm4gc2VsZi5maWxlb2JqLnNlZWthYmxlKCkKCiAgICBkZWYgdGVsbChzZWxmKToKICAgICAgICAiIiJSZXR1cm4gdGhlIGN1cnJlbnQgZmlsZSBwb3NpdGlvbi4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZi5wb3NpdGlvbgoKICAgIGRlZiBzZWVrKHNlbGYsIHBvc2l0aW9uKToKICAgICAgICAiIiJTZWVrIHRvIGEgcG9zaXRpb24gaW4gdGhlIGZpbGUuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5wb3NpdGlvbiA9IHBvc2l0aW9uCgogICAgZGVmIHJlYWQoc2VsZiwgc2l6ZT1Ob25lKToKICAgICAgICAiIiJSZWFkIGRhdGEgZnJvbSB0aGUgZmlsZS4KICAgICAgICAiIiIKICAgICAgICBpZiBzaXplIGlzIE5vbmU6CiAgICAgICAgICAgIHNpemUgPSBzZWxmLnNpemUgLSBzZWxmLnBvc2l0aW9uCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2l6ZSA9IG1pbihzaXplLCBzZWxmLnNpemUgLSBzZWxmLnBvc2l0aW9uKQoKICAgICAgICBidWYgPSBiIiIKICAgICAgICB3aGlsZSBzaXplID4gMDoKICAgICAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgICAgIGRhdGEsIHN0YXJ0LCBzdG9wLCBvZmZzZXQgPSBzZWxmLm1hcFtzZWxmLm1hcF9pbmRleF0KICAgICAgICAgICAgICAgIGlmIHN0YXJ0IDw9IHNlbGYucG9zaXRpb24gPCBzdG9wOgogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHNlbGYubWFwX2luZGV4ICs9IDEKICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLm1hcF9pbmRleCA9PSBsZW4oc2VsZi5tYXApOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm1hcF9pbmRleCA9IDAKICAgICAgICAgICAgbGVuZ3RoID0gbWluKHNpemUsIHN0b3AgLSBzZWxmLnBvc2l0aW9uKQogICAgICAgICAgICBpZiBkYXRhOgogICAgICAgICAgICAgICAgc2VsZi5maWxlb2JqLnNlZWsob2Zmc2V0ICsgKHNlbGYucG9zaXRpb24gLSBzdGFydCkpCiAgICAgICAgICAgICAgICBidWYgKz0gc2VsZi5maWxlb2JqLnJlYWQobGVuZ3RoKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgYnVmICs9IE5VTCAqIGxlbmd0aAogICAgICAgICAgICBzaXplIC09IGxlbmd0aAogICAgICAgICAgICBzZWxmLnBvc2l0aW9uICs9IGxlbmd0aAogICAgICAgIHJldHVybiBidWYKI2NsYXNzIF9GaWxlSW5GaWxlCgoKY2xhc3MgRXhGaWxlT2JqZWN0KG9iamVjdCk6CiAgICAiIiJGaWxlLWxpa2Ugb2JqZWN0IGZvciByZWFkaW5nIGFuIGFyY2hpdmUgbWVtYmVyLgogICAgICAgSXMgcmV0dXJuZWQgYnkgVGFyRmlsZS5leHRyYWN0ZmlsZSgpLgogICAgIiIiCiAgICBibG9ja3NpemUgPSAxMDI0CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHRhcmZpbGUsIHRhcmluZm8pOgogICAgICAgIHNlbGYuZmlsZW9iaiA9IF9GaWxlSW5GaWxlKHRhcmZpbGUuZmlsZW9iaiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJpbmZvLm9mZnNldF9kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmluZm8uc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJpbmZvLnNwYXJzZSkKICAgICAgICBzZWxmLm5hbWUgPSB0YXJpbmZvLm5hbWUKICAgICAgICBzZWxmLm1vZGUgPSAiciIKICAgICAgICBzZWxmLmNsb3NlZCA9IEZhbHNlCiAgICAgICAgc2VsZi5zaXplID0gdGFyaW5mby5zaXplCgogICAgICAgIHNlbGYucG9zaXRpb24gPSAwCiAgICAgICAgc2VsZi5idWZmZXIgPSBiIiIKCiAgICBkZWYgcmVhZGFibGUoc2VsZik6CiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgd3JpdGFibGUoc2VsZik6CiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZGVmIHNlZWthYmxlKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLmZpbGVvYmouc2Vla2FibGUoKQoKICAgIGRlZiByZWFkKHNlbGYsIHNpemU9Tm9uZSk6CiAgICAgICAgIiIiUmVhZCBhdCBtb3N0IHNpemUgYnl0ZXMgZnJvbSB0aGUgZmlsZS4gSWYgc2l6ZSBpcyBub3QKICAgICAgICAgICBwcmVzZW50IG9yIE5vbmUsIHJlYWQgYWxsIGRhdGEgdW50aWwgRU9GIGlzIHJlYWNoZWQuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5jbG9zZWQ6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkkvTyBvcGVyYXRpb24gb24gY2xvc2VkIGZpbGUiKQoKICAgICAgICBidWYgPSBiIiIKICAgICAgICBpZiBzZWxmLmJ1ZmZlcjoKICAgICAgICAgICAgaWYgc2l6ZSBpcyBOb25lOgogICAgICAgICAgICAgICAgYnVmID0gc2VsZi5idWZmZXIKICAgICAgICAgICAgICAgIHNlbGYuYnVmZmVyID0gYiIiCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBidWYgPSBzZWxmLmJ1ZmZlcls6c2l6ZV0KICAgICAgICAgICAgICAgIHNlbGYuYnVmZmVyID0gc2VsZi5idWZmZXJbc2l6ZTpdCgogICAgICAgIGlmIHNpemUgaXMgTm9uZToKICAgICAgICAgICAgYnVmICs9IHNlbGYuZmlsZW9iai5yZWFkKCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBidWYgKz0gc2VsZi5maWxlb2JqLnJlYWQoc2l6ZSAtIGxlbihidWYpKQoKICAgICAgICBzZWxmLnBvc2l0aW9uICs9IGxlbihidWYpCiAgICAgICAgcmV0dXJuIGJ1ZgoKICAgICMgWFhYIFRleHRJT1dyYXBwZXIgdXNlcyB0aGUgcmVhZDEoKSBtZXRob2QuCiAgICByZWFkMSA9IHJlYWQKCiAgICBkZWYgcmVhZGxpbmUoc2VsZiwgc2l6ZT0tMSk6CiAgICAgICAgIiIiUmVhZCBvbmUgZW50aXJlIGxpbmUgZnJvbSB0aGUgZmlsZS4gSWYgc2l6ZSBpcyBwcmVzZW50CiAgICAgICAgICAgYW5kIG5vbi1uZWdhdGl2ZSwgcmV0dXJuIGEgc3RyaW5nIHdpdGggYXQgbW9zdCB0aGF0CiAgICAgICAgICAgc2l6ZSwgd2hpY2ggbWF5IGJlIGFuIGluY29tcGxldGUgbGluZS4KICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLmNsb3NlZDoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIpCgogICAgICAgIHBvcyA9IHNlbGYuYnVmZmVyLmZpbmQoYiJcbiIpICsgMQogICAgICAgIGlmIHBvcyA9PSAwOgogICAgICAgICAgICAjIG5vIG5ld2xpbmUgZm91bmQuCiAgICAgICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgICAgICBidWYgPSBzZWxmLmZpbGVvYmoucmVhZChzZWxmLmJsb2Nrc2l6ZSkKICAgICAgICAgICAgICAgIHNlbGYuYnVmZmVyICs9IGJ1ZgogICAgICAgICAgICAgICAgaWYgbm90IGJ1ZiBvciBiIlxuIiBpbiBidWY6CiAgICAgICAgICAgICAgICAgICAgcG9zID0gc2VsZi5idWZmZXIuZmluZChiIlxuIikgKyAxCiAgICAgICAgICAgICAgICAgICAgaWYgcG9zID09IDA6CiAgICAgICAgICAgICAgICAgICAgICAgICMgbm8gbmV3bGluZSBmb3VuZC4KICAgICAgICAgICAgICAgICAgICAgICAgcG9zID0gbGVuKHNlbGYuYnVmZmVyKQogICAgICAgICAgICAgICAgICAgIGJyZWFrCgogICAgICAgIGlmIHNpemUgIT0gLTE6CiAgICAgICAgICAgIHBvcyA9IG1pbihzaXplLCBwb3MpCgogICAgICAgIGJ1ZiA9IHNlbGYuYnVmZmVyWzpwb3NdCiAgICAgICAgc2VsZi5idWZmZXIgPSBzZWxmLmJ1ZmZlcltwb3M6XQogICAgICAgIHNlbGYucG9zaXRpb24gKz0gbGVuKGJ1ZikKICAgICAgICByZXR1cm4gYnVmCgogICAgZGVmIHJlYWRsaW5lcyhzZWxmKToKICAgICAgICAiIiJSZXR1cm4gYSBsaXN0IHdpdGggYWxsIHJlbWFpbmluZyBsaW5lcy4KICAgICAgICAiIiIKICAgICAgICByZXN1bHQgPSBbXQogICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgIGxpbmUgPSBzZWxmLnJlYWRsaW5lKCkKICAgICAgICAgICAgaWYgbm90IGxpbmU6IGJyZWFrCiAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQobGluZSkKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIHRlbGwoc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIHRoZSBjdXJyZW50IGZpbGUgcG9zaXRpb24uCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5jbG9zZWQ6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkkvTyBvcGVyYXRpb24gb24gY2xvc2VkIGZpbGUiKQoKICAgICAgICByZXR1cm4gc2VsZi5wb3NpdGlvbgoKICAgIGRlZiBzZWVrKHNlbGYsIHBvcywgd2hlbmNlPW9zLlNFRUtfU0VUKToKICAgICAgICAiIiJTZWVrIHRvIGEgcG9zaXRpb24gaW4gdGhlIGZpbGUuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5jbG9zZWQ6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkkvTyBvcGVyYXRpb24gb24gY2xvc2VkIGZpbGUiKQoKICAgICAgICBpZiB3aGVuY2UgPT0gb3MuU0VFS19TRVQ6CiAgICAgICAgICAgIHNlbGYucG9zaXRpb24gPSBtaW4obWF4KHBvcywgMCksIHNlbGYuc2l6ZSkKICAgICAgICBlbGlmIHdoZW5jZSA9PSBvcy5TRUVLX0NVUjoKICAgICAgICAgICAgaWYgcG9zIDwgMDoKICAgICAgICAgICAgICAgIHNlbGYucG9zaXRpb24gPSBtYXgoc2VsZi5wb3NpdGlvbiArIHBvcywgMCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYucG9zaXRpb24gPSBtaW4oc2VsZi5wb3NpdGlvbiArIHBvcywgc2VsZi5zaXplKQogICAgICAgIGVsaWYgd2hlbmNlID09IG9zLlNFRUtfRU5EOgogICAgICAgICAgICBzZWxmLnBvc2l0aW9uID0gbWF4KG1pbihzZWxmLnNpemUgKyBwb3MsIHNlbGYuc2l6ZSksIDApCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiSW52YWxpZCBhcmd1bWVudCIpCgogICAgICAgIHNlbGYuYnVmZmVyID0gYiIiCiAgICAgICAgc2VsZi5maWxlb2JqLnNlZWsoc2VsZi5wb3NpdGlvbikKCiAgICBkZWYgY2xvc2Uoc2VsZik6CiAgICAgICAgIiIiQ2xvc2UgdGhlIGZpbGUgb2JqZWN0LgogICAgICAgICIiIgogICAgICAgIHNlbGYuY2xvc2VkID0gVHJ1ZQoKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICAiIiJHZXQgYW4gaXRlcmF0b3Igb3ZlciB0aGUgZmlsZSdzIGxpbmVzLgogICAgICAgICIiIgogICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgIGxpbmUgPSBzZWxmLnJlYWRsaW5lKCkKICAgICAgICAgICAgaWYgbm90IGxpbmU6CiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICB5aWVsZCBsaW5lCiNjbGFzcyBFeEZpbGVPYmplY3QKCiMtLS0tLS0tLS0tLS0tLS0tLS0KIyBFeHBvcnRlZCBDbGFzc2VzCiMtLS0tLS0tLS0tLS0tLS0tLS0KY2xhc3MgVGFySW5mbyhvYmplY3QpOgogICAgIiIiSW5mb3JtYXRpb25hbCBjbGFzcyB3aGljaCBob2xkcyB0aGUgZGV0YWlscyBhYm91dCBhbgogICAgICAgYXJjaGl2ZSBtZW1iZXIgZ2l2ZW4gYnkgYSB0YXIgaGVhZGVyIGJsb2NrLgogICAgICAgVGFySW5mbyBvYmplY3RzIGFyZSByZXR1cm5lZCBieSBUYXJGaWxlLmdldG1lbWJlcigpLAogICAgICAgVGFyRmlsZS5nZXRtZW1iZXJzKCkgYW5kIFRhckZpbGUuZ2V0dGFyaW5mbygpIGFuZCBhcmUKICAgICAgIHVzdWFsbHkgY3JlYXRlZCBpbnRlcm5hbGx5LgogICAgIiIiCgogICAgX19zbG90c19fID0gKCJuYW1lIiwgIm1vZGUiLCAidWlkIiwgImdpZCIsICJzaXplIiwgIm10aW1lIiwKICAgICAgICAgICAgICAgICAiY2hrc3VtIiwgInR5cGUiLCAibGlua25hbWUiLCAidW5hbWUiLCAiZ25hbWUiLAogICAgICAgICAgICAgICAgICJkZXZtYWpvciIsICJkZXZtaW5vciIsCiAgICAgICAgICAgICAgICAgIm9mZnNldCIsICJvZmZzZXRfZGF0YSIsICJwYXhfaGVhZGVycyIsICJzcGFyc2UiLAogICAgICAgICAgICAgICAgICJ0YXJmaWxlIiwgIl9zcGFyc2Vfc3RydWN0cyIsICJfbGlua190YXJnZXQiKQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lPSIiKToKICAgICAgICAiIiJDb25zdHJ1Y3QgYSBUYXJJbmZvIG9iamVjdC4gbmFtZSBpcyB0aGUgb3B0aW9uYWwgbmFtZQogICAgICAgICAgIG9mIHRoZSBtZW1iZXIuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5uYW1lID0gbmFtZSAgICAgICAgIyBtZW1iZXIgbmFtZQogICAgICAgIHNlbGYubW9kZSA9IDBvNjQ0ICAgICAgICMgZmlsZSBwZXJtaXNzaW9ucwogICAgICAgIHNlbGYudWlkID0gMCAgICAgICAgICAgICMgdXNlciBpZAogICAgICAgIHNlbGYuZ2lkID0gMCAgICAgICAgICAgICMgZ3JvdXAgaWQKICAgICAgICBzZWxmLnNpemUgPSAwICAgICAgICAgICAjIGZpbGUgc2l6ZQogICAgICAgIHNlbGYubXRpbWUgPSAwICAgICAgICAgICMgbW9kaWZpY2F0aW9uIHRpbWUKICAgICAgICBzZWxmLmNoa3N1bSA9IDAgICAgICAgICAjIGhlYWRlciBjaGVja3N1bQogICAgICAgIHNlbGYudHlwZSA9IFJFR1RZUEUgICAgICMgbWVtYmVyIHR5cGUKICAgICAgICBzZWxmLmxpbmtuYW1lID0gIiIgICAgICAjIGxpbmsgbmFtZQogICAgICAgIHNlbGYudW5hbWUgPSAiIiAgICAgICAgICMgdXNlciBuYW1lCiAgICAgICAgc2VsZi5nbmFtZSA9ICIiICAgICAgICAgIyBncm91cCBuYW1lCiAgICAgICAgc2VsZi5kZXZtYWpvciA9IDAgICAgICAgIyBkZXZpY2UgbWFqb3IgbnVtYmVyCiAgICAgICAgc2VsZi5kZXZtaW5vciA9IDAgICAgICAgIyBkZXZpY2UgbWlub3IgbnVtYmVyCgogICAgICAgIHNlbGYub2Zmc2V0ID0gMCAgICAgICAgICMgdGhlIHRhciBoZWFkZXIgc3RhcnRzIGhlcmUKICAgICAgICBzZWxmLm9mZnNldF9kYXRhID0gMCAgICAjIHRoZSBmaWxlJ3MgZGF0YSBzdGFydHMgaGVyZQoKICAgICAgICBzZWxmLnNwYXJzZSA9IE5vbmUgICAgICAjIHNwYXJzZSBtZW1iZXIgaW5mb3JtYXRpb24KICAgICAgICBzZWxmLnBheF9oZWFkZXJzID0ge30gICAjIHBheCBoZWFkZXIgaW5mb3JtYXRpb24KCiAgICAjIEluIHBheCBoZWFkZXJzIHRoZSAibmFtZSIgYW5kICJsaW5rbmFtZSIgZmllbGQgYXJlIGNhbGxlZAogICAgIyAicGF0aCIgYW5kICJsaW5rcGF0aCIuCiAgICBkZWYgX2dldHBhdGgoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYubmFtZQogICAgZGVmIF9zZXRwYXRoKHNlbGYsIG5hbWUpOgogICAgICAgIHNlbGYubmFtZSA9IG5hbWUKICAgIHBhdGggPSBwcm9wZXJ0eShfZ2V0cGF0aCwgX3NldHBhdGgpCgogICAgZGVmIF9nZXRsaW5rcGF0aChzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5saW5rbmFtZQogICAgZGVmIF9zZXRsaW5rcGF0aChzZWxmLCBsaW5rbmFtZSk6CiAgICAgICAgc2VsZi5saW5rbmFtZSA9IGxpbmtuYW1lCiAgICBsaW5rcGF0aCA9IHByb3BlcnR5KF9nZXRsaW5rcGF0aCwgX3NldGxpbmtwYXRoKQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIjwlcyAlciBhdCAlI3g+IiAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXyxzZWxmLm5hbWUsaWQoc2VsZikpCgogICAgZGVmIGdldF9pbmZvKHNlbGYpOgogICAgICAgICIiIlJldHVybiB0aGUgVGFySW5mbydzIGF0dHJpYnV0ZXMgYXMgYSBkaWN0aW9uYXJ5LgogICAgICAgICIiIgogICAgICAgIGluZm8gPSB7CiAgICAgICAgICAgICJuYW1lIjogICAgIHNlbGYubmFtZSwKICAgICAgICAgICAgIm1vZGUiOiAgICAgc2VsZi5tb2RlICYgMG83Nzc3LAogICAgICAgICAgICAidWlkIjogICAgICBzZWxmLnVpZCwKICAgICAgICAgICAgImdpZCI6ICAgICAgc2VsZi5naWQsCiAgICAgICAgICAgICJzaXplIjogICAgIHNlbGYuc2l6ZSwKICAgICAgICAgICAgIm10aW1lIjogICAgc2VsZi5tdGltZSwKICAgICAgICAgICAgImNoa3N1bSI6ICAgc2VsZi5jaGtzdW0sCiAgICAgICAgICAgICJ0eXBlIjogICAgIHNlbGYudHlwZSwKICAgICAgICAgICAgImxpbmtuYW1lIjogc2VsZi5saW5rbmFtZSwKICAgICAgICAgICAgInVuYW1lIjogICAgc2VsZi51bmFtZSwKICAgICAgICAgICAgImduYW1lIjogICAgc2VsZi5nbmFtZSwKICAgICAgICAgICAgImRldm1ham9yIjogc2VsZi5kZXZtYWpvciwKICAgICAgICAgICAgImRldm1pbm9yIjogc2VsZi5kZXZtaW5vcgogICAgICAgIH0KCiAgICAgICAgaWYgaW5mb1sidHlwZSJdID09IERJUlRZUEUgYW5kIG5vdCBpbmZvWyJuYW1lIl0uZW5kc3dpdGgoIi8iKToKICAgICAgICAgICAgaW5mb1sibmFtZSJdICs9ICIvIgoKICAgICAgICByZXR1cm4gaW5mbwoKICAgIGRlZiB0b2J1ZihzZWxmLCBmb3JtYXQ9REVGQVVMVF9GT1JNQVQsIGVuY29kaW5nPUVOQ09ESU5HLCBlcnJvcnM9InN1cnJvZ2F0ZWVzY2FwZSIpOgogICAgICAgICIiIlJldHVybiBhIHRhciBoZWFkZXIgYXMgYSBzdHJpbmcgb2YgNTEyIGJ5dGUgYmxvY2tzLgogICAgICAgICIiIgogICAgICAgIGluZm8gPSBzZWxmLmdldF9pbmZvKCkKCiAgICAgICAgaWYgZm9ybWF0ID09IFVTVEFSX0ZPUk1BVDoKICAgICAgICAgICAgcmV0dXJuIHNlbGYuY3JlYXRlX3VzdGFyX2hlYWRlcihpbmZvLCBlbmNvZGluZywgZXJyb3JzKQogICAgICAgIGVsaWYgZm9ybWF0ID09IEdOVV9GT1JNQVQ6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmNyZWF0ZV9nbnVfaGVhZGVyKGluZm8sIGVuY29kaW5nLCBlcnJvcnMpCiAgICAgICAgZWxpZiBmb3JtYXQgPT0gUEFYX0ZPUk1BVDoKICAgICAgICAgICAgcmV0dXJuIHNlbGYuY3JlYXRlX3BheF9oZWFkZXIoaW5mbywgZW5jb2RpbmcpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiaW52YWxpZCBmb3JtYXQiKQoKICAgIGRlZiBjcmVhdGVfdXN0YXJfaGVhZGVyKHNlbGYsIGluZm8sIGVuY29kaW5nLCBlcnJvcnMpOgogICAgICAgICIiIlJldHVybiB0aGUgb2JqZWN0IGFzIGEgdXN0YXIgaGVhZGVyIGJsb2NrLgogICAgICAgICIiIgogICAgICAgIGluZm9bIm1hZ2ljIl0gPSBQT1NJWF9NQUdJQwoKICAgICAgICBpZiBsZW4oaW5mb1sibGlua25hbWUiXSkgPiBMRU5HVEhfTElOSzoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigibGlua25hbWUgaXMgdG9vIGxvbmciKQoKICAgICAgICBpZiBsZW4oaW5mb1sibmFtZSJdKSA+IExFTkdUSF9OQU1FOgogICAgICAgICAgICBpbmZvWyJwcmVmaXgiXSwgaW5mb1sibmFtZSJdID0gc2VsZi5fcG9zaXhfc3BsaXRfbmFtZShpbmZvWyJuYW1lIl0pCgogICAgICAgIHJldHVybiBzZWxmLl9jcmVhdGVfaGVhZGVyKGluZm8sIFVTVEFSX0ZPUk1BVCwgZW5jb2RpbmcsIGVycm9ycykKCiAgICBkZWYgY3JlYXRlX2dudV9oZWFkZXIoc2VsZiwgaW5mbywgZW5jb2RpbmcsIGVycm9ycyk6CiAgICAgICAgIiIiUmV0dXJuIHRoZSBvYmplY3QgYXMgYSBHTlUgaGVhZGVyIGJsb2NrIHNlcXVlbmNlLgogICAgICAgICIiIgogICAgICAgIGluZm9bIm1hZ2ljIl0gPSBHTlVfTUFHSUMKCiAgICAgICAgYnVmID0gYiIiCiAgICAgICAgaWYgbGVuKGluZm9bImxpbmtuYW1lIl0pID4gTEVOR1RIX0xJTks6CiAgICAgICAgICAgIGJ1ZiArPSBzZWxmLl9jcmVhdGVfZ251X2xvbmdfaGVhZGVyKGluZm9bImxpbmtuYW1lIl0sIEdOVVRZUEVfTE9OR0xJTkssIGVuY29kaW5nLCBlcnJvcnMpCgogICAgICAgIGlmIGxlbihpbmZvWyJuYW1lIl0pID4gTEVOR1RIX05BTUU6CiAgICAgICAgICAgIGJ1ZiArPSBzZWxmLl9jcmVhdGVfZ251X2xvbmdfaGVhZGVyKGluZm9bIm5hbWUiXSwgR05VVFlQRV9MT05HTkFNRSwgZW5jb2RpbmcsIGVycm9ycykKCiAgICAgICAgcmV0dXJuIGJ1ZiArIHNlbGYuX2NyZWF0ZV9oZWFkZXIoaW5mbywgR05VX0ZPUk1BVCwgZW5jb2RpbmcsIGVycm9ycykKCiAgICBkZWYgY3JlYXRlX3BheF9oZWFkZXIoc2VsZiwgaW5mbywgZW5jb2RpbmcpOgogICAgICAgICIiIlJldHVybiB0aGUgb2JqZWN0IGFzIGEgdXN0YXIgaGVhZGVyIGJsb2NrLiBJZiBpdCBjYW5ub3QgYmUKICAgICAgICAgICByZXByZXNlbnRlZCB0aGlzIHdheSwgcHJlcGVuZCBhIHBheCBleHRlbmRlZCBoZWFkZXIgc2VxdWVuY2UKICAgICAgICAgICB3aXRoIHN1cHBsZW1lbnQgaW5mb3JtYXRpb24uCiAgICAgICAgIiIiCiAgICAgICAgaW5mb1sibWFnaWMiXSA9IFBPU0lYX01BR0lDCiAgICAgICAgcGF4X2hlYWRlcnMgPSBzZWxmLnBheF9oZWFkZXJzLmNvcHkoKQoKICAgICAgICAjIFRlc3Qgc3RyaW5nIGZpZWxkcyBmb3IgdmFsdWVzIHRoYXQgZXhjZWVkIHRoZSBmaWVsZCBsZW5ndGggb3IgY2Fubm90CiAgICAgICAgIyBiZSByZXByZXNlbnRlZCBpbiBBU0NJSSBlbmNvZGluZy4KICAgICAgICBmb3IgbmFtZSwgaG5hbWUsIGxlbmd0aCBpbiAoCiAgICAgICAgICAgICAgICAoIm5hbWUiLCAicGF0aCIsIExFTkdUSF9OQU1FKSwgKCJsaW5rbmFtZSIsICJsaW5rcGF0aCIsIExFTkdUSF9MSU5LKSwKICAgICAgICAgICAgICAgICgidW5hbWUiLCAidW5hbWUiLCAzMiksICgiZ25hbWUiLCAiZ25hbWUiLCAzMikpOgoKICAgICAgICAgICAgaWYgaG5hbWUgaW4gcGF4X2hlYWRlcnM6CiAgICAgICAgICAgICAgICAjIFRoZSBwYXggaGVhZGVyIGhhcyBwcmlvcml0eS4KICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICAjIFRyeSB0byBlbmNvZGUgdGhlIHN0cmluZyBhcyBBU0NJSS4KICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgaW5mb1tuYW1lXS5lbmNvZGUoImFzY2lpIiwgInN0cmljdCIpCiAgICAgICAgICAgIGV4Y2VwdCBVbmljb2RlRW5jb2RlRXJyb3I6CiAgICAgICAgICAgICAgICBwYXhfaGVhZGVyc1tobmFtZV0gPSBpbmZvW25hbWVdCiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgaWYgbGVuKGluZm9bbmFtZV0pID4gbGVuZ3RoOgogICAgICAgICAgICAgICAgcGF4X2hlYWRlcnNbaG5hbWVdID0gaW5mb1tuYW1lXQoKICAgICAgICAjIFRlc3QgbnVtYmVyIGZpZWxkcyBmb3IgdmFsdWVzIHRoYXQgZXhjZWVkIHRoZSBmaWVsZCBsaW1pdCBvciB2YWx1ZXMKICAgICAgICAjIHRoYXQgbGlrZSB0byBiZSBzdG9yZWQgYXMgZmxvYXQuCiAgICAgICAgZm9yIG5hbWUsIGRpZ2l0cyBpbiAoKCJ1aWQiLCA4KSwgKCJnaWQiLCA4KSwgKCJzaXplIiwgMTIpLCAoIm10aW1lIiwgMTIpKToKICAgICAgICAgICAgaWYgbmFtZSBpbiBwYXhfaGVhZGVyczoKICAgICAgICAgICAgICAgICMgVGhlIHBheCBoZWFkZXIgaGFzIHByaW9yaXR5LiBBdm9pZCBvdmVyZmxvdy4KICAgICAgICAgICAgICAgIGluZm9bbmFtZV0gPSAwCiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgdmFsID0gaW5mb1tuYW1lXQogICAgICAgICAgICBpZiBub3QgMCA8PSB2YWwgPCA4ICoqIChkaWdpdHMgLSAxKSBvciBpc2luc3RhbmNlKHZhbCwgZmxvYXQpOgogICAgICAgICAgICAgICAgcGF4X2hlYWRlcnNbbmFtZV0gPSBzdHIodmFsKQogICAgICAgICAgICAgICAgaW5mb1tuYW1lXSA9IDAKCiAgICAgICAgIyBDcmVhdGUgYSBwYXggZXh0ZW5kZWQgaGVhZGVyIGlmIG5lY2Vzc2FyeS4KICAgICAgICBpZiBwYXhfaGVhZGVyczoKICAgICAgICAgICAgYnVmID0gc2VsZi5fY3JlYXRlX3BheF9nZW5lcmljX2hlYWRlcihwYXhfaGVhZGVycywgWEhEVFlQRSwgZW5jb2RpbmcpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgYnVmID0gYiIiCgogICAgICAgIHJldHVybiBidWYgKyBzZWxmLl9jcmVhdGVfaGVhZGVyKGluZm8sIFVTVEFSX0ZPUk1BVCwgImFzY2lpIiwgInJlcGxhY2UiKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGNyZWF0ZV9wYXhfZ2xvYmFsX2hlYWRlcihjbHMsIHBheF9oZWFkZXJzKToKICAgICAgICAiIiJSZXR1cm4gdGhlIG9iamVjdCBhcyBhIHBheCBnbG9iYWwgaGVhZGVyIGJsb2NrIHNlcXVlbmNlLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBjbHMuX2NyZWF0ZV9wYXhfZ2VuZXJpY19oZWFkZXIocGF4X2hlYWRlcnMsIFhHTFRZUEUsICJ1dGY4IikKCiAgICBkZWYgX3Bvc2l4X3NwbGl0X25hbWUoc2VsZiwgbmFtZSk6CiAgICAgICAgIiIiU3BsaXQgYSBuYW1lIGxvbmdlciB0aGFuIDEwMCBjaGFycyBpbnRvIGEgcHJlZml4CiAgICAgICAgICAgYW5kIGEgbmFtZSBwYXJ0LgogICAgICAgICIiIgogICAgICAgIHByZWZpeCA9IG5hbWVbOkxFTkdUSF9QUkVGSVggKyAxXQogICAgICAgIHdoaWxlIHByZWZpeCBhbmQgcHJlZml4Wy0xXSAhPSAiLyI6CiAgICAgICAgICAgIHByZWZpeCA9IHByZWZpeFs6LTFdCgogICAgICAgIG5hbWUgPSBuYW1lW2xlbihwcmVmaXgpOl0KICAgICAgICBwcmVmaXggPSBwcmVmaXhbOi0xXQoKICAgICAgICBpZiBub3QgcHJlZml4IG9yIGxlbihuYW1lKSA+IExFTkdUSF9OQU1FOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJuYW1lIGlzIHRvbyBsb25nIikKICAgICAgICByZXR1cm4gcHJlZml4LCBuYW1lCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9jcmVhdGVfaGVhZGVyKGluZm8sIGZvcm1hdCwgZW5jb2RpbmcsIGVycm9ycyk6CiAgICAgICAgIiIiUmV0dXJuIGEgaGVhZGVyIGJsb2NrLiBpbmZvIGlzIGEgZGljdGlvbmFyeSB3aXRoIGZpbGUKICAgICAgICAgICBpbmZvcm1hdGlvbiwgZm9ybWF0IG11c3QgYmUgb25lIG9mIHRoZSAqX0ZPUk1BVCBjb25zdGFudHMuCiAgICAgICAgIiIiCiAgICAgICAgcGFydHMgPSBbCiAgICAgICAgICAgIHN0bihpbmZvLmdldCgibmFtZSIsICIiKSwgMTAwLCBlbmNvZGluZywgZXJyb3JzKSwKICAgICAgICAgICAgaXRuKGluZm8uZ2V0KCJtb2RlIiwgMCkgJiAwbzc3NzcsIDgsIGZvcm1hdCksCiAgICAgICAgICAgIGl0bihpbmZvLmdldCgidWlkIiwgMCksIDgsIGZvcm1hdCksCiAgICAgICAgICAgIGl0bihpbmZvLmdldCgiZ2lkIiwgMCksIDgsIGZvcm1hdCksCiAgICAgICAgICAgIGl0bihpbmZvLmdldCgic2l6ZSIsIDApLCAxMiwgZm9ybWF0KSwKICAgICAgICAgICAgaXRuKGluZm8uZ2V0KCJtdGltZSIsIDApLCAxMiwgZm9ybWF0KSwKICAgICAgICAgICAgYiIgICAgICAgICIsICMgY2hlY2tzdW0gZmllbGQKICAgICAgICAgICAgaW5mby5nZXQoInR5cGUiLCBSRUdUWVBFKSwKICAgICAgICAgICAgc3RuKGluZm8uZ2V0KCJsaW5rbmFtZSIsICIiKSwgMTAwLCBlbmNvZGluZywgZXJyb3JzKSwKICAgICAgICAgICAgaW5mby5nZXQoIm1hZ2ljIiwgUE9TSVhfTUFHSUMpLAogICAgICAgICAgICBzdG4oaW5mby5nZXQoInVuYW1lIiwgIiIpLCAzMiwgZW5jb2RpbmcsIGVycm9ycyksCiAgICAgICAgICAgIHN0bihpbmZvLmdldCgiZ25hbWUiLCAiIiksIDMyLCBlbmNvZGluZywgZXJyb3JzKSwKICAgICAgICAgICAgaXRuKGluZm8uZ2V0KCJkZXZtYWpvciIsIDApLCA4LCBmb3JtYXQpLAogICAgICAgICAgICBpdG4oaW5mby5nZXQoImRldm1pbm9yIiwgMCksIDgsIGZvcm1hdCksCiAgICAgICAgICAgIHN0bihpbmZvLmdldCgicHJlZml4IiwgIiIpLCAxNTUsIGVuY29kaW5nLCBlcnJvcnMpCiAgICAgICAgXQoKICAgICAgICBidWYgPSBzdHJ1Y3QucGFjaygiJWRzIiAlIEJMT0NLU0laRSwgYiIiLmpvaW4ocGFydHMpKQogICAgICAgIGNoa3N1bSA9IGNhbGNfY2hrc3VtcyhidWZbLUJMT0NLU0laRTpdKVswXQogICAgICAgIGJ1ZiA9IGJ1Zls6LTM2NF0gKyAoIiUwNm9cMCIgJSBjaGtzdW0pLmVuY29kZSgiYXNjaWkiKSArIGJ1ZlstMzU3Ol0KICAgICAgICByZXR1cm4gYnVmCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9jcmVhdGVfcGF5bG9hZChwYXlsb2FkKToKICAgICAgICAiIiJSZXR1cm4gdGhlIHN0cmluZyBwYXlsb2FkIGZpbGxlZCB3aXRoIHplcm8gYnl0ZXMKICAgICAgICAgICB1cCB0byB0aGUgbmV4dCA1MTIgYnl0ZSBib3JkZXIuCiAgICAgICAgIiIiCiAgICAgICAgYmxvY2tzLCByZW1haW5kZXIgPSBkaXZtb2QobGVuKHBheWxvYWQpLCBCTE9DS1NJWkUpCiAgICAgICAgaWYgcmVtYWluZGVyID4gMDoKICAgICAgICAgICAgcGF5bG9hZCArPSAoQkxPQ0tTSVpFIC0gcmVtYWluZGVyKSAqIE5VTAogICAgICAgIHJldHVybiBwYXlsb2FkCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX2NyZWF0ZV9nbnVfbG9uZ19oZWFkZXIoY2xzLCBuYW1lLCB0eXBlLCBlbmNvZGluZywgZXJyb3JzKToKICAgICAgICAiIiJSZXR1cm4gYSBHTlVUWVBFX0xPTkdOQU1FIG9yIEdOVVRZUEVfTE9OR0xJTksgc2VxdWVuY2UKICAgICAgICAgICBmb3IgbmFtZS4KICAgICAgICAiIiIKICAgICAgICBuYW1lID0gbmFtZS5lbmNvZGUoZW5jb2RpbmcsIGVycm9ycykgKyBOVUwKCiAgICAgICAgaW5mbyA9IHt9CiAgICAgICAgaW5mb1sibmFtZSJdID0gIi4vLi9ATG9uZ0xpbmsiCiAgICAgICAgaW5mb1sidHlwZSJdID0gdHlwZQogICAgICAgIGluZm9bInNpemUiXSA9IGxlbihuYW1lKQogICAgICAgIGluZm9bIm1hZ2ljIl0gPSBHTlVfTUFHSUMKCiAgICAgICAgIyBjcmVhdGUgZXh0ZW5kZWQgaGVhZGVyICsgbmFtZSBibG9ja3MuCiAgICAgICAgcmV0dXJuIGNscy5fY3JlYXRlX2hlYWRlcihpbmZvLCBVU1RBUl9GT1JNQVQsIGVuY29kaW5nLCBlcnJvcnMpICsgXAogICAgICAgICAgICAgICAgY2xzLl9jcmVhdGVfcGF5bG9hZChuYW1lKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9jcmVhdGVfcGF4X2dlbmVyaWNfaGVhZGVyKGNscywgcGF4X2hlYWRlcnMsIHR5cGUsIGVuY29kaW5nKToKICAgICAgICAiIiJSZXR1cm4gYSBQT1NJWC4xLTIwMDggZXh0ZW5kZWQgb3IgZ2xvYmFsIGhlYWRlciBzZXF1ZW5jZQogICAgICAgICAgIHRoYXQgY29udGFpbnMgYSBsaXN0IG9mIGtleXdvcmQsIHZhbHVlIHBhaXJzLiBUaGUgdmFsdWVzCiAgICAgICAgICAgbXVzdCBiZSBzdHJpbmdzLgogICAgICAgICIiIgogICAgICAgICMgQ2hlY2sgaWYgb25lIG9mIHRoZSBmaWVsZHMgY29udGFpbnMgc3Vycm9nYXRlIGNoYXJhY3RlcnMgYW5kIHRoZXJlYnkKICAgICAgICAjIGZvcmNlcyBoZHJjaGFyc2V0PUJJTkFSWSwgc2VlIF9wcm9jX3BheCgpIGZvciBtb3JlIGluZm9ybWF0aW9uLgogICAgICAgIGJpbmFyeSA9IEZhbHNlCiAgICAgICAgZm9yIGtleXdvcmQsIHZhbHVlIGluIHBheF9oZWFkZXJzLml0ZW1zKCk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHZhbHVlLmVuY29kZSgidXRmOCIsICJzdHJpY3QiKQogICAgICAgICAgICBleGNlcHQgVW5pY29kZUVuY29kZUVycm9yOgogICAgICAgICAgICAgICAgYmluYXJ5ID0gVHJ1ZQogICAgICAgICAgICAgICAgYnJlYWsKCiAgICAgICAgcmVjb3JkcyA9IGIiIgogICAgICAgIGlmIGJpbmFyeToKICAgICAgICAgICAgIyBQdXQgdGhlIGhkcmNoYXJzZXQgZmllbGQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgaGVhZGVyLgogICAgICAgICAgICByZWNvcmRzICs9IGIiMjEgaGRyY2hhcnNldD1CSU5BUllcbiIKCiAgICAgICAgZm9yIGtleXdvcmQsIHZhbHVlIGluIHBheF9oZWFkZXJzLml0ZW1zKCk6CiAgICAgICAgICAgIGtleXdvcmQgPSBrZXl3b3JkLmVuY29kZSgidXRmOCIpCiAgICAgICAgICAgIGlmIGJpbmFyeToKICAgICAgICAgICAgICAgICMgVHJ5IHRvIHJlc3RvcmUgdGhlIG9yaWdpbmFsIGJ5dGUgcmVwcmVzZW50YXRpb24gb2YgYHZhbHVlJy4KICAgICAgICAgICAgICAgICMgTmVlZGxlc3MgdG8gc2F5LCB0aGF0IHRoZSBlbmNvZGluZyBtdXN0IG1hdGNoIHRoZSBzdHJpbmcuCiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLmVuY29kZShlbmNvZGluZywgInN1cnJvZ2F0ZWVzY2FwZSIpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLmVuY29kZSgidXRmOCIpCgogICAgICAgICAgICBsID0gbGVuKGtleXdvcmQpICsgbGVuKHZhbHVlKSArIDMgICAjICcgJyArICc9JyArICdcbicKICAgICAgICAgICAgbiA9IHAgPSAwCiAgICAgICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgICAgICBuID0gbCArIGxlbihzdHIocCkpCiAgICAgICAgICAgICAgICBpZiBuID09IHA6CiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgIHAgPSBuCiAgICAgICAgICAgIHJlY29yZHMgKz0gYnl0ZXMoc3RyKHApLCAiYXNjaWkiKSArIGIiICIgKyBrZXl3b3JkICsgYiI9IiArIHZhbHVlICsgYiJcbiIKCiAgICAgICAgIyBXZSB1c2UgYSBoYXJkY29kZWQgIi4vLi9AUGF4SGVhZGVyIiBuYW1lIGxpa2Ugc3RhciBkb2VzCiAgICAgICAgIyBpbnN0ZWFkIG9mIHRoZSBvbmUgdGhhdCBQT1NJWCByZWNvbW1lbmRzLgogICAgICAgIGluZm8gPSB7fQogICAgICAgIGluZm9bIm5hbWUiXSA9ICIuLy4vQFBheEhlYWRlciIKICAgICAgICBpbmZvWyJ0eXBlIl0gPSB0eXBlCiAgICAgICAgaW5mb1sic2l6ZSJdID0gbGVuKHJlY29yZHMpCiAgICAgICAgaW5mb1sibWFnaWMiXSA9IFBPU0lYX01BR0lDCgogICAgICAgICMgQ3JlYXRlIHBheCBoZWFkZXIgKyByZWNvcmQgYmxvY2tzLgogICAgICAgIHJldHVybiBjbHMuX2NyZWF0ZV9oZWFkZXIoaW5mbywgVVNUQVJfRk9STUFULCAiYXNjaWkiLCAicmVwbGFjZSIpICsgXAogICAgICAgICAgICAgICAgY2xzLl9jcmVhdGVfcGF5bG9hZChyZWNvcmRzKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGZyb21idWYoY2xzLCBidWYsIGVuY29kaW5nLCBlcnJvcnMpOgogICAgICAgICIiIkNvbnN0cnVjdCBhIFRhckluZm8gb2JqZWN0IGZyb20gYSA1MTIgYnl0ZSBieXRlcyBvYmplY3QuCiAgICAgICAgIiIiCiAgICAgICAgaWYgbGVuKGJ1ZikgPT0gMDoKICAgICAgICAgICAgcmFpc2UgRW1wdHlIZWFkZXJFcnJvcigiZW1wdHkgaGVhZGVyIikKICAgICAgICBpZiBsZW4oYnVmKSAhPSBCTE9DS1NJWkU6CiAgICAgICAgICAgIHJhaXNlIFRydW5jYXRlZEhlYWRlckVycm9yKCJ0cnVuY2F0ZWQgaGVhZGVyIikKICAgICAgICBpZiBidWYuY291bnQoTlVMKSA9PSBCTE9DS1NJWkU6CiAgICAgICAgICAgIHJhaXNlIEVPRkhlYWRlckVycm9yKCJlbmQgb2YgZmlsZSBoZWFkZXIiKQoKICAgICAgICBjaGtzdW0gPSBudGkoYnVmWzE0ODoxNTZdKQogICAgICAgIGlmIGNoa3N1bSBub3QgaW4gY2FsY19jaGtzdW1zKGJ1Zik6CiAgICAgICAgICAgIHJhaXNlIEludmFsaWRIZWFkZXJFcnJvcigiYmFkIGNoZWNrc3VtIikKCiAgICAgICAgb2JqID0gY2xzKCkKICAgICAgICBvYmoubmFtZSA9IG50cyhidWZbMDoxMDBdLCBlbmNvZGluZywgZXJyb3JzKQogICAgICAgIG9iai5tb2RlID0gbnRpKGJ1ZlsxMDA6MTA4XSkKICAgICAgICBvYmoudWlkID0gbnRpKGJ1ZlsxMDg6MTE2XSkKICAgICAgICBvYmouZ2lkID0gbnRpKGJ1ZlsxMTY6MTI0XSkKICAgICAgICBvYmouc2l6ZSA9IG50aShidWZbMTI0OjEzNl0pCiAgICAgICAgb2JqLm10aW1lID0gbnRpKGJ1ZlsxMzY6MTQ4XSkKICAgICAgICBvYmouY2hrc3VtID0gY2hrc3VtCiAgICAgICAgb2JqLnR5cGUgPSBidWZbMTU2OjE1N10KICAgICAgICBvYmoubGlua25hbWUgPSBudHMoYnVmWzE1NzoyNTddLCBlbmNvZGluZywgZXJyb3JzKQogICAgICAgIG9iai51bmFtZSA9IG50cyhidWZbMjY1OjI5N10sIGVuY29kaW5nLCBlcnJvcnMpCiAgICAgICAgb2JqLmduYW1lID0gbnRzKGJ1ZlsyOTc6MzI5XSwgZW5jb2RpbmcsIGVycm9ycykKICAgICAgICBvYmouZGV2bWFqb3IgPSBudGkoYnVmWzMyOTozMzddKQogICAgICAgIG9iai5kZXZtaW5vciA9IG50aShidWZbMzM3OjM0NV0pCiAgICAgICAgcHJlZml4ID0gbnRzKGJ1ZlszNDU6NTAwXSwgZW5jb2RpbmcsIGVycm9ycykKCiAgICAgICAgIyBPbGQgVjcgdGFyIGZvcm1hdCByZXByZXNlbnRzIGEgZGlyZWN0b3J5IGFzIGEgcmVndWxhcgogICAgICAgICMgZmlsZSB3aXRoIGEgdHJhaWxpbmcgc2xhc2guCiAgICAgICAgaWYgb2JqLnR5cGUgPT0gQVJFR1RZUEUgYW5kIG9iai5uYW1lLmVuZHN3aXRoKCIvIik6CiAgICAgICAgICAgIG9iai50eXBlID0gRElSVFlQRQoKICAgICAgICAjIFRoZSBvbGQgR05VIHNwYXJzZSBmb3JtYXQgb2NjdXBpZXMgc29tZSBvZiB0aGUgdW51c2VkCiAgICAgICAgIyBzcGFjZSBpbiB0aGUgYnVmZmVyIGZvciB1cCB0byA0IHNwYXJzZSBzdHJ1Y3R1cmVzLgogICAgICAgICMgU2F2ZSB0aGUgdGhlbSBmb3IgbGF0ZXIgcHJvY2Vzc2luZyBpbiBfcHJvY19zcGFyc2UoKS4KICAgICAgICBpZiBvYmoudHlwZSA9PSBHTlVUWVBFX1NQQVJTRToKICAgICAgICAgICAgcG9zID0gMzg2CiAgICAgICAgICAgIHN0cnVjdHMgPSBbXQogICAgICAgICAgICBmb3IgaSBpbiByYW5nZSg0KToKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBudGkoYnVmW3Bvczpwb3MgKyAxMl0pCiAgICAgICAgICAgICAgICAgICAgbnVtYnl0ZXMgPSBudGkoYnVmW3BvcyArIDEyOnBvcyArIDI0XSkKICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICBzdHJ1Y3RzLmFwcGVuZCgob2Zmc2V0LCBudW1ieXRlcykpCiAgICAgICAgICAgICAgICBwb3MgKz0gMjQKICAgICAgICAgICAgaXNleHRlbmRlZCA9IGJvb2woYnVmWzQ4Ml0pCiAgICAgICAgICAgIG9yaWdzaXplID0gbnRpKGJ1Zls0ODM6NDk1XSkKICAgICAgICAgICAgb2JqLl9zcGFyc2Vfc3RydWN0cyA9IChzdHJ1Y3RzLCBpc2V4dGVuZGVkLCBvcmlnc2l6ZSkKCiAgICAgICAgIyBSZW1vdmUgcmVkdW5kYW50IHNsYXNoZXMgZnJvbSBkaXJlY3Rvcmllcy4KICAgICAgICBpZiBvYmouaXNkaXIoKToKICAgICAgICAgICAgb2JqLm5hbWUgPSBvYmoubmFtZS5yc3RyaXAoIi8iKQoKICAgICAgICAjIFJlY29uc3RydWN0IGEgdXN0YXIgbG9uZ25hbWUuCiAgICAgICAgaWYgcHJlZml4IGFuZCBvYmoudHlwZSBub3QgaW4gR05VX1RZUEVTOgogICAgICAgICAgICBvYmoubmFtZSA9IHByZWZpeCArICIvIiArIG9iai5uYW1lCiAgICAgICAgcmV0dXJuIG9iagoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGZyb210YXJmaWxlKGNscywgdGFyZmlsZSk6CiAgICAgICAgIiIiUmV0dXJuIHRoZSBuZXh0IFRhckluZm8gb2JqZWN0IGZyb20gVGFyRmlsZSBvYmplY3QKICAgICAgICAgICB0YXJmaWxlLgogICAgICAgICIiIgogICAgICAgIGJ1ZiA9IHRhcmZpbGUuZmlsZW9iai5yZWFkKEJMT0NLU0laRSkKICAgICAgICBvYmogPSBjbHMuZnJvbWJ1ZihidWYsIHRhcmZpbGUuZW5jb2RpbmcsIHRhcmZpbGUuZXJyb3JzKQogICAgICAgIG9iai5vZmZzZXQgPSB0YXJmaWxlLmZpbGVvYmoudGVsbCgpIC0gQkxPQ0tTSVpFCiAgICAgICAgcmV0dXJuIG9iai5fcHJvY19tZW1iZXIodGFyZmlsZSkKCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgVGhlIGZvbGxvd2luZyBhcmUgbWV0aG9kcyB0aGF0IGFyZSBjYWxsZWQgZGVwZW5kaW5nIG9uIHRoZSB0eXBlIG9mIGEKICAgICMgbWVtYmVyLiBUaGUgZW50cnkgcG9pbnQgaXMgX3Byb2NfbWVtYmVyKCkgd2hpY2ggY2FuIGJlIG92ZXJyaWRkZW4gaW4gYQogICAgIyBzdWJjbGFzcyB0byBhZGQgY3VzdG9tIF9wcm9jXyooKSBtZXRob2RzLiBBIF9wcm9jXyooKSBtZXRob2QgTVVTVAogICAgIyBpbXBsZW1lbnQgdGhlIGZvbGxvd2luZwogICAgIyBvcGVyYXRpb25zOgogICAgIyAxLiBTZXQgc2VsZi5vZmZzZXRfZGF0YSB0byB0aGUgcG9zaXRpb24gd2hlcmUgdGhlIGRhdGEgYmxvY2tzIGJlZ2luLAogICAgIyAgICBpZiB0aGVyZSBpcyBkYXRhIHRoYXQgZm9sbG93cy4KICAgICMgMi4gU2V0IHRhcmZpbGUub2Zmc2V0IHRvIHRoZSBwb3NpdGlvbiB3aGVyZSB0aGUgbmV4dCBtZW1iZXIncyBoZWFkZXIgd2lsbAogICAgIyAgICBiZWdpbi4KICAgICMgMy4gUmV0dXJuIHNlbGYgb3IgYW5vdGhlciB2YWxpZCBUYXJJbmZvIG9iamVjdC4KICAgIGRlZiBfcHJvY19tZW1iZXIoc2VsZiwgdGFyZmlsZSk6CiAgICAgICAgIiIiQ2hvb3NlIHRoZSByaWdodCBwcm9jZXNzaW5nIG1ldGhvZCBkZXBlbmRpbmcgb24KICAgICAgICAgICB0aGUgdHlwZSBhbmQgY2FsbCBpdC4KICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLnR5cGUgaW4gKEdOVVRZUEVfTE9OR05BTUUsIEdOVVRZUEVfTE9OR0xJTkspOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fcHJvY19nbnVsb25nKHRhcmZpbGUpCiAgICAgICAgZWxpZiBzZWxmLnR5cGUgPT0gR05VVFlQRV9TUEFSU0U6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9wcm9jX3NwYXJzZSh0YXJmaWxlKQogICAgICAgIGVsaWYgc2VsZi50eXBlIGluIChYSERUWVBFLCBYR0xUWVBFLCBTT0xBUklTX1hIRFRZUEUpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fcHJvY19wYXgodGFyZmlsZSkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fcHJvY19idWlsdGluKHRhcmZpbGUpCgogICAgZGVmIF9wcm9jX2J1aWx0aW4oc2VsZiwgdGFyZmlsZSk6CiAgICAgICAgIiIiUHJvY2VzcyBhIGJ1aWx0aW4gdHlwZSBvciBhbiB1bmtub3duIHR5cGUgd2hpY2gKICAgICAgICAgICB3aWxsIGJlIHRyZWF0ZWQgYXMgYSByZWd1bGFyIGZpbGUuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5vZmZzZXRfZGF0YSA9IHRhcmZpbGUuZmlsZW9iai50ZWxsKCkKICAgICAgICBvZmZzZXQgPSBzZWxmLm9mZnNldF9kYXRhCiAgICAgICAgaWYgc2VsZi5pc3JlZygpIG9yIHNlbGYudHlwZSBub3QgaW4gU1VQUE9SVEVEX1RZUEVTOgogICAgICAgICAgICAjIFNraXAgdGhlIGZvbGxvd2luZyBkYXRhIGJsb2Nrcy4KICAgICAgICAgICAgb2Zmc2V0ICs9IHNlbGYuX2Jsb2NrKHNlbGYuc2l6ZSkKICAgICAgICB0YXJmaWxlLm9mZnNldCA9IG9mZnNldAoKICAgICAgICAjIFBhdGNoIHRoZSBUYXJJbmZvIG9iamVjdCB3aXRoIHNhdmVkIGdsb2JhbAogICAgICAgICMgaGVhZGVyIGluZm9ybWF0aW9uLgogICAgICAgIHNlbGYuX2FwcGx5X3BheF9pbmZvKHRhcmZpbGUucGF4X2hlYWRlcnMsIHRhcmZpbGUuZW5jb2RpbmcsIHRhcmZpbGUuZXJyb3JzKQoKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBfcHJvY19nbnVsb25nKHNlbGYsIHRhcmZpbGUpOgogICAgICAgICIiIlByb2Nlc3MgdGhlIGJsb2NrcyB0aGF0IGhvbGQgYSBHTlUgbG9uZ25hbWUKICAgICAgICAgICBvciBsb25nbGluayBtZW1iZXIuCiAgICAgICAgIiIiCiAgICAgICAgYnVmID0gdGFyZmlsZS5maWxlb2JqLnJlYWQoc2VsZi5fYmxvY2soc2VsZi5zaXplKSkKCiAgICAgICAgIyBGZXRjaCB0aGUgbmV4dCBoZWFkZXIgYW5kIHByb2Nlc3MgaXQuCiAgICAgICAgdHJ5OgogICAgICAgICAgICBuZXh0ID0gc2VsZi5mcm9tdGFyZmlsZSh0YXJmaWxlKQogICAgICAgIGV4Y2VwdCBIZWFkZXJFcnJvcjoKICAgICAgICAgICAgcmFpc2UgU3Vic2VxdWVudEhlYWRlckVycm9yKCJtaXNzaW5nIG9yIGJhZCBzdWJzZXF1ZW50IGhlYWRlciIpCgogICAgICAgICMgUGF0Y2ggdGhlIFRhckluZm8gb2JqZWN0IGZyb20gdGhlIG5leHQgaGVhZGVyIHdpdGgKICAgICAgICAjIHRoZSBsb25nbmFtZSBpbmZvcm1hdGlvbi4KICAgICAgICBuZXh0Lm9mZnNldCA9IHNlbGYub2Zmc2V0CiAgICAgICAgaWYgc2VsZi50eXBlID09IEdOVVRZUEVfTE9OR05BTUU6CiAgICAgICAgICAgIG5leHQubmFtZSA9IG50cyhidWYsIHRhcmZpbGUuZW5jb2RpbmcsIHRhcmZpbGUuZXJyb3JzKQogICAgICAgIGVsaWYgc2VsZi50eXBlID09IEdOVVRZUEVfTE9OR0xJTks6CiAgICAgICAgICAgIG5leHQubGlua25hbWUgPSBudHMoYnVmLCB0YXJmaWxlLmVuY29kaW5nLCB0YXJmaWxlLmVycm9ycykKCiAgICAgICAgcmV0dXJuIG5leHQKCiAgICBkZWYgX3Byb2Nfc3BhcnNlKHNlbGYsIHRhcmZpbGUpOgogICAgICAgICIiIlByb2Nlc3MgYSBHTlUgc3BhcnNlIGhlYWRlciBwbHVzIGV4dHJhIGhlYWRlcnMuCiAgICAgICAgIiIiCiAgICAgICAgIyBXZSBhbHJlYWR5IGNvbGxlY3RlZCBzb21lIHNwYXJzZSBzdHJ1Y3R1cmVzIGluIGZyb21idWYoKS4KICAgICAgICBzdHJ1Y3RzLCBpc2V4dGVuZGVkLCBvcmlnc2l6ZSA9IHNlbGYuX3NwYXJzZV9zdHJ1Y3RzCiAgICAgICAgZGVsIHNlbGYuX3NwYXJzZV9zdHJ1Y3RzCgogICAgICAgICMgQ29sbGVjdCBzcGFyc2Ugc3RydWN0dXJlcyBmcm9tIGV4dGVuZGVkIGhlYWRlciBibG9ja3MuCiAgICAgICAgd2hpbGUgaXNleHRlbmRlZDoKICAgICAgICAgICAgYnVmID0gdGFyZmlsZS5maWxlb2JqLnJlYWQoQkxPQ0tTSVpFKQogICAgICAgICAgICBwb3MgPSAwCiAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDIxKToKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBudGkoYnVmW3Bvczpwb3MgKyAxMl0pCiAgICAgICAgICAgICAgICAgICAgbnVtYnl0ZXMgPSBudGkoYnVmW3BvcyArIDEyOnBvcyArIDI0XSkKICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICBpZiBvZmZzZXQgYW5kIG51bWJ5dGVzOgogICAgICAgICAgICAgICAgICAgIHN0cnVjdHMuYXBwZW5kKChvZmZzZXQsIG51bWJ5dGVzKSkKICAgICAgICAgICAgICAgIHBvcyArPSAyNAogICAgICAgICAgICBpc2V4dGVuZGVkID0gYm9vbChidWZbNTA0XSkKICAgICAgICBzZWxmLnNwYXJzZSA9IHN0cnVjdHMKCiAgICAgICAgc2VsZi5vZmZzZXRfZGF0YSA9IHRhcmZpbGUuZmlsZW9iai50ZWxsKCkKICAgICAgICB0YXJmaWxlLm9mZnNldCA9IHNlbGYub2Zmc2V0X2RhdGEgKyBzZWxmLl9ibG9jayhzZWxmLnNpemUpCiAgICAgICAgc2VsZi5zaXplID0gb3JpZ3NpemUKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBfcHJvY19wYXgoc2VsZiwgdGFyZmlsZSk6CiAgICAgICAgIiIiUHJvY2VzcyBhbiBleHRlbmRlZCBvciBnbG9iYWwgaGVhZGVyIGFzIGRlc2NyaWJlZCBpbgogICAgICAgICAgIFBPU0lYLjEtMjAwOC4KICAgICAgICAiIiIKICAgICAgICAjIFJlYWQgdGhlIGhlYWRlciBpbmZvcm1hdGlvbi4KICAgICAgICBidWYgPSB0YXJmaWxlLmZpbGVvYmoucmVhZChzZWxmLl9ibG9jayhzZWxmLnNpemUpKQoKICAgICAgICAjIEEgcGF4IGhlYWRlciBzdG9yZXMgc3VwcGxlbWVudGFsIGluZm9ybWF0aW9uIGZvciBlaXRoZXIKICAgICAgICAjIHRoZSBmb2xsb3dpbmcgZmlsZSAoZXh0ZW5kZWQpIG9yIGFsbCBmb2xsb3dpbmcgZmlsZXMKICAgICAgICAjIChnbG9iYWwpLgogICAgICAgIGlmIHNlbGYudHlwZSA9PSBYR0xUWVBFOgogICAgICAgICAgICBwYXhfaGVhZGVycyA9IHRhcmZpbGUucGF4X2hlYWRlcnMKICAgICAgICBlbHNlOgogICAgICAgICAgICBwYXhfaGVhZGVycyA9IHRhcmZpbGUucGF4X2hlYWRlcnMuY29weSgpCgogICAgICAgICMgQ2hlY2sgaWYgdGhlIHBheCBoZWFkZXIgY29udGFpbnMgYSBoZHJjaGFyc2V0IGZpZWxkLiBUaGlzIHRlbGxzIHVzCiAgICAgICAgIyB0aGUgZW5jb2Rpbmcgb2YgdGhlIHBhdGgsIGxpbmtwYXRoLCB1bmFtZSBhbmQgZ25hbWUgZmllbGRzLiBOb3JtYWxseSwKICAgICAgICAjIHRoZXNlIGZpZWxkcyBhcmUgVVRGLTggZW5jb2RlZCBidXQgc2luY2UgUE9TSVguMS0yMDA4IHRhcgogICAgICAgICMgaW1wbGVtZW50YXRpb25zIGFyZSBhbGxvd2VkIHRvIHN0b3JlIHRoZW0gYXMgcmF3IGJpbmFyeSBzdHJpbmdzIGlmCiAgICAgICAgIyB0aGUgdHJhbnNsYXRpb24gdG8gVVRGLTggZmFpbHMuCiAgICAgICAgbWF0Y2ggPSByZS5zZWFyY2goYnIiXGQrIGhkcmNoYXJzZXQ9KFteXG5dKylcbiIsIGJ1ZikKICAgICAgICBpZiBtYXRjaCBpcyBub3QgTm9uZToKICAgICAgICAgICAgcGF4X2hlYWRlcnNbImhkcmNoYXJzZXQiXSA9IG1hdGNoLmdyb3VwKDEpLmRlY29kZSgidXRmOCIpCgogICAgICAgICMgRm9yIHRoZSB0aW1lIGJlaW5nLCB3ZSBkb24ndCBjYXJlIGFib3V0IGFueXRoaW5nIG90aGVyIHRoYW4gIkJJTkFSWSIuCiAgICAgICAgIyBUaGUgb25seSBvdGhlciB2YWx1ZSB0aGF0IGlzIGN1cnJlbnRseSBhbGxvd2VkIGJ5IHRoZSBzdGFuZGFyZCBpcwogICAgICAgICMgIklTTy1JUiAxMDY0NiAyMDAwIFVURi04IiBpbiBvdGhlciB3b3JkcyBVVEYtOC4KICAgICAgICBoZHJjaGFyc2V0ID0gcGF4X2hlYWRlcnMuZ2V0KCJoZHJjaGFyc2V0IikKICAgICAgICBpZiBoZHJjaGFyc2V0ID09ICJCSU5BUlkiOgogICAgICAgICAgICBlbmNvZGluZyA9IHRhcmZpbGUuZW5jb2RpbmcKICAgICAgICBlbHNlOgogICAgICAgICAgICBlbmNvZGluZyA9ICJ1dGY4IgoKICAgICAgICAjIFBhcnNlIHBheCBoZWFkZXIgaW5mb3JtYXRpb24uIEEgcmVjb3JkIGxvb2tzIGxpa2UgdGhhdDoKICAgICAgICAjICIlZCAlcz0lc1xuIiAlIChsZW5ndGgsIGtleXdvcmQsIHZhbHVlKS4gbGVuZ3RoIGlzIHRoZSBzaXplCiAgICAgICAgIyBvZiB0aGUgY29tcGxldGUgcmVjb3JkIGluY2x1ZGluZyB0aGUgbGVuZ3RoIGZpZWxkIGl0c2VsZiBhbmQKICAgICAgICAjIHRoZSBuZXdsaW5lLiBrZXl3b3JkIGFuZCB2YWx1ZSBhcmUgYm90aCBVVEYtOCBlbmNvZGVkIHN0cmluZ3MuCiAgICAgICAgcmVnZXggPSByZS5jb21waWxlKGJyIihcZCspIChbXj1dKyk9IikKICAgICAgICBwb3MgPSAwCiAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgbWF0Y2ggPSByZWdleC5tYXRjaChidWYsIHBvcykKICAgICAgICAgICAgaWYgbm90IG1hdGNoOgogICAgICAgICAgICAgICAgYnJlYWsKCiAgICAgICAgICAgIGxlbmd0aCwga2V5d29yZCA9IG1hdGNoLmdyb3VwcygpCiAgICAgICAgICAgIGxlbmd0aCA9IGludChsZW5ndGgpCiAgICAgICAgICAgIHZhbHVlID0gYnVmW21hdGNoLmVuZCgyKSArIDE6bWF0Y2guc3RhcnQoMSkgKyBsZW5ndGggLSAxXQoKICAgICAgICAgICAgIyBOb3JtYWxseSwgd2UgY291bGQganVzdCB1c2UgInV0ZjgiIGFzIHRoZSBlbmNvZGluZyBhbmQgInN0cmljdCIKICAgICAgICAgICAgIyBhcyB0aGUgZXJyb3IgaGFuZGxlciwgYnV0IHdlIGJldHRlciBub3QgdGFrZSB0aGUgcmlzay4gRm9yCiAgICAgICAgICAgICMgZXhhbXBsZSwgR05VIHRhciA8PSAxLjIzIGlzIGtub3duIHRvIHN0b3JlIGZpbGVuYW1lcyBpdCBjYW5ub3QKICAgICAgICAgICAgIyB0cmFuc2xhdGUgdG8gVVRGLTggYXMgcmF3IHN0cmluZ3MgKHVuZm9ydHVuYXRlbHkgd2l0aG91dCBhCiAgICAgICAgICAgICMgaGRyY2hhcnNldD1CSU5BUlkgaGVhZGVyKS4KICAgICAgICAgICAgIyBXZSBmaXJzdCB0cnkgdGhlIHN0cmljdCBzdGFuZGFyZCBlbmNvZGluZywgYW5kIGlmIHRoYXQgZmFpbHMgd2UKICAgICAgICAgICAgIyBmYWxsIGJhY2sgb24gdGhlIHVzZXIncyBlbmNvZGluZyBhbmQgZXJyb3IgaGFuZGxlci4KICAgICAgICAgICAga2V5d29yZCA9IHNlbGYuX2RlY29kZV9wYXhfZmllbGQoa2V5d29yZCwgInV0ZjgiLCAidXRmOCIsCiAgICAgICAgICAgICAgICAgICAgdGFyZmlsZS5lcnJvcnMpCiAgICAgICAgICAgIGlmIGtleXdvcmQgaW4gUEFYX05BTUVfRklFTERTOgogICAgICAgICAgICAgICAgdmFsdWUgPSBzZWxmLl9kZWNvZGVfcGF4X2ZpZWxkKHZhbHVlLCBlbmNvZGluZywgdGFyZmlsZS5lbmNvZGluZywKICAgICAgICAgICAgICAgICAgICAgICAgdGFyZmlsZS5lcnJvcnMpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuX2RlY29kZV9wYXhfZmllbGQodmFsdWUsICJ1dGY4IiwgInV0ZjgiLAogICAgICAgICAgICAgICAgICAgICAgICB0YXJmaWxlLmVycm9ycykKCiAgICAgICAgICAgIHBheF9oZWFkZXJzW2tleXdvcmRdID0gdmFsdWUKICAgICAgICAgICAgcG9zICs9IGxlbmd0aAoKICAgICAgICAjIEZldGNoIHRoZSBuZXh0IGhlYWRlci4KICAgICAgICB0cnk6CiAgICAgICAgICAgIG5leHQgPSBzZWxmLmZyb210YXJmaWxlKHRhcmZpbGUpCiAgICAgICAgZXhjZXB0IEhlYWRlckVycm9yOgogICAgICAgICAgICByYWlzZSBTdWJzZXF1ZW50SGVhZGVyRXJyb3IoIm1pc3Npbmcgb3IgYmFkIHN1YnNlcXVlbnQgaGVhZGVyIikKCiAgICAgICAgIyBQcm9jZXNzIEdOVSBzcGFyc2UgaW5mb3JtYXRpb24uCiAgICAgICAgaWYgIkdOVS5zcGFyc2UubWFwIiBpbiBwYXhfaGVhZGVyczoKICAgICAgICAgICAgIyBHTlUgZXh0ZW5kZWQgc3BhcnNlIGZvcm1hdCB2ZXJzaW9uIDAuMS4KICAgICAgICAgICAgc2VsZi5fcHJvY19nbnVzcGFyc2VfMDEobmV4dCwgcGF4X2hlYWRlcnMpCgogICAgICAgIGVsaWYgIkdOVS5zcGFyc2Uuc2l6ZSIgaW4gcGF4X2hlYWRlcnM6CiAgICAgICAgICAgICMgR05VIGV4dGVuZGVkIHNwYXJzZSBmb3JtYXQgdmVyc2lvbiAwLjAuCiAgICAgICAgICAgIHNlbGYuX3Byb2NfZ251c3BhcnNlXzAwKG5leHQsIHBheF9oZWFkZXJzLCBidWYpCgogICAgICAgIGVsaWYgcGF4X2hlYWRlcnMuZ2V0KCJHTlUuc3BhcnNlLm1ham9yIikgPT0gIjEiIGFuZCBwYXhfaGVhZGVycy5nZXQoIkdOVS5zcGFyc2UubWlub3IiKSA9PSAiMCI6CiAgICAgICAgICAgICMgR05VIGV4dGVuZGVkIHNwYXJzZSBmb3JtYXQgdmVyc2lvbiAxLjAuCiAgICAgICAgICAgIHNlbGYuX3Byb2NfZ251c3BhcnNlXzEwKG5leHQsIHBheF9oZWFkZXJzLCB0YXJmaWxlKQoKICAgICAgICBpZiBzZWxmLnR5cGUgaW4gKFhIRFRZUEUsIFNPTEFSSVNfWEhEVFlQRSk6CiAgICAgICAgICAgICMgUGF0Y2ggdGhlIFRhckluZm8gb2JqZWN0IHdpdGggdGhlIGV4dGVuZGVkIGhlYWRlciBpbmZvLgogICAgICAgICAgICBuZXh0Ll9hcHBseV9wYXhfaW5mbyhwYXhfaGVhZGVycywgdGFyZmlsZS5lbmNvZGluZywgdGFyZmlsZS5lcnJvcnMpCiAgICAgICAgICAgIG5leHQub2Zmc2V0ID0gc2VsZi5vZmZzZXQKCiAgICAgICAgICAgIGlmICJzaXplIiBpbiBwYXhfaGVhZGVyczoKICAgICAgICAgICAgICAgICMgSWYgdGhlIGV4dGVuZGVkIGhlYWRlciByZXBsYWNlcyB0aGUgc2l6ZSBmaWVsZCwKICAgICAgICAgICAgICAgICMgd2UgbmVlZCB0byByZWNhbGN1bGF0ZSB0aGUgb2Zmc2V0IHdoZXJlIHRoZSBuZXh0CiAgICAgICAgICAgICAgICAjIGhlYWRlciBzdGFydHMuCiAgICAgICAgICAgICAgICBvZmZzZXQgPSBuZXh0Lm9mZnNldF9kYXRhCiAgICAgICAgICAgICAgICBpZiBuZXh0LmlzcmVnKCkgb3IgbmV4dC50eXBlIG5vdCBpbiBTVVBQT1JURURfVFlQRVM6CiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IG5leHQuX2Jsb2NrKG5leHQuc2l6ZSkKICAgICAgICAgICAgICAgIHRhcmZpbGUub2Zmc2V0ID0gb2Zmc2V0CgogICAgICAgIHJldHVybiBuZXh0CgogICAgZGVmIF9wcm9jX2dudXNwYXJzZV8wMChzZWxmLCBuZXh0LCBwYXhfaGVhZGVycywgYnVmKToKICAgICAgICAiIiJQcm9jZXNzIGEgR05VIHRhciBleHRlbmRlZCBzcGFyc2UgaGVhZGVyLCB2ZXJzaW9uIDAuMC4KICAgICAgICAiIiIKICAgICAgICBvZmZzZXRzID0gW10KICAgICAgICBmb3IgbWF0Y2ggaW4gcmUuZmluZGl0ZXIoYnIiXGQrIEdOVS5zcGFyc2Uub2Zmc2V0PShcZCspXG4iLCBidWYpOgogICAgICAgICAgICBvZmZzZXRzLmFwcGVuZChpbnQobWF0Y2guZ3JvdXAoMSkpKQogICAgICAgIG51bWJ5dGVzID0gW10KICAgICAgICBmb3IgbWF0Y2ggaW4gcmUuZmluZGl0ZXIoYnIiXGQrIEdOVS5zcGFyc2UubnVtYnl0ZXM9KFxkKylcbiIsIGJ1Zik6CiAgICAgICAgICAgIG51bWJ5dGVzLmFwcGVuZChpbnQobWF0Y2guZ3JvdXAoMSkpKQogICAgICAgIG5leHQuc3BhcnNlID0gbGlzdCh6aXAob2Zmc2V0cywgbnVtYnl0ZXMpKQoKICAgIGRlZiBfcHJvY19nbnVzcGFyc2VfMDEoc2VsZiwgbmV4dCwgcGF4X2hlYWRlcnMpOgogICAgICAgICIiIlByb2Nlc3MgYSBHTlUgdGFyIGV4dGVuZGVkIHNwYXJzZSBoZWFkZXIsIHZlcnNpb24gMC4xLgogICAgICAgICIiIgogICAgICAgIHNwYXJzZSA9IFtpbnQoeCkgZm9yIHggaW4gcGF4X2hlYWRlcnNbIkdOVS5zcGFyc2UubWFwIl0uc3BsaXQoIiwiKV0KICAgICAgICBuZXh0LnNwYXJzZSA9IGxpc3QoemlwKHNwYXJzZVs6OjJdLCBzcGFyc2VbMTo6Ml0pKQoKICAgIGRlZiBfcHJvY19nbnVzcGFyc2VfMTAoc2VsZiwgbmV4dCwgcGF4X2hlYWRlcnMsIHRhcmZpbGUpOgogICAgICAgICIiIlByb2Nlc3MgYSBHTlUgdGFyIGV4dGVuZGVkIHNwYXJzZSBoZWFkZXIsIHZlcnNpb24gMS4wLgogICAgICAgICIiIgogICAgICAgIGZpZWxkcyA9IE5vbmUKICAgICAgICBzcGFyc2UgPSBbXQogICAgICAgIGJ1ZiA9IHRhcmZpbGUuZmlsZW9iai5yZWFkKEJMT0NLU0laRSkKICAgICAgICBmaWVsZHMsIGJ1ZiA9IGJ1Zi5zcGxpdChiIlxuIiwgMSkKICAgICAgICBmaWVsZHMgPSBpbnQoZmllbGRzKQogICAgICAgIHdoaWxlIGxlbihzcGFyc2UpIDwgZmllbGRzICogMjoKICAgICAgICAgICAgaWYgYiJcbiIgbm90IGluIGJ1ZjoKICAgICAgICAgICAgICAgIGJ1ZiArPSB0YXJmaWxlLmZpbGVvYmoucmVhZChCTE9DS1NJWkUpCiAgICAgICAgICAgIG51bWJlciwgYnVmID0gYnVmLnNwbGl0KGIiXG4iLCAxKQogICAgICAgICAgICBzcGFyc2UuYXBwZW5kKGludChudW1iZXIpKQogICAgICAgIG5leHQub2Zmc2V0X2RhdGEgPSB0YXJmaWxlLmZpbGVvYmoudGVsbCgpCiAgICAgICAgbmV4dC5zcGFyc2UgPSBsaXN0KHppcChzcGFyc2VbOjoyXSwgc3BhcnNlWzE6OjJdKSkKCiAgICBkZWYgX2FwcGx5X3BheF9pbmZvKHNlbGYsIHBheF9oZWFkZXJzLCBlbmNvZGluZywgZXJyb3JzKToKICAgICAgICAiIiJSZXBsYWNlIGZpZWxkcyB3aXRoIHN1cHBsZW1lbnRhbCBpbmZvcm1hdGlvbiBmcm9tIGEgcHJldmlvdXMKICAgICAgICAgICBwYXggZXh0ZW5kZWQgb3IgZ2xvYmFsIGhlYWRlci4KICAgICAgICAiIiIKICAgICAgICBmb3Iga2V5d29yZCwgdmFsdWUgaW4gcGF4X2hlYWRlcnMuaXRlbXMoKToKICAgICAgICAgICAgaWYga2V5d29yZCA9PSAiR05VLnNwYXJzZS5uYW1lIjoKICAgICAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgInBhdGgiLCB2YWx1ZSkKICAgICAgICAgICAgZWxpZiBrZXl3b3JkID09ICJHTlUuc3BhcnNlLnNpemUiOgogICAgICAgICAgICAgICAgc2V0YXR0cihzZWxmLCAic2l6ZSIsIGludCh2YWx1ZSkpCiAgICAgICAgICAgIGVsaWYga2V5d29yZCA9PSAiR05VLnNwYXJzZS5yZWFsc2l6ZSI6CiAgICAgICAgICAgICAgICBzZXRhdHRyKHNlbGYsICJzaXplIiwgaW50KHZhbHVlKSkKICAgICAgICAgICAgZWxpZiBrZXl3b3JkIGluIFBBWF9GSUVMRFM6CiAgICAgICAgICAgICAgICBpZiBrZXl3b3JkIGluIFBBWF9OVU1CRVJfRklFTERTOgogICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBQQVhfTlVNQkVSX0ZJRUxEU1trZXl3b3JkXSh2YWx1ZSkKICAgICAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAwCiAgICAgICAgICAgICAgICBpZiBrZXl3b3JkID09ICJwYXRoIjoKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJzdHJpcCgiLyIpCiAgICAgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIGtleXdvcmQsIHZhbHVlKQoKICAgICAgICBzZWxmLnBheF9oZWFkZXJzID0gcGF4X2hlYWRlcnMuY29weSgpCgogICAgZGVmIF9kZWNvZGVfcGF4X2ZpZWxkKHNlbGYsIHZhbHVlLCBlbmNvZGluZywgZmFsbGJhY2tfZW5jb2RpbmcsIGZhbGxiYWNrX2Vycm9ycyk6CiAgICAgICAgIiIiRGVjb2RlIGEgc2luZ2xlIGZpZWxkIGZyb20gYSBwYXggcmVjb3JkLgogICAgICAgICIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmRlY29kZShlbmNvZGluZywgInN0cmljdCIpCiAgICAgICAgZXhjZXB0IFVuaWNvZGVEZWNvZGVFcnJvcjoKICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmRlY29kZShmYWxsYmFja19lbmNvZGluZywgZmFsbGJhY2tfZXJyb3JzKQoKICAgIGRlZiBfYmxvY2soc2VsZiwgY291bnQpOgogICAgICAgICIiIlJvdW5kIHVwIGEgYnl0ZSBjb3VudCBieSBCTE9DS1NJWkUgYW5kIHJldHVybiBpdCwKICAgICAgICAgICBlLmcuIF9ibG9jayg4MzQpID0+IDEwMjQuCiAgICAgICAgIiIiCiAgICAgICAgYmxvY2tzLCByZW1haW5kZXIgPSBkaXZtb2QoY291bnQsIEJMT0NLU0laRSkKICAgICAgICBpZiByZW1haW5kZXI6CiAgICAgICAgICAgIGJsb2NrcyArPSAxCiAgICAgICAgcmV0dXJuIGJsb2NrcyAqIEJMT0NLU0laRQoKICAgIGRlZiBpc3JlZyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi50eXBlIGluIFJFR1VMQVJfVFlQRVMKICAgIGRlZiBpc2ZpbGUoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuaXNyZWcoKQogICAgZGVmIGlzZGlyKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLnR5cGUgPT0gRElSVFlQRQogICAgZGVmIGlzc3ltKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLnR5cGUgPT0gU1lNVFlQRQogICAgZGVmIGlzbG5rKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLnR5cGUgPT0gTE5LVFlQRQogICAgZGVmIGlzY2hyKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLnR5cGUgPT0gQ0hSVFlQRQogICAgZGVmIGlzYmxrKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLnR5cGUgPT0gQkxLVFlQRQogICAgZGVmIGlzZmlmbyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi50eXBlID09IEZJRk9UWVBFCiAgICBkZWYgaXNzcGFyc2Uoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuc3BhcnNlIGlzIG5vdCBOb25lCiAgICBkZWYgaXNkZXYoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYudHlwZSBpbiAoQ0hSVFlQRSwgQkxLVFlQRSwgRklGT1RZUEUpCiMgY2xhc3MgVGFySW5mbwoKY2xhc3MgVGFyRmlsZShvYmplY3QpOgogICAgIiIiVGhlIFRhckZpbGUgQ2xhc3MgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIHRvIHRhciBhcmNoaXZlcy4KICAgICIiIgoKICAgIGRlYnVnID0gMCAgICAgICAgICAgICAgICAgICAjIE1heSBiZSBzZXQgZnJvbSAwIChubyBtc2dzKSB0byAzIChhbGwgbXNncykKCiAgICBkZXJlZmVyZW5jZSA9IEZhbHNlICAgICAgICAgIyBJZiB0cnVlLCBhZGQgY29udGVudCBvZiBsaW5rZWQgZmlsZSB0byB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHRhciBmaWxlLCBlbHNlIHRoZSBsaW5rLgoKICAgIGlnbm9yZV96ZXJvcyA9IEZhbHNlICAgICAgICAjIElmIHRydWUsIHNraXBzIGVtcHR5IG9yIGludmFsaWQgYmxvY2tzIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgY29udGludWVzIHByb2Nlc3NpbmcuCgogICAgZXJyb3JsZXZlbCA9IDEgICAgICAgICAgICAgICMgSWYgMCwgZmF0YWwgZXJyb3JzIG9ubHkgYXBwZWFyIGluIGRlYnVnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBtZXNzYWdlcyAoaWYgZGVidWcgPj0gMCkuIElmID4gMCwgZXJyb3JzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhcmUgcGFzc2VkIHRvIHRoZSBjYWxsZXIgYXMgZXhjZXB0aW9ucy4KCiAgICBmb3JtYXQgPSBERUZBVUxUX0ZPUk1BVCAgICAgIyBUaGUgZm9ybWF0IHRvIHVzZSB3aGVuIGNyZWF0aW5nIGFuIGFyY2hpdmUuCgogICAgZW5jb2RpbmcgPSBFTkNPRElORyAgICAgICAgICMgRW5jb2RpbmcgZm9yIDgtYml0IGNoYXJhY3RlciBzdHJpbmdzLgoKICAgIGVycm9ycyA9IE5vbmUgICAgICAgICAgICAgICAjIEVycm9yIGhhbmRsZXIgZm9yIHVuaWNvZGUgY29udmVyc2lvbi4KCiAgICB0YXJpbmZvID0gVGFySW5mbyAgICAgICAgICAgIyBUaGUgZGVmYXVsdCBUYXJJbmZvIGNsYXNzIHRvIHVzZS4KCiAgICBmaWxlb2JqZWN0ID0gRXhGaWxlT2JqZWN0ICAgIyBUaGUgZGVmYXVsdCBFeEZpbGVPYmplY3QgY2xhc3MgdG8gdXNlLgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lPU5vbmUsIG1vZGU9InIiLCBmaWxlb2JqPU5vbmUsIGZvcm1hdD1Ob25lLAogICAgICAgICAgICB0YXJpbmZvPU5vbmUsIGRlcmVmZXJlbmNlPU5vbmUsIGlnbm9yZV96ZXJvcz1Ob25lLCBlbmNvZGluZz1Ob25lLAogICAgICAgICAgICBlcnJvcnM9InN1cnJvZ2F0ZWVzY2FwZSIsIHBheF9oZWFkZXJzPU5vbmUsIGRlYnVnPU5vbmUsIGVycm9ybGV2ZWw9Tm9uZSk6CiAgICAgICAgIiIiT3BlbiBhbiAodW5jb21wcmVzc2VkKSB0YXIgYXJjaGl2ZSBgbmFtZScuIGBtb2RlJyBpcyBlaXRoZXIgJ3InIHRvCiAgICAgICAgICAgcmVhZCBmcm9tIGFuIGV4aXN0aW5nIGFyY2hpdmUsICdhJyB0byBhcHBlbmQgZGF0YSB0byBhbiBleGlzdGluZwogICAgICAgICAgIGZpbGUgb3IgJ3cnIHRvIGNyZWF0ZSBhIG5ldyBmaWxlIG92ZXJ3cml0aW5nIGFuIGV4aXN0aW5nIG9uZS4gYG1vZGUnCiAgICAgICAgICAgZGVmYXVsdHMgdG8gJ3InLgogICAgICAgICAgIElmIGBmaWxlb2JqJyBpcyBnaXZlbiwgaXQgaXMgdXNlZCBmb3IgcmVhZGluZyBvciB3cml0aW5nIGRhdGEuIElmIGl0CiAgICAgICAgICAgY2FuIGJlIGRldGVybWluZWQsIGBtb2RlJyBpcyBvdmVycmlkZGVuIGJ5IGBmaWxlb2JqJ3MgbW9kZS4KICAgICAgICAgICBgZmlsZW9iaicgaXMgbm90IGNsb3NlZCwgd2hlbiBUYXJGaWxlIGlzIGNsb3NlZC4KICAgICAgICAiIiIKICAgICAgICBpZiBsZW4obW9kZSkgPiAxIG9yIG1vZGUgbm90IGluICJyYXciOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJtb2RlIG11c3QgYmUgJ3InLCAnYScgb3IgJ3cnIikKICAgICAgICBzZWxmLm1vZGUgPSBtb2RlCiAgICAgICAgc2VsZi5fbW9kZSA9IHsiciI6ICJyYiIsICJhIjogInIrYiIsICJ3IjogIndiIn1bbW9kZV0KCiAgICAgICAgaWYgbm90IGZpbGVvYmo6CiAgICAgICAgICAgIGlmIHNlbGYubW9kZSA9PSAiYSIgYW5kIG5vdCBvcy5wYXRoLmV4aXN0cyhuYW1lKToKICAgICAgICAgICAgICAgICMgQ3JlYXRlIG5vbmV4aXN0ZW50IGZpbGVzIGluIGFwcGVuZCBtb2RlLgogICAgICAgICAgICAgICAgc2VsZi5tb2RlID0gInciCiAgICAgICAgICAgICAgICBzZWxmLl9tb2RlID0gIndiIgogICAgICAgICAgICBmaWxlb2JqID0gYmx0bl9vcGVuKG5hbWUsIHNlbGYuX21vZGUpCiAgICAgICAgICAgIHNlbGYuX2V4dGZpbGVvYmogPSBGYWxzZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlmIG5hbWUgaXMgTm9uZSBhbmQgaGFzYXR0cihmaWxlb2JqLCAibmFtZSIpOgogICAgICAgICAgICAgICAgbmFtZSA9IGZpbGVvYmoubmFtZQogICAgICAgICAgICBpZiBoYXNhdHRyKGZpbGVvYmosICJtb2RlIik6CiAgICAgICAgICAgICAgICBzZWxmLl9tb2RlID0gZmlsZW9iai5tb2RlCiAgICAgICAgICAgIHNlbGYuX2V4dGZpbGVvYmogPSBUcnVlCiAgICAgICAgc2VsZi5uYW1lID0gb3MucGF0aC5hYnNwYXRoKG5hbWUpIGlmIG5hbWUgZWxzZSBOb25lCiAgICAgICAgc2VsZi5maWxlb2JqID0gZmlsZW9iagoKICAgICAgICAjIEluaXQgYXR0cmlidXRlcy4KICAgICAgICBpZiBmb3JtYXQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGYuZm9ybWF0ID0gZm9ybWF0CiAgICAgICAgaWYgdGFyaW5mbyBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi50YXJpbmZvID0gdGFyaW5mbwogICAgICAgIGlmIGRlcmVmZXJlbmNlIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLmRlcmVmZXJlbmNlID0gZGVyZWZlcmVuY2UKICAgICAgICBpZiBpZ25vcmVfemVyb3MgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGYuaWdub3JlX3plcm9zID0gaWdub3JlX3plcm9zCiAgICAgICAgaWYgZW5jb2RpbmcgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGYuZW5jb2RpbmcgPSBlbmNvZGluZwogICAgICAgIHNlbGYuZXJyb3JzID0gZXJyb3JzCgogICAgICAgIGlmIHBheF9oZWFkZXJzIGlzIG5vdCBOb25lIGFuZCBzZWxmLmZvcm1hdCA9PSBQQVhfRk9STUFUOgogICAgICAgICAgICBzZWxmLnBheF9oZWFkZXJzID0gcGF4X2hlYWRlcnMKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnBheF9oZWFkZXJzID0ge30KCiAgICAgICAgaWYgZGVidWcgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGYuZGVidWcgPSBkZWJ1ZwogICAgICAgIGlmIGVycm9ybGV2ZWwgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGYuZXJyb3JsZXZlbCA9IGVycm9ybGV2ZWwKCiAgICAgICAgIyBJbml0IGRhdGFzdHJ1Y3R1cmVzLgogICAgICAgIHNlbGYuY2xvc2VkID0gRmFsc2UKICAgICAgICBzZWxmLm1lbWJlcnMgPSBbXSAgICAgICAjIGxpc3Qgb2YgbWVtYmVycyBhcyBUYXJJbmZvIG9iamVjdHMKICAgICAgICBzZWxmLl9sb2FkZWQgPSBGYWxzZSAgICAjIGZsYWcgaWYgYWxsIG1lbWJlcnMgaGF2ZSBiZWVuIHJlYWQKICAgICAgICBzZWxmLm9mZnNldCA9IHNlbGYuZmlsZW9iai50ZWxsKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIGFyY2hpdmUgZmlsZQogICAgICAgIHNlbGYuaW5vZGVzID0ge30gICAgICAgICMgZGljdGlvbmFyeSBjYWNoaW5nIHRoZSBpbm9kZXMgb2YKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFyY2hpdmUgbWVtYmVycyBhbHJlYWR5IGFkZGVkCgogICAgICAgIHRyeToKICAgICAgICAgICAgaWYgc2VsZi5tb2RlID09ICJyIjoKICAgICAgICAgICAgICAgIHNlbGYuZmlyc3RtZW1iZXIgPSBOb25lCiAgICAgICAgICAgICAgICBzZWxmLmZpcnN0bWVtYmVyID0gc2VsZi5uZXh0KCkKCiAgICAgICAgICAgIGlmIHNlbGYubW9kZSA9PSAiYSI6CiAgICAgICAgICAgICAgICAjIE1vdmUgdG8gdGhlIGVuZCBvZiB0aGUgYXJjaGl2ZSwKICAgICAgICAgICAgICAgICMgYmVmb3JlIHRoZSBmaXJzdCBlbXB0eSBibG9jay4KICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5maWxlb2JqLnNlZWsoc2VsZi5vZmZzZXQpCiAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICB0YXJpbmZvID0gc2VsZi50YXJpbmZvLmZyb210YXJmaWxlKHNlbGYpCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubWVtYmVycy5hcHBlbmQodGFyaW5mbykKICAgICAgICAgICAgICAgICAgICBleGNlcHQgRU9GSGVhZGVyRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlsZW9iai5zZWVrKHNlbGYub2Zmc2V0KQogICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBIZWFkZXJFcnJvciBhcyBlOgogICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBSZWFkRXJyb3Ioc3RyKGUpKQoKICAgICAgICAgICAgaWYgc2VsZi5tb2RlIGluICJhdyI6CiAgICAgICAgICAgICAgICBzZWxmLl9sb2FkZWQgPSBUcnVlCgogICAgICAgICAgICAgICAgaWYgc2VsZi5wYXhfaGVhZGVyczoKICAgICAgICAgICAgICAgICAgICBidWYgPSBzZWxmLnRhcmluZm8uY3JlYXRlX3BheF9nbG9iYWxfaGVhZGVyKHNlbGYucGF4X2hlYWRlcnMuY29weSgpKQogICAgICAgICAgICAgICAgICAgIHNlbGYuZmlsZW9iai53cml0ZShidWYpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5vZmZzZXQgKz0gbGVuKGJ1ZikKICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9leHRmaWxlb2JqOgogICAgICAgICAgICAgICAgc2VsZi5maWxlb2JqLmNsb3NlKCkKICAgICAgICAgICAgc2VsZi5jbG9zZWQgPSBUcnVlCiAgICAgICAgICAgIHJhaXNlCgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIEJlbG93IGFyZSB0aGUgY2xhc3NtZXRob2RzIHdoaWNoIGFjdCBhcyBhbHRlcm5hdGUgY29uc3RydWN0b3JzIHRvIHRoZQogICAgIyBUYXJGaWxlIGNsYXNzLiBUaGUgb3BlbigpIG1ldGhvZCBpcyB0aGUgb25seSBvbmUgdGhhdCBpcyBuZWVkZWQgZm9yCiAgICAjIHB1YmxpYyB1c2U7IGl0IGlzIHRoZSAic3VwZXIiLWNvbnN0cnVjdG9yIGFuZCBpcyBhYmxlIHRvIHNlbGVjdCBhbgogICAgIyBhZGVxdWF0ZSAic3ViIi1jb25zdHJ1Y3RvciBmb3IgYSBwYXJ0aWN1bGFyIGNvbXByZXNzaW9uIHVzaW5nIHRoZSBtYXBwaW5nCiAgICAjIGZyb20gT1BFTl9NRVRILgogICAgIwogICAgIyBUaGlzIGNvbmNlcHQgYWxsb3dzIG9uZSB0byBzdWJjbGFzcyBUYXJGaWxlIHdpdGhvdXQgbG9zaW5nIHRoZSBjb21mb3J0IG9mCiAgICAjIHRoZSBzdXBlci1jb25zdHJ1Y3Rvci4gQSBzdWItY29uc3RydWN0b3IgaXMgcmVnaXN0ZXJlZCBhbmQgbWFkZSBhdmFpbGFibGUKICAgICMgYnkgYWRkaW5nIGl0IHRvIHRoZSBtYXBwaW5nIGluIE9QRU5fTUVUSC4KCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBvcGVuKGNscywgbmFtZT1Ob25lLCBtb2RlPSJyIiwgZmlsZW9iaj1Ob25lLCBidWZzaXplPVJFQ09SRFNJWkUsICoqa3dhcmdzKToKICAgICAgICAiIiJPcGVuIGEgdGFyIGFyY2hpdmUgZm9yIHJlYWRpbmcsIHdyaXRpbmcgb3IgYXBwZW5kaW5nLiBSZXR1cm4KICAgICAgICAgICBhbiBhcHByb3ByaWF0ZSBUYXJGaWxlIGNsYXNzLgoKICAgICAgICAgICBtb2RlOgogICAgICAgICAgICdyJyBvciAncjoqJyBvcGVuIGZvciByZWFkaW5nIHdpdGggdHJhbnNwYXJlbnQgY29tcHJlc3Npb24KICAgICAgICAgICAncjonICAgICAgICAgb3BlbiBmb3IgcmVhZGluZyBleGNsdXNpdmVseSB1bmNvbXByZXNzZWQKICAgICAgICAgICAncjpneicgICAgICAgb3BlbiBmb3IgcmVhZGluZyB3aXRoIGd6aXAgY29tcHJlc3Npb24KICAgICAgICAgICAncjpiejInICAgICAgb3BlbiBmb3IgcmVhZGluZyB3aXRoIGJ6aXAyIGNvbXByZXNzaW9uCiAgICAgICAgICAgJ2EnIG9yICdhOicgIG9wZW4gZm9yIGFwcGVuZGluZywgY3JlYXRpbmcgdGhlIGZpbGUgaWYgbmVjZXNzYXJ5CiAgICAgICAgICAgJ3cnIG9yICd3OicgIG9wZW4gZm9yIHdyaXRpbmcgd2l0aG91dCBjb21wcmVzc2lvbgogICAgICAgICAgICd3Omd6JyAgICAgICBvcGVuIGZvciB3cml0aW5nIHdpdGggZ3ppcCBjb21wcmVzc2lvbgogICAgICAgICAgICd3OmJ6MicgICAgICBvcGVuIGZvciB3cml0aW5nIHdpdGggYnppcDIgY29tcHJlc3Npb24KCiAgICAgICAgICAgJ3J8KicgICAgICAgIG9wZW4gYSBzdHJlYW0gb2YgdGFyIGJsb2NrcyB3aXRoIHRyYW5zcGFyZW50IGNvbXByZXNzaW9uCiAgICAgICAgICAgJ3J8JyAgICAgICAgIG9wZW4gYW4gdW5jb21wcmVzc2VkIHN0cmVhbSBvZiB0YXIgYmxvY2tzIGZvciByZWFkaW5nCiAgICAgICAgICAgJ3J8Z3onICAgICAgIG9wZW4gYSBnemlwIGNvbXByZXNzZWQgc3RyZWFtIG9mIHRhciBibG9ja3MKICAgICAgICAgICAncnxiejInICAgICAgb3BlbiBhIGJ6aXAyIGNvbXByZXNzZWQgc3RyZWFtIG9mIHRhciBibG9ja3MKICAgICAgICAgICAnd3wnICAgICAgICAgb3BlbiBhbiB1bmNvbXByZXNzZWQgc3RyZWFtIGZvciB3cml0aW5nCiAgICAgICAgICAgJ3d8Z3onICAgICAgIG9wZW4gYSBnemlwIGNvbXByZXNzZWQgc3RyZWFtIGZvciB3cml0aW5nCiAgICAgICAgICAgJ3d8YnoyJyAgICAgIG9wZW4gYSBiemlwMiBjb21wcmVzc2VkIHN0cmVhbSBmb3Igd3JpdGluZwogICAgICAgICIiIgoKICAgICAgICBpZiBub3QgbmFtZSBhbmQgbm90IGZpbGVvYmo6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm5vdGhpbmcgdG8gb3BlbiIpCgogICAgICAgIGlmIG1vZGUgaW4gKCJyIiwgInI6KiIpOgogICAgICAgICAgICAjIEZpbmQgb3V0IHdoaWNoICpvcGVuKCkgaXMgYXBwcm9wcmlhdGUgZm9yIG9wZW5pbmcgdGhlIGZpbGUuCiAgICAgICAgICAgIGZvciBjb21wdHlwZSBpbiBjbHMuT1BFTl9NRVRIOgogICAgICAgICAgICAgICAgZnVuYyA9IGdldGF0dHIoY2xzLCBjbHMuT1BFTl9NRVRIW2NvbXB0eXBlXSkKICAgICAgICAgICAgICAgIGlmIGZpbGVvYmogaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgc2F2ZWRfcG9zID0gZmlsZW9iai50ZWxsKCkKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuYyhuYW1lLCAiciIsIGZpbGVvYmosICoqa3dhcmdzKQogICAgICAgICAgICAgICAgZXhjZXB0IChSZWFkRXJyb3IsIENvbXByZXNzaW9uRXJyb3IpIGFzIGU6CiAgICAgICAgICAgICAgICAgICAgaWYgZmlsZW9iaiBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW9iai5zZWVrKHNhdmVkX3BvcykKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICByYWlzZSBSZWFkRXJyb3IoImZpbGUgY291bGQgbm90IGJlIG9wZW5lZCBzdWNjZXNzZnVsbHkiKQoKICAgICAgICBlbGlmICI6IiBpbiBtb2RlOgogICAgICAgICAgICBmaWxlbW9kZSwgY29tcHR5cGUgPSBtb2RlLnNwbGl0KCI6IiwgMSkKICAgICAgICAgICAgZmlsZW1vZGUgPSBmaWxlbW9kZSBvciAiciIKICAgICAgICAgICAgY29tcHR5cGUgPSBjb21wdHlwZSBvciAidGFyIgoKICAgICAgICAgICAgIyBTZWxlY3QgdGhlICpvcGVuKCkgZnVuY3Rpb24gYWNjb3JkaW5nIHRvCiAgICAgICAgICAgICMgZ2l2ZW4gY29tcHJlc3Npb24uCiAgICAgICAgICAgIGlmIGNvbXB0eXBlIGluIGNscy5PUEVOX01FVEg6CiAgICAgICAgICAgICAgICBmdW5jID0gZ2V0YXR0cihjbHMsIGNscy5PUEVOX01FVEhbY29tcHR5cGVdKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmFpc2UgQ29tcHJlc3Npb25FcnJvcigidW5rbm93biBjb21wcmVzc2lvbiB0eXBlICVyIiAlIGNvbXB0eXBlKQogICAgICAgICAgICByZXR1cm4gZnVuYyhuYW1lLCBmaWxlbW9kZSwgZmlsZW9iaiwgKiprd2FyZ3MpCgogICAgICAgIGVsaWYgInwiIGluIG1vZGU6CiAgICAgICAgICAgIGZpbGVtb2RlLCBjb21wdHlwZSA9IG1vZGUuc3BsaXQoInwiLCAxKQogICAgICAgICAgICBmaWxlbW9kZSA9IGZpbGVtb2RlIG9yICJyIgogICAgICAgICAgICBjb21wdHlwZSA9IGNvbXB0eXBlIG9yICJ0YXIiCgogICAgICAgICAgICBpZiBmaWxlbW9kZSBub3QgaW4gInJ3IjoKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm1vZGUgbXVzdCBiZSAncicgb3IgJ3cnIikKCiAgICAgICAgICAgIHN0cmVhbSA9IF9TdHJlYW0obmFtZSwgZmlsZW1vZGUsIGNvbXB0eXBlLCBmaWxlb2JqLCBidWZzaXplKQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICB0ID0gY2xzKG5hbWUsIGZpbGVtb2RlLCBzdHJlYW0sICoqa3dhcmdzKQogICAgICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgICAgICBzdHJlYW0uY2xvc2UoKQogICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICAgICAgdC5fZXh0ZmlsZW9iaiA9IEZhbHNlCiAgICAgICAgICAgIHJldHVybiB0CgogICAgICAgIGVsaWYgbW9kZSBpbiAiYXciOgogICAgICAgICAgICByZXR1cm4gY2xzLnRhcm9wZW4obmFtZSwgbW9kZSwgZmlsZW9iaiwgKiprd2FyZ3MpCgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInVuZGlzY2VybmlibGUgbW9kZSIpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgdGFyb3BlbihjbHMsIG5hbWUsIG1vZGU9InIiLCBmaWxlb2JqPU5vbmUsICoqa3dhcmdzKToKICAgICAgICAiIiJPcGVuIHVuY29tcHJlc3NlZCB0YXIgYXJjaGl2ZSBuYW1lIGZvciByZWFkaW5nIG9yIHdyaXRpbmcuCiAgICAgICAgIiIiCiAgICAgICAgaWYgbGVuKG1vZGUpID4gMSBvciBtb2RlIG5vdCBpbiAicmF3IjoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigibW9kZSBtdXN0IGJlICdyJywgJ2EnIG9yICd3JyIpCiAgICAgICAgcmV0dXJuIGNscyhuYW1lLCBtb2RlLCBmaWxlb2JqLCAqKmt3YXJncykKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBnem9wZW4oY2xzLCBuYW1lLCBtb2RlPSJyIiwgZmlsZW9iaj1Ob25lLCBjb21wcmVzc2xldmVsPTksICoqa3dhcmdzKToKICAgICAgICAiIiJPcGVuIGd6aXAgY29tcHJlc3NlZCB0YXIgYXJjaGl2ZSBuYW1lIGZvciByZWFkaW5nIG9yIHdyaXRpbmcuCiAgICAgICAgICAgQXBwZW5kaW5nIGlzIG5vdCBhbGxvd2VkLgogICAgICAgICIiIgogICAgICAgIGlmIGxlbihtb2RlKSA+IDEgb3IgbW9kZSBub3QgaW4gInJ3IjoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigibW9kZSBtdXN0IGJlICdyJyBvciAndyciKQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGltcG9ydCBnemlwCiAgICAgICAgICAgIGd6aXAuR3ppcEZpbGUKICAgICAgICBleGNlcHQgKEltcG9ydEVycm9yLCBBdHRyaWJ1dGVFcnJvcik6CiAgICAgICAgICAgIHJhaXNlIENvbXByZXNzaW9uRXJyb3IoImd6aXAgbW9kdWxlIGlzIG5vdCBhdmFpbGFibGUiKQoKICAgICAgICBleHRmaWxlb2JqID0gZmlsZW9iaiBpcyBub3QgTm9uZQogICAgICAgIHRyeToKICAgICAgICAgICAgZmlsZW9iaiA9IGd6aXAuR3ppcEZpbGUobmFtZSwgbW9kZSArICJiIiwgY29tcHJlc3NsZXZlbCwgZmlsZW9iaikKICAgICAgICAgICAgdCA9IGNscy50YXJvcGVuKG5hbWUsIG1vZGUsIGZpbGVvYmosICoqa3dhcmdzKQogICAgICAgIGV4Y2VwdCBJT0Vycm9yOgogICAgICAgICAgICBpZiBub3QgZXh0ZmlsZW9iaiBhbmQgZmlsZW9iaiBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIGZpbGVvYmouY2xvc2UoKQogICAgICAgICAgICBpZiBmaWxlb2JqIGlzIE5vbmU6CiAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICAgICByYWlzZSBSZWFkRXJyb3IoIm5vdCBhIGd6aXAgZmlsZSIpCiAgICAgICAgZXhjZXB0OgogICAgICAgICAgICBpZiBub3QgZXh0ZmlsZW9iaiBhbmQgZmlsZW9iaiBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIGZpbGVvYmouY2xvc2UoKQogICAgICAgICAgICByYWlzZQogICAgICAgIHQuX2V4dGZpbGVvYmogPSBleHRmaWxlb2JqCiAgICAgICAgcmV0dXJuIHQKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBiejJvcGVuKGNscywgbmFtZSwgbW9kZT0iciIsIGZpbGVvYmo9Tm9uZSwgY29tcHJlc3NsZXZlbD05LCAqKmt3YXJncyk6CiAgICAgICAgIiIiT3BlbiBiemlwMiBjb21wcmVzc2VkIHRhciBhcmNoaXZlIG5hbWUgZm9yIHJlYWRpbmcgb3Igd3JpdGluZy4KICAgICAgICAgICBBcHBlbmRpbmcgaXMgbm90IGFsbG93ZWQuCiAgICAgICAgIiIiCiAgICAgICAgaWYgbGVuKG1vZGUpID4gMSBvciBtb2RlIG5vdCBpbiAicnciOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJtb2RlIG11c3QgYmUgJ3InIG9yICd3Jy4iKQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGltcG9ydCBiejIKICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgICAgIHJhaXNlIENvbXByZXNzaW9uRXJyb3IoImJ6MiBtb2R1bGUgaXMgbm90IGF2YWlsYWJsZSIpCgogICAgICAgIGlmIGZpbGVvYmogaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGZpbGVvYmogPSBfQloyUHJveHkoZmlsZW9iaiwgbW9kZSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBmaWxlb2JqID0gYnoyLkJaMkZpbGUobmFtZSwgbW9kZSwgY29tcHJlc3NsZXZlbD1jb21wcmVzc2xldmVsKQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHQgPSBjbHMudGFyb3BlbihuYW1lLCBtb2RlLCBmaWxlb2JqLCAqKmt3YXJncykKICAgICAgICBleGNlcHQgKElPRXJyb3IsIEVPRkVycm9yKToKICAgICAgICAgICAgZmlsZW9iai5jbG9zZSgpCiAgICAgICAgICAgIHJhaXNlIFJlYWRFcnJvcigibm90IGEgYnppcDIgZmlsZSIpCiAgICAgICAgdC5fZXh0ZmlsZW9iaiA9IEZhbHNlCiAgICAgICAgcmV0dXJuIHQKCiAgICAjIEFsbCAqb3BlbigpIG1ldGhvZHMgYXJlIHJlZ2lzdGVyZWQgaGVyZS4KICAgIE9QRU5fTUVUSCA9IHsKICAgICAgICAidGFyIjogInRhcm9wZW4iLCAgICMgdW5jb21wcmVzc2VkIHRhcgogICAgICAgICJneiI6ICAiZ3pvcGVuIiwgICAgIyBnemlwIGNvbXByZXNzZWQgdGFyCiAgICAgICAgImJ6MiI6ICJiejJvcGVuIiAgICAjIGJ6aXAyIGNvbXByZXNzZWQgdGFyCiAgICB9CgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIFRoZSBwdWJsaWMgbWV0aG9kcyB3aGljaCBUYXJGaWxlIHByb3ZpZGVzOgoKICAgIGRlZiBjbG9zZShzZWxmKToKICAgICAgICAiIiJDbG9zZSB0aGUgVGFyRmlsZS4gSW4gd3JpdGUtbW9kZSwgdHdvIGZpbmlzaGluZyB6ZXJvIGJsb2NrcyBhcmUKICAgICAgICAgICBhcHBlbmRlZCB0byB0aGUgYXJjaGl2ZS4KICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLmNsb3NlZDoKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGlmIHNlbGYubW9kZSBpbiAiYXciOgogICAgICAgICAgICBzZWxmLmZpbGVvYmoud3JpdGUoTlVMICogKEJMT0NLU0laRSAqIDIpKQogICAgICAgICAgICBzZWxmLm9mZnNldCArPSAoQkxPQ0tTSVpFICogMikKICAgICAgICAgICAgIyBmaWxsIHVwIHRoZSBlbmQgd2l0aCB6ZXJvLWJsb2NrcwogICAgICAgICAgICAjIChsaWtlIG9wdGlvbiAtYjIwIGZvciB0YXIgZG9lcykKICAgICAgICAgICAgYmxvY2tzLCByZW1haW5kZXIgPSBkaXZtb2Qoc2VsZi5vZmZzZXQsIFJFQ09SRFNJWkUpCiAgICAgICAgICAgIGlmIHJlbWFpbmRlciA+IDA6CiAgICAgICAgICAgICAgICBzZWxmLmZpbGVvYmoud3JpdGUoTlVMICogKFJFQ09SRFNJWkUgLSByZW1haW5kZXIpKQoKICAgICAgICBpZiBub3Qgc2VsZi5fZXh0ZmlsZW9iajoKICAgICAgICAgICAgc2VsZi5maWxlb2JqLmNsb3NlKCkKICAgICAgICBzZWxmLmNsb3NlZCA9IFRydWUKCiAgICBkZWYgZ2V0bWVtYmVyKHNlbGYsIG5hbWUpOgogICAgICAgICIiIlJldHVybiBhIFRhckluZm8gb2JqZWN0IGZvciBtZW1iZXIgYG5hbWUnLiBJZiBgbmFtZScgY2FuIG5vdCBiZQogICAgICAgICAgIGZvdW5kIGluIHRoZSBhcmNoaXZlLCBLZXlFcnJvciBpcyByYWlzZWQuIElmIGEgbWVtYmVyIG9jY3VycyBtb3JlCiAgICAgICAgICAgdGhhbiBvbmNlIGluIHRoZSBhcmNoaXZlLCBpdHMgbGFzdCBvY2N1cnJlbmNlIGlzIGFzc3VtZWQgdG8gYmUgdGhlCiAgICAgICAgICAgbW9zdCB1cC10by1kYXRlIHZlcnNpb24uCiAgICAgICAgIiIiCiAgICAgICAgdGFyaW5mbyA9IHNlbGYuX2dldG1lbWJlcihuYW1lKQogICAgICAgIGlmIHRhcmluZm8gaXMgTm9uZToKICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IoImZpbGVuYW1lICVyIG5vdCBmb3VuZCIgJSBuYW1lKQogICAgICAgIHJldHVybiB0YXJpbmZvCgogICAgZGVmIGdldG1lbWJlcnMoc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIHRoZSBtZW1iZXJzIG9mIHRoZSBhcmNoaXZlIGFzIGEgbGlzdCBvZiBUYXJJbmZvIG9iamVjdHMuIFRoZQogICAgICAgICAgIGxpc3QgaGFzIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBtZW1iZXJzIGluIHRoZSBhcmNoaXZlLgogICAgICAgICIiIgogICAgICAgIHNlbGYuX2NoZWNrKCkKICAgICAgICBpZiBub3Qgc2VsZi5fbG9hZGVkOiAgICAjIGlmIHdlIHdhbnQgdG8gb2J0YWluIGEgbGlzdCBvZgogICAgICAgICAgICBzZWxmLl9sb2FkKCkgICAgICAgICMgYWxsIG1lbWJlcnMsIHdlIGZpcnN0IGhhdmUgdG8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNjYW4gdGhlIHdob2xlIGFyY2hpdmUuCiAgICAgICAgcmV0dXJuIHNlbGYubWVtYmVycwoKICAgIGRlZiBnZXRuYW1lcyhzZWxmKToKICAgICAgICAiIiJSZXR1cm4gdGhlIG1lbWJlcnMgb2YgdGhlIGFyY2hpdmUgYXMgYSBsaXN0IG9mIHRoZWlyIG5hbWVzLiBJdCBoYXMKICAgICAgICAgICB0aGUgc2FtZSBvcmRlciBhcyB0aGUgbGlzdCByZXR1cm5lZCBieSBnZXRtZW1iZXJzKCkuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIFt0YXJpbmZvLm5hbWUgZm9yIHRhcmluZm8gaW4gc2VsZi5nZXRtZW1iZXJzKCldCgogICAgZGVmIGdldHRhcmluZm8oc2VsZiwgbmFtZT1Ob25lLCBhcmNuYW1lPU5vbmUsIGZpbGVvYmo9Tm9uZSk6CiAgICAgICAgIiIiQ3JlYXRlIGEgVGFySW5mbyBvYmplY3QgZm9yIGVpdGhlciB0aGUgZmlsZSBgbmFtZScgb3IgdGhlIGZpbGUKICAgICAgICAgICBvYmplY3QgYGZpbGVvYmonICh1c2luZyBvcy5mc3RhdCBvbiBpdHMgZmlsZSBkZXNjcmlwdG9yKS4gWW91IGNhbgogICAgICAgICAgIG1vZGlmeSBzb21lIG9mIHRoZSBUYXJJbmZvJ3MgYXR0cmlidXRlcyBiZWZvcmUgeW91IGFkZCBpdCB1c2luZwogICAgICAgICAgIGFkZGZpbGUoKS4gSWYgZ2l2ZW4sIGBhcmNuYW1lJyBzcGVjaWZpZXMgYW4gYWx0ZXJuYXRpdmUgbmFtZSBmb3IgdGhlCiAgICAgICAgICAgZmlsZSBpbiB0aGUgYXJjaGl2ZS4KICAgICAgICAiIiIKICAgICAgICBzZWxmLl9jaGVjaygiYXciKQoKICAgICAgICAjIFdoZW4gZmlsZW9iaiBpcyBnaXZlbiwgcmVwbGFjZSBuYW1lIGJ5CiAgICAgICAgIyBmaWxlb2JqJ3MgcmVhbCBuYW1lLgogICAgICAgIGlmIGZpbGVvYmogaXMgbm90IE5vbmU6CiAgICAgICAgICAgIG5hbWUgPSBmaWxlb2JqLm5hbWUKCiAgICAgICAgIyBCdWlsZGluZyB0aGUgbmFtZSBvZiB0aGUgbWVtYmVyIGluIHRoZSBhcmNoaXZlLgogICAgICAgICMgQmFja3dhcmQgc2xhc2hlcyBhcmUgY29udmVydGVkIHRvIGZvcndhcmQgc2xhc2hlcywKICAgICAgICAjIEFic29sdXRlIHBhdGhzIGFyZSB0dXJuZWQgdG8gcmVsYXRpdmUgcGF0aHMuCiAgICAgICAgaWYgYXJjbmFtZSBpcyBOb25lOgogICAgICAgICAgICBhcmNuYW1lID0gbmFtZQogICAgICAgIGRydiwgYXJjbmFtZSA9IG9zLnBhdGguc3BsaXRkcml2ZShhcmNuYW1lKQogICAgICAgIGFyY25hbWUgPSBhcmNuYW1lLnJlcGxhY2Uob3Muc2VwLCAiLyIpCiAgICAgICAgYXJjbmFtZSA9IGFyY25hbWUubHN0cmlwKCIvIikKCiAgICAgICAgIyBOb3csIGZpbGwgdGhlIFRhckluZm8gb2JqZWN0IHdpdGgKICAgICAgICAjIGluZm9ybWF0aW9uIHNwZWNpZmljIGZvciB0aGUgZmlsZS4KICAgICAgICB0YXJpbmZvID0gc2VsZi50YXJpbmZvKCkKICAgICAgICB0YXJpbmZvLnRhcmZpbGUgPSBzZWxmCgogICAgICAgICMgVXNlIG9zLnN0YXQgb3Igb3MubHN0YXQsIGRlcGVuZGluZyBvbiBwbGF0Zm9ybQogICAgICAgICMgYW5kIGlmIHN5bWxpbmtzIHNoYWxsIGJlIHJlc29sdmVkLgogICAgICAgIGlmIGZpbGVvYmogaXMgTm9uZToKICAgICAgICAgICAgaWYgaGFzYXR0cihvcywgImxzdGF0IikgYW5kIG5vdCBzZWxmLmRlcmVmZXJlbmNlOgogICAgICAgICAgICAgICAgc3RhdHJlcyA9IG9zLmxzdGF0KG5hbWUpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzdGF0cmVzID0gb3Muc3RhdChuYW1lKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHN0YXRyZXMgPSBvcy5mc3RhdChmaWxlb2JqLmZpbGVubygpKQogICAgICAgIGxpbmtuYW1lID0gIiIKCiAgICAgICAgc3RtZCA9IHN0YXRyZXMuc3RfbW9kZQogICAgICAgIGlmIHN0YXQuU19JU1JFRyhzdG1kKToKICAgICAgICAgICAgaW5vZGUgPSAoc3RhdHJlcy5zdF9pbm8sIHN0YXRyZXMuc3RfZGV2KQogICAgICAgICAgICBpZiBub3Qgc2VsZi5kZXJlZmVyZW5jZSBhbmQgc3RhdHJlcy5zdF9ubGluayA+IDEgYW5kIFwKICAgICAgICAgICAgICAgICAgICBpbm9kZSBpbiBzZWxmLmlub2RlcyBhbmQgYXJjbmFtZSAhPSBzZWxmLmlub2Rlc1tpbm9kZV06CiAgICAgICAgICAgICAgICAjIElzIGl0IGEgaGFyZGxpbmsgdG8gYW4gYWxyZWFkeQogICAgICAgICAgICAgICAgIyBhcmNoaXZlZCBmaWxlPwogICAgICAgICAgICAgICAgdHlwZSA9IExOS1RZUEUKICAgICAgICAgICAgICAgIGxpbmtuYW1lID0gc2VsZi5pbm9kZXNbaW5vZGVdCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIFRoZSBpbm9kZSBpcyBhZGRlZCBvbmx5IGlmIGl0cyB2YWxpZC4KICAgICAgICAgICAgICAgICMgRm9yIHdpbjMyIGl0IGlzIGFsd2F5cyAwLgogICAgICAgICAgICAgICAgdHlwZSA9IFJFR1RZUEUKICAgICAgICAgICAgICAgIGlmIGlub2RlWzBdOgogICAgICAgICAgICAgICAgICAgIHNlbGYuaW5vZGVzW2lub2RlXSA9IGFyY25hbWUKICAgICAgICBlbGlmIHN0YXQuU19JU0RJUihzdG1kKToKICAgICAgICAgICAgdHlwZSA9IERJUlRZUEUKICAgICAgICBlbGlmIHN0YXQuU19JU0ZJRk8oc3RtZCk6CiAgICAgICAgICAgIHR5cGUgPSBGSUZPVFlQRQogICAgICAgIGVsaWYgc3RhdC5TX0lTTE5LKHN0bWQpOgogICAgICAgICAgICB0eXBlID0gU1lNVFlQRQogICAgICAgICAgICBsaW5rbmFtZSA9IG9zLnJlYWRsaW5rKG5hbWUpCiAgICAgICAgZWxpZiBzdGF0LlNfSVNDSFIoc3RtZCk6CiAgICAgICAgICAgIHR5cGUgPSBDSFJUWVBFCiAgICAgICAgZWxpZiBzdGF0LlNfSVNCTEsoc3RtZCk6CiAgICAgICAgICAgIHR5cGUgPSBCTEtUWVBFCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgIyBGaWxsIHRoZSBUYXJJbmZvIG9iamVjdCB3aXRoIGFsbAogICAgICAgICMgaW5mb3JtYXRpb24gd2UgY2FuIGdldC4KICAgICAgICB0YXJpbmZvLm5hbWUgPSBhcmNuYW1lCiAgICAgICAgdGFyaW5mby5tb2RlID0gc3RtZAogICAgICAgIHRhcmluZm8udWlkID0gc3RhdHJlcy5zdF91aWQKICAgICAgICB0YXJpbmZvLmdpZCA9IHN0YXRyZXMuc3RfZ2lkCiAgICAgICAgaWYgdHlwZSA9PSBSRUdUWVBFOgogICAgICAgICAgICB0YXJpbmZvLnNpemUgPSBzdGF0cmVzLnN0X3NpemUKICAgICAgICBlbHNlOgogICAgICAgICAgICB0YXJpbmZvLnNpemUgPSAwCiAgICAgICAgdGFyaW5mby5tdGltZSA9IHN0YXRyZXMuc3RfbXRpbWUKICAgICAgICB0YXJpbmZvLnR5cGUgPSB0eXBlCiAgICAgICAgdGFyaW5mby5saW5rbmFtZSA9IGxpbmtuYW1lCiAgICAgICAgaWYgcHdkOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICB0YXJpbmZvLnVuYW1lID0gcHdkLmdldHB3dWlkKHRhcmluZm8udWlkKVswXQogICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgaWYgZ3JwOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICB0YXJpbmZvLmduYW1lID0gZ3JwLmdldGdyZ2lkKHRhcmluZm8uZ2lkKVswXQogICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgICAgICBwYXNzCgogICAgICAgIGlmIHR5cGUgaW4gKENIUlRZUEUsIEJMS1RZUEUpOgogICAgICAgICAgICBpZiBoYXNhdHRyKG9zLCAibWFqb3IiKSBhbmQgaGFzYXR0cihvcywgIm1pbm9yIik6CiAgICAgICAgICAgICAgICB0YXJpbmZvLmRldm1ham9yID0gb3MubWFqb3Ioc3RhdHJlcy5zdF9yZGV2KQogICAgICAgICAgICAgICAgdGFyaW5mby5kZXZtaW5vciA9IG9zLm1pbm9yKHN0YXRyZXMuc3RfcmRldikKICAgICAgICByZXR1cm4gdGFyaW5mbwoKICAgIGRlZiBsaXN0KHNlbGYsIHZlcmJvc2U9VHJ1ZSk6CiAgICAgICAgIiIiUHJpbnQgYSB0YWJsZSBvZiBjb250ZW50cyB0byBzeXMuc3Rkb3V0LiBJZiBgdmVyYm9zZScgaXMgRmFsc2UsIG9ubHkKICAgICAgICAgICB0aGUgbmFtZXMgb2YgdGhlIG1lbWJlcnMgYXJlIHByaW50ZWQuIElmIGl0IGlzIFRydWUsIGFuIGBscyAtbCctbGlrZQogICAgICAgICAgIG91dHB1dCBpcyBwcm9kdWNlZC4KICAgICAgICAiIiIKICAgICAgICBzZWxmLl9jaGVjaygpCgogICAgICAgIGZvciB0YXJpbmZvIGluIHNlbGY6CiAgICAgICAgICAgIGlmIHZlcmJvc2U6CiAgICAgICAgICAgICAgICBwcmludChmaWxlbW9kZSh0YXJpbmZvLm1vZGUpLCBlbmQ9JyAnKQogICAgICAgICAgICAgICAgcHJpbnQoIiVzLyVzIiAlICh0YXJpbmZvLnVuYW1lIG9yIHRhcmluZm8udWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJpbmZvLmduYW1lIG9yIHRhcmluZm8uZ2lkKSwgZW5kPScgJykKICAgICAgICAgICAgICAgIGlmIHRhcmluZm8uaXNjaHIoKSBvciB0YXJpbmZvLmlzYmxrKCk6CiAgICAgICAgICAgICAgICAgICAgcHJpbnQoIiUxMHMiICUgKCIlZCwlZCIgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlICh0YXJpbmZvLmRldm1ham9yLCB0YXJpbmZvLmRldm1pbm9yKSksIGVuZD0nICcpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHByaW50KCIlMTBkIiAlIHRhcmluZm8uc2l6ZSwgZW5kPScgJykKICAgICAgICAgICAgICAgIHByaW50KCIlZC0lMDJkLSUwMmQgJTAyZDolMDJkOiUwMmQiIFwKICAgICAgICAgICAgICAgICAgICAgICUgdGltZS5sb2NhbHRpbWUodGFyaW5mby5tdGltZSlbOjZdLCBlbmQ9JyAnKQoKICAgICAgICAgICAgcHJpbnQodGFyaW5mby5uYW1lICsgKCIvIiBpZiB0YXJpbmZvLmlzZGlyKCkgZWxzZSAiIiksIGVuZD0nICcpCgogICAgICAgICAgICBpZiB2ZXJib3NlOgogICAgICAgICAgICAgICAgaWYgdGFyaW5mby5pc3N5bSgpOgogICAgICAgICAgICAgICAgICAgIHByaW50KCItPiIsIHRhcmluZm8ubGlua25hbWUsIGVuZD0nICcpCiAgICAgICAgICAgICAgICBpZiB0YXJpbmZvLmlzbG5rKCk6CiAgICAgICAgICAgICAgICAgICAgcHJpbnQoImxpbmsgdG8iLCB0YXJpbmZvLmxpbmtuYW1lLCBlbmQ9JyAnKQogICAgICAgICAgICBwcmludCgpCgogICAgZGVmIGFkZChzZWxmLCBuYW1lLCBhcmNuYW1lPU5vbmUsIHJlY3Vyc2l2ZT1UcnVlLCBleGNsdWRlPU5vbmUsIGZpbHRlcj1Ob25lKToKICAgICAgICAiIiJBZGQgdGhlIGZpbGUgYG5hbWUnIHRvIHRoZSBhcmNoaXZlLiBgbmFtZScgbWF5IGJlIGFueSB0eXBlIG9mIGZpbGUKICAgICAgICAgICAoZGlyZWN0b3J5LCBmaWZvLCBzeW1ib2xpYyBsaW5rLCBldGMuKS4gSWYgZ2l2ZW4sIGBhcmNuYW1lJwogICAgICAgICAgIHNwZWNpZmllcyBhbiBhbHRlcm5hdGl2ZSBuYW1lIGZvciB0aGUgZmlsZSBpbiB0aGUgYXJjaGl2ZS4KICAgICAgICAgICBEaXJlY3RvcmllcyBhcmUgYWRkZWQgcmVjdXJzaXZlbHkgYnkgZGVmYXVsdC4gVGhpcyBjYW4gYmUgYXZvaWRlZCBieQogICAgICAgICAgIHNldHRpbmcgYHJlY3Vyc2l2ZScgdG8gRmFsc2UuIGBleGNsdWRlJyBpcyBhIGZ1bmN0aW9uIHRoYXQgc2hvdWxkCiAgICAgICAgICAgcmV0dXJuIFRydWUgZm9yIGVhY2ggZmlsZW5hbWUgdG8gYmUgZXhjbHVkZWQuIGBmaWx0ZXInIGlzIGEgZnVuY3Rpb24KICAgICAgICAgICB0aGF0IGV4cGVjdHMgYSBUYXJJbmZvIG9iamVjdCBhcmd1bWVudCBhbmQgcmV0dXJucyB0aGUgY2hhbmdlZAogICAgICAgICAgIFRhckluZm8gb2JqZWN0LCBpZiBpdCByZXR1cm5zIE5vbmUgdGhlIFRhckluZm8gb2JqZWN0IHdpbGwgYmUKICAgICAgICAgICBleGNsdWRlZCBmcm9tIHRoZSBhcmNoaXZlLgogICAgICAgICIiIgogICAgICAgIHNlbGYuX2NoZWNrKCJhdyIpCgogICAgICAgIGlmIGFyY25hbWUgaXMgTm9uZToKICAgICAgICAgICAgYXJjbmFtZSA9IG5hbWUKCiAgICAgICAgIyBFeGNsdWRlIHBhdGhuYW1lcy4KICAgICAgICBpZiBleGNsdWRlIGlzIG5vdCBOb25lOgogICAgICAgICAgICBpbXBvcnQgd2FybmluZ3MKICAgICAgICAgICAgd2FybmluZ3Mud2FybigidXNlIHRoZSBmaWx0ZXIgYXJndW1lbnQgaW5zdGVhZCIsCiAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCAyKQogICAgICAgICAgICBpZiBleGNsdWRlKG5hbWUpOgogICAgICAgICAgICAgICAgc2VsZi5fZGJnKDIsICJ0YXJmaWxlOiBFeGNsdWRlZCAlciIgJSBuYW1lKQogICAgICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICMgU2tpcCBpZiBzb21lYm9keSB0cmllcyB0byBhcmNoaXZlIHRoZSBhcmNoaXZlLi4uCiAgICAgICAgaWYgc2VsZi5uYW1lIGlzIG5vdCBOb25lIGFuZCBvcy5wYXRoLmFic3BhdGgobmFtZSkgPT0gc2VsZi5uYW1lOgogICAgICAgICAgICBzZWxmLl9kYmcoMiwgInRhcmZpbGU6IFNraXBwZWQgJXIiICUgbmFtZSkKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIHNlbGYuX2RiZygxLCBuYW1lKQoKICAgICAgICAjIENyZWF0ZSBhIFRhckluZm8gb2JqZWN0IGZyb20gdGhlIGZpbGUuCiAgICAgICAgdGFyaW5mbyA9IHNlbGYuZ2V0dGFyaW5mbyhuYW1lLCBhcmNuYW1lKQoKICAgICAgICBpZiB0YXJpbmZvIGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYuX2RiZygxLCAidGFyZmlsZTogVW5zdXBwb3J0ZWQgdHlwZSAlciIgJSBuYW1lKQogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgIyBDaGFuZ2Ugb3IgZXhjbHVkZSB0aGUgVGFySW5mbyBvYmplY3QuCiAgICAgICAgaWYgZmlsdGVyIGlzIG5vdCBOb25lOgogICAgICAgICAgICB0YXJpbmZvID0gZmlsdGVyKHRhcmluZm8pCiAgICAgICAgICAgIGlmIHRhcmluZm8gaXMgTm9uZToKICAgICAgICAgICAgICAgIHNlbGYuX2RiZygyLCAidGFyZmlsZTogRXhjbHVkZWQgJXIiICUgbmFtZSkKICAgICAgICAgICAgICAgIHJldHVybgoKICAgICAgICAjIEFwcGVuZCB0aGUgdGFyIGhlYWRlciBhbmQgZGF0YSB0byB0aGUgYXJjaGl2ZS4KICAgICAgICBpZiB0YXJpbmZvLmlzcmVnKCk6CiAgICAgICAgICAgIGYgPSBibHRuX29wZW4obmFtZSwgInJiIikKICAgICAgICAgICAgc2VsZi5hZGRmaWxlKHRhcmluZm8sIGYpCiAgICAgICAgICAgIGYuY2xvc2UoKQoKICAgICAgICBlbGlmIHRhcmluZm8uaXNkaXIoKToKICAgICAgICAgICAgc2VsZi5hZGRmaWxlKHRhcmluZm8pCiAgICAgICAgICAgIGlmIHJlY3Vyc2l2ZToKICAgICAgICAgICAgICAgIGZvciBmIGluIG9zLmxpc3RkaXIobmFtZSk6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGQob3MucGF0aC5qb2luKG5hbWUsIGYpLCBvcy5wYXRoLmpvaW4oYXJjbmFtZSwgZiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN1cnNpdmUsIGV4Y2x1ZGUsIGZpbHRlcj1maWx0ZXIpCgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuYWRkZmlsZSh0YXJpbmZvKQoKICAgIGRlZiBhZGRmaWxlKHNlbGYsIHRhcmluZm8sIGZpbGVvYmo9Tm9uZSk6CiAgICAgICAgIiIiQWRkIHRoZSBUYXJJbmZvIG9iamVjdCBgdGFyaW5mbycgdG8gdGhlIGFyY2hpdmUuIElmIGBmaWxlb2JqJyBpcwogICAgICAgICAgIGdpdmVuLCB0YXJpbmZvLnNpemUgYnl0ZXMgYXJlIHJlYWQgZnJvbSBpdCBhbmQgYWRkZWQgdG8gdGhlIGFyY2hpdmUuCiAgICAgICAgICAgWW91IGNhbiBjcmVhdGUgVGFySW5mbyBvYmplY3RzIHVzaW5nIGdldHRhcmluZm8oKS4KICAgICAgICAgICBPbiBXaW5kb3dzIHBsYXRmb3JtcywgYGZpbGVvYmonIHNob3VsZCBhbHdheXMgYmUgb3BlbmVkIHdpdGggbW9kZQogICAgICAgICAgICdyYicgdG8gYXZvaWQgaXJyaXRhdGlvbiBhYm91dCB0aGUgZmlsZSBzaXplLgogICAgICAgICIiIgogICAgICAgIHNlbGYuX2NoZWNrKCJhdyIpCgogICAgICAgIHRhcmluZm8gPSBjb3B5LmNvcHkodGFyaW5mbykKCiAgICAgICAgYnVmID0gdGFyaW5mby50b2J1ZihzZWxmLmZvcm1hdCwgc2VsZi5lbmNvZGluZywgc2VsZi5lcnJvcnMpCiAgICAgICAgc2VsZi5maWxlb2JqLndyaXRlKGJ1ZikKICAgICAgICBzZWxmLm9mZnNldCArPSBsZW4oYnVmKQoKICAgICAgICAjIElmIHRoZXJlJ3MgZGF0YSB0byBmb2xsb3csIGFwcGVuZCBpdC4KICAgICAgICBpZiBmaWxlb2JqIGlzIG5vdCBOb25lOgogICAgICAgICAgICBjb3B5ZmlsZW9iaihmaWxlb2JqLCBzZWxmLmZpbGVvYmosIHRhcmluZm8uc2l6ZSkKICAgICAgICAgICAgYmxvY2tzLCByZW1haW5kZXIgPSBkaXZtb2QodGFyaW5mby5zaXplLCBCTE9DS1NJWkUpCiAgICAgICAgICAgIGlmIHJlbWFpbmRlciA+IDA6CiAgICAgICAgICAgICAgICBzZWxmLmZpbGVvYmoud3JpdGUoTlVMICogKEJMT0NLU0laRSAtIHJlbWFpbmRlcikpCiAgICAgICAgICAgICAgICBibG9ja3MgKz0gMQogICAgICAgICAgICBzZWxmLm9mZnNldCArPSBibG9ja3MgKiBCTE9DS1NJWkUKCiAgICAgICAgc2VsZi5tZW1iZXJzLmFwcGVuZCh0YXJpbmZvKQoKICAgIGRlZiBleHRyYWN0YWxsKHNlbGYsIHBhdGg9Ii4iLCBtZW1iZXJzPU5vbmUpOgogICAgICAgICIiIkV4dHJhY3QgYWxsIG1lbWJlcnMgZnJvbSB0aGUgYXJjaGl2ZSB0byB0aGUgY3VycmVudCB3b3JraW5nCiAgICAgICAgICAgZGlyZWN0b3J5IGFuZCBzZXQgb3duZXIsIG1vZGlmaWNhdGlvbiB0aW1lIGFuZCBwZXJtaXNzaW9ucyBvbgogICAgICAgICAgIGRpcmVjdG9yaWVzIGFmdGVyd2FyZHMuIGBwYXRoJyBzcGVjaWZpZXMgYSBkaWZmZXJlbnQgZGlyZWN0b3J5CiAgICAgICAgICAgdG8gZXh0cmFjdCB0by4gYG1lbWJlcnMnIGlzIG9wdGlvbmFsIGFuZCBtdXN0IGJlIGEgc3Vic2V0IG9mIHRoZQogICAgICAgICAgIGxpc3QgcmV0dXJuZWQgYnkgZ2V0bWVtYmVycygpLgogICAgICAgICIiIgogICAgICAgIGRpcmVjdG9yaWVzID0gW10KCiAgICAgICAgaWYgbWVtYmVycyBpcyBOb25lOgogICAgICAgICAgICBtZW1iZXJzID0gc2VsZgoKICAgICAgICBmb3IgdGFyaW5mbyBpbiBtZW1iZXJzOgogICAgICAgICAgICBpZiB0YXJpbmZvLmlzZGlyKCk6CiAgICAgICAgICAgICAgICAjIEV4dHJhY3QgZGlyZWN0b3JpZXMgd2l0aCBhIHNhZmUgbW9kZS4KICAgICAgICAgICAgICAgIGRpcmVjdG9yaWVzLmFwcGVuZCh0YXJpbmZvKQogICAgICAgICAgICAgICAgdGFyaW5mbyA9IGNvcHkuY29weSh0YXJpbmZvKQogICAgICAgICAgICAgICAgdGFyaW5mby5tb2RlID0gMG83MDAKICAgICAgICAgICAgIyBEbyBub3Qgc2V0X2F0dHJzIGRpcmVjdG9yaWVzLCBhcyB3ZSB3aWxsIGRvIHRoYXQgZnVydGhlciBkb3duCiAgICAgICAgICAgIHNlbGYuZXh0cmFjdCh0YXJpbmZvLCBwYXRoLCBzZXRfYXR0cnM9bm90IHRhcmluZm8uaXNkaXIoKSkKCiAgICAgICAgIyBSZXZlcnNlIHNvcnQgZGlyZWN0b3JpZXMuCiAgICAgICAgZGlyZWN0b3JpZXMuc29ydChrZXk9bGFtYmRhIGE6IGEubmFtZSkKICAgICAgICBkaXJlY3Rvcmllcy5yZXZlcnNlKCkKCiAgICAgICAgIyBTZXQgY29ycmVjdCBvd25lciwgbXRpbWUgYW5kIGZpbGVtb2RlIG9uIGRpcmVjdG9yaWVzLgogICAgICAgIGZvciB0YXJpbmZvIGluIGRpcmVjdG9yaWVzOgogICAgICAgICAgICBkaXJwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIHRhcmluZm8ubmFtZSkKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgc2VsZi5jaG93bih0YXJpbmZvLCBkaXJwYXRoKQogICAgICAgICAgICAgICAgc2VsZi51dGltZSh0YXJpbmZvLCBkaXJwYXRoKQogICAgICAgICAgICAgICAgc2VsZi5jaG1vZCh0YXJpbmZvLCBkaXJwYXRoKQogICAgICAgICAgICBleGNlcHQgRXh0cmFjdEVycm9yIGFzIGU6CiAgICAgICAgICAgICAgICBpZiBzZWxmLmVycm9ybGV2ZWwgPiAxOgogICAgICAgICAgICAgICAgICAgIHJhaXNlCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHNlbGYuX2RiZygxLCAidGFyZmlsZTogJXMiICUgZSkKCiAgICBkZWYgZXh0cmFjdChzZWxmLCBtZW1iZXIsIHBhdGg9IiIsIHNldF9hdHRycz1UcnVlKToKICAgICAgICAiIiJFeHRyYWN0IGEgbWVtYmVyIGZyb20gdGhlIGFyY2hpdmUgdG8gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnksCiAgICAgICAgICAgdXNpbmcgaXRzIGZ1bGwgbmFtZS4gSXRzIGZpbGUgaW5mb3JtYXRpb24gaXMgZXh0cmFjdGVkIGFzIGFjY3VyYXRlbHkKICAgICAgICAgICBhcyBwb3NzaWJsZS4gYG1lbWJlcicgbWF5IGJlIGEgZmlsZW5hbWUgb3IgYSBUYXJJbmZvIG9iamVjdC4gWW91IGNhbgogICAgICAgICAgIHNwZWNpZnkgYSBkaWZmZXJlbnQgZGlyZWN0b3J5IHVzaW5nIGBwYXRoJy4gRmlsZSBhdHRyaWJ1dGVzIChvd25lciwKICAgICAgICAgICBtdGltZSwgbW9kZSkgYXJlIHNldCB1bmxlc3MgYHNldF9hdHRycycgaXMgRmFsc2UuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5fY2hlY2soInIiKQoKICAgICAgICBpZiBpc2luc3RhbmNlKG1lbWJlciwgc3RyKToKICAgICAgICAgICAgdGFyaW5mbyA9IHNlbGYuZ2V0bWVtYmVyKG1lbWJlcikKICAgICAgICBlbHNlOgogICAgICAgICAgICB0YXJpbmZvID0gbWVtYmVyCgogICAgICAgICMgUHJlcGFyZSB0aGUgbGluayB0YXJnZXQgZm9yIG1ha2VsaW5rKCkuCiAgICAgICAgaWYgdGFyaW5mby5pc2xuaygpOgogICAgICAgICAgICB0YXJpbmZvLl9saW5rX3RhcmdldCA9IG9zLnBhdGguam9pbihwYXRoLCB0YXJpbmZvLmxpbmtuYW1lKQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYuX2V4dHJhY3RfbWVtYmVyKHRhcmluZm8sIG9zLnBhdGguam9pbihwYXRoLCB0YXJpbmZvLm5hbWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfYXR0cnM9c2V0X2F0dHJzKQogICAgICAgIGV4Y2VwdCBFbnZpcm9ubWVudEVycm9yIGFzIGU6CiAgICAgICAgICAgIGlmIHNlbGYuZXJyb3JsZXZlbCA+IDA6CiAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgaWYgZS5maWxlbmFtZSBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgIHNlbGYuX2RiZygxLCAidGFyZmlsZTogJXMiICUgZS5zdHJlcnJvcikKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fZGJnKDEsICJ0YXJmaWxlOiAlcyAlciIgJSAoZS5zdHJlcnJvciwgZS5maWxlbmFtZSkpCiAgICAgICAgZXhjZXB0IEV4dHJhY3RFcnJvciBhcyBlOgogICAgICAgICAgICBpZiBzZWxmLmVycm9ybGV2ZWwgPiAxOgogICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYuX2RiZygxLCAidGFyZmlsZTogJXMiICUgZSkKCiAgICBkZWYgZXh0cmFjdGZpbGUoc2VsZiwgbWVtYmVyKToKICAgICAgICAiIiJFeHRyYWN0IGEgbWVtYmVyIGZyb20gdGhlIGFyY2hpdmUgYXMgYSBmaWxlIG9iamVjdC4gYG1lbWJlcicgbWF5IGJlCiAgICAgICAgICAgYSBmaWxlbmFtZSBvciBhIFRhckluZm8gb2JqZWN0LiBJZiBgbWVtYmVyJyBpcyBhIHJlZ3VsYXIgZmlsZSwgYQogICAgICAgICAgIGZpbGUtbGlrZSBvYmplY3QgaXMgcmV0dXJuZWQuIElmIGBtZW1iZXInIGlzIGEgbGluaywgYSBmaWxlLWxpa2UKICAgICAgICAgICBvYmplY3QgaXMgY29uc3RydWN0ZWQgZnJvbSB0aGUgbGluaydzIHRhcmdldC4gSWYgYG1lbWJlcicgaXMgbm9uZSBvZgogICAgICAgICAgIHRoZSBhYm92ZSwgTm9uZSBpcyByZXR1cm5lZC4KICAgICAgICAgICBUaGUgZmlsZS1saWtlIG9iamVjdCBpcyByZWFkLW9ubHkgYW5kIHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcKICAgICAgICAgICBtZXRob2RzOiByZWFkKCksIHJlYWRsaW5lKCksIHJlYWRsaW5lcygpLCBzZWVrKCkgYW5kIHRlbGwoKQogICAgICAgICIiIgogICAgICAgIHNlbGYuX2NoZWNrKCJyIikKCiAgICAgICAgaWYgaXNpbnN0YW5jZShtZW1iZXIsIHN0cik6CiAgICAgICAgICAgIHRhcmluZm8gPSBzZWxmLmdldG1lbWJlcihtZW1iZXIpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgdGFyaW5mbyA9IG1lbWJlcgoKICAgICAgICBpZiB0YXJpbmZvLmlzcmVnKCk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmZpbGVvYmplY3Qoc2VsZiwgdGFyaW5mbykKCiAgICAgICAgZWxpZiB0YXJpbmZvLnR5cGUgbm90IGluIFNVUFBPUlRFRF9UWVBFUzoKICAgICAgICAgICAgIyBJZiBhIG1lbWJlcidzIHR5cGUgaXMgdW5rbm93biwgaXQgaXMgdHJlYXRlZCBhcyBhCiAgICAgICAgICAgICMgcmVndWxhciBmaWxlLgogICAgICAgICAgICByZXR1cm4gc2VsZi5maWxlb2JqZWN0KHNlbGYsIHRhcmluZm8pCgogICAgICAgIGVsaWYgdGFyaW5mby5pc2xuaygpIG9yIHRhcmluZm8uaXNzeW0oKToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLmZpbGVvYmosIF9TdHJlYW0pOgogICAgICAgICAgICAgICAgIyBBIHNtYWxsIGJ1dCB1Z2x5IHdvcmthcm91bmQgZm9yIHRoZSBjYXNlIHRoYXQgc29tZW9uZSB0cmllcwogICAgICAgICAgICAgICAgIyB0byBleHRyYWN0IGEgKHN5bSlsaW5rIGFzIGEgZmlsZS1vYmplY3QgZnJvbSBhIG5vbi1zZWVrYWJsZQogICAgICAgICAgICAgICAgIyBzdHJlYW0gb2YgdGFyIGJsb2Nrcy4KICAgICAgICAgICAgICAgIHJhaXNlIFN0cmVhbUVycm9yKCJjYW5ub3QgZXh0cmFjdCAoc3ltKWxpbmsgYXMgZmlsZSBvYmplY3QiKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBBIChzeW0pbGluaydzIGZpbGUgb2JqZWN0IGlzIGl0cyB0YXJnZXQncyBmaWxlIG9iamVjdC4KICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmV4dHJhY3RmaWxlKHNlbGYuX2ZpbmRfbGlua190YXJnZXQodGFyaW5mbykpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBJZiB0aGVyZSdzIG5vIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBtZW1iZXIgKGRpcmVjdG9yeSwgY2hyZGV2LAogICAgICAgICAgICAjIGJsa2RldiwgZXRjLiksIHJldHVybiBOb25lIGluc3RlYWQgb2YgYSBmaWxlIG9iamVjdC4KICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBkZWYgX2V4dHJhY3RfbWVtYmVyKHNlbGYsIHRhcmluZm8sIHRhcmdldHBhdGgsIHNldF9hdHRycz1UcnVlKToKICAgICAgICAiIiJFeHRyYWN0IHRoZSBUYXJJbmZvIG9iamVjdCB0YXJpbmZvIHRvIGEgcGh5c2ljYWwKICAgICAgICAgICBmaWxlIGNhbGxlZCB0YXJnZXRwYXRoLgogICAgICAgICIiIgogICAgICAgICMgRmV0Y2ggdGhlIFRhckluZm8gb2JqZWN0IGZvciB0aGUgZ2l2ZW4gbmFtZQogICAgICAgICMgYW5kIGJ1aWxkIHRoZSBkZXN0aW5hdGlvbiBwYXRobmFtZSwgcmVwbGFjaW5nCiAgICAgICAgIyBmb3J3YXJkIHNsYXNoZXMgdG8gcGxhdGZvcm0gc3BlY2lmaWMgc2VwYXJhdG9ycy4KICAgICAgICB0YXJnZXRwYXRoID0gdGFyZ2V0cGF0aC5yc3RyaXAoIi8iKQogICAgICAgIHRhcmdldHBhdGggPSB0YXJnZXRwYXRoLnJlcGxhY2UoIi8iLCBvcy5zZXApCgogICAgICAgICMgQ3JlYXRlIGFsbCB1cHBlciBkaXJlY3Rvcmllcy4KICAgICAgICB1cHBlcmRpcnMgPSBvcy5wYXRoLmRpcm5hbWUodGFyZ2V0cGF0aCkKICAgICAgICBpZiB1cHBlcmRpcnMgYW5kIG5vdCBvcy5wYXRoLmV4aXN0cyh1cHBlcmRpcnMpOgogICAgICAgICAgICAjIENyZWF0ZSBkaXJlY3RvcmllcyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgYXJjaGl2ZSB3aXRoCiAgICAgICAgICAgICMgZGVmYXVsdCBwZXJtaXNzaW9ucy4KICAgICAgICAgICAgb3MubWFrZWRpcnModXBwZXJkaXJzKQoKICAgICAgICBpZiB0YXJpbmZvLmlzbG5rKCkgb3IgdGFyaW5mby5pc3N5bSgpOgogICAgICAgICAgICBzZWxmLl9kYmcoMSwgIiVzIC0+ICVzIiAlICh0YXJpbmZvLm5hbWUsIHRhcmluZm8ubGlua25hbWUpKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuX2RiZygxLCB0YXJpbmZvLm5hbWUpCgogICAgICAgIGlmIHRhcmluZm8uaXNyZWcoKToKICAgICAgICAgICAgc2VsZi5tYWtlZmlsZSh0YXJpbmZvLCB0YXJnZXRwYXRoKQogICAgICAgIGVsaWYgdGFyaW5mby5pc2RpcigpOgogICAgICAgICAgICBzZWxmLm1ha2VkaXIodGFyaW5mbywgdGFyZ2V0cGF0aCkKICAgICAgICBlbGlmIHRhcmluZm8uaXNmaWZvKCk6CiAgICAgICAgICAgIHNlbGYubWFrZWZpZm8odGFyaW5mbywgdGFyZ2V0cGF0aCkKICAgICAgICBlbGlmIHRhcmluZm8uaXNjaHIoKSBvciB0YXJpbmZvLmlzYmxrKCk6CiAgICAgICAgICAgIHNlbGYubWFrZWRldih0YXJpbmZvLCB0YXJnZXRwYXRoKQogICAgICAgIGVsaWYgdGFyaW5mby5pc2xuaygpIG9yIHRhcmluZm8uaXNzeW0oKToKICAgICAgICAgICAgc2VsZi5tYWtlbGluayh0YXJpbmZvLCB0YXJnZXRwYXRoKQogICAgICAgIGVsaWYgdGFyaW5mby50eXBlIG5vdCBpbiBTVVBQT1JURURfVFlQRVM6CiAgICAgICAgICAgIHNlbGYubWFrZXVua25vd24odGFyaW5mbywgdGFyZ2V0cGF0aCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLm1ha2VmaWxlKHRhcmluZm8sIHRhcmdldHBhdGgpCgogICAgICAgIGlmIHNldF9hdHRyczoKICAgICAgICAgICAgc2VsZi5jaG93bih0YXJpbmZvLCB0YXJnZXRwYXRoKQogICAgICAgICAgICBpZiBub3QgdGFyaW5mby5pc3N5bSgpOgogICAgICAgICAgICAgICAgc2VsZi5jaG1vZCh0YXJpbmZvLCB0YXJnZXRwYXRoKQogICAgICAgICAgICAgICAgc2VsZi51dGltZSh0YXJpbmZvLCB0YXJnZXRwYXRoKQoKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBCZWxvdyBhcmUgdGhlIGRpZmZlcmVudCBmaWxlIG1ldGhvZHMuIFRoZXkgYXJlIGNhbGxlZCB2aWEKICAgICMgX2V4dHJhY3RfbWVtYmVyKCkgd2hlbiBleHRyYWN0KCkgaXMgY2FsbGVkLiBUaGV5IGNhbiBiZSByZXBsYWNlZCBpbiBhCiAgICAjIHN1YmNsYXNzIHRvIGltcGxlbWVudCBvdGhlciBmdW5jdGlvbmFsaXR5LgoKICAgIGRlZiBtYWtlZGlyKHNlbGYsIHRhcmluZm8sIHRhcmdldHBhdGgpOgogICAgICAgICIiIk1ha2UgYSBkaXJlY3RvcnkgY2FsbGVkIHRhcmdldHBhdGguCiAgICAgICAgIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICAjIFVzZSBhIHNhZmUgbW9kZSBmb3IgdGhlIGRpcmVjdG9yeSwgdGhlIHJlYWwgbW9kZSBpcyBzZXQKICAgICAgICAgICAgIyBsYXRlciBpbiBfZXh0cmFjdF9tZW1iZXIoKS4KICAgICAgICAgICAgb3MubWtkaXIodGFyZ2V0cGF0aCwgMG83MDApCiAgICAgICAgZXhjZXB0IEVudmlyb25tZW50RXJyb3IgYXMgZToKICAgICAgICAgICAgaWYgZS5lcnJubyAhPSBlcnJuby5FRVhJU1Q6CiAgICAgICAgICAgICAgICByYWlzZQoKICAgIGRlZiBtYWtlZmlsZShzZWxmLCB0YXJpbmZvLCB0YXJnZXRwYXRoKToKICAgICAgICAiIiJNYWtlIGEgZmlsZSBjYWxsZWQgdGFyZ2V0cGF0aC4KICAgICAgICAiIiIKICAgICAgICBzb3VyY2UgPSBzZWxmLmZpbGVvYmoKICAgICAgICBzb3VyY2Uuc2Vlayh0YXJpbmZvLm9mZnNldF9kYXRhKQogICAgICAgIHRhcmdldCA9IGJsdG5fb3Blbih0YXJnZXRwYXRoLCAid2IiKQogICAgICAgIGlmIHRhcmluZm8uc3BhcnNlIGlzIG5vdCBOb25lOgogICAgICAgICAgICBmb3Igb2Zmc2V0LCBzaXplIGluIHRhcmluZm8uc3BhcnNlOgogICAgICAgICAgICAgICAgdGFyZ2V0LnNlZWsob2Zmc2V0KQogICAgICAgICAgICAgICAgY29weWZpbGVvYmooc291cmNlLCB0YXJnZXQsIHNpemUpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgY29weWZpbGVvYmooc291cmNlLCB0YXJnZXQsIHRhcmluZm8uc2l6ZSkKICAgICAgICB0YXJnZXQuc2Vlayh0YXJpbmZvLnNpemUpCiAgICAgICAgdGFyZ2V0LnRydW5jYXRlKCkKICAgICAgICB0YXJnZXQuY2xvc2UoKQoKICAgIGRlZiBtYWtldW5rbm93bihzZWxmLCB0YXJpbmZvLCB0YXJnZXRwYXRoKToKICAgICAgICAiIiJNYWtlIGEgZmlsZSBmcm9tIGEgVGFySW5mbyBvYmplY3Qgd2l0aCBhbiB1bmtub3duIHR5cGUKICAgICAgICAgICBhdCB0YXJnZXRwYXRoLgogICAgICAgICIiIgogICAgICAgIHNlbGYubWFrZWZpbGUodGFyaW5mbywgdGFyZ2V0cGF0aCkKICAgICAgICBzZWxmLl9kYmcoMSwgInRhcmZpbGU6IFVua25vd24gZmlsZSB0eXBlICVyLCAiIFwKICAgICAgICAgICAgICAgICAgICAgImV4dHJhY3RlZCBhcyByZWd1bGFyIGZpbGUuIiAlIHRhcmluZm8udHlwZSkKCiAgICBkZWYgbWFrZWZpZm8oc2VsZiwgdGFyaW5mbywgdGFyZ2V0cGF0aCk6CiAgICAgICAgIiIiTWFrZSBhIGZpZm8gY2FsbGVkIHRhcmdldHBhdGguCiAgICAgICAgIiIiCiAgICAgICAgaWYgaGFzYXR0cihvcywgIm1rZmlmbyIpOgogICAgICAgICAgICBvcy5ta2ZpZm8odGFyZ2V0cGF0aCkKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBFeHRyYWN0RXJyb3IoImZpZm8gbm90IHN1cHBvcnRlZCBieSBzeXN0ZW0iKQoKICAgIGRlZiBtYWtlZGV2KHNlbGYsIHRhcmluZm8sIHRhcmdldHBhdGgpOgogICAgICAgICIiIk1ha2UgYSBjaGFyYWN0ZXIgb3IgYmxvY2sgZGV2aWNlIGNhbGxlZCB0YXJnZXRwYXRoLgogICAgICAgICIiIgogICAgICAgIGlmIG5vdCBoYXNhdHRyKG9zLCAibWtub2QiKSBvciBub3QgaGFzYXR0cihvcywgIm1ha2VkZXYiKToKICAgICAgICAgICAgcmFpc2UgRXh0cmFjdEVycm9yKCJzcGVjaWFsIGRldmljZXMgbm90IHN1cHBvcnRlZCBieSBzeXN0ZW0iKQoKICAgICAgICBtb2RlID0gdGFyaW5mby5tb2RlCiAgICAgICAgaWYgdGFyaW5mby5pc2JsaygpOgogICAgICAgICAgICBtb2RlIHw9IHN0YXQuU19JRkJMSwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG1vZGUgfD0gc3RhdC5TX0lGQ0hSCgogICAgICAgIG9zLm1rbm9kKHRhcmdldHBhdGgsIG1vZGUsCiAgICAgICAgICAgICAgICAgb3MubWFrZWRldih0YXJpbmZvLmRldm1ham9yLCB0YXJpbmZvLmRldm1pbm9yKSkKCiAgICBkZWYgbWFrZWxpbmsoc2VsZiwgdGFyaW5mbywgdGFyZ2V0cGF0aCk6CiAgICAgICAgIiIiTWFrZSBhIChzeW1ib2xpYykgbGluayBjYWxsZWQgdGFyZ2V0cGF0aC4gSWYgaXQgY2Fubm90IGJlIGNyZWF0ZWQKICAgICAgICAgIChwbGF0Zm9ybSBsaW1pdGF0aW9uKSwgd2UgdHJ5IHRvIG1ha2UgYSBjb3B5IG9mIHRoZSByZWZlcmVuY2VkIGZpbGUKICAgICAgICAgIGluc3RlYWQgb2YgYSBsaW5rLgogICAgICAgICIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgIyBGb3Igc3lzdGVtcyB0aGF0IHN1cHBvcnQgc3ltYm9saWMgYW5kIGhhcmQgbGlua3MuCiAgICAgICAgICAgIGlmIHRhcmluZm8uaXNzeW0oKToKICAgICAgICAgICAgICAgIG9zLnN5bWxpbmsodGFyaW5mby5saW5rbmFtZSwgdGFyZ2V0cGF0aCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgU2VlIGV4dHJhY3QoKS4KICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHRhcmluZm8uX2xpbmtfdGFyZ2V0KToKICAgICAgICAgICAgICAgICAgICBvcy5saW5rKHRhcmluZm8uX2xpbmtfdGFyZ2V0LCB0YXJnZXRwYXRoKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBzZWxmLl9leHRyYWN0X21lbWJlcihzZWxmLl9maW5kX2xpbmtfdGFyZ2V0KHRhcmluZm8pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldHBhdGgpCiAgICAgICAgZXhjZXB0IHN5bWxpbmtfZXhjZXB0aW9uOgogICAgICAgICAgICBpZiB0YXJpbmZvLmlzc3ltKCk6CiAgICAgICAgICAgICAgICBsaW5rcGF0aCA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUodGFyaW5mby5uYW1lKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmluZm8ubGlua25hbWUpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBsaW5rcGF0aCA9IHRhcmluZm8ubGlua25hbWUKICAgICAgICBlbHNlOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBzZWxmLl9leHRyYWN0X21lbWJlcihzZWxmLl9maW5kX2xpbmtfdGFyZ2V0KHRhcmluZm8pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0cGF0aCkKICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICAgICAgcmFpc2UgRXh0cmFjdEVycm9yKCJ1bmFibGUgdG8gcmVzb2x2ZSBsaW5rIGluc2lkZSBhcmNoaXZlIikKCiAgICBkZWYgY2hvd24oc2VsZiwgdGFyaW5mbywgdGFyZ2V0cGF0aCk6CiAgICAgICAgIiIiU2V0IG93bmVyIG9mIHRhcmdldHBhdGggYWNjb3JkaW5nIHRvIHRhcmluZm8uCiAgICAgICAgIiIiCiAgICAgICAgaWYgcHdkIGFuZCBoYXNhdHRyKG9zLCAiZ2V0ZXVpZCIpIGFuZCBvcy5nZXRldWlkKCkgPT0gMDoKICAgICAgICAgICAgIyBXZSBoYXZlIHRvIGJlIHJvb3QgdG8gZG8gc28uCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGcgPSBncnAuZ2V0Z3JuYW0odGFyaW5mby5nbmFtZSlbMl0KICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICAgICAgZyA9IHRhcmluZm8uZ2lkCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHUgPSBwd2QuZ2V0cHduYW0odGFyaW5mby51bmFtZSlbMl0KICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICAgICAgdSA9IHRhcmluZm8udWlkCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGlmIHRhcmluZm8uaXNzeW0oKSBhbmQgaGFzYXR0cihvcywgImxjaG93biIpOgogICAgICAgICAgICAgICAgICAgIG9zLmxjaG93bih0YXJnZXRwYXRoLCB1LCBnKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBpZiBzeXMucGxhdGZvcm0gIT0gIm9zMmVteCI6CiAgICAgICAgICAgICAgICAgICAgICAgIG9zLmNob3duKHRhcmdldHBhdGgsIHUsIGcpCiAgICAgICAgICAgIGV4Y2VwdCBFbnZpcm9ubWVudEVycm9yIGFzIGU6CiAgICAgICAgICAgICAgICByYWlzZSBFeHRyYWN0RXJyb3IoImNvdWxkIG5vdCBjaGFuZ2Ugb3duZXIiKQoKICAgIGRlZiBjaG1vZChzZWxmLCB0YXJpbmZvLCB0YXJnZXRwYXRoKToKICAgICAgICAiIiJTZXQgZmlsZSBwZXJtaXNzaW9ucyBvZiB0YXJnZXRwYXRoIGFjY29yZGluZyB0byB0YXJpbmZvLgogICAgICAgICIiIgogICAgICAgIGlmIGhhc2F0dHIob3MsICdjaG1vZCcpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBvcy5jaG1vZCh0YXJnZXRwYXRoLCB0YXJpbmZvLm1vZGUpCiAgICAgICAgICAgIGV4Y2VwdCBFbnZpcm9ubWVudEVycm9yIGFzIGU6CiAgICAgICAgICAgICAgICByYWlzZSBFeHRyYWN0RXJyb3IoImNvdWxkIG5vdCBjaGFuZ2UgbW9kZSIpCgogICAgZGVmIHV0aW1lKHNlbGYsIHRhcmluZm8sIHRhcmdldHBhdGgpOgogICAgICAgICIiIlNldCBtb2RpZmljYXRpb24gdGltZSBvZiB0YXJnZXRwYXRoIGFjY29yZGluZyB0byB0YXJpbmZvLgogICAgICAgICIiIgogICAgICAgIGlmIG5vdCBoYXNhdHRyKG9zLCAndXRpbWUnKToKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgdHJ5OgogICAgICAgICAgICBvcy51dGltZSh0YXJnZXRwYXRoLCAodGFyaW5mby5tdGltZSwgdGFyaW5mby5tdGltZSkpCiAgICAgICAgZXhjZXB0IEVudmlyb25tZW50RXJyb3IgYXMgZToKICAgICAgICAgICAgcmFpc2UgRXh0cmFjdEVycm9yKCJjb3VsZCBub3QgY2hhbmdlIG1vZGlmaWNhdGlvbiB0aW1lIikKCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGRlZiBuZXh0KHNlbGYpOgogICAgICAgICIiIlJldHVybiB0aGUgbmV4dCBtZW1iZXIgb2YgdGhlIGFyY2hpdmUgYXMgYSBUYXJJbmZvIG9iamVjdCwgd2hlbgogICAgICAgICAgIFRhckZpbGUgaXMgb3BlbmVkIGZvciByZWFkaW5nLiBSZXR1cm4gTm9uZSBpZiB0aGVyZSBpcyBubyBtb3JlCiAgICAgICAgICAgYXZhaWxhYmxlLgogICAgICAgICIiIgogICAgICAgIHNlbGYuX2NoZWNrKCJyYSIpCiAgICAgICAgaWYgc2VsZi5maXJzdG1lbWJlciBpcyBub3QgTm9uZToKICAgICAgICAgICAgbSA9IHNlbGYuZmlyc3RtZW1iZXIKICAgICAgICAgICAgc2VsZi5maXJzdG1lbWJlciA9IE5vbmUKICAgICAgICAgICAgcmV0dXJuIG0KCiAgICAgICAgIyBSZWFkIHRoZSBuZXh0IGJsb2NrLgogICAgICAgIHNlbGYuZmlsZW9iai5zZWVrKHNlbGYub2Zmc2V0KQogICAgICAgIHRhcmluZm8gPSBOb25lCiAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyaW5mby5mcm9tdGFyZmlsZShzZWxmKQogICAgICAgICAgICBleGNlcHQgRU9GSGVhZGVyRXJyb3IgYXMgZToKICAgICAgICAgICAgICAgIGlmIHNlbGYuaWdub3JlX3plcm9zOgogICAgICAgICAgICAgICAgICAgIHNlbGYuX2RiZygyLCAiMHglWDogJXMiICUgKHNlbGYub2Zmc2V0LCBlKSkKICAgICAgICAgICAgICAgICAgICBzZWxmLm9mZnNldCArPSBCTE9DS1NJWkUKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBleGNlcHQgSW52YWxpZEhlYWRlckVycm9yIGFzIGU6CiAgICAgICAgICAgICAgICBpZiBzZWxmLmlnbm9yZV96ZXJvczoKICAgICAgICAgICAgICAgICAgICBzZWxmLl9kYmcoMiwgIjB4JVg6ICVzIiAlIChzZWxmLm9mZnNldCwgZSkpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5vZmZzZXQgKz0gQkxPQ0tTSVpFCiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIGVsaWYgc2VsZi5vZmZzZXQgPT0gMDoKICAgICAgICAgICAgICAgICAgICByYWlzZSBSZWFkRXJyb3Ioc3RyKGUpKQogICAgICAgICAgICBleGNlcHQgRW1wdHlIZWFkZXJFcnJvcjoKICAgICAgICAgICAgICAgIGlmIHNlbGYub2Zmc2V0ID09IDA6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgUmVhZEVycm9yKCJlbXB0eSBmaWxlIikKICAgICAgICAgICAgZXhjZXB0IFRydW5jYXRlZEhlYWRlckVycm9yIGFzIGU6CiAgICAgICAgICAgICAgICBpZiBzZWxmLm9mZnNldCA9PSAwOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIFJlYWRFcnJvcihzdHIoZSkpCiAgICAgICAgICAgIGV4Y2VwdCBTdWJzZXF1ZW50SGVhZGVyRXJyb3IgYXMgZToKICAgICAgICAgICAgICAgIHJhaXNlIFJlYWRFcnJvcihzdHIoZSkpCiAgICAgICAgICAgIGJyZWFrCgogICAgICAgIGlmIHRhcmluZm8gaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGYubWVtYmVycy5hcHBlbmQodGFyaW5mbykKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLl9sb2FkZWQgPSBUcnVlCgogICAgICAgIHJldHVybiB0YXJpbmZvCgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIExpdHRsZSBoZWxwZXIgbWV0aG9kczoKCiAgICBkZWYgX2dldG1lbWJlcihzZWxmLCBuYW1lLCB0YXJpbmZvPU5vbmUsIG5vcm1hbGl6ZT1GYWxzZSk6CiAgICAgICAgIiIiRmluZCBhbiBhcmNoaXZlIG1lbWJlciBieSBuYW1lIGZyb20gYm90dG9tIHRvIHRvcC4KICAgICAgICAgICBJZiB0YXJpbmZvIGlzIGdpdmVuLCBpdCBpcyB1c2VkIGFzIHRoZSBzdGFydGluZyBwb2ludC4KICAgICAgICAiIiIKICAgICAgICAjIEVuc3VyZSB0aGF0IGFsbCBtZW1iZXJzIGhhdmUgYmVlbiBsb2FkZWQuCiAgICAgICAgbWVtYmVycyA9IHNlbGYuZ2V0bWVtYmVycygpCgogICAgICAgICMgTGltaXQgdGhlIG1lbWJlciBzZWFyY2ggbGlzdCB1cCB0byB0YXJpbmZvLgogICAgICAgIGlmIHRhcmluZm8gaXMgbm90IE5vbmU6CiAgICAgICAgICAgIG1lbWJlcnMgPSBtZW1iZXJzWzptZW1iZXJzLmluZGV4KHRhcmluZm8pXQoKICAgICAgICBpZiBub3JtYWxpemU6CiAgICAgICAgICAgIG5hbWUgPSBvcy5wYXRoLm5vcm1wYXRoKG5hbWUpCgogICAgICAgIGZvciBtZW1iZXIgaW4gcmV2ZXJzZWQobWVtYmVycyk6CiAgICAgICAgICAgIGlmIG5vcm1hbGl6ZToKICAgICAgICAgICAgICAgIG1lbWJlcl9uYW1lID0gb3MucGF0aC5ub3JtcGF0aChtZW1iZXIubmFtZSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIG1lbWJlcl9uYW1lID0gbWVtYmVyLm5hbWUKCiAgICAgICAgICAgIGlmIG5hbWUgPT0gbWVtYmVyX25hbWU6CiAgICAgICAgICAgICAgICByZXR1cm4gbWVtYmVyCgogICAgZGVmIF9sb2FkKHNlbGYpOgogICAgICAgICIiIlJlYWQgdGhyb3VnaCB0aGUgZW50aXJlIGFyY2hpdmUgZmlsZSBhbmQgbG9vayBmb3IgcmVhZGFibGUKICAgICAgICAgICBtZW1iZXJzLgogICAgICAgICIiIgogICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgIHRhcmluZm8gPSBzZWxmLm5leHQoKQogICAgICAgICAgICBpZiB0YXJpbmZvIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBicmVhawogICAgICAgIHNlbGYuX2xvYWRlZCA9IFRydWUKCiAgICBkZWYgX2NoZWNrKHNlbGYsIG1vZGU9Tm9uZSk6CiAgICAgICAgIiIiQ2hlY2sgaWYgVGFyRmlsZSBpcyBzdGlsbCBvcGVuLCBhbmQgaWYgdGhlIG9wZXJhdGlvbidzIG1vZGUKICAgICAgICAgICBjb3JyZXNwb25kcyB0byBUYXJGaWxlJ3MgbW9kZS4KICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLmNsb3NlZDoKICAgICAgICAgICAgcmFpc2UgSU9FcnJvcigiJXMgaXMgY2xvc2VkIiAlIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fKQogICAgICAgIGlmIG1vZGUgaXMgbm90IE5vbmUgYW5kIHNlbGYubW9kZSBub3QgaW4gbW9kZToKICAgICAgICAgICAgcmFpc2UgSU9FcnJvcigiYmFkIG9wZXJhdGlvbiBmb3IgbW9kZSAlciIgJSBzZWxmLm1vZGUpCgogICAgZGVmIF9maW5kX2xpbmtfdGFyZ2V0KHNlbGYsIHRhcmluZm8pOgogICAgICAgICIiIkZpbmQgdGhlIHRhcmdldCBtZW1iZXIgb2YgYSBzeW1saW5rIG9yIGhhcmRsaW5rIG1lbWJlciBpbiB0aGUKICAgICAgICAgICBhcmNoaXZlLgogICAgICAgICIiIgogICAgICAgIGlmIHRhcmluZm8uaXNzeW0oKToKICAgICAgICAgICAgIyBBbHdheXMgc2VhcmNoIHRoZSBlbnRpcmUgYXJjaGl2ZS4KICAgICAgICAgICAgbGlua25hbWUgPSBvcy5wYXRoLmRpcm5hbWUodGFyaW5mby5uYW1lKSArICIvIiArIHRhcmluZm8ubGlua25hbWUKICAgICAgICAgICAgbGltaXQgPSBOb25lCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBTZWFyY2ggdGhlIGFyY2hpdmUgYmVmb3JlIHRoZSBsaW5rLCBiZWNhdXNlIGEgaGFyZCBsaW5rIGlzCiAgICAgICAgICAgICMganVzdCBhIHJlZmVyZW5jZSB0byBhbiBhbHJlYWR5IGFyY2hpdmVkIGZpbGUuCiAgICAgICAgICAgIGxpbmtuYW1lID0gdGFyaW5mby5saW5rbmFtZQogICAgICAgICAgICBsaW1pdCA9IHRhcmluZm8KCiAgICAgICAgbWVtYmVyID0gc2VsZi5fZ2V0bWVtYmVyKGxpbmtuYW1lLCB0YXJpbmZvPWxpbWl0LCBub3JtYWxpemU9VHJ1ZSkKICAgICAgICBpZiBtZW1iZXIgaXMgTm9uZToKICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IoImxpbmtuYW1lICVyIG5vdCBmb3VuZCIgJSBsaW5rbmFtZSkKICAgICAgICByZXR1cm4gbWVtYmVyCgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgICIiIlByb3ZpZGUgYW4gaXRlcmF0b3Igb2JqZWN0LgogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYuX2xvYWRlZDoKICAgICAgICAgICAgcmV0dXJuIGl0ZXIoc2VsZi5tZW1iZXJzKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBUYXJJdGVyKHNlbGYpCgogICAgZGVmIF9kYmcoc2VsZiwgbGV2ZWwsIG1zZyk6CiAgICAgICAgIiIiV3JpdGUgZGVidWdnaW5nIG91dHB1dCB0byBzeXMuc3RkZXJyLgogICAgICAgICIiIgogICAgICAgIGlmIGxldmVsIDw9IHNlbGYuZGVidWc6CiAgICAgICAgICAgIHByaW50KG1zZywgZmlsZT1zeXMuc3RkZXJyKQoKICAgIGRlZiBfX2VudGVyX18oc2VsZik6CiAgICAgICAgc2VsZi5fY2hlY2soKQogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIF9fZXhpdF9fKHNlbGYsIHR5cGUsIHZhbHVlLCB0cmFjZWJhY2spOgogICAgICAgIGlmIHR5cGUgaXMgTm9uZToKICAgICAgICAgICAgc2VsZi5jbG9zZSgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBBbiBleGNlcHRpb24gb2NjdXJyZWQuIFdlIG11c3Qgbm90IGNhbGwgY2xvc2UoKSBiZWNhdXNlCiAgICAgICAgICAgICMgaXQgd291bGQgdHJ5IHRvIHdyaXRlIGVuZC1vZi1hcmNoaXZlIGJsb2NrcyBhbmQgcGFkZGluZy4KICAgICAgICAgICAgaWYgbm90IHNlbGYuX2V4dGZpbGVvYmo6CiAgICAgICAgICAgICAgICBzZWxmLmZpbGVvYmouY2xvc2UoKQogICAgICAgICAgICBzZWxmLmNsb3NlZCA9IFRydWUKIyBjbGFzcyBUYXJGaWxlCgpjbGFzcyBUYXJJdGVyKG9iamVjdCk6CiAgICAiIiJJdGVyYXRvciBDbGFzcy4KCiAgICAgICBmb3IgdGFyaW5mbyBpbiBUYXJGaWxlKC4uLik6CiAgICAgICAgICAgc3VpdGUuLi4KICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0YXJmaWxlKToKICAgICAgICAiIiJDb25zdHJ1Y3QgYSBUYXJJdGVyIG9iamVjdC4KICAgICAgICAiIiIKICAgICAgICBzZWxmLnRhcmZpbGUgPSB0YXJmaWxlCiAgICAgICAgc2VsZi5pbmRleCA9IDAKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICAiIiJSZXR1cm4gaXRlcmF0b3Igb2JqZWN0LgogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIF9fbmV4dF9fKHNlbGYpOgogICAgICAgICIiIlJldHVybiB0aGUgbmV4dCBpdGVtIHVzaW5nIFRhckZpbGUncyBuZXh0KCkgbWV0aG9kLgogICAgICAgICAgIFdoZW4gYWxsIG1lbWJlcnMgaGF2ZSBiZWVuIHJlYWQsIHNldCBUYXJGaWxlIGFzIF9sb2FkZWQuCiAgICAgICAgIiIiCiAgICAgICAgIyBGaXggZm9yIFNGICMxMTAwNDI5OiBVbmRlciByYXJlIGNpcmN1bXN0YW5jZXMgaXQgY2FuCiAgICAgICAgIyBoYXBwZW4gdGhhdCBnZXRtZW1iZXJzKCkgaXMgY2FsbGVkIGR1cmluZyBpdGVyYXRpb24sCiAgICAgICAgIyB3aGljaCB3aWxsIGNhdXNlIFRhckl0ZXIgdG8gc3RvcCBwcmVtYXR1cmVseS4KICAgICAgICBpZiBub3Qgc2VsZi50YXJmaWxlLl9sb2FkZWQ6CiAgICAgICAgICAgIHRhcmluZm8gPSBzZWxmLnRhcmZpbGUubmV4dCgpCiAgICAgICAgICAgIGlmIG5vdCB0YXJpbmZvOgogICAgICAgICAgICAgICAgc2VsZi50YXJmaWxlLl9sb2FkZWQgPSBUcnVlCiAgICAgICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCiAgICAgICAgZWxzZToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyZmlsZS5tZW1iZXJzW3NlbGYuaW5kZXhdCiAgICAgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgogICAgICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgogICAgICAgIHNlbGYuaW5kZXggKz0gMQogICAgICAgIHJldHVybiB0YXJpbmZvCgogICAgbmV4dCA9IF9fbmV4dF9fICMgZm9yIFB5dGhvbiAyLngKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLQojIGV4cG9ydGVkIGZ1bmN0aW9ucwojLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGVmIGlzX3RhcmZpbGUobmFtZSk6CiAgICAiIiJSZXR1cm4gVHJ1ZSBpZiBuYW1lIHBvaW50cyB0byBhIHRhciBhcmNoaXZlIHRoYXQgd2UKICAgICAgIGFyZSBhYmxlIHRvIGhhbmRsZSwgZWxzZSByZXR1cm4gRmFsc2UuCiAgICAiIiIKICAgIHRyeToKICAgICAgICB0ID0gb3BlbihuYW1lKQogICAgICAgIHQuY2xvc2UoKQogICAgICAgIHJldHVybiBUcnVlCiAgICBleGNlcHQgVGFyRXJyb3I6CiAgICAgICAgcmV0dXJuIEZhbHNlCgpibHRuX29wZW4gPSBvcGVuCm9wZW4gPSBUYXJGaWxlLm9wZW4KUEsDBBQAAAAAAAAAIQBfCXNgYZ8AAGGfAAA6AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0bGliL2NvbXBhdC5weSMgLSotIGNvZGluZzogdXRmLTggLSotCiMKIyBDb3B5cmlnaHQgKEMpIDIwMTMtMjAxNiBWaW5heSBTYWppcC4KIyBMaWNlbnNlZCB0byB0aGUgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24gdW5kZXIgYSBjb250cmlidXRvciBhZ3JlZW1lbnQuCiMgU2VlIExJQ0VOU0UudHh0IGFuZCBDT05UUklCVVRPUlMudHh0LgojCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgb3MKaW1wb3J0IHJlCmltcG9ydCBzeXMKCnRyeToKICAgIGltcG9ydCBzc2wKZXhjZXB0IEltcG9ydEVycm9yOgogICAgc3NsID0gTm9uZQoKaWYgc3lzLnZlcnNpb25faW5mb1swXSA8IDM6ICAjIHByYWdtYTogbm8gY292ZXIKICAgIGZyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCiAgICBzdHJpbmdfdHlwZXMgPSBiYXNlc3RyaW5nLAogICAgdGV4dF90eXBlID0gdW5pY29kZQogICAgZnJvbSB0eXBlcyBpbXBvcnQgRmlsZVR5cGUgYXMgZmlsZV90eXBlCiAgICBpbXBvcnQgX19idWlsdGluX18gYXMgYnVpbHRpbnMKICAgIGltcG9ydCBDb25maWdQYXJzZXIgYXMgY29uZmlncGFyc2VyCiAgICBmcm9tIC5fYmFja3BvcnQgaW1wb3J0IHNodXRpbAogICAgZnJvbSB1cmxwYXJzZSBpbXBvcnQgdXJscGFyc2UsIHVybHVucGFyc2UsIHVybGpvaW4sIHVybHNwbGl0LCB1cmx1bnNwbGl0CiAgICBmcm9tIHVybGxpYiBpbXBvcnQgKHVybHJldHJpZXZlLCBxdW90ZSBhcyBfcXVvdGUsIHVucXVvdGUsIHVybDJwYXRobmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgcGF0aG5hbWUydXJsLCBDb250ZW50VG9vU2hvcnRFcnJvciwgc3BsaXR0eXBlKQoKICAgIGRlZiBxdW90ZShzKToKICAgICAgICBpZiBpc2luc3RhbmNlKHMsIHVuaWNvZGUpOgogICAgICAgICAgICBzID0gcy5lbmNvZGUoJ3V0Zi04JykKICAgICAgICByZXR1cm4gX3F1b3RlKHMpCgogICAgaW1wb3J0IHVybGxpYjIKICAgIGZyb20gdXJsbGliMiBpbXBvcnQgKFJlcXVlc3QsIHVybG9wZW4sIFVSTEVycm9yLCBIVFRQRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICBIVFRQQmFzaWNBdXRoSGFuZGxlciwgSFRUUFBhc3N3b3JkTWdyLAogICAgICAgICAgICAgICAgICAgICAgICAgSFRUUEhhbmRsZXIsIEhUVFBSZWRpcmVjdEhhbmRsZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZF9vcGVuZXIpCiAgICBpZiBzc2w6CiAgICAgICAgZnJvbSB1cmxsaWIyIGltcG9ydCBIVFRQU0hhbmRsZXIKICAgIGltcG9ydCBodHRwbGliCiAgICBpbXBvcnQgeG1scnBjbGliCiAgICBpbXBvcnQgUXVldWUgYXMgcXVldWUKICAgIGZyb20gSFRNTFBhcnNlciBpbXBvcnQgSFRNTFBhcnNlcgogICAgaW1wb3J0IGh0bWxlbnRpdHlkZWZzCiAgICByYXdfaW5wdXQgPSByYXdfaW5wdXQKICAgIGZyb20gaXRlcnRvb2xzIGltcG9ydCBpZmlsdGVyIGFzIGZpbHRlcgogICAgZnJvbSBpdGVydG9vbHMgaW1wb3J0IGlmaWx0ZXJmYWxzZSBhcyBmaWx0ZXJmYWxzZQoKICAgIF91c2VycHJvZyA9IE5vbmUKICAgIGRlZiBzcGxpdHVzZXIoaG9zdCk6CiAgICAgICAgIiIic3BsaXR1c2VyKCd1c2VyWzpwYXNzd2RdQGhvc3RbOnBvcnRdJykgLS0+ICd1c2VyWzpwYXNzd2RdJywgJ2hvc3RbOnBvcnRdJy4iIiIKICAgICAgICBnbG9iYWwgX3VzZXJwcm9nCiAgICAgICAgaWYgX3VzZXJwcm9nIGlzIE5vbmU6CiAgICAgICAgICAgIGltcG9ydCByZQogICAgICAgICAgICBfdXNlcnByb2cgPSByZS5jb21waWxlKCdeKC4qKUAoLiopJCcpCgogICAgICAgIG1hdGNoID0gX3VzZXJwcm9nLm1hdGNoKGhvc3QpCiAgICAgICAgaWYgbWF0Y2g6IHJldHVybiBtYXRjaC5ncm91cCgxLCAyKQogICAgICAgIHJldHVybiBOb25lLCBob3N0CgplbHNlOiAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICBmcm9tIGlvIGltcG9ydCBTdHJpbmdJTwogICAgc3RyaW5nX3R5cGVzID0gc3RyLAogICAgdGV4dF90eXBlID0gc3RyCiAgICBmcm9tIGlvIGltcG9ydCBUZXh0SU9XcmFwcGVyIGFzIGZpbGVfdHlwZQogICAgaW1wb3J0IGJ1aWx0aW5zCiAgICBpbXBvcnQgY29uZmlncGFyc2VyCiAgICBpbXBvcnQgc2h1dGlsCiAgICBmcm9tIHVybGxpYi5wYXJzZSBpbXBvcnQgKHVybHBhcnNlLCB1cmx1bnBhcnNlLCB1cmxqb2luLCBzcGxpdHVzZXIsIHF1b3RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnF1b3RlLCB1cmxzcGxpdCwgdXJsdW5zcGxpdCwgc3BsaXR0eXBlKQogICAgZnJvbSB1cmxsaWIucmVxdWVzdCBpbXBvcnQgKHVybG9wZW4sIHVybHJldHJpZXZlLCBSZXF1ZXN0LCB1cmwycGF0aG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aG5hbWUydXJsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhUVFBCYXNpY0F1dGhIYW5kbGVyLCBIVFRQUGFzc3dvcmRNZ3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFRUUEhhbmRsZXIsIEhUVFBSZWRpcmVjdEhhbmRsZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRfb3BlbmVyKQogICAgaWYgc3NsOgogICAgICAgIGZyb20gdXJsbGliLnJlcXVlc3QgaW1wb3J0IEhUVFBTSGFuZGxlcgogICAgZnJvbSB1cmxsaWIuZXJyb3IgaW1wb3J0IEhUVFBFcnJvciwgVVJMRXJyb3IsIENvbnRlbnRUb29TaG9ydEVycm9yCiAgICBpbXBvcnQgaHR0cC5jbGllbnQgYXMgaHR0cGxpYgogICAgaW1wb3J0IHVybGxpYi5yZXF1ZXN0IGFzIHVybGxpYjIKICAgIGltcG9ydCB4bWxycGMuY2xpZW50IGFzIHhtbHJwY2xpYgogICAgaW1wb3J0IHF1ZXVlCiAgICBmcm9tIGh0bWwucGFyc2VyIGltcG9ydCBIVE1MUGFyc2VyCiAgICBpbXBvcnQgaHRtbC5lbnRpdGllcyBhcyBodG1sZW50aXR5ZGVmcwogICAgcmF3X2lucHV0ID0gaW5wdXQKICAgIGZyb20gaXRlcnRvb2xzIGltcG9ydCBmaWx0ZXJmYWxzZQogICAgZmlsdGVyID0gZmlsdGVyCgp0cnk6CiAgICBmcm9tIHNzbCBpbXBvcnQgbWF0Y2hfaG9zdG5hbWUsIENlcnRpZmljYXRlRXJyb3IKZXhjZXB0IEltcG9ydEVycm9yOiAjIHByYWdtYTogbm8gY292ZXIKICAgIGNsYXNzIENlcnRpZmljYXRlRXJyb3IoVmFsdWVFcnJvcik6CiAgICAgICAgcGFzcwoKCiAgICBkZWYgX2Ruc25hbWVfbWF0Y2goZG4sIGhvc3RuYW1lLCBtYXhfd2lsZGNhcmRzPTEpOgogICAgICAgICIiIk1hdGNoaW5nIGFjY29yZGluZyB0byBSRkMgNjEyNSwgc2VjdGlvbiA2LjQuMwoKICAgICAgICBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2MTI1I3NlY3Rpb24tNi40LjMKICAgICAgICAiIiIKICAgICAgICBwYXRzID0gW10KICAgICAgICBpZiBub3QgZG46CiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICBwYXJ0cyA9IGRuLnNwbGl0KCcuJykKICAgICAgICBsZWZ0bW9zdCwgcmVtYWluZGVyID0gcGFydHNbMF0sIHBhcnRzWzE6XQoKICAgICAgICB3aWxkY2FyZHMgPSBsZWZ0bW9zdC5jb3VudCgnKicpCiAgICAgICAgaWYgd2lsZGNhcmRzID4gbWF4X3dpbGRjYXJkczoKICAgICAgICAgICAgIyBJc3N1ZSAjMTc5ODA6IGF2b2lkIGRlbmlhbHMgb2Ygc2VydmljZSBieSByZWZ1c2luZyBtb3JlCiAgICAgICAgICAgICMgdGhhbiBvbmUgd2lsZGNhcmQgcGVyIGZyYWdtZW50LiAgQSBzdXJ2ZXkgb2YgZXN0YWJsaXNoZWQKICAgICAgICAgICAgIyBwb2xpY3kgYW1vbmcgU1NMIGltcGxlbWVudGF0aW9ucyBzaG93ZWQgaXQgdG8gYmUgYQogICAgICAgICAgICAjIHJlYXNvbmFibGUgY2hvaWNlLgogICAgICAgICAgICByYWlzZSBDZXJ0aWZpY2F0ZUVycm9yKAogICAgICAgICAgICAgICAgInRvbyBtYW55IHdpbGRjYXJkcyBpbiBjZXJ0aWZpY2F0ZSBETlMgbmFtZTogIiArIHJlcHIoZG4pKQoKICAgICAgICAjIHNwZWVkIHVwIGNvbW1vbiBjYXNlIHcvbyB3aWxkY2FyZHMKICAgICAgICBpZiBub3Qgd2lsZGNhcmRzOgogICAgICAgICAgICByZXR1cm4gZG4ubG93ZXIoKSA9PSBob3N0bmFtZS5sb3dlcigpCgogICAgICAgICMgUkZDIDYxMjUsIHNlY3Rpb24gNi40LjMsIHN1Yml0ZW0gMS4KICAgICAgICAjIFRoZSBjbGllbnQgU0hPVUxEIE5PVCBhdHRlbXB0IHRvIG1hdGNoIGEgcHJlc2VudGVkIGlkZW50aWZpZXIgaW4gd2hpY2gKICAgICAgICAjIHRoZSB3aWxkY2FyZCBjaGFyYWN0ZXIgY29tcHJpc2VzIGEgbGFiZWwgb3RoZXIgdGhhbiB0aGUgbGVmdC1tb3N0IGxhYmVsLgogICAgICAgIGlmIGxlZnRtb3N0ID09ICcqJzoKICAgICAgICAgICAgIyBXaGVuICcqJyBpcyBhIGZyYWdtZW50IGJ5IGl0c2VsZiwgaXQgbWF0Y2hlcyBhIG5vbi1lbXB0eSBkb3RsZXNzCiAgICAgICAgICAgICMgZnJhZ21lbnQuCiAgICAgICAgICAgIHBhdHMuYXBwZW5kKCdbXi5dKycpCiAgICAgICAgZWxpZiBsZWZ0bW9zdC5zdGFydHN3aXRoKCd4bi0tJykgb3IgaG9zdG5hbWUuc3RhcnRzd2l0aCgneG4tLScpOgogICAgICAgICAgICAjIFJGQyA2MTI1LCBzZWN0aW9uIDYuNC4zLCBzdWJpdGVtIDMuCiAgICAgICAgICAgICMgVGhlIGNsaWVudCBTSE9VTEQgTk9UIGF0dGVtcHQgdG8gbWF0Y2ggYSBwcmVzZW50ZWQgaWRlbnRpZmllcgogICAgICAgICAgICAjIHdoZXJlIHRoZSB3aWxkY2FyZCBjaGFyYWN0ZXIgaXMgZW1iZWRkZWQgd2l0aGluIGFuIEEtbGFiZWwgb3IKICAgICAgICAgICAgIyBVLWxhYmVsIG9mIGFuIGludGVybmF0aW9uYWxpemVkIGRvbWFpbiBuYW1lLgogICAgICAgICAgICBwYXRzLmFwcGVuZChyZS5lc2NhcGUobGVmdG1vc3QpKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgT3RoZXJ3aXNlLCAnKicgbWF0Y2hlcyBhbnkgZG90bGVzcyBzdHJpbmcsIGUuZy4gd3d3KgogICAgICAgICAgICBwYXRzLmFwcGVuZChyZS5lc2NhcGUobGVmdG1vc3QpLnJlcGxhY2UocidcKicsICdbXi5dKicpKQoKICAgICAgICAjIGFkZCB0aGUgcmVtYWluaW5nIGZyYWdtZW50cywgaWdub3JlIGFueSB3aWxkY2FyZHMKICAgICAgICBmb3IgZnJhZyBpbiByZW1haW5kZXI6CiAgICAgICAgICAgIHBhdHMuYXBwZW5kKHJlLmVzY2FwZShmcmFnKSkKCiAgICAgICAgcGF0ID0gcmUuY29tcGlsZShyJ1xBJyArIHInXC4nLmpvaW4ocGF0cykgKyByJ1xaJywgcmUuSUdOT1JFQ0FTRSkKICAgICAgICByZXR1cm4gcGF0Lm1hdGNoKGhvc3RuYW1lKQoKCiAgICBkZWYgbWF0Y2hfaG9zdG5hbWUoY2VydCwgaG9zdG5hbWUpOgogICAgICAgICIiIlZlcmlmeSB0aGF0ICpjZXJ0KiAoaW4gZGVjb2RlZCBmb3JtYXQgYXMgcmV0dXJuZWQgYnkKICAgICAgICBTU0xTb2NrZXQuZ2V0cGVlcmNlcnQoKSkgbWF0Y2hlcyB0aGUgKmhvc3RuYW1lKi4gIFJGQyAyODE4IGFuZCBSRkMgNjEyNQogICAgICAgIHJ1bGVzIGFyZSBmb2xsb3dlZCwgYnV0IElQIGFkZHJlc3NlcyBhcmUgbm90IGFjY2VwdGVkIGZvciAqaG9zdG5hbWUqLgoKICAgICAgICBDZXJ0aWZpY2F0ZUVycm9yIGlzIHJhaXNlZCBvbiBmYWlsdXJlLiBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24KICAgICAgICByZXR1cm5zIG5vdGhpbmcuCiAgICAgICAgIiIiCiAgICAgICAgaWYgbm90IGNlcnQ6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImVtcHR5IG9yIG5vIGNlcnRpZmljYXRlLCBtYXRjaF9ob3N0bmFtZSBuZWVkcyBhICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU1NMIHNvY2tldCBvciBTU0wgY29udGV4dCB3aXRoIGVpdGhlciAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNFUlRfT1BUSU9OQUwgb3IgQ0VSVF9SRVFVSVJFRCIpCiAgICAgICAgZG5zbmFtZXMgPSBbXQogICAgICAgIHNhbiA9IGNlcnQuZ2V0KCdzdWJqZWN0QWx0TmFtZScsICgpKQogICAgICAgIGZvciBrZXksIHZhbHVlIGluIHNhbjoKICAgICAgICAgICAgaWYga2V5ID09ICdETlMnOgogICAgICAgICAgICAgICAgaWYgX2Ruc25hbWVfbWF0Y2godmFsdWUsIGhvc3RuYW1lKToKICAgICAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgICAgIGRuc25hbWVzLmFwcGVuZCh2YWx1ZSkKICAgICAgICBpZiBub3QgZG5zbmFtZXM6CiAgICAgICAgICAgICMgVGhlIHN1YmplY3QgaXMgb25seSBjaGVja2VkIHdoZW4gdGhlcmUgaXMgbm8gZE5TTmFtZSBlbnRyeQogICAgICAgICAgICAjIGluIHN1YmplY3RBbHROYW1lCiAgICAgICAgICAgIGZvciBzdWIgaW4gY2VydC5nZXQoJ3N1YmplY3QnLCAoKSk6CiAgICAgICAgICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBzdWI6CiAgICAgICAgICAgICAgICAgICAgIyBYWFggYWNjb3JkaW5nIHRvIFJGQyAyODE4LCB0aGUgbW9zdCBzcGVjaWZpYyBDb21tb24gTmFtZQogICAgICAgICAgICAgICAgICAgICMgbXVzdCBiZSB1c2VkLgogICAgICAgICAgICAgICAgICAgIGlmIGtleSA9PSAnY29tbW9uTmFtZSc6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIF9kbnNuYW1lX21hdGNoKHZhbHVlLCBob3N0bmFtZSk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgICAgICAgICAgICAgZG5zbmFtZXMuYXBwZW5kKHZhbHVlKQogICAgICAgIGlmIGxlbihkbnNuYW1lcykgPiAxOgogICAgICAgICAgICByYWlzZSBDZXJ0aWZpY2F0ZUVycm9yKCJob3N0bmFtZSAlciAiCiAgICAgICAgICAgICAgICAiZG9lc24ndCBtYXRjaCBlaXRoZXIgb2YgJXMiCiAgICAgICAgICAgICAgICAlIChob3N0bmFtZSwgJywgJy5qb2luKG1hcChyZXByLCBkbnNuYW1lcykpKSkKICAgICAgICBlbGlmIGxlbihkbnNuYW1lcykgPT0gMToKICAgICAgICAgICAgcmFpc2UgQ2VydGlmaWNhdGVFcnJvcigiaG9zdG5hbWUgJXIgIgogICAgICAgICAgICAgICAgImRvZXNuJ3QgbWF0Y2ggJXIiCiAgICAgICAgICAgICAgICAlIChob3N0bmFtZSwgZG5zbmFtZXNbMF0pKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIENlcnRpZmljYXRlRXJyb3IoIm5vIGFwcHJvcHJpYXRlIGNvbW1vbk5hbWUgb3IgIgogICAgICAgICAgICAgICAgInN1YmplY3RBbHROYW1lIGZpZWxkcyB3ZXJlIGZvdW5kIikKCgp0cnk6CiAgICBmcm9tIHR5cGVzIGltcG9ydCBTaW1wbGVOYW1lc3BhY2UgYXMgQ29udGFpbmVyCmV4Y2VwdCBJbXBvcnRFcnJvcjogICMgcHJhZ21hOiBubyBjb3ZlcgogICAgY2xhc3MgQ29udGFpbmVyKG9iamVjdCk6CiAgICAgICAgIiIiCiAgICAgICAgQSBnZW5lcmljIGNvbnRhaW5lciBmb3Igd2hlbiBtdWx0aXBsZSB2YWx1ZXMgbmVlZCB0byBiZSByZXR1cm5lZAogICAgICAgICIiIgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqKmt3YXJncyk6CiAgICAgICAgICAgIHNlbGYuX19kaWN0X18udXBkYXRlKGt3YXJncykKCgp0cnk6CiAgICBmcm9tIHNodXRpbCBpbXBvcnQgd2hpY2gKZXhjZXB0IEltcG9ydEVycm9yOiAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICAjIEltcGxlbWVudGF0aW9uIGZyb20gUHl0aG9uIDMuMwogICAgZGVmIHdoaWNoKGNtZCwgbW9kZT1vcy5GX09LIHwgb3MuWF9PSywgcGF0aD1Ob25lKToKICAgICAgICAiIiJHaXZlbiBhIGNvbW1hbmQsIG1vZGUsIGFuZCBhIFBBVEggc3RyaW5nLCByZXR1cm4gdGhlIHBhdGggd2hpY2gKICAgICAgICBjb25mb3JtcyB0byB0aGUgZ2l2ZW4gbW9kZSBvbiB0aGUgUEFUSCwgb3IgTm9uZSBpZiB0aGVyZSBpcyBubyBzdWNoCiAgICAgICAgZmlsZS4KCiAgICAgICAgYG1vZGVgIGRlZmF1bHRzIHRvIG9zLkZfT0sgfCBvcy5YX09LLiBgcGF0aGAgZGVmYXVsdHMgdG8gdGhlIHJlc3VsdAogICAgICAgIG9mIG9zLmVudmlyb24uZ2V0KCJQQVRIIiksIG9yIGNhbiBiZSBvdmVycmlkZGVuIHdpdGggYSBjdXN0b20gc2VhcmNoCiAgICAgICAgcGF0aC4KCiAgICAgICAgIiIiCiAgICAgICAgIyBDaGVjayB0aGF0IGEgZ2l2ZW4gZmlsZSBjYW4gYmUgYWNjZXNzZWQgd2l0aCB0aGUgY29ycmVjdCBtb2RlLgogICAgICAgICMgQWRkaXRpb25hbGx5IGNoZWNrIHRoYXQgYGZpbGVgIGlzIG5vdCBhIGRpcmVjdG9yeSwgYXMgb24gV2luZG93cwogICAgICAgICMgZGlyZWN0b3JpZXMgcGFzcyB0aGUgb3MuYWNjZXNzIGNoZWNrLgogICAgICAgIGRlZiBfYWNjZXNzX2NoZWNrKGZuLCBtb2RlKToKICAgICAgICAgICAgcmV0dXJuIChvcy5wYXRoLmV4aXN0cyhmbikgYW5kIG9zLmFjY2VzcyhmbiwgbW9kZSkKICAgICAgICAgICAgICAgICAgICBhbmQgbm90IG9zLnBhdGguaXNkaXIoZm4pKQoKICAgICAgICAjIElmIHdlJ3JlIGdpdmVuIGEgcGF0aCB3aXRoIGEgZGlyZWN0b3J5IHBhcnQsIGxvb2sgaXQgdXAgZGlyZWN0bHkgcmF0aGVyCiAgICAgICAgIyB0aGFuIHJlZmVycmluZyB0byBQQVRIIGRpcmVjdG9yaWVzLiBUaGlzIGluY2x1ZGVzIGNoZWNraW5nIHJlbGF0aXZlIHRvIHRoZQogICAgICAgICMgY3VycmVudCBkaXJlY3RvcnksIGUuZy4gLi9zY3JpcHQKICAgICAgICBpZiBvcy5wYXRoLmRpcm5hbWUoY21kKToKICAgICAgICAgICAgaWYgX2FjY2Vzc19jaGVjayhjbWQsIG1vZGUpOgogICAgICAgICAgICAgICAgcmV0dXJuIGNtZAogICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgICAgICBpZiBwYXRoIGlzIE5vbmU6CiAgICAgICAgICAgIHBhdGggPSBvcy5lbnZpcm9uLmdldCgiUEFUSCIsIG9zLmRlZnBhdGgpCiAgICAgICAgaWYgbm90IHBhdGg6CiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgcGF0aCA9IHBhdGguc3BsaXQob3MucGF0aHNlcCkKCiAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICJ3aW4zMiI6CiAgICAgICAgICAgICMgVGhlIGN1cnJlbnQgZGlyZWN0b3J5IHRha2VzIHByZWNlZGVuY2Ugb24gV2luZG93cy4KICAgICAgICAgICAgaWYgbm90IG9zLmN1cmRpciBpbiBwYXRoOgogICAgICAgICAgICAgICAgcGF0aC5pbnNlcnQoMCwgb3MuY3VyZGlyKQoKICAgICAgICAgICAgIyBQQVRIRVhUIGlzIG5lY2Vzc2FyeSB0byBjaGVjayBvbiBXaW5kb3dzLgogICAgICAgICAgICBwYXRoZXh0ID0gb3MuZW52aXJvbi5nZXQoIlBBVEhFWFQiLCAiIikuc3BsaXQob3MucGF0aHNlcCkKICAgICAgICAgICAgIyBTZWUgaWYgdGhlIGdpdmVuIGZpbGUgbWF0Y2hlcyBhbnkgb2YgdGhlIGV4cGVjdGVkIHBhdGggZXh0ZW5zaW9ucy4KICAgICAgICAgICAgIyBUaGlzIHdpbGwgYWxsb3cgdXMgdG8gc2hvcnQgY2lyY3VpdCB3aGVuIGdpdmVuICJweXRob24uZXhlIi4KICAgICAgICAgICAgIyBJZiBpdCBkb2VzIG1hdGNoLCBvbmx5IHRlc3QgdGhhdCBvbmUsIG90aGVyd2lzZSB3ZSBoYXZlIHRvIHRyeQogICAgICAgICAgICAjIG90aGVycy4KICAgICAgICAgICAgaWYgYW55KGNtZC5sb3dlcigpLmVuZHN3aXRoKGV4dC5sb3dlcigpKSBmb3IgZXh0IGluIHBhdGhleHQpOgogICAgICAgICAgICAgICAgZmlsZXMgPSBbY21kXQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgZmlsZXMgPSBbY21kICsgZXh0IGZvciBleHQgaW4gcGF0aGV4dF0KICAgICAgICBlbHNlOgogICAgICAgICAgICAjIE9uIG90aGVyIHBsYXRmb3JtcyB5b3UgZG9uJ3QgaGF2ZSB0aGluZ3MgbGlrZSBQQVRIRVhUIHRvIHRlbGwgeW91CiAgICAgICAgICAgICMgd2hhdCBmaWxlIHN1ZmZpeGVzIGFyZSBleGVjdXRhYmxlLCBzbyBqdXN0IHBhc3Mgb24gY21kIGFzLWlzLgogICAgICAgICAgICBmaWxlcyA9IFtjbWRdCgogICAgICAgIHNlZW4gPSBzZXQoKQogICAgICAgIGZvciBkaXIgaW4gcGF0aDoKICAgICAgICAgICAgbm9ybWRpciA9IG9zLnBhdGgubm9ybWNhc2UoZGlyKQogICAgICAgICAgICBpZiBub3Qgbm9ybWRpciBpbiBzZWVuOgogICAgICAgICAgICAgICAgc2Vlbi5hZGQobm9ybWRpcikKICAgICAgICAgICAgICAgIGZvciB0aGVmaWxlIGluIGZpbGVzOgogICAgICAgICAgICAgICAgICAgIG5hbWUgPSBvcy5wYXRoLmpvaW4oZGlyLCB0aGVmaWxlKQogICAgICAgICAgICAgICAgICAgIGlmIF9hY2Nlc3NfY2hlY2sobmFtZSwgbW9kZSk6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuYW1lCiAgICAgICAgcmV0dXJuIE5vbmUKCgojIFppcEZpbGUgaXMgYSBjb250ZXh0IG1hbmFnZXIgaW4gMi43LCBidXQgbm90IGluIDIuNgoKZnJvbSB6aXBmaWxlIGltcG9ydCBaaXBGaWxlIGFzIEJhc2VaaXBGaWxlCgppZiBoYXNhdHRyKEJhc2VaaXBGaWxlLCAnX19lbnRlcl9fJyk6ICAjIHByYWdtYTogbm8gY292ZXIKICAgIFppcEZpbGUgPSBCYXNlWmlwRmlsZQplbHNlOgogICAgZnJvbSB6aXBmaWxlIGltcG9ydCBaaXBFeHRGaWxlIGFzIEJhc2VaaXBFeHRGaWxlCgogICAgY2xhc3MgWmlwRXh0RmlsZShCYXNlWmlwRXh0RmlsZSk6CiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGJhc2UpOgogICAgICAgICAgICBzZWxmLl9fZGljdF9fLnVwZGF0ZShiYXNlLl9fZGljdF9fKQoKICAgICAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgogICAgICAgICAgICByZXR1cm4gc2VsZgoKICAgICAgICBkZWYgX19leGl0X18oc2VsZiwgKmV4Y19pbmZvKToKICAgICAgICAgICAgc2VsZi5jbG9zZSgpCiAgICAgICAgICAgICMgcmV0dXJuIE5vbmUsIHNvIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnJlZCwgaXQgd2lsbCBwcm9wYWdhdGUKCiAgICBjbGFzcyBaaXBGaWxlKEJhc2VaaXBGaWxlKToKICAgICAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgogICAgICAgICAgICByZXR1cm4gc2VsZgoKICAgICAgICBkZWYgX19leGl0X18oc2VsZiwgKmV4Y19pbmZvKToKICAgICAgICAgICAgc2VsZi5jbG9zZSgpCiAgICAgICAgICAgICMgcmV0dXJuIE5vbmUsIHNvIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnJlZCwgaXQgd2lsbCBwcm9wYWdhdGUKCiAgICAgICAgZGVmIG9wZW4oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAgICAgYmFzZSA9IEJhc2VaaXBGaWxlLm9wZW4oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKQogICAgICAgICAgICByZXR1cm4gWmlwRXh0RmlsZShiYXNlKQoKdHJ5OgogICAgZnJvbSBwbGF0Zm9ybSBpbXBvcnQgcHl0aG9uX2ltcGxlbWVudGF0aW9uCmV4Y2VwdCBJbXBvcnRFcnJvcjogIyBwcmFnbWE6IG5vIGNvdmVyCiAgICBkZWYgcHl0aG9uX2ltcGxlbWVudGF0aW9uKCk6CiAgICAgICAgIiIiUmV0dXJuIGEgc3RyaW5nIGlkZW50aWZ5aW5nIHRoZSBQeXRob24gaW1wbGVtZW50YXRpb24uIiIiCiAgICAgICAgaWYgJ1B5UHknIGluIHN5cy52ZXJzaW9uOgogICAgICAgICAgICByZXR1cm4gJ1B5UHknCiAgICAgICAgaWYgb3MubmFtZSA9PSAnamF2YSc6CiAgICAgICAgICAgIHJldHVybiAnSnl0aG9uJwogICAgICAgIGlmIHN5cy52ZXJzaW9uLnN0YXJ0c3dpdGgoJ0lyb25QeXRob24nKToKICAgICAgICAgICAgcmV0dXJuICdJcm9uUHl0aG9uJwogICAgICAgIHJldHVybiAnQ1B5dGhvbicKCnRyeToKICAgIGltcG9ydCBzeXNjb25maWcKZXhjZXB0IEltcG9ydEVycm9yOiAjIHByYWdtYTogbm8gY292ZXIKICAgIGZyb20gLl9iYWNrcG9ydCBpbXBvcnQgc3lzY29uZmlnCgp0cnk6CiAgICBjYWxsYWJsZSA9IGNhbGxhYmxlCmV4Y2VwdCBOYW1lRXJyb3I6ICAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICBmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBDYWxsYWJsZQoKICAgIGRlZiBjYWxsYWJsZShvYmopOgogICAgICAgIHJldHVybiBpc2luc3RhbmNlKG9iaiwgQ2FsbGFibGUpCgoKdHJ5OgogICAgZnNlbmNvZGUgPSBvcy5mc2VuY29kZQogICAgZnNkZWNvZGUgPSBvcy5mc2RlY29kZQpleGNlcHQgQXR0cmlidXRlRXJyb3I6ICAjIHByYWdtYTogbm8gY292ZXIKICAgIF9mc2VuY29kaW5nID0gc3lzLmdldGZpbGVzeXN0ZW1lbmNvZGluZygpCiAgICBpZiBfZnNlbmNvZGluZyA9PSAnbWJjcyc6CiAgICAgICAgX2ZzZXJyb3JzID0gJ3N0cmljdCcKICAgIGVsc2U6CiAgICAgICAgX2ZzZXJyb3JzID0gJ3N1cnJvZ2F0ZWVzY2FwZScKCiAgICBkZWYgZnNlbmNvZGUoZmlsZW5hbWUpOgogICAgICAgIGlmIGlzaW5zdGFuY2UoZmlsZW5hbWUsIGJ5dGVzKToKICAgICAgICAgICAgcmV0dXJuIGZpbGVuYW1lCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKGZpbGVuYW1lLCB0ZXh0X3R5cGUpOgogICAgICAgICAgICByZXR1cm4gZmlsZW5hbWUuZW5jb2RlKF9mc2VuY29kaW5nLCBfZnNlcnJvcnMpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJleHBlY3QgYnl0ZXMgb3Igc3RyLCBub3QgJXMiICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUoZmlsZW5hbWUpLl9fbmFtZV9fKQoKICAgIGRlZiBmc2RlY29kZShmaWxlbmFtZSk6CiAgICAgICAgaWYgaXNpbnN0YW5jZShmaWxlbmFtZSwgdGV4dF90eXBlKToKICAgICAgICAgICAgcmV0dXJuIGZpbGVuYW1lCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKGZpbGVuYW1lLCBieXRlcyk6CiAgICAgICAgICAgIHJldHVybiBmaWxlbmFtZS5kZWNvZGUoX2ZzZW5jb2RpbmcsIF9mc2Vycm9ycykKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoImV4cGVjdCBieXRlcyBvciBzdHIsIG5vdCAlcyIgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZShmaWxlbmFtZSkuX19uYW1lX18pCgp0cnk6CiAgICBmcm9tIHRva2VuaXplIGltcG9ydCBkZXRlY3RfZW5jb2RpbmcKZXhjZXB0IEltcG9ydEVycm9yOiAjIHByYWdtYTogbm8gY292ZXIKICAgIGZyb20gY29kZWNzIGltcG9ydCBCT01fVVRGOCwgbG9va3VwCiAgICBpbXBvcnQgcmUKCiAgICBjb29raWVfcmUgPSByZS5jb21waWxlKCJjb2RpbmdbOj1dXHMqKFstXHcuXSspIikKCiAgICBkZWYgX2dldF9ub3JtYWxfbmFtZShvcmlnX2VuYyk6CiAgICAgICAgIiIiSW1pdGF0ZXMgZ2V0X25vcm1hbF9uYW1lIGluIHRva2VuaXplci5jLiIiIgogICAgICAgICMgT25seSBjYXJlIGFib3V0IHRoZSBmaXJzdCAxMiBjaGFyYWN0ZXJzLgogICAgICAgIGVuYyA9IG9yaWdfZW5jWzoxMl0ubG93ZXIoKS5yZXBsYWNlKCJfIiwgIi0iKQogICAgICAgIGlmIGVuYyA9PSAidXRmLTgiIG9yIGVuYy5zdGFydHN3aXRoKCJ1dGYtOC0iKToKICAgICAgICAgICAgcmV0dXJuICJ1dGYtOCIKICAgICAgICBpZiBlbmMgaW4gKCJsYXRpbi0xIiwgImlzby04ODU5LTEiLCAiaXNvLWxhdGluLTEiKSBvciBcCiAgICAgICAgICAgZW5jLnN0YXJ0c3dpdGgoKCJsYXRpbi0xLSIsICJpc28tODg1OS0xLSIsICJpc28tbGF0aW4tMS0iKSk6CiAgICAgICAgICAgIHJldHVybiAiaXNvLTg4NTktMSIKICAgICAgICByZXR1cm4gb3JpZ19lbmMKCiAgICBkZWYgZGV0ZWN0X2VuY29kaW5nKHJlYWRsaW5lKToKICAgICAgICAiIiIKICAgICAgICBUaGUgZGV0ZWN0X2VuY29kaW5nKCkgZnVuY3Rpb24gaXMgdXNlZCB0byBkZXRlY3QgdGhlIGVuY29kaW5nIHRoYXQgc2hvdWxkCiAgICAgICAgYmUgdXNlZCB0byBkZWNvZGUgYSBQeXRob24gc291cmNlIGZpbGUuICBJdCByZXF1aXJlcyBvbmUgYXJndW1lbnQsIHJlYWRsaW5lLAogICAgICAgIGluIHRoZSBzYW1lIHdheSBhcyB0aGUgdG9rZW5pemUoKSBnZW5lcmF0b3IuCgogICAgICAgIEl0IHdpbGwgY2FsbCByZWFkbGluZSBhIG1heGltdW0gb2YgdHdpY2UsIGFuZCByZXR1cm4gdGhlIGVuY29kaW5nIHVzZWQKICAgICAgICAoYXMgYSBzdHJpbmcpIGFuZCBhIGxpc3Qgb2YgYW55IGxpbmVzIChsZWZ0IGFzIGJ5dGVzKSBpdCBoYXMgcmVhZCBpbi4KCiAgICAgICAgSXQgZGV0ZWN0cyB0aGUgZW5jb2RpbmcgZnJvbSB0aGUgcHJlc2VuY2Ugb2YgYSB1dGYtOCBib20gb3IgYW4gZW5jb2RpbmcKICAgICAgICBjb29raWUgYXMgc3BlY2lmaWVkIGluIHBlcC0wMjYzLiAgSWYgYm90aCBhIGJvbSBhbmQgYSBjb29raWUgYXJlIHByZXNlbnQsCiAgICAgICAgYnV0IGRpc2FncmVlLCBhIFN5bnRheEVycm9yIHdpbGwgYmUgcmFpc2VkLiAgSWYgdGhlIGVuY29kaW5nIGNvb2tpZSBpcyBhbgogICAgICAgIGludmFsaWQgY2hhcnNldCwgcmFpc2UgYSBTeW50YXhFcnJvci4gIE5vdGUgdGhhdCBpZiBhIHV0Zi04IGJvbSBpcyBmb3VuZCwKICAgICAgICAndXRmLTgtc2lnJyBpcyByZXR1cm5lZC4KCiAgICAgICAgSWYgbm8gZW5jb2RpbmcgaXMgc3BlY2lmaWVkLCB0aGVuIHRoZSBkZWZhdWx0IG9mICd1dGYtOCcgd2lsbCBiZSByZXR1cm5lZC4KICAgICAgICAiIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIGZpbGVuYW1lID0gcmVhZGxpbmUuX19zZWxmX18ubmFtZQogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgZmlsZW5hbWUgPSBOb25lCiAgICAgICAgYm9tX2ZvdW5kID0gRmFsc2UKICAgICAgICBlbmNvZGluZyA9IE5vbmUKICAgICAgICBkZWZhdWx0ID0gJ3V0Zi04JwogICAgICAgIGRlZiByZWFkX29yX3N0b3AoKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcmV0dXJuIHJlYWRsaW5lKCkKICAgICAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CiAgICAgICAgICAgICAgICByZXR1cm4gYicnCgogICAgICAgIGRlZiBmaW5kX2Nvb2tpZShsaW5lKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIyBEZWNvZGUgYXMgVVRGLTguIEVpdGhlciB0aGUgbGluZSBpcyBhbiBlbmNvZGluZyBkZWNsYXJhdGlvbiwKICAgICAgICAgICAgICAgICMgaW4gd2hpY2ggY2FzZSBpdCBzaG91bGQgYmUgcHVyZSBBU0NJSSwgb3IgaXQgbXVzdCBiZSBVVEYtOAogICAgICAgICAgICAgICAgIyBwZXIgZGVmYXVsdCBlbmNvZGluZy4KICAgICAgICAgICAgICAgIGxpbmVfc3RyaW5nID0gbGluZS5kZWNvZGUoJ3V0Zi04JykKICAgICAgICAgICAgZXhjZXB0IFVuaWNvZGVEZWNvZGVFcnJvcjoKICAgICAgICAgICAgICAgIG1zZyA9ICJpbnZhbGlkIG9yIG1pc3NpbmcgZW5jb2RpbmcgZGVjbGFyYXRpb24iCiAgICAgICAgICAgICAgICBpZiBmaWxlbmFtZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICBtc2cgPSAne30gZm9yIHshcn0nLmZvcm1hdChtc2csIGZpbGVuYW1lKQogICAgICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IobXNnKQoKICAgICAgICAgICAgbWF0Y2hlcyA9IGNvb2tpZV9yZS5maW5kYWxsKGxpbmVfc3RyaW5nKQogICAgICAgICAgICBpZiBub3QgbWF0Y2hlczoKICAgICAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgICAgIGVuY29kaW5nID0gX2dldF9ub3JtYWxfbmFtZShtYXRjaGVzWzBdKQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBjb2RlYyA9IGxvb2t1cChlbmNvZGluZykKICAgICAgICAgICAgZXhjZXB0IExvb2t1cEVycm9yOgogICAgICAgICAgICAgICAgIyBUaGlzIGJlaGF2aW91ciBtaW1pY3MgdGhlIFB5dGhvbiBpbnRlcnByZXRlcgogICAgICAgICAgICAgICAgaWYgZmlsZW5hbWUgaXMgTm9uZToKICAgICAgICAgICAgICAgICAgICBtc2cgPSAidW5rbm93biBlbmNvZGluZzogIiArIGVuY29kaW5nCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIG1zZyA9ICJ1bmtub3duIGVuY29kaW5nIGZvciB7IXJ9OiB7fSIuZm9ybWF0KGZpbGVuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcpCiAgICAgICAgICAgICAgICByYWlzZSBTeW50YXhFcnJvcihtc2cpCgogICAgICAgICAgICBpZiBib21fZm91bmQ6CiAgICAgICAgICAgICAgICBpZiBjb2RlYy5uYW1lICE9ICd1dGYtOCc6CiAgICAgICAgICAgICAgICAgICAgIyBUaGlzIGJlaGF2aW91ciBtaW1pY3MgdGhlIFB5dGhvbiBpbnRlcnByZXRlcgogICAgICAgICAgICAgICAgICAgIGlmIGZpbGVuYW1lIGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgICAgICAgIG1zZyA9ICdlbmNvZGluZyBwcm9ibGVtOiB1dGYtOCcKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBtc2cgPSAnZW5jb2RpbmcgcHJvYmxlbSBmb3IgeyFyfTogdXRmLTgnLmZvcm1hdChmaWxlbmFtZSkKICAgICAgICAgICAgICAgICAgICByYWlzZSBTeW50YXhFcnJvcihtc2cpCiAgICAgICAgICAgICAgICBlbmNvZGluZyArPSAnLXNpZycKICAgICAgICAgICAgcmV0dXJuIGVuY29kaW5nCgogICAgICAgIGZpcnN0ID0gcmVhZF9vcl9zdG9wKCkKICAgICAgICBpZiBmaXJzdC5zdGFydHN3aXRoKEJPTV9VVEY4KToKICAgICAgICAgICAgYm9tX2ZvdW5kID0gVHJ1ZQogICAgICAgICAgICBmaXJzdCA9IGZpcnN0WzM6XQogICAgICAgICAgICBkZWZhdWx0ID0gJ3V0Zi04LXNpZycKICAgICAgICBpZiBub3QgZmlyc3Q6CiAgICAgICAgICAgIHJldHVybiBkZWZhdWx0LCBbXQoKICAgICAgICBlbmNvZGluZyA9IGZpbmRfY29va2llKGZpcnN0KQogICAgICAgIGlmIGVuY29kaW5nOgogICAgICAgICAgICByZXR1cm4gZW5jb2RpbmcsIFtmaXJzdF0KCiAgICAgICAgc2Vjb25kID0gcmVhZF9vcl9zdG9wKCkKICAgICAgICBpZiBub3Qgc2Vjb25kOgogICAgICAgICAgICByZXR1cm4gZGVmYXVsdCwgW2ZpcnN0XQoKICAgICAgICBlbmNvZGluZyA9IGZpbmRfY29va2llKHNlY29uZCkKICAgICAgICBpZiBlbmNvZGluZzoKICAgICAgICAgICAgcmV0dXJuIGVuY29kaW5nLCBbZmlyc3QsIHNlY29uZF0KCiAgICAgICAgcmV0dXJuIGRlZmF1bHQsIFtmaXJzdCwgc2Vjb25kXQoKIyBGb3IgY29udmVydGluZyAmIDwtPiAmYW1wOyBldGMuCnRyeToKICAgIGZyb20gaHRtbCBpbXBvcnQgZXNjYXBlCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGZyb20gY2dpIGltcG9ydCBlc2NhcGUKaWYgc3lzLnZlcnNpb25faW5mb1s6Ml0gPCAoMywgNCk6CiAgICB1bmVzY2FwZSA9IEhUTUxQYXJzZXIoKS51bmVzY2FwZQplbHNlOgogICAgZnJvbSBodG1sIGltcG9ydCB1bmVzY2FwZQoKdHJ5OgogICAgZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgQ2hhaW5NYXAKZXhjZXB0IEltcG9ydEVycm9yOiAjIHByYWdtYTogbm8gY292ZXIKICAgIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IE11dGFibGVNYXBwaW5nCgogICAgdHJ5OgogICAgICAgIGZyb20gcmVwcmxpYiBpbXBvcnQgcmVjdXJzaXZlX3JlcHIgYXMgX3JlY3Vyc2l2ZV9yZXByCiAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgZGVmIF9yZWN1cnNpdmVfcmVwcihmaWxsdmFsdWU9Jy4uLicpOgogICAgICAgICAgICAnJycKICAgICAgICAgICAgRGVjb3JhdG9yIHRvIG1ha2UgYSByZXByIGZ1bmN0aW9uIHJldHVybiBmaWxsdmFsdWUgZm9yIGEgcmVjdXJzaXZlCiAgICAgICAgICAgIGNhbGwKICAgICAgICAgICAgJycnCgogICAgICAgICAgICBkZWYgZGVjb3JhdGluZ19mdW5jdGlvbih1c2VyX2Z1bmN0aW9uKToKICAgICAgICAgICAgICAgIHJlcHJfcnVubmluZyA9IHNldCgpCgogICAgICAgICAgICAgICAgZGVmIHdyYXBwZXIoc2VsZik6CiAgICAgICAgICAgICAgICAgICAga2V5ID0gaWQoc2VsZiksIGdldF9pZGVudCgpCiAgICAgICAgICAgICAgICAgICAgaWYga2V5IGluIHJlcHJfcnVubmluZzoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbGx2YWx1ZQogICAgICAgICAgICAgICAgICAgIHJlcHJfcnVubmluZy5hZGQoa2V5KQogICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdXNlcl9mdW5jdGlvbihzZWxmKQogICAgICAgICAgICAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICAgICAgICAgICAgIHJlcHJfcnVubmluZy5kaXNjYXJkKGtleSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgICAgICAgICAgICAgIyBDYW4ndCB1c2UgZnVuY3Rvb2xzLndyYXBzKCkgaGVyZSBiZWNhdXNlIG9mIGJvb3RzdHJhcCBpc3N1ZXMKICAgICAgICAgICAgICAgIHdyYXBwZXIuX19tb2R1bGVfXyA9IGdldGF0dHIodXNlcl9mdW5jdGlvbiwgJ19fbW9kdWxlX18nKQogICAgICAgICAgICAgICAgd3JhcHBlci5fX2RvY19fID0gZ2V0YXR0cih1c2VyX2Z1bmN0aW9uLCAnX19kb2NfXycpCiAgICAgICAgICAgICAgICB3cmFwcGVyLl9fbmFtZV9fID0gZ2V0YXR0cih1c2VyX2Z1bmN0aW9uLCAnX19uYW1lX18nKQogICAgICAgICAgICAgICAgd3JhcHBlci5fX2Fubm90YXRpb25zX18gPSBnZXRhdHRyKHVzZXJfZnVuY3Rpb24sICdfX2Fubm90YXRpb25zX18nLCB7fSkKICAgICAgICAgICAgICAgIHJldHVybiB3cmFwcGVyCgogICAgICAgICAgICByZXR1cm4gZGVjb3JhdGluZ19mdW5jdGlvbgoKICAgIGNsYXNzIENoYWluTWFwKE11dGFibGVNYXBwaW5nKToKICAgICAgICAnJycgQSBDaGFpbk1hcCBncm91cHMgbXVsdGlwbGUgZGljdHMgKG9yIG90aGVyIG1hcHBpbmdzKSB0b2dldGhlcgogICAgICAgIHRvIGNyZWF0ZSBhIHNpbmdsZSwgdXBkYXRlYWJsZSB2aWV3LgoKICAgICAgICBUaGUgdW5kZXJseWluZyBtYXBwaW5ncyBhcmUgc3RvcmVkIGluIGEgbGlzdC4gIFRoYXQgbGlzdCBpcyBwdWJsaWMgYW5kIGNhbgogICAgICAgIGFjY2Vzc2VkIG9yIHVwZGF0ZWQgdXNpbmcgdGhlICptYXBzKiBhdHRyaWJ1dGUuICBUaGVyZSBpcyBubyBvdGhlciBzdGF0ZS4KCiAgICAgICAgTG9va3VwcyBzZWFyY2ggdGhlIHVuZGVybHlpbmcgbWFwcGluZ3Mgc3VjY2Vzc2l2ZWx5IHVudGlsIGEga2V5IGlzIGZvdW5kLgogICAgICAgIEluIGNvbnRyYXN0LCB3cml0ZXMsIHVwZGF0ZXMsIGFuZCBkZWxldGlvbnMgb25seSBvcGVyYXRlIG9uIHRoZSBmaXJzdAogICAgICAgIG1hcHBpbmcuCgogICAgICAgICcnJwoKICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgKm1hcHMpOgogICAgICAgICAgICAnJydJbml0aWFsaXplIGEgQ2hhaW5NYXAgYnkgc2V0dGluZyAqbWFwcyogdG8gdGhlIGdpdmVuIG1hcHBpbmdzLgogICAgICAgICAgICBJZiBubyBtYXBwaW5ncyBhcmUgcHJvdmlkZWQsIGEgc2luZ2xlIGVtcHR5IGRpY3Rpb25hcnkgaXMgdXNlZC4KCiAgICAgICAgICAgICcnJwogICAgICAgICAgICBzZWxmLm1hcHMgPSBsaXN0KG1hcHMpIG9yIFt7fV0gICAgICAgICAgIyBhbHdheXMgYXQgbGVhc3Qgb25lIG1hcAoKICAgICAgICBkZWYgX19taXNzaW5nX18oc2VsZiwga2V5KToKICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3Ioa2V5KQoKICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKICAgICAgICAgICAgZm9yIG1hcHBpbmcgaW4gc2VsZi5tYXBzOgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXBwaW5nW2tleV0gICAgICAgICAgICAgIyBjYW4ndCB1c2UgJ2tleSBpbiBtYXBwaW5nJyB3aXRoIGRlZmF1bHRkaWN0CiAgICAgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICByZXR1cm4gc2VsZi5fX21pc3NpbmdfXyhrZXkpICAgICAgICAgICAgIyBzdXBwb3J0IHN1YmNsYXNzZXMgdGhhdCBkZWZpbmUgX19taXNzaW5nX18KCiAgICAgICAgZGVmIGdldChzZWxmLCBrZXksIGRlZmF1bHQ9Tm9uZSk6CiAgICAgICAgICAgIHJldHVybiBzZWxmW2tleV0gaWYga2V5IGluIHNlbGYgZWxzZSBkZWZhdWx0CgogICAgICAgIGRlZiBfX2xlbl9fKHNlbGYpOgogICAgICAgICAgICByZXR1cm4gbGVuKHNldCgpLnVuaW9uKCpzZWxmLm1hcHMpKSAgICAgIyByZXVzZXMgc3RvcmVkIGhhc2ggdmFsdWVzIGlmIHBvc3NpYmxlCgogICAgICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICAgICAgcmV0dXJuIGl0ZXIoc2V0KCkudW5pb24oKnNlbGYubWFwcykpCgogICAgICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwga2V5KToKICAgICAgICAgICAgcmV0dXJuIGFueShrZXkgaW4gbSBmb3IgbSBpbiBzZWxmLm1hcHMpCgogICAgICAgIGRlZiBfX2Jvb2xfXyhzZWxmKToKICAgICAgICAgICAgcmV0dXJuIGFueShzZWxmLm1hcHMpCgogICAgICAgIEBfcmVjdXJzaXZlX3JlcHIoKQogICAgICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICAgICAgcmV0dXJuICd7MC5fX2NsYXNzX18uX19uYW1lX199KHsxfSknLmZvcm1hdCgKICAgICAgICAgICAgICAgIHNlbGYsICcsICcuam9pbihtYXAocmVwciwgc2VsZi5tYXBzKSkpCgogICAgICAgIEBjbGFzc21ldGhvZAogICAgICAgIGRlZiBmcm9ta2V5cyhjbHMsIGl0ZXJhYmxlLCAqYXJncyk6CiAgICAgICAgICAgICdDcmVhdGUgYSBDaGFpbk1hcCB3aXRoIGEgc2luZ2xlIGRpY3QgY3JlYXRlZCBmcm9tIHRoZSBpdGVyYWJsZS4nCiAgICAgICAgICAgIHJldHVybiBjbHMoZGljdC5mcm9ta2V5cyhpdGVyYWJsZSwgKmFyZ3MpKQoKICAgICAgICBkZWYgY29weShzZWxmKToKICAgICAgICAgICAgJ05ldyBDaGFpbk1hcCBvciBzdWJjbGFzcyB3aXRoIGEgbmV3IGNvcHkgb2YgbWFwc1swXSBhbmQgcmVmcyB0byBtYXBzWzE6XScKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKHNlbGYubWFwc1swXS5jb3B5KCksICpzZWxmLm1hcHNbMTpdKQoKICAgICAgICBfX2NvcHlfXyA9IGNvcHkKCiAgICAgICAgZGVmIG5ld19jaGlsZChzZWxmKTogICAgICAgICAgICAgICAgICAgICAgICAjIGxpa2UgRGphbmdvJ3MgQ29udGV4dC5wdXNoKCkKICAgICAgICAgICAgJ05ldyBDaGFpbk1hcCB3aXRoIGEgbmV3IGRpY3QgZm9sbG93ZWQgYnkgYWxsIHByZXZpb3VzIG1hcHMuJwogICAgICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oe30sICpzZWxmLm1hcHMpCgogICAgICAgIEBwcm9wZXJ0eQogICAgICAgIGRlZiBwYXJlbnRzKHNlbGYpOiAgICAgICAgICAgICAgICAgICAgICAgICAgIyBsaWtlIERqYW5nbydzIENvbnRleHQucG9wKCkKICAgICAgICAgICAgJ05ldyBDaGFpbk1hcCBmcm9tIG1hcHNbMTpdLicKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKCpzZWxmLm1hcHNbMTpdKQoKICAgICAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwga2V5LCB2YWx1ZSk6CiAgICAgICAgICAgIHNlbGYubWFwc1swXVtrZXldID0gdmFsdWUKCiAgICAgICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsIGtleSk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGRlbCBzZWxmLm1hcHNbMF1ba2V5XQogICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgICAgICByYWlzZSBLZXlFcnJvcignS2V5IG5vdCBmb3VuZCBpbiB0aGUgZmlyc3QgbWFwcGluZzogeyFyfScuZm9ybWF0KGtleSkpCgogICAgICAgIGRlZiBwb3BpdGVtKHNlbGYpOgogICAgICAgICAgICAnUmVtb3ZlIGFuZCByZXR1cm4gYW4gaXRlbSBwYWlyIGZyb20gbWFwc1swXS4gUmFpc2UgS2V5RXJyb3IgaXMgbWFwc1swXSBpcyBlbXB0eS4nCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLm1hcHNbMF0ucG9waXRlbSgpCiAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKCdObyBrZXlzIGZvdW5kIGluIHRoZSBmaXJzdCBtYXBwaW5nLicpCgogICAgICAgIGRlZiBwb3Aoc2VsZiwga2V5LCAqYXJncyk6CiAgICAgICAgICAgICdSZW1vdmUgKmtleSogZnJvbSBtYXBzWzBdIGFuZCByZXR1cm4gaXRzIHZhbHVlLiBSYWlzZSBLZXlFcnJvciBpZiAqa2V5KiBub3QgaW4gbWFwc1swXS4nCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLm1hcHNbMF0ucG9wKGtleSwgKmFyZ3MpCiAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKCdLZXkgbm90IGZvdW5kIGluIHRoZSBmaXJzdCBtYXBwaW5nOiB7IXJ9Jy5mb3JtYXQoa2V5KSkKCiAgICAgICAgZGVmIGNsZWFyKHNlbGYpOgogICAgICAgICAgICAnQ2xlYXIgbWFwc1swXSwgbGVhdmluZyBtYXBzWzE6XSBpbnRhY3QuJwogICAgICAgICAgICBzZWxmLm1hcHNbMF0uY2xlYXIoKQoKdHJ5OgogICAgZnJvbSBpbXAgaW1wb3J0IGNhY2hlX2Zyb21fc291cmNlCmV4Y2VwdCBJbXBvcnRFcnJvcjogIyBwcmFnbWE6IG5vIGNvdmVyCiAgICBkZWYgY2FjaGVfZnJvbV9zb3VyY2UocGF0aCwgZGVidWdfb3ZlcnJpZGU9Tm9uZSk6CiAgICAgICAgYXNzZXJ0IHBhdGguZW5kc3dpdGgoJy5weScpCiAgICAgICAgaWYgZGVidWdfb3ZlcnJpZGUgaXMgTm9uZToKICAgICAgICAgICAgZGVidWdfb3ZlcnJpZGUgPSBfX2RlYnVnX18KICAgICAgICBpZiBkZWJ1Z19vdmVycmlkZToKICAgICAgICAgICAgc3VmZml4ID0gJ2MnCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc3VmZml4ID0gJ28nCiAgICAgICAgcmV0dXJuIHBhdGggKyBzdWZmaXgKCnRyeToKICAgIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IE9yZGVyZWREaWN0CmV4Y2VwdCBJbXBvcnRFcnJvcjogIyBwcmFnbWE6IG5vIGNvdmVyCiMjIHt7eyBodHRwOi8vY29kZS5hY3RpdmVzdGF0ZS5jb20vcmVjaXBlcy81NzY2OTMvIChyOSkKIyBCYWNrcG9ydCBvZiBPcmRlcmVkRGljdCgpIGNsYXNzIHRoYXQgcnVucyBvbiBQeXRob24gMi40LCAyLjUsIDIuNiwgMi43IGFuZCBweXB5LgojIFBhc3NlcyBQeXRob24yLjcncyB0ZXN0IHN1aXRlIGFuZCBpbmNvcnBvcmF0ZXMgYWxsIHRoZSBsYXRlc3QgdXBkYXRlcy4KICAgIHRyeToKICAgICAgICBmcm9tIHRocmVhZCBpbXBvcnQgZ2V0X2lkZW50IGFzIF9nZXRfaWRlbnQKICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICBmcm9tIGR1bW15X3RocmVhZCBpbXBvcnQgZ2V0X2lkZW50IGFzIF9nZXRfaWRlbnQKCiAgICB0cnk6CiAgICAgICAgZnJvbSBfYWJjb2xsIGltcG9ydCBLZXlzVmlldywgVmFsdWVzVmlldywgSXRlbXNWaWV3CiAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgcGFzcwoKCiAgICBjbGFzcyBPcmRlcmVkRGljdChkaWN0KToKICAgICAgICAnRGljdGlvbmFyeSB0aGF0IHJlbWVtYmVycyBpbnNlcnRpb24gb3JkZXInCiAgICAgICAgIyBBbiBpbmhlcml0ZWQgZGljdCBtYXBzIGtleXMgdG8gdmFsdWVzLgogICAgICAgICMgVGhlIGluaGVyaXRlZCBkaWN0IHByb3ZpZGVzIF9fZ2V0aXRlbV9fLCBfX2xlbl9fLCBfX2NvbnRhaW5zX18sIGFuZCBnZXQuCiAgICAgICAgIyBUaGUgcmVtYWluaW5nIG1ldGhvZHMgYXJlIG9yZGVyLWF3YXJlLgogICAgICAgICMgQmlnLU8gcnVubmluZyB0aW1lcyBmb3IgYWxsIG1ldGhvZHMgYXJlIHRoZSBzYW1lIGFzIGZvciByZWd1bGFyIGRpY3Rpb25hcmllcy4KCiAgICAgICAgIyBUaGUgaW50ZXJuYWwgc2VsZi5fX21hcCBkaWN0aW9uYXJ5IG1hcHMga2V5cyB0byBsaW5rcyBpbiBhIGRvdWJseSBsaW5rZWQgbGlzdC4KICAgICAgICAjIFRoZSBjaXJjdWxhciBkb3VibHkgbGlua2VkIGxpc3Qgc3RhcnRzIGFuZCBlbmRzIHdpdGggYSBzZW50aW5lbCBlbGVtZW50LgogICAgICAgICMgVGhlIHNlbnRpbmVsIGVsZW1lbnQgbmV2ZXIgZ2V0cyBkZWxldGVkICh0aGlzIHNpbXBsaWZpZXMgdGhlIGFsZ29yaXRobSkuCiAgICAgICAgIyBFYWNoIGxpbmsgaXMgc3RvcmVkIGFzIGEgbGlzdCBvZiBsZW5ndGggdGhyZWU6ICBbUFJFViwgTkVYVCwgS0VZXS4KCiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3ZHMpOgogICAgICAgICAgICAnJydJbml0aWFsaXplIGFuIG9yZGVyZWQgZGljdGlvbmFyeS4gIFNpZ25hdHVyZSBpcyB0aGUgc2FtZSBhcyBmb3IKICAgICAgICAgICAgcmVndWxhciBkaWN0aW9uYXJpZXMsIGJ1dCBrZXl3b3JkIGFyZ3VtZW50cyBhcmUgbm90IHJlY29tbWVuZGVkCiAgICAgICAgICAgIGJlY2F1c2UgdGhlaXIgaW5zZXJ0aW9uIG9yZGVyIGlzIGFyYml0cmFyeS4KCiAgICAgICAgICAgICcnJwogICAgICAgICAgICBpZiBsZW4oYXJncykgPiAxOgogICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdleHBlY3RlZCBhdCBtb3N0IDEgYXJndW1lbnRzLCBnb3QgJWQnICUgbGVuKGFyZ3MpKQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBzZWxmLl9fcm9vdAogICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgICAgICBzZWxmLl9fcm9vdCA9IHJvb3QgPSBbXSAgICAgICAgICAgICAgICAgICAgICMgc2VudGluZWwgbm9kZQogICAgICAgICAgICAgICAgcm9vdFs6XSA9IFtyb290LCByb290LCBOb25lXQogICAgICAgICAgICAgICAgc2VsZi5fX21hcCA9IHt9CiAgICAgICAgICAgIHNlbGYuX191cGRhdGUoKmFyZ3MsICoqa3dkcykKCiAgICAgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGtleSwgdmFsdWUsIGRpY3Rfc2V0aXRlbT1kaWN0Ll9fc2V0aXRlbV9fKToKICAgICAgICAgICAgJ29kLl9fc2V0aXRlbV9fKGksIHkpIDw9PT4gb2RbaV09eScKICAgICAgICAgICAgIyBTZXR0aW5nIGEgbmV3IGl0ZW0gY3JlYXRlcyBhIG5ldyBsaW5rIHdoaWNoIGdvZXMgYXQgdGhlIGVuZCBvZiB0aGUgbGlua2VkCiAgICAgICAgICAgICMgbGlzdCwgYW5kIHRoZSBpbmhlcml0ZWQgZGljdGlvbmFyeSBpcyB1cGRhdGVkIHdpdGggdGhlIG5ldyBrZXkvdmFsdWUgcGFpci4KICAgICAgICAgICAgaWYga2V5IG5vdCBpbiBzZWxmOgogICAgICAgICAgICAgICAgcm9vdCA9IHNlbGYuX19yb290CiAgICAgICAgICAgICAgICBsYXN0ID0gcm9vdFswXQogICAgICAgICAgICAgICAgbGFzdFsxXSA9IHJvb3RbMF0gPSBzZWxmLl9fbWFwW2tleV0gPSBbbGFzdCwgcm9vdCwga2V5XQogICAgICAgICAgICBkaWN0X3NldGl0ZW0oc2VsZiwga2V5LCB2YWx1ZSkKCiAgICAgICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsIGtleSwgZGljdF9kZWxpdGVtPWRpY3QuX19kZWxpdGVtX18pOgogICAgICAgICAgICAnb2QuX19kZWxpdGVtX18oeSkgPD09PiBkZWwgb2RbeV0nCiAgICAgICAgICAgICMgRGVsZXRpbmcgYW4gZXhpc3RpbmcgaXRlbSB1c2VzIHNlbGYuX19tYXAgdG8gZmluZCB0aGUgbGluayB3aGljaCBpcwogICAgICAgICAgICAjIHRoZW4gcmVtb3ZlZCBieSB1cGRhdGluZyB0aGUgbGlua3MgaW4gdGhlIHByZWRlY2Vzc29yIGFuZCBzdWNjZXNzb3Igbm9kZXMuCiAgICAgICAgICAgIGRpY3RfZGVsaXRlbShzZWxmLCBrZXkpCiAgICAgICAgICAgIGxpbmtfcHJldiwgbGlua19uZXh0LCBrZXkgPSBzZWxmLl9fbWFwLnBvcChrZXkpCiAgICAgICAgICAgIGxpbmtfcHJldlsxXSA9IGxpbmtfbmV4dAogICAgICAgICAgICBsaW5rX25leHRbMF0gPSBsaW5rX3ByZXYKCiAgICAgICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgICAgICAnb2QuX19pdGVyX18oKSA8PT0+IGl0ZXIob2QpJwogICAgICAgICAgICByb290ID0gc2VsZi5fX3Jvb3QKICAgICAgICAgICAgY3VyciA9IHJvb3RbMV0KICAgICAgICAgICAgd2hpbGUgY3VyciBpcyBub3Qgcm9vdDoKICAgICAgICAgICAgICAgIHlpZWxkIGN1cnJbMl0KICAgICAgICAgICAgICAgIGN1cnIgPSBjdXJyWzFdCgogICAgICAgIGRlZiBfX3JldmVyc2VkX18oc2VsZik6CiAgICAgICAgICAgICdvZC5fX3JldmVyc2VkX18oKSA8PT0+IHJldmVyc2VkKG9kKScKICAgICAgICAgICAgcm9vdCA9IHNlbGYuX19yb290CiAgICAgICAgICAgIGN1cnIgPSByb290WzBdCiAgICAgICAgICAgIHdoaWxlIGN1cnIgaXMgbm90IHJvb3Q6CiAgICAgICAgICAgICAgICB5aWVsZCBjdXJyWzJdCiAgICAgICAgICAgICAgICBjdXJyID0gY3VyclswXQoKICAgICAgICBkZWYgY2xlYXIoc2VsZik6CiAgICAgICAgICAgICdvZC5jbGVhcigpIC0+IE5vbmUuICBSZW1vdmUgYWxsIGl0ZW1zIGZyb20gb2QuJwogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBmb3Igbm9kZSBpbiBzZWxmLl9fbWFwLml0ZXJ2YWx1ZXMoKToKICAgICAgICAgICAgICAgICAgICBkZWwgbm9kZVs6XQogICAgICAgICAgICAgICAgcm9vdCA9IHNlbGYuX19yb290CiAgICAgICAgICAgICAgICByb290WzpdID0gW3Jvb3QsIHJvb3QsIE5vbmVdCiAgICAgICAgICAgICAgICBzZWxmLl9fbWFwLmNsZWFyKCkKICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICBkaWN0LmNsZWFyKHNlbGYpCgogICAgICAgIGRlZiBwb3BpdGVtKHNlbGYsIGxhc3Q9VHJ1ZSk6CiAgICAgICAgICAgICcnJ29kLnBvcGl0ZW0oKSAtPiAoaywgdiksIHJldHVybiBhbmQgcmVtb3ZlIGEgKGtleSwgdmFsdWUpIHBhaXIuCiAgICAgICAgICAgIFBhaXJzIGFyZSByZXR1cm5lZCBpbiBMSUZPIG9yZGVyIGlmIGxhc3QgaXMgdHJ1ZSBvciBGSUZPIG9yZGVyIGlmIGZhbHNlLgoKICAgICAgICAgICAgJycnCiAgICAgICAgICAgIGlmIG5vdCBzZWxmOgogICAgICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IoJ2RpY3Rpb25hcnkgaXMgZW1wdHknKQogICAgICAgICAgICByb290ID0gc2VsZi5fX3Jvb3QKICAgICAgICAgICAgaWYgbGFzdDoKICAgICAgICAgICAgICAgIGxpbmsgPSByb290WzBdCiAgICAgICAgICAgICAgICBsaW5rX3ByZXYgPSBsaW5rWzBdCiAgICAgICAgICAgICAgICBsaW5rX3ByZXZbMV0gPSByb290CiAgICAgICAgICAgICAgICByb290WzBdID0gbGlua19wcmV2CiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBsaW5rID0gcm9vdFsxXQogICAgICAgICAgICAgICAgbGlua19uZXh0ID0gbGlua1sxXQogICAgICAgICAgICAgICAgcm9vdFsxXSA9IGxpbmtfbmV4dAogICAgICAgICAgICAgICAgbGlua19uZXh0WzBdID0gcm9vdAogICAgICAgICAgICBrZXkgPSBsaW5rWzJdCiAgICAgICAgICAgIGRlbCBzZWxmLl9fbWFwW2tleV0KICAgICAgICAgICAgdmFsdWUgPSBkaWN0LnBvcChzZWxmLCBrZXkpCiAgICAgICAgICAgIHJldHVybiBrZXksIHZhbHVlCgogICAgICAgICMgLS0gdGhlIGZvbGxvd2luZyBtZXRob2RzIGRvIG5vdCBkZXBlbmQgb24gdGhlIGludGVybmFsIHN0cnVjdHVyZSAtLQoKICAgICAgICBkZWYga2V5cyhzZWxmKToKICAgICAgICAgICAgJ29kLmtleXMoKSAtPiBsaXN0IG9mIGtleXMgaW4gb2QnCiAgICAgICAgICAgIHJldHVybiBsaXN0KHNlbGYpCgogICAgICAgIGRlZiB2YWx1ZXMoc2VsZik6CiAgICAgICAgICAgICdvZC52YWx1ZXMoKSAtPiBsaXN0IG9mIHZhbHVlcyBpbiBvZCcKICAgICAgICAgICAgcmV0dXJuIFtzZWxmW2tleV0gZm9yIGtleSBpbiBzZWxmXQoKICAgICAgICBkZWYgaXRlbXMoc2VsZik6CiAgICAgICAgICAgICdvZC5pdGVtcygpIC0+IGxpc3Qgb2YgKGtleSwgdmFsdWUpIHBhaXJzIGluIG9kJwogICAgICAgICAgICByZXR1cm4gWyhrZXksIHNlbGZba2V5XSkgZm9yIGtleSBpbiBzZWxmXQoKICAgICAgICBkZWYgaXRlcmtleXMoc2VsZik6CiAgICAgICAgICAgICdvZC5pdGVya2V5cygpIC0+IGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGtleXMgaW4gb2QnCiAgICAgICAgICAgIHJldHVybiBpdGVyKHNlbGYpCgogICAgICAgIGRlZiBpdGVydmFsdWVzKHNlbGYpOgogICAgICAgICAgICAnb2QuaXRlcnZhbHVlcyAtPiBhbiBpdGVyYXRvciBvdmVyIHRoZSB2YWx1ZXMgaW4gb2QnCiAgICAgICAgICAgIGZvciBrIGluIHNlbGY6CiAgICAgICAgICAgICAgICB5aWVsZCBzZWxmW2tdCgogICAgICAgIGRlZiBpdGVyaXRlbXMoc2VsZik6CiAgICAgICAgICAgICdvZC5pdGVyaXRlbXMgLT4gYW4gaXRlcmF0b3Igb3ZlciB0aGUgKGtleSwgdmFsdWUpIGl0ZW1zIGluIG9kJwogICAgICAgICAgICBmb3IgayBpbiBzZWxmOgogICAgICAgICAgICAgICAgeWllbGQgKGssIHNlbGZba10pCgogICAgICAgIGRlZiB1cGRhdGUoKmFyZ3MsICoqa3dkcyk6CiAgICAgICAgICAgICcnJ29kLnVwZGF0ZShFLCAqKkYpIC0+IE5vbmUuICBVcGRhdGUgb2QgZnJvbSBkaWN0L2l0ZXJhYmxlIEUgYW5kIEYuCgogICAgICAgICAgICBJZiBFIGlzIGEgZGljdCBpbnN0YW5jZSwgZG9lczogICAgICAgICAgIGZvciBrIGluIEU6IG9kW2tdID0gRVtrXQogICAgICAgICAgICBJZiBFIGhhcyBhIC5rZXlzKCkgbWV0aG9kLCBkb2VzOiAgICAgICAgIGZvciBrIGluIEUua2V5cygpOiBvZFtrXSA9IEVba10KICAgICAgICAgICAgT3IgaWYgRSBpcyBhbiBpdGVyYWJsZSBvZiBpdGVtcywgZG9lczogICBmb3IgaywgdiBpbiBFOiBvZFtrXSA9IHYKICAgICAgICAgICAgSW4gZWl0aGVyIGNhc2UsIHRoaXMgaXMgZm9sbG93ZWQgYnk6ICAgICBmb3IgaywgdiBpbiBGLml0ZW1zKCk6IG9kW2tdID0gdgoKICAgICAgICAgICAgJycnCiAgICAgICAgICAgIGlmIGxlbihhcmdzKSA+IDI6CiAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ3VwZGF0ZSgpIHRha2VzIGF0IG1vc3QgMiBwb3NpdGlvbmFsICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXJndW1lbnRzICglZCBnaXZlbiknICUgKGxlbihhcmdzKSwpKQogICAgICAgICAgICBlbGlmIG5vdCBhcmdzOgogICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCd1cGRhdGUoKSB0YWtlcyBhdCBsZWFzdCAxIGFyZ3VtZW50ICgwIGdpdmVuKScpCiAgICAgICAgICAgIHNlbGYgPSBhcmdzWzBdCiAgICAgICAgICAgICMgTWFrZSBwcm9ncmVzc2l2ZWx5IHdlYWtlciBhc3N1bXB0aW9ucyBhYm91dCAib3RoZXIiCiAgICAgICAgICAgIG90aGVyID0gKCkKICAgICAgICAgICAgaWYgbGVuKGFyZ3MpID09IDI6CiAgICAgICAgICAgICAgICBvdGhlciA9IGFyZ3NbMV0KICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgZGljdCk6CiAgICAgICAgICAgICAgICBmb3Iga2V5IGluIG90aGVyOgogICAgICAgICAgICAgICAgICAgIHNlbGZba2V5XSA9IG90aGVyW2tleV0KICAgICAgICAgICAgZWxpZiBoYXNhdHRyKG90aGVyLCAna2V5cycpOgogICAgICAgICAgICAgICAgZm9yIGtleSBpbiBvdGhlci5rZXlzKCk6CiAgICAgICAgICAgICAgICAgICAgc2VsZltrZXldID0gb3RoZXJba2V5XQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gb3RoZXI6CiAgICAgICAgICAgICAgICAgICAgc2VsZltrZXldID0gdmFsdWUKICAgICAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4ga3dkcy5pdGVtcygpOgogICAgICAgICAgICAgICAgc2VsZltrZXldID0gdmFsdWUKCiAgICAgICAgX191cGRhdGUgPSB1cGRhdGUgICMgbGV0IHN1YmNsYXNzZXMgb3ZlcnJpZGUgdXBkYXRlIHdpdGhvdXQgYnJlYWtpbmcgX19pbml0X18KCiAgICAgICAgX19tYXJrZXIgPSBvYmplY3QoKQoKICAgICAgICBkZWYgcG9wKHNlbGYsIGtleSwgZGVmYXVsdD1fX21hcmtlcik6CiAgICAgICAgICAgICcnJ29kLnBvcChrWyxkXSkgLT4gdiwgcmVtb3ZlIHNwZWNpZmllZCBrZXkgYW5kIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZS4KICAgICAgICAgICAgSWYga2V5IGlzIG5vdCBmb3VuZCwgZCBpcyByZXR1cm5lZCBpZiBnaXZlbiwgb3RoZXJ3aXNlIEtleUVycm9yIGlzIHJhaXNlZC4KCiAgICAgICAgICAgICcnJwogICAgICAgICAgICBpZiBrZXkgaW4gc2VsZjoKICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNlbGZba2V5XQogICAgICAgICAgICAgICAgZGVsIHNlbGZba2V5XQogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAogICAgICAgICAgICBpZiBkZWZhdWx0IGlzIHNlbGYuX19tYXJrZXI6CiAgICAgICAgICAgICAgICByYWlzZSBLZXlFcnJvcihrZXkpCiAgICAgICAgICAgIHJldHVybiBkZWZhdWx0CgogICAgICAgIGRlZiBzZXRkZWZhdWx0KHNlbGYsIGtleSwgZGVmYXVsdD1Ob25lKToKICAgICAgICAgICAgJ29kLnNldGRlZmF1bHQoa1ssZF0pIC0+IG9kLmdldChrLGQpLCBhbHNvIHNldCBvZFtrXT1kIGlmIGsgbm90IGluIG9kJwogICAgICAgICAgICBpZiBrZXkgaW4gc2VsZjoKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmW2tleV0KICAgICAgICAgICAgc2VsZltrZXldID0gZGVmYXVsdAogICAgICAgICAgICByZXR1cm4gZGVmYXVsdAoKICAgICAgICBkZWYgX19yZXByX18oc2VsZiwgX3JlcHJfcnVubmluZz1Ob25lKToKICAgICAgICAgICAgJ29kLl9fcmVwcl9fKCkgPD09PiByZXByKG9kKScKICAgICAgICAgICAgaWYgbm90IF9yZXByX3J1bm5pbmc6IF9yZXByX3J1bm5pbmcgPSB7fQogICAgICAgICAgICBjYWxsX2tleSA9IGlkKHNlbGYpLCBfZ2V0X2lkZW50KCkKICAgICAgICAgICAgaWYgY2FsbF9rZXkgaW4gX3JlcHJfcnVubmluZzoKICAgICAgICAgICAgICAgIHJldHVybiAnLi4uJwogICAgICAgICAgICBfcmVwcl9ydW5uaW5nW2NhbGxfa2V5XSA9IDEKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgaWYgbm90IHNlbGY6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICclcygpJyAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywpCiAgICAgICAgICAgICAgICByZXR1cm4gJyVzKCVyKScgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHNlbGYuaXRlbXMoKSkKICAgICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgICAgIGRlbCBfcmVwcl9ydW5uaW5nW2NhbGxfa2V5XQoKICAgICAgICBkZWYgX19yZWR1Y2VfXyhzZWxmKToKICAgICAgICAgICAgJ1JldHVybiBzdGF0ZSBpbmZvcm1hdGlvbiBmb3IgcGlja2xpbmcnCiAgICAgICAgICAgIGl0ZW1zID0gW1trLCBzZWxmW2tdXSBmb3IgayBpbiBzZWxmXQogICAgICAgICAgICBpbnN0X2RpY3QgPSB2YXJzKHNlbGYpLmNvcHkoKQogICAgICAgICAgICBmb3IgayBpbiB2YXJzKE9yZGVyZWREaWN0KCkpOgogICAgICAgICAgICAgICAgaW5zdF9kaWN0LnBvcChrLCBOb25lKQogICAgICAgICAgICBpZiBpbnN0X2RpY3Q6CiAgICAgICAgICAgICAgICByZXR1cm4gKHNlbGYuX19jbGFzc19fLCAoaXRlbXMsKSwgaW5zdF9kaWN0KQogICAgICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18sIChpdGVtcywpCgogICAgICAgIGRlZiBjb3B5KHNlbGYpOgogICAgICAgICAgICAnb2QuY29weSgpIC0+IGEgc2hhbGxvdyBjb3B5IG9mIG9kJwogICAgICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZikKCiAgICAgICAgQGNsYXNzbWV0aG9kCiAgICAgICAgZGVmIGZyb21rZXlzKGNscywgaXRlcmFibGUsIHZhbHVlPU5vbmUpOgogICAgICAgICAgICAnJydPRC5mcm9ta2V5cyhTWywgdl0pIC0+IE5ldyBvcmRlcmVkIGRpY3Rpb25hcnkgd2l0aCBrZXlzIGZyb20gUwogICAgICAgICAgICBhbmQgdmFsdWVzIGVxdWFsIHRvIHYgKHdoaWNoIGRlZmF1bHRzIHRvIE5vbmUpLgoKICAgICAgICAgICAgJycnCiAgICAgICAgICAgIGQgPSBjbHMoKQogICAgICAgICAgICBmb3Iga2V5IGluIGl0ZXJhYmxlOgogICAgICAgICAgICAgICAgZFtrZXldID0gdmFsdWUKICAgICAgICAgICAgcmV0dXJuIGQKCiAgICAgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgICAgICcnJ29kLl9fZXFfXyh5KSA8PT0+IG9kPT15LiAgQ29tcGFyaXNvbiB0byBhbm90aGVyIE9EIGlzIG9yZGVyLXNlbnNpdGl2ZQogICAgICAgICAgICB3aGlsZSBjb21wYXJpc29uIHRvIGEgcmVndWxhciBtYXBwaW5nIGlzIG9yZGVyLWluc2Vuc2l0aXZlLgoKICAgICAgICAgICAgJycnCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIE9yZGVyZWREaWN0KToKICAgICAgICAgICAgICAgIHJldHVybiBsZW4oc2VsZik9PWxlbihvdGhlcikgYW5kIHNlbGYuaXRlbXMoKSA9PSBvdGhlci5pdGVtcygpCiAgICAgICAgICAgIHJldHVybiBkaWN0Ll9fZXFfXyhzZWxmLCBvdGhlcikKCiAgICAgICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgICAgIHJldHVybiBub3Qgc2VsZiA9PSBvdGhlcgoKICAgICAgICAjIC0tIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyBhcmUgb25seSB1c2VkIGluIFB5dGhvbiAyLjcgLS0KCiAgICAgICAgZGVmIHZpZXdrZXlzKHNlbGYpOgogICAgICAgICAgICAib2Qudmlld2tleXMoKSAtPiBhIHNldC1saWtlIG9iamVjdCBwcm92aWRpbmcgYSB2aWV3IG9uIG9kJ3Mga2V5cyIKICAgICAgICAgICAgcmV0dXJuIEtleXNWaWV3KHNlbGYpCgogICAgICAgIGRlZiB2aWV3dmFsdWVzKHNlbGYpOgogICAgICAgICAgICAib2Qudmlld3ZhbHVlcygpIC0+IGFuIG9iamVjdCBwcm92aWRpbmcgYSB2aWV3IG9uIG9kJ3MgdmFsdWVzIgogICAgICAgICAgICByZXR1cm4gVmFsdWVzVmlldyhzZWxmKQoKICAgICAgICBkZWYgdmlld2l0ZW1zKHNlbGYpOgogICAgICAgICAgICAib2Qudmlld2l0ZW1zKCkgLT4gYSBzZXQtbGlrZSBvYmplY3QgcHJvdmlkaW5nIGEgdmlldyBvbiBvZCdzIGl0ZW1zIgogICAgICAgICAgICByZXR1cm4gSXRlbXNWaWV3KHNlbGYpCgp0cnk6CiAgICBmcm9tIGxvZ2dpbmcuY29uZmlnIGltcG9ydCBCYXNlQ29uZmlndXJhdG9yLCB2YWxpZF9pZGVudApleGNlcHQgSW1wb3J0RXJyb3I6ICMgcHJhZ21hOiBubyBjb3ZlcgogICAgSURFTlRJRklFUiA9IHJlLmNvbXBpbGUoJ15bYS16X11bYS16MC05X10qJCcsIHJlLkkpCgoKICAgIGRlZiB2YWxpZF9pZGVudChzKToKICAgICAgICBtID0gSURFTlRJRklFUi5tYXRjaChzKQogICAgICAgIGlmIG5vdCBtOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdOb3QgYSB2YWxpZCBQeXRob24gaWRlbnRpZmllcjogJXInICUgcykKICAgICAgICByZXR1cm4gVHJ1ZQoKCiAgICAjIFRoZSBDb252ZXJ0aW5nWFhYIGNsYXNzZXMgYXJlIHdyYXBwZXJzIGFyb3VuZCBzdGFuZGFyZCBQeXRob24gY29udGFpbmVycywKICAgICMgYW5kIHRoZXkgc2VydmUgdG8gY29udmVydCBhbnkgc3VpdGFibGUgdmFsdWVzIGluIHRoZSBjb250YWluZXIuIFRoZQogICAgIyBjb252ZXJzaW9uIGNvbnZlcnRzIGJhc2UgZGljdHMsIGxpc3RzIGFuZCB0dXBsZXMgdG8gdGhlaXIgd3JhcHBlZAogICAgIyBlcXVpdmFsZW50cywgd2hlcmVhcyBzdHJpbmdzIHdoaWNoIG1hdGNoIGEgY29udmVyc2lvbiBmb3JtYXQgYXJlIGNvbnZlcnRlZAogICAgIyBhcHByb3ByaWF0ZWx5LgogICAgIwogICAgIyBFYWNoIHdyYXBwZXIgc2hvdWxkIGhhdmUgYSBjb25maWd1cmF0b3IgYXR0cmlidXRlIGhvbGRpbmcgdGhlIGFjdHVhbAogICAgIyBjb25maWd1cmF0b3IgdG8gdXNlIGZvciBjb252ZXJzaW9uLgoKICAgIGNsYXNzIENvbnZlcnRpbmdEaWN0KGRpY3QpOgogICAgICAgICIiIkEgY29udmVydGluZyBkaWN0aW9uYXJ5IHdyYXBwZXIuIiIiCgogICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgogICAgICAgICAgICB2YWx1ZSA9IGRpY3QuX19nZXRpdGVtX18oc2VsZiwga2V5KQogICAgICAgICAgICByZXN1bHQgPSBzZWxmLmNvbmZpZ3VyYXRvci5jb252ZXJ0KHZhbHVlKQogICAgICAgICAgICAjSWYgdGhlIGNvbnZlcnRlZCB2YWx1ZSBpcyBkaWZmZXJlbnQsIHNhdmUgZm9yIG5leHQgdGltZQogICAgICAgICAgICBpZiB2YWx1ZSBpcyBub3QgcmVzdWx0OgogICAgICAgICAgICAgICAgc2VsZltrZXldID0gcmVzdWx0CiAgICAgICAgICAgICAgICBpZiB0eXBlKHJlc3VsdCkgaW4gKENvbnZlcnRpbmdEaWN0LCBDb252ZXJ0aW5nTGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udmVydGluZ1R1cGxlKToKICAgICAgICAgICAgICAgICAgICByZXN1bHQucGFyZW50ID0gc2VsZgogICAgICAgICAgICAgICAgICAgIHJlc3VsdC5rZXkgPSBrZXkKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgICAgICBkZWYgZ2V0KHNlbGYsIGtleSwgZGVmYXVsdD1Ob25lKToKICAgICAgICAgICAgdmFsdWUgPSBkaWN0LmdldChzZWxmLCBrZXksIGRlZmF1bHQpCiAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuY29uZmlndXJhdG9yLmNvbnZlcnQodmFsdWUpCiAgICAgICAgICAgICNJZiB0aGUgY29udmVydGVkIHZhbHVlIGlzIGRpZmZlcmVudCwgc2F2ZSBmb3IgbmV4dCB0aW1lCiAgICAgICAgICAgIGlmIHZhbHVlIGlzIG5vdCByZXN1bHQ6CiAgICAgICAgICAgICAgICBzZWxmW2tleV0gPSByZXN1bHQKICAgICAgICAgICAgICAgIGlmIHR5cGUocmVzdWx0KSBpbiAoQ29udmVydGluZ0RpY3QsIENvbnZlcnRpbmdMaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb252ZXJ0aW5nVHVwbGUpOgogICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wYXJlbnQgPSBzZWxmCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IGtleQogICAgICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIHBvcChzZWxmLCBrZXksIGRlZmF1bHQ9Tm9uZSk6CiAgICAgICAgdmFsdWUgPSBkaWN0LnBvcChzZWxmLCBrZXksIGRlZmF1bHQpCiAgICAgICAgcmVzdWx0ID0gc2VsZi5jb25maWd1cmF0b3IuY29udmVydCh2YWx1ZSkKICAgICAgICBpZiB2YWx1ZSBpcyBub3QgcmVzdWx0OgogICAgICAgICAgICBpZiB0eXBlKHJlc3VsdCkgaW4gKENvbnZlcnRpbmdEaWN0LCBDb252ZXJ0aW5nTGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb252ZXJ0aW5nVHVwbGUpOgogICAgICAgICAgICAgICAgcmVzdWx0LnBhcmVudCA9IHNlbGYKICAgICAgICAgICAgICAgIHJlc3VsdC5rZXkgPSBrZXkKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgY2xhc3MgQ29udmVydGluZ0xpc3QobGlzdCk6CiAgICAgICAgIiIiQSBjb252ZXJ0aW5nIGxpc3Qgd3JhcHBlci4iIiIKICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKICAgICAgICAgICAgdmFsdWUgPSBsaXN0Ll9fZ2V0aXRlbV9fKHNlbGYsIGtleSkKICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5jb25maWd1cmF0b3IuY29udmVydCh2YWx1ZSkKICAgICAgICAgICAgI0lmIHRoZSBjb252ZXJ0ZWQgdmFsdWUgaXMgZGlmZmVyZW50LCBzYXZlIGZvciBuZXh0IHRpbWUKICAgICAgICAgICAgaWYgdmFsdWUgaXMgbm90IHJlc3VsdDoKICAgICAgICAgICAgICAgIHNlbGZba2V5XSA9IHJlc3VsdAogICAgICAgICAgICAgICAgaWYgdHlwZShyZXN1bHQpIGluIChDb252ZXJ0aW5nRGljdCwgQ29udmVydGluZ0xpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnZlcnRpbmdUdXBsZSk6CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnBhcmVudCA9IHNlbGYKICAgICAgICAgICAgICAgICAgICByZXN1bHQua2V5ID0ga2V5CiAgICAgICAgICAgIHJldHVybiByZXN1bHQKCiAgICAgICAgZGVmIHBvcChzZWxmLCBpZHg9LTEpOgogICAgICAgICAgICB2YWx1ZSA9IGxpc3QucG9wKHNlbGYsIGlkeCkKICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5jb25maWd1cmF0b3IuY29udmVydCh2YWx1ZSkKICAgICAgICAgICAgaWYgdmFsdWUgaXMgbm90IHJlc3VsdDoKICAgICAgICAgICAgICAgIGlmIHR5cGUocmVzdWx0KSBpbiAoQ29udmVydGluZ0RpY3QsIENvbnZlcnRpbmdMaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb252ZXJ0aW5nVHVwbGUpOgogICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wYXJlbnQgPSBzZWxmCiAgICAgICAgICAgIHJldHVybiByZXN1bHQKCiAgICBjbGFzcyBDb252ZXJ0aW5nVHVwbGUodHVwbGUpOgogICAgICAgICIiIkEgY29udmVydGluZyB0dXBsZSB3cmFwcGVyLiIiIgogICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgogICAgICAgICAgICB2YWx1ZSA9IHR1cGxlLl9fZ2V0aXRlbV9fKHNlbGYsIGtleSkKICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5jb25maWd1cmF0b3IuY29udmVydCh2YWx1ZSkKICAgICAgICAgICAgaWYgdmFsdWUgaXMgbm90IHJlc3VsdDoKICAgICAgICAgICAgICAgIGlmIHR5cGUocmVzdWx0KSBpbiAoQ29udmVydGluZ0RpY3QsIENvbnZlcnRpbmdMaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb252ZXJ0aW5nVHVwbGUpOgogICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wYXJlbnQgPSBzZWxmCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IGtleQogICAgICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgY2xhc3MgQmFzZUNvbmZpZ3VyYXRvcihvYmplY3QpOgogICAgICAgICIiIgogICAgICAgIFRoZSBjb25maWd1cmF0b3IgYmFzZSBjbGFzcyB3aGljaCBkZWZpbmVzIHNvbWUgdXNlZnVsIGRlZmF1bHRzLgogICAgICAgICIiIgoKICAgICAgICBDT05WRVJUX1BBVFRFUk4gPSByZS5jb21waWxlKHInXig/UDxwcmVmaXg+W2Etel0rKTovLyg/UDxzdWZmaXg+LiopJCcpCgogICAgICAgIFdPUkRfUEFUVEVSTiA9IHJlLmNvbXBpbGUocideXHMqKFx3KylccyonKQogICAgICAgIERPVF9QQVRURVJOID0gcmUuY29tcGlsZShyJ15cLlxzKihcdyspXHMqJykKICAgICAgICBJTkRFWF9QQVRURVJOID0gcmUuY29tcGlsZShyJ15cW1xzKihcdyspXHMqXF1ccyonKQogICAgICAgIERJR0lUX1BBVFRFUk4gPSByZS5jb21waWxlKHInXlxkKyQnKQoKICAgICAgICB2YWx1ZV9jb252ZXJ0ZXJzID0gewogICAgICAgICAgICAnZXh0JyA6ICdleHRfY29udmVydCcsCiAgICAgICAgICAgICdjZmcnIDogJ2NmZ19jb252ZXJ0JywKICAgICAgICB9CgogICAgICAgICMgV2UgbWlnaHQgd2FudCB0byB1c2UgYSBkaWZmZXJlbnQgb25lLCBlLmcuIGltcG9ydGxpYgogICAgICAgIGltcG9ydGVyID0gc3RhdGljbWV0aG9kKF9faW1wb3J0X18pCgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb25maWcpOgogICAgICAgICAgICBzZWxmLmNvbmZpZyA9IENvbnZlcnRpbmdEaWN0KGNvbmZpZykKICAgICAgICAgICAgc2VsZi5jb25maWcuY29uZmlndXJhdG9yID0gc2VsZgoKICAgICAgICBkZWYgcmVzb2x2ZShzZWxmLCBzKToKICAgICAgICAgICAgIiIiCiAgICAgICAgICAgIFJlc29sdmUgc3RyaW5ncyB0byBvYmplY3RzIHVzaW5nIHN0YW5kYXJkIGltcG9ydCBhbmQgYXR0cmlidXRlCiAgICAgICAgICAgIHN5bnRheC4KICAgICAgICAgICAgIiIiCiAgICAgICAgICAgIG5hbWUgPSBzLnNwbGl0KCcuJykKICAgICAgICAgICAgdXNlZCA9IG5hbWUucG9wKDApCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGZvdW5kID0gc2VsZi5pbXBvcnRlcih1c2VkKQogICAgICAgICAgICAgICAgZm9yIGZyYWcgaW4gbmFtZToKICAgICAgICAgICAgICAgICAgICB1c2VkICs9ICcuJyArIGZyYWcKICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gZ2V0YXR0cihmb3VuZCwgZnJhZykKICAgICAgICAgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaW1wb3J0ZXIodXNlZCkKICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBnZXRhdHRyKGZvdW5kLCBmcmFnKQogICAgICAgICAgICAgICAgcmV0dXJuIGZvdW5kCiAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICAgICAgICAgIGUsIHRiID0gc3lzLmV4Y19pbmZvKClbMTpdCiAgICAgICAgICAgICAgICB2ID0gVmFsdWVFcnJvcignQ2Fubm90IHJlc29sdmUgJXI6ICVzJyAlIChzLCBlKSkKICAgICAgICAgICAgICAgIHYuX19jYXVzZV9fLCB2Ll9fdHJhY2ViYWNrX18gPSBlLCB0YgogICAgICAgICAgICAgICAgcmFpc2UgdgoKICAgICAgICBkZWYgZXh0X2NvbnZlcnQoc2VsZiwgdmFsdWUpOgogICAgICAgICAgICAiIiJEZWZhdWx0IGNvbnZlcnRlciBmb3IgdGhlIGV4dDovLyBwcm90b2NvbC4iIiIKICAgICAgICAgICAgcmV0dXJuIHNlbGYucmVzb2x2ZSh2YWx1ZSkKCiAgICAgICAgZGVmIGNmZ19jb252ZXJ0KHNlbGYsIHZhbHVlKToKICAgICAgICAgICAgIiIiRGVmYXVsdCBjb252ZXJ0ZXIgZm9yIHRoZSBjZmc6Ly8gcHJvdG9jb2wuIiIiCiAgICAgICAgICAgIHJlc3QgPSB2YWx1ZQogICAgICAgICAgICBtID0gc2VsZi5XT1JEX1BBVFRFUk4ubWF0Y2gocmVzdCkKICAgICAgICAgICAgaWYgbSBpcyBOb25lOgogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiVW5hYmxlIHRvIGNvbnZlcnQgJXIiICUgdmFsdWUpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXN0ID0gcmVzdFttLmVuZCgpOl0KICAgICAgICAgICAgICAgIGQgPSBzZWxmLmNvbmZpZ1ttLmdyb3VwcygpWzBdXQogICAgICAgICAgICAgICAgI3ByaW50IGQsIHJlc3QKICAgICAgICAgICAgICAgIHdoaWxlIHJlc3Q6CiAgICAgICAgICAgICAgICAgICAgbSA9IHNlbGYuRE9UX1BBVFRFUk4ubWF0Y2gocmVzdCkKICAgICAgICAgICAgICAgICAgICBpZiBtOgogICAgICAgICAgICAgICAgICAgICAgICBkID0gZFttLmdyb3VwcygpWzBdXQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIG0gPSBzZWxmLklOREVYX1BBVFRFUk4ubWF0Y2gocmVzdCkKICAgICAgICAgICAgICAgICAgICAgICAgaWYgbToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkeCA9IG0uZ3JvdXBzKClbMF0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLkRJR0lUX1BBVFRFUk4ubWF0Y2goaWR4KToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkID0gZFtpZHhdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IGludChpZHgpICMgdHJ5IGFzIG51bWJlciBmaXJzdCAobW9zdCBsaWtlbHkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBkW25dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZCA9IGRbaWR4XQogICAgICAgICAgICAgICAgICAgIGlmIG06CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3QgPSByZXN0W20uZW5kKCk6XQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1VuYWJsZSB0byBjb252ZXJ0ICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJXIgYXQgJXInICUgKHZhbHVlLCByZXN0KSkKICAgICAgICAgICAgI3Jlc3Qgc2hvdWxkIGJlIGVtcHR5CiAgICAgICAgICAgIHJldHVybiBkCgogICAgICAgIGRlZiBjb252ZXJ0KHNlbGYsIHZhbHVlKToKICAgICAgICAgICAgIiIiCiAgICAgICAgICAgIENvbnZlcnQgdmFsdWVzIHRvIGFuIGFwcHJvcHJpYXRlIHR5cGUuIGRpY3RzLCBsaXN0cyBhbmQgdHVwbGVzIGFyZQogICAgICAgICAgICByZXBsYWNlZCBieSB0aGVpciBjb252ZXJ0aW5nIGFsdGVybmF0aXZlcy4gU3RyaW5ncyBhcmUgY2hlY2tlZCB0bwogICAgICAgICAgICBzZWUgaWYgdGhleSBoYXZlIGEgY29udmVyc2lvbiBmb3JtYXQgYW5kIGFyZSBjb252ZXJ0ZWQgaWYgdGhleSBkby4KICAgICAgICAgICAgIiIiCiAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHZhbHVlLCBDb252ZXJ0aW5nRGljdCkgYW5kIGlzaW5zdGFuY2UodmFsdWUsIGRpY3QpOgogICAgICAgICAgICAgICAgdmFsdWUgPSBDb252ZXJ0aW5nRGljdCh2YWx1ZSkKICAgICAgICAgICAgICAgIHZhbHVlLmNvbmZpZ3VyYXRvciA9IHNlbGYKICAgICAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZSh2YWx1ZSwgQ29udmVydGluZ0xpc3QpIGFuZCBpc2luc3RhbmNlKHZhbHVlLCBsaXN0KToKICAgICAgICAgICAgICAgIHZhbHVlID0gQ29udmVydGluZ0xpc3QodmFsdWUpCiAgICAgICAgICAgICAgICB2YWx1ZS5jb25maWd1cmF0b3IgPSBzZWxmCiAgICAgICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2UodmFsdWUsIENvbnZlcnRpbmdUdXBsZSkgYW5kXAogICAgICAgICAgICAgICAgICAgICBpc2luc3RhbmNlKHZhbHVlLCB0dXBsZSk6CiAgICAgICAgICAgICAgICB2YWx1ZSA9IENvbnZlcnRpbmdUdXBsZSh2YWx1ZSkKICAgICAgICAgICAgICAgIHZhbHVlLmNvbmZpZ3VyYXRvciA9IHNlbGYKICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKHZhbHVlLCBzdHJpbmdfdHlwZXMpOgogICAgICAgICAgICAgICAgbSA9IHNlbGYuQ09OVkVSVF9QQVRURVJOLm1hdGNoKHZhbHVlKQogICAgICAgICAgICAgICAgaWYgbToKICAgICAgICAgICAgICAgICAgICBkID0gbS5ncm91cGRpY3QoKQogICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGRbJ3ByZWZpeCddCiAgICAgICAgICAgICAgICAgICAgY29udmVydGVyID0gc2VsZi52YWx1ZV9jb252ZXJ0ZXJzLmdldChwcmVmaXgsIE5vbmUpCiAgICAgICAgICAgICAgICAgICAgaWYgY29udmVydGVyOgogICAgICAgICAgICAgICAgICAgICAgICBzdWZmaXggPSBkWydzdWZmaXgnXQogICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZXIgPSBnZXRhdHRyKHNlbGYsIGNvbnZlcnRlcikKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBjb252ZXJ0ZXIoc3VmZml4KQogICAgICAgICAgICByZXR1cm4gdmFsdWUKCiAgICAgICAgZGVmIGNvbmZpZ3VyZV9jdXN0b20oc2VsZiwgY29uZmlnKToKICAgICAgICAgICAgIiIiQ29uZmlndXJlIGFuIG9iamVjdCB3aXRoIGEgdXNlci1zdXBwbGllZCBmYWN0b3J5LiIiIgogICAgICAgICAgICBjID0gY29uZmlnLnBvcCgnKCknKQogICAgICAgICAgICBpZiBub3QgY2FsbGFibGUoYyk6CiAgICAgICAgICAgICAgICBjID0gc2VsZi5yZXNvbHZlKGMpCiAgICAgICAgICAgIHByb3BzID0gY29uZmlnLnBvcCgnLicsIE5vbmUpCiAgICAgICAgICAgICMgQ2hlY2sgZm9yIHZhbGlkIGlkZW50aWZpZXJzCiAgICAgICAgICAgIGt3YXJncyA9IGRpY3QoWyhrLCBjb25maWdba10pIGZvciBrIGluIGNvbmZpZyBpZiB2YWxpZF9pZGVudChrKV0pCiAgICAgICAgICAgIHJlc3VsdCA9IGMoKiprd2FyZ3MpCiAgICAgICAgICAgIGlmIHByb3BzOgogICAgICAgICAgICAgICAgZm9yIG5hbWUsIHZhbHVlIGluIHByb3BzLml0ZW1zKCk6CiAgICAgICAgICAgICAgICAgICAgc2V0YXR0cihyZXN1bHQsIG5hbWUsIHZhbHVlKQogICAgICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgICAgIGRlZiBhc190dXBsZShzZWxmLCB2YWx1ZSk6CiAgICAgICAgICAgICIiIlV0aWxpdHkgZnVuY3Rpb24gd2hpY2ggY29udmVydHMgbGlzdHMgdG8gdHVwbGVzLiIiIgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBsaXN0KToKICAgICAgICAgICAgICAgIHZhbHVlID0gdHVwbGUodmFsdWUpCiAgICAgICAgICAgIHJldHVybiB2YWx1ZQpQSwMEFAAAAAAAAAAhADoKw7wIwgAACMIAADwAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvZGF0YWJhc2UucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQojCiMgQ29weXJpZ2h0IChDKSAyMDEyLTIwMTYgVGhlIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgojIFNlZSBMSUNFTlNFLnR4dCBhbmQgQ09OVFJJQlVUT1JTLnR4dC4KIwoiIiJQRVAgMzc2IGltcGxlbWVudGF0aW9uLiIiIgoKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCB1bmljb2RlX2xpdGVyYWxzCgppbXBvcnQgYmFzZTY0CmltcG9ydCBjb2RlY3MKaW1wb3J0IGNvbnRleHRsaWIKaW1wb3J0IGhhc2hsaWIKaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IG9zCmltcG9ydCBwb3NpeHBhdGgKaW1wb3J0IHN5cwppbXBvcnQgemlwaW1wb3J0Cgpmcm9tIC4gaW1wb3J0IERpc3RsaWJFeGNlcHRpb24sIHJlc291cmNlcwpmcm9tIC5jb21wYXQgaW1wb3J0IFN0cmluZ0lPCmZyb20gLnZlcnNpb24gaW1wb3J0IGdldF9zY2hlbWUsIFVuc3VwcG9ydGVkVmVyc2lvbkVycm9yCmZyb20gLm1ldGFkYXRhIGltcG9ydCBNZXRhZGF0YSwgTUVUQURBVEFfRklMRU5BTUUsIFdIRUVMX01FVEFEQVRBX0ZJTEVOQU1FCmZyb20gLnV0aWwgaW1wb3J0IChwYXJzZV9yZXF1aXJlbWVudCwgY2FjaGVkX3Byb3BlcnR5LCBwYXJzZV9uYW1lX2FuZF92ZXJzaW9uLAogICAgICAgICAgICAgICAgICAgcmVhZF9leHBvcnRzLCB3cml0ZV9leHBvcnRzLCBDU1ZSZWFkZXIsIENTVldyaXRlcikKCgpfX2FsbF9fID0gWydEaXN0cmlidXRpb24nLCAnQmFzZUluc3RhbGxlZERpc3RyaWJ1dGlvbicsCiAgICAgICAgICAgJ0luc3RhbGxlZERpc3RyaWJ1dGlvbicsICdFZ2dJbmZvRGlzdHJpYnV0aW9uJywKICAgICAgICAgICAnRGlzdHJpYnV0aW9uUGF0aCddCgoKbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgpFWFBPUlRTX0ZJTEVOQU1FID0gJ3B5ZGlzdC1leHBvcnRzLmpzb24nCkNPTU1BTkRTX0ZJTEVOQU1FID0gJ3B5ZGlzdC1jb21tYW5kcy5qc29uJwoKRElTVF9GSUxFUyA9ICgnSU5TVEFMTEVSJywgTUVUQURBVEFfRklMRU5BTUUsICdSRUNPUkQnLCAnUkVRVUVTVEVEJywKICAgICAgICAgICAgICAnUkVTT1VSQ0VTJywgRVhQT1JUU19GSUxFTkFNRSwgJ1NIQVJFRCcpCgpESVNUSU5GT19FWFQgPSAnLmRpc3QtaW5mbycKCgpjbGFzcyBfQ2FjaGUob2JqZWN0KToKICAgICIiIgogICAgQSBzaW1wbGUgY2FjaGUgbWFwcGluZyBuYW1lcyBhbmQgLmRpc3QtaW5mbyBwYXRocyB0byBkaXN0cmlidXRpb25zCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBJbml0aWFsaXNlIGFuIGluc3RhbmNlLiBUaGVyZSBpcyBub3JtYWxseSBvbmUgZm9yIGVhY2ggRGlzdHJpYnV0aW9uUGF0aC4KICAgICAgICAiIiIKICAgICAgICBzZWxmLm5hbWUgPSB7fQogICAgICAgIHNlbGYucGF0aCA9IHt9CiAgICAgICAgc2VsZi5nZW5lcmF0ZWQgPSBGYWxzZQoKICAgIGRlZiBjbGVhcihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBDbGVhciB0aGUgY2FjaGUsIHNldHRpbmcgaXQgdG8gaXRzIGluaXRpYWwgc3RhdGUuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5uYW1lLmNsZWFyKCkKICAgICAgICBzZWxmLnBhdGguY2xlYXIoKQogICAgICAgIHNlbGYuZ2VuZXJhdGVkID0gRmFsc2UKCiAgICBkZWYgYWRkKHNlbGYsIGRpc3QpOgogICAgICAgICIiIgogICAgICAgIEFkZCBhIGRpc3RyaWJ1dGlvbiB0byB0aGUgY2FjaGUuCiAgICAgICAgOnBhcmFtIGRpc3Q6IFRoZSBkaXN0cmlidXRpb24gdG8gYWRkLgogICAgICAgICIiIgogICAgICAgIGlmIGRpc3QucGF0aCBub3QgaW4gc2VsZi5wYXRoOgogICAgICAgICAgICBzZWxmLnBhdGhbZGlzdC5wYXRoXSA9IGRpc3QKICAgICAgICAgICAgc2VsZi5uYW1lLnNldGRlZmF1bHQoZGlzdC5rZXksIFtdKS5hcHBlbmQoZGlzdCkKCgpjbGFzcyBEaXN0cmlidXRpb25QYXRoKG9iamVjdCk6CiAgICAiIiIKICAgIFJlcHJlc2VudHMgYSBzZXQgb2YgZGlzdHJpYnV0aW9ucyBpbnN0YWxsZWQgb24gYSBwYXRoICh0eXBpY2FsbHkgc3lzLnBhdGgpLgogICAgIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgcGF0aD1Ob25lLCBpbmNsdWRlX2VnZz1GYWxzZSk6CiAgICAgICAgIiIiCiAgICAgICAgQ3JlYXRlIGFuIGluc3RhbmNlIGZyb20gYSBwYXRoLCBvcHRpb25hbGx5IGluY2x1ZGluZyBsZWdhY3kgKGRpc3R1dGlscy8KICAgICAgICBzZXR1cHRvb2xzL2Rpc3RyaWJ1dGUpIGRpc3RyaWJ1dGlvbnMuCiAgICAgICAgOnBhcmFtIHBhdGg6IFRoZSBwYXRoIHRvIHVzZSwgYXMgYSBsaXN0IG9mIGRpcmVjdG9yaWVzLiBJZiBub3Qgc3BlY2lmaWVkLAogICAgICAgICAgICAgICAgICAgICBzeXMucGF0aCBpcyB1c2VkLgogICAgICAgIDpwYXJhbSBpbmNsdWRlX2VnZzogSWYgVHJ1ZSwgdGhpcyBpbnN0YW5jZSB3aWxsIGxvb2sgZm9yIGFuZCByZXR1cm4gbGVnYWN5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0cmlidXRpb25zIGFzIHdlbGwgYXMgdGhvc2UgYmFzZWQgb24gUEVQIDM3Ni4KICAgICAgICAiIiIKICAgICAgICBpZiBwYXRoIGlzIE5vbmU6CiAgICAgICAgICAgIHBhdGggPSBzeXMucGF0aAogICAgICAgIHNlbGYucGF0aCA9IHBhdGgKICAgICAgICBzZWxmLl9pbmNsdWRlX2Rpc3QgPSBUcnVlCiAgICAgICAgc2VsZi5faW5jbHVkZV9lZ2cgPSBpbmNsdWRlX2VnZwoKICAgICAgICBzZWxmLl9jYWNoZSA9IF9DYWNoZSgpCiAgICAgICAgc2VsZi5fY2FjaGVfZWdnID0gX0NhY2hlKCkKICAgICAgICBzZWxmLl9jYWNoZV9lbmFibGVkID0gVHJ1ZQogICAgICAgIHNlbGYuX3NjaGVtZSA9IGdldF9zY2hlbWUoJ2RlZmF1bHQnKQoKICAgIGRlZiBfZ2V0X2NhY2hlX2VuYWJsZWQoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2NhY2hlX2VuYWJsZWQKCiAgICBkZWYgX3NldF9jYWNoZV9lbmFibGVkKHNlbGYsIHZhbHVlKToKICAgICAgICBzZWxmLl9jYWNoZV9lbmFibGVkID0gdmFsdWUKCiAgICBjYWNoZV9lbmFibGVkID0gcHJvcGVydHkoX2dldF9jYWNoZV9lbmFibGVkLCBfc2V0X2NhY2hlX2VuYWJsZWQpCgogICAgZGVmIGNsZWFyX2NhY2hlKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIENsZWFycyB0aGUgaW50ZXJuYWwgY2FjaGUuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5fY2FjaGUuY2xlYXIoKQogICAgICAgIHNlbGYuX2NhY2hlX2VnZy5jbGVhcigpCgoKICAgIGRlZiBfeWllbGRfZGlzdHJpYnV0aW9ucyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBZaWVsZCAuZGlzdC1pbmZvIGFuZC9vciAuZWdnKC1pbmZvKSBkaXN0cmlidXRpb25zLgogICAgICAgICIiIgogICAgICAgICMgV2UgbmVlZCB0byBjaGVjayBpZiB3ZSd2ZSBzZWVuIHNvbWUgcmVzb3VyY2VzIGFscmVhZHksIGJlY2F1c2Ugb24KICAgICAgICAjIHNvbWUgTGludXggc3lzdGVtcyAoZS5nLiBzb21lIERlYmlhbi9VYnVudHUgdmFyaWFudHMpIHRoZXJlIGFyZQogICAgICAgICMgc3ltbGlua3Mgd2hpY2ggYWxpYXMgb3RoZXIgZmlsZXMgaW4gdGhlIGVudmlyb25tZW50LgogICAgICAgIHNlZW4gPSBzZXQoKQogICAgICAgIGZvciBwYXRoIGluIHNlbGYucGF0aDoKICAgICAgICAgICAgZmluZGVyID0gcmVzb3VyY2VzLmZpbmRlcl9mb3JfcGF0aChwYXRoKQogICAgICAgICAgICBpZiBmaW5kZXIgaXMgTm9uZToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIHIgPSBmaW5kZXIuZmluZCgnJykKICAgICAgICAgICAgaWYgbm90IHIgb3Igbm90IHIuaXNfY29udGFpbmVyOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgcnNldCA9IHNvcnRlZChyLnJlc291cmNlcykKICAgICAgICAgICAgZm9yIGVudHJ5IGluIHJzZXQ6CiAgICAgICAgICAgICAgICByID0gZmluZGVyLmZpbmQoZW50cnkpCiAgICAgICAgICAgICAgICBpZiBub3QgciBvciByLnBhdGggaW4gc2VlbjoKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgaWYgc2VsZi5faW5jbHVkZV9kaXN0IGFuZCBlbnRyeS5lbmRzd2l0aChESVNUSU5GT19FWFQpOgogICAgICAgICAgICAgICAgICAgIHBvc3NpYmxlX2ZpbGVuYW1lcyA9IFtNRVRBREFUQV9GSUxFTkFNRSwgV0hFRUxfTUVUQURBVEFfRklMRU5BTUVdCiAgICAgICAgICAgICAgICAgICAgZm9yIG1ldGFkYXRhX2ZpbGVuYW1lIGluIHBvc3NpYmxlX2ZpbGVuYW1lczoKICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFfcGF0aCA9IHBvc2l4cGF0aC5qb2luKGVudHJ5LCBtZXRhZGF0YV9maWxlbmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgcHlkaXN0ID0gZmluZGVyLmZpbmQobWV0YWRhdGFfcGF0aCkKICAgICAgICAgICAgICAgICAgICAgICAgaWYgcHlkaXN0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgICAgICAgICB3aXRoIGNvbnRleHRsaWIuY2xvc2luZyhweWRpc3QuYXNfc3RyZWFtKCkpIGFzIHN0cmVhbToKICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEgPSBNZXRhZGF0YShmaWxlb2JqPXN0cmVhbSwgc2NoZW1lPSdsZWdhY3knKQogICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnRm91bmQgJXMnLCByLnBhdGgpCiAgICAgICAgICAgICAgICAgICAgc2Vlbi5hZGQoci5wYXRoKQogICAgICAgICAgICAgICAgICAgIHlpZWxkIG5ld19kaXN0X2NsYXNzKHIucGF0aCwgbWV0YWRhdGE9bWV0YWRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52PXNlbGYpCiAgICAgICAgICAgICAgICBlbGlmIHNlbGYuX2luY2x1ZGVfZWdnIGFuZCBlbnRyeS5lbmRzd2l0aCgoJy5lZ2ctaW5mbycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLmVnZycpKToKICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0ZvdW5kICVzJywgci5wYXRoKQogICAgICAgICAgICAgICAgICAgIHNlZW4uYWRkKHIucGF0aCkKICAgICAgICAgICAgICAgICAgICB5aWVsZCBvbGRfZGlzdF9jbGFzcyhyLnBhdGgsIHNlbGYpCgogICAgZGVmIF9nZW5lcmF0ZV9jYWNoZShzZWxmKToKICAgICAgICAiIiIKICAgICAgICBTY2FuIHRoZSBwYXRoIGZvciBkaXN0cmlidXRpb25zIGFuZCBwb3B1bGF0ZSB0aGUgY2FjaGUgd2l0aAogICAgICAgIHRob3NlIHRoYXQgYXJlIGZvdW5kLgogICAgICAgICIiIgogICAgICAgIGdlbl9kaXN0ID0gbm90IHNlbGYuX2NhY2hlLmdlbmVyYXRlZAogICAgICAgIGdlbl9lZ2cgPSBzZWxmLl9pbmNsdWRlX2VnZyBhbmQgbm90IHNlbGYuX2NhY2hlX2VnZy5nZW5lcmF0ZWQKICAgICAgICBpZiBnZW5fZGlzdCBvciBnZW5fZWdnOgogICAgICAgICAgICBmb3IgZGlzdCBpbiBzZWxmLl95aWVsZF9kaXN0cmlidXRpb25zKCk6CiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGRpc3QsIEluc3RhbGxlZERpc3RyaWJ1dGlvbik6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fY2FjaGUuYWRkKGRpc3QpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHNlbGYuX2NhY2hlX2VnZy5hZGQoZGlzdCkKCiAgICAgICAgICAgIGlmIGdlbl9kaXN0OgogICAgICAgICAgICAgICAgc2VsZi5fY2FjaGUuZ2VuZXJhdGVkID0gVHJ1ZQogICAgICAgICAgICBpZiBnZW5fZWdnOgogICAgICAgICAgICAgICAgc2VsZi5fY2FjaGVfZWdnLmdlbmVyYXRlZCA9IFRydWUKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBkaXN0aW5mb19kaXJuYW1lKGNscywgbmFtZSwgdmVyc2lvbik6CiAgICAgICAgIiIiCiAgICAgICAgVGhlICpuYW1lKiBhbmQgKnZlcnNpb24qIHBhcmFtZXRlcnMgYXJlIGNvbnZlcnRlZCBpbnRvIHRoZWlyCiAgICAgICAgZmlsZW5hbWUtZXNjYXBlZCBmb3JtLCBpLmUuIGFueSBgYCctJ2BgIGNoYXJhY3RlcnMgYXJlIHJlcGxhY2VkCiAgICAgICAgd2l0aCBgYCdfJ2BgIG90aGVyIHRoYW4gdGhlIG9uZSBpbiBgYCdkaXN0LWluZm8nYGAgYW5kIHRoZSBvbmUKICAgICAgICBzZXBhcmF0aW5nIHRoZSBuYW1lIGZyb20gdGhlIHZlcnNpb24gbnVtYmVyLgoKICAgICAgICA6cGFyYW1ldGVyIG5hbWU6IGlzIGNvbnZlcnRlZCB0byBhIHN0YW5kYXJkIGRpc3RyaWJ1dGlvbiBuYW1lIGJ5IHJlcGxhY2luZwogICAgICAgICAgICAgICAgICAgICAgICAgYW55IHJ1bnMgb2Ygbm9uLSBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyB3aXRoIGEgc2luZ2xlCiAgICAgICAgICAgICAgICAgICAgICAgICBgYCctJ2BgLgogICAgICAgIDp0eXBlIG5hbWU6IHN0cmluZwogICAgICAgIDpwYXJhbWV0ZXIgdmVyc2lvbjogaXMgY29udmVydGVkIHRvIGEgc3RhbmRhcmQgdmVyc2lvbiBzdHJpbmcuIFNwYWNlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVjb21lIGRvdHMsIGFuZCBhbGwgb3RoZXIgbm9uLWFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXhjZXB0IGRvdHMpIGJlY29tZSBkYXNoZXMsIHdpdGggcnVucyBvZiBtdWx0aXBsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGFzaGVzIGNvbmRlbnNlZCB0byBhIHNpbmdsZSBkYXNoLgogICAgICAgIDp0eXBlIHZlcnNpb246IHN0cmluZwogICAgICAgIDpyZXR1cm5zOiBkaXJlY3RvcnkgbmFtZQogICAgICAgIDpydHlwZTogc3RyaW5nIiIiCiAgICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgnLScsICdfJykKICAgICAgICByZXR1cm4gJy0nLmpvaW4oW25hbWUsIHZlcnNpb25dKSArIERJU1RJTkZPX0VYVAoKICAgIGRlZiBnZXRfZGlzdHJpYnV0aW9ucyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBQcm92aWRlcyBhbiBpdGVyYXRvciB0aGF0IGxvb2tzIGZvciBkaXN0cmlidXRpb25zIGFuZCByZXR1cm5zCiAgICAgICAgOmNsYXNzOmBJbnN0YWxsZWREaXN0cmlidXRpb25gIG9yCiAgICAgICAgOmNsYXNzOmBFZ2dJbmZvRGlzdHJpYnV0aW9uYCBpbnN0YW5jZXMgZm9yIGVhY2ggb25lIG9mIHRoZW0uCgogICAgICAgIDpydHlwZTogaXRlcmF0b3Igb2YgOmNsYXNzOmBJbnN0YWxsZWREaXN0cmlidXRpb25gIGFuZAogICAgICAgICAgICAgICAgOmNsYXNzOmBFZ2dJbmZvRGlzdHJpYnV0aW9uYCBpbnN0YW5jZXMKICAgICAgICAiIiIKICAgICAgICBpZiBub3Qgc2VsZi5fY2FjaGVfZW5hYmxlZDoKICAgICAgICAgICAgZm9yIGRpc3QgaW4gc2VsZi5feWllbGRfZGlzdHJpYnV0aW9ucygpOgogICAgICAgICAgICAgICAgeWllbGQgZGlzdAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuX2dlbmVyYXRlX2NhY2hlKCkKCiAgICAgICAgICAgIGZvciBkaXN0IGluIHNlbGYuX2NhY2hlLnBhdGgudmFsdWVzKCk6CiAgICAgICAgICAgICAgICB5aWVsZCBkaXN0CgogICAgICAgICAgICBpZiBzZWxmLl9pbmNsdWRlX2VnZzoKICAgICAgICAgICAgICAgIGZvciBkaXN0IGluIHNlbGYuX2NhY2hlX2VnZy5wYXRoLnZhbHVlcygpOgogICAgICAgICAgICAgICAgICAgIHlpZWxkIGRpc3QKCiAgICBkZWYgZ2V0X2Rpc3RyaWJ1dGlvbihzZWxmLCBuYW1lKToKICAgICAgICAiIiIKICAgICAgICBMb29rcyBmb3IgYSBuYW1lZCBkaXN0cmlidXRpb24gb24gdGhlIHBhdGguCgogICAgICAgIFRoaXMgZnVuY3Rpb24gb25seSByZXR1cm5zIHRoZSBmaXJzdCByZXN1bHQgZm91bmQsIGFzIG5vIG1vcmUgdGhhbiBvbmUKICAgICAgICB2YWx1ZSBpcyBleHBlY3RlZC4gSWYgbm90aGluZyBpcyBmb3VuZCwgYGBOb25lYGAgaXMgcmV0dXJuZWQuCgogICAgICAgIDpydHlwZTogOmNsYXNzOmBJbnN0YWxsZWREaXN0cmlidXRpb25gLCA6Y2xhc3M6YEVnZ0luZm9EaXN0cmlidXRpb25gCiAgICAgICAgICAgICAgICBvciBgYE5vbmVgYAogICAgICAgICIiIgogICAgICAgIHJlc3VsdCA9IE5vbmUKICAgICAgICBuYW1lID0gbmFtZS5sb3dlcigpCiAgICAgICAgaWYgbm90IHNlbGYuX2NhY2hlX2VuYWJsZWQ6CiAgICAgICAgICAgIGZvciBkaXN0IGluIHNlbGYuX3lpZWxkX2Rpc3RyaWJ1dGlvbnMoKToKICAgICAgICAgICAgICAgIGlmIGRpc3Qua2V5ID09IG5hbWU6CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZGlzdAogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5fZ2VuZXJhdGVfY2FjaGUoKQoKICAgICAgICAgICAgaWYgbmFtZSBpbiBzZWxmLl9jYWNoZS5uYW1lOgogICAgICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5fY2FjaGUubmFtZVtuYW1lXVswXQogICAgICAgICAgICBlbGlmIHNlbGYuX2luY2x1ZGVfZWdnIGFuZCBuYW1lIGluIHNlbGYuX2NhY2hlX2VnZy5uYW1lOgogICAgICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5fY2FjaGVfZWdnLm5hbWVbbmFtZV1bMF0KICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIHByb3ZpZGVzX2Rpc3RyaWJ1dGlvbihzZWxmLCBuYW1lLCB2ZXJzaW9uPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIEl0ZXJhdGVzIG92ZXIgYWxsIGRpc3RyaWJ1dGlvbnMgdG8gZmluZCB3aGljaCBkaXN0cmlidXRpb25zIHByb3ZpZGUgKm5hbWUqLgogICAgICAgIElmIGEgKnZlcnNpb24qIGlzIHByb3ZpZGVkLCBpdCB3aWxsIGJlIHVzZWQgdG8gZmlsdGVyIHRoZSByZXN1bHRzLgoKICAgICAgICBUaGlzIGZ1bmN0aW9uIG9ubHkgcmV0dXJucyB0aGUgZmlyc3QgcmVzdWx0IGZvdW5kLCBzaW5jZSBubyBtb3JlIHRoYW4KICAgICAgICBvbmUgdmFsdWVzIGFyZSBleHBlY3RlZC4gSWYgdGhlIGRpcmVjdG9yeSBpcyBub3QgZm91bmQsIHJldHVybnMgYGBOb25lYGAuCgogICAgICAgIDpwYXJhbWV0ZXIgdmVyc2lvbjogYSB2ZXJzaW9uIHNwZWNpZmllciB0aGF0IGluZGljYXRlcyB0aGUgdmVyc2lvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQsIGNvbmZvcm1pbmcgdG8gdGhlIGZvcm1hdCBpbiBgYFBFUC0zNDVgYAoKICAgICAgICA6dHlwZSBuYW1lOiBzdHJpbmcKICAgICAgICA6dHlwZSB2ZXJzaW9uOiBzdHJpbmcKICAgICAgICAiIiIKICAgICAgICBtYXRjaGVyID0gTm9uZQogICAgICAgIGlmIG5vdCB2ZXJzaW9uIGlzIE5vbmU6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIG1hdGNoZXIgPSBzZWxmLl9zY2hlbWUubWF0Y2hlcignJXMgKCVzKScgJSAobmFtZSwgdmVyc2lvbikpCiAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbignaW52YWxpZCBuYW1lIG9yIHZlcnNpb246ICVyLCAlcicgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuYW1lLCB2ZXJzaW9uKSkKCiAgICAgICAgZm9yIGRpc3QgaW4gc2VsZi5nZXRfZGlzdHJpYnV0aW9ucygpOgogICAgICAgICAgICBwcm92aWRlZCA9IGRpc3QucHJvdmlkZXMKCiAgICAgICAgICAgIGZvciBwIGluIHByb3ZpZGVkOgogICAgICAgICAgICAgICAgcF9uYW1lLCBwX3ZlciA9IHBhcnNlX25hbWVfYW5kX3ZlcnNpb24ocCkKICAgICAgICAgICAgICAgIGlmIG1hdGNoZXIgaXMgTm9uZToKICAgICAgICAgICAgICAgICAgICBpZiBwX25hbWUgPT0gbmFtZToKICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgZGlzdAogICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBpZiBwX25hbWUgPT0gbmFtZSBhbmQgbWF0Y2hlci5tYXRjaChwX3Zlcik6CiAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIGRpc3QKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKCiAgICBkZWYgZ2V0X2ZpbGVfcGF0aChzZWxmLCBuYW1lLCByZWxhdGl2ZV9wYXRoKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gdGhlIHBhdGggdG8gYSByZXNvdXJjZSBmaWxlLgogICAgICAgICIiIgogICAgICAgIGRpc3QgPSBzZWxmLmdldF9kaXN0cmlidXRpb24obmFtZSkKICAgICAgICBpZiBkaXN0IGlzIE5vbmU6CiAgICAgICAgICAgIHJhaXNlIExvb2t1cEVycm9yKCdubyBkaXN0cmlidXRpb24gbmFtZWQgJXIgZm91bmQnICUgbmFtZSkKICAgICAgICByZXR1cm4gZGlzdC5nZXRfcmVzb3VyY2VfcGF0aChyZWxhdGl2ZV9wYXRoKQoKICAgIGRlZiBnZXRfZXhwb3J0ZWRfZW50cmllcyhzZWxmLCBjYXRlZ29yeSwgbmFtZT1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gYWxsIG9mIHRoZSBleHBvcnRlZCBlbnRyaWVzIGluIGEgcGFydGljdWxhciBjYXRlZ29yeS4KCiAgICAgICAgOnBhcmFtIGNhdGVnb3J5OiBUaGUgY2F0ZWdvcnkgdG8gc2VhcmNoIGZvciBlbnRyaWVzLgogICAgICAgIDpwYXJhbSBuYW1lOiBJZiBzcGVjaWZpZWQsIG9ubHkgZW50cmllcyB3aXRoIHRoYXQgbmFtZSBhcmUgcmV0dXJuZWQuCiAgICAgICAgIiIiCiAgICAgICAgZm9yIGRpc3QgaW4gc2VsZi5nZXRfZGlzdHJpYnV0aW9ucygpOgogICAgICAgICAgICByID0gZGlzdC5leHBvcnRzCiAgICAgICAgICAgIGlmIGNhdGVnb3J5IGluIHI6CiAgICAgICAgICAgICAgICBkID0gcltjYXRlZ29yeV0KICAgICAgICAgICAgICAgIGlmIG5hbWUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgaWYgbmFtZSBpbiBkOgogICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBkW25hbWVdCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGZvciB2IGluIGQudmFsdWVzKCk6CiAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIHYKCgpjbGFzcyBEaXN0cmlidXRpb24ob2JqZWN0KToKICAgICIiIgogICAgQSBiYXNlIGNsYXNzIGZvciBkaXN0cmlidXRpb25zLCB3aGV0aGVyIGluc3RhbGxlZCBvciBmcm9tIGluZGV4ZXMuCiAgICBFaXRoZXIgd2F5LCBpdCBtdXN0IGhhdmUgc29tZSBtZXRhZGF0YSwgc28gdGhhdCdzIGFsbCB0aGF0J3MgbmVlZGVkCiAgICBmb3IgY29uc3RydWN0aW9uLgogICAgIiIiCgogICAgYnVpbGRfdGltZV9kZXBlbmRlbmN5ID0gRmFsc2UKICAgICIiIgogICAgU2V0IHRvIFRydWUgaWYgaXQncyBrbm93biB0byBiZSBvbmx5IGEgYnVpbGQtdGltZSBkZXBlbmRlbmN5IChpLmUuCiAgICBub3QgbmVlZGVkIGFmdGVyIGluc3RhbGxhdGlvbikuCiAgICAiIiIKCiAgICByZXF1ZXN0ZWQgPSBGYWxzZQogICAgIiIiQSBib29sZWFuIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGBgUkVRVUVTVEVEYGAgbWV0YWRhdGEgZmlsZSBpcwogICAgcHJlc2VudCAoaW4gb3RoZXIgd29yZHMsIHdoZXRoZXIgdGhlIHBhY2thZ2Ugd2FzIGluc3RhbGxlZCBieSB1c2VyCiAgICByZXF1ZXN0IG9yIGl0IHdhcyBpbnN0YWxsZWQgYXMgYSBkZXBlbmRlbmN5KS4iIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbWV0YWRhdGEpOgogICAgICAgICIiIgogICAgICAgIEluaXRpYWxpc2UgYW4gaW5zdGFuY2UuCiAgICAgICAgOnBhcmFtIG1ldGFkYXRhOiBUaGUgaW5zdGFuY2Ugb2YgOmNsYXNzOmBNZXRhZGF0YWAgZGVzY3JpYmluZyB0aGlzCiAgICAgICAgZGlzdHJpYnV0aW9uLgogICAgICAgICIiIgogICAgICAgIHNlbGYubWV0YWRhdGEgPSBtZXRhZGF0YQogICAgICAgIHNlbGYubmFtZSA9IG1ldGFkYXRhLm5hbWUKICAgICAgICBzZWxmLmtleSA9IHNlbGYubmFtZS5sb3dlcigpICAgICMgZm9yIGNhc2UtaW5zZW5zaXRpdmUgY29tcGFyaXNvbnMKICAgICAgICBzZWxmLnZlcnNpb24gPSBtZXRhZGF0YS52ZXJzaW9uCiAgICAgICAgc2VsZi5sb2NhdG9yID0gTm9uZQogICAgICAgIHNlbGYuZGlnZXN0ID0gTm9uZQogICAgICAgIHNlbGYuZXh0cmFzID0gTm9uZSAgICAgICMgYWRkaXRpb25hbCBmZWF0dXJlcyByZXF1ZXN0ZWQKICAgICAgICBzZWxmLmNvbnRleHQgPSBOb25lICAgICAjIGVudmlyb25tZW50IG1hcmtlciBvdmVycmlkZXMKICAgICAgICBzZWxmLmRvd25sb2FkX3VybHMgPSBzZXQoKQogICAgICAgIHNlbGYuZGlnZXN0cyA9IHt9CgogICAgQHByb3BlcnR5CiAgICBkZWYgc291cmNlX3VybChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUaGUgc291cmNlIGFyY2hpdmUgZG93bmxvYWQgVVJMIGZvciB0aGlzIGRpc3RyaWJ1dGlvbi4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZi5tZXRhZGF0YS5zb3VyY2VfdXJsCgogICAgZG93bmxvYWRfdXJsID0gc291cmNlX3VybCAgICMgQmFja3dhcmQgY29tcGF0aWJpbGl0eQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIG5hbWVfYW5kX3ZlcnNpb24oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgQSB1dGlsaXR5IHByb3BlcnR5IHdoaWNoIGRpc3BsYXlzIHRoZSBuYW1lIGFuZCB2ZXJzaW9uIGluIHBhcmVudGhlc2VzLgogICAgICAgICIiIgogICAgICAgIHJldHVybiAnJXMgKCVzKScgJSAoc2VsZi5uYW1lLCBzZWxmLnZlcnNpb24pCgogICAgQHByb3BlcnR5CiAgICBkZWYgcHJvdmlkZXMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgQSBzZXQgb2YgZGlzdHJpYnV0aW9uIG5hbWVzIGFuZCB2ZXJzaW9ucyBwcm92aWRlZCBieSB0aGlzIGRpc3RyaWJ1dGlvbi4KICAgICAgICA6cmV0dXJuOiBBIHNldCBvZiAibmFtZSAodmVyc2lvbikiIHN0cmluZ3MuCiAgICAgICAgIiIiCiAgICAgICAgcGxpc3QgPSBzZWxmLm1ldGFkYXRhLnByb3ZpZGVzCiAgICAgICAgcyA9ICclcyAoJXMpJyAlIChzZWxmLm5hbWUsIHNlbGYudmVyc2lvbikKICAgICAgICBpZiBzIG5vdCBpbiBwbGlzdDoKICAgICAgICAgICAgcGxpc3QuYXBwZW5kKHMpCiAgICAgICAgcmV0dXJuIHBsaXN0CgogICAgZGVmIF9nZXRfcmVxdWlyZW1lbnRzKHNlbGYsIHJlcV9hdHRyKToKICAgICAgICBtZCA9IHNlbGYubWV0YWRhdGEKICAgICAgICBsb2dnZXIuZGVidWcoJ0dldHRpbmcgcmVxdWlyZW1lbnRzIGZyb20gbWV0YWRhdGEgJXInLCBtZC50b2RpY3QoKSkKICAgICAgICByZXF0cyA9IGdldGF0dHIobWQsIHJlcV9hdHRyKQogICAgICAgIHJldHVybiBzZXQobWQuZ2V0X3JlcXVpcmVtZW50cyhyZXF0cywgZXh0cmFzPXNlbGYuZXh0cmFzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnY9c2VsZi5jb250ZXh0KSkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBydW5fcmVxdWlyZXMoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2dldF9yZXF1aXJlbWVudHMoJ3J1bl9yZXF1aXJlcycpCgogICAgQHByb3BlcnR5CiAgICBkZWYgbWV0YV9yZXF1aXJlcyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fZ2V0X3JlcXVpcmVtZW50cygnbWV0YV9yZXF1aXJlcycpCgogICAgQHByb3BlcnR5CiAgICBkZWYgYnVpbGRfcmVxdWlyZXMoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2dldF9yZXF1aXJlbWVudHMoJ2J1aWxkX3JlcXVpcmVzJykKCiAgICBAcHJvcGVydHkKICAgIGRlZiB0ZXN0X3JlcXVpcmVzKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9nZXRfcmVxdWlyZW1lbnRzKCd0ZXN0X3JlcXVpcmVzJykKCiAgICBAcHJvcGVydHkKICAgIGRlZiBkZXZfcmVxdWlyZXMoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2dldF9yZXF1aXJlbWVudHMoJ2Rldl9yZXF1aXJlcycpCgogICAgZGVmIG1hdGNoZXNfcmVxdWlyZW1lbnQoc2VsZiwgcmVxKToKICAgICAgICAiIiIKICAgICAgICBTYXkgaWYgdGhpcyBpbnN0YW5jZSBtYXRjaGVzIChmdWxmaWxscykgYSByZXF1aXJlbWVudC4KICAgICAgICA6cGFyYW0gcmVxOiBUaGUgcmVxdWlyZW1lbnQgdG8gbWF0Y2guCiAgICAgICAgOnJ0eXBlIHJlcTogc3RyCiAgICAgICAgOnJldHVybjogVHJ1ZSBpZiBpdCBtYXRjaGVzLCBlbHNlIEZhbHNlLgogICAgICAgICIiIgogICAgICAgICMgUmVxdWlyZW1lbnQgbWF5IGNvbnRhaW4gZXh0cmFzIC0gcGFyc2UgdG8gbG9zZSB0aG9zZQogICAgICAgICMgZnJvbSB3aGF0J3MgcGFzc2VkIHRvIHRoZSBtYXRjaGVyCiAgICAgICAgciA9IHBhcnNlX3JlcXVpcmVtZW50KHJlcSkKICAgICAgICBzY2hlbWUgPSBnZXRfc2NoZW1lKHNlbGYubWV0YWRhdGEuc2NoZW1lKQogICAgICAgIHRyeToKICAgICAgICAgICAgbWF0Y2hlciA9IHNjaGVtZS5tYXRjaGVyKHIucmVxdWlyZW1lbnQpCiAgICAgICAgZXhjZXB0IFVuc3VwcG9ydGVkVmVyc2lvbkVycm9yOgogICAgICAgICAgICAjIFhYWCBjb21wYXQtbW9kZSBpZiBjYW5ub3QgcmVhZCB0aGUgdmVyc2lvbgogICAgICAgICAgICBsb2dnZXIud2FybmluZygnY291bGQgbm90IHJlYWQgdmVyc2lvbiAlciAtIHVzaW5nIG5hbWUgb25seScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcSkKICAgICAgICAgICAgbmFtZSA9IHJlcS5zcGxpdCgpWzBdCiAgICAgICAgICAgIG1hdGNoZXIgPSBzY2hlbWUubWF0Y2hlcihuYW1lKQoKICAgICAgICBuYW1lID0gbWF0Y2hlci5rZXkgICAjIGNhc2UtaW5zZW5zaXRpdmUKCiAgICAgICAgcmVzdWx0ID0gRmFsc2UKICAgICAgICBmb3IgcCBpbiBzZWxmLnByb3ZpZGVzOgogICAgICAgICAgICBwX25hbWUsIHBfdmVyID0gcGFyc2VfbmFtZV9hbmRfdmVyc2lvbihwKQogICAgICAgICAgICBpZiBwX25hbWUgIT0gbmFtZToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHJlc3VsdCA9IG1hdGNoZXIubWF0Y2gocF92ZXIpCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBleGNlcHQgVW5zdXBwb3J0ZWRWZXJzaW9uRXJyb3I6CiAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gYSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgaW5zdGFuY2UsCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5zb3VyY2VfdXJsOgogICAgICAgICAgICBzdWZmaXggPSAnIFslc10nICUgc2VsZi5zb3VyY2VfdXJsCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc3VmZml4ID0gJycKICAgICAgICByZXR1cm4gJzxEaXN0cmlidXRpb24gJXMgKCVzKSVzPicgJSAoc2VsZi5uYW1lLCBzZWxmLnZlcnNpb24sIHN1ZmZpeCkKCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICAiIiIKICAgICAgICBTZWUgaWYgdGhpcyBkaXN0cmlidXRpb24gaXMgdGhlIHNhbWUgYXMgYW5vdGhlci4KICAgICAgICA6cGFyYW0gb3RoZXI6IFRoZSBkaXN0cmlidXRpb24gdG8gY29tcGFyZSB3aXRoLiBUbyBiZSBlcXVhbCB0byBvbmUKICAgICAgICAgICAgICAgICAgICAgIGFub3RoZXIuIGRpc3RyaWJ1dGlvbnMgbXVzdCBoYXZlIHRoZSBzYW1lIHR5cGUsIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uIGFuZCBzb3VyY2VfdXJsLgogICAgICAgIDpyZXR1cm46IFRydWUgaWYgaXQgaXMgdGhlIHNhbWUsIGVsc2UgRmFsc2UuCiAgICAgICAgIiIiCiAgICAgICAgaWYgdHlwZShvdGhlcikgaXMgbm90IHR5cGUoc2VsZik6CiAgICAgICAgICAgIHJlc3VsdCA9IEZhbHNlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmVzdWx0ID0gKHNlbGYubmFtZSA9PSBvdGhlci5uYW1lIGFuZAogICAgICAgICAgICAgICAgICAgICAgc2VsZi52ZXJzaW9uID09IG90aGVyLnZlcnNpb24gYW5kCiAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNvdXJjZV91cmwgPT0gb3RoZXIuc291cmNlX3VybCkKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIENvbXB1dGUgaGFzaCBpbiBhIHdheSB3aGljaCBtYXRjaGVzIHRoZSBlcXVhbGl0eSB0ZXN0LgogICAgICAgICIiIgogICAgICAgIHJldHVybiBoYXNoKHNlbGYubmFtZSkgKyBoYXNoKHNlbGYudmVyc2lvbikgKyBoYXNoKHNlbGYuc291cmNlX3VybCkKCgpjbGFzcyBCYXNlSW5zdGFsbGVkRGlzdHJpYnV0aW9uKERpc3RyaWJ1dGlvbik6CiAgICAiIiIKICAgIFRoaXMgaXMgdGhlIGJhc2UgY2xhc3MgZm9yIGluc3RhbGxlZCBkaXN0cmlidXRpb25zICh3aGV0aGVyIFBFUCAzNzYgb3IKICAgIGxlZ2FjeSkuCiAgICAiIiIKCiAgICBoYXNoZXIgPSBOb25lCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG1ldGFkYXRhLCBwYXRoLCBlbnY9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgSW5pdGlhbGlzZSBhbiBpbnN0YW5jZS4KICAgICAgICA6cGFyYW0gbWV0YWRhdGE6IEFuIGluc3RhbmNlIG9mIDpjbGFzczpgTWV0YWRhdGFgIHdoaWNoIGRlc2NyaWJlcyB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RyaWJ1dGlvbi4gVGhpcyB3aWxsIG5vcm1hbGx5IGhhdmUgYmVlbiBpbml0aWFsaXNlZAogICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBhIG1ldGFkYXRhIGZpbGUgaW4gdGhlIGBgcGF0aGBgLgogICAgICAgIDpwYXJhbSBwYXRoOiAgICAgVGhlIHBhdGggb2YgdGhlIGBgLmRpc3QtaW5mb2BgIG9yIGBgLmVnZy1pbmZvYGAKICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yeSBmb3IgdGhlIGRpc3RyaWJ1dGlvbi4KICAgICAgICA6cGFyYW0gZW52OiAgICAgIFRoaXMgaXMgbm9ybWFsbHkgdGhlIDpjbGFzczpgRGlzdHJpYnV0aW9uUGF0aGAKICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlIHdoZXJlIHRoaXMgZGlzdHJpYnV0aW9uIHdhcyBmb3VuZC4KICAgICAgICAiIiIKICAgICAgICBzdXBlcihCYXNlSW5zdGFsbGVkRGlzdHJpYnV0aW9uLCBzZWxmKS5fX2luaXRfXyhtZXRhZGF0YSkKICAgICAgICBzZWxmLnBhdGggPSBwYXRoCiAgICAgICAgc2VsZi5kaXN0X3BhdGggPSBlbnYKCiAgICBkZWYgZ2V0X2hhc2goc2VsZiwgZGF0YSwgaGFzaGVyPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIEdldCB0aGUgaGFzaCBvZiBzb21lIGRhdGEsIHVzaW5nIGEgcGFydGljdWxhciBoYXNoIGFsZ29yaXRobSwgaWYKICAgICAgICBzcGVjaWZpZWQuCgogICAgICAgIDpwYXJhbSBkYXRhOiBUaGUgZGF0YSB0byBiZSBoYXNoZWQuCiAgICAgICAgOnR5cGUgZGF0YTogYnl0ZXMKICAgICAgICA6cGFyYW0gaGFzaGVyOiBUaGUgbmFtZSBvZiBhIGhhc2ggaW1wbGVtZW50YXRpb24sIHN1cHBvcnRlZCBieSBoYXNobGliLAogICAgICAgICAgICAgICAgICAgICAgIG9yIGBgTm9uZWBgLiBFeGFtcGxlcyBvZiB2YWxpZCB2YWx1ZXMgYXJlIGBgJ3NoYTEnYGAsCiAgICAgICAgICAgICAgICAgICAgICAgYGAnc2hhMjI0J2BgLCBgYCdzaGEzODQnYGAsICdgYHNoYTI1NidgYCwgYGAnbWQ1J2BgIGFuZAogICAgICAgICAgICAgICAgICAgICAgIGBgJ3NoYTUxMidgYC4gSWYgbm8gaGFzaGVyIGlzIHNwZWNpZmllZCwgdGhlIGBgaGFzaGVyYGAKICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgb2YgdGhlIDpjbGFzczpgSW5zdGFsbGVkRGlzdHJpYnV0aW9uYCBpbnN0YW5jZQogICAgICAgICAgICAgICAgICAgICAgIGlzIHVzZWQuIElmIHRoZSBoYXNoZXIgaXMgZGV0ZXJtaW5lZCB0byBiZSBgYE5vbmVgYCwgTUQ1CiAgICAgICAgICAgICAgICAgICAgICAgaXMgdXNlZCBhcyB0aGUgaGFzaGluZyBhbGdvcml0aG0uCiAgICAgICAgOnJldHVybnM6IFRoZSBoYXNoIG9mIHRoZSBkYXRhLiBJZiBhIGhhc2hlciB3YXMgZXhwbGljaXRseSBzcGVjaWZpZWQsCiAgICAgICAgICAgICAgICAgIHRoZSByZXR1cm5lZCBoYXNoIHdpbGwgYmUgcHJlZml4ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGhhc2hlcgogICAgICAgICAgICAgICAgICBmb2xsb3dlZCBieSAnPScuCiAgICAgICAgOnJ0eXBlOiBzdHIKICAgICAgICAiIiIKICAgICAgICBpZiBoYXNoZXIgaXMgTm9uZToKICAgICAgICAgICAgaGFzaGVyID0gc2VsZi5oYXNoZXIKICAgICAgICBpZiBoYXNoZXIgaXMgTm9uZToKICAgICAgICAgICAgaGFzaGVyID0gaGFzaGxpYi5tZDUKICAgICAgICAgICAgcHJlZml4ID0gJycKICAgICAgICBlbHNlOgogICAgICAgICAgICBoYXNoZXIgPSBnZXRhdHRyKGhhc2hsaWIsIGhhc2hlcikKICAgICAgICAgICAgcHJlZml4ID0gJyVzPScgJSBzZWxmLmhhc2hlcgogICAgICAgIGRpZ2VzdCA9IGhhc2hlcihkYXRhKS5kaWdlc3QoKQogICAgICAgIGRpZ2VzdCA9IGJhc2U2NC51cmxzYWZlX2I2NGVuY29kZShkaWdlc3QpLnJzdHJpcChiJz0nKS5kZWNvZGUoJ2FzY2lpJykKICAgICAgICByZXR1cm4gJyVzJXMnICUgKHByZWZpeCwgZGlnZXN0KQoKCmNsYXNzIEluc3RhbGxlZERpc3RyaWJ1dGlvbihCYXNlSW5zdGFsbGVkRGlzdHJpYnV0aW9uKToKICAgICIiIgogICAgQ3JlYXRlZCB3aXRoIHRoZSAqcGF0aCogb2YgdGhlIGBgLmRpc3QtaW5mb2BgIGRpcmVjdG9yeSBwcm92aWRlZCB0byB0aGUKICAgIGNvbnN0cnVjdG9yLiBJdCByZWFkcyB0aGUgbWV0YWRhdGEgY29udGFpbmVkIGluIGBgcHlkaXN0Lmpzb25gYCB3aGVuIGl0IGlzCiAgICBpbnN0YW50aWF0ZWQuLCBvciB1c2VzIGEgcGFzc2VkIGluIE1ldGFkYXRhIGluc3RhbmNlICh1c2VmdWwgZm9yIHdoZW4KICAgIGRyeS1ydW4gbW9kZSBpcyBiZWluZyB1c2VkKS4KICAgICIiIgoKICAgIGhhc2hlciA9ICdzaGEyNTYnCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdGgsIG1ldGFkYXRhPU5vbmUsIGVudj1Ob25lKToKICAgICAgICBzZWxmLmZpbmRlciA9IGZpbmRlciA9IHJlc291cmNlcy5maW5kZXJfZm9yX3BhdGgocGF0aCkKICAgICAgICBpZiBmaW5kZXIgaXMgTm9uZToKICAgICAgICAgICAgaW1wb3J0IHBkYjsgcGRiLnNldF90cmFjZSAoKQogICAgICAgIGlmIGVudiBhbmQgZW52Ll9jYWNoZV9lbmFibGVkIGFuZCBwYXRoIGluIGVudi5fY2FjaGUucGF0aDoKICAgICAgICAgICAgbWV0YWRhdGEgPSBlbnYuX2NhY2hlLnBhdGhbcGF0aF0ubWV0YWRhdGEKICAgICAgICBlbGlmIG1ldGFkYXRhIGlzIE5vbmU6CiAgICAgICAgICAgIHIgPSBmaW5kZXIuZmluZChNRVRBREFUQV9GSUxFTkFNRSkKICAgICAgICAgICAgIyBUZW1wb3JhcnkgLSBmb3IgV2hlZWwgMC4yMyBzdXBwb3J0CiAgICAgICAgICAgIGlmIHIgaXMgTm9uZToKICAgICAgICAgICAgICAgIHIgPSBmaW5kZXIuZmluZChXSEVFTF9NRVRBREFUQV9GSUxFTkFNRSkKICAgICAgICAgICAgIyBUZW1wb3JhcnkgLSBmb3IgbGVnYWN5IHN1cHBvcnQKICAgICAgICAgICAgaWYgciBpcyBOb25lOgogICAgICAgICAgICAgICAgciA9IGZpbmRlci5maW5kKCdNRVRBREFUQScpCiAgICAgICAgICAgIGlmIHIgaXMgTm9uZToKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ25vICVzIGZvdW5kIGluICVzJyAlIChNRVRBREFUQV9GSUxFTkFNRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoKSkKICAgICAgICAgICAgd2l0aCBjb250ZXh0bGliLmNsb3Npbmcoci5hc19zdHJlYW0oKSkgYXMgc3RyZWFtOgogICAgICAgICAgICAgICAgbWV0YWRhdGEgPSBNZXRhZGF0YShmaWxlb2JqPXN0cmVhbSwgc2NoZW1lPSdsZWdhY3knKQoKICAgICAgICBzdXBlcihJbnN0YWxsZWREaXN0cmlidXRpb24sIHNlbGYpLl9faW5pdF9fKG1ldGFkYXRhLCBwYXRoLCBlbnYpCgogICAgICAgIGlmIGVudiBhbmQgZW52Ll9jYWNoZV9lbmFibGVkOgogICAgICAgICAgICBlbnYuX2NhY2hlLmFkZChzZWxmKQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHIgPSBmaW5kZXIuZmluZCgnUkVRVUVTVEVEJykKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIGltcG9ydCBwZGI7IHBkYi5zZXRfdHJhY2UgKCkKICAgICAgICBzZWxmLnJlcXVlc3RlZCA9IHIgaXMgbm90IE5vbmUKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICc8SW5zdGFsbGVkRGlzdHJpYnV0aW9uICVyICVzIGF0ICVyPicgJSAoCiAgICAgICAgICAgIHNlbGYubmFtZSwgc2VsZi52ZXJzaW9uLCBzZWxmLnBhdGgpCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmV0dXJuICIlcyAlcyIgJSAoc2VsZi5uYW1lLCBzZWxmLnZlcnNpb24pCgogICAgZGVmIF9nZXRfcmVjb3JkcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBHZXQgdGhlIGxpc3Qgb2YgaW5zdGFsbGVkIGZpbGVzIGZvciB0aGUgZGlzdHJpYnV0aW9uCiAgICAgICAgOnJldHVybjogQSBsaXN0IG9mIHR1cGxlcyBvZiBwYXRoLCBoYXNoIGFuZCBzaXplLiBOb3RlIHRoYXQgaGFzaCBhbmQKICAgICAgICAgICAgICAgICBzaXplIG1pZ2h0IGJlIGBgTm9uZWBgIGZvciBzb21lIGVudHJpZXMuIFRoZSBwYXRoIGlzIGV4YWN0bHkKICAgICAgICAgICAgICAgICBhcyBzdG9yZWQgaW4gdGhlIGZpbGUgKHdoaWNoIGlzIGFzIGluIFBFUCAzNzYpLgogICAgICAgICIiIgogICAgICAgIHJlc3VsdHMgPSBbXQogICAgICAgIHIgPSBzZWxmLmdldF9kaXN0aW5mb19yZXNvdXJjZSgnUkVDT1JEJykKICAgICAgICB3aXRoIGNvbnRleHRsaWIuY2xvc2luZyhyLmFzX3N0cmVhbSgpKSBhcyBzdHJlYW06CiAgICAgICAgICAgIHdpdGggQ1NWUmVhZGVyKHN0cmVhbT1zdHJlYW0pIGFzIHJlY29yZF9yZWFkZXI6CiAgICAgICAgICAgICAgICAjIEJhc2UgbG9jYXRpb24gaXMgcGFyZW50IGRpciBvZiAuZGlzdC1pbmZvIGRpcgogICAgICAgICAgICAgICAgI2Jhc2VfbG9jYXRpb24gPSBvcy5wYXRoLmRpcm5hbWUoc2VsZi5wYXRoKQogICAgICAgICAgICAgICAgI2Jhc2VfbG9jYXRpb24gPSBvcy5wYXRoLmFic3BhdGgoYmFzZV9sb2NhdGlvbikKICAgICAgICAgICAgICAgIGZvciByb3cgaW4gcmVjb3JkX3JlYWRlcjoKICAgICAgICAgICAgICAgICAgICBtaXNzaW5nID0gW05vbmUgZm9yIGkgaW4gcmFuZ2UobGVuKHJvdyksIDMpXQogICAgICAgICAgICAgICAgICAgIHBhdGgsIGNoZWNrc3VtLCBzaXplID0gcm93ICsgbWlzc2luZwogICAgICAgICAgICAgICAgICAgICNpZiBub3Qgb3MucGF0aC5pc2FicyhwYXRoKToKICAgICAgICAgICAgICAgICAgICAjICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoJy8nLCBvcy5zZXApCiAgICAgICAgICAgICAgICAgICAgIyAgICBwYXRoID0gb3MucGF0aC5qb2luKGJhc2VfbG9jYXRpb24sIHBhdGgpCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoKHBhdGgsIGNoZWNrc3VtLCBzaXplKSkKICAgICAgICByZXR1cm4gcmVzdWx0cwoKICAgIEBjYWNoZWRfcHJvcGVydHkKICAgIGRlZiBleHBvcnRzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiB0aGUgaW5mb3JtYXRpb24gZXhwb3J0ZWQgYnkgdGhpcyBkaXN0cmlidXRpb24uCiAgICAgICAgOnJldHVybjogQSBkaWN0aW9uYXJ5IG9mIGV4cG9ydHMsIG1hcHBpbmcgYW4gZXhwb3J0IGNhdGVnb3J5IHRvIGEgZGljdAogICAgICAgICAgICAgICAgIG9mIDpjbGFzczpgRXhwb3J0RW50cnlgIGluc3RhbmNlcyBkZXNjcmliaW5nIHRoZSBpbmRpdmlkdWFsCiAgICAgICAgICAgICAgICAgZXhwb3J0IGVudHJpZXMsIGFuZCBrZXllZCBieSBuYW1lLgogICAgICAgICIiIgogICAgICAgIHJlc3VsdCA9IHt9CiAgICAgICAgciA9IHNlbGYuZ2V0X2Rpc3RpbmZvX3Jlc291cmNlKEVYUE9SVFNfRklMRU5BTUUpCiAgICAgICAgaWYgcjoKICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5yZWFkX2V4cG9ydHMoKQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgcmVhZF9leHBvcnRzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJlYWQgZXhwb3J0cyBkYXRhIGZyb20gYSBmaWxlIGluIC5pbmkgZm9ybWF0LgoKICAgICAgICA6cmV0dXJuOiBBIGRpY3Rpb25hcnkgb2YgZXhwb3J0cywgbWFwcGluZyBhbiBleHBvcnQgY2F0ZWdvcnkgdG8gYSBsaXN0CiAgICAgICAgICAgICAgICAgb2YgOmNsYXNzOmBFeHBvcnRFbnRyeWAgaW5zdGFuY2VzIGRlc2NyaWJpbmcgdGhlIGluZGl2aWR1YWwKICAgICAgICAgICAgICAgICBleHBvcnQgZW50cmllcy4KICAgICAgICAiIiIKICAgICAgICByZXN1bHQgPSB7fQogICAgICAgIHIgPSBzZWxmLmdldF9kaXN0aW5mb19yZXNvdXJjZShFWFBPUlRTX0ZJTEVOQU1FKQogICAgICAgIGlmIHI6CiAgICAgICAgICAgIHdpdGggY29udGV4dGxpYi5jbG9zaW5nKHIuYXNfc3RyZWFtKCkpIGFzIHN0cmVhbToKICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlYWRfZXhwb3J0cyhzdHJlYW0pCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiB3cml0ZV9leHBvcnRzKHNlbGYsIGV4cG9ydHMpOgogICAgICAgICIiIgogICAgICAgIFdyaXRlIGEgZGljdGlvbmFyeSBvZiBleHBvcnRzIHRvIGEgZmlsZSBpbiAuaW5pIGZvcm1hdC4KICAgICAgICA6cGFyYW0gZXhwb3J0czogQSBkaWN0aW9uYXJ5IG9mIGV4cG9ydHMsIG1hcHBpbmcgYW4gZXhwb3J0IGNhdGVnb3J5IHRvCiAgICAgICAgICAgICAgICAgICAgICAgIGEgbGlzdCBvZiA6Y2xhc3M6YEV4cG9ydEVudHJ5YCBpbnN0YW5jZXMgZGVzY3JpYmluZyB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgaW5kaXZpZHVhbCBleHBvcnQgZW50cmllcy4KICAgICAgICAiIiIKICAgICAgICByZiA9IHNlbGYuZ2V0X2Rpc3RpbmZvX2ZpbGUoRVhQT1JUU19GSUxFTkFNRSkKICAgICAgICB3aXRoIG9wZW4ocmYsICd3JykgYXMgZjoKICAgICAgICAgICAgd3JpdGVfZXhwb3J0cyhleHBvcnRzLCBmKQoKICAgIGRlZiBnZXRfcmVzb3VyY2VfcGF0aChzZWxmLCByZWxhdGl2ZV9wYXRoKToKICAgICAgICAiIiIKICAgICAgICBOT1RFOiBUaGlzIEFQSSBtYXkgY2hhbmdlIGluIHRoZSBmdXR1cmUuCgogICAgICAgIFJldHVybiB0aGUgYWJzb2x1dGUgcGF0aCB0byBhIHJlc291cmNlIGZpbGUgd2l0aCB0aGUgZ2l2ZW4gcmVsYXRpdmUKICAgICAgICBwYXRoLgoKICAgICAgICA6cGFyYW0gcmVsYXRpdmVfcGF0aDogVGhlIHBhdGgsIHJlbGF0aXZlIHRvIC5kaXN0LWluZm8sIG9mIHRoZSByZXNvdXJjZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBpbnRlcmVzdC4KICAgICAgICA6cmV0dXJuOiBUaGUgYWJzb2x1dGUgcGF0aCB3aGVyZSB0aGUgcmVzb3VyY2UgaXMgdG8gYmUgZm91bmQuCiAgICAgICAgIiIiCiAgICAgICAgciA9IHNlbGYuZ2V0X2Rpc3RpbmZvX3Jlc291cmNlKCdSRVNPVVJDRVMnKQogICAgICAgIHdpdGggY29udGV4dGxpYi5jbG9zaW5nKHIuYXNfc3RyZWFtKCkpIGFzIHN0cmVhbToKICAgICAgICAgICAgd2l0aCBDU1ZSZWFkZXIoc3RyZWFtPXN0cmVhbSkgYXMgcmVzb3VyY2VzX3JlYWRlcjoKICAgICAgICAgICAgICAgIGZvciByZWxhdGl2ZSwgZGVzdGluYXRpb24gaW4gcmVzb3VyY2VzX3JlYWRlcjoKICAgICAgICAgICAgICAgICAgICBpZiByZWxhdGl2ZSA9PSByZWxhdGl2ZV9wYXRoOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVzdGluYXRpb24KICAgICAgICByYWlzZSBLZXlFcnJvcignbm8gcmVzb3VyY2UgZmlsZSB3aXRoIHJlbGF0aXZlIHBhdGggJXIgJwogICAgICAgICAgICAgICAgICAgICAgICdpcyBpbnN0YWxsZWQnICUgcmVsYXRpdmVfcGF0aCkKCiAgICBkZWYgbGlzdF9pbnN0YWxsZWRfZmlsZXMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgSXRlcmF0ZXMgb3ZlciB0aGUgYGBSRUNPUkRgYCBlbnRyaWVzIGFuZCByZXR1cm5zIGEgdHVwbGUKICAgICAgICBgYChwYXRoLCBoYXNoLCBzaXplKWBgIGZvciBlYWNoIGxpbmUuCgogICAgICAgIDpyZXR1cm5zOiBpdGVyYXRvciBvZiAocGF0aCwgaGFzaCwgc2l6ZSkKICAgICAgICAiIiIKICAgICAgICBmb3IgcmVzdWx0IGluIHNlbGYuX2dldF9yZWNvcmRzKCk6CiAgICAgICAgICAgIHlpZWxkIHJlc3VsdAoKICAgIGRlZiB3cml0ZV9pbnN0YWxsZWRfZmlsZXMoc2VsZiwgcGF0aHMsIHByZWZpeCwgZHJ5X3J1bj1GYWxzZSk6CiAgICAgICAgIiIiCiAgICAgICAgV3JpdGVzIHRoZSBgYFJFQ09SRGBgIGZpbGUsIHVzaW5nIHRoZSBgYHBhdGhzYGAgaXRlcmFibGUgcGFzc2VkIGluLiBBbnkKICAgICAgICBleGlzdGluZyBgYFJFQ09SRGBgIGZpbGUgaXMgc2lsZW50bHkgb3ZlcndyaXR0ZW4uCgogICAgICAgIHByZWZpeCBpcyB1c2VkIHRvIGRldGVybWluZSB3aGVuIHRvIHdyaXRlIGFic29sdXRlIHBhdGhzLgogICAgICAgICIiIgogICAgICAgIHByZWZpeCA9IG9zLnBhdGguam9pbihwcmVmaXgsICcnKQogICAgICAgIGJhc2UgPSBvcy5wYXRoLmRpcm5hbWUoc2VsZi5wYXRoKQogICAgICAgIGJhc2VfdW5kZXJfcHJlZml4ID0gYmFzZS5zdGFydHN3aXRoKHByZWZpeCkKICAgICAgICBiYXNlID0gb3MucGF0aC5qb2luKGJhc2UsICcnKQogICAgICAgIHJlY29yZF9wYXRoID0gc2VsZi5nZXRfZGlzdGluZm9fZmlsZSgnUkVDT1JEJykKICAgICAgICBsb2dnZXIuaW5mbygnY3JlYXRpbmcgJXMnLCByZWNvcmRfcGF0aCkKICAgICAgICBpZiBkcnlfcnVuOgogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIHdpdGggQ1NWV3JpdGVyKHJlY29yZF9wYXRoKSBhcyB3cml0ZXI6CiAgICAgICAgICAgIGZvciBwYXRoIGluIHBhdGhzOgogICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2RpcihwYXRoKSBvciBwYXRoLmVuZHN3aXRoKCgnLnB5YycsICcucHlvJykpOgogICAgICAgICAgICAgICAgICAgICMgZG8gbm90IHB1dCBzaXplIGFuZCBoYXNoLCBhcyBpbiBQRVAtMzc2CiAgICAgICAgICAgICAgICAgICAgaGFzaF92YWx1ZSA9IHNpemUgPSAnJwogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBzaXplID0gJyVkJyAlIG9zLnBhdGguZ2V0c2l6ZShwYXRoKQogICAgICAgICAgICAgICAgICAgIHdpdGggb3BlbihwYXRoLCAncmInKSBhcyBmcDoKICAgICAgICAgICAgICAgICAgICAgICAgaGFzaF92YWx1ZSA9IHNlbGYuZ2V0X2hhc2goZnAucmVhZCgpKQogICAgICAgICAgICAgICAgaWYgcGF0aC5zdGFydHN3aXRoKGJhc2UpIG9yIChiYXNlX3VuZGVyX3ByZWZpeCBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC5zdGFydHN3aXRoKHByZWZpeCkpOgogICAgICAgICAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLnJlbHBhdGgocGF0aCwgYmFzZSkKICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZXJvdygocGF0aCwgaGFzaF92YWx1ZSwgc2l6ZSkpCgogICAgICAgICAgICAjIGFkZCB0aGUgUkVDT1JEIGZpbGUgaXRzZWxmCiAgICAgICAgICAgIGlmIHJlY29yZF9wYXRoLnN0YXJ0c3dpdGgoYmFzZSk6CiAgICAgICAgICAgICAgICByZWNvcmRfcGF0aCA9IG9zLnBhdGgucmVscGF0aChyZWNvcmRfcGF0aCwgYmFzZSkKICAgICAgICAgICAgd3JpdGVyLndyaXRlcm93KChyZWNvcmRfcGF0aCwgJycsICcnKSkKICAgICAgICByZXR1cm4gcmVjb3JkX3BhdGgKCiAgICBkZWYgY2hlY2tfaW5zdGFsbGVkX2ZpbGVzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIENoZWNrcyB0aGF0IHRoZSBoYXNoZXMgYW5kIHNpemVzIG9mIHRoZSBmaWxlcyBpbiBgYFJFQ09SRGBgIGFyZQogICAgICAgIG1hdGNoZWQgYnkgdGhlIGZpbGVzIHRoZW1zZWx2ZXMuIFJldHVybnMgYSAocG9zc2libHkgZW1wdHkpIGxpc3Qgb2YKICAgICAgICBtaXNtYXRjaGVzLiBFYWNoIGVudHJ5IGluIHRoZSBtaXNtYXRjaCBsaXN0IHdpbGwgYmUgYSB0dXBsZSBjb25zaXN0aW5nCiAgICAgICAgb2YgdGhlIHBhdGgsICdleGlzdHMnLCAnc2l6ZScgb3IgJ2hhc2gnIGFjY29yZGluZyB0byB3aGF0IGRpZG4ndCBtYXRjaAogICAgICAgIChleGlzdGVuY2UgaXMgY2hlY2tlZCBmaXJzdCwgdGhlbiBzaXplLCB0aGVuIGhhc2gpLCB0aGUgZXhwZWN0ZWQKICAgICAgICB2YWx1ZSBhbmQgdGhlIGFjdHVhbCB2YWx1ZS4KICAgICAgICAiIiIKICAgICAgICBtaXNtYXRjaGVzID0gW10KICAgICAgICBiYXNlID0gb3MucGF0aC5kaXJuYW1lKHNlbGYucGF0aCkKICAgICAgICByZWNvcmRfcGF0aCA9IHNlbGYuZ2V0X2Rpc3RpbmZvX2ZpbGUoJ1JFQ09SRCcpCiAgICAgICAgZm9yIHBhdGgsIGhhc2hfdmFsdWUsIHNpemUgaW4gc2VsZi5saXN0X2luc3RhbGxlZF9maWxlcygpOgogICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2FicyhwYXRoKToKICAgICAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oYmFzZSwgcGF0aCkKICAgICAgICAgICAgaWYgcGF0aCA9PSByZWNvcmRfcGF0aDoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhwYXRoKToKICAgICAgICAgICAgICAgIG1pc21hdGNoZXMuYXBwZW5kKChwYXRoLCAnZXhpc3RzJywgVHJ1ZSwgRmFsc2UpKQogICAgICAgICAgICBlbGlmIG9zLnBhdGguaXNmaWxlKHBhdGgpOgogICAgICAgICAgICAgICAgYWN0dWFsX3NpemUgPSBzdHIob3MucGF0aC5nZXRzaXplKHBhdGgpKQogICAgICAgICAgICAgICAgaWYgc2l6ZSBhbmQgYWN0dWFsX3NpemUgIT0gc2l6ZToKICAgICAgICAgICAgICAgICAgICBtaXNtYXRjaGVzLmFwcGVuZCgocGF0aCwgJ3NpemUnLCBzaXplLCBhY3R1YWxfc2l6ZSkpCiAgICAgICAgICAgICAgICBlbGlmIGhhc2hfdmFsdWU6CiAgICAgICAgICAgICAgICAgICAgaWYgJz0nIGluIGhhc2hfdmFsdWU6CiAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hlciA9IGhhc2hfdmFsdWUuc3BsaXQoJz0nLCAxKVswXQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hlciA9IE5vbmUKCiAgICAgICAgICAgICAgICAgICAgd2l0aCBvcGVuKHBhdGgsICdyYicpIGFzIGY6CiAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbF9oYXNoID0gc2VsZi5nZXRfaGFzaChmLnJlYWQoKSwgaGFzaGVyKQogICAgICAgICAgICAgICAgICAgICAgICBpZiBhY3R1YWxfaGFzaCAhPSBoYXNoX3ZhbHVlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzbWF0Y2hlcy5hcHBlbmQoKHBhdGgsICdoYXNoJywgaGFzaF92YWx1ZSwgYWN0dWFsX2hhc2gpKQogICAgICAgIHJldHVybiBtaXNtYXRjaGVzCgogICAgQGNhY2hlZF9wcm9wZXJ0eQogICAgZGVmIHNoYXJlZF9sb2NhdGlvbnMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgQSBkaWN0aW9uYXJ5IG9mIHNoYXJlZCBsb2NhdGlvbnMgd2hvc2Uga2V5cyBhcmUgaW4gdGhlIHNldCAncHJlZml4JywKICAgICAgICAncHVyZWxpYicsICdwbGF0bGliJywgJ3NjcmlwdHMnLCAnaGVhZGVycycsICdkYXRhJyBhbmQgJ25hbWVzcGFjZScuCiAgICAgICAgVGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgaXMgdGhlIGFic29sdXRlIHBhdGggb2YgdGhhdCBjYXRlZ29yeSBmb3IKICAgICAgICB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIHRha2VzIGludG8gYWNjb3VudCBhbnkgcGF0aHMgc2VsZWN0ZWQgYnkgdGhlCiAgICAgICAgdXNlciBhdCBpbnN0YWxsYXRpb24gdGltZSAoZS5nLiB2aWEgY29tbWFuZC1saW5lIGFyZ3VtZW50cykuIEluIHRoZQogICAgICAgIGNhc2Ugb2YgdGhlICduYW1lc3BhY2UnIGtleSwgdGhpcyB3b3VsZCBiZSBhIGxpc3Qgb2YgYWJzb2x1dGUgcGF0aHMKICAgICAgICBmb3IgdGhlIHJvb3RzIG9mIG5hbWVzcGFjZSBwYWNrYWdlcyBpbiB0aGlzIGRpc3RyaWJ1dGlvbi4KCiAgICAgICAgVGhlIGZpcnN0IHRpbWUgdGhpcyBwcm9wZXJ0eSBpcyBhY2Nlc3NlZCwgdGhlIHJlbGV2YW50IGluZm9ybWF0aW9uIGlzCiAgICAgICAgcmVhZCBmcm9tIHRoZSBTSEFSRUQgZmlsZSBpbiB0aGUgLmRpc3QtaW5mbyBkaXJlY3RvcnkuCiAgICAgICAgIiIiCiAgICAgICAgcmVzdWx0ID0ge30KICAgICAgICBzaGFyZWRfcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLnBhdGgsICdTSEFSRUQnKQogICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKHNoYXJlZF9wYXRoKToKICAgICAgICAgICAgd2l0aCBjb2RlY3Mub3BlbihzaGFyZWRfcGF0aCwgJ3InLCBlbmNvZGluZz0ndXRmLTgnKSBhcyBmOgogICAgICAgICAgICAgICAgbGluZXMgPSBmLnJlYWQoKS5zcGxpdGxpbmVzKCkKICAgICAgICAgICAgZm9yIGxpbmUgaW4gbGluZXM6CiAgICAgICAgICAgICAgICBrZXksIHZhbHVlID0gbGluZS5zcGxpdCgnPScsIDEpCiAgICAgICAgICAgICAgICBpZiBrZXkgPT0gJ25hbWVzcGFjZSc6CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnNldGRlZmF1bHQoa2V5LCBbXSkuYXBwZW5kKHZhbHVlKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IHZhbHVlCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiB3cml0ZV9zaGFyZWRfbG9jYXRpb25zKHNlbGYsIHBhdGhzLCBkcnlfcnVuPUZhbHNlKToKICAgICAgICAiIiIKICAgICAgICBXcml0ZSBzaGFyZWQgbG9jYXRpb24gaW5mb3JtYXRpb24gdG8gdGhlIFNIQVJFRCBmaWxlIGluIC5kaXN0LWluZm8uCiAgICAgICAgOnBhcmFtIHBhdGhzOiBBIGRpY3Rpb25hcnkgYXMgZGVzY3JpYmVkIGluIHRoZSBkb2N1bWVudGF0aW9uIGZvcgogICAgICAgIDptZXRoOmBzaGFyZWRfbG9jYXRpb25zYC4KICAgICAgICA6cGFyYW0gZHJ5X3J1bjogSWYgVHJ1ZSwgdGhlIGFjdGlvbiBpcyBsb2dnZWQgYnV0IG5vIGZpbGUgaXMgYWN0dWFsbHkKICAgICAgICAgICAgICAgICAgICAgICAgd3JpdHRlbi4KICAgICAgICA6cmV0dXJuOiBUaGUgcGF0aCBvZiB0aGUgZmlsZSB3cml0dGVuIHRvLgogICAgICAgICIiIgogICAgICAgIHNoYXJlZF9wYXRoID0gb3MucGF0aC5qb2luKHNlbGYucGF0aCwgJ1NIQVJFRCcpCiAgICAgICAgbG9nZ2VyLmluZm8oJ2NyZWF0aW5nICVzJywgc2hhcmVkX3BhdGgpCiAgICAgICAgaWYgZHJ5X3J1bjoKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICBsaW5lcyA9IFtdCiAgICAgICAgZm9yIGtleSBpbiAoJ3ByZWZpeCcsICdsaWInLCAnaGVhZGVycycsICdzY3JpcHRzJywgJ2RhdGEnKToKICAgICAgICAgICAgcGF0aCA9IHBhdGhzW2tleV0KICAgICAgICAgICAgaWYgb3MucGF0aC5pc2RpcihwYXRoc1trZXldKToKICAgICAgICAgICAgICAgIGxpbmVzLmFwcGVuZCgnJXM9JXMnICUgKGtleSwgIHBhdGgpKQogICAgICAgIGZvciBucyBpbiBwYXRocy5nZXQoJ25hbWVzcGFjZScsICgpKToKICAgICAgICAgICAgbGluZXMuYXBwZW5kKCduYW1lc3BhY2U9JXMnICUgbnMpCgogICAgICAgIHdpdGggY29kZWNzLm9wZW4oc2hhcmVkX3BhdGgsICd3JywgZW5jb2Rpbmc9J3V0Zi04JykgYXMgZjoKICAgICAgICAgICAgZi53cml0ZSgnXG4nLmpvaW4obGluZXMpKQogICAgICAgIHJldHVybiBzaGFyZWRfcGF0aAoKICAgIGRlZiBnZXRfZGlzdGluZm9fcmVzb3VyY2Uoc2VsZiwgcGF0aCk6CiAgICAgICAgaWYgcGF0aCBub3QgaW4gRElTVF9GSUxFUzoKICAgICAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbignaW52YWxpZCBwYXRoIGZvciBhIGRpc3QtaW5mbyBmaWxlOiAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyVyIGF0ICVyJyAlIChwYXRoLCBzZWxmLnBhdGgpKQogICAgICAgIGZpbmRlciA9IHJlc291cmNlcy5maW5kZXJfZm9yX3BhdGgoc2VsZi5wYXRoKQogICAgICAgIGlmIGZpbmRlciBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKCdVbmFibGUgdG8gZ2V0IGEgZmluZGVyIGZvciAlcycgJSBzZWxmLnBhdGgpCiAgICAgICAgcmV0dXJuIGZpbmRlci5maW5kKHBhdGgpCgogICAgZGVmIGdldF9kaXN0aW5mb19maWxlKHNlbGYsIHBhdGgpOgogICAgICAgICIiIgogICAgICAgIFJldHVybnMgYSBwYXRoIGxvY2F0ZWQgdW5kZXIgdGhlIGBgLmRpc3QtaW5mb2BgIGRpcmVjdG9yeS4gUmV0dXJucyBhCiAgICAgICAgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcGF0aC4KCiAgICAgICAgOnBhcmFtZXRlciBwYXRoOiBhIGBgJy8nYGAtc2VwYXJhdGVkIHBhdGggcmVsYXRpdmUgdG8gdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICBgYC5kaXN0LWluZm9gYCBkaXJlY3Rvcnkgb3IgYW4gYWJzb2x1dGUgcGF0aDsKICAgICAgICAgICAgICAgICAgICAgICAgIElmICpwYXRoKiBpcyBhbiBhYnNvbHV0ZSBwYXRoIGFuZCBkb2Vzbid0IHN0YXJ0CiAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHRoZSBgYC5kaXN0LWluZm9gYCBkaXJlY3RvcnkgcGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgIGEgOmNsYXNzOmBEaXN0bGliRXhjZXB0aW9uYCBpcyByYWlzZWQKICAgICAgICA6dHlwZSBwYXRoOiBzdHIKICAgICAgICA6cnR5cGU6IHN0cgogICAgICAgICIiIgogICAgICAgICMgQ2hlY2sgaWYgaXQgaXMgYW4gYWJzb2x1dGUgcGF0aCAgIyBYWFggdXNlIHJlbHBhdGgsIGFkZCB0ZXN0cwogICAgICAgIGlmIHBhdGguZmluZChvcy5zZXApID49IDA6CiAgICAgICAgICAgICMgaXQncyBhbiBhYnNvbHV0ZSBwYXRoPwogICAgICAgICAgICBkaXN0aW5mb19kaXJuYW1lLCBwYXRoID0gcGF0aC5zcGxpdChvcy5zZXApWy0yOl0KICAgICAgICAgICAgaWYgZGlzdGluZm9fZGlybmFtZSAhPSBzZWxmLnBhdGguc3BsaXQob3Muc2VwKVstMV06CiAgICAgICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgICAgICdkaXN0LWluZm8gZmlsZSAlciBkb2VzIG5vdCBiZWxvbmcgdG8gdGhlICVyICVzICcKICAgICAgICAgICAgICAgICAgICAnZGlzdHJpYnV0aW9uJyAlIChwYXRoLCBzZWxmLm5hbWUsIHNlbGYudmVyc2lvbikpCgogICAgICAgICMgVGhlIGZpbGUgbXVzdCBiZSByZWxhdGl2ZQogICAgICAgIGlmIHBhdGggbm90IGluIERJU1RfRklMRVM6CiAgICAgICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oJ2ludmFsaWQgcGF0aCBmb3IgYSBkaXN0LWluZm8gZmlsZTogJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICclciBhdCAlcicgJSAocGF0aCwgc2VsZi5wYXRoKSkKCiAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbihzZWxmLnBhdGgsIHBhdGgpCgogICAgZGVmIGxpc3RfZGlzdGluZm9fZmlsZXMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgSXRlcmF0ZXMgb3ZlciB0aGUgYGBSRUNPUkRgYCBlbnRyaWVzIGFuZCByZXR1cm5zIHBhdGhzIGZvciBlYWNoIGxpbmUgaWYKICAgICAgICB0aGUgcGF0aCBpcyBwb2ludGluZyB0byBhIGZpbGUgbG9jYXRlZCBpbiB0aGUgYGAuZGlzdC1pbmZvYGAgZGlyZWN0b3J5CiAgICAgICAgb3Igb25lIG9mIGl0cyBzdWJkaXJlY3Rvcmllcy4KCiAgICAgICAgOnJldHVybnM6IGl0ZXJhdG9yIG9mIHBhdGhzCiAgICAgICAgIiIiCiAgICAgICAgYmFzZSA9IG9zLnBhdGguZGlybmFtZShzZWxmLnBhdGgpCiAgICAgICAgZm9yIHBhdGgsIGNoZWNrc3VtLCBzaXplIGluIHNlbGYuX2dldF9yZWNvcmRzKCk6CiAgICAgICAgICAgICMgWFhYIGFkZCBzZXBhcmF0b3Igb3IgdXNlIHJlYWwgcmVscGF0aCBhbGdvCiAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzYWJzKHBhdGgpOgogICAgICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihiYXNlLCBwYXRoKQogICAgICAgICAgICBpZiBwYXRoLnN0YXJ0c3dpdGgoc2VsZi5wYXRoKToKICAgICAgICAgICAgICAgIHlpZWxkIHBhdGgKCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gKGlzaW5zdGFuY2Uob3RoZXIsIEluc3RhbGxlZERpc3RyaWJ1dGlvbikgYW5kCiAgICAgICAgICAgICAgICBzZWxmLnBhdGggPT0gb3RoZXIucGF0aCkKCiAgICAjIFNlZSBodHRwOi8vZG9jcy5weXRob24ub3JnL3JlZmVyZW5jZS9kYXRhbW9kZWwjb2JqZWN0Ll9faGFzaF9fCiAgICBfX2hhc2hfXyA9IG9iamVjdC5fX2hhc2hfXwoKCmNsYXNzIEVnZ0luZm9EaXN0cmlidXRpb24oQmFzZUluc3RhbGxlZERpc3RyaWJ1dGlvbik6CiAgICAiIiJDcmVhdGVkIHdpdGggdGhlICpwYXRoKiBvZiB0aGUgYGAuZWdnLWluZm9gYCBkaXJlY3Rvcnkgb3IgZmlsZSBwcm92aWRlZAogICAgdG8gdGhlIGNvbnN0cnVjdG9yLiBJdCByZWFkcyB0aGUgbWV0YWRhdGEgY29udGFpbmVkIGluIHRoZSBmaWxlIGl0c2VsZiwgb3IKICAgIGlmIHRoZSBnaXZlbiBwYXRoIGhhcHBlbnMgdG8gYmUgYSBkaXJlY3RvcnksIHRoZSBtZXRhZGF0YSBpcyByZWFkIGZyb20gdGhlCiAgICBmaWxlIGBgUEtHLUlORk9gYCB1bmRlciB0aGF0IGRpcmVjdG9yeS4iIiIKCiAgICByZXF1ZXN0ZWQgPSBUcnVlICAgICMgYXMgd2UgaGF2ZSBubyB3YXkgb2Yga25vd2luZywgYXNzdW1lIGl0IHdhcwogICAgc2hhcmVkX2xvY2F0aW9ucyA9IHt9CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdGgsIGVudj1Ob25lKToKICAgICAgICBkZWYgc2V0X25hbWVfYW5kX3ZlcnNpb24ocywgbiwgdik6CiAgICAgICAgICAgIHMubmFtZSA9IG4KICAgICAgICAgICAgcy5rZXkgPSBuLmxvd2VyKCkgICAjIGZvciBjYXNlLWluc2Vuc2l0aXZlIGNvbXBhcmlzb25zCiAgICAgICAgICAgIHMudmVyc2lvbiA9IHYKCiAgICAgICAgc2VsZi5wYXRoID0gcGF0aAogICAgICAgIHNlbGYuZGlzdF9wYXRoID0gZW52CiAgICAgICAgaWYgZW52IGFuZCBlbnYuX2NhY2hlX2VuYWJsZWQgYW5kIHBhdGggaW4gZW52Ll9jYWNoZV9lZ2cucGF0aDoKICAgICAgICAgICAgbWV0YWRhdGEgPSBlbnYuX2NhY2hlX2VnZy5wYXRoW3BhdGhdLm1ldGFkYXRhCiAgICAgICAgICAgIHNldF9uYW1lX2FuZF92ZXJzaW9uKHNlbGYsIG1ldGFkYXRhLm5hbWUsIG1ldGFkYXRhLnZlcnNpb24pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbWV0YWRhdGEgPSBzZWxmLl9nZXRfbWV0YWRhdGEocGF0aCkKCiAgICAgICAgICAgICMgTmVlZCB0byBiZSBzZXQgYmVmb3JlIGNhY2hpbmcKICAgICAgICAgICAgc2V0X25hbWVfYW5kX3ZlcnNpb24oc2VsZiwgbWV0YWRhdGEubmFtZSwgbWV0YWRhdGEudmVyc2lvbikKCiAgICAgICAgICAgIGlmIGVudiBhbmQgZW52Ll9jYWNoZV9lbmFibGVkOgogICAgICAgICAgICAgICAgZW52Ll9jYWNoZV9lZ2cuYWRkKHNlbGYpCiAgICAgICAgc3VwZXIoRWdnSW5mb0Rpc3RyaWJ1dGlvbiwgc2VsZikuX19pbml0X18obWV0YWRhdGEsIHBhdGgsIGVudikKCiAgICBkZWYgX2dldF9tZXRhZGF0YShzZWxmLCBwYXRoKToKICAgICAgICByZXF1aXJlcyA9IE5vbmUKCiAgICAgICAgZGVmIHBhcnNlX3JlcXVpcmVzX2RhdGEoZGF0YSk6CiAgICAgICAgICAgICIiIkNyZWF0ZSBhIGxpc3Qgb2YgZGVwZW5kZW5jaWVzIGZyb20gYSByZXF1aXJlcy50eHQgZmlsZS4KCiAgICAgICAgICAgICpkYXRhKjogdGhlIGNvbnRlbnRzIG9mIGEgc2V0dXB0b29scy1wcm9kdWNlZCByZXF1aXJlcy50eHQgZmlsZS4KICAgICAgICAgICAgIiIiCiAgICAgICAgICAgIHJlcXMgPSBbXQogICAgICAgICAgICBsaW5lcyA9IGRhdGEuc3BsaXRsaW5lcygpCiAgICAgICAgICAgIGZvciBsaW5lIGluIGxpbmVzOgogICAgICAgICAgICAgICAgbGluZSA9IGxpbmUuc3RyaXAoKQogICAgICAgICAgICAgICAgaWYgbGluZS5zdGFydHN3aXRoKCdbJyk6CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ1VuZXhwZWN0ZWQgbGluZTogcXVpdHRpbmcgcmVxdWlyZW1lbnQgc2NhbjogJXInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUpCiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgIHIgPSBwYXJzZV9yZXF1aXJlbWVudChsaW5lKQogICAgICAgICAgICAgICAgaWYgbm90IHI6CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ05vdCByZWNvZ25pc2VkIGFzIGEgcmVxdWlyZW1lbnQ6ICVyJywgbGluZSkKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgaWYgci5leHRyYXM6CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ2V4dHJhIHJlcXVpcmVtZW50cyBpbiByZXF1aXJlcy50eHQgYXJlICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbm90IHN1cHBvcnRlZCcpCiAgICAgICAgICAgICAgICBpZiBub3Qgci5jb25zdHJhaW50czoKICAgICAgICAgICAgICAgICAgICByZXFzLmFwcGVuZChyLm5hbWUpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGNvbnMgPSAnLCAnLmpvaW4oJyVzJXMnICUgYyBmb3IgYyBpbiByLmNvbnN0cmFpbnRzKQogICAgICAgICAgICAgICAgICAgIHJlcXMuYXBwZW5kKCclcyAoJXMpJyAlIChyLm5hbWUsIGNvbnMpKQogICAgICAgICAgICByZXR1cm4gcmVxcwoKICAgICAgICBkZWYgcGFyc2VfcmVxdWlyZXNfcGF0aChyZXFfcGF0aCk6CiAgICAgICAgICAgICIiIkNyZWF0ZSBhIGxpc3Qgb2YgZGVwZW5kZW5jaWVzIGZyb20gYSByZXF1aXJlcy50eHQgZmlsZS4KCiAgICAgICAgICAgICpyZXFfcGF0aCo6IHRoZSBwYXRoIHRvIGEgc2V0dXB0b29scy1wcm9kdWNlZCByZXF1aXJlcy50eHQgZmlsZS4KICAgICAgICAgICAgIiIiCgogICAgICAgICAgICByZXFzID0gW10KICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgd2l0aCBjb2RlY3Mub3BlbihyZXFfcGF0aCwgJ3InLCAndXRmLTgnKSBhcyBmcDoKICAgICAgICAgICAgICAgICAgICByZXFzID0gcGFyc2VfcmVxdWlyZXNfZGF0YShmcC5yZWFkKCkpCiAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgogICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICByZXR1cm4gcmVxcwoKICAgICAgICBpZiBwYXRoLmVuZHN3aXRoKCcuZWdnJyk6CiAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIocGF0aCk6CiAgICAgICAgICAgICAgICBtZXRhX3BhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgJ0VHRy1JTkZPJywgJ1BLRy1JTkZPJykKICAgICAgICAgICAgICAgIG1ldGFkYXRhID0gTWV0YWRhdGEocGF0aD1tZXRhX3BhdGgsIHNjaGVtZT0nbGVnYWN5JykKICAgICAgICAgICAgICAgIHJlcV9wYXRoID0gb3MucGF0aC5qb2luKHBhdGgsICdFR0ctSU5GTycsICdyZXF1aXJlcy50eHQnKQogICAgICAgICAgICAgICAgcmVxdWlyZXMgPSBwYXJzZV9yZXF1aXJlc19wYXRoKHJlcV9wYXRoKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBGSVhNRSBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgemlwZmlsZSBpcyBub3QgYXZhaWxhYmxlCiAgICAgICAgICAgICAgICB6aXBmID0gemlwaW1wb3J0LnppcGltcG9ydGVyKHBhdGgpCiAgICAgICAgICAgICAgICBmaWxlb2JqID0gU3RyaW5nSU8oCiAgICAgICAgICAgICAgICAgICAgemlwZi5nZXRfZGF0YSgnRUdHLUlORk8vUEtHLUlORk8nKS5kZWNvZGUoJ3V0ZjgnKSkKICAgICAgICAgICAgICAgIG1ldGFkYXRhID0gTWV0YWRhdGEoZmlsZW9iaj1maWxlb2JqLCBzY2hlbWU9J2xlZ2FjeScpCiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHppcGYuZ2V0X2RhdGEoJ0VHRy1JTkZPL3JlcXVpcmVzLnR4dCcpCiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZXMgPSBwYXJzZV9yZXF1aXJlc19kYXRhKGRhdGEuZGVjb2RlKCd1dGYtOCcpKQogICAgICAgICAgICAgICAgZXhjZXB0IElPRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZXMgPSBOb25lCiAgICAgICAgZWxpZiBwYXRoLmVuZHN3aXRoKCcuZWdnLWluZm8nKToKICAgICAgICAgICAgaWYgb3MucGF0aC5pc2RpcihwYXRoKToKICAgICAgICAgICAgICAgIHJlcV9wYXRoID0gb3MucGF0aC5qb2luKHBhdGgsICdyZXF1aXJlcy50eHQnKQogICAgICAgICAgICAgICAgcmVxdWlyZXMgPSBwYXJzZV9yZXF1aXJlc19wYXRoKHJlcV9wYXRoKQogICAgICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCAnUEtHLUlORk8nKQogICAgICAgICAgICBtZXRhZGF0YSA9IE1ldGFkYXRhKHBhdGg9cGF0aCwgc2NoZW1lPSdsZWdhY3knKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oJ3BhdGggbXVzdCBlbmQgd2l0aCAuZWdnLWluZm8gb3IgLmVnZywgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnb3QgJXInICUgcGF0aCkKCiAgICAgICAgaWYgcmVxdWlyZXM6CiAgICAgICAgICAgIG1ldGFkYXRhLmFkZF9yZXF1aXJlbWVudHMocmVxdWlyZXMpCiAgICAgICAgcmV0dXJuIG1ldGFkYXRhCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAnPEVnZ0luZm9EaXN0cmlidXRpb24gJXIgJXMgYXQgJXI+JyAlICgKICAgICAgICAgICAgc2VsZi5uYW1lLCBzZWxmLnZlcnNpb24sIHNlbGYucGF0aCkKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIiVzICVzIiAlIChzZWxmLm5hbWUsIHNlbGYudmVyc2lvbikKCiAgICBkZWYgY2hlY2tfaW5zdGFsbGVkX2ZpbGVzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIENoZWNrcyB0aGF0IHRoZSBoYXNoZXMgYW5kIHNpemVzIG9mIHRoZSBmaWxlcyBpbiBgYFJFQ09SRGBgIGFyZQogICAgICAgIG1hdGNoZWQgYnkgdGhlIGZpbGVzIHRoZW1zZWx2ZXMuIFJldHVybnMgYSAocG9zc2libHkgZW1wdHkpIGxpc3Qgb2YKICAgICAgICBtaXNtYXRjaGVzLiBFYWNoIGVudHJ5IGluIHRoZSBtaXNtYXRjaCBsaXN0IHdpbGwgYmUgYSB0dXBsZSBjb25zaXN0aW5nCiAgICAgICAgb2YgdGhlIHBhdGgsICdleGlzdHMnLCAnc2l6ZScgb3IgJ2hhc2gnIGFjY29yZGluZyB0byB3aGF0IGRpZG4ndCBtYXRjaAogICAgICAgIChleGlzdGVuY2UgaXMgY2hlY2tlZCBmaXJzdCwgdGhlbiBzaXplLCB0aGVuIGhhc2gpLCB0aGUgZXhwZWN0ZWQKICAgICAgICB2YWx1ZSBhbmQgdGhlIGFjdHVhbCB2YWx1ZS4KICAgICAgICAiIiIKICAgICAgICBtaXNtYXRjaGVzID0gW10KICAgICAgICByZWNvcmRfcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLnBhdGgsICdpbnN0YWxsZWQtZmlsZXMudHh0JykKICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhyZWNvcmRfcGF0aCk6CiAgICAgICAgICAgIGZvciBwYXRoLCBfLCBfIGluIHNlbGYubGlzdF9pbnN0YWxsZWRfZmlsZXMoKToKICAgICAgICAgICAgICAgIGlmIHBhdGggPT0gcmVjb3JkX3BhdGg6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhwYXRoKToKICAgICAgICAgICAgICAgICAgICBtaXNtYXRjaGVzLmFwcGVuZCgocGF0aCwgJ2V4aXN0cycsIFRydWUsIEZhbHNlKSkKICAgICAgICByZXR1cm4gbWlzbWF0Y2hlcwoKICAgIGRlZiBsaXN0X2luc3RhbGxlZF9maWxlcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBJdGVyYXRlcyBvdmVyIHRoZSBgYGluc3RhbGxlZC1maWxlcy50eHRgYCBlbnRyaWVzIGFuZCByZXR1cm5zIGEgdHVwbGUKICAgICAgICBgYChwYXRoLCBoYXNoLCBzaXplKWBgIGZvciBlYWNoIGxpbmUuCgogICAgICAgIDpyZXR1cm5zOiBhIGxpc3Qgb2YgKHBhdGgsIGhhc2gsIHNpemUpCiAgICAgICAgIiIiCgogICAgICAgIGRlZiBfbWQ1KHBhdGgpOgogICAgICAgICAgICBmID0gb3BlbihwYXRoLCAncmInKQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBjb250ZW50ID0gZi5yZWFkKCkKICAgICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgICAgIGYuY2xvc2UoKQogICAgICAgICAgICByZXR1cm4gaGFzaGxpYi5tZDUoY29udGVudCkuaGV4ZGlnZXN0KCkKCiAgICAgICAgZGVmIF9zaXplKHBhdGgpOgogICAgICAgICAgICByZXR1cm4gb3Muc3RhdChwYXRoKS5zdF9zaXplCgogICAgICAgIHJlY29yZF9wYXRoID0gb3MucGF0aC5qb2luKHNlbGYucGF0aCwgJ2luc3RhbGxlZC1maWxlcy50eHQnKQogICAgICAgIHJlc3VsdCA9IFtdCiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMocmVjb3JkX3BhdGgpOgogICAgICAgICAgICB3aXRoIGNvZGVjcy5vcGVuKHJlY29yZF9wYXRoLCAncicsIGVuY29kaW5nPSd1dGYtOCcpIGFzIGY6CiAgICAgICAgICAgICAgICBmb3IgbGluZSBpbiBmOgogICAgICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnN0cmlwKCkKICAgICAgICAgICAgICAgICAgICBwID0gb3MucGF0aC5ub3JtcGF0aChvcy5wYXRoLmpvaW4oc2VsZi5wYXRoLCBsaW5lKSkKICAgICAgICAgICAgICAgICAgICAjICIuLyIgaXMgcHJlc2VudCBhcyBhIG1hcmtlciBiZXR3ZWVuIGluc3RhbGxlZCBmaWxlcwogICAgICAgICAgICAgICAgICAgICMgYW5kIGluc3RhbGxhdGlvbiBtZXRhZGF0YSBmaWxlcwogICAgICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhwKToKICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ05vbi1leGlzdGVudCBmaWxlOiAlcycsIHApCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHAuZW5kc3dpdGgoKCcucHljJywgJy5weW8nKSk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgICAgICAgICAjb3RoZXJ3aXNlIGZhbGwgdGhyb3VnaCBhbmQgZmFpbAogICAgICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKHApOgogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKChwLCBfbWQ1KHApLCBfc2l6ZShwKSkpCiAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoKHJlY29yZF9wYXRoLCBOb25lLCBOb25lKSkKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIGxpc3RfZGlzdGluZm9fZmlsZXMoc2VsZiwgYWJzb2x1dGU9RmFsc2UpOgogICAgICAgICIiIgogICAgICAgIEl0ZXJhdGVzIG92ZXIgdGhlIGBgaW5zdGFsbGVkLWZpbGVzLnR4dGBgIGVudHJpZXMgYW5kIHJldHVybnMgcGF0aHMgZm9yCiAgICAgICAgZWFjaCBsaW5lIGlmIHRoZSBwYXRoIGlzIHBvaW50aW5nIHRvIGEgZmlsZSBsb2NhdGVkIGluIHRoZQogICAgICAgIGBgLmVnZy1pbmZvYGAgZGlyZWN0b3J5IG9yIG9uZSBvZiBpdHMgc3ViZGlyZWN0b3JpZXMuCgogICAgICAgIDpwYXJhbWV0ZXIgYWJzb2x1dGU6IElmICphYnNvbHV0ZSogaXMgYGBUcnVlYGAsIGVhY2ggcmV0dXJuZWQgcGF0aCBpcwogICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVkIGludG8gYSBsb2NhbCBhYnNvbHV0ZSBwYXRoLiBPdGhlcndpc2UgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3IHZhbHVlIGZyb20gYGBpbnN0YWxsZWQtZmlsZXMudHh0YGAgaXMgcmV0dXJuZWQuCiAgICAgICAgOnR5cGUgYWJzb2x1dGU6IGJvb2xlYW4KICAgICAgICA6cmV0dXJuczogaXRlcmF0b3Igb2YgcGF0aHMKICAgICAgICAiIiIKICAgICAgICByZWNvcmRfcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLnBhdGgsICdpbnN0YWxsZWQtZmlsZXMudHh0JykKICAgICAgICBza2lwID0gVHJ1ZQogICAgICAgIHdpdGggY29kZWNzLm9wZW4ocmVjb3JkX3BhdGgsICdyJywgZW5jb2Rpbmc9J3V0Zi04JykgYXMgZjoKICAgICAgICAgICAgZm9yIGxpbmUgaW4gZjoKICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnN0cmlwKCkKICAgICAgICAgICAgICAgIGlmIGxpbmUgPT0gJy4vJzoKICAgICAgICAgICAgICAgICAgICBza2lwID0gRmFsc2UKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgaWYgbm90IHNraXA6CiAgICAgICAgICAgICAgICAgICAgcCA9IG9zLnBhdGgubm9ybXBhdGgob3MucGF0aC5qb2luKHNlbGYucGF0aCwgbGluZSkpCiAgICAgICAgICAgICAgICAgICAgaWYgcC5zdGFydHN3aXRoKHNlbGYucGF0aCk6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGFic29sdXRlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgcAogICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgbGluZQoKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiAoaXNpbnN0YW5jZShvdGhlciwgRWdnSW5mb0Rpc3RyaWJ1dGlvbikgYW5kCiAgICAgICAgICAgICAgICBzZWxmLnBhdGggPT0gb3RoZXIucGF0aCkKCiAgICAjIFNlZSBodHRwOi8vZG9jcy5weXRob24ub3JnL3JlZmVyZW5jZS9kYXRhbW9kZWwjb2JqZWN0Ll9faGFzaF9fCiAgICBfX2hhc2hfXyA9IG9iamVjdC5fX2hhc2hfXwoKbmV3X2Rpc3RfY2xhc3MgPSBJbnN0YWxsZWREaXN0cmlidXRpb24Kb2xkX2Rpc3RfY2xhc3MgPSBFZ2dJbmZvRGlzdHJpYnV0aW9uCgoKY2xhc3MgRGVwZW5kZW5jeUdyYXBoKG9iamVjdCk6CiAgICAiIiIKICAgIFJlcHJlc2VudHMgYSBkZXBlbmRlbmN5IGdyYXBoIGJldHdlZW4gZGlzdHJpYnV0aW9ucy4KCiAgICBUaGUgZGVwZW5kZW5jeSByZWxhdGlvbnNoaXBzIGFyZSBzdG9yZWQgaW4gYW4gYGBhZGphY2VuY3lfbGlzdGBgIHRoYXQgbWFwcwogICAgZGlzdHJpYnV0aW9ucyB0byBhIGxpc3Qgb2YgYGAob3RoZXIsIGxhYmVsKWBgIHR1cGxlcyB3aGVyZSAgYGBvdGhlcmBgCiAgICBpcyBhIGRpc3RyaWJ1dGlvbiBhbmQgdGhlIGVkZ2UgaXMgbGFiZWxlZCB3aXRoIGBgbGFiZWxgYCAoaS5lLiB0aGUgdmVyc2lvbgogICAgc3BlY2lmaWVyLCBpZiBzdWNoIHdhcyBwcm92aWRlZCkuIEFsc28sIGZvciBtb3JlIGVmZmljaWVudCB0cmF2ZXJzYWwsIGZvcgogICAgZXZlcnkgZGlzdHJpYnV0aW9uIGBgeGBgLCBhIGxpc3Qgb2YgcHJlZGVjZXNzb3JzIGlzIGtlcHQgaW4KICAgIGBgcmV2ZXJzZV9saXN0W3hdYGAuIEFuIGVkZ2UgZnJvbSBkaXN0cmlidXRpb24gYGBhYGAgdG8KICAgIGRpc3RyaWJ1dGlvbiBgYGJgYCBtZWFucyB0aGF0IGBgYWBgIGRlcGVuZHMgb24gYGBiYGAuIElmIGFueSBtaXNzaW5nCiAgICBkZXBlbmRlbmNpZXMgYXJlIGZvdW5kLCB0aGV5IGFyZSBzdG9yZWQgaW4gYGBtaXNzaW5nYGAsIHdoaWNoIGlzIGEKICAgIGRpY3Rpb25hcnkgdGhhdCBtYXBzIGRpc3RyaWJ1dGlvbnMgdG8gYSBsaXN0IG9mIHJlcXVpcmVtZW50cyB0aGF0IHdlcmUgbm90CiAgICBwcm92aWRlZCBieSBhbnkgb3RoZXIgZGlzdHJpYnV0aW9ucy4KICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzZWxmLmFkamFjZW5jeV9saXN0ID0ge30KICAgICAgICBzZWxmLnJldmVyc2VfbGlzdCA9IHt9CiAgICAgICAgc2VsZi5taXNzaW5nID0ge30KCiAgICBkZWYgYWRkX2Rpc3RyaWJ1dGlvbihzZWxmLCBkaXN0cmlidXRpb24pOgogICAgICAgICIiIkFkZCB0aGUgKmRpc3RyaWJ1dGlvbiogdG8gdGhlIGdyYXBoLgoKICAgICAgICA6dHlwZSBkaXN0cmlidXRpb246IDpjbGFzczpgZGlzdHV0aWxzMi5kYXRhYmFzZS5JbnN0YWxsZWREaXN0cmlidXRpb25gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciA6Y2xhc3M6YGRpc3R1dGlsczIuZGF0YWJhc2UuRWdnSW5mb0Rpc3RyaWJ1dGlvbmAKICAgICAgICAiIiIKICAgICAgICBzZWxmLmFkamFjZW5jeV9saXN0W2Rpc3RyaWJ1dGlvbl0gPSBbXQogICAgICAgIHNlbGYucmV2ZXJzZV9saXN0W2Rpc3RyaWJ1dGlvbl0gPSBbXQogICAgICAgICNzZWxmLm1pc3NpbmdbZGlzdHJpYnV0aW9uXSA9IFtdCgogICAgZGVmIGFkZF9lZGdlKHNlbGYsIHgsIHksIGxhYmVsPU5vbmUpOgogICAgICAgICIiIkFkZCBhbiBlZGdlIGZyb20gZGlzdHJpYnV0aW9uICp4KiB0byBkaXN0cmlidXRpb24gKnkqIHdpdGggdGhlIGdpdmVuCiAgICAgICAgKmxhYmVsKi4KCiAgICAgICAgOnR5cGUgeDogOmNsYXNzOmBkaXN0dXRpbHMyLmRhdGFiYXNlLkluc3RhbGxlZERpc3RyaWJ1dGlvbmAgb3IKICAgICAgICAgICAgICAgICA6Y2xhc3M6YGRpc3R1dGlsczIuZGF0YWJhc2UuRWdnSW5mb0Rpc3RyaWJ1dGlvbmAKICAgICAgICA6dHlwZSB5OiA6Y2xhc3M6YGRpc3R1dGlsczIuZGF0YWJhc2UuSW5zdGFsbGVkRGlzdHJpYnV0aW9uYCBvcgogICAgICAgICAgICAgICAgIDpjbGFzczpgZGlzdHV0aWxzMi5kYXRhYmFzZS5FZ2dJbmZvRGlzdHJpYnV0aW9uYAogICAgICAgIDp0eXBlIGxhYmVsOiBgYHN0cmBgIG9yIGBgTm9uZWBgCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5hZGphY2VuY3lfbGlzdFt4XS5hcHBlbmQoKHksIGxhYmVsKSkKICAgICAgICAjIG11bHRpcGxlIGVkZ2VzIGFyZSBhbGxvd2VkLCBzbyBiZSBjYXJlZnVsCiAgICAgICAgaWYgeCBub3QgaW4gc2VsZi5yZXZlcnNlX2xpc3RbeV06CiAgICAgICAgICAgIHNlbGYucmV2ZXJzZV9saXN0W3ldLmFwcGVuZCh4KQoKICAgIGRlZiBhZGRfbWlzc2luZyhzZWxmLCBkaXN0cmlidXRpb24sIHJlcXVpcmVtZW50KToKICAgICAgICAiIiIKICAgICAgICBBZGQgYSBtaXNzaW5nICpyZXF1aXJlbWVudCogZm9yIHRoZSBnaXZlbiAqZGlzdHJpYnV0aW9uKi4KCiAgICAgICAgOnR5cGUgZGlzdHJpYnV0aW9uOiA6Y2xhc3M6YGRpc3R1dGlsczIuZGF0YWJhc2UuSW5zdGFsbGVkRGlzdHJpYnV0aW9uYAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgOmNsYXNzOmBkaXN0dXRpbHMyLmRhdGFiYXNlLkVnZ0luZm9EaXN0cmlidXRpb25gCiAgICAgICAgOnR5cGUgcmVxdWlyZW1lbnQ6IGBgc3RyYGAKICAgICAgICAiIiIKICAgICAgICBsb2dnZXIuZGVidWcoJyVzIG1pc3NpbmcgJXInLCBkaXN0cmlidXRpb24sIHJlcXVpcmVtZW50KQogICAgICAgIHNlbGYubWlzc2luZy5zZXRkZWZhdWx0KGRpc3RyaWJ1dGlvbiwgW10pLmFwcGVuZChyZXF1aXJlbWVudCkKCiAgICBkZWYgX3JlcHJfZGlzdChzZWxmLCBkaXN0KToKICAgICAgICByZXR1cm4gJyVzICVzJyAlIChkaXN0Lm5hbWUsIGRpc3QudmVyc2lvbikKCiAgICBkZWYgcmVwcl9ub2RlKHNlbGYsIGRpc3QsIGxldmVsPTEpOgogICAgICAgICIiIlByaW50cyBvbmx5IGEgc3ViZ3JhcGgiIiIKICAgICAgICBvdXRwdXQgPSBbc2VsZi5fcmVwcl9kaXN0KGRpc3QpXQogICAgICAgIGZvciBvdGhlciwgbGFiZWwgaW4gc2VsZi5hZGphY2VuY3lfbGlzdFtkaXN0XToKICAgICAgICAgICAgZGlzdCA9IHNlbGYuX3JlcHJfZGlzdChvdGhlcikKICAgICAgICAgICAgaWYgbGFiZWwgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBkaXN0ID0gJyVzIFslc10nICUgKGRpc3QsIGxhYmVsKQogICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCcgICAgJyAqIGxldmVsICsgc3RyKGRpc3QpKQogICAgICAgICAgICBzdWJvdXRwdXQgPSBzZWxmLnJlcHJfbm9kZShvdGhlciwgbGV2ZWwgKyAxKQogICAgICAgICAgICBzdWJzID0gc3Vib3V0cHV0LnNwbGl0KCdcbicpCiAgICAgICAgICAgIG91dHB1dC5leHRlbmQoc3Vic1sxOl0pCiAgICAgICAgcmV0dXJuICdcbicuam9pbihvdXRwdXQpCgogICAgZGVmIHRvX2RvdChzZWxmLCBmLCBza2lwX2Rpc2Nvbm5lY3RlZD1UcnVlKToKICAgICAgICAiIiJXcml0ZXMgYSBET1Qgb3V0cHV0IGZvciB0aGUgZ3JhcGggdG8gdGhlIHByb3ZpZGVkIGZpbGUgKmYqLgoKICAgICAgICBJZiAqc2tpcF9kaXNjb25uZWN0ZWQqIGlzIHNldCB0byBgYFRydWVgYCwgdGhlbiBhbGwgZGlzdHJpYnV0aW9ucwogICAgICAgIHRoYXQgYXJlIG5vdCBkZXBlbmRlbnQgb24gYW55IG90aGVyIGRpc3RyaWJ1dGlvbiBhcmUgc2tpcHBlZC4KCiAgICAgICAgOnR5cGUgZjogaGFzIHRvIHN1cHBvcnQgYGBmaWxlYGAtbGlrZSBvcGVyYXRpb25zCiAgICAgICAgOnR5cGUgc2tpcF9kaXNjb25uZWN0ZWQ6IGBgYm9vbGBgCiAgICAgICAgIiIiCiAgICAgICAgZGlzY29ubmVjdGVkID0gW10KCiAgICAgICAgZi53cml0ZSgiZGlncmFwaCBkZXBlbmRlbmNpZXMge1xuIikKICAgICAgICBmb3IgZGlzdCwgYWRqcyBpbiBzZWxmLmFkamFjZW5jeV9saXN0Lml0ZW1zKCk6CiAgICAgICAgICAgIGlmIGxlbihhZGpzKSA9PSAwIGFuZCBub3Qgc2tpcF9kaXNjb25uZWN0ZWQ6CiAgICAgICAgICAgICAgICBkaXNjb25uZWN0ZWQuYXBwZW5kKGRpc3QpCiAgICAgICAgICAgIGZvciBvdGhlciwgbGFiZWwgaW4gYWRqczoKICAgICAgICAgICAgICAgIGlmIG5vdCBsYWJlbCBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgIGYud3JpdGUoJyIlcyIgLT4gIiVzIiBbbGFiZWw9IiVzIl1cbicgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRpc3QubmFtZSwgb3RoZXIubmFtZSwgbGFiZWwpKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBmLndyaXRlKCciJXMiIC0+ICIlcyJcbicgJSAoZGlzdC5uYW1lLCBvdGhlci5uYW1lKSkKICAgICAgICBpZiBub3Qgc2tpcF9kaXNjb25uZWN0ZWQgYW5kIGxlbihkaXNjb25uZWN0ZWQpID4gMDoKICAgICAgICAgICAgZi53cml0ZSgnc3ViZ3JhcGggZGlzY29ubmVjdGVkIHtcbicpCiAgICAgICAgICAgIGYud3JpdGUoJ2xhYmVsID0gIkRpc2Nvbm5lY3RlZCJcbicpCiAgICAgICAgICAgIGYud3JpdGUoJ2JnY29sb3IgPSByZWRcbicpCgogICAgICAgICAgICBmb3IgZGlzdCBpbiBkaXNjb25uZWN0ZWQ6CiAgICAgICAgICAgICAgICBmLndyaXRlKCciJXMiJyAlIGRpc3QubmFtZSkKICAgICAgICAgICAgICAgIGYud3JpdGUoJ1xuJykKICAgICAgICAgICAgZi53cml0ZSgnfVxuJykKICAgICAgICBmLndyaXRlKCd9XG4nKQoKICAgIGRlZiB0b3BvbG9naWNhbF9zb3J0KHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFBlcmZvcm0gYSB0b3BvbG9naWNhbCBzb3J0IG9mIHRoZSBncmFwaC4KICAgICAgICA6cmV0dXJuOiBBIHR1cGxlLCB0aGUgZmlyc3QgZWxlbWVudCBvZiB3aGljaCBpcyBhIHRvcG9sb2dpY2FsbHkgc29ydGVkCiAgICAgICAgICAgICAgICAgbGlzdCBvZiBkaXN0cmlidXRpb25zLCBhbmQgdGhlIHNlY29uZCBlbGVtZW50IG9mIHdoaWNoIGlzIGEKICAgICAgICAgICAgICAgICBsaXN0IG9mIGRpc3RyaWJ1dGlvbnMgdGhhdCBjYW5ub3QgYmUgc29ydGVkIGJlY2F1c2UgdGhleSBoYXZlCiAgICAgICAgICAgICAgICAgY2lyY3VsYXIgZGVwZW5kZW5jaWVzIGFuZCBzbyBmb3JtIGEgY3ljbGUuCiAgICAgICAgIiIiCiAgICAgICAgcmVzdWx0ID0gW10KICAgICAgICAjIE1ha2UgYSBzaGFsbG93IGNvcHkgb2YgdGhlIGFkamFjZW5jeSBsaXN0CiAgICAgICAgYWxpc3QgPSB7fQogICAgICAgIGZvciBrLCB2IGluIHNlbGYuYWRqYWNlbmN5X2xpc3QuaXRlbXMoKToKICAgICAgICAgICAgYWxpc3Rba10gPSB2WzpdCiAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgIyBTZWUgd2hhdCB3ZSBjYW4gcmVtb3ZlIGluIHRoaXMgcnVuCiAgICAgICAgICAgIHRvX3JlbW92ZSA9IFtdCiAgICAgICAgICAgIGZvciBrLCB2IGluIGxpc3QoYWxpc3QuaXRlbXMoKSlbOl06CiAgICAgICAgICAgICAgICBpZiBub3QgdjoKICAgICAgICAgICAgICAgICAgICB0b19yZW1vdmUuYXBwZW5kKGspCiAgICAgICAgICAgICAgICAgICAgZGVsIGFsaXN0W2tdCiAgICAgICAgICAgIGlmIG5vdCB0b19yZW1vdmU6CiAgICAgICAgICAgICAgICAjIFdoYXQncyBsZWZ0IGluIGFsaXN0IChpZiBhbnl0aGluZykgaXMgYSBjeWNsZS4KICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICMgUmVtb3ZlIGZyb20gdGhlIGFkamFjZW5jeSBsaXN0IG9mIG90aGVycwogICAgICAgICAgICBmb3IgaywgdiBpbiBhbGlzdC5pdGVtcygpOgogICAgICAgICAgICAgICAgYWxpc3Rba10gPSBbKGQsIHIpIGZvciBkLCByIGluIHYgaWYgZCBub3QgaW4gdG9fcmVtb3ZlXQogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ01vdmluZyB0byByZXN1bHQ6ICVzJywKICAgICAgICAgICAgICAgICAgICAgICAgIFsnJXMgKCVzKScgJSAoZC5uYW1lLCBkLnZlcnNpb24pIGZvciBkIGluIHRvX3JlbW92ZV0pCiAgICAgICAgICAgIHJlc3VsdC5leHRlbmQodG9fcmVtb3ZlKQogICAgICAgIHJldHVybiByZXN1bHQsIGxpc3QoYWxpc3Qua2V5cygpKQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICAiIiJSZXByZXNlbnRhdGlvbiBvZiB0aGUgZ3JhcGgiIiIKICAgICAgICBvdXRwdXQgPSBbXQogICAgICAgIGZvciBkaXN0LCBhZGpzIGluIHNlbGYuYWRqYWNlbmN5X2xpc3QuaXRlbXMoKToKICAgICAgICAgICAgb3V0cHV0LmFwcGVuZChzZWxmLnJlcHJfbm9kZShkaXN0KSkKICAgICAgICByZXR1cm4gJ1xuJy5qb2luKG91dHB1dCkKCgpkZWYgbWFrZV9ncmFwaChkaXN0cywgc2NoZW1lPSdkZWZhdWx0Jyk6CiAgICAiIiJNYWtlcyBhIGRlcGVuZGVuY3kgZ3JhcGggZnJvbSB0aGUgZ2l2ZW4gZGlzdHJpYnV0aW9ucy4KCiAgICA6cGFyYW1ldGVyIGRpc3RzOiBhIGxpc3Qgb2YgZGlzdHJpYnV0aW9ucwogICAgOnR5cGUgZGlzdHM6IGxpc3Qgb2YgOmNsYXNzOmBkaXN0dXRpbHMyLmRhdGFiYXNlLkluc3RhbGxlZERpc3RyaWJ1dGlvbmAgYW5kCiAgICAgICAgICAgICAgICAgOmNsYXNzOmBkaXN0dXRpbHMyLmRhdGFiYXNlLkVnZ0luZm9EaXN0cmlidXRpb25gIGluc3RhbmNlcwogICAgOnJ0eXBlOiBhIDpjbGFzczpgRGVwZW5kZW5jeUdyYXBoYCBpbnN0YW5jZQogICAgIiIiCiAgICBzY2hlbWUgPSBnZXRfc2NoZW1lKHNjaGVtZSkKICAgIGdyYXBoID0gRGVwZW5kZW5jeUdyYXBoKCkKICAgIHByb3ZpZGVkID0ge30gICMgbWFwcyBuYW1lcyB0byBsaXN0cyBvZiAodmVyc2lvbiwgZGlzdCkgdHVwbGVzCgogICAgIyBmaXJzdCwgYnVpbGQgdGhlIGdyYXBoIGFuZCBmaW5kIG91dCB3aGF0J3MgcHJvdmlkZWQKICAgIGZvciBkaXN0IGluIGRpc3RzOgogICAgICAgIGdyYXBoLmFkZF9kaXN0cmlidXRpb24oZGlzdCkKCiAgICAgICAgZm9yIHAgaW4gZGlzdC5wcm92aWRlczoKICAgICAgICAgICAgbmFtZSwgdmVyc2lvbiA9IHBhcnNlX25hbWVfYW5kX3ZlcnNpb24ocCkKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdBZGQgdG8gcHJvdmlkZWQ6ICVzLCAlcywgJXMnLCBuYW1lLCB2ZXJzaW9uLCBkaXN0KQogICAgICAgICAgICBwcm92aWRlZC5zZXRkZWZhdWx0KG5hbWUsIFtdKS5hcHBlbmQoKHZlcnNpb24sIGRpc3QpKQoKICAgICMgbm93IG1ha2UgdGhlIGVkZ2VzCiAgICBmb3IgZGlzdCBpbiBkaXN0czoKICAgICAgICByZXF1aXJlcyA9IChkaXN0LnJ1bl9yZXF1aXJlcyB8IGRpc3QubWV0YV9yZXF1aXJlcyB8CiAgICAgICAgICAgICAgICAgICAgZGlzdC5idWlsZF9yZXF1aXJlcyB8IGRpc3QuZGV2X3JlcXVpcmVzKQogICAgICAgIGZvciByZXEgaW4gcmVxdWlyZXM6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIG1hdGNoZXIgPSBzY2hlbWUubWF0Y2hlcihyZXEpCiAgICAgICAgICAgIGV4Y2VwdCBVbnN1cHBvcnRlZFZlcnNpb25FcnJvcjoKICAgICAgICAgICAgICAgICMgWFhYIGNvbXBhdC1tb2RlIGlmIGNhbm5vdCByZWFkIHRoZSB2ZXJzaW9uCiAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygnY291bGQgbm90IHJlYWQgdmVyc2lvbiAlciAtIHVzaW5nIG5hbWUgb25seScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXEpCiAgICAgICAgICAgICAgICBuYW1lID0gcmVxLnNwbGl0KClbMF0KICAgICAgICAgICAgICAgIG1hdGNoZXIgPSBzY2hlbWUubWF0Y2hlcihuYW1lKQoKICAgICAgICAgICAgbmFtZSA9IG1hdGNoZXIua2V5ICAgIyBjYXNlLWluc2Vuc2l0aXZlCgogICAgICAgICAgICBtYXRjaGVkID0gRmFsc2UKICAgICAgICAgICAgaWYgbmFtZSBpbiBwcm92aWRlZDoKICAgICAgICAgICAgICAgIGZvciB2ZXJzaW9uLCBwcm92aWRlciBpbiBwcm92aWRlZFtuYW1lXToKICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gbWF0Y2hlci5tYXRjaCh2ZXJzaW9uKQogICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBVbnN1cHBvcnRlZFZlcnNpb25FcnJvcjoKICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSBGYWxzZQoKICAgICAgICAgICAgICAgICAgICBpZiBtYXRjaDoKICAgICAgICAgICAgICAgICAgICAgICAgZ3JhcGguYWRkX2VkZ2UoZGlzdCwgcHJvdmlkZXIsIHJlcSkKICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZCA9IFRydWUKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgaWYgbm90IG1hdGNoZWQ6CiAgICAgICAgICAgICAgICBncmFwaC5hZGRfbWlzc2luZyhkaXN0LCByZXEpCiAgICByZXR1cm4gZ3JhcGgKCgpkZWYgZ2V0X2RlcGVuZGVudF9kaXN0cyhkaXN0cywgZGlzdCk6CiAgICAiIiJSZWN1cnNpdmVseSBnZW5lcmF0ZSBhIGxpc3Qgb2YgZGlzdHJpYnV0aW9ucyBmcm9tICpkaXN0cyogdGhhdCBhcmUKICAgIGRlcGVuZGVudCBvbiAqZGlzdCouCgogICAgOnBhcmFtIGRpc3RzOiBhIGxpc3Qgb2YgZGlzdHJpYnV0aW9ucwogICAgOnBhcmFtIGRpc3Q6IGEgZGlzdHJpYnV0aW9uLCBtZW1iZXIgb2YgKmRpc3RzKiBmb3Igd2hpY2ggd2UgYXJlIGludGVyZXN0ZWQKICAgICIiIgogICAgaWYgZGlzdCBub3QgaW4gZGlzdHM6CiAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbignZ2l2ZW4gZGlzdHJpYnV0aW9uICVyIGlzIG5vdCBhIG1lbWJlciAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb2YgdGhlIGxpc3QnICUgZGlzdC5uYW1lKQogICAgZ3JhcGggPSBtYWtlX2dyYXBoKGRpc3RzKQoKICAgIGRlcCA9IFtkaXN0XSAgIyBkZXBlbmRlbnQgZGlzdHJpYnV0aW9ucwogICAgdG9kbyA9IGdyYXBoLnJldmVyc2VfbGlzdFtkaXN0XSAgIyBsaXN0IG9mIG5vZGVzIHdlIHNob3VsZCBpbnNwZWN0CgogICAgd2hpbGUgdG9kbzoKICAgICAgICBkID0gdG9kby5wb3AoKQogICAgICAgIGRlcC5hcHBlbmQoZCkKICAgICAgICBmb3Igc3VjYyBpbiBncmFwaC5yZXZlcnNlX2xpc3RbZF06CiAgICAgICAgICAgIGlmIHN1Y2Mgbm90IGluIGRlcDoKICAgICAgICAgICAgICAgIHRvZG8uYXBwZW5kKHN1Y2MpCgogICAgZGVwLnBvcCgwKSAgIyByZW1vdmUgZGlzdCBmcm9tIGRlcCwgd2FzIHRoZXJlIHRvIHByZXZlbnQgaW5maW5pdGUgbG9vcHMKICAgIHJldHVybiBkZXAKCgpkZWYgZ2V0X3JlcXVpcmVkX2Rpc3RzKGRpc3RzLCBkaXN0KToKICAgICIiIlJlY3Vyc2l2ZWx5IGdlbmVyYXRlIGEgbGlzdCBvZiBkaXN0cmlidXRpb25zIGZyb20gKmRpc3RzKiB0aGF0IGFyZQogICAgcmVxdWlyZWQgYnkgKmRpc3QqLgoKICAgIDpwYXJhbSBkaXN0czogYSBsaXN0IG9mIGRpc3RyaWJ1dGlvbnMKICAgIDpwYXJhbSBkaXN0OiBhIGRpc3RyaWJ1dGlvbiwgbWVtYmVyIG9mICpkaXN0cyogZm9yIHdoaWNoIHdlIGFyZSBpbnRlcmVzdGVkCiAgICAiIiIKICAgIGlmIGRpc3Qgbm90IGluIGRpc3RzOgogICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oJ2dpdmVuIGRpc3RyaWJ1dGlvbiAlciBpcyBub3QgYSBtZW1iZXIgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29mIHRoZSBsaXN0JyAlIGRpc3QubmFtZSkKICAgIGdyYXBoID0gbWFrZV9ncmFwaChkaXN0cykKCiAgICByZXEgPSBbXSAgIyByZXF1aXJlZCBkaXN0cmlidXRpb25zCiAgICB0b2RvID0gZ3JhcGguYWRqYWNlbmN5X2xpc3RbZGlzdF0gICMgbGlzdCBvZiBub2RlcyB3ZSBzaG91bGQgaW5zcGVjdAoKICAgIHdoaWxlIHRvZG86CiAgICAgICAgZCA9IHRvZG8ucG9wKClbMF0KICAgICAgICByZXEuYXBwZW5kKGQpCiAgICAgICAgZm9yIHByZWQgaW4gZ3JhcGguYWRqYWNlbmN5X2xpc3RbZF06CiAgICAgICAgICAgIGlmIHByZWQgbm90IGluIHJlcToKICAgICAgICAgICAgICAgIHRvZG8uYXBwZW5kKHByZWQpCgogICAgcmV0dXJuIHJlcQoKCmRlZiBtYWtlX2Rpc3QobmFtZSwgdmVyc2lvbiwgKiprd2FyZ3MpOgogICAgIiIiCiAgICBBIGNvbnZlbmllbmNlIG1ldGhvZCBmb3IgbWFraW5nIGEgZGlzdCBnaXZlbiBqdXN0IGEgbmFtZSBhbmQgdmVyc2lvbi4KICAgICIiIgogICAgc3VtbWFyeSA9IGt3YXJncy5wb3AoJ3N1bW1hcnknLCAnUGxhY2Vob2xkZXIgZm9yIHN1bW1hcnknKQogICAgbWQgPSBNZXRhZGF0YSgqKmt3YXJncykKICAgIG1kLm5hbWUgPSBuYW1lCiAgICBtZC52ZXJzaW9uID0gdmVyc2lvbgogICAgbWQuc3VtbWFyeSA9IHN1bW1hcnkgb3IgJ1BsYWNlaG9sZGVyIGZvciBzdW1tYXJ5JwogICAgcmV0dXJuIERpc3RyaWJ1dGlvbihtZCkKUEsDBBQAAAAAAAAAIQCDOOItXVIAAF1SAAA5AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0bGliL2luZGV4LnB5IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KIwojIENvcHlyaWdodCAoQykgMjAxMyBWaW5heSBTYWppcC4KIyBMaWNlbnNlZCB0byB0aGUgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24gdW5kZXIgYSBjb250cmlidXRvciBhZ3JlZW1lbnQuCiMgU2VlIExJQ0VOU0UudHh0IGFuZCBDT05UUklCVVRPUlMudHh0LgojCmltcG9ydCBoYXNobGliCmltcG9ydCBsb2dnaW5nCmltcG9ydCBvcwppbXBvcnQgc2h1dGlsCmltcG9ydCBzdWJwcm9jZXNzCmltcG9ydCB0ZW1wZmlsZQp0cnk6CiAgICBmcm9tIHRocmVhZGluZyBpbXBvcnQgVGhyZWFkCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGZyb20gZHVtbXlfdGhyZWFkaW5nIGltcG9ydCBUaHJlYWQKCmZyb20gLiBpbXBvcnQgRGlzdGxpYkV4Y2VwdGlvbgpmcm9tIC5jb21wYXQgaW1wb3J0IChIVFRQQmFzaWNBdXRoSGFuZGxlciwgUmVxdWVzdCwgSFRUUFBhc3N3b3JkTWdyLAogICAgICAgICAgICAgICAgICAgICB1cmxwYXJzZSwgYnVpbGRfb3BlbmVyLCBzdHJpbmdfdHlwZXMpCmZyb20gLnV0aWwgaW1wb3J0IGNhY2hlZF9wcm9wZXJ0eSwgemlwX2RpciwgU2VydmVyUHJveHkKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKREVGQVVMVF9JTkRFWCA9ICdodHRwczovL3B5cGkucHl0aG9uLm9yZy9weXBpJwpERUZBVUxUX1JFQUxNID0gJ3B5cGknCgpjbGFzcyBQYWNrYWdlSW5kZXgob2JqZWN0KToKICAgICIiIgogICAgVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgcGFja2FnZSBpbmRleCBjb21wYXRpYmxlIHdpdGggUHlQSSwgdGhlIFB5dGhvbgogICAgUGFja2FnZSBJbmRleC4KICAgICIiIgoKICAgIGJvdW5kYXJ5ID0gYictLS0tLS0tLS0tVGhJc19Jc190SGVfZGlzdGxpYl9pbmRleF9ib3VOZGFSWV8kJwoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB1cmw9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgSW5pdGlhbGlzZSBhbiBpbnN0YW5jZS4KCiAgICAgICAgOnBhcmFtIHVybDogVGhlIFVSTCBvZiB0aGUgaW5kZXguIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBVUkwgZm9yIFB5UEkgaXMKICAgICAgICAgICAgICAgICAgICB1c2VkLgogICAgICAgICIiIgogICAgICAgIHNlbGYudXJsID0gdXJsIG9yIERFRkFVTFRfSU5ERVgKICAgICAgICBzZWxmLnJlYWRfY29uZmlndXJhdGlvbigpCiAgICAgICAgc2NoZW1lLCBuZXRsb2MsIHBhdGgsIHBhcmFtcywgcXVlcnksIGZyYWcgPSB1cmxwYXJzZShzZWxmLnVybCkKICAgICAgICBpZiBwYXJhbXMgb3IgcXVlcnkgb3IgZnJhZyBvciBzY2hlbWUgbm90IGluICgnaHR0cCcsICdodHRwcycpOgogICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKCdpbnZhbGlkIHJlcG9zaXRvcnk6ICVzJyAlIHNlbGYudXJsKQogICAgICAgIHNlbGYucGFzc3dvcmRfaGFuZGxlciA9IE5vbmUKICAgICAgICBzZWxmLnNzbF92ZXJpZmllciA9IE5vbmUKICAgICAgICBzZWxmLmdwZyA9IE5vbmUKICAgICAgICBzZWxmLmdwZ19ob21lID0gTm9uZQogICAgICAgIHNlbGYucnBjX3Byb3h5ID0gTm9uZQogICAgICAgIHdpdGggb3Blbihvcy5kZXZudWxsLCAndycpIGFzIHNpbms6CiAgICAgICAgICAgICMgVXNlIGdwZyBieSBkZWZhdWx0IHJhdGhlciB0aGFuIGdwZzIsIGFzIGdwZzIgaW5zaXN0cyBvbgogICAgICAgICAgICAjIHByb21wdGluZyBmb3IgcGFzc3dvcmRzCiAgICAgICAgICAgIGZvciBzIGluICgnZ3BnJywgJ2dwZzInKToKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICByYyA9IHN1YnByb2Nlc3MuY2hlY2tfY2FsbChbcywgJy0tdmVyc2lvbiddLCBzdGRvdXQ9c2luaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRlcnI9c2luaykKICAgICAgICAgICAgICAgICAgICBpZiByYyA9PSAwOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdwZyA9IHMKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgogICAgICAgICAgICAgICAgICAgIHBhc3MKCiAgICBkZWYgX2dldF9weXBpcmNfY29tbWFuZChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBHZXQgdGhlIGRpc3R1dGlscyBjb21tYW5kIGZvciBpbnRlcmFjdGluZyB3aXRoIFB5UEkgY29uZmlndXJhdGlvbnMuCiAgICAgICAgOnJldHVybjogdGhlIGNvbW1hbmQuCiAgICAgICAgIiIiCiAgICAgICAgZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgRGlzdHJpYnV0aW9uCiAgICAgICAgZnJvbSBkaXN0dXRpbHMuY29uZmlnIGltcG9ydCBQeVBJUkNDb21tYW5kCiAgICAgICAgZCA9IERpc3RyaWJ1dGlvbigpCiAgICAgICAgcmV0dXJuIFB5UElSQ0NvbW1hbmQoZCkKCiAgICBkZWYgcmVhZF9jb25maWd1cmF0aW9uKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJlYWQgdGhlIFB5UEkgYWNjZXNzIGNvbmZpZ3VyYXRpb24gYXMgc3VwcG9ydGVkIGJ5IGRpc3R1dGlscywgZ2V0dGluZwogICAgICAgIFB5UEkgdG8gZG8gdGhlIGFjdHVhbCB3b3JrLiBUaGlzIHBvcHVsYXRlcyBgYHVzZXJuYW1lYGAsIGBgcGFzc3dvcmRgYCwKICAgICAgICBgYHJlYWxtYGAgYW5kIGBgdXJsYGAgYXR0cmlidXRlcyBmcm9tIHRoZSBjb25maWd1cmF0aW9uLgogICAgICAgICIiIgogICAgICAgICMgZ2V0IGRpc3R1dGlscyB0byBkbyB0aGUgd29yawogICAgICAgIGMgPSBzZWxmLl9nZXRfcHlwaXJjX2NvbW1hbmQoKQogICAgICAgIGMucmVwb3NpdG9yeSA9IHNlbGYudXJsCiAgICAgICAgY2ZnID0gYy5fcmVhZF9weXBpcmMoKQogICAgICAgIHNlbGYudXNlcm5hbWUgPSBjZmcuZ2V0KCd1c2VybmFtZScpCiAgICAgICAgc2VsZi5wYXNzd29yZCA9IGNmZy5nZXQoJ3Bhc3N3b3JkJykKICAgICAgICBzZWxmLnJlYWxtID0gY2ZnLmdldCgncmVhbG0nLCAncHlwaScpCiAgICAgICAgc2VsZi51cmwgPSBjZmcuZ2V0KCdyZXBvc2l0b3J5Jywgc2VsZi51cmwpCgogICAgZGVmIHNhdmVfY29uZmlndXJhdGlvbihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBTYXZlIHRoZSBQeVBJIGFjY2VzcyBjb25maWd1cmF0aW9uLiBZb3UgbXVzdCBoYXZlIHNldCBgYHVzZXJuYW1lYGAgYW5kCiAgICAgICAgYGBwYXNzd29yZGBgIGF0dHJpYnV0ZXMgYmVmb3JlIGNhbGxpbmcgdGhpcyBtZXRob2QuCgogICAgICAgIEFnYWluLCBkaXN0dXRpbHMgaXMgdXNlZCB0byBkbyB0aGUgYWN0dWFsIHdvcmsuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5jaGVja19jcmVkZW50aWFscygpCiAgICAgICAgIyBnZXQgZGlzdHV0aWxzIHRvIGRvIHRoZSB3b3JrCiAgICAgICAgYyA9IHNlbGYuX2dldF9weXBpcmNfY29tbWFuZCgpCiAgICAgICAgYy5fc3RvcmVfcHlwaXJjKHNlbGYudXNlcm5hbWUsIHNlbGYucGFzc3dvcmQpCgogICAgZGVmIGNoZWNrX2NyZWRlbnRpYWxzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIENoZWNrIHRoYXQgYGB1c2VybmFtZWBgIGFuZCBgYHBhc3N3b3JkYGAgaGF2ZSBiZWVuIHNldCwgYW5kIHJhaXNlIGFuCiAgICAgICAgZXhjZXB0aW9uIGlmIG5vdC4KICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLnVzZXJuYW1lIGlzIE5vbmUgb3Igc2VsZi5wYXNzd29yZCBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKCd1c2VybmFtZSBhbmQgcGFzc3dvcmQgbXVzdCBiZSBzZXQnKQogICAgICAgIHBtID0gSFRUUFBhc3N3b3JkTWdyKCkKICAgICAgICBfLCBuZXRsb2MsIF8sIF8sIF8sIF8gPSB1cmxwYXJzZShzZWxmLnVybCkKICAgICAgICBwbS5hZGRfcGFzc3dvcmQoc2VsZi5yZWFsbSwgbmV0bG9jLCBzZWxmLnVzZXJuYW1lLCBzZWxmLnBhc3N3b3JkKQogICAgICAgIHNlbGYucGFzc3dvcmRfaGFuZGxlciA9IEhUVFBCYXNpY0F1dGhIYW5kbGVyKHBtKQoKICAgIGRlZiByZWdpc3RlcihzZWxmLCBtZXRhZGF0YSk6CiAgICAgICAgIiIiCiAgICAgICAgUmVnaXN0ZXIgYSBkaXN0cmlidXRpb24gb24gUHlQSSwgdXNpbmcgdGhlIHByb3ZpZGVkIG1ldGFkYXRhLgoKICAgICAgICA6cGFyYW0gbWV0YWRhdGE6IEEgOmNsYXNzOmBNZXRhZGF0YWAgaW5zdGFuY2UgZGVmaW5pbmcgYXQgbGVhc3QgYSBuYW1lCiAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdmVyc2lvbiBudW1iZXIgZm9yIHRoZSBkaXN0cmlidXRpb24gdG8gYmUKICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyZWQuCiAgICAgICAgOnJldHVybjogVGhlIEhUVFAgcmVzcG9uc2UgcmVjZWl2ZWQgZnJvbSBQeVBJIHVwb24gc3VibWlzc2lvbiBvZiB0aGUKICAgICAgICAgICAgICAgIHJlcXVlc3QuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5jaGVja19jcmVkZW50aWFscygpCiAgICAgICAgbWV0YWRhdGEudmFsaWRhdGUoKQogICAgICAgIGQgPSBtZXRhZGF0YS50b2RpY3QoKQogICAgICAgIGRbJzphY3Rpb24nXSA9ICd2ZXJpZnknCiAgICAgICAgcmVxdWVzdCA9IHNlbGYuZW5jb2RlX3JlcXVlc3QoZC5pdGVtcygpLCBbXSkKICAgICAgICByZXNwb25zZSA9IHNlbGYuc2VuZF9yZXF1ZXN0KHJlcXVlc3QpCiAgICAgICAgZFsnOmFjdGlvbiddID0gJ3N1Ym1pdCcKICAgICAgICByZXF1ZXN0ID0gc2VsZi5lbmNvZGVfcmVxdWVzdChkLml0ZW1zKCksIFtdKQogICAgICAgIHJldHVybiBzZWxmLnNlbmRfcmVxdWVzdChyZXF1ZXN0KQoKICAgIGRlZiBfcmVhZGVyKHNlbGYsIG5hbWUsIHN0cmVhbSwgb3V0YnVmKToKICAgICAgICAiIiIKICAgICAgICBUaHJlYWQgcnVubmVyIGZvciByZWFkaW5nIGxpbmVzIG9mIGZyb20gYSBzdWJwcm9jZXNzIGludG8gYSBidWZmZXIuCgogICAgICAgIDpwYXJhbSBuYW1lOiBUaGUgbG9naWNhbCBuYW1lIG9mIHRoZSBzdHJlYW0gKHVzZWQgZm9yIGxvZ2dpbmcgb25seSkuCiAgICAgICAgOnBhcmFtIHN0cmVhbTogVGhlIHN0cmVhbSB0byByZWFkIGZyb20uIFRoaXMgd2lsbCB0eXBpY2FsbHkgYSBwaXBlCiAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGVkIHRvIHRoZSBvdXRwdXQgc3RyZWFtIG9mIGEgc3VicHJvY2Vzcy4KICAgICAgICA6cGFyYW0gb3V0YnVmOiBUaGUgbGlzdCB0byBhcHBlbmQgdGhlIHJlYWQgbGluZXMgdG8uCiAgICAgICAgIiIiCiAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgcyA9IHN0cmVhbS5yZWFkbGluZSgpCiAgICAgICAgICAgIGlmIG5vdCBzOgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgcyA9IHMuZGVjb2RlKCd1dGYtOCcpLnJzdHJpcCgpCiAgICAgICAgICAgIG91dGJ1Zi5hcHBlbmQocykKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCclczogJXMnICUgKG5hbWUsIHMpKQogICAgICAgIHN0cmVhbS5jbG9zZSgpCgogICAgZGVmIGdldF9zaWduX2NvbW1hbmQoc2VsZiwgZmlsZW5hbWUsIHNpZ25lciwgc2lnbl9wYXNzd29yZCwKICAgICAgICAgICAgICAgICAgICAgICAgIGtleXN0b3JlPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBhIHN1aXRhYmxlIGNvbW1hbmQgZm9yIHNpZ25pbmcgYSBmaWxlLgoKICAgICAgICA6cGFyYW0gZmlsZW5hbWU6IFRoZSBwYXRobmFtZSB0byB0aGUgZmlsZSB0byBiZSBzaWduZWQuCiAgICAgICAgOnBhcmFtIHNpZ25lcjogVGhlIGlkZW50aWZpZXIgb2YgdGhlIHNpZ25lciBvZiB0aGUgZmlsZS4KICAgICAgICA6cGFyYW0gc2lnbl9wYXNzd29yZDogVGhlIHBhc3NwaHJhc2UgZm9yIHRoZSBzaWduZXIncwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcml2YXRlIGtleSB1c2VkIGZvciBzaWduaW5nLgogICAgICAgIDpwYXJhbSBrZXlzdG9yZTogVGhlIHBhdGggdG8gYSBkaXJlY3Rvcnkgd2hpY2ggY29udGFpbnMgdGhlIGtleXMKICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgaW4gdmVyaWZpY2F0aW9uLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlJ3MgYGBncGdfaG9tZWBgIGF0dHJpYnV0ZSBpcyB1c2VkIGluc3RlYWQuCiAgICAgICAgOnJldHVybjogVGhlIHNpZ25pbmcgY29tbWFuZCBhcyBhIGxpc3Qgc3VpdGFibGUgdG8gYmUKICAgICAgICAgICAgICAgICBwYXNzZWQgdG8gOmNsYXNzOmBzdWJwcm9jZXNzLlBvcGVuYC4KICAgICAgICAiIiIKICAgICAgICBjbWQgPSBbc2VsZi5ncGcsICctLXN0YXR1cy1mZCcsICcyJywgJy0tbm8tdHR5J10KICAgICAgICBpZiBrZXlzdG9yZSBpcyBOb25lOgogICAgICAgICAgICBrZXlzdG9yZSA9IHNlbGYuZ3BnX2hvbWUKICAgICAgICBpZiBrZXlzdG9yZToKICAgICAgICAgICAgY21kLmV4dGVuZChbJy0taG9tZWRpcicsIGtleXN0b3JlXSkKICAgICAgICBpZiBzaWduX3Bhc3N3b3JkIGlzIG5vdCBOb25lOgogICAgICAgICAgICBjbWQuZXh0ZW5kKFsnLS1iYXRjaCcsICctLXBhc3NwaHJhc2UtZmQnLCAnMCddKQogICAgICAgIHRkID0gdGVtcGZpbGUubWtkdGVtcCgpCiAgICAgICAgc2YgPSBvcy5wYXRoLmpvaW4odGQsIG9zLnBhdGguYmFzZW5hbWUoZmlsZW5hbWUpICsgJy5hc2MnKQogICAgICAgIGNtZC5leHRlbmQoWyctLWRldGFjaC1zaWduJywgJy0tYXJtb3InLCAnLS1sb2NhbC11c2VyJywKICAgICAgICAgICAgICAgICAgICBzaWduZXIsICctLW91dHB1dCcsIHNmLCBmaWxlbmFtZV0pCiAgICAgICAgbG9nZ2VyLmRlYnVnKCdpbnZva2luZzogJXMnLCAnICcuam9pbihjbWQpKQogICAgICAgIHJldHVybiBjbWQsIHNmCgogICAgZGVmIHJ1bl9jb21tYW5kKHNlbGYsIGNtZCwgaW5wdXRfZGF0YT1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBSdW4gYSBjb21tYW5kIGluIGEgY2hpbGQgcHJvY2VzcyAsIHBhc3NpbmcgaXQgYW55IGlucHV0IGRhdGEgc3BlY2lmaWVkLgoKICAgICAgICA6cGFyYW0gY21kOiBUaGUgY29tbWFuZCB0byBydW4uCiAgICAgICAgOnBhcmFtIGlucHV0X2RhdGE6IElmIHNwZWNpZmllZCwgdGhpcyBtdXN0IGJlIGEgYnl0ZSBzdHJpbmcgY29udGFpbmluZwogICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhIHRvIGJlIHNlbnQgdG8gdGhlIGNoaWxkIHByb2Nlc3MuCiAgICAgICAgOnJldHVybjogQSB0dXBsZSBjb25zaXN0aW5nIG9mIHRoZSBzdWJwcm9jZXNzJyBleGl0IGNvZGUsIGEgbGlzdCBvZgogICAgICAgICAgICAgICAgIGxpbmVzIHJlYWQgZnJvbSB0aGUgc3VicHJvY2VzcycgYGBzdGRvdXRgYCwgYW5kIGEgbGlzdCBvZgogICAgICAgICAgICAgICAgIGxpbmVzIHJlYWQgZnJvbSB0aGUgc3VicHJvY2VzcycgYGBzdGRlcnJgYC4KICAgICAgICAiIiIKICAgICAgICBrd2FyZ3MgPSB7CiAgICAgICAgICAgICdzdGRvdXQnOiBzdWJwcm9jZXNzLlBJUEUsCiAgICAgICAgICAgICdzdGRlcnInOiBzdWJwcm9jZXNzLlBJUEUsCiAgICAgICAgfQogICAgICAgIGlmIGlucHV0X2RhdGEgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGt3YXJnc1snc3RkaW4nXSA9IHN1YnByb2Nlc3MuUElQRQogICAgICAgIHN0ZG91dCA9IFtdCiAgICAgICAgc3RkZXJyID0gW10KICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3BlbihjbWQsICoqa3dhcmdzKQogICAgICAgICMgV2UgZG9uJ3QgdXNlIGNvbW11bmljYXRlKCkgaGVyZSBiZWNhdXNlIHdlIG1heSBuZWVkIHRvCiAgICAgICAgIyBnZXQgY2xldmVyIHdpdGggaW50ZXJhY3Rpbmcgd2l0aCB0aGUgY29tbWFuZAogICAgICAgIHQxID0gVGhyZWFkKHRhcmdldD1zZWxmLl9yZWFkZXIsIGFyZ3M9KCdzdGRvdXQnLCBwLnN0ZG91dCwgc3Rkb3V0KSkKICAgICAgICB0MS5zdGFydCgpCiAgICAgICAgdDIgPSBUaHJlYWQodGFyZ2V0PXNlbGYuX3JlYWRlciwgYXJncz0oJ3N0ZGVycicsIHAuc3RkZXJyLCBzdGRlcnIpKQogICAgICAgIHQyLnN0YXJ0KCkKICAgICAgICBpZiBpbnB1dF9kYXRhIGlzIG5vdCBOb25lOgogICAgICAgICAgICBwLnN0ZGluLndyaXRlKGlucHV0X2RhdGEpCiAgICAgICAgICAgIHAuc3RkaW4uY2xvc2UoKQoKICAgICAgICBwLndhaXQoKQogICAgICAgIHQxLmpvaW4oKQogICAgICAgIHQyLmpvaW4oKQogICAgICAgIHJldHVybiBwLnJldHVybmNvZGUsIHN0ZG91dCwgc3RkZXJyCgogICAgZGVmIHNpZ25fZmlsZShzZWxmLCBmaWxlbmFtZSwgc2lnbmVyLCBzaWduX3Bhc3N3b3JkLCBrZXlzdG9yZT1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBTaWduIGEgZmlsZS4KCiAgICAgICAgOnBhcmFtIGZpbGVuYW1lOiBUaGUgcGF0aG5hbWUgdG8gdGhlIGZpbGUgdG8gYmUgc2lnbmVkLgogICAgICAgIDpwYXJhbSBzaWduZXI6IFRoZSBpZGVudGlmaWVyIG9mIHRoZSBzaWduZXIgb2YgdGhlIGZpbGUuCiAgICAgICAgOnBhcmFtIHNpZ25fcGFzc3dvcmQ6IFRoZSBwYXNzcGhyYXNlIGZvciB0aGUgc2lnbmVyJ3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBrZXkgdXNlZCBmb3Igc2lnbmluZy4KICAgICAgICA6cGFyYW0ga2V5c3RvcmU6IFRoZSBwYXRoIHRvIGEgZGlyZWN0b3J5IHdoaWNoIGNvbnRhaW5zIHRoZSBrZXlzCiAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIGluIHNpZ25pbmcuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBpbnN0YW5jZSdzCiAgICAgICAgICAgICAgICAgICAgICAgICBgYGdwZ19ob21lYGAgYXR0cmlidXRlIGlzIHVzZWQgaW5zdGVhZC4KICAgICAgICA6cmV0dXJuOiBUaGUgYWJzb2x1dGUgcGF0aG5hbWUgb2YgdGhlIGZpbGUgd2hlcmUgdGhlIHNpZ25hdHVyZSBpcwogICAgICAgICAgICAgICAgIHN0b3JlZC4KICAgICAgICAiIiIKICAgICAgICBjbWQsIHNpZ19maWxlID0gc2VsZi5nZXRfc2lnbl9jb21tYW5kKGZpbGVuYW1lLCBzaWduZXIsIHNpZ25fcGFzc3dvcmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzdG9yZSkKICAgICAgICByYywgc3Rkb3V0LCBzdGRlcnIgPSBzZWxmLnJ1bl9jb21tYW5kKGNtZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25fcGFzc3dvcmQuZW5jb2RlKCd1dGYtOCcpKQogICAgICAgIGlmIHJjICE9IDA6CiAgICAgICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oJ3NpZ24gY29tbWFuZCBmYWlsZWQgd2l0aCBlcnJvciAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvZGUgJXMnICUgcmMpCiAgICAgICAgcmV0dXJuIHNpZ19maWxlCgogICAgZGVmIHVwbG9hZF9maWxlKHNlbGYsIG1ldGFkYXRhLCBmaWxlbmFtZSwgc2lnbmVyPU5vbmUsIHNpZ25fcGFzc3dvcmQ9Tm9uZSwKICAgICAgICAgICAgICAgICAgICBmaWxldHlwZT0nc2Rpc3QnLCBweXZlcnNpb249J3NvdXJjZScsIGtleXN0b3JlPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIFVwbG9hZCBhIHJlbGVhc2UgZmlsZSB0byB0aGUgaW5kZXguCgogICAgICAgIDpwYXJhbSBtZXRhZGF0YTogQSA6Y2xhc3M6YE1ldGFkYXRhYCBpbnN0YW5jZSBkZWZpbmluZyBhdCBsZWFzdCBhIG5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB2ZXJzaW9uIG51bWJlciBmb3IgdGhlIGZpbGUgdG8gYmUgdXBsb2FkZWQuCiAgICAgICAgOnBhcmFtIGZpbGVuYW1lOiBUaGUgcGF0aG5hbWUgb2YgdGhlIGZpbGUgdG8gYmUgdXBsb2FkZWQuCiAgICAgICAgOnBhcmFtIHNpZ25lcjogVGhlIGlkZW50aWZpZXIgb2YgdGhlIHNpZ25lciBvZiB0aGUgZmlsZS4KICAgICAgICA6cGFyYW0gc2lnbl9wYXNzd29yZDogVGhlIHBhc3NwaHJhc2UgZm9yIHRoZSBzaWduZXIncwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcml2YXRlIGtleSB1c2VkIGZvciBzaWduaW5nLgogICAgICAgIDpwYXJhbSBmaWxldHlwZTogVGhlIHR5cGUgb2YgdGhlIGZpbGUgYmVpbmcgdXBsb2FkZWQuIFRoaXMgaXMgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3R1dGlscyBjb21tYW5kIHdoaWNoIHByb2R1Y2VkIHRoYXQgZmlsZSwgZS5nLgogICAgICAgICAgICAgICAgICAgICAgICBgYHNkaXN0YGAgb3IgYGBiZGlzdF93aGVlbGBgLgogICAgICAgIDpwYXJhbSBweXZlcnNpb246IFRoZSB2ZXJzaW9uIG9mIFB5dGhvbiB3aGljaCB0aGUgcmVsZWFzZSByZWxhdGVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgdG8uIEZvciBjb2RlIGNvbXBhdGlibGUgd2l0aCBhbnkgUHl0aG9uLCB0aGlzIHdvdWxkCiAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgYGBzb3VyY2VgYCwgb3RoZXJ3aXNlIGl0IHdvdWxkIGJlIGUuZy4gYGAzLjJgYC4KICAgICAgICA6cGFyYW0ga2V5c3RvcmU6IFRoZSBwYXRoIHRvIGEgZGlyZWN0b3J5IHdoaWNoIGNvbnRhaW5zIHRoZSBrZXlzCiAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIGluIHNpZ25pbmcuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBpbnN0YW5jZSdzCiAgICAgICAgICAgICAgICAgICAgICAgICBgYGdwZ19ob21lYGAgYXR0cmlidXRlIGlzIHVzZWQgaW5zdGVhZC4KICAgICAgICA6cmV0dXJuOiBUaGUgSFRUUCByZXNwb25zZSByZWNlaXZlZCBmcm9tIFB5UEkgdXBvbiBzdWJtaXNzaW9uIG9mIHRoZQogICAgICAgICAgICAgICAgcmVxdWVzdC4KICAgICAgICAiIiIKICAgICAgICBzZWxmLmNoZWNrX2NyZWRlbnRpYWxzKCkKICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoZmlsZW5hbWUpOgogICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKCdub3QgZm91bmQ6ICVzJyAlIGZpbGVuYW1lKQogICAgICAgIG1ldGFkYXRhLnZhbGlkYXRlKCkKICAgICAgICBkID0gbWV0YWRhdGEudG9kaWN0KCkKICAgICAgICBzaWdfZmlsZSA9IE5vbmUKICAgICAgICBpZiBzaWduZXI6CiAgICAgICAgICAgIGlmIG5vdCBzZWxmLmdwZzoKICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdubyBzaWduaW5nIHByb2dyYW0gYXZhaWxhYmxlIC0gbm90IHNpZ25lZCcpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzaWdfZmlsZSA9IHNlbGYuc2lnbl9maWxlKGZpbGVuYW1lLCBzaWduZXIsIHNpZ25fcGFzc3dvcmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXN0b3JlKQogICAgICAgIHdpdGggb3BlbihmaWxlbmFtZSwgJ3JiJykgYXMgZjoKICAgICAgICAgICAgZmlsZV9kYXRhID0gZi5yZWFkKCkKICAgICAgICBtZDVfZGlnZXN0ID0gaGFzaGxpYi5tZDUoZmlsZV9kYXRhKS5oZXhkaWdlc3QoKQogICAgICAgIHNoYTI1Nl9kaWdlc3QgPSBoYXNobGliLnNoYTI1NihmaWxlX2RhdGEpLmhleGRpZ2VzdCgpCiAgICAgICAgZC51cGRhdGUoewogICAgICAgICAgICAnOmFjdGlvbic6ICdmaWxlX3VwbG9hZCcsCiAgICAgICAgICAgICdwcm90b2NvbF92ZXJzaW9uJzogJzEnLAogICAgICAgICAgICAnZmlsZXR5cGUnOiBmaWxldHlwZSwKICAgICAgICAgICAgJ3B5dmVyc2lvbic6IHB5dmVyc2lvbiwKICAgICAgICAgICAgJ21kNV9kaWdlc3QnOiBtZDVfZGlnZXN0LAogICAgICAgICAgICAnc2hhMjU2X2RpZ2VzdCc6IHNoYTI1Nl9kaWdlc3QsCiAgICAgICAgfSkKICAgICAgICBmaWxlcyA9IFsoJ2NvbnRlbnQnLCBvcy5wYXRoLmJhc2VuYW1lKGZpbGVuYW1lKSwgZmlsZV9kYXRhKV0KICAgICAgICBpZiBzaWdfZmlsZToKICAgICAgICAgICAgd2l0aCBvcGVuKHNpZ19maWxlLCAncmInKSBhcyBmOgogICAgICAgICAgICAgICAgc2lnX2RhdGEgPSBmLnJlYWQoKQogICAgICAgICAgICBmaWxlcy5hcHBlbmQoKCdncGdfc2lnbmF0dXJlJywgb3MucGF0aC5iYXNlbmFtZShzaWdfZmlsZSksCiAgICAgICAgICAgICAgICAgICAgICAgICBzaWdfZGF0YSkpCiAgICAgICAgICAgIHNodXRpbC5ybXRyZWUob3MucGF0aC5kaXJuYW1lKHNpZ19maWxlKSkKICAgICAgICByZXF1ZXN0ID0gc2VsZi5lbmNvZGVfcmVxdWVzdChkLml0ZW1zKCksIGZpbGVzKQogICAgICAgIHJldHVybiBzZWxmLnNlbmRfcmVxdWVzdChyZXF1ZXN0KQoKICAgIGRlZiB1cGxvYWRfZG9jdW1lbnRhdGlvbihzZWxmLCBtZXRhZGF0YSwgZG9jX2Rpcik6CiAgICAgICAgIiIiCiAgICAgICAgVXBsb2FkIGRvY3VtZW50YXRpb24gdG8gdGhlIGluZGV4LgoKICAgICAgICA6cGFyYW0gbWV0YWRhdGE6IEEgOmNsYXNzOmBNZXRhZGF0YWAgaW5zdGFuY2UgZGVmaW5pbmcgYXQgbGVhc3QgYSBuYW1lCiAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdmVyc2lvbiBudW1iZXIgZm9yIHRoZSBkb2N1bWVudGF0aW9uIHRvIGJlCiAgICAgICAgICAgICAgICAgICAgICAgICB1cGxvYWRlZC4KICAgICAgICA6cGFyYW0gZG9jX2RpcjogVGhlIHBhdGhuYW1lIG9mIHRoZSBkaXJlY3Rvcnkgd2hpY2ggY29udGFpbnMgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50YXRpb24uIFRoaXMgc2hvdWxkIGJlIHRoZSBkaXJlY3RvcnkgdGhhdAogICAgICAgICAgICAgICAgICAgICAgICBjb250YWlucyB0aGUgYGBpbmRleC5odG1sYGAgZm9yIHRoZSBkb2N1bWVudGF0aW9uLgogICAgICAgIDpyZXR1cm46IFRoZSBIVFRQIHJlc3BvbnNlIHJlY2VpdmVkIGZyb20gUHlQSSB1cG9uIHN1Ym1pc3Npb24gb2YgdGhlCiAgICAgICAgICAgICAgICByZXF1ZXN0LgogICAgICAgICIiIgogICAgICAgIHNlbGYuY2hlY2tfY3JlZGVudGlhbHMoKQogICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKGRvY19kaXIpOgogICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKCdub3QgYSBkaXJlY3Rvcnk6ICVyJyAlIGRvY19kaXIpCiAgICAgICAgZm4gPSBvcy5wYXRoLmpvaW4oZG9jX2RpciwgJ2luZGV4Lmh0bWwnKQogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhmbik6CiAgICAgICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oJ25vdCBmb3VuZDogJXInICUgZm4pCiAgICAgICAgbWV0YWRhdGEudmFsaWRhdGUoKQogICAgICAgIG5hbWUsIHZlcnNpb24gPSBtZXRhZGF0YS5uYW1lLCBtZXRhZGF0YS52ZXJzaW9uCiAgICAgICAgemlwX2RhdGEgPSB6aXBfZGlyKGRvY19kaXIpLmdldHZhbHVlKCkKICAgICAgICBmaWVsZHMgPSBbKCc6YWN0aW9uJywgJ2RvY191cGxvYWQnKSwKICAgICAgICAgICAgICAgICAgKCduYW1lJywgbmFtZSksICgndmVyc2lvbicsIHZlcnNpb24pXQogICAgICAgIGZpbGVzID0gWygnY29udGVudCcsIG5hbWUsIHppcF9kYXRhKV0KICAgICAgICByZXF1ZXN0ID0gc2VsZi5lbmNvZGVfcmVxdWVzdChmaWVsZHMsIGZpbGVzKQogICAgICAgIHJldHVybiBzZWxmLnNlbmRfcmVxdWVzdChyZXF1ZXN0KQoKICAgIGRlZiBnZXRfdmVyaWZ5X2NvbW1hbmQoc2VsZiwgc2lnbmF0dXJlX2ZpbGVuYW1lLCBkYXRhX2ZpbGVuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzdG9yZT1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gYSBzdWl0YWJsZSBjb21tYW5kIGZvciB2ZXJpZnlpbmcgYSBmaWxlLgoKICAgICAgICA6cGFyYW0gc2lnbmF0dXJlX2ZpbGVuYW1lOiBUaGUgcGF0aG5hbWUgdG8gdGhlIGZpbGUgY29udGFpbmluZyB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmUuCiAgICAgICAgOnBhcmFtIGRhdGFfZmlsZW5hbWU6IFRoZSBwYXRobmFtZSB0byB0aGUgZmlsZSBjb250YWluaW5nIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduZWQgZGF0YS4KICAgICAgICA6cGFyYW0ga2V5c3RvcmU6IFRoZSBwYXRoIHRvIGEgZGlyZWN0b3J5IHdoaWNoIGNvbnRhaW5zIHRoZSBrZXlzCiAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIGluIHZlcmlmaWNhdGlvbi4gSWYgbm90IHNwZWNpZmllZCwgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSdzIGBgZ3BnX2hvbWVgYCBhdHRyaWJ1dGUgaXMgdXNlZCBpbnN0ZWFkLgogICAgICAgIDpyZXR1cm46IFRoZSB2ZXJpZnlpbmcgY29tbWFuZCBhcyBhIGxpc3Qgc3VpdGFibGUgdG8gYmUKICAgICAgICAgICAgICAgICBwYXNzZWQgdG8gOmNsYXNzOmBzdWJwcm9jZXNzLlBvcGVuYC4KICAgICAgICAiIiIKICAgICAgICBjbWQgPSBbc2VsZi5ncGcsICctLXN0YXR1cy1mZCcsICcyJywgJy0tbm8tdHR5J10KICAgICAgICBpZiBrZXlzdG9yZSBpcyBOb25lOgogICAgICAgICAgICBrZXlzdG9yZSA9IHNlbGYuZ3BnX2hvbWUKICAgICAgICBpZiBrZXlzdG9yZToKICAgICAgICAgICAgY21kLmV4dGVuZChbJy0taG9tZWRpcicsIGtleXN0b3JlXSkKICAgICAgICBjbWQuZXh0ZW5kKFsnLS12ZXJpZnknLCBzaWduYXR1cmVfZmlsZW5hbWUsIGRhdGFfZmlsZW5hbWVdKQogICAgICAgIGxvZ2dlci5kZWJ1ZygnaW52b2tpbmc6ICVzJywgJyAnLmpvaW4oY21kKSkKICAgICAgICByZXR1cm4gY21kCgogICAgZGVmIHZlcmlmeV9zaWduYXR1cmUoc2VsZiwgc2lnbmF0dXJlX2ZpbGVuYW1lLCBkYXRhX2ZpbGVuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAga2V5c3RvcmU9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgVmVyaWZ5IGEgc2lnbmF0dXJlIGZvciBhIGZpbGUuCgogICAgICAgIDpwYXJhbSBzaWduYXR1cmVfZmlsZW5hbWU6IFRoZSBwYXRobmFtZSB0byB0aGUgZmlsZSBjb250YWluaW5nIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZS4KICAgICAgICA6cGFyYW0gZGF0YV9maWxlbmFtZTogVGhlIHBhdGhuYW1lIHRvIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25lZCBkYXRhLgogICAgICAgIDpwYXJhbSBrZXlzdG9yZTogVGhlIHBhdGggdG8gYSBkaXJlY3Rvcnkgd2hpY2ggY29udGFpbnMgdGhlIGtleXMKICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgaW4gdmVyaWZpY2F0aW9uLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlJ3MgYGBncGdfaG9tZWBgIGF0dHJpYnV0ZSBpcyB1c2VkIGluc3RlYWQuCiAgICAgICAgOnJldHVybjogVHJ1ZSBpZiB0aGUgc2lnbmF0dXJlIHdhcyB2ZXJpZmllZCwgZWxzZSBGYWxzZS4KICAgICAgICAiIiIKICAgICAgICBpZiBub3Qgc2VsZi5ncGc6CiAgICAgICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oJ3ZlcmlmaWNhdGlvbiB1bmF2YWlsYWJsZSBiZWNhdXNlIGdwZyAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VuYXZhaWxhYmxlJykKICAgICAgICBjbWQgPSBzZWxmLmdldF92ZXJpZnlfY29tbWFuZChzaWduYXR1cmVfZmlsZW5hbWUsIGRhdGFfZmlsZW5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5c3RvcmUpCiAgICAgICAgcmMsIHN0ZG91dCwgc3RkZXJyID0gc2VsZi5ydW5fY29tbWFuZChjbWQpCiAgICAgICAgaWYgcmMgbm90IGluICgwLCAxKToKICAgICAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbigndmVyaWZ5IGNvbW1hbmQgZmFpbGVkIHdpdGggZXJyb3IgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb2RlICVzJyAlIHJjKQogICAgICAgIHJldHVybiByYyA9PSAwCgogICAgZGVmIGRvd25sb2FkX2ZpbGUoc2VsZiwgdXJsLCBkZXN0ZmlsZSwgZGlnZXN0PU5vbmUsIHJlcG9ydGhvb2s9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCBmb3IgZG93bmxvYWRpbmcgYSBmaWxlIGZyb20gYW4gVVJMLgogICAgICAgIE5vcm1hbGx5LCB0aGlzIHdpbGwgYmUgYSBmaWxlIGZyb20gdGhlIGluZGV4LCB0aG91Z2ggY3VycmVudGx5CiAgICAgICAgbm8gY2hlY2sgaXMgbWFkZSBmb3IgdGhpcyAoaS5lLiBhIGZpbGUgY2FuIGJlIGRvd25sb2FkZWQgZnJvbQogICAgICAgIGFueXdoZXJlKS4KCiAgICAgICAgVGhlIG1ldGhvZCBpcyBqdXN0IGxpa2UgdGhlIDpmdW5jOmB1cmxyZXRyaWV2ZWAgZnVuY3Rpb24gaW4gdGhlCiAgICAgICAgc3RhbmRhcmQgbGlicmFyeSwgZXhjZXB0IHRoYXQgaXQgYWxsb3dzIGRpZ2VzdCBjb21wdXRhdGlvbiB0byBiZQogICAgICAgIGRvbmUgZHVyaW5nIGRvd25sb2FkIGFuZCBjaGVja2luZyB0aGF0IHRoZSBkb3dubG9hZGVkIGRhdGEKICAgICAgICBtYXRjaGVkIGFueSBleHBlY3RlZCB2YWx1ZS4KCiAgICAgICAgOnBhcmFtIHVybDogVGhlIFVSTCBvZiB0aGUgZmlsZSB0byBiZSBkb3dubG9hZGVkIChhc3N1bWVkIHRvIGJlCiAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlIHZpYSBhbiBIVFRQIEdFVCByZXF1ZXN0KS4KICAgICAgICA6cGFyYW0gZGVzdGZpbGU6IFRoZSBwYXRobmFtZSB3aGVyZSB0aGUgZG93bmxvYWRlZCBmaWxlIGlzIHRvIGJlCiAgICAgICAgICAgICAgICAgICAgICAgICBzYXZlZC4KICAgICAgICA6cGFyYW0gZGlnZXN0OiBJZiBzcGVjaWZpZWQsIHRoaXMgbXVzdCBiZSBhIChoYXNoZXIsIHZhbHVlKQogICAgICAgICAgICAgICAgICAgICAgIHR1cGxlLCB3aGVyZSBoYXNoZXIgaXMgdGhlIGFsZ29yaXRobSB1c2VkIChlLmcuCiAgICAgICAgICAgICAgICAgICAgICAgYGAnbWQ1J2BgKSBhbmQgYGB2YWx1ZWBgIGlzIHRoZSBleHBlY3RlZCB2YWx1ZS4KICAgICAgICA6cGFyYW0gcmVwb3J0aG9vazogVGhlIHNhbWUgYXMgZm9yIDpmdW5jOmB1cmxyZXRyaWV2ZWAgaW4gdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YW5kYXJkIGxpYnJhcnkuCiAgICAgICAgIiIiCiAgICAgICAgaWYgZGlnZXN0IGlzIE5vbmU6CiAgICAgICAgICAgIGRpZ2VzdGVyID0gTm9uZQogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ05vIGRpZ2VzdCBzcGVjaWZpZWQnKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZGlnZXN0LCAobGlzdCwgdHVwbGUpKToKICAgICAgICAgICAgICAgIGhhc2hlciwgZGlnZXN0ID0gZGlnZXN0CiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBoYXNoZXIgPSAnbWQ1JwogICAgICAgICAgICBkaWdlc3RlciA9IGdldGF0dHIoaGFzaGxpYiwgaGFzaGVyKSgpCiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnRGlnZXN0IHNwZWNpZmllZDogJXMnICUgZGlnZXN0KQogICAgICAgICMgVGhlIGZvbGxvd2luZyBjb2RlIGlzIGVxdWl2YWxlbnQgdG8gdXJscmV0cmlldmUuCiAgICAgICAgIyBXZSBuZWVkIHRvIGRvIGl0IHRoaXMgd2F5IHNvIHRoYXQgd2UgY2FuIGNvbXB1dGUgdGhlCiAgICAgICAgIyBkaWdlc3Qgb2YgdGhlIGZpbGUgYXMgd2UgZ28uCiAgICAgICAgd2l0aCBvcGVuKGRlc3RmaWxlLCAnd2InKSBhcyBkZnA6CiAgICAgICAgICAgICMgYWRkaW5mb3VybCBpcyBub3QgYSBjb250ZXh0IG1hbmFnZXIgb24gMi54CiAgICAgICAgICAgICMgc28gd2UgaGF2ZSB0byB1c2UgdHJ5L2ZpbmFsbHkKICAgICAgICAgICAgc2ZwID0gc2VsZi5zZW5kX3JlcXVlc3QoUmVxdWVzdCh1cmwpKQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBoZWFkZXJzID0gc2ZwLmluZm8oKQogICAgICAgICAgICAgICAgYmxvY2tzaXplID0gODE5MgogICAgICAgICAgICAgICAgc2l6ZSA9IC0xCiAgICAgICAgICAgICAgICByZWFkID0gMAogICAgICAgICAgICAgICAgYmxvY2tudW0gPSAwCiAgICAgICAgICAgICAgICBpZiAiY29udGVudC1sZW5ndGgiIGluIGhlYWRlcnM6CiAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IGludChoZWFkZXJzWyJDb250ZW50LUxlbmd0aCJdKQogICAgICAgICAgICAgICAgaWYgcmVwb3J0aG9vazoKICAgICAgICAgICAgICAgICAgICByZXBvcnRob29rKGJsb2NrbnVtLCBibG9ja3NpemUsIHNpemUpCiAgICAgICAgICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICAgICAgICAgIGJsb2NrID0gc2ZwLnJlYWQoYmxvY2tzaXplKQogICAgICAgICAgICAgICAgICAgIGlmIG5vdCBibG9jazoKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgICAgICByZWFkICs9IGxlbihibG9jaykKICAgICAgICAgICAgICAgICAgICBkZnAud3JpdGUoYmxvY2spCiAgICAgICAgICAgICAgICAgICAgaWYgZGlnZXN0ZXI6CiAgICAgICAgICAgICAgICAgICAgICAgIGRpZ2VzdGVyLnVwZGF0ZShibG9jaykKICAgICAgICAgICAgICAgICAgICBibG9ja251bSArPSAxCiAgICAgICAgICAgICAgICAgICAgaWYgcmVwb3J0aG9vazoKICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0aG9vayhibG9ja251bSwgYmxvY2tzaXplLCBzaXplKQogICAgICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgICAgc2ZwLmNsb3NlKCkKCiAgICAgICAgIyBjaGVjayB0aGF0IHdlIGdvdCB0aGUgd2hvbGUgZmlsZSwgaWYgd2UgY2FuCiAgICAgICAgaWYgc2l6ZSA+PSAwIGFuZCByZWFkIDwgc2l6ZToKICAgICAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICdyZXRyaWV2YWwgaW5jb21wbGV0ZTogZ290IG9ubHkgJWQgb3V0IG9mICVkIGJ5dGVzJwogICAgICAgICAgICAgICAgJSAocmVhZCwgc2l6ZSkpCiAgICAgICAgIyBpZiB3ZSBoYXZlIGEgZGlnZXN0LCBpdCBtdXN0IG1hdGNoLgogICAgICAgIGlmIGRpZ2VzdGVyOgogICAgICAgICAgICBhY3R1YWwgPSBkaWdlc3Rlci5oZXhkaWdlc3QoKQogICAgICAgICAgICBpZiBkaWdlc3QgIT0gYWN0dWFsOgogICAgICAgICAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbignJXMgZGlnZXN0IG1pc21hdGNoIGZvciAlczogZXhwZWN0ZWQgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJXMsIGdvdCAlcycgJSAoaGFzaGVyLCBkZXN0ZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZ2VzdCwgYWN0dWFsKSkKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdEaWdlc3QgdmVyaWZpZWQ6ICVzJywgZGlnZXN0KQoKICAgIGRlZiBzZW5kX3JlcXVlc3Qoc2VsZiwgcmVxKToKICAgICAgICAiIiIKICAgICAgICBTZW5kIGEgc3RhbmRhcmQgbGlicmFyeSA6Y2xhc3M6YFJlcXVlc3RgIHRvIFB5UEkgYW5kIHJldHVybiBpdHMKICAgICAgICByZXNwb25zZS4KCiAgICAgICAgOnBhcmFtIHJlcTogVGhlIHJlcXVlc3QgdG8gc2VuZC4KICAgICAgICA6cmV0dXJuOiBUaGUgSFRUUCByZXNwb25zZSBmcm9tIFB5UEkgKGEgc3RhbmRhcmQgbGlicmFyeSBIVFRQUmVzcG9uc2UpLgogICAgICAgICIiIgogICAgICAgIGhhbmRsZXJzID0gW10KICAgICAgICBpZiBzZWxmLnBhc3N3b3JkX2hhbmRsZXI6CiAgICAgICAgICAgIGhhbmRsZXJzLmFwcGVuZChzZWxmLnBhc3N3b3JkX2hhbmRsZXIpCiAgICAgICAgaWYgc2VsZi5zc2xfdmVyaWZpZXI6CiAgICAgICAgICAgIGhhbmRsZXJzLmFwcGVuZChzZWxmLnNzbF92ZXJpZmllcikKICAgICAgICBvcGVuZXIgPSBidWlsZF9vcGVuZXIoKmhhbmRsZXJzKQogICAgICAgIHJldHVybiBvcGVuZXIub3BlbihyZXEpCgogICAgZGVmIGVuY29kZV9yZXF1ZXN0KHNlbGYsIGZpZWxkcywgZmlsZXMpOgogICAgICAgICIiIgogICAgICAgIEVuY29kZSBmaWVsZHMgYW5kIGZpbGVzIGZvciBwb3N0aW5nIHRvIGFuIEhUVFAgc2VydmVyLgoKICAgICAgICA6cGFyYW0gZmllbGRzOiBUaGUgZmllbGRzIHRvIHNlbmQgYXMgYSBsaXN0IG9mIChmaWVsZG5hbWUsIHZhbHVlKQogICAgICAgICAgICAgICAgICAgICAgIHR1cGxlcy4KICAgICAgICA6cGFyYW0gZmlsZXM6IFRoZSBmaWxlcyB0byBzZW5kIGFzIGEgbGlzdCBvZiAoZmllbGRuYW1lLCBmaWxlbmFtZSwKICAgICAgICAgICAgICAgICAgICAgIGZpbGVfYnl0ZXMpIHR1cGxlLgogICAgICAgICIiIgogICAgICAgICMgQWRhcHRlZCBmcm9tIHBhY2thZ2luZywgd2hpY2ggaW4gdHVybiB3YXMgYWRhcHRlZCBmcm9tCiAgICAgICAgIyBodHRwOi8vY29kZS5hY3RpdmVzdGF0ZS5jb20vcmVjaXBlcy8xNDYzMDYKCiAgICAgICAgcGFydHMgPSBbXQogICAgICAgIGJvdW5kYXJ5ID0gc2VsZi5ib3VuZGFyeQogICAgICAgIGZvciBrLCB2YWx1ZXMgaW4gZmllbGRzOgogICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh2YWx1ZXMsIChsaXN0LCB0dXBsZSkpOgogICAgICAgICAgICAgICAgdmFsdWVzID0gW3ZhbHVlc10KCiAgICAgICAgICAgIGZvciB2IGluIHZhbHVlczoKICAgICAgICAgICAgICAgIHBhcnRzLmV4dGVuZCgoCiAgICAgICAgICAgICAgICAgICAgYictLScgKyBib3VuZGFyeSwKICAgICAgICAgICAgICAgICAgICAoJ0NvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT0iJXMiJyAlCiAgICAgICAgICAgICAgICAgICAgIGspLmVuY29kZSgndXRmLTgnKSwKICAgICAgICAgICAgICAgICAgICBiJycsCiAgICAgICAgICAgICAgICAgICAgdi5lbmNvZGUoJ3V0Zi04JykpKQogICAgICAgIGZvciBrZXksIGZpbGVuYW1lLCB2YWx1ZSBpbiBmaWxlczoKICAgICAgICAgICAgcGFydHMuZXh0ZW5kKCgKICAgICAgICAgICAgICAgIGInLS0nICsgYm91bmRhcnksCiAgICAgICAgICAgICAgICAoJ0NvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT0iJXMiOyBmaWxlbmFtZT0iJXMiJyAlCiAgICAgICAgICAgICAgICAgKGtleSwgZmlsZW5hbWUpKS5lbmNvZGUoJ3V0Zi04JyksCiAgICAgICAgICAgICAgICBiJycsCiAgICAgICAgICAgICAgICB2YWx1ZSkpCgogICAgICAgIHBhcnRzLmV4dGVuZCgoYictLScgKyBib3VuZGFyeSArIGInLS0nLCBiJycpKQoKICAgICAgICBib2R5ID0gYidcclxuJy5qb2luKHBhcnRzKQogICAgICAgIGN0ID0gYidtdWx0aXBhcnQvZm9ybS1kYXRhOyBib3VuZGFyeT0nICsgYm91bmRhcnkKICAgICAgICBoZWFkZXJzID0gewogICAgICAgICAgICAnQ29udGVudC10eXBlJzogY3QsCiAgICAgICAgICAgICdDb250ZW50LWxlbmd0aCc6IHN0cihsZW4oYm9keSkpCiAgICAgICAgfQogICAgICAgIHJldHVybiBSZXF1ZXN0KHNlbGYudXJsLCBib2R5LCBoZWFkZXJzKQoKICAgIGRlZiBzZWFyY2goc2VsZiwgdGVybXMsIG9wZXJhdG9yPU5vbmUpOgogICAgICAgIGlmIGlzaW5zdGFuY2UodGVybXMsIHN0cmluZ190eXBlcyk6CiAgICAgICAgICAgIHRlcm1zID0geyduYW1lJzogdGVybXN9CiAgICAgICAgaWYgc2VsZi5ycGNfcHJveHkgaXMgTm9uZToKICAgICAgICAgICAgc2VsZi5ycGNfcHJveHkgPSBTZXJ2ZXJQcm94eShzZWxmLnVybCwgdGltZW91dD0zLjApCiAgICAgICAgcmV0dXJuIHNlbGYucnBjX3Byb3h5LnNlYXJjaCh0ZXJtcywgb3BlcmF0b3Igb3IgJ2FuZCcpClBLAwQUAAAAAAAAACEA0cV4r0XHAABFxwAAPAAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvZGlzdGxpYi9sb2NhdG9ycy5weSMgLSotIGNvZGluZzogdXRmLTggLSotCiMKIyBDb3B5cmlnaHQgKEMpIDIwMTItMjAxNSBWaW5heSBTYWppcC4KIyBMaWNlbnNlZCB0byB0aGUgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24gdW5kZXIgYSBjb250cmlidXRvciBhZ3JlZW1lbnQuCiMgU2VlIExJQ0VOU0UudHh0IGFuZCBDT05UUklCVVRPUlMudHh0LgojCgppbXBvcnQgZ3ppcApmcm9tIGlvIGltcG9ydCBCeXRlc0lPCmltcG9ydCBqc29uCmltcG9ydCBsb2dnaW5nCmltcG9ydCBvcwppbXBvcnQgcG9zaXhwYXRoCmltcG9ydCByZQp0cnk6CiAgICBpbXBvcnQgdGhyZWFkaW5nCmV4Y2VwdCBJbXBvcnRFcnJvcjogICMgcHJhZ21hOiBubyBjb3ZlcgogICAgaW1wb3J0IGR1bW15X3RocmVhZGluZyBhcyB0aHJlYWRpbmcKaW1wb3J0IHpsaWIKCmZyb20gLiBpbXBvcnQgRGlzdGxpYkV4Y2VwdGlvbgpmcm9tIC5jb21wYXQgaW1wb3J0ICh1cmxqb2luLCB1cmxwYXJzZSwgdXJsdW5wYXJzZSwgdXJsMnBhdGhuYW1lLCBwYXRobmFtZTJ1cmwsCiAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLCBxdW90ZSwgdW5lc2NhcGUsIHN0cmluZ190eXBlcywgYnVpbGRfb3BlbmVyLAogICAgICAgICAgICAgICAgICAgICBIVFRQUmVkaXJlY3RIYW5kbGVyIGFzIEJhc2VSZWRpcmVjdEhhbmRsZXIsIHRleHRfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgUmVxdWVzdCwgSFRUUEVycm9yLCBVUkxFcnJvcikKZnJvbSAuZGF0YWJhc2UgaW1wb3J0IERpc3RyaWJ1dGlvbiwgRGlzdHJpYnV0aW9uUGF0aCwgbWFrZV9kaXN0CmZyb20gLm1ldGFkYXRhIGltcG9ydCBNZXRhZGF0YQpmcm9tIC51dGlsIGltcG9ydCAoY2FjaGVkX3Byb3BlcnR5LCBwYXJzZV9jcmVkZW50aWFscywgZW5zdXJlX3NsYXNoLAogICAgICAgICAgICAgICAgICAgc3BsaXRfZmlsZW5hbWUsIGdldF9wcm9qZWN0X2RhdGEsIHBhcnNlX3JlcXVpcmVtZW50LAogICAgICAgICAgICAgICAgICAgcGFyc2VfbmFtZV9hbmRfdmVyc2lvbiwgU2VydmVyUHJveHksIG5vcm1hbGl6ZV9uYW1lKQpmcm9tIC52ZXJzaW9uIGltcG9ydCBnZXRfc2NoZW1lLCBVbnN1cHBvcnRlZFZlcnNpb25FcnJvcgpmcm9tIC53aGVlbCBpbXBvcnQgV2hlZWwsIGlzX2NvbXBhdGlibGUKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKSEFTSEVSX0hBU0ggPSByZS5jb21waWxlKCdeKFx3Kyk9KFthLWYwLTldKyknKQpDSEFSU0VUID0gcmUuY29tcGlsZShyJztccypjaGFyc2V0XHMqPVxzKiguKilccyokJywgcmUuSSkKSFRNTF9DT05URU5UX1RZUEUgPSByZS5jb21waWxlKCd0ZXh0L2h0bWx8YXBwbGljYXRpb24veChodCk/bWwnKQpERUZBVUxUX0lOREVYID0gJ2h0dHBzOi8vcHlwaS5weXRob24ub3JnL3B5cGknCgpkZWYgZ2V0X2FsbF9kaXN0cmlidXRpb25fbmFtZXModXJsPU5vbmUpOgogICAgIiIiCiAgICBSZXR1cm4gYWxsIGRpc3RyaWJ1dGlvbiBuYW1lcyBrbm93biBieSBhbiBpbmRleC4KICAgIDpwYXJhbSB1cmw6IFRoZSBVUkwgb2YgdGhlIGluZGV4LgogICAgOnJldHVybjogQSBsaXN0IG9mIGFsbCBrbm93biBkaXN0cmlidXRpb24gbmFtZXMuCiAgICAiIiIKICAgIGlmIHVybCBpcyBOb25lOgogICAgICAgIHVybCA9IERFRkFVTFRfSU5ERVgKICAgIGNsaWVudCA9IFNlcnZlclByb3h5KHVybCwgdGltZW91dD0zLjApCiAgICByZXR1cm4gY2xpZW50Lmxpc3RfcGFja2FnZXMoKQoKY2xhc3MgUmVkaXJlY3RIYW5kbGVyKEJhc2VSZWRpcmVjdEhhbmRsZXIpOgogICAgIiIiCiAgICBBIGNsYXNzIHRvIHdvcmsgYXJvdW5kIGEgYnVnIGluIHNvbWUgUHl0aG9uIDMuMi54IHJlbGVhc2VzLgogICAgIiIiCiAgICAjIFRoZXJlJ3MgYSBidWcgaW4gdGhlIGJhc2UgdmVyc2lvbiBmb3Igc29tZSAzLjIueAogICAgIyAoZS5nLiAzLjIuMiBvbiBVYnVudHUgT25laXJpYykuIElmIGEgTG9jYXRpb24gaGVhZGVyCiAgICAjIHJldHVybnMgZS5nLiAvYWJjLCBpdCBiYWlscyBiZWNhdXNlIGl0IHNheXMgdGhlIHNjaGVtZSAnJwogICAgIyBpcyBib2d1cywgd2hlbiBhY3R1YWxseSBpdCBzaG91bGQgdXNlIHRoZSByZXF1ZXN0J3MKICAgICMgVVJMIGZvciB0aGUgc2NoZW1lLiBTZWUgUHl0aG9uIGlzc3VlICMxMzY5Ni4KICAgIGRlZiBodHRwX2Vycm9yXzMwMihzZWxmLCByZXEsIGZwLCBjb2RlLCBtc2csIGhlYWRlcnMpOgogICAgICAgICMgU29tZSBzZXJ2ZXJzIChpbmNvcnJlY3RseSkgcmV0dXJuIG11bHRpcGxlIExvY2F0aW9uIGhlYWRlcnMKICAgICAgICAjIChzbyBwcm9iYWJseSBzYW1lIGdvZXMgZm9yIFVSSSkuICBVc2UgZmlyc3QgaGVhZGVyLgogICAgICAgIG5ld3VybCA9IE5vbmUKICAgICAgICBmb3Iga2V5IGluICgnbG9jYXRpb24nLCAndXJpJyk6CiAgICAgICAgICAgIGlmIGtleSBpbiBoZWFkZXJzOgogICAgICAgICAgICAgICAgbmV3dXJsID0gaGVhZGVyc1trZXldCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgIGlmIG5ld3VybCBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4KICAgICAgICB1cmxwYXJ0cyA9IHVybHBhcnNlKG5ld3VybCkKICAgICAgICBpZiB1cmxwYXJ0cy5zY2hlbWUgPT0gJyc6CiAgICAgICAgICAgIG5ld3VybCA9IHVybGpvaW4ocmVxLmdldF9mdWxsX3VybCgpLCBuZXd1cmwpCiAgICAgICAgICAgIGlmIGhhc2F0dHIoaGVhZGVycywgJ3JlcGxhY2VfaGVhZGVyJyk6CiAgICAgICAgICAgICAgICBoZWFkZXJzLnJlcGxhY2VfaGVhZGVyKGtleSwgbmV3dXJsKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgaGVhZGVyc1trZXldID0gbmV3dXJsCiAgICAgICAgcmV0dXJuIEJhc2VSZWRpcmVjdEhhbmRsZXIuaHR0cF9lcnJvcl8zMDIoc2VsZiwgcmVxLCBmcCwgY29kZSwgbXNnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnMpCgogICAgaHR0cF9lcnJvcl8zMDEgPSBodHRwX2Vycm9yXzMwMyA9IGh0dHBfZXJyb3JfMzA3ID0gaHR0cF9lcnJvcl8zMDIKCmNsYXNzIExvY2F0b3Iob2JqZWN0KToKICAgICIiIgogICAgQSBiYXNlIGNsYXNzIGZvciBsb2NhdG9ycyAtIHRoaW5ncyB0aGF0IGxvY2F0ZSBkaXN0cmlidXRpb25zLgogICAgIiIiCiAgICBzb3VyY2VfZXh0ZW5zaW9ucyA9ICgnLnRhci5neicsICcudGFyLmJ6MicsICcudGFyJywgJy56aXAnLCAnLnRneicsICcudGJ6JykKICAgIGJpbmFyeV9leHRlbnNpb25zID0gKCcuZWdnJywgJy5leGUnLCAnLndobCcpCiAgICBleGNsdWRlZF9leHRlbnNpb25zID0gKCcucGRmJywpCgogICAgIyBBIGxpc3Qgb2YgdGFncyBpbmRpY2F0aW5nIHdoaWNoIHdoZWVscyB5b3Ugd2FudCB0byBtYXRjaC4gVGhlIGRlZmF1bHQKICAgICMgdmFsdWUgb2YgTm9uZSBtYXRjaGVzIGFnYWluc3QgdGhlIHRhZ3MgY29tcGF0aWJsZSB3aXRoIHRoZSBydW5uaW5nCiAgICAjIFB5dGhvbi4gSWYgeW91IHdhbnQgdG8gbWF0Y2ggb3RoZXIgdmFsdWVzLCBzZXQgd2hlZWxfdGFncyBvbiBhIGxvY2F0b3IKICAgICMgaW5zdGFuY2UgdG8gYSBsaXN0IG9mIHR1cGxlcyAocHl2ZXIsIGFiaSwgYXJjaCkgd2hpY2ggeW91IHdhbnQgdG8gbWF0Y2guCiAgICB3aGVlbF90YWdzID0gTm9uZQoKICAgIGRvd25sb2FkYWJsZV9leHRlbnNpb25zID0gc291cmNlX2V4dGVuc2lvbnMgKyAoJy53aGwnLCkKCiAgICBkZWYgX19pbml0X18oc2VsZiwgc2NoZW1lPSdkZWZhdWx0Jyk6CiAgICAgICAgIiIiCiAgICAgICAgSW5pdGlhbGlzZSBhbiBpbnN0YW5jZS4KICAgICAgICA6cGFyYW0gc2NoZW1lOiBCZWNhdXNlIGxvY2F0b3JzIGxvb2sgZm9yIG1vc3QgcmVjZW50IHZlcnNpb25zLCB0aGV5CiAgICAgICAgICAgICAgICAgICAgICAgbmVlZCB0byBrbm93IHRoZSB2ZXJzaW9uIHNjaGVtZSB0byB1c2UuIFRoaXMgc3BlY2lmaWVzCiAgICAgICAgICAgICAgICAgICAgICAgdGhlIGN1cnJlbnQgUEVQLXJlY29tbWVuZGVkIHNjaGVtZSAtIHVzZSBgYCdsZWdhY3knYGAKICAgICAgICAgICAgICAgICAgICAgICBpZiB5b3UgbmVlZCB0byBzdXBwb3J0IGV4aXN0aW5nIGRpc3RyaWJ1dGlvbnMgb24gUHlQSS4KICAgICAgICAiIiIKICAgICAgICBzZWxmLl9jYWNoZSA9IHt9CiAgICAgICAgc2VsZi5zY2hlbWUgPSBzY2hlbWUKICAgICAgICAjIEJlY2F1c2Ugb2YgYnVncyBpbiBzb21lIG9mIHRoZSBoYW5kbGVycyBvbiBzb21lIG9mIHRoZSBwbGF0Zm9ybXMsCiAgICAgICAgIyB3ZSB1c2Ugb3VyIG93biBvcGVuZXIgcmF0aGVyIHRoYW4ganVzdCB1c2luZyB1cmxvcGVuLgogICAgICAgIHNlbGYub3BlbmVyID0gYnVpbGRfb3BlbmVyKFJlZGlyZWN0SGFuZGxlcigpKQogICAgICAgICMgSWYgZ2V0X3Byb2plY3QoKSBpcyBjYWxsZWQgZnJvbSBsb2NhdGUoKSwgdGhlIG1hdGNoZXIgaW5zdGFuY2UKICAgICAgICAjIGlzIHNldCBmcm9tIHRoZSByZXF1aXJlbWVudCBwYXNzZWQgdG8gbG9jYXRlKCkuIFNlZSBpc3N1ZSAjMTggZm9yCiAgICAgICAgIyB3aHkgdGhpcyBjYW4gYmUgdXNlZnVsIHRvIGtub3cuCiAgICAgICAgc2VsZi5tYXRjaGVyID0gTm9uZQogICAgICAgIHNlbGYuZXJyb3JzID0gcXVldWUuUXVldWUoKQoKICAgIGRlZiBnZXRfZXJyb3JzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBhbnkgZXJyb3JzIHdoaWNoIGhhdmUgb2NjdXJyZWQuCiAgICAgICAgIiIiCiAgICAgICAgcmVzdWx0ID0gW10KICAgICAgICB3aGlsZSBub3Qgc2VsZi5lcnJvcnMuZW1wdHkoKTogICMgcHJhZ21hOiBubyBjb3ZlcgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBlID0gc2VsZi5lcnJvcnMuZ2V0KEZhbHNlKQogICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChlKQogICAgICAgICAgICBleGNlcHQgc2VsZi5lcnJvcnMuRW1wdHk6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBzZWxmLmVycm9ycy50YXNrX2RvbmUoKQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgY2xlYXJfZXJyb3JzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIENsZWFyIGFueSBlcnJvcnMgd2hpY2ggbWF5IGhhdmUgYmVlbiBsb2dnZWQuCiAgICAgICAgIiIiCiAgICAgICAgIyBKdXN0IGdldCB0aGUgZXJyb3JzIGFuZCB0aHJvdyB0aGVtIGF3YXkKICAgICAgICBzZWxmLmdldF9lcnJvcnMoKQoKICAgIGRlZiBjbGVhcl9jYWNoZShzZWxmKToKICAgICAgICBzZWxmLl9jYWNoZS5jbGVhcigpCgogICAgZGVmIF9nZXRfc2NoZW1lKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9zY2hlbWUKCiAgICBkZWYgX3NldF9zY2hlbWUoc2VsZiwgdmFsdWUpOgogICAgICAgIHNlbGYuX3NjaGVtZSA9IHZhbHVlCgogICAgc2NoZW1lID0gcHJvcGVydHkoX2dldF9zY2hlbWUsIF9zZXRfc2NoZW1lKQoKICAgIGRlZiBfZ2V0X3Byb2plY3Qoc2VsZiwgbmFtZSk6CiAgICAgICAgIiIiCiAgICAgICAgRm9yIGEgZ2l2ZW4gcHJvamVjdCwgZ2V0IGEgZGljdGlvbmFyeSBtYXBwaW5nIGF2YWlsYWJsZSB2ZXJzaW9ucyB0byBEaXN0cmlidXRpb24KICAgICAgICBpbnN0YW5jZXMuCgogICAgICAgIFRoaXMgc2hvdWxkIGJlIGltcGxlbWVudGVkIGluIHN1YmNsYXNzZXMuCgogICAgICAgIElmIGNhbGxlZCBmcm9tIGEgbG9jYXRlKCkgcmVxdWVzdCwgc2VsZi5tYXRjaGVyIHdpbGwgYmUgc2V0IHRvIGEKICAgICAgICBtYXRjaGVyIGZvciB0aGUgcmVxdWlyZW1lbnQgdG8gc2F0aXNmeSwgb3RoZXJ3aXNlIGl0IHdpbGwgYmUgTm9uZS4KICAgICAgICAiIiIKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCdQbGVhc2UgaW1wbGVtZW50IGluIHRoZSBzdWJjbGFzcycpCgogICAgZGVmIGdldF9kaXN0cmlidXRpb25fbmFtZXMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIGFsbCB0aGUgZGlzdHJpYnV0aW9uIG5hbWVzIGtub3duIHRvIHRoaXMgbG9jYXRvci4KICAgICAgICAiIiIKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCdQbGVhc2UgaW1wbGVtZW50IGluIHRoZSBzdWJjbGFzcycpCgogICAgZGVmIGdldF9wcm9qZWN0KHNlbGYsIG5hbWUpOgogICAgICAgICIiIgogICAgICAgIEZvciBhIGdpdmVuIHByb2plY3QsIGdldCBhIGRpY3Rpb25hcnkgbWFwcGluZyBhdmFpbGFibGUgdmVyc2lvbnMgdG8gRGlzdHJpYnV0aW9uCiAgICAgICAgaW5zdGFuY2VzLgoKICAgICAgICBUaGlzIGNhbGxzIF9nZXRfcHJvamVjdCB0byBkbyBhbGwgdGhlIHdvcmssIGFuZCBqdXN0IGltcGxlbWVudHMgYSBjYWNoaW5nIGxheWVyIG9uIHRvcC4KICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLl9jYWNoZSBpcyBOb25lOgogICAgICAgICAgICByZXN1bHQgPSBzZWxmLl9nZXRfcHJvamVjdChuYW1lKQogICAgICAgIGVsaWYgbmFtZSBpbiBzZWxmLl9jYWNoZToKICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5fY2FjaGVbbmFtZV0KICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmNsZWFyX2Vycm9ycygpCiAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuX2dldF9wcm9qZWN0KG5hbWUpCiAgICAgICAgICAgIHNlbGYuX2NhY2hlW25hbWVdID0gcmVzdWx0CiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBzY29yZV91cmwoc2VsZiwgdXJsKToKICAgICAgICAiIiIKICAgICAgICBHaXZlIGFuIHVybCBhIHNjb3JlIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGNob29zZSBwcmVmZXJyZWQgVVJMcwogICAgICAgIGZvciBhIGdpdmVuIHByb2plY3QgcmVsZWFzZS4KICAgICAgICAiIiIKICAgICAgICB0ID0gdXJscGFyc2UodXJsKQogICAgICAgIGJhc2VuYW1lID0gcG9zaXhwYXRoLmJhc2VuYW1lKHQucGF0aCkKICAgICAgICBjb21wYXRpYmxlID0gVHJ1ZQogICAgICAgIGlzX3doZWVsID0gYmFzZW5hbWUuZW5kc3dpdGgoJy53aGwnKQogICAgICAgIGlmIGlzX3doZWVsOgogICAgICAgICAgICBjb21wYXRpYmxlID0gaXNfY29tcGF0aWJsZShXaGVlbChiYXNlbmFtZSksIHNlbGYud2hlZWxfdGFncykKICAgICAgICByZXR1cm4gKHQuc2NoZW1lICE9ICdodHRwcycsICdweXBpLnB5dGhvbi5vcmcnIGluIHQubmV0bG9jLAogICAgICAgICAgICAgICAgaXNfd2hlZWwsIGNvbXBhdGlibGUsIGJhc2VuYW1lKQoKICAgIGRlZiBwcmVmZXJfdXJsKHNlbGYsIHVybDEsIHVybDIpOgogICAgICAgICIiIgogICAgICAgIENob29zZSBvbmUgb2YgdHdvIFVSTHMgd2hlcmUgYm90aCBhcmUgY2FuZGlkYXRlcyBmb3IgZGlzdHJpYnV0aW9uCiAgICAgICAgYXJjaGl2ZXMgZm9yIHRoZSBzYW1lIHZlcnNpb24gb2YgYSBkaXN0cmlidXRpb24gKGZvciBleGFtcGxlLAogICAgICAgIC50YXIuZ3ogdnMuIHppcCkuCgogICAgICAgIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGZhdm91cnMgaHR0cHM6Ly8gVVJMcyBvdmVyIGh0dHA6Ly8sIGFyY2hpdmVzCiAgICAgICAgZnJvbSBQeVBJIG92ZXIgdGhvc2UgZnJvbSBvdGhlciBsb2NhdGlvbnMsIHdoZWVsIGNvbXBhdGliaWxpdHkgKGlmIGEKICAgICAgICB3aGVlbCkgYW5kIHRoZW4gdGhlIGFyY2hpdmUgbmFtZS4KICAgICAgICAiIiIKICAgICAgICByZXN1bHQgPSB1cmwyCiAgICAgICAgaWYgdXJsMToKICAgICAgICAgICAgczEgPSBzZWxmLnNjb3JlX3VybCh1cmwxKQogICAgICAgICAgICBzMiA9IHNlbGYuc2NvcmVfdXJsKHVybDIpCiAgICAgICAgICAgIGlmIHMxID4gczI6CiAgICAgICAgICAgICAgICByZXN1bHQgPSB1cmwxCiAgICAgICAgICAgIGlmIHJlc3VsdCAhPSB1cmwyOgogICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdOb3QgcmVwbGFjaW5nICVyIHdpdGggJXInLCB1cmwxLCB1cmwyKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdSZXBsYWNpbmcgJXIgd2l0aCAlcicsIHVybDEsIHVybDIpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBzcGxpdF9maWxlbmFtZShzZWxmLCBmaWxlbmFtZSwgcHJvamVjdF9uYW1lKToKICAgICAgICAiIiIKICAgICAgICBBdHRlbXB0IHRvIHNwbGl0IGEgZmlsZW5hbWUgaW4gcHJvamVjdCBuYW1lLCB2ZXJzaW9uIGFuZCBQeXRob24gdmVyc2lvbi4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc3BsaXRfZmlsZW5hbWUoZmlsZW5hbWUsIHByb2plY3RfbmFtZSkKCiAgICBkZWYgY29udmVydF91cmxfdG9fZG93bmxvYWRfaW5mbyhzZWxmLCB1cmwsIHByb2plY3RfbmFtZSk6CiAgICAgICAgIiIiCiAgICAgICAgU2VlIGlmIGEgVVJMIGlzIGEgY2FuZGlkYXRlIGZvciBhIGRvd25sb2FkIFVSTCBmb3IgYSBwcm9qZWN0ICh0aGUgVVJMCiAgICAgICAgaGFzIHR5cGljYWxseSBiZWVuIHNjcmFwZWQgZnJvbSBhbiBIVE1MIHBhZ2UpLgoKICAgICAgICBJZiBpdCBpcywgYSBkaWN0aW9uYXJ5IGlzIHJldHVybmVkIHdpdGgga2V5cyAibmFtZSIsICJ2ZXJzaW9uIiwKICAgICAgICAiZmlsZW5hbWUiIGFuZCAidXJsIjsgb3RoZXJ3aXNlLCBOb25lIGlzIHJldHVybmVkLgogICAgICAgICIiIgogICAgICAgIGRlZiBzYW1lX3Byb2plY3QobmFtZTEsIG5hbWUyKToKICAgICAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZV9uYW1lKG5hbWUxKSA9PSBub3JtYWxpemVfbmFtZShuYW1lMikKCiAgICAgICAgcmVzdWx0ID0gTm9uZQogICAgICAgIHNjaGVtZSwgbmV0bG9jLCBwYXRoLCBwYXJhbXMsIHF1ZXJ5LCBmcmFnID0gdXJscGFyc2UodXJsKQogICAgICAgIGlmIGZyYWcubG93ZXIoKS5zdGFydHN3aXRoKCdlZ2c9Jyk6CiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnJXM6IHZlcnNpb24gaGludCBpbiBmcmFnbWVudDogJXInLAogICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdF9uYW1lLCBmcmFnKQogICAgICAgIG0gPSBIQVNIRVJfSEFTSC5tYXRjaChmcmFnKQogICAgICAgIGlmIG06CiAgICAgICAgICAgIGFsZ28sIGRpZ2VzdCA9IG0uZ3JvdXBzKCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBhbGdvLCBkaWdlc3QgPSBOb25lLCBOb25lCiAgICAgICAgb3JpZ3BhdGggPSBwYXRoCiAgICAgICAgaWYgcGF0aCBhbmQgcGF0aFstMV0gPT0gJy8nOgogICAgICAgICAgICBwYXRoID0gcGF0aFs6LTFdCiAgICAgICAgaWYgcGF0aC5lbmRzd2l0aCgnLndobCcpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICB3aGVlbCA9IFdoZWVsKHBhdGgpCiAgICAgICAgICAgICAgICBpZiBpc19jb21wYXRpYmxlKHdoZWVsLCBzZWxmLndoZWVsX3RhZ3MpOgogICAgICAgICAgICAgICAgICAgIGlmIHByb2plY3RfbmFtZSBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlID0gVHJ1ZQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGUgPSBzYW1lX3Byb2plY3Qod2hlZWwubmFtZSwgcHJvamVjdF9uYW1lKQogICAgICAgICAgICAgICAgICAgIGlmIGluY2x1ZGU6CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogd2hlZWwubmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2ZXJzaW9uJzogd2hlZWwudmVyc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmaWxlbmFtZSc6IHdoZWVsLmZpbGVuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VybCc6IHVybHVucGFyc2UoKHNjaGVtZSwgbmV0bG9jLCBvcmlncGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMsIHF1ZXJ5LCAnJykpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3B5dGhvbi12ZXJzaW9uJzogJywgJy5qb2luKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnLicuam9pbihsaXN0KHZbMjpdKSkgZm9yIHYgaW4gd2hlZWwucHl2ZXJdKSwKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6ICAjIHByYWdtYTogbm8gY292ZXIKICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdpbnZhbGlkIHBhdGggZm9yIHdoZWVsOiAlcycsIHBhdGgpCiAgICAgICAgZWxpZiBwYXRoLmVuZHN3aXRoKHNlbGYuZG93bmxvYWRhYmxlX2V4dGVuc2lvbnMpOgogICAgICAgICAgICBwYXRoID0gZmlsZW5hbWUgPSBwb3NpeHBhdGguYmFzZW5hbWUocGF0aCkKICAgICAgICAgICAgZm9yIGV4dCBpbiBzZWxmLmRvd25sb2FkYWJsZV9leHRlbnNpb25zOgogICAgICAgICAgICAgICAgaWYgcGF0aC5lbmRzd2l0aChleHQpOgogICAgICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoWzotbGVuKGV4dCldCiAgICAgICAgICAgICAgICAgICAgdCA9IHNlbGYuc3BsaXRfZmlsZW5hbWUocGF0aCwgcHJvamVjdF9uYW1lKQogICAgICAgICAgICAgICAgICAgIGlmIG5vdCB0OgogICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ05vIG1hdGNoIGZvciBwcm9qZWN0L3ZlcnNpb246ICVzJywgcGF0aCkKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCB2ZXJzaW9uLCBweXZlciA9IHQKICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IHByb2plY3RfbmFtZSBvciBzYW1lX3Byb2plY3QocHJvamVjdF9uYW1lLCBuYW1lKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6IG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZlcnNpb24nOiB2ZXJzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmaWxlbmFtZSc6IGZpbGVuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1cmwnOiB1cmx1bnBhcnNlKChzY2hlbWUsIG5ldGxvYywgb3JpZ3BhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcywgcXVlcnksICcnKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIydwYWNrYWdldHlwZSc6ICdzZGlzdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBweXZlcjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbJ3B5dGhvbi12ZXJzaW9uJ10gPSBweXZlcgogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgaWYgcmVzdWx0IGFuZCBhbGdvOgogICAgICAgICAgICByZXN1bHRbJyVzX2RpZ2VzdCcgJSBhbGdvXSA9IGRpZ2VzdAogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgX2dldF9kaWdlc3Qoc2VsZiwgaW5mbyk6CiAgICAgICAgIiIiCiAgICAgICAgR2V0IGEgZGlnZXN0IGZyb20gYSBkaWN0aW9uYXJ5IGJ5IGxvb2tpbmcgYXQga2V5cyBvZiB0aGUgZm9ybQogICAgICAgICdhbGdvX2RpZ2VzdCcuCgogICAgICAgIFJldHVybnMgYSAyLXR1cGxlIChhbGdvLCBkaWdlc3QpIGlmIGZvdW5kLCBlbHNlIE5vbmUuIEN1cnJlbnRseQogICAgICAgIGxvb2tzIG9ubHkgZm9yIFNIQTI1NiwgdGhlbiBNRDUuCiAgICAgICAgIiIiCiAgICAgICAgcmVzdWx0ID0gTm9uZQogICAgICAgIGZvciBhbGdvIGluICgnc2hhMjU2JywgJ21kNScpOgogICAgICAgICAgICBrZXkgPSAnJXNfZGlnZXN0JyAlIGFsZ28KICAgICAgICAgICAgaWYga2V5IGluIGluZm86CiAgICAgICAgICAgICAgICByZXN1bHQgPSAoYWxnbywgaW5mb1trZXldKQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIF91cGRhdGVfdmVyc2lvbl9kYXRhKHNlbGYsIHJlc3VsdCwgaW5mbyk6CiAgICAgICAgIiIiCiAgICAgICAgVXBkYXRlIGEgcmVzdWx0IGRpY3Rpb25hcnkgKHRoZSBmaW5hbCByZXN1bHQgZnJvbSBfZ2V0X3Byb2plY3QpIHdpdGggYQogICAgICAgIGRpY3Rpb25hcnkgZm9yIGEgc3BlY2lmaWMgdmVyc2lvbiwgd2hpY2ggdHlwaWNhbGx5IGhvbGRzIGluZm9ybWF0aW9uCiAgICAgICAgZ2xlYW5lZCBmcm9tIGEgZmlsZW5hbWUgb3IgVVJMIGZvciBhbiBhcmNoaXZlIGZvciB0aGUgZGlzdHJpYnV0aW9uLgogICAgICAgICIiIgogICAgICAgIG5hbWUgPSBpbmZvLnBvcCgnbmFtZScpCiAgICAgICAgdmVyc2lvbiA9IGluZm8ucG9wKCd2ZXJzaW9uJykKICAgICAgICBpZiB2ZXJzaW9uIGluIHJlc3VsdDoKICAgICAgICAgICAgZGlzdCA9IHJlc3VsdFt2ZXJzaW9uXQogICAgICAgICAgICBtZCA9IGRpc3QubWV0YWRhdGEKICAgICAgICBlbHNlOgogICAgICAgICAgICBkaXN0ID0gbWFrZV9kaXN0KG5hbWUsIHZlcnNpb24sIHNjaGVtZT1zZWxmLnNjaGVtZSkKICAgICAgICAgICAgbWQgPSBkaXN0Lm1ldGFkYXRhCiAgICAgICAgZGlzdC5kaWdlc3QgPSBkaWdlc3QgPSBzZWxmLl9nZXRfZGlnZXN0KGluZm8pCiAgICAgICAgdXJsID0gaW5mb1sndXJsJ10KICAgICAgICByZXN1bHRbJ2RpZ2VzdHMnXVt1cmxdID0gZGlnZXN0CiAgICAgICAgaWYgbWQuc291cmNlX3VybCAhPSBpbmZvWyd1cmwnXToKICAgICAgICAgICAgbWQuc291cmNlX3VybCA9IHNlbGYucHJlZmVyX3VybChtZC5zb3VyY2VfdXJsLCB1cmwpCiAgICAgICAgICAgIHJlc3VsdFsndXJscyddLnNldGRlZmF1bHQodmVyc2lvbiwgc2V0KCkpLmFkZCh1cmwpCiAgICAgICAgZGlzdC5sb2NhdG9yID0gc2VsZgogICAgICAgIHJlc3VsdFt2ZXJzaW9uXSA9IGRpc3QKCiAgICBkZWYgbG9jYXRlKHNlbGYsIHJlcXVpcmVtZW50LCBwcmVyZWxlYXNlcz1GYWxzZSk6CiAgICAgICAgIiIiCiAgICAgICAgRmluZCB0aGUgbW9zdCByZWNlbnQgZGlzdHJpYnV0aW9uIHdoaWNoIG1hdGNoZXMgdGhlIGdpdmVuCiAgICAgICAgcmVxdWlyZW1lbnQuCgogICAgICAgIDpwYXJhbSByZXF1aXJlbWVudDogQSByZXF1aXJlbWVudCBvZiB0aGUgZm9ybSAnZm9vICgxLjApJyBvciBwZXJoYXBzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9vICg+PSAxLjAsIDwgMi4wLCAhPSAxLjMpJwogICAgICAgIDpwYXJhbSBwcmVyZWxlYXNlczogSWYgYGBUcnVlYGAsIGFsbG93IHByZS1yZWxlYXNlIHZlcnNpb25zCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSBsb2NhdGVkLiBPdGhlcndpc2UsIHByZS1yZWxlYXNlIHZlcnNpb25zCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgbm90IHJldHVybmVkLgogICAgICAgIDpyZXR1cm46IEEgOmNsYXNzOmBEaXN0cmlidXRpb25gIGluc3RhbmNlLCBvciBgYE5vbmVgYCBpZiBubyBzdWNoCiAgICAgICAgICAgICAgICAgZGlzdHJpYnV0aW9uIGNvdWxkIGJlIGxvY2F0ZWQuCiAgICAgICAgIiIiCiAgICAgICAgcmVzdWx0ID0gTm9uZQogICAgICAgIHIgPSBwYXJzZV9yZXF1aXJlbWVudChyZXF1aXJlbWVudCkKICAgICAgICBpZiByIGlzIE5vbmU6CiAgICAgICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oJ05vdCBhIHZhbGlkIHJlcXVpcmVtZW50OiAlcicgJSByZXF1aXJlbWVudCkKICAgICAgICBzY2hlbWUgPSBnZXRfc2NoZW1lKHNlbGYuc2NoZW1lKQogICAgICAgIHNlbGYubWF0Y2hlciA9IG1hdGNoZXIgPSBzY2hlbWUubWF0Y2hlcihyLnJlcXVpcmVtZW50KQogICAgICAgIGxvZ2dlci5kZWJ1ZygnbWF0Y2hlcjogJXMgKCVzKScsIG1hdGNoZXIsIHR5cGUobWF0Y2hlcikuX19uYW1lX18pCiAgICAgICAgdmVyc2lvbnMgPSBzZWxmLmdldF9wcm9qZWN0KHIubmFtZSkKICAgICAgICBpZiBsZW4odmVyc2lvbnMpID4gMjogICAjIHVybHMgYW5kIGRpZ2VzdHMga2V5cyBhcmUgcHJlc2VudAogICAgICAgICAgICAjIHNvbWV0aW1lcywgdmVyc2lvbnMgYXJlIGludmFsaWQKICAgICAgICAgICAgc2xpc3QgPSBbXQogICAgICAgICAgICB2Y2xzID0gbWF0Y2hlci52ZXJzaW9uX2NsYXNzCiAgICAgICAgICAgIGZvciBrIGluIHZlcnNpb25zOgogICAgICAgICAgICAgICAgaWYgayBpbiAoJ3VybHMnLCAnZGlnZXN0cycpOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgaWYgbm90IG1hdGNoZXIubWF0Y2goayk6CiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnJXMgZGlkIG5vdCBtYXRjaCAlcicsIG1hdGNoZXIsIGspCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgaWYgcHJlcmVsZWFzZXMgb3Igbm90IHZjbHMoaykuaXNfcHJlcmVsZWFzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsaXN0LmFwcGVuZChrKQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdza2lwcGluZyBwcmUtcmVsZWFzZSAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZlcnNpb24gJXMgb2YgJXMnLCBrLCBtYXRjaGVyLm5hbWUpCiAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOiAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ2Vycm9yIG1hdGNoaW5nICVzIHdpdGggJXInLCBtYXRjaGVyLCBrKQogICAgICAgICAgICAgICAgICAgIHBhc3MgIyBzbGlzdC5hcHBlbmQoaykKICAgICAgICAgICAgaWYgbGVuKHNsaXN0KSA+IDE6CiAgICAgICAgICAgICAgICBzbGlzdCA9IHNvcnRlZChzbGlzdCwga2V5PXNjaGVtZS5rZXkpCiAgICAgICAgICAgIGlmIHNsaXN0OgogICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdzb3J0ZWQgbGlzdDogJXMnLCBzbGlzdCkKICAgICAgICAgICAgICAgIHZlcnNpb24gPSBzbGlzdFstMV0KICAgICAgICAgICAgICAgIHJlc3VsdCA9IHZlcnNpb25zW3ZlcnNpb25dCiAgICAgICAgaWYgcmVzdWx0OgogICAgICAgICAgICBpZiByLmV4dHJhczoKICAgICAgICAgICAgICAgIHJlc3VsdC5leHRyYXMgPSByLmV4dHJhcwogICAgICAgICAgICByZXN1bHQuZG93bmxvYWRfdXJscyA9IHZlcnNpb25zLmdldCgndXJscycsIHt9KS5nZXQodmVyc2lvbiwgc2V0KCkpCiAgICAgICAgICAgIGQgPSB7fQogICAgICAgICAgICBzZCA9IHZlcnNpb25zLmdldCgnZGlnZXN0cycsIHt9KQogICAgICAgICAgICBmb3IgdXJsIGluIHJlc3VsdC5kb3dubG9hZF91cmxzOgogICAgICAgICAgICAgICAgaWYgdXJsIGluIHNkOgogICAgICAgICAgICAgICAgICAgIGRbdXJsXSA9IHNkW3VybF0KICAgICAgICAgICAgcmVzdWx0LmRpZ2VzdHMgPSBkCiAgICAgICAgc2VsZi5tYXRjaGVyID0gTm9uZQogICAgICAgIHJldHVybiByZXN1bHQKCgpjbGFzcyBQeVBJUlBDTG9jYXRvcihMb2NhdG9yKToKICAgICIiIgogICAgVGhpcyBsb2NhdG9yIHVzZXMgWE1MLVJQQyB0byBsb2NhdGUgZGlzdHJpYnV0aW9ucy4gSXQgdGhlcmVmb3JlCiAgICBjYW5ub3QgYmUgdXNlZCB3aXRoIHNpbXBsZSBtaXJyb3JzICh0aGF0IG9ubHkgbWlycm9yIGZpbGUgY29udGVudCkuCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB1cmwsICoqa3dhcmdzKToKICAgICAgICAiIiIKICAgICAgICBJbml0aWFsaXNlIGFuIGluc3RhbmNlLgoKICAgICAgICA6cGFyYW0gdXJsOiBUaGUgVVJMIHRvIHVzZSBmb3IgWE1MLVJQQy4KICAgICAgICA6cGFyYW0ga3dhcmdzOiBQYXNzZWQgdG8gdGhlIHN1cGVyY2xhc3MgY29uc3RydWN0b3IuCiAgICAgICAgIiIiCiAgICAgICAgc3VwZXIoUHlQSVJQQ0xvY2F0b3IsIHNlbGYpLl9faW5pdF9fKCoqa3dhcmdzKQogICAgICAgIHNlbGYuYmFzZV91cmwgPSB1cmwKICAgICAgICBzZWxmLmNsaWVudCA9IFNlcnZlclByb3h5KHVybCwgdGltZW91dD0zLjApCgogICAgZGVmIGdldF9kaXN0cmlidXRpb25fbmFtZXMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIGFsbCB0aGUgZGlzdHJpYnV0aW9uIG5hbWVzIGtub3duIHRvIHRoaXMgbG9jYXRvci4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2V0KHNlbGYuY2xpZW50Lmxpc3RfcGFja2FnZXMoKSkKCiAgICBkZWYgX2dldF9wcm9qZWN0KHNlbGYsIG5hbWUpOgogICAgICAgIHJlc3VsdCA9IHsndXJscyc6IHt9LCAnZGlnZXN0cyc6IHt9fQogICAgICAgIHZlcnNpb25zID0gc2VsZi5jbGllbnQucGFja2FnZV9yZWxlYXNlcyhuYW1lLCBUcnVlKQogICAgICAgIGZvciB2IGluIHZlcnNpb25zOgogICAgICAgICAgICB1cmxzID0gc2VsZi5jbGllbnQucmVsZWFzZV91cmxzKG5hbWUsIHYpCiAgICAgICAgICAgIGRhdGEgPSBzZWxmLmNsaWVudC5yZWxlYXNlX2RhdGEobmFtZSwgdikKICAgICAgICAgICAgbWV0YWRhdGEgPSBNZXRhZGF0YShzY2hlbWU9c2VsZi5zY2hlbWUpCiAgICAgICAgICAgIG1ldGFkYXRhLm5hbWUgPSBkYXRhWyduYW1lJ10KICAgICAgICAgICAgbWV0YWRhdGEudmVyc2lvbiA9IGRhdGFbJ3ZlcnNpb24nXQogICAgICAgICAgICBtZXRhZGF0YS5saWNlbnNlID0gZGF0YS5nZXQoJ2xpY2Vuc2UnKQogICAgICAgICAgICBtZXRhZGF0YS5rZXl3b3JkcyA9IGRhdGEuZ2V0KCdrZXl3b3JkcycsIFtdKQogICAgICAgICAgICBtZXRhZGF0YS5zdW1tYXJ5ID0gZGF0YS5nZXQoJ3N1bW1hcnknKQogICAgICAgICAgICBkaXN0ID0gRGlzdHJpYnV0aW9uKG1ldGFkYXRhKQogICAgICAgICAgICBpZiB1cmxzOgogICAgICAgICAgICAgICAgaW5mbyA9IHVybHNbMF0KICAgICAgICAgICAgICAgIG1ldGFkYXRhLnNvdXJjZV91cmwgPSBpbmZvWyd1cmwnXQogICAgICAgICAgICAgICAgZGlzdC5kaWdlc3QgPSBzZWxmLl9nZXRfZGlnZXN0KGluZm8pCiAgICAgICAgICAgICAgICBkaXN0LmxvY2F0b3IgPSBzZWxmCiAgICAgICAgICAgICAgICByZXN1bHRbdl0gPSBkaXN0CiAgICAgICAgICAgICAgICBmb3IgaW5mbyBpbiB1cmxzOgogICAgICAgICAgICAgICAgICAgIHVybCA9IGluZm9bJ3VybCddCiAgICAgICAgICAgICAgICAgICAgZGlnZXN0ID0gc2VsZi5fZ2V0X2RpZ2VzdChpbmZvKQogICAgICAgICAgICAgICAgICAgIHJlc3VsdFsndXJscyddLnNldGRlZmF1bHQodiwgc2V0KCkpLmFkZCh1cmwpCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0WydkaWdlc3RzJ11bdXJsXSA9IGRpZ2VzdAogICAgICAgIHJldHVybiByZXN1bHQKCmNsYXNzIFB5UElKU09OTG9jYXRvcihMb2NhdG9yKToKICAgICIiIgogICAgVGhpcyBsb2NhdG9yIHVzZXMgUHlQSSdzIEpTT04gaW50ZXJmYWNlLiBJdCdzIHZlcnkgbGltaXRlZCBpbiBmdW5jdGlvbmFsaXR5CiAgICBhbmQgcHJvYmFibHkgbm90IHdvcnRoIHVzaW5nLgogICAgIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgdXJsLCAqKmt3YXJncyk6CiAgICAgICAgc3VwZXIoUHlQSUpTT05Mb2NhdG9yLCBzZWxmKS5fX2luaXRfXygqKmt3YXJncykKICAgICAgICBzZWxmLmJhc2VfdXJsID0gZW5zdXJlX3NsYXNoKHVybCkKCiAgICBkZWYgZ2V0X2Rpc3RyaWJ1dGlvbl9uYW1lcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gYWxsIHRoZSBkaXN0cmlidXRpb24gbmFtZXMga25vd24gdG8gdGhpcyBsb2NhdG9yLgogICAgICAgICIiIgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoJ05vdCBhdmFpbGFibGUgZnJvbSB0aGlzIGxvY2F0b3InKQoKICAgIGRlZiBfZ2V0X3Byb2plY3Qoc2VsZiwgbmFtZSk6CiAgICAgICAgcmVzdWx0ID0geyd1cmxzJzoge30sICdkaWdlc3RzJzoge319CiAgICAgICAgdXJsID0gdXJsam9pbihzZWxmLmJhc2VfdXJsLCAnJXMvanNvbicgJSBxdW90ZShuYW1lKSkKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJlc3AgPSBzZWxmLm9wZW5lci5vcGVuKHVybCkKICAgICAgICAgICAgZGF0YSA9IHJlc3AucmVhZCgpLmRlY29kZSgpICMgZm9yIG5vdwogICAgICAgICAgICBkID0ganNvbi5sb2FkcyhkYXRhKQogICAgICAgICAgICBtZCA9IE1ldGFkYXRhKHNjaGVtZT1zZWxmLnNjaGVtZSkKICAgICAgICAgICAgZGF0YSA9IGRbJ2luZm8nXQogICAgICAgICAgICBtZC5uYW1lID0gZGF0YVsnbmFtZSddCiAgICAgICAgICAgIG1kLnZlcnNpb24gPSBkYXRhWyd2ZXJzaW9uJ10KICAgICAgICAgICAgbWQubGljZW5zZSA9IGRhdGEuZ2V0KCdsaWNlbnNlJykKICAgICAgICAgICAgbWQua2V5d29yZHMgPSBkYXRhLmdldCgna2V5d29yZHMnLCBbXSkKICAgICAgICAgICAgbWQuc3VtbWFyeSA9IGRhdGEuZ2V0KCdzdW1tYXJ5JykKICAgICAgICAgICAgZGlzdCA9IERpc3RyaWJ1dGlvbihtZCkKICAgICAgICAgICAgZGlzdC5sb2NhdG9yID0gc2VsZgogICAgICAgICAgICB1cmxzID0gZFsndXJscyddCiAgICAgICAgICAgIHJlc3VsdFttZC52ZXJzaW9uXSA9IGRpc3QKICAgICAgICAgICAgZm9yIGluZm8gaW4gZFsndXJscyddOgogICAgICAgICAgICAgICAgdXJsID0gaW5mb1sndXJsJ10KICAgICAgICAgICAgICAgIGRpc3QuZG93bmxvYWRfdXJscy5hZGQodXJsKQogICAgICAgICAgICAgICAgZGlzdC5kaWdlc3RzW3VybF0gPSBzZWxmLl9nZXRfZGlnZXN0KGluZm8pCiAgICAgICAgICAgICAgICByZXN1bHRbJ3VybHMnXS5zZXRkZWZhdWx0KG1kLnZlcnNpb24sIHNldCgpKS5hZGQodXJsKQogICAgICAgICAgICAgICAgcmVzdWx0WydkaWdlc3RzJ11bdXJsXSA9IHNlbGYuX2dldF9kaWdlc3QoaW5mbykKICAgICAgICAgICAgIyBOb3cgZ2V0IG90aGVyIHJlbGVhc2VzCiAgICAgICAgICAgIGZvciB2ZXJzaW9uLCBpbmZvcyBpbiBkWydyZWxlYXNlcyddLml0ZW1zKCk6CiAgICAgICAgICAgICAgICBpZiB2ZXJzaW9uID09IG1kLnZlcnNpb246CiAgICAgICAgICAgICAgICAgICAgY29udGludWUgICAgIyBhbHJlYWR5IGRvbmUKICAgICAgICAgICAgICAgIG9tZCA9IE1ldGFkYXRhKHNjaGVtZT1zZWxmLnNjaGVtZSkKICAgICAgICAgICAgICAgIG9tZC5uYW1lID0gbWQubmFtZQogICAgICAgICAgICAgICAgb21kLnZlcnNpb24gPSB2ZXJzaW9uCiAgICAgICAgICAgICAgICBvZGlzdCA9IERpc3RyaWJ1dGlvbihvbWQpCiAgICAgICAgICAgICAgICBvZGlzdC5sb2NhdG9yID0gc2VsZgogICAgICAgICAgICAgICAgcmVzdWx0W3ZlcnNpb25dID0gb2Rpc3QKICAgICAgICAgICAgICAgIGZvciBpbmZvIGluIGluZm9zOgogICAgICAgICAgICAgICAgICAgIHVybCA9IGluZm9bJ3VybCddCiAgICAgICAgICAgICAgICAgICAgb2Rpc3QuZG93bmxvYWRfdXJscy5hZGQodXJsKQogICAgICAgICAgICAgICAgICAgIG9kaXN0LmRpZ2VzdHNbdXJsXSA9IHNlbGYuX2dldF9kaWdlc3QoaW5mbykKICAgICAgICAgICAgICAgICAgICByZXN1bHRbJ3VybHMnXS5zZXRkZWZhdWx0KHZlcnNpb24sIHNldCgpKS5hZGQodXJsKQogICAgICAgICAgICAgICAgICAgIHJlc3VsdFsnZGlnZXN0cyddW3VybF0gPSBzZWxmLl9nZXRfZGlnZXN0KGluZm8pCiMgICAgICAgICAgICBmb3IgaW5mbyBpbiB1cmxzOgojICAgICAgICAgICAgICAgIG1kLnNvdXJjZV91cmwgPSBpbmZvWyd1cmwnXQojICAgICAgICAgICAgICAgIGRpc3QuZGlnZXN0ID0gc2VsZi5fZ2V0X2RpZ2VzdChpbmZvKQojICAgICAgICAgICAgICAgIGRpc3QubG9jYXRvciA9IHNlbGYKIyAgICAgICAgICAgICAgICBmb3IgaW5mbyBpbiB1cmxzOgojICAgICAgICAgICAgICAgICAgICB1cmwgPSBpbmZvWyd1cmwnXQojICAgICAgICAgICAgICAgICAgICByZXN1bHRbJ3VybHMnXS5zZXRkZWZhdWx0KG1kLnZlcnNpb24sIHNldCgpKS5hZGQodXJsKQojICAgICAgICAgICAgICAgICAgICByZXN1bHRbJ2RpZ2VzdHMnXVt1cmxdID0gc2VsZi5fZ2V0X2RpZ2VzdChpbmZvKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgc2VsZi5lcnJvcnMucHV0KHRleHRfdHlwZShlKSkKICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbignSlNPTiBmZXRjaCBmYWlsZWQ6ICVzJywgZSkKICAgICAgICByZXR1cm4gcmVzdWx0CgoKY2xhc3MgUGFnZShvYmplY3QpOgogICAgIiIiCiAgICBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBzY3JhcGVkIEhUTUwgcGFnZS4KICAgICIiIgogICAgIyBUaGUgZm9sbG93aW5nIHNsaWdodGx5IGhhaXJ5LWxvb2tpbmcgcmVnZXgganVzdCBsb29rcyBmb3IgdGhlIGNvbnRlbnRzIG9mCiAgICAjIGFuIGFuY2hvciBsaW5rLCB3aGljaCBoYXMgYW4gYXR0cmlidXRlICJocmVmIiBlaXRoZXIgaW1tZWRpYXRlbHkgcHJlY2VkZWQKICAgICMgb3IgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYSAicmVsIiBhdHRyaWJ1dGUuIFRoZSBhdHRyaWJ1dGUgdmFsdWVzIGNhbiBiZQogICAgIyBkZWNsYXJlZCB3aXRoIGRvdWJsZSBxdW90ZXMsIHNpbmdsZSBxdW90ZXMgb3Igbm8gcXVvdGVzIC0gd2hpY2ggbGVhZHMgdG8KICAgICMgdGhlIGxlbmd0aCBvZiB0aGUgZXhwcmVzc2lvbi4KICAgIF9ocmVmID0gcmUuY29tcGlsZSgiIiIKKHJlbFxzKj1ccyooPzoiKD9QPHJlbDE+W14iXSopInwnKD9QPHJlbDI+W14nXSopJ3woP1A8cmVsMz5bXj5cc1xuXSopKVxzKyk/CmhyZWZccyo9XHMqKD86Iig/UDx1cmwxPlteIl0qKSJ8Jyg/UDx1cmwyPlteJ10qKSd8KD9QPHVybDM+W14+XHNcbl0qKSkKKFxzK3JlbFxzKj1ccyooPzoiKD9QPHJlbDQ+W14iXSopInwnKD9QPHJlbDU+W14nXSopJ3woP1A8cmVsNj5bXj5cc1xuXSopKSk/CiIiIiwgcmUuSSB8IHJlLlMgfCByZS5YKQogICAgX2Jhc2UgPSByZS5jb21waWxlKHIiIiI8YmFzZVxzK2hyZWZccyo9XHMqWyciXT8oW14nIj5dKykiIiIsIHJlLkkgfCByZS5TKQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkYXRhLCB1cmwpOgogICAgICAgICIiIgogICAgICAgIEluaXRpYWxpc2UgYW4gaW5zdGFuY2Ugd2l0aCB0aGUgVW5pY29kZSBwYWdlIGNvbnRlbnRzIGFuZCB0aGUgVVJMIHRoZXkKICAgICAgICBjYW1lIGZyb20uCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5kYXRhID0gZGF0YQogICAgICAgIHNlbGYuYmFzZV91cmwgPSBzZWxmLnVybCA9IHVybAogICAgICAgIG0gPSBzZWxmLl9iYXNlLnNlYXJjaChzZWxmLmRhdGEpCiAgICAgICAgaWYgbToKICAgICAgICAgICAgc2VsZi5iYXNlX3VybCA9IG0uZ3JvdXAoMSkKCiAgICBfY2xlYW5fcmUgPSByZS5jb21waWxlKHInW15hLXowLTkkJissLzo7PT9ALiMlX1xcfC1dJywgcmUuSSkKCiAgICBAY2FjaGVkX3Byb3BlcnR5CiAgICBkZWYgbGlua3Moc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIHRoZSBVUkxzIG9mIGFsbCB0aGUgbGlua3Mgb24gYSBwYWdlIHRvZ2V0aGVyIHdpdGggaW5mb3JtYXRpb24KICAgICAgICBhYm91dCB0aGVpciAicmVsIiBhdHRyaWJ1dGUsIGZvciBkZXRlcm1pbmluZyB3aGljaCBvbmVzIHRvIHRyZWF0IGFzCiAgICAgICAgZG93bmxvYWRzIGFuZCB3aGljaCBvbmVzIHRvIHF1ZXVlIGZvciBmdXJ0aGVyIHNjcmFwaW5nLgogICAgICAgICIiIgogICAgICAgIGRlZiBjbGVhbih1cmwpOgogICAgICAgICAgICAiVGlkeSB1cCBhbiBVUkwuIgogICAgICAgICAgICBzY2hlbWUsIG5ldGxvYywgcGF0aCwgcGFyYW1zLCBxdWVyeSwgZnJhZyA9IHVybHBhcnNlKHVybCkKICAgICAgICAgICAgcmV0dXJuIHVybHVucGFyc2UoKHNjaGVtZSwgbmV0bG9jLCBxdW90ZShwYXRoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcywgcXVlcnksIGZyYWcpKQoKICAgICAgICByZXN1bHQgPSBzZXQoKQogICAgICAgIGZvciBtYXRjaCBpbiBzZWxmLl9ocmVmLmZpbmRpdGVyKHNlbGYuZGF0YSk6CiAgICAgICAgICAgIGQgPSBtYXRjaC5ncm91cGRpY3QoJycpCiAgICAgICAgICAgIHJlbCA9IChkWydyZWwxJ10gb3IgZFsncmVsMiddIG9yIGRbJ3JlbDMnXSBvcgogICAgICAgICAgICAgICAgICAgZFsncmVsNCddIG9yIGRbJ3JlbDUnXSBvciBkWydyZWw2J10pCiAgICAgICAgICAgIHVybCA9IGRbJ3VybDEnXSBvciBkWyd1cmwyJ10gb3IgZFsndXJsMyddCiAgICAgICAgICAgIHVybCA9IHVybGpvaW4oc2VsZi5iYXNlX3VybCwgdXJsKQogICAgICAgICAgICB1cmwgPSB1bmVzY2FwZSh1cmwpCiAgICAgICAgICAgIHVybCA9IHNlbGYuX2NsZWFuX3JlLnN1YihsYW1iZGEgbTogJyUlJTJ4JyAlIG9yZChtLmdyb3VwKDApKSwgdXJsKQogICAgICAgICAgICByZXN1bHQuYWRkKCh1cmwsIHJlbCkpCiAgICAgICAgIyBXZSBzb3J0IHRoZSByZXN1bHQsIGhvcGluZyB0byBicmluZyB0aGUgbW9zdCByZWNlbnQgdmVyc2lvbnMKICAgICAgICAjIHRvIHRoZSBmcm9udAogICAgICAgIHJlc3VsdCA9IHNvcnRlZChyZXN1bHQsIGtleT1sYW1iZGEgdDogdFswXSwgcmV2ZXJzZT1UcnVlKQogICAgICAgIHJldHVybiByZXN1bHQKCgpjbGFzcyBTaW1wbGVTY3JhcGluZ0xvY2F0b3IoTG9jYXRvcik6CiAgICAiIiIKICAgIEEgbG9jYXRvciB3aGljaCBzY3JhcGVzIEhUTUwgcGFnZXMgdG8gbG9jYXRlIGRvd25sb2FkcyBmb3IgYSBkaXN0cmlidXRpb24uCiAgICBUaGlzIHJ1bnMgbXVsdGlwbGUgdGhyZWFkcyB0byBkbyB0aGUgSS9POyBwZXJmb3JtYW5jZSBpcyBhdCBsZWFzdCBhcyBnb29kCiAgICBhcyBwaXAncyBQYWNrYWdlRmluZGVyLCB3aGljaCB3b3JrcyBpbiBhbiBhbmFsb2dvdXMgZmFzaGlvbi4KICAgICIiIgoKICAgICMgVGhlc2UgYXJlIHVzZWQgdG8gZGVhbCB3aXRoIHZhcmlvdXMgQ29udGVudC1FbmNvZGluZyBzY2hlbWVzLgogICAgZGVjb2RlcnMgPSB7CiAgICAgICAgJ2RlZmxhdGUnOiB6bGliLmRlY29tcHJlc3MsCiAgICAgICAgJ2d6aXAnOiBsYW1iZGEgYjogZ3ppcC5HemlwRmlsZShmaWxlb2JqPUJ5dGVzSU8oZCkpLnJlYWQoKSwKICAgICAgICAnbm9uZSc6IGxhbWJkYSBiOiBiLAogICAgfQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB1cmwsIHRpbWVvdXQ9Tm9uZSwgbnVtX3dvcmtlcnM9MTAsICoqa3dhcmdzKToKICAgICAgICAiIiIKICAgICAgICBJbml0aWFsaXNlIGFuIGluc3RhbmNlLgogICAgICAgIDpwYXJhbSB1cmw6IFRoZSByb290IFVSTCB0byB1c2UgZm9yIHNjcmFwaW5nLgogICAgICAgIDpwYXJhbSB0aW1lb3V0OiBUaGUgdGltZW91dCwgaW4gc2Vjb25kcywgdG8gYmUgYXBwbGllZCB0byByZXF1ZXN0cy4KICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBkZWZhdWx0cyB0byBgYE5vbmVgYCAobm8gdGltZW91dCBzcGVjaWZpZWQpLgogICAgICAgIDpwYXJhbSBudW1fd29ya2VyczogVGhlIG51bWJlciBvZiB3b3JrZXIgdGhyZWFkcyB5b3Ugd2FudCB0byBkbyBJL08sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGRlZmF1bHRzIHRvIDEwLgogICAgICAgIDpwYXJhbSBrd2FyZ3M6IFBhc3NlZCB0byB0aGUgc3VwZXJjbGFzcy4KICAgICAgICAiIiIKICAgICAgICBzdXBlcihTaW1wbGVTY3JhcGluZ0xvY2F0b3IsIHNlbGYpLl9faW5pdF9fKCoqa3dhcmdzKQogICAgICAgIHNlbGYuYmFzZV91cmwgPSBlbnN1cmVfc2xhc2godXJsKQogICAgICAgIHNlbGYudGltZW91dCA9IHRpbWVvdXQKICAgICAgICBzZWxmLl9wYWdlX2NhY2hlID0ge30KICAgICAgICBzZWxmLl9zZWVuID0gc2V0KCkKICAgICAgICBzZWxmLl90b19mZXRjaCA9IHF1ZXVlLlF1ZXVlKCkKICAgICAgICBzZWxmLl9iYWRfaG9zdHMgPSBzZXQoKQogICAgICAgIHNlbGYuc2tpcF9leHRlcm5hbHMgPSBGYWxzZQogICAgICAgIHNlbGYubnVtX3dvcmtlcnMgPSBudW1fd29ya2VycwogICAgICAgIHNlbGYuX2xvY2sgPSB0aHJlYWRpbmcuUkxvY2soKQogICAgICAgICMgU2VlIGlzc3VlICM0NTogd2UgbmVlZCB0byBiZSByZXNpbGllbnQgd2hlbiB0aGUgbG9jYXRvciBpcyB1c2VkCiAgICAgICAgIyBpbiBhIHRocmVhZCwgZS5nLiB3aXRoIGNvbmN1cnJlbnQuZnV0dXJlcy4gV2UgY2FuJ3QgdXNlIHNlbGYuX2xvY2sKICAgICAgICAjIGFzIGl0IGlzIGZvciBjb29yZGluYXRpbmcgb3VyIGludGVybmFsIHRocmVhZHMgLSB0aGUgb25lcyBjcmVhdGVkCiAgICAgICAgIyBpbiBfcHJlcGFyZV90aHJlYWRzLgogICAgICAgIHNlbGYuX2dwbG9jayA9IHRocmVhZGluZy5STG9jaygpCgogICAgZGVmIF9wcmVwYXJlX3RocmVhZHMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgVGhyZWFkcyBhcmUgY3JlYXRlZCBvbmx5IHdoZW4gZ2V0X3Byb2plY3QgaXMgY2FsbGVkLCBhbmQgdGVybWluYXRlCiAgICAgICAgYmVmb3JlIGl0IHJldHVybnMuIFRoZXkgYXJlIHRoZXJlIHByaW1hcmlseSB0byBwYXJhbGxlbGlzZSBJL08gKGkuZS4KICAgICAgICBmZXRjaGluZyB3ZWIgcGFnZXMpLgogICAgICAgICIiIgogICAgICAgIHNlbGYuX3RocmVhZHMgPSBbXQogICAgICAgIGZvciBpIGluIHJhbmdlKHNlbGYubnVtX3dvcmtlcnMpOgogICAgICAgICAgICB0ID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9c2VsZi5fZmV0Y2gpCiAgICAgICAgICAgIHQuc2V0RGFlbW9uKFRydWUpCiAgICAgICAgICAgIHQuc3RhcnQoKQogICAgICAgICAgICBzZWxmLl90aHJlYWRzLmFwcGVuZCh0KQoKICAgIGRlZiBfd2FpdF90aHJlYWRzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFRlbGwgYWxsIHRoZSB0aHJlYWRzIHRvIHRlcm1pbmF0ZSAoYnkgc2VuZGluZyBhIHNlbnRpbmVsIHZhbHVlKSBhbmQKICAgICAgICB3YWl0IGZvciB0aGVtIHRvIGRvIHNvLgogICAgICAgICIiIgogICAgICAgICMgTm90ZSB0aGF0IHlvdSBuZWVkIHR3byBsb29wcywgc2luY2UgeW91IGNhbid0IHNheSB3aGljaAogICAgICAgICMgdGhyZWFkIHdpbGwgZ2V0IGVhY2ggc2VudGluZWwKICAgICAgICBmb3IgdCBpbiBzZWxmLl90aHJlYWRzOgogICAgICAgICAgICBzZWxmLl90b19mZXRjaC5wdXQoTm9uZSkgICAgIyBzZW50aW5lbAogICAgICAgIGZvciB0IGluIHNlbGYuX3RocmVhZHM6CiAgICAgICAgICAgIHQuam9pbigpCiAgICAgICAgc2VsZi5fdGhyZWFkcyA9IFtdCgogICAgZGVmIF9nZXRfcHJvamVjdChzZWxmLCBuYW1lKToKICAgICAgICByZXN1bHQgPSB7J3VybHMnOiB7fSwgJ2RpZ2VzdHMnOiB7fX0KICAgICAgICB3aXRoIHNlbGYuX2dwbG9jazoKICAgICAgICAgICAgc2VsZi5yZXN1bHQgPSByZXN1bHQKICAgICAgICAgICAgc2VsZi5wcm9qZWN0X25hbWUgPSBuYW1lCiAgICAgICAgICAgIHVybCA9IHVybGpvaW4oc2VsZi5iYXNlX3VybCwgJyVzLycgJSBxdW90ZShuYW1lKSkKICAgICAgICAgICAgc2VsZi5fc2Vlbi5jbGVhcigpCiAgICAgICAgICAgIHNlbGYuX3BhZ2VfY2FjaGUuY2xlYXIoKQogICAgICAgICAgICBzZWxmLl9wcmVwYXJlX3RocmVhZHMoKQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1F1ZXVlaW5nICVzJywgdXJsKQogICAgICAgICAgICAgICAgc2VsZi5fdG9fZmV0Y2gucHV0KHVybCkKICAgICAgICAgICAgICAgIHNlbGYuX3RvX2ZldGNoLmpvaW4oKQogICAgICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgICAgc2VsZi5fd2FpdF90aHJlYWRzKCkKICAgICAgICAgICAgZGVsIHNlbGYucmVzdWx0CiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIHBsYXRmb3JtX2RlcGVuZGVudCA9IHJlLmNvbXBpbGUocidcYihsaW51eC0oaVxkODZ8eDg2XzY0fGFybVx3Kyl8JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByJ3dpbigzMnwtYW1kNjQpfG1hY29zeC0/XGQrKVxiJywgcmUuSSkKCiAgICBkZWYgX2lzX3BsYXRmb3JtX2RlcGVuZGVudChzZWxmLCB1cmwpOgogICAgICAgICIiIgogICAgICAgIERvZXMgYW4gVVJMIHJlZmVyIHRvIGEgcGxhdGZvcm0tc3BlY2lmaWMgZG93bmxvYWQ/CiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYucGxhdGZvcm1fZGVwZW5kZW50LnNlYXJjaCh1cmwpCgogICAgZGVmIF9wcm9jZXNzX2Rvd25sb2FkKHNlbGYsIHVybCk6CiAgICAgICAgIiIiCiAgICAgICAgU2VlIGlmIGFuIFVSTCBpcyBhIHN1aXRhYmxlIGRvd25sb2FkIGZvciBhIHByb2plY3QuCgogICAgICAgIElmIGl0IGlzLCByZWdpc3RlciBpbmZvcm1hdGlvbiBpbiB0aGUgcmVzdWx0IGRpY3Rpb25hcnkgKGZvcgogICAgICAgIF9nZXRfcHJvamVjdCkgYWJvdXQgdGhlIHNwZWNpZmljIHZlcnNpb24gaXQncyBmb3IuCgogICAgICAgIE5vdGUgdGhhdCB0aGUgcmV0dXJuIHZhbHVlIGlzbid0IGFjdHVhbGx5IHVzZWQgb3RoZXIgdGhhbiBhcyBhIGJvb2xlYW4KICAgICAgICB2YWx1ZS4KICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLl9pc19wbGF0Zm9ybV9kZXBlbmRlbnQodXJsKToKICAgICAgICAgICAgaW5mbyA9IE5vbmUKICAgICAgICBlbHNlOgogICAgICAgICAgICBpbmZvID0gc2VsZi5jb252ZXJ0X3VybF90b19kb3dubG9hZF9pbmZvKHVybCwgc2VsZi5wcm9qZWN0X25hbWUpCiAgICAgICAgbG9nZ2VyLmRlYnVnKCdwcm9jZXNzX2Rvd25sb2FkOiAlcyAtPiAlcycsIHVybCwgaW5mbykKICAgICAgICBpZiBpbmZvOgogICAgICAgICAgICB3aXRoIHNlbGYuX2xvY2s6ICAgICMgbmVlZGVkIGJlY2F1c2Ugc2VsZi5yZXN1bHQgaXMgc2hhcmVkCiAgICAgICAgICAgICAgICBzZWxmLl91cGRhdGVfdmVyc2lvbl9kYXRhKHNlbGYucmVzdWx0LCBpbmZvKQogICAgICAgIHJldHVybiBpbmZvCgogICAgZGVmIF9zaG91bGRfcXVldWUoc2VsZiwgbGluaywgcmVmZXJyZXIsIHJlbCk6CiAgICAgICAgIiIiCiAgICAgICAgRGV0ZXJtaW5lIHdoZXRoZXIgYSBsaW5rIFVSTCBmcm9tIGEgcmVmZXJyaW5nIHBhZ2UgYW5kIHdpdGggYQogICAgICAgIHBhcnRpY3VsYXIgInJlbCIgYXR0cmlidXRlIHNob3VsZCBiZSBxdWV1ZWQgZm9yIHNjcmFwaW5nLgogICAgICAgICIiIgogICAgICAgIHNjaGVtZSwgbmV0bG9jLCBwYXRoLCBfLCBfLCBfID0gdXJscGFyc2UobGluaykKICAgICAgICBpZiBwYXRoLmVuZHN3aXRoKHNlbGYuc291cmNlX2V4dGVuc2lvbnMgKyBzZWxmLmJpbmFyeV9leHRlbnNpb25zICsKICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXhjbHVkZWRfZXh0ZW5zaW9ucyk6CiAgICAgICAgICAgIHJlc3VsdCA9IEZhbHNlCiAgICAgICAgZWxpZiBzZWxmLnNraXBfZXh0ZXJuYWxzIGFuZCBub3QgbGluay5zdGFydHN3aXRoKHNlbGYuYmFzZV91cmwpOgogICAgICAgICAgICByZXN1bHQgPSBGYWxzZQogICAgICAgIGVsaWYgbm90IHJlZmVycmVyLnN0YXJ0c3dpdGgoc2VsZi5iYXNlX3VybCk6CiAgICAgICAgICAgIHJlc3VsdCA9IEZhbHNlCiAgICAgICAgZWxpZiByZWwgbm90IGluICgnaG9tZXBhZ2UnLCAnZG93bmxvYWQnKToKICAgICAgICAgICAgcmVzdWx0ID0gRmFsc2UKICAgICAgICBlbGlmIHNjaGVtZSBub3QgaW4gKCdodHRwJywgJ2h0dHBzJywgJ2Z0cCcpOgogICAgICAgICAgICByZXN1bHQgPSBGYWxzZQogICAgICAgIGVsaWYgc2VsZi5faXNfcGxhdGZvcm1fZGVwZW5kZW50KGxpbmspOgogICAgICAgICAgICByZXN1bHQgPSBGYWxzZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGhvc3QgPSBuZXRsb2Muc3BsaXQoJzonLCAxKVswXQogICAgICAgICAgICBpZiBob3N0Lmxvd2VyKCkgPT0gJ2xvY2FsaG9zdCc6CiAgICAgICAgICAgICAgICByZXN1bHQgPSBGYWxzZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmVzdWx0ID0gVHJ1ZQogICAgICAgIGxvZ2dlci5kZWJ1Zygnc2hvdWxkX3F1ZXVlOiAlcyAoJXMpIGZyb20gJXMgLT4gJXMnLCBsaW5rLCByZWwsCiAgICAgICAgICAgICAgICAgICAgIHJlZmVycmVyLCByZXN1bHQpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBfZmV0Y2goc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgR2V0IGEgVVJMIHRvIGZldGNoIGZyb20gdGhlIHdvcmsgcXVldWUsIGdldCB0aGUgSFRNTCBwYWdlLCBleGFtaW5lIGl0cwogICAgICAgIGxpbmtzIGZvciBkb3dubG9hZCBjYW5kaWRhdGVzIGFuZCBjYW5kaWRhdGVzIGZvciBmdXJ0aGVyIHNjcmFwaW5nLgoKICAgICAgICBUaGlzIGlzIGEgaGFuZHkgbWV0aG9kIHRvIHJ1biBpbiBhIHRocmVhZC4KICAgICAgICAiIiIKICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICB1cmwgPSBzZWxmLl90b19mZXRjaC5nZXQoKQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBpZiB1cmw6CiAgICAgICAgICAgICAgICAgICAgcGFnZSA9IHNlbGYuZ2V0X3BhZ2UodXJsKQogICAgICAgICAgICAgICAgICAgIGlmIHBhZ2UgaXMgTm9uZTogICAgIyBlLmcuIGFmdGVyIGFuIGVycm9yCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgICAgZm9yIGxpbmssIHJlbCBpbiBwYWdlLmxpbmtzOgogICAgICAgICAgICAgICAgICAgICAgICBpZiBsaW5rIG5vdCBpbiBzZWxmLl9zZWVuOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fc2Vlbi5hZGQobGluaykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub3Qgc2VsZi5fcHJvY2Vzc19kb3dubG9hZChsaW5rKSBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9zaG91bGRfcXVldWUobGluaywgdXJsLCByZWwpKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1F1ZXVlaW5nICVzIGZyb20gJXMnLCBsaW5rLCB1cmwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fdG9fZmV0Y2gucHV0KGxpbmspCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZTogICMgcHJhZ21hOiBubyBjb3ZlcgogICAgICAgICAgICAgICAgc2VsZi5lcnJvcnMucHV0KHRleHRfdHlwZShlKSkKICAgICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgICAgICMgYWx3YXlzIGRvIHRoaXMsIHRvIGF2b2lkIGhhbmdzIDotKQogICAgICAgICAgICAgICAgc2VsZi5fdG9fZmV0Y2gudGFza19kb25lKCkKICAgICAgICAgICAgaWYgbm90IHVybDoKICAgICAgICAgICAgICAgICNsb2dnZXIuZGVidWcoJ1NlbnRpbmVsIHNlZW4sIHF1aXR0aW5nLicpCiAgICAgICAgICAgICAgICBicmVhawoKICAgIGRlZiBnZXRfcGFnZShzZWxmLCB1cmwpOgogICAgICAgICIiIgogICAgICAgIEdldCB0aGUgSFRNTCBmb3IgYW4gVVJMLCBwb3NzaWJseSBmcm9tIGFuIGluLW1lbW9yeSBjYWNoZS4KCiAgICAgICAgWFhYIFRPRE8gTm90ZTogdGhpcyBjYWNoZSBpcyBuZXZlciBhY3R1YWxseSBjbGVhcmVkLiBJdCdzIGFzc3VtZWQgdGhhdAogICAgICAgIHRoZSBkYXRhIHdvbid0IGdldCBzdGFsZSBvdmVyIHRoZSBsaWZldGltZSBvZiBhIGxvY2F0b3IgaW5zdGFuY2UgKG5vdAogICAgICAgIG5lY2Vzc2FyaWx5IHRydWUgZm9yIHRoZSBkZWZhdWx0X2xvY2F0b3IpLgogICAgICAgICIiIgogICAgICAgICMgaHR0cDovL3BlYWsudGVsZWNvbW11bml0eS5jb20vRGV2Q2VudGVyL0Vhc3lJbnN0YWxsI3BhY2thZ2UtaW5kZXgtYXBpCiAgICAgICAgc2NoZW1lLCBuZXRsb2MsIHBhdGgsIF8sIF8sIF8gPSB1cmxwYXJzZSh1cmwpCiAgICAgICAgaWYgc2NoZW1lID09ICdmaWxlJyBhbmQgb3MucGF0aC5pc2Rpcih1cmwycGF0aG5hbWUocGF0aCkpOgogICAgICAgICAgICB1cmwgPSB1cmxqb2luKGVuc3VyZV9zbGFzaCh1cmwpLCAnaW5kZXguaHRtbCcpCgogICAgICAgIGlmIHVybCBpbiBzZWxmLl9wYWdlX2NhY2hlOgogICAgICAgICAgICByZXN1bHQgPSBzZWxmLl9wYWdlX2NhY2hlW3VybF0KICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdSZXR1cm5pbmcgJXMgZnJvbSBjYWNoZTogJXMnLCB1cmwsIHJlc3VsdCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBob3N0ID0gbmV0bG9jLnNwbGl0KCc6JywgMSlbMF0KICAgICAgICAgICAgcmVzdWx0ID0gTm9uZQogICAgICAgICAgICBpZiBob3N0IGluIHNlbGYuX2JhZF9ob3N0czoKICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnU2tpcHBpbmcgJXMgZHVlIHRvIGJhZCBob3N0ICVzJywgdXJsLCBob3N0KQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmVxID0gUmVxdWVzdCh1cmwsIGhlYWRlcnM9eydBY2NlcHQtZW5jb2RpbmcnOiAnaWRlbnRpdHknfSkKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0ZldGNoaW5nICVzJywgdXJsKQogICAgICAgICAgICAgICAgICAgIHJlc3AgPSBzZWxmLm9wZW5lci5vcGVuKHJlcSwgdGltZW91dD1zZWxmLnRpbWVvdXQpCiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdGZXRjaGVkICVzJywgdXJsKQogICAgICAgICAgICAgICAgICAgIGhlYWRlcnMgPSByZXNwLmluZm8oKQogICAgICAgICAgICAgICAgICAgIGNvbnRlbnRfdHlwZSA9IGhlYWRlcnMuZ2V0KCdDb250ZW50LVR5cGUnLCAnJykKICAgICAgICAgICAgICAgICAgICBpZiBIVE1MX0NPTlRFTlRfVFlQRS5tYXRjaChjb250ZW50X3R5cGUpOgogICAgICAgICAgICAgICAgICAgICAgICBmaW5hbF91cmwgPSByZXNwLmdldHVybCgpCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSByZXNwLnJlYWQoKQogICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZyA9IGhlYWRlcnMuZ2V0KCdDb250ZW50LUVuY29kaW5nJykKICAgICAgICAgICAgICAgICAgICAgICAgaWYgZW5jb2Rpbmc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyID0gc2VsZi5kZWNvZGVyc1tlbmNvZGluZ10gICAjIGZhaWwgaWYgbm90IGZvdW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGVjb2RlcihkYXRhKQogICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZyA9ICd1dGYtOCcKICAgICAgICAgICAgICAgICAgICAgICAgbSA9IENIQVJTRVQuc2VhcmNoKGNvbnRlbnRfdHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgaWYgbToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nID0gbS5ncm91cCgxKQogICAgICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YS5kZWNvZGUoZW5jb2RpbmcpCiAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBVbmljb2RlRXJyb3I6ICAjIHByYWdtYTogbm8gY292ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLmRlY29kZSgnbGF0aW4tMScpICAgICMgZmFsbGJhY2sKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gUGFnZShkYXRhLCBmaW5hbF91cmwpCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3BhZ2VfY2FjaGVbZmluYWxfdXJsXSA9IHJlc3VsdAogICAgICAgICAgICAgICAgZXhjZXB0IEhUVFBFcnJvciBhcyBlOgogICAgICAgICAgICAgICAgICAgIGlmIGUuY29kZSAhPSA0MDQ6CiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24oJ0ZldGNoIGZhaWxlZDogJXM6ICVzJywgdXJsLCBlKQogICAgICAgICAgICAgICAgZXhjZXB0IFVSTEVycm9yIGFzIGU6ICAjIHByYWdtYTogbm8gY292ZXIKICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKCdGZXRjaCBmYWlsZWQ6ICVzOiAlcycsIHVybCwgZSkKICAgICAgICAgICAgICAgICAgICB3aXRoIHNlbGYuX2xvY2s6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2JhZF9ob3N0cy5hZGQoaG9zdCkKICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZTogICMgcHJhZ21hOiBubyBjb3ZlcgogICAgICAgICAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24oJ0ZldGNoIGZhaWxlZDogJXM6ICVzJywgdXJsLCBlKQogICAgICAgICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgICAgICAgICBzZWxmLl9wYWdlX2NhY2hlW3VybF0gPSByZXN1bHQgICAjIGV2ZW4gaWYgTm9uZSAoZmFpbHVyZSkKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgX2Rpc3RuYW1lX3JlID0gcmUuY29tcGlsZSgnPGEgaHJlZj1bXj5dKj4oW148XSspPCcpCgogICAgZGVmIGdldF9kaXN0cmlidXRpb25fbmFtZXMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIGFsbCB0aGUgZGlzdHJpYnV0aW9uIG5hbWVzIGtub3duIHRvIHRoaXMgbG9jYXRvci4KICAgICAgICAiIiIKICAgICAgICByZXN1bHQgPSBzZXQoKQogICAgICAgIHBhZ2UgPSBzZWxmLmdldF9wYWdlKHNlbGYuYmFzZV91cmwpCiAgICAgICAgaWYgbm90IHBhZ2U6CiAgICAgICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oJ1VuYWJsZSB0byBnZXQgJXMnICUgc2VsZi5iYXNlX3VybCkKICAgICAgICBmb3IgbWF0Y2ggaW4gc2VsZi5fZGlzdG5hbWVfcmUuZmluZGl0ZXIocGFnZS5kYXRhKToKICAgICAgICAgICAgcmVzdWx0LmFkZChtYXRjaC5ncm91cCgxKSkKICAgICAgICByZXR1cm4gcmVzdWx0CgpjbGFzcyBEaXJlY3RvcnlMb2NhdG9yKExvY2F0b3IpOgogICAgIiIiCiAgICBUaGlzIGNsYXNzIGxvY2F0ZXMgZGlzdHJpYnV0aW9ucyBpbiBhIGRpcmVjdG9yeSB0cmVlLgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdGgsICoqa3dhcmdzKToKICAgICAgICAiIiIKICAgICAgICBJbml0aWFsaXNlIGFuIGluc3RhbmNlLgogICAgICAgIDpwYXJhbSBwYXRoOiBUaGUgcm9vdCBvZiB0aGUgZGlyZWN0b3J5IHRyZWUgdG8gc2VhcmNoLgogICAgICAgIDpwYXJhbSBrd2FyZ3M6IFBhc3NlZCB0byB0aGUgc3VwZXJjbGFzcyBjb25zdHJ1Y3RvciwKICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgZm9yOgogICAgICAgICAgICAgICAgICAgICAgICogcmVjdXJzaXZlIC0gaWYgVHJ1ZSAodGhlIGRlZmF1bHQpLCBzdWJkaXJlY3RvcmllcyBhcmUKICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3Vyc2VkIGludG8uIElmIEZhbHNlLCBvbmx5IHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5CiAgICAgICAgICAgICAgICAgICAgICAgICBpcyBzZWFyY2hlZCwKICAgICAgICAiIiIKICAgICAgICBzZWxmLnJlY3Vyc2l2ZSA9IGt3YXJncy5wb3AoJ3JlY3Vyc2l2ZScsIFRydWUpCiAgICAgICAgc3VwZXIoRGlyZWN0b3J5TG9jYXRvciwgc2VsZikuX19pbml0X18oKiprd2FyZ3MpCiAgICAgICAgcGF0aCA9IG9zLnBhdGguYWJzcGF0aChwYXRoKQogICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKHBhdGgpOiAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICAgICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oJ05vdCBhIGRpcmVjdG9yeTogJXInICUgcGF0aCkKICAgICAgICBzZWxmLmJhc2VfZGlyID0gcGF0aAoKICAgIGRlZiBzaG91bGRfaW5jbHVkZShzZWxmLCBmaWxlbmFtZSwgcGFyZW50KToKICAgICAgICAiIiIKICAgICAgICBTaG91bGQgYSBmaWxlbmFtZSBiZSBjb25zaWRlcmVkIGFzIGEgY2FuZGlkYXRlIGZvciBhIGRpc3RyaWJ1dGlvbgogICAgICAgIGFyY2hpdmU/IEFzIHdlbGwgYXMgdGhlIGZpbGVuYW1lLCB0aGUgZGlyZWN0b3J5IHdoaWNoIGNvbnRhaW5zIGl0CiAgICAgICAgaXMgcHJvdmlkZWQsIHRob3VnaCBub3QgdXNlZCBieSB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbi4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gZmlsZW5hbWUuZW5kc3dpdGgoc2VsZi5kb3dubG9hZGFibGVfZXh0ZW5zaW9ucykKCiAgICBkZWYgX2dldF9wcm9qZWN0KHNlbGYsIG5hbWUpOgogICAgICAgIHJlc3VsdCA9IHsndXJscyc6IHt9LCAnZGlnZXN0cyc6IHt9fQogICAgICAgIGZvciByb290LCBkaXJzLCBmaWxlcyBpbiBvcy53YWxrKHNlbGYuYmFzZV9kaXIpOgogICAgICAgICAgICBmb3IgZm4gaW4gZmlsZXM6CiAgICAgICAgICAgICAgICBpZiBzZWxmLnNob3VsZF9pbmNsdWRlKGZuLCByb290KToKICAgICAgICAgICAgICAgICAgICBmbiA9IG9zLnBhdGguam9pbihyb290LCBmbikKICAgICAgICAgICAgICAgICAgICB1cmwgPSB1cmx1bnBhcnNlKCgnZmlsZScsICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhuYW1lMnVybChvcy5wYXRoLmFic3BhdGgoZm4pKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJywgJycsICcnKSkKICAgICAgICAgICAgICAgICAgICBpbmZvID0gc2VsZi5jb252ZXJ0X3VybF90b19kb3dubG9hZF9pbmZvKHVybCwgbmFtZSkKICAgICAgICAgICAgICAgICAgICBpZiBpbmZvOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl91cGRhdGVfdmVyc2lvbl9kYXRhKHJlc3VsdCwgaW5mbykKICAgICAgICAgICAgaWYgbm90IHNlbGYucmVjdXJzaXZlOgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIGdldF9kaXN0cmlidXRpb25fbmFtZXMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIGFsbCB0aGUgZGlzdHJpYnV0aW9uIG5hbWVzIGtub3duIHRvIHRoaXMgbG9jYXRvci4KICAgICAgICAiIiIKICAgICAgICByZXN1bHQgPSBzZXQoKQogICAgICAgIGZvciByb290LCBkaXJzLCBmaWxlcyBpbiBvcy53YWxrKHNlbGYuYmFzZV9kaXIpOgogICAgICAgICAgICBmb3IgZm4gaW4gZmlsZXM6CiAgICAgICAgICAgICAgICBpZiBzZWxmLnNob3VsZF9pbmNsdWRlKGZuLCByb290KToKICAgICAgICAgICAgICAgICAgICBmbiA9IG9zLnBhdGguam9pbihyb290LCBmbikKICAgICAgICAgICAgICAgICAgICB1cmwgPSB1cmx1bnBhcnNlKCgnZmlsZScsICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhuYW1lMnVybChvcy5wYXRoLmFic3BhdGgoZm4pKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJywgJycsICcnKSkKICAgICAgICAgICAgICAgICAgICBpbmZvID0gc2VsZi5jb252ZXJ0X3VybF90b19kb3dubG9hZF9pbmZvKHVybCwgTm9uZSkKICAgICAgICAgICAgICAgICAgICBpZiBpbmZvOgogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkKGluZm9bJ25hbWUnXSkKICAgICAgICAgICAgaWYgbm90IHNlbGYucmVjdXJzaXZlOgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICByZXR1cm4gcmVzdWx0CgpjbGFzcyBKU09OTG9jYXRvcihMb2NhdG9yKToKICAgICIiIgogICAgVGhpcyBsb2NhdG9yIHVzZXMgc3BlY2lhbCBleHRlbmRlZCBtZXRhZGF0YSAobm90IGF2YWlsYWJsZSBvbiBQeVBJKSBhbmQgaXMKICAgIHRoZSBiYXNpcyBvZiBwZXJmb3JtYW50IGRlcGVuZGVuY3kgcmVzb2x1dGlvbiBpbiBkaXN0bGliLiBPdGhlciBsb2NhdG9ycwogICAgcmVxdWlyZSBhcmNoaXZlIGRvd25sb2FkcyBiZWZvcmUgZGVwZW5kZW5jaWVzIGNhbiBiZSBkZXRlcm1pbmVkISBBcyB5b3UKICAgIG1pZ2h0IGltYWdpbmUsIHRoYXQgY2FuIGJlIHNsb3cuCiAgICAiIiIKICAgIGRlZiBnZXRfZGlzdHJpYnV0aW9uX25hbWVzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBhbGwgdGhlIGRpc3RyaWJ1dGlvbiBuYW1lcyBrbm93biB0byB0aGlzIGxvY2F0b3IuCiAgICAgICAgIiIiCiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcignTm90IGF2YWlsYWJsZSBmcm9tIHRoaXMgbG9jYXRvcicpCgogICAgZGVmIF9nZXRfcHJvamVjdChzZWxmLCBuYW1lKToKICAgICAgICByZXN1bHQgPSB7J3VybHMnOiB7fSwgJ2RpZ2VzdHMnOiB7fX0KICAgICAgICBkYXRhID0gZ2V0X3Byb2plY3RfZGF0YShuYW1lKQogICAgICAgIGlmIGRhdGE6CiAgICAgICAgICAgIGZvciBpbmZvIGluIGRhdGEuZ2V0KCdmaWxlcycsIFtdKToKICAgICAgICAgICAgICAgIGlmIGluZm9bJ3B0eXBlJ10gIT0gJ3NkaXN0JyBvciBpbmZvWydweXZlcnNpb24nXSAhPSAnc291cmNlJzoKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgIyBXZSBkb24ndCBzdG9yZSBzdW1tYXJ5IGluIHByb2plY3QgbWV0YWRhdGEgYXMgaXQgbWFrZXMKICAgICAgICAgICAgICAgICMgdGhlIGRhdGEgYmlnZ2VyIGZvciBubyBiZW5lZml0IGR1cmluZyBkZXBlbmRlbmN5CiAgICAgICAgICAgICAgICAjIHJlc29sdXRpb24KICAgICAgICAgICAgICAgIGRpc3QgPSBtYWtlX2Rpc3QoZGF0YVsnbmFtZSddLCBpbmZvWyd2ZXJzaW9uJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnk9ZGF0YS5nZXQoJ3N1bW1hcnknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQbGFjZWhvbGRlciBmb3Igc3VtbWFyeScpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWU9c2VsZi5zY2hlbWUpCiAgICAgICAgICAgICAgICBtZCA9IGRpc3QubWV0YWRhdGEKICAgICAgICAgICAgICAgIG1kLnNvdXJjZV91cmwgPSBpbmZvWyd1cmwnXQogICAgICAgICAgICAgICAgIyBUT0RPIFNIQTI1NiBkaWdlc3QKICAgICAgICAgICAgICAgIGlmICdkaWdlc3QnIGluIGluZm8gYW5kIGluZm9bJ2RpZ2VzdCddOgogICAgICAgICAgICAgICAgICAgIGRpc3QuZGlnZXN0ID0gKCdtZDUnLCBpbmZvWydkaWdlc3QnXSkKICAgICAgICAgICAgICAgIG1kLmRlcGVuZGVuY2llcyA9IGluZm8uZ2V0KCdyZXF1aXJlbWVudHMnLCB7fSkKICAgICAgICAgICAgICAgIGRpc3QuZXhwb3J0cyA9IGluZm8uZ2V0KCdleHBvcnRzJywge30pCiAgICAgICAgICAgICAgICByZXN1bHRbZGlzdC52ZXJzaW9uXSA9IGRpc3QKICAgICAgICAgICAgICAgIHJlc3VsdFsndXJscyddLnNldGRlZmF1bHQoZGlzdC52ZXJzaW9uLCBzZXQoKSkuYWRkKGluZm9bJ3VybCddKQogICAgICAgIHJldHVybiByZXN1bHQKCmNsYXNzIERpc3RQYXRoTG9jYXRvcihMb2NhdG9yKToKICAgICIiIgogICAgVGhpcyBsb2NhdG9yIGZpbmRzIGluc3RhbGxlZCBkaXN0cmlidXRpb25zIGluIGEgcGF0aC4gSXQgY2FuIGJlIHVzZWZ1bCBmb3IKICAgIGFkZGluZyB0byBhbiA6Y2xhc3M6YEFnZ3JlZ2F0aW5nTG9jYXRvcmAuCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkaXN0cGF0aCwgKiprd2FyZ3MpOgogICAgICAgICIiIgogICAgICAgIEluaXRpYWxpc2UgYW4gaW5zdGFuY2UuCgogICAgICAgIDpwYXJhbSBkaXN0cGF0aDogQSA6Y2xhc3M6YERpc3RyaWJ1dGlvblBhdGhgIGluc3RhbmNlIHRvIHNlYXJjaC4KICAgICAgICAiIiIKICAgICAgICBzdXBlcihEaXN0UGF0aExvY2F0b3IsIHNlbGYpLl9faW5pdF9fKCoqa3dhcmdzKQogICAgICAgIGFzc2VydCBpc2luc3RhbmNlKGRpc3RwYXRoLCBEaXN0cmlidXRpb25QYXRoKQogICAgICAgIHNlbGYuZGlzdHBhdGggPSBkaXN0cGF0aAoKICAgIGRlZiBfZ2V0X3Byb2plY3Qoc2VsZiwgbmFtZSk6CiAgICAgICAgZGlzdCA9IHNlbGYuZGlzdHBhdGguZ2V0X2Rpc3RyaWJ1dGlvbihuYW1lKQogICAgICAgIGlmIGRpc3QgaXMgTm9uZToKICAgICAgICAgICAgcmVzdWx0ID0geyd1cmxzJzoge30sICdkaWdlc3RzJzoge319CiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmVzdWx0ID0gewogICAgICAgICAgICAgICAgZGlzdC52ZXJzaW9uOiBkaXN0LAogICAgICAgICAgICAgICAgJ3VybHMnOiB7ZGlzdC52ZXJzaW9uOiBzZXQoW2Rpc3Quc291cmNlX3VybF0pfSwKICAgICAgICAgICAgICAgICdkaWdlc3RzJzoge2Rpc3QudmVyc2lvbjogc2V0KFtOb25lXSl9CiAgICAgICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0CgoKY2xhc3MgQWdncmVnYXRpbmdMb2NhdG9yKExvY2F0b3IpOgogICAgIiIiCiAgICBUaGlzIGNsYXNzIGFsbG93cyB5b3UgdG8gY2hhaW4gYW5kL29yIG1lcmdlIGEgbGlzdCBvZiBsb2NhdG9ycy4KICAgICIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYsICpsb2NhdG9ycywgKiprd2FyZ3MpOgogICAgICAgICIiIgogICAgICAgIEluaXRpYWxpc2UgYW4gaW5zdGFuY2UuCgogICAgICAgIDpwYXJhbSBsb2NhdG9yczogVGhlIGxpc3Qgb2YgbG9jYXRvcnMgdG8gc2VhcmNoLgogICAgICAgIDpwYXJhbSBrd2FyZ3M6IFBhc3NlZCB0byB0aGUgc3VwZXJjbGFzcyBjb25zdHJ1Y3RvciwKICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgZm9yOgogICAgICAgICAgICAgICAgICAgICAgICogbWVyZ2UgLSBpZiBGYWxzZSAodGhlIGRlZmF1bHQpLCB0aGUgZmlyc3Qgc3VjY2Vzc2Z1bAogICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoIGZyb20gYW55IG9mIHRoZSBsb2NhdG9ycyBpcyByZXR1cm5lZC4gSWYgVHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSByZXN1bHRzIGZyb20gYWxsIGxvY2F0b3JzIGFyZSBtZXJnZWQgKHRoaXMgY2FuIGJlCiAgICAgICAgICAgICAgICAgICAgICAgICBzbG93KS4KICAgICAgICAiIiIKICAgICAgICBzZWxmLm1lcmdlID0ga3dhcmdzLnBvcCgnbWVyZ2UnLCBGYWxzZSkKICAgICAgICBzZWxmLmxvY2F0b3JzID0gbG9jYXRvcnMKICAgICAgICBzdXBlcihBZ2dyZWdhdGluZ0xvY2F0b3IsIHNlbGYpLl9faW5pdF9fKCoqa3dhcmdzKQoKICAgIGRlZiBjbGVhcl9jYWNoZShzZWxmKToKICAgICAgICBzdXBlcihBZ2dyZWdhdGluZ0xvY2F0b3IsIHNlbGYpLmNsZWFyX2NhY2hlKCkKICAgICAgICBmb3IgbG9jYXRvciBpbiBzZWxmLmxvY2F0b3JzOgogICAgICAgICAgICBsb2NhdG9yLmNsZWFyX2NhY2hlKCkKCiAgICBkZWYgX3NldF9zY2hlbWUoc2VsZiwgdmFsdWUpOgogICAgICAgIHNlbGYuX3NjaGVtZSA9IHZhbHVlCiAgICAgICAgZm9yIGxvY2F0b3IgaW4gc2VsZi5sb2NhdG9yczoKICAgICAgICAgICAgbG9jYXRvci5zY2hlbWUgPSB2YWx1ZQoKICAgIHNjaGVtZSA9IHByb3BlcnR5KExvY2F0b3Iuc2NoZW1lLmZnZXQsIF9zZXRfc2NoZW1lKQoKICAgIGRlZiBfZ2V0X3Byb2plY3Qoc2VsZiwgbmFtZSk6CiAgICAgICAgcmVzdWx0ID0ge30KICAgICAgICBmb3IgbG9jYXRvciBpbiBzZWxmLmxvY2F0b3JzOgogICAgICAgICAgICBkID0gbG9jYXRvci5nZXRfcHJvamVjdChuYW1lKQogICAgICAgICAgICBpZiBkOgogICAgICAgICAgICAgICAgaWYgc2VsZi5tZXJnZToKICAgICAgICAgICAgICAgICAgICBmaWxlcyA9IHJlc3VsdC5nZXQoJ3VybHMnLCB7fSkKICAgICAgICAgICAgICAgICAgICBkaWdlc3RzID0gcmVzdWx0LmdldCgnZGlnZXN0cycsIHt9KQogICAgICAgICAgICAgICAgICAgICMgbmV4dCBsaW5lIGNvdWxkIG92ZXJ3cml0ZSByZXN1bHRbJ3VybHMnXSwgcmVzdWx0WydkaWdlc3RzJ10KICAgICAgICAgICAgICAgICAgICByZXN1bHQudXBkYXRlKGQpCiAgICAgICAgICAgICAgICAgICAgZGYgPSByZXN1bHQuZ2V0KCd1cmxzJykKICAgICAgICAgICAgICAgICAgICBpZiBmaWxlcyBhbmQgZGY6CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBrLCB2IGluIGZpbGVzLml0ZW1zKCk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBrIGluIGRmOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRmW2tdIHw9IHYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZba10gPSB2CiAgICAgICAgICAgICAgICAgICAgZGQgPSByZXN1bHQuZ2V0KCdkaWdlc3RzJykKICAgICAgICAgICAgICAgICAgICBpZiBkaWdlc3RzIGFuZCBkZDoKICAgICAgICAgICAgICAgICAgICAgICAgZGQudXBkYXRlKGRpZ2VzdHMpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICMgU2VlIGlzc3VlICMxOC4gSWYgYW55IGRpc3RzIGFyZSBmb3VuZCBhbmQgd2UncmUgbG9va2luZwogICAgICAgICAgICAgICAgICAgICMgZm9yIHNwZWNpZmljIGNvbnN0cmFpbnRzLCB3ZSBvbmx5IHJldHVybiBzb21ldGhpbmcgaWYKICAgICAgICAgICAgICAgICAgICAjIGEgbWF0Y2ggaXMgZm91bmQuIEZvciBleGFtcGxlLCBpZiBhIERpcmVjdG9yeUxvY2F0b3IKICAgICAgICAgICAgICAgICAgICAjIHJldHVybnMganVzdCBmb28gKDEuMCkgd2hpbGUgd2UncmUgbG9va2luZyBmb3IKICAgICAgICAgICAgICAgICAgICAjIGZvbyAoPj0gMi4wKSwgd2UnbGwgcHJldGVuZCB0aGVyZSB3YXMgbm90aGluZyB0aGVyZSBzbwogICAgICAgICAgICAgICAgICAgICMgdGhhdCBzdWJzZXF1ZW50IGxvY2F0b3JzIGNhbiBiZSBxdWVyaWVkLiBPdGhlcndpc2Ugd2UKICAgICAgICAgICAgICAgICAgICAjIHdvdWxkIGp1c3QgcmV0dXJuIGZvbyAoMS4wKSB3aGljaCB3b3VsZCB0aGVuIGxlYWQgdG8gYQogICAgICAgICAgICAgICAgICAgICMgZmFpbHVyZSB0byBmaW5kIGZvbyAoPj0gMi4wKSwgYmVjYXVzZSBvdGhlciBsb2NhdG9ycwogICAgICAgICAgICAgICAgICAgICMgd2VyZW4ndCBzZWFyY2hlZC4gTm90ZSB0aGF0IHRoaXMgb25seSBtYXR0ZXJzIHdoZW4KICAgICAgICAgICAgICAgICAgICAjIG1lcmdlPUZhbHNlLgogICAgICAgICAgICAgICAgICAgIGlmIHNlbGYubWF0Y2hlciBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IFRydWUKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IEZhbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBrIGluIGQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLm1hdGNoZXIubWF0Y2goayk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBUcnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgICAgICBpZiBmb3VuZDoKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZAogICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgZ2V0X2Rpc3RyaWJ1dGlvbl9uYW1lcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gYWxsIHRoZSBkaXN0cmlidXRpb24gbmFtZXMga25vd24gdG8gdGhpcyBsb2NhdG9yLgogICAgICAgICIiIgogICAgICAgIHJlc3VsdCA9IHNldCgpCiAgICAgICAgZm9yIGxvY2F0b3IgaW4gc2VsZi5sb2NhdG9yczoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcmVzdWx0IHw9IGxvY2F0b3IuZ2V0X2Rpc3RyaWJ1dGlvbl9uYW1lcygpCiAgICAgICAgICAgIGV4Y2VwdCBOb3RJbXBsZW1lbnRlZEVycm9yOgogICAgICAgICAgICAgICAgcGFzcwogICAgICAgIHJldHVybiByZXN1bHQKCgojIFdlIHVzZSBhIGxlZ2FjeSBzY2hlbWUgc2ltcGx5IGJlY2F1c2UgbW9zdCBvZiB0aGUgZGlzdHMgb24gUHlQSSB1c2UgbGVnYWN5CiMgdmVyc2lvbnMgd2hpY2ggZG9uJ3QgY29uZm9ybSB0byBQRVAgNDI2IC8gUEVQIDQ0MC4KZGVmYXVsdF9sb2NhdG9yID0gQWdncmVnYXRpbmdMb2NhdG9yKAogICAgICAgICAgICAgICAgICAgIEpTT05Mb2NhdG9yKCksCiAgICAgICAgICAgICAgICAgICAgU2ltcGxlU2NyYXBpbmdMb2NhdG9yKCdodHRwczovL3B5cGkucHl0aG9uLm9yZy9zaW1wbGUvJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dD0zLjApLAogICAgICAgICAgICAgICAgICAgIHNjaGVtZT0nbGVnYWN5JykKCmxvY2F0ZSA9IGRlZmF1bHRfbG9jYXRvci5sb2NhdGUKCk5BTUVfVkVSU0lPTl9SRSA9IHJlLmNvbXBpbGUocicoP1A8bmFtZT5bXHctXSspXHMqJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHInXChccyooPT1ccyopPyg/UDx2ZXI+W14pXSspXCkkJykKCmNsYXNzIERlcGVuZGVuY3lGaW5kZXIob2JqZWN0KToKICAgICIiIgogICAgTG9jYXRlIGRlcGVuZGVuY2llcyBmb3IgZGlzdHJpYnV0aW9ucy4KICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsb2NhdG9yPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIEluaXRpYWxpc2UgYW4gaW5zdGFuY2UsIHVzaW5nIHRoZSBzcGVjaWZpZWQgbG9jYXRvcgogICAgICAgIHRvIGxvY2F0ZSBkaXN0cmlidXRpb25zLgogICAgICAgICIiIgogICAgICAgIHNlbGYubG9jYXRvciA9IGxvY2F0b3Igb3IgZGVmYXVsdF9sb2NhdG9yCiAgICAgICAgc2VsZi5zY2hlbWUgPSBnZXRfc2NoZW1lKHNlbGYubG9jYXRvci5zY2hlbWUpCgogICAgZGVmIGFkZF9kaXN0cmlidXRpb24oc2VsZiwgZGlzdCk6CiAgICAgICAgIiIiCiAgICAgICAgQWRkIGEgZGlzdHJpYnV0aW9uIHRvIHRoZSBmaW5kZXIuIFRoaXMgd2lsbCB1cGRhdGUgaW50ZXJuYWwgaW5mb3JtYXRpb24KICAgICAgICBhYm91dCB3aG8gcHJvdmlkZXMgd2hhdC4KICAgICAgICA6cGFyYW0gZGlzdDogVGhlIGRpc3RyaWJ1dGlvbiB0byBhZGQuCiAgICAgICAgIiIiCiAgICAgICAgbG9nZ2VyLmRlYnVnKCdhZGRpbmcgZGlzdHJpYnV0aW9uICVzJywgZGlzdCkKICAgICAgICBuYW1lID0gZGlzdC5rZXkKICAgICAgICBzZWxmLmRpc3RzX2J5X25hbWVbbmFtZV0gPSBkaXN0CiAgICAgICAgc2VsZi5kaXN0c1sobmFtZSwgZGlzdC52ZXJzaW9uKV0gPSBkaXN0CiAgICAgICAgZm9yIHAgaW4gZGlzdC5wcm92aWRlczoKICAgICAgICAgICAgbmFtZSwgdmVyc2lvbiA9IHBhcnNlX25hbWVfYW5kX3ZlcnNpb24ocCkKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdBZGQgdG8gcHJvdmlkZWQ6ICVzLCAlcywgJXMnLCBuYW1lLCB2ZXJzaW9uLCBkaXN0KQogICAgICAgICAgICBzZWxmLnByb3ZpZGVkLnNldGRlZmF1bHQobmFtZSwgc2V0KCkpLmFkZCgodmVyc2lvbiwgZGlzdCkpCgogICAgZGVmIHJlbW92ZV9kaXN0cmlidXRpb24oc2VsZiwgZGlzdCk6CiAgICAgICAgIiIiCiAgICAgICAgUmVtb3ZlIGEgZGlzdHJpYnV0aW9uIGZyb20gdGhlIGZpbmRlci4gVGhpcyB3aWxsIHVwZGF0ZSBpbnRlcm5hbAogICAgICAgIGluZm9ybWF0aW9uIGFib3V0IHdobyBwcm92aWRlcyB3aGF0LgogICAgICAgIDpwYXJhbSBkaXN0OiBUaGUgZGlzdHJpYnV0aW9uIHRvIHJlbW92ZS4KICAgICAgICAiIiIKICAgICAgICBsb2dnZXIuZGVidWcoJ3JlbW92aW5nIGRpc3RyaWJ1dGlvbiAlcycsIGRpc3QpCiAgICAgICAgbmFtZSA9IGRpc3Qua2V5CiAgICAgICAgZGVsIHNlbGYuZGlzdHNfYnlfbmFtZVtuYW1lXQogICAgICAgIGRlbCBzZWxmLmRpc3RzWyhuYW1lLCBkaXN0LnZlcnNpb24pXQogICAgICAgIGZvciBwIGluIGRpc3QucHJvdmlkZXM6CiAgICAgICAgICAgIG5hbWUsIHZlcnNpb24gPSBwYXJzZV9uYW1lX2FuZF92ZXJzaW9uKHApCiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnUmVtb3ZlIGZyb20gcHJvdmlkZWQ6ICVzLCAlcywgJXMnLCBuYW1lLCB2ZXJzaW9uLCBkaXN0KQogICAgICAgICAgICBzID0gc2VsZi5wcm92aWRlZFtuYW1lXQogICAgICAgICAgICBzLnJlbW92ZSgodmVyc2lvbiwgZGlzdCkpCiAgICAgICAgICAgIGlmIG5vdCBzOgogICAgICAgICAgICAgICAgZGVsIHNlbGYucHJvdmlkZWRbbmFtZV0KCiAgICBkZWYgZ2V0X21hdGNoZXIoc2VsZiwgcmVxdCk6CiAgICAgICAgIiIiCiAgICAgICAgR2V0IGEgdmVyc2lvbiBtYXRjaGVyIGZvciBhIHJlcXVpcmVtZW50LgogICAgICAgIDpwYXJhbSByZXF0OiBUaGUgcmVxdWlyZW1lbnQKICAgICAgICA6dHlwZSByZXF0OiBzdHIKICAgICAgICA6cmV0dXJuOiBBIHZlcnNpb24gbWF0Y2hlciAoYW4gaW5zdGFuY2Ugb2YKICAgICAgICAgICAgICAgICA6Y2xhc3M6YGRpc3RsaWIudmVyc2lvbi5NYXRjaGVyYCkuCiAgICAgICAgIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICBtYXRjaGVyID0gc2VsZi5zY2hlbWUubWF0Y2hlcihyZXF0KQogICAgICAgIGV4Y2VwdCBVbnN1cHBvcnRlZFZlcnNpb25FcnJvcjogICMgcHJhZ21hOiBubyBjb3ZlcgogICAgICAgICAgICAjIFhYWCBjb21wYXQtbW9kZSBpZiBjYW5ub3QgcmVhZCB0aGUgdmVyc2lvbgogICAgICAgICAgICBuYW1lID0gcmVxdC5zcGxpdCgpWzBdCiAgICAgICAgICAgIG1hdGNoZXIgPSBzZWxmLnNjaGVtZS5tYXRjaGVyKG5hbWUpCiAgICAgICAgcmV0dXJuIG1hdGNoZXIKCiAgICBkZWYgZmluZF9wcm92aWRlcnMoc2VsZiwgcmVxdCk6CiAgICAgICAgIiIiCiAgICAgICAgRmluZCB0aGUgZGlzdHJpYnV0aW9ucyB3aGljaCBjYW4gZnVsZmlsbCBhIHJlcXVpcmVtZW50LgoKICAgICAgICA6cGFyYW0gcmVxdDogVGhlIHJlcXVpcmVtZW50LgogICAgICAgICA6dHlwZSByZXF0OiBzdHIKICAgICAgICA6cmV0dXJuOiBBIHNldCBvZiBkaXN0cmlidXRpb24gd2hpY2ggY2FuIGZ1bGZpbGwgdGhlIHJlcXVpcmVtZW50LgogICAgICAgICIiIgogICAgICAgIG1hdGNoZXIgPSBzZWxmLmdldF9tYXRjaGVyKHJlcXQpCiAgICAgICAgbmFtZSA9IG1hdGNoZXIua2V5ICAgIyBjYXNlLWluc2Vuc2l0aXZlCiAgICAgICAgcmVzdWx0ID0gc2V0KCkKICAgICAgICBwcm92aWRlZCA9IHNlbGYucHJvdmlkZWQKICAgICAgICBpZiBuYW1lIGluIHByb3ZpZGVkOgogICAgICAgICAgICBmb3IgdmVyc2lvbiwgcHJvdmlkZXIgaW4gcHJvdmlkZWRbbmFtZV06CiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSBtYXRjaGVyLm1hdGNoKHZlcnNpb24pCiAgICAgICAgICAgICAgICBleGNlcHQgVW5zdXBwb3J0ZWRWZXJzaW9uRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSBGYWxzZQoKICAgICAgICAgICAgICAgIGlmIG1hdGNoOgogICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQocHJvdmlkZXIpCiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIHRyeV90b19yZXBsYWNlKHNlbGYsIHByb3ZpZGVyLCBvdGhlciwgcHJvYmxlbXMpOgogICAgICAgICIiIgogICAgICAgIEF0dGVtcHQgdG8gcmVwbGFjZSBvbmUgcHJvdmlkZXIgd2l0aCBhbm90aGVyLiBUaGlzIGlzIHR5cGljYWxseSB1c2VkCiAgICAgICAgd2hlbiByZXNvbHZpbmcgZGVwZW5kZW5jaWVzIGZyb20gbXVsdGlwbGUgc291cmNlcywgZS5nLiBBIHJlcXVpcmVzCiAgICAgICAgKEIgPj0gMS4wKSB3aGlsZSBDIHJlcXVpcmVzIChCID49IDEuMSkuCgogICAgICAgIEZvciBzdWNjZXNzZnVsIHJlcGxhY2VtZW50LCBgYHByb3ZpZGVyYGAgbXVzdCBtZWV0IGFsbCB0aGUgcmVxdWlyZW1lbnRzCiAgICAgICAgd2hpY2ggYGBvdGhlcmBgIGZ1bGZpbGxzLgoKICAgICAgICA6cGFyYW0gcHJvdmlkZXI6IFRoZSBwcm92aWRlciB3ZSBhcmUgdHJ5aW5nIHRvIHJlcGxhY2Ugd2l0aC4KICAgICAgICA6cGFyYW0gb3RoZXI6IFRoZSBwcm92aWRlciB3ZSdyZSB0cnlpbmcgdG8gcmVwbGFjZS4KICAgICAgICA6cGFyYW0gcHJvYmxlbXM6IElmIEZhbHNlIGlzIHJldHVybmVkLCB0aGlzIHdpbGwgY29udGFpbiB3aGF0CiAgICAgICAgICAgICAgICAgICAgICAgICBwcm9ibGVtcyBwcmV2ZW50ZWQgcmVwbGFjZW1lbnQuIFRoaXMgaXMgY3VycmVudGx5CiAgICAgICAgICAgICAgICAgICAgICAgICBhIHR1cGxlIG9mIHRoZSBsaXRlcmFsIHN0cmluZyAnY2FudHJlcGxhY2UnLAogICAgICAgICAgICAgICAgICAgICAgICAgYGBwcm92aWRlcmBgLCBgYG90aGVyYGAgIGFuZCB0aGUgc2V0IG9mIHJlcXVpcmVtZW50cwogICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBgYHByb3ZpZGVyYGAgY291bGRuJ3QgZnVsZmlsbC4KICAgICAgICA6cmV0dXJuOiBUcnVlIGlmIHdlIGNhbiByZXBsYWNlIGBgb3RoZXJgYCB3aXRoIGBgcHJvdmlkZXJgYCwgZWxzZQogICAgICAgICAgICAgICAgIEZhbHNlLgogICAgICAgICIiIgogICAgICAgIHJsaXN0ID0gc2VsZi5yZXF0c1tvdGhlcl0KICAgICAgICB1bm1hdGNoZWQgPSBzZXQoKQogICAgICAgIGZvciBzIGluIHJsaXN0OgogICAgICAgICAgICBtYXRjaGVyID0gc2VsZi5nZXRfbWF0Y2hlcihzKQogICAgICAgICAgICBpZiBub3QgbWF0Y2hlci5tYXRjaChwcm92aWRlci52ZXJzaW9uKToKICAgICAgICAgICAgICAgIHVubWF0Y2hlZC5hZGQocykKICAgICAgICBpZiB1bm1hdGNoZWQ6CiAgICAgICAgICAgICMgY2FuJ3QgcmVwbGFjZSBvdGhlciB3aXRoIHByb3ZpZGVyCiAgICAgICAgICAgIHByb2JsZW1zLmFkZCgoJ2NhbnRyZXBsYWNlJywgcHJvdmlkZXIsIG90aGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldCh1bm1hdGNoZWQpKSkKICAgICAgICAgICAgcmVzdWx0ID0gRmFsc2UKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIGNhbiByZXBsYWNlIG90aGVyIHdpdGggcHJvdmlkZXIKICAgICAgICAgICAgc2VsZi5yZW1vdmVfZGlzdHJpYnV0aW9uKG90aGVyKQogICAgICAgICAgICBkZWwgc2VsZi5yZXF0c1tvdGhlcl0KICAgICAgICAgICAgZm9yIHMgaW4gcmxpc3Q6CiAgICAgICAgICAgICAgICBzZWxmLnJlcXRzLnNldGRlZmF1bHQocHJvdmlkZXIsIHNldCgpKS5hZGQocykKICAgICAgICAgICAgc2VsZi5hZGRfZGlzdHJpYnV0aW9uKHByb3ZpZGVyKQogICAgICAgICAgICByZXN1bHQgPSBUcnVlCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBmaW5kKHNlbGYsIHJlcXVpcmVtZW50LCBtZXRhX2V4dHJhcz1Ob25lLCBwcmVyZWxlYXNlcz1GYWxzZSk6CiAgICAgICAgIiIiCiAgICAgICAgRmluZCBhIGRpc3RyaWJ1dGlvbiBhbmQgYWxsIGRpc3RyaWJ1dGlvbnMgaXQgZGVwZW5kcyBvbi4KCiAgICAgICAgOnBhcmFtIHJlcXVpcmVtZW50OiBUaGUgcmVxdWlyZW1lbnQgc3BlY2lmeWluZyB0aGUgZGlzdHJpYnV0aW9uIHRvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5kLCBvciBhIERpc3RyaWJ1dGlvbiBpbnN0YW5jZS4KICAgICAgICA6cGFyYW0gbWV0YV9leHRyYXM6IEEgbGlzdCBvZiBtZXRhIGV4dHJhcyBzdWNoIGFzIDp0ZXN0OiwgOmJ1aWxkOiBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvIG9uLgogICAgICAgIDpwYXJhbSBwcmVyZWxlYXNlczogSWYgYGBUcnVlYGAsIGFsbG93IHByZS1yZWxlYXNlIHZlcnNpb25zIHRvIGJlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5lZCAtIG90aGVyd2lzZSwgZG9uJ3QgcmV0dXJuIHByZXJlbGVhc2VzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmxlc3MgdGhleSdyZSBhbGwgdGhhdCdzIGF2YWlsYWJsZS4KCiAgICAgICAgUmV0dXJuIGEgc2V0IG9mIDpjbGFzczpgRGlzdHJpYnV0aW9uYCBpbnN0YW5jZXMgYW5kIGEgc2V0IG9mCiAgICAgICAgcHJvYmxlbXMuCgogICAgICAgIFRoZSBkaXN0cmlidXRpb25zIHJldHVybmVkIHNob3VsZCBiZSBzdWNoIHRoYXQgdGhleSBoYXZlIHRoZQogICAgICAgIDphdHRyOmByZXF1aXJlZGAgYXR0cmlidXRlIHNldCB0byBgYFRydWVgYCBpZiB0aGV5IHdlcmUKICAgICAgICBmcm9tIHRoZSBgYHJlcXVpcmVtZW50YGAgcGFzc2VkIHRvIGBgZmluZCgpYGAsIGFuZCB0aGV5IGhhdmUgdGhlCiAgICAgICAgOmF0dHI6YGJ1aWxkX3RpbWVfZGVwZW5kZW5jeWAgYXR0cmlidXRlIHNldCB0byBgYFRydWVgYCB1bmxlc3MgdGhleQogICAgICAgIGFyZSBwb3N0LWluc3RhbGxhdGlvbiBkZXBlbmRlbmNpZXMgb2YgdGhlIGBgcmVxdWlyZW1lbnRgYC4KCiAgICAgICAgVGhlIHByb2JsZW1zIHNob3VsZCBiZSBhIHR1cGxlIGNvbnNpc3Rpbmcgb2YgdGhlIHN0cmluZwogICAgICAgIGBgJ3Vuc2F0aXNmaWVkJ2BgIGFuZCB0aGUgcmVxdWlyZW1lbnQgd2hpY2ggY291bGRuJ3QgYmUgc2F0aXNmaWVkCiAgICAgICAgYnkgYW55IGRpc3RyaWJ1dGlvbiBrbm93biB0byB0aGUgbG9jYXRvci4KICAgICAgICAiIiIKCiAgICAgICAgc2VsZi5wcm92aWRlZCA9IHt9CiAgICAgICAgc2VsZi5kaXN0cyA9IHt9CiAgICAgICAgc2VsZi5kaXN0c19ieV9uYW1lID0ge30KICAgICAgICBzZWxmLnJlcXRzID0ge30KCiAgICAgICAgbWV0YV9leHRyYXMgPSBzZXQobWV0YV9leHRyYXMgb3IgW10pCiAgICAgICAgaWYgJzoqOicgaW4gbWV0YV9leHRyYXM6CiAgICAgICAgICAgIG1ldGFfZXh0cmFzLnJlbW92ZSgnOio6JykKICAgICAgICAgICAgIyA6bWV0YTogYW5kIDpydW46IGFyZSBpbXBsaWNpdGx5IGluY2x1ZGVkCiAgICAgICAgICAgIG1ldGFfZXh0cmFzIHw9IHNldChbJzp0ZXN0OicsICc6YnVpbGQ6JywgJzpkZXY6J10pCgogICAgICAgIGlmIGlzaW5zdGFuY2UocmVxdWlyZW1lbnQsIERpc3RyaWJ1dGlvbik6CiAgICAgICAgICAgIGRpc3QgPSBvZGlzdCA9IHJlcXVpcmVtZW50CiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygncGFzc2VkICVzIGFzIHJlcXVpcmVtZW50Jywgb2Rpc3QpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZGlzdCA9IG9kaXN0ID0gc2VsZi5sb2NhdG9yLmxvY2F0ZShyZXF1aXJlbWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVyZWxlYXNlcz1wcmVyZWxlYXNlcykKICAgICAgICAgICAgaWYgZGlzdCBpcyBOb25lOgogICAgICAgICAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbignVW5hYmxlIHRvIGxvY2F0ZSAlcicgJSByZXF1aXJlbWVudCkKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdsb2NhdGVkICVzJywgb2Rpc3QpCiAgICAgICAgZGlzdC5yZXF1ZXN0ZWQgPSBUcnVlCiAgICAgICAgcHJvYmxlbXMgPSBzZXQoKQogICAgICAgIHRvZG8gPSBzZXQoW2Rpc3RdKQogICAgICAgIGluc3RhbGxfZGlzdHMgPSBzZXQoW29kaXN0XSkKICAgICAgICB3aGlsZSB0b2RvOgogICAgICAgICAgICBkaXN0ID0gdG9kby5wb3AoKQogICAgICAgICAgICBuYW1lID0gZGlzdC5rZXkgICAgICMgY2FzZS1pbnNlbnNpdGl2ZQogICAgICAgICAgICBpZiBuYW1lIG5vdCBpbiBzZWxmLmRpc3RzX2J5X25hbWU6CiAgICAgICAgICAgICAgICBzZWxmLmFkZF9kaXN0cmlidXRpb24oZGlzdCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICNpbXBvcnQgcGRiOyBwZGIuc2V0X3RyYWNlKCkKICAgICAgICAgICAgICAgIG90aGVyID0gc2VsZi5kaXN0c19ieV9uYW1lW25hbWVdCiAgICAgICAgICAgICAgICBpZiBvdGhlciAhPSBkaXN0OgogICAgICAgICAgICAgICAgICAgIHNlbGYudHJ5X3RvX3JlcGxhY2UoZGlzdCwgb3RoZXIsIHByb2JsZW1zKQoKICAgICAgICAgICAgaXJlcXRzID0gZGlzdC5ydW5fcmVxdWlyZXMgfCBkaXN0Lm1ldGFfcmVxdWlyZXMKICAgICAgICAgICAgc3JlcXRzID0gZGlzdC5idWlsZF9yZXF1aXJlcwogICAgICAgICAgICBlcmVxdHMgPSBzZXQoKQogICAgICAgICAgICBpZiBkaXN0IGluIGluc3RhbGxfZGlzdHM6CiAgICAgICAgICAgICAgICBmb3Iga2V5IGluICgndGVzdCcsICdidWlsZCcsICdkZXYnKToKICAgICAgICAgICAgICAgICAgICBlID0gJzolczonICUga2V5CiAgICAgICAgICAgICAgICAgICAgaWYgZSBpbiBtZXRhX2V4dHJhczoKICAgICAgICAgICAgICAgICAgICAgICAgZXJlcXRzIHw9IGdldGF0dHIoZGlzdCwgJyVzX3JlcXVpcmVzJyAlIGtleSkKICAgICAgICAgICAgYWxsX3JlcXRzID0gaXJlcXRzIHwgc3JlcXRzIHwgZXJlcXRzCiAgICAgICAgICAgIGZvciByIGluIGFsbF9yZXF0czoKICAgICAgICAgICAgICAgIHByb3ZpZGVycyA9IHNlbGYuZmluZF9wcm92aWRlcnMocikKICAgICAgICAgICAgICAgIGlmIG5vdCBwcm92aWRlcnM6CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdObyBwcm92aWRlcnMgZm91bmQgZm9yICVyJywgcikKICAgICAgICAgICAgICAgICAgICBwcm92aWRlciA9IHNlbGYubG9jYXRvci5sb2NhdGUociwgcHJlcmVsZWFzZXM9cHJlcmVsZWFzZXMpCiAgICAgICAgICAgICAgICAgICAgIyBJZiBubyBwcm92aWRlciBpcyBmb3VuZCBhbmQgd2UgZGlkbid0IGNvbnNpZGVyCiAgICAgICAgICAgICAgICAgICAgIyBwcmVyZWxlYXNlcywgY29uc2lkZXIgdGhlbSBub3cuCiAgICAgICAgICAgICAgICAgICAgaWYgcHJvdmlkZXIgaXMgTm9uZSBhbmQgbm90IHByZXJlbGVhc2VzOgogICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlciA9IHNlbGYubG9jYXRvci5sb2NhdGUociwgcHJlcmVsZWFzZXM9VHJ1ZSkKICAgICAgICAgICAgICAgICAgICBpZiBwcm92aWRlciBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0Nhbm5vdCBzYXRpc2Z5ICVyJywgcikKICAgICAgICAgICAgICAgICAgICAgICAgcHJvYmxlbXMuYWRkKCgndW5zYXRpc2ZpZWQnLCByKSkKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBuLCB2ID0gcHJvdmlkZXIua2V5LCBwcm92aWRlci52ZXJzaW9uCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuLCB2KSBub3QgaW4gc2VsZi5kaXN0czoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvZG8uYWRkKHByb3ZpZGVyKQogICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlcnMuYWRkKHByb3ZpZGVyKQogICAgICAgICAgICAgICAgICAgICAgICBpZiByIGluIGlyZXF0cyBhbmQgZGlzdCBpbiBpbnN0YWxsX2Rpc3RzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFsbF9kaXN0cy5hZGQocHJvdmlkZXIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0FkZGluZyAlcyB0byBpbnN0YWxsX2Rpc3RzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlci5uYW1lX2FuZF92ZXJzaW9uKQogICAgICAgICAgICAgICAgZm9yIHAgaW4gcHJvdmlkZXJzOgogICAgICAgICAgICAgICAgICAgIG5hbWUgPSBwLmtleQogICAgICAgICAgICAgICAgICAgIGlmIG5hbWUgbm90IGluIHNlbGYuZGlzdHNfYnlfbmFtZToKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXF0cy5zZXRkZWZhdWx0KHAsIHNldCgpKS5hZGQocikKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBvdGhlciA9IHNlbGYuZGlzdHNfYnlfbmFtZVtuYW1lXQogICAgICAgICAgICAgICAgICAgICAgICBpZiBvdGhlciAhPSBwOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzZWUgaWYgb3RoZXIgY2FuIGJlIHJlcGxhY2VkIGJ5IHAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJ5X3RvX3JlcGxhY2UocCwgb3RoZXIsIHByb2JsZW1zKQoKICAgICAgICBkaXN0cyA9IHNldChzZWxmLmRpc3RzLnZhbHVlcygpKQogICAgICAgIGZvciBkaXN0IGluIGRpc3RzOgogICAgICAgICAgICBkaXN0LmJ1aWxkX3RpbWVfZGVwZW5kZW5jeSA9IGRpc3Qgbm90IGluIGluc3RhbGxfZGlzdHMKICAgICAgICAgICAgaWYgZGlzdC5idWlsZF90aW1lX2RlcGVuZGVuY3k6CiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJyVzIGlzIGEgYnVpbGQtdGltZSBkZXBlbmRlbmN5IG9ubHkuJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0Lm5hbWVfYW5kX3ZlcnNpb24pCiAgICAgICAgbG9nZ2VyLmRlYnVnKCdmaW5kIGRvbmUgZm9yICVzJywgb2Rpc3QpCiAgICAgICAgcmV0dXJuIGRpc3RzLCBwcm9ibGVtcwpQSwMEFAAAAAAAAAAhAIaXtZvaOQAA2jkAADwAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvbWFuaWZlc3QucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQojCiMgQ29weXJpZ2h0IChDKSAyMDEyLTIwMTMgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24uCiMgU2VlIExJQ0VOU0UudHh0IGFuZCBDT05UUklCVVRPUlMudHh0LgojCiIiIgpDbGFzcyByZXByZXNlbnRpbmcgdGhlIGxpc3Qgb2YgZmlsZXMgaW4gYSBkaXN0cmlidXRpb24uCgpFcXVpdmFsZW50IHRvIGRpc3R1dGlscy5maWxlbGlzdCwgYnV0IGZpeGVzIHNvbWUgcHJvYmxlbXMuCiIiIgppbXBvcnQgZm5tYXRjaAppbXBvcnQgbG9nZ2luZwppbXBvcnQgb3MKaW1wb3J0IHJlCmltcG9ydCBzeXMKCmZyb20gLiBpbXBvcnQgRGlzdGxpYkV4Y2VwdGlvbgpmcm9tIC5jb21wYXQgaW1wb3J0IGZzZGVjb2RlCmZyb20gLnV0aWwgaW1wb3J0IGNvbnZlcnRfcGF0aAoKCl9fYWxsX18gPSBbJ01hbmlmZXN0J10KCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKIyBhIFwgZm9sbG93ZWQgYnkgc29tZSBzcGFjZXMgKyBFT0wKX0NPTExBUFNFX1BBVFRFUk4gPSByZS5jb21waWxlKCdcXFx3KlxuJywgcmUuTSkKX0NPTU1FTlRFRF9MSU5FID0gcmUuY29tcGlsZSgnIy4qPyg/PVxuKXxcbig/PSQpJywgcmUuTSB8IHJlLlMpCgojCiMgRHVlIHRvIHRoZSBkaWZmZXJlbnQgcmVzdWx0cyByZXR1cm5lZCBieSBmbm1hdGNoLnRyYW5zbGF0ZSwgd2UgbmVlZAojIHRvIGRvIHNsaWdodGx5IGRpZmZlcmVudCBwcm9jZXNzaW5nIGZvciBQeXRob24gMi43IGFuZCAzLjIgLi4uIHRoaXMgbmVlZGVkCiMgdG8gYmUgYnJvdWdodCBpbiBmb3IgUHl0aG9uIDMuNiBvbndhcmRzLgojCl9QWVRIT05fVkVSU0lPTiA9IHN5cy52ZXJzaW9uX2luZm9bOjJdCgpjbGFzcyBNYW5pZmVzdChvYmplY3QpOgogICAgIiIiQSBsaXN0IG9mIGZpbGVzIGJ1aWx0IGJ5IG9uIGV4cGxvcmluZyB0aGUgZmlsZXN5c3RlbSBhbmQgZmlsdGVyZWQgYnkKICAgIGFwcGx5aW5nIHZhcmlvdXMgcGF0dGVybnMgdG8gd2hhdCB3ZSBmaW5kIHRoZXJlLgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGJhc2U9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgSW5pdGlhbGlzZSBhbiBpbnN0YW5jZS4KCiAgICAgICAgOnBhcmFtIGJhc2U6IFRoZSBiYXNlIGRpcmVjdG9yeSB0byBleHBsb3JlIHVuZGVyLgogICAgICAgICIiIgogICAgICAgIHNlbGYuYmFzZSA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLm5vcm1wYXRoKGJhc2Ugb3Igb3MuZ2V0Y3dkKCkpKQogICAgICAgIHNlbGYucHJlZml4ID0gc2VsZi5iYXNlICsgb3Muc2VwCiAgICAgICAgc2VsZi5hbGxmaWxlcyA9IE5vbmUKICAgICAgICBzZWxmLmZpbGVzID0gc2V0KCkKCiAgICAjCiAgICAjIFB1YmxpYyBBUEkKICAgICMKCiAgICBkZWYgZmluZGFsbChzZWxmKToKICAgICAgICAiIiJGaW5kIGFsbCBmaWxlcyB1bmRlciB0aGUgYmFzZSBhbmQgc2V0IGBgYWxsZmlsZXNgYCB0byB0aGUgYWJzb2x1dGUKICAgICAgICBwYXRobmFtZXMgb2YgZmlsZXMgZm91bmQuCiAgICAgICAgIiIiCiAgICAgICAgZnJvbSBzdGF0IGltcG9ydCBTX0lTUkVHLCBTX0lTRElSLCBTX0lTTE5LCgogICAgICAgIHNlbGYuYWxsZmlsZXMgPSBhbGxmaWxlcyA9IFtdCiAgICAgICAgcm9vdCA9IHNlbGYuYmFzZQogICAgICAgIHN0YWNrID0gW3Jvb3RdCiAgICAgICAgcG9wID0gc3RhY2sucG9wCiAgICAgICAgcHVzaCA9IHN0YWNrLmFwcGVuZAoKICAgICAgICB3aGlsZSBzdGFjazoKICAgICAgICAgICAgcm9vdCA9IHBvcCgpCiAgICAgICAgICAgIG5hbWVzID0gb3MubGlzdGRpcihyb290KQoKICAgICAgICAgICAgZm9yIG5hbWUgaW4gbmFtZXM6CiAgICAgICAgICAgICAgICBmdWxsbmFtZSA9IG9zLnBhdGguam9pbihyb290LCBuYW1lKQoKICAgICAgICAgICAgICAgICMgQXZvaWQgZXhjZXNzIHN0YXQgY2FsbHMgLS0ganVzdCBvbmUgd2lsbCBkbywgdGhhbmsgeW91IQogICAgICAgICAgICAgICAgc3RhdCA9IG9zLnN0YXQoZnVsbG5hbWUpCiAgICAgICAgICAgICAgICBtb2RlID0gc3RhdC5zdF9tb2RlCiAgICAgICAgICAgICAgICBpZiBTX0lTUkVHKG1vZGUpOgogICAgICAgICAgICAgICAgICAgIGFsbGZpbGVzLmFwcGVuZChmc2RlY29kZShmdWxsbmFtZSkpCiAgICAgICAgICAgICAgICBlbGlmIFNfSVNESVIobW9kZSkgYW5kIG5vdCBTX0lTTE5LKG1vZGUpOgogICAgICAgICAgICAgICAgICAgIHB1c2goZnVsbG5hbWUpCgogICAgZGVmIGFkZChzZWxmLCBpdGVtKToKICAgICAgICAiIiIKICAgICAgICBBZGQgYSBmaWxlIHRvIHRoZSBtYW5pZmVzdC4KCiAgICAgICAgOnBhcmFtIGl0ZW06IFRoZSBwYXRobmFtZSB0byBhZGQuIFRoaXMgY2FuIGJlIHJlbGF0aXZlIHRvIHRoZSBiYXNlLgogICAgICAgICIiIgogICAgICAgIGlmIG5vdCBpdGVtLnN0YXJ0c3dpdGgoc2VsZi5wcmVmaXgpOgogICAgICAgICAgICBpdGVtID0gb3MucGF0aC5qb2luKHNlbGYuYmFzZSwgaXRlbSkKICAgICAgICBzZWxmLmZpbGVzLmFkZChvcy5wYXRoLm5vcm1wYXRoKGl0ZW0pKQoKICAgIGRlZiBhZGRfbWFueShzZWxmLCBpdGVtcyk6CiAgICAgICAgIiIiCiAgICAgICAgQWRkIGEgbGlzdCBvZiBmaWxlcyB0byB0aGUgbWFuaWZlc3QuCgogICAgICAgIDpwYXJhbSBpdGVtczogVGhlIHBhdGhuYW1lcyB0byBhZGQuIFRoZXNlIGNhbiBiZSByZWxhdGl2ZSB0byB0aGUgYmFzZS4KICAgICAgICAiIiIKICAgICAgICBmb3IgaXRlbSBpbiBpdGVtczoKICAgICAgICAgICAgc2VsZi5hZGQoaXRlbSkKCiAgICBkZWYgc29ydGVkKHNlbGYsIHdhbnRkaXJzPUZhbHNlKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gc29ydGVkIGZpbGVzIGluIGRpcmVjdG9yeSBvcmRlcgogICAgICAgICIiIgoKICAgICAgICBkZWYgYWRkX2RpcihkaXJzLCBkKToKICAgICAgICAgICAgZGlycy5hZGQoZCkKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdhZGRfZGlyIGFkZGVkICVzJywgZCkKICAgICAgICAgICAgaWYgZCAhPSBzZWxmLmJhc2U6CiAgICAgICAgICAgICAgICBwYXJlbnQsIF8gPSBvcy5wYXRoLnNwbGl0KGQpCiAgICAgICAgICAgICAgICBhc3NlcnQgcGFyZW50IG5vdCBpbiAoJycsICcvJykKICAgICAgICAgICAgICAgIGFkZF9kaXIoZGlycywgcGFyZW50KQoKICAgICAgICByZXN1bHQgPSBzZXQoc2VsZi5maWxlcykgICAgIyBtYWtlIGEgY29weSEKICAgICAgICBpZiB3YW50ZGlyczoKICAgICAgICAgICAgZGlycyA9IHNldCgpCiAgICAgICAgICAgIGZvciBmIGluIHJlc3VsdDoKICAgICAgICAgICAgICAgIGFkZF9kaXIoZGlycywgb3MucGF0aC5kaXJuYW1lKGYpKQogICAgICAgICAgICByZXN1bHQgfD0gZGlycwogICAgICAgIHJldHVybiBbb3MucGF0aC5qb2luKCpwYXRoX3R1cGxlKSBmb3IgcGF0aF90dXBsZSBpbgogICAgICAgICAgICAgICAgc29ydGVkKG9zLnBhdGguc3BsaXQocGF0aCkgZm9yIHBhdGggaW4gcmVzdWx0KV0KCiAgICBkZWYgY2xlYXIoc2VsZik6CiAgICAgICAgIiIiQ2xlYXIgYWxsIGNvbGxlY3RlZCBmaWxlcy4iIiIKICAgICAgICBzZWxmLmZpbGVzID0gc2V0KCkKICAgICAgICBzZWxmLmFsbGZpbGVzID0gW10KCiAgICBkZWYgcHJvY2Vzc19kaXJlY3RpdmUoc2VsZiwgZGlyZWN0aXZlKToKICAgICAgICAiIiIKICAgICAgICBQcm9jZXNzIGEgZGlyZWN0aXZlIHdoaWNoIGVpdGhlciBhZGRzIHNvbWUgZmlsZXMgZnJvbSBgYGFsbGZpbGVzYGAgdG8KICAgICAgICBgYGZpbGVzYGAsIG9yIHJlbW92ZXMgc29tZSBmaWxlcyBmcm9tIGBgZmlsZXNgYC4KCiAgICAgICAgOnBhcmFtIGRpcmVjdGl2ZTogVGhlIGRpcmVjdGl2ZSB0byBwcm9jZXNzLiBUaGlzIHNob3VsZCBiZSBpbiBhIGZvcm1hdAogICAgICAgICAgICAgICAgICAgICBjb21wYXRpYmxlIHdpdGggZGlzdHV0aWxzIGBgTUFOSUZFU1QuaW5gYCBmaWxlczoKCiAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvZGlzdHV0aWxzL3NvdXJjZWRpc3QuaHRtbCNjb21tYW5kcwogICAgICAgICIiIgogICAgICAgICMgUGFyc2UgdGhlIGxpbmU6IHNwbGl0IGl0IHVwLCBtYWtlIHN1cmUgdGhlIHJpZ2h0IG51bWJlciBvZiB3b3JkcwogICAgICAgICMgaXMgdGhlcmUsIGFuZCByZXR1cm4gdGhlIHJlbGV2YW50IHdvcmRzLiAgJ2FjdGlvbicgaXMgYWx3YXlzCiAgICAgICAgIyBkZWZpbmVkOiBpdCdzIHRoZSBmaXJzdCB3b3JkIG9mIHRoZSBsaW5lLiAgV2hpY2ggb2YgdGhlIG90aGVyCiAgICAgICAgIyB0aHJlZSBhcmUgZGVmaW5lZCBkZXBlbmRzIG9uIHRoZSBhY3Rpb247IGl0J2xsIGJlIGVpdGhlcgogICAgICAgICMgcGF0dGVybnMsIChkaXIgYW5kIHBhdHRlcm5zKSwgb3IgKGRpcnBhdHRlcm4pLgogICAgICAgIGFjdGlvbiwgcGF0dGVybnMsIHRoZWRpciwgZGlycGF0dGVybiA9IHNlbGYuX3BhcnNlX2RpcmVjdGl2ZShkaXJlY3RpdmUpCgogICAgICAgICMgT0ssIG5vdyB3ZSBrbm93IHRoYXQgdGhlIGFjdGlvbiBpcyB2YWxpZCBhbmQgd2UgaGF2ZSB0aGUKICAgICAgICAjIHJpZ2h0IG51bWJlciBvZiB3b3JkcyBvbiB0aGUgbGluZSBmb3IgdGhhdCBhY3Rpb24gLS0gc28gd2UKICAgICAgICAjIGNhbiBwcm9jZWVkIHdpdGggbWluaW1hbCBlcnJvci1jaGVja2luZy4KICAgICAgICBpZiBhY3Rpb24gPT0gJ2luY2x1ZGUnOgogICAgICAgICAgICBmb3IgcGF0dGVybiBpbiBwYXR0ZXJuczoKICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9pbmNsdWRlX3BhdHRlcm4ocGF0dGVybiwgYW5jaG9yPVRydWUpOgogICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdubyBmaWxlcyBmb3VuZCBtYXRjaGluZyAlcicsIHBhdHRlcm4pCgogICAgICAgIGVsaWYgYWN0aW9uID09ICdleGNsdWRlJzoKICAgICAgICAgICAgZm9yIHBhdHRlcm4gaW4gcGF0dGVybnM6CiAgICAgICAgICAgICAgICBmb3VuZCA9IHNlbGYuX2V4Y2x1ZGVfcGF0dGVybihwYXR0ZXJuLCBhbmNob3I9VHJ1ZSkKICAgICAgICAgICAgICAgICNpZiBub3QgZm91bmQ6CiAgICAgICAgICAgICAgICAjICAgIGxvZ2dlci53YXJuaW5nKCdubyBwcmV2aW91c2x5LWluY2x1ZGVkIGZpbGVzICcKICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgJ2ZvdW5kIG1hdGNoaW5nICVyJywgcGF0dGVybikKCiAgICAgICAgZWxpZiBhY3Rpb24gPT0gJ2dsb2JhbC1pbmNsdWRlJzoKICAgICAgICAgICAgZm9yIHBhdHRlcm4gaW4gcGF0dGVybnM6CiAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5faW5jbHVkZV9wYXR0ZXJuKHBhdHRlcm4sIGFuY2hvcj1GYWxzZSk6CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ25vIGZpbGVzIGZvdW5kIG1hdGNoaW5nICVyICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYW55d2hlcmUgaW4gZGlzdHJpYnV0aW9uJywgcGF0dGVybikKCiAgICAgICAgZWxpZiBhY3Rpb24gPT0gJ2dsb2JhbC1leGNsdWRlJzoKICAgICAgICAgICAgZm9yIHBhdHRlcm4gaW4gcGF0dGVybnM6CiAgICAgICAgICAgICAgICBmb3VuZCA9IHNlbGYuX2V4Y2x1ZGVfcGF0dGVybihwYXR0ZXJuLCBhbmNob3I9RmFsc2UpCiAgICAgICAgICAgICAgICAjaWYgbm90IGZvdW5kOgogICAgICAgICAgICAgICAgIyAgICBsb2dnZXIud2FybmluZygnbm8gcHJldmlvdXNseS1pbmNsdWRlZCBmaWxlcyAnCiAgICAgICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgICdtYXRjaGluZyAlciBmb3VuZCBhbnl3aGVyZSBpbiAnCiAgICAgICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgICdkaXN0cmlidXRpb24nLCBwYXR0ZXJuKQoKICAgICAgICBlbGlmIGFjdGlvbiA9PSAncmVjdXJzaXZlLWluY2x1ZGUnOgogICAgICAgICAgICBmb3IgcGF0dGVybiBpbiBwYXR0ZXJuczoKICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9pbmNsdWRlX3BhdHRlcm4ocGF0dGVybiwgcHJlZml4PXRoZWRpcik6CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ25vIGZpbGVzIGZvdW5kIG1hdGNoaW5nICVyICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndW5kZXIgZGlyZWN0b3J5ICVyJywgcGF0dGVybiwgdGhlZGlyKQoKICAgICAgICBlbGlmIGFjdGlvbiA9PSAncmVjdXJzaXZlLWV4Y2x1ZGUnOgogICAgICAgICAgICBmb3IgcGF0dGVybiBpbiBwYXR0ZXJuczoKICAgICAgICAgICAgICAgIGZvdW5kID0gc2VsZi5fZXhjbHVkZV9wYXR0ZXJuKHBhdHRlcm4sIHByZWZpeD10aGVkaXIpCiAgICAgICAgICAgICAgICAjaWYgbm90IGZvdW5kOgogICAgICAgICAgICAgICAgIyAgICBsb2dnZXIud2FybmluZygnbm8gcHJldmlvdXNseS1pbmNsdWRlZCBmaWxlcyAnCiAgICAgICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgICdtYXRjaGluZyAlciBmb3VuZCB1bmRlciBkaXJlY3RvcnkgJXInLAogICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICBwYXR0ZXJuLCB0aGVkaXIpCgogICAgICAgIGVsaWYgYWN0aW9uID09ICdncmFmdCc6CiAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9pbmNsdWRlX3BhdHRlcm4oTm9uZSwgcHJlZml4PWRpcnBhdHRlcm4pOgogICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ25vIGRpcmVjdG9yaWVzIGZvdW5kIG1hdGNoaW5nICVyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcnBhdHRlcm4pCgogICAgICAgIGVsaWYgYWN0aW9uID09ICdwcnVuZSc6CiAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9leGNsdWRlX3BhdHRlcm4oTm9uZSwgcHJlZml4PWRpcnBhdHRlcm4pOgogICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ25vIHByZXZpb3VzbHktaW5jbHVkZWQgZGlyZWN0b3JpZXMgZm91bmQgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hdGNoaW5nICVyJywgZGlycGF0dGVybikKICAgICAgICBlbHNlOiAgICMgcHJhZ21hOiBubyBjb3ZlcgogICAgICAgICAgICAjIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiwgYXMgaXQgc2hvdWxkIGJlIGNhdWdodCBpbgogICAgICAgICAgICAjIF9wYXJzZV90ZW1wbGF0ZV9saW5lCiAgICAgICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAnaW52YWxpZCBhY3Rpb24gJXInICUgYWN0aW9uKQoKICAgICMKICAgICMgUHJpdmF0ZSBBUEkKICAgICMKCiAgICBkZWYgX3BhcnNlX2RpcmVjdGl2ZShzZWxmLCBkaXJlY3RpdmUpOgogICAgICAgICIiIgogICAgICAgIFZhbGlkYXRlIGEgZGlyZWN0aXZlLgogICAgICAgIDpwYXJhbSBkaXJlY3RpdmU6IFRoZSBkaXJlY3RpdmUgdG8gdmFsaWRhdGUuCiAgICAgICAgOnJldHVybjogQSB0dXBsZSBvZiBhY3Rpb24sIHBhdHRlcm5zLCB0aGVkaXIsIGRpcl9wYXR0ZXJucwogICAgICAgICIiIgogICAgICAgIHdvcmRzID0gZGlyZWN0aXZlLnNwbGl0KCkKICAgICAgICBpZiBsZW4od29yZHMpID09IDEgYW5kIHdvcmRzWzBdIG5vdCBpbiAoJ2luY2x1ZGUnLCAnZXhjbHVkZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnbG9iYWwtaW5jbHVkZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnbG9iYWwtZXhjbHVkZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyZWN1cnNpdmUtaW5jbHVkZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyZWN1cnNpdmUtZXhjbHVkZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdncmFmdCcsICdwcnVuZScpOgogICAgICAgICAgICAjIG5vIGFjdGlvbiBnaXZlbiwgbGV0J3MgdXNlIHRoZSBkZWZhdWx0ICdpbmNsdWRlJwogICAgICAgICAgICB3b3Jkcy5pbnNlcnQoMCwgJ2luY2x1ZGUnKQoKICAgICAgICBhY3Rpb24gPSB3b3Jkc1swXQogICAgICAgIHBhdHRlcm5zID0gdGhlZGlyID0gZGlyX3BhdHRlcm4gPSBOb25lCgogICAgICAgIGlmIGFjdGlvbiBpbiAoJ2luY2x1ZGUnLCAnZXhjbHVkZScsCiAgICAgICAgICAgICAgICAgICAgICAnZ2xvYmFsLWluY2x1ZGUnLCAnZ2xvYmFsLWV4Y2x1ZGUnKToKICAgICAgICAgICAgaWYgbGVuKHdvcmRzKSA8IDI6CiAgICAgICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgICAgICclciBleHBlY3RzIDxwYXR0ZXJuMT4gPHBhdHRlcm4yPiAuLi4nICUgYWN0aW9uKQoKICAgICAgICAgICAgcGF0dGVybnMgPSBbY29udmVydF9wYXRoKHdvcmQpIGZvciB3b3JkIGluIHdvcmRzWzE6XV0KCiAgICAgICAgZWxpZiBhY3Rpb24gaW4gKCdyZWN1cnNpdmUtaW5jbHVkZScsICdyZWN1cnNpdmUtZXhjbHVkZScpOgogICAgICAgICAgICBpZiBsZW4od29yZHMpIDwgMzoKICAgICAgICAgICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgICAgJyVyIGV4cGVjdHMgPGRpcj4gPHBhdHRlcm4xPiA8cGF0dGVybjI+IC4uLicgJSBhY3Rpb24pCgogICAgICAgICAgICB0aGVkaXIgPSBjb252ZXJ0X3BhdGgod29yZHNbMV0pCiAgICAgICAgICAgIHBhdHRlcm5zID0gW2NvbnZlcnRfcGF0aCh3b3JkKSBmb3Igd29yZCBpbiB3b3Jkc1syOl1dCgogICAgICAgIGVsaWYgYWN0aW9uIGluICgnZ3JhZnQnLCAncHJ1bmUnKToKICAgICAgICAgICAgaWYgbGVuKHdvcmRzKSAhPSAyOgogICAgICAgICAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICAgICAnJXIgZXhwZWN0cyBhIHNpbmdsZSA8ZGlyX3BhdHRlcm4+JyAlIGFjdGlvbikKCiAgICAgICAgICAgIGRpcl9wYXR0ZXJuID0gY29udmVydF9wYXRoKHdvcmRzWzFdKQoKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKCd1bmtub3duIGFjdGlvbiAlcicgJSBhY3Rpb24pCgogICAgICAgIHJldHVybiBhY3Rpb24sIHBhdHRlcm5zLCB0aGVkaXIsIGRpcl9wYXR0ZXJuCgogICAgZGVmIF9pbmNsdWRlX3BhdHRlcm4oc2VsZiwgcGF0dGVybiwgYW5jaG9yPVRydWUsIHByZWZpeD1Ob25lLAogICAgICAgICAgICAgICAgICAgICAgICAgaXNfcmVnZXg9RmFsc2UpOgogICAgICAgICIiIlNlbGVjdCBzdHJpbmdzIChwcmVzdW1hYmx5IGZpbGVuYW1lcykgZnJvbSAnc2VsZi5maWxlcycgdGhhdAogICAgICAgIG1hdGNoICdwYXR0ZXJuJywgYSBVbml4LXN0eWxlIHdpbGRjYXJkIChnbG9iKSBwYXR0ZXJuLgoKICAgICAgICBQYXR0ZXJucyBhcmUgbm90IHF1aXRlIHRoZSBzYW1lIGFzIGltcGxlbWVudGVkIGJ5IHRoZSAnZm5tYXRjaCcKICAgICAgICBtb2R1bGU6ICcqJyBhbmQgJz8nICBtYXRjaCBub24tc3BlY2lhbCBjaGFyYWN0ZXJzLCB3aGVyZSAic3BlY2lhbCIKICAgICAgICBpcyBwbGF0Zm9ybS1kZXBlbmRlbnQ6IHNsYXNoIG9uIFVuaXg7IGNvbG9uLCBzbGFzaCwgYW5kIGJhY2tzbGFzaCBvbgogICAgICAgIERPUy9XaW5kb3dzOyBhbmQgY29sb24gb24gTWFjIE9TLgoKICAgICAgICBJZiAnYW5jaG9yJyBpcyB0cnVlICh0aGUgZGVmYXVsdCksIHRoZW4gdGhlIHBhdHRlcm4gbWF0Y2ggaXMgbW9yZQogICAgICAgIHN0cmluZ2VudDogIioucHkiIHdpbGwgbWF0Y2ggImZvby5weSIgYnV0IG5vdCAiZm9vL2Jhci5weSIuICBJZgogICAgICAgICdhbmNob3InIGlzIGZhbHNlLCBib3RoIG9mIHRoZXNlIHdpbGwgbWF0Y2guCgogICAgICAgIElmICdwcmVmaXgnIGlzIHN1cHBsaWVkLCB0aGVuIG9ubHkgZmlsZW5hbWVzIHN0YXJ0aW5nIHdpdGggJ3ByZWZpeCcKICAgICAgICAoaXRzZWxmIGEgcGF0dGVybikgYW5kIGVuZGluZyB3aXRoICdwYXR0ZXJuJywgd2l0aCBhbnl0aGluZyBpbiBiZXR3ZWVuCiAgICAgICAgdGhlbSwgd2lsbCBtYXRjaC4gICdhbmNob3InIGlzIGlnbm9yZWQgaW4gdGhpcyBjYXNlLgoKICAgICAgICBJZiAnaXNfcmVnZXgnIGlzIHRydWUsICdhbmNob3InIGFuZCAncHJlZml4JyBhcmUgaWdub3JlZCwgYW5kCiAgICAgICAgJ3BhdHRlcm4nIGlzIGFzc3VtZWQgdG8gYmUgZWl0aGVyIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSByZWdleCBvciBhCiAgICAgICAgcmVnZXggb2JqZWN0IC0tIG5vIHRyYW5zbGF0aW9uIGlzIGRvbmUsIHRoZSByZWdleCBpcyBqdXN0IGNvbXBpbGVkCiAgICAgICAgYW5kIHVzZWQgYXMtaXMuCgogICAgICAgIFNlbGVjdGVkIHN0cmluZ3Mgd2lsbCBiZSBhZGRlZCB0byBzZWxmLmZpbGVzLgoKICAgICAgICBSZXR1cm4gVHJ1ZSBpZiBmaWxlcyBhcmUgZm91bmQuCiAgICAgICAgIiIiCiAgICAgICAgIyBYWFggZG9jc3RyaW5nIGx5aW5nIGFib3V0IHdoYXQgdGhlIHNwZWNpYWwgY2hhcnMgYXJlPwogICAgICAgIGZvdW5kID0gRmFsc2UKICAgICAgICBwYXR0ZXJuX3JlID0gc2VsZi5fdHJhbnNsYXRlX3BhdHRlcm4ocGF0dGVybiwgYW5jaG9yLCBwcmVmaXgsIGlzX3JlZ2V4KQoKICAgICAgICAjIGRlbGF5ZWQgbG9hZGluZyBvZiBhbGxmaWxlcyBsaXN0CiAgICAgICAgaWYgc2VsZi5hbGxmaWxlcyBpcyBOb25lOgogICAgICAgICAgICBzZWxmLmZpbmRhbGwoKQoKICAgICAgICBmb3IgbmFtZSBpbiBzZWxmLmFsbGZpbGVzOgogICAgICAgICAgICBpZiBwYXR0ZXJuX3JlLnNlYXJjaChuYW1lKToKICAgICAgICAgICAgICAgIHNlbGYuZmlsZXMuYWRkKG5hbWUpCiAgICAgICAgICAgICAgICBmb3VuZCA9IFRydWUKICAgICAgICByZXR1cm4gZm91bmQKCiAgICBkZWYgX2V4Y2x1ZGVfcGF0dGVybihzZWxmLCBwYXR0ZXJuLCBhbmNob3I9VHJ1ZSwgcHJlZml4PU5vbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICBpc19yZWdleD1GYWxzZSk6CiAgICAgICAgIiIiUmVtb3ZlIHN0cmluZ3MgKHByZXN1bWFibHkgZmlsZW5hbWVzKSBmcm9tICdmaWxlcycgdGhhdCBtYXRjaAogICAgICAgICdwYXR0ZXJuJy4KCiAgICAgICAgT3RoZXIgcGFyYW1ldGVycyBhcmUgdGhlIHNhbWUgYXMgZm9yICdpbmNsdWRlX3BhdHRlcm4oKScsIGFib3ZlLgogICAgICAgIFRoZSBsaXN0ICdzZWxmLmZpbGVzJyBpcyBtb2RpZmllZCBpbiBwbGFjZS4gUmV0dXJuIFRydWUgaWYgZmlsZXMgYXJlCiAgICAgICAgZm91bmQuCgogICAgICAgIFRoaXMgQVBJIGlzIHB1YmxpYyB0byBhbGxvdyBlLmcuIGV4Y2x1c2lvbiBvZiBTQ00gc3ViZGlycywgZS5nLiB3aGVuCiAgICAgICAgcGFja2FnaW5nIHNvdXJjZSBkaXN0cmlidXRpb25zCiAgICAgICAgIiIiCiAgICAgICAgZm91bmQgPSBGYWxzZQogICAgICAgIHBhdHRlcm5fcmUgPSBzZWxmLl90cmFuc2xhdGVfcGF0dGVybihwYXR0ZXJuLCBhbmNob3IsIHByZWZpeCwgaXNfcmVnZXgpCiAgICAgICAgZm9yIGYgaW4gbGlzdChzZWxmLmZpbGVzKToKICAgICAgICAgICAgaWYgcGF0dGVybl9yZS5zZWFyY2goZik6CiAgICAgICAgICAgICAgICBzZWxmLmZpbGVzLnJlbW92ZShmKQogICAgICAgICAgICAgICAgZm91bmQgPSBUcnVlCiAgICAgICAgcmV0dXJuIGZvdW5kCgogICAgZGVmIF90cmFuc2xhdGVfcGF0dGVybihzZWxmLCBwYXR0ZXJuLCBhbmNob3I9VHJ1ZSwgcHJlZml4PU5vbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3JlZ2V4PUZhbHNlKToKICAgICAgICAiIiJUcmFuc2xhdGUgYSBzaGVsbC1saWtlIHdpbGRjYXJkIHBhdHRlcm4gdG8gYSBjb21waWxlZCByZWd1bGFyCiAgICAgICAgZXhwcmVzc2lvbi4KCiAgICAgICAgUmV0dXJuIHRoZSBjb21waWxlZCByZWdleC4gIElmICdpc19yZWdleCcgdHJ1ZSwKICAgICAgICB0aGVuICdwYXR0ZXJuJyBpcyBkaXJlY3RseSBjb21waWxlZCB0byBhIHJlZ2V4IChpZiBpdCdzIGEgc3RyaW5nKQogICAgICAgIG9yIGp1c3QgcmV0dXJuZWQgYXMtaXMgKGFzc3VtZXMgaXQncyBhIHJlZ2V4IG9iamVjdCkuCiAgICAgICAgIiIiCiAgICAgICAgaWYgaXNfcmVnZXg6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UocGF0dGVybiwgc3RyKToKICAgICAgICAgICAgICAgIHJldHVybiByZS5jb21waWxlKHBhdHRlcm4pCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXR1cm4gcGF0dGVybgoKICAgICAgICBpZiBfUFlUSE9OX1ZFUlNJT04gPiAoMywgMik6CiAgICAgICAgICAgICMgZGl0Y2ggc3RhcnQgYW5kIGVuZCBjaGFyYWN0ZXJzCiAgICAgICAgICAgIHN0YXJ0LCBfLCBlbmQgPSBzZWxmLl9nbG9iX3RvX3JlKCdfJykucGFydGl0aW9uKCdfJykKCiAgICAgICAgaWYgcGF0dGVybjoKICAgICAgICAgICAgcGF0dGVybl9yZSA9IHNlbGYuX2dsb2JfdG9fcmUocGF0dGVybikKICAgICAgICAgICAgaWYgX1BZVEhPTl9WRVJTSU9OID4gKDMsIDIpOgogICAgICAgICAgICAgICAgYXNzZXJ0IHBhdHRlcm5fcmUuc3RhcnRzd2l0aChzdGFydCkgYW5kIHBhdHRlcm5fcmUuZW5kc3dpdGgoZW5kKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHBhdHRlcm5fcmUgPSAnJwoKICAgICAgICBiYXNlID0gcmUuZXNjYXBlKG9zLnBhdGguam9pbihzZWxmLmJhc2UsICcnKSkKICAgICAgICBpZiBwcmVmaXggaXMgbm90IE5vbmU6CiAgICAgICAgICAgICMgZGl0Y2ggZW5kIG9mIHBhdHRlcm4gY2hhcmFjdGVyCiAgICAgICAgICAgIGlmIF9QWVRIT05fVkVSU0lPTiA8PSAoMywgMik6CiAgICAgICAgICAgICAgICBlbXB0eV9wYXR0ZXJuID0gc2VsZi5fZ2xvYl90b19yZSgnJykKICAgICAgICAgICAgICAgIHByZWZpeF9yZSA9IHNlbGYuX2dsb2JfdG9fcmUocHJlZml4KVs6LWxlbihlbXB0eV9wYXR0ZXJuKV0KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHByZWZpeF9yZSA9IHNlbGYuX2dsb2JfdG9fcmUocHJlZml4KQogICAgICAgICAgICAgICAgYXNzZXJ0IHByZWZpeF9yZS5zdGFydHN3aXRoKHN0YXJ0KSBhbmQgcHJlZml4X3JlLmVuZHN3aXRoKGVuZCkKICAgICAgICAgICAgICAgIHByZWZpeF9yZSA9IHByZWZpeF9yZVtsZW4oc3RhcnQpOiBsZW4ocHJlZml4X3JlKSAtIGxlbihlbmQpXQogICAgICAgICAgICBzZXAgPSBvcy5zZXAKICAgICAgICAgICAgaWYgb3Muc2VwID09ICdcXCc6CiAgICAgICAgICAgICAgICBzZXAgPSByJ1xcJwogICAgICAgICAgICBpZiBfUFlUSE9OX1ZFUlNJT04gPD0gKDMsIDIpOgogICAgICAgICAgICAgICAgcGF0dGVybl9yZSA9ICdeJyArIGJhc2UgKyBzZXAuam9pbigocHJlZml4X3JlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy4qJyArIHBhdHRlcm5fcmUpKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcGF0dGVybl9yZSA9IHBhdHRlcm5fcmVbbGVuKHN0YXJ0KTogbGVuKHBhdHRlcm5fcmUpIC0gbGVuKGVuZCldCiAgICAgICAgICAgICAgICBwYXR0ZXJuX3JlID0gciclcyVzJXMlcy4qJXMlcycgJSAoc3RhcnQsIGJhc2UsIHByZWZpeF9yZSwgc2VwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm5fcmUsIGVuZCkKICAgICAgICBlbHNlOiAgIyBubyBwcmVmaXggLS0gcmVzcGVjdCBhbmNob3IgZmxhZwogICAgICAgICAgICBpZiBhbmNob3I6CiAgICAgICAgICAgICAgICBpZiBfUFlUSE9OX1ZFUlNJT04gPD0gKDMsIDIpOgogICAgICAgICAgICAgICAgICAgIHBhdHRlcm5fcmUgPSAnXicgKyBiYXNlICsgcGF0dGVybl9yZQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuX3JlID0gciclcyVzJXMnICUgKHN0YXJ0LCBiYXNlLCBwYXR0ZXJuX3JlW2xlbihzdGFydCk6XSkKCiAgICAgICAgcmV0dXJuIHJlLmNvbXBpbGUocGF0dGVybl9yZSkKCiAgICBkZWYgX2dsb2JfdG9fcmUoc2VsZiwgcGF0dGVybik6CiAgICAgICAgIiIiVHJhbnNsYXRlIGEgc2hlbGwtbGlrZSBnbG9iIHBhdHRlcm4gdG8gYSByZWd1bGFyIGV4cHJlc3Npb24uCgogICAgICAgIFJldHVybiBhIHN0cmluZyBjb250YWluaW5nIHRoZSByZWdleC4gIERpZmZlcnMgZnJvbQogICAgICAgICdmbm1hdGNoLnRyYW5zbGF0ZSgpJyBpbiB0aGF0ICcqJyBkb2VzIG5vdCBtYXRjaCAic3BlY2lhbCBjaGFyYWN0ZXJzIgogICAgICAgICh3aGljaCBhcmUgcGxhdGZvcm0tc3BlY2lmaWMpLgogICAgICAgICIiIgogICAgICAgIHBhdHRlcm5fcmUgPSBmbm1hdGNoLnRyYW5zbGF0ZShwYXR0ZXJuKQoKICAgICAgICAjICc/JyBhbmQgJyonIGluIHRoZSBnbG9iIHBhdHRlcm4gYmVjb21lICcuJyBhbmQgJy4qJyBpbiB0aGUgUkUsIHdoaWNoCiAgICAgICAgIyBJTUhPIGlzIHdyb25nIC0tICc/JyBhbmQgJyonIGFyZW4ndCBzdXBwb3NlZCB0byBtYXRjaCBzbGFzaCBpbiBVbml4LAogICAgICAgICMgYW5kIGJ5IGV4dGVuc2lvbiB0aGV5IHNob3VsZG4ndCBtYXRjaCBzdWNoICJzcGVjaWFsIGNoYXJhY3RlcnMiIHVuZGVyCiAgICAgICAgIyBhbnkgT1MuICBTbyBjaGFuZ2UgYWxsIG5vbi1lc2NhcGVkIGRvdHMgaW4gdGhlIFJFIHRvIG1hdGNoIGFueQogICAgICAgICMgY2hhcmFjdGVyIGV4Y2VwdCB0aGUgc3BlY2lhbCBjaGFyYWN0ZXJzIChjdXJyZW50bHk6IGp1c3Qgb3Muc2VwKS4KICAgICAgICBzZXAgPSBvcy5zZXAKICAgICAgICBpZiBvcy5zZXAgPT0gJ1xcJzoKICAgICAgICAgICAgIyB3ZSdyZSB1c2luZyBhIHJlZ2V4IHRvIG1hbmlwdWxhdGUgYSByZWdleCwgc28gd2UgbmVlZAogICAgICAgICAgICAjIHRvIGVzY2FwZSB0aGUgYmFja3NsYXNoIHR3aWNlCiAgICAgICAgICAgIHNlcCA9IHInXFxcXCcKICAgICAgICBlc2NhcGVkID0gcidcMVteJXNdJyAlIHNlcAogICAgICAgIHBhdHRlcm5fcmUgPSByZS5zdWIocicoKD88IVxcKShcXFxcKSopXC4nLCBlc2NhcGVkLCBwYXR0ZXJuX3JlKQogICAgICAgIHJldHVybiBwYXR0ZXJuX3JlClBLAwQUAAAAAAAAACEAPRGuAooYAACKGAAAOwAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvZGlzdGxpYi9tYXJrZXJzLnB5IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KIwojIENvcHlyaWdodCAoQykgMjAxMi0yMDEzIFZpbmF5IFNhamlwLgojIExpY2Vuc2VkIHRvIHRoZSBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbiB1bmRlciBhIGNvbnRyaWJ1dG9yIGFncmVlbWVudC4KIyBTZWUgTElDRU5TRS50eHQgYW5kIENPTlRSSUJVVE9SUy50eHQuCiMKIiIiUGFyc2VyIGZvciB0aGUgZW52aXJvbm1lbnQgbWFya2VycyBtaWNyby1sYW5ndWFnZSBkZWZpbmVkIGluIFBFUCAzNDUuIiIiCgppbXBvcnQgYXN0CmltcG9ydCBvcwppbXBvcnQgc3lzCmltcG9ydCBwbGF0Zm9ybQoKZnJvbSAuY29tcGF0IGltcG9ydCBweXRob25faW1wbGVtZW50YXRpb24sIHN0cmluZ190eXBlcwpmcm9tIC51dGlsIGltcG9ydCBpbl92ZW52CgpfX2FsbF9fID0gWydpbnRlcnByZXQnXQoKCmNsYXNzIEV2YWx1YXRvcihvYmplY3QpOgogICAgIiIiCiAgICBBIGxpbWl0ZWQgZXZhbHVhdG9yIGZvciBQeXRob24gZXhwcmVzc2lvbnMuCiAgICAiIiIKCiAgICBvcGVyYXRvcnMgPSB7CiAgICAgICAgJ2VxJzogbGFtYmRhIHgsIHk6IHggPT0geSwKICAgICAgICAnZ3QnOiBsYW1iZGEgeCwgeTogeCA+IHksCiAgICAgICAgJ2d0ZSc6IGxhbWJkYSB4LCB5OiB4ID49IHksCiAgICAgICAgJ2luJzogbGFtYmRhIHgsIHk6IHggaW4geSwKICAgICAgICAnbHQnOiBsYW1iZGEgeCwgeTogeCA8IHksCiAgICAgICAgJ2x0ZSc6IGxhbWJkYSB4LCB5OiB4IDw9IHksCiAgICAgICAgJ25vdCc6IGxhbWJkYSB4OiBub3QgeCwKICAgICAgICAnbm90ZXEnOiBsYW1iZGEgeCwgeTogeCAhPSB5LAogICAgICAgICdub3Rpbic6IGxhbWJkYSB4LCB5OiB4IG5vdCBpbiB5LAogICAgfQoKICAgIGFsbG93ZWRfdmFsdWVzID0gewogICAgICAgICdzeXNfcGxhdGZvcm0nOiBzeXMucGxhdGZvcm0sCiAgICAgICAgJ3B5dGhvbl92ZXJzaW9uJzogJyVzLiVzJyAlIHN5cy52ZXJzaW9uX2luZm9bOjJdLAogICAgICAgICMgcGFyc2luZyBzeXMucGxhdGZvcm0gaXMgbm90IHJlbGlhYmxlLCBidXQgdGhlcmUgaXMgbm8gb3RoZXIKICAgICAgICAjIHdheSB0byBnZXQgZS5nLiAyLjcuMissIGFuZCB0aGUgUEVQIGlzIGRlZmluZWQgd2l0aCBzeXMudmVyc2lvbgogICAgICAgICdweXRob25fZnVsbF92ZXJzaW9uJzogc3lzLnZlcnNpb24uc3BsaXQoJyAnLCAxKVswXSwKICAgICAgICAnb3NfbmFtZSc6IG9zLm5hbWUsCiAgICAgICAgJ3BsYXRmb3JtX2luX3ZlbnYnOiBzdHIoaW5fdmVudigpKSwKICAgICAgICAncGxhdGZvcm1fcmVsZWFzZSc6IHBsYXRmb3JtLnJlbGVhc2UoKSwKICAgICAgICAncGxhdGZvcm1fdmVyc2lvbic6IHBsYXRmb3JtLnZlcnNpb24oKSwKICAgICAgICAncGxhdGZvcm1fbWFjaGluZSc6IHBsYXRmb3JtLm1hY2hpbmUoKSwKICAgICAgICAncGxhdGZvcm1fcHl0aG9uX2ltcGxlbWVudGF0aW9uJzogcHl0aG9uX2ltcGxlbWVudGF0aW9uKCksCiAgICB9CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbnRleHQ9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgSW5pdGlhbGlzZSBhbiBpbnN0YW5jZS4KCiAgICAgICAgOnBhcmFtIGNvbnRleHQ6IElmIHNwZWNpZmllZCwgbmFtZXMgYXJlIGxvb2tlZCB1cCBpbiB0aGlzIG1hcHBpbmcuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5jb250ZXh0ID0gY29udGV4dCBvciB7fQogICAgICAgIHNlbGYuc291cmNlID0gTm9uZQoKICAgIGRlZiBnZXRfZnJhZ21lbnQoc2VsZiwgb2Zmc2V0KToKICAgICAgICAiIiIKICAgICAgICBHZXQgdGhlIHBhcnQgb2YgdGhlIHNvdXJjZSB3aGljaCBpcyBjYXVzaW5nIGEgcHJvYmxlbS4KICAgICAgICAiIiIKICAgICAgICBmcmFnbWVudF9sZW4gPSAxMAogICAgICAgIHMgPSAnJXInICUgKHNlbGYuc291cmNlW29mZnNldDpvZmZzZXQgKyBmcmFnbWVudF9sZW5dKQogICAgICAgIGlmIG9mZnNldCArIGZyYWdtZW50X2xlbiA8IGxlbihzZWxmLnNvdXJjZSk6CiAgICAgICAgICAgIHMgKz0gJy4uLicKICAgICAgICByZXR1cm4gcwoKICAgIGRlZiBnZXRfaGFuZGxlcihzZWxmLCBub2RlX3R5cGUpOgogICAgICAgICIiIgogICAgICAgIEdldCBhIGhhbmRsZXIgZm9yIHRoZSBzcGVjaWZpZWQgQVNUIG5vZGUgdHlwZS4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLCAnZG9fJXMnICUgbm9kZV90eXBlLCBOb25lKQoKICAgIGRlZiBldmFsdWF0ZShzZWxmLCBub2RlLCBmaWxlbmFtZT1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBFdmFsdWF0ZSBhIHNvdXJjZSBzdHJpbmcgb3Igbm9kZSwgdXNpbmcgYGBmaWxlbmFtZWBgIHdoZW4KICAgICAgICBkaXNwbGF5aW5nIGVycm9ycy4KICAgICAgICAiIiIKICAgICAgICBpZiBpc2luc3RhbmNlKG5vZGUsIHN0cmluZ190eXBlcyk6CiAgICAgICAgICAgIHNlbGYuc291cmNlID0gbm9kZQogICAgICAgICAgICBrd2FyZ3MgPSB7J21vZGUnOiAnZXZhbCd9CiAgICAgICAgICAgIGlmIGZpbGVuYW1lOgogICAgICAgICAgICAgICAga3dhcmdzWydmaWxlbmFtZSddID0gZmlsZW5hbWUKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgbm9kZSA9IGFzdC5wYXJzZShub2RlLCAqKmt3YXJncykKICAgICAgICAgICAgZXhjZXB0IFN5bnRheEVycm9yIGFzIGU6CiAgICAgICAgICAgICAgICBzID0gc2VsZi5nZXRfZnJhZ21lbnQoZS5vZmZzZXQpCiAgICAgICAgICAgICAgICByYWlzZSBTeW50YXhFcnJvcignc3ludGF4IGVycm9yICVzJyAlIHMpCiAgICAgICAgbm9kZV90eXBlID0gbm9kZS5fX2NsYXNzX18uX19uYW1lX18ubG93ZXIoKQogICAgICAgIGhhbmRsZXIgPSBzZWxmLmdldF9oYW5kbGVyKG5vZGVfdHlwZSkKICAgICAgICBpZiBoYW5kbGVyIGlzIE5vbmU6CiAgICAgICAgICAgIGlmIHNlbGYuc291cmNlIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBzID0gJyhzb3VyY2Ugbm90IGF2YWlsYWJsZSknCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzID0gc2VsZi5nZXRfZnJhZ21lbnQobm9kZS5jb2xfb2Zmc2V0KQogICAgICAgICAgICByYWlzZSBTeW50YXhFcnJvcigiZG9uJ3Qga25vdyBob3cgdG8gZXZhbHVhdGUgJXIgJXMiICUgKAogICAgICAgICAgICAgICAgbm9kZV90eXBlLCBzKSkKICAgICAgICByZXR1cm4gaGFuZGxlcihub2RlKQoKICAgIGRlZiBnZXRfYXR0cl9rZXkoc2VsZiwgbm9kZSk6CiAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2Uobm9kZSwgYXN0LkF0dHJpYnV0ZSksICdhdHRyaWJ1dGUgbm9kZSBleHBlY3RlZCcKICAgICAgICByZXR1cm4gJyVzLiVzJyAlIChub2RlLnZhbHVlLmlkLCBub2RlLmF0dHIpCgogICAgZGVmIGRvX2F0dHJpYnV0ZShzZWxmLCBub2RlKToKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShub2RlLnZhbHVlLCBhc3QuTmFtZSk6CiAgICAgICAgICAgIHZhbGlkID0gRmFsc2UKICAgICAgICBlbHNlOgogICAgICAgICAgICBrZXkgPSBzZWxmLmdldF9hdHRyX2tleShub2RlKQogICAgICAgICAgICB2YWxpZCA9IGtleSBpbiBzZWxmLmNvbnRleHQgb3Iga2V5IGluIHNlbGYuYWxsb3dlZF92YWx1ZXMKICAgICAgICBpZiBub3QgdmFsaWQ6CiAgICAgICAgICAgIHJhaXNlIFN5bnRheEVycm9yKCdpbnZhbGlkIGV4cHJlc3Npb246ICVzJyAlIGtleSkKICAgICAgICBpZiBrZXkgaW4gc2VsZi5jb250ZXh0OgogICAgICAgICAgICByZXN1bHQgPSBzZWxmLmNvbnRleHRba2V5XQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuYWxsb3dlZF92YWx1ZXNba2V5XQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgZG9fYm9vbG9wKHNlbGYsIG5vZGUpOgogICAgICAgIHJlc3VsdCA9IHNlbGYuZXZhbHVhdGUobm9kZS52YWx1ZXNbMF0pCiAgICAgICAgaXNfb3IgPSBub2RlLm9wLl9fY2xhc3NfXyBpcyBhc3QuT3IKICAgICAgICBpc19hbmQgPSBub2RlLm9wLl9fY2xhc3NfXyBpcyBhc3QuQW5kCiAgICAgICAgYXNzZXJ0IGlzX29yIG9yIGlzX2FuZAogICAgICAgIGlmIChpc19hbmQgYW5kIHJlc3VsdCkgb3IgKGlzX29yIGFuZCBub3QgcmVzdWx0KToKICAgICAgICAgICAgZm9yIG4gaW4gbm9kZS52YWx1ZXNbMTpdOgogICAgICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5ldmFsdWF0ZShuKQogICAgICAgICAgICAgICAgaWYgKGlzX29yIGFuZCByZXN1bHQpIG9yIChpc19hbmQgYW5kIG5vdCByZXN1bHQpOgogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBkb19jb21wYXJlKHNlbGYsIG5vZGUpOgogICAgICAgIGRlZiBzYW5pdHlfY2hlY2sobGhzbm9kZSwgcmhzbm9kZSk6CiAgICAgICAgICAgIHZhbGlkID0gVHJ1ZQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGxoc25vZGUsIGFzdC5TdHIpIGFuZCBpc2luc3RhbmNlKHJoc25vZGUsIGFzdC5TdHIpOgogICAgICAgICAgICAgICAgdmFsaWQgPSBGYWxzZQogICAgICAgICAgICAjZWxpZiAoaXNpbnN0YW5jZShsaHNub2RlLCBhc3QuQXR0cmlidXRlKQogICAgICAgICAgICAjICAgICAgYW5kIGlzaW5zdGFuY2Uocmhzbm9kZSwgYXN0LkF0dHJpYnV0ZSkpOgogICAgICAgICAgICAjICAgIGtsaHMgPSBzZWxmLmdldF9hdHRyX2tleShsaHNub2RlKQogICAgICAgICAgICAjICAgIGtyaHMgPSBzZWxmLmdldF9hdHRyX2tleShyaHNub2RlKQogICAgICAgICAgICAjICAgIHZhbGlkID0ga2xocyAhPSBrcmhzCiAgICAgICAgICAgIGlmIG5vdCB2YWxpZDoKICAgICAgICAgICAgICAgIHMgPSBzZWxmLmdldF9mcmFnbWVudChub2RlLmNvbF9vZmZzZXQpCiAgICAgICAgICAgICAgICByYWlzZSBTeW50YXhFcnJvcignSW52YWxpZCBjb21wYXJpc29uOiAlcycgJSBzKQoKICAgICAgICBsaHNub2RlID0gbm9kZS5sZWZ0CiAgICAgICAgbGhzID0gc2VsZi5ldmFsdWF0ZShsaHNub2RlKQogICAgICAgIHJlc3VsdCA9IFRydWUKICAgICAgICBmb3Igb3AsIHJoc25vZGUgaW4gemlwKG5vZGUub3BzLCBub2RlLmNvbXBhcmF0b3JzKToKICAgICAgICAgICAgc2FuaXR5X2NoZWNrKGxoc25vZGUsIHJoc25vZGUpCiAgICAgICAgICAgIG9wID0gb3AuX19jbGFzc19fLl9fbmFtZV9fLmxvd2VyKCkKICAgICAgICAgICAgaWYgb3Agbm90IGluIHNlbGYub3BlcmF0b3JzOgogICAgICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IoJ3Vuc3VwcG9ydGVkIG9wZXJhdGlvbjogJXInICUgb3ApCiAgICAgICAgICAgIHJocyA9IHNlbGYuZXZhbHVhdGUocmhzbm9kZSkKICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5vcGVyYXRvcnNbb3BdKGxocywgcmhzKQogICAgICAgICAgICBpZiBub3QgcmVzdWx0OgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgbGhzID0gcmhzCiAgICAgICAgICAgIGxoc25vZGUgPSByaHNub2RlCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBkb19leHByZXNzaW9uKHNlbGYsIG5vZGUpOgogICAgICAgIHJldHVybiBzZWxmLmV2YWx1YXRlKG5vZGUuYm9keSkKCiAgICBkZWYgZG9fbmFtZShzZWxmLCBub2RlKToKICAgICAgICB2YWxpZCA9IEZhbHNlCiAgICAgICAgaWYgbm9kZS5pZCBpbiBzZWxmLmNvbnRleHQ6CiAgICAgICAgICAgIHZhbGlkID0gVHJ1ZQogICAgICAgICAgICByZXN1bHQgPSBzZWxmLmNvbnRleHRbbm9kZS5pZF0KICAgICAgICBlbGlmIG5vZGUuaWQgaW4gc2VsZi5hbGxvd2VkX3ZhbHVlczoKICAgICAgICAgICAgdmFsaWQgPSBUcnVlCiAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuYWxsb3dlZF92YWx1ZXNbbm9kZS5pZF0KICAgICAgICBpZiBub3QgdmFsaWQ6CiAgICAgICAgICAgIHJhaXNlIFN5bnRheEVycm9yKCdpbnZhbGlkIGV4cHJlc3Npb246ICVzJyAlIG5vZGUuaWQpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBkb19zdHIoc2VsZiwgbm9kZSk6CiAgICAgICAgcmV0dXJuIG5vZGUucwoKCmRlZiBpbnRlcnByZXQobWFya2VyLCBleGVjdXRpb25fY29udGV4dD1Ob25lKToKICAgICIiIgogICAgSW50ZXJwcmV0IGEgbWFya2VyIGFuZCByZXR1cm4gYSByZXN1bHQgZGVwZW5kaW5nIG9uIGVudmlyb25tZW50LgoKICAgIDpwYXJhbSBtYXJrZXI6IFRoZSBtYXJrZXIgdG8gaW50ZXJwcmV0LgogICAgOnR5cGUgbWFya2VyOiBzdHIKICAgIDpwYXJhbSBleGVjdXRpb25fY29udGV4dDogVGhlIGNvbnRleHQgdXNlZCBmb3IgbmFtZSBsb29rdXAuCiAgICA6dHlwZSBleGVjdXRpb25fY29udGV4dDogbWFwcGluZwogICAgIiIiCiAgICByZXR1cm4gRXZhbHVhdG9yKGV4ZWN1dGlvbl9jb250ZXh0KS5ldmFsdWF0ZShtYXJrZXIuc3RyaXAoKSkKUEsDBBQAAAAAAAAAIQANpmzxsZcAALGXAAA8AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0bGliL21ldGFkYXRhLnB5IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KIwojIENvcHlyaWdodCAoQykgMjAxMiBUaGUgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24uCiMgU2VlIExJQ0VOU0UudHh0IGFuZCBDT05UUklCVVRPUlMudHh0LgojCiIiIkltcGxlbWVudGF0aW9uIG9mIHRoZSBNZXRhZGF0YSBmb3IgUHl0aG9uIHBhY2thZ2VzIFBFUHMuCgpTdXBwb3J0cyBhbGwgbWV0YWRhdGEgZm9ybWF0cyAoMS4wLCAxLjEsIDEuMiwgYW5kIDIuMCBleHBlcmltZW50YWwpLgoiIiIKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCB1bmljb2RlX2xpdGVyYWxzCgppbXBvcnQgY29kZWNzCmZyb20gZW1haWwgaW1wb3J0IG1lc3NhZ2VfZnJvbV9maWxlCmltcG9ydCBqc29uCmltcG9ydCBsb2dnaW5nCmltcG9ydCByZQoKCmZyb20gLiBpbXBvcnQgRGlzdGxpYkV4Y2VwdGlvbiwgX192ZXJzaW9uX18KZnJvbSAuY29tcGF0IGltcG9ydCBTdHJpbmdJTywgc3RyaW5nX3R5cGVzLCB0ZXh0X3R5cGUKZnJvbSAubWFya2VycyBpbXBvcnQgaW50ZXJwcmV0CmZyb20gLnV0aWwgaW1wb3J0IGV4dHJhY3RfYnlfa2V5LCBnZXRfZXh0cmFzCmZyb20gLnZlcnNpb24gaW1wb3J0IGdldF9zY2hlbWUsIFBFUDQ0MF9WRVJTSU9OX1JFCgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCgpjbGFzcyBNZXRhZGF0YU1pc3NpbmdFcnJvcihEaXN0bGliRXhjZXB0aW9uKToKICAgICIiIkEgcmVxdWlyZWQgbWV0YWRhdGEgaXMgbWlzc2luZyIiIgoKCmNsYXNzIE1ldGFkYXRhQ29uZmxpY3RFcnJvcihEaXN0bGliRXhjZXB0aW9uKToKICAgICIiIkF0dGVtcHQgdG8gcmVhZCBvciB3cml0ZSBtZXRhZGF0YSBmaWVsZHMgdGhhdCBhcmUgY29uZmxpY3R1YWwuIiIiCgoKY2xhc3MgTWV0YWRhdGFVbnJlY29nbml6ZWRWZXJzaW9uRXJyb3IoRGlzdGxpYkV4Y2VwdGlvbik6CiAgICAiIiJVbmtub3duIG1ldGFkYXRhIHZlcnNpb24gbnVtYmVyLiIiIgoKCmNsYXNzIE1ldGFkYXRhSW52YWxpZEVycm9yKERpc3RsaWJFeGNlcHRpb24pOgogICAgIiIiQSBtZXRhZGF0YSB2YWx1ZSBpcyBpbnZhbGlkIiIiCgojIHB1YmxpYyBBUEkgb2YgdGhpcyBtb2R1bGUKX19hbGxfXyA9IFsnTWV0YWRhdGEnLCAnUEtHX0lORk9fRU5DT0RJTkcnLCAnUEtHX0lORk9fUFJFRkVSUkVEX1ZFUlNJT04nXQoKIyBFbmNvZGluZyB1c2VkIGZvciB0aGUgUEtHLUlORk8gZmlsZXMKUEtHX0lORk9fRU5DT0RJTkcgPSAndXRmLTgnCgojIHByZWZlcnJlZCB2ZXJzaW9uLiBIb3BlZnVsbHkgd2lsbCBiZSBjaGFuZ2VkCiMgdG8gMS4yIG9uY2UgUEVQIDM0NSBpcyBzdXBwb3J0ZWQgZXZlcnl3aGVyZQpQS0dfSU5GT19QUkVGRVJSRURfVkVSU0lPTiA9ICcxLjEnCgpfTElORV9QUkVGSVhfMV8yID0gcmUuY29tcGlsZSgnXG4gICAgICAgXHwnKQpfTElORV9QUkVGSVhfUFJFXzFfMiA9IHJlLmNvbXBpbGUoJ1xuICAgICAgICAnKQpfMjQxX0ZJRUxEUyA9ICgnTWV0YWRhdGEtVmVyc2lvbicsICdOYW1lJywgJ1ZlcnNpb24nLCAnUGxhdGZvcm0nLAogICAgICAgICAgICAgICAnU3VtbWFyeScsICdEZXNjcmlwdGlvbicsCiAgICAgICAgICAgICAgICdLZXl3b3JkcycsICdIb21lLXBhZ2UnLCAnQXV0aG9yJywgJ0F1dGhvci1lbWFpbCcsCiAgICAgICAgICAgICAgICdMaWNlbnNlJykKCl8zMTRfRklFTERTID0gKCdNZXRhZGF0YS1WZXJzaW9uJywgJ05hbWUnLCAnVmVyc2lvbicsICdQbGF0Zm9ybScsCiAgICAgICAgICAgICAgICdTdXBwb3J0ZWQtUGxhdGZvcm0nLCAnU3VtbWFyeScsICdEZXNjcmlwdGlvbicsCiAgICAgICAgICAgICAgICdLZXl3b3JkcycsICdIb21lLXBhZ2UnLCAnQXV0aG9yJywgJ0F1dGhvci1lbWFpbCcsCiAgICAgICAgICAgICAgICdMaWNlbnNlJywgJ0NsYXNzaWZpZXInLCAnRG93bmxvYWQtVVJMJywgJ09ic29sZXRlcycsCiAgICAgICAgICAgICAgICdQcm92aWRlcycsICdSZXF1aXJlcycpCgpfMzE0X01BUktFUlMgPSAoJ09ic29sZXRlcycsICdQcm92aWRlcycsICdSZXF1aXJlcycsICdDbGFzc2lmaWVyJywKICAgICAgICAgICAgICAgICdEb3dubG9hZC1VUkwnKQoKXzM0NV9GSUVMRFMgPSAoJ01ldGFkYXRhLVZlcnNpb24nLCAnTmFtZScsICdWZXJzaW9uJywgJ1BsYXRmb3JtJywKICAgICAgICAgICAgICAgJ1N1cHBvcnRlZC1QbGF0Zm9ybScsICdTdW1tYXJ5JywgJ0Rlc2NyaXB0aW9uJywKICAgICAgICAgICAgICAgJ0tleXdvcmRzJywgJ0hvbWUtcGFnZScsICdBdXRob3InLCAnQXV0aG9yLWVtYWlsJywKICAgICAgICAgICAgICAgJ01haW50YWluZXInLCAnTWFpbnRhaW5lci1lbWFpbCcsICdMaWNlbnNlJywKICAgICAgICAgICAgICAgJ0NsYXNzaWZpZXInLCAnRG93bmxvYWQtVVJMJywgJ09ic29sZXRlcy1EaXN0JywKICAgICAgICAgICAgICAgJ1Byb2plY3QtVVJMJywgJ1Byb3ZpZGVzLURpc3QnLCAnUmVxdWlyZXMtRGlzdCcsCiAgICAgICAgICAgICAgICdSZXF1aXJlcy1QeXRob24nLCAnUmVxdWlyZXMtRXh0ZXJuYWwnKQoKXzM0NV9NQVJLRVJTID0gKCdQcm92aWRlcy1EaXN0JywgJ1JlcXVpcmVzLURpc3QnLCAnUmVxdWlyZXMtUHl0aG9uJywKICAgICAgICAgICAgICAgICdPYnNvbGV0ZXMtRGlzdCcsICdSZXF1aXJlcy1FeHRlcm5hbCcsICdNYWludGFpbmVyJywKICAgICAgICAgICAgICAgICdNYWludGFpbmVyLWVtYWlsJywgJ1Byb2plY3QtVVJMJykKCl80MjZfRklFTERTID0gKCdNZXRhZGF0YS1WZXJzaW9uJywgJ05hbWUnLCAnVmVyc2lvbicsICdQbGF0Zm9ybScsCiAgICAgICAgICAgICAgICdTdXBwb3J0ZWQtUGxhdGZvcm0nLCAnU3VtbWFyeScsICdEZXNjcmlwdGlvbicsCiAgICAgICAgICAgICAgICdLZXl3b3JkcycsICdIb21lLXBhZ2UnLCAnQXV0aG9yJywgJ0F1dGhvci1lbWFpbCcsCiAgICAgICAgICAgICAgICdNYWludGFpbmVyJywgJ01haW50YWluZXItZW1haWwnLCAnTGljZW5zZScsCiAgICAgICAgICAgICAgICdDbGFzc2lmaWVyJywgJ0Rvd25sb2FkLVVSTCcsICdPYnNvbGV0ZXMtRGlzdCcsCiAgICAgICAgICAgICAgICdQcm9qZWN0LVVSTCcsICdQcm92aWRlcy1EaXN0JywgJ1JlcXVpcmVzLURpc3QnLAogICAgICAgICAgICAgICAnUmVxdWlyZXMtUHl0aG9uJywgJ1JlcXVpcmVzLUV4dGVybmFsJywgJ1ByaXZhdGUtVmVyc2lvbicsCiAgICAgICAgICAgICAgICdPYnNvbGV0ZWQtQnknLCAnU2V0dXAtUmVxdWlyZXMtRGlzdCcsICdFeHRlbnNpb24nLAogICAgICAgICAgICAgICAnUHJvdmlkZXMtRXh0cmEnKQoKXzQyNl9NQVJLRVJTID0gKCdQcml2YXRlLVZlcnNpb24nLCAnUHJvdmlkZXMtRXh0cmEnLCAnT2Jzb2xldGVkLUJ5JywKICAgICAgICAgICAgICAgICdTZXR1cC1SZXF1aXJlcy1EaXN0JywgJ0V4dGVuc2lvbicpCgpfQUxMX0ZJRUxEUyA9IHNldCgpCl9BTExfRklFTERTLnVwZGF0ZShfMjQxX0ZJRUxEUykKX0FMTF9GSUVMRFMudXBkYXRlKF8zMTRfRklFTERTKQpfQUxMX0ZJRUxEUy51cGRhdGUoXzM0NV9GSUVMRFMpCl9BTExfRklFTERTLnVwZGF0ZShfNDI2X0ZJRUxEUykKCkVYVFJBX1JFID0gcmUuY29tcGlsZShyJycnZXh0cmFccyo9PVxzKigiKFteIl0rKSJ8JyhbXiddKyknKScnJykKCgpkZWYgX3ZlcnNpb24yZmllbGRsaXN0KHZlcnNpb24pOgogICAgaWYgdmVyc2lvbiA9PSAnMS4wJzoKICAgICAgICByZXR1cm4gXzI0MV9GSUVMRFMKICAgIGVsaWYgdmVyc2lvbiA9PSAnMS4xJzoKICAgICAgICByZXR1cm4gXzMxNF9GSUVMRFMKICAgIGVsaWYgdmVyc2lvbiA9PSAnMS4yJzoKICAgICAgICByZXR1cm4gXzM0NV9GSUVMRFMKICAgIGVsaWYgdmVyc2lvbiA9PSAnMi4wJzoKICAgICAgICByZXR1cm4gXzQyNl9GSUVMRFMKICAgIHJhaXNlIE1ldGFkYXRhVW5yZWNvZ25pemVkVmVyc2lvbkVycm9yKHZlcnNpb24pCgoKZGVmIF9iZXN0X3ZlcnNpb24oZmllbGRzKToKICAgICIiIkRldGVjdCB0aGUgYmVzdCB2ZXJzaW9uIGRlcGVuZGluZyBvbiB0aGUgZmllbGRzIHVzZWQuIiIiCiAgICBkZWYgX2hhc19tYXJrZXIoa2V5cywgbWFya2Vycyk6CiAgICAgICAgZm9yIG1hcmtlciBpbiBtYXJrZXJzOgogICAgICAgICAgICBpZiBtYXJrZXIgaW4ga2V5czoKICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAga2V5cyA9IFtdCiAgICBmb3Iga2V5LCB2YWx1ZSBpbiBmaWVsZHMuaXRlbXMoKToKICAgICAgICBpZiB2YWx1ZSBpbiAoW10sICdVTktOT1dOJywgTm9uZSk6CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAga2V5cy5hcHBlbmQoa2V5KQoKICAgIHBvc3NpYmxlX3ZlcnNpb25zID0gWycxLjAnLCAnMS4xJywgJzEuMicsICcyLjAnXQoKICAgICMgZmlyc3QgbGV0J3MgdHJ5IHRvIHNlZSBpZiBhIGZpZWxkIGlzIG5vdCBwYXJ0IG9mIG9uZSBvZiB0aGUgdmVyc2lvbgogICAgZm9yIGtleSBpbiBrZXlzOgogICAgICAgIGlmIGtleSBub3QgaW4gXzI0MV9GSUVMRFMgYW5kICcxLjAnIGluIHBvc3NpYmxlX3ZlcnNpb25zOgogICAgICAgICAgICBwb3NzaWJsZV92ZXJzaW9ucy5yZW1vdmUoJzEuMCcpCiAgICAgICAgaWYga2V5IG5vdCBpbiBfMzE0X0ZJRUxEUyBhbmQgJzEuMScgaW4gcG9zc2libGVfdmVyc2lvbnM6CiAgICAgICAgICAgIHBvc3NpYmxlX3ZlcnNpb25zLnJlbW92ZSgnMS4xJykKICAgICAgICBpZiBrZXkgbm90IGluIF8zNDVfRklFTERTIGFuZCAnMS4yJyBpbiBwb3NzaWJsZV92ZXJzaW9uczoKICAgICAgICAgICAgcG9zc2libGVfdmVyc2lvbnMucmVtb3ZlKCcxLjInKQogICAgICAgIGlmIGtleSBub3QgaW4gXzQyNl9GSUVMRFMgYW5kICcyLjAnIGluIHBvc3NpYmxlX3ZlcnNpb25zOgogICAgICAgICAgICBwb3NzaWJsZV92ZXJzaW9ucy5yZW1vdmUoJzIuMCcpCgogICAgIyBwb3NzaWJsZV92ZXJzaW9uIGNvbnRhaW5zIHF1YWxpZmllZCB2ZXJzaW9ucwogICAgaWYgbGVuKHBvc3NpYmxlX3ZlcnNpb25zKSA9PSAxOgogICAgICAgIHJldHVybiBwb3NzaWJsZV92ZXJzaW9uc1swXSAgICMgZm91bmQgIQogICAgZWxpZiBsZW4ocG9zc2libGVfdmVyc2lvbnMpID09IDA6CiAgICAgICAgcmFpc2UgTWV0YWRhdGFDb25mbGljdEVycm9yKCdVbmtub3duIG1ldGFkYXRhIHNldCcpCgogICAgIyBsZXQncyBzZWUgaWYgb25lIHVuaXF1ZSBtYXJrZXIgaXMgZm91bmQKICAgIGlzXzFfMSA9ICcxLjEnIGluIHBvc3NpYmxlX3ZlcnNpb25zIGFuZCBfaGFzX21hcmtlcihrZXlzLCBfMzE0X01BUktFUlMpCiAgICBpc18xXzIgPSAnMS4yJyBpbiBwb3NzaWJsZV92ZXJzaW9ucyBhbmQgX2hhc19tYXJrZXIoa2V5cywgXzM0NV9NQVJLRVJTKQogICAgaXNfMl8wID0gJzIuMCcgaW4gcG9zc2libGVfdmVyc2lvbnMgYW5kIF9oYXNfbWFya2VyKGtleXMsIF80MjZfTUFSS0VSUykKICAgIGlmIGludChpc18xXzEpICsgaW50KGlzXzFfMikgKyBpbnQoaXNfMl8wKSA+IDE6CiAgICAgICAgcmFpc2UgTWV0YWRhdGFDb25mbGljdEVycm9yKCdZb3UgdXNlZCBpbmNvbXBhdGlibGUgMS4xLzEuMi8yLjAgZmllbGRzJykKCiAgICAjIHdlIGhhdmUgdGhlIGNob2ljZSwgMS4wLCBvciAxLjIsIG9yIDIuMAogICAgIyAgIC0gMS4wIGhhcyBhIGJyb2tlbiBTdW1tYXJ5IGZpZWxkIGJ1dCB3b3JrcyB3aXRoIGFsbCB0b29scwogICAgIyAgIC0gMS4xIGlzIHRvIGF2b2lkCiAgICAjICAgLSAxLjIgZml4ZXMgU3VtbWFyeSBidXQgaGFzIGxpdHRsZSBhZG9wdGlvbgogICAgIyAgIC0gMi4wIGFkZHMgbW9yZSBmZWF0dXJlcyBhbmQgaXMgdmVyeSBuZXcKICAgIGlmIG5vdCBpc18xXzEgYW5kIG5vdCBpc18xXzIgYW5kIG5vdCBpc18yXzA6CiAgICAgICAgIyB3ZSBjb3VsZG4ndCBmaW5kIGFueSBzcGVjaWZpYyBtYXJrZXIKICAgICAgICBpZiBQS0dfSU5GT19QUkVGRVJSRURfVkVSU0lPTiBpbiBwb3NzaWJsZV92ZXJzaW9uczoKICAgICAgICAgICAgcmV0dXJuIFBLR19JTkZPX1BSRUZFUlJFRF9WRVJTSU9OCiAgICBpZiBpc18xXzE6CiAgICAgICAgcmV0dXJuICcxLjEnCiAgICBpZiBpc18xXzI6CiAgICAgICAgcmV0dXJuICcxLjInCgogICAgcmV0dXJuICcyLjAnCgpfQVRUUjJGSUVMRCA9IHsKICAgICdtZXRhZGF0YV92ZXJzaW9uJzogJ01ldGFkYXRhLVZlcnNpb24nLAogICAgJ25hbWUnOiAnTmFtZScsCiAgICAndmVyc2lvbic6ICdWZXJzaW9uJywKICAgICdwbGF0Zm9ybSc6ICdQbGF0Zm9ybScsCiAgICAnc3VwcG9ydGVkX3BsYXRmb3JtJzogJ1N1cHBvcnRlZC1QbGF0Zm9ybScsCiAgICAnc3VtbWFyeSc6ICdTdW1tYXJ5JywKICAgICdkZXNjcmlwdGlvbic6ICdEZXNjcmlwdGlvbicsCiAgICAna2V5d29yZHMnOiAnS2V5d29yZHMnLAogICAgJ2hvbWVfcGFnZSc6ICdIb21lLXBhZ2UnLAogICAgJ2F1dGhvcic6ICdBdXRob3InLAogICAgJ2F1dGhvcl9lbWFpbCc6ICdBdXRob3ItZW1haWwnLAogICAgJ21haW50YWluZXInOiAnTWFpbnRhaW5lcicsCiAgICAnbWFpbnRhaW5lcl9lbWFpbCc6ICdNYWludGFpbmVyLWVtYWlsJywKICAgICdsaWNlbnNlJzogJ0xpY2Vuc2UnLAogICAgJ2NsYXNzaWZpZXInOiAnQ2xhc3NpZmllcicsCiAgICAnZG93bmxvYWRfdXJsJzogJ0Rvd25sb2FkLVVSTCcsCiAgICAnb2Jzb2xldGVzX2Rpc3QnOiAnT2Jzb2xldGVzLURpc3QnLAogICAgJ3Byb3ZpZGVzX2Rpc3QnOiAnUHJvdmlkZXMtRGlzdCcsCiAgICAncmVxdWlyZXNfZGlzdCc6ICdSZXF1aXJlcy1EaXN0JywKICAgICdzZXR1cF9yZXF1aXJlc19kaXN0JzogJ1NldHVwLVJlcXVpcmVzLURpc3QnLAogICAgJ3JlcXVpcmVzX3B5dGhvbic6ICdSZXF1aXJlcy1QeXRob24nLAogICAgJ3JlcXVpcmVzX2V4dGVybmFsJzogJ1JlcXVpcmVzLUV4dGVybmFsJywKICAgICdyZXF1aXJlcyc6ICdSZXF1aXJlcycsCiAgICAncHJvdmlkZXMnOiAnUHJvdmlkZXMnLAogICAgJ29ic29sZXRlcyc6ICdPYnNvbGV0ZXMnLAogICAgJ3Byb2plY3RfdXJsJzogJ1Byb2plY3QtVVJMJywKICAgICdwcml2YXRlX3ZlcnNpb24nOiAnUHJpdmF0ZS1WZXJzaW9uJywKICAgICdvYnNvbGV0ZWRfYnknOiAnT2Jzb2xldGVkLUJ5JywKICAgICdleHRlbnNpb24nOiAnRXh0ZW5zaW9uJywKICAgICdwcm92aWRlc19leHRyYSc6ICdQcm92aWRlcy1FeHRyYScsCn0KCl9QUkVESUNBVEVfRklFTERTID0gKCdSZXF1aXJlcy1EaXN0JywgJ09ic29sZXRlcy1EaXN0JywgJ1Byb3ZpZGVzLURpc3QnKQpfVkVSU0lPTlNfRklFTERTID0gKCdSZXF1aXJlcy1QeXRob24nLCkKX1ZFUlNJT05fRklFTERTID0gKCdWZXJzaW9uJywpCl9MSVNURklFTERTID0gKCdQbGF0Zm9ybScsICdDbGFzc2lmaWVyJywgJ09ic29sZXRlcycsCiAgICAgICAgICAgICAgICdSZXF1aXJlcycsICdQcm92aWRlcycsICdPYnNvbGV0ZXMtRGlzdCcsCiAgICAgICAgICAgICAgICdQcm92aWRlcy1EaXN0JywgJ1JlcXVpcmVzLURpc3QnLCAnUmVxdWlyZXMtRXh0ZXJuYWwnLAogICAgICAgICAgICAgICAnUHJvamVjdC1VUkwnLCAnU3VwcG9ydGVkLVBsYXRmb3JtJywgJ1NldHVwLVJlcXVpcmVzLURpc3QnLAogICAgICAgICAgICAgICAnUHJvdmlkZXMtRXh0cmEnLCAnRXh0ZW5zaW9uJykKX0xJU1RUVVBMRUZJRUxEUyA9ICgnUHJvamVjdC1VUkwnLCkKCl9FTEVNRU5UU0ZJRUxEID0gKCdLZXl3b3JkcycsKQoKX1VOSUNPREVGSUVMRFMgPSAoJ0F1dGhvcicsICdNYWludGFpbmVyJywgJ1N1bW1hcnknLCAnRGVzY3JpcHRpb24nKQoKX01JU1NJTkcgPSBvYmplY3QoKQoKX0ZJTEVTQUZFID0gcmUuY29tcGlsZSgnW15BLVphLXowLTkuXSsnKQoKCmRlZiBfZ2V0X25hbWVfYW5kX3ZlcnNpb24obmFtZSwgdmVyc2lvbiwgZm9yX2ZpbGVuYW1lPUZhbHNlKToKICAgICIiIlJldHVybiB0aGUgZGlzdHJpYnV0aW9uIG5hbWUgd2l0aCB2ZXJzaW9uLgoKICAgIElmIGZvcl9maWxlbmFtZSBpcyB0cnVlLCByZXR1cm4gYSBmaWxlbmFtZS1lc2NhcGVkIGZvcm0uIiIiCiAgICBpZiBmb3JfZmlsZW5hbWU6CiAgICAgICAgIyBGb3IgYm90aCBuYW1lIGFuZCB2ZXJzaW9uIGFueSBydW5zIG9mIG5vbi1hbHBoYW51bWVyaWMgb3IgJy4nCiAgICAgICAgIyBjaGFyYWN0ZXJzIGFyZSByZXBsYWNlZCB3aXRoIGEgc2luZ2xlICctJy4gIEFkZGl0aW9uYWxseSBhbnkKICAgICAgICAjIHNwYWNlcyBpbiB0aGUgdmVyc2lvbiBzdHJpbmcgYmVjb21lICcuJwogICAgICAgIG5hbWUgPSBfRklMRVNBRkUuc3ViKCctJywgbmFtZSkKICAgICAgICB2ZXJzaW9uID0gX0ZJTEVTQUZFLnN1YignLScsIHZlcnNpb24ucmVwbGFjZSgnICcsICcuJykpCiAgICByZXR1cm4gJyVzLSVzJyAlIChuYW1lLCB2ZXJzaW9uKQoKCmNsYXNzIExlZ2FjeU1ldGFkYXRhKG9iamVjdCk6CiAgICAiIiJUaGUgbGVnYWN5IG1ldGFkYXRhIG9mIGEgcmVsZWFzZS4KCiAgICBTdXBwb3J0cyB2ZXJzaW9ucyAxLjAsIDEuMSBhbmQgMS4yIChhdXRvLWRldGVjdGVkKS4gWW91IGNhbgogICAgaW5zdGFudGlhdGUgdGhlIGNsYXNzIHdpdGggb25lIG9mIHRoZXNlIGFyZ3VtZW50cyAob3Igbm9uZSk6CiAgICAtICpwYXRoKiwgdGhlIHBhdGggdG8gYSBtZXRhZGF0YSBmaWxlCiAgICAtICpmaWxlb2JqKiBnaXZlIGEgZmlsZS1saWtlIG9iamVjdCB3aXRoIG1ldGFkYXRhIGFzIGNvbnRlbnQKICAgIC0gKm1hcHBpbmcqIGlzIGEgZGljdC1saWtlIG9iamVjdAogICAgLSAqc2NoZW1lKiBpcyBhIHZlcnNpb24gc2NoZW1lIG5hbWUKICAgICIiIgogICAgIyBUT0RPIGRvY3VtZW50IHRoZSBtYXBwaW5nIEFQSSBhbmQgVU5LTk9XTiBkZWZhdWx0IGtleQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXRoPU5vbmUsIGZpbGVvYmo9Tm9uZSwgbWFwcGluZz1Ob25lLAogICAgICAgICAgICAgICAgIHNjaGVtZT0nZGVmYXVsdCcpOgogICAgICAgIGlmIFtwYXRoLCBmaWxlb2JqLCBtYXBwaW5nXS5jb3VudChOb25lKSA8IDI6CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigncGF0aCwgZmlsZW9iaiBhbmQgbWFwcGluZyBhcmUgZXhjbHVzaXZlJykKICAgICAgICBzZWxmLl9maWVsZHMgPSB7fQogICAgICAgIHNlbGYucmVxdWlyZXNfZmlsZXMgPSBbXQogICAgICAgIHNlbGYuX2RlcGVuZGVuY2llcyA9IE5vbmUKICAgICAgICBzZWxmLnNjaGVtZSA9IHNjaGVtZQogICAgICAgIGlmIHBhdGggaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGYucmVhZChwYXRoKQogICAgICAgIGVsaWYgZmlsZW9iaiBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5yZWFkX2ZpbGUoZmlsZW9iaikKICAgICAgICBlbGlmIG1hcHBpbmcgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGYudXBkYXRlKG1hcHBpbmcpCiAgICAgICAgICAgIHNlbGYuc2V0X21ldGFkYXRhX3ZlcnNpb24oKQoKICAgIGRlZiBzZXRfbWV0YWRhdGFfdmVyc2lvbihzZWxmKToKICAgICAgICBzZWxmLl9maWVsZHNbJ01ldGFkYXRhLVZlcnNpb24nXSA9IF9iZXN0X3ZlcnNpb24oc2VsZi5fZmllbGRzKQoKICAgIGRlZiBfd3JpdGVfZmllbGQoc2VsZiwgZmlsZW9iaiwgbmFtZSwgdmFsdWUpOgogICAgICAgIGZpbGVvYmoud3JpdGUoJyVzOiAlc1xuJyAlIChuYW1lLCB2YWx1ZSkpCgogICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIG5hbWUpOgogICAgICAgIHJldHVybiBzZWxmLmdldChuYW1lKQoKICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBuYW1lLCB2YWx1ZSk6CiAgICAgICAgcmV0dXJuIHNlbGYuc2V0KG5hbWUsIHZhbHVlKQoKICAgIGRlZiBfX2RlbGl0ZW1fXyhzZWxmLCBuYW1lKToKICAgICAgICBmaWVsZF9uYW1lID0gc2VsZi5fY29udmVydF9uYW1lKG5hbWUpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBkZWwgc2VsZi5fZmllbGRzW2ZpZWxkX25hbWVdCiAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICByYWlzZSBLZXlFcnJvcihuYW1lKQoKICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwgbmFtZSk6CiAgICAgICAgcmV0dXJuIChuYW1lIGluIHNlbGYuX2ZpZWxkcyBvcgogICAgICAgICAgICAgICAgc2VsZi5fY29udmVydF9uYW1lKG5hbWUpIGluIHNlbGYuX2ZpZWxkcykKCiAgICBkZWYgX2NvbnZlcnRfbmFtZShzZWxmLCBuYW1lKToKICAgICAgICBpZiBuYW1lIGluIF9BTExfRklFTERTOgogICAgICAgICAgICByZXR1cm4gbmFtZQogICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoJy0nLCAnXycpLmxvd2VyKCkKICAgICAgICByZXR1cm4gX0FUVFIyRklFTEQuZ2V0KG5hbWUsIG5hbWUpCgogICAgZGVmIF9kZWZhdWx0X3ZhbHVlKHNlbGYsIG5hbWUpOgogICAgICAgIGlmIG5hbWUgaW4gX0xJU1RGSUVMRFMgb3IgbmFtZSBpbiBfRUxFTUVOVFNGSUVMRDoKICAgICAgICAgICAgcmV0dXJuIFtdCiAgICAgICAgcmV0dXJuICdVTktOT1dOJwoKICAgIGRlZiBfcmVtb3ZlX2xpbmVfcHJlZml4KHNlbGYsIHZhbHVlKToKICAgICAgICBpZiBzZWxmLm1ldGFkYXRhX3ZlcnNpb24gaW4gKCcxLjAnLCAnMS4xJyk6CiAgICAgICAgICAgIHJldHVybiBfTElORV9QUkVGSVhfUFJFXzFfMi5zdWIoJ1xuJywgdmFsdWUpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIF9MSU5FX1BSRUZJWF8xXzIuc3ViKCdcbicsIHZhbHVlKQoKICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBuYW1lKToKICAgICAgICBpZiBuYW1lIGluIF9BVFRSMkZJRUxEOgogICAgICAgICAgICByZXR1cm4gc2VsZltuYW1lXQogICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yKG5hbWUpCgogICAgIwogICAgIyBQdWJsaWMgQVBJCiAgICAjCgojICAgIGRlcGVuZGVuY2llcyA9IHByb3BlcnR5KF9nZXRfZGVwZW5kZW5jaWVzLCBfc2V0X2RlcGVuZGVuY2llcykKCiAgICBkZWYgZ2V0X2Z1bGxuYW1lKHNlbGYsIGZpbGVzYWZlPUZhbHNlKToKICAgICAgICAiIiJSZXR1cm4gdGhlIGRpc3RyaWJ1dGlvbiBuYW1lIHdpdGggdmVyc2lvbi4KCiAgICAgICAgSWYgZmlsZXNhZmUgaXMgdHJ1ZSwgcmV0dXJuIGEgZmlsZW5hbWUtZXNjYXBlZCBmb3JtLiIiIgogICAgICAgIHJldHVybiBfZ2V0X25hbWVfYW5kX3ZlcnNpb24oc2VsZlsnTmFtZSddLCBzZWxmWydWZXJzaW9uJ10sIGZpbGVzYWZlKQoKICAgIGRlZiBpc19maWVsZChzZWxmLCBuYW1lKToKICAgICAgICAiIiJyZXR1cm4gVHJ1ZSBpZiBuYW1lIGlzIGEgdmFsaWQgbWV0YWRhdGEga2V5IiIiCiAgICAgICAgbmFtZSA9IHNlbGYuX2NvbnZlcnRfbmFtZShuYW1lKQogICAgICAgIHJldHVybiBuYW1lIGluIF9BTExfRklFTERTCgogICAgZGVmIGlzX211bHRpX2ZpZWxkKHNlbGYsIG5hbWUpOgogICAgICAgIG5hbWUgPSBzZWxmLl9jb252ZXJ0X25hbWUobmFtZSkKICAgICAgICByZXR1cm4gbmFtZSBpbiBfTElTVEZJRUxEUwoKICAgIGRlZiByZWFkKHNlbGYsIGZpbGVwYXRoKToKICAgICAgICAiIiJSZWFkIHRoZSBtZXRhZGF0YSB2YWx1ZXMgZnJvbSBhIGZpbGUgcGF0aC4iIiIKICAgICAgICBmcCA9IGNvZGVjcy5vcGVuKGZpbGVwYXRoLCAncicsIGVuY29kaW5nPSd1dGYtOCcpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLnJlYWRfZmlsZShmcCkKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBmcC5jbG9zZSgpCgogICAgZGVmIHJlYWRfZmlsZShzZWxmLCBmaWxlb2IpOgogICAgICAgICIiIlJlYWQgdGhlIG1ldGFkYXRhIHZhbHVlcyBmcm9tIGEgZmlsZSBvYmplY3QuIiIiCiAgICAgICAgbXNnID0gbWVzc2FnZV9mcm9tX2ZpbGUoZmlsZW9iKQogICAgICAgIHNlbGYuX2ZpZWxkc1snTWV0YWRhdGEtVmVyc2lvbiddID0gbXNnWydtZXRhZGF0YS12ZXJzaW9uJ10KCiAgICAgICAgIyBXaGVuIHJlYWRpbmcsIGdldCBhbGwgdGhlIGZpZWxkcyB3ZSBjYW4KICAgICAgICBmb3IgZmllbGQgaW4gX0FMTF9GSUVMRFM6CiAgICAgICAgICAgIGlmIGZpZWxkIG5vdCBpbiBtc2c6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBpZiBmaWVsZCBpbiBfTElTVEZJRUxEUzoKICAgICAgICAgICAgICAgICMgd2UgY2FuIGhhdmUgbXVsdGlwbGUgbGluZXMKICAgICAgICAgICAgICAgIHZhbHVlcyA9IG1zZy5nZXRfYWxsKGZpZWxkKQogICAgICAgICAgICAgICAgaWYgZmllbGQgaW4gX0xJU1RUVVBMRUZJRUxEUyBhbmQgdmFsdWVzIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IFt0dXBsZSh2YWx1ZS5zcGxpdCgnLCcpKSBmb3IgdmFsdWUgaW4gdmFsdWVzXQogICAgICAgICAgICAgICAgc2VsZi5zZXQoZmllbGQsIHZhbHVlcykKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgc2luZ2xlIGxpbmUKICAgICAgICAgICAgICAgIHZhbHVlID0gbXNnW2ZpZWxkXQogICAgICAgICAgICAgICAgaWYgdmFsdWUgaXMgbm90IE5vbmUgYW5kIHZhbHVlICE9ICdVTktOT1dOJzoKICAgICAgICAgICAgICAgICAgICBzZWxmLnNldChmaWVsZCwgdmFsdWUpCiAgICAgICAgc2VsZi5zZXRfbWV0YWRhdGFfdmVyc2lvbigpCgogICAgZGVmIHdyaXRlKHNlbGYsIGZpbGVwYXRoLCBza2lwX3Vua25vd249RmFsc2UpOgogICAgICAgICIiIldyaXRlIHRoZSBtZXRhZGF0YSBmaWVsZHMgdG8gZmlsZXBhdGguIiIiCiAgICAgICAgZnAgPSBjb2RlY3Mub3BlbihmaWxlcGF0aCwgJ3cnLCBlbmNvZGluZz0ndXRmLTgnKQogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi53cml0ZV9maWxlKGZwLCBza2lwX3Vua25vd24pCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgZnAuY2xvc2UoKQoKICAgIGRlZiB3cml0ZV9maWxlKHNlbGYsIGZpbGVvYmplY3QsIHNraXBfdW5rbm93bj1GYWxzZSk6CiAgICAgICAgIiIiV3JpdGUgdGhlIFBLRy1JTkZPIGZvcm1hdCBkYXRhIHRvIGEgZmlsZSBvYmplY3QuIiIiCiAgICAgICAgc2VsZi5zZXRfbWV0YWRhdGFfdmVyc2lvbigpCgogICAgICAgIGZvciBmaWVsZCBpbiBfdmVyc2lvbjJmaWVsZGxpc3Qoc2VsZlsnTWV0YWRhdGEtVmVyc2lvbiddKToKICAgICAgICAgICAgdmFsdWVzID0gc2VsZi5nZXQoZmllbGQpCiAgICAgICAgICAgIGlmIHNraXBfdW5rbm93biBhbmQgdmFsdWVzIGluICgnVU5LTk9XTicsIFtdLCBbJ1VOS05PV04nXSk6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBpZiBmaWVsZCBpbiBfRUxFTUVOVFNGSUVMRDoKICAgICAgICAgICAgICAgIHNlbGYuX3dyaXRlX2ZpZWxkKGZpbGVvYmplY3QsIGZpZWxkLCAnLCcuam9pbih2YWx1ZXMpKQogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYgZmllbGQgbm90IGluIF9MSVNURklFTERTOgogICAgICAgICAgICAgICAgaWYgZmllbGQgPT0gJ0Rlc2NyaXB0aW9uJzoKICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLm1ldGFkYXRhX3ZlcnNpb24gaW4gKCcxLjAnLCAnMS4xJyk6CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IHZhbHVlcy5yZXBsYWNlKCdcbicsICdcbiAgICAgICAgJykKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSB2YWx1ZXMucmVwbGFjZSgnXG4nLCAnXG4gICAgICAgfCcpCiAgICAgICAgICAgICAgICB2YWx1ZXMgPSBbdmFsdWVzXQoKICAgICAgICAgICAgaWYgZmllbGQgaW4gX0xJU1RUVVBMRUZJRUxEUzoKICAgICAgICAgICAgICAgIHZhbHVlcyA9IFsnLCcuam9pbih2YWx1ZSkgZm9yIHZhbHVlIGluIHZhbHVlc10KCiAgICAgICAgICAgIGZvciB2YWx1ZSBpbiB2YWx1ZXM6CiAgICAgICAgICAgICAgICBzZWxmLl93cml0ZV9maWVsZChmaWxlb2JqZWN0LCBmaWVsZCwgdmFsdWUpCgogICAgZGVmIHVwZGF0ZShzZWxmLCBvdGhlcj1Ob25lLCAqKmt3YXJncyk6CiAgICAgICAgIiIiU2V0IG1ldGFkYXRhIHZhbHVlcyBmcm9tIHRoZSBnaXZlbiBpdGVyYWJsZSBgb3RoZXJgIGFuZCBrd2FyZ3MuCgogICAgICAgIEJlaGF2aW9yIGlzIGxpa2UgYGRpY3QudXBkYXRlYDogSWYgYG90aGVyYCBoYXMgYSBgYGtleXNgYCBtZXRob2QsCiAgICAgICAgdGhleSBhcmUgbG9vcGVkIG92ZXIgYW5kIGBgc2VsZltrZXldYGAgaXMgYXNzaWduZWQgYGBvdGhlcltrZXldYGAuCiAgICAgICAgRWxzZSwgYGBvdGhlcmBgIGlzIGFuIGl0ZXJhYmxlIG9mIGBgKGtleSwgdmFsdWUpYGAgaXRlcmFibGVzLgoKICAgICAgICBLZXlzIHRoYXQgZG9uJ3QgbWF0Y2ggYSBtZXRhZGF0YSBmaWVsZCBvciB0aGF0IGhhdmUgYW4gZW1wdHkgdmFsdWUgYXJlCiAgICAgICAgZHJvcHBlZC4KICAgICAgICAiIiIKICAgICAgICBkZWYgX3NldChrZXksIHZhbHVlKToKICAgICAgICAgICAgaWYga2V5IGluIF9BVFRSMkZJRUxEIGFuZCB2YWx1ZToKICAgICAgICAgICAgICAgIHNlbGYuc2V0KHNlbGYuX2NvbnZlcnRfbmFtZShrZXkpLCB2YWx1ZSkKCiAgICAgICAgaWYgbm90IG90aGVyOgogICAgICAgICAgICAjIG90aGVyIGlzIE5vbmUgb3IgZW1wdHkgY29udGFpbmVyCiAgICAgICAgICAgIHBhc3MKICAgICAgICBlbGlmIGhhc2F0dHIob3RoZXIsICdrZXlzJyk6CiAgICAgICAgICAgIGZvciBrIGluIG90aGVyLmtleXMoKToKICAgICAgICAgICAgICAgIF9zZXQoaywgb3RoZXJba10pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZm9yIGssIHYgaW4gb3RoZXI6CiAgICAgICAgICAgICAgICBfc2V0KGssIHYpCgogICAgICAgIGlmIGt3YXJnczoKICAgICAgICAgICAgZm9yIGssIHYgaW4ga3dhcmdzLml0ZW1zKCk6CiAgICAgICAgICAgICAgICBfc2V0KGssIHYpCgogICAgZGVmIHNldChzZWxmLCBuYW1lLCB2YWx1ZSk6CiAgICAgICAgIiIiQ29udHJvbCB0aGVuIHNldCBhIG1ldGFkYXRhIGZpZWxkLiIiIgogICAgICAgIG5hbWUgPSBzZWxmLl9jb252ZXJ0X25hbWUobmFtZSkKCiAgICAgICAgaWYgKChuYW1lIGluIF9FTEVNRU5UU0ZJRUxEIG9yIG5hbWUgPT0gJ1BsYXRmb3JtJykgYW5kCiAgICAgICAgICAgIG5vdCBpc2luc3RhbmNlKHZhbHVlLCAobGlzdCwgdHVwbGUpKSk6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIHN0cmluZ190eXBlcyk6CiAgICAgICAgICAgICAgICB2YWx1ZSA9IFt2LnN0cmlwKCkgZm9yIHYgaW4gdmFsdWUuc3BsaXQoJywnKV0KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHZhbHVlID0gW10KICAgICAgICBlbGlmIChuYW1lIGluIF9MSVNURklFTERTIGFuZAogICAgICAgICAgICAgIG5vdCBpc2luc3RhbmNlKHZhbHVlLCAobGlzdCwgdHVwbGUpKSk6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIHN0cmluZ190eXBlcyk6CiAgICAgICAgICAgICAgICB2YWx1ZSA9IFt2YWx1ZV0KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHZhbHVlID0gW10KCiAgICAgICAgaWYgbG9nZ2VyLmlzRW5hYmxlZEZvcihsb2dnaW5nLldBUk5JTkcpOgogICAgICAgICAgICBwcm9qZWN0X25hbWUgPSBzZWxmWydOYW1lJ10KCiAgICAgICAgICAgIHNjaGVtZSA9IGdldF9zY2hlbWUoc2VsZi5zY2hlbWUpCiAgICAgICAgICAgIGlmIG5hbWUgaW4gX1BSRURJQ0FURV9GSUVMRFMgYW5kIHZhbHVlIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgZm9yIHYgaW4gdmFsdWU6CiAgICAgICAgICAgICAgICAgICAgIyBjaGVjayB0aGF0IHRoZSB2YWx1ZXMgYXJlIHZhbGlkCiAgICAgICAgICAgICAgICAgICAgaWYgbm90IHNjaGVtZS5pc192YWxpZF9tYXRjaGVyKHYuc3BsaXQoJzsnKVswXSk6CiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIiclcyc6ICclcycgaXMgbm90IHZhbGlkIChmaWVsZCAnJXMnKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0X25hbWUsIHYsIG5hbWUpCiAgICAgICAgICAgICMgRklYTUUgdGhpcyByZWplY3RzIFVOS05PV04sIGlzIHRoYXQgcmlnaHQ/CiAgICAgICAgICAgIGVsaWYgbmFtZSBpbiBfVkVSU0lPTlNfRklFTERTIGFuZCB2YWx1ZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIGlmIG5vdCBzY2hlbWUuaXNfdmFsaWRfY29uc3RyYWludF9saXN0KHZhbHVlKToKICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygiJyVzJzogJyVzJyBpcyBub3QgYSB2YWxpZCB2ZXJzaW9uIChmaWVsZCAnJXMnKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdF9uYW1lLCB2YWx1ZSwgbmFtZSkKICAgICAgICAgICAgZWxpZiBuYW1lIGluIF9WRVJTSU9OX0ZJRUxEUyBhbmQgdmFsdWUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBpZiBub3Qgc2NoZW1lLmlzX3ZhbGlkX3ZlcnNpb24odmFsdWUpOgogICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCInJXMnOiAnJXMnIGlzIG5vdCBhIHZhbGlkIHZlcnNpb24gKGZpZWxkICclcycpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0X25hbWUsIHZhbHVlLCBuYW1lKQoKICAgICAgICBpZiBuYW1lIGluIF9VTklDT0RFRklFTERTOgogICAgICAgICAgICBpZiBuYW1lID09ICdEZXNjcmlwdGlvbic6CiAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuX3JlbW92ZV9saW5lX3ByZWZpeCh2YWx1ZSkKCiAgICAgICAgc2VsZi5fZmllbGRzW25hbWVdID0gdmFsdWUKCiAgICBkZWYgZ2V0KHNlbGYsIG5hbWUsIGRlZmF1bHQ9X01JU1NJTkcpOgogICAgICAgICIiIkdldCBhIG1ldGFkYXRhIGZpZWxkLiIiIgogICAgICAgIG5hbWUgPSBzZWxmLl9jb252ZXJ0X25hbWUobmFtZSkKICAgICAgICBpZiBuYW1lIG5vdCBpbiBzZWxmLl9maWVsZHM6CiAgICAgICAgICAgIGlmIGRlZmF1bHQgaXMgX01JU1NJTkc6CiAgICAgICAgICAgICAgICBkZWZhdWx0ID0gc2VsZi5fZGVmYXVsdF92YWx1ZShuYW1lKQogICAgICAgICAgICByZXR1cm4gZGVmYXVsdAogICAgICAgIGlmIG5hbWUgaW4gX1VOSUNPREVGSUVMRFM6CiAgICAgICAgICAgIHZhbHVlID0gc2VsZi5fZmllbGRzW25hbWVdCiAgICAgICAgICAgIHJldHVybiB2YWx1ZQogICAgICAgIGVsaWYgbmFtZSBpbiBfTElTVEZJRUxEUzoKICAgICAgICAgICAgdmFsdWUgPSBzZWxmLl9maWVsZHNbbmFtZV0KICAgICAgICAgICAgaWYgdmFsdWUgaXMgTm9uZToKICAgICAgICAgICAgICAgIHJldHVybiBbXQogICAgICAgICAgICByZXMgPSBbXQogICAgICAgICAgICBmb3IgdmFsIGluIHZhbHVlOgogICAgICAgICAgICAgICAgaWYgbmFtZSBub3QgaW4gX0xJU1RUVVBMRUZJRUxEUzoKICAgICAgICAgICAgICAgICAgICByZXMuYXBwZW5kKHZhbCkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgIyBUaGF0J3MgZm9yIFByb2plY3QtVVJMCiAgICAgICAgICAgICAgICAgICAgcmVzLmFwcGVuZCgodmFsWzBdLCB2YWxbMV0pKQogICAgICAgICAgICByZXR1cm4gcmVzCgogICAgICAgIGVsaWYgbmFtZSBpbiBfRUxFTUVOVFNGSUVMRDoKICAgICAgICAgICAgdmFsdWUgPSBzZWxmLl9maWVsZHNbbmFtZV0KICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgc3RyaW5nX3R5cGVzKToKICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5zcGxpdCgnLCcpCiAgICAgICAgcmV0dXJuIHNlbGYuX2ZpZWxkc1tuYW1lXQoKICAgIGRlZiBjaGVjayhzZWxmLCBzdHJpY3Q9RmFsc2UpOgogICAgICAgICIiIkNoZWNrIGlmIHRoZSBtZXRhZGF0YSBpcyBjb21wbGlhbnQuIElmIHN0cmljdCBpcyBUcnVlIHRoZW4gcmFpc2UgaWYKICAgICAgICBubyBOYW1lIG9yIFZlcnNpb24gYXJlIHByb3ZpZGVkIiIiCiAgICAgICAgc2VsZi5zZXRfbWV0YWRhdGFfdmVyc2lvbigpCgogICAgICAgICMgWFhYIHNob3VsZCBjaGVjayB0aGUgdmVyc2lvbnMgKGlmIHRoZSBmaWxlIHdhcyBsb2FkZWQpCiAgICAgICAgbWlzc2luZywgd2FybmluZ3MgPSBbXSwgW10KCiAgICAgICAgZm9yIGF0dHIgaW4gKCdOYW1lJywgJ1ZlcnNpb24nKTogICMgcmVxdWlyZWQgYnkgUEVQIDM0NQogICAgICAgICAgICBpZiBhdHRyIG5vdCBpbiBzZWxmOgogICAgICAgICAgICAgICAgbWlzc2luZy5hcHBlbmQoYXR0cikKCiAgICAgICAgaWYgc3RyaWN0IGFuZCBtaXNzaW5nICE9IFtdOgogICAgICAgICAgICBtc2cgPSAnbWlzc2luZyByZXF1aXJlZCBtZXRhZGF0YTogJXMnICUgJywgJy5qb2luKG1pc3NpbmcpCiAgICAgICAgICAgIHJhaXNlIE1ldGFkYXRhTWlzc2luZ0Vycm9yKG1zZykKCiAgICAgICAgZm9yIGF0dHIgaW4gKCdIb21lLXBhZ2UnLCAnQXV0aG9yJyk6CiAgICAgICAgICAgIGlmIGF0dHIgbm90IGluIHNlbGY6CiAgICAgICAgICAgICAgICBtaXNzaW5nLmFwcGVuZChhdHRyKQoKICAgICAgICAjIGNoZWNraW5nIG1ldGFkYXRhIDEuMiAoWFhYIG5lZWRzIHRvIGNoZWNrIDEuMSwgMS4wKQogICAgICAgIGlmIHNlbGZbJ01ldGFkYXRhLVZlcnNpb24nXSAhPSAnMS4yJzoKICAgICAgICAgICAgcmV0dXJuIG1pc3NpbmcsIHdhcm5pbmdzCgogICAgICAgIHNjaGVtZSA9IGdldF9zY2hlbWUoc2VsZi5zY2hlbWUpCgogICAgICAgIGRlZiBhcmVfdmFsaWRfY29uc3RyYWludHModmFsdWUpOgogICAgICAgICAgICBmb3IgdiBpbiB2YWx1ZToKICAgICAgICAgICAgICAgIGlmIG5vdCBzY2hlbWUuaXNfdmFsaWRfbWF0Y2hlcih2LnNwbGl0KCc7JylbMF0pOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICAgICBmb3IgZmllbGRzLCBjb250cm9sbGVyIGluICgoX1BSRURJQ0FURV9GSUVMRFMsIGFyZV92YWxpZF9jb25zdHJhaW50cyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9WRVJTSU9OU19GSUVMRFMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtZS5pc192YWxpZF9jb25zdHJhaW50X2xpc3QpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfVkVSU0lPTl9GSUVMRFMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtZS5pc192YWxpZF92ZXJzaW9uKSk6CiAgICAgICAgICAgIGZvciBmaWVsZCBpbiBmaWVsZHM6CiAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuZ2V0KGZpZWxkLCBOb25lKQogICAgICAgICAgICAgICAgaWYgdmFsdWUgaXMgbm90IE5vbmUgYW5kIG5vdCBjb250cm9sbGVyKHZhbHVlKToKICAgICAgICAgICAgICAgICAgICB3YXJuaW5ncy5hcHBlbmQoIldyb25nIHZhbHVlIGZvciAnJXMnOiAlcyIgJSAoZmllbGQsIHZhbHVlKSkKCiAgICAgICAgcmV0dXJuIG1pc3NpbmcsIHdhcm5pbmdzCgogICAgZGVmIHRvZGljdChzZWxmLCBza2lwX21pc3Npbmc9RmFsc2UpOgogICAgICAgICIiIlJldHVybiBmaWVsZHMgYXMgYSBkaWN0LgoKICAgICAgICBGaWVsZCBuYW1lcyB3aWxsIGJlIGNvbnZlcnRlZCB0byB1c2UgdGhlIHVuZGVyc2NvcmUtbG93ZXJjYXNlIHN0eWxlCiAgICAgICAgaW5zdGVhZCBvZiBoeXBoZW4tbWl4ZWQgY2FzZSAoaS5lLiBob21lX3BhZ2UgaW5zdGVhZCBvZiBIb21lLXBhZ2UpLgogICAgICAgICIiIgogICAgICAgIHNlbGYuc2V0X21ldGFkYXRhX3ZlcnNpb24oKQoKICAgICAgICBtYXBwaW5nXzFfMCA9ICgKICAgICAgICAgICAgKCdtZXRhZGF0YV92ZXJzaW9uJywgJ01ldGFkYXRhLVZlcnNpb24nKSwKICAgICAgICAgICAgKCduYW1lJywgJ05hbWUnKSwKICAgICAgICAgICAgKCd2ZXJzaW9uJywgJ1ZlcnNpb24nKSwKICAgICAgICAgICAgKCdzdW1tYXJ5JywgJ1N1bW1hcnknKSwKICAgICAgICAgICAgKCdob21lX3BhZ2UnLCAnSG9tZS1wYWdlJyksCiAgICAgICAgICAgICgnYXV0aG9yJywgJ0F1dGhvcicpLAogICAgICAgICAgICAoJ2F1dGhvcl9lbWFpbCcsICdBdXRob3ItZW1haWwnKSwKICAgICAgICAgICAgKCdsaWNlbnNlJywgJ0xpY2Vuc2UnKSwKICAgICAgICAgICAgKCdkZXNjcmlwdGlvbicsICdEZXNjcmlwdGlvbicpLAogICAgICAgICAgICAoJ2tleXdvcmRzJywgJ0tleXdvcmRzJyksCiAgICAgICAgICAgICgncGxhdGZvcm0nLCAnUGxhdGZvcm0nKSwKICAgICAgICAgICAgKCdjbGFzc2lmaWVycycsICdDbGFzc2lmaWVyJyksCiAgICAgICAgICAgICgnZG93bmxvYWRfdXJsJywgJ0Rvd25sb2FkLVVSTCcpLAogICAgICAgICkKCiAgICAgICAgZGF0YSA9IHt9CiAgICAgICAgZm9yIGtleSwgZmllbGRfbmFtZSBpbiBtYXBwaW5nXzFfMDoKICAgICAgICAgICAgaWYgbm90IHNraXBfbWlzc2luZyBvciBmaWVsZF9uYW1lIGluIHNlbGYuX2ZpZWxkczoKICAgICAgICAgICAgICAgIGRhdGFba2V5XSA9IHNlbGZbZmllbGRfbmFtZV0KCiAgICAgICAgaWYgc2VsZlsnTWV0YWRhdGEtVmVyc2lvbiddID09ICcxLjInOgogICAgICAgICAgICBtYXBwaW5nXzFfMiA9ICgKICAgICAgICAgICAgICAgICgncmVxdWlyZXNfZGlzdCcsICdSZXF1aXJlcy1EaXN0JyksCiAgICAgICAgICAgICAgICAoJ3JlcXVpcmVzX3B5dGhvbicsICdSZXF1aXJlcy1QeXRob24nKSwKICAgICAgICAgICAgICAgICgncmVxdWlyZXNfZXh0ZXJuYWwnLCAnUmVxdWlyZXMtRXh0ZXJuYWwnKSwKICAgICAgICAgICAgICAgICgncHJvdmlkZXNfZGlzdCcsICdQcm92aWRlcy1EaXN0JyksCiAgICAgICAgICAgICAgICAoJ29ic29sZXRlc19kaXN0JywgJ09ic29sZXRlcy1EaXN0JyksCiAgICAgICAgICAgICAgICAoJ3Byb2plY3RfdXJsJywgJ1Byb2plY3QtVVJMJyksCiAgICAgICAgICAgICAgICAoJ21haW50YWluZXInLCAnTWFpbnRhaW5lcicpLAogICAgICAgICAgICAgICAgKCdtYWludGFpbmVyX2VtYWlsJywgJ01haW50YWluZXItZW1haWwnKSwKICAgICAgICAgICAgKQogICAgICAgICAgICBmb3Iga2V5LCBmaWVsZF9uYW1lIGluIG1hcHBpbmdfMV8yOgogICAgICAgICAgICAgICAgaWYgbm90IHNraXBfbWlzc2luZyBvciBmaWVsZF9uYW1lIGluIHNlbGYuX2ZpZWxkczoKICAgICAgICAgICAgICAgICAgICBpZiBrZXkgIT0gJ3Byb2plY3RfdXJsJzoKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVtrZXldID0gc2VsZltmaWVsZF9uYW1lXQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFba2V5XSA9IFsnLCcuam9pbih1KSBmb3IgdSBpbiBzZWxmW2ZpZWxkX25hbWVdXQoKICAgICAgICBlbGlmIHNlbGZbJ01ldGFkYXRhLVZlcnNpb24nXSA9PSAnMS4xJzoKICAgICAgICAgICAgbWFwcGluZ18xXzEgPSAoCiAgICAgICAgICAgICAgICAoJ3Byb3ZpZGVzJywgJ1Byb3ZpZGVzJyksCiAgICAgICAgICAgICAgICAoJ3JlcXVpcmVzJywgJ1JlcXVpcmVzJyksCiAgICAgICAgICAgICAgICAoJ29ic29sZXRlcycsICdPYnNvbGV0ZXMnKSwKICAgICAgICAgICAgKQogICAgICAgICAgICBmb3Iga2V5LCBmaWVsZF9uYW1lIGluIG1hcHBpbmdfMV8xOgogICAgICAgICAgICAgICAgaWYgbm90IHNraXBfbWlzc2luZyBvciBmaWVsZF9uYW1lIGluIHNlbGYuX2ZpZWxkczoKICAgICAgICAgICAgICAgICAgICBkYXRhW2tleV0gPSBzZWxmW2ZpZWxkX25hbWVdCgogICAgICAgIHJldHVybiBkYXRhCgogICAgZGVmIGFkZF9yZXF1aXJlbWVudHMoc2VsZiwgcmVxdWlyZW1lbnRzKToKICAgICAgICBpZiBzZWxmWydNZXRhZGF0YS1WZXJzaW9uJ10gPT0gJzEuMSc6CiAgICAgICAgICAgICMgd2UgY2FuJ3QgaGF2ZSAxLjEgbWV0YWRhdGEgKmFuZCogU2V0dXB0b29scyByZXF1aXJlcwogICAgICAgICAgICBmb3IgZmllbGQgaW4gKCdPYnNvbGV0ZXMnLCAnUmVxdWlyZXMnLCAnUHJvdmlkZXMnKToKICAgICAgICAgICAgICAgIGlmIGZpZWxkIGluIHNlbGY6CiAgICAgICAgICAgICAgICAgICAgZGVsIHNlbGZbZmllbGRdCiAgICAgICAgc2VsZlsnUmVxdWlyZXMtRGlzdCddICs9IHJlcXVpcmVtZW50cwoKICAgICMgTWFwcGluZyBBUEkKICAgICMgVE9ETyBjb3VsZCBhZGQgaXRlciogdmFyaWFudHMKCiAgICBkZWYga2V5cyhzZWxmKToKICAgICAgICByZXR1cm4gbGlzdChfdmVyc2lvbjJmaWVsZGxpc3Qoc2VsZlsnTWV0YWRhdGEtVmVyc2lvbiddKSkKCiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgZm9yIGtleSBpbiBzZWxmLmtleXMoKToKICAgICAgICAgICAgeWllbGQga2V5CgogICAgZGVmIHZhbHVlcyhzZWxmKToKICAgICAgICByZXR1cm4gW3NlbGZba2V5XSBmb3Iga2V5IGluIHNlbGYua2V5cygpXQoKICAgIGRlZiBpdGVtcyhzZWxmKToKICAgICAgICByZXR1cm4gWyhrZXksIHNlbGZba2V5XSkgZm9yIGtleSBpbiBzZWxmLmtleXMoKV0KCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICc8JXMgJXMgJXM+JyAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgc2VsZi5uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi52ZXJzaW9uKQoKCk1FVEFEQVRBX0ZJTEVOQU1FID0gJ3B5ZGlzdC5qc29uJwpXSEVFTF9NRVRBREFUQV9GSUxFTkFNRSA9ICdtZXRhZGF0YS5qc29uJwoKCmNsYXNzIE1ldGFkYXRhKG9iamVjdCk6CiAgICAiIiIKICAgIFRoZSBtZXRhZGF0YSBvZiBhIHJlbGVhc2UuIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcyAyLjAgKEpTT04pCiAgICBtZXRhZGF0YSB3aGVyZSBwb3NzaWJsZS4gSWYgbm90IHBvc3NpYmxlLCBpdCB3cmFwcyBhIExlZ2FjeU1ldGFkYXRhCiAgICBpbnN0YW5jZSB3aGljaCBoYW5kbGVzIHRoZSBrZXktdmFsdWUgbWV0YWRhdGEgZm9ybWF0LgogICAgIiIiCgogICAgTUVUQURBVEFfVkVSU0lPTl9NQVRDSEVSID0gcmUuY29tcGlsZSgnXlxkKyhcLlxkKykqJCcpCgogICAgTkFNRV9NQVRDSEVSID0gcmUuY29tcGlsZSgnXlswLTlBLVpdKFswLTlBLVpfLi1dKlswLTlBLVpdKT8kJywgcmUuSSkKCiAgICBWRVJTSU9OX01BVENIRVIgPSBQRVA0NDBfVkVSU0lPTl9SRQoKICAgIFNVTU1BUllfTUFUQ0hFUiA9IHJlLmNvbXBpbGUoJy57MSwyMDQ3fScpCgogICAgTUVUQURBVEFfVkVSU0lPTiA9ICcyLjAnCgogICAgR0VORVJBVE9SID0gJ2Rpc3RsaWIgKCVzKScgJSBfX3ZlcnNpb25fXwoKICAgIE1BTkRBVE9SWV9LRVlTID0gewogICAgICAgICduYW1lJzogKCksCiAgICAgICAgJ3ZlcnNpb24nOiAoKSwKICAgICAgICAnc3VtbWFyeSc6ICgnbGVnYWN5JywpLAogICAgfQoKICAgIElOREVYX0tFWVMgPSAoJ25hbWUgdmVyc2lvbiBsaWNlbnNlIHN1bW1hcnkgZGVzY3JpcHRpb24gYXV0aG9yICcKICAgICAgICAgICAgICAgICAgJ2F1dGhvcl9lbWFpbCBrZXl3b3JkcyBwbGF0Zm9ybSBob21lX3BhZ2UgY2xhc3NpZmllcnMgJwogICAgICAgICAgICAgICAgICAnZG93bmxvYWRfdXJsJykKCiAgICBERVBFTkRFTkNZX0tFWVMgPSAoJ2V4dHJhcyBydW5fcmVxdWlyZXMgdGVzdF9yZXF1aXJlcyBidWlsZF9yZXF1aXJlcyAnCiAgICAgICAgICAgICAgICAgICAgICAgJ2Rldl9yZXF1aXJlcyBwcm92aWRlcyBtZXRhX3JlcXVpcmVzIG9ic29sZXRlZF9ieSAnCiAgICAgICAgICAgICAgICAgICAgICAgJ3N1cHBvcnRzX2Vudmlyb25tZW50cycpCgogICAgU1lOVEFYX1ZBTElEQVRPUlMgPSB7CiAgICAgICAgJ21ldGFkYXRhX3ZlcnNpb24nOiAoTUVUQURBVEFfVkVSU0lPTl9NQVRDSEVSLCAoKSksCiAgICAgICAgJ25hbWUnOiAoTkFNRV9NQVRDSEVSLCAoJ2xlZ2FjeScsKSksCiAgICAgICAgJ3ZlcnNpb24nOiAoVkVSU0lPTl9NQVRDSEVSLCAoJ2xlZ2FjeScsKSksCiAgICAgICAgJ3N1bW1hcnknOiAoU1VNTUFSWV9NQVRDSEVSLCAoJ2xlZ2FjeScsKSksCiAgICB9CgogICAgX19zbG90c19fID0gKCdfbGVnYWN5JywgJ19kYXRhJywgJ3NjaGVtZScpCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdGg9Tm9uZSwgZmlsZW9iaj1Ob25lLCBtYXBwaW5nPU5vbmUsCiAgICAgICAgICAgICAgICAgc2NoZW1lPSdkZWZhdWx0Jyk6CiAgICAgICAgaWYgW3BhdGgsIGZpbGVvYmosIG1hcHBpbmddLmNvdW50KE5vbmUpIDwgMjoKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdwYXRoLCBmaWxlb2JqIGFuZCBtYXBwaW5nIGFyZSBleGNsdXNpdmUnKQogICAgICAgIHNlbGYuX2xlZ2FjeSA9IE5vbmUKICAgICAgICBzZWxmLl9kYXRhID0gTm9uZQogICAgICAgIHNlbGYuc2NoZW1lID0gc2NoZW1lCiAgICAgICAgI2ltcG9ydCBwZGI7IHBkYi5zZXRfdHJhY2UoKQogICAgICAgIGlmIG1hcHBpbmcgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHNlbGYuX3ZhbGlkYXRlX21hcHBpbmcobWFwcGluZywgc2NoZW1lKQogICAgICAgICAgICAgICAgc2VsZi5fZGF0YSA9IG1hcHBpbmcKICAgICAgICAgICAgZXhjZXB0IE1ldGFkYXRhVW5yZWNvZ25pemVkVmVyc2lvbkVycm9yOgogICAgICAgICAgICAgICAgc2VsZi5fbGVnYWN5ID0gTGVnYWN5TWV0YWRhdGEobWFwcGluZz1tYXBwaW5nLCBzY2hlbWU9c2NoZW1lKQogICAgICAgICAgICAgICAgc2VsZi52YWxpZGF0ZSgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZGF0YSA9IE5vbmUKICAgICAgICAgICAgaWYgcGF0aDoKICAgICAgICAgICAgICAgIHdpdGggb3BlbihwYXRoLCAncmInKSBhcyBmOgogICAgICAgICAgICAgICAgICAgIGRhdGEgPSBmLnJlYWQoKQogICAgICAgICAgICBlbGlmIGZpbGVvYmo6CiAgICAgICAgICAgICAgICBkYXRhID0gZmlsZW9iai5yZWFkKCkKICAgICAgICAgICAgaWYgZGF0YSBpcyBOb25lOgogICAgICAgICAgICAgICAgIyBJbml0aWFsaXNlZCB3aXRoIG5vIGFyZ3MgLSB0byBiZSBhZGRlZAogICAgICAgICAgICAgICAgc2VsZi5fZGF0YSA9IHsKICAgICAgICAgICAgICAgICAgICAnbWV0YWRhdGFfdmVyc2lvbic6IHNlbGYuTUVUQURBVEFfVkVSU0lPTiwKICAgICAgICAgICAgICAgICAgICAnZ2VuZXJhdG9yJzogc2VsZi5HRU5FUkFUT1IsCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShkYXRhLCB0ZXh0X3R5cGUpOgogICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLmRlY29kZSgndXRmLTgnKQogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIHNlbGYuX2RhdGEgPSBqc29uLmxvYWRzKGRhdGEpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5fdmFsaWRhdGVfbWFwcGluZyhzZWxmLl9kYXRhLCBzY2hlbWUpCiAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgICAgICAjIE5vdGU6IE1ldGFkYXRhVW5yZWNvZ25pemVkVmVyc2lvbkVycm9yIGRvZXMgbm90CiAgICAgICAgICAgICAgICAgICAgIyBpbmhlcml0IGZyb20gVmFsdWVFcnJvciAoaXQncyBhIERpc3RsaWJFeGNlcHRpb24sCiAgICAgICAgICAgICAgICAgICAgIyB3aGljaCBzaG91bGQgbm90IGluaGVyaXQgZnJvbSBWYWx1ZUVycm9yKS4KICAgICAgICAgICAgICAgICAgICAjIFRoZSBWYWx1ZUVycm9yIGNvbWVzIGZyb20gdGhlIGpzb24ubG9hZCAtIGlmIHRoYXQKICAgICAgICAgICAgICAgICAgICAjIHN1Y2NlZWRzIGFuZCB3ZSBnZXQgYSB2YWxpZGF0aW9uIGVycm9yLCB3ZSB3YW50CiAgICAgICAgICAgICAgICAgICAgIyB0aGF0IHRvIHByb3BhZ2F0ZQogICAgICAgICAgICAgICAgICAgIHNlbGYuX2xlZ2FjeSA9IExlZ2FjeU1ldGFkYXRhKGZpbGVvYmo9U3RyaW5nSU8oZGF0YSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1lPXNjaGVtZSkKICAgICAgICAgICAgICAgICAgICBzZWxmLnZhbGlkYXRlKCkKCiAgICBjb21tb25fa2V5cyA9IHNldCgoJ25hbWUnLCAndmVyc2lvbicsICdsaWNlbnNlJywgJ2tleXdvcmRzJywgJ3N1bW1hcnknKSkKCiAgICBub25lX2xpc3QgPSAoTm9uZSwgbGlzdCkKICAgIG5vbmVfZGljdCA9IChOb25lLCBkaWN0KQoKICAgIG1hcHBlZF9rZXlzID0gewogICAgICAgICdydW5fcmVxdWlyZXMnOiAoJ1JlcXVpcmVzLURpc3QnLCBsaXN0KSwKICAgICAgICAnYnVpbGRfcmVxdWlyZXMnOiAoJ1NldHVwLVJlcXVpcmVzLURpc3QnLCBsaXN0KSwKICAgICAgICAnZGV2X3JlcXVpcmVzJzogbm9uZV9saXN0LAogICAgICAgICd0ZXN0X3JlcXVpcmVzJzogbm9uZV9saXN0LAogICAgICAgICdtZXRhX3JlcXVpcmVzJzogbm9uZV9saXN0LAogICAgICAgICdleHRyYXMnOiAoJ1Byb3ZpZGVzLUV4dHJhJywgbGlzdCksCiAgICAgICAgJ21vZHVsZXMnOiBub25lX2xpc3QsCiAgICAgICAgJ25hbWVzcGFjZXMnOiBub25lX2xpc3QsCiAgICAgICAgJ2V4cG9ydHMnOiBub25lX2RpY3QsCiAgICAgICAgJ2NvbW1hbmRzJzogbm9uZV9kaWN0LAogICAgICAgICdjbGFzc2lmaWVycyc6ICgnQ2xhc3NpZmllcicsIGxpc3QpLAogICAgICAgICdzb3VyY2VfdXJsJzogKCdEb3dubG9hZC1VUkwnLCBOb25lKSwKICAgICAgICAnbWV0YWRhdGFfdmVyc2lvbic6ICgnTWV0YWRhdGEtVmVyc2lvbicsIE5vbmUpLAogICAgfQoKICAgIGRlbCBub25lX2xpc3QsIG5vbmVfZGljdAoKICAgIGRlZiBfX2dldGF0dHJpYnV0ZV9fKHNlbGYsIGtleSk6CiAgICAgICAgY29tbW9uID0gb2JqZWN0Ll9fZ2V0YXR0cmlidXRlX18oc2VsZiwgJ2NvbW1vbl9rZXlzJykKICAgICAgICBtYXBwZWQgPSBvYmplY3QuX19nZXRhdHRyaWJ1dGVfXyhzZWxmLCAnbWFwcGVkX2tleXMnKQogICAgICAgIGlmIGtleSBpbiBtYXBwZWQ6CiAgICAgICAgICAgIGxrLCBtYWtlciA9IG1hcHBlZFtrZXldCiAgICAgICAgICAgIGlmIHNlbGYuX2xlZ2FjeToKICAgICAgICAgICAgICAgIGlmIGxrIGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gTm9uZSBpZiBtYWtlciBpcyBOb25lIGVsc2UgbWFrZXIoKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBzZWxmLl9sZWdhY3kuZ2V0KGxrKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgdmFsdWUgPSBOb25lIGlmIG1ha2VyIGlzIE5vbmUgZWxzZSBtYWtlcigpCiAgICAgICAgICAgICAgICBpZiBrZXkgbm90IGluICgnY29tbWFuZHMnLCAnZXhwb3J0cycsICdtb2R1bGVzJywgJ25hbWVzcGFjZXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NsYXNzaWZpZXJzJyk6CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5fZGF0YS5nZXQoa2V5LCB2YWx1ZSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgIyBzcGVjaWFsIGNhc2VzIGZvciBQRVAgNDU5CiAgICAgICAgICAgICAgICAgICAgc2VudGluZWwgPSBvYmplY3QoKQogICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNlbnRpbmVsCiAgICAgICAgICAgICAgICAgICAgZCA9IHNlbGYuX2RhdGEuZ2V0KCdleHRlbnNpb25zJykKICAgICAgICAgICAgICAgICAgICBpZiBkOgogICAgICAgICAgICAgICAgICAgICAgICBpZiBrZXkgPT0gJ2NvbW1hbmRzJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGQuZ2V0KCdweXRob24uY29tbWFuZHMnLCB2YWx1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgZWxpZiBrZXkgPT0gJ2NsYXNzaWZpZXJzJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBkLmdldCgncHl0aG9uLmRldGFpbHMnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgZDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBkLmdldChrZXksIHZhbHVlKQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZCA9IGQuZ2V0KCdweXRob24uZXhwb3J0cycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgZDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkID0gc2VsZi5fZGF0YS5nZXQoJ3B5dGhvbi5leHBvcnRzJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZC5nZXQoa2V5LCB2YWx1ZSkKICAgICAgICAgICAgICAgICAgICBpZiByZXN1bHQgaXMgc2VudGluZWw6CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHZhbHVlCiAgICAgICAgZWxpZiBrZXkgbm90IGluIGNvbW1vbjoKICAgICAgICAgICAgcmVzdWx0ID0gb2JqZWN0Ll9fZ2V0YXR0cmlidXRlX18oc2VsZiwga2V5KQogICAgICAgIGVsaWYgc2VsZi5fbGVnYWN5OgogICAgICAgICAgICByZXN1bHQgPSBzZWxmLl9sZWdhY3kuZ2V0KGtleSkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXN1bHQgPSBzZWxmLl9kYXRhLmdldChrZXkpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBfdmFsaWRhdGVfdmFsdWUoc2VsZiwga2V5LCB2YWx1ZSwgc2NoZW1lPU5vbmUpOgogICAgICAgIGlmIGtleSBpbiBzZWxmLlNZTlRBWF9WQUxJREFUT1JTOgogICAgICAgICAgICBwYXR0ZXJuLCBleGNsdXNpb25zID0gc2VsZi5TWU5UQVhfVkFMSURBVE9SU1trZXldCiAgICAgICAgICAgIGlmIChzY2hlbWUgb3Igc2VsZi5zY2hlbWUpIG5vdCBpbiBleGNsdXNpb25zOgogICAgICAgICAgICAgICAgbSA9IHBhdHRlcm4ubWF0Y2godmFsdWUpCiAgICAgICAgICAgICAgICBpZiBub3QgbToKICAgICAgICAgICAgICAgICAgICByYWlzZSBNZXRhZGF0YUludmFsaWRFcnJvcigiJyVzJyBpcyBhbiBpbnZhbGlkIHZhbHVlIGZvciAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZSAnJXMnIHByb3BlcnR5IiAlICh2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkpKQoKICAgIGRlZiBfX3NldGF0dHJfXyhzZWxmLCBrZXksIHZhbHVlKToKICAgICAgICBzZWxmLl92YWxpZGF0ZV92YWx1ZShrZXksIHZhbHVlKQogICAgICAgIGNvbW1vbiA9IG9iamVjdC5fX2dldGF0dHJpYnV0ZV9fKHNlbGYsICdjb21tb25fa2V5cycpCiAgICAgICAgbWFwcGVkID0gb2JqZWN0Ll9fZ2V0YXR0cmlidXRlX18oc2VsZiwgJ21hcHBlZF9rZXlzJykKICAgICAgICBpZiBrZXkgaW4gbWFwcGVkOgogICAgICAgICAgICBsaywgXyA9IG1hcHBlZFtrZXldCiAgICAgICAgICAgIGlmIHNlbGYuX2xlZ2FjeToKICAgICAgICAgICAgICAgIGlmIGxrIGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgogICAgICAgICAgICAgICAgc2VsZi5fbGVnYWN5W2xrXSA9IHZhbHVlCiAgICAgICAgICAgIGVsaWYga2V5IG5vdCBpbiAoJ2NvbW1hbmRzJywgJ2V4cG9ydHMnLCAnbW9kdWxlcycsICduYW1lc3BhY2VzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY2xhc3NpZmllcnMnKToKICAgICAgICAgICAgICAgIHNlbGYuX2RhdGFba2V5XSA9IHZhbHVlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIHNwZWNpYWwgY2FzZXMgZm9yIFBFUCA0NTkKICAgICAgICAgICAgICAgIGQgPSBzZWxmLl9kYXRhLnNldGRlZmF1bHQoJ2V4dGVuc2lvbnMnLCB7fSkKICAgICAgICAgICAgICAgIGlmIGtleSA9PSAnY29tbWFuZHMnOgogICAgICAgICAgICAgICAgICAgIGRbJ3B5dGhvbi5jb21tYW5kcyddID0gdmFsdWUKICAgICAgICAgICAgICAgIGVsaWYga2V5ID09ICdjbGFzc2lmaWVycyc6CiAgICAgICAgICAgICAgICAgICAgZCA9IGQuc2V0ZGVmYXVsdCgncHl0aG9uLmRldGFpbHMnLCB7fSkKICAgICAgICAgICAgICAgICAgICBkW2tleV0gPSB2YWx1ZQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBkID0gZC5zZXRkZWZhdWx0KCdweXRob24uZXhwb3J0cycsIHt9KQogICAgICAgICAgICAgICAgICAgIGRba2V5XSA9IHZhbHVlCiAgICAgICAgZWxpZiBrZXkgbm90IGluIGNvbW1vbjoKICAgICAgICAgICAgb2JqZWN0Ll9fc2V0YXR0cl9fKHNlbGYsIGtleSwgdmFsdWUpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaWYga2V5ID09ICdrZXl3b3Jkcyc6CiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBzdHJpbmdfdHlwZXMpOgogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuc3RyaXAoKQogICAgICAgICAgICAgICAgICAgIGlmIHZhbHVlOgogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnNwbGl0KCkKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IFtdCiAgICAgICAgICAgIGlmIHNlbGYuX2xlZ2FjeToKICAgICAgICAgICAgICAgIHNlbGYuX2xlZ2FjeVtrZXldID0gdmFsdWUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYuX2RhdGFba2V5XSA9IHZhbHVlCgogICAgQHByb3BlcnR5CiAgICBkZWYgbmFtZV9hbmRfdmVyc2lvbihzZWxmKToKICAgICAgICByZXR1cm4gX2dldF9uYW1lX2FuZF92ZXJzaW9uKHNlbGYubmFtZSwgc2VsZi52ZXJzaW9uLCBUcnVlKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHByb3ZpZGVzKHNlbGYpOgogICAgICAgIGlmIHNlbGYuX2xlZ2FjeToKICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5fbGVnYWN5WydQcm92aWRlcy1EaXN0J10KICAgICAgICBlbHNlOgogICAgICAgICAgICByZXN1bHQgPSBzZWxmLl9kYXRhLnNldGRlZmF1bHQoJ3Byb3ZpZGVzJywgW10pCiAgICAgICAgcyA9ICclcyAoJXMpJyAlIChzZWxmLm5hbWUsIHNlbGYudmVyc2lvbikKICAgICAgICBpZiBzIG5vdCBpbiByZXN1bHQ6CiAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQocykKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgQHByb3ZpZGVzLnNldHRlcgogICAgZGVmIHByb3ZpZGVzKHNlbGYsIHZhbHVlKToKICAgICAgICBpZiBzZWxmLl9sZWdhY3k6CiAgICAgICAgICAgIHNlbGYuX2xlZ2FjeVsnUHJvdmlkZXMtRGlzdCddID0gdmFsdWUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLl9kYXRhWydwcm92aWRlcyddID0gdmFsdWUKCiAgICBkZWYgZ2V0X3JlcXVpcmVtZW50cyhzZWxmLCByZXF0cywgZXh0cmFzPU5vbmUsIGVudj1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBCYXNlIG1ldGhvZCB0byBnZXQgZGVwZW5kZW5jaWVzLCBnaXZlbiBhIHNldCBvZiBleHRyYXMKICAgICAgICB0byBzYXRpc2Z5IGFuZCBhbiBvcHRpb25hbCBlbnZpcm9ubWVudCBjb250ZXh0LgogICAgICAgIDpwYXJhbSByZXF0czogQSBsaXN0IG9mIHNvbWV0aW1lcy13YW50ZWQgZGVwZW5kZW5jaWVzLAogICAgICAgICAgICAgICAgICAgICAgcGVyaGFwcyBkZXBlbmRlbnQgb24gZXh0cmFzIGFuZCBlbnZpcm9ubWVudC4KICAgICAgICA6cGFyYW0gZXh0cmFzOiBBIGxpc3Qgb2Ygb3B0aW9uYWwgY29tcG9uZW50cyBiZWluZyByZXF1ZXN0ZWQuCiAgICAgICAgOnBhcmFtIGVudjogQW4gb3B0aW9uYWwgZW52aXJvbm1lbnQgZm9yIG1hcmtlciBldmFsdWF0aW9uLgogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYuX2xlZ2FjeToKICAgICAgICAgICAgcmVzdWx0ID0gcmVxdHMKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXN1bHQgPSBbXQogICAgICAgICAgICBleHRyYXMgPSBnZXRfZXh0cmFzKGV4dHJhcyBvciBbXSwgc2VsZi5leHRyYXMpCiAgICAgICAgICAgIGZvciBkIGluIHJlcXRzOgogICAgICAgICAgICAgICAgaWYgJ2V4dHJhJyBub3QgaW4gZCBhbmQgJ2Vudmlyb25tZW50JyBub3QgaW4gZDoKICAgICAgICAgICAgICAgICAgICAjIHVuY29uZGl0aW9uYWwKICAgICAgICAgICAgICAgICAgICBpbmNsdWRlID0gVHJ1ZQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBpZiAnZXh0cmEnIG5vdCBpbiBkOgogICAgICAgICAgICAgICAgICAgICAgICAjIE5vdCBleHRyYS1kZXBlbmRlbnQgLSBvbmx5IGVudmlyb25tZW50LWRlcGVuZGVudAogICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlID0gVHJ1ZQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGUgPSBkLmdldCgnZXh0cmEnKSBpbiBleHRyYXMKICAgICAgICAgICAgICAgICAgICBpZiBpbmNsdWRlOgogICAgICAgICAgICAgICAgICAgICAgICAjIE5vdCBleGNsdWRlZCBiZWNhdXNlIG9mIGV4dHJhcywgY2hlY2sgZW52aXJvbm1lbnQKICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VyID0gZC5nZXQoJ2Vudmlyb25tZW50JykKICAgICAgICAgICAgICAgICAgICAgICAgaWYgbWFya2VyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZSA9IGludGVycHJldChtYXJrZXIsIGVudikKICAgICAgICAgICAgICAgIGlmIGluY2x1ZGU6CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmV4dGVuZChkWydyZXF1aXJlcyddKQogICAgICAgICAgICBmb3Iga2V5IGluICgnYnVpbGQnLCAnZGV2JywgJ3Rlc3QnKToKICAgICAgICAgICAgICAgIGUgPSAnOiVzOicgJSBrZXkKICAgICAgICAgICAgICAgIGlmIGUgaW4gZXh0cmFzOgogICAgICAgICAgICAgICAgICAgIGV4dHJhcy5yZW1vdmUoZSkKICAgICAgICAgICAgICAgICAgICAjIEEgcmVjdXJzaXZlIGNhbGwsIGJ1dCBpdCBzaG91bGQgdGVybWluYXRlIHNpbmNlICd0ZXN0JwogICAgICAgICAgICAgICAgICAgICMgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBleHRyYXMKICAgICAgICAgICAgICAgICAgICByZXF0cyA9IHNlbGYuX2RhdGEuZ2V0KCclc19yZXF1aXJlcycgJSBrZXksIFtdKQogICAgICAgICAgICAgICAgICAgIHJlc3VsdC5leHRlbmQoc2VsZi5nZXRfcmVxdWlyZW1lbnRzKHJlcXRzLCBleHRyYXM9ZXh0cmFzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudj1lbnYpKQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBAcHJvcGVydHkKICAgIGRlZiBkaWN0aW9uYXJ5KHNlbGYpOgogICAgICAgIGlmIHNlbGYuX2xlZ2FjeToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2Zyb21fbGVnYWN5KCkKICAgICAgICByZXR1cm4gc2VsZi5fZGF0YQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGRlcGVuZGVuY2llcyhzZWxmKToKICAgICAgICBpZiBzZWxmLl9sZWdhY3k6CiAgICAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gZXh0cmFjdF9ieV9rZXkoc2VsZi5fZGF0YSwgc2VsZi5ERVBFTkRFTkNZX0tFWVMpCgogICAgQGRlcGVuZGVuY2llcy5zZXR0ZXIKICAgIGRlZiBkZXBlbmRlbmNpZXMoc2VsZiwgdmFsdWUpOgogICAgICAgIGlmIHNlbGYuX2xlZ2FjeToKICAgICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuX2RhdGEudXBkYXRlKHZhbHVlKQoKICAgIGRlZiBfdmFsaWRhdGVfbWFwcGluZyhzZWxmLCBtYXBwaW5nLCBzY2hlbWUpOgogICAgICAgIGlmIG1hcHBpbmcuZ2V0KCdtZXRhZGF0YV92ZXJzaW9uJykgIT0gc2VsZi5NRVRBREFUQV9WRVJTSU9OOgogICAgICAgICAgICByYWlzZSBNZXRhZGF0YVVucmVjb2duaXplZFZlcnNpb25FcnJvcigpCiAgICAgICAgbWlzc2luZyA9IFtdCiAgICAgICAgZm9yIGtleSwgZXhjbHVzaW9ucyBpbiBzZWxmLk1BTkRBVE9SWV9LRVlTLml0ZW1zKCk6CiAgICAgICAgICAgIGlmIGtleSBub3QgaW4gbWFwcGluZzoKICAgICAgICAgICAgICAgIGlmIHNjaGVtZSBub3QgaW4gZXhjbHVzaW9uczoKICAgICAgICAgICAgICAgICAgICBtaXNzaW5nLmFwcGVuZChrZXkpCiAgICAgICAgaWYgbWlzc2luZzoKICAgICAgICAgICAgbXNnID0gJ01pc3NpbmcgbWV0YWRhdGEgaXRlbXM6ICVzJyAlICcsICcuam9pbihtaXNzaW5nKQogICAgICAgICAgICByYWlzZSBNZXRhZGF0YU1pc3NpbmdFcnJvcihtc2cpCiAgICAgICAgZm9yIGssIHYgaW4gbWFwcGluZy5pdGVtcygpOgogICAgICAgICAgICBzZWxmLl92YWxpZGF0ZV92YWx1ZShrLCB2LCBzY2hlbWUpCgogICAgZGVmIHZhbGlkYXRlKHNlbGYpOgogICAgICAgIGlmIHNlbGYuX2xlZ2FjeToKICAgICAgICAgICAgbWlzc2luZywgd2FybmluZ3MgPSBzZWxmLl9sZWdhY3kuY2hlY2soVHJ1ZSkKICAgICAgICAgICAgaWYgbWlzc2luZyBvciB3YXJuaW5nczoKICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdNZXRhZGF0YTogbWlzc2luZzogJXMsIHdhcm5pbmdzOiAlcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNzaW5nLCB3YXJuaW5ncykKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLl92YWxpZGF0ZV9tYXBwaW5nKHNlbGYuX2RhdGEsIHNlbGYuc2NoZW1lKQoKICAgIGRlZiB0b2RpY3Qoc2VsZik6CiAgICAgICAgaWYgc2VsZi5fbGVnYWN5OgogICAgICAgICAgICByZXR1cm4gc2VsZi5fbGVnYWN5LnRvZGljdChUcnVlKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJlc3VsdCA9IGV4dHJhY3RfYnlfa2V5KHNlbGYuX2RhdGEsIHNlbGYuSU5ERVhfS0VZUykKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBfZnJvbV9sZWdhY3koc2VsZik6CiAgICAgICAgYXNzZXJ0IHNlbGYuX2xlZ2FjeSBhbmQgbm90IHNlbGYuX2RhdGEKICAgICAgICByZXN1bHQgPSB7CiAgICAgICAgICAgICdtZXRhZGF0YV92ZXJzaW9uJzogc2VsZi5NRVRBREFUQV9WRVJTSU9OLAogICAgICAgICAgICAnZ2VuZXJhdG9yJzogc2VsZi5HRU5FUkFUT1IsCiAgICAgICAgfQogICAgICAgIGxtZCA9IHNlbGYuX2xlZ2FjeS50b2RpY3QoVHJ1ZSkgICAgICMgc2tpcCBtaXNzaW5nIG9uZXMKICAgICAgICBmb3IgayBpbiAoJ25hbWUnLCAndmVyc2lvbicsICdsaWNlbnNlJywgJ3N1bW1hcnknLCAnZGVzY3JpcHRpb24nLAogICAgICAgICAgICAgICAgICAnY2xhc3NpZmllcicpOgogICAgICAgICAgICBpZiBrIGluIGxtZDoKICAgICAgICAgICAgICAgIGlmIGsgPT0gJ2NsYXNzaWZpZXInOgogICAgICAgICAgICAgICAgICAgIG5rID0gJ2NsYXNzaWZpZXJzJwogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBuayA9IGsKICAgICAgICAgICAgICAgIHJlc3VsdFtua10gPSBsbWRba10KICAgICAgICBrdyA9IGxtZC5nZXQoJ0tleXdvcmRzJywgW10pCiAgICAgICAgaWYga3cgPT0gWycnXToKICAgICAgICAgICAga3cgPSBbXQogICAgICAgIHJlc3VsdFsna2V5d29yZHMnXSA9IGt3CiAgICAgICAga2V5cyA9ICgoJ3JlcXVpcmVzX2Rpc3QnLCAncnVuX3JlcXVpcmVzJyksCiAgICAgICAgICAgICAgICAoJ3NldHVwX3JlcXVpcmVzX2Rpc3QnLCAnYnVpbGRfcmVxdWlyZXMnKSkKICAgICAgICBmb3Igb2ssIG5rIGluIGtleXM6CiAgICAgICAgICAgIGlmIG9rIGluIGxtZCBhbmQgbG1kW29rXToKICAgICAgICAgICAgICAgIHJlc3VsdFtua10gPSBbeydyZXF1aXJlcyc6IGxtZFtva119XQogICAgICAgIHJlc3VsdFsncHJvdmlkZXMnXSA9IHNlbGYucHJvdmlkZXMKICAgICAgICBhdXRob3IgPSB7fQogICAgICAgIG1haW50YWluZXIgPSB7fQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBMRUdBQ1lfTUFQUElORyA9IHsKICAgICAgICAnbmFtZSc6ICdOYW1lJywKICAgICAgICAndmVyc2lvbic6ICdWZXJzaW9uJywKICAgICAgICAnbGljZW5zZSc6ICdMaWNlbnNlJywKICAgICAgICAnc3VtbWFyeSc6ICdTdW1tYXJ5JywKICAgICAgICAnZGVzY3JpcHRpb24nOiAnRGVzY3JpcHRpb24nLAogICAgICAgICdjbGFzc2lmaWVycyc6ICdDbGFzc2lmaWVyJywKICAgIH0KCiAgICBkZWYgX3RvX2xlZ2FjeShzZWxmKToKICAgICAgICBkZWYgcHJvY2Vzc19lbnRyaWVzKGVudHJpZXMpOgogICAgICAgICAgICByZXF0cyA9IHNldCgpCiAgICAgICAgICAgIGZvciBlIGluIGVudHJpZXM6CiAgICAgICAgICAgICAgICBleHRyYSA9IGUuZ2V0KCdleHRyYScpCiAgICAgICAgICAgICAgICBlbnYgPSBlLmdldCgnZW52aXJvbm1lbnQnKQogICAgICAgICAgICAgICAgcmxpc3QgPSBlWydyZXF1aXJlcyddCiAgICAgICAgICAgICAgICBmb3IgciBpbiBybGlzdDoKICAgICAgICAgICAgICAgICAgICBpZiBub3QgZW52IGFuZCBub3QgZXh0cmE6CiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXRzLmFkZChyKQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlciA9ICcnCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGV4dHJhOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VyID0gJ2V4dHJhID09ICIlcyInICUgZXh0cmEKICAgICAgICAgICAgICAgICAgICAgICAgaWYgZW52OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbWFya2VyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlciA9ICcoJXMpIGFuZCAlcycgJSAoZW52LCBtYXJrZXIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlciA9IGVudgogICAgICAgICAgICAgICAgICAgICAgICByZXF0cy5hZGQoJzsnLmpvaW4oKHIsIG1hcmtlcikpKQogICAgICAgICAgICByZXR1cm4gcmVxdHMKCiAgICAgICAgYXNzZXJ0IHNlbGYuX2RhdGEgYW5kIG5vdCBzZWxmLl9sZWdhY3kKICAgICAgICByZXN1bHQgPSBMZWdhY3lNZXRhZGF0YSgpCiAgICAgICAgbm1kID0gc2VsZi5fZGF0YQogICAgICAgIGZvciBuaywgb2sgaW4gc2VsZi5MRUdBQ1lfTUFQUElORy5pdGVtcygpOgogICAgICAgICAgICBpZiBuayBpbiBubWQ6CiAgICAgICAgICAgICAgICByZXN1bHRbb2tdID0gbm1kW25rXQogICAgICAgIHIxID0gcHJvY2Vzc19lbnRyaWVzKHNlbGYucnVuX3JlcXVpcmVzICsgc2VsZi5tZXRhX3JlcXVpcmVzKQogICAgICAgIHIyID0gcHJvY2Vzc19lbnRyaWVzKHNlbGYuYnVpbGRfcmVxdWlyZXMgKyBzZWxmLmRldl9yZXF1aXJlcykKICAgICAgICBpZiBzZWxmLmV4dHJhczoKICAgICAgICAgICAgcmVzdWx0WydQcm92aWRlcy1FeHRyYSddID0gc29ydGVkKHNlbGYuZXh0cmFzKQogICAgICAgIHJlc3VsdFsnUmVxdWlyZXMtRGlzdCddID0gc29ydGVkKHIxKQogICAgICAgIHJlc3VsdFsnU2V0dXAtUmVxdWlyZXMtRGlzdCddID0gc29ydGVkKHIyKQogICAgICAgICMgVE9ETzogb3RoZXIgZmllbGRzIHN1Y2ggYXMgY29udGFjdHMKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIHdyaXRlKHNlbGYsIHBhdGg9Tm9uZSwgZmlsZW9iaj1Ob25lLCBsZWdhY3k9RmFsc2UsIHNraXBfdW5rbm93bj1UcnVlKToKICAgICAgICBpZiBbcGF0aCwgZmlsZW9ial0uY291bnQoTm9uZSkgIT0gMToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignRXhhY3RseSBvbmUgb2YgcGF0aCBhbmQgZmlsZW9iaiBpcyBuZWVkZWQnKQogICAgICAgIHNlbGYudmFsaWRhdGUoKQogICAgICAgIGlmIGxlZ2FjeToKICAgICAgICAgICAgaWYgc2VsZi5fbGVnYWN5OgogICAgICAgICAgICAgICAgbGVnYWN5X21kID0gc2VsZi5fbGVnYWN5CiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBsZWdhY3lfbWQgPSBzZWxmLl90b19sZWdhY3koKQogICAgICAgICAgICBpZiBwYXRoOgogICAgICAgICAgICAgICAgbGVnYWN5X21kLndyaXRlKHBhdGgsIHNraXBfdW5rbm93bj1za2lwX3Vua25vd24pCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBsZWdhY3lfbWQud3JpdGVfZmlsZShmaWxlb2JqLCBza2lwX3Vua25vd249c2tpcF91bmtub3duKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlmIHNlbGYuX2xlZ2FjeToKICAgICAgICAgICAgICAgIGQgPSBzZWxmLl9mcm9tX2xlZ2FjeSgpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBkID0gc2VsZi5fZGF0YQogICAgICAgICAgICBpZiBmaWxlb2JqOgogICAgICAgICAgICAgICAganNvbi5kdW1wKGQsIGZpbGVvYmosIGVuc3VyZV9hc2NpaT1UcnVlLCBpbmRlbnQ9MiwKICAgICAgICAgICAgICAgICAgICAgICAgICBzb3J0X2tleXM9VHJ1ZSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHdpdGggY29kZWNzLm9wZW4ocGF0aCwgJ3cnLCAndXRmLTgnKSBhcyBmOgogICAgICAgICAgICAgICAgICAgIGpzb24uZHVtcChkLCBmLCBlbnN1cmVfYXNjaWk9VHJ1ZSwgaW5kZW50PTIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRfa2V5cz1UcnVlKQoKICAgIGRlZiBhZGRfcmVxdWlyZW1lbnRzKHNlbGYsIHJlcXVpcmVtZW50cyk6CiAgICAgICAgaWYgc2VsZi5fbGVnYWN5OgogICAgICAgICAgICBzZWxmLl9sZWdhY3kuYWRkX3JlcXVpcmVtZW50cyhyZXF1aXJlbWVudHMpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcnVuX3JlcXVpcmVzID0gc2VsZi5fZGF0YS5zZXRkZWZhdWx0KCdydW5fcmVxdWlyZXMnLCBbXSkKICAgICAgICAgICAgYWx3YXlzID0gTm9uZQogICAgICAgICAgICBmb3IgZW50cnkgaW4gcnVuX3JlcXVpcmVzOgogICAgICAgICAgICAgICAgaWYgJ2Vudmlyb25tZW50JyBub3QgaW4gZW50cnkgYW5kICdleHRyYScgbm90IGluIGVudHJ5OgogICAgICAgICAgICAgICAgICAgIGFsd2F5cyA9IGVudHJ5CiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgaWYgYWx3YXlzIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBhbHdheXMgPSB7ICdyZXF1aXJlcyc6IHJlcXVpcmVtZW50cyB9CiAgICAgICAgICAgICAgICBydW5fcmVxdWlyZXMuaW5zZXJ0KDAsIGFsd2F5cykKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJzZXQgPSBzZXQoYWx3YXlzWydyZXF1aXJlcyddKSB8IHNldChyZXF1aXJlbWVudHMpCiAgICAgICAgICAgICAgICBhbHdheXNbJ3JlcXVpcmVzJ10gPSBzb3J0ZWQocnNldCkKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgbmFtZSA9IHNlbGYubmFtZSBvciAnKG5vIG5hbWUpJwogICAgICAgIHZlcnNpb24gPSBzZWxmLnZlcnNpb24gb3IgJ25vIHZlcnNpb24nCiAgICAgICAgcmV0dXJuICc8JXMgJXMgJXMgKCVzKT4nICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm1ldGFkYXRhX3ZlcnNpb24sIG5hbWUsIHZlcnNpb24pClBLAwQUAAAAAAAAACEAyLdFmA4qAAAOKgAAPQAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvZGlzdGxpYi9yZXNvdXJjZXMucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQojCiMgQ29weXJpZ2h0IChDKSAyMDEzLTIwMTYgVmluYXkgU2FqaXAuCiMgTGljZW5zZWQgdG8gdGhlIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uIHVuZGVyIGEgY29udHJpYnV0b3IgYWdyZWVtZW50LgojIFNlZSBMSUNFTlNFLnR4dCBhbmQgQ09OVFJJQlVUT1JTLnR4dC4KIwpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHVuaWNvZGVfbGl0ZXJhbHMKCmltcG9ydCBiaXNlY3QKaW1wb3J0IGlvCmltcG9ydCBsb2dnaW5nCmltcG9ydCBvcwppbXBvcnQgcGtndXRpbAppbXBvcnQgc2h1dGlsCmltcG9ydCBzeXMKaW1wb3J0IHR5cGVzCmltcG9ydCB6aXBpbXBvcnQKCmZyb20gLiBpbXBvcnQgRGlzdGxpYkV4Y2VwdGlvbgpmcm9tIC51dGlsIGltcG9ydCBjYWNoZWRfcHJvcGVydHksIGdldF9jYWNoZV9iYXNlLCBwYXRoX3RvX2NhY2hlX2RpciwgQ2FjaGUKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKCmNhY2hlID0gTm9uZSAgICAjIGNyZWF0ZWQgd2hlbiBuZWVkZWQKCgpjbGFzcyBSZXNvdXJjZUNhY2hlKENhY2hlKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBiYXNlPU5vbmUpOgogICAgICAgIGlmIGJhc2UgaXMgTm9uZToKICAgICAgICAgICAgIyBVc2UgbmF0aXZlIHN0cmluZyB0byBhdm9pZCBpc3N1ZXMgb24gMi54OiBzZWUgUHl0aG9uICMyMDE0MC4KICAgICAgICAgICAgYmFzZSA9IG9zLnBhdGguam9pbihnZXRfY2FjaGVfYmFzZSgpLCBzdHIoJ3Jlc291cmNlLWNhY2hlJykpCiAgICAgICAgc3VwZXIoUmVzb3VyY2VDYWNoZSwgc2VsZikuX19pbml0X18oYmFzZSkKCiAgICBkZWYgaXNfc3RhbGUoc2VsZiwgcmVzb3VyY2UsIHBhdGgpOgogICAgICAgICIiIgogICAgICAgIElzIHRoZSBjYWNoZSBzdGFsZSBmb3IgdGhlIGdpdmVuIHJlc291cmNlPwoKICAgICAgICA6cGFyYW0gcmVzb3VyY2U6IFRoZSA6Y2xhc3M6YFJlc291cmNlYCBiZWluZyBjYWNoZWQuCiAgICAgICAgOnBhcmFtIHBhdGg6IFRoZSBwYXRoIG9mIHRoZSByZXNvdXJjZSBpbiB0aGUgY2FjaGUuCiAgICAgICAgOnJldHVybjogVHJ1ZSBpZiB0aGUgY2FjaGUgaXMgc3RhbGUuCiAgICAgICAgIiIiCiAgICAgICAgIyBDYWNoZSBpbnZhbGlkYXRpb24gaXMgYSBoYXJkIHByb2JsZW0gOi0pCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgZ2V0KHNlbGYsIHJlc291cmNlKToKICAgICAgICAiIiIKICAgICAgICBHZXQgYSByZXNvdXJjZSBpbnRvIHRoZSBjYWNoZSwKCiAgICAgICAgOnBhcmFtIHJlc291cmNlOiBBIDpjbGFzczpgUmVzb3VyY2VgIGluc3RhbmNlLgogICAgICAgIDpyZXR1cm46IFRoZSBwYXRobmFtZSBvZiB0aGUgcmVzb3VyY2UgaW4gdGhlIGNhY2hlLgogICAgICAgICIiIgogICAgICAgIHByZWZpeCwgcGF0aCA9IHJlc291cmNlLmZpbmRlci5nZXRfY2FjaGVfaW5mbyhyZXNvdXJjZSkKICAgICAgICBpZiBwcmVmaXggaXMgTm9uZToKICAgICAgICAgICAgcmVzdWx0ID0gcGF0aAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJlc3VsdCA9IG9zLnBhdGguam9pbihzZWxmLmJhc2UsIHNlbGYucHJlZml4X3RvX2RpcihwcmVmaXgpLCBwYXRoKQogICAgICAgICAgICBkaXJuYW1lID0gb3MucGF0aC5kaXJuYW1lKHJlc3VsdCkKICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguaXNkaXIoZGlybmFtZSk6CiAgICAgICAgICAgICAgICBvcy5tYWtlZGlycyhkaXJuYW1lKQogICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMocmVzdWx0KToKICAgICAgICAgICAgICAgIHN0YWxlID0gVHJ1ZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc3RhbGUgPSBzZWxmLmlzX3N0YWxlKHJlc291cmNlLCBwYXRoKQogICAgICAgICAgICBpZiBzdGFsZToKICAgICAgICAgICAgICAgICMgd3JpdGUgdGhlIGJ5dGVzIG9mIHRoZSByZXNvdXJjZSB0byB0aGUgY2FjaGUgbG9jYXRpb24KICAgICAgICAgICAgICAgIHdpdGggb3BlbihyZXN1bHQsICd3YicpIGFzIGY6CiAgICAgICAgICAgICAgICAgICAgZi53cml0ZShyZXNvdXJjZS5ieXRlcykKICAgICAgICByZXR1cm4gcmVzdWx0CgoKY2xhc3MgUmVzb3VyY2VCYXNlKG9iamVjdCk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgZmluZGVyLCBuYW1lKToKICAgICAgICBzZWxmLmZpbmRlciA9IGZpbmRlcgogICAgICAgIHNlbGYubmFtZSA9IG5hbWUKCgpjbGFzcyBSZXNvdXJjZShSZXNvdXJjZUJhc2UpOgogICAgIiIiCiAgICBBIGNsYXNzIHJlcHJlc2VudGluZyBhbiBpbi1wYWNrYWdlIHJlc291cmNlLCBzdWNoIGFzIGEgZGF0YSBmaWxlLiBUaGlzIGlzCiAgICBub3Qgbm9ybWFsbHkgaW5zdGFudGlhdGVkIGJ5IHVzZXIgY29kZSwgYnV0IHJhdGhlciBieSBhCiAgICA6Y2xhc3M6YFJlc291cmNlRmluZGVyYCB3aGljaCBtYW5hZ2VzIHRoZSByZXNvdXJjZS4KICAgICIiIgogICAgaXNfY29udGFpbmVyID0gRmFsc2UgICAgICAgICMgQmFja3dhcmRzIGNvbXBhdGliaWxpdHkKCiAgICBkZWYgYXNfc3RyZWFtKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIEdldCB0aGUgcmVzb3VyY2UgYXMgYSBzdHJlYW0uCgogICAgICAgIFRoaXMgaXMgbm90IGEgcHJvcGVydHkgdG8gbWFrZSBpdCBvYnZpb3VzIHRoYXQgaXQgcmV0dXJucyBhIG5ldyBzdHJlYW0KICAgICAgICBlYWNoIHRpbWUuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuZmluZGVyLmdldF9zdHJlYW0oc2VsZikKCiAgICBAY2FjaGVkX3Byb3BlcnR5CiAgICBkZWYgZmlsZV9wYXRoKHNlbGYpOgogICAgICAgIGdsb2JhbCBjYWNoZQogICAgICAgIGlmIGNhY2hlIGlzIE5vbmU6CiAgICAgICAgICAgIGNhY2hlID0gUmVzb3VyY2VDYWNoZSgpCiAgICAgICAgcmV0dXJuIGNhY2hlLmdldChzZWxmKQoKICAgIEBjYWNoZWRfcHJvcGVydHkKICAgIGRlZiBieXRlcyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5maW5kZXIuZ2V0X2J5dGVzKHNlbGYpCgogICAgQGNhY2hlZF9wcm9wZXJ0eQogICAgZGVmIHNpemUoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuZmluZGVyLmdldF9zaXplKHNlbGYpCgoKY2xhc3MgUmVzb3VyY2VDb250YWluZXIoUmVzb3VyY2VCYXNlKToKICAgIGlzX2NvbnRhaW5lciA9IFRydWUgICAgICMgQmFja3dhcmRzIGNvbXBhdGliaWxpdHkKCiAgICBAY2FjaGVkX3Byb3BlcnR5CiAgICBkZWYgcmVzb3VyY2VzKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLmZpbmRlci5nZXRfcmVzb3VyY2VzKHNlbGYpCgoKY2xhc3MgUmVzb3VyY2VGaW5kZXIob2JqZWN0KToKICAgICIiIgogICAgUmVzb3VyY2UgZmluZGVyIGZvciBmaWxlIHN5c3RlbSByZXNvdXJjZXMuCiAgICAiIiIKCiAgICBpZiBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnamF2YScpOgogICAgICAgIHNraXBwZWRfZXh0ZW5zaW9ucyA9ICgnLnB5YycsICcucHlvJywgJy5jbGFzcycpCiAgICBlbHNlOgogICAgICAgIHNraXBwZWRfZXh0ZW5zaW9ucyA9ICgnLnB5YycsICcucHlvJykKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbW9kdWxlKToKICAgICAgICBzZWxmLm1vZHVsZSA9IG1vZHVsZQogICAgICAgIHNlbGYubG9hZGVyID0gZ2V0YXR0cihtb2R1bGUsICdfX2xvYWRlcl9fJywgTm9uZSkKICAgICAgICBzZWxmLmJhc2UgPSBvcy5wYXRoLmRpcm5hbWUoZ2V0YXR0cihtb2R1bGUsICdfX2ZpbGVfXycsICcnKSkKCiAgICBkZWYgX2FkanVzdF9wYXRoKHNlbGYsIHBhdGgpOgogICAgICAgIHJldHVybiBvcy5wYXRoLnJlYWxwYXRoKHBhdGgpCgogICAgZGVmIF9tYWtlX3BhdGgoc2VsZiwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgIyBJc3N1ZSAjNTA6IG5lZWQgdG8gcHJlc2VydmUgdHlwZSBvZiBwYXRoIG9uIFB5dGhvbiAyLngKICAgICAgICAjIGxpa2Ugb3MucGF0aC5fZ2V0X3NlcAogICAgICAgIGlmIGlzaW5zdGFuY2UocmVzb3VyY2VfbmFtZSwgYnl0ZXMpOiAgICAjIHNob3VsZCBvbmx5IGhhcHBlbiBvbiAyLngKICAgICAgICAgICAgc2VwID0gYicvJwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlcCA9ICcvJwogICAgICAgIHBhcnRzID0gcmVzb3VyY2VfbmFtZS5zcGxpdChzZXApCiAgICAgICAgcGFydHMuaW5zZXJ0KDAsIHNlbGYuYmFzZSkKICAgICAgICByZXN1bHQgPSBvcy5wYXRoLmpvaW4oKnBhcnRzKQogICAgICAgIHJldHVybiBzZWxmLl9hZGp1c3RfcGF0aChyZXN1bHQpCgogICAgZGVmIF9maW5kKHNlbGYsIHBhdGgpOgogICAgICAgIHJldHVybiBvcy5wYXRoLmV4aXN0cyhwYXRoKQoKICAgIGRlZiBnZXRfY2FjaGVfaW5mbyhzZWxmLCByZXNvdXJjZSk6CiAgICAgICAgcmV0dXJuIE5vbmUsIHJlc291cmNlLnBhdGgKCiAgICBkZWYgZmluZChzZWxmLCByZXNvdXJjZV9uYW1lKToKICAgICAgICBwYXRoID0gc2VsZi5fbWFrZV9wYXRoKHJlc291cmNlX25hbWUpCiAgICAgICAgaWYgbm90IHNlbGYuX2ZpbmQocGF0aCk6CiAgICAgICAgICAgIHJlc3VsdCA9IE5vbmUKICAgICAgICBlbHNlOgogICAgICAgICAgICBpZiBzZWxmLl9pc19kaXJlY3RvcnkocGF0aCk6CiAgICAgICAgICAgICAgICByZXN1bHQgPSBSZXNvdXJjZUNvbnRhaW5lcihzZWxmLCByZXNvdXJjZV9uYW1lKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmVzdWx0ID0gUmVzb3VyY2Uoc2VsZiwgcmVzb3VyY2VfbmFtZSkKICAgICAgICAgICAgcmVzdWx0LnBhdGggPSBwYXRoCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBnZXRfc3RyZWFtKHNlbGYsIHJlc291cmNlKToKICAgICAgICByZXR1cm4gb3BlbihyZXNvdXJjZS5wYXRoLCAncmInKQoKICAgIGRlZiBnZXRfYnl0ZXMoc2VsZiwgcmVzb3VyY2UpOgogICAgICAgIHdpdGggb3BlbihyZXNvdXJjZS5wYXRoLCAncmInKSBhcyBmOgogICAgICAgICAgICByZXR1cm4gZi5yZWFkKCkKCiAgICBkZWYgZ2V0X3NpemUoc2VsZiwgcmVzb3VyY2UpOgogICAgICAgIHJldHVybiBvcy5wYXRoLmdldHNpemUocmVzb3VyY2UucGF0aCkKCiAgICBkZWYgZ2V0X3Jlc291cmNlcyhzZWxmLCByZXNvdXJjZSk6CiAgICAgICAgZGVmIGFsbG93ZWQoZik6CiAgICAgICAgICAgIHJldHVybiAoZiAhPSAnX19weWNhY2hlX18nIGFuZCBub3QKICAgICAgICAgICAgICAgICAgICBmLmVuZHN3aXRoKHNlbGYuc2tpcHBlZF9leHRlbnNpb25zKSkKICAgICAgICByZXR1cm4gc2V0KFtmIGZvciBmIGluIG9zLmxpc3RkaXIocmVzb3VyY2UucGF0aCkgaWYgYWxsb3dlZChmKV0pCgogICAgZGVmIGlzX2NvbnRhaW5lcihzZWxmLCByZXNvdXJjZSk6CiAgICAgICAgcmV0dXJuIHNlbGYuX2lzX2RpcmVjdG9yeShyZXNvdXJjZS5wYXRoKQoKICAgIF9pc19kaXJlY3RvcnkgPSBzdGF0aWNtZXRob2Qob3MucGF0aC5pc2RpcikKCiAgICBkZWYgaXRlcmF0b3Ioc2VsZiwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgcmVzb3VyY2UgPSBzZWxmLmZpbmQocmVzb3VyY2VfbmFtZSkKICAgICAgICBpZiByZXNvdXJjZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgdG9kbyA9IFtyZXNvdXJjZV0KICAgICAgICAgICAgd2hpbGUgdG9kbzoKICAgICAgICAgICAgICAgIHJlc291cmNlID0gdG9kby5wb3AoMCkKICAgICAgICAgICAgICAgIHlpZWxkIHJlc291cmNlCiAgICAgICAgICAgICAgICBpZiByZXNvdXJjZS5pc19jb250YWluZXI6CiAgICAgICAgICAgICAgICAgICAgcm5hbWUgPSByZXNvdXJjZS5uYW1lCiAgICAgICAgICAgICAgICAgICAgZm9yIG5hbWUgaW4gcmVzb3VyY2UucmVzb3VyY2VzOgogICAgICAgICAgICAgICAgICAgICAgICBpZiBub3Qgcm5hbWU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfbmFtZSA9IG5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19uYW1lID0gJy8nLmpvaW4oW3JuYW1lLCBuYW1lXSkKICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQgPSBzZWxmLmZpbmQobmV3X25hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGNoaWxkLmlzX2NvbnRhaW5lcjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvZG8uYXBwZW5kKGNoaWxkKQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgY2hpbGQKCgpjbGFzcyBaaXBSZXNvdXJjZUZpbmRlcihSZXNvdXJjZUZpbmRlcik6CiAgICAiIiIKICAgIFJlc291cmNlIGZpbmRlciBmb3IgcmVzb3VyY2VzIGluIC56aXAgZmlsZXMuCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtb2R1bGUpOgogICAgICAgIHN1cGVyKFppcFJlc291cmNlRmluZGVyLCBzZWxmKS5fX2luaXRfXyhtb2R1bGUpCiAgICAgICAgYXJjaGl2ZSA9IHNlbGYubG9hZGVyLmFyY2hpdmUKICAgICAgICBzZWxmLnByZWZpeF9sZW4gPSAxICsgbGVuKGFyY2hpdmUpCiAgICAgICAgIyBQeVB5IGRvZXNuJ3QgaGF2ZSBhIF9maWxlcyBhdHRyIG9uIHppcGltcG9ydGVyLCBhbmQgeW91IGNhbid0IHNldCBvbmUKICAgICAgICBpZiBoYXNhdHRyKHNlbGYubG9hZGVyLCAnX2ZpbGVzJyk6CiAgICAgICAgICAgIHNlbGYuX2ZpbGVzID0gc2VsZi5sb2FkZXIuX2ZpbGVzCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5fZmlsZXMgPSB6aXBpbXBvcnQuX3ppcF9kaXJlY3RvcnlfY2FjaGVbYXJjaGl2ZV0KICAgICAgICBzZWxmLmluZGV4ID0gc29ydGVkKHNlbGYuX2ZpbGVzKQoKICAgIGRlZiBfYWRqdXN0X3BhdGgoc2VsZiwgcGF0aCk6CiAgICAgICAgcmV0dXJuIHBhdGgKCiAgICBkZWYgX2ZpbmQoc2VsZiwgcGF0aCk6CiAgICAgICAgcGF0aCA9IHBhdGhbc2VsZi5wcmVmaXhfbGVuOl0KICAgICAgICBpZiBwYXRoIGluIHNlbGYuX2ZpbGVzOgogICAgICAgICAgICByZXN1bHQgPSBUcnVlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaWYgcGF0aCBhbmQgcGF0aFstMV0gIT0gb3Muc2VwOgogICAgICAgICAgICAgICAgcGF0aCA9IHBhdGggKyBvcy5zZXAKICAgICAgICAgICAgaSA9IGJpc2VjdC5iaXNlY3Qoc2VsZi5pbmRleCwgcGF0aCkKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5pbmRleFtpXS5zdGFydHN3aXRoKHBhdGgpCiAgICAgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgogICAgICAgICAgICAgICAgcmVzdWx0ID0gRmFsc2UKICAgICAgICBpZiBub3QgcmVzdWx0OgogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ19maW5kIGZhaWxlZDogJXIgJXInLCBwYXRoLCBzZWxmLmxvYWRlci5wcmVmaXgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdfZmluZCB3b3JrZWQ6ICVyICVyJywgcGF0aCwgc2VsZi5sb2FkZXIucHJlZml4KQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgZ2V0X2NhY2hlX2luZm8oc2VsZiwgcmVzb3VyY2UpOgogICAgICAgIHByZWZpeCA9IHNlbGYubG9hZGVyLmFyY2hpdmUKICAgICAgICBwYXRoID0gcmVzb3VyY2UucGF0aFsxICsgbGVuKHByZWZpeCk6XQogICAgICAgIHJldHVybiBwcmVmaXgsIHBhdGgKCiAgICBkZWYgZ2V0X2J5dGVzKHNlbGYsIHJlc291cmNlKToKICAgICAgICByZXR1cm4gc2VsZi5sb2FkZXIuZ2V0X2RhdGEocmVzb3VyY2UucGF0aCkKCiAgICBkZWYgZ2V0X3N0cmVhbShzZWxmLCByZXNvdXJjZSk6CiAgICAgICAgcmV0dXJuIGlvLkJ5dGVzSU8oc2VsZi5nZXRfYnl0ZXMocmVzb3VyY2UpKQoKICAgIGRlZiBnZXRfc2l6ZShzZWxmLCByZXNvdXJjZSk6CiAgICAgICAgcGF0aCA9IHJlc291cmNlLnBhdGhbc2VsZi5wcmVmaXhfbGVuOl0KICAgICAgICByZXR1cm4gc2VsZi5fZmlsZXNbcGF0aF1bM10KCiAgICBkZWYgZ2V0X3Jlc291cmNlcyhzZWxmLCByZXNvdXJjZSk6CiAgICAgICAgcGF0aCA9IHJlc291cmNlLnBhdGhbc2VsZi5wcmVmaXhfbGVuOl0KICAgICAgICBpZiBwYXRoIGFuZCBwYXRoWy0xXSAhPSBvcy5zZXA6CiAgICAgICAgICAgIHBhdGggKz0gb3Muc2VwCiAgICAgICAgcGxlbiA9IGxlbihwYXRoKQogICAgICAgIHJlc3VsdCA9IHNldCgpCiAgICAgICAgaSA9IGJpc2VjdC5iaXNlY3Qoc2VsZi5pbmRleCwgcGF0aCkKICAgICAgICB3aGlsZSBpIDwgbGVuKHNlbGYuaW5kZXgpOgogICAgICAgICAgICBpZiBub3Qgc2VsZi5pbmRleFtpXS5zdGFydHN3aXRoKHBhdGgpOgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgcyA9IHNlbGYuaW5kZXhbaV1bcGxlbjpdCiAgICAgICAgICAgIHJlc3VsdC5hZGQocy5zcGxpdChvcy5zZXAsIDEpWzBdKSAgICMgb25seSBpbW1lZGlhdGUgY2hpbGRyZW4KICAgICAgICAgICAgaSArPSAxCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBfaXNfZGlyZWN0b3J5KHNlbGYsIHBhdGgpOgogICAgICAgIHBhdGggPSBwYXRoW3NlbGYucHJlZml4X2xlbjpdCiAgICAgICAgaWYgcGF0aCBhbmQgcGF0aFstMV0gIT0gb3Muc2VwOgogICAgICAgICAgICBwYXRoICs9IG9zLnNlcAogICAgICAgIGkgPSBiaXNlY3QuYmlzZWN0KHNlbGYuaW5kZXgsIHBhdGgpCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXN1bHQgPSBzZWxmLmluZGV4W2ldLnN0YXJ0c3dpdGgocGF0aCkKICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoKICAgICAgICAgICAgcmVzdWx0ID0gRmFsc2UKICAgICAgICByZXR1cm4gcmVzdWx0CgpfZmluZGVyX3JlZ2lzdHJ5ID0gewogICAgdHlwZShOb25lKTogUmVzb3VyY2VGaW5kZXIsCiAgICB6aXBpbXBvcnQuemlwaW1wb3J0ZXI6IFppcFJlc291cmNlRmluZGVyCn0KCnRyeToKICAgICMgSW4gUHl0aG9uIDMuNiwgX2Zyb3plbl9pbXBvcnRsaWIgLT4gX2Zyb3plbl9pbXBvcnRsaWJfZXh0ZXJuYWwKICAgIHRyeToKICAgICAgICBpbXBvcnQgX2Zyb3plbl9pbXBvcnRsaWJfZXh0ZXJuYWwgYXMgX2ZpCiAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgaW1wb3J0IF9mcm96ZW5faW1wb3J0bGliIGFzIF9maQogICAgX2ZpbmRlcl9yZWdpc3RyeVtfZmkuU291cmNlRmlsZUxvYWRlcl0gPSBSZXNvdXJjZUZpbmRlcgogICAgX2ZpbmRlcl9yZWdpc3RyeVtfZmkuRmlsZUZpbmRlcl0gPSBSZXNvdXJjZUZpbmRlcgogICAgZGVsIF9maQpleGNlcHQgKEltcG9ydEVycm9yLCBBdHRyaWJ1dGVFcnJvcik6CiAgICBwYXNzCgoKZGVmIHJlZ2lzdGVyX2ZpbmRlcihsb2FkZXIsIGZpbmRlcl9tYWtlcik6CiAgICBfZmluZGVyX3JlZ2lzdHJ5W3R5cGUobG9hZGVyKV0gPSBmaW5kZXJfbWFrZXIKCl9maW5kZXJfY2FjaGUgPSB7fQoKCmRlZiBmaW5kZXIocGFja2FnZSk6CiAgICAiIiIKICAgIFJldHVybiBhIHJlc291cmNlIGZpbmRlciBmb3IgYSBwYWNrYWdlLgogICAgOnBhcmFtIHBhY2thZ2U6IFRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlLgogICAgOnJldHVybjogQSA6Y2xhc3M6YFJlc291cmNlRmluZGVyYCBpbnN0YW5jZSBmb3IgdGhlIHBhY2thZ2UuCiAgICAiIiIKICAgIGlmIHBhY2thZ2UgaW4gX2ZpbmRlcl9jYWNoZToKICAgICAgICByZXN1bHQgPSBfZmluZGVyX2NhY2hlW3BhY2thZ2VdCiAgICBlbHNlOgogICAgICAgIGlmIHBhY2thZ2Ugbm90IGluIHN5cy5tb2R1bGVzOgogICAgICAgICAgICBfX2ltcG9ydF9fKHBhY2thZ2UpCiAgICAgICAgbW9kdWxlID0gc3lzLm1vZHVsZXNbcGFja2FnZV0KICAgICAgICBwYXRoID0gZ2V0YXR0cihtb2R1bGUsICdfX3BhdGhfXycsIE5vbmUpCiAgICAgICAgaWYgcGF0aCBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKCdZb3UgY2Fubm90IGdldCBhIGZpbmRlciBmb3IgYSBtb2R1bGUsICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb25seSBmb3IgYSBwYWNrYWdlJykKICAgICAgICBsb2FkZXIgPSBnZXRhdHRyKG1vZHVsZSwgJ19fbG9hZGVyX18nLCBOb25lKQogICAgICAgIGZpbmRlcl9tYWtlciA9IF9maW5kZXJfcmVnaXN0cnkuZ2V0KHR5cGUobG9hZGVyKSkKICAgICAgICBpZiBmaW5kZXJfbWFrZXIgaXMgTm9uZToKICAgICAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbignVW5hYmxlIHRvIGxvY2F0ZSBmaW5kZXIgZm9yICVyJyAlIHBhY2thZ2UpCiAgICAgICAgcmVzdWx0ID0gZmluZGVyX21ha2VyKG1vZHVsZSkKICAgICAgICBfZmluZGVyX2NhY2hlW3BhY2thZ2VdID0gcmVzdWx0CiAgICByZXR1cm4gcmVzdWx0CgoKX2R1bW15X21vZHVsZSA9IHR5cGVzLk1vZHVsZVR5cGUoc3RyKCdfX2R1bW15X18nKSkKCgpkZWYgZmluZGVyX2Zvcl9wYXRoKHBhdGgpOgogICAgIiIiCiAgICBSZXR1cm4gYSByZXNvdXJjZSBmaW5kZXIgZm9yIGEgcGF0aCwgd2hpY2ggc2hvdWxkIHJlcHJlc2VudCBhIGNvbnRhaW5lci4KCiAgICA6cGFyYW0gcGF0aDogVGhlIHBhdGguCiAgICA6cmV0dXJuOiBBIDpjbGFzczpgUmVzb3VyY2VGaW5kZXJgIGluc3RhbmNlIGZvciB0aGUgcGF0aC4KICAgICIiIgogICAgcmVzdWx0ID0gTm9uZQogICAgIyBjYWxscyBhbnkgcGF0aCBob29rcywgZ2V0cyBpbXBvcnRlciBpbnRvIGNhY2hlCiAgICBwa2d1dGlsLmdldF9pbXBvcnRlcihwYXRoKQogICAgbG9hZGVyID0gc3lzLnBhdGhfaW1wb3J0ZXJfY2FjaGUuZ2V0KHBhdGgpCiAgICBmaW5kZXIgPSBfZmluZGVyX3JlZ2lzdHJ5LmdldCh0eXBlKGxvYWRlcikpCiAgICBpZiBmaW5kZXI6CiAgICAgICAgbW9kdWxlID0gX2R1bW15X21vZHVsZQogICAgICAgIG1vZHVsZS5fX2ZpbGVfXyA9IG9zLnBhdGguam9pbihwYXRoLCAnJykKICAgICAgICBtb2R1bGUuX19sb2FkZXJfXyA9IGxvYWRlcgogICAgICAgIHJlc3VsdCA9IGZpbmRlcihtb2R1bGUpCiAgICByZXR1cm4gcmVzdWx0ClBLAwQUAAAAAAAAACEAuv/r23g7AAB4OwAAOwAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvZGlzdGxpYi9zY3JpcHRzLnB5IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KIwojIENvcHlyaWdodCAoQykgMjAxMy0yMDE1IFZpbmF5IFNhamlwLgojIExpY2Vuc2VkIHRvIHRoZSBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbiB1bmRlciBhIGNvbnRyaWJ1dG9yIGFncmVlbWVudC4KIyBTZWUgTElDRU5TRS50eHQgYW5kIENPTlRSSUJVVE9SUy50eHQuCiMKZnJvbSBpbyBpbXBvcnQgQnl0ZXNJTwppbXBvcnQgbG9nZ2luZwppbXBvcnQgb3MKaW1wb3J0IHJlCmltcG9ydCBzdHJ1Y3QKaW1wb3J0IHN5cwoKZnJvbSAuY29tcGF0IGltcG9ydCBzeXNjb25maWcsIGRldGVjdF9lbmNvZGluZywgWmlwRmlsZQpmcm9tIC5yZXNvdXJjZXMgaW1wb3J0IGZpbmRlcgpmcm9tIC51dGlsIGltcG9ydCAoRmlsZU9wZXJhdG9yLCBnZXRfZXhwb3J0X2VudHJ5LCBjb252ZXJ0X3BhdGgsCiAgICAgICAgICAgICAgICAgICBnZXRfZXhlY3V0YWJsZSwgaW5fdmVudikKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKX0RFRkFVTFRfTUFOSUZFU1QgPSAnJycKPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/Pgo8YXNzZW1ibHkgeG1sbnM9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206YXNtLnYxIiBtYW5pZmVzdFZlcnNpb249IjEuMCI+CiA8YXNzZW1ibHlJZGVudGl0eSB2ZXJzaW9uPSIxLjAuMC4wIgogcHJvY2Vzc29yQXJjaGl0ZWN0dXJlPSJYODYiCiBuYW1lPSIlcyIKIHR5cGU9IndpbjMyIi8+CgogPCEtLSBJZGVudGlmeSB0aGUgYXBwbGljYXRpb24gc2VjdXJpdHkgcmVxdWlyZW1lbnRzLiAtLT4KIDx0cnVzdEluZm8geG1sbnM9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206YXNtLnYzIj4KIDxzZWN1cml0eT4KIDxyZXF1ZXN0ZWRQcml2aWxlZ2VzPgogPHJlcXVlc3RlZEV4ZWN1dGlvbkxldmVsIGxldmVsPSJhc0ludm9rZXIiIHVpQWNjZXNzPSJmYWxzZSIvPgogPC9yZXF1ZXN0ZWRQcml2aWxlZ2VzPgogPC9zZWN1cml0eT4KIDwvdHJ1c3RJbmZvPgo8L2Fzc2VtYmx5PicnJy5zdHJpcCgpCgojIGNoZWNrIGlmIFB5dGhvbiBpcyBjYWxsZWQgb24gdGhlIGZpcnN0IGxpbmUgd2l0aCB0aGlzIGV4cHJlc3Npb24KRklSU1RfTElORV9SRSA9IHJlLmNvbXBpbGUoYideIyEuKnB5dGhvbnc/WzAtOS5dKihbIFx0XS4qKT8kJykKU0NSSVBUX1RFTVBMQVRFID0gJycnIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgIGltcG9ydCBzeXMsIHJlCgogICAgZGVmIF9yZXNvbHZlKG1vZHVsZSwgZnVuYyk6CiAgICAgICAgX19pbXBvcnRfXyhtb2R1bGUpCiAgICAgICAgbW9kID0gc3lzLm1vZHVsZXNbbW9kdWxlXQogICAgICAgIHBhcnRzID0gZnVuYy5zcGxpdCgnLicpCiAgICAgICAgcmVzdWx0ID0gZ2V0YXR0cihtb2QsIHBhcnRzLnBvcCgwKSkKICAgICAgICBmb3IgcCBpbiBwYXJ0czoKICAgICAgICAgICAgcmVzdWx0ID0gZ2V0YXR0cihyZXN1bHQsIHApCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIHRyeToKICAgICAgICBzeXMuYXJndlswXSA9IHJlLnN1YihyJygtc2NyaXB0XC5weXc/fFwuZXhlKT8kJywgJycsIHN5cy5hcmd2WzBdKQoKICAgICAgICBmdW5jID0gX3Jlc29sdmUoJyUobW9kdWxlKXMnLCAnJShmdW5jKXMnKQogICAgICAgIHJjID0gZnVuYygpICMgTm9uZSBpbnRlcnByZXRlZCBhcyAwCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6ICAjIG9ubHkgc3VwcG9ydGluZyBQeXRob24gPj0gMi42CiAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgnJSVzXFxuJyAlJSBlKQogICAgICAgIHJjID0gMQogICAgc3lzLmV4aXQocmMpCicnJwoKCmRlZiBfZW5xdW90ZV9leGVjdXRhYmxlKGV4ZWN1dGFibGUpOgogICAgaWYgJyAnIGluIGV4ZWN1dGFibGU6CiAgICAgICAgIyBtYWtlIHN1cmUgd2UgcXVvdGUgb25seSB0aGUgZXhlY3V0YWJsZSBpbiBjYXNlIG9mIGVudgogICAgICAgICMgZm9yIGV4YW1wbGUgL3Vzci9iaW4vZW52ICIvZGlyIHdpdGggc3BhY2VzL2Jpbi9qeXRob24iCiAgICAgICAgIyBpbnN0ZWFkIG9mICIvdXNyL2Jpbi9lbnYgL2RpciB3aXRoIHNwYWNlcy9iaW4vanl0aG9uIgogICAgICAgICMgb3RoZXJ3aXNlIHdob2xlCiAgICAgICAgaWYgZXhlY3V0YWJsZS5zdGFydHN3aXRoKCcvdXNyL2Jpbi9lbnYgJyk6CiAgICAgICAgICAgIGVudiwgX2V4ZWN1dGFibGUgPSBleGVjdXRhYmxlLnNwbGl0KCcgJywgMSkKICAgICAgICAgICAgaWYgJyAnIGluIF9leGVjdXRhYmxlIGFuZCBub3QgX2V4ZWN1dGFibGUuc3RhcnRzd2l0aCgnIicpOgogICAgICAgICAgICAgICAgZXhlY3V0YWJsZSA9ICclcyAiJXMiJyAlIChlbnYsIF9leGVjdXRhYmxlKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlmIG5vdCBleGVjdXRhYmxlLnN0YXJ0c3dpdGgoJyInKToKICAgICAgICAgICAgICAgIGV4ZWN1dGFibGUgPSAnIiVzIicgJSBleGVjdXRhYmxlCiAgICByZXR1cm4gZXhlY3V0YWJsZQoKCmNsYXNzIFNjcmlwdE1ha2VyKG9iamVjdCk6CiAgICAiIiIKICAgIEEgY2xhc3MgdG8gY29weSBvciBjcmVhdGUgc2NyaXB0cyBmcm9tIHNvdXJjZSBzY3JpcHRzIG9yIGNhbGxhYmxlCiAgICBzcGVjaWZpY2F0aW9ucy4KICAgICIiIgogICAgc2NyaXB0X3RlbXBsYXRlID0gU0NSSVBUX1RFTVBMQVRFCgogICAgZXhlY3V0YWJsZSA9IE5vbmUgICMgZm9yIHNoZWJhbmdzCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHNvdXJjZV9kaXIsIHRhcmdldF9kaXIsIGFkZF9sYXVuY2hlcnM9VHJ1ZSwKICAgICAgICAgICAgICAgICBkcnlfcnVuPUZhbHNlLCBmaWxlb3A9Tm9uZSk6CiAgICAgICAgc2VsZi5zb3VyY2VfZGlyID0gc291cmNlX2RpcgogICAgICAgIHNlbGYudGFyZ2V0X2RpciA9IHRhcmdldF9kaXIKICAgICAgICBzZWxmLmFkZF9sYXVuY2hlcnMgPSBhZGRfbGF1bmNoZXJzCiAgICAgICAgc2VsZi5mb3JjZSA9IEZhbHNlCiAgICAgICAgc2VsZi5jbG9iYmVyID0gRmFsc2UKICAgICAgICAjIEl0IG9ubHkgbWFrZXMgc2Vuc2UgdG8gc2V0IG1vZGUgYml0cyBvbiBQT1NJWC4KICAgICAgICBzZWxmLnNldF9tb2RlID0gKG9zLm5hbWUgPT0gJ3Bvc2l4Jykgb3IgKG9zLm5hbWUgPT0gJ2phdmEnIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MuX25hbWUgPT0gJ3Bvc2l4JykKICAgICAgICBzZWxmLnZhcmlhbnRzID0gc2V0KCgnJywgJ1guWScpKQogICAgICAgIHNlbGYuX2ZpbGVvcCA9IGZpbGVvcCBvciBGaWxlT3BlcmF0b3IoZHJ5X3J1bikKCiAgICAgICAgc2VsZi5faXNfbnQgPSBvcy5uYW1lID09ICdudCcgb3IgKAogICAgICAgICAgICBvcy5uYW1lID09ICdqYXZhJyBhbmQgb3MuX25hbWUgPT0gJ250JykKCiAgICBkZWYgX2dldF9hbHRlcm5hdGVfZXhlY3V0YWJsZShzZWxmLCBleGVjdXRhYmxlLCBvcHRpb25zKToKICAgICAgICBpZiBvcHRpb25zLmdldCgnZ3VpJywgRmFsc2UpIGFuZCBzZWxmLl9pc19udDogICMgcHJhZ21hOiBubyBjb3ZlcgogICAgICAgICAgICBkbiwgZm4gPSBvcy5wYXRoLnNwbGl0KGV4ZWN1dGFibGUpCiAgICAgICAgICAgIGZuID0gZm4ucmVwbGFjZSgncHl0aG9uJywgJ3B5dGhvbncnKQogICAgICAgICAgICBleGVjdXRhYmxlID0gb3MucGF0aC5qb2luKGRuLCBmbikKICAgICAgICByZXR1cm4gZXhlY3V0YWJsZQoKICAgIGlmIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdqYXZhJyk6ICAjIHByYWdtYTogbm8gY292ZXIKICAgICAgICBkZWYgX2lzX3NoZWxsKHNlbGYsIGV4ZWN1dGFibGUpOgogICAgICAgICAgICAiIiIKICAgICAgICAgICAgRGV0ZXJtaW5lIGlmIHRoZSBzcGVjaWZpZWQgZXhlY3V0YWJsZSBpcyBhIHNjcmlwdAogICAgICAgICAgICAoY29udGFpbnMgYSAjISBsaW5lKQogICAgICAgICAgICAiIiIKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgd2l0aCBvcGVuKGV4ZWN1dGFibGUpIGFzIGZwOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBmcC5yZWFkKDIpID09ICcjIScKICAgICAgICAgICAgZXhjZXB0IChPU0Vycm9yLCBJT0Vycm9yKToKICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdGYWlsZWQgdG8gb3BlbiAlcycsIGV4ZWN1dGFibGUpCiAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgZGVmIF9maXhfanl0aG9uX2V4ZWN1dGFibGUoc2VsZiwgZXhlY3V0YWJsZSk6CiAgICAgICAgICAgIGlmIHNlbGYuX2lzX3NoZWxsKGV4ZWN1dGFibGUpOgogICAgICAgICAgICAgICAgIyBXb3JrYXJvdW5kIGZvciBKeXRob24gaXMgbm90IG5lZWRlZCBvbiBMaW51eCBzeXN0ZW1zLgogICAgICAgICAgICAgICAgaW1wb3J0IGphdmEKCiAgICAgICAgICAgICAgICBpZiBqYXZhLmxhbmcuU3lzdGVtLmdldFByb3BlcnR5KCdvcy5uYW1lJykgPT0gJ0xpbnV4JzoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXhlY3V0YWJsZQogICAgICAgICAgICBlbGlmIGV4ZWN1dGFibGUubG93ZXIoKS5lbmRzd2l0aCgnanl0aG9uLmV4ZScpOgogICAgICAgICAgICAgICAgIyBVc2Ugd3JhcHBlciBleGUgZm9yIEp5dGhvbiBvbiBXaW5kb3dzCiAgICAgICAgICAgICAgICByZXR1cm4gZXhlY3V0YWJsZQogICAgICAgICAgICByZXR1cm4gJy91c3IvYmluL2VudiAlcycgJSBleGVjdXRhYmxlCgogICAgZGVmIF9nZXRfc2hlYmFuZyhzZWxmLCBlbmNvZGluZywgcG9zdF9pbnRlcnA9YicnLCBvcHRpb25zPU5vbmUpOgogICAgICAgIGVucXVvdGUgPSBUcnVlCiAgICAgICAgaWYgc2VsZi5leGVjdXRhYmxlOgogICAgICAgICAgICBleGVjdXRhYmxlID0gc2VsZi5leGVjdXRhYmxlCiAgICAgICAgICAgIGVucXVvdGUgPSBGYWxzZSAgICAgIyBhc3N1bWUgdGhpcyB3aWxsIGJlIHRha2VuIGNhcmUgb2YKICAgICAgICBlbGlmIG5vdCBzeXNjb25maWcuaXNfcHl0aG9uX2J1aWxkKCk6CiAgICAgICAgICAgIGV4ZWN1dGFibGUgPSBnZXRfZXhlY3V0YWJsZSgpCiAgICAgICAgZWxpZiBpbl92ZW52KCk6ICAjIHByYWdtYTogbm8gY292ZXIKICAgICAgICAgICAgZXhlY3V0YWJsZSA9IG9zLnBhdGguam9pbihzeXNjb25maWcuZ2V0X3BhdGgoJ3NjcmlwdHMnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdweXRob24lcycgJSBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoJ0VYRScpKQogICAgICAgIGVsc2U6ICAjIHByYWdtYTogbm8gY292ZXIKICAgICAgICAgICAgZXhlY3V0YWJsZSA9IG9zLnBhdGguam9pbigKICAgICAgICAgICAgICAgIHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcignQklORElSJyksCiAgICAgICAgICAgICAgICdweXRob24lcyVzJyAlIChzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoJ1ZFUlNJT04nKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcignRVhFJykpKQogICAgICAgIGlmIG9wdGlvbnM6CiAgICAgICAgICAgIGV4ZWN1dGFibGUgPSBzZWxmLl9nZXRfYWx0ZXJuYXRlX2V4ZWN1dGFibGUoZXhlY3V0YWJsZSwgb3B0aW9ucykKCiAgICAgICAgaWYgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ2phdmEnKTogICMgcHJhZ21hOiBubyBjb3ZlcgogICAgICAgICAgICBleGVjdXRhYmxlID0gc2VsZi5fZml4X2p5dGhvbl9leGVjdXRhYmxlKGV4ZWN1dGFibGUpCiAgICAgICAgIyBOb3JtYWxpc2UgY2FzZSBmb3IgV2luZG93cwogICAgICAgIGV4ZWN1dGFibGUgPSBvcy5wYXRoLm5vcm1jYXNlKGV4ZWN1dGFibGUpCiAgICAgICAgIyBJZiB0aGUgdXNlciBkaWRuJ3Qgc3BlY2lmeSBhbiBleGVjdXRhYmxlLCBpdCBtYXkgYmUgbmVjZXNzYXJ5IHRvCiAgICAgICAgIyBjYXRlciBmb3IgZXhlY3V0YWJsZSBwYXRocyB3aXRoIHNwYWNlcyAobm90IHVuY29tbW9uIG9uIFdpbmRvd3MpCiAgICAgICAgaWYgZW5xdW90ZToKICAgICAgICAgICAgZXhlY3V0YWJsZSA9IF9lbnF1b3RlX2V4ZWN1dGFibGUoZXhlY3V0YWJsZSkKICAgICAgICAjIElzc3VlICM1MTogZG9uJ3QgdXNlIGZzZW5jb2RlLCBzaW5jZSB3ZSBsYXRlciB0cnkgdG8KICAgICAgICAjIGNoZWNrIHRoYXQgdGhlIHNoZWJhbmcgaXMgZGVjb2RhYmxlIHVzaW5nIHV0Zi04LgogICAgICAgIGV4ZWN1dGFibGUgPSBleGVjdXRhYmxlLmVuY29kZSgndXRmLTgnKQogICAgICAgICMgaW4gY2FzZSBvZiBJcm9uUHl0aG9uLCBwbGF5IHNhZmUgYW5kIGVuYWJsZSBmcmFtZXMgc3VwcG9ydAogICAgICAgIGlmIChzeXMucGxhdGZvcm0gPT0gJ2NsaScgYW5kICctWDpGcmFtZXMnIG5vdCBpbiBwb3N0X2ludGVycAogICAgICAgICAgICBhbmQgJy1YOkZ1bGxGcmFtZXMnIG5vdCBpbiBwb3N0X2ludGVycCk6ICAjIHByYWdtYTogbm8gY292ZXIKICAgICAgICAgICAgcG9zdF9pbnRlcnAgKz0gYicgLVg6RnJhbWVzJwogICAgICAgIHNoZWJhbmcgPSBiJyMhJyArIGV4ZWN1dGFibGUgKyBwb3N0X2ludGVycCArIGInXG4nCiAgICAgICAgIyBQeXRob24gcGFyc2VyIHN0YXJ0cyB0byByZWFkIGEgc2NyaXB0IHVzaW5nIFVURi04IHVudGlsCiAgICAgICAgIyBpdCBnZXRzIGEgI2NvZGluZzp4eHggY29va2llLiBUaGUgc2hlYmFuZyBoYXMgdG8gYmUgdGhlCiAgICAgICAgIyBmaXJzdCBsaW5lIG9mIGEgZmlsZSwgdGhlICNjb2Rpbmc6eHh4IGNvb2tpZSBjYW5ub3QgYmUKICAgICAgICAjIHdyaXR0ZW4gYmVmb3JlLiBTbyB0aGUgc2hlYmFuZyBoYXMgdG8gYmUgZGVjb2RhYmxlIGZyb20KICAgICAgICAjIFVURi04LgogICAgICAgIHRyeToKICAgICAgICAgICAgc2hlYmFuZy5kZWNvZGUoJ3V0Zi04JykKICAgICAgICBleGNlcHQgVW5pY29kZURlY29kZUVycm9yOiAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCiAgICAgICAgICAgICAgICAnVGhlIHNoZWJhbmcgKCVyKSBpcyBub3QgZGVjb2RhYmxlIGZyb20gdXRmLTgnICUgc2hlYmFuZykKICAgICAgICAjIElmIHRoZSBzY3JpcHQgaXMgZW5jb2RlZCB0byBhIGN1c3RvbSBlbmNvZGluZyAodXNlIGEKICAgICAgICAjICNjb2Rpbmc6eHh4IGNvb2tpZSksIHRoZSBzaGViYW5nIGhhcyB0byBiZSBkZWNvZGFibGUgZnJvbQogICAgICAgICMgdGhlIHNjcmlwdCBlbmNvZGluZyB0b28uCiAgICAgICAgaWYgZW5jb2RpbmcgIT0gJ3V0Zi04JzoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgc2hlYmFuZy5kZWNvZGUoZW5jb2RpbmcpCiAgICAgICAgICAgIGV4Y2VwdCBVbmljb2RlRGVjb2RlRXJyb3I6ICAjIHByYWdtYTogbm8gY292ZXIKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgJ1RoZSBzaGViYW5nICglcikgaXMgbm90IGRlY29kYWJsZSAnCiAgICAgICAgICAgICAgICAgICAgJ2Zyb20gdGhlIHNjcmlwdCBlbmNvZGluZyAoJXIpJyAlIChzaGViYW5nLCBlbmNvZGluZykpCiAgICAgICAgcmV0dXJuIHNoZWJhbmcKCiAgICBkZWYgX2dldF9zY3JpcHRfdGV4dChzZWxmLCBlbnRyeSk6CiAgICAgICAgcmV0dXJuIHNlbGYuc2NyaXB0X3RlbXBsYXRlICUgZGljdChtb2R1bGU9ZW50cnkucHJlZml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYz1lbnRyeS5zdWZmaXgpCgogICAgbWFuaWZlc3QgPSBfREVGQVVMVF9NQU5JRkVTVAoKICAgIGRlZiBnZXRfbWFuaWZlc3Qoc2VsZiwgZXhlbmFtZSk6CiAgICAgICAgYmFzZSA9IG9zLnBhdGguYmFzZW5hbWUoZXhlbmFtZSkKICAgICAgICByZXR1cm4gc2VsZi5tYW5pZmVzdCAlIGJhc2UKCiAgICBkZWYgX3dyaXRlX3NjcmlwdChzZWxmLCBuYW1lcywgc2hlYmFuZywgc2NyaXB0X2J5dGVzLCBmaWxlbmFtZXMsIGV4dCk6CiAgICAgICAgdXNlX2xhdW5jaGVyID0gc2VsZi5hZGRfbGF1bmNoZXJzIGFuZCBzZWxmLl9pc19udAogICAgICAgIGxpbmVzZXAgPSBvcy5saW5lc2VwLmVuY29kZSgndXRmLTgnKQogICAgICAgIGlmIG5vdCB1c2VfbGF1bmNoZXI6CiAgICAgICAgICAgIHNjcmlwdF9ieXRlcyA9IHNoZWJhbmcgKyBsaW5lc2VwICsgc2NyaXB0X2J5dGVzCiAgICAgICAgZWxzZTogICMgcHJhZ21hOiBubyBjb3ZlcgogICAgICAgICAgICBpZiBleHQgPT0gJ3B5JzoKICAgICAgICAgICAgICAgIGxhdW5jaGVyID0gc2VsZi5fZ2V0X2xhdW5jaGVyKCd0JykKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGxhdW5jaGVyID0gc2VsZi5fZ2V0X2xhdW5jaGVyKCd3JykKICAgICAgICAgICAgc3RyZWFtID0gQnl0ZXNJTygpCiAgICAgICAgICAgIHdpdGggWmlwRmlsZShzdHJlYW0sICd3JykgYXMgemY6CiAgICAgICAgICAgICAgICB6Zi53cml0ZXN0cignX19tYWluX18ucHknLCBzY3JpcHRfYnl0ZXMpCiAgICAgICAgICAgIHppcF9kYXRhID0gc3RyZWFtLmdldHZhbHVlKCkKICAgICAgICAgICAgc2NyaXB0X2J5dGVzID0gbGF1bmNoZXIgKyBzaGViYW5nICsgbGluZXNlcCArIHppcF9kYXRhCiAgICAgICAgZm9yIG5hbWUgaW4gbmFtZXM6CiAgICAgICAgICAgIG91dG5hbWUgPSBvcy5wYXRoLmpvaW4oc2VsZi50YXJnZXRfZGlyLCBuYW1lKQogICAgICAgICAgICBpZiB1c2VfbGF1bmNoZXI6ICAjIHByYWdtYTogbm8gY292ZXIKICAgICAgICAgICAgICAgIG4sIGUgPSBvcy5wYXRoLnNwbGl0ZXh0KG91dG5hbWUpCiAgICAgICAgICAgICAgICBpZiBlLnN0YXJ0c3dpdGgoJy5weScpOgogICAgICAgICAgICAgICAgICAgIG91dG5hbWUgPSBuCiAgICAgICAgICAgICAgICBvdXRuYW1lID0gJyVzLmV4ZScgJSBvdXRuYW1lCiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fZmlsZW9wLndyaXRlX2JpbmFyeV9maWxlKG91dG5hbWUsIHNjcmlwdF9ieXRlcykKICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgICAgICAgICAgIyBGYWlsZWQgd3JpdGluZyBhbiBleGVjdXRhYmxlIC0gaXQgbWlnaHQgYmUgaW4gdXNlLgogICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdGYWlsZWQgdG8gd3JpdGUgZXhlY3V0YWJsZSAtIHRyeWluZyB0byAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZSAuZGVsZXRlbWUgbG9naWMnKQogICAgICAgICAgICAgICAgICAgIGRmbmFtZSA9ICclcy5kZWxldGVtZScgJSBvdXRuYW1lCiAgICAgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoZGZuYW1lKToKICAgICAgICAgICAgICAgICAgICAgICAgb3MucmVtb3ZlKGRmbmFtZSkgICAgICAgIyBOb3QgYWxsb3dlZCB0byBmYWlsIGhlcmUKICAgICAgICAgICAgICAgICAgICBvcy5yZW5hbWUob3V0bmFtZSwgZGZuYW1lKSAgIyBub3IgaGVyZQogICAgICAgICAgICAgICAgICAgIHNlbGYuX2ZpbGVvcC53cml0ZV9iaW5hcnlfZmlsZShvdXRuYW1lLCBzY3JpcHRfYnl0ZXMpCiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdBYmxlIHRvIHJlcGxhY2UgZXhlY3V0YWJsZSB1c2luZyAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcuZGVsZXRlbWUgbG9naWMnKQogICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgb3MucmVtb3ZlKGRmbmFtZSkKICAgICAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgICAgICAgICBwYXNzICAgICMgc3RpbGwgaW4gdXNlIC0gaWdub3JlIGVycm9yCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBpZiBzZWxmLl9pc19udCBhbmQgbm90IG91dG5hbWUuZW5kc3dpdGgoJy4nICsgZXh0KTogICMgcHJhZ21hOiBubyBjb3ZlcgogICAgICAgICAgICAgICAgICAgIG91dG5hbWUgPSAnJXMuJXMnICUgKG91dG5hbWUsIGV4dCkKICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKG91dG5hbWUpIGFuZCBub3Qgc2VsZi5jbG9iYmVyOgogICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdTa2lwcGluZyBleGlzdGluZyBmaWxlICVzJywgb3V0bmFtZSkKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgc2VsZi5fZmlsZW9wLndyaXRlX2JpbmFyeV9maWxlKG91dG5hbWUsIHNjcmlwdF9ieXRlcykKICAgICAgICAgICAgICAgIGlmIHNlbGYuc2V0X21vZGU6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fZmlsZW9wLnNldF9leGVjdXRhYmxlX21vZGUoW291dG5hbWVdKQogICAgICAgICAgICBmaWxlbmFtZXMuYXBwZW5kKG91dG5hbWUpCgogICAgZGVmIF9tYWtlX3NjcmlwdChzZWxmLCBlbnRyeSwgZmlsZW5hbWVzLCBvcHRpb25zPU5vbmUpOgogICAgICAgIHBvc3RfaW50ZXJwID0gYicnCiAgICAgICAgaWYgb3B0aW9uczoKICAgICAgICAgICAgYXJncyA9IG9wdGlvbnMuZ2V0KCdpbnRlcnByZXRlcl9hcmdzJywgW10pCiAgICAgICAgICAgIGlmIGFyZ3M6CiAgICAgICAgICAgICAgICBhcmdzID0gJyAlcycgJSAnICcuam9pbihhcmdzKQogICAgICAgICAgICAgICAgcG9zdF9pbnRlcnAgPSBhcmdzLmVuY29kZSgndXRmLTgnKQogICAgICAgIHNoZWJhbmcgPSBzZWxmLl9nZXRfc2hlYmFuZygndXRmLTgnLCBwb3N0X2ludGVycCwgb3B0aW9ucz1vcHRpb25zKQogICAgICAgIHNjcmlwdCA9IHNlbGYuX2dldF9zY3JpcHRfdGV4dChlbnRyeSkuZW5jb2RlKCd1dGYtOCcpCiAgICAgICAgbmFtZSA9IGVudHJ5Lm5hbWUKICAgICAgICBzY3JpcHRuYW1lcyA9IHNldCgpCiAgICAgICAgaWYgJycgaW4gc2VsZi52YXJpYW50czoKICAgICAgICAgICAgc2NyaXB0bmFtZXMuYWRkKG5hbWUpCiAgICAgICAgaWYgJ1gnIGluIHNlbGYudmFyaWFudHM6CiAgICAgICAgICAgIHNjcmlwdG5hbWVzLmFkZCgnJXMlcycgJSAobmFtZSwgc3lzLnZlcnNpb25bMF0pKQogICAgICAgIGlmICdYLlknIGluIHNlbGYudmFyaWFudHM6CiAgICAgICAgICAgIHNjcmlwdG5hbWVzLmFkZCgnJXMtJXMnICUgKG5hbWUsIHN5cy52ZXJzaW9uWzozXSkpCiAgICAgICAgaWYgb3B0aW9ucyBhbmQgb3B0aW9ucy5nZXQoJ2d1aScsIEZhbHNlKToKICAgICAgICAgICAgZXh0ID0gJ3B5dycKICAgICAgICBlbHNlOgogICAgICAgICAgICBleHQgPSAncHknCiAgICAgICAgc2VsZi5fd3JpdGVfc2NyaXB0KHNjcmlwdG5hbWVzLCBzaGViYW5nLCBzY3JpcHQsIGZpbGVuYW1lcywgZXh0KQoKICAgIGRlZiBfY29weV9zY3JpcHQoc2VsZiwgc2NyaXB0LCBmaWxlbmFtZXMpOgogICAgICAgIGFkanVzdCA9IEZhbHNlCiAgICAgICAgc2NyaXB0ID0gb3MucGF0aC5qb2luKHNlbGYuc291cmNlX2RpciwgY29udmVydF9wYXRoKHNjcmlwdCkpCiAgICAgICAgb3V0bmFtZSA9IG9zLnBhdGguam9pbihzZWxmLnRhcmdldF9kaXIsIG9zLnBhdGguYmFzZW5hbWUoc2NyaXB0KSkKICAgICAgICBpZiBub3Qgc2VsZi5mb3JjZSBhbmQgbm90IHNlbGYuX2ZpbGVvcC5uZXdlcihzY3JpcHQsIG91dG5hbWUpOgogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ25vdCBjb3B5aW5nICVzICh1cC10by1kYXRlKScsIHNjcmlwdCkKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICMgQWx3YXlzIG9wZW4gdGhlIGZpbGUsIGJ1dCBpZ25vcmUgZmFpbHVyZXMgaW4gZHJ5LXJ1biBtb2RlIC0tCiAgICAgICAgIyB0aGF0IHdheSwgd2UnbGwgZ2V0IGFjY3VyYXRlIGZlZWRiYWNrIGlmIHdlIGNhbiByZWFkIHRoZQogICAgICAgICMgc2NyaXB0LgogICAgICAgIHRyeToKICAgICAgICAgICAgZiA9IG9wZW4oc2NyaXB0LCAncmInKQogICAgICAgIGV4Y2VwdCBJT0Vycm9yOiAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICAgICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICAgICBmID0gTm9uZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGZpcnN0X2xpbmUgPSBmLnJlYWRsaW5lKCkKICAgICAgICAgICAgaWYgbm90IGZpcnN0X2xpbmU6ICAjIHByYWdtYTogbm8gY292ZXIKICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCclczogJXMgaXMgYW4gZW1wdHkgZmlsZSAoc2tpcHBpbmcpJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0X2NvbW1hbmRfbmFtZSgpLCAgc2NyaXB0KQogICAgICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICAgICBtYXRjaCA9IEZJUlNUX0xJTkVfUkUubWF0Y2goZmlyc3RfbGluZS5yZXBsYWNlKGInXHJcbicsIGInXG4nKSkKICAgICAgICAgICAgaWYgbWF0Y2g6CiAgICAgICAgICAgICAgICBhZGp1c3QgPSBUcnVlCiAgICAgICAgICAgICAgICBwb3N0X2ludGVycCA9IG1hdGNoLmdyb3VwKDEpIG9yIGInJwoKICAgICAgICBpZiBub3QgYWRqdXN0OgogICAgICAgICAgICBpZiBmOgogICAgICAgICAgICAgICAgZi5jbG9zZSgpCiAgICAgICAgICAgIHNlbGYuX2ZpbGVvcC5jb3B5X2ZpbGUoc2NyaXB0LCBvdXRuYW1lKQogICAgICAgICAgICBpZiBzZWxmLnNldF9tb2RlOgogICAgICAgICAgICAgICAgc2VsZi5fZmlsZW9wLnNldF9leGVjdXRhYmxlX21vZGUoW291dG5hbWVdKQogICAgICAgICAgICBmaWxlbmFtZXMuYXBwZW5kKG91dG5hbWUpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ2NvcHlpbmcgYW5kIGFkanVzdGluZyAlcyAtPiAlcycsIHNjcmlwdCwKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50YXJnZXRfZGlyKQogICAgICAgICAgICBpZiBub3Qgc2VsZi5fZmlsZW9wLmRyeV9ydW46CiAgICAgICAgICAgICAgICBlbmNvZGluZywgbGluZXMgPSBkZXRlY3RfZW5jb2RpbmcoZi5yZWFkbGluZSkKICAgICAgICAgICAgICAgIGYuc2VlaygwKQogICAgICAgICAgICAgICAgc2hlYmFuZyA9IHNlbGYuX2dldF9zaGViYW5nKGVuY29kaW5nLCBwb3N0X2ludGVycCkKICAgICAgICAgICAgICAgIGlmIGIncHl0aG9udycgaW4gZmlyc3RfbGluZTogICMgcHJhZ21hOiBubyBjb3ZlcgogICAgICAgICAgICAgICAgICAgIGV4dCA9ICdweXcnCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGV4dCA9ICdweScKICAgICAgICAgICAgICAgIG4gPSBvcy5wYXRoLmJhc2VuYW1lKG91dG5hbWUpCiAgICAgICAgICAgICAgICBzZWxmLl93cml0ZV9zY3JpcHQoW25dLCBzaGViYW5nLCBmLnJlYWQoKSwgZmlsZW5hbWVzLCBleHQpCiAgICAgICAgICAgIGlmIGY6CiAgICAgICAgICAgICAgICBmLmNsb3NlKCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBkcnlfcnVuKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9maWxlb3AuZHJ5X3J1bgoKICAgIEBkcnlfcnVuLnNldHRlcgogICAgZGVmIGRyeV9ydW4oc2VsZiwgdmFsdWUpOgogICAgICAgIHNlbGYuX2ZpbGVvcC5kcnlfcnVuID0gdmFsdWUKCiAgICBpZiBvcy5uYW1lID09ICdudCcgb3IgKG9zLm5hbWUgPT0gJ2phdmEnIGFuZCBvcy5fbmFtZSA9PSAnbnQnKTogICMgcHJhZ21hOiBubyBjb3ZlcgogICAgICAgICMgRXhlY3V0YWJsZSBsYXVuY2hlciBzdXBwb3J0LgogICAgICAgICMgTGF1bmNoZXJzIGFyZSBmcm9tIGh0dHBzOi8vYml0YnVja2V0Lm9yZy92aW5heS5zYWppcC9zaW1wbGVfbGF1bmNoZXIvCgogICAgICAgIGRlZiBfZ2V0X2xhdW5jaGVyKHNlbGYsIGtpbmQpOgogICAgICAgICAgICBpZiBzdHJ1Y3QuY2FsY3NpemUoJ1AnKSA9PSA4OiAgICMgNjQtYml0CiAgICAgICAgICAgICAgICBiaXRzID0gJzY0JwogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgYml0cyA9ICczMicKICAgICAgICAgICAgbmFtZSA9ICclcyVzLmV4ZScgJSAoa2luZCwgYml0cykKICAgICAgICAgICAgIyBJc3N1ZSAzMTogZG9uJ3QgaGFyZGNvZGUgYW4gYWJzb2x1dGUgcGFja2FnZSBuYW1lLCBidXQKICAgICAgICAgICAgIyBkZXRlcm1pbmUgaXQgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgcGFja2FnZQogICAgICAgICAgICBkaXN0bGliX3BhY2thZ2UgPSBfX25hbWVfXy5yc3BsaXQoJy4nLCAxKVswXQogICAgICAgICAgICByZXN1bHQgPSBmaW5kZXIoZGlzdGxpYl9wYWNrYWdlKS5maW5kKG5hbWUpLmJ5dGVzCiAgICAgICAgICAgIHJldHVybiByZXN1bHQKCiAgICAjIFB1YmxpYyBBUEkgZm9sbG93cwoKICAgIGRlZiBtYWtlKHNlbGYsIHNwZWNpZmljYXRpb24sIG9wdGlvbnM9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgTWFrZSBhIHNjcmlwdC4KCiAgICAgICAgOnBhcmFtIHNwZWNpZmljYXRpb246IFRoZSBzcGVjaWZpY2F0aW9uLCB3aGljaCBpcyBlaXRoZXIgYSB2YWxpZCBleHBvcnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkgc3BlY2lmaWNhdGlvbiAodG8gbWFrZSBhIHNjcmlwdCBmcm9tIGEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGFibGUpIG9yIGEgZmlsZW5hbWUgKHRvIG1ha2UgYSBzY3JpcHQgYnkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weWluZyBmcm9tIGEgc291cmNlIGxvY2F0aW9uKS4KICAgICAgICA6cGFyYW0gb3B0aW9uczogQSBkaWN0aW9uYXJ5IG9mIG9wdGlvbnMgY29udHJvbGxpbmcgc2NyaXB0IGdlbmVyYXRpb24uCiAgICAgICAgOnJldHVybjogQSBsaXN0IG9mIGFsbCBhYnNvbHV0ZSBwYXRobmFtZXMgd3JpdHRlbiB0by4KICAgICAgICAiIiIKICAgICAgICBmaWxlbmFtZXMgPSBbXQogICAgICAgIGVudHJ5ID0gZ2V0X2V4cG9ydF9lbnRyeShzcGVjaWZpY2F0aW9uKQogICAgICAgIGlmIGVudHJ5IGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYuX2NvcHlfc2NyaXB0KHNwZWNpZmljYXRpb24sIGZpbGVuYW1lcykKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLl9tYWtlX3NjcmlwdChlbnRyeSwgZmlsZW5hbWVzLCBvcHRpb25zPW9wdGlvbnMpCiAgICAgICAgcmV0dXJuIGZpbGVuYW1lcwoKICAgIGRlZiBtYWtlX211bHRpcGxlKHNlbGYsIHNwZWNpZmljYXRpb25zLCBvcHRpb25zPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIFRha2UgYSBsaXN0IG9mIHNwZWNpZmljYXRpb25zIGFuZCBtYWtlIHNjcmlwdHMgZnJvbSB0aGVtLAogICAgICAgIDpwYXJhbSBzcGVjaWZpY2F0aW9uczogQSBsaXN0IG9mIHNwZWNpZmljYXRpb25zLgogICAgICAgIDpyZXR1cm46IEEgbGlzdCBvZiBhbGwgYWJzb2x1dGUgcGF0aG5hbWVzIHdyaXR0ZW4gdG8sCiAgICAgICAgIiIiCiAgICAgICAgZmlsZW5hbWVzID0gW10KICAgICAgICBmb3Igc3BlY2lmaWNhdGlvbiBpbiBzcGVjaWZpY2F0aW9uczoKICAgICAgICAgICAgZmlsZW5hbWVzLmV4dGVuZChz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jP3//zvBD4cgCgAA/ySFtVhAAION6P3///+JtYj9//+Jtbz9//+Jtcj9//+Jtcz9//+JtfD9//+JtcT9///p6QkAAA++woPoIHRKg+gDdDaD6Ah0JUhIdBWD6AMPhcoJAACDjfD9//8I6b4JAACDjfD9//8E6bIJAACDjfD9//8B6aYJAACBjfD9//+AAAAA6ZcJAACDjfD9//8C6YsJAACA+ip1LIPHBIm95P3//4t//Im9yP3//zv+D41sCQAAg43w/f//BPedyP3//+laCQAAi4XI/f//a8AKD77KjUQI0ImFyP3//+k/CQAAibXo/f//6TQJAACA+ip1JoPHBIm95P3//4t//Im96P3//zv+D40VCQAAg43o/f///+kJCQAAi4Xo/f//a8AKD77KjUQI0ImF6P3//+nuCAAAgPpJdFWA+mh0RID6bHQYgPp3D4XWCAAAgY3w/f//AAgAAOnHCAAAgDtsdRZDgY3w/f//ABAAAImdwP3//+msCAAAg43w/f//EOmgCAAAg43w/f//IOmUCAAAigM8NnUegHsBNHUYg8MCgY3w/f//AIAAAImdwP3//+lwCAAAPDN1HoB7ATJ1GIPDAoGl8P3///9///+JncD9///pTggAADxkD4RGCAAAPGkPhD4IAAA8bw+ENggAADx1D4QuCAAAPHgPhCYIAAA8WA+EHggAAIm1jP3//yG1xP3//42FpP3//1APtsJQ6CZPAABZhcCKhe/9//9ZdCKLjdD9//+Ntdz9///oGPz//4oDQ4mdwP3//4TAD4Sw/P//i43Q/f//jbXc/f//6Pb7///pvgcAAA++woP4ZA+PtgEAAA+EWAIAAIP4Uw+PugAAAHRMg+hBdBBISHQkSEh0CEhID4WrBQAAgMIgx4WI/f//AQAAAIiV7/3//+lWAgAA94Xw/f//MAgAAA+FngAAAIGN8P3//wAIAADpjwAAAPeF8P3//zAIAAB1CoGN8P3//wAIAACLjej9//+D+f91Bbn///9/g8cE94Xw/f//EAgAAIm95P3//4t//Im94P3//w+E/gQAAIX/dQuhZAZBAImF4P3//4uF4P3//8eFxP3//wEAAADpzAQAAIPoWA+EIgMAAEhIdH8rwQ+EtgEAAEhID4XrBAAAi73k/f//g8cE94Xw/f//EAgAAIm95P3//3QwD7dH/FBoAAIAAI2F9P3//1CNhdj9//9Q6E1kAACDxBCFwHQfx4W8/f//AQAAAOsTikf8iIX0/f//x4XY/f//AQAAAI2F9P3//4mF4P3//+l8BAAAiweDxwSJveT9//+FwHQ7i0gEhcl0NPeF8P3//wAIAAAPvwCJjeD9//90FJkrwtH4x4XE/f//AQAAAOk3BAAAIbXE/f//6SwEAAChYAZBAImF4P3//1DoSyQAAFnpFQQAAIP4cA+PPQIAAA+EJQIAAIP4ZQ+MAwQAAIP4Zw+OtwAAAIP4aXR8g/hudC6D+G8PhecDAAD2hfD9//+Ai73k/f//x4XY/f//CAAAAHRsgY3w/f//AAIAAOtgg4Xk/f//BIuF5P3//4tw/OhsSwAAhcAPhGL6///2hfD9//8gdAxmi4Xc/f//ZokG6wiLhdz9//+JBseFvP3//wEAAADpPgUAAIu95P3//4ON8P3//0DHhdj9//8KAAAAi43w/f//98EAgAAAD4TgAQAAiweLVwSDxwjpDAIAAIu95P3//4ON8P3//0CNnfT9//+4AAIAAImd4P3//4mFoP3//zm16P3//30Mx4Xo/f//BgAAAOtqdRGA+md1Y8eF6P3//wEAAADrVzmF6P3//34GiYXo/f//gb3o/f//owAAAH49i7Xo/f//gcZdAQAAVui95P//ipXv/f//WYmFuP3//4XAdBCJheD9//+JtaD9//+L2OsKx4Xo/f//owAAAIsHizV80EAAg8cIiYWA/f//i0f8iYWE/f//jYWk/f//UP+1iP3//w++wv+16P3//4m95P3//1D/taD9//+NhYD9//9TUP81qAZBAP/W/9CLvfD9//+DxByB54AAAAB0HYO96P3//wB1FI2FpP3//1BT/zW0BkEA/9b/0FlZgL3v/f//Z3UYhf91FI2FpP3//1BT/zWwBkEA/9b/0FlZgDstdRGBjfD9//8AAQAAQ4md4P3//1Ppwf3//8eF6P3//wgAAACJjbT9///rKoPocw+Ebvz//0hID4RY/v//g+gDD4W7AQAAi73k/f//x4W0/f//JwAAAPaF8P3//4DHhdj9//8QAAAAD4Qy/v//ioW0/f//BFHGhdT9//8wiIXV/f//x4XM/f//AgAAAOkO/v//98EAEAAAD4UU/v//g8cE9sEgdBiJveT9///2wUB0Bg+/R/zrBA+3R/yZ6xOLR/z2wUB0A5nrAjPSib3k/f//9sFAdBqF0n8WfASFwHMQ99gT1vfagY3w/f//AAEAAPeF8P3//wCQAACL+ovYdQIz/zm16P3//30Mx4Xo/f//AQAAAOsag6Xw/f//97gAAgAAOYXo/f//fgaJhej9//+LwwvHdQYhtcz9//+NdfOLhej9////jej9//+FwH8Gi8MLx3Qti4XY/f//mVJQV1Po90kAAIPBMImdoP3//4vYi/qD+Tl+BgONtP3//4gOTuu9jUXzK8ZG94Xw/f//AAIAAImF2P3//4m14P3//3RihcB0B4vOgDkwdFf/jeD9//+LjeD9///GATBA6z9JZjkwdAeDwAKFyXXzK4Xg/f//0fjrKIX/dQuhYAZBAImF4P3//4uF4P3//+sHSYA4AHQFQIXJdfUrheD9//+Jhdj9//+Dvbz9//8AD4W4AQAAi43w/f//9sFAdDX3wQABAAB0CcaF1P3//y3rGvbBAXQJxoXU/f//K+sM9sECdBHGhdT9//8gx4XM/f//AQAAAIuFyP3//yuF2P3//yuFzP3//4mFoP3///bBDHUli/jrHYuN0P3//4213P3//7AgT+iS9f//g73c/f///3QEhf9/3/+1zP3//4u9lP3//4ud0P3//42F1P3//1CNhdz9///oxCwAAPaF8P3//whZWXQu9oXw/f//BHUli72g/f//6xmNtdz9//+Ly7AwT+g19f//g73c/f///3QEhf9/44O9xP3//wCLhdj9//90dYXAfnGLteD9//+JhZj9//8Ptwb/jZj9//9QagaNRfRQjYWQ/f//UIPGAuhwXgAAg8QQhcB1NjmFkP3//3Qu/7WQ/f//i72U/f//i53Q/f//jUX0UI2F3P3//+gdLAAAg72Y/f//AFlZdabrI4ON3P3////rGou9lP3//1D/teD9//+Nhdz9///o7ysAAFlZg73c/f//AHwy9oXw/f//BHQpi72g/f//6x2LjdD9//+Ntdz9//+wIE/oXPT//4O93P3///90BIX/f9+Dvbj9//8AdBP/tbj9///oxMD//4OluP3//wBZi53A/f//igOIhe/9//+EwHQTi42M/f//i73k/f//itDpcvX//4C9sP3//wB0CouFrP3//4NgcP2Lhdz9//+LTfxfXjPNW+g2v///ycOQT1BAAE5OQAB+TkAA3E5AAChP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KOX//wGFOOX//zvGD4w7AgAAi8MrhTTl//87RRAPgmz////pJQIAAIC9P+X//wIPhc0AAACLnTTl//85TRAPhkgCAACDpUDl//8Ai8srjTTl//9qAo2FSOX//147TRBzQw+3EwPeA86JnSDl//+D+gp1GgG1MOX//2oNW2aJGIudIOX//wPGAbVA5f//AbVA5f//ZokQA8aBvUDl///+EwAAcriL8I2FSOX//yvwagCNhSjl//9QVo2FSOX//1CLhSTl//+LAP80B/8VkNBAAIXAD4RpAQAAi4Uo5f//AYU45f//O8YPjGEBAACLwyuFNOX//ztFEA+CR////+lLAQAAi4U05f//iYUs5f//OU0QD4Z1AQAAi40s5f//g6VA5f//ACuNNOX//2oCjYVI+f//XjtNEHM7i5Us5f//D7cSAbUs5f//A86D+gp1DmoNW2aJGAPGAbVA5f//AbVA5f//ZokQA8aBvUDl//+oBgAAcsAz9lZWaFUNAACNjfDr//9RjY1I+f//K8GZK8LR+FCLwVBWaOn9AAD/FbjQQACL2DveD4SXAAAAagCNhSjl//9Qi8MrxlCNhDXw6///UIuFJOX//4sA/zQH/xWQ0EAAhcB0DAO1KOX//zvef8vrDP8VONBAAImFROX//zvef1yLhSzl//8rhTTl//+JhTjl//87RRAPggv////rP1GNjSjl//9R/3UQ/7U05f///zQ4/xWQ0EAAhcB0FYuFKOX//4OlROX//wCJhTjl///rDP8VONBAAImFROX//4O9OOX//wB1bIO9ROX//wB0LWoFXjm1ROX//3UU6Oaq///HAAkAAADo7qr//4kw6z//tUTl///o8qr//1nrMYuFJOX//4sA9kQHBEB0D4uFNOX//4A4GnUEM8DrJOimqv//xwAcAAAA6K6q//+DIACDyP/rDIuFOOX//yuFMOX//1uLTfxfM81e6JqV///Jw2oQaKjxQADoxKr//4tdCIP7/nUb6HKq//+DIADoV6r//8cACQAAAIPI/+mUAAAAhdt4CDsddB1BAHIa6Euq//+DIADoMKr//8cACQAAAOjTqf//69KLw8H4BY08hYAdQQCL84PmH8HmBosHD75EMASD4AF0xlPocCsAAFmDZfwAiwf2RDAEAXQU/3UQ/3UMU+hu+P//g8QMiUXk6xfo1qn//8cACQAAAOjeqf//gyAAg03k/8dF/P7////oDAAAAItF5OhNqv//w4tdCFPouCsAAFnDahBoyPFAAOjwqf//i10Ig/v+dRPoi6n//8cACQAAAIPI/+mhAAAAhdt4CDsddB1BAHIS6Gyp///HAAkAAADoD6n//+vai8PB+AWNPIWAHUEAi/OD5h/B5gaLBw++RAYEg+ABdM5T6KwqAABZg2X8AIsH9kQGBAF0MVPoLyoAAFlQ/xUE0UAAhcB1C/8VONBAAIlF5OsEg2XkAIN95AB0GegSqf//i03kiQjo9aj//8cACQAAAINN5P/HRfz+////6AwAAACLReTodKn//8OLXQhT6N8qAABZw4v/VYvsUfZDDEBWi/CLB4lF/HQNg3sIAHUHi0UMAQbrPoMnAIN9DAB+MItFCIoA/00Mi8voZMj///9FCIM+/3UOgz8qdQ+Ly7A/6E7I//+DfQwAf9WDPwB1BYtF/IkHXsnDi/9Vi+yB7IACAAChhAJBADPFiUX8U4tdDFaLdQgzwFeLfRT/dRCNjaz9//+JtdD9//+JveT9//+Jhaj9//+JhfD9//+Jhcj9//+Jhej9//+Jhcz9//+JhaT9//+JhcT9///oprv//+j9p///iYWc/f//hfZ1K+jup///xwAWAAAA6JGn//+Avbj9//8AdAqLhbT9//+DYHD9g8j/6WELAAD2RgxAdV5W6JzF//9ZugAEQQCD+P90G4P4/nQWi8iD4R+L8MH+BcHhBgMMtYAdQQDrAovK9kEkf3Wbg/j/dBmD+P50FIvIg+AfwfkFweAGAwSNgB1BAOsCi8L2QCSAD4Vx////M/Y73g+EZ////4oTibXc/f//ibXY/f//ibW8/f//ibWg/f//iJXv/f//hNIPhLIKAABDiZ3A/f//ObXc/f//D4yJCgAAjULgPFh3Dw++wg+2gMDlQACD4A/rAjPAi428/f//a8AJD7aECODlQABqCMHoBF6Jhbz9//87xg+E7/7//2oHWTvBD4cgCgAA/ySFc5BAADPAg43o/f///4mFjP3//4mFpP3//4mFyP3//4mFzP3//4mF8P3//4mFxP3//+nnCQAAD77Cg+ggdEiD6AN0NCvGdCRISHQUg+gDD4XJCQAACbXw/f//6b4JAACDjfD9//8E6bIJAACDjfD9//8B6aYJAACBjfD9//+AAAAA6ZcJAACDjfD9//8C6YsJAACA+ip1LIPHBIm95P3//4t//Im9yP3//4X/D4lsCQAAg43w/f//BPedyP3//+laCQAAi4XI/f//a8AKD77KjUQI0ImFyP3//+k/CQAAg6Xo/f//AOkzCQAAgPoqdSaDxwSJveT9//+Lf/yJvej9//+F/w+JFAkAAION6P3////pCAkAAIuF6P3//2vACg++yo1ECNCJhej9///p7QgAAID6SXRVgPpodESA+mx0GID6dw+F1QgAAIGN8P3//wAIAADpxggAAIA7bHUWQ4GN8P3//wAQAACJncD9///pqwgAAION8P3//xDpnwgAAION8P3//yDpkwgAAIoDPDZ1HoB7ATR1GIPDAoGN8P3//wCAAACJncD9///pbwgAADwzdR6AewEydRiDwwKBpfD9////f///iZ3A/f//6U0IAAA8ZA+ERQgAADxpD4Q9CAAAPG8PhDUIAAA8dQ+ELQgAADx4D4QlCAAAPFgPhB0IAACDpbz9//8Ag6XE/f//AI2FrP3//1APtsJQ6HkXAABZhcCKhe/9//9ZdCKLjdD9//+Ntdz9///oa8T//4oDQ4mdwP3//4TAD4SV/P//i43Q/f//jbXc/f//6EnE///puwcAAA++woP4ZA+PtwEAAA+EVQIAAIP4Uw+PugAAAHRMg+hBdBBISHQkSEh0CEhID4WoBQAAgMIgx4WM/f//AQAAAIiV7/3//+lTAgAA94Xw/f//MAgAAA+FngAAAIGN8P3//wAIAADpjwAAAPeF8P3//zAIAAB1CoGN8P3//wAIAACLjej9//+D+f91Bbn///9/g8cE94Xw/f//EAgAAIm95P3//4t//Im94P3//w+E+wQAAIX/dQuhZAZBAImF4P3//4uF4P3//8eFxP3//wEAAADpyQQAAIPoWA+EHAMAAEhIdH8rwQ+EswEAAEhID4XoBAAAi73k/f//g8cE94Xw/f//EAgAAIm95P3//3QwD7dH/FBoAAIAAI2F9P3//1CNhdj9//9Q6KAsAACDxBCFwHQfx4Wk/f//AQAAAOsTikf8iIX0/f//x4XY/f//AQAAAI2F9P3//4mF4P3//+l5BAAAiweDxwSJveT9//+FwHQ8i0gEhcl0NfeF8P3//wAIAAAPvwCJjeD9//90FJkrwtH4x4XE/f//AQAAAOk0BAAAg6XE/f//AOkoBAAAoWAGQQCJheD9//9Q6J3s//9Z6REEAACD+HAPjzYCAAAPhCICAACD+GUPjP8DAACD+GcPjrMAAACD+Gl0eIP4bnQqg/hvD4XjAwAA9oXw/f//gIu95P3//4m12P3//3RsgY3w/f//AAIAAOtgg4Xk/f//BIuF5P3//4tw/OjCEwAAhcAPhEr6///2hfD9//8gdAxmi4Xc/f//ZokG6wiLhdz9//+JBseFpP3//wEAAADpPgUAAIu95P3//4ON8P3//0DHhdj9//8KAAAAi43w/f//98EAgAAAD4TdAQAAA/6LR/iLV/zpCQIAAIu95P3//4ON8P3//0CDvej9//8AjZ30/f//uAACAACJneD9//+JhZj9//99DMeF6P3//wYAAADranURgPpndWPHhej9//8BAAAA61c5hej9//9+BomF6P3//4G96P3//6MAAAB+PYu16P3//4HGXQEAAFboEq3//4qV7/3//1mJhaD9//+FwHQQiYXg/f//ibWY/f//i9jrCseF6P3//6MAAACLB4s1fNBAAIPHCImFgP3//4tH/ImFhP3//42FrP3//1D/tYz9//8PvsL/tej9//+JveT9//9Q/7WY/f//jYWA/f//U1D/NagGQQD/1v/Qi73w/f//g8QcgeeAAAAAdB2Dvej9//8AdRSNhaz9//9QU/81tAZBAP/W/9BZWYC97/3//2d1GIX/dRSNhaz9//9QU/81sAZBAP/W/9BZWYA7LXURgY3w/f//AAEAAEOJneD9//9T6cT9//+Jtej9//+Jjaj9///rKoPocw+EdPz//0hID4Rb/v//g+gDD4W+AQAAi73k/f//x4Wo/f//JwAAAPaF8P3//4DHhdj9//8QAAAAD4Q1/v//ioWo/f//BFHGhdT9//8wiIXV/f//x4XM/f//AgAAAOkR/v//98EAEAAAD4UX/v//g8cE9sEgdBiJveT9///2wUB0Bg+/R/zrBA+3R/yZ6xOLR/z2wUB0A5nrAjPSib3k/f//9sFAdBuF0n8XfASFwHMR99iD0gD32oGN8P3//wABAAD3hfD9//8AkAAAi/qL2HUCM/+Dvej9//8AfQzHhej9//8BAAAA6xqDpfD9///3uAACAAA5hej9//9+BomF6P3//4vDC8d1BiGFzP3//41184uF6P3///+N6P3//4XAfwaLwwvHdC2Lhdj9//+ZUlBXU+hOEgAAg8EwiZ2Y/f//i9iL+oP5OX4GA42o/f//iA5O672NRfMrxkb3hfD9//8AAgAAiYXY/f//ibXg/f//dGOFwHQHi86AOTB0WP+N4P3//4uN4P3//8YBMEDrQElmgzgAdAeDwAKFyXXyK4Xg/f//0fjrKIX/dQuhYAZBAImF4P3//4uF4P3//+sHSYA4AHQFQIXJdfUrheD9//+Jhdj9//+DvaT9//8AD4W4AQAAi43w/f//9sFAdDX3wQABAAB0CcaF1P3//y3rGvbBAXQJxoXU/f//K+sM9sECdBHGhdT9//8gx4XM/f//AQAAAIuFyP3//yuF2P3//yuFzP3//4mFmP3///bBDHUli/jrHYuN0P3//4213P3//7AgT+jovf//g73c/f///3QEhf9/3/+1zP3//4u9nP3//4ud0P3//42F1P3//1CNhdz9///oGvX///aF8P3//whZWXQu9oXw/f//BHUli72Y/f//6xmNtdz9//+Ly7AwT+iLvf//g73c/f///3QEhf9/44O9xP3//wCLhdj9//90dYXAfnGLteD9//+JhZD9//8Ptwb/jZD9//9QagaNRfRQjYWI/f//UIPGAujGJgAAg8QQhcB1NjmFiP3//3Qu/7WI/f//i72c/f//i53Q/f//jUX0UI2F3P3//+hz9P//g72Q/f//AFlZdabrI4ON3P3////rGou9nP3//1D/teD9//+Nhdz9///oRfT//1lZg73c/f//AHwy9oXw/f//BHQpi72Y/f//6x2LjdD9//+Ntdz9//+wIE/osrz//4O93P3///90BIX/f9+DvaD9//8AdBP/taD9///oGon//4OloP3//wBZi53A/f//igOIhe/9//+EwHQPi73k/f//M/aK0Olk9f//g728/f//AHQNg728/f//Bw+FjfT//4C9uP3//wB0CouFtP3//4NgcP2Lhdz9//+LTfxfXjPNW+h6h///ycONSQD7h0AA+IVAACqGQACGhkAA0oZAAN6GQAAkh0AAVohAAIv/VYvsUVGLRQxWi3UIiUX4i0UQV1aJRfzoIR0AAIPP/1k7x3UR6Aqc///HAAkAAACLx4vX60r/dRSNTfxR/3X4UP8VrNBAAIlF+DvHdRP/FTjQQACFwHQJUOj8m///WevPi8bB+AWLBIWAHUEAg+YfweYGjUQwBIAg/YtF+ItV/F9eycNqFGjo8UAA6Pyb//+Dy/+JXdyJXeCLRQiD+P51HOihm///gyAA6Iab///HAAkAAACLw4vT6aEAAACFwHgIOwV0HUEAchroeZv//4MgAOhem///xwAJAAAA6AGb///r0YvIwfkFjTyNgB1BAIvwg+YfweYGiw8PvkwxBIPhAXTGUOieHAAAWYNl/ACLB/ZEMAQBdBz/dRT/dRD/dQz/dQjo1/7//4PEEIlF3IlV4OsZ6Pya///HAAkAAADoBJv//4MgAIld3Ild4MdF/P7////oDAAAAItF3ItV4Ohum///w/91COjaHAAAWcOL/1WL7P8F4A5BAGgAEAAA6GCm//9Zi00IiUEIhcB0DYNJDAjHQRgAEAAA6xGDSQwEjUEUiUEIx0EYAgAAAItBCINhBACJAV3Di/9Vi+yLRQiD+P51D+hrmv//xwAJAAAAM8Bdw4XAeAg7BXQdQQByEuhQmv//xwAJAAAA6POZ///r3ovIg+AfwfkFiwyNgB1BAMHgBg++RAEEg+BAXcMtpAMAAHQig+gEdBeD6A10DEh0AzPAw7gEBAAAw7gSBAAAw7gECAAAw7gRBAAAw4v/VleL8GgBAQAAM/+NRhxXUOhpuP//M8APt8iLwYl+BIl+CIl+DMHhEAvBjX4Qq6urucAGQQCDxAyNRhwrzr8BAQAAihQBiBBAT3X3jYYdAQAAvgABAACKFAiIEEBOdfdfXsOL/1WL7IHsHAUAAKGEAkEAM8WJRfxTV42F6Pr//1D/dgT/FQjRQAC/AAEAAIXAD4T8AAAAM8CIhAX8/v//QDvHcvSKhe76///Ghfz+//8ghMB0MI2d7/r//w+2yA+2AzvIdxYrwUBQjZQN/P7//2ogUuimt///g8QMikMBg8MChMB11moA/3YMjYX8+v///3YEUFeNhfz+//9QagFqAOiIKgAAM9tT/3YEjYX8/f//V1BXjYX8/v//UFf/dgxT6DspAACDxERT/3YEjYX8/P//V1BXjYX8/v//UGgAAgAA/3YMU+gWKQAAg8QkM8APt4xF/Pr///bBAXQOgEwGHRCKjAX8/f//6xH2wQJ0FYBMBh0giowF/Pz//4iMBh0BAADrB4icBh0BAABAO8dyv+tSjYYdAQAAx4Xk+v//n////zPJKYXk+v//i5Xk+v//jYQOHQEAAAPQjVogg/sZdwqATA4dEI1RIOsNg/oZdwyATA4dII1R4IgQ6wPGAABBO89yxotN/F8zzVvoJoP//8nDagxoCPJAAOhQmP//6DjO//+L+KHgC0EAhUdwdB2Df2wAdBeLd2iF9nUIaiDo2p7//1mLxuhomP//w2oN6Pqn//9Zg2X8AIt3aIl15Ds16ApBAHQ2hfZ0Glb/FdzQQACFwHUPgf7ABkEAdAdW6O6D//9ZoegKQQCJR2iLNegKQQCJdeRW/xXQ0EAAx0X8/v///+gFAAAA646LdeRqDejApv//WcOL/1WL7IPsEFMz21ONTfDo8Kr//4kdMBtBAIP+/nUexwUwG0EAAQAAAP8VENFAADhd/HRFi034g2Fw/es8g/79dRLHBTAbQQABAAAA/xUM0UAA69uD/vx1EotF8ItABMcFMBtBAAEAAADrxDhd/HQHi0X4g2Bw/YvGW8nDi/9Vi+yD7CChhAJBADPFiUX8U4tdDFaLdQhX6GT///+L+DP2iX0IO/51DovD6Lr8//8zwOmhAQAAiXXkM8A5uPAKQQAPhJEAAAD/ReSDwDA98AAAAHLngf/o/QAAD4R0AQAAgf/p/QAAD4RoAQAAD7fHUP8VFNFAAIXAD4RWAQAAjUXoUFf/FQjRQACFwA+ENwEAAGgBAQAAjUMcVlDoybT//zPSQoPEDIl7BIlzDDlV6A+G/AAAAIB97gAPhNMAAACNde+KDoTJD4TGAAAAD7ZG/w+2yempAAAAaAEBAACNQxxWUOiCtP//i03kg8QMa8kwiXXgjbEAC0EAiXXk6yuKRgGEwHQpD7Y+D7bA6xKLReCKgOwKQQAIRDsdD7ZGAUc7+Hbqi30Ig8YCgD4AddCLdeT/ReCDxgiDfeAEiXXkcumLx4l7BMdDCAEAAADoafv//2oGiUMMjUMQjYn0CkEAWmaLMWaJMIPBAoPAAkp18Yvz6Nf7///ptP7//4BMAx0EQDvBdvaDxgKAfv8AD4Uw////jUMeuf4AAACACAhASXX5i0ME6BH7//+JQwyJUwjrA4lzCDPAD7fIi8HB4RALwY17EKurq+unOTUwG0EAD4VU/v//g8j/i038X14zzVvoHYD//8nDahRoKPJAAOhHlf//g03g/+gry///i/iJfdzo2Pz//4tfaIt1COhx/f//iUUIO0MED4RXAQAAaCACAADoaqD//1mL2IXbD4RGAQAAuYgAAACLd2iL+/OlgyMAU/91COi0/f//WVmJReCFwA+F/AAAAIt13P92aP8V3NBAAIXAdRGLRmg9wAZBAHQHUOjGgP//WYleaFOLPdDQQAD/1/ZGcAIPheoAAAD2BeALQQABD4XdAAAAag3od6T//1mDZfwAi0MEo0AbQQCLQwijRBtBAItDDKNIG0EAM8CJReSD+AV9EGaLTEMQZokMRTQbQQBA6+gzwIlF5D0BAQAAfQ2KTBgciIjgCEEAQOvpM8CJReQ9AAEAAH0QiowYHQEAAIiI6AlBAEDr5v816ApBAP8V3NBAAIXAdROh6ApBAD3ABkEAdAdQ6A2A//9ZiR3oCkEAU//Xx0X8/v///+gCAAAA6zBqDejxov//WcPrJYP4/3UggfvABkEAdAdT6Nd///9Z6HaT///HABYAAADrBINl4ACLReDo/5P//8ODPYweQQAAdRJq/ehW/v//WccFjB5BAAEAAAAzwMOL/1WL7FNWizXQ0EAAV4t9CFf/1ouHsAAAAIXAdANQ/9aLh7gAAACFwHQDUP/Wi4e0AAAAhcB0A1D/1ouHwAAAAIXAdANQ/9aNX1DHRQgGAAAAgXv45AtBAHQJiwOFwHQDUP/Wg3v8AHQKi0MEhcB0A1D/1oPDEP9NCHXWi4fUAAAABbQAAABQ/9ZfXltdw4v/VYvsV4t9CIX/D4SDAAAAU1aLNdzQQABX/9aLh7AAAACFwHQDUP/Wi4e4AAAAhcB0A1D/1ouHtAAAAIXAdANQ/9aLh8AAAACFwHQDUP/WjV9Qx0UIBgAAAIF7+OQLQQB0CYsDhcB0A1D/1oN7/AB0CotDBIXAdANQ/9aDwxD/TQh11ouH1AAAAAW0AAAAUP/WXluLx19dw4v/VYvsU1aLdQiLhrwAAAAz21c7w3RvPUgOQQB0aIuGsAAAADvDdF45GHVai4a4AAAAO8N0FzkYdRNQ6DZ+////trwAAADohycAAFlZi4a0AAAAO8N0FzkYdRNQ6BV+////trwAAADo/SYAAFlZ/7awAAAA6P19////trwAAADo8n3//1lZi4bAAAAAO8N0RDkYdUCLhsQAAAAt/gAAAFDo0X3//4uGzAAAAL+AAAAAK8dQ6L59//+LhtAAAAArx1DosH3///+2wAAAAOilff//g8QQi4bUAAAAPegLQQB0GzmYtAAAAHUTUOgDIwAA/7bUAAAA6Hx9//9ZWY1+UMdFCAYAAACBf/jkC0EAdBGLBzvDdAs5GHUHUOhXff//WTlf/HQSi0cEO8N0CzkYdQdQ6EB9//9Zg8cQ/00IdcdW6DF9//9ZX15bXcOL/1WL7FeLfQyF/3Q7i0UIhcB0NFaLMDv3dChXiTjoav3//1mF9nQbVuju/f//gz4AWXUPgf5QDUEAdAdW6HP+//9Zi8de6wIzwF9dw2oMaEjyQADoz5D//+i3xv//i/Ch4AtBAIVGcHQig35sAHQc6KDG//+LcGyF9nUIaiDoVJf//1mLxujikP//w2oM6HSg//9Zg2X8AP81KA5BAIPGbFboWf///1lZiUXkx0X8/v///+gCAAAA675qDOhtn///WYt15MOL/1WL7IPsEKGEAkEAM8WJRfxTVot1DPZGDEBXD4U2AQAAVujCrf//WbsABEEAg/j/dC5W6LGt//9Zg/j+dCJW6KWt///B+AVWjTyFgB1BAOiVrf//g+AfWcHgBgMHWesCi8OKQCQkfzwCD4ToAAAAVuh0rf//WYP4/3QuVuhorf//WYP4/nQiVuhcrf//wfgFVo08hYAdQQDoTK3//4PgH1nB4AYDB1nrAovDikAkJH88AQ+EnwAAAFboK63//1mD+P90LlboH63//1mD+P50IlboE63//8H4BVaNPIWAHUEA6AOt//+D4B9ZweAGAwdZ6wKLw/ZABIB0Xf91CI1F9GoFUI1F8FDoVRgAAIPEEIXAdAe4//8AAOtdM/85ffB+MP9OBHgSiwaKTD30iAiLDg+2AUGJDusOD75EPfRWUOgFof//WVmD+P90yEc7ffB80GaLRQjrIINGBP54DYsOi0UIZokBgwYC6w0Pt0UIVlDoSSUAAFlZi038X14zzVvopXn//8nDoYQCQQCDyAEzyTkFTBtBAA+UwYvBw4v/VYvsg+wQU1aLdQwz2zvzdBU5XRB0EDgedRKLRQg7w3QFM8lmiQgzwF5bycP/dRSNTfDo2KH//4tF8DlYFHUei0UIO8N0Bg+2DmaJCDhd/HQHi0X4g2Bw/TPAQOvLjUXwUA+2BlDoxAAAAFlZhcB0fYtF8IuIrAAAAIP5AX4lOU0QfCAz0jldCA+VwlL/dQhRVmoJ/3AE/xUs0EAAhcCLRfB1EItNEDuIrAAAAHIgOF4BdBuLgKwAAAA4XfwPhGb///+LTfiDYXD96Vr////omI3//8cAKgAAADhd/HQHi0X4g2Bw/YPI/+k7////M8A5XQgPlcBQ/3UIi0XwagFWagn/cAT/FSzQQACFwA+FOv///+u6i/9Vi+xqAP91EP91DP91COjV/v//g8QQXcOL/1WL7IPsEP91DI1N8OjOoP//D7ZFCItN8IuJyAAAAA+3BEElAIAAAIB9/AB0B4tN+INhcP3Jw4v/VYvsagD/dQjouf///1lZXcPMzMzMzMzMzMzMVotEJBQLwHUoi0wkEItEJAwz0vfxi9iLRCQI9/GL8IvD92QkEIvIi8b3ZCQQA9HrR4vIi1wkEItUJAyLRCQI0enR29Hq0dgLyXX09/OL8PdkJBSLyItEJBD35gPRcg47VCQMdwhyDztEJAh2CU4rRCQQG1QkFDPbK0QkCBtUJAz32vfYg9oAi8qL04vZi8iLxl7CEACL/1WL7PZADEB0BoN4CAB0GlD/dQjoL/z//1lZuf//AABmO8F1BYMO/13D/wZdw4v/VYvsUfZDDEBWi/CLB4lF/HQNg3sIAHUHi0UMAQbrQ4MnAIN9DAB+NYtFCA+3AP9NDFCLw+iW////g0UIAoM+/1l1D4M/KnUQaj+Lw+h+////WYN9DAB/0IM/AHUFi0X8iQdeycOL/1WL7IHseAQAAKGEAkEAM8WJRfxTi10UVot1CDPAV/91EIt9DI2NtPv//4m11Pv//4md5Pv//4mFrPv//4mF+Pv//4mF2Pv//4mF9Pv//4mF3Pv//4mFsPv//4mF0Pv//+j6nv//6FGL//+JhZz7//+F9nUr6EKL///HABYAAADo5Yr//4C9wPv//wB0CouFvPv//4NgcP2DyP/p7QoAADP2O/50zw+3F4m16Pv//4m17Pv//4m1xPv//4m1qPv//4mV4Pv//2Y71g+EpAoAAGoCWQP5ib2g+///ObXo+///D4x4CgAAjULgZoP4WHcPD7fCD7aAwOVAAIPgD+sCM8CLtcT7//9rwAkPtoQw4OVAAGoIwegEXomFxPv//zvGD4RP////g/gHD4cNCgAA/ySFq6xAADPAg430+////4mFmPv//4mFsPv//4mF2Pv//4mF3Pv//4mF+Pv//4mF0Pv//+ngCQAAD7fCg+ggdEiD6AN0NCvGdCQrwXQUg+gDD4W2CQAACbX4+///6bcJAACDjfj7//8E6asJAACDjfj7//8B6Z8JAACBjfj7//+AAAAA6ZAJAAAJjfj7///phQkAAGaD+ip1K4sDg8MEiZ3k+///iYXY+///hcAPiWYJAACDjfj7//8E953Y+///6VQJAACLhdj7//9rwAoPt8qNRAjQiYXY+///6TkJAACDpfT7//8A6S0JAABmg/oqdSWLA4PDBImd5Pv//4mF9Pv//4XAD4kOCQAAg430+////+kCCQAAi4X0+///a8AKD7fKjUQI0ImF9Pv//+nnCAAAD7fCg/hJdFGD+Gh0QIP4bHQYg/h3D4XMCAAAgY34+///AAgAAOm9CAAAZoM/bHURA/mBjfj7//8AEAAA6aYIAACDjfj7//8Q6ZoIAACDjfj7//8g6Y4IAAAPtweD+DZ1GWaDfwI0dRKDxwSBjfj7//8AgAAA6W0IAACD+DN1GWaDfwIydRKDxwSBpfj7////f///6U8IAACD+GQPhEYIAACD+GkPhD0IAACD+G8PhDQIAACD+HUPhCsIAACD+HgPhCIIAACD+FgPhBkIAACDpcT7//8Ai4XU+///Uo216Pv//8eF0Pv//wEAAADoF/z//1np8AcAAA+3woP4ZA+PMQIAAA+EvwIAAIP4Uw+PHAEAAHR/g+hBdBArwXRaK8F0CCvBD4XhBQAAg8Igx4WY+///AQAAAImV4Pv//4uN9Pv//4ON+Pv//0CNvfz7//+4AAIAAIm98Pv//4mF7Pv//4XJD4mOAgAAx4X0+///BgAAAOneAgAA94X4+///MAgAAA+FyQAAAION+Pv//yDpvQAAAPeF+Pv//zAIAAB1B4ON+Pv//yCLvfT7//+D//91Bb////9/g8ME9oX4+///IImd5Pv//4tb/Imd8Pv//w+E+QQAAIXbdQuhYAZBAImF8Pv//4Ol7Pv//wCLtfD7//+F/w+OEQUAAIoGhMAPhAcFAACNjbT7//8PtsBRUOgL+v//WVmFwHQBRkb/hez7//85vez7//980OncBAAAg+hYD4TfAgAAK8EPhJUAAACD6AcPhPT+//8rwQ+FugQAAA+3A4PDBDP2RvaF+Pv//yCJtdD7//+JneT7//+JhaT7//90QoiFyPv//42FtPv//1CLhbT7///Ghcn7//8A/7CsAAAAjYXI+///UI2F/Pv//1DoR/j//4PEEIXAeQ+JtbD7///rB2aJhfz7//+Nhfz7//+JhfD7//+Jtez7///pNgQAAIsDg8MEiZ3k+///hcB0OotIBIXJdDP3hfj7//8ACAAAD78AiY3w+///dBKZK8LHhdD7//8BAAAA6fEDAACDpdD7//8A6ecDAAChYAZBAImF8Pv//1DoFdD//1np0AMAAIP4cA+P5QEAAA+EzQEAAIP4ZQ+MvgMAAIP4Zw+O5/3//4P4aXRug/hudCSD+G8PhaIDAAD2hfj7//+AibXg+///dGKBjfj7//8AAgAA61aDwwSJneT7//+LW/zoRPf//4XAD4R4+v//9oX4+///IHQMZouF6Pv//2aJA+sIi4Xo+///iQPHhbD7//8BAAAA6fcEAACDjfj7//9Ax4Xg+///CgAAAPeF+Pv//wCAAAAPhJkBAAAD3otD+ItT/OnVAQAAdRJmg/pndVfHhfT7//8BAAAA60s7yH4IiYX0+///i8iB+aMAAAB+N42xXQEAAFbo4JD//4uV4Pv//1mJhaj7//+FwHQQiYXw+///ibXs+///i/jrCseF9Pv//6MAAACLA4s1fNBAAIPDCImFkPv//4tD/ImFlPv//42FtPv//1D/tZj7//8PvsL/tfT7//+JneT7//9Q/7Xs+///jYWQ+///V1D/NagGQQD/1v/Qi534+///g8QcgeOAAAAAdB2DvfT7//8AdRSNhbT7//9QV/81tAZBAP/W/9BZWWaDveD7//9ndRiF23UUjYW0+///UFf/NbAGQQD/1v/QWVmAPy11EYGN+Pv//wABAABHib3w+///V+kZ/v//ibX0+///x4Ws+///BwAAAOskg+hzD4R7/P//K8EPhJz+//+D6AMPhc4BAADHhaz7//8nAAAA9oX4+///gMeF4Pv//xAAAAAPhHz+//9qMFhmiYXM+///i4Ws+///g8BRZomFzvv//4mN3Pv//+lX/v//94X4+///ABAAAA+FV/7//4PDBPaF+Pv//yB0HPaF+Pv//0CJneT7//90Bg+/Q/zrBA+3Q/yZ6xf2hfj7//9Ai0P8dAOZ6wIz0omd5Pv///aF+Pv//0B0G4XSfxd8BIXAcxH32IPSAPfagY34+///AAEAAPeF+Pv//wCQAACL+ovYdQIz/4O99Pv//wB9DMeF9Pv//wEAAADrGoOl+Pv///e4AAIAADmF9Pv//34GiYX0+///i8MLx3UGIYXc+///jbX7/f//i4X0+////430+///hcB/BovDC8d0LYuF4Pv//5lSUFdT6AX2//+DwTCJnYz7//+L2Iv6g/k5fgYDjaz7//+IDk7rvY2F+/3//yvGRveF+Pv//wACAACJhez7//+JtfD7//90XoXAdAeLxoA4MHRT/43w+///i4Xw+////4Xs+///xgAw6zyF23ULoWQGQQCJhfD7//+LhfD7///HhdD7//8BAAAA6wlPZoM4AHQGA8GF/3XzK4Xw+///0fiJhez7//+DvbD7//8AD4WoAQAAi4X4+///qEB0K6kAAQAAdARqLesOqAF0BGor6waoAnQUaiBZZomNzPv//8eF3Pv//wEAAACLvdj7//8rvez7//8rvdz7//+JveD7//+oDHUk6x6LhdT7//9qII216Pv//0/oivX//4O96Pv///9ZdASF/3/e/7Xc+///i72c+///i53U+///jYXM+///UI2F6Pv//+iH9f//9oX4+///CFlZdC/2hfj7//8EdSaLveD7///rGmowjbXo+///i8NP6Cz1//+Dvej7////WXQEhf9/4oO90Pv//wB1a4ud7Pv//4XbfmGLvfD7//+NhbT7//9Qi4W0+////7CsAAAAjYWk+///V1BL6Mry//+DxBCJhYz7//+FwH4k/7Wk+///i4XU+///jbXo+///6MD0//8DvYz7//9Zhdt/sOsug43o+////+sl/7Xs+///i72c+////7Xw+///i53U+///jYXo+///6Lb0//9ZWYO96Pv//wB8M/aF+Pv//wR0Kou94Pv//+sei4XU+///aiCNtej7//9P6Ff0//+Dvej7////WXQEhf9/3oO9qPv//wB0E/+1qPv//+jjbP//g6Wo+///AFmLvaD7//+LneT7//8Ptwcz9omF4Pv//2Y7xnQHi9DpcfX//zm1xPv//3QNg73E+///Bw+FAfX//4C9wPv//wB0CouFvPv//4NgcP2Lhej7//+LTfxfXjPNW+hCa///ycONSQBCpEAAQqJAAHSiQADPokAAG6NAACejQABto0AAZKRAAIv/VYvsi0UIVleFwHhZOwV0HUEAc1GLyMH5BYvwg+YfjTyNgB1BAIsPweYGgzwO/3U1gz2AAkEAAVOLXQx1HoPoAHQQSHQISHUTU2r06whTavXrA1Nq9v8VGNFA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6GNa////dgzoW1r///92EOhTWv///3YU6Eta////dhjoQ1r///826Dxa////diDoNFr///92JOgsWv///3Yo6CRa////dizoHFr///92MOgUWv///3Y06Axa////dhzoBFr///92OOj8Wf///3Y86PRZ//+DxED/dkDo6Vn///92ROjhWf///3ZI6NlZ////dkzo0Vn///92UOjJWf///3ZU6MFZ////dljouVn///92XOixWf///3Zg6KlZ////dmTooVn///92aOiZWf///3Zs6JFZ////dnDoiVn///92dOiBWf///3Z46HlZ////dnzocVn//4PEQP+2gAAAAOhjWf///7aEAAAA6FhZ////togAAADoTVn///+2jAAAAOhCWf///7aQAAAA6DdZ////tpQAAADoLFn///+2mAAAAOghWf///7acAAAA6BZZ////tqAAAADoC1n///+2pAAAAOgAWf///7aoAAAA6PVY////trwAAADo6lj///+2wAAAAOjfWP///7bEAAAA6NRY////tsgAAADoyVj///+2zAAAAOi+WP//g8RA/7bQAAAA6LBY////trgAAADopVj///+22AAAAOiaWP///7bcAAAA6I9Y////tuAAAADohFj///+25AAAAOh5WP///7boAAAA6G5Y////tuwAAADoY1j///+21AAAAOhYWP///7bwAAAA6E1Y////tvQAAADoQlj///+2+AAAAOg3WP///7b8AAAA6CxY////tgABAADoIVj///+2BAEAAOgWWP///7YIAQAA6AtY//+DxED/tgwBAADo/Vf///+2EAEAAOjyV////7YUAQAA6OdX////thgBAADo3Ff///+2HAEAAOjRV////7YgAQAA6MZX////tiQBAADou1f///+2KAEAAOiwV////7YsAQAA6KVX////tjABAADomlf///+2NAEAAOiPV////7Y4AQAA6IRX////tjwBAADoeVf///+2QAEAAOhuV////7ZEAQAA6GNX////tkgBAADoWFf//4PEQP+2TAEAAOhKV////7ZQAQAA6D9X////tlQBAADoNFf///+2WAEAAOgpV////7ZcAQAA6B5X////tmABAADoE1f//4PEGF5dw4v/VYvsVot1CIX2dFmLBjsFSA5BAHQHUOjwVv//WYtGBDsFTA5BAHQH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AGYAcgBvAG0AIAB0AGgAaQBzACAAYQBzAHMAZQBtAGIAbAB5ACAAZAB1AHIAaQBuAGcAIABuAGEAdABpAHYAZQAgAGMAbwBkAGUAIABpAG4AaQB0AGkAYQBsAGkAegBhAHQAaQBvAG4ACgBUAGgAaQBzACAAaQBuAGQAaQBjAGEAdABlAHMAIABhACAAYgB1AGcAIABpAG4AIAB5AG8AdQByACAAYQBwAHAAbABpAGMAYQB0AGkAbwBuAC4AIABJAHQAIABpAHMAIABtAG8AcwB0ACAAbABpAGsAZQBsAHkAIAB0AGgAZQAgAHIAZQBzAHUAbAB0ACAAbwBmACAAYwBhAGwAbABpAG4AZwAgAGEAbgAgAE0AUwBJAEwALQBjAG8AbQBwAGkAbABlAGQAIAAoAC8AYwBsAHIAKQAgAGYAdQBuAGMAdABpAG8AbgAgAGYAcgBvAG0AIABhACAAbgBhAHQAaQB2AGUAIABjAG8AbgBzAHQAcgB1AGMAdABvAHIAIABvAHIAIABmAHIAbwBtACAARABsAGwATQBhAGkAbgAuAA0ACgAAAAAAUgA2ADAAMwAyAA0ACgAtACAAbgBvAHQAIABlAG4AbwB1AGcAaAAgAHMAcABhAGMAZQAgAGYAbwByACAAbABvAGMAYQBsAGUAIABpAG4AZgBvAHIAbQBhAHQAaQBvAG4ADQAKAAAAAABSADYAMAAzADEADQAKAC0AIABBAHQAdABlAG0AcAB0ACAAdABvACAAaQBuAGkAdABpAGEAbABpAHoAZQAgAHQAaABlACAAQwBSAFQAIABtAG8AcgBlACAAdABoAGEAbgAgAG8AbgBjAGUALgAKAFQAaABpAHMAIABpAG4AZABpAGMAYQB0AGUAcwAgAGEAIABiAHUAZwAgAGkAbgAgAHkAbwB1AHIAIABhAHAAcABsAGkAYwBhAHQAaQBvAG4ALgANAAoAAAAAAFIANgAwADMAMAANAAoALQAgAEMAUgBUACAAbgBvAHQAIABpAG4AaQB0AGkAYQBsAGkAegBlAGQADQAKAAAAAABSADYAMAAyADgADQAKAC0AIAB1AG4AYQBiAGwAZQAgAHQAbwAgAGkAbgBpAHQAaQBhAGwAaQB6AGUAIABoAGUAYQBwAA0ACgAAAAAAAAAAAFIANgAwADIANwANAAoALQAgAG4AbwB0ACAAZQBuAG8AdQBnAGgAIABzAHAAYQBjAGUAIABmAG8AcgAgAGwAbwB3AGkAbwAgAGkAbgBpAHQAaQBhAGwAaQB6AGEAdABpAG8AbgANAAoAAAAAAAAAAABSADYAMAAyADYADQAKAC0AIABuAG8AdAAgAGUAbgBvAHUAZwBoACAAcwBwAGEAYwBlACAAZgBvAHIAIABzAHQAZABpAG8AIABpAG4AaQB0AGkAYQBsAGkAegBhAHQAaQBvAG4ADQAKAAAAAAAAAAAAUgA2ADAAMgA1AA0ACgAtACAAcAB1AHIAZQAgAHYAaQByAHQAdQBhAGwAIABmAHUAbgBjAHQAaQBvAG4AIABjAGEAbABsAA0ACgAAAAAAAABSADYAMAAyADQADQAKAC0AIABuAG8AdAAgAGUAbgBvAHUAZwBoACAAcwBwAGEAYwBlACAAZgBvAHIAIABfAG8AbgBlAHgAaQB0AC8AYQB0AGUAeABpAHQAIAB0AGEAYgBsAGUADQAKAAAAAAAAAAAAUgA2ADAAMQA5AA0ACgAtACAAdQBuAGEAYgBsAGUAIAB0AG8AIABvAHAAZQBuACAAYwBvAG4AcwBvAGwAZQAgAGQAZQB2AGkAYwBlAA0ACgAAAAAAAAAAAFIANgAwADEAOAANAAoALQAgAHUAbgBlAHgAcABlAGMAdABlAGQAIABoAGUAYQBwACAAZQByAHIAbwByAA0ACgAAAAAAAAAAAFIANgAwADEANwANAAoALQAgAHUAbgBlAHgAcABlAGMAdABlAGQAIABtAHUAbAB0AGkAdABoAHIAZQBhAGQAIABsAG8AYwBrACAAZQByAHIAbwByAA0ACgAAAAAAAAAAAFIANgAwADEANgANAAoALQAgAG4AbwB0ACAAZQBuAG8AdQBnAGgAIABzAHAAYQBjAGUAIABmAG8AcgAgAHQAaAByAGUAYQBkACAAZABhAHQAYQANAAoAAABSADYAMAAxADAADQAKAC0AIABhAGIAbwByAHQAKAApACAAaABhAHMAIABiAGUAZQBuACAAYwBhAGwAbABlAGQADQAKAAAAAABSADYAMAAwADkADQAKAC0AIABuAG8AdAAgAGUAbgBvAHUAZwBoACAAcwBwAGEAYwBlACAAZgBvAHIAIABlAG4AdgBpAHIAbwBuAG0AZQBuAHQADQAKAAAAUgA2ADAAMAA4AA0ACgAtACAAbgBvAHQAIABlAG4AbwB1AGcAaAAgAHMAcABhAGMAZQAgAGYAbwByACAAYQByAGcAdQBtAGUAbgB0AHMADQAKAAAAAAAAAFIANgAwADAAMgANAAoALQAgAGYAbABvAGEAdABpAG4AZwAgAHAAbwBpAG4AdAAgAHMAdQBwAHAAbwByAHQAIABuAG8AdAAgAGwAbwBhAGQAZQBkAA0ACgAAAAAAAAAAAAIAAAAo2kAACAAAANDZQAAJAAAAeNlAAAoAAAAw2UAAEAAAANjYQAARAAAAeNhAABIAAAAw2EAAEwAAANjXQAAYAAAAaNdAABkAAAAY10AAGgAAAKjWQAAbAAAAONZAABwAAADo1UAAHgAAAKjVQAAfAAAA4NRAACAAAAB41EAAIQAAAIjSQAB4AAAAZNJAAHkAAABI0kAAegAAACzSQAD8AAAAJNJAAP8AAAAE0kAATQBpAGMAcgBvAHMAbwBmAHQAIABWAGkAcwB1AGEAbAAgAEMAKwArACAAUgB1AG4AdABpAG0AZQAgAEwAaQBiAHIAYQByAHkAAAAAAAoACgAAAAAALgAuAC4AAAA8AHAAcgBvAGcAcgBhAG0AIABuAGEAbQBlACAAdQBuAGsAbgBvAHcAbgA+AAAAAABSAHUAbgB0AGkAbQBlACAARQByAHIAbwByACEACgAKAFAAcgBvAGcAcgBhAG0AOgAgAAAAKABuAHUAbABsACkAAAAAAChudWxsKQAABgAABgABAAAQAAMGAAYCEARFRUUFBQUFBTUwAFAAAAAAKCA4UFgHCAA3MDBXUAcAACAgCAAAAAAIYGhgYGBgAAB4cHh4eHgIBwgAAAcACAgIAAAIAAgABwgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAIAAgACAAIAAgACAAIAAgACgAKAAoACgAKAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIABIABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAIQAhACEAIQAhACEAIQAhACEAIQAEAAQABAAEAAQABAAEACBAIEAgQCBAIEAgQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAEAAQABAAEAAQABAAggCCAIIAggCCAIIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACABAAEAAQABAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgACAAIAAgACAAIAAgACAAIABoACgAKAAoACgAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAASAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACEAIQAhACEAIQAhACEAIQAhACEABAAEAAQABAAEAAQABAAgQGBAYEBgQGBAYEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBARAAEAAQABAAEAAQAIIBggGCAYIBggGCAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgEQABAAEAAQACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAEgAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABQAFAAQ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bGVkIHRvIGdldCBleGl0IGNvZGUgb2YgcHJvY2VzcwAALgBlAHgAZQAAAAAARXhwZWN0ZWQgdG8gZmluZCBhIGNvbW1hbmQgZW5kaW5nIGluICcuZXhlJyBpbiBzaGViYW5nIGxpbmUuAAAAAAAAAABFeHBlY3RlZCB0ZXJtaW5hdGluZyBkb3VibGUtcXVvdGUgZm9yIGV4ZWN1dGFibGUgaW4gc2hlYmFuZyBsaW5lLgAAAAAAAABUZXJtaW5hdGluZyBxdW90ZSB3aXRob3V0IHN0YXJ0aW5nIHF1b3RlIGZvciBleGVjdXRhYmxlIGluIHNoZWJhbmcgbGluZS4AAAAARmFpbGVkIHRvIGZpbmQgc2hlYmFuZwAARXhwZWN0ZWQgdG8gZmluZCB0ZXJtaW5hdG9yIGluIHNoZWJhbmcgbGluZQBFeHBlY3RlZCB0byBkZWNvZGUgc2hlYmFuZyBsaW5lIHVzaW5nIFVURi04AEV4cGVjdGVkIHRvIGZpbmQgJyMnIGF0IHN0YXJ0IG9mIHNoZWJhbmcgbGluZQAAAEV4cGVjdGVkIHRvIGZpbmQgJyEnIGZvbGxvd2luZyAnIycgaW4gc2hlYmFuZyBsaW5lAABFeHBlY3RlZCB0byBmaW5kIGV4ZWN1dGFibGUgaW4gc2hlYmFuZyBsaW5lAEV4cGVjdGVkIHRvIGZpbmQgYXJndW1lbnRzIChldmVuIGlmIGVtcHR5KSBpbiBzaGViYW5nIGxpbmUAAEV4cGVjdGVkIHRvIGJlIGFibGUgdG8gYWxsb2NhdGUgY29tbWFuZCBsaW5lIG1lbW9yeQAiACUAcwAiACAAJQBzACAAIgAlAHMAIgAgACUAcwAAAAAAAABIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEAkEAsO5AAAMAAABSU0RTxbYA0tcG3E2SSuYarna4pgIAAABDOlxVc2Vyc1xWaW5heVxQcm9qZWN0c1xzaW1wbGVfbGF1bmNoZXJcUmVsZWFzZVxDTElTaW1wbGVMYXVuY2hlci5wZGIAAAAAAAAAAAAAAIAtAACgLwAAwHEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAAqxhAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAAD+HkAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAACcgQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAAdSJAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAAB7I0AAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAFskQAAAAAAA/v///wAAAADM////AAAAAP7///+yJUAAxiVAAAAAAAD+////AAAAAND///8AAAAA/v///wAAAADgKkAAAAAAAP7///8AAAAAwP///wAAAAD+////AAAAAHAzQAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAA6TlAAAAAAAD+////AAAAAMz///8AAAAA/v///wAAAABzO0AAAAAAAAAAAAA/O0AA/v///wAAAADU////AAAAAP7///8AAAAA9jxAAAAAAAD+////AAAAAND///8AAAAA/v///wAAAACdSkAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAABNaQAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAAc1tAAAAAAAD+////AAAAANj///8AAAAA/v///wAAAAB8YkAA/v///wAAAACLYkAA/v///wAAAADY////AAAAAP7///8AAAAAPmRAAP7///8AAAAASmRAAP7///8AAAAAzP///wAAAAD+////AAAAADpuQAAAAAAA/v///wAAAADY////AAAAAP7///9rcUAAfnFAAAAAAAD+////AAAAANj///8AAAAA/v////dyQAD7ckAAAAAAAP7///8AAAAAwP///wAAAAD+////AAAAAOR0QAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAAYXZAAAAAAAD+////AAAAAND///8AAAAA/v///wAAAAAZg0AAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAAPKDQAAAAAAA/v///wAAAADM////AAAAAP7///8AAAAA+JFAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAABclUAAAAAAAP7///8AAAAAzP///wAAAAD+////AAAAAC6ZQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAAspxAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAADMrkAAAAAAAP7///8AAAAAyP///wAAAAD+////AAAAAJGwQAAAAAAAAAAAAM2vQADs8gAAAAAAAAAAAACk9QAAANAAACT0AAAAAAAAAAAAAL71AAA40QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAs9AAAOvQAAEz0AABm9AAAePQAAIz0AACi9AAAvvQAANr0AADw9AAABvUAACL1AAA49QAATPUAAFz1AABs9QAAhPUAAJb1AADK9QAA1vUAAOL1AAD69QAAEvYAACT2AAA29gAATPYAAGD2AAB89gAAmvYAAK72AADW9gAA5vYAAPb2AAAC9wAAEPcAACL3AAA29wAAQvcAAFT3AABi9wAAdPcAAIz3AACU9wAAoPcAALL3AADI9wAA4vcAAPj3AAAS+AAAHvgAACz4AAA6+AAARPgAAFz4AABs+AAAgvgAAJr4AAC0+AAAxPgAANr4AAD0+AAAAvkAABL5AAAg+QAAMPkAAEL5AABW+QAAYvkAAGz5AAB4+QAAivkAAJr5AAC2+QAAxvkAANj5AADk+QAA9PkAAAAAAACy9QAAAAAAABkBRXhpdFByb2Nlc3MAhwFHZXRDb21tYW5kTGluZVcAcQRTZXRJbmZvcm1hdGlvbkpvYk9iamVjdACoAENyZWF0ZVByb2Nlc3NXAADAAUdldEN1cnJlbnRQcm9jZXNzAPkEV2FpdEZvclNpbmdsZU9iamVjdABnAUdlbmVyYXRlQ29uc29sZUN0cmxFdmVudAAAFgBBc3NpZ25Qcm9jZXNzVG9Kb2JPYmplY3QAAN8BR2V0RXhpdENvZGVQcm9jZXNzAAAUAkdldE1vZHVsZUZpbGVOYW1lVwAApQNRdWVyeUluZm9ybWF0aW9uSm9iT2JqZWN0AGcDTXVsdGlCeXRlVG9XaWRlQ2hhcgCVAENyZWF0ZUpvYk9iamVjdEEAAGQCR2V0U3RkSGFuZGxlAAACAkdldExhc3RFcnJvcgAALQRTZXRDb25zb2xlQ3RybEhhbmRsZXIA6ABEdXBsaWNhdGVIYW5kbGUAUgBDbG9zZUhhbmRsZQBLRVJORUwzMi5kbGwAAEUBU3RyU3RySVcAAFNITFdBUEkuZGxsAM8CSGVhcEZyZWUAAMsCSGVhcEFsbG9jAO4ARW50ZXJDcml0aWNhbFNlY3Rpb24AADkDTGVhdmVDcml0aWNhbFNlY3Rpb24AAGkCR2V0U3RyaW5nVHlwZVcAAIYBR2V0Q29tbWFuZExpbmVBANMCSGVhcFNldEluZm9ybWF0aW9uAADABFRlcm1pbmF0ZVByb2Nlc3MAANMEVW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyAAClBFNldFVuaGFuZGxlZEV4Y2VwdGlvbkZpbHRlcgAAA0lzRGVidWdnZXJQcmVzZW50AOMCSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbkFuZFNwaW5Db3VudADqAEVuY29kZVBvaW50ZXIAygBEZWNvZGVQb2ludGVyABgEUnRsVW53aW5kAM0CSGVhcENyZWF0ZQAARQJHZXRQcm9jQWRkcmVzcwAAGAJHZXRNb2R1bGVIYW5kbGVXAAAlBVdyaXRlRmlsZQBvBFNldEhhbmRsZUNvdW50AADzAUdldEZpbGVUeXBlAGMCR2V0U3RhcnR1cEluZm9XANEARGVsZXRlQ3JpdGljYWxTZWN0aW9uALIEU2xlZXAAwANSZWFkRmlsZQAAZgRTZXRGaWxlUG9pbnRlcgAAEwJHZXRNb2R1bGVGaWxlTmFtZUEAAGEBRnJlZUVudmlyb25tZW50U3RyaW5nc1cAEQVXaWRlQ2hhclRvTXVsdGlCeXRlANoBR2V0RW52aXJvbm1lbnRTdHJpbmdzVwAAxQRUbHNBbGxvYwAAxwRUbHNHZXRWYWx1ZQDIBFRsc1NldFZhbHVlAMYEVGxzRnJlZQDvAkludGVybG9ja2VkSW5jcmVtZW50AABzBFNldExhc3RFcnJvcgAAxQFHZXRDdXJyZW50VGhyZWFkSWQAAOsCSW50ZXJsb2NrZWREZWNyZW1lbnQAAKcDUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIAkwJHZXRUaWNrQ291bnQAAMEBR2V0Q3VycmVudFByb2Nlc3NJZAB5AkdldFN5c3RlbVRpbWVBc0ZpbGVUaW1lAI8AQ3JlYXRlRmlsZVcAPwNMb2FkTGlicmFyeVcAANICSGVhcFJlQWxsb2MAmgFHZXRDb25zb2xlQ1AAAKwBR2V0Q29uc29sZU1vZGUAAFcBRmx1c2hGaWxlQnVmZmVycwAAcgFHZXRDUEluZm8AaAFHZXRBQ1AAADcCR2V0T0VNQ1AA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AAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQECAgICAgICAgICAgICAgICAwMDAwMDAwMAAAAAAAAAAAjcQAD420AAcN1AAHLfQAD//////////wAAAAAAAAAAIAWTGQAAAAAAAAAAAAAAAMu6QADLukAAy7pAAMu6QADLukAAy7pAAMu6QADLukAAy7pAAMu6QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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NcTExI7t7e3/w8PD/+zs7P/f39//0dHR/9vb2//q6ur/2tra/+np6f/q6ur/4uLi/97e3v/e3t7/4uLi/9zc3P/h4eH/0NDQ/+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/42Njf+Wlpb/lJSU/9ra2v/CwsL/9vb2//j4+P/R0dH/19fX//f39//39/f/2NjY/9zc3P/U1NT/zs7O/8vLy//+/v7/xItE/9Kndf/8+vb/yqR2/657O/+qeTz/pXY9/6F0Pv+ccj//mHA//5p4Tf/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8PDyJTU1Ngf39/f/MzMyRJiYmNbW1taw7Ozv/PDw8/3h4eP9RUVH/Ozs7/0tLS//w8PD/xcXF//T09P/29vb/9/f3//n5+f/4+Pj/+Pj4//j4+P/39/f/2tra/+zs7P/o6Oj/7u7u/+bm5v/7+/v/4cGa/7+DOP+7gTj/tn45/7J8Ov+tejv/qXg8/6R2Pf+gdD7/m3I//8y3n//8/PybAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOTk5lJmZmf/W1tb/9/f3//39/f/Jycn/gICA/1ZWVv8jIyP/KSkp/zQ0NP/u7u7/+/v7//r6+v/6+vr/+vr6//r6+v/5+fn/+fn5//n5+f/4+Pj/+Pj4//j4+P/39/f/9/f3//X19f/39/f//f39/+jRs//NnWL/vIVA/7V+Of+xfDr/rHo7/6t9Q/+3k2f/28u2//b19dONjY0cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGZiYmP+EhITzkZGR/4KCgvVaWlr/bGxs/zs7O/8hISH/IiIi/ykpKf9fX1//1tbW//j4+P/7+/v/+/v7//r6+v/6+vr/+vr6/+Li4v/q6ur/6+vr/+fn5//d3d3/4eHh/7+/v//r6+v/4+Pj//T09P/39/f///////////////////////////n5+fne7u7u/yYmJjIAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGf////86OjqgcHBw33t7e/5fX1//V1dX/1dXV/86Ojr/ISEh/yIiIv8qKir/d3d3/+7u7v/8/Pz/19fX/9DQ0P/7+/v/+vr6/93d3f/q6ur/zs7O/9bW1v/Nzc3/1tbW/9jY2P/R0dH/1NTU//f39//39/f/9/f3//b29v/y8vL/IiIiNAAAABc4ODgm29vb/wAAACwAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGf7+/v/MzMyROTk5oYGBgdSWlpb/SkpK/3x8fP9sbGz/Ojo6/yIiIv9CQkL/WFhY/3x8fP/4+Pj//Pz8//z8/P/8/Pz/+/v7/+Dg4P/v7+//7e3t//Hx8f/m5ub/9/f3/+bm5v/19fX/6urq//j4+P/4+Pj/9/f3/8rKyv/v7+//vLy8kiQkJDa0tLSP0tLS/wAAACwAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGf7+/v/9/f3//f39/5iYmP+5ubn//v7+//z8/P+4uLj/dXV1/0tLS/9DQ0P/QEBA/y4uLv93d3f//Pz8//39/f/8/Pz//Pz8//z8/P/7+/v/+/v7//v7+//6+vr/+vr6//r6+v/5+fn/+Pj4//n5+f/4+Pj/9PT0//Dw8P/r6+v/5eXl/93d3f/T09P/yMjI/wAAACoAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGf7+/v/S0tKMNjY2IuDg4ISZmZn/vb29//7+/v/v7+//urq6/4SEhP9LS0v/YWFh/0xMTP9XV1f/pKSk//39/f/x8fH/7e3t//39/f/7+/v/4uLi/+zs7P/x8fH/5OTk/9jY2P/Pz8//v7+//+Pj4//h4eH/7+/v/8LCwv/l5eX+pKSkhBgYGECWlpaixMTE6AAAACQAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGf39/f8iIiI0AAAAFzs7Oyb8/Pz//f39//39/f/f39//4uLi/7S0tP9ubm7/ZmZm/yEhIf8kJCT/OTk5/8rKyv/e3t7/+vr6//39/f/9/f3/3t7e/+Li4v/a2tr/09PT/8vLy/+ysrL/rq6u/6ioqP+vr6//ysrK/8jIyP+9vb3oNDQ0XXR0dHzExMTCyMjIhwAAABcAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGfz8/P/JycmRJiYmNdDQ0I78/Pz/0dHR//z8/P/e3t7/+Pj4/+7u7v+8vLz/dnZ2/21tbf9WVlb/e3t7/09PT//n5+f/9fX1//7+/v/9/f3/4ODg//Ly8v/t7e3/9PT0/+Tk5P/Jycn//v7+/////////////v7+//j4+P/x8fH/4eHh/+np6f/a2tqlAAAAHAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGfz8/P/6+vr/+vr6//r6+v/7+/v/+/v7//v7+//8/Pz//Pz8//z8/P/9/f3/0dHR/2FhYf9DQ0P/h4eH/3BwcP+ioqL//////////////////v7+//7+/v/+/v7//f39//b29v/Nzc3//////+Pj4//V1dX/1dXV//Hx8f/Jycn/n5+f/7Ozs6ACAgIcAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGfz8/P/Pz8+MNTU1It7e3oT6+vr/0NDQ//v7+//7+/v/+/v7//z8/P/8/Pz//Pz8/+fn5/98fHz/TU1N/4aGhv9mZmb/6Ojo//7+/v/////////////////+/v7//f39//X19f/Ly8v//v7+/8DAwP/CwsL/rq6u/+np6f+kpKT/mJiYmAAAABwAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGfz8/P8iIiI0AAAAFzs7Oyb5+fn/+vr6//r6+v/6+vr/+vr6//v7+//7+/v/+/v7//z8/P/7+/v/w8PD/1xcXP+Xl5f/srKy//7+/v/+/v7//v7+//7+/v/+/v7/+/v7//Ly8v/IyMj//v7+/9TU1P+urq7/wsLC/+rq6v+srKydAAAAHAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGfv7+//Hx8eRJSUlNc7Ozo74+Pj/zs7O//n5+f/a2tr/6enp/8/Pz//r6+v/1tbW//v7+//7+/v//Pz8//X19f+2trb/mpqa//j4+P/9/f3//f39//39/f/6+vr/9vb2/+7u7v/FxcX/+vr6//Hx8f/p6en/6urq/93d3acDAwMcAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGfv7+//39/f/9/f3//f39//4+Pj/+Pj4//j4+P/5+fn/+fn5//n5+f/6+vr/+vr6//r6+v/6+vr/+/v7//v7+//7+/v/+/v7/6CgoP/39/f//Pz8//n5+f/19fX/8fHx/+jo6P+/v7//9vb2/+np6f/q6ur/3NzcpgICAhwAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGfr6+v/Nzc2MNTU1Itvb24T39/f/zs7O//f39//4+Pj/+Pj4//j4+P/5+fn/+fn5//n5+f/u7u7/7e3t/+fn5//n5+f/6+vr/+7u7v+ampr/4uLi/+Pj4//Pz8//4ODg/8TExP+7u7v/8fHx/+rq6v/b29ulAAAAHAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGfr6+v8iIiI0AAAAFzo6Oib29vb/9vb2//f39//39/f/9/f3//j4+P/4+Pj/+Pj4//n5+f/c3Nz/19fX//j4+P/Z2dn/2dnZ/9bW1v/Z2dn/xsbG/97e3v/Ozs7/wMDA/66urv+7u7v/8vLy/9ra2qQAAAAcAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGfn5+f/Dw8ORJSUlNcvLy4719fX/zMzM//b29v/Y2Nj/5ubm/83Nzf/o6Oj/09PT/+/v7//i4uL/8/Pz/+fn5//t7e3/8PDw/+fn5//r6+v/7e3t/+Tk5P/R0dH/0NDQ/7W1tf/b29v/3NzcpAAAABwAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGfv7+//5+fn/+fn5//n5+f/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/7+/v/+/v7//v7+//7+/v/+/v7//z8/P/7+/v/+vr6//j4+P/19fX/8vLy/+/v7//p6en/4+Pj/uXl5ejX19eHAAAAGgAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABIAAAAKAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/4D///+/d3f8AAf//j93d+AAAD/wP3d34AAAAAA/d3fgAAAAAD93d+AAAAAAP3d34AAAAAA/d3fgAAAAAD93d+AAAAAAP3d34AAAAAA/d3fgAAAAAD93d+AAAAAAP3d34AAAAAA/d3fgAAAAAAN3d+AAAAAAAXd34AAAAAAAd3fgAAAAAAB3d+AAAAAAAHd34AAAAAAAd3fgAAAAAAB3d+AAAAAAAHd34AAAAAAAd3fgAAAAAAB3d+AAAAAAAHd34AAAAAABd3fgAAAAAAN3d+AAAAAAP3d34AAAAAA/d3eAAAAAAD93d8AAAAAAP3d34AAAAAA/d3fgAAAAAD93d+AAAAAAP3d34AAAAAA/d3fgAAAAAD93d+AAAAAAP3d34AAAAAA/d3fgAAAAAH93d+AAAAAA/3d34AAAAAH/d3fgAAAAA/93d+AAAAAH/3d34AAAAA//d3fgAAAAH/93d+AAAAA//3d34AAAAH//d3fgAAAA//93d+AAAAH//3d3KAAAACAAAABAAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAHAAAABwAAAAUAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////gf///8n////2////////////////////9v///8j///+BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAABghISEwXFxcSmVlZVE2NjZENTU1QQAAADAAAAAkAAAAFQAAAAoAAAACAAAAAP///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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/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+DQo8L2Fzc2VtYmx5PlBBUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFEABAAAMwAAAAKMEEwWjB6MI0wtDC+MNYwqjEKMiMyTTJiMm4yhzKUMqoyxzLeMvUyGDMdMz8zVDNxM44znTOrM8cz0DPmM+0z9zMDNBI0FzQpNDc0PDR7NJ00vDQWNSQ1SzV8NYU1jDWhNb010zUKNi42PjaDNrY2ATcXN6o3zTfqN/o3dzg1OTs5TTmvOd455DnzOTI6ODpSOmE6bjp6Ooo6kTqgOqw6uTrdOu86/ToSOxw7Qjt1O4Q7jTuxO+A7fT4oP5w/oz/FP8w/ACAAAMgAAABXMG8wCTF9MR0yDDP1M200kjSfNKw0uDTENMo03DTkNO80NjU7NUU1fzWENYs1kTUGNgw2EjYYNh42JDYrNjI2OTZANkc2TjZVNl02ZTZtNnk2gjaHNo02lzagNqs2tza8Nsw20TbXNt028zb6Ngk3xjj4OBc5NjmZObw53jnpOR86LzpZOmo6dzp+Oo46oDqlOvU6Bzvn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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AHUAbgB0AGkAbQBlACAAZQByAHIAbwByACAAAAAAAA0ACgAAAAAAVABMAE8AUwBTACAAZQByAHIAbwByAA0ACgAAAAAAAABTAEkATgBHACAAZQByAHIAbwByAA0ACgAAAAAAAAAAAEQATwBNAEEASQBOACAAZQByAHIAbwByAA0ACgAAAAAAUgA2ADAAMwAzAA0ACgAtACAAQQB0AHQAZQBtAHAAdAAgAHQAbwAgAHUAcwBlACAATQBTAEkATAAgAGMAbwBkAGUAIABmAHIAbwBtACAAdABoAGkAcwAgAGEAcwBzAGUAbQBiAGwAeQAgAGQAdQByAGkAbgBnACAAbgBhAHQAaQB2AGUAIABjAG8AZABlACAAaQBuAGkAdABpAGEAbABpAHoAYQB0AGkAbwBuAAoAVABoAGkAcwAgAGkAbgBkAGkAYwBhAHQAZQBzACAAYQAgAGIAdQBnACAAaQBuACAAeQBvAHUAcgAgAGEAcABwAGwAaQBjAGEAdABpAG8AbgAuACAASQB0ACAAaQBzACAAbQBvAHMAdAAgAGwAaQBrAGUAbAB5ACAAdABoAGUAIAByAGUAcwB1AGwAdAAgAG8AZgAgAGMAYQBsAGwAaQBuAGcAIABhAG4AIABNAFMASQBMAC0AYwBvAG0AcABpAGwAZQBkACAAKAAvAGMAbAByACkAIABmAHUAbgBjAHQAaQBvAG4AIABmAHIAbwBtACAAYQAgAG4AYQB0AGkAdgBlACAAYwBvAG4AcwB0AHIAdQBjAHQAbwByACAAbwByACAAZgByAG8AbQAgAEQAbABsAE0AYQBpAG4ALgANAAoAAAAAAFIANgAwADMAMgANAAoALQAgAG4AbwB0ACAAZQBuAG8AdQBnAGgAIABzAHAAYQBjAGUAIABmAG8AcgAgAGwAbwBjAGEAbABlACAAaQBuAGYAbwByAG0AYQB0AGkAbwBuAA0ACgAAAAAAAAAAAAAAAABSADYAMAAzADEADQAKAC0AIABBAHQAdABlAG0AcAB0ACAAdABvACAAaQBuAGkAdABpAGEAbABpAHoAZQAgAHQAaABlACAAQwBSAFQAIABtAG8AcgBlACAAdABoAGEAbgAgAG8AbgBjAGUALgAKAFQAaABpAHMAIABpAG4AZABpAGMAYQB0AGUAcwAgAGEAIABiAHUAZwAgAGkAbgAgAHkAbwB1AHIAIABhAHAAcABsAGkAYwBhAHQAaQBvAG4ALgANAAoAAAAAAFIANgAwADMAMAANAAoALQAgAEMAUgBUACAAbgBvAHQAIABpAG4AaQB0AGkAYQBsAGkAegBlAGQADQAKAAAAAAAAAAAAAAAAAFIANgAwADIAOAANAAoALQAgAHUAbgBhAGIAbABlACAAdABvACAAaQBuAGkAdABpAGEAbABpAHoAZQAgAGgAZQBhAHAADQAKAAAAAAAAAAAAUgA2ADAAMgA3AA0ACgAtACAAbgBvAHQAIABlAG4AbwB1AGcAaAAgAHMAcABhAGMAZQAgAGYAbwByACAAbABvAHcAaQBvACAAaQBuAGkAdABpAGEAbABpAHoAYQB0AGkAbwBuAA0ACgAAAAAAAAAAAFIANgAwADIANgANAAoALQAgAG4AbwB0ACAAZQBuAG8AdQBnAGgAIABzAHAAYQBjAGUAIABmAG8AcgAgAHMAdABkAGkAbwAgAGkAbgBpAHQAaQBhAGwAaQB6AGEAdABpAG8AbgANAAoAAAAAAAAAAABSADYAMAAyADUADQAKAC0AIABwAHUAcgBlACAAdgBpAHIAdAB1AGEAbAAgAGYAdQBuAGMAdABpAG8AbgAgAGMAYQBsAGwADQAKAAAAAAAAAFIANgAwADIANAANAAoALQAgAG4AbwB0ACAAZQBuAG8AdQBnAGgAIABzAHAAYQBjAGUAIABmAG8AcgAgAF8AbwBuAGUAeABpAHQALwBhAHQAZQB4AGkAdAAgAHQAYQBiAGwAZQANAAoAAAAAAAAAAABSADYAMAAxADkADQAKAC0AIAB1AG4AYQBiAGwAZQAgAHQAbwAgAG8AcABlAG4AIABjAG8AbgBzAG8AbABlACAAZABlAHYAaQBjAGUADQAKAAAAAAAAAAAAAAAAAAAAAABSADYAMAAxADgADQAKAC0AIAB1AG4AZQB4AHAAZQBjAHQAZQBkACAAaABlAGEAcAAgAGUAcgByAG8AcgANAAoAAAAAAAAAAAAAAAAAAAAAAFIANgAwADEANwANAAoALQAgAHUAbgBlAHgAcABlAGMAdABlAGQAIABtAHUAbAB0AGkAdABoAHIAZQBhAGQAIABsAG8AYwBrACAAZQByAHIAbwByAA0ACgAAAAAAAAAAAFIANgAwADEANgANAAoALQAg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AAAAV2VkbmVzZGF5AAAAAAAAAFR1ZXNkYXkATW9uZGF5AABTdW5kYXkAAFNhdABGcmkAVGh1AFdlZABUdWUATW9uAFN1bgAAAAAAAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+fwBDAE8ATgBPAFUAVAAkAAAARmF0YWwgZXJyb3IgaW4gbGF1bmNoZXI6ICVzCgAAAAByAGIAAAAAAEZhaWxlZCB0byBvcGVuIGV4ZWN1dGFibGUAAAAAAAAAVW5hYmxlIHRvIGZpbmQgYW4gYXBwZW5kZWQgYXJjaGl2ZS4AAAAAAFVuYWJsZSB0byByZWFkIGZyb20gZmlsZQAAAAAjIQAAAAAAAAAAAABKb2IgaW5mb3JtYXRpb24gcXVlcnlpbmcgZmFpbGVkAEpvYiBpbmZvcm1hdGlvbiBzZXR0aW5nIGZhaWxlZAAAc3RkaW4gZHVwbGljYXRpb24gZmFpbGVkAAAAAAAAAABzdGRvdXQgZHVwbGljYXRpb24gZmFpbGVkAAAAAAAAAHN0ZGVyciBkdXBsaWNhdGlvbiBmYWlsZWQAAAAAAAAAVW5hYmxlIHRvIGNyZWF0ZSBwcm9jZXNzIHVzaW5nICclcycAAAAAAEZhaWxlZCB0byBnZXQgZXhpdCBjb2RlIG9mIHByb2Nlc3MAAAAAAAAuAGUAeABlAAAAAAAAAAAARXhwZWN0ZWQgdG8gZmluZCBhIGNvbW1hbmQgZW5kaW5nIGluICcuZXhlJyBpbiBzaGViYW5nIGxpbmUuAAAAAAAAAAAAAAAARXhwZWN0ZWQgdGVybWluYXRpbmcgZG91YmxlLXF1b3RlIGZvciBleGVjdXRhYmxlIGluIHNoZWJhbmcgbGluZS4AAAAAAAAAAAAAAAAAAABUZXJtaW5hdGluZyBxdW90ZSB3aXRob3V0IHN0YXJ0aW5nIHF1b3RlIGZvciBleGVjdXRhYmxlIGluIHNoZWJhbmcgbGluZS4AAAAAAAAAAEZhaWxlZCB0byBmaW5kIHNoZWJhbmcAAEV4cGVjdGVkIHRvIGZpbmQgdGVybWluYXRvciBpbiBzaGViYW5nIGxpbmUAAAAAAEV4cGVjdGVkIHRvIGRlY29kZSBzaGViYW5nIGxpbmUgdXNpbmcgVVRGLTgAAAAAAEV4cGVjdGVkIHRvIGZpbmQgJyMnIGF0IHN0YXJ0IG9mIHNoZWJhbmcgbGluZQAAAEV4cGVjdGVkIHRvIGZpbmQgJyEnIGZvbGxvd2luZyAnIycgaW4gc2hlYmFuZyBsaW5lAAAAAAAARXhwZWN0ZWQgdG8gZmluZCBleGVjdXRhYmxlIGluIHNoZWJhbmcgbGluZQAAAAAARXhwZWN0ZWQgdG8gZmluZCBhcmd1bWVudHMgKGV2ZW4gaWYgZW1wdHkpIGluIHNoZWJhbmcgbGluZQAAAAAAAEV4cGVjdGVkIHRvIGJlIGFibGUgdG8gYWxsb2NhdGUgY29tbWFuZCBsaW5lIG1lbW9yeQAAAAAAIgAlAHMAIgAgACUAcwAgACIAJQBzACIAIAAlAHMAAABSU0RT3KH/KW9QEUe5wIunTkyFJwIAAABDOlxVc2Vyc1xWaW5heVxQcm9qZWN0c1xzaW1wbGVfbGF1bmNoZXJceDY0XFJlbGVhc2VcQ0xJU2ltcGxlTGF1bmNoZXIucGRiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAEGAgAGMgJQERMIABNkDAATNAsAE1IP0A3AC3C4KQAAAgAAAMIZAADlGQAAoNkAAAAAAADqGQAA/hkAAKDZAAAAAAAAAQYCAAYyAjABCwEAC2IAAAEUCgAUNA8AFDIQ8A7gDNAKwAhwB2AGUAEGAgAGUgJQERkKABnECwAZdAoAGWQJABk0CAAZUhXQuCkAAAEAAADAIAAA2SAAALrZAAAAAAAAERwFABxCGMAWcBVgFDAAALgpAAABAAAAgCEAAD4iAACg2QAAAAAAAAEdDAAddAsAHWQKAB1UCQAdNAgAHTIZ4BfQFcARDwQADzQHAA8yC3C4KQAAAQAAAK0kAAC3JAAA1NkAAAAAAAABFAgAFGQIABRUBwAUNAYAFDIQcBEUBgAUZAgAFDQHABQyEHC4KQAAAQAAANElAADgJQAA1NkAAAAAAAARDwQADzQHAA8yC3C4KQAAAQAAAL8mAADJJgAA1NkAAAAAAAAJCgQACjQJAApSBnC4KQAAAQAAAJQnAAAzKAAA7tkAADMoAAABDAIADAERAAEgDAAgZBEAIFQQACA0DgAgchzwGuAY0BbAFHABHAwAHGQPABxUDgAcNAwAHFIY8BbgFNASwBBwEQ8GAA9kCQAPNAgAD1ILcLgpAAABAAAAsi4AANIvAAAM2gAAAAAAABkuCQAdZMQAHTTDAB0BvgAOwAxwC1AAAIR9AADgBQAAARQIABRkCgAUVAkAFDQIABRSEHABBAEABGIAAAEHAgAHAZsAAQAAAAEAAAABAAAAAQ8EAA80BgAPMgtwERwKABxkDwAcNA4AHHIY8BbgFNASwBBwuCkAAAEAAABHNgAAVTcAACfaAAAAAAAAGS0LABtkUQAbVFAAGzRPABsBSgAU0BLAEHAAAIR9AABAAgAAARwLABx0GAAcVBcAHDQWABwBEgAV4BPQEcAAAAEZCgAZdAkAGWQIABlUBwAZNAYAGTIVwBEPBgAPZAkADzQIAA9SC3C4KQAAAQAAAI4/AAACQAAADNoAAAAAAAARGQoAGXQMABlkCwAZNAoAGVIV8BPQEcC4KQAAAgAAAEpBAACOQQAAS9oAAAAAAAARQQAAp0EAAHvaAAAAAAAAARUIABV0CAAVZAcAFTQGABUyEcARFQgAFXQIABVkBwAVNAYAFTIR0LgpAAABAAAAh0MAAMVDAACW2gAAAAAAAAEZCgAZdAsAGWQKABlUCQAZNAgAGVIVwAEXCAAXZAkAF1QIABc0BwAXMhNwAAAAAAEAAAABGwoAG3QQABtkDwAbNA4AG5IU0BLAEFABGAoAGGQMABhUCwAYNAoAGFIU0BLAEHABHAkAHKIV8BPgEdAPwA1wDGALMApQAAARGwoAG2QMABs0CwAbMhfwFeAT0BHAD3C4KQAAAQAAAExVAAB+VQAAtNoAAAAAAAABEAYAEHQHABA0BgAQMgzAAQkCAAkyBTABGAgAGGQIABhUBwAYNAYAGDIUcBEVCAAVNAsAFTIR4A/QDcALcApguCkAAAEAAAAdZAAAT2QAALTaAAAAAAAAEREGABE0CgARMg3AC3AKYLgpAAABAAAAr2UAANNlAACv2wAAAAAAAAEPBgAPZAsADzQKAA9SC3ABCgQACjQGAAoyBnARCgQACjQGAAoyBnC4KQAAAgAAAFZuAABgbgAAzdoAAAAAAAB1bgAAnG4AAO3aAAAAAAAAERMEABM0BwATMg9wuCkAAAIAAAD8bwAAKXAAAM3aAAAAAAAAO3AAAHJwAADt2gAAAAAAAAEKBAAKNAgACjIGcAkEAQAEQgAAuCkAAAEAAABXcgAAinIAABDbAACKcgAAASQKACQ0GQAk8hrwGOAW0BTAEnARYBBQEQoEAAo0CgAKcgZwuCkAAAEAAACdegAAwHoAADLbAAAAAAAAARkKABl0DQAZZAwAGVQLABk0CgAZchXACQQBAARCAAC4KQAAAQAAALl9AAC9fQAAAQAAAL19AAARFwoAF2QOABc0DQAXUhPwEeAP0A3AC3C4KQAAAQAAAFF/AADffwAAe9sAAAAAAAARGQoAGXQKABlkCQAZNAgAGTIV4BPQEcC4KQAAAQAAAMKAAACIgQAAmdsAAAAAAAABAAAAGR4IAA+SC+AJ0AfABXAEYANQAjCEfQAASAAAABk2CwAlNHEDJQFmAxDwDuAM0ArACHAHYAZQAACEfQAAIBsAABEVCAAVNAsAFTIR4A/QDcALcApguCkAAAEAAACJjwAAu48AALTaAAAAAAAAEREGABE0CgARMg3AC3AKYLgpAAABAAAAW5AAAJ+QAACv2wAAAAAAABkwCwAfNGQAHwFaABDwDuAM0ArACHAHYAZQAACEfQAAyAIAABEVCAAVNAsAFTIR4A/QDcALcApguCkAAAEAAADxnAAAJZ0AALTaAAAAAAAAGS8JAB50tQAeZLQAHjSzAB4BsAAQUAAAhH0AAHAFAAARCgQACjQHAAoyBnC4KQAAAQAAAM6gAAAloQAAyNsAAAAAAAABBgIABnICMBkfCAAQNBAAEHIM0ArACHAHYAZQhH0AADgAAAARGQoAGcQLABl0CgAZZAkAGTQIABlSFdC4KQAAAQAAADSlAADgpQAAyNsAAAAAAAARBgIABjICMLgpAAABAAAAn6kAALWpAADj2wAAAAAAABkhCAASVA8AEjQOABJyDsAMcAtghH0AADAAAAABGwoAG8QPABt0DgAbZA0AGzQMABuSFFABGAoAGGQKABhUCQAYNAgAGDIU0BLAEHAZMAsAHzSmAB8BnAAQ8A7gDNAKwAhwB2AGUAAAhH0AANAEAAABDwYAD1QHAA80BgAPMgtwERkKABnECQAZdAgAGWQHABk0BgAZMhXguCkAAAEAAACevAAAv7wAAP7bAAAAAAAAERkKABl0DgAZZA0AGTQMABlyFeAT0BHAuCkAAAIAAAC9vQAA5L0AABncAAAAAAAAZL0AAAW/AAA53AAAAAAAAAEAAAABFQYAFTQQABWyDnANYAxQAQ8GAA9kCwAPNAoAD3ILcAEdDAAddAsAHWQKAB1UCQAdNAgAHTIZ8BfQFcABBQIABTQBAAESBAASNA0AEpILUAEJAQAJYgAAAAAAAAEEAQAEEgAAGS0NRR90EgAbZBEAFzQQABNDDpIK8AjgBtAEwAJQAACEfQAASAAAAAEPBgAPZBEADzQQAA/SC3AZLQ01H3QQABtkDwAXNA4AEzMOcgrwCOAG0ATAAlAAAIR9AAAwAAAAAQ8GAA9kDwAPNA4AD7ILcAEOAgAOMgowAQoCAAoyBjABEggAElQKABI0CAASMg7ADHALYAEPBgAPZAkADzQIAA9SC3AAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAABBAEABIIAAAEPBgAPZAcADzQGAA8yC3AZLAIAGgGJAIR9AAAwBAAAGSUHABd0NAAXNDMAFwEwAAtQAACEfQAAcAEAAAEfDAAfdBEAH2QQAB80DwAfchjwFuAU0BLAEFAZMg0AIHR1ACBkdAAgVHMAIDRyACABbgAZ4BfQFcAAAIR9AABgAwAAAQQBAARCAAB4DAEAAAAAAAAAAAB4EAEAAOAAAPAOAQAAAAAAAAAAAJIQAQB44gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwEAAAAAAA4PAQAAAAAAIA8BAAAAAAA6DwEAAAAAAEwPAQAAAAAAYA8BAAAAAAB2DwEAAAAAAJIPAQAAAAAArg8BAAAAAADEDwEAAAAAANoPAQAAAAAA9g8BAAAAAAAMEAEAAAAAACAQAQAAAAAAMBABAAAAAABAEAEAAAAAAFgQAQAAAAAAahABAAAAAACeEAEAAAAAAKoQAQAAAAAAthABAAAAAADOEAEAAAAAAOYQAQAAAAAA+BABAAAAAAAKEQEAAAAAAB4RAQAAAAAAOhEBAAAAAABYEQEAAAAAAGwRAQAAAAAAgBEBAAAAAACaEQEAAAAAAK4RAQAAAAAAvBEBAAAAAADkEQEAAAAAAPQRAQAAAAAABBIBAAAAAAAaEgEAAAAAACgSAQAAAAAANhIBAAAAAABIEgEAAAAAAFwSAQAAAAAAaBIBAAAAAAB6EgEAAAAAAIgSAQAAAAAAmhIBAAAAAACyEgEAAAAAALoSAQAAAAAAxhIBAAAAAADYEgEAAAAAAO4SAQAAAAAACBMBAAAAAAAeEwEAAAAAADgTAQAAAAAARhMBAAAAAABUEwEAAAAAAF4TAQAAAAAAbhMBAAAAAACEEwEAAAAAAJATAQAAAAAAqhMBAAAAAAC6EwEAAAAAANATAQAAAAAA6hMBAAAAAAD4EwEAAAAAAAgUAQAAAAAAFhQBAAAAAAAmFAEAAAAAADgUAQAAAAAATBQBAAAAAABYFAEAAAAAAGIUAQAAAAAAbhQBAAAAAACAFAEAAAAAAJAUAQAAAAAAoBQBAAAAAACyFAEAAAAAAL4UAQAAAAAAzhQBAAAAAAAAAAAAAAAAAIYQAQAAAAAAAAAAAAAAAAAfAUV4aXRQcm9jZXNzAI0BR2V0Q29tbWFuZExpbmVXAH4EU2V0SW5mb3JtYXRpb25Kb2JPYmplY3QAqABDcmVhdGVQcm9jZXNzVwAAxgFHZXRDdXJyZW50UHJvY2VzcwAIBVdhaXRGb3JTaW5nbGVPYmplY3QAbQFHZW5lcmF0ZUNvbnNvbGVDdHJsRXZlbnQAABYAQXNzaWduUHJvY2Vzc1RvSm9iT2JqZWN0AADmAUdldEV4aXRDb2RlUHJvY2VzcwAAGgJHZXRNb2R1bGVGaWxlTmFtZVcAAKcDUXVlcnlJbmZvcm1hdGlvbkpvYk9iamVjdABpA011bHRpQnl0ZVRvV2lkZUNoYXIAlQBDcmVhdGVKb2JPYmplY3RBAABrAkdldFN0ZEhhbmRsZQAACAJHZXRMYXN0RXJyb3IAADsEU2V0Q29uc29sZUN0cmxIYW5kbGVyAOwARHVwbGljYXRlSGFuZGxlAFIAQ2xvc2VIYW5kbGUAS0VSTkVMMzIuZGxsAABFAVN0clN0cklXAABTSExXQVBJLmRsbADXAkhlYXBGcmVlAADTAkhlYXBBbGxvYwDyAEVudGVyQ3JpdGljYWxTZWN0aW9uAAA7A0xlYXZlQ3JpdGljYWxTZWN0aW9uAABwAkdldFN0cmluZ1R5cGVXAACMAUdldENvbW1hbmRMaW5lQQDOBFRlcm1pbmF0ZVByb2Nlc3MAAOIEVW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyAACzBFNldFVuaGFuZGxlZEV4Y2VwdGlvbkZpbHRlcgACA0lzRGVidWdnZXJQcmVzZW50ACYEUnRsVmlydHVhbFVud2luZAAAHwRSdGxMb29rdXBGdW5jdGlvbkVudHJ5AAAYBFJ0bENhcHR1cmVDb250ZXh0ACUEUnRsVW53aW5kRXgA6wJJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uQW5kU3BpbkNvdW50AO4ARW5jb2RlUG9pbnRlcgDLAERlY29kZVBvaW50ZXIA2wJIZWFwU2V0SW5mb3JtYXRpb24AAKoCR2V0VmVyc2lvbgAA1QJIZWFwQ3JlYXRlAABMAkdldFByb2NBZGRyZXNzAAAeAkdldE1vZHVsZUhhbmRsZVcAADQFV3JpdGVGaWxlAHwEU2V0SGFuZGxlQ291bnQAAPoBR2V0RmlsZVR5cGUAagJHZXRTdGFydHVwSW5mb1cA0gBEZWxldGVDcml0aWNhbFNlY3Rpb24AwARTbGVlcADDA1JlYWRGaWxlAAB0BFNldEZpbGVQb2ludGVyAAAZAkdldE1vZHVsZUZpbGVOYW1lQQAAZwFGcmVlRW52aXJvbm1lbnRTdHJpbmdzVwAgBVdpZGVDaGFyVG9NdWx0aUJ5dGUA4QFHZXRFbnZpcm9ubWVudFN0cmluZ3NXAABaAUZsc0dldFZhbHVlAFsBRmxzU2V0VmFsdWUAWQFGbHNGcmVlAIAEU2V0TGFzdEVycm9yAADLAUdldEN1cnJlbnRUaHJlYWRJZAAAWAFGbHNBbGxvYwAAqQNRdWVyeVBlcmZvcm1hbmNlQ291bnRlcgCaAkdldFRpY2tDb3VudAAAxwFHZXRDdXJyZW50UHJvY2Vzc0lkAIACR2V0U3lzdGVtVGltZUFzRmlsZVRpbWUAjwBDcmVhdGVGaWxlVwBBA0xvYWRMaWJyYXJ5VwAA2gJIZWFwUmVBbGxvYwCgAUdldENvbnNvbGVDUAAAsgFHZXRDb25zb2xlTW9kZQAAXQFGbHVzaEZpbGVCdWZmZXJzAAB4AUdldENQSW5mbwBuAUdldEFDUAAAPgJHZXRPRU1DUAAADANJc1ZhbGlkQ29kZVBhZ2UAlARTZXRTdGRIYW5kbGUAAGEEU2V0RW5kT2ZGaWxlAABRAkdldFByb2Nlc3NIZWFwAADcAkhlYXBTaXplAAAzBVdyaXRlQ29uc29sZVcALwNMQ01hcFN0cmluZ1cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgEgBQAEAAAAAAAAAAAAAAIBIAUABAAAAAQEAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAyot8tmSsAAM1dINJm1P//AAAAAAAAAAABAAAAFgAAAAIAAAACAAAAAwAAAAIAAAAEAAAAGAAAAAUAAAANAAAABgAAAAkAAAAHAAAADAAAAAgAAAAMAAAACQAAAAwAAAAKAAAABwAAAAsAAAAIAAAADAAAABYAAAANAAAAFgAAAA8AAAACAAAAEAAAAA0AAAARAAAAEgAAABIAAAACAAAAIQAAAA0AAAA1AAAAAgAAAEEAAAANAAAAQwAAAAIAAABQAAAAEQAAAFIAAAANAAAAUwAAAA0AAABXAAAAFgAAAFkAAAALAAAAbAAAAA0AAABtAAAAIAAAAHAAAAAcAAAAcgAAAAkAAAAGAAAAFgAAAIAAAAAKAAAAgQAAAAoAAACCAAAACQAAAIMAAAAWAAAAhAAAAA0AAACRAAAAKQAAAJ4AAAANAAAAoQAAAAIAAACkAAAACwAAAKcAAAANAAAAtwAAABEAAADOAAAAAgAAANcAAAALAAAAGAcAAAwAAAAMAAAACAAAAP//////////gAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgICAgICAgICAgICAgICAgMDAwMDAwMDAAAAAAAAAACY7gBAAQAAAIjuAEABAAAAAPAAQAEAAAAC8gBAAQAAAP////8AAAAAAAAAAAAAAAAsyQBAAQAAACzJAEABAAAALMkAQAEAAAAsyQBAAQAAACzJAEABAAAALMkAQAEAAAAsyQBAAQAAACzJAEAB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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAMAAwAAACgAAIAOAAAAcAAAgBgAAACIAACAAAAAAAAAAAAEAAAAAAAHAAEAAACgAACAAgAAALgAAIADAAAA0AAAgAQAAADoAACABQAAAAABAIAGAAAAGAEAgAcAAAAwAQCAAAAAAAAAAAAEAAAAAAABAGUAAABIAQCAAAAAAAAAAAAEAAAAAAABAAEAAABgAQCAAAAAAAAAAAAEAAAAAAABAAAAAAB4AQAAAAAAAAAAAAAEAAAAAAABAAAAAACIAQAAAAAAAAAAAAAEAAAAAAABAAAAAACYAQAAAAAAAAAAAAAEAAAAAAABAAAAAACoAQAAAAAAAAAAAAAEAAAAAAABAAAAAAC4AQAAAAAAAAAAAAAEAAAAAAABAAAAAADIAQAAAAAAAAAAAAAEAAAAAAABAAAAAADYAQAAAAAAAAAAAAAEAAAAAAABAAAAAADoAQAAAAAAAAAAAAAEAAAAAAABAAkEAAD4AQAACHIBAOgCAADkBAAAAAAAAPB0AQAoAQAA5AQAAAAAAAAYdgEAqAgAAOQEAAAAAAAAwH4BAGgFAADkBAAAAAAAACiEAQCoJQAA5AQAAAAAAADQqQEAqBAAAOQEAAAAAAAAeLoBAGgEAADkBAAAAAAAAOC+AQBoAAAA5AQAAAAAAABI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AAAAAAAAGfj4+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+Q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AAAA////gf///8n////2////////////////////9v///8j///+BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAABghISEwXFxcSmVlZVE2NjZENTU1QQAAADAAAAAkAAAAFQAAAAoAAAACAAAAAP///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//2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///////////////////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+DQo8L2Fzc2VtYmx5PlBBUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFEAOAAAEQAAACgoqiisKK4otCi2KIgoyijaKx4rIismKyorLisyKzYrOis+KwIrRitKK04rUitWK1orXitiK2YraituK0AIAEAgAAAAACgEKDwqPioAKkIqSCpKKkwqTipQKlIqVCpWKlgqWipoK2wrriuwK7IrtCu2K7gruiu8K74rgCvCK8QrxivIK8orzCvOK9Ar0ivUK9Yr2CvaK9wr3ivgK+Ir5CvmK+gr6ivsK+4r8CvyK/Qr9iv4K/or/Cv+K8AAAAwAQCgAAAAAKAYoCCgKKAwoDigQKBIoFCgWKBgoGigcKB4oICgiKCQoJigoKCooLCguKDAoMig0KDYoOCg6KDwoPigAKEIoRChGKEgoSihMKE4oUChSKFQoVihYKFoodih+KEYojiiWKKYorCiuKLAosii0KLgoviiAKMIoxCjGKMgoyijMKM4o0CjSKNYo2CjaKNwo3ijgKOIo5CjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBLAwQUAAAAAAAAACEAN9gBJf/OAAD/zgAAOAAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvZGlzdGxpYi91dGlsLnB5IwojIENvcHlyaWdodCAoQykgMjAxMi0yMDE2IFRoZSBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbi4KIyBTZWUgTElDRU5TRS50eHQgYW5kIENPTlRSSUJVVE9SUy50eHQuCiMKaW1wb3J0IGNvZGVjcwpmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBkZXF1ZQppbXBvcnQgY29udGV4dGxpYgppbXBvcnQgY3N2CmZyb20gZ2xvYiBpbXBvcnQgaWdsb2IgYXMgc3RkX2lnbG9iCmltcG9ydCBpbwppbXBvcnQganNvbgppbXBvcnQgbG9nZ2luZwppbXBvcnQgb3MKaW1wb3J0IHB5X2NvbXBpbGUKaW1wb3J0IHJlCmltcG9ydCBzaHV0aWwKaW1wb3J0IHNvY2tldAp0cnk6CiAgICBpbXBvcnQgc3NsCmV4Y2VwdCBJbXBvcnRFcnJvcjogICMgcHJhZ21hOiBubyBjb3ZlcgogICAgc3NsID0gTm9uZQppbXBvcnQgc3VicHJvY2VzcwppbXBvcnQgc3lzCmltcG9ydCB0YXJmaWxlCmltcG9ydCB0ZW1wZmlsZQppbXBvcnQgdGV4dHdyYXAKCnRyeToKICAgIGltcG9ydCB0aHJlYWRpbmcKZXhjZXB0IEltcG9ydEVycm9yOiAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICBpbXBvcnQgZHVtbXlfdGhyZWFkaW5nIGFzIHRocmVhZGluZwppbXBvcnQgdGltZQoKZnJvbSAuIGltcG9ydCBEaXN0bGliRXhjZXB0aW9uCmZyb20gLmNvbXBhdCBpbXBvcnQgKHN0cmluZ190eXBlcywgdGV4dF90eXBlLCBzaHV0aWwsIHJhd19pbnB1dCwgU3RyaW5nSU8sCiAgICAgICAgICAgICAgICAgICAgIGNhY2hlX2Zyb21fc291cmNlLCB1cmxvcGVuLCB1cmxqb2luLCBodHRwbGliLCB4bWxycGNsaWIsCiAgICAgICAgICAgICAgICAgICAgIHNwbGl0dHlwZSwgSFRUUEhhbmRsZXIsIEJhc2VDb25maWd1cmF0b3IsIHZhbGlkX2lkZW50LAogICAgICAgICAgICAgICAgICAgICBDb250YWluZXIsIGNvbmZpZ3BhcnNlciwgVVJMRXJyb3IsIFppcEZpbGUsIGZzZGVjb2RlLAogICAgICAgICAgICAgICAgICAgICB1bnF1b3RlKQoKbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgojCiMgUmVxdWlyZW1lbnQgcGFyc2luZyBjb2RlIGZvciBuYW1lICsgb3B0aW9uYWwgY29uc3RyYWludHMgKyBvcHRpb25hbCBleHRyYXMKIwojIGUuZy4gJ2ZvbyA+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+IDE6CiAgICAgICAgYXNzZXJ0IGxlbihyaWNoX3BhdGhfZ2xvYikgPT0gMywgcmljaF9wYXRoX2dsb2IKICAgICAgICBwcmVmaXgsIHNldCwgc3VmZml4ID0gcmljaF9wYXRoX2dsb2IKICAgICAgICBmb3IgaXRlbSBpbiBzZXQuc3BsaXQoJywnKToKICAgICAgICAgICAgZm9yIHBhdGggaW4gX2lnbG9iKCcnLmpvaW4oKHByZWZpeCwgaXRlbSwgc3VmZml4KSkpOgogICAgICAgICAgICAgICAgeWllbGQgcGF0aAogICAgZWxzZToKICAgICAgICBpZiAnKionIG5vdCBpbiBwYXRoX2dsb2I6CiAgICAgICAgICAgIGZvciBpdGVtIGluIHN0ZF9pZ2xvYihwYXRoX2dsb2IpOgogICAgICAgICAgICAgICAgeWllbGQgaXRlbQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHByZWZpeCwgcmFkaWNhbCA9IHBhdGhfZ2xvYi5zcGxpdCgnKionLCAxKQogICAgICAgICAgICBpZiBwcmVmaXggPT0gJyc6CiAgICAgICAgICAgICAgICBwcmVmaXggPSAnLicKICAgICAgICAgICAgaWYgcmFkaWNhbCA9PSAnJzoKICAgICAgICAgICAgICAgIHJhZGljYWwgPSAnKicKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgd2Ugc3VwcG9ydCBib3RoCiAgICAgICAgICAgICAgICByYWRpY2FsID0gcmFkaWNhbC5sc3RyaXAoJy8nKQogICAgICAgICAgICAgICAgcmFkaWNhbCA9IHJhZGljYWwubHN0cmlwKCdcXCcpCiAgICAgICAgICAgIGZvciBwYXRoLCBkaXIsIGZpbGVzIGluIG9zLndhbGsocHJlZml4KToKICAgICAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLm5vcm1wYXRoKHBhdGgpCiAgICAgICAgICAgICAgICBmb3IgZm4gaW4gX2lnbG9iKG9zLnBhdGguam9pbihwYXRoLCByYWRpY2FsKSk6CiAgICAgICAgICAgICAgICAgICAgeWllbGQgZm4KCmlmIHNzbDoKICAgIGZyb20gLmNvbXBhdCBpbXBvcnQgKEhUVFBTSGFuZGxlciBhcyBCYXNlSFRUUFNIYW5kbGVyLCBtYXRjaF9ob3N0bmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgIENlcnRpZmljYXRlRXJyb3IpCgoKIwojIEhUVFBTQ29ubmVjdGlvbiB3aGljaCB2ZXJpZmllcyBjZXJ0aWZpY2F0ZXMvbWF0Y2hlcyBkb21haW5zCiMKCiAgICBjbGFzcyBIVFRQU0Nvbm5lY3Rpb24oaHR0cGxpYi5IVFRQU0Nvbm5lY3Rpb24pOgogICAgICAgIGNhX2NlcnRzID0gTm9uZSAjIHNldCB0aGlzIHRvIHRoZSBwYXRoIHRvIHRoZSBjZXJ0cyBmaWxlICgucGVtKQogICAgICAgIGNoZWNrX2RvbWFpbiA9IFRydWUgIyBvbmx5IHVzZWQgaWYgY2FfY2VydHMgaXMgbm90IE5vbmUKCiAgICAgICAgIyBub2luc3BlY3Rpb24gUHlQcm9wZXJ0eUFjY2VzcwogICAgICAgIGRlZiBjb25uZWN0KHNlbGYpOgogICAgICAgICAgICBzb2NrID0gc29ja2V0LmNyZWF0ZV9jb25uZWN0aW9uKChzZWxmLmhvc3QsIHNlbGYucG9ydCksIHNlbGYudGltZW91dCkKICAgICAgICAgICAgaWYgZ2V0YXR0cihzZWxmLCAnX3R1bm5lbF9ob3N0JywgRmFsc2UpOgogICAgICAgICAgICAgICAgc2VsZi5zb2NrID0gc29jawogICAgICAgICAgICAgICAgc2VsZi5fdHVubmVsKCkKCiAgICAgICAgICAgIGlmIG5vdCBoYXNhdHRyKHNzbCwgJ1NTTENvbnRleHQnKToKICAgICAgICAgICAgICAgICMgRm9yIDIueAogICAgICAgICAgICAgICAgaWYgc2VsZi5jYV9jZXJ0czoKICAgICAgICAgICAgICAgICAgICBjZXJ0X3JlcXMgPSBzc2wuQ0VSVF9SRVFVSVJFRAogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBjZXJ0X3JlcXMgPSBzc2wuQ0VSVF9OT05FCiAgICAgICAgICAgICAgICBzZWxmLnNvY2sgPSBzc2wud3JhcF9zb2NrZXQoc29jaywgc2VsZi5rZXlfZmlsZSwgc2VsZi5jZXJ0X2ZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9yZXFzPWNlcnRfcmVxcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2xfdmVyc2lvbj1zc2wuUFJPVE9DT0xfU1NMdjIzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhX2NlcnRzPXNlbGYuY2FfY2VydHMpCiAgICAgICAgICAgIGVsc2U6ICAjIHByYWdtYTogbm8gY292ZXIKICAgICAgICAgICAgICAgIGNvbnRleHQgPSBzc2wuU1NMQ29udGV4dChzc2wuUFJPVE9DT0xfU1NMdjIzKQogICAgICAgICAgICAgICAgY29udGV4dC5vcHRpb25zIHw9IHNzbC5PUF9OT19TU0x2MgogICAgICAgICAgICAgICAgaWYgc2VsZi5jZXJ0X2ZpbGU6CiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5sb2FkX2NlcnRfY2hhaW4oc2VsZi5jZXJ0X2ZpbGUsIHNlbGYua2V5X2ZpbGUpCiAgICAgICAgICAgICAgICBrd2FyZ3MgPSB7fQogICAgICAgICAgICAgICAgaWYgc2VsZi5jYV9jZXJ0czoKICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnZlcmlmeV9tb2RlID0gc3NsLkNFUlRfUkVRVUlSRUQKICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmxvYWRfdmVyaWZ5X2xvY2F0aW9ucyhjYWZpbGU9c2VsZi5jYV9jZXJ0cykKICAgICAgICAgICAgICAgICAgICBpZiBnZXRhdHRyKHNzbCwgJ0hBU19TTkknLCBGYWxzZSk6CiAgICAgICAgICAgICAgICAgICAgICAgIGt3YXJnc1snc2VydmVyX2hvc3RuYW1lJ10gPSBzZWxmLmhvc3QKICAgICAgICAgICAgICAgIHNlbGYuc29jayA9IGNvbnRleHQud3JhcF9zb2NrZXQoc29jaywgKiprd2FyZ3MpCiAgICAgICAgICAgIGlmIHNlbGYuY2FfY2VydHMgYW5kIHNlbGYuY2hlY2tfZG9tYWluOgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIG1hdGNoX2hvc3RuYW1lKHNlbGYuc29jay5nZXRwZWVyY2VydCgpLCBzZWxmLmhvc3QpCiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdIb3N0IHZlcmlmaWVkOiAlcycsIHNlbGYuaG9zdCkKICAgICAgICAgICAgICAgIGV4Y2VwdCBDZXJ0aWZpY2F0ZUVycm9yOiAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICAgICAgICAgICAgICAgICAgc2VsZi5zb2NrLnNodXRkb3duKHNvY2tldC5TSFVUX1JEV1IpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5zb2NrLmNsb3NlKCkKICAgICAgICAgICAgICAgICAgICByYWlzZQoKICAgIGNsYXNzIEhUVFBTSGFuZGxlcihCYXNlSFRUUFNIYW5kbGVyKToKICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgY2FfY2VydHMsIGNoZWNrX2RvbWFpbj1UcnVlKToKICAgICAgICAgICAgQmFzZUhUVFBTSGFuZGxlci5fX2luaXRfXyhzZWxmKQogICAgICAgICAgICBzZWxmLmNhX2NlcnRzID0gY2FfY2VydHMKICAgICAgICAgICAgc2VsZi5jaGVja19kb21haW4gPSBjaGVja19kb21haW4KCiAgICAgICAgZGVmIF9jb25uX21ha2VyKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgICAgICIiIgogICAgICAgICAgICBUaGlzIGlzIGNhbGxlZCB0byBjcmVhdGUgYSBjb25uZWN0aW9uIGluc3RhbmNlLiBOb3JtYWxseSB5b3UnZAogICAgICAgICAgICBwYXNzIGEgY29ubmVjdGlvbiBjbGFzcyB0byBkb19vcGVuLCBidXQgaXQgZG9lc24ndCBhY3R1YWxseSBjaGVjayBmb3IKICAgICAgICAgICAgYSBjbGFzcywgYW5kIGp1c3QgZXhwZWN0cyBhIGNhbGxhYmxlLiBBcyBsb25nIGFzIHdlIGJlaGF2ZSBqdXN0IGFzIGEKICAgICAgICAgICAgY29uc3RydWN0b3Igd291bGQgaGF2ZSwgd2Ugc2hvdWxkIGJlIE9LLiBJZiBpdCBldmVyIGNoYW5nZXMgc28gdGhhdAogICAgICAgICAgICB3ZSAqbXVzdCogcGFzcyBhIGNsYXNzLCB3ZSdsbCBjcmVhdGUgYW4gVW5zYWZlSFRUUFNDb25uZWN0aW9uIGNsYXNzCiAgICAgICAgICAgIHdoaWNoIGp1c3Qgc2V0cyBjaGVja19kb21haW4gdG8gRmFsc2UgaW4gdGhlIGNsYXNzIGRlZmluaXRpb24sIGFuZAogICAgICAgICAgICBjaG9vc2Ugd2hpY2ggb25lIHRvIHBhc3MgdG8gZG9fb3Blbi4KICAgICAgICAgICAgIiIiCiAgICAgICAgICAgIHJlc3VsdCA9IEhUVFBTQ29ubmVjdGlvbigqYXJncywgKiprd2FyZ3MpCiAgICAgICAgICAgIGlmIHNlbGYuY2FfY2VydHM6CiAgICAgICAgICAgICAgICByZXN1bHQuY2FfY2VydHMgPSBzZWxmLmNhX2NlcnRzCiAgICAgICAgICAgICAgICByZXN1bHQuY2hlY2tfZG9tYWluID0gc2VsZi5jaGVja19kb21haW4KICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgICAgICBkZWYgaHR0cHNfb3BlbihzZWxmLCByZXEpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5kb19vcGVuKHNlbGYuX2Nvbm5fbWFrZXIsIHJlcSkKICAgICAgICAgICAgZXhjZXB0IFVSTEVycm9yIGFzIGU6CiAgICAgICAgICAgICAgICBpZiAnY2VydGlmaWNhdGUgdmVyaWZ5IGZhaWxlZCcgaW4gc3RyKGUucmVhc29uKToKICAgICAgICAgICAgICAgICAgICByYWlzZSBDZXJ0aWZpY2F0ZUVycm9yKCdVbmFibGUgdG8gdmVyaWZ5IHNlcnZlciBjZXJ0aWZpY2F0ZSAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9yICVzJyAlIHJlcS5ob3N0KQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICByYWlzZQoKICAgICMKICAgICMgVG8gcHJldmVudCBhZ2FpbnN0IG1peGluZyBIVFRQIHRyYWZmaWMgd2l0aCBIVFRQUyAoZXhhbXBsZXM6IEEgTWFuLUluLVRoZS0KICAgICMgTWlkZGxlIHByb3h5IHVzaW5nIEhUVFAgbGlzdGVucyBvbiBwb3J0IDQ0Mywgb3IgYW4gaW5kZXggbWlzdGFrZW5seSBzZXJ2ZXMKICAgICMgSFRNTCBjb250YWluaW5nIGEgaHR0cDovL3h5eiBsaW5rIHdoZW4gaXQgc2hvdWxkIGJlIGh0dHBzOi8veHl6KSwKICAgICMgeW91IGNhbiB1c2UgdGhlIGZvbGxvd2luZyBoYW5kbGVyIGNsYXNzLCB3aGljaCBkb2VzIG5vdCBhbGxvdyBIVFRQIHRyYWZmaWMuCiAgICAjCiAgICAjIEl0IHdvcmtzIGJ5IGluaGVyaXRpbmcgZnJvbSBIVFRQSGFuZGxlciAtIHNvIGJ1aWxkX29wZW5lciB3b24ndCBhZGQgYQogICAgIyBoYW5kbGVyIGZvciBIVFRQIGl0c2VsZi4KICAgICMKICAgIGNsYXNzIEhUVFBTT25seUhhbmRsZXIoSFRUUFNIYW5kbGVyLCBIVFRQSGFuZGxlcik6CiAgICAgICAgZGVmIGh0dHBfb3BlbihzZWxmLCByZXEpOgogICAgICAgICAgICByYWlzZSBVUkxFcnJvcignVW5leHBlY3RlZCBIVFRQIHJlcXVlc3Qgb24gd2hhdCBzaG91bGQgYmUgYSBzZWN1cmUgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAnY29ubmVjdGlvbjogJXMnICUgcmVxKQoKIwojIFhNTC1SUEMgd2l0aCB0aW1lb3V0cwojCgpfdmVyX2luZm8gPSBzeXMudmVyc2lvbl9pbmZvWzoyXQoKaWYgX3Zlcl9pbmZvID09ICgyLCA2KToKICAgIGNsYXNzIEhUVFAoaHR0cGxpYi5IVFRQKToKICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgaG9zdD0nJywgcG9ydD1Ob25lLCAqKmt3YXJncyk6CiAgICAgICAgICAgIGlmIHBvcnQgPT0gMDogICAjIDAgbWVhbnMgdXNlIHBvcnQgMCwgbm90IHRoZSBkZWZhdWx0IHBvcnQKICAgICAgICAgICAgICAgIHBvcnQgPSBOb25lCiAgICAgICAgICAgIHNlbGYuX3NldHVwKHNlbGYuX2Nvbm5lY3Rpb25fY2xhc3MoaG9zdCwgcG9ydCwgKiprd2FyZ3MpKQoKCiAgICBpZiBzc2w6CiAgICAgICAgY2xhc3MgSFRUUFMoaHR0cGxpYi5IVFRQUyk6CiAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0PScnLCBwb3J0PU5vbmUsICoqa3dhcmdzKToKICAgICAgICAgICAgICAgIGlmIHBvcnQgPT0gMDogICAjIDAgbWVhbnMgdXNlIHBvcnQgMCwgbm90IHRoZSBkZWZhdWx0IHBvcnQKICAgICAgICAgICAgICAgICAgICBwb3J0ID0gTm9uZQogICAgICAgICAgICAgICAgc2VsZi5fc2V0dXAoc2VsZi5fY29ubmVjdGlvbl9jbGFzcyhob3N0LCBwb3J0LCAqKmt3YXJncykpCgoKY2xhc3MgVHJhbnNwb3J0KHhtbHJwY2xpYi5UcmFuc3BvcnQpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHRpbWVvdXQsIHVzZV9kYXRldGltZT0wKToKICAgICAgICBzZWxmLnRpbWVvdXQgPSB0aW1lb3V0CiAgICAgICAgeG1scnBjbGliLlRyYW5zcG9ydC5fX2luaXRfXyhzZWxmLCB1c2VfZGF0ZXRpbWUpCgogICAgZGVmIG1ha2VfY29ubmVjdGlvbihzZWxmLCBob3N0KToKICAgICAgICBoLCBlaCwgeDUwOSA9IHNlbGYuZ2V0X2hvc3RfaW5mbyhob3N0KQogICAgICAgIGlmIF92ZXJfaW5mbyA9PSAoMiwgNik6CiAgICAgICAgICAgIHJlc3VsdCA9IEhUVFAoaCwgdGltZW91dD1zZWxmLnRpbWVvdXQpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaWYgbm90IHNlbGYuX2Nvbm5lY3Rpb24gb3IgaG9zdCAhPSBzZWxmLl9jb25uZWN0aW9uWzBdOgogICAgICAgICAgICAgICAgc2VsZi5fZXh0cmFfaGVhZGVycyA9IGVoCiAgICAgICAgICAgICAgICBzZWxmLl9jb25uZWN0aW9uID0gaG9zdCwgaHR0cGxpYi5IVFRQQ29ubmVjdGlvbihoKQogICAgICAgICAgICByZXN1bHQgPSBzZWxmLl9jb25uZWN0aW9uWzFdCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKaWYgc3NsOgogICAgY2xhc3MgU2FmZVRyYW5zcG9ydCh4bWxycGNsaWIuU2FmZVRyYW5zcG9ydCk6CiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRpbWVvdXQsIHVzZV9kYXRldGltZT0wKToKICAgICAgICAgICAgc2VsZi50aW1lb3V0ID0gdGltZW91dAogICAgICAgICAgICB4bWxycGNsaWIuU2FmZVRyYW5zcG9ydC5fX2luaXRfXyhzZWxmLCB1c2VfZGF0ZXRpbWUpCgogICAgICAgIGRlZiBtYWtlX2Nvbm5lY3Rpb24oc2VsZiwgaG9zdCk6CiAgICAgICAgICAgIGgsIGVoLCBrd2FyZ3MgPSBzZWxmLmdldF9ob3N0X2luZm8oaG9zdCkKICAgICAgICAgICAgaWYgbm90IGt3YXJnczoKICAgICAgICAgICAgICAgIGt3YXJncyA9IHt9CiAgICAgICAgICAgIGt3YXJnc1sndGltZW91dCddID0gc2VsZi50aW1lb3V0CiAgICAgICAgICAgIGlmIF92ZXJfaW5mbyA9PSAoMiwgNik6CiAgICAgICAgICAgICAgICByZXN1bHQgPSBIVFRQUyhob3N0LCBOb25lLCAqKmt3YXJncykKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9jb25uZWN0aW9uIG9yIGhvc3QgIT0gc2VsZi5fY29ubmVjdGlvblswXToKICAgICAgICAgICAgICAgICAgICBzZWxmLl9leHRyYV9oZWFkZXJzID0gZWgKICAgICAgICAgICAgICAgICAgICBzZWxmLl9jb25uZWN0aW9uID0gaG9zdCwgaHR0cGxpYi5IVFRQU0Nvbm5lY3Rpb24oaCwgTm9uZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiprd2FyZ3MpCiAgICAgICAgICAgICAgICByZXN1bHQgPSBzZWxmLl9jb25uZWN0aW9uWzFdCiAgICAgICAgICAgIHJldHVybiByZXN1bHQKCgpjbGFzcyBTZXJ2ZXJQcm94eSh4bWxycGNsaWIuU2VydmVyUHJveHkpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHVyaSwgKiprd2FyZ3MpOgogICAgICAgIHNlbGYudGltZW91dCA9IHRpbWVvdXQgPSBrd2FyZ3MucG9wKCd0aW1lb3V0JywgTm9uZSkKICAgICAgICAjIFRoZSBhYm92ZSBjbGFzc2VzIG9ubHkgY29tZSBpbnRvIHBsYXkgaWYgYSB0aW1lb3V0CiAgICAgICAgIyBpcyBzcGVjaWZpZWQKICAgICAgICBpZiB0aW1lb3V0IGlzIG5vdCBOb25lOgogICAgICAgICAgICBzY2hlbWUsIF8gPSBzcGxpdHR5cGUodXJpKQogICAgICAgICAgICB1c2VfZGF0ZXRpbWUgPSBrd2FyZ3MuZ2V0KCd1c2VfZGF0ZXRpbWUnLCAwKQogICAgICAgICAgICBpZiBzY2hlbWUgPT0gJ2h0dHBzJzoKICAgICAgICAgICAgICAgIHRjbHMgPSBTYWZlVHJhbnNwb3J0CiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICB0Y2xzID0gVHJhbnNwb3J0CiAgICAgICAgICAgIGt3YXJnc1sndHJhbnNwb3J0J10gPSB0ID0gdGNscyh0aW1lb3V0LCB1c2VfZGF0ZXRpbWU9dXNlX2RhdGV0aW1lKQogICAgICAgICAgICBzZWxmLnRyYW5zcG9ydCA9IHQKICAgICAgICB4bWxycGNsaWIuU2VydmVyUHJveHkuX19pbml0X18oc2VsZiwgdXJpLCAqKmt3YXJncykKCiMKIyBDU1YgZnVuY3Rpb25hbGl0eS4gVGhpcyBpcyBwcm92aWRlZCBiZWNhdXNlIG9uIDIueCwgdGhlIGNzdiBtb2R1bGUgY2FuJ3QKIyBoYW5kbGUgVW5pY29kZS4gSG93ZXZlciwgd2UgbmVlZCB0byBkZWFsIHdpdGggVW5pY29kZSBpbiBlLmcuIFJFQ09SRCBmaWxlcy4KIwoKZGVmIF9jc3Zfb3BlbihmbiwgbW9kZSwgKiprd2FyZ3MpOgogICAgaWYgc3lzLnZlcnNpb25faW5mb1swXSA8IDM6CiAgICAgICAgbW9kZSArPSAnYicKICAgIGVsc2U6CiAgICAgICAga3dhcmdzWyduZXdsaW5lJ10gPSAnJwogICAgcmV0dXJuIG9wZW4oZm4sIG1vZGUsICoqa3dhcmdzKQoKCmNsYXNzIENTVkJhc2Uob2JqZWN0KToKICAgIGRlZmF1bHRzID0gewogICAgICAgICdkZWxpbWl0ZXInOiBzdHIoJywnKSwgICAgICAjIFRoZSBzdHJzIGFyZSB1c2VkIGJlY2F1c2Ugd2UgbmVlZCBuYXRpdmUKICAgICAgICAncXVvdGVjaGFyJzogc3RyKCciJyksICAgICAgIyBzdHIgaW4gdGhlIGNzdiBBUEkgKDIueCB3b24ndCB0YWtlCiAgICAgICAgJ2xpbmV0ZXJtaW5hdG9yJzogc3RyKCdcbicpICMgVW5pY29kZSkKICAgIH0KCiAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIF9fZXhpdF9fKHNlbGYsICpleGNfaW5mbyk6CiAgICAgICAgc2VsZi5zdHJlYW0uY2xvc2UoKQoKCmNsYXNzIENTVlJlYWRlcihDU1ZCYXNlKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqKmt3YXJncyk6CiAgICAgICAgaWYgJ3N0cmVhbScgaW4ga3dhcmdzOgogICAgICAgICAgICBzdHJlYW0gPSBrd2FyZ3NbJ3N0cmVhbSddCiAgICAgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPj0gMzoKICAgICAgICAgICAgICAgICMgbmVlZHMgdG8gYmUgYSB0ZXh0IHN0cmVhbQogICAgICAgICAgICAgICAgc3RyZWFtID0gY29kZWNzLmdldHJlYWRlcigndXRmLTgnKShzdHJlYW0pCiAgICAgICAgICAgIHNlbGYuc3RyZWFtID0gc3RyZWFtCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5zdHJlYW0gPSBfY3N2X29wZW4oa3dhcmdzWydwYXRoJ10sICdyJykKICAgICAgICBzZWxmLnJlYWRlciA9IGNzdi5yZWFkZXIoc2VsZi5zdHJlYW0sICoqc2VsZi5kZWZhdWx0cykKCiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgbmV4dChzZWxmKToKICAgICAgICByZXN1bHQgPSBuZXh0KHNlbGYucmVhZGVyKQogICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPCAzOgogICAgICAgICAgICBmb3IgaSwgaXRlbSBpbiBlbnVtZXJhdGUocmVzdWx0KToKICAgICAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGl0ZW0sIHRleHRfdHlwZSk6CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2ldID0gaXRlbS5kZWNvZGUoJ3V0Zi04JykKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgX19uZXh0X18gPSBuZXh0CgpjbGFzcyBDU1ZXcml0ZXIoQ1NWQmFzZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgZm4sICoqa3dhcmdzKToKICAgICAgICBzZWxmLnN0cmVhbSA9IF9jc3Zfb3BlbihmbiwgJ3cnKQogICAgICAgIHNlbGYud3JpdGVyID0gY3N2LndyaXRlcihzZWxmLnN0cmVhbSwgKipzZWxmLmRlZmF1bHRzKQoKICAgIGRlZiB3cml0ZXJvdyhzZWxmLCByb3cpOgogICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPCAzOgogICAgICAgICAgICByID0gW10KICAgICAgICAgICAgZm9yIGl0ZW0gaW4gcm93OgogICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShpdGVtLCB0ZXh0X3R5cGUpOgogICAgICAgICAgICAgICAgICAgIGl0ZW0gPSBpdGVtLmVuY29kZSgndXRmLTgnKQogICAgICAgICAgICAgICAgci5hcHBlbmQoaXRlbSkKICAgICAgICAgICAgcm93ID0gcgogICAgICAgIHNlbGYud3JpdGVyLndyaXRlcm93KHJvdykKCiMKIyAgIENvbmZpZ3VyYXRvciBmdW5jdGlvbmFsaXR5CiMKCmNsYXNzIENvbmZpZ3VyYXRvcihCYXNlQ29uZmlndXJhdG9yKToKCiAgICB2YWx1ZV9jb252ZXJ0ZXJzID0gZGljdChCYXNlQ29uZmlndXJhdG9yLnZhbHVlX2NvbnZlcnRlcnMpCiAgICB2YWx1ZV9jb252ZXJ0ZXJzWydpbmMnXSA9ICdpbmNfY29udmVydCcKCiAgICBkZWYgX19pbml0X18oc2VsZiwgY29uZmlnLCBiYXNlPU5vbmUpOgogICAgICAgIHN1cGVyKENvbmZpZ3VyYXRvciwgc2VsZikuX19pbml0X18oY29uZmlnKQogICAgICAgIHNlbGYuYmFzZSA9IGJhc2Ugb3Igb3MuZ2V0Y3dkKCkKCiAgICBkZWYgY29uZmlndXJlX2N1c3RvbShzZWxmLCBjb25maWcpOgogICAgICAgIGRlZiBjb252ZXJ0KG8pOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKG8sIChsaXN0LCB0dXBsZSkpOgogICAgICAgICAgICAgICAgcmVzdWx0ID0gdHlwZShvKShbY29udmVydChpKSBmb3IgaSBpbiBvXSkKICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKG8sIGRpY3QpOgogICAgICAgICAgICAgICAgaWYgJygpJyBpbiBvOgogICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuY29uZmlndXJlX2N1c3RvbShvKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB7fQogICAgICAgICAgICAgICAgICAgIGZvciBrIGluIG86CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtrXSA9IGNvbnZlcnQob1trXSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuY29udmVydChvKQogICAgICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgICAgIGMgPSBjb25maWcucG9wKCcoKScpCiAgICAgICAgaWYgbm90IGNhbGxhYmxlKGMpOgogICAgICAgICAgICBjID0gc2VsZi5yZXNvbHZlKGMpCiAgICAgICAgcHJvcHMgPSBjb25maWcucG9wKCcuJywgTm9uZSkKICAgICAgICAjIENoZWNrIGZvciB2YWxpZCBpZGVudGlmaWVycwogICAgICAgIGFyZ3MgPSBjb25maWcucG9wKCdbXScsICgpKQogICAgICAgIGlmIGFyZ3M6CiAgICAgICAgICAgIGFyZ3MgPSB0dXBsZShbY29udmVydChvKSBmb3IgbyBpbiBhcmdzXSkKICAgICAgICBpdGVtcyA9IFsoaywgY29udmVydChjb25maWdba10pKSBmb3IgayBpbiBjb25maWcgaWYgdmFsaWRfaWRlbnQoayldCiAgICAgICAga3dhcmdzID0gZGljdChpdGVtcykKICAgICAgICByZXN1bHQgPSBjKCphcmdzLCAqKmt3YXJncykKICAgICAgICBpZiBwcm9wczoKICAgICAgICAgICAgZm9yIG4sIHYgaW4gcHJvcHMuaXRlbXMoKToKICAgICAgICAgICAgICAgIHNldGF0dHIocmVzdWx0LCBuLCBjb252ZXJ0KHYpKQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKICAgICAgICByZXN1bHQgPSBzZWxmLmNvbmZpZ1trZXldCiAgICAgICAgaWYgaXNpbnN0YW5jZShyZXN1bHQsIGRpY3QpIGFuZCAnKCknIGluIHJlc3VsdDoKICAgICAgICAgICAgc2VsZi5jb25maWdba2V5XSA9IHJlc3VsdCA9IHNlbGYuY29uZmlndXJlX2N1c3RvbShyZXN1bHQpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBpbmNfY29udmVydChzZWxmLCB2YWx1ZSk6CiAgICAgICAgIiIiRGVmYXVsdCBjb252ZXJ0ZXIgZm9yIHRoZSBpbmM6Ly8gcHJvdG9jb2wuIiIiCiAgICAgICAgaWYgbm90IG9zLnBhdGguaXNhYnModmFsdWUpOgogICAgICAgICAgICB2YWx1ZSA9IG9zLnBhdGguam9pbihzZWxmLmJhc2UsIHZhbHVlKQogICAgICAgIHdpdGggY29kZWNzLm9wZW4odmFsdWUsICdyJywgZW5jb2Rpbmc9J3V0Zi04JykgYXMgZjoKICAgICAgICAgICAgcmVzdWx0ID0ganNvbi5sb2FkKGYpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKIwojIE1peGluIGZvciBydW5uaW5nIHN1YnByb2Nlc3NlcyBhbmQgY2FwdHVyaW5nIHRoZWlyIG91dHB1dAojCgpjbGFzcyBTdWJwcm9jZXNzTWl4aW4ob2JqZWN0KToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2ZXJib3NlPUZhbHNlLCBwcm9ncmVzcz1Ob25lKToKICAgICAgICBzZWxmLnZlcmJvc2UgPSB2ZXJib3NlCiAgICAgICAgc2VsZi5wcm9ncmVzcyA9IHByb2dyZXNzCgogICAgZGVmIHJlYWRlcihzZWxmLCBzdHJlYW0sIGNvbnRleHQpOgogICAgICAgICIiIgogICAgICAgIFJlYWQgbGluZXMgZnJvbSBhIHN1YnByb2Nlc3MnIG91dHB1dCBzdHJlYW0gYW5kIGVpdGhlciBwYXNzIHRvIGEgcHJvZ3Jlc3MKICAgICAgICBjYWxsYWJsZSAoaWYgc3BlY2lmaWVkKSBvciB3cml0ZSBwcm9ncmVzcyBpbmZvcm1hdGlvbiB0byBzeXMuc3RkZXJyLgogICAgICAgICIiIgogICAgICAgIHByb2dyZXNzID0gc2VsZi5wcm9ncmVzcwogICAgICAgIHZlcmJvc2UgPSBzZWxmLnZlcmJvc2UKICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICBzID0gc3RyZWFtLnJlYWRsaW5lKCkKICAgICAgICAgICAgaWYgbm90IHM6CiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBpZiBwcm9ncmVzcyBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIHByb2dyZXNzKHMsIGNvbnRleHQpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBpZiBub3QgdmVyYm9zZToKICAgICAgICAgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCcuJykKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZShzLmRlY29kZSgndXRmLTgnKSkKICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIuZmx1c2goKQogICAgICAgIHN0cmVhbS5jbG9zZSgpCgogICAgZGVmIHJ1bl9jb21tYW5kKHNlbGYsIGNtZCwgKiprd2FyZ3MpOgogICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKGNtZCwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFLCAqKmt3YXJncykKICAgICAgICB0MSA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXNlbGYucmVhZGVyLCBhcmdzPShwLnN0ZG91dCwgJ3N0ZG91dCcpKQogICAgICAgIHQxLnN0YXJ0KCkKICAgICAgICB0MiA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXNlbGYucmVhZGVyLCBhcmdzPShwLnN0ZGVyciwgJ3N0ZGVycicpKQogICAgICAgIHQyLnN0YXJ0KCkKICAgICAgICBwLndhaXQoKQogICAgICAgIHQxLmpvaW4oKQogICAgICAgIHQyLmpvaW4oKQogICAgICAgIGlmIHNlbGYucHJvZ3Jlc3MgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGYucHJvZ3Jlc3MoJ2RvbmUuJywgJ21haW4nKQogICAgICAgIGVsaWYgc2VsZi52ZXJib3NlOgogICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCdkb25lLlxuJykKICAgICAgICByZXR1cm4gcAoKCmRlZiBub3JtYWxpemVfbmFtZShuYW1lKToKICAgICIiIk5vcm1hbGl6ZSBhIHB5dGhvbiBwYWNrYWdlIG5hbWUgYSBsYSBQRVAgNTAzIiIiCiAgICAjIGh0dHBzOi8vd3d3LnB5dGhvbi5vcmcvZGV2L3BlcHMvcGVwLTA1MDMvI25vcm1hbGl6ZWQtbmFtZXMKICAgIHJldHVybiByZS5zdWIoJ1stXy5dKycsICctJywgbmFtZSkubG93ZXIoKQpQSwMEFAAAAAAAAAAhAKD9BVafXAAAn1wAADsAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvdmVyc2lvbi5weSMgLSotIGNvZGluZzogdXRmLTggLSotCiMKIyBDb3B5cmlnaHQgKEMpIDIwMTItMjAxNiBUaGUgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24uCiMgU2VlIExJQ0VOU0UudHh0IGFuZCBDT05UUklCVVRPUlMudHh0LgojCiIiIgpJbXBsZW1lbnRhdGlvbiBvZiBhIGZsZXhpYmxlIHZlcnNpb25pbmcgc2NoZW1lIHByb3ZpZGluZyBzdXBwb3J0IGZvciBQRVAtNDQwLApzZXR1cHRvb2xzLWNvbXBhdGlibGUgYW5kIHNlbWFudGljIHZlcnNpb25pbmcuCiIiIgoKaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IHJlCgpmcm9tIC5jb21wYXQgaW1wb3J0IHN0cmluZ190eXBlcwoKX19hbGxfXyA9IFsnTm9ybWFsaXplZFZlcnNpb24nLCAnTm9ybWFsaXplZE1hdGNoZXInLAogICAgICAgICAgICdMZWdhY3lWZXJzaW9uJywgJ0xlZ2FjeU1hdGNoZXInLAogICAgICAgICAgICdTZW1hbnRpY1ZlcnNpb24nLCAnU2VtYW50aWNNYXRjaGVyJywKICAgICAgICAgICAnVW5zdXBwb3J0ZWRWZXJzaW9uRXJyb3InLCAnZ2V0X3NjaGVtZSddCgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCgpjbGFzcyBVbnN1cHBvcnRlZFZlcnNpb25FcnJvcihWYWx1ZUVycm9yKToKICAgICIiIlRoaXMgaXMgYW4gdW5zdXBwb3J0ZWQgdmVyc2lvbi4iIiIKICAgIHBhc3MKCgpjbGFzcyBWZXJzaW9uKG9iamVjdCk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgcyk6CiAgICAgICAgc2VsZi5fc3RyaW5nID0gcyA9IHMuc3RyaXAoKQogICAgICAgIHNlbGYuX3BhcnRzID0gcGFydHMgPSBzZWxmLnBhcnNlKHMpCiAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UocGFydHMsIHR1cGxlKQogICAgICAgIGFzc2VydCBsZW4ocGFydHMpID4gMAoKICAgIGRlZiBwYXJzZShzZWxmLCBzKToKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCdwbGVhc2UgaW1wbGVtZW50IGluIGEgc3ViY2xhc3MnKQoKICAgIGRlZiBfY2hlY2tfY29tcGF0aWJsZShzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgdHlwZShzZWxmKSAhPSB0eXBlKG90aGVyKToKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdjYW5ub3QgY29tcGFyZSAlciBhbmQgJXInICUgKHNlbGYsIG90aGVyKSkKCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICBzZWxmLl9jaGVja19jb21wYXRpYmxlKG90aGVyKQogICAgICAgIHJldHVybiBzZWxmLl9wYXJ0cyA9PSBvdGhlci5fcGFydHMKCiAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gbm90IHNlbGYuX19lcV9fKG90aGVyKQoKICAgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIpOgogICAgICAgIHNlbGYuX2NoZWNrX2NvbXBhdGlibGUob3RoZXIpCiAgICAgICAgcmV0dXJuIHNlbGYuX3BhcnRzIDwgb3RoZXIuX3BhcnRzCgogICAgZGVmIF9fZ3RfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIG5vdCAoc2VsZi5fX2x0X18ob3RoZXIpIG9yIHNlbGYuX19lcV9fKG90aGVyKSkKCiAgICBkZWYgX19sZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5fX2x0X18ob3RoZXIpIG9yIHNlbGYuX19lcV9fKG90aGVyKQoKICAgIGRlZiBfX2dlX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmLl9fZ3RfXyhvdGhlcikgb3Igc2VsZi5fX2VxX18ob3RoZXIpCgogICAgIyBTZWUgaHR0cDovL2RvY3MucHl0aG9uLm9yZy9yZWZlcmVuY2UvZGF0YW1vZGVsI29iamVjdC5fX2hhc2hfXwogICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgICAgIHJldHVybiBoYXNoKHNlbGYuX3BhcnRzKQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIiVzKCclcycpIiAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgc2VsZi5fc3RyaW5nKQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9zdHJpbmcKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc19wcmVyZWxlYXNlKHNlbGYpOgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoJ1BsZWFzZSBpbXBsZW1lbnQgaW4gc3ViY2xhc3Nlcy4nKQoKCmNsYXNzIE1hdGNoZXIob2JqZWN0KToKICAgIHZlcnNpb25fY2xhc3MgPSBOb25lCgogICAgZGlzdF9yZSA9IHJlLmNvbXBpbGUociJeKFx3W1xzXHcnLi1dKikoXCgoLiopXCkpPyIpCiAgICBjb21wX3JlID0gcmUuY29tcGlsZShyJ14oPD18Pj18PHw+fCE9fD17MiwzfXx+PSk/XHMqKFteXHMsXSspJCcpCiAgICBudW1fcmUgPSByZS5jb21waWxlKHInXlxkKyhcLlxkKykqJCcpCgogICAgIyB2YWx1ZSBpcyBlaXRoZXIgYSBjYWxsYWJsZSBvciB0aGUgbmFtZSBvZiBhIG1ldGhvZAogICAgX29wZXJhdG9ycyA9IHsKICAgICAgICAnPCc6IGxhbWJkYSB2LCBjLCBwOiB2IDwgYywKICAgICAgICAnPic6IGxhbWJkYSB2LCBjLCBwOiB2ID4gYywKICAgICAgICAnPD0nOiBsYW1iZGEgdiwgYywgcDogdiA9PSBjIG9yIHYgPCBjLAogICAgICAgICc+PSc6IGxhbWJkYSB2LCBjLCBwOiB2ID09IGMgb3IgdiA+IGMsCiAgICAgICAgJz09JzogbGFtYmRhIHYsIGMsIHA6IHYgPT0gYywKICAgICAgICAnPT09JzogbGFtYmRhIHYsIGMsIHA6IHYgPT0gYywKICAgICAgICAjIGJ5IGRlZmF1bHQsIGNvbXBhdGlibGUgPT4gPj0uCiAgICAgICAgJ349JzogbGFtYmRhIHYsIGMsIHA6IHYgPT0gYyBvciB2ID4gYywKICAgICAgICAnIT0nOiBsYW1iZGEgdiwgYywgcDogdiAhPSBjLAogICAgfQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzKToKICAgICAgICBpZiBzZWxmLnZlcnNpb25fY2xhc3MgaXMgTm9uZToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignUGxlYXNlIHNwZWNpZnkgYSB2ZXJzaW9uIGNsYXNzJykKICAgICAgICBzZWxmLl9zdHJpbmcgPSBzID0gcy5zdHJpcCgpCiAgICAgICAgbSA9IHNlbGYuZGlzdF9yZS5tYXRjaChzKQogICAgICAgIGlmIG5vdCBtOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdOb3QgdmFsaWQ6ICVyJyAlIHMpCiAgICAgICAgZ3JvdXBzID0gbS5ncm91cHMoJycpCiAgICAgICAgc2VsZi5uYW1lID0gZ3JvdXBzWzBdLnN0cmlwKCkKICAgICAgICBzZWxmLmtleSA9IHNlbGYubmFtZS5sb3dlcigpICAgICMgZm9yIGNhc2UtaW5zZW5zaXRpdmUgY29tcGFyaXNvbnMKICAgICAgICBjbGlzdCA9IFtdCiAgICAgICAgaWYgZ3JvdXBzWzJdOgogICAgICAgICAgICBjb25zdHJhaW50cyA9IFtjLnN0cmlwKCkgZm9yIGMgaW4gZ3JvdXBzWzJdLnNwbGl0KCcsJyldCiAgICAgICAgICAgIGZvciBjIGluIGNvbnN0cmFpbnRzOgogICAgICAgICAgICAgICAgbSA9IHNlbGYuY29tcF9yZS5tYXRjaChjKQogICAgICAgICAgICAgICAgaWYgbm90IG06CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignSW52YWxpZCAlciBpbiAlcicgJSAoYywgcykpCiAgICAgICAgICAgICAgICBncm91cHMgPSBtLmdyb3VwcygpCiAgICAgICAgICAgICAgICBvcCA9IGdyb3Vwc1swXSBvciAnfj0nCiAgICAgICAgICAgICAgICBzID0gZ3JvdXBzWzFdCiAgICAgICAgICAgICAgICBpZiBzLmVuZHN3aXRoKCcuKicpOgogICAgICAgICAgICAgICAgICAgIGlmIG9wIG5vdCBpbiAoJz09JywgJyE9Jyk6CiAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1wnLipcJyBub3QgYWxsb3dlZCBmb3IgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICclciBjb25zdHJhaW50cycgJSBvcCkKICAgICAgICAgICAgICAgICAgICAjIENvdWxkIGJlIGEgcGFydGlhbCB2ZXJzaW9uIChlLmcuIGZvciAnMi4qJykgd2hpY2gKICAgICAgICAgICAgICAgICAgICAjIHdvbid0IHBhcnNlIGFzIGEgdmVyc2lvbiwgc28ga2VlcCBpdCBhcyBhIHN0cmluZwogICAgICAgICAgICAgICAgICAgIHZuLCBwcmVmaXggPSBzWzotMl0sIFRydWUKICAgICAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5udW1fcmUubWF0Y2godm4pOgogICAgICAgICAgICAgICAgICAgICAgICAjIEp1c3QgdG8gY2hlY2sgdGhhdCB2biBpcyBhIHZhbGlkIHZlcnNpb24KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi52ZXJzaW9uX2NsYXNzKHZuKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAjIFNob3VsZCBwYXJzZSBhcyBhIHZlcnNpb24sIHNvIHdlIGNhbiBjcmVhdGUgYW4KICAgICAgICAgICAgICAgICAgICAjIGluc3RhbmNlIGZvciB0aGUgY29tcGFyaXNvbgogICAgICAgICAgICAgICAgICAgIHZuLCBwcmVmaXggPSBzZWxmLnZlcnNpb25fY2xhc3MocyksIEZhbHNlCiAgICAgICAgICAgICAgICBjbGlzdC5hcHBlbmQoKG9wLCB2biwgcHJlZml4KSkKICAgICAgICBzZWxmLl9wYXJ0cyA9IHR1cGxlKGNsaXN0KQoKICAgIGRlZiBtYXRjaChzZWxmLCB2ZXJzaW9uKToKICAgICAgICAiIiIKICAgICAgICBDaGVjayBpZiB0aGUgcHJvdmlkZWQgdmVyc2lvbiBtYXRjaGVzIHRoZSBjb25zdHJhaW50cy4KCiAgICAgICAgOnBhcmFtIHZlcnNpb246IFRoZSB2ZXJzaW9uIHRvIG1hdGNoIGFnYWluc3QgdGhpcyBpbnN0YW5jZS4KICAgICAgICA6dHlwZSB2ZXJzaW9uOiBTdHJpbmcgb3IgOmNsYXNzOmBWZXJzaW9uYCBpbnN0YW5jZS4KICAgICAgICAiIiIKICAgICAgICBpZiBpc2luc3RhbmNlKHZlcnNpb24sIHN0cmluZ190eXBlcyk6CiAgICAgICAgICAgIHZlcnNpb24gPSBzZWxmLnZlcnNpb25fY2xhc3ModmVyc2lvbikKICAgICAgICBmb3Igb3BlcmF0b3IsIGNvbnN0cmFpbnQsIHByZWZpeCBpbiBzZWxmLl9wYXJ0czoKICAgICAgICAgICAgZiA9IHNlbGYuX29wZXJhdG9ycy5nZXQob3BlcmF0b3IpCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZiwgc3RyaW5nX3R5cGVzKToKICAgICAgICAgICAgICAgIGYgPSBnZXRhdHRyKHNlbGYsIGYpCiAgICAgICAgICAgIGlmIG5vdCBmOgogICAgICAgICAgICAgICAgbXNnID0gKCclciBub3QgaW1wbGVtZW50ZWQgJwogICAgICAgICAgICAgICAgICAgICAgICdmb3IgJXMnICUgKG9wZXJhdG9yLCBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXykpCiAgICAgICAgICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKG1zZykKICAgICAgICAgICAgaWYgbm90IGYodmVyc2lvbiwgY29uc3RyYWludCwgcHJlZml4KToKICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIHJldHVybiBUcnVlCgogICAgQHByb3BlcnR5CiAgICBkZWYgZXhhY3RfdmVyc2lvbihzZWxmKToKICAgICAgICByZXN1bHQgPSBOb25lCiAgICAgICAgaWYgbGVuKHNlbGYuX3BhcnRzKSA9PSAxIGFuZCBzZWxmLl9wYXJ0c1swXVswXSBpbiAoJz09JywgJz09PScpOgogICAgICAgICAgICByZXN1bHQgPSBzZWxmLl9wYXJ0c1swXVsxXQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgX2NoZWNrX2NvbXBhdGlibGUoc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIHR5cGUoc2VsZikgIT0gdHlwZShvdGhlcikgb3Igc2VsZi5uYW1lICE9IG90aGVyLm5hbWU6CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignY2Fubm90IGNvbXBhcmUgJXMgYW5kICVzJyAlIChzZWxmLCBvdGhlcikpCgogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgc2VsZi5fY2hlY2tfY29tcGF0aWJsZShvdGhlcikKICAgICAgICByZXR1cm4gc2VsZi5rZXkgPT0gb3RoZXIua2V5IGFuZCBzZWxmLl9wYXJ0cyA9PSBvdGhlci5fcGFydHMKCiAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gbm90IHNlbGYuX19lcV9fKG90aGVyKQoKICAgICMgU2VlIGh0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvcmVmZXJlbmNlL2RhdGFtb2RlbCNvYmplY3QuX19oYXNoX18KICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKICAgICAgICByZXR1cm4gaGFzaChzZWxmLmtleSkgKyBoYXNoKHNlbGYuX3BhcnRzKQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIiVzKCVyKSIgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHNlbGYuX3N0cmluZykKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fc3RyaW5nCgoKUEVQNDQwX1ZFUlNJT05fUkUgPSByZS5jb21waWxlKHInXnY/KFxkKyEpPyhcZCsoXC5cZCspKikoKGF8YnxjfHJjKShcZCspKT8nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByJyhcLihwb3N0KShcZCspKT8oXC4oZGV2KShcZCspKT8nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByJyhcKyhbYS16QS1aXGRdKyhcLlthLXpBLVpcZF0rKT8pKT8kJykKCgpkZWYgX3BlcF80NDBfa2V5KHMpOgogICAgcyA9IHMuc3RyaXAoKQogICAgbSA9IFBFUDQ0MF9WRVJTSU9OX1JFLm1hdGNoKHMpCiAgICBpZiBub3QgbToKICAgICAgICByYWlzZSBVbnN1cHBvcnRlZFZlcnNpb25FcnJvcignTm90IGEgdmFsaWQgdmVyc2lvbjogJXMnICUgcykKICAgIGdyb3VwcyA9IG0uZ3JvdXBzKCkKICAgIG51bXMgPSB0dXBsZShpbnQodikgZm9yIHYgaW4gZ3JvdXBzWzFdLnNwbGl0KCcuJykpCiAgICB3aGlsZSBsZW4obnVtcykgPiAxIGFuZCBudW1zWy0xXSA9PSAwOgogICAgICAgIG51bXMgPSBudW1zWzotMV0KCiAgICBpZiBub3QgZ3JvdXBzWzBdOgogICAgICAgIGVwb2NoID0gMAogICAgZWxzZToKICAgICAgICBlcG9jaCA9IGludChncm91cHNbMF0pCiAgICBwcmUgPSBncm91cHNbNDo2XQogICAgcG9zdCA9IGdyb3Vwc1s3OjldCiAgICBkZXYgPSBncm91cHNbMTA6MTJdCiAgICBsb2NhbCA9IGdyb3Vwc1sxM10KICAgIGlmIHByZSA9PSAoTm9uZSwgTm9uZSk6CiAgICAgICAgcHJlID0gKCkKICAgIGVsc2U6CiAgICAgICAgcHJlID0gcHJlWzBdLCBpbnQocHJlWzFdKQogICAgaWYgcG9zdCA9PSAoTm9uZSwgTm9uZSk6CiAgICAgICAgcG9zdCA9ICgpCiAgICBlbHNlOgogICAgICAgIHBvc3QgPSBwb3N0WzBdLCBpbnQocG9zdFsxXSkKICAgIGlmIGRldiA9PSAoTm9uZSwgTm9uZSk6CiAgICAgICAgZGV2ID0gKCkKICAgIGVsc2U6CiAgICAgICAgZGV2ID0gZGV2WzBdLCBpbnQoZGV2WzFdKQogICAgaWYgbG9jYWwgaXMgTm9uZToKICAgICAgICBsb2NhbCA9ICgpCiAgICBlbHNlOgogICAgICAgIHBhcnRzID0gW10KICAgICAgICBmb3IgcGFydCBpbiBsb2NhbC5zcGxpdCgnLicpOgogICAgICAgICAgICAjIHRvIGVuc3VyZSB0aGF0IG51bWVyaWMgY29tcGFyZXMgYXMgPiBsZXhpY29ncmFwaGljLCBhdm9pZAogICAgICAgICAgICAjIGNvbXBhcmluZyB0aGVtIGRpcmVjdGx5LCBidXQgZW5jb2RlIGEgdHVwbGUgd2hpY2ggZW5zdXJlcwogICAgICAgICAgICAjIGNvcnJlY3Qgc29ydGluZwogICAgICAgICAgICBpZiBwYXJ0LmlzZGlnaXQoKToKICAgICAgICAgICAgICAgIHBhcnQgPSAoMSwgaW50KHBhcnQpKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcGFydCA9ICgwLCBwYXJ0KQogICAgICAgICAgICBwYXJ0cy5hcHBlbmQocGFydCkKICAgICAgICBsb2NhbCA9IHR1cGxlKHBhcnRzKQogICAgaWYgbm90IHByZToKICAgICAgICAjIGVpdGhlciBiZWZvcmUgcHJlLXJlbGVhc2UsIG9yIGZpbmFsIHJlbGVhc2UgYW5kIGFmdGVyCiAgICAgICAgaWYgbm90IHBvc3QgYW5kIGRldjoKICAgICAgICAgICAgIyBiZWZvcmUgcHJlLXJlbGVhc2UKICAgICAgICAgICAgcHJlID0gKCdhJywgLTEpICAgICAjIHRvIHNvcnQgYmVmb3JlIGEwCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcHJlID0gKCd6JywpICAgICAgICAjIHRvIHNvcnQgYWZ0ZXIgYWxsIHByZS1yZWxlYXNlcwogICAgIyBub3cgbG9vayBhdCB0aGUgc3RhdGUgb2YgcG9zdCBhbmQgZGV2LgogICAgaWYgbm90IHBvc3Q6CiAgICAgICAgcG9zdCA9ICgnXycsKSAgICMgc29ydCBiZWZvcmUgJ2EnCiAgICBpZiBub3QgZGV2OgogICAgICAgIGRldiA9ICgnZmluYWwnLCkKCiAgICAjcHJpbnQoJyVzIC0+ICVzJyAlIChzLCBtLmdyb3VwcygpKSkKICAgIHJldHVybiBlcG9jaCwgbnVtcywgcHJlLCBwb3N0LCBkZXYsIGxvY2FsCgoKX25vcm1hbGl6ZWRfa2V5ID0gX3BlcF80NDBfa2V5CgoKY2xhc3MgTm9ybWFsaXplZFZlcnNpb24oVmVyc2lvbik6CiAgICAiIiJBIHJhdGlvbmFsIHZlcnNpb24uCgogICAgR29vZDoKICAgICAgICAxLjIgICAgICAgICAjIGVxdWl2YWxlbnQgdG8gIjEuMi4wIgogICAgICAgIDEuMi4wCiAgICAgICAgMS4yYTEKICAgICAgICAxLjIuM2EyCiAgICAgICAgMS4yLjNiMQogICAgICAgIDEuMi4zYzEKICAgICAgICAxLjIuMy40CiAgICAgICAgVE9ETzogZmlsbCB0aGlzIG91dAoKICAgIEJhZDoKICAgICAgICAxICAgICAgICAgICAjIG1pbmltdW0gdHdvIG51bWJlcnMKICAgICAgICAxLjJhICAgICAgICAjIHJlbGVhc2UgbGV2ZWwgbXVzdCBoYXZlIGEgcmVsZWFzZSBzZXJpYWwKICAgICAgICAxLjIuM2IKICAgICIiIgogICAgZGVmIHBhcnNlKHNlbGYsIHMpOgogICAgICAgIHJlc3VsdCA9IF9ub3JtYWxpemVkX2tleShzKQogICAgICAgICMgX25vcm1hbGl6ZWRfa2V5IGxvc2VzIHRyYWlsaW5nIHplcm9lcyBpbiB0aGUgcmVsZWFzZQogICAgICAgICMgY2xhdXNlLCBzaW5jZSB0aGF0J3MgbmVlZGVkIHRvIGVuc3VyZSB0aGF0IFguWSA9PSBYLlkuMCA9PSBYLlkuMC4wCiAgICAgICAgIyBIb3dldmVyLCBQRVAgNDQwIHByZWZpeCBtYXRjaGluZyBuZWVkcyBpdDogZm9yIGV4YW1wbGUsCiAgICAgICAgIyAofj0gMS40LjUuMCkgbWF0Y2hlcyBkaWZmZXJlbnRseSB0byAofj0gMS40LjUuMC4wKS4KICAgICAgICBtID0gUEVQNDQwX1ZFUlNJT05fUkUubWF0Y2gocykgICAgICAjIG11c3Qgc3VjY2VlZAogICAgICAgIGdyb3VwcyA9IG0uZ3JvdXBzKCkKICAgICAgICBzZWxmLl9yZWxlYXNlX2NsYXVzZSA9IHR1cGxlKGludCh2KSBmb3IgdiBpbiBncm91cHNbMV0uc3BsaXQoJy4nKSkKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgUFJFUkVMX1RBR1MgPSBzZXQoWydhJywgJ2InLCAnYycsICdyYycsICdkZXYnXSkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc19wcmVyZWxlYXNlKHNlbGYpOgogICAgICAgIHJldHVybiBhbnkodFswXSBpbiBzZWxmLlBSRVJFTF9UQUdTIGZvciB0IGluIHNlbGYuX3BhcnRzIGlmIHQpCgoKZGVmIF9tYXRjaF9wcmVmaXgoeCwgeSk6CiAgICB4ID0gc3RyKHgpCiAgICB5ID0gc3RyKHkpCiAgICBpZiB4ID09IHk6CiAgICAgICAgcmV0dXJuIFRydWUKICAgIGlmIG5vdCB4LnN0YXJ0c3dpdGgoeSk6CiAgICAgICAgcmV0dXJuIEZhbHNlCiAgICBuID0gbGVuKHkpCiAgICByZXR1cm4geFtuXSA9PSAnLicKCgpjbGFzcyBOb3JtYWxpemVkTWF0Y2hlcihNYXRjaGVyKToKICAgIHZlcnNpb25fY2xhc3MgPSBOb3JtYWxpemVkVmVyc2lvbgoKICAgICMgdmFsdWUgaXMgZWl0aGVyIGEgY2FsbGFibGUgb3IgdGhlIG5hbWUgb2YgYSBtZXRob2QKICAgIF9vcGVyYXRvcnMgPSB7CiAgICAgICAgJ349JzogJ19tYXRjaF9jb21wYXRpYmxlJywKICAgICAgICAnPCc6ICdfbWF0Y2hfbHQnLAogICAgICAgICc+JzogJ19tYXRjaF9ndCcsCiAgICAgICAgJzw9JzogJ19tYXRjaF9sZScsCiAgICAgICAgJz49JzogJ19tYXRjaF9nZScsCiAgICAgICAgJz09JzogJ19tYXRjaF9lcScsCiAgICAgICAgJz09PSc6ICdfbWF0Y2hfYXJiaXRyYXJ5JywKICAgICAgICAnIT0nOiAnX21hdGNoX25lJywKICAgIH0KCiAgICBkZWYgX2FkanVzdF9sb2NhbChzZWxmLCB2ZXJzaW9uLCBjb25zdHJhaW50LCBwcmVmaXgpOgogICAgICAgIGlmIHByZWZpeDoKICAgICAgICAgICAgc3RyaXBfbG9jYWwgPSAnKycgbm90IGluIGNvbnN0cmFpbnQgYW5kIHZlcnNpb24uX3BhcnRzWy0xXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgYm90aCBjb25zdHJhaW50IGFuZCB2ZXJzaW9uIGFyZQogICAgICAgICAgICAjIE5vcm1hbGl6ZWRWZXJzaW9uIGluc3RhbmNlcy4KICAgICAgICAgICAgIyBJZiBjb25zdHJhaW50IGRvZXMgbm90IGhhdmUgYSBsb2NhbCBjb21wb25lbnQsCiAgICAgICAgICAgICMgZW5zdXJlIHRoZSB2ZXJzaW9uIGRvZXNuJ3QsIGVpdGhlci4KICAgICAgICAgICAgc3RyaXBfbG9jYWwgPSBub3QgY29uc3RyYWludC5fcGFydHNbLTFdIGFuZCB2ZXJzaW9uLl9wYXJ0c1stMV0KICAgICAgICBpZiBzdHJpcF9sb2NhbDoKICAgICAgICAgICAgcyA9IHZlcnNpb24uX3N0cmluZy5zcGxpdCgnKycsIDEpWzBdCiAgICAgICAgICAgIHZlcnNpb24gPSBzZWxmLnZlcnNpb25fY2xhc3MocykKICAgICAgICByZXR1cm4gdmVyc2lvbiwgY29uc3RyYWludAoKICAgIGRlZiBfbWF0Y2hfbHQoc2VsZiwgdmVyc2lvbiwgY29uc3RyYWludCwgcHJlZml4KToKICAgICAgICB2ZXJzaW9uLCBjb25zdHJhaW50ID0gc2VsZi5fYWRqdXN0X2xvY2FsKHZlcnNpb24sIGNvbnN0cmFpbnQsIHByZWZpeCkKICAgICAgICBpZiB2ZXJzaW9uID49IGNvbnN0cmFpbnQ6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIHJlbGVhc2VfY2xhdXNlID0gY29uc3RyYWludC5fcmVsZWFzZV9jbGF1c2UKICAgICAgICBwZnggPSAnLicuam9pbihbc3RyKGkpIGZvciBpIGluIHJlbGVhc2VfY2xhdXNlXSkKICAgICAgICByZXR1cm4gbm90IF9tYXRjaF9wcmVmaXgodmVyc2lvbiwgcGZ4KQoKICAgIGRlZiBfbWF0Y2hfZ3Qoc2VsZiwgdmVyc2lvbiwgY29uc3RyYWludCwgcHJlZml4KToKICAgICAgICB2ZXJzaW9uLCBjb25zdHJhaW50ID0gc2VsZi5fYWRqdXN0X2xvY2FsKHZlcnNpb24sIGNvbnN0cmFpbnQsIHByZWZpeCkKICAgICAgICBpZiB2ZXJzaW9uIDw9IGNvbnN0cmFpbnQ6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIHJlbGVhc2VfY2xhdXNlID0gY29uc3RyYWludC5fcmVsZWFzZV9jbGF1c2UKICAgICAgICBwZnggPSAnLicuam9pbihbc3RyKGkpIGZvciBpIGluIHJlbGVhc2VfY2xhdXNlXSkKICAgICAgICByZXR1cm4gbm90IF9tYXRjaF9wcmVmaXgodmVyc2lvbiwgcGZ4KQoKICAgIGRlZiBfbWF0Y2hfbGUoc2VsZiwgdmVyc2lvbiwgY29uc3RyYWludCwgcHJlZml4KToKICAgICAgICB2ZXJzaW9uLCBjb25zdHJhaW50ID0gc2VsZi5fYWRqdXN0X2xvY2FsKHZlcnNpb24sIGNvbnN0cmFpbnQsIHByZWZpeCkKICAgICAgICByZXR1cm4gdmVyc2lvbiA8PSBjb25zdHJhaW50CgogICAgZGVmIF9tYXRjaF9nZShzZWxmLCB2ZXJzaW9uLCBjb25zdHJhaW50LCBwcmVmaXgpOgogICAgICAgIHZlcnNpb24sIGNvbnN0cmFpbnQgPSBzZWxmLl9hZGp1c3RfbG9jYWwodmVyc2lvbiwgY29uc3RyYWludCwgcHJlZml4KQogICAgICAgIHJldHVybiB2ZXJzaW9uID49IGNvbnN0cmFpbnQKCiAgICBkZWYgX21hdGNoX2VxKHNlbGYsIHZlcnNpb24sIGNvbnN0cmFpbnQsIHByZWZpeCk6CiAgICAgICAgdmVyc2lvbiwgY29uc3RyYWludCA9IHNlbGYuX2FkanVzdF9sb2NhbCh2ZXJzaW9uLCBjb25zdHJhaW50LCBwcmVmaXgpCiAgICAgICAgaWYgbm90IHByZWZpeDoKICAgICAgICAgICAgcmVzdWx0ID0gKHZlcnNpb24gPT0gY29uc3RyYWludCkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXN1bHQgPSBfbWF0Y2hfcHJlZml4KHZlcnNpb24sIGNvbnN0cmFpbnQpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBfbWF0Y2hfYXJiaXRyYXJ5KHNlbGYsIHZlcnNpb24sIGNvbnN0cmFpbnQsIHByZWZpeCk6CiAgICAgICAgcmV0dXJuIHN0cih2ZXJzaW9uKSA9PSBzdHIoY29uc3RyYWludCkKCiAgICBkZWYgX21hdGNoX25lKHNlbGYsIHZlcnNpb24sIGNvbnN0cmFpbnQsIHByZWZpeCk6CiAgICAgICAgdmVyc2lvbiwgY29uc3RyYWludCA9IHNlbGYuX2FkanVzdF9sb2NhbCh2ZXJzaW9uLCBjb25zdHJhaW50LCBwcmVmaXgpCiAgICAgICAgaWYgbm90IHByZWZpeDoKICAgICAgICAgICAgcmVzdWx0ID0gKHZlcnNpb24gIT0gY29uc3RyYWludCkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXN1bHQgPSBub3QgX21hdGNoX3ByZWZpeCh2ZXJzaW9uLCBjb25zdHJhaW50KQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgX21hdGNoX2NvbXBhdGlibGUoc2VsZiwgdmVyc2lvbiwgY29uc3RyYWludCwgcHJlZml4KToKICAgICAgICB2ZXJzaW9uLCBjb25zdHJhaW50ID0gc2VsZi5fYWRqdXN0X2xvY2FsKHZlcnNpb24sIGNvbnN0cmFpbnQsIHByZWZpeCkKICAgICAgICBpZiB2ZXJzaW9uID09IGNvbnN0cmFpbnQ6CiAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgaWYgdmVyc2lvbiA8IGNvbnN0cmFpbnQ6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQojICAgICAgICBpZiBub3QgcHJlZml4OgojICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICByZWxlYXNlX2NsYXVzZSA9IGNvbnN0cmFpbnQuX3JlbGVhc2VfY2xhdXNlCiAgICAgICAgaWYgbGVuKHJlbGVhc2VfY2xhdXNlKSA+IDE6CiAgICAgICAgICAgIHJlbGVhc2VfY2xhdXNlID0gcmVsZWFzZV9jbGF1c2VbOi0xXQogICAgICAgIHBmeCA9ICcuJy5qb2luKFtzdHIoaSkgZm9yIGkgaW4gcmVsZWFzZV9jbGF1c2VdKQogICAgICAgIHJldHVybiBfbWF0Y2hfcHJlZml4KHZlcnNpb24sIHBmeCkKCl9SRVBMQUNFTUVOVFMgPSAoCiAgICAocmUuY29tcGlsZSgnWy4rLV0kJyksICcnKSwgICAgICAgICAgICAgICAgICAgICAjIHJlbW92ZSB0cmFpbGluZyBwdW5jdHMKICAgIChyZS5jb21waWxlKHInXlsuXShcZCknKSwgcicwLlwxJyksICAgICAgICAgICAgICMgLk4gLT4gMC5OIGF0IHN0YXJ0CiAgICAocmUuY29tcGlsZSgnXlsuLV0nKSwgJycpLCAgICAgICAgICAgICAgICAgICAgICAjIHJlbW92ZSBsZWFkaW5nIHB1bmN0cwogICAgKHJlLmNvbXBpbGUocideXCgoLiopXCkkJyksIHInXDEnKSwgICAgICAgICAgICAgIyByZW1vdmUgcGFyZW50aGVzZXMKICAgIChyZS5jb21waWxlKHInXnYoZXJzaW9uKT9ccyooXGQrKScpLCByJ1wyJyksICAgICMgcmVtb3ZlIGxlYWRpbmcgdihlcnNpb24pCiAgICAocmUuY29tcGlsZShyJ15yKGV2KT9ccyooXGQrKScpLCByJ1wyJyksICAgICAgICAjIHJlbW92ZSBsZWFkaW5nIHYoZXJzaW9uKQogICAgKHJlLmNvbXBpbGUoJ1suXXsyLH0nKSwgJy4nKSwgICAgICAgICAgICAgICAgICAgIyBtdWx0aXBsZSBydW5zIG9mICcuJwogICAgKHJlLmNvbXBpbGUocidcYihhbGZhfGFwaGEpXGInKSwgJ2FscGhhJyksICAgICAgIyBtaXNzcGVsdCBhbHBoYQogICAgKHJlLmNvbXBpbGUocidcYihwcmUtYWxwaGF8cHJlYWxwaGEpXGInKSwKICAgICAgICAgICAgICAgICdwcmUuYWxwaGEnKSwgICAgICAgICAgICAgICAgICAgICAgICMgc3RhbmRhcmRpc2UKICAgIChyZS5jb21waWxlKHInXChiZXRhXCkkJyksICdiZXRhJyksICAgICAgICAgICAgICMgcmVtb3ZlIHBhcmVudGhlc2VzCikKCl9TVUZGSVhfUkVQTEFDRU1FTlRTID0gKAogICAgKHJlLmNvbXBpbGUoJ15bOn4uXystXSsnKSwgJycpLCAgICAgICAgICAgICAgICAgICAjIHJlbW92ZSBsZWFkaW5nIHB1bmN0cwogICAgKHJlLmNvbXBpbGUoJ1ssKiIpKFtcXV0nKSwgJycpLCAgICAgICAgICAgICAgICAgICAjIHJlbW92ZSB1bndhbnRlZCBjaGFycwogICAgKHJlLmNvbXBpbGUoJ1t+OitfIC1dJyksICcuJyksICAgICAgICAgICAgICAgICAgICAjIHJlcGxhY2UgaWxsZWdhbCBjaGFycwogICAgKHJlLmNvbXBpbGUoJ1suXXsyLH0nKSwgJy4nKSwgICAgICAgICAgICAgICAgICAgIyBtdWx0aXBsZSBydW5zIG9mICcuJwogICAgKHJlLmNvbXBpbGUocidcLiQnKSwgJycpLCAgICAgICAgICAgICAgICAgICAgICAgIyB0cmFpbGluZyAnLicKKQoKX05VTUVSSUNfUFJFRklYID0gcmUuY29tcGlsZShyJyhcZCsoXC5cZCspKiknKQoKCmRlZiBfc3VnZ2VzdF9zZW1hbnRpY192ZXJzaW9uKHMpOgogICAgIiIiCiAgICBUcnkgdG8gc3VnZ2VzdCBhIHNlbWFudGljIGZvcm0gZm9yIGEgdmVyc2lvbiBmb3Igd2hpY2gKICAgIF9zdWdnZXN0X25vcm1hbGl6ZWRfdmVyc2lvbiBjb3VsZG4ndCBjb21lIHVwIHdpdGggYW55dGhpbmcuCiAgICAiIiIKICAgIHJlc3VsdCA9IHMuc3RyaXAoKS5sb3dlcigpCiAgICBmb3IgcGF0LCByZXBsIGluIF9SRVBMQUNFTUVOVFM6CiAgICAgICAgcmVzdWx0ID0gcGF0LnN1YihyZXBsLCByZXN1bHQpCiAgICBpZiBub3QgcmVzdWx0OgogICAgICAgIHJlc3VsdCA9ICcwLjAuMCcKCiAgICAjIE5vdyBsb29rIGZvciBudW1lcmljIHByZWZpeCwgYW5kIHNlcGFyYXRlIGl0IG91dCBmcm9tCiAgICAjIHRoZSByZXN0LgogICAgI2ltcG9ydCBwZGI7IHBkYi5zZXRfdHJhY2UoKQogICAgbSA9IF9OVU1FUklDX1BSRUZJWC5tYXRjaChyZXN1bHQpCiAgICBpZiBub3QgbToKICAgICAgICBwcmVmaXggPSAnMC4wLjAnCiAgICAgICAgc3VmZml4ID0gcmVzdWx0CiAgICBlbHNlOgogICAgICAgIHByZWZpeCA9IG0uZ3JvdXBzKClbMF0uc3BsaXQoJy4nKQogICAgICAgIHByZWZpeCA9IFtpbnQoaSkgZm9yIGkgaW4gcHJlZml4XQogICAgICAgIHdoaWxlIGxlbihwcmVmaXgpIDwgMzoKICAgICAgICAgICAgcHJlZml4LmFwcGVuZCgwKQogICAgICAgIGlmIGxlbihwcmVmaXgpID09IDM6CiAgICAgICAgICAgIHN1ZmZpeCA9IHJlc3VsdFttLmVuZCgpOl0KICAgICAgICBlbHNlOgogICAgICAgICAgICBzdWZmaXggPSAnLicuam9pbihbc3RyKGkpIGZvciBpIGluIHByZWZpeFszOl1dKSArIHJlc3VsdFttLmVuZCgpOl0KICAgICAgICAgICAgcHJlZml4ID0gcHJlZml4WzozXQogICAgICAgIHByZWZpeCA9ICcuJy5qb2luKFtzdHIoaSkgZm9yIGkgaW4gcHJlZml4XSkKICAgICAgICBzdWZmaXggPSBzdWZmaXguc3RyaXAoKQogICAgaWYgc3VmZml4OgogICAgICAgICNpbXBvcnQgcGRiOyBwZGIuc2V0X3RyYWNlKCkKICAgICAgICAjIG1hc3NhZ2UgdGhlIHN1ZmZpeC4KICAgICAgICBmb3IgcGF0LCByZXBsIGluIF9TVUZGSVhfUkVQTEFDRU1FTlRTOgogICAgICAgICAgICBzdWZmaXggPSBwYXQuc3ViKHJlcGwsIHN1ZmZpeCkKCiAgICBpZiBub3Qgc3VmZml4OgogICAgICAgIHJlc3VsdCA9IHByZWZpeAogICAgZWxzZToKICAgICAgICBzZXAgPSAnLScgaWYgJ2RldicgaW4gc3VmZml4IGVsc2UgJysnCiAgICAgICAgcmVzdWx0ID0gcHJlZml4ICsgc2VwICsgc3VmZml4CiAgICBpZiBub3QgaXNfc2VtdmVyKHJlc3VsdCk6CiAgICAgICAgcmVzdWx0ID0gTm9uZQogICAgcmV0dXJuIHJlc3VsdAoKCmRlZiBfc3VnZ2VzdF9ub3JtYWxpemVkX3ZlcnNpb24ocyk6CiAgICAiIiJTdWdnZXN0IGEgbm9ybWFsaXplZCB2ZXJzaW9uIGNsb3NlIHRvIHRoZSBnaXZlbiB2ZXJzaW9uIHN0cmluZy4KCiAgICBJZiB5b3UgaGF2ZSBhIHZlcnNpb24gc3RyaW5nIHRoYXQgaXNuJ3QgcmF0aW9uYWwgKGkuZS4gTm9ybWFsaXplZFZlcnNpb24KICAgIGRvZXNuJ3QgbGlrZSBpdCkgdGhlbiB5b3UgbWlnaHQgYmUgYWJsZSB0byBnZXQgYW4gZXF1aXZhbGVudCAob3IgY2xvc2UpCiAgICByYXRpb25hbCB2ZXJzaW9uIGZyb20gdGhpcyBmdW5jdGlvbi4KCiAgICBUaGlzIGRvZXMgYSBudW1iZXIgb2Ygc2ltcGxlIG5vcm1hbGl6YXRpb25zIHRvIHRoZSBnaXZlbiBzdHJpbmcsIGJhc2VkCiAgICBvbiBvYnNlcnZhdGlvbiBvZiB2ZXJzaW9ucyBjdXJyZW50bHkgaW4gdXNlIG9uIFB5UEkuIEdpdmVuIGEgZHVtcCBvZgogICAgdGhvc2UgdmVyc2lvbiBkdXJpbmcgUHlDb24gMjAwOSwgNDI4NyBvZiB0aGVtOgogICAgLSAyMzEyICg1My45MyUpIG1hdGNoIE5vcm1hbGl6ZWRWZXJzaW9uIHdpdGhvdXQgY2hhbmdlCiAgICAgIHdpdGggdGhlIGF1dG9tYXRpYyBzdWdnZXN0aW9uCiAgICAtIDM0NzQgKDgxLjA0JSkgbWF0Y2ggd2hlbiB1c2luZyB0aGlzIHN1Z2dlc3Rpb24gbWV0aG9kCgogICAgQHBhcmFtIHMge3N0cn0gQW4gaXJyYXRpb25hbCB2ZXJzaW9uIHN0cmluZy4KICAgIEByZXR1cm5zIEEgcmF0aW9uYWwgdmVyc2lvbiBzdHJpbmcsIG9yIE5vbmUsIGlmIGNvdWxkbid0IGRldGVybWluZSBvbmUuCiAgICAiIiIKICAgIHRyeToKICAgICAgICBfbm9ybWFsaXplZF9rZXkocykKICAgICAgICByZXR1cm4gcyAgICMgYWxyZWFkeSByYXRpb25hbAogICAgZXhjZXB0IFVuc3VwcG9ydGVkVmVyc2lvbkVycm9yOgogICAgICAgIHBhc3MKCiAgICBycyA9IHMubG93ZXIoKQoKICAgICMgcGFydCBvZiB0aGlzIGNvdWxkIHVzZSBtYWtldHJhbnMKICAgIGZvciBvcmlnLCByZXBsIGluICgoJy1hbHBoYScsICdhJyksICgnLWJldGEnLCAnYicpLCAoJ2FscGhhJywgJ2EnKSwKICAgICAgICAgICAgICAgICAgICAgICAoJ2JldGEnLCAnYicpLCAoJ3JjJywgJ2MnKSwgKCctZmluYWwnLCAnJyksCiAgICAgICAgICAgICAgICAgICAgICAgKCctcHJlJywgJ2MnKSwKICAgICAgICAgICAgICAgICAgICAgICAoJy1yZWxlYXNlJywgJycpLCAoJy5yZWxlYXNlJywgJycpLCAoJy1zdGFibGUnLCAnJyksCiAgICAgICAgICAgICAgICAgICAgICAgKCcrJywgJy4nKSwgKCdfJywgJy4nKSwgKCcgJywgJycpLCAoJy5maW5hbCcsICcnKSwKICAgICAgICAgICAgICAgICAgICAgICAoJ2ZpbmFsJywgJycpKToKICAgICAgICBycyA9IHJzLnJlcGxhY2Uob3JpZywgcmVwbCkKCiAgICAjIGlmIHNvbWV0aGluZyBlbmRzIHdpdGggZGV2IG9yIHByZSwgd2UgYWRkIGEgMAogICAgcnMgPSByZS5zdWIociJwcmUkIiwgciJwcmUwIiwgcnMpCiAgICBycyA9IHJlLnN1YihyImRldiQiLCByImRldjAiLCBycykKCiAgICAjIGlmIHdlIGhhdmUgc29tZXRoaW5nIGxpa2UgImItMiIgb3IgImEuMiIgYXQgdGhlIGVuZCBvZiB0aGUKICAgICMgdmVyc2lvbiwgdGhhdCBpcyBwcm9iYWJseSBiZXRhLCBhbHBoYSwgZXRjCiAgICAjIGxldCdzIHJlbW92ZSB0aGUgZGFzaCBvciBkb3QKICAgIHJzID0gcmUuc3ViKHIiKFthYmNdfHJjKVtcLVwuXShcZCspJCIsIHIiXDFcMiIsIHJzKQoKICAgICMgMS4wLWRldi1yMzcxIC0+IDEuMC5kZXYzNzEKICAgICMgMC4xLWRldi1yNzkgLT4gMC4xLmRldjc5CiAgICBycyA9IHJlLnN1YihyIltcLVwuXShkZXYpW1wtXC5dP3I/KFxkKykkIiwgciIuXDFcMiIsIHJzKQoKICAgICMgQ2xlYW46IDIuMC5hLjMsIDIuMC5iMSwgMC45LjB+YzEKICAgIHJzID0gcmUuc3ViKHIiWy5+XT8oW2FiY10pXC4/IiwgciJcMSIsIHJzKQoKICAgICMgQ2xlYW46IHYwLjMsIHYxLjAKICAgIGlmIHJzLnN0YXJ0c3dpdGgoJ3YnKToKICAgICAgICBycyA9IHJzWzE6XQoKICAgICMgQ2xlYW4gbGVhZGluZyAnMCdzIG9uIG51bWJlcnMuCiAgICAjVE9ETzogdW5pbnRlbmRlZCBzaWRlLWVmZmVjdCBvbiwgZS5nLiwgIjIwMDMuMDUuMDkiCiAgICAjIFB5UEkgc3RhdHM6IDc3ICh+MiUpIGJldHRlcgogICAgcnMgPSByZS5zdWIociJcYjArKFxkKykoPyFcZCkiLCByIlwxIiwgcnMpCgogICAgIyBDbGVhbiBhL2IvYyB3aXRoIG5vIHZlcnNpb24uIEUuZy4gIjEuMGEiIC0+ICIxLjBhMCIuIFNldHVwdG9vbHMgaW5mZXJzCiAgICAjIHplcm8uCiAgICAjIFB5UEkgc3RhdHM6IDI0NSAoNy41NiUpIGJldHRlcgogICAgcnMgPSByZS5zdWIociIoXGQrW2FiY10pJCIsIHIiXGc8MT4wIiwgcnMpCgogICAgIyB0aGUgJ2Rldi1yTk5OJyB0YWcgaXMgYSBkZXYgdGFnCiAgICBycyA9IHJlLnN1YihyIlwuPyhkZXYtcnxkZXZcLnIpXC4/KFxkKykkIiwgciIuZGV2XDIiLCBycykKCiAgICAjIGNsZWFuIHRoZSAtIHdoZW4gdXNlZCBhcyBhIHByZSBkZWxpbWl0ZXIKICAgIHJzID0gcmUuc3ViKHIiLShhfGJ8YykoXGQrKSQiLCByIlwxXDIiLCBycykKCiAgICAjIGEgdGVybWluYWwgImRldiIgb3IgImRldmVsIiBjYW4gYmUgY2hhbmdlZCBpbnRvICIuZGV2MCIKICAgIHJzID0gcmUuc3ViKHIiW1wuXC1dKGRldnxkZXZlbCkkIiwgciIuZGV2MCIsIHJzKQoKICAgICMgYSB0ZXJtaW5hbCAiZGV2IiBjYW4gYmUgY2hhbmdlZCBpbnRvICIuZGV2MCIKICAgIHJzID0gcmUuc3ViKHIiKD8hW1wuXC1dKWRldiQiLCByIi5kZXYwIiwgcnMpCgogICAgIyBhIHRlcm1pbmFsICJmaW5hbCIgb3IgInN0YWJsZSIgY2FuIGJlIHJlbW92ZWQKICAgIHJzID0gcmUuc3ViKHIiKGZpbmFsfHN0YWJsZSkkIiwgIiIsIHJzKQoKICAgICMgVGhlICdyJyBhbmQgdGhlICctJyB0YWdzIGFyZSBwb3N0IHJlbGVhc2UgdGFncwogICAgIyAgIDAuNGExLnIxMCAgICAgICAtPiAgMC40YTEucG9zdDEwCiAgICAjICAgMC45LjMzLTE3MjIyICAgIC0+ICAwLjkuMzMucG9zdDE3MjIyCiAgICAjICAgMC45LjMzLXIxNzIyMiAgIC0+ICAwLjkuMzMucG9zdDE3MjIyCiAgICBycyA9IHJlLnN1YihyIlwuPyhyfC18LXIpXC4/KFxkKykkIiwgciIucG9zdFwyIiwgcnMpCgogICAgIyBDbGVhbiAncicgaW5zdGVhZCBvZiAnZGV2JyB1c2FnZToKICAgICMgICAwLjkuMzMrcjE3MjIyICAgLT4gIDAuOS4zMy5kZXYxNzIyMgogICAgIyAgIDEuMGRldjEyMyAgICAgICAtPiAgMS4wLmRldjEyMwogICAgIyAgIDEuMC5naXQxMjMgICAgICAtPiAgMS4wLmRldjEyMwogICAgIyAgIDEuMC5ienIxMjMgICAgICAtPiAgMS4wLmRldjEyMwogICAgIyAgIDAuMWEwZGV2LjEyMyAgICAtPiAgMC4xYTAuZGV2MTIzCiAgICAjIFB5UEkgc3RhdHM6ICB+MTUwICh+NCUpIGJldHRlcgogICAgcnMgPSByZS5zdWIociJcLj8oZGV2fGdpdHxienIpXC4/KFxkKykkIiwgciIuZGV2XDIiLCBycykKCiAgICAjIENsZWFuICcucHJlJyAobm9ybWFsaXplZCBmcm9tICctcHJlJyBhYm92ZSkgaW5zdGVhZCBvZiAnYycgdXNhZ2U6CiAgICAjICAgMC4yLnByZTEgICAgICAgIC0+ICAwLjJjMQogICAgIyAgIDAuMi1jMSAgICAgICAgIC0+ICAwLjJjMQogICAgIyAgIDEuMHByZXZpZXcxMjMgICAtPiAgMS4wYzEyMwogICAgIyBQeVBJIHN0YXRzOiB+MjEgKDAuNjIlKSBiZXR0ZXIKICAgIHJzID0gcmUuc3ViKHIiXC4/KHByZXxwcmV2aWV3fC1jKShcZCspJCIsIHIiY1xnPDI+IiwgcnMpCgogICAgIyBUY2wvVGsgdXNlcyAicHgiIGZvciB0aGVpciBwb3N0IHJlbGVhc2UgbWFya2VycwogICAgcnMgPSByZS5zdWIociJwKFxkKykkIiwgciIucG9zdFwxIiwgcnMpCgogICAgdHJ5OgogICAgICAgIF9ub3JtYWxpemVkX2tleShycykKICAgIGV4Y2VwdCBVbnN1cHBvcnRlZFZlcnNpb25FcnJvcjoKICAgICAgICBycyA9IE5vbmUKICAgIHJldHVybiBycwoKIwojICAgTGVnYWN5IHZlcnNpb24gcHJvY2Vzc2luZyAoZGlzdHJpYnV0ZS1jb21wYXRpYmxlKQojCgpfVkVSU0lPTl9QQVJUID0gcmUuY29tcGlsZShyJyhbYS16XSt8XGQrfFtcLi1dKScsIHJlLkkpCl9WRVJTSU9OX1JFUExBQ0UgPSB7CiAgICAncHJlJzogJ2MnLAogICAgJ3ByZXZpZXcnOiAnYycsCiAgICAnLSc6ICdmaW5hbC0nLAogICAgJ3JjJzogJ2MnLAogICAgJ2Rldic6ICdAJywKICAgICcnOiBOb25lLAogICAgJy4nOiBOb25lLAp9CgoKZGVmIF9sZWdhY3lfa2V5KHMpOgogICAgZGVmIGdldF9wYXJ0cyhzKToKICAgICAgICByZXN1bHQgPSBbXQogICAgICAgIGZvciBwIGluIF9WRVJTSU9OX1BBUlQuc3BsaXQocy5sb3dlcigpKToKICAgICAgICAgICAgcCA9IF9WRVJTSU9OX1JFUExBQ0UuZ2V0KHAsIHApCiAgICAgICAgICAgIGlmIHA6CiAgICAgICAgICAgICAgICBpZiAnMCcgPD0gcFs6MV0gPD0gJzknOgogICAgICAgICAgICAgICAgICAgIHAgPSBwLnpmaWxsKDgpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHAgPSAnKicgKyBwCiAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHApCiAgICAgICAgcmVzdWx0LmFwcGVuZCgnKmZpbmFsJykKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgcmVzdWx0ID0gW10KICAgIGZvciBwIGluIGdldF9wYXJ0cyhzKToKICAgICAgICBpZiBwLnN0YXJ0c3dpdGgoJyonKToKICAgICAgICAgICAgaWYgcCA8ICcqZmluYWwnOgogICAgICAgICAgICAgICAgd2hpbGUgcmVzdWx0IGFuZCByZXN1bHRbLTFdID09ICcqZmluYWwtJzoKICAgICAgICAgICAgICAgICAgICByZXN1bHQucG9wKCkKICAgICAgICAgICAgd2hpbGUgcmVzdWx0IGFuZCByZXN1bHRbLTFdID09ICcwMDAwMDAwMCc6CiAgICAgICAgICAgICAgICByZXN1bHQucG9wKCkKICAgICAgICByZXN1bHQuYXBwZW5kKHApCiAgICByZXR1cm4gdHVwbGUocmVzdWx0KQoKCmNsYXNzIExlZ2FjeVZlcnNpb24oVmVyc2lvbik6CiAgICBkZWYgcGFyc2Uoc2VsZiwgcyk6CiAgICAgICAgcmV0dXJuIF9sZWdhY3lfa2V5KHMpCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfcHJlcmVsZWFzZShzZWxmKToKICAgICAgICByZXN1bHQgPSBGYWxzZQogICAgICAgIGZvciB4IGluIHNlbGYuX3BhcnRzOgogICAgICAgICAgICBpZiAoaXNpbnN0YW5jZSh4LCBzdHJpbmdfdHlwZXMpIGFuZCB4LnN0YXJ0c3dpdGgoJyonKSBhbmQKICAgICAgICAgICAgICAgIHggPCAnKmZpbmFsJyk6CiAgICAgICAgICAgICAgICByZXN1bHQgPSBUcnVlCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgIHJldHVybiByZXN1bHQKCgpjbGFzcyBMZWdhY3lNYXRjaGVyKE1hdGNoZXIpOgogICAgdmVyc2lvbl9jbGFzcyA9IExlZ2FjeVZlcnNpb24KCiAgICBfb3BlcmF0b3JzID0gZGljdChNYXRjaGVyLl9vcGVyYXRvcnMpCiAgICBfb3BlcmF0b3JzWyd+PSddID0gJ19tYXRjaF9jb21wYXRpYmxlJwoKICAgIG51bWVyaWNfcmUgPSByZS5jb21waWxlKCdeKFxkKyhcLlxkKykqKScpCgogICAgZGVmIF9tYXRjaF9jb21wYXRpYmxlKHNlbGYsIHZlcnNpb24sIGNvbnN0cmFpbnQsIHByZWZpeCk6CiAgICAgICAgaWYgdmVyc2lvbiA8IGNvbnN0cmFpbnQ6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIG0gPSBzZWxmLm51bWVyaWNfcmUubWF0Y2goc3RyKGNvbnN0cmFpbnQpKQogICAgICAgIGlmIG5vdCBtOgogICAgICAgICAgICBsb2dnZXIud2FybmluZygnQ2Fubm90IGNvbXB1dGUgY29tcGF0aWJsZSBtYXRjaCBmb3IgdmVyc2lvbiAlcyAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICcgYW5kIGNvbnN0cmFpbnQgJXMnLCB2ZXJzaW9uLCBjb25zdHJhaW50KQogICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIHMgPSBtLmdyb3VwcygpWzBdCiAgICAgICAgaWYgJy4nIGluIHM6CiAgICAgICAgICAgIHMgPSBzLnJzcGxpdCgnLicsIDEpWzBdCiAgICAgICAgcmV0dXJuIF9tYXRjaF9wcmVmaXgodmVyc2lvbiwgcykKCiMKIyAgIFNlbWFudGljIHZlcnNpb25pbmcKIwoKX1NFTVZFUl9SRSA9IHJlLmNvbXBpbGUocideKFxkKylcLihcZCspXC4oXGQrKScKICAgICAgICAgICAgICAgICAgICAgICAgcicoLVthLXowLTldKyhcLlthLXowLTktXSspKik/JwogICAgICAgICAgICAgICAgICAgICAgICByJyhcK1thLXowLTldKyhcLlthLXowLTktXSspKik/JCcsIHJlLkkpCgoKZGVmIGlzX3NlbXZlcihzKToKICAgIHJldHVybiBfU0VNVkVSX1JFLm1hdGNoKHMpCgoKZGVmIF9zZW1hbnRpY19rZXkocyk6CiAgICBkZWYgbWFrZV90dXBsZShzLCBhYnNlbnQpOgogICAgICAgIGlmIHMgaXMgTm9uZToKICAgICAgICAgICAgcmVzdWx0ID0gKGFic2VudCwpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcGFydHMgPSBzWzE6XS5zcGxpdCgnLicpCiAgICAgICAgICAgICMgV2UgY2FuJ3QgY29tcGFyZSBpbnRzIGFuZCBzdHJpbmdzIG9uIFB5dGhvbiAzLCBzbyBmdWRnZSBpdAogICAgICAgICAgICAjIGJ5IHplcm8tZmlsbGluZyBudW1lcmljIHZhbHVlcyBzbyBzaW11bGF0ZSBhIG51bWVyaWMgY29tcGFyaXNvbgogICAgICAgICAgICByZXN1bHQgPSB0dXBsZShbcC56ZmlsbCg4KSBpZiBwLmlzZGlnaXQoKSBlbHNlIHAgZm9yIHAgaW4gcGFydHNdKQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBtID0gaXNfc2VtdmVyKHMpCiAgICBpZiBub3QgbToKICAgICAgICByYWlzZSBVbnN1cHBvcnRlZFZlcnNpb25FcnJvcihzKQogICAgZ3JvdXBzID0gbS5ncm91cHMoKQogICAgbWFqb3IsIG1pbm9yLCBwYXRjaCA9IFtpbnQoaSkgZm9yIGkgaW4gZ3JvdXBzWzozXV0KICAgICMgY2hvb3NlIHRoZSAnfCcgYW5kICcqJyBzbyB0aGF0IHZlcnNpb25zIHNvcnQgY29ycmVjdGx5CiAgICBwcmUsIGJ1aWxkID0gbWFrZV90dXBsZShncm91cHNbM10sICd8JyksIG1ha2VfdHVwbGUoZ3JvdXBzWzVdLCAnKicpCiAgICByZXR1cm4gKG1ham9yLCBtaW5vciwgcGF0Y2gpLCBwcmUsIGJ1aWxkCgoKY2xhc3MgU2VtYW50aWNWZXJzaW9uKFZlcnNpb24pOgogICAgZGVmIHBhcnNlKHNlbGYsIHMpOgogICAgICAgIHJldHVybiBfc2VtYW50aWNfa2V5KHMpCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfcHJlcmVsZWFzZShzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fcGFydHNbMV1bMF0gIT0gJ3wnCgoKY2xhc3MgU2VtYW50aWNNYXRjaGVyKE1hdGNoZXIpOgogICAgdmVyc2lvbl9jbGFzcyA9IFNlbWFudGljVmVyc2lvbgoKCmNsYXNzIFZlcnNpb25TY2hlbWUob2JqZWN0KToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBrZXksIG1hdGNoZXIsIHN1Z2dlc3Rlcj1Ob25lKToKICAgICAgICBzZWxmLmtleSA9IGtleQogICAgICAgIHNlbGYubWF0Y2hlciA9IG1hdGNoZXIKICAgICAgICBzZWxmLnN1Z2dlc3RlciA9IHN1Z2dlc3RlcgoKICAgIGRlZiBpc192YWxpZF92ZXJzaW9uKHNlbGYsIHMpOgogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5tYXRjaGVyLnZlcnNpb25fY2xhc3MocykKICAgICAgICAgICAgcmVzdWx0ID0gVHJ1ZQogICAgICAgIGV4Y2VwdCBVbnN1cHBvcnRlZFZlcnNpb25FcnJvcjoKICAgICAgICAgICAgcmVzdWx0ID0gRmFsc2UKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIGlzX3ZhbGlkX21hdGNoZXIoc2VsZiwgcyk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLm1hdGNoZXIocykKICAgICAgICAgICAgcmVzdWx0ID0gVHJ1ZQogICAgICAgIGV4Y2VwdCBVbnN1cHBvcnRlZFZlcnNpb25FcnJvcjoKICAgICAgICAgICAgcmVzdWx0ID0gRmFsc2UKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIGlzX3ZhbGlkX2NvbnN0cmFpbnRfbGlzdChzZWxmLCBzKToKICAgICAgICAiIiIKICAgICAgICBVc2VkIGZvciBwcm9jZXNzaW5nIHNvbWUgbWV0YWRhdGEgZmllbGRzCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuaXNfdmFsaWRfbWF0Y2hlcignZHVtbXlfbmFtZSAoJXMpJyAlIHMpCgogICAgZGVmIHN1Z2dlc3Qoc2VsZiwgcyk6CiAgICAgICAgaWYgc2VsZi5zdWdnZXN0ZXIgaXMgTm9uZToKICAgICAgICAgICAgcmVzdWx0ID0gTm9uZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuc3VnZ2VzdGVyKHMpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKX1NDSEVNRVMgPSB7CiAgICAnbm9ybWFsaXplZCc6IFZlcnNpb25TY2hlbWUoX25vcm1hbGl6ZWRfa2V5LCBOb3JtYWxpemVkTWF0Y2hlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc3VnZ2VzdF9ub3JtYWxpemVkX3ZlcnNpb24pLAogICAgJ2xlZ2FjeSc6IFZlcnNpb25TY2hlbWUoX2xlZ2FjeV9rZXksIExlZ2FjeU1hdGNoZXIsIGxhbWJkYSBzZWxmLCBzOiBzKSwKICAgICdzZW1hbnRpYyc6IFZl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AACA+kl0VYD6aHREgPpsdBiA+ncPhdUIAACBjfD9//8ACAAA6cYIAACAO2x1FkOBjfD9//8AEAAAiZ3A/f//6asIAACDjfD9//8Q6Z8IAACDjfD9//8g6ZMIAACKAzw2dR6AewE0dRiDwwKBjfD9//8AgAAAiZ3A/f//6W8IAAA8M3UegHsBMnUYg8MCgaXw/f///3///4mdwP3//+lNCAAAPGQPhEUIAAA8aQ+EPQgAADxvD4Q1CAAAPHUPhC0IAAA8eA+EJQgAADxYD4QdCAAAg6W8/f//AIOlxP3//wCNhaz9//9QD7bCUOgtFQAAWYXAioXv/f//WXQii43Q/f//jbXc/f//6Jv7//+KA0OJncD9//+EwA+Elfz//4uN0P3//4213P3//+h5+///6bsHAAAPvsKD+GQPj7cBAAAPhFUCAACD+FMPj7oAAAB0TIPoQXQQSEh0JEhIdAhISA+FqAUAAIDCIMeFjP3//wEAAACIle/9///pUwIAAPeF8P3//zAIAAAPhZ4AAACBjfD9//8ACAAA6Y8AAAD3hfD9//8wCAAAdQqBjfD9//8ACAAAi43o/f//g/n/dQW5////f4PHBPeF8P3//xAIAACJveT9//+Lf/yJveD9//8PhPsEAACF/3ULoTT+QACJheD9//+LheD9///HhcT9//8BAAAA6ckEAACD6FgPhBwDAABISHR/K8EPhLMBAABISA+F6AQAAIu95P3//4PHBPeF8P3//xAIAACJveT9//90MA+3R/xQaAACAACNhfT9//9QjYXY/f//UOjnNQAAg8QQhcB0H8eFpP3//wEAAADrE4pH/IiF9P3//8eF2P3//wEAAACNhfT9//+JheD9///peQQAAIsHg8cEib3k/f//hcB0PItIBIXJdDX3hfD9//8ACAAAD78AiY3g/f//dBSZK8LR+MeFxP3//wEAAADpNAQAAIOlxP3//wDpKAQAAKEw/kAAiYXg/f//UOjB9f//WekRBAAAg/hwD482AgAAD4QiAgAAg/hlD4z/AwAAg/hnD46zAAAAg/hpdHiD+G50KoP4bw+F4wMAAPaF8P3//4CLveT9//+Jtdj9//90bIGN8P3//wACAADrYIOF5P3//wSLheT9//+LcPzodhEAAIXAD4RK+v//9oXw/f//IHQMZouF3P3//2aJBusIi4Xc/f//iQbHhaT9//8BAAAA6T4FAACLveT9//+DjfD9//9Ax4XY/f//CgAAAIuN8P3///fBAIAAAA+E3QEAAAP+i0f4i1f86QkCAACLveT9//+DjfD9//9Ag73o/f//AI2d9P3//7gAAgAAiZ3g/f//iYWY/f//fQzHhej9//8GAAAA62p1EYD6Z3Vjx4Xo/f//AQAAAOtXOYXo/f//fgaJhej9//+Bvej9//+jAAAAfj2Ltej9//+Bxl0BAABW6M/Z//+Kle/9//9ZiYWg/f//hcB0EImF4P3//4m1mP3//4vY6wrHhej9//+jAAAAiweLNVjAQACDxwiJhYD9//+LR/yJhYT9//+Nhaz9//9Q/7WM/f//D77C/7Xo/f//ib3k/f//UP+1mP3//42FgP3//1NQ/zVA9UAA/9b/0Iu98P3//4PEHIHngAAAAHQdg73o/f//AHUUjYWs/f//UFP/NUz1QAD/1v/QWVmAve/9//9ndRiF/3UUjYWs/f//UFP/NUj1QAD/1v/QWVmAOy11EYGN8P3//wABAABDiZ3g/f//U+nE/f//ibXo/f//iY2o/f//6yqD6HMPhHT8//9ISA+EW/7//4PoAw+FvgEAAIu95P3//8eFqP3//ycAAAD2hfD9//+Ax4XY/f//EAAAAA+ENf7//4qFqP3//wRRxoXU/f//MIiF1f3//8eFzP3//wIAAADpEf7///fBABAAAA+FF/7//4PHBPbBIHQYib3k/f//9sFAdAYPv0f86wQPt0f8mesTi0f89sFAdAOZ6wIz0om95P3///bBQHQbhdJ/F3wEhcBzEffYg9IA99qBjfD9//8AAQAA94Xw/f//AJAAAIv6i9h1AjP/g73o/f//AH0Mx4Xo/f//AQAAAOsag6Xw/f//97gAAgAAOYXo/f//fgaJhej9//+LwwvHdQYhhcz9//+NdfOLhej9////jej9//+FwH8Gi8MLx3Qti4XY/f//mVJQV1PoAhAAAIPBMImdmP3//4vYi/qD+Tl+BgONqP3//4gOTuu9jUXzK8ZG94Xw/f//AAIAAImF2P3//4m14P3//3RjhcB0B4vOgDkwdFj/jeD9//+LjeD9///GATBA60BJZoM4AHQHg8AChcl18iuF4P3//9H46yiF/3ULoTD+QACJheD9//+LheD9///rB0mAOAB0BUCFyXX1K4Xg/f//iYXY/f//g72k/f//AA+FuAEAAIuN8P3///bBQHQ198EAAQAAdAnGhdT9//8t6xr2wQF0CcaF1P3//yvrDPbBAnQRxoXU/f//IMeFzP3//wEAAACLhcj9//8rhdj9//8rhcz9//+JhZj9///2wQx1JYv46x2LjdD9//+Ntdz9//+wIE/oGPX//4O93P3///90BIX/f9//tcz9//+LvZz9//+LndD9//+NhdT9//9QjYXc/f//6Br1///2hfD9//8IWVl0LvaF8P3//wR1JYu9mP3//+sZjbXc/f//i8uwME/ou/T//4O93P3///90BIX/f+ODvcT9//8Ai4XY/f//dHWFwH5xi7Xg/f//iYWQ/f//D7cG/42Q/f//UGoGjUX0UI2FiP3//1CDxgLoDTAAAIPEEIXAdTY5hYj9//90Lv+1iP3//4u9nP3//4ud0P3//41F9FCNhdz9///oc/T//4O9kP3//wBZWXWm6yODjdz9////6xqLvZz9//9Q/7Xg/f//jYXc/f//6EX0//9ZWYO93P3//wB8MvaF8P3//wR0KYu9mP3//+sdi43Q/f//jbXc/f//sCBP6OLz//+Dvdz9////dASF/3/fg72g/f//AHQT/7Wg/f//6OKU//+DpaD9//8AWYudwP3//4oDiIXv/f//hMB0D4u95P3//zP2itDpZPX//4O9vP3//wB0DYO9vP3//wcPhY30//+Avbj9//8AdAqLhbT9//+DYHD9i4Xc/f//i038X14zzVvoV5D//8nDjUkAZ39AAGR9QACWfUAA8n1AAD5+QABKfkAAkH5AAMJ/QACL/1WL7FFRi0UMVot1CIlF+ItFEFdWiUX86NUaAACDz/9ZO8d1EejWpv//xwAJAAAAi8eL1+tK/3UUjU38Uf91+FD/FdTAQACJRfg7x3UT/xU8wEAAhcB0CVDoyKb//1nrz4vGwfgFiwSFoA1BAIPmH8HmBo1EMASAIP2LRfiLVfxfXsnDahRoCOJAAOjApv//g8v/iV3ciV3gi0UIg/j+dRzobab//4MgAOhSpv//xwAJAAAAi8OL0+mhAAAAhcB4CDsFgA1BAHIa6EWm//+DIADoKqb//8cACQAAAOjNpf//69GLyMH5BY08jaANQQCL8IPmH8HmBosPD75MMQSD4QF0xlDoUhoAAFmDZfwAiwf2RDAEAXQc/3UU/3UQ/3UM/3UI6Nf+//+DxBCJRdyJVeDrGejIpf//xwAJAAAA6NCl//+DIACJXdyJXeDHRfz+////6AwAAACLRdyLVeDoMqb//8P/dQjojhoAAFnDi/9Vi+y45BoAAOjDLQAAoQTwQAAzxYlF/ItFDFaLdQhXM/+JhTTl//+JvTjl//+JvTDl//85fRB1BzPA6a4GAAA7x3Uf6Ful//+JOOhBpf//xwAWAAAA6OSk//+DyP/piwYAAIvGwfgFi/5TjRyFoA1BAIsDg+cfwecGikw4JALJ0PmJnSTl//+IjT/l//+A+QJ0BYD5AXUni00Q99H2wQF1Hej9pP//gyAA6OKk///HABYAAADohaT//+kdBgAA9kQ4BCB0D2oCagBqAFbovv3//4PEEFboPgcAAFmFwA+EmQIAAIsD9kQHBIAPhIwCAADoLq7//4tAbDPJOUgUjYUg5f//D5TBUIsD/zQHi/H/FRjBQAAzyTvBD4RgAgAAO/F0DDiNP+X//w+EUAIAAP8VFMFAAIudNOX//4mFIOX//zPAiYUs5f//OUUQD4YjBQAAiYVA5f//ioU/5f//hMAPhWcBAACKC4u1JOX//zPAgPkKD5TAiYUc5f//iwYDx4N4OAB0FYpQNIhV9IhN9YNgOABqAo1F9FDrSw++wVDo0AkAAFmFwHQ6i4005f//K8sDTRAzwEA7yA+GpQEAAGoCjYVE5f//U1DoVAkAAIPEDIP4/w+EkgQAAEP/hUDl///rG2oBU42FROX//1DoMAkAAIPEDIP4/w+EbgQAADPAUFBqBY1N9FFqAY2NROX//1FQ/7Ug5f//Q/+FQOX///8V4MBAAIvwhfYPhD0EAABqAI2FLOX//1BWjUX0UIuFJOX//4sA/zQH/xXAwEAAhcAPhAoEAACLhUDl//+LjTDl//8DwYmFOOX//zm1LOX//w+M9gMAAIO9HOX//wAPhM0AAABqAI2FLOX//1BqAY1F9FCLhSTl//+LAMZF9A3/NAf/FcDAQACFwA+EsQMAAIO9LOX//wEPjLADAAD/hTDl////hTjl///pgwAAADwBdAQ8AnUhD7czM8mD/goPlMGDwwKDhUDl//8CibVE5f//iY0c5f//PAF0BDwCdVL/tUTl///oeCoAAFlmO4VE5f//D4VJAwAAg4U45f//AoO9HOX//wB0KWoNWFCJhUTl///oSyoAAFlmO4VE5f//D4UcAwAA/4U45f///4Uw5f//i0UQOYVA5f//D4L5/f//6QgDAACLDooT/4U45f//iFQPNIsOiUQPOOnvAgAAM8mLA/ZEOASAD4ShAgAAgL0/5f//AImNROX//w+FqAAAAIudNOX//zlNEA+G/QIAAIvLM/YrjTTl//+NhUjl//87TRBzJooTQ0GJnSDl//+A+gp1C/+FMOX//8YADUBGiBBARoH+/xMAAHLVi/CNhUjl//8r8GoAjYUo5f//UFaNhUjl//9Qi4Uk5f//iwD/NAf/FcDAQACFwA+EQwIAAIuFKOX//wGFOOX//zvGD4w7AgAAi8MrhTTl//87RRAPgmz////pJQIAAIC9P+X//wIPhc0AAACLnTTl//85TRAPhkgCAACDpUDl//8Ai8srjTTl//9qAo2FSOX//147TRBzQw+3EwPeA86JnSDl//+D+gp1GgG1MOX//2oNW2aJGIudIOX//wPGAbVA5f//AbVA5f//ZokQA8aBvUDl///+EwAAcriL8I2FSOX//yvwagCNhSjl//9QVo2FSOX//1CLhSTl//+LAP80B/8VwMBAAIXAD4RpAQAAi4Uo5f//AYU45f//O8YPjGEBAACLwyuFNOX//ztFEA+CR////+lLAQAAi4U05f//iYUs5f//OU0QD4Z1AQAAi40s5f//g6VA5f//ACuNNOX//2oCjYVI+f//XjtNEHM7i5Us5f//D7cSAbUs5f//A86D+gp1DmoNW2aJGAPGAbVA5f//AbVA5f//ZokQA8aBvUDl//+oBgAAcsAz9lZWaFUNAACNjfDr//9RjY1I+f//K8GZK8LR+FCLwVBWaOn9AAD/FeDAQACL2DveD4SXAAAAagCNhSjl//9Qi8MrxlCNhDXw6///UIuFJOX//4sA/zQH/xXAwEAAhcB0DAO1KOX//zvef8vrDP8VPMBAAImFROX//zvef1yLhSzl//8rhTTl//+JhTjl//87RRAPggv////rP1GNjSjl//9R/3UQ/7U05f///zQ4/xXAwEAAhcB0FYuFKOX//4OlROX//wCJhTjl///rDP8VPMBAAImFROX//4O9OOX//wB1bIO9ROX//wB0LWoFXjm1ROX//3UU6AOf///HAAkAAADoC5///4kw6z//tUTl///oD5///1nrMYuFJOX//4sA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AjPAi7XE+///a8AJD7aEMEDZQABqCMHoBF6JhcT7//87xg+ET////4P4Bw+HDQoAAP8khcuhQAAzwION9Pv///+JhZj7//+JhbD7//+Jhdj7//+Jhdz7//+Jhfj7//+JhdD7///p4AkAAA+3woPoIHRIg+gDdDQrxnQkK8F0FIPoAw+FtgkAAAm1+Pv//+m3CQAAg434+///BOmrCQAAg434+///AemfCQAAgY34+///gAAAAOmQCQAACY34+///6YUJAABmg/oqdSuLA4PDBImd5Pv//4mF2Pv//4XAD4lmCQAAg434+///BPed2Pv//+lUCQAAi4XY+///a8AKD7fKjUQI0ImF2Pv//+k5CQAAg6X0+///AOktCQAAZoP6KnUliwODwwSJneT7//+JhfT7//+FwA+JDgkAAION9Pv////pAgkAAIuF9Pv//2vACg+3yo1ECNCJhfT7///p5wgAAA+3woP4SXRRg/hodECD+Gx0GIP4dw+FzAgAAIGN+Pv//wAIAADpvQgAAGaDP2x1EQP5gY34+///ABAAAOmmCAAAg434+///EOmaCAAAg434+///IOmOCAAAD7cHg/g2dRlmg38CNHUSg8cEgY34+///AIAAAOltCAAAg/gzdRlmg38CMnUSg8cEgaX4+////3///+lPCAAAg/hkD4RGCAAAg/hpD4Q9CAAAg/hvD4Q0CAAAg/h1D4QrCAAAg/h4D4QiCAAAg/hYD4QZCAAAg6XE+///AIuF1Pv//1KNtej7///HhdD7//8BAAAA6Bf8//9Z6fAHAAAPt8KD+GQPjzECAAAPhL8CAACD+FMPjxwBAAB0f4PoQXQQK8F0WivBdAgrwQ+F4QUAAIPCIMeFmPv//wEAAACJleD7//+LjfT7//+Djfj7//9Ajb38+///uAACAACJvfD7//+Jhez7//+FyQ+JjgIAAMeF9Pv//wYAAADp3gIAAPeF+Pv//zAIAAAPhckAAACDjfj7//8g6b0AAAD3hfj7//8wCAAAdQeDjfj7//8gi730+///g///dQW/////f4PDBPaF+Pv//yCJneT7//+LW/yJnfD7//8PhPkEAACF23ULoTD+QACJhfD7//+Dpez7//8Ai7Xw+///hf8PjhEFAACKBoTAD4QHBQAAjY20+///D7bAUVDoC/r//1lZhcB0AUZG/4Xs+///Ob3s+///fNDp3AQAAIPoWA+E3wIAACvBD4SVAAAAg+gHD4T0/v//K8EPhboEAAAPtwODwwQz9kb2hfj7//8gibXQ+///iZ3k+///iYWk+///dEKIhcj7//+NhbT7//9Qi4W0+///xoXJ+///AP+wrAAAAI2FyPv//1CNhfz7//9Q6Ef4//+DxBCFwHkPibWw+///6wdmiYX8+///jYX8+///iYXw+///ibXs+///6TYEAACLA4PDBImd5Pv//4XAdDqLSASFyXQz94X4+///AAgAAA+/AImN8Pv//3QSmSvCx4XQ+///AQAAAOnxAwAAg6XQ+///AOnnAwAAoTD+QACJhfD7//9Q6IXb//9Z6dADAACD+HAPj+UBAAAPhM0BAACD+GUPjL4DAACD+GcPjuf9//+D+Gl0boP4bnQkg/hvD4WiAwAA9oX4+///gIm14Pv//3RigY34+///AAIAAOtWg8MEiZ3k+///i1v86ET3//+FwA+EePr///aF+Pv//yB0DGaLhej7//9miQPrCIuF6Pv//4kDx4Ww+///AQAAAOn3BAAAg434+///QMeF4Pv//woAAAD3hfj7//8AgAAAD4SZAQAAA96LQ/iLU/zp1QEAAHUSZoP6Z3VXx4X0+///AQAAAOtLO8h+CImF9Pv//4vIgfmjAAAAfjeNsV0BAABW6Om///+LleD7//9ZiYWo+///hcB0EImF8Pv//4m17Pv//4v46wrHhfT7//+jAAAAiwOLNVjAQACDwwiJhZD7//+LQ/yJhZT7//+NhbT7//9Q/7WY+///D77C/7X0+///iZ3k+///UP+17Pv//42FkPv//1dQ/zVA9UAA/9b/0Iud+Pv//4PEHIHjgAAAAHQdg730+///AHUUjYW0+///UFf/NUz1QAD/1v/QWVlmg73g+///Z3UYhdt1FI2FtPv//1BX/zVI9UAA/9b/0FlZgD8tdRGBjfj7//8AAQAAR4m98Pv//1fpGf7//4m19Pv//8eFrPv//wcAAADrJIPocw+Ee/z//yvBD4Sc/v//g+gDD4XOAQAAx4Ws+///JwAAAPaF+Pv//4DHheD7//8QAAAAD4R8/v//ajBYZomFzPv//4uFrPv//4PAUWaJhc77//+Jjdz7///pV/7///eF+Pv//wAQAAAPhVf+//+DwwT2hfj7//8gdBz2hfj7//9AiZ3k+///dAYPv0P86wQPt0P8mesX9oX4+///QItD/HQDmesCM9KJneT7///2hfj7//9AdBuF0n8XfASFwHMR99iD0gD32oGN+Pv//wABAAD3hfj7//8AkAAAi/qL2HUCM/+DvfT7//8AfQzHhfT7//8BAAAA6xqDpfj7///3uAACAAA5hfT7//9+BomF9Pv//4vDC8d1BiGF3Pv//421+/3//4uF9Pv///+N9Pv//4XAfwaLwwvHdC2LheD7//+ZUlBXU+gF9v//g8EwiZ2M+///i9iL+oP5OX4GA42s+///iA5O672Nhfv9//8rxkb3hfj7//8AAgAAiYXs+///ibXw+///dF6FwHQHi8aAODB0U/+N8Pv//4uF8Pv///+F7Pv//8YAMOs8hdt1C6E0/kAAiYXw+///i4Xw+///x4XQ+///AQAAAOsJT2aDOAB0BgPBhf918yuF8Pv//9H4iYXs+///g72w+///AA+FqAEAAIuF+Pv//6hAdCupAAEAAHQEai3rDqgBdARqK+sGqAJ0FGogWWaJjcz7///Hhdz7//8BAAAAi73Y+///K73s+///K73c+///ib3g+///qAx1JOsei4XU+///aiCNtej7//9P6Ir1//+Dvej7////WXQEhf9/3v+13Pv//4u9nPv//4ud1Pv//42FzPv//1CNhej7///oh/X///aF+Pv//whZWXQv9oX4+///BHUmi73g+///6xpqMI216Pv//4vDT+gs9f//g73o+////1l0BIX/f+KDvdD7//8AdWuLnez7//+F235hi73w+///jYW0+///UIuFtPv///+wrAAAAI2FpPv//1dQS+jK8v//g8QQiYWM+///hcB+JP+1pPv//4uF1Pv//4216Pv//+jA9P//A72M+///WYXbf7DrLoON6Pv////rJf+17Pv//4u9nPv///+18Pv//4ud1Pv//42F6Pv//+i29P//WVmDvej7//8AfDP2hfj7//8EdCqLveD7///rHouF1Pv//2ogjbXo+///T+hX9P//g73o+////1l0BIX/f96Dvaj7//8AdBP/taj7///o93r//4OlqPv//wBZi72g+///i53k+///D7cHM/aJheD7//9mO8Z0B4vQ6XH1//85tcT7//90DYO9xPv//wcPhQH1//+AvcD7//8AdAqLhbz7//+DYHD9i4Xo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b14wZg9/B2YPf08QZg9/VyBmD39fMGYPb2ZAZg9vblBmD292YGYPb35wZg9/Z0BmD39vUGYPf3dgZg9/f3CNtoAAAACNv4AAAABKdaOFyXRJi9HB6gSF0nQXjZsAAAAAZg9vBmYPfweNdhCNfxBKde+D4Q90JIvBwekCdA2LFokXjXYEjX8ESXXzi8iD4QN0CYoGiAdGR0l191heX13DuhAAAAAr0CvKUYvCi8iD4QN0CYoWiBdGR0l198HoAnQNixaJF412BI1/BEh181npC////8zMzMzMzMzMzMzMUY1MJAgryIPhDwPBG8kLwVnpCgoAAFGNTCQIK8iD4QcDwRvJC8FZ6fQJAACL/1WL7FaLdQiF9g+EYwMAAP92BOjybv///3YI6Opu////dgzo4m7///92EOjabv///3YU6NJu////dhjoym7///826MNu////diDou27///92JOizbv///3Yo6Ktu////dizoo27///92MOibbv///3Y06JNu////dhzoi27///92OOiDbv///3Y86Htu//+DxED/dkDocG7///92ROhobv///3ZI6GBu////dkzoWG7///92UOhQbv///3ZU6Ehu////dljoQG7///92XOg4bv///3Zg6DBu////dmToKG7///92aOggbv///3Zs6Bhu////dnDoEG7///92dOgIbv///3Z46ABu////dnzo+G3//4PEQP+2gAAAAOjqbf///7aEAAAA6N9t////togAAADo1G3///+2jAAAAOjJbf///7aQAAAA6L5t////tpQAAADos23///+2mAAAAOiobf///7acAAAA6J1t////tqAAAADokm3///+2pAAAAOiHbf///7aoAAAA6Hxt////trwAAADocW3///+2wAAAAOhmbf///7bEAAAA6Ftt////tsgAAADoUG3///+2zAAAAOhFbf//g8RA/7bQAAAA6Ddt////trgAAADoLG3///+22AAAAOghbf///7bcAAAA6BZt////tuAAAADoC23///+25AAAAOgAbf///7boAAAA6PVs////tuwAAADo6mz///+21AAAAOjfbP///7bwAAAA6NRs////tvQAAADoyWz///+2+AAAAOi+bP///7b8AAAA6LNs////tgABAADoqGz///+2BAEAAOidbP///7YIAQAA6JJs//+D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QAB4/0AAYwBjAHMAAABVAFQARgAtADgAAABVAFQARgAtADEANgBMAEUAAAAAAFUATgBJAEMATwBEAEUAAABLAEUAUgBOAEUATAAzADIALgBEAEwATAAAAAAARmxzRnJlZQBGbHNTZXRWYWx1ZQBGbHNHZXRWYWx1ZQBGbHNBbGxvYwAAAAByAHUAbgB0AGkAbQBlACAAZQByAHIAbwByACAAAAAAAA0ACgAAAAAAVABMAE8AUwBTACAAZQByAHIAbwByAA0ACgAAAFMASQBOAEcAIABlAHIAcgBvAHIADQAKAAAAAABEAE8ATQBBAEkATgAgAGUAcgByAG8AcgANAAoAAAAAAAAAAABSADYAMAAzADMADQAKAC0AIABBAHQAdABlAG0AcAB0ACAAdABvACAAdQBzAGUAIABNAFMASQBMACAAYwBvAGQAZQAgAGYAcgBvAG0AIAB0AGgAaQBzACAAYQBzAHMAZQBtAGIAbAB5ACAAZAB1AHIAaQBuAGcAIABuAGEAdABpAHYAZQAgAGMAbwBkAGUAIABpAG4AaQB0AGkAYQBsAGkAegBhAHQAaQBvAG4ACgBUAGgAaQBzACAAaQBuAGQAaQBjAGEAdABlAHMAIABhACAAYgB1AGcAIABpAG4AIAB5AG8AdQByACAAYQBwAHAAbABpAGMAYQB0AGkAbwBuAC4AIABJAHQAIABpAHMAIABtAG8AcwB0ACAAbABpAGsAZQBsAHkAIAB0AGgAZQAgAHIAZQBzAHUAbAB0ACAAbwBmACAAYwBhAGwAbABpAG4AZwAgAGEAbgAgAE0AUwBJAEwALQBjAG8AbQBwAGkAbABlAGQAIAAoAC8AYwBsAHIAKQAgAGYAdQBuAGMAdABpAG8AbgAgAGYAcgBvAG0AIABhACAAbgBhAHQAaQB2AGUAIABjAG8AbgBzAHQAcgB1AGMAdABvAHIAIABvAHIAIABmAHIAbwBtACAARABsAGwATQBhAGkAbgAuAA0ACgAAAAAAUgA2ADAAMwAyAA0ACgAtACAAbgBvAHQAIABlAG4AbwB1AGcAaAAgAHMAcABhAGMAZQAgAGYAbwByACAAbABvAGMAYQBsAGUAIABpAG4AZgBvAHIAbQBhAHQAaQBvAG4ADQAKAAAAAABSADYAMAAzADEADQAKAC0AIABBAHQAdABlAG0AcAB0ACAAdABvACAAaQBuAGkAdABpAGEAbABpAHoAZQAgAHQAaABlACAAQwBSAFQAIABtAG8AcgBlACAAdABoAGEAbgAgAG8AbgBjAGUALgAKAFQAaABpAHMAIABpAG4AZABpAGMAYQB0AGUAcwAgAGEAIABiAHUAZwAgAGkAbgAgAHkAbwB1AHIAIABhAHAAcABsAGkAYwBhAHQAaQBvAG4ALgANAAoAAAAAAFIANgAwADMAMAANAAoALQAgAEMAUgBUACAAbgBvAHQAIABpAG4AaQB0AGkAYQBsAGkAegBlAGQADQAKAAAAAABSADYAMAAyADgADQAKAC0AIAB1AG4AYQBiAGwAZQAgAHQAbwAgAGkAbgBpAHQAaQBhAGwAaQB6AGUAIABoAGUAYQBwAA0ACgAAAAAAAAAAAFIANgAwADIANwANAAoALQAgAG4AbwB0ACAAZQBuAG8AdQBnAGgAIABzAHAAYQBjAGUAIABmAG8AcgAgAGwAbwB3AGkAbwAgAGkAbgBpAHQAaQBhAGwAaQB6AGEAdABpAG8AbgANAAoAAAAAAAAAAABSADYAMAAyADYADQAKAC0AIABuAG8AdAAgAGUAbgBvAHUAZwBoACAAcwBwAGEAYwBlACAAZgBvAHIAIABzAHQAZABpAG8AIABpAG4AaQB0AGkAYQBsAGkAegBhAHQAaQBvAG4ADQAKAAAAAAAAAAAAUgA2ADAAMgA1AA0ACgAtACAAcAB1AHIAZQAgAHYAaQByAHQAdQBhAGwAIABmAHUAbgBjAHQAaQBvAG4AIABjAGEAbABsAA0ACgAAAAAAAABSADYAMAAyADQADQAKAC0AIABuAG8AdAAgAGUAbgBvAHUAZwBoACAAcwBwAGEAYwBlACAAZgBvAHIAIABfAG8AbgBlAHgAaQB0AC8AYQB0AGUAeABpAHQAIAB0AGEAYgBsAGUADQAKAAAAAAAAAAAAUgA2ADAAMQA5AA0ACgAtACAAdQBuAGEAYgBsAGUAIAB0AG8AIABvAHAAZQBuACAAYwBvAG4AcwBvAGwAZQAgAGQAZQB2AGkAYwBlAA0ACgAAAAAAAAAAAFIANgAwADEAOAANAAoALQAgAHUAbgBlAHgAcABlAGMAdABlAGQAIABoAGUAYQBwACAAZQByAHIAbwByAA0ACgAAAAAAAAAAAFIANgAwADEANwANAAoALQAgAHUAbgBlAHgAcABlAGMAdABlAGQAIABtAHUAbAB0AGkAdABoAHIAZQBhAGQAIABsAG8AYwBrACAAZQByAHIAbwByAA0ACgAAAAAAAAAAAFIANgAwADEANgANAAoALQAgAG4AbwB0ACAAZQBuAG8AdQBnAGgAIABzAHAAYQBjAGUAIABmAG8AcgAgAHQAaAByAGUAYQBkACAAZABhAHQAYQANAAoAAABSADYAMAAxADAADQAKAC0AIABhAGIAbwByAHQAKAApACAAaABhAHMAIABiAGUAZQBuACAAYwBhAGwAbABlAGQADQAKAAAAAABSADYAMAAwADkADQAKAC0AIABuAG8AdAAgAGUAbgBvAHUAZwBoACAAcwBwAGEAYwBlACAAZgBvAHIAIABlAG4AdgBpAHIAbwBuAG0AZQBuAHQADQAKAAAAUgA2ADAAMAA4AA0ACgAtACAAbgBvAHQAIABlAG4AbwB1AGcAaAAgAHMAcABhAGMAZQAgAGYAbwByACAAYQByAGcAdQBtAGUAbgB0AHMADQAKAAAAAAAAAFIANgAwADAAMgANAAoALQAgAGYAbABvAGEAdABpAG4AZwAgAHAAbwBpAG4AdAAgAHMAdQBwAHAAbwByAHQAIABuAG8AdAAgAGwAbwBhAGQAZQBkAA0ACgAAAAAAAAAAAAIAAACAykAACAAAACjKQAAJAAAA0MlAAAoAAACIyUAAEAAAADDJQAARAAAA0MhAABIAAACIyEAAEwAAADDIQAAYAAAAwMdAABkAAABwx0AAGgAAAADHQAAbAAAAkMZAABwAAABAxkAAHgAAAADGQAAfAAAAOMVAACAAAADQxEAAIQAAAODCQAB4AAAAvMJAAHkAAACgwkAAegAAAITCQAD8AAAAfMJAAP8AAABcwkAATQBpAGMAcgBvAHMAbwBmAHQAIABWAGkAcwB1AGEAbAAgAEMAKwArACAAUgB1AG4AdABpAG0AZQAgAEwAaQBiAHIAYQByAHkAAAAAAAoACgAAAAAALgAuAC4AAAA8AHAAcgBvAGcAcgBhAG0AIABuAGEAbQBlACAAdQBuAGsAbgBvAHcAbgA+AAAAAABSAHUAbgB0AGkAbQBlACAARQByAHIAbwByACEACgAKAFAAcgBvAGcAcgBhAG0AOgAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAIAAgACAAIAAgACAAIAAgACgAKAAoACgAKAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIABIABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAIQAhACEAIQAhACEAIQAhACEAIQAEAAQABAAEAAQABAAEACBAIEAgQCBAIEAgQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAEAAQABAAEAAQABAAggCCAIIAggCCAIIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACABAAEAAQABAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgACAAIAAgACAAIAAgACAAIABoACgAKAAoACgAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAASAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACEAIQAhACEAIQAhACEAIQAhACEABAAEAAQABAAEAAQABAAgQGBAYEBgQGBAYEBAQEBAQEB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aWxlZCB0byBvcGVuIGV4ZWN1dGFibGUAAABVbmFibGUgdG8gZmluZCBhbiBhcHBlbmRlZCBhcmNoaXZlLgBVbmFibGUgdG8gcmVhZCBmcm9tIGZpbGUAAAAAIyEAAAAAAABKb2IgaW5mb3JtYXRpb24gcXVlcnlpbmcgZmFpbGVkAEpvYiBpbmZvcm1hdGlvbiBzZXR0aW5nIGZhaWxlZAAAc3RkaW4gZHVwbGljYXRpb24gZmFpbGVkAAAAAHN0ZG91dCBkdXBsaWNhdGlvbiBmYWlsZWQAAABzdGRlcnIgZHVwbGljYXRpb24gZmFpbGVkAAAAVW5hYmxlIHRvIGNyZWF0ZSBwcm9jZXNzIHVzaW5nICclcycARmFpbGVkIHRvIGdldCBleGl0IGNvZGUgb2YgcHJvY2VzcwAALgBlAHgAZQAAAAAARXhwZWN0ZWQgdG8gZmluZCBhIGNvbW1hbmQgZW5kaW5nIGluICcuZXhlJyBpbiBzaGViYW5nIGxpbmUuAAAAAAAAAABFeHBlY3RlZCB0ZXJtaW5hdGluZyBkb3VibGUtcXVvdGUgZm9yIGV4ZWN1dGFibGUgaW4gc2hlYmFuZyBsaW5lLgAAAAAAAABUZXJtaW5hdGluZyBxdW90ZSB3aXRob3V0IHN0YXJ0aW5nIHF1b3RlIGZvciBleGVjdXRhYmxlIGluIHNoZWJhbmcgbGluZS4AAAAARmFpbGVkIHRvIGZpbmQgc2hlYmFuZwAARXhwZWN0ZWQgdG8gZmluZCB0ZXJtaW5hdG9yIGluIHNoZWJhbmcgbGluZQBFeHBlY3RlZCB0byBkZWNvZGUgc2hlYmFuZyBsaW5lIHVzaW5nIFVURi04AEV4cGVjdGVkIHRvIGZpbmQgJyMnIGF0IHN0YXJ0IG9mIHNoZWJhbmcgbGluZQAAAEV4cGVjdGVkIHRvIGZpbmQgJyEnIGZvbGxvd2luZyAnIycgaW4gc2hlYmFuZyBsaW5lAABFeHBlY3RlZCB0byBmaW5kIGV4ZWN1dGFibGUgaW4gc2hlYmFuZyBsaW5lAEV4cGVjdGVkIHRvIGZpbmQgYXJndW1lbnRzIChldmVuIGlmIGVtcHR5KSBpbiBzaGViYW5nIGxpbmUAAEV4cGVjdGVkIHRvIGJlIGFibGUgdG8gYWxsb2NhdGUgY29tbWFuZCBsaW5lIG1lbW9yeQAiACUAcwAiACAAJQBzACAAIgAlAHMAIgAgACUAcwAAAAAAAABIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE8EAA0N5AAAMAAABSU0RTpy23SkBF2kyTNKN6F6Xh4gIAAABDOlxVc2Vyc1xWaW5heVxQcm9qZWN0c1xzaW1wbGVfbGF1bmNoZXJcUmVsZWFzZVxHVUlTaW1wbGVMYXVuY2hlci5wZGIAAACwLwAA0DEAABBoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAPQYQAAAAAAA/v///wAAAADA////AAAAAP7///8AAAAA2htAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAACBIEAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAOwiQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAA8iNAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAADSJEAAAAAAAP7///8AAAAAiP///wAAAAD+////NSZAAEkmQAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAAGC1AAAAAAAD+////AAAAANT///8AAAAA/v///wAAAAADNEAAAAAAAP7///8AAAAA2P///wAAAAD+////XzRAAGM0QAAAAAAA/v///wAAAADA////AAAAAP7///8AAAAATDZAAAAAAAD+////AAAAANj///8AAAAA/v///wAAAAACOEAA/v///wAAAAAROEAA/v///wAAAADY////AAAAAP7///8AAAAAxDlAAP7///8AAAAA0DlAAP7///8AAAAA1P///wAAAAD+////AAAAAHQ8QAAAAAAA/v///wAAAADY////AAAAAP7///8bPkAALj5AAAAAAAD+////AAAAAND///8AAAAA/v///wAAAABlTkAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAAA1TQAAAAAAA/v///wAAAADM////AAAAAP7///8AAAAAmVRAAAAAAAAAAAAAZVRAAP7///8AAAAA0P///wAAAAD+////AAAAAABWQAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAAEl5AAAAAAAD+////AAAAAMz///8AAAAA/v///wAAAADhZUAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAA5wQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAA1XJAAAAAAAD+////AAAAAMz///8AAAAA/v///wAAAACndkAAAAAAAP7///8AAAAAzP///wAAAAD+////AAAAAGSJQAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAANJFAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAADso0AAAAAAAP7///8AAAAAyP///wAAAAD+////AAAAALGlQAAAAAAAAAAAAO2kQAD+////AAAAAND///8AAAAA/v///wAAAABSp0AA6OIAAAAAAAAAAAAA2OUAAADAAAAo5AAAAAAAAAAAAADy5QAAQMEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMOQAAD7kAABQ5AAAauQAAHjkAACK5AAAnuQAALTkAADQ5AAA7OQAAALlAAAY5QAANOUAAErlAABe5QAAbuUAAH7lAACQ5QAAoOUAALjlAADK5QAA/uUAABLmAAAi5gAALuYAADrmAABM5gAAXuYAAHTmAACG5gAAmuYAALbmAADU5gAA6OYAAADnAAAY5wAAQOcAAFDnAABc5wAAdOcAAITnAACQ5wAAnucAAKznAAC25wAAzucAAN7nAAD05wAADOgAABjoAAAm6AAAMugAAEToAABS6AAAZOgAAHroAACU6AAAqugAAMToAADe6AAA7ugAAATpAAAe6QAAJukAADTpAABA6QAASukAAFbpAABo6QAAdOkAAITpAACW6QAApukAAMLpAADW6QAA5OkAAPTpAAAG6gAAFuoAAAAAAADm5QAAAAAAABkBRXhpdFByb2Nlc3MAhwFHZXRDb21tYW5kTGluZVcAcQRTZXRJbmZvcm1hdGlvbkpvYk9iamVjdABiAUZyZWVMaWJyYXJ5AKgAQ3JlYXRlUHJvY2Vzc1cAAMABR2V0Q3VycmVudFByb2Nlc3MA+QRXYWl0Rm9yU2luZ2xlT2JqZWN0AGcBR2VuZXJhdGVDb25zb2xlQ3RybEV2ZW50AAAWAEFzc2lnblByb2Nlc3NUb0pvYk9iamVjdAAA3wFHZXRFeGl0Q29kZVByb2Nlc3MAABQCR2V0TW9kdWxlRmlsZU5hbWVXAAClA1F1ZXJ5SW5mb3JtYXRpb25Kb2JPYmplY3QAZwNNdWx0aUJ5dGVUb1dpZGVDaGFyAJUAQ3JlYXRlSm9iT2JqZWN0QQAAZAJHZXRTdGRIYW5kbGUAAAICR2V0TGFzdEVycm9yAABFAkdldFByb2NBZGRyZXNzAAA8A0xvYWRMaWJyYXJ5QQAALQRTZXRDb25zb2xlQ3RybEhhbmRsZXIA6ABEdXBsaWNhdGVIYW5kbGUAUgBDbG9zZUhhbmRsZQBLRVJORUwzMi5kbGwAAEUBU3RyU3RySVcAAFNITFdBUEkuZGxsABgCR2V0TW9kdWxlSGFuZGxlVwAAygBEZWNvZGVQb2ludGVyAM8CSGVhcEZyZWUAAMsCSGVhcEFsbG9jAGkCR2V0U3RyaW5nVHlwZVcAAIYBR2V0Q29tbWFuZExpbmVBANMCSGVhcFNldEluZm9ybWF0aW9uAABjAkdldFN0YXJ0dXBJbmZvVwDABFRlcm1pbmF0ZVByb2Nlc3MAANMEVW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyAAClBFNldFVuaGFuZGxlZEV4Y2VwdGlvbkZpbHRlcgAAA0lzRGVidWdnZXJQcmVzZW50AO4ARW50ZXJDcml0aWNhbFNlY3Rpb24AADkDTGVhdmVDcml0aWNhbFNlY3Rpb24AAOMCSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbkFuZFNwaW5Db3VudADqAEVuY29kZVBvaW50ZXIAGARSdGxVbndpbmQA0QBEZWxldGVDcml0aWNhbFNlY3Rpb24APwNMb2FkTGlicmFyeVcAAMUEVGxzQWxsb2MAAMcEVGxzR2V0VmFsdWUAyARUbHNTZXRWYWx1ZQDGBFRsc0ZyZWUA7wJJbnRlcmxvY2tlZEluY3JlbWVudAAAcwRTZXRMYXN0RXJyb3IAAMUBR2V0Q3VycmVudFRocmVhZElkAADrAkludGVybG9ja2VkRGVjcmVtZW50AAAlBVdyaXRlRmlsZQDNAkhlYXBDcmVhdGUAAMADUmVhZEZpbGUAAG8EU2V0SGFuZGxlQ291bnQAAPMBR2V0RmlsZVR5cGUAZgRTZXRGaWxlUG9pbnRlcgAAEwJHZXRNb2R1bGVGaWxlTmFtZUEAAGEBRnJlZUVudmlyb25tZW50U3RyaW5nc1cAEQVXaWRlQ2hhclRvTXVsdGlCeXRlANoBR2V0RW52aXJvbm1lbnRTdHJpbmdzVwAApwNRdWVyeVBlcmZvcm1hbmNlQ291bnRlcgCTAkdldFRpY2tDb3VudAAAwQFHZXRDdXJyZW50UHJvY2Vzc0lkAHkCR2V0U3lzdGVtVGltZUFzRmlsZVRpbWUAsgRTbGVlcACPAENyZWF0ZUZpbGVXAHIBR2V0Q1BJbmZvAGgBR2V0QUNQAAA3AkdldE9FTUNQAAAKA0lzVmFsaWRDb2RlUGFnZQDUAkhlYXBTaXplAACaAUdldENvbnNvbGVDUAAArAFHZXRDb25zb2xlTW9kZQAAhwRTZXRTdGRIYW5kbGUAAAQDSXNQcm9jZXNzb3JGZWF0dXJlUHJlc2VudABXAUZsdXNoRmlsZUJ1ZmZlcnMAANICSGVhcFJlQWxsb2MAUwRTZXRFbmRPZkZpbGUAAEoCR2V0UHJvY2Vzc0hlYXAAAC0DTENNYXBTdHJpbmdXAAAkBVdyaXRlQ29uc29sZVcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAE7mQLuxGb9EAAAAAMAOQQAAAAAAwA5BAAEBAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAFgAAAAIAAAACAAAAAwAAAAIAAAAEAAAAGAAAAAUAAAANAAAABgAAAAkAAAAHAAAADAAAAAgAAAAMAAAACQAAAAwAAAAKAAAABwAAAAsAAAAIAAAADAAAABYAAAANAAAAFgAAAA8AAAACAAAAEAAAAA0AAAARAAAAEgAAABIAAAACAAAAIQAAAA0AAAA1AAAAAgAAAEEAAAANAAAAQwAAAAIAAABQAAAAEQAAAFIAAAANAAAAUwAAAA0AAABXAAAAFgAAAFkAAAALAAAAbAAAAA0AAABtAAAAIAAAAHAAAAAcAAAAcgAAAAkAAAAGAAAAFgAAAIAA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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////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AAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAcAAAAHAAAABQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///+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//////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/9/f3/pKSk/0pKSv/5+fn/xsbG/39/f//W1tb/+Pj4//f39//39/f/9vb2//b29v/19fX/9fX1//7+/v/FkVD/8OTU/+/j1v+reTz/pXY9/590Pv+ZcT//k25A/5t+Wf/////uAAAAAAAAAAAAAAAAAAAAAAAAAADW1tYCAAAAH/39/f9WVlbhPz8//3d3d/+rq6v/aWlp/4qKiv/AwMD/+fn5/+/v7//d3d3/9/f3//Dw8P/X19f/5OTk//Po2v/OoWv/uYNB/7B8O/+qeTz/pHY9/6J5Rv+ylXD/6+Tc/////4EAAAAAAAAAAAAAAAAAAAAAAAAAAD4+PjNAQEB5/v7+/35+fm9iYmLHMDAw/2tra/9AQED/jo6O/7a2tv/6+vr/+Pj4//T09P/4+Pj/8vLy/+Li4v/e3t7/9vb2//39/f///////////////////////v7+//Ly8tL7+/uBAAAAAAAA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5P/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/TU1N/5aWlv/+/v7//f39//////+xfj7/6uDT/5lxP/+Oa0H/hWlH//////QAAAAAAAAAAMHBwf/Pz8//5eXl/7m5uf9SUlL/wMDA//j4+P/6+vr/3sKi/7KCR/+jdT3/nXhL/8q6p/////+1AAAAAAAAAAC+vr7/3t7e//f39//5+fn/u7u7/5ycnP/t7e3/4eHh//7+/v/9/f3///////7+/v/s7Oz/AAAAAAAAAAAAAAAAu7u7/87Ozv/k5OT/9vb2//j4+P/39/f/39/f//r6+v/8/Pz/yMjI//n5+f/MzMz/v7+/fwAAAAAAAAAAAAAAALe3t/+5ubn/u7u7/729vf+/v7//wcHB/8PDw//FxcX/yMjI/8nJyf/Hx8f/xMTEfwAAAAAAAAAAAAAAAAAAAAB+B6xBEAesQQADrEEAA6xBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQADrEEAA6xBAAesQQAHrEEAD6xBAAABAAcAICAQAAEABADoAgAAAQAQEBAAAQAEACgBAAACACAgAAABAAgAqAgAAAMAEBAAAAEACABoBQAABAAwMAAAAQAgAKglAAAFACAgAAABACAAqBAAAAYAEBAAAAEAIABoBAAABwA8YXNzZW1ibHkgeG1sbnM9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206YXNtLnYxIiBtYW5pZmVzdFZlcnNpb249IjEuMCI+DQogIDx0cnVzdEluZm8geG1sbnM9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206YXNtLnYzIj4NCiAgICA8c2VjdXJpdHk+DQogICAgICA8cmVxdWVzdGVkUHJpdmlsZWdlcz4NCiAgICAgICAgPHJlcXVlc3RlZEV4ZWN1dGlvbkxldmVsIGxldmVsPSJhc0ludm9rZXIiIHVpQWNjZXNzPSJmYWxzZSI+PC9yZXF1ZXN0ZWRFeGVjdXRpb25MZXZlbD4NCiAgICAgIDwvcmVxdWVzdGVkUHJpdmlsZWdlcz4NCiAgICA8L3NlY3VyaXR5Pg0KICA8L3RydXN0SW5mbz4NCjwvYXNzZW1ibHk+UEFQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQUQAEAAA4AAAAAUwCzASMB8wJjArMEAwUDBjMKIwwjDVMPwwBjEeMfIxUjJrMpUyqjK2Ms8y3DLyMg8zJjM9M2AzZTOHM5wzuTPWM+Uz8zMPNBg0LjQ1ND80SzRaNF80cTR/NIQ0wzTlNAQ1XjVsNZM1xDXNNdQ1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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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SQBOACAAZQByAHIAbwByAA0ACgAAAAAAUgA2ADAAMwAzAA0ACgAtACAAQQB0AHQAZQBtAHAAdAAgAHQAbwAgAHUAcwBlACAATQBTAEkATAAgAGMAbwBkAGUAIABmAHIAbwBtACAAdABoAGkAcwAgAGEAcwBzAGUAbQBiAGwAeQAgAGQAdQByAGkAbgBnACAAbgBhAHQAaQB2AGUAIABjAG8AZABlACAAaQBuAGkAdABpAGEAbABpAHoAYQB0AGkAbwBuAAoAVABoAGkAcwAgAGkAbgBkAGkAYwBhAHQAZQBzACAAYQAgAGIAdQBnACAAaQBuACAAeQBvAHUAcgAgAGEAcABwAGwAaQBjAGEAdABpAG8AbgAuACAASQB0ACAAaQBzACAAbQBvAHMAdAAgAGwAaQBrAGUAbAB5ACAAdABoAGUAIAByAGUAcwB1AGwAdAAgAG8AZgAgAGMAYQBsAGwAaQBuAGcAIABhAG4AIABNAFMASQBMAC0AYwBvAG0AcABpAGwAZQBkACAAKAAvAGMAbAByACkAIABmAHUAbgBjAHQAaQBvAG4AIABmAHIAbwBtACAAYQAgAG4AYQB0AGkAdgBlACAAYwBvAG4AcwB0AHIAdQBjAHQAbwByACAAbwByACAAZgByAG8AbQAgAEQAbABsAE0AYQBpAG4ALgANAAoAAAAAAFIANgAwADMAMgANAAoALQAgAG4AbwB0ACAAZQBuAG8AdQBnAGgAIABzAHAAYQBjAGUAIABmAG8AcgAgAGwAbwBjAGEAbABlACAAaQBuAGYAbwByAG0AYQB0AGkAbwBuAA0ACgAAAAAAAAAAAAAAAABSADYAMAAzADEADQAKAC0AIABBAHQAdABlAG0AcAB0ACAAdABvACAAaQBuAGkAdABpAGEAbABpAHoAZQAgAHQAaABlACAAQwBSAFQAIABtAG8AcgBlACAAdABoAGEAbgAgAG8AbgBjAGUALgAKAFQAaABpAHMAIABpAG4AZABpAGMAYQB0AGUAcwAgAGEAIABiAHUAZwAgAGkAbgAgAHkAbwB1AHIAIABhAHAAcABsAGkAYwBhAHQAaQBvAG4ALgANAAoAAAAAAFIANgAwADMAMAANAAoALQAgAEMAUgBUACAAbgBvAHQAIABpAG4AaQB0AGkAYQBsAGkAegBlAGQADQAKAAAAAAAAAAAAAAAAAFIANgAwADIAOAANAAoALQAgAHUAbgBhAGIAbABlACAAdABvACAAaQBuAGkAdABpAGEAbABpAHoAZQAgAGgAZQBhAHAADQAKAAAAAAAAAAAAUgA2ADAAMgA3AA0ACgAtACAAbgBvAHQAIABlAG4AbwB1AGcAaAAgAHMAcABhAGMAZQAgAGYAbwByACAAbABvAHcAaQBvACAAaQBuAGkAdABpAGEAbABpAHoAYQB0AGkAbwBuAA0ACgAAAAAAAAAAAFIANgAwADIANgANAAoALQAgAG4AbwB0ACAAZQBuAG8AdQBnAGgAIABzAHAAYQBjAGUAIABmAG8AcgAgAHMAdABkAGkAbwAgAGkAbgBpAHQAaQBhAGwAaQB6AGEAdABpAG8AbgANAAoAAAAAAAAAAABSADYAMAAyADUADQAKAC0AIABwAHUAcgBlACAAdgBpAHIAdAB1AGEAbAAgAGYAdQBuAGMAdABpAG8AbgAgAGMAYQBsAGwADQAKAAAAAAAAAFIANgAwADIANAANAAoALQAgAG4AbwB0ACAAZQBuAG8AdQBnAGgAIABzAHAAYQBjAGUAIABmAG8AcgAgAF8AbwBuAGUAeABpAHQALwBhAHQAZQB4AGkAdAAgAHQAYQBiAGwAZQANAAoAAAAAAAAAAABSADYAMAAxADkADQAKAC0AIAB1AG4AYQBiAGwAZQAgAHQAbwAgAG8AcABlAG4AIABjAG8AbgBzAG8AbABlACAAZABlAHYAaQBjAGUADQAKAAAAAAAAAAAAAAAAAAAAAABSADYAMAAxADgADQAKAC0AIAB1AG4AZQB4AHAAZQBjAHQAZQBkACAAaABlAGEAcAAgAGUAcgByAG8AcgANAAoAAAAAAAAAAAAAAAAAAAAAAFIANgAwADEANwANAAoALQAgAHUAbgBlAHgAcABlAGMAdABlAGQAIABtAHUAbAB0AGkAdABoAHIAZQBhAGQAIABsAG8AYwBrACAAZQByAHIAbwByAA0ACgAAAAAAAAAAAFIANgAwADEANgANAAoALQAgAG4AbwB0ACAAZQBuAG8AdQBnAGgAIABzAHAAYQBjAGUAIABmAG8AcgAgAHQAaAByAGUAYQBkACAAZABhAHQAYQANAAoAAAAAAAAAAAAAAFIANgAwADEAMAANAAoALQAgAGEAYgBvAHIAdAAoACkAIABoAGEAcwAgAGIAZQBlAG4AIABjAGEAbABsAGUAZAANAAoAAAAAAAAAAAAAAAAAUgA2ADAAMAA5AA0ACgAtACAAbgBvAHQAIABlAG4AbwB1AGcAaAAgAHMAcABhAGMAZQAgAGYAbwByACAAZQBuAHYAaQByAG8AbgBtAGUAbgB0AA0ACgAAAAAAAAAAAAAAUgA2ADAAMAA4AA0ACgAtACAAbgBvAHQAIABlAG4AbwB1AGcAaAAgAHMAcABhAGMAZQAgAGYAbwByACAAYQByAGcAdQBtAGUAbgB0AHMADQAKAAAAAAAAAAAAAAAAAAAAUgA2ADAAMAAyAA0ACgAtACAAZgBsAG8AYQB0AGkAbgBnACAAcABvAGkAbgB0ACAAcwB1AHAAcABvAHIAdAAgAG4AbwB0ACAAbABvAGEAZABlAGQADQAKAAAAAAAAAAAAAgAAAAAAAAAQ7ABAAQAAAAgAAAAAAAAAsOsAQAEAAAAJAAAAAAAAAFDrAEABAAAACgAAAAAAAAAA6wBAAQAAABAAAAAAAAAAoOoAQAEAAAARAAAAAAAAAEDqAEABAAAAEgAAAAAAAADw6QBAAQAAABMAAAAAAAAAkOkAQAEAAAAYAAAAAAAAACDpAEABAAAAGQAAAAAAAADQ6ABAAQAAABoAAAAAAAAAYOgAQAEAAAAbAAAAAAAAAPDnAEABAAAAHAAAAAAAAACg5wBAAQAAAB4AAAAAAAAAWOcAQAEAAAAfAAAAAAAAAJDmAEABAAAAIAAAAAAAAAAg5gBAAQAAACEAAAAAAAAAMOQAQAEAAAB4AAAAAAAAABDkAEABAAAAeQAAAAAAAADw4wBAAQAAAHoAAAAAAAAA0OMAQAEAAAD8AAAAAAAAAMjjAEABAAAA/wAAAAAAAACo4wBAAQAAAE0AaQBjAHIAbwBzAG8AZgB0ACAAVgBpAHMAdQBhAGwAIABDACsAKwAgAFIAdQBuAHQAaQBtAGUAIABMAGkAYgByAGEAcgB5AAAAAAAKAAoAAAAAAAAAAAAuAC4ALgAAADwAcAByAG8AZwByAGEAbQAgAG4AYQBtAGUAIAB1AG4AawBuAG8AdwBuAD4AAAAAAFIAdQBuAHQAaQBtAGUAIABFAHIAcgBvAHIAIQAKAAoAUAByAG8AZwByAGEAbQA6ACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAgACAAIAAgACAAIAAgACAAKAAoACgAKAAoACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAEgAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAhACEAIQAhACEAIQAhACEAIQAhAAQABAAEAAQABAAEAAQAIEAgQCBAIEAgQCBAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAQABAAEAAQABAAEACCAIIAggCCAIIAggACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAEAAQABAAEAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAIAAgACAAIAAgACAAIAAgAGgAKAAoACgAKAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIABIABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAIQAhACEAIQAhACEAIQAhACEAIQAEAAQABAAEAAQABAAEACBAYEB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FRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn8AQwBPAE4ATwBVAFQAJAAAAHVzZXIzMi5kbGwAAAAAAABNZXNzYWdlQm94VGltZW91dEEAAAAAAABGYXRhbCBFcnJvciBpbiBMYXVuY2hlcgByAGIAAAAAAEZhaWxlZCB0byBvcGVuIGV4ZWN1dGFibGUAAAAAAAAAVW5hYmxlIHRvIGZpbmQgYW4gYXBwZW5kZWQgYXJjaGl2ZS4AAAAAAFVuYWJsZSB0byByZWFkIGZyb20gZmlsZQAAAAAjIQAAAAAAAAAAAABKb2IgaW5mb3JtYXRpb24gcXVlcnlpbmcgZmFpbGVkAEpvYiBpbmZvcm1hdGlvbiBzZXR0aW5nIGZhaWxlZAAAc3RkaW4gZHVwbGljYXRpb24gZmFpbGVkAAAAAAAAAABzdGRvdXQgZHVwbGljYXRpb24gZmFpbGVkAAAAAAAAAHN0ZGVyciBkdXBsaWNhdGlvbiBmYWlsZWQAAAAAAAAAVW5hYmxlIHRvIGNyZWF0ZSBwcm9jZXNzIHVzaW5nICclcycAAAAAAEZhaWxlZCB0byBnZXQgZXhpdCBjb2RlIG9mIHByb2Nlc3MAAAAAAAAuAGUAeABlAAAAAAAAAAAARXhwZWN0ZWQgdG8gZmluZCBhIGNvbW1hbmQgZW5kaW5nIGluICcuZXhlJyBpbiBzaGViYW5nIGxpbmUuAAAAAAAAAAAAAAAARXhwZWN0ZWQgdGVybWluYXRpbmcgZG91YmxlLXF1b3RlIGZvciBleGVjdXRhYmxlIGluIHNoZWJhbmcgbGluZS4AAAAAAAAAAAAAAAAAAABUZXJtaW5hdGluZyBxdW90ZSB3aXRob3V0IHN0YXJ0aW5nIHF1b3RlIGZvciBleGVjdXRhYmxlIGluIHNoZWJhbmcgbGluZS4AAAAAAAAAAEZhaWxlZCB0byBmaW5kIHNoZWJhbmcAAEV4cGVjdGVkIHRvIGZpbmQgdGVybWluYXRvciBpbiBzaGViYW5nIGxpbmUAAAAAAEV4cGVjdGVkIHRvIGRlY29kZSBzaGViYW5nIGxpbmUg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dhMBAAAAAACMEwEAAAAAAKYTAQAAAAAAvBMBAAAAAADWEwEAAAAAAPATAQAAAAAAABQBAAAAAAAWFAEAAAAAADAUAQAAAAAAOBQBAAAAAABGFAEAAAAAAFIUAQAAAAAAXBQBAAAAAABoFAEAAAAAAHoUAQAAAAAAhhQBAAAAAACWFAEAAAAAAKgUAQAAAAAAuBQBAAAAAADMFAEAAAAAANoUAQAAAAAA6hQBAAAAAAD8FAEAAAAAAAwVAQAAAAAAAAAAAAAAAADWEAEAAAAAAAAAAAAAAAAAHwFFeGl0UHJvY2VzcwCNAUdldENvbW1hbmRMaW5lVwB+BFNldEluZm9ybWF0aW9uSm9iT2JqZWN0AGgBRnJlZUxpYnJhcnkAqABDcmVhdGVQcm9jZXNzVwAAxgFHZXRDdXJyZW50UHJvY2VzcwAIBVdhaXRGb3JTaW5nbGVPYmplY3QAbQFHZW5lcmF0ZUNvbnNvbGVDdHJsRXZlbnQAABYAQXNzaWduUHJvY2Vzc1RvSm9iT2JqZWN0AADmAUdldEV4aXRDb2RlUHJvY2VzcwAAGgJHZXRNb2R1bGVGaWxlTmFtZVcAAKcDUXVlcnlJbmZvcm1hdGlvbkpvYk9iamVjdABpA011bHRpQnl0ZVRvV2lkZUNoYXIAlQBDcmVhdGVKb2JPYmplY3RBAABrAkdldFN0ZEhhbmRsZQAACAJHZXRMYXN0RXJyb3IAAEwCR2V0UHJvY0FkZHJlc3MAAD4DTG9hZExpYnJhcnlBAAA7BFNldENvbnNvbGVDdHJsSGFuZGxlcgDsAER1cGxpY2F0ZUhhbmRsZQBSAENsb3NlSGFuZGxlAEtFUk5FTDMyLmRsbAAARQFTdHJTdHJJVwAAU0hMV0FQSS5kbGwAHgJHZXRNb2R1bGVIYW5kbGVXAADLAERlY29kZVBvaW50ZXIA1wJIZWFwRnJlZQAA0wJIZWFwQWxsb2MAcAJHZXRTdHJpbmdUeXBlVwAAjAFHZXRDb21tYW5kTGluZUEAagJHZXRTdGFydHVwSW5mb1cAzgRUZXJtaW5hdGVQcm9jZXNzAADiBFVuaGFuZGxlZEV4Y2VwdGlvbkZpbHRlcgAAswRTZXRVbmhhbmRsZWRFeGNlcHRpb25GaWx0ZXIAAgNJc0RlYnVnZ2VyUHJlc2VudAAmBFJ0bFZpcnR1YWxVbndpbmQAAB8EUnRsTG9va3VwRnVuY3Rpb25FbnRyeQAAGARSdGxDYXB0dXJlQ29udGV4dAAlBFJ0bFVud2luZEV4APIARW50ZXJDcml0aWNhbFNlY3Rpb24AADsDTGVhdmVDcml0aWNhbFNlY3Rpb24AAOsCSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbkFuZFNwaW5Db3VudADuAEVuY29kZVBvaW50ZXIA0gBEZWxldGVDcml0aWNhbFNlY3Rpb24AQQNMb2FkTGlicmFyeVcAAFoBRmxzR2V0VmFsdWUAWwFGbHNTZXRWYWx1ZQBZAUZsc0ZyZWUAgARTZXRMYXN0RXJyb3IAAMsBR2V0Q3VycmVudFRocmVhZElkAABYAUZsc0FsbG9jAAA0BVdyaXRlRmlsZQDbAkhlYXBTZXRJbmZvcm1hdGlvbgAAqgJHZXRWZXJzaW9uAADVAkhlYXBDcmVhdGUAAMMDUmVhZEZpbGUAAHwEU2V0SGFuZGxlQ291bnQAAPoBR2V0RmlsZVR5cGUAdARTZXRGaWxlUG9pbnRlcgAAGQJHZXRNb2R1bGVGaWxlTmFtZUEAAGcBRnJlZUVudmlyb25tZW50U3RyaW5nc1cAIAVXaWRlQ2hhclRvTXVsdGlCeXRlAOEBR2V0RW52aXJvbm1lbnRTdHJpbmdzVwAAqQNRdWVyeVBlcmZvcm1hbmNlQ291bnRlcgCaAkdldFRpY2tDb3VudAAAxwFHZXRDdXJyZW50UHJvY2Vzc0lkAIACR2V0U3lzdGVtVGltZUFzRmlsZVRpbWUAwARTbGVlcACPAENyZWF0ZUZpbGVXAHgBR2V0Q1BJbmZvAG4BR2V0QUNQAAA+AkdldE9FTUNQAAAMA0lzVmFsaWRDb2RlUGFnZQDcAkhlYXBTaXplAACgAUdldENvbnNvbGVDUAAAsgFHZXRDb25zb2xlTW9kZQAAlARTZXRTdGRIYW5kbGUAAF0BRmx1c2hGaWxlQnVmZmVycwAA2gJIZWFwUmVBbGxvYwBhBFNldEVuZE9mRmlsZQAAUQJHZXRQcm9jZXNzSGVhcAAALwNMQ01hcFN0cmluZ1cAADMFV3JpdGVDb25zb2xlVwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAADKi3y2ZKwAAzV0g0mbU//8AAAAAAAAAAEBIAUABAAAAAAAAAAAAAABASAFAAQAAAAEBAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAWAAAAAgAAAAIAAAADAAAAAgAAAAQAAAAYAAAABQAAAA0AAAAGAAAACQAAAAcAAAAMAAAACAAAAAwAAAAJAAAADAAAAAoAAAAHAAAACwAAAAgAAAAMAAAAFgAAAA0AAAAWAAAADwAAAAIAAAAQAAAADQAAABEAAAASAAAAEgAAAAIAAAAhAAAADQAAADUAAAACAAAAQQAAAA0AAABDAAAAAgAAAFAAAAARAAAAUgAAAA0AAABTAAAADQAAAFcAAAAWAAAAWQAAAAsAAABsAAAADQAAAG0AAAAgAAAAcAAAABwAAAByAAAACQAAAAYAAAAWAAAAgAAAAAoAAACBAAAACgAAAIIAAAAJAAAAgwAAABYAAACEAAAADQAAAJEAAAApAAAAngAAAA0AAAChAAAAAgAAAKQAAAALAAAApwAAAA0AAAC3AAAAEQAAAM4AAAACAAAA1wAAAAsAAAAYBwAADAAAAAwAAAAIAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wAAAAAAAAAAAAAAALSEAEABAAAAtIQAQAEAAAC0hABAAQAAALSEAEABAAAAtIQAQAEAAAC0hABAAQAAALSEAEABAAAAtIQAQAEAAAC0hABAAQAAALSEAEABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQECAgICAgICAgICAgICAgICAwMDAwMDAwMAAAAAAAAAAKDvAEABAAAAovEAQAEAAAD//////////4AKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAABDAAAAAAAAAAAAAAAAAAAAMPsAQAEAAAAs+wBAAQAAACj7AEABAAAAJPsAQAEAAAAg+wBAAQAAABz7AEABAAAAGPsAQAEAAAAQ+wBAAQAAAAj7AEABAAAAAPsAQAEAAADw+gBAAQAAAOD6AEABAAAA1PoAQAEAAADI+gBA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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/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AD93d8AAAAAAP3d34AAAAAA/d3fgAAAAAD93d+AAAAAAP3d34AAAAAA/d3fgAAAAAD93d+AAAAAAP3d34AAAAAA/d3fgAAAAAH93d+AAAAAA/3d34AAAAAH/d3fgAAAAA/93d+AAAAAH/3d34AAAAA//d3fgAAAAH/93d+AAAAA//3d34AAAAH//d3fgAAAA//93d+AAAAH//3d3KAAAACAAAABAAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAHAAAABwAAAAUAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////gf///8n////2////////////////////9v///8j///+BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAABghISEwXFxcSmVlZVE2NjZENTU1QQAAADAAAAAkAAAAFQAAAAoAAAACAAAAAP///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/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pKSk7qWlpZKmpqYOAAAAAAAAAAAAAAAArKys76urq2+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+DQo8L2Fzc2VtYmx5PlBBUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFEAOAAAEQAAACworiiwKLIouCi6KJYo2CjeKyIrJisqKy4rMis2KzorPisCK0YrSitOK1IrVitaK14rYitmK2orbityK0AIAEA6AAAACCgMKCgp6insKe4p8CnyKfQp9in4Kfop/Co+KhwqXipgKmIqZCpmKmgqaipsKm4qcCpyKnQqdip4KnoqfCp+KkAqgiqEKoYqiCqKKowqjiqQKpIqlCqWKpgqmiqcKp4qoCqiKqQqpiqoKqoqrCquKrAqtiq4KroqvCq+KoAqwirEKsYqyCrKKswqzirQKtIq1CrWKtgq2ircKt4q4CriKuQq5iroKuoq7CruKvAq8ir0KvYq+Cr6Kvwq/irAKwIrBCsGKwgrCismKy4rNis+KwYrVitcK14rYCtiK2QrQAAADABADgAAADQodCi2KLooviiAKMIoxCjGKMgoyijMKM4o0CjSKNYo2CjaKNwo3ijgKOIo5CjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBLAwQUAAAAAAAAACEAX9SgqcuYAADLmAAAOQAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvZGlzdGxpYi93aGVlbC5weSMgLSotIGNvZGluZzogdXRmLTggLSotCiMKIyBDb3B5cmlnaHQgKEMpIDIwMTMtMjAxNiBWaW5heSBTYWppcC4KIyBMaWNlbnNlZCB0byB0aGUgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24gdW5kZXIgYSBjb250cmlidXRvciBhZ3JlZW1lbnQuCiMgU2VlIExJQ0VOU0UudHh0IGFuZCBDT05UUklCVVRPUlMudHh0LgojCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgdW5pY29kZV9saXRlcmFscwoKaW1wb3J0IGJhc2U2NAppbXBvcnQgY29kZWNzCmltcG9ydCBkYXRldGltZQppbXBvcnQgZGlzdHV0aWxzLnV0aWwKZnJvbSBlbWFpbCBpbXBvcnQgbWVzc2FnZV9mcm9tX2ZpbGUKaW1wb3J0IGhhc2hsaWIKaW1wb3J0IGltcAppbXBvcnQganNvbgppbXBvcnQgbG9nZ2luZwppbXBvcnQgb3MKaW1wb3J0IHBvc2l4cGF0aAppbXBvcnQgcmUKaW1wb3J0IHNodXRpbAppbXBvcnQgc3lzCmltcG9ydCB0ZW1wZmlsZQppbXBvcnQgemlwZmlsZQoKZnJvbSAuIGltcG9ydCBfX3ZlcnNpb25fXywgRGlzdGxpYkV4Y2VwdGlvbgpmcm9tIC5jb21wYXQgaW1wb3J0IHN5c2NvbmZpZywgWmlwRmlsZSwgZnNkZWNvZGUsIHRleHRfdHlwZSwgZmlsdGVyCmZyb20gLmRhdGFiYXNlIGltcG9ydCBJbnN0YWxsZWREaXN0cmlidXRpb24KZnJvbSAubWV0YWRhdGEgaW1wb3J0IE1ldGFkYXRhLCBNRVRBREFUQV9GSUxFTkFNRQpmcm9tIC51dGlsIGltcG9ydCAoRmlsZU9wZXJhdG9yLCBjb252ZXJ0X3BhdGgsIENTVlJlYWRlciwgQ1NWV3JpdGVyLCBDYWNoZSwKICAgICAgICAgICAgICAgICAgIGNhY2hlZF9wcm9wZXJ0eSwgZ2V0X2NhY2hlX2Jhc2UsIHJlYWRfZXhwb3J0cywgdGVtcGRpcikKZnJvbSAudmVyc2lvbiBpbXBvcnQgTm9ybWFsaXplZFZlcnNpb24sIFVuc3VwcG9ydGVkVmVyc2lvbkVycm9yCgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCmNhY2hlID0gTm9uZSAgICAjIGNyZWF0ZWQgd2hlbiBuZWVkZWQKCmlmIGhhc2F0dHIoc3lzLCAncHlweV92ZXJzaW9uX2luZm8nKToKICAgIElNUF9QUkVGSVggPSAncHAnCmVsaWYgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ2phdmEnKToKICAgIElNUF9QUkVGSVggPSAnanknCmVsaWYgc3lzLnBsYXRmb3JtID09ICdjbGknOgogICAgSU1QX1BSRUZJWCA9ICdpcCcKZWxzZToKICAgIElNUF9QUkVGSVggPSAnY3AnCgpWRVJfU1VGRklYID0gc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCdweV92ZXJzaW9uX25vZG90JykKaWYgbm90IFZFUl9TVUZGSVg6ICAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICBWRVJfU1VGRklYID0gJyVzJXMnICUgc3lzLnZlcnNpb25faW5mb1s6Ml0KUFlWRVIgPSAncHknICsgVkVSX1NVRkZJWApJTVBWRVIgPSBJTVBfUFJFRklYICsgVkVSX1NVRkZJWAoKQVJDSCA9IGRpc3R1dGlscy51dGlsLmdldF9wbGF0Zm9ybSgpLnJlcGxhY2UoJy0nLCAnXycpLnJlcGxhY2UoJy4nLCAnXycpCgpBQkkgPSBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoJ1NPQUJJJykKaWYgQUJJIGFuZCBBQkkuc3RhcnRzd2l0aCgnY3B5dGhvbi0nKToKICAgIEFCSSA9IEFCSS5yZXBsYWNlKCdjcHl0aG9uLScsICdjcCcpCmVsc2U6CiAgICBkZWYgX2Rlcml2ZV9hYmkoKToKICAgICAgICBwYXJ0cyA9IFsnY3AnLCBWRVJfU1VGRklYXQogICAgICAgIGlmIHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcignUHlfREVCVUcnKToKICAgICAgICAgICAgcGFydHMuYXBwZW5kKCdkJykKICAgICAgICBpZiBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoJ1dJVEhfUFlNQUxMT0MnKToKICAgICAgICAgICAgcGFydHMuYXBwZW5kKCdtJykKICAgICAgICBpZiBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoJ1B5X1VOSUNPREVfU0laRScpID09IDQ6CiAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgndScpCiAgICAgICAgcmV0dXJuICcnLmpvaW4ocGFydHMpCiAgICBBQkkgPSBfZGVyaXZlX2FiaSgpCiAgICBkZWwgX2Rlcml2ZV9hYmkKCkZJTEVOQU1FX1JFID0gcmUuY29tcGlsZShyJycnCig/UDxubT5bXi1dKykKLSg/UDx2bj5cZCtbXi1dKikKKC0oP1A8Ym4+XGQrW14tXSopKT8KLSg/UDxweT5cdytcZCsoXC5cdytcZCspKikKLSg/UDxiaT5cdyspCi0oP1A8YXI+XHcrKFwuXHcrKSopClwud2hsJAonJycsIHJlLklHTk9SRUNBU0UgfCByZS5WRVJCT1NFKQoKTkFNRV9WRVJTSU9OX1JFID0gcmUuY29tcGlsZShyJycnCig/UDxubT5bXi1dKykKLSg/UDx2bj5cZCtbXi1dKikKKC0oP1A8Ym4+XGQrW14tXSopKT8kCicnJywgcmUuSUdOT1JFQ0FTRSB8IHJlLlZFUkJPU0UpCgpTSEVCQU5HX1JFID0gcmUuY29tcGlsZShicidccyojIVteXHJcbl0qJykKU0hFQkFOR19ERVRBSUxfUkUgPSByZS5jb21waWxlKGJyJ14oXHMqIyEoIlteIl0rInxcUyspKVxzKyguKikkJykKU0hFQkFOR19QWVRIT04gPSBiJyMhcHl0aG9uJwpTSEVCQU5HX1BZVEhPTlcgPSBiJyMhcHl0aG9udycKCmlmIG9zLnNlcCA9PSAnLyc6CiAgICB0b19wb3NpeCA9IGxhbWJkYSBvOiBvCmVsc2U6CiAgICB0b19wb3NpeCA9IGxhbWJkYSBvOiBvLnJlcGxhY2Uob3Muc2VwLCAnLycpCgoKY2xhc3MgTW91bnRlcihvYmplY3QpOgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHNlbGYuaW1wdXJlX3doZWVscyA9IHt9CiAgICAgICAgc2VsZi5saWJzID0ge30KCiAgICBkZWYgYWRkKHNlbGYsIHBhdGhuYW1lLCBleHRlbnNpb25zKToKICAgICAgICBzZWxmLmltcHVyZV93aGVlbHNbcGF0aG5hbWVdID0gZXh0ZW5zaW9ucwogICAgICAgIHNlbGYubGlicy51cGRhdGUoZXh0ZW5zaW9ucykKCiAgICBkZWYgcmVtb3ZlKHNlbGYsIHBhdGhuYW1lKToKICAgICAgICBleHRlbnNpb25zID0gc2VsZi5pbXB1cmVfd2hlZWxzLnBvcChwYXRobmFtZSkKICAgICAgICBmb3IgaywgdiBpbiBleHRlbnNpb25zOgogICAgICAgICAgICBpZiBrIGluIHNlbGYubGliczoKICAgICAgICAgICAgICAgIGRlbCBzZWxmLmxpYnNba10KCiAgICBkZWYgZmluZF9tb2R1bGUoc2VsZiwgZnVsbG5hbWUsIHBhdGg9Tm9uZSk6CiAgICAgICAgaWYgZnVsbG5hbWUgaW4gc2VsZi5saWJzOgogICAgICAgICAgICByZXN1bHQgPSBzZWxmCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmVzdWx0ID0gTm9uZQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgbG9hZF9tb2R1bGUoc2VsZiwgZnVsbG5hbWUpOgogICAgICAgIGlmIGZ1bGxuYW1lIGluIHN5cy5tb2R1bGVzOgogICAgICAgICAgICByZXN1bHQgPSBzeXMubW9kdWxlc1tmdWxsbmFtZV0KICAgICAgICBlbHNlOgogICAgICAgICAgICBpZiBmdWxsbmFtZSBub3QgaW4gc2VsZi5saWJzOgogICAgICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IoJ3VuYWJsZSB0byBmaW5kIGV4dGVuc2lvbiBmb3IgJXMnICUgZnVsbG5hbWUpCiAgICAgICAgICAgIHJlc3VsdCA9IGltcC5sb2FkX2R5bmFtaWMoZnVsbG5hbWUsIHNlbGYubGlic1tmdWxsbmFtZV0pCiAgICAgICAgICAgIHJlc3VsdC5fX2xvYWRlcl9fID0gc2VsZgogICAgICAgICAgICBwYXJ0cyA9IGZ1bGxuYW1lLnJzcGxpdCgnLicsIDEpCiAgICAgICAgICAgIGlmIGxlbihwYXJ0cykgPiAxOgogICAgICAgICAgICAgICAgcmVzdWx0Ll9fcGFja2FnZV9fID0gcGFydHNbMF0KICAgICAgICByZXR1cm4gcmVzdWx0CgpfaG9vayA9IE1vdW50ZXIoKQoKCmNsYXNzIFdoZWVsKG9iamVjdCk6CiAgICAiIiIKICAgIENsYXNzIHRvIGJ1aWxkIGFuZCBpbnN0YWxsIGZyb20gV2hlZWwgZmlsZXMgKFBFUCA0MjcpLgogICAgIiIiCgogICAgd2hlZWxfdmVyc2lvbiA9ICgxLCAxKQogICAgaGFzaF9raW5kID0gJ3NoYTI1NicKCiAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZW5hbWU9Tm9uZSwgc2lnbj1GYWxzZSwgdmVyaWZ5PUZhbHNlKToKICAgICAgICAiIiIKICAgICAgICBJbml0aWFsaXNlIGFuIGluc3RhbmNlIHVzaW5nIGEgKHZhbGlkKSBmaWxlbmFtZS4KICAgICAgICAiIiIKICAgICAgICBzZWxmLnNpZ24gPSBzaWduCiAgICAgICAgc2VsZi5zaG91bGRfdmVyaWZ5ID0gdmVyaWZ5CiAgICAgICAgc2VsZi5idWlsZHZlciA9ICcnCiAgICAgICAgc2VsZi5weXZlciA9IFtQWVZFUl0KICAgICAgICBzZWxmLmFiaSA9IFsnbm9uZSddCiAgICAgICAgc2VsZi5hcmNoID0gWydhbnknXQogICAgICAgIHNlbGYuZGlybmFtZSA9IG9zLmdldGN3ZCgpCiAgICAgICAgaWYgZmlsZW5hbWUgaXMgTm9uZToKICAgICAgICAgICAgc2VsZi5uYW1lID0gJ2R1bW15JwogICAgICAgICAgICBzZWxmLnZlcnNpb24gPSAnMC4xJwogICAgICAgICAgICBzZWxmLl9maWxlbmFtZSA9IHNlbGYuZmlsZW5hbWUKICAgICAgICBlbHNlOgogICAgICAgICAgICBtID0gTkFNRV9WRVJTSU9OX1JFLm1hdGNoKGZpbGVuYW1lKQogICAgICAgICAgICBpZiBtOgogICAgICAgICAgICAgICAgaW5mbyA9IG0uZ3JvdXBkaWN0KCcnKQogICAgICAgICAgICAgICAgc2VsZi5uYW1lID0gaW5mb1snbm0nXQogICAgICAgICAgICAgICAgIyBSZWluc3RhdGUgdGhlIGxvY2FsIHZlcnNpb24gc2VwYXJhdG9yCiAgICAgICAgICAgICAgICBzZWxmLnZlcnNpb24gPSBpbmZvWyd2biddLnJlcGxhY2UoJ18nLCAnLScpCiAgICAgICAgICAgICAgICBzZWxmLmJ1aWxkdmVyID0gaW5mb1snYm4nXQogICAgICAgICAgICAgICAgc2VsZi5fZmlsZW5hbWUgPSBzZWxmLmZpbGVuYW1lCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBkaXJuYW1lLCBmaWxlbmFtZSA9IG9zLnBhdGguc3BsaXQoZmlsZW5hbWUpCiAgICAgICAgICAgICAgICBtID0gRklMRU5BTUVfUkUubWF0Y2goZmlsZW5hbWUpCiAgICAgICAgICAgICAgICBpZiBub3QgbToKICAgICAgICAgICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKCdJbnZhbGlkIG5hbWUgb3IgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZpbGVuYW1lOiAlcicgJSBmaWxlbmFtZSkKICAgICAgICAgICAgICAgIGlmIGRpcm5hbWU6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5kaXJuYW1lID0gb3MucGF0aC5hYnNwYXRoKGRpcm5hbWUpCiAgICAgICAgICAgICAgICBzZWxmLl9maWxlbmFtZSA9IGZpbGVuYW1lCiAgICAgICAgICAgICAgICBpbmZvID0gbS5ncm91cGRpY3QoJycpCiAgICAgICAgICAgICAgICBzZWxmLm5hbWUgPSBpbmZvWydubSddCiAgICAgICAgICAgICAgICBzZWxmLnZlcnNpb24gPSBpbmZvWyd2biddCiAgICAgICAgICAgICAgICBzZWxmLmJ1aWxkdmVyID0gaW5mb1snYm4nXQogICAgICAgICAgICAgICAgc2VsZi5weXZlciA9IGluZm9bJ3B5J10uc3BsaXQoJy4nKQogICAgICAgICAgICAgICAgc2VsZi5hYmkgPSBpbmZvWydiaSddLnNwbGl0KCcuJykKICAgICAgICAgICAgICAgIHNlbGYuYXJjaCA9IGluZm9bJ2FyJ10uc3BsaXQoJy4nKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGZpbGVuYW1lKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIEJ1aWxkIGFuZCByZXR1cm4gYSBmaWxlbmFtZSBmcm9tIHRoZSB2YXJpb3VzIGNvbXBvbmVudHMuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5idWlsZHZlcjoKICAgICAgICAgICAgYnVpbGR2ZXIgPSAnLScgKyBzZWxmLmJ1aWxkdmVyCiAgICAgICAgZWxzZToKICAgICAgICAgICAgYnVpbGR2ZXIgPSAnJwogICAgICAgIHB5dmVyID0gJy4nLmpvaW4oc2VsZi5weXZlcikKICAgICAgICBhYmkgPSAnLicuam9pbihzZWxmLmFiaSkKICAgICAgICBhcmNoID0gJy4nLmpvaW4oc2VsZi5hcmNoKQogICAgICAgICMgcmVwbGFjZSAtIHdpdGggXyBhcyBhIGxvY2FsIHZlcnNpb24gc2VwYXJhdG9yCiAgICAgICAgdmVyc2lvbiA9IHNlbGYudmVyc2lvbi5yZXBsYWNlKCctJywgJ18nKQogICAgICAgIHJldHVybiAnJXMtJXMlcy0lcy0lcy0lcy53aGwnICUgKHNlbGYubmFtZSwgdmVyc2lvbiwgYnVpbGR2ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHl2ZXIsIGFiaSwgYXJjaCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBleGlzdHMoc2VsZik6CiAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLmRpcm5hbWUsIHNlbGYuZmlsZW5hbWUpCiAgICAgICAgcmV0dXJuIG9zLnBhdGguaXNmaWxlKHBhdGgpCgogICAgQHByb3BlcnR5CiAgICBkZWYgdGFncyhzZWxmKToKICAgICAgICBmb3IgcHl2ZXIgaW4gc2VsZi5weXZlcjoKICAgICAgICAgICAgZm9yIGFiaSBpbiBzZWxmLmFiaToKICAgICAgICAgICAgICAgIGZvciBhcmNoIGluIHNlbGYuYXJjaDoKICAgICAgICAgICAgICAgICAgICB5aWVsZCBweXZlciwgYWJpLCBhcmNoCgogICAgQGNhY2hlZF9wcm9wZXJ0eQogICAgZGVmIG1ldGFkYXRhKHNlbGYpOgogICAgICAgIHBhdGhuYW1lID0gb3MucGF0aC5qb2luKHNlbGYuZGlybmFtZSwgc2VsZi5maWxlbmFtZSkKICAgICAgICBuYW1lX3ZlciA9ICclcy0lcycgJSAoc2VsZi5uYW1lLCBzZWxmLnZlcnNpb24pCiAgICAgICAgaW5mb19kaXIgPSAnJXMuZGlzdC1pbmZvJyAlIG5hbWVfdmVyCiAgICAgICAgd3JhcHBlciA9IGNvZGVjcy5nZXRyZWFkZXIoJ3V0Zi04JykKICAgICAgICB3aXRoIFppcEZpbGUocGF0aG5hbWUsICdyJykgYXMgemY6CiAgICAgICAgICAgIHdoZWVsX21ldGFkYXRhID0gc2VsZi5nZXRfd2hlZWxfbWV0YWRhdGEoemYpCiAgICAgICAgICAgIHd2ID0gd2hlZWxfbWV0YWRhdGFbJ1doZWVsLVZlcnNpb24nXS5zcGxpdCgnLicsIDEpCiAgICAgICAgICAgIGZpbGVfdmVyc2lvbiA9IHR1cGxlKFtpbnQoaSkgZm9yIGkgaW4gd3ZdKQogICAgICAgICAgICBpZiBmaWxlX3ZlcnNpb24gPCAoMSwgMSk6CiAgICAgICAgICAgICAgICBmbiA9ICdNRVRBREFUQScKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGZuID0gTUVUQURBVEFfRklMRU5BTUUKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgbWV0YWRhdGFfZmlsZW5hbWUgPSBwb3NpeHBhdGguam9pbihpbmZvX2RpciwgZm4pCiAgICAgICAgICAgICAgICB3aXRoIHpmLm9wZW4obWV0YWRhdGFfZmlsZW5hbWUpIGFzIGJmOgogICAgICAgICAgICAgICAgICAgIHdmID0gd3JhcHBlcihiZikKICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBNZXRhZGF0YShmaWxlb2JqPXdmKQogICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdJbnZhbGlkIHdoZWVsLCBiZWNhdXNlICVzIGlzICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21pc3NpbmcnICUgZm4pCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBnZXRfd2hlZWxfbWV0YWRhdGEoc2VsZiwgemYpOgogICAgICAgIG5hbWVfdmVyID0gJyVzLSVzJyAlIChzZWxmLm5hbWUsIHNlbGYudmVyc2lvbikKICAgICAgICBpbmZvX2RpciA9ICclcy5kaXN0LWluZm8nICUgbmFtZV92ZXIKICAgICAgICBtZXRhZGF0YV9maWxlbmFtZSA9IHBvc2l4cGF0aC5qb2luKGluZm9fZGlyLCAnV0hFRUwnKQogICAgICAgIHdpdGggemYub3BlbihtZXRhZGF0YV9maWxlbmFtZSkgYXMgYmY6CiAgICAgICAgICAgIHdmID0gY29kZWNzLmdldHJlYWRlcigndXRmLTgnKShiZikKICAgICAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2VfZnJvbV9maWxlKHdmKQogICAgICAgIHJldHVybiBkaWN0KG1lc3NhZ2UpCgogICAgQGNhY2hlZF9wcm9wZXJ0eQogICAgZGVmIGluZm8oc2VsZik6CiAgICAgICAgcGF0aG5hbWUgPSBvcy5wYXRoLmpvaW4oc2VsZi5kaXJuYW1lLCBzZWxmLmZpbGVuYW1lKQogICAgICAgIHdpdGggWmlwRmlsZShwYXRobmFtZSwgJ3InKSBhcyB6ZjoKICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5nZXRfd2hlZWxfbWV0YWRhdGEoemYpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBwcm9jZXNzX3NoZWJhbmcoc2VsZiwgZGF0YSk6CiAgICAgICAgbSA9IFNIRUJBTkdfUkUubWF0Y2goZGF0YSkKICAgICAgICBpZiBtOgogICAgICAgICAgICBlbmQgPSBtLmVuZCgpCiAgICAgICAgICAgIHNoZWJhbmcsIGRhdGFfYWZ0ZXJfc2hlYmFuZyA9IGRhdGFbOmVuZF0sIGRhdGFbZW5kOl0KICAgICAgICAgICAgIyBQcmVzZXJ2ZSBhbnkgYXJndW1lbnRzIGFmdGVyIHRoZSBpbnRlcnByZXRlcgogICAgICAgICAgICBpZiBiJ3B5dGhvbncnIGluIHNoZWJhbmcubG93ZXIoKToKICAgICAgICAgICAgICAgIHNoZWJhbmdfcHl0aG9uID0gU0hFQkFOR19QWVRIT05XCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzaGViYW5nX3B5dGhvbiA9IFNIRUJBTkdfUFlUSE9OCiAgICAgICAgICAgIG0gPSBTSEVCQU5HX0RFVEFJTF9SRS5tYXRjaChzaGViYW5nKQogICAgICAgICAgICBpZiBtOgogICAgICAgICAgICAgICAgYXJncyA9IGInICcgKyBtLmdyb3VwcygpWy0xXQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgYXJncyA9IGInJwogICAgICAgICAgICBzaGViYW5nID0gc2hlYmFuZ19weXRob24gKyBhcmdzCiAgICAgICAgICAgIGRhdGEgPSBzaGViYW5nICsgZGF0YV9hZnRlcl9zaGViYW5nCiAgICAgICAgZWxzZToKICAgICAgICAgICAgY3IgPSBkYXRhLmZpbmQoYidccicpCiAgICAgICAgICAgIGxmID0gZGF0YS5maW5kKGInXG4nKQogICAgICAgICAgICBpZiBjciA8IDAgb3IgY3IgPiBsZjoKICAgICAgICAgICAgICAgIHRlcm0gPSBiJ1xuJwogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgaWYgZGF0YVtjcjpjciArIDJdID09IGInXHJcbic6CiAgICAgICAgICAgICAgICAgICAgdGVybSA9IGInXHJcbicKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgdGVybSA9IGInXHInCiAgICAgICAgICAgIGRhdGEgPSBTSEVCQU5HX1BZVEhPTiArIHRlcm0gKyBkYXRhCiAgICAgICAgcmV0dXJuIGRhdGEKCiAgICBkZWYgZ2V0X2hhc2goc2VsZiwgZGF0YSwgaGFzaF9raW5kPU5vbmUpOgogICAgICAgIGlmIGhhc2hfa2luZCBpcyBOb25lOgogICAgICAgICAgICBoYXNoX2tpbmQgPSBzZWxmLmhhc2hfa2luZAogICAgICAgIHRyeToKICAgICAgICAgICAgaGFzaGVyID0gZ2V0YXR0cihoYXNobGliLCBoYXNoX2tpbmQpCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKCdVbnN1cHBvcnRlZCBoYXNoIGFsZ29yaXRobTogJXInICUgaGFzaF9raW5kKQogICAgICAgIHJlc3VsdCA9IGhhc2hlcihkYXRhKS5kaWdlc3QoKQogICAgICAgIHJlc3VsdCA9IGJhc2U2NC51cmxzYWZlX2I2NGVuY29kZShyZXN1bHQpLnJzdHJpcChiJz0nKS5kZWNvZGUoJ2FzY2lpJykKICAgICAgICByZXR1cm4gaGFzaF9raW5kLCByZXN1bHQKCiAgICBkZWYgd3JpdGVfcmVjb3JkKHNlbGYsIHJlY29yZHMsIHJlY29yZF9wYXRoLCBiYXNlKToKICAgICAgICByZWNvcmRzID0gbGlzdChyZWNvcmRzKSAjIG1ha2UgYSBjb3B5IGZvciBzb3J0aW5nCiAgICAgICAgcCA9IHRvX3Bvc2l4KG9zLnBhdGgucmVscGF0aChyZWNvcmRfcGF0aCwgYmFzZSkpCiAgICAgICAgcmVjb3Jkcy5hcHBlbmQoKHAsICcnLCAnJykpCiAgICAgICAgcmVjb3Jkcy5zb3J0KCkKICAgICAgICB3aXRoIENTVldyaXRlcihyZWNvcmRfcGF0aCkgYXMgd3JpdGVyOgogICAgICAgICAgICBmb3Igcm93IGluIHJlY29yZHM6CiAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVyb3cocm93KQoKICAgIGRlZiB3cml0ZV9yZWNvcmRzKHNlbGYsIGluZm8sIGxpYmRpciwgYXJjaGl2ZV9wYXRocyk6CiAgICAgICAgcmVjb3JkcyA9IFtdCiAgICAgICAgZGlzdGluZm8sIGluZm9fZGlyID0gaW5mbwogICAgICAgIGhhc2hlciA9IGdldGF0dHIoaGFzaGxpYiwgc2VsZi5oYXNoX2tpbmQpCiAgICAgICAgZm9yIGFwLCBwIGluIGFyY2hpdmVfcGF0aHM6CiAgICAgICAgICAgIHdpdGggb3BlbihwLCAncmInKSBhcyBmOgogICAgICAgICAgICAgICAgZGF0YSA9IGYucmVhZCgpCiAgICAgICAgICAgIGRpZ2VzdCA9ICclcz0lcycgJSBzZWxmLmdldF9oYXNoKGRhdGEpCiAgICAgICAgICAgIHNpemUgPSBvcy5wYXRoLmdldHNpemUocCkKICAgICAgICAgICAgcmVjb3Jkcy5hcHBlbmQoKGFwLCBkaWdlc3QsIHNpemUpKQoKICAgICAgICBwID0gb3MucGF0aC5qb2luKGRpc3RpbmZvLCAnUkVDT1JEJykKICAgICAgICBzZWxmLndyaXRlX3JlY29yZChyZWNvcmRzLCBwLCBsaWJkaXIpCiAgICAgICAgYXAgPSB0b19wb3NpeChvcy5wYXRoLmpvaW4oaW5mb19kaXIsICdSRUNPUkQnKSkKICAgICAgICBhcmNoaXZlX3BhdGhzLmFwcGVuZCgoYXAsIHApKQoKICAgIGRlZiBidWlsZF96aXAoc2VsZiwgcGF0aG5hbWUsIGFyY2hpdmVfcGF0aHMpOgogICAgICAgIHdpdGggWmlwRmlsZShwYXRobmFtZSwgJ3cnLCB6aXBmaWxlLlpJUF9ERUZMQVRFRCkgYXMgemY6CiAgICAgICAgICAgIGZvciBhcCwgcCBpbiBhcmNoaXZlX3BhdGhzOgogICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdXcm90ZSAlcyB0byAlcyBpbiB3aGVlbCcsIHAsIGFwKQogICAgICAgICAgICAgICAgemYud3JpdGUocCwgYXApCgogICAgZGVmIGJ1aWxkKHNlbGYsIHBhdGhzLCB0YWdzPU5vbmUsIHdoZWVsX3ZlcnNpb249Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgQnVpbGQgYSB3aGVlbCBmcm9tIGZpbGVzIGluIHNwZWNpZmllZCBwYXRocywgYW5kIHVzZSBhbnkgc3BlY2lmaWVkIHRhZ3MKICAgICAgICB3aGVuIGRldGVybWluaW5nIHRoZSBuYW1lIG9mIHRoZSB3aGVlbC4KICAgICAgICAiIiIKICAgICAgICBpZiB0YWdzIGlzIE5vbmU6CiAgICAgICAgICAgIHRhZ3MgPSB7fQoKICAgICAgICBsaWJrZXkgPSBsaXN0KGZpbHRlcihsYW1iZGEgbzogbyBpbiBwYXRocywgKCdwdXJlbGliJywgJ3BsYXRsaWInKSkpWzBdCiAgICAgICAgaWYgbGlia2V5ID09ICdwbGF0bGliJzoKICAgICAgICAgICAgaXNfcHVyZSA9ICdmYWxzZScKICAgICAgICAgICAgZGVmYXVsdF9weXZlciA9IFtJTVBWRVJdCiAgICAgICAgICAgIGRlZmF1bHRfYWJpID0gW0FCSV0KICAgICAgICAgICAgZGVmYXVsdF9hcmNoID0gW0FSQ0hdCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaXNfcHVyZSA9ICd0cnVlJwogICAgICAgICAgICBkZWZhdWx0X3B5dmVyID0gW1BZVkVSXQogICAgICAgICAgICBkZWZhdWx0X2FiaSA9IFsnbm9uZSddCiAgICAgICAgICAgIGRlZmF1bHRfYXJjaCA9IFsnYW55J10KCiAgICAgICAgc2VsZi5weXZlciA9IHRhZ3MuZ2V0KCdweXZlcicsIGRlZmF1bHRfcHl2ZXIpCiAgICAgICAgc2VsZi5hYmkgPSB0YWdzLmdldCgnYWJpJywgZGVmYXVsdF9hYmkpCiAgICAgICAgc2VsZi5hcmNoID0gdGFncy5nZXQoJ2FyY2gnLCBkZWZhdWx0X2FyY2gpCgogICAgICAgIGxpYmRpciA9IHBhdGhzW2xpYmtleV0KCiAgICAgICAgbmFtZV92ZXIgPSAnJXMtJXMnICUgKHNlbGYubmFtZSwgc2VsZi52ZXJzaW9uKQogICAgICAgIGRhdGFfZGlyID0gJyVzLmRhdGEnICUgbmFtZV92ZXIKICAgICAgICBpbmZvX2RpciA9ICclcy5kaXN0LWluZm8nICUgbmFtZV92ZXIKCiAgICAgICAgYXJjaGl2ZV9wYXRocyA9IFtdCgogICAgICAgICMgRmlyc3QsIHN0dWZmIHdoaWNoIGlzIG5vdCBpbiBzaXRlLXBhY2thZ2VzCiAgICAgICAgZm9yIGtleSBpbiAoJ2RhdGEnLCAnaGVhZGVycycsICdzY3JpcHRzJyk6CiAgICAgICAgICAgIGlmIGtleSBub3QgaW4gcGF0aHM6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBwYXRoID0gcGF0aHNba2V5XQogICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKHBhdGgpOgogICAgICAgICAgICAgICAgZm9yIHJvb3QsIGRpcnMsIGZpbGVzIGluIG9zLndhbGsocGF0aCk6CiAgICAgICAgICAgICAgICAgICAgZm9yIGZuIGluIGZpbGVzOgogICAgICAgICAgICAgICAgICAgICAgICBwID0gZnNkZWNvZGUob3MucGF0aC5qb2luKHJvb3QsIGZuKSkKICAgICAgICAgICAgICAgICAgICAgICAgcnAgPSBvcy5wYXRoLnJlbHBhdGgocCwgcGF0aCkKICAgICAgICAgICAgICAgICAgICAgICAgYXAgPSB0b19wb3NpeChvcy5wYXRoLmpvaW4oZGF0YV9kaXIsIGtleSwgcnApKQogICAgICAgICAgICAgICAgICAgICAgICBhcmNoaXZlX3BhdGhzLmFwcGVuZCgoYXAsIHApKQogICAgICAgICAgICAgICAgICAgICAgICBpZiBrZXkgPT0gJ3NjcmlwdHMnIGFuZCBub3QgcC5lbmRzd2l0aCgnLmV4ZScpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBvcGVuKHAsICdyYicpIGFzIGY6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGYucmVhZCgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gc2VsZi5wcm9jZXNzX3NoZWJhbmcoZGF0YSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggb3BlbihwLCAnd2InKSBhcyBmOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYud3JpdGUoZGF0YSkKCiAgICAgICAgIyBOb3csIHN0dWZmIHdoaWNoIGlzIGluIHNpdGUtcGFja2FnZXMsIG90aGVyIHRoYW4gdGhlCiAgICAgICAgIyBkaXN0aW5mbyBzdHVmZi4KICAgICAgICBwYXRoID0gbGliZGlyCiAgICAgICAgZGlzdGluZm8gPSBOb25lCiAgICAgICAgZm9yIHJvb3QsIGRpcnMsIGZpbGVzIGluIG9zLndhbGsocGF0aCk6CiAgICAgICAgICAgIGlmIHJvb3QgPT0gcGF0aDoKICAgICAgICAgICAgICAgICMgQXQgdGhlIHRvcCBsZXZlbCBvbmx5LCBzYXZlIGRpc3RpbmZvIGZvciBsYXRlcgogICAgICAgICAgICAgICAgIyBhbmQgc2tpcCBpdCBmb3Igbm93CiAgICAgICAgICAgICAgICBmb3IgaSwgZG4gaW4gZW51bWVyYXRlKGRpcnMpOgogICAgICAgICAgICAgICAgICAgIGRuID0gZnNkZWNvZGUoZG4pCiAgICAgICAgICAgICAgICAgICAgaWYgZG4uZW5kc3dpdGgoJy5kaXN0LWluZm8nKToKICAgICAgICAgICAgICAgICAgICAgICAgZGlzdGluZm8gPSBvcy5wYXRoLmpvaW4ocm9vdCwgZG4pCiAgICAgICAgICAgICAgICAgICAgICAgIGRlbCBkaXJzW2ldCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICBhc3NlcnQgZGlzdGluZm8sICcuZGlzdC1pbmZvIGRpcmVjdG9yeSBleHBlY3RlZCwgbm90IGZvdW5kJwoKICAgICAgICAgICAgZm9yIGZuIGluIGZpbGVzOgogICAgICAgICAgICAgICAgIyBjb21tZW50IG91dCBuZXh0IHN1aXRlIHRvIGxlYXZlIC5weWMgZmlsZXMgaW4KICAgICAgICAgICAgICAgIGlmIGZzZGVjb2RlKGZuKS5lbmRzd2l0aCgoJy5weWMnLCAnLnB5bycpKToKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgcCA9IG9zLnBhdGguam9pbihyb290LCBmbikKICAgICAgICAgICAgICAgIHJwID0gdG9fcG9zaXgob3MucGF0aC5yZWxwYXRoKHAsIHBhdGgpKQogICAgICAgICAgICAgICAgYXJjaGl2ZV9wYXRocy5hcHBlbmQoKHJwLCBwKSkKCiAgICAgICAgIyBOb3cgZGlzdGluZm8uIEFzc3VtZWQgdG8gYmUgZmxhdCwgaS5lLiBvcy5saXN0ZGlyIGlzIGVub3VnaC4KICAgICAgICBmaWxlcyA9IG9zLmxpc3RkaXIoZGlzdGluZm8pCiAgICAgICAgZm9yIGZuIGluIGZpbGVzOgogICAgICAgICAgICBpZiBmbiBub3QgaW4gKCdSRUNPUkQnLCAnSU5TVEFMTEVSJywgJ1NIQVJFRCcsICdXSEVFTCcpOgogICAgICAgICAgICAgICAgcCA9IGZzZGVjb2RlKG9zLnBhdGguam9pbihkaXN0aW5mbywgZm4pKQogICAgICAgICAgICAgICAgYXAgPSB0b19wb3NpeChvcy5wYXRoLmpvaW4oaW5mb19kaXIsIGZuKSkKICAgICAgICAgICAgICAgIGFyY2hpdmVfcGF0aHMuYXBwZW5kKChhcCwgcCkpCgogICAgICAgIHdoZWVsX21ldGFkYXRhID0gWwogICAgICAgICAgICAnV2hlZWwtVmVyc2lvbjogJWQuJWQnICUgKHdoZWVsX3ZlcnNpb24gb3Igc2VsZi53aGVlbF92ZXJzaW9uKSwKICAgICAgICAgICAgJ0dlbmVyYXRvcjogZGlzdGxpYiAlcycgJSBfX3ZlcnNpb25fXywKICAgICAgICAgICAgJ1Jvb3QtSXMtUHVyZWxpYjogJXMnICUgaXNfcHVyZSwKICAgICAgICBdCiAgICAgICAgZm9yIHB5dmVyLCBhYmksIGFyY2ggaW4gc2VsZi50YWdzOgogICAgICAgICAgICB3aGVlbF9tZXRhZGF0YS5hcHBlbmQoJ1RhZzogJXMtJXMtJXMnICUgKHB5dmVyLCBhYmksIGFyY2gpKQogICAgICAgIHAgPSBvcy5wYXRoLmpvaW4oZGlzdGluZm8sICdXSEVFTCcpCiAgICAgICAgd2l0aCBvcGVuKHAsICd3JykgYXMgZjoKICAgICAgICAgICAgZi53cml0ZSgnXG4nLmpvaW4od2hlZWxfbWV0YWRhdGEpKQogICAgICAgIGFwID0gdG9fcG9zaXgob3MucGF0aC5qb2luKGluZm9fZGlyLCAnV0hFRUwnKSkKICAgICAgICBhcmNoaXZlX3BhdGhzLmFwcGVuZCgoYXAsIHApKQoKICAgICAgICAjIE5vdywgYXQgbGFzdCwgUkVDT1JELgogICAgICAgICMgUGF0aHMgaW4gaGVyZSBhcmUgYXJjaGl2ZSBwYXRocyAtIG5vdGhpbmcgZWxzZSBtYWtlcyBzZW5zZS4KICAgICAgICBzZWxmLndyaXRlX3JlY29yZHMoKGRpc3RpbmZvLCBpbmZvX2RpciksIGxpYmRpciwgYXJjaGl2ZV9wYXRocykKICAgICAgICAjIE5vdywgcmVhZHkgdG8gYnVpbGQgdGhlIHppcCBmaWxlCiAgICAgICAgcGF0aG5hbWUgPSBvcy5wYXRoLmpvaW4oc2VsZi5kaXJuYW1lLCBzZWxmLmZpbGVuYW1lKQogICAgICAgIHNlbGYuYnVpbGRfemlwKHBhdGhuYW1lLCBhcmNoaXZlX3BhdGhzKQogICAgICAgIHJldHVybiBwYXRobmFtZQoKICAgIGRlZiBpbnN0YWxsKHNlbGYsIHBhdGhzLCBtYWtlciwgKiprd2FyZ3MpOgogICAgICAgICIiIgogICAgICAgIEluc3RhbGwgYSB3aGVlbCB0byB0aGUgc3BlY2lmaWVkIHBhdGhzLiBJZiBrd2FyZyBgYHdhcm5lcmBgIGlzCiAgICAgICAgc3BlY2lmaWVkLCBpdCBzaG91bGQgYmUgYSBjYWxsYWJsZSwgd2hpY2ggd2lsbCBiZSBjYWxsZWQgd2l0aCB0d28KICAgICAgICB0dXBsZXMgaW5kaWNhdGluZyB0aGUgd2hlZWwgdmVyc2lvbiBvZiB0aGlzIHNvZnR3YXJlIGFuZCB0aGUgd2hlZWwKICAgICAgICB2ZXJzaW9uIGluIHRoZSBmaWxlLCBpZiB0aGVyZSBpcyBhIGRpc2NyZXBhbmN5IGluIHRoZSB2ZXJzaW9ucy4KICAgICAgICBUaGlzIGNhbiBiZSB1c2VkIHRvIGlzc3VlIGFueSB3YXJuaW5ncyB0byByYWlzZSBhbnkgZXhjZXB0aW9ucy4KICAgICAgICBJZiBrd2FyZyBgYGxpYl9vbmx5YGAgaXMgVHJ1ZSwgb25seSB0aGUgcHVyZWxpYi9wbGF0bGliIGZpbGVzIGFyZQogICAgICAgIGluc3RhbGxlZCwgYW5kIHRoZSBoZWFkZXJzLCBzY3JpcHRzLCBkYXRhIGFuZCBkaXN0LWluZm8gbWV0YWRhdGEgYXJlCiAgICAgICAgbm90IHdyaXR0ZW4uCgogICAgICAgIFRoZSByZXR1cm4gdmFsdWUgaXMgYSA6Y2xhc3M6YEluc3RhbGxlZERpc3RyaWJ1dGlvbmAgaW5zdGFuY2UgdW5sZXNzCiAgICAgICAgYGBvcHRpb25zLmxpYl9vbmx5YGAgaXMgVHJ1ZSwgaW4gd2hpY2ggY2FzZSB0aGUgcmV0dXJuIHZhbHVlIGlzIGBgTm9uZWBgLgogICAgICAgICIiIgoKICAgICAgICBkcnlfcnVuID0gbWFrZXIuZHJ5X3J1bgogICAgICAgIHdhcm5lciA9IGt3YXJncy5nZXQoJ3dhcm5lcicpCiAgICAgICAgbGliX29ubHkgPSBrd2FyZ3MuZ2V0KCdsaWJfb25seScsIEZhbHNlKQoKICAgICAgICBwYXRobmFtZSA9IG9zLnBhdGguam9pbihzZWxmLmRpcm5hbWUsIHNlbGYuZmlsZW5hbWUpCiAgICAgICAgbmFtZV92ZXIgPSAnJXMtJXMnICUgKHNlbGYubmFtZSwgc2VsZi52ZXJzaW9uKQogICAgICAgIGRhdGFfZGlyID0gJyVzLmRhdGEnICUgbmFtZV92ZXIKICAgICAgICBpbmZvX2RpciA9ICclcy5kaXN0LWluZm8nICUgbmFtZV92ZXIKCiAgICAgICAgbWV0YWRhdGFfbmFtZSA9IHBvc2l4cGF0aC5qb2luKGluZm9fZGlyLCBNRVRBREFUQV9GSUxFTkFNRSkKICAgICAgICB3aGVlbF9tZXRhZGF0YV9uYW1lID0gcG9zaXhwYXRoLmpvaW4oaW5mb19kaXIsICdXSEVFTCcpCiAgICAgICAgcmVjb3JkX25hbWUgPSBwb3NpeHBhdGguam9pbihpbmZvX2RpciwgJ1JFQ09SRCcpCgogICAgICAgIHdyYXBwZXIgPSBjb2RlY3MuZ2V0cmVhZGVyKCd1dGYtOCcpCgogICAgICAgIHdpdGggWmlwRmlsZShwYXRobmFtZSwgJ3InKSBhcyB6ZjoKICAgICAgICAgICAgd2l0aCB6Zi5vcGVuKHdoZWVsX21ldGFkYXRhX25hbWUpIGFzIGJ3ZjoKICAgICAgICAgICAgICAgIHdmID0gd3JhcHBlcihid2YpCiAgICAgICAgICAgICAgICBtZXNzYWdlID0gbWVzc2FnZV9mcm9tX2ZpbGUod2YpCiAgICAgICAgICAgIHd2ID0gbWVzc2FnZVsnV2hlZWwtVmVyc2lvbiddLnNwbGl0KCcuJywgMSkKICAgICAgICAgICAgZmlsZV92ZXJzaW9uID0gdHVwbGUoW2ludChpKSBmb3IgaSBpbiB3dl0pCiAgICAgICAgICAgIGlmIChmaWxlX3ZlcnNpb24gIT0gc2VsZi53aGVlbF92ZXJzaW9uKSBhbmQgd2FybmVyOgogICAgICAgICAgICAgICAgd2FybmVyKHNlbGYud2hlZWxfdmVyc2lvbiwgZmlsZV92ZXJzaW9uKQoKICAgICAgICAgICAgaWYgbWVzc2FnZVsnUm9vdC1Jcy1QdXJlbGliJ10gPT0gJ3RydWUnOgogICAgICAgICAgICAgICAgbGliZGlyID0gcGF0aHNbJ3B1cmVsaWInXQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgbGliZGlyID0gcGF0aHNbJ3BsYXRsaWInXQoKICAgICAgICAgICAgcmVjb3JkcyA9IHt9CiAgICAgICAgICAgIHdpdGggemYub3BlbihyZWNvcmRfbmFtZSkgYXMgYmY6CiAgICAgICAgICAgICAgICB3aXRoIENTVlJlYWRlcihzdHJlYW09YmYpIGFzIHJlYWRlcjoKICAgICAgICAgICAgICAgICAgICBmb3Igcm93IGluIHJlYWRlcjoKICAgICAgICAgICAgICAgICAgICAgICAgcCA9IHJvd1swXQogICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRzW3BdID0gcm93CgogICAgICAgICAgICBkYXRhX3BmeCA9IHBvc2l4cGF0aC5qb2luKGRhdGFfZGlyLCAnJykKICAgICAgICAgICAgaW5mb19wZnggPSBwb3NpeHBhdGguam9pbihpbmZvX2RpciwgJycpCiAgICAgICAgICAgIHNjcmlwdF9wZnggPSBwb3NpeHBhdGguam9pbihkYXRhX2RpciwgJ3NjcmlwdHMnLCAnJykKCiAgICAgICAgICAgICMgbWFrZSBhIG5ldyBpbnN0YW5jZSByYXRoZXIgdGhhbiBhIGNvcHkgb2YgbWFrZXIncywKICAgICAgICAgICAgIyBhcyB3ZSBtdXRhdGUgaXQKICAgICAgICAgICAgZmlsZW9wID0gRmlsZU9wZXJhdG9yKGRyeV9ydW49ZHJ5X3J1bikKICAgICAgICAgICAgZmlsZW9wLnJlY29yZCA9IFRydWUgICAgIyBzbyB3ZSBjYW4gcm9sbGJhY2sgaWYgbmVlZGVkCgogICAgICAgICAgICBiYyA9IG5vdCBzeXMuZG9udF93cml0ZV9ieXRlY29kZSAgICAjIERvdWJsZSBuZWdhdGl2ZXMuIExvdmVseSEKCiAgICAgICAgICAgIG91dGZpbGVzID0gW10gICAjIGZvciBSRUNPUkQgd3JpdGluZwoKICAgICAgICAgICAgIyBmb3Igc2NyaXB0IGNvcHlpbmcvc2hlYmFuZyBwcm9jZXNzaW5nCiAgICAgICAgICAgIHdvcmtkaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKICAgICAgICAgICAgIyBzZXQgdGFyZ2V0IGRpciBsYXRlcgogICAgICAgICAgICAjIHdlIGRlZmF1bHQgYWRkX2xhdW5jaGVycyB0byBGYWxzZSwgYXMgdGhlCiAgICAgICAgICAgICMgUHl0aG9uIExhdW5jaGVyIHNob3VsZCBiZSB1c2VkIGluc3RlYWQKICAgICAgICAgICAgbWFrZXIuc291cmNlX2RpciA9IHdvcmtkaXIKICAgICAgICAgICAgbWFrZXIudGFyZ2V0X2RpciA9IE5vbmUKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgZm9yIHppbmZvIGluIHpmLmluZm9saXN0KCk6CiAgICAgICAgICAgICAgICAgICAgYXJjbmFtZSA9IHppbmZvLmZpbGVuYW1lCiAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShhcmNuYW1lLCB0ZXh0X3R5cGUpOgogICAgICAgICAgICAgICAgICAgICAgICB1X2FyY25hbWUgPSBhcmNuYW1lCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgdV9hcmNuYW1lID0gYXJjbmFtZS5kZWNvZGUoJ3V0Zi04JykKICAgICAgICAgICAgICAgICAgICAjIFRoZSBzaWduYXR1cmUgZmlsZSB3b24ndCBiZSBpbiBSRUNPUkQsCiAgICAgICAgICAgICAgICAgICAgIyBhbmQgd2UgIGRvbid0IGN1cnJlbnRseSBkb24ndCBkbyBhbnl0aGluZyB3aXRoIGl0CiAgICAgICAgICAgICAgICAgICAgaWYgdV9hcmNuYW1lLmVuZHN3aXRoKCcvUkVDT1JELmp3cycpOgogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgICAgIHJvdyA9IHJlY29yZHNbdV9hcmNuYW1lXQogICAgICAgICAgICAgICAgICAgIGlmIHJvd1syXSBhbmQgc3RyKHppbmZvLmZpbGVfc2l6ZSkgIT0gcm93WzJdOgogICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKCdzaXplIG1pc21hdGNoIGZvciAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyVzJyAlIHVfYXJjbmFtZSkKICAgICAgICAgICAgICAgICAgICBpZiByb3dbMV06CiAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQsIHZhbHVlID0gcm93WzFdLnNwbGl0KCc9JywgMSkKICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCB6Zi5vcGVuKGFyY25hbWUpIGFzIGJmOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGJmLnJlYWQoKQogICAgICAgICAgICAgICAgICAgICAgICBfLCBkaWdlc3QgPSBzZWxmLmdldF9oYXNoKGRhdGEsIGtpbmQpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGRpZ2VzdCAhPSB2YWx1ZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oJ2RpZ2VzdCBtaXNtYXRjaCBmb3IgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJXMnICUgYXJjbmFtZSkKCiAgICAgICAgICAgICAgICAgICAgaWYgbGliX29ubHkgYW5kIHVfYXJjbmFtZS5zdGFydHN3aXRoKChpbmZvX3BmeCwgZGF0YV9wZngpKToKICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdsaWJfb25seTogc2tpcHBpbmcgJXMnLCB1X2FyY25hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgICAgaXNfc2NyaXB0ID0gKHVfYXJjbmFtZS5zdGFydHN3aXRoKHNjcmlwdF9wZngpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBub3QgdV9hcmNuYW1lLmVuZHN3aXRoKCcuZXhlJykpCgogICAgICAgICAgICAgICAgICAgIGlmIHVfYXJjbmFtZS5zdGFydHN3aXRoKGRhdGFfcGZ4KToKICAgICAgICAgICAgICAgICAgICAgICAgXywgd2hlcmUsIHJwID0gdV9hcmNuYW1lLnNwbGl0KCcvJywgMikKICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZmlsZSA9IG9zLnBhdGguam9pbihwYXRoc1t3aGVyZV0sIGNvbnZlcnRfcGF0aChycCkpCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgIyBtZWFudCBmb3Igc2l0ZS1wYWNrYWdlcy4KICAgICAgICAgICAgICAgICAgICAgICAgaWYgdV9hcmNuYW1lIGluICh3aGVlbF9tZXRhZGF0YV9uYW1lLCByZWNvcmRfbmFtZSk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgICAgICAgICBvdXRmaWxlID0gb3MucGF0aC5qb2luKGxpYmRpciwgY29udmVydF9wYXRoKHVfYXJjbmFtZSkpCiAgICAgICAgICAgICAgICAgICAgaWYgbm90IGlzX3NjcmlwdDoKICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCB6Zi5vcGVuKGFyY25hbWUpIGFzIGJmOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW9wLmNvcHlfc3RyZWFtKGJmLCBvdXRmaWxlKQogICAgICAgICAgICAgICAgICAgICAgICBvdXRmaWxlcy5hcHBlbmQob3V0ZmlsZSkKICAgICAgICAgICAgICAgICAgICAgICAgIyBEb3VibGUgY2hlY2sgdGhlIGRpZ2VzdCBvZiB0aGUgd3JpdHRlbiBmaWxlCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBkcnlfcnVuIGFuZCByb3dbMV06CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIG9wZW4ob3V0ZmlsZSwgJ3JiJykgYXMgYmY6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGJmLnJlYWQoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8sIG5ld2RpZ2VzdCA9IHNlbGYuZ2V0X2hhc2goZGF0YSwga2luZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBuZXdkaWdlc3QgIT0gZGlnZXN0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKCdkaWdlc3QgbWlzbWF0Y2ggJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvbiB3cml0ZSBmb3IgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICclcycgJSBvdXRmaWxlKQogICAgICAgICAgICAgICAgICAgICAgICBpZiBiYyBhbmQgb3V0ZmlsZS5lbmRzd2l0aCgnLnB5Jyk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHljID0gZmlsZW9wLmJ5dGVfY29tcGlsZShvdXRmaWxlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGZpbGVzLmFwcGVuZChweWMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgRG9uJ3QgZ2l2ZSB1cCBpZiBieXRlLWNvbXBpbGF0aW9uIGZhaWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYnV0IGxvZyBpdCBhbmQgcGVyaGFwcyB3YXJuIHRoZSB1c2VyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ0J5dGUtY29tcGlsYXRpb24gZmFpbGVkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNfaW5mbz1UcnVlKQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGZuID0gb3MucGF0aC5iYXNlbmFtZShjb252ZXJ0X3BhdGgoYXJjbmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtuYW1lID0gb3MucGF0aC5qb2luKHdvcmtkaXIsIGZuKQogICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHpmLm9wZW4oYXJjbmFtZSkgYXMgYmY6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlb3AuY29weV9zdHJlYW0oYmYsIHdvcmtuYW1lKQoKICAgICAgICAgICAgICAgICAgICAgICAgZG4sIGZuID0gb3MucGF0aC5zcGxpdChvdXRmaWxlKQogICAgICAgICAgICAgICAgICAgICAgICBtYWtlci50YXJnZXRfZGlyID0gZG4KICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWVzID0gbWFrZXIubWFrZShmbikKICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW9wLnNldF9leGVjdXRhYmxlX21vZGUoZmlsZW5hbWVzKQogICAgICAgICAgICAgICAgICAgICAgICBvdXRmaWxlcy5leHRlbmQoZmlsZW5hbWVzKQoKICAgICAgICAgICAgICAgIGlmIGxpYl9vbmx5OgogICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnbGliX29ubHk6IHJldHVybmluZyBOb25lJykKICAgICAgICAgICAgICAgICAgICBkaXN0ID0gTm9uZQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAjIEdlbmVyYXRlIHNjcmlwdHMKCiAgICAgICAgICAgICAgICAgICAgIyBUcnkgdG8gZ2V0IHB5ZGlzdC5qc29uIHNvIHdlIGNhbiBzZWUgaWYgdGhlcmUgYXJlCiAgICAgICAgICAgICAgICAgICAgIyBhbnkgY29tbWFuZHMgdG8gZ2VuZXJhdGUuIElmIHRoaXMgZmFpbHMgKGUuZy4gYmVjYXVzZQogICAgICAgICAgICAgICAgICAgICMgb2YgYSBsZWdhY3kgd2hlZWwpLCBsb2cgYSB3YXJuaW5nIGJ1dCBkb24ndCBnaXZlIHVwLgogICAgICAgICAgICAgICAgICAgIGNvbW1hbmRzID0gTm9uZQogICAgICAgICAgICAgICAgICAgIGZpbGVfdmVyc2lvbiA9IHNlbGYuaW5mb1snV2hlZWwtVmVyc2lvbiddCiAgICAgICAgICAgICAgICAgICAgaWYgZmlsZV92ZXJzaW9uID09ICcxLjAnOgogICAgICAgICAgICAgICAgICAgICAgICAjIFVzZSBsZWdhY3kgaW5mbwogICAgICAgICAgICAgICAgICAgICAgICBlcCA9IHBvc2l4cGF0aC5qb2luKGluZm9fZGlyLCAnZW50cnlfcG9pbnRzLnR4dCcpCiAgICAgICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggemYub3BlbihlcCkgYXMgYndmOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVwZGF0YSA9IHJlYWRfZXhwb3J0cyhid2YpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kcyA9IHt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3Iga2V5IGluICgnY29uc29sZScsICdndWknKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrID0gJyVzX3NjcmlwdHMnICUga2V5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgayBpbiBlcGRhdGE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRzWyd3cmFwXyVzJyAlIGtleV0gPSBkID0ge30KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHYgaW4gZXBkYXRhW2tdLnZhbHVlcygpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9ICclczolcycgJSAodi5wcmVmaXgsIHYuc3VmZml4KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgdi5mbGFnczoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzICs9ICcgJXMnICUgdi5mbGFncwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZFt2Lm5hbWVdID0gcwogICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ1VuYWJsZSB0byByZWFkIGxlZ2FjeSBzY3JpcHQgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21ldGFkYXRhLCBzbyBjYW5ub3QgZ2VuZXJhdGUgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NjcmlwdHMnKQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggemYub3BlbihtZXRhZGF0YV9uYW1lKSBhcyBid2Y6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2YgPSB3cmFwcGVyKGJ3ZikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kcyA9IGpzb24ubG9hZCh3ZikuZ2V0KCdleHRlbnNpb25zJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBjb21tYW5kczoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZHMgPSBjb21tYW5kcy5nZXQoJ3B5dGhvbi5jb21tYW5kcycpCiAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygnVW5hYmxlIHRvIHJlYWQgSlNPTiBtZXRhZGF0YSwgc28gJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Nhbm5vdCBnZW5lcmF0ZSBzY3JpcHRzJykKICAgICAgICAgICAgICAgICAgICBpZiBjb21tYW5kczoKICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZV9zY3JpcHRzID0gY29tbWFuZHMuZ2V0KCd3cmFwX2NvbnNvbGUnLCB7fSkKICAgICAgICAgICAgICAgICAgICAgICAgZ3VpX3NjcmlwdHMgPSBjb21tYW5kcy5nZXQoJ3dyYXBfZ3VpJywge30pCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGNvbnNvbGVfc2NyaXB0cyBvciBndWlfc2NyaXB0czoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdF9kaXIgPSBwYXRocy5nZXQoJ3NjcmlwdHMnLCAnJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKHNjcmlwdF9kaXIpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1ZhbGlkIHNjcmlwdCBwYXRoIG5vdCAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3BlY2lmaWVkJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VyLnRhcmdldF9kaXIgPSBzY3JpcHRfZGlyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgaywgdiBpbiBjb25zb2xlX3NjcmlwdHMuaXRlbXMoKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHQgPSAnJXMgPSAlcycgJSAoaywgdikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZXMgPSBtYWtlci5tYWtlKHNjcmlwdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlb3Auc2V0X2V4ZWN1dGFibGVfbW9kZShmaWxlbmFtZXMpCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgZ3VpX3NjcmlwdHM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyA9IHsnZ3VpJzogVHJ1ZSB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGssIHYgaW4gZ3VpX3NjcmlwdHMuaXRlbXMoKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0ID0gJyVzID0gJXMnICUgKGssIHYpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lcyA9IG1ha2VyLm1ha2Uoc2NyaXB0LCBvcHRpb25zKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlb3Auc2V0X2V4ZWN1dGFibGVfbW9kZShmaWxlbmFtZXMpCgogICAgICAgICAgICAgICAgICAgIHAgPSBvcy5wYXRoLmpvaW4obGliZGlyLCBpbmZvX2RpcikKICAgICAgICAgICAgICAgICAgICBkaXN0ID0gSW5zdGFsbGVkRGlzdHJpYnV0aW9uKHApCgogICAgICAgICAgICAgICAgICAgICMgV3JpdGUgU0hBUkVECiAgICAgICAgICAgICAgICAgICAgcGF0aHMgPSBkaWN0KHBhdGhzKSAgICAgIyBkb24ndCBjaGFuZ2UgcGFzc2VkIGluIGRpY3QKICAgICAgICAgICAgICAgICAgICBkZWwgcGF0aHNbJ3B1cmVsaWInXQogICAgICAgICAgICAgICAgICAgIGRlbCBwYXRoc1sncGxhdGxpYiddCiAgICAgICAgICAgICAgICAgICAgcGF0aHNbJ2xpYiddID0gbGliZGlyCiAgICAgICAgICAgICAgICAgICAgcCA9IGRpc3Qud3JpdGVfc2hhcmVkX2xvY2F0aW9ucyhwYXRocywgZHJ5X3J1bikKICAgICAgICAgICAgICAgICAgICBpZiBwOgogICAgICAgICAgICAgICAgICAgICAgICBvdXRmaWxlcy5hcHBlbmQocCkKCiAgICAgICAgICAgICAgICAgICAgIyBXcml0ZSBSRUNPUkQKICAgICAgICAgICAgICAgICAgICBkaXN0LndyaXRlX2luc3RhbGxlZF9maWxlcyhvdXRmaWxlcywgcGF0aHNbJ3ByZWZpeCddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyeV9ydW4pCiAgICAgICAgICAgICAgICByZXR1cm4gZGlzdAogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOiAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICAgICAgICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKCdpbnN0YWxsYXRpb24gZmFpbGVkLicpCiAgICAgICAgICAgICAgICBmaWxlb3Aucm9sbGJhY2soKQogICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgICAgIHNodXRpbC5ybXRyZWUod29ya2RpcikKCiAgICBkZWYgX2dldF9keWxpYl9jYWNoZShzZWxmKToKICAgICAgICBnbG9iYWwgY2FjaGUKICAgICAgICBpZiBjYWNoZSBpcyBOb25lOgogICAgICAgICAgICAjIFVzZSBuYXRpdmUgc3RyaW5nIHRvIGF2b2lkIGlzc3VlcyBvbiAyLng6IHNlZSBQeXRob24gIzIwMTQwLgogICAgICAgICAgICBiYXNlID0gb3MucGF0aC5qb2luKGdldF9jYWNoZV9iYXNlKCksIHN0cignZHlsaWItY2FjaGUnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXMudmVyc2lvbls6M10pCiAgICAgICAgICAgIGNhY2hlID0gQ2FjaGUoYmFzZSkKICAgICAgICByZXR1cm4gY2FjaGUKCiAgICBkZWYgX2dldF9leHRlbnNpb25zKHNlbGYpOgogICAgICAgIHBhdGhuYW1lID0gb3MucGF0aC5qb2luKHNlbGYuZGlybmFtZSwgc2VsZi5maWxlbmFtZSkKICAgICAgICBuYW1lX3ZlciA9ICclcy0lcycgJSAoc2VsZi5uYW1lLCBzZWxmLnZlcnNpb24pCiAgICAgICAgaW5mb19kaXIgPSAnJXMuZGlzdC1pbmZvJyAlIG5hbWVfdmVyCiAgICAgICAgYXJjbmFtZSA9IHBvc2l4cGF0aC5qb2luKGluZm9fZGlyLCAnRVhURU5TSU9OUycpCiAgICAgICAgd3JhcHBlciA9IGNvZGVjcy5nZXRyZWFkZXIoJ3V0Zi04JykKICAgICAgICByZXN1bHQgPSBbXQogICAgICAgIHdpdGggWmlwRmlsZShwYXRobmFtZSwgJ3InKSBhcyB6ZjoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgd2l0aCB6Zi5vcGVuKGFyY25hbWUpIGFzIGJmOgogICAgICAgICAgICAgICAgICAgIHdmID0gd3JhcHBlcihiZikKICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25zID0ganNvbi5sb2FkKHdmKQogICAgICAgICAgICAgICAgICAgIGNhY2hlID0gc2VsZi5fZ2V0X2R5bGliX2NhY2hlKCkKICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBjYWNoZS5wcmVmaXhfdG9fZGlyKHBhdGhuYW1lKQogICAgICAgICAgICAgICAgICAgIGNhY2hlX2Jhc2UgPSBvcy5wYXRoLmpvaW4oY2FjaGUuYmFzZSwgcHJlZml4KQogICAgICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKGNhY2hlX2Jhc2UpOgogICAgICAgICAgICAgICAgICAgICAgICBvcy5tYWtlZGlycyhjYWNoZV9iYXNlKQogICAgICAgICAgICAgICAgICAgIGZvciBuYW1lLCByZWxwYXRoIGluIGV4dGVuc2lvbnMuaXRlbXMoKToKICAgICAgICAgICAgICAgICAgICAgICAgZGVzdCA9IG9zLnBhdGguam9pbihjYWNoZV9iYXNlLCBjb252ZXJ0X3BhdGgocmVscGF0aCkpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhkZXN0KToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhY3QgPSBUcnVlCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX3RpbWUgPSBvcy5zdGF0KGRlc3QpLnN0X210aW1lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX3RpbWUgPSBkYXRldGltZS5kYXRldGltZS5mcm9tdGltZXN0YW1wKGZpbGVfdGltZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSB6Zi5nZXRpbmZvKHJlbHBhdGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVlbF90aW1lID0gZGF0ZXRpbWUuZGF0ZXRpbWUoKmluZm8uZGF0ZV90aW1lKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFjdCA9IHdoZWVsX3RpbWUgPiBmaWxlX3RpbWUKICAgICAgICAgICAgICAgICAgICAgICAgaWYgZXh0cmFjdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmLmV4dHJhY3QocmVscGF0aCwgY2FjaGVfYmFzZSkKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgobmFtZSwgZGVzdCkpCiAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIGlzX2NvbXBhdGlibGUoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgRGV0ZXJtaW5lIGlmIGEgd2hlZWwgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBydW5uaW5nIHN5c3RlbS4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gaXNfY29tcGF0aWJsZShzZWxmKQoKICAgIGRlZiBpc19tb3VudGFibGUoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgRGV0ZXJtaW5lIGlmIGEgd2hlZWwgaXMgYXNzZXJ0ZWQgYXMgbW91bnRhYmxlIGJ5IGl0cyBtZXRhZGF0YS4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gVHJ1ZSAjIGZvciBub3cgLSBtZXRhZGF0YSBkZXRhaWxzIFRCRAoKICAgIGRlZiBtb3VudChzZWxmLCBhcHBlbmQ9RmFsc2UpOgogICAgICAgIHBhdGhuYW1lID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGguam9pbihzZWxmLmRpcm5hbWUsIHNlbGYuZmlsZW5hbWUpKQogICAgICAgIGlmIG5vdCBzZWxmLmlzX2NvbXBhdGlibGUoKToKICAgICAgICAgICAgbXNnID0gJ1doZWVsICVzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhpcyBQeXRob24uJyAlIHBhdGhuYW1lCiAgICAgICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24obXNnKQogICAgICAgIGlmIG5vdCBzZWxmLmlzX21vdW50YWJsZSgpOgogICAgICAgICAgICBtc2cgPSAnV2hlZWwgJXMgaXMgbWFya2VkIGFzIG5vdCBtb3VudGFibGUuJyAlIHBhdGhuYW1lCiAgICAgICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24obXNnKQogICAgICAgIGlmIHBhdGhuYW1lIGluIHN5cy5wYXRoOgogICAgICAgICAgICBsb2dnZXIuZGVidWcoJyVzIGFscmVhZHkgaW4gcGF0aCcsIHBhdGhuYW1lKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlmIGFwcGVuZDoKICAgICAgICAgICAgICAgIHN5cy5wYXRoLmFwcGVuZChwYXRobmFtZSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHN5cy5wYXRoLmluc2VydCgwLCBwYXRobmFtZSkKICAgICAgICAgICAgZXh0ZW5zaW9ucyA9IHNlbGYuX2dldF9leHRlbnNpb25zKCkKICAgICAgICAgICAgaWYgZXh0ZW5zaW9uczoKICAgICAgICAgICAgICAgIGlmIF9ob29rIG5vdCBpbiBzeXMubWV0YV9wYXRoOgogICAgICAgICAgICAgICAgICAgIHN5cy5tZXRhX3BhdGguYXBwZW5kKF9ob29rKQogICAgICAgICAgICAgICAgX2hvb2suYWRkKHBhdGhuYW1lLCBleHRlbnNpb25zKQoKICAgIGRlZiB1bm1vdW50KHNlbGYpOgogICAgICAgIHBhdGhuYW1lID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGguam9pbihzZWxmLmRpcm5hbWUsIHNlbGYuZmlsZW5hbWUpKQogICAgICAgIGlmIHBhdGhuYW1lIG5vdCBpbiBzeXMucGF0aDoKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCclcyBub3QgaW4gcGF0aCcsIHBhdGhuYW1lKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHN5cy5wYXRoLnJlbW92ZShwYXRobmFtZSkKICAgICAgICAgICAgaWYgcGF0aG5hbWUgaW4gX2hvb2suaW1wdXJlX3doZWVsczoKICAgICAgICAgICAgICAgIF9ob29rLnJlbW92ZShwYXRobmFtZSkKICAgICAgICAgICAgaWYgbm90IF9ob29rLmltcHVyZV93aGVlbHM6CiAgICAgICAgICAgICAgICBpZiBfaG9vayBpbiBzeXMubWV0YV9wYXRoOgogICAgICAgICAgICAgICAgICAgIHN5cy5tZXRhX3BhdGgucmVtb3ZlKF9ob29rKQoKICAgIGRlZiB2ZXJpZnkoc2VsZik6CiAgICAgICAgcGF0aG5hbWUgPSBvcy5wYXRoLmpvaW4oc2VsZi5kaXJuYW1lLCBzZWxmLmZpbGVuYW1lKQogICAgICAgIG5hbWVfdmVyID0gJyVzLSVzJyAlIChzZWxmLm5hbWUsIHNlbGYudmVyc2lvbikKICAgICAgICBkYXRhX2RpciA9ICclcy5kYXRhJyAlIG5hbWVfdmVyCiAgICAgICAgaW5mb19kaXIgPSAnJXMuZGlzdC1pbmZvJyAlIG5hbWVfdmVyCgogICAgICAgIG1ldGFkYXRhX25hbWUgPSBwb3NpeHBhdGguam9pbihpbmZvX2RpciwgTUVUQURBVEFfRklMRU5BTUUpCiAgICAgICAgd2hlZWxfbWV0YWRhdGFfbmFtZSA9IHBvc2l4cGF0aC5qb2luKGluZm9fZGlyLCAnV0hFRUwnKQogICAgICAgIHJlY29yZF9uYW1lID0gcG9zaXhwYXRoLmpvaW4oaW5mb19kaXIsICdSRUNPUkQnKQoKICAgICAgICB3cmFwcGVyID0gY29kZWNzLmdldHJlYWRlcigndXRmLTgnKQoKICAgICAgICB3aXRoIFppcEZpbGUocGF0aG5hbWUsICdyJykgYXMgemY6CiAgICAgICAgICAgIHdpdGggemYub3Blbih3aGVlbF9tZXRhZGF0YV9uYW1lKSBhcyBid2Y6CiAgICAgICAgICAgICAgICB3ZiA9IHdyYXBwZXIoYndmKQogICAgICAgICAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2VfZnJvbV9maWxlKHdmKQogICAgICAgICAgICB3diA9IG1lc3NhZ2VbJ1doZWVsLVZlcnNpb24nXS5zcGxpdCgnLicsIDEpCiAgICAgICAgICAgIGZpbGVfdmVyc2lvbiA9IHR1cGxlKFtpbnQoaSkgZm9yIGkgaW4gd3ZdKQogICAgICAgICAgICAjIFRPRE8gdmVyc2lvbiB2ZXJpZmljYXRpb24KCiAgICAgICAgICAgIHJlY29yZHMgPSB7fQogICAgICAgICAgICB3aXRoIHpmLm9wZW4ocmVjb3JkX25hbWUpIGFzIGJmOgogICAgICAgICAgICAgICAgd2l0aCBDU1ZSZWFkZXIoc3RyZWFtPWJmKSBhcyByZWFkZXI6CiAgICAgICAgICAgICAgICAgICAgZm9yIHJvdyBpbiByZWFkZXI6CiAgICAgICAgICAgICAgICAgICAgICAgIHAgPSByb3dbMF0KICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3Jkc1twXSA9IHJvdwoKICAgICAgICAgICAgZm9yIHppbmZvIGluIHpmLmluZm9saXN0KCk6CiAgICAgICAgICAgICAgICBhcmNuYW1lID0gemluZm8uZmlsZW5hbWUKICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoYXJjbmFtZSwgdGV4dF90eXBlKToKICAgICAgICAgICAgICAgICAgICB1X2FyY25hbWUgPSBhcmNuYW1lCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHVfYXJjbmFtZSA9IGFyY25hbWUuZGVjb2RlKCd1dGYtOCcpCiAgICAgICAgICAgICAgICBpZiAnLi4nIGluIHVfYXJjbmFtZToKICAgICAgICAgICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKCdpbnZhbGlkIGVudHJ5IGluICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3aGVlbDogJXInICUgdV9hcmNuYW1lKQoKICAgICAgICAgICAgICAgICMgVGhlIHNpZ25hdHVyZSBmaWxlIHdvbid0IGJlIGluIFJFQ09SRCwKICAgICAgICAgICAgICAgICMgYW5kIHdlICBkb24ndCBjdXJyZW50bHkgZG9uJ3QgZG8gYW55dGhpbmcgd2l0aCBpdAogICAgICAgICAgICAgICAgaWYgdV9hcmNuYW1lLmVuZHN3aXRoKCcvUkVDT1JELmp3cycpOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICByb3cgPSByZWNvcmRzW3VfYXJjbmFtZV0KICAgICAgICAgICAgICAgIGlmIHJvd1syXSBhbmQgc3RyKHppbmZvLmZpbGVfc2l6ZSkgIT0gcm93WzJdOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oJ3NpemUgbWlzbWF0Y2ggZm9yICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICclcycgJSB1X2FyY25hbWUpCiAgICAgICAgICAgICAgICBpZiByb3dbMV06CiAgICAgICAgICAgICAgICAgICAga2luZCwgdmFsdWUgPSByb3dbMV0uc3BsaXQoJz0nLCAxKQogICAgICAgICAgICAgICAgICAgIHdpdGggemYub3BlbihhcmNuYW1lKSBhcyBiZjoKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGJmLnJlYWQoKQogICAgICAgICAgICAgICAgICAgIF8sIGRpZ2VzdCA9IHNlbGYuZ2V0X2hhc2goZGF0YSwga2luZCkKICAgICAgICAgICAgICAgICAgICBpZiBkaWdlc3QgIT0gdmFsdWU6CiAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oJ2RpZ2VzdCBtaXNtYXRjaCBmb3IgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICclcycgJSBhcmNuYW1lKQoKICAgIGRlZiB1cGRhdGUoc2VsZiwgbW9kaWZpZXIsIGRlc3RfZGlyPU5vbmUsICoqa3dhcmdzKToKICAgICAgICAiIiIKICAgICAgICBVcGRhdGUgdGhlIGNvbnRlbnRzIG9mIGEgd2hlZWwgaW4gYSBnZW5lcmljIHdheS4gVGhlIG1vZGlmaWVyIHNob3VsZAogICAgICAgIGJlIGEgY2FsbGFibGUgd2hpY2ggZXhwZWN0cyBhIGRpY3Rpb25hcnkgYXJndW1lbnQ6IGl0cyBrZXlzIGFyZQogICAgICAgIGFyY2hpdmUtZW50cnkgcGF0aHMsIGFuZCBpdHMgdmFsdWVzIGFyZSBhYnNvbHV0ZSBmaWxlc3lzdGVtIHBhdGhzCiAgICAgICAgd2hlcmUgdGhlIGNvbnRlbnRzIHRoZSBjb3JyZXNwb25kaW5nIGFyY2hpdmUgZW50cmllcyBjYW4gYmUgZm91bmQuIFRoZQogICAgICAgIG1vZGlmaWVyIGlzIGZyZWUgdG8gY2hhbmdlIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZXMgcG9pbnRlZCB0bywgYWRkCiAgICAgICAgbmV3IGVudHJpZXMgYW5kIHJlbW92ZSBlbnRyaWVzLCBiZWZvcmUgcmV0dXJuaW5nLiBUaGlzIG1ldGhvZCB3aWxsCiAgICAgICAgZXh0cmFjdCB0aGUgZW50aXJlIGNvbnRlbnRzIG9mIHRoZSB3aGVlbCB0byBhIHRlbXBvcmFyeSBsb2NhdGlvbiwgY2FsbAogICAgICAgIHRoZSBtb2RpZmllciwgYW5kIHRoZW4gdXNlIHRoZSBwYXNzZWQgKGFuZCBwb3NzaWJseSB1cGRhdGVkKQogICAgICAgIGRpY3Rpb25hcnkgdG8gd3JpdGUgYSBuZXcgd2hlZWwuIElmIGBgZGVzdF9kaXJgYCBpcyBzcGVjaWZpZWQsIHRoZSBuZXcKICAgICAgICB3aGVlbCBpcyB3cml0dGVuIHRoZXJlIC0tIG90aGVyd2lzZSwgdGhlIG9yaWdpbmFsIHdoZWVsIGlzIG92ZXJ3cml0dGVuLgoKICAgICAgICBUaGUgbW9kaWZpZXIgc2hvdWxkIHJldHVybiBUcnVlIGlmIGl0IHVwZGF0ZWQgdGhlIHdoZWVsLCBlbHNlIEZhbHNlLgogICAgICAgIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHNhbWUgdmFsdWUgdGhlIG1vZGlmaWVyIHJldHVybnMuCiAgICAgICAgIiIiCgogICAgICAgIGRlZiBnZXRfdmVyc2lvbihwYXRoX21hcCwgaW5mb19kaXIpOgogICAgICAgICAgICB2ZXJzaW9uID0gcGF0aCA9IE5vbmUKICAgICAgICAgICAga2V5ID0gJyVzLyVzJyAlIChpbmZvX2RpciwgTUVUQURBVEFfRklMRU5BTUUpCiAgICAgICAgICAgIGlmIGtleSBub3QgaW4gcGF0aF9tYXA6CiAgICAgICAgICAgICAgICBrZXkgPSAnJXMvUEtHLUlORk8nICUgaW5mb19kaXIKICAgICAgICAgICAgaWYga2V5IGluIHBhdGhfbWFwOgogICAgICAgICAgICAgICAgcGF0aCA9IHBhdGhfbWFwW2tleV0KICAgICAgICAgICAgICAgIHZlcnNpb24gPSBNZXRhZGF0YShwYXRoPXBhdGgpLnZlcnNpb24KICAgICAgICAgICAgcmV0dXJuIHZlcnNpb24sIHBhdGgKCiAgICAgICAgZGVmIHVwZGF0ZV92ZXJzaW9uKHZlcnNpb24sIHBhdGgpOgogICAgICAgICAgICB1cGRhdGVkID0gTm9uZQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICB2ID0gTm9ybWFsaXplZFZlcnNpb24odmVyc2lvbikKICAgICAgICAgICAgICAgIGkgPSB2ZXJzaW9uLmZpbmQoJy0nKQogICAgICAgICAgICAgICAgaWYgaSA8IDA6CiAgICAgICAgICAgICAgICAgICAgdXBkYXRlZCA9ICclcysxJyAlIHZlcnNpb24KICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcGFydHMgPSBbaW50KHMpIGZvciBzIGluIHZlcnNpb25baSArIDE6XS5zcGxpdCgnLicpXQogICAgICAgICAgICAgICAgICAgIHBhcnRzWy0xXSArPSAxCiAgICAgICAgICAgICAgICAgICAgdXBkYXRlZCA9ICclcyslcycgJSAodmVyc2lvbls6aV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy4nLmpvaW4oc3RyKGkpIGZvciBpIGluIHBhcnRzKSkKICAgICAgICAgICAgZXhjZXB0IFVuc3VwcG9ydGVkVmVyc2lvbkVycm9yOgogICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdDYW5ub3QgdXBkYXRlIG5vbi1jb21wbGlhbnQgKFBFUC00NDApICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmVyc2lvbiAlcicsIHZlcnNpb24pCiAgICAgICAgICAgIGlmIHVwZGF0ZWQ6CiAgICAgICAgICAgICAgICBtZCA9IE1ldGFkYXRhKHBhdGg9cGF0aCkKICAgICAgICAgICAgICAgIG1kLnZlcnNpb24gPSB1cGRhdGVkCiAgICAgICAgICAgICAgICBsZWdhY3kgPSBub3QgcGF0aC5lbmRzd2l0aChNRVRBREFUQV9GSUxFTkFNRSkKICAgICAgICAgICAgICAgIG1kLndyaXRlKHBhdGg9cGF0aCwgbGVnYWN5PWxlZ2FjeSkKICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnVmVyc2lvbiB1cGRhdGVkIGZyb20gJXIgdG8gJXInLCB2ZXJzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWQpCgogICAgICAgIHBhdGhuYW1lID0gb3MucGF0aC5qb2luKHNlbGYuZGlybmFtZSwgc2VsZi5maWxlbmFtZSkKICAgICAgICBuYW1lX3ZlciA9ICclcy0lcycgJSAoc2VsZi5uYW1lLCBzZWxmLnZlcnNpb24pCiAgICAgICAgaW5mb19kaXIgPSAnJXMuZGlzdC1pbmZvJyAlIG5hbWVfdmVyCiAgICAgICAgcmVjb3JkX25hbWUgPSBwb3NpeHBhdGguam9pbihpbmZvX2RpciwgJ1JFQ09SRCcpCiAgICAgICAgd2l0aCB0ZW1wZGlyKCkgYXMgd29ya2RpcjoKICAgICAgICAgICAgd2l0aCBaaXBGaWxlKHBhdGhuYW1lLCAncicpIGFzIHpmOgogICAgICAgICAgICAgICAgcGF0aF9tYXAgPSB7fQogICAgICAgICAgICAgICAgZm9yIHppbmZvIGluIHpmLmluZm9saXN0KCk6CiAgICAgICAgICAgICAgICAgICAgYXJjbmFtZSA9IHppbmZvLmZpbGVuYW1lCiAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShhcmNuYW1lLCB0ZXh0X3R5cGUpOgogICAgICAgICAgICAgICAgICAgICAgICB1X2FyY25hbWUgPSBhcmNuYW1lCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgdV9hcmNuYW1lID0gYXJjbmFtZS5kZWNvZGUoJ3V0Zi04JykKICAgICAgICAgICAgICAgICAgICBpZiB1X2FyY25hbWUgPT0gcmVjb3JkX25hbWU6CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgICAgaWYgJy4uJyBpbiB1X2FyY25hbWU6CiAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oJ2ludmFsaWQgZW50cnkgaW4gJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3aGVlbDogJXInICUgdV9hcmNuYW1lKQogICAgICAgICAgICAgICAgICAgIHpmLmV4dHJhY3QoemluZm8sIHdvcmtkaXIpCiAgICAgICAgICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbih3b3JrZGlyLCBjb252ZXJ0X3BhdGgodV9hcmNuYW1lKSkKICAgICAgICAgICAgICAgICAgICBwYXRoX21hcFt1X2FyY25hbWVdID0gcGF0aAoKICAgICAgICAgICAgIyBSZW1lbWJlciB0aGUgdmVyc2lvbi4KICAgICAgICAgICAgb3JpZ2luYWxfdmVyc2lvbiwgXyA9IGdldF92ZXJzaW9uKHBhdGhfbWFwLCBpbmZvX2RpcikKICAgICAgICAgICAgIyBGaWxlcyBleHRyYWN0ZWQuIENhbGwgdGhlIG1vZGlmaWVyLgogICAgICAgICAgICBtb2RpZmllZCA9IG1vZGlmaWVyKHBhdGhfbWFwLCAqKmt3YXJncykKICAgICAgICAgICAgaWYgbW9kaWZpZWQ6CiAgICAgICAgICAgICAgICAjIFNvbWV0aGluZyBjaGFuZ2VkIC0gbmVlZCB0byBidWlsZCBhIG5ldyB3aGVlbC4KICAgICAgICAgICAgICAgIGN1cnJlbnRfdmVyc2lvbiwgcGF0aCA9IGdldF92ZXJzaW9uKHBhdGhfbWFwLCBpbmZvX2RpcikKICAgICAgICAgICAgICAgIGlmIGN1cnJlbnRfdmVyc2lvbiBhbmQgKGN1cnJlbnRfdmVyc2lvbiA9PSBvcmlnaW5hbF92ZXJzaW9uKToKICAgICAgICAgICAgICAgICAgICAjIEFkZCBvciB1cGRhdGUgbG9jYWwgdmVyc2lvbiB0byBzaWduaWZ5IGNoYW5nZXMuCiAgICAgICAgICAgICAgICAgICAgdXBkYXRlX3ZlcnNpb24oY3VycmVudF92ZXJzaW9uLCBwYXRoKQogICAgICAgICAgICAgICAgIyBEZWNpZGUgd2hlcmUgdGhlIG5ldyB3aGVlbCBnb2VzLgogICAgICAgICAgICAgICAgaWYgZGVzdF9kaXIgaXMgTm9uZToKICAgICAgICAgICAgICAgICAgICBmZCwgbmV3cGF0aCA9IHRlbXBmaWxlLm1rc3RlbXAoc3VmZml4PScud2hsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4PSd3aGVlbC11cGRhdGUtJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyPXdvcmtkaXIpCiAgICAgICAgICAgICAgICAgICAgb3MuY2xvc2UoZmQpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKGRlc3RfZGlyKToKICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbignTm90IGEgZGlyZWN0b3J5OiAlcicgJSBkZXN0X2RpcikKICAgICAgICAgICAgICAgICAgICBuZXdwYXRoID0gb3MucGF0aC5qb2luKGRlc3RfZGlyLCBzZWxmLmZpbGVuYW1lKQogICAgICAgICAgICAgICAgYXJjaGl2ZV9wYXRocyA9IGxpc3QocGF0aF9tYXAuaXRlbXMoKSkKICAgICAgICAgICAgICAgIGRpc3RpbmZvID0gb3MucGF0aC5qb2luKHdvcmtkaXIsIGluZm9fZGlyKQogICAgICAgICAgICAgICAgaW5mbyA9IGRpc3RpbmZvLCBpbmZvX2RpcgogICAgICAgICAgICAgICAgc2VsZi53cml0ZV9yZWNvcmRzKGluZm8sIHdvcmtkaXIsIGFyY2hpdmVfcGF0aHMpCiAgICAgICAgICAgICAgICBzZWxmLmJ1aWxkX3ppcChuZXdwYXRoLCBhcmNoaXZlX3BhdGhzKQogICAgICAgICAgICAgICAgaWYgZGVzdF9kaXIgaXMgTm9uZToKICAgICAgICAgICAgICAgICAgICBzaHV0aWwuY29weWZpbGUobmV3cGF0aCwgcGF0aG5hbWUpCiAgICAgICAgcmV0dXJuIG1vZGlmaWVkCgpkZWYgY29tcGF0aWJsZV90YWdzKCk6CiAgICAiIiIKICAgIFJldHVybiAocHl2ZXIsIGFiaSwgYXJjaCkgdHVwbGVzIGNvbXBhdGlibGUgd2l0aCB0aGlzIFB5dGhvbi4KICAgICIiIgogICAgdmVyc2lvbnMgPSBbVkVSX1NVRkZJWF0KICAgIG1ham9yID0gVkVSX1NVRkZJWFswXQogICAgZm9yIG1pbm9yIGluIHJhbmdlKHN5cy52ZXJzaW9uX2luZm9bMV0gLSAxLCAtIDEsIC0xKToKICAgICAgICB2ZXJzaW9ucy5hcHBlbmQoJycuam9pbihbbWFqb3IsIHN0cihtaW5vcildKSkKCiAgICBhYmlzID0gW10KICAgIGZvciBzdWZmaXgsIF8sIF8gaW4gaW1wLmdldF9zdWZmaXhlcygpOgogICAgICAgIGlmIHN1ZmZpeC5zdGFydHN3aXRoKCcuYWJpJyk6CiAgICAgICAgICAgIGFiaXMuYXBwZW5kKHN1ZmZpeC5zcGxpdCgnLicsIDIpWzFdKQogICAgYWJpcy5zb3J0KCkKICAgIGlmIEFCSSAhPSAnbm9uZSc6CiAgICAgICAgYWJpcy5pbnNlcnQoMCwgQUJJKQogICAgYWJpcy5hcHBlbmQoJ25vbmUnKQogICAgcmVzdWx0ID0gW10KCiAgICBhcmNoZXMgPSBbQVJDSF0KICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJzoKICAgICAgICBtID0gcmUubWF0Y2goJyhcdyspXyhcZCspXyhcZCspXyhcdyspJCcsIEFSQ0gpCiAgICAgICAgaWYgbToKICAgICAgICAgICAgbmFtZSwgbWFqb3IsIG1pbm9yLCBhcmNoID0gbS5ncm91cHMoKQogICAgICAgICAgICBtaW5vciA9IGludChtaW5vcikKICAgICAgICAgICAgbWF0Y2hlcyA9IFthcmNoXQogICAgICAgICAgICBpZiBhcmNoIGluICgnaTM4NicsICdwcGMnKToKICAgICAgICAgICAgICAgIG1hdGNoZXMuYXBwZW5kKCdmYXQnKQogICAgICAgICAgICBpZiBhcmNoIGluICgnaTM4NicsICdwcGMnLCAneDg2XzY0Jyk6CiAgICAgICAgICAgICAgICBtYXRjaGVzLmFwcGVuZCgnZmF0MycpCiAgICAgICAgICAgIGlmIGFyY2ggaW4gKCdwcGM2NCcsICd4ODZfNjQnKToKICAgICAgICAgICAgICAgIG1hdGNoZXMuYXBwZW5kKCdmYXQ2NCcpCiAgICAgICAgICAgIGlmIGFyY2ggaW4gKCdpMzg2JywgJ3g4Nl82NCcpOgogICAgICAgICAgICAgICAgbWF0Y2hlcy5hcHBlbmQoJ2ludGVsJykKICAgICAgICAgICAgaWYgYXJjaCBpbiAoJ2kzODYnLCAneDg2XzY0JywgJ2ludGVsJywgJ3BwYycsICdwcGM2NCcpOgogICAgICAgICAgICAgICAgbWF0Y2hlcy5hcHBlbmQoJ3VuaXZlcnNhbCcpCiAgICAgICAgICAgIHdoaWxlIG1pbm9yID49IDA6CiAgICAgICAgICAgICAgICBmb3IgbWF0Y2ggaW4gbWF0Y2hlczoKICAgICAgICAgICAgICAgICAgICBzID0gJyVzXyVzXyVzXyVzJyAlIChuYW1lLCBtYWpvciwgbWlub3IsIG1hdGNoKQogICAgICAgICAgICAgICAgICAgIGlmIHMgIT0gQVJDSDogICAjIGFscmVhZHkgdGhlcmUKICAgICAgICAgICAgICAgICAgICAgICAgYXJjaGVzLmFwcGVuZChzKQogICAgICAgICAgICAgICAgbWlub3IgLT0gMQoKICAgICMgTW9zdCBzcGVjaWZpYyAtIG91ciBQeXRob24gdmVyc2lvbiwgQUJJIGFuZCBhcmNoCiAgICBmb3IgYWJpIGluIGFiaXM6CiAgICAgICAgZm9yIGFyY2ggaW4gYXJjaGVzOgogICAgICAgICAgICByZXN1bHQuYXBwZW5kKCgnJy5qb2luKChJTVBfUFJFRklYLCB2ZXJzaW9uc1swXSkpLCBhYmksIGFyY2gpKQoKICAgICMgd2hlcmUgbm8gQUJJIC8gYXJjaCBkZXBlbmRlbmN5LCBidXQgSU1QX1BSRUZJWCBkZXBlbmRlbmN5CiAgICBmb3IgaSwgdmVyc2lvbiBpbiBlbnVtZXJhdGUodmVyc2lvbnMpOgogICAgICAgIHJlc3VsdC5hcHBlbmQoKCcnLmpvaW4oKElNUF9QUkVGSVgsIHZlcnNpb24pKSwgJ25vbmUnLCAnYW55JykpCiAgICAgICAgaWYgaSA9PSAwOgogICAgICAgICAgICByZXN1bHQuYXBwZW5kKCgnJy5qb2luKChJTVBfUFJFRklYLCB2ZXJzaW9uWzBdKSksICdub25lJywgJ2FueScpKQoKICAgICMgbm8gSU1QX1BSRUZJWCwgQUJJIG9yIGFyY2ggZGVwZW5kZW5jeQogICAgZm9yIGksIHZlcnNpb24gaW4gZW51bWVyYXRlKHZlcnNpb25zKToKICAgICAgICByZXN1bHQuYXBwZW5kKCgnJy5qb2luKCgncHknLCB2ZXJzaW9uKSksICdub25lJywgJ2FueScpKQogICAgICAgIGlmIGkgPT0gMDoKICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgoJycuam9pbigoJ3B5JywgdmVyc2lvblswXSkpLCAnbm9uZScsICdhbnknKSkKICAgIHJldHVybiBzZXQocmVzdWx0KQoKCkNPTVBBVElCTEVfVEFHUyA9IGNvbXBhdGlibGVfdGFncygpCgpkZWwgY29tcGF0aWJsZV90YWdzCgoKZGVmIGlzX2NvbXBhdGlibGUod2hlZWwsIHRhZ3M9Tm9uZSk6CiAgICBpZiBub3QgaXNpbnN0YW5jZSh3aGVlbCwgV2hlZWwpOgogICAgICAgIHdoZWVsID0gV2hlZWwod2hlZWwpICAgICMgYXNzdW1lIGl0J3MgYSBmaWxlbmFtZQogICAgcmVzdWx0ID0gRmFsc2UKICAgIGlmIHRhZ3MgaXMgTm9uZToKICAgICAgICB0YWdzID0gQ09NUEFUSUJMRV9UQUdTCiAgICBmb3IgdmVyLCBhYmksIGFyY2ggaW4gdGFnczoKICAgICAgICBpZiB2ZXIgaW4gd2hlZWwucHl2ZXIgYW5kIGFiaSBpbiB3aGVlbC5hYmkgYW5kIGFyY2ggaW4gd2hlZWwuYXJjaDoKICAgICAgICAgICAgcmVzdWx0ID0gVHJ1ZQogICAgICAgICAgICBicmVhawogICAgcmV0dXJuIHJlc3VsdApQSwMEFAAAAAAAAAAhAJHBwK7NlQAAzZUAADIAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3Ryby5weSMgQ29weXJpZ2h0IDIwMTUsMjAxNiBOaXIgQ29oZW4KIwojIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwojIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIwojIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAojCiMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQojIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAojIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoKIiIiClRoZSBgYGRpc3Ryb2BgIHBhY2thZ2UgKGBgZGlzdHJvYGAgc3RhbmRzIGZvciBMaW51eCBEaXN0cmlidXRpb24pIHByb3ZpZGVzCmluZm9ybWF0aW9uIGFib3V0IHRoZSBMaW51eCBkaXN0cmlidXRpb24gaXQgcnVucyBvbiwgc3VjaCBhcyBhIHJlbGlhYmxlCm1hY2hpbmUtcmVhZGFibGUgZGlzdHJvIElELCBvciB2ZXJzaW9uIGluZm9ybWF0aW9uLgoKSXQgaXMgYSByZW5ld2VkIGFsdGVybmF0aXZlIGltcGxlbWVudGF0aW9uIGZvciBQeXRob24ncyBvcmlnaW5hbAo6cHk6ZnVuYzpgcGxhdGZvcm0ubGludXhfZGlzdHJpYnV0aW9uYCBmdW5jdGlvbiwgYnV0IGl0IHByb3ZpZGVzIG11Y2ggbW9yZQpmdW5jdGlvbmFsaXR5LiBBbiBhbHRlcm5hdGl2ZSBpbXBsZW1lbnRhdGlvbiBiZWNhbWUgbmVjZXNzYXJ5IGJlY2F1c2UgUHl0aG9uCjMuNSBkZXByZWNhdGVkIHRoaXMgZnVuY3Rpb24sIGFuZCBQeXRob24gMy43IGlzIGV4cGVjdGVkIHRvIHJlbW92ZSBpdAphbHRvZ2V0aGVyLiBJdHMgcHJlZGVjZXNzb3IgZnVuY3Rpb24gOnB5OmZ1bmM6YHBsYXRmb3JtLmRpc3RgIHdhcyBhbHJlYWR5CmRlcHJlY2F0ZWQgc2luY2UgUHl0aG9uIDIuNiBhbmQgaXMgYWxzbyBleHBlY3RlZCB0byBiZSByZW1vdmVkIGluIFB5dGhvbiAzLjcuClN0aWxsLCB0aGVyZSBhcmUgbWFueSBjYXNlcyBpbiB3aGljaCBhY2Nlc3MgdG8gTGludXggZGlzdHJpYnV0aW9uIGluZm9ybWF0aW9uCmlzIG5lZWRlZC4gU2VlIGBQeXRob24gaXNzdWUgMTMyMiA8aHR0cHM6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUxMzIyPmBfIGZvcgptb3JlIGluZm9ybWF0aW9uLgoiIiIKCmltcG9ydCBvcwppbXBvcnQgcmUKaW1wb3J0IHN5cwppbXBvcnQganNvbgppbXBvcnQgc2hsZXgKaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IHN1YnByb2Nlc3MKCgppZiBub3Qgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ2xpbnV4Jyk6CiAgICByYWlzZSBJbXBvcnRFcnJvcignVW5zdXBwb3J0ZWQgcGxhdGZvcm06IHswfScuZm9ybWF0KHN5cy5wbGF0Zm9ybSkpCgpfVU5JWENPTkZESVIgPSAnL2V0YycKX09TX1JFTEVBU0VfQkFTRU5BTUUgPSAnb3MtcmVsZWFzZScKCiM6IFRyYW5zbGF0aW9uIHRhYmxlIGZvciBub3JtYWxpemluZyB0aGUgIklEIiBhdHRyaWJ1dGUgZGVmaW5lZCBpbiBvcy1yZWxlYXNlCiM6IGZpbGVzLCBmb3IgdXNlIGJ5IHRoZSA6ZnVuYzpgZGlzdHJvLmlkYCBtZXRob2QuCiM6CiM6ICogS2V5OiBWYWx1ZSBhcyBkZWZpbmVkIGluIHRoZSBvcy1yZWxlYXNlIGZpbGUsIHRyYW5zbGF0ZWQgdG8gbG93ZXIgY2FzZSwKIzogICB3aXRoIGJsYW5rcyB0cmFuc2xhdGVkIHRvIHVuZGVyc2NvcmVzLgojOgojOiAqIFZhbHVlOiBOb3JtYWxpemVkIHZhbHVlLgpOT1JNQUxJWkVEX09TX0lEID0ge30KCiM6IFRyYW5zbGF0aW9uIHRhYmxlIGZvciBub3JtYWxpemluZyB0aGUgIkRpc3RyaWJ1dG9yIElEIiBhdHRyaWJ1dGUgcmV0dXJuZWQgYnkKIzogdGhlIGxzYl9yZWxlYXNlIGNvbW1hbmQsIGZvciB1c2UgYnkgdGhlIDpmdW5jOmBkaXN0cm8uaWRgIG1ldGhvZC4KIzoKIzogKiBLZXk6IFZhbHVlIGFzIHJldHVybmVkIGJ5IHRoZSBsc2JfcmVsZWFzZSBjb21tYW5kLCB0cmFuc2xhdGVkIHRvIGxvd2VyCiM6ICAgY2FzZSwgd2l0aCBibGFua3MgdHJhbnNsYXRlZCB0byB1bmRlcnNjb3Jlcy4KIzoKIzogKiBWYWx1ZTogTm9ybWFsaXplZCB2YWx1ZS4KTk9STUFMSVpFRF9MU0JfSUQgPSB7CiAgICAnZW50ZXJwcmlzZWVudGVycHJpc2UnOiAnb3JhY2xlJywgICMgT3JhY2xlIEVudGVycHJpc2UgTGludXgKICAgICdyZWRoYXRlbnRlcnByaXNld29ya3N0YXRpb24nOiAncmhlbCcsICAjIFJIRUwgNi43Cn0KCiM6IFRyYW5zbGF0aW9uIHRhYmxlIGZvciBub3JtYWxpemluZyB0aGUgZGlzdHJvIElEIGRlcml2ZWQgZnJvbSB0aGUgZmlsZSBuYW1lCiM6IG9mIGRpc3RybyByZWxlYXNlIGZpbGVzLCBmb3IgdXNlIGJ5IHRoZSA6ZnVuYzpgZGlzdHJvLmlkYCBtZXRob2QuCiM6CiM6ICogS2V5OiBWYWx1ZSBhcyBkZXJpdmVkIGZyb20gdGhlIGZpbGUgbmFtZSBvZiBhIGRpc3RybyByZWxlYXNlIGZpbGUsCiM6ICAgdHJhbnNsYXRlZCB0byBsb3dlciBjYXNlLCB3aXRoIGJsYW5rcyB0cmFuc2xhdGVkIHRvIHVuZGVyc2NvcmVzLgojOgojOiAqIFZhbHVlOiBOb3JtYWxpemVkIHZhbHVlLgpOT1JNQUxJWkVEX0RJU1RST19JRCA9IHsKICAgICdyZWRoYXQnOiAncmhlbCcsICAjIFJIRUwgNi54LCA3LngKfQoKIyBQYXR0ZXJuIGZvciBjb250ZW50IG9mIGRpc3RybyByZWxlYXNlIGZpbGUgKHJldmVyc2VkKQpfRElTVFJPX1JFTEVBU0VfQ09OVEVOVF9SRVZFUlNFRF9QQVRURVJOID0gcmUuY29tcGlsZSgKICAgIHInKD86W14pXSpcKSguKilcKCk/ICooPzpTVEwgKT8oW1xkLitcLWEtel0qXGQpICooPzplc2FlbGVyICopPyguKyknKQoKIyBQYXR0ZXJuIGZvciBiYXNlIGZpbGUgbmFtZSBvZiBkaXN0cm8gcmVsZWFzZSBmaWxlCl9ESVNUUk9fUkVMRUFTRV9CQVNFTkFNRV9QQVRURVJOID0gcmUuY29tcGlsZSgKICAgIHInKFx3KylbLV9dKHJlbGVhc2V8dmVyc2lvbikkJykKCiMgQmFzZSBmaWxlIG5hbWVzIHRvIGJlIGlnbm9yZWQgd2hlbiBzZWFyY2hpbmcgZm9yIGRpc3RybyByZWxlYXNlIGZpbGUKX0RJU1RST19SRUxFQVNFX0lHTk9SRV9CQVNFTkFNRVMgPSAoCiAgICAnZGViaWFuX3ZlcnNpb24nLAogICAgJ2xzYi1yZWxlYXNlJywKICAgICdvZW0tcmVsZWFzZScsCiAgICBfT1NfUkVMRUFTRV9CQVNFTkFNRSwKICAgICdzeXN0ZW0tcmVsZWFzZScKKQoKCmRlZiBsaW51eF9kaXN0cmlidXRpb24oZnVsbF9kaXN0cmlidXRpb25fbmFtZT1UcnVlKToKICAgICIiIgogICAgUmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IExpbnV4IGRpc3RyaWJ1dGlvbiBhcyBhIHR1cGxlCiAgICBgYChpZF9uYW1lLCB2ZXJzaW9uLCBjb2RlbmFtZSlgYCB3aXRoIGl0ZW1zIGFzIGZvbGxvd3M6CgogICAgKiBgYGlkX25hbWVgYDogIElmICpmdWxsX2Rpc3RyaWJ1dGlvbl9uYW1lKiBpcyBmYWxzZSwgdGhlIHJlc3VsdCBvZgogICAgICA6ZnVuYzpgZGlzdHJvLmlkYC4gT3RoZXJ3aXNlLCB0aGUgcmVzdWx0IG9mIDpmdW5jOmBkaXN0cm8ubmFtZWAuCgogICAgKiBgYHZlcnNpb25gYDogIFRoZSByZXN1bHQgb2YgOmZ1bmM6YGRpc3Ryby52ZXJzaW9uYC4KCiAgICAqIGBgY29kZW5hbWVgYDogIFRoZSByZXN1bHQgb2YgOmZ1bmM6YGRpc3Ryby5jb2RlbmFtZWAuCgogICAgVGhlIGludGVyZmFjZSBvZiB0aGlzIGZ1bmN0aW9uIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgb3JpZ2luYWwKICAgIDpweTpmdW5jOmBwbGF0Zm9ybS5saW51eF9kaXN0cmlidXRpb25gIGZ1bmN0aW9uLCBzdXBwb3J0aW5nIGEgc3Vic2V0IG9mCiAgICBpdHMgcGFyYW1ldGVycy4KCiAgICBUaGUgZGF0YSBpdCByZXR1cm5zIG1heSBub3QgZXhhY3RseSBiZSB0aGUgc2FtZSwgYmVjYXVzZSBpdCB1c2VzIG1vcmUgZGF0YQogICAgc291cmNlcyB0aGFuIHRoZSBvcmlnaW5hbCBmdW5jdGlvbiwgYW5kIHRoYXQgbWF5IGxlYWQgdG8gZGlmZmVyZW50IGRhdGEgaWYKICAgIHRoZSBMaW51eCBkaXN0cmlidXRpb24gaXMgbm90IGNvbnNpc3RlbnQgYWNyb3NzIG11bHRpcGxlIGRhdGEgc291cmNlcyBpdAogICAgcHJvdmlkZXMgKHRoZXJlIGFyZSBpbmRlZWQgc3VjaCBkaXN0cmlidXRpb25zIC4uLikuCgogICAgQW5vdGhlciByZWFzb24gZm9yIGRpZmZlcmVuY2VzIGlzIHRoZSBmYWN0IHRoYXQgdGhlIDpmdW5jOmBkaXN0cm8uaWRgCiAgICBtZXRob2Qgbm9ybWFsaXplcyB0aGUgZGlzdHJvIElEIHN0cmluZyB0byBhIHJlbGlhYmxlIG1hY2hpbmUtcmVhZGFibGUgdmFsdWUKICAgIGZvciBhIG51bWJlciBvZiBwb3B1bGFyIExpbnV4IGRpc3RyaWJ1dGlvbnMuCiAgICAiIiIKICAgIHJldHVybiBfZGlzdHJvLmxpbnV4X2Rpc3RyaWJ1dGlvbihmdWxsX2Rpc3RyaWJ1dGlvbl9uYW1lKQoKCmRlZiBpZCgpOgogICAgIiIiCiAgICBSZXR1cm4gdGhlIGRpc3RybyBJRCBvZiB0aGUgY3VycmVudCBMaW51eCBkaXN0cmlidXRpb24sIGFzIGEKICAgIG1hY2hpbmUtcmVhZGFibGUgc3RyaW5nLgoKICAgIEZvciBhIG51bWJlciBvZiBMaW51eCBkaXN0cmlidXRpb25zLCB0aGUgcmV0dXJuZWQgZGlzdHJvIElEIHZhbHVlIGlzCiAgICAqcmVsaWFibGUqLCBpbiB0aGUgc2Vuc2UgdGhhdCBpdCBpcyBkb2N1bWVudGVkIGFuZCB0aGF0IGl0IGRvZXMgbm90IGNoYW5nZQogICAgYWNyb3NzIHJlbGVhc2VzIG9mIHRoZSBkaXN0cmlidXRpb24uCgogICAgVGhpcyBwYWNrYWdlIG1haW50YWlucyB0aGUgZm9sbG93aW5nIHJlbGlhYmxlIGRpc3RybyBJRCB2YWx1ZXM6CgogICAgPT09PT09PT09PT09PT0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICBEaXN0cm8gSUQgICAgICAgRGlzdHJpYnV0aW9uCiAgICA9PT09PT09PT09PT09PSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICJ1YnVudHUiICAgICAgICBVYnVudHUKICAgICJkZWJpYW4iICAgICAgICBEZWJpYW4KICAgICJyaGVsIiAgICAgICAgICBSZWRIYXQgRW50ZXJwcmlzZSBMaW51eAogICAgImNlbnRvcyIgICAgICAgIENlbnRPUwogICAgImZlZG9yYSIgICAgICAgIEZlZG9yYQogICAgInNsZXMiICAgICAgICAgIFNVU0UgTGludXggRW50ZXJwcmlzZSBTZXJ2ZXIKICAgICJvcGVuc3VzZSIgICAgICBvcGVuU1VTRQogICAgImFtYXpvbiIgICAgICAgIEFtYXpvbiBMaW51eAogICAgImFyY2giICAgICAgICAgIEFyY2ggTGludXgKICAgICJjbG91ZGxpbnV4IiAgICBDbG91ZExpbnV4IE9TCiAgICAiZXhoZXJibyIgICAgICAgRXhoZXJibyBMaW51eAogICAgImdlbnRvbyIgICAgICAgIEdlblRvbyBMaW51eAogICAgImlibV9wb3dlcmt2bSIgIElCTSBQb3dlcktWTQogICAgImt2bWlibSIgICAgICAgIEtWTSBmb3IgSUJNIHogU3lzdGVtcwogICAgImxpbnV4bWludCIgICAgIExpbnV4IE1pbnQKICAgICJtYWdlaWEiICAgICAgICBNYWdlaWEKICAgICJtYW5kcml2YSIgICAgICBNYW5kcml2YSBMaW51eAogICAgInBhcmFsbGVscyIgICAgIFBhcmFsbGVscwogICAgInBpZG9yYSIgICAgICAgIFBpZG9yYQogICAgInJhc3BiaWFuIiAgICAgIFJhc3BiaWFuCiAgICAib3JhY2xlIiAgICAgICAgT3JhY2xlIExpbnV4IChhbmQgT3JhY2xlIEVudGVycHJpc2UgTGludXgpCiAgICAic2NpZW50aWZpYyIgICAgU2NpZW50aWZpYyBMaW51eAogICAgInNsYWNrd2FyZSIgICAgIFNsYWNrd2FyZQogICAgInhlbnNlcnZlciIgICAgIFhlblNlcnZlcgogICAgPT09PT09PT09PT09PT0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgSWYgeW91IGhhdmUgYSBuZWVkIHRvIGdldCBkaXN0cm9zIGZvciByZWxpYWJsZSBJRHMgYWRkZWQgaW50byB0aGlzIHNldCwKICAgIG9yIGlmIHlvdSBmaW5kIHRoYXQgdGhlIDpmdW5jOmBkaXN0cm8uaWRgIGZ1bmN0aW9uIHJldHVybnMgYSBkaWZmZXJlbnQKICAgIGRpc3RybyBJRCBmb3Igb25lIG9mIHRoZSBsaXN0ZWQgZGlzdHJvcywgcGxlYXNlIGNyZWF0ZSBhbiBpc3N1ZSBpbiB0aGUKICAgIGBkaXN0cm8gaXNzdWUgdHJhY2tlcmBfLgoKICAgICoqTG9va3VwIGhpZXJhcmNoeSBhbmQgdHJhbnNmb3JtYXRpb25zOioqCgogICAgRmlyc3QsIHRoZSBJRCBpcyBvYnRhaW5lZCBmcm9tIHRoZSBmb2xsb3dpbmcgc291cmNlcywgaW4gdGhlIHNwZWNpZmllZAogICAgb3JkZXIuIFRoZSBmaXJzdCBhdmFpbGFibGUgYW5kIG5vbi1lbXB0eSB2YWx1ZSBpcyB1c2VkOgoKICAgICogdGhlIHZhbHVlIG9mIHRoZSAiSUQiIGF0dHJpYnV0ZSBvZiB0aGUgb3MtcmVsZWFzZSBmaWxlLAoKICAgICogdGhlIHZhbHVlIG9mIHRoZSAiRGlzdHJpYnV0b3IgSUQiIGF0dHJpYnV0ZSByZXR1cm5lZCBieSB0aGUgbHNiX3JlbGVhc2UKICAgICAgY29tbWFuZCwKCiAgICAqIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBmaWxlIG5hbWUgb2YgdGhlIGRpc3RybyByZWxlYXNlIGZpbGUsCgogICAgVGhlIHNvIGRldGVybWluZWQgSUQgdmFsdWUgdGhlbiBwYXNzZXMgdGhlIGZvbGxvd2luZyB0cmFuc2Zvcm1hdGlvbnMsCiAgICBiZWZvcmUgaXQgaXMgcmV0dXJuZWQgYnkgdGhpcyBtZXRob2Q6CgogICAgKiBpdCBpcyB0cmFuc2xhdGVkIHRvIGxvd2VyIGNhc2UsCgogICAgKiBibGFua3MgKHdoaWNoIHNob3VsZCBub3QgYmUgdGhlcmUgYW55d2F5KSBhcmUgdHJhbnNsYXRlZCB0byB1bmRlcnNjb3JlcywKCiAgICAqIGEgbm9ybWFsaXphdGlvbiBvZiB0aGUgSUQgaXMgcGVyZm9ybWVkLCBiYXNlZCB1cG9uCiAgICAgIGBub3JtYWxpemF0aW9uIHRhYmxlc2BfLiBUaGUgcHVycG9zZSBvZiB0aGlzIG5vcm1hbGl6YXRpb24gaXMgdG8gZW5zdXJlCiAgICAgIHRoYXQgdGhlIElEIGlzIGFzIHJlbGlhYmxlIGFzIHBvc3NpYmxlLCBldmVuIGFjcm9zcyBpbmNvbXBhdGlibGUgY2hhbmdlcwogICAgICBpbiB0aGUgTGludXggZGlzdHJpYnV0aW9ucy4gQSBjb21tb24gcmVhc29uIGZvciBhbiBpbmNvbXBhdGlibGUgY2hhbmdlIGlzCiAgICAgIHRoZSBhZGRpdGlvbiBvZiBhbiBvcy1yZWxlYXNlIGZpbGUsIG9yIHRoZSBhZGRpdGlvbiBvZiB0aGUgbHNiX3JlbGVhc2UKICAgICAgY29tbWFuZCwgd2l0aCBJRCB2YWx1ZXMgdGhhdCBkaWZmZXIgZnJvbSB3aGF0IHdhcyBwcmV2aW91c2x5IGRldGVybWluZWQKICAgICAgZnJvbSB0aGUgZGlzdHJvIHJlbGVhc2UgZmlsZSBuYW1lLgogICAgIiIiCiAgICByZXR1cm4gX2Rpc3Ryby5pZCgpCgoKZGVmIG5hbWUocHJldHR5PUZhbHNlKToKICAgICIiIgogICAgUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IExpbnV4IGRpc3RyaWJ1dGlvbiwgYXMgYSBodW1hbi1yZWFkYWJsZQogICAgc3RyaW5nLgoKICAgIElmICpwcmV0dHkqIGlzIGZhbHNlLCB0aGUgbmFtZSBpcyByZXR1cm5lZCB3aXRob3V0IHZlcnNpb24gb3IgY29kZW5hbWUuCiAgICAoZS5nLiAiQ2VudE9TIExpbnV4IikKCiAgICBJZiAqcHJldHR5KiBpcyB0cnVlLCB0aGUgdmVyc2lvbiBhbmQgY29kZW5hbWUgYXJlIGFwcGVuZGVkLgogICAgKGUuZy4gIkNlbnRPUyBMaW51eCA3LjEuMTUwMyAoQ29yZSkiKQoKICAgICoqTG9va3VwIGhpZXJhcmNoeToqKgoKICAgIFRoZSBuYW1lIGlzIG9idGFpbmVkIGZyb20gdGhlIGZvbGxvd2luZyBzb3VyY2VzLCBpbiB0aGUgc3BlY2lmaWVkIG9yZGVyLgogICAgVGhlIGZpcnN0IGF2YWlsYWJsZSBhbmQgbm9uLWVtcHR5IHZhbHVlIGlzIHVzZWQ6CgogICAgKiBJZiAqcHJldHR5KiBpcyBmYWxzZToKCiAgICAgIC0gdGhlIHZhbHVlIG9mIHRoZSAiTkFNRSIgYXR0cmlidXRlIG9mIHRoZSBvcy1yZWxlYXNlIGZpbGUsCgogICAgICAtIHRoZSB2YWx1ZSBvZiB0aGUgIkRpc3RyaWJ1dG9yIElEIiBhdHRyaWJ1dGUgcmV0dXJuZWQgYnkgdGhlIGxzYl9yZWxlYXNlCiAgICAgICAgY29tbWFuZCwKCiAgICAgIC0gdGhlIHZhbHVlIG9mIHRoZSAiPG5hbWU+IiBmaWVsZCBvZiB0aGUgZGlzdHJvIHJlbGVhc2UgZmlsZS4KCiAgICAqIElmICpwcmV0dHkqIGlzIHRydWU6CgogICAgICAtIHRoZSB2YWx1ZSBvZiB0aGUgIlBSRVRUWV9OQU1FIiBhdHRyaWJ1dGUgb2YgdGhlIG9zLXJlbGVhc2UgZmlsZSwKCiAgICAgIC0gdGhlIHZhbHVlIG9mIHRoZSAiRGVzY3JpcHRpb24iIGF0dHJpYnV0ZSByZXR1cm5lZCBieSB0aGUgbHNiX3JlbGVhc2UKICAgICAgICBjb21tYW5kLAoKICAgICAgLSB0aGUgdmFsdWUgb2YgdGhlICI8bmFtZT4iIGZpZWxkIG9mIHRoZSBkaXN0cm8gcmVsZWFzZSBmaWxlLCBhcHBlbmRlZAogICAgICAgIHdpdGggdGhlIHZhbHVlIG9mIHRoZSBwcmV0dHkgdmVyc2lvbiAoIjx2ZXJzaW9uX2lkPiIgYW5kICI8Y29kZW5hbWU+IgogICAgICAgIGZpZWxkcykgb2YgdGhlIGRpc3RybyByZWxlYXNlIGZpbGUsIGlmIGF2YWlsYWJsZS4KICAgICIiIgogICAgcmV0dXJuIF9kaXN0cm8ubmFtZShwcmV0dHkpCgoKZGVmIHZlcnNpb24ocHJldHR5PUZhbHNlLCBiZXN0PUZhbHNlKToKICAgICIiIgogICAgUmV0dXJuIHRoZSB2ZXJzaW9uIG9mIHRoZSBjdXJyZW50IExpbnV4IGRpc3RyaWJ1dGlvbiwgYXMgYSBodW1hbi1yZWFkYWJsZQogICAgc3RyaW5nLgoKICAgIElmICpwcmV0dHkqIGlzIGZhbHNlLCB0aGUgdmVyc2lvbiBpcyByZXR1cm5lZCB3aXRob3V0IGNvZGVuYW1lIChlLmcuCiAgICAiNy4wIikuCgogICAgSWYgKnByZXR0eSogaXMgdHJ1ZSwgdGhlIGNvZGVuYW1lIGluIHBhcmVudGhlc2lzIGlzIGFwcGVuZGVkLCBpZiB0aGUKICAgIGNvZGVuYW1lIGlzIG5vbi1lbXB0eSAoZS5nLiAiNy4wIChNYWlwbykiKS4KCiAgICBTb21lIGRpc3RyaWJ1dGlvbnMgcHJvdmlkZSB2ZXJzaW9uIG51bWJlcnMgd2l0aCBkaWZmZXJlbnQgcHJlY2lzaW9ucyBpbgogICAgdGhlIGRpZmZlcmVudCBzb3VyY2VzIG9mIGRpc3RyaWJ1dGlvbiBpbmZvcm1hdGlvbi4gRXhhbWluaW5nIHRoZSBkaWZmZXJlbnQKICAgIHNvdXJjZXMgaW4gYSBmaXhlZCBwcmlvcml0eSBvcmRlciBkb2VzIG5vdCBhbHdheXMgeWllbGQgdGhlIG1vc3QgcHJlY2lzZQogICAgdmVyc2lvbiAoZS5nLiBmb3IgRGViaWFuIDguMiwgb3IgQ2VudE9TIDcuMSkuCgogICAgVGhlICpiZXN0KiBwYXJhbWV0ZXIgY2FuIGJlIHVzZWQgdG8gY29udHJvbCB0aGUgYXBwcm9hY2ggZm9yIHRoZSByZXR1cm5lZAogICAgdmVyc2lvbjoKCiAgICBJZiAqYmVzdCogaXMgZmFsc2UsIHRoZSBmaXJzdCBub24tZW1wdHkgdmVyc2lvbiBudW1iZXIgaW4gcHJpb3JpdHkgb3JkZXIgb2YKICAgIHRoZSBleGFtaW5lZCBzb3VyY2VzIGlzIHJldHVybmVkLgoKICAgIElmICpiZXN0KiBpcyB0cnVlLCB0aGUgbW9zdCBwcmVjaXNlIHZlcnNpb24gbnVtYmVyIG91dCBvZiBhbGwgZXhhbWluZWQKICAgIHNvdXJjZXMgaXMgcmV0dXJuZWQuCgogICAgKipMb29rdXAgaGllcmFyY2h5OioqCgogICAgSW4gYWxsIGNhc2VzLCB0aGUgdmVyc2lvbiBudW1iZXIgaXMgb2J0YWluZWQgZnJvbSB0aGUgZm9sbG93aW5nIHNvdXJjZXMuCiAgICBJZiAqYmVzdCogaXMgZmFsc2UsIHRoaXMgb3JkZXIgcmVwcmVzZW50cyB0aGUgcHJpb3JpdHkgb3JkZXI6CgogICAgKiB0aGUgdmFsdWUgb2YgdGhlICJWRVJTSU9OX0lEIiBhdHRyaWJ1dGUgb2YgdGhlIG9zLXJlbGVhc2UgZmlsZSwKICAgICogdGhlIHZhbHVlIG9mIHRoZSAiUmVsZWFzZSIgYXR0cmlidXRlIHJldHVybmVkIGJ5IHRoZSBsc2JfcmVsZWFzZQogICAgICBjb21tYW5kLAogICAgKiB0aGUgdmVyc2lvbiBudW1iZXIgcGFyc2VkIGZyb20gdGhlICI8dmVyc2lvbl9pZD4iIGZpZWxkIG9mIHRoZSBmaXJzdCBsaW5lCiAgICAgIG9mIHRoZSBkaXN0cm8gcmVsZWFzZSBmaWxlLAogICAgKiB0aGUgdmVyc2lvbiBudW1iZXIgcGFyc2VkIGZyb20gdGhlICJQUkVUVFlfTkFNRSIgYXR0cmlidXRlIG9mIHRoZQogICAgICBvcy1yZWxlYXNlIGZpbGUsIGlmIGl0IGZvbGxvd3MgdGhlIGZvcm1hdCBvZiB0aGUgZGlzdHJvIHJlbGVhc2UgZmlsZXMuCiAgICAqIHRoZSB2ZXJzaW9uIG51bWJlciBwYXJzZWQgZnJvbSB0aGUgIkRlc2NyaXB0aW9uIiBhdHRyaWJ1dGUgcmV0dXJuZWQgYnkKICAgICAgdGhlIGxzYl9yZWxlYXNlIGNvbW1hbmQsIGlmIGl0IGZvbGxvd3MgdGhlIGZvcm1hdCBvZiB0aGUgZGlzdHJvIHJlbGVhc2UKICAgICAgZmlsZXMuCiAgICAiIiIKICAgIHJldHVybiBfZGlzdHJvLnZlcnNpb24ocHJldHR5LCBiZXN0KQoKCmRlZiB2ZXJzaW9uX3BhcnRzKGJlc3Q9RmFsc2UpOgogICAgIiIiCiAgICBSZXR1cm4gdGhlIHZlcnNpb24gb2YgdGhlIGN1cnJlbnQgTGludXggZGlzdHJpYnV0aW9uIGFzIGEgdHVwbGUKICAgIGBgKG1ham9yLCBtaW5vciwgYnVpbGRfbnVtYmVyKWBgIHdpdGggaXRlbXMgYXMgZm9sbG93czoKCiAgICAqIGBgbWFqb3JgYDogIFRoZSByZXN1bHQgb2YgOmZ1bmM6YGRpc3Ryby5tYWpvcl92ZXJzaW9uYC4KCiAgICAqIGBgbWlub3JgYDogIFRoZSByZXN1bHQgb2YgOmZ1bmM6YGRpc3Ryby5taW5vcl92ZXJzaW9uYC4KCiAgICAqIGBgYnVpbGRfbnVtYmVyYGA6ICBUaGUgcmVzdWx0IG9mIDpmdW5jOmBkaXN0cm8uYnVpbGRfbnVtYmVyYC4KCiAgICBGb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgKmJlc3QqIHBhcmFtZXRlciwgc2VlIHRoZSA6ZnVuYzpgZGlzdHJvLnZlcnNpb25gCiAgICBtZXRob2QuCiAgICAiIiIKICAgIHJldHVybiBfZGlzdHJvLnZlcnNpb25fcGFydHMoYmVzdCkKCgpkZWYgbWFqb3JfdmVyc2lvbihiZXN0PUZhbHNlKToKICAgICIiIgogICAgUmV0dXJuIHRoZSBtYWpvciB2ZXJzaW9uIG9mIHRoZSBjdXJyZW50IExpbnV4IGRpc3RyaWJ1dGlvbiwgYXMgYSBzdHJpbmcsCiAgICBpZiBwcm92aWRlZC4KICAgIE90aGVyd2lzZSwgdGhlIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZC4gVGhlIG1ham9yIHZlcnNpb24gaXMgdGhlIGZpcnN0CiAgICBwYXJ0IG9mIHRoZSBkb3Qtc2VwYXJhdGVkIHZlcnNpb24gc3RyaW5nLgoKICAgIEZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSAqYmVzdCogcGFyYW1ldGVyLCBzZWUgdGhlIDpmdW5jOmBkaXN0cm8udmVyc2lvbmAKICAgIG1ldGhvZC4KICAgICIiIgogICAgcmV0dXJuIF9kaXN0cm8ubWFqb3JfdmVyc2lvbihiZXN0KQoKCmRlZiBtaW5vcl92ZXJzaW9uKGJlc3Q9RmFsc2UpOgogICAgIiIiCiAgICBSZXR1cm4gdGhlIG1pbm9yIHZlcnNpb24gb2YgdGhlIGN1cnJlbnQgTGludXggZGlzdHJpYnV0aW9uLCBhcyBhIHN0cmluZywKICAgIGlmIHByb3ZpZGVkLgogICAgT3RoZXJ3aXNlLCB0aGUgZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkLiBUaGUgbWlub3IgdmVyc2lvbiBpcyB0aGUgc2Vjb25kCiAgICBwYXJ0IG9mIHRoZSBkb3Qtc2VwYXJhdGVkIHZlcnNpb24gc3RyaW5nLgoKICAgIEZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSAqYmVzdCogcGFyYW1ldGVyLCBzZWUgdGhlIDpmdW5jOmBkaXN0cm8udmVyc2lvbmAKICAgIG1ldGhvZC4KICAgICIiIgogICAgcmV0dXJuIF9kaXN0cm8ubWlub3JfdmVyc2lvbihiZXN0KQoKCmRlZiBidWlsZF9udW1iZXIoYmVzdD1GYWxzZSk6CiAgICAiIiIKICAgIFJldHVybiB0aGUgYnVpbGQgbnVtYmVyIG9mIHRoZSBjdXJyZW50IExpbnV4IGRpc3RyaWJ1dGlvbiwgYXMgYSBzdHJpbmcsCiAgICBpZiBwcm92aWRlZC4KICAgIE90aGVyd2lzZSwgdGhlIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZC4gVGhlIGJ1aWxkIG51bWJlciBpcyB0aGUgdGhpcmQgcGFydAogICAgb2YgdGhlIGRvdC1zZXBhcmF0ZWQgdmVyc2lvbiBzdHJpbmcuCgogICAgRm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlICpiZXN0KiBwYXJhbWV0ZXIsIHNlZSB0aGUgOmZ1bmM6YGRpc3Ryby52ZXJzaW9uYAogICAgbWV0aG9kLgogICAgIiIiCiAgICByZXR1cm4gX2Rpc3Ryby5idWlsZF9udW1iZXIoYmVzdCkKCgpkZWYgbGlrZSgpOgogICAgIiIiCiAgICBSZXR1cm4gYSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBkaXN0cm8gSURzIG9mIGRpc3RyaWJ1dGlvbnMgdGhhdCBhcmUKICAgIGNsb3NlbHkgcmVsYXRlZCB0byB0aGUgY3VycmVudCBMaW51eCBkaXN0cmlidXRpb24gaW4gcmVnYXJkcyB0byBwYWNrYWdpbmcKICAgIGFuZCBwcm9ncmFtbWluZyBpbnRlcmZhY2VzLCBmb3IgZXhhbXBsZSBkaXN0cmlidXRpb25zIHRoZSBjdXJyZW50CiAgICBkaXN0cmlidXRpb24gaXMgYSBkZXJpdmF0aXZlIGZyb20uCgogICAgKipMb29rdXAgaGllcmFyY2h5OioqCgogICAgVGhpcyBpbmZvcm1hdGlvbiBpdGVtIGlzIG9ubHkgcHJvdmlkZWQgYnkgdGhlIG9zLXJlbGVhc2UgZmlsZS4KICAgIEZvciBkZXRhaWxzLCBzZWUgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSAiSURfTElLRSIgYXR0cmlidXRlIGluIHRoZQogICAgYG9zLXJlbGVhc2UgbWFuIHBhZ2UKICAgIDxodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9zeXN0ZW1kL21hbi9vcy1yZWxlYXNlLmh0bWw+YF8uCiAgICAiIiIKICAgIHJldHVybiBfZGlzdHJvLmxpa2UoKQoKCmRlZiBjb2RlbmFtZSgpOgogICAgIiIiCiAgICBSZXR1cm4gdGhlIGNvZGVuYW1lIGZvciB0aGUgcmVsZWFzZSBvZiB0aGUgY3VycmVudCBMaW51eCBkaXN0cmlidXRpb24sCiAgICBhcyBhIHN0cmluZy4KCiAgICBJZiB0aGUgZGlzdHJpYnV0aW9uIGRvZXMgbm90IGhhdmUgYSBjb2RlbmFtZSwgYW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkLgoKICAgIE5vdGUgdGhhdCB0aGUgcmV0dXJuZWQgY29kZW5hbWUgaXMgbm90IGFsd2F5cyByZWFsbHkgYSBjb2RlbmFtZS4gRm9yCiAgICBleGFtcGxlLCBvcGVuU1VTRSByZXR1cm5zICJ4ODZfNjQiLiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGhhbmRsZSBzdWNoCiAgICBjYXNlcyBpbiBhbnkgc3BlY2lhbCB3YXkgYW5kIGp1c3QgcmV0dXJucyB0aGUgc3RyaW5nIGl0IGZpbmRzLCBpZiBhbnkuCgogICAgKipMb29rdXAgaGllcmFyY2h5OioqCgogICAgKiB0aGUgY29kZW5hbWUgd2l0aGluIHRoZSAiVkVSU0lPTiIgYXR0cmlidXRlIG9mIHRoZSBvcy1yZWxlYXNlIGZpbGUsIGlmCiAgICAgIHByb3ZpZGVkLAoKICAgICogdGhlIHZhbHVlIG9mIHRoZSAiQ29kZW5hbWUiIGF0dHJpYnV0ZSByZXR1cm5lZCBieSB0aGUgbHNiX3JlbGVhc2UKICAgICAgY29tbWFuZCwKCiAgICAqIHRoZSB2YWx1ZSBvZiB0aGUgIjxjb2RlbmFtZT4iIGZpZWxkIG9mIHRoZSBkaXN0cm8gcmVsZWFzZSBmaWxlLgogICAgIiIiCiAgICByZXR1cm4gX2Rpc3Ryby5jb2RlbmFtZSgpCgoKZGVmIGluZm8ocHJldHR5PUZhbHNlLCBiZXN0PUZhbHNlKToKICAgICIiIgogICAgUmV0dXJuIGNlcnRhaW4gbWFjaGluZS1yZWFkYWJsZSBpbmZvcm1hdGlvbiBpdGVtcyBhYm91dCB0aGUgY3VycmVudCBMaW51eAogICAgZGlzdHJpYnV0aW9uIGluIGEgZGljdGlvbmFyeSwgYXMgc2hvd24gaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlOgoKICAgIC4uIHNvdXJjZWNvZGU6OiBweXRob24KCiAgICAgICAgewogICAgICAgICAgICAnaWQnOiAncmhlbCcsCiAgICAgICAgICAgICd2ZXJzaW9uJzogJzcuMCcsCiAgICAgICAgICAgICd2ZXJzaW9uX3BhcnRzJzogewogICAgICAgICAgICAgICAgJ21ham9yJzogJzcnLAogICAgICAgICAgICAgICAgJ21pbm9yJzogJzAnLAogICAgICAgICAgICAgICAgJ2J1aWxkX251bWJlcic6ICcnCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICdsaWtlJzogJ2ZlZG9yYScsCiAgICAgICAgICAgICdjb2RlbmFtZSc6ICdNYWlwbycKICAgICAgICB9CgogICAgVGhlIGRpY3Rpb25hcnkgc3RydWN0dXJlIGFuZCBrZXlzIGFyZSBhbHdheXMgdGhlIHNhbWUsIHJlZ2FyZGxlc3Mgb2Ygd2hpY2gKICAgIGluZm9ybWF0aW9uIGl0ZW1zIGFyZSBhdmFpbGFibGUgaW4gdGhlIHVuZGVybHlpbmcgZGF0YSBzb3VyY2VzLiBUaGUgdmFsdWVzCiAgICBmb3IgdGhlIHZhcmlvdXMga2V5cyBhcmUgYXMgZm9sbG93czoKCiAgICAqIGBgaWRgYDogIFRoZSByZXN1bHQgb2YgOmZ1bmM6YGRpc3Ryby5pZGAuCgogICAgKiBgYHZlcnNpb25gYDogIFRoZSByZXN1bHQgb2YgOmZ1bmM6YGRpc3Ryby52ZXJzaW9uYC4KCiAgICAqIGBgdmVyc2lvbl9wYXJ0cyAtPiBtYWpvcmBgOiAgVGhlIHJlc3VsdCBvZiA6ZnVuYzpgZGlzdHJvLm1ham9yX3ZlcnNpb25gLgoKICAgICogYGB2ZXJzaW9uX3BhcnRzIC0+IG1pbm9yYGA6ICBUaGUgcmVzdWx0IG9mIDpmdW5jOmBkaXN0cm8ubWlub3JfdmVyc2lvbmAuCgogICAgKiBgYHZlcnNpb25fcGFydHMgLT4gYnVpbGRfbnVtYmVyYGA6ICBUaGUgcmVzdWx0IG9mCiAgICAgIDpmdW5jOmBkaXN0cm8uYnVpbGRfbnVtYmVyYC4KCiAgICAqIGBgbGlrZWBgOiAgVGhlIHJlc3VsdCBvZiA6ZnVuYzpgZGlzdHJvLmxpa2VgLgoKICAgICogYGBjb2RlbmFtZWBgOiAgVGhlIHJlc3VsdCBvZiA6ZnVuYzpgZGlzdHJvLmNvZGVuYW1lYC4KCiAgICBGb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgKnByZXR0eSogYW5kICpiZXN0KiBwYXJhbWV0ZXJzLCBzZWUgdGhlCiAgICA6ZnVuYzpgZGlzdHJvLnZlcnNpb25gIG1ldGhvZC4KICAgICIiIgogICAgcmV0dXJuIF9kaXN0cm8uaW5mbyhwcmV0dHksIGJlc3QpCgoKZGVmIG9zX3JlbGVhc2VfaW5mbygpOgogICAgIiIiCiAgICBSZXR1cm4gYSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcga2V5LXZhbHVlIHBhaXJzIGZvciB0aGUgaW5mb3JtYXRpb24gaXRlbXMKICAgIGZyb20gdGhlIG9zLXJlbGVhc2UgZmlsZSBkYXRhIHNvdXJjZSBvZiB0aGUgY3VycmVudCBMaW51eCBkaXN0cmlidXRpb24uCgogICAgU2VlIGBvcy1yZWxlYXNlIGZpbGVgXyBmb3IgZGV0YWlscyBhYm91dCB0aGVzZSBpbmZvcm1hdGlvbiBpdGVtcy4KICAgICIiIgogICAgcmV0dXJuIF9kaXN0cm8ub3NfcmVsZWFzZV9pbmZvKCkKCgpkZWYgbHNiX3JlbGVhc2VfaW5mbygpOgogICAgIiIiCiAgICBSZXR1cm4gYSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcga2V5LXZhbHVlIHBhaXJzIGZvciB0aGUgaW5mb3JtYXRpb24gaXRlbXMKICAgIGZyb20gdGhlIGxzYl9yZWxlYXNlIGNvbW1hbmQgZGF0YSBzb3VyY2Ugb2YgdGhlIGN1cnJlbnQgTGludXggZGlzdHJpYnV0aW9uLgoKICAgIFNlZSBgbHNiX3JlbGVhc2UgY29tbWFuZCBvdXRwdXRgXyBmb3IgZGV0YWlscyBhYm91dCB0aGVzZSBpbmZvcm1hdGlvbgogICAgaXRlbXMuCiAgICAiIiIKICAgIHJldHVybiBfZGlzdHJvLmxzYl9yZWxlYXNlX2luZm8oKQoKCmRlZiBkaXN0cm9fcmVsZWFzZV9pbmZvKCk6CiAgICAiIiIKICAgIFJldHVybiBhIGRpY3Rpb25hcnkgY29udGFpbmluZyBrZXktdmFsdWUgcGFpcnMgZm9yIHRoZSBpbmZvcm1hdGlvbiBpdGVtcwogICAgZnJvbSB0aGUgZGlzdHJvIHJlbGVhc2UgZmlsZSBkYXRhIHNvdXJjZSBvZiB0aGUgY3VycmVudCBMaW51eCBkaXN0cmlidXRpb24uCgogICAgU2VlIGBkaXN0cm8gcmVsZWFzZSBmaWxlYF8gZm9yIGRldGFpbHMgYWJvdXQgdGhlc2UgaW5mb3JtYXRpb24gaXRlbXMuCiAgICAiIiIKICAgIHJldHVybiBfZGlzdHJvLmRpc3Ryb19yZWxlYXNlX2luZm8oKQoKCmRlZiBvc19yZWxlYXNlX2F0dHIoYXR0cmlidXRlKToKICAgICIiIgogICAgUmV0dXJuIGEgc2luZ2xlIG5hbWVkIGluZm9ybWF0aW9uIGl0ZW0gZnJvbSB0aGUgb3MtcmVsZWFzZSBmaWxlIGRhdGEgc291cmNlCiAgICBvZiB0aGUgY3VycmVudCBMaW51eCBkaXN0cmlidXRpb24uCgogICAgUGFyYW1ldGVyczoKCiAgICAqIGBgYXR0cmlidXRlYGAgKHN0cmluZyk6IEtleSBvZiB0aGUgaW5mb3JtYXRpb24gaXRlbS4KCiAgICBSZXR1cm5zOgoKICAgICogKHN0cmluZyk6IFZhbHVlIG9mIHRoZSBpbmZvcm1hdGlvbiBpdGVtLCBpZiB0aGUgaXRlbSBleGlzdHMuCiAgICAgIFRoZSBlbXB0eSBzdHJpbmcsIGlmIHRoZSBpdGVtIGRvZXMgbm90IGV4aXN0LgoKICAgIFNlZSBgb3MtcmVsZWFzZSBmaWxlYF8gZm9yIGRldGFpbHMgYWJvdXQgdGhlc2UgaW5mb3JtYXRpb24gaXRlbXMuCiAgICAiIiIKICAgIHJldHVybiBfZGlzdHJvLm9zX3JlbGVhc2VfYXR0cihhdHRyaWJ1dGUpCgoKZGVmIGxzYl9yZWxlYXNlX2F0dHIoYXR0cmlidXRlKToKICAgICIiIgogICAgUmV0dXJuIGEgc2luZ2xlIG5hbWVkIGluZm9ybWF0aW9uIGl0ZW0gZnJvbSB0aGUgbHNiX3JlbGVhc2UgY29tbWFuZCBvdXRwdXQKICAgIGRhdGEgc291cmNlIG9mIHRoZSBjdXJyZW50IExpbnV4IGRpc3RyaWJ1dGlvbi4KCiAgICBQYXJhbWV0ZXJzOgoKICAgICogYGBhdHRyaWJ1dGVgYCAoc3RyaW5nKTogS2V5IG9mIHRoZSBpbmZvcm1hdGlvbiBpdGVtLgoKICAgIFJldHVybnM6CgogICAgKiAoc3RyaW5nKTogVmFsdWUgb2YgdGhlIGluZm9ybWF0aW9uIGl0ZW0sIGlmIHRoZSBpdGVtIGV4aXN0cy4KICAgICAgVGhlIGVtcHR5IHN0cmluZywgaWYgdGhlIGl0ZW0gZG9lcyBub3QgZXhpc3QuCgogICAgU2VlIGBsc2JfcmVsZWFzZSBjb21tYW5kIG91dHB1dGBfIGZvciBkZXRhaWxzIGFib3V0IHRoZXNlIGluZm9ybWF0aW9uCiAgICBpdGVtcy4KICAgICIiIgogICAgcmV0dXJuIF9kaXN0cm8ubHNiX3JlbGVhc2VfYXR0cihhdHRyaWJ1dGUpCgoKZGVmIGRpc3Ryb19yZWxlYXNlX2F0dHIoYXR0cmlidXRlKToKICAgICIiIgogICAgUmV0dXJuIGEgc2luZ2xlIG5hbWVkIGluZm9ybWF0aW9uIGl0ZW0gZnJvbSB0aGUgZGlzdHJvIHJlbGVhc2UgZmlsZQogICAgZGF0YSBzb3VyY2Ugb2YgdGhlIGN1cnJlbnQgTGludXggZGlzdHJpYnV0aW9uLgoKICAgIFBhcmFtZXRlcnM6CgogICAgKiBgYGF0dHJpYnV0ZWBgIChzdHJpbmcpOiBLZXkgb2YgdGhlIGluZm9ybWF0aW9uIGl0ZW0uCgogICAgUmV0dXJuczoKCiAgICAqIChzdHJpbmcpOiBWYWx1ZSBvZiB0aGUgaW5mb3JtYXRpb24gaXRlbSwgaWYgdGhlIGl0ZW0gZXhpc3RzLgogICAgICBUaGUgZW1wdHkgc3RyaW5nLCBpZiB0aGUgaXRlbSBkb2VzIG5vdCBleGlzdC4KCiAgICBTZWUgYGRpc3RybyByZWxlYXNlIGZpbGVgXyBmb3IgZGV0YWlscyBhYm91dCB0aGVzZSBpbmZvcm1hdGlvbiBpdGVtcy4KICAgICIiIgogICAgcmV0dXJuIF9kaXN0cm8uZGlzdHJvX3JlbGVhc2VfYXR0cihhdHRyaWJ1dGUpCgoKY2xhc3MgTGludXhEaXN0cmlidXRpb24ob2JqZWN0KToKICAgICIiIgogICAgUHJvdmlkZXMgaW5mb3JtYXRpb24gYWJvdXQgYSBMaW51eCBkaXN0cmlidXRpb24uCgogICAgVGhpcyBwYWNrYWdlIGNyZWF0ZXMgYSBwcml2YXRlIG1vZHVsZS1nbG9iYWwgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoCiAgICBkZWZhdWx0IGluaXRpYWxpemF0aW9uIGFyZ3VtZW50cywgdGhhdCBpcyB1c2VkIGJ5IHRoZQogICAgYGNvbnNvbGlkYXRlZCBhY2Nlc3NvciBmdW5jdGlvbnNgXyBhbmQgYHNpbmdsZSBzb3VyY2UgYWNjZXNzb3IgZnVuY3Rpb25zYF8uCiAgICBCeSB1c2luZyBkZWZhdWx0IGluaXRpYWxpemF0aW9uIGFyZ3VtZW50cywgdGhhdCBtb2R1bGUtZ2xvYmFsIGluc3RhbmNlCiAgICByZXR1cm5zIGRhdGEgYWJvdXQgdGhlIGN1cnJlbnQgTGludXggZGlzdHJpYnV0aW9uIChpLmUuIHRoZSBkaXN0cm8gdGhpcwogICAgcGFja2FnZSBydW5zIG9uKS4KCiAgICBOb3JtYWxseSwgaXQgaXMgbm90IG5lY2Vzc2FyeSB0byBjcmVhdGUgYWRkaXRpb25hbCBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcy4KICAgIEhvd2V2ZXIsIGluIHNpdHVhdGlvbnMgd2hlcmUgY29udHJvbCBpcyBuZWVkZWQgb3ZlciB0aGUgZXhhY3QgZGF0YSBzb3VyY2VzCiAgICB0aGF0IGFyZSB1c2VkLCBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBjYW4gYmUgY3JlYXRlZCB3aXRoIGEgc3BlY2lmaWMKICAgIGRpc3RybyByZWxlYXNlIGZpbGUsIG9yIGEgc3BlY2lmaWMgb3MtcmVsZWFzZSBmaWxlLCBvciB3aXRob3V0IGludm9raW5nIHRoZQogICAgbHNiX3JlbGVhc2UgY29tbWFuZC4KICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLAogICAgICAgICAgICAgICAgIGluY2x1ZGVfbHNiPVRydWUsCiAgICAgICAgICAgICAgICAgb3NfcmVsZWFzZV9maWxlPScnLAogICAgICAgICAgICAgICAgIGRpc3Ryb19yZWxlYXNlX2ZpbGU9JycpOgogICAgICAgICIiIgogICAgICAgIFRoZSBpbml0aWFsaXphdGlvbiBtZXRob2Qgb2YgdGhpcyBjbGFzcyBnYXRoZXJzIGluZm9ybWF0aW9uIGZyb20gdGhlCiAgICAgICAgYXZhaWxhYmxlIGRhdGEgc291cmNlcywgYW5kIHN0b3JlcyB0aGF0IGluIHByaXZhdGUgaW5zdGFuY2UgYXR0cmlidXRlcy4KICAgICAgICBTdWJzZXF1ZW50IGFjY2VzcyB0byB0aGUgaW5mb3JtYXRpb24gaXRlbXMgdXNlcyB0aGVzZSBwcml2YXRlIGluc3RhbmNlCiAgICAgICAgYXR0cmlidXRlcywgc28gdGhhdCB0aGUgZGF0YSBzb3VyY2VzIGFyZSByZWFkIG9ubHkgb25jZS4KCiAgICAgICAgUGFyYW1ldGVyczoKCiAgICAgICAgKiBgYGluY2x1ZGVfbHNiYGAgKGJvb2wpOiBDb250cm9scyB3aGV0aGVyIHRoZQogICAgICAgICAgYGxzYl9yZWxlYXNlIGNvbW1hbmQgb3V0cHV0YF8gaXMgaW5jbHVkZWQgYXMgYSBkYXRhIHNvdXJjZS4KCiAgICAgICAgICBJZiB0aGUgbHNiX3JlbGVhc2UgY29tbWFuZCBpcyBub3QgYXZhaWxhYmxlIGluIHRoZSBwcm9ncmFtIGV4ZWN1dGlvbgogICAgICAgICAgcGF0aCwgdGhlIGRhdGEgc291cmNlIGZvciB0aGUgbHNiX3JlbGVhc2UgY29tbWFuZCB3aWxsIGJlIGVtcHR5LgoKICAgICAgICAqIGBgb3NfcmVsZWFzZV9maWxlYGAgKHN0cmluZyk6IFRoZSBwYXRoIG5hbWUgb2YgdGhlCiAgICAgICAgICBgb3MtcmVsZWFzZSBmaWxlYF8gdGhhdCBpcyB0byBiZSB1c2VkIGFzIGEgZGF0YSBzb3VyY2UuCgogICAgICAgICAgQW4gZW1wdHkgc3RyaW5nICh0aGUgZGVmYXVsdCkgd2lsbCBjYXVzZSB0aGUgZGVmYXVsdCBwYXRoIG5hbWUgdG8KICAgICAgICAgIGJlIHVzZWQgKHNlZSBgb3MtcmVsZWFzZSBmaWxlYF8gZm9yIGRldGFpbHMpLgoKICAgICAgICAgIElmIHRoZSBzcGVjaWZpZWQgb3IgZGVmYXVsdGVkIG9zLXJlbGVhc2UgZmlsZSBkb2VzIG5vdCBleGlzdCwgdGhlCiAgICAgICAgICBkYXRhIHNvdXJjZSBmb3IgdGhlIG9zLXJlbGVhc2UgZmlsZSB3aWxsIGJlIGVtcHR5LgoKICAgICAgICAqIGBgZGlzdHJvX3JlbGVhc2VfZmlsZWBgIChzdHJpbmcpOiBUaGUgcGF0aCBuYW1lIG9mIHRoZQogICAgICAgICAgYGRpc3RybyByZWxlYXNlIGZpbGVgXyB0aGF0IGlzIHRvIGJlIHVzZWQgYXMgYSBkYXRhIHNvdXJjZS4KCiAgICAgICAgICBBbiBlbXB0eSBzdHJpbmcgKHRoZSBkZWZhdWx0KSB3aWxsIGNhdXNlIGEgZGVmYXVsdCBzZWFyY2ggYWxnb3JpdGhtCiAgICAgICAgICB0byBiZSB1c2VkIChzZWUgYGRpc3RybyByZWxlYXNlIGZpbGVgXyBmb3IgZGV0YWlscykuCgogICAgICAgICAgSWYgdGhlIHNwZWNpZmllZCBkaXN0cm8gcmVsZWFzZSBmaWxlIGRvZXMgbm90IGV4aXN0LCBvciBpZiBubyBkZWZhdWx0CiAgICAgICAgICBkaXN0cm8gcmVsZWFzZSBmaWxlIGNhbiBiZSBmb3VuZCwgdGhlIGRhdGEgc291cmNlIGZvciB0aGUgZGlzdHJvCiAgICAgICAgICByZWxlYXNlIGZpbGUgd2lsbCBiZSBlbXB0eS4KCiAgICAgICAgUHVibGljIGluc3RhbmNlIGF0dHJpYnV0ZXM6CgogICAgICAgICogYGBvc19yZWxlYXNlX2ZpbGVgYCAoc3RyaW5nKTogVGhlIHBhdGggbmFtZSBvZiB0aGUKICAgICAgICAgIGBvcy1yZWxlYXNlIGZpbGVgXyB0aGF0IGlzIGFjdHVhbGx5IHVzZWQgYXMgYSBkYXRhIHNvdXJjZS4gVGhlCiAgICAgICAgICBlbXB0eSBzdHJpbmcgaWYgbm8gZGlzdHJvIHJlbGVhc2UgZmlsZSBpcyB1c2VkIGFzIGEgZGF0YSBzb3VyY2UuCgogICAgICAgICogYGBkaXN0cm9fcmVsZWFzZV9maWxlYGAgKHN0cmluZyk6IFRoZSBwYXRoIG5hbWUgb2YgdGhlCiAgICAgICAgICBgZGlzdHJvIHJlbGVhc2UgZmlsZWBfIHRoYXQgaXMgYWN0dWFsbHkgdXNlZCBhcyBhIGRhdGEgc291cmNlLiBUaGUKICAgICAgICAgIGVtcHR5IHN0cmluZyBpZiBubyBkaXN0cm8gcmVsZWFzZSBmaWxlIGlzIHVzZWQgYXMgYSBkYXRhIHNvdXJjZS4KCiAgICAgICAgUmFpc2VzOgoKICAgICAgICAqIDpweTpleGM6YElPRXJyb3JgOiBTb21lIEkvTyBpc3N1ZSB3aXRoIGFuIG9zLXJlbGVhc2UgZmlsZSBvciBkaXN0cm8KICAgICAgICAgIHJlbGVhc2UgZmlsZS4KCiAgICAgICAgKiA6cHk6ZXhjOmBzdWJwcm9jZXNzLkNhbGxlZFByb2Nlc3NFcnJvcmA6IFRoZSBsc2JfcmVsZWFzZSBjb21tYW5kIGhhZAogICAgICAgICAgc29tZSBpc3N1ZSAob3RoZXIgdGhhbiBub3QgYmVpbmcgYXZhaWxhYmxlIGluIHRoZSBwcm9ncmFtIGV4ZWN1dGlvbgogICAgICAgICAgcGF0aCkuCgogICAgICAgICogOnB5OmV4YzpgVW5pY29kZUVycm9yYDogQSBkYXRhIHNvdXJjZSBoYXMgdW5leHBlY3RlZCBjaGFyYWN0ZXJzIG9yCiAgICAgICAgICB1c2VzIGFuIHVuZXhwZWN0ZWQgZW5jb2RpbmcuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5vc19yZWxlYXNlX2ZpbGUgPSBvc19yZWxlYXNlX2ZpbGUgb3IgXAogICAgICAgICAgICBvcy5wYXRoLmpvaW4oX1VOSVhDT05GRElSLCBfT1NfUkVMRUFTRV9CQVNFTkFNRSkKICAgICAgICBzZWxmLmRpc3Ryb19yZWxlYXNlX2ZpbGUgPSBkaXN0cm9fcmVsZWFzZV9maWxlIG9yICcnICAjIHVwZGF0ZWQgbGF0ZXIKICAgICAgICBzZWxmLl9vc19yZWxlYXNlX2luZm8gPSBzZWxmLl9nZXRfb3NfcmVsZWFzZV9pbmZvKCkKICAgICAgICBzZWxmLl9sc2JfcmVsZWFzZV9pbmZvID0gc2VsZi5fZ2V0X2xzYl9yZWxlYXNlX2luZm8oKSBcCiAgICAgICAgICAgIGlmIGluY2x1ZGVfbHNiIGVsc2Uge30KICAgICAgICBzZWxmLl9kaXN0cm9fcmVsZWFzZV9pbmZvID0gc2VsZi5fZ2V0X2Rpc3Ryb19yZWxlYXNlX2luZm8oKQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICAiIiJSZXR1cm4gcmVwciBvZiBhbGwgaW5mbwogICAgICAgICIiIgogICAgICAgIHJldHVybiBcCiAgICAgICAgICAgICJMaW51eERpc3RyaWJ1dGlvbigiIFwKICAgICAgICAgICAgIm9zX3JlbGVhc2VfZmlsZT17MCFyfSwgIiBcCiAgICAgICAgICAgICJkaXN0cm9fcmVsZWFzZV9maWxlPXsxIXJ9LCAiIFwKICAgICAgICAgICAgIl9vc19yZWxlYXNlX2luZm89ezIhcn0sICIgXAogICAgICAgICAgICAiX2xzYl9yZWxlYXNlX2luZm89ezMhcn0sICIgXAogICAgICAgICAgICAiX2Rpc3Ryb19yZWxlYXNlX2luZm89ezQhcn0pIi5mb3JtYXQoCiAgICAgICAgICAgICAgICBzZWxmLm9zX3JlbGVhc2VfZmlsZSwKICAgICAgICAgICAgICAgIHNlbGYuZGlzdHJvX3JlbGVhc2VfZmlsZSwKICAgICAgICAgICAgICAgIHNlbGYuX29zX3JlbGVhc2VfaW5mbywKICAgICAgICAgICAgICAgIHNlbGYuX2xzYl9yZWxlYXNlX2luZm8sCiAgICAgICAgICAgICAgICBzZWxmLl9kaXN0cm9fcmVsZWFzZV9pbmZvKQoKICAgIGRlZiBsaW51eF9kaXN0cmlidXRpb24oc2VsZiwgZnVsbF9kaXN0cmlidXRpb25fbmFtZT1UcnVlKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIExpbnV4IGRpc3RyaWJ1dGlvbiB0aGF0IGlzIGNvbXBhdGlibGUKICAgICAgICB3aXRoIFB5dGhvbidzIDpmdW5jOmBwbGF0Zm9ybS5saW51eF9kaXN0cmlidXRpb25gLCBzdXBwb3J0aW5nIGEgc3Vic2V0CiAgICAgICAgb2YgaXRzIHBhcmFtZXRlcnMuCgogICAgICAgIEZvciBkZXRhaWxzLCBzZWUgOmZ1bmM6YGRpc3Ryby5saW51eF9kaXN0cmlidXRpb25gLgogICAgICAgICIiIgogICAgICAgIHJldHVybiAoCiAgICAgICAgICAgIHNlbGYubmFtZSgpIGlmIGZ1bGxfZGlzdHJpYnV0aW9uX25hbWUgZWxzZSBzZWxmLmlkKCksCiAgICAgICAgICAgIHNlbGYudmVyc2lvbigpLAogICAgICAgICAgICBzZWxmLmNvZGVuYW1lKCkKICAgICAgICApCgogICAgZGVmIGlkKHNlbGYpOgogICAgICAgICIiIlJldHVybiB0aGUgZGlzdHJvIElEIG9mIHRoZSBMaW51eCBkaXN0cmlidXRpb24sIGFzIGEgc3RyaW5nLgoKICAgICAgICBGb3IgZGV0YWlscywgc2VlIDpmdW5jOmBkaXN0cm8uaWRgLgogICAgICAgICIiIgogICAgICAgIGRlZiBub3JtYWxpemUoZGlzdHJvX2lkLCB0YWJsZSk6CiAgICAgICAgICAgIGRpc3Ryb19pZCA9IGRpc3Ryb19pZC5sb3dlcigpLnJlcGxhY2UoJyAnLCAnXycpCiAgICAgICAgICAgIHJldHVybiB0YWJsZS5nZXQoZGlzdHJvX2lkLCBkaXN0cm9faWQpCgogICAgICAgIGRpc3Ryb19pZCA9IHNlbGYub3NfcmVsZWFzZV9hdHRyKCdpZCcpCiAgICAgICAgaWYgZGlzdHJvX2lkOgogICAgICAgICAgICByZXR1cm4gbm9ybWFsaXplKGRpc3Ryb19pZCwgTk9STUFMSVpFRF9PU19JRCkKCiAgICAgICAgZGlzdHJvX2lkID0gc2VsZi5sc2JfcmVsZWFzZV9hdHRyKCdkaXN0cmlidXRvcl9pZCcpCiAgICAgICAgaWYgZGlzdHJvX2lkOgogICAgICAgICAgICByZXR1cm4gbm9ybWFsaXplKGRpc3Ryb19pZCwgTk9STUFMSVpFRF9MU0JfSUQpCgogICAgICAgIGRpc3Ryb19pZCA9IHNlbGYuZGlzdHJvX3JlbGVhc2VfYXR0cignaWQnKQogICAgICAgIGlmIGRpc3Ryb19pZDoKICAgICAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZShkaXN0cm9faWQsIE5PUk1BTElaRURfRElTVFJPX0lEKQoKICAgICAgICByZXR1cm4gJycKCiAgICBkZWYgbmFtZShzZWxmLCBwcmV0dHk9RmFsc2UpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgTGludXggZGlzdHJpYnV0aW9uLCBhcyBhIHN0cmluZy4KCiAgICAgICAgRm9yIGRldGFpbHMsIHNlZSA6ZnVuYzpgZGlzdHJvLm5hbWVgLgogICAgICAgICIiIgogICAgICAgIG5hbWUgPSBzZWxmLm9zX3JlbGVhc2VfYXR0cignbmFtZScpIFwKICAgICAgICAgICAgb3Igc2VsZi5sc2JfcmVsZWFzZV9hdHRyKCdkaXN0cmlidXRvcl9pZCcpIFwKICAgICAgICAgICAgb3Igc2VsZi5kaXN0cm9fcmVsZWFzZV9hdHRyKCduYW1lJykKICAgICAgICBpZiBwcmV0dHk6CiAgICAgICAgICAgIG5hbWUgPSBzZWxmLm9zX3JlbGVhc2VfYXR0cigncHJldHR5X25hbWUnKSBcCiAgICAgICAgICAgICAgICBvciBzZWxmLmxzYl9yZWxlYXNlX2F0dHIoJ2Rlc2NyaXB0aW9uJykKICAgICAgICAgICAgaWYgbm90IG5hbWU6CiAgICAgICAgICAgICAgICBuYW1lID0gc2VsZi5kaXN0cm9fcmVsZWFzZV9hdHRyKCduYW1lJykKICAgICAgICAgICAgICAgIHZlcnNpb24gPSBzZWxmLnZlcnNpb24ocHJldHR5PVRydWUpCiAgICAgICAgICAgICAgICBpZiB2ZXJzaW9uOgogICAgICAgICAgICAgICAgICAgIG5hbWUgPSBuYW1lICsgJyAnICsgdmVyc2lvbgogICAgICAgIHJldHVybiBuYW1lIG9yICcnCgogICAgZGVmIHZlcnNpb24oc2VsZiwgcHJldHR5PUZhbHNlLCBiZXN0PUZhbHNlKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gdGhlIHZlcnNpb24gb2YgdGhlIExpbnV4IGRpc3RyaWJ1dGlvbiwgYXMgYSBzdHJpbmcuCgogICAgICAgIEZvciBkZXRhaWxzLCBzZWUgOmZ1bmM6YGRpc3Ryby52ZXJzaW9uYC4KICAgICAgICAiIiIKICAgICAgICB2ZXJzaW9ucyA9IFsKICAgICAgICAgICAgc2VsZi5vc19yZWxlYXNlX2F0dHIoJ3ZlcnNpb25faWQnKSwKICAgICAgICAgICAgc2VsZi5sc2JfcmVsZWFzZV9hdHRyKCdyZWxlYXNlJyksCiAgICAgICAgICAgIHNlbGYuZGlzdHJvX3JlbGVhc2VfYXR0cigndmVyc2lvbl9pZCcpLAogICAgICAgICAgICBzZWxmLl9wYXJzZV9kaXN0cm9fcmVsZWFzZV9jb250ZW50KAogICAgICAgICAgICAgICAgc2VsZi5vc19yZWxlYXNlX2F0dHIoJ3ByZXR0eV9uYW1lJykpLmdldCgndmVyc2lvbl9pZCcsICcnKSwKICAgICAgICAgICAgc2VsZi5fcGFyc2VfZGlzdHJvX3JlbGVhc2VfY29udGVudCgKICAgICAgICAgICAgICAgIHNlbGYubHNiX3JlbGVhc2VfYXR0cignZGVzY3JpcHRpb24nKSkuZ2V0KCd2ZXJzaW9uX2lkJywgJycpCiAgICAgICAgXQogICAgICAgIHZlcnNpb24gPSAnJwogICAgICAgIGlmIGJlc3Q6CiAgICAgICAgICAgICMgVGhpcyBhbGdvcml0aG0gdXNlcyB0aGUgbGFzdCB2ZXJzaW9uIGluIHByaW9yaXR5IG9yZGVyIHRoYXQgaGFzCiAgICAgICAgICAgICMgdGhlIGJlc3QgcHJlY2lzaW9uLiBJZiB0aGUgdmVyc2lvbnMgYXJlIG5vdCBpbiBjb25mbGljdCwgdGhhdAogICAgICAgICAgICAjIGRvZXMgbm90IG1hdHRlcjsgb3RoZXJ3aXNlLCB1c2luZyB0aGUgbGFzdCBvbmUgaW5zdGVhZCBvZiB0aGUKICAgICAgICAgICAgIyBmaXJzdCBvbmUgbWlnaHQgYmUgY29uc2lkZXJlZCBhIHN1cnByaXNlLgogICAgICAgICAgICBmb3IgdiBpbiB2ZXJzaW9uczoKICAgICAgICAgICAgICAgIGlmIHYuY291bnQoIi4iKSA+IHZlcnNpb24uY291bnQoIi4iKSBvciB2ZXJzaW9uID09ICcnOgogICAgICAgICAgICAgICAgICAgIHZlcnNpb24gPSB2CiAgICAgICAgZWxzZToKICAgICAgICAgICAgZm9yIHYgaW4gdmVyc2lvbnM6CiAgICAgICAgICAgICAgICBpZiB2ICE9ICcnOgogICAgICAgICAgICAgICAgICAgIHZlcnNpb24gPSB2CiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICBpZiBwcmV0dHkgYW5kIHZlcnNpb24gYW5kIHNlbGYuY29kZW5hbWUoKToKICAgICAgICAgICAgdmVyc2lvbiA9IHUnezB9ICh7MX0pJy5mb3JtYXQodmVyc2lvbiwgc2VsZi5jb2RlbmFtZSgpKQogICAgICAgIHJldHVybiB2ZXJzaW9uCgogICAgZGVmIHZlcnNpb25fcGFydHMoc2VsZiwgYmVzdD1GYWxzZSk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIHRoZSB2ZXJzaW9uIG9mIHRoZSBMaW51eCBkaXN0cmlidXRpb24sIGFzIGEgdHVwbGUgb2YgdmVyc2lvbgogICAgICAgIG51bWJlcnMuCgogICAgICAgIEZvciBkZXRhaWxzLCBzZWUgOmZ1bmM6YGRpc3Ryby52ZXJzaW9uX3BhcnRzYC4KICAgICAgICAiIiIKICAgICAgICB2ZXJzaW9uX3N0ciA9IHNlbGYudmVyc2lvbihiZXN0PWJlc3QpCiAgICAgICAgaWYgdmVyc2lvbl9zdHI6CiAgICAgICAgICAgIHZlcnNpb25fcmVnZXggPSByZS5jb21waWxlKHInKFxkKylcLj8oXGQrKT9cLj8oXGQrKT8nKQogICAgICAgICAgICBtYXRjaGVzID0gdmVyc2lvbl9yZWdleC5tYXRjaCh2ZXJzaW9uX3N0cikKICAgICAgICAgICAgaWYgbWF0Y2hlczoKICAgICAgICAgICAgICAgIG1ham9yLCBtaW5vciwgYnVpbGRfbnVtYmVyID0gbWF0Y2hlcy5ncm91cHMoKQogICAgICAgICAgICAgICAgcmV0dXJuIG1ham9yLCBtaW5vciBvciAnJywgYnVpbGRfbnVtYmVyIG9yICcnCiAgICAgICAgcmV0dXJuICcnLCAnJywgJycKCiAgICBkZWYgbWFqb3JfdmVyc2lvbihzZWxmLCBiZXN0PUZhbHNlKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gdGhlIG1ham9yIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBjdXJyZW50IGRpc3RyaWJ1dGlvbi4KCiAgICAgICAgRm9yIGRldGFpbHMsIHNlZSA6ZnVuYzpgZGlzdHJvLm1ham9yX3ZlcnNpb25gLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmLnZlcnNpb25fcGFydHMoYmVzdClbMF0KCiAgICBkZWYgbWlub3JfdmVyc2lvbihzZWxmLCBiZXN0PUZhbHNlKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gdGhlIG1pbm9yIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBMaW51eCBkaXN0cmlidXRpb24uCgogICAgICAgIEZvciBkZXRhaWxzLCBzZWUgOmZ1bmM6YGRpc3Ryby5taW5vcl92ZXJzaW9uYC4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZi52ZXJzaW9uX3BhcnRzKGJlc3QpWzFdCgogICAgZGVmIGJ1aWxkX251bWJlcihzZWxmLCBiZXN0PUZhbHNlKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gdGhlIGJ1aWxkIG51bWJlciBvZiB0aGUgTGludXggZGlzdHJpYnV0aW9uLgoKICAgICAgICBGb3IgZGV0YWlscywgc2VlIDpmdW5jOmBkaXN0cm8uYnVpbGRfbnVtYmVyYC4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZi52ZXJzaW9uX3BhcnRzKGJlc3QpWzJdCgogICAgZGVmIGxpa2Uoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIHRoZSBJRHMgb2YgZGlzdHJpYnV0aW9ucyB0aGF0IGFyZSBsaWtlIHRoZSBMaW51eCBkaXN0cmlidXRpb24uCgogICAgICAgIEZvciBkZXRhaWxzLCBzZWUgOmZ1bmM6YGRpc3Ryby5saWtlYC4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZi5vc19yZWxlYXNlX2F0dHIoJ2lkX2xpa2UnKSBvciAnJwoKICAgIGRlZiBjb2RlbmFtZShzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gdGhlIGNvZGVuYW1lIG9mIHRoZSBMaW51eCBkaXN0cmlidXRpb24uCgogICAgICAgIEZvciBkZXRhaWxzLCBzZWUgOmZ1bmM6YGRpc3Ryby5jb2RlbmFtZWAuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYub3NfcmVsZWFzZV9hdHRyKCdjb2RlbmFtZScpIFwKICAgICAgICAgICAgb3Igc2VsZi5sc2JfcmVsZWFzZV9hdHRyKCdjb2RlbmFtZScpIFwKICAgICAgICAgICAgb3Igc2VsZi5kaXN0cm9fcmVsZWFzZV9hdHRyKCdjb2RlbmFtZScpIFwKICAgICAgICAgICAgb3IgJycKCiAgICBkZWYgaW5mbyhzZWxmLCBwcmV0dHk9RmFsc2UsIGJlc3Q9RmFsc2UpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBjZXJ0YWluIG1hY2hpbmUtcmVhZGFibGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIExpbnV4CiAgICAgICAgZGlzdHJpYnV0aW9uLgoKICAgICAgICBGb3IgZGV0YWlscywgc2VlIDpmdW5jOmBkaXN0cm8uaW5mb2AuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIGRpY3QoCiAgICAgICAgICAgIGlkPXNlbGYuaWQoKSwKICAgICAgICAgICAgdmVyc2lvbj1zZWxmLnZlcnNpb24ocHJldHR5LCBiZXN0KSwKICAgICAgICAgICAgdmVyc2lvbl9wYXJ0cz1kaWN0KAogICAgICAgICAgICAgICAgbWFqb3I9c2VsZi5tYWpvcl92ZXJzaW9uKGJlc3QpLAogICAgICAgICAgICAgICAgbWlub3I9c2VsZi5taW5vcl92ZXJzaW9uKGJlc3QpLAogICAgICAgICAgICAgICAgYnVpbGRfbnVtYmVyPXNlbGYuYnVpbGRfbnVtYmVyKGJlc3QpCiAgICAgICAgICAgICksCiAgICAgICAgICAgIGxpa2U9c2VsZi5saWtlKCksCiAgICAgICAgICAgIGNvZGVuYW1lPXNlbGYuY29kZW5hbWUoKSwKICAgICAgICApCgogICAgZGVmIG9zX3JlbGVhc2VfaW5mbyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gYSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcga2V5LXZhbHVlIHBhaXJzIGZvciB0aGUgaW5mb3JtYXRpb24KICAgICAgICBpdGVtcyBmcm9tIHRoZSBvcy1yZWxlYXNlIGZpbGUgZGF0YSBzb3VyY2Ugb2YgdGhlIExpbnV4IGRpc3RyaWJ1dGlvbi4KCiAgICAgICAgRm9yIGRldGFpbHMsIHNlZSA6ZnVuYzpgZGlzdHJvLm9zX3JlbGVhc2VfaW5mb2AuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuX29zX3JlbGVhc2VfaW5mbwoKICAgIGRlZiBsc2JfcmVsZWFzZV9pbmZvKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBhIGRpY3Rpb25hcnkgY29udGFpbmluZyBrZXktdmFsdWUgcGFpcnMgZm9yIHRoZSBpbmZvcm1hdGlvbgogICAgICAgIGl0ZW1zIGZyb20gdGhlIGxzYl9yZWxlYXNlIGNvbW1hbmQgZGF0YSBzb3VyY2Ugb2YgdGhlIExpbnV4CiAgICAgICAgZGlzdHJpYnV0aW9uLgoKICAgICAgICBGb3IgZGV0YWlscywgc2VlIDpmdW5jOmBkaXN0cm8ubHNiX3JlbGVhc2VfaW5mb2AuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuX2xzYl9yZWxlYXNlX2luZm8KCiAgICBkZWYgZGlzdHJvX3JlbGVhc2VfaW5mbyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gYSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcga2V5LXZhbHVlIHBhaXJzIGZvciB0aGUgaW5mb3JtYXRpb24KICAgICAgICBpdGVtcyBmcm9tIHRoZSBkaXN0cm8gcmVsZWFzZSBmaWxlIGRhdGEgc291cmNlIG9mIHRoZSBMaW51eAogICAgICAgIGRpc3RyaWJ1dGlvbi4KCiAgICAgICAgRm9yIGRldGFpbHMsIHNlZSA6ZnVuYzpgZGlzdHJvLmRpc3Ryb19yZWxlYXNlX2luZm9gLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmLl9kaXN0cm9fcmVsZWFzZV9pbmZvCgogICAgZGVmIG9zX3JlbGVhc2VfYXR0cihzZWxmLCBhdHRyaWJ1dGUpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBhIHNpbmdsZSBuYW1lZCBpbmZvcm1hdGlvbiBpdGVtIGZyb20gdGhlIG9zLXJlbGVhc2UgZmlsZSBkYXRhCiAgICAgICAgc291cmNlIG9mIHRoZSBMaW51eCBkaXN0cmlidXRpb24uCgogICAgICAgIEZvciBkZXRhaWxzLCBzZWUgOmZ1bmM6YGRpc3Ryby5vc19yZWxlYXNlX2F0dHJgLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmLl9vc19yZWxlYXNlX2luZm8uZ2V0KGF0dHJpYnV0ZSwgJycpCgogICAgZGVmIGxzYl9yZWxlYXNlX2F0dHIoc2VsZiwgYXR0cmlidXRlKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gYSBzaW5nbGUgbmFtZWQgaW5mb3JtYXRpb24gaXRlbSBmcm9tIHRoZSBsc2JfcmVsZWFzZSBjb21tYW5kCiAgICAgICAgb3V0cHV0IGRhdGEgc291cmNlIG9mIHRoZSBMaW51eCBkaXN0cmlidXRpb24uCgogICAgICAgIEZvciBkZXRhaWxzLCBzZWUgOmZ1bmM6YGRpc3Ryby5sc2JfcmVsZWFzZV9hdHRyYC4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZi5fbHNiX3JlbGVhc2VfaW5mby5nZXQoYXR0cmlidXRlLCAnJykKCiAgICBkZWYgZGlzdHJvX3JlbGVhc2VfYXR0cihzZWxmLCBhdHRyaWJ1dGUpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBhIHNpbmdsZSBuYW1lZCBpbmZvcm1hdGlvbiBpdGVtIGZyb20gdGhlIGRpc3RybyByZWxlYXNlIGZpbGUKICAgICAgICBkYXRhIHNvdXJjZSBvZiB0aGUgTGludXggZGlzdHJpYnV0aW9uLgoKICAgICAgICBGb3IgZGV0YWlscywgc2VlIDpmdW5jOmBkaXN0cm8uZGlzdHJvX3JlbGVhc2VfYXR0cmAuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuX2Rpc3Ryb19yZWxlYXNlX2luZm8uZ2V0KGF0dHJpYnV0ZSwgJycpCgogICAgZGVmIF9nZXRfb3NfcmVsZWFzZV9pbmZvKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIEdldCB0aGUgaW5mb3JtYXRpb24gaXRlbXMgZnJvbSB0aGUgc3BlY2lmaWVkIG9zLXJlbGVhc2UgZmlsZS4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgQSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgYWxsIGluZm9ybWF0aW9uIGl0ZW1zLgogICAgICAgICIiIgogICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKHNlbGYub3NfcmVsZWFzZV9maWxlKToKICAgICAgICAgICAgd2l0aCBvcGVuKHNlbGYub3NfcmVsZWFzZV9maWxlKSBhcyByZWxlYXNlX2ZpbGU6CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fcGFyc2Vfb3NfcmVsZWFzZV9jb250ZW50KHJlbGVhc2VfZmlsZSkKICAgICAgICByZXR1cm4ge30KCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX3BhcnNlX29zX3JlbGVhc2VfY29udGVudChsaW5lcyk6CiAgICAgICAgIiIiCiAgICAgICAgUGFyc2UgdGhlIGxpbmVzIG9mIGFuIG9zLXJlbGVhc2UgZmlsZS4KCiAgICAgICAgUGFyYW1ldGVyczoKCiAgICAgICAgKiBsaW5lczogSXRlcmFibGUgdGhyb3VnaCB0aGUgbGluZXMgaW4gdGhlIG9zLXJlbGVhc2UgZmlsZS4KICAgICAgICAgICAgICAgICBFYWNoIGxpbmUgbXVzdCBiZSBhIHVuaWNvZGUgc3RyaW5nIG9yIGEgVVRGLTggZW5jb2RlZCBieXRlCiAgICAgICAgICAgICAgICAgc3RyaW5nLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBBIGRpY3Rpb25hcnkgY29udGFpbmluZyBhbGwgaW5mb3JtYXRpb24gaXRlbXMuCiAgICAgICAgIiIiCiAgICAgICAgcHJvcHMgPSB7fQogICAgICAgIGxleGVyID0gc2hsZXguc2hsZXgobGluZXMsIHBvc2l4PVRydWUpCiAgICAgICAgbGV4ZXIud2hpdGVzcGFjZV9zcGxpdCA9IFRydWUKCiAgICAgICAgIyBUaGUgc2hsZXggbW9kdWxlIGRlZmluZXMgaXRzIGB3b3JkY2hhcnNgIHZhcmlhYmxlIHVzaW5nIGxpdGVyYWxzLAogICAgICAgICMgbWFraW5nIGl0IGRlcGVuZGVudCBvbiB0aGUgZW5jb2Rpbmcgb2YgdGhlIFB5dGhvbiBzb3VyY2UgZmlsZS4KICAgICAgICAjIEluIFB5dGhvbiAyLjYgYW5kIDIuNywgdGhlIHNobGV4IHNvdXJjZSBmaWxlIGlzIGVuY29kZWQgaW4KICAgICAgICAjICdpc28tODg1OS0xJywgYW5kIHRoZSBgd29yZGNoYXJzYCB2YXJpYWJsZSBpcyBkZWZpbmVkIGFzIGEgYnl0ZQogICAgICAgICMgc3RyaW5nLiBUaGlzIGNhdXNlcyBhIFVuaWNvZGVEZWNvZGVFcnJvciB0byBiZSByYWlzZWQgd2hlbiB0aGUKICAgICAgICAjIHBhcnNlZCBjb250ZW50IGlzIGEgdW5pY29kZSBvYmplY3QuIFRoZSBmb2xsb3dpbmcgZml4IHJlc29sdmVzIHRoYXQKICAgICAgICAjICguLi4gYnV0IGl0IHNob3VsZCBiZSBmaXhlZCBpbiBzaGxleC4uLik6CiAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mb1swXSA9PSAyIGFuZCBpc2luc3RhbmNlKGxleGVyLndvcmRjaGFycywgYnl0ZXMpOgogICAgICAgICAgICBsZXhlci53b3JkY2hhcnMgPSBsZXhlci53b3JkY2hhcnMuZGVjb2RlKCdpc28tODg1OS0xJykKCiAgICAgICAgdG9rZW5zID0gbGlzdChsZXhlcikKICAgICAgICBmb3IgdG9rZW4gaW4gdG9rZW5zOgogICAgICAgICAgICAjIEF0IHRoaXMgcG9pbnQsIGFsbCBzaGVsbC1saWtlIHBhcnNpbmcgaGFzIGJlZW4gZG9uZSAoaS5lLgogICAgICAgICAgICAjIGNvbW1lbnRzIHByb2Nlc3NlZCwgcXVvdGVzIGFuZCBiYWNrc2xhc2ggZXNjYXBlIHNlcXVlbmNlcwogICAgICAgICAgICAjIHByb2Nlc3NlZCwgbXVsdGktbGluZSB2YWx1ZXMgYXNzZW1ibGVkLCB0cmFpbGluZyBuZXdsaW5lcwogICAgICAgICAgICAjIHN0cmlwcGVkLCBldGMuKSwgc28gdGhlIHRva2VucyBhcmUgbm93IGVpdGhlcjoKICAgICAgICAgICAgIyAqIHZhcmlhYmxlIGFzc2lnbm1lbnRzOiB2YXI9dmFsdWUKICAgICAgICAgICAgIyAqIGNvbW1hbmRzIG9yIHRoZWlyIGFyZ3VtZW50cyAobm90IGFsbG93ZWQgaW4gb3MtcmVsZWFzZSkKICAgICAgICAgICAgaWYgJz0nIGluIHRva2VuOgogICAgICAgICAgICAgICAgaywgdiA9IHRva2VuLnNwbGl0KCc9JywgMSkKICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodiwgYnl0ZXMpOgogICAgICAgICAgICAgICAgICAgIHYgPSB2LmRlY29kZSgndXRmLTgnKQogICAgICAgICAgICAgICAgcHJvcHNbay5sb3dlcigpXSA9IHYKICAgICAgICAgICAgICAgIGlmIGsgPT0gJ1ZFUlNJT04nOgogICAgICAgICAgICAgICAgICAgICMgdGhpcyBoYW5kbGVzIGNhc2VzIGluIHdoaWNoIHRoZSBjb2RlbmFtZSBpcyBpbgogICAgICAgICAgICAgICAgICAgICMgdGhlIGAoQ09ERU5BTUUpYCAocmhlbCwgY2VudG9zLCBmZWRvcmEpIGZvcm1hdAogICAgICAgICAgICAgICAgICAgICMgb3IgaW4gdGhlIGAsIENPREVOQU1FYCBmb3JtYXQgKFVidW50dSkuCiAgICAgICAgICAgICAgICAgICAgY29kZW5hbWUgPSByZS5zZWFyY2gocicoXChcRCtcKSl8LChccyspP1xEKycsIHYpCiAgICAgICAgICAgICAgICAgICAgaWYgY29kZW5hbWU6CiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVuYW1lID0gY29kZW5hbWUuZ3JvdXAoKQogICAgICAgICAgICAgICAgICAgICAgICBjb2RlbmFtZSA9IGNvZGVuYW1lLnN0cmlwKCcoKScpCiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVuYW1lID0gY29kZW5hbWUuc3RyaXAoJywnKQogICAgICAgICAgICAgICAgICAgICAgICBjb2RlbmFtZSA9IGNvZGVuYW1lLnN0cmlwKCkKICAgICAgICAgICAgICAgICAgICAgICAgIyBjb2RlbmFtZSBhcHBlYXJzIHdpdGhpbiBwYXJhbnRoZXNlLgogICAgICAgICAgICAgICAgICAgICAgICBwcm9wc1snY29kZW5hbWUnXSA9IGNvZGVuYW1lCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHNbJ2NvZGVuYW1lJ10gPSAnJwogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBJZ25vcmUgYW55IHRva2VucyB0aGF0IGFyZSBub3QgdmFyaWFibGUgYXNzaWdubWVudHMKICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICByZXR1cm4gcHJvcHMKCiAgICBkZWYgX2dldF9sc2JfcmVsZWFzZV9pbmZvKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIEdldCB0aGUgaW5mb3JtYXRpb24gaXRlbXMgZnJvbSB0aGUgbHNiX3JlbGVhc2UgY29tbWFuZCBvdXRwdXQuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIEEgZGljdGlvbmFyeSBjb250YWluaW5nIGFsbCBpbmZvcm1hdGlvbiBpdGVtcy4KICAgICAgICAiIiIKICAgICAgICBjbWQgPSAnbHNiX3JlbGVhc2UgLWEnCiAgICAgICAgcHJvY2VzcyA9IHN1YnByb2Nlc3MuUG9wZW4oCiAgICAgICAgICAgIGNtZCwKICAgICAgICAgICAgc2hlbGw9VHJ1ZSwKICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwKICAgICAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSkKICAgICAgICBzdGRvdXQsIHN0ZGVyciA9IHByb2Nlc3MuY29tbXVuaWNhdGUoKQogICAgICAgIHN0ZG91dCwgc3RkZXJyID0gc3Rkb3V0LmRlY29kZSgndXRmLTgnKSwgc3RkZXJyLmRlY29kZSgndXRmLTgnKQogICAgICAgIGNvZGUgPSBwcm9jZXNzLnJldHVybmNvZGUKICAgICAgICBpZiBjb2RlID09IDA6CiAgICAgICAgICAgIGNvbnRlbnQgPSBzdGRvdXQuc3BsaXRsaW5lcygpCiAgICAgICAgICAgIHJldHVybiBzZWxmLl9wYXJzZV9sc2JfcmVsZWFzZV9jb250ZW50KGNvbnRlbnQpCiAgICAgICAgZWxpZiBjb2RlID09IDEyNzogICMgQ29tbWFuZCBub3QgZm91bmQKICAgICAgICAgICAgcmV0dXJuIHt9CiAgICAgICAgZWxzZToKICAgICAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mb1s6Ml0gPj0gKDMsIDUpOgogICAgICAgICAgICAgICAgcmFpc2Ugc3VicHJvY2Vzcy5DYWxsZWRQcm9jZXNzRXJyb3IoY29kZSwgY21kLCBzdGRvdXQsIHN0ZGVycikKICAgICAgICAgICAgZWxpZiBzeXMudmVyc2lvbl9pbmZvWzoyXSA+PSAoMiwgNyk6CiAgICAgICAgICAgICAgICByYWlzZSBzdWJwcm9jZXNzLkNhbGxlZFByb2Nlc3NFcnJvcihjb2RlLCBjbWQsIHN0ZG91dCkKICAgICAgICAgICAgZWxpZiBzeXMudmVyc2lvbl9pbmZvWzoyXSA9PSAoMiwgNik6CiAgICAgICAgICAgICAgICByYWlzZSBzdWJwcm9jZXNzLkNhbGxlZFByb2Nlc3NFcnJvcihjb2RlLCBjbWQpCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9wYXJzZV9sc2JfcmVsZWFzZV9jb250ZW50KGxpbmVzKToKICAgICAgICAiIiIKICAgICAgICBQYXJzZSB0aGUgb3V0cHV0IG9mIHRoZSBsc2JfcmVsZWFzZSBjb21tYW5kLgoKICAgICAgICBQYXJhbWV0ZXJzOgoKICAgICAgICAqIGxpbmVzOiBJdGVyYWJsZSB0aHJvdWdoIHRoZSBsaW5lcyBvZiB0aGUgbHNiX3JlbGVhc2Ugb3V0cHV0LgogICAgICAgICAgICAgICAgIEVhY2ggbGluZSBtdXN0IGJlIGEgdW5pY29kZSBzdHJpbmcgb3IgYSBVVEYtOCBlbmNvZGVkIGJ5dGUKICAgICAgICAgICAgICAgICBzdHJpbmcuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIEEgZGljdGlvbmFyeSBjb250YWluaW5nIGFsbCBpbmZvcm1hdGlvbiBpdGVtcy4KICAgICAgICAiIiIKICAgICAgICBwcm9wcyA9IHt9CiAgICAgICAgZm9yIGxpbmUgaW4gbGluZXM6CiAgICAgICAgICAgIGxpbmUgPSBsaW5lLmRlY29kZSgndXRmLTgnKSBpZiBpc2luc3RhbmNlKGxpbmUsIGJ5dGVzKSBlbHNlIGxpbmUKICAgICAgICAgICAga3YgPSBsaW5lLnN0cmlwKCdcbicpLnNwbGl0KCc6JywgMSkKICAgICAgICAgICAgaWYgbGVuKGt2KSAhPSAyOgogICAgICAgICAgICAgICAgIyBJZ25vcmUgbGluZXMgd2l0aG91dCBjb2xvbi4KICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGssIHYgPSBrdgogICAgICAgICAgICBwcm9wcy51cGRhdGUoe2sucmVwbGFjZSgnICcsICdfJykubG93ZXIoKTogdi5zdHJpcCgpfSkKICAgICAgICByZXR1cm4gcHJvcHMKCiAgICBkZWYgX2dldF9kaXN0cm9fcmVsZWFzZV9pbmZvKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIEdldCB0aGUgaW5mb3JtYXRpb24gaXRlbXMgZnJvbSB0aGUgc3BlY2lmaWVkIGRpc3RybyByZWxlYXNlIGZpbGUuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIEEgZGljdGlvbmFyeSBjb250YWluaW5nIGFsbCBpbmZvcm1hdGlvbiBpdGVtcy4KICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLmRpc3Ryb19yZWxlYXNlX2ZpbGU6CiAgICAgICAgICAgICMgSWYgaXQgd2FzIHNwZWNpZmllZCwgd2UgdXNlIGl0IGFuZCBwYXJzZSB3aGF0IHdlIGNhbiwgZXZlbiBpZgogICAgICAgICAgICAjIGl0cyBmaWxlIG5hbWUgb3IgY29udGVudCBkb2VzIG5vdCBtYXRjaCB0aGUgZXhwZWN0ZWQgcGF0dGVybi4KICAgICAgICAgICAgZGlzdHJvX2luZm8gPSBzZWxmLl9wYXJzZV9kaXN0cm9fcmVsZWFzZV9maWxlKAogICAgICAgICAgICAgICAgc2VsZi5kaXN0cm9fcmVsZWFzZV9maWxlKQogICAgICAgICAgICBiYXNlbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUoc2VsZi5kaXN0cm9fcmVsZWFzZV9maWxlKQogICAgICAgICAgICAjIFRoZSBmaWxlIG5hbWUgcGF0dGVybiBmb3IgdXNlci1zcGVjaWZpZWQgZGlzdHJvIHJlbGVhc2UgZmlsZXMKICAgICAgICAgICAgIyBpcyBzb21ld2hhdCBtb3JlIHRvbGVyYW50IChjb21wYXJlZCB0byB3aGVuIHNlYXJjaGluZyBmb3IgdGhlCiAgICAgICAgICAgICMgZmlsZSksIGJlY2F1c2Ugd2Ugd2FudCB0byB1c2Ugd2hhdCB3YXMgc3BlY2lmaWVkIGFzIGJlc3QgYXMKICAgICAgICAgICAgIyBwb3NzaWJsZS4KICAgICAgICAgICAgbWF0Y2ggPSBfRElTVFJPX1JFTEVBU0VfQkFTRU5BTUVfUEFUVEVSTi5tYXRjaChiYXNlbmFtZSkKICAgICAgICAgICAgaWYgbWF0Y2g6CiAgICAgICAgICAgICAgICBkaXN0cm9faW5mb1snaWQnXSA9IG1hdGNoLmdyb3VwKDEpCiAgICAgICAgICAgIHJldHVybiBkaXN0cm9faW5mbwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGJhc2VuYW1lcyA9IG9zLmxpc3RkaXIoX1VOSVhDT05GRElSKQogICAgICAgICAgICAjIFdlIHNvcnQgZm9yIHJlcGVhdGFiaWxpdHkgaW4gY2FzZXMgd2hlcmUgdGhlcmUgYXJlIG11bHRpcGxlCiAgICAgICAgICAgICMgZGlzdHJvIHNwZWNpZmljIGZpbGVzOyBlLmcuIENlbnRPUywgT3JhY2xlLCBFbnRlcnByaXNlIGFsbAogICAgICAgICAgICAjIGNvbnRhaW5pbmcgYHJlZGhhdC1yZWxlYXNlYCBvbiB0b3Agb2YgdGhlaXIgb3duLgogICAgICAgICAgICBiYXNlbmFtZXMuc29ydCgpCiAgICAgICAgICAgIGZvciBiYXNlbmFtZSBpbiBiYXNlbmFtZXM6CiAgICAgICAgICAgICAgICBpZiBiYXNlbmFtZSBpbiBfRElTVFJPX1JFTEVBU0VfSUdOT1JFX0JBU0VOQU1FUzoKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgbWF0Y2ggPSBfRElTVFJPX1JFTEVBU0VfQkFTRU5BTUVfUEFUVEVSTi5tYXRjaChiYXNlbmFtZSkKICAgICAgICAgICAgICAgIGlmIG1hdGNoOgogICAgICAgICAgICAgICAgICAgIGZpbGVwYXRoID0gb3MucGF0aC5qb2luKF9VTklYQ09ORkRJUiwgYmFzZW5hbWUpCiAgICAgICAgICAgICAgICAgICAgZGlzdHJvX2luZm8gPSBzZWxmLl9wYXJzZV9kaXN0cm9fcmVsZWFzZV9maWxlKGZpbGVwYXRoKQogICAgICAgICAgICAgICAgICAgIGlmICduYW1lJyBpbiBkaXN0cm9faW5mbzoKICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGUgbmFtZSBpcyBhbHdheXMgcHJlc2VudCBpZiB0aGUgcGF0dGVybiBtYXRjaGVzCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGlzdHJvX3JlbGVhc2VfZmlsZSA9IGZpbGVwYXRoCiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3Ryb19pbmZvWydpZCddID0gbWF0Y2guZ3JvdXAoMSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRpc3Ryb19pbmZvCiAgICAgICAgICAgIHJldHVybiB7fQoKICAgIGRlZiBfcGFyc2VfZGlzdHJvX3JlbGVhc2VfZmlsZShzZWxmLCBmaWxlcGF0aCk6CiAgICAgICAgIiIiCiAgICAgICAgUGFyc2UgYSBkaXN0cm8gcmVsZWFzZSBmaWxlLgoKICAgICAgICBQYXJhbWV0ZXJzOgoKICAgICAgICAqIGZpbGVwYXRoOiBQYXRoIG5hbWUgb2YgdGhlIGRpc3RybyByZWxlYXNlIGZpbGUuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIEEgZGljdGlvbmFyeSBjb250YWluaW5nIGFsbCBpbmZvcm1hdGlvbiBpdGVtcy4KICAgICAgICAiIiIKICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShmaWxlcGF0aCk6CiAgICAgICAgICAgIHdpdGggb3BlbihmaWxlcGF0aCkgYXMgZnA6CiAgICAgICAgICAgICAgICAjIE9ubHkgcGFyc2UgdGhlIGZpcnN0IGxpbmUuIEZvciBpbnN0YW5jZSwgb24gU0xFUyB0aGVyZQogICAgICAgICAgICAgICAgIyBhcmUgbXVsdGlwbGUgbGluZXMuIFdlIGRvbid0IHdhbnQgdGhlbS4uLgogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3BhcnNlX2Rpc3Ryb19yZWxlYXNlX2NvbnRlbnQoZnAucmVhZGxpbmUoKSkKICAgICAgICByZXR1cm4ge30KCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX3BhcnNlX2Rpc3Ryb19yZWxlYXNlX2NvbnRlbnQobGluZSk6CiAgICAgICAgIiIiCiAgICAgICAgUGFyc2UgYSBsaW5lIGZyb20gYSBkaXN0cm8gcmVsZWFzZSBmaWxlLgoKICAgICAgICBQYXJhbWV0ZXJzOgogICAgICAgICogbGluZTogTGluZSBmcm9tIHRoZSBkaXN0cm8gcmVsZWFzZSBmaWxlLiBNdXN0IGJlIGEgdW5pY29kZSBzdHJpbmcKICAgICAgICAgICAgICAgIG9yIGEgVVRGLTggZW5jb2RlZCBieXRlIHN0cmluZy4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgQSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgYWxsIGluZm9ybWF0aW9uIGl0ZW1zLgogICAgICAgICIiIgogICAgICAgIGlmIGlzaW5zdGFuY2UobGluZSwgYnl0ZXMpOgogICAgICAgICAgICBsaW5lID0gbGluZS5kZWNvZGUoJ3V0Zi04JykKICAgICAgICBtYXRjaGVzID0gX0RJU1RST19SRUxFQVNFX0NPTlRFTlRfUkVWRVJTRURfUEFUVEVSTi5tYXRjaCgKICAgICAgICAgICAgbGluZS5zdHJpcCgpWzo6LTFdKQogICAgICAgIGRpc3Ryb19pbmZvID0ge30KICAgICAgICBpZiBtYXRjaGVzOgogICAgICAgICAgICAjIHJlZ2V4cCBlbnN1cmVzIG5vbi1Ob25lCiAgICAgICAgICAgIGRpc3Ryb19pbmZvWyduYW1lJ10gPSBtYXRjaGVzLmdyb3VwKDMpWzo6LTFdCiAgICAgICAgICAgIGlmIG1hdGNoZXMuZ3JvdXAoMik6CiAgICAgICAgICAgICAgICBkaXN0cm9faW5mb1sndmVyc2lvbl9pZCddID0gbWF0Y2hlcy5ncm91cCgyKVs6Oi0xXQogICAgICAgICAgICBpZiBtYXRjaGVzLmdyb3VwKDEpOgogICAgICAgICAgICAgICAgZGlzdHJvX2luZm9bJ2NvZGVuYW1lJ10gPSBtYXRjaGVzLmdyb3VwKDEpWzo6LTFdCiAgICAgICAgZWxpZiBsaW5lOgogICAgICAgICAgICBkaXN0cm9faW5mb1snbmFtZSddID0gbGluZS5zdHJpcCgpCiAgICAgICAgcmV0dXJuIGRpc3Ryb19pbmZvCgoKX2Rpc3RybyA9IExpbnV4RGlzdHJpYnV0aW9uKCkKCgpkZWYgbWFpbigpOgogICAgaW1wb3J0IGFyZ3BhcnNlCgogICAgbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCiAgICBsb2dnZXIuc2V0TGV2ZWwobG9nZ2luZy5ERUJVRykKICAgIGxvZ2dlci5hZGRIYW5kbGVyKGxvZ2dpbmcuU3RyZWFtSGFuZGxlcihzeXMuc3Rkb3V0KSkKCiAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcihkZXNjcmlwdGlvbj0iTGludXggZGlzdHJvIGluZm8gdG9vbCIpCiAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KAogICAgICAgICctLWpzb24nLAogICAgICAgICctaicsCiAgICAgICAgaGVscD0iT3V0cHV0IGluIG1hY2hpbmUgcmVhZGFibGUgZm9ybWF0IiwKICAgICAgICBhY3Rpb249InN0b3JlX3RydWUiKQogICAgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKCiAgICBpZiBhcmdzLmpzb246CiAgICAgICAgbG9nZ2VyLmluZm8oanNvbi5kdW1wcyhpbmZvKCksIGluZGVudD00LCBzb3J0X2tleXM9VHJ1ZSkpCiAgICBlbHNlOgogICAgICAgIGxvZ2dlci5pbmZvKCdOYW1lOiAlcycsIG5hbWUocHJldHR5PVRydWUpKQogICAgICAgIGRpc3RyaWJ1dGlvbl92ZXJzaW9uID0gdmVyc2lvbihwcmV0dHk9VHJ1ZSkKICAgICAgICBpZiBkaXN0cmlidXRpb25fdmVyc2lvbjoKICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ1ZlcnNpb246ICVzJywgZGlzdHJpYnV0aW9uX3ZlcnNpb24pCiAgICAgICAgZGlzdHJpYnV0aW9uX2NvZGVuYW1lID0gY29kZW5hbWUoKQogICAgICAgIGlmIGRpc3RyaWJ1dGlvbl9jb2RlbmFtZToKICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ0NvZGVuYW1lOiAlcycsIGRpc3RyaWJ1dGlvbl9jb2RlbmFtZSkKCgppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgbWFpbigpClBLAwQUAAAAAAAAACEAopuZnAwDAAAMAwAAPQAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvX19pbml0X18ucHkiIiIKSFRNTCBwYXJzaW5nIGxpYnJhcnkgYmFzZWQgb24gdGhlIFdIQVRXRyAiSFRNTDUiCnNwZWNpZmljYXRpb24uIFRoZSBwYXJzZXIgaXMgZGVzaWduZWQgdG8gYmUgY29tcGF0aWJsZSB3aXRoIGV4aXN0aW5nCkhUTUwgZm91bmQgaW4gdGhlIHdpbGQgYW5kIGltcGxlbWVudHMgd2VsbC1kZWZpbmVkIGVycm9yIHJlY292ZXJ5IHRoYXQKaXMgbGFyZ2VseSBjb21wYXRpYmxlIHdpdGggbW9kZXJuIGRlc2t0b3Agd2ViIGJyb3dzZXJzLgoKRXhhbXBsZSB1c2FnZToKCmltcG9ydCBodG1sNWxpYgpmID0gb3BlbigibXlfZG9jdW1lbnQuaHRtbCIpCnRyZWUgPSBodG1sNWxpYi5wYXJzZShmKQoiIiIKCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgdW5pY29kZV9saXRlcmFscwoKZnJvbSAuaHRtbDVwYXJzZXIgaW1wb3J0IEhUTUxQYXJzZXIsIHBhcnNlLCBwYXJzZUZyYWdtZW50CmZyb20gLnRyZWVidWlsZGVycyBpbXBvcnQgZ2V0VHJlZUJ1aWxkZXIKZnJvbSAudHJlZXdhbGtlcnMgaW1wb3J0IGdldFRyZWVXYWxrZXIKZnJvbSAuc2VyaWFsaXplciBpbXBvcnQgc2VyaWFsaXplCgpfX2FsbF9fID0gWyJIVE1MUGFyc2VyIiwgInBhcnNlIiwgInBhcnNlRnJhZ21lbnQiLCAiZ2V0VHJlZUJ1aWxkZXIiLAogICAgICAgICAgICJnZXRUcmVlV2Fsa2VyIiwgInNlcmlhbGl6ZSJdCgojIHRoaXMgaGFzIHRvIGJlIGF0IHRoZSB0b3AgbGV2ZWwsIHNlZSBob3cgc2V0dXAucHkgcGFyc2VzIHRoaXMKX192ZXJzaW9uX18gPSAiMS4wYjEwIgpQSwMEFAAAAAAAAAAhANV4DuJBQQAAQUEAAD4AAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL19paGF0ZXhtbC5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgdW5pY29kZV9saXRlcmFscwoKaW1wb3J0IHJlCmltcG9ydCB3YXJuaW5ncwoKZnJvbSAuY29uc3RhbnRzIGltcG9ydCBEYXRhTG9zc1dhcm5pbmcKCmJhc2VDaGFyID0gIiIiClsjeDAwNDEtI3gwMDVBXSB8IFsjeDAwNjEtI3gwMDdBXSB8IFsjeDAwQzAtI3gwMEQ2XSB8IFsjeDAwRDgtI3gwMEY2XSB8ClsjeDAwRjgtI3gwMEZGXSB8IFsjeDAxMDAtI3gwMTMxXSB8IFsjeDAxMzQtI3gwMTNFXSB8IFsjeDAxNDEtI3gwMTQ4XSB8ClsjeDAxNEEtI3gwMTdFXSB8IFsjeDAxODAtI3gwMUMzXSB8IFsjeDAxQ0QtI3gwMUYwXSB8IFsjeDAxRjQtI3gwMUY1XSB8ClsjeDAxRkEtI3gwMjE3XSB8IFsjeDAyNTAtI3gwMkE4XSB8IFsjeDAyQkItI3gwMkMxXSB8ICN4MDM4NiB8ClsjeDAzODgtI3gwMzhBXSB8ICN4MDM4QyB8IFsjeDAzOEUtI3gwM0ExXSB8IFsjeDAzQTMtI3gwM0NFXSB8ClsjeDAzRDAtI3gwM0Q2XSB8ICN4MDNEQSB8ICN4MDNEQyB8ICN4MDNERSB8ICN4MDNFMCB8IFsjeDAzRTItI3gwM0YzXSB8ClsjeDA0MDEtI3gwNDBDXSB8IFsjeDA0MEUtI3gwNDRGXSB8IFsjeDA0NTEtI3gwNDVDXSB8IFsjeDA0NUUtI3gwNDgxXSB8ClsjeDA0OTAtI3gwNEM0XSB8IFsjeDA0QzctI3gwNEM4XSB8IFsjeDA0Q0ItI3gwNENDXSB8IFsjeDA0RDAtI3gwNEVCXSB8ClsjeDA0RUUtI3gwNEY1XSB8IFsjeDA0RjgtI3gwNEY5XSB8IFsjeDA1MzEtI3gwNTU2XSB8ICN4MDU1OSB8ClsjeDA1NjEtI3gwNTg2XSB8IFsjeDA1RDAtI3gwNUVBXSB8IFsjeDA1RjAtI3gwNUYyXSB8IFsjeDA2MjEtI3gwNjNBXSB8ClsjeDA2NDEtI3gwNjRBXSB8IFsjeDA2NzEtI3gwNkI3XSB8IFsjeDA2QkEtI3gwNkJFXSB8IFsjeDA2QzAtI3gwNkNFXSB8ClsjeDA2RDAtI3gwNkQzXSB8ICN4MDZENSB8IFsjeDA2RTUtI3gwNkU2XSB8IFsjeDA5MDUtI3gwOTM5XSB8ICN4MDkzRCB8ClsjeDA5NTgtI3gwOTYxXSB8IFsjeDA5ODUtI3gwOThDXSB8IFsjeDA5OEYtI3gwOTkwXSB8IFsjeDA5OTMtI3gwOUE4XSB8ClsjeDA5QUEtI3gwOUIwXSB8ICN4MDlCMiB8IFsjeDA5QjYtI3gwOUI5XSB8IFsjeDA5REMtI3gwOUREXSB8ClsjeDA5REYtI3gwOUUxXSB8IFsjeDA5RjAtI3gwOUYxXSB8IFsjeDBBMDUtI3gwQTBBXSB8IFsjeDBBMEYtI3gwQTEwXSB8ClsjeDBBMTMtI3gwQTI4XSB8IFsjeDBBMkEtI3gwQTMwXSB8IFsjeDBBMzItI3gwQTMzXSB8IFsjeDBBMzUtI3gwQTM2XSB8ClsjeDBBMzgtI3gwQTM5XSB8IFsjeDBBNTktI3gwQTVDXSB8ICN4MEE1RSB8IFsjeDBBNzItI3gwQTc0XSB8ClsjeDBBODUtI3gwQThCXSB8ICN4MEE4RCB8IFsjeDBBOEYtI3gwQTkxXSB8IFsjeDBBOTMtI3gwQUE4XSB8ClsjeDBBQUEtI3gwQUIwXSB8IFsjeDBBQjItI3gwQUIzXSB8IFsjeDBBQjUtI3gwQUI5XSB8ICN4MEFCRCB8ICN4MEFFMCB8ClsjeDBCMDUtI3gwQjBDXSB8IFsjeDBCMEYtI3gwQjEwXSB8IFsjeDBCMTMtI3gwQjI4XSB8IFsjeDBCMkEtI3gwQjMwXSB8ClsjeDBCMzItI3gwQjMzXSB8IFsjeDBCMzYtI3gwQjM5XSB8ICN4MEIzRCB8IFsjeDBCNUMtI3gwQjVEXSB8ClsjeDBCNUYtI3gwQjYxXSB8IFsjeDBCODUtI3gwQjhBXSB8IFsjeDBCOEUtI3gwQjkwXSB8IFsjeDBCOTItI3gwQjk1XSB8ClsjeDBCOTktI3gwQjlBXSB8ICN4MEI5QyB8IFsjeDBCOUUtI3gwQjlGXSB8IFsjeDBCQTMtI3gwQkE0XSB8ClsjeDBCQTgtI3gwQkFBXSB8IFsjeDBCQUUtI3gwQkI1XSB8IFsjeDBCQjctI3gwQkI5XSB8IFsjeDBDMDUtI3gwQzBDXSB8ClsjeDBDMEUtI3gwQzEwXSB8IFsjeDBDMTItI3gwQzI4XSB8IFsjeDBDMkEtI3gwQzMzXSB8IFsjeDBDMzUtI3gwQzM5XSB8ClsjeDBDNjAtI3gwQzYxXSB8IFsjeDBDODUtI3gwQzhDXSB8IFsjeDBDOEUtI3gwQzkwXSB8IFsjeDBDOTItI3gwQ0E4XSB8ClsjeDBDQUEtI3gwQ0IzXSB8IFsjeDBDQjUtI3gwQ0I5XSB8ICN4MENERSB8IFsjeDBDRTAtI3gwQ0UxXSB8ClsjeDBEMDUtI3gwRDBDXSB8IFsjeDBEMEUtI3gwRDEwXSB8IFsjeDBEMTItI3gwRDI4XSB8IFsjeDBEMkEtI3gwRDM5XSB8ClsjeDBENjAtI3gwRDYxXSB8IFsjeDBFMDEtI3gwRTJFXSB8ICN4MEUzMCB8IFsjeDBFMzItI3gwRTMzXSB8ClsjeDBFNDAtI3gwRTQ1XSB8IFsjeDBFODEtI3gwRTgyXSB8ICN4MEU4NCB8IFsjeDBFODctI3gwRTg4XSB8ICN4MEU4QSB8CiN4MEU4RCB8IFsjeDBFOTQtI3gwRTk3XSB8IFsjeDBFOTktI3gwRTlGXSB8IFsjeDBFQTEtI3gwRUEzXSB8ICN4MEVBNSB8CiN4MEVBNyB8IFsjeDBFQUEtI3gwRUFCXSB8IFsjeDBFQUQtI3gwRUFFXSB8ICN4MEVCMCB8IFsjeDBFQjItI3gwRUIzXSB8CiN4MEVCRCB8IFsjeDBFQzAtI3gwRUM0XSB8IFsjeDBGNDAtI3gwRjQ3XSB8IFsjeDBGNDktI3gwRjY5XSB8ClsjeDEwQTAtI3gxMEM1XSB8IFsjeDEwRDAtI3gxMEY2XSB8ICN4MTEwMCB8IFsjeDExMDItI3gxMTAzXSB8ClsjeDExMDUtI3gxMTA3XSB8ICN4MTEwOSB8IFsjeDExMEItI3gxMTBDXSB8IFsjeDExMEUtI3gxMTEyXSB8ICN4MTEzQyB8CiN4MTEzRSB8ICN4MTE0MCB8ICN4MTE0QyB8ICN4MTE0RSB8ICN4MTE1MCB8IFsjeDExNTQtI3gxMTU1XSB8ICN4MTE1OSB8ClsjeDExNUYtI3gxMTYxXSB8ICN4MTE2MyB8ICN4MTE2NSB8ICN4MTE2NyB8ICN4MTE2OSB8IFsjeDExNkQtI3gxMTZFXSB8ClsjeDExNzItI3gxMTczXSB8ICN4MTE3NSB8ICN4MTE5RSB8ICN4MTFBOCB8ICN4MTFBQiB8IFsjeDExQUUtI3gxMUFGXSB8ClsjeDExQjctI3gxMUI4XSB8ICN4MTFCQSB8IFsjeDExQkMtI3gxMUMyXSB8ICN4MTFFQiB8ICN4MTFGMCB8ICN4MTFGOSB8ClsjeDFFMDAtI3gxRTlCXSB8IFsjeDFFQTAtI3gxRUY5XSB8IFsjeDFGMDAtI3gxRjE1XSB8IFsjeDFGMTgtI3gxRjFEXSB8ClsjeDFGMjAtI3gxRjQ1XSB8IFsjeDFGNDgtI3gxRjREXSB8IFsjeDFGNTAtI3gxRjU3XSB8ICN4MUY1OSB8ICN4MUY1QiB8CiN4MUY1RCB8IFsjeDFGNUYtI3gxRjdEXSB8IFsjeDFGODAtI3gxRkI0XSB8IFsjeDFGQjYtI3gxRkJDXSB8ICN4MUZCRSB8ClsjeDFGQzItI3gxRkM0XSB8IFsjeDFGQzYtI3gxRkNDXSB8IFsjeDFGRDAtI3gxRkQzXSB8IFsjeDFGRDYtI3gxRkRCXSB8ClsjeDFGRTAtI3gxRkVDXSB8IFsjeDFGRjItI3gxRkY0XSB8IFsjeDFGRjYtI3gxRkZDXSB8ICN4MjEyNiB8ClsjeDIxMkEtI3gyMTJCXSB8ICN4MjEyRSB8IFsjeDIxODAtI3gyMTgyXSB8IFsjeDMwNDEtI3gzMDk0XSB8ClsjeDMwQTEtI3gzMEZBXSB8IFsjeDMxMDUtI3gzMTJDXSB8IFsjeEFDMDAtI3hEN0EzXSIiIgoKaWRlb2dyYXBoaWMgPSAiIiJbI3g0RTAwLSN4OUZBNV0gfCAjeDMwMDcgfCBbI3gzMDIxLSN4MzAyOV0iIiIKCmNvbWJpbmluZ0NoYXJhY3RlciA9ICIiIgpbI3gwMzAwLSN4MDM0NV0gfCBbI3gwMzYwLSN4MDM2MV0gfCBbI3gwNDgzLSN4MDQ4Nl0gfCBbI3gwNTkxLSN4MDVBMV0gfApbI3gwNUEzLSN4MDVCOV0gfCBbI3gwNUJCLSN4MDVCRF0gfCAjeDA1QkYgfCBbI3gwNUMxLSN4MDVDMl0gfCAjeDA1QzQgfApbI3gwNjRCLSN4MDY1Ml0gfCAjeDA2NzAgfCBbI3gwNkQ2LSN4MDZEQ10gfCBbI3gwNkRELSN4MDZERl0gfApbI3gwNkUwLSN4MDZFNF0gfCBbI3gwNkU3LSN4MDZFOF0gfCBbI3gwNkVBLSN4MDZFRF0gfCBbI3gwOTAxLSN4MDkwM10gfAojeDA5M0MgfCBbI3gwOTNFLSN4MDk0Q10gfCAjeDA5NEQgfCBbI3gwOTUxLSN4MDk1NF0gfCBbI3gwOTYyLSN4MDk2M10gfApbI3gwOTgxLSN4MDk4M10gfCAjeDA5QkMgfCAjeDA5QkUgfCAjeDA5QkYgfCBbI3gwOUMwLSN4MDlDNF0gfApbI3gwOUM3LSN4MDlDOF0gfCBbI3gwOUNCLSN4MDlDRF0gfCAjeDA5RDcgfCBbI3gwOUUyLSN4MDlFM10gfCAjeDBBMDIgfAojeDBBM0MgfCAjeDBBM0UgfCAjeDBBM0YgfCBbI3gwQTQwLSN4MEE0Ml0gfCBbI3gwQTQ3LSN4MEE0OF0gfApbI3gwQTRCLSN4MEE0RF0gfCBbI3gwQTcwLSN4MEE3MV0gfCBbI3gwQTgxLSN4MEE4M10gfCAjeDBBQkMgfApbI3gwQUJFLSN4MEFDNV0gfCBbI3gwQUM3LSN4MEFDOV0gfCBbI3gwQUNCLSN4MEFDRF0gfCBbI3gwQjAxLSN4MEIwM10gfAojeDBCM0MgfCBbI3gwQjNFLSN4MEI0M10gfCBbI3gwQjQ3LSN4MEI0OF0gfCBbI3gwQjRCLSN4MEI0RF0gfApbI3gwQjU2LSN4MEI1N10gfCBbI3gwQjgyLSN4MEI4M10gfCBbI3gwQkJFLSN4MEJDMl0gfCBbI3gwQkM2LSN4MEJDOF0gfApbI3gwQkNBLSN4MEJDRF0gfCAjeDBCRDcgfCBbI3gwQzAxLSN4MEMwM10gfCBbI3gwQzNFLSN4MEM0NF0gfApbI3gwQzQ2LSN4MEM0OF0gfCBbI3gwQzRBLSN4MEM0RF0gfCBbI3gwQzU1LSN4MEM1Nl0gfCBbI3gwQzgyLSN4MEM4M10gfApbI3gwQ0JFLSN4MENDNF0gfCBbI3gwQ0M2LSN4MENDOF0gfCBbI3gwQ0NBLSN4MENDRF0gfCBbI3gwQ0Q1LSN4MENENl0gfApbI3gwRDAyLSN4MEQwM10gfCBbI3gwRDNFLSN4MEQ0M10gfCBbI3gwRDQ2LSN4MEQ0OF0gfCBbI3gwRDRBLSN4MEQ0RF0gfAojeDBENTcgfCAjeDBFMzEgfCBbI3gwRTM0LSN4MEUzQV0gfCBbI3gwRTQ3LSN4MEU0RV0gfCAjeDBFQjEgfApbI3gwRUI0LSN4MEVCOV0gfCBbI3gwRUJCLSN4MEVCQ10gfCBbI3gwRUM4LSN4MEVDRF0gfCBbI3gwRjE4LSN4MEYxOV0gfAojeDBGMzUgfCAjeDBGMzcgfCAjeDBGMzkgfCAjeDBGM0UgfCAjeDBGM0YgfCBbI3gwRjcxLSN4MEY4NF0gfApbI3gwRjg2LSN4MEY4Ql0gfCBbI3gwRjkwLSN4MEY5NV0gfCAjeDBGOTcgfCBbI3gwRjk5LSN4MEZBRF0gfApbI3gwRkIxLSN4MEZCN10gfCAjeDBGQjkgfCBbI3gyMEQwLSN4MjBEQ10gfCAjeDIwRTEgfCBbI3gzMDJBLSN4MzAyRl0gfAojeDMwOTkgfCAjeDMwOUEiIiIKCmRpZ2l0ID0gIiIiClsjeDAwMzAtI3gwMDM5XSB8IFsjeDA2NjAtI3gwNjY5XSB8IFsjeDA2RjAtI3gwNkY5XSB8IFsjeDA5NjYtI3gwOTZGXSB8ClsjeDA5RTYtI3gwOUVGXSB8IFsjeDBBNjYtI3gwQTZGXSB8IFsjeDBBRTYtI3gwQUVGXSB8IFsjeDBCNjYtI3gwQjZGXSB8ClsjeDBCRTctI3gwQkVGXSB8IFsjeDBDNjYtI3gwQzZGXSB8IFsjeDBDRTYtI3gwQ0VGXSB8IFsjeDBENjYtI3gwRDZGXSB8ClsjeDBFNTAtI3gwRTU5XSB8IFsjeDBFRDAtI3gwRUQ5XSB8IFsjeDBGMjAtI3gwRjI5XSIiIgoKZXh0ZW5kZXIgPSAiIiIKI3gwMEI3IHwgI3gwMkQwIHwgI3gwMkQxIHwgI3gwMzg3IHwgI3gwNjQwIHwgI3gwRTQ2IHwgI3gwRUM2IHwgI3gzMDA1IHwKI1sjeDMwMzEtI3gzMDM1XSB8IFsjeDMwOUQtI3gzMDlFXSB8IFsjeDMwRkMtI3gzMEZFXSIiIgoKbGV0dGVyID0gIiB8ICIuam9pbihbYmFzZUNoYXIsIGlkZW9ncmFwaGljXSkKCiMgV2l0aG91dCB0aGUKbmFtZSA9ICIgfCAiLmpvaW4oW2xldHRlciwgZGlnaXQsICIuIiwgIi0iLCAiXyIsIGNvbWJpbmluZ0NoYXJhY3RlciwKICAgICAgICAgICAgICAgICAgIGV4dGVuZGVyXSkKbmFtZUZpcnN0ID0gIiB8ICIuam9pbihbbGV0dGVyLCAiXyJdKQoKcmVDaGFyID0gcmUuY29tcGlsZShyIiN4KFtcZHxBLUZdezQsNH0pIikKcmVDaGFyUmFuZ2UgPSByZS5jb21waWxlKHIiXFsjeChbXGR8QS1GXXs0LDR9KS0jeChbXGR8QS1GXXs0LDR9KVxdIikKCgpkZWYgY2hhclN0cmluZ1RvTGlzdChjaGFycyk6CiAgICBjaGFyUmFuZ2VzID0gW2l0ZW0uc3RyaXAoKSBmb3IgaXRlbSBpbiBjaGFycy5zcGxpdCgiIHwgIildCiAgICBydiA9IFtdCiAgICBmb3IgaXRlbSBpbiBjaGFyUmFuZ2VzOgogICAgICAgIGZvdW5kTWF0Y2ggPSBGYWxzZQogICAgICAgIGZvciByZWdleHAgaW4gKHJlQ2hhciwgcmVDaGFyUmFuZ2UpOgogICAgICAgICAgICBtYXRjaCA9IHJlZ2V4cC5tYXRjaChpdGVtKQogICAgICAgICAgICBpZiBtYXRjaCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIHJ2LmFwcGVuZChbaGV4VG9JbnQoaXRlbSkgZm9yIGl0ZW0gaW4gbWF0Y2guZ3JvdXBzKCldKQogICAgICAgICAgICAgICAgaWYgbGVuKHJ2Wy0xXSkgPT0gMToKICAgICAgICAgICAgICAgICAgICBydlstMV0gPSBydlstMV0gKiAyCiAgICAgICAgICAgICAgICBmb3VuZE1hdGNoID0gVHJ1ZQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICBpZiBub3QgZm91bmRNYXRjaDoKICAgICAgICAgICAgYXNzZXJ0IGxlbihpdGVtKSA9PSAxCgogICAgICAgICAgICBydi5hcHBlbmQoW29yZChpdGVtKV0gKiAyKQogICAgcnYgPSBub3JtYWxpc2VDaGFyTGlzdChydikKICAgIHJldHVybiBydgoKCmRlZiBub3JtYWxpc2VDaGFyTGlzdChjaGFyTGlzdCk6CiAgICBjaGFyTGlzdCA9IHNvcnRlZChjaGFyTGlzdCkKICAgIGZvciBpdGVtIGluIGNoYXJMaXN0OgogICAgICAgIGFzc2VydCBpdGVtWzFdID49IGl0ZW1bMF0KICAgIHJ2ID0gW10KICAgIGkgPSAwCiAgICB3aGlsZSBpIDwgbGVuKGNoYXJMaXN0KToKICAgICAgICBqID0gMQogICAgICAgIHJ2LmFwcGVuZChjaGFyTGlzdFtpXSkKICAgICAgICB3aGlsZSBpICsgaiA8IGxlbihjaGFyTGlzdCkgYW5kIGNoYXJMaXN0W2kgKyBqXVswXSA8PSBydlstMV1bMV0gKyAxOgogICAgICAgICAgICBydlstMV1bMV0gPSBjaGFyTGlzdFtpICsgal1bMV0KICAgICAgICAgICAgaiArPSAxCiAgICAgICAgaSArPSBqCiAgICByZXR1cm4gcnYKCiMgV2UgZG9uJ3QgcmVhbGx5IHN1cHBvcnQgY2hhcmFjdGVycyBhYm92ZSB0aGUgQk1QIDooCm1heF91bmljb2RlID0gaW50KCJGRkZGIiwgMTYpCgoKZGVmIG1pc3NpbmdSYW5nZXMoY2hhckxpc3QpOgogICAgcnYgPSBbXQogICAgaWYgY2hhckxpc3RbMF0gIT0gMDoKICAgICAgICBydi5hcHBlbmQoWzAsIGNoYXJMaXN0WzBdWzBdIC0gMV0pCiAgICBmb3IgaSwgaXRlbSBpbiBlbnVtZXJhdGUoY2hhckxpc3RbOi0xXSk6CiAgICAgICAgcnYuYXBwZW5kKFtpdGVtWzFdICsgMSwgY2hhckxpc3RbaSArIDFdWzBdIC0gMV0pCiAgICBpZiBjaGFyTGlzdFstMV1bMV0gIT0gbWF4X3VuaWNvZGU6CiAgICAgICAgcnYuYXBwZW5kKFtjaGFyTGlzdFstMV1bMV0gKyAxLCBtYXhfdW5pY29kZV0pCiAgICByZXR1cm4gcnYKCgpkZWYgbGlzdFRvUmVnZXhwU3RyKGNoYXJMaXN0KToKICAgIHJ2ID0gW10KICAgIGZvciBpdGVtIGluIGNoYXJMaXN0OgogICAgICAgIGlmIGl0ZW1bMF0gPT0gaXRlbVsxXToKICAgICAgICAgICAgcnYuYXBwZW5kKGVzY2FwZVJlZ2V4cChjaHIoaXRlbVswXSkpKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJ2LmFwcGVuZChlc2NhcGVSZWdleHAoY2hyKGl0ZW1bMF0pKSArICItIiArCiAgICAgICAgICAgICAgICAgICAgICBlc2NhcGVSZWdleHAoY2hyKGl0ZW1bMV0pKSkKICAgIHJldHVybiAiWyVzXSIgJSAiIi5qb2luKHJ2KQoKCmRlZiBoZXhUb0ludChoZXhfc3RyKToKICAgIHJldHVybiBpbnQoaGV4X3N0ciwgMTYpCgoKZGVmIGVzY2FwZVJlZ2V4cChzdHJpbmcpOgogICAgc3BlY2lhbENoYXJhY3RlcnMgPSAoIi4iLCAiXiIsICIkIiwgIioiLCAiKyIsICI/IiwgInsiLCAifSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiWyIsICJdIiwgInwiLCAiKCIsICIpIiwgIi0iKQogICAgZm9yIGNoYXIgaW4gc3BlY2lhbENoYXJhY3RlcnM6CiAgICAgICAgc3RyaW5nID0gc3RyaW5nLnJlcGxhY2UoY2hhciwgIlxcIiArIGNoYXIpCgogICAgcmV0dXJuIHN0cmluZwoKIyBvdXRwdXQgZnJvbSB0aGUgYWJvdmUKbm9uWG1sTmFtZUJNUFJlZ2V4cCA9IHJlLmNvbXBpbGUoJ1tceDAwLSwvOi1AXFxbLVxcXmBcXHstXHhiNlx4YjgtXHhiZlx4ZDdceGY3XHUwMTMyLVx1MDEzM1x1MDEzZi1cdTAxNDBcdTAxNDlcdTAxN2ZcdTAxYzQtXHUwMWNjXHUwMWYxLVx1MDFmM1x1MDFmNi1cdTAxZjlcdTAyMTgtXHUwMjRmXHUwMmE5LVx1MDJiYVx1MDJjMi1cdTAyY2ZcdTAyZDItXHUwMmZmXHUwMzQ2LVx1MDM1Zlx1MDM2Mi1cdTAzODVcdTAzOGJcdTAzOGRcdTAzYTJcdTAzY2ZcdTAzZDctXHUwM2Q5XHUwM2RiXHUwM2RkXHUwM2RmXHUwM2UxXHUwM2Y0LVx1MDQwMFx1MDQwZFx1MDQ1MFx1MDQ1ZFx1MDQ4Mlx1MDQ4Ny1cdTA0OGZcdTA0YzUtXHUwNGM2XHUwNGM5LVx1MDRjYVx1MDRjZC1cdTA0Y2ZcdTA0ZWMtXHUwNGVkXHUwNGY2LVx1MDRmN1x1MDRmYS1cdTA1MzBcdTA1NTctXHUwNTU4XHUwNTVhLVx1MDU2MFx1MDU4Ny1cdTA1OTBcdTA1YTJcdTA1YmFcdTA1YmVcdTA1YzBcdTA1YzNcdTA1YzUtXHUwNWNmXHUwNWViLVx1MDVlZlx1MDVmMy1cdTA2MjBcdTA2M2ItXHUwNjNmXHUwNjUzLVx1MDY1Zlx1MDY2YS1cdTA2NmZcdTA2YjgtXHUwNmI5XHUwNmJmXHUwNmNmXHUwNmQ0XHUwNmU5XHUwNmVlLVx1MDZlZlx1MDZmYS1cdTA5MDBcdTA5MDRcdTA5M2EtXHUwOTNiXHUwOTRlLVx1MDk1MFx1MDk1NS1cdTA5NTdcdTA5NjQtXHUwOTY1XHUwOTcwLVx1MDk4MFx1MDk4NFx1MDk4ZC1cdTA5OGVcdTA5OTEtXHUwOTkyXHUwOWE5XHUwOWIxXHUwOWIzLVx1MDliNVx1MDliYS1cdTA5YmJcdTA5YmRcdTA5YzUtXHUwOWM2XHUwOWM5LVx1MDljYVx1MDljZS1cdTA5ZDZcdTA5ZDgtXHUwOWRiXHUwOWRlXHUwOWU0LVx1MDllNVx1MDlmMi1cdTBhMDFcdTBhMDMtXHUwYTA0XHUwYTBiLVx1MGEwZVx1MGExMS1cdTBhMTJcdTBhMjlcdTBhMzFcdTBhMzRcdTBhMzdcdTBhM2EtXHUwYTNiXHUwYTNkXHUwYTQzLVx1MGE0Nlx1MGE0OS1cdTBhNGFcdTBhNGUtXHUwYTU4XHUwYTVkXHUwYTVmLVx1MGE2NVx1MGE3NS1cdTBhODBcdTBhODRcdTBhOGNcdTBhOGVcdTBhOTJcdTBhYTlcdTBhYjFcdTBhYjRcdTBhYmEtXHUwYWJiXHUwYWM2XHUwYWNhXHUwYWNlLVx1MGFkZlx1MGFlMS1cdTBhZTVcdTBhZjAtXHUwYjAwXHUwYjA0XHUwYjBkLVx1MGIwZVx1MGIxMS1cdTBiMTJcdTBiMjlcdTBiMzFcdTBiMzQtXHUwYjM1XHUwYjNhLVx1MGIzYlx1MGI0NC1cdTBiNDZcdTBiNDktXHUwYjRhXHUwYjRlLVx1MGI1NVx1MGI1OC1cdTBiNWJcdTBiNWVcdTBiNjItXHUwYjY1XHUwYjcwLVx1MGI4MVx1MGI4NFx1MGI4Yi1cdTBiOGRcdTBiOTFcdTBiOTYtXHUwYjk4XHUwYjliXHUwYjlkXHUwYmEwLVx1MGJhMlx1MGJhNS1cdTBiYTdcdTBiYWItXHUwYmFkXHUwYmI2XHUwYmJhLVx1MGJiZFx1MGJjMy1cdTBiYzVcdTBiYzlcdTBiY2UtXHUwYmQ2XHUwYmQ4LVx1MGJlNlx1MGJmMC1cdTBjMDBcdTBjMDRcdTBjMGRcdTBjMTFcdTBjMjlcdTBjMzRcdTBjM2EtXHUwYzNkXHUwYzQ1XHUwYzQ5XHUwYzRlLVx1MGM1NFx1MGM1Ny1cdTBjNWZcdTBjNjItXHUwYzY1XHUwYzcwLVx1MGM4MVx1MGM4NFx1MGM4ZFx1MGM5MVx1MGNhOVx1MGNiNFx1MGNiYS1cdTBjYmRcdTBjYzVcdTBjYzlcdTBjY2UtXHUwY2Q0XHUwY2Q3LVx1MGNkZFx1MGNkZlx1MGNlMi1cdTBjZTVcdTBjZjAtXHUwZDAxXHUwZDA0XHUwZDBkXHUwZDExXHUwZDI5XHUwZDNhLVx1MGQzZFx1MGQ0NC1cdTBkNDVcdTBkNDlcdTBkNGUtXHUwZDU2XHUwZDU4LVx1MGQ1Zlx1MGQ2Mi1cdTBkNjVcdTBkNzAtXHUwZTAwXHUwZTJmXHUwZTNiLVx1MGUzZlx1MGU0Zlx1MGU1YS1cdTBlODBcdTBlODNcdTBlODUtXHUwZTg2XHUwZTg5XHUwZThiLVx1MGU4Y1x1MGU4ZS1cdTBlOTNcdTBlOThcdTBlYTBcdTBlYTRcdTBlYTZcdTBlYTgtXHUwZWE5XHUwZWFjXHUwZWFmXHUwZWJhXHUwZWJlLVx1MGViZlx1MGVjNVx1MGVjN1x1MGVjZS1cdTBlY2ZcdTBlZGEtXHUwZjE3XHUwZjFhLVx1MGYxZlx1MGYyYS1cdTBmMzRcdTBmMzZcdTBmMzhcdTBmM2EtXHUwZjNkXHUwZjQ4XHUwZjZhLVx1MGY3MFx1MGY4NVx1MGY4Yy1cdTBmOGZcdTBmOTZcdTBmOThcdTBmYWUtXHUwZmIwXHUwZmI4XHUwZmJhLVx1MTA5Zlx1MTBjNi1cdTEwY2ZcdTEwZjctXHUxMGZmXHUxMTAxXHUxMTA0XHUxMTA4XHUxMTBhXHUxMTBkXHUxMTEzLVx1MTEzYlx1MTEzZFx1MTEzZlx1MTE0MS1cdTExNGJcdTExNGRcdTExNGZcdTExNTEtXHUxMTUzXHUxMTU2LVx1MTE1OFx1MTE1YS1cdTExNWVcdTExNjJcdTExNjRcdTExNjZcdTExNjhcdTExNmEtXHUxMTZjXHUxMTZmLVx1MTE3MVx1MTE3NFx1MTE3Ni1cdTExOWRcdTExOWYtXHUxMWE3XHUxMWE5LVx1MTFhYVx1MTFhYy1cdTExYWRcdTExYjAtXHUxMWI2XHUxMWI5XHUxMWJiXHUxMWMzLVx1MTFlYVx1MTFlYy1cdTExZWZcdTExZjEtXHUxMWY4XHUxMWZhLVx1MWRmZlx1MWU5Yy1cdTFlOWZcdTFlZmEtXHUxZWZmXHUxZjE2LVx1MWYxN1x1MWYxZS1cdTFmMWZcdTFmNDYtXHUxZjQ3XHUxZjRlLVx1MWY0Zlx1MWY1OFx1MWY1YVx1MWY1Y1x1MWY1ZVx1MWY3ZS1cdTFmN2ZcdTFmYjVcdTFmYmRcdTFmYmYtXHUxZmMxXHUxZmM1XHUxZmNkLVx1MWZjZlx1MWZkNC1cdTFmZDVcdTFmZGMtXHUxZmRmXHUxZmVkLVx1MWZmMVx1MWZmNVx1MWZmZC1cdTIwY2ZcdTIwZGQtXHUyMGUwXHUyMGUyLVx1MjEyNVx1MjEyNy1cdTIxMjlcdTIxMmMtXHUyMTJkXHUyMTJmLVx1MjE3Zlx1MjE4My1cdTMwMDRcdTMwMDZcdTMwMDgtXHUzMDIwXHUzMDMwXHUzMDM2LVx1MzA0MFx1MzA5NS1cdTMwOThcdTMwOWItXHUzMDljXHUzMDlmLVx1MzBhMFx1MzBmYlx1MzBmZi1cdTMxMDRcdTMxMmQtXHU0ZGZmXHU5ZmE2LVx1YWJmZlx1ZDdhNC1cdWZmZmZdJykgICMgbm9xYQoKbm9uWG1sTmFtZUZpcnN0Qk1QUmVnZXhwID0gcmUuY29tcGlsZSgnW1x4MDAtQFxcWy1cXF5gXFx7LVx4YmZceGQ3XHhmN1x1MDEzMi1cdTAxMzNcdTAxM2YtXHUwMTQwXHUwMTQ5XHUwMTdmXHUwMWM0LVx1MDFjY1x1MDFmMS1cdTAxZjNcdTAxZjYtXHUwMWY5XHUwMjE4LVx1MDI0Zlx1MDJhOS1cdTAyYmFcdTAyYzItXHUwMzg1XHUwMzg3XHUwMzhiXHUwMzhkXHUwM2EyXHUwM2NmXHUwM2Q3LVx1MDNkOVx1MDNkYlx1MDNkZFx1MDNkZlx1MDNlMVx1MDNmNC1cdTA0MDBcdTA0MGRcdTA0NTBcdTA0NWRcdTA0ODItXHUwNDhmXHUwNGM1LVx1MDRjNlx1MDRjOS1cdTA0Y2FcdTA0Y2QtXHUwNGNmXHUwNGVjLVx1MDRlZFx1MDRmNi1cdTA0ZjdcdTA0ZmEtXHUwNTMwXHUwNTU3LVx1MDU1OFx1MDU1YS1cdTA1NjBcdTA1ODctXHUwNWNmXHUwNWViLVx1MDVlZlx1MDVmMy1cdTA2MjBcdTA2M2ItXHUwNjQwXHUwNjRiLVx1MDY3MFx1MDZiOC1cdTA2YjlcdTA2YmZcdTA2Y2ZcdTA2ZDRcdTA2ZDYtXHUwNmU0XHUwNmU3LVx1MDkwNFx1MDkzYS1cdTA5M2NcdTA5M2UtXHUwOTU3XHUwOTYyLVx1MDk4NFx1MDk4ZC1cdTA5OGVcdTA5OTEtXHUwOTkyXHUwOWE5XHUwOWIxXHUwOWIzLVx1MDliNVx1MDliYS1cdTA5ZGJcdTA5ZGVcdTA5ZTItXHUwOWVmXHUwOWYyLVx1MGEwNFx1MGEwYi1cdTBhMGVcdTBhMTEtXHUwYTEyXHUwYTI5XHUwYTMxXHUwYTM0XHUwYTM3XHUwYTNhLVx1MGE1OFx1MGE1ZFx1MGE1Zi1cdTBhNzFcdTBhNzUtXHUwYTg0XHUwYThjXHUwYThlXHUwYTkyXHUwYWE5XHUwYWIxXHUwYWI0XHUwYWJhLVx1MGFiY1x1MGFiZS1cdTBhZGZcdTBhZTEtXHUwYjA0XHUwYjBkLVx1MGIwZVx1MGIxMS1cdTBiMTJcdTBiMjlcdTBiMzFcdTBiMzQtXHUwYjM1XHUwYjNhLVx1MGIzY1x1MGIzZS1cdTBiNWJcdTBiNWVcdTBiNjItXHUwYjg0XHUwYjhiLVx1MGI4ZFx1MGI5MVx1MGI5Ni1cdTBiOThcdTBiOWJcdTBiOWRcdTBiYTAtXHUwYmEyXHUwYmE1LVx1MGJhN1x1MGJhYi1cdTBiYWRcdTBiYjZcdTBiYmEtXHUwYzA0XHUwYzBkXHUwYzExXHUwYzI5XHUwYzM0XHUwYzNhLVx1MGM1Zlx1MGM2Mi1cdTBjODRcdTBjOGRcdTBjOTFcdTBjYTlcdTBjYjRcdTBjYmEtXHUwY2RkXHUwY2RmXHUwY2UyLVx1MGQwNFx1MGQwZFx1MGQxMVx1MGQyOVx1MGQzYS1cdTBkNWZcdTBkNjItXHUwZTAwXHUwZTJmXHUwZTMxXHUwZTM0LVx1MGUzZlx1MGU0Ni1cdTBlODBcdTBlODNcdTBlODUtXHUwZTg2XHUwZTg5XHUwZThiLVx1MGU4Y1x1MGU4ZS1cdTBlOTNcdTBlOThcdTBlYTBcdTBlYTRcdTBlYTZcdTBlYTgtXHUwZWE5XHUwZWFjXHUwZWFmXHUwZWIxXHUwZWI0LVx1MGViY1x1MGViZS1cdTBlYmZcdTBlYzUtXHUwZjNmXHUwZjQ4XHUwZjZhLVx1MTA5Zlx1MTBjNi1cdTEwY2ZcdTEwZjctXHUxMGZmXHUxMTAxXHUxMTA0XHUxMTA4XHUxMTBhXHUxMTBkXHUxMTEzLVx1MTEzYlx1MTEzZFx1MTEzZlx1MTE0MS1cdTExNGJcdTExNGRcdTExNGZcdTExNTEtXHUxMTUzXHUxMTU2LVx1MTE1OFx1MTE1YS1cdTExNWVcdTExNjJcdTExNjRcdTExNjZcdTExNjhcdTExNmEtXHUxMTZjXHUxMTZmLVx1MTE3MVx1MTE3NFx1MTE3Ni1cdTExOWRcdTExOWYtXHUxMWE3XHUxMWE5LVx1MTFhYVx1MTFhYy1cdTExYWRcdTExYjAtXHUxMWI2XHUxMWI5XHUxMWJiXHUxMWMzLVx1MTFlYVx1MTFlYy1cdTExZWZcdTExZjEtXHUxMWY4XHUxMWZhLVx1MWRmZlx1MWU5Yy1cdTFlOWZcdTFlZmEtXHUxZWZmXHUxZjE2LVx1MWYxN1x1MWYxZS1cdTFmMWZcdTFmNDYtXHUxZjQ3XHUxZjRlLVx1MWY0Zlx1MWY1OFx1MWY1YVx1MWY1Y1x1MWY1ZVx1MWY3ZS1cdTFmN2ZcdTFmYjVcdTFmYmRcdTFmYmYtXHUxZmMxXHUxZmM1XHUxZmNkLVx1MWZjZlx1MWZkNC1cdTFmZDVcdTFmZGMtXHUxZmRmXHUxZmVkLVx1MWZmMVx1MWZmNVx1MWZmZC1cdTIxMjVcdTIxMjctXHUyMTI5XHUyMTJjLVx1MjEyZFx1MjEyZi1cdTIxN2ZcdTIxODMtXHUzMDA2XHUzMDA4LVx1MzAyMFx1MzAyYS1cdTMwNDBcdTMwOTUtXHUzMGEwXHUzMGZiLVx1MzEwNFx1MzEyZC1cdTRkZmZcdTlmYTYtXHVhYmZmXHVkN2E0LVx1ZmZmZl0nKSAgIyBub3FhCgojIFNpbXBsZXIgdGhpbmdzCm5vblB1YmlkQ2hhclJlZ2V4cCA9IHJlLmNvbXBpbGUoIlteXHgyMFx4MERceDBBYS16QS1aMC05XC1cJygpKywuLzo9PzshKiNAJF8lXSIpCgoKY2xhc3MgSW5mb3NldEZpbHRlcihvYmplY3QpOgogICAgcmVwbGFjZW1lbnRSZWdleHAgPSByZS5jb21waWxlKHIiVVtcZEEtRl17NSw1fSIpCgogICAgZGVmIF9faW5pdF9fKHNlbGYsCiAgICAgICAgICAgICAgICAgZHJvcFhtbG5zTG9jYWxOYW1lPUZhbHNlLAogICAgICAgICAgICAgICAgIGRyb3BYbWxuc0F0dHJOcz1GYWxzZSwKICAgICAgICAgICAgICAgICBwcmV2ZW50RG91YmxlRGFzaENvbW1lbnRzPUZhbHNlLAogICAgICAgICAgICAgICAgIHByZXZlbnREYXNoQXRDb21tZW50RW5kPUZhbHNlLAogICAgICAgICAgICAgICAgIHJlcGxhY2VGb3JtRmVlZENoYXJhY3RlcnM9VHJ1ZSwKICAgICAgICAgICAgICAgICBwcmV2ZW50U2luZ2xlUXVvdGVQdWJpZD1GYWxzZSk6CgogICAgICAgIHNlbGYuZHJvcFhtbG5zTG9jYWxOYW1lID0gZHJvcFhtbG5zTG9jYWxOYW1lCiAgICAgICAgc2VsZi5kcm9wWG1sbnNBdHRyTnMgPSBkcm9wWG1sbnNBdHRyTnMKCiAgICAgICAgc2VsZi5wcmV2ZW50RG91YmxlRGFzaENvbW1lbnRzID0gcHJldmVudERvdWJsZURhc2hDb21tZW50cwogICAgICAgIHNlbGYucHJldmVudERhc2hBdENvbW1lbnRFbmQgPSBwcmV2ZW50RGFzaEF0Q29tbWVudEVuZAoKICAgICAgICBzZWxmLnJlcGxhY2VGb3JtRmVlZENoYXJhY3RlcnMgPSByZXBsYWNlRm9ybUZlZWRDaGFyYWN0ZXJzCgogICAgICAgIHNlbGYucHJldmVudFNpbmdsZVF1b3RlUHViaWQgPSBwcmV2ZW50U2luZ2xlUXVvdGVQdWJpZAoKICAgICAgICBzZWxmLnJlcGxhY2VDYWNoZSA9IHt9CgogICAgZGVmIGNvZXJjZUF0dHJpYnV0ZShzZWxmLCBuYW1lLCBuYW1lc3BhY2U9Tm9uZSk6CiAgICAgICAgaWYgc2VsZi5kcm9wWG1sbnNMb2NhbE5hbWUgYW5kIG5hbWUuc3RhcnRzd2l0aCgieG1sbnM6Iik6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkF0dHJpYnV0ZXMgY2Fubm90IGJlZ2luIHdpdGggeG1sbnMiLCBEYXRhTG9zc1dhcm5pbmcpCiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgZWxpZiAoc2VsZi5kcm9wWG1sbnNBdHRyTnMgYW5kCiAgICAgICAgICAgICAgbmFtZXNwYWNlID09ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLyIpOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJBdHRyaWJ1dGVzIGNhbm5vdCBiZSBpbiB0aGUgeG1sIG5hbWVzcGFjZSIsIERhdGFMb3NzV2FybmluZykKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gc2VsZi50b1htbE5hbWUobmFtZSkKCiAgICBkZWYgY29lcmNlRWxlbWVudChzZWxmLCBuYW1lKToKICAgICAgICByZXR1cm4gc2VsZi50b1htbE5hbWUobmFtZSkKCiAgICBkZWYgY29lcmNlQ29tbWVudChzZWxmLCBkYXRhKToKICAgICAgICBpZiBzZWxmLnByZXZlbnREb3VibGVEYXNoQ29tbWVudHM6CiAgICAgICAgICAgIHdoaWxlICItLSIgaW4gZGF0YToKICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkNvbW1lbnRzIGNhbm5vdCBjb250YWluIGFkamFjZW50IGRhc2hlcyIsIERhdGFMb3NzV2FybmluZykKICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLnJlcGxhY2UoIi0tIiwgIi0gLSIpCiAgICAgICAgICAgIGlmIGRhdGEuZW5kc3dpdGgoIi0iKToKICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkNvbW1lbnRzIGNhbm5vdCBlbmQgaW4gYSBkYXNoIiwgRGF0YUxvc3NXYXJuaW5nKQogICAgICAgICAgICAgICAgZGF0YSArPSAiICIKICAgICAgICByZXR1cm4gZGF0YQoKICAgIGRlZiBjb2VyY2VDaGFyYWN0ZXJzKHNlbGYsIGRhdGEpOgogICAgICAgIGlmIHNlbGYucmVwbGFjZUZvcm1GZWVkQ2hhcmFjdGVyczoKICAgICAgICAgICAgZm9yIF8gaW4gcmFuZ2UoZGF0YS5jb3VudCgiXHgwQyIpKToKICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIlRleHQgY2Fubm90IGNvbnRhaW4gVSswMDBDIiwgRGF0YUxvc3NXYXJuaW5nKQogICAgICAgICAgICBkYXRhID0gZGF0YS5yZXBsYWNlKCJceDBDIiwgIiAiKQogICAgICAgICMgT3RoZXIgbm9uLXhtbCBjaGFyYWN0ZXJzCiAgICAgICAgcmV0dXJuIGRhdGEKCiAgICBkZWYgY29lcmNlUHViaWQoc2VsZiwgZGF0YSk6CiAgICAgICAgZGF0YU91dHB1dCA9IGRhdGEKICAgICAgICBmb3IgY2hhciBpbiBub25QdWJpZENoYXJSZWdleHAuZmluZGFsbChkYXRhKToKICAgICAgICAgICAgd2FybmluZ3Mud2FybigiQ29lcmNpbmcgbm9uLVhNTCBwdWJpZCIsIERhdGFMb3NzV2FybmluZykKICAgICAgICAgICAgcmVwbGFjZW1lbnQgPSBzZWxmLmdldFJlcGxhY2VtZW50Q2hhcmFjdGVyKGNoYXIpCiAgICAgICAgICAgIGRhdGFPdXRwdXQgPSBkYXRhT3V0cHV0LnJlcGxhY2UoY2hhciwgcmVwbGFjZW1lbnQpCiAgICAgICAgaWYgc2VsZi5wcmV2ZW50U2luZ2xlUXVvdGVQdWJpZCBhbmQgZGF0YU91dHB1dC5maW5kKCInIikgPj0gMDoKICAgICAgICAgICAgd2FybmluZ3Mud2FybigiUHViaWQgY2Fubm90IGNvbnRhaW4gc2luZ2xlIHF1b3RlIiwgRGF0YUxvc3NXYXJuaW5nKQogICAgICAgICAgICBkYXRhT3V0cHV0ID0gZGF0YU91dHB1dC5yZXBsYWNlKCInIiwgc2VsZi5nZXRSZXBsYWNlbWVudENoYXJhY3RlcigiJyIpKQogICAgICAgIHJldHVybiBkYXRhT3V0cHV0CgogICAgZGVmIHRvWG1sTmFtZShzZWxmLCBuYW1lKToKICAgICAgICBuYW1lRmlyc3QgPSBuYW1lWzBdCiAgICAgICAgbmFtZVJlc3QgPSBuYW1lWzE6XQogICAgICAgIG0gPSBub25YbWxOYW1lRmlyc3RCTVBSZWdleHAubWF0Y2gobmFtZUZpcnN0KQogICAgICAgIGlmIG06CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkNvZXJjaW5nIG5vbi1YTUwgbmFtZSIsIERhdGFMb3NzV2FybmluZykKICAgICAgICAgICAgbmFtZUZpcnN0T3V0cHV0ID0gc2VsZi5nZXRSZXBsYWNlbWVudENoYXJhY3RlcihuYW1lRmlyc3QpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbmFtZUZpcnN0T3V0cHV0ID0gbmFtZUZpcnN0CgogICAgICAgIG5hbWVSZXN0T3V0cHV0ID0gbmFtZVJlc3QKICAgICAgICByZXBsYWNlQ2hhcnMgPSBzZXQobm9uWG1sTmFtZUJNUFJlZ2V4cC5maW5kYWxsKG5hbWVSZXN0KSkKICAgICAgICBmb3IgY2hhciBpbiByZXBsYWNlQ2hhcnM6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkNvZXJjaW5nIG5vbi1YTUwgbmFtZSIsIERhdGFMb3NzV2FybmluZykKICAgICAgICAgICAgcmVwbGFjZW1lbnQgPSBzZWxmLmdldFJlcGxhY2VtZW50Q2hhcmFjdGVyKGNoYXIpCiAgICAgICAgICAgIG5hbWVSZXN0T3V0cHV0ID0gbmFtZVJlc3RPdXRwdXQucmVwbGFjZShjaGFyLCByZXBsYWNlbWVudCkKICAgICAgICByZXR1cm4gbmFtZUZpcnN0T3V0cHV0ICsgbmFtZVJlc3RPdXRwdXQKCiAgICBkZWYgZ2V0UmVwbGFjZW1lbnRDaGFyYWN0ZXIoc2VsZiwgY2hhcik6CiAgICAgICAgaWYgY2hhciBpbiBzZWxmLnJlcGxhY2VDYWNoZToKICAgICAgICAgICAgcmVwbGFjZW1lbnQgPSBzZWxmLnJlcGxhY2VDYWNoZVtjaGFyXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gc2VsZi5lc2NhcGVDaGFyKGNoYXIpCiAgICAgICAgcmV0dXJuIHJlcGxhY2VtZW50CgogICAgZGVmIGZyb21YbWxOYW1lKHNlbGYsIG5hbWUpOgogICAgICAgIGZvciBpdGVtIGluIHNldChzZWxmLnJlcGxhY2VtZW50UmVnZXhwLmZpbmRhbGwobmFtZSkpOgogICAgICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKGl0ZW0sIHNlbGYudW5lc2NhcGVDaGFyKGl0ZW0pKQogICAgICAgIHJldHVybiBuYW1lCgogICAgZGVmIGVzY2FwZUNoYXIoc2VsZiwgY2hhcik6CiAgICAgICAgcmVwbGFjZW1lbnQgPSAiVSUwNVgiICUgb3JkKGNoYXIpCiAgICAgICAgc2VsZi5yZXBsYWNlQ2FjaGVbY2hhcl0gPSByZXBsYWNlbWVudAogICAgICAgIHJldHVybiByZXBsYWNlbWVudAoKICAgIGRlZiB1bmVzY2FwZUNoYXIoc2VsZiwgY2hhcmNvZGUpOgogICAgICAgIHJldHVybiBjaHIoaW50KGNoYXJjb2RlWzE6XSwgMTYpKQpQSwMEFAAAAAAAAAAhAB4MbTUUfwAAFH8AAEEAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL19pbnB1dHN0cmVhbS5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgdW5pY29kZV9saXRlcmFscwoKZnJvbSBwaXAuX3ZlbmRvci5zaXggaW1wb3J0IHRleHRfdHlwZSwgYmluYXJ5X3R5cGUKZnJvbSBwaXAuX3ZlbmRvci5zaXgubW92ZXMgaW1wb3J0IGh0dHBfY2xpZW50LCB1cmxsaWIKCmltcG9ydCBjb2RlY3MKaW1wb3J0IHJlCgpmcm9tIHBpcC5fdmVuZG9yIGltcG9ydCB3ZWJlbmNvZGluZ3MKCmZyb20gLmNvbnN0YW50cyBpbXBvcnQgRU9GLCBzcGFjZUNoYXJhY3RlcnMsIGFzY2lpTGV0dGVycywgYXNjaWlVcHBlcmNhc2UKZnJvbSAuY29uc3RhbnRzIGltcG9ydCBSZXBhcnNlRXhjZXB0aW9uCmZyb20gLiBpbXBvcnQgX3V0aWxzCgpmcm9tIGlvIGltcG9ydCBTdHJpbmdJTwoKdHJ5OgogICAgZnJvbSBpbyBpbXBvcnQgQnl0ZXNJTwpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBCeXRlc0lPID0gU3RyaW5nSU8KCiMgTm9uLXVuaWNvZGUgdmVyc2lvbnMgb2YgY29uc3RhbnRzIGZvciB1c2UgaW4gdGhlIHByZS1wYXJzZXIKc3BhY2VDaGFyYWN0ZXJzQnl0ZXMgPSBmcm96ZW5zZXQoW2l0ZW0uZW5jb2RlKCJhc2NpaSIpIGZvciBpdGVtIGluIHNwYWNlQ2hhcmFjdGVyc10pCmFzY2lpTGV0dGVyc0J5dGVzID0gZnJvemVuc2V0KFtpdGVtLmVuY29kZSgiYXNjaWkiKSBmb3IgaXRlbSBpbiBhc2NpaUxldHRlcnNdKQphc2NpaVVwcGVyY2FzZUJ5dGVzID0gZnJvemVuc2V0KFtpdGVtLmVuY29kZSgiYXNjaWkiKSBmb3IgaXRlbSBpbiBhc2NpaVVwcGVyY2FzZV0pCnNwYWNlc0FuZ2xlQnJhY2tldHMgPSBzcGFjZUNoYXJhY3RlcnNCeXRlcyB8IGZyb3plbnNldChbYiI+IiwgYiI8Il0pCgoKaW52YWxpZF91bmljb2RlX25vX3N1cnJvZ2F0ZSA9ICJbXHUwMDAxLVx1MDAwOFx1MDAwQlx1MDAwRS1cdTAwMUZcdTAwN0YtXHUwMDlGXHVGREQwLVx1RkRFRlx1RkZGRVx1RkZGRlxVMDAwMUZGRkVcVTAwMDFGRkZGXFUwMDAyRkZGRVxVMDAwMkZGRkZcVTAwMDNGRkZFXFUwMDAzRkZGRlxVMDAwNEZGRkVcVTAwMDRGRkZGXFUwMDA1RkZGRVxVMDAwNUZGRkZcVTAwMDZGRkZFXFUwMDA2RkZGRlxVMDAwN0ZGRkVcVTAwMDdGRkZGXFUwMDA4RkZGRVxVMDAwOEZGRkZcVTAwMDlGRkZFXFUwMDA5RkZGRlxVMDAwQUZGRkVcVTAwMEFGRkZGXFUwMDBCRkZGRVxVMDAwQkZGRkZcVTAwMENGRkZFXFUwMDBDRkZGRlxVMDAwREZGRkVcVTAwMERGRkZGXFUwMDBFRkZGRVxVMDAwRUZGRkZcVTAwMEZGRkZFXFUwMDBGRkZGRlxVMDAxMEZGRkVcVTAwMTBGRkZGXSIgICMgbm9xYQoKaWYgX3V0aWxzLnN1cHBvcnRzX2xvbmVfc3Vycm9nYXRlczoKICAgICMgVXNlIG9uZSBleHRyYSBzdGVwIG9mIGluZGlyZWN0aW9uIGFuZCBjcmVhdGUgc3Vycm9nYXRlcyB3aXRoCiAgICAjIGV2YWwuIE5vdCB1c2luZyB0aGlzIGluZGlyZWN0aW9uIHdvdWxkIGludHJvZHVjZSBhbiBpbGxlZ2FsCiAgICAjIHVuaWNvZGUgbGl0ZXJhbCBvbiBwbGF0Zm9ybXMgbm90IHN1cHBvcnRpbmcgc3VjaCBsb25lCiAgICAjIHN1cnJvZ2F0ZXMuCiAgICBhc3NlcnQgaW52YWxpZF91bmljb2RlX25vX3N1cnJvZ2F0ZVstMV0gPT0gIl0iIGFuZCBpbnZhbGlkX3VuaWNvZGVfbm9fc3Vycm9nYXRlLmNvdW50KCJdIikgPT0gMQogICAgaW52YWxpZF91bmljb2RlX3JlID0gcmUuY29tcGlsZShpbnZhbGlkX3VuaWNvZGVfbm9fc3Vycm9nYXRlWzotMV0gKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmFsKCciXFx1RDgwMC1cXHVERkZGIicpICsgICMgcHlsaW50OmRpc2FibGU9ZXZhbC11c2VkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJdIikKZWxzZToKICAgIGludmFsaWRfdW5pY29kZV9yZSA9IHJlLmNvbXBpbGUoaW52YWxpZF91bmljb2RlX25vX3N1cnJvZ2F0ZSkKCm5vbl9ibXBfaW52YWxpZF9jb2RlcG9pbnRzID0gc2V0KFsweDFGRkZFLCAweDFGRkZGLCAweDJGRkZFLCAweDJGRkZGLCAweDNGRkZFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzRkZGRiwgMHg0RkZGRSwgMHg0RkZGRiwgMHg1RkZGRSwgMHg1RkZGRiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NkZGRkUsIDB4NkZGRkYsIDB4N0ZGRkUsIDB4N0ZGRkYsIDB4OEZGRkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhGRkZGLCAweDlGRkZFLCAweDlGRkZGLCAweEFGRkZFLCAweEFGRkZGLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhCRkZGRSwgMHhCRkZGRiwgMHhDRkZGRSwgMHhDRkZGRiwgMHhERkZGRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REZGRkYsIDB4RUZGRkUsIDB4RUZGRkYsIDB4RkZGRkUsIDB4RkZGRkYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwRkZGRSwgMHgxMEZGRkZdKQoKYXNjaWlfcHVuY3R1YXRpb25fcmUgPSByZS5jb21waWxlKCJbXHUwMDA5LVx1MDAwRFx1MDAyMC1cdTAwMkZcdTAwM0EtXHUwMDQwXHUwMDVCLVx1MDA2MFx1MDA3Qi1cdTAwN0VdIikKCiMgQ2FjaGUgZm9yIGNoYXJzVW50aWwoKQpjaGFyc1VudGlsUmVnRXggPSB7fQoKCmNsYXNzIEJ1ZmZlcmVkU3RyZWFtKG9iamVjdCk6CiAgICAiIiJCdWZmZXJpbmcgZm9yIHN0cmVhbXMgdGhhdCBkbyBub3QgaGF2ZSBidWZmZXJpbmcgb2YgdGhlaXIgb3duCgogICAgVGhlIGJ1ZmZlciBpcyBpbXBsZW1lbnRlZCBhcyBhIGxpc3Qgb2YgY2h1bmtzIG9uIHRoZSBhc3N1bXB0aW9uIHRoYXQKICAgIGpvaW5pbmcgbWFueSBzdHJpbmdzIHdpbGwgYmUgc2xvdyBzaW5jZSBpdCBpcyBPKG4qKjIpCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgc3RyZWFtKToKICAgICAgICBzZWxmLnN0cmVhbSA9IHN0cmVhbQogICAgICAgIHNlbGYuYnVmZmVyID0gW10KICAgICAgICBzZWxmLnBvc2l0aW9uID0gWy0xLCAwXSAgIyBjaHVuayBudW1iZXIsIG9mZnNldAoKICAgIGRlZiB0ZWxsKHNlbGYpOgogICAgICAgIHBvcyA9IDAKICAgICAgICBmb3IgY2h1bmsgaW4gc2VsZi5idWZmZXJbOnNlbGYucG9zaXRpb25bMF1dOgogICAgICAgICAgICBwb3MgKz0gbGVuKGNodW5rKQogICAgICAgIHBvcyArPSBzZWxmLnBvc2l0aW9uWzFdCiAgICAgICAgcmV0dXJuIHBvcwoKICAgIGRlZiBzZWVrKHNlbGYsIHBvcyk6CiAgICAgICAgYXNzZXJ0IHBvcyA8PSBzZWxmLl9idWZmZXJlZEJ5dGVzKCkKICAgICAgICBvZmZzZXQgPSBwb3MKICAgICAgICBpID0gMAogICAgICAgIHdoaWxlIGxlbihzZWxmLmJ1ZmZlcltpXSkgPCBvZmZzZXQ6CiAgICAgICAgICAgIG9mZnNldCAtPSBsZW4oc2VsZi5idWZmZXJbaV0pCiAgICAgICAgICAgIGkgKz0gMQogICAgICAgIHNlbGYucG9zaXRpb24gPSBbaSwgb2Zmc2V0XQoKICAgIGRlZiByZWFkKHNlbGYsIGJ5dGVzKToKICAgICAgICBpZiBub3Qgc2VsZi5idWZmZXI6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9yZWFkU3RyZWFtKGJ5dGVzKQogICAgICAgIGVsaWYgKHNlbGYucG9zaXRpb25bMF0gPT0gbGVuKHNlbGYuYnVmZmVyKSBhbmQKICAgICAgICAgICAgICBzZWxmLnBvc2l0aW9uWzFdID09IGxlbihzZWxmLmJ1ZmZlclstMV0pKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3JlYWRTdHJlYW0oYnl0ZXMpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3JlYWRGcm9tQnVmZmVyKGJ5dGVzKQoKICAgIGRlZiBfYnVmZmVyZWRCeXRlcyhzZWxmKToKICAgICAgICByZXR1cm4gc3VtKFtsZW4oaXRlbSkgZm9yIGl0ZW0gaW4gc2VsZi5idWZmZXJdKQoKICAgIGRlZiBfcmVhZFN0cmVhbShzZWxmLCBieXRlcyk6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLnJlYWQoYnl0ZXMpCiAgICAgICAgc2VsZi5idWZmZXIuYXBwZW5kKGRhdGEpCiAgICAgICAgc2VsZi5wb3NpdGlvblswXSArPSAxCiAgICAgICAgc2VsZi5wb3NpdGlvblsxXSA9IGxlbihkYXRhKQogICAgICAgIHJldHVybiBkYXRhCgogICAgZGVmIF9yZWFkRnJvbUJ1ZmZlcihzZWxmLCBieXRlcyk6CiAgICAgICAgcmVtYWluaW5nQnl0ZXMgPSBieXRlcwogICAgICAgIHJ2ID0gW10KICAgICAgICBidWZmZXJJbmRleCA9IHNlbGYucG9zaXRpb25bMF0KICAgICAgICBidWZmZXJPZmZzZXQgPSBzZWxmLnBvc2l0aW9uWzFdCiAgICAgICAgd2hpbGUgYnVmZmVySW5kZXggPCBsZW4oc2VsZi5idWZmZXIpIGFuZCByZW1haW5pbmdCeXRlcyAhPSAwOgogICAgICAgICAgICBhc3NlcnQgcmVtYWluaW5nQnl0ZXMgPiAwCiAgICAgICAgICAgIGJ1ZmZlcmVkRGF0YSA9IHNlbGYuYnVmZmVyW2J1ZmZlckluZGV4XQoKICAgICAgICAgICAgaWYgcmVtYWluaW5nQnl0ZXMgPD0gbGVuKGJ1ZmZlcmVkRGF0YSkgLSBidWZmZXJPZmZzZXQ6CiAgICAgICAgICAgICAgICBieXRlc1RvUmVhZCA9IHJlbWFpbmluZ0J5dGVzCiAgICAgICAgICAgICAgICBzZWxmLnBvc2l0aW9uID0gW2J1ZmZlckluZGV4LCBidWZmZXJPZmZzZXQgKyBieXRlc1RvUmVhZF0KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGJ5dGVzVG9SZWFkID0gbGVuKGJ1ZmZlcmVkRGF0YSkgLSBidWZmZXJPZmZzZXQKICAgICAgICAgICAgICAgIHNlbGYucG9zaXRpb24gPSBbYnVmZmVySW5kZXgsIGxlbihidWZmZXJlZERhdGEpXQogICAgICAgICAgICAgICAgYnVmZmVySW5kZXggKz0gMQogICAgICAgICAgICBydi5hcHBlbmQoYnVmZmVyZWREYXRhW2J1ZmZlck9mZnNldDpidWZmZXJPZmZzZXQgKyBieXRlc1RvUmVhZF0pCiAgICAgICAgICAgIHJlbWFpbmluZ0J5dGVzIC09IGJ5dGVzVG9SZWFkCgogICAgICAgICAgICBidWZmZXJPZmZzZXQgPSAwCgogICAgICAgIGlmIHJlbWFpbmluZ0J5dGVzOgogICAgICAgICAgICBydi5hcHBlbmQoc2VsZi5fcmVhZFN0cmVhbShyZW1haW5pbmdCeXRlcykpCgogICAgICAgIHJldHVybiBiIiIuam9pbihydikKCgpkZWYgSFRNTElucHV0U3RyZWFtKHNvdXJjZSwgKiprd2FyZ3MpOgogICAgIyBXb3JrIGFyb3VuZCBQeXRob24gYnVnICMyMDAwNzogcmVhZCgwKSBjbG9zZXMgdGhlIGNvbm5lY3Rpb24uCiAgICAjIGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUyMDAwNwogICAgaWYgKGlzaW5zdGFuY2Uoc291cmNlLCBodHRwX2NsaWVudC5IVFRQUmVzcG9uc2UpIG9yCiAgICAgICAgIyBBbHNvIGNoZWNrIGZvciBhZGRpbmZvdXJsIHdyYXBwaW5nIEhUVFBSZXNwb25zZQogICAgICAgIChpc2luc3RhbmNlKHNvdXJjZSwgdXJsbGliLnJlc3BvbnNlLmFkZGJhc2UpIGFuZAogICAgICAgICBpc2luc3RhbmNlKHNvdXJjZS5mcCwgaHR0cF9jbGllbnQuSFRUUFJlc3BvbnNlKSkpOgogICAgICAgIGlzVW5pY29kZSA9IEZhbHNlCiAgICBlbGlmIGhhc2F0dHIoc291cmNlLCAicmVhZCIpOgogICAgICAgIGlzVW5pY29kZSA9IGlzaW5zdGFuY2Uoc291cmNlLnJlYWQoMCksIHRleHRfdHlwZSkKICAgIGVsc2U6CiAgICAgICAgaXNVbmljb2RlID0gaXNpbnN0YW5jZShzb3VyY2UsIHRleHRfdHlwZSkKCiAgICBpZiBpc1VuaWNvZGU6CiAgICAgICAgZW5jb2RpbmdzID0gW3ggZm9yIHggaW4ga3dhcmdzIGlmIHguZW5kc3dpdGgoIl9lbmNvZGluZyIpXQogICAgICAgIGlmIGVuY29kaW5nczoKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJDYW5ub3Qgc2V0IGFuIGVuY29kaW5nIHdpdGggYSB1bmljb2RlIGlucHV0LCBzZXQgJXIiICUgZW5jb2RpbmdzKQoKICAgICAgICByZXR1cm4gSFRNTFVuaWNvZGVJbnB1dFN0cmVhbShzb3VyY2UsICoqa3dhcmdzKQogICAgZWxzZToKICAgICAgICByZXR1cm4gSFRNTEJpbmFyeUlucHV0U3RyZWFtKHNvdXJjZSwgKiprd2FyZ3MpCgoKY2xhc3MgSFRNTFVuaWNvZGVJbnB1dFN0cmVhbShvYmplY3QpOgogICAgIiIiUHJvdmlkZXMgYSB1bmljb2RlIHN0cmVhbSBvZiBjaGFyYWN0ZXJzIHRvIHRoZSBIVE1MVG9rZW5pemVyLgoKICAgIFRoaXMgY2xhc3MgdGFrZXMgY2FyZSBvZiBjaGFyYWN0ZXIgZW5jb2RpbmcgYW5kIHJlbW92aW5nIG9yIHJlcGxhY2luZwogICAgaW5jb3JyZWN0IGJ5dGUtc2VxdWVuY2VzIGFuZCBhbHNvIHByb3ZpZGVzIGNvbHVtbiBhbmQgbGluZSB0cmFja2luZy4KCiAgICAiIiIKCiAgICBfZGVmYXVsdENodW5rU2l6ZSA9IDEwMjQwCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHNvdXJjZSk6CiAgICAgICAgIiIiSW5pdGlhbGlzZXMgdGhlIEhUTUxJbnB1dFN0cmVhbS4KCiAgICAgICAgSFRNTElucHV0U3RyZWFtKHNvdXJjZSwgW2VuY29kaW5nXSkgLT4gTm9ybWFsaXplZCBzdHJlYW0gZnJvbSBzb3VyY2UKICAgICAgICBmb3IgdXNlIGJ5IGh0bWw1bGliLgoKICAgICAgICBzb3VyY2UgY2FuIGJlIGVpdGhlciBhIGZpbGUtb2JqZWN0LCBsb2NhbCBmaWxlbmFtZSBvciBhIHN0cmluZy4KCiAgICAgICAgVGhlIG9wdGlvbmFsIGVuY29kaW5nIHBhcmFtZXRlciBtdXN0IGJlIGEgc3RyaW5nIHRoYXQgaW5kaWNhdGVzCiAgICAgICAgdGhlIGVuY29kaW5nLiAgSWYgc3BlY2lmaWVkLCB0aGF0IGVuY29kaW5nIHdpbGwgYmUgdXNlZCwKICAgICAgICByZWdhcmRsZXNzIG9mIGFueSBCT00gb3IgbGF0ZXIgZGVjbGFyYXRpb24gKHN1Y2ggYXMgaW4gYSBtZXRhCiAgICAgICAgZWxlbWVudCkKCiAgICAgICAgIiIiCgogICAgICAgIGlmIG5vdCBfdXRpbHMuc3VwcG9ydHNfbG9uZV9zdXJyb2dhdGVzOgogICAgICAgICAgICAjIFN1Y2ggcGxhdGZvcm1zIHdpbGwgaGF2ZSBhbHJlYWR5IGNoZWNrZWQgZm9yIHN1Y2gKICAgICAgICAgICAgIyBzdXJyb2dhdGUgZXJyb3JzLCBzbyBubyBuZWVkIHRvIGRvIHRoaXMgY2hlY2tpbmcuCiAgICAgICAgICAgIHNlbGYucmVwb3J0Q2hhcmFjdGVyRXJyb3JzID0gTm9uZQogICAgICAgIGVsaWYgbGVuKCJcVTAwMTBGRkZGIikgPT0gMToKICAgICAgICAgICAgc2VsZi5yZXBvcnRDaGFyYWN0ZXJFcnJvcnMgPSBzZWxmLmNoYXJhY3RlckVycm9yc1VDUzQKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnJlcG9ydENoYXJhY3RlckVycm9ycyA9IHNlbGYuY2hhcmFjdGVyRXJyb3JzVUNTMgoKICAgICAgICAjIExpc3Qgb2Ygd2hlcmUgbmV3IGxpbmVzIG9jY3VyCiAgICAgICAgc2VsZi5uZXdMaW5lcyA9IFswXQoKICAgICAgICBzZWxmLmNoYXJFbmNvZGluZyA9IChsb29rdXBFbmNvZGluZygidXRmLTgiKSwgImNlcnRhaW4iKQogICAgICAgIHNlbGYuZGF0YVN0cmVhbSA9IHNlbGYub3BlblN0cmVhbShzb3VyY2UpCgogICAgICAgIHNlbGYucmVzZXQoKQoKICAgIGRlZiByZXNldChzZWxmKToKICAgICAgICBzZWxmLmNodW5rID0gIiIKICAgICAgICBzZWxmLmNodW5rU2l6ZSA9IDAKICAgICAgICBzZWxmLmNodW5rT2Zmc2V0ID0gMAogICAgICAgIHNlbGYuZXJyb3JzID0gW10KCiAgICAgICAgIyBudW1iZXIgb2YgKGNvbXBsZXRlKSBsaW5lcyBpbiBwcmV2aW91cyBjaHVua3MKICAgICAgICBzZWxmLnByZXZOdW1MaW5lcyA9IDAKICAgICAgICAjIG51bWJlciBvZiBjb2x1bW5zIGluIHRoZSBsYXN0IGxpbmUgb2YgdGhlIHByZXZpb3VzIGNodW5rCiAgICAgICAgc2VsZi5wcmV2TnVtQ29scyA9IDAKCiAgICAgICAgIyBEZWFsIHdpdGggQ1IgTEYgYW5kIHN1cnJvZ2F0ZXMgc3BsaXQgb3ZlciBjaHVuayBib3VuZGFyaWVzCiAgICAgICAgc2VsZi5fYnVmZmVyZWRDaGFyYWN0ZXIgPSBOb25lCgogICAgZGVmIG9wZW5TdHJlYW0oc2VsZiwgc291cmNlKToKICAgICAgICAiIiJQcm9kdWNlcyBhIGZpbGUgb2JqZWN0IGZyb20gc291cmNlLgoKICAgICAgICBzb3VyY2UgY2FuIGJlIGVpdGhlciBhIGZpbGUgb2JqZWN0LCBsb2NhbCBmaWxlbmFtZSBvciBhIHN0cmluZy4KCiAgICAgICAgIiIiCiAgICAgICAgIyBBbHJlYWR5IGEgZmlsZSBvYmplY3QKICAgICAgICBpZiBoYXNhdHRyKHNvdXJjZSwgJ3JlYWQnKToKICAgICAgICAgICAgc3RyZWFtID0gc291cmNlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc3RyZWFtID0gU3RyaW5nSU8oc291cmNlKQoKICAgICAgICByZXR1cm4gc3RyZWFtCgogICAgZGVmIF9wb3NpdGlvbihzZWxmLCBvZmZzZXQpOgogICAgICAgIGNodW5rID0gc2VsZi5jaHVuawogICAgICAgIG5MaW5lcyA9IGNodW5rLmNvdW50KCdcbicsIDAsIG9mZnNldCkKICAgICAgICBwb3NpdGlvbkxpbmUgPSBzZWxmLnByZXZOdW1MaW5lcyArIG5MaW5lcwogICAgICAgIGxhc3RMaW5lUG9zID0gY2h1bmsucmZpbmQoJ1xuJywgMCwgb2Zmc2V0KQogICAgICAgIGlmIGxhc3RMaW5lUG9zID09IC0xOgogICAgICAgICAgICBwb3NpdGlvbkNvbHVtbiA9IHNlbGYucHJldk51bUNvbHMgKyBvZmZzZXQKICAgICAgICBlbHNlOgogICAgICAgICAgICBwb3NpdGlvbkNvbHVtbiA9IG9mZnNldCAtIChsYXN0TGluZVBvcyArIDEpCiAgICAgICAgcmV0dXJuIChwb3NpdGlvbkxpbmUsIHBvc2l0aW9uQ29sdW1uKQoKICAgIGRlZiBwb3NpdGlvbihzZWxmKToKICAgICAgICAiIiJSZXR1cm5zIChsaW5lLCBjb2wpIG9mIHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBzdHJlYW0uIiIiCiAgICAgICAgbGluZSwgY29sID0gc2VsZi5fcG9zaXRpb24oc2VsZi5jaHVua09mZnNldCkKICAgICAgICByZXR1cm4gKGxpbmUgKyAxLCBjb2wpCgogICAgZGVmIGNoYXIoc2VsZik6CiAgICAgICAgIiIiIFJlYWQgb25lIGNoYXJhY3RlciBmcm9tIHRoZSBzdHJlYW0gb3IgcXVldWUgaWYgYXZhaWxhYmxlLiBSZXR1cm4KICAgICAgICAgICAgRU9GIHdoZW4gRU9GIGlzIHJlYWNoZWQuCiAgICAgICAgIiIiCiAgICAgICAgIyBSZWFkIGEgbmV3IGNodW5rIGZyb20gdGhlIGlucHV0IHN0cmVhbSBpZiBuZWNlc3NhcnkKICAgICAgICBpZiBzZWxmLmNodW5rT2Zmc2V0ID49IHNlbGYuY2h1bmtTaXplOgogICAgICAgICAgICBpZiBub3Qgc2VsZi5yZWFkQ2h1bmsoKToKICAgICAgICAgICAgICAgIHJldHVybiBFT0YKCiAgICAgICAgY2h1bmtPZmZzZXQgPSBzZWxmLmNodW5rT2Zmc2V0CiAgICAgICAgY2hhciA9IHNlbGYuY2h1bmtbY2h1bmtPZmZzZXRdCiAgICAgICAgc2VsZi5jaHVua09mZnNldCA9IGNodW5rT2Zmc2V0ICsgMQoKICAgICAgICByZXR1cm4gY2hhcgoKICAgIGRlZiByZWFkQ2h1bmsoc2VsZiwgY2h1bmtTaXplPU5vbmUpOgogICAgICAgIGlmIGNodW5rU2l6ZSBpcyBOb25lOgogICAgICAgICAgICBjaHVua1NpemUgPSBzZWxmLl9kZWZhdWx0Q2h1bmtTaXplCgogICAgICAgIHNlbGYucHJldk51bUxpbmVzLCBzZWxmLnByZXZOdW1Db2xzID0gc2VsZi5fcG9zaXRpb24oc2VsZi5jaHVua1NpemUpCgogICAgICAgIHNlbGYuY2h1bmsgPSAiIgogICAgICAgIHNlbGYuY2h1bmtTaXplID0gMAogICAgICAgIHNlbGYuY2h1bmtPZmZzZXQgPSAwCgogICAgICAgIGRhdGEgPSBzZWxmLmRhdGFTdHJlYW0ucmVhZChjaHVua1NpemUpCgogICAgICAgICMgRGVhbCB3aXRoIENSIExGIGFuZCBzdXJyb2dhdGVzIGJyb2tlbiBhY3Jvc3MgY2h1bmtzCiAgICAgICAgaWYgc2VsZi5fYnVmZmVyZWRDaGFyYWN0ZXI6CiAgICAgICAgICAgIGRhdGEgPSBzZWxmLl9idWZmZXJlZENoYXJhY3RlciArIGRhdGEKICAgICAgICAgICAgc2VsZi5fYnVmZmVyZWRDaGFyYWN0ZXIgPSBOb25lCiAgICAgICAgZWxpZiBub3QgZGF0YToKICAgICAgICAgICAgIyBXZSBoYXZlIG5vIG1vcmUgZGF0YSwgYnllLWJ5ZSBzdHJlYW0KICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgIGlmIGxlbihkYXRhKSA+IDE6CiAgICAgICAgICAgIGxhc3R2ID0gb3JkKGRhdGFbLTFdKQogICAgICAgICAgICBpZiBsYXN0diA9PSAweDBEIG9yIDB4RDgwMCA8PSBsYXN0diA8PSAweERCRkY6CiAgICAgICAgICAgICAgICBzZWxmLl9idWZmZXJlZENoYXJhY3RlciA9IGRhdGFbLTFdCiAgICAgICAgICAgICAgICBkYXRhID0gZGF0YVs6LTFdCgogICAgICAgIGlmIHNlbGYucmVwb3J0Q2hhcmFjdGVyRXJyb3JzOgogICAgICAgICAgICBzZWxmLnJlcG9ydENoYXJhY3RlckVycm9ycyhkYXRhKQoKICAgICAgICAjIFJlcGxhY2UgaW52YWxpZCBjaGFyYWN0ZXJzCiAgICAgICAgZGF0YSA9IGRhdGEucmVwbGFjZSgiXHJcbiIsICJcbiIpCiAgICAgICAgZGF0YSA9IGRhdGEucmVwbGFjZSgiXHIiLCAiXG4iKQoKICAgICAgICBzZWxmLmNodW5rID0gZGF0YQogICAgICAgIHNlbGYuY2h1bmtTaXplID0gbGVuKGRhdGEpCgogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGNoYXJhY3RlckVycm9yc1VDUzQoc2VsZiwgZGF0YSk6CiAgICAgICAgZm9yIF8gaW4gcmFuZ2UobGVuKGludmFsaWRfdW5pY29kZV9yZS5maW5kYWxsKGRhdGEpKSk6CiAgICAgICAgICAgIHNlbGYuZXJyb3JzLmFwcGVuZCgiaW52YWxpZC1jb2RlcG9pbnQiKQoKICAgIGRlZiBjaGFyYWN0ZXJFcnJvcnNVQ1MyKHNlbGYsIGRhdGEpOgogICAgICAgICMgU29tZW9uZSBwaWNrZWQgdGhlIHdyb25nIGNvbXBpbGUgb3B0aW9uCiAgICAgICAgIyBZb3UgbG9zZQogICAgICAgIHNraXAgPSBGYWxzZQogICAgICAgIGZvciBtYXRjaCBpbiBpbnZhbGlkX3VuaWNvZGVfcmUuZmluZGl0ZXIoZGF0YSk6CiAgICAgICAgICAgIGlmIHNraXA6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBjb2RlcG9pbnQgPSBvcmQobWF0Y2guZ3JvdXAoKSkKICAgICAgICAgICAgcG9zID0gbWF0Y2guc3RhcnQoKQogICAgICAgICAgICAjIFByZXR0eSBzdXJlIHRoZXJlIHNob3VsZCBiZSBlbmRpYW5uZXNzIGlzc3VlcyBoZXJlCiAgICAgICAgICAgIGlmIF91dGlscy5pc1N1cnJvZ2F0ZVBhaXIoZGF0YVtwb3M6cG9zICsgMl0pOgogICAgICAgICAgICAgICAgIyBXZSBoYXZlIGEgc3Vycm9nYXRlIHBhaXIhCiAgICAgICAgICAgICAgICBjaGFyX3ZhbCA9IF91dGlscy5zdXJyb2dhdGVQYWlyVG9Db2RlcG9pbnQoZGF0YVtwb3M6cG9zICsgMl0pCiAgICAgICAgICAgICAgICBpZiBjaGFyX3ZhbCBpbiBub25fYm1wX2ludmFsaWRfY29kZXBvaW50czoKICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9ycy5hcHBlbmQoImludmFsaWQtY29kZXBvaW50IikKICAgICAgICAgICAgICAgIHNraXAgPSBUcnVlCiAgICAgICAgICAgIGVsaWYgKGNvZGVwb2ludCA+PSAweEQ4MDAgYW5kIGNvZGVwb2ludCA8PSAweERGRkYgYW5kCiAgICAgICAgICAgICAgICAgIHBvcyA9PSBsZW4oZGF0YSkgLSAxKToKICAgICAgICAgICAgICAgIHNlbGYuZXJyb3JzLmFwcGVuZCgiaW52YWxpZC1jb2RlcG9pbnQiKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2tpcCA9IEZhbHNlCiAgICAgICAgICAgICAgICBzZWxmLmVycm9ycy5hcHBlbmQoImludmFsaWQtY29kZXBvaW50IikKCiAgICBkZWYgY2hhcnNVbnRpbChzZWxmLCBjaGFyYWN0ZXJzLCBvcHBvc2l0ZT1GYWxzZSk6CiAgICAgICAgIiIiIFJldHVybnMgYSBzdHJpbmcgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBzdHJlYW0gdXAgdG8gYnV0IG5vdAogICAgICAgIGluY2x1ZGluZyBhbnkgY2hhcmFjdGVyIGluICdjaGFyYWN0ZXJzJyBvciBFT0YuICdjaGFyYWN0ZXJzJyBtdXN0IGJlCiAgICAgICAgYSBjb250YWluZXIgdGhhdCBzdXBwb3J0cyB0aGUgJ2luJyBtZXRob2QgYW5kIGl0ZXJhdGlvbiBvdmVyIGl0cwogICAgICAgIGNoYXJhY3RlcnMuCiAgICAgICAgIiIiCgogICAgICAgICMgVXNlIGEgY2FjaGUgb2YgcmVnZXhwcyB0byBmaW5kIHRoZSByZXF1aXJlZCBjaGFyYWN0ZXJzCiAgICAgICAgdHJ5OgogICAgICAgICAgICBjaGFycyA9IGNoYXJzVW50aWxSZWdFeFsoY2hhcmFjdGVycywgb3Bwb3NpdGUpXQogICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgaWYgX19kZWJ1Z19fOgogICAgICAgICAgICAgICAgZm9yIGMgaW4gY2hhcmFjdGVyczoKICAgICAgICAgICAgICAgICAgICBhc3NlcnQob3JkKGMpIDwgMTI4KQogICAgICAgICAgICByZWdleCA9ICIiLmpvaW4oWyJcXHglMDJ4IiAlIG9yZChjKSBmb3IgYyBpbiBjaGFyYWN0ZXJzXSkKICAgICAgICAgICAgaWYgbm90IG9wcG9zaXRlOgogICAgICAgICAgICAgICAgcmVnZXggPSAiXiVzIiAlIHJlZ2V4CiAgICAgICAgICAgIGNoYXJzID0gY2hhcnNVbnRpbFJlZ0V4WyhjaGFyYWN0ZXJzLCBvcHBvc2l0ZSldID0gcmUuY29tcGlsZSgiWyVzXSsiICUgcmVnZXgpCgogICAgICAgIHJ2ID0gW10KCiAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgIyBGaW5kIHRoZSBsb25nZXN0IG1hdGNoaW5nIHByZWZpeAogICAgICAgICAgICBtID0gY2hhcnMubWF0Y2goc2VsZi5jaHVuaywgc2VsZi5jaHVua09mZnNldCkKICAgICAgICAgICAgaWYgbSBpcyBOb25lOgogICAgICAgICAgICAgICAgIyBJZiBub3RoaW5nIG1hdGNoZWQsIGFuZCBpdCB3YXNuJ3QgYmVjYXVzZSB3ZSByYW4gb3V0IG9mIGNodW5rLAogICAgICAgICAgICAgICAgIyB0aGVuIHN0b3AKICAgICAgICAgICAgICAgIGlmIHNlbGYuY2h1bmtPZmZzZXQgIT0gc2VsZi5jaHVua1NpemU6CiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGVuZCA9IG0uZW5kKCkKICAgICAgICAgICAgICAgICMgSWYgbm90IHRoZSB3aG9sZSBjaHVuayBtYXRjaGVkLCByZXR1cm4gZXZlcnl0aGluZwogICAgICAgICAgICAgICAgIyB1cCB0byB0aGUgcGFydCB0aGF0IGRpZG4ndCBtYXRjaAogICAgICAgICAgICAgICAgaWYgZW5kICE9IHNlbGYuY2h1bmtTaXplOgogICAgICAgICAgICAgICAgICAgIHJ2LmFwcGVuZChzZWxmLmNodW5rW3NlbGYuY2h1bmtPZmZzZXQ6ZW5kXSkKICAgICAgICAgICAgICAgICAgICBzZWxmLmNodW5rT2Zmc2V0ID0gZW5kCiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgIyBJZiB0aGUgd2hvbGUgcmVtYWluZGVyIG9mIHRoZSBjaHVuayBtYXRjaGVkLAogICAgICAgICAgICAjIHVzZSBpdCBhbGwgYW5kIHJlYWQgdGhlIG5leHQgY2h1bmsKICAgICAgICAgICAgcnYuYXBwZW5kKHNlbGYuY2h1bmtbc2VsZi5jaHVua09mZnNldDpdKQogICAgICAgICAgICBpZiBub3Qgc2VsZi5yZWFkQ2h1bmsoKToKICAgICAgICAgICAgICAgICMgUmVhY2hlZCBFT0YKICAgICAgICAgICAgICAgIGJyZWFrCgogICAgICAgIHIgPSAiIi5qb2luKHJ2KQogICAgICAgIHJldHVybiByCgogICAgZGVmIHVuZ2V0KHNlbGYsIGNoYXIpOgogICAgICAgICMgT25seSBvbmUgY2hhcmFjdGVyIGlzIGFsbG93ZWQgdG8gYmUgdW5nb3R0ZW4gYXQgb25jZSAtIGl0IG11c3QKICAgICAgICAjIGJlIGNvbnN1bWVkIGFnYWluIGJlZm9yZSBhbnkgZnVydGhlciBjYWxsIHRvIHVuZ2V0CiAgICAgICAgaWYgY2hhciBpcyBub3QgTm9uZToKICAgICAgICAgICAgaWYgc2VsZi5jaHVua09mZnNldCA9PSAwOgogICAgICAgICAgICAgICAgIyB1bmdldCBpcyBjYWxsZWQgcXVpdGUgcmFyZWx5LCBzbyBpdCdzIGEgZ29vZCBpZGVhIHRvIGRvCiAgICAgICAgICAgICAgICAjIG1vcmUgd29yayBoZXJlIGlmIGl0IHNhdmVzIGEgYml0IG9mIHdvcmsgaW4gdGhlIGZyZXF1ZW50bHkKICAgICAgICAgICAgICAgICMgY2FsbGVkIGNoYXIgYW5kIGNoYXJzVW50aWwuCiAgICAgICAgICAgICAgICAjIFNvLCBqdXN0IHByZXBlbmQgdGhlIHVuZ290dGVuIGNoYXJhY3RlciBvbnRvIHRoZSBjdXJyZW50CiAgICAgICAgICAgICAgICAjIGNodW5rOgogICAgICAgICAgICAgICAgc2VsZi5jaHVuayA9IGNoYXIgKyBzZWxmLmNodW5rCiAgICAgICAgICAgICAgICBzZWxmLmNodW5rU2l6ZSArPSAxCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLmNodW5rT2Zmc2V0IC09IDEKICAgICAgICAgICAgICAgIGFzc2VydCBzZWxmLmNodW5rW3NlbGYuY2h1bmtPZmZzZXRdID09IGNoYXIKCgpjbGFzcyBIVE1MQmluYXJ5SW5wdXRTdHJlYW0oSFRNTFVuaWNvZGVJbnB1dFN0cmVhbSk6CiAgICAiIiJQcm92aWRlcyBhIHVuaWNvZGUgc3RyZWFtIG9mIGNoYXJhY3RlcnMgdG8gdGhlIEhUTUxUb2tlbml6ZXIuCgogICAgVGhpcyBjbGFzcyB0YWtlcyBjYXJlIG9mIGNoYXJhY3RlciBlbmNvZGluZyBhbmQgcmVtb3Zpbmcgb3IgcmVwbGFjaW5nCiAgICBpbmNvcnJlY3QgYnl0ZS1zZXF1ZW5jZXMgYW5kIGFsc28gcHJvdmlkZXMgY29sdW1uIGFuZCBsaW5lIHRyYWNraW5nLgoKICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzb3VyY2UsIG92ZXJyaWRlX2VuY29kaW5nPU5vbmUsIHRyYW5zcG9ydF9lbmNvZGluZz1Ob25lLAogICAgICAgICAgICAgICAgIHNhbWVfb3JpZ2luX3BhcmVudF9lbmNvZGluZz1Ob25lLCBsaWtlbHlfZW5jb2Rpbmc9Tm9uZSwKICAgICAgICAgICAgICAgICBkZWZhdWx0X2VuY29kaW5nPSJ3aW5kb3dzLTEyNTIiLCB1c2VDaGFyZGV0PVRydWUpOgogICAgICAgICIiIkluaXRpYWxpc2VzIHRoZSBIVE1MSW5wdXRTdHJlYW0uCgogICAgICAgIEhUTUxJbnB1dFN0cmVhbShzb3VyY2UsIFtlbmNvZGluZ10pIC0+IE5vcm1hbGl6ZWQgc3RyZWFtIGZyb20gc291cmNlCiAgICAgICAgZm9yIHVzZSBieSBodG1sNWxpYi4KCiAgICAgICAgc291cmNlIGNhbiBiZSBlaXRoZXIgYSBmaWxlLW9iamVjdCwgbG9jYWwgZmlsZW5hbWUgb3IgYSBzdHJpbmcuCgogICAgICAgIFRoZSBvcHRpb25hbCBlbmNvZGluZyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHN0cmluZyB0aGF0IGluZGljYXRlcwogICAgICAgIHRoZSBlbmNvZGluZy4gIElmIHNwZWNpZmllZCwgdGhhdCBlbmNvZGluZyB3aWxsIGJlIHVzZWQsCiAgICAgICAgcmVnYXJkbGVzcyBvZiBhbnkgQk9NIG9yIGxhdGVyIGRlY2xhcmF0aW9uIChzdWNoIGFzIGluIGEgbWV0YQogICAgICAgIGVsZW1lbnQpCgogICAgICAgICIiIgogICAgICAgICMgUmF3IFN0cmVhbSAtIGZvciB1bmljb2RlIG9iamVjdHMgdGhpcyB3aWxsIGVuY29kZSB0byB1dGYtOCBhbmQgc2V0CiAgICAgICAgIyAgICAgICAgICAgICAgc2VsZi5jaGFyRW5jb2RpbmcgYXMgYXBwcm9wcmlhdGUKICAgICAgICBzZWxmLnJhd1N0cmVhbSA9IHNlbGYub3BlblN0cmVhbShzb3VyY2UpCgogICAgICAgIEhUTUxVbmljb2RlSW5wdXRTdHJlYW0uX19pbml0X18oc2VsZiwgc2VsZi5yYXdTdHJlYW0pCgogICAgICAgICMgRW5jb2RpbmcgSW5mb3JtYXRpb24KICAgICAgICAjIE51bWJlciBvZiBieXRlcyB0byB1c2Ugd2hlbiBsb29raW5nIGZvciBhIG1ldGEgZWxlbWVudCB3aXRoCiAgICAgICAgIyBlbmNvZGluZyBpbmZvcm1hdGlvbgogICAgICAgIHNlbGYubnVtQnl0ZXNNZXRhID0gMTAyNAogICAgICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIHVzZSB3aGVuIHVzaW5nIGRldGVjdGluZyBlbmNvZGluZyB1c2luZyBjaGFyZGV0CiAgICAgICAgc2VsZi5udW1CeXRlc0NoYXJkZXQgPSAxMDAKICAgICAgICAjIFRoaW5ncyBmcm9tIGFyZ3MKICAgICAgICBzZWxmLm92ZXJyaWRlX2VuY29kaW5nID0gb3ZlcnJpZGVfZW5jb2RpbmcKICAgICAgICBzZWxmLnRyYW5zcG9ydF9lbmNvZGluZyA9IHRyYW5zcG9ydF9lbmNvZGluZwogICAgICAgIHNlbGYuc2FtZV9vcmlnaW5fcGFyZW50X2VuY29kaW5nID0gc2FtZV9vcmlnaW5fcGFyZW50X2VuY29kaW5nCiAgICAgICAgc2VsZi5saWtlbHlfZW5jb2RpbmcgPSBsaWtlbHlfZW5jb2RpbmcKICAgICAgICBzZWxmLmRlZmF1bHRfZW5jb2RpbmcgPSBkZWZhdWx0X2VuY29kaW5nCgogICAgICAgICMgRGV0ZXJtaW5lIGVuY29kaW5nCiAgICAgICAgc2VsZi5jaGFyRW5jb2RpbmcgPSBzZWxmLmRldGVybWluZUVuY29kaW5nKHVzZUNoYXJkZXQpCiAgICAgICAgYXNzZXJ0IHNlbGYuY2hhckVuY29kaW5nWzBdIGlzIG5vdCBOb25lCgogICAgICAgICMgQ2FsbCBzdXBlcmNsYXNzCiAgICAgICAgc2VsZi5yZXNldCgpCgogICAgZGVmIHJlc2V0KHNlbGYpOgogICAgICAgIHNlbGYuZGF0YVN0cmVhbSA9IHNlbGYuY2hhckVuY29kaW5nWzBdLmNvZGVjX2luZm8uc3RyZWFtcmVhZGVyKHNlbGYucmF3U3RyZWFtLCAncmVwbGFjZScpCiAgICAgICAgSFRNTFVuaWNvZGVJbnB1dFN0cmVhbS5yZXNldChzZWxmKQoKICAgIGRlZiBvcGVuU3RyZWFtKHNlbGYsIHNvdXJjZSk6CiAgICAgICAgIiIiUHJvZHVjZXMgYSBmaWxlIG9iamVjdCBmcm9tIHNvdXJjZS4KCiAgICAgICAgc291cmNlIGNhbiBiZSBlaXRoZXIgYSBmaWxlIG9iamVjdCwgbG9jYWwgZmlsZW5hbWUgb3IgYSBzdHJpbmcuCgogICAgICAgICIiIgogICAgICAgICMgQWxyZWFkeSBhIGZpbGUgb2JqZWN0CiAgICAgICAgaWYgaGFzYXR0cihzb3VyY2UsICdyZWFkJyk6CiAgICAgICAgICAgIHN0cmVhbSA9IHNvdXJjZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHN0cmVhbSA9IEJ5dGVzSU8oc291cmNlKQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHN0cmVhbS5zZWVrKHN0cmVhbS50ZWxsKCkpCiAgICAgICAgZXhjZXB0OiAgIyBweWxpbnQ6ZGlzYWJsZT1iYXJlLWV4Y2VwdAogICAgICAgICAgICBzdHJlYW0gPSBCdWZmZXJlZFN0cmVhbShzdHJlYW0pCgogICAgICAgIHJldHVybiBzdHJlYW0KCiAgICBkZWYgZGV0ZXJtaW5lRW5jb2Rpbmcoc2VsZiwgY2hhcmRldD1UcnVlKToKICAgICAgICAjIEJPTXMgdGFrZSBwcmVjZWRlbmNlIG92ZXIgZXZlcnl0aGluZwogICAgICAgICMgVGhpcyB3aWxsIGFsc28gcmVhZCBwYXN0IHRoZSBCT00gaWYgcHJlc2VudAogICAgICAgIGNoYXJFbmNvZGluZyA9IHNlbGYuZGV0ZWN0Qk9NKCksICJjZXJ0YWluIgogICAgICAgIGlmIGNoYXJFbmNvZGluZ1swXSBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuIGNoYXJFbmNvZGluZwoKICAgICAgICAjIElmIHdlJ3ZlIGJlZW4gb3ZlcnJpZGVuLCB3ZSd2ZSBiZWVuIG92ZXJyaWRlbgogICAgICAgIGNoYXJFbmNvZGluZyA9IGxvb2t1cEVuY29kaW5nKHNlbGYub3ZlcnJpZGVfZW5jb2RpbmcpLCAiY2VydGFpbiIKICAgICAgICBpZiBjaGFyRW5jb2RpbmdbMF0gaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJldHVybiBjaGFyRW5jb2RpbmcKCiAgICAgICAgIyBOb3cgY2hlY2sgdGhlIHRyYW5zcG9ydCBsYXllcgogICAgICAgIGNoYXJFbmNvZGluZyA9IGxvb2t1cEVuY29kaW5nKHNlbGYudHJhbnNwb3J0X2VuY29kaW5nKSwgImNlcnRhaW4iCiAgICAgICAgaWYgY2hhckVuY29kaW5nWzBdIGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4gY2hhckVuY29kaW5nCgogICAgICAgICMgTG9vayBmb3IgbWV0YSBlbGVtZW50cyB3aXRoIGVuY29kaW5nIGluZm9ybWF0aW9uCiAgICAgICAgY2hhckVuY29kaW5nID0gc2VsZi5kZXRlY3RFbmNvZGluZ01ldGEoKSwgInRlbnRhdGl2ZSIKICAgICAgICBpZiBjaGFyRW5jb2RpbmdbMF0gaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJldHVybiBjaGFyRW5jb2RpbmcKCiAgICAgICAgIyBQYXJlbnQgZG9jdW1lbnQgZW5jb2RpbmcKICAgICAgICBjaGFyRW5jb2RpbmcgPSBsb29rdXBFbmNvZGluZyhzZWxmLnNhbWVfb3JpZ2luX3BhcmVudF9lbmNvZGluZyksICJ0ZW50YXRpdmUiCiAgICAgICAgaWYgY2hhckVuY29kaW5nWzBdIGlzIG5vdCBOb25lIGFuZCBub3QgY2hhckVuY29kaW5nWzBdLm5hbWUuc3RhcnRzd2l0aCgidXRmLTE2Iik6CiAgICAgICAgICAgIHJldHVybiBjaGFyRW5jb2RpbmcKCiAgICAgICAgIyAibGlrZWx5IiBlbmNvZGluZwogICAgICAgIGNoYXJFbmNvZGluZyA9IGxvb2t1cEVuY29kaW5nKHNlbGYubGlrZWx5X2VuY29kaW5nKSwgInRlbnRhdGl2ZSIKICAgICAgICBpZiBjaGFyRW5jb2RpbmdbMF0gaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJldHVybiBjaGFyRW5jb2RpbmcKCiAgICAgICAgIyBHdWVzcyB3aXRoIGNoYXJkZXQsIGlmIGF2YWlsYWJsZQogICAgICAgIGlmIGNoYXJkZXQ6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGZyb20gY2hhcmRldC51bml2ZXJzYWxkZXRlY3RvciBpbXBvcnQgVW5pdmVyc2FsRGV0ZWN0b3IKICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgYnVmZmVycyA9IFtdCiAgICAgICAgICAgICAgICBkZXRlY3RvciA9IFVuaXZlcnNhbERldGVjdG9yKCkKICAgICAgICAgICAgICAgIHdoaWxlIG5vdCBkZXRlY3Rvci5kb25lOgogICAgICAgICAgICAgICAgICAgIGJ1ZmZlciA9IHNlbGYucmF3U3RyZWFtLnJlYWQoc2VsZi5udW1CeXRlc0NoYXJkZXQpCiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoYnVmZmVyLCBieXRlcykKICAgICAgICAgICAgICAgICAgICBpZiBub3QgYnVmZmVyOgogICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgICAgIGJ1ZmZlcnMuYXBwZW5kKGJ1ZmZlcikKICAgICAgICAgICAgICAgICAgICBkZXRlY3Rvci5mZWVkKGJ1ZmZlcikKICAgICAgICAgICAgICAgIGRldGVjdG9yLmNsb3NlKCkKICAgICAgICAgICAgICAgIGVuY29kaW5nID0gbG9va3VwRW5jb2RpbmcoZGV0ZWN0b3IucmVzdWx0WydlbmNvZGluZyddKQogICAgICAgICAgICAgICAgc2VsZi5yYXdTdHJlYW0uc2VlaygwKQogICAgICAgICAgICAgICAgaWYgZW5jb2RpbmcgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVuY29kaW5nLCAidGVudGF0aXZlIgoKICAgICAgICAjIFRyeSB0aGUgZGVmYXVsdCBlbmNvZGluZwogICAgICAgIGNoYXJFbmNvZGluZyA9IGxvb2t1cEVuY29kaW5nKHNlbGYuZGVmYXVsdF9lbmNvZGluZyksICJ0ZW50YXRpdmUiCiAgICAgICAgaWYgY2hhckVuY29kaW5nWzBdIGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4gY2hhckVuY29kaW5nCgogICAgICAgICMgRmFsbGJhY2sgdG8gaHRtbDVsaWIncyBkZWZhdWx0IGlmIGV2ZW4gdGhhdCBoYXNuJ3Qgd29ya2VkCiAgICAgICAgcmV0dXJuIGxvb2t1cEVuY29kaW5nKCJ3aW5kb3dzLTEyNTIiKSwgInRlbnRhdGl2ZSIKCiAgICBkZWYgY2hhbmdlRW5jb2Rpbmcoc2VsZiwgbmV3RW5jb2RpbmcpOgogICAgICAgIGFzc2VydCBzZWxmLmNoYXJFbmNvZGluZ1sxXSAhPSAiY2VydGFpbiIKICAgICAgICBuZXdFbmNvZGluZyA9IGxvb2t1cEVuY29kaW5nKG5ld0VuY29kaW5nKQogICAgICAgIGlmIG5ld0VuY29kaW5nIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIGlmIG5ld0VuY29kaW5nLm5hbWUgaW4gKCJ1dGYtMTZiZSIsICJ1dGYtMTZsZSIpOgogICAgICAgICAgICBuZXdFbmNvZGluZyA9IGxvb2t1cEVuY29kaW5nKCJ1dGYtOCIpCiAgICAgICAgICAgIGFzc2VydCBuZXdFbmNvZGluZyBpcyBub3QgTm9uZQogICAgICAgIGVsaWYgbmV3RW5jb2RpbmcgPT0gc2VsZi5jaGFyRW5jb2RpbmdbMF06CiAgICAgICAgICAgIHNlbGYuY2hhckVuY29kaW5nID0gKHNlbGYuY2hhckVuY29kaW5nWzBdLCAiY2VydGFpbiIpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5yYXdTdHJlYW0uc2VlaygwKQogICAgICAgICAgICBzZWxmLmNoYXJFbmNvZGluZyA9IChuZXdFbmNvZGluZywgImNlcnRhaW4iKQogICAgICAgICAgICBzZWxmLnJlc2V0KCkKICAgICAgICAgICAgcmFpc2UgUmVwYXJzZUV4Y2VwdGlvbigiRW5jb2RpbmcgY2hhbmdlZCBmcm9tICVzIHRvICVzIiAlIChzZWxmLmNoYXJFbmNvZGluZ1swXSwgbmV3RW5jb2RpbmcpKQoKICAgIGRlZiBkZXRlY3RCT00oc2VsZik6CiAgICAgICAgIiIiQXR0ZW1wdHMgdG8gZGV0ZWN0IGF0IEJPTSBhdCB0aGUgc3RhcnQgb2YgdGhlIHN0cmVhbS4gSWYKICAgICAgICBhbiBlbmNvZGluZyBjYW4gYmUgZGV0ZXJtaW5lZCBmcm9tIHRoZSBCT00gcmV0dXJuIHRoZSBuYW1lIG9mIHRoZQogICAgICAgIGVuY29kaW5nIG90aGVyd2lzZSByZXR1cm4gTm9uZSIiIgogICAgICAgIGJvbURpY3QgPSB7CiAgICAgICAgICAgIGNvZGVjcy5CT01fVVRGODogJ3V0Zi04JywKICAgICAgICAgICAgY29kZWNzLkJPTV9VVEYxNl9MRTogJ3V0Zi0xNmxlJywgY29kZWNzLkJPTV9VVEYxNl9CRTogJ3V0Zi0xNmJlJywKICAgICAgICAgICAgY29kZWNzLkJPTV9VVEYzMl9MRTogJ3V0Zi0zMmxlJywgY29kZWNzLkJPTV9VVEYzMl9CRTogJ3V0Zi0zMmJlJwogICAgICAgIH0KCiAgICAgICAgIyBHbyB0byBiZWdpbm5pbmcgb2YgZmlsZSBhbmQgcmVhZCBpbiA0IGJ5dGVzCiAgICAgICAgc3RyaW5nID0gc2VsZi5yYXdTdHJlYW0ucmVhZCg0KQogICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHN0cmluZywgYnl0ZXMpCgogICAgICAgICMgVHJ5IGRldGVjdGluZyB0aGUgQk9NIHVzaW5nIGJ5dGVzIGZyb20gdGhlIHN0cmluZwogICAgICAgIGVuY29kaW5nID0gYm9tRGljdC5nZXQoc3RyaW5nWzozXSkgICAgICAgICAjIFVURi04CiAgICAgICAgc2VlayA9IDMKICAgICAgICBpZiBub3QgZW5jb2Rpbmc6CiAgICAgICAgICAgICMgTmVlZCB0byBkZXRlY3QgVVRGLTMyIGJlZm9yZSBVVEYtMTYKICAgICAgICAgICAgZW5jb2RpbmcgPSBib21EaWN0LmdldChzdHJpbmcpICAgICAgICAgIyBVVEYtMzIKICAgICAgICAgICAgc2VlayA9IDQKICAgICAgICAgICAgaWYgbm90IGVuY29kaW5nOgogICAgICAgICAgICAgICAgZW5jb2RpbmcgPSBib21EaWN0LmdldChzdHJpbmdbOjJdKSAgIyBVVEYtMTYKICAgICAgICAgICAgICAgIHNlZWsgPSAyCgogICAgICAgICMgU2V0IHRoZSByZWFkIHBvc2l0aW9uIHBhc3QgdGhlIEJPTSBpZiBvbmUgd2FzIGZvdW5kLCBvdGhlcndpc2UKICAgICAgICAjIHNldCBpdCB0byB0aGUgc3RhcnQgb2YgdGhlIHN0cmVhbQogICAgICAgIGlmIGVuY29kaW5nOgogICAgICAgICAgICBzZWxmLnJhd1N0cmVhbS5zZWVrKHNlZWspCiAgICAgICAgICAgIHJldHVybiBsb29rdXBFbmNvZGluZyhlbmNvZGluZykKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnJhd1N0cmVhbS5zZWVrKDApCiAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgZGVmIGRldGVjdEVuY29kaW5nTWV0YShzZWxmKToKICAgICAgICAiIiJSZXBvcnQgdGhlIGVuY29kaW5nIGRlY2xhcmVkIGJ5IHRoZSBtZXRhIGVsZW1lbnQKICAgICAgICAiIiIKICAgICAgICBidWZmZXIgPSBzZWxmLnJhd1N0cmVhbS5yZWFkKHNlbGYubnVtQnl0ZXNNZXRhKQogICAgICAgIGFzc2VydCBpc2luc3RhbmNlKGJ1ZmZlciwgYnl0ZXMpCiAgICAgICAgcGFyc2VyID0gRW5jb2RpbmdQYXJzZXIoYnVmZmVyKQogICAgICAgIHNlbGYucmF3U3RyZWFtLnNlZWsoMCkKICAgICAgICBlbmNvZGluZyA9IHBhcnNlci5nZXRFbmNvZGluZygpCgogICAgICAgIGlmIGVuY29kaW5nIGlzIG5vdCBOb25lIGFuZCBlbmNvZGluZy5uYW1lIGluICgidXRmLTE2YmUiLCAidXRmLTE2bGUiKToKICAgICAgICAgICAgZW5jb2RpbmcgPSBsb29rdXBFbmNvZGluZygidXRmLTgiKQoKICAgICAgICByZXR1cm4gZW5jb2RpbmcKCgpjbGFzcyBFbmNvZGluZ0J5dGVzKGJ5dGVzKToKICAgICIiIlN0cmluZy1saWtlIG9iamVjdCB3aXRoIGFuIGFzc29jaWF0ZWQgcG9zaXRpb24gYW5kIHZhcmlvdXMgZXh0cmEgbWV0aG9kcwogICAgSWYgdGhlIHBvc2l0aW9uIGlzIGV2ZXIgZ3JlYXRlciB0aGFuIHRoZSBzdHJpbmcgbGVuZ3RoIHRoZW4gYW4gZXhjZXB0aW9uIGlzCiAgICByYWlzZWQiIiIKICAgIGRlZiBfX25ld19fKHNlbGYsIHZhbHVlKToKICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZSh2YWx1ZSwgYnl0ZXMpCiAgICAgICAgcmV0dXJuIGJ5dGVzLl9fbmV3X18oc2VsZiwgdmFsdWUubG93ZXIoKSkKCiAgICBkZWYgX19pbml0X18oc2VsZiwgdmFsdWUpOgogICAgICAgICMgcHlsaW50OmRpc2FibGU9dW51c2VkLWFyZ3VtZW50CiAgICAgICAgc2VsZi5fcG9zaXRpb24gPSAtMQoKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBfX25leHRfXyhzZWxmKToKICAgICAgICBwID0gc2VsZi5fcG9zaXRpb24gPSBzZWxmLl9wb3NpdGlvbiArIDEKICAgICAgICBpZiBwID49IGxlbihzZWxmKToKICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgogICAgICAgIGVsaWYgcCA8IDA6CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcgogICAgICAgIHJldHVybiBzZWxmW3A6cCArIDFdCgogICAgZGVmIG5leHQoc2VsZik6CiAgICAgICAgIyBQeTIgY29tcGF0CiAgICAgICAgcmV0dXJuIHNlbGYuX19uZXh0X18oKQoKICAgIGRlZiBwcmV2aW91cyhzZWxmKToKICAgICAgICBwID0gc2VsZi5fcG9zaXRpb24KICAgICAgICBpZiBwID49IGxlbihzZWxmKToKICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgogICAgICAgIGVsaWYgcCA8IDA6CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcgogICAgICAgIHNlbGYuX3Bvc2l0aW9uID0gcCA9IHAgLSAxCiAgICAgICAgcmV0dXJuIHNlbGZbcDpwICsgMV0KCiAgICBkZWYgc2V0UG9zaXRpb24oc2VsZiwgcG9zaXRpb24pOgogICAgICAgIGlmIHNlbGYuX3Bvc2l0aW9uID49IGxlbihzZWxmKToKICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgogICAgICAgIHNlbGYuX3Bvc2l0aW9uID0gcG9zaXRpb24KCiAgICBkZWYgZ2V0UG9zaXRpb24oc2VsZik6CiAgICAgICAgaWYgc2VsZi5fcG9zaXRpb24gPj0gbGVuKHNlbGYpOgogICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCiAgICAgICAgaWYgc2VsZi5fcG9zaXRpb24gPj0gMDoKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3Bvc2l0aW9uCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBwb3NpdGlvbiA9IHByb3BlcnR5KGdldFBvc2l0aW9uLCBzZXRQb3NpdGlvbikKCiAgICBkZWYgZ2V0Q3VycmVudEJ5dGUoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGZbc2VsZi5wb3NpdGlvbjpzZWxmLnBvc2l0aW9uICsgMV0KCiAgICBjdXJyZW50Qnl0ZSA9IHByb3BlcnR5KGdldEN1cnJlbnRCeXRlKQoKICAgIGRlZiBza2lwKHNlbGYsIGNoYXJzPXNwYWNlQ2hhcmFjdGVyc0J5dGVzKToKICAgICAgICAiIiJTa2lwIHBhc3QgYSBsaXN0IG9mIGNoYXJhY3RlcnMiIiIKICAgICAgICBwID0gc2VsZi5wb3NpdGlvbiAgICAgICAgICAgICAgICMgdXNlIHByb3BlcnR5IGZvciB0aGUgZXJyb3ItY2hlY2tpbmcKICAgICAgICB3aGlsZSBwIDwgbGVuKHNlbGYpOgogICAgICAgICAgICBjID0gc2VsZltwOnAgKyAxXQogICAgICAgICAgICBpZiBjIG5vdCBpbiBjaGFyczoKICAgICAgICAgICAgICAgIHNlbGYuX3Bvc2l0aW9uID0gcAogICAgICAgICAgICAgICAgcmV0dXJuIGMKICAgICAgICAgICAgcCArPSAxCiAgICAgICAgc2VsZi5fcG9zaXRpb24gPSBwCiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBkZWYgc2tpcFVudGlsKHNlbGYsIGNoYXJzKToKICAgICAgICBwID0gc2VsZi5wb3NpdGlvbgogICAgICAgIHdoaWxlIHAgPCBsZW4oc2VsZik6CiAgICAgICAgICAgIGMgPSBzZWxmW3A6cCArIDFdCiAgICAgICAgICAgIGlmIGMgaW4gY2hhcnM6CiAgICAgICAgICAgICAgICBzZWxmLl9wb3NpdGlvbiA9IHAKICAgICAgICAgICAgICAgIHJldHVybiBjCiAgICAgICAgICAgIHAgKz0gMQogICAgICAgIHNlbGYuX3Bvc2l0aW9uID0gcAogICAgICAgIHJldHVybiBOb25lCgogICAgZGVmIG1hdGNoQnl0ZXMoc2VsZiwgYnl0ZXMpOgogICAgICAgICIiIkxvb2sgZm9yIGEgc2VxdWVuY2Ugb2YgYnl0ZXMgYXQgdGhlIHN0YXJ0IG9mIGEgc3RyaW5nLiBJZiB0aGUgYnl0ZXMKICAgICAgICBhcmUgZm91bmQgcmV0dXJuIFRydWUgYW5kIGFkdmFuY2UgdGhlIHBvc2l0aW9uIHRvIHRoZSBieXRlIGFmdGVyIHRoZQogICAgICAgIG1hdGNoLiBPdGhlcndpc2UgcmV0dXJuIEZhbHNlIGFuZCBsZWF2ZSB0aGUgcG9zaXRpb24gYWxvbmUiIiIKICAgICAgICBwID0gc2VsZi5wb3NpdGlvbgogICAgICAgIGRhdGEgPSBzZWxmW3A6cCArIGxlbihieXRlcyldCiAgICAgICAgcnYgPSBkYXRhLnN0YXJ0c3dpdGgoYnl0ZXMpCiAgICAgICAgaWYgcnY6CiAgICAgICAgICAgIHNlbGYucG9zaXRpb24gKz0gbGVuKGJ5dGVzKQogICAgICAgIHJldHVybiBydgoKICAgIGRlZiBqdW1wVG8oc2VsZiwgYnl0ZXMpOgogICAgICAgICIiIkxvb2sgZm9yIHRoZSBuZXh0IHNlcXVlbmNlIG9mIGJ5dGVzIG1hdGNoaW5nIGEgZ2l2ZW4gc2VxdWVuY2UuIElmCiAgICAgICAgYSBtYXRjaCBpcyBmb3VuZCBhZHZhbmNlIHRoZSBwb3NpdGlvbiB0byB0aGUgbGFzdCBieXRlIG9mIHRoZSBtYXRjaCIiIgogICAgICAgIG5ld1Bvc2l0aW9uID0gc2VsZltzZWxmLnBvc2l0aW9uOl0uZmluZChieXRlcykKICAgICAgICBpZiBuZXdQb3NpdGlvbiA+IC0xOgogICAgICAgICAgICAjIFhYWDogVGhpcyBpcyB1Z2x5LCBidXQgSSBjYW4ndCBzZWUgYSBuaWNlciB3YXkgdG8gZml4IHRoaXMuCiAgICAgICAgICAgIGlmIHNlbGYuX3Bvc2l0aW9uID09IC0xOgogICAgICAgICAgICAgICAgc2VsZi5fcG9zaXRpb24gPSAwCiAgICAgICAgICAgIHNlbGYuX3Bvc2l0aW9uICs9IChuZXdQb3NpdGlvbiArIGxlbihieXRlcykgLSAxKQogICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KCgpjbGFzcyBFbmNvZGluZ1BhcnNlcihvYmplY3QpOgogICAgIiIiTWluaSBwYXJzZXIgZm9yIGRldGVjdGluZyBjaGFyYWN0ZXIgZW5jb2RpbmcgZnJvbSBtZXRhIGVsZW1lbnRzIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGRhdGEpOgogICAgICAgICIiInN0cmluZyAtIHRoZSBkYXRhIHRvIHdvcmsgb24gZm9yIGVuY29kaW5nIGRldGVjdGlvbiIiIgogICAgICAgIHNlbGYuZGF0YSA9IEVuY29kaW5nQnl0ZXMoZGF0YSkKICAgICAgICBzZWxmLmVuY29kaW5nID0gTm9uZQoKICAgIGRlZiBnZXRFbmNvZGluZyhzZWxmKToKICAgICAgICBtZXRob2REaXNwYXRjaCA9ICgKICAgICAgICAgICAgKGIiPCEtLSIsIHNlbGYuaGFuZGxlQ29tbWVudCksCiAgICAgICAgICAgIChiIjxtZXRhIiwgc2VsZi5oYW5kbGVNZXRhKSwKICAgICAgICAgICAgKGIiPC8iLCBzZWxmLmhhbmRsZVBvc3NpYmxlRW5kVGFnKSwKICAgICAgICAgICAgKGIiPCEiLCBzZWxmLmhhbmRsZU90aGVyKSwKICAgICAgICAgICAgKGIiPD8iLCBzZWxmLmhhbmRsZU90aGVyKSwKICAgICAgICAgICAgKGIiPCIsIHNlbGYuaGFuZGxlUG9zc2libGVTdGFydFRhZykpCiAgICAgICAgZm9yIF8gaW4gc2VsZi5kYXRhOgogICAgICAgICAgICBrZWVwUGFyc2luZyA9IFRydWUKICAgICAgICAgICAgZm9yIGtleSwgbWV0aG9kIGluIG1ldGhvZERpc3BhdGNoOgogICAgICAgICAgICAgICAgaWYgc2VsZi5kYXRhLm1hdGNoQnl0ZXMoa2V5KToKICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgIGtlZXBQYXJzaW5nID0gbWV0aG9kKCkKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKICAgICAgICAgICAgICAgICAgICAgICAga2VlcFBhcnNpbmcgPSBGYWxzZQogICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBpZiBub3Qga2VlcFBhcnNpbmc6CiAgICAgICAgICAgICAgICBicmVhawoKICAgICAgICByZXR1cm4gc2VsZi5lbmNvZGluZwoKICAgIGRlZiBoYW5kbGVDb21tZW50KHNlbGYpOgogICAgICAgICIiIlNraXAgb3ZlciBjb21tZW50cyIiIgogICAgICAgIHJldHVybiBzZWxmLmRhdGEuanVtcFRvKGIiLS0+IikKCiAgICBkZWYgaGFuZGxlTWV0YShzZWxmKToKICAgICAgICBpZiBzZWxmLmRhdGEuY3VycmVudEJ5dGUgbm90IGluIHNwYWNlQ2hhcmFjdGVyc0J5dGVzOgogICAgICAgICAgICAjIGlmIHdlIGhhdmUgPG1ldGEgbm90IGZvbGxvd2VkIGJ5IGEgc3BhY2Ugc28ganVzdCBrZWVwIGdvaW5nCiAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgIyBXZSBoYXZlIGEgdmFsaWQgbWV0YSBlbGVtZW50IHdlIHdhbnQgdG8gc2VhcmNoIGZvciBhdHRyaWJ1dGVzCiAgICAgICAgaGFzUHJhZ21hID0gRmFsc2UKICAgICAgICBwZW5kaW5nRW5jb2RpbmcgPSBOb25lCiAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgIyBUcnkgdG8gZmluZCB0aGUgbmV4dCBhdHRyaWJ1dGUgYWZ0ZXIgdGhlIGN1cnJlbnQgcG9zaXRpb24KICAgICAgICAgICAgYXR0ciA9IHNlbGYuZ2V0QXR0cmlidXRlKCkKICAgICAgICAgICAgaWYgYXR0ciBpcyBOb25lOgogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGlmIGF0dHJbMF0gPT0gYiJodHRwLWVxdWl2IjoKICAgICAgICAgICAgICAgICAgICBoYXNQcmFnbWEgPSBhdHRyWzFdID09IGIiY29udGVudC10eXBlIgogICAgICAgICAgICAgICAgICAgIGlmIGhhc1ByYWdtYSBhbmQgcGVuZGluZ0VuY29kaW5nIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVuY29kaW5nID0gcGVuZGluZ0VuY29kaW5nCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgICAgICAgICAgZWxpZiBhdHRyWzBdID09IGIiY2hhcnNldCI6CiAgICAgICAgICAgICAgICAgICAgdGVudGF0aXZlRW5jb2RpbmcgPSBhdHRyWzFdCiAgICAgICAgICAgICAgICAgICAgY29kZWMgPSBsb29rdXBFbmNvZGluZyh0ZW50YXRpdmVFbmNvZGluZykKICAgICAgICAgICAgICAgICAgICBpZiBjb2RlYyBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lbmNvZGluZyA9IGNvZGVjCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgICAgICAgICAgZWxpZiBhdHRyWzBdID09IGIiY29udGVudCI6CiAgICAgICAgICAgICAgICAgICAgY29udGVudFBhcnNlciA9IENvbnRlbnRBdHRyUGFyc2VyKEVuY29kaW5nQnl0ZXMoYXR0clsxXSkpCiAgICAgICAgICAgICAgICAgICAgdGVudGF0aXZlRW5jb2RpbmcgPSBjb250ZW50UGFyc2VyLnBhcnNlKCkKICAgICAgICAgICAgICAgICAgICBpZiB0ZW50YXRpdmVFbmNvZGluZyBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICAgICAgY29kZWMgPSBsb29rdXBFbmNvZGluZyh0ZW50YXRpdmVFbmNvZGluZykKICAgICAgICAgICAgICAgICAgICAgICAgaWYgY29kZWMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBoYXNQcmFnbWE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lbmNvZGluZyA9IGNvZGVjCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdFbmNvZGluZyA9IGNvZGVjCgogICAgZGVmIGhhbmRsZVBvc3NpYmxlU3RhcnRUYWcoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuaGFuZGxlUG9zc2libGVUYWcoRmFsc2UpCgogICAgZGVmIGhhbmRsZVBvc3NpYmxlRW5kVGFnKHNlbGYpOgogICAgICAgIG5leHQoc2VsZi5kYXRhKQogICAgICAgIHJldHVybiBzZWxmLmhhbmRsZVBvc3NpYmxlVGFnKFRydWUpCgogICAgZGVmIGhhbmRsZVBvc3NpYmxlVGFnKHNlbGYsIGVuZFRhZyk6CiAgICAgICAgZGF0YSA9IHNlbGYuZGF0YQogICAgICAgIGlmIGRhdGEuY3VycmVudEJ5dGUgbm90IGluIGFzY2lpTGV0dGVyc0J5dGVzOgogICAgICAgICAgICAjIElmIHRoZSBuZXh0IGJ5dGUgaXMgbm90IGFuIGFzY2lpIGxldHRlciBlaXRoZXIgaWdub3JlIHRoaXMKICAgICAgICAgICAgIyBmcmFnbWVudCAocG9zc2libGUgc3RhcnQgdGFnIGNhc2UpIG9yIHRyZWF0IGl0IGFjY29yZGluZyB0bwogICAgICAgICAgICAjIGhhbmRsZU90aGVyCiAgICAgICAgICAgIGlmIGVuZFRhZzoKICAgICAgICAgICAgICAgIGRhdGEucHJldmlvdXMoKQogICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVPdGhlcigpCiAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgICAgIGMgPSBkYXRhLnNraXBVbnRpbChzcGFjZXNBbmdsZUJyYWNrZXRzKQogICAgICAgIGlmIGMgPT0gYiI8IjoKICAgICAgICAgICAgIyByZXR1cm4gdG8gdGhlIGZpcnN0IHN0ZXAgaW4gdGhlIG92ZXJhbGwgInR3byBzdGVwIiBhbGdvcml0aG0KICAgICAgICAgICAgIyByZXByb2Nlc3NpbmcgdGhlIDwgYnl0ZQogICAgICAgICAgICBkYXRhLnByZXZpb3VzKCkKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIFJlYWQgYWxsIGF0dHJpYnV0ZXMKICAgICAgICAgICAgYXR0ciA9IHNlbGYuZ2V0QXR0cmlidXRlKCkKICAgICAgICAgICAgd2hpbGUgYXR0ciBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIGF0dHIgPSBzZWxmLmdldEF0dHJpYnV0ZSgpCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgaGFuZGxlT3RoZXIoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuZGF0YS5qdW1wVG8oYiI+IikKCiAgICBkZWYgZ2V0QXR0cmlidXRlKHNlbGYpOgogICAgICAgICIiIlJldHVybiBhIG5hbWUsdmFsdWUgcGFpciBmb3IgdGhlIG5leHQgYXR0cmlidXRlIGluIHRoZSBzdHJlYW0sCiAgICAgICAgaWYgb25lIGlzIGZvdW5kLCBvciBOb25lIiIiCiAgICAgICAgZGF0YSA9IHNlbGYuZGF0YQogICAgICAgICMgU3RlcCAxIChza2lwIGNoYXJzKQogICAgICAgIGMgPSBkYXRhLnNraXAoc3BhY2VDaGFyYWN0ZXJzQnl0ZXMgfCBmcm96ZW5zZXQoW2IiLyJdKSkKICAgICAgICBhc3NlcnQgYyBpcyBOb25lIG9yIGxlbihjKSA9PSAxCiAgICAgICAgIyBTdGVwIDIKICAgICAgICBpZiBjIGluIChiIj4iLCBOb25lKToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICAjIFN0ZXAgMwogICAgICAgIGF0dHJOYW1lID0gW10KICAgICAgICBhdHRyVmFsdWUgPSBbXQogICAgICAgICMgU3RlcCA0IGF0dHJpYnV0ZSBuYW1lCiAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgaWYgYyA9PSBiIj0iIGFuZCBhdHRyTmFtZToKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGVsaWYgYyBpbiBzcGFjZUNoYXJhY3RlcnNCeXRlczoKICAgICAgICAgICAgICAgICMgU3RlcCA2IQogICAgICAgICAgICAgICAgYyA9IGRhdGEuc2tpcCgpCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBlbGlmIGMgaW4gKGIiLyIsIGIiPiIpOgogICAgICAgICAgICAgICAgcmV0dXJuIGIiIi5qb2luKGF0dHJOYW1lKSwgYiIiCiAgICAgICAgICAgIGVsaWYgYyBpbiBhc2NpaVVwcGVyY2FzZUJ5dGVzOgogICAgICAgICAgICAgICAgYXR0ck5hbWUuYXBwZW5kKGMubG93ZXIoKSkKICAgICAgICAgICAgZWxpZiBjIGlzIE5vbmU6CiAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgYXR0ck5hbWUuYXBwZW5kKGMpCiAgICAgICAgICAgICMgU3RlcCA1CiAgICAgICAgICAgIGMgPSBuZXh0KGRhdGEpCiAgICAgICAgIyBTdGVwIDcKICAgICAgICBpZiBjICE9IGIiPSI6CiAgICAgICAgICAgIGRhdGEucHJldmlvdXMoKQogICAgICAgICAgICByZXR1cm4gYiIiLmpvaW4oYXR0ck5hbWUpLCBiIiIKICAgICAgICAjIFN0ZXAgOAogICAgICAgIG5leHQoZGF0YSkKICAgICAgICAjIFN0ZXAgOQogICAgICAgIGMgPSBkYXRhLnNraXAoKQogICAgICAgICMgU3RlcCAxMAogICAgICAgIGlmIGMgaW4gKGIiJyIsIGInIicpOgogICAgICAgICAgICAjIDEwLjEKICAgICAgICAgICAgcXVvdGVDaGFyID0gYwogICAgICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICAgICAgIyAxMC4yCiAgICAgICAgICAgICAgICBjID0gbmV4dChkYXRhKQogICAgICAgICAgICAgICAgIyAxMC4zCiAgICAgICAgICAgICAgICBpZiBjID09IHF1b3RlQ2hhcjoKICAgICAgICAgICAgICAgICAgICBuZXh0KGRhdGEpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGIiIi5qb2luKGF0dHJOYW1lKSwgYiIiLmpvaW4oYXR0clZhbHVlKQogICAgICAgICAgICAgICAgIyAxMC40CiAgICAgICAgICAgICAgICBlbGlmIGMgaW4gYXNjaWlVcHBlcmNhc2VCeXRlczoKICAgICAgICAgICAgICAgICAgICBhdHRyVmFsdWUuYXBwZW5kKGMubG93ZXIoKSkKICAgICAgICAgICAgICAgICMgMTAuNQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBhdHRyVmFsdWUuYXBwZW5kKGMpCiAgICAgICAgZWxpZiBjID09IGIiPiI6CiAgICAgICAgICAgIHJldHVybiBiIiIuam9pbihhdHRyTmFtZSksIGIiIgogICAgICAgIGVsaWYgYyBpbiBhc2NpaVVwcGVyY2FzZUJ5dGVzOgogICAgICAgICAgICBhdHRyVmFsdWUuYXBwZW5kKGMubG93ZXIoKSkKICAgICAgICBlbGlmIGMgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICBlbHNlOgogICAgICAgICAgICBhdHRyVmFsdWUuYXBwZW5kKGMpCiAgICAgICAgIyBTdGVwIDExCiAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgYyA9IG5leHQoZGF0YSkKICAgICAgICAgICAgaWYgYyBpbiBzcGFjZXNBbmdsZUJyYWNrZXRzOgogICAgICAgICAgICAgICAgcmV0dXJuIGIiIi5qb2luKGF0dHJOYW1lKSwgYiIiLmpvaW4oYXR0clZhbHVlKQogICAgICAgICAgICBlbGlmIGMgaW4gYXNjaWlVcHBlcmNhc2VCeXRlczoKICAgICAgICAgICAgICAgIGF0dHJWYWx1ZS5hcHBlbmQoYy5sb3dlcigpKQogICAgICAgICAgICBlbGlmIGMgaXMgTm9uZToKICAgICAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBhdHRyVmFsdWUuYXBwZW5kKGMpCgoKY2xhc3MgQ29udGVudEF0dHJQYXJzZXIob2JqZWN0KToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkYXRhKToKICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShkYXRhLCBieXRlcykKICAgICAgICBzZWxmLmRhdGEgPSBkYXRhCgogICAgZGVmIHBhcnNlKHNlbGYpOgogICAgICAgIHRyeToKICAgICAgICAgICAgIyBDaGVjayBpZiB0aGUgYXR0ciBuYW1lIGlzIGNoYXJzZXQKICAgICAgICAgICAgIyBvdGhlcndpc2UgcmV0dXJuCiAgICAgICAgICAgIHNlbGYuZGF0YS5qdW1wVG8oYiJjaGFyc2V0IikKICAgICAgICAgICAgc2VsZi5kYXRhLnBvc2l0aW9uICs9IDEKICAgICAgICAgICAgc2VsZi5kYXRhLnNraXAoKQogICAgICAgICAgICBpZiBub3Qgc2VsZi5kYXRhLmN1cnJlbnRCeXRlID09IGIiPSI6CiAgICAgICAgICAgICAgICAjIElmIHRoZXJlIGlzIG5vID0gc2lnbiBrZWVwIGxvb2tpbmcgZm9yIGF0dHJzCiAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgICAgICBzZWxmLmRhdGEucG9zaXRpb24gKz0gMQogICAgICAgICAgICBzZWxmLmRhdGEuc2tpcCgpCiAgICAgICAgICAgICMgTG9vayBmb3IgYW4gZW5jb2RpbmcgYmV0d2VlbiBtYXRjaGluZyBxdW90ZSBtYXJrcwogICAgICAgICAgICBpZiBzZWxmLmRhdGEuY3VycmVudEJ5dGUgaW4gKGInIicsIGIiJyIpOgogICAgICAgICAgICAgICAgcXVvdGVNYXJrID0gc2VsZi5kYXRhLmN1cnJlbnRCeXRlCiAgICAgICAgICAgICAgICBzZWxmLmRhdGEucG9zaXRpb24gKz0gMQogICAgICAgICAgICAgICAgb2xkUG9zaXRpb24gPSBzZWxmLmRhdGEucG9zaXRpb24KICAgICAgICAgICAgICAgIGlmIHNlbGYuZGF0YS5qdW1wVG8ocXVvdGVNYXJrKToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5kYXRhW29sZFBvc2l0aW9uOnNlbGYuZGF0YS5wb3NpdGlvbl0KICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgVW5xdW90ZWQgdmFsdWUKICAgICAgICAgICAgICAgIG9sZFBvc2l0aW9uID0gc2VsZi5kYXRhLnBvc2l0aW9uCiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5kYXRhLnNraXBVbnRpbChzcGFjZUNoYXJhY3RlcnNCeXRlcykKICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5kYXRhW29sZFBvc2l0aW9uOnNlbGYuZGF0YS5wb3NpdGlvbl0KICAgICAgICAgICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uOgogICAgICAgICAgICAgICAgICAgICMgUmV0dXJuIHRoZSB3aG9sZSByZW1haW5pbmcgdmFsdWUKICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5kYXRhW29sZFBvc2l0aW9uOl0KICAgICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCgpkZWYgbG9va3VwRW5jb2RpbmcoZW5jb2RpbmcpOgogICAgIiIiUmV0dXJuIHRoZSBweXRob24gY29kZWMgbmFtZSBjb3JyZXNwb25kaW5nIHRvIGFuIGVuY29kaW5nIG9yIE5vbmUgaWYgdGhlCiAgICBzdHJpbmcgZG9lc24ndCBjb3JyZXNwb25kIHRvIGEgdmFsaWQgZW5jb2RpbmcuIiIiCiAgICBpZiBpc2luc3RhbmNlKGVuY29kaW5nLCBiaW5hcnlfdHlwZSk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBlbmNvZGluZyA9IGVuY29kaW5nLmRlY29kZSgiYXNjaWkiKQogICAgICAgIGV4Y2VwdCBVbmljb2RlRGVjb2RlRXJyb3I6CiAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgaWYgZW5jb2RpbmcgaXMgbm90IE5vbmU6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gd2ViZW5jb2RpbmdzLmxvb2t1cChlbmNvZGluZykKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICBlbHNlOgogICAgICAgIHJldHVybiBOb25lClBLAwQUAAAAAAAAACEAxEZqFiQrAQAkKwEAPwAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvX3Rva2VuaXplci5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgdW5pY29kZV9saXRlcmFscwoKZnJvbSBwaXAuX3ZlbmRvci5zaXggaW1wb3J0IHVuaWNociBhcyBjaHIKCmZyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlcXVlCgpmcm9tIC5jb25zdGFudHMgaW1wb3J0IHNwYWNlQ2hhcmFjdGVycwpmcm9tIC5jb25zdGFudHMgaW1wb3J0IGVudGl0aWVzCmZyb20gLmNvbnN0YW50cyBpbXBvcnQgYXNjaWlMZXR0ZXJzLCBhc2NpaVVwcGVyMkxvd2VyCmZyb20gLmNvbnN0YW50cyBpbXBvcnQgZGlnaXRzLCBoZXhEaWdpdHMsIEVPRgpmcm9tIC5jb25zdGFudHMgaW1wb3J0IHRva2VuVHlwZXMsIHRhZ1Rva2VuVHlwZXMKZnJvbSAuY29uc3RhbnRzIGltcG9ydCByZXBsYWNlbWVudENoYXJhY3RlcnMKCmZyb20gLl9pbnB1dHN0cmVhbSBpbXBvcnQgSFRNTElucHV0U3RyZWFtCgpmcm9tIC5fdHJpZSBpbXBvcnQgVHJpZQoKZW50aXRpZXNUcmllID0gVHJpZShlbnRpdGllcykKCgpjbGFzcyBIVE1MVG9rZW5pemVyKG9iamVjdCk6CiAgICAiIiIgVGhpcyBjbGFzcyB0YWtlcyBjYXJlIG9mIHRva2VuaXppbmcgSFRNTC4KCiAgICAqIHNlbGYuY3VycmVudFRva2VuCiAgICAgIEhvbGRzIHRoZSB0b2tlbiB0aGF0IGlzIGN1cnJlbnRseSBiZWluZyBwcm9jZXNzZWQuCgogICAgKiBzZWxmLnN0YXRlCiAgICAgIEhvbGRzIGEgcmVmZXJlbmNlIHRvIHRoZSBtZXRob2QgdG8gYmUgaW52b2tlZC4uLiBYWFgKCiAgICAqIHNlbGYuc3RyZWFtCiAgICAgIFBvaW50cyB0byBIVE1MSW5wdXRTdHJlYW0gb2JqZWN0LgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSwgcGFyc2VyPU5vbmUsICoqa3dhcmdzKToKCiAgICAgICAgc2VsZi5zdHJlYW0gPSBIVE1MSW5wdXRTdHJlYW0oc3RyZWFtLCAqKmt3YXJncykKICAgICAgICBzZWxmLnBhcnNlciA9IHBhcnNlcgoKICAgICAgICAjIFNldHVwIHRoZSBpbml0aWFsIHRva2VuaXplciBzdGF0ZQogICAgICAgIHNlbGYuZXNjYXBlRmxhZyA9IEZhbHNlCiAgICAgICAgc2VsZi5sYXN0Rm91ckNoYXJzID0gW10KICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBzZWxmLmVzY2FwZSA9IEZhbHNlCgogICAgICAgICMgVGhlIGN1cnJlbnQgdG9rZW4gYmVpbmcgY3JlYXRlZAogICAgICAgIHNlbGYuY3VycmVudFRva2VuID0gTm9uZQogICAgICAgIHN1cGVyKEhUTUxUb2tlbml6ZXIsIHNlbGYpLl9faW5pdF9fKCkKCiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgIiIiIFRoaXMgaXMgd2hlcmUgdGhlIG1hZ2ljIGhhcHBlbnMuCgogICAgICAgIFdlIGRvIG91ciB1c3VhbGx5IHByb2Nlc3NpbmcgdGhyb3VnaCB0aGUgc3RhdGVzIGFuZCB3aGVuIHdlIGhhdmUgYSB0b2tlbgogICAgICAgIHRvIHJldHVybiB3ZSB5aWVsZCB0aGUgdG9rZW4gd2hpY2ggcGF1c2VzIHByb2Nlc3NpbmcgdW50aWwgdGhlIG5leHQgdG9rZW4KICAgICAgICBpcyByZXF1ZXN0ZWQuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi50b2tlblF1ZXVlID0gZGVxdWUoW10pCiAgICAgICAgIyBTdGFydCBwcm9jZXNzaW5nLiBXaGVuIEVPRiBpcyByZWFjaGVkIHNlbGYuc3RhdGUgd2lsbCByZXR1cm4gRmFsc2UKICAgICAgICAjIGluc3RlYWQgb2YgVHJ1ZSBhbmQgdGhlIGxvb3Agd2lsbCB0ZXJtaW5hdGUuCiAgICAgICAgd2hpbGUgc2VsZi5zdGF0ZSgpOgogICAgICAgICAgICB3aGlsZSBzZWxmLnN0cmVhbS5lcnJvcnM6CiAgICAgICAgICAgICAgICB5aWVsZCB7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjogc2VsZi5zdHJlYW0uZXJyb3JzLnBvcCgwKX0KICAgICAgICAgICAgd2hpbGUgc2VsZi50b2tlblF1ZXVlOgogICAgICAgICAgICAgICAgeWllbGQgc2VsZi50b2tlblF1ZXVlLnBvcGxlZnQoKQoKICAgIGRlZiBjb25zdW1lTnVtYmVyRW50aXR5KHNlbGYsIGlzSGV4KToKICAgICAgICAiIiJUaGlzIGZ1bmN0aW9uIHJldHVybnMgZWl0aGVyIFUrRkZGRCBvciB0aGUgY2hhcmFjdGVyIGJhc2VkIG9uIHRoZQogICAgICAgIGRlY2ltYWwgb3IgaGV4YWRlY2ltYWwgcmVwcmVzZW50YXRpb24uIEl0IGFsc28gZGlzY2FyZHMgIjsiIGlmIHByZXNlbnQuCiAgICAgICAgSWYgbm90IHByZXNlbnQgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl19KSBpcyBpbnZva2VkLgogICAgICAgICIiIgoKICAgICAgICBhbGxvd2VkID0gZGlnaXRzCiAgICAgICAgcmFkaXggPSAxMAogICAgICAgIGlmIGlzSGV4OgogICAgICAgICAgICBhbGxvd2VkID0gaGV4RGlnaXRzCiAgICAgICAgICAgIHJhZGl4ID0gMTYKCiAgICAgICAgY2hhclN0YWNrID0gW10KCiAgICAgICAgIyBDb25zdW1lIGFsbCB0aGUgY2hhcmFjdGVycyB0aGF0IGFyZSBpbiByYW5nZSB3aGlsZSBtYWtpbmcgc3VyZSB3ZQogICAgICAgICMgZG9uJ3QgaGl0IGFuIEVPRi4KICAgICAgICBjID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgd2hpbGUgYyBpbiBhbGxvd2VkIGFuZCBjIGlzIG5vdCBFT0Y6CiAgICAgICAgICAgIGNoYXJTdGFjay5hcHBlbmQoYykKICAgICAgICAgICAgYyA9IHNlbGYuc3RyZWFtLmNoYXIoKQoKICAgICAgICAjIENvbnZlcnQgdGhlIHNldCBvZiBjaGFyYWN0ZXJzIGNvbnN1bWVkIHRvIGFuIGludC4KICAgICAgICBjaGFyQXNJbnQgPSBpbnQoIiIuam9pbihjaGFyU3RhY2spLCByYWRpeCkKCiAgICAgICAgIyBDZXJ0YWluIGNoYXJhY3RlcnMgZ2V0IHJlcGxhY2VkIHdpdGggb3RoZXJzCiAgICAgICAgaWYgY2hhckFzSW50IGluIHJlcGxhY2VtZW50Q2hhcmFjdGVyczoKICAgICAgICAgICAgY2hhciA9IHJlcGxhY2VtZW50Q2hhcmFjdGVyc1tjaGFyQXNJbnRdCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbGxlZ2FsLWNvZGVwb2ludC1mb3ItbnVtZXJpYy1lbnRpdHkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YXZhcnMiOiB7ImNoYXJBc0ludCI6IGNoYXJBc0ludH19KQogICAgICAgIGVsaWYgKCgweEQ4MDAgPD0gY2hhckFzSW50IDw9IDB4REZGRikgb3IKICAgICAgICAgICAgICAoY2hhckFzSW50ID4gMHgxMEZGRkYpKToKICAgICAgICAgICAgY2hhciA9ICJcdUZGRkQiCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbGxlZ2FsLWNvZGVwb2ludC1mb3ItbnVtZXJpYy1lbnRpdHkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YXZhcnMiOiB7ImNoYXJBc0ludCI6IGNoYXJBc0ludH19KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgU2hvdWxkIHNwZWVkIHVwIHRoaXMgY2hlY2sgc29tZWhvdyAoZS5nLiBtb3ZlIHRoZSBzZXQgdG8gYSBjb25zdGFudCkKICAgICAgICAgICAgaWYgKCgweDAwMDEgPD0gY2hhckFzSW50IDw9IDB4MDAwOCkgb3IKICAgICAgICAgICAgICAgICgweDAwMEUgPD0gY2hhckFzSW50IDw9IDB4MDAxRikgb3IKICAgICAgICAgICAgICAgICgweDAwN0YgPD0gY2hhckFzSW50IDw9IDB4MDA5Rikgb3IKICAgICAgICAgICAgICAgICgweEZERDAgPD0gY2hhckFzSW50IDw9IDB4RkRFRikgb3IKICAgICAgICAgICAgICAgIGNoYXJBc0ludCBpbiBmcm96ZW5zZXQoWzB4MDAwQiwgMHhGRkZFLCAweEZGRkYsIDB4MUZGRkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFGRkZGLCAweDJGRkZFLCAweDJGRkZGLCAweDNGRkZFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzRkZGRiwgMHg0RkZGRSwgMHg0RkZGRiwgMHg1RkZGRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NUZGRkYsIDB4NkZGRkUsIDB4NkZGRkYsIDB4N0ZGRkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDdGRkZGLCAweDhGRkZFLCAweDhGRkZGLCAweDlGRkZFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg5RkZGRiwgMHhBRkZGRSwgMHhBRkZGRiwgMHhCRkZGRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4QkZGRkYsIDB4Q0ZGRkUsIDB4Q0ZGRkYsIDB4REZGRkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERGRkZGLCAweEVGRkZFLCAweEVGRkZGLCAweEZGRkZFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGRiwgMHgxMEZGRkUsIDB4MTBGRkZGXSkpOgogICAgICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWxsZWdhbC1jb2RlcG9pbnQtZm9yLW51bWVyaWMtZW50aXR5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhdmFycyI6IHsiY2hhckFzSW50IjogY2hhckFzSW50fX0pCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICMgVHJ5L2V4Y2VwdCBuZWVkZWQgYXMgVUNTLTIgUHl0aG9uIGJ1aWxkcycgdW5pY2hhciBvbmx5IHdvcmtzCiAgICAgICAgICAgICAgICAjIHdpdGhpbiB0aGUgQk1QLgogICAgICAgICAgICAgICAgY2hhciA9IGNocihjaGFyQXNJbnQpCiAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgICAgdiA9IGNoYXJBc0ludCAtIDB4MTAwMDAKICAgICAgICAgICAgICAgIGNoYXIgPSBjaHIoMHhEODAwIHwgKHYgPj4gMTApKSArIGNocigweERDMDAgfCAodiAmIDB4M0ZGKSkKCiAgICAgICAgIyBEaXNjYXJkIHRoZSA7IGlmIHByZXNlbnQuIE90aGVyd2lzZSwgcHV0IGl0IGJhY2sgb24gdGhlIHF1ZXVlIGFuZAogICAgICAgICMgaW52b2tlIHBhcnNlRXJyb3Igb24gcGFyc2VyLgogICAgICAgIGlmIGMgIT0gIjsiOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibnVtZXJpYy1lbnRpdHktd2l0aG91dC1zZW1pY29sb24ifSkKICAgICAgICAgICAgc2VsZi5zdHJlYW0udW5nZXQoYykKCiAgICAgICAgcmV0dXJuIGNoYXIKCiAgICBkZWYgY29uc3VtZUVudGl0eShzZWxmLCBhbGxvd2VkQ2hhcj1Ob25lLCBmcm9tQXR0cmlidXRlPUZhbHNlKToKICAgICAgICAjIEluaXRpYWxpc2UgdG8gdGhlIGRlZmF1bHQgb3V0cHV0IGZvciB3aGVuIG5vIGVudGl0eSBpcyBtYXRjaGVkCiAgICAgICAgb3V0cHV0ID0gIiYiCgogICAgICAgIGNoYXJTdGFjayA9IFtzZWxmLnN0cmVhbS5jaGFyKCldCiAgICAgICAgaWYgKGNoYXJTdGFja1swXSBpbiBzcGFjZUNoYXJhY3RlcnMgb3IgY2hhclN0YWNrWzBdIGluIChFT0YsICI8IiwgIiYiKSBvcgogICAgICAgICAgICAgICAgKGFsbG93ZWRDaGFyIGlzIG5vdCBOb25lIGFuZCBhbGxvd2VkQ2hhciA9PSBjaGFyU3RhY2tbMF0pKToKICAgICAgICAgICAgc2VsZi5zdHJlYW0udW5nZXQoY2hhclN0YWNrWzBdKQoKICAgICAgICBlbGlmIGNoYXJTdGFja1swXSA9PSAiIyI6CiAgICAgICAgICAgICMgUmVhZCB0aGUgbmV4dCBjaGFyYWN0ZXIgdG8gc2VlIGlmIGl0J3MgaGV4IG9yIGRlY2ltYWwKICAgICAgICAgICAgaGV4ID0gRmFsc2UKICAgICAgICAgICAgY2hhclN0YWNrLmFwcGVuZChzZWxmLnN0cmVhbS5jaGFyKCkpCiAgICAgICAgICAgIGlmIGNoYXJTdGFja1stMV0gaW4gKCJ4IiwgIlgiKToKICAgICAgICAgICAgICAgIGhleCA9IFRydWUKICAgICAgICAgICAgICAgIGNoYXJTdGFjay5hcHBlbmQoc2VsZi5zdHJlYW0uY2hhcigpKQoKICAgICAgICAgICAgIyBjaGFyU3RhY2tbLTFdIHNob3VsZCBiZSB0aGUgZmlyc3QgZGlnaXQKICAgICAgICAgICAgaWYgKGhleCBhbmQgY2hhclN0YWNrWy0xXSBpbiBoZXhEaWdpdHMpIFwKICAgICAgICAgICAgICAgICAgICBvciAobm90IGhleCBhbmQgY2hhclN0YWNrWy0xXSBpbiBkaWdpdHMpOgogICAgICAgICAgICAgICAgIyBBdCBsZWFzdCBvbmUgZGlnaXQgZm91bmQsIHNvIGNvbnN1bWUgdGhlIHdob2xlIG51bWJlcgogICAgICAgICAgICAgICAgc2VsZi5zdHJlYW0udW5nZXQoY2hhclN0YWNrWy0xXSkKICAgICAgICAgICAgICAgIG91dHB1dCA9IHNlbGYuY29uc3VtZU51bWJlckVudGl0eShoZXgpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIE5vIGRpZ2l0cyBmb3VuZAogICAgICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJleHBlY3RlZC1udW1lcmljLWVudGl0eSJ9KQogICAgICAgICAgICAgICAgc2VsZi5zdHJlYW0udW5nZXQoY2hhclN0YWNrLnBvcCgpKQogICAgICAgICAgICAgICAgb3V0cHV0ID0gIiYiICsgIiIuam9pbihjaGFyU3RhY2spCgogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgQXQgdGhpcyBwb2ludCBpbiB0aGUgcHJvY2VzcyBtaWdodCBoYXZlIG5hbWVkIGVudGl0eS4gRW50aXRpZXMKICAgICAgICAgICAgIyBhcmUgc3RvcmVkIGluIHRoZSBnbG9iYWwgdmFyaWFibGUgImVudGl0aWVzIi4KICAgICAgICAgICAgIwogICAgICAgICAgICAjIENvbnN1bWUgY2hhcmFjdGVycyBhbmQgY29tcGFyZSB0byB0aGVzZSB0byBhIHN1YnN0cmluZyBvZiB0aGUKICAgICAgICAgICAgIyBlbnRpdHkgbmFtZXMgaW4gdGhlIGxpc3QgdW50aWwgdGhlIHN1YnN0cmluZyBubyBsb25nZXIgbWF0Y2hlcy4KICAgICAgICAgICAgd2hpbGUgKGNoYXJTdGFja1stMV0gaXMgbm90IEVPRik6CiAgICAgICAgICAgICAgICBpZiBub3QgZW50aXRpZXNUcmllLmhhc19rZXlzX3dpdGhfcHJlZml4KCIiLmpvaW4oY2hhclN0YWNrKSk6CiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgIGNoYXJTdGFjay5hcHBlbmQoc2VsZi5zdHJlYW0uY2hhcigpKQoKICAgICAgICAgICAgIyBBdCB0aGlzIHBvaW50IHdlIGhhdmUgYSBzdHJpbmcgdGhhdCBzdGFydHMgd2l0aCBzb21lIGNoYXJhY3RlcnMKICAgICAgICAgICAgIyB0aGF0IG1heSBtYXRjaCBhbiBlbnRpdHkKICAgICAgICAgICAgIyBUcnkgdG8gZmluZCB0aGUgbG9uZ2VzdCBlbnRpdHkgdGhlIHN0cmluZyB3aWxsIG1hdGNoIHRvIHRha2UgY2FyZQogICAgICAgICAgICAjIG9mICZub3RpIGZvciBpbnN0YW5jZS4KICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgZW50aXR5TmFtZSA9IGVudGl0aWVzVHJpZS5sb25nZXN0X3ByZWZpeCgiIi5qb2luKGNoYXJTdGFja1s6LTFdKSkKICAgICAgICAgICAgICAgIGVudGl0eUxlbmd0aCA9IGxlbihlbnRpdHlOYW1lKQogICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgICAgICBlbnRpdHlOYW1lID0gTm9uZQoKICAgICAgICAgICAgaWYgZW50aXR5TmFtZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIGlmIGVudGl0eU5hbWVbLTFdICE9ICI7IjoKICAgICAgICAgICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lZC1lbnRpdHktd2l0aG91dC1zZW1pY29sb24ifSkKICAgICAgICAgICAgICAgIGlmIChlbnRpdHlOYW1lWy0xXSAhPSAiOyIgYW5kIGZyb21BdHRyaWJ1dGUgYW5kCiAgICAgICAgICAgICAgICAgICAgKGNoYXJTdGFja1tlbnRpdHlMZW5ndGhdIGluIGFzY2lpTGV0dGVycyBvcgogICAgICAgICAgICAgICAgICAgICBjaGFyU3RhY2tbZW50aXR5TGVuZ3RoXSBpbiBkaWdpdHMgb3IKICAgICAgICAgICAgICAgICAgICAgY2hhclN0YWNrW2VudGl0eUxlbmd0aF0gPT0gIj0iKSk6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5zdHJlYW0udW5nZXQoY2hhclN0YWNrLnBvcCgpKQogICAgICAgICAgICAgICAgICAgIG91dHB1dCA9ICImIiArICIiLmpvaW4oY2hhclN0YWNrKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSBlbnRpdGllc1tlbnRpdHlOYW1lXQogICAgICAgICAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGNoYXJTdGFjay5wb3AoKSkKICAgICAgICAgICAgICAgICAgICBvdXRwdXQgKz0gIiIuam9pbihjaGFyU3RhY2tbZW50aXR5TGVuZ3RoOl0pCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkLW5hbWVkLWVudGl0eSJ9KQogICAgICAgICAgICAgICAgc2VsZi5zdHJlYW0udW5nZXQoY2hhclN0YWNrLnBvcCgpKQogICAgICAgICAgICAgICAgb3V0cHV0ID0gIiYiICsgIiIuam9pbihjaGFyU3RhY2spCgogICAgICAgIGlmIGZyb21BdHRyaWJ1dGU6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJkYXRhIl1bLTFdWzFdICs9IG91dHB1dAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlmIG91dHB1dCBpbiBzcGFjZUNoYXJhY3RlcnM6CiAgICAgICAgICAgICAgICB0b2tlblR5cGUgPSAiU3BhY2VDaGFyYWN0ZXJzIgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgdG9rZW5UeXBlID0gIkNoYXJhY3RlcnMiCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1t0b2tlblR5cGVdLCAiZGF0YSI6IG91dHB1dH0pCgogICAgZGVmIHByb2Nlc3NFbnRpdHlJbkF0dHJpYnV0ZShzZWxmLCBhbGxvd2VkQ2hhcik6CiAgICAgICAgIiIiVGhpcyBtZXRob2QgcmVwbGFjZXMgdGhlIG5lZWQgZm9yICJlbnRpdHlJbkF0dHJpYnV0ZVZhbHVlU3RhdGUiLgogICAgICAgICIiIgogICAgICAgIHNlbGYuY29uc3VtZUVudGl0eShhbGxvd2VkQ2hhcj1hbGxvd2VkQ2hhciwgZnJvbUF0dHJpYnV0ZT1UcnVlKQoKICAgIGRlZiBlbWl0Q3VycmVudFRva2VuKHNlbGYpOgogICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGEgZ2VuZXJpYyBoYW5kbGVyIGZvciBlbWl0dGluZyB0aGUgdGFncy4gSXQgYWxzbyBzZXRzCiAgICAgICAgdGhlIHN0YXRlIHRvICJkYXRhIiBiZWNhdXNlIHRoYXQncyB3aGF0J3MgbmVlZGVkIGFmdGVyIGEgdG9rZW4gaGFzIGJlZW4KICAgICAgICBlbWl0dGVkLgogICAgICAgICIiIgogICAgICAgIHRva2VuID0gc2VsZi5jdXJyZW50VG9rZW4KICAgICAgICAjIEFkZCB0b2tlbiB0byB0aGUgcXVldWUgdG8gYmUgeWllbGRlZAogICAgICAgIGlmICh0b2tlblsidHlwZSJdIGluIHRhZ1Rva2VuVHlwZXMpOgogICAgICAgICAgICB0b2tlblsibmFtZSJdID0gdG9rZW5bIm5hbWUiXS50cmFuc2xhdGUoYXNjaWlVcHBlcjJMb3dlcikKICAgICAgICAgICAgaWYgdG9rZW5bInR5cGUiXSA9PSB0b2tlblR5cGVzWyJFbmRUYWciXToKICAgICAgICAgICAgICAgIGlmIHRva2VuWyJkYXRhIl06CiAgICAgICAgICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiYXR0cmlidXRlcy1pbi1lbmQtdGFnIn0pCiAgICAgICAgICAgICAgICBpZiB0b2tlblsic2VsZkNsb3NpbmciXToKICAgICAgICAgICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJzZWxmLWNsb3NpbmctZmxhZy1vbi1lbmQtdGFnIn0pCiAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh0b2tlbikKICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKCiAgICAjIEJlbG93IGFyZSB0aGUgdmFyaW91cyB0b2tlbml6ZXIgc3RhdGVzIHdvcmtlZCBvdXQuCiAgICBkZWYgZGF0YVN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhID09ICImIjoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZW50aXR5RGF0YVN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICI8IjoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYudGFnT3BlblN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICJcdTAwMDAiOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiaW52YWxpZC1jb2RlcG9pbnQifSkKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogIlx1MDAwMCJ9KQogICAgICAgIGVsaWYgZGF0YSBpcyBFT0Y6CiAgICAgICAgICAgICMgVG9rZW5pemF0aW9uIGVuZHMuCiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIGVsaWYgZGF0YSBpbiBzcGFjZUNoYXJhY3RlcnM6CiAgICAgICAgICAgICMgRGlyZWN0bHkgYWZ0ZXIgZW1pdHRpbmcgYSB0b2tlbiB5b3Ugc3dpdGNoIGJhY2sgdG8gdGhlICJkYXRhCiAgICAgICAgICAgICMgc3RhdGUiLiBBdCB0aGF0IHBvaW50IHNwYWNlQ2hhcmFjdGVycyBhcmUgaW1wb3J0YW50IHNvIHRoZXkgYXJlCiAgICAgICAgICAgICMgZW1pdHRlZCBzZXBhcmF0ZWx5LgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlNwYWNlQ2hhcmFjdGVycyJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgKyBzZWxmLnN0cmVhbS5jaGFyc1VudGlsKHNwYWNlQ2hhcmFjdGVycywgVHJ1ZSl9KQogICAgICAgICAgICAjIE5vIG5lZWQgdG8gdXBkYXRlIGxhc3RGb3VyQ2hhcnMgaGVyZSwgc2luY2UgdGhlIGZpcnN0IHNwYWNlIHdpbGwKICAgICAgICAgICAgIyBoYXZlIGFscmVhZHkgYmVlbiBhcHBlbmRlZCB0byBsYXN0Rm91ckNoYXJzIGFuZCB3aWxsIGhhdmUgYnJva2VuCiAgICAgICAgICAgICMgYW55IDwhLS0gb3IgLS0+IHNlcXVlbmNlcwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGNoYXJzID0gc2VsZi5zdHJlYW0uY2hhcnNVbnRpbCgoIiYiLCAiPCIsICJcdTAwMDAiKSkKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSArIGNoYXJzfSkKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBlbnRpdHlEYXRhU3RhdGUoc2VsZik6CiAgICAgICAgc2VsZi5jb25zdW1lRW50aXR5KCkKICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiByY2RhdGFTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSA9PSAiJiI6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmNoYXJhY3RlclJlZmVyZW5jZUluUmNkYXRhCiAgICAgICAgZWxpZiBkYXRhID09ICI8IjoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYucmNkYXRhTGVzc1RoYW5TaWduU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gRU9GOgogICAgICAgICAgICAjIFRva2VuaXphdGlvbiBlbmRzLgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICBlbGlmIGRhdGEgPT0gIlx1MDAwMCI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJpbnZhbGlkLWNvZGVwb2ludCJ9KQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiXHVGRkZEIn0pCiAgICAgICAgZWxpZiBkYXRhIGluIHNwYWNlQ2hhcmFjdGVyczoKICAgICAgICAgICAgIyBEaXJlY3RseSBhZnRlciBlbWl0dGluZyBhIHRva2VuIHlvdSBzd2l0Y2ggYmFjayB0byB0aGUgImRhdGEKICAgICAgICAgICAgIyBzdGF0ZSIuIEF0IHRoYXQgcG9pbnQgc3BhY2VDaGFyYWN0ZXJzIGFyZSBpbXBvcnRhbnQgc28gdGhleSBhcmUKICAgICAgICAgICAgIyBlbWl0dGVkIHNlcGFyYXRlbHkuCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siU3BhY2VDaGFyYWN0ZXJzIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSArIHNlbGYuc3RyZWFtLmNoYXJzVW50aWwoc3BhY2VDaGFyYWN0ZXJzLCBUcnVlKX0pCiAgICAgICAgICAgICMgTm8gbmVlZCB0byB1cGRhdGUgbGFzdEZvdXJDaGFycyBoZXJlLCBzaW5jZSB0aGUgZmlyc3Qgc3BhY2Ugd2lsbAogICAgICAgICAgICAjIGhhdmUgYWxyZWFkeSBiZWVuIGFwcGVuZGVkIHRvIGxhc3RGb3VyQ2hhcnMgYW5kIHdpbGwgaGF2ZSBicm9rZW4KICAgICAgICAgICAgIyBhbnkgPCEtLSBvciAtLT4gc2VxdWVuY2VzCiAgICAgICAgZWxzZToKICAgICAgICAgICAgY2hhcnMgPSBzZWxmLnN0cmVhbS5jaGFyc1VudGlsKCgiJiIsICI8IiwgIlx1MDAwMCIpKQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhICsgY2hhcnN9KQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGNoYXJhY3RlclJlZmVyZW5jZUluUmNkYXRhKHNlbGYpOgogICAgICAgIHNlbGYuY29uc3VtZUVudGl0eSgpCiAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYucmNkYXRhU3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiByYXd0ZXh0U3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgPT0gIjwiOgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5yYXd0ZXh0TGVzc1RoYW5TaWduU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIlx1MDAwMCI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJpbnZhbGlkLWNvZGVwb2ludCJ9KQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiXHVGRkZEIn0pCiAgICAgICAgZWxpZiBkYXRhID09IEVPRjoKICAgICAgICAgICAgIyBUb2tlbml6YXRpb24gZW5kcy4KICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgY2hhcnMgPSBzZWxmLnN0cmVhbS5jaGFyc1VudGlsKCgiPCIsICJcdTAwMDAiKSkKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSArIGNoYXJzfSkKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBzY3JpcHREYXRhU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgPT0gIjwiOgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zY3JpcHREYXRhTGVzc1RoYW5TaWduU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIlx1MDAwMCI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJpbnZhbGlkLWNvZGVwb2ludCJ9KQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiXHVGRkZEIn0pCiAgICAgICAgZWxpZiBkYXRhID09IEVPRjoKICAgICAgICAgICAgIyBUb2tlbml6YXRpb24gZW5kcy4KICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgY2hhcnMgPSBzZWxmLnN0cmVhbS5jaGFyc1VudGlsKCgiPCIsICJcdTAwMDAiKSkKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSArIGNoYXJzfSkKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBwbGFpbnRleHRTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSA9PSBFT0Y6CiAgICAgICAgICAgICMgVG9rZW5pemF0aW9uIGVuZHMuCiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIGVsaWYgZGF0YSA9PSAiXHUwMDAwIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogImludmFsaWQtY29kZXBvaW50In0pCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJcdUZGRkQifSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhICsgc2VsZi5zdHJlYW0uY2hhcnNVbnRpbCgiXHUwMDAwIil9KQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIHRhZ09wZW5TdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSA9PSAiISI6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLm1hcmt1cERlY2xhcmF0aW9uT3BlblN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICIvIjoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuY2xvc2VUYWdPcGVuU3RhdGUKICAgICAgICBlbGlmIGRhdGEgaW4gYXNjaWlMZXR0ZXJzOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlbiA9IHsidHlwZSI6IHRva2VuVHlwZXNbIlN0YXJ0VGFnIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogZGF0YSwgImRhdGEiOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlbGZDbG9zaW5nIjogRmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZWxmQ2xvc2luZ0Fja25vd2xlZGdlZCI6IEZhbHNlfQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi50YWdOYW1lU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIj4iOgogICAgICAgICAgICAjIFhYWCBJbiB0aGVvcnkgaXQgY291bGQgYmUgc29tZXRoaW5nIGJlc2lkZXMgYSB0YWcgbmFtZS4gQnV0CiAgICAgICAgICAgICMgZG8gd2UgcmVhbGx5IGNhcmU/CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZC10YWctbmFtZS1idXQtZ290LXJpZ2h0LWJyYWNrZXQifSkKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjogIjw+In0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiPyI6CiAgICAgICAgICAgICMgWFhYIEluIHRoZW9yeSBpdCBjb3VsZCBiZSBzb21ldGhpbmcgYmVzaWRlcyBhIHRhZyBuYW1lLiBCdXQKICAgICAgICAgICAgIyBkbyB3ZSByZWFsbHkgY2FyZT8KICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkLXRhZy1uYW1lLWJ1dC1nb3QtcXVlc3Rpb24tbWFyayJ9KQogICAgICAgICAgICBzZWxmLnN0cmVhbS51bmdldChkYXRhKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5ib2d1c0NvbW1lbnRTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgWFhYCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZC10YWctbmFtZSJ9KQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOiAiPCJ9KQogICAgICAgICAgICBzZWxmLnN0cmVhbS51bmdldChkYXRhKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBjbG9zZVRhZ09wZW5TdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSBpbiBhc2NpaUxldHRlcnM6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuID0geyJ0eXBlIjogdG9rZW5UeXBlc1siRW5kVGFnIl0sICJuYW1lIjogZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiBbXSwgInNlbGZDbG9zaW5nIjogRmFsc2V9CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnRhZ05hbWVTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiPiI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZC1jbG9zaW5nLXRhZy1idXQtZ290LXJpZ2h0LWJyYWNrZXQifSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxpZiBkYXRhIGlzIEVPRjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkLWNsb3NpbmctdGFnLWJ1dC1nb3QtZW9mIn0pCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6ICI8LyJ9KQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIFhYWCBkYXRhIGNhbiBiZSBfJ18uLi4KICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkLWNsb3NpbmctdGFnLWJ1dC1nb3QtY2hhciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhdmFycyI6IHsiZGF0YSI6IGRhdGF9fSkKICAgICAgICAgICAgc2VsZi5zdHJlYW0udW5nZXQoZGF0YSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYm9ndXNDb21tZW50U3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiB0YWdOYW1lU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgaW4gc3BhY2VDaGFyYWN0ZXJzOgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5iZWZvcmVBdHRyaWJ1dGVOYW1lU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIj4iOgogICAgICAgICAgICBzZWxmLmVtaXRDdXJyZW50VG9rZW4oKQogICAgICAgIGVsaWYgZGF0YSBpcyBFT0Y6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlb2YtaW4tdGFnLW5hbWUifSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICIvIjoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2VsZkNsb3NpbmdTdGFydFRhZ1N0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICJcdTAwMDAiOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiaW52YWxpZC1jb2RlcG9pbnQifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bIm5hbWUiXSArPSAiXHVGRkZEIgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJuYW1lIl0gKz0gZGF0YQogICAgICAgICAgICAjIChEb24ndCB1c2UgY2hhcnNVbnRpbCBoZXJlLCBiZWNhdXNlIHRhZyBuYW1lcyBhcmUKICAgICAgICAgICAgIyB2ZXJ5IHNob3J0IGFuZCBpdCdzIGZhc3RlciB0byBub3QgZG8gYW55dGhpbmcgZmFuY3kpCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgcmNkYXRhTGVzc1RoYW5TaWduU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgPT0gIi8iOgogICAgICAgICAgICBzZWxmLnRlbXBvcmFyeUJ1ZmZlciA9ICIiCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnJjZGF0YUVuZFRhZ09wZW5TdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6ICI8In0pCiAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGRhdGEpCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnJjZGF0YVN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgcmNkYXRhRW5kVGFnT3BlblN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhIGluIGFzY2lpTGV0dGVyczoKICAgICAgICAgICAgc2VsZi50ZW1wb3JhcnlCdWZmZXIgKz0gZGF0YQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5yY2RhdGFFbmRUYWdOYW1lU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOiAiPC8ifSkKICAgICAgICAgICAgc2VsZi5zdHJlYW0udW5nZXQoZGF0YSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYucmNkYXRhU3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiByY2RhdGFFbmRUYWdOYW1lU3RhdGUoc2VsZik6CiAgICAgICAgYXBwcm9wcmlhdGUgPSBzZWxmLmN1cnJlbnRUb2tlbiBhbmQgc2VsZi5jdXJyZW50VG9rZW5bIm5hbWUiXS5sb3dlcigpID09IHNlbGYudGVtcG9yYXJ5QnVmZmVyLmxvd2VyKCkKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSBpbiBzcGFjZUNoYXJhY3RlcnMgYW5kIGFwcHJvcHJpYXRlOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlbiA9IHsidHlwZSI6IHRva2VuVHlwZXNbIkVuZFRhZyJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6IHNlbGYudGVtcG9yYXJ5QnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IFtdLCAic2VsZkNsb3NpbmciOiBGYWxzZX0KICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYmVmb3JlQXR0cmlidXRlTmFtZVN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICIvIiBhbmQgYXBwcm9wcmlhdGU6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuID0geyJ0eXBlIjogdG9rZW5UeXBlc1siRW5kVGFnIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogc2VsZi50ZW1wb3JhcnlCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogW10sICJzZWxmQ2xvc2luZyI6IEZhbHNlfQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zZWxmQ2xvc2luZ1N0YXJ0VGFnU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIj4iIGFuZCBhcHByb3ByaWF0ZToKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW4gPSB7InR5cGUiOiB0b2tlblR5cGVzWyJFbmRUYWciXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiBzZWxmLnRlbXBvcmFyeUJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiBbXSwgInNlbGZDbG9zaW5nIjogRmFsc2V9CiAgICAgICAgICAgIHNlbGYuZW1pdEN1cnJlbnRUb2tlbigpCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsaWYgZGF0YSBpbiBhc2NpaUxldHRlcnM6CiAgICAgICAgICAgIHNlbGYudGVtcG9yYXJ5QnVmZmVyICs9IGRhdGEKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiPC8iICsgc2VsZi50ZW1wb3JhcnlCdWZmZXJ9KQogICAgICAgICAgICBzZWxmLnN0cmVhbS51bmdldChkYXRhKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5yY2RhdGFTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIHJhd3RleHRMZXNzVGhhblNpZ25TdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSA9PSAiLyI6CiAgICAgICAgICAgIHNlbGYudGVtcG9yYXJ5QnVmZmVyID0gIiIKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYucmF3dGV4dEVuZFRhZ09wZW5TdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6ICI8In0pCiAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGRhdGEpCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnJhd3RleHRTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIHJhd3RleHRFbmRUYWdPcGVuU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgaW4gYXNjaWlMZXR0ZXJzOgogICAgICAgICAgICBzZWxmLnRlbXBvcmFyeUJ1ZmZlciArPSBkYXRhCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnJhd3RleHRFbmRUYWdOYW1lU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOiAiPC8ifSkKICAgICAgICAgICAgc2VsZi5zdHJlYW0udW5nZXQoZGF0YSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYucmF3dGV4dFN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgcmF3dGV4dEVuZFRhZ05hbWVTdGF0ZShzZWxmKToKICAgICAgICBhcHByb3ByaWF0ZSA9IHNlbGYuY3VycmVudFRva2VuIGFuZCBzZWxmLmN1cnJlbnRUb2tlblsibmFtZSJdLmxvd2VyKCkgPT0gc2VsZi50ZW1wb3JhcnlCdWZmZXIubG93ZXIoKQogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhIGluIHNwYWNlQ2hhcmFjdGVycyBhbmQgYXBwcm9wcmlhdGU6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuID0geyJ0eXBlIjogdG9rZW5UeXBlc1siRW5kVGFnIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogc2VsZi50ZW1wb3JhcnlCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogW10sICJzZWxmQ2xvc2luZyI6IEZhbHNlfQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5iZWZvcmVBdHRyaWJ1dGVOYW1lU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIi8iIGFuZCBhcHByb3ByaWF0ZToKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW4gPSB7InR5cGUiOiB0b2tlblR5cGVzWyJFbmRUYWciXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiBzZWxmLnRlbXBvcmFyeUJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiBbXSwgInNlbGZDbG9zaW5nIjogRmFsc2V9CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNlbGZDbG9zaW5nU3RhcnRUYWdTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiPiIgYW5kIGFwcHJvcHJpYXRlOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlbiA9IHsidHlwZSI6IHRva2VuVHlwZXNbIkVuZFRhZyJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6IHNlbGYudGVtcG9yYXJ5QnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IFtdLCAic2VsZkNsb3NpbmciOiBGYWxzZX0KICAgICAgICAgICAgc2VsZi5lbWl0Q3VycmVudFRva2VuKCkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxpZiBkYXRhIGluIGFzY2lpTGV0dGVyczoKICAgICAgICAgICAgc2VsZi50ZW1wb3JhcnlCdWZmZXIgKz0gZGF0YQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICI8LyIgKyBzZWxmLnRlbXBvcmFyeUJ1ZmZlcn0pCiAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGRhdGEpCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnJhd3RleHRTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIHNjcmlwdERhdGFMZXNzVGhhblNpZ25TdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSA9PSAiLyI6CiAgICAgICAgICAgIHNlbGYudGVtcG9yYXJ5QnVmZmVyID0gIiIKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YUVuZFRhZ09wZW5TdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiISI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6ICI8ISJ9KQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zY3JpcHREYXRhRXNjYXBlU3RhcnRTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6ICI8In0pCiAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGRhdGEpCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIHNjcmlwdERhdGFFbmRUYWdPcGVuU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgaW4gYXNjaWlMZXR0ZXJzOgogICAgICAgICAgICBzZWxmLnRlbXBvcmFyeUJ1ZmZlciArPSBkYXRhCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFFbmRUYWdOYW1lU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOiAiPC8ifSkKICAgICAgICAgICAgc2VsZi5zdHJlYW0udW5nZXQoZGF0YSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YVN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgc2NyaXB0RGF0YUVuZFRhZ05hbWVTdGF0ZShzZWxmKToKICAgICAgICBhcHByb3ByaWF0ZSA9IHNlbGYuY3VycmVudFRva2VuIGFuZCBzZWxmLmN1cnJlbnRUb2tlblsibmFtZSJdLmxvd2VyKCkgPT0gc2VsZi50ZW1wb3JhcnlCdWZmZXIubG93ZXIoKQogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhIGluIHNwYWNlQ2hhcmFjdGVycyBhbmQgYXBwcm9wcmlhdGU6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuID0geyJ0eXBlIjogdG9rZW5UeXBlc1siRW5kVGFnIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogc2VsZi50ZW1wb3JhcnlCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogW10sICJzZWxmQ2xvc2luZyI6IEZhbHNlfQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5iZWZvcmVBdHRyaWJ1dGVOYW1lU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIi8iIGFuZCBhcHByb3ByaWF0ZToKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW4gPSB7InR5cGUiOiB0b2tlblR5cGVzWyJFbmRUYWciXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiBzZWxmLnRlbXBvcmFyeUJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiBbXSwgInNlbGZDbG9zaW5nIjogRmFsc2V9CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNlbGZDbG9zaW5nU3RhcnRUYWdTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiPiIgYW5kIGFwcHJvcHJpYXRlOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlbiA9IHsidHlwZSI6IHRva2VuVHlwZXNbIkVuZFRhZyJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6IHNlbGYudGVtcG9yYXJ5QnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IFtdLCAic2VsZkNsb3NpbmciOiBGYWxzZX0KICAgICAgICAgICAgc2VsZi5lbWl0Q3VycmVudFRva2VuKCkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxpZiBkYXRhIGluIGFzY2lpTGV0dGVyczoKICAgICAgICAgICAgc2VsZi50ZW1wb3JhcnlCdWZmZXIgKz0gZGF0YQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICI8LyIgKyBzZWxmLnRlbXBvcmFyeUJ1ZmZlcn0pCiAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGRhdGEpCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIHNjcmlwdERhdGFFc2NhcGVTdGFydFN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhID09ICItIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjogIi0ifSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YUVzY2FwZVN0YXJ0RGFzaFN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5zdHJlYW0udW5nZXQoZGF0YSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YVN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgc2NyaXB0RGF0YUVzY2FwZVN0YXJ0RGFzaFN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhID09ICItIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjogIi0ifSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YUVzY2FwZWREYXNoRGFzaFN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5zdHJlYW0udW5nZXQoZGF0YSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YVN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgc2NyaXB0RGF0YUVzY2FwZWRTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSA9PSAiLSI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6ICItIn0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFFc2NhcGVkRGFzaFN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICI8IjoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YUVzY2FwZWRMZXNzVGhhblNpZ25TdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiXHUwMDAwIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogImludmFsaWQtY29kZXBvaW50In0pCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJcdUZGRkQifSkKICAgICAgICBlbGlmIGRhdGEgPT0gRU9GOgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBjaGFycyA9IHNlbGYuc3RyZWFtLmNoYXJzVW50aWwoKCI8IiwgIi0iLCAiXHUwMDAwIikpCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgKyBjaGFyc30pCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgc2NyaXB0RGF0YUVzY2FwZWREYXNoU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgPT0gIi0iOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOiAiLSJ9KQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zY3JpcHREYXRhRXNjYXBlZERhc2hEYXNoU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIjwiOgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zY3JpcHREYXRhRXNjYXBlZExlc3NUaGFuU2lnblN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICJcdTAwMDAiOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiaW52YWxpZC1jb2RlcG9pbnQifSkKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogIlx1RkZGRCJ9KQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zY3JpcHREYXRhRXNjYXBlZFN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09IEVPRjoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjogZGF0YX0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFFc2NhcGVkU3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBzY3JpcHREYXRhRXNjYXBlZERhc2hEYXNoU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgPT0gIi0iOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOiAiLSJ9KQogICAgICAgIGVsaWYgZGF0YSA9PSAiPCI6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFFc2NhcGVkTGVzc1RoYW5TaWduU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIj4iOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOiAiPiJ9KQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zY3JpcHREYXRhU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIlx1MDAwMCI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJpbnZhbGlkLWNvZGVwb2ludCJ9KQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiXHVGRkZEIn0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFFc2NhcGVkU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gRU9GOgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOiBkYXRhfSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YUVzY2FwZWRTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIHNjcmlwdERhdGFFc2NhcGVkTGVzc1RoYW5TaWduU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgPT0gIi8iOgogICAgICAgICAgICBzZWxmLnRlbXBvcmFyeUJ1ZmZlciA9ICIiCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFFc2NhcGVkRW5kVGFnT3BlblN0YXRlCiAgICAgICAgZWxpZiBkYXRhIGluIGFzY2lpTGV0dGVyczoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjogIjwiICsgZGF0YX0pCiAgICAgICAgICAgIHNlbGYudGVtcG9yYXJ5QnVmZmVyID0gZGF0YQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zY3JpcHREYXRhRG91YmxlRXNjYXBlU3RhcnRTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6ICI8In0pCiAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGRhdGEpCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFFc2NhcGVkU3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBzY3JpcHREYXRhRXNjYXBlZEVuZFRhZ09wZW5TdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSBpbiBhc2NpaUxldHRlcnM6CiAgICAgICAgICAgIHNlbGYudGVtcG9yYXJ5QnVmZmVyID0gZGF0YQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zY3JpcHREYXRhRXNjYXBlZEVuZFRhZ05hbWVTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6ICI8LyJ9KQogICAgICAgICAgICBzZWxmLnN0cmVhbS51bmdldChkYXRhKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zY3JpcHREYXRhRXNjYXBlZFN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgc2NyaXB0RGF0YUVzY2FwZWRFbmRUYWdOYW1lU3RhdGUoc2VsZik6CiAgICAgICAgYXBwcm9wcmlhdGUgPSBzZWxmLmN1cnJlbnRUb2tlbiBhbmQgc2VsZi5jdXJyZW50VG9rZW5bIm5hbWUiXS5sb3dlcigpID09IHNlbGYudGVtcG9yYXJ5QnVmZmVyLmxvd2VyKCkKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSBpbiBzcGFjZUNoYXJhY3RlcnMgYW5kIGFwcHJvcHJpYXRlOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlbiA9IHsidHlwZSI6IHRva2VuVHlwZXNbIkVuZFRhZyJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6IHNlbGYudGVtcG9yYXJ5QnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IFtdLCAic2VsZkNsb3NpbmciOiBGYWxzZX0KICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYmVmb3JlQXR0cmlidXRlTmFtZVN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICIvIiBhbmQgYXBwcm9wcmlhdGU6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuID0geyJ0eXBlIjogdG9rZW5UeXBlc1siRW5kVGFnIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogc2VsZi50ZW1wb3JhcnlCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogW10sICJzZWxmQ2xvc2luZyI6IEZhbHNlfQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zZWxmQ2xvc2luZ1N0YXJ0VGFnU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIj4iIGFuZCBhcHByb3ByaWF0ZToKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW4gPSB7InR5cGUiOiB0b2tlblR5cGVzWyJFbmRUYWciXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiBzZWxmLnRlbXBvcmFyeUJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiBbXSwgInNlbGZDbG9zaW5nIjogRmFsc2V9CiAgICAgICAgICAgIHNlbGYuZW1pdEN1cnJlbnRUb2tlbigpCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsaWYgZGF0YSBpbiBhc2NpaUxldHRlcnM6CiAgICAgICAgICAgIHNlbGYudGVtcG9yYXJ5QnVmZmVyICs9IGRhdGEKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiPC8iICsgc2VsZi50ZW1wb3JhcnlCdWZmZXJ9KQogICAgICAgICAgICBzZWxmLnN0cmVhbS51bmdldChkYXRhKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zY3JpcHREYXRhRXNjYXBlZFN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgc2NyaXB0RGF0YURvdWJsZUVzY2FwZVN0YXJ0U3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgaW4gKHNwYWNlQ2hhcmFjdGVycyB8IGZyb3plbnNldCgoIi8iLCAiPiIpKSk6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6IGRhdGF9KQogICAgICAgICAgICBpZiBzZWxmLnRlbXBvcmFyeUJ1ZmZlci5sb3dlcigpID09ICJzY3JpcHQiOgogICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YURvdWJsZUVzY2FwZWRTdGF0ZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YUVzY2FwZWRTdGF0ZQogICAgICAgIGVsaWYgZGF0YSBpbiBhc2NpaUxldHRlcnM6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6IGRhdGF9KQogICAgICAgICAgICBzZWxmLnRlbXBvcmFyeUJ1ZmZlciArPSBkYXRhCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5zdHJlYW0udW5nZXQoZGF0YSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YUVzY2FwZWRTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIHNjcmlwdERhdGFEb3VibGVFc2NhcGVkU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgPT0gIi0iOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOiAiLSJ9KQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zY3JpcHREYXRhRG91YmxlRXNjYXBlZERhc2hTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiPCI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6ICI8In0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFEb3VibGVFc2NhcGVkTGVzc1RoYW5TaWduU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIlx1MDAwMCI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJpbnZhbGlkLWNvZGVwb2ludCJ9KQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiXHVGRkZEIn0pCiAgICAgICAgZWxpZiBkYXRhID09IEVPRjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVvZi1pbi1zY3JpcHQtaW4tc2NyaXB0In0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6IGRhdGF9KQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIHNjcmlwdERhdGFEb3VibGVFc2NhcGVkRGFzaFN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhID09ICItIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjogIi0ifSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YURvdWJsZUVzY2FwZWREYXNoRGFzaFN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICI8IjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjogIjwifSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YURvdWJsZUVzY2FwZWRMZXNzVGhhblNpZ25TdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiXHUwMDAwIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogImludmFsaWQtY29kZXBvaW50In0pCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJcdUZGRkQifSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YURvdWJsZUVzY2FwZWRTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSBFT0Y6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlb2YtaW4tc2NyaXB0LWluLXNjcmlwdCJ9KQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOiBkYXRhfSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YURvdWJsZUVzY2FwZWRTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIHNjcmlwdERhdGFEb3VibGVFc2NhcGVkRGFzaERhc2hTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSA9PSAiLSI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6ICItIn0pCiAgICAgICAgZWxpZiBkYXRhID09ICI8IjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjogIjwifSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YURvdWJsZUVzY2FwZWRMZXNzVGhhblNpZ25TdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiPiI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6ICI+In0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiXHUwMDAwIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogImludmFsaWQtY29kZXBvaW50In0pCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJcdUZGRkQifSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YURvdWJsZUVzY2FwZWRTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSBFT0Y6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlb2YtaW4tc2NyaXB0LWluLXNjcmlwdCJ9KQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOiBkYXRhfSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YURvdWJsZUVzY2FwZWRTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIHNjcmlwdERhdGFEb3VibGVFc2NhcGVkTGVzc1RoYW5TaWduU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgPT0gIi8iOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOiAiLyJ9KQogICAgICAgICAgICBzZWxmLnRlbXBvcmFyeUJ1ZmZlciA9ICIiCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFEb3VibGVFc2NhcGVFbmRTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGRhdGEpCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFEb3VibGVFc2NhcGVkU3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBzY3JpcHREYXRhRG91YmxlRXNjYXBlRW5kU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgaW4gKHNwYWNlQ2hhcmFjdGVycyB8IGZyb3plbnNldCgoIi8iLCAiPiIpKSk6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6IGRhdGF9KQogICAgICAgICAgICBpZiBzZWxmLnRlbXBvcmFyeUJ1ZmZlci5sb3dlcigpID09ICJzY3JpcHQiOgogICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YUVzY2FwZWRTdGF0ZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YURvdWJsZUVzY2FwZWRTdGF0ZQogICAgICAgIGVsaWYgZGF0YSBpbiBhc2NpaUxldHRlcnM6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6IGRhdGF9KQogICAgICAgICAgICBzZWxmLnRlbXBvcmFyeUJ1ZmZlciArPSBkYXRhCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5zdHJlYW0udW5nZXQoZGF0YSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YURvdWJsZUVzY2FwZWRTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGJlZm9yZUF0dHJpYnV0ZU5hbWVTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSBpbiBzcGFjZUNoYXJhY3RlcnM6CiAgICAgICAgICAgIHNlbGYuc3RyZWFtLmNoYXJzVW50aWwoc3BhY2VDaGFyYWN0ZXJzLCBUcnVlKQogICAgICAgIGVsaWYgZGF0YSBpbiBhc2NpaUxldHRlcnM6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJkYXRhIl0uYXBwZW5kKFtkYXRhLCAiIl0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmF0dHJpYnV0ZU5hbWVTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiPiI6CiAgICAgICAgICAgIHNlbGYuZW1pdEN1cnJlbnRUb2tlbigpCiAgICAgICAgZWxpZiBkYXRhID09ICIvIjoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2VsZkNsb3NpbmdTdGFydFRhZ1N0YXRlCiAgICAgICAgZWxpZiBkYXRhIGluICgiJyIsICciJywgIj0iLCAiPCIpOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZC1jaGFyYWN0ZXItaW4tYXR0cmlidXRlLW5hbWUifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXS5hcHBlbmQoW2RhdGEsICIiXSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYXR0cmlidXRlTmFtZVN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICJcdTAwMDAiOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiaW52YWxpZC1jb2RlcG9pbnQifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXS5hcHBlbmQoWyJcdUZGRkQiLCAiIl0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmF0dHJpYnV0ZU5hbWVTdGF0ZQogICAgICAgIGVsaWYgZGF0YSBpcyBFT0Y6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZC1hdHRyaWJ1dGUtbmFtZS1idXQtZ290LWVvZiJ9KQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiZGF0YSJdLmFwcGVuZChbZGF0YSwgIiJdKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5hdHRyaWJ1dGVOYW1lU3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBhdHRyaWJ1dGVOYW1lU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGxlYXZpbmdUaGlzU3RhdGUgPSBUcnVlCiAgICAgICAgZW1pdFRva2VuID0gRmFsc2UKICAgICAgICBpZiBkYXRhID09ICI9IjoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYmVmb3JlQXR0cmlidXRlVmFsdWVTdGF0ZQogICAgICAgIGVsaWYgZGF0YSBpbiBhc2NpaUxldHRlcnM6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJkYXRhIl1bLTFdWzBdICs9IGRhdGEgK1wKICAgICAgICAgICAgICAgIHNlbGYuc3RyZWFtLmNoYXJzVW50aWwoYXNjaWlMZXR0ZXJzLCBUcnVlKQogICAgICAgICAgICBsZWF2aW5nVGhpc1N0YXRlID0gRmFsc2UKICAgICAgICBlbGlmIGRhdGEgPT0gIj4iOgogICAgICAgICAgICAjIFhYWCBJZiB3ZSBlbWl0IGhlcmUgdGhlIGF0dHJpYnV0ZXMgYXJlIGNvbnZlcnRlZCB0byBhIGRpY3QKICAgICAgICAgICAgIyB3aXRob3V0IGJlaW5nIGNoZWNrZWQgYW5kIHdoZW4gdGhlIGNvZGUgYmVsb3cgcnVucyB3ZSBlcnJvcgogICAgICAgICAgICAjIGJlY2F1c2UgZGF0YSBpcyBhIGRpY3Qgbm90IGEgbGlzdAogICAgICAgICAgICBlbWl0VG9rZW4gPSBUcnVlCiAgICAgICAgZWxpZiBkYXRhIGluIHNwYWNlQ2hhcmFjdGVyczoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYWZ0ZXJBdHRyaWJ1dGVOYW1lU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIi8iOgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zZWxmQ2xvc2luZ1N0YXJ0VGFnU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIlx1MDAwMCI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJpbnZhbGlkLWNvZGVwb2ludCJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiZGF0YSJdWy0xXVswXSArPSAiXHVGRkZEIgogICAgICAgICAgICBsZWF2aW5nVGhpc1N0YXRlID0gRmFsc2UKICAgICAgICBlbGlmIGRhdGEgaW4gKCInIiwgJyInLCAiPCIpOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZC1jaGFyYWN0ZXItaW4tYXR0cmlidXRlLW5hbWUifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXVstMV1bMF0gKz0gZGF0YQogICAgICAgICAgICBsZWF2aW5nVGhpc1N0YXRlID0gRmFsc2UKICAgICAgICBlbGlmIGRhdGEgaXMgRU9GOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiZW9mLWluLWF0dHJpYnV0ZS1uYW1lIn0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJkYXRhIl1bLTFdWzBdICs9IGRhdGEKICAgICAgICAgICAgbGVhdmluZ1RoaXNTdGF0ZSA9IEZhbHNlCgogICAgICAgIGlmIGxlYXZpbmdUaGlzU3RhdGU6CiAgICAgICAgICAgICMgQXR0cmlidXRlcyBhcmUgbm90IGRyb3BwZWQgYXQgdGhpcyBzdGFnZS4gVGhhdCBoYXBwZW5zIHdoZW4gdGhlCiAgICAgICAgICAgICMgc3RhcnQgdGFnIHRva2VuIGlzIGVtaXR0ZWQgc28gdmFsdWVzIGNhbiBzdGlsbCBiZSBzYWZlbHkgYXBwZW5kZWQKICAgICAgICAgICAgIyB0byBhdHRyaWJ1dGVzLCBidXQgd2UgZG8gd2FudCB0byByZXBvcnQgdGhlIHBhcnNlIGVycm9yIGluIHRpbWUuCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJkYXRhIl1bLTFdWzBdID0gKAogICAgICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXVstMV1bMF0udHJhbnNsYXRlKGFzY2lpVXBwZXIyTG93ZXIpKQogICAgICAgICAgICBmb3IgbmFtZSwgXyBpbiBzZWxmLmN1cnJlbnRUb2tlblsiZGF0YSJdWzotMV06CiAgICAgICAgICAgICAgICBpZiBzZWxmLmN1cnJlbnRUb2tlblsiZGF0YSJdWy0xXVswXSA9PSBuYW1lOgogICAgICAgICAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImR1cGxpY2F0ZS1hdHRyaWJ1dGUifSkKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAjIFhYWCBGaXggZm9yIGFib3ZlIFhYWAogICAgICAgICAgICBpZiBlbWl0VG9rZW46CiAgICAgICAgICAgICAgICBzZWxmLmVtaXRDdXJyZW50VG9rZW4oKQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGFmdGVyQXR0cmlidXRlTmFtZVN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhIGluIHNwYWNlQ2hhcmFjdGVyczoKICAgICAgICAgICAgc2VsZi5zdHJlYW0uY2hhcnNVbnRpbChzcGFjZUNoYXJhY3RlcnMsIFRydWUpCiAgICAgICAgZWxpZiBkYXRhID09ICI9IjoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYmVmb3JlQXR0cmlidXRlVmFsdWVTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiPiI6CiAgICAgICAgICAgIHNlbGYuZW1pdEN1cnJlbnRUb2tlbigpCiAgICAgICAgZWxpZiBkYXRhIGluIGFzY2lpTGV0dGVyczoKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXS5hcHBlbmQoW2RhdGEsICIiXSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYXR0cmlidXRlTmFtZVN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICIvIjoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2VsZkNsb3NpbmdTdGFydFRhZ1N0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICJcdTAwMDAiOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiaW52YWxpZC1jb2RlcG9pbnQifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXS5hcHBlbmQoWyJcdUZGRkQiLCAiIl0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmF0dHJpYnV0ZU5hbWVTdGF0ZQogICAgICAgIGVsaWYgZGF0YSBpbiAoIiciLCAnIicsICI8Iik6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkLWNoYXJhY3Rlci1hZnRlci1hdHRyaWJ1dGUtbmFtZSJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiZGF0YSJdLmFwcGVuZChbZGF0YSwgIiJdKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5hdHRyaWJ1dGVOYW1lU3RhdGUKICAgICAgICBlbGlmIGRhdGEgaXMgRU9GOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQtZW5kLW9mLXRhZy1idXQtZ290LWVvZiJ9KQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiZGF0YSJdLmFwcGVuZChbZGF0YSwgIiJdKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5hdHRyaWJ1dGVOYW1lU3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBiZWZvcmVBdHRyaWJ1dGVWYWx1ZVN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhIGluIHNwYWNlQ2hhcmFjdGVyczoKICAgICAgICAgICAgc2VsZi5zdHJlYW0uY2hhcnNVbnRpbChzcGFjZUNoYXJhY3RlcnMsIFRydWUpCiAgICAgICAgZWxpZiBkYXRhID09ICJcIiI6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmF0dHJpYnV0ZVZhbHVlRG91YmxlUXVvdGVkU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIiYiOgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5hdHRyaWJ1dGVWYWx1ZVVuUXVvdGVkU3RhdGUKICAgICAgICAgICAgc2VsZi5zdHJlYW0udW5nZXQoZGF0YSkKICAgICAgICBlbGlmIGRhdGEgPT0gIiciOgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5hdHRyaWJ1dGVWYWx1ZVNpbmdsZVF1b3RlZFN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICI+IjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkLWF0dHJpYnV0ZS12YWx1ZS1idXQtZ290LXJpZ2h0LWJyYWNrZXQifSkKICAgICAgICAgICAgc2VsZi5lbWl0Q3VycmVudFRva2VuKCkKICAgICAgICBlbGlmIGRhdGEgPT0gIlx1MDAwMCI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJpbnZhbGlkLWNvZGVwb2ludCJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiZGF0YSJdWy0xXVsxXSArPSAiXHVGRkZEIgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5hdHRyaWJ1dGVWYWx1ZVVuUXVvdGVkU3RhdGUKICAgICAgICBlbGlmIGRhdGEgaW4gKCI9IiwgIjwiLCAiYCIpOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXF1YWxzLWluLXVucXVvdGVkLWF0dHJpYnV0ZS12YWx1ZSJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiZGF0YSJdWy0xXVsxXSArPSBkYXRhCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmF0dHJpYnV0ZVZhbHVlVW5RdW90ZWRTdGF0ZQogICAgICAgIGVsaWYgZGF0YSBpcyBFT0Y6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZC1hdHRyaWJ1dGUtdmFsdWUtYnV0LWdvdC1lb2YifSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXVstMV1bMV0gKz0gZGF0YQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5hdHRyaWJ1dGVWYWx1ZVVuUXVvdGVkU3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBhdHRyaWJ1dGVWYWx1ZURvdWJsZVF1b3RlZFN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhID09ICJcIiI6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmFmdGVyQXR0cmlidXRlVmFsdWVTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiJiI6CiAgICAgICAgICAgIHNlbGYucHJvY2Vzc0VudGl0eUluQXR0cmlidXRlKCciJykKICAgICAgICBlbGlmIGRhdGEgPT0gIlx1MDAwMCI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJpbnZhbGlkLWNvZGVwb2ludCJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiZGF0YSJdWy0xXVsxXSArPSAiXHVGRkZEIgogICAgICAgIGVsaWYgZGF0YSBpcyBFT0Y6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlb2YtaW4tYXR0cmlidXRlLXZhbHVlLWRvdWJsZS1xdW90ZSJ9KQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiZGF0YSJdWy0xXVsxXSArPSBkYXRhICtcCiAgICAgICAgICAgICAgICBzZWxmLnN0cmVhbS5jaGFyc1VudGlsKCgiXCIiLCAiJiIsICJcdTAwMDAiKSkKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBhdHRyaWJ1dGVWYWx1ZVNpbmdsZVF1b3RlZFN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhID09ICInIjoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYWZ0ZXJBdHRyaWJ1dGVWYWx1ZVN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICImIjoKICAgICAgICAgICAgc2VsZi5wcm9jZXNzRW50aXR5SW5BdHRyaWJ1dGUoIiciKQogICAgICAgIGVsaWYgZGF0YSA9PSAiXHUwMDAwIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogImludmFsaWQtY29kZXBvaW50In0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJkYXRhIl1bLTFdWzFdICs9ICJcdUZGRkQiCiAgICAgICAgZWxpZiBkYXRhIGlzIEVPRjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVvZi1pbi1hdHRyaWJ1dGUtdmFsdWUtc2luZ2xlLXF1b3RlIn0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJkYXRhIl1bLTFdWzFdICs9IGRhdGEgK1wKICAgICAgICAgICAgICAgIHNlbGYuc3RyZWFtLmNoYXJzVW50aWwoKCInIiwgIiYiLCAiXHUwMDAwIikpCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgYXR0cmlidXRlVmFsdWVVblF1b3RlZFN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhIGluIHNwYWNlQ2hhcmFjdGVyczoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYmVmb3JlQXR0cmlidXRlTmFtZVN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICImIjoKICAgICAgICAgICAgc2VsZi5wcm9jZXNzRW50aXR5SW5BdHRyaWJ1dGUoIj4iKQogICAgICAgIGVsaWYgZGF0YSA9PSAiPiI6CiAgICAgICAgICAgIHNlbGYuZW1pdEN1cnJlbnRUb2tlbigpCiAgICAgICAgZWxpZiBkYXRhIGluICgnIicsICInIiwgIj0iLCAiPCIsICJgIik6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkLWNoYXJhY3Rlci1pbi11bnF1b3RlZC1hdHRyaWJ1dGUtdmFsdWUifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXVstMV1bMV0gKz0gZGF0YQogICAgICAgIGVsaWYgZGF0YSA9PSAiXHUwMDAwIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogImludmFsaWQtY29kZXBvaW50In0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJkYXRhIl1bLTFdWzFdICs9ICJcdUZGRkQiCiAgICAgICAgZWxpZiBkYXRhIGlzIEVPRjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVvZi1pbi1hdHRyaWJ1dGUtdmFsdWUtbm8tcXVvdGVzIn0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJkYXRhIl1bLTFdWzFdICs9IGRhdGEgKyBzZWxmLnN0cmVhbS5jaGFyc1VudGlsKAogICAgICAgICAgICAgICAgZnJvemVuc2V0KCgiJiIsICI+IiwgJyInLCAiJyIsICI9IiwgIjwiLCAiYCIsICJcdTAwMDAiKSkgfCBzcGFjZUNoYXJhY3RlcnMpCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgYWZ0ZXJBdHRyaWJ1dGVWYWx1ZVN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhIGluIHNwYWNlQ2hhcmFjdGVyczoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYmVmb3JlQXR0cmlidXRlTmFtZVN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICI+IjoKICAgICAgICAgICAgc2VsZi5lbWl0Q3VycmVudFRva2VuKCkKICAgICAgICBlbGlmIGRhdGEgPT0gIi8iOgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zZWxmQ2xvc2luZ1N0YXJ0VGFnU3RhdGUKICAgICAgICBlbGlmIGRhdGEgaXMgRU9GOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZC1FT0YtYWZ0ZXItYXR0cmlidXRlLXZhbHVlIn0pCiAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGRhdGEpCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkLWNoYXJhY3Rlci1hZnRlci1hdHRyaWJ1dGUtdmFsdWUifSkKICAgICAgICAgICAgc2VsZi5zdHJlYW0udW5nZXQoZGF0YSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYmVmb3JlQXR0cmlidXRlTmFtZVN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgc2VsZkNsb3NpbmdTdGFydFRhZ1N0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhID09ICI+IjoKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bInNlbGZDbG9zaW5nIl0gPSBUcnVlCiAgICAgICAgICAgIHNlbGYuZW1pdEN1cnJlbnRUb2tlbigpCiAgICAgICAgZWxpZiBkYXRhIGlzIEVPRjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQtRU9GLWFmdGVyLXNvbGlkdXMtaW4tdGFnIn0pCiAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGRhdGEpCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkLWNoYXJhY3Rlci1hZnRlci1zb2xpZHVzLWluLXRhZyJ9KQogICAgICAgICAgICBzZWxmLnN0cmVhbS51bmdldChkYXRhKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5iZWZvcmVBdHRyaWJ1dGVOYW1lU3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBib2d1c0NvbW1lbnRTdGF0ZShzZWxmKToKICAgICAgICAjIE1ha2UgYSBuZXcgY29tbWVudCB0b2tlbiBhbmQgZ2l2ZSBpdCBhcyB2YWx1ZSBhbGwgdGhlIGNoYXJhY3RlcnMKICAgICAgICAjIHVudGlsIHRoZSBmaXJzdCA+IG9yIEVPRiAoY2hhcnNVbnRpbCBjaGVja3MgZm9yIEVPRiBhdXRvbWF0aWNhbGx5KQogICAgICAgICMgYW5kIGVtaXQgaXQuCiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXJzVW50aWwoIj4iKQogICAgICAgIGRhdGEgPSBkYXRhLnJlcGxhY2UoIlx1MDAwMCIsICJcdUZGRkQiKQogICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoCiAgICAgICAgICAgIHsidHlwZSI6IHRva2VuVHlwZXNbIkNvbW1lbnQiXSwgImRhdGEiOiBkYXRhfSkKCiAgICAgICAgIyBFYXQgdGhlIGNoYXJhY3RlciBkaXJlY3RseSBhZnRlciB0aGUgYm9ndXMgY29tbWVudCB3aGljaCBpcyBlaXRoZXIgYQogICAgICAgICMgIj4iIG9yIGFuIEVPRi4KICAgICAgICBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBtYXJrdXBEZWNsYXJhdGlvbk9wZW5TdGF0ZShzZWxmKToKICAgICAgICBjaGFyU3RhY2sgPSBbc2VsZi5zdHJlYW0uY2hhcigpXQogICAgICAgIGlmIGNoYXJTdGFja1stMV0gPT0gIi0iOgogICAgICAgICAgICBjaGFyU3RhY2suYXBwZW5kKHNlbGYuc3RyZWFtLmNoYXIoKSkKICAgICAgICAgICAgaWYgY2hhclN0YWNrWy0xXSA9PSAiLSI6CiAgICAgICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlbiA9IHsidHlwZSI6IHRva2VuVHlwZXNbIkNvbW1lbnQiXSwgImRhdGEiOiAiIn0KICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmNvbW1lbnRTdGFydFN0YXRlCiAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIGVsaWYgY2hhclN0YWNrWy0xXSBpbiAoJ2QnLCAnRCcpOgogICAgICAgICAgICBtYXRjaGVkID0gVHJ1ZQogICAgICAgICAgICBmb3IgZXhwZWN0ZWQgaW4gKCgnbycsICdPJyksICgnYycsICdDJyksICgndCcsICdUJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCd5JywgJ1knKSwgKCdwJywgJ1AnKSwgKCdlJywgJ0UnKSk6CiAgICAgICAgICAgICAgICBjaGFyU3RhY2suYXBwZW5kKHNlbGYuc3RyZWFtLmNoYXIoKSkKICAgICAgICAgICAgICAgIGlmIGNoYXJTdGFja1stMV0gbm90IGluIGV4cGVjdGVkOgogICAgICAgICAgICAgICAgICAgIG1hdGNoZWQgPSBGYWxzZQogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGlmIG1hdGNoZWQ6CiAgICAgICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlbiA9IHsidHlwZSI6IHRva2VuVHlwZXNbIkRvY3R5cGUiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogIiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHVibGljSWQiOiBOb25lLCAic3lzdGVtSWQiOiBOb25lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvcnJlY3QiOiBUcnVlfQogICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZG9jdHlwZVN0YXRlCiAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIGVsaWYgKGNoYXJTdGFja1stMV0gPT0gIlsiIGFuZAogICAgICAgICAgICAgIHNlbGYucGFyc2VyIGlzIG5vdCBOb25lIGFuZAogICAgICAgICAgICAgIHNlbGYucGFyc2VyLnRyZWUub3BlbkVsZW1lbnRzIGFuZAogICAgICAgICAgICAgIHNlbGYucGFyc2VyLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lc3BhY2UgIT0gc2VsZi5wYXJzZXIudHJlZS5kZWZhdWx0TmFtZXNwYWNlKToKICAgICAgICAgICAgbWF0Y2hlZCA9IFRydWUKICAgICAgICAgICAgZm9yIGV4cGVjdGVkIGluIFsiQyIsICJEIiwgIkEiLCAiVCIsICJBIiwgIlsiXToKICAgICAgICAgICAgICAgIGNoYXJTdGFjay5hcHBlbmQoc2VsZi5zdHJlYW0uY2hhcigpKQogICAgICAgICAgICAgICAgaWYgY2hhclN0YWNrWy0xXSAhPSBleHBlY3RlZDoKICAgICAgICAgICAgICAgICAgICBtYXRjaGVkID0gRmFsc2UKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBpZiBtYXRjaGVkOgogICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuY2RhdGFTZWN0aW9uU3RhdGUKICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkLWRhc2hlcy1vci1kb2N0eXBlIn0pCgogICAgICAgIHdoaWxlIGNoYXJTdGFjazoKICAgICAgICAgICAgc2VsZi5zdHJlYW0udW5nZXQoY2hhclN0YWNrLnBvcCgpKQogICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmJvZ3VzQ29tbWVudFN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgY29tbWVudFN0YXJ0U3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgPT0gIi0iOgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5jb21tZW50U3RhcnREYXNoU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIlx1MDAwMCI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJpbnZhbGlkLWNvZGVwb2ludCJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiZGF0YSJdICs9ICJcdUZGRkQiCiAgICAgICAgZWxpZiBkYXRhID09ICI+IjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluY29ycmVjdC1jb21tZW50In0pCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoc2VsZi5jdXJyZW50VG9rZW4pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsaWYgZGF0YSBpcyBFT0Y6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlb2YtaW4tY29tbWVudCJ9KQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHNlbGYuY3VycmVudFRva2VuKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiZGF0YSJdICs9IGRhdGEKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuY29tbWVudFN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgY29tbWVudFN0YXJ0RGFzaFN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhID09ICItIjoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuY29tbWVudEVuZFN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICJcdTAwMDAiOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiaW52YWxpZC1jb2RlcG9pbnQifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXSArPSAiLVx1RkZGRCIKICAgICAgICBlbGlmIGRhdGEgPT0gIj4iOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5jb3JyZWN0LWNvbW1lbnQifSkKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZChzZWxmLmN1cnJlbnRUb2tlbikKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxpZiBkYXRhIGlzIEVPRjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVvZi1pbi1jb21tZW50In0pCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoc2VsZi5jdXJyZW50VG9rZW4pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJkYXRhIl0gKz0gIi0iICsgZGF0YQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5jb21tZW50U3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBjb21tZW50U3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgPT0gIi0iOgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5jb21tZW50RW5kRGFzaFN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICJcdTAwMDAiOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiaW52YWxpZC1jb2RlcG9pbnQifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXSArPSAiXHVGRkZEIgogICAgICAgIGVsaWYgZGF0YSBpcyBFT0Y6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJlb2YtaW4tY29tbWVudCJ9KQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHNlbGYuY3VycmVudFRva2VuKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiZGF0YSJdICs9IGRhdGEgKyBcCiAgICAgICAgICAgICAgICBzZWxmLnN0cmVhbS5jaGFyc1VudGlsKCgiLSIsICJcdTAwMDAiKSkKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBjb21tZW50RW5kRGFzaFN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhID09ICItIjoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuY29tbWVudEVuZFN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICJcdTAwMDAiOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiaW52YWxpZC1jb2RlcG9pbnQifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXSArPSAiLVx1RkZGRCIKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuY29tbWVudFN0YXRlCiAgICAgICAgZWxpZiBkYXRhIGlzIEVPRjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVvZi1pbi1jb21tZW50LWVuZC1kYXNoIn0pCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoc2VsZi5jdXJyZW50VG9rZW4pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJkYXRhIl0gKz0gIi0iICsgZGF0YQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5jb21tZW50U3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBjb21tZW50RW5kU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgPT0gIj4iOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHNlbGYuY3VycmVudFRva2VuKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIlx1MDAwMCI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJpbnZhbGlkLWNvZGVwb2ludCJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiZGF0YSJdICs9ICItLVx1RkZGRCIKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuY29tbWVudFN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICIhIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQtYmFuZy1hZnRlci1kb3VibGUtZGFzaC1pbi1jb21tZW50In0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmNvbW1lbnRFbmRCYW5nU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIi0iOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZC1kYXNoLWFmdGVyLWRvdWJsZS1kYXNoLWluLWNvbW1lbnQifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXSArPSBkYXRhCiAgICAgICAgZWxpZiBkYXRhIGlzIEVPRjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVvZi1pbi1jb21tZW50LWRvdWJsZS1kYXNoIn0pCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoc2VsZi5jdXJyZW50VG9rZW4pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgWFhYCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkLWNoYXItaW4tY29tbWVudCJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiZGF0YSJdICs9ICItLSIgKyBkYXRhCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmNvbW1lbnRTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGNvbW1lbnRFbmRCYW5nU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgPT0gIj4iOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHNlbGYuY3VycmVudFRva2VuKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIi0iOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiZGF0YSJdICs9ICItLSEiCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmNvbW1lbnRFbmREYXNoU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIlx1MDAwMCI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJpbnZhbGlkLWNvZGVwb2ludCJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiZGF0YSJdICs9ICItLSFcdUZGRkQiCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmNvbW1lbnRTdGF0ZQogICAgICAgIGVsaWYgZGF0YSBpcyBFT0Y6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlb2YtaW4tY29tbWVudC1lbmQtYmFuZy1zdGF0ZSJ9KQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHNlbGYuY3VycmVudFRva2VuKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiZGF0YSJdICs9ICItLSEiICsgZGF0YQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5jb21tZW50U3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBkb2N0eXBlU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgaW4gc3BhY2VDaGFyYWN0ZXJzOgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5iZWZvcmVEb2N0eXBlTmFtZVN0YXRlCiAgICAgICAgZWxpZiBkYXRhIGlzIEVPRjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkLWRvY3R5cGUtbmFtZS1idXQtZ290LWVvZiJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiY29ycmVjdCJdID0gRmFsc2UKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZChzZWxmLmN1cnJlbnRUb2tlbikKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5lZWQtc3BhY2UtYWZ0ZXItZG9jdHlwZSJ9KQogICAgICAgICAgICBzZWxmLnN0cmVhbS51bmdldChkYXRhKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5iZWZvcmVEb2N0eXBlTmFtZVN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgYmVmb3JlRG9jdHlwZU5hbWVTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSBpbiBzcGFjZUNoYXJhY3RlcnM6CiAgICAgICAgICAgIHBhc3MKICAgICAgICBlbGlmIGRhdGEgPT0gIj4iOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQtZG9jdHlwZS1uYW1lLWJ1dC1nb3QtcmlnaHQtYnJhY2tldCJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiY29ycmVjdCJdID0gRmFsc2UKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZChzZWxmLmN1cnJlbnRUb2tlbikKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICJcdTAwMDAiOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiaW52YWxpZC1jb2RlcG9pbnQifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bIm5hbWUiXSA9ICJcdUZGRkQiCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRvY3R5cGVOYW1lU3RhdGUKICAgICAgICBlbGlmIGRhdGEgaXMgRU9GOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQtZG9jdHlwZS1uYW1lLWJ1dC1nb3QtZW9mIn0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJjb3JyZWN0Il0gPSBGYWxzZQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHNlbGYuY3VycmVudFRva2VuKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsibmFtZSJdID0gZGF0YQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kb2N0eXBlTmFtZVN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgZG9jdHlwZU5hbWVTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSBpbiBzcGFjZUNoYXJhY3RlcnM6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJuYW1lIl0gPSBzZWxmLmN1cnJlbnRUb2tlblsibmFtZSJdLnRyYW5zbGF0ZShhc2NpaVVwcGVyMkxvd2VyKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5hZnRlckRvY3R5cGVOYW1lU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIj4iOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsibmFtZSJdID0gc2VsZi5jdXJyZW50VG9rZW5bIm5hbWUiXS50cmFuc2xhdGUoYXNjaWlVcHBlcjJMb3dlcikKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZChzZWxmLmN1cnJlbnRUb2tlbikKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICJcdTAwMDAiOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiaW52YWxpZC1jb2RlcG9pbnQifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bIm5hbWUiXSArPSAiXHVGRkZEIgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kb2N0eXBlTmFtZVN0YXRlCiAgICAgICAgZWxpZiBkYXRhIGlzIEVPRjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVvZi1pbi1kb2N0eXBlLW5hbWUifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImNvcnJlY3QiXSA9IEZhbHNlCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJuYW1lIl0gPSBzZWxmLmN1cnJlbnRUb2tlblsibmFtZSJdLnRyYW5zbGF0ZShhc2NpaVVwcGVyMkxvd2VyKQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHNlbGYuY3VycmVudFRva2VuKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsibmFtZSJdICs9IGRhdGEKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBhZnRlckRvY3R5cGVOYW1lU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgaW4gc3BhY2VDaGFyYWN0ZXJzOgogICAgICAgICAgICBwYXNzCiAgICAgICAgZWxpZiBkYXRhID09ICI+IjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZChzZWxmLmN1cnJlbnRUb2tlbikKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxpZiBkYXRhIGlzIEVPRjoKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImNvcnJlY3QiXSA9IEZhbHNlCiAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGRhdGEpCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlb2YtaW4tZG9jdHlwZSJ9KQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHNlbGYuY3VycmVudFRva2VuKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBpZiBkYXRhIGluICgicCIsICJQIik6CiAgICAgICAgICAgICAgICBtYXRjaGVkID0gVHJ1ZQogICAgICAgICAgICAgICAgZm9yIGV4cGVjdGVkIGluICgoInUiLCAiVSIpLCAoImIiLCAiQiIpLCAoImwiLCAiTCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImkiLCAiSSIpLCAoImMiLCAiQyIpKToKICAgICAgICAgICAgICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgICAgICAgICAgICAgaWYgZGF0YSBub3QgaW4gZXhwZWN0ZWQ6CiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZWQgPSBGYWxzZQogICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgaWYgbWF0Y2hlZDoKICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5hZnRlckRvY3R5cGVQdWJsaWNLZXl3b3JkU3RhdGUKICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgICAgICBlbGlmIGRhdGEgaW4gKCJzIiwgIlMiKToKICAgICAgICAgICAgICAgIG1hdGNoZWQgPSBUcnVlCiAgICAgICAgICAgICAgICBmb3IgZXhwZWN0ZWQgaW4gKCgieSIsICJZIiksICgicyIsICJTIiksICgidCIsICJUIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiZSIsICJFIiksICgibSIsICJNIikpOgogICAgICAgICAgICAgICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICAgICAgICAgICAgICBpZiBkYXRhIG5vdCBpbiBleHBlY3RlZDoKICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZCA9IEZhbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICBpZiBtYXRjaGVkOgogICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmFmdGVyRG9jdHlwZVN5c3RlbUtleXdvcmRTdGF0ZQogICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgICAgICAgICAjIEFsbCB0aGUgY2hhcmFjdGVycyByZWFkIGJlZm9yZSB0aGUgY3VycmVudCAnZGF0YScgd2lsbCBiZQogICAgICAgICAgICAjIFthLXpBLVpdLCBzbyB0aGV5J3JlIGdhcmJhZ2UgaW4gdGhlIGJvZ3VzIGRvY3R5cGUgYW5kIGNhbiBiZQogICAgICAgICAgICAjIGRpc2NhcmRlZDsgb25seSB0aGUgbGF0ZXN0IGNoYXJhY3RlciBtaWdodCBiZSAnPicgb3IgRU9GCiAgICAgICAgICAgICMgYW5kIG5lZWRzIHRvIGJlIHVuZ2V0dGVkCiAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGRhdGEpCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZC1zcGFjZS1vci1yaWdodC1icmFja2V0LWluLWRvY3R5cGUiLCAiZGF0YXZhcnMiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ImRhdGEiOiBkYXRhfX0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJjb3JyZWN0Il0gPSBGYWxzZQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5ib2d1c0RvY3R5cGVTdGF0ZQoKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBhZnRlckRvY3R5cGVQdWJsaWNLZXl3b3JkU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgaW4gc3BhY2VDaGFyYWN0ZXJzOgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5iZWZvcmVEb2N0eXBlUHVibGljSWRlbnRpZmllclN0YXRlCiAgICAgICAgZWxpZiBkYXRhIGluICgiJyIsICciJyk6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkLWNoYXItaW4tZG9jdHlwZSJ9KQogICAgICAgICAgICBzZWxmLnN0cmVhbS51bmdldChkYXRhKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5iZWZvcmVEb2N0eXBlUHVibGljSWRlbnRpZmllclN0YXRlCiAgICAgICAgZWxpZiBkYXRhIGlzIEVPRjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVvZi1pbi1kb2N0eXBlIn0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJjb3JyZWN0Il0gPSBGYWxzZQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHNlbGYuY3VycmVudFRva2VuKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnN0cmVhbS51bmdldChkYXRhKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5iZWZvcmVEb2N0eXBlUHVibGljSWRlbnRpZmllclN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgYmVmb3JlRG9jdHlwZVB1YmxpY0lkZW50aWZpZXJTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSBpbiBzcGFjZUNoYXJhY3RlcnM6CiAgICAgICAgICAgIHBhc3MKICAgICAgICBlbGlmIGRhdGEgPT0gIlwiIjoKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bInB1YmxpY0lkIl0gPSAiIgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kb2N0eXBlUHVibGljSWRlbnRpZmllckRvdWJsZVF1b3RlZFN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICInIjoKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bInB1YmxpY0lkIl0gPSAiIgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kb2N0eXBlUHVibGljSWRlbnRpZmllclNpbmdsZVF1b3RlZFN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICI+IjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQtZW5kLW9mLWRvY3R5cGUifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImNvcnJlY3QiXSA9IEZhbHNlCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoc2VsZi5jdXJyZW50VG9rZW4pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsaWYgZGF0YSBpcyBFT0Y6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlb2YtaW4tZG9jdHlwZSJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiY29ycmVjdCJdID0gRmFsc2UKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZChzZWxmLmN1cnJlbnRUb2tlbikKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQtY2hhci1pbi1kb2N0eXBlIn0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJjb3JyZWN0Il0gPSBGYWxzZQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5ib2d1c0RvY3R5cGVTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGRvY3R5cGVQdWJsaWNJZGVudGlmaWVyRG91YmxlUXVvdGVkU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgPT0gIlwiIjoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYWZ0ZXJEb2N0eXBlUHVibGljSWRlbnRpZmllclN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICJcdTAwMDAiOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiaW52YWxpZC1jb2RlcG9pbnQifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bInB1YmxpY0lkIl0gKz0gIlx1RkZGRCIKICAgICAgICBlbGlmIGRhdGEgPT0gIj4iOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZC1lbmQtb2YtZG9jdHlwZSJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiY29ycmVjdCJdID0gRmFsc2UKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZChzZWxmLmN1cnJlbnRUb2tlbikKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxpZiBkYXRhIGlzIEVPRjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVvZi1pbi1kb2N0eXBlIn0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJjb3JyZWN0Il0gPSBGYWxzZQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHNlbGYuY3VycmVudFRva2VuKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsicHVibGljSWQiXSArPSBkYXRhCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgZG9jdHlwZVB1YmxpY0lkZW50aWZpZXJTaW5nbGVRdW90ZWRTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSA9PSAiJyI6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmFmdGVyRG9jdHlwZVB1YmxpY0lkZW50aWZpZXJTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiXHUwMDAwIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogImludmFsaWQtY29kZXBvaW50In0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJwdWJsaWNJZCJdICs9ICJcdUZGRkQiCiAgICAgICAgZWxpZiBkYXRhID09ICI+IjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQtZW5kLW9mLWRvY3R5cGUifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImNvcnJlY3QiXSA9IEZhbHNlCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoc2VsZi5jdXJyZW50VG9rZW4pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsaWYgZGF0YSBpcyBFT0Y6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlb2YtaW4tZG9jdHlwZSJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiY29ycmVjdCJdID0gRmFsc2UKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZChzZWxmLmN1cnJlbnRUb2tlbikKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bInB1YmxpY0lkIl0gKz0gZGF0YQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGFmdGVyRG9jdHlwZVB1YmxpY0lkZW50aWZpZXJTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSBpbiBzcGFjZUNoYXJhY3RlcnM6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmJldHdlZW5Eb2N0eXBlUHVibGljQW5kU3lzdGVtSWRlbnRpZmllcnNTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiPiI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoc2VsZi5jdXJyZW50VG9rZW4pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAnIic6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkLWNoYXItaW4tZG9jdHlwZSJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsic3lzdGVtSWQiXSA9ICIiCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRvY3R5cGVTeXN0ZW1JZGVudGlmaWVyRG91YmxlUXVvdGVkU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIiciOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZC1jaGFyLWluLWRvY3R5cGUifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bInN5c3RlbUlkIl0gPSAiIgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kb2N0eXBlU3lzdGVtSWRlbnRpZmllclNpbmdsZVF1b3RlZFN0YXRlCiAgICAgICAgZWxpZiBkYXRhIGlzIEVPRjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVvZi1pbi1kb2N0eXBlIn0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJjb3JyZWN0Il0gPSBGYWxzZQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHNlbGYuY3VycmVudFRva2VuKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZC1jaGFyLWluLWRvY3R5cGUifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImNvcnJlY3QiXSA9IEZhbHNlCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmJvZ3VzRG9jdHlwZVN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgYmV0d2VlbkRvY3R5cGVQdWJsaWNBbmRTeXN0ZW1JZGVudGlmaWVyc1N0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhIGluIHNwYWNlQ2hhcmFjdGVyczoKICAgICAgICAgICAgcGFzcwogICAgICAgIGVsaWYgZGF0YSA9PSAiPiI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoc2VsZi5jdXJyZW50VG9rZW4pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAnIic6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJzeXN0ZW1JZCJdID0gIiIKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZG9jdHlwZVN5c3RlbUlkZW50aWZpZXJEb3VibGVRdW90ZWRTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiJyI6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJzeXN0ZW1JZCJdID0gIiIKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZG9jdHlwZVN5c3RlbUlkZW50aWZpZXJTaW5nbGVRdW90ZWRTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSBFT0Y6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlb2YtaW4tZG9jdHlwZSJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiY29ycmVjdCJdID0gRmFsc2UKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZChzZWxmLmN1cnJlbnRUb2tlbikKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQtY2hhci1pbi1kb2N0eXBlIn0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJjb3JyZWN0Il0gPSBGYWxzZQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5ib2d1c0RvY3R5cGVTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGFmdGVyRG9jdHlwZVN5c3RlbUtleXdvcmRTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSBpbiBzcGFjZUNoYXJhY3RlcnM6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmJlZm9yZURvY3R5cGVTeXN0ZW1JZGVudGlmaWVyU3RhdGUKICAgICAgICBlbGlmIGRhdGEgaW4gKCInIiwgJyInKToKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQtY2hhci1pbi1kb2N0eXBlIn0pCiAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGRhdGEpCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmJlZm9yZURvY3R5cGVTeXN0ZW1JZGVudGlmaWVyU3RhdGUKICAgICAgICBlbGlmIGRhdGEgaXMgRU9GOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW9mLWluLWRvY3R5cGUifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImNvcnJlY3QiXSA9IEZhbHNlCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoc2VsZi5jdXJyZW50VG9rZW4pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGRhdGEpCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmJlZm9yZURvY3R5cGVTeXN0ZW1JZGVudGlmaWVyU3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBiZWZvcmVEb2N0eXBlU3lzdGVtSWRlbnRpZmllclN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhIGluIHNwYWNlQ2hhcmFjdGVyczoKICAgICAgICAgICAgcGFzcwogICAgICAgIGVsaWYgZGF0YSA9PSAiXCIiOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsic3lzdGVtSWQiXSA9ICIiCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRvY3R5cGVTeXN0ZW1JZGVudGlmaWVyRG91YmxlUXVvdGVkU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIiciOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsic3lzdGVtSWQiXSA9ICIiCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRvY3R5cGVTeXN0ZW1JZGVudGlmaWVyU2luZ2xlUXVvdGVkU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIj4iOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZC1jaGFyLWluLWRvY3R5cGUifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImNvcnJlY3QiXSA9IEZhbHNlCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoc2VsZi5jdXJyZW50VG9rZW4pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsaWYgZGF0YSBpcyBFT0Y6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlb2YtaW4tZG9jdHlwZSJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiY29ycmVjdCJdID0gRmFsc2UKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZChzZWxmLmN1cnJlbnRUb2tlbikKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQtY2hhci1pbi1kb2N0eXBlIn0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJjb3JyZWN0Il0gPSBGYWxzZQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5ib2d1c0RvY3R5cGVTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGRvY3R5cGVTeXN0ZW1JZGVudGlmaWVyRG91YmxlUXVvdGVkU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgPT0gIlwiIjoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYWZ0ZXJEb2N0eXBlU3lzdGVtSWRlbnRpZmllclN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICJcdTAwMDAiOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiaW52YWxpZC1jb2RlcG9pbnQifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bInN5c3RlbUlkIl0gKz0gIlx1RkZGRCIKICAgICAgICBlbGlmIGRhdGEgPT0gIj4iOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZC1lbmQtb2YtZG9jdHlwZSJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiY29ycmVjdCJdID0gRmFsc2UKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZChzZWxmLmN1cnJlbnRUb2tlbikKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxpZiBkYXRhIGlzIEVPRjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVvZi1pbi1kb2N0eXBlIn0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJjb3JyZWN0Il0gPSBGYWxzZQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHNlbGYuY3VycmVudFRva2VuKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsic3lzdGVtSWQiXSArPSBkYXRhCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgZG9jdHlwZVN5c3RlbUlkZW50aWZpZXJTaW5nbGVRdW90ZWRTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSA9PSAiJyI6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmFmdGVyRG9jdHlwZVN5c3RlbUlkZW50aWZpZXJTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiXHUwMDAwIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogImludmFsaWQtY29kZXBvaW50In0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJzeXN0ZW1JZCJdICs9ICJcdUZGRkQiCiAgICAgICAgZWxpZiBkYXRhID09ICI+IjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQtZW5kLW9mLWRvY3R5cGUifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImNvcnJlY3QiXSA9IEZhbHNlCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoc2VsZi5jdXJyZW50VG9rZW4pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsaWYgZGF0YSBpcyBFT0Y6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlb2YtaW4tZG9jdHlwZSJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiY29ycmVjdCJdID0gRmFsc2UKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZChzZWxmLmN1cnJlbnRUb2tlbikKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bInN5c3RlbUlkIl0gKz0gZGF0YQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGFmdGVyRG9jdHlwZVN5c3RlbUlkZW50aWZpZXJTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSBpbiBzcGFjZUNoYXJhY3RlcnM6CiAgICAgICAgICAgIHBhc3MKICAgICAgICBlbGlmIGRhdGEgPT0gIj4iOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHNlbGYuY3VycmVudFRva2VuKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbGlmIGRhdGEgaXMgRU9GOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW9mLWluLWRvY3R5cGUifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImNvcnJlY3QiXSA9IEZhbHNlCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoc2VsZi5jdXJyZW50VG9rZW4pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkLWNoYXItaW4tZG9jdHlwZSJ9KQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5ib2d1c0RvY3R5cGVTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGJvZ3VzRG9jdHlwZVN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhID09ICI+IjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZChzZWxmLmN1cnJlbnRUb2tlbikKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxpZiBkYXRhIGlzIEVPRjoKICAgICAgICAgICAgIyBYWFggRU1JVAogICAgICAgICAgICBzZWxmLnN0cmVhbS51bmdldChkYXRhKQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHNlbGYuY3VycmVudFRva2VuKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBwYXNzCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgY2RhdGFTZWN0aW9uU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IFtdCiAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgZGF0YS5hcHBlbmQoc2VsZi5zdHJlYW0uY2hhcnNVbnRpbCgiXSIpKQogICAgICAgICAgICBkYXRhLmFwcGVuZChzZWxmLnN0cmVhbS5jaGFyc1VudGlsKCI+IikpCiAgICAgICAgICAgIGNoYXIgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICAgICAgaWYgY2hhciA9PSBFT0Y6CiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgYXNzZXJ0IGNoYXIgPT0gIj4iCiAgICAgICAgICAgICAgICBpZiBkYXRhWy0xXVstMjpdID09ICJdXSI6CiAgICAgICAgICAgICAgICAgICAgZGF0YVstMV0gPSBkYXRhWy0xXVs6LTJdCiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgZGF0YS5hcHBlbmQoY2hhcikKCiAgICAgICAgZGF0YSA9ICIiLmpvaW4oZGF0YSkgICMgcHlsaW50OmRpc2FibGU9cmVkZWZpbmVkLXZhcmlhYmxlLXR5cGUKICAgICAgICAjIERlYWwgd2l0aCBudWxsIGhlcmUgcmF0aGVyIHRoYW4gaW4gdGhlIHBhcnNlcgogICAgICAgIG51bGxDb3VudCA9IGRhdGEuY291bnQoIlx1MDAwMCIpCiAgICAgICAgaWYgbnVsbENvdW50ID4gMDoKICAgICAgICAgICAgZm9yIF8gaW4gcmFuZ2UobnVsbENvdW50KToKICAgICAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiaW52YWxpZC1jb2RlcG9pbnQifSkKICAgICAgICAgICAgZGF0YSA9IGRhdGEucmVwbGFjZSgiXHUwMDAwIiwgIlx1RkZGRCIpCiAgICAgICAgaWYgZGF0YToKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogZGF0YX0pCiAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKUEsDBBQAAAAAAAAAIQDv068PIQEAACEBAABDAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi9fdHJpZS9fX2luaXRfXy5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgdW5pY29kZV9saXRlcmFscwoKZnJvbSAucHkgaW1wb3J0IFRyaWUgYXMgUHlUcmllCgpUcmllID0gUHlUcmllCgojIHB5bGludDpkaXNhYmxlPXdyb25nLWltcG9ydC1wb3NpdGlvbgp0cnk6CiAgICBmcm9tIC5kYXRyaWUgaW1wb3J0IFRyaWUgYXMgREFUcmllCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIHBhc3MKZWxzZToKICAgIFRyaWUgPSBEQVRyaWUKIyBweWxpbnQ6ZW5hYmxlPXdyb25nLWltcG9ydC1wb3NpdGlvbgpQSwMEFAAAAAAAAAAhAMyVPpbTAwAA0wMAAEAAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL190cmllL19iYXNlLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCB1bmljb2RlX2xpdGVyYWxzCgpmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBNYXBwaW5nCgoKY2xhc3MgVHJpZShNYXBwaW5nKToKICAgICIiIkFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIHRyaWVzIiIiCgogICAgZGVmIGtleXMoc2VsZiwgcHJlZml4PU5vbmUpOgogICAgICAgICMgcHlsaW50OmRpc2FibGU9YXJndW1lbnRzLWRpZmZlcgogICAgICAgIGtleXMgPSBzdXBlcihUcmllLCBzZWxmKS5rZXlzKCkKCiAgICAgICAgaWYgcHJlZml4IGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybiBzZXQoa2V5cykKCiAgICAgICAgIyBQeXRob24gMi42OiBubyBzZXQgY29tcHJlaGVuc2lvbnMKICAgICAgICByZXR1cm4gc2V0KFt4IGZvciB4IGluIGtleXMgaWYgeC5zdGFydHN3aXRoKHByZWZpeCldKQoKICAgIGRlZiBoYXNfa2V5c193aXRoX3ByZWZpeChzZWxmLCBwcmVmaXgpOgogICAgICAgIGZvciBrZXkgaW4gc2VsZi5rZXlzKCk6CiAgICAgICAgICAgIGlmIGtleS5zdGFydHN3aXRoKHByZWZpeCk6CiAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgbG9uZ2VzdF9wcmVmaXgoc2VsZiwgcHJlZml4KToKICAgICAgICBpZiBwcmVmaXggaW4gc2VsZjoKICAgICAgICAgICAgcmV0dXJuIHByZWZpeAoKICAgICAgICBmb3IgaSBpbiByYW5nZSgxLCBsZW4ocHJlZml4KSArIDEpOgogICAgICAgICAgICBpZiBwcmVmaXhbOi1pXSBpbiBzZWxmOgogICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeFs6LWldCgogICAgICAgIHJhaXNlIEtleUVycm9yKHByZWZpeCkKCiAgICBkZWYgbG9uZ2VzdF9wcmVmaXhfaXRlbShzZWxmLCBwcmVmaXgpOgogICAgICAgIGxwcmVmaXggPSBzZWxmLmxvbmdlc3RfcHJlZml4KHByZWZpeCkKICAgICAgICByZXR1cm4gKGxwcmVmaXgsIHNlbGZbbHByZWZpeF0pClBLAwQUAAAAAAAAACEAJFWdqZoEAACaBAAAQQAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvX3RyaWUvZGF0cmllLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCB1bmljb2RlX2xpdGVyYWxzCgpmcm9tIGRhdHJpZSBpbXBvcnQgVHJpZSBhcyBEQVRyaWUKZnJvbSBwaXAuX3ZlbmRvci5zaXggaW1wb3J0IHRleHRfdHlwZQoKZnJvbSAuX2Jhc2UgaW1wb3J0IFRyaWUgYXMgQUJDVHJpZQoKCmNsYXNzIFRyaWUoQUJDVHJpZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgZGF0YSk6CiAgICAgICAgY2hhcnMgPSBzZXQoKQogICAgICAgIGZvciBrZXkgaW4gZGF0YS5rZXlzKCk6CiAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGtleSwgdGV4dF90eXBlKToKICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiQWxsIGtleXMgbXVzdCBiZSBzdHJpbmdzIikKICAgICAgICAgICAgZm9yIGNoYXIgaW4ga2V5OgogICAgICAgICAgICAgICAgY2hhcnMuYWRkKGNoYXIpCgogICAgICAgIHNlbGYuX2RhdGEgPSBEQVRyaWUoIiIuam9pbihjaGFycykpCiAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gZGF0YS5pdGVtcygpOgogICAgICAgICAgICBzZWxmLl9kYXRhW2tleV0gPSB2YWx1ZQoKICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwga2V5KToKICAgICAgICByZXR1cm4ga2V5IGluIHNlbGYuX2RhdGEKCiAgICBkZWYgX19sZW5fXyhzZWxmKToKICAgICAgICByZXR1cm4gbGVuKHNlbGYuX2RhdGEpCgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoKQoKICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgogICAgICAgIHJldHVybiBzZWxmLl9kYXRhW2tleV0KCiAgICBkZWYga2V5cyhzZWxmLCBwcmVmaXg9Tm9uZSk6CiAgICAgICAgcmV0dXJuIHNlbGYuX2RhdGEua2V5cyhwcmVmaXgpCgogICAgZGVmIGhhc19rZXlzX3dpdGhfcHJlZml4KHNlbGYsIHByZWZpeCk6CiAgICAgICAgcmV0dXJuIHNlbGYuX2RhdGEuaGFzX2tleXNfd2l0aF9wcmVmaXgocHJlZml4KQoKICAgIGRlZiBsb25nZXN0X3ByZWZpeChzZWxmLCBwcmVmaXgpOgogICAgICAgIHJldHVybiBzZWxmLl9kYXRhLmxvbmdlc3RfcHJlZml4KHByZWZpeCkKCiAgICBkZWYgbG9uZ2VzdF9wcmVmaXhfaXRlbShzZWxmLCBwcmVmaXgpOgogICAgICAgIHJldHVybiBzZWxmLl9kYXRhLmxvbmdlc3RfcHJlZml4X2l0ZW0ocHJlZml4KQpQSwMEFAAAAAAAAAAhAEtPbs7vBgAA7wYAAD0AAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL190cmllL3B5LnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCB1bmljb2RlX2xpdGVyYWxzCmZyb20gcGlwLl92ZW5kb3Iuc2l4IGltcG9ydCB0ZXh0X3R5cGUKCmZyb20gYmlzZWN0IGltcG9ydCBiaXNlY3RfbGVmdAoKZnJvbSAuX2Jhc2UgaW1wb3J0IFRyaWUgYXMgQUJDVHJpZQoKCmNsYXNzIFRyaWUoQUJDVHJpZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgZGF0YSk6CiAgICAgICAgaWYgbm90IGFsbChpc2luc3RhbmNlKHgsIHRleHRfdHlwZSkgZm9yIHggaW4gZGF0YS5rZXlzKCkpOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIkFsbCBrZXlzIG11c3QgYmUgc3RyaW5ncyIpCgogICAgICAgIHNlbGYuX2RhdGEgPSBkYXRhCiAgICAgICAgc2VsZi5fa2V5cyA9IHNvcnRlZChkYXRhLmtleXMoKSkKICAgICAgICBzZWxmLl9jYWNoZXN0ciA9ICIiCiAgICAgICAgc2VsZi5fY2FjaGVwb2ludHMgPSAoMCwgbGVuKGRhdGEpKQoKICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwga2V5KToKICAgICAgICByZXR1cm4ga2V5IGluIHNlbGYuX2RhdGEKCiAgICBkZWYgX19sZW5fXyhzZWxmKToKICAgICAgICByZXR1cm4gbGVuKHNlbGYuX2RhdGEpCgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgIHJldHVybiBpdGVyKHNlbGYuX2RhdGEpCgogICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CiAgICAgICAgcmV0dXJuIHNlbGYuX2RhdGFba2V5XQoKICAgIGRlZiBrZXlzKHNlbGYsIHByZWZpeD1Ob25lKToKICAgICAgICBpZiBwcmVmaXggaXMgTm9uZSBvciBwcmVmaXggPT0gIiIgb3Igbm90IHNlbGYuX2tleXM6CiAgICAgICAgICAgIHJldHVybiBzZXQoc2VsZi5fa2V5cykKCiAgICAgICAgaWYgcHJlZml4LnN0YXJ0c3dpdGgoc2VsZi5fY2FjaGVzdHIpOgogICAgICAgICAgICBsbywgaGkgPSBzZWxmLl9jYWNoZXBvaW50cwogICAgICAgICAgICBzdGFydCA9IGkgPSBiaXNlY3RfbGVmdChzZWxmLl9rZXlzLCBwcmVmaXgsIGxvLCBoaSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzdGFydCA9IGkgPSBiaXNlY3RfbGVmdChzZWxmLl9rZXlzLCBwcmVmaXgpCgogICAgICAgIGtleXMgPSBzZXQoKQogICAgICAgIGlmIHN0YXJ0ID09IGxlbihzZWxmLl9rZXlzKToKICAgICAgICAgICAgcmV0dXJuIGtleXMKCiAgICAgICAgd2hpbGUgc2VsZi5fa2V5c1tpXS5zdGFydHN3aXRoKHByZWZpeCk6CiAgICAgICAgICAgIGtleXMuYWRkKHNlbGYuX2tleXNbaV0pCiAgICAgICAgICAgIGkgKz0gMQoKICAgICAgICBzZWxmLl9jYWNoZXN0ciA9IHByZWZpeAogICAgICAgIHNlbGYuX2NhY2hlcG9pbnRzID0gKHN0YXJ0LCBpKQoKICAgICAgICByZXR1cm4ga2V5cwoKICAgIGRlZiBoYXNfa2V5c193aXRoX3ByZWZpeChzZWxmLCBwcmVmaXgpOgogICAgICAgIGlmIHByZWZpeCBpbiBzZWxmLl9kYXRhOgogICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICAgICBpZiBwcmVmaXguc3RhcnRzd2l0aChzZWxmLl9jYWNoZXN0cik6CiAgICAgICAgICAgIGxvLCBoaSA9IHNlbGYuX2NhY2hlcG9pbnRzCiAgICAgICAgICAgIGkgPSBiaXNlY3RfbGVmdChzZWxmLl9rZXlzLCBwcmVmaXgsIGxvLCBoaSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBpID0gYmlzZWN0X2xlZnQoc2VsZi5fa2V5cywgcHJlZml4KQoKICAgICAgICBpZiBpID09IGxlbihzZWxmLl9rZXlzKToKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgIHJldHVybiBzZWxmLl9rZXlzW2ldLnN0YXJ0c3dpdGgocHJlZml4KQpQSwMEFAAAAAAAAAAhACbjrlgAEAAAABAAADsAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL191dGlscy5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgdW5pY29kZV9saXRlcmFscwoKaW1wb3J0IHN5cwpmcm9tIHR5cGVzIGltcG9ydCBNb2R1bGVUeXBlCgpmcm9tIHBpcC5fdmVuZG9yLnNpeCBpbXBvcnQgdGV4dF90eXBlCgp0cnk6CiAgICBpbXBvcnQgeG1sLmV0cmVlLmNFbGVtZW50VHJlZSBhcyBkZWZhdWx0X2V0cmVlCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGltcG9ydCB4bWwuZXRyZWUuRWxlbWVudFRyZWUgYXMgZGVmYXVsdF9ldHJlZQoKCl9fYWxsX18gPSBbImRlZmF1bHRfZXRyZWUiLCAiTWV0aG9kRGlzcGF0Y2hlciIsICJpc1N1cnJvZ2F0ZVBhaXIiLAogICAgICAgICAgICJzdXJyb2dhdGVQYWlyVG9Db2RlcG9pbnQiLCAibW9kdWxlRmFjdG9yeUZhY3RvcnkiLAogICAgICAgICAgICJzdXBwb3J0c19sb25lX3N1cnJvZ2F0ZXMiLCAiUFkyNyJdCgoKUFkyNyA9IHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMiBhbmQgc3lzLnZlcnNpb25faW5mb1sxXSA+PSA3CgojIFBsYXRmb3JtcyBub3Qgc3VwcG9ydGluZyBsb25lIHN1cnJvZ2F0ZXMgKFx1RDgwMC1cdURGRkYpIHNob3VsZCBiZQojIGNhdWdodCBieSB0aGUgYmVsb3cgdGVzdC4gSW4gZ2VuZXJhbCB0aGlzIHdvdWxkIGJlIGFueSBwbGF0Zm9ybQojIHVzaW5nIFVURi0xNiBhcyBpdHMgZW5jb2Rpbmcgb2YgdW5pY29kZSBzdHJpbmdzLCBzdWNoIGFzCiMgSnl0aG9uLiBUaGlzIGlzIGJlY2F1c2UgVVRGLTE2IGl0c2VsZiBpcyBiYXNlZCBvbiB0aGUgdXNlIG9mIHN1Y2gKIyBzdXJyb2dhdGVzLCBhbmQgdGhlcmUgaXMgbm8gbWVjaGFuaXNtIHRvIGZ1cnRoZXIgZXNjYXBlIHN1Y2gKIyBlc2NhcGVzLgp0cnk6CiAgICBfeCA9IGV2YWwoJyJcXHVEODAwIicpICAjIHB5bGludDpkaXNhYmxlPWV2YWwtdXNlZAogICAgaWYgbm90IGlzaW5zdGFuY2UoX3gsIHRleHRfdHlwZSk6CiAgICAgICAgIyBXZSBuZWVkIHRoaXMgd2l0aCB1IiIgYmVjYXVzZSBvZiBodHRwOi8vYnVncy5qeXRob24ub3JnL2lzc3VlMjAzOQogICAgICAgIF94ID0gZXZhbCgndSJcXHVEODAwIicpICAjIHB5bGludDpkaXNhYmxlPWV2YWwtdXNlZAogICAgICAgIGFzc2VydCBpc2luc3RhbmNlKF94LCB0ZXh0X3R5cGUpCmV4Y2VwdDogICMgcHlsaW50OmRpc2FibGU9YmFyZS1leGNlcHQKICAgIHN1cHBvcnRzX2xvbmVfc3Vycm9nYXRlcyA9IEZhbHNlCmVsc2U6CiAgICBzdXBwb3J0c19sb25lX3N1cnJvZ2F0ZXMgPSBUcnVlCgoKY2xhc3MgTWV0aG9kRGlzcGF0Y2hlcihkaWN0KToKICAgICIiIkRpY3Qgd2l0aCAyIHNwZWNpYWwgcHJvcGVydGllczoKCiAgICBPbiBpbml0aWF0aW9uLCBrZXlzIHRoYXQgYXJlIGxpc3RzLCBzZXRzIG9yIHR1cGxlcyBhcmUgY29udmVydGVkIHRvCiAgICBtdWx0aXBsZSBrZXlzIHNvIGFjY2Vzc2luZyBhbnkgb25lIG9mIHRoZSBpdGVtcyBpbiB0aGUgb3JpZ2luYWwKICAgIGxpc3QtbGlrZSBvYmplY3QgcmV0dXJucyB0aGUgbWF0Y2hpbmcgdmFsdWUKCiAgICBtZCA9IE1ldGhvZERpc3BhdGNoZXIoeygiZm9vIiwgImJhciIpOiJiYXoifSkKICAgIG1kWyJmb28iXSA9PSAiYmF6IgoKICAgIEEgZGVmYXVsdCB2YWx1ZSB3aGljaCBjYW4gYmUgc2V0IHRocm91Z2ggdGhlIGRlZmF1bHQgYXR0cmlidXRlLgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGl0ZW1zPSgpKToKICAgICAgICAjIFVzaW5nIF9kaWN0RW50cmllcyBpbnN0ZWFkIG9mIGRpcmVjdGx5IGFzc2lnbmluZyB0byBzZWxmIGlzIGFib3V0CiAgICAgICAgIyB0d2ljZSBhcyBmYXN0LiBQbGVhc2UgZG8gY2FyZWZ1bCBwZXJmb3JtYW5jZSB0ZXN0aW5nIGJlZm9yZSBjaGFuZ2luZwogICAgICAgICMgYW55dGhpbmcgaGVyZS4KICAgICAgICBfZGljdEVudHJpZXMgPSBbXQogICAgICAgIGZvciBuYW1lLCB2YWx1ZSBpbiBpdGVtczoKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShuYW1lLCAobGlzdCwgdHVwbGUsIGZyb3plbnNldCwgc2V0KSk6CiAgICAgICAgICAgICAgICBmb3IgaXRlbSBpbiBuYW1lOgogICAgICAgICAgICAgICAgICAgIF9kaWN0RW50cmllcy5hcHBlbmQoKGl0ZW0sIHZhbHVlKSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIF9kaWN0RW50cmllcy5hcHBlbmQoKG5hbWUsIHZhbHVlKSkKICAgICAgICBkaWN0Ll9faW5pdF9fKHNlbGYsIF9kaWN0RW50cmllcykKICAgICAgICBhc3NlcnQgbGVuKHNlbGYpID09IGxlbihfZGljdEVudHJpZXMpCiAgICAgICAgc2VsZi5kZWZhdWx0ID0gTm9uZQoKICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgogICAgICAgIHJldHVybiBkaWN0LmdldChzZWxmLCBrZXksIHNlbGYuZGVmYXVsdCkKCgojIFNvbWUgdXRpbGl0eSBmdW5jdGlvbnMgdG8gZGVhbCB3aXRoIHdlaXJkbmVzcyBhcm91bmQgVUNTMiB2cyBVQ1M0CiMgcHl0aG9uIGJ1aWxkcwoKZGVmIGlzU3Vycm9nYXRlUGFpcihkYXRhKToKICAgIHJldHVybiAobGVuKGRhdGEpID09IDIgYW5kCiAgICAgICAgICAgIG9yZChkYXRhWzBdKSA+PSAweEQ4MDAgYW5kIG9yZChkYXRhWzBdKSA8PSAweERCRkYgYW5kCiAgICAgICAgICAgIG9yZChkYXRhWzFdKSA+PSAweERDMDAgYW5kIG9yZChkYXRhWzFdKSA8PSAweERGRkYpCgoKZGVmIHN1cnJvZ2F0ZVBhaXJUb0NvZGVwb2ludChkYXRhKToKICAgIGNoYXJfdmFsID0gKDB4MTAwMDAgKyAob3JkKGRhdGFbMF0pIC0gMHhEODAwKSAqIDB4NDAwICsKICAgICAgICAgICAgICAgIChvcmQoZGF0YVsxXSkgLSAweERDMDApKQogICAgcmV0dXJuIGNoYXJfdmFsCgojIE1vZHVsZSBGYWN0b3J5IEZhY3RvcnkgKG5vLCB0aGlzIGlzbid0IEphdmEsIEkga25vdykKIyBIZXJlIHRvIHN0b3AgdGhpcyBiZWluZyBkdXBsaWNhdGVkIGFsbCBvdmVyIHRoZSBwbGFjZS4KCgpkZWYgbW9kdWxlRmFjdG9yeUZhY3RvcnkoZmFjdG9yeSk6CiAgICBtb2R1bGVDYWNoZSA9IHt9CgogICAgZGVmIG1vZHVsZUZhY3RvcnkoYmFzZU1vZHVsZSwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICBpZiBpc2luc3RhbmNlKE1vZHVsZVR5cGUuX19uYW1lX18sIHR5cGUoIiIpKToKICAgICAgICAgICAgbmFtZSA9ICJfJXNfZmFjdG9yeSIgJSBiYXNlTW9kdWxlLl9fbmFtZV9fCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbmFtZSA9IGIiXyVzX2ZhY3RvcnkiICUgYmFzZU1vZHVsZS5fX25hbWVfXwoKICAgICAgICBrd2FyZ3NfdHVwbGUgPSB0dXBsZShrd2FyZ3MuaXRlbXMoKSkKCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gbW9kdWxlQ2FjaGVbbmFtZV1bYXJnc11ba3dhcmdzX3R1cGxlXQogICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgbW9kID0gTW9kdWxlVHlwZShuYW1lKQogICAgICAgICAgICBvYmpzID0gZmFjdG9yeShiYXNlTW9kdWxlLCAqYXJncywgKiprd2FyZ3MpCiAgICAgICAgICAgIG1vZC5fX2RpY3RfXy51cGRhdGUob2JqcykKICAgICAgICAgICAgaWYgIm5hbWUiIG5vdCBpbiBtb2R1bGVDYWNoZToKICAgICAgICAgICAgICAgIG1vZHVsZUNhY2hlW25hbWVdID0ge30KICAgICAgICAgICAgaWYgImFyZ3MiIG5vdCBpbiBtb2R1bGVDYWNoZVtuYW1lXToKICAgICAgICAgICAgICAgIG1vZHVsZUNhY2hlW25hbWVdW2FyZ3NdID0ge30KICAgICAgICAgICAgaWYgImt3YXJncyIgbm90IGluIG1vZHVsZUNhY2hlW25hbWVdW2FyZ3NdOgogICAgICAgICAgICAgICAgbW9kdWxlQ2FjaGVbbmFtZV1bYXJnc11ba3dhcmdzX3R1cGxlXSA9IHt9CiAgICAgICAgICAgIG1vZHVsZUNhY2hlW25hbWVdW2FyZ3NdW2t3YXJnc190dXBsZV0gPSBtb2QKICAgICAgICAgICAgcmV0dXJuIG1vZAoKICAgIHJldHVybiBtb2R1bGVGYWN0b3J5CgoKZGVmIG1lbW9pemUoZnVuYyk6CiAgICBjYWNoZSA9IHt9CgogICAgZGVmIHdyYXBwZWQoKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICBrZXkgPSAodHVwbGUoYXJncyksIHR1cGxlKGt3YXJncy5pdGVtcygpKSkKICAgICAgICBpZiBrZXkgbm90IGluIGNhY2hlOgogICAgICAgICAgICBjYWNoZVtrZXldID0gZnVuYygqYXJncywgKiprd2FyZ3MpCiAgICAgICAgcmV0dXJuIGNhY2hlW2tleV0KCiAgICByZXR1cm4gd3JhcHBlZApQSwMEFAAAAAAAAAAhAMikff67RQEAu0UBAD4AAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL2NvbnN0YW50cy5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgdW5pY29kZV9saXRlcmFscwoKaW1wb3J0IHN0cmluZwoKRU9GID0gTm9uZQoKRSA9IHsKICAgICJudWxsLWNoYXJhY3RlciI6CiAgICAgICAgIk51bGwgY2hhcmFjdGVyIGluIGlucHV0IHN0cmVhbSwgcmVwbGFjZWQgd2l0aCBVK0ZGRkQuIiwKICAgICJpbnZhbGlkLWNvZGVwb2ludCI6CiAgICAgICAgIkludmFsaWQgY29kZXBvaW50IGluIHN0cmVhbS4iLAogICAgImluY29ycmVjdGx5LXBsYWNlZC1zb2xpZHVzIjoKICAgICAgICAiU29saWR1cyAoLykgaW5jb3JyZWN0bHkgcGxhY2VkIGluIHRhZy4iLAogICAgImluY29ycmVjdC1jci1uZXdsaW5lLWVudGl0eSI6CiAgICAgICAgIkluY29ycmVjdCBDUiBuZXdsaW5lIGVudGl0eSwgcmVwbGFjZWQgd2l0aCBMRi4iLAogICAgImlsbGVnYWwtd2luZG93cy0xMjUyLWVudGl0eSI6CiAgICAgICAgIkVudGl0eSB1c2VkIHdpdGggaWxsZWdhbCBudW1iZXIgKHdpbmRvd3MtMTI1MiByZWZlcmVuY2UpLiIsCiAgICAiY2FudC1jb252ZXJ0LW51bWVyaWMtZW50aXR5IjoKICAgICAgICAiTnVtZXJpYyBlbnRpdHkgY291bGRuJ3QgYmUgY29udmVydGVkIHRvIGNoYXJhY3RlciAiCiAgICAgICAgIihjb2RlcG9pbnQgVSslKGNoYXJBc0ludCkwOHgpLiIsCiAgICAiaWxsZWdhbC1jb2RlcG9pbnQtZm9yLW51bWVyaWMtZW50aXR5IjoKICAgICAgICAiTnVtZXJpYyBlbnRpdHkgcmVwcmVzZW50cyBhbiBpbGxlZ2FsIGNvZGVwb2ludDogIgogICAgICAgICJVKyUoY2hhckFzSW50KTA4eC4iLAogICAgIm51bWVyaWMtZW50aXR5LXdpdGhvdXQtc2VtaWNvbG9uIjoKICAgICAgICAiTnVtZXJpYyBlbnRpdHkgZGlkbid0IGVuZCB3aXRoICc7Jy4iLAogICAgImV4cGVjdGVkLW51bWVyaWMtZW50aXR5LWJ1dC1nb3QtZW9mIjoKICAgICAgICAiTnVtZXJpYyBlbnRpdHkgZXhwZWN0ZWQuIEdvdCBlbmQgb2YgZmlsZSBpbnN0ZWFkLiIsCiAgICAiZXhwZWN0ZWQtbnVtZXJpYy1lbnRpdHkiOgogICAgICAgICJOdW1lcmljIGVudGl0eSBleHBlY3RlZCBidXQgbm9uZSBmb3VuZC4iLAogICAgIm5hbWVkLWVudGl0eS13aXRob3V0LXNlbWljb2xvbiI6CiAgICAgICAgIk5hbWVkIGVudGl0eSBkaWRuJ3QgZW5kIHdpdGggJzsnLiIsCiAgICAiZXhwZWN0ZWQtbmFtZWQtZW50aXR5IjoKICAgICAgICAiTmFtZWQgZW50aXR5IGV4cGVjdGVkLiBHb3Qgbm9uZS4iLAogICAgImF0dHJpYnV0ZXMtaW4tZW5kLXRhZyI6CiAgICAgICAgIkVuZCB0YWcgY29udGFpbnMgdW5leHBlY3RlZCBhdHRyaWJ1dGVzLiIsCiAgICAnc2VsZi1jbG9zaW5nLWZsYWctb24tZW5kLXRhZyc6CiAgICAgICAgIkVuZCB0YWcgY29udGFpbnMgdW5leHBlY3RlZCBzZWxmLWNsb3NpbmcgZmxhZy4iLAogICAgImV4cGVjdGVkLXRhZy1uYW1lLWJ1dC1nb3QtcmlnaHQtYnJhY2tldCI6CiAgICAgICAgIkV4cGVjdGVkIHRhZyBuYW1lLiBHb3QgJz4nIGluc3RlYWQuIiwKICAgICJleHBlY3RlZC10YWctbmFtZS1idXQtZ290LXF1ZXN0aW9uLW1hcmsiOgogICAgICAgICJFeHBlY3RlZCB0YWcgbmFtZS4gR290ICc/JyBpbnN0ZWFkLiAoSFRNTCBkb2Vzbid0ICIKICAgICAgICAic3VwcG9ydCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucy4pIiwKICAgICJleHBlY3RlZC10YWctbmFtZSI6CiAgICAgICAgIkV4cGVjdGVkIHRhZyBuYW1lLiBHb3Qgc29tZXRoaW5nIGVsc2UgaW5zdGVhZCIsCiAgICAiZXhwZWN0ZWQtY2xvc2luZy10YWctYnV0LWdvdC1yaWdodC1icmFja2V0IjoKICAgICAgICAiRXhwZWN0ZWQgY2xvc2luZyB0YWcuIEdvdCAnPicgaW5zdGVhZC4gSWdub3JpbmcgJzwvPicuIiwKICAgICJleHBlY3RlZC1jbG9zaW5nLXRhZy1idXQtZ290LWVvZiI6CiAgICAgICAgIkV4cGVjdGVkIGNsb3NpbmcgdGFnLiBVbmV4cGVjdGVkIGVuZCBvZiBmaWxlLiIsCiAgICAiZXhwZWN0ZWQtY2xvc2luZy10YWctYnV0LWdvdC1jaGFyIjoKICAgICAgICAiRXhwZWN0ZWQgY2xvc2luZyB0YWcuIFVuZXhwZWN0ZWQgY2hhcmFjdGVyICclKGRhdGEpcycgZm91bmQuIiwKICAgICJlb2YtaW4tdGFnLW5hbWUiOgogICAgICAgICJVbmV4cGVjdGVkIGVuZCBvZiBmaWxlIGluIHRoZSB0YWcgbmFtZS4iLAogICAgImV4cGVjdGVkLWF0dHJpYnV0ZS1uYW1lLWJ1dC1nb3QtZW9mIjoKICAgICAgICAiVW5leHBlY3RlZCBlbmQgb2YgZmlsZS4gRXhwZWN0ZWQgYXR0cmlidXRlIG5hbWUgaW5zdGVhZC4iLAogICAgImVvZi1pbi1hdHRyaWJ1dGUtbmFtZSI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUgaW4gYXR0cmlidXRlIG5hbWUuIiwKICAgICJpbnZhbGlkLWNoYXJhY3Rlci1pbi1hdHRyaWJ1dGUtbmFtZSI6CiAgICAgICAgIkludmFsaWQgY2hhcmFjdGVyIGluIGF0dHJpYnV0ZSBuYW1lIiwKICAgICJkdXBsaWNhdGUtYXR0cmlidXRlIjoKICAgICAgICAiRHJvcHBlZCBkdXBsaWNhdGUgYXR0cmlidXRlIG9uIHRhZy4iLAogICAgImV4cGVjdGVkLWVuZC1vZi10YWctbmFtZS1idXQtZ290LWVvZiI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUuIEV4cGVjdGVkID0gb3IgZW5kIG9mIHRhZy4iLAogICAgImV4cGVjdGVkLWF0dHJpYnV0ZS12YWx1ZS1idXQtZ290LWVvZiI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUuIEV4cGVjdGVkIGF0dHJpYnV0ZSB2YWx1ZS4iLAogICAgImV4cGVjdGVkLWF0dHJpYnV0ZS12YWx1ZS1idXQtZ290LXJpZ2h0LWJyYWNrZXQiOgogICAgICAgICJFeHBlY3RlZCBhdHRyaWJ1dGUgdmFsdWUuIEdvdCAnPicgaW5zdGVhZC4iLAogICAgJ2VxdWFscy1pbi11bnF1b3RlZC1hdHRyaWJ1dGUtdmFsdWUnOgogICAgICAgICJVbmV4cGVjdGVkID0gaW4gdW5xdW90ZWQgYXR0cmlidXRlIiwKICAgICd1bmV4cGVjdGVkLWNoYXJhY3Rlci1pbi11bnF1b3RlZC1hdHRyaWJ1dGUtdmFsdWUnOgogICAgICAgICJVbmV4cGVjdGVkIGNoYXJhY3RlciBpbiB1bnF1b3RlZCBhdHRyaWJ1dGUiLAogICAgImludmFsaWQtY2hhcmFjdGVyLWFmdGVyLWF0dHJpYnV0ZS1uYW1lIjoKICAgICAgICAiVW5leHBlY3RlZCBjaGFyYWN0ZXIgYWZ0ZXIgYXR0cmlidXRlIG5hbWUuIiwKICAgICJ1bmV4cGVjdGVkLWNoYXJhY3Rlci1hZnRlci1hdHRyaWJ1dGUtdmFsdWUiOgogICAgICAgICJVbmV4cGVjdGVkIGNoYXJhY3RlciBhZnRlciBhdHRyaWJ1dGUgdmFsdWUuIiwKICAgICJlb2YtaW4tYXR0cmlidXRlLXZhbHVlLWRvdWJsZS1xdW90ZSI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUgaW4gYXR0cmlidXRlIHZhbHVlIChcIikuIiwKICAgICJlb2YtaW4tYXR0cmlidXRlLXZhbHVlLXNpbmdsZS1xdW90ZSI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUgaW4gYXR0cmlidXRlIHZhbHVlICgnKS4iLAogICAgImVvZi1pbi1hdHRyaWJ1dGUtdmFsdWUtbm8tcXVvdGVzIjoKICAgICAgICAiVW5leHBlY3RlZCBlbmQgb2YgZmlsZSBpbiBhdHRyaWJ1dGUgdmFsdWUuIiwKICAgICJ1bmV4cGVjdGVkLUVPRi1hZnRlci1zb2xpZHVzLWluLXRhZyI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUgaW4gdGFnLiBFeHBlY3RlZCA+IiwKICAgICJ1bmV4cGVjdGVkLWNoYXJhY3Rlci1hZnRlci1zb2xpZHVzLWluLXRhZyI6CiAgICAgICAgIlVuZXhwZWN0ZWQgY2hhcmFjdGVyIGFmdGVyIC8gaW4gdGFnLiBFeHBlY3RlZCA+IiwKICAgICJleHBlY3RlZC1kYXNoZXMtb3ItZG9jdHlwZSI6CiAgICAgICAgIkV4cGVjdGVkICctLScgb3IgJ0RPQ1RZUEUnLiBOb3QgZm91bmQuIiwKICAgICJ1bmV4cGVjdGVkLWJhbmctYWZ0ZXItZG91YmxlLWRhc2gtaW4tY29tbWVudCI6CiAgICAgICAgIlVuZXhwZWN0ZWQgISBhZnRlciAtLSBpbiBjb21tZW50IiwKICAgICJ1bmV4cGVjdGVkLXNwYWNlLWFmdGVyLWRvdWJsZS1kYXNoLWluLWNvbW1lbnQiOgogICAgICAgICJVbmV4cGVjdGVkIHNwYWNlIGFmdGVyIC0tIGluIGNvbW1lbnQiLAogICAgImluY29ycmVjdC1jb21tZW50IjoKICAgICAgICAiSW5jb3JyZWN0IGNvbW1lbnQuIiwKICAgICJlb2YtaW4tY29tbWVudCI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUgaW4gY29tbWVudC4iLAogICAgImVvZi1pbi1jb21tZW50LWVuZC1kYXNoIjoKICAgICAgICAiVW5leHBlY3RlZCBlbmQgb2YgZmlsZSBpbiBjb21tZW50ICgtKSIsCiAgICAidW5leHBlY3RlZC1kYXNoLWFmdGVyLWRvdWJsZS1kYXNoLWluLWNvbW1lbnQiOgogICAgICAgICJVbmV4cGVjdGVkICctJyBhZnRlciAnLS0nIGZvdW5kIGluIGNvbW1lbnQuIiwKICAgICJlb2YtaW4tY29tbWVudC1kb3VibGUtZGFzaCI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUgaW4gY29tbWVudCAoLS0pLiIsCiAgICAiZW9mLWluLWNvbW1lbnQtZW5kLXNwYWNlLXN0YXRlIjoKICAgICAgICAiVW5leHBlY3RlZCBlbmQgb2YgZmlsZSBpbiBjb21tZW50LiIsCiAgICAiZW9mLWluLWNvbW1lbnQtZW5kLWJhbmctc3RhdGUiOgogICAgICAgICJVbmV4cGVjdGVkIGVuZCBvZiBmaWxlIGluIGNvbW1lbnQuIiwKICAgICJ1bmV4cGVjdGVkLWNoYXItaW4tY29tbWVudCI6CiAgICAgICAgIlVuZXhwZWN0ZWQgY2hhcmFjdGVyIGluIGNvbW1lbnQgZm91bmQuIiwKICAgICJuZWVkLXNwYWNlLWFmdGVyLWRvY3R5cGUiOgogICAgICAgICJObyBzcGFjZSBhZnRlciBsaXRlcmFsIHN0cmluZyAnRE9DVFlQRScuIiwKICAgICJleHBlY3RlZC1kb2N0eXBlLW5hbWUtYnV0LWdvdC1yaWdodC1icmFja2V0IjoKICAgICAgICAiVW5leHBlY3RlZCA+IGNoYXJhY3Rlci4gRXhwZWN0ZWQgRE9DVFlQRSBuYW1lLiIsCiAgICAiZXhwZWN0ZWQtZG9jdHlwZS1uYW1lLWJ1dC1nb3QtZW9mIjoKICAgICAgICAiVW5leHBlY3RlZCBlbmQgb2YgZmlsZS4gRXhwZWN0ZWQgRE9DVFlQRSBuYW1lLiIsCiAgICAiZW9mLWluLWRvY3R5cGUtbmFtZSI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUgaW4gRE9DVFlQRSBuYW1lLiIsCiAgICAiZW9mLWluLWRvY3R5cGUiOgogICAgICAgICJVbmV4cGVjdGVkIGVuZCBvZiBmaWxlIGluIERPQ1RZUEUuIiwKICAgICJleHBlY3RlZC1zcGFjZS1vci1yaWdodC1icmFja2V0LWluLWRvY3R5cGUiOgogICAgICAgICJFeHBlY3RlZCBzcGFjZSBvciAnPicuIEdvdCAnJShkYXRhKXMnIiwKICAgICJ1bmV4cGVjdGVkLWVuZC1vZi1kb2N0eXBlIjoKICAgICAgICAiVW5leHBlY3RlZCBlbmQgb2YgRE9DVFlQRS4iLAogICAgInVuZXhwZWN0ZWQtY2hhci1pbi1kb2N0eXBlIjoKICAgICAgICAiVW5leHBlY3RlZCBjaGFyYWN0ZXIgaW4gRE9DVFlQRS4iLAogICAgImVvZi1pbi1pbm5lcmh0bWwiOgogICAgICAgICJYWFggaW5uZXJIVE1MIEVPRiIsCiAgICAidW5leHBlY3RlZC1kb2N0eXBlIjoKICAgICAgICAiVW5leHBlY3RlZCBET0NUWVBFLiBJZ25vcmVkLiIsCiAgICAibm9uLWh0bWwtcm9vdCI6CiAgICAgICAgImh0bWwgbmVlZHMgdG8gYmUgdGhlIGZpcnN0IHN0YXJ0IHRhZy4iLAogICAgImV4cGVjdGVkLWRvY3R5cGUtYnV0LWdvdC1lb2YiOgogICAgICAgICJVbmV4cGVjdGVkIEVuZCBvZiBmaWxlLiBFeHBlY3RlZCBET0NUWVBFLiIsCiAgICAidW5rbm93bi1kb2N0eXBlIjoKICAgICAgICAiRXJyb25lb3VzIERPQ1RZUEUuIiwKICAgICJleHBlY3RlZC1kb2N0eXBlLWJ1dC1nb3QtY2hhcnMiOgogICAgICAgICJVbmV4cGVjdGVkIG5vbi1zcGFjZSBjaGFyYWN0ZXJzLiBFeHBlY3RlZCBET0NUWVBFLiIsCiAgICAiZXhwZWN0ZWQtZG9jdHlwZS1idXQtZ290LXN0YXJ0LXRhZyI6CiAgICAgICAgIlVuZXhwZWN0ZWQgc3RhcnQgdGFnICglKG5hbWUpcykuIEV4cGVjdGVkIERPQ1RZUEUuIiwKICAgICJleHBlY3RlZC1kb2N0eXBlLWJ1dC1nb3QtZW5kLXRhZyI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIHRhZyAoJShuYW1lKXMpLiBFeHBlY3RlZCBET0NUWVBFLiIsCiAgICAiZW5kLXRhZy1hZnRlci1pbXBsaWVkLXJvb3QiOgogICAgICAgICJVbmV4cGVjdGVkIGVuZCB0YWcgKCUobmFtZSlzKSBhZnRlciB0aGUgKGltcGxpZWQpIHJvb3QgZWxlbWVudC4iLAogICAgImV4cGVjdGVkLW5hbWVkLWNsb3NpbmctdGFnLWJ1dC1nb3QtZW9mIjoKICAgICAgICAiVW5leHBlY3RlZCBlbmQgb2YgZmlsZS4gRXhwZWN0ZWQgZW5kIHRhZyAoJShuYW1lKXMpLiIsCiAgICAidHdvLWhlYWRzLWFyZS1ub3QtYmV0dGVyLXRoYW4tb25lIjoKICAgICAgICAiVW5leHBlY3RlZCBzdGFydCB0YWcgaGVhZCBpbiBleGlzdGluZyBoZWFkLiBJZ25vcmVkLiIsCiAgICAidW5leHBlY3RlZC1lbmQtdGFnIjoKICAgICAgICAiVW5leHBlY3RlZCBlbmQgdGFnICglKG5hbWUpcykuIElnbm9yZWQuIiwKICAgICJ1bmV4cGVjdGVkLXN0YXJ0LXRhZy1vdXQtb2YtbXktaGVhZCI6CiAgICAgICAgIlVuZXhwZWN0ZWQgc3RhcnQgdGFnICglKG5hbWUpcykgdGhhdCBjYW4gYmUgaW4gaGVhZC4gTW92ZWQuIiwKICAgICJ1bmV4cGVjdGVkLXN0YXJ0LXRhZyI6CiAgICAgICAgIlVuZXhwZWN0ZWQgc3RhcnQgdGFnICglKG5hbWUpcykuIiwKICAgICJtaXNzaW5nLWVuZC10YWciOgogICAgICAgICJNaXNzaW5nIGVuZCB0YWcgKCUobmFtZSlzKS4iLAogICAgIm1pc3NpbmctZW5kLXRhZ3MiOgogICAgICAgICJNaXNzaW5nIGVuZCB0YWdzICglKG5hbWUpcykuIiwKICAgICJ1bmV4cGVjdGVkLXN0YXJ0LXRhZy1pbXBsaWVzLWVuZC10YWciOgogICAgICAgICJVbmV4cGVjdGVkIHN0YXJ0IHRhZyAoJShzdGFydE5hbWUpcykgIgogICAgICAgICJpbXBsaWVzIGVuZCB0YWcgKCUoZW5kTmFtZSlzKS4iLAogICAgInVuZXhwZWN0ZWQtc3RhcnQtdGFnLXRyZWF0ZWQtYXMiOgogICAgICAgICJVbmV4cGVjdGVkIHN0YXJ0IHRhZyAoJShvcmlnaW5hbE5hbWUpcykuIFRyZWF0ZWQgYXMgJShuZXdOYW1lKXMuIiwKICAgICJkZXByZWNhdGVkLXRhZyI6CiAgICAgICAgIlVuZXhwZWN0ZWQgc3RhcnQgdGFnICUobmFtZSlzLiBEb24ndCB1c2UgaXQhIiwKICAgICJ1bmV4cGVjdGVkLXN0YXJ0LXRhZy1pZ25vcmVkIjoKICAgICAgICAiVW5leHBlY3RlZCBzdGFydCB0YWcgJShuYW1lKXMuIElnbm9yZWQuIiwKICAgICJleHBlY3RlZC1vbmUtZW5kLXRhZy1idXQtZ290LWFub3RoZXIiOgogICAgICAgICJVbmV4cGVjdGVkIGVuZCB0YWcgKCUoZ290TmFtZSlzKS4gIgogICAgICAgICJNaXNzaW5nIGVuZCB0YWcgKCUoZXhwZWN0ZWROYW1lKXMpLiIsCiAgICAiZW5kLXRhZy10b28tZWFybHkiOgogICAgICAgICJFbmQgdGFnICglKG5hbWUpcykgc2VlbiB0b28gZWFybHkuIEV4cGVjdGVkIG90aGVyIGVuZCB0YWcuIiwKICAgICJlbmQtdGFnLXRvby1lYXJseS1uYW1lZCI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIHRhZyAoJShnb3ROYW1lKXMpLiBFeHBlY3RlZCBlbmQgdGFnICglKGV4cGVjdGVkTmFtZSlzKS4iLAogICAgImVuZC10YWctdG9vLWVhcmx5LWlnbm9yZWQiOgogICAgICAgICJFbmQgdGFnICglKG5hbWUpcykgc2VlbiB0b28gZWFybHkuIElnbm9yZWQuIiwKICAgICJhZG9wdGlvbi1hZ2VuY3ktMS4xIjoKICAgICAgICAiRW5kIHRhZyAoJShuYW1lKXMpIHZpb2xhdGVzIHN0ZXAgMSwgIgogICAgICAgICJwYXJhZ3JhcGggMSBvZiB0aGUgYWRvcHRpb24gYWdlbmN5IGFsZ29yaXRobS4iLAogICAgImFkb3B0aW9uLWFnZW5jeS0xLjIiOgogICAgICAgICJFbmQgdGFnICglKG5hbWUpcykgdmlvbGF0ZXMgc3RlcCAxLCAiCiAgICAgICAgInBhcmFncmFwaCAyIG9mIHRoZSBhZG9wdGlvbiBhZ2VuY3kgYWxnb3JpdGhtLiIsCiAgICAiYWRvcHRpb24tYWdlbmN5LTEuMyI6CiAgICAgICAgIkVuZCB0YWcgKCUobmFtZSlzKSB2aW9sYXRlcyBzdGVwIDEsICIKICAgICAgICAicGFyYWdyYXBoIDMgb2YgdGhlIGFkb3B0aW9uIGFnZW5jeSBhbGdvcml0aG0uIiwKICAgICJhZG9wdGlvbi1hZ2VuY3ktNC40IjoKICAgICAgICAiRW5kIHRhZyAoJShuYW1lKXMpIHZpb2xhdGVzIHN0ZXAgNCwgIgogICAgICAgICJwYXJhZ3JhcGggNCBvZiB0aGUgYWRvcHRpb24gYWdlbmN5IGFsZ29yaXRobS4iLAogICAgInVuZXhwZWN0ZWQtZW5kLXRhZy10cmVhdGVkLWFzIjoKICAgICAgICAiVW5leHBlY3RlZCBlbmQgdGFnICglKG9yaWdpbmFsTmFtZSlzKS4gVHJlYXRlZCBhcyAlKG5ld05hbWUpcy4iLAogICAgIm5vLWVuZC10YWciOgogICAgICAgICJUaGlzIGVsZW1lbnQgKCUobmFtZSlzKSBoYXMgbm8gZW5kIHRhZy4iLAogICAgInVuZXhwZWN0ZWQtaW1wbGllZC1lbmQtdGFnLWluLXRhYmxlIjoKICAgICAgICAiVW5leHBlY3RlZCBpbXBsaWVkIGVuZCB0YWcgKCUobmFtZSlzKSBpbiB0aGUgdGFibGUgcGhhc2UuIiwKICAgICJ1bmV4cGVjdGVkLWltcGxpZWQtZW5kLXRhZy1pbi10YWJsZS1ib2R5IjoKICAgICAgICAiVW5leHBlY3RlZCBpbXBsaWVkIGVuZCB0YWcgKCUobmFtZSlzKSBpbiB0aGUgdGFibGUgYm9keSBwaGFzZS4iLAogICAgInVuZXhwZWN0ZWQtY2hhci1pbXBsaWVzLXRhYmxlLXZvb2RvbyI6CiAgICAgICAgIlVuZXhwZWN0ZWQgbm9uLXNwYWNlIGNoYXJhY3RlcnMgaW4gIgogICAgICAgICJ0YWJsZSBjb250ZXh0IGNhdXNlZCB2b29kb28gbW9kZS4iLAogICAgInVuZXhwZWN0ZWQtaGlkZGVuLWlucHV0LWluLXRhYmxlIjoKICAgICAgICAiVW5leHBlY3RlZCBpbnB1dCB3aXRoIHR5cGUgaGlkZGVuIGluIHRhYmxlIGNvbnRleHQuIiwKICAgICJ1bmV4cGVjdGVkLWZvcm0taW4tdGFibGUiOgogICAgICAgICJVbmV4cGVjdGVkIGZvcm0gaW4gdGFibGUgY29udGV4dC4iLAogICAgInVuZXhwZWN0ZWQtc3RhcnQtdGFnLWltcGxpZXMtdGFibGUtdm9vZG9vIjoKICAgICAgICAiVW5leHBlY3RlZCBzdGFydCB0YWcgKCUobmFtZSlzKSBpbiAiCiAgICAgICAgInRhYmxlIGNvbnRleHQgY2F1c2VkIHZvb2RvbyBtb2RlLiIsCiAgICAidW5leHBlY3RlZC1lbmQtdGFnLWltcGxpZXMtdGFibGUtdm9vZG9vIjoKICAgICAgICAiVW5leHBlY3RlZCBlbmQgdGFnICglKG5hbWUpcykgaW4gIgogICAgICAgICJ0YWJsZSBjb250ZXh0IGNhdXNlZCB2b29kb28gbW9kZS4iLAogICAgInVuZXhwZWN0ZWQtY2VsbC1pbi10YWJsZS1ib2R5IjoKICAgICAgICAiVW5leHBlY3RlZCB0YWJsZSBjZWxsIHN0YXJ0IHRhZyAoJShuYW1lKXMpICIKICAgICAgICAiaW4gdGhlIHRhYmxlIGJvZHkgcGhhc2UuIiwKICAgICJ1bmV4cGVjdGVkLWNlbGwtZW5kLXRhZyI6CiAgICAgICAgIkdvdCB0YWJsZSBjZWxsIGVuZCB0YWcgKCUobmFtZSlzKSAiCiAgICAgICAgIndoaWxlIHJlcXVpcmVkIGVuZCB0YWdzIGFyZSBtaXNzaW5nLiIsCiAgICAidW5leHBlY3RlZC1lbmQtdGFnLWluLXRhYmxlLWJvZHkiOgogICAgICAgICJVbmV4cGVjdGVkIGVuZCB0YWcgKCUobmFtZSlzKSBpbiB0aGUgdGFibGUgYm9keSBwaGFzZS4gSWdub3JlZC4iLAogICAgInVuZXhwZWN0ZWQtaW1wbGllZC1lbmQtdGFnLWluLXRhYmxlLXJvdyI6CiAgICAgICAgIlVuZXhwZWN0ZWQgaW1wbGllZCBlbmQgdGFnICglKG5hbWUpcykgaW4gdGhlIHRhYmxlIHJvdyBwaGFzZS4iLAogICAgInVuZXhwZWN0ZWQtZW5kLXRhZy1pbi10YWJsZS1yb3ciOgogICAgICAgICJVbmV4cGVjdGVkIGVuZCB0YWcgKCUobmFtZSlzKSBpbiB0aGUgdGFibGUgcm93IHBoYXNlLiBJZ25vcmVkLiIsCiAgICAidW5leHBlY3RlZC1zZWxlY3QtaW4tc2VsZWN0IjoKICAgICAgICAiVW5leHBlY3RlZCBzZWxlY3Qgc3RhcnQgdGFnIGluIHRoZSBzZWxlY3QgcGhhc2UgIgogICAgICAgICJ0cmVhdGVkIGFzIHNlbGVjdCBlbmQgdGFnLiIsCiAgICAidW5leHBlY3RlZC1pbnB1dC1pbi1zZWxlY3QiOgogICAgICAgICJVbmV4cGVjdGVkIGlucHV0IHN0YXJ0IHRhZyBpbiB0aGUgc2VsZWN0IHBoYXNlLiIsCiAgICAidW5leHBlY3RlZC1zdGFydC10YWctaW4tc2VsZWN0IjoKICAgICAgICAiVW5leHBlY3RlZCBzdGFydCB0YWcgdG9rZW4gKCUobmFtZSlzIGluIHRoZSBzZWxlY3QgcGhhc2UuICIKICAgICAgICAiSWdub3JlZC4iLAogICAgInVuZXhwZWN0ZWQtZW5kLXRhZy1pbi1zZWxlY3QiOgogICAgICAgICJVbmV4cGVjdGVkIGVuZCB0YWcgKCUobmFtZSlzKSBpbiB0aGUgc2VsZWN0IHBoYXNlLiBJZ25vcmVkLiIsCiAgICAidW5leHBlY3RlZC10YWJsZS1lbGVtZW50LXN0YXJ0LXRhZy1pbi1zZWxlY3QtaW4tdGFibGUiOgogICAgICAgICJVbmV4cGVjdGVkIHRhYmxlIGVsZW1lbnQgc3RhcnQgdGFnICglKG5hbWUpcykgaW4gdGhlIHNlbGVjdCBpbiB0YWJsZSBwaGFzZS4iLAogICAgInVuZXhwZWN0ZWQtdGFibGUtZWxlbWVudC1lbmQtdGFnLWluLXNlbGVjdC1pbi10YWJsZSI6CiAgICAgICAgIlVuZXhwZWN0ZWQgdGFibGUgZWxlbWVudCBlbmQgdGFnICglKG5hbWUpcykgaW4gdGhlIHNlbGVjdCBpbiB0YWJsZSBwaGFzZS4iLAogICAgInVuZXhwZWN0ZWQtY2hhci1hZnRlci1ib2R5IjoKICAgICAgICAiVW5leHBlY3RlZCBub24tc3BhY2UgY2hhcmFjdGVycyBpbiB0aGUgYWZ0ZXIgYm9keSBwaGFzZS4iLAogICAgInVuZXhwZWN0ZWQtc3RhcnQtdGFnLWFmdGVyLWJvZHkiOgogICAgICAgICJVbmV4cGVjdGVkIHN0YXJ0IHRhZyB0b2tlbiAoJShuYW1lKXMpIgogICAgICAgICIgaW4gdGhlIGFmdGVyIGJvZHkgcGhhc2UuIiwKICAgICJ1bmV4cGVjdGVkLWVuZC10YWctYWZ0ZXItYm9keSI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIHRhZyB0b2tlbiAoJShuYW1lKXMpIgogICAgICAgICIgaW4gdGhlIGFmdGVyIGJvZHkgcGhhc2UuIiwKICAgICJ1bmV4cGVjdGVkLWNoYXItaW4tZnJhbWVzZXQiOgogICAgICAgICJVbmV4cGVjdGVkIGNoYXJhY3RlcnMgaW4gdGhlIGZyYW1lc2V0IHBoYXNlLiBDaGFyYWN0ZXJzIGlnbm9yZWQuIiwKICAgICJ1bmV4cGVjdGVkLXN0YXJ0LXRhZy1pbi1mcmFtZXNldCI6CiAgICAgICAgIlVuZXhwZWN0ZWQgc3RhcnQgdGFnIHRva2VuICglKG5hbWUpcykiCiAgICAgICAgIiBpbiB0aGUgZnJhbWVzZXQgcGhhc2UuIElnbm9yZWQuIiwKICAgICJ1bmV4cGVjdGVkLWZyYW1lc2V0LWluLWZyYW1lc2V0LWlubmVyaHRtbCI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIHRhZyB0b2tlbiAoZnJhbWVzZXQpICIKICAgICAgICAiaW4gdGhlIGZyYW1lc2V0IHBoYXNlIChpbm5lckhUTUwpLiIsCiAgICAidW5leHBlY3RlZC1lbmQtdGFnLWluLWZyYW1lc2V0IjoKICAgICAgICAiVW5leHBlY3RlZCBlbmQgdGFnIHRva2VuICglKG5hbWUpcykiCiAgICAgICAgIiBpbiB0aGUgZnJhbWVzZXQgcGhhc2UuIElnbm9yZWQuIiwKICAgICJ1bmV4cGVjdGVkLWNoYXItYWZ0ZXItZnJhbWVzZXQiOgogICAgICAgICJVbmV4cGVjdGVkIG5vbi1zcGFjZSBjaGFyYWN0ZXJzIGluIHRoZSAiCiAgICAgICAgImFmdGVyIGZyYW1lc2V0IHBoYXNlLiBJZ25vcmVkLiIsCiAgICAidW5leHBlY3RlZC1zdGFydC10YWctYWZ0ZXItZnJhbWVzZXQiOgogICAgICAgICJVbmV4cGVjdGVkIHN0YXJ0IHRhZyAoJShuYW1lKXMpIgogICAgICAgICIgaW4gdGhlIGFmdGVyIGZyYW1lc2V0IHBoYXNlLiBJZ25vcmVkLiIsCiAgICAidW5leHBlY3RlZC1lbmQtdGFnLWFmdGVyLWZyYW1lc2V0IjoKICAgICAgICAiVW5leHBlY3RlZCBlbmQgdGFnICglKG5hbWUpcykiCiAgICAgICAgIiBpbiB0aGUgYWZ0ZXIgZnJhbWVzZXQgcGhhc2UuIElnbm9yZWQuIiwKICAgICJ1bmV4cGVjdGVkLWVuZC10YWctYWZ0ZXItYm9keS1pbm5lcmh0bWwiOgogICAgICAgICJVbmV4cGVjdGVkIGVuZCB0YWcgYWZ0ZXIgYm9keShpbm5lckh0bWwpIiwKICAgICJleHBlY3RlZC1lb2YtYnV0LWdvdC1jaGFyIjoKICAgICAgICAiVW5leHBlY3RlZCBub24tc3BhY2UgY2hhcmFjdGVycy4gRXhwZWN0ZWQgZW5kIG9mIGZpbGUuIiwKICAgICJleHBlY3RlZC1lb2YtYnV0LWdvdC1zdGFydC10YWciOgogICAgICAgICJVbmV4cGVjdGVkIHN0YXJ0IHRhZyAoJShuYW1lKXMpIgogICAgICAgICIuIEV4cGVjdGVkIGVuZCBvZiBmaWxlLiIsCiAgICAiZXhwZWN0ZWQtZW9mLWJ1dC1nb3QtZW5kLXRhZyI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIHRhZyAoJShuYW1lKXMpIgogICAgICAgICIuIEV4cGVjdGVkIGVuZCBvZiBmaWxlLiIsCiAgICAiZW9mLWluLXRhYmxlIjoKICAgICAgICAiVW5leHBlY3RlZCBlbmQgb2YgZmlsZS4gRXhwZWN0ZWQgdGFibGUgY29udGVudC4iLAogICAgImVvZi1pbi1zZWxlY3QiOgogICAgICAgICJVbmV4cGVjdGVkIGVuZCBvZiBmaWxlLiBFeHBlY3RlZCBzZWxlY3QgY29udGVudC4iLAogICAgImVvZi1pbi1mcmFtZXNldCI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUuIEV4cGVjdGVkIGZyYW1lc2V0IGNvbnRlbnQuIiwKICAgICJlb2YtaW4tc2NyaXB0LWluLXNjcmlwdCI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUuIEV4cGVjdGVkIHNjcmlwdCBjb250ZW50LiIsCiAgICAiZW9mLWluLWZvcmVpZ24tbGFuZHMiOgogICAgICAgICJVbmV4cGVjdGVkIGVuZCBvZiBmaWxlLiBFeHBlY3RlZCBmb3JlaWduIGNvbnRlbnQiLAogICAgIm5vbi12b2lkLWVsZW1lbnQtd2l0aC10cmFpbGluZy1zb2xpZHVzIjoKICAgICAgICAiVHJhaWxpbmcgc29saWR1cyBub3QgYWxsb3dlZCBvbiBlbGVtZW50ICUobmFtZSlzIiwKICAgICJ1bmV4cGVjdGVkLWh0bWwtZWxlbWVudC1pbi1mb3JlaWduLWNvbnRlbnQiOgogICAgICAgICJFbGVtZW50ICUobmFtZSlzIG5vdCBhbGxvd2VkIGluIGEgbm9uLWh0bWwgY29udGV4dCIsCiAgICAidW5leHBlY3RlZC1lbmQtdGFnLWJlZm9yZS1odG1sIjoKICAgICAgICAiVW5leHBlY3RlZCBlbmQgdGFnICglKG5hbWUpcykgYmVmb3JlIGh0bWwuIiwKICAgICJ1bmV4cGVjdGVkLWluaGVhZC1ub3NjcmlwdC10YWciOgogICAgICAgICJFbGVtZW50ICUobmFtZSlzIG5vdCBhbGxvd2VkIGluIGEgaW5oZWFkLW5vc2NyaXB0IGNvbnRleHQiLAogICAgImVvZi1pbi1oZWFkLW5vc2NyaXB0IjoKICAgICAgICAiVW5leHBlY3RlZCBlbmQgb2YgZmlsZS4gRXhwZWN0ZWQgaW5oZWFkLW5vc2NyaXB0IGNvbnRlbnQiLAogICAgImNoYXItaW4taGVhZC1ub3NjcmlwdCI6CiAgICAgICAgIlVuZXhwZWN0ZWQgbm9uLXNwYWNlIGNoYXJhY3Rlci4gRXhwZWN0ZWQgaW5oZWFkLW5vc2NyaXB0IGNvbnRlbnQiLAogICAgIlhYWC11bmRlZmluZWQtZXJyb3IiOgogICAgICAgICJVbmRlZmluZWQgZXJyb3IgKHRoaXMgc3Vja3MgYW5kIHNob3VsZCBiZSBmaXhlZCkiLAp9CgpuYW1lc3BhY2VzID0gewogICAgImh0bWwiOiAiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIsCiAgICAibWF0aG1sIjogImh0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUwiLAogICAgInN2ZyI6ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsCiAgICAieGxpbmsiOiAiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIsCiAgICAieG1sIjogImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIsCiAgICAieG1sbnMiOiAiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8iCn0KCnNjb3BpbmdFbGVtZW50cyA9IGZyb3plbnNldChbCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiYXBwbGV0IiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiY2FwdGlvbiIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImh0bWwiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJtYXJxdWVlIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAib2JqZWN0IiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAidGFibGUiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJ0ZCIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgInRoIiksCiAgICAobmFtZXNwYWNlc1sibWF0aG1sIl0sICJtaSIpLAogICAgKG5hbWVzcGFjZXNbIm1hdGhtbCJdLCAibW8iKSwKICAgIChuYW1lc3BhY2VzWyJtYXRobWwiXSwgIm1uIiksCiAgICAobmFtZXNwYWNlc1sibWF0aG1sIl0sICJtcyIpLAogICAgKG5hbWVzcGFjZXNbIm1hdGhtbCJdLCAibXRleHQiKSwKICAgIChuYW1lc3BhY2VzWyJtYXRobWwiXSwgImFubm90YXRpb24teG1sIiksCiAgICAobmFtZXNwYWNlc1sic3ZnIl0sICJmb3JlaWduT2JqZWN0IiksCiAgICAobmFtZXNwYWNlc1sic3ZnIl0sICJkZXNjIiksCiAgICAobmFtZXNwYWNlc1sic3ZnIl0sICJ0aXRsZSIpLApdKQoKZm9ybWF0dGluZ0VsZW1lbnRzID0gZnJvemVuc2V0KFsKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJhIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiYiIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImJpZyIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImNvZGUiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJlbSIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImZvbnQiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJpIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAibm9iciIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgInMiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJzbWFsbCIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgInN0cmlrZSIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgInN0cm9uZyIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgInR0IiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAidSIpCl0pCgpzcGVjaWFsRWxlbWVudHMgPSBmcm96ZW5zZXQoWwogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImFkZHJlc3MiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJhcHBsZXQiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJhcmVhIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiYXJ0aWNsZSIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImFzaWRlIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiYmFzZSIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImJhc2Vmb250IiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiYmdzb3VuZCIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImJsb2NrcXVvdGUiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJib2R5IiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiYnIiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJidXR0b24iKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJjYXB0aW9uIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiY2VudGVyIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiY29sIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiY29sZ3JvdXAiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJjb21tYW5kIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiZGQiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJkZXRhaWxzIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiZGlyIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiZGl2IiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiZGwiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJkdCIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImVtYmVkIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiZmllbGRzZXQiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJmaWd1cmUiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJmb290ZXIiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJmb3JtIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiZnJhbWUiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJmcmFtZXNldCIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImgxIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiaDIiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJoMyIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImg0IiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiaDUiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJoNiIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImhlYWQiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJoZWFkZXIiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJociIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImh0bWwiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJpZnJhbWUiKSwKICAgICMgTm90ZSB0aGF0IGltYWdlIGlzIGNvbW1lbnRlZCBvdXQgaW4gdGhlIHNwZWMgYXMgInRoaXMgaXNuJ3QgYW4KICAgICMgZWxlbWVudCB0aGF0IGNhbiBlbmQgdXAgb24gdGhlIHN0YWNrLCBzbyBpdCBkb2Vzbid0IG1hdHRlciwiCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiaW1hZ2UiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJpbWciKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJpbnB1dCIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImlzaW5kZXgiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJsaSIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImxpbmsiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJsaXN0aW5nIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAibWFycXVlZSIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgIm1lbnUiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJtZXRhIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAibmF2IiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAibm9lbWJlZCIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgIm5vZnJhbWVzIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAibm9zY3JpcHQiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJvYmplY3QiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJvbCIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgInAiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJwYXJhbSIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgInBsYWludGV4dCIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgInByZSIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgInNjcmlwdCIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgInNlY3Rpb24iKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJzZWxlY3QiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJzdHlsZSIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgInRhYmxlIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAidGJvZHkiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJ0ZCIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgInRleHRhcmVhIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAidGZvb3QiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJ0aCIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgInRoZWFkIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAidGl0bGUiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJ0ciIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgInVsIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAid2JyIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAieG1wIiksCiAgICAobmFtZXNwYWNlc1sic3ZnIl0sICJmb3JlaWduT2JqZWN0IikKXSkKCmh0bWxJbnRlZ3JhdGlvblBvaW50RWxlbWVudHMgPSBmcm96ZW5zZXQoWwogICAgKG5hbWVzcGFjZXNbIm1hdGhtbCJdLCAiYW5ub3RhaW9uLXhtbCIpLAogICAgKG5hbWVzcGFjZXNbInN2ZyJdLCAiZm9yZWlnbk9iamVjdCIpLAogICAgKG5hbWVzcGFjZXNbInN2ZyJdLCAiZGVzYyIpLAogICAgKG5hbWVzcGFjZXNbInN2ZyJdLCAidGl0bGUiKQpdKQoKbWF0aG1sVGV4dEludGVncmF0aW9uUG9pbnRFbGVtZW50cyA9IGZyb3plbnNldChbCiAgICAobmFtZXNwYWNlc1sibWF0aG1sIl0sICJtaSIpLAogICAgKG5hbWVzcGFjZXNbIm1hdGhtbCJdLCAibW8iKSwKICAgIChuYW1lc3BhY2VzWyJtYXRobWwiXSwgIm1uIiksCiAgICAobmFtZXNwYWNlc1sibWF0aG1sIl0sICJtcyIpLAogICAgKG5hbWVzcGFjZXNbIm1hdGhtbCJdLCAibXRleHQiKQpdKQoKYWRqdXN0U1ZHQXR0cmlidXRlcyA9IHsKICAgICJhdHRyaWJ1dGVuYW1lIjogImF0dHJpYnV0ZU5hbWUiLAogICAgImF0dHJpYnV0ZXR5cGUiOiAiYXR0cmlidXRlVHlwZSIsCiAgICAiYmFzZWZyZXF1ZW5jeSI6ICJiYXNlRnJlcXVlbmN5IiwKICAgICJiYXNlcHJvZmlsZSI6ICJiYXNlUHJvZmlsZSIsCiAgICAiY2FsY21vZGUiOiAiY2FsY01vZGUiLAogICAgImNsaXBwYXRodW5pdHMiOiAiY2xpcFBhdGhVbml0cyIsCiAgICAiY29udGVudHNjcmlwdHR5cGUiOiAiY29udGVudFNjcmlwdFR5cGUiLAogICAgImNvbnRlbnRzdHlsZXR5cGUiOiAiY29udGVudFN0eWxlVHlwZSIsCiAgICAiZGlmZnVzZWNvbnN0YW50IjogImRpZmZ1c2VDb25zdGFudCIsCiAgICAiZWRnZW1vZGUiOiAiZWRnZU1vZGUiLAogICAgImV4dGVybmFscmVzb3VyY2VzcmVxdWlyZWQiOiAiZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZCIsCiAgICAiZmlsdGVycmVzIjogImZpbHRlclJlcyIsCiAgICAiZmlsdGVydW5pdHMiOiAiZmlsdGVyVW5pdHMiLAogICAgImdseXBocmVmIjogImdseXBoUmVmIiwKICAgICJncmFkaWVudHRyYW5zZm9ybSI6ICJncmFkaWVudFRyYW5zZm9ybSIsCiAgICAiZ3JhZGllbnR1bml0cyI6ICJncmFkaWVudFVuaXRzIiwKICAgICJrZXJuZWxtYXRyaXgiOiAia2VybmVsTWF0cml4IiwKICAgICJrZXJuZWx1bml0bGVuZ3RoIjogImtlcm5lbFVuaXRMZW5ndGgiLAogICAgImtleXBvaW50cyI6ICJrZXlQb2ludHMiLAogICAgImtleXNwbGluZXMiOiAia2V5U3BsaW5lcyIsCiAgICAia2V5dGltZXMiOiAia2V5VGltZXMiLAogICAgImxlbmd0aGFkanVzdCI6ICJsZW5ndGhBZGp1c3QiLAogICAgImxpbWl0aW5nY29uZWFuZ2xlIjogImxpbWl0aW5nQ29uZUFuZ2xlIiwKICAgICJtYXJrZXJoZWlnaHQiOiAibWFya2VySGVpZ2h0IiwKICAgICJtYXJrZXJ1bml0cyI6ICJtYXJrZXJVbml0cyIsCiAgICAibWFya2Vyd2lkdGgiOiAibWFya2VyV2lkdGgiLAogICAgIm1hc2tjb250ZW50dW5pdHMiOiAibWFza0NvbnRlbnRVbml0cyIsCiAgICAibWFza3VuaXRzIjogIm1hc2tVbml0cyIsCiAgICAibnVtb2N0YXZlcyI6ICJudW1PY3RhdmVzIiwKICAgICJwYXRobGVuZ3RoIjogInBhdGhMZW5ndGgiLAogICAgInBhdHRlcm5jb250ZW50dW5pdHMiOiAicGF0dGVybkNvbnRlbnRVbml0cyIsCiAgICAicGF0dGVybnRyYW5zZm9ybSI6ICJwYXR0ZXJuVHJhbnNmb3JtIiwKICAgICJwYXR0ZXJudW5pdHMiOiAicGF0dGVyblVuaXRzIiwKICAgICJwb2ludHNhdHgiOiAicG9pbnRzQXRYIiwKICAgICJwb2ludHNhdHkiOiAicG9pbnRzQXRZIiwKICAgICJwb2ludHNhdHoiOiAicG9pbnRzQXRaIiwKICAgICJwcmVzZXJ2ZWFscGhhIjogInByZXNlcnZlQWxwaGEiLAogICAgInByZXNlcnZlYXNwZWN0cmF0aW8iOiAicHJlc2VydmVBc3BlY3RSYXRpbyIsCiAgICAicHJpbWl0aXZldW5pdHMiOiAicHJpbWl0aXZlVW5pdHMiLAogICAgInJlZngiOiAicmVmWCIsCiAgICAicmVmeSI6ICJyZWZZIiwKICAgICJyZXBlYXRjb3VudCI6ICJyZXBlYXRDb3VudCIsCiAgICAicmVwZWF0ZHVyIjogInJlcGVhdER1ciIsCiAgICAicmVxdWlyZWRleHRlbnNpb25zIjogInJlcXVpcmVkRXh0ZW5zaW9ucyIsCiAgICAicmVxdWlyZWRmZWF0dXJlcyI6ICJyZXF1aXJlZEZlYXR1cmVzIiwKICAgICJzcGVjdWxhcmNvbnN0YW50IjogInNwZWN1bGFyQ29uc3RhbnQiLAogICAgInNwZWN1bGFyZXhwb25lbnQiOiAic3BlY3VsYXJFeHBvbmVudCIsCiAgICAic3ByZWFkbWV0aG9kIjogInNwcmVhZE1ldGhvZCIsCiAgICAic3RhcnRvZmZzZXQiOiAic3RhcnRPZmZzZXQiLAogICAgInN0ZGRldmlhdGlvbiI6ICJzdGREZXZpYXRpb24iLAogICAgInN0aXRjaHRpbGVzIjogInN0aXRjaFRpbGVzIiwKICAgICJzdXJmYWNlc2NhbGUiOiAic3VyZmFjZVNjYWxlIiwKICAgICJzeXN0ZW1sYW5ndWFnZSI6ICJzeXN0ZW1MYW5ndWFnZSIsCiAgICAidGFibGV2YWx1ZXMiOiAidGFibGVWYWx1ZXMiLAogICAgInRhcmdldHgiOiAidGFyZ2V0WCIsCiAgICAidGFyZ2V0eSI6ICJ0YXJnZXRZIiwKICAgICJ0ZXh0bGVuZ3RoIjogInRleHRMZW5ndGgiLAogICAgInZpZXdib3giOiAidmlld0JveCIsCiAgICAidmlld3RhcmdldCI6ICJ2aWV3VGFyZ2V0IiwKICAgICJ4Y2hhbm5lbHNlbGVjdG9yIjogInhDaGFubmVsU2VsZWN0b3IiLAogICAgInljaGFubmVsc2VsZWN0b3IiOiAieUNoYW5uZWxTZWxlY3RvciIsCiAgICAiem9vbWFuZHBhbiI6ICJ6b29tQW5kUGFuIgp9CgphZGp1c3RNYXRoTUxBdHRyaWJ1dGVzID0geyJkZWZpbml0aW9udXJsIjogImRlZmluaXRpb25VUkwifQoKYWRqdXN0Rm9yZWlnbkF0dHJpYnV0ZXMgPSB7CiAgICAieGxpbms6YWN0dWF0ZSI6ICgieGxpbmsiLCAiYWN0dWF0ZSIsIG5hbWVzcGFjZXNbInhsaW5rIl0pLAogICAgInhsaW5rOmFyY3JvbGUiOiAoInhsaW5rIiwgImFyY3JvbGUiLCBuYW1lc3BhY2VzWyJ4bGluayJdKSwKICAgICJ4bGluazpocmVmIjogKCJ4bGluayIsICJocmVmIiwgbmFtZXNwYWNlc1sieGxpbmsiXSksCiAgICAieGxpbms6cm9sZSI6ICgieGxpbmsiLCAicm9sZSIsIG5hbWVzcGFjZXNbInhsaW5rIl0pLAogICAgInhsaW5rOnNob3ciOiAoInhsaW5rIiwgInNob3ciLCBuYW1lc3BhY2VzWyJ4bGluayJdKSwKICAgICJ4bGluazp0aXRsZSI6ICgieGxpbmsiLCAidGl0bGUiLCBuYW1lc3BhY2VzWyJ4bGluayJdKSwKICAgICJ4bGluazp0eXBlIjogKCJ4bGluayIsICJ0eXBlIiwgbmFtZXNwYWNlc1sieGxpbmsiXSksCiAgICAieG1sOmJhc2UiOiAoInhtbCIsICJiYXNlIiwgbmFtZXNwYWNlc1sieG1sIl0pLAogICAgInhtbDpsYW5nIjogKCJ4bWwiLCAibGFuZyIsIG5hbWVzcGFjZXNbInhtbCJdKSwKICAgICJ4bWw6c3BhY2UiOiAoInhtbCIsICJzcGFjZSIsIG5hbWVzcGFjZXNbInhtbCJdKSwKICAgICJ4bWxucyI6IChOb25lLCAieG1sbnMiLCBuYW1lc3BhY2VzWyJ4bWxucyJdKSwKICAgICJ4bWxuczp4bGluayI6ICgieG1sbnMiLCAieGxpbmsiLCBuYW1lc3BhY2VzWyJ4bWxucyJdKQp9Cgp1bmFkanVzdEZvcmVpZ25BdHRyaWJ1dGVzID0gZGljdChbKChucywgbG9jYWwpLCBxbmFtZSkgZm9yIHFuYW1lLCAocHJlZml4LCBsb2NhbCwgbnMpIGluCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGp1c3RGb3JlaWduQXR0cmlidXRlcy5pdGVtcygpXSkKCnNwYWNlQ2hhcmFjdGVycyA9IGZyb3plbnNldChbCiAgICAiXHQiLAogICAgIlxuIiwKICAgICJcdTAwMEMiLAogICAgIiAiLAogICAgIlxyIgpdKQoKdGFibGVJbnNlcnRNb2RlRWxlbWVudHMgPSBmcm96ZW5zZXQoWwogICAgInRhYmxlIiwKICAgICJ0Ym9keSIsCiAgICAidGZvb3QiLAogICAgInRoZWFkIiwKICAgICJ0ciIKXSkKCmFzY2lpTG93ZXJjYXNlID0gZnJvemVuc2V0KHN0cmluZy5hc2NpaV9sb3dlcmNhc2UpCmFzY2lpVXBwZXJjYXNlID0gZnJvemVuc2V0KHN0cmluZy5hc2NpaV91cHBlcmNhc2UpCmFzY2lpTGV0dGVycyA9IGZyb3plbnNldChzdHJpbmcuYXNjaWlfbGV0dGVycykKZGlnaXRzID0gZnJvemVuc2V0KHN0cmluZy5kaWdpdHMpCmhleERpZ2l0cyA9IGZyb3plbnNldChzdHJpbmcuaGV4ZGlnaXRzKQoKYXNjaWlVcHBlcjJMb3dlciA9IGRpY3QoWyhvcmQoYyksIG9yZChjLmxvd2VyKCkpKQogICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGMgaW4gc3RyaW5nLmFzY2lpX3VwcGVyY2FzZV0pCgojIEhlYWRpbmcgZWxlbWVudHMgbmVlZCB0byBiZSBvcmRlcmVkCmhlYWRpbmdFbGVtZW50cyA9ICgKICAgICJoMSIsCiAgICAiaDIiLAogICAgImgzIiwKICAgICJoNCIsCiAgICAiaDUiLAogICAgImg2IgopCgp2b2lkRWxlbWVudHMgPSBmcm96ZW5zZXQoWwogICAgImJhc2UiLAogICAgImNvbW1hbmQiLAogICAgImV2ZW50LXNvdXJjZSIsCiAgICAibGluayIsCiAgICAibWV0YSIsCiAgICAiaHIiLAogICAgImJyIiwKICAgICJpbWciLAogICAgImVtYmVkIiwKICAgICJwYXJhbSIsCiAgICAiYXJlYSIsCiAgICAiY29sIiwKICAgICJpbnB1dCIsCiAgICAic291cmNlIiwKICAgICJ0cmFjayIKXSkKCmNkYXRhRWxlbWVudHMgPSBmcm96ZW5zZXQoWyd0aXRsZScsICd0ZXh0YXJlYSddKQoKcmNkYXRhRWxlbWVudHMgPSBmcm96ZW5zZXQoWwogICAgJ3N0eWxlJywKICAgICdzY3JpcHQnLAogICAgJ3htcCcsCiAgICAnaWZyYW1lJywKICAgICdub2VtYmVkJywKICAgICdub2ZyYW1lcycsCiAgICAnbm9zY3JpcHQnCl0pCgpib29sZWFuQXR0cmlidXRlcyA9IHsKICAgICIiOiBmcm96ZW5zZXQoWyJpcnJlbGV2YW50Il0pLAogICAgInN0eWxlIjogZnJvemVuc2V0KFsic2NvcGVkIl0pLAogICAgImltZyI6IGZyb3plbnNldChbImlzbWFwIl0pLAogICAgImF1ZGlvIjogZnJvemVuc2V0KFsiYXV0b3BsYXkiLCAiY29udHJvbHMiXSksCiAgICAidmlkZW8iOiBmcm96ZW5zZXQoWyJhdXRvcGxheSIsICJjb250cm9scyJdKSwKICAgICJzY3JpcHQiOiBmcm96ZW5zZXQoWyJkZWZlciIsICJhc3luYyJdKSwKICAgICJkZXRhaWxzIjogZnJvemVuc2V0KFsib3BlbiJdKSwKICAgICJkYXRhZ3JpZCI6IGZyb3plbnNldChbIm11bHRpcGxlIiwgImRpc2FibGVkIl0pLAogICAgImNvbW1hbmQiOiBmcm96ZW5zZXQoWyJoaWRkZW4iLCAiZGlzYWJsZWQiLCAiY2hlY2tlZCIsICJkZWZhdWx0Il0pLAogICAgImhyIjogZnJvemVuc2V0KFsibm9zaGFkZSJdKSwKICAgICJtZW51IjogZnJvemVuc2V0KFsiYXV0b3N1Ym1pdCJdKSwKICAgICJmaWVsZHNldCI6IGZyb3plbnNldChbImRpc2FibGVkIiwgInJlYWRvbmx5Il0pLAogICAgIm9wdGlvbiI6IGZyb3plbnNldChbImRpc2FibGVkIiwgInJlYWRvbmx5IiwgInNlbGVjdGVkIl0pLAogICAgIm9wdGdyb3VwIjogZnJvemVuc2V0KFsiZGlzYWJsZWQiLCAicmVhZG9ubHkiXSksCiAgICAiYnV0dG9uIjogZnJvemVuc2V0KFsiZGlzYWJsZWQiLCAiYXV0b2ZvY3VzIl0pLAogICAgImlucHV0IjogZnJvemVuc2V0KFsiZGlzYWJsZWQiLCAicmVhZG9ubHkiLCAicmVxdWlyZWQiLCAiYXV0b2ZvY3VzIiwgImNoZWNrZWQiLCAiaXNtYXAiXSksCiAgICAic2VsZWN0IjogZnJvemVuc2V0KFsiZGlzYWJsZWQiLCAicmVhZG9ubHkiLCAiYXV0b2ZvY3VzIiwgIm11bHRpcGxlIl0pLAogICAgIm91dHB1dCI6IGZyb3plbnNldChbImRpc2FibGVkIiwgInJlYWRvbmx5Il0pLAp9CgojIGVudGl0aWVzV2luZG93czEyNTIgaGFzIHRvIGJlIF9vcmRlcmVkXyBhbmQgbmVlZHMgdG8gaGF2ZSBhbiBpbmRleC4gSXQKIyB0aGVyZWZvcmUgY2FuJ3QgYmUgYSBmcm96ZW5zZXQuCmVudGl0aWVzV2luZG93czEyNTIgPSAoCiAgICA4MzY0LCAgICMgMHg4MCAgMHgyMEFDICBFVVJPIFNJR04KICAgIDY1NTMzLCAgIyAweDgxICAgICAgICAgIFVOREVGSU5FRAogICAgODIxOCwgICAjIDB4ODIgIDB4MjAxQSAgU0lOR0xFIExPVy05IFFVT1RBVElPTiBNQVJLCiAgICA0MDIsICAgICMgMHg4MyAgMHgwMTkyICBMQVRJTiBTTUFMTCBMRVRURVIgRiBXSVRIIEhPT0sKICAgIDgyMjIsICAgIyAweDg0ICAweDIwMUUgIERPVUJMRSBMT1ctOSBRVU9UQVRJT04gTUFSSwogICAgODIzMCwgICAjIDB4ODUgIDB4MjAyNiAgSE9SSVpPTlRBTCBFTExJUFNJUwogICAgODIyNCwgICAjIDB4ODYgIDB4MjAyMCAgREFHR0VSCiAgICA4MjI1LCAgICMgMHg4NyAgMHgyMDIxICBET1VCTEUgREFHR0VSCiAgICA3MTAsICAgICMgMHg4OCAgMHgwMkM2ICBNT0RJRklFUiBMRVRURVIgQ0lSQ1VNRkxFWCBBQ0NFTlQKICAgIDgyNDAsICAgIyAweDg5ICAweDIwMzAgIFBFUiBNSUxMRSBTSUdOCiAgICAzNTIsICAgICMgMHg4QSAgMHgwMTYwICBMQVRJTiBDQVBJVEFMIExFVFRFUiBTIFdJVEggQ0FST04KICAgIDgyNDksICAgIyAweDhCICAweDIwMzkgIFNJTkdMRSBMRUZULVBPSU5USU5HIEFOR0xFIFFVT1RBVElPTiBNQVJLCiAgICAzMzgsICAgICMgMHg4QyAgMHgwMTUyICBMQVRJTiBDQVBJVEFMIExJR0FUVVJFIE9FCiAgICA2NTUzMywgICMgMHg4RCAgICAgICAgICBVTkRFRklORUQKICAgIDM4MSwgICAgIyAweDhFICAweDAxN0QgIExBVElOIENBUElUQUwgTEVUVEVSIFogV0lUSCBDQVJPTgogICAgNjU1MzMsICAjIDB4OEYgICAgICAgICAgVU5ERUZJTkVECiAgICA2NTUzMywgICMgMHg5MCAgICAgICAgICBVTkRFRklORUQKICAgIDgyMTYsICAgIyAweDkxICAweDIwMTggIExFRlQgU0lOR0xFIFFVT1RBVElPTiBNQVJLCiAgICA4MjE3LCAgICMgMHg5MiAgMHgyMDE5ICBSSUdIVCBTSU5HTEUgUVVPVEFUSU9OIE1BUksKICAgIDgyMjAsICAgIyAweDkzICAweDIwMUMgIExFRlQgRE9VQkxFIFFVT1RBVElPTiBNQVJLCiAgICA4MjIxLCAgICMgMHg5NCAgMHgyMDFEICBSSUdIVCBET1VCTEUgUVVPVEFUSU9OIE1BUksKICAgIDgyMjYsICAgIyAweDk1ICAweDIwMjIgIEJVTExFVAogICAgODIxMSwgICAjIDB4OTYgIDB4MjAxMyAgRU4gREFTSAogICAgODIxMiwgICAjIDB4OTcgIDB4MjAxNCAgRU0gREFTSAogICAgNzMyLCAgICAjIDB4OTggIDB4MDJEQyAgU01BTEwgVElMREUKICAgIDg0ODIsICAgIyAweDk5ICAweDIxMjIgIFRSQURFIE1BUksgU0lHTgogICAgMzUzLCAgICAjIDB4OUEgIDB4MDE2MSAgTEFUSU4gU01BTEwgTEVUVEVSIFMgV0lUSCBDQVJPTgogICAgODI1MCwgICAjIDB4OUIgIDB4MjAzQSAgU0lOR0xFIFJJR0hULVBPSU5USU5HIEFOR0xFIFFVT1RBVElPTiBNQVJLCiAgICAzMzksICAgICMgMHg5QyAgMHgwMTUzICBMQVRJTiBTTUFMTCBMSUdBVFVSRSBPRQogICAgNjU1MzMsICAjIDB4OUQgICAgICAgICAgVU5ERUZJTkVECiAgICAzODIsICAgICMgMHg5RSAgMHgwMTdFICBMQVRJTiBTTUFMTCBMRVRURVIgWiBXSVRIIENBUk9OCiAgICAzNzYgICAgICMgMHg5RiAgMHgwMTc4ICBMQVRJTiBDQVBJVEFMIExFVFRFUiBZIFdJVEggRElBRVJFU0lTCikKCnhtbEVudGl0aWVzID0gZnJvemVuc2V0KFsnbHQ7JywgJ2d0OycsICdhbXA7JywgJ2Fwb3M7JywgJ3F1b3Q7J10pCgplbnRpdGllcyA9IHsKICAgICJBRWxpZyI6ICJceGM2IiwKICAgICJBRWxpZzsiOiAiXHhjNiIsCiAgICAiQU1QIjogIiYiLAogICAgIkFNUDsiOiAiJiIsCiAgICAiQWFjdXRlIjogIlx4YzEiLAogICAgIkFhY3V0ZTsiOiAiXHhjMSIsCiAgICAiQWJyZXZlOyI6ICJcdTAxMDIiLAogICAgIkFjaXJjIjogIlx4YzIiLAogICAgIkFjaXJjOyI6ICJceGMyIiwKICAgICJBY3k7IjogIlx1MDQxMCIsCiAgICAiQWZyOyI6ICJcVTAwMDFkNTA0IiwKICAgICJBZ3JhdmUiOiAiXHhjMCIsCiAgICAiQWdyYXZlOyI6ICJceGMwIiwKICAgICJBbHBoYTsiOiAiXHUwMzkxIiwKICAgICJBbWFjcjsiOiAiXHUwMTAwIiwKICAgICJBbmQ7IjogIlx1MmE1MyIsCiAgICAiQW9nb247IjogIlx1MDEwNCIsCiAgICAiQW9wZjsiOiAiXFUwMDAxZDUzOCIsCiAgICAiQXBwbHlGdW5jdGlvbjsiOiAiXHUyMDYxIiwKICAgICJBcmluZyI6ICJceGM1IiwKICAgICJBcmluZzsiOiAiXHhjNSIsCiAgICAiQXNjcjsiOiAiXFUwMDAxZDQ5YyIsCiAgICAiQXNzaWduOyI6ICJcdTIyNTQiLAogICAgIkF0aWxkZSI6ICJceGMzIiwKICAgICJBdGlsZGU7IjogIlx4YzMiLAogICAgIkF1bWwiOiAiXHhjNCIsCiAgICAiQXVtbDsiOiAiXHhjNCIsCiAgICAiQmFja3NsYXNoOyI6ICJcdTIyMTYiLAogICAgIkJhcnY7IjogIlx1MmFlNyIsCiAgICAiQmFyd2VkOyI6ICJcdTIzMDYiLAogICAgIkJjeTsiOiAiXHUwNDExIiwKICAgICJCZWNhdXNlOyI6ICJcdTIyMzUiLAogICAgIkJlcm5vdWxsaXM7IjogIlx1MjEyYyIsCiAgICAiQmV0YTsiOiAiXHUwMzkyIiwKICAgICJCZnI7IjogIlxVMDAwMWQ1MDUiLAogICAgIkJvcGY7IjogIlxVMDAwMWQ1MzkiLAogICAgIkJyZXZlOyI6ICJcdTAyZDgiLAogICAgIkJzY3I7IjogIlx1MjEyYyIsCiAgICAiQnVtcGVxOyI6ICJcdTIyNGUiLAogICAgIkNIY3k7IjogIlx1MDQyNyIsCiAgICAiQ09QWSI6ICJceGE5IiwKICAgICJDT1BZOyI6ICJceGE5IiwKICAgICJDYWN1dGU7IjogIlx1MDEwNiIsCiAgICAiQ2FwOyI6ICJcdTIyZDIiLAogICAgIkNhcGl0YWxEaWZmZXJlbnRpYWxEOyI6ICJcdTIxNDUiLAogICAgIkNheWxleXM7IjogIlx1MjEyZCIsCiAgICAiQ2Nhcm9uOyI6ICJcdTAxMGMiLAogICAgIkNjZWRpbCI6ICJceGM3IiwKICAgICJDY2VkaWw7IjogIlx4YzciLAogICAgIkNjaXJjOyI6ICJcdTAxMDgiLAogICAgIkNjb25pbnQ7IjogIlx1MjIzMCIsCiAgICAiQ2RvdDsiOiAiXHUwMTBhIiwKICAgICJDZWRpbGxhOyI6ICJceGI4IiwKICAgICJDZW50ZXJEb3Q7IjogIlx4YjciLAogICAgIkNmcjsiOiAiXHUyMTJkIiwKICAgICJDaGk7IjogIlx1MDNhNyIsCiAgICAiQ2lyY2xlRG90OyI6ICJcdTIyOTkiLAogICAgIkNpcmNsZU1pbnVzOyI6ICJcdTIyOTYiLAogICAgIkNpcmNsZVBsdXM7IjogIlx1MjI5NSIsCiAgICAiQ2lyY2xlVGltZXM7IjogIlx1MjI5NyIsCiAgICAiQ2xvY2t3aXNlQ29udG91ckludGVncmFsOyI6ICJcdTIyMzIiLAogICAgIkNsb3NlQ3VybHlEb3VibGVRdW90ZTsiOiAiXHUyMDFkIiwKICAgICJDbG9zZUN1cmx5UXVvdGU7IjogIlx1MjAxOSIsCiAgICAiQ29sb247IjogIlx1MjIzNyIsCiAgICAiQ29sb25lOyI6ICJcdTJhNzQiLAogICAgIkNvbmdydWVudDsiOiAiXHUyMjYxIiwKICAgICJDb25pbnQ7IjogIlx1MjIyZiIsCiAgICAiQ29udG91ckludGVncmFsOyI6ICJcdTIyMmUiLAogICAgIkNvcGY7IjogIlx1MjEwMiIsCiAgICAiQ29wcm9kdWN0OyI6ICJcdTIyMTAiLAogICAgIkNvdW50ZXJDbG9ja3dpc2VDb250b3VySW50ZWdyYWw7IjogIlx1MjIzMyIsCiAgICAiQ3Jvc3M7IjogIlx1MmEyZiIsCiAgICAiQ3NjcjsiOiAiXFUwMDAxZDQ5ZSIsCiAgICAiQ3VwOyI6ICJcdTIyZDMiLAogICAgIkN1cENhcDsiOiAiXHUyMjRkIiwKICAgICJERDsiOiAiXHUyMTQ1IiwKICAgICJERG90cmFoZDsiOiAiXHUyOTExIiwKICAgICJESmN5OyI6ICJcdTA0MDIiLAogICAgIkRTY3k7IjogIlx1MDQwNSIsCiAgICAiRFpjeTsiOiAiXHUwNDBmIiwKICAgICJEYWdnZXI7IjogIlx1MjAyMSIsCiAgICAiRGFycjsiOiAiXHUyMWExIiwKICAgICJEYXNodjsiOiAiXHUyYWU0IiwKICAgICJEY2Fyb247IjogIlx1MDEwZSIsCiAgICAiRGN5OyI6ICJcdTA0MTQiLAogICAgIkRlbDsiOiAiXHUyMjA3IiwKICAgICJEZWx0YTsiOiAiXHUwMzk0IiwKICAgICJEZnI7IjogIlxVMDAwMWQ1MDciLAogICAgIkRpYWNyaXRpY2FsQWN1dGU7IjogIlx4YjQiLAogICAgIkRpYWNyaXRpY2FsRG90OyI6ICJcdTAyZDkiLAogICAgIkRpYWNyaXRpY2FsRG91YmxlQWN1dGU7IjogIlx1MDJkZCIsCiAgICAiRGlhY3JpdGljYWxHcmF2ZTsiOiAiYCIsCiAgICAiRGlhY3JpdGljYWxUaWxkZTsiOiAiXHUwMmRjIiwKICAgICJEaWFtb25kOyI6ICJcdTIyYzQiLAogICAgIkRpZmZlcmVudGlhbEQ7IjogIlx1MjE0NiIsCiAgICAiRG9wZjsiOiAiXFUwMDAxZDUzYiIsCiAgICAiRG90OyI6ICJceGE4IiwKICAgICJEb3REb3Q7IjogIlx1MjBkYyIsCiAgICAiRG90RXF1YWw7IjogIlx1MjI1MCIsCiAgICAiRG91YmxlQ29udG91ckludGVncmFsOyI6ICJcdTIyMmYiLAogICAgIkRvdWJsZURvdDsiOiAiXHhhOCIsCiAgICAiRG91YmxlRG93bkFycm93OyI6ICJcdTIxZDMiLAogICAgIkRvdWJsZUxlZnRBcnJvdzsiOiAiXHUyMWQwIiwKICAgICJEb3VibGVMZWZ0UmlnaHRBcnJvdzsiOiAiXHUyMWQ0IiwKICAgICJEb3VibGVMZWZ0VGVlOyI6ICJcdTJhZTQiLAogICAgIkRvdWJsZUxvbmdMZWZ0QXJyb3c7IjogIlx1MjdmOCIsCiAgICAiRG91YmxlTG9uZ0xlZnRSaWdodEFycm93OyI6ICJcdTI3ZmEiLAogICAgIkRvdWJsZUxvbmdSaWdodEFycm93OyI6ICJcdTI3ZjkiLAogICAgIkRvdWJsZVJpZ2h0QXJyb3c7IjogIlx1MjFkMiIsCiAgICAiRG91YmxlUmlnaHRUZWU7IjogIlx1MjJhOCIsCiAgICAiRG91YmxlVXBBcnJvdzsiOiAiXHUyMWQxIiwKICAgICJEb3VibGVVcERvd25BcnJvdzsiOiAiXHUyMWQ1IiwKICAgICJEb3VibGVWZXJ0aWNhbEJhcjsiOiAiXHUyMjI1IiwKICAgICJEb3duQXJyb3c7IjogIlx1MjE5MyIsCiAgICAiRG93bkFycm93QmFyOyI6ICJcdTI5MTMiLAogICAgIkRvd25BcnJvd1VwQXJyb3c7IjogIlx1MjFmNSIsCiAgICAiRG93bkJyZXZlOyI6ICJcdTAzMTEiLAogICAgIkRvd25MZWZ0UmlnaHRWZWN0b3I7IjogIlx1Mjk1MCIsCiAgICAiRG93bkxlZnRUZWVWZWN0b3I7IjogIlx1Mjk1ZSIsCiAgICAiRG93bkxlZnRWZWN0b3I7IjogIlx1MjFiZCIsCiAgICAiRG93bkxlZnRWZWN0b3JCYXI7IjogIlx1Mjk1NiIsCiAgICAiRG93blJpZ2h0VGVlVmVjdG9yOyI6ICJcdTI5NWYiLAogICAgIkRvd25SaWdodFZlY3RvcjsiOiAiXHUyMWMxIiwKICAgICJEb3duUmlnaHRWZWN0b3JCYXI7IjogIlx1Mjk1NyIsCiAgICAiRG93blRlZTsiOiAiXHUyMmE0IiwKICAgICJEb3duVGVlQXJyb3c7IjogIlx1MjFhNyIsCiAgICAiRG93bmFycm93OyI6ICJcdTIxZDMiLAogICAgIkRzY3I7IjogIlxVMDAwMWQ0OWYiLAogICAgIkRzdHJvazsiOiAiXHUwMTEwIiwKICAgICJFTkc7IjogIlx1MDE0YSIsCiAgICAiRVRIIjogIlx4ZDAiLAogICAgIkVUSDsiOiAiXHhkMCIsCiAgICAiRWFjdXRlIjogIlx4YzkiLAogICAgIkVhY3V0ZTsiOiAiXHhjOSIsCiAgICAiRWNhcm9uOyI6ICJcdTAxMWEiLAogICAgIkVjaXJjIjogIlx4Y2EiLAogICAgIkVjaXJjOyI6ICJceGNhIiwKICAgICJFY3k7IjogIlx1MDQyZCIsCiAgICAiRWRvdDsiOiAiXHUwMTE2IiwKICAgICJFZnI7IjogIlxVMDAwMWQ1MDgiLAogICAgIkVncmF2ZSI6ICJceGM4IiwKICAgICJFZ3JhdmU7IjogIlx4YzgiLAogICAgIkVsZW1lbnQ7IjogIlx1MjIwOCIsCiAgICAiRW1hY3I7IjogIlx1MDExMiIsCiAgICAiRW1wdHlTbWFsbFNxdWFyZTsiOiAiXHUyNWZiIiwKICAgICJFbXB0eVZlcnlTbWFsbFNxdWFyZTsiOiAiXHUyNWFiIiwKICAgICJFb2dvbjsiOiAiXHUwMTE4IiwKICAgICJFb3BmOyI6ICJcVTAwMDFkNTNjIiwKICAgICJFcHNpbG9uOyI6ICJcdTAzOTUiLAogICAgIkVxdWFsOyI6ICJcdTJhNzUiLAogICAgIkVxdWFsVGlsZGU7IjogIlx1MjI0MiIsCiAgICAiRXF1aWxpYnJpdW07IjogIlx1MjFjYyIsCiAgICAiRXNjcjsiOiAiXHUyMTMwIiwKICAgICJFc2ltOyI6ICJcdTJhNzMiLAogICAgIkV0YTsiOiAiXHUwMzk3IiwKICAgICJFdW1sIjogIlx4Y2IiLAogICAgIkV1bWw7IjogIlx4Y2IiLAogICAgIkV4aXN0czsiOiAiXHUyMjAzIiwKICAgICJFeHBvbmVudGlhbEU7IjogIlx1MjE0NyIsCiAgICAiRmN5OyI6ICJcdTA0MjQiLAogICAgIkZmcjsiOiAiXFUwMDAxZDUwOSIsCiAgICAiRmlsbGVkU21hbGxTcXVhcmU7IjogIlx1MjVmYyIsCiAgICAiRmlsbGVkVmVyeVNtYWxsU3F1YXJlOyI6ICJcdTI1YWEiLAogICAgIkZvcGY7IjogIlxVMDAwMWQ1M2QiLAogICAgIkZvckFsbDsiOiAiXHUyMjAwIiwKICAgICJGb3VyaWVydHJmOyI6ICJcdTIxMzEiLAogICAgIkZzY3I7IjogIlx1MjEzMSIsCiAgICAiR0pjeTsiOiAiXHUwNDAzIiwKICAgICJHVCI6ICI+IiwKICAgICJHVDsiOiAiPiIsCiAgICAiR2FtbWE7IjogIlx1MDM5MyIsCiAgICAiR2FtbWFkOyI6ICJcdTAzZGMiLAogICAgIkdicmV2ZTsiOiAiXHUwMTFlIiwKICAgICJHY2VkaWw7IjogIlx1MDEyMiIsCiAgICAiR2NpcmM7IjogIlx1MDExYyIsCiAgICAiR2N5OyI6ICJcdTA0MTMiLAogICAgIkdkb3Q7IjogIlx1MDEyMCIsCiAgICAiR2ZyOyI6ICJcVTAwMDFkNTBhIiwKICAgICJHZzsiOiAiXHUyMmQ5IiwKICAgICJHb3BmOyI6ICJcVTAwMDFkNTNlIiwKICAgICJHcmVhdGVyRXF1YWw7IjogIlx1MjI2NSIsCiAgICAiR3JlYXRlckVxdWFsTGVzczsiOiAiXHUyMmRiIiwKICAgICJHcmVhdGVyRnVsbEVxdWFsOyI6ICJcdTIyNjciLAogICAgIkdyZWF0ZXJHcmVhdGVyOyI6ICJcdTJhYTIiLAogICAgIkdyZWF0ZXJMZXNzOyI6ICJcdTIyNzciLAogICAgIkdyZWF0ZXJTbGFudEVxdWFsOyI6ICJcdTJhN2UiLAogICAgIkdyZWF0ZXJUaWxkZTsiOiAiXHUyMjczIiwKICAgICJHc2NyOyI6ICJcVTAwMDFkNGEyIiwKICAgICJHdDsiOiAiXHUyMjZiIiwKICAgICJIQVJEY3k7IjogIlx1MDQyYSIsCiAgICAiSGFjZWs7IjogIlx1MDJjNyIsCiAgICAiSGF0OyI6ICJeIiwKICAgICJIY2lyYzsiOiAiXHUwMTI0IiwKICAgICJIZnI7IjogIlx1MjEwYyIsCiAgICAiSGlsYmVydFNwYWNlOyI6ICJcdTIxMGIiLAogICAgIkhvcGY7IjogIlx1MjEwZCIsCiAgICAiSG9yaXpvbnRhbExpbmU7IjogIlx1MjUwMCIsCiAgICAiSHNjcjsiOiAiXHUyMTBiIiwKICAgICJIc3Ryb2s7IjogIlx1MDEyNiIsCiAgICAiSHVtcERvd25IdW1wOyI6ICJcdTIyNGUiLAogICAgIkh1bXBFcXVhbDsiOiAiXHUyMjRmIiwKICAgICJJRWN5OyI6ICJcdTA0MTUiLAogICAgIklKbGlnOyI6ICJcdTAxMzIiLAogICAgIklPY3k7IjogIlx1MDQwMSIsCiAgICAiSWFjdXRlIjogIlx4Y2QiLAogICAgIklhY3V0ZTsiOiAiXHhjZCIsCiAgICAiSWNpcmMiOiAiXHhjZSIsCiAgICAiSWNpcmM7IjogIlx4Y2UiLAogICAgIkljeTsiOiAiXHUwNDE4IiwKICAgICJJZG90OyI6ICJcdTAxMzAiLAogICAgIklmcjsiOiAiXHUyMTExIiwKICAgICJJZ3JhdmUiOiAiXHhjYyIsCiAgICAiSWdyYXZlOyI6ICJceGNjIiwKICAgICJJbTsiOiAiXHUyMTExIiwKICAgICJJbWFjcjsiOiAiXHUwMTJhIiwKICAgICJJbWFnaW5hcnlJOyI6ICJcdTIxNDgiLAogICAgIkltcGxpZXM7IjogIlx1MjFkMiIsCiAgICAiSW50OyI6ICJcdTIyMmMiLAogICAgIkludGVncmFsOyI6ICJcdTIyMmIiLAogICAgIkludGVyc2VjdGlvbjsiOiAiXHUyMmMyIiwKICAgICJJbnZpc2libGVDb21tYTsiOiAiXHUyMDYzIiwKICAgICJJbnZpc2libGVUaW1lczsiOiAiXHUyMDYyIiwKICAgICJJb2dvbjsiOiAiXHUwMTJlIiwKICAgICJJb3BmOyI6ICJcVTAwMDFkNTQwIiwKICAgICJJb3RhOyI6ICJcdTAzOTkiLAogICAgIklzY3I7IjogIlx1MjExMCIsCiAgICAiSXRpbGRlOyI6ICJcdTAxMjgiLAogICAgIkl1a2N5OyI6ICJcdTA0MDYiLAogICAgIkl1bWwiOiAiXHhjZiIsCiAgICAiSXVtbDsiOiAiXHhjZiIsCiAgICAiSmNpcmM7IjogIlx1MDEzNCIsCiAgICAiSmN5OyI6ICJcdTA0MTkiLAogICAgIkpmcjsiOiAiXFUwMDAxZDUwZCIsCiAgICAiSm9wZjsiOiAiXFUwMDAxZDU0MSIsCiAgICAiSnNjcjsiOiAiXFUwMDAxZDRhNSIsCiAgICAiSnNlcmN5OyI6ICJcdTA0MDgiLAogICAgIkp1a2N5OyI6ICJcdTA0MDQiLAogICAgIktIY3k7IjogIlx1MDQyNSIsCiAgICAiS0pjeTsiOiAiXHUwNDBjIiwKICAgICJLYXBwYTsiOiAiXHUwMzlhIiwKICAgICJLY2VkaWw7IjogIlx1MDEzNiIsCiAgICAiS2N5OyI6ICJcdTA0MWEiLAogICAgIktmcjsiOiAiXFUwMDAxZDUwZSIsCiAgICAiS29wZjsiOiAiXFUwMDAxZDU0MiIsCiAgICAiS3NjcjsiOiAiXFUwMDAxZDRhNiIsCiAgICAiTEpjeTsiOiAiXHUwNDA5IiwKICAgICJMVCI6ICI8IiwKICAgICJMVDsiOiAiPCIsCiAgICAiTGFjdXRlOyI6ICJcdTAxMzkiLAogICAgIkxhbWJkYTsiOiAiXHUwMzliIiwKICAgICJMYW5nOyI6ICJcdTI3ZWEiLAogICAgIkxhcGxhY2V0cmY7IjogIlx1MjExMiIsCiAgICAiTGFycjsiOiAiXHUyMTllIiwKICAgICJMY2Fyb247IjogIlx1MDEzZCIsCiAgICAiTGNlZGlsOyI6ICJcdTAxM2IiLAogICAgIkxjeTsiOiAiXHUwNDFiIiwKICAgICJMZWZ0QW5nbGVCcmFja2V0OyI6ICJcdTI3ZTgiLAogICAgIkxlZnRBcnJvdzsiOiAiXHUyMTkwIiwKICAgICJMZWZ0QXJyb3dCYXI7IjogIlx1MjFlNCIsCiAgICAiTGVmdEFycm93UmlnaHRBcnJvdzsiOiAiXHUyMWM2IiwKICAgICJMZWZ0Q2VpbGluZzsiOiAiXHUyMzA4IiwKICAgICJMZWZ0RG91YmxlQnJhY2tldDsiOiAiXHUyN2U2IiwKICAgICJMZWZ0RG93blRlZVZlY3RvcjsiOiAiXHUyOTYxIiwKICAgICJMZWZ0RG93blZlY3RvcjsiOiAiXHUyMWMzIiwKICAgICJMZWZ0RG93blZlY3RvckJhcjsiOiAiXHUyOTU5IiwKICAgICJMZWZ0Rmxvb3I7IjogIlx1MjMwYSIsCiAgICAiTGVmdFJpZ2h0QXJyb3c7IjogIlx1MjE5NCIsCiAgICAiTGVmdFJpZ2h0VmVjdG9yOyI6ICJcdTI5NGUiLAogICAgIkxlZnRUZWU7IjogIlx1MjJhMyIsCiAgICAiTGVmdFRlZUFycm93OyI6ICJcdTIxYTQiLAogICAgIkxlZnRUZWVWZWN0b3I7IjogIlx1Mjk1YSIsCiAgICAiTGVmdFRyaWFuZ2xlOyI6ICJcdTIyYjIiLAogICAgIkxlZnRUcmlhbmdsZUJhcjsiOiAiXHUyOWNmIiwKICAgICJMZWZ0VHJpYW5nbGVFcXVhbDsiOiAiXHUyMmI0IiwKICAgICJMZWZ0VXBEb3duVmVjdG9yOyI6ICJcdTI5NTEiLAogICAgIkxlZnRVcFRlZVZlY3RvcjsiOiAiXHUyOTYwIiwKICAgICJMZWZ0VXBWZWN0b3I7IjogIlx1MjFiZiIsCiAgICAiTGVmdFVwVmVjdG9yQmFyOyI6ICJcdTI5NTgiLAogICAgIkxlZnRWZWN0b3I7IjogIlx1MjFiYyIsCiAgICAiTGVmdFZlY3RvckJhcjsiOiAiXHUyOTUyIiwKICAgICJMZWZ0YXJyb3c7IjogIlx1MjFkMCIsCiAgICAiTGVmdHJpZ2h0YXJyb3c7IjogIlx1MjFkNCIsCiAgICAiTGVzc0VxdWFsR3JlYXRlcjsiOiAiXHUyMmRhIiwKICAgICJMZXNzRnVsbEVxdWFsOyI6ICJcdTIyNjYiLAogICAgIkxlc3NHcmVhdGVyOyI6ICJcdTIyNzYiLAogICAgIkxlc3NMZXNzOyI6ICJcdTJhYTEiLAogICAgIkxlc3NTbGFudEVxdWFsOyI6ICJcdTJhN2QiLAogICAgIkxlc3NUaWxkZTsiOiAiXHUyMjcyIiwKICAgICJMZnI7IjogIlxVMDAwMWQ1MGYiLAogICAgIkxsOyI6ICJcdTIyZDgiLAogICAgIkxsZWZ0YXJyb3c7IjogIlx1MjFkYSIsCiAgICAiTG1pZG90OyI6ICJcdTAxM2YiLAogICAgIkxvbmdMZWZ0QXJyb3c7IjogIlx1MjdmNSIsCiAgICAiTG9uZ0xlZnRSaWdodEFycm93OyI6ICJcdTI3ZjciLAogICAgIkxvbmdSaWdodEFycm93OyI6ICJcdTI3ZjYiLAogICAgIkxvbmdsZWZ0YXJyb3c7IjogIlx1MjdmOCIsCiAgICAiTG9uZ2xlZnRyaWdodGFycm93OyI6ICJcdTI3ZmEiLAogICAgIkxvbmdyaWdodGFycm93OyI6ICJcdTI3ZjkiLAogICAgIkxvcGY7IjogIlxVMDAwMWQ1NDMiLAogICAgIkxvd2VyTGVmdEFycm93OyI6ICJcdTIxOTkiLAogICAgIkxvd2VyUmlnaHRBcnJvdzsiOiAiXHUyMTk4IiwKICAgICJMc2NyOyI6ICJcdTIxMTIiLAogICAgIkxzaDsiOiAiXHUyMWIwIiwKICAgICJMc3Ryb2s7IjogIlx1MDE0MSIsCiAgICAiTHQ7IjogIlx1MjI2YSIsCiAgICAiTWFwOyI6ICJcdTI5MDUiLAogICAgIk1jeTsiOiAiXHUwNDFjIiwKICAgICJNZWRpdW1TcGFjZTsiOiAiXHUyMDVmIiwKICAgICJNZWxsaW50cmY7IjogIlx1MjEzMyIsCiAgICAiTWZyOyI6ICJcVTAwMDFkNTEwIiwKICAgICJNaW51c1BsdXM7IjogIlx1MjIxMyIsCiAgICAiTW9wZjsiOiAiXFUwMDAxZDU0NCIsCiAgICAiTXNjcjsiOiAiXHUyMTMzIiwKICAgICJNdTsiOiAiXHUwMzljIiwKICAgICJOSmN5OyI6ICJcdTA0MGEiLAogICAgIk5hY3V0ZTsiOiAiXHUwMTQzIiwKICAgICJOY2Fyb247IjogIlx1MDE0NyIsCiAgICAiTmNlZGlsOyI6ICJcdTAxNDUiLAogICAgIk5jeTsiOiAiXHUwNDFkIiwKICAgICJOZWdhdGl2ZU1lZGl1bVNwYWNlOyI6ICJcdTIwMGIiLAogICAgIk5lZ2F0aXZlVGhpY2tTcGFjZTsiOiAiXHUyMDBiIiwKICAgICJOZWdhdGl2ZVRoaW5TcGFjZTsiOiAiXHUyMDBiIiwKICAgICJOZWdhdGl2ZVZlcnlUaGluU3BhY2U7IjogIlx1MjAwYiIsCiAgICAiTmVzdGVkR3JlYXRlckdyZWF0ZXI7IjogIlx1MjI2YiIsCiAgICAiTmVzdGVkTGVzc0xlc3M7IjogIlx1MjI2YSIsCiAgICAiTmV3TGluZTsiOiAiXG4iLAogICAgIk5mcjsiOiAiXFUwMDAxZDUxMSIsCiAgICAiTm9CcmVhazsiOiAiXHUyMDYwIiwKICAgICJOb25CcmVha2luZ1NwYWNlOyI6ICJceGEwIiwKICAgICJOb3BmOyI6ICJcdTIxMTUiLAogICAgIk5vdDsiOiAiXHUyYWVjIiwKICAgICJOb3RDb25ncnVlbnQ7IjogIlx1MjI2MiIsCiAgICAiTm90Q3VwQ2FwOyI6ICJcdTIyNmQiLAogICAgIk5vdERvdWJsZVZlcnRpY2FsQmFyOyI6ICJcdTIyMjYiLAogICAgIk5vdEVsZW1lbnQ7IjogIlx1MjIwOSIsCiAgICAiTm90RXF1YWw7IjogIlx1MjI2MCIsCiAgICAiTm90RXF1YWxUaWxkZTsiOiAiXHUyMjQyXHUwMzM4IiwKICAgICJOb3RFeGlzdHM7IjogIlx1MjIwNCIsCiAgICAiTm90R3JlYXRlcjsiOiAiXHUyMjZmIiwKICAgICJOb3RHcmVhdGVyRXF1YWw7IjogIlx1MjI3MSIsCiAgICAiTm90R3JlYXRlckZ1bGxFcXVhbDsiOiAiXHUyMjY3XHUwMzM4IiwKICAgICJOb3RHcmVhdGVyR3JlYXRlcjsiOiAiXHUyMjZiXHUwMzM4IiwKICAgICJOb3RHcmVhdGVyTGVzczsiOiAiXHUyMjc5IiwKICAgICJOb3RHcmVhdGVyU2xhbnRFcXVhbDsiOiAiXHUyYTdlXHUwMzM4IiwKICAgICJOb3RHcmVhdGVyVGlsZGU7IjogIlx1MjI3NSIsCiAgICAiTm90SHVtcERvd25IdW1wOyI6ICJcdTIyNGVcdTAzMzgiLAogICAgIk5vdEh1bXBFcXVhbDsiOiAiXHUyMjRmXHUwMzM4IiwKICAgICJOb3RMZWZ0VHJpYW5nbGU7IjogIlx1MjJlYSIsCiAgICAiTm90TGVmdFRyaWFuZ2xlQmFyOyI6ICJcdTI5Y2ZcdTAzMzgiLAogICAgIk5vdExlZnRUcmlhbmdsZUVxdWFsOyI6ICJcdTIyZWMiLAogICAgIk5vdExlc3M7IjogIlx1MjI2ZSIsCiAgICAiTm90TGVzc0VxdWFsOyI6ICJcdTIyNzAiLAogICAgIk5vdExlc3NHcmVhdGVyOyI6ICJcdTIyNzgiLAogICAgIk5vdExlc3NMZXNzOyI6ICJcdTIyNmFcdTAzMzgiLAogICAgIk5vdExlc3NTbGFudEVxdWFsOyI6ICJcdTJhN2RcdTAzMzgiLAogICAgIk5vdExlc3NUaWxkZTsiOiAiXHUyMjc0IiwKICAgICJOb3ROZXN0ZWRHcmVhdGVyR3JlYXRlcjsiOiAiXHUyYWEyXHUwMzM4IiwKICAgICJOb3ROZXN0ZWRMZXNzTGVzczsiOiAiXHUyYWExXHUwMzM4IiwKICAgICJOb3RQcmVjZWRlczsiOiAiXHUyMjgwIiwKICAgICJOb3RQcmVjZWRlc0VxdWFsOyI6ICJcdTJhYWZcdTAzMzgiLAogICAgIk5vdFByZWNlZGVzU2xhbnRFcXVhbDsiOiAiXHUyMmUwIiwKICAgICJOb3RSZXZlcnNlRWxlbWVudDsiOiAiXHUyMjBjIiwKICAgICJOb3RSaWdodFRyaWFuZ2xlOyI6ICJcdTIyZWIiLAogICAgIk5vdFJpZ2h0VHJpYW5nbGVCYXI7IjogIlx1MjlkMFx1MDMzOCIsCiAgICAiTm90UmlnaHRUcmlhbmdsZUVxdWFsOyI6ICJcdTIyZWQiLAogICAgIk5vdFNxdWFyZVN1YnNldDsiOiAiXHUyMjhmXHUwMzM4IiwKICAgICJOb3RTcXVhcmVTdWJzZXRFcXVhbDsiOiAiXHUyMmUyIiwKICAgICJOb3RTcXVhcmVTdXBlcnNldDsiOiAiXHUyMjkwXHUwMzM4IiwKICAgICJOb3RTcXVhcmVTdXBlcnNldEVxdWFsOyI6ICJcdTIyZTMiLAogICAgIk5vdFN1YnNldDsiOiAiXHUyMjgyXHUyMGQyIiwKICAgICJOb3RTdWJzZXRFcXVhbDsiOiAiXHUyMjg4IiwKICAgICJOb3RTdWNjZWVkczsiOiAiXHUyMjgxIiwKICAgICJOb3RTdWNjZWVkc0VxdWFsOyI6ICJcdTJhYjBcdTAzMzgiLAogICAgIk5vdFN1Y2NlZWRzU2xhbnRFcXVhbDsiOiAiXHUyMmUxIiwKICAgICJOb3RTdWNjZWVkc1RpbGRlOyI6ICJcdTIyN2ZcdTAzMzgiLAogICAgIk5vdFN1cGVyc2V0OyI6ICJcdTIyODNcdTIwZDIiLAogICAgIk5vdFN1cGVyc2V0RXF1YWw7IjogIlx1MjI4OSIsCiAgICAiTm90VGlsZGU7IjogIlx1MjI0MSIsCiAgICAiTm90VGlsZGVFcXVhbDsiOiAiXHUyMjQ0IiwKICAgICJOb3RUaWxkZUZ1bGxFcXVhbDsiOiAiXHUyMjQ3IiwKICAgICJOb3RUaWxkZVRpbGRlOyI6ICJcdTIyNDkiLAogICAgIk5vdFZlcnRpY2FsQmFyOyI6ICJcdTIyMjQiLAogICAgIk5zY3I7IjogIlxVMDAwMWQ0YTkiLAogICAgIk50aWxkZSI6ICJceGQxIiwKICAgICJOdGlsZGU7IjogIlx4ZDEiLAogICAgIk51OyI6ICJcdTAzOWQiLAogICAgIk9FbGlnOyI6ICJcdTAxNTIiLAogICAgIk9hY3V0ZSI6ICJceGQzIiwKICAgICJPYWN1dGU7IjogIlx4ZDMiLAogICAgIk9jaXJjIjogIlx4ZDQiLAogICAgIk9jaXJjOyI6ICJceGQ0IiwKICAgICJPY3k7IjogIlx1MDQxZSIsCiAgICAiT2RibGFjOyI6ICJcdTAxNTAiLAogICAgIk9mcjsiOiAiXFUwMDAxZDUxMiIsCiAgICAiT2dyYXZlIjogIlx4ZDIiLAogICAgIk9ncmF2ZTsiOiAiXHhkMiIsCiAgICAiT21hY3I7IjogIlx1MDE0YyIsCiAgICAiT21lZ2E7IjogIlx1MDNhOSIsCiAgICAiT21pY3JvbjsiOiAiXHUwMzlmIiwKICAgICJPb3BmOyI6ICJcVTAwMDFkNTQ2IiwKICAgICJPcGVuQ3VybHlEb3VibGVRdW90ZTsiOiAiXHUyMDFjIiwKICAgICJPcGVuQ3VybHlRdW90ZTsiOiAiXHUyMDE4IiwKICAgICJPcjsiOiAiXHUyYTU0IiwKICAgICJPc2NyOyI6ICJcVTAwMDFkNGFhIiwKICAgICJPc2xhc2giOiAiXHhkOCIsCiAgICAiT3NsYXNoOyI6ICJceGQ4IiwKICAgICJPdGlsZGUiOiAiXHhkNSIsCiAgICAiT3RpbGRlOyI6ICJceGQ1IiwKICAgICJPdGltZXM7IjogIlx1MmEzNyIsCiAgICAiT3VtbCI6ICJceGQ2IiwKICAgICJPdW1sOyI6ICJceGQ2IiwKICAgICJPdmVyQmFyOyI6ICJcdTIwM2UiLAogICAgIk92ZXJCcmFjZTsiOiAiXHUyM2RlIiwKICAgICJPdmVyQnJhY2tldDsiOiAiXHUyM2I0IiwKICAgICJPdmVyUGFyZW50aGVzaXM7IjogIlx1MjNkYyIsCiAgICAiUGFydGlhbEQ7IjogIlx1MjIwMiIsCiAgICAiUGN5OyI6ICJcdTA0MWYiLAogICAgIlBmcjsiOiAiXFUwMDAxZDUxMyIsCiAgICAiUGhpOyI6ICJcdTAzYTYiLAogICAgIlBpOyI6ICJcdTAzYTAiLAogICAgIlBsdXNNaW51czsiOiAiXHhiMSIsCiAgICAiUG9pbmNhcmVwbGFuZTsiOiAiXHUyMTBjIiwKICAgICJQb3BmOyI6ICJcdTIxMTkiLAogICAgIlByOyI6ICJcdTJhYmIiLAogICAgIlByZWNlZGVzOyI6ICJcdTIyN2EiLAogICAgIlByZWNlZGVzRXF1YWw7IjogIlx1MmFhZiIsCiAgICAiUHJlY2VkZXNTbGFudEVxdWFsOyI6ICJcdTIyN2MiLAogICAgIlByZWNlZGVzVGlsZGU7IjogIlx1MjI3ZSIsCiAgICAiUHJpbWU7IjogIlx1MjAzMyIsCiAgICAiUHJvZHVjdDsiOiAiXHUyMjBmIiwKICAgICJQcm9wb3J0aW9uOyI6ICJcdTIyMzciLAogICAgIlByb3BvcnRpb25hbDsiOiAiXHUyMjFkIiwKICAgICJQc2NyOyI6ICJcVTAwMDFkNGFiIiwKICAgICJQc2k7IjogIlx1MDNhOCIsCiAgICAiUVVPVCI6ICJcIiIsCiAgICAiUVVPVDsiOiAiXCIiLAogICAgIlFmcjsiOiAiXFUwMDAxZDUxNCIsCiAgICAiUW9wZjsiOiAiXHUyMTFhIiwKICAgICJRc2NyOyI6ICJcVTAwMDFkNGFjIiwKICAgICJSQmFycjsiOiAiXHUyOTEwIiwKICAgICJSRUciOiAiXHhhZSIsCiAgICAiUkVHOyI6ICJceGFlIiwKICAgICJSYWN1dGU7IjogIlx1MDE1NCIsCiAgICAiUmFuZzsiOiAiXHUyN2ViIiwKICAgICJSYXJyOyI6ICJcdTIxYTAiLAogICAgIlJhcnJ0bDsiOiAiXHUyOTE2IiwKICAgICJSY2Fyb247IjogIlx1MDE1OCIsCiAgICAiUmNlZGlsOyI6ICJcdTAxNTYiLAogICAgIlJjeTsiOiAiXHUwNDIwIiwKICAgICJSZTsiOiAiXHUyMTFjIiwKICAgICJSZXZlcnNlRWxlbWVudDsiOiAiXHUyMjBiIiwKICAgICJSZXZlcnNlRXF1aWxpYnJpdW07IjogIlx1MjFjYiIsCiAgICAiUmV2ZXJzZVVwRXF1aWxpYnJpdW07IjogIlx1Mjk2ZiIsCiAgICAiUmZyOyI6ICJcdTIxMWMiLAogICAgIlJobzsiOiAiXHUwM2ExIiwKICAgICJSaWdodEFuZ2xlQnJhY2tldDsiOiAiXHUyN2U5IiwKICAgICJSaWdodEFycm93OyI6ICJcdTIxOTIiLAogICAgIlJpZ2h0QXJyb3dCYXI7IjogIlx1MjFlNSIsCiAgICAiUmlnaHRBcnJvd0xlZnRBcnJvdzsiOiAiXHUyMWM0IiwKICAgICJSaWdodENlaWxpbmc7IjogIlx1MjMwOSIsCiAgICAiUmlnaHREb3VibGVCcmFja2V0OyI6ICJcdTI3ZTciLAogICAgIlJpZ2h0RG93blRlZVZlY3RvcjsiOiAiXHUyOTVkIiwKICAgICJSaWdodERvd25WZWN0b3I7IjogIlx1MjFjMiIsCiAgICAiUmlnaHREb3duVmVjdG9yQmFyOyI6ICJcdTI5NTUiLAogICAgIlJpZ2h0Rmxvb3I7IjogIlx1MjMwYiIsCiAgICAiUmlnaHRUZWU7IjogIlx1MjJhMiIsCiAgICAiUmlnaHRUZWVBcnJvdzsiOiAiXHUyMWE2IiwKICAgICJSaWdodFRlZVZlY3RvcjsiOiAiXHUyOTViIiwKICAgICJSaWdodFRyaWFuZ2xlOyI6ICJcdTIyYjMiLAogICAgIlJpZ2h0VHJpYW5nbGVCYXI7IjogIlx1MjlkMCIsCiAgICAiUmlnaHRUcmlhbmdsZUVxdWFsOyI6ICJcdTIyYjUiLAogICAgIlJpZ2h0VXBEb3duVmVjdG9yOyI6ICJcdTI5NGYiLAogICAgIlJpZ2h0VXBUZWVWZWN0b3I7IjogIlx1Mjk1YyIsCiAgICAiUmlnaHRVcFZlY3RvcjsiOiAiXHUyMWJlIiwKICAgICJSaWdodFVwVmVjdG9yQmFyOyI6ICJcdTI5NTQiLAogICAgIlJpZ2h0VmVjdG9yOyI6ICJcdTIxYzAiLAogICAgIlJpZ2h0VmVjdG9yQmFyOyI6ICJcdTI5NTMiLAogICAgIlJpZ2h0YXJyb3c7IjogIlx1MjFkMiIsCiAgICAiUm9wZjsiOiAiXHUyMTFkIiwKICAgICJSb3VuZEltcGxpZXM7IjogIlx1Mjk3MCIsCiAgICAiUnJpZ2h0YXJyb3c7IjogIlx1MjFkYiIsCiAgICAiUnNjcjsiOiAiXHUyMTFiIiwKICAgICJSc2g7IjogIlx1MjFiMSIsCiAgICAiUnVsZURlbGF5ZWQ7IjogIlx1MjlmNCIsCiAgICAiU0hDSGN5OyI6ICJcdTA0MjkiLAogICAgIlNIY3k7IjogIlx1MDQyOCIsCiAgICAiU09GVGN5OyI6ICJcdTA0MmMiLAogICAgIlNhY3V0ZTsiOiAiXHUwMTVhIiwKICAgICJTYzsiOiAiXHUyYWJjIiwKICAgICJTY2Fyb247IjogIlx1MDE2MCIsCiAgICAiU2NlZGlsOyI6ICJcdTAxNWUiLAogICAgIlNjaXJjOyI6ICJcdTAxNWMiLAogICAgIlNjeTsiOiAiXHUwNDIxIiwKICAgICJTZnI7IjogIlxVMDAwMWQ1MTYiLAogICAgIlNob3J0RG93bkFycm93OyI6ICJcdTIxOTMiLAogICAgIlNob3J0TGVmdEFycm93OyI6ICJcdTIxOTAiLAogICAgIlNob3J0UmlnaHRBcnJvdzsiOiAiXHUyMTkyIiwKICAgICJTaG9ydFVwQXJyb3c7IjogIlx1MjE5MSIsCiAgICAiU2lnbWE7IjogIlx1MDNhMyIsCiAgICAiU21hbGxDaXJjbGU7IjogIlx1MjIxOCIsCiAgICAiU29wZjsiOiAiXFUwMDAxZDU0YSIsCiAgICAiU3FydDsiOiAiXHUyMjFhIiwKICAgICJTcXVhcmU7IjogIlx1MjVhMSIsCiAgICAiU3F1YXJlSW50ZXJzZWN0aW9uOyI6ICJcdTIyOTMiLAogICAgIlNxdWFyZVN1YnNldDsiOiAiXHUyMjhmIiwKICAgICJTcXVhcmVTdWJzZXRFcXVhbDsiOiAiXHUyMjkxIiwKICAgICJTcXVhcmVTdXBlcnNldDsiOiAiXHUyMjkwIiwKICAgICJTcXVhcmVTdXBlcnNldEVxdWFsOyI6ICJcdTIyOTIiLAogICAgIlNxdWFyZVVuaW9uOyI6ICJcdTIyOTQiLAogICAgIlNzY3I7IjogIlxVMDAwMWQ0YWUiLAogICAgIlN0YXI7IjogIlx1MjJjNiIsCiAgICAiU3ViOyI6ICJcdTIyZDAiLAogICAgIlN1YnNldDsiOiAiXHUyMmQwIiwKICAgICJTdWJzZXRFcXVhbDsiOiAiXHUyMjg2IiwKICAgICJTdWNjZWVkczsiOiAiXHUyMjdiIiwKICAgICJTdWNjZWVkc0VxdWFsOyI6ICJcdTJhYjAiLAogICAgIlN1Y2NlZWRzU2xhbnRFcXVhbDsiOiAiXHUyMjdkIiwKICAgICJTdWNjZWVkc1RpbGRlOyI6ICJcdTIyN2YiLAogICAgIlN1Y2hUaGF0OyI6ICJcdTIyMGIiLAogICAgIlN1bTsiOiAiXHUyMjExIiwKICAgICJTdXA7IjogIlx1MjJkMSIsCiAgICAiU3VwZXJzZXQ7IjogIlx1MjI4MyIsCiAgICAiU3VwZXJzZXRFcXVhbDsiOiAiXHUyMjg3IiwKICAgICJTdXBzZXQ7IjogIlx1MjJkMSIsCiAgICAiVEhPUk4iOiAiXHhkZSIsCiAgICAiVEhPUk47IjogIlx4ZGUiLAogICAgIlRSQURFOyI6ICJcdTIxMjIiLAogICAgIlRTSGN5OyI6ICJcdTA0MGIiLAogICAgIlRTY3k7IjogIlx1MDQyNiIsCiAgICAiVGFiOyI6ICJcdCIsCiAgICAiVGF1OyI6ICJcdTAzYTQiLAogICAgIlRjYXJvbjsiOiAiXHUwMTY0IiwKICAgICJUY2VkaWw7IjogIlx1MDE2MiIsCiAgICAiVGN5OyI6ICJcdTA0MjIiLAogICAgIlRmcjsiOiAiXFUwMDAxZDUxNyIsCiAgICAiVGhlcmVmb3JlOyI6ICJcdTIyMzQiLAogICAgIlRoZXRhOyI6ICJcdTAzOTgiLAogICAgIlRoaWNrU3BhY2U7IjogIlx1MjA1Zlx1MjAwYSIsCiAgICAiVGhpblNwYWNlOyI6ICJcdTIwMDkiLAogICAgIlRpbGRlOyI6ICJcdTIyM2MiLAogICAgIlRpbGRlRXF1YWw7IjogIlx1MjI0MyIsCiAgICAiVGlsZGVGdWxsRXF1YWw7IjogIlx1MjI0NSIsCiAgICAiVGlsZGVUaWxkZTsiOiAiXHUyMjQ4IiwKICAgICJUb3BmOyI6ICJcVTAwMDFkNTRiIiwKICAgICJUcmlwbGVEb3Q7IjogIlx1MjBkYiIsCiAgICAiVHNjcjsiOiAiXFUwMDAxZDRhZiIsCiAgICAiVHN0cm9rOyI6ICJcdTAxNjYiLAogICAgIlVhY3V0ZSI6ICJceGRhIiwKICAgICJVYWN1dGU7IjogIlx4ZGEiLAogICAgIlVhcnI7IjogIlx1MjE5ZiIsCiAgICAiVWFycm9jaXI7IjogIlx1Mjk0OSIsCiAgICAiVWJyY3k7IjogIlx1MDQwZSIsCiAgICAiVWJyZXZlOyI6ICJcdTAxNmMiLAogICAgIlVjaXJjIjogIlx4ZGIiLAogICAgIlVjaXJjOyI6ICJceGRiIiwKICAgICJVY3k7IjogIlx1MDQyMyIsCiAgICAiVWRibGFjOyI6ICJcdTAxNzAiLAogICAgIlVmcjsiOiAiXFUwMDAxZDUxOCIsCiAgICAiVWdyYXZlIjogIlx4ZDkiLAogICAgIlVncmF2ZTsiOiAiXHhkOSIsCiAgICAiVW1hY3I7IjogIlx1MDE2YSIsCiAgICAiVW5kZXJCYXI7IjogIl8iLAogICAgIlVuZGVyQnJhY2U7IjogIlx1MjNkZiIsCiAgICAiVW5kZXJCcmFja2V0OyI6ICJcdTIzYjUiLAogICAgIlVuZGVyUGFyZW50aGVzaXM7IjogIlx1MjNkZCIsCiAgICAiVW5pb247IjogIlx1MjJjMyIsCiAgICAiVW5pb25QbHVzOyI6ICJcdTIyOGUiLAogICAgIlVvZ29uOyI6ICJcdTAxNzIiLAogICAgIlVvcGY7IjogIlxVMDAwMWQ1NGMiLAogICAgIlVwQXJyb3c7IjogIlx1MjE5MSIsCiAgICAiVXBBcnJvd0JhcjsiOiAiXHUyOTEyIiwKICAgICJVcEFycm93RG93bkFycm93OyI6ICJcdTIxYzUiLAogICAgIlVwRG93bkFycm93OyI6ICJcdTIxOTUiLAogICAgIlVwRXF1aWxpYnJpdW07IjogIlx1Mjk2ZSIsCiAgICAiVXBUZWU7IjogIlx1MjJhNSIsCiAgICAiVXBUZWVBcnJvdzsiOiAiXHUyMWE1IiwKICAgICJVcGFycm93OyI6ICJcdTIxZDEiLAogICAgIlVwZG93bmFycm93OyI6ICJcdTIxZDUiLAogICAgIlVwcGVyTGVmdEFycm93OyI6ICJcdTIxOTYiLAogICAgIlVwcGVyUmlnaHRBcnJvdzsiOiAiXHUyMTk3IiwKICAgICJVcHNpOyI6ICJcdTAzZDIiLAogICAgIlVwc2lsb247IjogIlx1MDNhNSIsCiAgICAiVXJpbmc7IjogIlx1MDE2ZSIsCiAgICAiVXNjcjsiOiAiXFUwMDAxZDRiMCIsCiAgICAiVXRpbGRlOyI6ICJcdTAxNjgiLAogICAgIlV1bWwiOiAiXHhkYyIsCiAgICAiVXVtbDsiOiAiXHhkYyIsCiAgICAiVkRhc2g7IjogIlx1MjJhYiIsCiAgICAiVmJhcjsiOiAiXHUyYWViIiwKICAgICJWY3k7IjogIlx1MDQxMiIsCiAgICAiVmRhc2g7IjogIlx1MjJhOSIsCiAgICAiVmRhc2hsOyI6ICJcdTJhZTYiLAogICAgIlZlZTsiOiAiXHUyMmMxIiwKICAgICJWZXJiYXI7IjogIlx1MjAxNiIsCiAgICAiVmVydDsiOiAiXHUyMDE2IiwKICAgICJWZXJ0aWNhbEJhcjsiOiAiXHUyMjIzIiwKICAgICJWZXJ0aWNhbExpbmU7IjogInwiLAogICAgIlZlcnRpY2FsU2VwYXJhdG9yOyI6ICJcdTI3NTgiLAogICAgIlZlcnRpY2FsVGlsZGU7IjogIlx1MjI0MCIsCiAgICAiVmVyeVRoaW5TcGFjZTsiOiAiXHUyMDBhIiwKICAgICJWZnI7IjogIlxVMDAwMWQ1MTkiLAogICAgIlZvcGY7IjogIlxVMDAwMWQ1NGQiLAogICAgIlZzY3I7IjogIlxVMDAwMWQ0YjEiLAogICAgIlZ2ZGFzaDsiOiAiXHUyMmFhIiwKICAgICJXY2lyYzsiOiAiXHUwMTc0IiwKICAgICJXZWRnZTsiOiAiXHUyMmMwIiwKICAgICJXZnI7IjogIlxVMDAwMWQ1MWEiLAogICAgIldvcGY7IjogIlxVMDAwMWQ1NGUiLAogICAgIldzY3I7IjogIlxVMDAwMWQ0YjIiLAogICAgIlhmcjsiOiAiXFUwMDAxZDUxYiIsCiAgICAiWGk7IjogIlx1MDM5ZSIsCiAgICAiWG9wZjsiOiAiXFUwMDAxZDU0ZiIsCiAgICAiWHNjcjsiOiAiXFUwMDAxZDRiMyIsCiAgICAiWUFjeTsiOiAiXHUwNDJmIiwKICAgICJZSWN5OyI6ICJcdTA0MDciLAogICAgIllVY3k7IjogIlx1MDQyZSIsCiAgICAiWWFjdXRlIjogIlx4ZGQiLAogICAgIllhY3V0ZTsiOiAiXHhkZCIsCiAgICAiWWNpcmM7IjogIlx1MDE3NiIsCiAgICAiWWN5OyI6ICJcdTA0MmIiLAogICAgIllmcjsiOiAiXFUwMDAxZDUxYyIsCiAgICAiWW9wZjsiOiAiXFUwMDAxZDU1MCIsCiAgICAiWXNjcjsiOiAiXFUwMDAxZDRiNCIsCiAgICAiWXVtbDsiOiAiXHUwMTc4IiwKICAgICJaSGN5OyI6ICJcdTA0MTYiLAogICAgIlphY3V0ZTsiOiAiXHUwMTc5IiwKICAgICJaY2Fyb247IjogIlx1MDE3ZCIsCiAgICAiWmN5OyI6ICJcdTA0MTciLAogICAgIlpkb3Q7IjogIlx1MDE3YiIsCiAgICAiWmVyb1dpZHRoU3BhY2U7IjogIlx1MjAwYiIsCiAgICAiWmV0YTsiOiAiXHUwMzk2IiwKICAgICJaZnI7IjogIlx1MjEyOCIsCiAgICAiWm9wZjsiOiAiXHUyMTI0IiwKICAgICJac2NyOyI6ICJcVTAwMDFkNGI1IiwKICAgICJhYWN1dGUiOiAiXHhlMSIsCiAgICAiYWFjdXRlOyI6ICJceGUxIiwKICAgICJhYnJldmU7IjogIlx1MDEwMyIsCiAgICAiYWM7IjogIlx1MjIzZSIsCiAgICAiYWNFOyI6ICJcdTIyM2VcdTAzMzMiLAogICAgImFjZDsiOiAiXHUyMjNmIiwKICAgICJhY2lyYyI6ICJceGUyIiwKICAgICJhY2lyYzsiOiAiXHhlMiIsCiAgICAiYWN1dGUiOiAiXHhiNCIsCiAgICAiYWN1dGU7IjogIlx4YjQiLAogICAgImFjeTsiOiAiXHUwNDMwIiwKICAgICJhZWxpZyI6ICJceGU2IiwKICAgICJhZWxpZzsiOiAiXHhlNiIsCiAgICAiYWY7IjogIlx1MjA2MSIsCiAgICAiYWZyOyI6ICJcVTAwMDFkNTFlIiwKICAgICJhZ3JhdmUiOiAiXHhlMCIsCiAgICAiYWdyYXZlOyI6ICJceGUwIiwKICAgICJhbGVmc3ltOyI6ICJcdTIxMzUiLAogICAgImFsZXBoOyI6ICJcdTIxMzUiLAogICAgImFscGhhOyI6ICJcdTAzYjEiLAogICAgImFtYWNyOyI6ICJcdTAxMDEiLAogICAgImFtYWxnOyI6ICJcdTJhM2YiLAogICAgImFtcCI6ICImIiwKICAgICJhbXA7IjogIiYiLAogICAgImFuZDsiOiAiXHUyMjI3IiwKICAgICJhbmRhbmQ7IjogIlx1MmE1NSIsCiAgICAiYW5kZDsiOiAiXHUyYTVjIiwKICAgICJhbmRzbG9wZTsiOiAiXHUyYTU4IiwKICAgICJhbmR2OyI6ICJcdTJhNWEiLAogICAgImFuZzsiOiAiXHUyMjIwIiwKICAgICJhbmdlOyI6ICJcdTI5YTQiLAogICAgImFuZ2xlOyI6ICJcdTIyMjAiLAogICAgImFuZ21zZDsiOiAiXHUyMjIxIiwKICAgICJhbmdtc2RhYTsiOiAiXHUyOWE4IiwKICAgICJhbmdtc2RhYjsiOiAiXHUyOWE5IiwKICAgICJhbmdtc2RhYzsiOiAiXHUyOWFhIiwKICAgICJhbmdtc2RhZDsiOiAiXHUyOWFiIiwKICAgICJhbmdtc2RhZTsiOiAiXHUyOWFjIiwKICAgICJhbmdtc2RhZjsiOiAiXHUyOWFkIiwKICAgICJhbmdtc2RhZzsiOiAiXHUyOWFlIiwKICAgICJhbmdtc2RhaDsiOiAiXHUyOWFmIiwKICAgICJhbmdydDsiOiAiXHUyMjFmIiwKICAgICJhbmdydHZiOyI6ICJcdTIyYmUiLAogICAgImFuZ3J0dmJkOyI6ICJcdTI5OWQiLAogICAgImFuZ3NwaDsiOiAiXHUyMjIyIiwKICAgICJhbmdzdDsiOiAiXHhjNSIsCiAgICAiYW5nemFycjsiOiAiXHUyMzdjIiwKICAgICJhb2dvbjsiOiAiXHUwMTA1IiwKICAgICJhb3BmOyI6ICJcVTAwMDFkNTUyIiwKICAgICJhcDsiOiAiXHUyMjQ4IiwKICAgICJhcEU7IjogIlx1MmE3MCIsCiAgICAiYXBhY2lyOyI6ICJcdTJhNmYiLAogICAgImFwZTsiOiAiXHUyMjRhIiwKICAgICJhcGlkOyI6ICJcdTIyNGIiLAogICAgImFwb3M7IjogIiciLAogICAgImFwcHJveDsiOiAiXHUyMjQ4IiwKICAgICJhcHByb3hlcTsiOiAiXHUyMjRhIiwKICAgICJhcmluZyI6ICJceGU1IiwKICAgICJhcmluZzsiOiAiXHhlNSIsCiAgICAiYXNjcjsiOiAiXFUwMDAxZDRiNiIsCiAgICAiYXN0OyI6ICIqIiwKICAgICJhc3ltcDsiOiAiXHUyMjQ4IiwKICAgICJhc3ltcGVxOyI6ICJcdTIyNGQiLAogICAgImF0aWxkZSI6ICJceGUzIiwKICAgICJhdGlsZGU7IjogIlx4ZTMiLAogICAgImF1bWwiOiAiXHhlNCIsCiAgICAiYXVtbDsiOiAiXHhlNCIsCiAgICAiYXdjb25pbnQ7IjogIlx1MjIzMyIsCiAgICAiYXdpbnQ7IjogIlx1MmExMSIsCiAgICAiYk5vdDsiOiAiXHUyYWVkIiwKICAgICJiYWNrY29uZzsiOiAiXHUyMjRjIiwKICAgICJiYWNrZXBzaWxvbjsiOiAiXHUwM2Y2IiwKICAgICJiYWNrcHJpbWU7IjogIlx1MjAzNSIsCiAgICAiYmFja3NpbTsiOiAiXHUyMjNkIiwKICAgICJiYWNrc2ltZXE7IjogIlx1MjJjZCIsCiAgICAiYmFydmVlOyI6ICJcdTIyYmQiLAogICAgImJhcndlZDsiOiAiXHUyMzA1IiwKICAgICJiYXJ3ZWRnZTsiOiAiXHUyMzA1IiwKICAgICJiYnJrOyI6ICJcdTIzYjUiLAogICAgImJicmt0YnJrOyI6ICJcdTIzYjYiLAogICAgImJjb25nOyI6ICJcdTIyNGMiLAogICAgImJjeTsiOiAiXHUwNDMxIiwKICAgICJiZHF1bzsiOiAiXHUyMDFlIiwKICAgICJiZWNhdXM7IjogIlx1MjIzNSIsCiAgICAiYmVjYXVzZTsiOiAiXHUyMjM1IiwKICAgICJiZW1wdHl2OyI6ICJcdTI5YjAiLAogICAgImJlcHNpOyI6ICJcdTAzZjYiLAogICAgImJlcm5vdTsiOiAiXHUyMTJjIiwKICAgICJiZXRhOyI6ICJcdTAzYjIiLAogICAgImJldGg7IjogIlx1MjEzNiIsCiAgICAiYmV0d2VlbjsiOiAiXHUyMjZjIiwKICAgICJiZnI7IjogIlxVMDAwMWQ1MWYiLAogICAgImJpZ2NhcDsiOiAiXHUyMmMyIiwKICAgICJiaWdjaXJjOyI6ICJcdTI1ZWYiLAogICAgImJpZ2N1cDsiOiAiXHUyMmMzIiwKICAgICJiaWdvZG90OyI6ICJcdTJhMDAiLAogICAgImJpZ29wbHVzOyI6ICJcdTJhMDEiLAogICAgImJpZ290aW1lczsiOiAiXHUyYTAyIiwKICAgICJiaWdzcWN1cDsiOiAiXHUyYTA2IiwKICAgICJiaWdzdGFyOyI6ICJcdTI2MDUiLAogICAgImJpZ3RyaWFuZ2xlZG93bjsiOiAiXHUyNWJkIiwKICAgICJiaWd0cmlhbmdsZXVwOyI6ICJcdTI1YjMiLAogICAgImJpZ3VwbHVzOyI6ICJcdTJhMDQiLAogICAgImJpZ3ZlZTsiOiAiXHUyMmMxIiwKICAgICJiaWd3ZWRnZTsiOiAiXHUyMmMwIiwKICAgICJia2Fyb3c7IjogIlx1MjkwZCIsCiAgICAiYmxhY2tsb3plbmdlOyI6ICJcdTI5ZWIiLAogICAgImJsYWNrc3F1YXJlOyI6ICJcdTI1YWEiLAogICAgImJsYWNrdHJpYW5nbGU7IjogIlx1MjViNCIsCiAgICAiYmxhY2t0cmlhbmdsZWRvd247IjogIlx1MjViZSIsCiAgICAiYmxhY2t0cmlhbmdsZWxlZnQ7IjogIlx1MjVjMiIsCiAgICAiYmxhY2t0cmlhbmdsZXJpZ2h0OyI6ICJcdTI1YjgiLAogICAgImJsYW5rOyI6ICJcdTI0MjMiLAogICAgImJsazEyOyI6ICJcdTI1OTIiLAogICAgImJsazE0OyI6ICJcdTI1OTEiLAogICAgImJsazM0OyI6ICJcdTI1OTMiLAogICAgImJsb2NrOyI6ICJcdTI1ODgiLAogICAgImJuZTsiOiAiPVx1MjBlNSIsCiAgICAiYm5lcXVpdjsiOiAiXHUyMjYxXHUyMGU1IiwKICAgICJibm90OyI6ICJcdTIzMTAiLAogICAgImJvcGY7IjogIlxVMDAwMWQ1NTMiLAogICAgImJvdDsiOiAiXHUyMmE1IiwKICAgICJib3R0b207IjogIlx1MjJhNSIsCiAgICAiYm93dGllOyI6ICJcdTIyYzgiLAogICAgImJveERMOyI6ICJcdTI1NTciLAogICAgImJveERSOyI6ICJcdTI1NTQiLAogICAgImJveERsOyI6ICJcdTI1NTYiLAogICAgImJveERyOyI6ICJcdTI1NTMiLAogICAgImJveEg7IjogIlx1MjU1MCIsCiAgICAiYm94SEQ7IjogIlx1MjU2NiIsCiAgICAiYm94SFU7IjogIlx1MjU2OSIsCiAgICAiYm94SGQ7IjogIlx1MjU2NCIsCiAgICAiYm94SHU7IjogIlx1MjU2NyIsCiAgICAiYm94VUw7IjogIlx1MjU1ZCIsCiAgICAiYm94VVI7IjogIlx1MjU1YSIsCiAgICAiYm94VWw7IjogIlx1MjU1YyIsCiAgICAiYm94VXI7IjogIlx1MjU1OSIsCiAgICAiYm94VjsiOiAiXHUyNTUxIiwKICAgICJib3hWSDsiOiAiXHUyNTZjIiwKICAgICJib3hWTDsiOiAiXHUyNTYzIiwKICAgICJib3hWUjsiOiAiXHUyNTYwIiwKICAgICJib3hWaDsiOiAiXHUyNTZiIiwKICAgICJib3hWbDsiOiAiXHUyNTYyIiwKICAgICJib3hWcjsiOiAiXHUyNTVmIiwKICAgICJib3hib3g7IjogIlx1MjljOSIsCiAgICAiYm94ZEw7IjogIlx1MjU1NSIsCiAgICAiYm94ZFI7IjogIlx1MjU1MiIsCiAgICAiYm94ZGw7IjogIlx1MjUxMCIsCiAgICAiYm94ZHI7IjogIlx1MjUwYyIsCiAgICAiYm94aDsiOiAiXHUyNTAwIiwKICAgICJib3hoRDsiOiAiXHUyNTY1IiwKICAgICJib3hoVTsiOiAiXHUyNTY4IiwKICAgICJib3hoZDsiOiAiXHUyNTJjIiwKICAgICJib3hodTsiOiAiXHUyNTM0IiwKICAgICJib3htaW51czsiOiAiXHUyMjlmIiwKICAgICJib3hwbHVzOyI6ICJcdTIyOWUiLAogICAgImJveHRpbWVzOyI6ICJcdTIyYTAiLAogICAgImJveHVMOyI6ICJcdTI1NWIiLAogICAgImJveHVSOyI6ICJcdTI1NTgiLAogICAgImJveHVsOyI6ICJcdTI1MTgiLAogICAgImJveHVyOyI6ICJcdTI1MTQiLAogICAgImJveHY7IjogIlx1MjUwMiIsCiAgICAiYm94dkg7IjogIlx1MjU2YSIsCiAgICAiYm94dkw7IjogIlx1MjU2MSIsCiAgICAiYm94dlI7IjogIlx1MjU1ZSIsCiAgICAiYm94dmg7IjogIlx1MjUzYyIsCiAgICAiYm94dmw7IjogIlx1MjUyNCIsCiAgICAiYm94dnI7IjogIlx1MjUxYyIsCiAgICAiYnByaW1lOyI6ICJcdTIwMzUiLAogICAgImJyZXZlOyI6ICJcdTAyZDgiLAogICAgImJydmJhciI6ICJceGE2IiwKICAgICJicnZiYXI7IjogIlx4YTYiLAogICAgImJzY3I7IjogIlxVMDAwMWQ0YjciLAogICAgImJzZW1pOyI6ICJcdTIwNGYiLAogICAgImJzaW07IjogIlx1MjIzZCIsCiAgICAiYnNpbWU7IjogIlx1MjJjZCIsCiAgICAiYnNvbDsiOiAiXFwiLAogICAgImJzb2xiOyI6ICJcdTI5YzUiLAogICAgImJzb2xoc3ViOyI6ICJcdTI3YzgiLAogICAgImJ1bGw7IjogIlx1MjAyMiIsCiAgICAiYnVsbGV0OyI6ICJcdTIwMjIiLAogICAgImJ1bXA7IjogIlx1MjI0ZSIsCiAgICAiYnVtcEU7IjogIlx1MmFhZSIsCiAgICAiYnVtcGU7IjogIlx1MjI0ZiIsCiAgICAiYnVtcGVxOyI6ICJcdTIyNGYiLAogICAgImNhY3V0ZTsiOiAiXHUwMTA3IiwKICAgICJjYXA7IjogIlx1MjIyOSIsCiAgICAiY2FwYW5kOyI6ICJcdTJhNDQiLAogICAgImNhcGJyY3VwOyI6ICJcdTJhNDkiLAogICAgImNhcGNhcDsiOiAiXHUyYTRiIiwKICAgICJjYXBjdXA7IjogIlx1MmE0NyIsCiAgICAiY2FwZG90OyI6ICJcdTJhNDAiLAogICAgImNhcHM7IjogIlx1MjIyOVx1ZmUwMCIsCiAgICAiY2FyZXQ7IjogIlx1MjA0MSIsCiAgICAiY2Fyb247IjogIlx1MDJjNyIsCiAgICAiY2NhcHM7IjogIlx1MmE0ZCIsCiAgICAiY2Nhcm9uOyI6ICJcdTAxMGQiLAogICAgImNjZWRpbCI6ICJceGU3IiwKICAgICJjY2VkaWw7IjogIlx4ZTciLAogICAgImNjaXJjOyI6ICJcdTAxMDkiLAogICAgImNjdXBzOyI6ICJcdTJhNGMiLAogICAgImNjdXBzc207IjogIlx1MmE1MCIsCiAgICAiY2RvdDsiOiAiXHUwMTBiIiwKICAgICJjZWRpbCI6ICJceGI4IiwKICAgICJjZWRpbDsiOiAiXHhiOCIsCiAgICAiY2VtcHR5djsiOiAiXHUyOWIyIiwKICAgICJjZW50IjogIlx4YTIiLAogICAgImNlbnQ7IjogIlx4YTIiLAogICAgImNlbnRlcmRvdDsiOiAiXHhiNyIsCiAgICAiY2ZyOyI6ICJcVTAwMDFkNTIwIiwKICAgICJjaGN5OyI6ICJcdTA0NDciLAogICAgImNoZWNrOyI6ICJcdTI3MTMiLAogICAgImNoZWNrbWFyazsiOiAiXHUyNzEzIiwKICAgICJjaGk7IjogIlx1MDNjNyIsCiAgICAiY2lyOyI6ICJcdTI1Y2IiLAogICAgImNpckU7IjogIlx1MjljMyIsCiAgICAiY2lyYzsiOiAiXHUwMmM2IiwKICAgICJjaXJjZXE7IjogIlx1MjI1NyIsCiAgICAiY2lyY2xlYXJyb3dsZWZ0OyI6ICJcdTIxYmEiLAogICAgImNpcmNsZWFycm93cmlnaHQ7IjogIlx1MjFiYiIsCiAgICAiY2lyY2xlZFI7IjogIlx4YWUiLAogICAgImNpcmNsZWRTOyI6ICJcdTI0YzgiLAogICAgImNpcmNsZWRhc3Q7IjogIlx1MjI5YiIsCiAgICAiY2lyY2xlZGNpcmM7IjogIlx1MjI5YSIsCiAgICAiY2lyY2xlZGRhc2g7IjogIlx1MjI5ZCIsCiAgICAiY2lyZTsiOiAiXHUyMjU3IiwKICAgICJjaXJmbmludDsiOiAiXHUyYTEwIiwKICAgICJjaXJtaWQ7IjogIlx1MmFlZiIsCiAgICAiY2lyc2NpcjsiOiAiXHUyOWMyIiwKICAgICJjbHViczsiOiAiXHUyNjYzIiwKICAgICJjbHVic3VpdDsiOiAiXHUyNjYzIiwKICAgICJjb2xvbjsiOiAiOiIsCiAgICAiY29sb25lOyI6ICJcdTIyNTQiLAogICAgImNvbG9uZXE7IjogIlx1MjI1NCIsCiAgICAiY29tbWE7IjogIiwiLAogICAgImNvbW1hdDsiOiAiQCIsCiAgICAiY29tcDsiOiAiXHUyMjAxIiwKICAgICJjb21wZm47IjogIlx1MjIxOCIsCiAgICAiY29tcGxlbWVudDsiOiAiXHUyMjAxIiwKICAgICJjb21wbGV4ZXM7IjogIlx1MjEwMiIsCiAgICAiY29uZzsiOiAiXHUyMjQ1IiwKICAgICJjb25nZG90OyI6ICJcdTJhNmQiLAogICAgImNvbmludDsiOiAiXHUyMjJlIiwKICAgICJjb3BmOyI6ICJcVTAwMDFkNTU0IiwKICAgICJjb3Byb2Q7IjogIlx1MjIxMCIsCiAgICAiY29weSI6ICJceGE5IiwKICAgICJjb3B5OyI6ICJceGE5IiwKICAgICJjb3B5c3I7IjogIlx1MjExNyIsCiAgICAiY3JhcnI7IjogIlx1MjFiNSIsCiAgICAiY3Jvc3M7IjogIlx1MjcxNyIsCiAgICAiY3NjcjsiOiAiXFUwMDAxZDRiOCIsCiAgICAiY3N1YjsiOiAiXHUyYWNmIiwKICAgICJjc3ViZTsiOiAiXHUyYWQxIiwKICAgICJjc3VwOyI6ICJcdTJhZDAiLAogICAgImNzdXBlOyI6ICJcdTJhZDIiLAogICAgImN0ZG90OyI6ICJcdTIyZWYiLAogICAgImN1ZGFycmw7IjogIlx1MjkzOCIsCiAgICAiY3VkYXJycjsiOiAiXHUyOTM1IiwKICAgICJjdWVwcjsiOiAiXHUyMmRlIiwKICAgICJjdWVzYzsiOiAiXHUyMmRmIiwKICAgICJjdWxhcnI7IjogIlx1MjFiNiIsCiAgICAiY3VsYXJycDsiOiAiXHUyOTNkIiwKICAgICJjdXA7IjogIlx1MjIyYSIsCiAgICAiY3VwYnJjYXA7IjogIlx1MmE0OCIsCiAgICAiY3VwY2FwOyI6ICJcdTJhNDYiLAogICAgImN1cGN1cDsiOiAiXHUyYTRhIiwKICAgICJjdXBkb3Q7IjogIlx1MjI4ZCIsCiAgICAiY3Vwb3I7IjogIlx1MmE0NSIsCiAgICAiY3VwczsiOiAiXHUyMjJhXHVmZTAwIiwKICAgICJjdXJhcnI7IjogIlx1MjFiNyIsCiAgICAiY3VyYXJybTsiOiAiXHUyOTNjIiwKICAgICJjdXJseWVxcHJlYzsiOiAiXHUyMmRlIiwKICAgICJjdXJseWVxc3VjYzsiOiAiXHUyMmRmIiwKICAgICJjdXJseXZlZTsiOiAiXHUyMmNlIiwKICAgICJjdXJseXdlZGdlOyI6ICJcdTIyY2YiLAogICAgImN1cnJlbiI6ICJceGE0IiwKICAgICJjdXJyZW47IjogIlx4YTQiLAogICAgImN1cnZlYXJyb3dsZWZ0OyI6ICJcdTIxYjYiLAogICAgImN1cnZlYXJyb3dyaWdodDsiOiAiXHUyMWI3IiwKICAgICJjdXZlZTsiOiAiXHUyMmNlIiwKICAgICJjdXdlZDsiOiAiXHUyMmNmIiwKICAgICJjd2NvbmludDsiOiAiXHUyMjMyIiwKICAgICJjd2ludDsiOiAiXHUyMjMxIiwKICAgICJjeWxjdHk7IjogIlx1MjMyZCIsCiAgICAiZEFycjsiOiAiXHUyMWQzIiwKICAgICJkSGFyOyI6ICJcdTI5NjUiLAogICAgImRhZ2dlcjsiOiAiXHUyMDIwIiwKICAgICJkYWxldGg7IjogIlx1MjEzOCIsCiAgICAiZGFycjsiOiAiXHUyMTkzIiwKICAgICJkYXNoOyI6ICJcdTIwMTAiLAogICAgImRhc2h2OyI6ICJcdTIyYTMiLAogICAgImRia2Fyb3c7IjogIlx1MjkwZiIsCiAgICAiZGJsYWM7IjogIlx1MDJkZCIsCiAgICAiZGNhcm9uOyI6ICJcdTAxMGYiLAogICAgImRjeTsiOiAiXHUwNDM0IiwKICAgICJkZDsiOiAiXHUyMTQ2IiwKICAgICJkZGFnZ2VyOyI6ICJcdTIwMjEiLAogICAgImRkYXJyOyI6ICJcdTIxY2EiLAogICAgImRkb3RzZXE7IjogIlx1MmE3NyIsCiAgICAiZGVnIjogIlx4YjAiLAogICAgImRlZzsiOiAiXHhiMCIsCiAgICAiZGVsdGE7IjogIlx1MDNiNCIsCiAgICAiZGVtcHR5djsiOiAiXHUyOWIxIiwKICAgICJkZmlzaHQ7IjogIlx1Mjk3ZiIsCiAgICAiZGZyOyI6ICJcVTAwMDFkNTIxIiwKICAgICJkaGFybDsiOiAiXHUyMWMzIiwKICAgICJkaGFycjsiOiAiXHUyMWMyIiwKICAgICJkaWFtOyI6ICJcdTIyYzQiLAogICAgImRpYW1vbmQ7IjogIlx1MjJjNCIsCiAgICAiZGlhbW9uZHN1aXQ7IjogIlx1MjY2NiIsCiAgICAiZGlhbXM7IjogIlx1MjY2NiIsCiAgICAiZGllOyI6ICJceGE4IiwKICAgICJkaWdhbW1hOyI6ICJcdTAzZGQiLAogICAgImRpc2luOyI6ICJcdTIyZjIiLAogICAgImRpdjsiOiAiXHhmNyIsCiAgICAiZGl2aWRlIjogIlx4ZjciLAogICAgImRpdmlkZTsiOiAiXHhmNyIsCiAgICAiZGl2aWRlb250aW1lczsiOiAiXHUyMmM3IiwKICAgICJkaXZvbng7IjogIlx1MjJjNyIsCiAgICAiZGpjeTsiOiAiXHUwNDUyIiwKICAgICJkbGNvcm47IjogIlx1MjMxZSIsCiAgICAiZGxjcm9wOyI6ICJcdTIzMGQiLAogICAgImRvbGxhcjsiOiAiJCIsCiAgICAiZG9wZjsiOiAiXFUwMDAxZDU1NSIsCiAgICAiZG90OyI6ICJcdTAyZDkiLAogICAgImRvdGVxOyI6ICJcdTIyNTAiLAogICAgImRvdGVxZG90OyI6ICJcdTIyNTEiLAogICAgImRvdG1pbnVzOyI6ICJcdTIyMzgiLAogICAgImRvdHBsdXM7IjogIlx1MjIxNCIsCiAgICAiZG90c3F1YXJlOyI6ICJcdTIyYTEiLAogICAgImRvdWJsZWJhcndlZGdlOyI6ICJcdTIzMDYiLAogICAgImRvd25hcnJvdzsiOiAiXHUyMTkzIiwKICAgICJkb3duZG93bmFycm93czsiOiAiXHUyMWNhIiwKICAgICJkb3duaGFycG9vbmxlZnQ7IjogIlx1MjFjMyIsCiAgICAiZG93bmhhcnBvb25yaWdodDsiOiAiXHUyMWMyIiwKICAgICJkcmJrYXJvdzsiOiAiXHUyOTEwIiwKICAgICJkcmNvcm47IjogIlx1MjMxZiIsCiAgICAiZHJjcm9wOyI6ICJcdTIzMGMiLAogICAgImRzY3I7IjogIlxVMDAwMWQ0YjkiLAogICAgImRzY3k7IjogIlx1MDQ1NSIsCiAgICAiZHNvbDsiOiAiXHUyOWY2IiwKICAgICJkc3Ryb2s7IjogIlx1MDExMSIsCiAgICAiZHRkb3Q7IjogIlx1MjJmMSIsCiAgICAiZHRyaTsiOiAiXHUyNWJmIiwKICAgICJkdHJpZjsiOiAiXHUyNWJlIiwKICAgICJkdWFycjsiOiAiXHUyMWY1IiwKICAgICJkdWhhcjsiOiAiXHUyOTZmIiwKICAgICJkd2FuZ2xlOyI6ICJcdTI5YTYiLAogICAgImR6Y3k7IjogIlx1MDQ1ZiIsCiAgICAiZHppZ3JhcnI7IjogIlx1MjdmZiIsCiAgICAiZUREb3Q7IjogIlx1MmE3NyIsCiAgICAiZURvdDsiOiAiXHUyMjUxIiwKICAgICJlYWN1dGUiOiAiXHhlOSIsCiAgICAiZWFjdXRlOyI6ICJceGU5IiwKICAgICJlYXN0ZXI7IjogIlx1MmE2ZSIsCiAgICAiZWNhcm9uOyI6ICJcdTAxMWIiLAogICAgImVjaXI7IjogIlx1MjI1NiIsCiAgICAiZWNpcmMiOiAiXHhlYSIsCiAgICAiZWNpcmM7IjogIlx4ZWEiLAogICAgImVjb2xvbjsiOiAiXHUyMjU1IiwKICAgICJlY3k7IjogIlx1MDQ0ZCIsCiAgICAiZWRvdDsiOiAiXHUwMTE3IiwKICAgICJlZTsiOiAiXHUyMTQ3IiwKICAgICJlZkRvdDsiOiAiXHUyMjUyIiwKICAgICJlZnI7IjogIlxVMDAwMWQ1MjIiLAogICAgImVnOyI6ICJcdTJhOWEiLAogICAgImVncmF2ZSI6ICJceGU4IiwKICAgICJlZ3JhdmU7IjogIlx4ZTgiLAogICAgImVnczsiOiAiXHUyYTk2IiwKICAgICJlZ3Nkb3Q7IjogIlx1MmE5OCIsCiAgICAiZWw7IjogIlx1MmE5OSIsCiAgICAiZWxpbnRlcnM7IjogIlx1MjNlNyIsCiAgICAiZWxsOyI6ICJcdTIxMTMiLAogICAgImVsczsiOiAiXHUyYTk1IiwKICAgICJlbHNkb3Q7IjogIlx1MmE5NyIsCiAgICAiZW1hY3I7IjogIlx1MDExMyIsCiAgICAiZW1wdHk7IjogIlx1MjIwNSIsCiAgICAiZW1wdHlzZXQ7IjogIlx1MjIwNSIsCiAgICAiZW1wdHl2OyI6ICJcdTIyMDUiLAogICAgImVtc3AxMzsiOiAiXHUyMDA0IiwKICAgICJlbXNwMTQ7IjogIlx1MjAwNSIsCiAgICAiZW1zcDsiOiAiXHUyMDAzIiwKICAgICJlbmc7IjogIlx1MDE0YiIsCiAgICAiZW5zcDsiOiAiXHUyMDAyIiwKICAgICJlb2dvbjsiOiAiXHUwMTE5IiwKICAgICJlb3BmOyI6ICJcVTAwMDFkNTU2IiwKICAgICJlcGFyOyI6ICJcdTIyZDUiLAogICAgImVwYXJzbDsiOiAiXHUyOWUzIiwKICAgICJlcGx1czsiOiAiXHUyYTcxIiwKICAgICJlcHNpOyI6ICJcdTAzYjUiLAogICAgImVwc2lsb247IjogIlx1MDNiNSIsCiAgICAiZXBzaXY7IjogIlx1MDNmNSIsCiAgICAiZXFjaXJjOyI6ICJcdTIyNTYiLAogICAgImVxY29sb247IjogIlx1MjI1NSIsCiAgICAiZXFzaW07IjogIlx1MjI0MiIsCiAgICAiZXFzbGFudGd0cjsiOiAiXHUyYTk2IiwKICAgICJlcXNsYW50bGVzczsiOiAiXHUyYTk1IiwKICAgICJlcXVhbHM7IjogIj0iLAogICAgImVxdWVzdDsiOiAiXHUyMjVmIiwKICAgICJlcXVpdjsiOiAiXHUyMjYxIiwKICAgICJlcXVpdkREOyI6ICJcdTJhNzgiLAogICAgImVxdnBhcnNsOyI6ICJcdTI5ZTUiLAogICAgImVyRG90OyI6ICJcdTIyNTMiLAogICAgImVyYXJyOyI6ICJcdTI5NzEiLAogICAgImVzY3I7IjogIlx1MjEyZiIsCiAgICAiZXNkb3Q7IjogIlx1MjI1MCIsCiAgICAiZXNpbTsiOiAiXHUyMjQyIiwKICAgICJldGE7IjogIlx1MDNiNyIsCiAgICAiZXRoIjogIlx4ZjAiLAogICAgImV0aDsiOiAiXHhmMCIsCiAgICAiZXVtbCI6ICJceGViIiwKICAgICJldW1sOyI6ICJceGViIiwKICAgICJldXJvOyI6ICJcdTIwYWMiLAogICAgImV4Y2w7IjogIiEiLAogICAgImV4aXN0OyI6ICJcdTIyMDMiLAogICAgImV4cGVjdGF0aW9uOyI6ICJcdTIxMzAiLAogICAgImV4cG9uZW50aWFsZTsiOiAiXHUyMTQ3IiwKICAgICJmYWxsaW5nZG90c2VxOyI6ICJcdTIyNTIiLAogICAgImZjeTsiOiAiXHUwNDQ0IiwKICAgICJmZW1hbGU7IjogIlx1MjY0MCIsCiAgICAiZmZpbGlnOyI6ICJcdWZiMDMiLAogICAgImZmbGlnOyI6ICJcdWZiMDAiLAogICAgImZmbGxpZzsiOiAiXHVmYjA0IiwKICAgICJmZnI7IjogIlxVMDAwMWQ1MjMiLAogICAgImZpbGlnOyI6ICJcdWZiMDEiLAogICAgImZqbGlnOyI6ICJmaiIsCiAgICAiZmxhdDsiOiAiXHUyNjZkIiwKICAgICJmbGxpZzsiOiAiXHVmYjAyIiwKICAgICJmbHRuczsiOiAiXHUyNWIxIiwKICAgICJmbm9mOyI6ICJcdTAxOTIiLAogICAgImZvcGY7IjogIlxVMDAwMWQ1NTciLAogICAgImZvcmFsbDsiOiAiXHUyMjAwIiwKICAgICJmb3JrOyI6ICJcdTIyZDQiLAogICAgImZvcmt2OyI6ICJcdTJhZDkiLAogICAgImZwYXJ0aW50OyI6ICJcdTJhMGQiLAogICAgImZyYWMxMiI6ICJceGJkIiwKICAgICJmcmFjMTI7IjogIlx4YmQiLAogICAgImZyYWMxMzsiOiAiXHUyMTUzIiwKICAgICJmcmFjMTQiOiAiXHhiYyIsCiAgICAiZnJhYzE0OyI6ICJceGJjIiwKICAgICJmcmFjMTU7IjogIlx1MjE1NSIsCiAgICAiZnJhYzE2OyI6ICJcdTIxNTkiLAogICAgImZyYWMxODsiOiAiXHUyMTViIiwKICAgICJmcmFjMjM7IjogIlx1MjE1NCIsCiAgICAiZnJhYzI1OyI6ICJcdTIxNTYiLAogICAgImZyYWMzNCI6ICJceGJlIiwKICAgICJmcmFjMzQ7IjogIlx4YmUiLAogICAgImZyYWMzNTsiOiAiXHUyMTU3IiwKICAgICJmcmFjMzg7IjogIlx1MjE1YyIsCiAgICAiZnJhYzQ1OyI6ICJcdTIxNTgiLAogICAgImZyYWM1NjsiOiAiXHUyMTVhIiwKICAgICJmcmFjNTg7IjogIlx1MjE1ZCIsCiAgICAiZnJhYzc4OyI6ICJcdTIxNWUiLAogICAgImZyYXNsOyI6ICJcdTIwNDQiLAogICAgImZyb3duOyI6ICJcdTIzMjIiLAogICAgImZzY3I7IjogIlxVMDAwMWQ0YmIiLAogICAgImdFOyI6ICJcdTIyNjciLAogICAgImdFbDsiOiAiXHUyYThjIiwKICAgICJnYWN1dGU7IjogIlx1MDFmNSIsCiAgICAiZ2FtbWE7IjogIlx1MDNiMyIsCiAgICAiZ2FtbWFkOyI6ICJcdTAzZGQiLAogICAgImdhcDsiOiAiXHUyYTg2IiwKICAgICJnYnJldmU7IjogIlx1MDExZiIsCiAgICAiZ2NpcmM7IjogIlx1MDExZCIsCiAgICAiZ2N5OyI6ICJcdTA0MzMiLAogICAgImdkb3Q7IjogIlx1MDEyMSIsCiAgICAiZ2U7IjogIlx1MjI2NSIsCiAgICAiZ2VsOyI6ICJcdTIyZGIiLAogICAgImdlcTsiOiAiXHUyMjY1IiwKICAgICJnZXFxOyI6ICJcdTIyNjciLAogICAgImdlcXNsYW50OyI6ICJcdTJhN2UiLAogICAgImdlczsiOiAiXHUyYTdlIiwKICAgICJnZXNjYzsiOiAiXHUyYWE5IiwKICAgICJnZXNkb3Q7IjogIlx1MmE4MCIsCiAgICAiZ2VzZG90bzsiOiAiXHUyYTgyIiwKICAgICJnZXNkb3RvbDsiOiAiXHUyYTg0IiwKICAgICJnZXNsOyI6ICJcdTIyZGJcdWZlMDAiLAogICAgImdlc2xlczsiOiAiXHUyYTk0IiwKICAgICJnZnI7IjogIlxVMDAwMWQ1MjQiLAogICAgImdnOyI6ICJcdTIyNmIiLAogICAgImdnZzsiOiAiXHUyMmQ5IiwKICAgICJnaW1lbDsiOiAiXHUyMTM3IiwKICAgICJnamN5OyI6ICJcdTA0NTMiLAogICAgImdsOyI6ICJcdTIyNzciLAogICAgImdsRTsiOiAiXHUyYTkyIiwKICAgICJnbGE7IjogIlx1MmFhNSIsCiAgICAiZ2xqOyI6ICJcdTJhYTQiLAogICAgImduRTsiOiAiXHUyMjY5IiwKICAgICJnbmFwOyI6ICJcdTJhOGEiLAogICAgImduYXBwcm94OyI6ICJcdTJhOGEiLAogICAgImduZTsiOiAiXHUyYTg4IiwKICAgICJnbmVxOyI6ICJcdTJhODgiLAogICAgImduZXFxOyI6ICJcdTIyNjkiLAogICAgImduc2ltOyI6ICJcdTIyZTciLAogICAgImdvcGY7IjogIlxVMDAwMWQ1NTgiLAogICAgImdyYXZlOyI6ICJgIiwKICAgICJnc2NyOyI6ICJcdTIxMGEiLAogICAgImdzaW07IjogIlx1MjI3MyIsCiAgICAiZ3NpbWU7IjogIlx1MmE4ZSIsCiAgICAiZ3NpbWw7IjogIlx1MmE5MCIsCiAgICAiZ3QiOiAiPiIsCiAgICAiZ3Q7IjogIj4iLAogICAgImd0Y2M7IjogIlx1MmFhNyIsCiAgICAiZ3RjaXI7IjogIlx1MmE3YSIsCiAgICAiZ3Rkb3Q7IjogIlx1MjJkNyIsCiAgICAiZ3RsUGFyOyI6ICJcdTI5OTUiLAogICAgImd0cXVlc3Q7IjogIlx1MmE3YyIsCiAgICAiZ3RyYXBwcm94OyI6ICJcdTJhODYiLAogICAgImd0cmFycjsiOiAiXHUyOTc4IiwKICAgICJndHJkb3Q7IjogIlx1MjJkNyIsCiAgICAiZ3RyZXFsZXNzOyI6ICJcdTIyZGIiLAogICAgImd0cmVxcWxlc3M7IjogIlx1MmE4YyIsCiAgICAiZ3RybGVzczsiOiAiXHUyMjc3IiwKICAgICJndHJzaW07IjogIlx1MjI3MyIsCiAgICAiZ3ZlcnRuZXFxOyI6ICJcdTIyNjlcdWZlMDAiLAogICAgImd2bkU7IjogIlx1MjI2OVx1ZmUwMCIsCiAgICAiaEFycjsiOiAiXHUyMWQ0IiwKICAgICJoYWlyc3A7IjogIlx1MjAwYSIsCiAgICAiaGFsZjsiOiAiXHhiZCIsCiAgICAiaGFtaWx0OyI6ICJcdTIxMGIiLAogICAgImhhcmRjeTsiOiAiXHUwNDRhIiwKICAgICJoYXJyOyI6ICJcdTIxOTQiLAogICAgImhhcnJjaXI7IjogIlx1Mjk0OCIsCiAgICAiaGFycnc7IjogIlx1MjFhZCIsCiAgICAiaGJhcjsiOiAiXHUyMTBmIiwKICAgICJoY2lyYzsiOiAiXHUwMTI1IiwKICAgICJoZWFydHM7IjogIlx1MjY2NSIsCiAgICAiaGVhcnRzdWl0OyI6ICJcdTI2NjUiLAogICAgImhlbGxpcDsiOiAiXHUyMDI2IiwKICAgICJoZXJjb247IjogIlx1MjJiOSIsCiAgICAiaGZyOyI6ICJcVTAwMDFkNTI1IiwKICAgICJoa3NlYXJvdzsiOiAiXHUyOTI1IiwKICAgICJoa3N3YXJvdzsiOiAiXHUyOTI2IiwKICAgICJob2FycjsiOiAiXHUyMWZmIiwKICAgICJob210aHQ7IjogIlx1MjIzYiIsCiAgICAiaG9va2xlZnRhcnJvdzsiOiAiXHUyMWE5IiwKICAgICJob29rcmlnaHRhcnJvdzsiOiAiXHUyMWFhIiwKICAgICJob3BmOyI6ICJcVTAwMDFkNTU5IiwKICAgICJob3JiYXI7IjogIlx1MjAxNSIsCiAgICAiaHNjcjsiOiAiXFUwMDAxZDRiZCIsCiAgICAiaHNsYXNoOyI6ICJcdTIxMGYiLAogICAgImhzdHJvazsiOiAiXHUwMTI3IiwKICAgICJoeWJ1bGw7IjogIlx1MjA0MyIsCiAgICAiaHlwaGVuOyI6ICJcdTIwMTAiLAogICAgImlhY3V0ZSI6ICJceGVkIiwKICAgICJpYWN1dGU7IjogIlx4ZWQiLAogICAgImljOyI6ICJcdTIwNjMiLAogICAgImljaXJjIjogIlx4ZWUiLAogICAgImljaXJjOyI6ICJceGVlIiwKICAgICJpY3k7IjogIlx1MDQzOCIsCiAgICAiaWVjeTsiOiAiXHUwNDM1IiwKICAgICJpZXhjbCI6ICJceGExIiwKICAgICJpZXhjbDsiOiAiXHhhMSIsCiAgICAiaWZmOyI6ICJcdTIxZDQiLAogICAgImlmcjsiOiAiXFUwMDAxZDUyNiIsCiAgICAiaWdyYXZlIjogIlx4ZWMiLAogICAgImlncmF2ZTsiOiAiXHhlYyIsCiAgICAiaWk7IjogIlx1MjE0OCIsCiAgICAiaWlpaW50OyI6ICJcdTJhMGMiLAogICAgImlpaW50OyI6ICJcdTIyMmQiLAogICAgImlpbmZpbjsiOiAiXHUyOWRjIiwKICAgICJpaW90YTsiOiAiXHUyMTI5IiwKICAgICJpamxpZzsiOiAiXHUwMTMzIiwKICAgICJpbWFjcjsiOiAiXHUwMTJiIiwKICAgICJpbWFnZTsiOiAiXHUyMTExIiwKICAgICJpbWFnbGluZTsiOiAiXHUyMTEwIiwKICAgICJpbWFncGFydDsiOiAiXHUyMTExIiwKICAgICJpbWF0aDsiOiAiXHUwMTMxIiwKICAgICJpbW9mOyI6ICJcdTIyYjciLAogICAgImltcGVkOyI6ICJcdTAxYjUiLAogICAgImluOyI6ICJcdTIyMDgiLAogICAgImluY2FyZTsiOiAiXHUyMTA1IiwKICAgICJpbmZpbjsiOiAiXHUyMjFlIiwKICAgICJpbmZpbnRpZTsiOiAiXHUyOWRkIiwKICAgICJpbm9kb3Q7IjogIlx1MDEzMSIsCiAgICAiaW50OyI6ICJcdTIyMmIiLAogICAgImludGNhbDsiOiAiXHUyMmJhIiwKICAgICJpbnRlZ2VyczsiOiAiXHUyMTI0IiwKICAgICJpbnRlcmNhbDsiOiAiXHUyMmJhIiwKICAgICJpbnRsYXJoazsiOiAiXHUyYTE3IiwKICAgICJpbnRwcm9kOyI6ICJcdTJhM2MiLAogICAgImlvY3k7IjogIlx1MDQ1MSIsCiAgICAiaW9nb247IjogIlx1MDEyZiIsCiAgICAiaW9wZjsiOiAiXFUwMDAxZDU1YSIsCiAgICAiaW90YTsiOiAiXHUwM2I5IiwKICAgICJpcHJvZDsiOiAiXHUyYTNjIiwKICAgICJpcXVlc3QiOiAiXHhiZiIsCiAgICAiaXF1ZXN0OyI6ICJceGJmIiwKICAgICJpc2NyOyI6ICJcVTAwMDFkNGJlIiwKICAgICJpc2luOyI6ICJcdTIyMDgiLAogICAgImlzaW5FOyI6ICJcdTIyZjkiLAogICAgImlzaW5kb3Q7IjogIlx1MjJmNSIsCiAgICAiaXNpbnM7IjogIlx1MjJmNCIsCiAgICAiaXNpbnN2OyI6ICJcdTIyZjMiLAogICAgImlzaW52OyI6ICJcdTIyMDgiLAogICAgIml0OyI6ICJcdTIwNjIiLAogICAgIml0aWxkZTsiOiAiXHUwMTI5IiwKICAgICJpdWtjeTsiOiAiXHUwNDU2IiwKICAgICJpdW1sIjogIlx4ZWYiLAogICAgIml1bWw7IjogIlx4ZWYiLAogICAgImpjaXJjOyI6ICJcdTAxMzUiLAogICAgImpjeTsiOiAiXHUwNDM5IiwKICAgICJqZnI7IjogIlxVMDAwMWQ1MjciLAogICAgImptYXRoOyI6ICJcdTAyMzciLAogICAgImpvcGY7IjogIlxVMDAwMWQ1NWIiLAogICAgImpzY3I7IjogIlxVMDAwMWQ0YmYiLAogICAgImpzZXJjeTsiOiAiXHUwNDU4IiwKICAgICJqdWtjeTsiOiAiXHUwNDU0IiwKICAgICJrYXBwYTsiOiAiXHUwM2JhIiwKICAgICJrYXBwYXY7IjogIlx1MDNmMCIsCiAgICAia2NlZGlsOyI6ICJcdTAxMzciLAogICAgImtjeTsiOiAiXHUwNDNhIiwKICAgICJrZnI7IjogIlxVMDAwMWQ1MjgiLAogICAgImtncmVlbjsiOiAiXHUwMTM4IiwKICAgICJraGN5OyI6ICJcdTA0NDUiLAogICAgImtqY3k7IjogIlx1MDQ1YyIsCiAgICAia29wZjsiOiAiXFUwMDAxZDU1YyIsCiAgICAia3NjcjsiOiAiXFUwMDAxZDRjMCIsCiAgICAibEFhcnI7IjogIlx1MjFkYSIsCiAgICAibEFycjsiOiAiXHUyMWQwIiwKICAgICJsQXRhaWw7IjogIlx1MjkxYiIsCiAgICAibEJhcnI7IjogIlx1MjkwZSIsCiAgICAibEU7IjogIlx1MjI2NiIsCiAgICAibEVnOyI6ICJcdTJhOGIiLAogICAgImxIYXI7IjogIlx1Mjk2MiIsCiAgICAibGFjdXRlOyI6ICJcdTAxM2EiLAogICAgImxhZW1wdHl2OyI6ICJcdTI5YjQiLAogICAgImxhZ3JhbjsiOiAiXHUyMTEyIiwKICAgICJsYW1iZGE7IjogIlx1MDNiYiIsCiAgICAibGFuZzsiOiAiXHUyN2U4IiwKICAgICJsYW5nZDsiOiAiXHUyOTkxIiwKICAgICJsYW5nbGU7IjogIlx1MjdlOCIsCiAgICAibGFwOyI6ICJcdTJhODUiLAogICAgImxhcXVvIjogIlx4YWIiLAogICAgImxhcXVvOyI6ICJceGFiIiwKICAgICJsYXJyOyI6ICJcdTIxOTAiLAogICAgImxhcnJiOyI6ICJcdTIxZTQiLAogICAgImxhcnJiZnM7IjogIlx1MjkxZiIsCiAgICAibGFycmZzOyI6ICJcdTI5MWQiLAogICAgImxhcnJoazsiOiAiXHUyMWE5IiwKICAgICJsYXJybHA7IjogIlx1MjFhYiIsCiAgICAibGFycnBsOyI6ICJcdTI5MzkiLAogICAgImxhcnJzaW07IjogIlx1Mjk3MyIsCiAgICAibGFycnRsOyI6ICJcdTIxYTIiLAogICAgImxhdDsiOiAiXHUyYWFiIiwKICAgICJsYXRhaWw7IjogIlx1MjkxOSIsCiAgICAibGF0ZTsiOiAiXHUyYWFkIiwKICAgICJsYXRlczsiOiAiXHUyYWFkXHVmZTAwIiwKICAgICJsYmFycjsiOiAiXHUyOTBjIiwKICAgICJsYmJyazsiOiAiXHUyNzcyIiwKICAgICJsYnJhY2U7IjogInsiLAogICAgImxicmFjazsiOiAiWyIsCiAgICAibGJya2U7IjogIlx1Mjk4YiIsCiAgICAibGJya3NsZDsiOiAiXHUyOThmIiwKICAgICJsYnJrc2x1OyI6ICJcdTI5OGQiLAogICAgImxjYXJvbjsiOiAiXHUwMTNlIiwKICAgICJsY2VkaWw7IjogIlx1MDEzYyIsCiAgICAibGNlaWw7IjogIlx1MjMwOCIsCiAgICAibGN1YjsiOiAieyIsCiAgICAibGN5OyI6ICJcdTA0M2IiLAogICAgImxkY2E7IjogIlx1MjkzNiIsCiAgICAibGRxdW87IjogIlx1MjAxYyIsCiAgICAibGRxdW9yOyI6ICJcdTIwMWUiLAogICAgImxkcmRoYXI7IjogIlx1Mjk2NyIsCiAgICAibGRydXNoYXI7IjogIlx1Mjk0YiIsCiAgICAibGRzaDsiOiAiXHUyMWIyIiwKICAgICJsZTsiOiAiXHUyMjY0IiwKICAgICJsZWZ0YXJyb3c7IjogIlx1MjE5MCIsCiAgICAibGVmdGFycm93dGFpbDsiOiAiXHUyMWEyIiwKICAgICJsZWZ0aGFycG9vbmRvd247IjogIlx1MjFiZCIsCiAgICAibGVmdGhhcnBvb251cDsiOiAiXHUyMWJjIiwKICAgICJsZWZ0bGVmdGFycm93czsiOiAiXHUyMWM3IiwKICAgICJsZWZ0cmlnaHRhcnJvdzsiOiAiXHUyMTk0IiwKICAgICJsZWZ0cmlnaHRhcnJvd3M7IjogIlx1MjFjNiIsCiAgICAibGVmdHJpZ2h0aGFycG9vbnM7IjogIlx1MjFjYiIsCiAgICAibGVmdHJpZ2h0c3F1aWdhcnJvdzsiOiAiXHUyMWFkIiwKICAgICJsZWZ0dGhyZWV0aW1lczsiOiAiXHUyMmNiIiwKICAgICJsZWc7IjogIlx1MjJkYSIsCiAgICAibGVxOyI6ICJcdTIyNjQiLAogICAgImxlcXE7IjogIlx1MjI2NiIsCiAgICAibGVxc2xhbnQ7IjogIlx1MmE3ZCIsCiAgICAibGVzOyI6ICJcdTJhN2QiLAogICAgImxlc2NjOyI6ICJcdTJhYTgiLAogICAgImxlc2RvdDsiOiAiXHUyYTdmIiwKICAgICJsZXNkb3RvOyI6ICJcdTJhODEiLAogICAgImxlc2RvdG9yOyI6ICJcdTJhODMiLAogICAgImxlc2c7IjogIlx1MjJkYVx1ZmUwMCIsCiAgICAibGVzZ2VzOyI6ICJcdTJhOTMiLAogICAgImxlc3NhcHByb3g7IjogIlx1MmE4NSIsCiAgICAibGVzc2RvdDsiOiAiXHUyMmQ2IiwKICAgICJsZXNzZXFndHI7IjogIlx1MjJkYSIsCiAgICAibGVzc2VxcWd0cjsiOiAiXHUyYThiIiwKICAgICJsZXNzZ3RyOyI6ICJcdTIyNzYiLAogICAgImxlc3NzaW07IjogIlx1MjI3MiIsCiAgICAibGZpc2h0OyI6ICJcdTI5N2MiLAogICAgImxmbG9vcjsiOiAiXHUyMzBhIiwKICAgICJsZnI7IjogIlxVMDAwMWQ1MjkiLAogICAgImxnOyI6ICJcdTIyNzYiLAogICAgImxnRTsiOiAiXHUyYTkxIiwKICAgICJsaGFyZDsiOiAiXHUyMWJkIiwKICAgICJsaGFydTsiOiAiXHUyMWJjIiwKICAgICJsaGFydWw7IjogIlx1Mjk2YSIsCiAgICAibGhibGs7IjogIlx1MjU4NCIsCiAgICAibGpjeTsiOiAiXHUwNDU5IiwKICAgICJsbDsiOiAiXHUyMjZhIiwKICAgICJsbGFycjsiOiAiXHUyMWM3IiwKICAgICJsbGNvcm5lcjsiOiAiXHUyMzFlIiwKICAgICJsbGhhcmQ7IjogIlx1Mjk2YiIsCiAgICAibGx0cmk7IjogIlx1MjVmYSIsCiAgICAibG1pZG90OyI6ICJcdTAxNDAiLAogICAgImxtb3VzdDsiOiAiXHUyM2IwIiwKICAgICJsbW91c3RhY2hlOyI6ICJcdTIzYjAiLAogICAgImxuRTsiOiAiXHUyMjY4IiwKICAgICJsbmFwOyI6ICJcdTJhODkiLAogICAgImxuYXBwcm94OyI6ICJcdTJhODkiLAogICAgImxuZTsiOiAiXHUyYTg3IiwKICAgICJsbmVxOyI6ICJcdTJhODciLAogICAgImxuZXFxOyI6ICJcdTIyNjgiLAogICAgImxuc2ltOyI6ICJcdTIyZTYiLAogICAgImxvYW5nOyI6ICJcdTI3ZWMiLAogICAgImxvYXJyOyI6ICJcdTIxZmQiLAogICAgImxvYnJrOyI6ICJcdTI3ZTYiLAogICAgImxvbmdsZWZ0YXJyb3c7IjogIlx1MjdmNSIsCiAgICAibG9uZ2xlZnRyaWdodGFycm93OyI6ICJcdTI3ZjciLAogICAgImxvbmdtYXBzdG87IjogIlx1MjdmYyIsCiAgICAibG9uZ3JpZ2h0YXJyb3c7IjogIlx1MjdmNiIsCiAgICAibG9vcGFycm93bGVmdDsiOiAiXHUyMWFiIiwKICAgICJsb29wYXJyb3dyaWdodDsiOiAiXHUyMWFjIiwKICAgICJsb3BhcjsiOiAiXHUyOTg1IiwKICAgICJsb3BmOyI6ICJcVTAwMDFkNTVkIiwKICAgICJsb3BsdXM7IjogIlx1MmEyZCIsCiAgICAibG90aW1lczsiOiAiXHUyYTM0IiwKICAgICJsb3dhc3Q7IjogIlx1MjIxNyIsCiAgICAibG93YmFyOyI6ICJfIiwKICAgICJsb3o7IjogIlx1MjVjYSIsCiAgICAibG96ZW5nZTsiOiAiXHUyNWNhIiwKICAgICJsb3pmOyI6ICJcdTI5ZWIiLAogICAgImxwYXI7IjogIigiLAogICAgImxwYXJsdDsiOiAiXHUyOTkzIiwKICAgICJscmFycjsiOiAiXHUyMWM2IiwKICAgICJscmNvcm5lcjsiOiAiXHUyMzFmIiwKICAgICJscmhhcjsiOiAiXHUyMWNiIiwKICAgICJscmhhcmQ7IjogIlx1Mjk2ZCIsCiAgICAibHJtOyI6ICJcdTIwMGUiLAogICAgImxydHJpOyI6ICJcdTIyYmYiLAogICAgImxzYXF1bzsiOiAiXHUyMDM5IiwKICAgICJsc2NyOyI6ICJcVTAwMDFkNGMxIiwKICAgICJsc2g7IjogIlx1MjFiMCIsCiAgICAibHNpbTsiOiAiXHUyMjcyIiwKICAgICJsc2ltZTsiOiAiXHUyYThkIiwKICAgICJsc2ltZzsiOiAiXHUyYThmIiwKICAgICJsc3FiOyI6ICJbIiwKICAgICJsc3F1bzsiOiAiXHUyMDE4IiwKICAgICJsc3F1b3I7IjogIlx1MjAxYSIsCiAgICAibHN0cm9rOyI6ICJcdTAxNDIiLAogICAgImx0IjogIjwiLAogICAgImx0OyI6ICI8IiwKICAgICJsdGNjOyI6ICJcdTJhYTYiLAogICAgImx0Y2lyOyI6ICJcdTJhNzkiLAogICAgImx0ZG90OyI6ICJcdTIyZDYiLAogICAgImx0aHJlZTsiOiAiXHUyMmNiIiwKICAgICJsdGltZXM7IjogIlx1MjJjOSIsCiAgICAibHRsYXJyOyI6ICJcdTI5NzYiLAogICAgImx0cXVlc3Q7IjogIlx1MmE3YiIsCiAgICAibHRyUGFyOyI6ICJcdTI5OTYiLAogICAgImx0cmk7IjogIlx1MjVjMyIsCiAgICAibHRyaWU7IjogIlx1MjJiNCIsCiAgICAibHRyaWY7IjogIlx1MjVjMiIsCiAgICAibHVyZHNoYXI7IjogIlx1Mjk0YSIsCiAgICAibHVydWhhcjsiOiAiXHUyOTY2IiwKICAgICJsdmVydG5lcXE7IjogIlx1MjI2OFx1ZmUwMCIsCiAgICAibHZuRTsiOiAiXHUyMjY4XHVmZTAwIiwKICAgICJtRERvdDsiOiAiXHUyMjNhIiwKICAgICJtYWNyIjogIlx4YWYiLAogICAgIm1hY3I7IjogIlx4YWYiLAogICAgIm1hbGU7IjogIlx1MjY0MiIsCiAgICAibWFsdDsiOiAiXHUyNzIwIiwKICAgICJtYWx0ZXNlOyI6ICJcdTI3MjAiLAogICAgIm1hcDsiOiAiXHUyMWE2IiwKICAgICJtYXBzdG87IjogIlx1MjFhNiIsCiAgICAibWFwc3RvZG93bjsiOiAiXHUyMWE3IiwKICAgICJtYXBzdG9sZWZ0OyI6ICJcdTIxYTQiLAogICAgIm1hcHN0b3VwOyI6ICJcdTIxYTUiLAogICAgIm1hcmtlcjsiOiAiXHUyNWFlIiwKICAgICJtY29tbWE7IjogIlx1MmEyOSIsCiAgICAibWN5OyI6ICJcdTA0M2MiLAogICAgIm1kYXNoOyI6ICJcdTIwMTQiLAogICAgIm1lYXN1cmVkYW5nbGU7IjogIlx1MjIyMSIsCiAgICAibWZyOyI6ICJcVTAwMDFkNTJhIiwKICAgICJtaG87IjogIlx1MjEyNyIsCiAgICAibWljcm8iOiAiXHhiNSIsCiAgICAibWljcm87IjogIlx4YjUiLAogICAgIm1pZDsiOiAiXHUyMjIzIiwKICAgICJtaWRhc3Q7IjogIioiLAogICAgIm1pZGNpcjsiOiAiXHUyYWYwIiwKICAgICJtaWRkb3QiOiAiXHhiNyIsCiAgICAibWlkZG90OyI6ICJceGI3IiwKICAgICJtaW51czsiOiAiXHUyMjEyIiwKICAgICJtaW51c2I7IjogIlx1MjI5ZiIsCiAgICAibWludXNkOyI6ICJcdTIyMzgiLAogICAgIm1pbnVzZHU7IjogIlx1MmEyYSIsCiAgICAibWxjcDsiOiAiXHUyYWRiIiwKICAgICJtbGRyOyI6ICJcdTIwMjYiLAogICAgIm1ucGx1czsiOiAiXHUyMjEzIiwKICAgICJtb2RlbHM7IjogIlx1MjJhNyIsCiAgICAibW9wZjsiOiAiXFUwMDAxZDU1ZSIsCiAgICAibXA7IjogIlx1MjIxMyIsCiAgICAibXNjcjsiOiAiXFUwMDAxZDRjMiIsCiAgICAibXN0cG9zOyI6ICJcdTIyM2UiLAogICAgIm11OyI6ICJcdTAzYmMiLAogICAgIm11bHRpbWFwOyI6ICJcdTIyYjgiLAogICAgIm11bWFwOyI6ICJcdTIyYjgiLAogICAgIm5HZzsiOiAiXHUyMmQ5XHUwMzM4IiwKICAgICJuR3Q7IjogIlx1MjI2Ylx1MjBkMiIsCiAgICAibkd0djsiOiAiXHUyMjZiXHUwMzM4IiwKICAgICJuTGVmdGFycm93OyI6ICJcdTIxY2QiLAogICAgIm5MZWZ0cmlnaHRhcnJvdzsiOiAiXHUyMWNlIiwKICAgICJuTGw7IjogIlx1MjJkOFx1MDMzOCIsCiAgICAibkx0OyI6ICJcdTIyNmFcdTIwZDIiLAogICAgIm5MdHY7IjogIlx1MjI2YVx1MDMzOCIsCiAgICAiblJpZ2h0YXJyb3c7IjogIlx1MjFjZiIsCiAgICAiblZEYXNoOyI6ICJcdTIyYWYiLAogICAgIm5WZGFzaDsiOiAiXHUyMmFlIiwKICAgICJuYWJsYTsiOiAiXHUyMjA3IiwKICAgICJuYWN1dGU7IjogIlx1MDE0NCIsCiAgICAibmFuZzsiOiAiXHUyMjIwXHUyMGQyIiwKICAgICJuYXA7IjogIlx1MjI0OSIsCiAgICAibmFwRTsiOiAiXHUyYTcwXHUwMzM4IiwKICAgICJuYXBpZDsiOiAiXHUyMjRiXHUwMzM4IiwKICAgICJuYXBvczsiOiAiXHUwMTQ5IiwKICAgICJuYXBwcm94OyI6ICJcdTIyNDkiLAogICAgIm5hdHVyOyI6ICJcdTI2NmUiLAogICAgIm5hdHVyYWw7IjogIlx1MjY2ZSIsCiAgICAibmF0dXJhbHM7IjogIlx1MjExNSIsCiAgICAibmJzcCI6ICJceGEwIiwKICAgICJuYnNwOyI6ICJceGEwIiwKICAgICJuYnVtcDsiOiAiXHUyMjRlXHUwMzM4IiwKICAgICJuYnVtcGU7IjogIlx1MjI0Zlx1MDMzOCIsCiAgICAibmNhcDsiOiAiXHUyYTQzIiwKICAgICJuY2Fyb247IjogIlx1MDE0OCIsCiAgICAibmNlZGlsOyI6ICJcdTAxNDYiLAogICAgIm5jb25nOyI6ICJcdTIyNDciLAogICAgIm5jb25nZG90OyI6ICJcdTJhNmRcdTAzMzgiLAogICAgIm5jdXA7IjogIlx1MmE0MiIsCiAgICAibmN5OyI6ICJcdTA0M2QiLAogICAgIm5kYXNoOyI6ICJcdTIwMTMiLAogICAgIm5lOyI6ICJcdTIyNjAiLAogICAgIm5lQXJyOyI6ICJcdTIxZDciLAogICAgIm5lYXJoazsiOiAiXHUyOTI0IiwKICAgICJuZWFycjsiOiAiXHUyMTk3IiwKICAgICJuZWFycm93OyI6ICJcdTIxOTciLAogICAgIm5lZG90OyI6ICJcdTIyNTBcdTAzMzgiLAogICAgIm5lcXVpdjsiOiAiXHUyMjYyIiwKICAgICJuZXNlYXI7IjogIlx1MjkyOCIsCiAgICAibmVzaW07IjogIlx1MjI0Mlx1MDMzOCIsCiAgICAibmV4aXN0OyI6ICJcdTIyMDQiLAogICAgIm5leGlzdHM7IjogIlx1MjIwNCIsCiAgICAibmZyOyI6ICJcVTAwMDFkNTJiIiwKICAgICJuZ0U7IjogIlx1MjI2N1x1MDMzOCIsCiAgICAibmdlOyI6ICJcdTIyNzEiLAogICAgIm5nZXE7IjogIlx1MjI3MSIsCiAgICAibmdlcXE7IjogIlx1MjI2N1x1MDMzOCIsCiAgICAibmdlcXNsYW50OyI6ICJcdTJhN2VcdTAzMzgiLAogICAgIm5nZXM7IjogIlx1MmE3ZVx1MDMzOCIsCiAgICAibmdzaW07IjogIlx1MjI3NSIsCiAgICAibmd0OyI6ICJcdTIyNmYiLAogICAgIm5ndHI7IjogIlx1MjI2ZiIsCiAgICAibmhBcnI7IjogIlx1MjFjZSIsCiAgICAibmhhcnI7IjogIlx1MjFhZSIsCiAgICAibmhwYXI7IjogIlx1MmFmMiIsCiAgICAibmk7IjogIlx1MjIwYiIsCiAgICAibmlzOyI6ICJcdTIyZmMiLAogICAgIm5pc2Q7IjogIlx1MjJmYSIsCiAgICAibml2OyI6ICJcdTIyMGIiLAogICAgIm5qY3k7IjogIlx1MDQ1YSIsCiAgICAibmxBcnI7IjogIlx1MjFjZCIsCiAgICAibmxFOyI6ICJcdTIyNjZcdTAzMzgiLAogICAgIm5sYXJyOyI6ICJcdTIxOWEiLAogICAgIm5sZHI7IjogIlx1MjAyNSIsCiAgICAibmxlOyI6ICJcdTIyNzAiLAogICAgIm5sZWZ0YXJyb3c7IjogIlx1MjE5YSIsCiAgICAibmxlZnRyaWdodGFycm93OyI6ICJcdTIxYWUiLAogICAgIm5sZXE7IjogIlx1MjI3MCIsCiAgICAibmxlcXE7IjogIlx1MjI2Nlx1MDMzOCIsCiAgICAibmxlcXNsYW50OyI6ICJcdTJhN2RcdTAzMzgiLAogICAgIm5sZXM7IjogIlx1MmE3ZFx1MDMzOCIsCiAgICAibmxlc3M7IjogIlx1MjI2ZSIsCiAgICAibmxzaW07IjogIlx1MjI3NCIsCiAgICAibmx0OyI6ICJcdTIyNmUiLAogICAgIm5sdHJpOyI6ICJcdTIyZWEiLAogICAgIm5sdHJpZTsiOiAiXHUyMmVjIiwKICAgICJubWlkOyI6ICJcdTIyMjQiLAogICAgIm5vcGY7IjogIlxVMDAwMWQ1NWYiLAogICAgIm5vdCI6ICJceGFjIiwKICAgICJub3Q7IjogIlx4YWMiLAogICAgIm5vdGluOyI6ICJcdTIyMDkiLAogICAgIm5vdGluRTsiOiAiXHUyMmY5XHUwMzM4IiwKICAgICJub3RpbmRvdDsiOiAiXHUyMmY1XHUwMzM4IiwKICAgICJub3RpbnZhOyI6ICJcdTIyMDkiLAogICAgIm5vdGludmI7IjogIlx1MjJmNyIsCiAgICAibm90aW52YzsiOiAiXHUyMmY2IiwKICAgICJub3RuaTsiOiAiXHUyMjBjIiwKICAgICJub3RuaXZhOyI6ICJcdTIyMGMiLAogICAgIm5vdG5pdmI7IjogIlx1MjJmZSIsCiAgICAibm90bml2YzsiOiAiXHUyMmZkIiwKICAgICJucGFyOyI6ICJcdTIyMjYiLAogICAgIm5wYXJhbGxlbDsiOiAiXHUyMjI2IiwKICAgICJucGFyc2w7IjogIlx1MmFmZFx1MjBlNSIsCiAgICAibnBhcnQ7IjogIlx1MjIwMlx1MDMzOCIsCiAgICAibnBvbGludDsiOiAiXHUyYTE0IiwKICAgICJucHI7IjogIlx1MjI4MCIsCiAgICAibnByY3VlOyI6ICJcdTIyZTAiLAogICAgIm5wcmU7IjogIlx1MmFhZlx1MDMzOCIsCiAgICAibnByZWM7IjogIlx1MjI4MCIsCiAgICAibnByZWNlcTsiOiAiXHUyYWFmXHUwMzM4IiwKICAgICJuckFycjsiOiAiXHUyMWNmIiwKICAgICJucmFycjsiOiAiXHUyMTliIiwKICAgICJucmFycmM7IjogIlx1MjkzM1x1MDMzOCIsCiAgICAibnJhcnJ3OyI6ICJcdTIxOWRcdTAzMzgiLAogICAgIm5yaWdodGFycm93OyI6ICJcdTIxOWIiLAogICAgIm5ydHJpOyI6ICJcdTIyZWIiLAogICAgIm5ydHJpZTsiOiAiXHUyMmVkIiwKICAgICJuc2M7IjogIlx1MjI4MSIsCiAgICAibnNjY3VlOyI6ICJcdTIyZTEiLAogICAgIm5zY2U7IjogIlx1MmFiMFx1MDMzOCIsCiAgICAibnNjcjsiOiAiXFUwMDAxZDRjMyIsCiAgICAibnNob3J0bWlkOyI6ICJcdTIyMjQiLAogICAgIm5zaG9ydHBhcmFsbGVsOyI6ICJcdTIyMjYiLAogICAgIm5zaW07IjogIlx1MjI0MSIsCiAgICAibnNpbWU7IjogIlx1MjI0NCIsCiAgICAibnNpbWVxOyI6ICJcdTIyNDQiLAogICAgIm5zbWlkOyI6ICJcdTIyMjQiLAogICAgIm5zcGFyOyI6ICJcdTIyMjYiLAogICAgIm5zcXN1YmU7IjogIlx1MjJlMiIsCiAgICAibnNxc3VwZTsiOiAiXHUyMmUzIiwKICAgICJuc3ViOyI6ICJcdTIyODQiLAogICAgIm5zdWJFOyI6ICJcdTJhYzVcdTAzMzgiLAogICAgIm5zdWJlOyI6ICJcdTIyODgiLAogICAgIm5zdWJzZXQ7IjogIlx1MjI4Mlx1MjBkMiIsCiAgICAibnN1YnNldGVxOyI6ICJcdTIyODgiLAogICAgIm5zdWJzZXRlcXE7IjogIlx1MmFjNVx1MDMzOCIsCiAgICAibnN1Y2M7IjogIlx1MjI4MSIsCiAgICAibnN1Y2NlcTsiOiAiXHUyYWIwXHUwMzM4IiwKICAgICJuc3VwOyI6ICJcdTIyODUiLAogICAgIm5zdXBFOyI6ICJcdTJhYzZcdTAzMzgiLAogICAgIm5zdXBlOyI6ICJcdTIyODkiLAogICAgIm5zdXBzZXQ7IjogIlx1MjI4M1x1MjBkMiIsCiAgICAibnN1cHNldGVxOyI6ICJcdTIyODkiLAogICAgIm5zdXBzZXRlcXE7IjogIlx1MmFjNlx1MDMzOCIsCiAgICAibnRnbDsiOiAiXHUyMjc5IiwKICAgICJudGlsZGUiOiAiXHhmMSIsCiAgICAibnRpbGRlOyI6ICJceGYxIiwKICAgICJudGxnOyI6ICJcdTIyNzgiLAogICAgIm50cmlhbmdsZWxlZnQ7IjogIlx1MjJlYSIsCiAgICAibnRyaWFuZ2xlbGVmdGVxOyI6ICJcdTIyZWMiLAogICAgIm50cmlhbmdsZXJpZ2h0OyI6ICJcdTIyZWIiLAogICAgIm50cmlhbmdsZXJpZ2h0ZXE7IjogIlx1MjJlZCIsCiAgICAibnU7IjogIlx1MDNiZCIsCiAgICAibnVtOyI6ICIjIiwKICAgICJudW1lcm87IjogIlx1MjExNiIsCiAgICAibnVtc3A7IjogIlx1MjAwNyIsCiAgICAibnZEYXNoOyI6ICJcdTIyYWQiLAogICAgIm52SGFycjsiOiAiXHUyOTA0IiwKICAgICJudmFwOyI6ICJcdTIyNGRcdTIwZDIiLAogICAgIm52ZGFzaDsiOiAiXHUyMmFjIiwKICAgICJudmdlOyI6ICJcdTIyNjVcdTIwZDIiLAogICAgIm52Z3Q7IjogIj5cdTIwZDIiLAogICAgIm52aW5maW47IjogIlx1MjlkZSIsCiAgICAibnZsQXJyOyI6ICJcdTI5MDIiLAogICAgIm52bGU7IjogIlx1MjI2NFx1MjBkMiIsCiAgICAibnZsdDsiOiAiPFx1MjBkMiIsCiAgICAibnZsdHJpZTsiOiAiXHUyMmI0XHUyMGQyIiwKICAgICJudnJBcnI7IjogIlx1MjkwMyIsCiAgICAibnZydHJpZTsiOiAiXHUyMmI1XHUyMGQyIiwKICAgICJudnNpbTsiOiAiXHUyMjNjXHUyMGQyIiwKICAgICJud0FycjsiOiAiXHUyMWQ2IiwKICAgICJud2FyaGs7IjogIlx1MjkyMyIsCiAgICAibndhcnI7IjogIlx1MjE5NiIsCiAgICAibndhcnJvdzsiOiAiXHUyMTk2IiwKICAgICJud25lYXI7IjogIlx1MjkyNyIsCiAgICAib1M7IjogIlx1MjRjOCIsCiAgICAib2FjdXRlIjogIlx4ZjMiLAogICAgIm9hY3V0ZTsiOiAiXHhmMyIsCiAgICAib2FzdDsiOiAiXHUyMjliIiwKICAgICJvY2lyOyI6ICJcdTIyOWEiLAogICAgIm9jaXJjIjogIlx4ZjQiLAogICAgIm9jaXJjOyI6ICJceGY0IiwKICAgICJvY3k7IjogIlx1MDQzZSIsCiAgICAib2Rhc2g7IjogIlx1MjI5ZCIsCiAgICAib2RibGFjOyI6ICJcdTAxNTEiLAogICAgIm9kaXY7IjogIlx1MmEzOCIsCiAgICAib2RvdDsiOiAiXHUyMjk5IiwKICAgICJvZHNvbGQ7IjogIlx1MjliYyIsCiAgICAib2VsaWc7IjogIlx1MDE1MyIsCiAgICAib2ZjaXI7IjogIlx1MjliZiIsCiAgICAib2ZyOyI6ICJcVTAwMDFkNTJjIiwKICAgICJvZ29uOyI6ICJcdTAyZGIiLAogICAgIm9ncmF2ZSI6ICJceGYyIiwKICAgICJvZ3JhdmU7IjogIlx4ZjIiLAogICAgIm9ndDsiOiAiXHUyOWMxIiwKICAgICJvaGJhcjsiOiAiXHUyOWI1IiwKICAgICJvaG07IjogIlx1MDNhOSIsCiAgICAib2ludDsiOiAiXHUyMjJlIiwKICAgICJvbGFycjsiOiAiXHUyMWJhIiwKICAgICJvbGNpcjsiOiAiXHUyOWJlIiwKICAgICJvbGNyb3NzOyI6ICJcdTI5YmIiLAogICAgIm9saW5lOyI6ICJcdTIwM2UiLAogICAgIm9sdDsiOiAiXHUyOWMwIiwKICAgICJvbWFjcjsiOiAiXHUwMTRkIiwKICAgICJvbWVnYTsiOiAiXHUwM2M5IiwKICAgICJvbWljcm9uOyI6ICJcdTAzYmYiLAogICAgIm9taWQ7IjogIlx1MjliNiIsCiAgICAib21pbnVzOyI6ICJcdTIyOTYiLAogICAgIm9vcGY7IjogIlxVMDAwMWQ1NjAiLAogICAgIm9wYXI7IjogIlx1MjliNyIsCiAgICAib3BlcnA7IjogIlx1MjliOSIsCiAgICAib3BsdXM7IjogIlx1MjI5NSIsCiAgICAib3I7IjogIlx1MjIyOCIsCiAgICAib3JhcnI7IjogIlx1MjFiYiIsCiAgICAib3JkOyI6ICJcdTJhNWQiLAogICAgIm9yZGVyOyI6ICJcdTIxMzQiLAogICAgIm9yZGVyb2Y7IjogIlx1MjEzNCIsCiAgICAib3JkZiI6ICJceGFhIiwKICAgICJvcmRmOyI6ICJceGFhIiwKICAgICJvcmRtIjogIlx4YmEiLAogICAgIm9yZG07IjogIlx4YmEiLAogICAgIm9yaWdvZjsiOiAiXHUyMmI2IiwKICAgICJvcm9yOyI6ICJcdTJhNTYiLAogICAgIm9yc2xvcGU7IjogIlx1MmE1NyIsCiAgICAib3J2OyI6ICJcdTJhNWIiLAogICAgIm9zY3I7IjogIlx1MjEzNCIsCiAgICAib3NsYXNoIjogIlx4ZjgiLAogICAgIm9zbGFzaDsiOiAiXHhmOCIsCiAgICAib3NvbDsiOiAiXHUyMjk4IiwKICAgICJvdGlsZGUiOiAiXHhmNSIsCiAgICAib3RpbGRlOyI6ICJceGY1IiwKICAgICJvdGltZXM7IjogIlx1MjI5NyIsCiAgICAib3RpbWVzYXM7IjogIlx1MmEzNiIsCiAgICAib3VtbCI6ICJceGY2IiwKICAgICJvdW1sOyI6ICJceGY2IiwKICAgICJvdmJhcjsiOiAiXHUyMzNkIiwKICAgICJwYXI7IjogIlx1MjIyNSIsCiAgICAicGFyYSI6ICJceGI2IiwKICAgICJwYXJhOyI6ICJceGI2IiwKICAgICJwYXJhbGxlbDsiOiAiXHUyMjI1IiwKICAgICJwYXJzaW07IjogIlx1MmFmMyIsCiAgICAicGFyc2w7IjogIlx1MmFmZCIsCiAgICAicGFydDsiOiAiXHUyMjAyIiwKICAgICJwY3k7IjogIlx1MDQzZiIsCiAgICAicGVyY250OyI6ICIlIiwKICAgICJwZXJpb2Q7IjogIi4iLAogICAgInBlcm1pbDsiOiAiXHUyMDMwIiwKICAgICJwZXJwOyI6ICJcdTIyYTUiLAogICAgInBlcnRlbms7IjogIlx1MjAzMSIsCiAgICAicGZyOyI6ICJcVTAwMDFkNTJkIiwKICAgICJwaGk7IjogIlx1MDNjNiIsCiAgICAicGhpdjsiOiAiXHUwM2Q1IiwKICAgICJwaG1tYXQ7IjogIlx1MjEzMyIsCiAgICAicGhvbmU7IjogIlx1MjYwZSIsCiAgICAicGk7IjogIlx1MDNjMCIsCiAgICAicGl0Y2hmb3JrOyI6ICJcdTIyZDQiLAogICAgInBpdjsiOiAiXHUwM2Q2IiwKICAgICJwbGFuY2s7IjogIlx1MjEwZiIsCiAgICAicGxhbmNraDsiOiAiXHUyMTBlIiwKICAgICJwbGFua3Y7IjogIlx1MjEwZiIsCiAgICAicGx1czsiOiAiKyIsCiAgICAicGx1c2FjaXI7IjogIlx1MmEyMyIsCiAgICAicGx1c2I7IjogIlx1MjI5ZSIsCiAgICAicGx1c2NpcjsiOiAiXHUyYTIyIiwKICAgICJwbHVzZG87IjogIlx1MjIxNCIsCiAgICAicGx1c2R1OyI6ICJcdTJhMjUiLAogICAgInBsdXNlOyI6ICJcdTJhNzIiLAogICAgInBsdXNtbiI6ICJceGIxIiwKICAgICJwbHVzbW47IjogIlx4YjEiLAogICAgInBsdXNzaW07IjogIlx1MmEyNiIsCiAgICAicGx1c3R3bzsiOiAiXHUyYTI3IiwKICAgICJwbTsiOiAiXHhiMSIsCiAgICAicG9pbnRpbnQ7IjogIlx1MmExNSIsCiAgICAicG9wZjsiOiAiXFUwMDAxZDU2MSIsCiAgICAicG91bmQiOiAiXHhhMyIsCiAgICAicG91bmQ7IjogIlx4YTMiLAogICAgInByOyI6ICJcdTIyN2EiLAogICAgInByRTsiOiAiXHUyYWIzIiwKICAgICJwcmFwOyI6ICJcdTJhYjciLAogICAgInByY3VlOyI6ICJcdTIyN2MiLAogICAgInByZTsiOiAiXHUyYWFmIiwKICAgICJwcmVjOyI6ICJcdTIyN2EiLAogICAgInByZWNhcHByb3g7IjogIlx1MmFiNyIsCiAgICAicHJlY2N1cmx5ZXE7IjogIlx1MjI3YyIsCiAgICAicHJlY2VxOyI6ICJcdTJhYWYiLAogICAgInByZWNuYXBwcm94OyI6ICJcdTJhYjkiLAogICAgInByZWNuZXFxOyI6ICJcdTJhYjUiLAogICAgInByZWNuc2ltOyI6ICJcdTIyZTgiLAogICAgInByZWNzaW07IjogIlx1MjI3ZSIsCiAgICAicHJpbWU7IjogIlx1MjAzMiIsCiAgICAicHJpbWVzOyI6ICJcdTIxMTkiLAogICAgInBybkU7IjogIlx1MmFiNSIsCiAgICAicHJuYXA7IjogIlx1MmFiOSIsCiAgICAicHJuc2ltOyI6ICJcdTIyZTgiLAogICAgInByb2Q7IjogIlx1MjIwZiIsCiAgICAicHJvZmFsYXI7IjogIlx1MjMyZSIsCiAgICAicHJvZmxpbmU7IjogIlx1MjMxMiIsCiAgICAicHJvZnN1cmY7IjogIlx1MjMxMyIsCiAgICAicHJvcDsiOiAiXHUyMjFkIiwKICAgICJwcm9wdG87IjogIlx1MjIxZCIsCiAgICAicHJzaW07IjogIlx1MjI3ZSIsCiAgICAicHJ1cmVsOyI6ICJcdTIyYjAiLAogICAgInBzY3I7IjogIlxVMDAwMWQ0YzUiLAogICAgInBzaTsiOiAiXHUwM2M4IiwKICAgICJwdW5jc3A7IjogIlx1MjAwOCIsCiAgICAicWZyOyI6ICJcVTAwMDFkNTJlIiwKICAgICJxaW50OyI6ICJcdTJhMGMiLAogICAgInFvcGY7IjogIlxVMDAwMWQ1NjIiLAogICAgInFwcmltZTsiOiAiXHUyMDU3IiwKICAgICJxc2NyOyI6ICJcVTAwMDFkNGM2IiwKICAgICJxdWF0ZXJuaW9uczsiOiAiXHUyMTBkIiwKICAgICJxdWF0aW50OyI6ICJcdTJhMTYiLAogICAgInF1ZXN0OyI6ICI/IiwKICAgICJxdWVzdGVxOyI6ICJcdTIyNWYiLAogICAgInF1b3QiOiAiXCIiLAogICAgInF1b3Q7IjogIlwiIiwKICAgICJyQWFycjsiOiAiXHUyMWRiIiwKICAgICJyQXJyOyI6ICJcdTIxZDIiLAogICAgInJBdGFpbDsiOiAiXHUyOTFjIiwKICAgICJyQmFycjsiOiAiXHUyOTBmIiwKICAgICJySGFyOyI6ICJcdTI5NjQiLAogICAgInJhY2U7IjogIlx1MjIzZFx1MDMzMSIsCiAgICAicmFjdXRlOyI6ICJcdTAxNTUiLAogICAgInJhZGljOyI6ICJcdTIyMWEiLAogICAgInJhZW1wdHl2OyI6ICJcdTI5YjMiLAogICAgInJhbmc7IjogIlx1MjdlOSIsCiAgICAicmFuZ2Q7IjogIlx1Mjk5MiIsCiAgICAicmFuZ2U7IjogIlx1MjlhNSIsCiAgICAicmFuZ2xlOyI6ICJcdTI3ZTkiLAogICAgInJhcXVvIjogIlx4YmIiLAogICAgInJhcXVvOyI6ICJceGJiIiwKICAgICJyYXJyOyI6ICJcdTIxOTIiLAogICAgInJhcnJhcDsiOiAiXHUyOTc1IiwKICAgICJyYXJyYjsiOiAiXHUyMWU1IiwKICAgICJyYXJyYmZzOyI6ICJcdTI5MjAiLAogICAgInJhcnJjOyI6ICJcdTI5MzMiLAogICAgInJhcnJmczsiOiAiXHUyOTFlIiwKICAgICJyYXJyaGs7IjogIlx1MjFhYSIsCiAgICAicmFycmxwOyI6ICJcdTIxYWMiLAogICAgInJhcnJwbDsiOiAiXHUyOTQ1IiwKICAgICJyYXJyc2ltOyI6ICJcdTI5NzQiLAogICAgInJhcnJ0bDsiOiAiXHUyMWEzIiwKICAgICJyYXJydzsiOiAiXHUyMTlkIiwKICAgICJyYXRhaWw7IjogIlx1MjkxYSIsCiAgICAicmF0aW87IjogIlx1MjIzNiIsCiAgICAicmF0aW9uYWxzOyI6ICJcdTIxMWEiLAogICAgInJiYXJyOyI6ICJcdTI5MGQiLAogICAgInJiYnJrOyI6ICJcdTI3NzMiLAogICAgInJicmFjZTsiOiAifSIsCiAgICAicmJyYWNrOyI6ICJdIiwKICAgICJyYnJrZTsiOiAiXHUyOThjIiwKICAgICJyYnJrc2xkOyI6ICJcdTI5OGUiLAogICAgInJicmtzbHU7IjogIlx1Mjk5MCIsCiAgICAicmNhcm9uOyI6ICJcdTAxNTkiLAogICAgInJjZWRpbDsiOiAiXHUwMTU3IiwKICAgICJyY2VpbDsiOiAiXHUyMzA5IiwKICAgICJyY3ViOyI6ICJ9IiwKICAgICJyY3k7IjogIlx1MDQ0MCIsCiAgICAicmRjYTsiOiAiXHUyOTM3IiwKICAgICJyZGxkaGFyOyI6ICJcdTI5NjkiLAogICAgInJkcXVvOyI6ICJcdTIwMWQiLAogICAgInJkcXVvcjsiOiAiXHUyMDFkIiwKICAgICJyZHNoOyI6ICJcdTIxYjMiLAogICAgInJlYWw7IjogIlx1MjExYyIsCiAgICAicmVhbGluZTsiOiAiXHUyMTFiIiwKICAgICJyZWFscGFydDsiOiAiXHUyMTFjIiwKICAgICJyZWFsczsiOiAiXHUyMTFkIiwKICAgICJyZWN0OyI6ICJcdTI1YWQiLAogICAgInJlZyI6ICJceGFlIiwKICAgICJyZWc7IjogIlx4YWUiLAogICAgInJmaXNodDsiOiAiXHUyOTdkIiwKICAgICJyZmxvb3I7IjogIlx1MjMwYiIsCiAgICAicmZyOyI6ICJcVTAwMDFkNTJmIiwKICAgICJyaGFyZDsiOiAiXHUyMWMxIiwKICAgICJyaGFydTsiOiAiXHUyMWMwIiwKICAgICJyaGFydWw7IjogIlx1Mjk2YyIsCiAgICAicmhvOyI6ICJcdTAzYzEiLAogICAgInJob3Y7IjogIlx1MDNmMSIsCiAgICAicmlnaHRhcnJvdzsiOiAiXHUyMTkyIiwKICAgICJyaWdodGFycm93dGFpbDsiOiAiXHUyMWEzIiwKICAgICJyaWdodGhhcnBvb25kb3duOyI6ICJcdTIxYzEiLAogICAgInJpZ2h0aGFycG9vbnVwOyI6ICJcdTIxYzAiLAogICAgInJpZ2h0bGVmdGFycm93czsiOiAiXHUyMWM0IiwKICAgICJyaWdodGxlZnRoYXJwb29uczsiOiAiXHUyMWNjIiwKICAgICJyaWdodHJpZ2h0YXJyb3dzOyI6ICJcdTIxYzkiLAogICAgInJpZ2h0c3F1aWdhcnJvdzsiOiAiXHUyMTlkIiwKICAgICJyaWdodHRocmVldGltZXM7IjogIlx1MjJjYyIsCiAgICAicmluZzsiOiAiXHUwMmRhIiwKICAgICJyaXNpbmdkb3RzZXE7IjogIlx1MjI1MyIsCiAgICAicmxhcnI7IjogIlx1MjFjNCIsCiAgICAicmxoYXI7IjogIlx1MjFjYyIsCiAgICAicmxtOyI6ICJcdTIwMGYiLAogICAgInJtb3VzdDsiOiAiXHUyM2IxIiwKICAgICJybW91c3RhY2hlOyI6ICJcdTIzYjEiLAogICAgInJubWlkOyI6ICJcdTJhZWUiLAogICAgInJvYW5nOyI6ICJcdTI3ZWQiLAogICAgInJvYXJyOyI6ICJcdTIxZmUiLAogICAgInJvYnJrOyI6ICJcdTI3ZTciLAogICAgInJvcGFyOyI6ICJcdTI5ODYiLAogICAgInJvcGY7IjogIlxVMDAwMWQ1NjMiLAogICAgInJvcGx1czsiOiAiXHUyYTJlIiwKICAgICJyb3RpbWVzOyI6ICJcdTJhMzUiLAogICAgInJwYXI7IjogIikiLAogICAgInJwYXJndDsiOiAiXHUyOTk0IiwKICAgICJycHBvbGludDsiOiAiXHUyYTEyIiwKICAgICJycmFycjsiOiAiXHUyMWM5IiwKICAgICJyc2FxdW87IjogIlx1MjAzYSIsCiAgICAicnNjcjsiOiAiXFUwMDAxZDRjNyIsCiAgICAicnNoOyI6ICJcdTIxYjEiLAogICAgInJzcWI7IjogIl0iLAogICAgInJzcXVvOyI6ICJcdTIwMTkiLAogICAgInJzcXVvcjsiOiAiXHUyMDE5IiwKICAgICJydGhyZWU7IjogIlx1MjJjYyIsCiAgICAicnRpbWVzOyI6ICJcdTIyY2EiLAogICAgInJ0cmk7IjogIlx1MjViOSIsCiAgICAicnRyaWU7IjogIlx1MjJiNSIsCiAgICAicnRyaWY7IjogIlx1MjViOCIsCiAgICAicnRyaWx0cmk7IjogIlx1MjljZSIsCiAgICAicnVsdWhhcjsiOiAiXHUyOTY4IiwKICAgICJyeDsiOiAiXHUyMTFlIiwKICAgICJzYWN1dGU7IjogIlx1MDE1YiIsCiAgICAic2JxdW87IjogIlx1MjAxYSIsCiAgICAic2M7IjogIlx1MjI3YiIsCiAgICAic2NFOyI6ICJcdTJhYjQiLAogICAgInNjYXA7IjogIlx1MmFiOCIsCiAgICAic2Nhcm9uOyI6ICJcdTAxNjEiLAogICAgInNjY3VlOyI6ICJcdTIyN2QiLAogICAgInNjZTsiOiAiXHUyYWIwIiwKICAgICJzY2VkaWw7IjogIlx1MDE1ZiIsCiAgICAic2NpcmM7IjogIlx1MDE1ZCIsCiAgICAic2NuRTsiOiAiXHUyYWI2IiwKICAgICJzY25hcDsiOiAiXHUyYWJhIiwKICAgICJzY25zaW07IjogIlx1MjJlOSIsCiAgICAic2Nwb2xpbnQ7IjogIlx1MmExMyIsCiAgICAic2NzaW07IjogIlx1MjI3ZiIsCiAgICAic2N5OyI6ICJcdTA0NDEiLAogICAgInNkb3Q7IjogIlx1MjJjNSIsCiAgICAic2RvdGI7IjogIlx1MjJhMSIsCiAgICAic2RvdGU7IjogIlx1MmE2NiIsCiAgICAic2VBcnI7IjogIlx1MjFkOCIsCiAgICAic2VhcmhrOyI6ICJcdTI5MjUiLAogICAgInNlYXJyOyI6ICJcdTIxOTgiLAogICAgInNlYXJyb3c7IjogIlx1MjE5OCIsCiAgICAic2VjdCI6ICJceGE3IiwKICAgICJzZWN0OyI6ICJceGE3IiwKICAgICJzZW1pOyI6ICI7IiwKICAgICJzZXN3YXI7IjogIlx1MjkyOSIsCiAgICAic2V0bWludXM7IjogIlx1MjIxNiIsCiAgICAic2V0bW47IjogIlx1MjIxNiIsCiAgICAic2V4dDsiOiAiXHUyNzM2IiwKICAgICJzZnI7IjogIlxVMDAwMWQ1MzAiLAogICAgInNmcm93bjsiOiAiXHUyMzIyIiwKICAgICJzaGFycDsiOiAiXHUyNjZmIiwKICAgICJzaGNoY3k7IjogIlx1MDQ0OSIsCiAgICAic2hjeTsiOiAiXHUwNDQ4IiwKICAgICJzaG9ydG1pZDsiOiAiXHUyMjIzIiwKICAgICJzaG9ydHBhcmFsbGVsOyI6ICJcdTIyMjUiLAogICAgInNoeSI6ICJceGFkIiwKICAgICJzaHk7IjogIlx4YWQiLAogICAgInNpZ21hOyI6ICJcdTAzYzMiLAogICAgInNpZ21hZjsiOiAiXHUwM2MyIiwKICAgICJzaWdtYXY7IjogIlx1MDNjMiIsCiAgICAic2ltOyI6ICJcdTIyM2MiLAogICAgInNpbWRvdDsiOiAiXHUyYTZhIiwKICAgICJzaW1lOyI6ICJcdTIyNDMiLAogICAgInNpbWVxOyI6ICJcdTIyNDMiLAogICAgInNpbWc7IjogIlx1MmE5ZSIsCiAgICAic2ltZ0U7IjogIlx1MmFhMCIsCiAgICAic2ltbDsiOiAiXHUyYTlkIiwKICAgICJzaW1sRTsiOiAiXHUyYTlmIiwKICAgICJzaW1uZTsiOiAiXHUyMjQ2IiwKICAgICJzaW1wbHVzOyI6ICJcdTJhMjQiLAogICAgInNpbXJhcnI7IjogIlx1Mjk3MiIsCiAgICAic2xhcnI7IjogIlx1MjE5MCIsCiAgICAic21hbGxzZXRtaW51czsiOiAiXHUyMjE2IiwKICAgICJzbWFzaHA7IjogIlx1MmEzMyIsCiAgICAic21lcGFyc2w7IjogIlx1MjllNCIsCiAgICAic21pZDsiOiAiXHUyMjIzIiwKICAgICJzbWlsZTsiOiAiXHUyMzIzIiwKICAgICJzbXQ7IjogIlx1MmFhYSIsCiAgICAic210ZTsiOiAiXHUyYWFjIiwKICAgICJzbXRlczsiOiAiXHUyYWFjXHVmZTAwIiwKICAgICJzb2Z0Y3k7IjogIlx1MDQ0YyIsCiAgICAic29sOyI6ICIvIiwKICAgICJzb2xiOyI6ICJcdTI5YzQiLAogICAgInNvbGJhcjsiOiAiXHUyMzNmIiwKICAgICJzb3BmOyI6ICJcVTAwMDFkNTY0IiwKICAgICJzcGFkZXM7IjogIlx1MjY2MCIsCiAgICAic3BhZGVzdWl0OyI6ICJcdTI2NjAiLAogICAgInNwYXI7IjogIlx1MjIyNSIsCiAgICAic3FjYXA7IjogIlx1MjI5MyIsCiAgICAic3FjYXBzOyI6ICJcdTIyOTNcdWZlMDAiLAogICAgInNxY3VwOyI6ICJcdTIyOTQiLAogICAgInNxY3VwczsiOiAiXHUyMjk0XHVmZTAwIiwKICAgICJzcXN1YjsiOiAiXHUyMjhmIiwKICAgICJzcXN1YmU7IjogIlx1MjI5MSIsCiAgICAic3FzdWJzZXQ7IjogIlx1MjI4ZiIsCiAgICAic3FzdWJzZXRlcTsiOiAiXHUyMjkxIiwKICAgICJzcXN1cDsiOiAiXHUyMjkwIiwKICAgICJzcXN1cGU7IjogIlx1MjI5MiIsCiAgICAic3FzdXBzZXQ7IjogIlx1MjI5MCIsCiAgICAic3FzdXBzZXRlcTsiOiAiXHUyMjkyIiwKICAgICJzcXU7IjogIlx1MjVhMSIsCiAgICAic3F1YXJlOyI6ICJcdTI1YTEiLAogICAgInNxdWFyZjsiOiAiXHUyNWFhIiwKICAgICJzcXVmOyI6ICJcdTI1YWEiLAogICAgInNyYXJyOyI6ICJcdTIxOTIiLAogICAgInNzY3I7IjogIlxVMDAwMWQ0YzgiLAogICAgInNzZXRtbjsiOiAiXHUyMjE2IiwKICAgICJzc21pbGU7IjogIlx1MjMyMyIsCiAgICAic3N0YXJmOyI6ICJcdTIyYzYiLAogICAgInN0YXI7IjogIlx1MjYwNiIsCiAgICAic3RhcmY7IjogIlx1MjYwNSIsCiAgICAic3RyYWlnaHRlcHNpbG9uOyI6ICJcdTAzZjUiLAogICAgInN0cmFpZ2h0cGhpOyI6ICJcdTAzZDUiLAogICAgInN0cm5zOyI6ICJceGFmIiwKICAgICJzdWI7IjogIlx1MjI4MiIsCiAgICAic3ViRTsiOiAiXHUyYWM1IiwKICAgICJzdWJkb3Q7IjogIlx1MmFiZCIsCiAgICAic3ViZTsiOiAiXHUyMjg2IiwKICAgICJzdWJlZG90OyI6ICJcdTJhYzMiLAogICAgInN1Ym11bHQ7IjogIlx1MmFjMSIsCiAgICAic3VibkU7IjogIlx1MmFjYiIsCiAgICAic3VibmU7IjogIlx1MjI4YSIsCiAgICAic3VicGx1czsiOiAiXHUyYWJmIiwKICAgICJzdWJyYXJyOyI6ICJcdTI5NzkiLAogICAgInN1YnNldDsiOiAiXHUyMjgyIiwKICAgICJzdWJzZXRlcTsiOiAiXHUyMjg2IiwKICAgICJzdWJzZXRlcXE7IjogIlx1MmFjNSIsCiAgICAic3Vic2V0bmVxOyI6ICJcdTIyOGEiLAogICAgInN1YnNldG5lcXE7IjogIlx1MmFjYiIsCiAgICAic3Vic2ltOyI6ICJcdTJhYzciLAogICAgInN1YnN1YjsiOiAiXHUyYWQ1IiwKICAgICJzdWJzdXA7IjogIlx1MmFkMyIsCiAgICAic3VjYzsiOiAiXHUyMjdiIiwKICAgICJzdWNjYXBwcm94OyI6ICJcdTJhYjgiLAogICAgInN1Y2NjdXJseWVxOyI6ICJcdTIyN2QiLAogICAgInN1Y2NlcTsiOiAiXHUyYWIwIiwKICAgICJzdWNjbmFwcHJveDsiOiAiXHUyYWJhIiwKICAgICJzdWNjbmVxcTsiOiAiXHUyYWI2IiwKICAgICJzdWNjbnNpbTsiOiAiXHUyMmU5IiwKICAgICJzdWNjc2ltOyI6ICJcdTIyN2YiLAogICAgInN1bTsiOiAiXHUyMjExIiwKICAgICJzdW5nOyI6ICJcdTI2NmEiLAogICAgInN1cDEiOiAiXHhiOSIsCiAgICAic3VwMTsiOiAiXHhiOSIsCiAgICAic3VwMiI6ICJceGIyIiwKICAgICJzdXAyOyI6ICJceGIyIiwKICAgICJzdXAzIjogIlx4YjMiLAogICAgInN1cDM7IjogIlx4YjMiLAogICAgInN1cDsiOiAiXHUyMjgzIiwKICAgICJzdXBFOyI6ICJcdTJhYzYiLAogICAgInN1cGRvdDsiOiAiXHUyYWJlIiwKICAgICJzdXBkc3ViOyI6ICJcdTJhZDgiLAogICAgInN1cGU7IjogIlx1MjI4NyIsCiAgICAic3VwZWRvdDsiOiAiXHUyYWM0IiwKICAgICJzdXBoc29sOyI6ICJcdTI3YzkiLAogICAgInN1cGhzdWI7IjogIlx1MmFkNyIsCiAgICAic3VwbGFycjsiOiAiXHUyOTdiIiwKICAgICJzdXBtdWx0OyI6ICJcdTJhYzIiLAogICAgInN1cG5FOyI6ICJcdTJhY2MiLAogICAgInN1cG5lOyI6ICJcdTIyOGIiLAogICAgInN1cHBsdXM7IjogIlx1MmFjMCIsCiAgICAic3Vwc2V0OyI6ICJcdTIyODMiLAogICAgInN1cHNldGVxOyI6ICJcdTIyODciLAogICAgInN1cHNldGVxcTsiOiAiXHUyYWM2IiwKICAgICJzdXBzZXRuZXE7IjogIlx1MjI4YiIsCiAgICAic3Vwc2V0bmVxcTsiOiAiXHUyYWNjIiwKICAgICJzdXBzaW07IjogIlx1MmFjOCIsCiAgICAic3Vwc3ViOyI6ICJcdTJhZDQiLAogICAgInN1cHN1cDsiOiAiXHUyYWQ2IiwKICAgICJzd0FycjsiOiAiXHUyMWQ5IiwKICAgICJzd2FyaGs7IjogIlx1MjkyNiIsCiAgICAic3dhcnI7IjogIlx1MjE5OSIsCiAgICAic3dhcnJvdzsiOiAiXHUyMTk5IiwKICAgICJzd253YXI7IjogIlx1MjkyYSIsCiAgICAic3psaWciOiAiXHhkZiIsCiAgICAic3psaWc7IjogIlx4ZGYiLAogICAgInRhcmdldDsiOiAiXHUyMzE2IiwKICAgICJ0YXU7IjogIlx1MDNjNCIsCiAgICAidGJyazsiOiAiXHUyM2I0IiwKICAgICJ0Y2Fyb247IjogIlx1MDE2NSIsCiAgICAidGNlZGlsOyI6ICJcdTAxNjMiLAogICAgInRjeTsiOiAiXHUwNDQyIiwKICAgICJ0ZG90OyI6ICJcdTIwZGIiLAogICAgInRlbHJlYzsiOiAiXHUyMzE1IiwKICAgICJ0ZnI7IjogIlxVMDAwMWQ1MzEiLAogICAgInRoZXJlNDsiOiAiXHUyMjM0IiwKICAgICJ0aGVyZWZvcmU7IjogIlx1MjIzNCIsCiAgICAidGhldGE7IjogIlx1MDNiOCIsCiAgICAidGhldGFzeW07IjogIlx1MDNkMSIsCiAgICAidGhldGF2OyI6ICJcdTAzZDEiLAogICAgInRoaWNrYXBwcm94OyI6ICJcdTIyNDgiLAogICAgInRoaWNrc2ltOyI6ICJcdTIyM2MiLAogICAgInRoaW5zcDsiOiAiXHUyMDA5IiwKICAgICJ0aGthcDsiOiAiXHUyMjQ4IiwKICAgICJ0aGtzaW07IjogIlx1MjIzYyIsCiAgICAidGhvcm4iOiAiXHhmZSIsCiAgICAidGhvcm47IjogIlx4ZmUiLAogICAgInRpbGRlOyI6ICJcdTAyZGMiLAogICAgInRpbWVzIjogIlx4ZDciLAogICAgInRpbWVzOyI6ICJceGQ3IiwKICAgICJ0aW1lc2I7IjogIlx1MjJhMCIsCiAgICAidGltZXNiYXI7IjogIlx1MmEzMSIsCiAgICAidGltZXNkOyI6ICJcdTJhMzAiLAogICAgInRpbnQ7IjogIlx1MjIyZCIsCiAgICAidG9lYTsiOiAiXHUyOTI4IiwKICAgICJ0b3A7IjogIlx1MjJhNCIsCiAgICAidG9wYm90OyI6ICJcdTIzMzYiLAogICAgInRvcGNpcjsiOiAiXHUyYWYxIiwKICAgICJ0b3BmOyI6ICJcVTAwMDFkNTY1IiwKICAgICJ0b3Bmb3JrOyI6ICJcdTJhZGEiLAogICAgInRvc2E7IjogIlx1MjkyOSIsCiAgICAidHByaW1lOyI6ICJcdTIwMzQiLAogICAgInRyYWRlOyI6ICJcdTIxMjIiLAogICAgInRyaWFuZ2xlOyI6ICJcdTI1YjUiLAogICAgInRyaWFuZ2xlZG93bjsiOiAiXHUyNWJmIiwKICAgICJ0cmlhbmdsZWxlZnQ7IjogIlx1MjVjMyIsCiAgICAidHJpYW5nbGVsZWZ0ZXE7IjogIlx1MjJiNCIsCiAgICAidHJpYW5nbGVxOyI6ICJcdTIyNWMiLAogICAgInRyaWFuZ2xlcmlnaHQ7IjogIlx1MjViOSIsCiAgICAidHJpYW5nbGVyaWdodGVxOyI6ICJcdTIyYjUiLAogICAgInRyaWRvdDsiOiAiXHUyNWVjIiwKICAgICJ0cmllOyI6ICJcdTIyNWMiLAogICAgInRyaW1pbnVzOyI6ICJcdTJhM2EiLAogICAgInRyaXBsdXM7IjogIlx1MmEzOSIsCiAgICAidHJpc2I7IjogIlx1MjljZCIsCiAgICAidHJpdGltZTsiOiAiXHUyYTNiIiwKICAgICJ0cnBleml1bTsiOiAiXHUyM2UyIiwKICAgICJ0c2NyOyI6ICJcVTAwMDFkNGM5IiwKICAgICJ0c2N5OyI6ICJcdTA0NDYiLAogICAgInRzaGN5OyI6ICJcdTA0NWIiLAogICAgInRzdHJvazsiOiAiXHUwMTY3IiwKICAgICJ0d2l4dDsiOiAiXHUyMjZjIiwKICAgICJ0d29oZWFkbGVmdGFycm93OyI6ICJcdTIxOWUiLAogICAgInR3b2hlYWRyaWdodGFycm93OyI6ICJcdTIxYTAiLAogICAgInVBcnI7IjogIlx1MjFkMSIsCiAgICAidUhhcjsiOiAiXHUyOTYzIiwKICAgICJ1YWN1dGUiOiAiXHhmYSIsCiAgICAidWFjdXRlOyI6ICJceGZhIiwKICAgICJ1YXJyOyI6ICJcdTIxOTEiLAogICAgInVicmN5OyI6ICJcdTA0NWUiLAogICAgInVicmV2ZTsiOiAiXHUwMTZkIiwKICAgICJ1Y2lyYyI6ICJceGZiIiwKICAgICJ1Y2lyYzsiOiAiXHhmYiIsCiAgICAidWN5OyI6ICJcdTA0NDMiLAogICAgInVkYXJyOyI6ICJcdTIxYzUiLAogICAgInVkYmxhYzsiOiAiXHUwMTcxIiwKICAgICJ1ZGhhcjsiOiAiXHUyOTZlIiwKICAgICJ1ZmlzaHQ7IjogIlx1Mjk3ZSIsCiAgICAidWZyOyI6ICJcVTAwMDFkNTMyIiwKICAgICJ1Z3JhdmUiOiAiXHhmOSIsCiAgICAidWdyYXZlOyI6ICJceGY5IiwKICAgICJ1aGFybDsiOiAiXHUyMWJmIiwKICAgICJ1aGFycjsiOiAiXHUyMWJlIiwKICAgICJ1aGJsazsiOiAiXHUyNTgwIiwKICAgICJ1bGNvcm47IjogIlx1MjMxYyIsCiAgICAidWxjb3JuZXI7IjogIlx1MjMxYyIsCiAgICAidWxjcm9wOyI6ICJcdTIzMGYiLAogICAgInVsdHJpOyI6ICJcdTI1ZjgiLAogICAgInVtYWNyOyI6ICJcdTAxNmIiLAogICAgInVtbCI6ICJceGE4IiwKICAgICJ1bWw7IjogIlx4YTgiLAogICAgInVvZ29uOyI6ICJcdTAxNzMiLAogICAgInVvcGY7IjogIlxVMDAwMWQ1NjYiLAogICAgInVwYXJyb3c7IjogIlx1MjE5MSIsCiAgICAidXBkb3duYXJyb3c7IjogIlx1MjE5NSIsCiAgICAidXBoYXJwb29ubGVmdDsiOiAiXHUyMWJmIiwKICAgICJ1cGhhcnBvb25yaWdodDsiOiAiXHUyMWJlIiwKICAgICJ1cGx1czsiOiAiXHUyMjhlIiwKICAgICJ1cHNpOyI6ICJcdTAzYzUiLAogICAgInVwc2loOyI6ICJcdTAzZDIiLAogICAgInVwc2lsb247IjogIlx1MDNjNSIsCiAgICAidXB1cGFycm93czsiOiAiXHUyMWM4IiwKICAgICJ1cmNvcm47IjogIlx1MjMxZCIsCiAgICAidXJjb3JuZXI7IjogIlx1MjMxZCIsCiAgICAidXJjcm9wOyI6ICJcdTIzMGUiLAogICAgInVyaW5nOyI6ICJcdTAxNmYiLAogICAgInVydHJpOyI6ICJcdTI1ZjkiLAogICAgInVzY3I7IjogIlxVMDAwMWQ0Y2EiLAogICAgInV0ZG90OyI6ICJcdTIyZjAiLAogICAgInV0aWxkZTsiOiAiXHUwMTY5IiwKICAgICJ1dHJpOyI6ICJcdTI1YjUiLAogICAgInV0cmlmOyI6ICJcdTI1YjQiLAogICAgInV1YXJyOyI6ICJcdTIxYzgiLAogICAgInV1bWwiOiAiXHhmYyIsCiAgICAidXVtbDsiOiAiXHhmYyIsCiAgICAidXdhbmdsZTsiOiAiXHUyOWE3IiwKICAgICJ2QXJyOyI6ICJcdTIxZDUiLAogICAgInZCYXI7IjogIlx1MmFlOCIsCiAgICAidkJhcnY7IjogIlx1MmFlOSIsCiAgICAidkRhc2g7IjogIlx1MjJhOCIsCiAgICAidmFuZ3J0OyI6ICJcdTI5OWMiLAogICAgInZhcmVwc2lsb247IjogIlx1MDNmNSIsCiAgICAidmFya2FwcGE7IjogIlx1MDNmMCIsCiAgICAidmFybm90aGluZzsiOiAiXHUyMjA1IiwKICAgICJ2YXJwaGk7IjogIlx1MDNkNSIsCiAgICAidmFycGk7IjogIlx1MDNkNiIsCiAgICAidmFycHJvcHRvOyI6ICJcdTIyMWQiLAogICAgInZhcnI7IjogIlx1MjE5NSIsCiAgICAidmFycmhvOyI6ICJcdTAzZjEiLAogICAgInZhcnNpZ21hOyI6ICJcdTAzYzIiLAogICAgInZhcnN1YnNldG5lcTsiOiAiXHUyMjhhXHVmZTAwIiwKICAgICJ2YXJzdWJzZXRuZXFxOyI6ICJcdTJhY2JcdWZlMDAiLAogICAgInZhcnN1cHNldG5lcTsiOiAiXHUyMjhiXHVmZTAwIiwKICAgICJ2YXJzdXBzZXRuZXFxOyI6ICJcdTJhY2NcdWZlMDAiLAogICAgInZhcnRoZXRhOyI6ICJcdTAzZDEiLAogICAgInZhcnRyaWFuZ2xlbGVmdDsiOiAiXHUyMmIyIiwKICAgICJ2YXJ0cmlhbmdsZXJpZ2h0OyI6ICJcdTIyYjMiLAogICAgInZjeTsiOiAiXHUwNDMyIiwKICAgICJ2ZGFzaDsiOiAiXHUyMmEyIiwKICAgICJ2ZWU7IjogIlx1MjIyOCIsCiAgICAidmVlYmFyOyI6ICJcdTIyYmIiLAogICAgInZlZWVxOyI6ICJcdTIyNWEiLAogICAgInZlbGxpcDsiOiAiXHUyMmVlIiwKICAgICJ2ZXJiYXI7IjogInwiLAogICAgInZlcnQ7IjogInwiLAogICAgInZmcjsiOiAiXFUwMDAxZDUzMyIsCiAgICAidmx0cmk7IjogIlx1MjJiMiIsCiAgICAidm5zdWI7IjogIlx1MjI4Mlx1MjBkMiIsCiAgICAidm5zdXA7IjogIlx1MjI4M1x1MjBkMiIsCiAgICAidm9wZjsiOiAiXFUwMDAxZDU2NyIsCiAgICAidnByb3A7IjogIlx1MjIxZCIsCiAgICAidnJ0cmk7IjogIlx1MjJiMyIsCiAgICAidnNjcjsiOiAiXFUwMDAxZDRjYiIsCiAgICAidnN1Ym5FOyI6ICJcdTJhY2JcdWZlMDAiLAogICAgInZzdWJuZTsiOiAiXHUyMjhhXHVmZTAwIiwKICAgICJ2c3VwbkU7IjogIlx1MmFjY1x1ZmUwMCIsCiAgICAidnN1cG5lOyI6ICJcdTIyOGJcdWZlMDAiLAogICAgInZ6aWd6YWc7IjogIlx1Mjk5YSIsCiAgICAid2NpcmM7IjogIlx1MDE3NSIsCiAgICAid2VkYmFyOyI6ICJcdTJhNWYiLAogICAgIndlZGdlOyI6ICJcdTIyMjciLAogICAgIndlZGdlcTsiOiAiXHUyMjU5IiwKICAgICJ3ZWllcnA7IjogIlx1MjExOCIsCiAgICAid2ZyOyI6ICJcVTAwMDFkNTM0IiwKICAgICJ3b3BmOyI6ICJcVTAwMDFkNTY4IiwKICAgICJ3cDsiOiAiXHUyMTE4IiwKICAgICJ3cjsiOiAiXHUyMjQwIiwKICAgICJ3cmVhdGg7IjogIlx1MjI0MCIsCiAgICAid3NjcjsiOiAiXFUwMDAxZDRjYyIsCiAgICAieGNhcDsiOiAiXHUyMmMyIiwKICAgICJ4Y2lyYzsiOiAiXHUyNWVmIiwKICAgICJ4Y3VwOyI6ICJcdTIyYzMiLAogICAgInhkdHJpOyI6ICJcdTI1YmQiLAogICAgInhmcjsiOiAiXFUwMDAxZDUzNSIsCiAgICAieGhBcnI7IjogIlx1MjdmYSIsCiAgICAieGhhcnI7IjogIlx1MjdmNyIsCiAgICAieGk7IjogIlx1MDNiZSIsCiAgICAieGxBcnI7IjogIlx1MjdmOCIsCiAgICAieGxhcnI7IjogIlx1MjdmNSIsCiAgICAieG1hcDsiOiAiXHUyN2ZjIiwKICAgICJ4bmlzOyI6ICJcdTIyZmIiLAogICAgInhvZG90OyI6ICJcdTJhMDAiLAogICAgInhvcGY7IjogIlxVMDAwMWQ1NjkiLAogICAgInhvcGx1czsiOiAiXHUyYTAxIiwKICAgICJ4b3RpbWU7IjogIlx1MmEwMiIsCiAgICAieHJBcnI7IjogIlx1MjdmOSIsCiAgICAieHJhcnI7IjogIlx1MjdmNiIsCiAgICAieHNjcjsiOiAiXFUwMDAxZDRjZCIsCiAgICAieHNxY3VwOyI6ICJcdTJhMDYiLAogICAgInh1cGx1czsiOiAiXHUyYTA0IiwKICAgICJ4dXRyaTsiOiAiXHUyNWIzIiwKICAgICJ4dmVlOyI6ICJcdTIyYzEiLAogICAgInh3ZWRnZTsiOiAiXHUyMmMwIiwKICAgICJ5YWN1dGUiOiAiXHhmZCIsCiAgICAieWFjdXRlOyI6ICJceGZkIiwKICAgICJ5YWN5OyI6ICJcdTA0NGYiLAogICAgInljaXJjOyI6ICJcdTAxNzciLAogICAgInljeTsiOiAiXHUwNDRiIiwKICAgICJ5ZW4iOiAiXHhhNSIsCiAgICAieWVuOyI6ICJceGE1IiwKICAgICJ5ZnI7IjogIlxVMDAwMWQ1MzYiLAogICAgInlpY3k7IjogIlx1MDQ1NyIsCiAgICAieW9wZjsiOiAiXFUwMDAxZDU2YSIsCiAgICAieXNjcjsiOiAiXFUwMDAxZDRjZSIsCiAgICAieXVjeTsiOiAiXHUwNDRlIiwKICAgICJ5dW1sIjogIlx4ZmYiLAogICAgInl1bWw7IjogIlx4ZmYiLAogICAgInphY3V0ZTsiOiAiXHUwMTdhIiwKICAgICJ6Y2Fyb247IjogIlx1MDE3ZSIsCiAgICAiemN5OyI6ICJcdTA0MzciLAogICAgInpkb3Q7IjogIlx1MDE3YyIsCiAgICAiemVldHJmOyI6ICJcdTIxMjgiLAogICAgInpldGE7IjogIlx1MDNiNiIsCiAgICAiemZyOyI6ICJcVTAwMDFkNTM3IiwKICAgICJ6aGN5OyI6ICJcdTA0MzYiLAogICAgInppZ3JhcnI7IjogIlx1MjFkZCIsCiAgICAiem9wZjsiOiAiXFUwMDAxZDU2YiIsCiAgICAienNjcjsiOiAiXFUwMDAxZDRjZiIsCiAgICAiendqOyI6ICJcdTIwMGQiLAogICAgInp3bmo7IjogIlx1MjAwYyIsCn0KCnJlcGxhY2VtZW50Q2hhcmFjdGVycyA9IHsKICAgIDB4MDogIlx1RkZGRCIsCiAgICAweDBkOiAiXHUwMDBEIiwKICAgIDB4ODA6ICJcdTIwQUMiLAogICAgMHg4MTogIlx1MDA4MSIsCiAgICAweDgyOiAiXHUyMDFBIiwKICAgIDB4ODM6ICJcdTAxOTIiLAogICAgMHg4NDogIlx1MjAxRSIsCiAgICAweDg1OiAiXHUyMDI2IiwKICAgIDB4ODY6ICJcdTIwMjAiLAogICAgMHg4NzogIlx1MjAyMSIsCiAgICAweDg4OiAiXHUwMkM2IiwKICAgIDB4ODk6ICJcdTIwMzAiLAogICAgMHg4QTogIlx1MDE2MCIsCiAgICAweDhCOiAiXHUyMDM5IiwKICAgIDB4OEM6ICJcdTAxNTIiLAogICAgMHg4RDogIlx1MDA4RCIsCiAgICAweDhFOiAiXHUwMTdEIiwKICAgIDB4OEY6ICJcdTAwOEYiLAogICAgMHg5MDogIlx1MDA5MCIsCiAgICAweDkxOiAiXHUyMDE4IiwKICAgIDB4OTI6ICJcdTIwMTkiLAogICAgMHg5MzogIlx1MjAxQyIsCiAgICAweDk0OiAiXHUyMDFEIiwKICAgIDB4OTU6ICJcdTIwMjIiLAogICAgMHg5NjogIlx1MjAxMyIsCiAgICAweDk3OiAiXHUyMDE0IiwKICAgIDB4OTg6ICJcdTAyREMiLAogICAgMHg5OTogIlx1MjEyMiIsCiAgICAweDlBOiAiXHUwMTYxIiwKICAgIDB4OUI6ICJcdTIwM0EiLAogICAgMHg5QzogIlx1MDE1MyIsCiAgICAweDlEOiAiXHUwMDlEIiwKICAgIDB4OUU6ICJcdTAxN0UiLAogICAgMHg5RjogIlx1MDE3OCIsCn0KCnRva2VuVHlwZXMgPSB7CiAgICAiRG9jdHlwZSI6IDAsCiAgICAiQ2hhcmFjdGVycyI6IDEsCiAgICAiU3BhY2VDaGFyYWN0ZXJzIjogMiwKICAgICJTdGFydFRhZyI6IDMsCiAgICAiRW5kVGFnIjogNCwKICAgICJFbXB0eVRhZyI6IDUsCiAgICAiQ29tbWVudCI6IDYsCiAgICAiUGFyc2VFcnJvciI6IDcKfQoKdGFnVG9rZW5UeXBlcyA9IGZyb3plbnNldChbdG9rZW5UeXBlc1siU3RhcnRUYWciXSwgdG9rZW5UeXBlc1siRW5kVGFnIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuVHlwZXNbIkVtcHR5VGFnIl1dKQoKCnByZWZpeGVzID0gZGljdChbKHYsIGspIGZvciBrLCB2IGluIG5hbWVzcGFjZXMuaXRlbXMoKV0pCnByZWZpeGVzWyJodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGgvTWF0aE1MIl0gPSAibWF0aCIKCgpjbGFzcyBEYXRhTG9zc1dhcm5pbmcoVXNlcldhcm5pbmcpOgogICAgcGFzcwoKCmNsYXNzIFJlcGFyc2VFeGNlcHRpb24oRXhjZXB0aW9uKToKICAgIHBhc3MKUEsDBBQAAAAAAAAAIQAAAAAAAAAAAAAAAABFAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi9maWx0ZXJzL19faW5pdF9fLnB5UEsDBBQAAAAAAAAAIQBu0HyAbQIAAG0CAABTAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi9maWx0ZXJzL2FscGhhYmV0aWNhbGF0dHJpYnV0ZXMucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHVuaWNvZGVfbGl0ZXJhbHMKCmZyb20gLiBpbXBvcnQgYmFzZQoKdHJ5OgogICAgZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgT3JkZXJlZERpY3QKZXhjZXB0IEltcG9ydEVycm9yOgogICAgZnJvbSBvcmRlcmVkZGljdCBpbXBvcnQgT3JkZXJlZERpY3QKCgpjbGFzcyBGaWx0ZXIoYmFzZS5GaWx0ZXIpOgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgIGZvciB0b2tlbiBpbiBiYXNlLkZpbHRlci5fX2l0ZXJfXyhzZWxmKToKICAgICAgICAgICAgaWYgdG9rZW5bInR5cGUiXSBpbiAoIlN0YXJ0VGFnIiwgIkVtcHR5VGFnIik6CiAgICAgICAgICAgICAgICBhdHRycyA9IE9yZGVyZWREaWN0KCkKICAgICAgICAgICAgICAgIGZvciBuYW1lLCB2YWx1ZSBpbiBzb3J0ZWQodG9rZW5bImRhdGEiXS5pdGVtcygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk9bGFtYmRhIHg6IHhbMF0pOgogICAgICAgICAgICAgICAgICAgIGF0dHJzW25hbWVdID0gdmFsdWUKICAgICAgICAgICAgICAgIHRva2VuWyJkYXRhIl0gPSBhdHRycwogICAgICAgICAgICB5aWVsZCB0b2tlbgpQSwMEFAAAAAAAAAAhACKA+8QeAQAAHgEAAEEAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL2ZpbHRlcnMvYmFzZS5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgdW5pY29kZV9saXRlcmFscwoKCmNsYXNzIEZpbHRlcihvYmplY3QpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHNvdXJjZSk6CiAgICAgICAgc2VsZi5zb3VyY2UgPSBzb3VyY2UKCiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGl0ZXIoc2VsZi5zb3VyY2UpCgogICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUpOgogICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYuc291cmNlLCBuYW1lKQpQSwMEFAAAAAAAAAAhACHAPIy2CgAAtgoAAFAAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL2ZpbHRlcnMvaW5qZWN0X21ldGFfY2hhcnNldC5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgdW5pY29kZV9saXRlcmFscwoKZnJvbSAuIGltcG9ydCBiYXNlCgoKY2xhc3MgRmlsdGVyKGJhc2UuRmlsdGVyKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzb3VyY2UsIGVuY29kaW5nKToKICAgICAgICBiYXNlLkZpbHRlci5fX2luaXRfXyhzZWxmLCBzb3VyY2UpCiAgICAgICAgc2VsZi5lbmNvZGluZyA9IGVuY29kaW5nCgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgIHN0YXRlID0gInByZV9oZWFkIgogICAgICAgIG1ldGFfZm91bmQgPSAoc2VsZi5lbmNvZGluZyBpcyBOb25lKQogICAgICAgIHBlbmRpbmcgPSBbXQoKICAgICAgICBmb3IgdG9rZW4gaW4gYmFzZS5GaWx0ZXIuX19pdGVyX18oc2VsZik6CiAgICAgICAgICAgIHR5cGUgPSB0b2tlblsidHlwZSJdCiAgICAgICAgICAgIGlmIHR5cGUgPT0gIlN0YXJ0VGFnIjoKICAgICAgICAgICAgICAgIGlmIHRva2VuWyJuYW1lIl0ubG93ZXIoKSA9PSAiaGVhZCI6CiAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAiaW5faGVhZCIKCiAgICAgICAgICAgIGVsaWYgdHlwZSA9PSAiRW1wdHlUYWciOgogICAgICAgICAgICAgICAgaWYgdG9rZW5bIm5hbWUiXS5sb3dlcigpID09ICJtZXRhIjoKICAgICAgICAgICAgICAgICAgICAjIHJlcGxhY2UgY2hhcnNldCB3aXRoIGFjdHVhbCBlbmNvZGluZwogICAgICAgICAgICAgICAgICAgIGhhc19odHRwX2VxdWl2X2NvbnRlbnRfdHlwZSA9IEZhbHNlCiAgICAgICAgICAgICAgICAgICAgZm9yIChuYW1lc3BhY2UsIG5hbWUpLCB2YWx1ZSBpbiB0b2tlblsiZGF0YSJdLml0ZW1zKCk6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5hbWVzcGFjZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgbmFtZS5sb3dlcigpID09ICdjaGFyc2V0JzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuWyJkYXRhIl1bKG5hbWVzcGFjZSwgbmFtZSldID0gc2VsZi5lbmNvZGluZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YV9mb3VuZCA9IFRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgbmFtZSA9PSAnaHR0cC1lcXVpdicgYW5kIHZhbHVlLmxvd2VyKCkgPT0gJ2NvbnRlbnQtdHlwZSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNfaHR0cF9lcXVpdl9jb250ZW50X3R5cGUgPSBUcnVlCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgaWYgaGFzX2h0dHBfZXF1aXZfY29udGVudF90eXBlIGFuZCAoTm9uZSwgImNvbnRlbnQiKSBpbiB0b2tlblsiZGF0YSJdOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5bImRhdGEiXVsoTm9uZSwgImNvbnRlbnQiKV0gPSAndGV4dC9odG1sOyBjaGFyc2V0PSVzJyAlIHNlbGYuZW5jb2RpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFfZm91bmQgPSBUcnVlCgogICAgICAgICAgICAgICAgZWxpZiB0b2tlblsibmFtZSJdLmxvd2VyKCkgPT0gImhlYWQiIGFuZCBub3QgbWV0YV9mb3VuZDoKICAgICAgICAgICAgICAgICAgICAjIGluc2VydCBtZXRhIGludG8gZW1wdHkgaGVhZAogICAgICAgICAgICAgICAgICAgIHlpZWxkIHsidHlwZSI6ICJTdGFydFRhZyIsICJuYW1lIjogImhlYWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IHRva2VuWyJkYXRhIl19CiAgICAgICAgICAgICAgICAgICAgeWllbGQgeyJ0eXBlIjogIkVtcHR5VGFnIiwgIm5hbWUiOiAibWV0YSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogeyhOb25lLCAiY2hhcnNldCIpOiBzZWxmLmVuY29kaW5nfX0KICAgICAgICAgICAgICAgICAgICB5aWVsZCB7InR5cGUiOiAiRW5kVGFnIiwgIm5hbWUiOiAiaGVhZCJ9CiAgICAgICAgICAgICAgICAgICAgbWV0YV9mb3VuZCA9IFRydWUKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgZWxpZiB0eXBlID09ICJFbmRUYWciOgogICAgICAgICAgICAgICAgaWYgdG9rZW5bIm5hbWUiXS5sb3dlcigpID09ICJoZWFkIiBhbmQgcGVuZGluZzoKICAgICAgICAgICAgICAgICAgICAjIGluc2VydCBtZXRhIGludG8gaGVhZCAoaWYgbmVjZXNzYXJ5KSBhbmQgZmx1c2ggcGVuZGluZyBxdWV1ZQogICAgICAgICAgICAgICAgICAgIHlpZWxkIHBlbmRpbmcucG9wKDApCiAgICAgICAgICAgICAgICAgICAgaWYgbm90IG1ldGFfZm91bmQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIHsidHlwZSI6ICJFbXB0eVRhZyIsICJuYW1lIjogIm1ldGEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiB7KE5vbmUsICJjaGFyc2V0Iik6IHNlbGYuZW5jb2Rpbmd9fQogICAgICAgICAgICAgICAgICAgIHdoaWxlIHBlbmRpbmc6CiAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIHBlbmRpbmcucG9wKDApCiAgICAgICAgICAgICAgICAgICAgbWV0YV9mb3VuZCA9IFRydWUKICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9ICJwb3N0X2hlYWQiCgogICAgICAgICAgICBpZiBzdGF0ZSA9PSAiaW5faGVhZCI6CiAgICAgICAgICAgICAgICBwZW5kaW5nLmFwcGVuZCh0b2tlbikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHlpZWxkIHRva2VuClBLAwQUAAAAAAAAACEAfevStSUNAAAlDQAAQQAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvZmlsdGVycy9saW50LnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCB1bmljb2RlX2xpdGVyYWxzCgpmcm9tIHBpcC5fdmVuZG9yLnNpeCBpbXBvcnQgdGV4dF90eXBlCgpmcm9tIC4gaW1wb3J0IGJhc2UKZnJvbSAuLmNvbnN0YW50cyBpbXBvcnQgbmFtZXNwYWNlcywgdm9pZEVsZW1lbnRzCgpmcm9tIC4uY29uc3RhbnRzIGltcG9ydCBzcGFjZUNoYXJhY3RlcnMKc3BhY2VDaGFyYWN0ZXJzID0gIiIuam9pbihzcGFjZUNoYXJhY3RlcnMpCgoKY2xhc3MgRmlsdGVyKGJhc2UuRmlsdGVyKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzb3VyY2UsIHJlcXVpcmVfbWF0Y2hpbmdfdGFncz1UcnVlKToKICAgICAgICBzdXBlcihGaWx0ZXIsIHNlbGYpLl9faW5pdF9fKHNvdXJjZSkKICAgICAgICBzZWxmLnJlcXVpcmVfbWF0Y2hpbmdfdGFncyA9IHJlcXVpcmVfbWF0Y2hpbmdfdGFncwoKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICBvcGVuX2VsZW1lbnRzID0gW10KICAgICAgICBmb3IgdG9rZW4gaW4gYmFzZS5GaWx0ZXIuX19pdGVyX18oc2VsZik6CiAgICAgICAgICAgIHR5cGUgPSB0b2tlblsidHlwZSJdCiAgICAgICAgICAgIGlmIHR5cGUgaW4gKCJTdGFydFRhZyIsICJFbXB0eVRhZyIpOgogICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gdG9rZW5bIm5hbWVzcGFjZSJdCiAgICAgICAgICAgICAgICBuYW1lID0gdG9rZW5bIm5hbWUiXQogICAgICAgICAgICAgICAgYXNzZXJ0IG5hbWVzcGFjZSBpcyBOb25lIG9yIGlzaW5zdGFuY2UobmFtZXNwYWNlLCB0ZXh0X3R5cGUpCiAgICAgICAgICAgICAgICBhc3NlcnQgbmFtZXNwYWNlICE9ICIiCiAgICAgICAgICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShuYW1lLCB0ZXh0X3R5cGUpCiAgICAgICAgICAgICAgICBhc3NlcnQgbmFtZSAhPSAiIgogICAgICAgICAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UodG9rZW5bImRhdGEiXSwgZGljdCkKICAgICAgICAgICAgICAgIGlmIChub3QgbmFtZXNwYWNlIG9yIG5hbWVzcGFjZSA9PSBuYW1lc3BhY2VzWyJodG1sIl0pIGFuZCBuYW1lIGluIHZvaWRFbGVtZW50czoKICAgICAgICAgICAgICAgICAgICBhc3NlcnQgdHlwZSA9PSAiRW1wdHlUYWciCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGFzc2VydCB0eXBlID09ICJTdGFydFRhZyIKICAgICAgICAgICAgICAgIGlmIHR5cGUgPT0gIlN0YXJ0VGFnIiBhbmQgc2VsZi5yZXF1aXJlX21hdGNoaW5nX3RhZ3M6CiAgICAgICAgICAgICAgICAgICAgb3Blbl9lbGVtZW50cy5hcHBlbmQoKG5hbWVzcGFjZSwgbmFtZSkpCiAgICAgICAgICAgICAgICBmb3IgKG5hbWVzcGFjZSwgbmFtZSksIHZhbHVlIGluIHRva2VuWyJkYXRhIl0uaXRlbXMoKToKICAgICAgICAgICAgICAgICAgICBhc3NlcnQgbmFtZXNwYWNlIGlzIE5vbmUgb3IgaXNpbnN0YW5jZShuYW1lc3BhY2UsIHRleHRfdHlwZSkKICAgICAgICAgICAgICAgICAgICBhc3NlcnQgbmFtZXNwYWNlICE9ICIiCiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UobmFtZSwgdGV4dF90eXBlKQogICAgICAgICAgICAgICAgICAgIGFzc2VydCBuYW1lICE9ICIiCiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UodmFsdWUsIHRleHRfdHlwZSkKCiAgICAgICAgICAgIGVsaWYgdHlwZSA9PSAiRW5kVGFnIjoKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IHRva2VuWyJuYW1lc3BhY2UiXQogICAgICAgICAgICAgICAgbmFtZSA9IHRva2VuWyJuYW1lIl0KICAgICAgICAgICAgICAgIGFzc2VydCBuYW1lc3BhY2UgaXMgTm9uZSBvciBpc2luc3RhbmNlKG5hbWVzcGFjZSwgdGV4dF90eXBlKQogICAgICAgICAgICAgICAgYXNzZXJ0IG5hbWVzcGFjZSAhPSAiIgogICAgICAgICAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UobmFtZSwgdGV4dF90eXBlKQogICAgICAgICAgICAgICAgYXNzZXJ0IG5hbWUgIT0gIiIKICAgICAgICAgICAgICAgIGlmIChub3QgbmFtZXNwYWNlIG9yIG5hbWVzcGFjZSA9PSBuYW1lc3BhY2VzWyJodG1sIl0pIGFuZCBuYW1lIGluIHZvaWRFbGVtZW50czoKICAgICAgICAgICAgICAgICAgICBhc3NlcnQgRmFsc2UsICJWb2lkIGVsZW1lbnQgcmVwb3J0ZWQgYXMgRW5kVGFnIHRva2VuOiAlKHRhZylzIiAlIHsidGFnIjogbmFtZX0KICAgICAgICAgICAgICAgIGVsaWYgc2VsZi5yZXF1aXJlX21hdGNoaW5nX3RhZ3M6CiAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBvcGVuX2VsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IHN0YXJ0ID09IChuYW1lc3BhY2UsIG5hbWUpCgogICAgICAgICAgICBlbGlmIHR5cGUgPT0gIkNvbW1lbnQiOgogICAgICAgICAgICAgICAgZGF0YSA9IHRva2VuWyJkYXRhIl0KICAgICAgICAgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKGRhdGEsIHRleHRfdHlwZSkKCiAgICAgICAgICAgIGVsaWYgdHlwZSBpbiAoIkNoYXJhY3RlcnMiLCAiU3BhY2VDaGFyYWN0ZXJzIik6CiAgICAgICAgICAgICAgICBkYXRhID0gdG9rZW5bImRhdGEiXQogICAgICAgICAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoZGF0YSwgdGV4dF90eXBlKQogICAgICAgICAgICAgICAgYXNzZXJ0IGRhdGEgIT0gIiIKICAgICAgICAgICAgICAgIGlmIHR5cGUgPT0gIlNwYWNlQ2hhcmFjdGVycyI6CiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGRhdGEuc3RyaXAoc3BhY2VDaGFyYWN0ZXJzKSA9PSAiIgoKICAgICAgICAgICAgZWxpZiB0eXBlID09ICJEb2N0eXBlIjoKICAgICAgICAgICAgICAgIG5hbWUgPSB0b2tlblsibmFtZSJdCiAgICAgICAgICAgICAgICBhc3NlcnQgbmFtZSBpcyBOb25lIG9yIGlzaW5zdGFuY2UobmFtZSwgdGV4dF90eXBlKQogICAgICAgICAgICAgICAgYXNzZXJ0IHRva2VuWyJwdWJsaWNJZCJdIGlzIE5vbmUgb3IgaXNpbnN0YW5jZShuYW1lLCB0ZXh0X3R5cGUpCiAgICAgICAgICAgICAgICBhc3NlcnQgdG9rZW5bInN5c3RlbUlkIl0gaXMgTm9uZSBvciBpc2luc3RhbmNlKG5hbWUsIHRleHRfdHlwZSkKCiAgICAgICAgICAgIGVsaWYgdHlwZSA9PSAiRW50aXR5IjoKICAgICAgICAgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHRva2VuWyJuYW1lIl0sIHRleHRfdHlwZSkKCiAgICAgICAgICAgIGVsaWYgdHlwZSA9PSAiU2VyaWFsaXplckVycm9yIjoKICAgICAgICAgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHRva2VuWyJkYXRhIl0sIHRleHRfdHlwZSkKCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBhc3NlcnQgRmFsc2UsICJVbmtub3duIHRva2VuIHR5cGU6ICUodHlwZSlzIiAlIHsidHlwZSI6IHR5cGV9CgogICAgICAgICAgICB5aWVsZCB0b2tlbgpQSwMEFAAAAAAAAAAhACHtnSQmKQAAJikAAEkAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL2ZpbHRlcnMvb3B0aW9uYWx0YWdzLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCB1bmljb2RlX2xpdGVyYWxzCgpmcm9tIC4gaW1wb3J0IGJhc2UKCgpjbGFzcyBGaWx0ZXIoYmFzZS5GaWx0ZXIpOgogICAgZGVmIHNsaWRlcihzZWxmKToKICAgICAgICBwcmV2aW91czEgPSBwcmV2aW91czIgPSBOb25lCiAgICAgICAgZm9yIHRva2VuIGluIHNlbGYuc291cmNlOgogICAgICAgICAgICBpZiBwcmV2aW91czEgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICB5aWVsZCBwcmV2aW91czIsIHByZXZpb3VzMSwgdG9rZW4KICAgICAgICAgICAgcHJldmlvdXMyID0gcHJldmlvdXMxCiAgICAgICAgICAgIHByZXZpb3VzMSA9IHRva2VuCiAgICAgICAgaWYgcHJldmlvdXMxIGlzIG5vdCBOb25lOgogICAgICAgICAgICB5aWVsZCBwcmV2aW91czIsIHByZXZpb3VzMSwgTm9uZQoKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICBmb3IgcHJldmlvdXMsIHRva2VuLCBuZXh0IGluIHNlbGYuc2xpZGVyKCk6CiAgICAgICAgICAgIHR5cGUgPSB0b2tlblsidHlwZSJdCiAgICAgICAgICAgIGlmIHR5cGUgPT0gIlN0YXJ0VGFnIjoKICAgICAgICAgICAgICAgIGlmICh0b2tlblsiZGF0YSJdIG9yCiAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBzZWxmLmlzX29wdGlvbmFsX3N0YXJ0KHRva2VuWyJuYW1lIl0sIHByZXZpb3VzLCBuZXh0KSk6CiAgICAgICAgICAgICAgICAgICAgeWllbGQgdG9rZW4KICAgICAgICAgICAgZWxpZiB0eXBlID09ICJFbmRUYWciOgogICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuaXNfb3B0aW9uYWxfZW5kKHRva2VuWyJuYW1lIl0sIG5leHQpOgogICAgICAgICAgICAgICAgICAgIHlpZWxkIHRva2VuCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICB5aWVsZCB0b2tlbgoKICAgIGRlZiBpc19vcHRpb25hbF9zdGFydChzZWxmLCB0YWduYW1lLCBwcmV2aW91cywgbmV4dCk6CiAgICAgICAgdHlwZSA9IG5leHQgYW5kIG5leHRbInR5cGUiXSBvciBOb25lCiAgICAgICAgaWYgdGFnbmFtZSBpbiAnaHRtbCc6CiAgICAgICAgICAgICMgQW4gaHRtbCBlbGVtZW50J3Mgc3RhcnQgdGFnIG1heSBiZSBvbWl0dGVkIGlmIHRoZSBmaXJzdCB0aGluZwogICAgICAgICAgICAjIGluc2lkZSB0aGUgaHRtbCBlbGVtZW50IGlzIG5vdCBhIHNwYWNlIGNoYXJhY3RlciBvciBhIGNvbW1lbnQuCiAgICAgICAgICAgIHJldHVybiB0eXBlIG5vdCBpbiAoIkNvbW1lbnQiLCAiU3BhY2VDaGFyYWN0ZXJzIikKICAgICAgICBlbGlmIHRhZ25hbWUgPT0gJ2hlYWQnOgogICAgICAgICAgICAjIEEgaGVhZCBlbGVtZW50J3Mgc3RhcnQgdGFnIG1heSBiZSBvbWl0dGVkIGlmIHRoZSBmaXJzdCB0aGluZwogICAgICAgICAgICAjIGluc2lkZSB0aGUgaGVhZCBlbGVtZW50IGlzIGFuIGVsZW1lbnQuCiAgICAgICAgICAgICMgWFhYOiB3ZSBhbHNvIG9taXQgdGhlIHN0YXJ0IHRhZyBpZiB0aGUgaGVhZCBlbGVtZW50IGlzIGVtcHR5CiAgICAgICAgICAgIGlmIHR5cGUgaW4gKCJTdGFydFRhZyIsICJFbXB0eVRhZyIpOgogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICAgICAgZWxpZiB0eXBlID09ICJFbmRUYWciOgogICAgICAgICAgICAgICAgcmV0dXJuIG5leHRbIm5hbWUiXSA9PSAiaGVhZCIKICAgICAgICBlbGlmIHRhZ25hbWUgPT0gJ2JvZHknOgogICAgICAgICAgICAjIEEgYm9keSBlbGVtZW50J3Mgc3RhcnQgdGFnIG1heSBiZSBvbWl0dGVkIGlmIHRoZSBmaXJzdCB0aGluZwogICAgICAgICAgICAjIGluc2lkZSB0aGUgYm9keSBlbGVtZW50IGlzIG5vdCBhIHNwYWNlIGNoYXJhY3RlciBvciBhIGNvbW1lbnQsCiAgICAgICAgICAgICMgZXhjZXB0IGlmIHRoZSBmaXJzdCB0aGluZyBpbnNpZGUgdGhlIGJvZHkgZWxlbWVudCBpcyBhIHNjcmlwdAogICAgICAgICAgICAjIG9yIHN0eWxlIGVsZW1lbnQgYW5kIHRoZSBub2RlIGltbWVkaWF0ZWx5IHByZWNlZGluZyB0aGUgYm9keQogICAgICAgICAgICAjIGVsZW1lbnQgaXMgYSBoZWFkIGVsZW1lbnQgd2hvc2UgZW5kIHRhZyBoYXMgYmVlbiBvbWl0dGVkLgogICAgICAgICAgICBpZiB0eXBlIGluICgiQ29tbWVudCIsICJTcGFjZUNoYXJhY3RlcnMiKToKICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgICAgICBlbGlmIHR5cGUgPT0gIlN0YXJ0VGFnIjoKICAgICAgICAgICAgICAgICMgWFhYOiB3ZSBkbyBub3QgbG9vayBhdCB0aGUgcHJlY2VkaW5nIGV2ZW50LCBzbyB3ZSBuZXZlciBvbWl0CiAgICAgICAgICAgICAgICAjIHRoZSBib2R5IGVsZW1lbnQncyBzdGFydCB0YWcgaWYgaXQncyBmb2xsb3dlZCBieSBhIHNjcmlwdCBvcgogICAgICAgICAgICAgICAgIyBhIHN0eWxlIGVsZW1lbnQuCiAgICAgICAgICAgICAgICByZXR1cm4gbmV4dFsibmFtZSJdIG5vdCBpbiAoJ3NjcmlwdCcsICdzdHlsZScpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIGVsaWYgdGFnbmFtZSA9PSAnY29sZ3JvdXAnOgogICAgICAgICAgICAjIEEgY29sZ3JvdXAgZWxlbWVudCdzIHN0YXJ0IHRhZyBtYXkgYmUgb21pdHRlZCBpZiB0aGUgZmlyc3QgdGhpbmcKICAgICAgICAgICAgIyBpbnNpZGUgdGhlIGNvbGdyb3VwIGVsZW1lbnQgaXMgYSBjb2wgZWxlbWVudCwgYW5kIGlmIHRoZSBlbGVtZW50CiAgICAgICAgICAgICMgaXMgbm90IGltbWVkaWF0ZWx5IHByZWNlZGVkIGJ5IGFub3RoZXIgY29sZ3JvdXAgZWxlbWVudCB3aG9zZQogICAgICAgICAgICAjIGVuZCB0YWcgaGFzIGJlZW4gb21pdHRlZC4KICAgICAgICAgICAgaWYgdHlwZSBpbiAoIlN0YXJ0VGFnIiwgIkVtcHR5VGFnIik6CiAgICAgICAgICAgICAgICAjIFhYWDogd2UgZG8gbm90IGxvb2sgYXQgdGhlIHByZWNlZGluZyBldmVudCwgc28gaW5zdGVhZCB3ZSBuZXZlcgogICAgICAgICAgICAgICAgIyBvbWl0IHRoZSBjb2xncm91cCBlbGVtZW50J3MgZW5kIHRhZyB3aGVuIGl0IGlzIGltbWVkaWF0ZWx5CiAgICAgICAgICAgICAgICAjIGZvbGxvd2VkIGJ5IGFub3RoZXIgY29sZ3JvdXAgZWxlbWVudC4gU2VlIGlzX29wdGlvbmFsX2VuZC4KICAgICAgICAgICAgICAgIHJldHVybiBuZXh0WyJuYW1lIl0gPT0gImNvbCIKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIGVsaWYgdGFnbmFtZSA9PSAndGJvZHknOgogICAgICAgICAgICAjIEEgdGJvZHkgZWxlbWVudCdzIHN0YXJ0IHRhZyBtYXkgYmUgb21pdHRlZCBpZiB0aGUgZmlyc3QgdGhpbmcKICAgICAgICAgICAgIyBpbnNpZGUgdGhlIHRib2R5IGVsZW1lbnQgaXMgYSB0ciBlbGVtZW50LCBhbmQgaWYgdGhlIGVsZW1lbnQgaXMKICAgICAgICAgICAgIyBub3QgaW1tZWRpYXRlbHkgcHJlY2VkZWQgYnkgYSB0Ym9keSwgdGhlYWQsIG9yIHRmb290IGVsZW1lbnQKICAgICAgICAgICAgIyB3aG9zZSBlbmQgdGFnIGhhcyBiZWVuIG9taXR0ZWQuCiAgICAgICAgICAgIGlmIHR5cGUgPT0gIlN0YXJ0VGFnIjoKICAgICAgICAgICAgICAgICMgb21pdCB0aGUgdGhlYWQgYW5kIHRmb290IGVsZW1lbnRzJyBlbmQgdGFnIHdoZW4gdGhleSBhcmUKICAgICAgICAgICAgICAgICMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYSB0Ym9keSBlbGVtZW50LiBTZWUgaXNfb3B0aW9uYWxfZW5kLgogICAgICAgICAgICAgICAgaWYgcHJldmlvdXMgYW5kIHByZXZpb3VzWyd0eXBlJ10gPT0gJ0VuZFRhZycgYW5kIFwKICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNbJ25hbWUnXSBpbiAoJ3Rib2R5JywgJ3RoZWFkJywgJ3Rmb290Jyk6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgICAgICAgICByZXR1cm4gbmV4dFsibmFtZSJdID09ICd0cicKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGRlZiBpc19vcHRpb25hbF9lbmQoc2VsZiwgdGFnbmFtZSwgbmV4dCk6CiAgICAgICAgdHlwZSA9IG5leHQgYW5kIG5leHRbInR5cGUiXSBvciBOb25lCiAgICAgICAgaWYgdGFnbmFtZSBpbiAoJ2h0bWwnLCAnaGVhZCcsICdib2R5Jyk6CiAgICAgICAgICAgICMgQW4gaHRtbCBlbGVtZW50J3MgZW5kIHRhZyBtYXkgYmUgb21pdHRlZCBpZiB0aGUgaHRtbCBlbGVtZW50CiAgICAgICAgICAgICMgaXMgbm90IGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGEgc3BhY2UgY2hhcmFjdGVyIG9yIGEgY29tbWVudC4KICAgICAgICAgICAgcmV0dXJuIHR5cGUgbm90IGluICgiQ29tbWVudCIsICJTcGFjZUNoYXJhY3RlcnMiKQogICAgICAgIGVsaWYgdGFnbmFtZSBpbiAoJ2xpJywgJ29wdGdyb3VwJywgJ3RyJyk6CiAgICAgICAgICAgICMgQSBsaSBlbGVtZW50J3MgZW5kIHRhZyBtYXkgYmUgb21pdHRlZCBpZiB0aGUgbGkgZWxlbWVudCBpcwogICAgICAgICAgICAjIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGFub3RoZXIgbGkgZWxlbWVudCBvciBpZiB0aGVyZSBpcwogICAgICAgICAgICAjIG5vIG1vcmUgY29udGVudCBpbiB0aGUgcGFyZW50IGVsZW1lbnQuCiAgICAgICAgICAgICMgQW4gb3B0Z3JvdXAgZWxlbWVudCdzIGVuZCB0YWcgbWF5IGJlIG9taXR0ZWQgaWYgdGhlIG9wdGdyb3VwCiAgICAgICAgICAgICMgZWxlbWVudCBpcyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhbm90aGVyIG9wdGdyb3VwIGVsZW1lbnQsCiAgICAgICAgICAgICMgb3IgaWYgdGhlcmUgaXMgbm8gbW9yZSBjb250ZW50IGluIHRoZSBwYXJlbnQgZWxlbWVudC4KICAgICAgICAgICAgIyBBIHRyIGVsZW1lbnQncyBlbmQgdGFnIG1heSBiZSBvbWl0dGVkIGlmIHRoZSB0ciBlbGVtZW50IGlzCiAgICAgICAgICAgICMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYW5vdGhlciB0ciBlbGVtZW50LCBvciBpZiB0aGVyZSBpcwogICAgICAgICAgICAjIG5vIG1vcmUgY29udGVudCBpbiB0aGUgcGFyZW50IGVsZW1lbnQuCiAgICAgICAgICAgIGlmIHR5cGUgPT0gIlN0YXJ0VGFnIjoKICAgICAgICAgICAgICAgIHJldHVybiBuZXh0WyJuYW1lIl0gPT0gdGFnbmFtZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmV0dXJuIHR5cGUgPT0gIkVuZFRhZyIgb3IgdHlwZSBpcyBOb25lCiAgICAgICAgZWxpZiB0YWduYW1lIGluICgnZHQnLCAnZGQnKToKICAgICAgICAgICAgIyBBIGR0IGVsZW1lbnQncyBlbmQgdGFnIG1heSBiZSBvbWl0dGVkIGlmIHRoZSBkdCBlbGVtZW50IGlzCiAgICAgICAgICAgICMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYW5vdGhlciBkdCBlbGVtZW50IG9yIGEgZGQgZWxlbWVudC4KICAgICAgICAgICAgIyBBIGRkIGVsZW1lbnQncyBlbmQgdGFnIG1heSBiZSBvbWl0dGVkIGlmIHRoZSBkZCBlbGVtZW50IGlzCiAgICAgICAgICAgICMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYW5vdGhlciBkZCBlbGVtZW50IG9yIGEgZHQgZWxlbWVudCwKICAgICAgICAgICAgIyBvciBpZiB0aGVyZSBpcyBubyBtb3JlIGNvbnRlbnQgaW4gdGhlIHBhcmVudCBlbGVtZW50LgogICAgICAgICAgICBpZiB0eXBlID09ICJTdGFydFRhZyI6CiAgICAgICAgICAgICAgICByZXR1cm4gbmV4dFsibmFtZSJdIGluICgnZHQnLCAnZGQnKQogICAgICAgICAgICBlbGlmIHRhZ25hbWUgPT0gJ2RkJzoKICAgICAgICAgICAgICAgIHJldHVybiB0eXBlID09ICJFbmRUYWciIG9yIHR5cGUgaXMgTm9uZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgZWxpZiB0YWduYW1lID09ICdwJzoKICAgICAgICAgICAgIyBBIHAgZWxlbWVudCdzIGVuZCB0YWcgbWF5IGJlIG9taXR0ZWQgaWYgdGhlIHAgZWxlbWVudCBpcwogICAgICAgICAgICAjIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGFuIGFkZHJlc3MsIGFydGljbGUsIGFzaWRlLAogICAgICAgICAgICAjIGJsb2NrcXVvdGUsIGRhdGFncmlkLCBkaWFsb2csIGRpciwgZGl2LCBkbCwgZmllbGRzZXQsCiAgICAgICAgICAgICMgZm9vdGVyLCBmb3JtLCBoMSwgaDIsIGgzLCBoNCwgaDUsIGg2LCBoZWFkZXIsIGhyLCBtZW51LAogICAgICAgICAgICAjIG5hdiwgb2wsIHAsIHByZSwgc2VjdGlvbiwgdGFibGUsIG9yIHVsLCBlbGVtZW50LCBvciBpZgogICAgICAgICAgICAjIHRoZXJlIGlzIG5vIG1vcmUgY29udGVudCBpbiB0aGUgcGFyZW50IGVsZW1lbnQuCiAgICAgICAgICAgIGlmIHR5cGUgaW4gKCJTdGFydFRhZyIsICJFbXB0eVRhZyIpOgogICAgICAgICAgICAgICAgcmV0dXJuIG5leHRbIm5hbWUiXSBpbiAoJ2FkZHJlc3MnLCAnYXJ0aWNsZScsICdhc2lkZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYmxvY2txdW90ZScsICdkYXRhZ3JpZCcsICdkaWFsb2cnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RpcicsICdkaXYnLCAnZGwnLCAnZmllbGRzZXQnLCAnZm9vdGVyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmb3JtJywgJ2gxJywgJ2gyJywgJ2gzJywgJ2g0JywgJ2g1JywgJ2g2JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoZWFkZXInLCAnaHInLCAnbWVudScsICduYXYnLCAnb2wnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3AnLCAncHJlJywgJ3NlY3Rpb24nLCAndGFibGUnLCAndWwnKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmV0dXJuIHR5cGUgPT0gIkVuZFRhZyIgb3IgdHlwZSBpcyBOb25lCiAgICAgICAgZWxpZiB0YWduYW1lID09ICdvcHRpb24nOgogICAgICAgICAgICAjIEFuIG9wdGlvbiBlbGVtZW50J3MgZW5kIHRhZyBtYXkgYmUgb21pdHRlZCBpZiB0aGUgb3B0aW9uCiAgICAgICAgICAgICMgZWxlbWVudCBpcyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhbm90aGVyIG9wdGlvbiBlbGVtZW50LAogICAgICAgICAgICAjIG9yIGlmIGl0IGlzIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGFuIDxjb2RlPm9wdGdyb3VwPC9jb2RlPgogICAgICAgICAgICAjIGVsZW1lbnQsIG9yIGlmIHRoZXJlIGlzIG5vIG1vcmUgY29udGVudCBpbiB0aGUgcGFyZW50CiAgICAgICAgICAgICMgZWxlbWVudC4KICAgICAgICAgICAgaWYgdHlwZSA9PSAiU3RhcnRUYWciOgogICAgICAgICAgICAgICAgcmV0dXJuIG5leHRbIm5hbWUiXSBpbiAoJ29wdGlvbicsICdvcHRncm91cCcpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXR1cm4gdHlwZSA9PSAiRW5kVGFnIiBvciB0eXBlIGlzIE5vbmUKICAgICAgICBlbGlmIHRhZ25hbWUgaW4gKCdydCcsICdycCcpOgogICAgICAgICAgICAjIEFuIHJ0IGVsZW1lbnQncyBlbmQgdGFnIG1heSBiZSBvbWl0dGVkIGlmIHRoZSBydCBlbGVtZW50IGlzCiAgICAgICAgICAgICMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYW4gcnQgb3IgcnAgZWxlbWVudCwgb3IgaWYgdGhlcmUgaXMKICAgICAgICAgICAgIyBubyBtb3JlIGNvbnRlbnQgaW4gdGhlIHBhcmVudCBlbGVtZW50LgogICAgICAgICAgICAjIEFuIHJwIGVsZW1lbnQncyBlbmQgdGFnIG1heSBiZSBvbWl0dGVkIGlmIHRoZSBycCBlbGVtZW50IGlzCiAgICAgICAgICAgICMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYW4gcnQgb3IgcnAgZWxlbWVudCwgb3IgaWYgdGhlcmUgaXMKICAgICAgICAgICAgIyBubyBtb3JlIGNvbnRlbnQgaW4gdGhlIHBhcmVudCBlbGVtZW50LgogICAgICAgICAgICBpZiB0eXBlID09ICJTdGFydFRhZyI6CiAgICAgICAgICAgICAgICByZXR1cm4gbmV4dFsibmFtZSJdIGluICgncnQnLCAncnAnKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmV0dXJuIHR5cGUgPT0gIkVuZFRhZyIgb3IgdHlwZSBpcyBOb25lCiAgICAgICAgZWxpZiB0YWduYW1lID09ICdjb2xncm91cCc6CiAgICAgICAgICAgICMgQSBjb2xncm91cCBlbGVtZW50J3MgZW5kIHRhZyBtYXkgYmUgb21pdHRlZCBpZiB0aGUgY29sZ3JvdXAKICAgICAgICAgICAgIyBlbGVtZW50IGlzIG5vdCBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhIHNwYWNlIGNoYXJhY3RlciBvcgogICAgICAgICAgICAjIGEgY29tbWVudC4KICAgICAgICAgICAgaWYgdHlwZSBpbiAoIkNvbW1lbnQiLCAiU3BhY2VDaGFyYWN0ZXJzIik6CiAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAgICAgZWxpZiB0eXBlID09ICJTdGFydFRhZyI6CiAgICAgICAgICAgICAgICAjIFhYWDogd2UgYWxzbyBsb29rIGZvciBhbiBpbW1lZGlhdGVseSBmb2xsb3dpbmcgY29sZ3JvdXAKICAgICAgICAgICAgICAgICMgZWxlbWVudC4gU2VlIGlzX29wdGlvbmFsX3N0YXJ0LgogICAgICAgICAgICAgICAgcmV0dXJuIG5leHRbIm5hbWUiXSAhPSAnY29sZ3JvdXAnCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIGVsaWYgdGFnbmFtZSBpbiAoJ3RoZWFkJywgJ3Rib2R5Jyk6CiAgICAgICAgICAgICMgQSB0aGVhZCBlbGVtZW50J3MgZW5kIHRhZyBtYXkgYmUgb21pdHRlZCBpZiB0aGUgdGhlYWQgZWxlbWVudAogICAgICAgICAgICAjIGlzIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGEgdGJvZHkgb3IgdGZvb3QgZWxlbWVudC4KICAgICAgICAgICAgIyBBIHRib2R5IGVsZW1lbnQncyBlbmQgdGFnIG1heSBiZSBvbWl0dGVkIGlmIHRoZSB0Ym9keSBlbGVtZW50CiAgICAgICAgICAgICMgaXMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYSB0Ym9keSBvciB0Zm9vdCBlbGVtZW50LCBvciBpZgogICAgICAgICAgICAjIHRoZXJlIGlzIG5vIG1vcmUgY29udGVudCBpbiB0aGUgcGFyZW50IGVsZW1lbnQuCiAgICAgICAgICAgICMgQSB0Zm9vdCBlbGVtZW50J3MgZW5kIHRhZyBtYXkgYmUgb21pdHRlZCBpZiB0aGUgdGZvb3QgZWxlbWVudAogICAgICAgICAgICAjIGlzIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGEgdGJvZHkgZWxlbWVudCwgb3IgaWYgdGhlcmUgaXMgbm8KICAgICAgICAgICAgIyBtb3JlIGNvbnRlbnQgaW4gdGhlIHBhcmVudCBlbGVtZW50LgogICAgICAgICAgICAjIFhYWDogd2UgbmV2ZXIgb21pdCB0aGUgZW5kIHRhZyB3aGVuIHRoZSBmb2xsb3dpbmcgZWxlbWVudCBpcwogICAgICAgICAgICAjIGEgdGJvZHkuIFNlZSBpc19vcHRpb25hbF9zdGFydC4KICAgICAgICAgICAgaWYgdHlwZSA9PSAiU3RhcnRUYWciOgogICAgICAgICAgICAgICAgcmV0dXJuIG5leHRbIm5hbWUiXSBpbiBbJ3Rib2R5JywgJ3Rmb290J10KICAgICAgICAgICAgZWxpZiB0YWduYW1lID09ICd0Ym9keSc6CiAgICAgICAgICAgICAgICByZXR1cm4gdHlwZSA9PSAiRW5kVGFnIiBvciB0eXBlIGlzIE5vbmUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIGVsaWYgdGFnbmFtZSA9PSAndGZvb3QnOgogICAgICAgICAgICAjIEEgdGZvb3QgZWxlbWVudCdzIGVuZCB0YWcgbWF5IGJlIG9taXR0ZWQgaWYgdGhlIHRmb290IGVsZW1lbnQKICAgICAgICAgICAgIyBpcyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhIHRib2R5IGVsZW1lbnQsIG9yIGlmIHRoZXJlIGlzIG5vCiAgICAgICAgICAgICMgbW9yZSBjb250ZW50IGluIHRoZSBwYXJlbnQgZWxlbWVudC4KICAgICAgICAgICAgIyBYWFg6IHdlIG5ldmVyIG9taXQgdGhlIGVuZCB0YWcgd2hlbiB0aGUgZm9sbG93aW5nIGVsZW1lbnQgaXMKICAgICAgICAgICAgIyBhIHRib2R5LiBTZWUgaXNfb3B0aW9uYWxfc3RhcnQuCiAgICAgICAgICAgIGlmIHR5cGUgPT0gIlN0YXJ0VGFnIjoKICAgICAgICAgICAgICAgIHJldHVybiBuZXh0WyJuYW1lIl0gPT0gJ3Rib2R5JwogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmV0dXJuIHR5cGUgPT0gIkVuZFRhZyIgb3IgdHlwZSBpcyBOb25lCiAgICAgICAgZWxpZiB0YWduYW1lIGluICgndGQnLCAndGgnKToKICAgICAgICAgICAgIyBBIHRkIGVsZW1lbnQncyBlbmQgdGFnIG1heSBiZSBvbWl0dGVkIGlmIHRoZSB0ZCBlbGVtZW50IGlzCiAgICAgICAgICAgICMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYSB0ZCBvciB0aCBlbGVtZW50LCBvciBpZiB0aGVyZSBpcwogICAgICAgICAgICAjIG5vIG1vcmUgY29udGVudCBpbiB0aGUgcGFyZW50IGVsZW1lbnQuCiAgICAgICAgICAgICMgQSB0aCBlbGVtZW50J3MgZW5kIHRhZyBtYXkgYmUgb21pdHRlZCBpZiB0aGUgdGggZWxlbWVudCBpcwogICAgICAgICAgICAjIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGEgdGQgb3IgdGggZWxlbWVudCwgb3IgaWYgdGhlcmUgaXMKICAgICAgICAgICAgIyBubyBtb3JlIGNvbnRlbnQgaW4gdGhlIHBhcmVudCBlbGVtZW50LgogICAgICAgICAgICBpZiB0eXBlID09ICJTdGFydFRhZyI6CiAgICAgICAgICAgICAgICByZXR1cm4gbmV4dFsibmFtZSJdIGluICgndGQnLCAndGgnKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmV0dXJuIHR5cGUgPT0gIkVuZFRhZyIgb3IgdHlwZSBpcyBOb25lCiAgICAgICAgcmV0dXJuIEZhbHNlClBLAwQUAAAAAAAAACEAmh5UmBhiAAAYYgAARgAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvZmlsdGVycy9zYW5pdGl6ZXIucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHVuaWNvZGVfbGl0ZXJhbHMKCmltcG9ydCByZQpmcm9tIHhtbC5zYXguc2F4dXRpbHMgaW1wb3J0IGVzY2FwZSwgdW5lc2NhcGUKCmZyb20gcGlwLl92ZW5kb3Iuc2l4Lm1vdmVzIGltcG9ydCB1cmxsaWJfcGFyc2UgYXMgdXJscGFyc2UKCmZyb20gLiBpbXBvcnQgYmFzZQpmcm9tIC4uY29uc3RhbnRzIGltcG9ydCBuYW1lc3BhY2VzLCBwcmVmaXhlcwoKX19hbGxfXyA9IFsiRmlsdGVyIl0KCgphbGxvd2VkX2VsZW1lbnRzID0gZnJvemVuc2V0KCgKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdhJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnYWJicicpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2Fjcm9ueW0nKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdhZGRyZXNzJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnYXJlYScpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2FydGljbGUnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdhc2lkZScpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2F1ZGlvJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnYicpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2JpZycpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2Jsb2NrcXVvdGUnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdicicpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2J1dHRvbicpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2NhbnZhcycpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2NhcHRpb24nKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdjZW50ZXInKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdjaXRlJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnY29kZScpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2NvbCcpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2NvbGdyb3VwJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnY29tbWFuZCcpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2RhdGFncmlkJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnZGF0YWxpc3QnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdkZCcpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2RlbCcpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2RldGFpbHMnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdkZm4nKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdkaWFsb2cnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdkaXInKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdkaXYnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdkbCcpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2R0JyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnZW0nKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdldmVudC1zb3VyY2UnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdmaWVsZHNldCcpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2ZpZ2NhcHRpb24nKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdmaWd1cmUnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdmb290ZXInKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdmb250JyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnZm9ybScpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2hlYWRlcicpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2gxJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnaDInKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdoMycpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2g0JyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnaDUnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdoNicpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2hyJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnaScpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2ltZycpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2lucHV0JyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnaW5zJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAna2V5Z2VuJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAna2JkJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnbGFiZWwnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdsZWdlbmQnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdsaScpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ20nKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdtYXAnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdtZW51JyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnbWV0ZXInKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdtdWx0aWNvbCcpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ25hdicpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ25leHRpZCcpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ29sJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnb3V0cHV0JyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnb3B0Z3JvdXAnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdvcHRpb24nKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdwJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAncHJlJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAncHJvZ3Jlc3MnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdxJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAncycpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ3NhbXAnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdzZWN0aW9uJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnc2VsZWN0JyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnc21hbGwnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdzb3VuZCcpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ3NvdXJjZScpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ3NwYWNlcicpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ3NwYW4nKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdzdHJpa2UnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdzdHJvbmcnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdzdWInKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdzdXAnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICd0YWJsZScpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ3Rib2R5JyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAndGQnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICd0ZXh0YXJlYScpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ3RpbWUnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICd0Zm9vdCcpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ3RoJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAndGhlYWQnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICd0cicpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ3R0JyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAndScpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ3VsJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAndmFyJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAndmlkZW8nKSwKICAgIChuYW1lc3BhY2VzWydtYXRobWwnXSwgJ21hY3Rpb24nKSwKICAgIChuYW1lc3BhY2VzWydtYXRobWwnXSwgJ21hdGgnKSwKICAgIChuYW1lc3BhY2VzWydtYXRobWwnXSwgJ21lcnJvcicpLAogICAgKG5hbWVzcGFjZXNbJ21hdGhtbCddLCAnbWZyYWMnKSwKICAgIChuYW1lc3BhY2VzWydtYXRobWwnXSwgJ21pJyksCiAgICAobmFtZXNwYWNlc1snbWF0aG1sJ10sICdtbXVsdGlzY3JpcHRzJyksCiAgICAobmFtZXNwYWNlc1snbWF0aG1sJ10sICdtbicpLAogICAgKG5hbWVzcGFjZXNbJ21hdGhtbCddLCAnbW8nKSwKICAgIChuYW1lc3BhY2VzWydtYXRobWwnXSwgJ21vdmVyJyksCiAgICAobmFtZXNwYWNlc1snbWF0aG1sJ10sICdtcGFkZGVkJyksCiAgICAobmFtZXNwYWNlc1snbWF0aG1sJ10sICdtcGhhbnRvbScpLAogICAgKG5hbWVzcGFjZXNbJ21hdGhtbCddLCAnbXByZXNjcmlwdHMnKSwKICAgIChuYW1lc3BhY2VzWydtYXRobWwnXSwgJ21yb290JyksCiAgICAobmFtZXNwYWNlc1snbWF0aG1sJ10sICdtcm93JyksCiAgICAobmFtZXNwYWNlc1snbWF0aG1sJ10sICdtc3BhY2UnKSwKICAgIChuYW1lc3BhY2VzWydtYXRobWwnXSwgJ21zcXJ0JyksCiAgICAobmFtZXNwYWNlc1snbWF0aG1sJ10sICdtc3R5bGUnKSwKICAgIChuYW1lc3BhY2VzWydtYXRobWwnXSwgJ21zdWInKSwKICAgIChuYW1lc3BhY2VzWydtYXRobWwnXSwgJ21zdWJzdXAnKSwKICAgIChuYW1lc3BhY2VzWydtYXRobWwnXSwgJ21zdXAnKSwKICAgIChuYW1lc3BhY2VzWydtYXRobWwnXSwgJ210YWJsZScpLAogICAgKG5hbWVzcGFjZXNbJ21hdGhtbCddLCAnbXRkJyksCiAgICAobmFtZXNwYWNlc1snbWF0aG1sJ10sICdtdGV4dCcpLAogICAgKG5hbWVzcGFjZXNbJ21hdGhtbCddLCAnbXRyJyksCiAgICAobmFtZXNwYWNlc1snbWF0aG1sJ10sICdtdW5kZXInKSwKICAgIChuYW1lc3BhY2VzWydtYXRobWwnXSwgJ211bmRlcm92ZXInKSwKICAgIChuYW1lc3BhY2VzWydtYXRobWwnXSwgJ25vbmUnKSwKICAgIChuYW1lc3BhY2VzWydzdmcnXSwgJ2EnKSwKICAgIChuYW1lc3BhY2VzWydzdmcnXSwgJ2FuaW1hdGUnKSwKICAgIChuYW1lc3BhY2VzWydzdmcnXSwgJ2FuaW1hdGVDb2xvcicpLAogICAgKG5hbWVzcGFjZXNbJ3N2ZyddLCAnYW5pbWF0ZU1vdGlvbicpLAogICAgKG5hbWVzcGFjZXNbJ3N2ZyddLCAnYW5pbWF0ZVRyYW5zZm9ybScpLAogICAgKG5hbWVzcGFjZXNbJ3N2ZyddLCAnY2xpcFBhdGgnKSwKICAgIChuYW1lc3BhY2VzWydzdmcnXSwgJ2NpcmNsZScpLAogICAgKG5hbWVzcGFjZXNbJ3N2ZyddLCAnZGVmcycpLAogICAgKG5hbWVzcGFjZXNbJ3N2ZyddLCAnZGVzYycpLAogICAgKG5hbWVzcGFjZXNbJ3N2ZyddLCAnZWxsaXBzZScpLAogICAgKG5hbWVzcGFjZXNbJ3N2ZyddLCAnZm9udC1mYWNlJyksCiAgICAobmFtZXNwYWNlc1snc3ZnJ10sICdmb250LWZhY2UtbmFtZScpLAogICAgKG5hbWVzcGFjZXNbJ3N2ZyddLCAnZm9udC1mYWNlLXNyYycpLAogICAgKG5hbWVzcGFjZXNbJ3N2ZyddLCAnZycpLAogICAgKG5hbWVzcGFjZXNbJ3N2ZyddLCAnZ2x5cGgnKSwKICAgIChuYW1lc3BhY2VzWydzdmcnXSwgJ2hrZXJuJyksCiAgICAobmFtZXNwYWNlc1snc3ZnJ10sICdsaW5lYXJHcmFkaWVudCcpLAogICAgKG5hbWVzcGFjZXNbJ3N2ZyddLCAnbGluZScpLAogICAgKG5hbWVzcGFjZXNbJ3N2ZyddLCAnbWFya2VyJyksCiAgICAobmFtZXNwYWNlc1snc3ZnJ10sICdtZXRhZGF0YScpLAogICAgKG5hbWVzcGFjZXNbJ3N2ZyddLCAnbWlzc2luZy1nbHlwaCcpLAogICAgKG5hbWVzcGFjZXNbJ3N2ZyddLCAnbXBhdGgnKSwKICAgIChuYW1lc3BhY2VzWydzdmcnXSwgJ3BhdGgnKSwKICAgIChuYW1lc3BhY2VzWydzdmcnXSwgJ3BvbHlnb24nKSwKICAgIChuYW1lc3BhY2VzWydzdmcnXSwgJ3BvbHlsaW5lJyksCiAgICAobmFtZXNwYWNlc1snc3ZnJ10sICdyYWRpYWxHcmFkaWVudCcpLAogICAgKG5hbWVzcGFjZXNbJ3N2ZyddLCAncmVjdCcpLAogICAgKG5hbWVzcGFjZXNbJ3N2ZyddLCAnc2V0JyksCiAgICAobmFtZXNwYWNlc1snc3ZnJ10sICdzdG9wJyksCiAgICAobmFtZXNwYWNlc1snc3ZnJ10sICdzdmcnKSwKICAgIChuYW1lc3BhY2VzWydzdmcnXSwgJ3N3aXRjaCcpLAogICAgKG5hbWVzcGFjZXNbJ3N2ZyddLCAndGV4dCcpLAogICAgKG5hbWVzcGFjZXNbJ3N2ZyddLCAndGl0bGUnKSwKICAgIChuYW1lc3BhY2VzWydzdmcnXSwgJ3RzcGFuJyksCiAgICAobmFtZXNwYWNlc1snc3ZnJ10sICd1c2UnKSwKKSkKCmFsbG93ZWRfYXR0cmlidXRlcyA9IGZyb3plbnNldCgoCiAgICAjIEhUTUwgYXR0cmlidXRlcwogICAgKE5vbmUsICdhYmJyJyksCiAgICAoTm9uZSwgJ2FjY2VwdCcpLAogICAgKE5vbmUsICdhY2NlcHQtY2hhcnNldCcpLAogICAgKE5vbmUsICdhY2Nlc3NrZXknKSwKICAgIChOb25lLCAnYWN0aW9uJyksCiAgICAoTm9uZSwgJ2FsaWduJyksCiAgICAoTm9uZSwgJ2FsdCcpLAogICAgKE5vbmUsICdhdXRvY29tcGxldGUnKSwKICAgIChOb25lLCAnYXV0b2ZvY3VzJyksCiAgICAoTm9uZSwgJ2F4aXMnKSwKICAgIChOb25lLCAnYmFja2dyb3VuZCcpLAogICAgKE5vbmUsICdiYWxhbmNlJyksCiAgICAoTm9uZSwgJ2JnY29sb3InKSwKICAgIChOb25lLCAnYmdwcm9wZXJ0aWVzJyksCiAgICAoTm9uZSwgJ2JvcmRlcicpLAogICAgKE5vbmUsICdib3JkZXJjb2xvcicpLAogICAgKE5vbmUsICdib3JkZXJjb2xvcmRhcmsnKSwKICAgIChOb25lLCAnYm9yZGVyY29sb3JsaWdodCcpLAogICAgKE5vbmUsICdib3R0b21wYWRkaW5nJyksCiAgICAoTm9uZSwgJ2NlbGxwYWRkaW5nJyksCiAgICAoTm9uZSwgJ2NlbGxzcGFjaW5nJyksCiAgICAoTm9uZSwgJ2NoJyksCiAgICAoTm9uZSwgJ2NoYWxsZW5nZScpLAogICAgKE5vbmUsICdjaGFyJyksCiAgICAoTm9uZSwgJ2NoYXJvZmYnKSwKICAgIChOb25lLCAnY2hvZmYnKSwKICAgIChOb25lLCAnY2hhcnNldCcpLAogICAgKE5vbmUsICdjaGVja2VkJyksCiAgICAoTm9uZSwgJ2NpdGUnKSwKICAgIChOb25lLCAnY2xhc3MnKSwKICAgIChOb25lLCAnY2xlYXInKSwKICAgIChOb25lLCAnY29sb3InKSwKICAgIChOb25lLCAnY29scycpLAogICAgKE5vbmUsICdjb2xzcGFuJyksCiAgICAoTm9uZSwgJ2NvbXBhY3QnKSwKICAgIChOb25lLCAnY29udGVudGVkaXRhYmxlJyksCiAgICAoTm9uZSwgJ2NvbnRyb2xzJyksCiAgICAoTm9uZSwgJ2Nvb3JkcycpLAogICAgKE5vbmUsICdkYXRhJyksCiAgICAoTm9uZSwgJ2RhdGFmbGQnKSwKICAgIChOb25lLCAnZGF0YXBhZ2VzaXplJyksCiAgICAoTm9uZSwgJ2RhdGFzcmMnKSwKICAgIChOb25lLCAnZGF0ZXRpbWUnKSwKICAgIChOb25lLCAnZGVmYXVsdCcpLAogICAgKE5vbmUsICdkZWxheScpLAogICAgKE5vbmUsICdkaXInKSwKICAgIChOb25lLCAnZGlzYWJsZWQnKSwKICAgIChOb25lLCAnZHJhZ2dhYmxlJyksCiAgICAoTm9uZSwgJ2R5bnNyYycpLAogICAgKE5vbmUsICdlbmN0eXBlJyksCiAgICAoTm9uZSwgJ2VuZCcpLAogICAgKE5vbmUsICdmYWNlJyksCiAgICAoTm9uZSwgJ2ZvcicpLAogICAgKE5vbmUsICdmb3JtJyksCiAgICAoTm9uZSwgJ2ZyYW1lJyksCiAgICAoTm9uZSwgJ2dhbGxlcnlpbWcnKSwKICAgIChOb25lLCAnZ3V0dGVyJyksCiAgICAoTm9uZSwgJ2hlYWRlcnMnKSwKICAgIChOb25lLCAnaGVpZ2h0JyksCiAgICAoTm9uZSwgJ2hpZGVmb2N1cycpLAogICAgKE5vbmUsICdoaWRkZW4nKSwKICAgIChOb25lLCAnaGlnaCcpLAogICAgKE5vbmUsICdocmVmJyksCiAgICAoTm9uZSwgJ2hyZWZsYW5nJyksCiAgICAoTm9uZSwgJ2hzcGFjZScpLAogICAgKE5vbmUsICdpY29uJyksCiAgICAoTm9uZSwgJ2lkJyksCiAgICAoTm9uZSwgJ2lucHV0bW9kZScpLAogICAgKE5vbmUsICdpc21hcCcpLAogICAgKE5vbmUsICdrZXl0eXBlJyksCiAgICAoTm9uZSwgJ2xhYmVsJyksCiAgICAoTm9uZSwgJ2xlZnRzcGFjaW5nJyksCiAgICAoTm9uZSwgJ2xhbmcnKSwKICAgIChOb25lLCAnbGlzdCcpLAogICAgKE5vbmUsICdsb25nZGVzYycpLAogICAgKE5vbmUsICdsb29wJyksCiAgICAoTm9uZSwgJ2xvb3Bjb3VudCcpLAogICAgKE5vbmUsICdsb29wZW5kJyksCiAgICAoTm9uZSwgJ2xvb3BzdGFydCcpLAogICAgKE5vbmUsICdsb3cnKSwKICAgIChOb25lLCAnbG93c3JjJyksCiAgICAoTm9uZSwgJ21heCcpLAogICAgKE5vbmUsICdtYXhsZW5ndGgnKSwKICAgIChOb25lLCAnbWVkaWEnKSwKICAgIChOb25lLCAnbWV0aG9kJyksCiAgICAoTm9uZSwgJ21pbicpLAogICAgKE5vbmUsICdtdWx0aXBsZScpLAogICAgKE5vbmUsICduYW1lJyksCiAgICAoTm9uZSwgJ25vaHJlZicpLAogICAgKE5vbmUsICdub3NoYWRlJyksCiAgICAoTm9uZSwgJ25vd3JhcCcpLAogICAgKE5vbmUsICdvcGVuJyksCiAgICAoTm9uZSwgJ29wdGltdW0nKSwKICAgIChOb25lLCAncGF0dGVybicpLAogICAgKE5vbmUsICdwaW5nJyksCiAgICAoTm9uZSwgJ3BvaW50LXNpemUnKSwKICAgIChOb25lLCAncG9zdGVyJyksCiAgICAoTm9uZSwgJ3BxZycpLAogICAgKE5vbmUsICdwcmVsb2FkJyksCiAgICAoTm9uZSwgJ3Byb21wdCcpLAogICAgKE5vbmUsICdyYWRpb2dyb3VwJyksCiAgICAoTm9uZSwgJ3JlYWRvbmx5JyksCiAgICAoTm9uZSwgJ3JlbCcpLAogICAgKE5vbmUsICdyZXBlYXQtbWF4JyksCiAgICAoTm9uZSwgJ3JlcGVhdC1taW4nKSwKICAgIChOb25lLCAncmVwbGFjZScpLAogICAgKE5vbmUsICdyZXF1aXJlZCcpLAogICAgKE5vbmUsICdyZXYnKSwKICAgIChOb25lLCAncmlnaHRzcGFjaW5nJyksCiAgICAoTm9uZSwgJ3Jvd3MnKSwKICAgIChOb25lLCAncm93c3BhbicpLAogICAgKE5vbmUsICdydWxlcycpLAogICAgKE5vbmUsICdzY29wZScpLAogICAgKE5vbmUsICdzZWxlY3RlZCcpLAogICAgKE5vbmUsICdzaGFwZScpLAogICAgKE5vbmUsICdzaXplJyksCiAgICAoTm9uZSwgJ3NwYW4nKSwKICAgIChOb25lLCAnc3JjJyksCiAgICAoTm9uZSwgJ3N0YXJ0JyksCiAgICAoTm9uZSwgJ3N0ZXAnKSwKICAgIChOb25lLCAnc3R5bGUnKSwKICAgIChOb25lLCAnc3VtbWFyeScpLAogICAgKE5vbmUsICdzdXBwcmVzcycpLAogICAgKE5vbmUsICd0YWJpbmRleCcpLAogICAgKE5vbmUsICd0YXJnZXQnKSwKICAgIChOb25lLCAndGVtcGxhdGUnKSwKICAgIChOb25lLCAndGl0bGUnKSwKICAgIChOb25lLCAndG9wcGFkZGluZycpLAogICAgKE5vbmUsICd0eXBlJyksCiAgICAoTm9uZSwgJ3Vuc2VsZWN0YWJsZScpLAogICAgKE5vbmUsICd1c2VtYXAnKSwKICAgIChOb25lLCAndXJuJyksCiAgICAoTm9uZSwgJ3ZhbGlnbicpLAogICAgKE5vbmUsICd2YWx1ZScpLAogICAgKE5vbmUsICd2YXJpYWJsZScpLAogICAgKE5vbmUsICd2b2x1bWUnKSwKICAgIChOb25lLCAndnNwYWNlJyksCiAgICAoTm9uZSwgJ3ZybWwnKSwKICAgIChOb25lLCAnd2lkdGgnKSwKICAgIChOb25lLCAnd3JhcCcpLAogICAgKG5hbWVzcGFjZXNbJ3htbCddLCAnbGFuZycpLAogICAgIyBNYXRoTUwgYXR0cmlidXRlcwogICAgKE5vbmUsICdhY3Rpb250eXBlJyksCiAgICAoTm9uZSwgJ2FsaWduJyksCiAgICAoTm9uZSwgJ2NvbHVtbmFsaWduJyksCiAgICAoTm9uZSwgJ2NvbHVtbmFsaWduJyksCiAgICAoTm9uZSwgJ2NvbHVtbmFsaWduJyksCiAgICAoTm9uZSwgJ2NvbHVtbmxpbmVzJyksCiAgICAoTm9uZSwgJ2NvbHVtbnNwYWNpbmcnKSwKICAgIChOb25lLCAnY29sdW1uc3BhbicpLAogICAgKE5vbmUsICdkZXB0aCcpLAogICAgKE5vbmUsICdkaXNwbGF5JyksCiAgICAoTm9uZSwgJ2Rpc3BsYXlzdHlsZScpLAogICAgKE5vbmUsICdlcXVhbGNvbHVtbnMnKSwKICAgIChOb25lLCAnZXF1YWxyb3dzJyksCiAgICAoTm9uZSwgJ2ZlbmNlJyksCiAgICAoTm9uZSwgJ2ZvbnRzdHlsZScpLAogICAgKE5vbmUsICdmb250d2VpZ2h0JyksCiAgICAoTm9uZSwgJ2ZyYW1lJyksCiAgICAoTm9uZSwgJ2hlaWdodCcpLAogICAgKE5vbmUsICdsaW5ldGhpY2tuZXNzJyksCiAgICAoTm9uZSwgJ2xzcGFjZScpLAogICAgKE5vbmUsICdtYXRoYmFja2dyb3VuZCcpLAogICAgKE5vbmUsICdtYXRoY29sb3InKSwKICAgIChOb25lLCAnbWF0aHZhcmlhbnQnKSwKICAgIChOb25lLCAnbWF0aHZhcmlhbnQnKSwKICAgIChOb25lLCAnbWF4c2l6ZScpLAogICAgKE5vbmUsICdtaW5zaXplJyksCiAgICAoTm9uZSwgJ290aGVyJyksCiAgICAoTm9uZSwgJ3Jvd2FsaWduJyksCiAgICAoTm9uZSwgJ3Jvd2FsaWduJyksCiAgICAoTm9uZSwgJ3Jvd2FsaWduJyksCiAgICAoTm9uZSwgJ3Jvd2xpbmVzJyksCiAgICAoTm9uZSwgJ3Jvd3NwYWNpbmcnKSwKICAgIChOb25lLCAncm93c3BhbicpLAogICAgKE5vbmUsICdyc3BhY2UnKSwKICAgIChOb25lLCAnc2NyaXB0bGV2ZWwnKSwKICAgIChOb25lLCAnc2VsZWN0aW9uJyksCiAgICAoTm9uZSwgJ3NlcGFyYXRvcicpLAogICAgKE5vbmUsICdzdHJldGNoeScpLAogICAgKE5vbmUsICd3aWR0aCcpLAogICAgKE5vbmUsICd3aWR0aCcpLAogICAgKG5hbWVzcGFjZXNbJ3hsaW5rJ10sICdocmVmJyksCiAgICAobmFtZXNwYWNlc1sneGxpbmsnXSwgJ3Nob3cnKSwKICAgIChuYW1lc3BhY2VzWyd4bGluayddLCAndHlwZScpLAogICAgIyBTVkcgYXR0cmlidXRlcwogICAgKE5vbmUsICdhY2NlbnQtaGVpZ2h0JyksCiAgICAoTm9uZSwgJ2FjY3VtdWxhdGUnKSwKICAgIChOb25lLCAnYWRkaXRpdmUnKSwKICAgIChOb25lLCAnYWxwaGFiZXRpYycpLAogICAgKE5vbmUsICdhcmFiaWMtZm9ybScpLAogICAgKE5vbmUsICdhc2NlbnQnKSwKICAgIChOb25lLCAnYXR0cmlidXRlTmFtZScpLAogICAgKE5vbmUsICdhdHRyaWJ1dGVUeXBlJyksCiAgICAoTm9uZSwgJ2Jhc2VQcm9maWxlJyksCiAgICAoTm9uZSwgJ2Jib3gnKSwKICAgIChOb25lLCAnYmVnaW4nKSwKICAgIChOb25lLCAnYnknKSwKICAgIChOb25lLCAnY2FsY01vZGUnKSwKICAgIChOb25lLCAnY2FwLWhlaWdodCcpLAogICAgKE5vbmUsICdjbGFzcycpLAogICAgKE5vbmUsICdjbGlwLXBhdGgnKSwKICAgIChOb25lLCAnY29sb3InKSwKICAgIChOb25lLCAnY29sb3ItcmVuZGVyaW5nJyksCiAgICAoTm9uZSwgJ2NvbnRlbnQnKSwKICAgIChOb25lLCAnY3gnKSwKICAgIChOb25lLCAnY3knKSwKICAgIChOb25lLCAnZCcpLAogICAgKE5vbmUsICdkeCcpLAogICAgKE5vbmUsICdkeScpLAogICAgKE5vbmUsICdkZXNjZW50JyksCiAgICAoTm9uZSwgJ2Rpc3BsYXknKSwKICAgIChOb25lLCAnZHVyJyksCiAgICAoTm9uZSwgJ2VuZCcpLAogICAgKE5vbmUsICdmaWxsJyksCiAgICAoTm9uZSwgJ2ZpbGwtb3BhY2l0eScpLAogICAgKE5vbmUsICdmaWxsLXJ1bGUnKSwKICAgIChOb25lLCAnZm9udC1mYW1pbHknKSwKICAgIChOb25lLCAnZm9udC1zaXplJyksCiAgICAoTm9uZSwgJ2ZvbnQtc3RyZXRjaCcpLAogICAgKE5vbmUsICdmb250LXN0eWxlJyksCiAgICAoTm9uZSwgJ2ZvbnQtdmFyaWFudCcpLAogICAgKE5vbmUsICdmb250LXdlaWdodCcpLAogICAgKE5vbmUsICdmcm9tJyksCiAgICAoTm9uZSwgJ2Z4JyksCiAgICAoTm9uZSwgJ2Z5JyksCiAgICAoTm9uZSwgJ2cxJyksCiAgICAoTm9uZSwgJ2cyJyksCiAgICAoTm9uZSwgJ2dseXBoLW5hbWUnKSwKICAgIChOb25lLCAnZ3JhZGllbnRVbml0cycpLAogICAgKE5vbmUsICdoYW5naW5nJyksCiAgICAoTm9uZSwgJ2hlaWdodCcpLAogICAgKE5vbmUsICdob3Jpei1hZHYteCcpLAogICAgKE5vbmUsICdob3Jpei1vcmlnaW4teCcpLAogICAgKE5vbmUsICdpZCcpLAogICAgKE5vbmUsICdpZGVvZ3JhcGhpYycpLAogICAgKE5vbmUsICdrJyksCiAgICAoTm9uZSwgJ2tleVBvaW50cycpLAogICAgKE5vbmUsICdrZXlTcGxpbmVzJyksCiAgICAoTm9uZSwgJ2tleVRpbWVzJyksCiAgICAoTm9uZSwgJ2xhbmcnKSwKICAgIChOb25lLCAnbWFya2VyLWVuZCcpLAogICAgKE5vbmUsICdtYXJrZXItbWlkJyksCiAgICAoTm9uZSwgJ21hcmtlci1zdGFydCcpLAogICAgKE5vbmUsICdtYXJrZXJIZWlnaHQnKSwKICAgIChOb25lLCAnbWFya2VyVW5pdHMnKSwKICAgIChOb25lLCAnbWFya2VyV2lkdGgnKSwKICAgIChOb25lLCAnbWF0aGVtYXRpY2FsJyksCiAgICAoTm9uZSwgJ21heCcpLAogICAgKE5vbmUsICdtaW4nKSwKICAgIChOb25lLCAnbmFtZScpLAogICAgKE5vbmUsICdvZmZzZXQnKSwKICAgIChOb25lLCAnb3BhY2l0eScpLAogICAgKE5vbmUsICdvcmllbnQnKSwKICAgIChOb25lLCAnb3JpZ2luJyksCiAgICAoTm9uZSwgJ292ZXJsaW5lLXBvc2l0aW9uJyksCiAgICAoTm9uZSwgJ292ZXJsaW5lLXRoaWNrbmVzcycpLAogICAgKE5vbmUsICdwYW5vc2UtMScpLAogICAgKE5vbmUsICdwYXRoJyksCiAgICAoTm9uZSwgJ3BhdGhMZW5ndGgnKSwKICAgIChOb25lLCAncG9pbnRzJyksCiAgICAoTm9uZSwgJ3ByZXNlcnZlQXNwZWN0UmF0aW8nKSwKICAgIChOb25lLCAncicpLAogICAgKE5vbmUsICdyZWZYJyksCiAgICAoTm9uZSwgJ3JlZlknKSwKICAgIChOb25lLCAncmVwZWF0Q291bnQnKSwKICAgIChOb25lLCAncmVwZWF0RHVyJyksCiAgICAoTm9uZSwgJ3JlcXVpcmVkRXh0ZW5zaW9ucycpLAogICAgKE5vbmUsICdyZXF1aXJlZEZlYXR1cmVzJyksCiAgICAoTm9uZSwgJ3Jlc3RhcnQnKSwKICAgIChOb25lLCAncm90YXRlJyksCiAgICAoTm9uZSwgJ3J4JyksCiAgICAoTm9uZSwgJ3J5JyksCiAgICAoTm9uZSwgJ3Nsb3BlJyksCiAgICAoTm9uZSwgJ3N0ZW1oJyksCiAgICAoTm9uZSwgJ3N0ZW12JyksCiAgICAoTm9uZSwgJ3N0b3AtY29sb3InKSwKICAgIChOb25lLCAnc3RvcC1vcGFjaXR5JyksCiAgICAoTm9uZSwgJ3N0cmlrZXRocm91Z2gtcG9zaXRpb24nKSwKICAgIChOb25lLCAnc3RyaWtldGhyb3VnaC10aGlja25lc3MnKSwKICAgIChOb25lLCAnc3Ryb2tlJyksCiAgICAoTm9uZSwgJ3N0cm9rZS1kYXNoYXJyYXknKSwKICAgIChOb25lLCAnc3Ryb2tlLWRhc2hvZmZzZXQnKSwKICAgIChOb25lLCAnc3Ryb2tlLWxpbmVjYXAnKSwKICAgIChOb25lLCAnc3Ryb2tlLWxpbmVqb2luJyksCiAgICAoTm9uZSwgJ3N0cm9rZS1taXRlcmxpbWl0JyksCiAgICAoTm9uZSwgJ3N0cm9rZS1vcGFjaXR5JyksCiAgICAoTm9uZSwgJ3N0cm9rZS13aWR0aCcpLAogICAgKE5vbmUsICdzeXN0ZW1MYW5ndWFnZScpLAogICAgKE5vbmUsICd0YXJnZXQnKSwKICAgIChOb25lLCAndGV4dC1hbmNob3InKSwKICAgIChOb25lLCAndG8nKSwKICAgIChOb25lLCAndHJhbnNmb3JtJyksCiAgICAoTm9uZSwgJ3R5cGUnKSwKICAgIChOb25lLCAndTEnKSwKICAgIChOb25lLCAndTInKSwKICAgIChOb25lLCAndW5kZXJsaW5lLXBvc2l0aW9uJyksCiAgICAoTm9uZSwgJ3VuZGVybGluZS10aGlja25lc3MnKSwKICAgIChOb25lLCAndW5pY29kZScpLAogICAgKE5vbmUsICd1bmljb2RlLXJhbmdlJyksCiAgICAoTm9uZSwgJ3VuaXRzLXBlci1lbScpLAogICAgKE5vbmUsICd2YWx1ZXMnKSwKICAgIChOb25lLCAndmVyc2lvbicpLAogICAgKE5vbmUsICd2aWV3Qm94JyksCiAgICAoTm9uZSwgJ3Zpc2liaWxpdHknKSwKICAgIChOb25lLCAnd2lkdGgnKSwKICAgIChOb25lLCAnd2lkdGhzJyksCiAgICAoTm9uZSwgJ3gnKSwKICAgIChOb25lLCAneC1oZWlnaHQnKSwKICAgIChOb25lLCAneDEnKSwKICAgIChOb25lLCAneDInKSwKICAgIChuYW1lc3BhY2VzWyd4bGluayddLCAnYWN0dWF0ZScpLAogICAgKG5hbWVzcGFjZXNbJ3hsaW5rJ10sICdhcmNyb2xlJyksCiAgICAobmFtZXNwYWNlc1sneGxpbmsnXSwgJ2hyZWYnKSwKICAgIChuYW1lc3BhY2VzWyd4bGluayddLCAncm9sZScpLAogICAgKG5hbWVzcGFjZXNbJ3hsaW5rJ10sICdzaG93JyksCiAgICAobmFtZXNwYWNlc1sneGxpbmsnXSwgJ3RpdGxlJyksCiAgICAobmFtZXNwYWNlc1sneGxpbmsnXSwgJ3R5cGUnKSwKICAgIChuYW1lc3BhY2VzWyd4bWwnXSwgJ2Jhc2UnKSwKICAgIChuYW1lc3BhY2VzWyd4bWwnXSwgJ2xhbmcnKSwKICAgIChuYW1lc3BhY2VzWyd4bWwnXSwgJ3NwYWNlJyksCiAgICAoTm9uZSwgJ3knKSwKICAgIChOb25lLCAneTEnKSwKICAgIChOb25lLCAneTInKSwKICAgIChOb25lLCAnem9vbUFuZFBhbicpLAopKQoKYXR0cl92YWxfaXNfdXJpID0gZnJvemVuc2V0KCgKICAgIChOb25lLCAnaHJlZicpLAogICAgKE5vbmUsICdzcmMnKSwKICAgIChOb25lLCAnY2l0ZScpLAogICAgKE5vbmUsICdhY3Rpb24nKSwKICAgIChOb25lLCAnbG9uZ2Rlc2MnKSwKICAgIChOb25lLCAncG9zdGVyJyksCiAgICAoTm9uZSwgJ2JhY2tncm91bmQnKSwKICAgIChOb25lLCAnZGF0YXNyYycpLAogICAgKE5vbmUsICdkeW5zcmMnKSwKICAgIChOb25lLCAnbG93c3JjJyksCiAgICAoTm9uZSwgJ3BpbmcnKSwKICAgIChuYW1lc3BhY2VzWyd4bGluayddLCAnaHJlZicpLAogICAgKG5hbWVzcGFjZXNbJ3htbCddLCAnYmFzZScpLAopKQoKc3ZnX2F0dHJfdmFsX2FsbG93c19yZWYgPSBmcm96ZW5zZXQoKAogICAgKE5vbmUsICdjbGlwLXBhdGgnKSwKICAgIChOb25lLCAnY29sb3ItcHJvZmlsZScpLAogICAgKE5vbmUsICdjdXJzb3InKSwKICAgIChOb25lLCAnZmlsbCcpLAogICAgKE5vbmUsICdmaWx0ZXInKSwKICAgIChOb25lLCAnbWFya2VyJyksCiAgICAoTm9uZSwgJ21hcmtlci1zdGFydCcpLAogICAgKE5vbmUsICdtYXJrZXItbWlkJyksCiAgICAoTm9uZSwgJ21hcmtlci1lbmQnKSwKICAgIChOb25lLCAnbWFzaycpLAogICAgKE5vbmUsICdzdHJva2UnKSwKKSkKCnN2Z19hbGxvd19sb2NhbF9ocmVmID0gZnJvemVuc2V0KCgKICAgIChOb25lLCAnYWx0R2x5cGgnKSwKICAgIChOb25lLCAnYW5pbWF0ZScpLAogICAgKE5vbmUsICdhbmltYXRlQ29sb3InKSwKICAgIChOb25lLCAnYW5pbWF0ZU1vdGlvbicpLAogICAgKE5vbmUsICdhbmltYXRlVHJhbnNmb3JtJyksCiAgICAoTm9uZSwgJ2N1cnNvcicpLAogICAgKE5vbmUsICdmZUltYWdlJyksCiAgICAoTm9uZSwgJ2ZpbHRlcicpLAogICAgKE5vbmUsICdsaW5lYXJHcmFkaWVudCcpLAogICAgKE5vbmUsICdwYXR0ZXJuJyksCiAgICAoTm9uZSwgJ3JhZGlhbEdyYWRpZW50JyksCiAgICAoTm9uZSwgJ3RleHRwYXRoJyksCiAgICAoTm9uZSwgJ3RyZWYnKSwKICAgIChOb25lLCAnc2V0JyksCiAgICAoTm9uZSwgJ3VzZScpCikpCgphbGxvd2VkX2Nzc19wcm9wZXJ0aWVzID0gZnJvemVuc2V0KCgKICAgICdhemltdXRoJywKICAgICdiYWNrZ3JvdW5kLWNvbG9yJywKICAgICdib3JkZXItYm90dG9tLWNvbG9yJywKICAgICdib3JkZXItY29sbGFwc2UnLAogICAgJ2JvcmRlci1jb2xvcicsCiAgICAnYm9yZGVyLWxlZnQtY29sb3InLAogICAgJ2JvcmRlci1yaWdodC1jb2xvcicsCiAgICAnYm9yZGVyLXRvcC1jb2xvcicsCiAgICAnY2xlYXInLAogICAgJ2NvbG9yJywKICAgICdjdXJzb3InLAogICAgJ2RpcmVjdGlvbicsCiAgICAnZGlzcGxheScsCiAgICAnZWxldmF0aW9uJywKICAgICdmbG9hdCcsCiAgICAnZm9udCcsCiAgICAnZm9udC1mYW1pbHknLAogICAgJ2ZvbnQtc2l6ZScsCiAgICAnZm9udC1zdHlsZScsCiAgICAnZm9udC12YXJpYW50JywKICAgICdmb250LXdlaWdodCcsCiAgICAnaGVpZ2h0JywKICAgICdsZXR0ZXItc3BhY2luZycsCiAgICAnbGluZS1oZWlnaHQnLAogICAgJ292ZXJmbG93JywKICAgICdwYXVzZScsCiAgICAncGF1c2UtYWZ0ZXInLAogICAgJ3BhdXNlLWJlZm9yZScsCiAgICAncGl0Y2gnLAogICAgJ3BpdGNoLXJhbmdlJywKICAgICdyaWNobmVzcycsCiAgICAnc3BlYWsnLAogICAgJ3NwZWFrLWhlYWRlcicsCiAgICAnc3BlYWstbnVtZXJhbCcsCiAgICAnc3BlYWstcHVuY3R1YXRpb24nLAogICAgJ3NwZWVjaC1yYXRlJywKICAgICdzdHJlc3MnLAogICAgJ3RleHQtYWxpZ24nLAogICAgJ3RleHQtZGVjb3JhdGlvbicsCiAgICAndGV4dC1pbmRlbnQnLAogICAgJ3VuaWNvZGUtYmlkaScsCiAgICAndmVydGljYWwtYWxpZ24nLAogICAgJ3ZvaWNlLWZhbWlseScsCiAgICAndm9sdW1lJywKICAgICd3aGl0ZS1zcGFjZScsCiAgICAnd2lkdGgnLAopKQoKYWxsb3dlZF9jc3Nfa2V5d29yZHMgPSBmcm96ZW5zZXQoKAogICAgJ2F1dG8nLAogICAgJ2FxdWEnLAogICAgJ2JsYWNrJywKICAgICdibG9jaycsCiAgICAnYmx1ZScsCiAgICAnYm9sZCcsCiAgICAnYm90aCcsCiAgICAnYm90dG9tJywKICAgICdicm93bicsCiAgICAnY2VudGVyJywKICAgICdjb2xsYXBzZScsCiAgICAnZGFzaGVkJywKICAgICdkb3R0ZWQnLAogICAgJ2Z1Y2hzaWEnLAogICAgJ2dyYXknLAogICAgJ2dyZWVuJywKICAgICchaW1wb3J0YW50JywKICAgICdpdGFsaWMnLAogICAgJ2xlZnQnLAogICAgJ2xpbWUnLAogICAgJ21hcm9vbicsCiAgICAnbWVkaXVtJywKICAgICdub25lJywKICAgICduYXZ5JywKICAgICdub3JtYWwnLAogICAgJ25vd3JhcCcsCiAgICAnb2xpdmUnLAogICAgJ3BvaW50ZXInLAogICAgJ3B1cnBsZScsCiAgICAncmVkJywKICAgICdyaWdodCcsCiAgICAnc29saWQnLAogICAgJ3NpbHZlcicsCiAgICAndGVhbCcsCiAgICAndG9wJywKICAgICd0cmFuc3BhcmVudCcsCiAgICAndW5kZXJsaW5lJywKICAgICd3aGl0ZScsCiAgICAneWVsbG93JywKKSkKCmFsbG93ZWRfc3ZnX3Byb3BlcnRpZXMgPSBmcm96ZW5zZXQoKAogICAgJ2ZpbGwnLAogICAgJ2ZpbGwtb3BhY2l0eScsCiAgICAnZmlsbC1ydWxlJywKICAgICdzdHJva2UnLAogICAgJ3N0cm9rZS13aWR0aCcsCiAgICAnc3Ryb2tlLWxpbmVjYXAnLAogICAgJ3N0cm9rZS1saW5lam9pbicsCiAgICAnc3Ryb2tlLW9wYWNpdHknLAopKQoKYWxsb3dlZF9wcm90b2NvbHMgPSBmcm96ZW5zZXQoKAogICAgJ2VkMmsnLAogICAgJ2Z0cCcsCiAgICAnaHR0cCcsCiAgICAnaHR0cHMnLAogICAgJ2lyYycsCiAgICAnbWFpbHRvJywKICAgICduZXdzJywKICAgICdnb3BoZXInLAogICAgJ25udHAnLAogICAgJ3RlbG5ldCcsCiAgICAnd2ViY2FsJywKICAgICd4bXBwJywKICAgICdjYWxsdG8nLAogICAgJ2ZlZWQnLAogICAgJ3VybicsCiAgICAnYWltJywKICAgICdyc3luYycsCiAgICAndGFnJywKICAgICdzc2gnLAogICAgJ3NmdHAnLAogICAgJ3J0c3AnLAogICAgJ2FmcycsCiAgICAnZGF0YScsCikpCgphbGxvd2VkX2NvbnRlbnRfdHlwZXMgPSBmcm96ZW5zZXQoKAogICAgJ2ltYWdlL3BuZycsCiAgICAnaW1hZ2UvanBlZycsCiAgICAnaW1hZ2UvZ2lmJywKICAgICdpbWFnZS93ZWJwJywKICAgICdpbWFnZS9ibXAnLAogICAgJ3RleHQvcGxhaW4nLAopKQoKCmRhdGFfY29udGVudF90eXBlID0gcmUuY29tcGlsZShyJycnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgTWF0Y2ggYSBjb250ZW50IHR5cGUgPGFwcGxpY2F0aW9uPi88dHlwZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoP1A8Y29udGVudF90eXBlPlstYS16QS1aMC05Ll0rL1stYS16QS1aMC05Ll0rKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgTWF0Y2ggYW55IGNoYXJhY3RlciBzZXQgYW5kIGVuY29kaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKD86KD86O2NoYXJzZXQ9KD86Wy1hLXpBLVowLTldKykoPzo7KD86YmFzZTY0KSk/KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCg/OjsoPzpiYXNlNjQpKT8oPzo7Y2hhcnNldD0oPzpbLWEtekEtWjAtOV0rKSk/KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgQXNzdW1lIHRoZSByZXN0IGlzIGRhdGEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsLioKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJycnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmUuVkVSQk9TRSkKCgpjbGFzcyBGaWx0ZXIoYmFzZS5GaWx0ZXIpOgogICAgIiIiIHNhbml0aXphdGlvbiBvZiBYSFRNTCtNYXRoTUwrU1ZHIGFuZCBvZiBpbmxpbmUgc3R5bGUgYXR0cmlidXRlcy4iIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLAogICAgICAgICAgICAgICAgIHNvdXJjZSwKICAgICAgICAgICAgICAgICBhbGxvd2VkX2VsZW1lbnRzPWFsbG93ZWRfZWxlbWVudHMsCiAgICAgICAgICAgICAgICAgYWxsb3dlZF9hdHRyaWJ1dGVzPWFsbG93ZWRfYXR0cmlidXRlcywKICAgICAgICAgICAgICAgICBhbGxvd2VkX2Nzc19wcm9wZXJ0aWVzPWFsbG93ZWRfY3NzX3Byb3BlcnRpZXMsCiAgICAgICAgICAgICAgICAgYWxsb3dlZF9jc3Nfa2V5d29yZHM9YWxsb3dlZF9jc3Nfa2V5d29yZHMsCiAgICAgICAgICAgICAgICAgYWxsb3dlZF9zdmdfcHJvcGVydGllcz1hbGxvd2VkX3N2Z19wcm9wZXJ0aWVzLAogICAgICAgICAgICAgICAgIGFsbG93ZWRfcHJvdG9jb2xzPWFsbG93ZWRfcHJvdG9jb2xzLAogICAgICAgICAgICAgICAgIGFsbG93ZWRfY29udGVudF90eXBlcz1hbGxvd2VkX2NvbnRlbnRfdHlwZXMsCiAgICAgICAgICAgICAgICAgYXR0cl92YWxfaXNfdXJpPWF0dHJfdmFsX2lzX3VyaSwKICAgICAgICAgICAgICAgICBzdmdfYXR0cl92YWxfYWxsb3dzX3JlZj1zdmdfYXR0cl92YWxfYWxsb3dzX3JlZiwKICAgICAgICAgICAgICAgICBzdmdfYWxsb3dfbG9jYWxfaHJlZj1zdmdfYWxsb3dfbG9jYWxfaHJlZik6CiAgICAgICAgc3VwZXIoRmlsdGVyLCBzZWxmKS5fX2luaXRfXyhzb3VyY2UpCiAgICAgICAgc2VsZi5hbGxvd2VkX2VsZW1lbnRzID0gYWxsb3dlZF9lbGVtZW50cwogICAgICAgIHNlbGYuYWxsb3dlZF9hdHRyaWJ1dGVzID0gYWxsb3dlZF9hdHRyaWJ1dGVzCiAgICAgICAgc2VsZi5hbGxvd2VkX2Nzc19wcm9wZXJ0aWVzID0gYWxsb3dlZF9jc3NfcHJvcGVydGllcwogICAgICAgIHNlbGYuYWxsb3dlZF9jc3Nfa2V5d29yZHMgPSBhbGxvd2VkX2Nzc19rZXl3b3JkcwogICAgICAgIHNlbGYuYWxsb3dlZF9zdmdfcHJvcGVydGllcyA9IGFsbG93ZWRfc3ZnX3Byb3BlcnRpZXMKICAgICAgICBzZWxmLmFsbG93ZWRfcHJvdG9jb2xzID0gYWxsb3dlZF9wcm90b2NvbHMKICAgICAgICBzZWxmLmFsbG93ZWRfY29udGVudF90eXBlcyA9IGFsbG93ZWRfY29udGVudF90eXBlcwogICAgICAgIHNlbGYuYXR0cl92YWxfaXNfdXJpID0gYXR0cl92YWxfaXNfdXJpCiAgICAgICAgc2VsZi5zdmdfYXR0cl92YWxfYWxsb3dzX3JlZiA9IHN2Z19hdHRyX3ZhbF9hbGxvd3NfcmVmCiAgICAgICAgc2VsZi5zdmdfYWxsb3dfbG9jYWxfaHJlZiA9IHN2Z19hbGxvd19sb2NhbF9ocmVmCgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgIGZvciB0b2tlbiBpbiBiYXNlLkZpbHRlci5fX2l0ZXJfXyhzZWxmKToKICAgICAgICAgICAgdG9rZW4gPSBzZWxmLnNhbml0aXplX3Rva2VuKHRva2VuKQogICAgICAgICAgICBpZiB0b2tlbjoKICAgICAgICAgICAgICAgIHlpZWxkIHRva2VuCgogICAgIyBTYW5pdGl6ZSB0aGUgK2h0bWwrLCBlc2NhcGluZyBhbGwgZWxlbWVudHMgbm90IGluIEFMTE9XRURfRUxFTUVOVFMsIGFuZAogICAgIyBzdHJpcHBpbmcgb3V0IGFsbCAjIGF0dHJpYnV0ZXMgbm90IGluIEFMTE9XRURfQVRUUklCVVRFUy4gU3R5bGUKICAgICMgYXR0cmlidXRlcyBhcmUgcGFyc2VkLCBhbmQgYSByZXN0cmljdGVkIHNldCwgIyBzcGVjaWZpZWQgYnkKICAgICMgQUxMT1dFRF9DU1NfUFJPUEVSVElFUyBhbmQgQUxMT1dFRF9DU1NfS0VZV09SRFMsIGFyZSBhbGxvd2VkIHRocm91Z2guCiAgICAjIGF0dHJpYnV0ZXMgaW4gQVRUUl9WQUxfSVNfVVJJIGFyZSBzY2FubmVkLCBhbmQgb25seSBVUkkgc2NoZW1lcyBzcGVjaWZpZWQKICAgICMgaW4gQUxMT1dFRF9QUk9UT0NPTFMgYXJlIGFsbG93ZWQuCiAgICAjCiAgICAjICAgc2FuaXRpemVfaHRtbCgnPHNjcmlwdD4gZG9fbmFzdHlfc3R1ZmYoKSA8L3NjcmlwdD4nKQogICAgIyAgICA9PiAmbHQ7c2NyaXB0PiBkb19uYXN0eV9zdHVmZigpICZsdDsvc2NyaXB0PgogICAgIyAgIHNhbml0aXplX2h0bWwoJzxhIGhyZWY9ImphdmFzY3JpcHQ6IHN1Y2tlcigpOyI+Q2xpY2sgaGVyZSBmb3IgJDEwMDwvYT4nKQogICAgIyAgICA9PiA8YT5DbGljayBoZXJlIGZvciAkMTAwPC9hPgogICAgZGVmIHNhbml0aXplX3Rva2VuKHNlbGYsIHRva2VuKToKCiAgICAgICAgIyBhY2NvbW1vZGF0ZSBmaWx0ZXJzIHdoaWNoIHVzZSB0b2tlbl90eXBlIGRpZmZlcmVudGx5CiAgICAgICAgdG9rZW5fdHlwZSA9IHRva2VuWyJ0eXBlIl0KICAgICAgICBpZiB0b2tlbl90eXBlIGluICgiU3RhcnRUYWciLCAiRW5kVGFnIiwgIkVtcHR5VGFnIik6CiAgICAgICAgICAgIG5hbWUgPSB0b2tlblsibmFtZSJdCiAgICAgICAgICAgIG5hbWVzcGFjZSA9IHRva2VuWyJuYW1lc3BhY2UiXQogICAgICAgICAgICBpZiAoKG5hbWVzcGFjZSwgbmFtZSkgaW4gc2VsZi5hbGxvd2VkX2VsZW1lbnRzIG9yCiAgICAgICAgICAgICAgICAobmFtZXNwYWNlIGlzIE5vbmUgYW5kCiAgICAgICAgICAgICAgICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgbmFtZSkgaW4gc2VsZi5hbGxvd2VkX2VsZW1lbnRzKSk6CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5hbGxvd2VkX3Rva2VuKHRva2VuKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZGlzYWxsb3dlZF90b2tlbih0b2tlbikKICAgICAgICBlbGlmIHRva2VuX3R5cGUgPT0gIkNvbW1lbnQiOgogICAgICAgICAgICBwYXNzCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHRva2VuCgogICAgZGVmIGFsbG93ZWRfdG9rZW4oc2VsZiwgdG9rZW4pOgogICAgICAgIGlmICJkYXRhIiBpbiB0b2tlbjoKICAgICAgICAgICAgYXR0cnMgPSB0b2tlblsiZGF0YSJdCiAgICAgICAgICAgIGF0dHJfbmFtZXMgPSBzZXQoYXR0cnMua2V5cygpKQoKICAgICAgICAgICAgIyBSZW1vdmUgZm9yYmlkZGVuIGF0dHJpYnV0ZXMKICAgICAgICAgICAgZm9yIHRvX3JlbW92ZSBpbiAoYXR0cl9uYW1lcyAtIHNlbGYuYWxsb3dlZF9hdHRyaWJ1dGVzKToKICAgICAgICAgICAgICAgIGRlbCB0b2tlblsiZGF0YSJdW3RvX3JlbW92ZV0KICAgICAgICAgICAgICAgIGF0dHJfbmFtZXMucmVtb3ZlKHRvX3JlbW92ZSkKCiAgICAgICAgICAgICMgUmVtb3ZlIGF0dHJpYnV0ZXMgd2l0aCBkaXNhbGxvd2VkIFVSTCB2YWx1ZXMKICAgICAgICAgICAgZm9yIGF0dHIgaW4gKGF0dHJfbmFtZXMgJiBzZWxmLmF0dHJfdmFsX2lzX3VyaSk6CiAgICAgICAgICAgICAgICBhc3NlcnQgYXR0ciBpbiBhdHRycwogICAgICAgICAgICAgICAgIyBJIGRvbid0IGhhdmUgYSBjbHVlIHdoZXJlIHRoaXMgcmVnZXhwIGNvbWVzIGZyb20gb3Igd2h5IGl0IG1hdGNoZXMgdGhvc2UKICAgICAgICAgICAgICAgICMgY2hhcmFjdGVycywgbm9yIHdoeSB3ZSBjYWxsIHVuZXNjYXBlLiBJIGp1c3Qga25vdyBpdCdzIGFsd2F5cyBiZWVuIGhlcmUuCiAgICAgICAgICAgICAgICAjIFNob3VsZCB5b3UgYmUgd29ycmllZCBieSB0aGlzIGNvbW1lbnQgaW4gYSBzYW5pdGl6ZXI/IFllcy4gT24gdGhlIG90aGVyIGhhbmQsIGFsbAogICAgICAgICAgICAgICAgIyB0aGlzIHdpbGwgZG8gaXMgcmVtb3ZlICptb3JlKiB0aGFuIGl0IG90aGVyd2lzZSB3b3VsZC4KICAgICAgICAgICAgICAgIHZhbF91bmVzY2FwZWQgPSByZS5zdWIoIltgXHgwMC1ceDIwXHg3Zi1ceGEwXHNdKyIsICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmVzY2FwZShhdHRyc1thdHRyXSkpLmxvd2VyKCkKICAgICAgICAgICAgICAgICMgcmVtb3ZlIHJlcGxhY2VtZW50IGNoYXJhY3RlcnMgZnJvbSB1bmVzY2FwZWQgY2hhcmFjdGVycwogICAgICAgICAgICAgICAgdmFsX3VuZXNjYXBlZCA9IHZhbF91bmVzY2FwZWQucmVwbGFjZSgiXHVmZmZkIiwgIiIpCiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgdXJpID0gdXJscGFyc2UudXJscGFyc2UodmFsX3VuZXNjYXBlZCkKICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgICAgICAgIHVyaSA9IE5vbmUKICAgICAgICAgICAgICAgICAgICBkZWwgYXR0cnNbYXR0cl0KICAgICAgICAgICAgICAgIGlmIHVyaSBhbmQgdXJpLnNjaGVtZToKICAgICAgICAgICAgICAgICAgICBpZiB1cmkuc2NoZW1lIG5vdCBpbiBzZWxmLmFsbG93ZWRfcHJvdG9jb2xzOgogICAgICAgICAgICAgICAgICAgICAgICBkZWwgYXR0cnNbYXR0cl0KICAgICAgICAgICAgICAgICAgICBpZiB1cmkuc2NoZW1lID09ICdkYXRhJzoKICAgICAgICAgICAgICAgICAgICAgICAgbSA9IGRhdGFfY29udGVudF90eXBlLm1hdGNoKHVyaS5wYXRoKQogICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgbToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbCBhdHRyc1thdHRyXQogICAgICAgICAgICAgICAgICAgICAgICBlbGlmIG0uZ3JvdXAoJ2NvbnRlbnRfdHlwZScpIG5vdCBpbiBzZWxmLmFsbG93ZWRfY29udGVudF90eXBlczoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbCBhdHRyc1thdHRyXQoKICAgICAgICAgICAgZm9yIGF0dHIgaW4gc2VsZi5zdmdfYXR0cl92YWxfYWxsb3dzX3JlZjoKICAgICAgICAgICAgICAgIGlmIGF0dHIgaW4gYXR0cnM6CiAgICAgICAgICAgICAgICAgICAgYXR0cnNbYXR0cl0gPSByZS5zdWIocid1cmxccypcKFxzKlteI1xzXVteKV0rP1wpJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5lc2NhcGUoYXR0cnNbYXR0cl0pKQogICAgICAgICAgICBpZiAodG9rZW5bIm5hbWUiXSBpbiBzZWxmLnN2Z19hbGxvd19sb2NhbF9ocmVmIGFuZAogICAgICAgICAgICAgICAgKG5hbWVzcGFjZXNbJ3hsaW5rJ10sICdocmVmJykgaW4gYXR0cnMgYW5kIHJlLnNlYXJjaCgnXlxzKlteI1xzXS4qJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnNbKG5hbWVzcGFjZXNbJ3hsaW5rJ10sICdocmVmJyldKSk6CiAgICAgICAgICAgICAgICBkZWwgYXR0cnNbKG5hbWVzcGFjZXNbJ3hsaW5rJ10sICdocmVmJyldCiAgICAgICAgICAgIGlmIChOb25lLCAnc3R5bGUnKSBpbiBhdHRyczoKICAgICAgICAgICAgICAgIGF0dHJzWyhOb25lLCAnc3R5bGUnKV0gPSBzZWxmLnNhbml0aXplX2NzcyhhdHRyc1soTm9uZSwgJ3N0eWxlJyldKQogICAgICAgICAgICB0b2tlblsiZGF0YSJdID0gYXR0cnMKICAgICAgICByZXR1cm4gdG9rZW4KCiAgICBkZWYgZGlzYWxsb3dlZF90b2tlbihzZWxmLCB0b2tlbik6CiAgICAgICAgdG9rZW5fdHlwZSA9IHRva2VuWyJ0eXBlIl0KICAgICAgICBpZiB0b2tlbl90eXBlID09ICJFbmRUYWciOgogICAgICAgICAgICB0b2tlblsiZGF0YSJdID0gIjwvJXM+IiAlIHRva2VuWyJuYW1lIl0KICAgICAgICBlbGlmIHRva2VuWyJkYXRhIl06CiAgICAgICAgICAgIGFzc2VydCB0b2tlbl90eXBlIGluICgiU3RhcnRUYWciLCAiRW1wdHlUYWciKQogICAgICAgICAgICBhdHRycyA9IFtdCiAgICAgICAgICAgIGZvciAobnMsIG5hbWUpLCB2IGluIHRva2VuWyJkYXRhIl0uaXRlbXMoKToKICAgICAgICAgICAgICAgIGF0dHJzLmFwcGVuZCgnICVzPSIlcyInICUgKG5hbWUgaWYgbnMgaXMgTm9uZSBlbHNlICIlczolcyIgJSAocHJlZml4ZXNbbnNdLCBuYW1lKSwgZXNjYXBlKHYpKSkKICAgICAgICAgICAgdG9rZW5bImRhdGEiXSA9ICI8JXMlcz4iICUgKHRva2VuWyJuYW1lIl0sICcnLmpvaW4oYXR0cnMpKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHRva2VuWyJkYXRhIl0gPSAiPCVzPiIgJSB0b2tlblsibmFtZSJdCiAgICAgICAgaWYgdG9rZW4uZ2V0KCJzZWxmQ2xvc2luZyIpOgogICAgICAgICAgICB0b2tlblsiZGF0YSJdID0gdG9rZW5bImRhdGEiXVs6LTFdICsgIi8+IgoKICAgICAgICB0b2tlblsidHlwZSJdID0gIkNoYXJhY3RlcnMiCgogICAgICAgIGRlbCB0b2tlblsibmFtZSJdCiAgICAgICAgcmV0dXJuIHRva2VuCgogICAgZGVmIHNhbml0aXplX2NzcyhzZWxmLCBzdHlsZSk6CiAgICAgICAgIyBkaXNhbGxvdyB1cmxzCiAgICAgICAgc3R5bGUgPSByZS5jb21waWxlKCd1cmxccypcKFxzKlteXHMpXSs/XHMqXClccyonKS5zdWIoJyAnLCBzdHlsZSkKCiAgICAgICAgIyBnYXVudGxldAogICAgICAgIGlmIG5vdCByZS5tYXRjaCgiIiJeKFs6LDsjJS5cc2EtekEtWjAtOSFdfFx3LVx3fCdbXHNcd10rJ3wiW1xzXHddKyJ8XChbXGQsXHNdK1wpKSokIiIiLCBzdHlsZSk6CiAgICAgICAgICAgIHJldHVybiAnJwogICAgICAgIGlmIG5vdCByZS5tYXRjaCgiXlxzKihbLVx3XStccyo6W146O10qKDtccyp8JCkpKiQiLCBzdHlsZSk6CiAgICAgICAgICAgIHJldHVybiAnJwoKICAgICAgICBjbGVhbiA9IFtdCiAgICAgICAgZm9yIHByb3AsIHZhbHVlIGluIHJlLmZpbmRhbGwoIihbLVx3XSspXHMqOlxzKihbXjo7XSopIiwgc3R5bGUpOgogICAgICAgICAgICBpZiBub3QgdmFsdWU6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBpZiBwcm9wLmxvd2VyKCkgaW4gc2VsZi5hbGxvd2VkX2Nzc19wcm9wZXJ0aWVzOgogICAgICAgICAgICAgICAgY2xlYW4uYXBwZW5kKHByb3AgKyAnOiAnICsgdmFsdWUgKyAnOycpCiAgICAgICAgICAgIGVsaWYgcHJvcC5zcGxpdCgnLScpWzBdLmxvd2VyKCkgaW4gWydiYWNrZ3JvdW5kJywgJ2JvcmRlcicsICdtYXJnaW4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGFkZGluZyddOgogICAgICAgICAgICAgICAgZm9yIGtleXdvcmQgaW4gdmFsdWUuc3BsaXQoKToKICAgICAgICAgICAgICAgICAgICBpZiBrZXl3b3JkIG5vdCBpbiBzZWxmLmFsbG93ZWRfY3NzX2tleXdvcmRzIGFuZCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgcmUubWF0Y2goIl4oI1swLTlhLWZdK3xyZ2JcKFxkKyU/LFxkKiU/LD9cZColP1wpP3xcZHswLDJ9XC4/XGR7MCwyfShjbXxlbXxleHxpbnxtbXxwY3xwdHxweHwlfCx8XCkpPykkIiwga2V5d29yZCk6ICAjIG5vcWEKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgY2xlYW4uYXBwZW5kKHByb3AgKyAnOiAnICsgdmFsdWUgKyAnOycpCiAgICAgICAgICAgIGVsaWYgcHJvcC5sb3dlcigpIGluIHNlbGYuYWxsb3dlZF9zdmdfcHJvcGVydGllczoKICAgICAgICAgICAgICAgIGNsZWFuLmFwcGVuZChwcm9wICsgJzogJyArIHZhbHVlICsgJzsnKQoKICAgICAgICByZXR1cm4gJyAnLmpvaW4oY2xlYW4pClBLAwQUAAAAAAAAACEAn45qrXMEAABzBAAARwAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvZmlsdGVycy93aGl0ZXNwYWNlLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCB1bmljb2RlX2xpdGVyYWxzCgppbXBvcnQgcmUKCmZyb20gLiBpbXBvcnQgYmFzZQpmcm9tIC4uY29uc3RhbnRzIGltcG9ydCByY2RhdGFFbGVtZW50cywgc3BhY2VDaGFyYWN0ZXJzCnNwYWNlQ2hhcmFjdGVycyA9ICIiLmpvaW4oc3BhY2VDaGFyYWN0ZXJzKQoKU1BBQ0VTX1JFR0VYID0gcmUuY29tcGlsZSgiWyVzXSsiICUgc3BhY2VDaGFyYWN0ZXJzKQoKCmNsYXNzIEZpbHRlcihiYXNlLkZpbHRlcik6CgogICAgc3BhY2VQcmVzZXJ2ZUVsZW1lbnRzID0gZnJvemVuc2V0KFsicHJlIiwgInRleHRhcmVhIl0gKyBsaXN0KHJjZGF0YUVsZW1lbnRzKSkKCiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgcHJlc2VydmUgPSAwCiAgICAgICAgZm9yIHRva2VuIGluIGJhc2UuRmlsdGVyLl9faXRlcl9fKHNlbGYpOgogICAgICAgICAgICB0eXBlID0gdG9rZW5bInR5cGUiXQogICAgICAgICAgICBpZiB0eXBlID09ICJTdGFydFRhZyIgXAogICAgICAgICAgICAgICAgICAgIGFuZCAocHJlc2VydmUgb3IgdG9rZW5bIm5hbWUiXSBpbiBzZWxmLnNwYWNlUHJlc2VydmVFbGVtZW50cyk6CiAgICAgICAgICAgICAgICBwcmVzZXJ2ZSArPSAxCgogICAgICAgICAgICBlbGlmIHR5cGUgPT0gIkVuZFRhZyIgYW5kIHByZXNlcnZlOgogICAgICAgICAgICAgICAgcHJlc2VydmUgLT0gMQoKICAgICAgICAgICAgZWxpZiBub3QgcHJlc2VydmUgYW5kIHR5cGUgPT0gIlNwYWNlQ2hhcmFjdGVycyIgYW5kIHRva2VuWyJkYXRhIl06CiAgICAgICAgICAgICAgICAjIFRlc3Qgb24gdG9rZW5bImRhdGEiXSBhYm92ZSB0byBub3QgaW50cm9kdWNlIHNwYWNlcyB3aGVyZSB0aGVyZSB3ZXJlIG5vdAogICAgICAgICAgICAgICAgdG9rZW5bImRhdGEiXSA9ICIgIgoKICAgICAgICAgICAgZWxpZiBub3QgcHJlc2VydmUgYW5kIHR5cGUgPT0gIkNoYXJhY3RlcnMiOgogICAgICAgICAgICAgICAgdG9rZW5bImRhdGEiXSA9IGNvbGxhcHNlX3NwYWNlcyh0b2tlblsiZGF0YSJdKQoKICAgICAgICAgICAgeWllbGQgdG9rZW4KCgpkZWYgY29sbGFwc2Vfc3BhY2VzKHRleHQpOgogICAgcmV0dXJuIFNQQUNFU19SRUdFWC5zdWIoJyAnLCB0ZXh0KQpQSwMEFAAAAAAAAAAhAGPYd9yyyQEAsskBAEAAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL2h0bWw1cGFyc2VyLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCB1bmljb2RlX2xpdGVyYWxzCmZyb20gcGlwLl92ZW5kb3Iuc2l4IGltcG9ydCB3aXRoX21ldGFjbGFzcywgdmlld2tleXMsIFBZMwoKaW1wb3J0IHR5cGVzCgp0cnk6CiAgICBmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBPcmRlcmVkRGljdApleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBmcm9tIHBpcC5fdmVuZG9yLm9yZGVyZWRkaWN0IGltcG9ydCBPcmRlcmVkRGljdAoKZnJvbSAuIGltcG9ydCBfaW5wdXRzdHJlYW0KZnJvbSAuIGltcG9ydCBfdG9rZW5pemVyCgpmcm9tIC4gaW1wb3J0IHRyZWVidWlsZGVycwpmcm9tIC50cmVlYnVpbGRlcnMuYmFzZSBpbXBvcnQgTWFya2VyCgpmcm9tIC4gaW1wb3J0IF91dGlscwpmcm9tIC5jb25zdGFudHMgaW1wb3J0ICgKICAgIHNwYWNlQ2hhcmFjdGVycywgYXNjaWlVcHBlcjJMb3dlciwKICAgIHNwZWNpYWxFbGVtZW50cywgaGVhZGluZ0VsZW1lbnRzLCBjZGF0YUVsZW1lbnRzLCByY2RhdGFFbGVtZW50cywKICAgIHRva2VuVHlwZXMsIHRhZ1Rva2VuVHlwZXMsCiAgICBuYW1lc3BhY2VzLAogICAgaHRtbEludGVncmF0aW9uUG9pbnRFbGVtZW50cywgbWF0aG1sVGV4dEludGVncmF0aW9uUG9pbnRFbGVtZW50cywKICAgIGFkanVzdEZvcmVpZ25BdHRyaWJ1dGVzIGFzIGFkanVzdEZvcmVpZ25BdHRyaWJ1dGVzTWFwLAogICAgYWRqdXN0TWF0aE1MQXR0cmlidXRlcywgYWRqdXN0U1ZHQXR0cmlidXRlcywKICAgIEUsCiAgICBSZXBhcnNlRXhjZXB0aW9uCikKCgpkZWYgcGFyc2UoZG9jLCB0cmVlYnVpbGRlcj0iZXRyZWUiLCBuYW1lc3BhY2VIVE1MRWxlbWVudHM9VHJ1ZSwgKiprd2FyZ3MpOgogICAgIiIiUGFyc2UgYSBzdHJpbmcgb3IgZmlsZS1saWtlIG9iamVjdCBpbnRvIGEgdHJlZSIiIgogICAgdGIgPSB0cmVlYnVpbGRlcnMuZ2V0VHJlZUJ1aWxkZXIodHJlZWJ1aWxkZXIpCiAgICBwID0gSFRNTFBhcnNlcih0YiwgbmFtZXNwYWNlSFRNTEVsZW1lbnRzPW5hbWVzcGFjZUhUTUxFbGVtZW50cykKICAgIHJldHVybiBwLnBhcnNlKGRvYywgKiprd2FyZ3MpCgoKZGVmIHBhcnNlRnJhZ21lbnQoZG9jLCBjb250YWluZXI9ImRpdiIsIHRyZWVidWlsZGVyPSJldHJlZSIsIG5hbWVzcGFjZUhUTUxFbGVtZW50cz1UcnVlLCAqKmt3YXJncyk6CiAgICB0YiA9IHRyZWVidWlsZGVycy5nZXRUcmVlQnVpbGRlcih0cmVlYnVpbGRlcikKICAgIHAgPSBIVE1MUGFyc2VyKHRiLCBuYW1lc3BhY2VIVE1MRWxlbWVudHM9bmFtZXNwYWNlSFRNTEVsZW1lbnRzKQogICAgcmV0dXJuIHAucGFyc2VGcmFnbWVudChkb2MsIGNvbnRhaW5lcj1jb250YWluZXIsICoqa3dhcmdzKQoKCmRlZiBtZXRob2RfZGVjb3JhdG9yX21ldGFjbGFzcyhmdW5jdGlvbik6CiAgICBjbGFzcyBEZWNvcmF0ZWQodHlwZSk6CiAgICAgICAgZGVmIF9fbmV3X18obWV0YSwgY2xhc3NuYW1lLCBiYXNlcywgY2xhc3NEaWN0KToKICAgICAgICAgICAgZm9yIGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZSBpbiBjbGFzc0RpY3QuaXRlbXMoKToKICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoYXR0cmlidXRlLCB0eXBlcy5GdW5jdGlvblR5cGUpOgogICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9IGZ1bmN0aW9uKGF0dHJpYnV0ZSkKCiAgICAgICAgICAgICAgICBjbGFzc0RpY3RbYXR0cmlidXRlTmFtZV0gPSBhdHRyaWJ1dGUKICAgICAgICAgICAgcmV0dXJuIHR5cGUuX19uZXdfXyhtZXRhLCBjbGFzc25hbWUsIGJhc2VzLCBjbGFzc0RpY3QpCiAgICByZXR1cm4gRGVjb3JhdGVkCgoKY2xhc3MgSFRNTFBhcnNlcihvYmplY3QpOgogICAgIiIiSFRNTCBwYXJzZXIuIEdlbmVyYXRlcyBhIHRyZWUgc3RydWN0dXJlIGZyb20gYSBzdHJlYW0gb2YgKHBvc3NpYmx5CiAgICAgICAgbWFsZm9ybWVkKSBIVE1MIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHRyZWU9Tm9uZSwgc3RyaWN0PUZhbHNlLCBuYW1lc3BhY2VIVE1MRWxlbWVudHM9VHJ1ZSwgZGVidWc9RmFsc2UpOgogICAgICAgICIiIgogICAgICAgIHN0cmljdCAtIHJhaXNlIGFuIGV4Y2VwdGlvbiB3aGVuIGEgcGFyc2UgZXJyb3IgaXMgZW5jb3VudGVyZWQKCiAgICAgICAgdHJlZSAtIGEgdHJlZWJ1aWxkZXIgY2xhc3MgY29udHJvbGxpbmcgdGhlIHR5cGUgb2YgdHJlZSB0aGF0IHdpbGwgYmUKICAgICAgICByZXR1cm5lZC4gQnVpbHQgaW4gdHJlZWJ1aWxkZXJzIGNhbiBiZSBhY2Nlc3NlZCB0aHJvdWdoCiAgICAgICAgaHRtbDVsaWIudHJlZWJ1aWxkZXJzLmdldFRyZWVCdWlsZGVyKHRyZWVUeXBlKQogICAgICAgICIiIgoKICAgICAgICAjIFJhaXNlIGFuIGV4Y2VwdGlvbiBvbiB0aGUgZmlyc3QgZXJyb3IgZW5jb3VudGVyZWQKICAgICAgICBzZWxmLnN0cmljdCA9IHN0cmljdAoKICAgICAgICBpZiB0cmVlIGlzIE5vbmU6CiAgICAgICAgICAgIHRyZWUgPSB0cmVlYnVpbGRlcnMuZ2V0VHJlZUJ1aWxkZXIoImV0cmVlIikKICAgICAgICBzZWxmLnRyZWUgPSB0cmVlKG5hbWVzcGFjZUhUTUxFbGVtZW50cykKICAgICAgICBzZWxmLmVycm9ycyA9IFtdCgogICAgICAgIHNlbGYucGhhc2VzID0gZGljdChbKG5hbWUsIGNscyhzZWxmLCBzZWxmLnRyZWUpKSBmb3IgbmFtZSwgY2xzIGluCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRQaGFzZXMoZGVidWcpLml0ZW1zKCldKQoKICAgIGRlZiBfcGFyc2Uoc2VsZiwgc3RyZWFtLCBpbm5lckhUTUw9RmFsc2UsIGNvbnRhaW5lcj0iZGl2Iiwgc2NyaXB0aW5nPUZhbHNlLCAqKmt3YXJncyk6CgogICAgICAgIHNlbGYuaW5uZXJIVE1MTW9kZSA9IGlubmVySFRNTAogICAgICAgIHNlbGYuY29udGFpbmVyID0gY29udGFpbmVyCiAgICAgICAgc2VsZi5zY3JpcHRpbmcgPSBzY3JpcHRpbmcKICAgICAgICBzZWxmLnRva2VuaXplciA9IF90b2tlbml6ZXIuSFRNTFRva2VuaXplcihzdHJlYW0sIHBhcnNlcj1zZWxmLCAqKmt3YXJncykKICAgICAgICBzZWxmLnJlc2V0KCkKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLm1haW5Mb29wKCkKICAgICAgICBleGNlcHQgUmVwYXJzZUV4Y2VwdGlvbjoKICAgICAgICAgICAgc2VsZi5yZXNldCgpCiAgICAgICAgICAgIHNlbGYubWFpbkxvb3AoKQoKICAgIGRlZiByZXNldChzZWxmKToKICAgICAgICBzZWxmLnRyZWUucmVzZXQoKQogICAgICAgIHNlbGYuZmlyc3RTdGFydFRhZyA9IEZhbHNlCiAgICAgICAgc2VsZi5lcnJvcnMgPSBbXQogICAgICAgIHNlbGYubG9nID0gW10gICMgb25seSB1c2VkIHdpdGggZGVidWcgbW9kZQogICAgICAgICMgInF1aXJrcyIgLyAibGltaXRlZCBxdWlya3MiIC8gIm5vIHF1aXJrcyIKICAgICAgICBzZWxmLmNvbXBhdE1vZGUgPSAibm8gcXVpcmtzIgoKICAgICAgICBpZiBzZWxmLmlubmVySFRNTE1vZGU6CiAgICAgICAgICAgIHNlbGYuaW5uZXJIVE1MID0gc2VsZi5jb250YWluZXIubG93ZXIoKQoKICAgICAgICAgICAgaWYgc2VsZi5pbm5lckhUTUwgaW4gY2RhdGFFbGVtZW50czoKICAgICAgICAgICAgICAgIHNlbGYudG9rZW5pemVyLnN0YXRlID0gc2VsZi50b2tlbml6ZXIucmNkYXRhU3RhdGUKICAgICAgICAgICAgZWxpZiBzZWxmLmlubmVySFRNTCBpbiByY2RhdGFFbGVtZW50czoKICAgICAgICAgICAgICAgIHNlbGYudG9rZW5pemVyLnN0YXRlID0gc2VsZi50b2tlbml6ZXIucmF3dGV4dFN0YXRlCiAgICAgICAgICAgIGVsaWYgc2VsZi5pbm5lckhUTUwgPT0gJ3BsYWludGV4dCc6CiAgICAgICAgICAgICAgICBzZWxmLnRva2VuaXplci5zdGF0ZSA9IHNlbGYudG9rZW5pemVyLnBsYWludGV4dFN0YXRlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIHN0YXRlIGFscmVhZHkgaXMgZGF0YSBzdGF0ZQogICAgICAgICAgICAgICAgIyBzZWxmLnRva2VuaXplci5zdGF0ZSA9IHNlbGYudG9rZW5pemVyLmRhdGFTdGF0ZQogICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICBzZWxmLnBoYXNlID0gc2VsZi5waGFzZXNbImJlZm9yZUh0bWwiXQogICAgICAgICAgICBzZWxmLnBoYXNlLmluc2VydEh0bWxFbGVtZW50KCkKICAgICAgICAgICAgc2VsZi5yZXNldEluc2VydGlvbk1vZGUoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuaW5uZXJIVE1MID0gRmFsc2UgICMgcHlsaW50OmRpc2FibGU9cmVkZWZpbmVkLXZhcmlhYmxlLXR5cGUKICAgICAgICAgICAgc2VsZi5waGFzZSA9IHNlbGYucGhhc2VzWyJpbml0aWFsIl0KCiAgICAgICAgc2VsZi5sYXN0UGhhc2UgPSBOb25lCgogICAgICAgIHNlbGYuYmVmb3JlUkNEYXRhUGhhc2UgPSBOb25lCgogICAgICAgIHNlbGYuZnJhbWVzZXRPSyA9IFRydWUKCiAgICBAcHJvcGVydHkKICAgIGRlZiBkb2N1bWVudEVuY29kaW5nKHNlbGYpOgogICAgICAgICIiIlRoZSBuYW1lIG9mIHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcKICAgICAgICB0aGF0IHdhcyB1c2VkIHRvIGRlY29kZSB0aGUgaW5wdXQgc3RyZWFtLAogICAgICAgIG9yIDpvYmo6YE5vbmVgIGlmIHRoYXQgaXMgbm90IGRldGVybWluZWQgeWV0LgoKICAgICAgICAiIiIKICAgICAgICBpZiBub3QgaGFzYXR0cihzZWxmLCAndG9rZW5pemVyJyk6CiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgcmV0dXJuIHNlbGYudG9rZW5pemVyLnN0cmVhbS5jaGFyRW5jb2RpbmdbMF0ubmFtZQoKICAgIGRlZiBpc0hUTUxJbnRlZ3JhdGlvblBvaW50KHNlbGYsIGVsZW1lbnQpOgogICAgICAgIGlmIChlbGVtZW50Lm5hbWUgPT0gImFubm90YXRpb24teG1sIiBhbmQKICAgICAgICAgICAgICAgIGVsZW1lbnQubmFtZXNwYWNlID09IG5hbWVzcGFjZXNbIm1hdGhtbCJdKToKICAgICAgICAgICAgcmV0dXJuICgiZW5jb2RpbmciIGluIGVsZW1lbnQuYXR0cmlidXRlcyBhbmQKICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmF0dHJpYnV0ZXNbImVuY29kaW5nIl0udHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICAgICBhc2NpaVVwcGVyMkxvd2VyKSBpbgogICAgICAgICAgICAgICAgICAgICgidGV4dC9odG1sIiwgImFwcGxpY2F0aW9uL3hodG1sK3htbCIpKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiAoZWxlbWVudC5uYW1lc3BhY2UsIGVsZW1lbnQubmFtZSkgaW4gaHRtbEludGVncmF0aW9uUG9pbnRFbGVtZW50cwoKICAgIGRlZiBpc01hdGhNTFRleHRJbnRlZ3JhdGlvblBvaW50KHNlbGYsIGVsZW1lbnQpOgogICAgICAgIHJldHVybiAoZWxlbWVudC5uYW1lc3BhY2UsIGVsZW1lbnQubmFtZSkgaW4gbWF0aG1sVGV4dEludGVncmF0aW9uUG9pbnRFbGVtZW50cwoKICAgIGRlZiBtYWluTG9vcChzZWxmKToKICAgICAgICBDaGFyYWN0ZXJzVG9rZW4gPSB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0KICAgICAgICBTcGFjZUNoYXJhY3RlcnNUb2tlbiA9IHRva2VuVHlwZXNbIlNwYWNlQ2hhcmFjdGVycyJdCiAgICAgICAgU3RhcnRUYWdUb2tlbiA9IHRva2VuVHlwZXNbIlN0YXJ0VGFnIl0KICAgICAgICBFbmRUYWdUb2tlbiA9IHRva2VuVHlwZXNbIkVuZFRhZyJdCiAgICAgICAgQ29tbWVudFRva2VuID0gdG9rZW5UeXBlc1siQ29tbWVudCJdCiAgICAgICAgRG9jdHlwZVRva2VuID0gdG9rZW5UeXBlc1siRG9jdHlwZSJdCiAgICAgICAgUGFyc2VFcnJvclRva2VuID0gdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdCgogICAgICAgIGZvciB0b2tlbiBpbiBzZWxmLm5vcm1hbGl6ZWRUb2tlbnMoKToKICAgICAgICAgICAgcHJldl90b2tlbiA9IE5vbmUKICAgICAgICAgICAgbmV3X3Rva2VuID0gdG9rZW4KICAgICAgICAgICAgd2hpbGUgbmV3X3Rva2VuIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgcHJldl90b2tlbiA9IG5ld190b2tlbgogICAgICAgICAgICAgICAgY3VycmVudE5vZGUgPSBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXSBpZiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzIGVsc2UgTm9uZQogICAgICAgICAgICAgICAgY3VycmVudE5vZGVOYW1lc3BhY2UgPSBjdXJyZW50Tm9kZS5uYW1lc3BhY2UgaWYgY3VycmVudE5vZGUgZWxzZSBOb25lCiAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZU5hbWUgPSBjdXJyZW50Tm9kZS5uYW1lIGlmIGN1cnJlbnROb2RlIGVsc2UgTm9uZQoKICAgICAgICAgICAgICAgIHR5cGUgPSBuZXdfdG9rZW5bInR5cGUiXQoKICAgICAgICAgICAgICAgIGlmIHR5cGUgPT0gUGFyc2VFcnJvclRva2VuOgogICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2VFcnJvcihuZXdfdG9rZW5bImRhdGEiXSwgbmV3X3Rva2VuLmdldCgiZGF0YXZhcnMiLCB7fSkpCiAgICAgICAgICAgICAgICAgICAgbmV3X3Rva2VuID0gTm9uZQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBpZiAobGVuKHNlbGYudHJlZS5vcGVuRWxlbWVudHMpID09IDAgb3IKICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGVOYW1lc3BhY2UgPT0gc2VsZi50cmVlLmRlZmF1bHROYW1lc3BhY2Ugb3IKICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYuaXNNYXRoTUxUZXh0SW50ZWdyYXRpb25Qb2ludChjdXJyZW50Tm9kZSkgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAoKHR5cGUgPT0gU3RhcnRUYWdUb2tlbiBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5bIm5hbWUiXSBub3QgaW4gZnJvemVuc2V0KFsibWdseXBoIiwgIm1hbGlnbm1hcmsiXSkpIG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSBpbiAoQ2hhcmFjdGVyc1Rva2VuLCBTcGFjZUNoYXJhY3RlcnNUb2tlbikpKSBvcgogICAgICAgICAgICAgICAgICAgICAgICAoY3VycmVudE5vZGVOYW1lc3BhY2UgPT0gbmFtZXNwYWNlc1sibWF0aG1sIl0gYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZU5hbWUgPT0gImFubm90YXRpb24teG1sIiBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPT0gU3RhcnRUYWdUb2tlbiBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuWyJuYW1lIl0gPT0gInN2ZyIpIG9yCiAgICAgICAgICAgICAgICAgICAgICAgIChzZWxmLmlzSFRNTEludGVncmF0aW9uUG9pbnQoY3VycmVudE5vZGUpIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSBpbiAoU3RhcnRUYWdUb2tlbiwgQ2hhcmFjdGVyc1Rva2VuLCBTcGFjZUNoYXJhY3RlcnNUb2tlbikpKToKICAgICAgICAgICAgICAgICAgICAgICAgcGhhc2UgPSBzZWxmLnBoYXNlCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgcGhhc2UgPSBzZWxmLnBoYXNlc1siaW5Gb3JlaWduQ29udGVudCJdCgogICAgICAgICAgICAgICAgICAgIGlmIHR5cGUgPT0gQ2hhcmFjdGVyc1Rva2VuOgogICAgICAgICAgICAgICAgICAgICAgICBuZXdfdG9rZW4gPSBwaGFzZS5wcm9jZXNzQ2hhcmFjdGVycyhuZXdfdG9rZW4pCiAgICAgICAgICAgICAgICAgICAgZWxpZiB0eXBlID09IFNwYWNlQ2hhcmFjdGVyc1Rva2VuOgogICAgICAgICAgICAgICAgICAgICAgICBuZXdfdG9rZW4gPSBwaGFzZS5wcm9jZXNzU3BhY2VDaGFyYWN0ZXJzKG5ld190b2tlbikKICAgICAgICAgICAgICAgICAgICBlbGlmIHR5cGUgPT0gU3RhcnRUYWdUb2tlbjoKICAgICAgICAgICAgICAgICAgICAgICAgbmV3X3Rva2VuID0gcGhhc2UucHJvY2Vzc1N0YXJ0VGFnKG5ld190b2tlbikKICAgICAgICAgICAgICAgICAgICBlbGlmIHR5cGUgPT0gRW5kVGFnVG9rZW46CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld190b2tlbiA9IHBoYXNlLnByb2Nlc3NFbmRUYWcobmV3X3Rva2VuKQogICAgICAgICAgICAgICAgICAgIGVsaWYgdHlwZSA9PSBDb21tZW50VG9rZW46CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld190b2tlbiA9IHBoYXNlLnByb2Nlc3NDb21tZW50KG5ld190b2tlbikKICAgICAgICAgICAgICAgICAgICBlbGlmIHR5cGUgPT0gRG9jdHlwZVRva2VuOgogICAgICAgICAgICAgICAgICAgICAgICBuZXdfdG9rZW4gPSBwaGFzZS5wcm9jZXNzRG9jdHlwZShuZXdfdG9rZW4pCgogICAgICAgICAgICBpZiAodHlwZSA9PSBTdGFydFRhZ1Rva2VuIGFuZCBwcmV2X3Rva2VuWyJzZWxmQ2xvc2luZyJdIGFuZAogICAgICAgICAgICAgICAgICAgIG5vdCBwcmV2X3Rva2VuWyJzZWxmQ2xvc2luZ0Fja25vd2xlZGdlZCJdKToKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VFcnJvcigibm9uLXZvaWQtZWxlbWVudC13aXRoLXRyYWlsaW5nLXNvbGlkdXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IHByZXZfdG9rZW5bIm5hbWUiXX0pCgogICAgICAgICMgV2hlbiB0aGUgbG9vcCBmaW5pc2hlcyBpdCdzIEVPRgogICAgICAgIHJlcHJvY2VzcyA9IFRydWUKICAgICAgICBwaGFzZXMgPSBbXQogICAgICAgIHdoaWxlIHJlcHJvY2VzczoKICAgICAgICAgICAgcGhhc2VzLmFwcGVuZChzZWxmLnBoYXNlKQogICAgICAgICAgICByZXByb2Nlc3MgPSBzZWxmLnBoYXNlLnByb2Nlc3NFT0YoKQogICAgICAgICAgICBpZiByZXByb2Nlc3M6CiAgICAgICAgICAgICAgICBhc3NlcnQgc2VsZi5waGFzZSBub3QgaW4gcGhhc2VzCgogICAgZGVmIG5vcm1hbGl6ZWRUb2tlbnMoc2VsZik6CiAgICAgICAgZm9yIHRva2VuIGluIHNlbGYudG9rZW5pemVyOgogICAgICAgICAgICB5aWVsZCBzZWxmLm5vcm1hbGl6ZVRva2VuKHRva2VuKQoKICAgIGRlZiBwYXJzZShzZWxmLCBzdHJlYW0sICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgIiIiUGFyc2UgYSBIVE1MIGRvY3VtZW50IGludG8gYSB3ZWxsLWZvcm1lZCB0cmVlCgogICAgICAgIHN0cmVhbSAtIGEgZmlsZWxpa2Ugb2JqZWN0IG9yIHN0cmluZyBjb250YWluaW5nIHRoZSBIVE1MIHRvIGJlIHBhcnNlZAoKICAgICAgICBUaGUgb3B0aW9uYWwgZW5jb2RpbmcgcGFyYW1ldGVyIG11c3QgYmUgYSBzdHJpbmcgdGhhdCBpbmRpY2F0ZXMKICAgICAgICB0aGUgZW5jb2RpbmcuICBJZiBzcGVjaWZpZWQsIHRoYXQgZW5jb2Rpbmcgd2lsbCBiZSB1c2VkLAogICAgICAgIHJlZ2FyZGxlc3Mgb2YgYW55IEJPTSBvciBsYXRlciBkZWNsYXJhdGlvbiAoc3VjaCBhcyBpbiBhIG1ldGEKICAgICAgICBlbGVtZW50KQoKICAgICAgICBzY3JpcHRpbmcgLSB0cmVhdCBub3NjcmlwdCBlbGVtZW50cyBhcyBpZiBqYXZhc2NyaXB0IHdhcyB0dXJuZWQgb24KICAgICAgICAiIiIKICAgICAgICBzZWxmLl9wYXJzZShzdHJlYW0sIEZhbHNlLCBOb25lLCAqYXJncywgKiprd2FyZ3MpCiAgICAgICAgcmV0dXJuIHNlbGYudHJlZS5nZXREb2N1bWVudCgpCgogICAgZGVmIHBhcnNlRnJhZ21lbnQoc2VsZiwgc3RyZWFtLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgICIiIlBhcnNlIGEgSFRNTCBmcmFnbWVudCBpbnRvIGEgd2VsbC1mb3JtZWQgdHJlZSBmcmFnbWVudAoKICAgICAgICBjb250YWluZXIgLSBuYW1lIG9mIHRoZSBlbGVtZW50IHdlJ3JlIHNldHRpbmcgdGhlIGlubmVySFRNTCBwcm9wZXJ0eQogICAgICAgIGlmIHNldCB0byBOb25lLCBkZWZhdWx0IHRvICdkaXYnCgogICAgICAgIHN0cmVhbSAtIGEgZmlsZWxpa2Ugb2JqZWN0IG9yIHN0cmluZyBjb250YWluaW5nIHRoZSBIVE1MIHRvIGJlIHBhcnNlZAoKICAgICAgICBUaGUgb3B0aW9uYWwgZW5jb2RpbmcgcGFyYW1ldGVyIG11c3QgYmUgYSBzdHJpbmcgdGhhdCBpbmRpY2F0ZXMKICAgICAgICB0aGUgZW5jb2RpbmcuICBJZiBzcGVjaWZpZWQsIHRoYXQgZW5jb2Rpbmcgd2lsbCBiZSB1c2VkLAogICAgICAgIHJlZ2FyZGxlc3Mgb2YgYW55IEJPTSBvciBsYXRlciBkZWNsYXJhdGlvbiAoc3VjaCBhcyBpbiBhIG1ldGEKICAgICAgICBlbGVtZW50KQoKICAgICAgICBzY3JpcHRpbmcgLSB0cmVhdCBub3NjcmlwdCBlbGVtZW50cyBhcyBpZiBqYXZhc2NyaXB0IHdhcyB0dXJuZWQgb24KICAgICAgICAiIiIKICAgICAgICBzZWxmLl9wYXJzZShzdHJlYW0sIFRydWUsICphcmdzLCAqKmt3YXJncykKICAgICAgICByZXR1cm4gc2VsZi50cmVlLmdldEZyYWdtZW50KCkKCiAgICBkZWYgcGFyc2VFcnJvcihzZWxmLCBlcnJvcmNvZGU9IlhYWC11bmRlZmluZWQtZXJyb3IiLCBkYXRhdmFycz1Ob25lKToKICAgICAgICAjIFhYWCBUaGUgaWRlYSBpcyB0byBtYWtlIGVycm9yY29kZSBtYW5kYXRvcnkuCiAgICAgICAgaWYgZGF0YXZhcnMgaXMgTm9uZToKICAgICAgICAgICAgZGF0YXZhcnMgPSB7fQogICAgICAgIHNlbGYuZXJyb3JzLmFwcGVuZCgoc2VsZi50b2tlbml6ZXIuc3RyZWFtLnBvc2l0aW9uKCksIGVycm9yY29kZSwgZGF0YXZhcnMpKQogICAgICAgIGlmIHNlbGYuc3RyaWN0OgogICAgICAgICAgICByYWlzZSBQYXJzZUVycm9yKEVbZXJyb3Jjb2RlXSAlIGRhdGF2YXJzKQoKICAgIGRlZiBub3JtYWxpemVUb2tlbihzZWxmLCB0b2tlbik6CiAgICAgICAgIiIiIEhUTUw1IHNwZWNpZmljIG5vcm1hbGl6YXRpb25zIHRvIHRoZSB0b2tlbiBzdHJlYW0gIiIiCgogICAgICAgIGlmIHRva2VuWyJ0eXBlIl0gPT0gdG9rZW5UeXBlc1siU3RhcnRUYWciXToKICAgICAgICAgICAgcmF3ID0gdG9rZW5bImRhdGEiXQogICAgICAgICAgICB0b2tlblsiZGF0YSJdID0gT3JkZXJlZERpY3QocmF3KQogICAgICAgICAgICBpZiBsZW4ocmF3KSA+IGxlbih0b2tlblsiZGF0YSJdKToKICAgICAgICAgICAgICAgICMgd2UgaGFkIHNvbWUgZHVwbGljYXRlZCBhdHRyaWJ1dGUsIGZpeCBzbyBmaXJzdCB3aW5zCiAgICAgICAgICAgICAgICB0b2tlblsiZGF0YSJdLnVwZGF0ZShyYXdbOjotMV0pCgogICAgICAgIHJldHVybiB0b2tlbgoKICAgIGRlZiBhZGp1c3RNYXRoTUxBdHRyaWJ1dGVzKHNlbGYsIHRva2VuKToKICAgICAgICBhZGp1c3RfYXR0cmlidXRlcyh0b2tlbiwgYWRqdXN0TWF0aE1MQXR0cmlidXRlcykKCiAgICBkZWYgYWRqdXN0U1ZHQXR0cmlidXRlcyhzZWxmLCB0b2tlbik6CiAgICAgICAgYWRqdXN0X2F0dHJpYnV0ZXModG9rZW4sIGFkanVzdFNWR0F0dHJpYnV0ZXMpCgogICAgZGVmIGFkanVzdEZvcmVpZ25BdHRyaWJ1dGVzKHNlbGYsIHRva2VuKToKICAgICAgICBhZGp1c3RfYXR0cmlidXRlcyh0b2tlbiwgYWRqdXN0Rm9yZWlnbkF0dHJpYnV0ZXNNYXApCgogICAgZGVmIHJlcGFyc2VUb2tlbk5vcm1hbChzZWxmLCB0b2tlbik6CiAgICAgICAgIyBweWxpbnQ6ZGlzYWJsZT11bnVzZWQtYXJndW1lbnQKICAgICAgICBzZWxmLnBhcnNlci5waGFzZSgpCgogICAgZGVmIHJlc2V0SW5zZXJ0aW9uTW9kZShzZWxmKToKICAgICAgICAjIFRoZSBuYW1lIG9mIHRoaXMgbWV0aG9kIGlzIG1vc3RseSBoaXN0b3JpY2FsLiAoSXQncyBhbHNvIHVzZWQgaW4gdGhlCiAgICAgICAgIyBzcGVjaWZpY2F0aW9uLikKICAgICAgICBsYXN0ID0gRmFsc2UKICAgICAgICBuZXdNb2RlcyA9IHsKICAgICAgICAgICAgInNlbGVjdCI6ICJpblNlbGVjdCIsCiAgICAgICAgICAgICJ0ZCI6ICJpbkNlbGwiLAogICAgICAgICAgICAidGgiOiAiaW5DZWxsIiwKICAgICAgICAgICAgInRyIjogImluUm93IiwKICAgICAgICAgICAgInRib2R5IjogImluVGFibGVCb2R5IiwKICAgICAgICAgICAgInRoZWFkIjogImluVGFibGVCb2R5IiwKICAgICAgICAgICAgInRmb290IjogImluVGFibGVCb2R5IiwKICAgICAgICAgICAgImNhcHRpb24iOiAiaW5DYXB0aW9uIiwKICAgICAgICAgICAgImNvbGdyb3VwIjogImluQ29sdW1uR3JvdXAiLAogICAgICAgICAgICAidGFibGUiOiAiaW5UYWJsZSIsCiAgICAgICAgICAgICJoZWFkIjogImluQm9keSIsCiAgICAgICAgICAgICJib2R5IjogImluQm9keSIsCiAgICAgICAgICAgICJmcmFtZXNldCI6ICJpbkZyYW1lc2V0IiwKICAgICAgICAgICAgImh0bWwiOiAiYmVmb3JlSGVhZCIKICAgICAgICB9CiAgICAgICAgZm9yIG5vZGUgaW4gc2VsZi50cmVlLm9wZW5FbGVtZW50c1s6Oi0xXToKICAgICAgICAgICAgbm9kZU5hbWUgPSBub2RlLm5hbWUKICAgICAgICAgICAgbmV3X3BoYXNlID0gTm9uZQogICAgICAgICAgICBpZiBub2RlID09IHNlbGYudHJlZS5vcGVuRWxlbWVudHNbMF06CiAgICAgICAgICAgICAgICBhc3NlcnQgc2VsZi5pbm5lckhUTUwKICAgICAgICAgICAgICAgIGxhc3QgPSBUcnVlCiAgICAgICAgICAgICAgICBub2RlTmFtZSA9IHNlbGYuaW5uZXJIVE1MCiAgICAgICAgICAgICMgQ2hlY2sgZm9yIGNvbmRpdGlvbnMgdGhhdCBzaG91bGQgb25seSBoYXBwZW4gaW4gdGhlIGlubmVySFRNTAogICAgICAgICAgICAjIGNhc2UKICAgICAgICAgICAgaWYgbm9kZU5hbWUgaW4gKCJzZWxlY3QiLCAiY29sZ3JvdXAiLCAiaGVhZCIsICJodG1sIik6CiAgICAgICAgICAgICAgICBhc3NlcnQgc2VsZi5pbm5lckhUTUwKCiAgICAgICAgICAgIGlmIG5vdCBsYXN0IGFuZCBub2RlLm5hbWVzcGFjZSAhPSBzZWxmLnRyZWUuZGVmYXVsdE5hbWVzcGFjZToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICBpZiBub2RlTmFtZSBpbiBuZXdNb2RlczoKICAgICAgICAgICAgICAgIG5ld19waGFzZSA9IHNlbGYucGhhc2VzW25ld01vZGVzW25vZGVOYW1lXV0KICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGVsaWYgbGFzdDoKICAgICAgICAgICAgICAgIG5ld19waGFzZSA9IHNlbGYucGhhc2VzWyJpbkJvZHkiXQogICAgICAgICAgICAgICAgYnJlYWsKCiAgICAgICAgc2VsZi5waGFzZSA9IG5ld19waGFzZQoKICAgIGRlZiBwYXJzZVJDRGF0YVJhd3RleHQoc2VsZiwgdG9rZW4sIGNvbnRlbnRUeXBlKToKICAgICAgICAiIiJHZW5lcmljIFJDREFUQS9SQVdURVhUIFBhcnNpbmcgYWxnb3JpdGhtCiAgICAgICAgY29udGVudFR5cGUgLSBSQ0RBVEEgb3IgUkFXVEVYVAogICAgICAgICIiIgogICAgICAgIGFzc2VydCBjb250ZW50VHlwZSBpbiAoIlJBV1RFWFQiLCAiUkNEQVRBIikKCiAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCgogICAgICAgIGlmIGNvbnRlbnRUeXBlID09ICJSQVdURVhUIjoKICAgICAgICAgICAgc2VsZi50b2tlbml6ZXIuc3RhdGUgPSBzZWxmLnRva2VuaXplci5yYXd0ZXh0U3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnRva2VuaXplci5zdGF0ZSA9IHNlbGYudG9rZW5pemVyLnJjZGF0YVN0YXRlCgogICAgICAgIHNlbGYub3JpZ2luYWxQaGFzZSA9IHNlbGYucGhhc2UKCiAgICAgICAgc2VsZi5waGFzZSA9IHNlbGYucGhhc2VzWyJ0ZXh0Il0KCgpAX3V0aWxzLm1lbW9pemUKZGVmIGdldFBoYXNlcyhkZWJ1Zyk6CiAgICBkZWYgbG9nKGZ1bmN0aW9uKToKICAgICAgICAiIiJMb2dnZXIgdGhhdCByZWNvcmRzIHdoaWNoIHBoYXNlIHByb2Nlc3NlcyBlYWNoIHRva2VuIiIiCiAgICAgICAgdHlwZV9uYW1lcyA9IGRpY3QoKHZhbHVlLCBrZXkpIGZvciBrZXksIHZhbHVlIGluCiAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5UeXBlcy5pdGVtcygpKQoKICAgICAgICBkZWYgd3JhcHBlZChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgICAgICBpZiBmdW5jdGlvbi5fX25hbWVfXy5zdGFydHN3aXRoKCJwcm9jZXNzIikgYW5kIGxlbihhcmdzKSA+IDA6CiAgICAgICAgICAgICAgICB0b2tlbiA9IGFyZ3NbMF0KICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBpbmZvID0geyJ0eXBlIjogdHlwZV9uYW1lc1t0b2tlblsndHlwZSddXX0KICAgICAgICAgICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICAgICAgICAgaWYgdG9rZW5bJ3R5cGUnXSBpbiB0YWdUb2tlblR5cGVzOgogICAgICAgICAgICAgICAgICAgIGluZm9bIm5hbWUiXSA9IHRva2VuWyduYW1lJ10KCiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5sb2cuYXBwZW5kKChzZWxmLnBhcnNlci50b2tlbml6ZXIuc3RhdGUuX19uYW1lX18sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZS5fX2NsYXNzX18uX19uYW1lX18sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLl9fbmFtZV9fLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbykpCiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHNlbGYsICphcmdzLCAqKmt3YXJncykKICAgICAgICByZXR1cm4gd3JhcHBlZAoKICAgIGRlZiBnZXRNZXRhY2xhc3ModXNlX21ldGFjbGFzcywgbWV0YWNsYXNzX2Z1bmMpOgogICAgICAgIGlmIHVzZV9tZXRhY2xhc3M6CiAgICAgICAgICAgIHJldHVybiBtZXRob2RfZGVjb3JhdG9yX21ldGFjbGFzcyhtZXRhY2xhc3NfZnVuYykKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gdHlwZQoKICAgICMgcHlsaW50OmRpc2FibGU9dW51c2VkLWFyZ3VtZW50CiAgICBjbGFzcyBQaGFzZSh3aXRoX21ldGFjbGFzcyhnZXRNZXRhY2xhc3MoZGVidWcsIGxvZykpKToKICAgICAgICAiIiJCYXNlIGNsYXNzIGZvciBoZWxwZXIgb2JqZWN0IHRoYXQgaW1wbGVtZW50cyBlYWNoIHBoYXNlIG9mIHByb2Nlc3NpbmcKICAgICAgICAiIiIKCiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSk6CiAgICAgICAgICAgIHNlbGYucGFyc2VyID0gcGFyc2VyCiAgICAgICAgICAgIHNlbGYudHJlZSA9IHRyZWUKCiAgICAgICAgZGVmIHByb2Nlc3NFT0Yoc2VsZik6CiAgICAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKCiAgICAgICAgZGVmIHByb2Nlc3NDb21tZW50KHNlbGYsIHRva2VuKToKICAgICAgICAgICAgIyBGb3IgbW9zdCBwaGFzZXMgdGhlIGZvbGxvd2luZyBpcyBjb3JyZWN0LiBXaGVyZSBpdCdzIG5vdCBpdCB3aWxsIGJlCiAgICAgICAgICAgICMgb3ZlcnJpZGRlbi4KICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydENvbW1lbnQodG9rZW4sIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdKQoKICAgICAgICBkZWYgcHJvY2Vzc0RvY3R5cGUoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLWRvY3R5cGUiKQoKICAgICAgICBkZWYgcHJvY2Vzc0NoYXJhY3RlcnMoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0VGV4dCh0b2tlblsiZGF0YSJdKQoKICAgICAgICBkZWYgcHJvY2Vzc1NwYWNlQ2hhcmFjdGVycyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRUZXh0KHRva2VuWyJkYXRhIl0pCgogICAgICAgIGRlZiBwcm9jZXNzU3RhcnRUYWcoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICByZXR1cm4gc2VsZi5zdGFydFRhZ0hhbmRsZXJbdG9rZW5bIm5hbWUiXV0odG9rZW4pCgogICAgICAgIGRlZiBzdGFydFRhZ0h0bWwoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZiBub3Qgc2VsZi5wYXJzZXIuZmlyc3RTdGFydFRhZyBhbmQgdG9rZW5bIm5hbWUiXSA9PSAiaHRtbCI6CiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJub24taHRtbC1yb290IikKICAgICAgICAgICAgIyBYWFggTmVlZCBhIGNoZWNrIGhlcmUgdG8gc2VlIGlmIHRoZSBmaXJzdCBzdGFydCB0YWcgdG9rZW4gZW1pdHRlZCBpcwogICAgICAgICAgICAjIHRoaXMgdG9rZW4uLi4gSWYgaXQncyBub3QsIGludm9rZSBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCkuCiAgICAgICAgICAgIGZvciBhdHRyLCB2YWx1ZSBpbiB0b2tlblsiZGF0YSJdLml0ZW1zKCk6CiAgICAgICAgICAgICAgICBpZiBhdHRyIG5vdCBpbiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWzBdLmF0dHJpYnV0ZXM6CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50c1swXS5hdHRyaWJ1dGVzW2F0dHJdID0gdmFsdWUKICAgICAgICAgICAgc2VsZi5wYXJzZXIuZmlyc3RTdGFydFRhZyA9IEZhbHNlCgogICAgICAgIGRlZiBwcm9jZXNzRW5kVGFnKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuZW5kVGFnSGFuZGxlclt0b2tlblsibmFtZSJdXSh0b2tlbikKCiAgICBjbGFzcyBJbml0aWFsUGhhc2UoUGhhc2UpOgogICAgICAgIGRlZiBwcm9jZXNzU3BhY2VDaGFyYWN0ZXJzKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgcGFzcwoKICAgICAgICBkZWYgcHJvY2Vzc0NvbW1lbnQoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0Q29tbWVudCh0b2tlbiwgc2VsZi50cmVlLmRvY3VtZW50KQoKICAgICAgICBkZWYgcHJvY2Vzc0RvY3R5cGUoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBuYW1lID0gdG9rZW5bIm5hbWUiXQogICAgICAgICAgICBwdWJsaWNJZCA9IHRva2VuWyJwdWJsaWNJZCJdCiAgICAgICAgICAgIHN5c3RlbUlkID0gdG9rZW5bInN5c3RlbUlkIl0KICAgICAgICAgICAgY29ycmVjdCA9IHRva2VuWyJjb3JyZWN0Il0KCiAgICAgICAgICAgIGlmIChuYW1lICE9ICJodG1sIiBvciBwdWJsaWNJZCBpcyBub3QgTm9uZSBvcgogICAgICAgICAgICAgICAgICAgIHN5c3RlbUlkIGlzIG5vdCBOb25lIGFuZCBzeXN0ZW1JZCAhPSAiYWJvdXQ6bGVnYWN5LWNvbXBhdCIpOgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5rbm93bi1kb2N0eXBlIikKCiAgICAgICAgICAgIGlmIHB1YmxpY0lkIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBwdWJsaWNJZCA9ICIiCgogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RG9jdHlwZSh0b2tlbikKCiAgICAgICAgICAgIGlmIHB1YmxpY0lkICE9ICIiOgogICAgICAgICAgICAgICAgcHVibGljSWQgPSBwdWJsaWNJZC50cmFuc2xhdGUoYXNjaWlVcHBlcjJMb3dlcikKCiAgICAgICAgICAgIGlmIChub3QgY29ycmVjdCBvciB0b2tlblsibmFtZSJdICE9ICJodG1sIiBvcgogICAgICAgICAgICAgICAgICAgIHB1YmxpY0lkLnN0YXJ0c3dpdGgoCiAgICAgICAgICAgICAgICAgICAgICAgICgiKy8vc2lsbWFyaWwvL2R0ZCBodG1sIHBybyB2MHIxMSAxOTk3MDEwMS8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy9hZHZhc29mdCBsdGQvL2R0ZCBodG1sIDMuMCBhc3dlZGl0ICsgZXh0ZW5zaW9ucy8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy9hcy8vZHRkIGh0bWwgMy4wIGFzd2VkaXQgKyBleHRlbnNpb25zLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL2lldGYvL2R0ZCBodG1sIDIuMCBsZXZlbCAxLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL2lldGYvL2R0ZCBodG1sIDIuMCBsZXZlbCAyLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL2lldGYvL2R0ZCBodG1sIDIuMCBzdHJpY3QgbGV2ZWwgMS8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy9pZXRmLy9kdGQgaHRtbCAyLjAgc3RyaWN0IGxldmVsIDIvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vaWV0Zi8vZHRkIGh0bWwgMi4wIHN0cmljdC8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy9pZXRmLy9kdGQgaHRtbCAyLjAvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vaWV0Zi8vZHRkIGh0bWwgMi4xZS8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy9pZXRmLy9kdGQgaHRtbCAzLjAvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vaWV0Zi8vZHRkIGh0bWwgMy4yIGZpbmFsLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL2lldGYvL2R0ZCBodG1sIDMuMi8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy9pZXRmLy9kdGQgaHRtbCAzLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL2lldGYvL2R0ZCBodG1sIGxldmVsIDAvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vaWV0Zi8vZHRkIGh0bWwgbGV2ZWwgMS8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy9pZXRmLy9kdGQgaHRtbCBsZXZlbCAyLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL2lldGYvL2R0ZCBodG1sIGxldmVsIDMvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vaWV0Zi8vZHRkIGh0bWwgc3RyaWN0IGxldmVsIDAvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vaWV0Zi8vZHRkIGh0bWwgc3RyaWN0IGxldmVsIDEvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vaWV0Zi8vZHRkIGh0bWwgc3RyaWN0IGxldmVsIDIvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vaWV0Zi8vZHRkIGh0bWwgc3RyaWN0IGxldmVsIDMvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vaWV0Zi8vZHRkIGh0bWwgc3RyaWN0Ly8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL2lldGYvL2R0ZCBodG1sLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL21ldHJpdXMvL2R0ZCBtZXRyaXVzIHByZXNlbnRhdGlvbmFsLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL21pY3Jvc29mdC8vZHRkIGludGVybmV0IGV4cGxvcmVyIDIuMCBodG1sIHN0cmljdC8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy9taWNyb3NvZnQvL2R0ZCBpbnRlcm5ldCBleHBsb3JlciAyLjAgaHRtbC8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy9taWNyb3NvZnQvL2R0ZCBpbnRlcm5ldCBleHBsb3JlciAyLjAgdGFibGVzLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL21pY3Jvc29mdC8vZHRkIGludGVybmV0IGV4cGxvcmVyIDMuMCBodG1sIHN0cmljdC8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy9taWNyb3NvZnQvL2R0ZCBpbnRlcm5ldCBleHBsb3JlciAzLjAgaHRtbC8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy9taWNyb3NvZnQvL2R0ZCBpbnRlcm5ldCBleHBsb3JlciAzLjAgdGFibGVzLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL25ldHNjYXBlIGNvbW0uIGNvcnAuLy9kdGQgaHRtbC8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy9uZXRzY2FwZSBjb21tLiBjb3JwLi8vZHRkIHN0cmljdCBodG1sLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL28ncmVpbGx5IGFuZCBhc3NvY2lhdGVzLy9kdGQgaHRtbCAyLjAvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vbydyZWlsbHkgYW5kIGFzc29jaWF0ZXMvL2R0ZCBodG1sIGV4dGVuZGVkIDEuMC8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy9vJ3JlaWxseSBhbmQgYXNzb2NpYXRlcy8vZHRkIGh0bWwgZXh0ZW5kZWQgcmVsYXhlZCAxLjAvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vc29mdHF1YWQgc29mdHdhcmUvL2R0ZCBob3RtZXRhbCBwcm8gNi4wOjoxOTk5MDYwMTo6ZXh0ZW5zaW9ucyB0byBodG1sIDQuMC8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy9zb2Z0cXVhZC8vZHRkIGhvdG1ldGFsIHBybyA0LjA6OjE5OTcxMDEwOjpleHRlbnNpb25zIHRvIGh0bWwgNC4wLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL3NweWdsYXNzLy9kdGQgaHRtbCAyLjAgZXh0ZW5kZWQvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vc3EvL2R0ZCBodG1sIDIuMCBob3RtZXRhbCArIGV4dGVuc2lvbnMvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vc3VuIG1pY3Jvc3lzdGVtcyBjb3JwLi8vZHRkIGhvdGphdmEgaHRtbC8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy9zdW4gbWljcm9zeXN0ZW1zIGNvcnAuLy9kdGQgaG90amF2YSBzdHJpY3QgaHRtbC8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy93M2MvL2R0ZCBodG1sIDMgMTk5NS0wMy0yNC8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy93M2MvL2R0ZCBodG1sIDMuMiBkcmFmdC8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy93M2MvL2R0ZCBodG1sIDMuMiBmaW5hbC8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy93M2MvL2R0ZCBodG1sIDMuMi8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy93M2MvL2R0ZCBodG1sIDMuMnMgZHJhZnQvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgZnJhbWVzZXQvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL3czYy8vZHRkIGh0bWwgZXhwZXJpbWVudGFsIDE5OTYwNzEyLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL3czYy8vZHRkIGh0bWwgZXhwZXJpbWVudGFsIDk3MDQyMS8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy93M2MvL2R0ZCB3MyBodG1sLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL3czby8vZHRkIHczIGh0bWwgMy4wLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL3dlYnRlY2hzLy9kdGQgbW96aWxsYSBodG1sIDIuMC8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy93ZWJ0ZWNocy8vZHRkIG1vemlsbGEgaHRtbC8vIikpIG9yCiAgICAgICAgICAgICAgICAgICAgcHVibGljSWQgaW4gKCItLy93M28vL2R0ZCB3MyBodG1sIHN0cmljdCAzLjAvL2VuLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLS93M2MvZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC9lbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodG1sIikgb3IKICAgICAgICAgICAgICAgICAgICBwdWJsaWNJZC5zdGFydHN3aXRoKAogICAgICAgICAgICAgICAgICAgICAgICAoIi0vL3czYy8vZHRkIGh0bWwgNC4wMSBmcmFtZXNldC8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy93M2MvL2R0ZCBodG1sIDQuMDEgdHJhbnNpdGlvbmFsLy8iKSkgYW5kCiAgICAgICAgICAgICAgICAgICAgc3lzdGVtSWQgaXMgTm9uZSBvcgogICAgICAgICAgICAgICAgICAgIHN5c3RlbUlkIGFuZCBzeXN0ZW1JZC5sb3dlcigpID09ICJodHRwOi8vd3d3LmlibS5jb20vZGF0YS9kdGQvdjExL2libXhodG1sMS10cmFuc2l0aW9uYWwuZHRkIik6CiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5jb21wYXRNb2RlID0gInF1aXJrcyIKICAgICAgICAgICAgZWxpZiAocHVibGljSWQuc3RhcnRzd2l0aCgKICAgICAgICAgICAgICAgICAgICAoIi0vL3czYy8vZHRkIHhodG1sIDEuMCBmcmFtZXNldC8vIiwKICAgICAgICAgICAgICAgICAgICAgIi0vL3czYy8vZHRkIHhodG1sIDEuMCB0cmFuc2l0aW9uYWwvLyIpKSBvcgogICAgICAgICAgICAgICAgICBwdWJsaWNJZC5zdGFydHN3aXRoKAogICAgICAgICAgICAgICAgICAgICAgKCItLy93M2MvL2R0ZCBodG1sIDQuMDEgZnJhbWVzZXQvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgIi0vL3czYy8vZHRkIGh0bWwgNC4wMSB0cmFuc2l0aW9uYWwvLyIpKSBhbmQKICAgICAgICAgICAgICAgICAgc3lzdGVtSWQgaXMgbm90IE5vbmUpOgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIuY29tcGF0TW9kZSA9ICJsaW1pdGVkIHF1aXJrcyIKCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2VzWyJiZWZvcmVIdG1sIl0KCiAgICAgICAgZGVmIGFueXRoaW5nRWxzZShzZWxmKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIuY29tcGF0TW9kZSA9ICJxdWlya3MiCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2VzWyJiZWZvcmVIdG1sIl0KCiAgICAgICAgZGVmIHByb2Nlc3NDaGFyYWN0ZXJzKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigiZXhwZWN0ZWQtZG9jdHlwZS1idXQtZ290LWNoYXJzIikKICAgICAgICAgICAgc2VsZi5hbnl0aGluZ0Vsc2UoKQogICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICAgICAgZGVmIHByb2Nlc3NTdGFydFRhZyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoImV4cGVjdGVkLWRvY3R5cGUtYnV0LWdvdC1zdGFydC10YWciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQogICAgICAgICAgICBzZWxmLmFueXRoaW5nRWxzZSgpCiAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgICAgICBkZWYgcHJvY2Vzc0VuZFRhZyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoImV4cGVjdGVkLWRvY3R5cGUtYnV0LWdvdC1lbmQtdGFnIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKICAgICAgICAgICAgc2VsZi5hbnl0aGluZ0Vsc2UoKQogICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICAgICAgZGVmIHByb2Nlc3NFT0Yoc2VsZik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoImV4cGVjdGVkLWRvY3R5cGUtYnV0LWdvdC1lb2YiKQogICAgICAgICAgICBzZWxmLmFueXRoaW5nRWxzZSgpCiAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgY2xhc3MgQmVmb3JlSHRtbFBoYXNlKFBoYXNlKToKICAgICAgICAjIGhlbHBlciBtZXRob2RzCiAgICAgICAgZGVmIGluc2VydEh0bWxFbGVtZW50KHNlbGYpOgogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0Um9vdChpbXBsaWVkVGFnVG9rZW4oImh0bWwiLCAiU3RhcnRUYWciKSkKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UgPSBzZWxmLnBhcnNlci5waGFzZXNbImJlZm9yZUhlYWQiXQoKICAgICAgICAjIG90aGVyCiAgICAgICAgZGVmIHByb2Nlc3NFT0Yoc2VsZik6CiAgICAgICAgICAgIHNlbGYuaW5zZXJ0SHRtbEVsZW1lbnQoKQogICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICAgICBkZWYgcHJvY2Vzc0NvbW1lbnQoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0Q29tbWVudCh0b2tlbiwgc2VsZi50cmVlLmRvY3VtZW50KQoKICAgICAgICBkZWYgcHJvY2Vzc1NwYWNlQ2hhcmFjdGVycyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHBhc3MKCiAgICAgICAgZGVmIHByb2Nlc3NDaGFyYWN0ZXJzKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5pbnNlcnRIdG1sRWxlbWVudCgpCiAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgICAgICBkZWYgcHJvY2Vzc1N0YXJ0VGFnKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWYgdG9rZW5bIm5hbWUiXSA9PSAiaHRtbCI6CiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5maXJzdFN0YXJ0VGFnID0gVHJ1ZQogICAgICAgICAgICBzZWxmLmluc2VydEh0bWxFbGVtZW50KCkKICAgICAgICAgICAgcmV0dXJuIHRva2VuCgogICAgICAgIGRlZiBwcm9jZXNzRW5kVGFnKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWYgdG9rZW5bIm5hbWUiXSBub3QgaW4gKCJoZWFkIiwgImJvZHkiLCAiaHRtbCIsICJiciIpOgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1lbmQtdGFnLWJlZm9yZS1odG1sIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLmluc2VydEh0bWxFbGVtZW50KCkKICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgIGNsYXNzIEJlZm9yZUhlYWRQaGFzZShQaGFzZSk6CiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSk6CiAgICAgICAgICAgIFBoYXNlLl9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSkKCiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIYW5kbGVyID0gX3V0aWxzLk1ldGhvZERpc3BhdGNoZXIoWwogICAgICAgICAgICAgICAgKCJodG1sIiwgc2VsZi5zdGFydFRhZ0h0bWwpLAogICAgICAgICAgICAgICAgKCJoZWFkIiwgc2VsZi5zdGFydFRhZ0hlYWQpCiAgICAgICAgICAgIF0pCiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIYW5kbGVyLmRlZmF1bHQgPSBzZWxmLnN0YXJ0VGFnT3RoZXIKCiAgICAgICAgICAgIHNlbGYuZW5kVGFnSGFuZGxlciA9IF91dGlscy5NZXRob2REaXNwYXRjaGVyKFsKICAgICAgICAgICAgICAgICgoImhlYWQiLCAiYm9keSIsICJodG1sIiwgImJyIiksIHNlbGYuZW5kVGFnSW1wbHlIZWFkKQogICAgICAgICAgICBdKQogICAgICAgICAgICBzZWxmLmVuZFRhZ0hhbmRsZXIuZGVmYXVsdCA9IHNlbGYuZW5kVGFnT3RoZXIKCiAgICAgICAgZGVmIHByb2Nlc3NFT0Yoc2VsZik6CiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIZWFkKGltcGxpZWRUYWdUb2tlbigiaGVhZCIsICJTdGFydFRhZyIpKQogICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICAgICBkZWYgcHJvY2Vzc1NwYWNlQ2hhcmFjdGVycyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHBhc3MKCiAgICAgICAgZGVmIHByb2Nlc3NDaGFyYWN0ZXJzKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0hlYWQoaW1wbGllZFRhZ1Rva2VuKCJoZWFkIiwgIlN0YXJ0VGFnIikpCiAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgICAgICBkZWYgc3RhcnRUYWdIdG1sKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VyLnBoYXNlc1siaW5Cb2R5Il0ucHJvY2Vzc1N0YXJ0VGFnKHRva2VuKQoKICAgICAgICBkZWYgc3RhcnRUYWdIZWFkKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCiAgICAgICAgICAgIHNlbGYudHJlZS5oZWFkUG9pbnRlciA9IHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2VzWyJpbkhlYWQiXQoKICAgICAgICBkZWYgc3RhcnRUYWdPdGhlcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIZWFkKGltcGxpZWRUYWdUb2tlbigiaGVhZCIsICJTdGFydFRhZyIpKQogICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICAgICAgZGVmIGVuZFRhZ0ltcGx5SGVhZChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIZWFkKGltcGxpZWRUYWdUb2tlbigiaGVhZCIsICJTdGFydFRhZyIpKQogICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICAgICAgZGVmIGVuZFRhZ090aGVyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigiZW5kLXRhZy1hZnRlci1pbXBsaWVkLXJvb3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQoKICAgIGNsYXNzIEluSGVhZFBoYXNlKFBoYXNlKToKICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgcGFyc2VyLCB0cmVlKToKICAgICAgICAgICAgUGhhc2UuX19pbml0X18oc2VsZiwgcGFyc2VyLCB0cmVlKQoKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0hhbmRsZXIgPSBfdXRpbHMuTWV0aG9kRGlzcGF0Y2hlcihbCiAgICAgICAgICAgICAgICAoImh0bWwiLCBzZWxmLnN0YXJ0VGFnSHRtbCksCiAgICAgICAgICAgICAgICAoInRpdGxlIiwgc2VsZi5zdGFydFRhZ1RpdGxlKSwKICAgICAgICAgICAgICAgICgoIm5vZnJhbWVzIiwgInN0eWxlIiksIHNlbGYuc3RhcnRUYWdOb0ZyYW1lc1N0eWxlKSwKICAgICAgICAgICAgICAgICgibm9zY3JpcHQiLCBzZWxmLnN0YXJ0VGFnTm9zY3JpcHQpLAogICAgICAgICAgICAgICAgKCJzY3JpcHQiLCBzZWxmLnN0YXJ0VGFnU2NyaXB0KSwKICAgICAgICAgICAgICAgICgoImJhc2UiLCAiYmFzZWZvbnQiLCAiYmdzb3VuZCIsICJjb21tYW5kIiwgImxpbmsiKSwKICAgICAgICAgICAgICAgICBzZWxmLnN0YXJ0VGFnQmFzZUxpbmtDb21tYW5kKSwKICAgICAgICAgICAgICAgICgibWV0YSIsIHNlbGYuc3RhcnRUYWdNZXRhKSwKICAgICAgICAgICAgICAgICgiaGVhZCIsIHNlbGYuc3RhcnRUYWdIZWFkKQogICAgICAgICAgICBdKQogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnSGFuZGxlci5kZWZhdWx0ID0gc2VsZi5zdGFydFRhZ090aGVyCgogICAgICAgICAgICBzZWxmLmVuZFRhZ0hhbmRsZXIgPSBfdXRpbHMuTWV0aG9kRGlzcGF0Y2hlcihbCiAgICAgICAgICAgICAgICAoImhlYWQiLCBzZWxmLmVuZFRhZ0hlYWQpLAogICAgICAgICAgICAgICAgKCgiYnIiLCAiaHRtbCIsICJib2R5IiksIHNlbGYuZW5kVGFnSHRtbEJvZHlCcikKICAgICAgICAgICAgXSkKICAgICAgICAgICAgc2VsZi5lbmRUYWdIYW5kbGVyLmRlZmF1bHQgPSBzZWxmLmVuZFRhZ090aGVyCgogICAgICAgICMgdGhlIHJlYWwgdGhpbmcKICAgICAgICBkZWYgcHJvY2Vzc0VPRihzZWxmKToKICAgICAgICAgICAgc2VsZi5hbnl0aGluZ0Vsc2UoKQogICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICAgICBkZWYgcHJvY2Vzc0NoYXJhY3RlcnMoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLmFueXRoaW5nRWxzZSgpCiAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgICAgICBkZWYgc3RhcnRUYWdIdG1sKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VyLnBoYXNlc1siaW5Cb2R5Il0ucHJvY2Vzc1N0YXJ0VGFnKHRva2VuKQoKICAgICAgICBkZWYgc3RhcnRUYWdIZWFkKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidHdvLWhlYWRzLWFyZS1ub3QtYmV0dGVyLXRoYW4tb25lIikKCiAgICAgICAgZGVmIHN0YXJ0VGFnQmFzZUxpbmtDb21tYW5kKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCiAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgdG9rZW5bInNlbGZDbG9zaW5nQWNrbm93bGVkZ2VkIl0gPSBUcnVlCgogICAgICAgIGRlZiBzdGFydFRhZ01ldGEoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICB0b2tlblsic2VsZkNsb3NpbmdBY2tub3dsZWRnZWQiXSA9IFRydWUKCiAgICAgICAgICAgIGF0dHJpYnV0ZXMgPSB0b2tlblsiZGF0YSJdCiAgICAgICAgICAgIGlmIHNlbGYucGFyc2VyLnRva2VuaXplci5zdHJlYW0uY2hhckVuY29kaW5nWzFdID09ICJ0ZW50YXRpdmUiOgogICAgICAgICAgICAgICAgaWYgImNoYXJzZXQiIGluIGF0dHJpYnV0ZXM6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIudG9rZW5pemVyLnN0cmVhbS5jaGFuZ2VFbmNvZGluZyhhdHRyaWJ1dGVzWyJjaGFyc2V0Il0pCiAgICAgICAgICAgICAgICBlbGlmICgiY29udGVudCIgaW4gYXR0cmlidXRlcyBhbmQKICAgICAgICAgICAgICAgICAgICAgICJodHRwLWVxdWl2IiBpbiBhdHRyaWJ1dGVzIGFuZAogICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlc1siaHR0cC1lcXVpdiJdLmxvd2VyKCkgPT0gImNvbnRlbnQtdHlwZSIpOgogICAgICAgICAgICAgICAgICAgICMgRW5jb2RpbmcgaXQgYXMgVVRGLTggaGVyZSBpcyBhIGhhY2ssIGFzIHJlYWxseSB3ZSBzaG91bGQgcGFzcwogICAgICAgICAgICAgICAgICAgICMgdGhlIGFic3RyYWN0IFVuaWNvZGUgc3RyaW5nLCBhbmQganVzdCB1c2UgdGhlCiAgICAgICAgICAgICAgICAgICAgIyBDb250ZW50QXR0clBhcnNlciBvbiB0aGF0LCBidXQgdXNpbmcgVVRGLTggYWxsb3dzIGFsbCBjaGFycwogICAgICAgICAgICAgICAgICAgICMgdG8gYmUgZW5jb2RlZCBhbmQgYXMgYSBBU0NJSS1zdXBlcnNldCB3b3Jrcy4KICAgICAgICAgICAgICAgICAgICBkYXRhID0gX2lucHV0c3RyZWFtLkVuY29kaW5nQnl0ZXMoYXR0cmlidXRlc1siY29udGVudCJdLmVuY29kZSgidXRmLTgiKSkKICAgICAgICAgICAgICAgICAgICBwYXJzZXIgPSBfaW5wdXRzdHJlYW0uQ29udGVudEF0dHJQYXJzZXIoZGF0YSkKICAgICAgICAgICAgICAgICAgICBjb2RlYyA9IHBhcnNlci5wYXJzZSgpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIudG9rZW5pemVyLnN0cmVhbS5jaGFuZ2VFbmNvZGluZyhjb2RlYykKCiAgICAgICAgZGVmIHN0YXJ0VGFnVGl0bGUoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZVJDRGF0YVJhd3RleHQodG9rZW4sICJSQ0RBVEEiKQoKICAgICAgICBkZWYgc3RhcnRUYWdOb0ZyYW1lc1N0eWxlKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgIyBOZWVkIHRvIGRlY2lkZSB3aGV0aGVyIHRvIGltcGxlbWVudCB0aGUgc2NyaXB0aW5nLWRpc2FibGVkIGNhc2UKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VSQ0RhdGFSYXd0ZXh0KHRva2VuLCAiUkFXVEVYVCIpCgogICAgICAgIGRlZiBzdGFydFRhZ05vc2NyaXB0KHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWYgc2VsZi5wYXJzZXIuc2NyaXB0aW5nOgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VSQ0RhdGFSYXd0ZXh0KHRva2VuLCAiUkFXVEVYVCIpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2VzWyJpbkhlYWROb3NjcmlwdCJdCgogICAgICAgIGRlZiBzdGFydFRhZ1NjcmlwdChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRFbGVtZW50KHRva2VuKQogICAgICAgICAgICBzZWxmLnBhcnNlci50b2tlbml6ZXIuc3RhdGUgPSBzZWxmLnBhcnNlci50b2tlbml6ZXIuc2NyaXB0RGF0YVN0YXRlCiAgICAgICAgICAgIHNlbGYucGFyc2VyLm9yaWdpbmFsUGhhc2UgPSBzZWxmLnBhcnNlci5waGFzZQogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYucGFyc2VyLnBoYXNlc1sidGV4dCJdCgogICAgICAgIGRlZiBzdGFydFRhZ090aGVyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5hbnl0aGluZ0Vsc2UoKQogICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICAgICAgZGVmIGVuZFRhZ0hlYWQoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBub2RlID0gc2VsZi5wYXJzZXIudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgYXNzZXJ0IG5vZGUubmFtZSA9PSAiaGVhZCIsICJFeHBlY3RlZCBoZWFkIGdvdCAlcyIgJSBub2RlLm5hbWUKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UgPSBzZWxmLnBhcnNlci5waGFzZXNbImFmdGVySGVhZCJdCgogICAgICAgIGRlZiBlbmRUYWdIdG1sQm9keUJyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5hbnl0aGluZ0Vsc2UoKQogICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICAgICAgZGVmIGVuZFRhZ090aGVyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1lbmQtdGFnIiwgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCgogICAgICAgIGRlZiBhbnl0aGluZ0Vsc2Uoc2VsZik6CiAgICAgICAgICAgIHNlbGYuZW5kVGFnSGVhZChpbXBsaWVkVGFnVG9rZW4oImhlYWQiKSkKCiAgICBjbGFzcyBJbkhlYWROb3NjcmlwdFBoYXNlKFBoYXNlKToKICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgcGFyc2VyLCB0cmVlKToKICAgICAgICAgICAgUGhhc2UuX19pbml0X18oc2VsZiwgcGFyc2VyLCB0cmVlKQoKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0hhbmRsZXIgPSBfdXRpbHMuTWV0aG9kRGlzcGF0Y2hlcihbCiAgICAgICAgICAgICAgICAoImh0bWwiLCBzZWxmLnN0YXJ0VGFnSHRtbCksCiAgICAgICAgICAgICAgICAoKCJiYXNlZm9udCIsICJiZ3NvdW5kIiwgImxpbmsiLCAibWV0YSIsICJub2ZyYW1lcyIsICJzdHlsZSIpLCBzZWxmLnN0YXJ0VGFnQmFzZUxpbmtDb21tYW5kKSwKICAgICAgICAgICAgICAgICgoImhlYWQiLCAibm9zY3JpcHQiKSwgc2VsZi5zdGFydFRhZ0hlYWROb3NjcmlwdCksCiAgICAgICAgICAgIF0pCiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIYW5kbGVyLmRlZmF1bHQgPSBzZWxmLnN0YXJ0VGFnT3RoZXIKCiAgICAgICAgICAgIHNlbGYuZW5kVGFnSGFuZGxlciA9IF91dGlscy5NZXRob2REaXNwYXRjaGVyKFsKICAgICAgICAgICAgICAgICgibm9zY3JpcHQiLCBzZWxmLmVuZFRhZ05vc2NyaXB0KSwKICAgICAgICAgICAgICAgICgiYnIiLCBzZWxmLmVuZFRhZ0JyKSwKICAgICAgICAgICAgXSkKICAgICAgICAgICAgc2VsZi5lbmRUYWdIYW5kbGVyLmRlZmF1bHQgPSBzZWxmLmVuZFRhZ090aGVyCgogICAgICAgIGRlZiBwcm9jZXNzRU9GKHNlbGYpOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJlb2YtaW4taGVhZC1ub3NjcmlwdCIpCiAgICAgICAgICAgIHNlbGYuYW55dGhpbmdFbHNlKCkKICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICAgICAgZGVmIHByb2Nlc3NDb21tZW50KHNlbGYsIHRva2VuKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VyLnBoYXNlc1siaW5IZWFkIl0ucHJvY2Vzc0NvbW1lbnQodG9rZW4pCgogICAgICAgIGRlZiBwcm9jZXNzQ2hhcmFjdGVycyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoImNoYXItaW4taGVhZC1ub3NjcmlwdCIpCiAgICAgICAgICAgIHNlbGYuYW55dGhpbmdFbHNlKCkKICAgICAgICAgICAgcmV0dXJuIHRva2VuCgogICAgICAgIGRlZiBwcm9jZXNzU3BhY2VDaGFyYWN0ZXJzKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VyLnBoYXNlc1siaW5IZWFkIl0ucHJvY2Vzc1NwYWNlQ2hhcmFjdGVycyh0b2tlbikKCiAgICAgICAgZGVmIHN0YXJ0VGFnSHRtbChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlci5waGFzZXNbImluQm9keSJdLnByb2Nlc3NTdGFydFRhZyh0b2tlbikKCiAgICAgICAgZGVmIHN0YXJ0VGFnQmFzZUxpbmtDb21tYW5kKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VyLnBoYXNlc1siaW5IZWFkIl0ucHJvY2Vzc1N0YXJ0VGFnKHRva2VuKQoKICAgICAgICBkZWYgc3RhcnRUYWdIZWFkTm9zY3JpcHQoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLXN0YXJ0LXRhZyIsIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQoKICAgICAgICBkZWYgc3RhcnRUYWdPdGhlcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtaW5oZWFkLW5vc2NyaXB0LXRhZyIsIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQogICAgICAgICAgICBzZWxmLmFueXRoaW5nRWxzZSgpCiAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgICAgICBkZWYgZW5kVGFnTm9zY3JpcHQoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBub2RlID0gc2VsZi5wYXJzZXIudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgYXNzZXJ0IG5vZGUubmFtZSA9PSAibm9zY3JpcHQiLCAiRXhwZWN0ZWQgbm9zY3JpcHQgZ290ICVzIiAlIG5vZGUubmFtZQogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYucGFyc2VyLnBoYXNlc1siaW5IZWFkIl0KCiAgICAgICAgZGVmIGVuZFRhZ0JyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1pbmhlYWQtbm9zY3JpcHQtdGFnIiwgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCiAgICAgICAgICAgIHNlbGYuYW55dGhpbmdFbHNlKCkKICAgICAgICAgICAgcmV0dXJuIHRva2VuCgogICAgICAgIGRlZiBlbmRUYWdPdGhlcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtZW5kLXRhZyIsIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQoKICAgICAgICBkZWYgYW55dGhpbmdFbHNlKHNlbGYpOgogICAgICAgICAgICAjIENhbGxlciBtdXN0IHJhaXNlIHBhcnNlIGVycm9yIGZpcnN0IQogICAgICAgICAgICBzZWxmLmVuZFRhZ05vc2NyaXB0KGltcGxpZWRUYWdUb2tlbigibm9zY3JpcHQiKSkKCiAgICBjbGFzcyBBZnRlckhlYWRQaGFzZShQaGFzZSk6CiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSk6CiAgICAgICAgICAgIFBoYXNlLl9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSkKCiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIYW5kbGVyID0gX3V0aWxzLk1ldGhvZERpc3BhdGNoZXIoWwogICAgICAgICAgICAgICAgKCJodG1sIiwgc2VsZi5zdGFydFRhZ0h0bWwpLAogICAgICAgICAgICAgICAgKCJib2R5Iiwgc2VsZi5zdGFydFRhZ0JvZHkpLAogICAgICAgICAgICAgICAgKCJmcmFtZXNldCIsIHNlbGYuc3RhcnRUYWdGcmFtZXNldCksCiAgICAgICAgICAgICAgICAoKCJiYXNlIiwgImJhc2Vmb250IiwgImJnc291bmQiLCAibGluayIsICJtZXRhIiwgIm5vZnJhbWVzIiwgInNjcmlwdCIsCiAgICAgICAgICAgICAgICAgICJzdHlsZSIsICJ0aXRsZSIpLAogICAgICAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdGcm9tSGVhZCksCiAgICAgICAgICAgICAgICAoImhlYWQiLCBzZWxmLnN0YXJ0VGFnSGVhZCkKICAgICAgICAgICAgXSkKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0hhbmRsZXIuZGVmYXVsdCA9IHNlbGYuc3RhcnRUYWdPdGhlcgogICAgICAgICAgICBzZWxmLmVuZFRhZ0hhbmRsZXIgPSBfdXRpbHMuTWV0aG9kRGlzcGF0Y2hlcihbKCgiYm9keSIsICJodG1sIiwgImJyIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lbmRUYWdIdG1sQm9keUJyKV0pCiAgICAgICAgICAgIHNlbGYuZW5kVGFnSGFuZGxlci5kZWZhdWx0ID0gc2VsZi5lbmRUYWdPdGhlcgoKICAgICAgICBkZWYgcHJvY2Vzc0VPRihzZWxmKToKICAgICAgICAgICAgc2VsZi5hbnl0aGluZ0Vsc2UoKQogICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICAgICBkZWYgcHJvY2Vzc0NoYXJhY3RlcnMoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLmFueXRoaW5nRWxzZSgpCiAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgICAgICBkZWYgc3RhcnRUYWdIdG1sKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VyLnBoYXNlc1siaW5Cb2R5Il0ucHJvY2Vzc1N0YXJ0VGFnKHRva2VuKQoKICAgICAgICBkZWYgc3RhcnRUYWdCb2R5KHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIuZnJhbWVzZXRPSyA9IEZhbHNlCiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRFbGVtZW50KHRva2VuKQogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYucGFyc2VyLnBoYXNlc1siaW5Cb2R5Il0KCiAgICAgICAgZGVmIHN0YXJ0VGFnRnJhbWVzZXQoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UgPSBzZWxmLnBhcnNlci5waGFzZXNbImluRnJhbWVzZXQiXQoKICAgICAgICBkZWYgc3RhcnRUYWdGcm9tSGVhZChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtc3RhcnQtdGFnLW91dC1vZi1teS1oZWFkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5hcHBlbmQoc2VsZi50cmVlLmhlYWRQb2ludGVyKQogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZXNbImluSGVhZCJdLnByb2Nlc3NTdGFydFRhZyh0b2tlbikKICAgICAgICAgICAgZm9yIG5vZGUgaW4gc2VsZi50cmVlLm9wZW5FbGVtZW50c1s6Oi0xXToKICAgICAgICAgICAgICAgIGlmIG5vZGUubmFtZSA9PSAiaGVhZCI6CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5yZW1vdmUobm9kZSkKICAgICAgICAgICAgICAgICAgICBicmVhawoKICAgICAgICBkZWYgc3RhcnRUYWdIZWFkKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1zdGFydC10YWciLCB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKCiAgICAgICAgZGVmIHN0YXJ0VGFnT3RoZXIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLmFueXRoaW5nRWxzZSgpCiAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgICAgICBkZWYgZW5kVGFnSHRtbEJvZHlCcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYuYW55dGhpbmdFbHNlKCkKICAgICAgICAgICAgcmV0dXJuIHRva2VuCgogICAgICAgIGRlZiBlbmRUYWdPdGhlcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtZW5kLXRhZyIsIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQoKICAgICAgICBkZWYgYW55dGhpbmdFbHNlKHNlbGYpOgogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudChpbXBsaWVkVGFnVG9rZW4oImJvZHkiLCAiU3RhcnRUYWciKSkKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UgPSBzZWxmLnBhcnNlci5waGFzZXNbImluQm9keSJdCiAgICAgICAgICAgIHNlbGYucGFyc2VyLmZyYW1lc2V0T0sgPSBUcnVlCgogICAgY2xhc3MgSW5Cb2R5UGhhc2UoUGhhc2UpOgogICAgICAgICMgaHR0cDovL3d3dy53aGF0d2cub3JnL3NwZWNzL3dlYi1hcHBzL2N1cnJlbnQtd29yay8jcGFyc2luZy1tYWluLWluYm9keQogICAgICAgICMgdGhlIHJlYWxseS1yZWFsbHktcmVhbGx5LXZlcnkgY3JhenkgbW9kZQogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpOgogICAgICAgICAgICBQaGFzZS5fX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpCgogICAgICAgICAgICAjIFNldCB0aGlzIHRvIHRoZSBkZWZhdWx0IGhhbmRsZXIKICAgICAgICAgICAgc2VsZi5wcm9jZXNzU3BhY2VDaGFyYWN0ZXJzID0gc2VsZi5wcm9jZXNzU3BhY2VDaGFyYWN0ZXJzTm9uUHJlCgogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnSGFuZGxlciA9IF91dGlscy5NZXRob2REaXNwYXRjaGVyKFsKICAgICAgICAgICAgICAgICgiaHRtbCIsIHNlbGYuc3RhcnRUYWdIdG1sKSwKICAgICAgICAgICAgICAgICgoImJhc2UiLCAiYmFzZWZvbnQiLCAiYmdzb3VuZCIsICJjb21tYW5kIiwgImxpbmsiLCAibWV0YSIsCiAgICAgICAgICAgICAgICAgICJzY3JpcHQiLCAic3R5bGUiLCAidGl0bGUiKSwKICAgICAgICAgICAgICAgICBzZWxmLnN0YXJ0VGFnUHJvY2Vzc0luSGVhZCksCiAgICAgICAgICAgICAgICAoImJvZHkiLCBzZWxmLnN0YXJ0VGFnQm9keSksCiAgICAgICAgICAgICAgICAoImZyYW1lc2V0Iiwgc2VsZi5zdGFydFRhZ0ZyYW1lc2V0KSwKICAgICAgICAgICAgICAgICgoImFkZHJlc3MiLCAiYXJ0aWNsZSIsICJhc2lkZSIsICJibG9ja3F1b3RlIiwgImNlbnRlciIsICJkZXRhaWxzIiwKICAgICAgICAgICAgICAgICAgImRpciIsICJkaXYiLCAiZGwiLCAiZmllbGRzZXQiLCAiZmlnY2FwdGlvbiIsICJmaWd1cmUiLAogICAgICAgICAgICAgICAgICAiZm9vdGVyIiwgImhlYWRlciIsICJoZ3JvdXAiLCAibWFpbiIsICJtZW51IiwgIm5hdiIsICJvbCIsICJwIiwKICAgICAgICAgICAgICAgICAgInNlY3Rpb24iLCAic3VtbWFyeSIsICJ1bCIpLAogICAgICAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdDbG9zZVApLAogICAgICAgICAgICAgICAgKGhlYWRpbmdFbGVtZW50cywgc2VsZi5zdGFydFRhZ0hlYWRpbmcpLAogICAgICAgICAgICAgICAgKCgicHJlIiwgImxpc3RpbmciKSwgc2VsZi5zdGFydFRhZ1ByZUxpc3RpbmcpLAogICAgICAgICAgICAgICAgKCJmb3JtIiwgc2VsZi5zdGFydFRhZ0Zvcm0pLAogICAgICAgICAgICAgICAgKCgibGkiLCAiZGQiLCAiZHQiKSwgc2VsZi5zdGFydFRhZ0xpc3RJdGVtKSwKICAgICAgICAgICAgICAgICgicGxhaW50ZXh0Iiwgc2VsZi5zdGFydFRhZ1BsYWludGV4dCksCiAgICAgICAgICAgICAgICAoImEiLCBzZWxmLnN0YXJ0VGFnQSksCiAgICAgICAgICAgICAgICAoKCJiIiwgImJpZyIsICJjb2RlIiwgImVtIiwgImZvbnQiLCAiaSIsICJzIiwgInNtYWxsIiwgInN0cmlrZSIsCiAgICAgICAgICAgICAgICAgICJzdHJvbmciLCAidHQiLCAidSIpLCBzZWxmLnN0YXJ0VGFnRm9ybWF0dGluZyksCiAgICAgICAgICAgICAgICAoIm5vYnIiLCBzZWxmLnN0YXJ0VGFnTm9iciksCiAgICAgICAgICAgICAgICAoImJ1dHRvbiIsIHNlbGYuc3RhcnRUYWdCdXR0b24pLAogICAgICAgICAgICAgICAgKCgiYXBwbGV0IiwgIm1hcnF1ZWUiLCAib2JqZWN0IiksIHNlbGYuc3RhcnRUYWdBcHBsZXRNYXJxdWVlT2JqZWN0KSwKICAgICAgICAgICAgICAgICgieG1wIiwgc2VsZi5zdGFydFRhZ1htcCksCiAgICAgICAgICAgICAgICAoInRhYmxlIiwgc2VsZi5zdGFydFRhZ1RhYmxlKSwKICAgICAgICAgICAgICAgICgoImFyZWEiLCAiYnIiLCAiZW1iZWQiLCAiaW1nIiwgImtleWdlbiIsICJ3YnIiKSwKICAgICAgICAgICAgICAgICBzZWxmLnN0YXJ0VGFnVm9pZEZvcm1hdHRpbmcpLAogICAgICAgICAgICAgICAgKCgicGFyYW0iLCAic291cmNlIiwgInRyYWNrIiksIHNlbGYuc3RhcnRUYWdQYXJhbVNvdXJjZSksCiAgICAgICAgICAgICAgICAoImlucHV0Iiwgc2VsZi5zdGFydFRhZ0lucHV0KSwKICAgICAgICAgICAgICAgICgiaHIiLCBzZWxmLnN0YXJ0VGFnSHIpLAogICAgICAgICAgICAgICAgKCJpbWFnZSIsIHNlbGYuc3RhcnRUYWdJbWFnZSksCiAgICAgICAgICAgICAgICAoImlzaW5kZXgiLCBzZWxmLnN0YXJ0VGFnSXNJbmRleCksCiAgICAgICAgICAgICAgICAoInRleHRhcmVhIiwgc2VsZi5zdGFydFRhZ1RleHRhcmVhKSwKICAgICAgICAgICAgICAgICgiaWZyYW1lIiwgc2VsZi5zdGFydFRhZ0lGcmFtZSksCiAgICAgICAgICAgICAgICAoIm5vc2NyaXB0Iiwgc2VsZi5zdGFydFRhZ05vc2NyaXB0KSwKICAgICAgICAgICAgICAgICgoIm5vZW1iZWQiLCAibm9mcmFtZXMiKSwgc2VsZi5zdGFydFRhZ1Jhd3RleHQpLAogICAgICAgICAgICAgICAgKCJzZWxlY3QiLCBzZWxmLnN0YXJ0VGFnU2VsZWN0KSwKICAgICAgICAgICAgICAgICgoInJwIiwgInJ0IiksIHNlbGYuc3RhcnRUYWdScFJ0KSwKICAgICAgICAgICAgICAgICgoIm9wdGlvbiIsICJvcHRncm91cCIpLCBzZWxmLnN0YXJ0VGFnT3B0KSwKICAgICAgICAgICAgICAgICgoIm1hdGgiKSwgc2VsZi5zdGFydFRhZ01hdGgpLAogICAgICAgICAgICAgICAgKCgic3ZnIiksIHNlbGYuc3RhcnRUYWdTdmcpLAogICAgICAgICAgICAgICAgKCgiY2FwdGlvbiIsICJjb2wiLCAiY29sZ3JvdXAiLCAiZnJhbWUiLCAiaGVhZCIsCiAgICAgICAgICAgICAgICAgICJ0Ym9keSIsICJ0ZCIsICJ0Zm9vdCIsICJ0aCIsICJ0aGVhZCIsCiAgICAgICAgICAgICAgICAgICJ0ciIpLCBzZWxmLnN0YXJ0VGFnTWlzcGxhY2VkKQogICAgICAgICAgICBdKQogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnSGFuZGxlci5kZWZhdWx0ID0gc2VsZi5zdGFydFRhZ090aGVyCgogICAgICAgICAgICBzZWxmLmVuZFRhZ0hhbmRsZXIgPSBfdXRpbHMuTWV0aG9kRGlzcGF0Y2hlcihbCiAgICAgICAgICAgICAgICAoImJvZHkiLCBzZWxmLmVuZFRhZ0JvZHkpLAogICAgICAgICAgICAgICAgKCJodG1sIiwgc2VsZi5lbmRUYWdIdG1sKSwKICAgICAgICAgICAgICAgICgoImFkZHJlc3MiLCAiYXJ0aWNsZSIsICJhc2lkZSIsICJibG9ja3F1b3RlIiwgImJ1dHRvbiIsICJjZW50ZXIiLAogICAgICAgICAgICAgICAgICAiZGV0YWlscyIsICJkaWFsb2ciLCAiZGlyIiwgImRpdiIsICJkbCIsICJmaWVsZHNldCIsICJmaWdjYXB0aW9uIiwgImZpZ3VyZSIsCiAgICAgICAgICAgICAgICAgICJmb290ZXIiLCAiaGVhZGVyIiwgImhncm91cCIsICJsaXN0aW5nIiwgIm1haW4iLCAibWVudSIsICJuYXYiLCAib2wiLCAicHJlIiwKICAgICAgICAgICAgICAgICAgInNlY3Rpb24iLCAic3VtbWFyeSIsICJ1bCIpLCBzZWxmLmVuZFRhZ0Jsb2NrKSwKICAgICAgICAgICAgICAgICgiZm9ybSIsIHNlbGYuZW5kVGFnRm9ybSksCiAgICAgICAgICAgICAgICAoInAiLCBzZWxmLmVuZFRhZ1ApLAogICAgICAgICAgICAgICAgKCgiZGQiLCAiZHQiLCAibGkiKSwgc2VsZi5lbmRUYWdMaXN0SXRlbSksCiAgICAgICAgICAgICAgICAoaGVhZGluZ0VsZW1lbnRzLCBzZWxmLmVuZFRhZ0hlYWRpbmcpLAogICAgICAgICAgICAgICAgKCgiYSIsICJiIiwgImJpZyIsICJjb2RlIiwgImVtIiwgImZvbnQiLCAiaSIsICJub2JyIiwgInMiLCAic21hbGwiLAogICAgICAgICAgICAgICAgICAic3RyaWtlIiwgInN0cm9uZyIsICJ0dCIsICJ1IiksIHNlbGYuZW5kVGFnRm9ybWF0dGluZyksCiAgICAgICAgICAgICAgICAoKCJhcHBsZXQiLCAibWFycXVlZSIsICJvYmplY3QiKSwgc2VsZi5lbmRUYWdBcHBsZXRNYXJxdWVlT2JqZWN0KSwKICAgICAgICAgICAgICAgICgiYnIiLCBzZWxmLmVuZFRhZ0JyKSwKICAgICAgICAgICAgXSkKICAgICAgICAgICAgc2VsZi5lbmRUYWdIYW5kbGVyLmRlZmF1bHQgPSBzZWxmLmVuZFRhZ090aGVyCgogICAgICAgIGRlZiBpc01hdGNoaW5nRm9ybWF0dGluZ0VsZW1lbnQoc2VsZiwgbm9kZTEsIG5vZGUyKToKICAgICAgICAgICAgcmV0dXJuIChub2RlMS5uYW1lID09IG5vZGUyLm5hbWUgYW5kCiAgICAgICAgICAgICAgICAgICAgbm9kZTEubmFtZXNwYWNlID09IG5vZGUyLm5hbWVzcGFjZSBhbmQKICAgICAgICAgICAgICAgICAgICBub2RlMS5hdHRyaWJ1dGVzID09IG5vZGUyLmF0dHJpYnV0ZXMpCgogICAgICAgICMgaGVscGVyCiAgICAgICAgZGVmIGFkZEZvcm1hdHRpbmdFbGVtZW50KHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCiAgICAgICAgICAgIGVsZW1lbnQgPSBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXQoKICAgICAgICAgICAgbWF0Y2hpbmdFbGVtZW50cyA9IFtdCiAgICAgICAgICAgIGZvciBub2RlIGluIHNlbGYudHJlZS5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHNbOjotMV06CiAgICAgICAgICAgICAgICBpZiBub2RlIGlzIE1hcmtlcjoKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgZWxpZiBzZWxmLmlzTWF0Y2hpbmdGb3JtYXR0aW5nRWxlbWVudChub2RlLCBlbGVtZW50KToKICAgICAgICAgICAgICAgICAgICBtYXRjaGluZ0VsZW1lbnRzLmFwcGVuZChub2RlKQoKICAgICAgICAgICAgYXNzZXJ0IGxlbihtYXRjaGluZ0VsZW1lbnRzKSA8PSAzCiAgICAgICAgICAgIGlmIGxlbihtYXRjaGluZ0VsZW1lbnRzKSA9PSAzOgogICAgICAgICAgICAgICAgc2VsZi50cmVlLmFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cy5yZW1vdmUobWF0Y2hpbmdFbGVtZW50c1stMV0pCiAgICAgICAgICAgIHNlbGYudHJlZS5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMuYXBwZW5kKGVsZW1lbnQpCgogICAgICAgICMgdGhlIHJlYWwgZGVhbAogICAgICAgIGRlZiBwcm9jZXNzRU9GKHNlbGYpOgogICAgICAgICAgICBhbGxvd2VkX2VsZW1lbnRzID0gZnJvemVuc2V0KCgiZGQiLCAiZHQiLCAibGkiLCAicCIsICJ0Ym9keSIsICJ0ZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0Zm9vdCIsICJ0aCIsICJ0aGVhZCIsICJ0ciIsICJib2R5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0bWwiKSkKICAgICAgICAgICAgZm9yIG5vZGUgaW4gc2VsZi50cmVlLm9wZW5FbGVtZW50c1s6Oi0xXToKICAgICAgICAgICAgICAgIGlmIG5vZGUubmFtZSBub3QgaW4gYWxsb3dlZF9lbGVtZW50czoKICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJleHBlY3RlZC1jbG9zaW5nLXRhZy1idXQtZ290LWVvZiIpCiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgIyBTdG9wIHBhcnNpbmcKCiAgICAgICAgZGVmIHByb2Nlc3NTcGFjZUNoYXJhY3RlcnNEcm9wTmV3bGluZShzZWxmLCB0b2tlbik6CiAgICAgICAgICAgICMgU29tZXRpbWVzIChzdGFydCBvZiA8cHJlPiwgPGxpc3Rpbmc+LCBhbmQgPHRleHRhcmVhPiBibG9ja3MpIHdlCiAgICAgICAgICAgICMgd2FudCB0byBkcm9wIGxlYWRpbmcgbmV3bGluZXMKICAgICAgICAgICAgZGF0YSA9IHRva2VuWyJkYXRhIl0KICAgICAgICAgICAgc2VsZi5wcm9jZXNzU3BhY2VDaGFyYWN0ZXJzID0gc2VsZi5wcm9jZXNzU3BhY2VDaGFyYWN0ZXJzTm9uUHJlCiAgICAgICAgICAgIGlmIChkYXRhLnN0YXJ0c3dpdGgoIlxuIikgYW5kCiAgICAgICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lIGluICgicHJlIiwgImxpc3RpbmciLCAidGV4dGFyZWEiKSBhbmQKICAgICAgICAgICAgICAgICAgICBub3Qgc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0uaGFzQ29udGVudCgpKToKICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhWzE6XQogICAgICAgICAgICBpZiBkYXRhOgogICAgICAgICAgICAgICAgc2VsZi50cmVlLnJlY29uc3RydWN0QWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzKCkKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRUZXh0KGRhdGEpCgogICAgICAgIGRlZiBwcm9jZXNzQ2hhcmFjdGVycyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlmIHRva2VuWyJkYXRhIl0gPT0gIlx1MDAwMCI6CiAgICAgICAgICAgICAgICAjIFRoZSB0b2tlbml6ZXIgc2hvdWxkIGFsd2F5cyBlbWl0IG51bGwgb24gaXRzIG93bgogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIHNlbGYudHJlZS5yZWNvbnN0cnVjdEFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cygpCiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRUZXh0KHRva2VuWyJkYXRhIl0pCiAgICAgICAgICAgICMgVGhpcyBtdXN0IGJlIGJhZCBmb3IgcGVyZm9ybWFuY2UKICAgICAgICAgICAgaWYgKHNlbGYucGFyc2VyLmZyYW1lc2V0T0sgYW5kCiAgICAgICAgICAgICAgICBhbnkoW2NoYXIgbm90IGluIHNwYWNlQ2hhcmFjdGVycwogICAgICAgICAgICAgICAgICAgICBmb3IgY2hhciBpbiB0b2tlblsiZGF0YSJdXSkpOgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIuZnJhbWVzZXRPSyA9IEZhbHNlCgogICAgICAgIGRlZiBwcm9jZXNzU3BhY2VDaGFyYWN0ZXJzTm9uUHJlKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi50cmVlLnJlY29uc3RydWN0QWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzKCkKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydFRleHQodG9rZW5bImRhdGEiXSkKCiAgICAgICAgZGVmIHN0YXJ0VGFnUHJvY2Vzc0luSGVhZChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlci5waGFzZXNbImluSGVhZCJdLnByb2Nlc3NTdGFydFRhZyh0b2tlbikKCiAgICAgICAgZGVmIHN0YXJ0VGFnQm9keShzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtc3RhcnQtdGFnIiwgeyJuYW1lIjogImJvZHkifSkKICAgICAgICAgICAgaWYgKGxlbihzZWxmLnRyZWUub3BlbkVsZW1lbnRzKSA9PSAxIG9yCiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50c1sxXS5uYW1lICE9ICJib2R5Iik6CiAgICAgICAgICAgICAgICBhc3NlcnQgc2VsZi5wYXJzZXIuaW5uZXJIVE1MCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5mcmFtZXNldE9LID0gRmFsc2UKICAgICAgICAgICAgICAgIGZvciBhdHRyLCB2YWx1ZSBpbiB0b2tlblsiZGF0YSJdLml0ZW1zKCk6CiAgICAgICAgICAgICAgICAgICAgaWYgYXR0ciBub3QgaW4gc2VsZi50cmVlLm9wZW5FbGVtZW50c1sxXS5hdHRyaWJ1dGVzOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWzFdLmF0dHJpYnV0ZXNbYXR0cl0gPSB2YWx1ZQoKICAgICAgICBkZWYgc3RhcnRUYWdGcmFtZXNldChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtc3RhcnQtdGFnIiwgeyJuYW1lIjogImZyYW1lc2V0In0pCiAgICAgICAgICAgIGlmIChsZW4oc2VsZi50cmVlLm9wZW5FbGVtZW50cykgPT0gMSBvciBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWzFdLm5hbWUgIT0gImJvZHkiKToKICAgICAgICAgICAgICAgIGFzc2VydCBzZWxmLnBhcnNlci5pbm5lckhUTUwKICAgICAgICAgICAgZWxpZiBub3Qgc2VsZi5wYXJzZXIuZnJhbWVzZXRPSzoKICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGlmIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbMV0ucGFyZW50OgogICAgICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbMV0ucGFyZW50LnJlbW92ZUNoaWxkKHNlbGYudHJlZS5vcGVuRWxlbWVudHNbMV0pCiAgICAgICAgICAgICAgICB3aGlsZSBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lICE9ICJodG1sIjoKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2VzWyJpbkZyYW1lc2V0Il0KCiAgICAgICAgZGVmIHN0YXJ0VGFnQ2xvc2VQKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWYgc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKCJwIiwgdmFyaWFudD0iYnV0dG9uIik6CiAgICAgICAgICAgICAgICBzZWxmLmVuZFRhZ1AoaW1wbGllZFRhZ1Rva2VuKCJwIikpCiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRFbGVtZW50KHRva2VuKQoKICAgICAgICBkZWYgc3RhcnRUYWdQcmVMaXN0aW5nKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWYgc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKCJwIiwgdmFyaWFudD0iYnV0dG9uIik6CiAgICAgICAgICAgICAgICBzZWxmLmVuZFRhZ1AoaW1wbGllZFRhZ1Rva2VuKCJwIikpCiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRFbGVtZW50KHRva2VuKQogICAgICAgICAgICBzZWxmLnBhcnNlci5mcmFtZXNldE9LID0gRmFsc2UKICAgICAgICAgICAgc2VsZi5wcm9jZXNzU3BhY2VDaGFyYWN0ZXJzID0gc2VsZi5wcm9jZXNzU3BhY2VDaGFyYWN0ZXJzRHJvcE5ld2xpbmUKCiAgICAgICAgZGVmIHN0YXJ0VGFnRm9ybShzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlmIHNlbGYudHJlZS5mb3JtUG9pbnRlcjoKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtc3RhcnQtdGFnIiwgeyJuYW1lIjogImZvcm0ifSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGlmIHNlbGYudHJlZS5lbGVtZW50SW5TY29wZSgicCIsIHZhcmlhbnQ9ImJ1dHRvbiIpOgogICAgICAgICAgICAgICAgICAgIHNlbGYuZW5kVGFnUChpbXBsaWVkVGFnVG9rZW4oInAiKSkKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRFbGVtZW50KHRva2VuKQogICAgICAgICAgICAgICAgc2VsZi50cmVlLmZvcm1Qb2ludGVyID0gc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0KCiAgICAgICAgZGVmIHN0YXJ0VGFnTGlzdEl0ZW0oc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5mcmFtZXNldE9LID0gRmFsc2UKCiAgICAgICAgICAgIHN0b3BOYW1lc01hcCA9IHsibGkiOiBbImxpIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZHQiOiBbImR0IiwgImRkIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGQiOiBbImR0IiwgImRkIl19CiAgICAgICAgICAgIHN0b3BOYW1lcyA9IHN0b3BOYW1lc01hcFt0b2tlblsibmFtZSJdXQogICAgICAgICAgICBmb3Igbm9kZSBpbiByZXZlcnNlZChzZWxmLnRyZWUub3BlbkVsZW1lbnRzKToKICAgICAgICAgICAgICAgIGlmIG5vZGUubmFtZSBpbiBzdG9wTmFtZXM6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UucHJvY2Vzc0VuZFRhZygKICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGllZFRhZ1Rva2VuKG5vZGUubmFtZSwgIkVuZFRhZyIpKQogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICBpZiAobm9kZS5uYW1lVHVwbGUgaW4gc3BlY2lhbEVsZW1lbnRzIGFuZAogICAgICAgICAgICAgICAgICAgICAgICBub2RlLm5hbWUgbm90IGluICgiYWRkcmVzcyIsICJkaXYiLCAicCIpKToKICAgICAgICAgICAgICAgICAgICBicmVhawoKICAgICAgICAgICAgaWYgc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKCJwIiwgdmFyaWFudD0iYnV0dG9uIik6CiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZS5wcm9jZXNzRW5kVGFnKAogICAgICAgICAgICAgICAgICAgIGltcGxpZWRUYWdUb2tlbigicCIsICJFbmRUYWciKSkKCiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRFbGVtZW50KHRva2VuKQoKICAgICAgICBkZWYgc3RhcnRUYWdQbGFpbnRleHQoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZiBzZWxmLnRyZWUuZWxlbWVudEluU2NvcGUoInAiLCB2YXJpYW50PSJidXR0b24iKToKICAgICAgICAgICAgICAgIHNlbGYuZW5kVGFnUChpbXBsaWVkVGFnVG9rZW4oInAiKSkKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnRva2VuaXplci5zdGF0ZSA9IHNlbGYucGFyc2VyLnRva2VuaXplci5wbGFpbnRleHRTdGF0ZQoKICAgICAgICBkZWYgc3RhcnRUYWdIZWFkaW5nKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWYgc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKCJwIiwgdmFyaWFudD0iYnV0dG9uIik6CiAgICAgICAgICAgICAgICBzZWxmLmVuZFRhZ1AoaW1wbGllZFRhZ1Rva2VuKCJwIikpCiAgICAgICAgICAgIGlmIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWUgaW4gaGVhZGluZ0VsZW1lbnRzOgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1zdGFydC10YWciLCB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCgogICAgICAgIGRlZiBzdGFydFRhZ0Eoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBhZmVBRWxlbWVudCA9IHNlbGYudHJlZS5lbGVtZW50SW5BY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMoImEiKQogICAgICAgICAgICBpZiBhZmVBRWxlbWVudDoKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtc3RhcnQtdGFnLWltcGxpZXMtZW5kLXRhZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsic3RhcnROYW1lIjogImEiLCAiZW5kTmFtZSI6ICJhIn0pCiAgICAgICAgICAgICAgICBzZWxmLmVuZFRhZ0Zvcm1hdHRpbmcoaW1wbGllZFRhZ1Rva2VuKCJhIikpCiAgICAgICAgICAgICAgICBpZiBhZmVBRWxlbWVudCBpbiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzOgogICAgICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucmVtb3ZlKGFmZUFFbGVtZW50KQogICAgICAgICAgICAgICAgaWYgYWZlQUVsZW1lbnQgaW4gc2VsZi50cmVlLmFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50czoKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyZWUuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzLnJlbW92ZShhZmVBRWxlbWVudCkKICAgICAgICAgICAgc2VsZi50cmVlLnJlY29uc3RydWN0QWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzKCkKICAgICAgICAgICAgc2VsZi5hZGRGb3JtYXR0aW5nRWxlbWVudCh0b2tlbikKCiAgICAgICAgZGVmIHN0YXJ0VGFnRm9ybWF0dGluZyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYudHJlZS5yZWNvbnN0cnVjdEFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cygpCiAgICAgICAgICAgIHNlbGYuYWRkRm9ybWF0dGluZ0VsZW1lbnQodG9rZW4pCgogICAgICAgIGRlZiBzdGFydFRhZ05vYnIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnRyZWUucmVjb25zdHJ1Y3RBY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMoKQogICAgICAgICAgICBpZiBzZWxmLnRyZWUuZWxlbWVudEluU2NvcGUoIm5vYnIiKToKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtc3RhcnQtdGFnLWltcGxpZXMtZW5kLXRhZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsic3RhcnROYW1lIjogIm5vYnIiLCAiZW5kTmFtZSI6ICJub2JyIn0pCiAgICAgICAgICAgICAgICBzZWxmLnByb2Nlc3NFbmRUYWcoaW1wbGllZFRhZ1Rva2VuKCJub2JyIikpCiAgICAgICAgICAgICAgICAjIFhYWCBOZWVkIHRlc3RzIHRoYXQgdHJpZ2dlciB0aGUgZm9sbG93aW5nCiAgICAgICAgICAgICAgICBzZWxmLnRyZWUucmVjb25zdHJ1Y3RBY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMoKQogICAgICAgICAgICBzZWxmLmFkZEZvcm1hdHRpbmdFbGVtZW50KHRva2VuKQoKICAgICAgICBkZWYgc3RhcnRUYWdCdXR0b24oc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZiBzZWxmLnRyZWUuZWxlbWVudEluU2NvcGUoImJ1dHRvbiIpOgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1zdGFydC10YWctaW1wbGllcy1lbmQtdGFnIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJzdGFydE5hbWUiOiAiYnV0dG9uIiwgImVuZE5hbWUiOiAiYnV0dG9uIn0pCiAgICAgICAgICAgICAgICBzZWxmLnByb2Nlc3NFbmRUYWcoaW1wbGllZFRhZ1Rva2VuKCJidXR0b24iKSkKICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi50cmVlLnJlY29uc3RydWN0QWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzKCkKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRFbGVtZW50KHRva2VuKQogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIuZnJhbWVzZXRPSyA9IEZhbHNlCgogICAgICAgIGRlZiBzdGFydFRhZ0FwcGxldE1hcnF1ZWVPYmplY3Qoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnRyZWUucmVjb25zdHJ1Y3RBY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMoKQogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKICAgICAgICAgICAgc2VsZi50cmVlLmFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cy5hcHBlbmQoTWFya2VyKQogICAgICAgICAgICBzZWxmLnBhcnNlci5mcmFtZXNldE9LID0gRmFsc2UKCiAgICAgICAgZGVmIHN0YXJ0VGFnWG1wKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWYgc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKCJwIiwgdmFyaWFudD0iYnV0dG9uIik6CiAgICAgICAgICAgICAgICBzZWxmLmVuZFRhZ1AoaW1wbGllZFRhZ1Rva2VuKCJwIikpCiAgICAgICAgICAgIHNlbGYudHJlZS5yZWNvbnN0cnVjdEFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cygpCiAgICAgICAgICAgIHNlbGYucGFyc2VyLmZyYW1lc2V0T0sgPSBGYWxzZQogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZVJDRGF0YVJhd3RleHQodG9rZW4sICJSQVdURVhUIikKCiAgICAgICAgZGVmIHN0YXJ0VGFnVGFibGUoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZiBzZWxmLnBhcnNlci5jb21wYXRNb2RlICE9ICJxdWlya3MiOgogICAgICAgICAgICAgICAgaWYgc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKCJwIiwgdmFyaWFudD0iYnV0dG9uIik6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5wcm9jZXNzRW5kVGFnKGltcGxpZWRUYWdUb2tlbigicCIpKQogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKICAgICAgICAgICAgc2VsZi5wYXJzZXIuZnJhbWVzZXRPSyA9IEZhbHNlCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2VzWyJpblRhYmxlIl0KCiAgICAgICAgZGVmIHN0YXJ0VGFnVm9pZEZvcm1hdHRpbmcoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnRyZWUucmVjb25zdHJ1Y3RBY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMoKQogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICB0b2tlblsic2VsZkNsb3NpbmdBY2tub3dsZWRnZWQiXSA9IFRydWUKICAgICAgICAgICAgc2VsZi5wYXJzZXIuZnJhbWVzZXRPSyA9IEZhbHNlCgogICAgICAgIGRlZiBzdGFydFRhZ0lucHV0KHNlbGYsIHRva2VuKToKICAgICAgICAgICAgZnJhbWVzZXRPSyA9IHNlbGYucGFyc2VyLmZyYW1lc2V0T0sKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ1ZvaWRGb3JtYXR0aW5nKHRva2VuKQogICAgICAgICAgICBpZiAoInR5cGUiIGluIHRva2VuWyJkYXRhIl0gYW5kCiAgICAgICAgICAgICAgICAgICAgdG9rZW5bImRhdGEiXVsidHlwZSJdLnRyYW5zbGF0ZShhc2NpaVVwcGVyMkxvd2VyKSA9PSAiaGlkZGVuIik6CiAgICAgICAgICAgICAgICAjIGlucHV0IHR5cGU9aGlkZGVuIGRvZXNuJ3QgY2hhbmdlIGZyYW1lc2V0T0sKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLmZyYW1lc2V0T0sgPSBmcmFtZXNldE9LCgogICAgICAgIGRlZiBzdGFydFRhZ1BhcmFtU291cmNlKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCiAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgdG9rZW5bInNlbGZDbG9zaW5nQWNrbm93bGVkZ2VkIl0gPSBUcnVlCgogICAgICAgIGRlZiBzdGFydFRhZ0hyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWYgc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKCJwIiwgdmFyaWFudD0iYnV0dG9uIik6CiAgICAgICAgICAgICAgICBzZWxmLmVuZFRhZ1AoaW1wbGllZFRhZ1Rva2VuKCJwIikpCiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRFbGVtZW50KHRva2VuKQogICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgIHRva2VuWyJzZWxmQ2xvc2luZ0Fja25vd2xlZGdlZCJdID0gVHJ1ZQogICAgICAgICAgICBzZWxmLnBhcnNlci5mcmFtZXNldE9LID0gRmFsc2UKCiAgICAgICAgZGVmIHN0YXJ0VGFnSW1hZ2Uoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICAjIE5vIHJlYWxseS4uLgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLXN0YXJ0LXRhZy10cmVhdGVkLWFzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Im9yaWdpbmFsTmFtZSI6ICJpbWFnZSIsICJuZXdOYW1lIjogImltZyJ9KQogICAgICAgICAgICBzZWxmLnByb2Nlc3NTdGFydFRhZyhpbXBsaWVkVGFnVG9rZW4oImltZyIsICJTdGFydFRhZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzPXRva2VuWyJkYXRhIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmQ2xvc2luZz10b2tlblsic2VsZkNsb3NpbmciXSkpCgogICAgICAgIGRlZiBzdGFydFRhZ0lzSW5kZXgoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJkZXByZWNhdGVkLXRhZyIsIHsibmFtZSI6ICJpc2luZGV4In0pCiAgICAgICAgICAgIGlmIHNlbGYudHJlZS5mb3JtUG9pbnRlcjoKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICBmb3JtX2F0dHJzID0ge30KICAgICAgICAgICAgaWYgImFjdGlvbiIgaW4gdG9rZW5bImRhdGEiXToKICAgICAgICAgICAgICAgIGZvcm1fYXR0cnNbImFjdGlvbiJdID0gdG9rZW5bImRhdGEiXVsiYWN0aW9uIl0KICAgICAgICAgICAgc2VsZi5wcm9jZXNzU3RhcnRUYWcoaW1wbGllZFRhZ1Rva2VuKCJmb3JtIiwgIlN0YXJ0VGFnIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM9Zm9ybV9hdHRycykpCiAgICAgICAgICAgIHNlbGYucHJvY2Vzc1N0YXJ0VGFnKGltcGxpZWRUYWdUb2tlbigiaHIiLCAiU3RhcnRUYWciKSkKICAgICAgICAgICAgc2VsZi5wcm9jZXNzU3RhcnRUYWcoaW1wbGllZFRhZ1Rva2VuKCJsYWJlbCIsICJTdGFydFRhZyIpKQogICAgICAgICAgICAjIFhYWCBMb2NhbGl6YXRpb24gLi4uCiAgICAgICAgICAgIGlmICJwcm9tcHQiIGluIHRva2VuWyJkYXRhIl06CiAgICAgICAgICAgICAgICBwcm9tcHQgPSB0b2tlblsiZGF0YSJdWyJwcm9tcHQiXQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcHJvbXB0ID0gIlRoaXMgaXMgYSBzZWFyY2hhYmxlIGluZGV4LiBFbnRlciBzZWFyY2gga2V5d29yZHM6ICIKICAgICAgICAgICAgc2VsZi5wcm9jZXNzQ2hhcmFjdGVycygKICAgICAgICAgICAgICAgIHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOiBwcm9tcHR9KQogICAgICAgICAgICBhdHRyaWJ1dGVzID0gdG9rZW5bImRhdGEiXS5jb3B5KCkKICAgICAgICAgICAgaWYgImFjdGlvbiIgaW4gYXR0cmlidXRlczoKICAgICAgICAgICAgICAgIGRlbCBhdHRyaWJ1dGVzWyJhY3Rpb24iXQogICAgICAgICAgICBpZiAicHJvbXB0IiBpbiBhdHRyaWJ1dGVzOgogICAgICAgICAgICAgICAgZGVsIGF0dHJpYnV0ZXNbInByb21wdCJdCiAgICAgICAgICAgIGF0dHJpYnV0ZXNbIm5hbWUiXSA9ICJpc2luZGV4IgogICAgICAgICAgICBzZWxmLnByb2Nlc3NTdGFydFRhZyhpbXBsaWVkVGFnVG9rZW4oImlucHV0IiwgIlN0YXJ0VGFnIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM9YXR0cmlidXRlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGZDbG9zaW5nPXRva2VuWyJzZWxmQ2xvc2luZyJdKSkKICAgICAgICAgICAgc2VsZi5wcm9jZXNzRW5kVGFnKGltcGxpZWRUYWdUb2tlbigibGFiZWwiKSkKICAgICAgICAgICAgc2VsZi5wcm9jZXNzU3RhcnRUYWcoaW1wbGllZFRhZ1Rva2VuKCJociIsICJTdGFydFRhZyIpKQogICAgICAgICAgICBzZWxmLnByb2Nlc3NFbmRUYWcoaW1wbGllZFRhZ1Rva2VuKCJmb3JtIikpCgogICAgICAgIGRlZiBzdGFydFRhZ1RleHRhcmVhKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnRva2VuaXplci5zdGF0ZSA9IHNlbGYucGFyc2VyLnRva2VuaXplci5yY2RhdGFTdGF0ZQogICAgICAgICAgICBzZWxmLnByb2Nlc3NTcGFjZUNoYXJhY3RlcnMgPSBzZWxmLnByb2Nlc3NTcGFjZUNoYXJhY3RlcnNEcm9wTmV3bGluZQogICAgICAgICAgICBzZWxmLnBhcnNlci5mcmFtZXNldE9LID0gRmFsc2UKCiAgICAgICAgZGVmIHN0YXJ0VGFnSUZyYW1lKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIuZnJhbWVzZXRPSyA9IEZhbHNlCiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdSYXd0ZXh0KHRva2VuKQoKICAgICAgICBkZWYgc3RhcnRUYWdOb3NjcmlwdChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlmIHNlbGYucGFyc2VyLnNjcmlwdGluZzoKICAgICAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdSYXd0ZXh0KHRva2VuKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi5zdGFydFRhZ090aGVyKHRva2VuKQoKICAgICAgICBkZWYgc3RhcnRUYWdSYXd0ZXh0KHNlbGYsIHRva2VuKToKICAgICAgICAgICAgIiIiaWZyYW1lLCBub2VtYmVkIG5vZnJhbWVzLCBub3NjcmlwdChpZiBzY3JpcHRpbmcgZW5hYmxlZCkiIiIKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VSQ0RhdGFSYXd0ZXh0KHRva2VuLCAiUkFXVEVYVCIpCgogICAgICAgIGRlZiBzdGFydFRhZ09wdChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlmIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWUgPT0gIm9wdGlvbiI6CiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZS5wcm9jZXNzRW5kVGFnKGltcGxpZWRUYWdUb2tlbigib3B0aW9uIikpCiAgICAgICAgICAgIHNlbGYudHJlZS5yZWNvbnN0cnVjdEFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cygpCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKCiAgICAgICAgZGVmIHN0YXJ0VGFnU2VsZWN0KHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi50cmVlLnJlY29uc3RydWN0QWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzKCkKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCiAgICAgICAgICAgIHNlbGYucGFyc2VyLmZyYW1lc2V0T0sgPSBGYWxzZQogICAgICAgICAgICBpZiBzZWxmLnBhcnNlci5waGFzZSBpbiAoc2VsZi5wYXJzZXIucGhhc2VzWyJpblRhYmxlIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZXNbImluQ2FwdGlvbiJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2VzWyJpbkNvbHVtbkdyb3VwIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZXNbImluVGFibGVCb2R5Il0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZXNbImluUm93Il0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZXNbImluQ2VsbCJdKToKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2VzWyJpblNlbGVjdEluVGFibGUiXQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UgPSBzZWxmLnBhcnNlci5waGFzZXNbImluU2VsZWN0Il0KCiAgICAgICAgZGVmIHN0YXJ0VGFnUnBSdChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlmIHNlbGYudHJlZS5lbGVtZW50SW5TY29wZSgicnVieSIpOgogICAgICAgICAgICAgICAgc2VsZi50cmVlLmdlbmVyYXRlSW1wbGllZEVuZFRhZ3MoKQogICAgICAgICAgICAgICAgaWYgc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZSAhPSAicnVieSI6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigpCiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRFbGVtZW50KHRva2VuKQoKICAgICAgICBkZWYgc3RhcnRUYWdNYXRoKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi50cmVlLnJlY29uc3RydWN0QWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzKCkKICAgICAgICAgICAgc2VsZi5wYXJzZXIuYWRqdXN0TWF0aE1MQXR0cmlidXRlcyh0b2tlbikKICAgICAgICAgICAgc2VsZi5wYXJzZXIuYWRqdXN0Rm9yZWlnbkF0dHJpYnV0ZXModG9rZW4pCiAgICAgICAgICAgIHRva2VuWyJuYW1lc3BhY2UiXSA9IG5hbWVzcGFjZXNbIm1hdGhtbCJdCiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRFbGVtZW50KHRva2VuKQogICAgICAgICAgICAjIE5lZWQgdG8gZ2V0IHRoZSBwYXJzZSBlcnJvciByaWdodCBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlIHRva2VuCiAgICAgICAgICAgICMgaGFzIGEgbmFtZXNwYWNlIG5vdCBlcXVhbCB0byB0aGUgeG1sbnMgYXR0cmlidXRlCiAgICAgICAgICAgIGlmIHRva2VuWyJzZWxmQ2xvc2luZyJdOgogICAgICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICAgICAgdG9rZW5bInNlbGZDbG9zaW5nQWNrbm93bGVkZ2VkIl0gPSBUcnVlCgogICAgICAgIGRlZiBzdGFydFRhZ1N2ZyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYudHJlZS5yZWNvbnN0cnVjdEFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cygpCiAgICAgICAgICAgIHNlbGYucGFyc2VyLmFkanVzdFNWR0F0dHJpYnV0ZXModG9rZW4pCiAgICAgICAgICAgIHNlbGYucGFyc2VyLmFkanVzdEZvcmVpZ25BdHRyaWJ1dGVzKHRva2VuKQogICAgICAgICAgICB0b2tlblsibmFtZXNwYWNlIl0gPSBuYW1lc3BhY2VzWyJzdmciXQogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKICAgICAgICAgICAgIyBOZWVkIHRvIGdldCB0aGUgcGFyc2UgZXJyb3IgcmlnaHQgZm9yIHRoZSBjYXNlIHdoZXJlIHRoZSB0b2tlbgogICAgICAgICAgICAjIGhhcyBhIG5hbWVzcGFjZSBub3QgZXF1YWwgdG8gdGhlIHhtbG5zIGF0dHJpYnV0ZQogICAgICAgICAgICBpZiB0b2tlblsic2VsZkNsb3NpbmciXToKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgICAgIHRva2VuWyJzZWxmQ2xvc2luZ0Fja25vd2xlZGdlZCJdID0gVHJ1ZQoKICAgICAgICBkZWYgc3RhcnRUYWdNaXNwbGFjZWQoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICAiIiIgRWxlbWVudHMgdGhhdCBzaG91bGQgYmUgY2hpbGRyZW4gb2Ygb3RoZXIgZWxlbWVudHMgdGhhdCBoYXZlIGEKICAgICAgICAgICAgZGlmZmVyZW50IGluc2VydGlvbiBtb2RlOyBoZXJlIHRoZXkgYXJlIGlnbm9yZWQKICAgICAgICAgICAgImNhcHRpb24iLCAiY29sIiwgImNvbGdyb3VwIiwgImZyYW1lIiwgImZyYW1lc2V0IiwgImhlYWQiLAogICAgICAgICAgICAib3B0aW9uIiwgIm9wdGdyb3VwIiwgInRib2R5IiwgInRkIiwgInRmb290IiwgInRoIiwgInRoZWFkIiwKICAgICAgICAgICAgInRyIiwgIm5vc2NyaXB0IgogICAgICAgICAgICAiIiIKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1zdGFydC10YWctaWdub3JlZCIsIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQoKICAgICAgICBkZWYgc3RhcnRUYWdPdGhlcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYudHJlZS5yZWNvbnN0cnVjdEFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cygpCiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRFbGVtZW50KHRva2VuKQoKICAgICAgICBkZWYgZW5kVGFnUChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlmIG5vdCBzZWxmLnRyZWUuZWxlbWVudEluU2NvcGUoInAiLCB2YXJpYW50PSJidXR0b24iKToKICAgICAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdDbG9zZVAoaW1wbGllZFRhZ1Rva2VuKCJwIiwgIlN0YXJ0VGFnIikpCiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLWVuZC10YWciLCB7Im5hbWUiOiAicCJ9KQogICAgICAgICAgICAgICAgc2VsZi5lbmRUYWdQKGltcGxpZWRUYWdUb2tlbigicCIsICJFbmRUYWciKSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5nZW5lcmF0ZUltcGxpZWRFbmRUYWdzKCJwIikKICAgICAgICAgICAgICAgIGlmIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWUgIT0gInAiOgogICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtZW5kLXRhZyIsIHsibmFtZSI6ICJwIn0pCiAgICAgICAgICAgICAgICBub2RlID0gc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICAgICAgd2hpbGUgbm9kZS5uYW1lICE9ICJwIjoKICAgICAgICAgICAgICAgICAgICBub2RlID0gc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQoKICAgICAgICBkZWYgZW5kVGFnQm9keShzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlmIG5vdCBzZWxmLnRyZWUuZWxlbWVudEluU2NvcGUoImJvZHkiKToKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoKQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIGVsaWYgc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZSAhPSAiYm9keSI6CiAgICAgICAgICAgICAgICBmb3Igbm9kZSBpbiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWzI6XToKICAgICAgICAgICAgICAgICAgICBpZiBub2RlLm5hbWUgbm90IGluIGZyb3plbnNldCgoImRkIiwgImR0IiwgImxpIiwgIm9wdGdyb3VwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wdGlvbiIsICJwIiwgInJwIiwgInJ0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRib2R5IiwgInRkIiwgInRmb290IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoIiwgInRoZWFkIiwgInRyIiwgImJvZHkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHRtbCIpKToKICAgICAgICAgICAgICAgICAgICAgICAgIyBOb3Qgc3VyZSB0aGlzIGlzIHRoZSBjb3JyZWN0IG5hbWUgZm9yIHRoZSBwYXJzZSBlcnJvcgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkLW9uZS1lbmQtdGFnLWJ1dC1nb3QtYW5vdGhlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ImdvdE5hbWUiOiAiYm9keSIsICJleHBlY3RlZE5hbWUiOiBub2RlLm5hbWV9KQogICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYucGFyc2VyLnBoYXNlc1siYWZ0ZXJCb2R5Il0KCiAgICAgICAgZGVmIGVuZFRhZ0h0bWwoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICAjIFdlIHJlcGVhdCB0aGUgdGVzdCBmb3IgdGhlIGJvZHkgZW5kIHRhZyB0b2tlbiBiZWluZyBpZ25vcmVkIGhlcmUKICAgICAgICAgICAgaWYgc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKCJib2R5Iik6CiAgICAgICAgICAgICAgICBzZWxmLmVuZFRhZ0JvZHkoaW1wbGllZFRhZ1Rva2VuKCJib2R5IikpCiAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICAgICAgZGVmIGVuZFRhZ0Jsb2NrKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgIyBQdXQgdXMgYmFjayBpbiB0aGUgcmlnaHQgd2hpdGVzcGFjZSBoYW5kbGluZyBtb2RlCiAgICAgICAgICAgIGlmIHRva2VuWyJuYW1lIl0gPT0gInByZSI6CiAgICAgICAgICAgICAgICBzZWxmLnByb2Nlc3NTcGFjZUNoYXJhY3RlcnMgPSBzZWxmLnByb2Nlc3NTcGFjZUNoYXJhY3RlcnNOb25QcmUKICAgICAgICAgICAgaW5TY29wZSA9IHNlbGYudHJlZS5lbGVtZW50SW5TY29wZSh0b2tlblsibmFtZSJdKQogICAgICAgICAgICBpZiBpblNjb3BlOgogICAgICAgICAgICAgICAgc2VsZi50cmVlLmdlbmVyYXRlSW1wbGllZEVuZFRhZ3MoKQogICAgICAgICAgICBpZiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lICE9IHRva2VuWyJuYW1lIl06CiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJlbmQtdGFnLXRvby1lYXJseSIsIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQogICAgICAgICAgICBpZiBpblNjb3BlOgogICAgICAgICAgICAgICAgbm9kZSA9IHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgICAgIHdoaWxlIG5vZGUubmFtZSAhPSB0b2tlblsibmFtZSJdOgogICAgICAgICAgICAgICAgICAgIG5vZGUgPSBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCgogICAgICAgIGRlZiBlbmRUYWdGb3JtKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgbm9kZSA9IHNlbGYudHJlZS5mb3JtUG9pbnRlcgogICAgICAgICAgICBzZWxmLnRyZWUuZm9ybVBvaW50ZXIgPSBOb25lCiAgICAgICAgICAgIGlmIG5vZGUgaXMgTm9uZSBvciBub3Qgc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKG5vZGUpOgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1lbmQtdGFnIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjogImZvcm0ifSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5nZW5lcmF0ZUltcGxpZWRFbmRUYWdzKCkKICAgICAgICAgICAgICAgIGlmIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdICE9IG5vZGU6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigiZW5kLXRhZy10b28tZWFybHktaWdub3JlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiAiZm9ybSJ9KQogICAgICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5yZW1vdmUobm9kZSkKCiAgICAgICAgZGVmIGVuZFRhZ0xpc3RJdGVtKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWYgdG9rZW5bIm5hbWUiXSA9PSAibGkiOgogICAgICAgICAgICAgICAgdmFyaWFudCA9ICJsaXN0IgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgdmFyaWFudCA9IE5vbmUKICAgICAgICAgICAgaWYgbm90IHNlbGYudHJlZS5lbGVtZW50SW5TY29wZSh0b2tlblsibmFtZSJdLCB2YXJpYW50PXZhcmlhbnQpOgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1lbmQtdGFnIiwgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLnRyZWUuZ2VuZXJhdGVJbXBsaWVkRW5kVGFncyhleGNsdWRlPXRva2VuWyJuYW1lIl0pCiAgICAgICAgICAgICAgICBpZiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lICE9IHRva2VuWyJuYW1lIl06CiAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgImVuZC10YWctdG9vLWVhcmx5IiwKICAgICAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCiAgICAgICAgICAgICAgICBub2RlID0gc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICAgICAgd2hpbGUgbm9kZS5uYW1lICE9IHRva2VuWyJuYW1lIl06CiAgICAgICAgICAgICAgICAgICAgbm9kZSA9IHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKCiAgICAgICAgZGVmIGVuZFRhZ0hlYWRpbmcoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBmb3IgaXRlbSBpbiBoZWFkaW5nRWxlbWVudHM6CiAgICAgICAgICAgICAgICBpZiBzZWxmLnRyZWUuZWxlbWVudEluU2NvcGUoaXRlbSk6CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmVlLmdlbmVyYXRlSW1wbGllZEVuZFRhZ3MoKQogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGlmIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWUgIT0gdG9rZW5bIm5hbWUiXToKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoImVuZC10YWctdG9vLWVhcmx5IiwgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCgogICAgICAgICAgICBmb3IgaXRlbSBpbiBoZWFkaW5nRWxlbWVudHM6CiAgICAgICAgICAgICAgICBpZiBzZWxmLnRyZWUuZWxlbWVudEluU2NvcGUoaXRlbSk6CiAgICAgICAgICAgICAgICAgICAgaXRlbSA9IHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgICAgICAgICB3aGlsZSBpdGVtLm5hbWUgbm90IGluIGhlYWRpbmdFbGVtZW50czoKICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSA9IHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgICAgICAgICBicmVhawoKICAgICAgICBkZWYgZW5kVGFnRm9ybWF0dGluZyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgICIiIlRoZSBtdWNoLWZlYXJlZCBhZG9wdGlvbiBhZ2VuY3kgYWxnb3JpdGhtIiIiCiAgICAgICAgICAgICMgaHR0cDovL3N2bi53aGF0d2cub3JnL3dlYmFwcHMvY29tcGxldGUuaHRtbCNhZG9wdGlvbkFnZW5jeSByZXZpc2lvbiA3ODY3CiAgICAgICAgICAgICMgWFhYIEJldHRlciBwYXJzZUVycm9yIG1lc3NhZ2VzIGFwcHJlY2lhdGVkLgoKICAgICAgICAgICAgIyBTdGVwIDEKICAgICAgICAgICAgb3V0ZXJMb29wQ291bnRlciA9IDAKCiAgICAgICAgICAgICMgU3RlcCAyCiAgICAgICAgICAgIHdoaWxlIG91dGVyTG9vcENvdW50ZXIgPCA4OgoKICAgICAgICAgICAgICAgICMgU3RlcCAzCiAgICAgICAgICAgICAgICBvdXRlckxvb3BDb3VudGVyICs9IDEKCiAgICAgICAgICAgICAgICAjIFN0ZXAgNDoKCiAgICAgICAgICAgICAgICAjIExldCB0aGUgZm9ybWF0dGluZyBlbGVtZW50IGJlIHRoZSBsYXN0IGVsZW1lbnQgaW4KICAgICAgICAgICAgICAgICMgdGhlIGxpc3Qgb2YgYWN0aXZlIGZvcm1hdHRpbmcgZWxlbWVudHMgdGhhdDoKICAgICAgICAgICAgICAgICMgLSBpcyBiZXR3ZWVuIHRoZSBlbmQgb2YgdGhlIGxpc3QgYW5kIHRoZSBsYXN0IHNjb3BlCiAgICAgICAgICAgICAgICAjIG1hcmtlciBpbiB0aGUgbGlzdCwgaWYgYW55LCBvciB0aGUgc3RhcnQgb2YgdGhlIGxpc3QKICAgICAgICAgICAgICAgICMgb3RoZXJ3aXNlLCBhbmQKICAgICAgICAgICAgICAgICMgLSBoYXMgdGhlIHNhbWUgdGFnIG5hbWUgYXMgdGhlIHRva2VuLgogICAgICAgICAgICAgICAgZm9ybWF0dGluZ0VsZW1lbnQgPSBzZWxmLnRyZWUuZWxlbWVudEluQWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzKAogICAgICAgICAgICAgICAgICAgIHRva2VuWyJuYW1lIl0pCiAgICAgICAgICAgICAgICBpZiAobm90IGZvcm1hdHRpbmdFbGVtZW50IG9yCiAgICAgICAgICAgICAgICAgICAgKGZvcm1hdHRpbmdFbGVtZW50IGluIHNlbGYudHJlZS5vcGVuRWxlbWVudHMgYW5kCiAgICAgICAgICAgICAgICAgICAgIG5vdCBzZWxmLnRyZWUuZWxlbWVudEluU2NvcGUoZm9ybWF0dGluZ0VsZW1lbnQubmFtZSkpKToKICAgICAgICAgICAgICAgICAgICAjIElmIHRoZXJlIGlzIG5vIHN1Y2ggbm9kZSwgdGhlbiBhYm9ydCB0aGVzZSBzdGVwcwogICAgICAgICAgICAgICAgICAgICMgYW5kIGluc3RlYWQgYWN0IGFzIGRlc2NyaWJlZCBpbiB0aGUgImFueSBvdGhlcgogICAgICAgICAgICAgICAgICAgICMgZW5kIHRhZyIgZW50cnkgYmVsb3cuCiAgICAgICAgICAgICAgICAgICAgc2VsZi5lbmRUYWdPdGhlcih0b2tlbikKICAgICAgICAgICAgICAgICAgICByZXR1cm4KCiAgICAgICAgICAgICAgICAjIE90aGVyd2lzZSwgaWYgdGhlcmUgaXMgc3VjaCBhIG5vZGUsIGJ1dCB0aGF0IG5vZGUgaXMKICAgICAgICAgICAgICAgICMgbm90IGluIHRoZSBzdGFjayBvZiBvcGVuIGVsZW1lbnRzLCB0aGVuIHRoaXMgaXMgYQogICAgICAgICAgICAgICAgIyBwYXJzZSBlcnJvcjsgcmVtb3ZlIHRoZSBlbGVtZW50IGZyb20gdGhlIGxpc3QsIGFuZAogICAgICAgICAgICAgICAgIyBhYm9ydCB0aGVzZSBzdGVwcy4KICAgICAgICAgICAgICAgIGVsaWYgZm9ybWF0dGluZ0VsZW1lbnQgbm90IGluIHNlbGYudHJlZS5vcGVuRWxlbWVudHM6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigiYWRvcHRpb24tYWdlbmN5LTEuMiIsIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQogICAgICAgICAgICAgICAgICAgIHNlbGYudHJlZS5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMucmVtb3ZlKGZvcm1hdHRpbmdFbGVtZW50KQogICAgICAgICAgICAgICAgICAgIHJldHVybgoKICAgICAgICAgICAgICAgICMgT3RoZXJ3aXNlLCBpZiB0aGVyZSBpcyBzdWNoIGEgbm9kZSwgYW5kIHRoYXQgbm9kZSBpcwogICAgICAgICAgICAgICAgIyBhbHNvIGluIHRoZSBzdGFjayBvZiBvcGVuIGVsZW1lbnRzLCBidXQgdGhlIGVsZW1lbnQKICAgICAgICAgICAgICAgICMgaXMgbm90IGluIHNjb3BlLCB0aGVuIHRoaXMgaXMgYSBwYXJzZSBlcnJvcjsgaWdub3JlCiAgICAgICAgICAgICAgICAjIHRoZSB0b2tlbiwgYW5kIGFib3J0IHRoZXNlIHN0ZXBzLgogICAgICAgICAgICAgICAgZWxpZiBub3Qgc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKGZvcm1hdHRpbmdFbGVtZW50Lm5hbWUpOgogICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoImFkb3B0aW9uLWFnZW5jeS00LjQiLCB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4KCiAgICAgICAgICAgICAgICAjIE90aGVyd2lzZSwgdGhlcmUgaXMgYSBmb3JtYXR0aW5nIGVsZW1lbnQgYW5kIHRoYXQKICAgICAgICAgICAgICAgICMgZWxlbWVudCBpcyBpbiB0aGUgc3RhY2sgYW5kIGlzIGluIHNjb3BlLiBJZiB0aGUKICAgICAgICAgICAgICAgICMgZWxlbWVudCBpcyBub3QgdGhlIGN1cnJlbnQgbm9kZSwgdGhpcyBpcyBhIHBhcnNlCiAgICAgICAgICAgICAgICAjIGVycm9yLiBJbiBhbnkgY2FzZSwgcHJvY2VlZCB3aXRoIHRoZSBhbGdvcml0aG0gYXMKICAgICAgICAgICAgICAgICMgd3JpdHRlbiBpbiB0aGUgZm9sbG93aW5nIHN0ZXBzLgogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBpZiBmb3JtYXR0aW5nRWxlbWVudCAhPSBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXToKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigiYWRvcHRpb24tYWdlbmN5LTEuMyIsIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQoKICAgICAgICAgICAgICAgICMgU3RlcCA1OgoKICAgICAgICAgICAgICAgICMgTGV0IHRoZSBmdXJ0aGVzdCBibG9jayBiZSB0aGUgdG9wbW9zdCBub2RlIGluIHRoZQogICAgICAgICAgICAgICAgIyBzdGFjayBvZiBvcGVuIGVsZW1lbnRzIHRoYXQgaXMgbG93ZXIgaW4gdGhlIHN0YWNrCiAgICAgICAgICAgICAgICAjIHRoYW4gdGhlIGZvcm1hdHRpbmcgZWxlbWVudCwgYW5kIGlzIGFuIGVsZW1lbnQgaW4KICAgICAgICAgICAgICAgICMgdGhlIHNwZWNpYWwgY2F0ZWdvcnkuIFRoZXJlIG1pZ2h0IG5vdCBiZSBvbmUuCiAgICAgICAgICAgICAgICBhZmVJbmRleCA9IHNlbGYudHJlZS5vcGVuRWxlbWVudHMuaW5kZXgoZm9ybWF0dGluZ0VsZW1lbnQpCiAgICAgICAgICAgICAgICBmdXJ0aGVzdEJsb2NrID0gTm9uZQogICAgICAgICAgICAgICAgZm9yIGVsZW1lbnQgaW4gc2VsZi50cmVlLm9wZW5FbGVtZW50c1thZmVJbmRleDpdOgogICAgICAgICAgICAgICAgICAgIGlmIGVsZW1lbnQubmFtZVR1cGxlIGluIHNwZWNpYWxFbGVtZW50czoKICAgICAgICAgICAgICAgICAgICAgICAgZnVydGhlc3RCbG9jayA9IGVsZW1lbnQKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKCiAgICAgICAgICAgICAgICAjIFN0ZXAgNjoKCiAgICAgICAgICAgICAgICAjIElmIHRoZXJlIGlzIG5vIGZ1cnRoZXN0IGJsb2NrLCB0aGVuIHRoZSBVQSBtdXN0CiAgICAgICAgICAgICAgICAjIGZpcnN0IHBvcCBhbGwgdGhlIG5vZGVzIGZyb20gdGhlIGJvdHRvbSBvZiB0aGUgc3RhY2sKICAgICAgICAgICAgICAgICMgb2Ygb3BlbiBlbGVtZW50cywgZnJvbSB0aGUgY3VycmVudCBub2RlIHVwIHRvIGFuZAogICAgICAgICAgICAgICAgIyBpbmNsdWRpbmcgdGhlIGZvcm1hdHRpbmcgZWxlbWVudCwgdGhlbiByZW1vdmUgdGhlCiAgICAgICAgICAgICAgICAjIGZvcm1hdHRpbmcgZWxlbWVudCBmcm9tIHRoZSBsaXN0IG9mIGFjdGl2ZQogICAgICAgICAgICAgICAgIyBmb3JtYXR0aW5nIGVsZW1lbnRzLCBhbmQgZmluYWxseSBhYm9ydCB0aGVzZSBzdGVwcy4KICAgICAgICAgICAgICAgIGlmIGZ1cnRoZXN0QmxvY2sgaXMgTm9uZToKICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICAgICAgICAgIHdoaWxlIGVsZW1lbnQgIT0gZm9ybWF0dGluZ0VsZW1lbnQ6CiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmVlLmFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cy5yZW1vdmUoZWxlbWVudCkKICAgICAgICAgICAgICAgICAgICByZXR1cm4KCiAgICAgICAgICAgICAgICAjIFN0ZXAgNwogICAgICAgICAgICAgICAgY29tbW9uQW5jZXN0b3IgPSBzZWxmLnRyZWUub3BlbkVsZW1lbnRzW2FmZUluZGV4IC0gMV0KCiAgICAgICAgICAgICAgICAjIFN0ZXAgODoKICAgICAgICAgICAgICAgICMgVGhlIGJvb2ttYXJrIGlzIHN1cHBvc2VkIHRvIGhlbHAgdXMgaWRlbnRpZnkgd2hlcmUgdG8gcmVpbnNlcnQKICAgICAgICAgICAgICAgICMgbm9kZXMgaW4gc3RlcCAxNS4gV2UgaGF2ZSB0byBlbnN1cmUgdGhhdCB3ZSByZWluc2VydCBub2RlcyBhZnRlcgogICAgICAgICAgICAgICAgIyB0aGUgbm9kZSBiZWZvcmUgdGhlIGFjdGl2ZSBmb3JtYXR0aW5nIGVsZW1lbnQuIE5vdGUgdGhlIGJvb2ttYXJrCiAgICAgICAgICAgICAgICAjIGNhbiBtb3ZlIGluIHN0ZXAgOS43CiAgICAgICAgICAgICAgICBib29rbWFyayA9IHNlbGYudHJlZS5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMuaW5kZXgoZm9ybWF0dGluZ0VsZW1lbnQpCgogICAgICAgICAgICAgICAgIyBTdGVwIDkKICAgICAgICAgICAgICAgIGxhc3ROb2RlID0gbm9kZSA9IGZ1cnRoZXN0QmxvY2sKICAgICAgICAgICAgICAgIGlubmVyTG9vcENvdW50ZXIgPSAwCgogICAgICAgICAgICAgICAgaW5kZXggPSBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLmluZGV4KG5vZGUpCiAgICAgICAgICAgICAgICB3aGlsZSBpbm5lckxvb3BDb3VudGVyIDwgMzoKICAgICAgICAgICAgICAgICAgICBpbm5lckxvb3BDb3VudGVyICs9IDEKICAgICAgICAgICAgICAgICAgICAjIE5vZGUgaXMgZWxlbWVudCBiZWZvcmUgbm9kZSBpbiBvcGVuIGVsZW1lbnRzCiAgICAgICAgICAgICAgICAgICAgaW5kZXggLT0gMQogICAgICAgICAgICAgICAgICAgIG5vZGUgPSBzZWxmLnRyZWUub3BlbkVsZW1lbnRzW2luZGV4XQogICAgICAgICAgICAgICAgICAgIGlmIG5vZGUgbm90IGluIHNlbGYudHJlZS5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHM6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucmVtb3ZlKG5vZGUpCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgICAgIyBTdGVwIDkuNgogICAgICAgICAgICAgICAgICAgIGlmIG5vZGUgPT0gZm9ybWF0dGluZ0VsZW1lbnQ6CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICAgICAgIyBTdGVwIDkuNwogICAgICAgICAgICAgICAgICAgIGlmIGxhc3ROb2RlID09IGZ1cnRoZXN0QmxvY2s6CiAgICAgICAgICAgICAgICAgICAgICAgIGJvb2ttYXJrID0gc2VsZi50cmVlLmFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cy5pbmRleChub2RlKSArIDEKICAgICAgICAgICAgICAgICAgICAjIFN0ZXAgOS44CiAgICAgICAgICAgICAgICAgICAgY2xvbmUgPSBub2RlLmNsb25lTm9kZSgpCiAgICAgICAgICAgICAgICAgICAgIyBSZXBsYWNlIG5vZGUgd2l0aCBjbG9uZQogICAgICAgICAgICAgICAgICAgIHNlbGYudHJlZS5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHNbCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJlZS5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMuaW5kZXgobm9kZSldID0gY2xvbmUKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLmluZGV4KG5vZGUpXSA9IGNsb25lCiAgICAgICAgICAgICAgICAgICAgbm9kZSA9IGNsb25lCiAgICAgICAgICAgICAgICAgICAgIyBTdGVwIDkuOQogICAgICAgICAgICAgICAgICAgICMgUmVtb3ZlIGxhc3ROb2RlIGZyb20gaXRzIHBhcmVudHMsIGlmIGFueQogICAgICAgICAgICAgICAgICAgIGlmIGxhc3ROb2RlLnBhcmVudDoKICAgICAgICAgICAgICAgICAgICAgICAgbGFzdE5vZGUucGFyZW50LnJlbW92ZUNoaWxkKGxhc3ROb2RlKQogICAgICAgICAgICAgICAgICAgIG5vZGUuYXBwZW5kQ2hpbGQobGFzdE5vZGUpCiAgICAgICAgICAgICAgICAgICAgIyBTdGVwIDkuMTAKICAgICAgICAgICAgICAgICAgICBsYXN0Tm9kZSA9IG5vZGUKCiAgICAgICAgICAgICAgICAjIFN0ZXAgMTAKICAgICAgICAgICAgICAgICMgRm9zdGVyIHBhcmVudCBsYXN0Tm9kZSBpZiBjb21tb25BbmNlc3RvciBpcyBhCiAgICAgICAgICAgICAgICAjIHRhYmxlLCB0Ym9keSwgdGZvb3QsIHRoZWFkLCBvciB0ciB3ZSBuZWVkIHRvIGZvc3RlcgogICAgICAgICAgICAgICAgIyBwYXJlbnQgdGhlIGxhc3ROb2RlCiAgICAgICAgICAgICAgICBpZiBsYXN0Tm9kZS5wYXJlbnQ6CiAgICAgICAgICAgICAgICAgICAgbGFzdE5vZGUucGFyZW50LnJlbW92ZUNoaWxkKGxhc3ROb2RlKQoKICAgICAgICAgICAgICAgIGlmIGNvbW1vbkFuY2VzdG9yLm5hbWUgaW4gZnJvemVuc2V0KCgidGFibGUiLCAidGJvZHkiLCAidGZvb3QiLCAidGhlYWQiLCAidHIiKSk6CiAgICAgICAgICAgICAgICAgICAgcGFyZW50LCBpbnNlcnRCZWZvcmUgPSBzZWxmLnRyZWUuZ2V0VGFibGVNaXNuZXN0ZWROb2RlUG9zaXRpb24oKQogICAgICAgICAgICAgICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUobGFzdE5vZGUsIGluc2VydEJlZm9yZSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgY29tbW9uQW5jZXN0b3IuYXBwZW5kQ2hpbGQobGFzdE5vZGUpCgogICAgICAgICAgICAgICAgIyBTdGVwIDExCiAgICAgICAgICAgICAgICBjbG9uZSA9IGZvcm1hdHRpbmdFbGVtZW50LmNsb25lTm9kZSgpCgogICAgICAgICAgICAgICAgIyBTdGVwIDEyCiAgICAgICAgICAgICAgICBmdXJ0aGVzdEJsb2NrLnJlcGFyZW50Q2hpbGRyZW4oY2xvbmUpCgogICAgICAgICAgICAgICAgIyBTdGVwIDEzCiAgICAgICAgICAgICAgICBmdXJ0aGVzdEJsb2NrLmFwcGVuZENoaWxkKGNsb25lKQoKICAgICAgICAgICAgICAgICMgU3RlcCAxNAogICAgICAgICAgICAgICAgc2VsZi50cmVlLmFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cy5yZW1vdmUoZm9ybWF0dGluZ0VsZW1lbnQpCiAgICAgICAgICAgICAgICBzZWxmLnRyZWUuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzLmluc2VydChib29rbWFyaywgY2xvbmUpCgogICAgICAgICAgICAgICAgIyBTdGVwIDE1CiAgICAgICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnJlbW92ZShmb3JtYXR0aW5nRWxlbWVudCkKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMuaW5zZXJ0KAogICAgICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMuaW5kZXgoZnVydGhlc3RCbG9jaykgKyAxLCBjbG9uZSkKCiAgICAgICAgZGVmIGVuZFRhZ0FwcGxldE1hcnF1ZWVPYmplY3Qoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZiBzZWxmLnRyZWUuZWxlbWVudEluU2NvcGUodG9rZW5bIm5hbWUiXSk6CiAgICAgICAgICAgICAgICBzZWxmLnRyZWUuZ2VuZXJhdGVJbXBsaWVkRW5kVGFncygpCiAgICAgICAgICAgIGlmIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWUgIT0gdG9rZW5bIm5hbWUiXToKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoImVuZC10YWctdG9vLWVhcmx5IiwgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCgogICAgICAgICAgICBpZiBzZWxmLnRyZWUuZWxlbWVudEluU2NvcGUodG9rZW5bIm5hbWUiXSk6CiAgICAgICAgICAgICAgICBlbGVtZW50ID0gc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICAgICAgd2hpbGUgZWxlbWVudC5uYW1lICE9IHRva2VuWyJuYW1lIl06CiAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9IHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5jbGVhckFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cygpCgogICAgICAgIGRlZiBlbmRUYWdCcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtZW5kLXRhZy10cmVhdGVkLWFzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Im9yaWdpbmFsTmFtZSI6ICJiciIsICJuZXdOYW1lIjogImJyIGVsZW1lbnQifSkKICAgICAgICAgICAgc2VsZi50cmVlLnJlY29uc3RydWN0QWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzKCkKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQoaW1wbGllZFRhZ1Rva2VuKCJiciIsICJTdGFydFRhZyIpKQogICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCgogICAgICAgIGRlZiBlbmRUYWdPdGhlcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGZvciBub2RlIGluIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbOjotMV06CiAgICAgICAgICAgICAgICBpZiBub2RlLm5hbWUgPT0gdG9rZW5bIm5hbWUiXToKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyZWUuZ2VuZXJhdGVJbXBsaWVkRW5kVGFncyhleGNsdWRlPXRva2VuWyJuYW1lIl0pCiAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZSAhPSB0b2tlblsibmFtZSJdOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLWVuZC10YWciLCB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKICAgICAgICAgICAgICAgICAgICB3aGlsZSBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpICE9IG5vZGU6CiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBpZiBub2RlLm5hbWVUdXBsZSBpbiBzcGVjaWFsRWxlbWVudHM6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtZW5kLXRhZyIsIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQogICAgICAgICAgICAgICAgICAgICAgICBicmVhawoKICAgIGNsYXNzIFRleHRQaGFzZShQaGFzZSk6CiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSk6CiAgICAgICAgICAgIFBoYXNlLl9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSkKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0hhbmRsZXIgPSBfdXRpbHMuTWV0aG9kRGlzcGF0Y2hlcihbXSkKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0hhbmRsZXIuZGVmYXVsdCA9IHNlbGYuc3RhcnRUYWdPdGhlcgogICAgICAgICAgICBzZWxmLmVuZFRhZ0hhbmRsZXIgPSBfdXRpbHMuTWV0aG9kRGlzcGF0Y2hlcihbCiAgICAgICAgICAgICAgICAoInNjcmlwdCIsIHNlbGYuZW5kVGFnU2NyaXB0KV0pCiAgICAgICAgICAgIHNlbGYuZW5kVGFnSGFuZGxlci5kZWZhdWx0ID0gc2VsZi5lbmRUYWdPdGhlcgoKICAgICAgICBkZWYgcHJvY2Vzc0NoYXJhY3RlcnMoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0VGV4dCh0b2tlblsiZGF0YSJdKQoKICAgICAgICBkZWYgcHJvY2Vzc0VPRihzZWxmKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigiZXhwZWN0ZWQtbmFtZWQtY2xvc2luZy10YWctYnV0LWdvdC1lb2YiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWV9KQogICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIub3JpZ2luYWxQaGFzZQogICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICAgICBkZWYgc3RhcnRUYWdPdGhlcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGFzc2VydCBGYWxzZSwgIlRyaWVkIHRvIHByb2Nlc3Mgc3RhcnQgdGFnICVzIGluIFJDREFUQS9SQVdURVhUIG1vZGUiICUgdG9rZW5bJ25hbWUnXQoKICAgICAgICBkZWYgZW5kVGFnU2NyaXB0KHNlbGYsIHRva2VuKToKICAgICAgICAgICAgbm9kZSA9IHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgYXNzZXJ0IG5vZGUubmFtZSA9PSAic2NyaXB0IgogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYucGFyc2VyLm9yaWdpbmFsUGhhc2UKICAgICAgICAgICAgIyBUaGUgcmVzdCBvZiB0aGlzIG1ldGhvZCBpcyBhbGwgc3R1ZmYgdGhhdCBvbmx5IGhhcHBlbnMgaWYKICAgICAgICAgICAgIyBkb2N1bWVudC53cml0ZSB3b3JrcwoKICAgICAgICBkZWYgZW5kVGFnT3RoZXIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIub3JpZ2luYWxQaGFzZQoKICAgIGNsYXNzIEluVGFibGVQaGFzZShQaGFzZSk6CiAgICAgICAgIyBodHRwOi8vd3d3LndoYXR3Zy5vcmcvc3BlY3Mvd2ViLWFwcHMvY3VycmVudC13b3JrLyNpbi10YWJsZQogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpOgogICAgICAgICAgICBQaGFzZS5fX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpCiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIYW5kbGVyID0gX3V0aWxzLk1ldGhvZERpc3BhdGNoZXIoWwogICAgICAgICAgICAgICAgKCJodG1sIiwgc2VsZi5zdGFydFRhZ0h0bWwpLAogICAgICAgICAgICAgICAgKCJjYXB0aW9uIiwgc2VsZi5zdGFydFRhZ0NhcHRpb24pLAogICAgICAgICAgICAgICAgKCJjb2xncm91cCIsIHNlbGYuc3RhcnRUYWdDb2xncm91cCksCiAgICAgICAgICAgICAgICAoImNvbCIsIHNlbGYuc3RhcnRUYWdDb2wpLAogICAgICAgICAgICAgICAgKCgidGJvZHkiLCAidGZvb3QiLCAidGhlYWQiKSwgc2VsZi5zdGFydFRhZ1Jvd0dyb3VwKSwKICAgICAgICAgICAgICAgICgoInRkIiwgInRoIiwgInRyIiksIHNlbGYuc3RhcnRUYWdJbXBseVRib2R5KSwKICAgICAgICAgICAgICAgICgidGFibGUiLCBzZWxmLnN0YXJ0VGFnVGFibGUpLAogICAgICAgICAgICAgICAgKCgic3R5bGUiLCAic2NyaXB0IiksIHNlbGYuc3RhcnRUYWdTdHlsZVNjcmlwdCksCiAgICAgICAgICAgICAgICAoImlucHV0Iiwgc2VsZi5zdGFydFRhZ0lucHV0KSwKICAgICAgICAgICAgICAgICgiZm9ybSIsIHNlbGYuc3RhcnRUYWdGb3JtKQogICAgICAgICAgICBdKQogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnSGFuZGxlci5kZWZhdWx0ID0gc2VsZi5zdGFydFRhZ090aGVyCgogICAgICAgICAgICBzZWxmLmVuZFRhZ0hhbmRsZXIgPSBfdXRpbHMuTWV0aG9kRGlzcGF0Y2hlcihbCiAgICAgICAgICAgICAgICAoInRhYmxlIiwgc2VsZi5lbmRUYWdUYWJsZSksCiAgICAgICAgICAgICAgICAoKCJib2R5IiwgImNhcHRpb24iLCAiY29sIiwgImNvbGdyb3VwIiwgImh0bWwiLCAidGJvZHkiLCAidGQiLAogICAgICAgICAgICAgICAgICAidGZvb3QiLCAidGgiLCAidGhlYWQiLCAidHIiKSwgc2VsZi5lbmRUYWdJZ25vcmUpCiAgICAgICAgICAgIF0pCiAgICAgICAgICAgIHNlbGYuZW5kVGFnSGFuZGxlci5kZWZhdWx0ID0gc2VsZi5lbmRUYWdPdGhlcgoKICAgICAgICAjIGhlbHBlciBtZXRob2RzCiAgICAgICAgZGVmIGNsZWFyU3RhY2tUb1RhYmxlQ29udGV4dChzZWxmKToKICAgICAgICAgICAgIyAiY2xlYXIgdGhlIHN0YWNrIGJhY2sgdG8gYSB0YWJsZSBjb250ZXh0IgogICAgICAgICAgICB3aGlsZSBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lIG5vdCBpbiAoInRhYmxlIiwgImh0bWwiKToKICAgICAgICAgICAgICAgICMgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1pbXBsaWVkLWVuZC10YWctaW4tdGFibGUiLAogICAgICAgICAgICAgICAgIyAgeyJuYW1lIjogIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWV9KQogICAgICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICAjIFdoZW4gdGhlIGN1cnJlbnQgbm9kZSBpcyA8aHRtbD4gaXQncyBhbiBpbm5lckhUTUwgY2FzZQoKICAgICAgICAjIHByb2Nlc3NpbmcgbWV0aG9kcwogICAgICAgIGRlZiBwcm9jZXNzRU9GKHNlbGYpOgogICAgICAgICAgICBpZiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lICE9ICJodG1sIjoKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoImVvZi1pbi10YWJsZSIpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBhc3NlcnQgc2VsZi5wYXJzZXIuaW5uZXJIVE1MCiAgICAgICAgICAgICMgU3RvcCBwYXJzaW5nCgogICAgICAgIGRlZiBwcm9jZXNzU3BhY2VDaGFyYWN0ZXJzKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgb3JpZ2luYWxQaGFzZSA9IHNlbGYucGFyc2VyLnBoYXNlCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2VzWyJpblRhYmxlVGV4dCJdCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlLm9yaWdpbmFsUGhhc2UgPSBvcmlnaW5hbFBoYXNlCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlLnByb2Nlc3NTcGFjZUNoYXJhY3RlcnModG9rZW4pCgogICAgICAgIGRlZiBwcm9jZXNzQ2hhcmFjdGVycyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIG9yaWdpbmFsUGhhc2UgPSBzZWxmLnBhcnNlci5waGFzZQogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYucGFyc2VyLnBoYXNlc1siaW5UYWJsZVRleHQiXQogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZS5vcmlnaW5hbFBoYXNlID0gb3JpZ2luYWxQaGFzZQogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZS5wcm9jZXNzQ2hhcmFjdGVycyh0b2tlbikKCiAgICAgICAgZGVmIGluc2VydFRleHQoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICAjIElmIHdlIGdldCBoZXJlIHRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlcgogICAgICAgICAgICAjIERvIHRoZSB0YWJsZSBtYWdpYyEKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEZyb21UYWJsZSA9IFRydWUKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2VzWyJpbkJvZHkiXS5wcm9jZXNzQ2hhcmFjdGVycyh0b2tlbikKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEZyb21UYWJsZSA9IEZhbHNlCgogICAgICAgIGRlZiBzdGFydFRhZ0NhcHRpb24oc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLmNsZWFyU3RhY2tUb1RhYmxlQ29udGV4dCgpCiAgICAgICAgICAgIHNlbGYudHJlZS5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMuYXBwZW5kKE1hcmtlcikKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2VzWyJpbkNhcHRpb24iXQoKICAgICAgICBkZWYgc3RhcnRUYWdDb2xncm91cChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYuY2xlYXJTdGFja1RvVGFibGVDb250ZXh0KCkKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2VzWyJpbkNvbHVtbkdyb3VwIl0KCiAgICAgICAgZGVmIHN0YXJ0VGFnQ29sKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0NvbGdyb3VwKGltcGxpZWRUYWdUb2tlbigiY29sZ3JvdXAiLCAiU3RhcnRUYWciKSkKICAgICAgICAgICAgcmV0dXJuIHRva2VuCgogICAgICAgIGRlZiBzdGFydFRhZ1Jvd0dyb3VwKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5jbGVhclN0YWNrVG9UYWJsZUNvbnRleHQoKQogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UgPSBzZWxmLnBhcnNlci5waGFzZXNbImluVGFibGVCb2R5Il0KCiAgICAgICAgZGVmIHN0YXJ0VGFnSW1wbHlUYm9keShzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdSb3dHcm91cChpbXBsaWVkVGFnVG9rZW4oInRib2R5IiwgIlN0YXJ0VGFnIikpCiAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgICAgICBkZWYgc3RhcnRUYWdUYWJsZShzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtc3RhcnQtdGFnLWltcGxpZXMtZW5kLXRhZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJzdGFydE5hbWUiOiAidGFibGUiLCAiZW5kTmFtZSI6ICJ0YWJsZSJ9KQogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZS5wcm9jZXNzRW5kVGFnKGltcGxpZWRUYWdUb2tlbigidGFibGUiKSkKICAgICAgICAgICAgaWYgbm90IHNlbGYucGFyc2VyLmlubmVySFRNTDoKICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgICAgICBkZWYgc3RhcnRUYWdTdHlsZVNjcmlwdChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlci5waGFzZXNbImluSGVhZCJdLnByb2Nlc3NTdGFydFRhZyh0b2tlbikKCiAgICAgICAgZGVmIHN0YXJ0VGFnSW5wdXQoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZiAoInR5cGUiIGluIHRva2VuWyJkYXRhIl0gYW5kCiAgICAgICAgICAgICAgICAgICAgdG9rZW5bImRhdGEiXVsidHlwZSJdLnRyYW5zbGF0ZShhc2NpaVVwcGVyMkxvd2VyKSA9PSAiaGlkZGVuIik6CiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLWhpZGRlbi1pbnB1dC1pbi10YWJsZSIpCiAgICAgICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKICAgICAgICAgICAgICAgICMgWFhYIGFzc29jaWF0ZSB3aXRoIGZvcm0KICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdPdGhlcih0b2tlbikKCiAgICAgICAgZGVmIHN0YXJ0VGFnRm9ybShzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtZm9ybS1pbi10YWJsZSIpCiAgICAgICAgICAgIGlmIHNlbGYudHJlZS5mb3JtUG9pbnRlciBpcyBOb25lOgogICAgICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCiAgICAgICAgICAgICAgICBzZWxmLnRyZWUuZm9ybVBvaW50ZXIgPSBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXQogICAgICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQoKICAgICAgICBkZWYgc3RhcnRUYWdPdGhlcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtc3RhcnQtdGFnLWltcGxpZXMtdGFibGUtdm9vZG9vIiwgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCiAgICAgICAgICAgICMgRG8gdGhlIHRhYmxlIG1hZ2ljIQogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RnJvbVRhYmxlID0gVHJ1ZQogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZXNbImluQm9keSJdLnByb2Nlc3NTdGFydFRhZyh0b2tlbikKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEZyb21UYWJsZSA9IEZhbHNlCgogICAgICAgIGRlZiBlbmRUYWdUYWJsZShzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlmIHNlbGYudHJlZS5lbGVtZW50SW5TY29wZSgidGFibGUiLCB2YXJpYW50PSJ0YWJsZSIpOgogICAgICAgICAgICAgICAgc2VsZi50cmVlLmdlbmVyYXRlSW1wbGllZEVuZFRhZ3MoKQogICAgICAgICAgICAgICAgaWYgc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZSAhPSAidGFibGUiOgogICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoImVuZC10YWctdG9vLWVhcmx5LW5hbWVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiZ290TmFtZSI6ICJ0YWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkTmFtZSI6IHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWV9KQogICAgICAgICAgICAgICAgd2hpbGUgc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZSAhPSAidGFibGUiOgogICAgICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnJlc2V0SW5zZXJ0aW9uTW9kZSgpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIGlubmVySFRNTCBjYXNlCiAgICAgICAgICAgICAgICBhc3NlcnQgc2VsZi5wYXJzZXIuaW5uZXJIVE1MCiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCkKCiAgICAgICAgZGVmIGVuZFRhZ0lnbm9yZShzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtZW5kLXRhZyIsIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQoKICAgICAgICBkZWYgZW5kVGFnT3RoZXIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLWVuZC10YWctaW1wbGllcy10YWJsZS12b29kb28iLCB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKICAgICAgICAgICAgIyBEbyB0aGUgdGFibGUgbWFnaWMhCiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRGcm9tVGFibGUgPSBUcnVlCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlc1siaW5Cb2R5Il0ucHJvY2Vzc0VuZFRhZyh0b2tlbikKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEZyb21UYWJsZSA9IEZhbHNlCgogICAgY2xhc3MgSW5UYWJsZVRleHRQaGFzZShQaGFzZSk6CiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSk6CiAgICAgICAgICAgIFBoYXNlLl9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSkKICAgICAgICAgICAgc2VsZi5vcmlnaW5hbFBoYXNlID0gTm9uZQogICAgICAgICAgICBzZWxmLmNoYXJhY3RlclRva2VucyA9IFtdCgogICAgICAgIGRlZiBmbHVzaENoYXJhY3RlcnMoc2VsZik6CiAgICAgICAgICAgIGRhdGEgPSAiIi5qb2luKFtpdGVtWyJkYXRhIl0gZm9yIGl0ZW0gaW4gc2VsZi5jaGFyYWN0ZXJUb2tlbnNdKQogICAgICAgICAgICBpZiBhbnkoW2l0ZW0gbm90IGluIHNwYWNlQ2hhcmFjdGVycyBmb3IgaXRlbSBpbiBkYXRhXSk6CiAgICAgICAgICAgICAgICB0b2tlbiA9IHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOiBkYXRhfQogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2VzWyJpblRhYmxlIl0uaW5zZXJ0VGV4dCh0b2tlbikKICAgICAgICAgICAgZWxpZiBkYXRhOgogICAgICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydFRleHQoZGF0YSkKICAgICAgICAgICAgc2VsZi5jaGFyYWN0ZXJUb2tlbnMgPSBbXQoKICAgICAgICBkZWYgcHJvY2Vzc0NvbW1lbnQoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLmZsdXNoQ2hhcmFjdGVycygpCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5vcmlnaW5hbFBoYXNlCiAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgICAgICBkZWYgcHJvY2Vzc0VPRihzZWxmKToKICAgICAgICAgICAgc2VsZi5mbHVzaENoYXJhY3RlcnMoKQogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYub3JpZ2luYWxQaGFzZQogICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICAgICBkZWYgcHJvY2Vzc0NoYXJhY3RlcnMoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZiB0b2tlblsiZGF0YSJdID09ICJcdTAwMDAiOgogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIHNlbGYuY2hhcmFjdGVyVG9rZW5zLmFwcGVuZCh0b2tlbikKCiAgICAgICAgZGVmIHByb2Nlc3NTcGFjZUNoYXJhY3RlcnMoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICAjIHByZXR0eSBzdXJlIHdlIHNob3VsZCBuZXZlciByZWFjaCBoZXJlCiAgICAgICAgICAgIHNlbGYuY2hhcmFjdGVyVG9rZW5zLmFwcGVuZCh0b2tlbikKICAgICMgICAgICAgIGFzc2VydCBGYWxzZQoKICAgICAgICBkZWYgcHJvY2Vzc1N0YXJ0VGFnKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5mbHVzaENoYXJhY3RlcnMoKQogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYub3JpZ2luYWxQaGFzZQogICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICAgICAgZGVmIHByb2Nlc3NFbmRUYWcoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLmZsdXNoQ2hhcmFjdGVycygpCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5vcmlnaW5hbFBoYXNlCiAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgIGNsYXNzIEluQ2FwdGlvblBoYXNlKFBoYXNlKToKICAgICAgICAjIGh0dHA6Ly93d3cud2hhdHdnLm9yZy9zcGVjcy93ZWItYXBwcy9jdXJyZW50LXdvcmsvI2luLWNhcHRpb24KICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgcGFyc2VyLCB0cmVlKToKICAgICAgICAgICAgUGhhc2UuX19pbml0X18oc2VsZiwgcGFyc2VyLCB0cmVlKQoKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0hhbmRsZXIgPSBfdXRpbHMuTWV0aG9kRGlzcGF0Y2hlcihbCiAgICAgICAgICAgICAgICAoImh0bWwiLCBzZWxmLnN0YXJ0VGFnSHRtbCksCiAgICAgICAgICAgICAgICAoKCJjYXB0aW9uIiwgImNvbCIsICJjb2xncm91cCIsICJ0Ym9keSIsICJ0ZCIsICJ0Zm9vdCIsICJ0aCIsCiAgICAgICAgICAgICAgICAgICJ0aGVhZCIsICJ0ciIpLCBzZWxmLnN0YXJ0VGFnVGFibGVFbGVtZW50KQogICAgICAgICAgICBdKQogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnSGFuZGxlci5kZWZhdWx0ID0gc2VsZi5zdGFydFRhZ090aGVyCgogICAgICAgICAgICBzZWxmLmVuZFRhZ0hhbmRsZXIgPSBfdXRpbHMuTWV0aG9kRGlzcGF0Y2hlcihbCiAgICAgICAgICAgICAgICAoImNhcHRpb24iLCBzZWxmLmVuZFRhZ0NhcHRpb24pLAogICAgICAgICAgICAgICAgKCJ0YWJsZSIsIHNlbGYuZW5kVGFnVGFibGUpLAogICAgICAgICAgICAgICAgKCgiYm9keSIsICJjb2wiLCAiY29sZ3JvdXAiLCAiaHRtbCIsICJ0Ym9keSIsICJ0ZCIsICJ0Zm9vdCIsICJ0aCIsCiAgICAgICAgICAgICAgICAgICJ0aGVhZCIsICJ0ciIpLCBzZWxmLmVuZFRhZ0lnbm9yZSkKICAgICAgICAgICAgXSkKICAgICAgICAgICAgc2VsZi5lbmRUYWdIYW5kbGVyLmRlZmF1bHQgPSBzZWxmLmVuZFRhZ090aGVyCgogICAgICAgIGRlZiBpZ25vcmVFbmRUYWdDYXB0aW9uKHNlbGYpOgogICAgICAgICAgICByZXR1cm4gbm90IHNlbGYudHJlZS5lbGVtZW50SW5TY29wZSgiY2FwdGlvbiIsIHZhcmlhbnQ9InRhYmxlIikKCiAgICAgICAgZGVmIHByb2Nlc3NFT0Yoc2VsZik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlc1siaW5Cb2R5Il0ucHJvY2Vzc0VPRigpCgogICAgICAgIGRlZiBwcm9jZXNzQ2hhcmFjdGVycyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlci5waGFzZXNbImluQm9keSJdLnByb2Nlc3NDaGFyYWN0ZXJzKHRva2VuKQoKICAgICAgICBkZWYgc3RhcnRUYWdUYWJsZUVsZW1lbnQoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCkKICAgICAgICAgICAgIyBYWFggSGF2ZSB0byBkdXBsaWNhdGUgbG9naWMgaGVyZSB0byBmaW5kIG91dCBpZiB0aGUgdGFnIGlzIGlnbm9yZWQKICAgICAgICAgICAgaWdub3JlRW5kVGFnID0gc2VsZi5pZ25vcmVFbmRUYWdDYXB0aW9uKCkKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UucHJvY2Vzc0VuZFRhZyhpbXBsaWVkVGFnVG9rZW4oImNhcHRpb24iKSkKICAgICAgICAgICAgaWYgbm90IGlnbm9yZUVuZFRhZzoKICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgICAgICBkZWYgc3RhcnRUYWdPdGhlcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlci5waGFzZXNbImluQm9keSJdLnByb2Nlc3NTdGFydFRhZyh0b2tlbikKCiAgICAgICAgZGVmIGVuZFRhZ0NhcHRpb24oc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZiBub3Qgc2VsZi5pZ25vcmVFbmRUYWdDYXB0aW9uKCk6CiAgICAgICAgICAgICAgICAjIEFUIHRoaXMgY29kZSBpcyBxdWl0ZSBzaW1pbGFyIHRvIGVuZFRhZ1RhYmxlIGluICJJblRhYmxlIgogICAgICAgICAgICAgICAgc2VsZi50cmVlLmdlbmVyYXRlSW1wbGllZEVuZFRhZ3MoKQogICAgICAgICAgICAgICAgaWYgc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZSAhPSAiY2FwdGlvbiI6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigiZXhwZWN0ZWQtb25lLWVuZC10YWctYnV0LWdvdC1hbm90aGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiZ290TmFtZSI6ICJjYXB0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWROYW1lIjogc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZX0pCiAgICAgICAgICAgICAgICB3aGlsZSBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lICE9ICJjYXB0aW9uIjoKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgICAgICBzZWxmLnRyZWUuY2xlYXJBY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMoKQogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UgPSBzZWxmLnBhcnNlci5waGFzZXNbImluVGFibGUiXQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBpbm5lckhUTUwgY2FzZQogICAgICAgICAgICAgICAgYXNzZXJ0IHNlbGYucGFyc2VyLmlubmVySFRNTAogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigpCgogICAgICAgIGRlZiBlbmRUYWdUYWJsZShzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoKQogICAgICAgICAgICBpZ25vcmVFbmRUYWcgPSBzZWxmLmlnbm9yZUVuZFRhZ0NhcHRpb24oKQogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZS5wcm9jZXNzRW5kVGFnKGltcGxpZWRUYWdUb2tlbigiY2FwdGlvbiIpKQogICAgICAgICAgICBpZiBub3QgaWdub3JlRW5kVGFnOgogICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuCgogICAgICAgIGRlZiBlbmRUYWdJZ25vcmUoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLWVuZC10YWciLCB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKCiAgICAgICAgZGVmIGVuZFRhZ090aGVyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VyLnBoYXNlc1siaW5Cb2R5Il0ucHJvY2Vzc0VuZFRhZyh0b2tlbikKCiAgICBjbGFzcyBJbkNvbHVtbkdyb3VwUGhhc2UoUGhhc2UpOgogICAgICAgICMgaHR0cDovL3d3dy53aGF0d2cub3JnL3NwZWNzL3dlYi1hcHBzL2N1cnJlbnQtd29yay8jaW4tY29sdW1uCgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpOgogICAgICAgICAgICBQaGFzZS5fX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpCgogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnSGFuZGxlciA9IF91dGlscy5NZXRob2REaXNwYXRjaGVyKFsKICAgICAgICAgICAgICAgICgiaHRtbCIsIHNlbGYuc3RhcnRUYWdIdG1sKSwKICAgICAgICAgICAgICAgICgiY29sIiwgc2VsZi5zdGFydFRhZ0NvbCkKICAgICAgICAgICAgXSkKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0hhbmRsZXIuZGVmYXVsdCA9IHNlbGYuc3RhcnRUYWdPdGhlcgoKICAgICAgICAgICAgc2VsZi5lbmRUYWdIYW5kbGVyID0gX3V0aWxzLk1ldGhvZERpc3BhdGNoZXIoWwogICAgICAgICAgICAgICAgKCJjb2xncm91cCIsIHNlbGYuZW5kVGFnQ29sZ3JvdXApLAogICAgICAgICAgICAgICAgKCJjb2wiLCBzZWxmLmVuZFRhZ0NvbCkKICAgICAgICAgICAgXSkKICAgICAgICAgICAgc2VsZi5lbmRUYWdIYW5kbGVyLmRlZmF1bHQgPSBzZWxmLmVuZFRhZ090aGVyCgogICAgICAgIGRlZiBpZ25vcmVFbmRUYWdDb2xncm91cChzZWxmKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWUgPT0gImh0bWwiCgogICAgICAgIGRlZiBwcm9jZXNzRU9GKHNlbGYpOgogICAgICAgICAgICBpZiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lID09ICJodG1sIjoKICAgICAgICAgICAgICAgIGFzc2VydCBzZWxmLnBhcnNlci5pbm5lckhUTUwKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgaWdub3JlRW5kVGFnID0gc2VsZi5pZ25vcmVFbmRUYWdDb2xncm91cCgpCiAgICAgICAgICAgICAgICBzZWxmLmVuZFRhZ0NvbGdyb3VwKGltcGxpZWRUYWdUb2tlbigiY29sZ3JvdXAiKSkKICAgICAgICAgICAgICAgIGlmIG5vdCBpZ25vcmVFbmRUYWc6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICAgICAgZGVmIHByb2Nlc3NDaGFyYWN0ZXJzKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWdub3JlRW5kVGFnID0gc2VsZi5pZ25vcmVFbmRUYWdDb2xncm91cCgpCiAgICAgICAgICAgIHNlbGYuZW5kVGFnQ29sZ3JvdXAoaW1wbGllZFRhZ1Rva2VuKCJjb2xncm91cCIpKQogICAgICAgICAgICBpZiBub3QgaWdub3JlRW5kVGFnOgogICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuCgogICAgICAgIGRlZiBzdGFydFRhZ0NvbChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRFbGVtZW50KHRva2VuKQogICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgIHRva2VuWyJzZWxmQ2xvc2luZ0Fja25vd2xlZGdlZCJdID0gVHJ1ZQoKICAgICAgICBkZWYgc3RhcnRUYWdPdGhlcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlnbm9yZUVuZFRhZyA9IHNlbGYuaWdub3JlRW5kVGFnQ29sZ3JvdXAoKQogICAgICAgICAgICBzZWxmLmVuZFRhZ0NvbGdyb3VwKGltcGxpZWRUYWdUb2tlbigiY29sZ3JvdXAiKSkKICAgICAgICAgICAgaWYgbm90IGlnbm9yZUVuZFRhZzoKICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgICAgICBkZWYgZW5kVGFnQ29sZ3JvdXAoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZiBzZWxmLmlnbm9yZUVuZFRhZ0NvbGdyb3VwKCk6CiAgICAgICAgICAgICAgICAjIGlubmVySFRNTCBjYXNlCiAgICAgICAgICAgICAgICBhc3NlcnQgc2VsZi5wYXJzZXIuaW5uZXJIVE1MCiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2VzWyJpblRhYmxlIl0KCiAgICAgICAgZGVmIGVuZFRhZ0NvbChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoIm5vLWVuZC10YWciLCB7Im5hbWUiOiAiY29sIn0pCgogICAgICAgIGRlZiBlbmRUYWdPdGhlcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlnbm9yZUVuZFRhZyA9IHNlbGYuaWdub3JlRW5kVGFnQ29sZ3JvdXAoKQogICAgICAgICAgICBzZWxmLmVuZFRhZ0NvbGdyb3VwKGltcGxpZWRUYWdUb2tlbigiY29sZ3JvdXAiKSkKICAgICAgICAgICAgaWYgbm90IGlnbm9yZUVuZFRhZzoKICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgIGNsYXNzIEluVGFibGVCb2R5UGhhc2UoUGhhc2UpOgogICAgICAgICMgaHR0cDovL3d3dy53aGF0d2cub3JnL3NwZWNzL3dlYi1hcHBzL2N1cnJlbnQtd29yay8jaW4tdGFibGUwCiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSk6CiAgICAgICAgICAgIFBoYXNlLl9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSkKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0hhbmRsZXIgPSBfdXRpbHMuTWV0aG9kRGlzcGF0Y2hlcihbCiAgICAgICAgICAgICAgICAoImh0bWwiLCBzZWxmLnN0YXJ0VGFnSHRtbCksCiAgICAgICAgICAgICAgICAoInRyIiwgc2VsZi5zdGFydFRhZ1RyKSwKICAgICAgICAgICAgICAgICgoInRkIiwgInRoIiksIHNlbGYuc3RhcnRUYWdUYWJsZUNlbGwpLAogICAgICAgICAgICAgICAgKCgiY2FwdGlvbiIsICJjb2wiLCAiY29sZ3JvdXAiLCAidGJvZHkiLCAidGZvb3QiLCAidGhlYWQiKSwKICAgICAgICAgICAgICAgICBzZWxmLnN0YXJ0VGFnVGFibGVPdGhlcikKICAgICAgICAgICAgXSkKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0hhbmRsZXIuZGVmYXVsdCA9IHNlbGYuc3RhcnRUYWdPdGhlcgoKICAgICAgICAgICAgc2VsZi5lbmRUYWdIYW5kbGVyID0gX3V0aWxzLk1ldGhvZERpc3BhdGNoZXIoWwogICAgICAgICAgICAgICAgKCgidGJvZHkiLCAidGZvb3QiLCAidGhlYWQiKSwgc2VsZi5lbmRUYWdUYWJsZVJvd0dyb3VwKSwKICAgICAgICAgICAgICAgICgidGFibGUiLCBzZWxmLmVuZFRhZ1RhYmxlKSwKICAgICAgICAgICAgICAgICgoImJvZHkiLCAiY2FwdGlvbiIsICJjb2wiLCAiY29sZ3JvdXAiLCAiaHRtbCIsICJ0ZCIsICJ0aCIsCiAgICAgICAgICAgICAgICAgICJ0ciIpLCBzZWxmLmVuZFRhZ0lnbm9yZSkKICAgICAgICAgICAgXSkKICAgICAgICAgICAgc2VsZi5lbmRUYWdIYW5kbGVyLmRlZmF1bHQgPSBzZWxmLmVuZFRhZ090aGVyCgogICAgICAgICMgaGVscGVyIG1ldGhvZHMKICAgICAgICBkZWYgY2xlYXJTdGFja1RvVGFibGVCb2R5Q29udGV4dChzZWxmKToKICAgICAgICAgICAgd2hpbGUgc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZSBub3QgaW4gKCJ0Ym9keSIsICJ0Zm9vdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlYWQiLCAiaHRtbCIpOgogICAgICAgICAgICAgICAgIyBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLWltcGxpZWQtZW5kLXRhZy1pbi10YWJsZSIsCiAgICAgICAgICAgICAgICAjICB7Im5hbWUiOiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lfSkKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgaWYgc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZSA9PSAiaHRtbCI6CiAgICAgICAgICAgICAgICBhc3NlcnQgc2VsZi5wYXJzZXIuaW5uZXJIVE1MCgogICAgICAgICMgdGhlIHJlc3QKICAgICAgICBkZWYgcHJvY2Vzc0VPRihzZWxmKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2VzWyJpblRhYmxlIl0ucHJvY2Vzc0VPRigpCgogICAgICAgIGRlZiBwcm9jZXNzU3BhY2VDaGFyYWN0ZXJzKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VyLnBoYXNlc1siaW5UYWJsZSJdLnByb2Nlc3NTcGFjZUNoYXJhY3RlcnModG9rZW4pCgogICAgICAgIGRlZiBwcm9jZXNzQ2hhcmFjdGVycyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlci5waGFzZXNbImluVGFibGUiXS5wcm9jZXNzQ2hhcmFjdGVycyh0b2tlbikKCiAgICAgICAgZGVmIHN0YXJ0VGFnVHIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLmNsZWFyU3RhY2tUb1RhYmxlQm9keUNvbnRleHQoKQogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UgPSBzZWxmLnBhcnNlci5waGFzZXNbImluUm93Il0KCiAgICAgICAgZGVmIHN0YXJ0VGFnVGFibGVDZWxsKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1jZWxsLWluLXRhYmxlLWJvZHkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnVHIoaW1wbGllZFRhZ1Rva2VuKCJ0ciIsICJTdGFydFRhZyIpKQogICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICAgICAgZGVmIHN0YXJ0VGFnVGFibGVPdGhlcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgICMgWFhYIEFUIEFueSBpZGVhcyBvbiBob3cgdG8gc2hhcmUgdGhpcyB3aXRoIGVuZFRhZ1RhYmxlPwogICAgICAgICAgICBpZiAoc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKCJ0Ym9keSIsIHZhcmlhbnQ9InRhYmxlIikgb3IKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5lbGVtZW50SW5TY29wZSgidGhlYWQiLCB2YXJpYW50PSJ0YWJsZSIpIG9yCiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKCJ0Zm9vdCIsIHZhcmlhbnQ9InRhYmxlIikpOgogICAgICAgICAgICAgICAgc2VsZi5jbGVhclN0YWNrVG9UYWJsZUJvZHlDb250ZXh0KCkKICAgICAgICAgICAgICAgIHNlbGYuZW5kVGFnVGFibGVSb3dHcm91cCgKICAgICAgICAgICAgICAgICAgICBpbXBsaWVkVGFnVG9rZW4oc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZSkpCiAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW4KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgaW5uZXJIVE1MIGNhc2UKICAgICAgICAgICAgICAgIGFzc2VydCBzZWxmLnBhcnNlci5pbm5lckhUTUwKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoKQoKICAgICAgICBkZWYgc3RhcnRUYWdPdGhlcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlci5waGFzZXNbImluVGFibGUiXS5wcm9jZXNzU3RhcnRUYWcodG9rZW4pCgogICAgICAgIGRlZiBlbmRUYWdUYWJsZVJvd0dyb3VwKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWYgc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKHRva2VuWyJuYW1lIl0sIHZhcmlhbnQ9InRhYmxlIik6CiAgICAgICAgICAgICAgICBzZWxmLmNsZWFyU3RhY2tUb1RhYmxlQm9keUNvbnRleHQoKQogICAgICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UgPSBzZWxmLnBhcnNlci5waGFzZXNbImluVGFibGUiXQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1lbmQtdGFnLWluLXRhYmxlLWJvZHkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKCiAgICAgICAgZGVmIGVuZFRhZ1RhYmxlKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWYgKHNlbGYudHJlZS5lbGVtZW50SW5TY29wZSgidGJvZHkiLCB2YXJpYW50PSJ0YWJsZSIpIG9yCiAgICAgICAgICAgICAgICBzZWxmLnRyZWUuZWxlbWVudEluU2NvcGUoInRoZWFkIiwgdmFyaWFudD0idGFibGUiKSBvcgogICAgICAgICAgICAgICAgICAgIHNlbGYudHJlZS5lbGVtZW50SW5TY29wZSgidGZvb3QiLCB2YXJpYW50PSJ0YWJsZSIpKToKICAgICAgICAgICAgICAgIHNlbGYuY2xlYXJTdGFja1RvVGFibGVCb2R5Q29udGV4dCgpCiAgICAgICAgICAgICAgICBzZWxmLmVuZFRhZ1RhYmxlUm93R3JvdXAoCiAgICAgICAgICAgICAgICAgICAgaW1wbGllZFRhZ1Rva2VuKHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWUpKQogICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIGlubmVySFRNTCBjYXNlCiAgICAgICAgICAgICAgICBhc3NlcnQgc2VsZi5wYXJzZXIuaW5uZXJIVE1MCiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCkKCiAgICAgICAgZGVmIGVuZFRhZ0lnbm9yZShzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtZW5kLXRhZy1pbi10YWJsZS1ib2R5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKCiAgICAgICAgZGVmIGVuZFRhZ090aGVyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VyLnBoYXNlc1siaW5UYWJsZSJdLnByb2Nlc3NFbmRUYWcodG9rZW4pCgogICAgY2xhc3MgSW5Sb3dQaGFzZShQaGFzZSk6CiAgICAgICAgIyBodHRwOi8vd3d3LndoYXR3Zy5vcmcvc3BlY3Mvd2ViLWFwcHMvY3VycmVudC13b3JrLyNpbi1yb3cKICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgcGFyc2VyLCB0cmVlKToKICAgICAgICAgICAgUGhhc2UuX19pbml0X18oc2VsZiwgcGFyc2VyLCB0cmVlKQogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnSGFuZGxlciA9IF91dGlscy5NZXRob2REaXNwYXRjaGVyKFsKICAgICAgICAgICAgICAgICgiaHRtbCIsIHNlbGYuc3RhcnRUYWdIdG1sKSwKICAgICAgICAgICAgICAgICgoInRkIiwgInRoIiksIHNlbGYuc3RhcnRUYWdUYWJsZUNlbGwpLAogICAgICAgICAgICAgICAgKCgiY2FwdGlvbiIsICJjb2wiLCAiY29sZ3JvdXAiLCAidGJvZHkiLCAidGZvb3QiLCAidGhlYWQiLAogICAgICAgICAgICAgICAgICAidHIiKSwgc2VsZi5zdGFydFRhZ1RhYmxlT3RoZXIpCiAgICAgICAgICAgIF0pCiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIYW5kbGVyLmRlZmF1bHQgPSBzZWxmLnN0YXJ0VGFnT3RoZXIKCiAgICAgICAgICAgIHNlbGYuZW5kVGFnSGFuZGxlciA9IF91dGlscy5NZXRob2REaXNwYXRjaGVyKFsKICAgICAgICAgICAgICAgICgidHIiLCBzZWxmLmVuZFRhZ1RyKSwKICAgICAgICAgICAgICAgICgidGFibGUiLCBzZWxmLmVuZFRhZ1RhYmxlKSwKICAgICAgICAgICAgICAgICgoInRib2R5IiwgInRmb290IiwgInRoZWFkIiksIHNlbGYuZW5kVGFnVGFibGVSb3dHcm91cCksCiAgICAgICAgICAgICAgICAoKCJib2R5IiwgImNhcHRpb24iLCAiY29sIiwgImNvbGdyb3VwIiwgImh0bWwiLCAidGQiLCAidGgiKSwKICAgICAgICAgICAgICAgICBzZWxmLmVuZFRhZ0lnbm9yZSkKICAgICAgICAgICAgXSkKICAgICAgICAgICAgc2VsZi5lbmRUYWdIYW5kbGVyLmRlZmF1bHQgPSBzZWxmLmVuZFRhZ090aGVyCgogICAgICAgICMgaGVscGVyIG1ldGhvZHMgKFhYWCB1bmlmeSB0aGlzIHdpdGggb3RoZXIgdGFibGUgaGVscGVyIG1ldGhvZHMpCiAgICAgICAgZGVmIGNsZWFyU3RhY2tUb1RhYmxlUm93Q29udGV4dChzZWxmKToKICAgICAgICAgICAgd2hpbGUgc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZSBub3QgaW4gKCJ0ciIsICJodG1sIik6CiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLWltcGxpZWQtZW5kLXRhZy1pbi10YWJsZS1yb3ciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lfSkKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKCiAgICAgICAgZGVmIGlnbm9yZUVuZFRhZ1RyKHNlbGYpOgogICAgICAgICAgICByZXR1cm4gbm90IHNlbGYudHJlZS5lbGVtZW50SW5TY29wZSgidHIiLCB2YXJpYW50PSJ0YWJsZSIpCgogICAgICAgICMgdGhlIHJlc3QKICAgICAgICBkZWYgcHJvY2Vzc0VPRihzZWxmKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2VzWyJpblRhYmxlIl0ucHJvY2Vzc0VPRigpCgogICAgICAgIGRlZiBwcm9jZXNzU3BhY2VDaGFyYWN0ZXJzKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VyLnBoYXNlc1siaW5UYWJsZSJdLnByb2Nlc3NTcGFjZUNoYXJhY3RlcnModG9rZW4pCgogICAgICAgIGRlZiBwcm9jZXNzQ2hhcmFjdGVycyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlci5waGFzZXNbImluVGFibGUiXS5wcm9jZXNzQ2hhcmFjdGVycyh0b2tlbikKCiAgICAgICAgZGVmIHN0YXJ0VGFnVGFibGVDZWxsKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5jbGVhclN0YWNrVG9UYWJsZVJvd0NvbnRleHQoKQogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UgPSBzZWxmLnBhcnNlci5waGFzZXNbImluQ2VsbCJdCiAgICAgICAgICAgIHNlbGYudHJlZS5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMuYXBwZW5kKE1hcmtlcikKCiAgICAgICAgZGVmIHN0YXJ0VGFnVGFibGVPdGhlcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlnbm9yZUVuZFRhZyA9IHNlbGYuaWdub3JlRW5kVGFnVHIoKQogICAgICAgICAgICBzZWxmLmVuZFRhZ1RyKGltcGxpZWRUYWdUb2tlbigidHIiKSkKICAgICAgICAgICAgIyBYWFggaG93IGFyZSB3ZSBzdXJlIGl0J3MgYWx3YXlzIGlnbm9yZWQgaW4gdGhlIGlubmVySFRNTCBjYXNlPwogICAgICAgICAgICBpZiBub3QgaWdub3JlRW5kVGFnOgogICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuCgogICAgICAgIGRlZiBzdGFydFRhZ090aGVyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VyLnBoYXNlc1siaW5UYWJsZSJdLnByb2Nlc3NTdGFydFRhZyh0b2tlbikKCiAgICAgICAgZGVmIGVuZFRhZ1RyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWYgbm90IHNlbGYuaWdub3JlRW5kVGFnVHIoKToKICAgICAgICAgICAgICAgIHNlbGYuY2xlYXJTdGFja1RvVGFibGVSb3dDb250ZXh0KCkKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2VzWyJpblRhYmxlQm9keSJdCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIGlubmVySFRNTCBjYXNlCiAgICAgICAgICAgICAgICBhc3NlcnQgc2VsZi5wYXJzZXIuaW5uZXJIVE1MCiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCkKCiAgICAgICAgZGVmIGVuZFRhZ1RhYmxlKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWdub3JlRW5kVGFnID0gc2VsZi5pZ25vcmVFbmRUYWdUcigpCiAgICAgICAgICAgIHNlbGYuZW5kVGFnVHIoaW1wbGllZFRhZ1Rva2VuKCJ0ciIpKQogICAgICAgICAgICAjIFJlcHJvY2VzcyB0aGUgY3VycmVudCB0YWcgaWYgdGhlIHRyIGVuZCB0YWcgd2FzIG5vdCBpZ25vcmVkCiAgICAgICAgICAgICMgWFhYIGhvdyBhcmUgd2Ugc3VyZSBpdCdzIGFsd2F5cyBpZ25vcmVkIGluIHRoZSBpbm5lckhUTUwgY2FzZT8KICAgICAgICAgICAgaWYgbm90IGlnbm9yZUVuZFRhZzoKICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgICAgICBkZWYgZW5kVGFnVGFibGVSb3dHcm91cChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlmIHNlbGYudHJlZS5lbGVtZW50SW5TY29wZSh0b2tlblsibmFtZSJdLCB2YXJpYW50PSJ0YWJsZSIpOgogICAgICAgICAgICAgICAgc2VsZi5lbmRUYWdUcihpbXBsaWVkVGFnVG9rZW4oInRyIikpCiAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW4KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoKQoKICAgICAgICBkZWYgZW5kVGFnSWdub3JlKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1lbmQtdGFnLWluLXRhYmxlLXJvdyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCgogICAgICAgIGRlZiBlbmRUYWdPdGhlcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlci5waGFzZXNbImluVGFibGUiXS5wcm9jZXNzRW5kVGFnKHRva2VuKQoKICAgIGNsYXNzIEluQ2VsbFBoYXNlKFBoYXNlKToKICAgICAgICAjIGh0dHA6Ly93d3cud2hhdHdnLm9yZy9zcGVjcy93ZWItYXBwcy9jdXJyZW50LXdvcmsvI2luLWNlbGwKICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgcGFyc2VyLCB0cmVlKToKICAgICAgICAgICAgUGhhc2UuX19pbml0X18oc2VsZiwgcGFyc2VyLCB0cmVlKQogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnSGFuZGxlciA9IF91dGlscy5NZXRob2REaXNwYXRjaGVyKFsKICAgICAgICAgICAgICAgICgiaHRtbCIsIHNlbGYuc3RhcnRUYWdIdG1sKSwKICAgICAgICAgICAgICAgICgoImNhcHRpb24iLCAiY29sIiwgImNvbGdyb3VwIiwgInRib2R5IiwgInRkIiwgInRmb290IiwgInRoIiwKICAgICAgICAgICAgICAgICAgInRoZWFkIiwgInRyIiksIHNlbGYuc3RhcnRUYWdUYWJsZU90aGVyKQogICAgICAgICAgICBdKQogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnSGFuZGxlci5kZWZhdWx0ID0gc2VsZi5zdGFydFRhZ090aGVyCgogICAgICAgICAgICBzZWxmLmVuZFRhZ0hhbmRsZXIgPSBfdXRpbHMuTWV0aG9kRGlzcGF0Y2hlcihbCiAgICAgICAgICAgICAgICAoKCJ0ZCIsICJ0aCIpLCBzZWxmLmVuZFRhZ1RhYmxlQ2VsbCksCiAgICAgICAgICAgICAgICAoKCJib2R5IiwgImNhcHRpb24iLCAiY29sIiwgImNvbGdyb3VwIiwgImh0bWwiKSwgc2VsZi5lbmRUYWdJZ25vcmUpLAogICAgICAgICAgICAgICAgKCgidGFibGUiLCAidGJvZHkiLCAidGZvb3QiLCAidGhlYWQiLCAidHIiKSwgc2VsZi5lbmRUYWdJbXBseSkKICAgICAgICAgICAgXSkKICAgICAgICAgICAgc2VsZi5lbmRUYWdIYW5kbGVyLmRlZmF1bHQgPSBzZWxmLmVuZFRhZ090aGVyCgogICAgICAgICMgaGVscGVyCiAgICAgICAgZGVmIGNsb3NlQ2VsbChzZWxmKToKICAgICAgICAgICAgaWYgc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKCJ0ZCIsIHZhcmlhbnQ9InRhYmxlIik6CiAgICAgICAgICAgICAgICBzZWxmLmVuZFRhZ1RhYmxlQ2VsbChpbXBsaWVkVGFnVG9rZW4oInRkIikpCiAgICAgICAgICAgIGVsaWYgc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKCJ0aCIsIHZhcmlhbnQ9InRhYmxlIik6CiAgICAgICAgICAgICAgICBzZWxmLmVuZFRhZ1RhYmxlQ2VsbChpbXBsaWVkVGFnVG9rZW4oInRoIikpCgogICAgICAgICMgdGhlIHJlc3QKICAgICAgICBkZWYgcHJvY2Vzc0VPRihzZWxmKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2VzWyJpbkJvZHkiXS5wcm9jZXNzRU9GKCkKCiAgICAgICAgZGVmIHByb2Nlc3NDaGFyYWN0ZXJzKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VyLnBoYXNlc1siaW5Cb2R5Il0ucHJvY2Vzc0NoYXJhY3RlcnModG9rZW4pCgogICAgICAgIGRlZiBzdGFydFRhZ1RhYmxlT3RoZXIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZiAoc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKCJ0ZCIsIHZhcmlhbnQ9InRhYmxlIikgb3IKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyZWUuZWxlbWVudEluU2NvcGUoInRoIiwgdmFyaWFudD0idGFibGUiKSk6CiAgICAgICAgICAgICAgICBzZWxmLmNsb3NlQ2VsbCgpCiAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW4KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgaW5uZXJIVE1MIGNhc2UKICAgICAgICAgICAgICAgIGFzc2VydCBzZWxmLnBhcnNlci5pbm5lckhUTUwKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoKQoKICAgICAgICBkZWYgc3RhcnRUYWdPdGhlcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlci5waGFzZXNbImluQm9keSJdLnByb2Nlc3NTdGFydFRhZyh0b2tlbikKCiAgICAgICAgZGVmIGVuZFRhZ1RhYmxlQ2VsbChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlmIHNlbGYudHJlZS5lbGVtZW50SW5TY29wZSh0b2tlblsibmFtZSJdLCB2YXJpYW50PSJ0YWJsZSIpOgogICAgICAgICAgICAgICAgc2VsZi50cmVlLmdlbmVyYXRlSW1wbGllZEVuZFRhZ3ModG9rZW5bIm5hbWUiXSkKICAgICAgICAgICAgICAgIGlmIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWUgIT0gdG9rZW5bIm5hbWUiXToKICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLWNlbGwtZW5kLXRhZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKICAgICAgICAgICAgICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICAgICAgICAgICAgICBub2RlID0gc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICAgICAgICAgICAgICBpZiBub2RlLm5hbWUgPT0gdG9rZW5bIm5hbWUiXToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5jbGVhckFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cygpCiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYucGFyc2VyLnBoYXNlc1siaW5Sb3ciXQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1lbmQtdGFnIiwgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCgogICAgICAgIGRlZiBlbmRUYWdJZ25vcmUoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLWVuZC10YWciLCB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKCiAgICAgICAgZGVmIGVuZFRhZ0ltcGx5KHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWYgc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKHRva2VuWyJuYW1lIl0sIHZhcmlhbnQ9InRhYmxlIik6CiAgICAgICAgICAgICAgICBzZWxmLmNsb3NlQ2VsbCgpCiAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW4KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgc29tZXRpbWVzIGlubmVySFRNTCBjYXNlCiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCkKCiAgICAgICAgZGVmIGVuZFRhZ090aGVyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VyLnBoYXNlc1siaW5Cb2R5Il0ucHJvY2Vzc0VuZFRhZyh0b2tlbikKCiAgICBjbGFzcyBJblNlbGVjdFBoYXNlKFBoYXNlKToKICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgcGFyc2VyLCB0cmVlKToKICAgICAgICAgICAgUGhhc2UuX19pbml0X18oc2VsZiwgcGFyc2VyLCB0cmVlKQoKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0hhbmRsZXIgPSBfdXRpbHMuTWV0aG9kRGlzcGF0Y2hlcihbCiAgICAgICAgICAgICAgICAoImh0bWwiLCBzZWxmLnN0YXJ0VGFnSHRtbCksCiAgICAgICAgICAgICAgICAoIm9wdGlvbiIsIHNlbGYuc3RhcnRUYWdPcHRpb24pLAogICAgICAgICAgICAgICAgKCJvcHRncm91cCIsIHNlbGYuc3RhcnRUYWdPcHRncm91cCksCiAgICAgICAgICAgICAgICAoInNlbGVjdCIsIHNlbGYuc3RhcnRUYWdTZWxlY3QpLAogICAgICAgICAgICAgICAgKCgiaW5wdXQiLCAia2V5Z2VuIiwgInRleHRhcmVhIiksIHNlbGYuc3RhcnRUYWdJbnB1dCksCiAgICAgICAgICAgICAgICAoInNjcmlwdCIsIHNlbGYuc3RhcnRUYWdTY3JpcHQpCiAgICAgICAgICAgIF0pCiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIYW5kbGVyLmRlZmF1bHQgPSBzZWxmLnN0YXJ0VGFnT3RoZXIKCiAgICAgICAgICAgIHNlbGYuZW5kVGFnSGFuZGxlciA9IF91dGlscy5NZXRob2REaXNwYXRjaGVyKFsKICAgICAgICAgICAgICAgICgib3B0aW9uIiwgc2VsZi5lbmRUYWdPcHRpb24pLAogICAgICAgICAgICAgICAgKCJvcHRncm91cCIsIHNlbGYuZW5kVGFnT3B0Z3JvdXApLAogICAgICAgICAgICAgICAgKCJzZWxlY3QiLCBzZWxmLmVuZFRhZ1NlbGVjdCkKICAgICAgICAgICAgXSkKICAgICAgICAgICAgc2VsZi5lbmRUYWdIYW5kbGVyLmRlZmF1bHQgPSBzZWxmLmVuZFRhZ090aGVyCgogICAgICAgICMgaHR0cDovL3d3dy53aGF0d2cub3JnL3NwZWNzL3dlYi1hcHBzL2N1cnJlbnQtd29yay8jaW4tc2VsZWN0CiAgICAgICAgZGVmIHByb2Nlc3NFT0Yoc2VsZik6CiAgICAgICAgICAgIGlmIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWUgIT0gImh0bWwiOgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigiZW9mLWluLXNlbGVjdCIpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBhc3NlcnQgc2VsZi5wYXJzZXIuaW5uZXJIVE1MCgogICAgICAgIGRlZiBwcm9jZXNzQ2hhcmFjdGVycyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlmIHRva2VuWyJkYXRhIl0gPT0gIlx1MDAwMCI6CiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydFRleHQodG9rZW5bImRhdGEiXSkKCiAgICAgICAgZGVmIHN0YXJ0VGFnT3B0aW9uKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgIyBXZSBuZWVkIHRvIGltcGx5IDwvb3B0aW9uPiBpZiA8b3B0aW9uPiBpcyB0aGUgY3VycmVudCBub2RlLgogICAgICAgICAgICBpZiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lID09ICJvcHRpb24iOgogICAgICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKCiAgICAgICAgZGVmIHN0YXJ0VGFnT3B0Z3JvdXAoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lID09ICJvcHRpb24iOgogICAgICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICBpZiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lID09ICJvcHRncm91cCI6CiAgICAgICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRFbGVtZW50KHRva2VuKQoKICAgICAgICBkZWYgc3RhcnRUYWdTZWxlY3Qoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLXNlbGVjdC1pbi1zZWxlY3QiKQogICAgICAgICAgICBzZWxmLmVuZFRhZ1NlbGVjdChpbXBsaWVkVGFnVG9rZW4oInNlbGVjdCIpKQoKICAgICAgICBkZWYgc3RhcnRUYWdJbnB1dChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtaW5wdXQtaW4tc2VsZWN0IikKICAgICAgICAgICAgaWYgc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKCJzZWxlY3QiLCB2YXJpYW50PSJzZWxlY3QiKToKICAgICAgICAgICAgICAgIHNlbGYuZW5kVGFnU2VsZWN0KGltcGxpZWRUYWdUb2tlbigic2VsZWN0IikpCiAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW4KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGFzc2VydCBzZWxmLnBhcnNlci5pbm5lckhUTUwKCiAgICAgICAgZGVmIHN0YXJ0VGFnU2NyaXB0KHNlbGYsIHRva2VuKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VyLnBoYXNlc1siaW5IZWFkIl0ucHJvY2Vzc1N0YXJ0VGFnKHRva2VuKQoKICAgICAgICBkZWYgc3RhcnRUYWdPdGhlcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtc3RhcnQtdGFnLWluLXNlbGVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCgogICAgICAgIGRlZiBlbmRUYWdPcHRpb24oc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lID09ICJvcHRpb24iOgogICAgICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1lbmQtdGFnLWluLXNlbGVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsibmFtZSI6ICJvcHRpb24ifSkKCiAgICAgICAgZGVmIGVuZFRhZ09wdGdyb3VwKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgIyA8L29wdGdyb3VwPiBpbXBsaWNpdGx5IGNsb3NlcyA8b3B0aW9uPgogICAgICAgICAgICBpZiAoc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZSA9PSAib3B0aW9uIiBhbmQKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0yXS5uYW1lID09ICJvcHRncm91cCIpOgogICAgICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICAjIEl0IGFsc28gY2xvc2VzIDwvb3B0Z3JvdXA+CiAgICAgICAgICAgIGlmIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWUgPT0gIm9wdGdyb3VwIjoKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgIyBCdXQgbm90aGluZyBlbHNlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLWVuZC10YWctaW4tc2VsZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjogIm9wdGdyb3VwIn0pCgogICAgICAgIGRlZiBlbmRUYWdTZWxlY3Qoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZiBzZWxmLnRyZWUuZWxlbWVudEluU2NvcGUoInNlbGVjdCIsIHZhcmlhbnQ9InNlbGVjdCIpOgogICAgICAgICAgICAgICAgbm9kZSA9IHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgICAgIHdoaWxlIG5vZGUubmFtZSAhPSAic2VsZWN0IjoKICAgICAgICAgICAgICAgICAgICBub2RlID0gc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucmVzZXRJbnNlcnRpb25Nb2RlKCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgaW5uZXJIVE1MIGNhc2UKICAgICAgICAgICAgICAgIGFzc2VydCBzZWxmLnBhcnNlci5pbm5lckhUTUwKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoKQoKICAgICAgICBkZWYgZW5kVGFnT3RoZXIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLWVuZC10YWctaW4tc2VsZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKCiAgICBjbGFzcyBJblNlbGVjdEluVGFibGVQaGFzZShQaGFzZSk6CiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSk6CiAgICAgICAgICAgIFBoYXNlLl9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSkKCiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIYW5kbGVyID0gX3V0aWxzLk1ldGhvZERpc3BhdGNoZXIoWwogICAgICAgICAgICAgICAgKCgiY2FwdGlvbiIsICJ0YWJsZSIsICJ0Ym9keSIsICJ0Zm9vdCIsICJ0aGVhZCIsICJ0ciIsICJ0ZCIsICJ0aCIpLAogICAgICAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdUYWJsZSkKICAgICAgICAgICAgXSkKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0hhbmRsZXIuZGVmYXVsdCA9IHNlbGYuc3RhcnRUYWdPdGhlcgoKICAgICAgICAgICAgc2VsZi5lbmRUYWdIYW5kbGVyID0gX3V0aWxzLk1ldGhvZERpc3BhdGNoZXIoWwogICAgICAgICAgICAgICAgKCgiY2FwdGlvbiIsICJ0YWJsZSIsICJ0Ym9keSIsICJ0Zm9vdCIsICJ0aGVhZCIsICJ0ciIsICJ0ZCIsICJ0aCIpLAogICAgICAgICAgICAgICAgIHNlbGYuZW5kVGFnVGFibGUpCiAgICAgICAgICAgIF0pCiAgICAgICAgICAgIHNlbGYuZW5kVGFnSGFuZGxlci5kZWZhdWx0ID0gc2VsZi5lbmRUYWdPdGhlcgoKICAgICAgICBkZWYgcHJvY2Vzc0VPRihzZWxmKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2VzWyJpblNlbGVjdCJdLnByb2Nlc3NFT0YoKQoKICAgICAgICBkZWYgcHJvY2Vzc0NoYXJhY3RlcnMoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZXIucGhhc2VzWyJpblNlbGVjdCJdLnByb2Nlc3NDaGFyYWN0ZXJzKHRva2VuKQoKICAgICAgICBkZWYgc3RhcnRUYWdUYWJsZShzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtdGFibGUtZWxlbWVudC1zdGFydC10YWctaW4tc2VsZWN0LWluLXRhYmxlIiwgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCiAgICAgICAgICAgIHNlbGYuZW5kVGFnT3RoZXIoaW1wbGllZFRhZ1Rva2VuKCJzZWxlY3QiKSkKICAgICAgICAgICAgcmV0dXJuIHRva2VuCgogICAgICAgIGRlZiBzdGFydFRhZ090aGVyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VyLnBoYXNlc1siaW5TZWxlY3QiXS5wcm9jZXNzU3RhcnRUYWcodG9rZW4pCgogICAgICAgIGRlZiBlbmRUYWdUYWJsZShzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtdGFibGUtZWxlbWVudC1lbmQtdGFnLWluLXNlbGVjdC1pbi10YWJsZSIsIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQogICAgICAgICAgICBpZiBzZWxmLnRyZWUuZWxlbWVudEluU2NvcGUodG9rZW5bIm5hbWUiXSwgdmFyaWFudD0idGFibGUiKToKICAgICAgICAgICAgICAgIHNlbGYuZW5kVGFnT3RoZXIoaW1wbGllZFRhZ1Rva2VuKCJzZWxlY3QiKSkKICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgICAgICBkZWYgZW5kVGFnT3RoZXIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZXIucGhhc2VzWyJpblNlbGVjdCJdLnByb2Nlc3NFbmRUYWcodG9rZW4pCgogICAgY2xhc3MgSW5Gb3JlaWduQ29udGVudFBoYXNlKFBoYXNlKToKICAgICAgICBicmVha291dEVsZW1lbnRzID0gZnJvemVuc2V0KFsiYiIsICJiaWciLCAiYmxvY2txdW90ZSIsICJib2R5IiwgImJyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2VudGVyIiwgImNvZGUiLCAiZGQiLCAiZGl2IiwgImRsIiwgImR0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW0iLCAiZW1iZWQiLCAiaDEiLCAiaDIiLCAiaDMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoNCIsICJoNSIsICJoNiIsICJoZWFkIiwgImhyIiwgImkiLCAiaW1nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGkiLCAibGlzdGluZyIsICJtZW51IiwgIm1ldGEiLCAibm9iciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9sIiwgInAiLCAicHJlIiwgInJ1YnkiLCAicyIsICJzbWFsbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNwYW4iLCAic3Ryb25nIiwgInN0cmlrZSIsICJzdWIiLCAic3VwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFibGUiLCAidHQiLCAidSIsICJ1bCIsICJ2YXIiXSkKCiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSk6CiAgICAgICAgICAgIFBoYXNlLl9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSkKCiAgICAgICAgZGVmIGFkanVzdFNWR1RhZ05hbWVzKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgcmVwbGFjZW1lbnRzID0geyJhbHRnbHlwaCI6ICJhbHRHbHlwaCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWx0Z2x5cGhkZWYiOiAiYWx0R2x5cGhEZWYiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImFsdGdseXBoaXRlbSI6ICJhbHRHbHlwaEl0ZW0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImFuaW1hdGVjb2xvciI6ICJhbmltYXRlQ29sb3IiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImFuaW1hdGVtb3Rpb24iOiAiYW5pbWF0ZU1vdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYW5pbWF0ZXRyYW5zZm9ybSI6ICJhbmltYXRlVHJhbnNmb3JtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjbGlwcGF0aCI6ICJjbGlwUGF0aCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmVibGVuZCI6ICJmZUJsZW5kIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmZWNvbG9ybWF0cml4IjogImZlQ29sb3JNYXRyaXgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImZlY29tcG9uZW50dHJhbnNmZXIiOiAiZmVDb21wb25lbnRUcmFuc2ZlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmVjb21wb3NpdGUiOiAiZmVDb21wb3NpdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImZlY29udm9sdmVtYXRyaXgiOiAiZmVDb252b2x2ZU1hdHJpeCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmVkaWZmdXNlbGlnaHRpbmciOiAiZmVEaWZmdXNlTGlnaHRpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImZlZGlzcGxhY2VtZW50bWFwIjogImZlRGlzcGxhY2VtZW50TWFwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmZWRpc3RhbnRsaWdodCI6ICJmZURpc3RhbnRMaWdodCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmVmbG9vZCI6ICJmZUZsb29kIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmZWZ1bmNhIjogImZlRnVuY0EiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImZlZnVuY2IiOiAiZmVGdW5jQiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmVmdW5jZyI6ICJmZUZ1bmNHIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmZWZ1bmNyIjogImZlRnVuY1IiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImZlZ2F1c3NpYW5ibHVyIjogImZlR2F1c3NpYW5CbHVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmZWltYWdlIjogImZlSW1hZ2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImZlbWVyZ2UiOiAiZmVNZXJnZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmVtZXJnZW5vZGUiOiAiZmVNZXJnZU5vZGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImZlbW9ycGhvbG9neSI6ICJmZU1vcnBob2xvZ3kiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImZlb2Zmc2V0IjogImZlT2Zmc2V0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmZXBvaW50bGlnaHQiOiAiZmVQb2ludExpZ2h0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmZXNwZWN1bGFybGlnaHRpbmciOiAiZmVTcGVjdWxhckxpZ2h0aW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmZXNwb3RsaWdodCI6ICJmZVNwb3RMaWdodCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmV0aWxlIjogImZlVGlsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmV0dXJidWxlbmNlIjogImZlVHVyYnVsZW5jZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9yZWlnbm9iamVjdCI6ICJmb3JlaWduT2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnbHlwaHJlZiI6ICJnbHlwaFJlZiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGluZWFyZ3JhZGllbnQiOiAibGluZWFyR3JhZGllbnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInJhZGlhbGdyYWRpZW50IjogInJhZGlhbEdyYWRpZW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0cGF0aCI6ICJ0ZXh0UGF0aCJ9CgogICAgICAgICAgICBpZiB0b2tlblsibmFtZSJdIGluIHJlcGxhY2VtZW50czoKICAgICAgICAgICAgICAgIHRva2VuWyJuYW1lIl0gPSByZXBsYWNlbWVudHNbdG9rZW5bIm5hbWUiXV0KCiAgICAgICAgZGVmIHByb2Nlc3NDaGFyYWN0ZXJzKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWYgdG9rZW5bImRhdGEiXSA9PSAiXHUwMDAwIjoKICAgICAgICAgICAgICAgIHRva2VuWyJkYXRhIl0gPSAiXHVGRkZEIgogICAgICAgICAgICBlbGlmIChzZWxmLnBhcnNlci5mcmFtZXNldE9LIGFuZAogICAgICAgICAgICAgICAgICBhbnkoY2hhciBub3QgaW4gc3BhY2VDaGFyYWN0ZXJzIGZvciBjaGFyIGluIHRva2VuWyJkYXRhIl0pKToKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLmZyYW1lc2V0T0sgPSBGYWxzZQogICAgICAgICAgICBQaGFzZS5wcm9jZXNzQ2hhcmFjdGVycyhzZWxmLCB0b2tlbikKCiAgICAgICAgZGVmIHByb2Nlc3NTdGFydFRhZyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGN1cnJlbnROb2RlID0gc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0KICAgICAgICAgICAgaWYgKHRva2VuWyJuYW1lIl0gaW4gc2VsZi5icmVha291dEVsZW1lbnRzIG9yCiAgICAgICAgICAgICAgICAodG9rZW5bIm5hbWUiXSA9PSAiZm9udCIgYW5kCiAgICAgICAgICAgICAgICAgc2V0KHRva2VuWyJkYXRhIl0ua2V5cygpKSAmIHNldChbImNvbG9yIiwgImZhY2UiLCAic2l6ZSJdKSkpOgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1odG1sLWVsZW1lbnQtaW4tZm9yZWlnbi1jb250ZW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCiAgICAgICAgICAgICAgICB3aGlsZSAoc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZXNwYWNlICE9CiAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmVlLmRlZmF1bHROYW1lc3BhY2UgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgbm90IHNlbGYucGFyc2VyLmlzSFRNTEludGVncmF0aW9uUG9pbnQoc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0pIGFuZAogICAgICAgICAgICAgICAgICAgICAgIG5vdCBzZWxmLnBhcnNlci5pc01hdGhNTFRleHRJbnRlZ3JhdGlvblBvaW50KHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdKSk6CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuCgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgaWYgY3VycmVudE5vZGUubmFtZXNwYWNlID09IG5hbWVzcGFjZXNbIm1hdGhtbCJdOgogICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLmFkanVzdE1hdGhNTEF0dHJpYnV0ZXModG9rZW4pCiAgICAgICAgICAgICAgICBlbGlmIGN1cnJlbnROb2RlLm5hbWVzcGFjZSA9PSBuYW1lc3BhY2VzWyJzdmciXToKICAgICAgICAgICAgICAgICAgICBzZWxmLmFkanVzdFNWR1RhZ05hbWVzKHRva2VuKQogICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLmFkanVzdFNWR0F0dHJpYnV0ZXModG9rZW4pCiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5hZGp1c3RGb3JlaWduQXR0cmlidXRlcyh0b2tlbikKICAgICAgICAgICAgICAgIHRva2VuWyJuYW1lc3BhY2UiXSA9IGN1cnJlbnROb2RlLm5hbWVzcGFjZQogICAgICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCiAgICAgICAgICAgICAgICBpZiB0b2tlblsic2VsZkNsb3NpbmciXToKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgICAgICAgICAgdG9rZW5bInNlbGZDbG9zaW5nQWNrbm93bGVkZ2VkIl0gPSBUcnVlCgogICAgICAgIGRlZiBwcm9jZXNzRW5kVGFnKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgbm9kZUluZGV4ID0gbGVuKHNlbGYudHJlZS5vcGVuRWxlbWVudHMpIC0gMQogICAgICAgICAgICBub2RlID0gc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0KICAgICAgICAgICAgaWYgbm9kZS5uYW1lLnRyYW5zbGF0ZShhc2NpaVVwcGVyMkxvd2VyKSAhPSB0b2tlblsibmFtZSJdOgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1lbmQtdGFnIiwgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCgogICAgICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICAgICAgaWYgbm9kZS5uYW1lLnRyYW5zbGF0ZShhc2NpaVVwcGVyMkxvd2VyKSA9PSB0b2tlblsibmFtZSJdOgogICAgICAgICAgICAgICAgICAgICMgWFhYIHRoaXMgaXNuJ3QgaW4gdGhlIHNwZWMgYnV0IGl0IHNlZW1zIG5lY2Vzc2FyeQogICAgICAgICAgICAgICAgICAgIGlmIHNlbGYucGFyc2VyLnBoYXNlID09IHNlbGYucGFyc2VyLnBoYXNlc1siaW5UYWJsZVRleHQiXToKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UuZmx1c2hDaGFyYWN0ZXJzKCkKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UgPSBzZWxmLnBhcnNlci5waGFzZS5vcmlnaW5hbFBoYXNlCiAgICAgICAgICAgICAgICAgICAgd2hpbGUgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKSAhPSBub2RlOgogICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQgc2VsZi50cmVlLm9wZW5FbGVtZW50cwogICAgICAgICAgICAgICAgICAgIG5ld190b2tlbiA9IE5vbmUKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgbm9kZUluZGV4IC09IDEKCiAgICAgICAgICAgICAgICBub2RlID0gc2VsZi50cmVlLm9wZW5FbGVtZW50c1tub2RlSW5kZXhdCiAgICAgICAgICAgICAgICBpZiBub2RlLm5hbWVzcGFjZSAhPSBzZWxmLnRyZWUuZGVmYXVsdE5hbWVzcGFjZToKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBuZXdfdG9rZW4gPSBzZWxmLnBhcnNlci5waGFzZS5wcm9jZXNzRW5kVGFnKHRva2VuKQogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIHJldHVybiBuZXdfdG9rZW4KCiAgICBjbGFzcyBBZnRlckJvZHlQaGFzZShQaGFzZSk6CiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSk6CiAgICAgICAgICAgIFBoYXNlLl9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSkKCiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIYW5kbGVyID0gX3V0aWxzLk1ldGhvZERpc3BhdGNoZXIoWwogICAgICAgICAgICAgICAgKCJodG1sIiwgc2VsZi5zdGFydFRhZ0h0bWwpCiAgICAgICAgICAgIF0pCiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIYW5kbGVyLmRlZmF1bHQgPSBzZWxmLnN0YXJ0VGFnT3RoZXIKCiAgICAgICAgICAgIHNlbGYuZW5kVGFnSGFuZGxlciA9IF91dGlscy5NZXRob2REaXNwYXRjaGVyKFsoImh0bWwiLCBzZWxmLmVuZFRhZ0h0bWwpXSkKICAgICAgICAgICAgc2VsZi5lbmRUYWdIYW5kbGVyLmRlZmF1bHQgPSBzZWxmLmVuZFRhZ090aGVyCgogICAgICAgIGRlZiBwcm9jZXNzRU9GKHNlbGYpOgogICAgICAgICAgICAjIFN0b3AgcGFyc2luZwogICAgICAgICAgICBwYXNzCgogICAgICAgIGRlZiBwcm9jZXNzQ29tbWVudChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgICMgVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBkYXRhIGlzIHRvIGJlIGFwcGVuZGVkIHRvIHRoZSA8aHRtbD4gZWxlbWVudAogICAgICAgICAgICAjIGhlcmUgYW5kIG5vdCB0byB3aGF0ZXZlciBpcyBjdXJyZW50bHkgb3Blbi4KICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydENvbW1lbnQodG9rZW4sIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbMF0pCgogICAgICAgIGRlZiBwcm9jZXNzQ2hhcmFjdGVycyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtY2hhci1hZnRlci1ib2R5IikKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UgPSBzZWxmLnBhcnNlci5waGFzZXNbImluQm9keSJdCiAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgICAgICBkZWYgc3RhcnRUYWdIdG1sKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VyLnBoYXNlc1siaW5Cb2R5Il0ucHJvY2Vzc1N0YXJ0VGFnKHRva2VuKQoKICAgICAgICBkZWYgc3RhcnRUYWdPdGhlcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtc3RhcnQtdGFnLWFmdGVyLWJvZHkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYucGFyc2VyLnBoYXNlc1siaW5Cb2R5Il0KICAgICAgICAgICAgcmV0dXJuIHRva2VuCgogICAgICAgIGRlZiBlbmRUYWdIdG1sKHNlbGYsIG5hbWUpOgogICAgICAgICAgICBpZiBzZWxmLnBhcnNlci5pbm5lckhUTUw6CiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLWVuZC10YWctYWZ0ZXItYm9keS1pbm5lcmh0bWwiKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UgPSBzZWxmLnBhcnNlci5waGFzZXNbImFmdGVyQWZ0ZXJCb2R5Il0KCiAgICAgICAgZGVmIGVuZFRhZ090aGVyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1lbmQtdGFnLWFmdGVyLWJvZHkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYucGFyc2VyLnBoYXNlc1siaW5Cb2R5Il0KICAgICAgICAgICAgcmV0dXJuIHRva2VuCgogICAgY2xhc3MgSW5GcmFtZXNldFBoYXNlKFBoYXNlKToKICAgICAgICAjIGh0dHA6Ly93d3cud2hhdHdnLm9yZy9zcGVjcy93ZWItYXBwcy9jdXJyZW50LXdvcmsvI2luLWZyYW1lc2V0CiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSk6CiAgICAgICAgICAgIFBoYXNlLl9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSkKCiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIYW5kbGVyID0gX3V0aWxzLk1ldGhvZERpc3BhdGNoZXIoWwogICAgICAgICAgICAgICAgKCJodG1sIiwgc2VsZi5zdGFydFRhZ0h0bWwpLAogICAgICAgICAgICAgICAgKCJmcmFtZXNldCIsIHNlbGYuc3RhcnRUYWdGcmFtZXNldCksCiAgICAgICAgICAgICAgICAoImZyYW1lIiwgc2VsZi5zdGFydFRhZ0ZyYW1lKSwKICAgICAgICAgICAgICAgICgibm9mcmFtZXMiLCBzZWxmLnN0YXJ0VGFnTm9mcmFtZXMpCiAgICAgICAgICAgIF0pCiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIYW5kbGVyLmRlZmF1bHQgPSBzZWxmLnN0YXJ0VGFnT3RoZXIKCiAgICAgICAgICAgIHNlbGYuZW5kVGFnSGFuZGxlciA9IF91dGlscy5NZXRob2REaXNwYXRjaGVyKFsKICAgICAgICAgICAgICAgICgiZnJhbWVzZXQiLCBzZWxmLmVuZFRhZ0ZyYW1lc2V0KQogICAgICAgICAgICBdKQogICAgICAgICAgICBzZWxmLmVuZFRhZ0hhbmRsZXIuZGVmYXVsdCA9IHNlbGYuZW5kVGFnT3RoZXIKCiAgICAgICAgZGVmIHByb2Nlc3NFT0Yoc2VsZik6CiAgICAgICAgICAgIGlmIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWUgIT0gImh0bWwiOgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigiZW9mLWluLWZyYW1lc2V0IikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGFzc2VydCBzZWxmLnBhcnNlci5pbm5lckhUTUwKCiAgICAgICAgZGVmIHByb2Nlc3NDaGFyYWN0ZXJzKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1jaGFyLWluLWZyYW1lc2V0IikKCiAgICAgICAgZGVmIHN0YXJ0VGFnRnJhbWVzZXQoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKCiAgICAgICAgZGVmIHN0YXJ0VGFnRnJhbWUoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQoKICAgICAgICBkZWYgc3RhcnRUYWdOb2ZyYW1lcyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlci5waGFzZXNbImluQm9keSJdLnByb2Nlc3NTdGFydFRhZyh0b2tlbikKCiAgICAgICAgZGVmIHN0YXJ0VGFnT3RoZXIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLXN0YXJ0LXRhZy1pbi1mcmFtZXNldCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCgogICAgICAgIGRlZiBlbmRUYWdGcmFtZXNldChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlmIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWUgPT0gImh0bWwiOgogICAgICAgICAgICAgICAgIyBpbm5lckhUTUwgY2FzZQogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1mcmFtZXNldC1pbi1mcmFtZXNldC1pbm5lcmh0bWwiKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICBpZiAobm90IHNlbGYucGFyc2VyLmlubmVySFRNTCBhbmQKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lICE9ICJmcmFtZXNldCIpOgogICAgICAgICAgICAgICAgIyBJZiB3ZSdyZSBub3QgaW4gaW5uZXJIVE1MIG1vZGUgYW5kIHRoZSBjdXJyZW50IG5vZGUgaXMgbm90IGEKICAgICAgICAgICAgICAgICMgImZyYW1lc2V0IiBlbGVtZW50IChhbnltb3JlKSB0aGVuIHN3aXRjaC4KICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2VzWyJhZnRlckZyYW1lc2V0Il0KCiAgICAgICAgZGVmIGVuZFRhZ090aGVyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1lbmQtdGFnLWluLWZyYW1lc2V0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKCiAgICBjbGFzcyBBZnRlckZyYW1lc2V0UGhhc2UoUGhhc2UpOgogICAgICAgICMgaHR0cDovL3d3dy53aGF0d2cub3JnL3NwZWNzL3dlYi1hcHBzL2N1cnJlbnQtd29yay8jYWZ0ZXIzCiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSk6CiAgICAgICAgICAgIFBoYXNlLl9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSkKCiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIYW5kbGVyID0gX3V0aWxzLk1ldGhvZERpc3BhdGNoZXIoWwogICAgICAgICAgICAgICAgKCJodG1sIiwgc2VsZi5zdGFydFRhZ0h0bWwpLAogICAgICAgICAgICAgICAgKCJub2ZyYW1lcyIsIHNlbGYuc3RhcnRUYWdOb2ZyYW1lcykKICAgICAgICAgICAgXSkKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0hhbmRsZXIuZGVmYXVsdCA9IHNlbGYuc3RhcnRUYWdPdGhlcgoKICAgICAgICAgICAgc2VsZi5lbmRUYWdIYW5kbGVyID0gX3V0aWxzLk1ldGhvZERpc3BhdGNoZXIoWwogICAgICAgICAgICAgICAgKCJodG1sIiwgc2VsZi5lbmRUYWdIdG1sKQogICAgICAgICAgICBdKQogICAgICAgICAgICBzZWxmLmVuZFRhZ0hhbmRsZXIuZGVmYXVsdCA9IHNlbGYuZW5kVGFnT3RoZXIKCiAgICAgICAgZGVmIHByb2Nlc3NFT0Yoc2VsZik6CiAgICAgICAgICAgICMgU3RvcCBwYXJzaW5nCiAgICAgICAgICAgIHBhc3MKCiAgICAgICAgZGVmIHByb2Nlc3NDaGFyYWN0ZXJzKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1jaGFyLWFmdGVyLWZyYW1lc2V0IikKCiAgICAgICAgZGVmIHN0YXJ0VGFnTm9mcmFtZXMoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZXIucGhhc2VzWyJpbkhlYWQiXS5wcm9jZXNzU3RhcnRUYWcodG9rZW4pCgogICAgICAgIGRlZiBzdGFydFRhZ090aGVyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1zdGFydC10YWctYWZ0ZXItZnJhbWVzZXQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQoKICAgICAgICBkZWYgZW5kVGFnSHRtbChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2VzWyJhZnRlckFmdGVyRnJhbWVzZXQiXQoKICAgICAgICBkZWYgZW5kVGFnT3RoZXIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLWVuZC10YWctYWZ0ZXItZnJhbWVzZXQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQoKICAgIGNsYXNzIEFmdGVyQWZ0ZXJCb2R5UGhhc2UoUGhhc2UpOgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpOgogICAgICAgICAgICBQaGFzZS5fX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpCgogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnSGFuZGxlciA9IF91dGlscy5NZXRob2REaXNwYXRjaGVyKFsKICAgICAgICAgICAgICAgICgiaHRtbCIsIHNlbGYuc3RhcnRUYWdIdG1sKQogICAgICAgICAgICBdKQogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnSGFuZGxlci5kZWZhdWx0ID0gc2VsZi5zdGFydFRhZ090aGVyCgogICAgICAgIGRlZiBwcm9jZXNzRU9GKHNlbGYpOgogICAgICAgICAgICBwYXNzCgogICAgICAgIGRlZiBwcm9jZXNzQ29tbWVudChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRDb21tZW50KHRva2VuLCBzZWxmLnRyZWUuZG9jdW1lbnQpCgogICAgICAgIGRlZiBwcm9jZXNzU3BhY2VDaGFyYWN0ZXJzKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VyLnBoYXNlc1siaW5Cb2R5Il0ucHJvY2Vzc1NwYWNlQ2hhcmFjdGVycyh0b2tlbikKCiAgICAgICAgZGVmIHByb2Nlc3NDaGFyYWN0ZXJzKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigiZXhwZWN0ZWQtZW9mLWJ1dC1nb3QtY2hhciIpCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2VzWyJpbkJvZHkiXQogICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICAgICAgZGVmIHN0YXJ0VGFnSHRtbChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlci5waGFzZXNbImluQm9keSJdLnByb2Nlc3NTdGFydFRhZyh0b2tlbikKCiAgICAgICAgZGVmIHN0YXJ0VGFnT3RoZXIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJleHBlY3RlZC1lb2YtYnV0LWdvdC1zdGFydC10YWciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYucGFyc2VyLnBoYXNlc1siaW5Cb2R5Il0KICAgICAgICAgICAgcmV0dXJuIHRva2VuCgogICAgICAgIGRlZiBwcm9jZXNzRW5kVGFnKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigiZXhwZWN0ZWQtZW9mLWJ1dC1nb3QtZW5kLXRhZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2VzWyJpbkJvZHkiXQogICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICBjbGFzcyBBZnRlckFmdGVyRnJhbWVzZXRQaGFzZShQaGFzZSk6CiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSk6CiAgICAgICAgICAgIFBoYXNlLl9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSkKCiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIYW5kbGVyID0gX3V0aWxzLk1ldGhvZERpc3BhdGNoZXIoWwogICAgICAgICAgICAgICAgKCJodG1sIiwgc2VsZi5zdGFydFRhZ0h0bWwpLAogICAgICAgICAgICAgICAgKCJub2ZyYW1lcyIsIHNlbGYuc3RhcnRUYWdOb0ZyYW1lcykKICAgICAgICAgICAgXSkKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0hhbmRsZXIuZGVmYXVsdCA9IHNlbGYuc3RhcnRUYWdPdGhlcgoKICAgICAgICBkZWYgcHJvY2Vzc0VPRihzZWxmKToKICAgICAgICAgICAgcGFzcwoKICAgICAgICBkZWYgcHJvY2Vzc0NvbW1lbnQoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0Q29tbWVudCh0b2tlbiwgc2VsZi50cmVlLmRvY3VtZW50KQoKICAgICAgICBkZWYgcHJvY2Vzc1NwYWNlQ2hhcmFjdGVycyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlci5waGFzZXNbImluQm9keSJdLnByb2Nlc3NTcGFjZUNoYXJhY3RlcnModG9rZW4pCgogICAgICAgIGRlZiBwcm9jZXNzQ2hhcmFjdGVycyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoImV4cGVjdGVkLWVvZi1idXQtZ290LWNoYXIiKQoKICAgICAgICBkZWYgc3RhcnRUYWdIdG1sKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VyLnBoYXNlc1siaW5Cb2R5Il0ucHJvY2Vzc1N0YXJ0VGFnKHRva2VuKQoKICAgICAgICBkZWYgc3RhcnRUYWdOb0ZyYW1lcyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlci5waGFzZXNbImluSGVhZCJdLnByb2Nlc3NTdGFydFRhZyh0b2tlbikKCiAgICAgICAgZGVmIHN0YXJ0VGFnT3RoZXIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJleHBlY3RlZC1lb2YtYnV0LWdvdC1zdGFydC10YWciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQoKICAgICAgICBkZWYgcHJvY2Vzc0VuZFRhZyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoImV4cGVjdGVkLWVvZi1idXQtZ290LWVuZC10YWciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQogICAgIyBweWxpbnQ6ZW5hYmxlPXVudXNlZC1hcmd1bWVudAoKICAgIHJldHVybiB7CiAgICAgICAgImluaXRpYWwiOiBJbml0aWFsUGhhc2UsCiAgICAgICAgImJlZm9yZUh0bWwiOiBCZWZvcmVIdG1sUGhhc2UsCiAgICAgICAgImJlZm9yZUhlYWQiOiBCZWZvcmVIZWFkUGhhc2UsCiAgICAgICAgImluSGVhZCI6IEluSGVhZFBoYXNlLAogICAgICAgICJpbkhlYWROb3NjcmlwdCI6IEluSGVhZE5vc2NyaXB0UGhhc2UsCiAgICAgICAgImFmdGVySGVhZCI6IEFmdGVySGVhZFBoYXNlLAogICAgICAgICJpbkJvZHkiOiBJbkJvZHlQaGFzZSwKICAgICAgICAidGV4dCI6IFRleHRQaGFzZSwKICAgICAgICAiaW5UYWJsZSI6IEluVGFibGVQaGFzZSwKICAgICAgICAiaW5UYWJsZVRleHQiOiBJblRhYmxlVGV4dFBoYXNlLAogICAgICAgICJpbkNhcHRpb24iOiBJbkNhcHRpb25QaGFzZSwKICAgICAgICAiaW5Db2x1bW5Hcm91cCI6IEluQ29sdW1uR3JvdXBQaGFzZSwKICAgICAgICAiaW5UYWJsZUJvZHkiOiBJblRhYmxlQm9keVBoYXNlLAogICAgICAgICJpblJvdyI6IEluUm93UGhhc2UsCiAgICAgICAgImluQ2VsbCI6IEluQ2VsbFBoYXNlLAogICAgICAgICJpblNlbGVjdCI6IEluU2VsZWN0UGhhc2UsCiAgICAgICAgImluU2VsZWN0SW5UYWJsZSI6IEluU2VsZWN0SW5UYWJsZVBoYXNlLAogICAgICAgICJpbkZvcmVpZ25Db250ZW50IjogSW5Gb3JlaWduQ29udGVudFBoYXNlLAogICAgICAgICJhZnRlckJvZHkiOiBBZnRlckJvZHlQaGFzZSwKICAgICAgICAiaW5GcmFtZXNldCI6IEluRnJhbWVzZXRQaGFzZSwKICAgICAgICAiYWZ0ZXJGcmFtZXNldCI6IEFmdGVyRnJhbWVzZXRQaGFzZSwKICAgICAgICAiYWZ0ZXJBZnRlckJvZHkiOiBBZnRlckFmdGVyQm9keVBoYXNlLAogICAgICAgICJhZnRlckFmdGVyRnJhbWVzZXQiOiBBZnRlckFmdGVyRnJhbWVzZXRQaGFzZSwKICAgICAgICAjIFhYWCBhZnRlciBhZnRlciBmcmFtZXNldAogICAgfQoKCmRlZiBhZGp1c3RfYXR0cmlidXRlcyh0b2tlbiwgcmVwbGFjZW1lbnRzKToKICAgIGlmIFBZMyBvciBfdXRpbHMuUFkyNzoKICAgICAgICBuZWVkc19hZGp1c3RtZW50ID0gdmlld2tleXModG9rZW5bJ2RhdGEnXSkgJiB2aWV3a2V5cyhyZXBsYWNlbWVudHMpCiAgICBlbHNlOgogICAgICAgIG5lZWRzX2FkanVzdG1lbnQgPSBmcm96ZW5zZXQodG9rZW5bJ2RhdGEnXSkgJiBmcm96ZW5zZXQocmVwbGFjZW1lbnRzKQogICAgaWYgbmVlZHNfYWRqdXN0bWVudDoKICAgICAgICB0b2tlblsnZGF0YSddID0gT3JkZXJlZERpY3QoKHJlcGxhY2VtZW50cy5nZXQoaywgayksIHYpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBrLCB2IGluIHRva2VuWydkYXRhJ10uaXRlbXMoKSkKCgpkZWYgaW1wbGllZFRhZ1Rva2VuKG5hbWUsIHR5cGU9IkVuZFRhZyIsIGF0dHJpYnV0ZXM9Tm9uZSwKICAgICAgICAgICAgICAgICAgICBzZWxmQ2xvc2luZz1GYWxzZSk6CiAgICBpZiBhdHRyaWJ1dGVzIGlzIE5vbmU6CiAgICAgICAgYXR0cmlidXRlcyA9IHt9CiAgICByZXR1cm4geyJ0eXBlIjogdG9rZW5UeXBlc1t0eXBlXSwgIm5hbWUiOiBuYW1lLCAiZGF0YSI6IGF0dHJpYnV0ZXMsCiAgICAgICAgICAgICJzZWxmQ2xvc2luZyI6IHNlbGZDbG9zaW5nfQoKCmNsYXNzIFBhcnNlRXJyb3IoRXhjZXB0aW9uKToKICAgICIiIkVycm9yIGluIHBhcnNlZCBkb2N1bWVudCIiIgogICAgcGFzcwpQSwMEFAAAAAAAAAAhANzHuzRhNwAAYTcAAD8AAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL3NlcmlhbGl6ZXIucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHVuaWNvZGVfbGl0ZXJhbHMKZnJvbSBwaXAuX3ZlbmRvci5zaXggaW1wb3J0IHRleHRfdHlwZQoKaW1wb3J0IHJlCgpmcm9tIGNvZGVjcyBpbXBvcnQgcmVnaXN0ZXJfZXJyb3IsIHhtbGNoYXJyZWZyZXBsYWNlX2Vycm9ycwoKZnJvbSAuY29uc3RhbnRzIGltcG9ydCB2b2lkRWxlbWVudHMsIGJvb2xlYW5BdHRyaWJ1dGVzLCBzcGFjZUNoYXJhY3RlcnMKZnJvbSAuY29uc3RhbnRzIGltcG9ydCByY2RhdGFFbGVtZW50cywgZW50aXRpZXMsIHhtbEVudGl0aWVzCmZyb20gLiBpbXBvcnQgdHJlZXdhbGtlcnMsIF91dGlscwpmcm9tIHhtbC5zYXguc2F4dXRpbHMgaW1wb3J0IGVzY2FwZQoKX3F1b3RlQXR0cmlidXRlU3BlY0NoYXJzID0gIiIuam9pbihzcGFjZUNoYXJhY3RlcnMpICsgIlwiJz08PmAiCl9xdW90ZUF0dHJpYnV0ZVNwZWMgPSByZS5jb21waWxlKCJbIiArIF9xdW90ZUF0dHJpYnV0ZVNwZWNDaGFycyArICJdIikKX3F1b3RlQXR0cmlidXRlTGVnYWN5ID0gcmUuY29tcGlsZSgiWyIgKyBfcXVvdGVBdHRyaWJ1dGVTcGVjQ2hhcnMgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwN1x4MDhcdFxuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJceDBiXHgwY1xyXHgwZVx4MGZceDEwXHgxMVx4MTJceDEzXHgxNFx4MTUiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4MTZceDE3XHgxOFx4MTlceDFhXHgxYlx4MWNceDFkXHgxZVx4MWYiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4MjBceDJmXHg2MFx4YTBcdTE2ODBcdTE4MGVcdTE4MGZcdTIwMDAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1MjAwMVx1MjAwMlx1MjAwM1x1MjAwNFx1MjAwNVx1MjAwNlx1MjAwNyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHUyMDA4XHUyMDA5XHUyMDBhXHUyMDI4XHUyMDI5XHUyMDJmXHUyMDVmIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwMDBdIikKCgpfZW5jb2RlX2VudGl0eV9tYXAgPSB7fQpfaXNfdWNzNCA9IGxlbigiXFUwMDEwRkZGRiIpID09IDEKZm9yIGssIHYgaW4gbGlzdChlbnRpdGllcy5pdGVtcygpKToKICAgICMgc2tpcCBtdWx0aS1jaGFyYWN0ZXIgZW50aXRpZXMKICAgIGlmICgoX2lzX3VjczQgYW5kIGxlbih2KSA+IDEpIG9yCiAgICAgICAgICAgIChub3QgX2lzX3VjczQgYW5kIGxlbih2KSA+IDIpKToKICAgICAgICBjb250aW51ZQogICAgaWYgdiAhPSAiJiI6CiAgICAgICAgaWYgbGVuKHYpID09IDI6CiAgICAgICAgICAgIHYgPSBfdXRpbHMuc3Vycm9nYXRlUGFpclRvQ29kZXBvaW50KHYpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgdiA9IG9yZCh2KQogICAgICAgIGlmIHYgbm90IGluIF9lbmNvZGVfZW50aXR5X21hcCBvciBrLmlzbG93ZXIoKToKICAgICAgICAgICAgIyBwcmVmZXIgJmx0OyBvdmVyICZMVDsgYW5kIHNpbWlsYXJseSBmb3IgJmFtcDssICZndDssIGV0Yy4KICAgICAgICAgICAgX2VuY29kZV9lbnRpdHlfbWFwW3ZdID0gawoKCmRlZiBodG1sZW50aXR5cmVwbGFjZV9lcnJvcnMoZXhjKToKICAgIGlmIGlzaW5zdGFuY2UoZXhjLCAoVW5pY29kZUVuY29kZUVycm9yLCBVbmljb2RlVHJhbnNsYXRlRXJyb3IpKToKICAgICAgICByZXMgPSBbXQogICAgICAgIGNvZGVwb2ludHMgPSBbXQogICAgICAgIHNraXAgPSBGYWxzZQogICAgICAgIGZvciBpLCBjIGluIGVudW1lcmF0ZShleGMub2JqZWN0W2V4Yy5zdGFydDpleGMuZW5kXSk6CiAgICAgICAgICAgIGlmIHNraXA6CiAgICAgICAgICAgICAgICBza2lwID0gRmFsc2UKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGluZGV4ID0gaSArIGV4Yy5zdGFydAogICAgICAgICAgICBpZiBfdXRpbHMuaXNTdXJyb2dhdGVQYWlyKGV4Yy5vYmplY3RbaW5kZXg6bWluKFtleGMuZW5kLCBpbmRleCArIDJdKV0pOgogICAgICAgICAgICAgICAgY29kZXBvaW50ID0gX3V0aWxzLnN1cnJvZ2F0ZVBhaXJUb0NvZGVwb2ludChleGMub2JqZWN0W2luZGV4OmluZGV4ICsgMl0pCiAgICAgICAgICAgICAgICBza2lwID0gVHJ1ZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgY29kZXBvaW50ID0gb3JkKGMpCiAgICAgICAgICAgIGNvZGVwb2ludHMuYXBwZW5kKGNvZGVwb2ludCkKICAgICAgICBmb3IgY3AgaW4gY29kZXBvaW50czoKICAgICAgICAgICAgZSA9IF9lbmNvZGVfZW50aXR5X21hcC5nZXQoY3ApCiAgICAgICAgICAgIGlmIGU6CiAgICAgICAgICAgICAgICByZXMuYXBwZW5kKCImIikKICAgICAgICAgICAgICAgIHJlcy5hcHBlbmQoZSkKICAgICAgICAgICAgICAgIGlmIG5vdCBlLmVuZHN3aXRoKCI7Iik6CiAgICAgICAgICAgICAgICAgICAgcmVzLmFwcGVuZCgiOyIpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXMuYXBwZW5kKCImI3glczsiICUgKGhleChjcClbMjpdKSkKICAgICAgICByZXR1cm4gKCIiLmpvaW4ocmVzKSwgZXhjLmVuZCkKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIHhtbGNoYXJyZWZyZXBsYWNlX2Vycm9ycyhleGMpCgpyZWdpc3Rlcl9lcnJvcigiaHRtbGVudGl0eXJlcGxhY2UiLCBodG1sZW50aXR5cmVwbGFjZV9lcnJvcnMpCgoKZGVmIHNlcmlhbGl6ZShpbnB1dCwgdHJlZT0iZXRyZWUiLCBlbmNvZGluZz1Ob25lLCAqKnNlcmlhbGl6ZXJfb3B0cyk6CiAgICAjIFhYWDogU2hvdWxkIHdlIGNhY2hlIHRoaXM/CiAgICB3YWxrZXIgPSB0cmVld2Fsa2Vycy5nZXRUcmVlV2Fsa2VyKHRyZWUpCiAgICBzID0gSFRNTFNlcmlhbGl6ZXIoKipzZXJpYWxpemVyX29wdHMpCiAgICByZXR1cm4gcy5yZW5kZXIod2Fsa2VyKGlucHV0KSwgZW5jb2RpbmcpCgoKY2xhc3MgSFRNTFNlcmlhbGl6ZXIob2JqZWN0KToKCiAgICAjIGF0dHJpYnV0ZSBxdW90aW5nIG9wdGlvbnMKICAgIHF1b3RlX2F0dHJfdmFsdWVzID0gImxlZ2FjeSIgICMgYmUgc2VjdXJlIGJ5IGRlZmF1bHQKICAgIHF1b3RlX2NoYXIgPSAnIicKICAgIHVzZV9iZXN0X3F1b3RlX2NoYXIgPSBUcnVlCgogICAgIyB0YWcgc3ludGF4IG9wdGlvbnMKICAgIG9taXRfb3B0aW9uYWxfdGFncyA9IFRydWUKICAgIG1pbmltaXplX2Jvb2xlYW5fYXR0cmlidXRlcyA9IFRydWUKICAgIHVzZV90cmFpbGluZ19zb2xpZHVzID0gRmFsc2UKICAgIHNwYWNlX2JlZm9yZV90cmFpbGluZ19zb2xpZHVzID0gVHJ1ZQoKICAgICMgZXNjYXBpbmcgb3B0aW9ucwogICAgZXNjYXBlX2x0X2luX2F0dHJzID0gRmFsc2UKICAgIGVzY2FwZV9yY2RhdGEgPSBGYWxzZQogICAgcmVzb2x2ZV9lbnRpdGllcyA9IFRydWUKCiAgICAjIG1pc2NlbGxhbmVvdXMgb3B0aW9ucwogICAgYWxwaGFiZXRpY2FsX2F0dHJpYnV0ZXMgPSBGYWxzZQogICAgaW5qZWN0X21ldGFfY2hhcnNldCA9IFRydWUKICAgIHN0cmlwX3doaXRlc3BhY2UgPSBGYWxzZQogICAgc2FuaXRpemUgPSBGYWxzZQoKICAgIG9wdGlvbnMgPSAoInF1b3RlX2F0dHJfdmFsdWVzIiwgInF1b3RlX2NoYXIiLCAidXNlX2Jlc3RfcXVvdGVfY2hhciIsCiAgICAgICAgICAgICAgICJvbWl0X29wdGlvbmFsX3RhZ3MiLCAibWluaW1pemVfYm9vbGVhbl9hdHRyaWJ1dGVzIiwKICAgICAgICAgICAgICAgInVzZV90cmFpbGluZ19zb2xpZHVzIiwgInNwYWNlX2JlZm9yZV90cmFpbGluZ19zb2xpZHVzIiwKICAgICAgICAgICAgICAgImVzY2FwZV9sdF9pbl9hdHRycyIsICJlc2NhcGVfcmNkYXRhIiwgInJlc29sdmVfZW50aXRpZXMiLAogICAgICAgICAgICAgICAiYWxwaGFiZXRpY2FsX2F0dHJpYnV0ZXMiLCAiaW5qZWN0X21ldGFfY2hhcnNldCIsCiAgICAgICAgICAgICAgICJzdHJpcF93aGl0ZXNwYWNlIiwgInNhbml0aXplIikKCiAgICBkZWYgX19pbml0X18oc2VsZiwgKiprd2FyZ3MpOgogICAgICAgICIiIkluaXRpYWxpemUgSFRNTFNlcmlhbGl6ZXIuCgogICAgICAgIEtleXdvcmQgb3B0aW9ucyAoZGVmYXVsdCBnaXZlbiBmaXJzdCB1bmxlc3Mgc3BlY2lmaWVkKSBpbmNsdWRlOgoKICAgICAgICBpbmplY3RfbWV0YV9jaGFyc2V0PVRydWV8RmFsc2UKICAgICAgICAgIFdoZXRoZXIgaXQgaW5zZXJ0IGEgbWV0YSBlbGVtZW50IHRvIGRlZmluZSB0aGUgY2hhcmFjdGVyIHNldCBvZiB0aGUKICAgICAgICAgIGRvY3VtZW50LgogICAgICAgIHF1b3RlX2F0dHJfdmFsdWVzPSJsZWdhY3kifCJzcGVjInwiYWx3YXlzIgogICAgICAgICAgV2hldGhlciB0byBxdW90ZSBhdHRyaWJ1dGUgdmFsdWVzIHRoYXQgZG9uJ3QgcmVxdWlyZSBxdW90aW5nCiAgICAgICAgICBwZXIgbGVnYWN5IGJyb3dzZXIgYmVoYXZpb3VyLCB3aGVuIHJlcXVpcmVkIGJ5IHRoZSBzdGFuZGFyZCwgb3IgYWx3YXlzLgogICAgICAgIHF1b3RlX2NoYXI9dSciJ3x1IiciCiAgICAgICAgICBVc2UgZ2l2ZW4gcXVvdGUgY2hhcmFjdGVyIGZvciBhdHRyaWJ1dGUgcXVvdGluZy4gRGVmYXVsdCBpcyB0bwogICAgICAgICAgdXNlIGRvdWJsZSBxdW90ZSB1bmxlc3MgYXR0cmlidXRlIHZhbHVlIGNvbnRhaW5zIGEgZG91YmxlIHF1b3RlLAogICAgICAgICAgaW4gd2hpY2ggY2FzZSBzaW5nbGUgcXVvdGVzIGFyZSB1c2VkIGluc3RlYWQuCiAgICAgICAgZXNjYXBlX2x0X2luX2F0dHJzPUZhbHNlfFRydWUKICAgICAgICAgIFdoZXRoZXIgdG8gZXNjYXBlIDwgaW4gYXR0cmlidXRlIHZhbHVlcy4KICAgICAgICBlc2NhcGVfcmNkYXRhPUZhbHNlfFRydWUKICAgICAgICAgIFdoZXRoZXIgdG8gZXNjYXBlIGNoYXJhY3RlcnMgdGhhdCBuZWVkIHRvIGJlIGVzY2FwZWQgd2l0aGluIG5vcm1hbAogICAgICAgICAgZWxlbWVudHMgd2l0aGluIHJjZGF0YSBlbGVtZW50cyBzdWNoIGFzIHN0eWxlLgogICAgICAgIHJlc29sdmVfZW50aXRpZXM9VHJ1ZXxGYWxzZQogICAgICAgICAgV2hldGhlciB0byByZXNvbHZlIG5hbWVkIGNoYXJhY3RlciBlbnRpdGllcyB0aGF0IGFwcGVhciBpbiB0aGUKICAgICAgICAgIHNvdXJjZSB0cmVlLiBUaGUgWE1MIHByZWRlZmluZWQgZW50aXRpZXMgJmx0OyAmZ3Q7ICZhbXA7ICZxdW90OyAmYXBvczsKICAgICAgICAgIGFyZSB1bmFmZmVjdGVkIGJ5IHRoaXMgc2V0dGluZy4KICAgICAgICBzdHJpcF93aGl0ZXNwYWNlPUZhbHNlfFRydWUKICAgICAgICAgIFdoZXRoZXIgdG8gcmVtb3ZlIHNlbWFudGljYWxseSBtZWFuaW5nbGVzcyB3aGl0ZXNwYWNlLiAoVGhpcwogICAgICAgICAgY29tcHJlc3NlcyBhbGwgd2hpdGVzcGFjZSB0byBhIHNpbmdsZSBzcGFjZSBleGNlcHQgd2l0aGluIHByZS4pCiAgICAgICAgbWluaW1pemVfYm9vbGVhbl9hdHRyaWJ1dGVzPVRydWV8RmFsc2UKICAgICAgICAgIFNob3J0ZW5zIGJvb2xlYW4gYXR0cmlidXRlcyB0byBnaXZlIGp1c3QgdGhlIGF0dHJpYnV0ZSB2YWx1ZSwKICAgICAgICAgIGZvciBleGFtcGxlIDxpbnB1dCBkaXNhYmxlZD0iZGlzYWJsZWQiPiBiZWNvbWVzIDxpbnB1dCBkaXNhYmxlZD4uCiAgICAgICAgdXNlX3RyYWlsaW5nX3NvbGlkdXM9RmFsc2V8VHJ1ZQogICAgICAgICAgSW5jbHVkZXMgYSBjbG9zZS10YWcgc2xhc2ggYXQgdGhlIGVuZCBvZiB0aGUgc3RhcnQgdGFnIG9mIHZvaWQKICAgICAgICAgIGVsZW1lbnRzIChlbXB0eSBlbGVtZW50cyB3aG9zZSBlbmQgdGFnIGlzIGZvcmJpZGRlbikuIEUuZy4gPGhyLz4uCiAgICAgICAgc3BhY2VfYmVmb3JlX3RyYWlsaW5nX3NvbGlkdXM9VHJ1ZXxGYWxzZQogICAgICAgICAgUGxhY2VzIGEgc3BhY2UgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBjbG9zaW5nIHNsYXNoIGluIGEgdGFnCiAgICAgICAgICB1c2luZyBhIHRyYWlsaW5nIHNvbGlkdXMuIEUuZy4gPGhyIC8+LiBSZXF1aXJlcyB1c2VfdHJhaWxpbmdfc29saWR1cy4KICAgICAgICBzYW5pdGl6ZT1GYWxzZXxUcnVlCiAgICAgICAgICBTdHJpcCBhbGwgdW5zYWZlIG9yIHVua25vd24gY29uc3RydWN0cyBmcm9tIG91dHB1dC4KICAgICAgICAgIFNlZSBgaHRtbDVsaWIgdXNlciBkb2N1bWVudGF0aW9uYF8KICAgICAgICBvbWl0X29wdGlvbmFsX3RhZ3M9VHJ1ZXxGYWxzZQogICAgICAgICAgT21pdCBzdGFydC9lbmQgdGFncyB0aGF0IGFyZSBvcHRpb25hbC4KICAgICAgICBhbHBoYWJldGljYWxfYXR0cmlidXRlcz1GYWxzZXxUcnVlCiAgICAgICAgICBSZW9yZGVyIGF0dHJpYnV0ZXMgdG8gYmUgaW4gYWxwaGFiZXRpY2FsIG9yZGVyLgoKICAgICAgICAuLiBfaHRtbDVsaWIgdXNlciBkb2N1bWVudGF0aW9uOiBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvaHRtbDVsaWIvd2lraS9Vc2VyRG9jdW1lbnRhdGlvbgogICAgICAgICIiIgogICAgICAgIHVuZXhwZWN0ZWRfYXJncyA9IGZyb3plbnNldChrd2FyZ3MpIC0gZnJvemVuc2V0KHNlbGYub3B0aW9ucykKICAgICAgICBpZiBsZW4odW5leHBlY3RlZF9hcmdzKSA+IDA6CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiX19pbml0X18oKSBnb3QgYW4gdW5leHBlY3RlZCBrZXl3b3JkIGFyZ3VtZW50ICclcyciICUgbmV4dChpdGVyKHVuZXhwZWN0ZWRfYXJncykpKQogICAgICAgIGlmICdxdW90ZV9jaGFyJyBpbiBrd2FyZ3M6CiAgICAgICAgICAgIHNlbGYudXNlX2Jlc3RfcXVvdGVfY2hhciA9IEZhbHNlCiAgICAgICAgZm9yIGF0dHIgaW4gc2VsZi5vcHRpb25zOgogICAgICAgICAgICBzZXRhdHRyKHNlbGYsIGF0dHIsIGt3YXJncy5nZXQoYXR0ciwgZ2V0YXR0cihzZWxmLCBhdHRyKSkpCiAgICAgICAgc2VsZi5lcnJvcnMgPSBbXQogICAgICAgIHNlbGYuc3RyaWN0ID0gRmFsc2UKCiAgICBkZWYgZW5jb2RlKHNlbGYsIHN0cmluZyk6CiAgICAgICAgYXNzZXJ0KGlzaW5zdGFuY2Uoc3RyaW5nLCB0ZXh0X3R5cGUpKQogICAgICAgIGlmIHNlbGYuZW5jb2Rpbmc6CiAgICAgICAgICAgIHJldHVybiBzdHJpbmcuZW5jb2RlKHNlbGYuZW5jb2RpbmcsICJodG1sZW50aXR5cmVwbGFjZSIpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHN0cmluZwoKICAgIGRlZiBlbmNvZGVTdHJpY3Qoc2VsZiwgc3RyaW5nKToKICAgICAgICBhc3NlcnQoaXNpbnN0YW5jZShzdHJpbmcsIHRleHRfdHlwZSkpCiAgICAgICAgaWYgc2VsZi5lbmNvZGluZzoKICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5lbmNvZGUoc2VsZi5lbmNvZGluZywgInN0cmljdCIpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHN0cmluZwoKICAgIGRlZiBzZXJpYWxpemUoc2VsZiwgdHJlZXdhbGtlciwgZW5jb2Rpbmc9Tm9uZSk6CiAgICAgICAgIyBweWxpbnQ6ZGlzYWJsZT10b28tbWFueS1uZXN0ZWQtYmxvY2tzCiAgICAgICAgc2VsZi5lbmNvZGluZyA9IGVuY29kaW5nCiAgICAgICAgaW5fY2RhdGEgPSBGYWxzZQogICAgICAgIHNlbGYuZXJyb3JzID0gW10KCiAgICAgICAgaWYgZW5jb2RpbmcgYW5kIHNlbGYuaW5qZWN0X21ldGFfY2hhcnNldDoKICAgICAgICAgICAgZnJvbSAuZmlsdGVycy5pbmplY3RfbWV0YV9jaGFyc2V0IGltcG9ydCBGaWx0ZXIKICAgICAgICAgICAgdHJlZXdhbGtlciA9IEZpbHRlcih0cmVld2Fsa2VyLCBlbmNvZGluZykKICAgICAgICAjIEFscGhhYmV0aWNhbCBhdHRyaWJ1dGVzIGlzIGhlcmUgdW5kZXIgdGhlIGFzc3VtcHRpb24gdGhhdCBub25lIG9mCiAgICAgICAgIyB0aGUgbGF0ZXIgZmlsdGVycyBhZGQgb3IgY2hhbmdlIG9yZGVyIG9mIGF0dHJpYnV0ZXM7IGl0IG5lZWRzIHRvIGJlCiAgICAgICAgIyBiZWZvcmUgdGhlIHNhbml0aXplciBzbyBlc2NhcGVkIGVsZW1lbnRzIGNvbWUgb3V0IGNvcnJlY3RseQogICAgICAgIGlmIHNlbGYuYWxwaGFiZXRpY2FsX2F0dHJpYnV0ZXM6CiAgICAgICAgICAgIGZyb20gLmZpbHRlcnMuYWxwaGFiZXRpY2FsYXR0cmlidXRlcyBpbXBvcnQgRmlsdGVyCiAgICAgICAgICAgIHRyZWV3YWxrZXIgPSBGaWx0ZXIodHJlZXdhbGtlcikKICAgICAgICAjIFdoaXRlc3BhY2VGaWx0ZXIgc2hvdWxkIGJlIHVzZWQgYmVmb3JlIE9wdGlvbmFsVGFnRmlsdGVyCiAgICAgICAgIyBmb3IgbWF4aW11bSBlZmZpY2llbnRseSBvZiB0aGlzIGxhdHRlciBmaWx0ZXIKICAgICAgICBpZiBzZWxmLnN0cmlwX3doaXRlc3BhY2U6CiAgICAgICAgICAgIGZyb20gLmZpbHRlcnMud2hpdGVzcGFjZSBpbXBvcnQgRmlsdGVyCiAgICAgICAgICAgIHRyZWV3YWxrZXIgPSBGaWx0ZXIodHJlZXdhbGtlcikKICAgICAgICBpZiBzZWxmLnNhbml0aXplOgogICAgICAgICAgICBmcm9tIC5maWx0ZXJzLnNhbml0aXplciBpbXBvcnQgRmlsdGVyCiAgICAgICAgICAgIHRyZWV3YWxrZXIgPSBGaWx0ZXIodHJlZXdhbGtlcikKICAgICAgICBpZiBzZWxmLm9taXRfb3B0aW9uYWxfdGFnczoKICAgICAgICAgICAgZnJvbSAuZmlsdGVycy5vcHRpb25hbHRhZ3MgaW1wb3J0IEZpbHRlcgogICAgICAgICAgICB0cmVld2Fsa2VyID0gRmlsdGVyKHRyZWV3YWxrZXIpCgogICAgICAgIGZvciB0b2tlbiBpbiB0cmVld2Fsa2VyOgogICAgICAgICAgICB0eXBlID0gdG9rZW5bInR5cGUiXQogICAgICAgICAgICBpZiB0eXBlID09ICJEb2N0eXBlIjoKICAgICAgICAgICAgICAgIGRvY3R5cGUgPSAiPCFET0NUWVBFICVzIiAlIHRva2VuWyJuYW1lIl0KCiAgICAgICAgICAgICAgICBpZiB0b2tlblsicHVibGljSWQiXToKICAgICAgICAgICAgICAgICAgICBkb2N0eXBlICs9ICcgUFVCTElDICIlcyInICUgdG9rZW5bInB1YmxpY0lkIl0KICAgICAgICAgICAgICAgIGVsaWYgdG9rZW5bInN5c3RlbUlkIl06CiAgICAgICAgICAgICAgICAgICAgZG9jdHlwZSArPSAiIFNZU1RFTSIKICAgICAgICAgICAgICAgIGlmIHRva2VuWyJzeXN0ZW1JZCJdOgogICAgICAgICAgICAgICAgICAgIGlmIHRva2VuWyJzeXN0ZW1JZCJdLmZpbmQoJyInKSA+PSAwOgogICAgICAgICAgICAgICAgICAgICAgICBpZiB0b2tlblsic3lzdGVtSWQiXS5maW5kKCInIikgPj0gMDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2VyaWFsaXplRXJyb3IoIlN5c3RlbSBpZGVudGlmZXIgY29udGFpbnMgYm90aCBzaW5nbGUgYW5kIGRvdWJsZSBxdW90ZSBjaGFyYWN0ZXJzIikKICAgICAgICAgICAgICAgICAgICAgICAgcXVvdGVfY2hhciA9ICInIgogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIHF1b3RlX2NoYXIgPSAnIicKICAgICAgICAgICAgICAgICAgICBkb2N0eXBlICs9ICIgJXMlcyVzIiAlIChxdW90ZV9jaGFyLCB0b2tlblsic3lzdGVtSWQiXSwgcXVvdGVfY2hhcikKCiAgICAgICAgICAgICAgICBkb2N0eXBlICs9ICI+IgogICAgICAgICAgICAgICAgeWllbGQgc2VsZi5lbmNvZGVTdHJpY3QoZG9jdHlwZSkKCiAgICAgICAgICAgIGVsaWYgdHlwZSBpbiAoIkNoYXJhY3RlcnMiLCAiU3BhY2VDaGFyYWN0ZXJzIik6CiAgICAgICAgICAgICAgICBpZiB0eXBlID09ICJTcGFjZUNoYXJhY3RlcnMiIG9yIGluX2NkYXRhOgogICAgICAgICAgICAgICAgICAgIGlmIGluX2NkYXRhIGFuZCB0b2tlblsiZGF0YSJdLmZpbmQoIjwvIikgPj0gMDoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXJpYWxpemVFcnJvcigiVW5leHBlY3RlZCA8LyBpbiBDREFUQSIpCiAgICAgICAgICAgICAgICAgICAgeWllbGQgc2VsZi5lbmNvZGUodG9rZW5bImRhdGEiXSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgeWllbGQgc2VsZi5lbmNvZGUoZXNjYXBlKHRva2VuWyJkYXRhIl0pKQoKICAgICAgICAgICAgZWxpZiB0eXBlIGluICgiU3RhcnRUYWciLCAiRW1wdHlUYWciKToKICAgICAgICAgICAgICAgIG5hbWUgPSB0b2tlblsibmFtZSJdCiAgICAgICAgICAgICAgICB5aWVsZCBzZWxmLmVuY29kZVN0cmljdCgiPCVzIiAlIG5hbWUpCiAgICAgICAgICAgICAgICBpZiBuYW1lIGluIHJjZGF0YUVsZW1lbnRzIGFuZCBub3Qgc2VsZi5lc2NhcGVfcmNkYXRhOgogICAgICAgICAgICAgICAgICAgIGluX2NkYXRhID0gVHJ1ZQogICAgICAgICAgICAgICAgZWxpZiBpbl9jZGF0YToKICAgICAgICAgICAgICAgICAgICBzZWxmLnNlcmlhbGl6ZUVycm9yKCJVbmV4cGVjdGVkIGNoaWxkIGVsZW1lbnQgb2YgYSBDREFUQSBlbGVtZW50IikKICAgICAgICAgICAgICAgIGZvciAoXywgYXR0cl9uYW1lKSwgYXR0cl92YWx1ZSBpbiB0b2tlblsiZGF0YSJdLml0ZW1zKCk6CiAgICAgICAgICAgICAgICAgICAgIyBUT0RPOiBBZGQgbmFtZXNwYWNlIHN1cHBvcnQgaGVyZQogICAgICAgICAgICAgICAgICAgIGsgPSBhdHRyX25hbWUKICAgICAgICAgICAgICAgICAgICB2ID0gYXR0cl92YWx1ZQogICAgICAgICAgICAgICAgICAgIHlpZWxkIHNlbGYuZW5jb2RlU3RyaWN0KCcgJykKCiAgICAgICAgICAgICAgICAgICAgeWllbGQgc2VsZi5lbmNvZGVTdHJpY3QoaykKICAgICAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5taW5pbWl6ZV9ib29sZWFuX2F0dHJpYnV0ZXMgb3IgXAogICAgICAgICAgICAgICAgICAgICAgICAoayBub3QgaW4gYm9vbGVhbkF0dHJpYnV0ZXMuZ2V0KG5hbWUsIHR1cGxlKCkpIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgayBub3QgaW4gYm9vbGVhbkF0dHJpYnV0ZXMuZ2V0KCIiLCB0dXBsZSgpKSk6CiAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIHNlbGYuZW5jb2RlU3RyaWN0KCI9IikKICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5xdW90ZV9hdHRyX3ZhbHVlcyA9PSAiYWx3YXlzIiBvciBsZW4odikgPT0gMDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1b3RlX2F0dHIgPSBUcnVlCiAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgc2VsZi5xdW90ZV9hdHRyX3ZhbHVlcyA9PSAic3BlYyI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdW90ZV9hdHRyID0gX3F1b3RlQXR0cmlidXRlU3BlYy5zZWFyY2godikgaXMgbm90IE5vbmUKICAgICAgICAgICAgICAgICAgICAgICAgZWxpZiBzZWxmLnF1b3RlX2F0dHJfdmFsdWVzID09ICJsZWdhY3kiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVvdGVfYXR0ciA9IF9xdW90ZUF0dHJpYnV0ZUxlZ2FjeS5zZWFyY2godikgaXMgbm90IE5vbmUKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInF1b3RlX2F0dHJfdmFsdWVzIG11c3QgYmUgb25lIG9mOiAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInYWx3YXlzJywgJ3NwZWMnLCBvciAnbGVnYWN5JyIpCiAgICAgICAgICAgICAgICAgICAgICAgIHYgPSB2LnJlcGxhY2UoIiYiLCAiJmFtcDsiKQogICAgICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmVzY2FwZV9sdF9pbl9hdHRyczoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSB2LnJlcGxhY2UoIjwiLCAiJmx0OyIpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHF1b3RlX2F0dHI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdW90ZV9jaGFyID0gc2VsZi5xdW90ZV9jaGFyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLnVzZV9iZXN0X3F1b3RlX2NoYXI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgIiciIGluIHYgYW5kICciJyBub3QgaW4gdjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVvdGVfY2hhciA9ICciJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgJyInIGluIHYgYW5kICInIiBub3QgaW4gdjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVvdGVfY2hhciA9ICInIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgcXVvdGVfY2hhciA9PSAiJyI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHYucmVwbGFjZSgiJyIsICImIzM5OyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSB2LnJlcGxhY2UoJyInLCAiJnF1b3Q7IikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIHNlbGYuZW5jb2RlU3RyaWN0KHF1b3RlX2NoYXIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBzZWxmLmVuY29kZSh2KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgc2VsZi5lbmNvZGVTdHJpY3QocXVvdGVfY2hhcikKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIHNlbGYuZW5jb2RlKHYpCiAgICAgICAgICAgICAgICBpZiBuYW1lIGluIHZvaWRFbGVtZW50cyBhbmQgc2VsZi51c2VfdHJhaWxpbmdfc29saWR1czoKICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLnNwYWNlX2JlZm9yZV90cmFpbGluZ19zb2xpZHVzOgogICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBzZWxmLmVuY29kZVN0cmljdCgiIC8iKQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIHNlbGYuZW5jb2RlU3RyaWN0KCIvIikKICAgICAgICAgICAgICAgIHlpZWxkIHNlbGYuZW5jb2RlKCI+IikKCiAgICAgICAgICAgIGVsaWYgdHlwZSA9PSAiRW5kVGFnIjoKICAgICAgICAgICAgICAgIG5hbWUgPSB0b2tlblsibmFtZSJdCiAgICAgICAgICAgICAgICBpZiBuYW1lIGluIHJjZGF0YUVsZW1lbnRzOgogICAgICAgICAgICAgICAgICAgIGluX2NkYXRhID0gRmFsc2UKICAgICAgICAgICAgICAgIGVsaWYgaW5fY2RhdGE6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXJpYWxpemVFcnJvcigiVW5leHBlY3RlZCBjaGlsZCBlbGVtZW50IG9mIGEgQ0RBVEEgZWxlbWVudCIpCiAgICAgICAgICAgICAgICB5aWVsZCBzZWxmLmVuY29kZVN0cmljdCgiPC8lcz4iICUgbmFtZSkKCiAgICAgICAgICAgIGVsaWYgdHlwZSA9PSAiQ29tbWVudCI6CiAgICAgICAgICAgICAgICBkYXRhID0gdG9rZW5bImRhdGEiXQogICAgICAgICAgICAgICAgaWYgZGF0YS5maW5kKCItLSIpID49IDA6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXJpYWxpemVFcnJvcigiQ29tbWVudCBjb250YWlucyAtLSIpCiAgICAgICAgICAgICAgICB5aWVsZCBzZWxmLmVuY29kZVN0cmljdCgiPCEtLSVzLS0+IiAlIHRva2VuWyJkYXRhIl0pCgogICAgICAgICAgICBlbGlmIHR5cGUgPT0gIkVudGl0eSI6CiAgICAgICAgICAgICAgICBuYW1lID0gdG9rZW5bIm5hbWUiXQogICAgICAgICAgICAgICAga2V5ID0gbmFtZSArICI7IgogICAgICAgICAgICAgICAgaWYga2V5IG5vdCBpbiBlbnRpdGllczoKICAgICAgICAgICAgICAgICAgICBzZWxmLnNlcmlhbGl6ZUVycm9yKCJFbnRpdHkgJXMgbm90IHJlY29nbml6ZWQiICUgbmFtZSkKICAgICAgICAgICAgICAgIGlmIHNlbGYucmVzb2x2ZV9lbnRpdGllcyBhbmQga2V5IG5vdCBpbiB4bWxFbnRpdGllczoKICAgICAgICAgICAgICAgICAgICBkYXRhID0gZW50aXRpZXNba2V5XQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBkYXRhID0gIiYlczsiICUgbmFtZQogICAgICAgICAgICAgICAgeWllbGQgc2VsZi5lbmNvZGVTdHJpY3QoZGF0YSkKCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLnNlcmlhbGl6ZUVycm9yKHRva2VuWyJkYXRhIl0pCgogICAgZGVmIHJlbmRlcihzZWxmLCB0cmVld2Fsa2VyLCBlbmNvZGluZz1Ob25lKToKICAgICAgICBpZiBlbmNvZGluZzoKICAgICAgICAgICAgcmV0dXJuIGIiIi5qb2luKGxpc3Qoc2VsZi5zZXJpYWxpemUodHJlZXdhbGtlciwgZW5jb2RpbmcpKSkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gIiIuam9pbihsaXN0KHNlbGYuc2VyaWFsaXplKHRyZWV3YWxrZXIpKSkKCiAgICBkZWYgc2VyaWFsaXplRXJyb3Ioc2VsZiwgZGF0YT0iWFhYIEVSUk9SIE1FU1NBR0UgTkVFREVEIik6CiAgICAgICAgIyBYWFggVGhlIGlkZWEgaXMgdG8gbWFrZSBkYXRhIG1hbmRhdG9yeS4KICAgICAgICBzZWxmLmVycm9ycy5hcHBlbmQoZGF0YSkKICAgICAgICBpZiBzZWxmLnN0cmljdDoKICAgICAgICAgICAgcmFpc2UgU2VyaWFsaXplRXJyb3IKCgpjbGFzcyBTZXJpYWxpemVFcnJvcihFeGNlcHRpb24pOgogICAgIiIiRXJyb3IgaW4gc2VyaWFsaXplZCB0cmVlIiIiCiAgICBwYXNzClBLAwQUAAAAAAAAACEAgjJjJNAAAADQAAAASgAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvdHJlZWFkYXB0ZXJzL19faW5pdF9fLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCB1bmljb2RlX2xpdGVyYWxzCgpmcm9tIC4gaW1wb3J0IHNheAoKX19hbGxfXyA9IFsic2F4Il0KCnRyeToKICAgIGZyb20gLiBpbXBvcnQgZ2Vuc2hpICAjIG5vcWEKZXhjZXB0IEltcG9ydEVycm9yOgogICAgcGFzcwplbHNlOgogICAgX19hbGxfXy5hcHBlbmQoImdlbnNoaSIpClBLAwQUAAAAAAAAACEAMSfHvhMGAAATBgAASAAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvdHJlZWFkYXB0ZXJzL2dlbnNoaS5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgdW5pY29kZV9saXRlcmFscwoKZnJvbSBnZW5zaGkuY29yZSBpbXBvcnQgUU5hbWUsIEF0dHJzCmZyb20gZ2Vuc2hpLmNvcmUgaW1wb3J0IFNUQVJULCBFTkQsIFRFWFQsIENPTU1FTlQsIERPQ1RZUEUKCgpkZWYgdG9fZ2Vuc2hpKHdhbGtlcik6CiAgICB0ZXh0ID0gW10KICAgIGZvciB0b2tlbiBpbiB3YWxrZXI6CiAgICAgICAgdHlwZSA9IHRva2VuWyJ0eXBlIl0KICAgICAgICBpZiB0eXBlIGluICgiQ2hhcmFjdGVycyIsICJTcGFjZUNoYXJhY3RlcnMiKToKICAgICAgICAgICAgdGV4dC5hcHBlbmQodG9rZW5bImRhdGEiXSkKICAgICAgICBlbGlmIHRleHQ6CiAgICAgICAgICAgIHlpZWxkIFRFWFQsICIiLmpvaW4odGV4dCksIChOb25lLCAtMSwgLTEpCiAgICAgICAgICAgIHRleHQgPSBbXQoKICAgICAgICBpZiB0eXBlIGluICgiU3RhcnRUYWciLCAiRW1wdHlUYWciKToKICAgICAgICAgICAgaWYgdG9rZW5bIm5hbWVzcGFjZSJdOgogICAgICAgICAgICAgICAgbmFtZSA9ICJ7JXN9JXMiICUgKHRva2VuWyJuYW1lc3BhY2UiXSwgdG9rZW5bIm5hbWUiXSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIG5hbWUgPSB0b2tlblsibmFtZSJdCiAgICAgICAgICAgIGF0dHJzID0gQXR0cnMoWyhRTmFtZSgieyVzfSVzIiAlIGF0dHIgaWYgYXR0clswXSBpcyBub3QgTm9uZSBlbHNlIGF0dHJbMV0pLCB2YWx1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGF0dHIsIHZhbHVlIGluIHRva2VuWyJkYXRhIl0uaXRlbXMoKV0pCiAgICAgICAgICAgIHlpZWxkIChTVEFSVCwgKFFOYW1lKG5hbWUpLCBhdHRycyksIChOb25lLCAtMSwgLTEpKQogICAgICAgICAgICBpZiB0eXBlID09ICJFbXB0eVRhZyI6CiAgICAgICAgICAgICAgICB0eXBlID0gIkVuZFRhZyIKCiAgICAgICAgaWYgdHlwZSA9PSAiRW5kVGFnIjoKICAgICAgICAgICAgaWYgdG9rZW5bIm5hbWVzcGFjZSJdOgogICAgICAgICAgICAgICAgbmFtZSA9ICJ7JXN9JXMiICUgKHRva2VuWyJuYW1lc3BhY2UiXSwgdG9rZW5bIm5hbWUiXSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIG5hbWUgPSB0b2tlblsibmFtZSJdCgogICAgICAgICAgICB5aWVsZCBFTkQsIFFOYW1lKG5hbWUpLCAoTm9uZSwgLTEsIC0xKQoKICAgICAgICBlbGlmIHR5cGUgPT0gIkNvbW1lbnQiOgogICAgICAgICAgICB5aWVsZCBDT01NRU5ULCB0b2tlblsiZGF0YSJdLCAoTm9uZSwgLTEsIC0xKQoKICAgICAgICBlbGlmIHR5cGUgPT0gIkRvY3R5cGUiOgogICAgICAgICAgICB5aWVsZCBET0NUWVBFLCAodG9rZW5bIm5hbWUiXSwgdG9rZW5bInB1YmxpY0lkIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlblsic3lzdGVtSWQiXSksIChOb25lLCAtMSwgLTEpCgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHBhc3MgICMgRklYTUU6IFdoYXQgdG8gZG8/CgogICAgaWYgdGV4dDoKICAgICAgICB5aWVsZCBURVhULCAiIi5qb2luKHRleHQpLCAoTm9uZSwgLTEsIC0xKQpQSwMEFAAAAAAAAAAhAORcXxB9BgAAfQYAAEUAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL3RyZWVhZGFwdGVycy9zYXgucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHVuaWNvZGVfbGl0ZXJhbHMKCmZyb20geG1sLnNheC54bWxyZWFkZXIgaW1wb3J0IEF0dHJpYnV0ZXNOU0ltcGwKCmZyb20gLi5jb25zdGFudHMgaW1wb3J0IGFkanVzdEZvcmVpZ25BdHRyaWJ1dGVzLCB1bmFkanVzdEZvcmVpZ25BdHRyaWJ1dGVzCgpwcmVmaXhfbWFwcGluZyA9IHt9CmZvciBwcmVmaXgsIGxvY2FsTmFtZSwgbmFtZXNwYWNlIGluIGFkanVzdEZvcmVpZ25BdHRyaWJ1dGVzLnZhbHVlcygpOgogICAgaWYgcHJlZml4IGlzIG5vdCBOb25lOgogICAgICAgIHByZWZpeF9tYXBwaW5nW3ByZWZpeF0gPSBuYW1lc3BhY2UKCgpkZWYgdG9fc2F4KHdhbGtlciwgaGFuZGxlcik6CiAgICAiIiJDYWxsIFNBWC1saWtlIGNvbnRlbnQgaGFuZGxlciBiYXNlZCBvbiB0cmVld2Fsa2VyIHdhbGtlciIiIgogICAgaGFuZGxlci5zdGFydERvY3VtZW50KCkKICAgIGZvciBwcmVmaXgsIG5hbWVzcGFjZSBpbiBwcmVmaXhfbWFwcGluZy5pdGVtcygpOgogICAgICAgIGhhbmRsZXIuc3RhcnRQcmVmaXhNYXBwaW5nKHByZWZpeCwgbmFtZXNwYWNlKQoKICAgIGZvciB0b2tlbiBpbiB3YWxrZXI6CiAgICAgICAgdHlwZSA9IHRva2VuWyJ0eXBlIl0KICAgICAgICBpZiB0eXBlID09ICJEb2N0eXBlIjoKICAgICAgICAgICAgY29udGludWUKICAgICAgICBlbGlmIHR5cGUgaW4gKCJTdGFydFRhZyIsICJFbXB0eVRhZyIpOgogICAgICAgICAgICBhdHRycyA9IEF0dHJpYnV0ZXNOU0ltcGwodG9rZW5bImRhdGEiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuYWRqdXN0Rm9yZWlnbkF0dHJpYnV0ZXMpCiAgICAgICAgICAgIGhhbmRsZXIuc3RhcnRFbGVtZW50TlMoKHRva2VuWyJuYW1lc3BhY2UiXSwgdG9rZW5bIm5hbWUiXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5bIm5hbWUiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRycykKICAgICAgICAgICAgaWYgdHlwZSA9PSAiRW1wdHlUYWciOgogICAgICAgICAgICAgICAgaGFuZGxlci5lbmRFbGVtZW50TlMoKHRva2VuWyJuYW1lc3BhY2UiXSwgdG9rZW5bIm5hbWUiXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlblsibmFtZSJdKQogICAgICAgIGVsaWYgdHlwZSA9PSAiRW5kVGFnIjoKICAgICAgICAgICAgaGFuZGxlci5lbmRFbGVtZW50TlMoKHRva2VuWyJuYW1lc3BhY2UiXSwgdG9rZW5bIm5hbWUiXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuWyJuYW1lIl0pCiAgICAgICAgZWxpZiB0eXBlIGluICgiQ2hhcmFjdGVycyIsICJTcGFjZUNoYXJhY3RlcnMiKToKICAgICAgICAgICAgaGFuZGxlci5jaGFyYWN0ZXJzKHRva2VuWyJkYXRhIl0pCiAgICAgICAgZWxpZiB0eXBlID09ICJDb21tZW50IjoKICAgICAgICAgICAgcGFzcwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGFzc2VydCBGYWxzZSwgIlVua25vd24gdG9rZW4gdHlwZSIKCiAgICBmb3IgcHJlZml4LCBuYW1lc3BhY2UgaW4gcHJlZml4X21hcHBpbmcuaXRlbXMoKToKICAgICAgICBoYW5kbGVyLmVuZFByZWZpeE1hcHBpbmcocHJlZml4KQogICAgaGFuZGxlci5lbmREb2N1bWVudCgpClBLAwQUAAAAAAAAACEAR9k3bk4NAABODQAASgAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvdHJlZWJ1aWxkZXJzL19faW5pdF9fLnB5IiIiQSBjb2xsZWN0aW9uIG9mIG1vZHVsZXMgZm9yIGJ1aWxkaW5nIGRpZmZlcmVudCBraW5kcyBvZiB0cmVlIGZyb20KSFRNTCBkb2N1bWVudHMuCgpUbyBjcmVhdGUgYSB0cmVlYnVpbGRlciBmb3IgYSBuZXcgdHlwZSBvZiB0cmVlLCB5b3UgbmVlZCB0byBkbwppbXBsZW1lbnQgc2V2ZXJhbCB0aGluZ3M6CgoxKSBBIHNldCBvZiBjbGFzc2VzIGZvciB2YXJpb3VzIHR5cGVzIG9mIGVsZW1lbnRzOiBEb2N1bWVudCwgRG9jdHlwZSwKQ29tbWVudCwgRWxlbWVudC4gVGhlc2UgbXVzdCBpbXBsZW1lbnQgdGhlIGludGVyZmFjZSBvZgpfYmFzZS50cmVlYnVpbGRlcnMuTm9kZSAoYWx0aG91Z2ggY29tbWVudCBub2RlcyBoYXZlIGEgZGlmZmVyZW50CnNpZ25hdHVyZSBmb3IgdGhlaXIgY29uc3RydWN0b3IsIHNlZSB0cmVlYnVpbGRlcnMuZXRyZWUuQ29tbWVudCkKVGV4dHVhbCBjb250ZW50IG1heSBhbHNvIGJlIGltcGxlbWVudGVkIGFzIGFub3RoZXIgbm9kZSB0eXBlLCBvciBub3QsIGFzCnlvdXIgdHJlZSBpbXBsZW1lbnRhdGlvbiByZXF1aXJlcy4KCjIpIEEgdHJlZWJ1aWxkZXIgb2JqZWN0IChjYWxsZWQgVHJlZUJ1aWxkZXIgYnkgY29udmVudGlvbikgdGhhdAppbmhlcml0cyBmcm9tIHRyZWVidWlsZGVycy5fYmFzZS5UcmVlQnVpbGRlci4gVGhpcyBoYXMgNCByZXF1aXJlZCBhdHRyaWJ1dGVzOgpkb2N1bWVudENsYXNzIC0gdGhlIGNsYXNzIHRvIHVzZSBmb3IgdGhlIGJvdHRvbW1vc3Qgbm9kZSBvZiBhIGRvY3VtZW50CmVsZW1lbnRDbGFzcyAtIHRoZSBjbGFzcyB0byB1c2UgZm9yIEhUTUwgRWxlbWVudHMKY29tbWVudENsYXNzIC0gdGhlIGNsYXNzIHRvIHVzZSBmb3IgY29tbWVudHMKZG9jdHlwZUNsYXNzIC0gdGhlIGNsYXNzIHRvIHVzZSBmb3IgZG9jdHlwZXMKSXQgYWxzbyBoYXMgb25lIHJlcXVpcmVkIG1ldGhvZDoKZ2V0RG9jdW1lbnQgLSBSZXR1cm5zIHRoZSByb290IG5vZGUgb2YgdGhlIGNvbXBsZXRlIGRvY3VtZW50IHRyZWUKCjMpIElmIHlvdSB3aXNoIHRvIHJ1biB0aGUgdW5pdCB0ZXN0cywgeW91IG11c3QgYWxzbyBjcmVhdGUgYQp0ZXN0U2VyaWFsaXplciBtZXRob2Qgb24geW91ciB0cmVlYnVpbGRlciB3aGljaCBhY2NlcHRzIGEgbm9kZSBhbmQKcmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIE5vZGUgYW5kIGl0cyBjaGlsZHJlbiBzZXJpYWxpemVkIGFjY29yZGluZwp0byB0aGUgZm9ybWF0IHVzZWQgaW4gdGhlIHVuaXR0ZXN0cwoiIiIKCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgdW5pY29kZV9saXRlcmFscwoKZnJvbSAuLl91dGlscyBpbXBvcnQgZGVmYXVsdF9ldHJlZQoKdHJlZUJ1aWxkZXJDYWNoZSA9IHt9CgoKZGVmIGdldFRyZWVCdWlsZGVyKHRyZWVUeXBlLCBpbXBsZW1lbnRhdGlvbj1Ob25lLCAqKmt3YXJncyk6CiAgICAiIiJHZXQgYSBUcmVlQnVpbGRlciBjbGFzcyBmb3IgdmFyaW91cyB0eXBlcyBvZiB0cmVlIHdpdGggYnVpbHQtaW4gc3VwcG9ydAoKICAgIHRyZWVUeXBlIC0gdGhlIG5hbWUgb2YgdGhlIHRyZWUgdHlwZSByZXF1aXJlZCAoY2FzZS1pbnNlbnNpdGl2ZSkuIFN1cHBvcnRlZAogICAgICAgICAgICAgICB2YWx1ZXMgYXJlOgoKICAgICAgICAgICAgICAgImRvbSIgLSBBIGdlbmVyaWMgYnVpbGRlciBmb3IgRE9NIGltcGxlbWVudGF0aW9ucywgZGVmYXVsdGluZyB0bwogICAgICAgICAgICAgICAgICAgICAgIGEgeG1sLmRvbS5taW5pZG9tIGJhc2VkIGltcGxlbWVudGF0aW9uLgogICAgICAgICAgICAgICAiZXRyZWUiIC0gQSBnZW5lcmljIGJ1aWxkZXIgZm9yIHRyZWUgaW1wbGVtZW50YXRpb25zIGV4cG9zaW5nIGFuCiAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50VHJlZS1saWtlIGludGVyZmFjZSwgZGVmYXVsdGluZyB0bwogICAgICAgICAgICAgICAgICAgICAgICAgeG1sLmV0cmVlLmNFbGVtZW50VHJlZSBpZiBhdmFpbGFibGUgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICB4bWwuZXRyZWUuRWxlbWVudFRyZWUgaWYgbm90LgogICAgICAgICAgICAgICAibHhtbCIgLSBBIGV0cmVlLWJhc2VkIGJ1aWxkZXIgZm9yIGx4bWwuZXRyZWUsIGhhbmRsaW5nCiAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0YXRpb25zIG9mIGx4bWwncyBpbXBsZW1lbnRhdGlvbi4KCiAgICBpbXBsZW1lbnRhdGlvbiAtIChDdXJyZW50bHkgYXBwbGllcyB0byB0aGUgImV0cmVlIiBhbmQgImRvbSIgdHJlZSB0eXBlcykuIEEKICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZSBpbXBsZW1lbnRpbmcgdGhlIHRyZWUgdHlwZSBlLmcuCiAgICAgICAgICAgICAgICAgICAgICB4bWwuZXRyZWUuRWxlbWVudFRyZWUgb3IgeG1sLmV0cmVlLmNFbGVtZW50VHJlZS4iIiIKCiAgICB0cmVlVHlwZSA9IHRyZWVUeXBlLmxvd2VyKCkKICAgIGlmIHRyZWVUeXBlIG5vdCBpbiB0cmVlQnVpbGRlckNhY2hlOgogICAgICAgIGlmIHRyZWVUeXBlID09ICJkb20iOgogICAgICAgICAgICBmcm9tIC4gaW1wb3J0IGRvbQogICAgICAgICAgICAjIENvbWUgdXAgd2l0aCBhIHNhbmUgZGVmYXVsdCAocHJlZi4gZnJvbSB0aGUgc3RkbGliKQogICAgICAgICAgICBpZiBpbXBsZW1lbnRhdGlvbiBpcyBOb25lOgogICAgICAgICAgICAgICAgZnJvbSB4bWwuZG9tIGltcG9ydCBtaW5pZG9tCiAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiA9IG1pbmlkb20KICAgICAgICAgICAgIyBORVZFUiBjYWNoZSBoZXJlLCBjYWNoaW5nIGlzIGRvbmUgaW4gdGhlIGRvbSBzdWJtb2R1bGUKICAgICAgICAgICAgcmV0dXJuIGRvbS5nZXREb21Nb2R1bGUoaW1wbGVtZW50YXRpb24sICoqa3dhcmdzKS5UcmVlQnVpbGRlcgogICAgICAgIGVsaWYgdHJlZVR5cGUgPT0gImx4bWwiOgogICAgICAgICAgICBmcm9tIC4gaW1wb3J0IGV0cmVlX2x4bWwKICAgICAgICAgICAgdHJlZUJ1aWxkZXJDYWNoZVt0cmVlVHlwZV0gPSBldHJlZV9seG1sLlRyZWVCdWlsZGVyCiAgICAgICAgZWxpZiB0cmVlVHlwZSA9PSAiZXRyZWUiOgogICAgICAgICAgICBmcm9tIC4gaW1wb3J0IGV0cmVlCiAgICAgICAgICAgIGlmIGltcGxlbWVudGF0aW9uIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiA9IGRlZmF1bHRfZXRyZWUKICAgICAgICAgICAgIyBORVZFUiBjYWNoZSBoZXJlLCBjYWNoaW5nIGlzIGRvbmUgaW4gdGhlIGV0cmVlIHN1Ym1vZHVsZQogICAgICAgICAgICByZXR1cm4gZXRyZWUuZ2V0RVRyZWVNb2R1bGUoaW1wbGVtZW50YXRpb24sICoqa3dhcmdzKS5UcmVlQnVpbGRlcgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIiIiVW5yZWNvZ25pc2VkIHRyZWVidWlsZGVyICIlcyIgIiIiICUgdHJlZVR5cGUpCiAgICByZXR1cm4gdHJlZUJ1aWxkZXJDYWNoZS5nZXQodHJlZVR5cGUpClBLAwQUAAAAAAAAACEARMpWqnY2AAB2NgAARgAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvdHJlZWJ1aWxkZXJzL2Jhc2UucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHVuaWNvZGVfbGl0ZXJhbHMKZnJvbSBwaXAuX3ZlbmRvci5zaXggaW1wb3J0IHRleHRfdHlwZQoKZnJvbSAuLmNvbnN0YW50cyBpbXBvcnQgc2NvcGluZ0VsZW1lbnRzLCB0YWJsZUluc2VydE1vZGVFbGVtZW50cywgbmFtZXNwYWNlcwoKIyBUaGUgc2NvcGUgbWFya2VycyBhcmUgaW5zZXJ0ZWQgd2hlbiBlbnRlcmluZyBvYmplY3QgZWxlbWVudHMsCiMgbWFycXVlZXMsIHRhYmxlIGNlbGxzLCBhbmQgdGFibGUgY2FwdGlvbnMsIGFuZCBhcmUgdXNlZCB0byBwcmV2ZW50IGZvcm1hdHRpbmcKIyBmcm9tICJsZWFraW5nIiBpbnRvIHRhYmxlcywgb2JqZWN0IGVsZW1lbnRzLCBhbmQgbWFycXVlZXMuCk1hcmtlciA9IE5vbmUKCmxpc3RFbGVtZW50c01hcCA9IHsKICAgIE5vbmU6IChmcm96ZW5zZXQoc2NvcGluZ0VsZW1lbnRzKSwgRmFsc2UpLAogICAgImJ1dHRvbiI6IChmcm96ZW5zZXQoc2NvcGluZ0VsZW1lbnRzIHwgc2V0KFsobmFtZXNwYWNlc1siaHRtbCJdLCAiYnV0dG9uIildKSksIEZhbHNlKSwKICAgICJsaXN0IjogKGZyb3plbnNldChzY29waW5nRWxlbWVudHMgfCBzZXQoWyhuYW1lc3BhY2VzWyJodG1sIl0sICJvbCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgInVsIildKSksIEZhbHNlKSwKICAgICJ0YWJsZSI6IChmcm96ZW5zZXQoWyhuYW1lc3BhY2VzWyJodG1sIl0sICJodG1sIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAidGFibGUiKV0pLCBGYWxzZSksCiAgICAic2VsZWN0IjogKGZyb3plbnNldChbKG5hbWVzcGFjZXNbImh0bWwiXSwgIm9wdGdyb3VwIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgIm9wdGlvbiIpXSksIFRydWUpCn0KCgpjbGFzcyBOb2RlKG9iamVjdCk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSk6CiAgICAgICAgIiIiTm9kZSByZXByZXNlbnRpbmcgYW4gaXRlbSBpbiB0aGUgdHJlZS4KICAgICAgICBuYW1lIC0gVGhlIHRhZyBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgbm9kZQogICAgICAgIHBhcmVudCAtIFRoZSBwYXJlbnQgb2YgdGhlIGN1cnJlbnQgbm9kZSAob3IgTm9uZSBmb3IgdGhlIGRvY3VtZW50IG5vZGUpCiAgICAgICAgdmFsdWUgLSBUaGUgdmFsdWUgb2YgdGhlIGN1cnJlbnQgbm9kZSAoYXBwbGllcyB0byB0ZXh0IG5vZGVzIGFuZAogICAgICAgIGNvbW1lbnRzCiAgICAgICAgYXR0cmlidXRlcyAtIGEgZGljdCBob2xkaW5nIG5hbWUsIHZhbHVlIHBhaXJzIGZvciBhdHRyaWJ1dGVzIG9mIHRoZSBub2RlCiAgICAgICAgY2hpbGROb2RlcyAtIGEgbGlzdCBvZiBjaGlsZCBub2RlcyBvZiB0aGUgY3VycmVudCBub2RlLiBUaGlzIG11c3QKICAgICAgICBpbmNsdWRlIGFsbCBlbGVtZW50cyBidXQgbm90IG5lY2Vzc2FyaWx5IG90aGVyIG5vZGUgdHlwZXMKICAgICAgICBfZmxhZ3MgLSBBIGxpc3Qgb2YgbWlzY2VsbGFuZW91cyBmbGFncyB0aGF0IGNhbiBiZSBzZXQgb24gdGhlIG5vZGUKICAgICAgICAiIiIKICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCiAgICAgICAgc2VsZi5wYXJlbnQgPSBOb25lCiAgICAgICAgc2VsZi52YWx1ZSA9IE5vbmUKICAgICAgICBzZWxmLmF0dHJpYnV0ZXMgPSB7fQogICAgICAgIHNlbGYuY2hpbGROb2RlcyA9IFtdCiAgICAgICAgc2VsZi5fZmxhZ3MgPSBbXQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIGF0dHJpYnV0ZXNTdHIgPSAiICIuam9pbihbIiVzPVwiJXNcIiIgJSAobmFtZSwgdmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbmFtZSwgdmFsdWUgaW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXR0cmlidXRlcy5pdGVtcygpXSkKICAgICAgICBpZiBhdHRyaWJ1dGVzU3RyOgogICAgICAgICAgICByZXR1cm4gIjwlcyAlcz4iICUgKHNlbGYubmFtZSwgYXR0cmlidXRlc1N0cikKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gIjwlcz4iICUgKHNlbGYubmFtZSkKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICI8JXM+IiAlIChzZWxmLm5hbWUpCgogICAgZGVmIGFwcGVuZENoaWxkKHNlbGYsIG5vZGUpOgogICAgICAgICIiIkluc2VydCBub2RlIGFzIGEgY2hpbGQgb2YgdGhlIGN1cnJlbnQgbm9kZQogICAgICAgICIiIgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKCiAgICBkZWYgaW5zZXJ0VGV4dChzZWxmLCBkYXRhLCBpbnNlcnRCZWZvcmU9Tm9uZSk6CiAgICAgICAgIiIiSW5zZXJ0IGRhdGEgYXMgdGV4dCBpbiB0aGUgY3VycmVudCBub2RlLCBwb3NpdGlvbmVkIGJlZm9yZSB0aGUKICAgICAgICBzdGFydCBvZiBub2RlIGluc2VydEJlZm9yZSBvciB0byB0aGUgZW5kIG9mIHRoZSBub2RlJ3MgdGV4dC4KICAgICAgICAiIiIKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCgogICAgZGVmIGluc2VydEJlZm9yZShzZWxmLCBub2RlLCByZWZOb2RlKToKICAgICAgICAiIiJJbnNlcnQgbm9kZSBhcyBhIGNoaWxkIG9mIHRoZSBjdXJyZW50IG5vZGUsIGJlZm9yZSByZWZOb2RlIGluIHRoZQogICAgICAgIGxpc3Qgb2YgY2hpbGQgbm9kZXMuIFJhaXNlcyBWYWx1ZUVycm9yIGlmIHJlZk5vZGUgaXMgbm90IGEgY2hpbGQgb2YKICAgICAgICB0aGUgY3VycmVudCBub2RlIiIiCiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgoKICAgIGRlZiByZW1vdmVDaGlsZChzZWxmLCBub2RlKToKICAgICAgICAiIiJSZW1vdmUgbm9kZSBmcm9tIHRoZSBjaGlsZHJlbiBvZiB0aGUgY3VycmVudCBub2RlCiAgICAgICAgIiIiCiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgoKICAgIGRlZiByZXBhcmVudENoaWxkcmVuKHNlbGYsIG5ld1BhcmVudCk6CiAgICAgICAgIiIiTW92ZSBhbGwgdGhlIGNoaWxkcmVuIG9mIHRoZSBjdXJyZW50IG5vZGUgdG8gbmV3UGFyZW50LgogICAgICAgIFRoaXMgaXMgbmVlZGVkIHNvIHRoYXQgdHJlZXMgdGhhdCBkb24ndCBzdG9yZSB0ZXh0IGFzIG5vZGVzIG1vdmUgdGhlCiAgICAgICAgdGV4dCBpbiB0aGUgY29ycmVjdCB3YXkKICAgICAgICAiIiIKICAgICAgICAjIFhYWCAtIHNob3VsZCB0aGlzIG1ldGhvZCBiZSBtYWRlIG1vcmUgZ2VuZXJhbD8KICAgICAgICBmb3IgY2hpbGQgaW4gc2VsZi5jaGlsZE5vZGVzOgogICAgICAgICAgICBuZXdQYXJlbnQuYXBwZW5kQ2hpbGQoY2hpbGQpCiAgICAgICAgc2VsZi5jaGlsZE5vZGVzID0gW10KCiAgICBkZWYgY2xvbmVOb2RlKHNlbGYpOgogICAgICAgICIiIlJldHVybiBhIHNoYWxsb3cgY29weSBvZiB0aGUgY3VycmVudCBub2RlIGkuZS4gYSBub2RlIHdpdGggdGhlIHNhbWUKICAgICAgICBuYW1lIGFuZCBhdHRyaWJ1dGVzIGJ1dCB3aXRoIG5vIHBhcmVudCBvciBjaGlsZCBub2RlcwogICAgICAgICIiIgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKCiAgICBkZWYgaGFzQ29udGVudChzZWxmKToKICAgICAgICAiIiJSZXR1cm4gdHJ1ZSBpZiB0aGUgbm9kZSBoYXMgY2hpbGRyZW4gb3IgdGV4dCwgZmFsc2Ugb3RoZXJ3aXNlCiAgICAgICAgIiIiCiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgoKCmNsYXNzIEFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cyhsaXN0KToKICAgIGRlZiBhcHBlbmQoc2VsZiwgbm9kZSk6CiAgICAgICAgZXF1YWxDb3VudCA9IDAKICAgICAgICBpZiBub2RlICE9IE1hcmtlcjoKICAgICAgICAgICAgZm9yIGVsZW1lbnQgaW4gc2VsZls6Oi0xXToKICAgICAgICAgICAgICAgIGlmIGVsZW1lbnQgPT0gTWFya2VyOgogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICBpZiBzZWxmLm5vZGVzRXF1YWwoZWxlbWVudCwgbm9kZSk6CiAgICAgICAgICAgICAgICAgICAgZXF1YWxDb3VudCArPSAxCiAgICAgICAgICAgICAgICBpZiBlcXVhbENvdW50ID09IDM6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5yZW1vdmUoZWxlbWVudCkKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgIGxpc3QuYXBwZW5kKHNlbGYsIG5vZGUpCgogICAgZGVmIG5vZGVzRXF1YWwoc2VsZiwgbm9kZTEsIG5vZGUyKToKICAgICAgICBpZiBub3Qgbm9kZTEubmFtZVR1cGxlID09IG5vZGUyLm5hbWVUdXBsZToKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgIGlmIG5vdCBub2RlMS5hdHRyaWJ1dGVzID09IG5vZGUyLmF0dHJpYnV0ZXM6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICByZXR1cm4gVHJ1ZQoKCmNsYXNzIFRyZWVCdWlsZGVyKG9iamVjdCk6CiAgICAiIiJCYXNlIHRyZWVidWlsZGVyIGltcGxlbWVudGF0aW9uCiAgICBkb2N1bWVudENsYXNzIC0gdGhlIGNsYXNzIHRvIHVzZSBmb3IgdGhlIGJvdHRvbW1vc3Qgbm9kZSBvZiBhIGRvY3VtZW50CiAgICBlbGVtZW50Q2xhc3MgLSB0aGUgY2xhc3MgdG8gdXNlIGZvciBIVE1MIEVsZW1lbnRzCiAgICBjb21tZW50Q2xhc3MgLSB0aGUgY2xhc3MgdG8gdXNlIGZvciBjb21tZW50cwogICAgZG9jdHlwZUNsYXNzIC0gdGhlIGNsYXNzIHRvIHVzZSBmb3IgZG9jdHlwZXMKICAgICIiIgogICAgIyBweWxpbnQ6ZGlzYWJsZT1ub3QtY2FsbGFibGUKCiAgICAjIERvY3VtZW50IGNsYXNzCiAgICBkb2N1bWVudENsYXNzID0gTm9uZQoKICAgICMgVGhlIGNsYXNzIHRvIHVzZSBmb3IgY3JlYXRpbmcgYSBub2RlCiAgICBlbGVtZW50Q2xhc3MgPSBOb25lCgogICAgIyBUaGUgY2xhc3MgdG8gdXNlIGZvciBjcmVhdGluZyBjb21tZW50cwogICAgY29tbWVudENsYXNzID0gTm9uZQoKICAgICMgVGhlIGNsYXNzIHRvIHVzZSBmb3IgY3JlYXRpbmcgZG9jdHlwZXMKICAgIGRvY3R5cGVDbGFzcyA9IE5vbmUKCiAgICAjIEZyYWdtZW50IGNsYXNzCiAgICBmcmFnbWVudENsYXNzID0gTm9uZQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lc3BhY2VIVE1MRWxlbWVudHMpOgogICAgICAgIGlmIG5hbWVzcGFjZUhUTUxFbGVtZW50czoKICAgICAgICAgICAgc2VsZi5kZWZhdWx0TmFtZXNwYWNlID0gImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5kZWZhdWx0TmFtZXNwYWNlID0gTm9uZQogICAgICAgIHNlbGYucmVzZXQoKQoKICAgIGRlZiByZXNldChzZWxmKToKICAgICAgICBzZWxmLm9wZW5FbGVtZW50cyA9IFtdCiAgICAgICAgc2VsZi5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMgPSBBY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMoKQoKICAgICAgICAjIFhYWCAtIHJlbmFtZSB0aGVzZSB0byBoZWFkRWxlbWVudCwgZm9ybUVsZW1lbnQKICAgICAgICBzZWxmLmhlYWRQb2ludGVyID0gTm9uZQogICAgICAgIHNlbGYuZm9ybVBvaW50ZXIgPSBOb25lCgogICAgICAgIHNlbGYuaW5zZXJ0RnJvbVRhYmxlID0gRmFsc2UKCiAgICAgICAgc2VsZi5kb2N1bWVudCA9IHNlbGYuZG9jdW1lbnRDbGFzcygpCgogICAgZGVmIGVsZW1lbnRJblNjb3BlKHNlbGYsIHRhcmdldCwgdmFyaWFudD1Ob25lKToKCiAgICAgICAgIyBJZiB3ZSBwYXNzIGEgbm9kZSBpbiB3ZSBtYXRjaCB0aGF0LiBpZiB3ZSBwYXNzIGEgc3RyaW5nCiAgICAgICAgIyBtYXRjaCBhbnkgbm9kZSB3aXRoIHRoYXQgbmFtZQogICAgICAgIGV4YWN0Tm9kZSA9IGhhc2F0dHIodGFyZ2V0LCAibmFtZVR1cGxlIikKICAgICAgICBpZiBub3QgZXhhY3ROb2RlOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHRhcmdldCwgdGV4dF90eXBlKToKICAgICAgICAgICAgICAgIHRhcmdldCA9IChuYW1lc3BhY2VzWyJodG1sIl0sIHRhcmdldCkKICAgICAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UodGFyZ2V0LCB0dXBsZSkKCiAgICAgICAgbGlzdEVsZW1lbnRzLCBpbnZlcnQgPSBsaXN0RWxlbWVudHNNYXBbdmFyaWFudF0KCiAgICAgICAgZm9yIG5vZGUgaW4gcmV2ZXJzZWQoc2VsZi5vcGVuRWxlbWVudHMpOgogICAgICAgICAgICBpZiBleGFjdE5vZGUgYW5kIG5vZGUgPT0gdGFyZ2V0OgogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICAgICAgZWxpZiBub3QgZXhhY3ROb2RlIGFuZCBub2RlLm5hbWVUdXBsZSA9PSB0YXJnZXQ6CiAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgICAgICBlbGlmIChpbnZlcnQgXiAobm9kZS5uYW1lVHVwbGUgaW4gbGlzdEVsZW1lbnRzKSk6CiAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgYXNzZXJ0IEZhbHNlICAjIFdlIHNob3VsZCBuZXZlciByZWFjaCB0aGlzIHBvaW50CgogICAgZGVmIHJlY29uc3RydWN0QWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzKHNlbGYpOgogICAgICAgICMgV2l0aGluIHRoaXMgYWxnb3JpdGhtIHRoZSBvcmRlciBvZiBzdGVwcyBkZXNjcmliZWQgaW4gdGhlCiAgICAgICAgIyBzcGVjaWZpY2F0aW9uIGlzIG5vdCBxdWl0ZSB0aGUgc2FtZSBhcyB0aGUgb3JkZXIgb2Ygc3RlcHMgaW4gdGhlCiAgICAgICAgIyBjb2RlLiBJdCBzaG91bGQgc3RpbGwgZG8gdGhlIHNhbWUgdGhvdWdoLgoKICAgICAgICAjIFN0ZXAgMTogc3RvcCB0aGUgYWxnb3JpdGhtIHdoZW4gdGhlcmUncyBub3RoaW5nIHRvIGRvLgogICAgICAgIGlmIG5vdCBzZWxmLmFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50czoKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICMgU3RlcCAyIGFuZCBzdGVwIDM6IHdlIHN0YXJ0IHdpdGggdGhlIGxhc3QgZWxlbWVudC4gU28gaSBpcyAtMS4KICAgICAgICBpID0gbGVuKHNlbGYuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzKSAtIDEKICAgICAgICBlbnRyeSA9IHNlbGYuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzW2ldCiAgICAgICAgaWYgZW50cnkgPT0gTWFya2VyIG9yIGVudHJ5IGluIHNlbGYub3BlbkVsZW1lbnRzOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgIyBTdGVwIDYKICAgICAgICB3aGlsZSBlbnRyeSAhPSBNYXJrZXIgYW5kIGVudHJ5IG5vdCBpbiBzZWxmLm9wZW5FbGVtZW50czoKICAgICAgICAgICAgaWYgaSA9PSAwOgogICAgICAgICAgICAgICAgIyBUaGlzIHdpbGwgYmUgcmVzZXQgdG8gMCBiZWxvdwogICAgICAgICAgICAgICAgaSA9IC0xCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBpIC09IDEKICAgICAgICAgICAgIyBTdGVwIDU6IGxldCBlbnRyeSBiZSBvbmUgZWFybGllciBpbiB0aGUgbGlzdC4KICAgICAgICAgICAgZW50cnkgPSBzZWxmLmFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50c1tpXQoKICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICAjIFN0ZXAgNwogICAgICAgICAgICBpICs9IDEKCiAgICAgICAgICAgICMgU3RlcCA4CiAgICAgICAgICAgIGVudHJ5ID0gc2VsZi5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHNbaV0KICAgICAgICAgICAgY2xvbmUgPSBlbnRyeS5jbG9uZU5vZGUoKSAgIyBNYWlubHkgdG8gZ2V0IGEgbmV3IGNvcHkgb2YgdGhlIGF0dHJpYnV0ZXMKCiAgICAgICAgICAgICMgU3RlcCA5CiAgICAgICAgICAgIGVsZW1lbnQgPSBzZWxmLmluc2VydEVsZW1lbnQoeyJ0eXBlIjogIlN0YXJ0VGFnIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiBjbG9uZS5uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZXNwYWNlIjogY2xvbmUubmFtZXNwYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IGNsb25lLmF0dHJpYnV0ZXN9KQoKICAgICAgICAgICAgIyBTdGVwIDEwCiAgICAgICAgICAgIHNlbGYuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzW2ldID0gZWxlbWVudAoKICAgICAgICAgICAgIyBTdGVwIDExCiAgICAgICAgICAgIGlmIGVsZW1lbnQgPT0gc2VsZi5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHNbLTFdOgogICAgICAgICAgICAgICAgYnJlYWsKCiAgICBkZWYgY2xlYXJBY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMoc2VsZik6CiAgICAgICAgZW50cnkgPSBzZWxmLmFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cy5wb3AoKQogICAgICAgIHdoaWxlIHNlbGYuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzIGFuZCBlbnRyeSAhPSBNYXJrZXI6CiAgICAgICAgICAgIGVudHJ5ID0gc2VsZi5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMucG9wKCkKCiAgICBkZWYgZWxlbWVudEluQWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzKHNlbGYsIG5hbWUpOgogICAgICAgICIiIkNoZWNrIGlmIGFuIGVsZW1lbnQgZXhpc3RzIGJldHdlZW4gdGhlIGVuZCBvZiB0aGUgYWN0aXZlCiAgICAgICAgZm9ybWF0dGluZyBlbGVtZW50cyBhbmQgdGhlIGxhc3QgbWFya2VyLiBJZiBpdCBkb2VzLCByZXR1cm4gaXQsIGVsc2UKICAgICAgICByZXR1cm4gZmFsc2UiIiIKCiAgICAgICAgZm9yIGl0ZW0gaW4gc2VsZi5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHNbOjotMV06CiAgICAgICAgICAgICMgQ2hlY2sgZm9yIE1hcmtlciBmaXJzdCBiZWNhdXNlIGlmIGl0J3MgYSBNYXJrZXIgaXQgZG9lc24ndCBoYXZlIGEKICAgICAgICAgICAgIyBuYW1lIGF0dHJpYnV0ZS4KICAgICAgICAgICAgaWYgaXRlbSA9PSBNYXJrZXI6CiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBlbGlmIGl0ZW0ubmFtZSA9PSBuYW1lOgogICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0KICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgaW5zZXJ0Um9vdChzZWxmLCB0b2tlbik6CiAgICAgICAgZWxlbWVudCA9IHNlbGYuY3JlYXRlRWxlbWVudCh0b2tlbikKICAgICAgICBzZWxmLm9wZW5FbGVtZW50cy5hcHBlbmQoZWxlbWVudCkKICAgICAgICBzZWxmLmRvY3VtZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpCgogICAgZGVmIGluc2VydERvY3R5cGUoc2VsZiwgdG9rZW4pOgogICAgICAgIG5hbWUgPSB0b2tlblsibmFtZSJdCiAgICAgICAgcHVibGljSWQgPSB0b2tlblsicHVibGljSWQiXQogICAgICAgIHN5c3RlbUlkID0gdG9rZW5bInN5c3RlbUlkIl0KCiAgICAgICAgZG9jdHlwZSA9IHNlbGYuZG9jdHlwZUNsYXNzKG5hbWUsIHB1YmxpY0lkLCBzeXN0ZW1JZCkKICAgICAgICBzZWxmLmRvY3VtZW50LmFwcGVuZENoaWxkKGRvY3R5cGUpCgogICAgZGVmIGluc2VydENvbW1lbnQoc2VsZiwgdG9rZW4sIHBhcmVudD1Ob25lKToKICAgICAgICBpZiBwYXJlbnQgaXMgTm9uZToKICAgICAgICAgICAgcGFyZW50ID0gc2VsZi5vcGVuRWxlbWVudHNbLTFdCiAgICAgICAgcGFyZW50LmFwcGVuZENoaWxkKHNlbGYuY29tbWVudENsYXNzKHRva2VuWyJkYXRhIl0pKQoKICAgIGRlZiBjcmVhdGVFbGVtZW50KHNlbGYsIHRva2VuKToKICAgICAgICAiIiJDcmVhdGUgYW4gZWxlbWVudCBidXQgZG9uJ3QgaW5zZXJ0IGl0IGFueXdoZXJlIiIiCiAgICAgICAgbmFtZSA9IHRva2VuWyJuYW1lIl0KICAgICAgICBuYW1lc3BhY2UgPSB0b2tlbi5nZXQoIm5hbWVzcGFjZSIsIHNlbGYuZGVmYXVsdE5hbWVzcGFjZSkKICAgICAgICBlbGVtZW50ID0gc2VsZi5lbGVtZW50Q2xhc3MobmFtZSwgbmFtZXNwYWNlKQogICAgICAgIGVsZW1lbnQuYXR0cmlidXRlcyA9IHRva2VuWyJkYXRhIl0KICAgICAgICByZXR1cm4gZWxlbWVudAoKICAgIGRlZiBfZ2V0SW5zZXJ0RnJvbVRhYmxlKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9pbnNlcnRGcm9tVGFibGUKCiAgICBkZWYgX3NldEluc2VydEZyb21UYWJsZShzZWxmLCB2YWx1ZSk6CiAgICAgICAgIiIiU3dpdGNoIHRoZSBmdW5jdGlvbiB1c2VkIHRvIGluc2VydCBhbiBlbGVtZW50IGZyb20gdGhlCiAgICAgICAgbm9ybWFsIG9uZSB0byB0aGUgbWlzbmVzdGVkIHRhYmxlIG9uZSBhbmQgYmFjayBhZ2FpbiIiIgogICAgICAgIHNlbGYuX2luc2VydEZyb21UYWJsZSA9IHZhbHVlCiAgICAgICAgaWYgdmFsdWU6CiAgICAgICAgICAgIHNlbGYuaW5zZXJ0RWxlbWVudCA9IHNlbGYuaW5zZXJ0RWxlbWVudFRhYmxlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5pbnNlcnRFbGVtZW50ID0gc2VsZi5pbnNlcnRFbGVtZW50Tm9ybWFsCgogICAgaW5zZXJ0RnJvbVRhYmxlID0gcHJvcGVydHkoX2dldEluc2VydEZyb21UYWJsZSwgX3NldEluc2VydEZyb21UYWJsZSkKCiAgICBkZWYgaW5zZXJ0RWxlbWVudE5vcm1hbChzZWxmLCB0b2tlbik6CiAgICAgICAgbmFtZSA9IHRva2VuWyJuYW1lIl0KICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShuYW1lLCB0ZXh0X3R5cGUpLCAiRWxlbWVudCAlcyBub3QgdW5pY29kZSIgJSBuYW1lCiAgICAgICAgbmFtZXNwYWNlID0gdG9rZW4uZ2V0KCJuYW1lc3BhY2UiLCBzZWxmLmRlZmF1bHROYW1lc3BhY2UpCiAgICAgICAgZWxlbWVudCA9IHNlbGYuZWxlbWVudENsYXNzKG5hbWUsIG5hbWVzcGFjZSkKICAgICAgICBlbGVtZW50LmF0dHJpYnV0ZXMgPSB0b2tlblsiZGF0YSJdCiAgICAgICAgc2VsZi5vcGVuRWxlbWVudHNbLTFdLmFwcGVuZENoaWxkKGVsZW1lbnQpCiAgICAgICAgc2VsZi5vcGVuRWxlbWVudHMuYXBwZW5kKGVsZW1lbnQpCiAgICAgICAgcmV0dXJuIGVsZW1lbnQKCiAgICBkZWYgaW5zZXJ0RWxlbWVudFRhYmxlKHNlbGYsIHRva2VuKToKICAgICAgICAiIiJDcmVhdGUgYW4gZWxlbWVudCBhbmQgaW5zZXJ0IGl0IGludG8gdGhlIHRyZWUiIiIKICAgICAgICBlbGVtZW50ID0gc2VsZi5jcmVhdGVFbGVtZW50KHRva2VuKQogICAgICAgIGlmIHNlbGYub3BlbkVsZW1lbnRzWy0xXS5uYW1lIG5vdCBpbiB0YWJsZUluc2VydE1vZGVFbGVtZW50czoKICAgICAgICAgICAgcmV0dXJuIHNlbGYuaW5zZXJ0RWxlbWVudE5vcm1hbCh0b2tlbikKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIFdlIHNob3VsZCBiZSBpbiB0aGUgSW5UYWJsZSBtb2RlLiBUaGlzIG1lYW5zIHdlIHdhbnQgdG8gZG8KICAgICAgICAgICAgIyBzcGVjaWFsIG1hZ2ljIGVsZW1lbnQgcmVhcnJhbmdpbmcKICAgICAgICAgICAgcGFyZW50LCBpbnNlcnRCZWZvcmUgPSBzZWxmLmdldFRhYmxlTWlzbmVzdGVkTm9kZVBvc2l0aW9uKCkKICAgICAgICAgICAgaWYgaW5zZXJ0QmVmb3JlIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBwYXJlbnQuYXBwZW5kQ2hpbGQoZWxlbWVudCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUoZWxlbWVudCwgaW5zZXJ0QmVmb3JlKQogICAgICAgICAgICBzZWxmLm9wZW5FbGVtZW50cy5hcHBlbmQoZWxlbWVudCkKICAgICAgICByZXR1cm4gZWxlbWVudAoKICAgIGRlZiBpbnNlcnRUZXh0KHNlbGYsIGRhdGEsIHBhcmVudD1Ob25lKToKICAgICAgICAiIiJJbnNlcnQgdGV4dCBkYXRhLiIiIgogICAgICAgIGlmIHBhcmVudCBpcyBOb25lOgogICAgICAgICAgICBwYXJlbnQgPSBzZWxmLm9wZW5FbGVtZW50c1stMV0KCiAgICAgICAgaWYgKG5vdCBzZWxmLmluc2VydEZyb21UYWJsZSBvciAoc2VsZi5pbnNlcnRGcm9tVGFibGUgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vcGVuRWxlbWVudHNbLTFdLm5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgaW4gdGFibGVJbnNlcnRNb2RlRWxlbWVudHMpKToKICAgICAgICAgICAgcGFyZW50Lmluc2VydFRleHQoZGF0YSkKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIFdlIHNob3VsZCBiZSBpbiB0aGUgSW5UYWJsZSBtb2RlLiBUaGlzIG1lYW5zIHdlIHdhbnQgdG8gZG8KICAgICAgICAgICAgIyBzcGVjaWFsIG1hZ2ljIGVsZW1lbnQgcmVhcnJhbmdpbmcKICAgICAgICAgICAgcGFyZW50LCBpbnNlcnRCZWZvcmUgPSBzZWxmLmdldFRhYmxlTWlzbmVzdGVkTm9kZVBvc2l0aW9uKCkKICAgICAgICAgICAgcGFyZW50Lmluc2VydFRleHQoZGF0YSwgaW5zZXJ0QmVmb3JlKQoKICAgIGRlZiBnZXRUYWJsZU1pc25lc3RlZE5vZGVQb3NpdGlvbihzZWxmKToKICAgICAgICAiIiJHZXQgdGhlIGZvc3RlciBwYXJlbnQgZWxlbWVudCwgYW5kIHNpYmxpbmcgdG8gaW5zZXJ0IGJlZm9yZQogICAgICAgIChvciBOb25lKSB3aGVuIGluc2VydGluZyBhIG1pc25lc3RlZCB0YWJsZSBub2RlIiIiCiAgICAgICAgIyBUaGUgZm9zdGVyIHBhcmVudCBlbGVtZW50IGlzIHRoZSBvbmUgd2hpY2ggY29tZXMgYmVmb3JlIHRoZSBtb3N0CiAgICAgICAgIyByZWNlbnRseSBvcGVuZWQgdGFibGUgZWxlbWVudAogICAgICAgICMgWFhYIC0gdGhpcyBpcyByZWFsbHkgaW5lbGVnYW50CiAgICAgICAgbGFzdFRhYmxlID0gTm9uZQogICAgICAgIGZvc3RlclBhcmVudCA9IE5vbmUKICAgICAgICBpbnNlcnRCZWZvcmUgPSBOb25lCiAgICAgICAgZm9yIGVsbSBpbiBzZWxmLm9wZW5FbGVtZW50c1s6Oi0xXToKICAgICAgICAgICAgaWYgZWxtLm5hbWUgPT0gInRhYmxlIjoKICAgICAgICAgICAgICAgIGxhc3RUYWJsZSA9IGVsbQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICBpZiBsYXN0VGFibGU6CiAgICAgICAgICAgICMgWFhYIC0gd2Ugc2hvdWxkIHJlYWxseSBjaGVjayB0aGF0IHRoaXMgcGFyZW50IGlzIGFjdHVhbGx5IGEKICAgICAgICAgICAgIyBub2RlIGhlcmUKICAgICAgICAgICAgaWYgbGFzdFRhYmxlLnBhcmVudDoKICAgICAgICAgICAgICAgIGZvc3RlclBhcmVudCA9IGxhc3RUYWJsZS5wYXJlbnQKICAgICAgICAgICAgICAgIGluc2VydEJlZm9yZSA9IGxhc3RUYWJsZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgZm9zdGVyUGFyZW50ID0gc2VsZi5vcGVuRWxlbWVudHNbCiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcGVuRWxlbWVudHMuaW5kZXgobGFzdFRhYmxlKSAtIDFdCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZm9zdGVyUGFyZW50ID0gc2VsZi5vcGVuRWxlbWVudHNbMF0KICAgICAgICByZXR1cm4gZm9zdGVyUGFyZW50LCBpbnNlcnRCZWZvcmUKCiAgICBkZWYgZ2VuZXJhdGVJbXBsaWVkRW5kVGFncyhzZWxmLCBleGNsdWRlPU5vbmUpOgogICAgICAgIG5hbWUgPSBzZWxmLm9wZW5FbGVtZW50c1stMV0ubmFtZQogICAgICAgICMgWFhYIHRkLCB0aCBhbmQgdHIgYXJlIG5vdCBhY3R1YWxseSBuZWVkZWQKICAgICAgICBpZiAobmFtZSBpbiBmcm96ZW5zZXQoKCJkZCIsICJkdCIsICJsaSIsICJvcHRpb24iLCAib3B0Z3JvdXAiLCAicCIsICJycCIsICJydCIpKSBhbmQKICAgICAgICAgICAgICAgIG5hbWUgIT0gZXhjbHVkZSk6CiAgICAgICAgICAgIHNlbGYub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgICMgWFhYIFRoaXMgaXMgbm90IGVudGlyZWx5IHdoYXQgdGhlIHNwZWNpZmljYXRpb24gc2F5cy4gV2Ugc2hvdWxkCiAgICAgICAgICAgICMgaW52ZXN0aWdhdGUgaXQgbW9yZSBjbG9zZWx5LgogICAgICAgICAgICBzZWxmLmdlbmVyYXRlSW1wbGllZEVuZFRhZ3MoZXhjbHVkZSkKCiAgICBkZWYgZ2V0RG9jdW1lbnQoc2VsZik6CiAgICAgICAgIlJldHVybiB0aGUgZmluYWwgdHJlZSIKICAgICAgICByZXR1cm4gc2VsZi5kb2N1bWVudAoKICAgIGRlZiBnZXRGcmFnbWVudChzZWxmKToKICAgICAgICAiUmV0dXJuIHRoZSBmaW5hbCBmcmFnbWVudCIKICAgICAgICAjIGFzc2VydCBzZWxmLmlubmVySFRNTAogICAgICAgIGZyYWdtZW50ID0gc2VsZi5mcmFnbWVudENsYXNzKCkKICAgICAgICBzZWxmLm9wZW5FbGVtZW50c1swXS5yZXBhcmVudENoaWxkcmVuKGZyYWdtZW50KQogICAgICAgIHJldHVybiBmcmFnbWVudAoKICAgIGRlZiB0ZXN0U2VyaWFsaXplcihzZWxmLCBub2RlKToKICAgICAgICAiIiJTZXJpYWxpemUgdGhlIHN1YnRyZWUgb2Ygbm9kZSBpbiB0aGUgZm9ybWF0IHJlcXVpcmVkIGJ5IHVuaXQgdGVzdHMKICAgICAgICBub2RlIC0gdGhlIG5vZGUgZnJvbSB3aGljaCB0byBzdGFydCBzZXJpYWxpemluZyIiIgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKUEsDBBQAAAAAAAAAIQAI6i74gyIAAIMiAABFAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi90cmVlYnVpbGRlcnMvZG9tLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCB1bmljb2RlX2xpdGVyYWxzCgoKZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgTXV0YWJsZU1hcHBpbmcKZnJvbSB4bWwuZG9tIGltcG9ydCBtaW5pZG9tLCBOb2RlCmltcG9ydCB3ZWFrcmVmCgpmcm9tIC4gaW1wb3J0IGJhc2UKZnJvbSAuLiBpbXBvcnQgY29uc3RhbnRzCmZyb20gLi5jb25zdGFudHMgaW1wb3J0IG5hbWVzcGFjZXMKZnJvbSAuLl91dGlscyBpbXBvcnQgbW9kdWxlRmFjdG9yeUZhY3RvcnkKCgpkZWYgZ2V0RG9tQnVpbGRlcihEb21JbXBsZW1lbnRhdGlvbik6CiAgICBEb20gPSBEb21JbXBsZW1lbnRhdGlvbgoKICAgIGNsYXNzIEF0dHJMaXN0KE11dGFibGVNYXBwaW5nKToKICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgZWxlbWVudCk6CiAgICAgICAgICAgIHNlbGYuZWxlbWVudCA9IGVsZW1lbnQKCiAgICAgICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgICAgICByZXR1cm4gaXRlcihzZWxmLmVsZW1lbnQuYXR0cmlidXRlcy5rZXlzKCkpCgogICAgICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBuYW1lLCB2YWx1ZSk6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UobmFtZSwgdHVwbGUpOgogICAgICAgICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgYXR0ciA9IHNlbGYuZWxlbWVudC5vd25lckRvY3VtZW50LmNyZWF0ZUF0dHJpYnV0ZShuYW1lKQogICAgICAgICAgICAgICAgYXR0ci52YWx1ZSA9IHZhbHVlCiAgICAgICAgICAgICAgICBzZWxmLmVsZW1lbnQuYXR0cmlidXRlc1tuYW1lXSA9IGF0dHIKCiAgICAgICAgZGVmIF9fbGVuX18oc2VsZik6CiAgICAgICAgICAgIHJldHVybiBsZW4oc2VsZi5lbGVtZW50LmF0dHJpYnV0ZXMpCgogICAgICAgIGRlZiBpdGVtcyhzZWxmKToKICAgICAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi5lbGVtZW50LmF0dHJpYnV0ZXMuaXRlbXMoKSkKCiAgICAgICAgZGVmIHZhbHVlcyhzZWxmKToKICAgICAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi5lbGVtZW50LmF0dHJpYnV0ZXMudmFsdWVzKCkpCgogICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBuYW1lKToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShuYW1lLCB0dXBsZSk6CiAgICAgICAgICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5lbGVtZW50LmF0dHJpYnV0ZXNbbmFtZV0udmFsdWUKCiAgICAgICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsIG5hbWUpOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKG5hbWUsIHR1cGxlKToKICAgICAgICAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGRlbCBzZWxmLmVsZW1lbnQuYXR0cmlidXRlc1tuYW1lXQoKICAgIGNsYXNzIE5vZGVCdWlsZGVyKGJhc2UuTm9kZSk6CiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGVsZW1lbnQpOgogICAgICAgICAgICBiYXNlLk5vZGUuX19pbml0X18oc2VsZiwgZWxlbWVudC5ub2RlTmFtZSkKICAgICAgICAgICAgc2VsZi5lbGVtZW50ID0gZWxlbWVudAoKICAgICAgICBuYW1lc3BhY2UgPSBwcm9wZXJ0eShsYW1iZGEgc2VsZjogaGFzYXR0cihzZWxmLmVsZW1lbnQsICJuYW1lc3BhY2VVUkkiKSBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVsZW1lbnQubmFtZXNwYWNlVVJJIG9yIE5vbmUpCgogICAgICAgIGRlZiBhcHBlbmRDaGlsZChzZWxmLCBub2RlKToKICAgICAgICAgICAgbm9kZS5wYXJlbnQgPSBzZWxmCiAgICAgICAgICAgIHNlbGYuZWxlbWVudC5hcHBlbmRDaGlsZChub2RlLmVsZW1lbnQpCgogICAgICAgIGRlZiBpbnNlcnRUZXh0KHNlbGYsIGRhdGEsIGluc2VydEJlZm9yZT1Ob25lKToKICAgICAgICAgICAgdGV4dCA9IHNlbGYuZWxlbWVudC5vd25lckRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGRhdGEpCiAgICAgICAgICAgIGlmIGluc2VydEJlZm9yZToKICAgICAgICAgICAgICAgIHNlbGYuZWxlbWVudC5pbnNlcnRCZWZvcmUodGV4dCwgaW5zZXJ0QmVmb3JlLmVsZW1lbnQpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLmVsZW1lbnQuYXBwZW5kQ2hpbGQodGV4dCkKCiAgICAgICAgZGVmIGluc2VydEJlZm9yZShzZWxmLCBub2RlLCByZWZOb2RlKToKICAgICAgICAgICAgc2VsZi5lbGVtZW50Lmluc2VydEJlZm9yZShub2RlLmVsZW1lbnQsIHJlZk5vZGUuZWxlbWVudCkKICAgICAgICAgICAgbm9kZS5wYXJlbnQgPSBzZWxmCgogICAgICAgIGRlZiByZW1vdmVDaGlsZChzZWxmLCBub2RlKToKICAgICAgICAgICAgaWYgbm9kZS5lbGVtZW50LnBhcmVudE5vZGUgPT0gc2VsZi5lbGVtZW50OgogICAgICAgICAgICAgICAgc2VsZi5lbGVtZW50LnJlbW92ZUNoaWxkKG5vZGUuZWxlbWVudCkKICAgICAgICAgICAgbm9kZS5wYXJlbnQgPSBOb25lCgogICAgICAgIGRlZiByZXBhcmVudENoaWxkcmVuKHNlbGYsIG5ld1BhcmVudCk6CiAgICAgICAgICAgIHdoaWxlIHNlbGYuZWxlbWVudC5oYXNDaGlsZE5vZGVzKCk6CiAgICAgICAgICAgICAgICBjaGlsZCA9IHNlbGYuZWxlbWVudC5maXJzdENoaWxkCiAgICAgICAgICAgICAgICBzZWxmLmVsZW1lbnQucmVtb3ZlQ2hpbGQoY2hpbGQpCiAgICAgICAgICAgICAgICBuZXdQYXJlbnQuZWxlbWVudC5hcHBlbmRDaGlsZChjaGlsZCkKICAgICAgICAgICAgc2VsZi5jaGlsZE5vZGVzID0gW10KCiAgICAgICAgZGVmIGdldEF0dHJpYnV0ZXMoc2VsZik6CiAgICAgICAgICAgIHJldHVybiBBdHRyTGlzdChzZWxmLmVsZW1lbnQpCgogICAgICAgIGRlZiBzZXRBdHRyaWJ1dGVzKHNlbGYsIGF0dHJpYnV0ZXMpOgogICAgICAgICAgICBpZiBhdHRyaWJ1dGVzOgogICAgICAgICAgICAgICAgZm9yIG5hbWUsIHZhbHVlIGluIGxpc3QoYXR0cmlidXRlcy5pdGVtcygpKToKICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKG5hbWUsIHR1cGxlKToKICAgICAgICAgICAgICAgICAgICAgICAgaWYgbmFtZVswXSBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpZmllZE5hbWUgPSAobmFtZVswXSArICI6IiArIG5hbWVbMV0pCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFsaWZpZWROYW1lID0gbmFtZVsxXQogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVsZW1lbnQuc2V0QXR0cmlidXRlTlMobmFtZVsyXSwgcXVhbGlmaWVkTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlKQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZWxlbWVudC5zZXRBdHRyaWJ1dGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCB2YWx1ZSkKICAgICAgICBhdHRyaWJ1dGVzID0gcHJvcGVydHkoZ2V0QXR0cmlidXRlcywgc2V0QXR0cmlidXRlcykKCiAgICAgICAgZGVmIGNsb25lTm9kZShzZWxmKToKICAgICAgICAgICAgcmV0dXJuIE5vZGVCdWlsZGVyKHNlbGYuZWxlbWVudC5jbG9uZU5vZGUoRmFsc2UpKQoKICAgICAgICBkZWYgaGFzQ29udGVudChzZWxmKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuZWxlbWVudC5oYXNDaGlsZE5vZGVzKCkKCiAgICAgICAgZGVmIGdldE5hbWVUdXBsZShzZWxmKToKICAgICAgICAgICAgaWYgc2VsZi5uYW1lc3BhY2UgaXMgTm9uZToKICAgICAgICAgICAgICAgIHJldHVybiBuYW1lc3BhY2VzWyJodG1sIl0sIHNlbGYubmFtZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYubmFtZXNwYWNlLCBzZWxmLm5hbWUKCiAgICAgICAgbmFtZVR1cGxlID0gcHJvcGVydHkoZ2V0TmFtZVR1cGxlKQoKICAgIGNsYXNzIFRyZWVCdWlsZGVyKGJhc2UuVHJlZUJ1aWxkZXIpOiAgIyBweWxpbnQ6ZGlzYWJsZT11bnVzZWQtdmFyaWFibGUKICAgICAgICBkZWYgZG9jdW1lbnRDbGFzcyhzZWxmKToKICAgICAgICAgICAgc2VsZi5kb20gPSBEb20uZ2V0RE9NSW1wbGVtZW50YXRpb24oKS5jcmVhdGVEb2N1bWVudChOb25lLCBOb25lLCBOb25lKQogICAgICAgICAgICByZXR1cm4gd2Vha3JlZi5wcm94eShzZWxmKQoKICAgICAgICBkZWYgaW5zZXJ0RG9jdHlwZShzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIG5hbWUgPSB0b2tlblsibmFtZSJdCiAgICAgICAgICAgIHB1YmxpY0lkID0gdG9rZW5bInB1YmxpY0lkIl0KICAgICAgICAgICAgc3lzdGVtSWQgPSB0b2tlblsic3lzdGVtSWQiXQoKICAgICAgICAgICAgZG9taW1wbCA9IERvbS5nZXRET01JbXBsZW1lbnRhdGlvbigpCiAgICAgICAgICAgIGRvY3R5cGUgPSBkb21pbXBsLmNyZWF0ZURvY3VtZW50VHlwZShuYW1lLCBwdWJsaWNJZCwgc3lzdGVtSWQpCiAgICAgICAgICAgIHNlbGYuZG9jdW1lbnQuYXBwZW5kQ2hpbGQoTm9kZUJ1aWxkZXIoZG9jdHlwZSkpCiAgICAgICAgICAgIGlmIERvbSA9PSBtaW5pZG9tOgogICAgICAgICAgICAgICAgZG9jdHlwZS5vd25lckRvY3VtZW50ID0gc2VsZi5kb20KCiAgICAgICAgZGVmIGVsZW1lbnRDbGFzcyhzZWxmLCBuYW1lLCBuYW1lc3BhY2U9Tm9uZSk6CiAgICAgICAgICAgIGlmIG5hbWVzcGFjZSBpcyBOb25lIGFuZCBzZWxmLmRlZmF1bHROYW1lc3BhY2UgaXMgTm9uZToKICAgICAgICAgICAgICAgIG5vZGUgPSBzZWxmLmRvbS5jcmVhdGVFbGVtZW50KG5hbWUpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBub2RlID0gc2VsZi5kb20uY3JlYXRlRWxlbWVudE5TKG5hbWVzcGFjZSwgbmFtZSkKCiAgICAgICAgICAgIHJldHVybiBOb2RlQnVpbGRlcihub2RlKQoKICAgICAgICBkZWYgY29tbWVudENsYXNzKHNlbGYsIGRhdGEpOgogICAgICAgICAgICByZXR1cm4gTm9kZUJ1aWxkZXIoc2VsZi5kb20uY3JlYXRlQ29tbWVudChkYXRhKSkKCiAgICAgICAgZGVmIGZyYWdtZW50Q2xhc3Moc2VsZik6CiAgICAgICAgICAgIHJldHVybiBOb2RlQnVpbGRlcihzZWxmLmRvbS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkpCgogICAgICAgIGRlZiBhcHBlbmRDaGlsZChzZWxmLCBub2RlKToKICAgICAgICAgICAgc2VsZi5kb20uYXBwZW5kQ2hpbGQobm9kZS5lbGVtZW50KQoKICAgICAgICBkZWYgdGVzdFNlcmlhbGl6ZXIoc2VsZiwgZWxlbWVudCk6CiAgICAgICAgICAgIHJldHVybiB0ZXN0U2VyaWFsaXplcihlbGVtZW50KQoKICAgICAgICBkZWYgZ2V0RG9jdW1lbnQoc2VsZik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmRvbQoKICAgICAgICBkZWYgZ2V0RnJhZ21lbnQoc2VsZik6CiAgICAgICAgICAgIHJldHVybiBiYXNlLlRyZWVCdWlsZGVyLmdldEZyYWdtZW50KHNlbGYpLmVsZW1lbnQKCiAgICAgICAgZGVmIGluc2VydFRleHQoc2VsZiwgZGF0YSwgcGFyZW50PU5vbmUpOgogICAgICAgICAgICBkYXRhID0gZGF0YQogICAgICAgICAgICBpZiBwYXJlbnQgIT0gc2VsZjoKICAgICAgICAgICAgICAgIGJhc2UuVHJlZUJ1aWxkZXIuaW5zZXJ0VGV4dChzZWxmLCBkYXRhLCBwYXJlbnQpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIEhBQ0s6IGFsbG93IHRleHQgbm9kZXMgYXMgY2hpbGRyZW4gb2YgdGhlIGRvY3VtZW50IG5vZGUKICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIoc2VsZi5kb20sICdfY2hpbGRfbm9kZV90eXBlcycpOgogICAgICAgICAgICAgICAgICAgICMgcHlsaW50OmRpc2FibGU9cHJvdGVjdGVkLWFjY2VzcwogICAgICAgICAgICAgICAgICAgIGlmIE5vZGUuVEVYVF9OT0RFIG5vdCBpbiBzZWxmLmRvbS5fY2hpbGRfbm9kZV90eXBlczoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kb20uX2NoaWxkX25vZGVfdHlwZXMgPSBsaXN0KHNlbGYuZG9tLl9jaGlsZF9ub2RlX3R5cGVzKQogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRvbS5fY2hpbGRfbm9kZV90eXBlcy5hcHBlbmQoTm9kZS5URVhUX05PREUpCiAgICAgICAgICAgICAgICBzZWxmLmRvbS5hcHBlbmRDaGlsZChzZWxmLmRvbS5jcmVhdGVUZXh0Tm9kZShkYXRhKSkKCiAgICAgICAgaW1wbGVtZW50YXRpb24gPSBEb21JbXBsZW1lbnRhdGlvbgogICAgICAgIG5hbWUgPSBOb25lCgogICAgZGVmIHRlc3RTZXJpYWxpemVyKGVsZW1lbnQpOgogICAgICAgIGVsZW1lbnQubm9ybWFsaXplKCkKICAgICAgICBydiA9IFtdCgogICAgICAgIGRlZiBzZXJpYWxpemVFbGVtZW50KGVsZW1lbnQsIGluZGVudD0wKToKICAgICAgICAgICAgaWYgZWxlbWVudC5ub2RlVHlwZSA9PSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERToKICAgICAgICAgICAgICAgIGlmIGVsZW1lbnQubmFtZToKICAgICAgICAgICAgICAgICAgICBpZiBlbGVtZW50LnB1YmxpY0lkIG9yIGVsZW1lbnQuc3lzdGVtSWQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpY0lkID0gZWxlbWVudC5wdWJsaWNJZCBvciAiIgogICAgICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCA9IGVsZW1lbnQuc3lzdGVtSWQgb3IgIiIKICAgICAgICAgICAgICAgICAgICAgICAgcnYuYXBwZW5kKCIiInwlczwhRE9DVFlQRSAlcyAiJXMiICIlcyI+IiIiICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnICcgKiBpbmRlbnQsIGVsZW1lbnQubmFtZSwgcHVibGljSWQsIHN5c3RlbUlkKSkKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBydi5hcHBlbmQoInwlczwhRE9DVFlQRSAlcz4iICUgKCcgJyAqIGluZGVudCwgZWxlbWVudC5uYW1lKSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcnYuYXBwZW5kKCJ8JXM8IURPQ1RZUEUgPiIgJSAoJyAnICogaW5kZW50LCkpCiAgICAgICAgICAgIGVsaWYgZWxlbWVudC5ub2RlVHlwZSA9PSBOb2RlLkRPQ1VNRU5UX05PREU6CiAgICAgICAgICAgICAgICBydi5hcHBlbmQoIiNkb2N1bWVudCIpCiAgICAgICAgICAgIGVsaWYgZWxlbWVudC5ub2RlVHlwZSA9PSBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREU6CiAgICAgICAgICAgICAgICBydi5hcHBlbmQoIiNkb2N1bWVudC1mcmFnbWVudCIpCiAgICAgICAgICAgIGVsaWYgZWxlbWVudC5ub2RlVHlwZSA9PSBOb2RlLkNPTU1FTlRfTk9ERToKICAgICAgICAgICAgICAgIHJ2LmFwcGVuZCgifCVzPCEtLSAlcyAtLT4iICUgKCcgJyAqIGluZGVudCwgZWxlbWVudC5ub2RlVmFsdWUpKQogICAgICAgICAgICBlbGlmIGVsZW1lbnQubm9kZVR5cGUgPT0gTm9kZS5URVhUX05PREU6CiAgICAgICAgICAgICAgICBydi5hcHBlbmQoInwlc1wiJXNcIiIgJSAoJyAnICogaW5kZW50LCBlbGVtZW50Lm5vZGVWYWx1ZSkpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBpZiAoaGFzYXR0cihlbGVtZW50LCAibmFtZXNwYWNlVVJJIikgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQubmFtZXNwYWNlVVJJIGlzIG5vdCBOb25lKToKICAgICAgICAgICAgICAgICAgICBuYW1lID0gIiVzICVzIiAlIChjb25zdGFudHMucHJlZml4ZXNbZWxlbWVudC5uYW1lc3BhY2VVUkldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQubm9kZU5hbWUpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIG5hbWUgPSBlbGVtZW50Lm5vZGVOYW1lCiAgICAgICAgICAgICAgICBydi5hcHBlbmQoInwlczwlcz4iICUgKCcgJyAqIGluZGVudCwgbmFtZSkpCiAgICAgICAgICAgICAgICBpZiBlbGVtZW50Lmhhc0F0dHJpYnV0ZXMoKToKICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzID0gW10KICAgICAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oZWxlbWVudC5hdHRyaWJ1dGVzKSk6CiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIgPSBlbGVtZW50LmF0dHJpYnV0ZXMuaXRlbShpKQogICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gYXR0ci5ub2RlTmFtZQogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGF0dHIudmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgbnMgPSBhdHRyLm5hbWVzcGFjZVVSSQogICAgICAgICAgICAgICAgICAgICAgICBpZiBuczoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiJXMgJXMiICUgKGNvbnN0YW50cy5wcmVmaXhlc1tuc10sIGF0dHIubG9jYWxOYW1lKQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGF0dHIubm9kZU5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcy5hcHBlbmQoKG5hbWUsIHZhbHVlKSkKCiAgICAgICAgICAgICAgICAgICAgZm9yIG5hbWUsIHZhbHVlIGluIHNvcnRlZChhdHRyaWJ1dGVzKToKICAgICAgICAgICAgICAgICAgICAgICAgcnYuYXBwZW5kKCd8JXMlcz0iJXMiJyAlICgnICcgKiAoaW5kZW50ICsgMiksIG5hbWUsIHZhbHVlKSkKICAgICAgICAgICAgaW5kZW50ICs9IDIKICAgICAgICAgICAgZm9yIGNoaWxkIGluIGVsZW1lbnQuY2hpbGROb2RlczoKICAgICAgICAgICAgICAgIHNlcmlhbGl6ZUVsZW1lbnQoY2hpbGQsIGluZGVudCkKICAgICAgICBzZXJpYWxpemVFbGVtZW50KGVsZW1lbnQsIDApCgogICAgICAgIHJldHVybiAiXG4iLmpvaW4ocnYpCgogICAgcmV0dXJuIGxvY2FscygpCgoKIyBUaGUgYWN0dWFsIG1lYW5zIHRvIGdldCBhIG1vZHVsZSEKZ2V0RG9tTW9kdWxlID0gbW9kdWxlRmFjdG9yeUZhY3RvcnkoZ2V0RG9tQnVpbGRlcikKUEsDBBQAAAAAAAAAIQChfZfw3DEAANwxAABHAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi90cmVlYnVpbGRlcnMvZXRyZWUucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHVuaWNvZGVfbGl0ZXJhbHMKIyBweWxpbnQ6ZGlzYWJsZT1wcm90ZWN0ZWQtYWNjZXNzCgpmcm9tIHBpcC5fdmVuZG9yLnNpeCBpbXBvcnQgdGV4dF90eXBlCgppbXBvcnQgcmUKCmZyb20gLiBpbXBvcnQgYmFzZQpmcm9tIC4uIGltcG9ydCBfaWhhdGV4bWwKZnJvbSAuLiBpbXBvcnQgY29uc3RhbnRzCmZyb20gLi5jb25zdGFudHMgaW1wb3J0IG5hbWVzcGFjZXMKZnJvbSAuLl91dGlscyBpbXBvcnQgbW9kdWxlRmFjdG9yeUZhY3RvcnkKCnRhZ19yZWdleHAgPSByZS5jb21waWxlKCJ7KFtefV0qKX0oLiopIikKCgpkZWYgZ2V0RVRyZWVCdWlsZGVyKEVsZW1lbnRUcmVlSW1wbGVtZW50YXRpb24sIGZ1bGxUcmVlPUZhbHNlKToKICAgIEVsZW1lbnRUcmVlID0gRWxlbWVudFRyZWVJbXBsZW1lbnRhdGlvbgogICAgRWxlbWVudFRyZWVDb21tZW50VHlwZSA9IEVsZW1lbnRUcmVlLkNvbW1lbnQoImFzZCIpLnRhZwoKICAgIGNsYXNzIEVsZW1lbnQoYmFzZS5Ob2RlKToKICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgbmFtZXNwYWNlPU5vbmUpOgogICAgICAgICAgICBzZWxmLl9uYW1lID0gbmFtZQogICAgICAgICAgICBzZWxmLl9uYW1lc3BhY2UgPSBuYW1lc3BhY2UKICAgICAgICAgICAgc2VsZi5fZWxlbWVudCA9IEVsZW1lbnRUcmVlLkVsZW1lbnQoc2VsZi5fZ2V0RVRyZWVUYWcobmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlKSkKICAgICAgICAgICAgaWYgbmFtZXNwYWNlIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBzZWxmLm5hbWVUdXBsZSA9IG5hbWVzcGFjZXNbImh0bWwiXSwgc2VsZi5fbmFtZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi5uYW1lVHVwbGUgPSBzZWxmLl9uYW1lc3BhY2UsIHNlbGYuX25hbWUKICAgICAgICAgICAgc2VsZi5wYXJlbnQgPSBOb25lCiAgICAgICAgICAgIHNlbGYuX2NoaWxkTm9kZXMgPSBbXQogICAgICAgICAgICBzZWxmLl9mbGFncyA9IFtdCgogICAgICAgIGRlZiBfZ2V0RVRyZWVUYWcoc2VsZiwgbmFtZSwgbmFtZXNwYWNlKToKICAgICAgICAgICAgaWYgbmFtZXNwYWNlIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBldHJlZV90YWcgPSBuYW1lCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBldHJlZV90YWcgPSAieyVzfSVzIiAlIChuYW1lc3BhY2UsIG5hbWUpCiAgICAgICAgICAgIHJldHVybiBldHJlZV90YWcKCiAgICAgICAgZGVmIF9zZXROYW1lKHNlbGYsIG5hbWUpOgogICAgICAgICAgICBzZWxmLl9uYW1lID0gbmFtZQogICAgICAgICAgICBzZWxmLl9lbGVtZW50LnRhZyA9IHNlbGYuX2dldEVUcmVlVGFnKHNlbGYuX25hbWUsIHNlbGYuX25hbWVzcGFjZSkKCiAgICAgICAgZGVmIF9nZXROYW1lKHNlbGYpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fbmFtZQoKICAgICAgICBuYW1lID0gcHJvcGVydHkoX2dldE5hbWUsIF9zZXROYW1lKQoKICAgICAgICBkZWYgX3NldE5hbWVzcGFjZShzZWxmLCBuYW1lc3BhY2UpOgogICAgICAgICAgICBzZWxmLl9uYW1lc3BhY2UgPSBuYW1lc3BhY2UKICAgICAgICAgICAgc2VsZi5fZWxlbWVudC50YWcgPSBzZWxmLl9nZXRFVHJlZVRhZyhzZWxmLl9uYW1lLCBzZWxmLl9uYW1lc3BhY2UpCgogICAgICAgIGRlZiBfZ2V0TmFtZXNwYWNlKHNlbGYpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fbmFtZXNwYWNlCgogICAgICAgIG5hbWVzcGFjZSA9IHByb3BlcnR5KF9nZXROYW1lc3BhY2UsIF9zZXROYW1lc3BhY2UpCgogICAgICAgIGRlZiBfZ2V0QXR0cmlidXRlcyhzZWxmKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2VsZW1lbnQuYXR0cmliCgogICAgICAgIGRlZiBfc2V0QXR0cmlidXRlcyhzZWxmLCBhdHRyaWJ1dGVzKToKICAgICAgICAgICAgIyBEZWxldGUgZXhpc3RpbmcgYXR0cmlidXRlcyBmaXJzdAogICAgICAgICAgICAjIFhYWCAtIHRoZXJlIG1heSBiZSBhIGJldHRlciB3YXkgdG8gZG8gdGhpcy4uLgogICAgICAgICAgICBmb3Iga2V5IGluIGxpc3Qoc2VsZi5fZWxlbWVudC5hdHRyaWIua2V5cygpKToKICAgICAgICAgICAgICAgIGRlbCBzZWxmLl9lbGVtZW50LmF0dHJpYltrZXldCiAgICAgICAgICAgIGZvciBrZXksIHZhbHVlIGluIGF0dHJpYnV0ZXMuaXRlbXMoKToKICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoa2V5LCB0dXBsZSk6CiAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJ7JXN9JXMiICUgKGtleVsyXSwga2V5WzFdKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBuYW1lID0ga2V5CiAgICAgICAgICAgICAgICBzZWxmLl9lbGVtZW50LnNldChuYW1lLCB2YWx1ZSkKCiAgICAgICAgYXR0cmlidXRlcyA9IHByb3BlcnR5KF9nZXRBdHRyaWJ1dGVzLCBfc2V0QXR0cmlidXRlcykKCiAgICAgICAgZGVmIF9nZXRDaGlsZE5vZGVzKHNlbGYpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fY2hpbGROb2RlcwoKICAgICAgICBkZWYgX3NldENoaWxkTm9kZXMoc2VsZiwgdmFsdWUpOgogICAgICAgICAgICBkZWwgc2VsZi5fZWxlbWVudFs6XQogICAgICAgICAgICBzZWxmLl9jaGlsZE5vZGVzID0gW10KICAgICAgICAgICAgZm9yIGVsZW1lbnQgaW4gdmFsdWU6CiAgICAgICAgICAgICAgICBzZWxmLmluc2VydENoaWxkKGVsZW1lbnQpCgogICAgICAgIGNoaWxkTm9kZXMgPSBwcm9wZXJ0eShfZ2V0Q2hpbGROb2RlcywgX3NldENoaWxkTm9kZXMpCgogICAgICAgIGRlZiBoYXNDb250ZW50KHNlbGYpOgogICAgICAgICAgICAiIiJSZXR1cm4gdHJ1ZSBpZiB0aGUgbm9kZSBoYXMgY2hpbGRyZW4gb3IgdGV4dCIiIgogICAgICAgICAgICByZXR1cm4gYm9vbChzZWxmLl9lbGVtZW50LnRleHQgb3IgbGVuKHNlbGYuX2VsZW1lbnQpKQoKICAgICAgICBkZWYgYXBwZW5kQ2hpbGQoc2VsZiwgbm9kZSk6CiAgICAgICAgICAgIHNlbGYuX2NoaWxkTm9kZXMuYXBwZW5kKG5vZGUpCiAgICAgICAgICAgIHNlbGYuX2VsZW1lbnQuYXBwZW5kKG5vZGUuX2VsZW1lbnQpCiAgICAgICAgICAgIG5vZGUucGFyZW50ID0gc2VsZgoKICAgICAgICBkZWYgaW5zZXJ0QmVmb3JlKHNlbGYsIG5vZGUsIHJlZk5vZGUpOgogICAgICAgICAgICBpbmRleCA9IGxpc3Qoc2VsZi5fZWxlbWVudCkuaW5kZXgocmVmTm9kZS5fZWxlbWVudCkKICAgICAgICAgICAgc2VsZi5fZWxlbWVudC5pbnNlcnQoaW5kZXgsIG5vZGUuX2VsZW1lbnQpCiAgICAgICAgICAgIG5vZGUucGFyZW50ID0gc2VsZgoKICAgICAgICBkZWYgcmVtb3ZlQ2hpbGQoc2VsZiwgbm9kZSk6CiAgICAgICAgICAgIHNlbGYuX2NoaWxkTm9kZXMucmVtb3ZlKG5vZGUpCiAgICAgICAgICAgIHNlbGYuX2VsZW1lbnQucmVtb3ZlKG5vZGUuX2VsZW1lbnQpCiAgICAgICAgICAgIG5vZGUucGFyZW50ID0gTm9uZQoKICAgICAgICBkZWYgaW5zZXJ0VGV4dChzZWxmLCBkYXRhLCBpbnNlcnRCZWZvcmU9Tm9uZSk6CiAgICAgICAgICAgIGlmIG5vdChsZW4oc2VsZi5fZWxlbWVudCkpOgogICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuX2VsZW1lbnQudGV4dDoKICAgICAgICAgICAgICAgICAgICBzZWxmLl9lbGVtZW50LnRleHQgPSAiIgogICAgICAgICAgICAgICAgc2VsZi5fZWxlbWVudC50ZXh0ICs9IGRhdGEKICAgICAgICAgICAgZWxpZiBpbnNlcnRCZWZvcmUgaXMgTm9uZToKICAgICAgICAgICAgICAgICMgSW5zZXJ0IHRoZSB0ZXh0IGFzIHRoZSB0YWlsIG9mIHRoZSBsYXN0IGNoaWxkIGVsZW1lbnQKICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9lbGVtZW50Wy0xXS50YWlsOgogICAgICAgICAgICAgICAgICAgIHNlbGYuX2VsZW1lbnRbLTFdLnRhaWwgPSAiIgogICAgICAgICAgICAgICAgc2VsZi5fZWxlbWVudFstMV0udGFpbCArPSBkYXRhCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIEluc2VydCB0aGUgdGV4dCBiZWZvcmUgdGhlIHNwZWNpZmllZCBub2RlCiAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IGxpc3Qoc2VsZi5fZWxlbWVudCkKICAgICAgICAgICAgICAgIGluZGV4ID0gY2hpbGRyZW4uaW5kZXgoaW5zZXJ0QmVmb3JlLl9lbGVtZW50KQogICAgICAgICAgICAgICAgaWYgaW5kZXggPiAwOgogICAgICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9lbGVtZW50W2luZGV4IC0gMV0udGFpbDoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZWxlbWVudFtpbmRleCAtIDFdLnRhaWwgPSAiIgogICAgICAgICAgICAgICAgICAgIHNlbGYuX2VsZW1lbnRbaW5kZXggLSAxXS50YWlsICs9IGRhdGEKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuX2VsZW1lbnQudGV4dDoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZWxlbWVudC50ZXh0ID0gIiIKICAgICAgICAgICAgICAgICAgICBzZWxmLl9lbGVtZW50LnRleHQgKz0gZGF0YQoKICAgICAgICBkZWYgY2xvbmVOb2RlKHNlbGYpOgogICAgICAgICAgICBlbGVtZW50ID0gdHlwZShzZWxmKShzZWxmLm5hbWUsIHNlbGYubmFtZXNwYWNlKQogICAgICAgICAgICBmb3IgbmFtZSwgdmFsdWUgaW4gc2VsZi5hdHRyaWJ1dGVzLml0ZW1zKCk6CiAgICAgICAgICAgICAgICBlbGVtZW50LmF0dHJpYnV0ZXNbbmFtZV0gPSB2YWx1ZQogICAgICAgICAgICByZXR1cm4gZWxlbWVudAoKICAgICAgICBkZWYgcmVwYXJlbnRDaGlsZHJlbihzZWxmLCBuZXdQYXJlbnQpOgogICAgICAgICAgICBpZiBuZXdQYXJlbnQuY2hpbGROb2RlczoKICAgICAgICAgICAgICAgIG5ld1BhcmVudC5jaGlsZE5vZGVzWy0xXS5fZWxlbWVudC50YWlsICs9IHNlbGYuX2VsZW1lbnQudGV4dAogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgaWYgbm90IG5ld1BhcmVudC5fZWxlbWVudC50ZXh0OgogICAgICAgICAgICAgICAgICAgIG5ld1BhcmVudC5fZWxlbWVudC50ZXh0ID0gIiIKICAgICAgICAgICAgICAgIGlmIHNlbGYuX2VsZW1lbnQudGV4dCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICBuZXdQYXJlbnQuX2VsZW1lbnQudGV4dCArPSBzZWxmLl9lbGVtZW50LnRleHQKICAgICAgICAgICAgc2VsZi5fZWxlbWVudC50ZXh0ID0gIiIKICAgICAgICAgICAgYmFzZS5Ob2RlLnJlcGFyZW50Q2hpbGRyZW4oc2VsZiwgbmV3UGFyZW50KQoKICAgIGNsYXNzIENvbW1lbnQoRWxlbWVudCk6CiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGRhdGEpOgogICAgICAgICAgICAjIFVzZSB0aGUgc3VwZXJjbGFzcyBjb25zdHJ1Y3RvciB0byBzZXQgYWxsIHByb3BlcnRpZXMgb24gdGhlCiAgICAgICAgICAgICMgd3JhcHBlciBlbGVtZW50CiAgICAgICAgICAgIHNlbGYuX2VsZW1lbnQgPSBFbGVtZW50VHJlZS5Db21tZW50KGRhdGEpCiAgICAgICAgICAgIHNlbGYucGFyZW50ID0gTm9uZQogICAgICAgICAgICBzZWxmLl9jaGlsZE5vZGVzID0gW10KICAgICAgICAgICAgc2VsZi5fZmxhZ3MgPSBbXQoKICAgICAgICBkZWYgX2dldERhdGEoc2VsZik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9lbGVtZW50LnRleHQKCiAgICAgICAgZGVmIF9zZXREYXRhKHNlbGYsIHZhbHVlKToKICAgICAgICAgICAgc2VsZi5fZWxlbWVudC50ZXh0ID0gdmFsdWUKCiAgICAgICAgZGF0YSA9IHByb3BlcnR5KF9nZXREYXRhLCBfc2V0RGF0YSkKCiAgICBjbGFzcyBEb2N1bWVudFR5cGUoRWxlbWVudCk6CiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIHB1YmxpY0lkLCBzeXN0ZW1JZCk6CiAgICAgICAgICAgIEVsZW1lbnQuX19pbml0X18oc2VsZiwgIjwhRE9DVFlQRT4iKQogICAgICAgICAgICBzZWxmLl9lbGVtZW50LnRleHQgPSBuYW1lCiAgICAgICAgICAgIHNlbGYucHVibGljSWQgPSBwdWJsaWNJZAogICAgICAgICAgICBzZWxmLnN5c3RlbUlkID0gc3lzdGVtSWQKCiAgICAgICAgZGVmIF9nZXRQdWJsaWNJZChzZWxmKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2VsZW1lbnQuZ2V0KCJwdWJsaWNJZCIsICIiKQoKICAgICAgICBkZWYgX3NldFB1YmxpY0lkKHNlbGYsIHZhbHVlKToKICAgICAgICAgICAgaWYgdmFsdWUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBzZWxmLl9lbGVtZW50LnNldCgicHVibGljSWQiLCB2YWx1ZSkKCiAgICAgICAgcHVibGljSWQgPSBwcm9wZXJ0eShfZ2V0UHVibGljSWQsIF9zZXRQdWJsaWNJZCkKCiAgICAgICAgZGVmIF9nZXRTeXN0ZW1JZChzZWxmKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2VsZW1lbnQuZ2V0KCJzeXN0ZW1JZCIsICIiKQoKICAgICAgICBkZWYgX3NldFN5c3RlbUlkKHNlbGYsIHZhbHVlKToKICAgICAgICAgICAgaWYgdmFsdWUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBzZWxmLl9lbGVtZW50LnNldCgic3lzdGVtSWQiLCB2YWx1ZSkKCiAgICAgICAgc3lzdGVtSWQgPSBwcm9wZXJ0eShfZ2V0U3lzdGVtSWQsIF9zZXRTeXN0ZW1JZCkKCiAgICBjbGFzcyBEb2N1bWVudChFbGVtZW50KToKICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgICAgIEVsZW1lbnQuX19pbml0X18oc2VsZiwgIkRPQ1VNRU5UX1JPT1QiKQoKICAgIGNsYXNzIERvY3VtZW50RnJhZ21lbnQoRWxlbWVudCk6CiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgICAgICBFbGVtZW50Ll9faW5pdF9fKHNlbGYsICJET0NVTUVOVF9GUkFHTUVOVCIpCgogICAgZGVmIHRlc3RTZXJpYWxpemVyKGVsZW1lbnQpOgogICAgICAgIHJ2ID0gW10KCiAgICAgICAgZGVmIHNlcmlhbGl6ZUVsZW1lbnQoZWxlbWVudCwgaW5kZW50PTApOgogICAgICAgICAgICBpZiBub3QoaGFzYXR0cihlbGVtZW50LCAidGFnIikpOgogICAgICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQuZ2V0cm9vdCgpCiAgICAgICAgICAgIGlmIGVsZW1lbnQudGFnID09ICI8IURPQ1RZUEU+IjoKICAgICAgICAgICAgICAgIGlmIGVsZW1lbnQuZ2V0KCJwdWJsaWNJZCIpIG9yIGVsZW1lbnQuZ2V0KCJzeXN0ZW1JZCIpOgogICAgICAgICAgICAgICAgICAgIHB1YmxpY0lkID0gZWxlbWVudC5nZXQoInB1YmxpY0lkIikgb3IgIiIKICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCA9IGVsZW1lbnQuZ2V0KCJzeXN0ZW1JZCIpIG9yICIiCiAgICAgICAgICAgICAgICAgICAgcnYuYXBwZW5kKCIiIjwhRE9DVFlQRSAlcyAiJXMiICIlcyI+IiIiICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVsZW1lbnQudGV4dCwgcHVibGljSWQsIHN5c3RlbUlkKSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcnYuYXBwZW5kKCI8IURPQ1RZUEUgJXM+IiAlIChlbGVtZW50LnRleHQsKSkKICAgICAgICAgICAgZWxpZiBlbGVtZW50LnRhZyA9PSAiRE9DVU1FTlRfUk9PVCI6CiAgICAgICAgICAgICAgICBydi5hcHBlbmQoIiNkb2N1bWVudCIpCiAgICAgICAgICAgICAgICBpZiBlbGVtZW50LnRleHQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgcnYuYXBwZW5kKCJ8JXNcIiVzXCIiICUgKCcgJyAqIChpbmRlbnQgKyAyKSwgZWxlbWVudC50ZXh0KSkKICAgICAgICAgICAgICAgIGlmIGVsZW1lbnQudGFpbCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIkRvY3VtZW50IG5vZGUgY2Fubm90IGhhdmUgdGFpbCIpCiAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKGVsZW1lbnQsICJhdHRyaWIiKSBhbmQgbGVuKGVsZW1lbnQuYXR0cmliKToKICAgICAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIkRvY3VtZW50IG5vZGUgY2Fubm90IGhhdmUgYXR0cmlidXRlcyIpCiAgICAgICAgICAgIGVsaWYgZWxlbWVudC50YWcgPT0gRWxlbWVudFRyZWVDb21tZW50VHlwZToKICAgICAgICAgICAgICAgIHJ2LmFwcGVuZCgifCVzPCEtLSAlcyAtLT4iICUgKCcgJyAqIGluZGVudCwgZWxlbWVudC50ZXh0KSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKGVsZW1lbnQudGFnLCB0ZXh0X3R5cGUpLCBcCiAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIHVuaWNvZGUsIGdvdCAlcywgJXMiICUgKHR5cGUoZWxlbWVudC50YWcpLCBlbGVtZW50LnRhZykKICAgICAgICAgICAgICAgIG5zbWF0Y2ggPSB0YWdfcmVnZXhwLm1hdGNoKGVsZW1lbnQudGFnKQoKICAgICAgICAgICAgICAgIGlmIG5zbWF0Y2ggaXMgTm9uZToKICAgICAgICAgICAgICAgICAgICBuYW1lID0gZWxlbWVudC50YWcKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgbnMsIG5hbWUgPSBuc21hdGNoLmdyb3VwcygpCiAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gY29uc3RhbnRzLnByZWZpeGVzW25zXQogICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiJXMgJXMiICUgKHByZWZpeCwgbmFtZSkKICAgICAgICAgICAgICAgIHJ2LmFwcGVuZCgifCVzPCVzPiIgJSAoJyAnICogaW5kZW50LCBuYW1lKSkKCiAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKGVsZW1lbnQsICJhdHRyaWIiKToKICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzID0gW10KICAgICAgICAgICAgICAgICAgICBmb3IgbmFtZSwgdmFsdWUgaW4gZWxlbWVudC5hdHRyaWIuaXRlbXMoKToKICAgICAgICAgICAgICAgICAgICAgICAgbnNtYXRjaCA9IHRhZ19yZWdleHAubWF0Y2gobmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgaWYgbnNtYXRjaCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zLCBuYW1lID0gbnNtYXRjaC5ncm91cHMoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gY29uc3RhbnRzLnByZWZpeGVzW25zXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cl9zdHJpbmcgPSAiJXMgJXMiICUgKHByZWZpeCwgbmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJfc3RyaW5nID0gbmFtZQogICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLmFwcGVuZCgoYXR0cl9zdHJpbmcsIHZhbHVlKSkKCiAgICAgICAgICAgICAgICAgICAgZm9yIG5hbWUsIHZhbHVlIGluIHNvcnRlZChhdHRyaWJ1dGVzKToKICAgICAgICAgICAgICAgICAgICAgICAgcnYuYXBwZW5kKCd8JXMlcz0iJXMiJyAlICgnICcgKiAoaW5kZW50ICsgMiksIG5hbWUsIHZhbHVlKSkKICAgICAgICAgICAgICAgIGlmIGVsZW1lbnQudGV4dDoKICAgICAgICAgICAgICAgICAgICBydi5hcHBlbmQoInwlc1wiJXNcIiIgJSAoJyAnICogKGluZGVudCArIDIpLCBlbGVtZW50LnRleHQpKQogICAgICAgICAgICBpbmRlbnQgKz0gMgogICAgICAgICAgICBmb3IgY2hpbGQgaW4gZWxlbWVudDoKICAgICAgICAgICAgICAgIHNlcmlhbGl6ZUVsZW1lbnQoY2hpbGQsIGluZGVudCkKICAgICAgICAgICAgaWYgZWxlbWVudC50YWlsOgogICAgICAgICAgICAgICAgcnYuYXBwZW5kKCJ8JXNcIiVzXCIiICUgKCcgJyAqIChpbmRlbnQgLSAyKSwgZWxlbWVudC50YWlsKSkKICAgICAgICBzZXJpYWxpemVFbGVtZW50KGVsZW1lbnQsIDApCgogICAgICAgIHJldHVybiAiXG4iLmpvaW4ocnYpCgogICAgZGVmIHRvc3RyaW5nKGVsZW1lbnQpOiAgIyBweWxpbnQ6ZGlzYWJsZT11bnVzZWQtdmFyaWFibGUKICAgICAgICAiIiJTZXJpYWxpemUgYW4gZWxlbWVudCBhbmQgaXRzIGNoaWxkIG5vZGVzIHRvIGEgc3RyaW5nIiIiCiAgICAgICAgcnYgPSBbXQogICAgICAgIGZpbHRlciA9IF9paGF0ZXhtbC5JbmZvc2V0RmlsdGVyKCkKCiAgICAgICAgZGVmIHNlcmlhbGl6ZUVsZW1lbnQoZWxlbWVudCk6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZWxlbWVudCwgRWxlbWVudFRyZWUuRWxlbWVudFRyZWUpOgogICAgICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQuZ2V0cm9vdCgpCgogICAgICAgICAgICBpZiBlbGVtZW50LnRhZyA9PSAiPCFET0NUWVBFPiI6CiAgICAgICAgICAgICAgICBpZiBlbGVtZW50LmdldCgicHVibGljSWQiKSBvciBlbGVtZW50LmdldCgic3lzdGVtSWQiKToKICAgICAgICAgICAgICAgICAgICBwdWJsaWNJZCA9IGVsZW1lbnQuZ2V0KCJwdWJsaWNJZCIpIG9yICIiCiAgICAgICAgICAgICAgICAgICAgc3lzdGVtSWQgPSBlbGVtZW50LmdldCgic3lzdGVtSWQiKSBvciAiIgogICAgICAgICAgICAgICAgICAgIHJ2LmFwcGVuZCgiIiI8IURPQ1RZUEUgJXMgUFVCTElDICIlcyIgIiVzIj4iIiIgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZWxlbWVudC50ZXh0LCBwdWJsaWNJZCwgc3lzdGVtSWQpKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBydi5hcHBlbmQoIjwhRE9DVFlQRSAlcz4iICUgKGVsZW1lbnQudGV4dCwpKQogICAgICAgICAgICBlbGlmIGVsZW1lbnQudGFnID09ICJET0NVTUVOVF9ST09UIjoKICAgICAgICAgICAgICAgIGlmIGVsZW1lbnQudGV4dCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICBydi5hcHBlbmQoZWxlbWVudC50ZXh0KQogICAgICAgICAgICAgICAgaWYgZWxlbWVudC50YWlsIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiRG9jdW1lbnQgbm9kZSBjYW5ub3QgaGF2ZSB0YWlsIikKICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIoZWxlbWVudCwgImF0dHJpYiIpIGFuZCBsZW4oZWxlbWVudC5hdHRyaWIpOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiRG9jdW1lbnQgbm9kZSBjYW5ub3QgaGF2ZSBhdHRyaWJ1dGVzIikKCiAgICAgICAgICAgICAgICBmb3IgY2hpbGQgaW4gZWxlbWVudDoKICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVFbGVtZW50KGNoaWxkKQoKICAgICAgICAgICAgZWxpZiBlbGVtZW50LnRhZyA9PSBFbGVtZW50VHJlZUNvbW1lbnRUeXBlOgogICAgICAgICAgICAgICAgcnYuYXBwZW5kKCI8IS0tJXMtLT4iICUgKGVsZW1lbnQudGV4dCwpKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBUaGlzIGlzIGFzc3VtZWQgdG8gYmUgYW4gb3JkaW5hcnkgZWxlbWVudAogICAgICAgICAgICAgICAgaWYgbm90IGVsZW1lbnQuYXR0cmliOgogICAgICAgICAgICAgICAgICAgIHJ2LmFwcGVuZCgiPCVzPiIgJSAoZmlsdGVyLmZyb21YbWxOYW1lKGVsZW1lbnQudGFnKSwpKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBhdHRyID0gIiAiLmpvaW4oWyIlcz1cIiVzXCIiICUgKAogICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIuZnJvbVhtbE5hbWUobmFtZSksIHZhbHVlKQogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbmFtZSwgdmFsdWUgaW4gZWxlbWVudC5hdHRyaWIuaXRlbXMoKV0pCiAgICAgICAgICAgICAgICAgICAgcnYuYXBwZW5kKCI8JXMgJXM+IiAlIChlbGVtZW50LnRhZywgYXR0cikpCiAgICAgICAgICAgICAgICBpZiBlbGVtZW50LnRleHQ6CiAgICAgICAgICAgICAgICAgICAgcnYuYXBwZW5kKGVsZW1lbnQudGV4dCkKCiAgICAgICAgICAgICAgICBmb3IgY2hpbGQgaW4gZWxlbWVudDoKICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVFbGVtZW50KGNoaWxkKQoKICAgICAgICAgICAgICAgIHJ2LmFwcGVuZCgiPC8lcz4iICUgKGVsZW1lbnQudGFnLCkpCgogICAgICAgICAgICBpZiBlbGVtZW50LnRhaWw6CiAgICAgICAgICAgICAgICBydi5hcHBlbmQoZWxlbWVudC50YWlsKQoKICAgICAgICBzZXJpYWxpemVFbGVtZW50KGVsZW1lbnQpCgogICAgICAgIHJldHVybiAiIi5qb2luKHJ2KQoKICAgIGNsYXNzIFRyZWVCdWlsZGVyKGJhc2UuVHJlZUJ1aWxkZXIpOiAgIyBweWxpbnQ6ZGlzYWJsZT11bnVzZWQtdmFyaWFibGUKICAgICAgICBkb2N1bWVudENsYXNzID0gRG9jdW1lbnQKICAgICAgICBkb2N0eXBlQ2xhc3MgPSBEb2N1bWVudFR5cGUKICAgICAgICBlbGVtZW50Q2xhc3MgPSBFbGVtZW50CiAgICAgICAgY29tbWVudENsYXNzID0gQ29tbWVudAogICAgICAgIGZyYWdtZW50Q2xhc3MgPSBEb2N1bWVudEZyYWdtZW50CiAgICAgICAgaW1wbGVtZW50YXRpb24gPSBFbGVtZW50VHJlZUltcGxlbWVudGF0aW9uCgogICAgICAgIGRlZiB0ZXN0U2VyaWFsaXplcihzZWxmLCBlbGVtZW50KToKICAgICAgICAgICAgcmV0dXJuIHRlc3RTZXJpYWxpemVyKGVsZW1lbnQpCgogICAgICAgIGRlZiBnZXREb2N1bWVudChzZWxmKToKICAgICAgICAgICAgaWYgZnVsbFRyZWU6CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5kb2N1bWVudC5fZWxlbWVudAogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgaWYgc2VsZi5kZWZhdWx0TmFtZXNwYWNlIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmRvY3VtZW50Ll9lbGVtZW50LmZpbmQoCiAgICAgICAgICAgICAgICAgICAgICAgICJ7JXN9aHRtbCIgJSBzZWxmLmRlZmF1bHROYW1lc3BhY2UpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmRvY3VtZW50Ll9lbGVtZW50LmZpbmQoImh0bWwiKQoKICAgICAgICBkZWYgZ2V0RnJhZ21lbnQoc2VsZik6CiAgICAgICAgICAgIHJldHVybiBiYXNlLlRyZWVCdWlsZGVyLmdldEZyYWdtZW50KHNlbGYpLl9lbGVtZW50CgogICAgcmV0dXJuIGxvY2FscygpCgoKZ2V0RVRyZWVNb2R1bGUgPSBtb2R1bGVGYWN0b3J5RmFjdG9yeShnZXRFVHJlZUJ1aWxkZXIpClBLAwQUAAAAAAAAACEA2v5K0FE3AABRNwAATAAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvdHJlZWJ1aWxkZXJzL2V0cmVlX2x4bWwucHkiIiJNb2R1bGUgZm9yIHN1cHBvcnRpbmcgdGhlIGx4bWwuZXRyZWUgbGlicmFyeS4gVGhlIGlkZWEgaGVyZSBpcyB0byB1c2UgYXMgbXVjaApvZiB0aGUgbmF0aXZlIGxpYnJhcnkgYXMgcG9zc2libGUsIHdpdGhvdXQgdXNpbmcgZnJhZ2lsZSBoYWNrcyBsaWtlIGN1c3RvbSBlbGVtZW50Cm5hbWVzIHRoYXQgYnJlYWsgYmV0d2VlbiByZWxlYXNlcy4gVGhlIGRvd25zaWRlIG9mIHRoaXMgaXMgdGhhdCB3ZSBjYW5ub3QgcmVwcmVzZW50CmFsbCBwb3NzaWJsZSB0cmVlczsgc3BlY2lmaWNhbGx5IHRoZSBmb2xsb3dpbmcgYXJlIGtub3duIHRvIGNhdXNlIHByb2JsZW1zOgoKVGV4dCBvciBjb21tZW50cyBhcyBzaWJsaW5ncyBvZiB0aGUgcm9vdCBlbGVtZW50CkRvY3lwZXMgd2l0aCBubyBuYW1lCgpXaGVuIGFueSBvZiB0aGVzZSB0aGluZ3Mgb2NjdXIsIHdlIGVtaXQgYSBEYXRhTG9zc1dhcm5pbmcKIiIiCgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHVuaWNvZGVfbGl0ZXJhbHMKIyBweWxpbnQ6ZGlzYWJsZT1wcm90ZWN0ZWQtYWNjZXNzCgppbXBvcnQgd2FybmluZ3MKaW1wb3J0IHJlCmltcG9ydCBzeXMKCmZyb20gLiBpbXBvcnQgYmFzZQpmcm9tIC4uY29uc3RhbnRzIGltcG9ydCBEYXRhTG9zc1dhcm5pbmcKZnJvbSAuLiBpbXBvcnQgY29uc3RhbnRzCmZyb20gLiBpbXBvcnQgZXRyZWUgYXMgZXRyZWVfYnVpbGRlcnMKZnJvbSAuLiBpbXBvcnQgX2loYXRleG1sCgppbXBvcnQgbHhtbC5ldHJlZSBhcyBldHJlZQoKCmZ1bGxUcmVlID0gVHJ1ZQp0YWdfcmVnZXhwID0gcmUuY29tcGlsZSgieyhbXn1dKil9KC4qKSIpCgpjb21tZW50X3R5cGUgPSBldHJlZS5Db21tZW50KCJhc2QiKS50YWcKCgpjbGFzcyBEb2N1bWVudFR5cGUob2JqZWN0KToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBwdWJsaWNJZCwgc3lzdGVtSWQpOgogICAgICAgIHNlbGYubmFtZSA9IG5hbWUKICAgICAgICBzZWxmLnB1YmxpY0lkID0gcHVibGljSWQKICAgICAgICBzZWxmLnN5c3RlbUlkID0gc3lzdGVtSWQKCgpjbGFzcyBEb2N1bWVudChvYmplY3QpOgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHNlbGYuX2VsZW1lbnRUcmVlID0gTm9uZQogICAgICAgIHNlbGYuX2NoaWxkTm9kZXMgPSBbXQoKICAgIGRlZiBhcHBlbmRDaGlsZChzZWxmLCBlbGVtZW50KToKICAgICAgICBzZWxmLl9lbGVtZW50VHJlZS5nZXRyb290KCkuYWRkbmV4dChlbGVtZW50Ll9lbGVtZW50KQoKICAgIGRlZiBfZ2V0Q2hpbGROb2RlcyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fY2hpbGROb2RlcwoKICAgIGNoaWxkTm9kZXMgPSBwcm9wZXJ0eShfZ2V0Q2hpbGROb2RlcykKCgpkZWYgdGVzdFNlcmlhbGl6ZXIoZWxlbWVudCk6CiAgICBydiA9IFtdCiAgICBpbmZvc2V0RmlsdGVyID0gX2loYXRleG1sLkluZm9zZXRGaWx0ZXIocHJldmVudERvdWJsZURhc2hDb21tZW50cz1UcnVlKQoKICAgIGRlZiBzZXJpYWxpemVFbGVtZW50KGVsZW1lbnQsIGluZGVudD0wKToKICAgICAgICBpZiBub3QgaGFzYXR0cihlbGVtZW50LCAidGFnIik6CiAgICAgICAgICAgIGlmIGhhc2F0dHIoZWxlbWVudCwgImdldHJvb3QiKToKICAgICAgICAgICAgICAgICMgRnVsbCB0cmVlIGNhc2UKICAgICAgICAgICAgICAgIHJ2LmFwcGVuZCgiI2RvY3VtZW50IikKICAgICAgICAgICAgICAgIGlmIGVsZW1lbnQuZG9jaW5mby5pbnRlcm5hbERURDoKICAgICAgICAgICAgICAgICAgICBpZiBub3QgKGVsZW1lbnQuZG9jaW5mby5wdWJsaWNfaWQgb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuZG9jaW5mby5zeXN0ZW1fdXJsKToKICAgICAgICAgICAgICAgICAgICAgICAgZHRkX3N0ciA9ICI8IURPQ1RZUEUgJXM+IiAlIGVsZW1lbnQuZG9jaW5mby5yb290X25hbWUKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBkdGRfc3RyID0gIiIiPCFET0NUWVBFICVzICIlcyIgIiVzIj4iIiIgJSAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmRvY2luZm8ucm9vdF9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5kb2NpbmZvLnB1YmxpY19pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuZG9jaW5mby5zeXN0ZW1fdXJsKQogICAgICAgICAgICAgICAgICAgIHJ2LmFwcGVuZCgifCVzJXMiICUgKCcgJyAqIChpbmRlbnQgKyAyKSwgZHRkX3N0cikpCiAgICAgICAgICAgICAgICBuZXh0X2VsZW1lbnQgPSBlbGVtZW50LmdldHJvb3QoKQogICAgICAgICAgICAgICAgd2hpbGUgbmV4dF9lbGVtZW50LmdldHByZXZpb3VzKCkgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgbmV4dF9lbGVtZW50ID0gbmV4dF9lbGVtZW50LmdldHByZXZpb3VzKCkKICAgICAgICAgICAgICAgIHdoaWxlIG5leHRfZWxlbWVudCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVFbGVtZW50KG5leHRfZWxlbWVudCwgaW5kZW50ICsgMikKICAgICAgICAgICAgICAgICAgICBuZXh0X2VsZW1lbnQgPSBuZXh0X2VsZW1lbnQuZ2V0bmV4dCgpCiAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShlbGVtZW50LCBzdHIpIG9yIGlzaW5zdGFuY2UoZWxlbWVudCwgYnl0ZXMpOgogICAgICAgICAgICAgICAgIyBUZXh0IGluIGEgZnJhZ21lbnQKICAgICAgICAgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKGVsZW1lbnQsIHN0cikgb3Igc3lzLnZlcnNpb25faW5mb1swXSA9PSAyCiAgICAgICAgICAgICAgICBydi5hcHBlbmQoInwlc1wiJXNcIiIgJSAoJyAnICogaW5kZW50LCBlbGVtZW50KSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgRnJhZ21lbnQgY2FzZQogICAgICAgICAgICAgICAgcnYuYXBwZW5kKCIjZG9jdW1lbnQtZnJhZ21lbnQiKQogICAgICAgICAgICAgICAgZm9yIG5leHRfZWxlbWVudCBpbiBlbGVtZW50OgogICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZUVsZW1lbnQobmV4dF9lbGVtZW50LCBpbmRlbnQgKyAyKQogICAgICAgIGVsaWYgZWxlbWVudC50YWcgPT0gY29tbWVudF90eXBlOgogICAgICAgICAgICBydi5hcHBlbmQoInwlczwhLS0gJXMgLS0+IiAlICgnICcgKiBpbmRlbnQsIGVsZW1lbnQudGV4dCkpCiAgICAgICAgICAgIGlmIGhhc2F0dHIoZWxlbWVudCwgInRhaWwiKSBhbmQgZWxlbWVudC50YWlsOgogICAgICAgICAgICAgICAgcnYuYXBwZW5kKCJ8JXNcIiVzXCIiICUgKCcgJyAqIGluZGVudCwgZWxlbWVudC50YWlsKSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShlbGVtZW50LCBldHJlZS5fRWxlbWVudCkKICAgICAgICAgICAgbnNtYXRjaCA9IGV0cmVlX2J1aWxkZXJzLnRhZ19yZWdleHAubWF0Y2goZWxlbWVudC50YWcpCiAgICAgICAgICAgIGlmIG5zbWF0Y2ggaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBucyA9IG5zbWF0Y2guZ3JvdXAoMSkKICAgICAgICAgICAgICAgIHRhZyA9IG5zbWF0Y2guZ3JvdXAoMikKICAgICAgICAgICAgICAgIHByZWZpeCA9IGNvbnN0YW50cy5wcmVmaXhlc1tuc10KICAgICAgICAgICAgICAgIHJ2LmFwcGVuZCgifCVzPCVzICVzPiIgJSAoJyAnICogaW5kZW50LCBwcmVmaXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9zZXRGaWx0ZXIuZnJvbVhtbE5hbWUodGFnKSkpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBydi5hcHBlbmQoInwlczwlcz4iICUgKCcgJyAqIGluZGVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb3NldEZpbHRlci5mcm9tWG1sTmFtZShlbGVtZW50LnRhZykpKQoKICAgICAgICAgICAgaWYgaGFzYXR0cihlbGVtZW50LCAiYXR0cmliIik6CiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzID0gW10KICAgICAgICAgICAgICAgIGZvciBuYW1lLCB2YWx1ZSBpbiBlbGVtZW50LmF0dHJpYi5pdGVtcygpOgogICAgICAgICAgICAgICAgICAgIG5zbWF0Y2ggPSB0YWdfcmVnZXhwLm1hdGNoKG5hbWUpCiAgICAgICAgICAgICAgICAgICAgaWYgbnNtYXRjaCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICAgICAgbnMsIG5hbWUgPSBuc21hdGNoLmdyb3VwcygpCiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBpbmZvc2V0RmlsdGVyLmZyb21YbWxOYW1lKG5hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGNvbnN0YW50cy5wcmVmaXhlc1tuc10KICAgICAgICAgICAgICAgICAgICAgICAgYXR0cl9zdHJpbmcgPSAiJXMgJXMiICUgKHByZWZpeCwgbmFtZSkKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBhdHRyX3N0cmluZyA9IGluZm9zZXRGaWx0ZXIuZnJvbVhtbE5hbWUobmFtZSkKICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLmFwcGVuZCgoYXR0cl9zdHJpbmcsIHZhbHVlKSkKCiAgICAgICAgICAgICAgICBmb3IgbmFtZSwgdmFsdWUgaW4gc29ydGVkKGF0dHJpYnV0ZXMpOgogICAgICAgICAgICAgICAgICAgIHJ2LmFwcGVuZCgnfCVzJXM9IiVzIicgJSAoJyAnICogKGluZGVudCArIDIpLCBuYW1lLCB2YWx1ZSkpCgogICAgICAgICAgICBpZiBlbGVtZW50LnRleHQ6CiAgICAgICAgICAgICAgICBydi5hcHBlbmQoInwlc1wiJXNcIiIgJSAoJyAnICogKGluZGVudCArIDIpLCBlbGVtZW50LnRleHQpKQogICAgICAgICAgICBpbmRlbnQgKz0gMgogICAgICAgICAgICBmb3IgY2hpbGQgaW4gZWxlbWVudDoKICAgICAgICAgICAgICAgIHNlcmlhbGl6ZUVsZW1lbnQoY2hpbGQsIGluZGVudCkKICAgICAgICAgICAgaWYgaGFzYXR0cihlbGVtZW50LCAidGFpbCIpIGFuZCBlbGVtZW50LnRhaWw6CiAgICAgICAgICAgICAgICBydi5hcHBlbmQoInwlc1wiJXNcIiIgJSAoJyAnICogKGluZGVudCAtIDIpLCBlbGVtZW50LnRhaWwpKQogICAgc2VyaWFsaXplRWxlbWVudChlbGVtZW50LCAwKQoKICAgIHJldHVybiAiXG4iLmpvaW4ocnYpCgoKZGVmIHRvc3RyaW5nKGVsZW1lbnQpOgogICAgIiIiU2VyaWFsaXplIGFuIGVsZW1lbnQgYW5kIGl0cyBjaGlsZCBub2RlcyB0byBhIHN0cmluZyIiIgogICAgcnYgPSBbXQoKICAgIGRlZiBzZXJpYWxpemVFbGVtZW50KGVsZW1lbnQpOgogICAgICAgIGlmIG5vdCBoYXNhdHRyKGVsZW1lbnQsICJ0YWciKToKICAgICAgICAgICAgaWYgZWxlbWVudC5kb2NpbmZvLmludGVybmFsRFREOgogICAgICAgICAgICAgICAgaWYgZWxlbWVudC5kb2NpbmZvLmRvY3R5cGU6CiAgICAgICAgICAgICAgICAgICAgZHRkX3N0ciA9IGVsZW1lbnQuZG9jaW5mby5kb2N0eXBlCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGR0ZF9zdHIgPSAiPCFET0NUWVBFICVzPiIgJSBlbGVtZW50LmRvY2luZm8ucm9vdF9uYW1lCiAgICAgICAgICAgICAgICBydi5hcHBlbmQoZHRkX3N0cikKICAgICAgICAgICAgc2VyaWFsaXplRWxlbWVudChlbGVtZW50LmdldHJvb3QoKSkKCiAgICAgICAgZWxpZiBlbGVtZW50LnRhZyA9PSBjb21tZW50X3R5cGU6CiAgICAgICAgICAgIHJ2LmFwcGVuZCgiPCEtLSVzLS0+IiAlIChlbGVtZW50LnRleHQsKSkKCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBUaGlzIGlzIGFzc3VtZWQgdG8gYmUgYW4gb3JkaW5hcnkgZWxlbWVudAogICAgICAgICAgICBpZiBub3QgZWxlbWVudC5hdHRyaWI6CiAgICAgICAgICAgICAgICBydi5hcHBlbmQoIjwlcz4iICUgKGVsZW1lbnQudGFnLCkpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBhdHRyID0gIiAiLmpvaW4oWyIlcz1cIiVzXCIiICUgKG5hbWUsIHZhbHVlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbmFtZSwgdmFsdWUgaW4gZWxlbWVudC5hdHRyaWIuaXRlbXMoKV0pCiAgICAgICAgICAgICAgICBydi5hcHBlbmQoIjwlcyAlcz4iICUgKGVsZW1lbnQudGFnLCBhdHRyKSkKICAgICAgICAgICAgaWYgZWxlbWVudC50ZXh0OgogICAgICAgICAgICAgICAgcnYuYXBwZW5kKGVsZW1lbnQudGV4dCkKCiAgICAgICAgICAgIGZvciBjaGlsZCBpbiBlbGVtZW50OgogICAgICAgICAgICAgICAgc2VyaWFsaXplRWxlbWVudChjaGlsZCkKCiAgICAgICAgICAgIHJ2LmFwcGVuZCgiPC8lcz4iICUgKGVsZW1lbnQudGFnLCkpCgogICAgICAgIGlmIGhhc2F0dHIoZWxlbWVudCwgInRhaWwiKSBhbmQgZWxlbWVudC50YWlsOgogICAgICAgICAgICBydi5hcHBlbmQoZWxlbWVudC50YWlsKQoKICAgIHNlcmlhbGl6ZUVsZW1lbnQoZWxlbWVudCkKCiAgICByZXR1cm4gIiIuam9pbihydikKCgpjbGFzcyBUcmVlQnVpbGRlcihiYXNlLlRyZWVCdWlsZGVyKToKICAgIGRvY3VtZW50Q2xhc3MgPSBEb2N1bWVudAogICAgZG9jdHlwZUNsYXNzID0gRG9jdW1lbnRUeXBlCiAgICBlbGVtZW50Q2xhc3MgPSBOb25lCiAgICBjb21tZW50Q2xhc3MgPSBOb25lCiAgICBmcmFnbWVudENsYXNzID0gRG9jdW1lbnQKICAgIGltcGxlbWVudGF0aW9uID0gZXRyZWUKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZXNwYWNlSFRNTEVsZW1lbnRzLCBmdWxsVHJlZT1GYWxzZSk6CiAgICAgICAgYnVpbGRlciA9IGV0cmVlX2J1aWxkZXJzLmdldEVUcmVlTW9kdWxlKGV0cmVlLCBmdWxsVHJlZT1mdWxsVHJlZSkKICAgICAgICBpbmZvc2V0RmlsdGVyID0gc2VsZi5pbmZvc2V0RmlsdGVyID0gX2loYXRleG1sLkluZm9zZXRGaWx0ZXIocHJldmVudERvdWJsZURhc2hDb21tZW50cz1UcnVlKQogICAgICAgIHNlbGYubmFtZXNwYWNlSFRNTEVsZW1lbnRzID0gbmFtZXNwYWNlSFRNTEVsZW1lbnRzCgogICAgICAgIGNsYXNzIEF0dHJpYnV0ZXMoZGljdCk6CiAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBlbGVtZW50LCB2YWx1ZT1Ob25lKToKICAgICAgICAgICAgICAgIGlmIHZhbHVlIGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB7fQogICAgICAgICAgICAgICAgc2VsZi5fZWxlbWVudCA9IGVsZW1lbnQKICAgICAgICAgICAgICAgIGRpY3QuX19pbml0X18oc2VsZiwgdmFsdWUpICAjIHB5bGludDpkaXNhYmxlPW5vbi1wYXJlbnQtaW5pdC1jYWxsZWQKICAgICAgICAgICAgICAgIGZvciBrZXksIHZhbHVlIGluIHNlbGYuaXRlbXMoKToKICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGtleSwgdHVwbGUpOgogICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gInslc30lcyIgJSAoa2V5WzJdLCBpbmZvc2V0RmlsdGVyLmNvZXJjZUF0dHJpYnV0ZShrZXlbMV0pKQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBpbmZvc2V0RmlsdGVyLmNvZXJjZUF0dHJpYnV0ZShrZXkpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5fZWxlbWVudC5fZWxlbWVudC5hdHRyaWJbbmFtZV0gPSB2YWx1ZQoKICAgICAgICAgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGtleSwgdmFsdWUpOgogICAgICAgICAgICAgICAgZGljdC5fX3NldGl0ZW1fXyhzZWxmLCBrZXksIHZhbHVlKQogICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShrZXksIHR1cGxlKToKICAgICAgICAgICAgICAgICAgICBuYW1lID0gInslc30lcyIgJSAoa2V5WzJdLCBpbmZvc2V0RmlsdGVyLmNvZXJjZUF0dHJpYnV0ZShrZXlbMV0pKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBuYW1lID0gaW5mb3NldEZpbHRlci5jb2VyY2VBdHRyaWJ1dGUoa2V5KQogICAgICAgICAgICAgICAgc2VsZi5fZWxlbWVudC5fZWxlbWVudC5hdHRyaWJbbmFtZV0gPSB2YWx1ZQoKICAgICAgICBjbGFzcyBFbGVtZW50KGJ1aWxkZXIuRWxlbWVudCk6CiAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBuYW1lc3BhY2UpOgogICAgICAgICAgICAgICAgbmFtZSA9IGluZm9zZXRGaWx0ZXIuY29lcmNlRWxlbWVudChuYW1lKQogICAgICAgICAgICAgICAgYnVpbGRlci5FbGVtZW50Ll9faW5pdF9fKHNlbGYsIG5hbWUsIG5hbWVzcGFjZT1uYW1lc3BhY2UpCiAgICAgICAgICAgICAgICBzZWxmLl9hdHRyaWJ1dGVzID0gQXR0cmlidXRlcyhzZWxmKQoKICAgICAgICAgICAgZGVmIF9zZXROYW1lKHNlbGYsIG5hbWUpOgogICAgICAgICAgICAgICAgc2VsZi5fbmFtZSA9IGluZm9zZXRGaWx0ZXIuY29lcmNlRWxlbWVudChuYW1lKQogICAgICAgICAgICAgICAgc2VsZi5fZWxlbWVudC50YWcgPSBzZWxmLl9nZXRFVHJlZVRhZygKICAgICAgICAgICAgICAgICAgICBzZWxmLl9uYW1lLCBzZWxmLl9uYW1lc3BhY2UpCgogICAgICAgICAgICBkZWYgX2dldE5hbWUoc2VsZik6CiAgICAgICAgICAgICAgICByZXR1cm4gaW5mb3NldEZpbHRlci5mcm9tWG1sTmFtZShzZWxmLl9uYW1lKQoKICAgICAgICAgICAgbmFtZSA9IHByb3BlcnR5KF9nZXROYW1lLCBfc2V0TmFtZSkKCiAgICAgICAgICAgIGRlZiBfZ2V0QXR0cmlidXRlcyhzZWxmKToKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9hdHRyaWJ1dGVzCgogICAgICAgICAgICBkZWYgX3NldEF0dHJpYnV0ZXMoc2VsZiwgYXR0cmlidXRlcyk6CiAgICAgICAgICAgICAgICBzZWxmLl9hdHRyaWJ1dGVzID0gQXR0cmlidXRlcyhzZWxmLCBhdHRyaWJ1dGVzKQoKICAgICAgICAgICAgYXR0cmlidXRlcyA9IHByb3BlcnR5KF9nZXRBdHRyaWJ1dGVzLCBfc2V0QXR0cmlidXRlcykKCiAgICAgICAgICAgIGRlZiBpbnNlcnRUZXh0KHNlbGYsIGRhdGEsIGluc2VydEJlZm9yZT1Ob25lKToKICAgICAgICAgICAgICAgIGRhdGEgPSBpbmZvc2V0RmlsdGVyLmNvZXJjZUNoYXJhY3RlcnMoZGF0YSkKICAgICAgICAgICAgICAgIGJ1aWxkZXIuRWxlbWVudC5pbnNlcnRUZXh0KHNlbGYsIGRhdGEsIGluc2VydEJlZm9yZSkKCiAgICAgICAgICAgIGRlZiBhcHBlbmRDaGlsZChzZWxmLCBjaGlsZCk6CiAgICAgICAgICAgICAgICBidWlsZGVyLkVsZW1lbnQuYXBwZW5kQ2hpbGQoc2VsZiwgY2hpbGQpCgogICAgICAgIGNsYXNzIENvbW1lbnQoYnVpbGRlci5Db21tZW50KToKICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGRhdGEpOgogICAgICAgICAgICAgICAgZGF0YSA9IGluZm9zZXRGaWx0ZXIuY29lcmNlQ29tbWVudChkYXRhKQogICAgICAgICAgICAgICAgYnVpbGRlci5Db21tZW50Ll9faW5pdF9fKHNlbGYsIGRhdGEpCgogICAgICAgICAgICBkZWYgX3NldERhdGEoc2VsZiwgZGF0YSk6CiAgICAgICAgICAgICAgICBkYXRhID0gaW5mb3NldEZpbHRlci5jb2VyY2VDb21tZW50KGRhdGEpCiAgICAgICAgICAgICAgICBzZWxmLl9lbGVtZW50LnRleHQgPSBkYXRhCgogICAgICAgICAgICBkZWYgX2dldERhdGEoc2VsZik6CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fZWxlbWVudC50ZXh0CgogICAgICAgICAgICBkYXRhID0gcHJvcGVydHkoX2dldERhdGEsIF9zZXREYXRhKQoKICAgICAgICBzZWxmLmVsZW1lbnRDbGFzcyA9IEVsZW1lbnQKICAgICAgICBzZWxmLmNvbW1lbnRDbGFzcyA9IENvbW1lbnQKICAgICAgICAjIHNlbGYuZnJhZ21lbnRDbGFzcyA9IGJ1aWxkZXIuRG9jdW1lbnRGcmFnbWVudAogICAgICAgIGJhc2UuVHJlZUJ1aWxkZXIuX19pbml0X18oc2VsZiwgbmFtZXNwYWNlSFRNTEVsZW1lbnRzKQoKICAgIGRlZiByZXNldChzZWxmKToKICAgICAgICBiYXNlLlRyZWVCdWlsZGVyLnJlc2V0KHNlbGYpCiAgICAgICAgc2VsZi5pbnNlcnRDb21tZW50ID0gc2VsZi5pbnNlcnRDb21tZW50SW5pdGlhbAogICAgICAgIHNlbGYuaW5pdGlhbF9jb21tZW50cyA9IFtdCiAgICAgICAgc2VsZi5kb2N0eXBlID0gTm9uZQoKICAgIGRlZiB0ZXN0U2VyaWFsaXplcihzZWxmLCBlbGVtZW50KToKICAgICAgICByZXR1cm4gdGVzdFNlcmlhbGl6ZXIoZWxlbWVudCkKCiAgICBkZWYgZ2V0RG9jdW1lbnQoc2VsZik6CiAgICAgICAgaWYgZnVsbFRyZWU6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmRvY3VtZW50Ll9lbGVtZW50VHJlZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmRvY3VtZW50Ll9lbGVtZW50VHJlZS5nZXRyb290KCkKCiAgICBkZWYgZ2V0RnJhZ21lbnQoc2VsZik6CiAgICAgICAgZnJhZ21lbnQgPSBbXQogICAgICAgIGVsZW1lbnQgPSBzZWxmLm9wZW5FbGVtZW50c1swXS5fZWxlbWVudAogICAgICAgIGlmIGVsZW1lbnQudGV4dDoKICAgICAgICAgICAgZnJhZ21lbnQuYXBwZW5kKGVsZW1lbnQudGV4dCkKICAgICAgICBmcmFnbWVudC5leHRlbmQobGlzdChlbGVtZW50KSkKICAgICAgICBpZiBlbGVtZW50LnRhaWw6CiAgICAgICAgICAgIGZyYWdtZW50LmFwcGVuZChlbGVtZW50LnRhaWwpCiAgICAgICAgcmV0dXJuIGZyYWdtZW50CgogICAgZGVmIGluc2VydERvY3R5cGUoc2VsZiwgdG9rZW4pOgogICAgICAgIG5hbWUgPSB0b2tlblsibmFtZSJdCiAgICAgICAgcHVibGljSWQgPSB0b2tlblsicHVibGljSWQiXQogICAgICAgIHN5c3RlbUlkID0gdG9rZW5bInN5c3RlbUlkIl0KCiAgICAgICAgaWYgbm90IG5hbWU6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oImx4bWwgY2Fubm90IHJlcHJlc2VudCBlbXB0eSBkb2N0eXBlIiwgRGF0YUxvc3NXYXJuaW5nKQogICAgICAgICAgICBzZWxmLmRvY3R5cGUgPSBOb25lCiAgICAgICAgZWxzZToKICAgICAgICAgICAgY29lcmNlZE5hbWUgPSBzZWxmLmluZm9zZXRGaWx0ZXIuY29lcmNlRWxlbWVudChuYW1lKQogICAgICAgICAgICBpZiBjb2VyY2VkTmFtZSAhPSBuYW1lOgogICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybigibHhtbCBjYW5ub3QgcmVwcmVzZW50IG5vbi14bWwgZG9jdHlwZSIsIERhdGFMb3NzV2FybmluZykKCiAgICAgICAgICAgIGRvY3R5cGUgPSBzZWxmLmRvY3R5cGVDbGFzcyhjb2VyY2VkTmFtZSwgcHVibGljSWQsIHN5c3RlbUlkKQogICAgICAgICAgICBzZWxmLmRvY3R5cGUgPSBkb2N0eXBlCgogICAgZGVmIGluc2VydENvbW1lbnRJbml0aWFsKHNlbGYsIGRhdGEsIHBhcmVudD1Ob25lKToKICAgICAgICBhc3NlcnQgcGFyZW50IGlzIE5vbmUgb3IgcGFyZW50IGlzIHNlbGYuZG9jdW1lbnQKICAgICAgICBhc3NlcnQgc2VsZi5kb2N1bWVudC5fZWxlbWVudFRyZWUgaXMgTm9uZQogICAgICAgIHNlbGYuaW5pdGlhbF9jb21tZW50cy5hcHBlbmQoZGF0YSkKCiAgICBkZWYgaW5zZXJ0Q29tbWVudE1haW4oc2VsZiwgZGF0YSwgcGFyZW50PU5vbmUpOgogICAgICAgIGlmIChwYXJlbnQgPT0gc2VsZi5kb2N1bWVudCBhbmQKICAgICAgICAgICAgICAgIHNlbGYuZG9jdW1lbnQuX2VsZW1lbnRUcmVlLmdldHJvb3QoKVstMV0udGFnID09IGNvbW1lbnRfdHlwZSk6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oImx4bWwgY2Fubm90IHJlcHJlc2VudCBhZGphY2VudCBjb21tZW50cyBiZXlvbmQgdGhlIHJvb3QgZWxlbWVudHMiLCBEYXRhTG9zc1dhcm5pbmcpCiAgICAgICAgc3VwZXIoVHJlZUJ1aWxkZXIsIHNlbGYpLmluc2VydENvbW1lbnQoZGF0YSwgcGFyZW50KQoKICAgIGRlZiBpbnNlcnRSb290KHNlbGYsIHRva2VuKToKICAgICAgICAiIiJDcmVhdGUgdGhlIGRvY3VtZW50IHJvb3QiIiIKICAgICAgICAjIEJlY2F1c2Ugb2YgdGhlIHdheSBsaWJ4bWwyIHdvcmtzLCBpdCBkb2Vzbid0IHNlZW0gdG8gYmUgcG9zc2libGUgdG8KICAgICAgICAjIGFsdGVyIGluZm9ybWF0aW9uIGxpa2UgdGhlIGRvY3R5cGUgYWZ0ZXIgdGhlIHRyZWUgaGFzIGJlZW4gcGFyc2VkLgogICAgICAgICMgVGhlcmVmb3JlIHdlIG5lZWQgdG8gdXNlIHRoZSBidWlsdC1pbiBwYXJzZXIgdG8gY3JlYXRlIG91ciBpbml0aWFsCiAgICAgICAgIyB0cmVlLCBhZnRlciB3aGljaCB3ZSBjYW4gYWRkIGVsZW1lbnRzIGxpa2Ugbm9ybWFsCiAgICAgICAgZG9jU3RyID0gIiIKICAgICAgICBpZiBzZWxmLmRvY3R5cGU6CiAgICAgICAgICAgIGFzc2VydCBzZWxmLmRvY3R5cGUubmFtZQogICAgICAgICAgICBkb2NTdHIgKz0gIjwhRE9DVFlQRSAlcyIgJSBzZWxmLmRvY3R5cGUubmFtZQogICAgICAgICAgICBpZiAoc2VsZi5kb2N0eXBlLnB1YmxpY0lkIGlzIG5vdCBOb25lIG9yCiAgICAgICAgICAgICAgICAgICAgc2VsZi5kb2N0eXBlLnN5c3RlbUlkIGlzIG5vdCBOb25lKToKICAgICAgICAgICAgICAgIGRvY1N0ciArPSAoJyBQVUJMSUMgIiVzIiAnICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYuaW5mb3NldEZpbHRlci5jb2VyY2VQdWJpZChzZWxmLmRvY3R5cGUucHVibGljSWQgb3IgIiIpKSkKICAgICAgICAgICAgICAgIGlmIHNlbGYuZG9jdHlwZS5zeXN0ZW1JZDoKICAgICAgICAgICAgICAgICAgICBzeXNpZCA9IHNlbGYuZG9jdHlwZS5zeXN0ZW1JZAogICAgICAgICAgICAgICAgICAgIGlmIHN5c2lkLmZpbmQoIiciKSA+PSAwIGFuZCBzeXNpZC5maW5kKCciJykgPj0gMDoKICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybigiRE9DVFlQRSBzeXN0ZW0gY2Fubm90IGNvbnRhaW4gc2luZ2xlIGFuZCBkb3VibGUgcXVvdGVzIiwgRGF0YUxvc3NXYXJuaW5nKQogICAgICAgICAgICAgICAgICAgICAgICBzeXNpZCA9IHN5c2lkLnJlcGxhY2UoIiciLCAnVTAwMDI3JykKICAgICAgICAgICAgICAgICAgICBpZiBzeXNpZC5maW5kKCInIikgPj0gMDoKICAgICAgICAgICAgICAgICAgICAgICAgZG9jU3RyICs9ICciJXMiJyAlIHN5c2lkCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgZG9jU3RyICs9ICInJXMnIiAlIHN5c2lkCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGRvY1N0ciArPSAiJyciCiAgICAgICAgICAgIGRvY1N0ciArPSAiPiIKICAgICAgICAgICAgaWYgc2VsZi5kb2N0eXBlLm5hbWUgIT0gdG9rZW5bIm5hbWUiXToKICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oImx4bWwgY2Fubm90IHJlcHJlc2VudCBkb2N0eXBlIHdpdGggYSBkaWZmZXJlbnQgbmFtZSB0byB0aGUgcm9vdCBlbGVtZW50IiwgRGF0YUxvc3NXYXJuaW5nKQogICAgICAgIGRvY1N0ciArPSAiPFRISVNfU0hPVUxEX05FVkVSX0FQUEVBUl9QVUJMSUNMWS8+IgogICAgICAgIHJvb3QgPSBldHJlZS5mcm9tc3RyaW5nKGRvY1N0cikKCiAgICAgICAgIyBBcHBlbmQgdGhlIGluaXRpYWwgY29tbWVudHM6CiAgICAgICAgZm9yIGNvbW1lbnRfdG9rZW4gaW4gc2VsZi5pbml0aWFsX2NvbW1lbnRzOgogICAgICAgICAgICBjb21tZW50ID0gc2VsZi5jb21tZW50Q2xhc3MoY29tbWVudF90b2tlblsiZGF0YSJdKQogICAgICAgICAgICByb290LmFkZHByZXZpb3VzKGNvbW1lbnQuX2VsZW1lbnQpCgogICAgICAgICMgQ3JlYXRlIHRoZSByb290IGRvY3VtZW50IGFuZCBhZGQgdGhlIEVsZW1lbnRUcmVlIHRvIGl0CiAgICAgICAgc2VsZi5kb2N1bWVudCA9IHNlbGYuZG9jdW1lbnRDbGFzcygpCiAgICAgICAgc2VsZi5kb2N1bWVudC5fZWxlbWVudFRyZWUgPSByb290LmdldHJvb3R0cmVlKCkKCiAgICAgICAgIyBHaXZlIHRoZSByb290IGVsZW1lbnQgdGhlIHJpZ2h0IG5hbWUKICAgICAgICBuYW1lID0gdG9rZW5bIm5hbWUiXQogICAgICAgIG5hbWVzcGFjZSA9IHRva2VuLmdldCgibmFtZXNwYWNlIiwgc2VsZi5kZWZhdWx0TmFtZXNwYWNlKQogICAgICAgIGlmIG5hbWVzcGFjZSBpcyBOb25lOgogICAgICAgICAgICBldHJlZV90YWcgPSBuYW1lCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZXRyZWVfdGFnID0gInslc30lcyIgJSAobmFtZXNwYWNlLCBuYW1lKQogICAgICAgIHJvb3QudGFnID0gZXRyZWVfdGFnCgogICAgICAgICMgQWRkIHRoZSByb290IGVsZW1lbnQgdG8gdGhlIGludGVybmFsIGNoaWxkL29wZW4gZGF0YSBzdHJ1Y3R1cmVzCiAgICAgICAgcm9vdF9lbGVtZW50ID0gc2VsZi5lbGVtZW50Q2xhc3MobmFtZSwgbmFtZXNwYWNlKQogICAgICAgIHJvb3RfZWxlbWVudC5fZWxlbWVudCA9IHJvb3QKICAgICAgICBzZWxmLmRvY3VtZW50Ll9jaGlsZE5vZGVzLmFwcGVuZChyb290X2VsZW1lbnQpCiAgICAgICAgc2VsZi5vcGVuRWxlbWVudHMuYXBwZW5kKHJvb3RfZWxlbWVudCkKCiAgICAgICAgIyBSZXNldCB0byB0aGUgZGVmYXVsdCBpbnNlcnQgY29tbWVudCBmdW5jdGlvbgogICAgICAgIHNlbGYuaW5zZXJ0Q29tbWVudCA9IHNlbGYuaW5zZXJ0Q29tbWVudE1haW4KUEsDBBQAAAAAAAAAIQBzRCGWqBUAAKgVAABJAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi90cmVld2Fsa2Vycy9fX2luaXRfXy5weSIiIkEgY29sbGVjdGlvbiBvZiBtb2R1bGVzIGZvciBpdGVyYXRpbmcgdGhyb3VnaCBkaWZmZXJlbnQga2luZHMgb2YKdHJlZSwgZ2VuZXJhdGluZyB0b2tlbnMgaWRlbnRpY2FsIHRvIHRob3NlIHByb2R1Y2VkIGJ5IHRoZSB0b2tlbml6ZXIKbW9kdWxlLgoKVG8gY3JlYXRlIGEgdHJlZSB3YWxrZXIgZm9yIGEgbmV3IHR5cGUgb2YgdHJlZSwgeW91IG5lZWQgdG8gZG8KaW1wbGVtZW50IGEgdHJlZSB3YWxrZXIgb2JqZWN0IChjYWxsZWQgVHJlZVdhbGtlciBieSBjb252ZW50aW9uKSB0aGF0CmltcGxlbWVudHMgYSAnc2VyaWFsaXplJyBtZXRob2QgdGFraW5nIGEgdHJlZSBhcyBzb2xlIGFyZ3VtZW50IGFuZApyZXR1cm5pbmcgYW4gaXRlcmF0b3IgZ2VuZXJhdGluZyB0b2tlbnMuCiIiIgoKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCB1bmljb2RlX2xpdGVyYWxzCgpmcm9tIC4uIGltcG9ydCBjb25zdGFudHMKZnJvbSAuLl91dGlscyBpbXBvcnQgZGVmYXVsdF9ldHJlZQoKX19hbGxfXyA9IFsiZ2V0VHJlZVdhbGtlciIsICJwcHJpbnQiLCAiZG9tIiwgImV0cmVlIiwgImdlbnNoaSIsICJldHJlZV9seG1sIl0KCnRyZWVXYWxrZXJDYWNoZSA9IHt9CgoKZGVmIGdldFRyZWVXYWxrZXIodHJlZVR5cGUsIGltcGxlbWVudGF0aW9uPU5vbmUsICoqa3dhcmdzKToKICAgICIiIkdldCBhIFRyZWVXYWxrZXIgY2xhc3MgZm9yIHZhcmlvdXMgdHlwZXMgb2YgdHJlZSB3aXRoIGJ1aWx0LWluIHN1cHBvcnQKCiAgICBBcmdzOgogICAgICAgIHRyZWVUeXBlIChzdHIpOiB0aGUgbmFtZSBvZiB0aGUgdHJlZSB0eXBlIHJlcXVpcmVkIChjYXNlLWluc2Vuc2l0aXZlKS4KICAgICAgICAgICAgU3VwcG9ydGVkIHZhbHVlcyBhcmU6CgogICAgICAgICAgICAtICJkb20iOiBUaGUgeG1sLmRvbS5taW5pZG9tIERPTSBpbXBsZW1lbnRhdGlvbgogICAgICAgICAgICAtICJldHJlZSI6IEEgZ2VuZXJpYyB3YWxrZXIgZm9yIHRyZWUgaW1wbGVtZW50YXRpb25zIGV4cG9zaW5nIGFuCiAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudHRyZWUtbGlrZSBpbnRlcmZhY2UgKGtub3duIHRvIHdvcmsgd2l0aAogICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnRUcmVlLCBjRWxlbWVudFRyZWUgYW5kIGx4bWwuZXRyZWUpLgogICAgICAgICAgICAtICJseG1sIjogT3B0aW1pemVkIHdhbGtlciBmb3IgbHhtbC5ldHJlZQogICAgICAgICAgICAtICJnZW5zaGkiOiBhIEdlbnNoaSBzdHJlYW0KCiAgICAgICAgSW1wbGVtZW50YXRpb246IEEgbW9kdWxlIGltcGxlbWVudGluZyB0aGUgdHJlZSB0eXBlIGUuZy4KICAgICAgICAgICAgeG1sLmV0cmVlLkVsZW1lbnRUcmVlIG9yIGNFbGVtZW50VHJlZSAoQ3VycmVudGx5IGFwcGxpZXMgdG8gdGhlCiAgICAgICAgICAgICJldHJlZSIgdHJlZSB0eXBlIG9ubHkpLgogICAgIiIiCgogICAgdHJlZVR5cGUgPSB0cmVlVHlwZS5sb3dlcigpCiAgICBpZiB0cmVlVHlwZSBub3QgaW4gdHJlZVdhbGtlckNhY2hlOgogICAgICAgIGlmIHRyZWVUeXBlID09ICJkb20iOgogICAgICAgICAgICBmcm9tIC4gaW1wb3J0IGRvbQogICAgICAgICAgICB0cmVlV2Fsa2VyQ2FjaGVbdHJlZVR5cGVdID0gZG9tLlRyZWVXYWxrZXIKICAgICAgICBlbGlmIHRyZWVUeXBlID09ICJnZW5zaGkiOgogICAgICAgICAgICBmcm9tIC4gaW1wb3J0IGdlbnNoaQogICAgICAgICAgICB0cmVlV2Fsa2VyQ2FjaGVbdHJlZVR5cGVdID0gZ2Vuc2hpLlRyZWVXYWxrZXIKICAgICAgICBlbGlmIHRyZWVUeXBlID09ICJseG1sIjoKICAgICAgICAgICAgZnJvbSAuIGltcG9ydCBldHJlZV9seG1sCiAgICAgICAgICAgIHRyZWVXYWxrZXJDYWNoZVt0cmVlVHlwZV0gPSBldHJlZV9seG1sLlRyZWVXYWxrZXIKICAgICAgICBlbGlmIHRyZWVUeXBlID09ICJldHJlZSI6CiAgICAgICAgICAgIGZyb20gLiBpbXBvcnQgZXRyZWUKICAgICAgICAgICAgaWYgaW1wbGVtZW50YXRpb24gaXMgTm9uZToKICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uID0gZGVmYXVsdF9ldHJlZQogICAgICAgICAgICAjIFhYWDogTkVWRVIgY2FjaGUgaGVyZSwgY2FjaGluZyBpcyBkb25lIGluIHRoZSBldHJlZSBzdWJtb2R1bGUKICAgICAgICAgICAgcmV0dXJuIGV0cmVlLmdldEVUcmVlTW9kdWxlKGltcGxlbWVudGF0aW9uLCAqKmt3YXJncykuVHJlZVdhbGtlcgogICAgcmV0dXJuIHRyZWVXYWxrZXJDYWNoZS5nZXQodHJlZVR5cGUpCgoKZGVmIGNvbmNhdGVuYXRlQ2hhcmFjdGVyVG9rZW5zKHRva2Vucyk6CiAgICBwZW5kaW5nQ2hhcmFjdGVycyA9IFtdCiAgICBmb3IgdG9rZW4gaW4gdG9rZW5zOgogICAgICAgIHR5cGUgPSB0b2tlblsidHlwZSJdCiAgICAgICAgaWYgdHlwZSBpbiAoIkNoYXJhY3RlcnMiLCAiU3BhY2VDaGFyYWN0ZXJzIik6CiAgICAgICAgICAgIHBlbmRpbmdDaGFyYWN0ZXJzLmFwcGVuZCh0b2tlblsiZGF0YSJdKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlmIHBlbmRpbmdDaGFyYWN0ZXJzOgogICAgICAgICAgICAgICAgeWllbGQgeyJ0eXBlIjogIkNoYXJhY3RlcnMiLCAiZGF0YSI6ICIiLmpvaW4ocGVuZGluZ0NoYXJhY3RlcnMpfQogICAgICAgICAgICAgICAgcGVuZGluZ0NoYXJhY3RlcnMgPSBbXQogICAgICAgICAgICB5aWVsZCB0b2tlbgogICAgaWYgcGVuZGluZ0NoYXJhY3RlcnM6CiAgICAgICAgeWllbGQgeyJ0eXBlIjogIkNoYXJhY3RlcnMiLCAiZGF0YSI6ICIiLmpvaW4ocGVuZGluZ0NoYXJhY3RlcnMpfQoKCmRlZiBwcHJpbnQod2Fsa2VyKToKICAgICIiIlByZXR0eSBwcmludGVyIGZvciB0cmVlIHdhbGtlcnMiIiIKICAgIG91dHB1dCA9IFtdCiAgICBpbmRlbnQgPSAwCiAgICBmb3IgdG9rZW4gaW4gY29uY2F0ZW5hdGVDaGFyYWN0ZXJUb2tlbnMod2Fsa2VyKToKICAgICAgICB0eXBlID0gdG9rZW5bInR5cGUiXQogICAgICAgIGlmIHR5cGUgaW4gKCJTdGFydFRhZyIsICJFbXB0eVRhZyIpOgogICAgICAgICAgICAjIHRhZyBuYW1lCiAgICAgICAgICAgIGlmIHRva2VuWyJuYW1lc3BhY2UiXSBhbmQgdG9rZW5bIm5hbWVzcGFjZSJdICE9IGNvbnN0YW50cy5uYW1lc3BhY2VzWyJodG1sIl06CiAgICAgICAgICAgICAgICBpZiB0b2tlblsibmFtZXNwYWNlIl0gaW4gY29uc3RhbnRzLnByZWZpeGVzOgogICAgICAgICAgICAgICAgICAgIG5zID0gY29uc3RhbnRzLnByZWZpeGVzW3Rva2VuWyJuYW1lc3BhY2UiXV0KICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgbnMgPSB0b2tlblsibmFtZXNwYWNlIl0KICAgICAgICAgICAgICAgIG5hbWUgPSAiJXMgJXMiICUgKG5zLCB0b2tlblsibmFtZSJdKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgbmFtZSA9IHRva2VuWyJuYW1lIl0KICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiJXM8JXM+IiAlICgiICIgKiBpbmRlbnQsIG5hbWUpKQogICAgICAgICAgICBpbmRlbnQgKz0gMgogICAgICAgICAgICAjIGF0dHJpYnV0ZXMgKHNvcnRlZCBmb3IgY29uc2lzdGVudCBvcmRlcmluZykKICAgICAgICAgICAgYXR0cnMgPSB0b2tlblsiZGF0YSJdCiAgICAgICAgICAgIGZvciAobmFtZXNwYWNlLCBsb2NhbG5hbWUpLCB2YWx1ZSBpbiBzb3J0ZWQoYXR0cnMuaXRlbXMoKSk6CiAgICAgICAgICAgICAgICBpZiBuYW1lc3BhY2U6CiAgICAgICAgICAgICAgICAgICAgaWYgbmFtZXNwYWNlIGluIGNvbnN0YW50cy5wcmVmaXhlczoKICAgICAgICAgICAgICAgICAgICAgICAgbnMgPSBjb25zdGFudHMucHJlZml4ZXNbbmFtZXNwYWNlXQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIG5zID0gbmFtZXNwYWNlCiAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICIlcyAlcyIgJSAobnMsIGxvY2FsbmFtZSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGxvY2FsbmFtZQogICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiJXMlcz1cIiVzXCIiICUgKCIgIiAqIGluZGVudCwgbmFtZSwgdmFsdWUpKQogICAgICAgICAgICAjIHNlbGYtY2xvc2luZwogICAgICAgICAgICBpZiB0eXBlID09ICJFbXB0eVRhZyI6CiAgICAgICAgICAgICAgICBpbmRlbnQgLT0gMgoKICAgICAgICBlbGlmIHR5cGUgPT0gIkVuZFRhZyI6CiAgICAgICAgICAgIGluZGVudCAtPSAyCgogICAgICAgIGVsaWYgdHlwZSA9PSAiQ29tbWVudCI6CiAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIiVzPCEtLSAlcyAtLT4iICUgKCIgIiAqIGluZGVudCwgdG9rZW5bImRhdGEiXSkpCgogICAgICAgIGVsaWYgdHlwZSA9PSAiRG9jdHlwZSI6CiAgICAgICAgICAgIGlmIHRva2VuWyJuYW1lIl06CiAgICAgICAgICAgICAgICBpZiB0b2tlblsicHVibGljSWQiXToKICAgICAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCIiIiVzPCFET0NUWVBFICVzICIlcyIgIiVzIj4iIiIgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCIgIiAqIGluZGVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlblsibmFtZSJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuWyJwdWJsaWNJZCJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuWyJzeXN0ZW1JZCJdIGlmIHRva2VuWyJzeXN0ZW1JZCJdIGVsc2UgIiIpKQogICAgICAgICAgICAgICAgZWxpZiB0b2tlblsic3lzdGVtSWQiXToKICAgICAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCIiIiVzPCFET0NUWVBFICVzICIiICIlcyI+IiIiICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiICIgKiBpbmRlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5bIm5hbWUiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlblsic3lzdGVtSWQiXSkpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIiVzPCFET0NUWVBFICVzPiIgJSAoIiAiICogaW5kZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5bIm5hbWUiXSkpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCIlczwhRE9DVFlQRSA+IiAlICgiICIgKiBpbmRlbnQsKSkKCiAgICAgICAgZWxpZiB0eXBlID09ICJDaGFyYWN0ZXJzIjoKICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiJXNcIiVzXCIiICUgKCIgIiAqIGluZGVudCwgdG9rZW5bImRhdGEiXSkpCgogICAgICAgIGVsaWYgdHlwZSA9PSAiU3BhY2VDaGFyYWN0ZXJzIjoKICAgICAgICAgICAgYXNzZXJ0IEZhbHNlLCAiY29uY2F0ZW5hdGVDaGFyYWN0ZXJUb2tlbnMgc2hvdWxkIGhhdmUgZ290IHJpZCBvZiBhbGwgU3BhY2UgdG9rZW5zIgoKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJVbmtub3duIHRva2VuIHR5cGUsICVzIiAlIHR5cGUpCgogICAgcmV0dXJuICJcbiIuam9pbihvdXRwdXQpClBLAwQUAAAAAAAAACEATSOYwEsTAABLEwAARQAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvdHJlZXdhbGtlcnMvYmFzZS5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgdW5pY29kZV9saXRlcmFscwoKZnJvbSB4bWwuZG9tIGltcG9ydCBOb2RlCmZyb20gLi5jb25zdGFudHMgaW1wb3J0IG5hbWVzcGFjZXMsIHZvaWRFbGVtZW50cywgc3BhY2VDaGFyYWN0ZXJzCgpfX2FsbF9fID0gWyJET0NVTUVOVCIsICJET0NUWVBFIiwgIlRFWFQiLCAiRUxFTUVOVCIsICJDT01NRU5UIiwgIkVOVElUWSIsICJVTktOT1dOIiwKICAgICAgICAgICAiVHJlZVdhbGtlciIsICJOb25SZWN1cnNpdmVUcmVlV2Fsa2VyIl0KCkRPQ1VNRU5UID0gTm9kZS5ET0NVTUVOVF9OT0RFCkRPQ1RZUEUgPSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERQpURVhUID0gTm9kZS5URVhUX05PREUKRUxFTUVOVCA9IE5vZGUuRUxFTUVOVF9OT0RFCkNPTU1FTlQgPSBOb2RlLkNPTU1FTlRfTk9ERQpFTlRJVFkgPSBOb2RlLkVOVElUWV9OT0RFClVOS05PV04gPSAiPCNVTktOT1dOIz4iCgpzcGFjZUNoYXJhY3RlcnMgPSAiIi5qb2luKHNwYWNlQ2hhcmFjdGVycykKCgpjbGFzcyBUcmVlV2Fsa2VyKG9iamVjdCk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgdHJlZSk6CiAgICAgICAgc2VsZi50cmVlID0gdHJlZQoKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCgogICAgZGVmIGVycm9yKHNlbGYsIG1zZyk6CiAgICAgICAgcmV0dXJuIHsidHlwZSI6ICJTZXJpYWxpemVFcnJvciIsICJkYXRhIjogbXNnfQoKICAgIGRlZiBlbXB0eVRhZyhzZWxmLCBuYW1lc3BhY2UsIG5hbWUsIGF0dHJzLCBoYXNDaGlsZHJlbj1GYWxzZSk6CiAgICAgICAgeWllbGQgeyJ0eXBlIjogIkVtcHR5VGFnIiwgIm5hbWUiOiBuYW1lLAogICAgICAgICAgICAgICAibmFtZXNwYWNlIjogbmFtZXNwYWNlLAogICAgICAgICAgICAgICAiZGF0YSI6IGF0dHJzfQogICAgICAgIGlmIGhhc0NoaWxkcmVuOgogICAgICAgICAgICB5aWVsZCBzZWxmLmVycm9yKCJWb2lkIGVsZW1lbnQgaGFzIGNoaWxkcmVuIikKCiAgICBkZWYgc3RhcnRUYWcoc2VsZiwgbmFtZXNwYWNlLCBuYW1lLCBhdHRycyk6CiAgICAgICAgcmV0dXJuIHsidHlwZSI6ICJTdGFydFRhZyIsCiAgICAgICAgICAgICAgICAibmFtZSI6IG5hbWUsCiAgICAgICAgICAgICAgICAibmFtZXNwYWNlIjogbmFtZXNwYWNlLAogICAgICAgICAgICAgICAgImRhdGEiOiBhdHRyc30KCiAgICBkZWYgZW5kVGFnKHNlbGYsIG5hbWVzcGFjZSwgbmFtZSk6CiAgICAgICAgcmV0dXJuIHsidHlwZSI6ICJFbmRUYWciLAogICAgICAgICAgICAgICAgIm5hbWUiOiBuYW1lLAogICAgICAgICAgICAgICAgIm5hbWVzcGFjZSI6IG5hbWVzcGFjZX0KCiAgICBkZWYgdGV4dChzZWxmLCBkYXRhKToKICAgICAgICBkYXRhID0gZGF0YQogICAgICAgIG1pZGRsZSA9IGRhdGEubHN0cmlwKHNwYWNlQ2hhcmFjdGVycykKICAgICAgICBsZWZ0ID0gZGF0YVs6bGVuKGRhdGEpIC0gbGVuKG1pZGRsZSldCiAgICAgICAgaWYgbGVmdDoKICAgICAgICAgICAgeWllbGQgeyJ0eXBlIjogIlNwYWNlQ2hhcmFjdGVycyIsICJkYXRhIjogbGVmdH0KICAgICAgICBkYXRhID0gbWlkZGxlCiAgICAgICAgbWlkZGxlID0gZGF0YS5yc3RyaXAoc3BhY2VDaGFyYWN0ZXJzKQogICAgICAgIHJpZ2h0ID0gZGF0YVtsZW4obWlkZGxlKTpdCiAgICAgICAgaWYgbWlkZGxlOgogICAgICAgICAgICB5aWVsZCB7InR5cGUiOiAiQ2hhcmFjdGVycyIsICJkYXRhIjogbWlkZGxlfQogICAgICAgIGlmIHJpZ2h0OgogICAgICAgICAgICB5aWVsZCB7InR5cGUiOiAiU3BhY2VDaGFyYWN0ZXJzIiwgImRhdGEiOiByaWdodH0KCiAgICBkZWYgY29tbWVudChzZWxmLCBkYXRhKToKICAgICAgICByZXR1cm4geyJ0eXBlIjogIkNvbW1lbnQiLCAiZGF0YSI6IGRhdGF9CgogICAgZGVmIGRvY3R5cGUoc2VsZiwgbmFtZSwgcHVibGljSWQ9Tm9uZSwgc3lzdGVtSWQ9Tm9uZSk6CiAgICAgICAgcmV0dXJuIHsidHlwZSI6ICJEb2N0eXBlIiwKICAgICAgICAgICAgICAgICJuYW1lIjogbmFtZSwKICAgICAgICAgICAgICAgICJwdWJsaWNJZCI6IHB1YmxpY0lkLAogICAgICAgICAgICAgICAgInN5c3RlbUlkIjogc3lzdGVtSWR9CgogICAgZGVmIGVudGl0eShzZWxmLCBuYW1lKToKICAgICAgICByZXR1cm4geyJ0eXBlIjogIkVudGl0eSIsICJuYW1lIjogbmFtZX0KCiAgICBkZWYgdW5rbm93bihzZWxmLCBub2RlVHlwZSk6CiAgICAgICAgcmV0dXJuIHNlbGYuZXJyb3IoIlVua25vd24gbm9kZSB0eXBlOiAiICsgbm9kZVR5cGUpCgoKY2xhc3MgTm9uUmVjdXJzaXZlVHJlZVdhbGtlcihUcmVlV2Fsa2VyKToKICAgIGRlZiBnZXROb2RlRGV0YWlscyhzZWxmLCBub2RlKToKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCgogICAgZGVmIGdldEZpcnN0Q2hpbGQoc2VsZiwgbm9kZSk6CiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgoKICAgIGRlZiBnZXROZXh0U2libGluZyhzZWxmLCBub2RlKToKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCgogICAgZGVmIGdldFBhcmVudE5vZGUoc2VsZiwgbm9kZSk6CiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgoKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICBjdXJyZW50Tm9kZSA9IHNlbGYudHJlZQogICAgICAgIHdoaWxlIGN1cnJlbnROb2RlIGlzIG5vdCBOb25lOgogICAgICAgICAgICBkZXRhaWxzID0gc2VsZi5nZXROb2RlRGV0YWlscyhjdXJyZW50Tm9kZSkKICAgICAgICAgICAgdHlwZSwgZGV0YWlscyA9IGRldGFpbHNbMF0sIGRldGFpbHNbMTpdCiAgICAgICAgICAgIGhhc0NoaWxkcmVuID0gRmFsc2UKCiAgICAgICAgICAgIGlmIHR5cGUgPT0gRE9DVFlQRToKICAgICAgICAgICAgICAgIHlpZWxkIHNlbGYuZG9jdHlwZSgqZGV0YWlscykKCiAgICAgICAgICAgIGVsaWYgdHlwZSA9PSBURVhUOgogICAgICAgICAgICAgICAgZm9yIHRva2VuIGluIHNlbGYudGV4dCgqZGV0YWlscyk6CiAgICAgICAgICAgICAgICAgICAgeWllbGQgdG9rZW4KCiAgICAgICAgICAgIGVsaWYgdHlwZSA9PSBFTEVNRU5UOgogICAgICAgICAgICAgICAgbmFtZXNwYWNlLCBuYW1lLCBhdHRyaWJ1dGVzLCBoYXNDaGlsZHJlbiA9IGRldGFpbHMKICAgICAgICAgICAgICAgIGlmIChub3QgbmFtZXNwYWNlIG9yIG5hbWVzcGFjZSA9PSBuYW1lc3BhY2VzWyJodG1sIl0pIGFuZCBuYW1lIGluIHZvaWRFbGVtZW50czoKICAgICAgICAgICAgICAgICAgICBmb3IgdG9rZW4gaW4gc2VsZi5lbXB0eVRhZyhuYW1lc3BhY2UsIG5hbWUsIGF0dHJpYnV0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzQ2hpbGRyZW4pOgogICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCB0b2tlbgogICAgICAgICAgICAgICAgICAgIGhhc0NoaWxkcmVuID0gRmFsc2UKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgeWllbGQgc2VsZi5zdGFydFRhZyhuYW1lc3BhY2UsIG5hbWUsIGF0dHJpYnV0ZXMpCgogICAgICAgICAgICBlbGlmIHR5cGUgPT0gQ09NTUVOVDoKICAgICAgICAgICAgICAgIHlpZWxkIHNlbGYuY29tbWVudChkZXRhaWxzWzBdKQoKICAgICAgICAgICAgZWxpZiB0eXBlID09IEVOVElUWToKICAgICAgICAgICAgICAgIHlpZWxkIHNlbGYuZW50aXR5KGRldGFpbHNbMF0pCgogICAgICAgICAgICBlbGlmIHR5cGUgPT0gRE9DVU1FTlQ6CiAgICAgICAgICAgICAgICBoYXNDaGlsZHJlbiA9IFRydWUKCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICB5aWVsZCBzZWxmLnVua25vd24oZGV0YWlsc1swXSkKCiAgICAgICAgICAgIGlmIGhhc0NoaWxkcmVuOgogICAgICAgICAgICAgICAgZmlyc3RDaGlsZCA9IHNlbGYuZ2V0Rmlyc3RDaGlsZChjdXJyZW50Tm9kZSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGZpcnN0Q2hpbGQgPSBOb25lCgogICAgICAgICAgICBpZiBmaXJzdENoaWxkIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgY3VycmVudE5vZGUgPSBmaXJzdENoaWxkCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICB3aGlsZSBjdXJyZW50Tm9kZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICBkZXRhaWxzID0gc2VsZi5nZXROb2RlRGV0YWlscyhjdXJyZW50Tm9kZSkKICAgICAgICAgICAgICAgICAgICB0eXBlLCBkZXRhaWxzID0gZGV0YWlsc1swXSwgZGV0YWlsc1sxOl0KICAgICAgICAgICAgICAgICAgICBpZiB0eXBlID09IEVMRU1FTlQ6CiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSwgbmFtZSwgYXR0cmlidXRlcywgaGFzQ2hpbGRyZW4gPSBkZXRhaWxzCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UgYW5kIG5hbWVzcGFjZSAhPSBuYW1lc3BhY2VzWyJodG1sIl0pIG9yIG5hbWUgbm90IGluIHZvaWRFbGVtZW50czoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIHNlbGYuZW5kVGFnKG5hbWVzcGFjZSwgbmFtZSkKICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLnRyZWUgaXMgY3VycmVudE5vZGU6CiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlID0gTm9uZQogICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgICAgIG5leHRTaWJsaW5nID0gc2VsZi5nZXROZXh0U2libGluZyhjdXJyZW50Tm9kZSkKICAgICAgICAgICAgICAgICAgICBpZiBuZXh0U2libGluZyBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUgPSBuZXh0U2libGluZwogICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlID0gc2VsZi5nZXRQYXJlbnROb2RlKGN1cnJlbnROb2RlKQpQSwMEFAAAAAAAAAAhAGWKb6mFBQAAhQUAAEQAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL3RyZWV3YWxrZXJzL2RvbS5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgdW5pY29kZV9saXRlcmFscwoKZnJvbSB4bWwuZG9tIGltcG9ydCBOb2RlCgpmcm9tIC4gaW1wb3J0IGJhc2UKCgpjbGFzcyBUcmVlV2Fsa2VyKGJhc2UuTm9uUmVjdXJzaXZlVHJlZVdhbGtlcik6CiAgICBkZWYgZ2V0Tm9kZURldGFpbHMoc2VsZiwgbm9kZSk6CiAgICAgICAgaWYgbm9kZS5ub2RlVHlwZSA9PSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERToKICAgICAgICAgICAgcmV0dXJuIGJhc2UuRE9DVFlQRSwgbm9kZS5uYW1lLCBub2RlLnB1YmxpY0lkLCBub2RlLnN5c3RlbUlkCgogICAgICAgIGVsaWYgbm9kZS5ub2RlVHlwZSBpbiAoTm9kZS5URVhUX05PREUsIE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFKToKICAgICAgICAgICAgcmV0dXJuIGJhc2UuVEVYVCwgbm9kZS5ub2RlVmFsdWUKCiAgICAgICAgZWxpZiBub2RlLm5vZGVUeXBlID09IE5vZGUuRUxFTUVOVF9OT0RFOgogICAgICAgICAgICBhdHRycyA9IHt9CiAgICAgICAgICAgIGZvciBhdHRyIGluIGxpc3Qobm9kZS5hdHRyaWJ1dGVzLmtleXMoKSk6CiAgICAgICAgICAgICAgICBhdHRyID0gbm9kZS5nZXRBdHRyaWJ1dGVOb2RlKGF0dHIpCiAgICAgICAgICAgICAgICBpZiBhdHRyLm5hbWVzcGFjZVVSSToKICAgICAgICAgICAgICAgICAgICBhdHRyc1soYXR0ci5uYW1lc3BhY2VVUkksIGF0dHIubG9jYWxOYW1lKV0gPSBhdHRyLnZhbHVlCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGF0dHJzWyhOb25lLCBhdHRyLm5hbWUpXSA9IGF0dHIudmFsdWUKICAgICAgICAgICAgcmV0dXJuIChiYXNlLkVMRU1FTlQsIG5vZGUubmFtZXNwYWNlVVJJLCBub2RlLm5vZGVOYW1lLAogICAgICAgICAgICAgICAgICAgIGF0dHJzLCBub2RlLmhhc0NoaWxkTm9kZXMoKSkKCiAgICAgICAgZWxpZiBub2RlLm5vZGVUeXBlID09IE5vZGUuQ09NTUVOVF9OT0RFOgogICAgICAgICAgICByZXR1cm4gYmFzZS5DT01NRU5ULCBub2RlLm5vZGVWYWx1ZQoKICAgICAgICBlbGlmIG5vZGUubm9kZVR5cGUgaW4gKE5vZGUuRE9DVU1FTlRfTk9ERSwgTm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFKToKICAgICAgICAgICAgcmV0dXJuIChiYXNlLkRPQ1VNRU5ULCkKCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIGJhc2UuVU5LTk9XTiwgbm9kZS5ub2RlVHlwZQoKICAgIGRlZiBnZXRGaXJzdENoaWxkKHNlbGYsIG5vZGUpOgogICAgICAgIHJldHVybiBub2RlLmZpcnN0Q2hpbGQKCiAgICBkZWYgZ2V0TmV4dFNpYmxpbmcoc2VsZiwgbm9kZSk6CiAgICAgICAgcmV0dXJuIG5vZGUubmV4dFNpYmxpbmcKCiAgICBkZWYgZ2V0UGFyZW50Tm9kZShzZWxmLCBub2RlKToKICAgICAgICByZXR1cm4gbm9kZS5wYXJlbnROb2RlClBLAwQUAAAAAAAAACEAIsEQMUwSAABMEgAARgAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvdHJlZXdhbGtlcnMvZXRyZWUucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHVuaWNvZGVfbGl0ZXJhbHMKCnRyeToKICAgIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IE9yZGVyZWREaWN0CmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIHRyeToKICAgICAgICBmcm9tIG9yZGVyZWRkaWN0IGltcG9ydCBPcmRlcmVkRGljdAogICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgIE9yZGVyZWREaWN0ID0gZGljdAoKaW1wb3J0IHJlCgpmcm9tIHBpcC5fdmVuZG9yLnNpeCBpbXBvcnQgc3RyaW5nX3R5cGVzCgpmcm9tIC4gaW1wb3J0IGJhc2UKZnJvbSAuLl91dGlscyBpbXBvcnQgbW9kdWxlRmFjdG9yeUZhY3RvcnkKCnRhZ19yZWdleHAgPSByZS5jb21waWxlKCJ7KFtefV0qKX0oLiopIikKCgpkZWYgZ2V0RVRyZWVCdWlsZGVyKEVsZW1lbnRUcmVlSW1wbGVtZW50YXRpb24pOgogICAgRWxlbWVudFRyZWUgPSBFbGVtZW50VHJlZUltcGxlbWVudGF0aW9uCiAgICBFbGVtZW50VHJlZUNvbW1lbnRUeXBlID0gRWxlbWVudFRyZWUuQ29tbWVudCgiYXNkIikudGFnCgogICAgY2xhc3MgVHJlZVdhbGtlcihiYXNlLk5vblJlY3Vyc2l2ZVRyZWVXYWxrZXIpOiAgIyBweWxpbnQ6ZGlzYWJsZT11bnVzZWQtdmFyaWFibGUKICAgICAgICAiIiJHaXZlbiB0aGUgcGFydGljdWxhciBFbGVtZW50VHJlZSByZXByZXNlbnRhdGlvbiwgdGhpcyBpbXBsZW1lbnRhdGlvbiwKICAgICAgICB0byBhdm9pZCB1c2luZyByZWN1cnNpb24sIHJldHVybnMgIm5vZGVzIiBhcyB0dXBsZXMgd2l0aCB0aGUgZm9sbG93aW5nCiAgICAgICAgY29udGVudDoKCiAgICAgICAgMS4gVGhlIGN1cnJlbnQgZWxlbWVudAoKICAgICAgICAyLiBUaGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgcmVsYXRpdmUgdG8gaXRzIHBhcmVudAoKICAgICAgICAzLiBBIHN0YWNrIG9mIGFuY2VzdG9yIGVsZW1lbnRzCgogICAgICAgIDQuIEEgZmxhZyAidGV4dCIsICJ0YWlsIiBvciBOb25lIHRvIGluZGljYXRlIGlmIHRoZSBjdXJyZW50IG5vZGUgaXMgYQogICAgICAgICAgIHRleHQgbm9kZTsgZWl0aGVyIHRoZSB0ZXh0IG9yIHRhaWwgb2YgdGhlIGN1cnJlbnQgZWxlbWVudCAoMSkKICAgICAgICAiIiIKICAgICAgICBkZWYgZ2V0Tm9kZURldGFpbHMoc2VsZiwgbm9kZSk6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uobm9kZSwgdHVwbGUpOiAgIyBJdCBtaWdodCBiZSB0aGUgcm9vdCBFbGVtZW50CiAgICAgICAgICAgICAgICBlbHQsIF8sIF8sIGZsYWcgPSBub2RlCiAgICAgICAgICAgICAgICBpZiBmbGFnIGluICgidGV4dCIsICJ0YWlsIik6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJhc2UuVEVYVCwgZ2V0YXR0cihlbHQsIGZsYWcpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIG5vZGUgPSBlbHQKCiAgICAgICAgICAgIGlmIG5vdChoYXNhdHRyKG5vZGUsICJ0YWciKSk6CiAgICAgICAgICAgICAgICBub2RlID0gbm9kZS5nZXRyb290KCkKCiAgICAgICAgICAgIGlmIG5vZGUudGFnIGluICgiRE9DVU1FTlRfUk9PVCIsICJET0NVTUVOVF9GUkFHTUVOVCIpOgogICAgICAgICAgICAgICAgcmV0dXJuIChiYXNlLkRPQ1VNRU5ULCkKCiAgICAgICAgICAgIGVsaWYgbm9kZS50YWcgPT0gIjwhRE9DVFlQRT4iOgogICAgICAgICAgICAgICAgcmV0dXJuIChiYXNlLkRPQ1RZUEUsIG5vZGUudGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5nZXQoInB1YmxpY0lkIiksIG5vZGUuZ2V0KCJzeXN0ZW1JZCIpKQoKICAgICAgICAgICAgZWxpZiBub2RlLnRhZyA9PSBFbGVtZW50VHJlZUNvbW1lbnRUeXBlOgogICAgICAgICAgICAgICAgcmV0dXJuIGJhc2UuQ09NTUVOVCwgbm9kZS50ZXh0CgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2Uobm9kZS50YWcsIHN0cmluZ190eXBlcyksIHR5cGUobm9kZS50YWcpCiAgICAgICAgICAgICAgICAjIFRoaXMgaXMgYXNzdW1lZCB0byBiZSBhbiBvcmRpbmFyeSBlbGVtZW50CiAgICAgICAgICAgICAgICBtYXRjaCA9IHRhZ19yZWdleHAubWF0Y2gobm9kZS50YWcpCiAgICAgICAgICAgICAgICBpZiBtYXRjaDoKICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UsIHRhZyA9IG1hdGNoLmdyb3VwcygpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IE5vbmUKICAgICAgICAgICAgICAgICAgICB0YWcgPSBub2RlLnRhZwogICAgICAgICAgICAgICAgYXR0cnMgPSBPcmRlcmVkRGljdCgpCiAgICAgICAgICAgICAgICBmb3IgbmFtZSwgdmFsdWUgaW4gbGlzdChub2RlLmF0dHJpYi5pdGVtcygpKToKICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IHRhZ19yZWdleHAubWF0Y2gobmFtZSkKICAgICAgICAgICAgICAgICAgICBpZiBtYXRjaDoKICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnNbKG1hdGNoLmdyb3VwKDEpLCBtYXRjaC5ncm91cCgyKSldID0gdmFsdWUKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBhdHRyc1soTm9uZSwgbmFtZSldID0gdmFsdWUKICAgICAgICAgICAgICAgIHJldHVybiAoYmFzZS5FTEVNRU5ULCBuYW1lc3BhY2UsIHRhZywKICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnMsIGxlbihub2RlKSBvciBub2RlLnRleHQpCgogICAgICAgIGRlZiBnZXRGaXJzdENoaWxkKHNlbGYsIG5vZGUpOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKG5vZGUsIHR1cGxlKToKICAgICAgICAgICAgICAgIGVsZW1lbnQsIGtleSwgcGFyZW50cywgZmxhZyA9IG5vZGUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGVsZW1lbnQsIGtleSwgcGFyZW50cywgZmxhZyA9IG5vZGUsIE5vbmUsIFtdLCBOb25lCgogICAgICAgICAgICBpZiBmbGFnIGluICgidGV4dCIsICJ0YWlsIik6CiAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgaWYgZWxlbWVudC50ZXh0OgogICAgICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50LCBrZXksIHBhcmVudHMsICJ0ZXh0IgogICAgICAgICAgICAgICAgZWxpZiBsZW4oZWxlbWVudCk6CiAgICAgICAgICAgICAgICAgICAgcGFyZW50cy5hcHBlbmQoZWxlbWVudCkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudFswXSwgMCwgcGFyZW50cywgTm9uZQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgICAgICBkZWYgZ2V0TmV4dFNpYmxpbmcoc2VsZiwgbm9kZSk6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uobm9kZSwgdHVwbGUpOgogICAgICAgICAgICAgICAgZWxlbWVudCwga2V5LCBwYXJlbnRzLCBmbGFnID0gbm9kZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgICAgIGlmIGZsYWcgPT0gInRleHQiOgogICAgICAgICAgICAgICAgaWYgbGVuKGVsZW1lbnQpOgogICAgICAgICAgICAgICAgICAgIHBhcmVudHMuYXBwZW5kKGVsZW1lbnQpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnRbMF0sIDAsIHBhcmVudHMsIE5vbmUKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGlmIGVsZW1lbnQudGFpbCBhbmQgZmxhZyAhPSAidGFpbCI6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQsIGtleSwgcGFyZW50cywgInRhaWwiCiAgICAgICAgICAgICAgICBlbGlmIGtleSA8IGxlbihwYXJlbnRzWy0xXSkgLSAxOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJlbnRzWy0xXVtrZXkgKyAxXSwga2V5ICsgMSwgcGFyZW50cywgTm9uZQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgICAgICBkZWYgZ2V0UGFyZW50Tm9kZShzZWxmLCBub2RlKToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShub2RlLCB0dXBsZSk6CiAgICAgICAgICAgICAgICBlbGVtZW50LCBrZXksIHBhcmVudHMsIGZsYWcgPSBub2RlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgICAgICAgICAgaWYgZmxhZyA9PSAidGV4dCI6CiAgICAgICAgICAgICAgICBpZiBub3QgcGFyZW50czoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudAogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudCwga2V5LCBwYXJlbnRzLCBOb25lCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnRzLnBvcCgpCiAgICAgICAgICAgICAgICBpZiBub3QgcGFyZW50czoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyZW50CiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGFzc2VydCBsaXN0KHBhcmVudHNbLTFdKS5jb3VudChwYXJlbnQpID09IDEKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyZW50LCBsaXN0KHBhcmVudHNbLTFdKS5pbmRleChwYXJlbnQpLCBwYXJlbnRzLCBOb25lCgogICAgcmV0dXJuIGxvY2FscygpCgpnZXRFVHJlZU1vZHVsZSA9IG1vZHVsZUZhY3RvcnlGYWN0b3J5KGdldEVUcmVlQnVpbGRlcikKUEsDBBQAAAAAAAAAIQCWDZxHpRgAAKUYAABLAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi90cmVld2Fsa2Vycy9ldHJlZV9seG1sLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCB1bmljb2RlX2xpdGVyYWxzCmZyb20gcGlwLl92ZW5kb3Iuc2l4IGltcG9ydCB0ZXh0X3R5cGUKCmZyb20gbHhtbCBpbXBvcnQgZXRyZWUKZnJvbSAuLnRyZWVidWlsZGVycy5ldHJlZSBpbXBvcnQgdGFnX3JlZ2V4cAoKZnJvbSAuIGltcG9ydCBiYXNlCgpmcm9tIC4uIGltcG9ydCBfaWhhdGV4bWwKCgpkZWYgZW5zdXJlX3N0cihzKToKICAgIGlmIHMgaXMgTm9uZToKICAgICAgICByZXR1cm4gTm9uZQogICAgZWxpZiBpc2luc3RhbmNlKHMsIHRleHRfdHlwZSk6CiAgICAgICAgcmV0dXJuIHMKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIHMuZGVjb2RlKCJhc2NpaSIsICJzdHJpY3QiKQoKCmNsYXNzIFJvb3Qob2JqZWN0KToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBldCk6CiAgICAgICAgc2VsZi5lbGVtZW50dHJlZSA9IGV0CiAgICAgICAgc2VsZi5jaGlsZHJlbiA9IFtdCgogICAgICAgIHRyeToKICAgICAgICAgICAgaWYgZXQuZG9jaW5mby5pbnRlcm5hbERURDoKICAgICAgICAgICAgICAgIHNlbGYuY2hpbGRyZW4uYXBwZW5kKERvY3R5cGUoc2VsZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5zdXJlX3N0cihldC5kb2NpbmZvLnJvb3RfbmFtZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuc3VyZV9zdHIoZXQuZG9jaW5mby5wdWJsaWNfaWQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnN1cmVfc3RyKGV0LmRvY2luZm8uc3lzdGVtX3VybCkpKQogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgcGFzcwoKICAgICAgICB0cnk6CiAgICAgICAgICAgIG5vZGUgPSBldC5nZXRyb290KCkKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIG5vZGUgPSBldAoKICAgICAgICB3aGlsZSBub2RlLmdldHByZXZpb3VzKCkgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIG5vZGUgPSBub2RlLmdldHByZXZpb3VzKCkKICAgICAgICB3aGlsZSBub2RlIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLmNoaWxkcmVuLmFwcGVuZChub2RlKQogICAgICAgICAgICBub2RlID0gbm9kZS5nZXRuZXh0KCkKCiAgICAgICAgc2VsZi50ZXh0ID0gTm9uZQogICAgICAgIHNlbGYudGFpbCA9IE5vbmUKCiAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKICAgICAgICByZXR1cm4gc2VsZi5jaGlsZHJlbltrZXldCgogICAgZGVmIGdldG5leHQoc2VsZik6CiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBkZWYgX19sZW5fXyhzZWxmKToKICAgICAgICByZXR1cm4gMQoKCmNsYXNzIERvY3R5cGUob2JqZWN0KToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCByb290X25vZGUsIG5hbWUsIHB1YmxpY19pZCwgc3lzdGVtX2lkKToKICAgICAgICBzZWxmLnJvb3Rfbm9kZSA9IHJvb3Rfbm9kZQogICAgICAgIHNlbGYubmFtZSA9IG5hbWUKICAgICAgICBzZWxmLnB1YmxpY19pZCA9IHB1YmxpY19pZAogICAgICAgIHNlbGYuc3lzdGVtX2lkID0gc3lzdGVtX2lkCgogICAgICAgIHNlbGYudGV4dCA9IE5vbmUKICAgICAgICBzZWxmLnRhaWwgPSBOb25lCgogICAgZGVmIGdldG5leHQoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYucm9vdF9ub2RlLmNoaWxkcmVuWzFdCgoKY2xhc3MgRnJhZ21lbnRSb290KFJvb3QpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGNoaWxkcmVuKToKICAgICAgICBzZWxmLmNoaWxkcmVuID0gW0ZyYWdtZW50V3JhcHBlcihzZWxmLCBjaGlsZCkgZm9yIGNoaWxkIGluIGNoaWxkcmVuXQogICAgICAgIHNlbGYudGV4dCA9IHNlbGYudGFpbCA9IE5vbmUKCiAgICBkZWYgZ2V0bmV4dChzZWxmKToKICAgICAgICByZXR1cm4gTm9uZQoKCmNsYXNzIEZyYWdtZW50V3JhcHBlcihvYmplY3QpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGZyYWdtZW50X3Jvb3QsIG9iaik6CiAgICAgICAgc2VsZi5yb290X25vZGUgPSBmcmFnbWVudF9yb290CiAgICAgICAgc2VsZi5vYmogPSBvYmoKICAgICAgICBpZiBoYXNhdHRyKHNlbGYub2JqLCAndGV4dCcpOgogICAgICAgICAgICBzZWxmLnRleHQgPSBlbnN1cmVfc3RyKHNlbGYub2JqLnRleHQpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi50ZXh0ID0gTm9uZQogICAgICAgIGlmIGhhc2F0dHIoc2VsZi5vYmosICd0YWlsJyk6CiAgICAgICAgICAgIHNlbGYudGFpbCA9IGVuc3VyZV9zdHIoc2VsZi5vYmoudGFpbCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnRhaWwgPSBOb25lCgogICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUpOgogICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYub2JqLCBuYW1lKQoKICAgIGRlZiBnZXRuZXh0KHNlbGYpOgogICAgICAgIHNpYmxpbmdzID0gc2VsZi5yb290X25vZGUuY2hpbGRyZW4KICAgICAgICBpZHggPSBzaWJsaW5ncy5pbmRleChzZWxmKQogICAgICAgIGlmIGlkeCA8IGxlbihzaWJsaW5ncykgLSAxOgogICAgICAgICAgICByZXR1cm4gc2libGluZ3NbaWR4ICsgMV0KICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgogICAgICAgIHJldHVybiBzZWxmLm9ialtrZXldCgogICAgZGVmIF9fYm9vbF9fKHNlbGYpOgogICAgICAgIHJldHVybiBib29sKHNlbGYub2JqKQoKICAgIGRlZiBnZXRwYXJlbnQoc2VsZik6CiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gc3RyKHNlbGYub2JqKQoKICAgIGRlZiBfX3VuaWNvZGVfXyhzZWxmKToKICAgICAgICByZXR1cm4gc3RyKHNlbGYub2JqKQoKICAgIGRlZiBfX2xlbl9fKHNlbGYpOgogICAgICAgIHJldHVybiBsZW4oc2VsZi5vYmopCgoKY2xhc3MgVHJlZVdhbGtlcihiYXNlLk5vblJlY3Vyc2l2ZVRyZWVXYWxrZXIpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHRyZWUpOgogICAgICAgICMgcHlsaW50OmRpc2FibGU9cmVkZWZpbmVkLXZhcmlhYmxlLXR5cGUKICAgICAgICBpZiBpc2luc3RhbmNlKHRyZWUsIGxpc3QpOgogICAgICAgICAgICBzZWxmLmZyYWdtZW50Q2hpbGRyZW4gPSBzZXQodHJlZSkKICAgICAgICAgICAgdHJlZSA9IEZyYWdtZW50Um9vdCh0cmVlKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuZnJhZ21lbnRDaGlsZHJlbiA9IHNldCgpCiAgICAgICAgICAgIHRyZWUgPSBSb290KHRyZWUpCiAgICAgICAgYmFzZS5Ob25SZWN1cnNpdmVUcmVlV2Fsa2VyLl9faW5pdF9fKHNlbGYsIHRyZWUpCiAgICAgICAgc2VsZi5maWx0ZXIgPSBfaWhhdGV4bWwuSW5mb3NldEZpbHRlcigpCgogICAgZGVmIGdldE5vZGVEZXRhaWxzKHNlbGYsIG5vZGUpOgogICAgICAgIGlmIGlzaW5zdGFuY2Uobm9kZSwgdHVwbGUpOiAgIyBUZXh0IG5vZGUKICAgICAgICAgICAgbm9kZSwga2V5ID0gbm9kZQogICAgICAgICAgICBhc3NlcnQga2V5IGluICgidGV4dCIsICJ0YWlsIiksICJUZXh0IG5vZGVzIGFyZSB0ZXh0IG9yIHRhaWwsIGZvdW5kICVzIiAlIGtleQogICAgICAgICAgICByZXR1cm4gYmFzZS5URVhULCBlbnN1cmVfc3RyKGdldGF0dHIobm9kZSwga2V5KSkKCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKG5vZGUsIFJvb3QpOgogICAgICAgICAgICByZXR1cm4gKGJhc2UuRE9DVU1FTlQsKQoKICAgICAgICBlbGlmIGlzaW5zdGFuY2Uobm9kZSwgRG9jdHlwZSk6CiAgICAgICAgICAgIHJldHVybiBiYXNlLkRPQ1RZUEUsIG5vZGUubmFtZSwgbm9kZS5wdWJsaWNfaWQsIG5vZGUuc3lzdGVtX2lkCgogICAgICAgIGVsaWYgaXNpbnN0YW5jZShub2RlLCBGcmFnbWVudFdyYXBwZXIpIGFuZCBub3QgaGFzYXR0cihub2RlLCAidGFnIik6CiAgICAgICAgICAgIHJldHVybiBiYXNlLlRFWFQsIGVuc3VyZV9zdHIobm9kZS5vYmopCgogICAgICAgIGVsaWYgbm9kZS50YWcgPT0gZXRyZWUuQ29tbWVudDoKICAgICAgICAgICAgcmV0dXJuIGJhc2UuQ09NTUVOVCwgZW5zdXJlX3N0cihub2RlLnRleHQpCgogICAgICAgIGVsaWYgbm9kZS50YWcgPT0gZXRyZWUuRW50aXR5OgogICAgICAgICAgICByZXR1cm4gYmFzZS5FTlRJVFksIGVuc3VyZV9zdHIobm9kZS50ZXh0KVsxOi0xXSAgIyBzdHJpcCAmOwoKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIFRoaXMgaXMgYXNzdW1lZCB0byBiZSBhbiBvcmRpbmFyeSBlbGVtZW50CiAgICAgICAgICAgIG1hdGNoID0gdGFnX3JlZ2V4cC5tYXRjaChlbnN1cmVfc3RyKG5vZGUudGFnKSkKICAgICAgICAgICAgaWYgbWF0Y2g6CiAgICAgICAgICAgICAgICBuYW1lc3BhY2UsIHRhZyA9IG1hdGNoLmdyb3VwcygpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBOb25lCiAgICAgICAgICAgICAgICB0YWcgPSBlbnN1cmVfc3RyKG5vZGUudGFnKQogICAgICAgICAgICBhdHRycyA9IHt9CiAgICAgICAgICAgIGZvciBuYW1lLCB2YWx1ZSBpbiBsaXN0KG5vZGUuYXR0cmliLml0ZW1zKCkpOgogICAgICAgICAgICAgICAgbmFtZSA9IGVuc3VyZV9zdHIobmFtZSkKICAgICAgICAgICAgICAgIHZhbHVlID0gZW5zdXJlX3N0cih2YWx1ZSkKICAgICAgICAgICAgICAgIG1hdGNoID0gdGFnX3JlZ2V4cC5tYXRjaChuYW1lKQogICAgICAgICAgICAgICAgaWYgbWF0Y2g6CiAgICAgICAgICAgICAgICAgICAgYXR0cnNbKG1hdGNoLmdyb3VwKDEpLCBtYXRjaC5ncm91cCgyKSldID0gdmFsdWUKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgYXR0cnNbKE5vbmUsIG5hbWUpXSA9IHZhbHVlCiAgICAgICAgICAgIHJldHVybiAoYmFzZS5FTEVNRU5ULCBuYW1lc3BhY2UsIHNlbGYuZmlsdGVyLmZyb21YbWxOYW1lKHRhZyksCiAgICAgICAgICAgICAgICAgICAgYXR0cnMsIGxlbihub2RlKSA+IDAgb3Igbm9kZS50ZXh0KQoKICAgIGRlZiBnZXRGaXJzdENoaWxkKHNlbGYsIG5vZGUpOgogICAgICAgIGFzc2VydCBub3QgaXNpbnN0YW5jZShub2RlLCB0dXBsZSksICJUZXh0IG5vZGVzIGhhdmUgbm8gY2hpbGRyZW4iCgogICAgICAgIGFzc2VydCBsZW4obm9kZSkgb3Igbm9kZS50ZXh0LCAiTm9kZSBoYXMgbm8gY2hpbGRyZW4iCiAgICAgICAgaWYgbm9kZS50ZXh0OgogICAgICAgICAgICByZXR1cm4gKG5vZGUsICJ0ZXh0IikKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gbm9kZVswXQoKICAgIGRlZiBnZXROZXh0U2libGluZyhzZWxmLCBub2RlKToKICAgICAgICBpZiBpc2luc3RhbmNlKG5vZGUsIHR1cGxlKTogICMgVGV4dCBub2RlCiAgICAgICAgICAgIG5vZGUsIGtleSA9IG5vZGUKICAgICAgICAgICAgYXNzZXJ0IGtleSBpbiAoInRleHQiLCAidGFpbCIpLCAiVGV4dCBub2RlcyBhcmUgdGV4dCBvciB0YWlsLCBmb3VuZCAlcyIgJSBrZXkKICAgICAgICAgICAgaWYga2V5ID09ICJ0ZXh0IjoKICAgICAgICAgICAgICAgICMgWFhYOiB3ZSBjYW5ub3QgdXNlIGEgImJvb2wobm9kZSkgYW5kIG5vZGVbMF0gb3IgTm9uZSIgY29uc3RydWN0IGhlcmUKICAgICAgICAgICAgICAgICMgYmVjYXVzZSBub2RlWzBdIG1pZ2h0IGV2YWx1YXRlIHRvIEZhbHNlIGlmIGl0IGhhcyBubyBjaGlsZCBlbGVtZW50CiAgICAgICAgICAgICAgICBpZiBsZW4obm9kZSk6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGVbMF0KICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICAgICAgZWxzZTogICMgdGFpbAogICAgICAgICAgICAgICAgcmV0dXJuIG5vZGUuZ2V0bmV4dCgpCgogICAgICAgIHJldHVybiAobm9kZSwgInRhaWwiKSBpZiBub2RlLnRhaWwgZWxzZSBub2RlLmdldG5leHQoKQoKICAgIGRlZiBnZXRQYXJlbnROb2RlKHNlbGYsIG5vZGUpOgogICAgICAgIGlmIGlzaW5zdGFuY2Uobm9kZSwgdHVwbGUpOiAgIyBUZXh0IG5vZGUKICAgICAgICAgICAgbm9kZSwga2V5ID0gbm9kZQogICAgICAgICAgICBhc3NlcnQga2V5IGluICgidGV4dCIsICJ0YWlsIiksICJUZXh0IG5vZGVzIGFyZSB0ZXh0IG9yIHRhaWwsIGZvdW5kICVzIiAlIGtleQogICAgICAgICAgICBpZiBrZXkgPT0gInRleHQiOgogICAgICAgICAgICAgICAgcmV0dXJuIG5vZGUKICAgICAgICAgICAgIyBlbHNlOiBmYWxsYmFjayB0byAibm9ybWFsIiBwcm9jZXNzaW5nCiAgICAgICAgZWxpZiBub2RlIGluIHNlbGYuZnJhZ21lbnRDaGlsZHJlbjoKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgcmV0dXJuIG5vZGUuZ2V0cGFyZW50KCkKUEsDBBQAAAAAAAAAIQATX20QBQkAAAUJAABHAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi90cmVld2Fsa2Vycy9nZW5zaGkucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHVuaWNvZGVfbGl0ZXJhbHMKCmZyb20gZ2Vuc2hpLmNvcmUgaW1wb3J0IFFOYW1lCmZyb20gZ2Vuc2hpLmNvcmUgaW1wb3J0IFNUQVJULCBFTkQsIFhNTF9OQU1FU1BBQ0UsIERPQ1RZUEUsIFRFWFQKZnJvbSBnZW5zaGkuY29yZSBpbXBvcnQgU1RBUlRfTlMsIEVORF9OUywgU1RBUlRfQ0RBVEEsIEVORF9DREFUQSwgUEksIENPTU1FTlQKCmZyb20gLiBpbXBvcnQgYmFzZQoKZnJvbSAuLmNvbnN0YW50cyBpbXBvcnQgdm9pZEVsZW1lbnRzLCBuYW1lc3BhY2VzCgoKY2xhc3MgVHJlZVdhbGtlcihiYXNlLlRyZWVXYWxrZXIpOgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgICMgQnVmZmVyIHRoZSBldmVudHMgc28gd2UgY2FuIHBhc3MgaW4gdGhlIGZvbGxvd2luZyBvbmUKICAgICAgICBwcmV2aW91cyA9IE5vbmUKICAgICAgICBmb3IgZXZlbnQgaW4gc2VsZi50cmVlOgogICAgICAgICAgICBpZiBwcmV2aW91cyBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIGZvciB0b2tlbiBpbiBzZWxmLnRva2VucyhwcmV2aW91cywgZXZlbnQpOgogICAgICAgICAgICAgICAgICAgIHlpZWxkIHRva2VuCiAgICAgICAgICAgIHByZXZpb3VzID0gZXZlbnQKCiAgICAgICAgIyBEb24ndCBmb3JnZXQgdGhlIGZpbmFsIGV2ZW50IQogICAgICAgIGlmIHByZXZpb3VzIGlzIG5vdCBOb25lOgogICAgICAgICAgICBmb3IgdG9rZW4gaW4gc2VsZi50b2tlbnMocHJldmlvdXMsIE5vbmUpOgogICAgICAgICAgICAgICAgeWllbGQgdG9rZW4KCiAgICBkZWYgdG9rZW5zKHNlbGYsIGV2ZW50LCBuZXh0KToKICAgICAgICBraW5kLCBkYXRhLCBfID0gZXZlbnQKICAgICAgICBpZiBraW5kID09IFNUQVJUOgogICAgICAgICAgICB0YWcsIGF0dHJpYnMgPSBkYXRhCiAgICAgICAgICAgIG5hbWUgPSB0YWcubG9jYWxuYW1lCiAgICAgICAgICAgIG5hbWVzcGFjZSA9IHRhZy5uYW1lc3BhY2UKICAgICAgICAgICAgY29udmVydGVkX2F0dHJpYnMgPSB7fQogICAgICAgICAgICBmb3IgaywgdiBpbiBhdHRyaWJzOgogICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShrLCBRTmFtZSk6CiAgICAgICAgICAgICAgICAgICAgY29udmVydGVkX2F0dHJpYnNbKGsubmFtZXNwYWNlLCBrLmxvY2FsbmFtZSldID0gdgogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWRfYXR0cmlic1soTm9uZSwgayldID0gdgoKICAgICAgICAgICAgaWYgbmFtZXNwYWNlID09IG5hbWVzcGFjZXNbImh0bWwiXSBhbmQgbmFtZSBpbiB2b2lkRWxlbWVudHM6CiAgICAgICAgICAgICAgICBmb3IgdG9rZW4gaW4gc2VsZi5lbXB0eVRhZyhuYW1lc3BhY2UsIG5hbWUsIGNvbnZlcnRlZF9hdHRyaWJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IG5leHQgb3IgbmV4dFswXSAhPSBFTkQgb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRbMV0gIT0gdGFnKToKICAgICAgICAgICAgICAgICAgICB5aWVsZCB0b2tlbgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgeWllbGQgc2VsZi5zdGFydFRhZyhuYW1lc3BhY2UsIG5hbWUsIGNvbnZlcnRlZF9hdHRyaWJzKQoKICAgICAgICBlbGlmIGtpbmQgPT0gRU5EOgogICAgICAgICAgICBuYW1lID0gZGF0YS5sb2NhbG5hbWUKICAgICAgICAgICAgbmFtZXNwYWNlID0gZGF0YS5uYW1lc3BhY2UKICAgICAgICAgICAgaWYgbmFtZXNwYWNlICE9IG5hbWVzcGFjZXNbImh0bWwiXSBvciBuYW1lIG5vdCBpbiB2b2lkRWxlbWVudHM6CiAgICAgICAgICAgICAgICB5aWVsZCBzZWxmLmVuZFRhZyhuYW1lc3BhY2UsIG5hbWUpCgogICAgICAgIGVsaWYga2luZCA9PSBDT01NRU5UOgogICAgICAgICAgICB5aWVsZCBzZWxmLmNvbW1lbnQoZGF0YSkKCiAgICAgICAgZWxpZiBraW5kID09IFRFWFQ6CiAgICAgICAgICAgIGZvciB0b2tlbiBpbiBzZWxmLnRleHQoZGF0YSk6CiAgICAgICAgICAgICAgICB5aWVsZCB0b2tlbgoKICAgICAgICBlbGlmIGtpbmQgPT0gRE9DVFlQRToKICAgICAgICAgICAgeWllbGQgc2VsZi5kb2N0eXBlKCpkYXRhKQoKICAgICAgICBlbGlmIGtpbmQgaW4gKFhNTF9OQU1FU1BBQ0UsIERPQ1RZUEUsIFNUQVJUX05TLCBFTkRfTlMsCiAgICAgICAgICAgICAgICAgICAgICBTVEFSVF9DREFUQSwgRU5EX0NEQVRBLCBQSSk6CiAgICAgICAgICAgIHBhc3MKCiAgICAgICAgZWxzZToKICAgICAgICAgICAgeWllbGQgc2VsZi51bmtub3duKGtpbmQpClBLAwQUAAAAAAAAACEAAEdcmzoAAAA6AAAAOQAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaWRuYS9fX2luaXRfXy5weWZyb20gLnBhY2thZ2VfZGF0YSBpbXBvcnQgX192ZXJzaW9uX18KZnJvbSAuY29yZSBpbXBvcnQgKgpQSwMEFAAAAAAAAAAhAPNI1OnjDAAA4wwAADYAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2lkbmEvY29kZWMucHlmcm9tIC5jb3JlIGltcG9ydCBlbmNvZGUsIGRlY29kZSwgYWxhYmVsLCB1bGFiZWwsIElETkFFcnJvcgppbXBvcnQgY29kZWNzCmltcG9ydCByZQoKX3VuaWNvZGVfZG90c19yZSA9IHJlLmNvbXBpbGUodSdbXHUwMDJlXHUzMDAyXHVmZjBlXHVmZjYxXScpCgpjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgoKICAgIGRlZiBlbmNvZGUoc2VsZiwgZGF0YSwgZXJyb3JzPSdzdHJpY3QnKToKCiAgICAgICAgaWYgZXJyb3JzICE9ICdzdHJpY3QnOgogICAgICAgICAgICByYWlzZSBJRE5BRXJyb3IoIlVuc3VwcG9ydGVkIGVycm9yIGhhbmRsaW5nIFwiezB9XCIiLmZvcm1hdChlcnJvcnMpKQoKICAgICAgICBpZiBub3QgZGF0YToKICAgICAgICAgICAgcmV0dXJuICIiLCAwCgogICAgICAgIHJldHVybiBlbmNvZGUoZGF0YSksIGxlbihkYXRhKQoKICAgIGRlZiBkZWNvZGUoc2VsZiwgZGF0YSwgZXJyb3JzPSdzdHJpY3QnKToKCiAgICAgICAgaWYgZXJyb3JzICE9ICdzdHJpY3QnOgogICAgICAgICAgICByYWlzZSBJRE5BRXJyb3IoIlVuc3VwcG9ydGVkIGVycm9yIGhhbmRsaW5nIFwiezB9XCIiLmZvcm1hdChlcnJvcnMpKQoKICAgICAgICBpZiBub3QgZGF0YToKICAgICAgICAgICAgcmV0dXJuIHUiIiwgMAoKICAgICAgICByZXR1cm4gZGVjb2RlKGRhdGEpLCBsZW4oZGF0YSkKCmNsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuQnVmZmVyZWRJbmNyZW1lbnRhbEVuY29kZXIpOgogICAgZGVmIF9idWZmZXJfZW5jb2RlKHNlbGYsIGRhdGEsIGVycm9ycywgZmluYWwpOgogICAgICAgIGlmIGVycm9ycyAhPSAnc3RyaWN0JzoKICAgICAgICAgICAgcmFpc2UgSUROQUVycm9yKCJVbnN1cHBvcnRlZCBlcnJvciBoYW5kbGluZyBcInswfVwiIi5mb3JtYXQoZXJyb3JzKSkKCiAgICAgICAgaWYgbm90IGRhdGE6CiAgICAgICAgICAgIHJldHVybiAoIiIsIDApCgogICAgICAgIGxhYmVscyA9IF91bmljb2RlX2RvdHNfcmUuc3BsaXQoZGF0YSkKICAgICAgICB0cmFpbGluZ19kb3QgPSB1JycKICAgICAgICBpZiBsYWJlbHM6CiAgICAgICAgICAgIGlmIG5vdCBsYWJlbHNbLTFdOgogICAgICAgICAgICAgICAgdHJhaWxpbmdfZG90ID0gJy4nCiAgICAgICAgICAgICAgICBkZWwgbGFiZWxzWy0xXQogICAgICAgICAgICBlbGlmIG5vdCBmaW5hbDoKICAgICAgICAgICAgICAgICMgS2VlcCBwb3RlbnRpYWxseSB1bmZpbmlzaGVkIGxhYmVsIHVudGlsIHRoZSBuZXh0IGNhbGwKICAgICAgICAgICAgICAgIGRlbCBsYWJlbHNbLTFdCiAgICAgICAgICAgICAgICBpZiBsYWJlbHM6CiAgICAgICAgICAgICAgICAgICAgdHJhaWxpbmdfZG90ID0gJy4nCgogICAgICAgIHJlc3VsdCA9IFtdCiAgICAgICAgc2l6ZSA9IDAKICAgICAgICBmb3IgbGFiZWwgaW4gbGFiZWxzOgogICAgICAgICAgICByZXN1bHQuYXBwZW5kKGFsYWJlbChsYWJlbCkpCiAgICAgICAgICAgIGlmIHNpemU6CiAgICAgICAgICAgICAgICBzaXplICs9IDEKICAgICAgICAgICAgc2l6ZSArPSBsZW4obGFiZWwpCgogICAgICAgICMgSm9pbiB3aXRoIFUrMDAyRQogICAgICAgIHJlc3VsdCA9ICIuIi5qb2luKHJlc3VsdCkgKyB0cmFpbGluZ19kb3QKICAgICAgICBzaXplICs9IGxlbih0cmFpbGluZ19kb3QpCiAgICAgICAgcmV0dXJuIChyZXN1bHQsIHNpemUpCgpjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkJ1ZmZlcmVkSW5jcmVtZW50YWxEZWNvZGVyKToKICAgIGRlZiBfYnVmZmVyX2RlY29kZShzZWxmLCBkYXRhLCBlcnJvcnMsIGZpbmFsKToKICAgICAgICBpZiBlcnJvcnMgIT0gJ3N0cmljdCc6CiAgICAgICAgICAgIHJhaXNlIElETkFFcnJvcigiVW5zdXBwb3J0ZWQgZXJyb3IgaGFuZGxpbmcgXCJ7MH1cIiIuZm9ybWF0KGVycm9ycykpCgogICAgICAgIGlmIG5vdCBkYXRhOgogICAgICAgICAgICByZXR1cm4gKHUiIiwgMCkKCiAgICAgICAgIyBJRE5BIGFsbG93cyBkZWNvZGluZyB0byBvcGVyYXRlIG9uIFVuaWNvZGUgc3RyaW5ncywgdG9vLgogICAgICAgIGlmIGlzaW5zdGFuY2UoZGF0YSwgdW5pY29kZSk6CiAgICAgICAgICAgIGxhYmVscyA9IF91bmljb2RlX2RvdHNfcmUuc3BsaXQoZGF0YSkKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIE11c3QgYmUgQVNDSUkgc3RyaW5nCiAgICAgICAgICAgIGRhdGEgPSBzdHIoZGF0YSkKICAgICAgICAgICAgdW5pY29kZShkYXRhLCAiYXNjaWkiKQogICAgICAgICAgICBsYWJlbHMgPSBkYXRhLnNwbGl0KCIuIikKCiAgICAgICAgdHJhaWxpbmdfZG90ID0gdScnCiAgICAgICAgaWYgbGFiZWxzOgogICAgICAgICAgICBpZiBub3QgbGFiZWxzWy0xXToKICAgICAgICAgICAgICAgIHRyYWlsaW5nX2RvdCA9IHUnLicKICAgICAgICAgICAgICAgIGRlbCBsYWJlbHNbLTFdCiAgICAgICAgICAgIGVsaWYgbm90IGZpbmFsOgogICAgICAgICAgICAgICAgIyBLZWVwIHBvdGVudGlhbGx5IHVuZmluaXNoZWQgbGFiZWwgdW50aWwgdGhlIG5leHQgY2FsbAogICAgICAgICAgICAgICAgZGVsIGxhYmVsc1stMV0KICAgICAgICAgICAgICAgIGlmIGxhYmVsczoKICAgICAgICAgICAgICAgICAgICB0cmFpbGluZ19kb3QgPSB1Jy4nCgogICAgICAgIHJlc3VsdCA9IFtdCiAgICAgICAgc2l6ZSA9IDAKICAgICAgICBmb3IgbGFiZWwgaW4gbGFiZWxzOgogICAgICAgICAgICByZXN1bHQuYXBwZW5kKHVsYWJlbChsYWJlbCkpCiAgICAgICAgICAgIGlmIHNpemU6CiAgICAgICAgICAgICAgICBzaXplICs9IDEKICAgICAgICAgICAgc2l6ZSArPSBsZW4obGFiZWwpCgogICAgICAgIHJlc3VsdCA9IHUiLiIuam9pbihyZXN1bHQpICsgdHJhaWxpbmdfZG90CiAgICAgICAgc2l6ZSArPSBsZW4odHJhaWxpbmdfZG90KQogICAgICAgIHJldHVybiAocmVzdWx0LCBzaXplKQoKCmNsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgY29kZWNzLlN0cmVhbVdyaXRlcik6CiAgICBwYXNzCgpjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsIGNvZGVjcy5TdHJlYW1SZWFkZXIpOgogICAgcGFzcwoKZGVmIGdldHJlZ2VudHJ5KCk6CiAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKICAgICAgICBuYW1lPSdpZG5hJywKICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCiAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAogICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCiAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAogICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCiAgICApClBLAwQUAAAAAAAAACEAfIGWcOgAAADoAAAANwAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaWRuYS9jb21wYXQucHlmcm9tIC5jb3JlIGltcG9ydCAqCmZyb20gLmNvZGVjIGltcG9ydCAqCgpkZWYgVG9BU0NJSShsYWJlbCk6CiAgICByZXR1cm4gZW5jb2RlKGxhYmVsKQoKZGVmIFRvVW5pY29kZShsYWJlbCk6CiAgICByZXR1cm4gZGVjb2RlKGxhYmVsKQoKZGVmIG5hbWVwcmVwKHMpOgogICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigiSUROQSAyMDA4IGRvZXMgbm90IHV0aWxpc2UgbmFtZXByZXAgcHJvdG9jb2wiKQoKUEsDBBQAAAAAAAAAIQAJLvpxfiwAAH4sAAA1AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9pZG5hL2NvcmUucHlmcm9tIC4gaW1wb3J0IGlkbmFkYXRhCmltcG9ydCBiaXNlY3QKaW1wb3J0IHVuaWNvZGVkYXRhCmltcG9ydCByZQppbXBvcnQgc3lzCmZyb20gLmludHJhbmdlcyBpbXBvcnQgaW50cmFuZ2VzX2NvbnRhaW4KCl92aXJhbWFfY29tYmluaW5nX2NsYXNzID0gOQpfYWxhYmVsX3ByZWZpeCA9IGIneG4tLScKX3VuaWNvZGVfZG90c19yZSA9IHJlLmNvbXBpbGUodSdbXHUwMDJlXHUzMDAyXHVmZjBlXHVmZjYxXScpCgppZiBzeXMudmVyc2lvbl9pbmZvWzBdID09IDM6CiAgICB1bmljb2RlID0gc3RyCiAgICB1bmljaHIgPSBjaHIKCmNsYXNzIElETkFFcnJvcihVbmljb2RlRXJyb3IpOgogICAgIiIiIEJhc2UgZXhjZXB0aW9uIGZvciBhbGwgSUROQS1lbmNvZGluZyByZWxhdGVkIHByb2JsZW1zICIiIgogICAgcGFzcwoKCmNsYXNzIElETkFCaWRpRXJyb3IoSUROQUVycm9yKToKICAgICIiIiBFeGNlcHRpb24gd2hlbiBiaWRpcmVjdGlvbmFsIHJlcXVpcmVtZW50cyBhcmUgbm90IHNhdGlzZmllZCAiIiIKICAgIHBhc3MKCgpjbGFzcyBJbnZhbGlkQ29kZXBvaW50KElETkFFcnJvcik6CiAgICAiIiIgRXhjZXB0aW9uIHdoZW4gYSBkaXNhbGxvd2VkIG9yIHVuYWxsb2NhdGVkIGNvZGVwb2ludCBpcyB1c2VkICIiIgogICAgcGFzcwoKCmNsYXNzIEludmFsaWRDb2RlcG9pbnRDb250ZXh0KElETkFFcnJvcik6CiAgICAiIiIgRXhjZXB0aW9uIHdoZW4gdGhlIGNvZGVwb2ludCBpcyBub3QgdmFsaWQgaW4gdGhlIGNvbnRleHQgaXQgaXMgdXNlZCAiIiIKICAgIHBhc3MKCgpkZWYgX2NvbWJpbmluZ19jbGFzcyhjcCk6CiAgICByZXR1cm4gdW5pY29kZWRhdGEuY29tYmluaW5nKHVuaWNocihjcCkpCgpkZWYgX2lzX3NjcmlwdChjcCwgc2NyaXB0KToKICAgIHJldHVybiBpbnRyYW5nZXNfY29udGFpbihvcmQoY3ApLCBpZG5hZGF0YS5zY3JpcHRzW3NjcmlwdF0pCgpkZWYgX3B1bnljb2RlKHMpOgogICAgcmV0dXJuIHMuZW5jb2RlKCdwdW55Y29kZScpCgpkZWYgX3Vub3Qocyk6CiAgICByZXR1cm4gJ1UrezA6MDRYfScuZm9ybWF0KHMpCgoKZGVmIHZhbGlkX2xhYmVsX2xlbmd0aChsYWJlbCk6CgogICAgaWYgbGVuKGxhYmVsKSA+IDYzOgogICAgICAgIHJldHVybiBGYWxzZQogICAgcmV0dXJuIFRydWUKCgpkZWYgdmFsaWRfc3RyaW5nX2xlbmd0aChsYWJlbCwgdHJhaWxpbmdfZG90KToKCiAgICBpZiBsZW4obGFiZWwpID4gKDI1NCBpZiB0cmFpbGluZ19kb3QgZWxzZSAyNTMpOgogICAgICAgIHJldHVybiBGYWxzZQogICAgcmV0dXJuIFRydWUKCgpkZWYgY2hlY2tfYmlkaShsYWJlbCwgY2hlY2tfbHRyPUZhbHNlKToKCiAgICAjIEJpZGkgcnVsZXMgc2hvdWxkIG9ubHkgYmUgYXBwbGllZCBpZiBzdHJpbmcgY29udGFpbnMgUlRMIGNoYXJhY3RlcnMKICAgIGJpZGlfbGFiZWwgPSBGYWxzZQogICAgZm9yIChpZHgsIGNwKSBpbiBlbnVtZXJhdGUobGFiZWwsIDEpOgogICAgICAgIGRpcmVjdGlvbiA9IHVuaWNvZGVkYXRhLmJpZGlyZWN0aW9uYWwoY3ApCiAgICAgICAgaWYgZGlyZWN0aW9uID09ICcnOgogICAgICAgICAgICAjIFN0cmluZyBsaWtlbHkgY29tZXMgZnJvbSBhIG5ld2VyIHZlcnNpb24gb2YgVW5pY29kZQogICAgICAgICAgICByYWlzZSBJRE5BQmlkaUVycm9yKCdVbmtub3duIGRpcmVjdGlvbmFsaXR5IGluIGxhYmVsIHswfSBhdCBwb3NpdGlvbiB7MX0nLmZvcm1hdChyZXByKGxhYmVsKSwgaWR4KSkKICAgICAgICBpZiBkaXJlY3Rpb24gaW4gWydSJywgJ0FMJywgJ0FOJ106CiAgICAgICAgICAgIGJpZGlfbGFiZWwgPSBUcnVlCiAgICAgICAgICAgIGJyZWFrCiAgICBpZiBub3QgYmlkaV9sYWJlbCBhbmQgbm90IGNoZWNrX2x0cjoKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICMgQmlkaSBydWxlIDEKICAgIGRpcmVjdGlvbiA9IHVuaWNvZGVkYXRhLmJpZGlyZWN0aW9uYWwobGFiZWxbMF0pCiAgICBpZiBkaXJlY3Rpb24gaW4gWydSJywgJ0FMJ106CiAgICAgICAgcnRsID0gVHJ1ZQogICAgZWxpZiBkaXJlY3Rpb24gPT0gJ0wnOgogICAgICAgIHJ0bCA9IEZhbHNlCiAgICBlbHNlOgogICAgICAgIHJhaXNlIElETkFCaWRpRXJyb3IoJ0ZpcnN0IGNvZGVwb2ludCBpbiBsYWJlbCB7MH0gbXVzdCBiZSBkaXJlY3Rpb25hbGl0eSBMLCBSIG9yIEFMJy5mb3JtYXQocmVwcihsYWJlbCkpKQoKICAgIHZhbGlkX2VuZGluZyA9IEZhbHNlCiAgICBudW1iZXJfdHlwZSA9IEZhbHNlCiAgICBmb3IgKGlkeCwgY3ApIGluIGVudW1lcmF0ZShsYWJlbCwgMSk6CiAgICAgICAgZGlyZWN0aW9uID0gdW5pY29kZWRhdGEuYmlkaXJlY3Rpb25hbChjcCkKCiAgICAgICAgaWYgcnRsOgogICAgICAgICAgICAjIEJpZGkgcnVsZSAyCiAgICAgICAgICAgIGlmIG5vdCBkaXJlY3Rpb24gaW4gWydSJywgJ0FMJywgJ0FOJywgJ0VOJywgJ0VTJywgJ0NTJywgJ0VUJywgJ09OJywgJ0JOJywgJ05TTSddOgogICAgICAgICAgICAgICAgcmFpc2UgSUROQUJpZGlFcnJvcignSW52YWxpZCBkaXJlY3Rpb24gZm9yIGNvZGVwb2ludCBhdCBwb3NpdGlvbiB7MH0gaW4gYSByaWdodC10by1sZWZ0IGxhYmVsJy5mb3JtYXQoaWR4KSkKICAgICAgICAgICAgIyBCaWRpIHJ1bGUgMwogICAgICAgICAgICBpZiBkaXJlY3Rpb24gaW4gWydSJywgJ0FMJywgJ0VOJywgJ0FOJ106CiAgICAgICAgICAgICAgICB2YWxpZF9lbmRpbmcgPSBUcnVlCiAgICAgICAgICAgIGVsaWYgZGlyZWN0aW9uICE9ICdOU00nOgogICAgICAgICAgICAgICAgdmFsaWRfZW5kaW5nID0gRmFsc2UKICAgICAgICAgICAgIyBCaWRpIHJ1bGUgNAogICAgICAgICAgICBpZiBkaXJlY3Rpb24gaW4gWydBTicsICdFTiddOgogICAgICAgICAgICAgICAgaWYgbm90IG51bWJlcl90eXBlOgogICAgICAgICAgICAgICAgICAgIG51bWJlcl90eXBlID0gZGlyZWN0aW9uCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGlmIG51bWJlcl90eXBlICE9IGRpcmVjdGlvbjoKICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgSUROQUJpZGlFcnJvcignQ2FuIG5vdCBtaXggbnVtZXJhbCB0eXBlcyBpbiBhIHJpZ2h0LXRvLWxlZnQgbGFiZWwnKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgQmlkaSBydWxlIDUKICAgICAgICAgICAgaWYgbm90IGRpcmVjdGlvbiBpbiBbJ0wnLCAnRU4nLCAnRVMnLCAnQ1MnLCAnRVQnLCAnT04nLCAnQk4nLCAnTlNNJ106CiAgICAgICAgICAgICAgICByYWlzZSBJRE5BQmlkaUVycm9yKCdJbnZhbGlkIGRpcmVjdGlvbiBmb3IgY29kZXBvaW50IGF0IHBvc2l0aW9uIHswfSBpbiBhIGxlZnQtdG8tcmlnaHQgbGFiZWwnLmZvcm1hdChpZHgpKQogICAgICAgICAgICAjIEJpZGkgcnVsZSA2CiAgICAgICAgICAgIGlmIGRpcmVjdGlvbiBpbiBbJ0wnLCAnRU4nXToKICAgICAgICAgICAgICAgIHZhbGlkX2VuZGluZyA9IFRydWUKICAgICAgICAgICAgZWxpZiBkaXJlY3Rpb24gIT0gJ05TTSc6CiAgICAgICAgICAgICAgICB2YWxpZF9lbmRpbmcgPSBGYWxzZQoKICAgIGlmIG5vdCB2YWxpZF9lbmRpbmc6CiAgICAgICAgcmFpc2UgSUROQUJpZGlFcnJvcignTGFiZWwgZW5kcyB3aXRoIGlsbGVnYWwgY29kZXBvaW50IGRpcmVjdGlvbmFsaXR5JykKCiAgICByZXR1cm4gVHJ1ZQoKCmRlZiBjaGVja19pbml0aWFsX2NvbWJpbmVyKGxhYmVsKToKCiAgICBpZiB1bmljb2RlZGF0YS5jYXRlZ29yeShsYWJlbFswXSlbMF0gPT0gJ00nOgogICAgICAgIHJhaXNlIElETkFFcnJvcignTGFiZWwgYmVnaW5zIHdpdGggYW4gaWxsZWdhbCBjb21iaW5pbmcgY2hhcmFjdGVyJykKICAgIHJldHVybiBUcnVlCgoKZGVmIGNoZWNrX2h5cGhlbl9vayhsYWJlbCk6CgogICAgaWYgbGFiZWxbMjo0XSA9PSAnLS0nOgogICAgICAgIHJhaXNlIElETkFFcnJvcignTGFiZWwgaGFzIGRpc2FsbG93ZWQgaHlwaGVucyBpbiAzcmQgYW5kIDR0aCBwb3NpdGlvbicpCiAgICBpZiBsYWJlbFswXSA9PSAnLScgb3IgbGFiZWxbLTFdID09ICctJzoKICAgICAgICByYWlzZSBJRE5BRXJyb3IoJ0xhYmVsIG11c3Qgbm90IHN0YXJ0IG9yIGVuZCB3aXRoIGEgaHlwaGVuJykKICAgIHJldHVybiBUcnVlCgoKZGVmIGNoZWNrX25mYyhsYWJlbCk6CgogICAgaWYgdW5pY29kZWRhdGEubm9ybWFsaXplKCdORkMnLCBsYWJlbCkgIT0gbGFiZWw6CiAgICAgICAgcmFpc2UgSUROQUVycm9yKCdMYWJlbCBtdXN0IGJlIGluIE5vcm1hbGl6YXRpb24gRm9ybSBDJykKCgpkZWYgdmFsaWRfY29udGV4dGoobGFiZWwsIHBvcyk6CgogICAgY3BfdmFsdWUgPSBvcmQobGFiZWxbcG9zXSkKCiAgICBpZiBjcF92YWx1ZSA9PSAweDIwMGM6CgogICAgICAgIGlmIHBvcyA+IDA6CiAgICAgICAgICAgIGlmIF9jb21iaW5pbmdfY2xhc3Mob3JkKGxhYmVsW3BvcyAtIDFdKSkgPT0gX3ZpcmFtYV9jb21iaW5pbmdfY2xhc3M6CiAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICAgICBvayA9IEZhbHNlCiAgICAgICAgZm9yIGkgaW4gcmFuZ2UocG9zLTEsIC0xLCAtMSk6CiAgICAgICAgICAgIGpvaW5pbmdfdHlwZSA9IGlkbmFkYXRhLmpvaW5pbmdfdHlwZXMuZ2V0KG9yZChsYWJlbFtpXSkpCiAgICAgICAgICAgIGlmIGpvaW5pbmdfdHlwZSA9PSBvcmQoJ1QnKToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlmIGpvaW5pbmdfdHlwZSBpbiBbb3JkKCdMJyksIG9yZCgnRCcpXToKICAgICAgICAgICAgICAgIG9rID0gVHJ1ZQogICAgICAgICAgICAgICAgYnJlYWsKCiAgICAgICAgaWYgbm90IG9rOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgb2sgPSBGYWxzZQogICAgICAgIGZvciBpIGluIHJhbmdlKHBvcysxLCBsZW4obGFiZWwpKToKICAgICAgICAgICAgam9pbmluZ190eXBlID0gaWRuYWRhdGEuam9pbmluZ190eXBlcy5nZXQob3JkKGxhYmVsW2ldKSkKICAgICAgICAgICAgaWYgam9pbmluZ190eXBlID09IG9yZCgnVCcpOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYgam9pbmluZ190eXBlIGluIFtvcmQoJ1InKSwgb3JkKCdEJyldOgogICAgICAgICAgICAgICAgb2sgPSBUcnVlCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgIHJldHVybiBvawoKICAgIGlmIGNwX3ZhbHVlID09IDB4MjAwZDoKCiAgICAgICAgaWYgcG9zID4gMDoKICAgICAgICAgICAgaWYgX2NvbWJpbmluZ19jbGFzcyhvcmQobGFiZWxbcG9zIC0gMV0pKSA9PSBfdmlyYW1hX2NvbWJpbmluZ19jbGFzczoKICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZWxzZToKCiAgICAgICAgcmV0dXJuIEZhbHNlCgoKZGVmIHZhbGlkX2NvbnRleHRvKGxhYmVsLCBwb3MsIGV4Y2VwdGlvbj1GYWxzZSk6CgogICAgY3BfdmFsdWUgPSBvcmQobGFiZWxbcG9zXSkKCiAgICBpZiBjcF92YWx1ZSA9PSAweDAwYjc6CiAgICAgICAgaWYgMCA8IHBvcyA8IGxlbihsYWJlbCktMToKICAgICAgICAgICAgaWYgb3JkKGxhYmVsW3BvcyAtIDFdKSA9PSAweDAwNmMgYW5kIG9yZChsYWJlbFtwb3MgKyAxXSkgPT0gMHgwMDZjOgogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBlbGlmIGNwX3ZhbHVlID09IDB4MDM3NToKICAgICAgICBpZiBwb3MgPCBsZW4obGFiZWwpLTEgYW5kIGxlbihsYWJlbCkgPiAxOgogICAgICAgICAgICByZXR1cm4gX2lzX3NjcmlwdChsYWJlbFtwb3MgKyAxXSwgJ0dyZWVrJykKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBlbGlmIGNwX3ZhbHVlID09IDB4MDVmMyBvciBjcF92YWx1ZSA9PSAweDA1ZjQ6CiAgICAgICAgaWYgcG9zID4gMDoKICAgICAgICAgICAgcmV0dXJuIF9pc19zY3JpcHQobGFiZWxbcG9zIC0gMV0sICdIZWJyZXcnKQogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGVsaWYgY3BfdmFsdWUgPT0gMHgzMGZiOgogICAgICAgIGZvciBjcCBpbiBsYWJlbDoKICAgICAgICAgICAgaWYgY3AgPT0gdSdcdTMwZmInOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYgX2lzX3NjcmlwdChjcCwgJ0hpcmFnYW5hJykgb3IgX2lzX3NjcmlwdChjcCwgJ0thdGFrYW5hJykgb3IgX2lzX3NjcmlwdChjcCwgJ0hhbicpOgogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBlbGlmIDB4NjYwIDw9IGNwX3ZhbHVlIDw9IDB4NjY5OgogICAgICAgIGZvciBjcCBpbiBsYWJlbDoKICAgICAgICAgICAgaWYgMHg2ZjAgPD0gb3JkKGNwKSA8PSAweDA2Zjk6CiAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGVsaWYgMHg2ZjAgPD0gY3BfdmFsdWUgPD0gMHg2Zjk6CiAgICAgICAgZm9yIGNwIGluIGxhYmVsOgogICAgICAgICAgICBpZiAweDY2MCA8PSBvcmQoY3ApIDw9IDB4MDY2OToKICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIHJldHVybiBUcnVlCgoKZGVmIGNoZWNrX2xhYmVsKGxhYmVsKToKCiAgICBpZiBpc2luc3RhbmNlKGxhYmVsLCAoYnl0ZXMsIGJ5dGVhcnJheSkpOgogICAgICAgIGxhYmVsID0gbGFiZWwuZGVjb2RlKCd1dGYtOCcpCiAgICBpZiBsZW4obGFiZWwpID09IDA6CiAgICAgICAgcmFpc2UgSUROQUVycm9yKCdFbXB0eSBMYWJlbCcpCgogICAgY2hlY2tfbmZjKGxhYmVsKQogICAgY2hlY2tfaHlwaGVuX29rKGxhYmVsKQogICAgY2hlY2tfaW5pdGlhbF9jb21iaW5lcihsYWJlbCkKCiAgICBmb3IgKHBvcywgY3ApIGluIGVudW1lcmF0ZShsYWJlbCk6CiAgICAgICAgY3BfdmFsdWUgPSBvcmQoY3ApCiAgICAgICAgaWYgaW50cmFuZ2VzX2NvbnRhaW4oY3BfdmFsdWUsIGlkbmFkYXRhLmNvZGVwb2ludF9jbGFzc2VzWydQVkFMSUQnXSk6CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgZWxpZiBpbnRyYW5nZXNfY29udGFpbihjcF92YWx1ZSwgaWRuYWRhdGEuY29kZXBvaW50X2NsYXNzZXNbJ0NPTlRFWFRKJ10pOgogICAgICAgICAgICBpZiBub3QgdmFsaWRfY29udGV4dGoobGFiZWwsIHBvcyk6CiAgICAgICAgICAgICAgICByYWlzZSBJbnZhbGlkQ29kZXBvaW50Q29udGV4dCgnSm9pbmVyIHswfSBub3QgYWxsb3dlZCBhdCBwb3NpdGlvbiB7MX0gaW4gezJ9Jy5mb3JtYXQoX3Vub3QoY3BfdmFsdWUpLCBwb3MrMSwgcmVwcihsYWJlbCkpKQogICAgICAgIGVsaWYgaW50cmFuZ2VzX2NvbnRhaW4oY3BfdmFsdWUsIGlkbmFkYXRhLmNvZGVwb2ludF9jbGFzc2VzWydDT05URVhUTyddKToKICAgICAgICAgICAgaWYgbm90IHZhbGlkX2NvbnRleHRvKGxhYmVsLCBwb3MpOgogICAgICAgICAgICAgICAgcmFpc2UgSW52YWxpZENvZGVwb2ludENvbnRleHQoJ0NvZGVwb2ludCB7MH0gbm90IGFsbG93ZWQgYXQgcG9zaXRpb24gezF9IGluIHsyfScuZm9ybWF0KF91bm90KGNwX3ZhbHVlKSwgcG9zKzEsIHJlcHIobGFiZWwpKSkKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBJbnZhbGlkQ29kZXBvaW50KCdDb2RlcG9pbnQgezB9IGF0IHBvc2l0aW9uIHsxfSBvZiB7Mn0gbm90IGFsbG93ZWQnLmZvcm1hdChfdW5vdChjcF92YWx1ZSksIHBvcysxLCByZXByKGxhYmVsKSkpCgogICAgY2hlY2tfYmlkaShsYWJlbCkKCgpkZWYgYWxhYmVsKGxhYmVsKToKCiAgICB0cnk6CiAgICAgICAgbGFiZWwgPSBsYWJlbC5lbmNvZGUoJ2FzY2lpJykKICAgICAgICB0cnk6CiAgICAgICAgICAgIHVsYWJlbChsYWJlbCkKICAgICAgICBleGNlcHQgSUROQUVycm9yOgogICAgICAgICAgICByYWlzZSBJRE5BRXJyb3IoJ1RoZSBsYWJlbCB7MH0gaXMgbm90IGEgdmFsaWQgQS1sYWJlbCcuZm9ybWF0KGxhYmVsKSkKICAgICAgICBpZiBub3QgdmFsaWRfbGFiZWxfbGVuZ3RoKGxhYmVsKToKICAgICAgICAgICAgcmFpc2UgSUROQUVycm9yKCdMYWJlbCB0b28gbG9uZycpCiAgICAgICAgcmV0dXJuIGxhYmVsCiAgICBleGNlcHQgVW5pY29kZUVuY29kZUVycm9yOgogICAgICAgIHBhc3MKCiAgICBpZiBub3QgbGFiZWw6CiAgICAgICAgcmFpc2UgSUROQUVycm9yKCdObyBJbnB1dCcpCgogICAgbGFiZWwgPSB1bmljb2RlKGxhYmVsKQogICAgY2hlY2tfbGFiZWwobGFiZWwpCiAgICBsYWJlbCA9IF9wdW55Y29kZShsYWJlbCkKICAgIGxhYmVsID0gX2FsYWJlbF9wcmVmaXggKyBsYWJlbAoKICAgIGlmIG5vdCB2YWxpZF9sYWJlbF9sZW5ndGgobGFiZWwpOgogICAgICAgIHJhaXNlIElETkFFcnJvcignTGFiZWwgdG9vIGxvbmcnKQoKICAgIHJldHVybiBsYWJlbAoKCmRlZiB1bGFiZWwobGFiZWwpOgoKICAgIGlmIG5vdCBpc2luc3RhbmNlKGxhYmVsLCAoYnl0ZXMsIGJ5dGVhcnJheSkpOgogICAgICAgIHRyeToKICAgICAgICAgICAgbGFiZWwgPSBsYWJlbC5lbmNvZGUoJ2FzY2lpJykKICAgICAgICBleGNlcHQgVW5pY29kZUVuY29kZUVycm9yOgogICAgICAgICAgICBjaGVja19sYWJlbChsYWJlbCkKICAgICAgICAgICAgcmV0dXJuIGxhYmVsCgogICAgbGFiZWwgPSBsYWJlbC5sb3dlcigpCiAgICBpZiBsYWJlbC5zdGFydHN3aXRoKF9hbGFiZWxfcHJlZml4KToKICAgICAgICBsYWJlbCA9IGxhYmVsW2xlbihfYWxhYmVsX3ByZWZpeCk6XQogICAgZWxzZToKICAgICAgICBjaGVja19sYWJlbChsYWJlbCkKICAgICAgICByZXR1cm4gbGFiZWwuZGVjb2RlKCdhc2NpaScpCgogICAgbGFiZWwgPSBsYWJlbC5kZWNvZGUoJ3B1bnljb2RlJykKICAgIGNoZWNrX2xhYmVsKGxhYmVsKQogICAgcmV0dXJuIGxhYmVsCgoKZGVmIHV0czQ2X3JlbWFwKGRvbWFpbiwgc3RkM19ydWxlcz1UcnVlLCB0cmFuc2l0aW9uYWw9RmFsc2UpOgogICAgIiIiUmUtbWFwIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYWNjb3JkaW5nIHRvIFVUUzQ2IHByb2Nlc3NpbmcuIiIiCiAgICBmcm9tIC51dHM0NmRhdGEgaW1wb3J0IHV0czQ2ZGF0YQogICAgb3V0cHV0ID0gdSIiCiAgICB0cnk6CiAgICAgICAgZm9yIHBvcywgY2hhciBpbiBlbnVtZXJhdGUoZG9tYWluKToKICAgICAgICAgICAgY29kZV9wb2ludCA9IG9yZChjaGFyKQogICAgICAgICAgICB1dHM0NnJvdyA9IHV0czQ2ZGF0YVtjb2RlX3BvaW50IGlmIGNvZGVfcG9pbnQgPCAyNTYgZWxzZQogICAgICAgICAgICAgICAgYmlzZWN0LmJpc2VjdF9sZWZ0KHV0czQ2ZGF0YSwgKGNvZGVfcG9pbnQsICJaIikpIC0gMV0KICAgICAgICAgICAgc3RhdHVzID0gdXRzNDZyb3dbMV0KICAgICAgICAgICAgcmVwbGFjZW1lbnQgPSB1dHM0NnJvd1syXSBpZiBsZW4odXRzNDZyb3cpID09IDMgZWxzZSBOb25lCiAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gIlYiIG9yCiAgICAgICAgICAgICAgICAgICAgKHN0YXR1cyA9PSAiRCIgYW5kIG5vdCB0cmFuc2l0aW9uYWwpIG9yCiAgICAgICAgICAgICAgICAgICAgKHN0YXR1cyA9PSAiMyIgYW5kIHN0ZDNfcnVsZXMgYW5kIHJlcGxhY2VtZW50IGlzIE5vbmUpKToKICAgICAgICAgICAgICAgIG91dHB1dCArPSBjaGFyCiAgICAgICAgICAgIGVsaWYgcmVwbGFjZW1lbnQgaXMgbm90IE5vbmUgYW5kIChzdGF0dXMgPT0gIk0iIG9yCiAgICAgICAgICAgICAgICAgICAgKHN0YXR1cyA9PSAiMyIgYW5kIHN0ZDNfcnVsZXMpIG9yCiAgICAgICAgICAgICAgICAgICAgKHN0YXR1cyA9PSAiRCIgYW5kIHRyYW5zaXRpb25hbCkpOgogICAgICAgICAgICAgICAgb3V0cHV0ICs9IHJlcGxhY2VtZW50CiAgICAgICAgICAgIGVsaWYgc3RhdHVzICE9ICJJIjoKICAgICAgICAgICAgICAgIHJhaXNlIEluZGV4RXJyb3IoKQogICAgICAgIHJldHVybiB1bmljb2RlZGF0YS5ub3JtYWxpemUoIk5GQyIsIG91dHB1dCkKICAgIGV4Y2VwdCBJbmRleEVycm9yOgogICAgICAgIHJhaXNlIEludmFsaWRDb2RlcG9pbnQoCiAgICAgICAgICAgICJDb2RlcG9pbnQgezB9IG5vdCBhbGxvd2VkIGF0IHBvc2l0aW9uIHsxfSBpbiB7Mn0iLmZvcm1hdCgKICAgICAgICAgICAgX3Vub3QoY29kZV9wb2ludCksIHBvcyArIDEsIHJlcHIoZG9tYWluKSkpCgoKZGVmIGVuY29kZShzLCBzdHJpY3Q9RmFsc2UsIHV0czQ2PUZhbHNlLCBzdGQzX3J1bGVzPUZhbHNlLCB0cmFuc2l0aW9uYWw9RmFsc2UpOgoKICAgIGlmIGlzaW5zdGFuY2UocywgKGJ5dGVzLCBieXRlYXJyYXkpKToKICAgICAgICBzID0gcy5kZWNvZGUoImFzY2lpIikKICAgIGlmIHV0czQ2OgogICAgICAgIHMgPSB1dHM0Nl9yZW1hcChzLCBzdGQzX3J1bGVzLCB0cmFuc2l0aW9uYWwpCiAgICB0cmFpbGluZ19kb3QgPSBGYWxzZQogICAgcmVzdWx0ID0gW10KICAgIGlmIHN0cmljdDoKICAgICAgICBsYWJlbHMgPSBzLnNwbGl0KCcuJykKICAgIGVsc2U6CiAgICAgICAgbGFiZWxzID0gX3VuaWNvZGVfZG90c19yZS5zcGxpdChzKQogICAgd2hpbGUgbGFiZWxzIGFuZCBub3QgbGFiZWxzWzBdOgogICAgICAgIGRlbCBsYWJlbHNbMF0KICAgIGlmIG5vdCBsYWJlbHM6CiAgICAgICAgcmFpc2UgSUROQUVycm9yKCdFbXB0eSBkb21haW4nKQogICAgaWYgbGFiZWxzWy0xXSA9PSAnJzoKICAgICAgICBkZWwgbGFiZWxzWy0xXQogICAgICAgIHRyYWlsaW5nX2RvdCA9IFRydWUKICAgIGZvciBsYWJlbCBpbiBsYWJlbHM6CiAgICAgICAgcmVzdWx0LmFwcGVuZChhbGFiZWwobGFiZWwpKQogICAgaWYgdHJhaWxpbmdfZG90OgogICAgICAgIHJlc3VsdC5hcHBlbmQoYicnKQogICAgcyA9IGInLicuam9pbihyZXN1bHQpCiAgICBpZiBub3QgdmFsaWRfc3RyaW5nX2xlbmd0aChzLCB0cmFpbGluZ19kb3QpOgogICAgICAgIHJhaXNlIElETkFFcnJvcignRG9tYWluIHRvbyBsb25nJykKICAgIHJldHVybiBzCgoKZGVmIGRlY29kZShzLCBzdHJpY3Q9RmFsc2UsIHV0czQ2PUZhbHNlLCBzdGQzX3J1bGVzPUZhbHNlKToKCiAgICBpZiBpc2luc3RhbmNlKHMsIChieXRlcywgYnl0ZWFycmF5KSk6CiAgICAgICAgcyA9IHMuZGVjb2RlKCJhc2NpaSIpCiAgICBpZiB1dHM0NjoKICAgICAgICBzID0gdXRzNDZfcmVtYXAocywgc3RkM19ydWxlcywgRmFsc2UpCiAgICB0cmFpbGluZ19kb3QgPSBGYWxzZQogICAgcmVzdWx0ID0gW10KICAgIGlmIG5vdCBzdHJpY3Q6CiAgICAgICAgbGFiZWxzID0gX3VuaWNvZGVfZG90c19yZS5zcGxpdChzKQogICAgZWxzZToKICAgICAgICBsYWJlbHMgPSBzLnNwbGl0KHUnLicpCiAgICB3aGlsZSBsYWJlbHMgYW5kIG5vdCBsYWJlbHNbMF06CiAgICAgICAgZGVsIGxhYmVsc1swXQogICAgaWYgbm90IGxhYmVsczoKICAgICAgICByYWlzZSBJRE5BRXJyb3IoJ0VtcHR5IGRvbWFpbicpCiAgICBpZiBub3QgbGFiZWxzWy0xXToKICAgICAgICBkZWwgbGFiZWxzWy0xXQogICAgICAgIHRyYWlsaW5nX2RvdCA9IFRydWUKICAgIGZvciBsYWJlbCBpbiBsYWJlbHM6CiAgICAgICAgcmVzdWx0LmFwcGVuZCh1bGFiZWwobGFiZWwpKQogICAgaWYgdHJhaWxpbmdfZG90OgogICAgICAgIHJlc3VsdC5hcHBlbmQodScnKQogICAgcmV0dXJuIHUnLicuam9pbihyZXN1bHQpClBLAwQUAAAAAAAAACEAY7z6EeeAAADngAAAOQAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaWRuYS9pZG5hZGF0YS5weSMgVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRvb2xzL2lkbmEtZGF0YQoKX192ZXJzaW9uX18gPSAiNi4zLjAiCnNjcmlwdHMgPSB7CiAgICAnR3JlZWsnOiAoCiAgICAgICAgMHgzNzAwMDAwMDM3NCwKICAgICAgICAweDM3NTAwMDAwMzc4LAogICAgICAgIDB4MzdhMDAwMDAzN2UsCiAgICAgICAgMHgzODQwMDAwMDM4NSwKICAgICAgICAweDM4NjAwMDAwMzg3LAogICAgICAgIDB4Mzg4MDAwMDAzOGIsCiAgICAgICAgMHgzOGMwMDAwMDM4ZCwKICAgICAgICAweDM4ZTAwMDAwM2EyLAogICAgICAgIDB4M2EzMDAwMDAzZTIsCiAgICAgICAgMHgzZjAwMDAwMDQwMCwKICAgICAgICAweDFkMjYwMDAwMWQyYiwKICAgICAgICAweDFkNWQwMDAwMWQ2MiwKICAgICAgICAweDFkNjYwMDAwMWQ2YiwKICAgICAgICAweDFkYmYwMDAwMWRjMCwKICAgICAgICAweDFmMDAwMDAwMWYxNiwKICAgICAgICAweDFmMTgwMDAwMWYxZSwKICAgICAgICAweDFmMjAwMDAwMWY0NiwKICAgICAgICAweDFmNDgwMDAwMWY0ZSwKICAgICAgICAweDFmNTAwMDAwMWY1OCwKICAgICAgICAweDFmNTkwMDAwMWY1YSwKICAgICAgICAweDFmNWIwMDAwMWY1YywKICAgICAgICAweDFmNWQwMDAwMWY1ZSwKICAgICAgICAweDFmNWYwMDAwMWY3ZSwKICAgICAgICAweDFmODAwMDAwMWZiNSwKICAgICAgICAweDFmYjYwMDAwMWZjNSwKICAgICAgICAweDFmYzYwMDAwMWZkNCwKICAgICAgICAweDFmZDYwMDAwMWZkYywKICAgICAgICAweDFmZGQwMDAwMWZmMCwKICAgICAgICAweDFmZjIwMDAwMWZmNSwKICAgICAgICAweDFmZjYwMDAwMWZmZiwKICAgICAgICAweDIxMjYwMDAwMjEyNywKICAgICAgICAweDEwMTQwMDAwMTAxOGIsCiAgICAgICAgMHgxZDIwMDAwMDFkMjQ2LAogICAgKSwKICAgICdIYW4nOiAoCiAgICAgICAgMHgyZTgwMDAwMDJlOWEsCiAgICAgICAgMHgyZTliMDAwMDJlZjQsCiAgICAgICAgMHgyZjAwMDAwMDJmZDYsCiAgICAgICAgMHgzMDA1MDAwMDMwMDYsCiAgICAgICAgMHgzMDA3MDAwMDMwMDgsCiAgICAgICAgMHgzMDIxMDAwMDMwMmEsCiAgICAgICAgMHgzMDM4MDAwMDMwM2MsCiAgICAgICAgMHgzNDAwMDAwMDRkYjYsCiAgICAgICAgMHg0ZTAwMDAwMDlmY2QsCiAgICAgICAgMHhmOTAwMDAwMGZhNmUsCiAgICAgICAgMHhmYTcwMDAwMGZhZGEsCiAgICAgICAgMHgyMDAwMDAwMDJhNmQ3LAogICAgICAgIDB4MmE3MDAwMDAyYjczNSwKICAgICAgICAweDJiNzQwMDAwMmI4MWUsCiAgICAgICAgMHgyZjgwMDAwMDJmYTFlLAogICAgKSwKICAgICdIZWJyZXcnOiAoCiAgICAgICAgMHg1OTEwMDAwMDVjOCwKICAgICAgICAweDVkMDAwMDAwNWViLAogICAgICAgIDB4NWYwMDAwMDA1ZjUsCiAgICAgICAgMHhmYjFkMDAwMGZiMzcsCiAgICAgICAgMHhmYjM4MDAwMGZiM2QsCiAgICAgICAgMHhmYjNlMDAwMGZiM2YsCiAgICAgICAgMHhmYjQwMDAwMGZiNDIsCiAgICAgICAgMHhmYjQzMDAwMGZiNDUsCiAgICAgICAgMHhmYjQ2MDAwMGZiNTAsCiAgICApLAogICAgJ0hpcmFnYW5hJzogKAogICAgICAgIDB4MzA0MTAwMDAzMDk3LAogICAgICAgIDB4MzA5ZDAwMDAzMGEwLAogICAgICAgIDB4MWIwMDEwMDAxYjAwMiwKICAgICAgICAweDFmMjAwMDAwMWYyMDEsCiAgICApLAogICAgJ0thdGFrYW5hJzogKAogICAgICAgIDB4MzBhMTAwMDAzMGZiLAogICAgICAgIDB4MzBmZDAwMDAzMTAwLAogICAgICAgIDB4MzFmMDAwMDAzMjAwLAogICAgICAgIDB4MzJkMDAwMDAzMmZmLAogICAgICAgIDB4MzMwMDAwMDAzMzU4LAogICAgICAgIDB4ZmY2NjAwMDBmZjcwLAogICAgICAgIDB4ZmY3MTAwMDBmZjllLAogICAgICAgIDB4MWIwMDAwMDAxYjAwMSwKICAgICksCn0Kam9pbmluZ190eXBlcyA9IHsKICAgIDB4NjAwOiA4NSwKICAgIDB4NjAxOiA4NSwKICAgIDB4NjAyOiA4NSwKICAgIDB4NjAzOiA4NSwKICAgIDB4NjA0OiA4NSwKICAgIDB4NjA4OiA4NSwKICAgIDB4NjBiOiA4NSwKICAgIDB4NjIwOiA2OCwKICAgIDB4NjIxOiA4NSwKICAgIDB4NjIyOiA4MiwKICAgIDB4NjIzOiA4MiwKICAgIDB4NjI0OiA4MiwKICAgIDB4NjI1OiA4MiwKICAgIDB4NjI2OiA2OCwKICAgIDB4NjI3OiA4MiwKICAgIDB4NjI4OiA2OCwKICAgIDB4NjI5OiA4MiwKICAgIDB4NjJhOiA2OCwKICAgIDB4NjJiOiA2OCwKICAgIDB4NjJjOiA2OCwKICAgIDB4NjJkOiA2OCwKICAgIDB4NjJlOiA2OCwKICAgIDB4NjJmOiA4MiwKICAgIDB4NjMwOiA4MiwKICAgIDB4NjMxOiA4MiwKICAgIDB4NjMyOiA4MiwKICAgIDB4NjMzOiA2OCwKICAgIDB4NjM0OiA2OCwKICAgIDB4NjM1OiA2OCwKICAgIDB4NjM2OiA2OCwKICAgIDB4NjM3OiA2OCwKICAgIDB4NjM4OiA2OCwKICAgIDB4NjM5OiA2OCwKICAgIDB4NjNhOiA2OCwKICAgIDB4NjNiOiA2OCwKICAgIDB4NjNjOiA2OCwKICAgIDB4NjNkOiA2OCwKICAgIDB4NjNlOiA2OCwKICAgIDB4NjNmOiA2OCwKICAgIDB4NjQwOiA2NywKICAgIDB4NjQxOiA2OCwKICAgIDB4NjQyOiA2OCwKICAgIDB4NjQzOiA2OCwKICAgIDB4NjQ0OiA2OCwKICAgIDB4NjQ1OiA2OCwKICAgIDB4NjQ2OiA2OCwKICAgIDB4NjQ3OiA2OCwKICAgIDB4NjQ4OiA4MiwKICAgIDB4NjQ5OiA2OCwKICAgIDB4NjRhOiA2OCwKICAgIDB4NjZlOiA2OCwKICAgIDB4NjZmOiA2OCwKICAgIDB4NjcxOiA4MiwKICAgIDB4NjcyOiA4MiwKICAgIDB4NjczOiA4MiwKICAgIDB4Njc0OiA4NSwKICAgIDB4Njc1OiA4MiwKICAgIDB4Njc2OiA4MiwKICAgIDB4Njc3OiA4MiwKICAgIDB4Njc4OiA2OCwKICAgIDB4Njc5OiA2OCwKICAgIDB4NjdhOiA2OCwKICAgIDB4NjdiOiA2OCwKICAgIDB4NjdjOiA2OCwKICAgIDB4NjdkOiA2OCwKICAgIDB4NjdlOiA2OCwKICAgIDB4NjdmOiA2OCwKICAgIDB4NjgwOiA2OCwKICAgIDB4NjgxOiA2OCwKICAgIDB4NjgyOiA2OCwKICAgIDB4NjgzOiA2OCwKICAgIDB4Njg0OiA2OCwKICAgIDB4Njg1OiA2OCwKICAgIDB4Njg2OiA2OCwKICAgIDB4Njg3OiA2OCwKICAgIDB4Njg4OiA4MiwKICAgIDB4Njg5OiA4MiwKICAgIDB4NjhhOiA4MiwKICAgIDB4NjhiOiA4MiwKICAgIDB4NjhjOiA4MiwKICAgIDB4NjhkOiA4MiwKICAgIDB4NjhlOiA4MiwKICAgIDB4NjhmOiA4MiwKICAgIDB4NjkwOiA4MiwKICAgIDB4NjkxOiA4MiwKICAgIDB4NjkyOiA4MiwKICAgIDB4NjkzOiA4MiwKICAgIDB4Njk0OiA4MiwKICAgIDB4Njk1OiA4MiwKICAgIDB4Njk2OiA4MiwKICAgIDB4Njk3OiA4MiwKICAgIDB4Njk4OiA4MiwKICAgIDB4Njk5OiA4MiwKICAgIDB4NjlhOiA2OCwKICAgIDB4NjliOiA2OCwKICAgIDB4NjljOiA2OCwKICAgIDB4NjlkOiA2OCwKICAgIDB4NjllOiA2OCwKICAgIDB4NjlmOiA2OCwKICAgIDB4NmEwOiA2OCwKICAgIDB4NmExOiA2OCwKICAgIDB4NmEyOiA2OCwKICAgIDB4NmEzOiA2OCwKICAgIDB4NmE0OiA2OCwKICAgIDB4NmE1OiA2OCwKICAgIDB4NmE2OiA2OCwKICAgIDB4NmE3OiA2OCwKICAgIDB4NmE4OiA2OCwKICAgIDB4NmE5OiA2OCwKICAgIDB4NmFhOiA2OCwKICAgIDB4NmFiOiA2OCwKICAgIDB4NmFjOiA2OCwKICAgIDB4NmFkOiA2OCwKICAgIDB4NmFlOiA2OCwKICAgIDB4NmFmOiA2OCwKICAgIDB4NmIwOiA2OCwKICAgIDB4NmIxOiA2OCwKICAgIDB4NmIyOiA2OCwKICAgIDB4NmIzOiA2OCwKICAgIDB4NmI0OiA2OCwKICAgIDB4NmI1OiA2OCwKICAgIDB4NmI2OiA2OCwKICAgIDB4NmI3OiA2OCwKICAgIDB4NmI4OiA2OCwKICAgIDB4NmI5OiA2OCwKICAgIDB4NmJhOiA2OCwKICAgIDB4NmJiOiA2OCwKICAgIDB4NmJjOiA2OCwKICAgIDB4NmJkOiA2OCwKICAgIDB4NmJlOiA2OCwKICAgIDB4NmJmOiA2OCwKICAgIDB4NmMwOiA4MiwKICAgIDB4NmMxOiA2OCwKICAgIDB4NmMyOiA2OCwKICAgIDB4NmMzOiA4MiwKICAgIDB4NmM0OiA4MiwKICAgIDB4NmM1OiA4MiwKICAgIDB4NmM2OiA4MiwKICAgIDB4NmM3OiA4MiwKICAgIDB4NmM4OiA4MiwKICAgIDB4NmM5OiA4MiwKICAgIDB4NmNhOiA4MiwKICAgIDB4NmNiOiA4MiwKICAgIDB4NmNjOiA2OCwKICAgIDB4NmNkOiA4MiwKICAgIDB4NmNlOiA2OCwKICAgIDB4NmNmOiA4MiwKICAgIDB4NmQwOiA2OCwKICAgIDB4NmQxOiA2OCwKICAgIDB4NmQyOiA4MiwKICAgIDB4NmQzOiA4MiwKICAgIDB4NmQ1OiA4MiwKICAgIDB4NmRkOiA4NSwKICAgIDB4NmVlOiA4MiwKICAgIDB4NmVmOiA4MiwKICAgIDB4NmZhOiA2OCwKICAgIDB4NmZiOiA2OCwKICAgIDB4NmZjOiA2OCwKICAgIDB4NmZmOiA2OCwKICAgIDB4NzEwOiA4MiwKICAgIDB4NzEyOiA2OCwKICAgIDB4NzEzOiA2OCwKICAgIDB4NzE0OiA2OCwKICAgIDB4NzE1OiA4MiwKICAgIDB4NzE2OiA4MiwKICAgIDB4NzE3OiA4MiwKICAgIDB4NzE4OiA4MiwKICAgIDB4NzE5OiA4MiwKICAgIDB4NzFhOiA2OCwKICAgIDB4NzFiOiA2OCwKICAgIDB4NzFjOiA2OCwKICAgIDB4NzFkOiA2OCwKICAgIDB4NzFlOiA4MiwKICAgIDB4NzFmOiA2OCwKICAgIDB4NzIwOiA2OCwKICAgIDB4NzIxOiA2OCwKICAgIDB4NzIyOiA2OCwKICAgIDB4NzIzOiA2OCwKICAgIDB4NzI0OiA2OCwKICAgIDB4NzI1OiA2OCwKICAgIDB4NzI2OiA2OCwKICAgIDB4NzI3OiA2OCwKICAgIDB4NzI4OiA4MiwKICAgIDB4NzI5OiA2OCwKICAgIDB4NzJhOiA4MiwKICAgIDB4NzJiOiA2OCwKICAgIDB4NzJjOiA4MiwKICAgIDB4NzJkOiA2OCwKICAgIDB4NzJlOiA2OCwKICAgIDB4NzJmOiA4MiwKICAgIDB4NzRkOiA4MiwKICAgIDB4NzRlOiA2OCwKICAgIDB4NzRmOiA2OCwKICAgIDB4NzUwOiA2OCwKICAgIDB4NzUxOiA2OCwKICAgIDB4NzUyOiA2OCwKICAgIDB4NzUzOiA2OCwKICAgIDB4NzU0OiA2OCwKICAgIDB4NzU1OiA2OCwKICAgIDB4NzU2OiA2OCwKICAgIDB4NzU3OiA2OCwKICAgIDB4NzU4OiA2OCwKICAgIDB4NzU5OiA4MiwKICAgIDB4NzVhOiA4MiwKICAgIDB4NzViOiA4MiwKICAgIDB4NzVjOiA2OCwKICAgIDB4NzVkOiA2OCwKICAgIDB4NzVlOiA2OCwKICAgIDB4NzVmOiA2OCwKICAgIDB4NzYwOiA2OCwKICAgIDB4NzYxOiA2OCwKICAgIDB4NzYyOiA2OCwKICAgIDB4NzYzOiA2OCwKICAgIDB4NzY0OiA2OCwKICAgIDB4NzY1OiA2OCwKICAgIDB4NzY2OiA2OCwKICAgIDB4NzY3OiA2OCwKICAgIDB4NzY4OiA2OCwKICAgIDB4NzY5OiA2OCwKICAgIDB4NzZhOiA2OCwKICAgIDB4NzZiOiA4MiwKICAgIDB4NzZjOiA4MiwKICAgIDB4NzZkOiA2OCwKICAgIDB4NzZlOiA2OCwKICAgIDB4NzZmOiA2OCwKICAgIDB4NzcwOiA2OCwKICAgIDB4NzcxOiA4MiwKICAgIDB4NzcyOiA2OCwKICAgIDB4NzczOiA4MiwKICAgIDB4Nzc0OiA4MiwKICAgIDB4Nzc1OiA2OCwKICAgIDB4Nzc2OiA2OCwKICAgIDB4Nzc3OiA2OCwKICAgIDB4Nzc4OiA4MiwKICAgIDB4Nzc5OiA4MiwKICAgIDB4NzdhOiA2OCwKICAgIDB4NzdiOiA2OCwKICAgIDB4NzdjOiA2OCwKICAgIDB4NzdkOiA2OCwKICAgIDB4NzdlOiA2OCwKICAgIDB4NzdmOiA2OCwKICAgIDB4N2NhOiA2OCwKICAgIDB4N2NiOiA2OCwKICAgIDB4N2NjOiA2OCwKICAgIDB4N2NkOiA2OCwKICAgIDB4N2NlOiA2OCwKICAgIDB4N2NmOiA2OCwKICAgIDB4N2QwOiA2OCwKICAgIDB4N2QxOiA2OCwKICAgIDB4N2QyOiA2OCwKICAgIDB4N2QzOiA2OCwKICAgIDB4N2Q0OiA2OCwKICAgIDB4N2Q1OiA2OCwKICAgIDB4N2Q2OiA2OCwKICAgIDB4N2Q3OiA2OCwKICAgIDB4N2Q4OiA2OCwKICAgIDB4N2Q5OiA2OCwKICAgIDB4N2RhOiA2OCwKICAgIDB4N2RiOiA2OCwKICAgIDB4N2RjOiA2OCwKICAgIDB4N2RkOiA2OCwKICAgIDB4N2RlOiA2OCwKICAgIDB4N2RmOiA2OCwKICAgIDB4N2UwOiA2OCwKICAgIDB4N2UxOiA2OCwKICAgIDB4N2UyOiA2OCwKICAgIDB4N2UzOiA2OCwKICAgIDB4N2U0OiA2OCwKICAgIDB4N2U1OiA2OCwKICAgIDB4N2U2OiA2OCwKICAgIDB4N2U3OiA2OCwKICAgIDB4N2U4OiA2OCwKICAgIDB4N2U5OiA2OCwKICAgIDB4N2VhOiA2OCwKICAgIDB4N2ZhOiA2NywKICAgIDB4ODQwOiA4MiwKICAgIDB4ODQxOiA2OCwKICAgIDB4ODQyOiA2OCwKICAgIDB4ODQzOiA2OCwKICAgIDB4ODQ0OiA2OCwKICAgIDB4ODQ1OiA2OCwKICAgIDB4ODQ2OiA4MiwKICAgIDB4ODQ3OiA2OCwKICAgIDB4ODQ4OiA2OCwKICAgIDB4ODQ5OiA4MiwKICAgIDB4ODRhOiA2OCwKICAgIDB4ODRiOiA2OCwKICAgIDB4ODRjOiA2OCwKICAgIDB4ODRkOiA2OCwKICAgIDB4ODRlOiA2OCwKICAgIDB4ODRmOiA4MiwKICAgIDB4ODUwOiA2OCwKICAgIDB4ODUxOiA2OCwKICAgIDB4ODUyOiA2OCwKICAgIDB4ODUzOiA2OCwKICAgIDB4ODU0OiA4MiwKICAgIDB4ODU1OiA2OCwKICAgIDB4ODU2OiA4NSwKICAgIDB4ODU3OiA4NSwKICAgIDB4ODU4OiA4NSwKICAgIDB4OGEwOiA2OCwKICAgIDB4OGEyOiA2OCwKICAgIDB4OGEzOiA2OCwKICAgIDB4OGE0OiA2OCwKICAgIDB4OGE1OiA2OCwKICAgIDB4OGE2OiA2OCwKICAgIDB4OGE3OiA2OCwKICAgIDB4OGE4OiA2OCwKICAgIDB4OGE5OiA2OCwKICAgIDB4OGFhOiA4MiwKICAgIDB4OGFiOiA4MiwKICAgIDB4OGFjOiA4MiwKICAgIDB4MTgwNjogODUsCiAgICAweDE4MDc6IDY4LAogICAgMHgxODBhOiA2NywKICAgIDB4MTgwZTogODUsCiAgICAweDE4MjA6IDY4LAogICAgMHgxODIxOiA2OCwKICAgIDB4MTgyMjogNjgsCiAgICAweDE4MjM6IDY4LAogICAgMHgxODI0OiA2OCwKICAgIDB4MTgyNTogNjgsCiAgICAweDE4MjY6IDY4LAogICAgMHgxODI3OiA2OCwKICAgIDB4MTgyODogNjgsCiAgICAweDE4Mjk6IDY4LAogICAgMHgxODJhOiA2OCwKICAgIDB4MTgyYjogNjgsCiAgICAweDE4MmM6IDY4LAogICAgMHgxODJkOiA2OCwKICAgIDB4MTgyZTogNjgsCiAgICAweDE4MmY6IDY4LAogICAgMHgxODMwOiA2OCwKICAgIDB4MTgzMTogNjgsCiAgICAweDE4MzI6IDY4LAogICAgMHgxODMzOiA2OCwKICAgIDB4MTgzNDogNjgsCiAgICAweDE4MzU6IDY4LAogICAgMHgxODM2OiA2OCwKICAgIDB4MTgzNzogNjgsCiAgICAweDE4Mzg6IDY4LAogICAgMHgxODM5OiA2OCwKICAgIDB4MTgzYTogNjgsCiAgICAweDE4M2I6IDY4LAogICAgMHgxODNjOiA2OCwKICAgIDB4MTgzZDogNjgsCiAgICAweDE4M2U6IDY4LAogICAgMHgxODNmOiA2OCwKICAgIDB4MTg0MDogNjgsCiAgICAweDE4NDE6IDY4LAogICAgMHgxODQyOiA2OCwKICAgIDB4MTg0MzogNjgsCiAgICAweDE4NDQ6IDY4LAogICAgMHgxODQ1OiA2OCwKICAgIDB4MTg0NjogNjgsCiAgICAweDE4NDc6IDY4LAogICAgMHgxODQ4OiA2OCwKICAgIDB4MTg0OTogNjgsCiAgICAweDE4NGE6IDY4LAogICAgMHgxODRiOiA2OCwKICAgIDB4MTg0YzogNjgsCiAgICAweDE4NGQ6IDY4LAogICAgMHgxODRlOiA2OCwKICAgIDB4MTg0ZjogNjgsCiAgICAweDE4NTA6IDY4LAogICAgMHgxODUxOiA2OCwKICAgIDB4MTg1MjogNjgsCiAgICAweDE4NTM6IDY4LAogICAgMHgxODU0OiA2OCwKICAgIDB4MTg1NTogNjgsCiAgICAweDE4NTY6IDY4LAogICAgMHgxODU3OiA2OCwKICAgIDB4MTg1ODogNjgsCiAgICAweDE4NTk6IDY4LAogICAgMHgxODVhOiA2OCwKICAgIDB4MTg1YjogNjgsCiAgICAweDE4NWM6IDY4LAogICAgMHgxODVkOiA2OCwKICAgIDB4MTg1ZTogNjgsCiAgICAweDE4NWY6IDY4LAogICAgMHgxODYwOiA2OCwKICAgIDB4MTg2MTogNjgsCiAgICAweDE4NjI6IDY4LAogICAgMHgxODYzOiA2OCwKICAgIDB4MTg2NDogNjgsCiAgICAweDE4NjU6IDY4LAogICAgMHgxODY2OiA2OCwKICAgIDB4MTg2NzogNjgsCiAgICAweDE4Njg6IDY4LAogICAgMHgxODY5OiA2OCwKICAgIDB4MTg2YTogNjgsCiAgICAweDE4NmI6IDY4LAogICAgMHgxODZjOiA2OCwKICAgIDB4MTg2ZDogNjgsCiAgICAweDE4NmU6IDY4LAogICAgMHgxODZmOiA2OCwKICAgIDB4MTg3MDogNjgsCiAgICAweDE4NzE6IDY4LAogICAgMHgxODcyOiA2OCwKICAgIDB4MTg3MzogNjgsCiAgICAweDE4NzQ6IDY4LAogICAgMHgxODc1OiA2OCwKICAgIDB4MTg3NjogNjgsCiAgICAweDE4Nzc6IDY4LAogICAgMHgxODgwOiA4NSwKICAgIDB4MTg4MTogODUsCiAgICAweDE4ODI6IDg1LAogICAgMHgxODgzOiA4NSwKICAgIDB4MTg4NDogODUsCiAgICAweDE4ODU6IDg1LAogICAgMHgxODg2OiA4NSwKICAgIDB4MTg4NzogNjgsCiAgICAweDE4ODg6IDY4LAogICAgMHgxODg5OiA2OCwKICAgIDB4MTg4YTogNjgsCiAgICAweDE4OGI6IDY4LAogICAgMHgxODhjOiA2OCwKICAgIDB4MTg4ZDogNjgsCiAgICAweDE4OGU6IDY4LAogICAgMHgxODhmOiA2OCwKICAgIDB4MTg5MDogNjgsCiAgICAweDE4OTE6IDY4LAogICAgMHgxODkyOiA2OCwKICAgIDB4MTg5MzogNjgsCiAgICAweDE4OTQ6IDY4LAogICAgMHgxODk1OiA2OCwKICAgIDB4MTg5NjogNjgsCiAgICAweDE4OTc6IDY4LAogICAgMHgxODk4OiA2OCwKICAgIDB4MTg5OTogNjgsCiAgICAweDE4OWE6IDY4LAogICAgMHgxODliOiA2OCwKICAgIDB4MTg5YzogNjgsCiAgICAweDE4OWQ6IDY4LAogICAgMHgxODllOiA2OCwKICAgIDB4MTg5ZjogNjgsCiAgICAweDE4YTA6IDY4LAogICAgMHgxOGExOiA2OCwKICAgIDB4MThhMjogNjgsCiAgICAweDE4YTM6IDY4LAogICAgMHgxOGE0OiA2OCwKICAgIDB4MThhNTogNjgsCiAgICAweDE4YTY6IDY4LAogICAgMHgxOGE3OiA2OCwKICAgIDB4MThhODogNjgsCiAgICAweDE4YWE6IDY4LAogICAgMHgyMDBjOiA4NSwKICAgIDB4MjAwZDogNjcsCiAgICAweDIwNjY6IDg1LAogICAgMHgyMDY3OiA4NSwKICAgIDB4MjA2ODogODUsCiAgICAweDIwNjk6IDg1LAogICAgMHhhODQwOiA2OCwKICAgIDB4YTg0MTogNjgsCiAgICAweGE4NDI6IDY4LAogICAgMHhhODQzOiA2OCwKICAgIDB4YTg0NDogNjgsCiAgICAweGE4NDU6IDY4LAogICAgMHhhODQ2OiA2OCwKICAgIDB4YTg0NzogNjgsCiAgICAweGE4NDg6IDY4LAogICAgMHhhODQ5OiA2OCwKICAgIDB4YTg0YTogNjgsCiAgICAweGE4NGI6IDY4LAogICAgMHhhODRjOiA2OCwKICAgIDB4YTg0ZDogNjgsCiAgICAweGE4NGU6IDY4LAogICAgMHhhODRmOiA2OCwKICAgIDB4YTg1MDogNjgsCiAgICAweGE4NTE6IDY4LAogICAgMHhhODUyOiA2OCwKICAgIDB4YTg1MzogNjgsCiAgICAweGE4NTQ6IDY4LAogICAgMHhhODU1OiA2OCwKICAgIDB4YTg1NjogNjgsCiAgICAweGE4NTc6IDY4LAogICAgMHhhODU4OiA2OCwKICAgIDB4YTg1OTogNjgsCiAgICAweGE4NWE6IDY4LAogICAgMHhhODViOiA2OCwKICAgIDB4YTg1YzogNjgsCiAgICAweGE4NWQ6IDY4LAogICAgMHhhODVlOiA2OCwKICAgIDB4YTg1ZjogNjgsCiAgICAweGE4NjA6IDY4LAogICAgMHhhODYxOiA2OCwKICAgIDB4YTg2MjogNjgsCiAgICAweGE4NjM6IDY4LAogICAgMHhhODY0OiA2OCwKICAgIDB4YTg2NTogNjgsCiAgICAweGE4NjY6IDY4LAogICAgMHhhODY3OiA2OCwKICAgIDB4YTg2ODogNjgsCiAgICAweGE4Njk6IDY4LAogICAgMHhhODZhOiA2OCwKICAgIDB4YTg2YjogNjgsCiAgICAweGE4NmM6IDY4LAogICAgMHhhODZkOiA2OCwKICAgIDB4YTg2ZTogNjgsCiAgICAweGE4NmY6IDY4LAogICAgMHhhODcwOiA2OCwKICAgIDB4YTg3MTogNjgsCiAgICAweGE4NzI6IDc2LAogICAgMHhhODczOiA4NSwKfQpjb2RlcG9pbnRfY2xhc3NlcyA9IHsKICAgICdQVkFMSUQnOiAoCiAgICAgICAgMHgyZDAwMDAwMDJlLAogICAgICAgIDB4MzAwMDAwMDAzYSwKICAgICAgICAweDYxMDAwMDAwN2IsCiAgICAgICAgMHhkZjAwMDAwMGY3LAogICAgICAgIDB4ZjgwMDAwMDEwMCwKICAgICAgICAweDEwMTAwMDAwMTAyLAogICAgICAgIDB4MTAzMDAwMDAxMDQsCiAgICAgICAgMHgxMDUwMDAwMDEwNiwKICAgICAgICAweDEwNzAwMDAwMTA4LAogICAgICAgIDB4MTA5MDAwMDAxMGEsCiAgICAgICAgMHgxMGIwMDAwMDEwYywKICAgICAgICAweDEwZDAwMDAwMTBlLAogICAgICAgIDB4MTBmMDAwMDAxMTAsCiAgICAgICAgMHgxMTEwMDAwMDExMiwKICAgICAgICAweDExMzAwMDAwMTE0LAogICAgICAgIDB4MTE1MDAwMDAxMTYsCiAgICAgICAgMHgxMTcwMDAwMDExOCwKICAgICAgICAweDExOTAwMDAwMTFhLAogICAgICAgIDB4MTFiMDAwMDAxMWMsCiAgICAgICAgMHgxMWQwMDAwMDExZSwKICAgICAgICAweDExZjAwMDAwMTIwLAogICAgICAgIDB4MTIxMDAwMDAxMjIsCiAgICAgICAgMHgxMjMwMDAwMDEyNCwKICAgICAgICAweDEyNTAwMDAwMTI2LAogICAgICAgIDB4MTI3MDAwMDAxMjgsCiAgICAgICAgMHgxMjkwMDAwMDEyYSwKICAgICAgICAweDEyYjAwMDAwMTJjLAogICAgICAgIDB4MTJkMDAwMDAxMmUsCiAgICAgICAgMHgxMmYwMDAwMDEzMCwKICAgICAgICAweDEzMTAwMDAwMTMyLAogICAgICAgIDB4MTM1MDAwMDAxMzYsCiAgICAgICAgMHgxMzcwMDAwMDEzOSwKICAgICAgICAweDEzYTAwMDAwMTNiLAogICAgICAgIDB4MTNjMDAwMDAxM2QsCiAgICAgICAgMHgxM2UwMDAwMDEzZiwKICAgICAgICAweDE0MjAwMDAwMTQzLAogICAgICAgIDB4MTQ0MDAwMDAxNDUsCiAgICAgICAgMHgxNDYwMDAwMDE0NywKICAgICAgICAweDE0ODAwMDAwMTQ5LAogICAgICAgIDB4MTRiMDAwMDAxNGMsCiAgICAgICAgMHgxNGQwMDAwMDE0ZSwKICAgICAgICAweDE0ZjAwMDAwMTUwLAogICAgICAgIDB4MTUxMDAwMDAxNTIsCiAgICAgICAgMHgxNTMwMDAwMDE1NCwKICAgICAgICAweDE1NTAwMDAwMTU2LAogICAgICAgIDB4MTU3MDAwMDAxNTgsCiAgICAgICAgMHgxNTkwMDAwMDE1YSwKICAgICAgICAweDE1YjAwMDAwMTVjLAogICAgICAgIDB4MTVkMDAwMDAxNWUsCiAgICAgICAgMHgxNWYwMDAwMDE2MCwKICAgICAgICAweDE2MTAwMDAwMTYyLAogICAgICAgIDB4MTYzMDAwMDAxNjQsCiAgICAgICAgMHgxNjUwMDAwMDE2NiwKICAgICAgICAweDE2NzAwMDAwMTY4LAogICAgICAgIDB4MTY5MDAwMDAxNmEsCiAgICAgICAgMHgxNmIwMDAwMDE2YywKICAgICAgICAweDE2ZDAwMDAwMTZlLAogICAgICAgIDB4MTZmMDAwMDAxNzAsCiAgICAgICAgMHgxNzEwMDAwMDE3MiwKICAgICAgICAweDE3MzAwMDAwMTc0LAogICAgICAgIDB4MTc1MDAwMDAxNzYsCiAgICAgICAgMHgxNzcwMDAwMDE3OCwKICAgICAgICAweDE3YTAwMDAwMTdiLAogICAgICAgIDB4MTdjMDAwMDAxN2QsCiAgICAgICAgMHgxN2UwMDAwMDE3ZiwKICAgICAgICAweDE4MDAwMDAwMTgxLAogICAgICAgIDB4MTgzMDAwMDAxODQsCiAgICAgICAgMHgxODUwMDAwMDE4NiwKICAgICAgICAweDE4ODAwMDAwMTg5LAogICAgICAgIDB4MThjMDAwMDAxOGUsCiAgICAgICAgMHgxOTIwMDAwMDE5MywKICAgICAgICAweDE5NTAwMDAwMTk2LAogICAgICAgIDB4MTk5MDAwMDAxOWMsCiAgICAgICAgMHgxOWUwMDAwMDE5ZiwKICAgICAgICAweDFhMTAwMDAwMWEyLAogICAgICAgIDB4MWEzMDAwMDAxYTQsCiAgICAgICAgMHgxYTUwMDAwMDFhNiwKICAgICAgICAweDFhODAwMDAwMWE5LAogICAgICAgIDB4MWFhMDAwMDAxYWMsCiAgICAgICAgMHgxYWQwMDAwMDFhZSwKICAgICAgICAweDFiMDAwMDAwMWIxLAogICAgICAgIDB4MWI0MDAwMDAxYjUsCiAgICAgICAgMHgxYjYwMDAwMDFiNywKICAgICAgICAweDFiOTAwMDAwMWJjLAogICAgICAgIDB4MWJkMDAwMDAxYzQsCiAgICAgICAgMHgxY2UwMDAwMDFjZiwKICAgICAgICAweDFkMDAwMDAwMWQxLAogICAgICAgIDB4MWQyMDAwMDAxZDMsCiAgICAgICAgMHgxZDQwMDAwMDFkNSwKICAgICAgICAweDFkNjAwMDAwMWQ3LAogICAgICAgIDB4MWQ4MDAwMDAxZDksCiAgICAgICAgMHgxZGEwMDAwMDFkYiwKICAgICAgICAweDFkYzAwMDAwMWRlLAogICAgICAgIDB4MWRmMDAwMDAxZTAsCiAgICAgICAgMHgxZTEwMDAwMDFlMiwKICAgICAgICAweDFlMzAwMDAwMWU0LAogICAgICAgIDB4MWU1MDAwMDAxZTYsCiAgICAgICAgMHgxZTcwMDAwMDFlOCwKICAgICAgICAweDFlOTAwMDAwMWVhLAogICAgICAgIDB4MWViMDAwMDAxZWMsCiAgICAgICAgMHgxZWQwMDAwMDFlZSwKICAgICAgICAweDFlZjAwMDAwMWYxLAogICAgICAgIDB4MWY1MDAwMDAxZjYsCiAgICAgICAgMHgxZjkwMDAwMDFmYSwKICAgICAgICAweDFmYjAwMDAwMWZjLAogICAgICAgIDB4MWZkMDAwMDAxZmUsCiAgICAgICAgMHgxZmYwMDAwMDIwMCwKICAgICAgICAweDIwMTAwMDAwMjAyLAogICAgICAgIDB4MjAzMDAwMDAyMDQsCiAgICAgICAgMHgyMDUwMDAwMDIwNiwKICAgICAgICAweDIwNzAwMDAwMjA4LAogICAgICAgIDB4MjA5MDAwMDAyMGEsCiAgICAgICAgMHgyMGIwMDAwMDIwYywKICAgICAgICAweDIwZDAwMDAwMjBlLAogICAgICAgIDB4MjBmMDAwMDAyMTAsCiAgICAgICAgMHgyMTEwMDAwMDIxMiwKICAgICAgICAweDIxMzAwMDAwMjE0LAogICAgICAgIDB4MjE1MDAwMDAyMTYsCiAgICAgICAgMHgyMTcwMDAwMDIxOCwKICAgICAgICAweDIxOTAwMDAwMjFhLAogICAgICAgIDB4MjFiMDAwMDAyMWMsCiAgICAgICAgMHgyMWQwMDAwMDIxZSwKICAgICAgICAweDIxZjAwMDAwMjIwLAogICAgICAgIDB4MjIxMDAwMDAyMjIsCiAgICAgICAgMHgyMjMwMDAwMDIyNCwKICAgICAgICAweDIyNTAwMDAwMjI2LAogICAgICAgIDB4MjI3MDAwMDAyMjgsCiAgICAgICAgMHgyMjkwMDAwMDIyYSwKICAgICAgICAweDIyYjAwMDAwMjJjLAogICAgICAgIDB4MjJkMDAwMDAyMmUsCiAgICAgICAgMHgyMmYwMDAwMDIzMCwKICAgICAgICAweDIzMTAwMDAwMjMyLAogICAgICAgIDB4MjMzMDAwMDAyM2EsCiAgICAgICAgMHgyM2MwMDAwMDIzZCwKICAgICAgICAweDIzZjAwMDAwMjQxLAogICAgICAgIDB4MjQyMDAwMDAyNDMsCiAgICAgICAgMHgyNDcwMDAwMDI0OCwKICAgICAgICAweDI0OTAwMDAwMjRhLAogICAgICAgIDB4MjRiMDAwMDAyNGMsCiAgICAgICAgMHgyNGQwMDAwMDI0ZSwKICAgICAgICAweDI0ZjAwMDAwMmIwLAogICAgICAgIDB4MmI5MDAwMDAyYzIsCiAgICAgICAgMHgyYzYwMDAwMDJkMiwKICAgICAgICAweDJlYzAwMDAwMmVkLAogICAgICAgIDB4MmVlMDAwMDAyZWYsCiAgICAgICAgMHgzMDAwMDAwMDM0MCwKICAgICAgICAweDM0MjAwMDAwMzQzLAogICAgICAgIDB4MzQ2MDAwMDAzNGYsCiAgICAgICAgMHgzNTAwMDAwMDM3MCwKICAgICAgICAweDM3MTAwMDAwMzcyLAogICAgICAgIDB4MzczMDAwMDAzNzQsCiAgICAgICAgMHgzNzcwMDAwMDM3OCwKICAgICAgICAweDM3YjAwMDAwMzdlLAogICAgICAgIDB4MzkwMDAwMDAzOTEsCiAgICAgICAgMHgzYWMwMDAwMDNjZiwKICAgICAgICAweDNkNzAwMDAwM2Q4LAogICAgICAgIDB4M2Q5MDAwMDAzZGEsCiAgICAgICAgMHgzZGIwMDAwMDNkYywKICAgICAgICAweDNkZDAwMDAwM2RlLAogICAgICAgIDB4M2RmMDAwMDAzZTAsCiAgICAgICAgMHgzZTEwMDAwMDNlMiwKICAgICAgICAweDNlMzAwMDAwM2U0LAogICAgICAgIDB4M2U1MDAwMDAzZTYsCiAgICAgICAgMHgzZTcwMDAwMDNlOCwKICAgICAgICAweDNlOTAwMDAwM2VhLAogICAgICAgIDB4M2ViMDAwMDAzZWMsCiAgICAgICAgMHgzZWQwMDAwMDNlZSwKICAgICAgICAweDNlZjAwMDAwM2YwLAogICAgICAgIDB4M2YzMDAwMDAzZjQsCiAgICAgICAgMHgzZjgwMDAwMDNmOSwKICAgICAgICAweDNmYjAwMDAwM2ZkLAogICAgICAgIDB4NDMwMDAwMDA0NjAsCiAgICAgICAgMHg0NjEwMDAwMDQ2MiwKICAgICAgICAweDQ2MzAwMDAwNDY0LAogICAgICAgIDB4NDY1MDAwMDA0NjYsCiAgICAgICAgMHg0NjcwMDAwMDQ2OCwKICAgICAgICAweDQ2OTAwMDAwNDZhLAogICAgICAgIDB4NDZiMDAwMDA0NmMsCiAgICAgICAgMHg0NmQwMDAwMDQ2ZSwKICAgICAgICAweDQ2ZjAwMDAwNDcwLAogICAgICAgIDB4NDcxMDAwMDA0NzIsCiAgICAgICAgMHg0NzMwMDAwMDQ3NCwKICAgICAgICAweDQ3NTAwMDAwNDc2LAogICAgICAgIDB4NDc3MDAwMDA0NzgsCiAgICAgICAgMHg0NzkwMDAwMDQ3YSwKICAgICAgICAweDQ3YjAwMDAwNDdjLAogICAgICAgIDB4NDdkMDAwMDA0N2UsCiAgICAgICAgMHg0N2YwMDAwMDQ4MCwKICAgICAgICAweDQ4MTAwMDAwNDgyLAogICAgICAgIDB4NDgzMDAwMDA0ODgsCiAgICAgICAgMHg0OGIwMDAwMDQ4YywKICAgICAgICAweDQ4ZDAwMDAwNDhlLAogICAgICAgIDB4NDhmMDAwMDA0OTAsCiAgICAgICAgMHg0OTEwMDAwMDQ5MiwKICAgICAgICAweDQ5MzAwMDAwNDk0LAogICAgICAgIDB4NDk1MDAwMDA0OTYsCiAgICAgICAgMHg0OTcwMDAwMDQ5OCwKICAgICAgICAweDQ5OTAwMDAwNDlhLAogICAgICAgIDB4NDliMDAwMDA0OWMsCiAgICAgICAgMHg0OWQwMDAwMDQ5ZSwKICAgICAgICAweDQ5ZjAwMDAwNGEwLAogICAgICAgIDB4NGExMDAwMDA0YTIsCiAgICAgICAgMHg0YTMwMDAwMDRhNCwKICAgICAgICAweDRhNTAwMDAwNGE2LAogICAgICAgIDB4NGE3MDAwMDA0YTgsCiAgICAgICAgMHg0YTkwMDAwMDRhYSwKICAgICAgICAweDRhYjAwMDAwNGFjLAogICAgICAgIDB4NGFkMDAwMDA0YWUsCiAgICAgICAgMHg0YWYwMDAwMDRiMCwKICAgICAgICAweDRiMTAwMDAwNGIyLAogICAgICAgIDB4NGIzMDAwMDA0YjQsCiAgICAgICAgMHg0YjUwMDAwMDRiNiwKICAgICAgICAweDRiNzAwMDAwNGI4LAogICAgICAgIDB4NGI5MDAwMDA0YmEsCiAgICAgICAgMHg0YmIwMDAwMDRiYywKICAgICAgICAweDRiZDAwMDAwNGJlLAogICAgICAgIDB4NGJmMDAwMDA0YzAsCiAgICAgICAgMHg0YzIwMDAwMDRjMywKICAgICAgICAweDRjNDAwMDAwNGM1LAogICAgICAgIDB4NGM2MDAwMDA0YzcsCiAgICAgICAgMHg0YzgwMDAwMDRjOSwKICAgICAgICAweDRjYTAwMDAwNGNiLAogICAgICAgIDB4NGNjMDAwMDA0Y2QsCiAgICAgICAgMHg0Y2UwMDAwMDRkMCwKICAgICAgICAweDRkMTAwMDAwNGQyLAogICAgICAgIDB4NGQzMDAwMDA0ZDQsCiAgICAgICAgMHg0ZDUwMDAwMDRkNiwKICAgICAgICAweDRkNzAwMDAwNGQ4LAogICAgICAgIDB4NGQ5MDAwMDA0ZGEsCiAgICAgICAgMHg0ZGIwMDAwMDRkYywKICAgICAgICAweDRkZDAwMDAwNGRlLAogICAgICAgIDB4NGRmMDAwMDA0ZTAsCiAgICAgICAgMHg0ZTEwMDAwMDRlMiwKICAgICAgICAweDRlMzAwMDAwNGU0LAogICAgICAgIDB4NGU1MDAwMDA0ZTYsCiAgICAgICAgMHg0ZTcwMDAwMDRlOCwKICAgICAgICAweDRlOTAwMDAwNGVhLAogICAgICAgIDB4NGViMDAwMDA0ZWMsCiAgICAgICAgMHg0ZWQwMDAwMDRlZSwKICAgICAgICAweDRlZjAwMDAwNGYwLAogICAgICAgIDB4NGYxMDAwMDA0ZjIsCiAgICAgICAgMHg0ZjMwMDAwMDRmNCwKICAgICAgICAweDRmNTAwMDAwNGY2LAogICAgICAgIDB4NGY3MDAwMDA0ZjgsCiAgICAgICAgMHg0ZjkwMDAwMDRmYSwKICAgICAgICAweDRmYjAwMDAwNGZjLAogICAgICAgIDB4NGZkMDAwMDA0ZmUsCiAgICAgICAgMHg0ZmYwMDAwMDUwMCwKICAgICAgICAweDUwMTAwMDAwNTAyLAogICAgICAgIDB4NTAzMDAwMDA1MDQsCiAgICAgICAgMHg1MDUwMDAwMDUwNiwKICAgICAgICAweDUwNzAwMDAwNTA4LAogICAgICAgIDB4NTA5MDAwMDA1MGEsCiAgICAgICAgMHg1MGIwMDAwMDUwYywKICAgICAgICAweDUwZDAwMDAwNTBlLAogICAgICAgIDB4NTBmMDAwMDA1MTAsCiAgICAgICAgMHg1MTEwMDAwMDUxMiwKICAgICAgICAweDUxMzAwMDAwNTE0LAogICAgICAgIDB4NTE1MDAwMDA1MTYsCiAgICAgICAgMHg1MTcwMDAwMDUxOCwKICAgICAgICAweDUxOTAwMDAwNTFhLAogICAgICAgIDB4NTFiMDAwMDA1MWMsCiAgICAgICAgMHg1MWQwMDAwMDUxZSwKICAgICAgICAweDUxZjAwMDAwNTIwLAogICAgICAgIDB4NTIxMDAwMDA1MjIsCiAgICAgICAgMHg1MjMwMDAwMDUyNCwKICAgICAgICAweDUyNTAwMDAwNTI2LAogICAgICAgIDB4NTI3MDAwMDA1MjgsCiAgICAgICAgMHg1NTkwMDAwMDU1YSwKICAgICAgICAweDU2MTAwMDAwNTg3LAogICAgICAgIDB4NTkxMDAwMDA1YmUsCiAgICAgICAgMHg1YmYwMDAwMDVjMCwKICAgICAgICAweDVjMTAwMDAwNWMzLAogICAgICAgIDB4NWM0MDAwMDA1YzYsCiAgICAgICAgMHg1YzcwMDAwMDVjOCwKICAgICAgICAweDVkMDAwMDAwNWViLAogICAgICAgIDB4NWYwMDAwMDA1ZjMsCiAgICAgICAgMHg2MTAwMDAwMDYxYiwKICAgICAgICAweDYyMDAwMDAwNjQwLAogICAgICAgIDB4NjQxMDAwMDA2NjAsCiAgICAgICAgMHg2NmUwMDAwMDY3NSwKICAgICAgICAweDY3OTAwMDAwNmQ0LAogICAgICAgIDB4NmQ1MDAwMDA2ZGQsCiAgICAgICAgMHg2ZGYwMDAwMDZlOSwKICAgICAgICAweDZlYTAwMDAwNmYwLAogICAgICAgIDB4NmZhMDAwMDA3MDAsCiAgICAgICAgMHg3MTAwMDAwMDc0YiwKICAgICAgICAweDc0ZDAwMDAwN2IyLAogICAgICAgIDB4N2MwMDAwMDA3ZjYsCiAgICAgICAgMHg4MDAwMDAwMDgyZSwKICAgICAgICAweDg0MDAwMDAwODVjLAogICAgICAgIDB4OGEwMDAwMDA4YTEsCiAgICAgICAgMHg4YTIwMDAwMDhhZCwKICAgICAgICAweDhlNDAwMDAwOGZmLAogICAgICAgIDB4OTAwMDAwMDA5NTgsCiAgICAgICAgMHg5NjAwMDAwMDk2NCwKICAgICAgICAweDk2NjAwMDAwOTcwLAogICAgICAgIDB4OTcxMDAwMDA5NzgsCiAgICAgICAgMHg5NzkwMDAwMDk4MCwKICAgICAgICAweDk4MTAwMDAwOTg0LAogICAgICAgIDB4OTg1MDAwMDA5OGQsCiAgICAgICAgMHg5OGYwMDAwMDk5MSwKICAgICAgICAweDk5MzAwMDAwOWE5LAogICAgICAgIDB4OWFhMDAwMDA5YjEsCiAgICAgICAgMHg5YjIwMDAwMDliMywKICAgICAgICAweDliNjAwMDAwOWJhLAogICAgICAgIDB4OWJjMDAwMDA5YzUsCiAgICAgICAgMHg5YzcwMDAwMDljOSwKICAgICAgICAweDljYjAwMDAwOWNmLAogICAgICAgIDB4OWQ3MDAwMDA5ZDgsCiAgICAgICAgMHg5ZTAwMDAwMDllNCwKICAgICAgICAweDllNjAwMDAwOWYyLAogICAgICAgIDB4YTAxMDAwMDBhMDQsCiAgICAgICAgMHhhMDUwMDAwMGEwYiwKICAgICAgICAweGEwZjAwMDAwYTExLAogICAgICAgIDB4YTEzMDAwMDBhMjksCiAgICAgICAgMHhhMmEwMDAwMGEzMSwKICAgICAgICAweGEzMjAwMDAwYTMzLAogICAgICAgIDB4YTM1MDAwMDBhMzYsCiAgICAgICAgMHhhMzgwMDAwMGEzYSwKICAgICAgICAweGEzYzAwMDAwYTNkLAogICAgICAgIDB4YTNlMDAwMDBhNDMsCiAgICAgICAgMHhhNDcwMDAwMGE0OSwKICAgICAgICAweGE0YjAwMDAwYTRlLAogICAgICAgIDB4YTUxMDAwMDBhNTIsCiAgICAgICAgMHhhNWMwMDAwMGE1ZCwKICAgICAgICAweGE2NjAwMDAwYTc2LAogICAgICAgIDB4YTgxMDAwMDBhODQsCiAgICAgICAgMHhhODUwMDAwMGE4ZSwKICAgICAgICAweGE4ZjAwMDAwYTkyLAogICAgICAgIDB4YTkzMDAwMDBhYTksCiAgICAgICAgMHhhYWEwMDAwMGFiMSwKICAgICAgICAweGFiMjAwMDAwYWI0LAogICAgICAgIDB4YWI1MDAwMDBhYmEsCiAgICAgICAgMHhhYmMwMDAwMGFjNiwKICAgICAgICAweGFjNzAwMDAwYWNhLAogICAgICAgIDB4YWNiMDAwMDBhY2UsCiAgICAgICAgMHhhZDAwMDAwMGFkMSwKICAgICAgICAweGFlMDAwMDAwYWU0LAogICAgICAgIDB4YWU2MDAwMDBhZjAsCiAgICAgICAgMHhiMDEwMDAwMGIwNCwKICAgICAgICAweGIwNTAwMDAwYjBkLAogICAgICAgIDB4YjBmMDAwMDBiMTEsCiAgICAgICAgMHhiMTMwMDAwMGIyOSwKICAgICAgICAweGIyYTAwMDAwYjMxLAogICAgICAgIDB4YjMyMDAwMDBiMzQsCiAgICAgICAgMHhiMzUwMDAwMGIzYSwKICAgICAgICAweGIzYzAwMDAwYjQ1LAogICAgICAgIDB4YjQ3MDAwMDBiNDksCiAgICAgICAgMHhiNGIwMDAwMGI0ZSwKICAgICAgICAweGI1NjAwMDAwYjU4LAogICAgICAgIDB4YjVmMDAwMDBiNjQsCiAgICAgICAgMHhiNjYwMDAwMGI3MCwKICAgICAgICAweGI3MTAwMDAwYjcyLAogICAgICAgIDB4YjgyMDAwMDBiODQsCiAgICAgICAgMHhiODUwMDAwMGI4YiwKICAgICAgICAweGI4ZTAwMDAwYjkxLAogICAgICAgIDB4YjkyMDAwMDBiOTYsCiAgICAgICAgMHhiOTkwMDAwMGI5YiwKICAgICAgICAweGI5YzAwMDAwYjlkLAogICAgICAgIDB4YjllMDAwMDBiYTAsCiAgICAgICAgMHhiYTMwMDAwMGJhNSwKICAgICAgICAweGJhODAwMDAwYmFiLAogICAgICAgIDB4YmFlMDAwMDBiYmEsCiAgICAgICAgMHhiYmUwMDAwMGJjMywKICAgICAgICAweGJjNjAwMDAwYmM5LAogICAgICAgIDB4YmNhMDAwMDBiY2UsCiAgICAgICAgMHhiZDAwMDAwMGJkMSwKICAgICAgICAweGJkNzAwMDAwYmQ4LAogICAgICAgIDB4YmU2MDAwMDBiZjAsCiAgICAgICAgMHhjMDEwMDAwMGMwNCwKICAgICAgICAweGMwNTAwMDAwYzBkLAogICAgICAgIDB4YzBlMDAwMDBjMTEsCiAgICAgICAgMHhjMTIwMDAwMGMyOSwKICAgICAgICAweGMyYTAwMDAwYzM0LAogICAgICAgIDB4YzM1MDAwMDBjM2EsCiAgICAgICAgMHhjM2QwMDAwMGM0NSwKICAgICAgICAweGM0NjAwMDAwYzQ5LAogICAgICAgIDB4YzRhMDAwMDBjNGUsCiAgICAgICAgMHhjNTUwMDAwMGM1NywKICAgICAgICAweGM1ODAwMDAwYzVhLAogICAgICAgIDB4YzYwMDAwMDBjNjQsCiAgICAgICAgMHhjNjYwMDAwMGM3MCwKICAgICAgICAweGM4MjAwMDAwYzg0LAogICAgICAgIDB4Yzg1MDAwMDBjOGQsCiAgICAgICAgMHhjOGUwMDAwMGM5MSwKICAgICAgICAweGM5MjAwMDAwY2E5LAogICAgICAgIDB4Y2FhMDAwMDBjYjQsCiAgICAgICAgMHhjYjUwMDAwMGNiYSwKICAgICAgICAweGNiYzAwMDAwY2M1LAogICAgICAgIDB4Y2M2MDAwMDBjYzksCiAgICAgICAgMHhjY2EwMDAwMGNjZSwKICAgICAgICAweGNkNTAwMDAwY2Q3LAogICAgICAgIDB4Y2RlMDAwMDBjZGYsCiAgICAgICAgMHhjZTAwMDAwMGNlNCwKICAgICAgICAweGNlNjAwMDAwY2YwLAogICAgICAgIDB4Y2YxMDAwMDBjZjMsCiAgICAgICAgMHhkMDIwMDAwMGQwNCwKICAgICAgICAweGQwNTAwMDAwZDBkLAogICAgICAgIDB4ZDBlMDAwMDBkMTEsCiAgICAgICAgMHhkMTIwMDAwMGQzYiwKICAgICAgICAweGQzZDAwMDAwZDQ1LAogICAgICAgIDB4ZDQ2MDAwMDBkNDksCiAgICAgICAgMHhkNGEwMDAwMGQ0ZiwKICAgICAgICAweGQ1NzAwMDAwZDU4LAogICAgICAgIDB4ZDYwMDAwMDBkNjQsCiAgICAgICAgMHhkNjYwMDAwMGQ3MCwKICAgICAgICAweGQ3YTAwMDAwZDgwLAogICAgICAgIDB4ZDgyMDAwMDBkODQsCiAgICAgICAgMHhkODUwMDAwMGQ5NywKICAgICAgICAweGQ5YTAwMDAwZGIyLAogICAgICAgIDB4ZGIzMDAwMDBkYmMsCiAgICAgICAgMHhkYmQwMDAwMGRiZSwKICAgICAgICAweGRjMDAwMDAwZGM3LAogICAgICAgIDB4ZGNhMDAwMDBkY2IsCiAgICAgICAgMHhkY2YwMDAwMGRkNSwKICAgICAgICAweGRkNjAwMDAwZGQ3LAogICAgICAgIDB4ZGQ4MDAwMDBkZTAsCiAgICAgICAgMHhkZjIwMDAwMGRmNCwKICAgICAgICAweGUwMTAwMDAwZTMzLAogICAgICAgIDB4ZTM0MDAwMDBlM2IsCiAgICAgICAgMHhlNDAwMDAwMGU0ZiwKICAgICAgICAweGU1MDAwMDAwZTVhLAogICAgICAgIDB4ZTgxMDAwMDBlODMsCiAgICAgICAgMHhlODQwMDAwMGU4NSwKICAgICAgICAweGU4NzAwMDAwZTg5LAogICAgICAgIDB4ZThhMDAwMDBlOGIsCiAgICAgICAgMHhlOGQwMDAwMGU4ZSwKICAgICAgICAweGU5NDAwMDAwZTk4LAogICAgICAgIDB4ZTk5MDAwMDBlYTAsCiAgICAgICAgMHhlYTEwMDAwMGVhNCwKICAgICAgICAweGVhNTAwMDAwZWE2LAogICAgICAgIDB4ZWE3MDAwMDBlYTgsCiAgICAgICAgMHhlYWEwMDAwMGVhYywKICAgICAgICAweGVhZDAwMDAwZWIzLAogICAgICAgIDB4ZWI0MDAwMDBlYmEsCiAgICAgICAgMHhlYmIwMDAwMGViZSwKICAgICAgICAweGVjMDAwMDAwZWM1LAogICAgICAgIDB4ZWM2MDAwMDBlYzcsCiAgICAgICAgMHhlYzgwMDAwMGVjZSwKICAgICAgICAweGVkMDAwMDAwZWRhLAogICAgICAgIDB4ZWRlMDAwMDBlZTAsCiAgICAgICAgMHhmMDAwMDAwMGYwMSwKICAgICAgICAweGYwYjAwMDAwZjBjLAogICAgICAgIDB4ZjE4MDAwMDBmMWEsCiAgICAgICAgMHhmMjAwMDAwMGYyYSwKICAgICAgICAweGYzNTAwMDAwZjM2LAogICAgICAgIDB4ZjM3MDAwMDBmMzgsCiAgICAgICAgMHhmMzkwMDAwMGYzYSwKICAgICAgICAweGYzZTAwMDAwZjQzLAogICAgICAgIDB4ZjQ0MDAwMDBmNDgsCiAgICAgICAgMHhmNDkwMDAwMGY0ZCwKICAgICAgICAweGY0ZTAwMDAwZjUyLAogICAgICAgIDB4ZjUzMDAwMDBmNTcsCiAgICAgICAgMHhmNTgwMDAwMGY1YywKICAgICAgICAweGY1ZDAwMDAwZjY5LAogICAgICAgIDB4ZjZhMDAwMDBmNmQsCiAgICAgICAgMHhmNzEwMDAwMGY3MywKICAgICAgICAweGY3NDAwMDAwZjc1LAogICAgICAgIDB4ZjdhMDAwMDBmODEsCiAgICAgICAgMHhmODIwMDAwMGY4NSwKICAgICAgICAweGY4NjAwMDAwZjkzLAogICAgICAgIDB4Zjk0MDAwMDBmOTgsCiAgICAgICAgMHhmOTkwMDAwMGY5ZCwKICAgICAgICAweGY5ZTAwMDAwZmEyLAogICAgICAgIDB4ZmEzMDAwMDBmYTcsCiAgICAgICAgMHhmYTgwMDAwMGZhYywKICAgICAgICAweGZhZDAwMDAwZmI5LAogICAgICAgIDB4ZmJhMDAwMDBmYmQsCiAgICAgICAgMHhmYzYwMDAwMGZjNywKICAgICAgICAweDEwMDAwMDAwMTA0YSwKICAgICAgICAweDEwNTAwMDAwMTA5ZSwKICAgICAgICAweDEwZDAwMDAwMTBmYiwKICAgICAgICAweDEwZmQwMDAwMTEwMCwKICAgICAgICAweDEyMDAwMDAwMTI0OSwKICAgICAgICAweDEyNGEwMDAwMTI0ZSwKICAgICAgICAweDEyNTAwMDAwMTI1NywKICAgICAgICAweDEyNTgwMDAwMTI1OSwKICAgICAgICAweDEyNWEwMDAwMTI1ZSwKICAgICAgICAweDEyNjAwMDAwMTI4OSwKICAgICAgICAweDEyOGEwMDAwMTI4ZSwKICAgICAgICAweDEyOTAwMDAwMTJiMSwKICAgICAgICAweDEyYjIwMDAwMTJiNiwKICAgICAgICAweDEyYjgwMDAwMTJiZiwKICAgICAgICAweDEyYzAwMDAwMTJjMSwKICAgICAgICAweDEyYzIwMDAwMTJjNiwKICAgICAgICAweDEyYzgwMDAwMTJkNywKICAgICAgICAweDEyZDgwMDAwMTMxMSwKICAgICAgICAweDEzMTIwMDAwMTMxNiwKICAgICAgICAweDEzMTgwMDAwMTM1YiwKICAgICAgICAweDEzNWQwMDAwMTM2MCwKICAgICAgICAweDEzODAwMDAwMTM5MCwKICAgICAgICAweDEzYTAwMDAwMTNmNSwKICAgICAgICAweDE0MDEwMDAwMTY2ZCwKICAgICAgICAweDE2NmYwMDAwMTY4MCwKICAgICAgICAweDE2ODEwMDAwMTY5YiwKICAgICAgICAweDE2YTAwMDAwMTZlYiwKICAgICAgICAweDE3MDAwMDAwMTcwZCwKICAgICAgICAweDE3MGUwMDAwMTcxNSwKICAgICAgICAweDE3MjAwMDAwMTczNSwKICAgICAgICAweDE3NDAwMDAwMTc1NCwKICAgICAgICAweDE3NjAwMDAwMTc2ZCwKICAgICAgICAweDE3NmUwMDAwMTc3MSwKICAgICAgICAweDE3NzIwMDAwMTc3NCwKICAgICAgICAweDE3ODAwMDAwMTdiNCwKICAgICAgICAweDE3YjYwMDAwMTdkNCwKICAgICAgICAweDE3ZDcwMDAwMTdkOCwKICAgICAgICAweDE3ZGMwMDAwMTdkZSwKICAgICAgICAweDE3ZTAwMDAwMTdlYSwKICAgICAgICAweDE4MTAwMDAwMTgxYSwKICAgICAgICAweDE4MjAwMDAwMTg3OCwKICAgICAgICAweDE4ODAwMDAwMThhYiwKICAgICAgICAweDE4YjAwMDAwMThmNiwKICAgICAgICAweDE5MDAwMDAwMTkxZCwKICAgICAgICAweDE5MjAwMDAwMTkyYywKICAgICAgICAweDE5MzAwMDAwMTkzYywKICAgICAgICAweDE5NDYwMDAwMTk2ZSwKICAgICAgICAweDE5NzAwMDAwMTk3NSwKICAgICAgICAweDE5ODAwMDAwMTlhYywKICAgICAgICAweDE5YjAwMDAwMTljYSwKICAgICAgICAweDE5ZDAwMDAwMTlkYSwKICAgICAgICAweDFhMDAwMDAwMWExYywKICAgICAgICAweDFhMjAwMDAwMWE1ZiwKICAgICAgICAweDFhNjAwMDAwMWE3ZCwKICAgICAgICAweDFhN2YwMDAwMWE4YSwKICAgICAgICAweDFhOTAwMDAwMWE5YSwKICAgICAgICAweDFhYTcwMDAwMWFhOCwKICAgICAgICAweDFiMDAwMDAwMWI0YywKICAgICAgICAweDFiNTAwMDAwMWI1YSwKICAgICAgICAweDFiNmIwMDAwMWI3NCwKICAgICAgICAweDFiODAwMDAwMWJmNCwKICAgICAgICAweDFjMDAwMDAwMWMzOCwKICAgICAgICAweDFjNDAwMDAwMWM0YSwKICAgICAgICAweDFjNGQwMDAwMWM3ZSwKICAgICAgICAweDFjZDAwMDAwMWNkMywKICAgICAgICAweDFjZDQwMDAwMWNmNywKICAgICAgICAweDFkMDAwMDAwMWQyYywKICAgICAgICAweDFkMmYwMDAwMWQzMCwKICAgICAgICAweDFkM2IwMDAwMWQzYywKICAgICAgICAweDFkNGUwMDAwMWQ0ZiwKICAgICAgICAweDFkNmIwMDAwMWQ3OCwKICAgICAgICAweDFkNzkwMDAwMWQ5YiwKICAgICAgICAweDFkYzAwMDAwMWRlNywKICAgICAgICAweDFkZmMwMDAwMWUwMCwKICAgICAgICAweDFlMDEwMDAwMWUwMiwKICAgICAgICAweDFlMDMwMDAwMWUwNCwKICAgICAgICAweDFlMDUwMDAwMWUwNiwKICAgICAgICAweDFlMDcwMDAwMWUwOCwKICAgICAgICAweDFlMDkwMDAwMWUwYSwKICAgICAgICAweDFlMGIwMDAwMWUwYywKICAgICAgICAweDFlMGQwMDAwMWUwZSwKICAgICAgICAweDFlMGYwMDAwMWUxMCwKICAgICAgICAweDFlMTEwMDAwMWUxMiwKICAgICAgICAweDFlMTMwMDAwMWUxNCwKICAgICAgICAweDFlMTUwMDAwMWUxNiwKICAgICAgICAweDFlMTcwMDAwMWUxOCwKICAgICAgICAweDFlMTkwMDAwMWUxYSwKICAgICAgICAweDFlMWIwMDAwMWUxYywKICAgICAgICAweDFlMWQwMDAwMWUxZSwKICAgICAgICAweDFlMWYwMDAwMWUyMCwKICAgICAgICAweDFlMjEwMDAwMWUyMiwKICAgICAgICAweDFlMjMwMDAwMWUyNCwKICAgICAgICAweDFlMjUwMDAwMWUyNiwKICAgICAgICAweDFlMjcwMDAwMWUyOCwKICAgICAgICAweDFlMjkwMDAwMWUyYSwKICAgICAgICAweDFlMmIwMDAwMWUyYywKICAgICAgICAweDFlMmQwMDAwMWUyZSwKICAgICAgICAweDFlMmYwMDAwMWUzMCwKICAgICAgICAweDFlMzEwMDAwMWUzMiwKICAgICAgICAweDFlMzMwMDAwMWUzNCwKICAgICAgICAweDFlMzUwMDAwMWUzNiwKICAgICAgICAweDFlMzcwMDAwMWUzOCwKICAgICAgICAweDFlMzkwMDAwMWUzYSwKICAgICAgICAweDFlM2IwMDAwMWUzYywKICAgICAgICAweDFlM2QwMDAwMWUzZSwKICAgICAgICAweDFlM2YwMDAwMWU0MCwKICAgICAgICAweDFlNDEwMDAwMWU0MiwKICAgICAgICAweDFlNDMwMDAwMWU0NCwKICAgICAgICAweDFlNDUwMDAwMWU0NiwKICAgICAgICAweDFlNDcwMDAwMWU0OCwKICAgICAgICAweDFlNDkwMDAwMWU0YSwKICAgICAgICAweDFlNGIwMDAwMWU0YywKICAgICAgICAweDFlNGQwMDAwMWU0ZSwKICAgICAgICAweDFlNGYwMDAwMWU1MCwKICAgICAgICAweDFlNTEwMDAwMWU1MiwKICAgICAgICAweDFlNTMwMDAwMWU1NCwKICAgICAgICAweDFlNTUwMDAwMWU1NiwKICAgICAgICAweDFlNTcwMDAwMWU1OCwKICAgICAgICAweDFlNTkwMDAwMWU1YSwKICAgICAgICAweDFlNWIwMDAwMWU1YywKICAgICAgICAweDFlNWQwMDAwMWU1ZSwKICAgICAgICAweDFlNWYwMDAwMWU2MCwKICAgICAgICAweDFlNjEwMDAwMWU2MiwKICAgICAgICAweDFlNjMwMDAwMWU2NCwKICAgICAgICAweDFlNjUwMDAwMWU2NiwKICAgICAgICAweDFlNjcwMDAwMWU2OCwKICAgICAgICAweDFlNjkwMDAwMWU2YSwKICAgICAgICAweDFlNmIwMDAwMWU2YywKICAgICAgICAweDFlNmQwMDAwMWU2ZSwKICAgICAgICAweDFlNmYwMDAwMWU3MCwKICAgICAgICAweDFlNzEwMDAwMWU3MiwKICAgICAgICAweDFlNzMwMDAwMWU3NCwKICAgICAgICAweDFlNzUwMDAwMWU3NiwKICAgICAgICAweDFlNzcwMDAwMWU3OCwKICAgICAgICAweDFlNzkwMDAwMWU3YSwKICAgICAgICAweDFlN2IwMDAwMWU3YywKICAgICAgICAweDFlN2QwMDAwMWU3ZSwKICAgICAgICAweDFlN2YwMDAwMWU4MCwKICAgICAgICAweDFlODEwMDAwMWU4MiwKICAgICAgICAweDFlODMwMDAwMWU4NCwKICAgICAgICAweDFlODUwMDAwMWU4NiwKICAgICAgICAweDFlODcwMDAwMWU4OCwKICAgICAgICAweDFlODkwMDAwMWU4YSwKICAgICAgICAweDFlOGIwMDAwMWU4YywKICAgICAgICAweDFlOGQwMDAwMWU4ZSwKICAgICAgICAweDFlOGYwMDAwMWU5MCwKICAgICAgICAweDFlOTEwMDAwMWU5MiwKICAgICAgICAweDFlOTMwMDAwMWU5NCwKICAgICAgICAweDFlOTUwMDAwMWU5YSwKICAgICAgICAweDFlOWMwMDAwMWU5ZSwKICAgICAgICAweDFlOWYwMDAwMWVhMCwKICAgICAgICAweDFlYTEwMDAwMWVhMiwKICAgICAgICAweDFlYTMwMDAwMWVhNCwKICAgICAgICAweDFlYTUwMDAwMWVhNiwKICAgICAgICAweDFlYTcwMDAwMWVhOCwKICAgICAgICAweDFlYTkwMDAwMWVhYSwKICAgICAgICAweDFlYWIwMDAwMWVhYywKICAgICAgICAweDFlYWQwMDAwMWVhZSwKICAgICAgICAweDFlYWYwMDAwMWViMCwKICAgICAgICAweDFlYjEwMDAwMWViMiwKICAgICAgICAweDFlYjMwMDAwMWViNCwKICAgICAgICAweDFlYjUwMDAwMWViNiwKICAgICAgICAweDFlYjcwMDAwMWViOCwKICAgICAgICAweDFlYjkwMDAwMWViYSwKICAgICAgICAweDFlYmIwMDAwMWViYywKICAgICAgICAweDFlYmQwMDAwMWViZSwKICAgICAgICAweDFlYmYwMDAwMWVjMCwKICAgICAgICAweDFlYzEwMDAwMWVjMiwKICAgICAgICAweDFlYzMwMDAwMWVjNCwKICAgICAgICAweDFlYzUwMDAwMWVjNiwKICAgICAgICAweDFlYzcwMDAwMWVjOCwKICAgICAgICAweDFlYzkwMDAwMWVjYSwKICAgICAgICAweDFlY2IwMDAwMWVjYywKICAgICAgICAweDFlY2QwMDAwMWVjZSwKICAgICAgICAweDFlY2YwMDAwMWVkMCwKICAgICAgICAweDFlZDEwMDAwMWVkMiwKICAgICAgICAweDFlZDMwMDAwMWVkNCwKICAgICAgICAweDFlZDUwMDAwMWVkNiwKICAgICAgICAweDFlZDcwMDAwMWVkOCwKICAgICAgICAweDFlZDkwMDAwMWVkYSwKICAgICAgICAweDFlZGIwMDAwMWVkYywKICAgICAgICAweDFlZGQwMDAwMWVkZSwKICAgICAgICAweDFlZGYwMDAwMWVlMCwKICAgICAgICAweDFlZTEwMDAwMWVlMiwKICAgICAgICAweDFlZTMwMDAwMWVlNCwKICAgICAgICAweDFlZTUwMDAwMWVlNiwKICAgICAgICAweDFlZTcwMDAwMWVlOCwKICAgICAgICAweDFlZTkwMDAwMWVlYSwKICAgICAgICAweDFlZWIwMDAwMWVlYywKICAgICAgICAweDFlZWQwMDAwMWVlZSwKICAgICAgICAweDFlZWYwMDAwMWVmMCwKICAgICAgICAweDFlZjEwMDAwMWVmMiwKICAgICAgICAweDFlZjMwMDAwMWVmNCwKICAgICAgICAweDFlZjUwMDAwMWVmNiwKICAgICAgICAweDFlZjcwMDAwMWVmOCwKICAgICAgICAweDFlZjkwMDAwMWVmYSwKICAgICAgICAweDFlZmIwMDAwMWVmYywKICAgICAgICAweDFlZmQwMDAwMWVmZSwKICAgICAgICAweDFlZmYwMDAwMWYwOCwKICAgICAgICAweDFmMTAwMDAwMWYxNiwKICAgICAgICAweDFmMjAwMDAwMWYyOCwKICAgICAgICAweDFmMzAwMDAwMWYzOCwKICAgICAgICAweDFmNDAwMDAwMWY0NiwKICAgICAgICAweDFmNTAwMDAwMWY1OCwKICAgICAgICAweDFmNjAwMDAwMWY2OCwKICAgICAgICAweDFmNzAwMDAwMWY3MSwKICAgICAgICAweDFmNzIwMDAwMWY3MywKICAgICAgICAweDFmNzQwMDAwMWY3NSwKICAgICAgICAweDFmNzYwMDAwMWY3NywKICAgICAgICAweDFmNzgwMDAwMWY3OSwKICAgICAgICAweDFmN2EwMDAwMWY3YiwKICAgICAgICAweDFmN2MwMDAwMWY3ZCwKICAgICAgICAweDFmYjAwMDAwMWZiMiwKICAgICAgICAweDFmYjYwMDAwMWZiNywKICAgICAgICAweDFmYzYwMDAwMWZjNywKICAgICAgICAweDFmZDAwMDAwMWZkMywKICAgICAgICAweDFmZDYwMDAwMWZkOCwKICAgICAgICAweDFmZTAwMDAwMWZlMywKICAgICAgICAweDFmZTQwMDAwMWZlOCwKICAgICAgICAweDFmZjYwMDAwMWZmNywKICAgICAgICAweDIxNGUwMDAwMjE0ZiwKICAgICAgICAweDIxODQwMDAwMjE4NSwKICAgICAgICAweDJjMzAwMDAwMmM1ZiwKICAgICAgICAweDJjNjEwMDAwMmM2MiwKICAgICAgICAweDJjNjUwMDAwMmM2NywKICAgICAgICAweDJjNjgwMDAwMmM2OSwKICAgICAgICAweDJjNmEwMDAwMmM2YiwKICAgICAgICAweDJjNmMwMDAwMmM2ZCwKICAgICAgICAweDJjNzEwMDAwMmM3MiwKICAgICAgICAweDJjNzMwMDAwMmM3NSwKICAgICAgICAweDJjNzYwMDAwMmM3YywKICAgICAgICAweDJjODEwMDAwMmM4MiwKICAgICAgICAweDJjODMwMDAwMmM4NCwKICAgICAgICAweDJjODUwMDAwMmM4NiwKICAgICAgICAweDJjODcwMDAwMmM4OCwKICAgICAgICAweDJjODkwMDAwMmM4YSwKICAgICAgICAweDJjOGIwMDAwMmM4YywKICAgICAgICAweDJjOGQwMDAwMmM4ZSwKICAgICAgICAweDJjOGYwMDAwMmM5MCwKICAgICAgICAweDJjOTEwMDAwMmM5MiwKICAgICAgICAweDJjOTMwMDAwMmM5NCwKICAgICAgICAweDJjOTUwMDAwMmM5NiwKICAgICAgICAweDJjOTcwMDAwMmM5OCwKICAgICAgICAweDJjOTkwMDAwMmM5YSwKICAgICAgICAweDJjOWIwMDAwMmM5YywKICAgICAgICAweDJjOWQwMDAwMmM5ZSwKICAgICAgICAweDJjOWYwMDAwMmNhMCwKICAgICAgICAweDJjYTEwMDAwMmNhMiwKICAgICAgICAweDJjYTMwMDAwMmNhNCwKICAgICAgICAweDJjYTUwMDAwMmNhNiwKICAgICAgICAweDJjYTcwMDAwMmNhOCwKICAgICAgICAweDJjYTkwMDAwMmNhYSwKICAgICAgICAweDJjYWIwMDAwMmNhYywKICAgICAgICAweDJjYWQwMDAwMmNhZSwKICAgICAgICAweDJjYWYwMDAwMmNiMCwKICAgICAgICAweDJjYjEwMDAwMmNiMiwKICAgICAgICAweDJjYjMwMDAwMmNiNCwKICAgICAgICAweDJjYjUwMDAwMmNiNiwKICAgICAgICAweDJjYjcwMDAwMmNiOCwKICAgICAgICAweDJjYjkwMDAwMmNiYSwKICAgICAgICAweDJjYmIwMDAwMmNiYywKICAgICAgICAweDJjYmQwMDAwMmNiZSwKICAgICAgICAweDJjYmYwMDAwMmNjMCwKICAgICAgICAweDJjYzEwMDAwMmNjMiwKICAgICAgICAweDJjYzMwMDAwMmNjNCwKICAgICAgICAweDJjYzUwMDAwMmNjNiwKICAgICAgICAweDJjYzcwMDAwMmNjOCwKICAgICAgICAweDJjYzkwMDAwMmNjYSwKICAgICAgICAweDJjY2IwMDAwMmNjYywKICAgICAgICAweDJjY2QwMDAwMmNjZSwKICAgICAgICAweDJjY2YwMDAwMmNkMCwKICAgICAgICAweDJjZDEwMDAwMmNkMiwKICAgICAgICAweDJjZDMwMDAwMmNkNCwKICAgICAgICAweDJjZDUwMDAwMmNkNiwKICAgICAgICAweDJjZDcwMDAwMmNkOCwKICAgICAgICAweDJjZDkwMDAwMmNkYSwKICAgICAgICAweDJjZGIwMDAwMmNkYywKICAgICAgICAweDJjZGQwMDAwMmNkZSwKICAgICAgICAweDJjZGYwMDAwMmNlMCwKICAgICAgICAweDJjZTEwMDAwMmNlMiwKICAgICAgICAweDJjZTMwMDAwMmNlNSwKICAgICAgICAweDJjZWMwMDAwMmNlZCwKICAgICAgICAweDJjZWUwMDAwMmNmMiwKICAgICAgICAweDJjZjMwMDAwMmNmNCwKICAgICAgICAweDJkMDAwMDAwMmQyNiwKICAgICAgICAweDJkMjcwMDAwMmQyOCwKICAgICAgICAweDJkMmQwMDAwMmQyZSwKICAgICAgICAweDJkMzAwMDAwMmQ2OCwKICAgICAgICAweDJkN2YwMDAwMmQ5NywKICAgICAgICAweDJkYTAwMDAwMmRhNywKICAgICAgICAweDJkYTgwMDAwMmRhZiwKICAgICAgICAweDJkYjAwMDAwMmRiNywKICAgICAgICAweDJkYjgwMDAwMmRiZiwKICAgICAgICAweDJkYzAwMDAwMmRjNywKICAgICAgICAweDJkYzgwMDAwMmRjZiwKICAgICAgICAweDJkZDAwMDAwMmRkNywKICAgICAgICAweDJkZDgwMDAwMmRkZiwKICAgICAgICAweDJkZTAwMDAwMmUwMCwKICAgICAgICAweDJlMmYwMDAwMmUzMCwKICAgICAgICAweDMwMDUwMDAwMzAwOCwKICAgICAgICAweDMwMmEwMDAwMzAyZSwKICAgICAgICAweDMwM2MwMDAwMzAzZCwKICAgICAgICAweDMwNDEwMDAwMzA5NywKICAgICAgICAweDMwOTkwMDAwMzA5YiwKICAgICAgICAweDMwOWQwMDAwMzA5ZiwKICAgICAgICAweDMwYTEwMDAwMzBmYiwKICAgICAgICAweDMwZmMwMDAwMzBmZiwKICAgICAgICAweDMxMDUwMDAwMzEyZSwKICAgICAgICAweDMxYTAwMDAwMzFiYiwKICAgICAgICAweDMxZjAwMDAwMzIwMCwKICAgICAgICAweDM0MDAwMDAwNGRiNiwKICAgICAgICAweDRlMDAwMDAwOWZjZCwKICAgICAgICAweGEwMDAwMDAwYTQ4ZCwKICAgICAgICAweGE0ZDAwMDAwYTRmZSwKICAgICAgICAweGE1MDAwMDAwYTYwZCwKICAgICAgICAweGE2MTAwMDAwYTYyYywKICAgICAgICAweGE2NDEwMDAwYTY0MiwKICAgICAgICAweGE2NDMwMDAwYTY0NCwKICAgICAgICAweGE2NDUwMDAwYTY0NiwKICAgICAgICAweGE2NDcwMDAwYTY0OCwKICAgICAgICAweGE2NDkwMDAwYTY0YSwKICAgICAgICAweGE2NGIwMDAwYTY0YywKICAgICAgICAweGE2NGQwMDAwYTY0ZSwKICAgICAgICAweGE2NGYwMDAwYTY1MCwKICAgICAgICAweGE2NTEwMDAwYTY1MiwKICAgICAgICAweGE2NTMwMDAwYTY1NCwKICAgICAgICAweGE2NTUwMDAwYTY1NiwKICAgICAgICAweGE2NTcwMDAwYTY1OCwKICAgICAgICAweGE2NTkwMDAwYTY1YSwKICAgICAgICAweGE2NWIwMDAwYTY1YywKICAgICAgICAweGE2NWQwMDAwYTY1ZSwKICAgICAgICAweGE2NWYwMDAwYTY2MCwKICAgICAgICAweGE2NjEwMDAwYTY2MiwKICAgICAgICAweGE2NjMwMDAwYTY2NCwKICAgICAgICAweGE2NjUwMDAwYTY2NiwKICAgICAgICAweGE2NjcwMDAwYTY2OCwKICAgICAgICAweGE2NjkwMDAwYTY2YSwKICAgICAgICAweGE2NmIwMDAwYTY2YywKICAgICAgICAweGE2NmQwMDAwYTY3MCwKICAgICAgICAweGE2NzQwMDAwYTY3ZSwKICAgICAgICAweGE2N2YwMDAwYTY4MCwKICAgICAgICAweGE2ODEwMDAwYTY4MiwKICAgICAgICAweGE2ODMwMDAwYTY4NCwKICAgICAgICAweGE2ODUwMDAwYTY4NiwKICAgICAgICAweGE2ODcwMDAwYTY4OCwKICAgICAgICAweGE2ODkwMDAwYTY4YSwKICAgICAgICAweGE2OGIwMDAwYTY4YywKICAgICAgICAweGE2OGQwMDAwYTY4ZSwKICAgICAgICAweGE2OGYwMDAwYTY5MCwKICAgICAgICAweGE2OTEwMDAwYTY5MiwKICAgICAgICAweGE2OTMwMDAwYTY5NCwKICAgICAgICAweGE2OTUwMDAwYTY5NiwKICAgICAgICAweGE2OTcwMDAwYTY5OCwKICAgICAgICAweGE2OWYwMDAwYTZlNiwKICAgICAgICAweGE2ZjAwMDAwYTZmMiwKICAgICAgICAweGE3MTcwMDAwYTcyMCwKICAgICAgICAweGE3MjMwMDAwYTcyNCwKICAgICAgICAweGE3MjUwMDAwYTcyNiwKICAgICAgICAweGE3MjcwMDAwYTcyOCwKICAgICAgICAweGE3MjkwMDAwYTcyYSwKICAgICAgICAweGE3MmIwMDAwYTcyYywKICAgICAgICAweGE3MmQwMDAwYTcyZSwKICAgICAgICAweGE3MmYwMDAwYTczMiwKICAgICAgICAweGE3MzMwMDAwYTczNCwKICAgICAgICAweGE3MzUwMDAwYTczNiwKICAgICAgICAweGE3MzcwMDAwYTczOCwKICAgICAgICAweGE3MzkwMDAwYTczYSwKICAgICAgICAweGE3M2IwMDAwYTczYywKICAgICAgICAweGE3M2QwMDAwYTczZSwKICAgICAgICAweGE3M2YwMDAwYTc0MCwKICAgICAgICAweGE3NDEwMDAwYTc0MiwKICAgICAgICAweGE3NDMwMDAwYTc0NCwKICAgICAgICAweGE3NDUwMDAwYTc0NiwKICAgICAgICAweGE3NDcwMDAwYTc0OCwKICAgICAgICAweGE3NDkwMDAwYTc0YSwKICAgICAgICAweGE3NGIwMDAwYTc0YywKICAgICAgICAweGE3NGQwMDAwYTc0ZSwKICAgICAgICAweGE3NGYwMDAwYTc1MCwKICAgICAgICAweGE3NTEwMDAwYTc1MiwKICAgICAgICAweGE3NTMwMDAwYTc1NCwKICAgICAgICAweGE3NTUwMDAwYTc1NiwKICAgICAgICAweGE3NTcwMDAwYTc1OCwKICAgICAgICAweGE3NTkwMDAwYTc1YSwKICAgICAgICAweGE3NWIwMDAwYTc1YywKICAgICAgICAweGE3NWQwMDAwYTc1ZSwKICAgICAgICAweGE3NWYwMDAwYTc2MCwKICAgICAgICAweGE3NjEwMDAwYTc2MiwKICAgICAgICAweGE3NjMwMDAwYTc2NCwKICAgICAgICAweGE3NjUwMDAwYTc2NiwKICAgICAgICAweGE3NjcwMDAwYTc2OCwKICAgICAgICAweGE3NjkwMDAwYTc2YSwKICAgICAgICAweGE3NmIwMDAwYTc2YywKICAgICAgICAweGE3NmQwMDAwYTc2ZSwKICAgICAgICAweGE3NmYwMDAwYTc3MCwKICAgICAgICAweGE3NzEwMDAwYTc3OSwKICAgICAgICAweGE3N2EwMDAwYTc3YiwKICAgICAgICAweGE3N2MwMDAwYTc3ZCwKICAgICAgICAweGE3N2YwMDAwYTc4MCwKICAgICAgICAweGE3ODEwMDAwYTc4MiwKICAgICAgICAweGE3ODMwMDAwYTc4NCwKICAgICAgICAweGE3ODUwMDAwYTc4NiwKICAgICAgICAweGE3ODcwMDAwYTc4OSwKICAgICAgICAweGE3OGMwMDAwYTc4ZCwKICAgICAgICAweGE3OGUwMDAwYTc4ZiwKICAgICAgICAweGE3OTEwMDAwYTc5MiwKICAgICAgICAweGE3OTMwMDAwYTc5NCwKICAgICAgICAweGE3YTEwMDAwYTdhMiwKICAgICAgICAweGE3YTMwMDAwYTdhNCwKICAgICAgICAweGE3YTUwMDAwYTdhNiwKICAgICAgICAweGE3YTcwMDAwYTdhOCwKICAgICAgICAweGE3YTkwMDAwYTdhYSwKICAgICAgICAweGE3ZmEwMDAwYTgyOCwKICAgICAgICAweGE4NDAwMDAwYTg3NCwKICAgICAgICAweGE4ODAwMDAwYThjNSwKICAgICAgICAweGE4ZDAwMDAwYThkYSwKICAgICAgICAweGE4ZTAwMDAwYThmOCwKICAgICAgICAweGE4ZmIwMDAwYThmYywKICAgICAgICAweGE5MDAwMDAwYTkyZSwKICAgICAgICAweGE5MzAwMDAwYTk1NCwKICAgICAgICAweGE5ODAwMDAwYTljMSwKICAgICAgICAweGE5Y2YwMDAwYTlkYSwKICAgICAgICAweGFhMDAwMDAwYWEzNywKICAgICAgICAweGFhNDAwMDAwYWE0ZSwKICAgICAgICAweGFhNTAwMDAwYWE1YSwKICAgICAgICAweGFhNjAwMDAwYWE3NywKICAgICAgICAweGFhN2EwMDAwYWE3YywKICAgICAgICAweGFhODAwMDAwYWFjMywKICAgICAgICAweGFhZGIwMDAwYWFkZSwKICAgICAgICAweGFhZTAwMDAwYWFmMCwKICAgICAgICAweGFhZjIwMDAwYWFmNywKICAgICAgICAweGFiMDEwMDAwYWIwNywKICAgICAgICAweGFiMDkwMDAwYWIwZiwKICAgICAgICAweGFiMTEwMDAwYWIxNywKICAgICAgICAweGFiMjAwMDAwYWIyNywKICAgICAgICAweGFiMjgwMDAwYWIyZiwKICAgICAgICAweGFiYzAwMDAwYWJlYiwKICAgICAgICAweGFiZWMwMDAwYWJlZSwKICAgICAgICAweGFiZjAwMDAwYWJmYSwKICAgICAgICAweGFjMDAwMDAwZDdhNCwKICAgICAgICAweGZhMGUwMDAwZmExMCwKICAgICAgICAweGZhMTEwMDAwZmExMiwKICAgICAgICAweGZhMTMwMDAwZmExNSwKICAgICAgICAweGZhMWYwMDAwZmEyMCwKICAgICAgICAweGZhMjEwMDAwZmEyMiwKICAgICAgICAweGZhMjMwMDAwZmEyNSwKICAgICAgICAweGZhMjcwMDAwZmEyYSwKICAgICAgICAweGZiMWUwMDAwZmIxZiwKICAgICAgICAweGZlMjAwMDAwZmUyNywKICAgICAgICAweGZlNzMwMDAwZmU3NCwKICAgICAgICAweDEwMDAwMDAwMTAwMGMsCiAgICAgICAgMHgxMDAwZDAwMDEwMDI3LAogICAgICAgIDB4MTAwMjgwMDAxMDAzYiwKICAgICAgICAweDEwMDNjMDAwMTAwM2UsCiAgICAgICAgMHgxMDAzZjAwMDEwMDRlLAogICAgICAgIDB4MTAwNTAwMDAxMDA1ZSwKICAgICAgICAweDEwMDgwMDAwMTAwZmIsCiAgICAgICAgMHgxMDFmZDAwMDEwMWZlLAogICAgICAgIDB4MTAyODAwMDAxMDI5ZCwKICAgICAgICAweDEwMmEwMDAwMTAyZDEsCiAgICAgICAgMHgxMDMwMDAwMDEwMzFmLAogICAgICAgIDB4MTAzMzAwMDAxMDM0MSwKICAgICAgICAweDEwMzQyMDAwMTAzNGEsCiAgICAgICAgMHgxMDM4MDAwMDEwMzllLAogICAgICAgIDB4MTAzYTAwMDAxMDNjNCwKICAgICAgICAweDEwM2M4MDAwMTAzZDAsCiAgICAgICAgMHgxMDQyODAwMDEwNDllLAogICAgICAgIDB4MTA0YTAwMDAxMDRhYSwKICAgICAgICAweDEwODAwMDAwMTA4MDYsCiAgICAgICAgMHgxMDgwODAwMDEwODA5LAogICAgICAgIDB4MTA4MGEwMDAxMDgzNiwKICAgICAgICAweDEwODM3MDAwMTA4MzksCiAgICAgICAgMHgxMDgzYzAwMDEwODNkLAogICAgICAgIDB4MTA4M2YwMDAxMDg1NiwKICAgICAgICAweDEwOTAwMDAwMTA5MTYsCiAgICAgICAgMHgxMDkyMDAwMDEwOTNhLAogICAgICAgIDB4MTA5ODAwMDAxMDliOCwKICAgICAgICAweDEwOWJlMDAwMTA5YzAsCiAgICAgICAgMHgxMGEwMDAwMDEwYTA0LAogICAgICAgIDB4MTBhMDUwMDAxMGEwNywKICAgICAgICAweDEwYTBjMDAwMTBhMTQsCiAgICAgICAgMHgxMGExNTAwMDEwYTE4LAogICAgICAgIDB4MTBhMTkwMDAxMGEzNCwKICAgICAgICAweDEwYTM4MDAwMTBhM2IsCiAgICAgICAgMHgxMGEzZjAwMDEwYTQwLAogICAgICAgIDB4MTBhNjAwMDAxMGE3ZCwKICAgICAgICAweDEwYjAwMDAwMTBiMzYsCiAgICAgICAgMHgxMGI0MDAwMDEwYjU2LAogICAgICAgIDB4MTBiNjAwMDAxMGI3MywKICAgICAgICAweDEwYzAwMDAwMTBjNDksCiAgICAgICAgMHgxMTAwMDAwMDExMDQ3LAogICAgICAgIDB4MTEwNjYwMDAxMTA3MCwKICAgICAgICAweDExMDgwMDAwMTEwYmIsCiAgICAgICAgMHgxMTBkMDAwMDExMGU5LAogICAgICAgIDB4MTEwZjAwMDAxMTBmYSwKICAgICAgICAweDExMTAwMDAwMTExMzUsCiAgICAgICAgMHgxMTEzNjAwMDExMTQwLAogICAgICAgIDB4MTExODAwMDAxMTFjNSwKICAgICAgICAweDExMWQwMDAwMTExZGEsCiAgICAgICAgMHgxMTY4MDAwMDExNmI4LAogICAgICAgIDB4MTE2YzAwMDAxMTZjYSwKICAgICAgICAweDEyMDAwMDAwMTIzNmYsCiAgICAgICAgMHgxMzAwMDAwMDEzNDJmLAogICAgICAgIDB4MTY4MDAwMDAxNmEzOSwKICAgICAgICAweDE2ZjAwMDAwMTZmNDUsCiAgICAgICAgMHgxNmY1MDAwMDE2ZjdmLAogICAgICAgIDB4MTZmOGYwMDAxNmZhMCwKICAgICAgICAweDFiMDAwMDAwMWIwMDIsCiAgICAgICAgMHgyMDAwMDAwMDJhNmQ3LAogICAgICAgIDB4MmE3MDAwMDAyYjczNSwKICAgICAgICAweDJiNzQwMDAwMmI4MWUsCiAgICApLAogICAgJ0NPTlRFWFRKJzogKAogICAgICAgIDB4MjAwYzAwMDAyMDBlLAogICAgKSwKICAgICdDT05URVhUTyc6ICgKICAgICAgICAweGI3MDAwMDAwYjgsCiAgICAgICAgMHgzNzUwMDAwMDM3NiwKICAgICAgICAweDVmMzAwMDAwNWY1LAogICAgICAgIDB4NjYwMDAwMDA2NmEsCiAgICAgICAgMHg2ZjAwMDAwMDZmYSwKICAgICAgICAweDMwZmIwMDAwMzBmYywKICAgICksCn0KUEsDBBQAAAAAAAAAIQC3Y/Sy1QYAANUGAAA6AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9pZG5hL2ludHJhbmdlcy5weSIiIgpHaXZlbiBhIGxpc3Qgb2YgaW50ZWdlcnMsIG1hZGUgdXAgb2YgKGhvcGVmdWxseSkgYSBzbWFsbCBudW1iZXIgb2YgbG9uZyBydW5zCm9mIGNvbnNlY3V0aXZlIGludGVnZXJzLCBjb21wdXRlIGEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGZvcm0KKChzdGFydDEsIGVuZDEpLCAoc3RhcnQyLCBlbmQyKSAuLi4pLiBUaGVuIGFuc3dlciB0aGUgcXVlc3Rpb24gIndhcyB4IHByZXNlbnQKaW4gdGhlIG9yaWdpbmFsIGxpc3Q/IiBpbiB0aW1lIE8obG9nKCMgcnVucykpLgoiIiIKCmltcG9ydCBiaXNlY3QKCmRlZiBpbnRyYW5nZXNfZnJvbV9saXN0KGxpc3RfKToKICAgICIiIlJlcHJlc2VudCBhIGxpc3Qgb2YgaW50ZWdlcnMgYXMgYSBzZXF1ZW5jZSBvZiByYW5nZXM6CiAgICAoKHN0YXJ0XzAsIGVuZF8wKSwgKHN0YXJ0XzEsIGVuZF8xKSwgLi4uKSwgc3VjaCB0aGF0IHRoZSBvcmlnaW5hbAogICAgaW50ZWdlcnMgYXJlIGV4YWN0bHkgdGhvc2UgeCBzdWNoIHRoYXQgc3RhcnRfaSA8PSB4IDwgZW5kX2kgZm9yIHNvbWUgaS4KCiAgICBSYW5nZXMgYXJlIGVuY29kZWQgYXMgc2luZ2xlIGludGVnZXJzIChzdGFydCA8PCAzMiB8IGVuZCksIG5vdCBhcyB0dXBsZXMuCiAgICAiIiIKCiAgICBzb3J0ZWRfbGlzdCA9IHNvcnRlZChsaXN0XykKICAgIHJhbmdlcyA9IFtdCiAgICBsYXN0X3dyaXRlID0gLTEKICAgIGZvciBpIGluIHJhbmdlKGxlbihzb3J0ZWRfbGlzdCkpOgogICAgICAgIGlmIGkrMSA8IGxlbihzb3J0ZWRfbGlzdCk6CiAgICAgICAgICAgIGlmIHNvcnRlZF9saXN0W2ldID09IHNvcnRlZF9saXN0W2krMV0tMToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgY3VycmVudF9yYW5nZSA9IHNvcnRlZF9saXN0W2xhc3Rfd3JpdGUrMTppKzFdCiAgICAgICAgcmFuZ2VzLmFwcGVuZChfZW5jb2RlX3JhbmdlKGN1cnJlbnRfcmFuZ2VbMF0sIGN1cnJlbnRfcmFuZ2VbLTFdICsgMSkpCiAgICAgICAgbGFzdF93cml0ZSA9IGkKCiAgICByZXR1cm4gdHVwbGUocmFuZ2VzKQoKZGVmIF9lbmNvZGVfcmFuZ2Uoc3RhcnQsIGVuZCk6CiAgICByZXR1cm4gKHN0YXJ0IDw8IDMyKSB8IGVuZAoKZGVmIF9kZWNvZGVfcmFuZ2Uocik6CiAgICByZXR1cm4gKHIgPj4gMzIpLCAociAmICgoMSA8PCAzMikgLSAxKSkKCgpkZWYgaW50cmFuZ2VzX2NvbnRhaW4oaW50XywgcmFuZ2VzKToKICAgICIiIkRldGVybWluZSBpZiBgaW50X2AgZmFsbHMgaW50byBvbmUgb2YgdGhlIHJhbmdlcyBpbiBgcmFuZ2VzYC4iIiIKICAgIHR1cGxlXyA9IF9lbmNvZGVfcmFuZ2UoaW50XywgMCkKICAgIHBvcyA9IGJpc2VjdC5iaXNlY3RfbGVmdChyYW5nZXMsIHR1cGxlXykKICAgICMgd2UgY291bGQgYmUgaW1tZWRpYXRlbHkgYWhlYWQgb2YgYSB0dXBsZSAoc3RhcnQsIGVuZCkKICAgICMgd2l0aCBzdGFydCA8IGludF8gPD0gZW5kCiAgICBpZiBwb3MgPiAwOgogICAgICAgIGxlZnQsIHJpZ2h0ID0gX2RlY29kZV9yYW5nZShyYW5nZXNbcG9zLTFdKQogICAgICAgIGlmIGxlZnQgPD0gaW50XyA8IHJpZ2h0OgogICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgIyBvciB3ZSBjb3VsZCBiZSBpbW1lZGlhdGVseSBiZWhpbmQgYSB0dXBsZSAoaW50XywgZW5kKQogICAgaWYgcG9zIDwgbGVuKHJhbmdlcyk6CiAgICAgICAgbGVmdCwgXyA9IF9kZWNvZGVfcmFuZ2UocmFuZ2VzW3Bvc10pCiAgICAgICAgaWYgbGVmdCA9PSBpbnRfOgogICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgcmV0dXJuIEZhbHNlClBLAwQUAAAAAAAAACEAG+d9ohUAAAAVAAAAPQAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaWRuYS9wYWNrYWdlX2RhdGEucHlfX3ZlcnNpb25fXyA9ICcyLjYnCgpQSwMEFAAAAAAAAAAhAMmFhYVw0gIAcNICADoAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2lkbmEvdXRzNDZkYXRhLnB5IyBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdG9vbHMvaWRuYS1kYXRhCiMgdmltOiBzZXQgZmlsZWVuY29kaW5nPXV0Zi04IDoKCiIiIklETkEgTWFwcGluZyBUYWJsZSBmcm9tIFVUUzQ2LiIiIgoKCl9fdmVyc2lvbl9fID0gIjYuMy4wIgpkZWYgX3NlZ18wKCk6CiAgICByZXR1cm4gWwogICAgKDB4MCwgJzMnKSwKICAgICgweDEsICczJyksCiAgICAoMHgyLCAnMycpLAogICAgKDB4MywgJzMnKSwKICAgICgweDQsICczJyksCiAgICAoMHg1LCAnMycpLAogICAgKDB4NiwgJzMnKSwKICAgICgweDcsICczJyksCiAgICAoMHg4LCAnMycpLAogICAgKDB4OSwgJzMnKSwKICAgICgweEEsICczJyksCiAgICAoMHhCLCAnMycpLAogICAgKDB4QywgJzMnKSwKICAgICgweEQsICczJyksCiAgICAoMHhFLCAnMycpLAogICAgKDB4RiwgJzMnKSwKICAgICgweDEwLCAnMycpLAogICAgKDB4MTEsICczJyksCiAgICAoMHgxMiwgJzMnKSwKICAgICgweDEzLCAnMycpLAogICAgKDB4MTQsICczJyksCiAgICAoMHgxNSwgJzMnKSwKICAgICgweDE2LCAnMycpLAogICAgKDB4MTcsICczJyksCiAgICAoMHgxOCwgJzMnKSwKICAgICgweDE5LCAnMycpLAogICAgKDB4MUEsICczJyksCiAgICAoMHgxQiwgJzMnKSwKICAgICgweDFDLCAnMycpLAogICAgKDB4MUQsICczJyksCiAgICAoMHgxRSwgJzMnKSwKICAgICgweDFGLCAnMycpLAogICAgKDB4MjAsICczJyksCiAgICAoMHgyMSwgJzMnKSwKICAgICgweDIyLCAnMycpLAogICAgKDB4MjMsICczJyksCiAgICAoMHgyNCwgJzMnKSwKICAgICgweDI1LCAnMycpLAogICAgKDB4MjYsICczJyksCiAgICAoMHgyNywgJzMnKSwKICAgICgweDI4LCAnMycpLAogICAgKDB4MjksICczJyksCiAgICAoMHgyQSwgJzMnKSwKICAgICgweDJCLCAnMycpLAogICAgKDB4MkMsICczJyksCiAgICAoMHgyRCwgJ1YnKSwKICAgICgweDJFLCAnVicpLAogICAgKDB4MkYsICczJyksCiAgICAoMHgzMCwgJ1YnKSwKICAgICgweDMxLCAnVicpLAogICAgKDB4MzIsICdWJyksCiAgICAoMHgzMywgJ1YnKSwKICAgICgweDM0LCAnVicpLAogICAgKDB4MzUsICdWJyksCiAgICAoMHgzNiwgJ1YnKSwKICAgICgweDM3LCAnVicpLAogICAgKDB4MzgsICdWJyksCiAgICAoMHgzOSwgJ1YnKSwKICAgICgweDNBLCAnMycpLAogICAgKDB4M0IsICczJyksCiAgICAoMHgzQywgJzMnKSwKICAgICgweDNELCAnMycpLAogICAgKDB4M0UsICczJyksCiAgICAoMHgzRiwgJzMnKSwKICAgICgweDQwLCAnMycpLAogICAgKDB4NDEsICdNJywgdSdhJyksCiAgICAoMHg0MiwgJ00nLCB1J2InKSwKICAgICgweDQzLCAnTScsIHUnYycpLAogICAgKDB4NDQsICdNJywgdSdkJyksCiAgICAoMHg0NSwgJ00nLCB1J2UnKSwKICAgICgweDQ2LCAnTScsIHUnZicpLAogICAgKDB4NDcsICdNJywgdSdnJyksCiAgICAoMHg0OCwgJ00nLCB1J2gnKSwKICAgICgweDQ5LCAnTScsIHUnaScpLAogICAgKDB4NEEsICdNJywgdSdqJyksCiAgICAoMHg0QiwgJ00nLCB1J2snKSwKICAgICgweDRDLCAnTScsIHUnbCcpLAogICAgKDB4NEQsICdNJywgdSdtJyksCiAgICAoMHg0RSwgJ00nLCB1J24nKSwKICAgICgweDRGLCAnTScsIHUnbycpLAogICAgKDB4NTAsICdNJywgdSdwJyksCiAgICAoMHg1MSwgJ00nLCB1J3EnKSwKICAgICgweDUyLCAnTScsIHUncicpLAogICAgKDB4NTMsICdNJywgdSdzJyksCiAgICAoMHg1NCwgJ00nLCB1J3QnKSwKICAgICgweDU1LCAnTScsIHUndScpLAogICAgKDB4NTYsICdNJywgdSd2JyksCiAgICAoMHg1NywgJ00nLCB1J3cnKSwKICAgICgweDU4LCAnTScsIHUneCcpLAogICAgKDB4NTksICdNJywgdSd5JyksCiAgICAoMHg1QSwgJ00nLCB1J3onKSwKICAgICgweDVCLCAnMycpLAogICAgKDB4NUMsICczJyksCiAgICAoMHg1RCwgJzMnKSwKICAgICgweDVFLCAnMycpLAogICAgKDB4NUYsICczJyksCiAgICAoMHg2MCwgJzMnKSwKICAgICgweDYxLCAnVicpLAogICAgKDB4NjIsICdWJyksCiAgICAoMHg2MywgJ1YnKSwKICAgIF0KCmRlZiBfc2VnXzEoKToKICAgIHJldHVybiBbCiAgICAoMHg2NCwgJ1YnKSwKICAgICgweDY1LCAnVicpLAogICAgKDB4NjYsICdWJyksCiAgICAoMHg2NywgJ1YnKSwKICAgICgweDY4LCAnVicpLAogICAgKDB4NjksICdWJyksCiAgICAoMHg2QSwgJ1YnKSwKICAgICgweDZCLCAnVicpLAogICAgKDB4NkMsICdWJyksCiAgICAoMHg2RCwgJ1YnKSwKICAgICgweDZFLCAnVicpLAogICAgKDB4NkYsICdWJyksCiAgICAoMHg3MCwgJ1YnKSwKICAgICgweDcxLCAnVicpLAogICAgKDB4NzIsICdWJyksCiAgICAoMHg3MywgJ1YnKSwKICAgICgweDc0LCAnVicpLAogICAgKDB4NzUsICdWJyksCiAgICAoMHg3NiwgJ1YnKSwKICAgICgweDc3LCAnVicpLAogICAgKDB4NzgsICdWJyksCiAgICAoMHg3OSwgJ1YnKSwKICAgICgweDdBLCAnVicpLAogICAgKDB4N0IsICczJyksCiAgICAoMHg3QywgJzMnKSwKICAgICgweDdELCAnMycpLAogICAgKDB4N0UsICczJyksCiAgICAoMHg3RiwgJzMnKSwKICAgICgweDgwLCAnWCcpLAogICAgKDB4ODEsICdYJyksCiAgICAoMHg4MiwgJ1gnKSwKICAgICgweDgzLCAnWCcpLAogICAgKDB4ODQsICdYJyksCiAgICAoMHg4NSwgJ1gnKSwKICAgICgweDg2LCAnWCcpLAogICAgKDB4ODcsICdYJyksCiAgICAoMHg4OCwgJ1gnKSwKICAgICgweDg5LCAnWCcpLAogICAgKDB4OEEsICdYJyksCiAgICAoMHg4QiwgJ1gnKSwKICAgICgweDhDLCAnWCcpLAogICAgKDB4OEQsICdYJyksCiAgICAoMHg4RSwgJ1gnKSwKICAgICgweDhGLCAnWCcpLAogICAgKDB4OTAsICdYJyksCiAgICAoMHg5MSwgJ1gnKSwKICAgICgweDkyLCAnWCcpLAogICAgKDB4OTMsICdYJyksCiAgICAoMHg5NCwgJ1gnKSwKICAgICgweDk1LCAnWCcpLAogICAgKDB4OTYsICdYJyksCiAgICAoMHg5NywgJ1gnKSwKICAgICgweDk4LCAnWCcpLAogICAgKDB4OTksICdYJyksCiAgICAoMHg5QSwgJ1gnKSwKICAgICgweDlCLCAnWCcpLAogICAgKDB4OUMsICdYJyksCiAgICAoMHg5RCwgJ1gnKSwKICAgICgweDlFLCAnWCcpLAogICAgKDB4OUYsICdYJyksCiAgICAoMHhBMCwgJzMnLCB1JyAnKSwKICAgICgweEExLCAnVicpLAogICAgKDB4QTIsICdWJyksCiAgICAoMHhBMywgJ1YnKSwKICAgICgweEE0LCAnVicpLAogICAgKDB4QTUsICdWJyksCiAgICAoMHhBNiwgJ1YnKSwKICAgICgweEE3LCAnVicpLAogICAgKDB4QTgsICczJywgdScgzIgnKSwKICAgICgweEE5LCAnVicpLAogICAgKDB4QUEsICdNJywgdSdhJyksCiAgICAoMHhBQiwgJ1YnKSwKICAgICgweEFDLCAnVicpLAogICAgKDB4QUQsICdJJyksCiAgICAoMHhBRSwgJ1YnKSwKICAgICgweEFGLCAnMycsIHUnIMyEJyksCiAgICAoMHhCMCwgJ1YnKSwKICAgICgweEIxLCAnVicpLAogICAgKDB4QjIsICdNJywgdScyJyksCiAgICAoMHhCMywgJ00nLCB1JzMnKSwKICAgICgweEI0LCAnMycsIHUnIMyBJyksCiAgICAoMHhCNSwgJ00nLCB1J868JyksCiAgICAoMHhCNiwgJ1YnKSwKICAgICgweEI3LCAnVicpLAogICAgKDB4QjgsICczJywgdScgzKcnKSwKICAgICgweEI5LCAnTScsIHUnMScpLAogICAgKDB4QkEsICdNJywgdSdvJyksCiAgICAoMHhCQiwgJ1YnKSwKICAgICgweEJDLCAnTScsIHUnMeKBhDQnKSwKICAgICgweEJELCAnTScsIHUnMeKBhDInKSwKICAgICgweEJFLCAnTScsIHUnM+KBhDQnKSwKICAgICgweEJGLCAnVicpLAogICAgKDB4QzAsICdNJywgdSfDoCcpLAogICAgKDB4QzEsICdNJywgdSfDoScpLAogICAgKDB4QzIsICdNJywgdSfDoicpLAogICAgKDB4QzMsICdNJywgdSfDoycpLAogICAgKDB4QzQsICdNJywgdSfDpCcpLAogICAgKDB4QzUsICdNJywgdSfDpScpLAogICAgKDB4QzYsICdNJywgdSfDpicpLAogICAgKDB4QzcsICdNJywgdSfDpycpLAogICAgXQoKZGVmIF9zZWdfMigpOgogICAgcmV0dXJuIFsKICAgICgweEM4LCAnTScsIHUnw6gnKSwKICAgICgweEM5LCAnTScsIHUnw6knKSwKICAgICgweENBLCAnTScsIHUnw6onKSwKICAgICgweENCLCAnTScsIHUnw6snKSwKICAgICgweENDLCAnTScsIHUnw6wnKSwKICAgICgweENELCAnTScsIHUnw60nKSwKICAgICgweENFLCAnTScsIHUnw64nKSwKICAgICgweENGLCAnTScsIHUnw68nKSwKICAgICgweEQwLCAnTScsIHUnw7AnKSwKICAgICgweEQxLCAnTScsIHUnw7EnKSwKICAgICgweEQyLCAnTScsIHUnw7InKSwKICAgICgweEQzLCAnTScsIHUnw7MnKSwKICAgICgweEQ0LCAnTScsIHUnw7QnKSwKICAgICgweEQ1LCAnTScsIHUnw7UnKSwKICAgICgweEQ2LCAnTScsIHUnw7YnKSwKICAgICgweEQ3LCAnVicpLAogICAgKDB4RDgsICdNJywgdSfDuCcpLAogICAgKDB4RDksICdNJywgdSfDuScpLAogICAgKDB4REEsICdNJywgdSfDuicpLAogICAgKDB4REIsICdNJywgdSfDuycpLAogICAgKDB4REMsICdNJywgdSfDvCcpLAogICAgKDB4REQsICdNJywgdSfDvScpLAogICAgKDB4REUsICdNJywgdSfDvicpLAogICAgKDB4REYsICdEJywgdSdzcycpLAogICAgKDB4RTAsICdWJyksCiAgICAoMHhFMSwgJ1YnKSwKICAgICgweEUyLCAnVicpLAogICAgKDB4RTMsICdWJyksCiAgICAoMHhFNCwgJ1YnKSwKICAgICgweEU1LCAnVicpLAogICAgKDB4RTYsICdWJyksCiAgICAoMHhFNywgJ1YnKSwKICAgICgweEU4LCAnVicpLAogICAgKDB4RTksICdWJyksCiAgICAoMHhFQSwgJ1YnKSwKICAgICgweEVCLCAnVicpLAogICAgKDB4RUMsICdWJyksCiAgICAoMHhFRCwgJ1YnKSwKICAgICgweEVFLCAnVicpLAogICAgKDB4RUYsICdWJyksCiAgICAoMHhGMCwgJ1YnKSwKICAgICgweEYxLCAnVicpLAogICAgKDB4RjIsICdWJyksCiAgICAoMHhGMywgJ1YnKSwKICAgICgweEY0LCAnVicpLAogICAgKDB4RjUsICdWJyksCiAgICAoMHhGNiwgJ1YnKSwKICAgICgweEY3LCAnVicpLAogICAgKDB4RjgsICdWJyksCiAgICAoMHhGOSwgJ1YnKSwKICAgICgweEZBLCAnVicpLAogICAgKDB4RkIsICdWJyksCiAgICAoMHhGQywgJ1YnKSwKICAgICgweEZELCAnVicpLAogICAgKDB4RkUsICdWJyksCiAgICAoMHhGRiwgJ1YnKSwKICAgICgweDEwMCwgJ00nLCB1J8SBJyksCiAgICAoMHgxMDEsICdWJyksCiAgICAoMHgxMDIsICdNJywgdSfEgycpLAogICAgKDB4MTAzLCAnVicpLAogICAgKDB4MTA0LCAnTScsIHUnxIUnKSwKICAgICgweDEwNSwgJ1YnKSwKICAgICgweDEwNiwgJ00nLCB1J8SHJyksCiAgICAoMHgxMDcsICdWJyksCiAgICAoMHgxMDgsICdNJywgdSfEiScpLAogICAgKDB4MTA5LCAnVicpLAogICAgKDB4MTBBLCAnTScsIHUnxIsnKSwKICAgICgweDEwQiwgJ1YnKSwKICAgICgweDEwQywgJ00nLCB1J8SNJyksCiAgICAoMHgxMEQsICdWJyksCiAgICAoMHgxMEUsICdNJywgdSfEjycpLAogICAgKDB4MTBGLCAnVicpLAogICAgKDB4MTEwLCAnTScsIHUnxJEnKSwKICAgICgweDExMSwgJ1YnKSwKICAgICgweDExMiwgJ00nLCB1J8STJyksCiAgICAoMHgxMTMsICdWJyksCiAgICAoMHgxMTQsICdNJywgdSfElScpLAogICAgKDB4MTE1LCAnVicpLAogICAgKDB4MTE2LCAnTScsIHUnxJcnKSwKICAgICgweDExNywgJ1YnKSwKICAgICgweDExOCwgJ00nLCB1J8SZJyksCiAgICAoMHgxMTksICdWJyksCiAgICAoMHgxMUEsICdNJywgdSfEmycpLAogICAgKDB4MTFCLCAnVicpLAogICAgKDB4MTFDLCAnTScsIHUnxJ0nKSwKICAgICgweDExRCwgJ1YnKSwKICAgICgweDExRSwgJ00nLCB1J8SfJyksCiAgICAoMHgxMUYsICdWJyksCiAgICAoMHgxMjAsICdNJywgdSfEoScpLAogICAgKDB4MTIxLCAnVicpLAogICAgKDB4MTIyLCAnTScsIHUnxKMnKSwKICAgICgweDEyMywgJ1YnKSwKICAgICgweDEyNCwgJ00nLCB1J8SlJyksCiAgICAoMHgxMjUsICdWJyksCiAgICAoMHgxMjYsICdNJywgdSfEpycpLAogICAgKDB4MTI3LCAnVicpLAogICAgKDB4MTI4LCAnTScsIHUnxKknKSwKICAgICgweDEyOSwgJ1YnKSwKICAgICgweDEyQSwgJ00nLCB1J8SrJyksCiAgICAoMHgxMkIsICdWJyksCiAgICBdCgpkZWYgX3NlZ18zKCk6CiAgICByZXR1cm4gWwogICAgKDB4MTJDLCAnTScsIHUnxK0nKSwKICAgICgweDEyRCwgJ1YnKSwKICAgICgweDEyRSwgJ00nLCB1J8SvJyksCiAgICAoMHgxMkYsICdWJyksCiAgICAoMHgxMzAsICdNJywgdSdpzIcnKSwKICAgICgweDEzMSwgJ1YnKSwKICAgICgweDEzMiwgJ00nLCB1J2lqJyksCiAgICAoMHgxMzQsICdNJywgdSfEtScpLAogICAgKDB4MTM1LCAnVicpLAogICAgKDB4MTM2LCAnTScsIHUnxLcnKSwKICAgICgweDEzNywgJ1YnKSwKICAgICgweDEzOSwgJ00nLCB1J8S6JyksCiAgICAoMHgxM0EsICdWJyksCiAgICAoMHgxM0IsICdNJywgdSfEvCcpLAogICAgKDB4MTNDLCAnVicpLAogICAgKDB4MTNELCAnTScsIHUnxL4nKSwKICAgICgweDEzRSwgJ1YnKSwKICAgICgweDEzRiwgJ00nLCB1J2zCtycpLAogICAgKDB4MTQxLCAnTScsIHUnxYInKSwKICAgICgweDE0MiwgJ1YnKSwKICAgICgweDE0MywgJ00nLCB1J8WEJyksCiAgICAoMHgxNDQsICdWJyksCiAgICAoMHgxNDUsICdNJywgdSfFhicpLAogICAgKDB4MTQ2LCAnVicpLAogICAgKDB4MTQ3LCAnTScsIHUnxYgnKSwKICAgICgweDE0OCwgJ1YnKSwKICAgICgweDE0OSwgJ00nLCB1J8q8bicpLAogICAgKDB4MTRBLCAnTScsIHUnxYsnKSwKICAgICgweDE0QiwgJ1YnKSwKICAgICgweDE0QywgJ00nLCB1J8WNJyksCiAgICAoMHgxNEQsICdWJyksCiAgICAoMHgxNEUsICdNJywgdSfFjycpLAogICAgKDB4MTRGLCAnVicpLAogICAgKDB4MTUwLCAnTScsIHUnxZEnKSwKICAgICgweDE1MSwgJ1YnKSwKICAgICgweDE1MiwgJ00nLCB1J8WTJyksCiAgICAoMHgxNTMsICdWJyksCiAgICAoMHgxNTQsICdNJywgdSfFlScpLAogICAgKDB4MTU1LCAnVicpLAogICAgKDB4MTU2LCAnTScsIHUnxZcnKSwKICAgICgweDE1NywgJ1YnKSwKICAgICgweDE1OCwgJ00nLCB1J8WZJyksCiAgICAoMHgxNTksICdWJyksCiAgICAoMHgxNUEsICdNJywgdSfFmycpLAogICAgKDB4MTVCLCAnVicpLAogICAgKDB4MTVDLCAnTScsIHUnxZ0nKSwKICAgICgweDE1RCwgJ1YnKSwKICAgICgweDE1RSwgJ00nLCB1J8WfJyksCiAgICAoMHgxNUYsICdWJyksCiAgICAoMHgxNjAsICdNJywgdSfFoScpLAogICAgKDB4MTYxLCAnVicpLAogICAgKDB4MTYyLCAnTScsIHUnxaMnKSwKICAgICgweDE2MywgJ1YnKSwKICAgICgweDE2NCwgJ00nLCB1J8WlJyksCiAgICAoMHgxNjUsICdWJyksCiAgICAoMHgxNjYsICdNJywgdSfFpycpLAogICAgKDB4MTY3LCAnVicpLAogICAgKDB4MTY4LCAnTScsIHUnxaknKSwKICAgICgweDE2OSwgJ1YnKSwKICAgICgweDE2QSwgJ00nLCB1J8WrJyksCiAgICAoMHgxNkIsICdWJyksCiAgICAoMHgxNkMsICdNJywgdSfFrScpLAogICAgKDB4MTZELCAnVicpLAogICAgKDB4MTZFLCAnTScsIHUnxa8nKSwKICAgICgweDE2RiwgJ1YnKSwKICAgICgweDE3MCwgJ00nLCB1J8WxJyksCiAgICAoMHgxNzEsICdWJyksCiAgICAoMHgxNzIsICdNJywgdSfFsycpLAogICAgKDB4MTczLCAnVicpLAogICAgKDB4MTc0LCAnTScsIHUnxbUnKSwKICAgICgweDE3NSwgJ1YnKSwKICAgICgweDE3NiwgJ00nLCB1J8W3JyksCiAgICAoMHgxNzcsICdWJyksCiAgICAoMHgxNzgsICdNJywgdSfDvycpLAogICAgKDB4MTc5LCAnTScsIHUnxbonKSwKICAgICgweDE3QSwgJ1YnKSwKICAgICgweDE3QiwgJ00nLCB1J8W8JyksCiAgICAoMHgxN0MsICdWJyksCiAgICAoMHgxN0QsICdNJywgdSfFvicpLAogICAgKDB4MTdFLCAnVicpLAogICAgKDB4MTdGLCAnTScsIHUncycpLAogICAgKDB4MTgwLCAnVicpLAogICAgKDB4MTgxLCAnTScsIHUnyZMnKSwKICAgICgweDE4MiwgJ00nLCB1J8aDJyksCiAgICAoMHgxODMsICdWJyksCiAgICAoMHgxODQsICdNJywgdSfGhScpLAogICAgKDB4MTg1LCAnVicpLAogICAgKDB4MTg2LCAnTScsIHUnyZQnKSwKICAgICgweDE4NywgJ00nLCB1J8aIJyksCiAgICAoMHgxODgsICdWJyksCiAgICAoMHgxODksICdNJywgdSfJlicpLAogICAgKDB4MThBLCAnTScsIHUnyZcnKSwKICAgICgweDE4QiwgJ00nLCB1J8aMJyksCiAgICAoMHgxOEMsICdWJyksCiAgICAoMHgxOEUsICdNJywgdSfHnScpLAogICAgKDB4MThGLCAnTScsIHUnyZknKSwKICAgICgweDE5MCwgJ00nLCB1J8mbJyksCiAgICAoMHgxOTEsICdNJywgdSfGkicpLAogICAgKDB4MTkyLCAnVicpLAogICAgKDB4MTkzLCAnTScsIHUnyaAnKSwKICAgIF0KCmRlZiBfc2VnXzQoKToKICAgIHJldHVybiBbCiAgICAoMHgxOTQsICdNJywgdSfJoycpLAogICAgKDB4MTk1LCAnVicpLAogICAgKDB4MTk2LCAnTScsIHUnyaknKSwKICAgICgweDE5NywgJ00nLCB1J8moJyksCiAgICAoMHgxOTgsICdNJywgdSfGmScpLAogICAgKDB4MTk5LCAnVicpLAogICAgKDB4MTlDLCAnTScsIHUnya8nKSwKICAgICgweDE5RCwgJ00nLCB1J8myJyksCiAgICAoMHgxOUUsICdWJyksCiAgICAoMHgxOUYsICdNJywgdSfJtScpLAogICAgKDB4MUEwLCAnTScsIHUnxqEnKSwKICAgICgweDFBMSwgJ1YnKSwKICAgICgweDFBMiwgJ00nLCB1J8ajJyksCiAgICAoMHgxQTMsICdWJyksCiAgICAoMHgxQTQsICdNJywgdSfGpScpLAogICAgKDB4MUE1LCAnVicpLAogICAgKDB4MUE2LCAnTScsIHUnyoAnKSwKICAgICgweDFBNywgJ00nLCB1J8aoJyksCiAgICAoMHgxQTgsICdWJyksCiAgICAoMHgxQTksICdNJywgdSfKgycpLAogICAgKDB4MUFBLCAnVicpLAogICAgKDB4MUFDLCAnTScsIHUnxq0nKSwKICAgICgweDFBRCwgJ1YnKSwKICAgICgweDFBRSwgJ00nLCB1J8qIJyksCiAgICAoMHgxQUYsICdNJywgdSfGsCcpLAogICAgKDB4MUIwLCAnVicpLAogICAgKDB4MUIxLCAnTScsIHUnyoonKSwKICAgICgweDFCMiwgJ00nLCB1J8qLJyksCiAgICAoMHgxQjMsICdNJywgdSfGtCcpLAogICAgKDB4MUI0LCAnVicpLAogICAgKDB4MUI1LCAnTScsIHUnxrYnKSwKICAgICgweDFCNiwgJ1YnKSwKICAgICgweDFCNywgJ00nLCB1J8qSJyksCiAgICAoMHgxQjgsICdNJywgdSfGuScpLAogICAgKDB4MUI5LCAnVicpLAogICAgKDB4MUJDLCAnTScsIHUnxr0nKSwKICAgICgweDFCRCwgJ1YnKSwKICAgICgweDFDNCwgJ00nLCB1J2TFvicpLAogICAgKDB4MUM3LCAnTScsIHUnbGonKSwKICAgICgweDFDQSwgJ00nLCB1J25qJyksCiAgICAoMHgxQ0QsICdNJywgdSfHjicpLAogICAgKDB4MUNFLCAnVicpLAogICAgKDB4MUNGLCAnTScsIHUnx5AnKSwKICAgICgweDFEMCwgJ1YnKSwKICAgICgweDFEMSwgJ00nLCB1J8eSJyksCiAgICAoMHgxRDIsICdWJyksCiAgICAoMHgxRDMsICdNJywgdSfHlCcpLAogICAgKDB4MUQ0LCAnVicpLAogICAgKDB4MUQ1LCAnTScsIHUnx5YnKSwKICAgICgweDFENiwgJ1YnKSwKICAgICgweDFENywgJ00nLCB1J8eYJyksCiAgICAoMHgxRDgsICdWJyksCiAgICAoMHgxRDksICdNJywgdSfHmicpLAogICAgKDB4MURBLCAnVicpLAogICAgKDB4MURCLCAnTScsIHUnx5wnKSwKICAgICgweDFEQywgJ1YnKSwKICAgICgweDFERSwgJ00nLCB1J8efJyksCiAgICAoMHgxREYsICdWJyksCiAgICAoMHgxRTAsICdNJywgdSfHoScpLAogICAgKDB4MUUxLCAnVicpLAogICAgKDB4MUUyLCAnTScsIHUnx6MnKSwKICAgICgweDFFMywgJ1YnKSwKICAgICgweDFFNCwgJ00nLCB1J8elJyksCiAgICAoMHgxRTUsICdWJyksCiAgICAoMHgxRTYsICdNJywgdSfHpycpLAogICAgKDB4MUU3LCAnVicpLAogICAgKDB4MUU4LCAnTScsIHUnx6knKSwKICAgICgweDFFOSwgJ1YnKSwKICAgICgweDFFQSwgJ00nLCB1J8erJyksCiAgICAoMHgxRUIsICdWJyksCiAgICAoMHgxRUMsICdNJywgdSfHrScpLAogICAgKDB4MUVELCAnVicpLAogICAgKDB4MUVFLCAnTScsIHUnx68nKSwKICAgICgweDFFRiwgJ1YnKSwKICAgICgweDFGMSwgJ00nLCB1J2R6JyksCiAgICAoMHgxRjQsICdNJywgdSfHtScpLAogICAgKDB4MUY1LCAnVicpLAogICAgKDB4MUY2LCAnTScsIHUnxpUnKSwKICAgICgweDFGNywgJ00nLCB1J8a/JyksCiAgICAoMHgxRjgsICdNJywgdSfHuScpLAogICAgKDB4MUY5LCAnVicpLAogICAgKDB4MUZBLCAnTScsIHUnx7snKSwKICAgICgweDFGQiwgJ1YnKSwKICAgICgweDFGQywgJ00nLCB1J8e9JyksCiAgICAoMHgxRkQsICdWJyksCiAgICAoMHgxRkUsICdNJywgdSfHvycpLAogICAgKDB4MUZGLCAnVicpLAogICAgKDB4MjAwLCAnTScsIHUnyIEnKSwKICAgICgweDIwMSwgJ1YnKSwKICAgICgweDIwMiwgJ00nLCB1J8iDJyksCiAgICAoMHgyMDMsICdWJyksCiAgICAoMHgyMDQsICdNJywgdSfIhScpLAogICAgKDB4MjA1LCAnVicpLAogICAgKDB4MjA2LCAnTScsIHUnyIcnKSwKICAgICgweDIwNywgJ1YnKSwKICAgICgweDIwOCwgJ00nLCB1J8iJJyksCiAgICAoMHgyMDksICdWJyksCiAgICAoMHgyMEEsICdNJywgdSfIiycpLAogICAgKDB4MjBCLCAnVicpLAogICAgKDB4MjBDLCAnTScsIHUnyI0nKSwKICAgIF0KCmRlZiBfc2VnXzUoKToKICAgIHJldHVybiBbCiAgICAoMHgyMEQsICdWJyksCiAgICAoMHgyMEUsICdNJywgdSfIjycpLAogICAgKDB4MjBGLCAnVicpLAogICAgKDB4MjEwLCAnTScsIHUnyJEnKSwKICAgICgweDIxMSwgJ1YnKSwKICAgICgweDIxMiwgJ00nLCB1J8iTJyksCiAgICAoMHgyMTMsICdWJyksCiAgICAoMHgyMTQsICdNJywgdSfIlScpLAogICAgKDB4MjE1LCAnVicpLAogICAgKDB4MjE2LCAnTScsIHUnyJcnKSwKICAgICgweDIxNywgJ1YnKSwKICAgICgweDIxOCwgJ00nLCB1J8iZJyksCiAgICAoMHgyMTksICdWJyksCiAgICAoMHgyMUEsICdNJywgdSfImycpLAogICAgKDB4MjFCLCAnVicpLAogICAgKDB4MjFDLCAnTScsIHUnyJ0nKSwKICAgICgweDIxRCwgJ1YnKSwKICAgICgweDIxRSwgJ00nLCB1J8ifJyksCiAgICAoMHgyMUYsICdWJyksCiAgICAoMHgyMjAsICdNJywgdSfGnicpLAogICAgKDB4MjIxLCAnVicpLAogICAgKDB4MjIyLCAnTScsIHUnyKMnKSwKICAgICgweDIyMywgJ1YnKSwKICAgICgweDIyNCwgJ00nLCB1J8ilJyksCiAgICAoMHgyMjUsICdWJyksCiAgICAoMHgyMjYsICdNJywgdSfIpycpLAogICAgKDB4MjI3LCAnVicpLAogICAgKDB4MjI4LCAnTScsIHUnyKknKSwKICAgICgweDIyOSwgJ1YnKSwKICAgICgweDIyQSwgJ00nLCB1J8irJyksCiAgICAoMHgyMkIsICdWJyksCiAgICAoMHgyMkMsICdNJywgdSfIrScpLAogICAgKDB4MjJELCAnVicpLAogICAgKDB4MjJFLCAnTScsIHUnyK8nKSwKICAgICgweDIyRiwgJ1YnKSwKICAgICgweDIzMCwgJ00nLCB1J8ixJyksCiAgICAoMHgyMzEsICdWJyksCiAgICAoMHgyMzIsICdNJywgdSfIsycpLAogICAgKDB4MjMzLCAnVicpLAogICAgKDB4MjNBLCAnTScsIHUn4rGlJyksCiAgICAoMHgyM0IsICdNJywgdSfIvCcpLAogICAgKDB4MjNDLCAnVicpLAogICAgKDB4MjNELCAnTScsIHUnxponKSwKICAgICgweDIzRSwgJ00nLCB1J+KxpicpLAogICAgKDB4MjNGLCAnVicpLAogICAgKDB4MjQxLCAnTScsIHUnyYInKSwKICAgICgweDI0MiwgJ1YnKSwKICAgICgweDI0MywgJ00nLCB1J8aAJyksCiAgICAoMHgyNDQsICdNJywgdSfKiScpLAogICAgKDB4MjQ1LCAnTScsIHUnyownKSwKICAgICgweDI0NiwgJ00nLCB1J8mHJyksCiAgICAoMHgyNDcsICdWJyksCiAgICAoMHgyNDgsICdNJywgdSfJiScpLAogICAgKDB4MjQ5LCAnVicpLAogICAgKDB4MjRBLCAnTScsIHUnyYsnKSwKICAgICgweDI0QiwgJ1YnKSwKICAgICgweDI0QywgJ00nLCB1J8mNJyksCiAgICAoMHgyNEQsICdWJyksCiAgICAoMHgyNEUsICdNJywgdSfJjycpLAogICAgKDB4MjRGLCAnVicpLAogICAgKDB4MkIwLCAnTScsIHUnaCcpLAogICAgKDB4MkIxLCAnTScsIHUnyaYnKSwKICAgICgweDJCMiwgJ00nLCB1J2onKSwKICAgICgweDJCMywgJ00nLCB1J3InKSwKICAgICgweDJCNCwgJ00nLCB1J8m5JyksCiAgICAoMHgyQjUsICdNJywgdSfJuycpLAogICAgKDB4MkI2LCAnTScsIHUnyoEnKSwKICAgICgweDJCNywgJ00nLCB1J3cnKSwKICAgICgweDJCOCwgJ00nLCB1J3knKSwKICAgICgweDJCOSwgJ1YnKSwKICAgICgweDJEOCwgJzMnLCB1JyDMhicpLAogICAgKDB4MkQ5LCAnMycsIHUnIMyHJyksCiAgICAoMHgyREEsICczJywgdScgzIonKSwKICAgICgweDJEQiwgJzMnLCB1JyDMqCcpLAogICAgKDB4MkRDLCAnMycsIHUnIMyDJyksCiAgICAoMHgyREQsICczJywgdScgzIsnKSwKICAgICgweDJERSwgJ1YnKSwKICAgICgweDJFMCwgJ00nLCB1J8mjJyksCiAgICAoMHgyRTEsICdNJywgdSdsJyksCiAgICAoMHgyRTIsICdNJywgdSdzJyksCiAgICAoMHgyRTMsICdNJywgdSd4JyksCiAgICAoMHgyRTQsICdNJywgdSfKlScpLAogICAgKDB4MkU1LCAnVicpLAogICAgKDB4MzQwLCAnTScsIHUnzIAnKSwKICAgICgweDM0MSwgJ00nLCB1J8yBJyksCiAgICAoMHgzNDIsICdWJyksCiAgICAoMHgzNDMsICdNJywgdSfMkycpLAogICAgKDB4MzQ0LCAnTScsIHUnzIjMgScpLAogICAgKDB4MzQ1LCAnTScsIHUnzrknKSwKICAgICgweDM0NiwgJ1YnKSwKICAgICgweDM0RiwgJ0knKSwKICAgICgweDM1MCwgJ1YnKSwKICAgICgweDM3MCwgJ00nLCB1J82xJyksCiAgICAoMHgzNzEsICdWJyksCiAgICAoMHgzNzIsICdNJywgdSfNsycpLAogICAgKDB4MzczLCAnVicpLAogICAgKDB4Mzc0LCAnTScsIHUnyrknKSwKICAgICgweDM3NSwgJ1YnKSwKICAgICgweDM3NiwgJ00nLCB1J823JyksCiAgICAoMHgzNzcsICdWJyksCiAgICBdCgpkZWYgX3NlZ182KCk6CiAgICByZXR1cm4gWwogICAgKDB4Mzc4LCAnWCcpLAogICAgKDB4MzdBLCAnMycsIHUnIM65JyksCiAgICAoMHgzN0IsICdWJyksCiAgICAoMHgzN0UsICczJywgdSc7JyksCiAgICAoMHgzN0YsICdYJyksCiAgICAoMHgzODQsICczJywgdScgzIEnKSwKICAgICgweDM4NSwgJzMnLCB1JyDMiMyBJyksCiAgICAoMHgzODYsICdNJywgdSfOrCcpLAogICAgKDB4Mzg3LCAnTScsIHUnwrcnKSwKICAgICgweDM4OCwgJ00nLCB1J86tJyksCiAgICAoMHgzODksICdNJywgdSfOricpLAogICAgKDB4MzhBLCAnTScsIHUnzq8nKSwKICAgICgweDM4QiwgJ1gnKSwKICAgICgweDM4QywgJ00nLCB1J8+MJyksCiAgICAoMHgzOEQsICdYJyksCiAgICAoMHgzOEUsICdNJywgdSfPjScpLAogICAgKDB4MzhGLCAnTScsIHUnz44nKSwKICAgICgweDM5MCwgJ1YnKSwKICAgICgweDM5MSwgJ00nLCB1J86xJyksCiAgICAoMHgzOTIsICdNJywgdSfOsicpLAogICAgKDB4MzkzLCAnTScsIHUnzrMnKSwKICAgICgweDM5NCwgJ00nLCB1J860JyksCiAgICAoMHgzOTUsICdNJywgdSfOtScpLAogICAgKDB4Mzk2LCAnTScsIHUnzrYnKSwKICAgICgweDM5NywgJ00nLCB1J863JyksCiAgICAoMHgzOTgsICdNJywgdSfOuCcpLAogICAgKDB4Mzk5LCAnTScsIHUnzrknKSwKICAgICgweDM5QSwgJ00nLCB1J866JyksCiAgICAoMHgzOUIsICdNJywgdSfOuycpLAogICAgKDB4MzlDLCAnTScsIHUnzrwnKSwKICAgICgweDM5RCwgJ00nLCB1J869JyksCiAgICAoMHgzOUUsICdNJywgdSfOvicpLAogICAgKDB4MzlGLCAnTScsIHUnzr8nKSwKICAgICgweDNBMCwgJ00nLCB1J8+AJyksCiAgICAoMHgzQTEsICdNJywgdSfPgScpLAogICAgKDB4M0EyLCAnWCcpLAogICAgKDB4M0EzLCAnTScsIHUnz4MnKSwKICAgICgweDNBNCwgJ00nLCB1J8+EJyksCiAgICAoMHgzQTUsICdNJywgdSfPhScpLAogICAgKDB4M0E2LCAnTScsIHUnz4YnKSwKICAgICgweDNBNywgJ00nLCB1J8+HJyksCiAgICAoMHgzQTgsICdNJywgdSfPiCcpLAogICAgKDB4M0E5LCAnTScsIHUnz4knKSwKICAgICgweDNBQSwgJ00nLCB1J8+KJyksCiAgICAoMHgzQUIsICdNJywgdSfPiycpLAogICAgKDB4M0FDLCAnVicpLAogICAgKDB4M0MyLCAnRCcsIHUnz4MnKSwKICAgICgweDNDMywgJ1YnKSwKICAgICgweDNDRiwgJ00nLCB1J8+XJyksCiAgICAoMHgzRDAsICdNJywgdSfOsicpLAogICAgKDB4M0QxLCAnTScsIHUnzrgnKSwKICAgICgweDNEMiwgJ00nLCB1J8+FJyksCiAgICAoMHgzRDMsICdNJywgdSfPjScpLAogICAgKDB4M0Q0LCAnTScsIHUnz4snKSwKICAgICgweDNENSwgJ00nLCB1J8+GJyksCiAgICAoMHgzRDYsICdNJywgdSfPgCcpLAogICAgKDB4M0Q3LCAnVicpLAogICAgKDB4M0Q4LCAnTScsIHUnz5knKSwKICAgICgweDNEOSwgJ1YnKSwKICAgICgweDNEQSwgJ00nLCB1J8+bJyksCiAgICAoMHgzREIsICdWJyksCiAgICAoMHgzREMsICdNJywgdSfPnScpLAogICAgKDB4M0RELCAnVicpLAogICAgKDB4M0RFLCAnTScsIHUnz58nKSwKICAgICgweDNERiwgJ1YnKSwKICAgICgweDNFMCwgJ00nLCB1J8+hJyksCiAgICAoMHgzRTEsICdWJyksCiAgICAoMHgzRTIsICdNJywgdSfPoycpLAogICAgKDB4M0UzLCAnVicpLAogICAgKDB4M0U0LCAnTScsIHUnz6UnKSwKICAgICgweDNFNSwgJ1YnKSwKICAgICgweDNFNiwgJ00nLCB1J8+nJyksCiAgICAoMHgzRTcsICdWJyksCiAgICAoMHgzRTgsICdNJywgdSfPqScpLAogICAgKDB4M0U5LCAnVicpLAogICAgKDB4M0VBLCAnTScsIHUnz6snKSwKICAgICgweDNFQiwgJ1YnKSwKICAgICgweDNFQywgJ00nLCB1J8+tJyksCiAgICAoMHgzRUQsICdWJyksCiAgICAoMHgzRUUsICdNJywgdSfPrycpLAogICAgKDB4M0VGLCAnVicpLAogICAgKDB4M0YwLCAnTScsIHUnzronKSwKICAgICgweDNGMSwgJ00nLCB1J8+BJyksCiAgICAoMHgzRjIsICdNJywgdSfPgycpLAogICAgKDB4M0YzLCAnVicpLAogICAgKDB4M0Y0LCAnTScsIHUnzrgnKSwKICAgICgweDNGNSwgJ00nLCB1J861JyksCiAgICAoMHgzRjYsICdWJyksCiAgICAoMHgzRjcsICdNJywgdSfPuCcpLAogICAgKDB4M0Y4LCAnVicpLAogICAgKDB4M0Y5LCAnTScsIHUnz4MnKSwKICAgICgweDNGQSwgJ00nLCB1J8+7JyksCiAgICAoMHgzRkIsICdWJyksCiAgICAoMHgzRkQsICdNJywgdSfNuycpLAogICAgKDB4M0ZFLCAnTScsIHUnzbwnKSwKICAgICgweDNGRiwgJ00nLCB1J829JyksCiAgICAoMHg0MDAsICdNJywgdSfRkCcpLAogICAgKDB4NDAxLCAnTScsIHUn0ZEnKSwKICAgICgweDQwMiwgJ00nLCB1J9GSJyksCiAgICAoMHg0MDMsICdNJywgdSfRkycpLAogICAgXQoKZGVmIF9zZWdfNygpOgogICAgcmV0dXJuIFsKICAgICgweDQwNCwgJ00nLCB1J9GUJyksCiAgICAoMHg0MDUsICdNJywgdSfRlScpLAogICAgKDB4NDA2LCAnTScsIHUn0ZYnKSwKICAgICgweDQwNywgJ00nLCB1J9GXJyksCiAgICAoMHg0MDgsICdNJywgdSfRmCcpLAogICAgKDB4NDA5LCAnTScsIHUn0ZknKSwKICAgICgweDQwQSwgJ00nLCB1J9GaJyksCiAgICAoMHg0MEIsICdNJywgdSfRmycpLAogICAgKDB4NDBDLCAnTScsIHUn0ZwnKSwKICAgICgweDQwRCwgJ00nLCB1J9GdJyksCiAgICAoMHg0MEUsICdNJywgdSfRnicpLAogICAgKDB4NDBGLCAnTScsIHUn0Z8nKSwKICAgICgweDQxMCwgJ00nLCB1J9CwJyksCiAgICAoMHg0MTEsICdNJywgdSfQsScpLAogICAgKDB4NDEyLCAnTScsIHUn0LInKSwKICAgICgweDQxMywgJ00nLCB1J9CzJyksCiAgICAoMHg0MTQsICdNJywgdSfQtCcpLAogICAgKDB4NDE1LCAnTScsIHUn0LUnKSwKICAgICgweDQxNiwgJ00nLCB1J9C2JyksCiAgICAoMHg0MTcsICdNJywgdSfQtycpLAogICAgKDB4NDE4LCAnTScsIHUn0LgnKSwKICAgICgweDQxOSwgJ00nLCB1J9C5JyksCiAgICAoMHg0MUEsICdNJywgdSfQuicpLAogICAgKDB4NDFCLCAnTScsIHUn0LsnKSwKICAgICgweDQxQywgJ00nLCB1J9C8JyksCiAgICAoMHg0MUQsICdNJywgdSfQvScpLAogICAgKDB4NDFFLCAnTScsIHUn0L4nKSwKICAgICgweDQxRiwgJ00nLCB1J9C/JyksCiAgICAoMHg0MjAsICdNJywgdSfRgCcpLAogICAgKDB4NDIxLCAnTScsIHUn0YEnKSwKICAgICgweDQyMiwgJ00nLCB1J9GCJyksCiAgICAoMHg0MjMsICdNJywgdSfRgycpLAogICAgKDB4NDI0LCAnTScsIHUn0YQnKSwKICAgICgweDQyNSwgJ00nLCB1J9GFJyksCiAgICAoMHg0MjYsICdNJywgdSfRhicpLAogICAgKDB4NDI3LCAnTScsIHUn0YcnKSwKICAgICgweDQyOCwgJ00nLCB1J9GIJyksCiAgICAoMHg0MjksICdNJywgdSfRiScpLAogICAgKDB4NDJBLCAnTScsIHUn0YonKSwKICAgICgweDQyQiwgJ00nLCB1J9GLJyksCiAgICAoMHg0MkMsICdNJywgdSfRjCcpLAogICAgKDB4NDJELCAnTScsIHUn0Y0nKSwKICAgICgweDQyRSwgJ00nLCB1J9GOJyksCiAgICAoMHg0MkYsICdNJywgdSfRjycpLAogICAgKDB4NDMwLCAnVicpLAogICAgKDB4NDYwLCAnTScsIHUn0aEnKSwKICAgICgweDQ2MSwgJ1YnKSwKICAgICgweDQ2MiwgJ00nLCB1J9GjJyksCiAgICAoMHg0NjMsICdWJyksCiAgICAoMHg0NjQsICdNJywgdSfRpScpLAogICAgKDB4NDY1LCAnVicpLAogICAgKDB4NDY2LCAnTScsIHUn0acnKSwKICAgICgweDQ2NywgJ1YnKSwKICAgICgweDQ2OCwgJ00nLCB1J9GpJyksCiAgICAoMHg0NjksICdWJyksCiAgICAoMHg0NkEsICdNJywgdSfRqycpLAogICAgKDB4NDZCLCAnVicpLAogICAgKDB4NDZDLCAnTScsIHUn0a0nKSwKICAgICgweDQ2RCwgJ1YnKSwKICAgICgweDQ2RSwgJ00nLCB1J9GvJyksCiAgICAoMHg0NkYsICdWJyksCiAgICAoMHg0NzAsICdNJywgdSfRsScpLAogICAgKDB4NDcxLCAnVicpLAogICAgKDB4NDcyLCAnTScsIHUn0bMnKSwKICAgICgweDQ3MywgJ1YnKSwKICAgICgweDQ3NCwgJ00nLCB1J9G1JyksCiAgICAoMHg0NzUsICdWJyksCiAgICAoMHg0NzYsICdNJywgdSfRtycpLAogICAgKDB4NDc3LCAnVicpLAogICAgKDB4NDc4LCAnTScsIHUn0bknKSwKICAgICgweDQ3OSwgJ1YnKSwKICAgICgweDQ3QSwgJ00nLCB1J9G7JyksCiAgICAoMHg0N0IsICdWJyksCiAgICAoMHg0N0MsICdNJywgdSfRvScpLAogICAgKDB4NDdELCAnVicpLAogICAgKDB4NDdFLCAnTScsIHUn0b8nKSwKICAgICgweDQ3RiwgJ1YnKSwKICAgICgweDQ4MCwgJ00nLCB1J9KBJyksCiAgICAoMHg0ODEsICdWJyksCiAgICAoMHg0OEEsICdNJywgdSfSiycpLAogICAgKDB4NDhCLCAnVicpLAogICAgKDB4NDhDLCAnTScsIHUn0o0nKSwKICAgICgweDQ4RCwgJ1YnKSwKICAgICgweDQ4RSwgJ00nLCB1J9KPJyksCiAgICAoMHg0OEYsICdWJyksCiAgICAoMHg0OTAsICdNJywgdSfSkScpLAogICAgKDB4NDkxLCAnVicpLAogICAgKDB4NDkyLCAnTScsIHUn0pMnKSwKICAgICgweDQ5MywgJ1YnKSwKICAgICgweDQ5NCwgJ00nLCB1J9KVJyksCiAgICAoMHg0OTUsICdWJyksCiAgICAoMHg0OTYsICdNJywgdSfSlycpLAogICAgKDB4NDk3LCAnVicpLAogICAgKDB4NDk4LCAnTScsIHUn0pknKSwKICAgICgweDQ5OSwgJ1YnKSwKICAgICgweDQ5QSwgJ00nLCB1J9KbJyksCiAgICAoMHg0OUIsICdWJyksCiAgICAoMHg0OUMsICdNJywgdSfSnScpLAogICAgKDB4NDlELCAnVicpLAogICAgKDB4NDlFLCAnTScsIHUn0p8nKSwKICAgIF0KCmRlZiBfc2VnXzgoKToKICAgIHJldHVybiBbCiAgICAoMHg0OUYsICdWJyksCiAgICAoMHg0QTAsICdNJywgdSfSoScpLAogICAgKDB4NEExLCAnVicpLAogICAgKDB4NEEyLCAnTScsIHUn0qMnKSwKICAgICgweDRBMywgJ1YnKSwKICAgICgweDRBNCwgJ00nLCB1J9KlJyksCiAgICAoMHg0QTUsICdWJyksCiAgICAoMHg0QTYsICdNJywgdSfSpycpLAogICAgKDB4NEE3LCAnVicpLAogICAgKDB4NEE4LCAnTScsIHUn0qknKSwKICAgICgweDRBOSwgJ1YnKSwKICAgICgweDRBQSwgJ00nLCB1J9KrJyksCiAgICAoMHg0QUIsICdWJyksCiAgICAoMHg0QUMsICdNJywgdSfSrScpLAogICAgKDB4NEFELCAnVicpLAogICAgKDB4NEFFLCAnTScsIHUn0q8nKSwKICAgICgweDRBRiwgJ1YnKSwKICAgICgweDRCMCwgJ00nLCB1J9KxJyksCiAgICAoMHg0QjEsICdWJyksCiAgICAoMHg0QjIsICdNJywgdSfSsycpLAogICAgKDB4NEIzLCAnVicpLAogICAgKDB4NEI0LCAnTScsIHUn0rUnKSwKICAgICgweDRCNSwgJ1YnKSwKICAgICgweDRCNiwgJ00nLCB1J9K3JyksCiAgICAoMHg0QjcsICdWJyksCiAgICAoMHg0QjgsICdNJywgdSfSuScpLAogICAgKDB4NEI5LCAnVicpLAogICAgKDB4NEJBLCAnTScsIHUn0rsnKSwKICAgICgweDRCQiwgJ1YnKSwKICAgICgweDRCQywgJ00nLCB1J9K9JyksCiAgICAoMHg0QkQsICdWJyksCiAgICAoMHg0QkUsICdNJywgdSfSvycpLAogICAgKDB4NEJGLCAnVicpLAogICAgKDB4NEMwLCAnWCcpLAogICAgKDB4NEMxLCAnTScsIHUn04InKSwKICAgICgweDRDMiwgJ1YnKSwKICAgICgweDRDMywgJ00nLCB1J9OEJyksCiAgICAoMHg0QzQsICdWJyksCiAgICAoMHg0QzUsICdNJywgdSfThicpLAogICAgKDB4NEM2LCAnVicpLAogICAgKDB4NEM3LCAnTScsIHUn04gnKSwKICAgICgweDRDOCwgJ1YnKSwKICAgICgweDRDOSwgJ00nLCB1J9OKJyksCiAgICAoMHg0Q0EsICdWJyksCiAgICAoMHg0Q0IsICdNJywgdSfTjCcpLAogICAgKDB4NENDLCAnVicpLAogICAgKDB4NENELCAnTScsIHUn044nKSwKICAgICgweDRDRSwgJ1YnKSwKICAgICgweDREMCwgJ00nLCB1J9ORJyksCiAgICAoMHg0RDEsICdWJyksCiAgICAoMHg0RDIsICdNJywgdSfTkycpLAogICAgKDB4NEQzLCAnVicpLAogICAgKDB4NEQ0LCAnTScsIHUn05UnKSwKICAgICgweDRENSwgJ1YnKSwKICAgICgweDRENiwgJ00nLCB1J9OXJyksCiAgICAoMHg0RDcsICdWJyksCiAgICAoMHg0RDgsICdNJywgdSfTmScpLAogICAgKDB4NEQ5LCAnVicpLAogICAgKDB4NERBLCAnTScsIHUn05snKSwKICAgICgweDREQiwgJ1YnKSwKICAgICgweDREQywgJ00nLCB1J9OdJyksCiAgICAoMHg0REQsICdWJyksCiAgICAoMHg0REUsICdNJywgdSfTnycpLAogICAgKDB4NERGLCAnVicpLAogICAgKDB4NEUwLCAnTScsIHUn06EnKSwKICAgICgweDRFMSwgJ1YnKSwKICAgICgweDRFMiwgJ00nLCB1J9OjJyksCiAgICAoMHg0RTMsICdWJyksCiAgICAoMHg0RTQsICdNJywgdSfTpScpLAogICAgKDB4NEU1LCAnVicpLAogICAgKDB4NEU2LCAnTScsIHUn06cnKSwKICAgICgweDRFNywgJ1YnKSwKICAgICgweDRFOCwgJ00nLCB1J9OpJyksCiAgICAoMHg0RTksICdWJyksCiAgICAoMHg0RUEsICdNJywgdSfTqycpLAogICAgKDB4NEVCLCAnVicpLAogICAgKDB4NEVDLCAnTScsIHUn060nKSwKICAgICgweDRFRCwgJ1YnKSwKICAgICgweDRFRSwgJ00nLCB1J9OvJyksCiAgICAoMHg0RUYsICdWJyksCiAgICAoMHg0RjAsICdNJywgdSfTsScpLAogICAgKDB4NEYxLCAnVicpLAogICAgKDB4NEYyLCAnTScsIHUn07MnKSwKICAgICgweDRGMywgJ1YnKSwKICAgICgweDRGNCwgJ00nLCB1J9O1JyksCiAgICAoMHg0RjUsICdWJyksCiAgICAoMHg0RjYsICdNJywgdSfTtycpLAogICAgKDB4NEY3LCAnVicpLAogICAgKDB4NEY4LCAnTScsIHUn07knKSwKICAgICgweDRGOSwgJ1YnKSwKICAgICgweDRGQSwgJ00nLCB1J9O7JyksCiAgICAoMHg0RkIsICdWJyksCiAgICAoMHg0RkMsICdNJywgdSfTvScpLAogICAgKDB4NEZELCAnVicpLAogICAgKDB4NEZFLCAnTScsIHUn078nKSwKICAgICgweDRGRiwgJ1YnKSwKICAgICgweDUwMCwgJ00nLCB1J9SBJyksCiAgICAoMHg1MDEsICdWJyksCiAgICAoMHg1MDIsICdNJywgdSfUgycpLAogICAgKDB4NTAzLCAnVicpLAogICAgXQoKZGVmIF9zZWdfOSgpOgogICAgcmV0dXJuIFsKICAgICgweDUwNCwgJ00nLCB1J9SFJyksCiAgICAoMHg1MDUsICdWJyksCiAgICAoMHg1MDYsICdNJywgdSfUhycpLAogICAgKDB4NTA3LCAnVicpLAogICAgKDB4NTA4LCAnTScsIHUn1IknKSwKICAgICgweDUwOSwgJ1YnKSwKICAgICgweDUwQSwgJ00nLCB1J9SLJyksCiAgICAoMHg1MEIsICdWJyksCiAgICAoMHg1MEMsICdNJywgdSfUjScpLAogICAgKDB4NTBELCAnVicpLAogICAgKDB4NTBFLCAnTScsIHUn1I8nKSwKICAgICgweDUwRiwgJ1YnKSwKICAgICgweDUxMCwgJ00nLCB1J9SRJyksCiAgICAoMHg1MTEsICdWJyksCiAgICAoMHg1MTIsICdNJywgdSfUkycpLAogICAgKDB4NTEzLCAnVicpLAogICAgKDB4NTE0LCAnTScsIHUn1JUnKSwKICAgICgweDUxNSwgJ1YnKSwKICAgICgweDUxNiwgJ00nLCB1J9SXJyksCiAgICAoMHg1MTcsICdWJyksCiAgICAoMHg1MTgsICdNJywgdSfUmScpLAogICAgKDB4NTE5LCAnVicpLAogICAgKDB4NTFBLCAnTScsIHUn1JsnKSwKICAgICgweDUxQiwgJ1YnKSwKICAgICgweDUxQywgJ00nLCB1J9SdJyksCiAgICAoMHg1MUQsICdWJyksCiAgICAoMHg1MUUsICdNJywgdSfUnycpLAogICAgKDB4NTFGLCAnVicpLAogICAgKDB4NTIwLCAnTScsIHUn1KEnKSwKICAgICgweDUyMSwgJ1YnKSwKICAgICgweDUyMiwgJ00nLCB1J9SjJyksCiAgICAoMHg1MjMsICdWJyksCiAgICAoMHg1MjQsICdNJywgdSfUpScpLAogICAgKDB4NTI1LCAnVicpLAogICAgKDB4NTI2LCAnTScsIHUn1KcnKSwKICAgICgweDUyNywgJ1YnKSwKICAgICgweDUyOCwgJ1gnKSwKICAgICgweDUzMSwgJ00nLCB1J9WhJyksCiAgICAoMHg1MzIsICdNJywgdSfVoicpLAogICAgKDB4NTMzLCAnTScsIHUn1aMnKSwKICAgICgweDUzNCwgJ00nLCB1J9WkJyksCiAgICAoMHg1MzUsICdNJywgdSfVpScpLAogICAgKDB4NTM2LCAnTScsIHUn1aYnKSwKICAgICgweDUzNywgJ00nLCB1J9WnJyksCiAgICAoMHg1MzgsICdNJywgdSfVqCcpLAogICAgKDB4NTM5LCAnTScsIHUn1aknKSwKICAgICgweDUzQSwgJ00nLCB1J9WqJyksCiAgICAoMHg1M0IsICdNJywgdSfVqycpLAogICAgKDB4NTNDLCAnTScsIHUn1awnKSwKICAgICgweDUzRCwgJ00nLCB1J9WtJyksCiAgICAoMHg1M0UsICdNJywgdSfVricpLAogICAgKDB4NTNGLCAnTScsIHUn1a8nKSwKICAgICgweDU0MCwgJ00nLCB1J9WwJyksCiAgICAoMHg1NDEsICdNJywgdSfVsScpLAogICAgKDB4NTQyLCAnTScsIHUn1bInKSwKICAgICgweDU0MywgJ00nLCB1J9WzJyksCiAgICAoMHg1NDQsICdNJywgdSfVtCcpLAogICAgKDB4NTQ1LCAnTScsIHUn1bUnKSwKICAgICgweDU0NiwgJ00nLCB1J9W2JyksCiAgICAoMHg1NDcsICdNJywgdSfVtycpLAogICAgKDB4NTQ4LCAnTScsIHUn1bgnKSwKICAgICgweDU0OSwgJ00nLCB1J9W5JyksCiAgICAoMHg1NEEsICdNJywgdSfVuicpLAogICAgKDB4NTRCLCAnTScsIHUn1bsnKSwKICAgICgweDU0QywgJ00nLCB1J9W8JyksCiAgICAoMHg1NEQsICdNJywgdSfVvScpLAogICAgKDB4NTRFLCAnTScsIHUn1b4nKSwKICAgICgweDU0RiwgJ00nLCB1J9W/JyksCiAgICAoMHg1NTAsICdNJywgdSfWgCcpLAogICAgKDB4NTUxLCAnTScsIHUn1oEnKSwKICAgICgweDU1MiwgJ00nLCB1J9aCJyksCiAgICAoMHg1NTMsICdNJywgdSfWgycpLAogICAgKDB4NTU0LCAnTScsIHUn1oQnKSwKICAgICgweDU1NSwgJ00nLCB1J9aFJyksCiAgICAoMHg1NTYsICdNJywgdSfWhicpLAogICAgKDB4NTU3LCAnWCcpLAogICAgKDB4NTU5LCAnVicpLAogICAgKDB4NTYwLCAnWCcpLAogICAgKDB4NTYxLCAnVicpLAogICAgKDB4NTg3LCAnTScsIHUn1aXWgicpLAogICAgKDB4NTg4LCAnWCcpLAogICAgKDB4NTg5LCAnVicpLAogICAgKDB4NThCLCAnWCcpLAogICAgKDB4NThGLCAnVicpLAogICAgKDB4NTkwLCAnWCcpLAogICAgKDB4NTkxLCAnVicpLAogICAgKDB4NUM4LCAnWCcpLAogICAgKDB4NUQwLCAnVicpLAogICAgKDB4NUVCLCAnWCcpLAogICAgKDB4NUYwLCAnVicpLAogICAgKDB4NUY1LCAnWCcpLAogICAgKDB4NjA2LCAnVicpLAogICAgKDB4NjFDLCAnWCcpLAogICAgKDB4NjFFLCAnVicpLAogICAgKDB4Njc1LCAnTScsIHUn2KfZtCcpLAogICAgKDB4Njc2LCAnTScsIHUn2YjZtCcpLAogICAgKDB4Njc3LCAnTScsIHUn24fZtCcpLAogICAgKDB4Njc4LCAnTScsIHUn2YrZtCcpLAogICAgKDB4Njc5LCAnVicpLAogICAgKDB4NkRELCAnWCcpLAogICAgXQoKZGVmIF9zZWdfMTAoKToKICAgIHJldHVybiBbCiAgICAoMHg2REUsICdWJyksCiAgICAoMHg3MEUsICdYJyksCiAgICAoMHg3MTAsICdWJyksCiAgICAoMHg3NEIsICdYJyksCiAgICAoMHg3NEQsICdWJyksCiAgICAoMHg3QjIsICdYJyksCiAgICAoMHg3QzAsICdWJyksCiAgICAoMHg3RkIsICdYJyksCiAgICAoMHg4MDAsICdWJyksCiAgICAoMHg4MkUsICdYJyksCiAgICAoMHg4MzAsICdWJyksCiAgICAoMHg4M0YsICdYJyksCiAgICAoMHg4NDAsICdWJyksCiAgICAoMHg4NUMsICdYJyksCiAgICAoMHg4NUUsICdWJyksCiAgICAoMHg4NUYsICdYJyksCiAgICAoMHg4QTAsICdWJyksCiAgICAoMHg4QTEsICdYJyksCiAgICAoMHg4QTIsICdWJyksCiAgICAoMHg4QUQsICdYJyksCiAgICAoMHg4RTQsICdWJyksCiAgICAoMHg4RkYsICdYJyksCiAgICAoMHg5MDAsICdWJyksCiAgICAoMHg5NTgsICdNJywgdSfgpJXgpLwnKSwKICAgICgweDk1OSwgJ00nLCB1J+CkluCkvCcpLAogICAgKDB4OTVBLCAnTScsIHUn4KSX4KS8JyksCiAgICAoMHg5NUIsICdNJywgdSfgpJzgpLwnKSwKICAgICgweDk1QywgJ00nLCB1J+CkoeCkvCcpLAogICAgKDB4OTVELCAnTScsIHUn4KSi4KS8JyksCiAgICAoMHg5NUUsICdNJywgdSfgpKvgpLwnKSwKICAgICgweDk1RiwgJ00nLCB1J+Ckr+CkvCcpLAogICAgKDB4OTYwLCAnVicpLAogICAgKDB4OTc4LCAnWCcpLAogICAgKDB4OTc5LCAnVicpLAogICAgKDB4OTgwLCAnWCcpLAogICAgKDB4OTgxLCAnVicpLAogICAgKDB4OTg0LCAnWCcpLAogICAgKDB4OTg1LCAnVicpLAogICAgKDB4OThELCAnWCcpLAogICAgKDB4OThGLCAnVicpLAogICAgKDB4OTkxLCAnWCcpLAogICAgKDB4OTkzLCAnVicpLAogICAgKDB4OUE5LCAnWCcpLAogICAgKDB4OUFBLCAnVicpLAogICAgKDB4OUIxLCAnWCcpLAogICAgKDB4OUIyLCAnVicpLAogICAgKDB4OUIzLCAnWCcpLAogICAgKDB4OUI2LCAnVicpLAogICAgKDB4OUJBLCAnWCcpLAogICAgKDB4OUJDLCAnVicpLAogICAgKDB4OUM1LCAnWCcpLAogICAgKDB4OUM3LCAnVicpLAogICAgKDB4OUM5LCAnWCcpLAogICAgKDB4OUNCLCAnVicpLAogICAgKDB4OUNGLCAnWCcpLAogICAgKDB4OUQ3LCAnVicpLAogICAgKDB4OUQ4LCAnWCcpLAogICAgKDB4OURDLCAnTScsIHUn4Kah4Ka8JyksCiAgICAoMHg5REQsICdNJywgdSfgpqLgprwnKSwKICAgICgweDlERSwgJ1gnKSwKICAgICgweDlERiwgJ00nLCB1J+Cmr+CmvCcpLAogICAgKDB4OUUwLCAnVicpLAogICAgKDB4OUU0LCAnWCcpLAogICAgKDB4OUU2LCAnVicpLAogICAgKDB4OUZDLCAnWCcpLAogICAgKDB4QTAxLCAnVicpLAogICAgKDB4QTA0LCAnWCcpLAogICAgKDB4QTA1LCAnVicpLAogICAgKDB4QTBCLCAnWCcpLAogICAgKDB4QTBGLCAnVicpLAogICAgKDB4QTExLCAnWCcpLAogICAgKDB4QTEzLCAnVicpLAogICAgKDB4QTI5LCAnWCcpLAogICAgKDB4QTJBLCAnVicpLAogICAgKDB4QTMxLCAnWCcpLAogICAgKDB4QTMyLCAnVicpLAogICAgKDB4QTMzLCAnTScsIHUn4Kiy4Ki8JyksCiAgICAoMHhBMzQsICdYJyksCiAgICAoMHhBMzUsICdWJyksCiAgICAoMHhBMzYsICdNJywgdSfgqLjgqLwnKSwKICAgICgweEEzNywgJ1gnKSwKICAgICgweEEzOCwgJ1YnKSwKICAgICgweEEzQSwgJ1gnKSwKICAgICgweEEzQywgJ1YnKSwKICAgICgweEEzRCwgJ1gnKSwKICAgICgweEEzRSwgJ1YnKSwKICAgICgweEE0MywgJ1gnKSwKICAgICgweEE0NywgJ1YnKSwKICAgICgweEE0OSwgJ1gnKSwKICAgICgweEE0QiwgJ1YnKSwKICAgICgweEE0RSwgJ1gnKSwKICAgICgweEE1MSwgJ1YnKSwKICAgICgweEE1MiwgJ1gnKSwKICAgICgweEE1OSwgJ00nLCB1J+ColuCovCcpLAogICAgKDB4QTVBLCAnTScsIHUn4KiX4Ki8JyksCiAgICAoMHhBNUIsICdNJywgdSfgqJzgqLwnKSwKICAgICgweEE1QywgJ1YnKSwKICAgICgweEE1RCwgJ1gnKSwKICAgICgweEE1RSwgJ00nLCB1J+Coq+CovCcpLAogICAgKDB4QTVGLCAnWCcpLAogICAgXQoKZGVmIF9zZWdfMTEoKToKICAgIHJldHVybiBbCiAgICAoMHhBNjYsICdWJyksCiAgICAoMHhBNzYsICdYJyksCiAgICAoMHhBODEsICdWJyksCiAgICAoMHhBODQsICdYJyksCiAgICAoMHhBODUsICdWJyksCiAgICAoMHhBOEUsICdYJyksCiAgICAoMHhBOEYsICdWJyksCiAgICAoMHhBOTIsICdYJyksCiAgICAoMHhBOTMsICdWJyksCiAgICAoMHhBQTksICdYJyksCiAgICAoMHhBQUEsICdWJyksCiAgICAoMHhBQjEsICdYJyksCiAgICAoMHhBQjIsICdWJyksCiAgICAoMHhBQjQsICdYJyksCiAgICAoMHhBQjUsICdWJyksCiAgICAoMHhBQkEsICdYJyksCiAgICAoMHhBQkMsICdWJyksCiAgICAoMHhBQzYsICdYJyksCiAgICAoMHhBQzcsICdWJyksCiAgICAoMHhBQ0EsICdYJyksCiAgICAoMHhBQ0IsICdWJyksCiAgICAoMHhBQ0UsICdYJyksCiAgICAoMHhBRDAsICdWJyksCiAgICAoMHhBRDEsICdYJyksCiAgICAoMHhBRTAsICdWJyksCiAgICAoMHhBRTQsICdYJyksCiAgICAoMHhBRTYsICdWJyksCiAgICAoMHhBRjIsICdYJyksCiAgICAoMHhCMDEsICdWJyksCiAgICAoMHhCMDQsICdYJyksCiAgICAoMHhCMDUsICdWJyksCiAgICAoMHhCMEQsICdYJyksCiAgICAoMHhCMEYsICdWJyksCiAgICAoMHhCMTEsICdYJyksCiAgICAoMHhCMTMsICdWJyksCiAgICAoMHhCMjksICdYJyksCiAgICAoMHhCMkEsICdWJyksCiAgICAoMHhCMzEsICdYJyksCiAgICAoMHhCMzIsICdWJyksCiAgICAoMHhCMzQsICdYJyksCiAgICAoMHhCMzUsICdWJyksCiAgICAoMHhCM0EsICdYJyksCiAgICAoMHhCM0MsICdWJyksCiAgICAoMHhCNDUsICdYJyksCiAgICAoMHhCNDcsICdWJyksCiAgICAoMHhCNDksICdYJyksCiAgICAoMHhCNEIsICdWJyksCiAgICAoMHhCNEUsICdYJyksCiAgICAoMHhCNTYsICdWJyksCiAgICAoMHhCNTgsICdYJyksCiAgICAoMHhCNUMsICdNJywgdSfgrKHgrLwnKSwKICAgICgweEI1RCwgJ00nLCB1J+CsouCsvCcpLAogICAgKDB4QjVFLCAnWCcpLAogICAgKDB4QjVGLCAnVicpLAogICAgKDB4QjY0LCAnWCcpLAogICAgKDB4QjY2LCAnVicpLAogICAgKDB4Qjc4LCAnWCcpLAogICAgKDB4QjgyLCAnVicpLAogICAgKDB4Qjg0LCAnWCcpLAogICAgKDB4Qjg1LCAnVicpLAogICAgKDB4QjhCLCAnWCcpLAogICAgKDB4QjhFLCAnVicpLAogICAgKDB4QjkxLCAnWCcpLAogICAgKDB4QjkyLCAnVicpLAogICAgKDB4Qjk2LCAnWCcpLAogICAgKDB4Qjk5LCAnVicpLAogICAgKDB4QjlCLCAnWCcpLAogICAgKDB4QjlDLCAnVicpLAogICAgKDB4QjlELCAnWCcpLAogICAgKDB4QjlFLCAnVicpLAogICAgKDB4QkEwLCAnWCcpLAogICAgKDB4QkEzLCAnVicpLAogICAgKDB4QkE1LCAnWCcpLAogICAgKDB4QkE4LCAnVicpLAogICAgKDB4QkFCLCAnWCcpLAogICAgKDB4QkFFLCAnVicpLAogICAgKDB4QkJBLCAnWCcpLAogICAgKDB4QkJFLCAnVicpLAogICAgKDB4QkMzLCAnWCcpLAogICAgKDB4QkM2LCAnVicpLAogICAgKDB4QkM5LCAnWCcpLAogICAgKDB4QkNBLCAnVicpLAogICAgKDB4QkNFLCAnWCcpLAogICAgKDB4QkQwLCAnVicpLAogICAgKDB4QkQxLCAnWCcpLAogICAgKDB4QkQ3LCAnVicpLAogICAgKDB4QkQ4LCAnWCcpLAogICAgKDB4QkU2LCAnVicpLAogICAgKDB4QkZCLCAnWCcpLAogICAgKDB4QzAxLCAnVicpLAogICAgKDB4QzA0LCAnWCcpLAogICAgKDB4QzA1LCAnVicpLAogICAgKDB4QzBELCAnWCcpLAogICAgKDB4QzBFLCAnVicpLAogICAgKDB4QzExLCAnWCcpLAogICAgKDB4QzEyLCAnVicpLAogICAgKDB4QzI5LCAnWCcpLAogICAgKDB4QzJBLCAnVicpLAogICAgKDB4QzM0LCAnWCcpLAogICAgKDB4QzM1LCAnVicpLAogICAgXQoKZGVmIF9zZWdfMTIoKToKICAgIHJldHVybiBbCiAgICAoMHhDM0EsICdYJyksCiAgICAoMHhDM0QsICdWJyksCiAgICAoMHhDNDUsICdYJyksCiAgICAoMHhDNDYsICdWJyksCiAgICAoMHhDNDksICdYJyksCiAgICAoMHhDNEEsICdWJyksCiAgICAoMHhDNEUsICdYJyksCiAgICAoMHhDNTUsICdWJyksCiAgICAoMHhDNTcsICdYJyksCiAgICAoMHhDNTgsICdWJyksCiAgICAoMHhDNUEsICdYJyksCiAgICAoMHhDNjAsICdWJyksCiAgICAoMHhDNjQsICdYJyksCiAgICAoMHhDNjYsICdWJyksCiAgICAoMHhDNzAsICdYJyksCiAgICAoMHhDNzgsICdWJyksCiAgICAoMHhDODAsICdYJyksCiAgICAoMHhDODIsICdWJyksCiAgICAoMHhDODQsICdYJyksCiAgICAoMHhDODUsICdWJyksCiAgICAoMHhDOEQsICdYJyksCiAgICAoMHhDOEUsICdWJyksCiAgICAoMHhDOTEsICdYJyksCiAgICAoMHhDOTIsICdWJyksCiAgICAoMHhDQTksICdYJyksCiAgICAoMHhDQUEsICdWJyksCiAgICAoMHhDQjQsICdYJyksCiAgICAoMHhDQjUsICdWJyksCiAgICAoMHhDQkEsICdYJyksCiAgICAoMHhDQkMsICdWJyksCiAgICAoMHhDQzUsICdYJyksCiAgICAoMHhDQzYsICdWJyksCiAgICAoMHhDQzksICdYJyksCiAgICAoMHhDQ0EsICdWJyksCiAgICAoMHhDQ0UsICdYJyksCiAgICAoMHhDRDUsICdWJyksCiAgICAoMHhDRDcsICdYJyksCiAgICAoMHhDREUsICdWJyksCiAgICAoMHhDREYsICdYJyksCiAgICAoMHhDRTAsICdWJyksCiAgICAoMHhDRTQsICdYJyksCiAgICAoMHhDRTYsICdWJyksCiAgICAoMHhDRjAsICdYJyksCiAgICAoMHhDRjEsICdWJyksCiAgICAoMHhDRjMsICdYJyksCiAgICAoMHhEMDIsICdWJyksCiAgICAoMHhEMDQsICdYJyksCiAgICAoMHhEMDUsICdWJyksCiAgICAoMHhEMEQsICdYJyksCiAgICAoMHhEMEUsICdWJyksCiAgICAoMHhEMTEsICdYJyksCiAgICAoMHhEMTIsICdWJyksCiAgICAoMHhEM0IsICdYJyksCiAgICAoMHhEM0QsICdWJyksCiAgICAoMHhENDUsICdYJyksCiAgICAoMHhENDYsICdWJyksCiAgICAoMHhENDksICdYJyksCiAgICAoMHhENEEsICdWJyksCiAgICAoMHhENEYsICdYJyksCiAgICAoMHhENTcsICdWJyksCiAgICAoMHhENTgsICdYJyksCiAgICAoMHhENjAsICdWJyksCiAgICAoMHhENjQsICdYJyksCiAgICAoMHhENjYsICdWJyksCiAgICAoMHhENzYsICdYJyksCiAgICAoMHhENzksICdWJyksCiAgICAoMHhEODAsICdYJyksCiAgICAoMHhEODIsICdWJyksCiAgICAoMHhEODQsICdYJyksCiAgICAoMHhEODUsICdWJyksCiAgICAoMHhEOTcsICdYJyksCiAgICAoMHhEOUEsICdWJyksCiAgICAoMHhEQjIsICdYJyksCiAgICAoMHhEQjMsICdWJyksCiAgICAoMHhEQkMsICdYJyksCiAgICAoMHhEQkQsICdWJyksCiAgICAoMHhEQkUsICdYJyksCiAgICAoMHhEQzAsICdWJyksCiAgICAoMHhEQzcsICdYJyksCiAgICAoMHhEQ0EsICdWJyksCiAgICAoMHhEQ0IsICdYJyksCiAgICAoMHhEQ0YsICdWJyksCiAgICAoMHhERDUsICdYJyksCiAgICAoMHhERDYsICdWJyksCiAgICAoMHhERDcsICdYJyksCiAgICAoMHhERDgsICdWJyksCiAgICAoMHhERTAsICdYJyksCiAgICAoMHhERjIsICdWJyksCiAgICAoMHhERjUsICdYJyksCiAgICAoMHhFMDEsICdWJyksCiAgICAoMHhFMzMsICdNJywgdSfguY3guLInKSwKICAgICgweEUzNCwgJ1YnKSwKICAgICgweEUzQiwgJ1gnKSwKICAgICgweEUzRiwgJ1YnKSwKICAgICgweEU1QywgJ1gnKSwKICAgICgweEU4MSwgJ1YnKSwKICAgICgweEU4MywgJ1gnKSwKICAgICgweEU4NCwgJ1YnKSwKICAgICgweEU4NSwgJ1gnKSwKICAgICgweEU4NywgJ1YnKSwKICAgIF0KCmRlZiBfc2VnXzEzKCk6CiAgICByZXR1cm4gWwogICAgKDB4RTg5LCAnWCcpLAogICAgKDB4RThBLCAnVicpLAogICAgKDB4RThCLCAnWCcpLAogICAgKDB4RThELCAnVicpLAogICAgKDB4RThFLCAnWCcpLAogICAgKDB4RTk0LCAnVicpLAogICAgKDB4RTk4LCAnWCcpLAogICAgKDB4RTk5LCAnVicpLAogICAgKDB4RUEwLCAnWCcpLAogICAgKDB4RUExLCAnVicpLAogICAgKDB4RUE0LCAnWCcpLAogICAgKDB4RUE1LCAnVicpLAogICAgKDB4RUE2LCAnWCcpLAogICAgKDB4RUE3LCAnVicpLAogICAgKDB4RUE4LCAnWCcpLAogICAgKDB4RUFBLCAnVicpLAogICAgKDB4RUFDLCAnWCcpLAogICAgKDB4RUFELCAnVicpLAogICAgKDB4RUIzLCAnTScsIHUn4LuN4LqyJyksCiAgICAoMHhFQjQsICdWJyksCiAgICAoMHhFQkEsICdYJyksCiAgICAoMHhFQkIsICdWJyksCiAgICAoMHhFQkUsICdYJyksCiAgICAoMHhFQzAsICdWJyksCiAgICAoMHhFQzUsICdYJyksCiAgICAoMHhFQzYsICdWJyksCiAgICAoMHhFQzcsICdYJyksCiAgICAoMHhFQzgsICdWJyksCiAgICAoMHhFQ0UsICdYJyksCiAgICAoMHhFRDAsICdWJyksCiAgICAoMHhFREEsICdYJyksCiAgICAoMHhFREMsICdNJywgdSfguqvgupknKSwKICAgICgweEVERCwgJ00nLCB1J+C6q+C6oScpLAogICAgKDB4RURFLCAnVicpLAogICAgKDB4RUUwLCAnWCcpLAogICAgKDB4RjAwLCAnVicpLAogICAgKDB4RjBDLCAnTScsIHUn4LyLJyksCiAgICAoMHhGMEQsICdWJyksCiAgICAoMHhGNDMsICdNJywgdSfgvYLgvrcnKSwKICAgICgweEY0NCwgJ1YnKSwKICAgICgweEY0OCwgJ1gnKSwKICAgICgweEY0OSwgJ1YnKSwKICAgICgweEY0RCwgJ00nLCB1J+C9jOC+tycpLAogICAgKDB4RjRFLCAnVicpLAogICAgKDB4RjUyLCAnTScsIHUn4L2R4L63JyksCiAgICAoMHhGNTMsICdWJyksCiAgICAoMHhGNTcsICdNJywgdSfgvZbgvrcnKSwKICAgICgweEY1OCwgJ1YnKSwKICAgICgweEY1QywgJ00nLCB1J+C9m+C+tycpLAogICAgKDB4RjVELCAnVicpLAogICAgKDB4RjY5LCAnTScsIHUn4L2A4L61JyksCiAgICAoMHhGNkEsICdWJyksCiAgICAoMHhGNkQsICdYJyksCiAgICAoMHhGNzEsICdWJyksCiAgICAoMHhGNzMsICdNJywgdSfgvbHgvbInKSwKICAgICgweEY3NCwgJ1YnKSwKICAgICgweEY3NSwgJ00nLCB1J+C9seC9tCcpLAogICAgKDB4Rjc2LCAnTScsIHUn4L6y4L6AJyksCiAgICAoMHhGNzcsICdNJywgdSfgvrLgvbHgvoAnKSwKICAgICgweEY3OCwgJ00nLCB1J+C+s+C+gCcpLAogICAgKDB4Rjc5LCAnTScsIHUn4L6z4L2x4L6AJyksCiAgICAoMHhGN0EsICdWJyksCiAgICAoMHhGODEsICdNJywgdSfgvbHgvoAnKSwKICAgICgweEY4MiwgJ1YnKSwKICAgICgweEY5MywgJ00nLCB1J+C+kuC+tycpLAogICAgKDB4Rjk0LCAnVicpLAogICAgKDB4Rjk4LCAnWCcpLAogICAgKDB4Rjk5LCAnVicpLAogICAgKDB4RjlELCAnTScsIHUn4L6c4L63JyksCiAgICAoMHhGOUUsICdWJyksCiAgICAoMHhGQTIsICdNJywgdSfgvqHgvrcnKSwKICAgICgweEZBMywgJ1YnKSwKICAgICgweEZBNywgJ00nLCB1J+C+puC+tycpLAogICAgKDB4RkE4LCAnVicpLAogICAgKDB4RkFDLCAnTScsIHUn4L6r4L63JyksCiAgICAoMHhGQUQsICdWJyksCiAgICAoMHhGQjksICdNJywgdSfgvpDgvrUnKSwKICAgICgweEZCQSwgJ1YnKSwKICAgICgweEZCRCwgJ1gnKSwKICAgICgweEZCRSwgJ1YnKSwKICAgICgweEZDRCwgJ1gnKSwKICAgICgweEZDRSwgJ1YnKSwKICAgICgweEZEQiwgJ1gnKSwKICAgICgweDEwMDAsICdWJyksCiAgICAoMHgxMEEwLCAnWCcpLAogICAgKDB4MTBDNywgJ00nLCB1J+K0pycpLAogICAgKDB4MTBDOCwgJ1gnKSwKICAgICgweDEwQ0QsICdNJywgdSfitK0nKSwKICAgICgweDEwQ0UsICdYJyksCiAgICAoMHgxMEQwLCAnVicpLAogICAgKDB4MTBGQywgJ00nLCB1J+GDnCcpLAogICAgKDB4MTBGRCwgJ1YnKSwKICAgICgweDExNUYsICdYJyksCiAgICAoMHgxMTYxLCAnVicpLAogICAgKDB4MTI0OSwgJ1gnKSwKICAgICgweDEyNEEsICdWJyksCiAgICAoMHgxMjRFLCAnWCcpLAogICAgKDB4MTI1MCwgJ1YnKSwKICAgICgweDEyNTcsICdYJyksCiAgICAoMHgxMjU4LCAnVicpLAogICAgXQoKZGVmIF9zZWdfMTQoKToKICAgIHJldHVybiBbCiAgICAoMHgxMjU5LCAnWCcpLAogICAgKDB4MTI1QSwgJ1YnKSwKICAgICgweDEyNUUsICdYJyksCiAgICAoMHgxMjYwLCAnVicpLAogICAgKDB4MTI4OSwgJ1gnKSwKICAgICgweDEyOEEsICdWJyksCiAgICAoMHgxMjhFLCAnWCcpLAogICAgKDB4MTI5MCwgJ1YnKSwKICAgICgweDEyQjEsICdYJyksCiAgICAoMHgxMkIyLCAnVicpLAogICAgKDB4MTJCNiwgJ1gnKSwKICAgICgweDEyQjgsICdWJyksCiAgICAoMHgxMkJGLCAnWCcpLAogICAgKDB4MTJDMCwgJ1YnKSwKICAgICgweDEyQzEsICdYJyksCiAgICAoMHgxMkMyLCAnVicpLAogICAgKDB4MTJDNiwgJ1gnKSwKICAgICgweDEyQzgsICdWJyksCiAgICAoMHgxMkQ3LCAnWCcpLAogICAgKDB4MTJEOCwgJ1YnKSwKICAgICgweDEzMTEsICdYJyksCiAgICAoMHgxMzEyLCAnVicpLAogICAgKDB4MTMxNiwgJ1gnKSwKICAgICgweDEzMTgsICdWJyksCiAgICAoMHgxMzVCLCAnWCcpLAogICAgKDB4MTM1RCwgJ1YnKSwKICAgICgweDEzN0QsICdYJyksCiAgICAoMHgxMzgwLCAnVicpLAogICAgKDB4MTM5QSwgJ1gnKSwKICAgICgweDEzQTAsICdWJyksCiAgICAoMHgxM0Y1LCAnWCcpLAogICAgKDB4MTQwMCwgJ1YnKSwKICAgICgweDE2ODAsICdYJyksCiAgICAoMHgxNjgxLCAnVicpLAogICAgKDB4MTY5RCwgJ1gnKSwKICAgICgweDE2QTAsICdWJyksCiAgICAoMHgxNkYxLCAnWCcpLAogICAgKDB4MTcwMCwgJ1YnKSwKICAgICgweDE3MEQsICdYJyksCiAgICAoMHgxNzBFLCAnVicpLAogICAgKDB4MTcxNSwgJ1gnKSwKICAgICgweDE3MjAsICdWJyksCiAgICAoMHgxNzM3LCAnWCcpLAogICAgKDB4MTc0MCwgJ1YnKSwKICAgICgweDE3NTQsICdYJyksCiAgICAoMHgxNzYwLCAnVicpLAogICAgKDB4MTc2RCwgJ1gnKSwKICAgICgweDE3NkUsICdWJyksCiAgICAoMHgxNzcxLCAnWCcpLAogICAgKDB4MTc3MiwgJ1YnKSwKICAgICgweDE3NzQsICdYJyksCiAgICAoMHgxNzgwLCAnVicpLAogICAgKDB4MTdCNCwgJ1gnKSwKICAgICgweDE3QjYsICdWJyksCiAgICAoMHgxN0RFLCAnWCcpLAogICAgKDB4MTdFMCwgJ1YnKSwKICAgICgweDE3RUEsICdYJyksCiAgICAoMHgxN0YwLCAnVicpLAogICAgKDB4MTdGQSwgJ1gnKSwKICAgICgweDE4MDAsICdWJyksCiAgICAoMHgxODA2LCAnWCcpLAogICAgKDB4MTgwNywgJ1YnKSwKICAgICgweDE4MEIsICdJJyksCiAgICAoMHgxODBFLCAnWCcpLAogICAgKDB4MTgxMCwgJ1YnKSwKICAgICgweDE4MUEsICdYJyksCiAgICAoMHgxODIwLCAnVicpLAogICAgKDB4MTg3OCwgJ1gnKSwKICAgICgweDE4ODAsICdWJyksCiAgICAoMHgxOEFCLCAnWCcpLAogICAgKDB4MThCMCwgJ1YnKSwKICAgICgweDE4RjYsICdYJyksCiAgICAoMHgxOTAwLCAnVicpLAogICAgKDB4MTkxRCwgJ1gnKSwKICAgICgweDE5MjAsICdWJyksCiAgICAoMHgxOTJDLCAnWCcpLAogICAgKDB4MTkzMCwgJ1YnKSwKICAgICgweDE5M0MsICdYJyksCiAgICAoMHgxOTQwLCAnVicpLAogICAgKDB4MTk0MSwgJ1gnKSwKICAgICgweDE5NDQsICdWJyksCiAgICAoMHgxOTZFLCAnWCcpLAogICAgKDB4MTk3MCwgJ1YnKSwKICAgICgweDE5NzUsICdYJyksCiAgICAoMHgxOTgwLCAnVicpLAogICAgKDB4MTlBQywgJ1gnKSwKICAgICgweDE5QjAsICdWJyksCiAgICAoMHgxOUNBLCAnWCcpLAogICAgKDB4MTlEMCwgJ1YnKSwKICAgICgweDE5REIsICdYJyksCiAgICAoMHgxOURFLCAnVicpLAogICAgKDB4MUExQywgJ1gnKSwKICAgICgweDFBMUUsICdWJyksCiAgICAoMHgxQTVGLCAnWCcpLAogICAgKDB4MUE2MCwgJ1YnKSwKICAgICgweDFBN0QsICdYJyksCiAgICAoMHgxQTdGLCAnVicpLAogICAgKDB4MUE4QSwgJ1gnKSwKICAgICgweDFBOTAsICdWJyksCiAgICAoMHgxQTlBLCAnWCcpLAogICAgXQoKZGVmIF9zZWdfMTUoKToKICAgIHJldHVybiBbCiAgICAoMHgxQUEwLCAnVicpLAogICAgKDB4MUFBRSwgJ1gnKSwKICAgICgweDFCMDAsICdWJyksCiAgICAoMHgxQjRDLCAnWCcpLAogICAgKDB4MUI1MCwgJ1YnKSwKICAgICgweDFCN0QsICdYJyksCiAgICAoMHgxQjgwLCAnVicpLAogICAgKDB4MUJGNCwgJ1gnKSwKICAgICgweDFCRkMsICdWJyksCiAgICAoMHgxQzM4LCAnWCcpLAogICAgKDB4MUMzQiwgJ1YnKSwKICAgICgweDFDNEEsICdYJyksCiAgICAoMHgxQzRELCAnVicpLAogICAgKDB4MUM4MCwgJ1gnKSwKICAgICgweDFDQzAsICdWJyksCiAgICAoMHgxQ0M4LCAnWCcpLAogICAgKDB4MUNEMCwgJ1YnKSwKICAgICgweDFDRjcsICdYJyksCiAgICAoMHgxRDAwLCAnVicpLAogICAgKDB4MUQyQywgJ00nLCB1J2EnKSwKICAgICgweDFEMkQsICdNJywgdSfDpicpLAogICAgKDB4MUQyRSwgJ00nLCB1J2InKSwKICAgICgweDFEMkYsICdWJyksCiAgICAoMHgxRDMwLCAnTScsIHUnZCcpLAogICAgKDB4MUQzMSwgJ00nLCB1J2UnKSwKICAgICgweDFEMzIsICdNJywgdSfHnScpLAogICAgKDB4MUQzMywgJ00nLCB1J2cnKSwKICAgICgweDFEMzQsICdNJywgdSdoJyksCiAgICAoMHgxRDM1LCAnTScsIHUnaScpLAogICAgKDB4MUQzNiwgJ00nLCB1J2onKSwKICAgICgweDFEMzcsICdNJywgdSdrJyksCiAgICAoMHgxRDM4LCAnTScsIHUnbCcpLAogICAgKDB4MUQzOSwgJ00nLCB1J20nKSwKICAgICgweDFEM0EsICdNJywgdSduJyksCiAgICAoMHgxRDNCLCAnVicpLAogICAgKDB4MUQzQywgJ00nLCB1J28nKSwKICAgICgweDFEM0QsICdNJywgdSfIoycpLAogICAgKDB4MUQzRSwgJ00nLCB1J3AnKSwKICAgICgweDFEM0YsICdNJywgdSdyJyksCiAgICAoMHgxRDQwLCAnTScsIHUndCcpLAogICAgKDB4MUQ0MSwgJ00nLCB1J3UnKSwKICAgICgweDFENDIsICdNJywgdSd3JyksCiAgICAoMHgxRDQzLCAnTScsIHUnYScpLAogICAgKDB4MUQ0NCwgJ00nLCB1J8mQJyksCiAgICAoMHgxRDQ1LCAnTScsIHUnyZEnKSwKICAgICgweDFENDYsICdNJywgdSfhtIInKSwKICAgICgweDFENDcsICdNJywgdSdiJyksCiAgICAoMHgxRDQ4LCAnTScsIHUnZCcpLAogICAgKDB4MUQ0OSwgJ00nLCB1J2UnKSwKICAgICgweDFENEEsICdNJywgdSfJmScpLAogICAgKDB4MUQ0QiwgJ00nLCB1J8mbJyksCiAgICAoMHgxRDRDLCAnTScsIHUnyZwnKSwKICAgICgweDFENEQsICdNJywgdSdnJyksCiAgICAoMHgxRDRFLCAnVicpLAogICAgKDB4MUQ0RiwgJ00nLCB1J2snKSwKICAgICgweDFENTAsICdNJywgdSdtJyksCiAgICAoMHgxRDUxLCAnTScsIHUnxYsnKSwKICAgICgweDFENTIsICdNJywgdSdvJyksCiAgICAoMHgxRDUzLCAnTScsIHUnyZQnKSwKICAgICgweDFENTQsICdNJywgdSfhtJYnKSwKICAgICgweDFENTUsICdNJywgdSfhtJcnKSwKICAgICgweDFENTYsICdNJywgdSdwJyksCiAgICAoMHgxRDU3LCAnTScsIHUndCcpLAogICAgKDB4MUQ1OCwgJ00nLCB1J3UnKSwKICAgICgweDFENTksICdNJywgdSfhtJ0nKSwKICAgICgweDFENUEsICdNJywgdSfJrycpLAogICAgKDB4MUQ1QiwgJ00nLCB1J3YnKSwKICAgICgweDFENUMsICdNJywgdSfhtKUnKSwKICAgICgweDFENUQsICdNJywgdSfOsicpLAogICAgKDB4MUQ1RSwgJ00nLCB1J86zJyksCiAgICAoMHgxRDVGLCAnTScsIHUnzrQnKSwKICAgICgweDFENjAsICdNJywgdSfPhicpLAogICAgKDB4MUQ2MSwgJ00nLCB1J8+HJyksCiAgICAoMHgxRDYyLCAnTScsIHUnaScpLAogICAgKDB4MUQ2MywgJ00nLCB1J3InKSwKICAgICgweDFENjQsICdNJywgdSd1JyksCiAgICAoMHgxRDY1LCAnTScsIHUndicpLAogICAgKDB4MUQ2NiwgJ00nLCB1J86yJyksCiAgICAoMHgxRDY3LCAnTScsIHUnzrMnKSwKICAgICgweDFENjgsICdNJywgdSfPgScpLAogICAgKDB4MUQ2OSwgJ00nLCB1J8+GJyksCiAgICAoMHgxRDZBLCAnTScsIHUnz4cnKSwKICAgICgweDFENkIsICdWJyksCiAgICAoMHgxRDc4LCAnTScsIHUn0L0nKSwKICAgICgweDFENzksICdWJyksCiAgICAoMHgxRDlCLCAnTScsIHUnyZInKSwKICAgICgweDFEOUMsICdNJywgdSdjJyksCiAgICAoMHgxRDlELCAnTScsIHUnyZUnKSwKICAgICgweDFEOUUsICdNJywgdSfDsCcpLAogICAgKDB4MUQ5RiwgJ00nLCB1J8mcJyksCiAgICAoMHgxREEwLCAnTScsIHUnZicpLAogICAgKDB4MURBMSwgJ00nLCB1J8mfJyksCiAgICAoMHgxREEyLCAnTScsIHUnyaEnKSwKICAgICgweDFEQTMsICdNJywgdSfJpScpLAogICAgKDB4MURBNCwgJ00nLCB1J8moJyksCiAgICAoMHgxREE1LCAnTScsIHUnyaknKSwKICAgICgweDFEQTYsICdNJywgdSfJqicpLAogICAgKDB4MURBNywgJ00nLCB1J+G1uycpLAogICAgKDB4MURBOCwgJ00nLCB1J8qdJyksCiAgICAoMHgxREE5LCAnTScsIHUnya0nKSwKICAgIF0KCmRlZiBfc2VnXzE2KCk6CiAgICByZXR1cm4gWwogICAgKDB4MURBQSwgJ00nLCB1J+G2hScpLAogICAgKDB4MURBQiwgJ00nLCB1J8qfJyksCiAgICAoMHgxREFDLCAnTScsIHUnybEnKSwKICAgICgweDFEQUQsICdNJywgdSfJsCcpLAogICAgKDB4MURBRSwgJ00nLCB1J8myJyksCiAgICAoMHgxREFGLCAnTScsIHUnybMnKSwKICAgICgweDFEQjAsICdNJywgdSfJtCcpLAogICAgKDB4MURCMSwgJ00nLCB1J8m1JyksCiAgICAoMHgxREIyLCAnTScsIHUnybgnKSwKICAgICgweDFEQjMsICdNJywgdSfKgicpLAogICAgKDB4MURCNCwgJ00nLCB1J8qDJyksCiAgICAoMHgxREI1LCAnTScsIHUnxqsnKSwKICAgICgweDFEQjYsICdNJywgdSfKiScpLAogICAgKDB4MURCNywgJ00nLCB1J8qKJyksCiAgICAoMHgxREI4LCAnTScsIHUn4bScJyksCiAgICAoMHgxREI5LCAnTScsIHUnyosnKSwKICAgICgweDFEQkEsICdNJywgdSfKjCcpLAogICAgKDB4MURCQiwgJ00nLCB1J3onKSwKICAgICgweDFEQkMsICdNJywgdSfKkCcpLAogICAgKDB4MURCRCwgJ00nLCB1J8qRJyksCiAgICAoMHgxREJFLCAnTScsIHUnypInKSwKICAgICgweDFEQkYsICdNJywgdSfOuCcpLAogICAgKDB4MURDMCwgJ1YnKSwKICAgICgweDFERTcsICdYJyksCiAgICAoMHgxREZDLCAnVicpLAogICAgKDB4MUUwMCwgJ00nLCB1J+G4gScpLAogICAgKDB4MUUwMSwgJ1YnKSwKICAgICgweDFFMDIsICdNJywgdSfhuIMnKSwKICAgICgweDFFMDMsICdWJyksCiAgICAoMHgxRTA0LCAnTScsIHUn4biFJyksCiAgICAoMHgxRTA1LCAnVicpLAogICAgKDB4MUUwNiwgJ00nLCB1J+G4hycpLAogICAgKDB4MUUwNywgJ1YnKSwKICAgICgweDFFMDgsICdNJywgdSfhuIknKSwKICAgICgweDFFMDksICdWJyksCiAgICAoMHgxRTBBLCAnTScsIHUn4biLJyksCiAgICAoMHgxRTBCLCAnVicpLAogICAgKDB4MUUwQywgJ00nLCB1J+G4jScpLAogICAgKDB4MUUwRCwgJ1YnKSwKICAgICgweDFFMEUsICdNJywgdSfhuI8nKSwKICAgICgweDFFMEYsICdWJyksCiAgICAoMHgxRTEwLCAnTScsIHUn4biRJyksCiAgICAoMHgxRTExLCAnVicpLAogICAgKDB4MUUxMiwgJ00nLCB1J+G4kycpLAogICAgKDB4MUUxMywgJ1YnKSwKICAgICgweDFFMTQsICdNJywgdSfhuJUnKSwKICAgICgweDFFMTUsICdWJyksCiAgICAoMHgxRTE2LCAnTScsIHUn4biXJyksCiAgICAoMHgxRTE3LCAnVicpLAogICAgKDB4MUUxOCwgJ00nLCB1J+G4mScpLAogICAgKDB4MUUxOSwgJ1YnKSwKICAgICgweDFFMUEsICdNJywgdSfhuJsnKSwKICAgICgweDFFMUIsICdWJyksCiAgICAoMHgxRTFDLCAnTScsIHUn4bidJyksCiAgICAoMHgxRTFELCAnVicpLAogICAgKDB4MUUxRSwgJ00nLCB1J+G4nycpLAogICAgKDB4MUUxRiwgJ1YnKSwKICAgICgweDFFMjAsICdNJywgdSfhuKEnKSwKICAgICgweDFFMjEsICdWJyksCiAgICAoMHgxRTIyLCAnTScsIHUn4bijJyksCiAgICAoMHgxRTIzLCAnVicpLAogICAgKDB4MUUyNCwgJ00nLCB1J+G4pScpLAogICAgKDB4MUUyNSwgJ1YnKSwKICAgICgweDFFMjYsICdNJywgdSfhuKcnKSwKICAgICgweDFFMjcsICdWJyksCiAgICAoMHgxRTI4LCAnTScsIHUn4bipJyksCiAgICAoMHgxRTI5LCAnVicpLAogICAgKDB4MUUyQSwgJ00nLCB1J+G4qycpLAogICAgKDB4MUUyQiwgJ1YnKSwKICAgICgweDFFMkMsICdNJywgdSfhuK0nKSwKICAgICgweDFFMkQsICdWJyksCiAgICAoMHgxRTJFLCAnTScsIHUn4bivJyksCiAgICAoMHgxRTJGLCAnVicpLAogICAgKDB4MUUzMCwgJ00nLCB1J+G4sScpLAogICAgKDB4MUUzMSwgJ1YnKSwKICAgICgweDFFMzIsICdNJywgdSfhuLMnKSwKICAgICgweDFFMzMsICdWJyksCiAgICAoMHgxRTM0LCAnTScsIHUn4bi1JyksCiAgICAoMHgxRTM1LCAnVicpLAogICAgKDB4MUUzNiwgJ00nLCB1J+G4tycpLAogICAgKDB4MUUzNywgJ1YnKSwKICAgICgweDFFMzgsICdNJywgdSfhuLknKSwKICAgICgweDFFMzksICdWJyksCiAgICAoMHgxRTNBLCAnTScsIHUn4bi7JyksCiAgICAoMHgxRTNCLCAnVicpLAogICAgKDB4MUUzQywgJ00nLCB1J+G4vScpLAogICAgKDB4MUUzRCwgJ1YnKSwKICAgICgweDFFM0UsICdNJywgdSfhuL8nKSwKICAgICgweDFFM0YsICdWJyksCiAgICAoMHgxRTQwLCAnTScsIHUn4bmBJyksCiAgICAoMHgxRTQxLCAnVicpLAogICAgKDB4MUU0MiwgJ00nLCB1J+G5gycpLAogICAgKDB4MUU0MywgJ1YnKSwKICAgICgweDFFNDQsICdNJywgdSfhuYUnKSwKICAgICgweDFFNDUsICdWJyksCiAgICAoMHgxRTQ2LCAnTScsIHUn4bmHJyksCiAgICAoMHgxRTQ3LCAnVicpLAogICAgKDB4MUU0OCwgJ00nLCB1J+G5iScpLAogICAgKDB4MUU0OSwgJ1YnKSwKICAgICgweDFFNEEsICdNJywgdSfhuYsnKSwKICAgIF0KCmRlZiBfc2VnXzE3KCk6CiAgICByZXR1cm4gWwogICAgKDB4MUU0QiwgJ1YnKSwKICAgICgweDFFNEMsICdNJywgdSfhuY0nKSwKICAgICgweDFFNEQsICdWJyksCiAgICAoMHgxRTRFLCAnTScsIHUn4bmPJyksCiAgICAoMHgxRTRGLCAnVicpLAogICAgKDB4MUU1MCwgJ00nLCB1J+G5kScpLAogICAgKDB4MUU1MSwgJ1YnKSwKICAgICgweDFFNTIsICdNJywgdSfhuZMnKSwKICAgICgweDFFNTMsICdWJyksCiAgICAoMHgxRTU0LCAnTScsIHUn4bmVJyksCiAgICAoMHgxRTU1LCAnVicpLAogICAgKDB4MUU1NiwgJ00nLCB1J+G5lycpLAogICAgKDB4MUU1NywgJ1YnKSwKICAgICgweDFFNTgsICdNJywgdSfhuZknKSwKICAgICgweDFFNTksICdWJyksCiAgICAoMHgxRTVBLCAnTScsIHUn4bmbJyksCiAgICAoMHgxRTVCLCAnVicpLAogICAgKDB4MUU1QywgJ00nLCB1J+G5nScpLAogICAgKDB4MUU1RCwgJ1YnKSwKICAgICgweDFFNUUsICdNJywgdSfhuZ8nKSwKICAgICgweDFFNUYsICdWJyksCiAgICAoMHgxRTYwLCAnTScsIHUn4bmhJyksCiAgICAoMHgxRTYxLCAnVicpLAogICAgKDB4MUU2MiwgJ00nLCB1J+G5oycpLAogICAgKDB4MUU2MywgJ1YnKSwKICAgICgweDFFNjQsICdNJywgdSfhuaUnKSwKICAgICgweDFFNjUsICdWJyksCiAgICAoMHgxRTY2LCAnTScsIHUn4bmnJyksCiAgICAoMHgxRTY3LCAnVicpLAogICAgKDB4MUU2OCwgJ00nLCB1J+G5qScpLAogICAgKDB4MUU2OSwgJ1YnKSwKICAgICgweDFFNkEsICdNJywgdSfhuasnKSwKICAgICgweDFFNkIsICdWJyksCiAgICAoMHgxRTZDLCAnTScsIHUn4bmtJyksCiAgICAoMHgxRTZELCAnVicpLAogICAgKDB4MUU2RSwgJ00nLCB1J+G5rycpLAogICAgKDB4MUU2RiwgJ1YnKSwKICAgICgweDFFNzAsICdNJywgdSfhubEnKSwKICAgICgweDFFNzEsICdWJyksCiAgICAoMHgxRTcyLCAnTScsIHUn4bmzJyksCiAgICAoMHgxRTczLCAnVicpLAogICAgKDB4MUU3NCwgJ00nLCB1J+G5tScpLAogICAgKDB4MUU3NSwgJ1YnKSwKICAgICgweDFFNzYsICdNJywgdSfhubcnKSwKICAgICgweDFFNzcsICdWJyksCiAgICAoMHgxRTc4LCAnTScsIHUn4bm5JyksCiAgICAoMHgxRTc5LCAnVicpLAogICAgKDB4MUU3QSwgJ00nLCB1J+G5uycpLAogICAgKDB4MUU3QiwgJ1YnKSwKICAgICgweDFFN0MsICdNJywgdSfhub0nKSwKICAgICgweDFFN0QsICdWJyksCiAgICAoMHgxRTdFLCAnTScsIHUn4bm/JyksCiAgICAoMHgxRTdGLCAnVicpLAogICAgKDB4MUU4MCwgJ00nLCB1J+G6gScpLAogICAgKDB4MUU4MSwgJ1YnKSwKICAgICgweDFFODIsICdNJywgdSfhuoMnKSwKICAgICgweDFFODMsICdWJyksCiAgICAoMHgxRTg0LCAnTScsIHUn4bqFJyksCiAgICAoMHgxRTg1LCAnVicpLAogICAgKDB4MUU4NiwgJ00nLCB1J+G6hycpLAogICAgKDB4MUU4NywgJ1YnKSwKICAgICgweDFFODgsICdNJywgdSfhuoknKSwKICAgICgweDFFODksICdWJyksCiAgICAoMHgxRThBLCAnTScsIHUn4bqLJyksCiAgICAoMHgxRThCLCAnVicpLAogICAgKDB4MUU4QywgJ00nLCB1J+G6jScpLAogICAgKDB4MUU4RCwgJ1YnKSwKICAgICgweDFFOEUsICdNJywgdSfhuo8nKSwKICAgICgweDFFOEYsICdWJyksCiAgICAoMHgxRTkwLCAnTScsIHUn4bqRJyksCiAgICAoMHgxRTkxLCAnVicpLAogICAgKDB4MUU5MiwgJ00nLCB1J+G6kycpLAogICAgKDB4MUU5MywgJ1YnKSwKICAgICgweDFFOTQsICdNJywgdSfhupUnKSwKICAgICgweDFFOTUsICdWJyksCiAgICAoMHgxRTlBLCAnTScsIHUnYcq+JyksCiAgICAoMHgxRTlCLCAnTScsIHUn4bmhJyksCiAgICAoMHgxRTlDLCAnVicpLAogICAgKDB4MUU5RSwgJ00nLCB1J3NzJyksCiAgICAoMHgxRTlGLCAnVicpLAogICAgKDB4MUVBMCwgJ00nLCB1J+G6oScpLAogICAgKDB4MUVBMSwgJ1YnKSwKICAgICgweDFFQTIsICdNJywgdSfhuqMnKSwKICAgICgweDFFQTMsICdWJyksCiAgICAoMHgxRUE0LCAnTScsIHUn4bqlJyksCiAgICAoMHgxRUE1LCAnVicpLAogICAgKDB4MUVBNiwgJ00nLCB1J+G6pycpLAogICAgKDB4MUVBNywgJ1YnKSwKICAgICgweDFFQTgsICdNJywgdSfhuqknKSwKICAgICgweDFFQTksICdWJyksCiAgICAoMHgxRUFBLCAnTScsIHUn4bqrJyksCiAgICAoMHgxRUFCLCAnVicpLAogICAgKDB4MUVBQywgJ00nLCB1J+G6rScpLAogICAgKDB4MUVBRCwgJ1YnKSwKICAgICgweDFFQUUsICdNJywgdSfhuq8nKSwKICAgICgweDFFQUYsICdWJyksCiAgICAoMHgxRUIwLCAnTScsIHUn4bqxJyksCiAgICAoMHgxRUIxLCAnVicpLAogICAgKDB4MUVCMiwgJ00nLCB1J+G6sycpLAogICAgKDB4MUVCMywgJ1YnKSwKICAgIF0KCmRlZiBfc2VnXzE4KCk6CiAgICByZXR1cm4gWwogICAgKDB4MUVCNCwgJ00nLCB1J+G6tScpLAogICAgKDB4MUVCNSwgJ1YnKSwKICAgICgweDFFQjYsICdNJywgdSfhurcnKSwKICAgICgweDFFQjcsICdWJyksCiAgICAoMHgxRUI4LCAnTScsIHUn4bq5JyksCiAgICAoMHgxRUI5LCAnVicpLAogICAgKDB4MUVCQSwgJ00nLCB1J+G6uycpLAogICAgKDB4MUVCQiwgJ1YnKSwKICAgICgweDFFQkMsICdNJywgdSfhur0nKSwKICAgICgweDFFQkQsICdWJyksCiAgICAoMHgxRUJFLCAnTScsIHUn4bq/JyksCiAgICAoMHgxRUJGLCAnVicpLAogICAgKDB4MUVDMCwgJ00nLCB1J+G7gScpLAogICAgKDB4MUVDMSwgJ1YnKSwKICAgICgweDFFQzIsICdNJywgdSfhu4MnKSwKICAgICgweDFFQzMsICdWJyksCiAgICAoMHgxRUM0LCAnTScsIHUn4buFJyksCiAgICAoMHgxRUM1LCAnVicpLAogICAgKDB4MUVDNiwgJ00nLCB1J+G7hycpLAogICAgKDB4MUVDNywgJ1YnKSwKICAgICgweDFFQzgsICdNJywgdSfhu4knKSwKICAgICgweDFFQzksICdWJyksCiAgICAoMHgxRUNBLCAnTScsIHUn4buLJyksCiAgICAoMHgxRUNCLCAnVicpLAogICAgKDB4MUVDQywgJ00nLCB1J+G7jScpLAogICAgKDB4MUVDRCwgJ1YnKSwKICAgICgweDFFQ0UsICdNJywgdSfhu48nKSwKICAgICgweDFFQ0YsICdWJyksCiAgICAoMHgxRUQwLCAnTScsIHUn4buRJyksCiAgICAoMHgxRUQxLCAnVicpLAogICAgKDB4MUVEMiwgJ00nLCB1J+G7kycpLAogICAgKDB4MUVEMywgJ1YnKSwKICAgICgweDFFRDQsICdNJywgdSfhu5UnKSwKICAgICgweDFFRDUsICdWJyksCiAgICAoMHgxRUQ2LCAnTScsIHUn4buXJyksCiAgICAoMHgxRUQ3LCAnVicpLAogICAgKDB4MUVEOCwgJ00nLCB1J+G7mScpLAogICAgKDB4MUVEOSwgJ1YnKSwKICAgICgweDFFREEsICdNJywgdSfhu5snKSwKICAgICgweDFFREIsICdWJyksCiAgICAoMHgxRURDLCAnTScsIHUn4budJyksCiAgICAoMHgxRURELCAnVicpLAogICAgKDB4MUVERSwgJ00nLCB1J+G7nycpLAogICAgKDB4MUVERiwgJ1YnKSwKICAgICgweDFFRTAsICdNJywgdSfhu6EnKSwKICAgICgweDFFRTEsICdWJyksCiAgICAoMHgxRUUyLCAnTScsIHUn4bujJyksCiAgICAoMHgxRUUzLCAnVicpLAogICAgKDB4MUVFNCwgJ00nLCB1J+G7pScpLAogICAgKDB4MUVFNSwgJ1YnKSwKICAgICgweDFFRTYsICdNJywgdSfhu6cnKSwKICAgICgweDFFRTcsICdWJyksCiAgICAoMHgxRUU4LCAnTScsIHUn4bupJyksCiAgICAoMHgxRUU5LCAnVicpLAogICAgKDB4MUVFQSwgJ00nLCB1J+G7qycpLAogICAgKDB4MUVFQiwgJ1YnKSwKICAgICgweDFFRUMsICdNJywgdSfhu60nKSwKICAgICgweDFFRUQsICdWJyksCiAgICAoMHgxRUVFLCAnTScsIHUn4buvJyksCiAgICAoMHgxRUVGLCAnVicpLAogICAgKDB4MUVGMCwgJ00nLCB1J+G7sScpLAogICAgKDB4MUVGMSwgJ1YnKSwKICAgICgweDFFRjIsICdNJywgdSfhu7MnKSwKICAgICgweDFFRjMsICdWJyksCiAgICAoMHgxRUY0LCAnTScsIHUn4bu1JyksCiAgICAoMHgxRUY1LCAnVicpLAogICAgKDB4MUVGNiwgJ00nLCB1J+G7tycpLAogICAgKDB4MUVGNywgJ1YnKSwKICAgICgweDFFRjgsICdNJywgdSfhu7knKSwKICAgICgweDFFRjksICdWJyksCiAgICAoMHgxRUZBLCAnTScsIHUn4bu7JyksCiAgICAoMHgxRUZCLCAnVicpLAogICAgKDB4MUVGQywgJ00nLCB1J+G7vScpLAogICAgKDB4MUVGRCwgJ1YnKSwKICAgICgweDFFRkUsICdNJywgdSfhu78nKSwKICAgICgweDFFRkYsICdWJyksCiAgICAoMHgxRjA4LCAnTScsIHUn4byAJyksCiAgICAoMHgxRjA5LCAnTScsIHUn4byBJyksCiAgICAoMHgxRjBBLCAnTScsIHUn4byCJyksCiAgICAoMHgxRjBCLCAnTScsIHUn4byDJyksCiAgICAoMHgxRjBDLCAnTScsIHUn4byEJyksCiAgICAoMHgxRjBELCAnTScsIHUn4byFJyksCiAgICAoMHgxRjBFLCAnTScsIHUn4byGJyksCiAgICAoMHgxRjBGLCAnTScsIHUn4byHJyksCiAgICAoMHgxRjEwLCAnVicpLAogICAgKDB4MUYxNiwgJ1gnKSwKICAgICgweDFGMTgsICdNJywgdSfhvJAnKSwKICAgICgweDFGMTksICdNJywgdSfhvJEnKSwKICAgICgweDFGMUEsICdNJywgdSfhvJInKSwKICAgICgweDFGMUIsICdNJywgdSfhvJMnKSwKICAgICgweDFGMUMsICdNJywgdSfhvJQnKSwKICAgICgweDFGMUQsICdNJywgdSfhvJUnKSwKICAgICgweDFGMUUsICdYJyksCiAgICAoMHgxRjIwLCAnVicpLAogICAgKDB4MUYyOCwgJ00nLCB1J+G8oCcpLAogICAgKDB4MUYyOSwgJ00nLCB1J+G8oScpLAogICAgKDB4MUYyQSwgJ00nLCB1J+G8oicpLAogICAgKDB4MUYyQiwgJ00nLCB1J+G8oycpLAogICAgKDB4MUYyQywgJ00nLCB1J+G8pCcpLAogICAgKDB4MUYyRCwgJ00nLCB1J+G8pScpLAogICAgXQoKZGVmIF9zZWdfMTkoKToKICAgIHJldHVybiBbCiAgICAoMHgxRjJFLCAnTScsIHUn4bymJyksCiAgICAoMHgxRjJGLCAnTScsIHUn4bynJyksCiAgICAoMHgxRjMwLCAnVicpLAogICAgKDB4MUYzOCwgJ00nLCB1J+G8sCcpLAogICAgKDB4MUYzOSwgJ00nLCB1J+G8sScpLAogICAgKDB4MUYzQSwgJ00nLCB1J+G8sicpLAogICAgKDB4MUYzQiwgJ00nLCB1J+G8sycpLAogICAgKDB4MUYzQywgJ00nLCB1J+G8tCcpLAogICAgKDB4MUYzRCwgJ00nLCB1J+G8tScpLAogICAgKDB4MUYzRSwgJ00nLCB1J+G8ticpLAogICAgKDB4MUYzRiwgJ00nLCB1J+G8tycpLAogICAgKDB4MUY0MCwgJ1YnKSwKICAgICgweDFGNDYsICdYJyksCiAgICAoMHgxRjQ4LCAnTScsIHUn4b2AJyksCiAgICAoMHgxRjQ5LCAnTScsIHUn4b2BJyksCiAgICAoMHgxRjRBLCAnTScsIHUn4b2CJyksCiAgICAoMHgxRjRCLCAnTScsIHUn4b2DJyksCiAgICAoMHgxRjRDLCAnTScsIHUn4b2EJyksCiAgICAoMHgxRjRELCAnTScsIHUn4b2FJyksCiAgICAoMHgxRjRFLCAnWCcpLAogICAgKDB4MUY1MCwgJ1YnKSwKICAgICgweDFGNTgsICdYJyksCiAgICAoMHgxRjU5LCAnTScsIHUn4b2RJyksCiAgICAoMHgxRjVBLCAnWCcpLAogICAgKDB4MUY1QiwgJ00nLCB1J+G9kycpLAogICAgKDB4MUY1QywgJ1gnKSwKICAgICgweDFGNUQsICdNJywgdSfhvZUnKSwKICAgICgweDFGNUUsICdYJyksCiAgICAoMHgxRjVGLCAnTScsIHUn4b2XJyksCiAgICAoMHgxRjYwLCAnVicpLAogICAgKDB4MUY2OCwgJ00nLCB1J+G9oCcpLAogICAgKDB4MUY2OSwgJ00nLCB1J+G9oScpLAogICAgKDB4MUY2QSwgJ00nLCB1J+G9oicpLAogICAgKDB4MUY2QiwgJ00nLCB1J+G9oycpLAogICAgKDB4MUY2QywgJ00nLCB1J+G9pCcpLAogICAgKDB4MUY2RCwgJ00nLCB1J+G9pScpLAogICAgKDB4MUY2RSwgJ00nLCB1J+G9picpLAogICAgKDB4MUY2RiwgJ00nLCB1J+G9pycpLAogICAgKDB4MUY3MCwgJ1YnKSwKICAgICgweDFGNzEsICdNJywgdSfOrCcpLAogICAgKDB4MUY3MiwgJ1YnKSwKICAgICgweDFGNzMsICdNJywgdSfOrScpLAogICAgKDB4MUY3NCwgJ1YnKSwKICAgICgweDFGNzUsICdNJywgdSfOricpLAogICAgKDB4MUY3NiwgJ1YnKSwKICAgICgweDFGNzcsICdNJywgdSfOrycpLAogICAgKDB4MUY3OCwgJ1YnKSwKICAgICgweDFGNzksICdNJywgdSfPjCcpLAogICAgKDB4MUY3QSwgJ1YnKSwKICAgICgweDFGN0IsICdNJywgdSfPjScpLAogICAgKDB4MUY3QywgJ1YnKSwKICAgICgweDFGN0QsICdNJywgdSfPjicpLAogICAgKDB4MUY3RSwgJ1gnKSwKICAgICgweDFGODAsICdNJywgdSfhvIDOuScpLAogICAgKDB4MUY4MSwgJ00nLCB1J+G8gc65JyksCiAgICAoMHgxRjgyLCAnTScsIHUn4byCzrknKSwKICAgICgweDFGODMsICdNJywgdSfhvIPOuScpLAogICAgKDB4MUY4NCwgJ00nLCB1J+G8hM65JyksCiAgICAoMHgxRjg1LCAnTScsIHUn4byFzrknKSwKICAgICgweDFGODYsICdNJywgdSfhvIbOuScpLAogICAgKDB4MUY4NywgJ00nLCB1J+G8h865JyksCiAgICAoMHgxRjg4LCAnTScsIHUn4byAzrknKSwKICAgICgweDFGODksICdNJywgdSfhvIHOuScpLAogICAgKDB4MUY4QSwgJ00nLCB1J+G8gs65JyksCiAgICAoMHgxRjhCLCAnTScsIHUn4byDzrknKSwKICAgICgweDFGOEMsICdNJywgdSfhvITOuScpLAogICAgKDB4MUY4RCwgJ00nLCB1J+G8hc65JyksCiAgICAoMHgxRjhFLCAnTScsIHUn4byGzrknKSwKICAgICgweDFGOEYsICdNJywgdSfhvIfOuScpLAogICAgKDB4MUY5MCwgJ00nLCB1J+G8oM65JyksCiAgICAoMHgxRjkxLCAnTScsIHUn4byhzrknKSwKICAgICgweDFGOTIsICdNJywgdSfhvKLOuScpLAogICAgKDB4MUY5MywgJ00nLCB1J+G8o865JyksCiAgICAoMHgxRjk0LCAnTScsIHUn4bykzrknKSwKICAgICgweDFGOTUsICdNJywgdSfhvKXOuScpLAogICAgKDB4MUY5NiwgJ00nLCB1J+G8ps65JyksCiAgICAoMHgxRjk3LCAnTScsIHUn4bynzrknKSwKICAgICgweDFGOTgsICdNJywgdSfhvKDOuScpLAogICAgKDB4MUY5OSwgJ00nLCB1J+G8oc65JyksCiAgICAoMHgxRjlBLCAnTScsIHUn4byizrknKSwKICAgICgweDFGOUIsICdNJywgdSfhvKPOuScpLAogICAgKDB4MUY5QywgJ00nLCB1J+G8pM65JyksCiAgICAoMHgxRjlELCAnTScsIHUn4bylzrknKSwKICAgICgweDFGOUUsICdNJywgdSfhvKbOuScpLAogICAgKDB4MUY5RiwgJ00nLCB1J+G8p865JyksCiAgICAoMHgxRkEwLCAnTScsIHUn4b2gzrknKSwKICAgICgweDFGQTEsICdNJywgdSfhvaHOuScpLAogICAgKDB4MUZBMiwgJ00nLCB1J+G9os65JyksCiAgICAoMHgxRkEzLCAnTScsIHUn4b2jzrknKSwKICAgICgweDFGQTQsICdNJywgdSfhvaTOuScpLAogICAgKDB4MUZBNSwgJ00nLCB1J+G9pc65JyksCiAgICAoMHgxRkE2LCAnTScsIHUn4b2mzrknKSwKICAgICgweDFGQTcsICdNJywgdSfhvafOuScpLAogICAgKDB4MUZBOCwgJ00nLCB1J+G9oM65JyksCiAgICAoMHgxRkE5LCAnTScsIHUn4b2hzrknKSwKICAgICgweDFGQUEsICdNJywgdSfhvaLOuScpLAogICAgKDB4MUZBQiwgJ00nLCB1J+G9o865JyksCiAgICAoMHgxRkFDLCAnTScsIHUn4b2kzrknKSwKICAgICgweDFGQUQsICdNJywgdSfhvaXOuScpLAogICAgKDB4MUZBRSwgJ00nLCB1J+G9ps65JyksCiAgICBdCgpkZWYgX3NlZ18yMCgpOgogICAgcmV0dXJuIFsKICAgICgweDFGQUYsICdNJywgdSfhvafOuScpLAogICAgKDB4MUZCMCwgJ1YnKSwKICAgICgweDFGQjIsICdNJywgdSfhvbDOuScpLAogICAgKDB4MUZCMywgJ00nLCB1J86xzrknKSwKICAgICgweDFGQjQsICdNJywgdSfOrM65JyksCiAgICAoMHgxRkI1LCAnWCcpLAogICAgKDB4MUZCNiwgJ1YnKSwKICAgICgweDFGQjcsICdNJywgdSfhvrbOuScpLAogICAgKDB4MUZCOCwgJ00nLCB1J+G+sCcpLAogICAgKDB4MUZCOSwgJ00nLCB1J+G+sScpLAogICAgKDB4MUZCQSwgJ00nLCB1J+G9sCcpLAogICAgKDB4MUZCQiwgJ00nLCB1J86sJyksCiAgICAoMHgxRkJDLCAnTScsIHUnzrHOuScpLAogICAgKDB4MUZCRCwgJzMnLCB1JyDMkycpLAogICAgKDB4MUZCRSwgJ00nLCB1J865JyksCiAgICAoMHgxRkJGLCAnMycsIHUnIMyTJyksCiAgICAoMHgxRkMwLCAnMycsIHUnIM2CJyksCiAgICAoMHgxRkMxLCAnMycsIHUnIMyIzYInKSwKICAgICgweDFGQzIsICdNJywgdSfhvbTOuScpLAogICAgKDB4MUZDMywgJ00nLCB1J863zrknKSwKICAgICgweDFGQzQsICdNJywgdSfOrs65JyksCiAgICAoMHgxRkM1LCAnWCcpLAogICAgKDB4MUZDNiwgJ1YnKSwKICAgICgweDFGQzcsICdNJywgdSfhv4bOuScpLAogICAgKDB4MUZDOCwgJ00nLCB1J+G9sicpLAogICAgKDB4MUZDOSwgJ00nLCB1J86tJyksCiAgICAoMHgxRkNBLCAnTScsIHUn4b20JyksCiAgICAoMHgxRkNCLCAnTScsIHUnzq4nKSwKICAgICgweDFGQ0MsICdNJywgdSfOt865JyksCiAgICAoMHgxRkNELCAnMycsIHUnIMyTzIAnKSwKICAgICgweDFGQ0UsICczJywgdScgzJPMgScpLAogICAgKDB4MUZDRiwgJzMnLCB1JyDMk82CJyksCiAgICAoMHgxRkQwLCAnVicpLAogICAgKDB4MUZEMywgJ00nLCB1J86QJyksCiAgICAoMHgxRkQ0LCAnWCcpLAogICAgKDB4MUZENiwgJ1YnKSwKICAgICgweDFGRDgsICdNJywgdSfhv5AnKSwKICAgICgweDFGRDksICdNJywgdSfhv5EnKSwKICAgICgweDFGREEsICdNJywgdSfhvbYnKSwKICAgICgweDFGREIsICdNJywgdSfOrycpLAogICAgKDB4MUZEQywgJ1gnKSwKICAgICgweDFGREQsICczJywgdScgzJTMgCcpLAogICAgKDB4MUZERSwgJzMnLCB1JyDMlMyBJyksCiAgICAoMHgxRkRGLCAnMycsIHUnIMyUzYInKSwKICAgICgweDFGRTAsICdWJyksCiAgICAoMHgxRkUzLCAnTScsIHUnzrAnKSwKICAgICgweDFGRTQsICdWJyksCiAgICAoMHgxRkU4LCAnTScsIHUn4b+gJyksCiAgICAoMHgxRkU5LCAnTScsIHUn4b+hJyksCiAgICAoMHgxRkVBLCAnTScsIHUn4b26JyksCiAgICAoMHgxRkVCLCAnTScsIHUnz40nKSwKICAgICgweDFGRUMsICdNJywgdSfhv6UnKSwKICAgICgweDFGRUQsICczJywgdScgzIjMgCcpLAogICAgKDB4MUZFRSwgJzMnLCB1JyDMiMyBJyksCiAgICAoMHgxRkVGLCAnMycsIHUnYCcpLAogICAgKDB4MUZGMCwgJ1gnKSwKICAgICgweDFGRjIsICdNJywgdSfhvbzOuScpLAogICAgKDB4MUZGMywgJ00nLCB1J8+JzrknKSwKICAgICgweDFGRjQsICdNJywgdSfPjs65JyksCiAgICAoMHgxRkY1LCAnWCcpLAogICAgKDB4MUZGNiwgJ1YnKSwKICAgICgweDFGRjcsICdNJywgdSfhv7bOuScpLAogICAgKDB4MUZGOCwgJ00nLCB1J+G9uCcpLAogICAgKDB4MUZGOSwgJ00nLCB1J8+MJyksCiAgICAoMHgxRkZBLCAnTScsIHUn4b28JyksCiAgICAoMHgxRkZCLCAnTScsIHUnz44nKSwKICAgICgweDFGRkMsICdNJywgdSfPic65JyksCiAgICAoMHgxRkZELCAnMycsIHUnIMyBJyksCiAgICAoMHgxRkZFLCAnMycsIHUnIMyUJyksCiAgICAoMHgxRkZGLCAnWCcpLAogICAgKDB4MjAwMCwgJzMnLCB1JyAnKSwKICAgICgweDIwMEIsICdJJyksCiAgICAoMHgyMDBDLCAnRCcsIHUnJyksCiAgICAoMHgyMDBFLCAnWCcpLAogICAgKDB4MjAxMCwgJ1YnKSwKICAgICgweDIwMTEsICdNJywgdSfigJAnKSwKICAgICgweDIwMTIsICdWJyksCiAgICAoMHgyMDE3LCAnMycsIHUnIMyzJyksCiAgICAoMHgyMDE4LCAnVicpLAogICAgKDB4MjAyNCwgJ1gnKSwKICAgICgweDIwMjcsICdWJyksCiAgICAoMHgyMDI4LCAnWCcpLAogICAgKDB4MjAyRiwgJzMnLCB1JyAnKSwKICAgICgweDIwMzAsICdWJyksCiAgICAoMHgyMDMzLCAnTScsIHUn4oCy4oCyJyksCiAgICAoMHgyMDM0LCAnTScsIHUn4oCy4oCy4oCyJyksCiAgICAoMHgyMDM1LCAnVicpLAogICAgKDB4MjAzNiwgJ00nLCB1J+KAteKAtScpLAogICAgKDB4MjAzNywgJ00nLCB1J+KAteKAteKAtScpLAogICAgKDB4MjAzOCwgJ1YnKSwKICAgICgweDIwM0MsICczJywgdSchIScpLAogICAgKDB4MjAzRCwgJ1YnKSwKICAgICgweDIwM0UsICczJywgdScgzIUnKSwKICAgICgweDIwM0YsICdWJyksCiAgICAoMHgyMDQ3LCAnMycsIHUnPz8nKSwKICAgICgweDIwNDgsICczJywgdSc/IScpLAogICAgKDB4MjA0OSwgJzMnLCB1JyE/JyksCiAgICAoMHgyMDRBLCAnVicpLAogICAgKDB4MjA1NywgJ00nLCB1J+KAsuKAsuKAsuKAsicpLAogICAgKDB4MjA1OCwgJ1YnKSwKICAgIF0KCmRlZiBfc2VnXzIxKCk6CiAgICByZXR1cm4gWwogICAgKDB4MjA1RiwgJzMnLCB1JyAnKSwKICAgICgweDIwNjAsICdJJyksCiAgICAoMHgyMDYxLCAnWCcpLAogICAgKDB4MjA2NCwgJ0knKSwKICAgICgweDIwNjUsICdYJyksCiAgICAoMHgyMDcwLCAnTScsIHUnMCcpLAogICAgKDB4MjA3MSwgJ00nLCB1J2knKSwKICAgICgweDIwNzIsICdYJyksCiAgICAoMHgyMDc0LCAnTScsIHUnNCcpLAogICAgKDB4MjA3NSwgJ00nLCB1JzUnKSwKICAgICgweDIwNzYsICdNJywgdSc2JyksCiAgICAoMHgyMDc3LCAnTScsIHUnNycpLAogICAgKDB4MjA3OCwgJ00nLCB1JzgnKSwKICAgICgweDIwNzksICdNJywgdSc5JyksCiAgICAoMHgyMDdBLCAnMycsIHUnKycpLAogICAgKDB4MjA3QiwgJ00nLCB1J+KIkicpLAogICAgKDB4MjA3QywgJzMnLCB1Jz0nKSwKICAgICgweDIwN0QsICczJywgdScoJyksCiAgICAoMHgyMDdFLCAnMycsIHUnKScpLAogICAgKDB4MjA3RiwgJ00nLCB1J24nKSwKICAgICgweDIwODAsICdNJywgdScwJyksCiAgICAoMHgyMDgxLCAnTScsIHUnMScpLAogICAgKDB4MjA4MiwgJ00nLCB1JzInKSwKICAgICgweDIwODMsICdNJywgdSczJyksCiAgICAoMHgyMDg0LCAnTScsIHUnNCcpLAogICAgKDB4MjA4NSwgJ00nLCB1JzUnKSwKICAgICgweDIwODYsICdNJywgdSc2JyksCiAgICAoMHgyMDg3LCAnTScsIHUnNycpLAogICAgKDB4MjA4OCwgJ00nLCB1JzgnKSwKICAgICgweDIwODksICdNJywgdSc5JyksCiAgICAoMHgyMDhBLCAnMycsIHUnKycpLAogICAgKDB4MjA4QiwgJ00nLCB1J+KIkicpLAogICAgKDB4MjA4QywgJzMnLCB1Jz0nKSwKICAgICgweDIwOEQsICczJywgdScoJyksCiAgICAoMHgyMDhFLCAnMycsIHUnKScpLAogICAgKDB4MjA4RiwgJ1gnKSwKICAgICgweDIwOTAsICdNJywgdSdhJyksCiAgICAoMHgyMDkxLCAnTScsIHUnZScpLAogICAgKDB4MjA5MiwgJ00nLCB1J28nKSwKICAgICgweDIwOTMsICdNJywgdSd4JyksCiAgICAoMHgyMDk0LCAnTScsIHUnyZknKSwKICAgICgweDIwOTUsICdNJywgdSdoJyksCiAgICAoMHgyMDk2LCAnTScsIHUnaycpLAogICAgKDB4MjA5NywgJ00nLCB1J2wnKSwKICAgICgweDIwOTgsICdNJywgdSdtJyksCiAgICAoMHgyMDk5LCAnTScsIHUnbicpLAogICAgKDB4MjA5QSwgJ00nLCB1J3AnKSwKICAgICgweDIwOUIsICdNJywgdSdzJyksCiAgICAoMHgyMDlDLCAnTScsIHUndCcpLAogICAgKDB4MjA5RCwgJ1gnKSwKICAgICgweDIwQTAsICdWJyksCiAgICAoMHgyMEE4LCAnTScsIHUncnMnKSwKICAgICgweDIwQTksICdWJyksCiAgICAoMHgyMEJCLCAnWCcpLAogICAgKDB4MjBEMCwgJ1YnKSwKICAgICgweDIwRjEsICdYJyksCiAgICAoMHgyMTAwLCAnMycsIHUnYS9jJyksCiAgICAoMHgyMTAxLCAnMycsIHUnYS9zJyksCiAgICAoMHgyMTAyLCAnTScsIHUnYycpLAogICAgKDB4MjEwMywgJ00nLCB1J8KwYycpLAogICAgKDB4MjEwNCwgJ1YnKSwKICAgICgweDIxMDUsICczJywgdSdjL28nKSwKICAgICgweDIxMDYsICczJywgdSdjL3UnKSwKICAgICgweDIxMDcsICdNJywgdSfJmycpLAogICAgKDB4MjEwOCwgJ1YnKSwKICAgICgweDIxMDksICdNJywgdSfCsGYnKSwKICAgICgweDIxMEEsICdNJywgdSdnJyksCiAgICAoMHgyMTBCLCAnTScsIHUnaCcpLAogICAgKDB4MjEwRiwgJ00nLCB1J8SnJyksCiAgICAoMHgyMTEwLCAnTScsIHUnaScpLAogICAgKDB4MjExMiwgJ00nLCB1J2wnKSwKICAgICgweDIxMTQsICdWJyksCiAgICAoMHgyMTE1LCAnTScsIHUnbicpLAogICAgKDB4MjExNiwgJ00nLCB1J25vJyksCiAgICAoMHgyMTE3LCAnVicpLAogICAgKDB4MjExOSwgJ00nLCB1J3AnKSwKICAgICgweDIxMUEsICdNJywgdSdxJyksCiAgICAoMHgyMTFCLCAnTScsIHUncicpLAogICAgKDB4MjExRSwgJ1YnKSwKICAgICgweDIxMjAsICdNJywgdSdzbScpLAogICAgKDB4MjEyMSwgJ00nLCB1J3RlbCcpLAogICAgKDB4MjEyMiwgJ00nLCB1J3RtJyksCiAgICAoMHgyMTIzLCAnVicpLAogICAgKDB4MjEyNCwgJ00nLCB1J3onKSwKICAgICgweDIxMjUsICdWJyksCiAgICAoMHgyMTI2LCAnTScsIHUnz4knKSwKICAgICgweDIxMjcsICdWJyksCiAgICAoMHgyMTI4LCAnTScsIHUneicpLAogICAgKDB4MjEyOSwgJ1YnKSwKICAgICgweDIxMkEsICdNJywgdSdrJyksCiAgICAoMHgyMTJCLCAnTScsIHUnw6UnKSwKICAgICgweDIxMkMsICdNJywgdSdiJyksCiAgICAoMHgyMTJELCAnTScsIHUnYycpLAogICAgKDB4MjEyRSwgJ1YnKSwKICAgICgweDIxMkYsICdNJywgdSdlJyksCiAgICAoMHgyMTMxLCAnTScsIHUnZicpLAogICAgKDB4MjEzMiwgJ1gnKSwKICAgICgweDIxMzMsICdNJywgdSdtJyksCiAgICAoMHgyMTM0LCAnTScsIHUnbycpLAogICAgKDB4MjEzNSwgJ00nLCB1J9eQJyksCiAgICBdCgpkZWYgX3NlZ18yMigpOgogICAgcmV0dXJuIFsKICAgICgweDIxMzYsICdNJywgdSfXkScpLAogICAgKDB4MjEzNywgJ00nLCB1J9eSJyksCiAgICAoMHgyMTM4LCAnTScsIHUn15MnKSwKICAgICgweDIxMzksICdNJywgdSdpJyksCiAgICAoMHgyMTNBLCAnVicpLAogICAgKDB4MjEzQiwgJ00nLCB1J2ZheCcpLAogICAgKDB4MjEzQywgJ00nLCB1J8+AJyksCiAgICAoMHgyMTNELCAnTScsIHUnzrMnKSwKICAgICgweDIxM0YsICdNJywgdSfPgCcpLAogICAgKDB4MjE0MCwgJ00nLCB1J+KIkScpLAogICAgKDB4MjE0MSwgJ1YnKSwKICAgICgweDIxNDUsICdNJywgdSdkJyksCiAgICAoMHgyMTQ3LCAnTScsIHUnZScpLAogICAgKDB4MjE0OCwgJ00nLCB1J2knKSwKICAgICgweDIxNDksICdNJywgdSdqJyksCiAgICAoMHgyMTRBLCAnVicpLAogICAgKDB4MjE1MCwgJ00nLCB1JzHigYQ3JyksCiAgICAoMHgyMTUxLCAnTScsIHUnMeKBhDknKSwKICAgICgweDIxNTIsICdNJywgdScx4oGEMTAnKSwKICAgICgweDIxNTMsICdNJywgdScx4oGEMycpLAogICAgKDB4MjE1NCwgJ00nLCB1JzLigYQzJyksCiAgICAoMHgyMTU1LCAnTScsIHUnMeKBhDUnKSwKICAgICgweDIxNTYsICdNJywgdScy4oGENScpLAogICAgKDB4MjE1NywgJ00nLCB1JzPigYQ1JyksCiAgICAoMHgyMTU4LCAnTScsIHUnNOKBhDUnKSwKICAgICgweDIxNTksICdNJywgdScx4oGENicpLAogICAgKDB4MjE1QSwgJ00nLCB1JzXigYQ2JyksCiAgICAoMHgyMTVCLCAnTScsIHUnMeKBhDgnKSwKICAgICgweDIxNUMsICdNJywgdScz4oGEOCcpLAogICAgKDB4MjE1RCwgJ00nLCB1JzXigYQ4JyksCiAgICAoMHgyMTVFLCAnTScsIHUnN+KBhDgnKSwKICAgICgweDIxNUYsICdNJywgdScx4oGEJyksCiAgICAoMHgyMTYwLCAnTScsIHUnaScpLAogICAgKDB4MjE2MSwgJ00nLCB1J2lpJyksCiAgICAoMHgyMTYyLCAnTScsIHUnaWlpJyksCiAgICAoMHgyMTYzLCAnTScsIHUnaXYnKSwKICAgICgweDIxNjQsICdNJywgdSd2JyksCiAgICAoMHgyMTY1LCAnTScsIHUndmknKSwKICAgICgweDIxNjYsICdNJywgdSd2aWknKSwKICAgICgweDIxNjcsICdNJywgdSd2aWlpJyksCiAgICAoMHgyMTY4LCAnTScsIHUnaXgnKSwKICAgICgweDIxNjksICdNJywgdSd4JyksCiAgICAoMHgyMTZBLCAnTScsIHUneGknKSwKICAgICgweDIxNkIsICdNJywgdSd4aWknKSwKICAgICgweDIxNkMsICdNJywgdSdsJyksCiAgICAoMHgyMTZELCAnTScsIHUnYycpLAogICAgKDB4MjE2RSwgJ00nLCB1J2QnKSwKICAgICgweDIxNkYsICdNJywgdSdtJyksCiAgICAoMHgyMTcwLCAnTScsIHUnaScpLAogICAgKDB4MjE3MSwgJ00nLCB1J2lpJyksCiAgICAoMHgyMTcyLCAnTScsIHUnaWlpJyksCiAgICAoMHgyMTczLCAnTScsIHUnaXYnKSwKICAgICgweDIxNzQsICdNJywgdSd2JyksCiAgICAoMHgyMTc1LCAnTScsIHUndmknKSwKICAgICgweDIxNzYsICdNJywgdSd2aWknKSwKICAgICgweDIxNzcsICdNJywgdSd2aWlpJyksCiAgICAoMHgyMTc4LCAnTScsIHUnaXgnKSwKICAgICgweDIxNzksICdNJywgdSd4JyksCiAgICAoMHgyMTdBLCAnTScsIHUneGknKSwKICAgICgweDIxN0IsICdNJywgdSd4aWknKSwKICAgICgweDIxN0MsICdNJywgdSdsJyksCiAgICAoMHgyMTdELCAnTScsIHUnYycpLAogICAgKDB4MjE3RSwgJ00nLCB1J2QnKSwKICAgICgweDIxN0YsICdNJywgdSdtJyksCiAgICAoMHgyMTgwLCAnVicpLAogICAgKDB4MjE4MywgJ1gnKSwKICAgICgweDIxODQsICdWJyksCiAgICAoMHgyMTg5LCAnTScsIHUnMOKBhDMnKSwKICAgICgweDIxOEEsICdYJyksCiAgICAoMHgyMTkwLCAnVicpLAogICAgKDB4MjIyQywgJ00nLCB1J+KIq+KIqycpLAogICAgKDB4MjIyRCwgJ00nLCB1J+KIq+KIq+KIqycpLAogICAgKDB4MjIyRSwgJ1YnKSwKICAgICgweDIyMkYsICdNJywgdSfiiK7iiK4nKSwKICAgICgweDIyMzAsICdNJywgdSfiiK7iiK7iiK4nKSwKICAgICgweDIyMzEsICdWJyksCiAgICAoMHgyMjYwLCAnMycpLAogICAgKDB4MjI2MSwgJ1YnKSwKICAgICgweDIyNkUsICczJyksCiAgICAoMHgyMjcwLCAnVicpLAogICAgKDB4MjMyOSwgJ00nLCB1J+OAiCcpLAogICAgKDB4MjMyQSwgJ00nLCB1J+OAiScpLAogICAgKDB4MjMyQiwgJ1YnKSwKICAgICgweDIzRjQsICdYJyksCiAgICAoMHgyNDAwLCAnVicpLAogICAgKDB4MjQyNywgJ1gnKSwKICAgICgweDI0NDAsICdWJyksCiAgICAoMHgyNDRCLCAnWCcpLAogICAgKDB4MjQ2MCwgJ00nLCB1JzEnKSwKICAgICgweDI0NjEsICdNJywgdScyJyksCiAgICAoMHgyNDYyLCAnTScsIHUnMycpLAogICAgKDB4MjQ2MywgJ00nLCB1JzQnKSwKICAgICgweDI0NjQsICdNJywgdSc1JyksCiAgICAoMHgyNDY1LCAnTScsIHUnNicpLAogICAgKDB4MjQ2NiwgJ00nLCB1JzcnKSwKICAgICgweDI0NjcsICdNJywgdSc4JyksCiAgICAoMHgyNDY4LCAnTScsIHUnOScpLAogICAgKDB4MjQ2OSwgJ00nLCB1JzEwJyksCiAgICAoMHgyNDZBLCAnTScsIHUnMTEnKSwKICAgICgweDI0NkIsICdNJywgdScxMicpLAogICAgXQoKZGVmIF9zZWdfMjMoKToKICAgIHJldHVybiBbCiAgICAoMHgyNDZDLCAnTScsIHUnMTMnKSwKICAgICgweDI0NkQsICdNJywgdScxNCcpLAogICAgKDB4MjQ2RSwgJ00nLCB1JzE1JyksCiAgICAoMHgyNDZGLCAnTScsIHUnMTYnKSwKICAgICgweDI0NzAsICdNJywgdScxNycpLAogICAgKDB4MjQ3MSwgJ00nLCB1JzE4JyksCiAgICAoMHgyNDcyLCAnTScsIHUnMTknKSwKICAgICgweDI0NzMsICdNJywgdScyMCcpLAogICAgKDB4MjQ3NCwgJzMnLCB1JygxKScpLAogICAgKDB4MjQ3NSwgJzMnLCB1JygyKScpLAogICAgKDB4MjQ3NiwgJzMnLCB1JygzKScpLAogICAgKDB4MjQ3NywgJzMnLCB1Jyg0KScpLAogICAgKDB4MjQ3OCwgJzMnLCB1Jyg1KScpLAogICAgKDB4MjQ3OSwgJzMnLCB1Jyg2KScpLAogICAgKDB4MjQ3QSwgJzMnLCB1Jyg3KScpLAogICAgKDB4MjQ3QiwgJzMnLCB1Jyg4KScpLAogICAgKDB4MjQ3QywgJzMnLCB1Jyg5KScpLAogICAgKDB4MjQ3RCwgJzMnLCB1JygxMCknKSwKICAgICgweDI0N0UsICczJywgdScoMTEpJyksCiAgICAoMHgyNDdGLCAnMycsIHUnKDEyKScpLAogICAgKDB4MjQ4MCwgJzMnLCB1JygxMyknKSwKICAgICgweDI0ODEsICczJywgdScoMTQpJyksCiAgICAoMHgyNDgyLCAnMycsIHUnKDE1KScpLAogICAgKDB4MjQ4MywgJzMnLCB1JygxNiknKSwKICAgICgweDI0ODQsICczJywgdScoMTcpJyksCiAgICAoMHgyNDg1LCAnMycsIHUnKDE4KScpLAogICAgKDB4MjQ4NiwgJzMnLCB1JygxOSknKSwKICAgICgweDI0ODcsICczJywgdScoMjApJyksCiAgICAoMHgyNDg4LCAnWCcpLAogICAgKDB4MjQ5QywgJzMnLCB1JyhhKScpLAogICAgKDB4MjQ5RCwgJzMnLCB1JyhiKScpLAogICAgKDB4MjQ5RSwgJzMnLCB1JyhjKScpLAogICAgKDB4MjQ5RiwgJzMnLCB1JyhkKScpLAogICAgKDB4MjRBMCwgJzMnLCB1JyhlKScpLAogICAgKDB4MjRBMSwgJzMnLCB1JyhmKScpLAogICAgKDB4MjRBMiwgJzMnLCB1JyhnKScpLAogICAgKDB4MjRBMywgJzMnLCB1JyhoKScpLAogICAgKDB4MjRBNCwgJzMnLCB1JyhpKScpLAogICAgKDB4MjRBNSwgJzMnLCB1JyhqKScpLAogICAgKDB4MjRBNiwgJzMnLCB1JyhrKScpLAogICAgKDB4MjRBNywgJzMnLCB1JyhsKScpLAogICAgKDB4MjRBOCwgJzMnLCB1JyhtKScpLAogICAgKDB4MjRBOSwgJzMnLCB1JyhuKScpLAogICAgKDB4MjRBQSwgJzMnLCB1JyhvKScpLAogICAgKDB4MjRBQiwgJzMnLCB1JyhwKScpLAogICAgKDB4MjRBQywgJzMnLCB1JyhxKScpLAogICAgKDB4MjRBRCwgJzMnLCB1JyhyKScpLAogICAgKDB4MjRBRSwgJzMnLCB1JyhzKScpLAogICAgKDB4MjRBRiwgJzMnLCB1Jyh0KScpLAogICAgKDB4MjRCMCwgJzMnLCB1Jyh1KScpLAogICAgKDB4MjRCMSwgJzMnLCB1Jyh2KScpLAogICAgKDB4MjRCMiwgJzMnLCB1Jyh3KScpLAogICAgKDB4MjRCMywgJzMnLCB1Jyh4KScpLAogICAgKDB4MjRCNCwgJzMnLCB1Jyh5KScpLAogICAgKDB4MjRCNSwgJzMnLCB1Jyh6KScpLAogICAgKDB4MjRCNiwgJ00nLCB1J2EnKSwKICAgICgweDI0QjcsICdNJywgdSdiJyksCiAgICAoMHgyNEI4LCAnTScsIHUnYycpLAogICAgKDB4MjRCOSwgJ00nLCB1J2QnKSwKICAgICgweDI0QkEsICdNJywgdSdlJyksCiAgICAoMHgyNEJCLCAnTScsIHUnZicpLAogICAgKDB4MjRCQywgJ00nLCB1J2cnKSwKICAgICgweDI0QkQsICdNJywgdSdoJyksCiAgICAoMHgyNEJFLCAnTScsIHUnaScpLAogICAgKDB4MjRCRiwgJ00nLCB1J2onKSwKICAgICgweDI0QzAsICdNJywgdSdrJyksCiAgICAoMHgyNEMxLCAnTScsIHUnbCcpLAogICAgKDB4MjRDMiwgJ00nLCB1J20nKSwKICAgICgweDI0QzMsICdNJywgdSduJyksCiAgICAoMHgyNEM0LCAnTScsIHUnbycpLAogICAgKDB4MjRDNSwgJ00nLCB1J3AnKSwKICAgICgweDI0QzYsICdNJywgdSdxJyksCiAgICAoMHgyNEM3LCAnTScsIHUncicpLAogICAgKDB4MjRDOCwgJ00nLCB1J3MnKSwKICAgICgweDI0QzksICdNJywgdSd0JyksCiAgICAoMHgyNENBLCAnTScsIHUndScpLAogICAgKDB4MjRDQiwgJ00nLCB1J3YnKSwKICAgICgweDI0Q0MsICdNJywgdSd3JyksCiAgICAoMHgyNENELCAnTScsIHUneCcpLAogICAgKDB4MjRDRSwgJ00nLCB1J3knKSwKICAgICgweDI0Q0YsICdNJywgdSd6JyksCiAgICAoMHgyNEQwLCAnTScsIHUnYScpLAogICAgKDB4MjREMSwgJ00nLCB1J2InKSwKICAgICgweDI0RDIsICdNJywgdSdjJyksCiAgICAoMHgyNEQzLCAnTScsIHUnZCcpLAogICAgKDB4MjRENCwgJ00nLCB1J2UnKSwKICAgICgweDI0RDUsICdNJywgdSdmJyksCiAgICAoMHgyNEQ2LCAnTScsIHUnZycpLAogICAgKDB4MjRENywgJ00nLCB1J2gnKSwKICAgICgweDI0RDgsICdNJywgdSdpJyksCiAgICAoMHgyNEQ5LCAnTScsIHUnaicpLAogICAgKDB4MjREQSwgJ00nLCB1J2snKSwKICAgICgweDI0REIsICdNJywgdSdsJyksCiAgICAoMHgyNERDLCAnTScsIHUnbScpLAogICAgKDB4MjRERCwgJ00nLCB1J24nKSwKICAgICgweDI0REUsICdNJywgdSdvJyksCiAgICAoMHgyNERGLCAnTScsIHUncCcpLAogICAgKDB4MjRFMCwgJ00nLCB1J3EnKSwKICAgICgweDI0RTEsICdNJywgdSdyJyksCiAgICAoMHgyNEUyLCAnTScsIHUncycpLAogICAgXQoKZGVmIF9zZWdfMjQoKToKICAgIHJldHVybiBbCiAgICAoMHgyNEUzLCAnTScsIHUndCcpLAogICAgKDB4MjRFNCwgJ00nLCB1J3UnKSwKICAgICgweDI0RTUsICdNJywgdSd2JyksCiAgICAoMHgyNEU2LCAnTScsIHUndycpLAogICAgKDB4MjRFNywgJ00nLCB1J3gnKSwKICAgICgweDI0RTgsICdNJywgdSd5JyksCiAgICAoMHgyNEU5LCAnTScsIHUneicpLAogICAgKDB4MjRFQSwgJ00nLCB1JzAnKSwKICAgICgweDI0RUIsICdWJyksCiAgICAoMHgyNzAwLCAnWCcpLAogICAgKDB4MjcwMSwgJ1YnKSwKICAgICgweDJBMEMsICdNJywgdSfiiKviiKviiKviiKsnKSwKICAgICgweDJBMEQsICdWJyksCiAgICAoMHgyQTc0LCAnMycsIHUnOjo9JyksCiAgICAoMHgyQTc1LCAnMycsIHUnPT0nKSwKICAgICgweDJBNzYsICczJywgdSc9PT0nKSwKICAgICgweDJBNzcsICdWJyksCiAgICAoMHgyQURDLCAnTScsIHUn4qudzLgnKSwKICAgICgweDJBREQsICdWJyksCiAgICAoMHgyQjRELCAnWCcpLAogICAgKDB4MkI1MCwgJ1YnKSwKICAgICgweDJCNUEsICdYJyksCiAgICAoMHgyQzAwLCAnTScsIHUn4rCwJyksCiAgICAoMHgyQzAxLCAnTScsIHUn4rCxJyksCiAgICAoMHgyQzAyLCAnTScsIHUn4rCyJyksCiAgICAoMHgyQzAzLCAnTScsIHUn4rCzJyksCiAgICAoMHgyQzA0LCAnTScsIHUn4rC0JyksCiAgICAoMHgyQzA1LCAnTScsIHUn4rC1JyksCiAgICAoMHgyQzA2LCAnTScsIHUn4rC2JyksCiAgICAoMHgyQzA3LCAnTScsIHUn4rC3JyksCiAgICAoMHgyQzA4LCAnTScsIHUn4rC4JyksCiAgICAoMHgyQzA5LCAnTScsIHUn4rC5JyksCiAgICAoMHgyQzBBLCAnTScsIHUn4rC6JyksCiAgICAoMHgyQzBCLCAnTScsIHUn4rC7JyksCiAgICAoMHgyQzBDLCAnTScsIHUn4rC8JyksCiAgICAoMHgyQzBELCAnTScsIHUn4rC9JyksCiAgICAoMHgyQzBFLCAnTScsIHUn4rC+JyksCiAgICAoMHgyQzBGLCAnTScsIHUn4rC/JyksCiAgICAoMHgyQzEwLCAnTScsIHUn4rGAJyksCiAgICAoMHgyQzExLCAnTScsIHUn4rGBJyksCiAgICAoMHgyQzEyLCAnTScsIHUn4rGCJyksCiAgICAoMHgyQzEzLCAnTScsIHUn4rGDJyksCiAgICAoMHgyQzE0LCAnTScsIHUn4rGEJyksCiAgICAoMHgyQzE1LCAnTScsIHUn4rGFJyksCiAgICAoMHgyQzE2LCAnTScsIHUn4rGGJyksCiAgICAoMHgyQzE3LCAnTScsIHUn4rGHJyksCiAgICAoMHgyQzE4LCAnTScsIHUn4rGIJyksCiAgICAoMHgyQzE5LCAnTScsIHUn4rGJJyksCiAgICAoMHgyQzFBLCAnTScsIHUn4rGKJyksCiAgICAoMHgyQzFCLCAnTScsIHUn4rGLJyksCiAgICAoMHgyQzFDLCAnTScsIHUn4rGMJyksCiAgICAoMHgyQzFELCAnTScsIHUn4rGNJyksCiAgICAoMHgyQzFFLCAnTScsIHUn4rGOJyksCiAgICAoMHgyQzFGLCAnTScsIHUn4rGPJyksCiAgICAoMHgyQzIwLCAnTScsIHUn4rGQJyksCiAgICAoMHgyQzIxLCAnTScsIHUn4rGRJyksCiAgICAoMHgyQzIyLCAnTScsIHUn4rGSJyksCiAgICAoMHgyQzIzLCAnTScsIHUn4rGTJyksCiAgICAoMHgyQzI0LCAnTScsIHUn4rGUJyksCiAgICAoMHgyQzI1LCAnTScsIHUn4rGVJyksCiAgICAoMHgyQzI2LCAnTScsIHUn4rGWJyksCiAgICAoMHgyQzI3LCAnTScsIHUn4rGXJyksCiAgICAoMHgyQzI4LCAnTScsIHUn4rGYJyksCiAgICAoMHgyQzI5LCAnTScsIHUn4rGZJyksCiAgICAoMHgyQzJBLCAnTScsIHUn4rGaJyksCiAgICAoMHgyQzJCLCAnTScsIHUn4rGbJyksCiAgICAoMHgyQzJDLCAnTScsIHUn4rGcJyksCiAgICAoMHgyQzJELCAnTScsIHUn4rGdJyksCiAgICAoMHgyQzJFLCAnTScsIHUn4rGeJyksCiAgICAoMHgyQzJGLCAnWCcpLAogICAgKDB4MkMzMCwgJ1YnKSwKICAgICgweDJDNUYsICdYJyksCiAgICAoMHgyQzYwLCAnTScsIHUn4rGhJyksCiAgICAoMHgyQzYxLCAnVicpLAogICAgKDB4MkM2MiwgJ00nLCB1J8mrJyksCiAgICAoMHgyQzYzLCAnTScsIHUn4bW9JyksCiAgICAoMHgyQzY0LCAnTScsIHUnyb0nKSwKICAgICgweDJDNjUsICdWJyksCiAgICAoMHgyQzY3LCAnTScsIHUn4rGoJyksCiAgICAoMHgyQzY4LCAnVicpLAogICAgKDB4MkM2OSwgJ00nLCB1J+KxqicpLAogICAgKDB4MkM2QSwgJ1YnKSwKICAgICgweDJDNkIsICdNJywgdSfisawnKSwKICAgICgweDJDNkMsICdWJyksCiAgICAoMHgyQzZELCAnTScsIHUnyZEnKSwKICAgICgweDJDNkUsICdNJywgdSfJsScpLAogICAgKDB4MkM2RiwgJ00nLCB1J8mQJyksCiAgICAoMHgyQzcwLCAnTScsIHUnyZInKSwKICAgICgweDJDNzEsICdWJyksCiAgICAoMHgyQzcyLCAnTScsIHUn4rGzJyksCiAgICAoMHgyQzczLCAnVicpLAogICAgKDB4MkM3NSwgJ00nLCB1J+KxticpLAogICAgKDB4MkM3NiwgJ1YnKSwKICAgICgweDJDN0MsICdNJywgdSdqJyksCiAgICAoMHgyQzdELCAnTScsIHUndicpLAogICAgKDB4MkM3RSwgJ00nLCB1J8i/JyksCiAgICAoMHgyQzdGLCAnTScsIHUnyYAnKSwKICAgICgweDJDODAsICdNJywgdSfisoEnKSwKICAgICgweDJDODEsICdWJyksCiAgICAoMHgyQzgyLCAnTScsIHUn4rKDJyksCiAgICBdCgpkZWYgX3NlZ18yNSgpOgogICAgcmV0dXJuIFsKICAgICgweDJDODMsICdWJyksCiAgICAoMHgyQzg0LCAnTScsIHUn4rKFJyksCiAgICAoMHgyQzg1LCAnVicpLAogICAgKDB4MkM4NiwgJ00nLCB1J+KyhycpLAogICAgKDB4MkM4NywgJ1YnKSwKICAgICgweDJDODgsICdNJywgdSfisoknKSwKICAgICgweDJDODksICdWJyksCiAgICAoMHgyQzhBLCAnTScsIHUn4rKLJyksCiAgICAoMHgyQzhCLCAnVicpLAogICAgKDB4MkM4QywgJ00nLCB1J+KyjScpLAogICAgKDB4MkM4RCwgJ1YnKSwKICAgICgweDJDOEUsICdNJywgdSfiso8nKSwKICAgICgweDJDOEYsICdWJyksCiAgICAoMHgyQzkwLCAnTScsIHUn4rKRJyksCiAgICAoMHgyQzkxLCAnVicpLAogICAgKDB4MkM5MiwgJ00nLCB1J+KykycpLAogICAgKDB4MkM5MywgJ1YnKSwKICAgICgweDJDOTQsICdNJywgdSfispUnKSwKICAgICgweDJDOTUsICdWJyksCiAgICAoMHgyQzk2LCAnTScsIHUn4rKXJyksCiAgICAoMHgyQzk3LCAnVicpLAogICAgKDB4MkM5OCwgJ00nLCB1J+KymScpLAogICAgKDB4MkM5OSwgJ1YnKSwKICAgICgweDJDOUEsICdNJywgdSfispsnKSwKICAgICgweDJDOUIsICdWJyksCiAgICAoMHgyQzlDLCAnTScsIHUn4rKdJyksCiAgICAoMHgyQzlELCAnVicpLAogICAgKDB4MkM5RSwgJ00nLCB1J+KynycpLAogICAgKDB4MkM5RiwgJ1YnKSwKICAgICgweDJDQTAsICdNJywgdSfisqEnKSwKICAgICgweDJDQTEsICdWJyksCiAgICAoMHgyQ0EyLCAnTScsIHUn4rKjJyksCiAgICAoMHgyQ0EzLCAnVicpLAogICAgKDB4MkNBNCwgJ00nLCB1J+KypScpLAogICAgKDB4MkNBNSwgJ1YnKSwKICAgICgweDJDQTYsICdNJywgdSfisqcnKSwKICAgICgweDJDQTcsICdWJyksCiAgICAoMHgyQ0E4LCAnTScsIHUn4rKpJyksCiAgICAoMHgyQ0E5LCAnVicpLAogICAgKDB4MkNBQSwgJ00nLCB1J+KyqycpLAogICAgKDB4MkNBQiwgJ1YnKSwKICAgICgweDJDQUMsICdNJywgdSfisq0nKSwKICAgICgweDJDQUQsICdWJyksCiAgICAoMHgyQ0FFLCAnTScsIHUn4rKvJyksCiAgICAoMHgyQ0FGLCAnVicpLAogICAgKDB4MkNCMCwgJ00nLCB1J+KysScpLAogICAgKDB4MkNCMSwgJ1YnKSwKICAgICgweDJDQjIsICdNJywgdSfisrMnKSwKICAgICgweDJDQjMsICdWJyksCiAgICAoMHgyQ0I0LCAnTScsIHUn4rK1JyksCiAgICAoMHgyQ0I1LCAnVicpLAogICAgKDB4MkNCNiwgJ00nLCB1J+KytycpLAogICAgKDB4MkNCNywgJ1YnKSwKICAgICgweDJDQjgsICdNJywgdSfisrknKSwKICAgICgweDJDQjksICdWJyksCiAgICAoMHgyQ0JBLCAnTScsIHUn4rK7JyksCiAgICAoMHgyQ0JCLCAnVicpLAogICAgKDB4MkNCQywgJ00nLCB1J+KyvScpLAogICAgKDB4MkNCRCwgJ1YnKSwKICAgICgweDJDQkUsICdNJywgdSfisr8nKSwKICAgICgweDJDQkYsICdWJyksCiAgICAoMHgyQ0MwLCAnTScsIHUn4rOBJyksCiAgICAoMHgyQ0MxLCAnVicpLAogICAgKDB4MkNDMiwgJ00nLCB1J+KzgycpLAogICAgKDB4MkNDMywgJ1YnKSwKICAgICgweDJDQzQsICdNJywgdSfis4UnKSwKICAgICgweDJDQzUsICdWJyksCiAgICAoMHgyQ0M2LCAnTScsIHUn4rOHJyksCiAgICAoMHgyQ0M3LCAnVicpLAogICAgKDB4MkNDOCwgJ00nLCB1J+KziScpLAogICAgKDB4MkNDOSwgJ1YnKSwKICAgICgweDJDQ0EsICdNJywgdSfis4snKSwKICAgICgweDJDQ0IsICdWJyksCiAgICAoMHgyQ0NDLCAnTScsIHUn4rONJyksCiAgICAoMHgyQ0NELCAnVicpLAogICAgKDB4MkNDRSwgJ00nLCB1J+KzjycpLAogICAgKDB4MkNDRiwgJ1YnKSwKICAgICgweDJDRDAsICdNJywgdSfis5EnKSwKICAgICgweDJDRDEsICdWJyksCiAgICAoMHgyQ0QyLCAnTScsIHUn4rOTJyksCiAgICAoMHgyQ0QzLCAnVicpLAogICAgKDB4MkNENCwgJ00nLCB1J+KzlScpLAogICAgKDB4MkNENSwgJ1YnKSwKICAgICgweDJDRDYsICdNJywgdSfis5cnKSwKICAgICgweDJDRDcsICdWJyksCiAgICAoMHgyQ0Q4LCAnTScsIHUn4rOZJyksCiAgICAoMHgyQ0Q5LCAnVicpLAogICAgKDB4MkNEQSwgJ00nLCB1J+KzmycpLAogICAgKDB4MkNEQiwgJ1YnKSwKICAgICgweDJDREMsICdNJywgdSfis50nKSwKICAgICgweDJDREQsICdWJyksCiAgICAoMHgyQ0RFLCAnTScsIHUn4rOfJyksCiAgICAoMHgyQ0RGLCAnVicpLAogICAgKDB4MkNFMCwgJ00nLCB1J+KzoScpLAogICAgKDB4MkNFMSwgJ1YnKSwKICAgICgweDJDRTIsICdNJywgdSfis6MnKSwKICAgICgweDJDRTMsICdWJyksCiAgICAoMHgyQ0VCLCAnTScsIHUn4rOsJyksCiAgICAoMHgyQ0VDLCAnVicpLAogICAgKDB4MkNFRCwgJ00nLCB1J+KzricpLAogICAgXQoKZGVmIF9zZWdfMjYoKToKICAgIHJldHVybiBbCiAgICAoMHgyQ0VFLCAnVicpLAogICAgKDB4MkNGMiwgJ00nLCB1J+KzsycpLAogICAgKDB4MkNGMywgJ1YnKSwKICAgICgweDJDRjQsICdYJyksCiAgICAoMHgyQ0Y5LCAnVicpLAogICAgKDB4MkQyNiwgJ1gnKSwKICAgICgweDJEMjcsICdWJyksCiAgICAoMHgyRDI4LCAnWCcpLAogICAgKDB4MkQyRCwgJ1YnKSwKICAgICgweDJEMkUsICdYJyksCiAgICAoMHgyRDMwLCAnVicpLAogICAgKDB4MkQ2OCwgJ1gnKSwKICAgICgweDJENkYsICdNJywgdSfitaEnKSwKICAgICgweDJENzAsICdWJyksCiAgICAoMHgyRDcxLCAnWCcpLAogICAgKDB4MkQ3RiwgJ1YnKSwKICAgICgweDJEOTcsICdYJyksCiAgICAoMHgyREEwLCAnVicpLAogICAgKDB4MkRBNywgJ1gnKSwKICAgICgweDJEQTgsICdWJyksCiAgICAoMHgyREFGLCAnWCcpLAogICAgKDB4MkRCMCwgJ1YnKSwKICAgICgweDJEQjcsICdYJyksCiAgICAoMHgyREI4LCAnVicpLAogICAgKDB4MkRCRiwgJ1gnKSwKICAgICgweDJEQzAsICdWJyksCiAgICAoMHgyREM3LCAnWCcpLAogICAgKDB4MkRDOCwgJ1YnKSwKICAgICgweDJEQ0YsICdYJyksCiAgICAoMHgyREQwLCAnVicpLAogICAgKDB4MkRENywgJ1gnKSwKICAgICgweDJERDgsICdWJyksCiAgICAoMHgyRERGLCAnWCcpLAogICAgKDB4MkRFMCwgJ1YnKSwKICAgICgweDJFM0MsICdYJyksCiAgICAoMHgyRTgwLCAnVicpLAogICAgKDB4MkU5QSwgJ1gnKSwKICAgICgweDJFOUIsICdWJyksCiAgICAoMHgyRTlGLCAnTScsIHUn5q+NJyksCiAgICAoMHgyRUEwLCAnVicpLAogICAgKDB4MkVGMywgJ00nLCB1J+m+nycpLAogICAgKDB4MkVGNCwgJ1gnKSwKICAgICgweDJGMDAsICdNJywgdSfkuIAnKSwKICAgICgweDJGMDEsICdNJywgdSfkuKgnKSwKICAgICgweDJGMDIsICdNJywgdSfkuLYnKSwKICAgICgweDJGMDMsICdNJywgdSfkuL8nKSwKICAgICgweDJGMDQsICdNJywgdSfkuZknKSwKICAgICgweDJGMDUsICdNJywgdSfkuoUnKSwKICAgICgweDJGMDYsICdNJywgdSfkuownKSwKICAgICgweDJGMDcsICdNJywgdSfkuqAnKSwKICAgICgweDJGMDgsICdNJywgdSfkuronKSwKICAgICgweDJGMDksICdNJywgdSflhL8nKSwKICAgICgweDJGMEEsICdNJywgdSflhaUnKSwKICAgICgweDJGMEIsICdNJywgdSflhasnKSwKICAgICgweDJGMEMsICdNJywgdSflhoInKSwKICAgICgweDJGMEQsICdNJywgdSflhpYnKSwKICAgICgweDJGMEUsICdNJywgdSflhqsnKSwKICAgICgweDJGMEYsICdNJywgdSflh6AnKSwKICAgICgweDJGMTAsICdNJywgdSflh7UnKSwKICAgICgweDJGMTEsICdNJywgdSfliIAnKSwKICAgICgweDJGMTIsICdNJywgdSflipsnKSwKICAgICgweDJGMTMsICdNJywgdSfli7knKSwKICAgICgweDJGMTQsICdNJywgdSfljJUnKSwKICAgICgweDJGMTUsICdNJywgdSfljJonKSwKICAgICgweDJGMTYsICdNJywgdSfljLgnKSwKICAgICgweDJGMTcsICdNJywgdSfljYEnKSwKICAgICgweDJGMTgsICdNJywgdSfljZwnKSwKICAgICgweDJGMTksICdNJywgdSfljaknKSwKICAgICgweDJGMUEsICdNJywgdSfljoInKSwKICAgICgweDJGMUIsICdNJywgdSfljrYnKSwKICAgICgweDJGMUMsICdNJywgdSflj4gnKSwKICAgICgweDJGMUQsICdNJywgdSflj6MnKSwKICAgICgweDJGMUUsICdNJywgdSflm5cnKSwKICAgICgweDJGMUYsICdNJywgdSflnJ8nKSwKICAgICgweDJGMjAsICdNJywgdSflo6snKSwKICAgICgweDJGMjEsICdNJywgdSflpIInKSwKICAgICgweDJGMjIsICdNJywgdSflpIonKSwKICAgICgweDJGMjMsICdNJywgdSflpJUnKSwKICAgICgweDJGMjQsICdNJywgdSflpKcnKSwKICAgICgweDJGMjUsICdNJywgdSflpbMnKSwKICAgICgweDJGMjYsICdNJywgdSflrZAnKSwKICAgICgweDJGMjcsICdNJywgdSflroAnKSwKICAgICgweDJGMjgsICdNJywgdSflr7gnKSwKICAgICgweDJGMjksICdNJywgdSflsI8nKSwKICAgICgweDJGMkEsICdNJywgdSflsKInKSwKICAgICgweDJGMkIsICdNJywgdSflsLgnKSwKICAgICgweDJGMkMsICdNJywgdSflsa4nKSwKICAgICgweDJGMkQsICdNJywgdSflsbEnKSwKICAgICgweDJGMkUsICdNJywgdSflt5snKSwKICAgICgweDJGMkYsICdNJywgdSflt6UnKSwKICAgICgweDJGMzAsICdNJywgdSflt7EnKSwKICAgICgweDJGMzEsICdNJywgdSflt74nKSwKICAgICgweDJGMzIsICdNJywgdSflubInKSwKICAgICgweDJGMzMsICdNJywgdSflubonKSwKICAgICgweDJGMzQsICdNJywgdSflub8nKSwKICAgICgweDJGMzUsICdNJywgdSflu7QnKSwKICAgICgweDJGMzYsICdNJywgdSflu74nKSwKICAgICgweDJGMzcsICdNJywgdSflvIsnKSwKICAgICgweDJGMzgsICdNJywgdSflvJMnKSwKICAgICgweDJGMzksICdNJywgdSflvZAnKSwKICAgIF0KCmRlZiBfc2VnXzI3KCk6CiAgICByZXR1cm4gWwogICAgKDB4MkYzQSwgJ00nLCB1J+W9oScpLAogICAgKDB4MkYzQiwgJ00nLCB1J+W9sycpLAogICAgKDB4MkYzQywgJ00nLCB1J+W/gycpLAogICAgKDB4MkYzRCwgJ00nLCB1J+aIiCcpLAogICAgKDB4MkYzRSwgJ00nLCB1J+aIticpLAogICAgKDB4MkYzRiwgJ00nLCB1J+aJiycpLAogICAgKDB4MkY0MCwgJ00nLCB1J+aUrycpLAogICAgKDB4MkY0MSwgJ00nLCB1J+aUtCcpLAogICAgKDB4MkY0MiwgJ00nLCB1J+aWhycpLAogICAgKDB4MkY0MywgJ00nLCB1J+aWlycpLAogICAgKDB4MkY0NCwgJ00nLCB1J+aWpCcpLAogICAgKDB4MkY0NSwgJ00nLCB1J+aWuScpLAogICAgKDB4MkY0NiwgJ00nLCB1J+aXoCcpLAogICAgKDB4MkY0NywgJ00nLCB1J+aXpScpLAogICAgKDB4MkY0OCwgJ00nLCB1J+absCcpLAogICAgKDB4MkY0OSwgJ00nLCB1J+aciCcpLAogICAgKDB4MkY0QSwgJ00nLCB1J+acqCcpLAogICAgKDB4MkY0QiwgJ00nLCB1J+asoCcpLAogICAgKDB4MkY0QywgJ00nLCB1J+atoicpLAogICAgKDB4MkY0RCwgJ00nLCB1J+atuScpLAogICAgKDB4MkY0RSwgJ00nLCB1J+ausycpLAogICAgKDB4MkY0RiwgJ00nLCB1J+aviycpLAogICAgKDB4MkY1MCwgJ00nLCB1J+avlCcpLAogICAgKDB4MkY1MSwgJ00nLCB1J+avmycpLAogICAgKDB4MkY1MiwgJ00nLCB1J+awjycpLAogICAgKDB4MkY1MywgJ00nLCB1J+awlCcpLAogICAgKDB4MkY1NCwgJ00nLCB1J+awtCcpLAogICAgKDB4MkY1NSwgJ00nLCB1J+eBqycpLAogICAgKDB4MkY1NiwgJ00nLCB1J+eIqicpLAogICAgKDB4MkY1NywgJ00nLCB1J+eIticpLAogICAgKDB4MkY1OCwgJ00nLCB1J+eIuycpLAogICAgKDB4MkY1OSwgJ00nLCB1J+eIvycpLAogICAgKDB4MkY1QSwgJ00nLCB1J+eJhycpLAogICAgKDB4MkY1QiwgJ00nLCB1J+eJmScpLAogICAgKDB4MkY1QywgJ00nLCB1J+eJmycpLAogICAgKDB4MkY1RCwgJ00nLCB1J+eKrCcpLAogICAgKDB4MkY1RSwgJ00nLCB1J+eOhCcpLAogICAgKDB4MkY1RiwgJ00nLCB1J+eOiScpLAogICAgKDB4MkY2MCwgJ00nLCB1J+eTnCcpLAogICAgKDB4MkY2MSwgJ00nLCB1J+eTpicpLAogICAgKDB4MkY2MiwgJ00nLCB1J+eUmCcpLAogICAgKDB4MkY2MywgJ00nLCB1J+eUnycpLAogICAgKDB4MkY2NCwgJ00nLCB1J+eUqCcpLAogICAgKDB4MkY2NSwgJ00nLCB1J+eUsCcpLAogICAgKDB4MkY2NiwgJ00nLCB1J+eWiycpLAogICAgKDB4MkY2NywgJ00nLCB1J+eWkicpLAogICAgKDB4MkY2OCwgJ00nLCB1J+eZticpLAogICAgKDB4MkY2OSwgJ00nLCB1J+eZvScpLAogICAgKDB4MkY2QSwgJ00nLCB1J+earicpLAogICAgKDB4MkY2QiwgJ00nLCB1J+eavycpLAogICAgKDB4MkY2QywgJ00nLCB1J+ebricpLAogICAgKDB4MkY2RCwgJ00nLCB1J+efmycpLAogICAgKDB4MkY2RSwgJ00nLCB1J+efoicpLAogICAgKDB4MkY2RiwgJ00nLCB1J+efsycpLAogICAgKDB4MkY3MCwgJ00nLCB1J+ekuicpLAogICAgKDB4MkY3MSwgJ00nLCB1J+emuCcpLAogICAgKDB4MkY3MiwgJ00nLCB1J+emvicpLAogICAgKDB4MkY3MywgJ00nLCB1J+eptCcpLAogICAgKDB4MkY3NCwgJ00nLCB1J+eriycpLAogICAgKDB4MkY3NSwgJ00nLCB1J+eruScpLAogICAgKDB4MkY3NiwgJ00nLCB1J+exsycpLAogICAgKDB4MkY3NywgJ00nLCB1J+ezuCcpLAogICAgKDB4MkY3OCwgJ00nLCB1J+e8ticpLAogICAgKDB4MkY3OSwgJ00nLCB1J+e9kScpLAogICAgKDB4MkY3QSwgJ00nLCB1J+e+iicpLAogICAgKDB4MkY3QiwgJ00nLCB1J+e+vScpLAogICAgKDB4MkY3QywgJ00nLCB1J+iAgScpLAogICAgKDB4MkY3RCwgJ00nLCB1J+iAjCcpLAogICAgKDB4MkY3RSwgJ00nLCB1J+iAkicpLAogICAgKDB4MkY3RiwgJ00nLCB1J+iAsycpLAogICAgKDB4MkY4MCwgJ00nLCB1J+iBvycpLAogICAgKDB4MkY4MSwgJ00nLCB1J+iCiScpLAogICAgKDB4MkY4MiwgJ00nLCB1J+iHoycpLAogICAgKDB4MkY4MywgJ00nLCB1J+iHqicpLAogICAgKDB4MkY4NCwgJ00nLCB1J+iHsycpLAogICAgKDB4MkY4NSwgJ00nLCB1J+iHvCcpLAogICAgKDB4MkY4NiwgJ00nLCB1J+iIjCcpLAogICAgKDB4MkY4NywgJ00nLCB1J+iImycpLAogICAgKDB4MkY4OCwgJ00nLCB1J+iInycpLAogICAgKDB4MkY4OSwgJ00nLCB1J+iJricpLAogICAgKDB4MkY4QSwgJ00nLCB1J+iJsicpLAogICAgKDB4MkY4QiwgJ00nLCB1J+iJuCcpLAogICAgKDB4MkY4QywgJ00nLCB1J+iZjScpLAogICAgKDB4MkY4RCwgJ00nLCB1J+iZqycpLAogICAgKDB4MkY4RSwgJ00nLCB1J+ihgCcpLAogICAgKDB4MkY4RiwgJ00nLCB1J+ihjCcpLAogICAgKDB4MkY5MCwgJ00nLCB1J+ihoycpLAogICAgKDB4MkY5MSwgJ00nLCB1J+ilvicpLAogICAgKDB4MkY5MiwgJ00nLCB1J+imiycpLAogICAgKDB4MkY5MywgJ00nLCB1J+inkicpLAogICAgKDB4MkY5NCwgJ00nLCB1J+iogCcpLAogICAgKDB4MkY5NSwgJ00nLCB1J+iwtycpLAogICAgKDB4MkY5NiwgJ00nLCB1J+ixhicpLAogICAgKDB4MkY5NywgJ00nLCB1J+ixlScpLAogICAgKDB4MkY5OCwgJ00nLCB1J+ixuCcpLAogICAgKDB4MkY5OSwgJ00nLCB1J+iynScpLAogICAgKDB4MkY5QSwgJ00nLCB1J+i1pCcpLAogICAgKDB4MkY5QiwgJ00nLCB1J+i1sCcpLAogICAgKDB4MkY5QywgJ00nLCB1J+i2sycpLAogICAgKDB4MkY5RCwgJ00nLCB1J+i6qycpLAogICAgXQoKZGVmIF9zZWdfMjgoKToKICAgIHJldHVybiBbCiAgICAoMHgyRjlFLCAnTScsIHUn6LuKJyksCiAgICAoMHgyRjlGLCAnTScsIHUn6L6bJyksCiAgICAoMHgyRkEwLCAnTScsIHUn6L6wJyksCiAgICAoMHgyRkExLCAnTScsIHUn6L61JyksCiAgICAoMHgyRkEyLCAnTScsIHUn6YKRJyksCiAgICAoMHgyRkEzLCAnTScsIHUn6YWJJyksCiAgICAoMHgyRkE0LCAnTScsIHUn6YeGJyksCiAgICAoMHgyRkE1LCAnTScsIHUn6YeMJyksCiAgICAoMHgyRkE2LCAnTScsIHUn6YeRJyksCiAgICAoMHgyRkE3LCAnTScsIHUn6ZW3JyksCiAgICAoMHgyRkE4LCAnTScsIHUn6ZaAJyksCiAgICAoMHgyRkE5LCAnTScsIHUn6ZicJyksCiAgICAoMHgyRkFBLCAnTScsIHUn6Zq2JyksCiAgICAoMHgyRkFCLCAnTScsIHUn6Zq5JyksCiAgICAoMHgyRkFDLCAnTScsIHUn6ZuoJyksCiAgICAoMHgyRkFELCAnTScsIHUn6Z2RJyksCiAgICAoMHgyRkFFLCAnTScsIHUn6Z2eJyksCiAgICAoMHgyRkFGLCAnTScsIHUn6Z2iJyksCiAgICAoMHgyRkIwLCAnTScsIHUn6Z2pJyksCiAgICAoMHgyRkIxLCAnTScsIHUn6Z+LJyksCiAgICAoMHgyRkIyLCAnTScsIHUn6Z+tJyksCiAgICAoMHgyRkIzLCAnTScsIHUn6Z+zJyksCiAgICAoMHgyRkI0LCAnTScsIHUn6aCBJyksCiAgICAoMHgyRkI1LCAnTScsIHUn6aKoJyksCiAgICAoMHgyRkI2LCAnTScsIHUn6aObJyksCiAgICAoMHgyRkI3LCAnTScsIHUn6aOfJyksCiAgICAoMHgyRkI4LCAnTScsIHUn6aaWJyksCiAgICAoMHgyRkI5LCAnTScsIHUn6aaZJyksCiAgICAoMHgyRkJBLCAnTScsIHUn6aasJyksCiAgICAoMHgyRkJCLCAnTScsIHUn6aqoJyksCiAgICAoMHgyRkJDLCAnTScsIHUn6auYJyksCiAgICAoMHgyRkJELCAnTScsIHUn6aufJyksCiAgICAoMHgyRkJFLCAnTScsIHUn6aylJyksCiAgICAoMHgyRkJGLCAnTScsIHUn6ayvJyksCiAgICAoMHgyRkMwLCAnTScsIHUn6ayyJyksCiAgICAoMHgyRkMxLCAnTScsIHUn6ay8JyksCiAgICAoMHgyRkMyLCAnTScsIHUn6a2aJyksCiAgICAoMHgyRkMzLCAnTScsIHUn6bOlJyksCiAgICAoMHgyRkM0LCAnTScsIHUn6bm1JyksCiAgICAoMHgyRkM1LCAnTScsIHUn6bm/JyksCiAgICAoMHgyRkM2LCAnTScsIHUn6bqlJyksCiAgICAoMHgyRkM3LCAnTScsIHUn6bq7JyksCiAgICAoMHgyRkM4LCAnTScsIHUn6buDJyksCiAgICAoMHgyRkM5LCAnTScsIHUn6buNJyksCiAgICAoMHgyRkNBLCAnTScsIHUn6buRJyksCiAgICAoMHgyRkNCLCAnTScsIHUn6bu5JyksCiAgICAoMHgyRkNDLCAnTScsIHUn6bu9JyksCiAgICAoMHgyRkNELCAnTScsIHUn6byOJyksCiAgICAoMHgyRkNFLCAnTScsIHUn6byTJyksCiAgICAoMHgyRkNGLCAnTScsIHUn6bygJyksCiAgICAoMHgyRkQwLCAnTScsIHUn6by7JyksCiAgICAoMHgyRkQxLCAnTScsIHUn6b2KJyksCiAgICAoMHgyRkQyLCAnTScsIHUn6b2SJyksCiAgICAoMHgyRkQzLCAnTScsIHUn6b6NJyksCiAgICAoMHgyRkQ0LCAnTScsIHUn6b6cJyksCiAgICAoMHgyRkQ1LCAnTScsIHUn6b6gJyksCiAgICAoMHgyRkQ2LCAnWCcpLAogICAgKDB4MzAwMCwgJzMnLCB1JyAnKSwKICAgICgweDMwMDEsICdWJyksCiAgICAoMHgzMDAyLCAnTScsIHUnLicpLAogICAgKDB4MzAwMywgJ1YnKSwKICAgICgweDMwMzYsICdNJywgdSfjgJInKSwKICAgICgweDMwMzcsICdWJyksCiAgICAoMHgzMDM4LCAnTScsIHUn5Y2BJyksCiAgICAoMHgzMDM5LCAnTScsIHUn5Y2EJyksCiAgICAoMHgzMDNBLCAnTScsIHUn5Y2FJyksCiAgICAoMHgzMDNCLCAnVicpLAogICAgKDB4MzA0MCwgJ1gnKSwKICAgICgweDMwNDEsICdWJyksCiAgICAoMHgzMDk3LCAnWCcpLAogICAgKDB4MzA5OSwgJ1YnKSwKICAgICgweDMwOUIsICczJywgdScg44KZJyksCiAgICAoMHgzMDlDLCAnMycsIHUnIOOCmicpLAogICAgKDB4MzA5RCwgJ1YnKSwKICAgICgweDMwOUYsICdNJywgdSfjgojjgoonKSwKICAgICgweDMwQTAsICdWJyksCiAgICAoMHgzMEZGLCAnTScsIHUn44Kz44OIJyksCiAgICAoMHgzMTAwLCAnWCcpLAogICAgKDB4MzEwNSwgJ1YnKSwKICAgICgweDMxMkUsICdYJyksCiAgICAoMHgzMTMxLCAnTScsIHUn4YSAJyksCiAgICAoMHgzMTMyLCAnTScsIHUn4YSBJyksCiAgICAoMHgzMTMzLCAnTScsIHUn4YaqJyksCiAgICAoMHgzMTM0LCAnTScsIHUn4YSCJyksCiAgICAoMHgzMTM1LCAnTScsIHUn4YasJyksCiAgICAoMHgzMTM2LCAnTScsIHUn4YatJyksCiAgICAoMHgzMTM3LCAnTScsIHUn4YSDJyksCiAgICAoMHgzMTM4LCAnTScsIHUn4YSEJyksCiAgICAoMHgzMTM5LCAnTScsIHUn4YSFJyksCiAgICAoMHgzMTNBLCAnTScsIHUn4YawJyksCiAgICAoMHgzMTNCLCAnTScsIHUn4YaxJyksCiAgICAoMHgzMTNDLCAnTScsIHUn4YayJyksCiAgICAoMHgzMTNELCAnTScsIHUn4YazJyksCiAgICAoMHgzMTNFLCAnTScsIHUn4Ya0JyksCiAgICAoMHgzMTNGLCAnTScsIHUn4Ya1JyksCiAgICAoMHgzMTQwLCAnTScsIHUn4YSaJyksCiAgICAoMHgzMTQxLCAnTScsIHUn4YSGJyksCiAgICAoMHgzMTQyLCAnTScsIHUn4YSHJyksCiAgICAoMHgzMTQzLCAnTScsIHUn4YSIJyksCiAgICAoMHgzMTQ0LCAnTScsIHUn4YShJyksCiAgICBdCgpkZWYgX3NlZ18yOSgpOgogICAgcmV0dXJuIFsKICAgICgweDMxNDUsICdNJywgdSfhhIknKSwKICAgICgweDMxNDYsICdNJywgdSfhhIonKSwKICAgICgweDMxNDcsICdNJywgdSfhhIsnKSwKICAgICgweDMxNDgsICdNJywgdSfhhIwnKSwKICAgICgweDMxNDksICdNJywgdSfhhI0nKSwKICAgICgweDMxNEEsICdNJywgdSfhhI4nKSwKICAgICgweDMxNEIsICdNJywgdSfhhI8nKSwKICAgICgweDMxNEMsICdNJywgdSfhhJAnKSwKICAgICgweDMxNEQsICdNJywgdSfhhJEnKSwKICAgICgweDMxNEUsICdNJywgdSfhhJInKSwKICAgICgweDMxNEYsICdNJywgdSfhhaEnKSwKICAgICgweDMxNTAsICdNJywgdSfhhaInKSwKICAgICgweDMxNTEsICdNJywgdSfhhaMnKSwKICAgICgweDMxNTIsICdNJywgdSfhhaQnKSwKICAgICgweDMxNTMsICdNJywgdSfhhaUnKSwKICAgICgweDMxNTQsICdNJywgdSfhhaYnKSwKICAgICgweDMxNTUsICdNJywgdSfhhacnKSwKICAgICgweDMxNTYsICdNJywgdSfhhagnKSwKICAgICgweDMxNTcsICdNJywgdSfhhaknKSwKICAgICgweDMxNTgsICdNJywgdSfhhaonKSwKICAgICgweDMxNTksICdNJywgdSfhhasnKSwKICAgICgweDMxNUEsICdNJywgdSfhhawnKSwKICAgICgweDMxNUIsICdNJywgdSfhha0nKSwKICAgICgweDMxNUMsICdNJywgdSfhha4nKSwKICAgICgweDMxNUQsICdNJywgdSfhha8nKSwKICAgICgweDMxNUUsICdNJywgdSfhhbAnKSwKICAgICgweDMxNUYsICdNJywgdSfhhbEnKSwKICAgICgweDMxNjAsICdNJywgdSfhhbInKSwKICAgICgweDMxNjEsICdNJywgdSfhhbMnKSwKICAgICgweDMxNjIsICdNJywgdSfhhbQnKSwKICAgICgweDMxNjMsICdNJywgdSfhhbUnKSwKICAgICgweDMxNjQsICdYJyksCiAgICAoMHgzMTY1LCAnTScsIHUn4YSUJyksCiAgICAoMHgzMTY2LCAnTScsIHUn4YSVJyksCiAgICAoMHgzMTY3LCAnTScsIHUn4YeHJyksCiAgICAoMHgzMTY4LCAnTScsIHUn4YeIJyksCiAgICAoMHgzMTY5LCAnTScsIHUn4YeMJyksCiAgICAoMHgzMTZBLCAnTScsIHUn4YeOJyksCiAgICAoMHgzMTZCLCAnTScsIHUn4YeTJyksCiAgICAoMHgzMTZDLCAnTScsIHUn4YeXJyksCiAgICAoMHgzMTZELCAnTScsIHUn4YeZJyksCiAgICAoMHgzMTZFLCAnTScsIHUn4YScJyksCiAgICAoMHgzMTZGLCAnTScsIHUn4YedJyksCiAgICAoMHgzMTcwLCAnTScsIHUn4YefJyksCiAgICAoMHgzMTcxLCAnTScsIHUn4YSdJyksCiAgICAoMHgzMTcyLCAnTScsIHUn4YSeJyksCiAgICAoMHgzMTczLCAnTScsIHUn4YSgJyksCiAgICAoMHgzMTc0LCAnTScsIHUn4YSiJyksCiAgICAoMHgzMTc1LCAnTScsIHUn4YSjJyksCiAgICAoMHgzMTc2LCAnTScsIHUn4YSnJyksCiAgICAoMHgzMTc3LCAnTScsIHUn4YSpJyksCiAgICAoMHgzMTc4LCAnTScsIHUn4YSrJyksCiAgICAoMHgzMTc5LCAnTScsIHUn4YSsJyksCiAgICAoMHgzMTdBLCAnTScsIHUn4YStJyksCiAgICAoMHgzMTdCLCAnTScsIHUn4YSuJyksCiAgICAoMHgzMTdDLCAnTScsIHUn4YSvJyksCiAgICAoMHgzMTdELCAnTScsIHUn4YSyJyksCiAgICAoMHgzMTdFLCAnTScsIHUn4YS2JyksCiAgICAoMHgzMTdGLCAnTScsIHUn4YWAJyksCiAgICAoMHgzMTgwLCAnTScsIHUn4YWHJyksCiAgICAoMHgzMTgxLCAnTScsIHUn4YWMJyksCiAgICAoMHgzMTgyLCAnTScsIHUn4YexJyksCiAgICAoMHgzMTgzLCAnTScsIHUn4YeyJyksCiAgICAoMHgzMTg0LCAnTScsIHUn4YWXJyksCiAgICAoMHgzMTg1LCAnTScsIHUn4YWYJyksCiAgICAoMHgzMTg2LCAnTScsIHUn4YWZJyksCiAgICAoMHgzMTg3LCAnTScsIHUn4YaEJyksCiAgICAoMHgzMTg4LCAnTScsIHUn4YaFJyksCiAgICAoMHgzMTg5LCAnTScsIHUn4YaIJyksCiAgICAoMHgzMThBLCAnTScsIHUn4YaRJyksCiAgICAoMHgzMThCLCAnTScsIHUn4YaSJyksCiAgICAoMHgzMThDLCAnTScsIHUn4YaUJyksCiAgICAoMHgzMThELCAnTScsIHUn4YaeJyksCiAgICAoMHgzMThFLCAnTScsIHUn4YahJyksCiAgICAoMHgzMThGLCAnWCcpLAogICAgKDB4MzE5MCwgJ1YnKSwKICAgICgweDMxOTIsICdNJywgdSfkuIAnKSwKICAgICgweDMxOTMsICdNJywgdSfkuownKSwKICAgICgweDMxOTQsICdNJywgdSfkuIknKSwKICAgICgweDMxOTUsICdNJywgdSflm5snKSwKICAgICgweDMxOTYsICdNJywgdSfkuIonKSwKICAgICgweDMxOTcsICdNJywgdSfkuK0nKSwKICAgICgweDMxOTgsICdNJywgdSfkuIsnKSwKICAgICgweDMxOTksICdNJywgdSfnlLInKSwKICAgICgweDMxOUEsICdNJywgdSfkuZknKSwKICAgICgweDMxOUIsICdNJywgdSfkuJknKSwKICAgICgweDMxOUMsICdNJywgdSfkuIEnKSwKICAgICgweDMxOUQsICdNJywgdSflpKknKSwKICAgICgweDMxOUUsICdNJywgdSflnLAnKSwKICAgICgweDMxOUYsICdNJywgdSfkuronKSwKICAgICgweDMxQTAsICdWJyksCiAgICAoMHgzMUJCLCAnWCcpLAogICAgKDB4MzFDMCwgJ1YnKSwKICAgICgweDMxRTQsICdYJyksCiAgICAoMHgzMUYwLCAnVicpLAogICAgKDB4MzIwMCwgJzMnLCB1JyjhhIApJyksCiAgICAoMHgzMjAxLCAnMycsIHUnKOGEgiknKSwKICAgICgweDMyMDIsICczJywgdSco4YSDKScpLAogICAgKDB4MzIwMywgJzMnLCB1JyjhhIUpJyksCiAgICAoMHgzMjA0LCAnMycsIHUnKOGEhiknKSwKICAgIF0KCmRlZiBfc2VnXzMwKCk6CiAgICByZXR1cm4gWwogICAgKDB4MzIwNSwgJzMnLCB1JyjhhIcpJyksCiAgICAoMHgzMjA2LCAnMycsIHUnKOGEiSknKSwKICAgICgweDMyMDcsICczJywgdSco4YSLKScpLAogICAgKDB4MzIwOCwgJzMnLCB1JyjhhIwpJyksCiAgICAoMHgzMjA5LCAnMycsIHUnKOGEjiknKSwKICAgICgweDMyMEEsICczJywgdSco4YSPKScpLAogICAgKDB4MzIwQiwgJzMnLCB1JyjhhJApJyksCiAgICAoMHgzMjBDLCAnMycsIHUnKOGEkSknKSwKICAgICgweDMyMEQsICczJywgdSco4YSSKScpLAogICAgKDB4MzIwRSwgJzMnLCB1JyjqsIApJyksCiAgICAoMHgzMjBGLCAnMycsIHUnKOuCmCknKSwKICAgICgweDMyMTAsICczJywgdSco64ukKScpLAogICAgKDB4MzIxMSwgJzMnLCB1JyjrnbwpJyksCiAgICAoMHgzMjEyLCAnMycsIHUnKOuniCknKSwKICAgICgweDMyMTMsICczJywgdSco67CUKScpLAogICAgKDB4MzIxNCwgJzMnLCB1JyjsgqwpJyksCiAgICAoMHgzMjE1LCAnMycsIHUnKOyVhCknKSwKICAgICgweDMyMTYsICczJywgdSco7J6QKScpLAogICAgKDB4MzIxNywgJzMnLCB1JyjssKgpJyksCiAgICAoMHgzMjE4LCAnMycsIHUnKOy5tCknKSwKICAgICgweDMyMTksICczJywgdSco7YOAKScpLAogICAgKDB4MzIxQSwgJzMnLCB1JyjtjIwpJyksCiAgICAoMHgzMjFCLCAnMycsIHUnKO2VmCknKSwKICAgICgweDMyMUMsICczJywgdSco7KO8KScpLAogICAgKDB4MzIxRCwgJzMnLCB1JyjsmKTsoIQpJyksCiAgICAoMHgzMjFFLCAnMycsIHUnKOyYpO2bhCknKSwKICAgICgweDMyMUYsICdYJyksCiAgICAoMHgzMjIwLCAnMycsIHUnKOS4gCknKSwKICAgICgweDMyMjEsICczJywgdSco5LqMKScpLAogICAgKDB4MzIyMiwgJzMnLCB1JyjkuIkpJyksCiAgICAoMHgzMjIzLCAnMycsIHUnKOWbmyknKSwKICAgICgweDMyMjQsICczJywgdSco5LqUKScpLAogICAgKDB4MzIyNSwgJzMnLCB1Jyjlha0pJyksCiAgICAoMHgzMjI2LCAnMycsIHUnKOS4gyknKSwKICAgICgweDMyMjcsICczJywgdSco5YWrKScpLAogICAgKDB4MzIyOCwgJzMnLCB1JyjkuZ0pJyksCiAgICAoMHgzMjI5LCAnMycsIHUnKOWNgSknKSwKICAgICgweDMyMkEsICczJywgdSco5pyIKScpLAogICAgKDB4MzIyQiwgJzMnLCB1JyjngaspJyksCiAgICAoMHgzMjJDLCAnMycsIHUnKOawtCknKSwKICAgICgweDMyMkQsICczJywgdSco5pyoKScpLAogICAgKDB4MzIyRSwgJzMnLCB1Jyjph5EpJyksCiAgICAoMHgzMjJGLCAnMycsIHUnKOWcnyknKSwKICAgICgweDMyMzAsICczJywgdSco5pelKScpLAogICAgKDB4MzIzMSwgJzMnLCB1JyjmoKopJyksCiAgICAoMHgzMjMyLCAnMycsIHUnKOaciSknKSwKICAgICgweDMyMzMsICczJywgdSco56S+KScpLAogICAgKDB4MzIzNCwgJzMnLCB1JyjlkI0pJyksCiAgICAoMHgzMjM1LCAnMycsIHUnKOeJuSknKSwKICAgICgweDMyMzYsICczJywgdSco6LKhKScpLAogICAgKDB4MzIzNywgJzMnLCB1JyjnpZ0pJyksCiAgICAoMHgzMjM4LCAnMycsIHUnKOWKtCknKSwKICAgICgweDMyMzksICczJywgdSco5LujKScpLAogICAgKDB4MzIzQSwgJzMnLCB1JyjlkbwpJyksCiAgICAoMHgzMjNCLCAnMycsIHUnKOWtpiknKSwKICAgICgweDMyM0MsICczJywgdSco55ujKScpLAogICAgKDB4MzIzRCwgJzMnLCB1JyjkvIEpJyksCiAgICAoMHgzMjNFLCAnMycsIHUnKOizhyknKSwKICAgICgweDMyM0YsICczJywgdSco5Y2UKScpLAogICAgKDB4MzI0MCwgJzMnLCB1Jyjnpa0pJyksCiAgICAoMHgzMjQxLCAnMycsIHUnKOS8kSknKSwKICAgICgweDMyNDIsICczJywgdSco6IeqKScpLAogICAgKDB4MzI0MywgJzMnLCB1Jyjoh7MpJyksCiAgICAoMHgzMjQ0LCAnTScsIHUn5ZWPJyksCiAgICAoMHgzMjQ1LCAnTScsIHUn5bm8JyksCiAgICAoMHgzMjQ2LCAnTScsIHUn5paHJyksCiAgICAoMHgzMjQ3LCAnTScsIHUn566PJyksCiAgICAoMHgzMjQ4LCAnVicpLAogICAgKDB4MzI1MCwgJ00nLCB1J3B0ZScpLAogICAgKDB4MzI1MSwgJ00nLCB1JzIxJyksCiAgICAoMHgzMjUyLCAnTScsIHUnMjInKSwKICAgICgweDMyNTMsICdNJywgdScyMycpLAogICAgKDB4MzI1NCwgJ00nLCB1JzI0JyksCiAgICAoMHgzMjU1LCAnTScsIHUnMjUnKSwKICAgICgweDMyNTYsICdNJywgdScyNicpLAogICAgKDB4MzI1NywgJ00nLCB1JzI3JyksCiAgICAoMHgzMjU4LCAnTScsIHUnMjgnKSwKICAgICgweDMyNTksICdNJywgdScyOScpLAogICAgKDB4MzI1QSwgJ00nLCB1JzMwJyksCiAgICAoMHgzMjVCLCAnTScsIHUnMzEnKSwKICAgICgweDMyNUMsICdNJywgdSczMicpLAogICAgKDB4MzI1RCwgJ00nLCB1JzMzJyksCiAgICAoMHgzMjVFLCAnTScsIHUnMzQnKSwKICAgICgweDMyNUYsICdNJywgdSczNScpLAogICAgKDB4MzI2MCwgJ00nLCB1J+GEgCcpLAogICAgKDB4MzI2MSwgJ00nLCB1J+GEgicpLAogICAgKDB4MzI2MiwgJ00nLCB1J+GEgycpLAogICAgKDB4MzI2MywgJ00nLCB1J+GEhScpLAogICAgKDB4MzI2NCwgJ00nLCB1J+GEhicpLAogICAgKDB4MzI2NSwgJ00nLCB1J+GEhycpLAogICAgKDB4MzI2NiwgJ00nLCB1J+GEiScpLAogICAgKDB4MzI2NywgJ00nLCB1J+GEiycpLAogICAgKDB4MzI2OCwgJ00nLCB1J+GEjCcpLAogICAgKDB4MzI2OSwgJ00nLCB1J+GEjicpLAogICAgKDB4MzI2QSwgJ00nLCB1J+GEjycpLAogICAgKDB4MzI2QiwgJ00nLCB1J+GEkCcpLAogICAgKDB4MzI2QywgJ00nLCB1J+GEkScpLAogICAgKDB4MzI2RCwgJ00nLCB1J+GEkicpLAogICAgKDB4MzI2RSwgJ00nLCB1J+qwgCcpLAogICAgKDB4MzI2RiwgJ00nLCB1J+uCmCcpLAogICAgXQoKZGVmIF9zZWdfMzEoKToKICAgIHJldHVybiBbCiAgICAoMHgzMjcwLCAnTScsIHUn64ukJyksCiAgICAoMHgzMjcxLCAnTScsIHUn6528JyksCiAgICAoMHgzMjcyLCAnTScsIHUn66eIJyksCiAgICAoMHgzMjczLCAnTScsIHUn67CUJyksCiAgICAoMHgzMjc0LCAnTScsIHUn7IKsJyksCiAgICAoMHgzMjc1LCAnTScsIHUn7JWEJyksCiAgICAoMHgzMjc2LCAnTScsIHUn7J6QJyksCiAgICAoMHgzMjc3LCAnTScsIHUn7LCoJyksCiAgICAoMHgzMjc4LCAnTScsIHUn7Lm0JyksCiAgICAoMHgzMjc5LCAnTScsIHUn7YOAJyksCiAgICAoMHgzMjdBLCAnTScsIHUn7YyMJyksCiAgICAoMHgzMjdCLCAnTScsIHUn7ZWYJyksCiAgICAoMHgzMjdDLCAnTScsIHUn7LC46rOgJyksCiAgICAoMHgzMjdELCAnTScsIHUn7KO87J2YJyksCiAgICAoMHgzMjdFLCAnTScsIHUn7JqwJyksCiAgICAoMHgzMjdGLCAnVicpLAogICAgKDB4MzI4MCwgJ00nLCB1J+S4gCcpLAogICAgKDB4MzI4MSwgJ00nLCB1J+S6jCcpLAogICAgKDB4MzI4MiwgJ00nLCB1J+S4iScpLAogICAgKDB4MzI4MywgJ00nLCB1J+WbmycpLAogICAgKDB4MzI4NCwgJ00nLCB1J+S6lCcpLAogICAgKDB4MzI4NSwgJ00nLCB1J+WFrScpLAogICAgKDB4MzI4NiwgJ00nLCB1J+S4gycpLAogICAgKDB4MzI4NywgJ00nLCB1J+WFqycpLAogICAgKDB4MzI4OCwgJ00nLCB1J+S5nScpLAogICAgKDB4MzI4OSwgJ00nLCB1J+WNgScpLAogICAgKDB4MzI4QSwgJ00nLCB1J+aciCcpLAogICAgKDB4MzI4QiwgJ00nLCB1J+eBqycpLAogICAgKDB4MzI4QywgJ00nLCB1J+awtCcpLAogICAgKDB4MzI4RCwgJ00nLCB1J+acqCcpLAogICAgKDB4MzI4RSwgJ00nLCB1J+mHkScpLAogICAgKDB4MzI4RiwgJ00nLCB1J+WcnycpLAogICAgKDB4MzI5MCwgJ00nLCB1J+aXpScpLAogICAgKDB4MzI5MSwgJ00nLCB1J+agqicpLAogICAgKDB4MzI5MiwgJ00nLCB1J+aciScpLAogICAgKDB4MzI5MywgJ00nLCB1J+ekvicpLAogICAgKDB4MzI5NCwgJ00nLCB1J+WQjScpLAogICAgKDB4MzI5NSwgJ00nLCB1J+eJuScpLAogICAgKDB4MzI5NiwgJ00nLCB1J+iyoScpLAogICAgKDB4MzI5NywgJ00nLCB1J+elnScpLAogICAgKDB4MzI5OCwgJ00nLCB1J+WKtCcpLAogICAgKDB4MzI5OSwgJ00nLCB1J+enmCcpLAogICAgKDB4MzI5QSwgJ00nLCB1J+eUtycpLAogICAgKDB4MzI5QiwgJ00nLCB1J+WlsycpLAogICAgKDB4MzI5QywgJ00nLCB1J+mBqScpLAogICAgKDB4MzI5RCwgJ00nLCB1J+WEqicpLAogICAgKDB4MzI5RSwgJ00nLCB1J+WNsCcpLAogICAgKDB4MzI5RiwgJ00nLCB1J+azqCcpLAogICAgKDB4MzJBMCwgJ00nLCB1J+mghScpLAogICAgKDB4MzJBMSwgJ00nLCB1J+S8kScpLAogICAgKDB4MzJBMiwgJ00nLCB1J+WGmScpLAogICAgKDB4MzJBMywgJ00nLCB1J+atoycpLAogICAgKDB4MzJBNCwgJ00nLCB1J+S4iicpLAogICAgKDB4MzJBNSwgJ00nLCB1J+S4rScpLAogICAgKDB4MzJBNiwgJ00nLCB1J+S4iycpLAogICAgKDB4MzJBNywgJ00nLCB1J+W3picpLAogICAgKDB4MzJBOCwgJ00nLCB1J+WPsycpLAogICAgKDB4MzJBOSwgJ00nLCB1J+WMuycpLAogICAgKDB4MzJBQSwgJ00nLCB1J+WulycpLAogICAgKDB4MzJBQiwgJ00nLCB1J+WtpicpLAogICAgKDB4MzJBQywgJ00nLCB1J+eboycpLAogICAgKDB4MzJBRCwgJ00nLCB1J+S8gScpLAogICAgKDB4MzJBRSwgJ00nLCB1J+izhycpLAogICAgKDB4MzJBRiwgJ00nLCB1J+WNlCcpLAogICAgKDB4MzJCMCwgJ00nLCB1J+WknCcpLAogICAgKDB4MzJCMSwgJ00nLCB1JzM2JyksCiAgICAoMHgzMkIyLCAnTScsIHUnMzcnKSwKICAgICgweDMyQjMsICdNJywgdSczOCcpLAogICAgKDB4MzJCNCwgJ00nLCB1JzM5JyksCiAgICAoMHgzMkI1LCAnTScsIHUnNDAnKSwKICAgICgweDMyQjYsICdNJywgdSc0MScpLAogICAgKDB4MzJCNywgJ00nLCB1JzQyJyksCiAgICAoMHgzMkI4LCAnTScsIHUnNDMnKSwKICAgICgweDMyQjksICdNJywgdSc0NCcpLAogICAgKDB4MzJCQSwgJ00nLCB1JzQ1JyksCiAgICAoMHgzMkJCLCAnTScsIHUnNDYnKSwKICAgICgweDMyQkMsICdNJywgdSc0NycpLAogICAgKDB4MzJCRCwgJ00nLCB1JzQ4JyksCiAgICAoMHgzMkJFLCAnTScsIHUnNDknKSwKICAgICgweDMyQkYsICdNJywgdSc1MCcpLAogICAgKDB4MzJDMCwgJ00nLCB1JzHmnIgnKSwKICAgICgweDMyQzEsICdNJywgdScy5pyIJyksCiAgICAoMHgzMkMyLCAnTScsIHUnM+aciCcpLAogICAgKDB4MzJDMywgJ00nLCB1JzTmnIgnKSwKICAgICgweDMyQzQsICdNJywgdSc15pyIJyksCiAgICAoMHgzMkM1LCAnTScsIHUnNuaciCcpLAogICAgKDB4MzJDNiwgJ00nLCB1JzfmnIgnKSwKICAgICgweDMyQzcsICdNJywgdSc45pyIJyksCiAgICAoMHgzMkM4LCAnTScsIHUnOeaciCcpLAogICAgKDB4MzJDOSwgJ00nLCB1JzEw5pyIJyksCiAgICAoMHgzMkNBLCAnTScsIHUnMTHmnIgnKSwKICAgICgweDMyQ0IsICdNJywgdScxMuaciCcpLAogICAgKDB4MzJDQywgJ00nLCB1J2hnJyksCiAgICAoMHgzMkNELCAnTScsIHUnZXJnJyksCiAgICAoMHgzMkNFLCAnTScsIHUnZXYnKSwKICAgICgweDMyQ0YsICdNJywgdSdsdGQnKSwKICAgICgweDMyRDAsICdNJywgdSfjgqInKSwKICAgICgweDMyRDEsICdNJywgdSfjgqQnKSwKICAgICgweDMyRDIsICdNJywgdSfjgqYnKSwKICAgICgweDMyRDMsICdNJywgdSfjgqgnKSwKICAgIF0KCmRlZiBfc2VnXzMyKCk6CiAgICByZXR1cm4gWwogICAgKDB4MzJENCwgJ00nLCB1J+OCqicpLAogICAgKDB4MzJENSwgJ00nLCB1J+OCqycpLAogICAgKDB4MzJENiwgJ00nLCB1J+OCrScpLAogICAgKDB4MzJENywgJ00nLCB1J+OCrycpLAogICAgKDB4MzJEOCwgJ00nLCB1J+OCsScpLAogICAgKDB4MzJEOSwgJ00nLCB1J+OCsycpLAogICAgKDB4MzJEQSwgJ00nLCB1J+OCtScpLAogICAgKDB4MzJEQiwgJ00nLCB1J+OCtycpLAogICAgKDB4MzJEQywgJ00nLCB1J+OCuScpLAogICAgKDB4MzJERCwgJ00nLCB1J+OCuycpLAogICAgKDB4MzJERSwgJ00nLCB1J+OCvScpLAogICAgKDB4MzJERiwgJ00nLCB1J+OCvycpLAogICAgKDB4MzJFMCwgJ00nLCB1J+ODgScpLAogICAgKDB4MzJFMSwgJ00nLCB1J+ODhCcpLAogICAgKDB4MzJFMiwgJ00nLCB1J+ODhicpLAogICAgKDB4MzJFMywgJ00nLCB1J+ODiCcpLAogICAgKDB4MzJFNCwgJ00nLCB1J+ODiicpLAogICAgKDB4MzJFNSwgJ00nLCB1J+ODiycpLAogICAgKDB4MzJFNiwgJ00nLCB1J+ODjCcpLAogICAgKDB4MzJFNywgJ00nLCB1J+ODjScpLAogICAgKDB4MzJFOCwgJ00nLCB1J+ODjicpLAogICAgKDB4MzJFOSwgJ00nLCB1J+ODjycpLAogICAgKDB4MzJFQSwgJ00nLCB1J+ODkicpLAogICAgKDB4MzJFQiwgJ00nLCB1J+ODlScpLAogICAgKDB4MzJFQywgJ00nLCB1J+ODmCcpLAogICAgKDB4MzJFRCwgJ00nLCB1J+ODmycpLAogICAgKDB4MzJFRSwgJ00nLCB1J+ODnicpLAogICAgKDB4MzJFRiwgJ00nLCB1J+ODnycpLAogICAgKDB4MzJGMCwgJ00nLCB1J+ODoCcpLAogICAgKDB4MzJGMSwgJ00nLCB1J+ODoScpLAogICAgKDB4MzJGMiwgJ00nLCB1J+ODoicpLAogICAgKDB4MzJGMywgJ00nLCB1J+ODpCcpLAogICAgKDB4MzJGNCwgJ00nLCB1J+ODpicpLAogICAgKDB4MzJGNSwgJ00nLCB1J+ODqCcpLAogICAgKDB4MzJGNiwgJ00nLCB1J+ODqScpLAogICAgKDB4MzJGNywgJ00nLCB1J+ODqicpLAogICAgKDB4MzJGOCwgJ00nLCB1J+ODqycpLAogICAgKDB4MzJGOSwgJ00nLCB1J+ODrCcpLAogICAgKDB4MzJGQSwgJ00nLCB1J+ODrScpLAogICAgKDB4MzJGQiwgJ00nLCB1J+ODrycpLAogICAgKDB4MzJGQywgJ00nLCB1J+ODsCcpLAogICAgKDB4MzJGRCwgJ00nLCB1J+ODsScpLAogICAgKDB4MzJGRSwgJ00nLCB1J+ODsicpLAogICAgKDB4MzJGRiwgJ1gnKSwKICAgICgweDMzMDAsICdNJywgdSfjgqLjg5Hjg7zjg4gnKSwKICAgICgweDMzMDEsICdNJywgdSfjgqLjg6vjg5XjgqEnKSwKICAgICgweDMzMDIsICdNJywgdSfjgqLjg7Pjg5rjgqInKSwKICAgICgweDMzMDMsICdNJywgdSfjgqLjg7zjg6snKSwKICAgICgweDMzMDQsICdNJywgdSfjgqTjg4vjg7PjgrAnKSwKICAgICgweDMzMDUsICdNJywgdSfjgqTjg7Pjg4EnKSwKICAgICgweDMzMDYsICdNJywgdSfjgqbjgqnjg7MnKSwKICAgICgweDMzMDcsICdNJywgdSfjgqjjgrnjgq/jg7zjg4knKSwKICAgICgweDMzMDgsICdNJywgdSfjgqjjg7zjgqvjg7wnKSwKICAgICgweDMzMDksICdNJywgdSfjgqrjg7PjgrknKSwKICAgICgweDMzMEEsICdNJywgdSfjgqrjg7zjg6AnKSwKICAgICgweDMzMEIsICdNJywgdSfjgqvjgqTjg6onKSwKICAgICgweDMzMEMsICdNJywgdSfjgqvjg6njg4Pjg4gnKSwKICAgICgweDMzMEQsICdNJywgdSfjgqvjg63jg6rjg7wnKSwKICAgICgweDMzMEUsICdNJywgdSfjgqzjg63jg7MnKSwKICAgICgweDMzMEYsICdNJywgdSfjgqzjg7Pjg54nKSwKICAgICgweDMzMTAsICdNJywgdSfjgq7jgqwnKSwKICAgICgweDMzMTEsICdNJywgdSfjgq7jg4vjg7wnKSwKICAgICgweDMzMTIsICdNJywgdSfjgq3jg6Xjg6rjg7wnKSwKICAgICgweDMzMTMsICdNJywgdSfjgq7jg6vjg4Djg7wnKSwKICAgICgweDMzMTQsICdNJywgdSfjgq3jg60nKSwKICAgICgweDMzMTUsICdNJywgdSfjgq3jg63jgrDjg6njg6AnKSwKICAgICgweDMzMTYsICdNJywgdSfjgq3jg63jg6Hjg7zjg4jjg6snKSwKICAgICgweDMzMTcsICdNJywgdSfjgq3jg63jg6/jg4Pjg4gnKSwKICAgICgweDMzMTgsICdNJywgdSfjgrDjg6njg6AnKSwKICAgICgweDMzMTksICdNJywgdSfjgrDjg6njg6Djg4jjg7MnKSwKICAgICgweDMzMUEsICdNJywgdSfjgq/jg6vjgrzjgqTjg60nKSwKICAgICgweDMzMUIsICdNJywgdSfjgq/jg63jg7zjg40nKSwKICAgICgweDMzMUMsICdNJywgdSfjgrHjg7zjgrknKSwKICAgICgweDMzMUQsICdNJywgdSfjgrPjg6vjg4onKSwKICAgICgweDMzMUUsICdNJywgdSfjgrPjg7zjg50nKSwKICAgICgweDMzMUYsICdNJywgdSfjgrXjgqTjgq/jg6snKSwKICAgICgweDMzMjAsICdNJywgdSfjgrXjg7Pjg4Hjg7zjg6AnKSwKICAgICgweDMzMjEsICdNJywgdSfjgrfjg6rjg7PjgrAnKSwKICAgICgweDMzMjIsICdNJywgdSfjgrvjg7Pjg4EnKSwKICAgICgweDMzMjMsICdNJywgdSfjgrvjg7Pjg4gnKSwKICAgICgweDMzMjQsICdNJywgdSfjg4Djg7zjgrknKSwKICAgICgweDMzMjUsICdNJywgdSfjg4fjgrcnKSwKICAgICgweDMzMjYsICdNJywgdSfjg4njg6snKSwKICAgICgweDMzMjcsICdNJywgdSfjg4jjg7MnKSwKICAgICgweDMzMjgsICdNJywgdSfjg4rjg44nKSwKICAgICgweDMzMjksICdNJywgdSfjg47jg4Pjg4gnKSwKICAgICgweDMzMkEsICdNJywgdSfjg4/jgqTjg4QnKSwKICAgICgweDMzMkIsICdNJywgdSfjg5Hjg7zjgrvjg7Pjg4gnKSwKICAgICgweDMzMkMsICdNJywgdSfjg5Hjg7zjg4QnKSwKICAgICgweDMzMkQsICdNJywgdSfjg5Djg7zjg6zjg6snKSwKICAgICgweDMzMkUsICdNJywgdSfjg5TjgqLjgrnjg4jjg6snKSwKICAgICgweDMzMkYsICdNJywgdSfjg5Tjgq/jg6snKSwKICAgICgweDMzMzAsICdNJywgdSfjg5TjgrMnKSwKICAgICgweDMzMzEsICdNJywgdSfjg5Pjg6snKSwKICAgICgweDMzMzIsICdNJywgdSfjg5XjgqHjg6njg4Pjg4knKSwKICAgICgweDMzMzMsICdNJywgdSfjg5XjgqPjg7zjg4gnKSwKICAgICgweDMzMzQsICdNJywgdSfjg5bjg4Pjgrfjgqfjg6snKSwKICAgICgweDMzMzUsICdNJywgdSfjg5Xjg6njg7MnKSwKICAgICgweDMzMzYsICdNJywgdSfjg5jjgq/jgr/jg7zjg6snKSwKICAgICgweDMzMzcsICdNJywgdSfjg5rjgr0nKSwKICAgIF0KCmRlZiBfc2VnXzMzKCk6CiAgICByZXR1cm4gWwogICAgKDB4MzMzOCwgJ00nLCB1J+ODmuODi+ODkicpLAogICAgKDB4MzMzOSwgJ00nLCB1J+ODmOODq+ODhCcpLAogICAgKDB4MzMzQSwgJ00nLCB1J+ODmuODs+OCuScpLAogICAgKDB4MzMzQiwgJ00nLCB1J+ODmuODvOOCuCcpLAogICAgKDB4MzMzQywgJ00nLCB1J+ODmeODvOOCvycpLAogICAgKDB4MzMzRCwgJ00nLCB1J+ODneOCpOODs+ODiCcpLAogICAgKDB4MzMzRSwgJ00nLCB1J+ODnOODq+ODiCcpLAogICAgKDB4MzMzRiwgJ00nLCB1J+ODm+ODsycpLAogICAgKDB4MzM0MCwgJ00nLCB1J+ODneODs+ODiScpLAogICAgKDB4MzM0MSwgJ00nLCB1J+ODm+ODvOODqycpLAogICAgKDB4MzM0MiwgJ00nLCB1J+ODm+ODvOODsycpLAogICAgKDB4MzM0MywgJ00nLCB1J+ODnuOCpOOCr+ODrScpLAogICAgKDB4MzM0NCwgJ00nLCB1J+ODnuOCpOODqycpLAogICAgKDB4MzM0NSwgJ00nLCB1J+ODnuODg+ODjycpLAogICAgKDB4MzM0NiwgJ00nLCB1J+ODnuODq+OCrycpLAogICAgKDB4MzM0NywgJ00nLCB1J+ODnuODs+OCt+ODp+ODsycpLAogICAgKDB4MzM0OCwgJ00nLCB1J+ODn+OCr+ODreODsycpLAogICAgKDB4MzM0OSwgJ00nLCB1J+ODn+ODqicpLAogICAgKDB4MzM0QSwgJ00nLCB1J+ODn+ODquODkOODvOODqycpLAogICAgKDB4MzM0QiwgJ00nLCB1J+ODoeOCrCcpLAogICAgKDB4MzM0QywgJ00nLCB1J+ODoeOCrOODiOODsycpLAogICAgKDB4MzM0RCwgJ00nLCB1J+ODoeODvOODiOODqycpLAogICAgKDB4MzM0RSwgJ00nLCB1J+ODpOODvOODiScpLAogICAgKDB4MzM0RiwgJ00nLCB1J+ODpOODvOODqycpLAogICAgKDB4MzM1MCwgJ00nLCB1J+ODpuOCouODsycpLAogICAgKDB4MzM1MSwgJ00nLCB1J+ODquODg+ODiOODqycpLAogICAgKDB4MzM1MiwgJ00nLCB1J+ODquODqScpLAogICAgKDB4MzM1MywgJ00nLCB1J+ODq+ODlOODvCcpLAogICAgKDB4MzM1NCwgJ00nLCB1J+ODq+ODvOODluODqycpLAogICAgKDB4MzM1NSwgJ00nLCB1J+ODrOODoCcpLAogICAgKDB4MzM1NiwgJ00nLCB1J+ODrOODs+ODiOOCsuODsycpLAogICAgKDB4MzM1NywgJ00nLCB1J+ODr+ODg+ODiCcpLAogICAgKDB4MzM1OCwgJ00nLCB1JzDngrknKSwKICAgICgweDMzNTksICdNJywgdScx54K5JyksCiAgICAoMHgzMzVBLCAnTScsIHUnMueCuScpLAogICAgKDB4MzM1QiwgJ00nLCB1JzPngrknKSwKICAgICgweDMzNUMsICdNJywgdSc054K5JyksCiAgICAoMHgzMzVELCAnTScsIHUnNeeCuScpLAogICAgKDB4MzM1RSwgJ00nLCB1JzbngrknKSwKICAgICgweDMzNUYsICdNJywgdSc354K5JyksCiAgICAoMHgzMzYwLCAnTScsIHUnOOeCuScpLAogICAgKDB4MzM2MSwgJ00nLCB1JznngrknKSwKICAgICgweDMzNjIsICdNJywgdScxMOeCuScpLAogICAgKDB4MzM2MywgJ00nLCB1JzEx54K5JyksCiAgICAoMHgzMzY0LCAnTScsIHUnMTLngrknKSwKICAgICgweDMzNjUsICdNJywgdScxM+eCuScpLAogICAgKDB4MzM2NiwgJ00nLCB1JzE054K5JyksCiAgICAoMHgzMzY3LCAnTScsIHUnMTXngrknKSwKICAgICgweDMzNjgsICdNJywgdScxNueCuScpLAogICAgKDB4MzM2OSwgJ00nLCB1JzE354K5JyksCiAgICAoMHgzMzZBLCAnTScsIHUnMTjngrknKSwKICAgICgweDMzNkIsICdNJywgdScxOeeCuScpLAogICAgKDB4MzM2QywgJ00nLCB1JzIw54K5JyksCiAgICAoMHgzMzZELCAnTScsIHUnMjHngrknKSwKICAgICgweDMzNkUsICdNJywgdScyMueCuScpLAogICAgKDB4MzM2RiwgJ00nLCB1JzIz54K5JyksCiAgICAoMHgzMzcwLCAnTScsIHUnMjTngrknKSwKICAgICgweDMzNzEsICdNJywgdSdocGEnKSwKICAgICgweDMzNzIsICdNJywgdSdkYScpLAogICAgKDB4MzM3MywgJ00nLCB1J2F1JyksCiAgICAoMHgzMzc0LCAnTScsIHUnYmFyJyksCiAgICAoMHgzMzc1LCAnTScsIHUnb3YnKSwKICAgICgweDMzNzYsICdNJywgdSdwYycpLAogICAgKDB4MzM3NywgJ00nLCB1J2RtJyksCiAgICAoMHgzMzc4LCAnTScsIHUnZG0yJyksCiAgICAoMHgzMzc5LCAnTScsIHUnZG0zJyksCiAgICAoMHgzMzdBLCAnTScsIHUnaXUnKSwKICAgICgweDMzN0IsICdNJywgdSflubPmiJAnKSwKICAgICgweDMzN0MsICdNJywgdSfmmK3lkownKSwKICAgICgweDMzN0QsICdNJywgdSflpKfmraMnKSwKICAgICgweDMzN0UsICdNJywgdSfmmI7msrsnKSwKICAgICgweDMzN0YsICdNJywgdSfmoKrlvI/kvJrnpL4nKSwKICAgICgweDMzODAsICdNJywgdSdwYScpLAogICAgKDB4MzM4MSwgJ00nLCB1J25hJyksCiAgICAoMHgzMzgyLCAnTScsIHUnzrxhJyksCiAgICAoMHgzMzgzLCAnTScsIHUnbWEnKSwKICAgICgweDMzODQsICdNJywgdSdrYScpLAogICAgKDB4MzM4NSwgJ00nLCB1J2tiJyksCiAgICAoMHgzMzg2LCAnTScsIHUnbWInKSwKICAgICgweDMzODcsICdNJywgdSdnYicpLAogICAgKDB4MzM4OCwgJ00nLCB1J2NhbCcpLAogICAgKDB4MzM4OSwgJ00nLCB1J2tjYWwnKSwKICAgICgweDMzOEEsICdNJywgdSdwZicpLAogICAgKDB4MzM4QiwgJ00nLCB1J25mJyksCiAgICAoMHgzMzhDLCAnTScsIHUnzrxmJyksCiAgICAoMHgzMzhELCAnTScsIHUnzrxnJyksCiAgICAoMHgzMzhFLCAnTScsIHUnbWcnKSwKICAgICgweDMzOEYsICdNJywgdSdrZycpLAogICAgKDB4MzM5MCwgJ00nLCB1J2h6JyksCiAgICAoMHgzMzkxLCAnTScsIHUna2h6JyksCiAgICAoMHgzMzkyLCAnTScsIHUnbWh6JyksCiAgICAoMHgzMzkzLCAnTScsIHUnZ2h6JyksCiAgICAoMHgzMzk0LCAnTScsIHUndGh6JyksCiAgICAoMHgzMzk1LCAnTScsIHUnzrxsJyksCiAgICAoMHgzMzk2LCAnTScsIHUnbWwnKSwKICAgICgweDMzOTcsICdNJywgdSdkbCcpLAogICAgKDB4MzM5OCwgJ00nLCB1J2tsJyksCiAgICAoMHgzMzk5LCAnTScsIHUnZm0nKSwKICAgICgweDMzOUEsICdNJywgdSdubScpLAogICAgKDB4MzM5QiwgJ00nLCB1J868bScpLAogICAgXQoKZGVmIF9zZWdfMzQoKToKICAgIHJldHVybiBbCiAgICAoMHgzMzlDLCAnTScsIHUnbW0nKSwKICAgICgweDMzOUQsICdNJywgdSdjbScpLAogICAgKDB4MzM5RSwgJ00nLCB1J2ttJyksCiAgICAoMHgzMzlGLCAnTScsIHUnbW0yJyksCiAgICAoMHgzM0EwLCAnTScsIHUnY20yJyksCiAgICAoMHgzM0ExLCAnTScsIHUnbTInKSwKICAgICgweDMzQTIsICdNJywgdSdrbTInKSwKICAgICgweDMzQTMsICdNJywgdSdtbTMnKSwKICAgICgweDMzQTQsICdNJywgdSdjbTMnKSwKICAgICgweDMzQTUsICdNJywgdSdtMycpLAogICAgKDB4MzNBNiwgJ00nLCB1J2ttMycpLAogICAgKDB4MzNBNywgJ00nLCB1J23iiJVzJyksCiAgICAoMHgzM0E4LCAnTScsIHUnbeKIlXMyJyksCiAgICAoMHgzM0E5LCAnTScsIHUncGEnKSwKICAgICgweDMzQUEsICdNJywgdSdrcGEnKSwKICAgICgweDMzQUIsICdNJywgdSdtcGEnKSwKICAgICgweDMzQUMsICdNJywgdSdncGEnKSwKICAgICgweDMzQUQsICdNJywgdSdyYWQnKSwKICAgICgweDMzQUUsICdNJywgdSdyYWTiiJVzJyksCiAgICAoMHgzM0FGLCAnTScsIHUncmFk4oiVczInKSwKICAgICgweDMzQjAsICdNJywgdSdwcycpLAogICAgKDB4MzNCMSwgJ00nLCB1J25zJyksCiAgICAoMHgzM0IyLCAnTScsIHUnzrxzJyksCiAgICAoMHgzM0IzLCAnTScsIHUnbXMnKSwKICAgICgweDMzQjQsICdNJywgdSdwdicpLAogICAgKDB4MzNCNSwgJ00nLCB1J252JyksCiAgICAoMHgzM0I2LCAnTScsIHUnzrx2JyksCiAgICAoMHgzM0I3LCAnTScsIHUnbXYnKSwKICAgICgweDMzQjgsICdNJywgdSdrdicpLAogICAgKDB4MzNCOSwgJ00nLCB1J212JyksCiAgICAoMHgzM0JBLCAnTScsIHUncHcnKSwKICAgICgweDMzQkIsICdNJywgdSdudycpLAogICAgKDB4MzNCQywgJ00nLCB1J868dycpLAogICAgKDB4MzNCRCwgJ00nLCB1J213JyksCiAgICAoMHgzM0JFLCAnTScsIHUna3cnKSwKICAgICgweDMzQkYsICdNJywgdSdtdycpLAogICAgKDB4MzNDMCwgJ00nLCB1J2vPiScpLAogICAgKDB4MzNDMSwgJ00nLCB1J23PiScpLAogICAgKDB4MzNDMiwgJ1gnKSwKICAgICgweDMzQzMsICdNJywgdSdicScpLAogICAgKDB4MzNDNCwgJ00nLCB1J2NjJyksCiAgICAoMHgzM0M1LCAnTScsIHUnY2QnKSwKICAgICgweDMzQzYsICdNJywgdSdj4oiVa2cnKSwKICAgICgweDMzQzcsICdYJyksCiAgICAoMHgzM0M4LCAnTScsIHUnZGInKSwKICAgICgweDMzQzksICdNJywgdSdneScpLAogICAgKDB4MzNDQSwgJ00nLCB1J2hhJyksCiAgICAoMHgzM0NCLCAnTScsIHUnaHAnKSwKICAgICgweDMzQ0MsICdNJywgdSdpbicpLAogICAgKDB4MzNDRCwgJ00nLCB1J2trJyksCiAgICAoMHgzM0NFLCAnTScsIHUna20nKSwKICAgICgweDMzQ0YsICdNJywgdSdrdCcpLAogICAgKDB4MzNEMCwgJ00nLCB1J2xtJyksCiAgICAoMHgzM0QxLCAnTScsIHUnbG4nKSwKICAgICgweDMzRDIsICdNJywgdSdsb2cnKSwKICAgICgweDMzRDMsICdNJywgdSdseCcpLAogICAgKDB4MzNENCwgJ00nLCB1J21iJyksCiAgICAoMHgzM0Q1LCAnTScsIHUnbWlsJyksCiAgICAoMHgzM0Q2LCAnTScsIHUnbW9sJyksCiAgICAoMHgzM0Q3LCAnTScsIHUncGgnKSwKICAgICgweDMzRDgsICdYJyksCiAgICAoMHgzM0Q5LCAnTScsIHUncHBtJyksCiAgICAoMHgzM0RBLCAnTScsIHUncHInKSwKICAgICgweDMzREIsICdNJywgdSdzcicpLAogICAgKDB4MzNEQywgJ00nLCB1J3N2JyksCiAgICAoMHgzM0RELCAnTScsIHUnd2InKSwKICAgICgweDMzREUsICdNJywgdSd24oiVbScpLAogICAgKDB4MzNERiwgJ00nLCB1J2HiiJVtJyksCiAgICAoMHgzM0UwLCAnTScsIHUnMeaXpScpLAogICAgKDB4MzNFMSwgJ00nLCB1JzLml6UnKSwKICAgICgweDMzRTIsICdNJywgdScz5pelJyksCiAgICAoMHgzM0UzLCAnTScsIHUnNOaXpScpLAogICAgKDB4MzNFNCwgJ00nLCB1JzXml6UnKSwKICAgICgweDMzRTUsICdNJywgdSc25pelJyksCiAgICAoMHgzM0U2LCAnTScsIHUnN+aXpScpLAogICAgKDB4MzNFNywgJ00nLCB1Jzjml6UnKSwKICAgICgweDMzRTgsICdNJywgdSc55pelJyksCiAgICAoMHgzM0U5LCAnTScsIHUnMTDml6UnKSwKICAgICgweDMzRUEsICdNJywgdScxMeaXpScpLAogICAgKDB4MzNFQiwgJ00nLCB1JzEy5pelJyksCiAgICAoMHgzM0VDLCAnTScsIHUnMTPml6UnKSwKICAgICgweDMzRUQsICdNJywgdScxNOaXpScpLAogICAgKDB4MzNFRSwgJ00nLCB1JzE15pelJyksCiAgICAoMHgzM0VGLCAnTScsIHUnMTbml6UnKSwKICAgICgweDMzRjAsICdNJywgdScxN+aXpScpLAogICAgKDB4MzNGMSwgJ00nLCB1JzE45pelJyksCiAgICAoMHgzM0YyLCAnTScsIHUnMTnml6UnKSwKICAgICgweDMzRjMsICdNJywgdScyMOaXpScpLAogICAgKDB4MzNGNCwgJ00nLCB1JzIx5pelJyksCiAgICAoMHgzM0Y1LCAnTScsIHUnMjLml6UnKSwKICAgICgweDMzRjYsICdNJywgdScyM+aXpScpLAogICAgKDB4MzNGNywgJ00nLCB1JzI05pelJyksCiAgICAoMHgzM0Y4LCAnTScsIHUnMjXml6UnKSwKICAgICgweDMzRjksICdNJywgdScyNuaXpScpLAogICAgKDB4MzNGQSwgJ00nLCB1JzI35pelJyksCiAgICAoMHgzM0ZCLCAnTScsIHUnMjjml6UnKSwKICAgICgweDMzRkMsICdNJywgdScyOeaXpScpLAogICAgKDB4MzNGRCwgJ00nLCB1JzMw5pelJyksCiAgICAoMHgzM0ZFLCAnTScsIHUnMzHml6UnKSwKICAgICgweDMzRkYsICdNJywgdSdnYWwnKSwKICAgIF0KCmRlZiBfc2VnXzM1KCk6CiAgICByZXR1cm4gWwogICAgKDB4MzQwMCwgJ1YnKSwKICAgICgweDREQjYsICdYJyksCiAgICAoMHg0REMwLCAnVicpLAogICAgKDB4OUZDRCwgJ1gnKSwKICAgICgweEEwMDAsICdWJyksCiAgICAoMHhBNDhELCAnWCcpLAogICAgKDB4QTQ5MCwgJ1YnKSwKICAgICgweEE0QzcsICdYJyksCiAgICAoMHhBNEQwLCAnVicpLAogICAgKDB4QTYyQywgJ1gnKSwKICAgICgweEE2NDAsICdNJywgdSfqmYEnKSwKICAgICgweEE2NDEsICdWJyksCiAgICAoMHhBNjQyLCAnTScsIHUn6pmDJyksCiAgICAoMHhBNjQzLCAnVicpLAogICAgKDB4QTY0NCwgJ00nLCB1J+qZhScpLAogICAgKDB4QTY0NSwgJ1YnKSwKICAgICgweEE2NDYsICdNJywgdSfqmYcnKSwKICAgICgweEE2NDcsICdWJyksCiAgICAoMHhBNjQ4LCAnTScsIHUn6pmJJyksCiAgICAoMHhBNjQ5LCAnVicpLAogICAgKDB4QTY0QSwgJ00nLCB1J+qZiycpLAogICAgKDB4QTY0QiwgJ1YnKSwKICAgICgweEE2NEMsICdNJywgdSfqmY0nKSwKICAgICgweEE2NEQsICdWJyksCiAgICAoMHhBNjRFLCAnTScsIHUn6pmPJyksCiAgICAoMHhBNjRGLCAnVicpLAogICAgKDB4QTY1MCwgJ00nLCB1J+qZkScpLAogICAgKDB4QTY1MSwgJ1YnKSwKICAgICgweEE2NTIsICdNJywgdSfqmZMnKSwKICAgICgweEE2NTMsICdWJyksCiAgICAoMHhBNjU0LCAnTScsIHUn6pmVJyksCiAgICAoMHhBNjU1LCAnVicpLAogICAgKDB4QTY1NiwgJ00nLCB1J+qZlycpLAogICAgKDB4QTY1NywgJ1YnKSwKICAgICgweEE2NTgsICdNJywgdSfqmZknKSwKICAgICgweEE2NTksICdWJyksCiAgICAoMHhBNjVBLCAnTScsIHUn6pmbJyksCiAgICAoMHhBNjVCLCAnVicpLAogICAgKDB4QTY1QywgJ00nLCB1J+qZnScpLAogICAgKDB4QTY1RCwgJ1YnKSwKICAgICgweEE2NUUsICdNJywgdSfqmZ8nKSwKICAgICgweEE2NUYsICdWJyksCiAgICAoMHhBNjYwLCAnTScsIHUn6pmhJyksCiAgICAoMHhBNjYxLCAnVicpLAogICAgKDB4QTY2MiwgJ00nLCB1J+qZoycpLAogICAgKDB4QTY2MywgJ1YnKSwKICAgICgweEE2NjQsICdNJywgdSfqmaUnKSwKICAgICgweEE2NjUsICdWJyksCiAgICAoMHhBNjY2LCAnTScsIHUn6pmnJyksCiAgICAoMHhBNjY3LCAnVicpLAogICAgKDB4QTY2OCwgJ00nLCB1J+qZqScpLAogICAgKDB4QTY2OSwgJ1YnKSwKICAgICgweEE2NkEsICdNJywgdSfqmasnKSwKICAgICgweEE2NkIsICdWJyksCiAgICAoMHhBNjZDLCAnTScsIHUn6pmtJyksCiAgICAoMHhBNjZELCAnVicpLAogICAgKDB4QTY4MCwgJ00nLCB1J+qagScpLAogICAgKDB4QTY4MSwgJ1YnKSwKICAgICgweEE2ODIsICdNJywgdSfqmoMnKSwKICAgICgweEE2ODMsICdWJyksCiAgICAoMHhBNjg0LCAnTScsIHUn6pqFJyksCiAgICAoMHhBNjg1LCAnVicpLAogICAgKDB4QTY4NiwgJ00nLCB1J+qahycpLAogICAgKDB4QTY4NywgJ1YnKSwKICAgICgweEE2ODgsICdNJywgdSfqmoknKSwKICAgICgweEE2ODksICdWJyksCiAgICAoMHhBNjhBLCAnTScsIHUn6pqLJyksCiAgICAoMHhBNjhCLCAnVicpLAogICAgKDB4QTY4QywgJ00nLCB1J+qajScpLAogICAgKDB4QTY4RCwgJ1YnKSwKICAgICgweEE2OEUsICdNJywgdSfqmo8nKSwKICAgICgweEE2OEYsICdWJyksCiAgICAoMHhBNjkwLCAnTScsIHUn6pqRJyksCiAgICAoMHhBNjkxLCAnVicpLAogICAgKDB4QTY5MiwgJ00nLCB1J+qakycpLAogICAgKDB4QTY5MywgJ1YnKSwKICAgICgweEE2OTQsICdNJywgdSfqmpUnKSwKICAgICgweEE2OTUsICdWJyksCiAgICAoMHhBNjk2LCAnTScsIHUn6pqXJyksCiAgICAoMHhBNjk3LCAnVicpLAogICAgKDB4QTY5OCwgJ1gnKSwKICAgICgweEE2OUYsICdWJyksCiAgICAoMHhBNkY4LCAnWCcpLAogICAgKDB4QTcwMCwgJ1YnKSwKICAgICgweEE3MjIsICdNJywgdSfqnKMnKSwKICAgICgweEE3MjMsICdWJyksCiAgICAoMHhBNzI0LCAnTScsIHUn6pylJyksCiAgICAoMHhBNzI1LCAnVicpLAogICAgKDB4QTcyNiwgJ00nLCB1J+qcpycpLAogICAgKDB4QTcyNywgJ1YnKSwKICAgICgweEE3MjgsICdNJywgdSfqnKknKSwKICAgICgweEE3MjksICdWJyksCiAgICAoMHhBNzJBLCAnTScsIHUn6pyrJyksCiAgICAoMHhBNzJCLCAnVicpLAogICAgKDB4QTcyQywgJ00nLCB1J+qcrScpLAogICAgKDB4QTcyRCwgJ1YnKSwKICAgICgweEE3MkUsICdNJywgdSfqnK8nKSwKICAgICgweEE3MkYsICdWJyksCiAgICAoMHhBNzMyLCAnTScsIHUn6pyzJyksCiAgICAoMHhBNzMzLCAnVicpLAogICAgXQoKZGVmIF9zZWdfMzYoKToKICAgIHJldHVybiBbCiAgICAoMHhBNzM0LCAnTScsIHUn6py1JyksCiAgICAoMHhBNzM1LCAnVicpLAogICAgKDB4QTczNiwgJ00nLCB1J+qctycpLAogICAgKDB4QTczNywgJ1YnKSwKICAgICgweEE3MzgsICdNJywgdSfqnLknKSwKICAgICgweEE3MzksICdWJyksCiAgICAoMHhBNzNBLCAnTScsIHUn6py7JyksCiAgICAoMHhBNzNCLCAnVicpLAogICAgKDB4QTczQywgJ00nLCB1J+qcvScpLAogICAgKDB4QTczRCwgJ1YnKSwKICAgICgweEE3M0UsICdNJywgdSfqnL8nKSwKICAgICgweEE3M0YsICdWJyksCiAgICAoMHhBNzQwLCAnTScsIHUn6p2BJyksCiAgICAoMHhBNzQxLCAnVicpLAogICAgKDB4QTc0MiwgJ00nLCB1J+qdgycpLAogICAgKDB4QTc0MywgJ1YnKSwKICAgICgweEE3NDQsICdNJywgdSfqnYUnKSwKICAgICgweEE3NDUsICdWJyksCiAgICAoMHhBNzQ2LCAnTScsIHUn6p2HJyksCiAgICAoMHhBNzQ3LCAnVicpLAogICAgKDB4QTc0OCwgJ00nLCB1J+qdiScpLAogICAgKDB4QTc0OSwgJ1YnKSwKICAgICgweEE3NEEsICdNJywgdSfqnYsnKSwKICAgICgweEE3NEIsICdWJyksCiAgICAoMHhBNzRDLCAnTScsIHUn6p2NJyksCiAgICAoMHhBNzRELCAnVicpLAogICAgKDB4QTc0RSwgJ00nLCB1J+qdjycpLAogICAgKDB4QTc0RiwgJ1YnKSwKICAgICgweEE3NTAsICdNJywgdSfqnZEnKSwKICAgICgweEE3NTEsICdWJyksCiAgICAoMHhBNzUyLCAnTScsIHUn6p2TJyksCiAgICAoMHhBNzUzLCAnVicpLAogICAgKDB4QTc1NCwgJ00nLCB1J+qdlScpLAogICAgKDB4QTc1NSwgJ1YnKSwKICAgICgweEE3NTYsICdNJywgdSfqnZcnKSwKICAgICgweEE3NTcsICdWJyksCiAgICAoMHhBNzU4LCAnTScsIHUn6p2ZJyksCiAgICAoMHhBNzU5LCAnVicpLAogICAgKDB4QTc1QSwgJ00nLCB1J+qdmycpLAogICAgKDB4QTc1QiwgJ1YnKSwKICAgICgweEE3NUMsICdNJywgdSfqnZ0nKSwKICAgICgweEE3NUQsICdWJyksCiAgICAoMHhBNzVFLCAnTScsIHUn6p2fJyksCiAgICAoMHhBNzVGLCAnVicpLAogICAgKDB4QTc2MCwgJ00nLCB1J+qdoScpLAogICAgKDB4QTc2MSwgJ1YnKSwKICAgICgweEE3NjIsICdNJywgdSfqnaMnKSwKICAgICgweEE3NjMsICdWJyksCiAgICAoMHhBNzY0LCAnTScsIHUn6p2lJyksCiAgICAoMHhBNzY1LCAnVicpLAogICAgKDB4QTc2NiwgJ00nLCB1J+qdpycpLAogICAgKDB4QTc2NywgJ1YnKSwKICAgICgweEE3NjgsICdNJywgdSfqnaknKSwKICAgICgweEE3NjksICdWJyksCiAgICAoMHhBNzZBLCAnTScsIHUn6p2rJyksCiAgICAoMHhBNzZCLCAnVicpLAogICAgKDB4QTc2QywgJ00nLCB1J+qdrScpLAogICAgKDB4QTc2RCwgJ1YnKSwKICAgICgweEE3NkUsICdNJywgdSfqna8nKSwKICAgICgweEE3NkYsICdWJyksCiAgICAoMHhBNzcwLCAnTScsIHUn6p2vJyksCiAgICAoMHhBNzcxLCAnVicpLAogICAgKDB4QTc3OSwgJ00nLCB1J+qduicpLAogICAgKDB4QTc3QSwgJ1YnKSwKICAgICgweEE3N0IsICdNJywgdSfqnbwnKSwKICAgICgweEE3N0MsICdWJyksCiAgICAoMHhBNzdELCAnTScsIHUn4bW5JyksCiAgICAoMHhBNzdFLCAnTScsIHUn6p2/JyksCiAgICAoMHhBNzdGLCAnVicpLAogICAgKDB4QTc4MCwgJ00nLCB1J+qegScpLAogICAgKDB4QTc4MSwgJ1YnKSwKICAgICgweEE3ODIsICdNJywgdSfqnoMnKSwKICAgICgweEE3ODMsICdWJyksCiAgICAoMHhBNzg0LCAnTScsIHUn6p6FJyksCiAgICAoMHhBNzg1LCAnVicpLAogICAgKDB4QTc4NiwgJ00nLCB1J+qehycpLAogICAgKDB4QTc4NywgJ1YnKSwKICAgICgweEE3OEIsICdNJywgdSfqnownKSwKICAgICgweEE3OEMsICdWJyksCiAgICAoMHhBNzhELCAnTScsIHUnyaUnKSwKICAgICgweEE3OEUsICdWJyksCiAgICAoMHhBNzhGLCAnWCcpLAogICAgKDB4QTc5MCwgJ00nLCB1J+qekScpLAogICAgKDB4QTc5MSwgJ1YnKSwKICAgICgweEE3OTIsICdNJywgdSfqnpMnKSwKICAgICgweEE3OTMsICdWJyksCiAgICAoMHhBNzk0LCAnWCcpLAogICAgKDB4QTdBMCwgJ00nLCB1J+qeoScpLAogICAgKDB4QTdBMSwgJ1YnKSwKICAgICgweEE3QTIsICdNJywgdSfqnqMnKSwKICAgICgweEE3QTMsICdWJyksCiAgICAoMHhBN0E0LCAnTScsIHUn6p6lJyksCiAgICAoMHhBN0E1LCAnVicpLAogICAgKDB4QTdBNiwgJ00nLCB1J+qepycpLAogICAgKDB4QTdBNywgJ1YnKSwKICAgICgweEE3QTgsICdNJywgdSfqnqknKSwKICAgICgweEE3QTksICdWJyksCiAgICAoMHhBN0FBLCAnTScsIHUnyaYnKSwKICAgICgweEE3QUIsICdYJyksCiAgICAoMHhBN0Y4LCAnTScsIHUnxKcnKSwKICAgIF0KCmRlZiBfc2VnXzM3KCk6CiAgICByZXR1cm4gWwogICAgKDB4QTdGOSwgJ00nLCB1J8WTJyksCiAgICAoMHhBN0ZBLCAnVicpLAogICAgKDB4QTgyQywgJ1gnKSwKICAgICgweEE4MzAsICdWJyksCiAgICAoMHhBODNBLCAnWCcpLAogICAgKDB4QTg0MCwgJ1YnKSwKICAgICgweEE4NzgsICdYJyksCiAgICAoMHhBODgwLCAnVicpLAogICAgKDB4QThDNSwgJ1gnKSwKICAgICgweEE4Q0UsICdWJyksCiAgICAoMHhBOERBLCAnWCcpLAogICAgKDB4QThFMCwgJ1YnKSwKICAgICgweEE4RkMsICdYJyksCiAgICAoMHhBOTAwLCAnVicpLAogICAgKDB4QTk1NCwgJ1gnKSwKICAgICgweEE5NUYsICdWJyksCiAgICAoMHhBOTdELCAnWCcpLAogICAgKDB4QTk4MCwgJ1YnKSwKICAgICgweEE5Q0UsICdYJyksCiAgICAoMHhBOUNGLCAnVicpLAogICAgKDB4QTlEQSwgJ1gnKSwKICAgICgweEE5REUsICdWJyksCiAgICAoMHhBOUUwLCAnWCcpLAogICAgKDB4QUEwMCwgJ1YnKSwKICAgICgweEFBMzcsICdYJyksCiAgICAoMHhBQTQwLCAnVicpLAogICAgKDB4QUE0RSwgJ1gnKSwKICAgICgweEFBNTAsICdWJyksCiAgICAoMHhBQTVBLCAnWCcpLAogICAgKDB4QUE1QywgJ1YnKSwKICAgICgweEFBN0MsICdYJyksCiAgICAoMHhBQTgwLCAnVicpLAogICAgKDB4QUFDMywgJ1gnKSwKICAgICgweEFBREIsICdWJyksCiAgICAoMHhBQUY3LCAnWCcpLAogICAgKDB4QUIwMSwgJ1YnKSwKICAgICgweEFCMDcsICdYJyksCiAgICAoMHhBQjA5LCAnVicpLAogICAgKDB4QUIwRiwgJ1gnKSwKICAgICgweEFCMTEsICdWJyksCiAgICAoMHhBQjE3LCAnWCcpLAogICAgKDB4QUIyMCwgJ1YnKSwKICAgICgweEFCMjcsICdYJyksCiAgICAoMHhBQjI4LCAnVicpLAogICAgKDB4QUIyRiwgJ1gnKSwKICAgICgweEFCQzAsICdWJyksCiAgICAoMHhBQkVFLCAnWCcpLAogICAgKDB4QUJGMCwgJ1YnKSwKICAgICgweEFCRkEsICdYJyksCiAgICAoMHhBQzAwLCAnVicpLAogICAgKDB4RDdBNCwgJ1gnKSwKICAgICgweEQ3QjAsICdWJyksCiAgICAoMHhEN0M3LCAnWCcpLAogICAgKDB4RDdDQiwgJ1YnKSwKICAgICgweEQ3RkMsICdYJyksCiAgICAoMHhGOTAwLCAnTScsIHUn6LGIJyksCiAgICAoMHhGOTAxLCAnTScsIHUn5pu0JyksCiAgICAoMHhGOTAyLCAnTScsIHUn6LuKJyksCiAgICAoMHhGOTAzLCAnTScsIHUn6LOIJyksCiAgICAoMHhGOTA0LCAnTScsIHUn5ruRJyksCiAgICAoMHhGOTA1LCAnTScsIHUn5LiyJyksCiAgICAoMHhGOTA2LCAnTScsIHUn5Y+lJyksCiAgICAoMHhGOTA3LCAnTScsIHUn6b6cJyksCiAgICAoMHhGOTA5LCAnTScsIHUn5aWRJyksCiAgICAoMHhGOTBBLCAnTScsIHUn6YeRJyksCiAgICAoMHhGOTBCLCAnTScsIHUn5ZaHJyksCiAgICAoMHhGOTBDLCAnTScsIHUn5aWIJyksCiAgICAoMHhGOTBELCAnTScsIHUn5oe2JyksCiAgICAoMHhGOTBFLCAnTScsIHUn55mpJyksCiAgICAoMHhGOTBGLCAnTScsIHUn576FJyksCiAgICAoMHhGOTEwLCAnTScsIHUn6Ji/JyksCiAgICAoMHhGOTExLCAnTScsIHUn6J66JyksCiAgICAoMHhGOTEyLCAnTScsIHUn6KO4JyksCiAgICAoMHhGOTEzLCAnTScsIHUn6YKPJyksCiAgICAoMHhGOTE0LCAnTScsIHUn5qiCJyksCiAgICAoMHhGOTE1LCAnTScsIHUn5rSbJyksCiAgICAoMHhGOTE2LCAnTScsIHUn54OZJyksCiAgICAoMHhGOTE3LCAnTScsIHUn54+eJyksCiAgICAoMHhGOTE4LCAnTScsIHUn6JC9JyksCiAgICAoMHhGOTE5LCAnTScsIHUn6YWqJyksCiAgICAoMHhGOTFBLCAnTScsIHUn6aexJyksCiAgICAoMHhGOTFCLCAnTScsIHUn5LqCJyksCiAgICAoMHhGOTFDLCAnTScsIHUn5Y21JyksCiAgICAoMHhGOTFELCAnTScsIHUn5qyEJyksCiAgICAoMHhGOTFFLCAnTScsIHUn54ibJyksCiAgICAoMHhGOTFGLCAnTScsIHUn6JitJyksCiAgICAoMHhGOTIwLCAnTScsIHUn6bieJyksCiAgICAoMHhGOTIxLCAnTScsIHUn5bWQJyksCiAgICAoMHhGOTIyLCAnTScsIHUn5r+rJyksCiAgICAoMHhGOTIzLCAnTScsIHUn6JeNJyksCiAgICAoMHhGOTI0LCAnTScsIHUn6KWkJyksCiAgICAoMHhGOTI1LCAnTScsIHUn5ouJJyksCiAgICAoMHhGOTI2LCAnTScsIHUn6IeYJyksCiAgICAoMHhGOTI3LCAnTScsIHUn6KCfJyksCiAgICAoMHhGOTI4LCAnTScsIHUn5buKJyksCiAgICAoMHhGOTI5LCAnTScsIHUn5pyXJyksCiAgICAoMHhGOTJBLCAnTScsIHUn5rWqJyksCiAgICAoMHhGOTJCLCAnTScsIHUn54u8JyksCiAgICAoMHhGOTJDLCAnTScsIHUn6YOOJyksCiAgICAoMHhGOTJELCAnTScsIHUn5L6GJyksCiAgICBdCgpkZWYgX3NlZ18zOCgpOgogICAgcmV0dXJuIFsKICAgICgweEY5MkUsICdNJywgdSflhrcnKSwKICAgICgweEY5MkYsICdNJywgdSfli54nKSwKICAgICgweEY5MzAsICdNJywgdSfmk4QnKSwKICAgICgweEY5MzEsICdNJywgdSfmq5MnKSwKICAgICgweEY5MzIsICdNJywgdSfniJAnKSwKICAgICgweEY5MzMsICdNJywgdSfnm6cnKSwKICAgICgweEY5MzQsICdNJywgdSfogIEnKSwKICAgICgweEY5MzUsICdNJywgdSfomIYnKSwKICAgICgweEY5MzYsICdNJywgdSfomZwnKSwKICAgICgweEY5MzcsICdNJywgdSfot68nKSwKICAgICgweEY5MzgsICdNJywgdSfpnLInKSwKICAgICgweEY5MzksICdNJywgdSfpra8nKSwKICAgICgweEY5M0EsICdNJywgdSfpt7onKSwKICAgICgweEY5M0IsICdNJywgdSfnoownKSwKICAgICgweEY5M0MsICdNJywgdSfnpb8nKSwKICAgICgweEY5M0QsICdNJywgdSfntqAnKSwKICAgICgweEY5M0UsICdNJywgdSfoj4knKSwKICAgICgweEY5M0YsICdNJywgdSfpjIQnKSwKICAgICgweEY5NDAsICdNJywgdSfpub8nKSwKICAgICgweEY5NDEsICdNJywgdSfoq5YnKSwKICAgICgweEY5NDIsICdNJywgdSflo58nKSwKICAgICgweEY5NDMsICdNJywgdSflvIQnKSwKICAgICgweEY5NDQsICdNJywgdSfnsaAnKSwKICAgICgweEY5NDUsICdNJywgdSfogb4nKSwKICAgICgweEY5NDYsICdNJywgdSfniaInKSwKICAgICgweEY5NDcsICdNJywgdSfno4onKSwKICAgICgweEY5NDgsICdNJywgdSfos4InKSwKICAgICgweEY5NDksICdNJywgdSfpm7cnKSwKICAgICgweEY5NEEsICdNJywgdSflo5gnKSwKICAgICgweEY5NEIsICdNJywgdSflsaInKSwKICAgICgweEY5NEMsICdNJywgdSfmqJMnKSwKICAgICgweEY5NEQsICdNJywgdSfmt5onKSwKICAgICgweEY5NEUsICdNJywgdSfmvI8nKSwKICAgICgweEY5NEYsICdNJywgdSfntK8nKSwKICAgICgweEY5NTAsICdNJywgdSfnuLcnKSwKICAgICgweEY5NTEsICdNJywgdSfpmYsnKSwKICAgICgweEY5NTIsICdNJywgdSfli5InKSwKICAgICgweEY5NTMsICdNJywgdSfogosnKSwKICAgICgweEY5NTQsICdNJywgdSflh5wnKSwKICAgICgweEY5NTUsICdNJywgdSflh4wnKSwKICAgICgweEY5NTYsICdNJywgdSfnqJwnKSwKICAgICgweEY5NTcsICdNJywgdSfntr4nKSwKICAgICgweEY5NTgsICdNJywgdSfoj7EnKSwKICAgICgweEY5NTksICdNJywgdSfpmbUnKSwKICAgICgweEY5NUEsICdNJywgdSforoAnKSwKICAgICgweEY5NUIsICdNJywgdSfmi48nKSwKICAgICgweEY5NUMsICdNJywgdSfmqIInKSwKICAgICgweEY5NUQsICdNJywgdSfoq74nKSwKICAgICgweEY5NUUsICdNJywgdSfkuLknKSwKICAgICgweEY5NUYsICdNJywgdSflr6cnKSwKICAgICgweEY5NjAsICdNJywgdSfmgJInKSwKICAgICgweEY5NjEsICdNJywgdSfnjocnKSwKICAgICgweEY5NjIsICdNJywgdSfnlbAnKSwKICAgICgweEY5NjMsICdNJywgdSfljJcnKSwKICAgICgweEY5NjQsICdNJywgdSfno7snKSwKICAgICgweEY5NjUsICdNJywgdSfkvr8nKSwKICAgICgweEY5NjYsICdNJywgdSflvqknKSwKICAgICgweEY5NjcsICdNJywgdSfkuI0nKSwKICAgICgweEY5NjgsICdNJywgdSfms4wnKSwKICAgICgweEY5NjksICdNJywgdSfmlbgnKSwKICAgICgweEY5NkEsICdNJywgdSfntKInKSwKICAgICgweEY5NkIsICdNJywgdSflj4MnKSwKICAgICgweEY5NkMsICdNJywgdSfloZ4nKSwKICAgICgweEY5NkQsICdNJywgdSfnnIEnKSwKICAgICgweEY5NkUsICdNJywgdSfokYknKSwKICAgICgweEY5NkYsICdNJywgdSfoqqonKSwKICAgICgweEY5NzAsICdNJywgdSfmrronKSwKICAgICgweEY5NzEsICdNJywgdSfovrAnKSwKICAgICgweEY5NzIsICdNJywgdSfmsognKSwKICAgICgweEY5NzMsICdNJywgdSfmi74nKSwKICAgICgweEY5NzQsICdNJywgdSfoi6UnKSwKICAgICgweEY5NzUsICdNJywgdSfmjqAnKSwKICAgICgweEY5NzYsICdNJywgdSfnlaUnKSwKICAgICgweEY5NzcsICdNJywgdSfkuq4nKSwKICAgICgweEY5NzgsICdNJywgdSflhaknKSwKICAgICgweEY5NzksICdNJywgdSflh4knKSwKICAgICgweEY5N0EsICdNJywgdSfmooEnKSwKICAgICgweEY5N0IsICdNJywgdSfns6cnKSwKICAgICgweEY5N0MsICdNJywgdSfoia8nKSwKICAgICgweEY5N0QsICdNJywgdSfoq5InKSwKICAgICgweEY5N0UsICdNJywgdSfph48nKSwKICAgICgweEY5N0YsICdNJywgdSfli7UnKSwKICAgICgweEY5ODAsICdNJywgdSflkYInKSwKICAgICgweEY5ODEsICdNJywgdSflpbMnKSwKICAgICgweEY5ODIsICdNJywgdSflu6wnKSwKICAgICgweEY5ODMsICdNJywgdSfml4UnKSwKICAgICgweEY5ODQsICdNJywgdSfmv74nKSwKICAgICgweEY5ODUsICdNJywgdSfnpKonKSwKICAgICgweEY5ODYsICdNJywgdSfplq0nKSwKICAgICgweEY5ODcsICdNJywgdSfpqaonKSwKICAgICgweEY5ODgsICdNJywgdSfpupcnKSwKICAgICgweEY5ODksICdNJywgdSfpu44nKSwKICAgICgweEY5OEEsICdNJywgdSflipsnKSwKICAgICgweEY5OEIsICdNJywgdSfmm4YnKSwKICAgICgweEY5OEMsICdNJywgdSfmrbcnKSwKICAgICgweEY5OEQsICdNJywgdSfovaInKSwKICAgICgweEY5OEUsICdNJywgdSflubQnKSwKICAgICgweEY5OEYsICdNJywgdSfmhpAnKSwKICAgICgweEY5OTAsICdNJywgdSfmiIAnKSwKICAgICgweEY5OTEsICdNJywgdSfmkponKSwKICAgIF0KCmRlZiBfc2VnXzM5KCk6CiAgICByZXR1cm4gWwogICAgKDB4Rjk5MiwgJ00nLCB1J+a8oycpLAogICAgKDB4Rjk5MywgJ00nLCB1J+eFiScpLAogICAgKDB4Rjk5NCwgJ00nLCB1J+eSiScpLAogICAgKDB4Rjk5NSwgJ00nLCB1J+eniicpLAogICAgKDB4Rjk5NiwgJ00nLCB1J+e3tCcpLAogICAgKDB4Rjk5NywgJ00nLCB1J+iBrycpLAogICAgKDB4Rjk5OCwgJ00nLCB1J+i8picpLAogICAgKDB4Rjk5OSwgJ00nLCB1J+iTricpLAogICAgKDB4Rjk5QSwgJ00nLCB1J+mAoycpLAogICAgKDB4Rjk5QiwgJ00nLCB1J+mNiicpLAogICAgKDB4Rjk5QywgJ00nLCB1J+WIlycpLAogICAgKDB4Rjk5RCwgJ00nLCB1J+WKoycpLAogICAgKDB4Rjk5RSwgJ00nLCB1J+WSvScpLAogICAgKDB4Rjk5RiwgJ00nLCB1J+eDiCcpLAogICAgKDB4RjlBMCwgJ00nLCB1J+ijgicpLAogICAgKDB4RjlBMSwgJ00nLCB1J+iqqicpLAogICAgKDB4RjlBMiwgJ00nLCB1J+W7iScpLAogICAgKDB4RjlBMywgJ00nLCB1J+W/tScpLAogICAgKDB4RjlBNCwgJ00nLCB1J+aNuycpLAogICAgKDB4RjlBNSwgJ00nLCB1J+auricpLAogICAgKDB4RjlBNiwgJ00nLCB1J+ewvicpLAogICAgKDB4RjlBNywgJ00nLCB1J+eNtScpLAogICAgKDB4RjlBOCwgJ00nLCB1J+S7pCcpLAogICAgKDB4RjlBOSwgJ00nLCB1J+WbuScpLAogICAgKDB4RjlBQSwgJ00nLCB1J+WvpycpLAogICAgKDB4RjlBQiwgJ00nLCB1J+W2uicpLAogICAgKDB4RjlBQywgJ00nLCB1J+aAnCcpLAogICAgKDB4RjlBRCwgJ00nLCB1J+eOsicpLAogICAgKDB4RjlBRSwgJ00nLCB1J+eRqScpLAogICAgKDB4RjlBRiwgJ00nLCB1J+e+micpLAogICAgKDB4RjlCMCwgJ00nLCB1J+iBhicpLAogICAgKDB4RjlCMSwgJ00nLCB1J+mItCcpLAogICAgKDB4RjlCMiwgJ00nLCB1J+mbticpLAogICAgKDB4RjlCMywgJ00nLCB1J+mdiCcpLAogICAgKDB4RjlCNCwgJ00nLCB1J+mgmCcpLAogICAgKDB4RjlCNSwgJ00nLCB1J+S+iycpLAogICAgKDB4RjlCNiwgJ00nLCB1J+emricpLAogICAgKDB4RjlCNywgJ00nLCB1J+mGtCcpLAogICAgKDB4RjlCOCwgJ00nLCB1J+mauCcpLAogICAgKDB4RjlCOSwgJ00nLCB1J+aDoScpLAogICAgKDB4RjlCQSwgJ00nLCB1J+S6hicpLAogICAgKDB4RjlCQiwgJ00nLCB1J+WDmicpLAogICAgKDB4RjlCQywgJ00nLCB1J+WvricpLAogICAgKDB4RjlCRCwgJ00nLCB1J+WwvycpLAogICAgKDB4RjlCRSwgJ00nLCB1J+aWmScpLAogICAgKDB4RjlCRiwgJ00nLCB1J+aogicpLAogICAgKDB4RjlDMCwgJ00nLCB1J+eHjicpLAogICAgKDB4RjlDMSwgJ00nLCB1J+eZgicpLAogICAgKDB4RjlDMiwgJ00nLCB1J+iTvCcpLAogICAgKDB4RjlDMywgJ00nLCB1J+mBvCcpLAogICAgKDB4RjlDNCwgJ00nLCB1J+m+jScpLAogICAgKDB4RjlDNSwgJ00nLCB1J+aaiCcpLAogICAgKDB4RjlDNiwgJ00nLCB1J+mYricpLAogICAgKDB4RjlDNywgJ00nLCB1J+WKiScpLAogICAgKDB4RjlDOCwgJ00nLCB1J+aduycpLAogICAgKDB4RjlDOSwgJ00nLCB1J+afsycpLAogICAgKDB4RjlDQSwgJ00nLCB1J+a1gScpLAogICAgKDB4RjlDQiwgJ00nLCB1J+a6nCcpLAogICAgKDB4RjlDQywgJ00nLCB1J+eQiScpLAogICAgKDB4RjlDRCwgJ00nLCB1J+eVmScpLAogICAgKDB4RjlDRSwgJ00nLCB1J+ehqycpLAogICAgKDB4RjlDRiwgJ00nLCB1J+e0kCcpLAogICAgKDB4RjlEMCwgJ00nLCB1J+mhnicpLAogICAgKDB4RjlEMSwgJ00nLCB1J+WFrScpLAogICAgKDB4RjlEMiwgJ00nLCB1J+aIricpLAogICAgKDB4RjlEMywgJ00nLCB1J+mZuCcpLAogICAgKDB4RjlENCwgJ00nLCB1J+WAqycpLAogICAgKDB4RjlENSwgJ00nLCB1J+W0mScpLAogICAgKDB4RjlENiwgJ00nLCB1J+a3qicpLAogICAgKDB4RjlENywgJ00nLCB1J+i8qicpLAogICAgKDB4RjlEOCwgJ00nLCB1J+W+iycpLAogICAgKDB4RjlEOSwgJ00nLCB1J+aFhCcpLAogICAgKDB4RjlEQSwgJ00nLCB1J+aglycpLAogICAgKDB4RjlEQiwgJ00nLCB1J+eOhycpLAogICAgKDB4RjlEQywgJ00nLCB1J+mahicpLAogICAgKDB4RjlERCwgJ00nLCB1J+WIqScpLAogICAgKDB4RjlERSwgJ00nLCB1J+WQjycpLAogICAgKDB4RjlERiwgJ00nLCB1J+WxpScpLAogICAgKDB4RjlFMCwgJ00nLCB1J+aYkycpLAogICAgKDB4RjlFMSwgJ00nLCB1J+adjicpLAogICAgKDB4RjlFMiwgJ00nLCB1J+aiqCcpLAogICAgKDB4RjlFMywgJ00nLCB1J+azpScpLAogICAgKDB4RjlFNCwgJ00nLCB1J+eQhicpLAogICAgKDB4RjlFNSwgJ00nLCB1J+eXoicpLAogICAgKDB4RjlFNiwgJ00nLCB1J+e9uScpLAogICAgKDB4RjlFNywgJ00nLCB1J+ijjycpLAogICAgKDB4RjlFOCwgJ00nLCB1J+ijoScpLAogICAgKDB4RjlFOSwgJ00nLCB1J+mHjCcpLAogICAgKDB4RjlFQSwgJ00nLCB1J+mboicpLAogICAgKDB4RjlFQiwgJ00nLCB1J+WMvycpLAogICAgKDB4RjlFQywgJ00nLCB1J+a6uicpLAogICAgKDB4RjlFRCwgJ00nLCB1J+WQnScpLAogICAgKDB4RjlFRSwgJ00nLCB1J+eHkCcpLAogICAgKDB4RjlFRiwgJ00nLCB1J+eSmCcpLAogICAgKDB4RjlGMCwgJ00nLCB1J+iXuicpLAogICAgKDB4RjlGMSwgJ00nLCB1J+maoycpLAogICAgKDB4RjlGMiwgJ00nLCB1J+mxlycpLAogICAgKDB4RjlGMywgJ00nLCB1J+m6nycpLAogICAgKDB4RjlGNCwgJ00nLCB1J+aelycpLAogICAgKDB4RjlGNSwgJ00nLCB1J+a3iycpLAogICAgXQoKZGVmIF9zZWdfNDAoKToKICAgIHJldHVybiBbCiAgICAoMHhGOUY2LCAnTScsIHUn6IeoJyksCiAgICAoMHhGOUY3LCAnTScsIHUn56uLJyksCiAgICAoMHhGOUY4LCAnTScsIHUn56ygJyksCiAgICAoMHhGOUY5LCAnTScsIHUn57KSJyksCiAgICAoMHhGOUZBLCAnTScsIHUn54uAJyksCiAgICAoMHhGOUZCLCAnTScsIHUn54KZJyksCiAgICAoMHhGOUZDLCAnTScsIHUn6K2YJyksCiAgICAoMHhGOUZELCAnTScsIHUn5LuAJyksCiAgICAoMHhGOUZFLCAnTScsIHUn6Iy2JyksCiAgICAoMHhGOUZGLCAnTScsIHUn5Yi6JyksCiAgICAoMHhGQTAwLCAnTScsIHUn5YiHJyksCiAgICAoMHhGQTAxLCAnTScsIHUn5bqmJyksCiAgICAoMHhGQTAyLCAnTScsIHUn5ouTJyksCiAgICAoMHhGQTAzLCAnTScsIHUn57OWJyksCiAgICAoMHhGQTA0LCAnTScsIHUn5a6FJyksCiAgICAoMHhGQTA1LCAnTScsIHUn5rSeJyksCiAgICAoMHhGQTA2LCAnTScsIHUn5pq0JyksCiAgICAoMHhGQTA3LCAnTScsIHUn6Ly7JyksCiAgICAoMHhGQTA4LCAnTScsIHUn6KGMJyksCiAgICAoMHhGQTA5LCAnTScsIHUn6ZmNJyksCiAgICAoMHhGQTBBLCAnTScsIHUn6KaLJyksCiAgICAoMHhGQTBCLCAnTScsIHUn5buTJyksCiAgICAoMHhGQTBDLCAnTScsIHUn5YWAJyksCiAgICAoMHhGQTBELCAnTScsIHUn5ZeAJyksCiAgICAoMHhGQTBFLCAnVicpLAogICAgKDB4RkExMCwgJ00nLCB1J+WhmicpLAogICAgKDB4RkExMSwgJ1YnKSwKICAgICgweEZBMTIsICdNJywgdSfmmbQnKSwKICAgICgweEZBMTMsICdWJyksCiAgICAoMHhGQTE1LCAnTScsIHUn5YeeJyksCiAgICAoMHhGQTE2LCAnTScsIHUn54yqJyksCiAgICAoMHhGQTE3LCAnTScsIHUn55uKJyksCiAgICAoMHhGQTE4LCAnTScsIHUn56S8JyksCiAgICAoMHhGQTE5LCAnTScsIHUn56WeJyksCiAgICAoMHhGQTFBLCAnTScsIHUn56WlJyksCiAgICAoMHhGQTFCLCAnTScsIHUn56aPJyksCiAgICAoMHhGQTFDLCAnTScsIHUn6Z2WJyksCiAgICAoMHhGQTFELCAnTScsIHUn57K+JyksCiAgICAoMHhGQTFFLCAnTScsIHUn5769JyksCiAgICAoMHhGQTFGLCAnVicpLAogICAgKDB4RkEyMCwgJ00nLCB1J+iYkicpLAogICAgKDB4RkEyMSwgJ1YnKSwKICAgICgweEZBMjIsICdNJywgdSfoq7gnKSwKICAgICgweEZBMjMsICdWJyksCiAgICAoMHhGQTI1LCAnTScsIHUn6YC4JyksCiAgICAoMHhGQTI2LCAnTScsIHUn6YO9JyksCiAgICAoMHhGQTI3LCAnVicpLAogICAgKDB4RkEyQSwgJ00nLCB1J+mjrycpLAogICAgKDB4RkEyQiwgJ00nLCB1J+mjvCcpLAogICAgKDB4RkEyQywgJ00nLCB1J+mkqCcpLAogICAgKDB4RkEyRCwgJ00nLCB1J+m2tCcpLAogICAgKDB4RkEyRSwgJ00nLCB1J+mDnicpLAogICAgKDB4RkEyRiwgJ00nLCB1J+matycpLAogICAgKDB4RkEzMCwgJ00nLCB1J+S+ricpLAogICAgKDB4RkEzMSwgJ00nLCB1J+WDpycpLAogICAgKDB4RkEzMiwgJ00nLCB1J+WFjScpLAogICAgKDB4RkEzMywgJ00nLCB1J+WLiScpLAogICAgKDB4RkEzNCwgJ00nLCB1J+WLpCcpLAogICAgKDB4RkEzNSwgJ00nLCB1J+WNkScpLAogICAgKDB4RkEzNiwgJ00nLCB1J+WWnScpLAogICAgKDB4RkEzNywgJ00nLCB1J+WYhicpLAogICAgKDB4RkEzOCwgJ00nLCB1J+WZqCcpLAogICAgKDB4RkEzOSwgJ00nLCB1J+WhgCcpLAogICAgKDB4RkEzQSwgJ00nLCB1J+WiqCcpLAogICAgKDB4RkEzQiwgJ00nLCB1J+WxpCcpLAogICAgKDB4RkEzQywgJ00nLCB1J+WxricpLAogICAgKDB4RkEzRCwgJ00nLCB1J+aClCcpLAogICAgKDB4RkEzRSwgJ00nLCB1J+aFqCcpLAogICAgKDB4RkEzRiwgJ00nLCB1J+aGjicpLAogICAgKDB4RkE0MCwgJ00nLCB1J+aHsicpLAogICAgKDB4RkE0MSwgJ00nLCB1J+aVjycpLAogICAgKDB4RkE0MiwgJ00nLCB1J+aXoicpLAogICAgKDB4RkE0MywgJ00nLCB1J+aakScpLAogICAgKDB4RkE0NCwgJ00nLCB1J+aihScpLAogICAgKDB4RkE0NSwgJ00nLCB1J+a1tycpLAogICAgKDB4RkE0NiwgJ00nLCB1J+a4micpLAogICAgKDB4RkE0NywgJ00nLCB1J+a8oicpLAogICAgKDB4RkE0OCwgJ00nLCB1J+eFricpLAogICAgKDB4RkE0OSwgJ00nLCB1J+eIqycpLAogICAgKDB4RkE0QSwgJ00nLCB1J+eQoicpLAogICAgKDB4RkE0QiwgJ00nLCB1J+eikScpLAogICAgKDB4RkE0QywgJ00nLCB1J+ekvicpLAogICAgKDB4RkE0RCwgJ00nLCB1J+eliScpLAogICAgKDB4RkE0RSwgJ00nLCB1J+eliCcpLAogICAgKDB4RkE0RiwgJ00nLCB1J+elkCcpLAogICAgKDB4RkE1MCwgJ00nLCB1J+ellicpLAogICAgKDB4RkE1MSwgJ00nLCB1J+elnScpLAogICAgKDB4RkE1MiwgJ00nLCB1J+emjScpLAogICAgKDB4RkE1MywgJ00nLCB1J+emjicpLAogICAgKDB4RkE1NCwgJ00nLCB1J+epgCcpLAogICAgKDB4RkE1NSwgJ00nLCB1J+eqgScpLAogICAgKDB4RkE1NiwgJ00nLCB1J+evgCcpLAogICAgKDB4RkE1NywgJ00nLCB1J+e3tCcpLAogICAgKDB4RkE1OCwgJ00nLCB1J+e4iScpLAogICAgKDB4RkE1OSwgJ00nLCB1J+e5gScpLAogICAgKDB4RkE1QSwgJ00nLCB1J+e9sicpLAogICAgKDB4RkE1QiwgJ00nLCB1J+iAhScpLAogICAgKDB4RkE1QywgJ00nLCB1J+iHrScpLAogICAgKDB4RkE1RCwgJ00nLCB1J+iJuScpLAogICAgKDB4RkE1RiwgJ00nLCB1J+iRlycpLAogICAgXQoKZGVmIF9zZWdfNDEoKToKICAgIHJldHVybiBbCiAgICAoMHhGQTYwLCAnTScsIHUn6KSQJyksCiAgICAoMHhGQTYxLCAnTScsIHUn6KaWJyksCiAgICAoMHhGQTYyLCAnTScsIHUn6KyBJyksCiAgICAoMHhGQTYzLCAnTScsIHUn6Ky5JyksCiAgICAoMHhGQTY0LCAnTScsIHUn6LOTJyksCiAgICAoMHhGQTY1LCAnTScsIHUn6LSIJyksCiAgICAoMHhGQTY2LCAnTScsIHUn6L62JyksCiAgICAoMHhGQTY3LCAnTScsIHUn6YC4JyksCiAgICAoMHhGQTY4LCAnTScsIHUn6ZujJyksCiAgICAoMHhGQTY5LCAnTScsIHUn6Z+/JyksCiAgICAoMHhGQTZBLCAnTScsIHUn6aC7JyksCiAgICAoMHhGQTZCLCAnTScsIHUn5oG1JyksCiAgICAoMHhGQTZDLCAnTScsIHUn8KSLricpLAogICAgKDB4RkE2RCwgJ00nLCB1J+iImCcpLAogICAgKDB4RkE2RSwgJ1gnKSwKICAgICgweEZBNzAsICdNJywgdSfkuKYnKSwKICAgICgweEZBNzEsICdNJywgdSflhrUnKSwKICAgICgweEZBNzIsICdNJywgdSflhagnKSwKICAgICgweEZBNzMsICdNJywgdSfkvoAnKSwKICAgICgweEZBNzQsICdNJywgdSflhYUnKSwKICAgICgweEZBNzUsICdNJywgdSflhoAnKSwKICAgICgweEZBNzYsICdNJywgdSfli4cnKSwKICAgICgweEZBNzcsICdNJywgdSfli7onKSwKICAgICgweEZBNzgsICdNJywgdSfllp0nKSwKICAgICgweEZBNzksICdNJywgdSfllZUnKSwKICAgICgweEZBN0EsICdNJywgdSfllpknKSwKICAgICgweEZBN0IsICdNJywgdSfll6InKSwKICAgICgweEZBN0MsICdNJywgdSfloZonKSwKICAgICgweEZBN0QsICdNJywgdSflorMnKSwKICAgICgweEZBN0UsICdNJywgdSflpYQnKSwKICAgICgweEZBN0YsICdNJywgdSflpZQnKSwKICAgICgweEZBODAsICdNJywgdSflqaInKSwKICAgICgweEZBODEsICdNJywgdSflrKgnKSwKICAgICgweEZBODIsICdNJywgdSflu5InKSwKICAgICgweEZBODMsICdNJywgdSflu5knKSwKICAgICgweEZBODQsICdNJywgdSflvaknKSwKICAgICgweEZBODUsICdNJywgdSflvq0nKSwKICAgICgweEZBODYsICdNJywgdSfmg5gnKSwKICAgICgweEZBODcsICdNJywgdSfmhY4nKSwKICAgICgweEZBODgsICdNJywgdSfmhIgnKSwKICAgICgweEZBODksICdNJywgdSfmho4nKSwKICAgICgweEZBOEEsICdNJywgdSfmhaAnKSwKICAgICgweEZBOEIsICdNJywgdSfmh7InKSwKICAgICgweEZBOEMsICdNJywgdSfmiLQnKSwKICAgICgweEZBOEQsICdNJywgdSfmj4QnKSwKICAgICgweEZBOEUsICdNJywgdSfmkJwnKSwKICAgICgweEZBOEYsICdNJywgdSfmkZInKSwKICAgICgweEZBOTAsICdNJywgdSfmlZYnKSwKICAgICgweEZBOTEsICdNJywgdSfmmbQnKSwKICAgICgweEZBOTIsICdNJywgdSfmnJcnKSwKICAgICgweEZBOTMsICdNJywgdSfmnJsnKSwKICAgICgweEZBOTQsICdNJywgdSfmnZYnKSwKICAgICgweEZBOTUsICdNJywgdSfmrbknKSwKICAgICgweEZBOTYsICdNJywgdSfmrronKSwKICAgICgweEZBOTcsICdNJywgdSfmtYEnKSwKICAgICgweEZBOTgsICdNJywgdSfmu5snKSwKICAgICgweEZBOTksICdNJywgdSfmu4snKSwKICAgICgweEZBOUEsICdNJywgdSfmvKInKSwKICAgICgweEZBOUIsICdNJywgdSfngJ4nKSwKICAgICgweEZBOUMsICdNJywgdSfnha4nKSwKICAgICgweEZBOUQsICdNJywgdSfnnqcnKSwKICAgICgweEZBOUUsICdNJywgdSfniLUnKSwKICAgICgweEZBOUYsICdNJywgdSfniq8nKSwKICAgICgweEZBQTAsICdNJywgdSfnjKonKSwKICAgICgweEZBQTEsICdNJywgdSfnkbEnKSwKICAgICgweEZBQTIsICdNJywgdSfnlIYnKSwKICAgICgweEZBQTMsICdNJywgdSfnlLsnKSwKICAgICgweEZBQTQsICdNJywgdSfnmJ0nKSwKICAgICgweEZBQTUsICdNJywgdSfnmJ8nKSwKICAgICgweEZBQTYsICdNJywgdSfnm4onKSwKICAgICgweEZBQTcsICdNJywgdSfnm5snKSwKICAgICgweEZBQTgsICdNJywgdSfnm7QnKSwKICAgICgweEZBQTksICdNJywgdSfnnYonKSwKICAgICgweEZBQUEsICdNJywgdSfnnYAnKSwKICAgICgweEZBQUIsICdNJywgdSfno4wnKSwKICAgICgweEZBQUMsICdNJywgdSfnqrEnKSwKICAgICgweEZBQUQsICdNJywgdSfnr4AnKSwKICAgICgweEZBQUUsICdNJywgdSfnsbsnKSwKICAgICgweEZBQUYsICdNJywgdSfntZsnKSwKICAgICgweEZBQjAsICdNJywgdSfnt7QnKSwKICAgICgweEZBQjEsICdNJywgdSfnvL4nKSwKICAgICgweEZBQjIsICdNJywgdSfogIUnKSwKICAgICgweEZBQjMsICdNJywgdSfojZInKSwKICAgICgweEZBQjQsICdNJywgdSfoj68nKSwKICAgICgweEZBQjUsICdNJywgdSfonbknKSwKICAgICgweEZBQjYsICdNJywgdSfopYEnKSwKICAgICgweEZBQjcsICdNJywgdSfopoYnKSwKICAgICgweEZBQjgsICdNJywgdSfoppYnKSwKICAgICgweEZBQjksICdNJywgdSfoqr8nKSwKICAgICgweEZBQkEsICdNJywgdSfoq7gnKSwKICAgICgweEZBQkIsICdNJywgdSfoq4snKSwKICAgICgweEZBQkMsICdNJywgdSforIEnKSwKICAgICgweEZBQkQsICdNJywgdSfoq74nKSwKICAgICgweEZBQkUsICdNJywgdSfoq60nKSwKICAgICgweEZBQkYsICdNJywgdSforLknKSwKICAgICgweEZBQzAsICdNJywgdSforoonKSwKICAgICgweEZBQzEsICdNJywgdSfotIgnKSwKICAgICgweEZBQzIsICdNJywgdSfovLgnKSwKICAgICgweEZBQzMsICdNJywgdSfpgbInKSwKICAgICgweEZBQzQsICdNJywgdSfphpknKSwKICAgIF0KCmRlZiBfc2VnXzQyKCk6CiAgICByZXR1cm4gWwogICAgKDB4RkFDNSwgJ00nLCB1J+mJticpLAogICAgKDB4RkFDNiwgJ00nLCB1J+mZvCcpLAogICAgKDB4RkFDNywgJ00nLCB1J+mboycpLAogICAgKDB4RkFDOCwgJ00nLCB1J+mdlicpLAogICAgKDB4RkFDOSwgJ00nLCB1J+mfmycpLAogICAgKDB4RkFDQSwgJ00nLCB1J+mfvycpLAogICAgKDB4RkFDQiwgJ00nLCB1J+mgiycpLAogICAgKDB4RkFDQywgJ00nLCB1J+mguycpLAogICAgKDB4RkFDRCwgJ00nLCB1J+mskicpLAogICAgKDB4RkFDRSwgJ00nLCB1J+m+nCcpLAogICAgKDB4RkFDRiwgJ00nLCB1J/CioYonKSwKICAgICgweEZBRDAsICdNJywgdSfwoqGEJyksCiAgICAoMHhGQUQxLCAnTScsIHUn8KOPlScpLAogICAgKDB4RkFEMiwgJ00nLCB1J+OunScpLAogICAgKDB4RkFEMywgJ00nLCB1J+SAmCcpLAogICAgKDB4RkFENCwgJ00nLCB1J+SAuScpLAogICAgKDB4RkFENSwgJ00nLCB1J/CliYknKSwKICAgICgweEZBRDYsICdNJywgdSfwpbOQJyksCiAgICAoMHhGQUQ3LCAnTScsIHUn8Ke7kycpLAogICAgKDB4RkFEOCwgJ00nLCB1J+m9gycpLAogICAgKDB4RkFEOSwgJ00nLCB1J+m+jicpLAogICAgKDB4RkFEQSwgJ1gnKSwKICAgICgweEZCMDAsICdNJywgdSdmZicpLAogICAgKDB4RkIwMSwgJ00nLCB1J2ZpJyksCiAgICAoMHhGQjAyLCAnTScsIHUnZmwnKSwKICAgICgweEZCMDMsICdNJywgdSdmZmknKSwKICAgICgweEZCMDQsICdNJywgdSdmZmwnKSwKICAgICgweEZCMDUsICdNJywgdSdzdCcpLAogICAgKDB4RkIwNywgJ1gnKSwKICAgICgweEZCMTMsICdNJywgdSfVtNW2JyksCiAgICAoMHhGQjE0LCAnTScsIHUn1bTVpScpLAogICAgKDB4RkIxNSwgJ00nLCB1J9W01asnKSwKICAgICgweEZCMTYsICdNJywgdSfVvtW2JyksCiAgICAoMHhGQjE3LCAnTScsIHUn1bTVrScpLAogICAgKDB4RkIxOCwgJ1gnKSwKICAgICgweEZCMUQsICdNJywgdSfXmda0JyksCiAgICAoMHhGQjFFLCAnVicpLAogICAgKDB4RkIxRiwgJ00nLCB1J9ey1rcnKSwKICAgICgweEZCMjAsICdNJywgdSfXoicpLAogICAgKDB4RkIyMSwgJ00nLCB1J9eQJyksCiAgICAoMHhGQjIyLCAnTScsIHUn15MnKSwKICAgICgweEZCMjMsICdNJywgdSfXlCcpLAogICAgKDB4RkIyNCwgJ00nLCB1J9ebJyksCiAgICAoMHhGQjI1LCAnTScsIHUn15wnKSwKICAgICgweEZCMjYsICdNJywgdSfXnScpLAogICAgKDB4RkIyNywgJ00nLCB1J9eoJyksCiAgICAoMHhGQjI4LCAnTScsIHUn16onKSwKICAgICgweEZCMjksICczJywgdScrJyksCiAgICAoMHhGQjJBLCAnTScsIHUn16nXgScpLAogICAgKDB4RkIyQiwgJ00nLCB1J9ep14InKSwKICAgICgweEZCMkMsICdNJywgdSfXqda814EnKSwKICAgICgweEZCMkQsICdNJywgdSfXqda814InKSwKICAgICgweEZCMkUsICdNJywgdSfXkNa3JyksCiAgICAoMHhGQjJGLCAnTScsIHUn15DWuCcpLAogICAgKDB4RkIzMCwgJ00nLCB1J9eQ1rwnKSwKICAgICgweEZCMzEsICdNJywgdSfXkda8JyksCiAgICAoMHhGQjMyLCAnTScsIHUn15LWvCcpLAogICAgKDB4RkIzMywgJ00nLCB1J9eT1rwnKSwKICAgICgweEZCMzQsICdNJywgdSfXlNa8JyksCiAgICAoMHhGQjM1LCAnTScsIHUn15XWvCcpLAogICAgKDB4RkIzNiwgJ00nLCB1J9eW1rwnKSwKICAgICgweEZCMzcsICdYJyksCiAgICAoMHhGQjM4LCAnTScsIHUn15jWvCcpLAogICAgKDB4RkIzOSwgJ00nLCB1J9eZ1rwnKSwKICAgICgweEZCM0EsICdNJywgdSfXmta8JyksCiAgICAoMHhGQjNCLCAnTScsIHUn15vWvCcpLAogICAgKDB4RkIzQywgJ00nLCB1J9ec1rwnKSwKICAgICgweEZCM0QsICdYJyksCiAgICAoMHhGQjNFLCAnTScsIHUn157WvCcpLAogICAgKDB4RkIzRiwgJ1gnKSwKICAgICgweEZCNDAsICdNJywgdSfXoNa8JyksCiAgICAoMHhGQjQxLCAnTScsIHUn16HWvCcpLAogICAgKDB4RkI0MiwgJ1gnKSwKICAgICgweEZCNDMsICdNJywgdSfXo9a8JyksCiAgICAoMHhGQjQ0LCAnTScsIHUn16TWvCcpLAogICAgKDB4RkI0NSwgJ1gnKSwKICAgICgweEZCNDYsICdNJywgdSfXpta8JyksCiAgICAoMHhGQjQ3LCAnTScsIHUn16fWvCcpLAogICAgKDB4RkI0OCwgJ00nLCB1J9eo1rwnKSwKICAgICgweEZCNDksICdNJywgdSfXqda8JyksCiAgICAoMHhGQjRBLCAnTScsIHUn16rWvCcpLAogICAgKDB4RkI0QiwgJ00nLCB1J9eV1rknKSwKICAgICgweEZCNEMsICdNJywgdSfXkda/JyksCiAgICAoMHhGQjRELCAnTScsIHUn15vWvycpLAogICAgKDB4RkI0RSwgJ00nLCB1J9ek1r8nKSwKICAgICgweEZCNEYsICdNJywgdSfXkNecJyksCiAgICAoMHhGQjUwLCAnTScsIHUn2bEnKSwKICAgICgweEZCNTIsICdNJywgdSfZuycpLAogICAgKDB4RkI1NiwgJ00nLCB1J9m+JyksCiAgICAoMHhGQjVBLCAnTScsIHUn2oAnKSwKICAgICgweEZCNUUsICdNJywgdSfZuicpLAogICAgKDB4RkI2MiwgJ00nLCB1J9m/JyksCiAgICAoMHhGQjY2LCAnTScsIHUn2bknKSwKICAgICgweEZCNkEsICdNJywgdSfapCcpLAogICAgKDB4RkI2RSwgJ00nLCB1J9qmJyksCiAgICAoMHhGQjcyLCAnTScsIHUn2oQnKSwKICAgICgweEZCNzYsICdNJywgdSfagycpLAogICAgKDB4RkI3QSwgJ00nLCB1J9qGJyksCiAgICAoMHhGQjdFLCAnTScsIHUn2ocnKSwKICAgICgweEZCODIsICdNJywgdSfajScpLAogICAgXQoKZGVmIF9zZWdfNDMoKToKICAgIHJldHVybiBbCiAgICAoMHhGQjg0LCAnTScsIHUn2ownKSwKICAgICgweEZCODYsICdNJywgdSfajicpLAogICAgKDB4RkI4OCwgJ00nLCB1J9qIJyksCiAgICAoMHhGQjhBLCAnTScsIHUn2pgnKSwKICAgICgweEZCOEMsICdNJywgdSfakScpLAogICAgKDB4RkI4RSwgJ00nLCB1J9qpJyksCiAgICAoMHhGQjkyLCAnTScsIHUn2q8nKSwKICAgICgweEZCOTYsICdNJywgdSfasycpLAogICAgKDB4RkI5QSwgJ00nLCB1J9qxJyksCiAgICAoMHhGQjlFLCAnTScsIHUn2ronKSwKICAgICgweEZCQTAsICdNJywgdSfauycpLAogICAgKDB4RkJBNCwgJ00nLCB1J9uAJyksCiAgICAoMHhGQkE2LCAnTScsIHUn24EnKSwKICAgICgweEZCQUEsICdNJywgdSfavicpLAogICAgKDB4RkJBRSwgJ00nLCB1J9uSJyksCiAgICAoMHhGQkIwLCAnTScsIHUn25MnKSwKICAgICgweEZCQjIsICdWJyksCiAgICAoMHhGQkMyLCAnWCcpLAogICAgKDB4RkJEMywgJ00nLCB1J9qtJyksCiAgICAoMHhGQkQ3LCAnTScsIHUn24cnKSwKICAgICgweEZCRDksICdNJywgdSfbhicpLAogICAgKDB4RkJEQiwgJ00nLCB1J9uIJyksCiAgICAoMHhGQkRELCAnTScsIHUn24fZtCcpLAogICAgKDB4RkJERSwgJ00nLCB1J9uLJyksCiAgICAoMHhGQkUwLCAnTScsIHUn24UnKSwKICAgICgweEZCRTIsICdNJywgdSfbiScpLAogICAgKDB4RkJFNCwgJ00nLCB1J9uQJyksCiAgICAoMHhGQkU4LCAnTScsIHUn2YknKSwKICAgICgweEZCRUEsICdNJywgdSfYptinJyksCiAgICAoMHhGQkVDLCAnTScsIHUn2KbblScpLAogICAgKDB4RkJFRSwgJ00nLCB1J9im2YgnKSwKICAgICgweEZCRjAsICdNJywgdSfYptuHJyksCiAgICAoMHhGQkYyLCAnTScsIHUn2KbbhicpLAogICAgKDB4RkJGNCwgJ00nLCB1J9im24gnKSwKICAgICgweEZCRjYsICdNJywgdSfYptuQJyksCiAgICAoMHhGQkY5LCAnTScsIHUn2KbZiScpLAogICAgKDB4RkJGQywgJ00nLCB1J9uMJyksCiAgICAoMHhGQzAwLCAnTScsIHUn2KbYrCcpLAogICAgKDB4RkMwMSwgJ00nLCB1J9im2K0nKSwKICAgICgweEZDMDIsICdNJywgdSfYptmFJyksCiAgICAoMHhGQzAzLCAnTScsIHUn2KbZiScpLAogICAgKDB4RkMwNCwgJ00nLCB1J9im2YonKSwKICAgICgweEZDMDUsICdNJywgdSfYqNisJyksCiAgICAoMHhGQzA2LCAnTScsIHUn2KjYrScpLAogICAgKDB4RkMwNywgJ00nLCB1J9io2K4nKSwKICAgICgweEZDMDgsICdNJywgdSfYqNmFJyksCiAgICAoMHhGQzA5LCAnTScsIHUn2KjZiScpLAogICAgKDB4RkMwQSwgJ00nLCB1J9io2YonKSwKICAgICgweEZDMEIsICdNJywgdSfYqtisJyksCiAgICAoMHhGQzBDLCAnTScsIHUn2KrYrScpLAogICAgKDB4RkMwRCwgJ00nLCB1J9iq2K4nKSwKICAgICgweEZDMEUsICdNJywgdSfYqtmFJyksCiAgICAoMHhGQzBGLCAnTScsIHUn2KrZiScpLAogICAgKDB4RkMxMCwgJ00nLCB1J9iq2YonKSwKICAgICgweEZDMTEsICdNJywgdSfYq9isJyksCiAgICAoMHhGQzEyLCAnTScsIHUn2KvZhScpLAogICAgKDB4RkMxMywgJ00nLCB1J9ir2YknKSwKICAgICgweEZDMTQsICdNJywgdSfYq9mKJyksCiAgICAoMHhGQzE1LCAnTScsIHUn2KzYrScpLAogICAgKDB4RkMxNiwgJ00nLCB1J9is2YUnKSwKICAgICgweEZDMTcsICdNJywgdSfYrdisJyksCiAgICAoMHhGQzE4LCAnTScsIHUn2K3ZhScpLAogICAgKDB4RkMxOSwgJ00nLCB1J9iu2KwnKSwKICAgICgweEZDMUEsICdNJywgdSfYrtitJyksCiAgICAoMHhGQzFCLCAnTScsIHUn2K7ZhScpLAogICAgKDB4RkMxQywgJ00nLCB1J9iz2KwnKSwKICAgICgweEZDMUQsICdNJywgdSfYs9itJyksCiAgICAoMHhGQzFFLCAnTScsIHUn2LPYricpLAogICAgKDB4RkMxRiwgJ00nLCB1J9iz2YUnKSwKICAgICgweEZDMjAsICdNJywgdSfYtditJyksCiAgICAoMHhGQzIxLCAnTScsIHUn2LXZhScpLAogICAgKDB4RkMyMiwgJ00nLCB1J9i22KwnKSwKICAgICgweEZDMjMsICdNJywgdSfYttitJyksCiAgICAoMHhGQzI0LCAnTScsIHUn2LbYricpLAogICAgKDB4RkMyNSwgJ00nLCB1J9i22YUnKSwKICAgICgweEZDMjYsICdNJywgdSfYt9itJyksCiAgICAoMHhGQzI3LCAnTScsIHUn2LfZhScpLAogICAgKDB4RkMyOCwgJ00nLCB1J9i42YUnKSwKICAgICgweEZDMjksICdNJywgdSfYudisJyksCiAgICAoMHhGQzJBLCAnTScsIHUn2LnZhScpLAogICAgKDB4RkMyQiwgJ00nLCB1J9i62KwnKSwKICAgICgweEZDMkMsICdNJywgdSfYutmFJyksCiAgICAoMHhGQzJELCAnTScsIHUn2YHYrCcpLAogICAgKDB4RkMyRSwgJ00nLCB1J9mB2K0nKSwKICAgICgweEZDMkYsICdNJywgdSfZgdiuJyksCiAgICAoMHhGQzMwLCAnTScsIHUn2YHZhScpLAogICAgKDB4RkMzMSwgJ00nLCB1J9mB2YknKSwKICAgICgweEZDMzIsICdNJywgdSfZgdmKJyksCiAgICAoMHhGQzMzLCAnTScsIHUn2YLYrScpLAogICAgKDB4RkMzNCwgJ00nLCB1J9mC2YUnKSwKICAgICgweEZDMzUsICdNJywgdSfZgtmJJyksCiAgICAoMHhGQzM2LCAnTScsIHUn2YLZiicpLAogICAgKDB4RkMzNywgJ00nLCB1J9mD2KcnKSwKICAgICgweEZDMzgsICdNJywgdSfZg9isJyksCiAgICAoMHhGQzM5LCAnTScsIHUn2YPYrScpLAogICAgKDB4RkMzQSwgJ00nLCB1J9mD2K4nKSwKICAgICgweEZDM0IsICdNJywgdSfZg9mEJyksCiAgICAoMHhGQzNDLCAnTScsIHUn2YPZhScpLAogICAgKDB4RkMzRCwgJ00nLCB1J9mD2YknKSwKICAgICgweEZDM0UsICdNJywgdSfZg9mKJyksCiAgICBdCgpkZWYgX3NlZ180NCgpOgogICAgcmV0dXJuIFsKICAgICgweEZDM0YsICdNJywgdSfZhNisJyksCiAgICAoMHhGQzQwLCAnTScsIHUn2YTYrScpLAogICAgKDB4RkM0MSwgJ00nLCB1J9mE2K4nKSwKICAgICgweEZDNDIsICdNJywgdSfZhNmFJyksCiAgICAoMHhGQzQzLCAnTScsIHUn2YTZiScpLAogICAgKDB4RkM0NCwgJ00nLCB1J9mE2YonKSwKICAgICgweEZDNDUsICdNJywgdSfZhdisJyksCiAgICAoMHhGQzQ2LCAnTScsIHUn2YXYrScpLAogICAgKDB4RkM0NywgJ00nLCB1J9mF2K4nKSwKICAgICgweEZDNDgsICdNJywgdSfZhdmFJyksCiAgICAoMHhGQzQ5LCAnTScsIHUn2YXZiScpLAogICAgKDB4RkM0QSwgJ00nLCB1J9mF2YonKSwKICAgICgweEZDNEIsICdNJywgdSfZhtisJyksCiAgICAoMHhGQzRDLCAnTScsIHUn2YbYrScpLAogICAgKDB4RkM0RCwgJ00nLCB1J9mG2K4nKSwKICAgICgweEZDNEUsICdNJywgdSfZhtmFJyksCiAgICAoMHhGQzRGLCAnTScsIHUn2YbZiScpLAogICAgKDB4RkM1MCwgJ00nLCB1J9mG2YonKSwKICAgICgweEZDNTEsICdNJywgdSfZh9isJyksCiAgICAoMHhGQzUyLCAnTScsIHUn2YfZhScpLAogICAgKDB4RkM1MywgJ00nLCB1J9mH2YknKSwKICAgICgweEZDNTQsICdNJywgdSfZh9mKJyksCiAgICAoMHhGQzU1LCAnTScsIHUn2YrYrCcpLAogICAgKDB4RkM1NiwgJ00nLCB1J9mK2K0nKSwKICAgICgweEZDNTcsICdNJywgdSfZitiuJyksCiAgICAoMHhGQzU4LCAnTScsIHUn2YrZhScpLAogICAgKDB4RkM1OSwgJ00nLCB1J9mK2YknKSwKICAgICgweEZDNUEsICdNJywgdSfZitmKJyksCiAgICAoMHhGQzVCLCAnTScsIHUn2LDZsCcpLAogICAgKDB4RkM1QywgJ00nLCB1J9ix2bAnKSwKICAgICgweEZDNUQsICdNJywgdSfZidmwJyksCiAgICAoMHhGQzVFLCAnMycsIHUnINmM2ZEnKSwKICAgICgweEZDNUYsICczJywgdScg2Y3ZkScpLAogICAgKDB4RkM2MCwgJzMnLCB1JyDZjtmRJyksCiAgICAoMHhGQzYxLCAnMycsIHUnINmP2ZEnKSwKICAgICgweEZDNjIsICczJywgdScg2ZDZkScpLAogICAgKDB4RkM2MywgJzMnLCB1JyDZkdmwJyksCiAgICAoMHhGQzY0LCAnTScsIHUn2KbYsScpLAogICAgKDB4RkM2NSwgJ00nLCB1J9im2LInKSwKICAgICgweEZDNjYsICdNJywgdSfYptmFJyksCiAgICAoMHhGQzY3LCAnTScsIHUn2KbZhicpLAogICAgKDB4RkM2OCwgJ00nLCB1J9im2YknKSwKICAgICgweEZDNjksICdNJywgdSfYptmKJyksCiAgICAoMHhGQzZBLCAnTScsIHUn2KjYsScpLAogICAgKDB4RkM2QiwgJ00nLCB1J9io2LInKSwKICAgICgweEZDNkMsICdNJywgdSfYqNmFJyksCiAgICAoMHhGQzZELCAnTScsIHUn2KjZhicpLAogICAgKDB4RkM2RSwgJ00nLCB1J9io2YknKSwKICAgICgweEZDNkYsICdNJywgdSfYqNmKJyksCiAgICAoMHhGQzcwLCAnTScsIHUn2KrYsScpLAogICAgKDB4RkM3MSwgJ00nLCB1J9iq2LInKSwKICAgICgweEZDNzIsICdNJywgdSfYqtmFJyksCiAgICAoMHhGQzczLCAnTScsIHUn2KrZhicpLAogICAgKDB4RkM3NCwgJ00nLCB1J9iq2YknKSwKICAgICgweEZDNzUsICdNJywgdSfYqtmKJyksCiAgICAoMHhGQzc2LCAnTScsIHUn2KvYsScpLAogICAgKDB4RkM3NywgJ00nLCB1J9ir2LInKSwKICAgICgweEZDNzgsICdNJywgdSfYq9mFJyksCiAgICAoMHhGQzc5LCAnTScsIHUn2KvZhicpLAogICAgKDB4RkM3QSwgJ00nLCB1J9ir2YknKSwKICAgICgweEZDN0IsICdNJywgdSfYq9mKJyksCiAgICAoMHhGQzdDLCAnTScsIHUn2YHZiScpLAogICAgKDB4RkM3RCwgJ00nLCB1J9mB2YonKSwKICAgICgweEZDN0UsICdNJywgdSfZgtmJJyksCiAgICAoMHhGQzdGLCAnTScsIHUn2YLZiicpLAogICAgKDB4RkM4MCwgJ00nLCB1J9mD2KcnKSwKICAgICgweEZDODEsICdNJywgdSfZg9mEJyksCiAgICAoMHhGQzgyLCAnTScsIHUn2YPZhScpLAogICAgKDB4RkM4MywgJ00nLCB1J9mD2YknKSwKICAgICgweEZDODQsICdNJywgdSfZg9mKJyksCiAgICAoMHhGQzg1LCAnTScsIHUn2YTZhScpLAogICAgKDB4RkM4NiwgJ00nLCB1J9mE2YknKSwKICAgICgweEZDODcsICdNJywgdSfZhNmKJyksCiAgICAoMHhGQzg4LCAnTScsIHUn2YXYpycpLAogICAgKDB4RkM4OSwgJ00nLCB1J9mF2YUnKSwKICAgICgweEZDOEEsICdNJywgdSfZhtixJyksCiAgICAoMHhGQzhCLCAnTScsIHUn2YbYsicpLAogICAgKDB4RkM4QywgJ00nLCB1J9mG2YUnKSwKICAgICgweEZDOEQsICdNJywgdSfZhtmGJyksCiAgICAoMHhGQzhFLCAnTScsIHUn2YbZiScpLAogICAgKDB4RkM4RiwgJ00nLCB1J9mG2YonKSwKICAgICgweEZDOTAsICdNJywgdSfZidmwJyksCiAgICAoMHhGQzkxLCAnTScsIHUn2YrYsScpLAogICAgKDB4RkM5MiwgJ00nLCB1J9mK2LInKSwKICAgICgweEZDOTMsICdNJywgdSfZitmFJyksCiAgICAoMHhGQzk0LCAnTScsIHUn2YrZhicpLAogICAgKDB4RkM5NSwgJ00nLCB1J9mK2YknKSwKICAgICgweEZDOTYsICdNJywgdSfZitmKJyksCiAgICAoMHhGQzk3LCAnTScsIHUn2KbYrCcpLAogICAgKDB4RkM5OCwgJ00nLCB1J9im2K0nKSwKICAgICgweEZDOTksICdNJywgdSfYptiuJyksCiAgICAoMHhGQzlBLCAnTScsIHUn2KbZhScpLAogICAgKDB4RkM5QiwgJ00nLCB1J9im2YcnKSwKICAgICgweEZDOUMsICdNJywgdSfYqNisJyksCiAgICAoMHhGQzlELCAnTScsIHUn2KjYrScpLAogICAgKDB4RkM5RSwgJ00nLCB1J9io2K4nKSwKICAgICgweEZDOUYsICdNJywgdSfYqNmFJyksCiAgICAoMHhGQ0EwLCAnTScsIHUn2KjZhycpLAogICAgKDB4RkNBMSwgJ00nLCB1J9iq2KwnKSwKICAgICgweEZDQTIsICdNJywgdSfYqtitJyksCiAgICBdCgpkZWYgX3NlZ180NSgpOgogICAgcmV0dXJuIFsKICAgICgweEZDQTMsICdNJywgdSfYqtiuJyksCiAgICAoMHhGQ0E0LCAnTScsIHUn2KrZhScpLAogICAgKDB4RkNBNSwgJ00nLCB1J9iq2YcnKSwKICAgICgweEZDQTYsICdNJywgdSfYq9mFJyksCiAgICAoMHhGQ0E3LCAnTScsIHUn2KzYrScpLAogICAgKDB4RkNBOCwgJ00nLCB1J9is2YUnKSwKICAgICgweEZDQTksICdNJywgdSfYrdisJyksCiAgICAoMHhGQ0FBLCAnTScsIHUn2K3ZhScpLAogICAgKDB4RkNBQiwgJ00nLCB1J9iu2KwnKSwKICAgICgweEZDQUMsICdNJywgdSfYrtmFJyksCiAgICAoMHhGQ0FELCAnTScsIHUn2LPYrCcpLAogICAgKDB4RkNBRSwgJ00nLCB1J9iz2K0nKSwKICAgICgweEZDQUYsICdNJywgdSfYs9iuJyksCiAgICAoMHhGQ0IwLCAnTScsIHUn2LPZhScpLAogICAgKDB4RkNCMSwgJ00nLCB1J9i12K0nKSwKICAgICgweEZDQjIsICdNJywgdSfYtdiuJyksCiAgICAoMHhGQ0IzLCAnTScsIHUn2LXZhScpLAogICAgKDB4RkNCNCwgJ00nLCB1J9i22KwnKSwKICAgICgweEZDQjUsICdNJywgdSfYttitJyksCiAgICAoMHhGQ0I2LCAnTScsIHUn2LbYricpLAogICAgKDB4RkNCNywgJ00nLCB1J9i22YUnKSwKICAgICgweEZDQjgsICdNJywgdSfYt9itJyksCiAgICAoMHhGQ0I5LCAnTScsIHUn2LjZhScpLAogICAgKDB4RkNCQSwgJ00nLCB1J9i52KwnKSwKICAgICgweEZDQkIsICdNJywgdSfYudmFJyksCiAgICAoMHhGQ0JDLCAnTScsIHUn2LrYrCcpLAogICAgKDB4RkNCRCwgJ00nLCB1J9i62YUnKSwKICAgICgweEZDQkUsICdNJywgdSfZgdisJyksCiAgICAoMHhGQ0JGLCAnTScsIHUn2YHYrScpLAogICAgKDB4RkNDMCwgJ00nLCB1J9mB2K4nKSwKICAgICgweEZDQzEsICdNJywgdSfZgdmFJyksCiAgICAoMHhGQ0MyLCAnTScsIHUn2YLYrScpLAogICAgKDB4RkNDMywgJ00nLCB1J9mC2YUnKSwKICAgICgweEZDQzQsICdNJywgdSfZg9isJyksCiAgICAoMHhGQ0M1LCAnTScsIHUn2YPYrScpLAogICAgKDB4RkNDNiwgJ00nLCB1J9mD2K4nKSwKICAgICgweEZDQzcsICdNJywgdSfZg9mEJyksCiAgICAoMHhGQ0M4LCAnTScsIHUn2YPZhScpLAogICAgKDB4RkNDOSwgJ00nLCB1J9mE2KwnKSwKICAgICgweEZDQ0EsICdNJywgdSfZhNitJyksCiAgICAoMHhGQ0NCLCAnTScsIHUn2YTYricpLAogICAgKDB4RkNDQywgJ00nLCB1J9mE2YUnKSwKICAgICgweEZDQ0QsICdNJywgdSfZhNmHJyksCiAgICAoMHhGQ0NFLCAnTScsIHUn2YXYrCcpLAogICAgKDB4RkNDRiwgJ00nLCB1J9mF2K0nKSwKICAgICgweEZDRDAsICdNJywgdSfZhdiuJyksCiAgICAoMHhGQ0QxLCAnTScsIHUn2YXZhScpLAogICAgKDB4RkNEMiwgJ00nLCB1J9mG2KwnKSwKICAgICgweEZDRDMsICdNJywgdSfZhtitJyksCiAgICAoMHhGQ0Q0LCAnTScsIHUn2YbYricpLAogICAgKDB4RkNENSwgJ00nLCB1J9mG2YUnKSwKICAgICgweEZDRDYsICdNJywgdSfZhtmHJyksCiAgICAoMHhGQ0Q3LCAnTScsIHUn2YfYrCcpLAogICAgKDB4RkNEOCwgJ00nLCB1J9mH2YUnKSwKICAgICgweEZDRDksICdNJywgdSfZh9mwJyksCiAgICAoMHhGQ0RBLCAnTScsIHUn2YrYrCcpLAogICAgKDB4RkNEQiwgJ00nLCB1J9mK2K0nKSwKICAgICgweEZDREMsICdNJywgdSfZitiuJyksCiAgICAoMHhGQ0RELCAnTScsIHUn2YrZhScpLAogICAgKDB4RkNERSwgJ00nLCB1J9mK2YcnKSwKICAgICgweEZDREYsICdNJywgdSfYptmFJyksCiAgICAoMHhGQ0UwLCAnTScsIHUn2KbZhycpLAogICAgKDB4RkNFMSwgJ00nLCB1J9io2YUnKSwKICAgICgweEZDRTIsICdNJywgdSfYqNmHJyksCiAgICAoMHhGQ0UzLCAnTScsIHUn2KrZhScpLAogICAgKDB4RkNFNCwgJ00nLCB1J9iq2YcnKSwKICAgICgweEZDRTUsICdNJywgdSfYq9mFJyksCiAgICAoMHhGQ0U2LCAnTScsIHUn2KvZhycpLAogICAgKDB4RkNFNywgJ00nLCB1J9iz2YUnKSwKICAgICgweEZDRTgsICdNJywgdSfYs9mHJyksCiAgICAoMHhGQ0U5LCAnTScsIHUn2LTZhScpLAogICAgKDB4RkNFQSwgJ00nLCB1J9i02YcnKSwKICAgICgweEZDRUIsICdNJywgdSfZg9mEJyksCiAgICAoMHhGQ0VDLCAnTScsIHUn2YPZhScpLAogICAgKDB4RkNFRCwgJ00nLCB1J9mE2YUnKSwKICAgICgweEZDRUUsICdNJywgdSfZhtmFJyksCiAgICAoMHhGQ0VGLCAnTScsIHUn2YbZhycpLAogICAgKDB4RkNGMCwgJ00nLCB1J9mK2YUnKSwKICAgICgweEZDRjEsICdNJywgdSfZitmHJyksCiAgICAoMHhGQ0YyLCAnTScsIHUn2YDZjtmRJyksCiAgICAoMHhGQ0YzLCAnTScsIHUn2YDZj9mRJyksCiAgICAoMHhGQ0Y0LCAnTScsIHUn2YDZkNmRJyksCiAgICAoMHhGQ0Y1LCAnTScsIHUn2LfZiScpLAogICAgKDB4RkNGNiwgJ00nLCB1J9i32YonKSwKICAgICgweEZDRjcsICdNJywgdSfYudmJJyksCiAgICAoMHhGQ0Y4LCAnTScsIHUn2LnZiicpLAogICAgKDB4RkNGOSwgJ00nLCB1J9i62YknKSwKICAgICgweEZDRkEsICdNJywgdSfYutmKJyksCiAgICAoMHhGQ0ZCLCAnTScsIHUn2LPZiScpLAogICAgKDB4RkNGQywgJ00nLCB1J9iz2YonKSwKICAgICgweEZDRkQsICdNJywgdSfYtNmJJyksCiAgICAoMHhGQ0ZFLCAnTScsIHUn2LTZiicpLAogICAgKDB4RkNGRiwgJ00nLCB1J9it2YknKSwKICAgICgweEZEMDAsICdNJywgdSfYrdmKJyksCiAgICAoMHhGRDAxLCAnTScsIHUn2KzZiScpLAogICAgKDB4RkQwMiwgJ00nLCB1J9is2YonKSwKICAgICgweEZEMDMsICdNJywgdSfYrtmJJyksCiAgICAoMHhGRDA0LCAnTScsIHUn2K7ZiicpLAogICAgKDB4RkQwNSwgJ00nLCB1J9i12YknKSwKICAgICgweEZEMDYsICdNJywgdSfYtdmKJyksCiAgICBdCgpkZWYgX3NlZ180NigpOgogICAgcmV0dXJuIFsKICAgICgweEZEMDcsICdNJywgdSfYttmJJyksCiAgICAoMHhGRDA4LCAnTScsIHUn2LbZiicpLAogICAgKDB4RkQwOSwgJ00nLCB1J9i02KwnKSwKICAgICgweEZEMEEsICdNJywgdSfYtNitJyksCiAgICAoMHhGRDBCLCAnTScsIHUn2LTYricpLAogICAgKDB4RkQwQywgJ00nLCB1J9i02YUnKSwKICAgICgweEZEMEQsICdNJywgdSfYtNixJyksCiAgICAoMHhGRDBFLCAnTScsIHUn2LPYsScpLAogICAgKDB4RkQwRiwgJ00nLCB1J9i12LEnKSwKICAgICgweEZEMTAsICdNJywgdSfYttixJyksCiAgICAoMHhGRDExLCAnTScsIHUn2LfZiScpLAogICAgKDB4RkQxMiwgJ00nLCB1J9i32YonKSwKICAgICgweEZEMTMsICdNJywgdSfYudmJJyksCiAgICAoMHhGRDE0LCAnTScsIHUn2LnZiicpLAogICAgKDB4RkQxNSwgJ00nLCB1J9i62YknKSwKICAgICgweEZEMTYsICdNJywgdSfYutmKJyksCiAgICAoMHhGRDE3LCAnTScsIHUn2LPZiScpLAogICAgKDB4RkQxOCwgJ00nLCB1J9iz2YonKSwKICAgICgweEZEMTksICdNJywgdSfYtNmJJyksCiAgICAoMHhGRDFBLCAnTScsIHUn2LTZiicpLAogICAgKDB4RkQxQiwgJ00nLCB1J9it2YknKSwKICAgICgweEZEMUMsICdNJywgdSfYrdmKJyksCiAgICAoMHhGRDFELCAnTScsIHUn2KzZiScpLAogICAgKDB4RkQxRSwgJ00nLCB1J9is2YonKSwKICAgICgweEZEMUYsICdNJywgdSfYrtmJJyksCiAgICAoMHhGRDIwLCAnTScsIHUn2K7ZiicpLAogICAgKDB4RkQyMSwgJ00nLCB1J9i12YknKSwKICAgICgweEZEMjIsICdNJywgdSfYtdmKJyksCiAgICAoMHhGRDIzLCAnTScsIHUn2LbZiScpLAogICAgKDB4RkQyNCwgJ00nLCB1J9i22YonKSwKICAgICgweEZEMjUsICdNJywgdSfYtNisJyksCiAgICAoMHhGRDI2LCAnTScsIHUn2LTYrScpLAogICAgKDB4RkQyNywgJ00nLCB1J9i02K4nKSwKICAgICgweEZEMjgsICdNJywgdSfYtNmFJyksCiAgICAoMHhGRDI5LCAnTScsIHUn2LTYsScpLAogICAgKDB4RkQyQSwgJ00nLCB1J9iz2LEnKSwKICAgICgweEZEMkIsICdNJywgdSfYtdixJyksCiAgICAoMHhGRDJDLCAnTScsIHUn2LbYsScpLAogICAgKDB4RkQyRCwgJ00nLCB1J9i02KwnKSwKICAgICgweEZEMkUsICdNJywgdSfYtNitJyksCiAgICAoMHhGRDJGLCAnTScsIHUn2LTYricpLAogICAgKDB4RkQzMCwgJ00nLCB1J9i02YUnKSwKICAgICgweEZEMzEsICdNJywgdSfYs9mHJyksCiAgICAoMHhGRDMyLCAnTScsIHUn2LTZhycpLAogICAgKDB4RkQzMywgJ00nLCB1J9i32YUnKSwKICAgICgweEZEMzQsICdNJywgdSfYs9isJyksCiAgICAoMHhGRDM1LCAnTScsIHUn2LPYrScpLAogICAgKDB4RkQzNiwgJ00nLCB1J9iz2K4nKSwKICAgICgweEZEMzcsICdNJywgdSfYtNisJyksCiAgICAoMHhGRDM4LCAnTScsIHUn2LTYrScpLAogICAgKDB4RkQzOSwgJ00nLCB1J9i02K4nKSwKICAgICgweEZEM0EsICdNJywgdSfYt9mFJyksCiAgICAoMHhGRDNCLCAnTScsIHUn2LjZhScpLAogICAgKDB4RkQzQywgJ00nLCB1J9in2YsnKSwKICAgICgweEZEM0UsICdWJyksCiAgICAoMHhGRDQwLCAnWCcpLAogICAgKDB4RkQ1MCwgJ00nLCB1J9iq2KzZhScpLAogICAgKDB4RkQ1MSwgJ00nLCB1J9iq2K3YrCcpLAogICAgKDB4RkQ1MywgJ00nLCB1J9iq2K3ZhScpLAogICAgKDB4RkQ1NCwgJ00nLCB1J9iq2K7ZhScpLAogICAgKDB4RkQ1NSwgJ00nLCB1J9iq2YXYrCcpLAogICAgKDB4RkQ1NiwgJ00nLCB1J9iq2YXYrScpLAogICAgKDB4RkQ1NywgJ00nLCB1J9iq2YXYricpLAogICAgKDB4RkQ1OCwgJ00nLCB1J9is2YXYrScpLAogICAgKDB4RkQ1QSwgJ00nLCB1J9it2YXZiicpLAogICAgKDB4RkQ1QiwgJ00nLCB1J9it2YXZiScpLAogICAgKDB4RkQ1QywgJ00nLCB1J9iz2K3YrCcpLAogICAgKDB4RkQ1RCwgJ00nLCB1J9iz2KzYrScpLAogICAgKDB4RkQ1RSwgJ00nLCB1J9iz2KzZiScpLAogICAgKDB4RkQ1RiwgJ00nLCB1J9iz2YXYrScpLAogICAgKDB4RkQ2MSwgJ00nLCB1J9iz2YXYrCcpLAogICAgKDB4RkQ2MiwgJ00nLCB1J9iz2YXZhScpLAogICAgKDB4RkQ2NCwgJ00nLCB1J9i12K3YrScpLAogICAgKDB4RkQ2NiwgJ00nLCB1J9i12YXZhScpLAogICAgKDB4RkQ2NywgJ00nLCB1J9i02K3ZhScpLAogICAgKDB4RkQ2OSwgJ00nLCB1J9i02KzZiicpLAogICAgKDB4RkQ2QSwgJ00nLCB1J9i02YXYricpLAogICAgKDB4RkQ2QywgJ00nLCB1J9i02YXZhScpLAogICAgKDB4RkQ2RSwgJ00nLCB1J9i22K3ZiScpLAogICAgKDB4RkQ2RiwgJ00nLCB1J9i22K7ZhScpLAogICAgKDB4RkQ3MSwgJ00nLCB1J9i32YXYrScpLAogICAgKDB4RkQ3MywgJ00nLCB1J9i32YXZhScpLAogICAgKDB4RkQ3NCwgJ00nLCB1J9i32YXZiicpLAogICAgKDB4RkQ3NSwgJ00nLCB1J9i52KzZhScpLAogICAgKDB4RkQ3NiwgJ00nLCB1J9i52YXZhScpLAogICAgKDB4RkQ3OCwgJ00nLCB1J9i52YXZiScpLAogICAgKDB4RkQ3OSwgJ00nLCB1J9i62YXZhScpLAogICAgKDB4RkQ3QSwgJ00nLCB1J9i62YXZiicpLAogICAgKDB4RkQ3QiwgJ00nLCB1J9i62YXZiScpLAogICAgKDB4RkQ3QywgJ00nLCB1J9mB2K7ZhScpLAogICAgKDB4RkQ3RSwgJ00nLCB1J9mC2YXYrScpLAogICAgKDB4RkQ3RiwgJ00nLCB1J9mC2YXZhScpLAogICAgKDB4RkQ4MCwgJ00nLCB1J9mE2K3ZhScpLAogICAgKDB4RkQ4MSwgJ00nLCB1J9mE2K3ZiicpLAogICAgKDB4RkQ4MiwgJ00nLCB1J9mE2K3ZiScpLAogICAgKDB4RkQ4MywgJ00nLCB1J9mE2KzYrCcpLAogICAgKDB4RkQ4NSwgJ00nLCB1J9mE2K7ZhScpLAogICAgKDB4RkQ4NywgJ00nLCB1J9mE2YXYrScpLAogICAgKDB4RkQ4OSwgJ00nLCB1J9mF2K3YrCcpLAogICAgKDB4RkQ4QSwgJ00nLCB1J9mF2K3ZhScpLAogICAgXQoKZGVmIF9zZWdfNDcoKToKICAgIHJldHVybiBbCiAgICAoMHhGRDhCLCAnTScsIHUn2YXYrdmKJyksCiAgICAoMHhGRDhDLCAnTScsIHUn2YXYrNitJyksCiAgICAoMHhGRDhELCAnTScsIHUn2YXYrNmFJyksCiAgICAoMHhGRDhFLCAnTScsIHUn2YXYrtisJyksCiAgICAoMHhGRDhGLCAnTScsIHUn2YXYrtmFJyksCiAgICAoMHhGRDkwLCAnWCcpLAogICAgKDB4RkQ5MiwgJ00nLCB1J9mF2KzYricpLAogICAgKDB4RkQ5MywgJ00nLCB1J9mH2YXYrCcpLAogICAgKDB4RkQ5NCwgJ00nLCB1J9mH2YXZhScpLAogICAgKDB4RkQ5NSwgJ00nLCB1J9mG2K3ZhScpLAogICAgKDB4RkQ5NiwgJ00nLCB1J9mG2K3ZiScpLAogICAgKDB4RkQ5NywgJ00nLCB1J9mG2KzZhScpLAogICAgKDB4RkQ5OSwgJ00nLCB1J9mG2KzZiScpLAogICAgKDB4RkQ5QSwgJ00nLCB1J9mG2YXZiicpLAogICAgKDB4RkQ5QiwgJ00nLCB1J9mG2YXZiScpLAogICAgKDB4RkQ5QywgJ00nLCB1J9mK2YXZhScpLAogICAgKDB4RkQ5RSwgJ00nLCB1J9io2K7ZiicpLAogICAgKDB4RkQ5RiwgJ00nLCB1J9iq2KzZiicpLAogICAgKDB4RkRBMCwgJ00nLCB1J9iq2KzZiScpLAogICAgKDB4RkRBMSwgJ00nLCB1J9iq2K7ZiicpLAogICAgKDB4RkRBMiwgJ00nLCB1J9iq2K7ZiScpLAogICAgKDB4RkRBMywgJ00nLCB1J9iq2YXZiicpLAogICAgKDB4RkRBNCwgJ00nLCB1J9iq2YXZiScpLAogICAgKDB4RkRBNSwgJ00nLCB1J9is2YXZiicpLAogICAgKDB4RkRBNiwgJ00nLCB1J9is2K3ZiScpLAogICAgKDB4RkRBNywgJ00nLCB1J9is2YXZiScpLAogICAgKDB4RkRBOCwgJ00nLCB1J9iz2K7ZiScpLAogICAgKDB4RkRBOSwgJ00nLCB1J9i12K3ZiicpLAogICAgKDB4RkRBQSwgJ00nLCB1J9i02K3ZiicpLAogICAgKDB4RkRBQiwgJ00nLCB1J9i22K3ZiicpLAogICAgKDB4RkRBQywgJ00nLCB1J9mE2KzZiicpLAogICAgKDB4RkRBRCwgJ00nLCB1J9mE2YXZiicpLAogICAgKDB4RkRBRSwgJ00nLCB1J9mK2K3ZiicpLAogICAgKDB4RkRBRiwgJ00nLCB1J9mK2KzZiicpLAogICAgKDB4RkRCMCwgJ00nLCB1J9mK2YXZiicpLAogICAgKDB4RkRCMSwgJ00nLCB1J9mF2YXZiicpLAogICAgKDB4RkRCMiwgJ00nLCB1J9mC2YXZiicpLAogICAgKDB4RkRCMywgJ00nLCB1J9mG2K3ZiicpLAogICAgKDB4RkRCNCwgJ00nLCB1J9mC2YXYrScpLAogICAgKDB4RkRCNSwgJ00nLCB1J9mE2K3ZhScpLAogICAgKDB4RkRCNiwgJ00nLCB1J9i52YXZiicpLAogICAgKDB4RkRCNywgJ00nLCB1J9mD2YXZiicpLAogICAgKDB4RkRCOCwgJ00nLCB1J9mG2KzYrScpLAogICAgKDB4RkRCOSwgJ00nLCB1J9mF2K7ZiicpLAogICAgKDB4RkRCQSwgJ00nLCB1J9mE2KzZhScpLAogICAgKDB4RkRCQiwgJ00nLCB1J9mD2YXZhScpLAogICAgKDB4RkRCQywgJ00nLCB1J9mE2KzZhScpLAogICAgKDB4RkRCRCwgJ00nLCB1J9mG2KzYrScpLAogICAgKDB4RkRCRSwgJ00nLCB1J9is2K3ZiicpLAogICAgKDB4RkRCRiwgJ00nLCB1J9it2KzZiicpLAogICAgKDB4RkRDMCwgJ00nLCB1J9mF2KzZiicpLAogICAgKDB4RkRDMSwgJ00nLCB1J9mB2YXZiicpLAogICAgKDB4RkRDMiwgJ00nLCB1J9io2K3ZiicpLAogICAgKDB4RkRDMywgJ00nLCB1J9mD2YXZhScpLAogICAgKDB4RkRDNCwgJ00nLCB1J9i52KzZhScpLAogICAgKDB4RkRDNSwgJ00nLCB1J9i12YXZhScpLAogICAgKDB4RkRDNiwgJ00nLCB1J9iz2K7ZiicpLAogICAgKDB4RkRDNywgJ00nLCB1J9mG2KzZiicpLAogICAgKDB4RkRDOCwgJ1gnKSwKICAgICgweEZERjAsICdNJywgdSfYtdmE25InKSwKICAgICgweEZERjEsICdNJywgdSfZgtmE25InKSwKICAgICgweEZERjIsICdNJywgdSfYp9mE2YTZhycpLAogICAgKDB4RkRGMywgJ00nLCB1J9in2YPYqNixJyksCiAgICAoMHhGREY0LCAnTScsIHUn2YXYrdmF2K8nKSwKICAgICgweEZERjUsICdNJywgdSfYtdmE2LnZhScpLAogICAgKDB4RkRGNiwgJ00nLCB1J9ix2LPZiNmEJyksCiAgICAoMHhGREY3LCAnTScsIHUn2LnZhNmK2YcnKSwKICAgICgweEZERjgsICdNJywgdSfZiNiz2YTZhScpLAogICAgKDB4RkRGOSwgJ00nLCB1J9i12YTZiScpLAogICAgKDB4RkRGQSwgJzMnLCB1J9i12YTZiSDYp9mE2YTZhyDYudmE2YrZhyDZiNiz2YTZhScpLAogICAgKDB4RkRGQiwgJzMnLCB1J9is2YQg2KzZhNin2YTZhycpLAogICAgKDB4RkRGQywgJ00nLCB1J9ix24zYp9mEJyksCiAgICAoMHhGREZELCAnVicpLAogICAgKDB4RkRGRSwgJ1gnKSwKICAgICgweEZFMDAsICdJJyksCiAgICAoMHhGRTEwLCAnMycsIHUnLCcpLAogICAgKDB4RkUxMSwgJ00nLCB1J+OAgScpLAogICAgKDB4RkUxMiwgJ1gnKSwKICAgICgweEZFMTMsICczJywgdSc6JyksCiAgICAoMHhGRTE0LCAnMycsIHUnOycpLAogICAgKDB4RkUxNSwgJzMnLCB1JyEnKSwKICAgICgweEZFMTYsICczJywgdSc/JyksCiAgICAoMHhGRTE3LCAnTScsIHUn44CWJyksCiAgICAoMHhGRTE4LCAnTScsIHUn44CXJyksCiAgICAoMHhGRTE5LCAnWCcpLAogICAgKDB4RkUyMCwgJ1YnKSwKICAgICgweEZFMjcsICdYJyksCiAgICAoMHhGRTMxLCAnTScsIHUn4oCUJyksCiAgICAoMHhGRTMyLCAnTScsIHUn4oCTJyksCiAgICAoMHhGRTMzLCAnMycsIHUnXycpLAogICAgKDB4RkUzNSwgJzMnLCB1JygnKSwKICAgICgweEZFMzYsICczJywgdScpJyksCiAgICAoMHhGRTM3LCAnMycsIHUneycpLAogICAgKDB4RkUzOCwgJzMnLCB1J30nKSwKICAgICgweEZFMzksICdNJywgdSfjgJQnKSwKICAgICgweEZFM0EsICdNJywgdSfjgJUnKSwKICAgICgweEZFM0IsICdNJywgdSfjgJAnKSwKICAgICgweEZFM0MsICdNJywgdSfjgJEnKSwKICAgICgweEZFM0QsICdNJywgdSfjgIonKSwKICAgICgweEZFM0UsICdNJywgdSfjgIsnKSwKICAgIF0KCmRlZiBfc2VnXzQ4KCk6CiAgICByZXR1cm4gWwogICAgKDB4RkUzRiwgJ00nLCB1J+OAiCcpLAogICAgKDB4RkU0MCwgJ00nLCB1J+OAiScpLAogICAgKDB4RkU0MSwgJ00nLCB1J+OAjCcpLAogICAgKDB4RkU0MiwgJ00nLCB1J+OAjScpLAogICAgKDB4RkU0MywgJ00nLCB1J+OAjicpLAogICAgKDB4RkU0NCwgJ00nLCB1J+OAjycpLAogICAgKDB4RkU0NSwgJ1YnKSwKICAgICgweEZFNDcsICczJywgdSdbJyksCiAgICAoMHhGRTQ4LCAnMycsIHUnXScpLAogICAgKDB4RkU0OSwgJzMnLCB1JyDMhScpLAogICAgKDB4RkU0RCwgJzMnLCB1J18nKSwKICAgICgweEZFNTAsICczJywgdScsJyksCiAgICAoMHhGRTUxLCAnTScsIHUn44CBJyksCiAgICAoMHhGRTUyLCAnWCcpLAogICAgKDB4RkU1NCwgJzMnLCB1JzsnKSwKICAgICgweEZFNTUsICczJywgdSc6JyksCiAgICAoMHhGRTU2LCAnMycsIHUnPycpLAogICAgKDB4RkU1NywgJzMnLCB1JyEnKSwKICAgICgweEZFNTgsICdNJywgdSfigJQnKSwKICAgICgweEZFNTksICczJywgdScoJyksCiAgICAoMHhGRTVBLCAnMycsIHUnKScpLAogICAgKDB4RkU1QiwgJzMnLCB1J3snKSwKICAgICgweEZFNUMsICczJywgdSd9JyksCiAgICAoMHhGRTVELCAnTScsIHUn44CUJyksCiAgICAoMHhGRTVFLCAnTScsIHUn44CVJyksCiAgICAoMHhGRTVGLCAnMycsIHUnIycpLAogICAgKDB4RkU2MCwgJzMnLCB1JyYnKSwKICAgICgweEZFNjEsICczJywgdScqJyksCiAgICAoMHhGRTYyLCAnMycsIHUnKycpLAogICAgKDB4RkU2MywgJ00nLCB1Jy0nKSwKICAgICgweEZFNjQsICczJywgdSc8JyksCiAgICAoMHhGRTY1LCAnMycsIHUnPicpLAogICAgKDB4RkU2NiwgJzMnLCB1Jz0nKSwKICAgICgweEZFNjcsICdYJyksCiAgICAoMHhGRTY4LCAnMycsIHUnXFwnKSwKICAgICgweEZFNjksICczJywgdSckJyksCiAgICAoMHhGRTZBLCAnMycsIHUnJScpLAogICAgKDB4RkU2QiwgJzMnLCB1J0AnKSwKICAgICgweEZFNkMsICdYJyksCiAgICAoMHhGRTcwLCAnMycsIHUnINmLJyksCiAgICAoMHhGRTcxLCAnTScsIHUn2YDZiycpLAogICAgKDB4RkU3MiwgJzMnLCB1JyDZjCcpLAogICAgKDB4RkU3MywgJ1YnKSwKICAgICgweEZFNzQsICczJywgdScg2Y0nKSwKICAgICgweEZFNzUsICdYJyksCiAgICAoMHhGRTc2LCAnMycsIHUnINmOJyksCiAgICAoMHhGRTc3LCAnTScsIHUn2YDZjicpLAogICAgKDB4RkU3OCwgJzMnLCB1JyDZjycpLAogICAgKDB4RkU3OSwgJ00nLCB1J9mA2Y8nKSwKICAgICgweEZFN0EsICczJywgdScg2ZAnKSwKICAgICgweEZFN0IsICdNJywgdSfZgNmQJyksCiAgICAoMHhGRTdDLCAnMycsIHUnINmRJyksCiAgICAoMHhGRTdELCAnTScsIHUn2YDZkScpLAogICAgKDB4RkU3RSwgJzMnLCB1JyDZkicpLAogICAgKDB4RkU3RiwgJ00nLCB1J9mA2ZInKSwKICAgICgweEZFODAsICdNJywgdSfYoScpLAogICAgKDB4RkU4MSwgJ00nLCB1J9iiJyksCiAgICAoMHhGRTgzLCAnTScsIHUn2KMnKSwKICAgICgweEZFODUsICdNJywgdSfYpCcpLAogICAgKDB4RkU4NywgJ00nLCB1J9ilJyksCiAgICAoMHhGRTg5LCAnTScsIHUn2KYnKSwKICAgICgweEZFOEQsICdNJywgdSfYpycpLAogICAgKDB4RkU4RiwgJ00nLCB1J9ioJyksCiAgICAoMHhGRTkzLCAnTScsIHUn2KknKSwKICAgICgweEZFOTUsICdNJywgdSfYqicpLAogICAgKDB4RkU5OSwgJ00nLCB1J9irJyksCiAgICAoMHhGRTlELCAnTScsIHUn2KwnKSwKICAgICgweEZFQTEsICdNJywgdSfYrScpLAogICAgKDB4RkVBNSwgJ00nLCB1J9iuJyksCiAgICAoMHhGRUE5LCAnTScsIHUn2K8nKSwKICAgICgweEZFQUIsICdNJywgdSfYsCcpLAogICAgKDB4RkVBRCwgJ00nLCB1J9ixJyksCiAgICAoMHhGRUFGLCAnTScsIHUn2LInKSwKICAgICgweEZFQjEsICdNJywgdSfYsycpLAogICAgKDB4RkVCNSwgJ00nLCB1J9i0JyksCiAgICAoMHhGRUI5LCAnTScsIHUn2LUnKSwKICAgICgweEZFQkQsICdNJywgdSfYticpLAogICAgKDB4RkVDMSwgJ00nLCB1J9i3JyksCiAgICAoMHhGRUM1LCAnTScsIHUn2LgnKSwKICAgICgweEZFQzksICdNJywgdSfYuScpLAogICAgKDB4RkVDRCwgJ00nLCB1J9i6JyksCiAgICAoMHhGRUQxLCAnTScsIHUn2YEnKSwKICAgICgweEZFRDUsICdNJywgdSfZgicpLAogICAgKDB4RkVEOSwgJ00nLCB1J9mDJyksCiAgICAoMHhGRURELCAnTScsIHUn2YQnKSwKICAgICgweEZFRTEsICdNJywgdSfZhScpLAogICAgKDB4RkVFNSwgJ00nLCB1J9mGJyksCiAgICAoMHhGRUU5LCAnTScsIHUn2YcnKSwKICAgICgweEZFRUQsICdNJywgdSfZiCcpLAogICAgKDB4RkVFRiwgJ00nLCB1J9mJJyksCiAgICAoMHhGRUYxLCAnTScsIHUn2YonKSwKICAgICgweEZFRjUsICdNJywgdSfZhNiiJyksCiAgICAoMHhGRUY3LCAnTScsIHUn2YTYoycpLAogICAgKDB4RkVGOSwgJ00nLCB1J9mE2KUnKSwKICAgICgweEZFRkIsICdNJywgdSfZhNinJyksCiAgICAoMHhGRUZELCAnWCcpLAogICAgKDB4RkVGRiwgJ0knKSwKICAgICgweEZGMDAsICdYJyksCiAgICAoMHhGRjAxLCAnMycsIHUnIScpLAogICAgKDB4RkYwMiwgJzMnLCB1JyInKSwKICAgIF0KCmRlZiBfc2VnXzQ5KCk6CiAgICByZXR1cm4gWwogICAgKDB4RkYwMywgJzMnLCB1JyMnKSwKICAgICgweEZGMDQsICczJywgdSckJyksCiAgICAoMHhGRjA1LCAnMycsIHUnJScpLAogICAgKDB4RkYwNiwgJzMnLCB1JyYnKSwKICAgICgweEZGMDcsICczJywgdSdcJycpLAogICAgKDB4RkYwOCwgJzMnLCB1JygnKSwKICAgICgweEZGMDksICczJywgdScpJyksCiAgICAoMHhGRjBBLCAnMycsIHUnKicpLAogICAgKDB4RkYwQiwgJzMnLCB1JysnKSwKICAgICgweEZGMEMsICczJywgdScsJyksCiAgICAoMHhGRjBELCAnTScsIHUnLScpLAogICAgKDB4RkYwRSwgJ00nLCB1Jy4nKSwKICAgICgweEZGMEYsICczJywgdScvJyksCiAgICAoMHhGRjEwLCAnTScsIHUnMCcpLAogICAgKDB4RkYxMSwgJ00nLCB1JzEnKSwKICAgICgweEZGMTIsICdNJywgdScyJyksCiAgICAoMHhGRjEzLCAnTScsIHUnMycpLAogICAgKDB4RkYxNCwgJ00nLCB1JzQnKSwKICAgICgweEZGMTUsICdNJywgdSc1JyksCiAgICAoMHhGRjE2LCAnTScsIHUnNicpLAogICAgKDB4RkYxNywgJ00nLCB1JzcnKSwKICAgICgweEZGMTgsICdNJywgdSc4JyksCiAgICAoMHhGRjE5LCAnTScsIHUnOScpLAogICAgKDB4RkYxQSwgJzMnLCB1JzonKSwKICAgICgweEZGMUIsICczJywgdSc7JyksCiAgICAoMHhGRjFDLCAnMycsIHUnPCcpLAogICAgKDB4RkYxRCwgJzMnLCB1Jz0nKSwKICAgICgweEZGMUUsICczJywgdSc+JyksCiAgICAoMHhGRjFGLCAnMycsIHUnPycpLAogICAgKDB4RkYyMCwgJzMnLCB1J0AnKSwKICAgICgweEZGMjEsICdNJywgdSdhJyksCiAgICAoMHhGRjIyLCAnTScsIHUnYicpLAogICAgKDB4RkYyMywgJ00nLCB1J2MnKSwKICAgICgweEZGMjQsICdNJywgdSdkJyksCiAgICAoMHhGRjI1LCAnTScsIHUnZScpLAogICAgKDB4RkYyNiwgJ00nLCB1J2YnKSwKICAgICgweEZGMjcsICdNJywgdSdnJyksCiAgICAoMHhGRjI4LCAnTScsIHUnaCcpLAogICAgKDB4RkYyOSwgJ00nLCB1J2knKSwKICAgICgweEZGMkEsICdNJywgdSdqJyksCiAgICAoMHhGRjJCLCAnTScsIHUnaycpLAogICAgKDB4RkYyQywgJ00nLCB1J2wnKSwKICAgICgweEZGMkQsICdNJywgdSdtJyksCiAgICAoMHhGRjJFLCAnTScsIHUnbicpLAogICAgKDB4RkYyRiwgJ00nLCB1J28nKSwKICAgICgweEZGMzAsICdNJywgdSdwJyksCiAgICAoMHhGRjMxLCAnTScsIHUncScpLAogICAgKDB4RkYzMiwgJ00nLCB1J3InKSwKICAgICgweEZGMzMsICdNJywgdSdzJyksCiAgICAoMHhGRjM0LCAnTScsIHUndCcpLAogICAgKDB4RkYzNSwgJ00nLCB1J3UnKSwKICAgICgweEZGMzYsICdNJywgdSd2JyksCiAgICAoMHhGRjM3LCAnTScsIHUndycpLAogICAgKDB4RkYzOCwgJ00nLCB1J3gnKSwKICAgICgweEZGMzksICdNJywgdSd5JyksCiAgICAoMHhGRjNBLCAnTScsIHUneicpLAogICAgKDB4RkYzQiwgJzMnLCB1J1snKSwKICAgICgweEZGM0MsICczJywgdSdcXCcpLAogICAgKDB4RkYzRCwgJzMnLCB1J10nKSwKICAgICgweEZGM0UsICczJywgdSdeJyksCiAgICAoMHhGRjNGLCAnMycsIHUnXycpLAogICAgKDB4RkY0MCwgJzMnLCB1J2AnKSwKICAgICgweEZGNDEsICdNJywgdSdhJyksCiAgICAoMHhGRjQyLCAnTScsIHUnYicpLAogICAgKDB4RkY0MywgJ00nLCB1J2MnKSwKICAgICgweEZGNDQsICdNJywgdSdkJyksCiAgICAoMHhGRjQ1LCAnTScsIHUnZScpLAogICAgKDB4RkY0NiwgJ00nLCB1J2YnKSwKICAgICgweEZGNDcsICdNJywgdSdnJyksCiAgICAoMHhGRjQ4LCAnTScsIHUnaCcpLAogICAgKDB4RkY0OSwgJ00nLCB1J2knKSwKICAgICgweEZGNEEsICdNJywgdSdqJyksCiAgICAoMHhGRjRCLCAnTScsIHUnaycpLAogICAgKDB4RkY0QywgJ00nLCB1J2wnKSwKICAgICgweEZGNEQsICdNJywgdSdtJyksCiAgICAoMHhGRjRFLCAnTScsIHUnbicpLAogICAgKDB4RkY0RiwgJ00nLCB1J28nKSwKICAgICgweEZGNTAsICdNJywgdSdwJyksCiAgICAoMHhGRjUxLCAnTScsIHUncScpLAogICAgKDB4RkY1MiwgJ00nLCB1J3InKSwKICAgICgweEZGNTMsICdNJywgdSdzJyksCiAgICAoMHhGRjU0LCAnTScsIHUndCcpLAogICAgKDB4RkY1NSwgJ00nLCB1J3UnKSwKICAgICgweEZGNTYsICdNJywgdSd2JyksCiAgICAoMHhGRjU3LCAnTScsIHUndycpLAogICAgKDB4RkY1OCwgJ00nLCB1J3gnKSwKICAgICgweEZGNTksICdNJywgdSd5JyksCiAgICAoMHhGRjVBLCAnTScsIHUneicpLAogICAgKDB4RkY1QiwgJzMnLCB1J3snKSwKICAgICgweEZGNUMsICczJywgdSd8JyksCiAgICAoMHhGRjVELCAnMycsIHUnfScpLAogICAgKDB4RkY1RSwgJzMnLCB1J34nKSwKICAgICgweEZGNUYsICdNJywgdSfipoUnKSwKICAgICgweEZGNjAsICdNJywgdSfipoYnKSwKICAgICgweEZGNjEsICdNJywgdScuJyksCiAgICAoMHhGRjYyLCAnTScsIHUn44CMJyksCiAgICAoMHhGRjYzLCAnTScsIHUn44CNJyksCiAgICAoMHhGRjY0LCAnTScsIHUn44CBJyksCiAgICAoMHhGRjY1LCAnTScsIHUn44O7JyksCiAgICAoMHhGRjY2LCAnTScsIHUn44OyJyksCiAgICBdCgpkZWYgX3NlZ181MCgpOgogICAgcmV0dXJuIFsKICAgICgweEZGNjcsICdNJywgdSfjgqEnKSwKICAgICgweEZGNjgsICdNJywgdSfjgqMnKSwKICAgICgweEZGNjksICdNJywgdSfjgqUnKSwKICAgICgweEZGNkEsICdNJywgdSfjgqcnKSwKICAgICgweEZGNkIsICdNJywgdSfjgqknKSwKICAgICgweEZGNkMsICdNJywgdSfjg6MnKSwKICAgICgweEZGNkQsICdNJywgdSfjg6UnKSwKICAgICgweEZGNkUsICdNJywgdSfjg6cnKSwKICAgICgweEZGNkYsICdNJywgdSfjg4MnKSwKICAgICgweEZGNzAsICdNJywgdSfjg7wnKSwKICAgICgweEZGNzEsICdNJywgdSfjgqInKSwKICAgICgweEZGNzIsICdNJywgdSfjgqQnKSwKICAgICgweEZGNzMsICdNJywgdSfjgqYnKSwKICAgICgweEZGNzQsICdNJywgdSfjgqgnKSwKICAgICgweEZGNzUsICdNJywgdSfjgqonKSwKICAgICgweEZGNzYsICdNJywgdSfjgqsnKSwKICAgICgweEZGNzcsICdNJywgdSfjgq0nKSwKICAgICgweEZGNzgsICdNJywgdSfjgq8nKSwKICAgICgweEZGNzksICdNJywgdSfjgrEnKSwKICAgICgweEZGN0EsICdNJywgdSfjgrMnKSwKICAgICgweEZGN0IsICdNJywgdSfjgrUnKSwKICAgICgweEZGN0MsICdNJywgdSfjgrcnKSwKICAgICgweEZGN0QsICdNJywgdSfjgrknKSwKICAgICgweEZGN0UsICdNJywgdSfjgrsnKSwKICAgICgweEZGN0YsICdNJywgdSfjgr0nKSwKICAgICgweEZGODAsICdNJywgdSfjgr8nKSwKICAgICgweEZGODEsICdNJywgdSfjg4EnKSwKICAgICgweEZGODIsICdNJywgdSfjg4QnKSwKICAgICgweEZGODMsICdNJywgdSfjg4YnKSwKICAgICgweEZGODQsICdNJywgdSfjg4gnKSwKICAgICgweEZGODUsICdNJywgdSfjg4onKSwKICAgICgweEZGODYsICdNJywgdSfjg4snKSwKICAgICgweEZGODcsICdNJywgdSfjg4wnKSwKICAgICgweEZGODgsICdNJywgdSfjg40nKSwKICAgICgweEZGODksICdNJywgdSfjg44nKSwKICAgICgweEZGOEEsICdNJywgdSfjg48nKSwKICAgICgweEZGOEIsICdNJywgdSfjg5InKSwKICAgICgweEZGOEMsICdNJywgdSfjg5UnKSwKICAgICgweEZGOEQsICdNJywgdSfjg5gnKSwKICAgICgweEZGOEUsICdNJywgdSfjg5snKSwKICAgICgweEZGOEYsICdNJywgdSfjg54nKSwKICAgICgweEZGOTAsICdNJywgdSfjg58nKSwKICAgICgweEZGOTEsICdNJywgdSfjg6AnKSwKICAgICgweEZGOTIsICdNJywgdSfjg6EnKSwKICAgICgweEZGOTMsICdNJywgdSfjg6InKSwKICAgICgweEZGOTQsICdNJywgdSfjg6QnKSwKICAgICgweEZGOTUsICdNJywgdSfjg6YnKSwKICAgICgweEZGOTYsICdNJywgdSfjg6gnKSwKICAgICgweEZGOTcsICdNJywgdSfjg6knKSwKICAgICgweEZGOTgsICdNJywgdSfjg6onKSwKICAgICgweEZGOTksICdNJywgdSfjg6snKSwKICAgICgweEZGOUEsICdNJywgdSfjg6wnKSwKICAgICgweEZGOUIsICdNJywgdSfjg60nKSwKICAgICgweEZGOUMsICdNJywgdSfjg68nKSwKICAgICgweEZGOUQsICdNJywgdSfjg7MnKSwKICAgICgweEZGOUUsICdNJywgdSfjgpknKSwKICAgICgweEZGOUYsICdNJywgdSfjgponKSwKICAgICgweEZGQTAsICdYJyksCiAgICAoMHhGRkExLCAnTScsIHUn4YSAJyksCiAgICAoMHhGRkEyLCAnTScsIHUn4YSBJyksCiAgICAoMHhGRkEzLCAnTScsIHUn4YaqJyksCiAgICAoMHhGRkE0LCAnTScsIHUn4YSCJyksCiAgICAoMHhGRkE1LCAnTScsIHUn4YasJyksCiAgICAoMHhGRkE2LCAnTScsIHUn4YatJyksCiAgICAoMHhGRkE3LCAnTScsIHUn4YSDJyksCiAgICAoMHhGRkE4LCAnTScsIHUn4YSEJyksCiAgICAoMHhGRkE5LCAnTScsIHUn4YSFJyksCiAgICAoMHhGRkFBLCAnTScsIHUn4YawJyksCiAgICAoMHhGRkFCLCAnTScsIHUn4YaxJyksCiAgICAoMHhGRkFDLCAnTScsIHUn4YayJyksCiAgICAoMHhGRkFELCAnTScsIHUn4YazJyksCiAgICAoMHhGRkFFLCAnTScsIHUn4Ya0JyksCiAgICAoMHhGRkFGLCAnTScsIHUn4Ya1JyksCiAgICAoMHhGRkIwLCAnTScsIHUn4YSaJyksCiAgICAoMHhGRkIxLCAnTScsIHUn4YSGJyksCiAgICAoMHhGRkIyLCAnTScsIHUn4YSHJyksCiAgICAoMHhGRkIzLCAnTScsIHUn4YSIJyksCiAgICAoMHhGRkI0LCAnTScsIHUn4YShJyksCiAgICAoMHhGRkI1LCAnTScsIHUn4YSJJyksCiAgICAoMHhGRkI2LCAnTScsIHUn4YSKJyksCiAgICAoMHhGRkI3LCAnTScsIHUn4YSLJyksCiAgICAoMHhGRkI4LCAnTScsIHUn4YSMJyksCiAgICAoMHhGRkI5LCAnTScsIHUn4YSNJyksCiAgICAoMHhGRkJBLCAnTScsIHUn4YSOJyksCiAgICAoMHhGRkJCLCAnTScsIHUn4YSPJyksCiAgICAoMHhGRkJDLCAnTScsIHUn4YSQJyksCiAgICAoMHhGRkJELCAnTScsIHUn4YSRJyksCiAgICAoMHhGRkJFLCAnTScsIHUn4YSSJyksCiAgICAoMHhGRkJGLCAnWCcpLAogICAgKDB4RkZDMiwgJ00nLCB1J+GFoScpLAogICAgKDB4RkZDMywgJ00nLCB1J+GFoicpLAogICAgKDB4RkZDNCwgJ00nLCB1J+GFoycpLAogICAgKDB4RkZDNSwgJ00nLCB1J+GFpCcpLAogICAgKDB4RkZDNiwgJ00nLCB1J+GFpScpLAogICAgKDB4RkZDNywgJ00nLCB1J+GFpicpLAogICAgKDB4RkZDOCwgJ1gnKSwKICAgICgweEZGQ0EsICdNJywgdSfhhacnKSwKICAgICgweEZGQ0IsICdNJywgdSfhhagnKSwKICAgICgweEZGQ0MsICdNJywgdSfhhaknKSwKICAgICgweEZGQ0QsICdNJywgdSfhhaonKSwKICAgIF0KCmRlZiBfc2VnXzUxKCk6CiAgICByZXR1cm4gWwogICAgKDB4RkZDRSwgJ00nLCB1J+GFqycpLAogICAgKDB4RkZDRiwgJ00nLCB1J+GFrCcpLAogICAgKDB4RkZEMCwgJ1gnKSwKICAgICgweEZGRDIsICdNJywgdSfhha0nKSwKICAgICgweEZGRDMsICdNJywgdSfhha4nKSwKICAgICgweEZGRDQsICdNJywgdSfhha8nKSwKICAgICgweEZGRDUsICdNJywgdSfhhbAnKSwKICAgICgweEZGRDYsICdNJywgdSfhhbEnKSwKICAgICgweEZGRDcsICdNJywgdSfhhbInKSwKICAgICgweEZGRDgsICdYJyksCiAgICAoMHhGRkRBLCAnTScsIHUn4YWzJyksCiAgICAoMHhGRkRCLCAnTScsIHUn4YW0JyksCiAgICAoMHhGRkRDLCAnTScsIHUn4YW1JyksCiAgICAoMHhGRkRELCAnWCcpLAogICAgKDB4RkZFMCwgJ00nLCB1J8KiJyksCiAgICAoMHhGRkUxLCAnTScsIHUnwqMnKSwKICAgICgweEZGRTIsICdNJywgdSfCrCcpLAogICAgKDB4RkZFMywgJzMnLCB1JyDMhCcpLAogICAgKDB4RkZFNCwgJ00nLCB1J8KmJyksCiAgICAoMHhGRkU1LCAnTScsIHUnwqUnKSwKICAgICgweEZGRTYsICdNJywgdSfigqknKSwKICAgICgweEZGRTcsICdYJyksCiAgICAoMHhGRkU4LCAnTScsIHUn4pSCJyksCiAgICAoMHhGRkU5LCAnTScsIHUn4oaQJyksCiAgICAoMHhGRkVBLCAnTScsIHUn4oaRJyksCiAgICAoMHhGRkVCLCAnTScsIHUn4oaSJyksCiAgICAoMHhGRkVDLCAnTScsIHUn4oaTJyksCiAgICAoMHhGRkVELCAnTScsIHUn4pagJyksCiAgICAoMHhGRkVFLCAnTScsIHUn4peLJyksCiAgICAoMHhGRkVGLCAnWCcpLAogICAgKDB4MTAwMDAsICdWJyksCiAgICAoMHgxMDAwQywgJ1gnKSwKICAgICgweDEwMDBELCAnVicpLAogICAgKDB4MTAwMjcsICdYJyksCiAgICAoMHgxMDAyOCwgJ1YnKSwKICAgICgweDEwMDNCLCAnWCcpLAogICAgKDB4MTAwM0MsICdWJyksCiAgICAoMHgxMDAzRSwgJ1gnKSwKICAgICgweDEwMDNGLCAnVicpLAogICAgKDB4MTAwNEUsICdYJyksCiAgICAoMHgxMDA1MCwgJ1YnKSwKICAgICgweDEwMDVFLCAnWCcpLAogICAgKDB4MTAwODAsICdWJyksCiAgICAoMHgxMDBGQiwgJ1gnKSwKICAgICgweDEwMTAwLCAnVicpLAogICAgKDB4MTAxMDMsICdYJyksCiAgICAoMHgxMDEwNywgJ1YnKSwKICAgICgweDEwMTM0LCAnWCcpLAogICAgKDB4MTAxMzcsICdWJyksCiAgICAoMHgxMDE4QiwgJ1gnKSwKICAgICgweDEwMTkwLCAnVicpLAogICAgKDB4MTAxOUMsICdYJyksCiAgICAoMHgxMDFEMCwgJ1YnKSwKICAgICgweDEwMUZFLCAnWCcpLAogICAgKDB4MTAyODAsICdWJyksCiAgICAoMHgxMDI5RCwgJ1gnKSwKICAgICgweDEwMkEwLCAnVicpLAogICAgKDB4MTAyRDEsICdYJyksCiAgICAoMHgxMDMwMCwgJ1YnKSwKICAgICgweDEwMzFGLCAnWCcpLAogICAgKDB4MTAzMjAsICdWJyksCiAgICAoMHgxMDMyNCwgJ1gnKSwKICAgICgweDEwMzMwLCAnVicpLAogICAgKDB4MTAzNEIsICdYJyksCiAgICAoMHgxMDM4MCwgJ1YnKSwKICAgICgweDEwMzlFLCAnWCcpLAogICAgKDB4MTAzOUYsICdWJyksCiAgICAoMHgxMDNDNCwgJ1gnKSwKICAgICgweDEwM0M4LCAnVicpLAogICAgKDB4MTAzRDYsICdYJyksCiAgICAoMHgxMDQwMCwgJ00nLCB1J/CQkKgnKSwKICAgICgweDEwNDAxLCAnTScsIHUn8JCQqScpLAogICAgKDB4MTA0MDIsICdNJywgdSfwkJCqJyksCiAgICAoMHgxMDQwMywgJ00nLCB1J/CQkKsnKSwKICAgICgweDEwNDA0LCAnTScsIHUn8JCQrCcpLAogICAgKDB4MTA0MDUsICdNJywgdSfwkJCtJyksCiAgICAoMHgxMDQwNiwgJ00nLCB1J/CQkK4nKSwKICAgICgweDEwNDA3LCAnTScsIHUn8JCQrycpLAogICAgKDB4MTA0MDgsICdNJywgdSfwkJCwJyksCiAgICAoMHgxMDQwOSwgJ00nLCB1J/CQkLEnKSwKICAgICgweDEwNDBBLCAnTScsIHUn8JCQsicpLAogICAgKDB4MTA0MEIsICdNJywgdSfwkJCzJyksCiAgICAoMHgxMDQwQywgJ00nLCB1J/CQkLQnKSwKICAgICgweDEwNDBELCAnTScsIHUn8JCQtScpLAogICAgKDB4MTA0MEUsICdNJywgdSfwkJC2JyksCiAgICAoMHgxMDQwRiwgJ00nLCB1J/CQkLcnKSwKICAgICgweDEwNDEwLCAnTScsIHUn8JCQuCcpLAogICAgKDB4MTA0MTEsICdNJywgdSfwkJC5JyksCiAgICAoMHgxMDQxMiwgJ00nLCB1J/CQkLonKSwKICAgICgweDEwNDEzLCAnTScsIHUn8JCQuycpLAogICAgKDB4MTA0MTQsICdNJywgdSfwkJC8JyksCiAgICAoMHgxMDQxNSwgJ00nLCB1J/CQkL0nKSwKICAgICgweDEwNDE2LCAnTScsIHUn8JCQvicpLAogICAgKDB4MTA0MTcsICdNJywgdSfwkJC/JyksCiAgICAoMHgxMDQxOCwgJ00nLCB1J/CQkYAnKSwKICAgICgweDEwNDE5LCAnTScsIHUn8JCRgScpLAogICAgKDB4MTA0MUEsICdNJywgdSfwkJGCJyksCiAgICAoMHgxMDQxQiwgJ00nLCB1J/CQkYMnKSwKICAgICgweDEwNDFDLCAnTScsIHUn8JCRhCcpLAogICAgKDB4MTA0MUQsICdNJywgdSfwkJGFJyksCiAgICBdCgpkZWYgX3NlZ181MigpOgogICAgcmV0dXJuIFsKICAgICgweDEwNDFFLCAnTScsIHUn8JCRhicpLAogICAgKDB4MTA0MUYsICdNJywgdSfwkJGHJyksCiAgICAoMHgxMDQyMCwgJ00nLCB1J/CQkYgnKSwKICAgICgweDEwNDIxLCAnTScsIHUn8JCRiScpLAogICAgKDB4MTA0MjIsICdNJywgdSfwkJGKJyksCiAgICAoMHgxMDQyMywgJ00nLCB1J/CQkYsnKSwKICAgICgweDEwNDI0LCAnTScsIHUn8JCRjCcpLAogICAgKDB4MTA0MjUsICdNJywgdSfwkJGNJyksCiAgICAoMHgxMDQyNiwgJ00nLCB1J/CQkY4nKSwKICAgICgweDEwNDI3LCAnTScsIHUn8JCRjycpLAogICAgKDB4MTA0MjgsICdWJyksCiAgICAoMHgxMDQ5RSwgJ1gnKSwKICAgICgweDEwNEEwLCAnVicpLAogICAgKDB4MTA0QUEsICdYJyksCiAgICAoMHgxMDgwMCwgJ1YnKSwKICAgICgweDEwODA2LCAnWCcpLAogICAgKDB4MTA4MDgsICdWJyksCiAgICAoMHgxMDgwOSwgJ1gnKSwKICAgICgweDEwODBBLCAnVicpLAogICAgKDB4MTA4MzYsICdYJyksCiAgICAoMHgxMDgzNywgJ1YnKSwKICAgICgweDEwODM5LCAnWCcpLAogICAgKDB4MTA4M0MsICdWJyksCiAgICAoMHgxMDgzRCwgJ1gnKSwKICAgICgweDEwODNGLCAnVicpLAogICAgKDB4MTA4NTYsICdYJyksCiAgICAoMHgxMDg1NywgJ1YnKSwKICAgICgweDEwODYwLCAnWCcpLAogICAgKDB4MTA5MDAsICdWJyksCiAgICAoMHgxMDkxQywgJ1gnKSwKICAgICgweDEwOTFGLCAnVicpLAogICAgKDB4MTA5M0EsICdYJyksCiAgICAoMHgxMDkzRiwgJ1YnKSwKICAgICgweDEwOTQwLCAnWCcpLAogICAgKDB4MTA5ODAsICdWJyksCiAgICAoMHgxMDlCOCwgJ1gnKSwKICAgICgweDEwOUJFLCAnVicpLAogICAgKDB4MTA5QzAsICdYJyksCiAgICAoMHgxMEEwMCwgJ1YnKSwKICAgICgweDEwQTA0LCAnWCcpLAogICAgKDB4MTBBMDUsICdWJyksCiAgICAoMHgxMEEwNywgJ1gnKSwKICAgICgweDEwQTBDLCAnVicpLAogICAgKDB4MTBBMTQsICdYJyksCiAgICAoMHgxMEExNSwgJ1YnKSwKICAgICgweDEwQTE4LCAnWCcpLAogICAgKDB4MTBBMTksICdWJyksCiAgICAoMHgxMEEzNCwgJ1gnKSwKICAgICgweDEwQTM4LCAnVicpLAogICAgKDB4MTBBM0IsICdYJyksCiAgICAoMHgxMEEzRiwgJ1YnKSwKICAgICgweDEwQTQ4LCAnWCcpLAogICAgKDB4MTBBNTAsICdWJyksCiAgICAoMHgxMEE1OSwgJ1gnKSwKICAgICgweDEwQTYwLCAnVicpLAogICAgKDB4MTBBODAsICdYJyksCiAgICAoMHgxMEIwMCwgJ1YnKSwKICAgICgweDEwQjM2LCAnWCcpLAogICAgKDB4MTBCMzksICdWJyksCiAgICAoMHgxMEI1NiwgJ1gnKSwKICAgICgweDEwQjU4LCAnVicpLAogICAgKDB4MTBCNzMsICdYJyksCiAgICAoMHgxMEI3OCwgJ1YnKSwKICAgICgweDEwQjgwLCAnWCcpLAogICAgKDB4MTBDMDAsICdWJyksCiAgICAoMHgxMEM0OSwgJ1gnKSwKICAgICgweDEwRTYwLCAnVicpLAogICAgKDB4MTBFN0YsICdYJyksCiAgICAoMHgxMTAwMCwgJ1YnKSwKICAgICgweDExMDRFLCAnWCcpLAogICAgKDB4MTEwNTIsICdWJyksCiAgICAoMHgxMTA3MCwgJ1gnKSwKICAgICgweDExMDgwLCAnVicpLAogICAgKDB4MTEwQkQsICdYJyksCiAgICAoMHgxMTBCRSwgJ1YnKSwKICAgICgweDExMEMyLCAnWCcpLAogICAgKDB4MTEwRDAsICdWJyksCiAgICAoMHgxMTBFOSwgJ1gnKSwKICAgICgweDExMEYwLCAnVicpLAogICAgKDB4MTEwRkEsICdYJyksCiAgICAoMHgxMTEwMCwgJ1YnKSwKICAgICgweDExMTM1LCAnWCcpLAogICAgKDB4MTExMzYsICdWJyksCiAgICAoMHgxMTE0NCwgJ1gnKSwKICAgICgweDExMTgwLCAnVicpLAogICAgKDB4MTExQzksICdYJyksCiAgICAoMHgxMTFEMCwgJ1YnKSwKICAgICgweDExMURBLCAnWCcpLAogICAgKDB4MTE2ODAsICdWJyksCiAgICAoMHgxMTZCOCwgJ1gnKSwKICAgICgweDExNkMwLCAnVicpLAogICAgKDB4MTE2Q0EsICdYJyksCiAgICAoMHgxMjAwMCwgJ1YnKSwKICAgICgweDEyMzZGLCAnWCcpLAogICAgKDB4MTI0MDAsICdWJyksCiAgICAoMHgxMjQ2MywgJ1gnKSwKICAgICgweDEyNDcwLCAnVicpLAogICAgKDB4MTI0NzQsICdYJyksCiAgICAoMHgxMzAwMCwgJ1YnKSwKICAgICgweDEzNDJGLCAnWCcpLAogICAgXQoKZGVmIF9zZWdfNTMoKToKICAgIHJldHVybiBbCiAgICAoMHgxNjgwMCwgJ1YnKSwKICAgICgweDE2QTM5LCAnWCcpLAogICAgKDB4MTZGMDAsICdWJyksCiAgICAoMHgxNkY0NSwgJ1gnKSwKICAgICgweDE2RjUwLCAnVicpLAogICAgKDB4MTZGN0YsICdYJyksCiAgICAoMHgxNkY4RiwgJ1YnKSwKICAgICgweDE2RkEwLCAnWCcpLAogICAgKDB4MUIwMDAsICdWJyksCiAgICAoMHgxQjAwMiwgJ1gnKSwKICAgICgweDFEMDAwLCAnVicpLAogICAgKDB4MUQwRjYsICdYJyksCiAgICAoMHgxRDEwMCwgJ1YnKSwKICAgICgweDFEMTI3LCAnWCcpLAogICAgKDB4MUQxMjksICdWJyksCiAgICAoMHgxRDE1RSwgJ00nLCB1J/CdhZfwnYWlJyksCiAgICAoMHgxRDE1RiwgJ00nLCB1J/CdhZjwnYWlJyksCiAgICAoMHgxRDE2MCwgJ00nLCB1J/CdhZjwnYWl8J2FricpLAogICAgKDB4MUQxNjEsICdNJywgdSfwnYWY8J2FpfCdha8nKSwKICAgICgweDFEMTYyLCAnTScsIHUn8J2FmPCdhaXwnYWwJyksCiAgICAoMHgxRDE2MywgJ00nLCB1J/CdhZjwnYWl8J2FsScpLAogICAgKDB4MUQxNjQsICdNJywgdSfwnYWY8J2FpfCdhbInKSwKICAgICgweDFEMTY1LCAnVicpLAogICAgKDB4MUQxNzMsICdYJyksCiAgICAoMHgxRDE3QiwgJ1YnKSwKICAgICgweDFEMUJCLCAnTScsIHUn8J2GufCdhaUnKSwKICAgICgweDFEMUJDLCAnTScsIHUn8J2GuvCdhaUnKSwKICAgICgweDFEMUJELCAnTScsIHUn8J2GufCdhaXwnYWuJyksCiAgICAoMHgxRDFCRSwgJ00nLCB1J/CdhrrwnYWl8J2FricpLAogICAgKDB4MUQxQkYsICdNJywgdSfwnYa58J2FpfCdha8nKSwKICAgICgweDFEMUMwLCAnTScsIHUn8J2GuvCdhaXwnYWvJyksCiAgICAoMHgxRDFDMSwgJ1YnKSwKICAgICgweDFEMURFLCAnWCcpLAogICAgKDB4MUQyMDAsICdWJyksCiAgICAoMHgxRDI0NiwgJ1gnKSwKICAgICgweDFEMzAwLCAnVicpLAogICAgKDB4MUQzNTcsICdYJyksCiAgICAoMHgxRDM2MCwgJ1YnKSwKICAgICgweDFEMzcyLCAnWCcpLAogICAgKDB4MUQ0MDAsICdNJywgdSdhJyksCiAgICAoMHgxRDQwMSwgJ00nLCB1J2InKSwKICAgICgweDFENDAyLCAnTScsIHUnYycpLAogICAgKDB4MUQ0MDMsICdNJywgdSdkJyksCiAgICAoMHgxRDQwNCwgJ00nLCB1J2UnKSwKICAgICgweDFENDA1LCAnTScsIHUnZicpLAogICAgKDB4MUQ0MDYsICdNJywgdSdnJyksCiAgICAoMHgxRDQwNywgJ00nLCB1J2gnKSwKICAgICgweDFENDA4LCAnTScsIHUnaScpLAogICAgKDB4MUQ0MDksICdNJywgdSdqJyksCiAgICAoMHgxRDQwQSwgJ00nLCB1J2snKSwKICAgICgweDFENDBCLCAnTScsIHUnbCcpLAogICAgKDB4MUQ0MEMsICdNJywgdSdtJyksCiAgICAoMHgxRDQwRCwgJ00nLCB1J24nKSwKICAgICgweDFENDBFLCAnTScsIHUnbycpLAogICAgKDB4MUQ0MEYsICdNJywgdSdwJyksCiAgICAoMHgxRDQxMCwgJ00nLCB1J3EnKSwKICAgICgweDFENDExLCAnTScsIHUncicpLAogICAgKDB4MUQ0MTIsICdNJywgdSdzJyksCiAgICAoMHgxRDQxMywgJ00nLCB1J3QnKSwKICAgICgweDFENDE0LCAnTScsIHUndScpLAogICAgKDB4MUQ0MTUsICdNJywgdSd2JyksCiAgICAoMHgxRDQxNiwgJ00nLCB1J3cnKSwKICAgICgweDFENDE3LCAnTScsIHUneCcpLAogICAgKDB4MUQ0MTgsICdNJywgdSd5JyksCiAgICAoMHgxRDQxOSwgJ00nLCB1J3onKSwKICAgICgweDFENDFBLCAnTScsIHUnYScpLAogICAgKDB4MUQ0MUIsICdNJywgdSdiJyksCiAgICAoMHgxRDQxQywgJ00nLCB1J2MnKSwKICAgICgweDFENDFELCAnTScsIHUnZCcpLAogICAgKDB4MUQ0MUUsICdNJywgdSdlJyksCiAgICAoMHgxRDQxRiwgJ00nLCB1J2YnKSwKICAgICgweDFENDIwLCAnTScsIHUnZycpLAogICAgKDB4MUQ0MjEsICdNJywgdSdoJyksCiAgICAoMHgxRDQyMiwgJ00nLCB1J2knKSwKICAgICgweDFENDIzLCAnTScsIHUnaicpLAogICAgKDB4MUQ0MjQsICdNJywgdSdrJyksCiAgICAoMHgxRDQyNSwgJ00nLCB1J2wnKSwKICAgICgweDFENDI2LCAnTScsIHUnbScpLAogICAgKDB4MUQ0MjcsICdNJywgdSduJyksCiAgICAoMHgxRDQyOCwgJ00nLCB1J28nKSwKICAgICgweDFENDI5LCAnTScsIHUncCcpLAogICAgKDB4MUQ0MkEsICdNJywgdSdxJyksCiAgICAoMHgxRDQyQiwgJ00nLCB1J3InKSwKICAgICgweDFENDJDLCAnTScsIHUncycpLAogICAgKDB4MUQ0MkQsICdNJywgdSd0JyksCiAgICAoMHgxRDQyRSwgJ00nLCB1J3UnKSwKICAgICgweDFENDJGLCAnTScsIHUndicpLAogICAgKDB4MUQ0MzAsICdNJywgdSd3JyksCiAgICAoMHgxRDQzMSwgJ00nLCB1J3gnKSwKICAgICgweDFENDMyLCAnTScsIHUneScpLAogICAgKDB4MUQ0MzMsICdNJywgdSd6JyksCiAgICAoMHgxRDQzNCwgJ00nLCB1J2EnKSwKICAgICgweDFENDM1LCAnTScsIHUnYicpLAogICAgKDB4MUQ0MzYsICdNJywgdSdjJyksCiAgICAoMHgxRDQzNywgJ00nLCB1J2QnKSwKICAgICgweDFENDM4LCAnTScsIHUnZScpLAogICAgKDB4MUQ0MzksICdNJywgdSdmJyksCiAgICAoMHgxRDQzQSwgJ00nLCB1J2cnKSwKICAgICgweDFENDNCLCAnTScsIHUnaCcpLAogICAgKDB4MUQ0M0MsICdNJywgdSdpJyksCiAgICBdCgpkZWYgX3NlZ181NCgpOgogICAgcmV0dXJuIFsKICAgICgweDFENDNELCAnTScsIHUnaicpLAogICAgKDB4MUQ0M0UsICdNJywgdSdrJyksCiAgICAoMHgxRDQzRiwgJ00nLCB1J2wnKSwKICAgICgweDFENDQwLCAnTScsIHUnbScpLAogICAgKDB4MUQ0NDEsICdNJywgdSduJyksCiAgICAoMHgxRDQ0MiwgJ00nLCB1J28nKSwKICAgICgweDFENDQzLCAnTScsIHUncCcpLAogICAgKDB4MUQ0NDQsICdNJywgdSdxJyksCiAgICAoMHgxRDQ0NSwgJ00nLCB1J3InKSwKICAgICgweDFENDQ2LCAnTScsIHUncycpLAogICAgKDB4MUQ0NDcsICdNJywgdSd0JyksCiAgICAoMHgxRDQ0OCwgJ00nLCB1J3UnKSwKICAgICgweDFENDQ5LCAnTScsIHUndicpLAogICAgKDB4MUQ0NEEsICdNJywgdSd3JyksCiAgICAoMHgxRDQ0QiwgJ00nLCB1J3gnKSwKICAgICgweDFENDRDLCAnTScsIHUneScpLAogICAgKDB4MUQ0NEQsICdNJywgdSd6JyksCiAgICAoMHgxRDQ0RSwgJ00nLCB1J2EnKSwKICAgICgweDFENDRGLCAnTScsIHUnYicpLAogICAgKDB4MUQ0NTAsICdNJywgdSdjJyksCiAgICAoMHgxRDQ1MSwgJ00nLCB1J2QnKSwKICAgICgweDFENDUyLCAnTScsIHUnZScpLAogICAgKDB4MUQ0NTMsICdNJywgdSdmJyksCiAgICAoMHgxRDQ1NCwgJ00nLCB1J2cnKSwKICAgICgweDFENDU1LCAnWCcpLAogICAgKDB4MUQ0NTYsICdNJywgdSdpJyksCiAgICAoMHgxRDQ1NywgJ00nLCB1J2onKSwKICAgICgweDFENDU4LCAnTScsIHUnaycpLAogICAgKDB4MUQ0NTksICdNJywgdSdsJyksCiAgICAoMHgxRDQ1QSwgJ00nLCB1J20nKSwKICAgICgweDFENDVCLCAnTScsIHUnbicpLAogICAgKDB4MUQ0NUMsICdNJywgdSdvJyksCiAgICAoMHgxRDQ1RCwgJ00nLCB1J3AnKSwKICAgICgweDFENDVFLCAnTScsIHUncScpLAogICAgKDB4MUQ0NUYsICdNJywgdSdyJyksCiAgICAoMHgxRDQ2MCwgJ00nLCB1J3MnKSwKICAgICgweDFENDYxLCAnTScsIHUndCcpLAogICAgKDB4MUQ0NjIsICdNJywgdSd1JyksCiAgICAoMHgxRDQ2MywgJ00nLCB1J3YnKSwKICAgICgweDFENDY0LCAnTScsIHUndycpLAogICAgKDB4MUQ0NjUsICdNJywgdSd4JyksCiAgICAoMHgxRDQ2NiwgJ00nLCB1J3knKSwKICAgICgweDFENDY3LCAnTScsIHUneicpLAogICAgKDB4MUQ0NjgsICdNJywgdSdhJyksCiAgICAoMHgxRDQ2OSwgJ00nLCB1J2InKSwKICAgICgweDFENDZBLCAnTScsIHUnYycpLAogICAgKDB4MUQ0NkIsICdNJywgdSdkJyksCiAgICAoMHgxRDQ2QywgJ00nLCB1J2UnKSwKICAgICgweDFENDZELCAnTScsIHUnZicpLAogICAgKDB4MUQ0NkUsICdNJywgdSdnJyksCiAgICAoMHgxRDQ2RiwgJ00nLCB1J2gnKSwKICAgICgweDFENDcwLCAnTScsIHUnaScpLAogICAgKDB4MUQ0NzEsICdNJywgdSdqJyksCiAgICAoMHgxRDQ3MiwgJ00nLCB1J2snKSwKICAgICgweDFENDczLCAnTScsIHUnbCcpLAogICAgKDB4MUQ0NzQsICdNJywgdSdtJyksCiAgICAoMHgxRDQ3NSwgJ00nLCB1J24nKSwKICAgICgweDFENDc2LCAnTScsIHUnbycpLAogICAgKDB4MUQ0NzcsICdNJywgdSdwJyksCiAgICAoMHgxRDQ3OCwgJ00nLCB1J3EnKSwKICAgICgweDFENDc5LCAnTScsIHUncicpLAogICAgKDB4MUQ0N0EsICdNJywgdSdzJyksCiAgICAoMHgxRDQ3QiwgJ00nLCB1J3QnKSwKICAgICgweDFENDdDLCAnTScsIHUndScpLAogICAgKDB4MUQ0N0QsICdNJywgdSd2JyksCiAgICAoMHgxRDQ3RSwgJ00nLCB1J3cnKSwKICAgICgweDFENDdGLCAnTScsIHUneCcpLAogICAgKDB4MUQ0ODAsICdNJywgdSd5JyksCiAgICAoMHgxRDQ4MSwgJ00nLCB1J3onKSwKICAgICgweDFENDgyLCAnTScsIHUnYScpLAogICAgKDB4MUQ0ODMsICdNJywgdSdiJyksCiAgICAoMHgxRDQ4NCwgJ00nLCB1J2MnKSwKICAgICgweDFENDg1LCAnTScsIHUnZCcpLAogICAgKDB4MUQ0ODYsICdNJywgdSdlJyksCiAgICAoMHgxRDQ4NywgJ00nLCB1J2YnKSwKICAgICgweDFENDg4LCAnTScsIHUnZycpLAogICAgKDB4MUQ0ODksICdNJywgdSdoJyksCiAgICAoMHgxRDQ4QSwgJ00nLCB1J2knKSwKICAgICgweDFENDhCLCAnTScsIHUnaicpLAogICAgKDB4MUQ0OEMsICdNJywgdSdrJyksCiAgICAoMHgxRDQ4RCwgJ00nLCB1J2wnKSwKICAgICgweDFENDhFLCAnTScsIHUnbScpLAogICAgKDB4MUQ0OEYsICdNJywgdSduJyksCiAgICAoMHgxRDQ5MCwgJ00nLCB1J28nKSwKICAgICgweDFENDkxLCAnTScsIHUncCcpLAogICAgKDB4MUQ0OTIsICdNJywgdSdxJyksCiAgICAoMHgxRDQ5MywgJ00nLCB1J3InKSwKICAgICgweDFENDk0LCAnTScsIHUncycpLAogICAgKDB4MUQ0OTUsICdNJywgdSd0JyksCiAgICAoMHgxRDQ5NiwgJ00nLCB1J3UnKSwKICAgICgweDFENDk3LCAnTScsIHUndicpLAogICAgKDB4MUQ0OTgsICdNJywgdSd3JyksCiAgICAoMHgxRDQ5OSwgJ00nLCB1J3gnKSwKICAgICgweDFENDlBLCAnTScsIHUneScpLAogICAgKDB4MUQ0OUIsICdNJywgdSd6JyksCiAgICAoMHgxRDQ5QywgJ00nLCB1J2EnKSwKICAgICgweDFENDlELCAnWCcpLAogICAgKDB4MUQ0OUUsICdNJywgdSdjJyksCiAgICAoMHgxRDQ5RiwgJ00nLCB1J2QnKSwKICAgICgweDFENEEwLCAnWCcpLAogICAgXQoKZGVmIF9zZWdfNTUoKToKICAgIHJldHVybiBbCiAgICAoMHgxRDRBMiwgJ00nLCB1J2cnKSwKICAgICgweDFENEEzLCAnWCcpLAogICAgKDB4MUQ0QTUsICdNJywgdSdqJyksCiAgICAoMHgxRDRBNiwgJ00nLCB1J2snKSwKICAgICgweDFENEE3LCAnWCcpLAogICAgKDB4MUQ0QTksICdNJywgdSduJyksCiAgICAoMHgxRDRBQSwgJ00nLCB1J28nKSwKICAgICgweDFENEFCLCAnTScsIHUncCcpLAogICAgKDB4MUQ0QUMsICdNJywgdSdxJyksCiAgICAoMHgxRDRBRCwgJ1gnKSwKICAgICgweDFENEFFLCAnTScsIHUncycpLAogICAgKDB4MUQ0QUYsICdNJywgdSd0JyksCiAgICAoMHgxRDRCMCwgJ00nLCB1J3UnKSwKICAgICgweDFENEIxLCAnTScsIHUndicpLAogICAgKDB4MUQ0QjIsICdNJywgdSd3JyksCiAgICAoMHgxRDRCMywgJ00nLCB1J3gnKSwKICAgICgweDFENEI0LCAnTScsIHUneScpLAogICAgKDB4MUQ0QjUsICdNJywgdSd6JyksCiAgICAoMHgxRDRCNiwgJ00nLCB1J2EnKSwKICAgICgweDFENEI3LCAnTScsIHUnYicpLAogICAgKDB4MUQ0QjgsICdNJywgdSdjJyksCiAgICAoMHgxRDRCOSwgJ00nLCB1J2QnKSwKICAgICgweDFENEJBLCAnWCcpLAogICAgKDB4MUQ0QkIsICdNJywgdSdmJyksCiAgICAoMHgxRDRCQywgJ1gnKSwKICAgICgweDFENEJELCAnTScsIHUnaCcpLAogICAgKDB4MUQ0QkUsICdNJywgdSdpJyksCiAgICAoMHgxRDRCRiwgJ00nLCB1J2onKSwKICAgICgweDFENEMwLCAnTScsIHUnaycpLAogICAgKDB4MUQ0QzEsICdNJywgdSdsJyksCiAgICAoMHgxRDRDMiwgJ00nLCB1J20nKSwKICAgICgweDFENEMzLCAnTScsIHUnbicpLAogICAgKDB4MUQ0QzQsICdYJyksCiAgICAoMHgxRDRDNSwgJ00nLCB1J3AnKSwKICAgICgweDFENEM2LCAnTScsIHUncScpLAogICAgKDB4MUQ0QzcsICdNJywgdSdyJyksCiAgICAoMHgxRDRDOCwgJ00nLCB1J3MnKSwKICAgICgweDFENEM5LCAnTScsIHUndCcpLAogICAgKDB4MUQ0Q0EsICdNJywgdSd1JyksCiAgICAoMHgxRDRDQiwgJ00nLCB1J3YnKSwKICAgICgweDFENENDLCAnTScsIHUndycpLAogICAgKDB4MUQ0Q0QsICdNJywgdSd4JyksCiAgICAoMHgxRDRDRSwgJ00nLCB1J3knKSwKICAgICgweDFENENGLCAnTScsIHUneicpLAogICAgKDB4MUQ0RDAsICdNJywgdSdhJyksCiAgICAoMHgxRDREMSwgJ00nLCB1J2InKSwKICAgICgweDFENEQyLCAnTScsIHUnYycpLAogICAgKDB4MUQ0RDMsICdNJywgdSdkJyksCiAgICAoMHgxRDRENCwgJ00nLCB1J2UnKSwKICAgICgweDFENEQ1LCAnTScsIHUnZicpLAogICAgKDB4MUQ0RDYsICdNJywgdSdnJyksCiAgICAoMHgxRDRENywgJ00nLCB1J2gnKSwKICAgICgweDFENEQ4LCAnTScsIHUnaScpLAogICAgKDB4MUQ0RDksICdNJywgdSdqJyksCiAgICAoMHgxRDREQSwgJ00nLCB1J2snKSwKICAgICgweDFENERCLCAnTScsIHUnbCcpLAogICAgKDB4MUQ0REMsICdNJywgdSdtJyksCiAgICAoMHgxRDRERCwgJ00nLCB1J24nKSwKICAgICgweDFENERFLCAnTScsIHUnbycpLAogICAgKDB4MUQ0REYsICdNJywgdSdwJyksCiAgICAoMHgxRDRFMCwgJ00nLCB1J3EnKSwKICAgICgweDFENEUxLCAnTScsIHUncicpLAogICAgKDB4MUQ0RTIsICdNJywgdSdzJyksCiAgICAoMHgxRDRFMywgJ00nLCB1J3QnKSwKICAgICgweDFENEU0LCAnTScsIHUndScpLAogICAgKDB4MUQ0RTUsICdNJywgdSd2JyksCiAgICAoMHgxRDRFNiwgJ00nLCB1J3cnKSwKICAgICgweDFENEU3LCAnTScsIHUneCcpLAogICAgKDB4MUQ0RTgsICdNJywgdSd5JyksCiAgICAoMHgxRDRFOSwgJ00nLCB1J3onKSwKICAgICgweDFENEVBLCAnTScsIHUnYScpLAogICAgKDB4MUQ0RUIsICdNJywgdSdiJyksCiAgICAoMHgxRDRFQywgJ00nLCB1J2MnKSwKICAgICgweDFENEVELCAnTScsIHUnZCcpLAogICAgKDB4MUQ0RUUsICdNJywgdSdlJyksCiAgICAoMHgxRDRFRiwgJ00nLCB1J2YnKSwKICAgICgweDFENEYwLCAnTScsIHUnZycpLAogICAgKDB4MUQ0RjEsICdNJywgdSdoJyksCiAgICAoMHgxRDRGMiwgJ00nLCB1J2knKSwKICAgICgweDFENEYzLCAnTScsIHUnaicpLAogICAgKDB4MUQ0RjQsICdNJywgdSdrJyksCiAgICAoMHgxRDRGNSwgJ00nLCB1J2wnKSwKICAgICgweDFENEY2LCAnTScsIHUnbScpLAogICAgKDB4MUQ0RjcsICdNJywgdSduJyksCiAgICAoMHgxRDRGOCwgJ00nLCB1J28nKSwKICAgICgweDFENEY5LCAnTScsIHUncCcpLAogICAgKDB4MUQ0RkEsICdNJywgdSdxJyksCiAgICAoMHgxRDRGQiwgJ00nLCB1J3InKSwKICAgICgweDFENEZDLCAnTScsIHUncycpLAogICAgKDB4MUQ0RkQsICdNJywgdSd0JyksCiAgICAoMHgxRDRGRSwgJ00nLCB1J3UnKSwKICAgICgweDFENEZGLCAnTScsIHUndicpLAogICAgKDB4MUQ1MDAsICdNJywgdSd3JyksCiAgICAoMHgxRDUwMSwgJ00nLCB1J3gnKSwKICAgICgweDFENTAyLCAnTScsIHUneScpLAogICAgKDB4MUQ1MDMsICdNJywgdSd6JyksCiAgICAoMHgxRDUwNCwgJ00nLCB1J2EnKSwKICAgICgweDFENTA1LCAnTScsIHUnYicpLAogICAgKDB4MUQ1MDYsICdYJyksCiAgICAoMHgxRDUwNywgJ00nLCB1J2QnKSwKICAgIF0KCmRlZiBfc2VnXzU2KCk6CiAgICByZXR1cm4gWwogICAgKDB4MUQ1MDgsICdNJywgdSdlJyksCiAgICAoMHgxRDUwOSwgJ00nLCB1J2YnKSwKICAgICgweDFENTBBLCAnTScsIHUnZycpLAogICAgKDB4MUQ1MEIsICdYJyksCiAgICAoMHgxRDUwRCwgJ00nLCB1J2onKSwKICAgICgweDFENTBFLCAnTScsIHUnaycpLAogICAgKDB4MUQ1MEYsICdNJywgdSdsJyksCiAgICAoMHgxRDUxMCwgJ00nLCB1J20nKSwKICAgICgweDFENTExLCAnTScsIHUnbicpLAogICAgKDB4MUQ1MTIsICdNJywgdSdvJyksCiAgICAoMHgxRDUxMywgJ00nLCB1J3AnKSwKICAgICgweDFENTE0LCAnTScsIHUncScpLAogICAgKDB4MUQ1MTUsICdYJyksCiAgICAoMHgxRDUxNiwgJ00nLCB1J3MnKSwKICAgICgweDFENTE3LCAnTScsIHUndCcpLAogICAgKDB4MUQ1MTgsICdNJywgdSd1JyksCiAgICAoMHgxRDUxOSwgJ00nLCB1J3YnKSwKICAgICgweDFENTFBLCAnTScsIHUndycpLAogICAgKDB4MUQ1MUIsICdNJywgdSd4JyksCiAgICAoMHgxRDUxQywgJ00nLCB1J3knKSwKICAgICgweDFENTFELCAnWCcpLAogICAgKDB4MUQ1MUUsICdNJywgdSdhJyksCiAgICAoMHgxRDUxRiwgJ00nLCB1J2InKSwKICAgICgweDFENTIwLCAnTScsIHUnYycpLAogICAgKDB4MUQ1MjEsICdNJywgdSdkJyksCiAgICAoMHgxRDUyMiwgJ00nLCB1J2UnKSwKICAgICgweDFENTIzLCAnTScsIHUnZicpLAogICAgKDB4MUQ1MjQsICdNJywgdSdnJyksCiAgICAoMHgxRDUyNSwgJ00nLCB1J2gnKSwKICAgICgweDFENTI2LCAnTScsIHUnaScpLAogICAgKDB4MUQ1MjcsICdNJywgdSdqJyksCiAgICAoMHgxRDUyOCwgJ00nLCB1J2snKSwKICAgICgweDFENTI5LCAnTScsIHUnbCcpLAogICAgKDB4MUQ1MkEsICdNJywgdSdtJyksCiAgICAoMHgxRDUyQiwgJ00nLCB1J24nKSwKICAgICgweDFENTJDLCAnTScsIHUnbycpLAogICAgKDB4MUQ1MkQsICdNJywgdSdwJyksCiAgICAoMHgxRDUyRSwgJ00nLCB1J3EnKSwKICAgICgweDFENTJGLCAnTScsIHUncicpLAogICAgKDB4MUQ1MzAsICdNJywgdSdzJyksCiAgICAoMHgxRDUzMSwgJ00nLCB1J3QnKSwKICAgICgweDFENTMyLCAnTScsIHUndScpLAogICAgKDB4MUQ1MzMsICdNJywgdSd2JyksCiAgICAoMHgxRDUzNCwgJ00nLCB1J3cnKSwKICAgICgweDFENTM1LCAnTScsIHUneCcpLAogICAgKDB4MUQ1MzYsICdNJywgdSd5JyksCiAgICAoMHgxRDUzNywgJ00nLCB1J3onKSwKICAgICgweDFENTM4LCAnTScsIHUnYScpLAogICAgKDB4MUQ1MzksICdNJywgdSdiJyksCiAgICAoMHgxRDUzQSwgJ1gnKSwKICAgICgweDFENTNCLCAnTScsIHUnZCcpLAogICAgKDB4MUQ1M0MsICdNJywgdSdlJyksCiAgICAoMHgxRDUzRCwgJ00nLCB1J2YnKSwKICAgICgweDFENTNFLCAnTScsIHUnZycpLAogICAgKDB4MUQ1M0YsICdYJyksCiAgICAoMHgxRDU0MCwgJ00nLCB1J2knKSwKICAgICgweDFENTQxLCAnTScsIHUnaicpLAogICAgKDB4MUQ1NDIsICdNJywgdSdrJyksCiAgICAoMHgxRDU0MywgJ00nLCB1J2wnKSwKICAgICgweDFENTQ0LCAnTScsIHUnbScpLAogICAgKDB4MUQ1NDUsICdYJyksCiAgICAoMHgxRDU0NiwgJ00nLCB1J28nKSwKICAgICgweDFENTQ3LCAnWCcpLAogICAgKDB4MUQ1NEEsICdNJywgdSdzJyksCiAgICAoMHgxRDU0QiwgJ00nLCB1J3QnKSwKICAgICgweDFENTRDLCAnTScsIHUndScpLAogICAgKDB4MUQ1NEQsICdNJywgdSd2JyksCiAgICAoMHgxRDU0RSwgJ00nLCB1J3cnKSwKICAgICgweDFENTRGLCAnTScsIHUneCcpLAogICAgKDB4MUQ1NTAsICdNJywgdSd5JyksCiAgICAoMHgxRDU1MSwgJ1gnKSwKICAgICgweDFENTUyLCAnTScsIHUnYScpLAogICAgKDB4MUQ1NTMsICdNJywgdSdiJyksCiAgICAoMHgxRDU1NCwgJ00nLCB1J2MnKSwKICAgICgweDFENTU1LCAnTScsIHUnZCcpLAogICAgKDB4MUQ1NTYsICdNJywgdSdlJyksCiAgICAoMHgxRDU1NywgJ00nLCB1J2YnKSwKICAgICgweDFENTU4LCAnTScsIHUnZycpLAogICAgKDB4MUQ1NTksICdNJywgdSdoJyksCiAgICAoMHgxRDU1QSwgJ00nLCB1J2knKSwKICAgICgweDFENTVCLCAnTScsIHUnaicpLAogICAgKDB4MUQ1NUMsICdNJywgdSdrJyksCiAgICAoMHgxRDU1RCwgJ00nLCB1J2wnKSwKICAgICgweDFENTVFLCAnTScsIHUnbScpLAogICAgKDB4MUQ1NUYsICdNJywgdSduJyksCiAgICAoMHgxRDU2MCwgJ00nLCB1J28nKSwKICAgICgweDFENTYxLCAnTScsIHUncCcpLAogICAgKDB4MUQ1NjIsICdNJywgdSdxJyksCiAgICAoMHgxRDU2MywgJ00nLCB1J3InKSwKICAgICgweDFENTY0LCAnTScsIHUncycpLAogICAgKDB4MUQ1NjUsICdNJywgdSd0JyksCiAgICAoMHgxRDU2NiwgJ00nLCB1J3UnKSwKICAgICgweDFENTY3LCAnTScsIHUndicpLAogICAgKDB4MUQ1NjgsICdNJywgdSd3JyksCiAgICAoMHgxRDU2OSwgJ00nLCB1J3gnKSwKICAgICgweDFENTZBLCAnTScsIHUneScpLAogICAgKDB4MUQ1NkIsICdNJywgdSd6JyksCiAgICAoMHgxRDU2QywgJ00nLCB1J2EnKSwKICAgICgweDFENTZELCAnTScsIHUnYicpLAogICAgKDB4MUQ1NkUsICdNJywgdSdjJyksCiAgICBdCgpkZWYgX3NlZ181NygpOgogICAgcmV0dXJuIFsKICAgICgweDFENTZGLCAnTScsIHUnZCcpLAogICAgKDB4MUQ1NzAsICdNJywgdSdlJyksCiAgICAoMHgxRDU3MSwgJ00nLCB1J2YnKSwKICAgICgweDFENTcyLCAnTScsIHUnZycpLAogICAgKDB4MUQ1NzMsICdNJywgdSdoJyksCiAgICAoMHgxRDU3NCwgJ00nLCB1J2knKSwKICAgICgweDFENTc1LCAnTScsIHUnaicpLAogICAgKDB4MUQ1NzYsICdNJywgdSdrJyksCiAgICAoMHgxRDU3NywgJ00nLCB1J2wnKSwKICAgICgweDFENTc4LCAnTScsIHUnbScpLAogICAgKDB4MUQ1NzksICdNJywgdSduJyksCiAgICAoMHgxRDU3QSwgJ00nLCB1J28nKSwKICAgICgweDFENTdCLCAnTScsIHUncCcpLAogICAgKDB4MUQ1N0MsICdNJywgdSdxJyksCiAgICAoMHgxRDU3RCwgJ00nLCB1J3InKSwKICAgICgweDFENTdFLCAnTScsIHUncycpLAogICAgKDB4MUQ1N0YsICdNJywgdSd0JyksCiAgICAoMHgxRDU4MCwgJ00nLCB1J3UnKSwKICAgICgweDFENTgxLCAnTScsIHUndicpLAogICAgKDB4MUQ1ODIsICdNJywgdSd3JyksCiAgICAoMHgxRDU4MywgJ00nLCB1J3gnKSwKICAgICgweDFENTg0LCAnTScsIHUneScpLAogICAgKDB4MUQ1ODUsICdNJywgdSd6JyksCiAgICAoMHgxRDU4NiwgJ00nLCB1J2EnKSwKICAgICgweDFENTg3LCAnTScsIHUnYicpLAogICAgKDB4MUQ1ODgsICdNJywgdSdjJyksCiAgICAoMHgxRDU4OSwgJ00nLCB1J2QnKSwKICAgICgweDFENThBLCAnTScsIHUnZScpLAogICAgKDB4MUQ1OEIsICdNJywgdSdmJyksCiAgICAoMHgxRDU4QywgJ00nLCB1J2cnKSwKICAgICgweDFENThELCAnTScsIHUnaCcpLAogICAgKDB4MUQ1OEUsICdNJywgdSdpJyksCiAgICAoMHgxRDU4RiwgJ00nLCB1J2onKSwKICAgICgweDFENTkwLCAnTScsIHUnaycpLAogICAgKDB4MUQ1OTEsICdNJywgdSdsJyksCiAgICAoMHgxRDU5MiwgJ00nLCB1J20nKSwKICAgICgweDFENTkzLCAnTScsIHUnbicpLAogICAgKDB4MUQ1OTQsICdNJywgdSdvJyksCiAgICAoMHgxRDU5NSwgJ00nLCB1J3AnKSwKICAgICgweDFENTk2LCAnTScsIHUncScpLAogICAgKDB4MUQ1OTcsICdNJywgdSdyJyksCiAgICAoMHgxRDU5OCwgJ00nLCB1J3MnKSwKICAgICgweDFENTk5LCAnTScsIHUndCcpLAogICAgKDB4MUQ1OUEsICdNJywgdSd1JyksCiAgICAoMHgxRDU5QiwgJ00nLCB1J3YnKSwKICAgICgweDFENTlDLCAnTScsIHUndycpLAogICAgKDB4MUQ1OUQsICdNJywgdSd4JyksCiAgICAoMHgxRDU5RSwgJ00nLCB1J3knKSwKICAgICgweDFENTlGLCAnTScsIHUneicpLAogICAgKDB4MUQ1QTAsICdNJywgdSdhJyksCiAgICAoMHgxRDVBMSwgJ00nLCB1J2InKSwKICAgICgweDFENUEyLCAnTScsIHUnYycpLAogICAgKDB4MUQ1QTMsICdNJywgdSdkJyksCiAgICAoMHgxRDVBNCwgJ00nLCB1J2UnKSwKICAgICgweDFENUE1LCAnTScsIHUnZicpLAogICAgKDB4MUQ1QTYsICdNJywgdSdnJyksCiAgICAoMHgxRDVBNywgJ00nLCB1J2gnKSwKICAgICgweDFENUE4LCAnTScsIHUnaScpLAogICAgKDB4MUQ1QTksICdNJywgdSdqJyksCiAgICAoMHgxRDVBQSwgJ00nLCB1J2snKSwKICAgICgweDFENUFCLCAnTScsIHUnbCcpLAogICAgKDB4MUQ1QUMsICdNJywgdSdtJyksCiAgICAoMHgxRDVBRCwgJ00nLCB1J24nKSwKICAgICgweDFENUFFLCAnTScsIHUnbycpLAogICAgKDB4MUQ1QUYsICdNJywgdSdwJyksCiAgICAoMHgxRDVCMCwgJ00nLCB1J3EnKSwKICAgICgweDFENUIxLCAnTScsIHUncicpLAogICAgKDB4MUQ1QjIsICdNJywgdSdzJyksCiAgICAoMHgxRDVCMywgJ00nLCB1J3QnKSwKICAgICgweDFENUI0LCAnTScsIHUndScpLAogICAgKDB4MUQ1QjUsICdNJywgdSd2JyksCiAgICAoMHgxRDVCNiwgJ00nLCB1J3cnKSwKICAgICgweDFENUI3LCAnTScsIHUneCcpLAogICAgKDB4MUQ1QjgsICdNJywgdSd5JyksCiAgICAoMHgxRDVCOSwgJ00nLCB1J3onKSwKICAgICgweDFENUJBLCAnTScsIHUnYScpLAogICAgKDB4MUQ1QkIsICdNJywgdSdiJyksCiAgICAoMHgxRDVCQywgJ00nLCB1J2MnKSwKICAgICgweDFENUJELCAnTScsIHUnZCcpLAogICAgKDB4MUQ1QkUsICdNJywgdSdlJyksCiAgICAoMHgxRDVCRiwgJ00nLCB1J2YnKSwKICAgICgweDFENUMwLCAnTScsIHUnZycpLAogICAgKDB4MUQ1QzEsICdNJywgdSdoJyksCiAgICAoMHgxRDVDMiwgJ00nLCB1J2knKSwKICAgICgweDFENUMzLCAnTScsIHUnaicpLAogICAgKDB4MUQ1QzQsICdNJywgdSdrJyksCiAgICAoMHgxRDVDNSwgJ00nLCB1J2wnKSwKICAgICgweDFENUM2LCAnTScsIHUnbScpLAogICAgKDB4MUQ1QzcsICdNJywgdSduJyksCiAgICAoMHgxRDVDOCwgJ00nLCB1J28nKSwKICAgICgweDFENUM5LCAnTScsIHUncCcpLAogICAgKDB4MUQ1Q0EsICdNJywgdSdxJyksCiAgICAoMHgxRDVDQiwgJ00nLCB1J3InKSwKICAgICgweDFENUNDLCAnTScsIHUncycpLAogICAgKDB4MUQ1Q0QsICdNJywgdSd0JyksCiAgICAoMHgxRDVDRSwgJ00nLCB1J3UnKSwKICAgICgweDFENUNGLCAnTScsIHUndicpLAogICAgKDB4MUQ1RDAsICdNJywgdSd3JyksCiAgICAoMHgxRDVEMSwgJ00nLCB1J3gnKSwKICAgICgweDFENUQyLCAnTScsIHUneScpLAogICAgXQoKZGVmIF9zZWdfNTgoKToKICAgIHJldHVybiBbCiAgICAoMHgxRDVEMywgJ00nLCB1J3onKSwKICAgICgweDFENUQ0LCAnTScsIHUnYScpLAogICAgKDB4MUQ1RDUsICdNJywgdSdiJyksCiAgICAoMHgxRDVENiwgJ00nLCB1J2MnKSwKICAgICgweDFENUQ3LCAnTScsIHUnZCcpLAogICAgKDB4MUQ1RDgsICdNJywgdSdlJyksCiAgICAoMHgxRDVEOSwgJ00nLCB1J2YnKSwKICAgICgweDFENURBLCAnTScsIHUnZycpLAogICAgKDB4MUQ1REIsICdNJywgdSdoJyksCiAgICAoMHgxRDVEQywgJ00nLCB1J2knKSwKICAgICgweDFENURELCAnTScsIHUnaicpLAogICAgKDB4MUQ1REUsICdNJywgdSdrJyksCiAgICAoMHgxRDVERiwgJ00nLCB1J2wnKSwKICAgICgweDFENUUwLCAnTScsIHUnbScpLAogICAgKDB4MUQ1RTEsICdNJywgdSduJyksCiAgICAoMHgxRDVFMiwgJ00nLCB1J28nKSwKICAgICgweDFENUUzLCAnTScsIHUncCcpLAogICAgKDB4MUQ1RTQsICdNJywgdSdxJyksCiAgICAoMHgxRDVFNSwgJ00nLCB1J3InKSwKICAgICgweDFENUU2LCAnTScsIHUncycpLAogICAgKDB4MUQ1RTcsICdNJywgdSd0JyksCiAgICAoMHgxRDVFOCwgJ00nLCB1J3UnKSwKICAgICgweDFENUU5LCAnTScsIHUndicpLAogICAgKDB4MUQ1RUEsICdNJywgdSd3JyksCiAgICAoMHgxRDVFQiwgJ00nLCB1J3gnKSwKICAgICgweDFENUVDLCAnTScsIHUneScpLAogICAgKDB4MUQ1RUQsICdNJywgdSd6JyksCiAgICAoMHgxRDVFRSwgJ00nLCB1J2EnKSwKICAgICgweDFENUVGLCAnTScsIHUnYicpLAogICAgKDB4MUQ1RjAsICdNJywgdSdjJyksCiAgICAoMHgxRDVGMSwgJ00nLCB1J2QnKSwKICAgICgweDFENUYyLCAnTScsIHUnZScpLAogICAgKDB4MUQ1RjMsICdNJywgdSdmJyksCiAgICAoMHgxRDVGNCwgJ00nLCB1J2cnKSwKICAgICgweDFENUY1LCAnTScsIHUnaCcpLAogICAgKDB4MUQ1RjYsICdNJywgdSdpJyksCiAgICAoMHgxRDVGNywgJ00nLCB1J2onKSwKICAgICgweDFENUY4LCAnTScsIHUnaycpLAogICAgKDB4MUQ1RjksICdNJywgdSdsJyksCiAgICAoMHgxRDVGQSwgJ00nLCB1J20nKSwKICAgICgweDFENUZCLCAnTScsIHUnbicpLAogICAgKDB4MUQ1RkMsICdNJywgdSdvJyksCiAgICAoMHgxRDVGRCwgJ00nLCB1J3AnKSwKICAgICgweDFENUZFLCAnTScsIHUncScpLAogICAgKDB4MUQ1RkYsICdNJywgdSdyJyksCiAgICAoMHgxRDYwMCwgJ00nLCB1J3MnKSwKICAgICgweDFENjAxLCAnTScsIHUndCcpLAogICAgKDB4MUQ2MDIsICdNJywgdSd1JyksCiAgICAoMHgxRDYwMywgJ00nLCB1J3YnKSwKICAgICgweDFENjA0LCAnTScsIHUndycpLAogICAgKDB4MUQ2MDUsICdNJywgdSd4JyksCiAgICAoMHgxRDYwNiwgJ00nLCB1J3knKSwKICAgICgweDFENjA3LCAnTScsIHUneicpLAogICAgKDB4MUQ2MDgsICdNJywgdSdhJyksCiAgICAoMHgxRDYwOSwgJ00nLCB1J2InKSwKICAgICgweDFENjBBLCAnTScsIHUnYycpLAogICAgKDB4MUQ2MEIsICdNJywgdSdkJyksCiAgICAoMHgxRDYwQywgJ00nLCB1J2UnKSwKICAgICgweDFENjBELCAnTScsIHUnZicpLAogICAgKDB4MUQ2MEUsICdNJywgdSdnJyksCiAgICAoMHgxRDYwRiwgJ00nLCB1J2gnKSwKICAgICgweDFENjEwLCAnTScsIHUnaScpLAogICAgKDB4MUQ2MTEsICdNJywgdSdqJyksCiAgICAoMHgxRDYxMiwgJ00nLCB1J2snKSwKICAgICgweDFENjEzLCAnTScsIHUnbCcpLAogICAgKDB4MUQ2MTQsICdNJywgdSdtJyksCiAgICAoMHgxRDYxNSwgJ00nLCB1J24nKSwKICAgICgweDFENjE2LCAnTScsIHUnbycpLAogICAgKDB4MUQ2MTcsICdNJywgdSdwJyksCiAgICAoMHgxRDYxOCwgJ00nLCB1J3EnKSwKICAgICgweDFENjE5LCAnTScsIHUncicpLAogICAgKDB4MUQ2MUEsICdNJywgdSdzJyksCiAgICAoMHgxRDYxQiwgJ00nLCB1J3QnKSwKICAgICgweDFENjFDLCAnTScsIHUndScpLAogICAgKDB4MUQ2MUQsICdNJywgdSd2JyksCiAgICAoMHgxRDYxRSwgJ00nLCB1J3cnKSwKICAgICgweDFENjFGLCAnTScsIHUneCcpLAogICAgKDB4MUQ2MjAsICdNJywgdSd5JyksCiAgICAoMHgxRDYyMSwgJ00nLCB1J3onKSwKICAgICgweDFENjIyLCAnTScsIHUnYScpLAogICAgKDB4MUQ2MjMsICdNJywgdSdiJyksCiAgICAoMHgxRDYyNCwgJ00nLCB1J2MnKSwKICAgICgweDFENjI1LCAnTScsIHUnZCcpLAogICAgKDB4MUQ2MjYsICdNJywgdSdlJyksCiAgICAoMHgxRDYyNywgJ00nLCB1J2YnKSwKICAgICgweDFENjI4LCAnTScsIHUnZycpLAogICAgKDB4MUQ2MjksICdNJywgdSdoJyksCiAgICAoMHgxRDYyQSwgJ00nLCB1J2knKSwKICAgICgweDFENjJCLCAnTScsIHUnaicpLAogICAgKDB4MUQ2MkMsICdNJywgdSdrJyksCiAgICAoMHgxRDYyRCwgJ00nLCB1J2wnKSwKICAgICgweDFENjJFLCAnTScsIHUnbScpLAogICAgKDB4MUQ2MkYsICdNJywgdSduJyksCiAgICAoMHgxRDYzMCwgJ00nLCB1J28nKSwKICAgICgweDFENjMxLCAnTScsIHUncCcpLAogICAgKDB4MUQ2MzIsICdNJywgdSdxJyksCiAgICAoMHgxRDYzMywgJ00nLCB1J3InKSwKICAgICgweDFENjM0LCAnTScsIHUncycpLAogICAgKDB4MUQ2MzUsICdNJywgdSd0JyksCiAgICAoMHgxRDYzNiwgJ00nLCB1J3UnKSwKICAgIF0KCmRlZiBfc2VnXzU5KCk6CiAgICByZXR1cm4gWwogICAgKDB4MUQ2MzcsICdNJywgdSd2JyksCiAgICAoMHgxRDYzOCwgJ00nLCB1J3cnKSwKICAgICgweDFENjM5LCAnTScsIHUneCcpLAogICAgKDB4MUQ2M0EsICdNJywgdSd5JyksCiAgICAoMHgxRDYzQiwgJ00nLCB1J3onKSwKICAgICgweDFENjNDLCAnTScsIHUnYScpLAogICAgKDB4MUQ2M0QsICdNJywgdSdiJyksCiAgICAoMHgxRDYzRSwgJ00nLCB1J2MnKSwKICAgICgweDFENjNGLCAnTScsIHUnZCcpLAogICAgKDB4MUQ2NDAsICdNJywgdSdlJyksCiAgICAoMHgxRDY0MSwgJ00nLCB1J2YnKSwKICAgICgweDFENjQyLCAnTScsIHUnZycpLAogICAgKDB4MUQ2NDMsICdNJywgdSdoJyksCiAgICAoMHgxRDY0NCwgJ00nLCB1J2knKSwKICAgICgweDFENjQ1LCAnTScsIHUnaicpLAogICAgKDB4MUQ2NDYsICdNJywgdSdrJyksCiAgICAoMHgxRDY0NywgJ00nLCB1J2wnKSwKICAgICgweDFENjQ4LCAnTScsIHUnbScpLAogICAgKDB4MUQ2NDksICdNJywgdSduJyksCiAgICAoMHgxRDY0QSwgJ00nLCB1J28nKSwKICAgICgweDFENjRCLCAnTScsIHUncCcpLAogICAgKDB4MUQ2NEMsICdNJywgdSdxJyksCiAgICAoMHgxRDY0RCwgJ00nLCB1J3InKSwKICAgICgweDFENjRFLCAnTScsIHUncycpLAogICAgKDB4MUQ2NEYsICdNJywgdSd0JyksCiAgICAoMHgxRDY1MCwgJ00nLCB1J3UnKSwKICAgICgweDFENjUxLCAnTScsIHUndicpLAogICAgKDB4MUQ2NTIsICdNJywgdSd3JyksCiAgICAoMHgxRDY1MywgJ00nLCB1J3gnKSwKICAgICgweDFENjU0LCAnTScsIHUneScpLAogICAgKDB4MUQ2NTUsICdNJywgdSd6JyksCiAgICAoMHgxRDY1NiwgJ00nLCB1J2EnKSwKICAgICgweDFENjU3LCAnTScsIHUnYicpLAogICAgKDB4MUQ2NTgsICdNJywgdSdjJyksCiAgICAoMHgxRDY1OSwgJ00nLCB1J2QnKSwKICAgICgweDFENjVBLCAnTScsIHUnZScpLAogICAgKDB4MUQ2NUIsICdNJywgdSdmJyksCiAgICAoMHgxRDY1QywgJ00nLCB1J2cnKSwKICAgICgweDFENjVELCAnTScsIHUnaCcpLAogICAgKDB4MUQ2NUUsICdNJywgdSdpJyksCiAgICAoMHgxRDY1RiwgJ00nLCB1J2onKSwKICAgICgweDFENjYwLCAnTScsIHUnaycpLAogICAgKDB4MUQ2NjEsICdNJywgdSdsJyksCiAgICAoMHgxRDY2MiwgJ00nLCB1J20nKSwKICAgICgweDFENjYzLCAnTScsIHUnbicpLAogICAgKDB4MUQ2NjQsICdNJywgdSdvJyksCiAgICAoMHgxRDY2NSwgJ00nLCB1J3AnKSwKICAgICgweDFENjY2LCAnTScsIHUncScpLAogICAgKDB4MUQ2NjcsICdNJywgdSdyJyksCiAgICAoMHgxRDY2OCwgJ00nLCB1J3MnKSwKICAgICgweDFENjY5LCAnTScsIHUndCcpLAogICAgKDB4MUQ2NkEsICdNJywgdSd1JyksCiAgICAoMHgxRDY2QiwgJ00nLCB1J3YnKSwKICAgICgweDFENjZDLCAnTScsIHUndycpLAogICAgKDB4MUQ2NkQsICdNJywgdSd4JyksCiAgICAoMHgxRDY2RSwgJ00nLCB1J3knKSwKICAgICgweDFENjZGLCAnTScsIHUneicpLAogICAgKDB4MUQ2NzAsICdNJywgdSdhJyksCiAgICAoMHgxRDY3MSwgJ00nLCB1J2InKSwKICAgICgweDFENjcyLCAnTScsIHUnYycpLAogICAgKDB4MUQ2NzMsICdNJywgdSdkJyksCiAgICAoMHgxRDY3NCwgJ00nLCB1J2UnKSwKICAgICgweDFENjc1LCAnTScsIHUnZicpLAogICAgKDB4MUQ2NzYsICdNJywgdSdnJyksCiAgICAoMHgxRDY3NywgJ00nLCB1J2gnKSwKICAgICgweDFENjc4LCAnTScsIHUnaScpLAogICAgKDB4MUQ2NzksICdNJywgdSdqJyksCiAgICAoMHgxRDY3QSwgJ00nLCB1J2snKSwKICAgICgweDFENjdCLCAnTScsIHUnbCcpLAogICAgKDB4MUQ2N0MsICdNJywgdSdtJyksCiAgICAoMHgxRDY3RCwgJ00nLCB1J24nKSwKICAgICgweDFENjdFLCAnTScsIHUnbycpLAogICAgKDB4MUQ2N0YsICdNJywgdSdwJyksCiAgICAoMHgxRDY4MCwgJ00nLCB1J3EnKSwKICAgICgweDFENjgxLCAnTScsIHUncicpLAogICAgKDB4MUQ2ODIsICdNJywgdSdzJyksCiAgICAoMHgxRDY4MywgJ00nLCB1J3QnKSwKICAgICgweDFENjg0LCAnTScsIHUndScpLAogICAgKDB4MUQ2ODUsICdNJywgdSd2JyksCiAgICAoMHgxRDY4NiwgJ00nLCB1J3cnKSwKICAgICgweDFENjg3LCAnTScsIHUneCcpLAogICAgKDB4MUQ2ODgsICdNJywgdSd5JyksCiAgICAoMHgxRDY4OSwgJ00nLCB1J3onKSwKICAgICgweDFENjhBLCAnTScsIHUnYScpLAogICAgKDB4MUQ2OEIsICdNJywgdSdiJyksCiAgICAoMHgxRDY4QywgJ00nLCB1J2MnKSwKICAgICgweDFENjhELCAnTScsIHUnZCcpLAogICAgKDB4MUQ2OEUsICdNJywgdSdlJyksCiAgICAoMHgxRDY4RiwgJ00nLCB1J2YnKSwKICAgICgweDFENjkwLCAnTScsIHUnZycpLAogICAgKDB4MUQ2OTEsICdNJywgdSdoJyksCiAgICAoMHgxRDY5MiwgJ00nLCB1J2knKSwKICAgICgweDFENjkzLCAnTScsIHUnaicpLAogICAgKDB4MUQ2OTQsICdNJywgdSdrJyksCiAgICAoMHgxRDY5NSwgJ00nLCB1J2wnKSwKICAgICgweDFENjk2LCAnTScsIHUnbScpLAogICAgKDB4MUQ2OTcsICdNJywgdSduJyksCiAgICAoMHgxRDY5OCwgJ00nLCB1J28nKSwKICAgICgweDFENjk5LCAnTScsIHUncCcpLAogICAgKDB4MUQ2OUEsICdNJywgdSdxJyksCiAgICBdCgpkZWYgX3NlZ182MCgpOgogICAgcmV0dXJuIFsKICAgICgweDFENjlCLCAnTScsIHUncicpLAogICAgKDB4MUQ2OUMsICdNJywgdSdzJyksCiAgICAoMHgxRDY5RCwgJ00nLCB1J3QnKSwKICAgICgweDFENjlFLCAnTScsIHUndScpLAogICAgKDB4MUQ2OUYsICdNJywgdSd2JyksCiAgICAoMHgxRDZBMCwgJ00nLCB1J3cnKSwKICAgICgweDFENkExLCAnTScsIHUneCcpLAogICAgKDB4MUQ2QTIsICdNJywgdSd5JyksCiAgICAoMHgxRDZBMywgJ00nLCB1J3onKSwKICAgICgweDFENkE0LCAnTScsIHUnxLEnKSwKICAgICgweDFENkE1LCAnTScsIHUnyLcnKSwKICAgICgweDFENkE2LCAnWCcpLAogICAgKDB4MUQ2QTgsICdNJywgdSfOsScpLAogICAgKDB4MUQ2QTksICdNJywgdSfOsicpLAogICAgKDB4MUQ2QUEsICdNJywgdSfOsycpLAogICAgKDB4MUQ2QUIsICdNJywgdSfOtCcpLAogICAgKDB4MUQ2QUMsICdNJywgdSfOtScpLAogICAgKDB4MUQ2QUQsICdNJywgdSfOticpLAogICAgKDB4MUQ2QUUsICdNJywgdSfOtycpLAogICAgKDB4MUQ2QUYsICdNJywgdSfOuCcpLAogICAgKDB4MUQ2QjAsICdNJywgdSfOuScpLAogICAgKDB4MUQ2QjEsICdNJywgdSfOuicpLAogICAgKDB4MUQ2QjIsICdNJywgdSfOuycpLAogICAgKDB4MUQ2QjMsICdNJywgdSfOvCcpLAogICAgKDB4MUQ2QjQsICdNJywgdSfOvScpLAogICAgKDB4MUQ2QjUsICdNJywgdSfOvicpLAogICAgKDB4MUQ2QjYsICdNJywgdSfOvycpLAogICAgKDB4MUQ2QjcsICdNJywgdSfPgCcpLAogICAgKDB4MUQ2QjgsICdNJywgdSfPgScpLAogICAgKDB4MUQ2QjksICdNJywgdSfOuCcpLAogICAgKDB4MUQ2QkEsICdNJywgdSfPgycpLAogICAgKDB4MUQ2QkIsICdNJywgdSfPhCcpLAogICAgKDB4MUQ2QkMsICdNJywgdSfPhScpLAogICAgKDB4MUQ2QkQsICdNJywgdSfPhicpLAogICAgKDB4MUQ2QkUsICdNJywgdSfPhycpLAogICAgKDB4MUQ2QkYsICdNJywgdSfPiCcpLAogICAgKDB4MUQ2QzAsICdNJywgdSfPiScpLAogICAgKDB4MUQ2QzEsICdNJywgdSfiiIcnKSwKICAgICgweDFENkMyLCAnTScsIHUnzrEnKSwKICAgICgweDFENkMzLCAnTScsIHUnzrInKSwKICAgICgweDFENkM0LCAnTScsIHUnzrMnKSwKICAgICgweDFENkM1LCAnTScsIHUnzrQnKSwKICAgICgweDFENkM2LCAnTScsIHUnzrUnKSwKICAgICgweDFENkM3LCAnTScsIHUnzrYnKSwKICAgICgweDFENkM4LCAnTScsIHUnzrcnKSwKICAgICgweDFENkM5LCAnTScsIHUnzrgnKSwKICAgICgweDFENkNBLCAnTScsIHUnzrknKSwKICAgICgweDFENkNCLCAnTScsIHUnzronKSwKICAgICgweDFENkNDLCAnTScsIHUnzrsnKSwKICAgICgweDFENkNELCAnTScsIHUnzrwnKSwKICAgICgweDFENkNFLCAnTScsIHUnzr0nKSwKICAgICgweDFENkNGLCAnTScsIHUnzr4nKSwKICAgICgweDFENkQwLCAnTScsIHUnzr8nKSwKICAgICgweDFENkQxLCAnTScsIHUnz4AnKSwKICAgICgweDFENkQyLCAnTScsIHUnz4EnKSwKICAgICgweDFENkQzLCAnTScsIHUnz4MnKSwKICAgICgweDFENkQ1LCAnTScsIHUnz4QnKSwKICAgICgweDFENkQ2LCAnTScsIHUnz4UnKSwKICAgICgweDFENkQ3LCAnTScsIHUnz4YnKSwKICAgICgweDFENkQ4LCAnTScsIHUnz4cnKSwKICAgICgweDFENkQ5LCAnTScsIHUnz4gnKSwKICAgICgweDFENkRBLCAnTScsIHUnz4knKSwKICAgICgweDFENkRCLCAnTScsIHUn4oiCJyksCiAgICAoMHgxRDZEQywgJ00nLCB1J861JyksCiAgICAoMHgxRDZERCwgJ00nLCB1J864JyksCiAgICAoMHgxRDZERSwgJ00nLCB1J866JyksCiAgICAoMHgxRDZERiwgJ00nLCB1J8+GJyksCiAgICAoMHgxRDZFMCwgJ00nLCB1J8+BJyksCiAgICAoMHgxRDZFMSwgJ00nLCB1J8+AJyksCiAgICAoMHgxRDZFMiwgJ00nLCB1J86xJyksCiAgICAoMHgxRDZFMywgJ00nLCB1J86yJyksCiAgICAoMHgxRDZFNCwgJ00nLCB1J86zJyksCiAgICAoMHgxRDZFNSwgJ00nLCB1J860JyksCiAgICAoMHgxRDZFNiwgJ00nLCB1J861JyksCiAgICAoMHgxRDZFNywgJ00nLCB1J862JyksCiAgICAoMHgxRDZFOCwgJ00nLCB1J863JyksCiAgICAoMHgxRDZFOSwgJ00nLCB1J864JyksCiAgICAoMHgxRDZFQSwgJ00nLCB1J865JyksCiAgICAoMHgxRDZFQiwgJ00nLCB1J866JyksCiAgICAoMHgxRDZFQywgJ00nLCB1J867JyksCiAgICAoMHgxRDZFRCwgJ00nLCB1J868JyksCiAgICAoMHgxRDZFRSwgJ00nLCB1J869JyksCiAgICAoMHgxRDZFRiwgJ00nLCB1J86+JyksCiAgICAoMHgxRDZGMCwgJ00nLCB1J86/JyksCiAgICAoMHgxRDZGMSwgJ00nLCB1J8+AJyksCiAgICAoMHgxRDZGMiwgJ00nLCB1J8+BJyksCiAgICAoMHgxRDZGMywgJ00nLCB1J864JyksCiAgICAoMHgxRDZGNCwgJ00nLCB1J8+DJyksCiAgICAoMHgxRDZGNSwgJ00nLCB1J8+EJyksCiAgICAoMHgxRDZGNiwgJ00nLCB1J8+FJyksCiAgICAoMHgxRDZGNywgJ00nLCB1J8+GJyksCiAgICAoMHgxRDZGOCwgJ00nLCB1J8+HJyksCiAgICAoMHgxRDZGOSwgJ00nLCB1J8+IJyksCiAgICAoMHgxRDZGQSwgJ00nLCB1J8+JJyksCiAgICAoMHgxRDZGQiwgJ00nLCB1J+KIhycpLAogICAgKDB4MUQ2RkMsICdNJywgdSfOsScpLAogICAgKDB4MUQ2RkQsICdNJywgdSfOsicpLAogICAgKDB4MUQ2RkUsICdNJywgdSfOsycpLAogICAgKDB4MUQ2RkYsICdNJywgdSfOtCcpLAogICAgKDB4MUQ3MDAsICdNJywgdSfOtScpLAogICAgXQoKZGVmIF9zZWdfNjEoKToKICAgIHJldHVybiBbCiAgICAoMHgxRDcwMSwgJ00nLCB1J862JyksCiAgICAoMHgxRDcwMiwgJ00nLCB1J863JyksCiAgICAoMHgxRDcwMywgJ00nLCB1J864JyksCiAgICAoMHgxRDcwNCwgJ00nLCB1J865JyksCiAgICAoMHgxRDcwNSwgJ00nLCB1J866JyksCiAgICAoMHgxRDcwNiwgJ00nLCB1J867JyksCiAgICAoMHgxRDcwNywgJ00nLCB1J868JyksCiAgICAoMHgxRDcwOCwgJ00nLCB1J869JyksCiAgICAoMHgxRDcwOSwgJ00nLCB1J86+JyksCiAgICAoMHgxRDcwQSwgJ00nLCB1J86/JyksCiAgICAoMHgxRDcwQiwgJ00nLCB1J8+AJyksCiAgICAoMHgxRDcwQywgJ00nLCB1J8+BJyksCiAgICAoMHgxRDcwRCwgJ00nLCB1J8+DJyksCiAgICAoMHgxRDcwRiwgJ00nLCB1J8+EJyksCiAgICAoMHgxRDcxMCwgJ00nLCB1J8+FJyksCiAgICAoMHgxRDcxMSwgJ00nLCB1J8+GJyksCiAgICAoMHgxRDcxMiwgJ00nLCB1J8+HJyksCiAgICAoMHgxRDcxMywgJ00nLCB1J8+IJyksCiAgICAoMHgxRDcxNCwgJ00nLCB1J8+JJyksCiAgICAoMHgxRDcxNSwgJ00nLCB1J+KIgicpLAogICAgKDB4MUQ3MTYsICdNJywgdSfOtScpLAogICAgKDB4MUQ3MTcsICdNJywgdSfOuCcpLAogICAgKDB4MUQ3MTgsICdNJywgdSfOuicpLAogICAgKDB4MUQ3MTksICdNJywgdSfPhicpLAogICAgKDB4MUQ3MUEsICdNJywgdSfPgScpLAogICAgKDB4MUQ3MUIsICdNJywgdSfPgCcpLAogICAgKDB4MUQ3MUMsICdNJywgdSfOsScpLAogICAgKDB4MUQ3MUQsICdNJywgdSfOsicpLAogICAgKDB4MUQ3MUUsICdNJywgdSfOsycpLAogICAgKDB4MUQ3MUYsICdNJywgdSfOtCcpLAogICAgKDB4MUQ3MjAsICdNJywgdSfOtScpLAogICAgKDB4MUQ3MjEsICdNJywgdSfOticpLAogICAgKDB4MUQ3MjIsICdNJywgdSfOtycpLAogICAgKDB4MUQ3MjMsICdNJywgdSfOuCcpLAogICAgKDB4MUQ3MjQsICdNJywgdSfOuScpLAogICAgKDB4MUQ3MjUsICdNJywgdSfOuicpLAogICAgKDB4MUQ3MjYsICdNJywgdSfOuycpLAogICAgKDB4MUQ3MjcsICdNJywgdSfOvCcpLAogICAgKDB4MUQ3MjgsICdNJywgdSfOvScpLAogICAgKDB4MUQ3MjksICdNJywgdSfOvicpLAogICAgKDB4MUQ3MkEsICdNJywgdSfOvycpLAogICAgKDB4MUQ3MkIsICdNJywgdSfPgCcpLAogICAgKDB4MUQ3MkMsICdNJywgdSfPgScpLAogICAgKDB4MUQ3MkQsICdNJywgdSfOuCcpLAogICAgKDB4MUQ3MkUsICdNJywgdSfPgycpLAogICAgKDB4MUQ3MkYsICdNJywgdSfPhCcpLAogICAgKDB4MUQ3MzAsICdNJywgdSfPhScpLAogICAgKDB4MUQ3MzEsICdNJywgdSfPhicpLAogICAgKDB4MUQ3MzIsICdNJywgdSfPhycpLAogICAgKDB4MUQ3MzMsICdNJywgdSfPiCcpLAogICAgKDB4MUQ3MzQsICdNJywgdSfPiScpLAogICAgKDB4MUQ3MzUsICdNJywgdSfiiIcnKSwKICAgICgweDFENzM2LCAnTScsIHUnzrEnKSwKICAgICgweDFENzM3LCAnTScsIHUnzrInKSwKICAgICgweDFENzM4LCAnTScsIHUnzrMnKSwKICAgICgweDFENzM5LCAnTScsIHUnzrQnKSwKICAgICgweDFENzNBLCAnTScsIHUnzrUnKSwKICAgICgweDFENzNCLCAnTScsIHUnzrYnKSwKICAgICgweDFENzNDLCAnTScsIHUnzrcnKSwKICAgICgweDFENzNELCAnTScsIHUnzrgnKSwKICAgICgweDFENzNFLCAnTScsIHUnzrknKSwKICAgICgweDFENzNGLCAnTScsIHUnzronKSwKICAgICgweDFENzQwLCAnTScsIHUnzrsnKSwKICAgICgweDFENzQxLCAnTScsIHUnzrwnKSwKICAgICgweDFENzQyLCAnTScsIHUnzr0nKSwKICAgICgweDFENzQzLCAnTScsIHUnzr4nKSwKICAgICgweDFENzQ0LCAnTScsIHUnzr8nKSwKICAgICgweDFENzQ1LCAnTScsIHUnz4AnKSwKICAgICgweDFENzQ2LCAnTScsIHUnz4EnKSwKICAgICgweDFENzQ3LCAnTScsIHUnz4MnKSwKICAgICgweDFENzQ5LCAnTScsIHUnz4QnKSwKICAgICgweDFENzRBLCAnTScsIHUnz4UnKSwKICAgICgweDFENzRCLCAnTScsIHUnz4YnKSwKICAgICgweDFENzRDLCAnTScsIHUnz4cnKSwKICAgICgweDFENzRELCAnTScsIHUnz4gnKSwKICAgICgweDFENzRFLCAnTScsIHUnz4knKSwKICAgICgweDFENzRGLCAnTScsIHUn4oiCJyksCiAgICAoMHgxRDc1MCwgJ00nLCB1J861JyksCiAgICAoMHgxRDc1MSwgJ00nLCB1J864JyksCiAgICAoMHgxRDc1MiwgJ00nLCB1J866JyksCiAgICAoMHgxRDc1MywgJ00nLCB1J8+GJyksCiAgICAoMHgxRDc1NCwgJ00nLCB1J8+BJyksCiAgICAoMHgxRDc1NSwgJ00nLCB1J8+AJyksCiAgICAoMHgxRDc1NiwgJ00nLCB1J86xJyksCiAgICAoMHgxRDc1NywgJ00nLCB1J86yJyksCiAgICAoMHgxRDc1OCwgJ00nLCB1J86zJyksCiAgICAoMHgxRDc1OSwgJ00nLCB1J860JyksCiAgICAoMHgxRDc1QSwgJ00nLCB1J861JyksCiAgICAoMHgxRDc1QiwgJ00nLCB1J862JyksCiAgICAoMHgxRDc1QywgJ00nLCB1J863JyksCiAgICAoMHgxRDc1RCwgJ00nLCB1J864JyksCiAgICAoMHgxRDc1RSwgJ00nLCB1J865JyksCiAgICAoMHgxRDc1RiwgJ00nLCB1J866JyksCiAgICAoMHgxRDc2MCwgJ00nLCB1J867JyksCiAgICAoMHgxRDc2MSwgJ00nLCB1J868JyksCiAgICAoMHgxRDc2MiwgJ00nLCB1J869JyksCiAgICAoMHgxRDc2MywgJ00nLCB1J86+JyksCiAgICAoMHgxRDc2NCwgJ00nLCB1J86/JyksCiAgICAoMHgxRDc2NSwgJ00nLCB1J8+AJyksCiAgICAoMHgxRDc2NiwgJ00nLCB1J8+BJyksCiAgICBdCgpkZWYgX3NlZ182MigpOgogICAgcmV0dXJuIFsKICAgICgweDFENzY3LCAnTScsIHUnzrgnKSwKICAgICgweDFENzY4LCAnTScsIHUnz4MnKSwKICAgICgweDFENzY5LCAnTScsIHUnz4QnKSwKICAgICgweDFENzZBLCAnTScsIHUnz4UnKSwKICAgICgweDFENzZCLCAnTScsIHUnz4YnKSwKICAgICgweDFENzZDLCAnTScsIHUnz4cnKSwKICAgICgweDFENzZELCAnTScsIHUnz4gnKSwKICAgICgweDFENzZFLCAnTScsIHUnz4knKSwKICAgICgweDFENzZGLCAnTScsIHUn4oiHJyksCiAgICAoMHgxRDc3MCwgJ00nLCB1J86xJyksCiAgICAoMHgxRDc3MSwgJ00nLCB1J86yJyksCiAgICAoMHgxRDc3MiwgJ00nLCB1J86zJyksCiAgICAoMHgxRDc3MywgJ00nLCB1J860JyksCiAgICAoMHgxRDc3NCwgJ00nLCB1J861JyksCiAgICAoMHgxRDc3NSwgJ00nLCB1J862JyksCiAgICAoMHgxRDc3NiwgJ00nLCB1J863JyksCiAgICAoMHgxRDc3NywgJ00nLCB1J864JyksCiAgICAoMHgxRDc3OCwgJ00nLCB1J865JyksCiAgICAoMHgxRDc3OSwgJ00nLCB1J866JyksCiAgICAoMHgxRDc3QSwgJ00nLCB1J867JyksCiAgICAoMHgxRDc3QiwgJ00nLCB1J868JyksCiAgICAoMHgxRDc3QywgJ00nLCB1J869JyksCiAgICAoMHgxRDc3RCwgJ00nLCB1J86+JyksCiAgICAoMHgxRDc3RSwgJ00nLCB1J86/JyksCiAgICAoMHgxRDc3RiwgJ00nLCB1J8+AJyksCiAgICAoMHgxRDc4MCwgJ00nLCB1J8+BJyksCiAgICAoMHgxRDc4MSwgJ00nLCB1J8+DJyksCiAgICAoMHgxRDc4MywgJ00nLCB1J8+EJyksCiAgICAoMHgxRDc4NCwgJ00nLCB1J8+FJyksCiAgICAoMHgxRDc4NSwgJ00nLCB1J8+GJyksCiAgICAoMHgxRDc4NiwgJ00nLCB1J8+HJyksCiAgICAoMHgxRDc4NywgJ00nLCB1J8+IJyksCiAgICAoMHgxRDc4OCwgJ00nLCB1J8+JJyksCiAgICAoMHgxRDc4OSwgJ00nLCB1J+KIgicpLAogICAgKDB4MUQ3OEEsICdNJywgdSfOtScpLAogICAgKDB4MUQ3OEIsICdNJywgdSfOuCcpLAogICAgKDB4MUQ3OEMsICdNJywgdSfOuicpLAogICAgKDB4MUQ3OEQsICdNJywgdSfPhicpLAogICAgKDB4MUQ3OEUsICdNJywgdSfPgScpLAogICAgKDB4MUQ3OEYsICdNJywgdSfPgCcpLAogICAgKDB4MUQ3OTAsICdNJywgdSfOsScpLAogICAgKDB4MUQ3OTEsICdNJywgdSfOsicpLAogICAgKDB4MUQ3OTIsICdNJywgdSfOsycpLAogICAgKDB4MUQ3OTMsICdNJywgdSfOtCcpLAogICAgKDB4MUQ3OTQsICdNJywgdSfOtScpLAogICAgKDB4MUQ3OTUsICdNJywgdSfOticpLAogICAgKDB4MUQ3OTYsICdNJywgdSfOtycpLAogICAgKDB4MUQ3OTcsICdNJywgdSfOuCcpLAogICAgKDB4MUQ3OTgsICdNJywgdSfOuScpLAogICAgKDB4MUQ3OTksICdNJywgdSfOuicpLAogICAgKDB4MUQ3OUEsICdNJywgdSfOuycpLAogICAgKDB4MUQ3OUIsICdNJywgdSfOvCcpLAogICAgKDB4MUQ3OUMsICdNJywgdSfOvScpLAogICAgKDB4MUQ3OUQsICdNJywgdSfOvicpLAogICAgKDB4MUQ3OUUsICdNJywgdSfOvycpLAogICAgKDB4MUQ3OUYsICdNJywgdSfPgCcpLAogICAgKDB4MUQ3QTAsICdNJywgdSfPgScpLAogICAgKDB4MUQ3QTEsICdNJywgdSfOuCcpLAogICAgKDB4MUQ3QTIsICdNJywgdSfPgycpLAogICAgKDB4MUQ3QTMsICdNJywgdSfPhCcpLAogICAgKDB4MUQ3QTQsICdNJywgdSfPhScpLAogICAgKDB4MUQ3QTUsICdNJywgdSfPhicpLAogICAgKDB4MUQ3QTYsICdNJywgdSfPhycpLAogICAgKDB4MUQ3QTcsICdNJywgdSfPiCcpLAogICAgKDB4MUQ3QTgsICdNJywgdSfPiScpLAogICAgKDB4MUQ3QTksICdNJywgdSfiiIcnKSwKICAgICgweDFEN0FBLCAnTScsIHUnzrEnKSwKICAgICgweDFEN0FCLCAnTScsIHUnzrInKSwKICAgICgweDFEN0FDLCAnTScsIHUnzrMnKSwKICAgICgweDFEN0FELCAnTScsIHUnzrQnKSwKICAgICgweDFEN0FFLCAnTScsIHUnzrUnKSwKICAgICgweDFEN0FGLCAnTScsIHUnzrYnKSwKICAgICgweDFEN0IwLCAnTScsIHUnzrcnKSwKICAgICgweDFEN0IxLCAnTScsIHUnzrgnKSwKICAgICgweDFEN0IyLCAnTScsIHUnzrknKSwKICAgICgweDFEN0IzLCAnTScsIHUnzronKSwKICAgICgweDFEN0I0LCAnTScsIHUnzrsnKSwKICAgICgweDFEN0I1LCAnTScsIHUnzrwnKSwKICAgICgweDFEN0I2LCAnTScsIHUnzr0nKSwKICAgICgweDFEN0I3LCAnTScsIHUnzr4nKSwKICAgICgweDFEN0I4LCAnTScsIHUnzr8nKSwKICAgICgweDFEN0I5LCAnTScsIHUnz4AnKSwKICAgICgweDFEN0JBLCAnTScsIHUnz4EnKSwKICAgICgweDFEN0JCLCAnTScsIHUnz4MnKSwKICAgICgweDFEN0JELCAnTScsIHUnz4QnKSwKICAgICgweDFEN0JFLCAnTScsIHUnz4UnKSwKICAgICgweDFEN0JGLCAnTScsIHUnz4YnKSwKICAgICgweDFEN0MwLCAnTScsIHUnz4cnKSwKICAgICgweDFEN0MxLCAnTScsIHUnz4gnKSwKICAgICgweDFEN0MyLCAnTScsIHUnz4knKSwKICAgICgweDFEN0MzLCAnTScsIHUn4oiCJyksCiAgICAoMHgxRDdDNCwgJ00nLCB1J861JyksCiAgICAoMHgxRDdDNSwgJ00nLCB1J864JyksCiAgICAoMHgxRDdDNiwgJ00nLCB1J866JyksCiAgICAoMHgxRDdDNywgJ00nLCB1J8+GJyksCiAgICAoMHgxRDdDOCwgJ00nLCB1J8+BJyksCiAgICAoMHgxRDdDOSwgJ00nLCB1J8+AJyksCiAgICAoMHgxRDdDQSwgJ00nLCB1J8+dJyksCiAgICAoMHgxRDdDQywgJ1gnKSwKICAgICgweDFEN0NFLCAnTScsIHUnMCcpLAogICAgXQoKZGVmIF9zZWdfNjMoKToKICAgIHJldHVybiBbCiAgICAoMHgxRDdDRiwgJ00nLCB1JzEnKSwKICAgICgweDFEN0QwLCAnTScsIHUnMicpLAogICAgKDB4MUQ3RDEsICdNJywgdSczJyksCiAgICAoMHgxRDdEMiwgJ00nLCB1JzQnKSwKICAgICgweDFEN0QzLCAnTScsIHUnNScpLAogICAgKDB4MUQ3RDQsICdNJywgdSc2JyksCiAgICAoMHgxRDdENSwgJ00nLCB1JzcnKSwKICAgICgweDFEN0Q2LCAnTScsIHUnOCcpLAogICAgKDB4MUQ3RDcsICdNJywgdSc5JyksCiAgICAoMHgxRDdEOCwgJ00nLCB1JzAnKSwKICAgICgweDFEN0Q5LCAnTScsIHUnMScpLAogICAgKDB4MUQ3REEsICdNJywgdScyJyksCiAgICAoMHgxRDdEQiwgJ00nLCB1JzMnKSwKICAgICgweDFEN0RDLCAnTScsIHUnNCcpLAogICAgKDB4MUQ3REQsICdNJywgdSc1JyksCiAgICAoMHgxRDdERSwgJ00nLCB1JzYnKSwKICAgICgweDFEN0RGLCAnTScsIHUnNycpLAogICAgKDB4MUQ3RTAsICdNJywgdSc4JyksCiAgICAoMHgxRDdFMSwgJ00nLCB1JzknKSwKICAgICgweDFEN0UyLCAnTScsIHUnMCcpLAogICAgKDB4MUQ3RTMsICdNJywgdScxJyksCiAgICAoMHgxRDdFNCwgJ00nLCB1JzInKSwKICAgICgweDFEN0U1LCAnTScsIHUnMycpLAogICAgKDB4MUQ3RTYsICdNJywgdSc0JyksCiAgICAoMHgxRDdFNywgJ00nLCB1JzUnKSwKICAgICgweDFEN0U4LCAnTScsIHUnNicpLAogICAgKDB4MUQ3RTksICdNJywgdSc3JyksCiAgICAoMHgxRDdFQSwgJ00nLCB1JzgnKSwKICAgICgweDFEN0VCLCAnTScsIHUnOScpLAogICAgKDB4MUQ3RUMsICdNJywgdScwJyksCiAgICAoMHgxRDdFRCwgJ00nLCB1JzEnKSwKICAgICgweDFEN0VFLCAnTScsIHUnMicpLAogICAgKDB4MUQ3RUYsICdNJywgdSczJyksCiAgICAoMHgxRDdGMCwgJ00nLCB1JzQnKSwKICAgICgweDFEN0YxLCAnTScsIHUnNScpLAogICAgKDB4MUQ3RjIsICdNJywgdSc2JyksCiAgICAoMHgxRDdGMywgJ00nLCB1JzcnKSwKICAgICgweDFEN0Y0LCAnTScsIHUnOCcpLAogICAgKDB4MUQ3RjUsICdNJywgdSc5JyksCiAgICAoMHgxRDdGNiwgJ00nLCB1JzAnKSwKICAgICgweDFEN0Y3LCAnTScsIHUnMScpLAogICAgKDB4MUQ3RjgsICdNJywgdScyJyksCiAgICAoMHgxRDdGOSwgJ00nLCB1JzMnKSwKICAgICgweDFEN0ZBLCAnTScsIHUnNCcpLAogICAgKDB4MUQ3RkIsICdNJywgdSc1JyksCiAgICAoMHgxRDdGQywgJ00nLCB1JzYnKSwKICAgICgweDFEN0ZELCAnTScsIHUnNycpLAogICAgKDB4MUQ3RkUsICdNJywgdSc4JyksCiAgICAoMHgxRDdGRiwgJ00nLCB1JzknKSwKICAgICgweDFEODAwLCAnWCcpLAogICAgKDB4MUVFMDAsICdNJywgdSfYpycpLAogICAgKDB4MUVFMDEsICdNJywgdSfYqCcpLAogICAgKDB4MUVFMDIsICdNJywgdSfYrCcpLAogICAgKDB4MUVFMDMsICdNJywgdSfYrycpLAogICAgKDB4MUVFMDQsICdYJyksCiAgICAoMHgxRUUwNSwgJ00nLCB1J9mIJyksCiAgICAoMHgxRUUwNiwgJ00nLCB1J9iyJyksCiAgICAoMHgxRUUwNywgJ00nLCB1J9itJyksCiAgICAoMHgxRUUwOCwgJ00nLCB1J9i3JyksCiAgICAoMHgxRUUwOSwgJ00nLCB1J9mKJyksCiAgICAoMHgxRUUwQSwgJ00nLCB1J9mDJyksCiAgICAoMHgxRUUwQiwgJ00nLCB1J9mEJyksCiAgICAoMHgxRUUwQywgJ00nLCB1J9mFJyksCiAgICAoMHgxRUUwRCwgJ00nLCB1J9mGJyksCiAgICAoMHgxRUUwRSwgJ00nLCB1J9izJyksCiAgICAoMHgxRUUwRiwgJ00nLCB1J9i5JyksCiAgICAoMHgxRUUxMCwgJ00nLCB1J9mBJyksCiAgICAoMHgxRUUxMSwgJ00nLCB1J9i1JyksCiAgICAoMHgxRUUxMiwgJ00nLCB1J9mCJyksCiAgICAoMHgxRUUxMywgJ00nLCB1J9ixJyksCiAgICAoMHgxRUUxNCwgJ00nLCB1J9i0JyksCiAgICAoMHgxRUUxNSwgJ00nLCB1J9iqJyksCiAgICAoMHgxRUUxNiwgJ00nLCB1J9irJyksCiAgICAoMHgxRUUxNywgJ00nLCB1J9iuJyksCiAgICAoMHgxRUUxOCwgJ00nLCB1J9iwJyksCiAgICAoMHgxRUUxOSwgJ00nLCB1J9i2JyksCiAgICAoMHgxRUUxQSwgJ00nLCB1J9i4JyksCiAgICAoMHgxRUUxQiwgJ00nLCB1J9i6JyksCiAgICAoMHgxRUUxQywgJ00nLCB1J9muJyksCiAgICAoMHgxRUUxRCwgJ00nLCB1J9q6JyksCiAgICAoMHgxRUUxRSwgJ00nLCB1J9qhJyksCiAgICAoMHgxRUUxRiwgJ00nLCB1J9mvJyksCiAgICAoMHgxRUUyMCwgJ1gnKSwKICAgICgweDFFRTIxLCAnTScsIHUn2KgnKSwKICAgICgweDFFRTIyLCAnTScsIHUn2KwnKSwKICAgICgweDFFRTIzLCAnWCcpLAogICAgKDB4MUVFMjQsICdNJywgdSfZhycpLAogICAgKDB4MUVFMjUsICdYJyksCiAgICAoMHgxRUUyNywgJ00nLCB1J9itJyksCiAgICAoMHgxRUUyOCwgJ1gnKSwKICAgICgweDFFRTI5LCAnTScsIHUn2YonKSwKICAgICgweDFFRTJBLCAnTScsIHUn2YMnKSwKICAgICgweDFFRTJCLCAnTScsIHUn2YQnKSwKICAgICgweDFFRTJDLCAnTScsIHUn2YUnKSwKICAgICgweDFFRTJELCAnTScsIHUn2YYnKSwKICAgICgweDFFRTJFLCAnTScsIHUn2LMnKSwKICAgICgweDFFRTJGLCAnTScsIHUn2LknKSwKICAgICgweDFFRTMwLCAnTScsIHUn2YEnKSwKICAgICgweDFFRTMxLCAnTScsIHUn2LUnKSwKICAgICgweDFFRTMyLCAnTScsIHUn2YInKSwKICAgIF0KCmRlZiBfc2VnXzY0KCk6CiAgICByZXR1cm4gWwogICAgKDB4MUVFMzMsICdYJyksCiAgICAoMHgxRUUzNCwgJ00nLCB1J9i0JyksCiAgICAoMHgxRUUzNSwgJ00nLCB1J9iqJyksCiAgICAoMHgxRUUzNiwgJ00nLCB1J9irJyksCiAgICAoMHgxRUUzNywgJ00nLCB1J9iuJyksCiAgICAoMHgxRUUzOCwgJ1gnKSwKICAgICgweDFFRTM5LCAnTScsIHUn2LYnKSwKICAgICgweDFFRTNBLCAnWCcpLAogICAgKDB4MUVFM0IsICdNJywgdSfYuicpLAogICAgKDB4MUVFM0MsICdYJyksCiAgICAoMHgxRUU0MiwgJ00nLCB1J9isJyksCiAgICAoMHgxRUU0MywgJ1gnKSwKICAgICgweDFFRTQ3LCAnTScsIHUn2K0nKSwKICAgICgweDFFRTQ4LCAnWCcpLAogICAgKDB4MUVFNDksICdNJywgdSfZiicpLAogICAgKDB4MUVFNEEsICdYJyksCiAgICAoMHgxRUU0QiwgJ00nLCB1J9mEJyksCiAgICAoMHgxRUU0QywgJ1gnKSwKICAgICgweDFFRTRELCAnTScsIHUn2YYnKSwKICAgICgweDFFRTRFLCAnTScsIHUn2LMnKSwKICAgICgweDFFRTRGLCAnTScsIHUn2LknKSwKICAgICgweDFFRTUwLCAnWCcpLAogICAgKDB4MUVFNTEsICdNJywgdSfYtScpLAogICAgKDB4MUVFNTIsICdNJywgdSfZgicpLAogICAgKDB4MUVFNTMsICdYJyksCiAgICAoMHgxRUU1NCwgJ00nLCB1J9i0JyksCiAgICAoMHgxRUU1NSwgJ1gnKSwKICAgICgweDFFRTU3LCAnTScsIHUn2K4nKSwKICAgICgweDFFRTU4LCAnWCcpLAogICAgKDB4MUVFNTksICdNJywgdSfYticpLAogICAgKDB4MUVFNUEsICdYJyksCiAgICAoMHgxRUU1QiwgJ00nLCB1J9i6JyksCiAgICAoMHgxRUU1QywgJ1gnKSwKICAgICgweDFFRTVELCAnTScsIHUn2ronKSwKICAgICgweDFFRTVFLCAnWCcpLAogICAgKDB4MUVFNUYsICdNJywgdSfZrycpLAogICAgKDB4MUVFNjAsICdYJyksCiAgICAoMHgxRUU2MSwgJ00nLCB1J9ioJyksCiAgICAoMHgxRUU2MiwgJ00nLCB1J9isJyksCiAgICAoMHgxRUU2MywgJ1gnKSwKICAgICgweDFFRTY0LCAnTScsIHUn2YcnKSwKICAgICgweDFFRTY1LCAnWCcpLAogICAgKDB4MUVFNjcsICdNJywgdSfYrScpLAogICAgKDB4MUVFNjgsICdNJywgdSfYtycpLAogICAgKDB4MUVFNjksICdNJywgdSfZiicpLAogICAgKDB4MUVFNkEsICdNJywgdSfZgycpLAogICAgKDB4MUVFNkIsICdYJyksCiAgICAoMHgxRUU2QywgJ00nLCB1J9mFJyksCiAgICAoMHgxRUU2RCwgJ00nLCB1J9mGJyksCiAgICAoMHgxRUU2RSwgJ00nLCB1J9izJyksCiAgICAoMHgxRUU2RiwgJ00nLCB1J9i5JyksCiAgICAoMHgxRUU3MCwgJ00nLCB1J9mBJyksCiAgICAoMHgxRUU3MSwgJ00nLCB1J9i1JyksCiAgICAoMHgxRUU3MiwgJ00nLCB1J9mCJyksCiAgICAoMHgxRUU3MywgJ1gnKSwKICAgICgweDFFRTc0LCAnTScsIHUn2LQnKSwKICAgICgweDFFRTc1LCAnTScsIHUn2KonKSwKICAgICgweDFFRTc2LCAnTScsIHUn2KsnKSwKICAgICgweDFFRTc3LCAnTScsIHUn2K4nKSwKICAgICgweDFFRTc4LCAnWCcpLAogICAgKDB4MUVFNzksICdNJywgdSfYticpLAogICAgKDB4MUVFN0EsICdNJywgdSfYuCcpLAogICAgKDB4MUVFN0IsICdNJywgdSfYuicpLAogICAgKDB4MUVFN0MsICdNJywgdSfZricpLAogICAgKDB4MUVFN0QsICdYJyksCiAgICAoMHgxRUU3RSwgJ00nLCB1J9qhJyksCiAgICAoMHgxRUU3RiwgJ1gnKSwKICAgICgweDFFRTgwLCAnTScsIHUn2KcnKSwKICAgICgweDFFRTgxLCAnTScsIHUn2KgnKSwKICAgICgweDFFRTgyLCAnTScsIHUn2KwnKSwKICAgICgweDFFRTgzLCAnTScsIHUn2K8nKSwKICAgICgweDFFRTg0LCAnTScsIHUn2YcnKSwKICAgICgweDFFRTg1LCAnTScsIHUn2YgnKSwKICAgICgweDFFRTg2LCAnTScsIHUn2LInKSwKICAgICgweDFFRTg3LCAnTScsIHUn2K0nKSwKICAgICgweDFFRTg4LCAnTScsIHUn2LcnKSwKICAgICgweDFFRTg5LCAnTScsIHUn2YonKSwKICAgICgweDFFRThBLCAnWCcpLAogICAgKDB4MUVFOEIsICdNJywgdSfZhCcpLAogICAgKDB4MUVFOEMsICdNJywgdSfZhScpLAogICAgKDB4MUVFOEQsICdNJywgdSfZhicpLAogICAgKDB4MUVFOEUsICdNJywgdSfYsycpLAogICAgKDB4MUVFOEYsICdNJywgdSfYuScpLAogICAgKDB4MUVFOTAsICdNJywgdSfZgScpLAogICAgKDB4MUVFOTEsICdNJywgdSfYtScpLAogICAgKDB4MUVFOTIsICdNJywgdSfZgicpLAogICAgKDB4MUVFOTMsICdNJywgdSfYsScpLAogICAgKDB4MUVFOTQsICdNJywgdSfYtCcpLAogICAgKDB4MUVFOTUsICdNJywgdSfYqicpLAogICAgKDB4MUVFOTYsICdNJywgdSfYqycpLAogICAgKDB4MUVFOTcsICdNJywgdSfYricpLAogICAgKDB4MUVFOTgsICdNJywgdSfYsCcpLAogICAgKDB4MUVFOTksICdNJywgdSfYticpLAogICAgKDB4MUVFOUEsICdNJywgdSfYuCcpLAogICAgKDB4MUVFOUIsICdNJywgdSfYuicpLAogICAgKDB4MUVFOUMsICdYJyksCiAgICAoMHgxRUVBMSwgJ00nLCB1J9ioJyksCiAgICAoMHgxRUVBMiwgJ00nLCB1J9isJyksCiAgICAoMHgxRUVBMywgJ00nLCB1J9ivJyksCiAgICAoMHgxRUVBNCwgJ1gnKSwKICAgIF0KCmRlZiBfc2VnXzY1KCk6CiAgICByZXR1cm4gWwogICAgKDB4MUVFQTUsICdNJywgdSfZiCcpLAogICAgKDB4MUVFQTYsICdNJywgdSfYsicpLAogICAgKDB4MUVFQTcsICdNJywgdSfYrScpLAogICAgKDB4MUVFQTgsICdNJywgdSfYtycpLAogICAgKDB4MUVFQTksICdNJywgdSfZiicpLAogICAgKDB4MUVFQUEsICdYJyksCiAgICAoMHgxRUVBQiwgJ00nLCB1J9mEJyksCiAgICAoMHgxRUVBQywgJ00nLCB1J9mFJyksCiAgICAoMHgxRUVBRCwgJ00nLCB1J9mGJyksCiAgICAoMHgxRUVBRSwgJ00nLCB1J9izJyksCiAgICAoMHgxRUVBRiwgJ00nLCB1J9i5JyksCiAgICAoMHgxRUVCMCwgJ00nLCB1J9mBJyksCiAgICAoMHgxRUVCMSwgJ00nLCB1J9i1JyksCiAgICAoMHgxRUVCMiwgJ00nLCB1J9mCJyksCiAgICAoMHgxRUVCMywgJ00nLCB1J9ixJyksCiAgICAoMHgxRUVCNCwgJ00nLCB1J9i0JyksCiAgICAoMHgxRUVCNSwgJ00nLCB1J9iqJyksCiAgICAoMHgxRUVCNiwgJ00nLCB1J9irJyksCiAgICAoMHgxRUVCNywgJ00nLCB1J9iuJyksCiAgICAoMHgxRUVCOCwgJ00nLCB1J9iwJyksCiAgICAoMHgxRUVCOSwgJ00nLCB1J9i2JyksCiAgICAoMHgxRUVCQSwgJ00nLCB1J9i4JyksCiAgICAoMHgxRUVCQiwgJ00nLCB1J9i6JyksCiAgICAoMHgxRUVCQywgJ1gnKSwKICAgICgweDFFRUYwLCAnVicpLAogICAgKDB4MUVFRjIsICdYJyksCiAgICAoMHgxRjAwMCwgJ1YnKSwKICAgICgweDFGMDJDLCAnWCcpLAogICAgKDB4MUYwMzAsICdWJyksCiAgICAoMHgxRjA5NCwgJ1gnKSwKICAgICgweDFGMEEwLCAnVicpLAogICAgKDB4MUYwQUYsICdYJyksCiAgICAoMHgxRjBCMSwgJ1YnKSwKICAgICgweDFGMEJGLCAnWCcpLAogICAgKDB4MUYwQzEsICdWJyksCiAgICAoMHgxRjBEMCwgJ1gnKSwKICAgICgweDFGMEQxLCAnVicpLAogICAgKDB4MUYwRTAsICdYJyksCiAgICAoMHgxRjEwMSwgJzMnLCB1JzAsJyksCiAgICAoMHgxRjEwMiwgJzMnLCB1JzEsJyksCiAgICAoMHgxRjEwMywgJzMnLCB1JzIsJyksCiAgICAoMHgxRjEwNCwgJzMnLCB1JzMsJyksCiAgICAoMHgxRjEwNSwgJzMnLCB1JzQsJyksCiAgICAoMHgxRjEwNiwgJzMnLCB1JzUsJyksCiAgICAoMHgxRjEwNywgJzMnLCB1JzYsJyksCiAgICAoMHgxRjEwOCwgJzMnLCB1JzcsJyksCiAgICAoMHgxRjEwOSwgJzMnLCB1JzgsJyksCiAgICAoMHgxRjEwQSwgJzMnLCB1JzksJyksCiAgICAoMHgxRjEwQiwgJ1gnKSwKICAgICgweDFGMTEwLCAnMycsIHUnKGEpJyksCiAgICAoMHgxRjExMSwgJzMnLCB1JyhiKScpLAogICAgKDB4MUYxMTIsICczJywgdScoYyknKSwKICAgICgweDFGMTEzLCAnMycsIHUnKGQpJyksCiAgICAoMHgxRjExNCwgJzMnLCB1JyhlKScpLAogICAgKDB4MUYxMTUsICczJywgdScoZiknKSwKICAgICgweDFGMTE2LCAnMycsIHUnKGcpJyksCiAgICAoMHgxRjExNywgJzMnLCB1JyhoKScpLAogICAgKDB4MUYxMTgsICczJywgdScoaSknKSwKICAgICgweDFGMTE5LCAnMycsIHUnKGopJyksCiAgICAoMHgxRjExQSwgJzMnLCB1JyhrKScpLAogICAgKDB4MUYxMUIsICczJywgdScobCknKSwKICAgICgweDFGMTFDLCAnMycsIHUnKG0pJyksCiAgICAoMHgxRjExRCwgJzMnLCB1JyhuKScpLAogICAgKDB4MUYxMUUsICczJywgdScobyknKSwKICAgICgweDFGMTFGLCAnMycsIHUnKHApJyksCiAgICAoMHgxRjEyMCwgJzMnLCB1JyhxKScpLAogICAgKDB4MUYxMjEsICczJywgdScociknKSwKICAgICgweDFGMTIyLCAnMycsIHUnKHMpJyksCiAgICAoMHgxRjEyMywgJzMnLCB1Jyh0KScpLAogICAgKDB4MUYxMjQsICczJywgdScodSknKSwKICAgICgweDFGMTI1LCAnMycsIHUnKHYpJyksCiAgICAoMHgxRjEyNiwgJzMnLCB1Jyh3KScpLAogICAgKDB4MUYxMjcsICczJywgdScoeCknKSwKICAgICgweDFGMTI4LCAnMycsIHUnKHkpJyksCiAgICAoMHgxRjEyOSwgJzMnLCB1Jyh6KScpLAogICAgKDB4MUYxMkEsICdNJywgdSfjgJRz44CVJyksCiAgICAoMHgxRjEyQiwgJ00nLCB1J2MnKSwKICAgICgweDFGMTJDLCAnTScsIHUncicpLAogICAgKDB4MUYxMkQsICdNJywgdSdjZCcpLAogICAgKDB4MUYxMkUsICdNJywgdSd3eicpLAogICAgKDB4MUYxMkYsICdYJyksCiAgICAoMHgxRjEzMCwgJ00nLCB1J2EnKSwKICAgICgweDFGMTMxLCAnTScsIHUnYicpLAogICAgKDB4MUYxMzIsICdNJywgdSdjJyksCiAgICAoMHgxRjEzMywgJ00nLCB1J2QnKSwKICAgICgweDFGMTM0LCAnTScsIHUnZScpLAogICAgKDB4MUYxMzUsICdNJywgdSdmJyksCiAgICAoMHgxRjEzNiwgJ00nLCB1J2cnKSwKICAgICgweDFGMTM3LCAnTScsIHUnaCcpLAogICAgKDB4MUYxMzgsICdNJywgdSdpJyksCiAgICAoMHgxRjEzOSwgJ00nLCB1J2onKSwKICAgICgweDFGMTNBLCAnTScsIHUnaycpLAogICAgKDB4MUYxM0IsICdNJywgdSdsJyksCiAgICAoMHgxRjEzQywgJ00nLCB1J20nKSwKICAgICgweDFGMTNELCAnTScsIHUnbicpLAogICAgKDB4MUYxM0UsICdNJywgdSdvJyksCiAgICAoMHgxRjEzRiwgJ00nLCB1J3AnKSwKICAgICgweDFGMTQwLCAnTScsIHUncScpLAogICAgKDB4MUYxNDEsICdNJywgdSdyJyksCiAgICAoMHgxRjE0MiwgJ00nLCB1J3MnKSwKICAgIF0KCmRlZiBfc2VnXzY2KCk6CiAgICByZXR1cm4gWwogICAgKDB4MUYxNDMsICdNJywgdSd0JyksCiAgICAoMHgxRjE0NCwgJ00nLCB1J3UnKSwKICAgICgweDFGMTQ1LCAnTScsIHUndicpLAogICAgKDB4MUYxNDYsICdNJywgdSd3JyksCiAgICAoMHgxRjE0NywgJ00nLCB1J3gnKSwKICAgICgweDFGMTQ4LCAnTScsIHUneScpLAogICAgKDB4MUYxNDksICdNJywgdSd6JyksCiAgICAoMHgxRjE0QSwgJ00nLCB1J2h2JyksCiAgICAoMHgxRjE0QiwgJ00nLCB1J212JyksCiAgICAoMHgxRjE0QywgJ00nLCB1J3NkJyksCiAgICAoMHgxRjE0RCwgJ00nLCB1J3NzJyksCiAgICAoMHgxRjE0RSwgJ00nLCB1J3BwdicpLAogICAgKDB4MUYxNEYsICdNJywgdSd3YycpLAogICAgKDB4MUYxNTAsICdWJyksCiAgICAoMHgxRjE2QSwgJ00nLCB1J21jJyksCiAgICAoMHgxRjE2QiwgJ00nLCB1J21kJyksCiAgICAoMHgxRjE2QywgJ1gnKSwKICAgICgweDFGMTcwLCAnVicpLAogICAgKDB4MUYxOTAsICdNJywgdSdkaicpLAogICAgKDB4MUYxOTEsICdWJyksCiAgICAoMHgxRjE5QiwgJ1gnKSwKICAgICgweDFGMUU2LCAnVicpLAogICAgKDB4MUYyMDAsICdNJywgdSfjgbvjgYsnKSwKICAgICgweDFGMjAxLCAnTScsIHUn44Kz44KzJyksCiAgICAoMHgxRjIwMiwgJ00nLCB1J+OCtScpLAogICAgKDB4MUYyMDMsICdYJyksCiAgICAoMHgxRjIxMCwgJ00nLCB1J+aJiycpLAogICAgKDB4MUYyMTEsICdNJywgdSflrZcnKSwKICAgICgweDFGMjEyLCAnTScsIHUn5Y+MJyksCiAgICAoMHgxRjIxMywgJ00nLCB1J+ODhycpLAogICAgKDB4MUYyMTQsICdNJywgdSfkuownKSwKICAgICgweDFGMjE1LCAnTScsIHUn5aSaJyksCiAgICAoMHgxRjIxNiwgJ00nLCB1J+inoycpLAogICAgKDB4MUYyMTcsICdNJywgdSflpKknKSwKICAgICgweDFGMjE4LCAnTScsIHUn5LqkJyksCiAgICAoMHgxRjIxOSwgJ00nLCB1J+aYoCcpLAogICAgKDB4MUYyMUEsICdNJywgdSfnhKEnKSwKICAgICgweDFGMjFCLCAnTScsIHUn5paZJyksCiAgICAoMHgxRjIxQywgJ00nLCB1J+WJjScpLAogICAgKDB4MUYyMUQsICdNJywgdSflvownKSwKICAgICgweDFGMjFFLCAnTScsIHUn5YaNJyksCiAgICAoMHgxRjIxRiwgJ00nLCB1J+aWsCcpLAogICAgKDB4MUYyMjAsICdNJywgdSfliJ0nKSwKICAgICgweDFGMjIxLCAnTScsIHUn57WCJyksCiAgICAoMHgxRjIyMiwgJ00nLCB1J+eUnycpLAogICAgKDB4MUYyMjMsICdNJywgdSfosqknKSwKICAgICgweDFGMjI0LCAnTScsIHUn5aOwJyksCiAgICAoMHgxRjIyNSwgJ00nLCB1J+WQuScpLAogICAgKDB4MUYyMjYsICdNJywgdSfmvJQnKSwKICAgICgweDFGMjI3LCAnTScsIHUn5oqVJyksCiAgICAoMHgxRjIyOCwgJ00nLCB1J+aNlScpLAogICAgKDB4MUYyMjksICdNJywgdSfkuIAnKSwKICAgICgweDFGMjJBLCAnTScsIHUn5LiJJyksCiAgICAoMHgxRjIyQiwgJ00nLCB1J+mBiicpLAogICAgKDB4MUYyMkMsICdNJywgdSflt6YnKSwKICAgICgweDFGMjJELCAnTScsIHUn5LitJyksCiAgICAoMHgxRjIyRSwgJ00nLCB1J+WPsycpLAogICAgKDB4MUYyMkYsICdNJywgdSfmjIcnKSwKICAgICgweDFGMjMwLCAnTScsIHUn6LWwJyksCiAgICAoMHgxRjIzMSwgJ00nLCB1J+aJkycpLAogICAgKDB4MUYyMzIsICdNJywgdSfnpoEnKSwKICAgICgweDFGMjMzLCAnTScsIHUn56m6JyksCiAgICAoMHgxRjIzNCwgJ00nLCB1J+WQiCcpLAogICAgKDB4MUYyMzUsICdNJywgdSfmuoAnKSwKICAgICgweDFGMjM2LCAnTScsIHUn5pyJJyksCiAgICAoMHgxRjIzNywgJ00nLCB1J+aciCcpLAogICAgKDB4MUYyMzgsICdNJywgdSfnlLMnKSwKICAgICgweDFGMjM5LCAnTScsIHUn5YmyJyksCiAgICAoMHgxRjIzQSwgJ00nLCB1J+WWticpLAogICAgKDB4MUYyM0IsICdYJyksCiAgICAoMHgxRjI0MCwgJ00nLCB1J+OAlOacrOOAlScpLAogICAgKDB4MUYyNDEsICdNJywgdSfjgJTkuInjgJUnKSwKICAgICgweDFGMjQyLCAnTScsIHUn44CU5LqM44CVJyksCiAgICAoMHgxRjI0MywgJ00nLCB1J+OAlOWuieOAlScpLAogICAgKDB4MUYyNDQsICdNJywgdSfjgJTngrnjgJUnKSwKICAgICgweDFGMjQ1LCAnTScsIHUn44CU5omT44CVJyksCiAgICAoMHgxRjI0NiwgJ00nLCB1J+OAlOebl+OAlScpLAogICAgKDB4MUYyNDcsICdNJywgdSfjgJTli53jgJUnKSwKICAgICgweDFGMjQ4LCAnTScsIHUn44CU5pWX44CVJyksCiAgICAoMHgxRjI0OSwgJ1gnKSwKICAgICgweDFGMjUwLCAnTScsIHUn5b6XJyksCiAgICAoMHgxRjI1MSwgJ00nLCB1J+WPrycpLAogICAgKDB4MUYyNTIsICdYJyksCiAgICAoMHgxRjMwMCwgJ1YnKSwKICAgICgweDFGMzIxLCAnWCcpLAogICAgKDB4MUYzMzAsICdWJyksCiAgICAoMHgxRjMzNiwgJ1gnKSwKICAgICgweDFGMzM3LCAnVicpLAogICAgKDB4MUYzN0QsICdYJyksCiAgICAoMHgxRjM4MCwgJ1YnKSwKICAgICgweDFGMzk0LCAnWCcpLAogICAgKDB4MUYzQTAsICdWJyksCiAgICAoMHgxRjNDNSwgJ1gnKSwKICAgICgweDFGM0M2LCAnVicpLAogICAgKDB4MUYzQ0IsICdYJyksCiAgICAoMHgxRjNFMCwgJ1YnKSwKICAgICgweDFGM0YxLCAnWCcpLAogICAgKDB4MUY0MDAsICdWJyksCiAgICAoMHgxRjQzRiwgJ1gnKSwKICAgICgweDFGNDQwLCAnVicpLAogICAgXQoKZGVmIF9zZWdfNjcoKToKICAgIHJldHVybiBbCiAgICAoMHgxRjQ0MSwgJ1gnKSwKICAgICgweDFGNDQyLCAnVicpLAogICAgKDB4MUY0RjgsICdYJyksCiAgICAoMHgxRjRGOSwgJ1YnKSwKICAgICgweDFGNEZELCAnWCcpLAogICAgKDB4MUY1MDAsICdWJyksCiAgICAoMHgxRjUzRSwgJ1gnKSwKICAgICgweDFGNTQwLCAnVicpLAogICAgKDB4MUY1NDQsICdYJyksCiAgICAoMHgxRjU1MCwgJ1YnKSwKICAgICgweDFGNTY4LCAnWCcpLAogICAgKDB4MUY1RkIsICdWJyksCiAgICAoMHgxRjY0MSwgJ1gnKSwKICAgICgweDFGNjQ1LCAnVicpLAogICAgKDB4MUY2NTAsICdYJyksCiAgICAoMHgxRjY4MCwgJ1YnKSwKICAgICgweDFGNkM2LCAnWCcpLAogICAgKDB4MUY3MDAsICdWJyksCiAgICAoMHgxRjc3NCwgJ1gnKSwKICAgICgweDIwMDAwLCAnVicpLAogICAgKDB4MkE2RDcsICdYJyksCiAgICAoMHgyQTcwMCwgJ1YnKSwKICAgICgweDJCNzM1LCAnWCcpLAogICAgKDB4MkI3NDAsICdWJyksCiAgICAoMHgyQjgxRSwgJ1gnKSwKICAgICgweDJGODAwLCAnTScsIHUn5Li9JyksCiAgICAoMHgyRjgwMSwgJ00nLCB1J+S4uCcpLAogICAgKDB4MkY4MDIsICdNJywgdSfkuYEnKSwKICAgICgweDJGODAzLCAnTScsIHUn8KCEoicpLAogICAgKDB4MkY4MDQsICdNJywgdSfkvaAnKSwKICAgICgweDJGODA1LCAnTScsIHUn5L6uJyksCiAgICAoMHgyRjgwNiwgJ00nLCB1J+S+uycpLAogICAgKDB4MkY4MDcsICdNJywgdSflgIInKSwKICAgICgweDJGODA4LCAnTScsIHUn5YG6JyksCiAgICAoMHgyRjgwOSwgJ00nLCB1J+WCmScpLAogICAgKDB4MkY4MEEsICdNJywgdSflg6cnKSwKICAgICgweDJGODBCLCAnTScsIHUn5YOPJyksCiAgICAoMHgyRjgwQywgJ00nLCB1J+OSnicpLAogICAgKDB4MkY4MEQsICdNJywgdSfwoJi6JyksCiAgICAoMHgyRjgwRSwgJ00nLCB1J+WFjScpLAogICAgKDB4MkY4MEYsICdNJywgdSflhZQnKSwKICAgICgweDJGODEwLCAnTScsIHUn5YWkJyksCiAgICAoMHgyRjgxMSwgJ00nLCB1J+WFtycpLAogICAgKDB4MkY4MTIsICdNJywgdSfwoJScJyksCiAgICAoMHgyRjgxMywgJ00nLCB1J+OSuScpLAogICAgKDB4MkY4MTQsICdNJywgdSflhacnKSwKICAgICgweDJGODE1LCAnTScsIHUn5YaNJyksCiAgICAoMHgyRjgxNiwgJ00nLCB1J/CglYsnKSwKICAgICgweDJGODE3LCAnTScsIHUn5YaXJyksCiAgICAoMHgyRjgxOCwgJ00nLCB1J+WGpCcpLAogICAgKDB4MkY4MTksICdNJywgdSfku4wnKSwKICAgICgweDJGODFBLCAnTScsIHUn5YasJyksCiAgICAoMHgyRjgxQiwgJ00nLCB1J+WGtScpLAogICAgKDB4MkY4MUMsICdNJywgdSfwqYefJyksCiAgICAoMHgyRjgxRCwgJ00nLCB1J+WHtScpLAogICAgKDB4MkY4MUUsICdNJywgdSfliIMnKSwKICAgICgweDJGODFGLCAnTScsIHUn45OfJyksCiAgICAoMHgyRjgyMCwgJ00nLCB1J+WIuycpLAogICAgKDB4MkY4MjEsICdNJywgdSfliYYnKSwKICAgICgweDJGODIyLCAnTScsIHUn5YmyJyksCiAgICAoMHgyRjgyMywgJ00nLCB1J+WJtycpLAogICAgKDB4MkY4MjQsICdNJywgdSfjlJUnKSwKICAgICgweDJGODI1LCAnTScsIHUn5YuHJyksCiAgICAoMHgyRjgyNiwgJ00nLCB1J+WLiScpLAogICAgKDB4MkY4MjcsICdNJywgdSfli6QnKSwKICAgICgweDJGODI4LCAnTScsIHUn5Yu6JyksCiAgICAoMHgyRjgyOSwgJ00nLCB1J+WMhScpLAogICAgKDB4MkY4MkEsICdNJywgdSfljIYnKSwKICAgICgweDJGODJCLCAnTScsIHUn5YyXJyksCiAgICAoMHgyRjgyQywgJ00nLCB1J+WNiScpLAogICAgKDB4MkY4MkQsICdNJywgdSfljZEnKSwKICAgICgweDJGODJFLCAnTScsIHUn5Y2aJyksCiAgICAoMHgyRjgyRiwgJ00nLCB1J+WNsycpLAogICAgKDB4MkY4MzAsICdNJywgdSfljb0nKSwKICAgICgweDJGODMxLCAnTScsIHUn5Y2/JyksCiAgICAoMHgyRjgzNCwgJ00nLCB1J/CgqKwnKSwKICAgICgweDJGODM1LCAnTScsIHUn54GwJyksCiAgICAoMHgyRjgzNiwgJ00nLCB1J+WPiicpLAogICAgKDB4MkY4MzcsICdNJywgdSflj58nKSwKICAgICgweDJGODM4LCAnTScsIHUn8KCtoycpLAogICAgKDB4MkY4MzksICdNJywgdSflj6snKSwKICAgICgweDJGODNBLCAnTScsIHUn5Y+xJyksCiAgICAoMHgyRjgzQiwgJ00nLCB1J+WQhicpLAogICAgKDB4MkY4M0MsICdNJywgdSflkp4nKSwKICAgICgweDJGODNELCAnTScsIHUn5ZC4JyksCiAgICAoMHgyRjgzRSwgJ00nLCB1J+WRiCcpLAogICAgKDB4MkY4M0YsICdNJywgdSflkagnKSwKICAgICgweDJGODQwLCAnTScsIHUn5ZKiJyksCiAgICAoMHgyRjg0MSwgJ00nLCB1J+WTticpLAogICAgKDB4MkY4NDIsICdNJywgdSfllJAnKSwKICAgICgweDJGODQzLCAnTScsIHUn5ZWTJyksCiAgICAoMHgyRjg0NCwgJ00nLCB1J+WVoycpLAogICAgKDB4MkY4NDUsICdNJywgdSflloQnKSwKICAgICgweDJGODQ3LCAnTScsIHUn5ZaZJyksCiAgICAoMHgyRjg0OCwgJ00nLCB1J+WWqycpLAogICAgKDB4MkY4NDksICdNJywgdSfllrMnKSwKICAgICgweDJGODRBLCAnTScsIHUn5ZeCJyksCiAgICAoMHgyRjg0QiwgJ00nLCB1J+WclicpLAogICAgKDB4MkY4NEMsICdNJywgdSflmIYnKSwKICAgICgweDJGODRELCAnTScsIHUn5ZyXJyksCiAgICBdCgpkZWYgX3NlZ182OCgpOgogICAgcmV0dXJuIFsKICAgICgweDJGODRFLCAnTScsIHUn5ZmRJyksCiAgICAoMHgyRjg0RiwgJ00nLCB1J+WZtCcpLAogICAgKDB4MkY4NTAsICdNJywgdSfliIcnKSwKICAgICgweDJGODUxLCAnTScsIHUn5aOuJyksCiAgICAoMHgyRjg1MiwgJ00nLCB1J+WfjicpLAogICAgKDB4MkY4NTMsICdNJywgdSfln7QnKSwKICAgICgweDJGODU0LCAnTScsIHUn5aCNJyksCiAgICAoMHgyRjg1NSwgJ00nLCB1J+WeiycpLAogICAgKDB4MkY4NTYsICdNJywgdSfloLInKSwKICAgICgweDJGODU3LCAnTScsIHUn5aCxJyksCiAgICAoMHgyRjg1OCwgJ00nLCB1J+WirCcpLAogICAgKDB4MkY4NTksICdNJywgdSfwoZOkJyksCiAgICAoMHgyRjg1QSwgJ00nLCB1J+WjsicpLAogICAgKDB4MkY4NUIsICdNJywgdSflo7cnKSwKICAgICgweDJGODVDLCAnTScsIHUn5aSGJyksCiAgICAoMHgyRjg1RCwgJ00nLCB1J+WkmicpLAogICAgKDB4MkY4NUUsICdNJywgdSflpKInKSwKICAgICgweDJGODVGLCAnTScsIHUn5aWiJyksCiAgICAoMHgyRjg2MCwgJ00nLCB1J/ChmqgnKSwKICAgICgweDJGODYxLCAnTScsIHUn8KGbqicpLAogICAgKDB4MkY4NjIsICdNJywgdSflp6wnKSwKICAgICgweDJGODYzLCAnTScsIHUn5aibJyksCiAgICAoMHgyRjg2NCwgJ00nLCB1J+WopycpLAogICAgKDB4MkY4NjUsICdNJywgdSflp5gnKSwKICAgICgweDJGODY2LCAnTScsIHUn5ammJyksCiAgICAoMHgyRjg2NywgJ00nLCB1J+ObricpLAogICAgKDB4MkY4NjgsICdYJyksCiAgICAoMHgyRjg2OSwgJ00nLCB1J+WsiCcpLAogICAgKDB4MkY4NkEsICdNJywgdSflrL4nKSwKICAgICgweDJGODZDLCAnTScsIHUn8KGniCcpLAogICAgKDB4MkY4NkQsICdNJywgdSflr4MnKSwKICAgICgweDJGODZFLCAnTScsIHUn5a+YJyksCiAgICAoMHgyRjg2RiwgJ00nLCB1J+WvpycpLAogICAgKDB4MkY4NzAsICdNJywgdSflr7MnKSwKICAgICgweDJGODcxLCAnTScsIHUn8KGsmCcpLAogICAgKDB4MkY4NzIsICdNJywgdSflr78nKSwKICAgICgweDJGODczLCAnTScsIHUn5bCGJyksCiAgICAoMHgyRjg3NCwgJ1gnKSwKICAgICgweDJGODc1LCAnTScsIHUn5bCiJyksCiAgICAoMHgyRjg3NiwgJ00nLCB1J+OegScpLAogICAgKDB4MkY4NzcsICdNJywgdSflsaAnKSwKICAgICgweDJGODc4LCAnTScsIHUn5bGuJyksCiAgICAoMHgyRjg3OSwgJ00nLCB1J+WzgCcpLAogICAgKDB4MkY4N0EsICdNJywgdSflso0nKSwKICAgICgweDJGODdCLCAnTScsIHUn8KG3pCcpLAogICAgKDB4MkY4N0MsICdNJywgdSfltYMnKSwKICAgICgweDJGODdELCAnTScsIHUn8KG3picpLAogICAgKDB4MkY4N0UsICdNJywgdSflta4nKSwKICAgICgweDJGODdGLCAnTScsIHUn5bWrJyksCiAgICAoMHgyRjg4MCwgJ00nLCB1J+W1vCcpLAogICAgKDB4MkY4ODEsICdNJywgdSflt6EnKSwKICAgICgweDJGODgyLCAnTScsIHUn5beiJyksCiAgICAoMHgyRjg4MywgJ00nLCB1J+OgrycpLAogICAgKDB4MkY4ODQsICdNJywgdSflt70nKSwKICAgICgweDJGODg1LCAnTScsIHUn5bioJyksCiAgICAoMHgyRjg4NiwgJ00nLCB1J+W4vScpLAogICAgKDB4MkY4ODcsICdNJywgdSfluaknKSwKICAgICgweDJGODg4LCAnTScsIHUn46GiJyksCiAgICAoMHgyRjg4OSwgJ00nLCB1J/CihoMnKSwKICAgICgweDJGODhBLCAnTScsIHUn46G8JyksCiAgICAoMHgyRjg4QiwgJ00nLCB1J+W6sCcpLAogICAgKDB4MkY4OEMsICdNJywgdSflurMnKSwKICAgICgweDJGODhELCAnTScsIHUn5bq2JyksCiAgICAoMHgyRjg4RSwgJ00nLCB1J+W7iicpLAogICAgKDB4MkY4OEYsICdNJywgdSfwqo6SJyksCiAgICAoMHgyRjg5MCwgJ00nLCB1J+W7vicpLAogICAgKDB4MkY4OTEsICdNJywgdSfwooyxJyksCiAgICAoMHgyRjg5MywgJ00nLCB1J+iIgScpLAogICAgKDB4MkY4OTQsICdNJywgdSflvKInKSwKICAgICgweDJGODk2LCAnTScsIHUn46OHJyksCiAgICAoMHgyRjg5NywgJ00nLCB1J/CjirgnKSwKICAgICgweDJGODk4LCAnTScsIHUn8KaHmicpLAogICAgKDB4MkY4OTksICdNJywgdSflvaInKSwKICAgICgweDJGODlBLCAnTScsIHUn5b2rJyksCiAgICAoMHgyRjg5QiwgJ00nLCB1J+OjoycpLAogICAgKDB4MkY4OUMsICdNJywgdSflvponKSwKICAgICgweDJGODlELCAnTScsIHUn5b+NJyksCiAgICAoMHgyRjg5RSwgJ00nLCB1J+W/lycpLAogICAgKDB4MkY4OUYsICdNJywgdSflv7knKSwKICAgICgweDJGOEEwLCAnTScsIHUn5oKBJyksCiAgICAoMHgyRjhBMSwgJ00nLCB1J+OkuicpLAogICAgKDB4MkY4QTIsICdNJywgdSfjpJwnKSwKICAgICgweDJGOEEzLCAnTScsIHUn5oKUJyksCiAgICAoMHgyRjhBNCwgJ00nLCB1J/Cim5QnKSwKICAgICgweDJGOEE1LCAnTScsIHUn5oOHJyksCiAgICAoMHgyRjhBNiwgJ00nLCB1J+aFiCcpLAogICAgKDB4MkY4QTcsICdNJywgdSfmhYwnKSwKICAgICgweDJGOEE4LCAnTScsIHUn5oWOJyksCiAgICAoMHgyRjhBOSwgJ00nLCB1J+aFjCcpLAogICAgKDB4MkY4QUEsICdNJywgdSfmhbonKSwKICAgICgweDJGOEFCLCAnTScsIHUn5oaOJyksCiAgICAoMHgyRjhBQywgJ00nLCB1J+aGsicpLAogICAgKDB4MkY4QUQsICdNJywgdSfmhqQnKSwKICAgICgweDJGOEFFLCAnTScsIHUn5oavJyksCiAgICAoMHgyRjhBRiwgJ00nLCB1J+aHnicpLAogICAgKDB4MkY4QjAsICdNJywgdSfmh7InKSwKICAgICgweDJGOEIxLCAnTScsIHUn5oe2JyksCiAgICAoMHgyRjhCMiwgJ00nLCB1J+aIkCcpLAogICAgKDB4MkY4QjMsICdNJywgdSfmiJsnKSwKICAgICgweDJGOEI0LCAnTScsIHUn5omdJyksCiAgICBdCgpkZWYgX3NlZ182OSgpOgogICAgcmV0dXJuIFsKICAgICgweDJGOEI1LCAnTScsIHUn5oqxJyksCiAgICAoMHgyRjhCNiwgJ00nLCB1J+aLlCcpLAogICAgKDB4MkY4QjcsICdNJywgdSfmjZAnKSwKICAgICgweDJGOEI4LCAnTScsIHUn8KKsjCcpLAogICAgKDB4MkY4QjksICdNJywgdSfmjL0nKSwKICAgICgweDJGOEJBLCAnTScsIHUn5ou8JyksCiAgICAoMHgyRjhCQiwgJ00nLCB1J+aNqCcpLAogICAgKDB4MkY4QkMsICdNJywgdSfmjoMnKSwKICAgICgweDJGOEJELCAnTScsIHUn5o+kJyksCiAgICAoMHgyRjhCRSwgJ00nLCB1J/Cir7EnKSwKICAgICgweDJGOEJGLCAnTScsIHUn5pCiJyksCiAgICAoMHgyRjhDMCwgJ00nLCB1J+aPhScpLAogICAgKDB4MkY4QzEsICdNJywgdSfmjqknKSwKICAgICgweDJGOEMyLCAnTScsIHUn46iuJyksCiAgICAoMHgyRjhDMywgJ00nLCB1J+aRqScpLAogICAgKDB4MkY4QzQsICdNJywgdSfmkb4nKSwKICAgICgweDJGOEM1LCAnTScsIHUn5pKdJyksCiAgICAoMHgyRjhDNiwgJ00nLCB1J+aRtycpLAogICAgKDB4MkY4QzcsICdNJywgdSfjqawnKSwKICAgICgweDJGOEM4LCAnTScsIHUn5pWPJyksCiAgICAoMHgyRjhDOSwgJ00nLCB1J+aVrCcpLAogICAgKDB4MkY4Q0EsICdNJywgdSfwo4CKJyksCiAgICAoMHgyRjhDQiwgJ00nLCB1J+aXoycpLAogICAgKDB4MkY4Q0MsICdNJywgdSfmm7gnKSwKICAgICgweDJGOENELCAnTScsIHUn5pmJJyksCiAgICAoMHgyRjhDRSwgJ00nLCB1J+OsmScpLAogICAgKDB4MkY4Q0YsICdNJywgdSfmmpEnKSwKICAgICgweDJGOEQwLCAnTScsIHUn46yIJyksCiAgICAoMHgyRjhEMSwgJ00nLCB1J+OrpCcpLAogICAgKDB4MkY4RDIsICdNJywgdSflhpInKSwKICAgICgweDJGOEQzLCAnTScsIHUn5YaVJyksCiAgICAoMHgyRjhENCwgJ00nLCB1J+acgCcpLAogICAgKDB4MkY4RDUsICdNJywgdSfmmpwnKSwKICAgICgweDJGOEQ2LCAnTScsIHUn6IKtJyksCiAgICAoMHgyRjhENywgJ00nLCB1J+SPmScpLAogICAgKDB4MkY4RDgsICdNJywgdSfmnJcnKSwKICAgICgweDJGOEQ5LCAnTScsIHUn5pybJyksCiAgICAoMHgyRjhEQSwgJ00nLCB1J+acoScpLAogICAgKDB4MkY4REIsICdNJywgdSfmnZ4nKSwKICAgICgweDJGOERDLCAnTScsIHUn5p2TJyksCiAgICAoMHgyRjhERCwgJ00nLCB1J/Cjj4MnKSwKICAgICgweDJGOERFLCAnTScsIHUn462JJyksCiAgICAoMHgyRjhERiwgJ00nLCB1J+afuicpLAogICAgKDB4MkY4RTAsICdNJywgdSfmnoUnKSwKICAgICgweDJGOEUxLCAnTScsIHUn5qGSJyksCiAgICAoMHgyRjhFMiwgJ00nLCB1J+aihScpLAogICAgKDB4MkY4RTMsICdNJywgdSfwo5GtJyksCiAgICAoMHgyRjhFNCwgJ00nLCB1J+aijicpLAogICAgKDB4MkY4RTUsICdNJywgdSfmoJ8nKSwKICAgICgweDJGOEU2LCAnTScsIHUn5qSUJyksCiAgICAoMHgyRjhFNywgJ00nLCB1J+OunScpLAogICAgKDB4MkY4RTgsICdNJywgdSfmpYInKSwKICAgICgweDJGOEU5LCAnTScsIHUn5qajJyksCiAgICAoMHgyRjhFQSwgJ00nLCB1J+anqicpLAogICAgKDB4MkY4RUIsICdNJywgdSfmqqgnKSwKICAgICgweDJGOEVDLCAnTScsIHUn8KOaoycpLAogICAgKDB4MkY4RUQsICdNJywgdSfmq5snKSwKICAgICgweDJGOEVFLCAnTScsIHUn47CYJyksCiAgICAoMHgyRjhFRiwgJ00nLCB1J+asoScpLAogICAgKDB4MkY4RjAsICdNJywgdSfwo6KnJyksCiAgICAoMHgyRjhGMSwgJ00nLCB1J+atlCcpLAogICAgKDB4MkY4RjIsICdNJywgdSfjsY4nKSwKICAgICgweDJGOEYzLCAnTScsIHUn5q2yJyksCiAgICAoMHgyRjhGNCwgJ00nLCB1J+aunycpLAogICAgKDB4MkY4RjUsICdNJywgdSfmrronKSwKICAgICgweDJGOEY2LCAnTScsIHUn5q67JyksCiAgICAoMHgyRjhGNywgJ00nLCB1J/Cjqo0nKSwKICAgICgweDJGOEY4LCAnTScsIHUn8KG0iycpLAogICAgKDB4MkY4RjksICdNJywgdSfwo6u6JyksCiAgICAoMHgyRjhGQSwgJ00nLCB1J+axjicpLAogICAgKDB4MkY4RkIsICdNJywgdSfwo7K8JyksCiAgICAoMHgyRjhGQywgJ00nLCB1J+ayvycpLAogICAgKDB4MkY4RkQsICdNJywgdSfms40nKSwKICAgICgweDJGOEZFLCAnTScsIHUn5rGnJyksCiAgICAoMHgyRjhGRiwgJ00nLCB1J+a0licpLAogICAgKDB4MkY5MDAsICdNJywgdSfmtL4nKSwKICAgICgweDJGOTAxLCAnTScsIHUn5rW3JyksCiAgICAoMHgyRjkwMiwgJ00nLCB1J+a1gScpLAogICAgKDB4MkY5MDMsICdNJywgdSfmtaknKSwKICAgICgweDJGOTA0LCAnTScsIHUn5rW4JyksCiAgICAoMHgyRjkwNSwgJ00nLCB1J+a2hScpLAogICAgKDB4MkY5MDYsICdNJywgdSfwo7SeJyksCiAgICAoMHgyRjkwNywgJ00nLCB1J+a0tCcpLAogICAgKDB4MkY5MDgsICdNJywgdSfmuK8nKSwKICAgICgweDJGOTA5LCAnTScsIHUn5rmuJyksCiAgICAoMHgyRjkwQSwgJ00nLCB1J+O0sycpLAogICAgKDB4MkY5MEIsICdNJywgdSfmu4snKSwKICAgICgweDJGOTBDLCAnTScsIHUn5ruHJyksCiAgICAoMHgyRjkwRCwgJ00nLCB1J/Cju5EnKSwKICAgICgweDJGOTBFLCAnTScsIHUn5re5JyksCiAgICAoMHgyRjkwRiwgJ00nLCB1J+a9ricpLAogICAgKDB4MkY5MTAsICdNJywgdSfwo72eJyksCiAgICAoMHgyRjkxMSwgJ00nLCB1J/Cjvo4nKSwKICAgICgweDJGOTEyLCAnTScsIHUn5r+GJyksCiAgICAoMHgyRjkxMywgJ00nLCB1J+eAuScpLAogICAgKDB4MkY5MTQsICdNJywgdSfngJ4nKSwKICAgICgweDJGOTE1LCAnTScsIHUn54CbJyksCiAgICAoMHgyRjkxNiwgJ00nLCB1J+O2licpLAogICAgKDB4MkY5MTcsICdNJywgdSfngYonKSwKICAgICgweDJGOTE4LCAnTScsIHUn54G9JyksCiAgICBdCgpkZWYgX3NlZ183MCgpOgogICAgcmV0dXJuIFsKICAgICgweDJGOTE5LCAnTScsIHUn54G3JyksCiAgICAoMHgyRjkxQSwgJ00nLCB1J+eCrScpLAogICAgKDB4MkY5MUIsICdNJywgdSfwoJSlJyksCiAgICAoMHgyRjkxQywgJ00nLCB1J+eFhScpLAogICAgKDB4MkY5MUQsICdNJywgdSfwpImjJyksCiAgICAoMHgyRjkxRSwgJ00nLCB1J+eGnCcpLAogICAgKDB4MkY5MUYsICdYJyksCiAgICAoMHgyRjkyMCwgJ00nLCB1J+eIqCcpLAogICAgKDB4MkY5MjEsICdNJywgdSfniLUnKSwKICAgICgweDJGOTIyLCAnTScsIHUn54mQJyksCiAgICAoMHgyRjkyMywgJ00nLCB1J/CkmIgnKSwKICAgICgweDJGOTI0LCAnTScsIHUn54qAJyksCiAgICAoMHgyRjkyNSwgJ00nLCB1J+eKlScpLAogICAgKDB4MkY5MjYsICdNJywgdSfwpJy1JyksCiAgICAoMHgyRjkyNywgJ00nLCB1J/CkoJQnKSwKICAgICgweDJGOTI4LCAnTScsIHUn5426JyksCiAgICAoMHgyRjkyOSwgJ00nLCB1J+eOiycpLAogICAgKDB4MkY5MkEsICdNJywgdSfjuqwnKSwKICAgICgweDJGOTJCLCAnTScsIHUn546lJyksCiAgICAoMHgyRjkyQywgJ00nLCB1J+O6uCcpLAogICAgKDB4MkY5MkUsICdNJywgdSfnkYcnKSwKICAgICgweDJGOTJGLCAnTScsIHUn55GcJyksCiAgICAoMHgyRjkzMCwgJ00nLCB1J+eRsScpLAogICAgKDB4MkY5MzEsICdNJywgdSfnkoUnKSwKICAgICgweDJGOTMyLCAnTScsIHUn55OKJyksCiAgICAoMHgyRjkzMywgJ00nLCB1J+O8mycpLAogICAgKDB4MkY5MzQsICdNJywgdSfnlKQnKSwKICAgICgweDJGOTM1LCAnTScsIHUn8KSwticpLAogICAgKDB4MkY5MzYsICdNJywgdSfnlL4nKSwKICAgICgweDJGOTM3LCAnTScsIHUn8KSykicpLAogICAgKDB4MkY5MzgsICdNJywgdSfnlbAnKSwKICAgICgweDJGOTM5LCAnTScsIHUn8KKGnycpLAogICAgKDB4MkY5M0EsICdNJywgdSfnmJAnKSwKICAgICgweDJGOTNCLCAnTScsIHUn8KS+oScpLAogICAgKDB4MkY5M0MsICdNJywgdSfwpL64JyksCiAgICAoMHgyRjkzRCwgJ00nLCB1J/ClgYQnKSwKICAgICgweDJGOTNFLCAnTScsIHUn47+8JyksCiAgICAoMHgyRjkzRiwgJ00nLCB1J+SAiCcpLAogICAgKDB4MkY5NDAsICdNJywgdSfnm7QnKSwKICAgICgweDJGOTQxLCAnTScsIHUn8KWDsycpLAogICAgKDB4MkY5NDIsICdNJywgdSfwpYOyJyksCiAgICAoMHgyRjk0MywgJ00nLCB1J/ClhJknKSwKICAgICgweDJGOTQ0LCAnTScsIHUn8KWEsycpLAogICAgKDB4MkY5NDUsICdNJywgdSfnnJ4nKSwKICAgICgweDJGOTQ2LCAnTScsIHUn55yfJyksCiAgICAoMHgyRjk0OCwgJ00nLCB1J+ediicpLAogICAgKDB4MkY5NDksICdNJywgdSfkgLknKSwKICAgICgweDJGOTRBLCAnTScsIHUn556LJyksCiAgICAoMHgyRjk0QiwgJ00nLCB1J+SBhicpLAogICAgKDB4MkY5NEMsICdNJywgdSfkgpYnKSwKICAgICgweDJGOTRELCAnTScsIHUn8KWQnScpLAogICAgKDB4MkY5NEUsICdNJywgdSfnoY4nKSwKICAgICgweDJGOTRGLCAnTScsIHUn56KMJyksCiAgICAoMHgyRjk1MCwgJ00nLCB1J+ejjCcpLAogICAgKDB4MkY5NTEsICdNJywgdSfkg6MnKSwKICAgICgweDJGOTUyLCAnTScsIHUn8KWYpicpLAogICAgKDB4MkY5NTMsICdNJywgdSfnpZYnKSwKICAgICgweDJGOTU0LCAnTScsIHUn8KWamicpLAogICAgKDB4MkY5NTUsICdNJywgdSfwpZuFJyksCiAgICAoMHgyRjk1NiwgJ00nLCB1J+emjycpLAogICAgKDB4MkY5NTcsICdNJywgdSfnp6snKSwKICAgICgweDJGOTU4LCAnTScsIHUn5ISvJyksCiAgICAoMHgyRjk1OSwgJ00nLCB1J+epgCcpLAogICAgKDB4MkY5NUEsICdNJywgdSfnqYonKSwKICAgICgweDJGOTVCLCAnTScsIHUn56mPJyksCiAgICAoMHgyRjk1QywgJ00nLCB1J/ClpbwnKSwKICAgICgweDJGOTVELCAnTScsIHUn8KWqpycpLAogICAgKDB4MkY5NUYsICdYJyksCiAgICAoMHgyRjk2MCwgJ00nLCB1J+SIgicpLAogICAgKDB4MkY5NjEsICdNJywgdSfwpa6rJyksCiAgICAoMHgyRjk2MiwgJ00nLCB1J+evhicpLAogICAgKDB4MkY5NjMsICdNJywgdSfnr4knKSwKICAgICgweDJGOTY0LCAnTScsIHUn5IinJyksCiAgICAoMHgyRjk2NSwgJ00nLCB1J/ClsoAnKSwKICAgICgweDJGOTY2LCAnTScsIHUn57OSJyksCiAgICAoMHgyRjk2NywgJ00nLCB1J+SKoCcpLAogICAgKDB4MkY5NjgsICdNJywgdSfns6gnKSwKICAgICgweDJGOTY5LCAnTScsIHUn57OjJyksCiAgICAoMHgyRjk2QSwgJ00nLCB1J+e0gCcpLAogICAgKDB4MkY5NkIsICdNJywgdSfwpb6GJyksCiAgICAoMHgyRjk2QywgJ00nLCB1J+e1oycpLAogICAgKDB4MkY5NkQsICdNJywgdSfkjIEnKSwKICAgICgweDJGOTZFLCAnTScsIHUn57eHJyksCiAgICAoMHgyRjk2RiwgJ00nLCB1J+e4gicpLAogICAgKDB4MkY5NzAsICdNJywgdSfnuYUnKSwKICAgICgweDJGOTcxLCAnTScsIHUn5Iy0JyksCiAgICAoMHgyRjk3MiwgJ00nLCB1J/CmiKgnKSwKICAgICgweDJGOTczLCAnTScsIHUn8KaJhycpLAogICAgKDB4MkY5NzQsICdNJywgdSfkjZknKSwKICAgICgweDJGOTc1LCAnTScsIHUn8KaLmScpLAogICAgKDB4MkY5NzYsICdNJywgdSfnvbonKSwKICAgICgweDJGOTc3LCAnTScsIHUn8KaMvicpLAogICAgKDB4MkY5NzgsICdNJywgdSfnvpUnKSwKICAgICgweDJGOTc5LCAnTScsIHUn57+6JyksCiAgICAoMHgyRjk3QSwgJ00nLCB1J+iAhScpLAogICAgKDB4MkY5N0IsICdNJywgdSfwppOaJyksCiAgICAoMHgyRjk3QywgJ00nLCB1J/CmlKMnKSwKICAgICgweDJGOTdELCAnTScsIHUn6IGgJyksCiAgICAoMHgyRjk3RSwgJ00nLCB1J/CmlqgnKSwKICAgICgweDJGOTdGLCAnTScsIHUn6IGwJyksCiAgICBdCgpkZWYgX3NlZ183MSgpOgogICAgcmV0dXJuIFsKICAgICgweDJGOTgwLCAnTScsIHUn8KONnycpLAogICAgKDB4MkY5ODEsICdNJywgdSfkj5UnKSwKICAgICgweDJGOTgyLCAnTScsIHUn6IKyJyksCiAgICAoMHgyRjk4MywgJ00nLCB1J+iEgycpLAogICAgKDB4MkY5ODQsICdNJywgdSfkkIsnKSwKICAgICgweDJGOTg1LCAnTScsIHUn6IS+JyksCiAgICAoMHgyRjk4NiwgJ00nLCB1J+WqtScpLAogICAgKDB4MkY5ODcsICdNJywgdSfwpp6nJyksCiAgICAoMHgyRjk4OCwgJ00nLCB1J/CmnrUnKSwKICAgICgweDJGOTg5LCAnTScsIHUn8KOOkycpLAogICAgKDB4MkY5OEEsICdNJywgdSfwo46cJyksCiAgICAoMHgyRjk4QiwgJ00nLCB1J+iIgScpLAogICAgKDB4MkY5OEMsICdNJywgdSfoiIQnKSwKICAgICgweDJGOThELCAnTScsIHUn6L6eJyksCiAgICAoMHgyRjk4RSwgJ00nLCB1J+SRqycpLAogICAgKDB4MkY5OEYsICdNJywgdSfoipEnKSwKICAgICgweDJGOTkwLCAnTScsIHUn6IqLJyksCiAgICAoMHgyRjk5MSwgJ00nLCB1J+iKnScpLAogICAgKDB4MkY5OTIsICdNJywgdSflirMnKSwKICAgICgweDJGOTkzLCAnTScsIHUn6IqxJyksCiAgICAoMHgyRjk5NCwgJ00nLCB1J+iKsycpLAogICAgKDB4MkY5OTUsICdNJywgdSfoir0nKSwKICAgICgweDJGOTk2LCAnTScsIHUn6IumJyksCiAgICAoMHgyRjk5NywgJ00nLCB1J/CmrLwnKSwKICAgICgweDJGOTk4LCAnTScsIHUn6IulJyksCiAgICAoMHgyRjk5OSwgJ00nLCB1J+iMnScpLAogICAgKDB4MkY5OUEsICdNJywgdSfojaMnKSwKICAgICgweDJGOTlCLCAnTScsIHUn6I6tJyksCiAgICAoMHgyRjk5QywgJ00nLCB1J+iMoycpLAogICAgKDB4MkY5OUQsICdNJywgdSfojr0nKSwKICAgICgweDJGOTlFLCAnTScsIHUn6I+nJyksCiAgICAoMHgyRjk5RiwgJ00nLCB1J+iRlycpLAogICAgKDB4MkY5QTAsICdNJywgdSfojZMnKSwKICAgICgweDJGOUExLCAnTScsIHUn6I+KJyksCiAgICAoMHgyRjlBMiwgJ00nLCB1J+iPjCcpLAogICAgKDB4MkY5QTMsICdNJywgdSfoj5wnKSwKICAgICgweDJGOUE0LCAnTScsIHUn8KawticpLAogICAgKDB4MkY5QTUsICdNJywgdSfwprWrJyksCiAgICAoMHgyRjlBNiwgJ00nLCB1J/Cms5UnKSwKICAgICgweDJGOUE3LCAnTScsIHUn5JSrJyksCiAgICAoMHgyRjlBOCwgJ00nLCB1J+iTsScpLAogICAgKDB4MkY5QTksICdNJywgdSfok7MnKSwKICAgICgweDJGOUFBLCAnTScsIHUn6JSWJyksCiAgICAoMHgyRjlBQiwgJ00nLCB1J/Cnj4onKSwKICAgICgweDJGOUFDLCAnTScsIHUn6JWkJyksCiAgICAoMHgyRjlBRCwgJ00nLCB1J/CmvKwnKSwKICAgICgweDJGOUFFLCAnTScsIHUn5JWdJyksCiAgICAoMHgyRjlBRiwgJ00nLCB1J+SVoScpLAogICAgKDB4MkY5QjAsICdNJywgdSfwpr6xJyksCiAgICAoMHgyRjlCMSwgJ00nLCB1J/Cng5InKSwKICAgICgweDJGOUIyLCAnTScsIHUn5JWrJyksCiAgICAoMHgyRjlCMywgJ00nLCB1J+iZkCcpLAogICAgKDB4MkY5QjQsICdNJywgdSfomZwnKSwKICAgICgweDJGOUI1LCAnTScsIHUn6JmnJyksCiAgICAoMHgyRjlCNiwgJ00nLCB1J+iZqScpLAogICAgKDB4MkY5QjcsICdNJywgdSfomqknKSwKICAgICgweDJGOUI4LCAnTScsIHUn6JqIJyksCiAgICAoMHgyRjlCOSwgJ00nLCB1J+icjicpLAogICAgKDB4MkY5QkEsICdNJywgdSfom6InKSwKICAgICgweDJGOUJCLCAnTScsIHUn6J25JyksCiAgICAoMHgyRjlCQywgJ00nLCB1J+icqCcpLAogICAgKDB4MkY5QkQsICdNJywgdSfonasnKSwKICAgICgweDJGOUJFLCAnTScsIHUn6J6GJyksCiAgICAoMHgyRjlCRiwgJ1gnKSwKICAgICgweDJGOUMwLCAnTScsIHUn6J+hJyksCiAgICAoMHgyRjlDMSwgJ00nLCB1J+iggScpLAogICAgKDB4MkY5QzIsICdNJywgdSfkl7knKSwKICAgICgweDJGOUMzLCAnTScsIHUn6KGgJyksCiAgICAoMHgyRjlDNCwgJ00nLCB1J+ihoycpLAogICAgKDB4MkY5QzUsICdNJywgdSfwp5mnJyksCiAgICAoMHgyRjlDNiwgJ00nLCB1J+ijlycpLAogICAgKDB4MkY5QzcsICdNJywgdSfoo54nKSwKICAgICgweDJGOUM4LCAnTScsIHUn5Ji1JyksCiAgICAoMHgyRjlDOSwgJ00nLCB1J+ijuicpLAogICAgKDB4MkY5Q0EsICdNJywgdSfjkrsnKSwKICAgICgweDJGOUNCLCAnTScsIHUn8KeiricpLAogICAgKDB4MkY5Q0MsICdNJywgdSfwp6WmJyksCiAgICAoMHgyRjlDRCwgJ00nLCB1J+SavicpLAogICAgKDB4MkY5Q0UsICdNJywgdSfkm4cnKSwKICAgICgweDJGOUNGLCAnTScsIHUn6KqgJyksCiAgICAoMHgyRjlEMCwgJ00nLCB1J+irrScpLAogICAgKDB4MkY5RDEsICdNJywgdSforoonKSwKICAgICgweDJGOUQyLCAnTScsIHUn6LGVJyksCiAgICAoMHgyRjlEMywgJ00nLCB1J/CnsqgnKSwKICAgICgweDJGOUQ0LCAnTScsIHUn6LKrJyksCiAgICAoMHgyRjlENSwgJ00nLCB1J+izgScpLAogICAgKDB4MkY5RDYsICdNJywgdSfotJsnKSwKICAgICgweDJGOUQ3LCAnTScsIHUn6LW3JyksCiAgICAoMHgyRjlEOCwgJ00nLCB1J/CnvK8nKSwKICAgICgweDJGOUQ5LCAnTScsIHUn8KCghCcpLAogICAgKDB4MkY5REEsICdNJywgdSfot4snKSwKICAgICgweDJGOURCLCAnTScsIHUn6La8JyksCiAgICAoMHgyRjlEQywgJ00nLCB1J+i3sCcpLAogICAgKDB4MkY5REQsICdNJywgdSfwoKOeJyksCiAgICAoMHgyRjlERSwgJ00nLCB1J+i7lCcpLAogICAgKDB4MkY5REYsICdNJywgdSfovLgnKSwKICAgICgweDJGOUUwLCAnTScsIHUn8KiXkicpLAogICAgKDB4MkY5RTEsICdNJywgdSfwqJetJyksCiAgICAoMHgyRjlFMiwgJ00nLCB1J+mClCcpLAogICAgKDB4MkY5RTMsICdNJywgdSfpg7EnKSwKICAgIF0KCmRlZiBfc2VnXzcyKCk6CiAgICByZXR1cm4gWwogICAgKDB4MkY5RTQsICdNJywgdSfphJEnKSwKICAgICgweDJGOUU1LCAnTScsIHUn8KicricpLAogICAgKDB4MkY5RTYsICdNJywgdSfphJsnKSwKICAgICgweDJGOUU3LCAnTScsIHUn6Yi4JyksCiAgICAoMHgyRjlFOCwgJ00nLCB1J+mLlycpLAogICAgKDB4MkY5RTksICdNJywgdSfpi5gnKSwKICAgICgweDJGOUVBLCAnTScsIHUn6Ym8JyksCiAgICAoMHgyRjlFQiwgJ00nLCB1J+mPuScpLAogICAgKDB4MkY5RUMsICdNJywgdSfpkJUnKSwKICAgICgweDJGOUVELCAnTScsIHUn8KivuicpLAogICAgKDB4MkY5RUUsICdNJywgdSfplosnKSwKICAgICgweDJGOUVGLCAnTScsIHUn5KaVJyksCiAgICAoMHgyRjlGMCwgJ00nLCB1J+mWtycpLAogICAgKDB4MkY5RjEsICdNJywgdSfwqLW3JyksCiAgICAoMHgyRjlGMiwgJ00nLCB1J+SnpicpLAogICAgKDB4MkY5RjMsICdNJywgdSfpm4MnKSwKICAgICgweDJGOUY0LCAnTScsIHUn5bayJyksCiAgICAoMHgyRjlGNSwgJ00nLCB1J+mcoycpLAogICAgKDB4MkY5RjYsICdNJywgdSfwqYWFJyksCiAgICAoMHgyRjlGNywgJ00nLCB1J/CpiJonKSwKICAgICgweDJGOUY4LCAnTScsIHUn5KmuJyksCiAgICAoMHgyRjlGOSwgJ00nLCB1J+SpticpLAogICAgKDB4MkY5RkEsICdNJywgdSfpn6AnKSwKICAgICgweDJGOUZCLCAnTScsIHUn8KmQiicpLAogICAgKDB4MkY5RkMsICdNJywgdSfkqrInKSwKICAgICgweDJGOUZELCAnTScsIHUn8KmSlicpLAogICAgKDB4MkY5RkUsICdNJywgdSfpoIsnKSwKICAgICgweDJGQTAwLCAnTScsIHUn6aCpJyksCiAgICAoMHgyRkEwMSwgJ00nLCB1J/CplrYnKSwKICAgICgweDJGQTAyLCAnTScsIHUn6aOiJyksCiAgICAoMHgyRkEwMywgJ00nLCB1J+SssycpLAogICAgKDB4MkZBMDQsICdNJywgdSfppKknKSwKICAgICgweDJGQTA1LCAnTScsIHUn6aanJyksCiAgICAoMHgyRkEwNiwgJ00nLCB1J+mngicpLAogICAgKDB4MkZBMDcsICdNJywgdSfpp74nKSwKICAgICgweDJGQTA4LCAnTScsIHUn5K+OJyksCiAgICAoMHgyRkEwOSwgJ00nLCB1J/CprLAnKSwKICAgICgweDJGQTBBLCAnTScsIHUn6aySJyksCiAgICAoMHgyRkEwQiwgJ00nLCB1J+mxgCcpLAogICAgKDB4MkZBMEMsICdNJywgdSfps70nKSwKICAgICgweDJGQTBELCAnTScsIHUn5LOOJyksCiAgICAoMHgyRkEwRSwgJ00nLCB1J+SzrScpLAogICAgKDB4MkZBMEYsICdNJywgdSfptacnKSwKICAgICgweDJGQTEwLCAnTScsIHUn8KqDjicpLAogICAgKDB4MkZBMTEsICdNJywgdSfks7gnKSwKICAgICgweDJGQTEyLCAnTScsIHUn8KqEhScpLAogICAgKDB4MkZBMTMsICdNJywgdSfwqoiOJyksCiAgICAoMHgyRkExNCwgJ00nLCB1J/CqipEnKSwKICAgICgweDJGQTE1LCAnTScsIHUn6bq7JyksCiAgICAoMHgyRkExNiwgJ00nLCB1J+S1licpLAogICAgKDB4MkZBMTcsICdNJywgdSfpu7knKSwKICAgICgweDJGQTE4LCAnTScsIHUn6bu+JyksCiAgICAoMHgyRkExOSwgJ00nLCB1J+m8hScpLAogICAgKDB4MkZBMUEsICdNJywgdSfpvI8nKSwKICAgICgweDJGQTFCLCAnTScsIHUn6byWJyksCiAgICAoMHgyRkExQywgJ00nLCB1J+m8uycpLAogICAgKDB4MkZBMUQsICdNJywgdSfwqpiAJyksCiAgICAoMHgyRkExRSwgJ1gnKSwKICAgICgweEUwMTAwLCAnSScpLAogICAgKDB4RTAxRjAsICdYJyksCiAgICBdCgp1dHM0NmRhdGEgPSB0dXBsZSgKICAgIF9zZWdfMCgpCiAgICArIF9zZWdfMSgpCiAgICArIF9zZWdfMigpCiAgICArIF9zZWdfMygpCiAgICArIF9zZWdfNCgpCiAgICArIF9zZWdfNSgpCiAgICArIF9zZWdfNigpCiAgICArIF9zZWdfNygpCiAgICArIF9zZWdfOCgpCiAgICArIF9zZWdfOSgpCiAgICArIF9zZWdfMTAoKQogICAgKyBfc2VnXzExKCkKICAgICsgX3NlZ18xMigpCiAgICArIF9zZWdfMTMoKQogICAgKyBfc2VnXzE0KCkKICAgICsgX3NlZ18xNSgpCiAgICArIF9zZWdfMTYoKQogICAgKyBfc2VnXzE3KCkKICAgICsgX3NlZ18xOCgpCiAgICArIF9zZWdfMTkoKQogICAgKyBfc2VnXzIwKCkKICAgICsgX3NlZ18yMSgpCiAgICArIF9zZWdfMjIoKQogICAgKyBfc2VnXzIzKCkKICAgICsgX3NlZ18yNCgpCiAgICArIF9zZWdfMjUoKQogICAgKyBfc2VnXzI2KCkKICAgICsgX3NlZ18yNygpCiAgICArIF9zZWdfMjgoKQogICAgKyBfc2VnXzI5KCkKICAgICsgX3NlZ18zMCgpCiAgICArIF9zZWdfMzEoKQogICAgKyBfc2VnXzMyKCkKICAgICsgX3NlZ18zMygpCiAgICArIF9zZWdfMzQoKQogICAgKyBfc2VnXzM1KCkKICAgICsgX3NlZ18zNigpCiAgICArIF9zZWdfMzcoKQogICAgKyBfc2VnXzM4KCkKICAgICsgX3NlZ18zOSgpCiAgICArIF9zZWdfNDAoKQogICAgKyBfc2VnXzQxKCkKICAgICsgX3NlZ180MigpCiAgICArIF9zZWdfNDMoKQogICAgKyBfc2VnXzQ0KCkKICAgICsgX3NlZ180NSgpCiAgICArIF9zZWdfNDYoKQogICAgKyBfc2VnXzQ3KCkKICAgICsgX3NlZ180OCgpCiAgICArIF9zZWdfNDkoKQogICAgKyBfc2VnXzUwKCkKICAgICsgX3NlZ181MSgpCiAgICArIF9zZWdfNTIoKQogICAgKyBfc2VnXzUzKCkKICAgICsgX3NlZ181NCgpCiAgICArIF9zZWdfNTUoKQogICAgKyBfc2VnXzU2KCkKICAgICsgX3NlZ181NygpCiAgICArIF9zZWdfNTgoKQogICAgKyBfc2VnXzU5KCkKICAgICsgX3NlZ182MCgpCiAgICArIF9zZWdfNjEoKQogICAgKyBfc2VnXzYyKCkKICAgICsgX3NlZ182MygpCiAgICArIF9zZWdfNjQoKQogICAgKyBfc2VnXzY1KCkKICAgICsgX3NlZ182NigpCiAgICArIF9zZWdfNjcoKQogICAgKyBfc2VnXzY4KCkKICAgICsgX3NlZ182OSgpCiAgICArIF9zZWdfNzAoKQogICAgKyBfc2VnXzcxKCkKICAgICsgX3NlZ183MigpCikKUEsDBBQAAAAAAAAAIQDdxKYFMDkBADA5AQA1AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9pcGFkZHJlc3MucHkjIENvcHlyaWdodCAyMDA3IEdvb2dsZSBJbmMuCiMgIExpY2Vuc2VkIHRvIFBTRiB1bmRlciBhIENvbnRyaWJ1dG9yIEFncmVlbWVudC4KCiIiIkEgZmFzdCwgbGlnaHR3ZWlnaHQgSVB2NC9JUHY2IG1hbmlwdWxhdGlvbiBsaWJyYXJ5IGluIFB5dGhvbi4KClRoaXMgbGlicmFyeSBpcyB1c2VkIHRvIGNyZWF0ZS9wb2tlL21hbmlwdWxhdGUgSVB2NCBhbmQgSVB2NiBhZGRyZXNzZXMKYW5kIG5ldHdvcmtzLgoKIiIiCgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHVuaWNvZGVfbGl0ZXJhbHMKCgppbXBvcnQgaXRlcnRvb2xzCmltcG9ydCBzdHJ1Y3QKCl9fdmVyc2lvbl9fID0gJzEuMC4xNycKCiMgQ29tcGF0aWJpbGl0eSBmdW5jdGlvbnMKX2NvbXBhdF9pbnRfdHlwZXMgPSAoaW50LCkKdHJ5OgogICAgX2NvbXBhdF9pbnRfdHlwZXMgPSAoaW50LCBsb25nKQpleGNlcHQgTmFtZUVycm9yOgogICAgcGFzcwp0cnk6CiAgICBfY29tcGF0X3N0ciA9IHVuaWNvZGUKZXhjZXB0IE5hbWVFcnJvcjoKICAgIF9jb21wYXRfc3RyID0gc3RyCiAgICBhc3NlcnQgYnl0ZXMgIT0gc3RyCmlmIGInXDAnWzBdID09IDA6ICAjIFB5dGhvbiAzIHNlbWFudGljcwogICAgZGVmIF9jb21wYXRfYnl0ZXNfdG9fYnl0ZV92YWxzKGJ5dCk6CiAgICAgICAgcmV0dXJuIGJ5dAplbHNlOgogICAgZGVmIF9jb21wYXRfYnl0ZXNfdG9fYnl0ZV92YWxzKGJ5dCk6CiAgICAgICAgcmV0dXJuIFtzdHJ1Y3QudW5wYWNrKGInIUInLCBiKVswXSBmb3IgYiBpbiBieXRdCnRyeToKICAgIF9jb21wYXRfaW50X2Zyb21fYnl0ZV92YWxzID0gaW50LmZyb21fYnl0ZXMKZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgZGVmIF9jb21wYXRfaW50X2Zyb21fYnl0ZV92YWxzKGJ5dHZhbHMsIGVuZGlhbmVzcyk6CiAgICAgICAgYXNzZXJ0IGVuZGlhbmVzcyA9PSAnYmlnJwogICAgICAgIHJlcyA9IDAKICAgICAgICBmb3IgYnYgaW4gYnl0dmFsczoKICAgICAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoYnYsIF9jb21wYXRfaW50X3R5cGVzKQogICAgICAgICAgICByZXMgPSAocmVzIDw8IDgpICsgYnYKICAgICAgICByZXR1cm4gcmVzCgoKZGVmIF9jb21wYXRfdG9fYnl0ZXMoaW50dmFsLCBsZW5ndGgsIGVuZGlhbmVzcyk6CiAgICBhc3NlcnQgaXNpbnN0YW5jZShpbnR2YWwsIF9jb21wYXRfaW50X3R5cGVzKQogICAgYXNzZXJ0IGVuZGlhbmVzcyA9PSAnYmlnJwogICAgaWYgbGVuZ3RoID09IDQ6CiAgICAgICAgaWYgaW50dmFsIDwgMCBvciBpbnR2YWwgPj0gMiAqKiAzMjoKICAgICAgICAgICAgcmFpc2Ugc3RydWN0LmVycm9yKCJpbnRlZ2VyIG91dCBvZiByYW5nZSBmb3IgJ0knIGZvcm1hdCBjb2RlIikKICAgICAgICByZXR1cm4gc3RydWN0LnBhY2soYichSScsIGludHZhbCkKICAgIGVsaWYgbGVuZ3RoID09IDE2OgogICAgICAgIGlmIGludHZhbCA8IDAgb3IgaW50dmFsID49IDIgKiogMTI4OgogICAgICAgICAgICByYWlzZSBzdHJ1Y3QuZXJyb3IoImludGVnZXIgb3V0IG9mIHJhbmdlIGZvciAnUVEnIGZvcm1hdCBjb2RlIikKICAgICAgICByZXR1cm4gc3RydWN0LnBhY2soYichUVEnLCBpbnR2YWwgPj4gNjQsIGludHZhbCAmIDB4ZmZmZmZmZmZmZmZmZmZmZikKICAgIGVsc2U6CiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigpCmlmIGhhc2F0dHIoaW50LCAnYml0X2xlbmd0aCcpOgogICAgIyBOb3QgaW50LmJpdF9sZW5ndGggLCBzaW5jZSB0aGF0IHdvbid0IHdvcmsgaW4gMi43IHdoZXJlIGxvbmcgZXhpc3RzCiAgICBkZWYgX2NvbXBhdF9iaXRfbGVuZ3RoKGkpOgogICAgICAgIHJldHVybiBpLmJpdF9sZW5ndGgoKQplbHNlOgogICAgZGVmIF9jb21wYXRfYml0X2xlbmd0aChpKToKICAgICAgICBmb3IgcmVzIGluIGl0ZXJ0b29scy5jb3VudCgpOgogICAgICAgICAgICBpZiBpID4+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+IDE6CiAgICAgICAgICAgICAgICBhcmcgPSBhZGRyZXNzWzFdCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBhcmcgPSBzZWxmLl9tYXhfcHJlZml4bGVuCiAgICAgICAgICAgIHNlbGYubmV0bWFzaywgc2VsZi5fcHJlZml4bGVuID0gc2VsZi5fbWFrZV9uZXRtYXNrKGFyZykKICAgICAgICAgICAgc2VsZi5uZXR3b3JrX2FkZHJlc3MgPSBJUHY2QWRkcmVzcyhhZGRyZXNzWzBdKQogICAgICAgICAgICBwYWNrZWQgPSBpbnQoc2VsZi5uZXR3b3JrX2FkZHJlc3MpCiAgICAgICAgICAgIGlmIHBhY2tlZCAmIGludChzZWxmLm5ldG1hc2spICE9IHBhY2tlZDoKICAgICAgICAgICAgICAgIGlmIHN0cmljdDoKICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCclcyBoYXMgaG9zdCBiaXRzIHNldCcgJSBzZWxmKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBzZWxmLm5ldHdvcmtfYWRkcmVzcyA9IElQdjZBZGRyZXNzKHBhY2tlZCAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQoc2VsZi5uZXRtYXNrKSkKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICMgQXNzdW1lIGlucHV0IGFyZ3VtZW50IHRvIGJlIHN0cmluZyBvciBhbnkgb2JqZWN0IHJlcHJlc2VudGF0aW9uCiAgICAgICAgIyB3aGljaCBjb252ZXJ0cyBpbnRvIGEgZm9ybWF0dGVkIElQIHByZWZpeCBzdHJpbmcuCiAgICAgICAgYWRkciA9IF9zcGxpdF9vcHRpb25hbF9uZXRtYXNrKGFkZHJlc3MpCgogICAgICAgIHNlbGYubmV0d29ya19hZGRyZXNzID0gSVB2NkFkZHJlc3Moc2VsZi5faXBfaW50X2Zyb21fc3RyaW5nKGFkZHJbMF0pKQoKICAgICAgICBpZiBsZW4oYWRkcikgPT0gMjoKICAgICAgICAgICAgYXJnID0gYWRkclsxXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGFyZyA9IHNlbGYuX21heF9wcmVmaXhsZW4KICAgICAgICBzZWxmLm5ldG1hc2ssIHNlbGYuX3ByZWZpeGxlbiA9IHNlbGYuX21ha2VfbmV0bWFzayhhcmcpCgogICAgICAgIGlmIHN0cmljdDoKICAgICAgICAgICAgaWYgKElQdjZBZGRyZXNzKGludChzZWxmLm5ldHdvcmtfYWRkcmVzcykgJiBpbnQoc2VsZi5uZXRtYXNrKSkgIT0KICAgICAgICAgICAgICAgICAgICBzZWxmLm5ldHdvcmtfYWRkcmVzcyk6CiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCclcyBoYXMgaG9zdCBiaXRzIHNldCcgJSBzZWxmKQogICAgICAgIHNlbGYubmV0d29ya19hZGRyZXNzID0gSVB2NkFkZHJlc3MoaW50KHNlbGYubmV0d29ya19hZGRyZXNzKSAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQoc2VsZi5uZXRtYXNrKSkKCiAgICAgICAgaWYgc2VsZi5fcHJlZml4bGVuID09IChzZWxmLl9tYXhfcHJlZml4bGVuIC0gMSk6CiAgICAgICAgICAgIHNlbGYuaG9zdHMgPSBzZWxmLl9faXRlcl9fCgogICAgZGVmIGhvc3RzKHNlbGYpOgogICAgICAgICIiIkdlbmVyYXRlIEl0ZXJhdG9yIG92ZXIgdXNhYmxlIGhvc3RzIGluIGEgbmV0d29yay4KCiAgICAgICAgICBUaGlzIGlzIGxpa2UgX19pdGVyX18gZXhjZXB0IGl0IGRvZXNuJ3QgcmV0dXJuIHRoZQogICAgICAgICAgU3VibmV0LVJvdXRlciBhbnljYXN0IGFkZHJlc3MuCgogICAgICAgICIiIgogICAgICAgIG5ldHdvcmsgPSBpbnQoc2VsZi5uZXR3b3JrX2FkZHJlc3MpCiAgICAgICAgYnJvYWRjYXN0ID0gaW50KHNlbGYuYnJvYWRjYXN0X2FkZHJlc3MpCiAgICAgICAgZm9yIHggaW4gX2NvbXBhdF9yYW5nZShuZXR3b3JrICsgMSwgYnJvYWRjYXN0ICsgMSk6CiAgICAgICAgICAgIHlpZWxkIHNlbGYuX2FkZHJlc3NfY2xhc3MoeCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc19zaXRlX2xvY2FsKHNlbGYpOgogICAgICAgICIiIlRlc3QgaWYgdGhlIGFkZHJlc3MgaXMgcmVzZXJ2ZWQgZm9yIHNpdGUtbG9jYWwuCgogICAgICAgIE5vdGUgdGhhdCB0aGUgc2l0ZS1sb2NhbCBhZGRyZXNzIHNwYWNlIGhhcyBiZWVuIGRlcHJlY2F0ZWQgYnkgUkZDIDM4NzkuCiAgICAgICAgVXNlIGlzX3ByaXZhdGUgdG8gdGVzdCBpZiB0aGlzIGFkZHJlc3MgaXMgaW4gdGhlIHNwYWNlIG9mIHVuaXF1ZSBsb2NhbAogICAgICAgIGFkZHJlc3NlcyBhcyBkZWZpbmVkIGJ5IFJGQyA0MTkzLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBBIGJvb2xlYW4sIFRydWUgaWYgdGhlIGFkZHJlc3MgaXMgcmVzZXJ2ZWQgcGVyIFJGQyAzNTEzIDIuNS42LgoKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gKHNlbGYubmV0d29ya19hZGRyZXNzLmlzX3NpdGVfbG9jYWwgYW5kCiAgICAgICAgICAgICAgICBzZWxmLmJyb2FkY2FzdF9hZGRyZXNzLmlzX3NpdGVfbG9jYWwpCgoKY2xhc3MgX0lQdjZDb25zdGFudHMob2JqZWN0KToKCiAgICBfbGlua2xvY2FsX25ldHdvcmsgPSBJUHY2TmV0d29yaygnZmU4MDo6LzEwJykKCiAgICBfbXVsdGljYXN0X25ldHdvcmsgPSBJUHY2TmV0d29yaygnZmYwMDo6LzgnKQoKICAgIF9wcml2YXRlX25ldHdvcmtzID0gWwogICAgICAgIElQdjZOZXR3b3JrKCc6OjEvMTI4JyksCiAgICAgICAgSVB2Nk5ldHdvcmsoJzo6LzEyOCcpLAogICAgICAgIElQdjZOZXR3b3JrKCc6OmZmZmY6MDowLzk2JyksCiAgICAgICAgSVB2Nk5ldHdvcmsoJzEwMDo6LzY0JyksCiAgICAgICAgSVB2Nk5ldHdvcmsoJzIwMDE6Oi8yMycpLAogICAgICAgIElQdjZOZXR3b3JrKCcyMDAxOjI6Oi80OCcpLAogICAgICAgIElQdjZOZXR3b3JrKCcyMDAxOmRiODo6LzMyJyksCiAgICAgICAgSVB2Nk5ldHdvcmsoJzIwMDE6MTA6Oi8yOCcpLAogICAgICAgIElQdjZOZXR3b3JrKCdmYzAwOjovNycpLAogICAgICAgIElQdjZOZXR3b3JrKCdmZTgwOjovMTAnKSwKICAgIF0KCiAgICBfcmVzZXJ2ZWRfbmV0d29ya3MgPSBbCiAgICAgICAgSVB2Nk5ldHdvcmsoJzo6LzgnKSwgSVB2Nk5ldHdvcmsoJzEwMDo6LzgnKSwKICAgICAgICBJUHY2TmV0d29yaygnMjAwOjovNycpLCBJUHY2TmV0d29yaygnNDAwOjovNicpLAogICAgICAgIElQdjZOZXR3b3JrKCc4MDA6Oi81JyksIElQdjZOZXR3b3JrKCcxMDAwOjovNCcpLAogICAgICAgIElQdjZOZXR3b3JrKCc0MDAwOjovMycpLCBJUHY2TmV0d29yaygnNjAwMDo6LzMnKSwKICAgICAgICBJUHY2TmV0d29yaygnODAwMDo6LzMnKSwgSVB2Nk5ldHdvcmsoJ0EwMDA6Oi8zJyksCiAgICAgICAgSVB2Nk5ldHdvcmsoJ0MwMDA6Oi8zJyksIElQdjZOZXR3b3JrKCdFMDAwOjovNCcpLAogICAgICAgIElQdjZOZXR3b3JrKCdGMDAwOjovNScpLCBJUHY2TmV0d29yaygnRjgwMDo6LzYnKSwKICAgICAgICBJUHY2TmV0d29yaygnRkUwMDo6LzknKSwKICAgIF0KCiAgICBfc2l0ZWxvY2FsX25ldHdvcmsgPSBJUHY2TmV0d29yaygnZmVjMDo6LzEwJykKCgpJUHY2QWRkcmVzcy5fY29uc3RhbnRzID0gX0lQdjZDb25zdGFudHMKUEsDBBQAAAAAAAAAIQDzmSOAmyQAAJskAAA9AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9sb2NrZmlsZS9fX2luaXRfXy5weSMgLSotIGNvZGluZzogdXRmLTggLSotCgoiIiIKbG9ja2ZpbGUucHkgLSBQbGF0Zm9ybS1pbmRlcGVuZGVudCBhZHZpc29yeSBmaWxlIGxvY2tzLgoKUmVxdWlyZXMgUHl0aG9uIDIuNSB1bmxlc3MgeW91IGFwcGx5IDIuNC5kaWZmCkxvY2tpbmcgaXMgZG9uZSBvbiBhIHBlci10aHJlYWQgYmFzaXMgaW5zdGVhZCBvZiBhIHBlci1wcm9jZXNzIGJhc2lzLgoKVXNhZ2U6Cgo+Pj4gbG9jayA9IExvY2tGaWxlKCdzb21lZmlsZScpCj4+PiB0cnk6Ci4uLiAgICAgbG9jay5hY3F1aXJlKCkKLi4uIGV4Y2VwdCBBbHJlYWR5TG9ja2VkOgouLi4gICAgIHByaW50ICdzb21lZmlsZScsICdpcyBsb2NrZWQgYWxyZWFkeS4nCi4uLiBleGNlcHQgTG9ja0ZhaWxlZDoKLi4uICAgICBwcmludCAnc29tZWZpbGUnLCAnY2FuXFwndCBiZSBsb2NrZWQuJwouLi4gZWxzZToKLi4uICAgICBwcmludCAnZ290IGxvY2snCmdvdCBsb2NrCj4+PiBwcmludCBsb2NrLmlzX2xvY2tlZCgpClRydWUKPj4+IGxvY2sucmVsZWFzZSgpCgo+Pj4gbG9jayA9IExvY2tGaWxlKCdzb21lZmlsZScpCj4+PiBwcmludCBsb2NrLmlzX2xvY2tlZCgpCkZhbHNlCj4+PiB3aXRoIGxvY2s6Ci4uLiAgICBwcmludCBsb2NrLmlzX2xvY2tlZCgpClRydWUKPj4+IHByaW50IGxvY2suaXNfbG9ja2VkKCkKRmFsc2UKCj4+PiBsb2NrID0gTG9ja0ZpbGUoJ3NvbWVmaWxlJykKPj4+ICMgSXQgaXMgb2theSB0byBsb2NrIHR3aWNlIGZyb20gdGhlIHNhbWUgdGhyZWFkLi4uCj4+PiB3aXRoIGxvY2s6Ci4uLiAgICAgbG9jay5hY3F1aXJlKCkKLi4uCj4+PiAjIFRob3VnaCBubyBjb3VudGVyIGlzIGtlcHQsIHNvIHlvdSBjYW4ndCB1bmxvY2sgbXVsdGlwbGUgdGltZXMuLi4KPj4+IHByaW50IGxvY2suaXNfbG9ja2VkKCkKRmFsc2UKCkV4Y2VwdGlvbnM6CgogICAgRXJyb3IgLSBiYXNlIGNsYXNzIGZvciBvdGhlciBleGNlcHRpb25zCiAgICAgICAgTG9ja0Vycm9yIC0gYmFzZSBjbGFzcyBmb3IgYWxsIGxvY2tpbmcgZXhjZXB0aW9ucwogICAgICAgICAgICBBbHJlYWR5TG9ja2VkIC0gQW5vdGhlciB0aHJlYWQgb3IgcHJvY2VzcyBhbHJlYWR5IGhvbGRzIHRoZSBsb2NrCiAgICAgICAgICAgIExvY2tGYWlsZWQgLSBMb2NrIGZhaWxlZCBmb3Igc29tZSBvdGhlciByZWFzb24KICAgICAgICBVbmxvY2tFcnJvciAtIGJhc2UgY2xhc3MgZm9yIGFsbCB1bmxvY2tpbmcgZXhjZXB0aW9ucwogICAgICAgICAgICBBbHJlYWR5VW5sb2NrZWQgLSBGaWxlIHdhcyBub3QgbG9ja2VkLgogICAgICAgICAgICBOb3RNeUxvY2sgLSBGaWxlIHdhcyBsb2NrZWQgYnV0IG5vdCBieSB0aGUgY3VycmVudCB0aHJlYWQvcHJvY2VzcwoiIiIKCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgZnVuY3Rvb2xzCmltcG9ydCBvcwppbXBvcnQgc29ja2V0CmltcG9ydCB0aHJlYWRpbmcKaW1wb3J0IHdhcm5pbmdzCgojIFdvcmsgd2l0aCBQRVA4IGFuZCBub24tUEVQOCB2ZXJzaW9ucyBvZiB0aHJlYWRpbmcgbW9kdWxlLgppZiBub3QgaGFzYXR0cih0aHJlYWRpbmcsICJjdXJyZW50X3RocmVhZCIpOgogICAgdGhyZWFkaW5nLmN1cnJlbnRfdGhyZWFkID0gdGhyZWFkaW5nLmN1cnJlbnRUaHJlYWQKaWYgbm90IGhhc2F0dHIodGhyZWFkaW5nLlRocmVhZCwgImdldF9uYW1lIik6CiAgICB0aHJlYWRpbmcuVGhyZWFkLmdldF9uYW1lID0gdGhyZWFkaW5nLlRocmVhZC5nZXROYW1lCgpfX2FsbF9fID0gWydFcnJvcicsICdMb2NrRXJyb3InLCAnTG9ja1RpbWVvdXQnLCAnQWxyZWFkeUxvY2tlZCcsCiAgICAgICAgICAgJ0xvY2tGYWlsZWQnLCAnVW5sb2NrRXJyb3InLCAnTm90TG9ja2VkJywgJ05vdE15TG9jaycsCiAgICAgICAgICAgJ0xpbmtGaWxlTG9jaycsICdNa2RpckZpbGVMb2NrJywgJ1NRTGl0ZUZpbGVMb2NrJywKICAgICAgICAgICAnTG9ja0Jhc2UnLCAnbG9ja2VkJ10KCgpjbGFzcyBFcnJvcihFeGNlcHRpb24pOgogICAgIiIiCiAgICBCYXNlIGNsYXNzIGZvciBvdGhlciBleGNlcHRpb25zLgoKICAgID4+PiB0cnk6CiAgICAuLi4gICByYWlzZSBFcnJvcgogICAgLi4uIGV4Y2VwdCBFeGNlcHRpb246CiAgICAuLi4gICBwYXNzCiAgICAiIiIKICAgIHBhc3MKCgpjbGFzcyBMb2NrRXJyb3IoRXJyb3IpOgogICAgIiIiCiAgICBCYXNlIGNsYXNzIGZvciBlcnJvciBhcmlzaW5nIGZyb20gYXR0ZW1wdHMgdG8gYWNxdWlyZSB0aGUgbG9jay4KCiAgICA+Pj4gdHJ5OgogICAgLi4uICAgcmFpc2UgTG9ja0Vycm9yCiAgICAuLi4gZXhjZXB0IEVycm9yOgogICAgLi4uICAgcGFzcwogICAgIiIiCiAgICBwYXNzCgoKY2xhc3MgTG9ja1RpbWVvdXQoTG9ja0Vycm9yKToKICAgICIiIlJhaXNlZCB3aGVuIGxvY2sgY3JlYXRpb24gZmFpbHMgd2l0aGluIGEgdXNlci1kZWZpbmVkIHBlcmlvZCBvZiB0aW1lLgoKICAgID4+PiB0cnk6CiAgICAuLi4gICByYWlzZSBMb2NrVGltZW91dAogICAgLi4uIGV4Y2VwdCBMb2NrRXJyb3I6CiAgICAuLi4gICBwYXNzCiAgICAiIiIKICAgIHBhc3MKCgpjbGFzcyBBbHJlYWR5TG9ja2VkKExvY2tFcnJvcik6CiAgICAiIiJTb21lIG90aGVyIHRocmVhZC9wcm9jZXNzIGlzIGxvY2tpbmcgdGhlIGZpbGUuCgogICAgPj4+IHRyeToKICAgIC4uLiAgIHJhaXNlIEFscmVhZHlMb2NrZWQKICAgIC4uLiBleGNlcHQgTG9ja0Vycm9yOgogICAgLi4uICAgcGFzcwogICAgIiIiCiAgICBwYXNzCgoKY2xhc3MgTG9ja0ZhaWxlZChMb2NrRXJyb3IpOgogICAgIiIiTG9jayBmaWxlIGNyZWF0aW9uIGZhaWxlZCBmb3Igc29tZSBvdGhlciByZWFzb24uCgogICAgPj4+IHRyeToKICAgIC4uLiAgIHJhaXNlIExvY2tGYWlsZWQKICAgIC4uLiBleGNlcHQgTG9ja0Vycm9yOgogICAgLi4uICAgcGFzcwogICAgIiIiCiAgICBwYXNzCgoKY2xhc3MgVW5sb2NrRXJyb3IoRXJyb3IpOgogICAgIiIiCiAgICBCYXNlIGNsYXNzIGZvciBlcnJvcnMgYXJpc2luZyBmcm9tIGF0dGVtcHRzIHRvIHJlbGVhc2UgdGhlIGxvY2suCgogICAgPj4+IHRyeToKICAgIC4uLiAgIHJhaXNlIFVubG9ja0Vycm9yCiAgICAuLi4gZXhjZXB0IEVycm9yOgogICAgLi4uICAgcGFzcwogICAgIiIiCiAgICBwYXNzCgoKY2xhc3MgTm90TG9ja2VkKFVubG9ja0Vycm9yKToKICAgICIiIlJhaXNlZCB3aGVuIGFuIGF0dGVtcHQgaXMgbWFkZSB0byB1bmxvY2sgYW4gdW5sb2NrZWQgZmlsZS4KCiAgICA+Pj4gdHJ5OgogICAgLi4uICAgcmFpc2UgTm90TG9ja2VkCiAgICAuLi4gZXhjZXB0IFVubG9ja0Vycm9yOgogICAgLi4uICAgcGFzcwogICAgIiIiCiAgICBwYXNzCgoKY2xhc3MgTm90TXlMb2NrKFVubG9ja0Vycm9yKToKICAgICIiIlJhaXNlZCB3aGVuIGFuIGF0dGVtcHQgaXMgbWFkZSB0byB1bmxvY2sgYSBmaWxlIHNvbWVvbmUgZWxzZSBsb2NrZWQuCgogICAgPj4+IHRyeToKICAgIC4uLiAgIHJhaXNlIE5vdE15TG9jawogICAgLi4uIGV4Y2VwdCBVbmxvY2tFcnJvcjoKICAgIC4uLiAgIHBhc3MKICAgICIiIgogICAgcGFzcwoKCmNsYXNzIF9TaGFyZWRCYXNlKG9iamVjdCk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgcGF0aCk6CiAgICAgICAgc2VsZi5wYXRoID0gcGF0aAoKICAgIGRlZiBhY3F1aXJlKHNlbGYsIHRpbWVvdXQ9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgQWNxdWlyZSB0aGUgbG9jay4KCiAgICAgICAgKiBJZiB0aW1lb3V0IGlzIG9taXR0ZWQgKG9yIE5vbmUpLCB3YWl0IGZvcmV2ZXIgdHJ5aW5nIHRvIGxvY2sgdGhlCiAgICAgICAgICBmaWxlLgoKICAgICAgICAqIElmIHRpbWVvdXQgPiAwLCB0cnkgdG8gYWNxdWlyZSB0aGUgbG9jayBmb3IgdGhhdCBtYW55IHNlY29uZHMuICBJZgogICAgICAgICAgdGhlIGxvY2sgcGVyaW9kIGV4cGlyZXMgYW5kIHRoZSBmaWxlIGlzIHN0aWxsIGxvY2tlZCwgcmFpc2UKICAgICAgICAgIExvY2tUaW1lb3V0LgoKICAgICAgICAqIElmIHRpbWVvdXQgPD0gMCwgcmFpc2UgQWxyZWFkeUxvY2tlZCBpbW1lZGlhdGVseSBpZiB0aGUgZmlsZSBpcwogICAgICAgICAgYWxyZWFkeSBsb2NrZWQuCiAgICAgICAgIiIiCiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWQoImltcGxlbWVudCBpbiBzdWJjbGFzcyIpCgogICAgZGVmIHJlbGVhc2Uoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmVsZWFzZSB0aGUgbG9jay4KCiAgICAgICAgSWYgdGhlIGZpbGUgaXMgbm90IGxvY2tlZCwgcmFpc2UgTm90TG9ja2VkLgogICAgICAgICIiIgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkKCJpbXBsZW1lbnQgaW4gc3ViY2xhc3MiKQoKICAgIGRlZiBfX2VudGVyX18oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgQ29udGV4dCBtYW5hZ2VyIHN1cHBvcnQuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5hY3F1aXJlKCkKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBfX2V4aXRfXyhzZWxmLCAqX2V4Yyk6CiAgICAgICAgIiIiCiAgICAgICAgQ29udGV4dCBtYW5hZ2VyIHN1cHBvcnQuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5yZWxlYXNlKCkKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICI8JXM6ICVyPiIgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHNlbGYucGF0aCkKCgpjbGFzcyBMb2NrQmFzZShfU2hhcmVkQmFzZSk6CiAgICAiIiJCYXNlIGNsYXNzIGZvciBwbGF0Zm9ybS1zcGVjaWZpYyBsb2NrIGNsYXNzZXMuIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgcGF0aCwgdGhyZWFkZWQ9VHJ1ZSwgdGltZW91dD1Ob25lKToKICAgICAgICAiIiIKICAgICAgICA+Pj4gbG9jayA9IExvY2tCYXNlKCdzb21lZmlsZScpCiAgICAgICAgPj4+IGxvY2sgPSBMb2NrQmFzZSgnc29tZWZpbGUnLCB0aHJlYWRlZD1GYWxzZSkKICAgICAgICAiIiIKICAgICAgICBzdXBlcihMb2NrQmFzZSwgc2VsZikuX19pbml0X18ocGF0aCkKICAgICAgICBzZWxmLmxvY2tfZmlsZSA9IG9zLnBhdGguYWJzcGF0aChwYXRoKSArICIubG9jayIKICAgICAgICBzZWxmLmhvc3RuYW1lID0gc29ja2V0LmdldGhvc3RuYW1lKCkKICAgICAgICBzZWxmLnBpZCA9IG9zLmdldHBpZCgpCiAgICAgICAgaWYgdGhyZWFkZWQ6CiAgICAgICAgICAgIHQgPSB0aHJlYWRpbmcuY3VycmVudF90aHJlYWQoKQogICAgICAgICAgICAjIFRocmVhZCBvYmplY3RzIGluIFB5dGhvbiAyLjQgYW5kIGVhcmxpZXIgZG8gbm90IGhhdmUgaWRlbnQKICAgICAgICAgICAgIyBhdHRycy4gIFdvcm0gYXJvdW5kIHRoYXQuCiAgICAgICAgICAgIGlkZW50ID0gZ2V0YXR0cih0LCAiaWRlbnQiLCBoYXNoKHQpKQogICAgICAgICAgICBzZWxmLnRuYW1lID0gIi0leCIgJSAoaWRlbnQgJiAweGZmZmZmZmZmKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYudG5hbWUgPSAiIgogICAgICAgIGRpcm5hbWUgPSBvcy5wYXRoLmRpcm5hbWUoc2VsZi5sb2NrX2ZpbGUpCgogICAgICAgICMgdW5pcXVlIG5hbWUgaXMgbW9zdGx5IGFib3V0IHRoZSBjdXJyZW50IHByb2Nlc3MsIGJ1dCBtdXN0CiAgICAgICAgIyBhbHNvIGNvbnRhaW4gdGhlIHBhdGggLS0gb3RoZXJ3aXNlLCB0d28gYWRqYWNlbnQgbG9ja2VkCiAgICAgICAgIyBmaWxlcyBjb25mbGljdCAob25lIGZpbGUgZ2V0cyBsb2NrZWQsIGNyZWF0aW5nIGxvY2stZmlsZSBhbmQKICAgICAgICAjIHVuaXF1ZSBmaWxlLCB0aGUgb3RoZXIgb25lIGdldHMgbG9ja2VkLCBjcmVhdGluZyBsb2NrLWZpbGUKICAgICAgICAjIGFuZCBvdmVyd3JpdGluZyB0aGUgYWxyZWFkeSBleGlzdGluZyBsb2NrLWZpbGUsIHRoZW4gb25lCiAgICAgICAgIyBnZXRzIHVubG9ja2VkLCBkZWxldGluZyBib3RoIGxvY2stZmlsZSBhbmQgdW5pcXVlIGZpbGUsCiAgICAgICAgIyBmaW5hbGx5IHRoZSBsYXN0IGxvY2sgZXJyb3JzIG91dCB1cG9uIHJlbGVhc2luZy4KICAgICAgICBzZWxmLnVuaXF1ZV9uYW1lID0gb3MucGF0aC5qb2luKGRpcm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMlcy4lcyVzIiAlIChzZWxmLmhvc3RuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50bmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaChzZWxmLnBhdGgpKSkKICAgICAgICBzZWxmLnRpbWVvdXQgPSB0aW1lb3V0CgogICAgZGVmIGlzX2xvY2tlZChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZWxsIHdoZXRoZXIgb3Igbm90IHRoZSBmaWxlIGlzIGxvY2tlZC4KICAgICAgICAiIiIKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZCgiaW1wbGVtZW50IGluIHN1YmNsYXNzIikKCiAgICBkZWYgaV9hbV9sb2NraW5nKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBUcnVlIGlmIHRoaXMgb2JqZWN0IGlzIGxvY2tpbmcgdGhlIGZpbGUuCiAgICAgICAgIiIiCiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWQoImltcGxlbWVudCBpbiBzdWJjbGFzcyIpCgogICAgZGVmIGJyZWFrX2xvY2soc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmVtb3ZlIGEgbG9jay4gIFVzZWZ1bCBpZiBhIGxvY2tpbmcgdGhyZWFkIGZhaWxlZCB0byB1bmxvY2suCiAgICAgICAgIiIiCiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWQoImltcGxlbWVudCBpbiBzdWJjbGFzcyIpCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiPCVzOiAlciAtLSAlcj4iICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzZWxmLnVuaXF1ZV9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGF0aCkKCgpkZWYgX2ZsX2hlbHBlcihjbHMsIG1vZCwgKmFyZ3MsICoqa3dkcyk6CiAgICB3YXJuaW5ncy53YXJuKCJJbXBvcnQgZnJvbSAlcyBtb2R1bGUgaW5zdGVhZCBvZiBsb2NrZmlsZSBwYWNrYWdlIiAlIG1vZCwKICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTIpCiAgICAjIFRoaXMgaXMgYSBiaXQgZnVua3ksIGJ1dCBpdCdzIG9ubHkgZm9yIGF3aGlsZS4gIFRoZSB3YXkgdGhlIHVuaXQgdGVzdHMKICAgICMgYXJlIGNvbnN0cnVjdGVkIHRoaXMgZnVuY3Rpb24gd2luZHMgdXAgYXMgYW4gdW5ib3VuZCBtZXRob2QsIHNvIGl0CiAgICAjIGFjdHVhbGx5IHRha2VzIHRocmVlIGFyZ3MsIG5vdCB0d28uICBXZSB3YW50IHRvIHRvc3Mgb3V0IHNlbGYuCiAgICBpZiBub3QgaXNpbnN0YW5jZShhcmdzWzBdLCBzdHIpOgogICAgICAgICMgV2UgYXJlIHRlc3RpbmcsIGF2b2lkIHRoZSBmaXJzdCBhcmcKICAgICAgICBhcmdzID0gYXJnc1sxOl0KICAgIGlmIGxlbihhcmdzKSA9PSAxIGFuZCBub3Qga3dkczoKICAgICAgICBrd2RzWyJ0aHJlYWRlZCJdID0gVHJ1ZQogICAgcmV0dXJuIGNscygqYXJncywgKiprd2RzKQoKCmRlZiBMaW5rRmlsZUxvY2soKmFyZ3MsICoqa3dkcyk6CiAgICAiIiJGYWN0b3J5IGZ1bmN0aW9uIHByb3ZpZGVkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KCiAgICBEbyBub3QgdXNlIGluIG5ldyBjb2RlLiAgSW5zdGVhZCwgaW1wb3J0IExpbmtMb2NrRmlsZSBmcm9tIHRoZQogICAgbG9ja2ZpbGUubGlua2xvY2tmaWxlIG1vZHVsZS4KICAgICIiIgogICAgZnJvbSAuIGltcG9ydCBsaW5rbG9ja2ZpbGUKICAgIHJldHVybiBfZmxfaGVscGVyKGxpbmtsb2NrZmlsZS5MaW5rTG9ja0ZpbGUsICJsb2NrZmlsZS5saW5rbG9ja2ZpbGUiLAogICAgICAgICAgICAgICAgICAgICAgKmFyZ3MsICoqa3dkcykKCgpkZWYgTWtkaXJGaWxlTG9jaygqYXJncywgKiprd2RzKToKICAgICIiIkZhY3RvcnkgZnVuY3Rpb24gcHJvdmlkZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgoKICAgIERvIG5vdCB1c2UgaW4gbmV3IGNvZGUuICBJbnN0ZWFkLCBpbXBvcnQgTWtkaXJMb2NrRmlsZSBmcm9tIHRoZQogICAgbG9ja2ZpbGUubWtkaXJsb2NrZmlsZSBtb2R1bGUuCiAgICAiIiIKICAgIGZyb20gLiBpbXBvcnQgbWtkaXJsb2NrZmlsZQogICAgcmV0dXJuIF9mbF9oZWxwZXIobWtkaXJsb2NrZmlsZS5Na2RpckxvY2tGaWxlLCAibG9ja2ZpbGUubWtkaXJsb2NrZmlsZSIsCiAgICAgICAgICAgICAgICAgICAgICAqYXJncywgKiprd2RzKQoKCmRlZiBTUUxpdGVGaWxlTG9jaygqYXJncywgKiprd2RzKToKICAgICIiIkZhY3RvcnkgZnVuY3Rpb24gcHJvdmlkZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgoKICAgIERvIG5vdCB1c2UgaW4gbmV3IGNvZGUuICBJbnN0ZWFkLCBpbXBvcnQgU1FMaXRlTG9ja0ZpbGUgZnJvbSB0aGUKICAgIGxvY2tmaWxlLm1rZGlybG9ja2ZpbGUgbW9kdWxlLgogICAgIiIiCiAgICBmcm9tIC4gaW1wb3J0IHNxbGl0ZWxvY2tmaWxlCiAgICByZXR1cm4gX2ZsX2hlbHBlcihzcWxpdGVsb2NrZmlsZS5TUUxpdGVMb2NrRmlsZSwgImxvY2tmaWxlLnNxbGl0ZWxvY2tmaWxlIiwKICAgICAgICAgICAgICAgICAgICAgICphcmdzLCAqKmt3ZHMpCgoKZGVmIGxvY2tlZChwYXRoLCB0aW1lb3V0PU5vbmUpOgogICAgIiIiRGVjb3JhdG9yIHdoaWNoIGVuYWJsZXMgbG9ja3MgZm9yIGRlY29yYXRlZCBmdW5jdGlvbi4KCiAgICBBcmd1bWVudHM6CiAgICAgLSBwYXRoOiBwYXRoIGZvciBsb2NrZmlsZS4KICAgICAtIHRpbWVvdXQgKG9wdGlvbmFsKTogVGltZW91dCBmb3IgYWNxdWlyaW5nIGxvY2suCgogICAgIFVzYWdlOgogICAgICAgICBAbG9ja2VkKCcvdmFyL3J1bi9teW5hbWUnLCB0aW1lb3V0PTApCiAgICAgICAgIGRlZiBteW5hbWUoLi4uKToKICAgICAgICAgICAgIC4uLgogICAgIiIiCiAgICBkZWYgZGVjb3IoZnVuYyk6CiAgICAgICAgQGZ1bmN0b29scy53cmFwcyhmdW5jKQogICAgICAgIGRlZiB3cmFwcGVyKCphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgICAgIGxvY2sgPSBGaWxlTG9jayhwYXRoLCB0aW1lb3V0PXRpbWVvdXQpCiAgICAgICAgICAgIGxvY2suYWNxdWlyZSgpCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHJldHVybiBmdW5jKCphcmdzLCAqKmt3YXJncykKICAgICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgICAgIGxvY2sucmVsZWFzZSgpCiAgICAgICAgcmV0dXJuIHdyYXBwZXIKICAgIHJldHVybiBkZWNvcgoKCmlmIGhhc2F0dHIob3MsICJsaW5rIik6CiAgICBmcm9tIC4gaW1wb3J0IGxpbmtsb2NrZmlsZSBhcyBfbGxmCiAgICBMb2NrRmlsZSA9IF9sbGYuTGlua0xvY2tGaWxlCmVsc2U6CiAgICBmcm9tIC4gaW1wb3J0IG1rZGlybG9ja2ZpbGUgYXMgX21sZgogICAgTG9ja0ZpbGUgPSBfbWxmLk1rZGlyTG9ja0ZpbGUKCkZpbGVMb2NrID0gTG9ja0ZpbGUKUEsDBBQAAAAAAAAAIQAr3vInXAoAAFwKAABBAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9sb2NrZmlsZS9saW5rbG9ja2ZpbGUucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IHRpbWUKaW1wb3J0IG9zCgpmcm9tIC4gaW1wb3J0IChMb2NrQmFzZSwgTG9ja0ZhaWxlZCwgTm90TG9ja2VkLCBOb3RNeUxvY2ssIExvY2tUaW1lb3V0LAogICAgICAgICAgICAgICBBbHJlYWR5TG9ja2VkKQoKCmNsYXNzIExpbmtMb2NrRmlsZShMb2NrQmFzZSk6CiAgICAiIiJMb2NrIGFjY2VzcyB0byBhIGZpbGUgdXNpbmcgYXRvbWljIHByb3BlcnR5IG9mIGxpbmsoMikuCgogICAgPj4+IGxvY2sgPSBMaW5rTG9ja0ZpbGUoJ3NvbWVmaWxlJykKICAgID4+PiBsb2NrID0gTGlua0xvY2tGaWxlKCdzb21lZmlsZScsIHRocmVhZGVkPUZhbHNlKQogICAgIiIiCgogICAgZGVmIGFjcXVpcmUoc2VsZiwgdGltZW91dD1Ob25lKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIG9wZW4oc2VsZi51bmlxdWVfbmFtZSwgIndiIikuY2xvc2UoKQogICAgICAgIGV4Y2VwdCBJT0Vycm9yOgogICAgICAgICAgICByYWlzZSBMb2NrRmFpbGVkKCJmYWlsZWQgdG8gY3JlYXRlICVzIiAlIHNlbGYudW5pcXVlX25hbWUpCgogICAgICAgIHRpbWVvdXQgPSB0aW1lb3V0IGlmIHRpbWVvdXQgaXMgbm90IE5vbmUgZWxzZSBzZWxmLnRpbWVvdXQKICAgICAgICBlbmRfdGltZSA9IHRpbWUudGltZSgpCiAgICAgICAgaWYgdGltZW91dCBpcyBub3QgTm9uZSBhbmQgdGltZW91dCA+IDA6CiAgICAgICAgICAgIGVuZF90aW1lICs9IHRpbWVvdXQKCiAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgIyBUcnkgYW5kIGNyZWF0ZSBhIGhhcmQgbGluayB0byBpdC4KICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgb3MubGluayhzZWxmLnVuaXF1ZV9uYW1lLCBzZWxmLmxvY2tfZmlsZSkKICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6CiAgICAgICAgICAgICAgICAjIExpbmsgY3JlYXRpb24gZmFpbGVkLiAgTWF5YmUgd2UndmUgZG91YmxlLWxvY2tlZD8KICAgICAgICAgICAgICAgIG5saW5rcyA9IG9zLnN0YXQoc2VsZi51bmlxdWVfbmFtZSkuc3RfbmxpbmsKICAgICAgICAgICAgICAgIGlmIG5saW5rcyA9PSAyOgogICAgICAgICAgICAgICAgICAgICMgVGhlIG9yaWdpbmFsIGxpbmsgcGx1cyB0aGUgb25lIEkgY3JlYXRlZCA9PSAyLiAgV2UncmUKICAgICAgICAgICAgICAgICAgICAjIGdvb2QgdG8gZ28uCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICMgT3RoZXJ3aXNlIHRoZSBsb2NrIGNyZWF0aW9uIGZhaWxlZC4KICAgICAgICAgICAgICAgICAgICBpZiB0aW1lb3V0IGlzIG5vdCBOb25lIGFuZCB0aW1lLnRpbWUoKSA+IGVuZF90aW1lOgogICAgICAgICAgICAgICAgICAgICAgICBvcy51bmxpbmsoc2VsZi51bmlxdWVfbmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGltZW91dCA+IDA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBMb2NrVGltZW91dCgiVGltZW91dCB3YWl0aW5nIHRvIGFjcXVpcmUiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGxvY2sgZm9yICVzIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhdGgpCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBBbHJlYWR5TG9ja2VkKCIlcyBpcyBhbHJlYWR5IGxvY2tlZCIgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhdGgpCiAgICAgICAgICAgICAgICAgICAgdGltZS5zbGVlcCh0aW1lb3V0IGlzIG5vdCBOb25lIGFuZCB0aW1lb3V0IC8gMTAgb3IgMC4xKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBMaW5rIGNyZWF0aW9uIHN1Y2NlZWRlZC4gIFdlJ3JlIGdvb2QgdG8gZ28uCiAgICAgICAgICAgICAgICByZXR1cm4KCiAgICBkZWYgcmVsZWFzZShzZWxmKToKICAgICAgICBpZiBub3Qgc2VsZi5pc19sb2NrZWQoKToKICAgICAgICAgICAgcmFpc2UgTm90TG9ja2VkKCIlcyBpcyBub3QgbG9ja2VkIiAlIHNlbGYucGF0aCkKICAgICAgICBlbGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzZWxmLnVuaXF1ZV9uYW1lKToKICAgICAgICAgICAgcmFpc2UgTm90TXlMb2NrKCIlcyBpcyBsb2NrZWQsIGJ1dCBub3QgYnkgbWUiICUgc2VsZi5wYXRoKQogICAgICAgIG9zLnVubGluayhzZWxmLnVuaXF1ZV9uYW1lKQogICAgICAgIG9zLnVubGluayhzZWxmLmxvY2tfZmlsZSkKCiAgICBkZWYgaXNfbG9ja2VkKHNlbGYpOgogICAgICAgIHJldHVybiBvcy5wYXRoLmV4aXN0cyhzZWxmLmxvY2tfZmlsZSkKCiAgICBkZWYgaV9hbV9sb2NraW5nKHNlbGYpOgogICAgICAgIHJldHVybiAoc2VsZi5pc19sb2NrZWQoKSBhbmQKICAgICAgICAgICAgICAgIG9zLnBhdGguZXhpc3RzKHNlbGYudW5pcXVlX25hbWUpIGFuZAogICAgICAgICAgICAgICAgb3Muc3RhdChzZWxmLnVuaXF1ZV9uYW1lKS5zdF9ubGluayA9PSAyKQoKICAgIGRlZiBicmVha19sb2NrKHNlbGYpOgogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHNlbGYubG9ja19maWxlKToKICAgICAgICAgICAgb3MudW5saW5rKHNlbGYubG9ja19maWxlKQpQSwMEFAAAAAAAAAAhACEmvH4YDAAAGAwAAEIAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2xvY2tmaWxlL21rZGlybG9ja2ZpbGUucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24KCmltcG9ydCB0aW1lCmltcG9ydCBvcwppbXBvcnQgc3lzCmltcG9ydCBlcnJubwoKZnJvbSAuIGltcG9ydCAoTG9ja0Jhc2UsIExvY2tGYWlsZWQsIE5vdExvY2tlZCwgTm90TXlMb2NrLCBMb2NrVGltZW91dCwKICAgICAgICAgICAgICAgQWxyZWFkeUxvY2tlZCkKCgpjbGFzcyBNa2RpckxvY2tGaWxlKExvY2tCYXNlKToKICAgICIiIkxvY2sgZmlsZSBieSBjcmVhdGluZyBhIGRpcmVjdG9yeS4iIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXRoLCB0aHJlYWRlZD1UcnVlLCB0aW1lb3V0PU5vbmUpOgogICAgICAgICIiIgogICAgICAgID4+PiBsb2NrID0gTWtkaXJMb2NrRmlsZSgnc29tZWZpbGUnKQogICAgICAgID4+PiBsb2NrID0gTWtkaXJMb2NrRmlsZSgnc29tZWZpbGUnLCB0aHJlYWRlZD1GYWxzZSkKICAgICAgICAiIiIKICAgICAgICBMb2NrQmFzZS5fX2luaXRfXyhzZWxmLCBwYXRoLCB0aHJlYWRlZCwgdGltZW91dCkKICAgICAgICAjIExvY2sgZmlsZSBpdHNlbGYgaXMgYSBkaXJlY3RvcnkuICBQbGFjZSB0aGUgdW5pcXVlIGZpbGUgbmFtZSBpbnRvCiAgICAgICAgIyBpdC4KICAgICAgICBzZWxmLnVuaXF1ZV9uYW1lID0gb3MucGF0aC5qb2luKHNlbGYubG9ja19maWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzLiVzJXMiICUgKHNlbGYuaG9zdG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50bmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBpZCkpCgogICAgZGVmIGFjcXVpcmUoc2VsZiwgdGltZW91dD1Ob25lKToKICAgICAgICB0aW1lb3V0ID0gdGltZW91dCBpZiB0aW1lb3V0IGlzIG5vdCBOb25lIGVsc2Ugc2VsZi50aW1lb3V0CiAgICAgICAgZW5kX3RpbWUgPSB0aW1lLnRpbWUoKQogICAgICAgIGlmIHRpbWVvdXQgaXMgbm90IE5vbmUgYW5kIHRpbWVvdXQgPiAwOgogICAgICAgICAgICBlbmRfdGltZSArPSB0aW1lb3V0CgogICAgICAgIGlmIHRpbWVvdXQgaXMgTm9uZToKICAgICAgICAgICAgd2FpdCA9IDAuMQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHdhaXQgPSBtYXgoMCwgdGltZW91dCAvIDEwKQoKICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBvcy5ta2RpcihzZWxmLmxvY2tfZmlsZSkKICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6CiAgICAgICAgICAgICAgICBlcnIgPSBzeXMuZXhjX2luZm8oKVsxXQogICAgICAgICAgICAgICAgaWYgZXJyLmVycm5vID09IGVycm5vLkVFWElTVDoKICAgICAgICAgICAgICAgICAgICAjIEFscmVhZHkgbG9ja2VkLgogICAgICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHNlbGYudW5pcXVlX25hbWUpOgogICAgICAgICAgICAgICAgICAgICAgICAjIEFscmVhZHkgbG9ja2VkIGJ5IG1lLgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgICAgICAgICBpZiB0aW1lb3V0IGlzIG5vdCBOb25lIGFuZCB0aW1lLnRpbWUoKSA+IGVuZF90aW1lOgogICAgICAgICAgICAgICAgICAgICAgICBpZiB0aW1lb3V0ID4gMDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIExvY2tUaW1lb3V0KCJUaW1lb3V0IHdhaXRpbmcgdG8gYWNxdWlyZSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgbG9jayBmb3IgJXMiICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGF0aCkKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgU29tZW9uZSBlbHNlIGhhcyB0aGUgbG9jay4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIEFscmVhZHlMb2NrZWQoIiVzIGlzIGFscmVhZHkgbG9ja2VkIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGF0aCkKICAgICAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKHdhaXQpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICMgQ291bGRuJ3QgY3JlYXRlIHRoZSBsb2NrIGZvciBzb21lIG90aGVyIHJlYXNvbgogICAgICAgICAgICAgICAgICAgIHJhaXNlIExvY2tGYWlsZWQoImZhaWxlZCB0byBjcmVhdGUgJXMiICUgc2VsZi5sb2NrX2ZpbGUpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBvcGVuKHNlbGYudW5pcXVlX25hbWUsICJ3YiIpLmNsb3NlKCkKICAgICAgICAgICAgICAgIHJldHVybgoKICAgIGRlZiByZWxlYXNlKHNlbGYpOgogICAgICAgIGlmIG5vdCBzZWxmLmlzX2xvY2tlZCgpOgogICAgICAgICAgICByYWlzZSBOb3RMb2NrZWQoIiVzIGlzIG5vdCBsb2NrZWQiICUgc2VsZi5wYXRoKQogICAgICAgIGVsaWYgbm90IG9zLnBhdGguZXhpc3RzKHNlbGYudW5pcXVlX25hbWUpOgogICAgICAgICAgICByYWlzZSBOb3RNeUxvY2soIiVzIGlzIGxvY2tlZCwgYnV0IG5vdCBieSBtZSIgJSBzZWxmLnBhdGgpCiAgICAgICAgb3MudW5saW5rKHNlbGYudW5pcXVlX25hbWUpCiAgICAgICAgb3Mucm1kaXIoc2VsZi5sb2NrX2ZpbGUpCgogICAgZGVmIGlzX2xvY2tlZChzZWxmKToKICAgICAgICByZXR1cm4gb3MucGF0aC5leGlzdHMoc2VsZi5sb2NrX2ZpbGUpCgogICAgZGVmIGlfYW1fbG9ja2luZyhzZWxmKToKICAgICAgICByZXR1cm4gKHNlbGYuaXNfbG9ja2VkKCkgYW5kCiAgICAgICAgICAgICAgICBvcy5wYXRoLmV4aXN0cyhzZWxmLnVuaXF1ZV9uYW1lKSkKCiAgICBkZWYgYnJlYWtfbG9jayhzZWxmKToKICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhzZWxmLmxvY2tfZmlsZSk6CiAgICAgICAgICAgIGZvciBuYW1lIGluIG9zLmxpc3RkaXIoc2VsZi5sb2NrX2ZpbGUpOgogICAgICAgICAgICAgICAgb3MudW5saW5rKG9zLnBhdGguam9pbihzZWxmLmxvY2tfZmlsZSwgbmFtZSkpCiAgICAgICAgICAgIG9zLnJtZGlyKHNlbGYubG9ja19maWxlKQpQSwMEFAAAAAAAAAAhACA8ci3KFwAAyhcAAEAAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2xvY2tmaWxlL3BpZGxvY2tmaWxlLnB5IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KCiMgcGlkbG9ja2ZpbGUucHkKIwojIENvcHlyaWdodCDCqSAyMDA44oCTMjAwOSBCZW4gRmlubmV5IDxiZW4rcHl0aG9uQGJlbmZpbm5leS5pZC5hdT4KIwojIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTogeW91IG1heSBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgd29yawojIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24gTGljZW5zZSwgdmVyc2lvbiAyIG9yCiMgbGF0ZXIgYXMgcHVibGlzaGVkIGJ5IHRoZSBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbi4KIyBObyB3YXJyYW50eSBleHByZXNzZWQgb3IgaW1wbGllZC4gU2VlIHRoZSBmaWxlIExJQ0VOU0UuUFNGLTIgZm9yIGRldGFpbHMuCgoiIiIgTG9ja2ZpbGUgYmVoYXZpb3VyIGltcGxlbWVudGVkIHZpYSBVbml4IFBJRCBmaWxlcy4KICAgICIiIgoKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBlcnJubwppbXBvcnQgb3MKaW1wb3J0IHRpbWUKCmZyb20gLiBpbXBvcnQgKExvY2tCYXNlLCBBbHJlYWR5TG9ja2VkLCBMb2NrRmFpbGVkLCBOb3RMb2NrZWQsIE5vdE15TG9jaywKICAgICAgICAgICAgICAgTG9ja1RpbWVvdXQpCgoMCmNsYXNzIFBJRExvY2tGaWxlKExvY2tCYXNlKToKICAgICIiIiBMb2NrZmlsZSBpbXBsZW1lbnRlZCBhcyBhIFVuaXggUElEIGZpbGUuCgogICAgVGhlIGxvY2sgZmlsZSBpcyBhIG5vcm1hbCBmaWxlIG5hbWVkIGJ5IHRoZSBhdHRyaWJ1dGUgYHBhdGhgLgogICAgQSBsb2NrJ3MgUElEIGZpbGUgY29udGFpbnMgYSBzaW5nbGUgbGluZSBvZiB0ZXh0LCBjb250YWluaW5nCiAgICB0aGUgcHJvY2VzcyBJRCAoUElEKSBvZiB0aGUgcHJvY2VzcyB0aGF0IGFjcXVpcmVkIHRoZSBsb2NrLgoKICAgID4+PiBsb2NrID0gUElETG9ja0ZpbGUoJ3NvbWVmaWxlJykKICAgID4+PiBsb2NrID0gUElETG9ja0ZpbGUoJ3NvbWVmaWxlJykKICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXRoLCB0aHJlYWRlZD1GYWxzZSwgdGltZW91dD1Ob25lKToKICAgICAgICAjIHBpZCBsb2NrZmlsZXMgZG9uJ3Qgc3VwcG9ydCB0aHJlYWRlZCBvcGVyYXRpb24sIHNvIGFsd2F5cyBmb3JjZQogICAgICAgICMgRmFsc2UgYXMgdGhlIHRocmVhZGVkIGFyZy4KICAgICAgICBMb2NrQmFzZS5fX2luaXRfXyhzZWxmLCBwYXRoLCBGYWxzZSwgdGltZW91dCkKICAgICAgICBzZWxmLnVuaXF1ZV9uYW1lID0gc2VsZi5wYXRoCgogICAgZGVmIHJlYWRfcGlkKHNlbGYpOgogICAgICAgICIiIiBHZXQgdGhlIFBJRCBmcm9tIHRoZSBsb2NrIGZpbGUuCiAgICAgICAgICAgICIiIgogICAgICAgIHJldHVybiByZWFkX3BpZF9mcm9tX3BpZGZpbGUoc2VsZi5wYXRoKQoKICAgIGRlZiBpc19sb2NrZWQoc2VsZik6CiAgICAgICAgIiIiIFRlc3QgaWYgdGhlIGxvY2sgaXMgY3VycmVudGx5IGhlbGQuCgogICAgICAgICAgICBUaGUgbG9jayBpcyBoZWxkIGlmIHRoZSBQSUQgZmlsZSBmb3IgdGhpcyBsb2NrIGV4aXN0cy4KCiAgICAgICAgICAgICIiIgogICAgICAgIHJldHVybiBvcy5wYXRoLmV4aXN0cyhzZWxmLnBhdGgpCgogICAgZGVmIGlfYW1fbG9ja2luZyhzZWxmKToKICAgICAgICAiIiIgVGVzdCBpZiB0aGUgbG9jayBpcyBoZWxkIGJ5IHRoZSBjdXJyZW50IHByb2Nlc3MuCgogICAgICAgIFJldHVybnMgYGBUcnVlYGAgaWYgdGhlIGN1cnJlbnQgcHJvY2VzcyBJRCBtYXRjaGVzIHRoZQogICAgICAgIG51bWJlciBzdG9yZWQgaW4gdGhlIFBJRCBmaWxlLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmLmlzX2xvY2tlZCgpIGFuZCBvcy5nZXRwaWQoKSA9PSBzZWxmLnJlYWRfcGlkKCkKCiAgICBkZWYgYWNxdWlyZShzZWxmLCB0aW1lb3V0PU5vbmUpOgogICAgICAgICIiIiBBY3F1aXJlIHRoZSBsb2NrLgoKICAgICAgICBDcmVhdGVzIHRoZSBQSUQgZmlsZSBmb3IgdGhpcyBsb2NrLCBvciByYWlzZXMgYW4gZXJyb3IgaWYKICAgICAgICB0aGUgbG9jayBjb3VsZCBub3QgYmUgYWNxdWlyZWQuCiAgICAgICAgIiIiCgogICAgICAgIHRpbWVvdXQgPSB0aW1lb3V0IGlmIHRpbWVvdXQgaXMgbm90IE5vbmUgZWxzZSBzZWxmLnRpbWVvdXQKICAgICAgICBlbmRfdGltZSA9IHRpbWUudGltZSgpCiAgICAgICAgaWYgdGltZW91dCBpcyBub3QgTm9uZSBhbmQgdGltZW91dCA+IDA6CiAgICAgICAgICAgIGVuZF90aW1lICs9IHRpbWVvdXQKCiAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgd3JpdGVfcGlkX3RvX3BpZGZpbGUoc2VsZi5wYXRoKQogICAgICAgICAgICBleGNlcHQgT1NFcnJvciBhcyBleGM6CiAgICAgICAgICAgICAgICBpZiBleGMuZXJybm8gPT0gZXJybm8uRUVYSVNUOgogICAgICAgICAgICAgICAgICAgICMgVGhlIGxvY2sgY3JlYXRpb24gZmFpbGVkLiAgTWF5YmUgc2xlZXAgYSBiaXQuCiAgICAgICAgICAgICAgICAgICAgaWYgdGltZS50aW1lKCkgPiBlbmRfdGltZToKICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGltZW91dCBpcyBub3QgTm9uZSBhbmQgdGltZW91dCA+IDA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBMb2NrVGltZW91dCgiVGltZW91dCB3YWl0aW5nIHRvIGFjcXVpcmUiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGxvY2sgZm9yICVzIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhdGgpCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBBbHJlYWR5TG9ja2VkKCIlcyBpcyBhbHJlYWR5IGxvY2tlZCIgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhdGgpCiAgICAgICAgICAgICAgICAgICAgdGltZS5zbGVlcCh0aW1lb3V0IGlzIG5vdCBOb25lIGFuZCB0aW1lb3V0IC8gMTAgb3IgMC4xKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICByYWlzZSBMb2NrRmFpbGVkKCJmYWlsZWQgdG8gY3JlYXRlICVzIiAlIHNlbGYucGF0aCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJldHVybgoKICAgIGRlZiByZWxlYXNlKHNlbGYpOgogICAgICAgICIiIiBSZWxlYXNlIHRoZSBsb2NrLgoKICAgICAgICAgICAgUmVtb3ZlcyB0aGUgUElEIGZpbGUgdG8gcmVsZWFzZSB0aGUgbG9jaywgb3IgcmFpc2VzIGFuCiAgICAgICAgICAgIGVycm9yIGlmIHRoZSBjdXJyZW50IHByb2Nlc3MgZG9lcyBub3QgaG9sZCB0aGUgbG9jay4KCiAgICAgICAgICAgICIiIgogICAgICAgIGlmIG5vdCBzZWxmLmlzX2xvY2tlZCgpOgogICAgICAgICAgICByYWlzZSBOb3RMb2NrZWQoIiVzIGlzIG5vdCBsb2NrZWQiICUgc2VsZi5wYXRoKQogICAgICAgIGlmIG5vdCBzZWxmLmlfYW1fbG9ja2luZygpOgogICAgICAgICAgICByYWlzZSBOb3RNeUxvY2soIiVzIGlzIGxvY2tlZCwgYnV0IG5vdCBieSBtZSIgJSBzZWxmLnBhdGgpCiAgICAgICAgcmVtb3ZlX2V4aXN0aW5nX3BpZGZpbGUoc2VsZi5wYXRoKQoKICAgIGRlZiBicmVha19sb2NrKHNlbGYpOgogICAgICAgICIiIiBCcmVhayBhbiBleGlzdGluZyBsb2NrLgoKICAgICAgICAgICAgUmVtb3ZlcyB0aGUgUElEIGZpbGUgaWYgaXQgYWxyZWFkeSBleGlzdHMsIG90aGVyd2lzZSBkb2VzCiAgICAgICAgICAgIG5vdGhpbmcuCgogICAgICAgICAgICAiIiIKICAgICAgICByZW1vdmVfZXhpc3RpbmdfcGlkZmlsZShzZWxmLnBhdGgpCgoKZGVmIHJlYWRfcGlkX2Zyb21fcGlkZmlsZShwaWRmaWxlX3BhdGgpOgogICAgIiIiIFJlYWQgdGhlIFBJRCByZWNvcmRlZCBpbiB0aGUgbmFtZWQgUElEIGZpbGUuCgogICAgICAgIFJlYWQgYW5kIHJldHVybiB0aGUgbnVtZXJpYyBQSUQgcmVjb3JkZWQgYXMgdGV4dCBpbiB0aGUgbmFtZWQKICAgICAgICBQSUQgZmlsZS4gSWYgdGhlIFBJRCBmaWxlIGNhbm5vdCBiZSByZWFkLCBvciBpZiB0aGUgY29udGVudCBpcwogICAgICAgIG5vdCBhIHZhbGlkIFBJRCwgcmV0dXJuIGBgTm9uZWBgLgoKICAgICAgICAiIiIKICAgIHBpZCA9IE5vbmUKICAgIHRyeToKICAgICAgICBwaWRmaWxlID0gb3BlbihwaWRmaWxlX3BhdGgsICdyJykKICAgIGV4Y2VwdCBJT0Vycm9yOgogICAgICAgIHBhc3MKICAgIGVsc2U6CiAgICAgICAgIyBBY2NvcmRpbmcgdG8gdGhlIEZIUyAyLjMgc2VjdGlvbiBvbiBQSUQgZmlsZXMgaW4gL3Zhci9ydW46CiAgICAgICAgIwogICAgICAgICMgICBUaGUgZmlsZSBtdXN0IGNvbnNpc3Qgb2YgdGhlIHByb2Nlc3MgaWRlbnRpZmllciBpbgogICAgICAgICMgICBBU0NJSS1lbmNvZGVkIGRlY2ltYWwsIGZvbGxvd2VkIGJ5IGEgbmV3bGluZSBjaGFyYWN0ZXIuCiAgICAgICAgIwogICAgICAgICMgICBQcm9ncmFtcyB0aGF0IHJlYWQgUElEIGZpbGVzIHNob3VsZCBiZSBzb21ld2hhdCBmbGV4aWJsZQogICAgICAgICMgICBpbiB3aGF0IHRoZXkgYWNjZXB0OyBpLmUuLCB0aGV5IHNob3VsZCBpZ25vcmUgZXh0cmEKICAgICAgICAjICAgd2hpdGVzcGFjZSwgbGVhZGluZyB6ZXJvZXMsIGFic2VuY2Ugb2YgdGhlIHRyYWlsaW5nCiAgICAgICAgIyAgIG5ld2xpbmUsIG9yIGFkZGl0aW9uYWwgbGluZXMgaW4gdGhlIFBJRCBmaWxlLgoKICAgICAgICBsaW5lID0gcGlkZmlsZS5yZWFkbGluZSgpLnN0cmlwKCkKICAgICAgICB0cnk6CiAgICAgICAgICAgIHBpZCA9IGludChsaW5lKQogICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICBwYXNzCiAgICAgICAgcGlkZmlsZS5jbG9zZSgpCgogICAgcmV0dXJuIHBpZAoKCmRlZiB3cml0ZV9waWRfdG9fcGlkZmlsZShwaWRmaWxlX3BhdGgpOgogICAgIiIiIFdyaXRlIHRoZSBQSUQgaW4gdGhlIG5hbWVkIFBJRCBmaWxlLgoKICAgICAgICBHZXQgdGhlIG51bWVyaWMgcHJvY2VzcyBJRCAo4oCcUElE4oCdKSBvZiB0aGUgY3VycmVudCBwcm9jZXNzCiAgICAgICAgYW5kIHdyaXRlIGl0IHRvIHRoZSBuYW1lZCBmaWxlIGFzIGEgbGluZSBvZiB0ZXh0LgoKICAgICAgICAiIiIKICAgIG9wZW5fZmxhZ3MgPSAob3MuT19DUkVBVCB8IG9zLk9fRVhDTCB8IG9zLk9fV1JPTkxZKQogICAgb3Blbl9tb2RlID0gMG82NDQKICAgIHBpZGZpbGVfZmQgPSBvcy5vcGVuKHBpZGZpbGVfcGF0aCwgb3Blbl9mbGFncywgb3Blbl9tb2RlKQogICAgcGlkZmlsZSA9IG9zLmZkb3BlbihwaWRmaWxlX2ZkLCAndycpCgogICAgIyBBY2NvcmRpbmcgdG8gdGhlIEZIUyAyLjMgc2VjdGlvbiBvbiBQSUQgZmlsZXMgaW4gL3Zhci9ydW46CiAgICAjCiAgICAjICAgVGhlIGZpbGUgbXVzdCBjb25zaXN0IG9mIHRoZSBwcm9jZXNzIGlkZW50aWZpZXIgaW4KICAgICMgICBBU0NJSS1lbmNvZGVkIGRlY2ltYWwsIGZvbGxvd2VkIGJ5IGEgbmV3bGluZSBjaGFyYWN0ZXIuIEZvcgogICAgIyAgIGV4YW1wbGUsIGlmIGNyb25kIHdhcyBwcm9jZXNzIG51bWJlciAyNSwgL3Zhci9ydW4vY3JvbmQucGlkCiAgICAjICAgd291bGQgY29udGFpbiB0aHJlZSBjaGFyYWN0ZXJzOiB0d28sIGZpdmUsIGFuZCBuZXdsaW5lLgoKICAgIHBpZCA9IG9zLmdldHBpZCgpCiAgICBwaWRmaWxlLndyaXRlKCIlc1xuIiAlIHBpZCkKICAgIHBpZGZpbGUuY2xvc2UoKQoKCmRlZiByZW1vdmVfZXhpc3RpbmdfcGlkZmlsZShwaWRmaWxlX3BhdGgpOgogICAgIiIiIFJlbW92ZSB0aGUgbmFtZWQgUElEIGZpbGUgaWYgaXQgZXhpc3RzLgoKICAgICAgICBSZW1vdmluZyBhIFBJRCBmaWxlIHRoYXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0IHB1dHMgdXMgaW4gdGhlCiAgICAgICAgZGVzaXJlZCBzdGF0ZSwgc28gd2UgaWdub3JlIHRoZSBjb25kaXRpb24gaWYgdGhlIGZpbGUgZG9lcyBub3QKICAgICAgICBleGlzdC4KCiAgICAgICAgIiIiCiAgICB0cnk6CiAgICAgICAgb3MucmVtb3ZlKHBpZGZpbGVfcGF0aCkKICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGV4YzoKICAgICAgICBpZiBleGMuZXJybm8gPT0gZXJybm8uRU5PRU5UOgogICAgICAgICAgICBwYXNzCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UKUEsDBBQAAAAAAAAAIQC7hfC9ghUAAIIVAABDAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9sb2NrZmlsZS9zcWxpdGVsb2NrZmlsZS5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbgoKaW1wb3J0IHRpbWUKaW1wb3J0IG9zCgp0cnk6CiAgICB1bmljb2RlCmV4Y2VwdCBOYW1lRXJyb3I6CiAgICB1bmljb2RlID0gc3RyCgpmcm9tIC4gaW1wb3J0IExvY2tCYXNlLCBOb3RMb2NrZWQsIE5vdE15TG9jaywgTG9ja1RpbWVvdXQsIEFscmVhZHlMb2NrZWQKCgpjbGFzcyBTUUxpdGVMb2NrRmlsZShMb2NrQmFzZSk6CiAgICAiRGVtb25zdHJhdGUgU1FMLWJhc2VkIGxvY2tpbmcuIgoKICAgIHRlc3RkYiA9IE5vbmUKCiAgICBkZWYgX19pbml0X18oc2VsZiwgcGF0aCwgdGhyZWFkZWQ9VHJ1ZSwgdGltZW91dD1Ob25lKToKICAgICAgICAiIiIKICAgICAgICA+Pj4gbG9jayA9IFNRTGl0ZUxvY2tGaWxlKCdzb21lZmlsZScpCiAgICAgICAgPj4+IGxvY2sgPSBTUUxpdGVMb2NrRmlsZSgnc29tZWZpbGUnLCB0aHJlYWRlZD1GYWxzZSkKICAgICAgICAiIiIKICAgICAgICBMb2NrQmFzZS5fX2luaXRfXyhzZWxmLCBwYXRoLCB0aHJlYWRlZCwgdGltZW91dCkKICAgICAgICBzZWxmLmxvY2tfZmlsZSA9IHVuaWNvZGUoc2VsZi5sb2NrX2ZpbGUpCiAgICAgICAgc2VsZi51bmlxdWVfbmFtZSA9IHVuaWNvZGUoc2VsZi51bmlxdWVfbmFtZSkKCiAgICAgICAgaWYgU1FMaXRlTG9ja0ZpbGUudGVzdGRiIGlzIE5vbmU6CiAgICAgICAgICAgIGltcG9ydCB0ZW1wZmlsZQogICAgICAgICAgICBfZmQsIHRlc3RkYiA9IHRlbXBmaWxlLm1rc3RlbXAoKQogICAgICAgICAgICBvcy5jbG9zZShfZmQpCiAgICAgICAgICAgIG9zLnVubGluayh0ZXN0ZGIpCiAgICAgICAgICAgIGRlbCBfZmQsIHRlbXBmaWxlCiAgICAgICAgICAgIFNRTGl0ZUxvY2tGaWxlLnRlc3RkYiA9IHRlc3RkYgoKICAgICAgICBpbXBvcnQgc3FsaXRlMwogICAgICAgIHNlbGYuY29ubmVjdGlvbiA9IHNxbGl0ZTMuY29ubmVjdChTUUxpdGVMb2NrRmlsZS50ZXN0ZGIpCgogICAgICAgIGMgPSBzZWxmLmNvbm5lY3Rpb24uY3Vyc29yKCkKICAgICAgICB0cnk6CiAgICAgICAgICAgIGMuZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIGxvY2tzIgogICAgICAgICAgICAgICAgICAgICAgIigiCiAgICAgICAgICAgICAgICAgICAgICAiICAgbG9ja19maWxlIHZhcmNoYXIoMzIpLCIKICAgICAgICAgICAgICAgICAgICAgICIgICB1bmlxdWVfbmFtZSB2YXJjaGFyKDMyKSIKICAgICAgICAgICAgICAgICAgICAgICIpIikKICAgICAgICBleGNlcHQgc3FsaXRlMy5PcGVyYXRpb25hbEVycm9yOgogICAgICAgICAgICBwYXNzCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5jb25uZWN0aW9uLmNvbW1pdCgpCiAgICAgICAgICAgIGltcG9ydCBhdGV4aXQKICAgICAgICAgICAgYXRleGl0LnJlZ2lzdGVyKG9zLnVubGluaywgU1FMaXRlTG9ja0ZpbGUudGVzdGRiKQoKICAgIGRlZiBhY3F1aXJlKHNlbGYsIHRpbWVvdXQ9Tm9uZSk6CiAgICAgICAgdGltZW91dCA9IHRpbWVvdXQgaWYgdGltZW91dCBpcyBub3QgTm9uZSBlbHNlIHNlbGYudGltZW91dAogICAgICAgIGVuZF90aW1lID0gdGltZS50aW1lKCkKICAgICAgICBpZiB0aW1lb3V0IGlzIG5vdCBOb25lIGFuZCB0aW1lb3V0ID4gMDoKICAgICAgICAgICAgZW5kX3RpbWUgKz0gdGltZW91dAoKICAgICAgICBpZiB0aW1lb3V0IGlzIE5vbmU6CiAgICAgICAgICAgIHdhaXQgPSAwLjEKICAgICAgICBlbGlmIHRpbWVvdXQgPD0gMDoKICAgICAgICAgICAgd2FpdCA9IDAKICAgICAgICBlbHNlOgogICAgICAgICAgICB3YWl0ID0gdGltZW91dCAvIDEwCgogICAgICAgIGN1cnNvciA9IHNlbGYuY29ubmVjdGlvbi5jdXJzb3IoKQoKICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICBpZiBub3Qgc2VsZi5pc19sb2NrZWQoKToKICAgICAgICAgICAgICAgICMgTm90IGxvY2tlZC4gIFRyeSB0byBsb2NrIGl0LgogICAgICAgICAgICAgICAgY3Vyc29yLmV4ZWN1dGUoImluc2VydCBpbnRvIGxvY2tzIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgKGxvY2tfZmlsZSwgdW5pcXVlX25hbWUpIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgdmFsdWVzIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgKD8sID8pIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxmLmxvY2tfZmlsZSwgc2VsZi51bmlxdWVfbmFtZSkpCiAgICAgICAgICAgICAgICBzZWxmLmNvbm5lY3Rpb24uY29tbWl0KCkKCiAgICAgICAgICAgICAgICAjIENoZWNrIHRvIHNlZSBpZiB3ZSBhcmUgdGhlIG9ubHkgbG9jayBob2xkZXIuCiAgICAgICAgICAgICAgICBjdXJzb3IuZXhlY3V0ZSgic2VsZWN0ICogZnJvbSBsb2NrcyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIHdoZXJlIHVuaXF1ZV9uYW1lID0gPyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi51bmlxdWVfbmFtZSwpKQogICAgICAgICAgICAgICAgcm93cyA9IGN1cnNvci5mZXRjaGFsbCgpCiAgICAgICAgICAgICAgICBpZiBsZW4ocm93cykgPiAxOgogICAgICAgICAgICAgICAgICAgICMgTm9wZS4gIFNvbWVvbmUgZWxzZSBnb3QgdGhlcmUuICBSZW1vdmUgb3VyIGxvY2suCiAgICAgICAgICAgICAgICAgICAgY3Vyc29yLmV4ZWN1dGUoImRlbGV0ZSBmcm9tIGxvY2tzIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIHdoZXJlIHVuaXF1ZV9uYW1lID0gPyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYudW5pcXVlX25hbWUsKSkKICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbm5lY3Rpb24uY29tbWl0KCkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgIyBZdXAuICBXZSdyZSBkb25lLCBzbyBnbyBob21lLgogICAgICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBDaGVjayB0byBzZWUgaWYgd2UgYXJlIHRoZSBvbmx5IGxvY2sgaG9sZGVyLgogICAgICAgICAgICAgICAgY3Vyc29yLmV4ZWN1dGUoInNlbGVjdCAqIGZyb20gbG9ja3MiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICB3aGVyZSB1bmlxdWVfbmFtZSA9ID8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYudW5pcXVlX25hbWUsKSkKICAgICAgICAgICAgICAgIHJvd3MgPSBjdXJzb3IuZmV0Y2hhbGwoKQogICAgICAgICAgICAgICAgaWYgbGVuKHJvd3MpID09IDE6CiAgICAgICAgICAgICAgICAgICAgIyBXZSdyZSB0aGUgbG9ja2VyLCBzbyBnbyBob21lLgogICAgICAgICAgICAgICAgICAgIHJldHVybgoKICAgICAgICAgICAgIyBNYXliZSB3ZSBzaG91bGQgd2FpdCBhIGJpdCBsb25nZXIuCiAgICAgICAgICAgIGlmIHRpbWVvdXQgaXMgbm90IE5vbmUgYW5kIHRpbWUudGltZSgpID4gZW5kX3RpbWU6CiAgICAgICAgICAgICAgICBpZiB0aW1lb3V0ID4gMDoKICAgICAgICAgICAgICAgICAgICAjIE5vIG1vcmUgd2FpdGluZy4KICAgICAgICAgICAgICAgICAgICByYWlzZSBMb2NrVGltZW91dCgiVGltZW91dCB3YWl0aW5nIHRvIGFjcXVpcmUiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBsb2NrIGZvciAlcyIgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGF0aCkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgIyBTb21lb25lIGVsc2UgaGFzIHRoZSBsb2NrIGFuZCB3ZSBhcmUgaW1wYXRpZW50Li4KICAgICAgICAgICAgICAgICAgICByYWlzZSBBbHJlYWR5TG9ja2VkKCIlcyBpcyBhbHJlYWR5IGxvY2tlZCIgJSBzZWxmLnBhdGgpCgogICAgICAgICAgICAjIFdlbGwsIG9rYXkuICBXZSdsbCBnaXZlIGl0IGEgYml0IGxvbmdlci4KICAgICAgICAgICAgdGltZS5zbGVlcCh3YWl0KQoKICAgIGRlZiByZWxlYXNlKHNlbGYpOgogICAgICAgIGlmIG5vdCBzZWxmLmlzX2xvY2tlZCgpOgogICAgICAgICAgICByYWlzZSBOb3RMb2NrZWQoIiVzIGlzIG5vdCBsb2NrZWQiICUgc2VsZi5wYXRoKQogICAgICAgIGlmIG5vdCBzZWxmLmlfYW1fbG9ja2luZygpOgogICAgICAgICAgICByYWlzZSBOb3RNeUxvY2soIiVzIGlzIGxvY2tlZCwgYnV0IG5vdCBieSBtZSAoYnkgJXMpIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi51bmlxdWVfbmFtZSwgc2VsZi5fd2hvX2lzX2xvY2tpbmcoKSkpCiAgICAgICAgY3Vyc29yID0gc2VsZi5jb25uZWN0aW9uLmN1cnNvcigpCiAgICAgICAgY3Vyc29yLmV4ZWN1dGUoImRlbGV0ZSBmcm9tIGxvY2tzIgogICAgICAgICAgICAgICAgICAgICAgICIgIHdoZXJlIHVuaXF1ZV9uYW1lID0gPyIsCiAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYudW5pcXVlX25hbWUsKSkKICAgICAgICBzZWxmLmNvbm5lY3Rpb24uY29tbWl0KCkKCiAgICBkZWYgX3dob19pc19sb2NraW5nKHNlbGYpOgogICAgICAgIGN1cnNvciA9IHNlbGYuY29ubmVjdGlvbi5jdXJzb3IoKQogICAgICAgIGN1cnNvci5leGVjdXRlKCJzZWxlY3QgdW5pcXVlX25hbWUgZnJvbSBsb2NrcyIKICAgICAgICAgICAgICAgICAgICAgICAiICB3aGVyZSBsb2NrX2ZpbGUgPSA/IiwKICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi5sb2NrX2ZpbGUsKSkKICAgICAgICByZXR1cm4gY3Vyc29yLmZldGNob25lKClbMF0KCiAgICBkZWYgaXNfbG9ja2VkKHNlbGYpOgogICAgICAgIGN1cnNvciA9IHNlbGYuY29ubmVjdGlvbi5jdXJzb3IoKQogICAgICAgIGN1cnNvci5leGVjdXRlKCJzZWxlY3QgKiBmcm9tIGxvY2tzIgogICAgICAgICAgICAgICAgICAgICAgICIgIHdoZXJlIGxvY2tfZmlsZSA9ID8iLAogICAgICAgICAgICAgICAgICAgICAgIChzZWxmLmxvY2tfZmlsZSwpKQogICAgICAgIHJvd3MgPSBjdXJzb3IuZmV0Y2hhbGwoKQogICAgICAgIHJldHVybiBub3Qgbm90IHJvd3MKCiAgICBkZWYgaV9hbV9sb2NraW5nKHNlbGYpOgogICAgICAgIGN1cnNvciA9IHNlbGYuY29ubmVjdGlvbi5jdXJzb3IoKQogICAgICAgIGN1cnNvci5leGVjdXRlKCJzZWxlY3QgKiBmcm9tIGxvY2tzIgogICAgICAgICAgICAgICAgICAgICAgICIgIHdoZXJlIGxvY2tfZmlsZSA9ID8iCiAgICAgICAgICAgICAgICAgICAgICAgIiAgICBhbmQgdW5pcXVlX25hbWUgPSA/IiwKICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi5sb2NrX2ZpbGUsIHNlbGYudW5pcXVlX25hbWUpKQogICAgICAgIHJldHVybiBub3Qgbm90IGN1cnNvci5mZXRjaGFsbCgpCgogICAgZGVmIGJyZWFrX2xvY2soc2VsZik6CiAgICAgICAgY3Vyc29yID0gc2VsZi5jb25uZWN0aW9uLmN1cnNvcigpCiAgICAgICAgY3Vyc29yLmV4ZWN1dGUoImRlbGV0ZSBmcm9tIGxvY2tzIgogICAgICAgICAgICAgICAgICAgICAgICIgIHdoZXJlIGxvY2tfZmlsZSA9ID8iLAogICAgICAgICAgICAgICAgICAgICAgIChzZWxmLmxvY2tfZmlsZSwpKQogICAgICAgIHNlbGYuY29ubmVjdGlvbi5jb21taXQoKQpQSwMEFAAAAAAAAAAhAJEjCdk4CgAAOAoAAEQAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2xvY2tmaWxlL3N5bWxpbmtsb2NrZmlsZS5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgb3MKaW1wb3J0IHRpbWUKCmZyb20gLiBpbXBvcnQgKExvY2tCYXNlLCBOb3RMb2NrZWQsIE5vdE15TG9jaywgTG9ja1RpbWVvdXQsCiAgICAgICAgICAgICAgIEFscmVhZHlMb2NrZWQpCgoKY2xhc3MgU3ltbGlua0xvY2tGaWxlKExvY2tCYXNlKToKICAgICIiIkxvY2sgYWNjZXNzIHRvIGEgZmlsZSB1c2luZyBzeW1saW5rKDIpLiIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXRoLCB0aHJlYWRlZD1UcnVlLCB0aW1lb3V0PU5vbmUpOgogICAgICAgICMgc3VwZXIoU3ltbGlua0xvY2tGaWxlKS5fX2luaXQoLi4uKQogICAgICAgIExvY2tCYXNlLl9faW5pdF9fKHNlbGYsIHBhdGgsIHRocmVhZGVkLCB0aW1lb3V0KQogICAgICAgICMgc3BsaXQgaXQgYmFjayEKICAgICAgICBzZWxmLnVuaXF1ZV9uYW1lID0gb3MucGF0aC5zcGxpdChzZWxmLnVuaXF1ZV9uYW1lKVsxXQoKICAgIGRlZiBhY3F1aXJlKHNlbGYsIHRpbWVvdXQ9Tm9uZSk6CiAgICAgICAgIyBIb3BlZnVsbHkgdW5uZWNlc3NhcnkgZm9yIHN5bWxpbmsuCiAgICAgICAgIyB0cnk6CiAgICAgICAgIyAgICAgb3BlbihzZWxmLnVuaXF1ZV9uYW1lLCAid2IiKS5jbG9zZSgpCiAgICAgICAgIyBleGNlcHQgSU9FcnJvcjoKICAgICAgICAjICAgICByYWlzZSBMb2NrRmFpbGVkKCJmYWlsZWQgdG8gY3JlYXRlICVzIiAlIHNlbGYudW5pcXVlX25hbWUpCiAgICAgICAgdGltZW91dCA9IHRpbWVvdXQgaWYgdGltZW91dCBpcyBub3QgTm9uZSBlbHNlIHNlbGYudGltZW91dAogICAgICAgIGVuZF90aW1lID0gdGltZS50aW1lKCkKICAgICAgICBpZiB0aW1lb3V0IGlzIG5vdCBOb25lIGFuZCB0aW1lb3V0ID4gMDoKICAgICAgICAgICAgZW5kX3RpbWUgKz0gdGltZW91dAoKICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICAjIFRyeSBhbmQgY3JlYXRlIGEgc3ltYm9saWMgbGluayB0byBpdC4KICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgb3Muc3ltbGluayhzZWxmLnVuaXF1ZV9uYW1lLCBzZWxmLmxvY2tfZmlsZSkKICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6CiAgICAgICAgICAgICAgICAjIExpbmsgY3JlYXRpb24gZmFpbGVkLiAgTWF5YmUgd2UndmUgZG91YmxlLWxvY2tlZD8KICAgICAgICAgICAgICAgIGlmIHNlbGYuaV9hbV9sb2NraW5nKCk6CiAgICAgICAgICAgICAgICAgICAgIyBMaW5rZWQgdG8gb3V0IHVuaXF1ZSBuYW1lLiBQcm9jZWVkLgogICAgICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAjIE90aGVyd2lzZSB0aGUgbG9jayBjcmVhdGlvbiBmYWlsZWQuCiAgICAgICAgICAgICAgICAgICAgaWYgdGltZW91dCBpcyBub3QgTm9uZSBhbmQgdGltZS50aW1lKCkgPiBlbmRfdGltZToKICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGltZW91dCA+IDA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBMb2NrVGltZW91dCgiVGltZW91dCB3YWl0aW5nIHRvIGFjcXVpcmUiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGxvY2sgZm9yICVzIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhdGgpCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBBbHJlYWR5TG9ja2VkKCIlcyBpcyBhbHJlYWR5IGxvY2tlZCIgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhdGgpCiAgICAgICAgICAgICAgICAgICAgdGltZS5zbGVlcCh0aW1lb3V0IC8gMTAgaWYgdGltZW91dCBpcyBub3QgTm9uZSBlbHNlIDAuMSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgTGluayBjcmVhdGlvbiBzdWNjZWVkZWQuICBXZSdyZSBnb29kIHRvIGdvLgogICAgICAgICAgICAgICAgcmV0dXJuCgogICAgZGVmIHJlbGVhc2Uoc2VsZik6CiAgICAgICAgaWYgbm90IHNlbGYuaXNfbG9ja2VkKCk6CiAgICAgICAgICAgIHJhaXNlIE5vdExvY2tlZCgiJXMgaXMgbm90IGxvY2tlZCIgJSBzZWxmLnBhdGgpCiAgICAgICAgZWxpZiBub3Qgc2VsZi5pX2FtX2xvY2tpbmcoKToKICAgICAgICAgICAgcmFpc2UgTm90TXlMb2NrKCIlcyBpcyBsb2NrZWQsIGJ1dCBub3QgYnkgbWUiICUgc2VsZi5wYXRoKQogICAgICAgIG9zLnVubGluayhzZWxmLmxvY2tfZmlsZSkKCiAgICBkZWYgaXNfbG9ja2VkKHNlbGYpOgogICAgICAgIHJldHVybiBvcy5wYXRoLmlzbGluayhzZWxmLmxvY2tfZmlsZSkKCiAgICBkZWYgaV9hbV9sb2NraW5nKHNlbGYpOgogICAgICAgIHJldHVybiAob3MucGF0aC5pc2xpbmsoc2VsZi5sb2NrX2ZpbGUpCiAgICAgICAgICAgICAgICBhbmQgb3MucmVhZGxpbmsoc2VsZi5sb2NrX2ZpbGUpID09IHNlbGYudW5pcXVlX25hbWUpCgogICAgZGVmIGJyZWFrX2xvY2soc2VsZik6CiAgICAgICAgaWYgb3MucGF0aC5pc2xpbmsoc2VsZi5sb2NrX2ZpbGUpOiAgIyBleGlzdHMgJiYgbGluawogICAgICAgICAgICBvcy51bmxpbmsoc2VsZi5sb2NrX2ZpbGUpClBLAwQUAAAAAAAAACEA1lIZI/4PAAD+DwAANwAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3Ivb3JkZXJlZGRpY3QucHkjIENvcHlyaWdodCAoYykgMjAwOSBSYXltb25kIEhldHRpbmdlcgojCiMgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KIyBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcwojICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sCiMgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwKIyBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLAojIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCiMgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiMKIyAgICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKIyAgICAgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCiMKIyAgICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCiMgICAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUwojICAgICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAojICAgICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAojICAgICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKIyAgICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCiMgICAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKIyAgICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKZnJvbSBVc2VyRGljdCBpbXBvcnQgRGljdE1peGluCgpjbGFzcyBPcmRlcmVkRGljdChkaWN0LCBEaWN0TWl4aW4pOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2RzKToKICAgICAgICBpZiBsZW4oYXJncykgPiAxOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ2V4cGVjdGVkIGF0IG1vc3QgMSBhcmd1bWVudHMsIGdvdCAlZCcgJSBsZW4oYXJncykpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLl9fZW5kCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICBzZWxmLmNsZWFyKCkKICAgICAgICBzZWxmLnVwZGF0ZSgqYXJncywgKiprd2RzKQoKICAgIGRlZiBjbGVhcihzZWxmKToKICAgICAgICBzZWxmLl9fZW5kID0gZW5kID0gW10KICAgICAgICBlbmQgKz0gW05vbmUsIGVuZCwgZW5kXSAgICAgICAgICMgc2VudGluZWwgbm9kZSBmb3IgZG91Ymx5IGxpbmtlZCBsaXN0CiAgICAgICAgc2VsZi5fX21hcCA9IHt9ICAgICAgICAgICAgICAgICAjIGtleSAtLT4gW2tleSwgcHJldiwgbmV4dF0KICAgICAgICBkaWN0LmNsZWFyKHNlbGYpCgogICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGtleSwgdmFsdWUpOgogICAgICAgIGlmIGtleSBub3QgaW4gc2VsZjoKICAgICAgICAgICAgZW5kID0gc2VsZi5fX2VuZAogICAgICAgICAgICBjdXJyID0gZW5kWzFdCiAgICAgICAgICAgIGN1cnJbMl0gPSBlbmRbMV0gPSBzZWxmLl9fbWFwW2tleV0gPSBba2V5LCBjdXJyLCBlbmRdCiAgICAgICAgZGljdC5fX3NldGl0ZW1fXyhzZWxmLCBrZXksIHZhbHVlKQoKICAgIGRlZiBfX2RlbGl0ZW1fXyhzZWxmLCBrZXkpOgogICAgICAgIGRpY3QuX19kZWxpdGVtX18oc2VsZiwga2V5KQogICAgICAgIGtleSwgcHJldiwgbmV4dCA9IHNlbGYuX19tYXAucG9wKGtleSkKICAgICAgICBwcmV2WzJdID0gbmV4dAogICAgICAgIG5leHRbMV0gPSBwcmV2CgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgIGVuZCA9IHNlbGYuX19lbmQKICAgICAgICBjdXJyID0gZW5kWzJdCiAgICAgICAgd2hpbGUgY3VyciBpcyBub3QgZW5kOgogICAgICAgICAgICB5aWVsZCBjdXJyWzBdCiAgICAgICAgICAgIGN1cnIgPSBjdXJyWzJdCgogICAgZGVmIF9fcmV2ZXJzZWRfXyhzZWxmKToKICAgICAgICBlbmQgPSBzZWxmLl9fZW5kCiAgICAgICAgY3VyciA9IGVuZFsxXQogICAgICAgIHdoaWxlIGN1cnIgaXMgbm90IGVuZDoKICAgICAgICAgICAgeWllbGQgY3VyclswXQogICAgICAgICAgICBjdXJyID0gY3VyclsxXQoKICAgIGRlZiBwb3BpdGVtKHNlbGYsIGxhc3Q9VHJ1ZSk6CiAgICAgICAgaWYgbm90IHNlbGY6CiAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKCdkaWN0aW9uYXJ5IGlzIGVtcHR5JykKICAgICAgICBpZiBsYXN0OgogICAgICAgICAgICBrZXkgPSByZXZlcnNlZChzZWxmKS5uZXh0KCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBrZXkgPSBpdGVyKHNlbGYpLm5leHQoKQogICAgICAgIHZhbHVlID0gc2VsZi5wb3Aoa2V5KQogICAgICAgIHJldHVybiBrZXksIHZhbHVlCgogICAgZGVmIF9fcmVkdWNlX18oc2VsZik6CiAgICAgICAgaXRlbXMgPSBbW2ssIHNlbGZba11dIGZvciBrIGluIHNlbGZdCiAgICAgICAgdG1wID0gc2VsZi5fX21hcCwgc2VsZi5fX2VuZAogICAgICAgIGRlbCBzZWxmLl9fbWFwLCBzZWxmLl9fZW5kCiAgICAgICAgaW5zdF9kaWN0ID0gdmFycyhzZWxmKS5jb3B5KCkKICAgICAgICBzZWxmLl9fbWFwLCBzZWxmLl9fZW5kID0gdG1wCiAgICAgICAgaWYgaW5zdF9kaWN0OgogICAgICAgICAgICByZXR1cm4gKHNlbGYuX19jbGFzc19fLCAoaXRlbXMsKSwgaW5zdF9kaWN0KQogICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXywgKGl0ZW1zLCkKCiAgICBkZWYga2V5cyhzZWxmKToKICAgICAgICByZXR1cm4gbGlzdChzZWxmKQoKICAgIHNldGRlZmF1bHQgPSBEaWN0TWl4aW4uc2V0ZGVmYXVsdAogICAgdXBkYXRlID0gRGljdE1peGluLnVwZGF0ZQogICAgcG9wID0gRGljdE1peGluLnBvcAogICAgdmFsdWVzID0gRGljdE1peGluLnZhbHVlcwogICAgaXRlbXMgPSBEaWN0TWl4aW4uaXRlbXMKICAgIGl0ZXJrZXlzID0gRGljdE1peGluLml0ZXJrZXlzCiAgICBpdGVydmFsdWVzID0gRGljdE1peGluLml0ZXJ2YWx1ZXMKICAgIGl0ZXJpdGVtcyA9IERpY3RNaXhpbi5pdGVyaXRlbXMKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgaWYgbm90IHNlbGY6CiAgICAgICAgICAgIHJldHVybiAnJXMoKScgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sKQogICAgICAgIHJldHVybiAnJXMoJXIpJyAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgc2VsZi5pdGVtcygpKQoKICAgIGRlZiBjb3B5KHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXyhzZWxmKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGZyb21rZXlzKGNscywgaXRlcmFibGUsIHZhbHVlPU5vbmUpOgogICAgICAgIGQgPSBjbHMoKQogICAgICAgIGZvciBrZXkgaW4gaXRlcmFibGU6CiAgICAgICAgICAgIGRba2V5XSA9IHZhbHVlCiAgICAgICAgcmV0dXJuIGQKCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBPcmRlcmVkRGljdCk6CiAgICAgICAgICAgIGlmIGxlbihzZWxmKSAhPSBsZW4ob3RoZXIpOgogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgICAgIGZvciBwLCBxIGluICB6aXAoc2VsZi5pdGVtcygpLCBvdGhlci5pdGVtcygpKToKICAgICAgICAgICAgICAgIGlmIHAgIT0gcToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICByZXR1cm4gZGljdC5fX2VxX18oc2VsZiwgb3RoZXIpCgogICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIG5vdCBzZWxmID09IG90aGVyClBLAwQUAAAAAAAAACEAPClYxtACAADQAgAAPwAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcGFja2FnaW5nL19fYWJvdXRfXy5weSMgVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbgojIDIuMCwgYW5kIHRoZSBCU0QgTGljZW5zZS4gU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyByZXBvc2l0b3J5CiMgZm9yIGNvbXBsZXRlIGRldGFpbHMuCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgcHJpbnRfZnVuY3Rpb24KCl9fYWxsX18gPSBbCiAgICAiX190aXRsZV9fIiwgIl9fc3VtbWFyeV9fIiwgIl9fdXJpX18iLCAiX192ZXJzaW9uX18iLCAiX19hdXRob3JfXyIsCiAgICAiX19lbWFpbF9fIiwgIl9fbGljZW5zZV9fIiwgIl9fY29weXJpZ2h0X18iLApdCgpfX3RpdGxlX18gPSAicGFja2FnaW5nIgpfX3N1bW1hcnlfXyA9ICJDb3JlIHV0aWxpdGllcyBmb3IgUHl0aG9uIHBhY2thZ2VzIgpfX3VyaV9fID0gImh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3BhY2thZ2luZyIKCl9fdmVyc2lvbl9fID0gIjE2LjgiCgpfX2F1dGhvcl9fID0gIkRvbmFsZCBTdHVmZnQgYW5kIGluZGl2aWR1YWwgY29udHJpYnV0b3JzIgpfX2VtYWlsX18gPSAiZG9uYWxkQHN0dWZmdC5pbyIKCl9fbGljZW5zZV9fID0gIkJTRCBvciBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAiCl9fY29weXJpZ2h0X18gPSAiQ29weXJpZ2h0IDIwMTQtMjAxNiAlcyIgJSBfX2F1dGhvcl9fClBLAwQUAAAAAAAAACEAgXaWygECAAABAgAAPgAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcGFja2FnaW5nL19faW5pdF9fLnB5IyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uCiMgMi4wLCBhbmQgdGhlIEJTRCBMaWNlbnNlLiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHJlcG9zaXRvcnkKIyBmb3IgY29tcGxldGUgZGV0YWlscy4KZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCBwcmludF9mdW5jdGlvbgoKZnJvbSAuX19hYm91dF9fIGltcG9ydCAoCiAgICBfX2F1dGhvcl9fLCBfX2NvcHlyaWdodF9fLCBfX2VtYWlsX18sIF9fbGljZW5zZV9fLCBfX3N1bW1hcnlfXywgX190aXRsZV9fLAogICAgX191cmlfXywgX192ZXJzaW9uX18KKQoKX19hbGxfXyA9IFsKICAgICJfX3RpdGxlX18iLCAiX19zdW1tYXJ5X18iLCAiX191cmlfXyIsICJfX3ZlcnNpb25fXyIsICJfX2F1dGhvcl9fIiwKICAgICJfX2VtYWlsX18iLCAiX19saWNlbnNlX18iLCAiX19jb3B5cmlnaHRfXyIsCl0KUEsDBBQAAAAAAAAAIQDmaUrjXAMAAFwDAAA9AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9wYWNrYWdpbmcvX2NvbXBhdC5weSMgVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbgojIDIuMCwgYW5kIHRoZSBCU0QgTGljZW5zZS4gU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyByZXBvc2l0b3J5CiMgZm9yIGNvbXBsZXRlIGRldGFpbHMuCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgcHJpbnRfZnVuY3Rpb24KCmltcG9ydCBzeXMKCgpQWTIgPSBzeXMudmVyc2lvbl9pbmZvWzBdID09IDIKUFkzID0gc3lzLnZlcnNpb25faW5mb1swXSA9PSAzCgojIGZsYWtlODogbm9xYQoKaWYgUFkzOgogICAgc3RyaW5nX3R5cGVzID0gc3RyLAplbHNlOgogICAgc3RyaW5nX3R5cGVzID0gYmFzZXN0cmluZywKCgpkZWYgd2l0aF9tZXRhY2xhc3MobWV0YSwgKmJhc2VzKToKICAgICIiIgogICAgQ3JlYXRlIGEgYmFzZSBjbGFzcyB3aXRoIGEgbWV0YWNsYXNzLgogICAgIiIiCiAgICAjIFRoaXMgcmVxdWlyZXMgYSBiaXQgb2YgZXhwbGFuYXRpb246IHRoZSBiYXNpYyBpZGVhIGlzIHRvIG1ha2UgYSBkdW1teQogICAgIyBtZXRhY2xhc3MgZm9yIG9uZSBsZXZlbCBvZiBjbGFzcyBpbnN0YW50aWF0aW9uIHRoYXQgcmVwbGFjZXMgaXRzZWxmIHdpdGgKICAgICMgdGhlIGFjdHVhbCBtZXRhY2xhc3MuCiAgICBjbGFzcyBtZXRhY2xhc3MobWV0YSk6CiAgICAgICAgZGVmIF9fbmV3X18oY2xzLCBuYW1lLCB0aGlzX2Jhc2VzLCBkKToKICAgICAgICAgICAgcmV0dXJuIG1ldGEobmFtZSwgYmFzZXMsIGQpCiAgICByZXR1cm4gdHlwZS5fX25ld19fKG1ldGFjbGFzcywgJ3RlbXBvcmFyeV9jbGFzcycsICgpLCB7fSkKUEsDBBQAAAAAAAAAIQD6/aQSiAUAAIgFAABBAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9wYWNrYWdpbmcvX3N0cnVjdHVyZXMucHkjIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24KIyAyLjAsIGFuZCB0aGUgQlNEIExpY2Vuc2UuIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcmVwb3NpdG9yeQojIGZvciBjb21wbGV0ZSBkZXRhaWxzLgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHByaW50X2Z1bmN0aW9uCgoKY2xhc3MgSW5maW5pdHkob2JqZWN0KToKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICJJbmZpbml0eSIKCiAgICBkZWYgX19oYXNoX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGhhc2gocmVwcihzZWxmKSkKCiAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgX19sZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pCgogICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIG5vdCBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXykKCiAgICBkZWYgX19ndF9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBfX2dlX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIF9fbmVnX18oc2VsZik6CiAgICAgICAgcmV0dXJuIE5lZ2F0aXZlSW5maW5pdHkKCkluZmluaXR5ID0gSW5maW5pdHkoKQoKCmNsYXNzIE5lZ2F0aXZlSW5maW5pdHkob2JqZWN0KToKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICItSW5maW5pdHkiCgogICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgICAgIHJldHVybiBoYXNoKHJlcHIoc2VsZikpCgogICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgX19sZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXykKCiAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gbm90IGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKQoKICAgIGRlZiBfX2d0X18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGRlZiBfX2dlX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGRlZiBfX25lZ19fKHNlbGYpOgogICAgICAgIHJldHVybiBJbmZpbml0eQoKTmVnYXRpdmVJbmZpbml0eSA9IE5lZ2F0aXZlSW5maW5pdHkoKQpQSwMEFAAAAAAAAAAhAH0sK1cmIAAAJiAAAD0AAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3BhY2thZ2luZy9tYXJrZXJzLnB5IyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uCiMgMi4wLCBhbmQgdGhlIEJTRCBMaWNlbnNlLiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHJlcG9zaXRvcnkKIyBmb3IgY29tcGxldGUgZGV0YWlscy4KZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCBwcmludF9mdW5jdGlvbgoKaW1wb3J0IG9wZXJhdG9yCmltcG9ydCBvcwppbXBvcnQgcGxhdGZvcm0KaW1wb3J0IHN5cwoKZnJvbSBwaXAuX3ZlbmRvci5weXBhcnNpbmcgaW1wb3J0ICgKICAgIFBhcnNlRXhjZXB0aW9uLCBQYXJzZVJlc3VsdHMsIHN0cmluZ1N0YXJ0LCBzdHJpbmdFbmQsCikKZnJvbSBwaXAuX3ZlbmRvci5weXBhcnNpbmcgaW1wb3J0IFplcm9Pck1vcmUsIEdyb3VwLCBGb3J3YXJkLCBRdW90ZWRTdHJpbmcKZnJvbSBwaXAuX3ZlbmRvci5weXBhcnNpbmcgaW1wb3J0IExpdGVyYWwgYXMgTCAgIyBub3FhCgpmcm9tIC5fY29tcGF0IGltcG9ydCBzdHJpbmdfdHlwZXMKZnJvbSAuc3BlY2lmaWVycyBpbXBvcnQgU3BlY2lmaWVyLCBJbnZhbGlkU3BlY2lmaWVyCgoKX19hbGxfXyA9IFsKICAgICJJbnZhbGlkTWFya2VyIiwgIlVuZGVmaW5lZENvbXBhcmlzb24iLCAiVW5kZWZpbmVkRW52aXJvbm1lbnROYW1lIiwKICAgICJNYXJrZXIiLCAiZGVmYXVsdF9lbnZpcm9ubWVudCIsCl0KCgpjbGFzcyBJbnZhbGlkTWFya2VyKFZhbHVlRXJyb3IpOgogICAgIiIiCiAgICBBbiBpbnZhbGlkIG1hcmtlciB3YXMgZm91bmQsIHVzZXJzIHNob3VsZCByZWZlciB0byBQRVAgNTA4LgogICAgIiIiCgoKY2xhc3MgVW5kZWZpbmVkQ29tcGFyaXNvbihWYWx1ZUVycm9yKToKICAgICIiIgogICAgQW4gaW52YWxpZCBvcGVyYXRpb24gd2FzIGF0dGVtcHRlZCBvbiBhIHZhbHVlIHRoYXQgZG9lc24ndCBzdXBwb3J0IGl0LgogICAgIiIiCgoKY2xhc3MgVW5kZWZpbmVkRW52aXJvbm1lbnROYW1lKFZhbHVlRXJyb3IpOgogICAgIiIiCiAgICBBIG5hbWUgd2FzIGF0dGVtcHRlZCB0byBiZSB1c2VkIHRoYXQgZG9lcyBub3QgZXhpc3QgaW5zaWRlIG9mIHRoZQogICAgZW52aXJvbm1lbnQuCiAgICAiIiIKCgpjbGFzcyBOb2RlKG9iamVjdCk6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHZhbHVlKToKICAgICAgICBzZWxmLnZhbHVlID0gdmFsdWUKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gc3RyKHNlbGYudmFsdWUpCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiPHswfSh7MSFyfSk+Ii5mb3JtYXQoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHN0cihzZWxmKSkKCiAgICBkZWYgc2VyaWFsaXplKHNlbGYpOgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKCgpjbGFzcyBWYXJpYWJsZShOb2RlKToKCiAgICBkZWYgc2VyaWFsaXplKHNlbGYpOgogICAgICAgIHJldHVybiBzdHIoc2VsZikKCgpjbGFzcyBWYWx1ZShOb2RlKToKCiAgICBkZWYgc2VyaWFsaXplKHNlbGYpOgogICAgICAgIHJldHVybiAnInswfSInLmZvcm1hdChzZWxmKQoKCmNsYXNzIE9wKE5vZGUpOgoKICAgIGRlZiBzZXJpYWxpemUoc2VsZik6CiAgICAgICAgcmV0dXJuIHN0cihzZWxmKQoKClZBUklBQkxFID0gKAogICAgTCgiaW1wbGVtZW50YXRpb25fdmVyc2lvbiIpIHwKICAgIEwoInBsYXRmb3JtX3B5dGhvbl9pbXBsZW1lbnRhdGlvbiIpIHwKICAgIEwoImltcGxlbWVudGF0aW9uX25hbWUiKSB8CiAgICBMKCJweXRob25fZnVsbF92ZXJzaW9uIikgfAogICAgTCgicGxhdGZvcm1fcmVsZWFzZSIpIHwKICAgIEwoInBsYXRmb3JtX3ZlcnNpb24iKSB8CiAgICBMKCJwbGF0Zm9ybV9tYWNoaW5lIikgfAogICAgTCgicGxhdGZvcm1fc3lzdGVtIikgfAogICAgTCgicHl0aG9uX3ZlcnNpb24iKSB8CiAgICBMKCJzeXNfcGxhdGZvcm0iKSB8CiAgICBMKCJvc19uYW1lIikgfAogICAgTCgib3MubmFtZSIpIHwgICMgUEVQLTM0NQogICAgTCgic3lzLnBsYXRmb3JtIikgfCAgIyBQRVAtMzQ1CiAgICBMKCJwbGF0Zm9ybS52ZXJzaW9uIikgfCAgIyBQRVAtMzQ1CiAgICBMKCJwbGF0Zm9ybS5tYWNoaW5lIikgfCAgIyBQRVAtMzQ1CiAgICBMKCJwbGF0Zm9ybS5weXRob25faW1wbGVtZW50YXRpb24iKSB8ICAjIFBFUC0zNDUKICAgIEwoInB5dGhvbl9pbXBsZW1lbnRhdGlvbiIpIHwgICMgdW5kb2N1bWVudGVkIHNldHVwdG9vbHMgbGVnYWN5CiAgICBMKCJleHRyYSIpCikKQUxJQVNFUyA9IHsKICAgICdvcy5uYW1lJzogJ29zX25hbWUnLAogICAgJ3N5cy5wbGF0Zm9ybSc6ICdzeXNfcGxhdGZvcm0nLAogICAgJ3BsYXRmb3JtLnZlcnNpb24nOiAncGxhdGZvcm1fdmVyc2lvbicsCiAgICAncGxhdGZvcm0ubWFjaGluZSc6ICdwbGF0Zm9ybV9tYWNoaW5lJywKICAgICdwbGF0Zm9ybS5weXRob25faW1wbGVtZW50YXRpb24nOiAncGxhdGZvcm1fcHl0aG9uX2ltcGxlbWVudGF0aW9uJywKICAgICdweXRob25faW1wbGVtZW50YXRpb24nOiAncGxhdGZvcm1fcHl0aG9uX2ltcGxlbWVudGF0aW9uJwp9ClZBUklBQkxFLnNldFBhcnNlQWN0aW9uKGxhbWJkYSBzLCBsLCB0OiBWYXJpYWJsZShBTElBU0VTLmdldCh0WzBdLCB0WzBdKSkpCgpWRVJTSU9OX0NNUCA9ICgKICAgIEwoIj09PSIpIHwKICAgIEwoIj09IikgfAogICAgTCgiPj0iKSB8CiAgICBMKCI8PSIpIHwKICAgIEwoIiE9IikgfAogICAgTCgifj0iKSB8CiAgICBMKCI+IikgfAogICAgTCgiPCIpCikKCk1BUktFUl9PUCA9IFZFUlNJT05fQ01QIHwgTCgibm90IGluIikgfCBMKCJpbiIpCk1BUktFUl9PUC5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcywgbCwgdDogT3AodFswXSkpCgpNQVJLRVJfVkFMVUUgPSBRdW90ZWRTdHJpbmcoIiciKSB8IFF1b3RlZFN0cmluZygnIicpCk1BUktFUl9WQUxVRS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcywgbCwgdDogVmFsdWUodFswXSkpCgpCT09MT1AgPSBMKCJhbmQiKSB8IEwoIm9yIikKCk1BUktFUl9WQVIgPSBWQVJJQUJMRSB8IE1BUktFUl9WQUxVRQoKTUFSS0VSX0lURU0gPSBHcm91cChNQVJLRVJfVkFSICsgTUFSS0VSX09QICsgTUFSS0VSX1ZBUikKTUFSS0VSX0lURU0uc2V0UGFyc2VBY3Rpb24obGFtYmRhIHMsIGwsIHQ6IHR1cGxlKHRbMF0pKQoKTFBBUkVOID0gTCgiKCIpLnN1cHByZXNzKCkKUlBBUkVOID0gTCgiKSIpLnN1cHByZXNzKCkKCk1BUktFUl9FWFBSID0gRm9yd2FyZCgpCk1BUktFUl9BVE9NID0gTUFSS0VSX0lURU0gfCBHcm91cChMUEFSRU4gKyBNQVJLRVJfRVhQUiArIFJQQVJFTikKTUFSS0VSX0VYUFIgPDwgTUFSS0VSX0FUT00gKyBaZXJvT3JNb3JlKEJPT0xPUCArIE1BUktFUl9FWFBSKQoKTUFSS0VSID0gc3RyaW5nU3RhcnQgKyBNQVJLRVJfRVhQUiArIHN0cmluZ0VuZAoKCmRlZiBfY29lcmNlX3BhcnNlX3Jlc3VsdChyZXN1bHRzKToKICAgIGlmIGlzaW5zdGFuY2UocmVzdWx0cywgUGFyc2VSZXN1bHRzKToKICAgICAgICByZXR1cm4gW19jb2VyY2VfcGFyc2VfcmVzdWx0KGkpIGZvciBpIGluIHJlc3VsdHNdCiAgICBlbHNlOgogICAgICAgIHJldHVybiByZXN1bHRzCgoKZGVmIF9mb3JtYXRfbWFya2VyKG1hcmtlciwgZmlyc3Q9VHJ1ZSk6CiAgICBhc3NlcnQgaXNpbnN0YW5jZShtYXJrZXIsIChsaXN0LCB0dXBsZSwgc3RyaW5nX3R5cGVzKSkKCiAgICAjIFNvbWV0aW1lcyB3ZSBoYXZlIGEgc3RydWN0dXJlIGxpa2UgW1suLi5dXSB3aGljaCBpcyBhIHNpbmdsZSBpdGVtIGxpc3QKICAgICMgd2hlcmUgdGhlIHNpbmdsZSBpdGVtIGlzIGl0c2VsZiBpdCdzIG93biBsaXN0LiBJbiB0aGF0IGNhc2Ugd2Ugd2FudCBza2lwCiAgICAjIHRoZSByZXN0IG9mIHRoaXMgZnVuY3Rpb24gc28gdGhhdCB3ZSBkb24ndCBnZXQgZXh0cmFuZW91cyAoKSBvbiB0aGUKICAgICMgb3V0c2lkZS4KICAgIGlmIChpc2luc3RhbmNlKG1hcmtlciwgbGlzdCkgYW5kIGxlbihtYXJrZXIpID09IDEgYW5kCiAgICAgICAgICAgIGlzaW5zdGFuY2UobWFya2VyWzBdLCAobGlzdCwgdHVwbGUpKSk6CiAgICAgICAgcmV0dXJuIF9mb3JtYXRfbWFya2VyKG1hcmtlclswXSkKCiAgICBpZiBpc2luc3RhbmNlKG1hcmtlciwgbGlzdCk6CiAgICAgICAgaW5uZXIgPSAoX2Zvcm1hdF9tYXJrZXIobSwgZmlyc3Q9RmFsc2UpIGZvciBtIGluIG1hcmtlcikKICAgICAgICBpZiBmaXJzdDoKICAgICAgICAgICAgcmV0dXJuICIgIi5qb2luKGlubmVyKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiAiKCIgKyAiICIuam9pbihpbm5lcikgKyAiKSIKICAgIGVsaWYgaXNpbnN0YW5jZShtYXJrZXIsIHR1cGxlKToKICAgICAgICByZXR1cm4gIiAiLmpvaW4oW20uc2VyaWFsaXplKCkgZm9yIG0gaW4gbWFya2VyXSkKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIG1hcmtlcgoKCl9vcGVyYXRvcnMgPSB7CiAgICAiaW4iOiBsYW1iZGEgbGhzLCByaHM6IGxocyBpbiByaHMsCiAgICAibm90IGluIjogbGFtYmRhIGxocywgcmhzOiBsaHMgbm90IGluIHJocywKICAgICI8Ijogb3BlcmF0b3IubHQsCiAgICAiPD0iOiBvcGVyYXRvci5sZSwKICAgICI9PSI6IG9wZXJhdG9yLmVxLAogICAgIiE9Ijogb3BlcmF0b3IubmUsCiAgICAiPj0iOiBvcGVyYXRvci5nZSwKICAgICI+Ijogb3BlcmF0b3IuZ3QsCn0KCgpkZWYgX2V2YWxfb3AobGhzLCBvcCwgcmhzKToKICAgIHRyeToKICAgICAgICBzcGVjID0gU3BlY2lmaWVyKCIiLmpvaW4oW29wLnNlcmlhbGl6ZSgpLCByaHNdKSkKICAgIGV4Y2VwdCBJbnZhbGlkU3BlY2lmaWVyOgogICAgICAgIHBhc3MKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIHNwZWMuY29udGFpbnMobGhzKQoKICAgIG9wZXIgPSBfb3BlcmF0b3JzLmdldChvcC5zZXJpYWxpemUoKSkKICAgIGlmIG9wZXIgaXMgTm9uZToKICAgICAgICByYWlzZSBVbmRlZmluZWRDb21wYXJpc29uKAogICAgICAgICAgICAiVW5kZWZpbmVkIHswIXJ9IG9uIHsxIXJ9IGFuZCB7MiFyfS4iLmZvcm1hdChvcCwgbGhzLCByaHMpCiAgICAgICAgKQoKICAgIHJldHVybiBvcGVyKGxocywgcmhzKQoKCl91bmRlZmluZWQgPSBvYmplY3QoKQoKCmRlZiBfZ2V0X2VudihlbnZpcm9ubWVudCwgbmFtZSk6CiAgICB2YWx1ZSA9IGVudmlyb25tZW50LmdldChuYW1lLCBfdW5kZWZpbmVkKQoKICAgIGlmIHZhbHVlIGlzIF91bmRlZmluZWQ6CiAgICAgICAgcmFpc2UgVW5kZWZpbmVkRW52aXJvbm1lbnROYW1lKAogICAgICAgICAgICAiezAhcn0gZG9lcyBub3QgZXhpc3QgaW4gZXZhbHVhdGlvbiBlbnZpcm9ubWVudC4iLmZvcm1hdChuYW1lKQogICAgICAgICkKCiAgICByZXR1cm4gdmFsdWUKCgpkZWYgX2V2YWx1YXRlX21hcmtlcnMobWFya2VycywgZW52aXJvbm1lbnQpOgogICAgZ3JvdXBzID0gW1tdXQoKICAgIGZvciBtYXJrZXIgaW4gbWFya2VyczoKICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShtYXJrZXIsIChsaXN0LCB0dXBsZSwgc3RyaW5nX3R5cGVzKSkKCiAgICAgICAgaWYgaXNpbnN0YW5jZShtYXJrZXIsIGxpc3QpOgogICAgICAgICAgICBncm91cHNbLTFdLmFwcGVuZChfZXZhbHVhdGVfbWFya2VycyhtYXJrZXIsIGVudmlyb25tZW50KSkKICAgICAgICBlbGlmIGlzaW5zdGFuY2UobWFya2VyLCB0dXBsZSk6CiAgICAgICAgICAgIGxocywgb3AsIHJocyA9IG1hcmtlcgoKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShsaHMsIFZhcmlhYmxlKToKICAgICAgICAgICAgICAgIGxoc192YWx1ZSA9IF9nZXRfZW52KGVudmlyb25tZW50LCBsaHMudmFsdWUpCiAgICAgICAgICAgICAgICByaHNfdmFsdWUgPSByaHMudmFsdWUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGxoc192YWx1ZSA9IGxocy52YWx1ZQogICAgICAgICAgICAgICAgcmhzX3ZhbHVlID0gX2dldF9lbnYoZW52aXJvbm1lbnQsIHJocy52YWx1ZSkKCiAgICAgICAgICAgIGdyb3Vwc1stMV0uYXBwZW5kKF9ldmFsX29wKGxoc192YWx1ZSwgb3AsIHJoc192YWx1ZSkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgYXNzZXJ0IG1hcmtlciBpbiBbImFuZCIsICJvciJdCiAgICAgICAgICAgIGlmIG1hcmtlciA9PSAib3IiOgogICAgICAgICAgICAgICAgZ3JvdXBzLmFwcGVuZChbXSkKCiAgICByZXR1cm4gYW55KGFsbChpdGVtKSBmb3IgaXRlbSBpbiBncm91cHMpCgoKZGVmIGZvcm1hdF9mdWxsX3ZlcnNpb24oaW5mbyk6CiAgICB2ZXJzaW9uID0gJ3swLm1ham9yfS57MC5taW5vcn0uezAubWljcm99Jy5mb3JtYXQoaW5mbykKICAgIGtpbmQgPSBpbmZvLnJlbGVhc2VsZXZlbAogICAgaWYga2luZCAhPSAnZmluYWwnOgogICAgICAgIHZlcnNpb24gKz0ga2luZFswXSArIHN0cihpbmZvLnNlcmlhbCkKICAgIHJldHVybiB2ZXJzaW9uCgoKZGVmIGRlZmF1bHRfZW52aXJvbm1lbnQoKToKICAgIGlmIGhhc2F0dHIoc3lzLCAnaW1wbGVtZW50YXRpb24nKToKICAgICAgICBpdmVyID0gZm9ybWF0X2Z1bGxfdmVyc2lvbihzeXMuaW1wbGVtZW50YXRpb24udmVyc2lvbikKICAgICAgICBpbXBsZW1lbnRhdGlvbl9uYW1lID0gc3lzLmltcGxlbWVudGF0aW9uLm5hbWUKICAgIGVsc2U6CiAgICAgICAgaXZlciA9ICcwJwogICAgICAgIGltcGxlbWVudGF0aW9uX25hbWUgPSAnJwoKICAgIHJldHVybiB7CiAgICAgICAgImltcGxlbWVudGF0aW9uX25hbWUiOiBpbXBsZW1lbnRhdGlvbl9uYW1lLAogICAgICAgICJpbXBsZW1lbnRhdGlvbl92ZXJzaW9uIjogaXZlciwKICAgICAgICAib3NfbmFtZSI6IG9zLm5hbWUsCiAgICAgICAgInBsYXRmb3JtX21hY2hpbmUiOiBwbGF0Zm9ybS5tYWNoaW5lKCksCiAgICAgICAgInBsYXRmb3JtX3JlbGVhc2UiOiBwbGF0Zm9ybS5yZWxlYXNlKCksCiAgICAgICAgInBsYXRmb3JtX3N5c3RlbSI6IHBsYXRmb3JtLnN5c3RlbSgpLAogICAgICAgICJwbGF0Zm9ybV92ZXJzaW9uIjogcGxhdGZvcm0udmVyc2lvbigpLAogICAgICAgICJweXRob25fZnVsbF92ZXJzaW9uIjogcGxhdGZvcm0ucHl0aG9uX3ZlcnNpb24oKSwKICAgICAgICAicGxhdGZvcm1fcHl0aG9uX2ltcGxlbWVudGF0aW9uIjogcGxhdGZvcm0ucHl0aG9uX2ltcGxlbWVudGF0aW9uKCksCiAgICAgICAgInB5dGhvbl92ZXJzaW9uIjogcGxhdGZvcm0ucHl0aG9uX3ZlcnNpb24oKVs6M10sCiAgICAgICAgInN5c19wbGF0Zm9ybSI6IHN5cy5wbGF0Zm9ybSwKICAgIH0KCgpjbGFzcyBNYXJrZXIob2JqZWN0KToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbWFya2VyKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYuX21hcmtlcnMgPSBfY29lcmNlX3BhcnNlX3Jlc3VsdChNQVJLRVIucGFyc2VTdHJpbmcobWFya2VyKSkKICAgICAgICBleGNlcHQgUGFyc2VFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgZXJyX3N0ciA9ICJJbnZhbGlkIG1hcmtlcjogezAhcn0sIHBhcnNlIGVycm9yIGF0IHsxIXJ9Ii5mb3JtYXQoCiAgICAgICAgICAgICAgICBtYXJrZXIsIG1hcmtlcltlLmxvYzplLmxvYyArIDhdKQogICAgICAgICAgICByYWlzZSBJbnZhbGlkTWFya2VyKGVycl9zdHIpCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIF9mb3JtYXRfbWFya2VyKHNlbGYuX21hcmtlcnMpCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiPE1hcmtlcih7MCFyfSk+Ii5mb3JtYXQoc3RyKHNlbGYpKQoKICAgIGRlZiBldmFsdWF0ZShzZWxmLCBlbnZpcm9ubWVudD1Ob25lKToKICAgICAgICAiIiJFdmFsdWF0ZSBhIG1hcmtlci4KCiAgICAgICAgUmV0dXJuIHRoZSBib29sZWFuIGZyb20gZXZhbHVhdGluZyB0aGUgZ2l2ZW4gbWFya2VyIGFnYWluc3QgdGhlCiAgICAgICAgZW52aXJvbm1lbnQuIGVudmlyb25tZW50IGlzIGFuIG9wdGlvbmFsIGFyZ3VtZW50IHRvIG92ZXJyaWRlIGFsbCBvcgogICAgICAgIHBhcnQgb2YgdGhlIGRldGVybWluZWQgZW52aXJvbm1lbnQuCgogICAgICAgIFRoZSBlbnZpcm9ubWVudCBpcyBkZXRlcm1pbmVkIGZyb20gdGhlIGN1cnJlbnQgUHl0aG9uIHByb2Nlc3MuCiAgICAgICAgIiIiCiAgICAgICAgY3VycmVudF9lbnZpcm9ubWVudCA9IGRlZmF1bHRfZW52aXJvbm1lbnQoKQogICAgICAgIGlmIGVudmlyb25tZW50IGlzIG5vdCBOb25lOgogICAgICAgICAgICBjdXJyZW50X2Vudmlyb25tZW50LnVwZGF0ZShlbnZpcm9ubWVudCkKCiAgICAgICAgcmV0dXJuIF9ldmFsdWF0ZV9tYXJrZXJzKHNlbGYuX21hcmtlcnMsIGN1cnJlbnRfZW52aXJvbm1lbnQpClBLAwQUAAAAAAAAACEArhGf8+cQAADnEAAAQgAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcGFja2FnaW5nL3JlcXVpcmVtZW50cy5weSMgVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbgojIDIuMCwgYW5kIHRoZSBCU0QgTGljZW5zZS4gU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyByZXBvc2l0b3J5CiMgZm9yIGNvbXBsZXRlIGRldGFpbHMuCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgcHJpbnRfZnVuY3Rpb24KCmltcG9ydCBzdHJpbmcKaW1wb3J0IHJlCgpmcm9tIHBpcC5fdmVuZG9yLnB5cGFyc2luZyBpbXBvcnQgKAogICAgc3RyaW5nU3RhcnQsIHN0cmluZ0VuZCwgb3JpZ2luYWxUZXh0Rm9yLCBQYXJzZUV4Y2VwdGlvbgopCmZyb20gcGlwLl92ZW5kb3IucHlwYXJzaW5nIGltcG9ydCBaZXJvT3JNb3JlLCBXb3JkLCBPcHRpb25hbCwgUmVnZXgsIENvbWJpbmUKZnJvbSBwaXAuX3ZlbmRvci5weXBhcnNpbmcgaW1wb3J0IExpdGVyYWwgYXMgTCAgIyBub3FhCmZyb20gcGlwLl92ZW5kb3Iuc2l4Lm1vdmVzLnVybGxpYiBpbXBvcnQgcGFyc2UgYXMgdXJscGFyc2UKCmZyb20gLm1hcmtlcnMgaW1wb3J0IE1BUktFUl9FWFBSLCBNYXJrZXIKZnJvbSAuc3BlY2lmaWVycyBpbXBvcnQgTGVnYWN5U3BlY2lmaWVyLCBTcGVjaWZpZXIsIFNwZWNpZmllclNldAoKCmNsYXNzIEludmFsaWRSZXF1aXJlbWVudChWYWx1ZUVycm9yKToKICAgICIiIgogICAgQW4gaW52YWxpZCByZXF1aXJlbWVudCB3YXMgZm91bmQsIHVzZXJzIHNob3VsZCByZWZlciB0byBQRVAgNTA4LgogICAgIiIiCgoKQUxQSEFOVU0gPSBXb3JkKHN0cmluZy5hc2NpaV9sZXR0ZXJzICsgc3RyaW5nLmRpZ2l0cykKCkxCUkFDS0VUID0gTCgiWyIpLnN1cHByZXNzKCkKUkJSQUNLRVQgPSBMKCJdIikuc3VwcHJlc3MoKQpMUEFSRU4gPSBMKCIoIikuc3VwcHJlc3MoKQpSUEFSRU4gPSBMKCIpIikuc3VwcHJlc3MoKQpDT01NQSA9IEwoIiwiKS5zdXBwcmVzcygpClNFTUlDT0xPTiA9IEwoIjsiKS5zdXBwcmVzcygpCkFUID0gTCgiQCIpLnN1cHByZXNzKCkKClBVTkNUVUFUSU9OID0gV29yZCgiLV8uIikKSURFTlRJRklFUl9FTkQgPSBBTFBIQU5VTSB8IChaZXJvT3JNb3JlKFBVTkNUVUFUSU9OKSArIEFMUEhBTlVNKQpJREVOVElGSUVSID0gQ29tYmluZShBTFBIQU5VTSArIFplcm9Pck1vcmUoSURFTlRJRklFUl9FTkQpKQoKTkFNRSA9IElERU5USUZJRVIoIm5hbWUiKQpFWFRSQSA9IElERU5USUZJRVIKClVSSSA9IFJlZ2V4KHInW14gXSsnKSgidXJsIikKVVJMID0gKEFUICsgVVJJKQoKRVhUUkFTX0xJU1QgPSBFWFRSQSArIFplcm9Pck1vcmUoQ09NTUEgKyBFWFRSQSkKRVhUUkFTID0gKExCUkFDS0VUICsgT3B0aW9uYWwoRVhUUkFTX0xJU1QpICsgUkJSQUNLRVQpKCJleHRyYXMiKQoKVkVSU0lPTl9QRVA0NDAgPSBSZWdleChTcGVjaWZpZXIuX3JlZ2V4X3N0ciwgcmUuVkVSQk9TRSB8IHJlLklHTk9SRUNBU0UpClZFUlNJT05fTEVHQUNZID0gUmVnZXgoTGVnYWN5U3BlY2lmaWVyLl9yZWdleF9zdHIsIHJlLlZFUkJPU0UgfCByZS5JR05PUkVDQVNFKQoKVkVSU0lPTl9PTkUgPSBWRVJTSU9OX1BFUDQ0MCBeIFZFUlNJT05fTEVHQUNZClZFUlNJT05fTUFOWSA9IENvbWJpbmUoVkVSU0lPTl9PTkUgKyBaZXJvT3JNb3JlKENPTU1BICsgVkVSU0lPTl9PTkUpLAogICAgICAgICAgICAgICAgICAgICAgIGpvaW5TdHJpbmc9IiwiLCBhZGphY2VudD1GYWxzZSkoIl9yYXdfc3BlYyIpCl9WRVJTSU9OX1NQRUMgPSBPcHRpb25hbCgoKExQQVJFTiArIFZFUlNJT05fTUFOWSArIFJQQVJFTikgfCBWRVJTSU9OX01BTlkpKQpfVkVSU0lPTl9TUEVDLnNldFBhcnNlQWN0aW9uKGxhbWJkYSBzLCBsLCB0OiB0Ll9yYXdfc3BlYyBvciAnJykKClZFUlNJT05fU1BFQyA9IG9yaWdpbmFsVGV4dEZvcihfVkVSU0lPTl9TUEVDKSgic3BlY2lmaWVyIikKVkVSU0lPTl9TUEVDLnNldFBhcnNlQWN0aW9uKGxhbWJkYSBzLCBsLCB0OiB0WzFdKQoKTUFSS0VSX0VYUFIgPSBvcmlnaW5hbFRleHRGb3IoTUFSS0VSX0VYUFIoKSkoIm1hcmtlciIpCk1BUktFUl9FWFBSLnNldFBhcnNlQWN0aW9uKAogICAgbGFtYmRhIHMsIGwsIHQ6IE1hcmtlcihzW3QuX29yaWdpbmFsX3N0YXJ0OnQuX29yaWdpbmFsX2VuZF0pCikKTUFSS0VSX1NFUEVSQVRPUiA9IFNFTUlDT0xPTgpNQVJLRVIgPSBNQVJLRVJfU0VQRVJBVE9SICsgTUFSS0VSX0VYUFIKClZFUlNJT05fQU5EX01BUktFUiA9IFZFUlNJT05fU1BFQyArIE9wdGlvbmFsKE1BUktFUikKVVJMX0FORF9NQVJLRVIgPSBVUkwgKyBPcHRpb25hbChNQVJLRVIpCgpOQU1FRF9SRVFVSVJFTUVOVCA9IFwKICAgIE5BTUUgKyBPcHRpb25hbChFWFRSQVMpICsgKFVSTF9BTkRfTUFSS0VSIHwgVkVSU0lPTl9BTkRfTUFSS0VSKQoKUkVRVUlSRU1FTlQgPSBzdHJpbmdTdGFydCArIE5BTUVEX1JFUVVJUkVNRU5UICsgc3RyaW5nRW5kCgoKY2xhc3MgUmVxdWlyZW1lbnQob2JqZWN0KToKICAgICIiIlBhcnNlIGEgcmVxdWlyZW1lbnQuCgogICAgUGFyc2UgYSBnaXZlbiByZXF1aXJlbWVudCBzdHJpbmcgaW50byBpdHMgcGFydHMsIHN1Y2ggYXMgbmFtZSwgc3BlY2lmaWVyLAogICAgVVJMLCBhbmQgZXh0cmFzLiBSYWlzZXMgSW52YWxpZFJlcXVpcmVtZW50IG9uIGEgYmFkbHktZm9ybWVkIHJlcXVpcmVtZW50CiAgICBzdHJpbmcuCiAgICAiIiIKCiAgICAjIFRPRE86IENhbiB3ZSB0ZXN0IHdoZXRoZXIgc29tZXRoaW5nIGlzIGNvbnRhaW5lZCB3aXRoaW4gYSByZXF1aXJlbWVudD8KICAgICMgICAgICAgSWYgc28gaG93IGRvIHdlIGRvIHRoYXQ/IERvIHdlIG5lZWQgdG8gdGVzdCBhZ2FpbnN0IHRoZSBfbmFtZV8gb2YKICAgICMgICAgICAgdGhlIHRoaW5nIGFzIHdlbGwgYXMgdGhlIHZlcnNpb24/IFdoYXQgYWJvdXQgdGhlIG1hcmtlcnM/CiAgICAjIFRPRE86IENhbiB3ZSBub3JtYWxpemUgdGhlIG5hbWUgYW5kIGV4dHJhIG5hbWU/CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHJlcXVpcmVtZW50X3N0cmluZyk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXEgPSBSRVFVSVJFTUVOVC5wYXJzZVN0cmluZyhyZXF1aXJlbWVudF9zdHJpbmcpCiAgICAgICAgZXhjZXB0IFBhcnNlRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgIHJhaXNlIEludmFsaWRSZXF1aXJlbWVudCgKICAgICAgICAgICAgICAgICJJbnZhbGlkIHJlcXVpcmVtZW50LCBwYXJzZSBlcnJvciBhdCBcInswIXJ9XCIiLmZvcm1hdCgKICAgICAgICAgICAgICAgICAgICByZXF1aXJlbWVudF9zdHJpbmdbZS5sb2M6ZS5sb2MgKyA4XSkpCgogICAgICAgIHNlbGYubmFtZSA9IHJlcS5uYW1lCiAgICAgICAgaWYgcmVxLnVybDoKICAgICAgICAgICAgcGFyc2VkX3VybCA9IHVybHBhcnNlLnVybHBhcnNlKHJlcS51cmwpCiAgICAgICAgICAgIGlmIG5vdCAocGFyc2VkX3VybC5zY2hlbWUgYW5kIHBhcnNlZF91cmwubmV0bG9jKSBvciAoCiAgICAgICAgICAgICAgICAgICAgbm90IHBhcnNlZF91cmwuc2NoZW1lIGFuZCBub3QgcGFyc2VkX3VybC5uZXRsb2MpOgogICAgICAgICAgICAgICAgcmFpc2UgSW52YWxpZFJlcXVpcmVtZW50KCJJbnZhbGlkIFVSTCBnaXZlbiIpCiAgICAgICAgICAgIHNlbGYudXJsID0gcmVxLnVybAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYudXJsID0gTm9uZQogICAgICAgIHNlbGYuZXh0cmFzID0gc2V0KHJlcS5leHRyYXMuYXNMaXN0KCkgaWYgcmVxLmV4dHJhcyBlbHNlIFtdKQogICAgICAgIHNlbGYuc3BlY2lmaWVyID0gU3BlY2lmaWVyU2V0KHJlcS5zcGVjaWZpZXIpCiAgICAgICAgc2VsZi5tYXJrZXIgPSByZXEubWFya2VyIGlmIHJlcS5tYXJrZXIgZWxzZSBOb25lCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcGFydHMgPSBbc2VsZi5uYW1lXQoKICAgICAgICBpZiBzZWxmLmV4dHJhczoKICAgICAgICAgICAgcGFydHMuYXBwZW5kKCJbezB9XSIuZm9ybWF0KCIsIi5qb2luKHNvcnRlZChzZWxmLmV4dHJhcykpKSkKCiAgICAgICAgaWYgc2VsZi5zcGVjaWZpZXI6CiAgICAgICAgICAgIHBhcnRzLmFwcGVuZChzdHIoc2VsZi5zcGVjaWZpZXIpKQoKICAgICAgICBpZiBzZWxmLnVybDoKICAgICAgICAgICAgcGFydHMuYXBwZW5kKCJAIHswfSIuZm9ybWF0KHNlbGYudXJsKSkKCiAgICAgICAgaWYgc2VsZi5tYXJrZXI6CiAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgiOyB7MH0iLmZvcm1hdChzZWxmLm1hcmtlcikpCgogICAgICAgIHJldHVybiAiIi5qb2luKHBhcnRzKQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIjxSZXF1aXJlbWVudCh7MCFyfSk+Ii5mb3JtYXQoc3RyKHNlbGYpKQpQSwMEFAAAAAAAAAAhAHxFg4x5bQAAeW0AAEAAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3BhY2thZ2luZy9zcGVjaWZpZXJzLnB5IyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uCiMgMi4wLCBhbmQgdGhlIEJTRCBMaWNlbnNlLiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHJlcG9zaXRvcnkKIyBmb3IgY29tcGxldGUgZGV0YWlscy4KZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCBwcmludF9mdW5jdGlvbgoKaW1wb3J0IGFiYwppbXBvcnQgZnVuY3Rvb2xzCmltcG9ydCBpdGVydG9vbHMKaW1wb3J0IHJlCgpmcm9tIC5fY29tcGF0IGltcG9ydCBzdHJpbmdfdHlwZXMsIHdpdGhfbWV0YWNsYXNzCmZyb20gLnZlcnNpb24gaW1wb3J0IFZlcnNpb24sIExlZ2FjeVZlcnNpb24sIHBhcnNlCgoKY2xhc3MgSW52YWxpZFNwZWNpZmllcihWYWx1ZUVycm9yKToKICAgICIiIgogICAgQW4gaW52YWxpZCBzcGVjaWZpZXIgd2FzIGZvdW5kLCB1c2VycyBzaG91bGQgcmVmZXIgdG8gUEVQIDQ0MC4KICAgICIiIgoKCmNsYXNzIEJhc2VTcGVjaWZpZXIod2l0aF9tZXRhY2xhc3MoYWJjLkFCQ01ldGEsIG9iamVjdCkpOgoKICAgIEBhYmMuYWJzdHJhY3RtZXRob2QKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJldHVybnMgdGhlIHN0ciByZXByZXNlbnRhdGlvbiBvZiB0aGlzIFNwZWNpZmllciBsaWtlIG9iamVjdC4gVGhpcwogICAgICAgIHNob3VsZCBiZSByZXByZXNlbnRhdGl2ZSBvZiB0aGUgU3BlY2lmaWVyIGl0c2VsZi4KICAgICAgICAiIiIKCiAgICBAYWJjLmFic3RyYWN0bWV0aG9kCiAgICBkZWYgX19oYXNoX18oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJucyBhIGhhc2ggdmFsdWUgZm9yIHRoaXMgU3BlY2lmaWVyIGxpa2Ugb2JqZWN0LgogICAgICAgICIiIgoKICAgIEBhYmMuYWJzdHJhY3RtZXRob2QKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgICIiIgogICAgICAgIFJldHVybnMgYSBib29sZWFuIHJlcHJlc2VudGluZyB3aGV0aGVyIG9yIG5vdCB0aGUgdHdvIFNwZWNpZmllciBsaWtlCiAgICAgICAgb2JqZWN0cyBhcmUgZXF1YWwuCiAgICAgICAgIiIiCgogICAgQGFiYy5hYnN0cmFjdG1ldGhvZAogICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJucyBhIGJvb2xlYW4gcmVwcmVzZW50aW5nIHdoZXRoZXIgb3Igbm90IHRoZSB0d28gU3BlY2lmaWVyIGxpa2UKICAgICAgICBvYmplY3RzIGFyZSBub3QgZXF1YWwuCiAgICAgICAgIiIiCgogICAgQGFiYy5hYnN0cmFjdHByb3BlcnR5CiAgICBkZWYgcHJlcmVsZWFzZXMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJucyB3aGV0aGVyIG9yIG5vdCBwcmUtcmVsZWFzZXMgYXMgYSB3aG9sZSBhcmUgYWxsb3dlZCBieSB0aGlzCiAgICAgICAgc3BlY2lmaWVyLgogICAgICAgICIiIgoKICAgIEBwcmVyZWxlYXNlcy5zZXR0ZXIKICAgIGRlZiBwcmVyZWxlYXNlcyhzZWxmLCB2YWx1ZSk6CiAgICAgICAgIiIiCiAgICAgICAgU2V0cyB3aGV0aGVyIG9yIG5vdCBwcmUtcmVsZWFzZXMgYXMgYSB3aG9sZSBhcmUgYWxsb3dlZCBieSB0aGlzCiAgICAgICAgc3BlY2lmaWVyLgogICAgICAgICIiIgoKICAgIEBhYmMuYWJzdHJhY3RtZXRob2QKICAgIGRlZiBjb250YWlucyhzZWxmLCBpdGVtLCBwcmVyZWxlYXNlcz1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBEZXRlcm1pbmVzIGlmIHRoZSBnaXZlbiBpdGVtIGlzIGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBzcGVjaWZpZXIuCiAgICAgICAgIiIiCgogICAgQGFiYy5hYnN0cmFjdG1ldGhvZAogICAgZGVmIGZpbHRlcihzZWxmLCBpdGVyYWJsZSwgcHJlcmVsZWFzZXM9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgVGFrZXMgYW4gaXRlcmFibGUgb2YgaXRlbXMgYW5kIGZpbHRlcnMgdGhlbSBzbyB0aGF0IG9ubHkgaXRlbXMgd2hpY2gKICAgICAgICBhcmUgY29udGFpbmVkIHdpdGhpbiB0aGlzIHNwZWNpZmllciBhcmUgYWxsb3dlZCBpbiBpdC4KICAgICAgICAiIiIKCgpjbGFzcyBfSW5kaXZpZHVhbFNwZWNpZmllcihCYXNlU3BlY2lmaWVyKToKCiAgICBfb3BlcmF0b3JzID0ge30KCiAgICBkZWYgX19pbml0X18oc2VsZiwgc3BlYz0iIiwgcHJlcmVsZWFzZXM9Tm9uZSk6CiAgICAgICAgbWF0Y2ggPSBzZWxmLl9yZWdleC5zZWFyY2goc3BlYykKICAgICAgICBpZiBub3QgbWF0Y2g6CiAgICAgICAgICAgIHJhaXNlIEludmFsaWRTcGVjaWZpZXIoIkludmFsaWQgc3BlY2lmaWVyOiAnezB9JyIuZm9ybWF0KHNwZWMpKQoKICAgICAgICBzZWxmLl9zcGVjID0gKAogICAgICAgICAgICBtYXRjaC5ncm91cCgib3BlcmF0b3IiKS5zdHJpcCgpLAogICAgICAgICAgICBtYXRjaC5ncm91cCgidmVyc2lvbiIpLnN0cmlwKCksCiAgICAgICAgKQoKICAgICAgICAjIFN0b3JlIHdoZXRoZXIgb3Igbm90IHRoaXMgU3BlY2lmaWVyIHNob3VsZCBhY2NlcHQgcHJlcmVsZWFzZXMKICAgICAgICBzZWxmLl9wcmVyZWxlYXNlcyA9IHByZXJlbGVhc2VzCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHByZSA9ICgKICAgICAgICAgICAgIiwgcHJlcmVsZWFzZXM9ezAhcn0iLmZvcm1hdChzZWxmLnByZXJlbGVhc2VzKQogICAgICAgICAgICBpZiBzZWxmLl9wcmVyZWxlYXNlcyBpcyBub3QgTm9uZQogICAgICAgICAgICBlbHNlICIiCiAgICAgICAgKQoKICAgICAgICByZXR1cm4gIjx7MH0oezEhcn17Mn0pPiIuZm9ybWF0KAogICAgICAgICAgICBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywKICAgICAgICAgICAgc3RyKHNlbGYpLAogICAgICAgICAgICBwcmUsCiAgICAgICAgKQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiezB9ezF9Ii5mb3JtYXQoKnNlbGYuX3NwZWMpCgogICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgICAgIHJldHVybiBoYXNoKHNlbGYuX3NwZWMpCgogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgc3RyaW5nX3R5cGVzKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgb3RoZXIgPSBzZWxmLl9fY2xhc3NfXyhvdGhlcikKICAgICAgICAgICAgZXhjZXB0IEludmFsaWRTcGVjaWZpZXI6CiAgICAgICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXyk6CiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAoKICAgICAgICByZXR1cm4gc2VsZi5fc3BlYyA9PSBvdGhlci5fc3BlYwoKICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHN0cmluZ190eXBlcyk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIG90aGVyID0gc2VsZi5fX2NsYXNzX18ob3RoZXIpCiAgICAgICAgICAgIGV4Y2VwdCBJbnZhbGlkU3BlY2lmaWVyOgogICAgICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCiAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pOgogICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKCiAgICAgICAgcmV0dXJuIHNlbGYuX3NwZWMgIT0gb3RoZXIuX3NwZWMKCiAgICBkZWYgX2dldF9vcGVyYXRvcihzZWxmLCBvcCk6CiAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZiwgIl9jb21wYXJlX3swfSIuZm9ybWF0KHNlbGYuX29wZXJhdG9yc1tvcF0pKQoKICAgIGRlZiBfY29lcmNlX3ZlcnNpb24oc2VsZiwgdmVyc2lvbik6CiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodmVyc2lvbiwgKExlZ2FjeVZlcnNpb24sIFZlcnNpb24pKToKICAgICAgICAgICAgdmVyc2lvbiA9IHBhcnNlKHZlcnNpb24pCiAgICAgICAgcmV0dXJuIHZlcnNpb24KCiAgICBAcHJvcGVydHkKICAgIGRlZiBvcGVyYXRvcihzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fc3BlY1swXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHZlcnNpb24oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3NwZWNbMV0KCiAgICBAcHJvcGVydHkKICAgIGRlZiBwcmVyZWxlYXNlcyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fcHJlcmVsZWFzZXMKCiAgICBAcHJlcmVsZWFzZXMuc2V0dGVyCiAgICBkZWYgcHJlcmVsZWFzZXMoc2VsZiwgdmFsdWUpOgogICAgICAgIHNlbGYuX3ByZXJlbGVhc2VzID0gdmFsdWUKCiAgICBkZWYgX19jb250YWluc19fKHNlbGYsIGl0ZW0pOgogICAgICAgIHJldHVybiBzZWxmLmNvbnRhaW5zKGl0ZW0pCgogICAgZGVmIGNvbnRhaW5zKHNlbGYsIGl0ZW0sIHByZXJlbGVhc2VzPU5vbmUpOgogICAgICAgICMgRGV0ZXJtaW5lIGlmIHByZXJlbGVhc2VzIGFyZSB0byBiZSBhbGxvd2VkIG9yIG5vdC4KICAgICAgICBpZiBwcmVyZWxlYXNlcyBpcyBOb25lOgogICAgICAgICAgICBwcmVyZWxlYXNlcyA9IHNlbGYucHJlcmVsZWFzZXMKCiAgICAgICAgIyBOb3JtYWxpemUgaXRlbSB0byBhIFZlcnNpb24gb3IgTGVnYWN5VmVyc2lvbiwgdGhpcyBhbGxvd3MgdXMgdG8gaGF2ZQogICAgICAgICMgYSBzaG9ydGN1dCBmb3IgYGAiMi4wIiBpbiBTcGVjaWZpZXIoIj49MiIpCiAgICAgICAgaXRlbSA9IHNlbGYuX2NvZXJjZV92ZXJzaW9uKGl0ZW0pCgogICAgICAgICMgRGV0ZXJtaW5lIGlmIHdlIHNob3VsZCBiZSBzdXBwb3J0aW5nIHByZXJlbGVhc2VzIGluIHRoaXMgc3BlY2lmaWVyCiAgICAgICAgIyBvciBub3QsIGlmIHdlIGRvIG5vdCBzdXBwb3J0IHByZXJlbGVhc2VzIHRoYW4gd2UgY2FuIHNob3J0IGNpcmN1aXQKICAgICAgICAjIGxvZ2ljIGlmIHRoaXMgdmVyc2lvbiBpcyBhIHByZXJlbGVhc2VzLgogICAgICAgIGlmIGl0ZW0uaXNfcHJlcmVsZWFzZSBhbmQgbm90IHByZXJlbGVhc2VzOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgIyBBY3R1YWxseSBkbyB0aGUgY29tcGFyaXNvbiB0byBkZXRlcm1pbmUgaWYgdGhpcyBpdGVtIGlzIGNvbnRhaW5lZAogICAgICAgICMgd2l0aGluIHRoaXMgU3BlY2lmaWVyIG9yIG5vdC4KICAgICAgICByZXR1cm4gc2VsZi5fZ2V0X29wZXJhdG9yKHNlbGYub3BlcmF0b3IpKGl0ZW0sIHNlbGYudmVyc2lvbikKCiAgICBkZWYgZmlsdGVyKHNlbGYsIGl0ZXJhYmxlLCBwcmVyZWxlYXNlcz1Ob25lKToKICAgICAgICB5aWVsZGVkID0gRmFsc2UKICAgICAgICBmb3VuZF9wcmVyZWxlYXNlcyA9IFtdCgogICAgICAgIGt3ID0geyJwcmVyZWxlYXNlcyI6IHByZXJlbGVhc2VzIGlmIHByZXJlbGVhc2VzIGlzIG5vdCBOb25lIGVsc2UgVHJ1ZX0KCiAgICAgICAgIyBBdHRlbXB0IHRvIGl0ZXJhdGUgb3ZlciBhbGwgdGhlIHZhbHVlcyBpbiB0aGUgaXRlcmFibGUgYW5kIGlmIGFueSBvZgogICAgICAgICMgdGhlbSBtYXRjaCwgeWllbGQgdGhlbS4KICAgICAgICBmb3IgdmVyc2lvbiBpbiBpdGVyYWJsZToKICAgICAgICAgICAgcGFyc2VkX3ZlcnNpb24gPSBzZWxmLl9jb2VyY2VfdmVyc2lvbih2ZXJzaW9uKQoKICAgICAgICAgICAgaWYgc2VsZi5jb250YWlucyhwYXJzZWRfdmVyc2lvbiwgKiprdyk6CiAgICAgICAgICAgICAgICAjIElmIG91ciB2ZXJzaW9uIGlzIGEgcHJlcmVsZWFzZSwgYW5kIHdlIHdlcmUgbm90IHNldCB0byBhbGxvdwogICAgICAgICAgICAgICAgIyBwcmVyZWxlYXNlcywgdGhlbiB3ZSdsbCBzdG9yZSBpdCBmb3IgbGF0ZXIgaW5jYXNlIG5vdGhpbmcKICAgICAgICAgICAgICAgICMgZWxzZSBtYXRjaGVzIHRoaXMgc3BlY2lmaWVyLgogICAgICAgICAgICAgICAgaWYgKHBhcnNlZF92ZXJzaW9uLmlzX3ByZXJlbGVhc2UgYW5kIG5vdAogICAgICAgICAgICAgICAgICAgICAgICAocHJlcmVsZWFzZXMgb3Igc2VsZi5wcmVyZWxlYXNlcykpOgogICAgICAgICAgICAgICAgICAgIGZvdW5kX3ByZXJlbGVhc2VzLmFwcGVuZCh2ZXJzaW9uKQogICAgICAgICAgICAgICAgIyBFaXRoZXIgdGhpcyBpcyBub3QgYSBwcmVyZWxlYXNlLCBvciB3ZSBzaG91bGQgaGF2ZSBiZWVuCiAgICAgICAgICAgICAgICAjIGFjY2VwdGluZyBwcmVyZWxlYXNlcyBmcm9tIHRoZSBiZWdpbmluZy4KICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgeWllbGRlZCA9IFRydWUKICAgICAgICAgICAgICAgICAgICB5aWVsZCB2ZXJzaW9uCgogICAgICAgICMgTm93IHRoYXQgd2UndmUgaXRlcmF0ZWQgb3ZlciBldmVyeXRoaW5nLCBkZXRlcm1pbmUgaWYgd2UndmUgeWllbGRlZAogICAgICAgICMgYW55IHZhbHVlcywgYW5kIGlmIHdlIGhhdmUgbm90IGFuZCB3ZSBoYXZlIGFueSBwcmVyZWxlYXNlcyBzdG9yZWQgdXAKICAgICAgICAjIHRoZW4gd2Ugd2lsbCBnbyBhaGVhZCBhbmQgeWllbGQgdGhlIHByZXJlbGVhc2VzLgogICAgICAgIGlmIG5vdCB5aWVsZGVkIGFuZCBmb3VuZF9wcmVyZWxlYXNlczoKICAgICAgICAgICAgZm9yIHZlcnNpb24gaW4gZm91bmRfcHJlcmVsZWFzZXM6CiAgICAgICAgICAgICAgICB5aWVsZCB2ZXJzaW9uCgoKY2xhc3MgTGVnYWN5U3BlY2lmaWVyKF9JbmRpdmlkdWFsU3BlY2lmaWVyKToKCiAgICBfcmVnZXhfc3RyID0gKAogICAgICAgIHIiIiIKICAgICAgICAoP1A8b3BlcmF0b3I+KD09fCE9fDw9fD49fDx8PikpCiAgICAgICAgXHMqCiAgICAgICAgKD9QPHZlcnNpb24+CiAgICAgICAgICAgIFteLDtccyldKiAjIFNpbmNlIHRoaXMgaXMgYSAibGVnYWN5IiBzcGVjaWZpZXIsIGFuZCB0aGUgdmVyc2lvbgogICAgICAgICAgICAgICAgICAgICAgIyBzdHJpbmcgY2FuIGJlIGp1c3QgYWJvdXQgYW55dGhpbmcsIHdlIG1hdGNoIGV2ZXJ5dGhpbmcKICAgICAgICAgICAgICAgICAgICAgICMgZXhjZXB0IGZvciB3aGl0ZXNwYWNlLCBhIHNlbWktY29sb24gZm9yIG1hcmtlciBzdXBwb3J0LAogICAgICAgICAgICAgICAgICAgICAgIyBhIGNsb3NpbmcgcGFyZW4gc2luY2UgdmVyc2lvbnMgY2FuIGJlIGVuY2xvc2VkIGluCiAgICAgICAgICAgICAgICAgICAgICAjIHRoZW0sIGFuZCBhIGNvbW1hIHNpbmNlIGl0J3MgYSB2ZXJzaW9uIHNlcGFyYXRvci4KICAgICAgICApCiAgICAgICAgIiIiCiAgICApCgogICAgX3JlZ2V4ID0gcmUuY29tcGlsZSgKICAgICAgICByIl5ccyoiICsgX3JlZ2V4X3N0ciArIHIiXHMqJCIsIHJlLlZFUkJPU0UgfCByZS5JR05PUkVDQVNFKQoKICAgIF9vcGVyYXRvcnMgPSB7CiAgICAgICAgIj09IjogImVxdWFsIiwKICAgICAgICAiIT0iOiAibm90X2VxdWFsIiwKICAgICAgICAiPD0iOiAibGVzc190aGFuX2VxdWFsIiwKICAgICAgICAiPj0iOiAiZ3JlYXRlcl90aGFuX2VxdWFsIiwKICAgICAgICAiPCI6ICJsZXNzX3RoYW4iLAogICAgICAgICI+IjogImdyZWF0ZXJfdGhhbiIsCiAgICB9CgogICAgZGVmIF9jb2VyY2VfdmVyc2lvbihzZWxmLCB2ZXJzaW9uKToKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh2ZXJzaW9uLCBMZWdhY3lWZXJzaW9uKToKICAgICAgICAgICAgdmVyc2lvbiA9IExlZ2FjeVZlcnNpb24oc3RyKHZlcnNpb24pKQogICAgICAgIHJldHVybiB2ZXJzaW9uCgogICAgZGVmIF9jb21wYXJlX2VxdWFsKHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKToKICAgICAgICByZXR1cm4gcHJvc3BlY3RpdmUgPT0gc2VsZi5fY29lcmNlX3ZlcnNpb24oc3BlYykKCiAgICBkZWYgX2NvbXBhcmVfbm90X2VxdWFsKHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKToKICAgICAgICByZXR1cm4gcHJvc3BlY3RpdmUgIT0gc2VsZi5fY29lcmNlX3ZlcnNpb24oc3BlYykKCiAgICBkZWYgX2NvbXBhcmVfbGVzc190aGFuX2VxdWFsKHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKToKICAgICAgICByZXR1cm4gcHJvc3BlY3RpdmUgPD0gc2VsZi5fY29lcmNlX3ZlcnNpb24oc3BlYykKCiAgICBkZWYgX2NvbXBhcmVfZ3JlYXRlcl90aGFuX2VxdWFsKHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKToKICAgICAgICByZXR1cm4gcHJvc3BlY3RpdmUgPj0gc2VsZi5fY29lcmNlX3ZlcnNpb24oc3BlYykKCiAgICBkZWYgX2NvbXBhcmVfbGVzc190aGFuKHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKToKICAgICAgICByZXR1cm4gcHJvc3BlY3RpdmUgPCBzZWxmLl9jb2VyY2VfdmVyc2lvbihzcGVjKQoKICAgIGRlZiBfY29tcGFyZV9ncmVhdGVyX3RoYW4oc2VsZiwgcHJvc3BlY3RpdmUsIHNwZWMpOgogICAgICAgIHJldHVybiBwcm9zcGVjdGl2ZSA+IHNlbGYuX2NvZXJjZV92ZXJzaW9uKHNwZWMpCgoKZGVmIF9yZXF1aXJlX3ZlcnNpb25fY29tcGFyZShmbik6CiAgICBAZnVuY3Rvb2xzLndyYXBzKGZuKQogICAgZGVmIHdyYXBwZWQoc2VsZiwgcHJvc3BlY3RpdmUsIHNwZWMpOgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHByb3NwZWN0aXZlLCBWZXJzaW9uKToKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgcmV0dXJuIGZuKHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKQogICAgcmV0dXJuIHdyYXBwZWQKCgpjbGFzcyBTcGVjaWZpZXIoX0luZGl2aWR1YWxTcGVjaWZpZXIpOgoKICAgIF9yZWdleF9zdHIgPSAoCiAgICAgICAgciIiIgogICAgICAgICg/UDxvcGVyYXRvcj4ofj18PT18IT18PD18Pj18PHw+fD09PSkpCiAgICAgICAgKD9QPHZlcnNpb24+CiAgICAgICAgICAgICg/OgogICAgICAgICAgICAgICAgIyBUaGUgaWRlbnRpdHkgb3BlcmF0b3JzIGFsbG93IGZvciBhbiBlc2NhcGUgaGF0Y2ggdGhhdCB3aWxsCiAgICAgICAgICAgICAgICAjIGRvIGFuIGV4YWN0IHN0cmluZyBtYXRjaCBvZiB0aGUgdmVyc2lvbiB5b3Ugd2lzaCB0byBpbnN0YWxsLgogICAgICAgICAgICAgICAgIyBUaGlzIHdpbGwgbm90IGJlIHBhcnNlZCBieSBQRVAgNDQwIGFuZCB3ZSBjYW5ub3QgZGV0ZXJtaW5lCiAgICAgICAgICAgICAgICAjIGFueSBzZW1hbnRpYyBtZWFuaW5nIGZyb20gaXQuIFRoaXMgb3BlcmF0b3IgaXMgZGlzY291cmFnZWQKICAgICAgICAgICAgICAgICMgYnV0IGluY2x1ZGVkIGVudGlyZWx5IGFzIGFuIGVzY2FwZSBoYXRjaC4KICAgICAgICAgICAgICAgICg/PD09PT0pICAjIE9ubHkgbWF0Y2ggZm9yIHRoZSBpZGVudGl0eSBvcGVyYXRvcgogICAgICAgICAgICAgICAgXHMqCiAgICAgICAgICAgICAgICBbXlxzXSogICAgIyBXZSBqdXN0IG1hdGNoIGV2ZXJ5dGhpbmcsIGV4Y2VwdCBmb3Igd2hpdGVzcGFjZQogICAgICAgICAgICAgICAgICAgICAgICAgICMgc2luY2Ugd2UgYXJlIG9ubHkgdGVzdGluZyBmb3Igc3RyaWN0IGlkZW50aXR5LgogICAgICAgICAgICApCiAgICAgICAgICAgIHwKICAgICAgICAgICAgKD86CiAgICAgICAgICAgICAgICAjIFRoZSAobm9uKWVxdWFsaXR5IG9wZXJhdG9ycyBhbGxvdyBmb3Igd2lsZCBjYXJkIGFuZCBsb2NhbAogICAgICAgICAgICAgICAgIyB2ZXJzaW9ucyB0byBiZSBzcGVjaWZpZWQgc28gd2UgaGF2ZSB0byBkZWZpbmUgdGhlc2UgdHdvCiAgICAgICAgICAgICAgICAjIG9wZXJhdG9ycyBzZXBhcmF0ZWx5IHRvIGVuYWJsZSB0aGF0LgogICAgICAgICAgICAgICAgKD88PT09fCE9KSAgICAgICAgICAgICMgT25seSBtYXRjaCBmb3IgZXF1YWxzIGFuZCBub3QgZXF1YWxzCgogICAgICAgICAgICAgICAgXHMqCiAgICAgICAgICAgICAgICB2PwogICAgICAgICAgICAgICAgKD86WzAtOV0rISk/ICAgICAgICAgICMgZXBvY2gKICAgICAgICAgICAgICAgIFswLTldKyg/OlwuWzAtOV0rKSogICAjIHJlbGVhc2UKICAgICAgICAgICAgICAgICg/OiAgICAgICAgICAgICAgICAgICAjIHByZSByZWxlYXNlCiAgICAgICAgICAgICAgICAgICAgWy1fXC5dPwogICAgICAgICAgICAgICAgICAgIChhfGJ8Y3xyY3xhbHBoYXxiZXRhfHByZXxwcmV2aWV3KQogICAgICAgICAgICAgICAgICAgIFstX1wuXT8KICAgICAgICAgICAgICAgICAgICBbMC05XSoKICAgICAgICAgICAgICAgICk/CiAgICAgICAgICAgICAgICAoPzogICAgICAgICAgICAgICAgICAgIyBwb3N0IHJlbGVhc2UKICAgICAgICAgICAgICAgICAgICAoPzotWzAtOV0rKXwoPzpbLV9cLl0/KHBvc3R8cmV2fHIpWy1fXC5dP1swLTldKikKICAgICAgICAgICAgICAgICk/CgogICAgICAgICAgICAgICAgIyBZb3UgY2Fubm90IHVzZSBhIHdpbGQgY2FyZCBhbmQgYSBkZXYgb3IgbG9jYWwgdmVyc2lvbgogICAgICAgICAgICAgICAgIyB0b2dldGhlciBzbyBncm91cCB0aGVtIHdpdGggYSB8IGFuZCBtYWtlIHRoZW0gb3B0aW9uYWwuCiAgICAgICAgICAgICAgICAoPzoKICAgICAgICAgICAgICAgICAgICAoPzpbLV9cLl0/ZGV2Wy1fXC5dP1swLTldKik/ICAgICAgICAgIyBkZXYgcmVsZWFzZQogICAgICAgICAgICAgICAgICAgICg/OlwrW2EtejAtOV0rKD86Wy1fXC5dW2EtejAtOV0rKSopPyAjIGxvY2FsCiAgICAgICAgICAgICAgICAgICAgfAogICAgICAgICAgICAgICAgICAgIFwuXCogICMgV2lsZCBjYXJkIHN5bnRheCBvZiAuKgogICAgICAgICAgICAgICAgKT8KICAgICAgICAgICAgKQogICAgICAgICAgICB8CiAgICAgICAgICAgICg/OgogICAgICAgICAgICAgICAgIyBUaGUgY29tcGF0aWJsZSBvcGVyYXRvciByZXF1aXJlcyBhdCBsZWFzdCB0d28gZGlnaXRzIGluIHRoZQogICAgICAgICAgICAgICAgIyByZWxlYXNlIHNlZ21lbnQuCiAgICAgICAgICAgICAgICAoPzw9fj0pICAgICAgICAgICAgICAgIyBPbmx5IG1hdGNoIGZvciB0aGUgY29tcGF0aWJsZSBvcGVyYXRvcgoKICAgICAgICAgICAgICAgIFxzKgogICAgICAgICAgICAgICAgdj8KICAgICAgICAgICAgICAgICg/OlswLTldKyEpPyAgICAgICAgICAjIGVwb2NoCiAgICAgICAgICAgICAgICBbMC05XSsoPzpcLlswLTldKykrICAgIyByZWxlYXNlICAoV2UgaGF2ZSBhICsgaW5zdGVhZCBvZiBhICopCiAgICAgICAgICAgICAgICAoPzogICAgICAgICAgICAgICAgICAgIyBwcmUgcmVsZWFzZQogICAgICAgICAgICAgICAgICAgIFstX1wuXT8KICAgICAgICAgICAgICAgICAgICAoYXxifGN8cmN8YWxwaGF8YmV0YXxwcmV8cHJldmlldykKICAgICAgICAgICAgICAgICAgICBbLV9cLl0/CiAgICAgICAgICAgICAgICAgICAgWzAtOV0qCiAgICAgICAgICAgICAgICApPwogICAgICAgICAgICAgICAgKD86ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHBvc3QgcmVsZWFzZQogICAgICAgICAgICAgICAgICAgICg/Oi1bMC05XSspfCg/OlstX1wuXT8ocG9zdHxyZXZ8cilbLV9cLl0/WzAtOV0qKQogICAgICAgICAgICAgICAgKT8KICAgICAgICAgICAgICAgICg/OlstX1wuXT9kZXZbLV9cLl0/WzAtOV0qKT8gICAgICAgICAgIyBkZXYgcmVsZWFzZQogICAgICAgICAgICApCiAgICAgICAgICAgIHwKICAgICAgICAgICAgKD86CiAgICAgICAgICAgICAgICAjIEFsbCBvdGhlciBvcGVyYXRvcnMgb25seSBhbGxvdyBhIHN1YiBzZXQgb2Ygd2hhdCB0aGUKICAgICAgICAgICAgICAgICMgKG5vbillcXVhbGl0eSBvcGVyYXRvcnMgZG8uIFNwZWNpZmljYWxseSB0aGV5IGRvIG5vdCBhbGxvdwogICAgICAgICAgICAgICAgIyBsb2NhbCB2ZXJzaW9ucyB0byBiZSBzcGVjaWZpZWQgbm9yIGRvIHRoZXkgYWxsb3cgdGhlIHByZWZpeAogICAgICAgICAgICAgICAgIyBtYXRjaGluZyB3aWxkIGNhcmRzLgogICAgICAgICAgICAgICAgKD88IT09fCE9fH49KSAgICAgICAgICMgV2UgaGF2ZSBzcGVjaWFsIGNhc2VzIGZvciB0aGVzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb3BlcmF0b3JzIHNvIHdlIHdhbnQgdG8gbWFrZSBzdXJlIHRoZXkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGRvbid0IG1hdGNoIGhlcmUuCgogICAgICAgICAgICAgICAgXHMqCiAgICAgICAgICAgICAgICB2PwogICAgICAgICAgICAgICAgKD86WzAtOV0rISk/ICAgICAgICAgICMgZXBvY2gKICAgICAgICAgICAgICAgIFswLTldKyg/OlwuWzAtOV0rKSogICAjIHJlbGVhc2UKICAgICAgICAgICAgICAgICg/OiAgICAgICAgICAgICAgICAgICAjIHByZSByZWxlYXNlCiAgICAgICAgICAgICAgICAgICAgWy1fXC5dPwogICAgICAgICAgICAgICAgICAgIChhfGJ8Y3xyY3xhbHBoYXxiZXRhfHByZXxwcmV2aWV3KQogICAgICAgICAgICAgICAgICAgIFstX1wuXT8KICAgICAgICAgICAgICAgICAgICBbMC05XSoKICAgICAgICAgICAgICAgICk/CiAgICAgICAgICAgICAgICAoPzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcG9zdCByZWxlYXNlCiAgICAgICAgICAgICAgICAgICAgKD86LVswLTldKyl8KD86Wy1fXC5dPyhwb3N0fHJldnxyKVstX1wuXT9bMC05XSopCiAgICAgICAgICAgICAgICApPwogICAgICAgICAgICAgICAgKD86Wy1fXC5dP2RldlstX1wuXT9bMC05XSopPyAgICAgICAgICAjIGRldiByZWxlYXNlCiAgICAgICAgICAgICkKICAgICAgICApCiAgICAgICAgIiIiCiAgICApCgogICAgX3JlZ2V4ID0gcmUuY29tcGlsZSgKICAgICAgICByIl5ccyoiICsgX3JlZ2V4X3N0ciArIHIiXHMqJCIsIHJlLlZFUkJPU0UgfCByZS5JR05PUkVDQVNFKQoKICAgIF9vcGVyYXRvcnMgPSB7CiAgICAgICAgIn49IjogImNvbXBhdGlibGUiLAogICAgICAgICI9PSI6ICJlcXVhbCIsCiAgICAgICAgIiE9IjogIm5vdF9lcXVhbCIsCiAgICAgICAgIjw9IjogImxlc3NfdGhhbl9lcXVhbCIsCiAgICAgICAgIj49IjogImdyZWF0ZXJfdGhhbl9lcXVhbCIsCiAgICAgICAgIjwiOiAibGVzc190aGFuIiwKICAgICAgICAiPiI6ICJncmVhdGVyX3RoYW4iLAogICAgICAgICI9PT0iOiAiYXJiaXRyYXJ5IiwKICAgIH0KCiAgICBAX3JlcXVpcmVfdmVyc2lvbl9jb21wYXJlCiAgICBkZWYgX2NvbXBhcmVfY29tcGF0aWJsZShzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgIyBDb21wYXRpYmxlIHJlbGVhc2VzIGhhdmUgYW4gZXF1aXZhbGVudCBjb21iaW5hdGlvbiBvZiA+PSBhbmQgPT0uIFRoYXQKICAgICAgICAjIGlzIHRoYXQgfj0yLjIgaXMgZXF1aXZhbGVudCB0byA+PTIuMiw9PTIuKi4gVGhpcyBhbGxvd3MgdXMgdG8KICAgICAgICAjIGltcGxlbWVudCB0aGlzIGluIHRlcm1zIG9mIHRoZSBvdGhlciBzcGVjaWZpZXJzIGluc3RlYWQgb2YKICAgICAgICAjIGltcGxlbWVudGluZyBpdCBvdXJzZWx2ZXMuIFRoZSBvbmx5IHRoaW5nIHdlIG5lZWQgdG8gZG8gaXMgY29uc3RydWN0CiAgICAgICAgIyB0aGUgb3RoZXIgc3BlY2lmaWVycy4KCiAgICAgICAgIyBXZSB3YW50IGV2ZXJ5dGhpbmcgYnV0IHRoZSBsYXN0IGl0ZW0gaW4gdGhlIHZlcnNpb24sIGJ1dCB3ZSB3YW50IHRvCiAgICAgICAgIyBpZ25vcmUgcG9zdCBhbmQgZGV2IHJlbGVhc2VzIGFuZCB3ZSB3YW50IHRvIHRyZWF0IHRoZSBwcmUtcmVsZWFzZSBhcwogICAgICAgICMgaXQncyBvd24gc2VwYXJhdGUgc2VnbWVudC4KICAgICAgICBwcmVmaXggPSAiLiIuam9pbigKICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgIGl0ZXJ0b29scy50YWtld2hpbGUoCiAgICAgICAgICAgICAgICAgICAgbGFtYmRhIHg6IChub3QgeC5zdGFydHN3aXRoKCJwb3N0IikgYW5kIG5vdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeC5zdGFydHN3aXRoKCJkZXYiKSksCiAgICAgICAgICAgICAgICAgICAgX3ZlcnNpb25fc3BsaXQoc3BlYyksCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIClbOi0xXQogICAgICAgICkKCiAgICAgICAgIyBBZGQgdGhlIHByZWZpeCBub3RhdGlvbiB0byB0aGUgZW5kIG9mIG91ciBzdHJpbmcKICAgICAgICBwcmVmaXggKz0gIi4qIgoKICAgICAgICByZXR1cm4gKHNlbGYuX2dldF9vcGVyYXRvcigiPj0iKShwcm9zcGVjdGl2ZSwgc3BlYykgYW5kCiAgICAgICAgICAgICAgICBzZWxmLl9nZXRfb3BlcmF0b3IoIj09IikocHJvc3BlY3RpdmUsIHByZWZpeCkpCgogICAgQF9yZXF1aXJlX3ZlcnNpb25fY29tcGFyZQogICAgZGVmIF9jb21wYXJlX2VxdWFsKHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKToKICAgICAgICAjIFdlIG5lZWQgc3BlY2lhbCBsb2dpYyB0byBoYW5kbGUgcHJlZml4IG1hdGNoaW5nCiAgICAgICAgaWYgc3BlYy5lbmRzd2l0aCgiLioiKToKICAgICAgICAgICAgIyBJbiB0aGUgY2FzZSBvZiBwcmVmaXggbWF0Y2hpbmcgd2Ugd2FudCB0byBpZ25vcmUgbG9jYWwgc2VnbWVudC4KICAgICAgICAgICAgcHJvc3BlY3RpdmUgPSBWZXJzaW9uKHByb3NwZWN0aXZlLnB1YmxpYykKICAgICAgICAgICAgIyBTcGxpdCB0aGUgc3BlYyBvdXQgYnkgZG90cywgYW5kIHByZXRlbmQgdGhhdCB0aGVyZSBpcyBhbiBpbXBsaWNpdAogICAgICAgICAgICAjIGRvdCBpbiBiZXR3ZWVuIGEgcmVsZWFzZSBzZWdtZW50IGFuZCBhIHByZS1yZWxlYXNlIHNlZ21lbnQuCiAgICAgICAgICAgIHNwZWMgPSBfdmVyc2lvbl9zcGxpdChzcGVjWzotMl0pICAjIFJlbW92ZSB0aGUgdHJhaWxpbmcgLioKCiAgICAgICAgICAgICMgU3BsaXQgdGhlIHByb3NwZWN0aXZlIHZlcnNpb24gb3V0IGJ5IGRvdHMsIGFuZCBwcmV0ZW5kIHRoYXQgdGhlcmUKICAgICAgICAgICAgIyBpcyBhbiBpbXBsaWNpdCBkb3QgaW4gYmV0d2VlbiBhIHJlbGVhc2Ugc2VnbWVudCBhbmQgYSBwcmUtcmVsZWFzZQogICAgICAgICAgICAjIHNlZ21lbnQuCiAgICAgICAgICAgIHByb3NwZWN0aXZlID0gX3ZlcnNpb25fc3BsaXQoc3RyKHByb3NwZWN0aXZlKSkKCiAgICAgICAgICAgICMgU2hvcnRlbiB0aGUgcHJvc3BlY3RpdmUgdmVyc2lvbiB0byBiZSB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIHNwZWMKICAgICAgICAgICAgIyBzbyB0aGF0IHdlIGNhbiBkZXRlcm1pbmUgaWYgdGhlIHNwZWNpZmllciBpcyBhIHByZWZpeCBvZiB0aGUKICAgICAgICAgICAgIyBwcm9zcGVjdGl2ZSB2ZXJzaW9uIG9yIG5vdC4KICAgICAgICAgICAgcHJvc3BlY3RpdmUgPSBwcm9zcGVjdGl2ZVs6bGVuKHNwZWMpXQoKICAgICAgICAgICAgIyBQYWQgb3V0IG91ciB0d28gc2lkZXMgd2l0aCB6ZXJvcyBzbyB0aGF0IHRoZXkgYm90aCBlcXVhbCB0aGUgc2FtZQogICAgICAgICAgICAjIGxlbmd0aC4KICAgICAgICAgICAgc3BlYywgcHJvc3BlY3RpdmUgPSBfcGFkX3ZlcnNpb24oc3BlYywgcHJvc3BlY3RpdmUpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBDb252ZXJ0IG91ciBzcGVjIHN0cmluZyBpbnRvIGEgVmVyc2lvbgogICAgICAgICAgICBzcGVjID0gVmVyc2lvbihzcGVjKQoKICAgICAgICAgICAgIyBJZiB0aGUgc3BlY2lmaWVyIGRvZXMgbm90IGhhdmUgYSBsb2NhbCBzZWdtZW50LCB0aGVuIHdlIHdhbnQgdG8KICAgICAgICAgICAgIyBhY3QgYXMgaWYgdGhlIHByb3NwZWN0aXZlIHZlcnNpb24gYWxzbyBkb2VzIG5vdCBoYXZlIGEgbG9jYWwKICAgICAgICAgICAgIyBzZWdtZW50LgogICAgICAgICAgICBpZiBub3Qgc3BlYy5sb2NhbDoKICAgICAgICAgICAgICAgIHByb3NwZWN0aXZlID0gVmVyc2lvbihwcm9zcGVjdGl2ZS5wdWJsaWMpCgogICAgICAgIHJldHVybiBwcm9zcGVjdGl2ZSA9PSBzcGVjCgogICAgQF9yZXF1aXJlX3ZlcnNpb25fY29tcGFyZQogICAgZGVmIF9jb21wYXJlX25vdF9lcXVhbChzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgcmV0dXJuIG5vdCBzZWxmLl9jb21wYXJlX2VxdWFsKHByb3NwZWN0aXZlLCBzcGVjKQoKICAgIEBfcmVxdWlyZV92ZXJzaW9uX2NvbXBhcmUKICAgIGRlZiBfY29tcGFyZV9sZXNzX3RoYW5fZXF1YWwoc2VsZiwgcHJvc3BlY3RpdmUsIHNwZWMpOgogICAgICAgIHJldHVybiBwcm9zcGVjdGl2ZSA8PSBWZXJzaW9uKHNwZWMpCgogICAgQF9yZXF1aXJlX3ZlcnNpb25fY29tcGFyZQogICAgZGVmIF9jb21wYXJlX2dyZWF0ZXJfdGhhbl9lcXVhbChzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgcmV0dXJuIHByb3NwZWN0aXZlID49IFZlcnNpb24oc3BlYykKCiAgICBAX3JlcXVpcmVfdmVyc2lvbl9jb21wYXJlCiAgICBkZWYgX2NvbXBhcmVfbGVzc190aGFuKHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKToKICAgICAgICAjIENvbnZlcnQgb3VyIHNwZWMgdG8gYSBWZXJzaW9uIGluc3RhbmNlLCBzaW5jZSB3ZSdsbCB3YW50IHRvIHdvcmsgd2l0aAogICAgICAgICMgaXQgYXMgYSB2ZXJzaW9uLgogICAgICAgIHNwZWMgPSBWZXJzaW9uKHNwZWMpCgogICAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBwcm9zcGVjdGl2ZSB2ZXJzaW9uIGlzIGxlc3MgdGhhbiB0aGUgc3BlYwogICAgICAgICMgdmVyc2lvbi4gSWYgaXQncyBub3Qgd2UgY2FuIHNob3J0IGNpcmN1aXQgYW5kIGp1c3QgcmV0dXJuIEZhbHNlIG5vdwogICAgICAgICMgaW5zdGVhZCBvZiBkb2luZyBleHRyYSB1bm5lZWRlZCB3b3JrLgogICAgICAgIGlmIG5vdCBwcm9zcGVjdGl2ZSA8IHNwZWM6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICAjIFRoaXMgc3BlY2lhbCBjYXNlIGlzIGhlcmUgc28gdGhhdCwgdW5sZXNzIHRoZSBzcGVjaWZpZXIgaXRzZWxmCiAgICAgICAgIyBpbmNsdWRlcyBpcyBhIHByZS1yZWxlYXNlIHZlcnNpb24sIHRoYXQgd2UgZG8gbm90IGFjY2VwdCBwcmUtcmVsZWFzZQogICAgICAgICMgdmVyc2lvbnMgZm9yIHRoZSB2ZXJzaW9uIG1lbnRpb25lZCBpbiB0aGUgc3BlY2lmaWVyIChlLmcuIDwzLjEgc2hvdWxkCiAgICAgICAgIyBub3QgbWF0Y2ggMy4xLmRldjAsIGJ1dCBzaG91bGQgbWF0Y2ggMy4wLmRldjApLgogICAgICAgIGlmIG5vdCBzcGVjLmlzX3ByZXJlbGVhc2UgYW5kIHByb3NwZWN0aXZlLmlzX3ByZXJlbGVhc2U6CiAgICAgICAgICAgIGlmIFZlcnNpb24ocHJvc3BlY3RpdmUuYmFzZV92ZXJzaW9uKSA9PSBWZXJzaW9uKHNwZWMuYmFzZV92ZXJzaW9uKToKICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICAjIElmIHdlJ3ZlIGdvdHRlbiB0byBoZXJlLCBpdCBtZWFucyB0aGF0IHByb3NwZWN0aXZlIHZlcnNpb24gaXMgYm90aAogICAgICAgICMgbGVzcyB0aGFuIHRoZSBzcGVjIHZlcnNpb24gKmFuZCogaXQncyBub3QgYSBwcmUtcmVsZWFzZSBvZiB0aGUgc2FtZQogICAgICAgICMgdmVyc2lvbiBpbiB0aGUgc3BlYy4KICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIEBfcmVxdWlyZV92ZXJzaW9uX2NvbXBhcmUKICAgIGRlZiBfY29tcGFyZV9ncmVhdGVyX3RoYW4oc2VsZiwgcHJvc3BlY3RpdmUsIHNwZWMpOgogICAgICAgICMgQ29udmVydCBvdXIgc3BlYyB0byBhIFZlcnNpb24gaW5zdGFuY2UsIHNpbmNlIHdlJ2xsIHdhbnQgdG8gd29yayB3aXRoCiAgICAgICAgIyBpdCBhcyBhIHZlcnNpb24uCiAgICAgICAgc3BlYyA9IFZlcnNpb24oc3BlYykKCiAgICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIHByb3NwZWN0aXZlIHZlcnNpb24gaXMgZ3JlYXRlciB0aGFuIHRoZSBzcGVjCiAgICAgICAgIyB2ZXJzaW9uLiBJZiBpdCdzIG5vdCB3ZSBjYW4gc2hvcnQgY2lyY3VpdCBhbmQganVzdCByZXR1cm4gRmFsc2Ugbm93CiAgICAgICAgIyBpbnN0ZWFkIG9mIGRvaW5nIGV4dHJhIHVubmVlZGVkIHdvcmsuCiAgICAgICAgaWYgbm90IHByb3NwZWN0aXZlID4gc3BlYzoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgICMgVGhpcyBzcGVjaWFsIGNhc2UgaXMgaGVyZSBzbyB0aGF0LCB1bmxlc3MgdGhlIHNwZWNpZmllciBpdHNlbGYKICAgICAgICAjIGluY2x1ZGVzIGlzIGEgcG9zdC1yZWxlYXNlIHZlcnNpb24sIHRoYXQgd2UgZG8gbm90IGFjY2VwdAogICAgICAgICMgcG9zdC1yZWxlYXNlIHZlcnNpb25zIGZvciB0aGUgdmVyc2lvbiBtZW50aW9uZWQgaW4gdGhlIHNwZWNpZmllcgogICAgICAgICMgKGUuZy4gPjMuMSBzaG91bGQgbm90IG1hdGNoIDMuMC5wb3N0MCwgYnV0IHNob3VsZCBtYXRjaCAzLjIucG9zdDApLgogICAgICAgIGlmIG5vdCBzcGVjLmlzX3Bvc3RyZWxlYXNlIGFuZCBwcm9zcGVjdGl2ZS5pc19wb3N0cmVsZWFzZToKICAgICAgICAgICAgaWYgVmVyc2lvbihwcm9zcGVjdGl2ZS5iYXNlX3ZlcnNpb24pID09IFZlcnNpb24oc3BlYy5iYXNlX3ZlcnNpb24pOgogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgICMgRW5zdXJlIHRoYXQgd2UgZG8gbm90IGFsbG93IGEgbG9jYWwgdmVyc2lvbiBvZiB0aGUgdmVyc2lvbiBtZW50aW9uZWQKICAgICAgICAjIGluIHRoZSBzcGVjaWZpZXIsIHdoaWNoIGlzIHRlY2hpbmNhbGx5IGdyZWF0ZXIgdGhhbiwgdG8gbWF0Y2guCiAgICAgICAgaWYgcHJvc3BlY3RpdmUubG9jYWwgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGlmIFZlcnNpb24ocHJvc3BlY3RpdmUuYmFzZV92ZXJzaW9uKSA9PSBWZXJzaW9uKHNwZWMuYmFzZV92ZXJzaW9uKToKICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICAjIElmIHdlJ3ZlIGdvdHRlbiB0byBoZXJlLCBpdCBtZWFucyB0aGF0IHByb3NwZWN0aXZlIHZlcnNpb24gaXMgYm90aAogICAgICAgICMgZ3JlYXRlciB0aGFuIHRoZSBzcGVjIHZlcnNpb24gKmFuZCogaXQncyBub3QgYSBwcmUtcmVsZWFzZSBvZiB0aGUKICAgICAgICAjIHNhbWUgdmVyc2lvbiBpbiB0aGUgc3BlYy4KICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBfY29tcGFyZV9hcmJpdHJhcnkoc2VsZiwgcHJvc3BlY3RpdmUsIHNwZWMpOgogICAgICAgIHJldHVybiBzdHIocHJvc3BlY3RpdmUpLmxvd2VyKCkgPT0gc3RyKHNwZWMpLmxvd2VyKCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBwcmVyZWxlYXNlcyhzZWxmKToKICAgICAgICAjIElmIHRoZXJlIGlzIGFuIGV4cGxpY2l0IHByZXJlbGVhc2VzIHNldCBmb3IgdGhpcywgdGhlbiB3ZSdsbCBqdXN0CiAgICAgICAgIyBibGluZGx5IHVzZSB0aGF0LgogICAgICAgIGlmIHNlbGYuX3ByZXJlbGVhc2VzIGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fcHJlcmVsZWFzZXMKCiAgICAgICAgIyBMb29rIGF0IGFsbCBvZiBvdXIgc3BlY2lmaWVycyBhbmQgZGV0ZXJtaW5lIGlmIHRoZXkgYXJlIGluY2x1c2l2ZQogICAgICAgICMgb3BlcmF0b3JzLCBhbmQgaWYgdGhleSBhcmUgaWYgdGhleSBhcmUgaW5jbHVkaW5nIGFuIGV4cGxpY2l0CiAgICAgICAgIyBwcmVyZWxlYXNlLgogICAgICAgIG9wZXJhdG9yLCB2ZXJzaW9uID0gc2VsZi5fc3BlYwogICAgICAgIGlmIG9wZXJhdG9yIGluIFsiPT0iLCAiPj0iLCAiPD0iLCAifj0iLCAiPT09Il06CiAgICAgICAgICAgICMgVGhlID09IHNwZWNpZmllciBjYW4gaW5jbHVkZSBhIHRyYWlsaW5nIC4qLCBpZiBpdCBkb2VzIHdlCiAgICAgICAgICAgICMgd2FudCB0byByZW1vdmUgYmVmb3JlIHBhcnNpbmcuCiAgICAgICAgICAgIGlmIG9wZXJhdG9yID09ICI9PSIgYW5kIHZlcnNpb24uZW5kc3dpdGgoIi4qIik6CiAgICAgICAgICAgICAgICB2ZXJzaW9uID0gdmVyc2lvbls6LTJdCgogICAgICAgICAgICAjIFBhcnNlIHRoZSB2ZXJzaW9uLCBhbmQgaWYgaXQgaXMgYSBwcmUtcmVsZWFzZSB0aGFuIHRoaXMKICAgICAgICAgICAgIyBzcGVjaWZpZXIgYWxsb3dzIHByZS1yZWxlYXNlcy4KICAgICAgICAgICAgaWYgcGFyc2UodmVyc2lvbikuaXNfcHJlcmVsZWFzZToKICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgICAgIHJldHVybiBGYWxzZQoKICAgIEBwcmVyZWxlYXNlcy5zZXR0ZXIKICAgIGRlZiBwcmVyZWxlYXNlcyhzZWxmLCB2YWx1ZSk6CiAgICAgICAgc2VsZi5fcHJlcmVsZWFzZXMgPSB2YWx1ZQoKCl9wcmVmaXhfcmVnZXggPSByZS5jb21waWxlKHIiXihbMC05XSspKCg/OmF8YnxjfHJjKVswLTldKykkIikKCgpkZWYgX3ZlcnNpb25fc3BsaXQodmVyc2lvbik6CiAgICByZXN1bHQgPSBbXQogICAgZm9yIGl0ZW0gaW4gdmVyc2lvbi5zcGxpdCgiLiIpOgogICAgICAgIG1hdGNoID0gX3ByZWZpeF9yZWdleC5zZWFyY2goaXRlbSkKICAgICAgICBpZiBtYXRjaDoKICAgICAgICAgICAgcmVzdWx0LmV4dGVuZChtYXRjaC5ncm91cHMoKSkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXN1bHQuYXBwZW5kKGl0ZW0pCiAgICByZXR1cm4gcmVzdWx0CgoKZGVmIF9wYWRfdmVyc2lvbihsZWZ0LCByaWdodCk6CiAgICBsZWZ0X3NwbGl0LCByaWdodF9zcGxpdCA9IFtdLCBbXQoKICAgICMgR2V0IHRoZSByZWxlYXNlIHNlZ21lbnQgb2Ygb3VyIHZlcnNpb25zCiAgICBsZWZ0X3NwbGl0LmFwcGVuZChsaXN0KGl0ZXJ0b29scy50YWtld2hpbGUobGFtYmRhIHg6IHguaXNkaWdpdCgpLCBsZWZ0KSkpCiAgICByaWdodF9zcGxpdC5hcHBlbmQobGlzdChpdGVydG9vbHMudGFrZXdoaWxlKGxhbWJkYSB4OiB4LmlzZGlnaXQoKSwgcmlnaHQpKSkKCiAgICAjIEdldCB0aGUgcmVzdCBvZiBvdXIgdmVyc2lvbnMKICAgIGxlZnRfc3BsaXQuYXBwZW5kKGxlZnRbbGVuKGxlZnRfc3BsaXRbMF0pOl0pCiAgICByaWdodF9zcGxpdC5hcHBlbmQocmlnaHRbbGVuKHJpZ2h0X3NwbGl0WzBdKTpdKQoKICAgICMgSW5zZXJ0IG91ciBwYWRkaW5nCiAgICBsZWZ0X3NwbGl0Lmluc2VydCgKICAgICAgICAxLAogICAgICAgIFsiMCJdICogbWF4KDAsIGxlbihyaWdodF9zcGxpdFswXSkgLSBsZW4obGVmdF9zcGxpdFswXSkpLAogICAgKQogICAgcmlnaHRfc3BsaXQuaW5zZXJ0KAogICAgICAgIDEsCiAgICAgICAgWyIwIl0gKiBtYXgoMCwgbGVuKGxlZnRfc3BsaXRbMF0pIC0gbGVuKHJpZ2h0X3NwbGl0WzBdKSksCiAgICApCgogICAgcmV0dXJuICgKICAgICAgICBsaXN0KGl0ZXJ0b29scy5jaGFpbigqbGVmdF9zcGxpdCkpLAogICAgICAgIGxpc3QoaXRlcnRvb2xzLmNoYWluKCpyaWdodF9zcGxpdCkpLAogICAgKQoKCmNsYXNzIFNwZWNpZmllclNldChCYXNlU3BlY2lmaWVyKToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgc3BlY2lmaWVycz0iIiwgcHJlcmVsZWFzZXM9Tm9uZSk6CiAgICAgICAgIyBTcGxpdCBvbiAsIHRvIGJyZWFrIGVhY2ggaW5kaWRpdnVhbCBzcGVjaWZpZXIgaW50byBpdCdzIG93biBpdGVtLCBhbmQKICAgICAgICAjIHN0cmlwIGVhY2ggaXRlbSB0byByZW1vdmUgbGVhZGluZy90cmFpbGluZyB3aGl0ZXNwYWNlLgogICAgICAgIHNwZWNpZmllcnMgPSBbcy5zdHJpcCgpIGZvciBzIGluIHNwZWNpZmllcnMuc3BsaXQoIiwiKSBpZiBzLnN0cmlwKCldCgogICAgICAgICMgUGFyc2VkIGVhY2ggaW5kaXZpZHVhbCBzcGVjaWZpZXIsIGF0dGVtcHRpbmcgZmlyc3QgdG8gbWFrZSBpdCBhCiAgICAgICAgIyBTcGVjaWZpZXIgYW5kIGZhbGxpbmcgYmFjayB0byBhIExlZ2FjeVNwZWNpZmllci4KICAgICAgICBwYXJzZWQgPSBzZXQoKQogICAgICAgIGZvciBzcGVjaWZpZXIgaW4gc3BlY2lmaWVyczoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcGFyc2VkLmFkZChTcGVjaWZpZXIoc3BlY2lmaWVyKSkKICAgICAgICAgICAgZXhjZXB0IEludmFsaWRTcGVjaWZpZXI6CiAgICAgICAgICAgICAgICBwYXJzZWQuYWRkKExlZ2FjeVNwZWNpZmllcihzcGVjaWZpZXIpKQoKICAgICAgICAjIFR1cm4gb3VyIHBhcnNlZCBzcGVjaWZpZXJzIGludG8gYSBmcm96ZW4gc2V0IGFuZCBzYXZlIHRoZW0gZm9yIGxhdGVyLgogICAgICAgIHNlbGYuX3NwZWNzID0gZnJvemVuc2V0KHBhcnNlZCkKCiAgICAgICAgIyBTdG9yZSBvdXIgcHJlcmVsZWFzZXMgdmFsdWUgc28gd2UgY2FuIHVzZSBpdCBsYXRlciB0byBkZXRlcm1pbmUgaWYKICAgICAgICAjIHdlIGFjY2VwdCBwcmVyZWxlYXNlcyBvciBub3QuCiAgICAgICAgc2VsZi5fcHJlcmVsZWFzZXMgPSBwcmVyZWxlYXNlcwoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICBwcmUgPSAoCiAgICAgICAgICAgICIsIHByZXJlbGVhc2VzPXswIXJ9Ii5mb3JtYXQoc2VsZi5wcmVyZWxlYXNlcykKICAgICAgICAgICAgaWYgc2VsZi5fcHJlcmVsZWFzZXMgaXMgbm90IE5vbmUKICAgICAgICAgICAgZWxzZSAiIgogICAgICAgICkKCiAgICAgICAgcmV0dXJuICI8U3BlY2lmaWVyU2V0KHswIXJ9ezF9KT4iLmZvcm1hdChzdHIoc2VsZiksIHByZSkKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIiwiLmpvaW4oc29ydGVkKHN0cihzKSBmb3IgcyBpbiBzZWxmLl9zcGVjcykpCgogICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgICAgIHJldHVybiBoYXNoKHNlbGYuX3NwZWNzKQoKICAgIGRlZiBfX2FuZF9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBzdHJpbmdfdHlwZXMpOgogICAgICAgICAgICBvdGhlciA9IFNwZWNpZmllclNldChvdGhlcikKICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBTcGVjaWZpZXJTZXQpOgogICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKCiAgICAgICAgc3BlY2lmaWVyID0gU3BlY2lmaWVyU2V0KCkKICAgICAgICBzcGVjaWZpZXIuX3NwZWNzID0gZnJvemVuc2V0KHNlbGYuX3NwZWNzIHwgb3RoZXIuX3NwZWNzKQoKICAgICAgICBpZiBzZWxmLl9wcmVyZWxlYXNlcyBpcyBOb25lIGFuZCBvdGhlci5fcHJlcmVsZWFzZXMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNwZWNpZmllci5fcHJlcmVsZWFzZXMgPSBvdGhlci5fcHJlcmVsZWFzZXMKICAgICAgICBlbGlmIHNlbGYuX3ByZXJlbGVhc2VzIGlzIG5vdCBOb25lIGFuZCBvdGhlci5fcHJlcmVsZWFzZXMgaXMgTm9uZToKICAgICAgICAgICAgc3BlY2lmaWVyLl9wcmVyZWxlYXNlcyA9IHNlbGYuX3ByZXJlbGVhc2VzCiAgICAgICAgZWxpZiBzZWxmLl9wcmVyZWxlYXNlcyA9PSBvdGhlci5fcHJlcmVsZWFzZXM6CiAgICAgICAgICAgIHNwZWNpZmllci5fcHJlcmVsZWFzZXMgPSBzZWxmLl9wcmVyZWxlYXNlcwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCiAgICAgICAgICAgICAgICAiQ2Fubm90IGNvbWJpbmUgU3BlY2lmaWVyU2V0cyB3aXRoIFRydWUgYW5kIEZhbHNlIHByZXJlbGVhc2UgIgogICAgICAgICAgICAgICAgIm92ZXJyaWRlcy4iCiAgICAgICAgICAgICkKCiAgICAgICAgcmV0dXJuIHNwZWNpZmllcgoKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHN0cmluZ190eXBlcyk6CiAgICAgICAgICAgIG90aGVyID0gU3BlY2lmaWVyU2V0KG90aGVyKQogICAgICAgIGVsaWYgaXNpbnN0YW5jZShvdGhlciwgX0luZGl2aWR1YWxTcGVjaWZpZXIpOgogICAgICAgICAgICBvdGhlciA9IFNwZWNpZmllclNldChzdHIob3RoZXIpKQogICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIFNwZWNpZmllclNldCk6CiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAoKICAgICAgICByZXR1cm4gc2VsZi5fc3BlY3MgPT0gb3RoZXIuX3NwZWNzCgogICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgc3RyaW5nX3R5cGVzKToKICAgICAgICAgICAgb3RoZXIgPSBTcGVjaWZpZXJTZXQob3RoZXIpCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKG90aGVyLCBfSW5kaXZpZHVhbFNwZWNpZmllcik6CiAgICAgICAgICAgIG90aGVyID0gU3BlY2lmaWVyU2V0KHN0cihvdGhlcikpCiAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgU3BlY2lmaWVyU2V0KToKICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCgogICAgICAgIHJldHVybiBzZWxmLl9zcGVjcyAhPSBvdGhlci5fc3BlY3MKCiAgICBkZWYgX19sZW5fXyhzZWxmKToKICAgICAgICByZXR1cm4gbGVuKHNlbGYuX3NwZWNzKQoKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICByZXR1cm4gaXRlcihzZWxmLl9zcGVjcykKCiAgICBAcHJvcGVydHkKICAgIGRlZiBwcmVyZWxlYXNlcyhzZWxmKToKICAgICAgICAjIElmIHdlIGhhdmUgYmVlbiBnaXZlbiBhbiBleHBsaWNpdCBwcmVyZWxlYXNlIG1vZGlmaWVyLCB0aGVuIHdlJ2xsCiAgICAgICAgIyBwYXNzIHRoYXQgdGhyb3VnaCBoZXJlLgogICAgICAgIGlmIHNlbGYuX3ByZXJlbGVhc2VzIGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fcHJlcmVsZWFzZXMKCiAgICAgICAgIyBJZiB3ZSBkb24ndCBoYXZlIGFueSBzcGVjaWZpZXJzLCBhbmQgd2UgZG9uJ3QgaGF2ZSBhIGZvcmNlZCB2YWx1ZSwKICAgICAgICAjIHRoZW4gd2UnbGwganVzdCByZXR1cm4gTm9uZSBzaW5jZSB3ZSBkb24ndCBrbm93IGlmIHRoaXMgc2hvdWxkIGhhdmUKICAgICAgICAjIHByZS1yZWxlYXNlcyBvciBub3QuCiAgICAgICAgaWYgbm90IHNlbGYuX3NwZWNzOgogICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgICAgICAjIE90aGVyd2lzZSB3ZSdsbCBzZWUgaWYgYW55IG9mIHRoZSBnaXZlbiBzcGVjaWZpZXJzIGFjY2VwdAogICAgICAgICMgcHJlcmVsZWFzZXMsIGlmIGFueSBvZiB0aGVtIGRvIHdlJ2xsIHJldHVybiBUcnVlLCBvdGhlcndpc2UgRmFsc2UuCiAgICAgICAgcmV0dXJuIGFueShzLnByZXJlbGVhc2VzIGZvciBzIGluIHNlbGYuX3NwZWNzKQoKICAgIEBwcmVyZWxlYXNlcy5zZXR0ZXIKICAgIGRlZiBwcmVyZWxlYXNlcyhzZWxmLCB2YWx1ZSk6CiAgICAgICAgc2VsZi5fcHJlcmVsZWFzZXMgPSB2YWx1ZQoKICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwgaXRlbSk6CiAgICAgICAgcmV0dXJuIHNlbGYuY29udGFpbnMoaXRlbSkKCiAgICBkZWYgY29udGFpbnMoc2VsZiwgaXRlbSwgcHJlcmVsZWFzZXM9Tm9uZSk6CiAgICAgICAgIyBFbnN1cmUgdGhhdCBvdXIgaXRlbSBpcyBhIFZlcnNpb24gb3IgTGVnYWN5VmVyc2lvbiBpbnN0YW5jZS4KICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShpdGVtLCAoTGVnYWN5VmVyc2lvbiwgVmVyc2lvbikpOgogICAgICAgICAgICBpdGVtID0gcGFyc2UoaXRlbSkKCiAgICAgICAgIyBEZXRlcm1pbmUgaWYgd2UncmUgZm9yY2luZyBhIHByZXJlbGVhc2Ugb3Igbm90LCBpZiB3ZSdyZSBub3QgZm9yY2luZwogICAgICAgICMgb25lIGZvciB0aGlzIHBhcnRpY3VsYXIgZmlsdGVyIGNhbGwsIHRoZW4gd2UnbGwgdXNlIHdoYXRldmVyIHRoZQogICAgICAgICMgU3BlY2lmaWVyU2V0IHRoaW5rcyBmb3Igd2hldGhlciBvciBub3Qgd2Ugc2hvdWxkIHN1cHBvcnQgcHJlcmVsZWFzZXMuCiAgICAgICAgaWYgcHJlcmVsZWFzZXMgaXMgTm9uZToKICAgICAgICAgICAgcHJlcmVsZWFzZXMgPSBzZWxmLnByZXJlbGVhc2VzCgogICAgICAgICMgV2UgY2FuIGRldGVybWluZSBpZiB3ZSdyZSBnb2luZyB0byBhbGxvdyBwcmUtcmVsZWFzZXMgYnkgbG9va2luZyB0bwogICAgICAgICMgc2VlIGlmIGFueSBvZiB0aGUgdW5kZXJseWluZyBpdGVtcyBzdXBwb3J0cyB0aGVtLiBJZiBub25lIG9mIHRoZW0gZG8KICAgICAgICAjIGFuZCB0aGlzIGl0ZW0gaXMgYSBwcmUtcmVsZWFzZSB0aGVuIHdlIGRvIG5vdCBhbGxvdyBpdCBhbmQgd2UgY2FuCiAgICAgICAgIyBzaG9ydCBjaXJjdWl0IHRoYXQgaGVyZS4KICAgICAgICAjIE5vdGU6IFRoaXMgbWVhbnMgdGhhdCAxLjAuZGV2MSB3b3VsZCBub3QgYmUgY29udGFpbmVkIGluIHNvbWV0aGluZwogICAgICAgICMgICAgICAgbGlrZSA+PTEuMC5kZXZhYmMgaG93ZXZlciBpdCB3b3VsZCBiZSBpbiA+PTEuMC5kZWJhYmMsPjAuMC5kZXYwCiAgICAgICAgaWYgbm90IHByZXJlbGVhc2VzIGFuZCBpdGVtLmlzX3ByZXJlbGVhc2U6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICAjIFdlIHNpbXBseSBkaXNwYXRjaCB0byB0aGUgdW5kZXJseWluZyBzcGVjcyBoZXJlIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZQogICAgICAgICMgZ2l2ZW4gdmVyc2lvbiBpcyBjb250YWluZWQgd2l0aGluIGFsbCBvZiB0aGVtLgogICAgICAgICMgTm90ZTogVGhpcyB1c2Ugb2YgYWxsKCkgaGVyZSBtZWFucyB0aGF0IGFuIGVtcHR5IHNldCBvZiBzcGVjaWZpZXJzCiAgICAgICAgIyAgICAgICB3aWxsIGFsd2F5cyByZXR1cm4gVHJ1ZSwgdGhpcyBpcyBhbiBleHBsaWNpdCBkZXNpZ24gZGVjaXNpb24uCiAgICAgICAgcmV0dXJuIGFsbCgKICAgICAgICAgICAgcy5jb250YWlucyhpdGVtLCBwcmVyZWxlYXNlcz1wcmVyZWxlYXNlcykKICAgICAgICAgICAgZm9yIHMgaW4gc2VsZi5fc3BlY3MKICAgICAgICApCgogICAgZGVmIGZpbHRlcihzZWxmLCBpdGVyYWJsZSwgcHJlcmVsZWFzZXM9Tm9uZSk6CiAgICAgICAgIyBEZXRlcm1pbmUgaWYgd2UncmUgZm9yY2luZyBhIHByZXJlbGVhc2Ugb3Igbm90LCBpZiB3ZSdyZSBub3QgZm9yY2luZwogICAgICAgICMgb25lIGZvciB0aGlzIHBhcnRpY3VsYXIgZmlsdGVyIGNhbGwsIHRoZW4gd2UnbGwgdXNlIHdoYXRldmVyIHRoZQogICAgICAgICMgU3BlY2lmaWVyU2V0IHRoaW5rcyBmb3Igd2hldGhlciBvciBub3Qgd2Ugc2hvdWxkIHN1cHBvcnQgcHJlcmVsZWFzZXMuCiAgICAgICAgaWYgcHJlcmVsZWFzZXMgaXMgTm9uZToKICAgICAgICAgICAgcHJlcmVsZWFzZXMgPSBzZWxmLnByZXJlbGVhc2VzCgogICAgICAgICMgSWYgd2UgaGF2ZSBhbnkgc3BlY2lmaWVycywgdGhlbiB3ZSB3YW50IHRvIHdyYXAgb3VyIGl0ZXJhYmxlIGluIHRoZQogICAgICAgICMgZmlsdGVyIG1ldGhvZCBmb3IgZWFjaCBvbmUsIHRoaXMgd2lsbCBhY3QgYXMgYSBsb2dpY2FsIEFORCBhbW9uZ3N0CiAgICAgICAgIyBlYWNoIHNwZWNpZmllci4KICAgICAgICBpZiBzZWxmLl9zcGVjczoKICAgICAgICAgICAgZm9yIHNwZWMgaW4gc2VsZi5fc3BlY3M6CiAgICAgICAgICAgICAgICBpdGVyYWJsZSA9IHNwZWMuZmlsdGVyKGl0ZXJhYmxlLCBwcmVyZWxlYXNlcz1ib29sKHByZXJlbGVhc2VzKSkKICAgICAgICAgICAgcmV0dXJuIGl0ZXJhYmxlCiAgICAgICAgIyBJZiB3ZSBkbyBub3QgaGF2ZSBhbnkgc3BlY2lmaWVycywgdGhlbiB3ZSBuZWVkIHRvIGhhdmUgYSByb3VnaCBmaWx0ZXIKICAgICAgICAjIHdoaWNoIHdpbGwgZmlsdGVyIG91dCBhbnkgcHJlLXJlbGVhc2VzLCB1bmxlc3MgdGhlcmUgYXJlIG5vIGZpbmFsCiAgICAgICAgIyByZWxlYXNlcywgYW5kIHdoaWNoIHdpbGwgZmlsdGVyIG91dCBMZWdhY3lWZXJzaW9uIGluIGdlbmVyYWwuCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZmlsdGVyZWQgPSBbXQogICAgICAgICAgICBmb3VuZF9wcmVyZWxlYXNlcyA9IFtdCgogICAgICAgICAgICBmb3IgaXRlbSBpbiBpdGVyYWJsZToKICAgICAgICAgICAgICAgICMgRW5zdXJlIHRoYXQgd2Ugc29tZSBraW5kIG9mIFZlcnNpb24gY2xhc3MgZm9yIHRoaXMgaXRlbS4KICAgICAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGl0ZW0sIChMZWdhY3lWZXJzaW9uLCBWZXJzaW9uKSk6CiAgICAgICAgICAgICAgICAgICAgcGFyc2VkX3ZlcnNpb24gPSBwYXJzZShpdGVtKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBwYXJzZWRfdmVyc2lvbiA9IGl0ZW0KCiAgICAgICAgICAgICAgICAjIEZpbHRlciBvdXQgYW55IGl0ZW0gd2hpY2ggaXMgcGFyc2VkIGFzIGEgTGVnYWN5VmVyc2lvbgogICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShwYXJzZWRfdmVyc2lvbiwgTGVnYWN5VmVyc2lvbik6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgICAgICAjIFN0b3JlIGFueSBpdGVtIHdoaWNoIGlzIGEgcHJlLXJlbGVhc2UgZm9yIGxhdGVyIHVubGVzcyB3ZSd2ZQogICAgICAgICAgICAgICAgIyBhbHJlYWR5IGZvdW5kIGEgZmluYWwgdmVyc2lvbiBvciB3ZSBhcmUgYWNjZXB0aW5nIHByZXJlbGVhc2VzCiAgICAgICAgICAgICAgICBpZiBwYXJzZWRfdmVyc2lvbi5pc19wcmVyZWxlYXNlIGFuZCBub3QgcHJlcmVsZWFzZXM6CiAgICAgICAgICAgICAgICAgICAgaWYgbm90IGZpbHRlcmVkOgogICAgICAgICAgICAgICAgICAgICAgICBmb3VuZF9wcmVyZWxlYXNlcy5hcHBlbmQoaXRlbSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWQuYXBwZW5kKGl0ZW0pCgogICAgICAgICAgICAjIElmIHdlJ3ZlIGZvdW5kIG5vIGl0ZW1zIGV4Y2VwdCBmb3IgcHJlLXJlbGVhc2VzLCB0aGVuIHdlJ2xsIGdvCiAgICAgICAgICAgICMgYWhlYWQgYW5kIHVzZSB0aGUgcHJlLXJlbGVhc2VzCiAgICAgICAgICAgIGlmIG5vdCBmaWx0ZXJlZCBhbmQgZm91bmRfcHJlcmVsZWFzZXMgYW5kIHByZXJlbGVhc2VzIGlzIE5vbmU6CiAgICAgICAgICAgICAgICByZXR1cm4gZm91bmRfcHJlcmVsZWFzZXMKCiAgICAgICAgICAgIHJldHVybiBmaWx0ZXJlZApQSwMEFAAAAAAAAAAhAMXqJw+lAQAApQEAADsAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3BhY2thZ2luZy91dGlscy5weSMgVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbgojIDIuMCwgYW5kIHRoZSBCU0QgTGljZW5zZS4gU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyByZXBvc2l0b3J5CiMgZm9yIGNvbXBsZXRlIGRldGFpbHMuCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgcHJpbnRfZnVuY3Rpb24KCmltcG9ydCByZQoKCl9jYW5vbmljYWxpemVfcmVnZXggPSByZS5jb21waWxlKHIiWy1fLl0rIikKCgpkZWYgY2Fub25pY2FsaXplX25hbWUobmFtZSk6CiAgICAjIFRoaXMgaXMgdGFrZW4gZnJvbSBQRVAgNTAzLgogICAgcmV0dXJuIF9jYW5vbmljYWxpemVfcmVnZXguc3ViKCItIiwgbmFtZSkubG93ZXIoKQpQSwMEFAAAAAAAAAAhAA7vxqEkLQAAJC0AAD0AAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3BhY2thZ2luZy92ZXJzaW9uLnB5IyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uCiMgMi4wLCBhbmQgdGhlIEJTRCBMaWNlbnNlLiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHJlcG9zaXRvcnkKIyBmb3IgY29tcGxldGUgZGV0YWlscy4KZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCBwcmludF9mdW5jdGlvbgoKaW1wb3J0IGNvbGxlY3Rpb25zCmltcG9ydCBpdGVydG9vbHMKaW1wb3J0IHJlCgpmcm9tIC5fc3RydWN0dXJlcyBpbXBvcnQgSW5maW5pdHkKCgpfX2FsbF9fID0gWwogICAgInBhcnNlIiwgIlZlcnNpb24iLCAiTGVnYWN5VmVyc2lvbiIsICJJbnZhbGlkVmVyc2lvbiIsICJWRVJTSU9OX1BBVFRFUk4iCl0KCgpfVmVyc2lvbiA9IGNvbGxlY3Rpb25zLm5hbWVkdHVwbGUoCiAgICAiX1ZlcnNpb24iLAogICAgWyJlcG9jaCIsICJyZWxlYXNlIiwgImRldiIsICJwcmUiLCAicG9zdCIsICJsb2NhbCJdLAopCgoKZGVmIHBhcnNlKHZlcnNpb24pOgogICAgIiIiCiAgICBQYXJzZSB0aGUgZ2l2ZW4gdmVyc2lvbiBzdHJpbmcgYW5kIHJldHVybiBlaXRoZXIgYSA6Y2xhc3M6YFZlcnNpb25gIG9iamVjdAogICAgb3IgYSA6Y2xhc3M6YExlZ2FjeVZlcnNpb25gIG9iamVjdCBkZXBlbmRpbmcgb24gaWYgdGhlIGdpdmVuIHZlcnNpb24gaXMKICAgIGEgdmFsaWQgUEVQIDQ0MCB2ZXJzaW9uIG9yIGEgbGVnYWN5IHZlcnNpb24uCiAgICAiIiIKICAgIHRyeToKICAgICAgICByZXR1cm4gVmVyc2lvbih2ZXJzaW9uKQogICAgZXhjZXB0IEludmFsaWRWZXJzaW9uOgogICAgICAgIHJldHVybiBMZWdhY3lWZXJzaW9uKHZlcnNpb24pCgoKY2xhc3MgSW52YWxpZFZlcnNpb24oVmFsdWVFcnJvcik6CiAgICAiIiIKICAgIEFuIGludmFsaWQgdmVyc2lvbiB3YXMgZm91bmQsIHVzZXJzIHNob3VsZCByZWZlciB0byBQRVAgNDQwLgogICAgIiIiCgoKY2xhc3MgX0Jhc2VWZXJzaW9uKG9iamVjdCk6CgogICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgICAgIHJldHVybiBoYXNoKHNlbGYuX2tleSkKCiAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5fY29tcGFyZShvdGhlciwgbGFtYmRhIHMsIG86IHMgPCBvKQoKICAgIGRlZiBfX2xlX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmLl9jb21wYXJlKG90aGVyLCBsYW1iZGEgcywgbzogcyA8PSBvKQoKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmLl9jb21wYXJlKG90aGVyLCBsYW1iZGEgcywgbzogcyA9PSBvKQoKICAgIGRlZiBfX2dlX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmLl9jb21wYXJlKG90aGVyLCBsYW1iZGEgcywgbzogcyA+PSBvKQoKICAgIGRlZiBfX2d0X18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmLl9jb21wYXJlKG90aGVyLCBsYW1iZGEgcywgbzogcyA+IG8pCgogICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2NvbXBhcmUob3RoZXIsIGxhbWJkYSBzLCBvOiBzICE9IG8pCgogICAgZGVmIF9jb21wYXJlKHNlbGYsIG90aGVyLCBtZXRob2QpOgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBfQmFzZVZlcnNpb24pOgogICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKCiAgICAgICAgcmV0dXJuIG1ldGhvZChzZWxmLl9rZXksIG90aGVyLl9rZXkpCgoKY2xhc3MgTGVnYWN5VmVyc2lvbihfQmFzZVZlcnNpb24pOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2ZXJzaW9uKToKICAgICAgICBzZWxmLl92ZXJzaW9uID0gc3RyKHZlcnNpb24pCiAgICAgICAgc2VsZi5fa2V5ID0gX2xlZ2FjeV9jbXBrZXkoc2VsZi5fdmVyc2lvbikKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fdmVyc2lvbgoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIjxMZWdhY3lWZXJzaW9uKHswfSk+Ii5mb3JtYXQocmVwcihzdHIoc2VsZikpKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHB1YmxpYyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fdmVyc2lvbgoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGJhc2VfdmVyc2lvbihzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fdmVyc2lvbgoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGxvY2FsKHNlbGYpOgogICAgICAgIHJldHVybiBOb25lCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfcHJlcmVsZWFzZShzZWxmKToKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc19wb3N0cmVsZWFzZShzZWxmKToKICAgICAgICByZXR1cm4gRmFsc2UKCgpfbGVnYWN5X3ZlcnNpb25fY29tcG9uZW50X3JlID0gcmUuY29tcGlsZSgKICAgIHIiKFxkKyB8IFthLXpdKyB8IFwufCAtKSIsIHJlLlZFUkJPU0UsCikKCl9sZWdhY3lfdmVyc2lvbl9yZXBsYWNlbWVudF9tYXAgPSB7CiAgICAicHJlIjogImMiLCAicHJldmlldyI6ICJjIiwgIi0iOiAiZmluYWwtIiwgInJjIjogImMiLCAiZGV2IjogIkAiLAp9CgoKZGVmIF9wYXJzZV92ZXJzaW9uX3BhcnRzKHMpOgogICAgZm9yIHBhcnQgaW4gX2xlZ2FjeV92ZXJzaW9uX2NvbXBvbmVudF9yZS5zcGxpdChzKToKICAgICAgICBwYXJ0ID0gX2xlZ2FjeV92ZXJzaW9uX3JlcGxhY2VtZW50X21hcC5nZXQocGFydCwgcGFydCkKCiAgICAgICAgaWYgbm90IHBhcnQgb3IgcGFydCA9PSAiLiI6CiAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgIGlmIHBhcnRbOjFdIGluICIwMTIzNDU2Nzg5IjoKICAgICAgICAgICAgIyBwYWQgZm9yIG51bWVyaWMgY29tcGFyaXNvbgogICAgICAgICAgICB5aWVsZCBwYXJ0LnpmaWxsKDgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgeWllbGQgIioiICsgcGFydAoKICAgICMgZW5zdXJlIHRoYXQgYWxwaGEvYmV0YS9jYW5kaWRhdGUgYXJlIGJlZm9yZSBmaW5hbAogICAgeWllbGQgIipmaW5hbCIKCgpkZWYgX2xlZ2FjeV9jbXBrZXkodmVyc2lvbik6CiAgICAjIFdlIGhhcmRjb2RlIGFuIGVwb2NoIG9mIC0xIGhlcmUuIEEgUEVQIDQ0MCB2ZXJzaW9uIGNhbiBvbmx5IGhhdmUgYSBlcG9jaAogICAgIyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMC4gVGhpcyB3aWxsIGVmZmVjdGl2ZWx5IHB1dCB0aGUgTGVnYWN5VmVyc2lvbiwKICAgICMgd2hpY2ggdXNlcyB0aGUgZGVmYWN0byBzdGFuZGFyZCBvcmlnaW5hbGx5IGltcGxlbWVudGVkIGJ5IHNldHVwdG9vbHMsCiAgICAjIGFzIGJlZm9yZSBhbGwgUEVQIDQ0MCB2ZXJzaW9ucy4KICAgIGVwb2NoID0gLTEKCiAgICAjIFRoaXMgc2NoZW1lIGlzIHRha2VuIGZyb20gcGtnX3Jlc291cmNlcy5wYXJzZV92ZXJzaW9uIHNldHVwdG9vbHMgcHJpb3IgdG8KICAgICMgaXQncyBhZG9wdGlvbiBvZiB0aGUgcGFja2FnaW5nIGxpYnJhcnkuCiAgICBwYXJ0cyA9IFtdCiAgICBmb3IgcGFydCBpbiBfcGFyc2VfdmVyc2lvbl9wYXJ0cyh2ZXJzaW9uLmxvd2VyKCkpOgogICAgICAgIGlmIHBhcnQuc3RhcnRzd2l0aCgiKiIpOgogICAgICAgICAgICAjIHJlbW92ZSAiLSIgYmVmb3JlIGEgcHJlcmVsZWFzZSB0YWcKICAgICAgICAgICAgaWYgcGFydCA8ICIqZmluYWwiOgogICAgICAgICAgICAgICAgd2hpbGUgcGFydHMgYW5kIHBhcnRzWy0xXSA9PSAiKmZpbmFsLSI6CiAgICAgICAgICAgICAgICAgICAgcGFydHMucG9wKCkKCiAgICAgICAgICAgICMgcmVtb3ZlIHRyYWlsaW5nIHplcm9zIGZyb20gZWFjaCBzZXJpZXMgb2YgbnVtZXJpYyBwYXJ0cwogICAgICAgICAgICB3aGlsZSBwYXJ0cyBhbmQgcGFydHNbLTFdID09ICIwMDAwMDAwMCI6CiAgICAgICAgICAgICAgICBwYXJ0cy5wb3AoKQoKICAgICAgICBwYXJ0cy5hcHBlbmQocGFydCkKICAgIHBhcnRzID0gdHVwbGUocGFydHMpCgogICAgcmV0dXJuIGVwb2NoLCBwYXJ0cwoKIyBEZWxpYmVyYXRlbHkgbm90IGFuY2hvcmVkIHRvIHRoZSBzdGFydCBhbmQgZW5kIG9mIHRoZSBzdHJpbmcsIHRvIG1ha2UgaXQKIyBlYXNpZXIgZm9yIDNyZCBwYXJ0eSBjb2RlIHRvIHJldXNlClZFUlNJT05fUEFUVEVSTiA9IHIiIiIKICAgIHY/CiAgICAoPzoKICAgICAgICAoPzooP1A8ZXBvY2g+WzAtOV0rKSEpPyAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZXBvY2gKICAgICAgICAoP1A8cmVsZWFzZT5bMC05XSsoPzpcLlswLTldKykqKSAgICAgICAgICAgICAgICAgICMgcmVsZWFzZSBzZWdtZW50CiAgICAgICAgKD9QPHByZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHByZS1yZWxlYXNlCiAgICAgICAgICAgIFstX1wuXT8KICAgICAgICAgICAgKD9QPHByZV9sPihhfGJ8Y3xyY3xhbHBoYXxiZXRhfHByZXxwcmV2aWV3KSkKICAgICAgICAgICAgWy1fXC5dPwogICAgICAgICAgICAoP1A8cHJlX24+WzAtOV0rKT8KICAgICAgICApPwogICAgICAgICg/UDxwb3N0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBwb3N0IHJlbGVhc2UKICAgICAgICAgICAgKD86LSg/UDxwb3N0X24xPlswLTldKykpCiAgICAgICAgICAgIHwKICAgICAgICAgICAgKD86CiAgICAgICAgICAgICAgICBbLV9cLl0/CiAgICAgICAgICAgICAgICAoP1A8cG9zdF9sPnBvc3R8cmV2fHIpCiAgICAgICAgICAgICAgICBbLV9cLl0/CiAgICAgICAgICAgICAgICAoP1A8cG9zdF9uMj5bMC05XSspPwogICAgICAgICAgICApCiAgICAgICAgKT8KICAgICAgICAoP1A8ZGV2PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZGV2IHJlbGVhc2UKICAgICAgICAgICAgWy1fXC5dPwogICAgICAgICAgICAoP1A8ZGV2X2w+ZGV2KQogICAgICAgICAgICBbLV9cLl0/CiAgICAgICAgICAgICg/UDxkZXZfbj5bMC05XSspPwogICAgICAgICk/CiAgICApCiAgICAoPzpcKyg/UDxsb2NhbD5bYS16MC05XSsoPzpbLV9cLl1bYS16MC05XSspKikpPyAgICAgICAjIGxvY2FsIHZlcnNpb24KIiIiCgoKY2xhc3MgVmVyc2lvbihfQmFzZVZlcnNpb24pOgoKICAgIF9yZWdleCA9IHJlLmNvbXBpbGUoCiAgICAgICAgciJeXHMqIiArIFZFUlNJT05fUEFUVEVSTiArIHIiXHMqJCIsCiAgICAgICAgcmUuVkVSQk9TRSB8IHJlLklHTk9SRUNBU0UsCiAgICApCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHZlcnNpb24pOgogICAgICAgICMgVmFsaWRhdGUgdGhlIHZlcnNpb24gYW5kIHBhcnNlIGl0IGludG8gcGllY2VzCiAgICAgICAgbWF0Y2ggPSBzZWxmLl9yZWdleC5zZWFyY2godmVyc2lvbikKICAgICAgICBpZiBub3QgbWF0Y2g6CiAgICAgICAgICAgIHJhaXNlIEludmFsaWRWZXJzaW9uKCJJbnZhbGlkIHZlcnNpb246ICd7MH0nIi5mb3JtYXQodmVyc2lvbikpCgogICAgICAgICMgU3RvcmUgdGhlIHBhcnNlZCBvdXQgcGllY2VzIG9mIHRoZSB2ZXJzaW9uCiAgICAgICAgc2VsZi5fdmVyc2lvbiA9IF9WZXJzaW9uKAogICAgICAgICAgICBlcG9jaD1pbnQobWF0Y2guZ3JvdXAoImVwb2NoIikpIGlmIG1hdGNoLmdyb3VwKCJlcG9jaCIpIGVsc2UgMCwKICAgICAgICAgICAgcmVsZWFzZT10dXBsZShpbnQoaSkgZm9yIGkgaW4gbWF0Y2guZ3JvdXAoInJlbGVhc2UiKS5zcGxpdCgiLiIpKSwKICAgICAgICAgICAgcHJlPV9wYXJzZV9sZXR0ZXJfdmVyc2lvbigKICAgICAgICAgICAgICAgIG1hdGNoLmdyb3VwKCJwcmVfbCIpLAogICAgICAgICAgICAgICAgbWF0Y2guZ3JvdXAoInByZV9uIiksCiAgICAgICAgICAgICksCiAgICAgICAgICAgIHBvc3Q9X3BhcnNlX2xldHRlcl92ZXJzaW9uKAogICAgICAgICAgICAgICAgbWF0Y2guZ3JvdXAoInBvc3RfbCIpLAogICAgICAgICAgICAgICAgbWF0Y2guZ3JvdXAoInBvc3RfbjEiKSBvciBtYXRjaC5ncm91cCgicG9zdF9uMiIpLAogICAgICAgICAgICApLAogICAgICAgICAgICBkZXY9X3BhcnNlX2xldHRlcl92ZXJzaW9uKAogICAgICAgICAgICAgICAgbWF0Y2guZ3JvdXAoImRldl9sIiksCiAgICAgICAgICAgICAgICBtYXRjaC5ncm91cCgiZGV2X24iKSwKICAgICAgICAgICAgKSwKICAgICAgICAgICAgbG9jYWw9X3BhcnNlX2xvY2FsX3ZlcnNpb24obWF0Y2guZ3JvdXAoImxvY2FsIikpLAogICAgICAgICkKCiAgICAgICAgIyBHZW5lcmF0ZSBhIGtleSB3aGljaCB3aWxsIGJlIHVzZWQgZm9yIHNvcnRpbmcKICAgICAgICBzZWxmLl9rZXkgPSBfY21wa2V5KAogICAgICAgICAgICBzZWxmLl92ZXJzaW9uLmVwb2NoLAogICAgICAgICAgICBzZWxmLl92ZXJzaW9uLnJlbGVhc2UsCiAgICAgICAgICAgIHNlbGYuX3ZlcnNpb24ucHJlLAogICAgICAgICAgICBzZWxmLl92ZXJzaW9uLnBvc3QsCiAgICAgICAgICAgIHNlbGYuX3ZlcnNpb24uZGV2LAogICAgICAgICAgICBzZWxmLl92ZXJzaW9uLmxvY2FsLAogICAgICAgICkKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICI8VmVyc2lvbih7MH0pPiIuZm9ybWF0KHJlcHIoc3RyKHNlbGYpKSkKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICBwYXJ0cyA9IFtdCgogICAgICAgICMgRXBvY2gKICAgICAgICBpZiBzZWxmLl92ZXJzaW9uLmVwb2NoICE9IDA6CiAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgiezB9ISIuZm9ybWF0KHNlbGYuX3ZlcnNpb24uZXBvY2gpKQoKICAgICAgICAjIFJlbGVhc2Ugc2VnbWVudAogICAgICAgIHBhcnRzLmFwcGVuZCgiLiIuam9pbihzdHIoeCkgZm9yIHggaW4gc2VsZi5fdmVyc2lvbi5yZWxlYXNlKSkKCiAgICAgICAgIyBQcmUtcmVsZWFzZQogICAgICAgIGlmIHNlbGYuX3ZlcnNpb24ucHJlIGlzIG5vdCBOb25lOgogICAgICAgICAgICBwYXJ0cy5hcHBlbmQoIiIuam9pbihzdHIoeCkgZm9yIHggaW4gc2VsZi5fdmVyc2lvbi5wcmUpKQoKICAgICAgICAjIFBvc3QtcmVsZWFzZQogICAgICAgIGlmIHNlbGYuX3ZlcnNpb24ucG9zdCBpcyBub3QgTm9uZToKICAgICAgICAgICAgcGFydHMuYXBwZW5kKCIucG9zdHswfSIuZm9ybWF0KHNlbGYuX3ZlcnNpb24ucG9zdFsxXSkpCgogICAgICAgICMgRGV2ZWxvcG1lbnQgcmVsZWFzZQogICAgICAgIGlmIHNlbGYuX3ZlcnNpb24uZGV2IGlzIG5vdCBOb25lOgogICAgICAgICAgICBwYXJ0cy5hcHBlbmQoIi5kZXZ7MH0iLmZvcm1hdChzZWxmLl92ZXJzaW9uLmRldlsxXSkpCgogICAgICAgICMgTG9jYWwgdmVyc2lvbiBzZWdtZW50CiAgICAgICAgaWYgc2VsZi5fdmVyc2lvbi5sb2NhbCBpcyBub3QgTm9uZToKICAgICAgICAgICAgcGFydHMuYXBwZW5kKAogICAgICAgICAgICAgICAgIit7MH0iLmZvcm1hdCgiLiIuam9pbihzdHIoeCkgZm9yIHggaW4gc2VsZi5fdmVyc2lvbi5sb2NhbCkpCiAgICAgICAgICAgICkKCiAgICAgICAgcmV0dXJuICIiLmpvaW4ocGFydHMpCgogICAgQHByb3BlcnR5CiAgICBkZWYgcHVibGljKHNlbGYpOgogICAgICAgIHJldHVybiBzdHIoc2VsZikuc3BsaXQoIisiLCAxKVswXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGJhc2VfdmVyc2lvbihzZWxmKToKICAgICAgICBwYXJ0cyA9IFtdCgogICAgICAgICMgRXBvY2gKICAgICAgICBpZiBzZWxmLl92ZXJzaW9uLmVwb2NoICE9IDA6CiAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgiezB9ISIuZm9ybWF0KHNlbGYuX3ZlcnNpb24uZXBvY2gpKQoKICAgICAgICAjIFJlbGVhc2Ugc2VnbWVudAogICAgICAgIHBhcnRzLmFwcGVuZCgiLiIuam9pbihzdHIoeCkgZm9yIHggaW4gc2VsZi5fdmVyc2lvbi5yZWxlYXNlKSkKCiAgICAgICAgcmV0dXJuICIiLmpvaW4ocGFydHMpCgogICAgQHByb3BlcnR5CiAgICBkZWYgbG9jYWwoc2VsZik6CiAgICAgICAgdmVyc2lvbl9zdHJpbmcgPSBzdHIoc2VsZikKICAgICAgICBpZiAiKyIgaW4gdmVyc2lvbl9zdHJpbmc6CiAgICAgICAgICAgIHJldHVybiB2ZXJzaW9uX3N0cmluZy5zcGxpdCgiKyIsIDEpWzFdCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfcHJlcmVsZWFzZShzZWxmKToKICAgICAgICByZXR1cm4gYm9vbChzZWxmLl92ZXJzaW9uLmRldiBvciBzZWxmLl92ZXJzaW9uLnByZSkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc19wb3N0cmVsZWFzZShzZWxmKToKICAgICAgICByZXR1cm4gYm9vbChzZWxmLl92ZXJzaW9uLnBvc3QpCgoKZGVmIF9wYXJzZV9sZXR0ZXJfdmVyc2lvbihsZXR0ZXIsIG51bWJlcik6CiAgICBpZiBsZXR0ZXI6CiAgICAgICAgIyBXZSBjb25zaWRlciB0aGVyZSB0byBiZSBhbiBpbXBsaWNpdCAwIGluIGEgcHJlLXJlbGVhc2UgaWYgdGhlcmUgaXMKICAgICAgICAjIG5vdCBhIG51bWVyYWwgYXNzb2NpYXRlZCB3aXRoIGl0LgogICAgICAgIGlmIG51bWJlciBpcyBOb25lOgogICAgICAgICAgICBudW1iZXIgPSAwCgogICAgICAgICMgV2Ugbm9ybWFsaXplIGFueSBsZXR0ZXJzIHRvIHRoZWlyIGxvd2VyIGNhc2UgZm9ybQogICAgICAgIGxldHRlciA9IGxldHRlci5sb3dlcigpCgogICAgICAgICMgV2UgY29uc2lkZXIgc29tZSB3b3JkcyB0byBiZSBhbHRlcm5hdGUgc3BlbGxpbmdzIG9mIG90aGVyIHdvcmRzIGFuZAogICAgICAgICMgaW4gdGhvc2UgY2FzZXMgd2Ugd2FudCB0byBub3JtYWxpemUgdGhlIHNwZWxsaW5ncyB0byBvdXIgcHJlZmVycmVkCiAgICAgICAgIyBzcGVsbGluZy4KICAgICAgICBpZiBsZXR0ZXIgPT0gImFscGhhIjoKICAgICAgICAgICAgbGV0dGVyID0gImEiCiAgICAgICAgZWxpZiBsZXR0ZXIgPT0gImJldGEiOgogICAgICAgICAgICBsZXR0ZXIgPSAiYiIKICAgICAgICBlbGlmIGxldHRlciBpbiBbImMiLCAicHJlIiwgInByZXZpZXciXToKICAgICAgICAgICAgbGV0dGVyID0gInJjIgogICAgICAgIGVsaWYgbGV0dGVyIGluIFsicmV2IiwgInIiXToKICAgICAgICAgICAgbGV0dGVyID0gInBvc3QiCgogICAgICAgIHJldHVybiBsZXR0ZXIsIGludChudW1iZXIpCiAgICBpZiBub3QgbGV0dGVyIGFuZCBudW1iZXI6CiAgICAgICAgIyBXZSBhc3N1bWUgaWYgd2UgYXJlIGdpdmVuIGEgbnVtYmVyLCBidXQgd2UgYXJlIG5vdCBnaXZlbiBhIGxldHRlcgogICAgICAgICMgdGhlbiB0aGlzIGlzIHVzaW5nIHRoZSBpbXBsaWNpdCBwb3N0IHJlbGVhc2Ugc3ludGF4IChlLmcuIDEuMC0xKQogICAgICAgIGxldHRlciA9ICJwb3N0IgoKICAgICAgICByZXR1cm4gbGV0dGVyLCBpbnQobnVtYmVyKQoKCl9sb2NhbF92ZXJzaW9uX3NlcGVyYXRvcnMgPSByZS5jb21waWxlKHIiW1wuXy1dIikKCgpkZWYgX3BhcnNlX2xvY2FsX3ZlcnNpb24obG9jYWwpOgogICAgIiIiCiAgICBUYWtlcyBhIHN0cmluZyBsaWtlIGFiYy4xLnR3ZWx2ZSBhbmQgdHVybnMgaXQgaW50byAoImFiYyIsIDEsICJ0d2VsdmUiKS4KICAgICIiIgogICAgaWYgbG9jYWwgaXMgbm90IE5vbmU6CiAgICAgICAgcmV0dXJuIHR1cGxlKAogICAgICAgICAgICBwYXJ0Lmxvd2VyKCkgaWYgbm90IHBhcnQuaXNkaWdpdCgpIGVsc2UgaW50KHBhcnQpCiAgICAgICAgICAgIGZvciBwYXJ0IGluIF9sb2NhbF92ZXJzaW9uX3NlcGVyYXRvcnMuc3BsaXQobG9jYWwpCiAgICAgICAgKQoKCmRlZiBfY21wa2V5KGVwb2NoLCByZWxlYXNlLCBwcmUsIHBvc3QsIGRldiwgbG9jYWwpOgogICAgIyBXaGVuIHdlIGNvbXBhcmUgYSByZWxlYXNlIHZlcnNpb24sIHdlIHdhbnQgdG8gY29tcGFyZSBpdCB3aXRoIGFsbCBvZiB0aGUKICAgICMgdHJhaWxpbmcgemVyb3MgcmVtb3ZlZC4gU28gd2UnbGwgdXNlIGEgcmV2ZXJzZSB0aGUgbGlzdCwgZHJvcCBhbGwgdGhlIG5vdwogICAgIyBsZWFkaW5nIHplcm9zIHVudGlsIHdlIGNvbWUgdG8gc29tZXRoaW5nIG5vbiB6ZXJvLCB0aGVuIHRha2UgdGhlIHJlc3QKICAgICMgcmUtcmV2ZXJzZSBpdCBiYWNrIGludG8gdGhlIGNvcnJlY3Qgb3JkZXIgYW5kIG1ha2UgaXQgYSB0dXBsZSBhbmQgdXNlCiAgICAjIHRoYXQgZm9yIG91ciBzb3J0aW5nIGtleS4KICAgIHJlbGVhc2UgPSB0dXBsZSgKICAgICAgICByZXZlcnNlZChsaXN0KAogICAgICAgICAgICBpdGVydG9vbHMuZHJvcHdoaWxlKAogICAgICAgICAgICAgICAgbGFtYmRhIHg6IHggPT0gMCwKICAgICAgICAgICAgICAgIHJldmVyc2VkKHJlbGVhc2UpLAogICAgICAgICAgICApCiAgICAgICAgKSkKICAgICkKCiAgICAjIFdlIG5lZWQgdG8gInRyaWNrIiB0aGUgc29ydGluZyBhbGdvcml0aG0gdG8gcHV0IDEuMC5kZXYwIGJlZm9yZSAxLjBhMC4KICAgICMgV2UnbGwgZG8gdGhpcyBieSBhYnVzaW5nIHRoZSBwcmUgc2VnbWVudCwgYnV0IHdlIF9vbmx5XyB3YW50IHRvIGRvIHRoaXMKICAgICMgaWYgdGhlcmUgaXMgbm90IGEgcHJlIG9yIGEgcG9zdCBzZWdtZW50LiBJZiB3ZSBoYXZlIG9uZSBvZiB0aG9zZSB0aGVuCiAgICAjIHRoZSBub3JtYWwgc29ydGluZyBydWxlcyB3aWxsIGhhbmRsZSB0aGlzIGNhc2UgY29ycmVjdGx5LgogICAgaWYgcHJlIGlzIE5vbmUgYW5kIHBvc3QgaXMgTm9uZSBhbmQgZGV2IGlzIG5vdCBOb25lOgogICAgICAgIHByZSA9IC1JbmZpbml0eQogICAgIyBWZXJzaW9ucyB3aXRob3V0IGEgcHJlLXJlbGVhc2UgKGV4Y2VwdCBhcyBub3RlZCBhYm92ZSkgc2hvdWxkIHNvcnQgYWZ0ZXIKICAgICMgdGhvc2Ugd2l0aCBvbmUuCiAgICBlbGlmIHByZSBpcyBOb25lOgogICAgICAgIHByZSA9IEluZmluaXR5CgogICAgIyBWZXJzaW9ucyB3aXRob3V0IGEgcG9zdCBzZWdtZW50IHNob3VsZCBzb3J0IGJlZm9yZSB0aG9zZSB3aXRoIG9uZS4KICAgIGlmIHBvc3QgaXMgTm9uZToKICAgICAgICBwb3N0ID0gLUluZmluaXR5CgogICAgIyBWZXJzaW9ucyB3aXRob3V0IGEgZGV2ZWxvcG1lbnQgc2VnbWVudCBzaG91bGQgc29ydCBhZnRlciB0aG9zZSB3aXRoIG9uZS4KICAgIGlmIGRldiBpcyBOb25lOgogICAgICAgIGRldiA9IEluZmluaXR5CgogICAgaWYgbG9jYWwgaXMgTm9uZToKICAgICAgICAjIFZlcnNpb25zIHdpdGhvdXQgYSBsb2NhbCBzZWdtZW50IHNob3VsZCBzb3J0IGJlZm9yZSB0aG9zZSB3aXRoIG9uZS4KICAgICAgICBsb2NhbCA9IC1JbmZpbml0eQogICAgZWxzZToKICAgICAgICAjIFZlcnNpb25zIHdpdGggYSBsb2NhbCBzZWdtZW50IG5lZWQgdGhhdCBzZWdtZW50IHBhcnNlZCB0byBpbXBsZW1lbnQKICAgICAgICAjIHRoZSBzb3J0aW5nIHJ1bGVzIGluIFBFUDQ0MC4KICAgICAgICAjIC0gQWxwaGEgbnVtZXJpYyBzZWdtZW50cyBzb3J0IGJlZm9yZSBudW1lcmljIHNlZ21lbnRzCiAgICAgICAgIyAtIEFscGhhIG51bWVyaWMgc2VnbWVudHMgc29ydCBsZXhpY29ncmFwaGljYWxseQogICAgICAgICMgLSBOdW1lcmljIHNlZ21lbnRzIHNvcnQgbnVtZXJpY2FsbHkKICAgICAgICAjIC0gU2hvcnRlciB2ZXJzaW9ucyBzb3J0IGJlZm9yZSBsb25nZXIgdmVyc2lvbnMgd2hlbiB0aGUgcHJlZml4ZXMKICAgICAgICAjICAgbWF0Y2ggZXhhY3RseQogICAgICAgIGxvY2FsID0gdHVwbGUoCiAgICAgICAgICAgIChpLCAiIikgaWYgaXNpbnN0YW5jZShpLCBpbnQpIGVsc2UgKC1JbmZpbml0eSwgaSkKICAgICAgICAgICAgZm9yIGkgaW4gbG9jYWwKICAgICAgICApCgogICAgcmV0dXJuIGVwb2NoLCByZWxlYXNlLCBwcmUsIHBvc3QsIGRldiwgbG9jYWwKUEsDBBQAAAAAAAAAIQDJLUAmPpMBAD6TAQBCAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9wa2dfcmVzb3VyY2VzL19faW5pdF9fLnB5IyBjb2Rpbmc6IHV0Zi04CiIiIgpQYWNrYWdlIHJlc291cmNlIEFQSQotLS0tLS0tLS0tLS0tLS0tLS0tLQoKQSByZXNvdXJjZSBpcyBhIGxvZ2ljYWwgZmlsZSBjb250YWluZWQgd2l0aGluIGEgcGFja2FnZSwgb3IgYSBsb2dpY2FsCnN1YmRpcmVjdG9yeSB0aGVyZW9mLiAgVGhlIHBhY2thZ2UgcmVzb3VyY2UgQVBJIGV4cGVjdHMgcmVzb3VyY2UgbmFtZXMKdG8gaGF2ZSB0aGVpciBwYXRoIHBhcnRzIHNlcGFyYXRlZCB3aXRoIGBgL2BgLCAqbm90KiB3aGF0ZXZlciB0aGUgbG9jYWwKcGF0aCBzZXBhcmF0b3IgaXMuICBEbyBub3QgdXNlIG9zLnBhdGggb3BlcmF0aW9ucyB0byBtYW5pcHVsYXRlIHJlc291cmNlCm5hbWVzIGJlaW5nIHBhc3NlZCBpbnRvIHRoZSBBUEkuCgpUaGUgcGFja2FnZSByZXNvdXJjZSBBUEkgaXMgZGVzaWduZWQgdG8gd29yayB3aXRoIG5vcm1hbCBmaWxlc3lzdGVtIHBhY2thZ2VzLAouZWdnIGZpbGVzLCBhbmQgdW5wYWNrZWQgLmVnZyBmaWxlcy4gIEl0IGNhbiBhbHNvIHdvcmsgaW4gYSBsaW1pdGVkIHdheSB3aXRoCi56aXAgZmlsZXMgYW5kIHdpdGggY3VzdG9tIFBFUCAzMDIgbG9hZGVycyB0aGF0IHN1cHBvcnQgdGhlIGBgZ2V0X2RhdGEoKWBgCm1ldGhvZC4KIiIiCgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IHN5cwppbXBvcnQgb3MKaW1wb3J0IGlvCmltcG9ydCB0aW1lCmltcG9ydCByZQppbXBvcnQgdHlwZXMKaW1wb3J0IHppcGZpbGUKaW1wb3J0IHppcGltcG9ydAppbXBvcnQgd2FybmluZ3MKaW1wb3J0IHN0YXQKaW1wb3J0IGZ1bmN0b29scwppbXBvcnQgcGtndXRpbAppbXBvcnQgb3BlcmF0b3IKaW1wb3J0IHBsYXRmb3JtCmltcG9ydCBjb2xsZWN0aW9ucwppbXBvcnQgcGxpc3RsaWIKaW1wb3J0IGVtYWlsLnBhcnNlcgppbXBvcnQgdGVtcGZpbGUKaW1wb3J0IHRleHR3cmFwCmltcG9ydCBpdGVydG9vbHMKZnJvbSBwa2d1dGlsIGltcG9ydCBnZXRfaW1wb3J0ZXIKCnRyeToKICAgIGltcG9ydCBfaW1wCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICMgUHl0aG9uIDMuMiBjb21wYXRpYmlsaXR5CiAgICBpbXBvcnQgaW1wIGFzIF9pbXAKCmZyb20gcGlwLl92ZW5kb3IgaW1wb3J0IHNpeApmcm9tIHBpcC5fdmVuZG9yLnNpeC5tb3ZlcyBpbXBvcnQgdXJsbGliLCBtYXAsIGZpbHRlcgoKIyBjYXB0dXJlIHRoZXNlIHRvIGJ5cGFzcyBzYW5kYm94aW5nCmZyb20gb3MgaW1wb3J0IHV0aW1lCnRyeToKICAgIGZyb20gb3MgaW1wb3J0IG1rZGlyLCByZW5hbWUsIHVubGluawogICAgV1JJVEVfU1VQUE9SVCA9IFRydWUKZXhjZXB0IEltcG9ydEVycm9yOgogICAgIyBubyB3cml0ZSBzdXBwb3J0LCBwcm9iYWJseSB1bmRlciBHQUUKICAgIFdSSVRFX1NVUFBPUlQgPSBGYWxzZQoKZnJvbSBvcyBpbXBvcnQgb3BlbiBhcyBvc19vcGVuCmZyb20gb3MucGF0aCBpbXBvcnQgaXNkaXIsIHNwbGl0Cgp0cnk6CiAgICBpbXBvcnQgaW1wb3J0bGliLm1hY2hpbmVyeSBhcyBpbXBvcnRsaWJfbWFjaGluZXJ5CiAgICAjIGFjY2VzcyBhdHRyaWJ1dGUgdG8gZm9yY2UgaW1wb3J0IHVuZGVyIGRlbGF5ZWQgaW1wb3J0IG1lY2hhbmlzbXMuCiAgICBpbXBvcnRsaWJfbWFjaGluZXJ5Ll9fbmFtZV9fCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGltcG9ydGxpYl9tYWNoaW5lcnkgPSBOb25lCgpmcm9tIHBpcC5fdmVuZG9yIGltcG9ydCBhcHBkaXJzCmZyb20gcGlwLl92ZW5kb3IgaW1wb3J0IHBhY2thZ2luZwpfX2ltcG9ydF9fKCdwaXAuX3ZlbmRvci5wYWNrYWdpbmcudmVyc2lvbicpCl9faW1wb3J0X18oJ3BpcC5fdmVuZG9yLnBhY2thZ2luZy5zcGVjaWZpZXJzJykKX19pbXBvcnRfXygncGlwLl92ZW5kb3IucGFja2FnaW5nLnJlcXVpcmVtZW50cycpCl9faW1wb3J0X18oJ3BpcC5fdmVuZG9yLnBhY2thZ2luZy5tYXJrZXJzJykKCgppZiAoMywgMCkgPCBzeXMudmVyc2lvbl9pbmZvIDwgKDMsIDMpOgogICAgbXNnID0gKAogICAgICAgICJTdXBwb3J0IGZvciBQeXRob24gMy4wLTMuMiBoYXMgYmVlbiBkcm9wcGVkLiBGdXR1cmUgdmVyc2lvbnMgIgogICAgICAgICJ3aWxsIGZhaWwgaGVyZS4iCiAgICApCiAgICB3YXJuaW5ncy53YXJuKG1zZykKCiMgZGVjbGFyZSBzb21lIGdsb2JhbHMgdGhhdCB3aWxsIGJlIGRlZmluZWQgbGF0ZXIgdG8KIyBzYXRpc2Z5IHRoZSBsaW50ZXJzLgpyZXF1aXJlID0gTm9uZQp3b3JraW5nX3NldCA9IE5vbmUKCgpjbGFzcyBQRVA0NDBXYXJuaW5nKFJ1bnRpbWVXYXJuaW5nKToKICAgICIiIgogICAgVXNlZCB3aGVuIHRoZXJlIGlzIGFuIGlzc3VlIHdpdGggYSB2ZXJzaW9uIG9yIHNwZWNpZmllciBub3QgY29tcGx5aW5nIHdpdGgKICAgIFBFUCA0NDAuCiAgICAiIiIKCgpjbGFzcyBfU2V0dXB0b29sc1ZlcnNpb25NaXhpbihvYmplY3QpOgogICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgICAgIHJldHVybiBzdXBlcihfU2V0dXB0b29sc1ZlcnNpb25NaXhpbiwgc2VsZikuX19oYXNoX18oKQoKICAgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHR1cGxlKToKICAgICAgICAgICAgcmV0dXJuIHR1cGxlKHNlbGYpIDwgb3RoZXIKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gc3VwZXIoX1NldHVwdG9vbHNWZXJzaW9uTWl4aW4sIHNlbGYpLl9fbHRfXyhvdGhlcikKCiAgICBkZWYgX19sZV9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCB0dXBsZSk6CiAgICAgICAgICAgIHJldHVybiB0dXBsZShzZWxmKSA8PSBvdGhlcgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBzdXBlcihfU2V0dXB0b29sc1ZlcnNpb25NaXhpbiwgc2VsZikuX19sZV9fKG90aGVyKQoKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHR1cGxlKToKICAgICAgICAgICAgcmV0dXJuIHR1cGxlKHNlbGYpID09IG90aGVyCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHN1cGVyKF9TZXR1cHRvb2xzVmVyc2lvbk1peGluLCBzZWxmKS5fX2VxX18ob3RoZXIpCgogICAgZGVmIF9fZ2VfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdHVwbGUpOgogICAgICAgICAgICByZXR1cm4gdHVwbGUoc2VsZikgPj0gb3RoZXIKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gc3VwZXIoX1NldHVwdG9vbHNWZXJzaW9uTWl4aW4sIHNlbGYpLl9fZ2VfXyhvdGhlcikKCiAgICBkZWYgX19ndF9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCB0dXBsZSk6CiAgICAgICAgICAgIHJldHVybiB0dXBsZShzZWxmKSA+IG90aGVyCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHN1cGVyKF9TZXR1cHRvb2xzVmVyc2lvbk1peGluLCBzZWxmKS5fX2d0X18ob3RoZXIpCgogICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdHVwbGUpOgogICAgICAgICAgICByZXR1cm4gdHVwbGUoc2VsZikgIT0gb3RoZXIKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gc3VwZXIoX1NldHVwdG9vbHNWZXJzaW9uTWl4aW4sIHNlbGYpLl9fbmVfXyhvdGhlcikKCiAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKICAgICAgICByZXR1cm4gdHVwbGUoc2VsZilba2V5XQoKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICBjb21wb25lbnRfcmUgPSByZS5jb21waWxlKHInKFxkKyB8IFthLXpdKyB8IFwufCAtKScsIHJlLlZFUkJPU0UpCiAgICAgICAgcmVwbGFjZSA9IHsKICAgICAgICAgICAgJ3ByZSc6ICdjJywKICAgICAgICAgICAgJ3ByZXZpZXcnOiAnYycsCiAgICAgICAgICAgICctJzogJ2ZpbmFsLScsCiAgICAgICAgICAgICdyYyc6ICdjJywKICAgICAgICAgICAgJ2Rldic6ICdAJywKICAgICAgICB9LmdldAoKICAgICAgICBkZWYgX3BhcnNlX3ZlcnNpb25fcGFydHMocyk6CiAgICAgICAgICAgIGZvciBwYXJ0IGluIGNvbXBvbmVudF9yZS5zcGxpdChzKToKICAgICAgICAgICAgICAgIHBhcnQgPSByZXBsYWNlKHBhcnQsIHBhcnQpCiAgICAgICAgICAgICAgICBpZiBub3QgcGFydCBvciBwYXJ0ID09ICcuJzoKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgaWYgcGFydFs6MV0gaW4gJzAxMjM0NTY3ODknOgogICAgICAgICAgICAgICAgICAgICMgcGFkIGZvciBudW1lcmljIGNvbXBhcmlzb24KICAgICAgICAgICAgICAgICAgICB5aWVsZCBwYXJ0LnpmaWxsKDgpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHlpZWxkICcqJyArIHBhcnQKCiAgICAgICAgICAgICMgZW5zdXJlIHRoYXQgYWxwaGEvYmV0YS9jYW5kaWRhdGUgYXJlIGJlZm9yZSBmaW5hbAogICAgICAgICAgICB5aWVsZCAnKmZpbmFsJwoKICAgICAgICBkZWYgb2xkX3BhcnNlX3ZlcnNpb24ocyk6CiAgICAgICAgICAgIHBhcnRzID0gW10KICAgICAgICAgICAgZm9yIHBhcnQgaW4gX3BhcnNlX3ZlcnNpb25fcGFydHMocy5sb3dlcigpKToKICAgICAgICAgICAgICAgIGlmIHBhcnQuc3RhcnRzd2l0aCgnKicpOgogICAgICAgICAgICAgICAgICAgICMgcmVtb3ZlICctJyBiZWZvcmUgYSBwcmVyZWxlYXNlIHRhZwogICAgICAgICAgICAgICAgICAgIGlmIHBhcnQgPCAnKmZpbmFsJzoKICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgcGFydHMgYW5kIHBhcnRzWy0xXSA9PSAnKmZpbmFsLSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0cy5wb3AoKQogICAgICAgICAgICAgICAgICAgICMgcmVtb3ZlIHRyYWlsaW5nIHplcm9zIGZyb20gZWFjaCBzZXJpZXMgb2YgbnVtZXJpYyBwYXJ0cwogICAgICAgICAgICAgICAgICAgIHdoaWxlIHBhcnRzIGFuZCBwYXJ0c1stMV0gPT0gJzAwMDAwMDAwJzoKICAgICAgICAgICAgICAgICAgICAgICAgcGFydHMucG9wKCkKICAgICAgICAgICAgICAgIHBhcnRzLmFwcGVuZChwYXJ0KQogICAgICAgICAgICByZXR1cm4gdHVwbGUocGFydHMpCgogICAgICAgICMgV2FybiBmb3IgdXNlIG9mIHRoaXMgZnVuY3Rpb24KICAgICAgICB3YXJuaW5ncy53YXJuKAogICAgICAgICAgICAiWW91IGhhdmUgaXRlcmF0ZWQgb3ZlciB0aGUgcmVzdWx0IG9mICIKICAgICAgICAgICAgInBrZ19yZXNvdXJjZXMucGFyc2VfdmVyc2lvbi4gVGhpcyBpcyBhIGxlZ2FjeSBiZWhhdmlvciB3aGljaCBpcyAiCiAgICAgICAgICAgICJpbmNvbnNpc3RlbnQgd2l0aCB0aGUgbmV3IHZlcnNpb24gY2xhc3MgaW50cm9kdWNlZCBpbiBzZXR1cHRvb2xzICIKICAgICAgICAgICAgIjguMC4gSW4gbW9zdCBjYXNlcywgY29udmVyc2lvbiB0byBhIHR1cGxlIGlzIHVubmVjZXNzYXJ5LiBGb3IgIgogICAgICAgICAgICAiY29tcGFyaXNvbiBvZiB2ZXJzaW9ucywgc29ydCB0aGUgVmVyc2lvbiBpbnN0YW5jZXMgZGlyZWN0bHkuIElmICIKICAgICAgICAgICAgInlvdSBoYXZlIGFub3RoZXIgdXNlIGNhc2UgcmVxdWlyaW5nIHRoZSB0dXBsZSwgcGxlYXNlIGZpbGUgYSAiCiAgICAgICAgICAgICJidWcgd2l0aCB0aGUgc2V0dXB0b29scyBwcm9qZWN0IGRlc2NyaWJpbmcgdGhhdCBuZWVkLiIsCiAgICAgICAgICAgIFJ1bnRpbWVXYXJuaW5nLAogICAgICAgICAgICBzdGFja2xldmVsPTEsCiAgICAgICAgKQoKICAgICAgICBmb3IgcGFydCBpbiBvbGRfcGFyc2VfdmVyc2lvbihzdHIoc2VsZikpOgogICAgICAgICAgICB5aWVsZCBwYXJ0CgoKY2xhc3MgU2V0dXB0b29sc1ZlcnNpb24oX1NldHVwdG9vbHNWZXJzaW9uTWl4aW4sIHBhY2thZ2luZy52ZXJzaW9uLlZlcnNpb24pOgogICAgcGFzcwoKCmNsYXNzIFNldHVwdG9vbHNMZWdhY3lWZXJzaW9uKF9TZXR1cHRvb2xzVmVyc2lvbk1peGluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdpbmcudmVyc2lvbi5MZWdhY3lWZXJzaW9uKToKICAgIHBhc3MKCgpkZWYgcGFyc2VfdmVyc2lvbih2KToKICAgIHRyeToKICAgICAgICByZXR1cm4gU2V0dXB0b29sc1ZlcnNpb24odikKICAgIGV4Y2VwdCBwYWNrYWdpbmcudmVyc2lvbi5JbnZhbGlkVmVyc2lvbjoKICAgICAgICByZXR1cm4gU2V0dXB0b29sc0xlZ2FjeVZlcnNpb24odikKCgpfc3RhdGVfdmFycyA9IHt9CgoKZGVmIF9kZWNsYXJlX3N0YXRlKHZhcnR5cGUsICoqa3cpOgogICAgZ2xvYmFscygpLnVwZGF0ZShrdykKICAgIF9zdGF0ZV92YXJzLnVwZGF0ZShkaWN0LmZyb21rZXlzKGt3LCB2YXJ0eXBlKSkKCgpkZWYgX19nZXRzdGF0ZV9fKCk6CiAgICBzdGF0ZSA9IHt9CiAgICBnID0gZ2xvYmFscygpCiAgICBmb3IgaywgdiBpbiBfc3RhdGVfdmFycy5pdGVtcygpOgogICAgICAgIHN0YXRlW2tdID0gZ1snX3NnZXRfJyArIHZdKGdba10pCiAgICByZXR1cm4gc3RhdGUKCgpkZWYgX19zZXRzdGF0ZV9fKHN0YXRlKToKICAgIGcgPSBnbG9iYWxzKCkKICAgIGZvciBrLCB2IGluIHN0YXRlLml0ZW1zKCk6CiAgICAgICAgZ1snX3NzZXRfJyArIF9zdGF0ZV92YXJzW2tdXShrLCBnW2tdLCB2KQogICAgcmV0dXJuIHN0YXRlCgoKZGVmIF9zZ2V0X2RpY3QodmFsKToKICAgIHJldHVybiB2YWwuY29weSgpCgoKZGVmIF9zc2V0X2RpY3Qoa2V5LCBvYiwgc3RhdGUpOgogICAgb2IuY2xlYXIoKQogICAgb2IudXBkYXRlKHN0YXRlKQoKCmRlZiBfc2dldF9vYmplY3QodmFsKToKICAgIHJldHVybiB2YWwuX19nZXRzdGF0ZV9fKCkKCgpkZWYgX3NzZXRfb2JqZWN0KGtleSwgb2IsIHN0YXRlKToKICAgIG9iLl9fc2V0c3RhdGVfXyhzdGF0ZSkKCgpfc2dldF9ub25lID0gX3NzZXRfbm9uZSA9IGxhbWJkYSAqYXJnczogTm9uZQoKCmRlZiBnZXRfc3VwcG9ydGVkX3BsYXRmb3JtKCk6CiAgICAiIiJSZXR1cm4gdGhpcyBwbGF0Zm9ybSdzIG1heGltdW0gY29tcGF0aWJsZSB2ZXJzaW9uLgoKICAgIGRpc3R1dGlscy51dGlsLmdldF9wbGF0Zm9ybSgpIG5vcm1hbGx5IHJlcG9ydHMgdGhlIG1pbmltdW0gdmVyc2lvbgogICAgb2YgTWFjIE9TIFggdGhhdCB3b3VsZCBiZSByZXF1aXJlZCB0byAqdXNlKiBleHRlbnNpb25zIHByb2R1Y2VkIGJ5CiAgICBkaXN0dXRpbHMuICBCdXQgd2hhdCB3ZSB3YW50IHdoZW4gY2hlY2tpbmcgY29tcGF0aWJpbGl0eSBpcyB0byBrbm93IHRoZQogICAgdmVyc2lvbiBvZiBNYWMgT1MgWCB0aGF0IHdlIGFyZSAqcnVubmluZyouICBUbyBhbGxvdyB1c2FnZSBvZiBwYWNrYWdlcyB0aGF0CiAgICBleHBsaWNpdGx5IHJlcXVpcmUgYSBuZXdlciB2ZXJzaW9uIG9mIE1hYyBPUyBYLCB3ZSBtdXN0IGFsc28ga25vdyB0aGUKICAgIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgT1MuCgogICAgSWYgdGhpcyBjb25kaXRpb24gb2NjdXJzIGZvciBhbnkgb3RoZXIgcGxhdGZvcm0gd2l0aCBhIHZlcnNpb24gaW4gaXRzCiAgICBwbGF0Zm9ybSBzdHJpbmdzLCB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBleHRlbmRlZCBhY2NvcmRpbmdseS4KICAgICIiIgogICAgcGxhdCA9IGdldF9idWlsZF9wbGF0Zm9ybSgpCiAgICBtID0gbWFjb3NWZXJzaW9uU3RyaW5nLm1hdGNoKHBsYXQpCiAgICBpZiBtIGlzIG5vdCBOb25lIGFuZCBzeXMucGxhdGZvcm0gPT0gImRhcndpbiI6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBwbGF0ID0gJ21hY29zeC0lcy0lcycgJSAoJy4nLmpvaW4oX21hY29zeF92ZXJzKClbOjJdKSwgbS5ncm91cCgzKSkKICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgIyBub3QgTWFjIE9TIFgKICAgICAgICAgICAgcGFzcwogICAgcmV0dXJuIHBsYXQKCgpfX2FsbF9fID0gWwogICAgIyBCYXNpYyByZXNvdXJjZSBhY2Nlc3MgYW5kIGRpc3RyaWJ1dGlvbi9lbnRyeSBwb2ludCBkaXNjb3ZlcnkKICAgICdyZXF1aXJlJywgJ3J1bl9zY3JpcHQnLCAnZ2V0X3Byb3ZpZGVyJywgJ2dldF9kaXN0cmlidXRpb24nLAogICAgJ2xvYWRfZW50cnlfcG9pbnQnLCAnZ2V0X2VudHJ5X21hcCcsICdnZXRfZW50cnlfaW5mbycsCiAgICAnaXRlcl9lbnRyeV9wb2ludHMnLAogICAgJ3Jlc291cmNlX3N0cmluZycsICdyZXNvdXJjZV9zdHJlYW0nLCAncmVzb3VyY2VfZmlsZW5hbWUnLAogICAgJ3Jlc291cmNlX2xpc3RkaXInLCAncmVzb3VyY2VfZXhpc3RzJywgJ3Jlc291cmNlX2lzZGlyJywKCiAgICAjIEVudmlyb25tZW50YWwgY29udHJvbAogICAgJ2RlY2xhcmVfbmFtZXNwYWNlJywgJ3dvcmtpbmdfc2V0JywgJ2FkZF9hY3RpdmF0aW9uX2xpc3RlbmVyJywKICAgICdmaW5kX2Rpc3RyaWJ1dGlvbnMnLCAnc2V0X2V4dHJhY3Rpb25fcGF0aCcsICdjbGVhbnVwX3Jlc291cmNlcycsCiAgICAnZ2V0X2RlZmF1bHRfY2FjaGUnLAoKICAgICMgUHJpbWFyeSBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzCiAgICAnRW52aXJvbm1lbnQnLCAnV29ya2luZ1NldCcsICdSZXNvdXJjZU1hbmFnZXInLAogICAgJ0Rpc3RyaWJ1dGlvbicsICdSZXF1aXJlbWVudCcsICdFbnRyeVBvaW50JywKCiAgICAjIEV4Y2VwdGlvbnMKICAgICdSZXNvbHV0aW9uRXJyb3InLCAnVmVyc2lvbkNvbmZsaWN0JywgJ0Rpc3RyaWJ1dGlvbk5vdEZvdW5kJywKICAgICdVbmtub3duRXh0cmEnLCAnRXh0cmFjdGlvbkVycm9yJywKCiAgICAjIFdhcm5pbmdzCiAgICAnUEVQNDQwV2FybmluZycsCgogICAgIyBQYXJzaW5nIGZ1bmN0aW9ucyBhbmQgc3RyaW5nIHV0aWxpdGllcwogICAgJ3BhcnNlX3JlcXVpcmVtZW50cycsICdwYXJzZV92ZXJzaW9uJywgJ3NhZmVfbmFtZScsICdzYWZlX3ZlcnNpb24nLAogICAgJ2dldF9wbGF0Zm9ybScsICdjb21wYXRpYmxlX3BsYXRmb3JtcycsICd5aWVsZF9saW5lcycsICdzcGxpdF9zZWN0aW9ucycsCiAgICAnc2FmZV9leHRyYScsICd0b19maWxlbmFtZScsICdpbnZhbGlkX21hcmtlcicsICdldmFsdWF0ZV9tYXJrZXInLAoKICAgICMgZmlsZXN5c3RlbSB1dGlsaXRpZXMKICAgICdlbnN1cmVfZGlyZWN0b3J5JywgJ25vcm1hbGl6ZV9wYXRoJywKCiAgICAjIERpc3RyaWJ1dGlvbiAicHJlY2VkZW5jZSIgY29uc3RhbnRzCiAgICAnRUdHX0RJU1QnLCAnQklOQVJZX0RJU1QnLCAnU09VUkNFX0RJU1QnLCAnQ0hFQ0tPVVRfRElTVCcsICdERVZFTE9QX0RJU1QnLAoKICAgICMgIlByb3ZpZGVyIiBpbnRlcmZhY2VzLCBpbXBsZW1lbnRhdGlvbnMsIGFuZCByZWdpc3RyYXRpb24vbG9va3VwIEFQSXMKICAgICdJTWV0YWRhdGFQcm92aWRlcicsICdJUmVzb3VyY2VQcm92aWRlcicsICdGaWxlTWV0YWRhdGEnLAogICAgJ1BhdGhNZXRhZGF0YScsICdFZ2dNZXRhZGF0YScsICdFbXB0eVByb3ZpZGVyJywgJ2VtcHR5X3Byb3ZpZGVyJywKICAgICdOdWxsUHJvdmlkZXInLCAnRWdnUHJvdmlkZXInLCAnRGVmYXVsdFByb3ZpZGVyJywgJ1ppcFByb3ZpZGVyJywKICAgICdyZWdpc3Rlcl9maW5kZXInLCAncmVnaXN0ZXJfbmFtZXNwYWNlX2hhbmRsZXInLCAncmVnaXN0ZXJfbG9hZGVyX3R5cGUnLAogICAgJ2ZpeHVwX25hbWVzcGFjZV9wYWNrYWdlcycsICdnZXRfaW1wb3J0ZXInLAoKICAgICMgRGVwcmVjYXRlZC9iYWNrd2FyZCBjb21wYXRpYmlsaXR5IG9ubHkKICAgICdydW5fbWFpbicsICdBdmFpbGFibGVEaXN0cmlidXRpb25zJywKXQoKCmNsYXNzIFJlc29sdXRpb25FcnJvcihFeGNlcHRpb24pOgogICAgIiIiQWJzdHJhY3QgYmFzZSBmb3IgZGVwZW5kZW5jeSByZXNvbHV0aW9uIGVycm9ycyIiIgoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18uX19uYW1lX18gKyByZXByKHNlbGYuYXJncykKCgpjbGFzcyBWZXJzaW9uQ29uZmxpY3QoUmVzb2x1dGlvbkVycm9yKToKICAgICIiIgogICAgQW4gYWxyZWFkeS1pbnN0YWxsZWQgdmVyc2lvbiBjb25mbGljdHMgd2l0aCB0aGUgcmVxdWVzdGVkIHZlcnNpb24uCgogICAgU2hvdWxkIGJlIGluaXRpYWxpemVkIHdpdGggdGhlIGluc3RhbGxlZCBEaXN0cmlidXRpb24gYW5kIHRoZSByZXF1ZXN0ZWQKICAgIFJlcXVpcmVtZW50LgogICAgIiIiCgogICAgX3RlbXBsYXRlID0gIntzZWxmLmRpc3R9IGlzIGluc3RhbGxlZCBidXQge3NlbGYucmVxfSBpcyByZXF1aXJlZCIKCiAgICBAcHJvcGVydHkKICAgIGRlZiBkaXN0KHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLmFyZ3NbMF0KCiAgICBAcHJvcGVydHkKICAgIGRlZiByZXEoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuYXJnc1sxXQoKICAgIGRlZiByZXBvcnQoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3RlbXBsYXRlLmZvcm1hdCgqKmxvY2FscygpKQoKICAgIGRlZiB3aXRoX2NvbnRleHQoc2VsZiwgcmVxdWlyZWRfYnkpOgogICAgICAgICIiIgogICAgICAgIElmIHJlcXVpcmVkX2J5IGlzIG5vbi1lbXB0eSwgcmV0dXJuIGEgdmVyc2lvbiBvZiBzZWxmIHRoYXQgaXMgYQogICAgICAgIENvbnRleHR1YWxWZXJzaW9uQ29uZmxpY3QuCiAgICAgICAgIiIiCiAgICAgICAgaWYgbm90IHJlcXVpcmVkX2J5OgogICAgICAgICAgICByZXR1cm4gc2VsZgogICAgICAgIGFyZ3MgPSBzZWxmLmFyZ3MgKyAocmVxdWlyZWRfYnksKQogICAgICAgIHJldHVybiBDb250ZXh0dWFsVmVyc2lvbkNvbmZsaWN0KCphcmdzKQoKCmNsYXNzIENvbnRleHR1YWxWZXJzaW9uQ29uZmxpY3QoVmVyc2lvbkNvbmZsaWN0KToKICAgICIiIgogICAgQSBWZXJzaW9uQ29uZmxpY3QgdGhhdCBhY2NlcHRzIGEgdGhpcmQgcGFyYW1ldGVyLCB0aGUgc2V0IG9mIHRoZQogICAgcmVxdWlyZW1lbnRzIHRoYXQgcmVxdWlyZWQgdGhlIGluc3RhbGxlZCBEaXN0cmlidXRpb24uCiAgICAiIiIKCiAgICBfdGVtcGxhdGUgPSBWZXJzaW9uQ29uZmxpY3QuX3RlbXBsYXRlICsgJyBieSB7c2VsZi5yZXF1aXJlZF9ieX0nCgogICAgQHByb3BlcnR5CiAgICBkZWYgcmVxdWlyZWRfYnkoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuYXJnc1syXQoKCmNsYXNzIERpc3RyaWJ1dGlvbk5vdEZvdW5kKFJlc29sdXRpb25FcnJvcik6CiAgICAiIiJBIHJlcXVlc3RlZCBkaXN0cmlidXRpb24gd2FzIG5vdCBmb3VuZCIiIgoKICAgIF90ZW1wbGF0ZSA9ICgiVGhlICd7c2VsZi5yZXF9JyBkaXN0cmlidXRpb24gd2FzIG5vdCBmb3VuZCAiCiAgICAgICAgICAgICAgICAgImFuZCBpcyByZXF1aXJlZCBieSB7c2VsZi5yZXF1aXJlcnNfc3RyfSIpCgogICAgQHByb3BlcnR5CiAgICBkZWYgcmVxKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLmFyZ3NbMF0KCiAgICBAcHJvcGVydHkKICAgIGRlZiByZXF1aXJlcnMoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuYXJnc1sxXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHJlcXVpcmVyc19zdHIoc2VsZik6CiAgICAgICAgaWYgbm90IHNlbGYucmVxdWlyZXJzOgogICAgICAgICAgICByZXR1cm4gJ3RoZSBhcHBsaWNhdGlvbicKICAgICAgICByZXR1cm4gJywgJy5qb2luKHNlbGYucmVxdWlyZXJzKQoKICAgIGRlZiByZXBvcnQoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3RlbXBsYXRlLmZvcm1hdCgqKmxvY2FscygpKQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLnJlcG9ydCgpCgoKY2xhc3MgVW5rbm93bkV4dHJhKFJlc29sdXRpb25FcnJvcik6CiAgICAiIiJEaXN0cmlidXRpb24gZG9lc24ndCBoYXZlIGFuICJleHRyYSBmZWF0dXJlIiBvZiB0aGUgZ2l2ZW4gbmFtZSIiIgoKCl9wcm92aWRlcl9mYWN0b3JpZXMgPSB7fQoKUFlfTUFKT1IgPSBzeXMudmVyc2lvbls6M10KRUdHX0RJU1QgPSAzCkJJTkFSWV9ESVNUID0gMgpTT1VSQ0VfRElTVCA9IDEKQ0hFQ0tPVVRfRElTVCA9IDAKREVWRUxPUF9ESVNUID0gLTEKCgpkZWYgcmVnaXN0ZXJfbG9hZGVyX3R5cGUobG9hZGVyX3R5cGUsIHByb3ZpZGVyX2ZhY3RvcnkpOgogICAgIiIiUmVnaXN0ZXIgYHByb3ZpZGVyX2ZhY3RvcnlgIHRvIG1ha2UgcHJvdmlkZXJzIGZvciBgbG9hZGVyX3R5cGVgCgogICAgYGxvYWRlcl90eXBlYCBpcyB0aGUgdHlwZSBvciBjbGFzcyBvZiBhIFBFUCAzMDIgYGBtb2R1bGUuX19sb2FkZXJfX2BgLAogICAgYW5kIGBwcm92aWRlcl9mYWN0b3J5YCBpcyBhIGZ1bmN0aW9uIHRoYXQsIHBhc3NlZCBhICptb2R1bGUqIG9iamVjdCwKICAgIHJldHVybnMgYW4gYGBJUmVzb3VyY2VQcm92aWRlcmBgIGZvciB0aGF0IG1vZHVsZS4KICAgICIiIgogICAgX3Byb3ZpZGVyX2ZhY3Rvcmllc1tsb2FkZXJfdHlwZV0gPSBwcm92aWRlcl9mYWN0b3J5CgoKZGVmIGdldF9wcm92aWRlcihtb2R1bGVPclJlcSk6CiAgICAiIiJSZXR1cm4gYW4gSVJlc291cmNlUHJvdmlkZXIgZm9yIHRoZSBuYW1lZCBtb2R1bGUgb3IgcmVxdWlyZW1lbnQiIiIKICAgIGlmIGlzaW5zdGFuY2UobW9kdWxlT3JSZXEsIFJlcXVpcmVtZW50KToKICAgICAgICByZXR1cm4gd29ya2luZ19zZXQuZmluZChtb2R1bGVPclJlcSkgb3IgcmVxdWlyZShzdHIobW9kdWxlT3JSZXEpKVswXQogICAgdHJ5OgogICAgICAgIG1vZHVsZSA9IHN5cy5tb2R1bGVzW21vZHVsZU9yUmVxXQogICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgIF9faW1wb3J0X18obW9kdWxlT3JSZXEpCiAgICAgICAgbW9kdWxlID0gc3lzLm1vZHVsZXNbbW9kdWxlT3JSZXFdCiAgICBsb2FkZXIgPSBnZXRhdHRyKG1vZHVsZSwgJ19fbG9hZGVyX18nLCBOb25lKQogICAgcmV0dXJuIF9maW5kX2FkYXB0ZXIoX3Byb3ZpZGVyX2ZhY3RvcmllcywgbG9hZGVyKShtb2R1bGUpCgoKZGVmIF9tYWNvc3hfdmVycyhfY2FjaGU9W10pOgogICAgaWYgbm90IF9jYWNoZToKICAgICAgICB2ZXJzaW9uID0gcGxhdGZvcm0ubWFjX3ZlcigpWzBdCiAgICAgICAgIyBmYWxsYmFjayBmb3IgTWFjUG9ydHMKICAgICAgICBpZiB2ZXJzaW9uID09ICcnOgogICAgICAgICAgICBwbGlzdCA9ICcvU3lzdGVtL0xpYnJhcnkvQ29yZVNlcnZpY2VzL1N5c3RlbVZlcnNpb24ucGxpc3QnCiAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHBsaXN0KToKICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIocGxpc3RsaWIsICdyZWFkUGxpc3QnKToKICAgICAgICAgICAgICAgICAgICBwbGlzdF9jb250ZW50ID0gcGxpc3RsaWIucmVhZFBsaXN0KHBsaXN0KQogICAgICAgICAgICAgICAgICAgIGlmICdQcm9kdWN0VmVyc2lvbicgaW4gcGxpc3RfY29udGVudDoKICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiA9IHBsaXN0X2NvbnRlbnRbJ1Byb2R1Y3RWZXJzaW9uJ10KCiAgICAgICAgX2NhY2hlLmFwcGVuZCh2ZXJzaW9uLnNwbGl0KCcuJykpCiAgICByZXR1cm4gX2NhY2hlWzBdCgoKZGVmIF9tYWNvc3hfYXJjaChtYWNoaW5lKToKICAgIHJldHVybiB7J1Bvd2VyUEMnOiAncHBjJywgJ1Bvd2VyX01hY2ludG9zaCc6ICdwcGMnfS5nZXQobWFjaGluZSwgbWFjaGluZSkKCgpkZWYgZ2V0X2J1aWxkX3BsYXRmb3JtKCk6CiAgICAiIiJSZXR1cm4gdGhpcyBwbGF0Zm9ybSdzIHN0cmluZyBmb3IgcGxhdGZvcm0tc3BlY2lmaWMgZGlzdHJpYnV0aW9ucwoKICAgIFhYWCBDdXJyZW50bHkgdGhpcyBpcyB0aGUgc2FtZSBhcyBgYGRpc3R1dGlscy51dGlsLmdldF9wbGF0Zm9ybSgpYGAsIGJ1dCBpdAogICAgbmVlZHMgc29tZSBoYWNrcyBmb3IgTGludXggYW5kIE1hYyBPUyBYLgogICAgIiIiCiAgICB0cnk6CiAgICAgICAgIyBQeXRob24gMi43IG9yID49My4yCiAgICAgICAgZnJvbSBzeXNjb25maWcgaW1wb3J0IGdldF9wbGF0Zm9ybQogICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgIGZyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGdldF9wbGF0Zm9ybQoKICAgIHBsYXQgPSBnZXRfcGxhdGZvcm0oKQogICAgaWYgc3lzLnBsYXRmb3JtID09ICJkYXJ3aW4iIGFuZCBub3QgcGxhdC5zdGFydHN3aXRoKCdtYWNvc3gtJyk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICB2ZXJzaW9uID0gX21hY29zeF92ZXJzKCkKICAgICAgICAgICAgbWFjaGluZSA9IG9zLnVuYW1lKClbNF0ucmVwbGFjZSgiICIsICJfIikKICAgICAgICAgICAgcmV0dXJuICJtYWNvc3gtJWQuJWQtJXMiICUgKGludCh2ZXJzaW9uWzBdKSwgaW50KHZlcnNpb25bMV0pLAogICAgICAgICAgICAgICAgX21hY29zeF9hcmNoKG1hY2hpbmUpKQogICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAjIGlmIHNvbWVvbmUgaXMgcnVubmluZyBhIG5vbi1NYWMgZGFyd2luIHN5c3RlbSwgdGhpcyB3aWxsIGZhbGwKICAgICAgICAgICAgIyB0aHJvdWdoIHRvIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uCiAgICAgICAgICAgIHBhc3MKICAgIHJldHVybiBwbGF0CgoKbWFjb3NWZXJzaW9uU3RyaW5nID0gcmUuY29tcGlsZShyIm1hY29zeC0oXGQrKVwuKFxkKyktKC4qKSIpCmRhcndpblZlcnNpb25TdHJpbmcgPSByZS5jb21waWxlKHIiZGFyd2luLShcZCspXC4oXGQrKVwuKFxkKyktKC4qKSIpCiMgWFhYIGJhY2t3YXJkIGNvbXBhdApnZXRfcGxhdGZvcm0gPSBnZXRfYnVpbGRfcGxhdGZvcm0KCgpkZWYgY29tcGF0aWJsZV9wbGF0Zm9ybXMocHJvdmlkZWQsIHJlcXVpcmVkKToKICAgICIiIkNhbiBjb2RlIGZvciB0aGUgYHByb3ZpZGVkYCBwbGF0Zm9ybSBydW4gb24gdGhlIGByZXF1aXJlZGAgcGxhdGZvcm0/CgogICAgUmV0dXJucyB0cnVlIGlmIGVpdGhlciBwbGF0Zm9ybSBpcyBgYE5vbmVgYCwgb3IgdGhlIHBsYXRmb3JtcyBhcmUgZXF1YWwuCgogICAgWFhYIE5lZWRzIGNvbXBhdGliaWxpdHkgY2hlY2tzIGZvciBMaW51eCBhbmQgb3RoZXIgdW5peHkgT1Nlcy4KICAgICIiIgogICAgaWYgcHJvdmlkZWQgaXMgTm9uZSBvciByZXF1aXJlZCBpcyBOb25lIG9yIHByb3ZpZGVkID09IHJlcXVpcmVkOgogICAgICAgICMgZWFzeSBjYXNlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICAjIE1hYyBPUyBYIHNwZWNpYWwgY2FzZXMKICAgIHJlcU1hYyA9IG1hY29zVmVyc2lvblN0cmluZy5tYXRjaChyZXF1aXJlZCkKICAgIGlmIHJlcU1hYzoKICAgICAgICBwcm92TWFjID0gbWFjb3NWZXJzaW9uU3RyaW5nLm1hdGNoKHByb3ZpZGVkKQoKICAgICAgICAjIGlzIHRoaXMgYSBNYWMgcGFja2FnZT8KICAgICAgICBpZiBub3QgcHJvdk1hYzoKICAgICAgICAgICAgIyB0aGlzIGlzIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciBwYWNrYWdlcyBidWlsdCBiZWZvcmUKICAgICAgICAgICAgIyBzZXR1cHRvb2xzIDAuNi4gQWxsIHBhY2thZ2VzIGJ1aWx0IGFmdGVyIHRoaXMgcG9pbnQgd2lsbAogICAgICAgICAgICAjIHVzZSB0aGUgbmV3IG1hY29zeCBkZXNpZ25hdGlvbi4KICAgICAgICAgICAgcHJvdkRhcndpbiA9IGRhcndpblZlcnNpb25TdHJpbmcubWF0Y2gocHJvdmlkZWQpCiAgICAgICAgICAgIGlmIHByb3ZEYXJ3aW46CiAgICAgICAgICAgICAgICBkdmVyc2lvbiA9IGludChwcm92RGFyd2luLmdyb3VwKDEpKQogICAgICAgICAgICAgICAgbWFjb3N2ZXJzaW9uID0gIiVzLiVzIiAlIChyZXFNYWMuZ3JvdXAoMSksIHJlcU1hYy5ncm91cCgyKSkKICAgICAgICAgICAgICAgIGlmIGR2ZXJzaW9uID09IDcgYW5kIG1hY29zdmVyc2lvbiA+PSAiMTAuMyIgb3IgXAogICAgICAgICAgICAgICAgICAgICAgICBkdmVyc2lvbiA9PSA4IGFuZCBtYWNvc3ZlcnNpb24gPj0gIjEwLjQiOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgICAgICMgZWdnIGlzbid0IG1hY29zeCBvciBsZWdhY3kgZGFyd2luCiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICAjIGFyZSB0aGV5IHRoZSBzYW1lIG1ham9yIHZlcnNpb24gYW5kIG1hY2hpbmUgdHlwZT8KICAgICAgICBpZiBwcm92TWFjLmdyb3VwKDEpICE9IHJlcU1hYy5ncm91cCgxKSBvciBcCiAgICAgICAgICAgICAgICBwcm92TWFjLmdyb3VwKDMpICE9IHJlcU1hYy5ncm91cCgzKToKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgICMgaXMgdGhlIHJlcXVpcmVkIE9TIG1ham9yIHVwZGF0ZSA+PSB0aGUgcHJvdmlkZWQgb25lPwogICAgICAgIGlmIGludChwcm92TWFjLmdyb3VwKDIpKSA+IGludChyZXFNYWMuZ3JvdXAoMikpOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICAjIFhYWCBMaW51eCBhbmQgb3RoZXIgcGxhdGZvcm1zJyBzcGVjaWFsIGNhc2VzIHNob3VsZCBnbyBoZXJlCiAgICByZXR1cm4gRmFsc2UKCgpkZWYgcnVuX3NjcmlwdChkaXN0X3NwZWMsIHNjcmlwdF9uYW1lKToKICAgICIiIkxvY2F0ZSBkaXN0cmlidXRpb24gYGRpc3Rfc3BlY2AgYW5kIHJ1biBpdHMgYHNjcmlwdF9uYW1lYCBzY3JpcHQiIiIKICAgIG5zID0gc3lzLl9nZXRmcmFtZSgxKS5mX2dsb2JhbHMKICAgIG5hbWUgPSBuc1snX19uYW1lX18nXQogICAgbnMuY2xlYXIoKQogICAgbnNbJ19fbmFtZV9fJ10gPSBuYW1lCiAgICByZXF1aXJlKGRpc3Rfc3BlYylbMF0ucnVuX3NjcmlwdChzY3JpcHRfbmFtZSwgbnMpCgoKIyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CnJ1bl9tYWluID0gcnVuX3NjcmlwdAoKCmRlZiBnZXRfZGlzdHJpYnV0aW9uKGRpc3QpOgogICAgIiIiUmV0dXJuIGEgY3VycmVudCBkaXN0cmlidXRpb24gb2JqZWN0IGZvciBhIFJlcXVpcmVtZW50IG9yIHN0cmluZyIiIgogICAgaWYgaXNpbnN0YW5jZShkaXN0LCBzaXguc3RyaW5nX3R5cGVzKToKICAgICAgICBkaXN0ID0gUmVxdWlyZW1lbnQucGFyc2UoZGlzdCkKICAgIGlmIGlzaW5zdGFuY2UoZGlzdCwgUmVxdWlyZW1lbnQpOgogICAgICAgIGRpc3QgPSBnZXRfcHJvdmlkZXIoZGlzdCkKICAgIGlmIG5vdCBpc2luc3RhbmNlKGRpc3QsIERpc3RyaWJ1dGlvbik6CiAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJFeHBlY3RlZCBzdHJpbmcsIFJlcXVpcmVtZW50LCBvciBEaXN0cmlidXRpb24iLCBkaXN0KQogICAgcmV0dXJuIGRpc3QKCgpkZWYgbG9hZF9lbnRyeV9wb2ludChkaXN0LCBncm91cCwgbmFtZSk6CiAgICAiIiJSZXR1cm4gYG5hbWVgIGVudHJ5IHBvaW50IG9mIGBncm91cGAgZm9yIGBkaXN0YCBvciByYWlzZSBJbXBvcnRFcnJvciIiIgogICAgcmV0dXJuIGdldF9kaXN0cmlidXRpb24oZGlzdCkubG9hZF9lbnRyeV9wb2ludChncm91cCwgbmFtZSkKCgpkZWYgZ2V0X2VudHJ5X21hcChkaXN0LCBncm91cD1Ob25lKToKICAgICIiIlJldHVybiB0aGUgZW50cnkgcG9pbnQgbWFwIGZvciBgZ3JvdXBgLCBvciB0aGUgZnVsbCBlbnRyeSBtYXAiIiIKICAgIHJldHVybiBnZXRfZGlzdHJpYnV0aW9uKGRpc3QpLmdldF9lbnRyeV9tYXAoZ3JvdXApCgoKZGVmIGdldF9lbnRyeV9pbmZvKGRpc3QsIGdyb3VwLCBuYW1lKToKICAgICIiIlJldHVybiB0aGUgRW50cnlQb2ludCBvYmplY3QgZm9yIGBncm91cGArYG5hbWVgLCBvciBgYE5vbmVgYCIiIgogICAgcmV0dXJuIGdldF9kaXN0cmlidXRpb24oZGlzdCkuZ2V0X2VudHJ5X2luZm8oZ3JvdXAsIG5hbWUpCgoKY2xhc3MgSU1ldGFkYXRhUHJvdmlkZXI6CiAgICBkZWYgaGFzX21ldGFkYXRhKG5hbWUpOgogICAgICAgICIiIkRvZXMgdGhlIHBhY2thZ2UncyBkaXN0cmlidXRpb24gY29udGFpbiB0aGUgbmFtZWQgbWV0YWRhdGE/IiIiCgogICAgZGVmIGdldF9tZXRhZGF0YShuYW1lKToKICAgICAgICAiIiJUaGUgbmFtZWQgbWV0YWRhdGEgcmVzb3VyY2UgYXMgYSBzdHJpbmciIiIKCiAgICBkZWYgZ2V0X21ldGFkYXRhX2xpbmVzKG5hbWUpOgogICAgICAgICIiIllpZWxkIG5hbWVkIG1ldGFkYXRhIHJlc291cmNlIGFzIGxpc3Qgb2Ygbm9uLWJsYW5rIG5vbi1jb21tZW50IGxpbmVzCgogICAgICAgTGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSBpcyBzdHJpcHBlZCBmcm9tIGVhY2ggbGluZSwgYW5kIGxpbmVzCiAgICAgICB3aXRoIGBgI2BgIGFzIHRoZSBmaXJzdCBub24tYmxhbmsgY2hhcmFjdGVyIGFyZSBvbWl0dGVkLiIiIgoKICAgIGRlZiBtZXRhZGF0YV9pc2RpcihuYW1lKToKICAgICAgICAiIiJJcyB0aGUgbmFtZWQgbWV0YWRhdGEgYSBkaXJlY3Rvcnk/ICAobGlrZSBgYG9zLnBhdGguaXNkaXIoKWBgKSIiIgoKICAgIGRlZiBtZXRhZGF0YV9saXN0ZGlyKG5hbWUpOgogICAgICAgICIiIkxpc3Qgb2YgbWV0YWRhdGEgbmFtZXMgaW4gdGhlIGRpcmVjdG9yeSAobGlrZSBgYG9zLmxpc3RkaXIoKWBgKSIiIgoKICAgIGRlZiBydW5fc2NyaXB0KHNjcmlwdF9uYW1lLCBuYW1lc3BhY2UpOgogICAgICAgICIiIkV4ZWN1dGUgdGhlIG5hbWVkIHNjcmlwdCBpbiB0aGUgc3VwcGxpZWQgbmFtZXNwYWNlIGRpY3Rpb25hcnkiIiIKCgpjbGFzcyBJUmVzb3VyY2VQcm92aWRlcihJTWV0YWRhdGFQcm92aWRlcik6CiAgICAiIiJBbiBvYmplY3QgdGhhdCBwcm92aWRlcyBhY2Nlc3MgdG8gcGFja2FnZSByZXNvdXJjZXMiIiIKCiAgICBkZWYgZ2V0X3Jlc291cmNlX2ZpbGVuYW1lKG1hbmFnZXIsIHJlc291cmNlX25hbWUpOgogICAgICAgICIiIlJldHVybiBhIHRydWUgZmlsZXN5c3RlbSBwYXRoIGZvciBgcmVzb3VyY2VfbmFtZWAKCiAgICAgICAgYG1hbmFnZXJgIG11c3QgYmUgYW4gYGBJUmVzb3VyY2VNYW5hZ2VyYGAiIiIKCiAgICBkZWYgZ2V0X3Jlc291cmNlX3N0cmVhbShtYW5hZ2VyLCByZXNvdXJjZV9uYW1lKToKICAgICAgICAiIiJSZXR1cm4gYSByZWFkYWJsZSBmaWxlLWxpa2Ugb2JqZWN0IGZvciBgcmVzb3VyY2VfbmFtZWAKCiAgICAgICAgYG1hbmFnZXJgIG11c3QgYmUgYW4gYGBJUmVzb3VyY2VNYW5hZ2VyYGAiIiIKCiAgICBkZWYgZ2V0X3Jlc291cmNlX3N0cmluZyhtYW5hZ2VyLCByZXNvdXJjZV9uYW1lKToKICAgICAgICAiIiJSZXR1cm4gYSBzdHJpbmcgY29udGFpbmluZyB0aGUgY29udGVudHMgb2YgYHJlc291cmNlX25hbWVgCgogICAgICAgIGBtYW5hZ2VyYCBtdXN0IGJlIGFuIGBgSVJlc291cmNlTWFuYWdlcmBgIiIiCgogICAgZGVmIGhhc19yZXNvdXJjZShyZXNvdXJjZV9uYW1lKToKICAgICAgICAiIiJEb2VzIHRoZSBwYWNrYWdlIGNvbnRhaW4gdGhlIG5hbWVkIHJlc291cmNlPyIiIgoKICAgIGRlZiByZXNvdXJjZV9pc2RpcihyZXNvdXJjZV9uYW1lKToKICAgICAgICAiIiJJcyB0aGUgbmFtZWQgcmVzb3VyY2UgYSBkaXJlY3Rvcnk/ICAobGlrZSBgYG9zLnBhdGguaXNkaXIoKWBgKSIiIgoKICAgIGRlZiByZXNvdXJjZV9saXN0ZGlyKHJlc291cmNlX25hbWUpOgogICAgICAgICIiIkxpc3Qgb2YgcmVzb3VyY2UgbmFtZXMgaW4gdGhlIGRpcmVjdG9yeSAobGlrZSBgYG9zLmxpc3RkaXIoKWBgKSIiIgoKCmNsYXNzIFdvcmtpbmdTZXQob2JqZWN0KToKICAgICIiIkEgY29sbGVjdGlvbiBvZiBhY3RpdmUgZGlzdHJpYnV0aW9ucyBvbiBzeXMucGF0aCAob3IgYSBzaW1pbGFyIGxpc3QpIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGVudHJpZXM9Tm9uZSk6CiAgICAgICAgIiIiQ3JlYXRlIHdvcmtpbmcgc2V0IGZyb20gbGlzdCBvZiBwYXRoIGVudHJpZXMgKGRlZmF1bHQ9c3lzLnBhdGgpIiIiCiAgICAgICAgc2VsZi5lbnRyaWVzID0gW10KICAgICAgICBzZWxmLmVudHJ5X2tleXMgPSB7fQogICAgICAgIHNlbGYuYnlfa2V5ID0ge30KICAgICAgICBzZWxmLmNhbGxiYWNrcyA9IFtdCgogICAgICAgIGlmIGVudHJpZXMgaXMgTm9uZToKICAgICAgICAgICAgZW50cmllcyA9IHN5cy5wYXRoCgogICAgICAgIGZvciBlbnRyeSBpbiBlbnRyaWVzOgogICAgICAgICAgICBzZWxmLmFkZF9lbnRyeShlbnRyeSkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfYnVpbGRfbWFzdGVyKGNscyk6CiAgICAgICAgIiIiCiAgICAgICAgUHJlcGFyZSB0aGUgbWFzdGVyIHdvcmtpbmcgc2V0LgogICAgICAgICIiIgogICAgICAgIHdzID0gY2xzKCkKICAgICAgICB0cnk6CiAgICAgICAgICAgIGZyb20gX19tYWluX18gaW1wb3J0IF9fcmVxdWlyZXNfXwogICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICAgICAgIyBUaGUgbWFpbiBwcm9ncmFtIGRvZXMgbm90IGxpc3QgYW55IHJlcXVpcmVtZW50cwogICAgICAgICAgICByZXR1cm4gd3MKCiAgICAgICAgIyBlbnN1cmUgdGhlIHJlcXVpcmVtZW50cyBhcmUgbWV0CiAgICAgICAgdHJ5OgogICAgICAgICAgICB3cy5yZXF1aXJlKF9fcmVxdWlyZXNfXykKICAgICAgICBleGNlcHQgVmVyc2lvbkNvbmZsaWN0OgogICAgICAgICAgICByZXR1cm4gY2xzLl9idWlsZF9mcm9tX3JlcXVpcmVtZW50cyhfX3JlcXVpcmVzX18pCgogICAgICAgIHJldHVybiB3cwoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9idWlsZF9mcm9tX3JlcXVpcmVtZW50cyhjbHMsIHJlcV9zcGVjKToKICAgICAgICAiIiIKICAgICAgICBCdWlsZCBhIHdvcmtpbmcgc2V0IGZyb20gYSByZXF1aXJlbWVudCBzcGVjLiBSZXdyaXRlcyBzeXMucGF0aC4KICAgICAgICAiIiIKICAgICAgICAjIHRyeSBpdCB3aXRob3V0IGRlZmF1bHRzIGFscmVhZHkgb24gc3lzLnBhdGgKICAgICAgICAjIGJ5IHN0YXJ0aW5nIHdpdGggYW4gZW1wdHkgcGF0aAogICAgICAgIHdzID0gY2xzKFtdKQogICAgICAgIHJlcXMgPSBwYXJzZV9yZXF1aXJlbWVudHMocmVxX3NwZWMpCiAgICAgICAgZGlzdHMgPSB3cy5yZXNvbHZlKHJlcXMsIEVudmlyb25tZW50KCkpCiAgICAgICAgZm9yIGRpc3QgaW4gZGlzdHM6CiAgICAgICAgICAgIHdzLmFkZChkaXN0KQoKICAgICAgICAjIGFkZCBhbnkgbWlzc2luZyBlbnRyaWVzIGZyb20gc3lzLnBhdGgKICAgICAgICBmb3IgZW50cnkgaW4gc3lzLnBhdGg6CiAgICAgICAgICAgIGlmIGVudHJ5IG5vdCBpbiB3cy5lbnRyaWVzOgogICAgICAgICAgICAgICAgd3MuYWRkX2VudHJ5KGVudHJ5KQoKICAgICAgICAjIHRoZW4gY29weSBiYWNrIHRvIHN5cy5wYXRoCiAgICAgICAgc3lzLnBhdGhbOl0gPSB3cy5lbnRyaWVzCiAgICAgICAgcmV0dXJuIHdzCgogICAgZGVmIGFkZF9lbnRyeShzZWxmLCBlbnRyeSk6CiAgICAgICAgIiIiQWRkIGEgcGF0aCBpdGVtIHRvIGBgLmVudHJpZXNgYCwgZmluZGluZyBhbnkgZGlzdHJpYnV0aW9ucyBvbiBpdAoKICAgICAgICBgYGZpbmRfZGlzdHJpYnV0aW9ucyhlbnRyeSwgVHJ1ZSlgYCBpcyB1c2VkIHRvIGZpbmQgZGlzdHJpYnV0aW9ucwogICAgICAgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHBhdGggZW50cnksIGFuZCB0aGV5IGFyZSBhZGRlZC4gIGBlbnRyeWAgaXMKICAgICAgICBhbHdheXMgYXBwZW5kZWQgdG8gYGAuZW50cmllc2BgLCBldmVuIGlmIGl0IGlzIGFscmVhZHkgcHJlc2VudC4KICAgICAgICAoVGhpcyBpcyBiZWNhdXNlIGBgc3lzLnBhdGhgYCBjYW4gY29udGFpbiB0aGUgc2FtZSB2YWx1ZSBtb3JlIHRoYW4KICAgICAgICBvbmNlLCBhbmQgdGhlIGBgLmVudHJpZXNgYCBvZiB0aGUgYGBzeXMucGF0aGBgIFdvcmtpbmdTZXQgc2hvdWxkIGFsd2F5cwogICAgICAgIGVxdWFsIGBgc3lzLnBhdGhgYC4pCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5lbnRyeV9rZXlzLnNldGRlZmF1bHQoZW50cnksIFtdKQogICAgICAgIHNlbGYuZW50cmllcy5hcHBlbmQoZW50cnkpCiAgICAgICAgZm9yIGRpc3QgaW4gZmluZF9kaXN0cmlidXRpb25zKGVudHJ5LCBUcnVlKToKICAgICAgICAgICAgc2VsZi5hZGQoZGlzdCwgZW50cnksIEZhbHNlKQoKICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwgZGlzdCk6CiAgICAgICAgIiIiVHJ1ZSBpZiBgZGlzdGAgaXMgdGhlIGFjdGl2ZSBkaXN0cmlidXRpb24gZm9yIGl0cyBwcm9qZWN0IiIiCiAgICAgICAgcmV0dXJuIHNlbGYuYnlfa2V5LmdldChkaXN0LmtleSkgPT0gZGlzdAoKICAgIGRlZiBmaW5kKHNlbGYsIHJlcSk6CiAgICAgICAgIiIiRmluZCBhIGRpc3RyaWJ1dGlvbiBtYXRjaGluZyByZXF1aXJlbWVudCBgcmVxYAoKICAgICAgICBJZiB0aGVyZSBpcyBhbiBhY3RpdmUgZGlzdHJpYnV0aW9uIGZvciB0aGUgcmVxdWVzdGVkIHByb2plY3QsIHRoaXMKICAgICAgICByZXR1cm5zIGl0IGFzIGxvbmcgYXMgaXQgbWVldHMgdGhlIHZlcnNpb24gcmVxdWlyZW1lbnQgc3BlY2lmaWVkIGJ5CiAgICAgICAgYHJlcWAuICBCdXQsIGlmIHRoZXJlIGlzIGFuIGFjdGl2ZSBkaXN0cmlidXRpb24gZm9yIHRoZSBwcm9qZWN0IGFuZCBpdAogICAgICAgIGRvZXMgKm5vdCogbWVldCB0aGUgYHJlcWAgcmVxdWlyZW1lbnQsIGBgVmVyc2lvbkNvbmZsaWN0YGAgaXMgcmFpc2VkLgogICAgICAgIElmIHRoZXJlIGlzIG5vIGFjdGl2ZSBkaXN0cmlidXRpb24gZm9yIHRoZSByZXF1ZXN0ZWQgcHJvamVjdCwgYGBOb25lYGAKICAgICAgICBpcyByZXR1cm5lZC4KICAgICAgICAiIiIKICAgICAgICBkaXN0ID0gc2VsZi5ieV9rZXkuZ2V0KHJlcS5rZXkpCiAgICAgICAgaWYgZGlzdCBpcyBub3QgTm9uZSBhbmQgZGlzdCBub3QgaW4gcmVxOgogICAgICAgICAgICAjIFhYWCBhZGQgbW9yZSBpbmZvCiAgICAgICAgICAgIHJhaXNlIFZlcnNpb25Db25mbGljdChkaXN0LCByZXEpCiAgICAgICAgcmV0dXJuIGRpc3QKCiAgICBkZWYgaXRlcl9lbnRyeV9wb2ludHMoc2VsZiwgZ3JvdXAsIG5hbWU9Tm9uZSk6CiAgICAgICAgIiIiWWllbGQgZW50cnkgcG9pbnQgb2JqZWN0cyBmcm9tIGBncm91cGAgbWF0Y2hpbmcgYG5hbWVgCgogICAgICAgIElmIGBuYW1lYCBpcyBOb25lLCB5aWVsZHMgYWxsIGVudHJ5IHBvaW50cyBpbiBgZ3JvdXBgIGZyb20gYWxsCiAgICAgICAgZGlzdHJpYnV0aW9ucyBpbiB0aGUgd29ya2luZyBzZXQsIG90aGVyd2lzZSBvbmx5IG9uZXMgbWF0Y2hpbmcKICAgICAgICBib3RoIGBncm91cGAgYW5kIGBuYW1lYCBhcmUgeWllbGRlZCAoaW4gZGlzdHJpYnV0aW9uIG9yZGVyKS4KICAgICAgICAiIiIKICAgICAgICBmb3IgZGlzdCBpbiBzZWxmOgogICAgICAgICAgICBlbnRyaWVzID0gZGlzdC5nZXRfZW50cnlfbWFwKGdyb3VwKQogICAgICAgICAgICBpZiBuYW1lIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBmb3IgZXAgaW4gZW50cmllcy52YWx1ZXMoKToKICAgICAgICAgICAgICAgICAgICB5aWVsZCBlcAogICAgICAgICAgICBlbGlmIG5hbWUgaW4gZW50cmllczoKICAgICAgICAgICAgICAgIHlpZWxkIGVudHJpZXNbbmFtZV0KCiAgICBkZWYgcnVuX3NjcmlwdChzZWxmLCByZXF1aXJlcywgc2NyaXB0X25hbWUpOgogICAgICAgICIiIkxvY2F0ZSBkaXN0cmlidXRpb24gZm9yIGByZXF1aXJlc2AgYW5kIHJ1biBgc2NyaXB0X25hbWVgIHNjcmlwdCIiIgogICAgICAgIG5zID0gc3lzLl9nZXRmcmFtZSgxKS5mX2dsb2JhbHMKICAgICAgICBuYW1lID0gbnNbJ19fbmFtZV9fJ10KICAgICAgICBucy5jbGVhcigpCiAgICAgICAgbnNbJ19fbmFtZV9fJ10gPSBuYW1lCiAgICAgICAgc2VsZi5yZXF1aXJlKHJlcXVpcmVzKVswXS5ydW5fc2NyaXB0KHNjcmlwdF9uYW1lLCBucykKCiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgIiIiWWllbGQgZGlzdHJpYnV0aW9ucyBmb3Igbm9uLWR1cGxpY2F0ZSBwcm9qZWN0cyBpbiB0aGUgd29ya2luZyBzZXQKCiAgICAgICAgVGhlIHlpZWxkIG9yZGVyIGlzIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgaXRlbXMnIHBhdGggZW50cmllcyB3ZXJlCiAgICAgICAgYWRkZWQgdG8gdGhlIHdvcmtpbmcgc2V0LgogICAgICAgICIiIgogICAgICAgIHNlZW4gPSB7fQogICAgICAgIGZvciBpdGVtIGluIHNlbGYuZW50cmllczoKICAgICAgICAgICAgaWYgaXRlbSBub3QgaW4gc2VsZi5lbnRyeV9rZXlzOgogICAgICAgICAgICAgICAgIyB3b3JrYXJvdW5kIGEgY2FjaGUgaXNzdWUKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICBmb3Iga2V5IGluIHNlbGYuZW50cnlfa2V5c1tpdGVtXToKICAgICAgICAgICAgICAgIGlmIGtleSBub3QgaW4gc2VlbjoKICAgICAgICAgICAgICAgICAgICBzZWVuW2tleV0gPSAxCiAgICAgICAgICAgICAgICAgICAgeWllbGQgc2VsZi5ieV9rZXlba2V5XQoKICAgIGRlZiBhZGQoc2VsZiwgZGlzdCwgZW50cnk9Tm9uZSwgaW5zZXJ0PVRydWUsIHJlcGxhY2U9RmFsc2UpOgogICAgICAgICIiIkFkZCBgZGlzdGAgdG8gd29ya2luZyBzZXQsIGFzc29jaWF0ZWQgd2l0aCBgZW50cnlgCgogICAgICAgIElmIGBlbnRyeWAgaXMgdW5zcGVjaWZpZWQsIGl0IGRlZmF1bHRzIHRvIHRoZSBgYC5sb2NhdGlvbmBgIG9mIGBkaXN0YC4KICAgICAgICBPbiBleGl0IGZyb20gdGhpcyByb3V0aW5lLCBgZW50cnlgIGlzIGFkZGVkIHRvIHRoZSBlbmQgb2YgdGhlIHdvcmtpbmcKICAgICAgICBzZXQncyBgYC5lbnRyaWVzYGAgKGlmIGl0IHdhc24ndCBhbHJlYWR5IHByZXNlbnQpLgoKICAgICAgICBgZGlzdGAgaXMgb25seSBhZGRlZCB0byB0aGUgd29ya2luZyBzZXQgaWYgaXQncyBmb3IgYSBwcm9qZWN0IHRoYXQKICAgICAgICBkb2Vzbid0IGFscmVhZHkgaGF2ZSBhIGRpc3RyaWJ1dGlvbiBpbiB0aGUgc2V0LCB1bmxlc3MgYHJlcGxhY2U9VHJ1ZWAuCiAgICAgICAgSWYgaXQncyBhZGRlZCwgYW55IGNhbGxiYWNrcyByZWdpc3RlcmVkIHdpdGggdGhlIGBgc3Vic2NyaWJlKClgYCBtZXRob2QKICAgICAgICB3aWxsIGJlIGNhbGxlZC4KICAgICAgICAiIiIKICAgICAgICBpZiBpbnNlcnQ6CiAgICAgICAgICAgIGRpc3QuaW5zZXJ0X29uKHNlbGYuZW50cmllcywgZW50cnksIHJlcGxhY2U9cmVwbGFjZSkKCiAgICAgICAgaWYgZW50cnkgaXMgTm9uZToKICAgICAgICAgICAgZW50cnkgPSBkaXN0LmxvY2F0aW9uCiAgICAgICAga2V5cyA9IHNlbGYuZW50cnlfa2V5cy5zZXRkZWZhdWx0KGVudHJ5LCBbXSkKICAgICAgICBrZXlzMiA9IHNlbGYuZW50cnlfa2V5cy5zZXRkZWZhdWx0KGRpc3QubG9jYXRpb24sIFtdKQogICAgICAgIGlmIG5vdCByZXBsYWNlIGFuZCBkaXN0LmtleSBpbiBzZWxmLmJ5X2tleToKICAgICAgICAgICAgIyBpZ25vcmUgaGlkZGVuIGRpc3Ryb3MKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIHNlbGYuYnlfa2V5W2Rpc3Qua2V5XSA9IGRpc3QKICAgICAgICBpZiBkaXN0LmtleSBub3QgaW4ga2V5czoKICAgICAgICAgICAga2V5cy5hcHBlbmQoZGlzdC5rZXkpCiAgICAgICAgaWYgZGlzdC5rZXkgbm90IGluIGtleXMyOgogICAgICAgICAgICBrZXlzMi5hcHBlbmQoZGlzdC5rZXkpCiAgICAgICAgc2VsZi5fYWRkZWRfbmV3KGRpc3QpCgogICAgZGVmIHJlc29sdmUoc2VsZiwgcmVxdWlyZW1lbnRzLCBlbnY9Tm9uZSwgaW5zdGFsbGVyPU5vbmUsCiAgICAgICAgICAgIHJlcGxhY2VfY29uZmxpY3Rpbmc9RmFsc2UpOgogICAgICAgICIiIkxpc3QgYWxsIGRpc3RyaWJ1dGlvbnMgbmVlZGVkIHRvIChyZWN1cnNpdmVseSkgbWVldCBgcmVxdWlyZW1lbnRzYAoKICAgICAgICBgcmVxdWlyZW1lbnRzYCBtdXN0IGJlIGEgc2VxdWVuY2Ugb2YgYGBSZXF1aXJlbWVudGBgIG9iamVjdHMuICBgZW52YCwKICAgICAgICBpZiBzdXBwbGllZCwgc2hvdWxkIGJlIGFuIGBgRW52aXJvbm1lbnRgYCBpbnN0YW5jZS4gIElmCiAgICAgICAgbm90IHN1cHBsaWVkLCBpdCBkZWZhdWx0cyB0byBhbGwgZGlzdHJpYnV0aW9ucyBhdmFpbGFibGUgd2l0aGluIGFueQogICAgICAgIGVudHJ5IG9yIGRpc3RyaWJ1dGlvbiBpbiB0aGUgd29ya2luZyBzZXQuICBgaW5zdGFsbGVyYCwgaWYgc3VwcGxpZWQsCiAgICAgICAgd2lsbCBiZSBpbnZva2VkIHdpdGggZWFjaCByZXF1aXJlbWVudCB0aGF0IGNhbm5vdCBiZSBtZXQgYnkgYW4KICAgICAgICBhbHJlYWR5LWluc3RhbGxlZCBkaXN0cmlidXRpb247IGl0IHNob3VsZCByZXR1cm4gYSBgYERpc3RyaWJ1dGlvbmBgIG9yCiAgICAgICAgYGBOb25lYGAuCgogICAgICAgIFVubGVzcyBgcmVwbGFjZV9jb25mbGljdGluZz1UcnVlYCwgcmFpc2VzIGEgVmVyc2lvbkNvbmZsaWN0IGV4Y2VwdGlvbiBpZgogICAgICAgIGFueSByZXF1aXJlbWVudHMgYXJlIGZvdW5kIG9uIHRoZSBwYXRoIHRoYXQgaGF2ZSB0aGUgY29ycmVjdCBuYW1lIGJ1dAogICAgICAgIHRoZSB3cm9uZyB2ZXJzaW9uLiAgT3RoZXJ3aXNlLCBpZiBhbiBgaW5zdGFsbGVyYCBpcyBzdXBwbGllZCBpdCB3aWxsIGJlCiAgICAgICAgaW52b2tlZCB0byBvYnRhaW4gdGhlIGNvcnJlY3QgdmVyc2lvbiBvZiB0aGUgcmVxdWlyZW1lbnQgYW5kIGFjdGl2YXRlCiAgICAgICAgaXQuCiAgICAgICAgIiIiCgogICAgICAgICMgc2V0IHVwIHRoZSBzdGFjawogICAgICAgIHJlcXVpcmVtZW50cyA9IGxpc3QocmVxdWlyZW1lbnRzKVs6Oi0xXQogICAgICAgICMgc2V0IG9mIHByb2Nlc3NlZCByZXF1aXJlbWVudHMKICAgICAgICBwcm9jZXNzZWQgPSB7fQogICAgICAgICMga2V5IC0+IGRpc3QKICAgICAgICBiZXN0ID0ge30KICAgICAgICB0b19hY3RpdmF0ZSA9IFtdCgogICAgICAgIHJlcV9leHRyYXMgPSBfUmVxRXh0cmFzKCkKCiAgICAgICAgIyBNYXBwaW5nIG9mIHJlcXVpcmVtZW50IHRvIHNldCBvZiBkaXN0cmlidXRpb25zIHRoYXQgcmVxdWlyZWQgaXQ7CiAgICAgICAgIyB1c2VmdWwgZm9yIHJlcG9ydGluZyBpbmZvIGFib3V0IGNvbmZsaWN0cy4KICAgICAgICByZXF1aXJlZF9ieSA9IGNvbGxlY3Rpb25zLmRlZmF1bHRkaWN0KHNldCkKCiAgICAgICAgd2hpbGUgcmVxdWlyZW1lbnRzOgogICAgICAgICAgICAjIHByb2Nlc3MgZGVwZW5kZW5jaWVzIGJyZWFkdGgtZmlyc3QKICAgICAgICAgICAgcmVxID0gcmVxdWlyZW1lbnRzLnBvcCgwKQogICAgICAgICAgICBpZiByZXEgaW4gcHJvY2Vzc2VkOgogICAgICAgICAgICAgICAgIyBJZ25vcmUgY3ljbGljIG9yIHJlZHVuZGFudCBkZXBlbmRlbmNpZXMKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICBpZiBub3QgcmVxX2V4dHJhcy5tYXJrZXJzX3Bhc3MocmVxKToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICBkaXN0ID0gYmVzdC5nZXQocmVxLmtleSkKICAgICAgICAgICAgaWYgZGlzdCBpcyBOb25lOgogICAgICAgICAgICAgICAgIyBGaW5kIHRoZSBiZXN0IGRpc3RyaWJ1dGlvbiBhbmQgYWRkIGl0IHRvIHRoZSBtYXAKICAgICAgICAgICAgICAgIGRpc3QgPSBzZWxmLmJ5X2tleS5nZXQocmVxLmtleSkKICAgICAgICAgICAgICAgIGlmIGRpc3QgaXMgTm9uZSBvciAoZGlzdCBub3QgaW4gcmVxIGFuZCByZXBsYWNlX2NvbmZsaWN0aW5nKToKICAgICAgICAgICAgICAgICAgICB3cyA9IHNlbGYKICAgICAgICAgICAgICAgICAgICBpZiBlbnYgaXMgTm9uZToKICAgICAgICAgICAgICAgICAgICAgICAgaWYgZGlzdCBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52ID0gRW52aXJvbm1lbnQoc2VsZi5lbnRyaWVzKQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBVc2UgYW4gZW1wdHkgZW52aXJvbm1lbnQgYW5kIHdvcmtpbmdzZXQgdG8gYXZvaWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYW55IGZ1cnRoZXIgY29uZmxpY3RzIHdpdGggdGhlIGNvbmZsaWN0aW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGRpc3RyaWJ1dGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52ID0gRW52aXJvbm1lbnQoW10pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cyA9IFdvcmtpbmdTZXQoW10pCiAgICAgICAgICAgICAgICAgICAgZGlzdCA9IGJlc3RbcmVxLmtleV0gPSBlbnYuYmVzdF9tYXRjaChyZXEsIHdzLCBpbnN0YWxsZXIpCiAgICAgICAgICAgICAgICAgICAgaWYgZGlzdCBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlcnMgPSByZXF1aXJlZF9ieS5nZXQocmVxLCBOb25lKQogICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBEaXN0cmlidXRpb25Ob3RGb3VuZChyZXEsIHJlcXVpcmVycykKICAgICAgICAgICAgICAgIHRvX2FjdGl2YXRlLmFwcGVuZChkaXN0KQogICAgICAgICAgICBpZiBkaXN0IG5vdCBpbiByZXE6CiAgICAgICAgICAgICAgICAjIE9vcHMsIHRoZSAiYmVzdCIgc28gZmFyIGNvbmZsaWN0cyB3aXRoIGEgZGVwZW5kZW5jeQogICAgICAgICAgICAgICAgZGVwZW5kZW50X3JlcSA9IHJlcXVpcmVkX2J5W3JlcV0KICAgICAgICAgICAgICAgIHJhaXNlIFZlcnNpb25Db25mbGljdChkaXN0LCByZXEpLndpdGhfY29udGV4dChkZXBlbmRlbnRfcmVxKQoKICAgICAgICAgICAgIyBwdXNoIHRoZSBuZXcgcmVxdWlyZW1lbnRzIG9udG8gdGhlIHN0YWNrCiAgICAgICAgICAgIG5ld19yZXF1aXJlbWVudHMgPSBkaXN0LnJlcXVpcmVzKHJlcS5leHRyYXMpWzo6LTFdCiAgICAgICAgICAgIHJlcXVpcmVtZW50cy5leHRlbmQobmV3X3JlcXVpcmVtZW50cykKCiAgICAgICAgICAgICMgUmVnaXN0ZXIgdGhlIG5ldyByZXF1aXJlbWVudHMgbmVlZGVkIGJ5IHJlcQogICAgICAgICAgICBmb3IgbmV3X3JlcXVpcmVtZW50IGluIG5ld19yZXF1aXJlbWVudHM6CiAgICAgICAgICAgICAgICByZXF1aXJlZF9ieVtuZXdfcmVxdWlyZW1lbnRdLmFkZChyZXEucHJvamVjdF9uYW1lKQogICAgICAgICAgICAgICAgcmVxX2V4dHJhc1tuZXdfcmVxdWlyZW1lbnRdID0gcmVxLmV4dHJhcwoKICAgICAgICAgICAgcHJvY2Vzc2VkW3JlcV0gPSBUcnVlCgogICAgICAgICMgcmV0dXJuIGxpc3Qgb2YgZGlzdHJvcyB0byBhY3RpdmF0ZQogICAgICAgIHJldHVybiB0b19hY3RpdmF0ZQoKICAgIGRlZiBmaW5kX3BsdWdpbnMoc2VsZiwgcGx1Z2luX2VudiwgZnVsbF9lbnY9Tm9uZSwgaW5zdGFsbGVyPU5vbmUsCiAgICAgICAgICAgIGZhbGxiYWNrPVRydWUpOgogICAgICAgICIiIkZpbmQgYWxsIGFjdGl2YXRhYmxlIGRpc3RyaWJ1dGlvbnMgaW4gYHBsdWdpbl9lbnZgCgogICAgICAgIEV4YW1wbGUgdXNhZ2U6OgoKICAgICAgICAgICAgZGlzdHJpYnV0aW9ucywgZXJyb3JzID0gd29ya2luZ19zZXQuZmluZF9wbHVnaW5zKAogICAgICAgICAgICAgICAgRW52aXJvbm1lbnQocGx1Z2luX2Rpcmxpc3QpCiAgICAgICAgICAgICkKICAgICAgICAgICAgIyBhZGQgcGx1Z2lucytsaWJzIHRvIHN5cy5wYXRoCiAgICAgICAgICAgIG1hcCh3b3JraW5nX3NldC5hZGQsIGRpc3RyaWJ1dGlvbnMpCiAgICAgICAgICAgICMgZGlzcGxheSBlcnJvcnMKICAgICAgICAgICAgcHJpbnQoJ0NvdWxkIG5vdCBsb2FkJywgZXJyb3JzKQoKICAgICAgICBUaGUgYHBsdWdpbl9lbnZgIHNob3VsZCBiZSBhbiBgYEVudmlyb25tZW50YGAgaW5zdGFuY2UgdGhhdCBjb250YWlucwogICAgICAgIG9ubHkgZGlzdHJpYnV0aW9ucyB0aGF0IGFyZSBpbiB0aGUgcHJvamVjdCdzICJwbHVnaW4gZGlyZWN0b3J5IiBvcgogICAgICAgIGRpcmVjdG9yaWVzLiBUaGUgYGZ1bGxfZW52YCwgaWYgc3VwcGxpZWQsIHNob3VsZCBiZSBhbiBgYEVudmlyb25tZW50YGAKICAgICAgICBjb250YWlucyBhbGwgY3VycmVudGx5LWF2YWlsYWJsZSBkaXN0cmlidXRpb25zLiAgSWYgYGZ1bGxfZW52YCBpcyBub3QKICAgICAgICBzdXBwbGllZCwgb25lIGlzIGNyZWF0ZWQgYXV0b21hdGljYWxseSBmcm9tIHRoZSBgYFdvcmtpbmdTZXRgYCB0aGlzCiAgICAgICAgbWV0aG9kIGlzIGNhbGxlZCBvbiwgd2hpY2ggd2lsbCB0eXBpY2FsbHkgbWVhbiB0aGF0IGV2ZXJ5IGRpcmVjdG9yeSBvbgogICAgICAgIGBgc3lzLnBhdGhgYCB3aWxsIGJlIHNjYW5uZWQgZm9yIGRpc3RyaWJ1dGlvbnMuCgogICAgICAgIGBpbnN0YWxsZXJgIGlzIGEgc3RhbmRhcmQgaW5zdGFsbGVyIGNhbGxiYWNrIGFzIHVzZWQgYnkgdGhlCiAgICAgICAgYGByZXNvbHZlKClgYCBtZXRob2QuIFRoZSBgZmFsbGJhY2tgIGZsYWcgaW5kaWNhdGVzIHdoZXRoZXIgd2Ugc2hvdWxkCiAgICAgICAgYXR0ZW1wdCB0byByZXNvbHZlIG9sZGVyIHZlcnNpb25zIG9mIGEgcGx1Z2luIGlmIHRoZSBuZXdlc3QgdmVyc2lvbgogICAgICAgIGNhbm5vdCBiZSByZXNvbHZlZC4KCiAgICAgICAgVGhpcyBtZXRob2QgcmV0dXJucyBhIDItdHVwbGU6IChgZGlzdHJpYnV0aW9uc2AsIGBlcnJvcl9pbmZvYCksIHdoZXJlCiAgICAgICAgYGRpc3RyaWJ1dGlvbnNgIGlzIGEgbGlzdCBvZiB0aGUgZGlzdHJpYnV0aW9ucyBmb3VuZCBpbiBgcGx1Z2luX2VudmAKICAgICAgICB0aGF0IHdlcmUgbG9hZGFibGUsIGFsb25nIHdpdGggYW55IG90aGVyIGRpc3RyaWJ1dGlvbnMgdGhhdCBhcmUgbmVlZGVkCiAgICAgICAgdG8gcmVzb2x2ZSB0aGVpciBkZXBlbmRlbmNpZXMuICBgZXJyb3JfaW5mb2AgaXMgYSBkaWN0aW9uYXJ5IG1hcHBpbmcKICAgICAgICB1bmxvYWRhYmxlIHBsdWdpbiBkaXN0cmlidXRpb25zIHRvIGFuIGV4Y2VwdGlvbiBpbnN0YW5jZSBkZXNjcmliaW5nIHRoZQogICAgICAgIGVycm9yIHRoYXQgb2NjdXJyZWQuIFVzdWFsbHkgdGhpcyB3aWxsIGJlIGEgYGBEaXN0cmlidXRpb25Ob3RGb3VuZGBgIG9yCiAgICAgICAgYGBWZXJzaW9uQ29uZmxpY3RgYCBpbnN0YW5jZS4KICAgICAgICAiIiIKCiAgICAgICAgcGx1Z2luX3Byb2plY3RzID0gbGlzdChwbHVnaW5fZW52KQogICAgICAgICMgc2NhbiBwcm9qZWN0IG5hbWVzIGluIGFscGhhYmV0aWMgb3JkZXIKICAgICAgICBwbHVnaW5fcHJvamVjdHMuc29ydCgpCgogICAgICAgIGVycm9yX2luZm8gPSB7fQogICAgICAgIGRpc3RyaWJ1dGlvbnMgPSB7fQoKICAgICAgICBpZiBmdWxsX2VudiBpcyBOb25lOgogICAgICAgICAgICBlbnYgPSBFbnZpcm9ubWVudChzZWxmLmVudHJpZXMpCiAgICAgICAgICAgIGVudiArPSBwbHVnaW5fZW52CiAgICAgICAgZWxzZToKICAgICAgICAgICAgZW52ID0gZnVsbF9lbnYgKyBwbHVnaW5fZW52CgogICAgICAgIHNoYWRvd19zZXQgPSBzZWxmLl9fY2xhc3NfXyhbXSkKICAgICAgICAjIHB1dCBhbGwgb3VyIGVudHJpZXMgaW4gc2hhZG93X3NldAogICAgICAgIGxpc3QobWFwKHNoYWRvd19zZXQuYWRkLCBzZWxmKSkKCiAgICAgICAgZm9yIHByb2plY3RfbmFtZSBpbiBwbHVnaW5fcHJvamVjdHM6CgogICAgICAgICAgICBmb3IgZGlzdCBpbiBwbHVnaW5fZW52W3Byb2plY3RfbmFtZV06CgogICAgICAgICAgICAgICAgcmVxID0gW2Rpc3QuYXNfcmVxdWlyZW1lbnQoKV0KCiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWVzID0gc2hhZG93X3NldC5yZXNvbHZlKHJlcSwgZW52LCBpbnN0YWxsZXIpCgogICAgICAgICAgICAgICAgZXhjZXB0IFJlc29sdXRpb25FcnJvciBhcyB2OgogICAgICAgICAgICAgICAgICAgICMgc2F2ZSBlcnJvciBpbmZvCiAgICAgICAgICAgICAgICAgICAgZXJyb3JfaW5mb1tkaXN0XSA9IHYKICAgICAgICAgICAgICAgICAgICBpZiBmYWxsYmFjazoKICAgICAgICAgICAgICAgICAgICAgICAgIyB0cnkgdGhlIG5leHQgb2xkZXIgdmVyc2lvbiBvZiBwcm9qZWN0CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgIyBnaXZlIHVwIG9uIHRoaXMgcHJvamVjdCwga2VlcCBnb2luZwogICAgICAgICAgICAgICAgICAgICAgICBicmVhawoKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgbGlzdChtYXAoc2hhZG93X3NldC5hZGQsIHJlc29sdmVlcykpCiAgICAgICAgICAgICAgICAgICAgZGlzdHJpYnV0aW9ucy51cGRhdGUoZGljdC5mcm9ta2V5cyhyZXNvbHZlZXMpKQoKICAgICAgICAgICAgICAgICAgICAjIHN1Y2Nlc3MsIG5vIG5lZWQgdG8gdHJ5IGFueSBtb3JlIHZlcnNpb25zIG9mIHRoaXMgcHJvamVjdAogICAgICAgICAgICAgICAgICAgIGJyZWFrCgogICAgICAgIGRpc3RyaWJ1dGlvbnMgPSBsaXN0KGRpc3RyaWJ1dGlvbnMpCiAgICAgICAgZGlzdHJpYnV0aW9ucy5zb3J0KCkKCiAgICAgICAgcmV0dXJuIGRpc3RyaWJ1dGlvbnMsIGVycm9yX2luZm8KCiAgICBkZWYgcmVxdWlyZShzZWxmLCAqcmVxdWlyZW1lbnRzKToKICAgICAgICAiIiJFbnN1cmUgdGhhdCBkaXN0cmlidXRpb25zIG1hdGNoaW5nIGByZXF1aXJlbWVudHNgIGFyZSBhY3RpdmF0ZWQKCiAgICAgICAgYHJlcXVpcmVtZW50c2AgbXVzdCBiZSBhIHN0cmluZyBvciBhIChwb3NzaWJseS1uZXN0ZWQpIHNlcXVlbmNlCiAgICAgICAgdGhlcmVvZiwgc3BlY2lmeWluZyB0aGUgZGlzdHJpYnV0aW9ucyBhbmQgdmVyc2lvbnMgcmVxdWlyZWQuICBUaGUKICAgICAgICByZXR1cm4gdmFsdWUgaXMgYSBzZXF1ZW5jZSBvZiB0aGUgZGlzdHJpYnV0aW9ucyB0aGF0IG5lZWRlZCB0byBiZQogICAgICAgIGFjdGl2YXRlZCB0byBmdWxmaWxsIHRoZSByZXF1aXJlbWVudHM7IGFsbCByZWxldmFudCBkaXN0cmlidXRpb25zIGFyZQogICAgICAgIGluY2x1ZGVkLCBldmVuIGlmIHRoZXkgd2VyZSBhbHJlYWR5IGFjdGl2YXRlZCBpbiB0aGlzIHdvcmtpbmcgc2V0LgogICAgICAgICIiIgogICAgICAgIG5lZWRlZCA9IHNlbGYucmVzb2x2ZShwYXJzZV9yZXF1aXJlbWVudHMocmVxdWlyZW1lbnRzKSkKCiAgICAgICAgZm9yIGRpc3QgaW4gbmVlZGVkOgogICAgICAgICAgICBzZWxmLmFkZChkaXN0KQoKICAgICAgICByZXR1cm4gbmVlZGVkCgogICAgZGVmIHN1YnNjcmliZShzZWxmLCBjYWxsYmFjaywgZXhpc3Rpbmc9VHJ1ZSk6CiAgICAgICAgIiIiSW52b2tlIGBjYWxsYmFja2AgZm9yIGFsbCBkaXN0cmlidXRpb25zCgogICAgICAgIElmIGBleGlzdGluZz1UcnVlYCAoZGVmYXVsdCksCiAgICAgICAgY2FsbCBvbiBhbGwgZXhpc3Rpbmcgb25lcywgYXMgd2VsbC4KICAgICAgICAiIiIKICAgICAgICBpZiBjYWxsYmFjayBpbiBzZWxmLmNhbGxiYWNrczoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgc2VsZi5jYWxsYmFja3MuYXBwZW5kKGNhbGxiYWNrKQogICAgICAgIGlmIG5vdCBleGlzdGluZzoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgZm9yIGRpc3QgaW4gc2VsZjoKICAgICAgICAgICAgY2FsbGJhY2soZGlzdCkKCiAgICBkZWYgX2FkZGVkX25ldyhzZWxmLCBkaXN0KToKICAgICAgICBmb3IgY2FsbGJhY2sgaW4gc2VsZi5jYWxsYmFja3M6CiAgICAgICAgICAgIGNhbGxiYWNrKGRpc3QpCgogICAgZGVmIF9fZ2V0c3RhdGVfXyhzZWxmKToKICAgICAgICByZXR1cm4gKAogICAgICAgICAgICBzZWxmLmVudHJpZXNbOl0sIHNlbGYuZW50cnlfa2V5cy5jb3B5KCksIHNlbGYuYnlfa2V5LmNvcHkoKSwKICAgICAgICAgICAgc2VsZi5jYWxsYmFja3NbOl0KICAgICAgICApCgogICAgZGVmIF9fc2V0c3RhdGVfXyhzZWxmLCBlX2tfYl9jKToKICAgICAgICBlbnRyaWVzLCBrZXlzLCBieV9rZXksIGNhbGxiYWNrcyA9IGVfa19iX2MKICAgICAgICBzZWxmLmVudHJpZXMgPSBlbnRyaWVzWzpdCiAgICAgICAgc2VsZi5lbnRyeV9rZXlzID0ga2V5cy5jb3B5KCkKICAgICAgICBzZWxmLmJ5X2tleSA9IGJ5X2tleS5jb3B5KCkKICAgICAgICBzZWxmLmNhbGxiYWNrcyA9IGNhbGxiYWNrc1s6XQoKCmNsYXNzIF9SZXFFeHRyYXMoZGljdCk6CiAgICAiIiIKICAgIE1hcCBlYWNoIHJlcXVpcmVtZW50IHRvIHRoZSBleHRyYXMgdGhhdCBkZW1hbmRlZCBpdC4KICAgICIiIgoKICAgIGRlZiBtYXJrZXJzX3Bhc3Moc2VsZiwgcmVxKToKICAgICAgICAiIiIKICAgICAgICBFdmFsdWF0ZSBtYXJrZXJzIGZvciByZXEgYWdhaW5zdCBlYWNoIGV4dHJhIHRoYXQKICAgICAgICBkZW1hbmRlZCBpdC4KCiAgICAgICAgUmV0dXJuIEZhbHNlIGlmIHRoZSByZXEgaGFzIGEgbWFya2VyIGFuZCBmYWlscwogICAgICAgIGV2YWx1YXRpb24uIE90aGVyd2lzZSwgcmV0dXJuIFRydWUuCiAgICAgICAgIiIiCiAgICAgICAgZXh0cmFfZXZhbHMgPSAoCiAgICAgICAgICAgIHJlcS5tYXJrZXIuZXZhbHVhdGUoeydleHRyYSc6IGV4dHJhfSkKICAgICAgICAgICAgZm9yIGV4dHJhIGluIHNlbGYuZ2V0KHJlcSwgKCkpICsgKE5vbmUsKQogICAgICAgICkKICAgICAgICByZXR1cm4gbm90IHJlcS5tYXJrZXIgb3IgYW55KGV4dHJhX2V2YWxzKQoKCmNsYXNzIEVudmlyb25tZW50KG9iamVjdCk6CiAgICAiIiJTZWFyY2hhYmxlIHNuYXBzaG90IG9mIGRpc3RyaWJ1dGlvbnMgb24gYSBzZWFyY2ggcGF0aCIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzZWFyY2hfcGF0aD1Ob25lLCBwbGF0Zm9ybT1nZXRfc3VwcG9ydGVkX3BsYXRmb3JtKCksCiAgICAgICAgICAgIHB5dGhvbj1QWV9NQUpPUik6CiAgICAgICAgIiIiU25hcHNob3QgZGlzdHJpYnV0aW9ucyBhdmFpbGFibGUgb24gYSBzZWFyY2ggcGF0aAoKICAgICAgICBBbnkgZGlzdHJpYnV0aW9ucyBmb3VuZCBvbiBgc2VhcmNoX3BhdGhgIGFyZSBhZGRlZCB0byB0aGUgZW52aXJvbm1lbnQuCiAgICAgICAgYHNlYXJjaF9wYXRoYCBzaG91bGQgYmUgYSBzZXF1ZW5jZSBvZiBgYHN5cy5wYXRoYGAgaXRlbXMuICBJZiBub3QKICAgICAgICBzdXBwbGllZCwgYGBzeXMucGF0aGBgIGlzIHVzZWQuCgogICAgICAgIGBwbGF0Zm9ybWAgaXMgYW4gb3B0aW9uYWwgc3RyaW5nIHNwZWNpZnlpbmcgdGhlIG5hbWUgb2YgdGhlIHBsYXRmb3JtCiAgICAgICAgdGhhdCBwbGF0Zm9ybS1zcGVjaWZpYyBkaXN0cmlidXRpb25zIG11c3QgYmUgY29tcGF0aWJsZSB3aXRoLiAgSWYKICAgICAgICB1bnNwZWNpZmllZCwgaXQgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgcGxhdGZvcm0uICBgcHl0aG9uYCBpcyBhbgogICAgICAgIG9wdGlvbmFsIHN0cmluZyBuYW1pbmcgdGhlIGRlc2lyZWQgdmVyc2lvbiBvZiBQeXRob24gKGUuZy4gYGAnMy4zJ2BgKTsKICAgICAgICBpdCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCB2ZXJzaW9uLgoKICAgICAgICBZb3UgbWF5IGV4cGxpY2l0bHkgc2V0IGBwbGF0Zm9ybWAgKGFuZC9vciBgcHl0aG9uYCkgdG8gYGBOb25lYGAgaWYgeW91CiAgICAgICAgd2lzaCB0byBtYXAgKmFsbCogZGlzdHJpYnV0aW9ucywgbm90IGp1c3QgdGhvc2UgY29tcGF0aWJsZSB3aXRoIHRoZQogICAgICAgIHJ1bm5pbmcgcGxhdGZvcm0gb3IgUHl0aG9uIHZlcnNpb24uCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5fZGlzdG1hcCA9IHt9CiAgICAgICAgc2VsZi5wbGF0Zm9ybSA9IHBsYXRmb3JtCiAgICAgICAgc2VsZi5weXRob24gPSBweXRob24KICAgICAgICBzZWxmLnNjYW4oc2VhcmNoX3BhdGgpCgogICAgZGVmIGNhbl9hZGQoc2VsZiwgZGlzdCk6CiAgICAgICAgIiIiSXMgZGlzdHJpYnV0aW9uIGBkaXN0YCBhY2NlcHRhYmxlIGZvciB0aGlzIGVudmlyb25tZW50PwoKICAgICAgICBUaGUgZGlzdHJpYnV0aW9uIG11c3QgbWF0Y2ggdGhlIHBsYXRmb3JtIGFuZCBweXRob24gdmVyc2lvbgogICAgICAgIHJlcXVpcmVtZW50cyBzcGVjaWZpZWQgd2hlbiB0aGlzIGVudmlyb25tZW50IHdhcyBjcmVhdGVkLCBvciBGYWxzZQogICAgICAgIGlzIHJldHVybmVkLgogICAgICAgICIiIgogICAgICAgIHJldHVybiAoc2VsZi5weXRob24gaXMgTm9uZSBvciBkaXN0LnB5X3ZlcnNpb24gaXMgTm9uZQogICAgICAgICAgICBvciBkaXN0LnB5X3ZlcnNpb24gPT0gc2VsZi5weXRob24pIFwKICAgICAgICAgICAgYW5kIGNvbXBhdGlibGVfcGxhdGZvcm1zKGRpc3QucGxhdGZvcm0sIHNlbGYucGxhdGZvcm0pCgogICAgZGVmIHJlbW92ZShzZWxmLCBkaXN0KToKICAgICAgICAiIiJSZW1vdmUgYGRpc3RgIGZyb20gdGhlIGVudmlyb25tZW50IiIiCiAgICAgICAgc2VsZi5fZGlzdG1hcFtkaXN0LmtleV0ucmVtb3ZlKGRpc3QpCgogICAgZGVmIHNjYW4oc2VsZiwgc2VhcmNoX3BhdGg9Tm9uZSk6CiAgICAgICAgIiIiU2NhbiBgc2VhcmNoX3BhdGhgIGZvciBkaXN0cmlidXRpb25zIHVzYWJsZSBpbiB0aGlzIGVudmlyb25tZW50CgogICAgICAgIEFueSBkaXN0cmlidXRpb25zIGZvdW5kIGFyZSBhZGRlZCB0byB0aGUgZW52aXJvbm1lbnQuCiAgICAgICAgYHNlYXJjaF9wYXRoYCBzaG91bGQgYmUgYSBzZXF1ZW5jZSBvZiBgYHN5cy5wYXRoYGAgaXRlbXMuICBJZiBub3QKICAgICAgICBzdXBwbGllZCwgYGBzeXMucGF0aGBgIGlzIHVzZWQuICBPbmx5IGRpc3RyaWJ1dGlvbnMgY29uZm9ybWluZyB0bwogICAgICAgIHRoZSBwbGF0Zm9ybS9weXRob24gdmVyc2lvbiBkZWZpbmVkIGF0IGluaXRpYWxpemF0aW9uIGFyZSBhZGRlZC4KICAgICAgICAiIiIKICAgICAgICBpZiBzZWFyY2hfcGF0aCBpcyBOb25lOgogICAgICAgICAgICBzZWFyY2hfcGF0aCA9IHN5cy5wYXRoCgogICAgICAgIGZvciBpdGVtIGluIHNlYXJjaF9wYXRoOgogICAgICAgICAgICBmb3IgZGlzdCBpbiBmaW5kX2Rpc3RyaWJ1dGlvbnMoaXRlbSk6CiAgICAgICAgICAgICAgICBzZWxmLmFkZChkaXN0KQoKICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBwcm9qZWN0X25hbWUpOgogICAgICAgICIiIlJldHVybiBhIG5ld2VzdC10by1vbGRlc3QgbGlzdCBvZiBkaXN0cmlidXRpb25zIGZvciBgcHJvamVjdF9uYW1lYAoKICAgICAgICBVc2VzIGNhc2UtaW5zZW5zaXRpdmUgYHByb2plY3RfbmFtZWAgY29tcGFyaXNvbiwgYXNzdW1pbmcgYWxsIHRoZQogICAgICAgIHByb2plY3QncyBkaXN0cmlidXRpb25zIHVzZSB0aGVpciBwcm9qZWN0J3MgbmFtZSBjb252ZXJ0ZWQgdG8gYWxsCiAgICAgICAgbG93ZXJjYXNlIGFzIHRoZWlyIGtleS4KCiAgICAgICAgIiIiCiAgICAgICAgZGlzdHJpYnV0aW9uX2tleSA9IHByb2plY3RfbmFtZS5sb3dlcigpCiAgICAgICAgcmV0dXJuIHNlbGYuX2Rpc3RtYXAuZ2V0KGRpc3RyaWJ1dGlvbl9rZXksIFtdKQoKICAgIGRlZiBhZGQoc2VsZiwgZGlzdCk6CiAgICAgICAgIiIiQWRkIGBkaXN0YCBpZiB3ZSBgYGNhbl9hZGQoKWBgIGl0IGFuZCBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhZGRlZAogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYuY2FuX2FkZChkaXN0KSBhbmQgZGlzdC5oYXNfdmVyc2lvbigpOgogICAgICAgICAgICBkaXN0cyA9IHNlbGYuX2Rpc3RtYXAuc2V0ZGVmYXVsdChkaXN0LmtleSwgW10pCiAgICAgICAgICAgIGlmIGRpc3Qgbm90IGluIGRpc3RzOgogICAgICAgICAgICAgICAgZGlzdHMuYXBwZW5kKGRpc3QpCiAgICAgICAgICAgICAgICBkaXN0cy5zb3J0KGtleT1vcGVyYXRvci5hdHRyZ2V0dGVyKCdoYXNoY21wJyksIHJldmVyc2U9VHJ1ZSkKCiAgICBkZWYgYmVzdF9tYXRjaChzZWxmLCByZXEsIHdvcmtpbmdfc2V0LCBpbnN0YWxsZXI9Tm9uZSk6CiAgICAgICAgIiIiRmluZCBkaXN0cmlidXRpb24gYmVzdCBtYXRjaGluZyBgcmVxYCBhbmQgdXNhYmxlIG9uIGB3b3JraW5nX3NldGAKCiAgICAgICAgVGhpcyBjYWxscyB0aGUgYGBmaW5kKHJlcSlgYCBtZXRob2Qgb2YgdGhlIGB3b3JraW5nX3NldGAgdG8gc2VlIGlmIGEKICAgICAgICBzdWl0YWJsZSBkaXN0cmlidXRpb24gaXMgYWxyZWFkeSBhY3RpdmUuICAoVGhpcyBtYXkgcmFpc2UKICAgICAgICBgYFZlcnNpb25Db25mbGljdGBgIGlmIGFuIHVuc3VpdGFibGUgdmVyc2lvbiBvZiB0aGUgcHJvamVjdCBpcyBhbHJlYWR5CiAgICAgICAgYWN0aXZlIGluIHRoZSBzcGVjaWZpZWQgYHdvcmtpbmdfc2V0YC4pICBJZiBhIHN1aXRhYmxlIGRpc3RyaWJ1dGlvbgogICAgICAgIGlzbid0IGFjdGl2ZSwgdGhpcyBtZXRob2QgcmV0dXJucyB0aGUgbmV3ZXN0IGRpc3RyaWJ1dGlvbiBpbiB0aGUKICAgICAgICBlbnZpcm9ubWVudCB0aGF0IG1lZXRzIHRoZSBgYFJlcXVpcmVtZW50YGAgaW4gYHJlcWAuICBJZiBubyBzdWl0YWJsZQogICAgICAgIGRpc3RyaWJ1dGlvbiBpcyBmb3VuZCwgYW5kIGBpbnN0YWxsZXJgIGlzIHN1cHBsaWVkLCB0aGVuIHRoZSByZXN1bHQgb2YKICAgICAgICBjYWxsaW5nIHRoZSBlbnZpcm9ubWVudCdzIGBgb2J0YWluKHJlcSwgaW5zdGFsbGVyKWBgIG1ldGhvZCB3aWxsIGJlCiAgICAgICAgcmV0dXJuZWQuCiAgICAgICAgIiIiCiAgICAgICAgZGlzdCA9IHdvcmtpbmdfc2V0LmZpbmQocmVxKQogICAgICAgIGlmIGRpc3QgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJldHVybiBkaXN0CiAgICAgICAgZm9yIGRpc3QgaW4gc2VsZltyZXEua2V5XToKICAgICAgICAgICAgaWYgZGlzdCBpbiByZXE6CiAgICAgICAgICAgICAgICByZXR1cm4gZGlzdAogICAgICAgICMgdHJ5IHRvIGRvd25sb2FkL2luc3RhbGwKICAgICAgICByZXR1cm4gc2VsZi5vYnRhaW4ocmVxLCBpbnN0YWxsZXIpCgogICAgZGVmIG9idGFpbihzZWxmLCByZXF1aXJlbWVudCwgaW5zdGFsbGVyPU5vbmUpOgogICAgICAgICIiIk9idGFpbiBhIGRpc3RyaWJ1dGlvbiBtYXRjaGluZyBgcmVxdWlyZW1lbnRgIChlLmcuIHZpYSBkb3dubG9hZCkKCiAgICAgICAgT2J0YWluIGEgZGlzdHJvIHRoYXQgbWF0Y2hlcyByZXF1aXJlbWVudCAoZS5nLiB2aWEgZG93bmxvYWQpLiAgSW4gdGhlCiAgICAgICAgYmFzZSBgYEVudmlyb25tZW50YGAgY2xhc3MsIHRoaXMgcm91dGluZSBqdXN0IHJldHVybnMKICAgICAgICBgYGluc3RhbGxlcihyZXF1aXJlbWVudClgYCwgdW5sZXNzIGBpbnN0YWxsZXJgIGlzIE5vbmUsIGluIHdoaWNoIGNhc2UKICAgICAgICBOb25lIGlzIHJldHVybmVkIGluc3RlYWQuICBUaGlzIG1ldGhvZCBpcyBhIGhvb2sgdGhhdCBhbGxvd3Mgc3ViY2xhc3NlcwogICAgICAgIHRvIGF0dGVtcHQgb3RoZXIgd2F5cyBvZiBvYnRhaW5pbmcgYSBkaXN0cmlidXRpb24gYmVmb3JlIGZhbGxpbmcgYmFjawogICAgICAgIHRvIHRoZSBgaW5zdGFsbGVyYCBhcmd1bWVudC4iIiIKICAgICAgICBpZiBpbnN0YWxsZXIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJldHVybiBpbnN0YWxsZXIocmVxdWlyZW1lbnQpCgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgICIiIllpZWxkIHRoZSB1bmlxdWUgcHJvamVjdCBuYW1lcyBvZiB0aGUgYXZhaWxhYmxlIGRpc3RyaWJ1dGlvbnMiIiIKICAgICAgICBmb3Iga2V5IGluIHNlbGYuX2Rpc3RtYXAua2V5cygpOgogICAgICAgICAgICBpZiBzZWxmW2tleV06CiAgICAgICAgICAgICAgICB5aWVsZCBrZXkKCiAgICBkZWYgX19pYWRkX18oc2VsZiwgb3RoZXIpOgogICAgICAgICIiIkluLXBsYWNlIGFkZGl0aW9uIG9mIGEgZGlzdHJpYnV0aW9uIG9yIGVudmlyb25tZW50IiIiCiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgRGlzdHJpYnV0aW9uKToKICAgICAgICAgICAgc2VsZi5hZGQob3RoZXIpCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKG90aGVyLCBFbnZpcm9ubWVudCk6CiAgICAgICAgICAgIGZvciBwcm9qZWN0IGluIG90aGVyOgogICAgICAgICAgICAgICAgZm9yIGRpc3QgaW4gb3RoZXJbcHJvamVjdF06CiAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGQoZGlzdCkKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIkNhbid0IGFkZCAlciB0byBlbnZpcm9ubWVudCIgJSAob3RoZXIsKSkKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBfX2FkZF9fKHNlbGYsIG90aGVyKToKICAgICAgICAiIiJBZGQgYW4gZW52aXJvbm1lbnQgb3IgZGlzdHJpYnV0aW9uIHRvIGFuIGVudmlyb25tZW50IiIiCiAgICAgICAgbmV3ID0gc2VsZi5fX2NsYXNzX18oW10sIHBsYXRmb3JtPU5vbmUsIHB5dGhvbj1Ob25lKQogICAgICAgIGZvciBlbnYgaW4gc2VsZiwgb3RoZXI6CiAgICAgICAgICAgIG5ldyArPSBlbnYKICAgICAgICByZXR1cm4gbmV3CgoKIyBYWFggYmFja3dhcmQgY29tcGF0aWJpbGl0eQpBdmFpbGFibGVEaXN0cmlidXRpb25zID0gRW52aXJvbm1lbnQKCgpjbGFzcyBFeHRyYWN0aW9uRXJyb3IoUnVudGltZUVycm9yKToKICAgICIiIkFuIGVycm9yIG9jY3VycmVkIGV4dHJhY3RpbmcgYSByZXNvdXJjZQoKICAgIFRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgYXZhaWxhYmxlIGZyb20gaW5zdGFuY2VzIG9mIHRoaXMgZXhjZXB0aW9uOgoKICAgIG1hbmFnZXIKICAgICAgICBUaGUgcmVzb3VyY2UgbWFuYWdlciB0aGF0IHJhaXNlZCB0aGlzIGV4Y2VwdGlvbgoKICAgIGNhY2hlX3BhdGgKICAgICAgICBUaGUgYmFzZSBkaXJlY3RvcnkgZm9yIHJlc291cmNlIGV4dHJhY3Rpb24KCiAgICBvcmlnaW5hbF9lcnJvcgogICAgICAgIFRoZSBleGNlcHRpb24gaW5zdGFuY2UgdGhhdCBjYXVzZWQgZXh0cmFjdGlvbiB0byBmYWlsCiAgICAiIiIKCgpjbGFzcyBSZXNvdXJjZU1hbmFnZXI6CiAgICAiIiJNYW5hZ2UgcmVzb3VyY2UgZXh0cmFjdGlvbiBhbmQgcGFja2FnZXMiIiIKICAgIGV4dHJhY3Rpb25fcGF0aCA9IE5vbmUKCiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc2VsZi5jYWNoZWRfZmlsZXMgPSB7fQoKICAgIGRlZiByZXNvdXJjZV9leGlzdHMoc2VsZiwgcGFja2FnZV9vcl9yZXF1aXJlbWVudCwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgIiIiRG9lcyB0aGUgbmFtZWQgcmVzb3VyY2UgZXhpc3Q/IiIiCiAgICAgICAgcmV0dXJuIGdldF9wcm92aWRlcihwYWNrYWdlX29yX3JlcXVpcmVtZW50KS5oYXNfcmVzb3VyY2UocmVzb3VyY2VfbmFtZSkKCiAgICBkZWYgcmVzb3VyY2VfaXNkaXIoc2VsZiwgcGFja2FnZV9vcl9yZXF1aXJlbWVudCwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgIiIiSXMgdGhlIG5hbWVkIHJlc291cmNlIGFuIGV4aXN0aW5nIGRpcmVjdG9yeT8iIiIKICAgICAgICByZXR1cm4gZ2V0X3Byb3ZpZGVyKHBhY2thZ2Vfb3JfcmVxdWlyZW1lbnQpLnJlc291cmNlX2lzZGlyKAogICAgICAgICAgICByZXNvdXJjZV9uYW1lCiAgICAgICAgKQoKICAgIGRlZiByZXNvdXJjZV9maWxlbmFtZShzZWxmLCBwYWNrYWdlX29yX3JlcXVpcmVtZW50LCByZXNvdXJjZV9uYW1lKToKICAgICAgICAiIiJSZXR1cm4gYSB0cnVlIGZpbGVzeXN0ZW0gcGF0aCBmb3Igc3BlY2lmaWVkIHJlc291cmNlIiIiCiAgICAgICAgcmV0dXJuIGdldF9wcm92aWRlcihwYWNrYWdlX29yX3JlcXVpcmVtZW50KS5nZXRfcmVzb3VyY2VfZmlsZW5hbWUoCiAgICAgICAgICAgIHNlbGYsIHJlc291cmNlX25hbWUKICAgICAgICApCgogICAgZGVmIHJlc291cmNlX3N0cmVhbShzZWxmLCBwYWNrYWdlX29yX3JlcXVpcmVtZW50LCByZXNvdXJjZV9uYW1lKToKICAgICAgICAiIiJSZXR1cm4gYSByZWFkYWJsZSBmaWxlLWxpa2Ugb2JqZWN0IGZvciBzcGVjaWZpZWQgcmVzb3VyY2UiIiIKICAgICAgICByZXR1cm4gZ2V0X3Byb3ZpZGVyKHBhY2thZ2Vfb3JfcmVxdWlyZW1lbnQpLmdldF9yZXNvdXJjZV9zdHJlYW0oCiAgICAgICAgICAgIHNlbGYsIHJlc291cmNlX25hbWUKICAgICAgICApCgogICAgZGVmIHJlc291cmNlX3N0cmluZyhzZWxmLCBwYWNrYWdlX29yX3JlcXVpcmVtZW50LCByZXNvdXJjZV9uYW1lKToKICAgICAgICAiIiJSZXR1cm4gc3BlY2lmaWVkIHJlc291cmNlIGFzIGEgc3RyaW5nIiIiCiAgICAgICAgcmV0dXJuIGdldF9wcm92aWRlcihwYWNrYWdlX29yX3JlcXVpcmVtZW50KS5nZXRfcmVzb3VyY2Vfc3RyaW5nKAogICAgICAgICAgICBzZWxmLCByZXNvdXJjZV9uYW1lCiAgICAgICAgKQoKICAgIGRlZiByZXNvdXJjZV9saXN0ZGlyKHNlbGYsIHBhY2thZ2Vfb3JfcmVxdWlyZW1lbnQsIHJlc291cmNlX25hbWUpOgogICAgICAgICIiIkxpc3QgdGhlIGNvbnRlbnRzIG9mIHRoZSBuYW1lZCByZXNvdXJjZSBkaXJlY3RvcnkiIiIKICAgICAgICByZXR1cm4gZ2V0X3Byb3ZpZGVyKHBhY2thZ2Vfb3JfcmVxdWlyZW1lbnQpLnJlc291cmNlX2xpc3RkaXIoCiAgICAgICAgICAgIHJlc291cmNlX25hbWUKICAgICAgICApCgogICAgZGVmIGV4dHJhY3Rpb25fZXJyb3Ioc2VsZik6CiAgICAgICAgIiIiR2l2ZSBhbiBlcnJvciBtZXNzYWdlIGZvciBwcm9ibGVtcyBleHRyYWN0aW5nIGZpbGUocykiIiIKCiAgICAgICAgb2xkX2V4YyA9IHN5cy5leGNfaW5mbygpWzFdCiAgICAgICAgY2FjaGVfcGF0aCA9IHNlbGYuZXh0cmFjdGlvbl9wYXRoIG9yIGdldF9kZWZhdWx0X2NhY2hlKCkKCiAgICAgICAgdG1wbCA9IHRleHR3cmFwLmRlZGVudCgiIiIKICAgICAgICAgICAgQ2FuJ3QgZXh0cmFjdCBmaWxlKHMpIHRvIGVnZyBjYWNoZQoKICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBlcnJvciBvY2N1cnJlZCB3aGlsZSB0cnlpbmcgdG8gZXh0cmFjdCBmaWxlKHMpIHRvIHRoZSBQeXRob24gZWdnCiAgICAgICAgICAgIGNhY2hlOgoKICAgICAgICAgICAgICB7b2xkX2V4Y30KCiAgICAgICAgICAgIFRoZSBQeXRob24gZWdnIGNhY2hlIGRpcmVjdG9yeSBpcyBjdXJyZW50bHkgc2V0IHRvOgoKICAgICAgICAgICAgICB7Y2FjaGVfcGF0aH0KCiAgICAgICAgICAgIFBlcmhhcHMgeW91ciBhY2NvdW50IGRvZXMgbm90IGhhdmUgd3JpdGUgYWNjZXNzIHRvIHRoaXMgZGlyZWN0b3J5PyAgWW91IGNhbgogICAgICAgICAgICBjaGFuZ2UgdGhlIGNhY2hlIGRpcmVjdG9yeSBieSBzZXR0aW5nIHRoZSBQWVRIT05fRUdHX0NBQ0hFIGVudmlyb25tZW50CiAgICAgICAgICAgIHZhcmlhYmxlIHRvIHBvaW50IHRvIGFuIGFjY2Vzc2libGUgZGlyZWN0b3J5LgogICAgICAgICAgICAiIiIpLmxzdHJpcCgpCiAgICAgICAgZXJyID0gRXh0cmFjdGlvbkVycm9yKHRtcGwuZm9ybWF0KCoqbG9jYWxzKCkpKQogICAgICAgIGVyci5tYW5hZ2VyID0gc2VsZgogICAgICAgIGVyci5jYWNoZV9wYXRoID0gY2FjaGVfcGF0aAogICAgICAgIGVyci5vcmlnaW5hbF9lcnJvciA9IG9sZF9leGMKICAgICAgICByYWlzZSBlcnIKCiAgICBkZWYgZ2V0X2NhY2hlX3BhdGgoc2VsZiwgYXJjaGl2ZV9uYW1lLCBuYW1lcz0oKSk6CiAgICAgICAgIiIiUmV0dXJuIGFic29sdXRlIGxvY2F0aW9uIGluIGNhY2hlIGZvciBgYXJjaGl2ZV9uYW1lYCBhbmQgYG5hbWVzYAoKICAgICAgICBUaGUgcGFyZW50IGRpcmVjdG9yeSBvZiB0aGUgcmVzdWx0aW5nIHBhdGggd2lsbCBiZSBjcmVhdGVkIGlmIGl0IGRvZXMKICAgICAgICBub3QgYWxyZWFkeSBleGlzdC4gIGBhcmNoaXZlX25hbWVgIHNob3VsZCBiZSB0aGUgYmFzZSBmaWxlbmFtZSBvZiB0aGUKICAgICAgICBlbmNsb3NpbmcgZWdnICh3aGljaCBtYXkgbm90IGJlIHRoZSBuYW1lIG9mIHRoZSBlbmNsb3NpbmcgemlwZmlsZSEpLAogICAgICAgIGluY2x1ZGluZyBpdHMgIi5lZ2ciIGV4dGVuc2lvbi4gIGBuYW1lc2AsIGlmIHByb3ZpZGVkLCBzaG91bGQgYmUgYQogICAgICAgIHNlcXVlbmNlIG9mIHBhdGggbmFtZSBwYXJ0cyAidW5kZXIiIHRoZSBlZ2cncyBleHRyYWN0aW9uIGxvY2F0aW9uLgoKICAgICAgICBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSBjYWxsZWQgYnkgcmVzb3VyY2UgcHJvdmlkZXJzIHRoYXQgbmVlZCB0bwogICAgICAgIG9idGFpbiBhbiBleHRyYWN0aW9uIGxvY2F0aW9uLCBhbmQgb25seSBmb3IgbmFtZXMgdGhleSBpbnRlbmQgdG8KICAgICAgICBleHRyYWN0LCBhcyBpdCB0cmFja3MgdGhlIGdlbmVyYXRlZCBuYW1lcyBmb3IgcG9zc2libGUgY2xlYW51cCBsYXRlci4KICAgICAgICAiIiIKICAgICAgICBleHRyYWN0X3BhdGggPSBzZWxmLmV4dHJhY3Rpb25fcGF0aCBvciBnZXRfZGVmYXVsdF9jYWNoZSgpCiAgICAgICAgdGFyZ2V0X3BhdGggPSBvcy5wYXRoLmpvaW4oZXh0cmFjdF9wYXRoLCBhcmNoaXZlX25hbWUgKyAnLXRtcCcsICpuYW1lcykKICAgICAgICB0cnk6CiAgICAgICAgICAgIF9ieXBhc3NfZW5zdXJlX2RpcmVjdG9yeSh0YXJnZXRfcGF0aCkKICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgIHNlbGYuZXh0cmFjdGlvbl9lcnJvcigpCgogICAgICAgIHNlbGYuX3dhcm5fdW5zYWZlX2V4dHJhY3Rpb25fcGF0aChleHRyYWN0X3BhdGgpCgogICAgICAgIHNlbGYuY2FjaGVkX2ZpbGVzW3RhcmdldF9wYXRoXSA9IDEKICAgICAgICByZXR1cm4gdGFyZ2V0X3BhdGgKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX3dhcm5fdW5zYWZlX2V4dHJhY3Rpb25fcGF0aChwYXRoKToKICAgICAgICAiIiIKICAgICAgICBJZiB0aGUgZGVmYXVsdCBleHRyYWN0aW9uIHBhdGggaXMgb3ZlcnJpZGRlbiBhbmQgc2V0IHRvIGFuIGluc2VjdXJlCiAgICAgICAgbG9jYXRpb24sIHN1Y2ggYXMgL3RtcCwgaXQgb3BlbnMgdXAgYW4gb3Bwb3J0dW5pdHkgZm9yIGFuIGF0dGFja2VyIHRvCiAgICAgICAgcmVwbGFjZSBhbiBleHRyYWN0ZWQgZmlsZSB3aXRoIGFuIHVuYXV0aG9yaXplZCBwYXlsb2FkLiBXYXJuIHRoZSB1c2VyCiAgICAgICAgaWYgYSBrbm93biBpbnNlY3VyZSBsb2NhdGlvbiBpcyB1c2VkLgoKICAgICAgICBTZWUgRGlzdHJpYnV0ZSAjMzc1IGZvciBtb3JlIGRldGFpbHMuCiAgICAgICAgIiIiCiAgICAgICAgaWYgb3MubmFtZSA9PSAnbnQnIGFuZCBub3QgcGF0aC5zdGFydHN3aXRoKG9zLmVudmlyb25bJ3dpbmRpciddKToKICAgICAgICAgICAgIyBPbiBXaW5kb3dzLCBwZXJtaXNzaW9ucyBhcmUgZ2VuZXJhbGx5IHJlc3RyaWN0aXZlIGJ5IGRlZmF1bHQKICAgICAgICAgICAgIyAgYW5kIHRlbXAgZGlyZWN0b3JpZXMgYXJlIG5vdCB3cml0YWJsZSBieSBvdGhlciB1c2Vycywgc28KICAgICAgICAgICAgIyAgYnlwYXNzIHRoZSB3YXJuaW5nLgogICAgICAgICAgICByZXR1cm4KICAgICAgICBtb2RlID0gb3Muc3RhdChwYXRoKS5zdF9tb2RlCiAgICAgICAgaWYgbW9kZSAmIHN0YXQuU19JV09USCBvciBtb2RlICYgc3RhdC5TX0lXR1JQOgogICAgICAgICAgICBtc2cgPSAoIiVzIGlzIHdyaXRhYmxlIGJ5IGdyb3VwL290aGVycyBhbmQgdnVsbmVyYWJsZSB0byBhdHRhY2sgIgogICAgICAgICAgICAgICAgIndoZW4gIgogICAgICAgICAgICAgICAgInVzZWQgd2l0aCBnZXRfcmVzb3VyY2VfZmlsZW5hbWUuIENvbnNpZGVyIGEgbW9yZSBzZWN1cmUgIgogICAgICAgICAgICAgICAgImxvY2F0aW9uIChzZXQgd2l0aCAuc2V0X2V4dHJhY3Rpb25fcGF0aCBvciB0aGUgIgogICAgICAgICAgICAgICAgIlBZVEhPTl9FR0dfQ0FDSEUgZW52aXJvbm1lbnQgdmFyaWFibGUpLiIgJSBwYXRoKQogICAgICAgICAgICB3YXJuaW5ncy53YXJuKG1zZywgVXNlcldhcm5pbmcpCgogICAgZGVmIHBvc3Rwcm9jZXNzKHNlbGYsIHRlbXBuYW1lLCBmaWxlbmFtZSk6CiAgICAgICAgIiIiUGVyZm9ybSBhbnkgcGxhdGZvcm0tc3BlY2lmaWMgcG9zdHByb2Nlc3Npbmcgb2YgYHRlbXBuYW1lYAoKICAgICAgICBUaGlzIGlzIHdoZXJlIE1hYyBoZWFkZXIgcmV3cml0ZXMgc2hvdWxkIGJlIGRvbmU7IG90aGVyIHBsYXRmb3JtcyBkb24ndAogICAgICAgIGhhdmUgYW55dGhpbmcgc3BlY2lhbCB0aGV5IHNob3VsZCBkby4KCiAgICAgICAgUmVzb3VyY2UgcHJvdmlkZXJzIHNob3VsZCBjYWxsIHRoaXMgbWV0aG9kIE9OTFkgYWZ0ZXIgc3VjY2Vzc2Z1bGx5CiAgICAgICAgZXh0cmFjdGluZyBhIGNvbXByZXNzZWQgcmVzb3VyY2UuICBUaGV5IG11c3QgTk9UIGNhbGwgaXQgb24gcmVzb3VyY2VzCiAgICAgICAgdGhhdCBhcmUgYWxyZWFkeSBpbiB0aGUgZmlsZXN5c3RlbS4KCiAgICAgICAgYHRlbXBuYW1lYCBpcyB0aGUgY3VycmVudCAodGVtcG9yYXJ5KSBuYW1lIG9mIHRoZSBmaWxlLCBhbmQgYGZpbGVuYW1lYAogICAgICAgIGlzIHRoZSBuYW1lIGl0IHdpbGwgYmUgcmVuYW1lZCB0byBieSB0aGUgY2FsbGVyIGFmdGVyIHRoaXMgcm91dGluZQogICAgICAgIHJldHVybnMuCiAgICAgICAgIiIiCgogICAgICAgIGlmIG9zLm5hbWUgPT0gJ3Bvc2l4JzoKICAgICAgICAgICAgIyBNYWtlIHRoZSByZXNvdXJjZSBleGVjdXRhYmxlCiAgICAgICAgICAgIG1vZGUgPSAoKG9zLnN0YXQodGVtcG5hbWUpLnN0X21vZGUpIHwgMG81NTUpICYgMG83Nzc3CiAgICAgICAgICAgIG9zLmNobW9kKHRlbXBuYW1lLCBtb2RlKQoKICAgIGRlZiBzZXRfZXh0cmFjdGlvbl9wYXRoKHNlbGYsIHBhdGgpOgogICAgICAgICIiIlNldCB0aGUgYmFzZSBwYXRoIHdoZXJlIHJlc291cmNlcyB3aWxsIGJlIGV4dHJhY3RlZCB0bywgaWYgbmVlZGVkLgoKICAgICAgICBJZiB5b3UgZG8gbm90IGNhbGwgdGhpcyByb3V0aW5lIGJlZm9yZSBhbnkgZXh0cmFjdGlvbnMgdGFrZSBwbGFjZSwgdGhlCiAgICAgICAgcGF0aCBkZWZhdWx0cyB0byB0aGUgcmV0dXJuIHZhbHVlIG9mIGBgZ2V0X2RlZmF1bHRfY2FjaGUoKWBgLiAgKFdoaWNoCiAgICAgICAgaXMgYmFzZWQgb24gdGhlIGBgUFlUSE9OX0VHR19DQUNIRWBgIGVudmlyb25tZW50IHZhcmlhYmxlLCB3aXRoIHZhcmlvdXMKICAgICAgICBwbGF0Zm9ybS1zcGVjaWZpYyBmYWxsYmFja3MuICBTZWUgdGhhdCByb3V0aW5lJ3MgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZQogICAgICAgIGRldGFpbHMuKQoKICAgICAgICBSZXNvdXJjZXMgYXJlIGV4dHJhY3RlZCB0byBzdWJkaXJlY3RvcmllcyBvZiB0aGlzIHBhdGggYmFzZWQgdXBvbgogICAgICAgIGluZm9ybWF0aW9uIGdpdmVuIGJ5IHRoZSBgYElSZXNvdXJjZVByb3ZpZGVyYGAuICBZb3UgbWF5IHNldCB0aGlzIHRvIGEKICAgICAgICB0ZW1wb3JhcnkgZGlyZWN0b3J5LCBidXQgdGhlbiB5b3UgbXVzdCBjYWxsIGBgY2xlYW51cF9yZXNvdXJjZXMoKWBgIHRvCiAgICAgICAgZGVsZXRlIHRoZSBleHRyYWN0ZWQgZmlsZXMgd2hlbiBkb25lLiAgVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQKICAgICAgICBgYGNsZWFudXBfcmVzb3VyY2VzKClgYCB3aWxsIGJlIGFibGUgdG8gcmVtb3ZlIGFsbCBleHRyYWN0ZWQgZmlsZXMuCgogICAgICAgIChOb3RlOiB5b3UgbWF5IG5vdCBjaGFuZ2UgdGhlIGV4dHJhY3Rpb24gcGF0aCBmb3IgYSBnaXZlbiByZXNvdXJjZQogICAgICAgIG1hbmFnZXIgb25jZSByZXNvdXJjZXMgaGF2ZSBiZWVuIGV4dHJhY3RlZCwgdW5sZXNzIHlvdSBmaXJzdCBjYWxsCiAgICAgICAgYGBjbGVhbnVwX3Jlc291cmNlcygpYGAuKQogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYuY2FjaGVkX2ZpbGVzOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAogICAgICAgICAgICAgICAgIkNhbid0IGNoYW5nZSBleHRyYWN0aW9uIHBhdGgsIGZpbGVzIGFscmVhZHkgZXh0cmFjdGVkIgogICAgICAgICAgICApCgogICAgICAgIHNlbGYuZXh0cmFjdGlvbl9wYXRoID0gcGF0aAoKICAgIGRlZiBjbGVhbnVwX3Jlc291cmNlcyhzZWxmLCBmb3JjZT1GYWxzZSk6CiAgICAgICAgIiIiCiAgICAgICAgRGVsZXRlIGFsbCBleHRyYWN0ZWQgcmVzb3VyY2UgZmlsZXMgYW5kIGRpcmVjdG9yaWVzLCByZXR1cm5pbmcgYSBsaXN0CiAgICAgICAgb2YgdGhlIGZpbGUgYW5kIGRpcmVjdG9yeSBuYW1lcyB0aGF0IGNvdWxkIG5vdCBiZSBzdWNjZXNzZnVsbHkgcmVtb3ZlZC4KICAgICAgICBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGhhdmUgYW55IGNvbmN1cnJlbmN5IHByb3RlY3Rpb24sIHNvIGl0IHNob3VsZAogICAgICAgIGdlbmVyYWxseSBvbmx5IGJlIGNhbGxlZCB3aGVuIHRoZSBleHRyYWN0aW9uIHBhdGggaXMgYSB0ZW1wb3JhcnkKICAgICAgICBkaXJlY3RvcnkgZXhjbHVzaXZlIHRvIGEgc2luZ2xlIHByb2Nlc3MuICBUaGlzIG1ldGhvZCBpcyBub3QKICAgICAgICBhdXRvbWF0aWNhbGx5IGNhbGxlZDsgeW91IG11c3QgY2FsbCBpdCBleHBsaWNpdGx5IG9yIHJlZ2lzdGVyIGl0IGFzIGFuCiAgICAgICAgYGBhdGV4aXRgYCBmdW5jdGlvbiBpZiB5b3Ugd2lzaCB0byBlbnN1cmUgY2xlYW51cCBvZiBhIHRlbXBvcmFyeQogICAgICAgIGRpcmVjdG9yeSB1c2VkIGZvciBleHRyYWN0aW9ucy4KICAgICAgICAiIiIKICAgICAgICAjIFhYWAoKCmRlZiBnZXRfZGVmYXVsdF9jYWNoZSgpOgogICAgIiIiCiAgICBSZXR1cm4gdGhlIGBgUFlUSE9OX0VHR19DQUNIRWBgIGVudmlyb25tZW50IHZhcmlhYmxlCiAgICBvciBhIHBsYXRmb3JtLXJlbGV2YW50IHVzZXIgY2FjaGUgZGlyIGZvciBhbiBhcHAKICAgIG5hbWVkICJQeXRob24tRWdncyIuCiAgICAiIiIKICAgIHJldHVybiAoCiAgICAgICAgb3MuZW52aXJvbi5nZXQoJ1BZVEhPTl9FR0dfQ0FDSEUnKQogICAgICAgIG9yIGFwcGRpcnMudXNlcl9jYWNoZV9kaXIoYXBwbmFtZT0nUHl0aG9uLUVnZ3MnKQogICAgKQoKCmRlZiBzYWZlX25hbWUobmFtZSk6CiAgICAiIiJDb252ZXJ0IGFuIGFyYml0cmFyeSBzdHJpbmcgdG8gYSBzdGFuZGFyZCBkaXN0cmlidXRpb24gbmFtZQoKICAgIEFueSBydW5zIG9mIG5vbi1hbHBoYW51bWVyaWMvLiBjaGFyYWN0ZXJzIGFyZSByZXBsYWNlZCB3aXRoIGEgc2luZ2xlICctJy4KICAgICIiIgogICAgcmV0dXJuIHJlLnN1YignW15BLVphLXowLTkuXSsnLCAnLScsIG5hbWUpCgoKZGVmIHNhZmVfdmVyc2lvbih2ZXJzaW9uKToKICAgICIiIgogICAgQ29udmVydCBhbiBhcmJpdHJhcnkgc3RyaW5nIHRvIGEgc3RhbmRhcmQgdmVyc2lvbiBzdHJpbmcKICAgICIiIgogICAgdHJ5OgogICAgICAgICMgbm9ybWFsaXplIHRoZSB2ZXJzaW9uCiAgICAgICAgcmV0dXJuIHN0cihwYWNrYWdpbmcudmVyc2lvbi5WZXJzaW9uKHZlcnNpb24pKQogICAgZXhjZXB0IHBhY2thZ2luZy52ZXJzaW9uLkludmFsaWRWZXJzaW9uOgogICAgICAgIHZlcnNpb24gPSB2ZXJzaW9uLnJlcGxhY2UoJyAnLCAnLicpCiAgICAgICAgcmV0dXJuIHJlLnN1YignW15BLVphLXowLTkuXSsnLCAnLScsIHZlcnNpb24pCgoKZGVmIHNhZmVfZXh0cmEoZXh0cmEpOgogICAgIiIiQ29udmVydCBhbiBhcmJpdHJhcnkgc3RyaW5nIHRvIGEgc3RhbmRhcmQgJ2V4dHJhJyBuYW1lCgogICAgQW55IHJ1bnMgb2Ygbm9uLWFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIGFyZSByZXBsYWNlZCB3aXRoIGEgc2luZ2xlICdfJywKICAgIGFuZCB0aGUgcmVzdWx0IGlzIGFsd2F5cyBsb3dlcmNhc2VkLgogICAgIiIiCiAgICByZXR1cm4gcmUuc3ViKCdbXkEtWmEtejAtOS4tXSsnLCAnXycsIGV4dHJhKS5sb3dlcigpCgoKZGVmIHRvX2ZpbGVuYW1lKG5hbWUpOgogICAgIiIiQ29udmVydCBhIHByb2plY3Qgb3IgdmVyc2lvbiBuYW1lIHRvIGl0cyBmaWxlbmFtZS1lc2NhcGVkIGZvcm0KCiAgICBBbnkgJy0nIGNoYXJhY3RlcnMgYXJlIGN1cnJlbnRseSByZXBsYWNlZCB3aXRoICdfJy4KICAgICIiIgogICAgcmV0dXJuIG5hbWUucmVwbGFjZSgnLScsICdfJykKCgpkZWYgaW52YWxpZF9tYXJrZXIodGV4dCk6CiAgICAiIiIKICAgIFZhbGlkYXRlIHRleHQgYXMgYSBQRVAgNTA4IGVudmlyb25tZW50IG1hcmtlcjsgcmV0dXJuIGFuIGV4Y2VwdGlvbgogICAgaWYgaW52YWxpZCBvciBGYWxzZSBvdGhlcndpc2UuCiAgICAiIiIKICAgIHRyeToKICAgICAgICBldmFsdWF0ZV9tYXJrZXIodGV4dCkKICAgIGV4Y2VwdCBTeW50YXhFcnJvciBhcyBlOgogICAgICAgIGUuZmlsZW5hbWUgPSBOb25lCiAgICAgICAgZS5saW5lbm8gPSBOb25lCiAgICAgICAgcmV0dXJuIGUKICAgIHJldHVybiBGYWxzZQoKCmRlZiBldmFsdWF0ZV9tYXJrZXIodGV4dCwgZXh0cmE9Tm9uZSk6CiAgICAiIiIKICAgIEV2YWx1YXRlIGEgUEVQIDUwOCBlbnZpcm9ubWVudCBtYXJrZXIuCiAgICBSZXR1cm4gYSBib29sZWFuIGluZGljYXRpbmcgdGhlIG1hcmtlciByZXN1bHQgaW4gdGhpcyBlbnZpcm9ubWVudC4KICAgIFJhaXNlIFN5bnRheEVycm9yIGlmIG1hcmtlciBpcyBpbnZhbGlkLgoKICAgIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcyB0aGUgJ3B5cGFyc2luZycgbW9kdWxlLgogICAgIiIiCiAgICB0cnk6CiAgICAgICAgbWFya2VyID0gcGFja2FnaW5nLm1hcmtlcnMuTWFya2VyKHRleHQpCiAgICAgICAgcmV0dXJuIG1hcmtlci5ldmFsdWF0ZSgpCiAgICBleGNlcHQgcGFja2FnaW5nLm1hcmtlcnMuSW52YWxpZE1hcmtlciBhcyBlOgogICAgICAgIHJhaXNlIFN5bnRheEVycm9yKGUpCgoKY2xhc3MgTnVsbFByb3ZpZGVyOgogICAgIiIiVHJ5IHRvIGltcGxlbWVudCByZXNvdXJjZXMgYW5kIG1ldGFkYXRhIGZvciBhcmJpdHJhcnkgUEVQIDMwMiBsb2FkZXJzIiIiCgogICAgZWdnX25hbWUgPSBOb25lCiAgICBlZ2dfaW5mbyA9IE5vbmUKICAgIGxvYWRlciA9IE5vbmUKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbW9kdWxlKToKICAgICAgICBzZWxmLmxvYWRlciA9IGdldGF0dHIobW9kdWxlLCAnX19sb2FkZXJfXycsIE5vbmUpCiAgICAgICAgc2VsZi5tb2R1bGVfcGF0aCA9IG9zLnBhdGguZGlybmFtZShnZXRhdHRyKG1vZHVsZSwgJ19fZmlsZV9fJywgJycpKQoKICAgIGRlZiBnZXRfcmVzb3VyY2VfZmlsZW5hbWUoc2VsZiwgbWFuYWdlciwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgcmV0dXJuIHNlbGYuX2ZuKHNlbGYubW9kdWxlX3BhdGgsIHJlc291cmNlX25hbWUpCgogICAgZGVmIGdldF9yZXNvdXJjZV9zdHJlYW0oc2VsZiwgbWFuYWdlciwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgcmV0dXJuIGlvLkJ5dGVzSU8oc2VsZi5nZXRfcmVzb3VyY2Vfc3RyaW5nKG1hbmFnZXIsIHJlc291cmNlX25hbWUpKQoKICAgIGRlZiBnZXRfcmVzb3VyY2Vfc3RyaW5nKHNlbGYsIG1hbmFnZXIsIHJlc291cmNlX25hbWUpOgogICAgICAgIHJldHVybiBzZWxmLl9nZXQoc2VsZi5fZm4oc2VsZi5tb2R1bGVfcGF0aCwgcmVzb3VyY2VfbmFtZSkpCgogICAgZGVmIGhhc19yZXNvdXJjZShzZWxmLCByZXNvdXJjZV9uYW1lKToKICAgICAgICByZXR1cm4gc2VsZi5faGFzKHNlbGYuX2ZuKHNlbGYubW9kdWxlX3BhdGgsIHJlc291cmNlX25hbWUpKQoKICAgIGRlZiBoYXNfbWV0YWRhdGEoc2VsZiwgbmFtZSk6CiAgICAgICAgcmV0dXJuIHNlbGYuZWdnX2luZm8gYW5kIHNlbGYuX2hhcyhzZWxmLl9mbihzZWxmLmVnZ19pbmZvLCBuYW1lKSkKCiAgICBkZWYgZ2V0X21ldGFkYXRhKHNlbGYsIG5hbWUpOgogICAgICAgIGlmIG5vdCBzZWxmLmVnZ19pbmZvOgogICAgICAgICAgICByZXR1cm4gIiIKICAgICAgICB2YWx1ZSA9IHNlbGYuX2dldChzZWxmLl9mbihzZWxmLmVnZ19pbmZvLCBuYW1lKSkKICAgICAgICByZXR1cm4gdmFsdWUuZGVjb2RlKCd1dGYtOCcpIGlmIHNpeC5QWTMgZWxzZSB2YWx1ZQoKICAgIGRlZiBnZXRfbWV0YWRhdGFfbGluZXMoc2VsZiwgbmFtZSk6CiAgICAgICAgcmV0dXJuIHlpZWxkX2xpbmVzKHNlbGYuZ2V0X21ldGFkYXRhKG5hbWUpKQoKICAgIGRlZiByZXNvdXJjZV9pc2RpcihzZWxmLCByZXNvdXJjZV9uYW1lKToKICAgICAgICByZXR1cm4gc2VsZi5faXNkaXIoc2VsZi5fZm4oc2VsZi5tb2R1bGVfcGF0aCwgcmVzb3VyY2VfbmFtZSkpCgogICAgZGVmIG1ldGFkYXRhX2lzZGlyKHNlbGYsIG5hbWUpOgogICAgICAgIHJldHVybiBzZWxmLmVnZ19pbmZvIGFuZCBzZWxmLl9pc2RpcihzZWxmLl9mbihzZWxmLmVnZ19pbmZvLCBuYW1lKSkKCiAgICBkZWYgcmVzb3VyY2VfbGlzdGRpcihzZWxmLCByZXNvdXJjZV9uYW1lKToKICAgICAgICByZXR1cm4gc2VsZi5fbGlzdGRpcihzZWxmLl9mbihzZWxmLm1vZHVsZV9wYXRoLCByZXNvdXJjZV9uYW1lKSkKCiAgICBkZWYgbWV0YWRhdGFfbGlzdGRpcihzZWxmLCBuYW1lKToKICAgICAgICBpZiBzZWxmLmVnZ19pbmZvOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fbGlzdGRpcihzZWxmLl9mbihzZWxmLmVnZ19pbmZvLCBuYW1lKSkKICAgICAgICByZXR1cm4gW10KCiAgICBkZWYgcnVuX3NjcmlwdChzZWxmLCBzY3JpcHRfbmFtZSwgbmFtZXNwYWNlKToKICAgICAgICBzY3JpcHQgPSAnc2NyaXB0cy8nICsgc2NyaXB0X25hbWUKICAgICAgICBpZiBub3Qgc2VsZi5oYXNfbWV0YWRhdGEoc2NyaXB0KToKICAgICAgICAgICAgcmFpc2UgUmVzb2x1dGlvbkVycm9yKCJObyBzY3JpcHQgbmFtZWQgJXIiICUgc2NyaXB0X25hbWUpCiAgICAgICAgc2NyaXB0X3RleHQgPSBzZWxmLmdldF9tZXRhZGF0YShzY3JpcHQpLnJlcGxhY2UoJ1xyXG4nLCAnXG4nKQogICAgICAgIHNjcmlwdF90ZXh0ID0gc2NyaXB0X3RleHQucmVwbGFjZSgnXHInLCAnXG4nKQogICAgICAgIHNjcmlwdF9maWxlbmFtZSA9IHNlbGYuX2ZuKHNlbGYuZWdnX2luZm8sIHNjcmlwdCkKICAgICAgICBuYW1lc3BhY2VbJ19fZmlsZV9fJ10gPSBzY3JpcHRfZmlsZW5hbWUKICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhzY3JpcHRfZmlsZW5hbWUpOgogICAgICAgICAgICBzb3VyY2UgPSBvcGVuKHNjcmlwdF9maWxlbmFtZSkucmVhZCgpCiAgICAgICAgICAgIGNvZGUgPSBjb21waWxlKHNvdXJjZSwgc2NyaXB0X2ZpbGVuYW1lLCAnZXhlYycpCiAgICAgICAgICAgIGV4ZWMoY29kZSwgbmFtZXNwYWNlLCBuYW1lc3BhY2UpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZnJvbSBsaW5lY2FjaGUgaW1wb3J0IGNhY2hlCiAgICAgICAgICAgIGNhY2hlW3NjcmlwdF9maWxlbmFtZV0gPSAoCiAgICAgICAgICAgICAgICBsZW4oc2NyaXB0X3RleHQpLCAwLCBzY3JpcHRfdGV4dC5zcGxpdCgnXG4nKSwgc2NyaXB0X2ZpbGVuYW1lCiAgICAgICAgICAgICkKICAgICAgICAgICAgc2NyaXB0X2NvZGUgPSBjb21waWxlKHNjcmlwdF90ZXh0LCBzY3JpcHRfZmlsZW5hbWUsICdleGVjJykKICAgICAgICAgICAgZXhlYyhzY3JpcHRfY29kZSwgbmFtZXNwYWNlLCBuYW1lc3BhY2UpCgogICAgZGVmIF9oYXMoc2VsZiwgcGF0aCk6CiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigKICAgICAgICAgICAgIkNhbid0IHBlcmZvcm0gdGhpcyBvcGVyYXRpb24gZm9yIHVucmVnaXN0ZXJlZCBsb2FkZXIgdHlwZSIKICAgICAgICApCgogICAgZGVmIF9pc2RpcihzZWxmLCBwYXRoKToKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKAogICAgICAgICAgICAiQ2FuJ3QgcGVyZm9ybSB0aGlzIG9wZXJhdGlvbiBmb3IgdW5yZWdpc3RlcmVkIGxvYWRlciB0eXBlIgogICAgICAgICkKCiAgICBkZWYgX2xpc3RkaXIoc2VsZiwgcGF0aCk6CiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigKICAgICAgICAgICAgIkNhbid0IHBlcmZvcm0gdGhpcyBvcGVyYXRpb24gZm9yIHVucmVnaXN0ZXJlZCBsb2FkZXIgdHlwZSIKICAgICAgICApCgogICAgZGVmIF9mbihzZWxmLCBiYXNlLCByZXNvdXJjZV9uYW1lKToKICAgICAgICBpZiByZXNvdXJjZV9uYW1lOgogICAgICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKGJhc2UsICpyZXNvdXJjZV9uYW1lLnNwbGl0KCcvJykpCiAgICAgICAgcmV0dXJuIGJhc2UKCiAgICBkZWYgX2dldChzZWxmLCBwYXRoKToKICAgICAgICBpZiBoYXNhdHRyKHNlbGYubG9hZGVyLCAnZ2V0X2RhdGEnKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYubG9hZGVyLmdldF9kYXRhKHBhdGgpCiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigKICAgICAgICAgICAgIkNhbid0IHBlcmZvcm0gdGhpcyBvcGVyYXRpb24gZm9yIGxvYWRlcnMgd2l0aG91dCAnZ2V0X2RhdGEoKSciCiAgICAgICAgKQoKCnJlZ2lzdGVyX2xvYWRlcl90eXBlKG9iamVjdCwgTnVsbFByb3ZpZGVyKQoKCmNsYXNzIEVnZ1Byb3ZpZGVyKE51bGxQcm92aWRlcik6CiAgICAiIiJQcm92aWRlciBiYXNlZCBvbiBhIHZpcnR1YWwgZmlsZXN5c3RlbSIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtb2R1bGUpOgogICAgICAgIE51bGxQcm92aWRlci5fX2luaXRfXyhzZWxmLCBtb2R1bGUpCiAgICAgICAgc2VsZi5fc2V0dXBfcHJlZml4KCkKCiAgICBkZWYgX3NldHVwX3ByZWZpeChzZWxmKToKICAgICAgICAjIHdlIGFzc3VtZSBoZXJlIHRoYXQgb3VyIG1ldGFkYXRhIG1heSBiZSBuZXN0ZWQgaW5zaWRlIGEgImJhc2tldCIKICAgICAgICAjIG9mIG11bHRpcGxlIGVnZ3M7IHRoYXQncyB3aHkgd2UgdXNlIG1vZHVsZV9wYXRoIGluc3RlYWQgb2YgLmFyY2hpdmUKICAgICAgICBwYXRoID0gc2VsZi5tb2R1bGVfcGF0aAogICAgICAgIG9sZCA9IE5vbmUKICAgICAgICB3aGlsZSBwYXRoICE9IG9sZDoKICAgICAgICAgICAgaWYgX2lzX3VucGFja2VkX2VnZyhwYXRoKToKICAgICAgICAgICAgICAgIHNlbGYuZWdnX25hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKHBhdGgpCiAgICAgICAgICAgICAgICBzZWxmLmVnZ19pbmZvID0gb3MucGF0aC5qb2luKHBhdGgsICdFR0ctSU5GTycpCiAgICAgICAgICAgICAgICBzZWxmLmVnZ19yb290ID0gcGF0aAogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgb2xkID0gcGF0aAogICAgICAgICAgICBwYXRoLCBiYXNlID0gb3MucGF0aC5zcGxpdChwYXRoKQoKCmNsYXNzIERlZmF1bHRQcm92aWRlcihFZ2dQcm92aWRlcik6CiAgICAiIiJQcm92aWRlcyBhY2Nlc3MgdG8gcGFja2FnZSByZXNvdXJjZXMgaW4gdGhlIGZpbGVzeXN0ZW0iIiIKCiAgICBkZWYgX2hhcyhzZWxmLCBwYXRoKToKICAgICAgICByZXR1cm4gb3MucGF0aC5leGlzdHMocGF0aCkKCiAgICBkZWYgX2lzZGlyKHNlbGYsIHBhdGgpOgogICAgICAgIHJldHVybiBvcy5wYXRoLmlzZGlyKHBhdGgpCgogICAgZGVmIF9saXN0ZGlyKHNlbGYsIHBhdGgpOgogICAgICAgIHJldHVybiBvcy5saXN0ZGlyKHBhdGgpCgogICAgZGVmIGdldF9yZXNvdXJjZV9zdHJlYW0oc2VsZiwgbWFuYWdlciwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgcmV0dXJuIG9wZW4oc2VsZi5fZm4oc2VsZi5tb2R1bGVfcGF0aCwgcmVzb3VyY2VfbmFtZSksICdyYicpCgogICAgZGVmIF9nZXQoc2VsZiwgcGF0aCk6CiAgICAgICAgd2l0aCBvcGVuKHBhdGgsICdyYicpIGFzIHN0cmVhbToKICAgICAgICAgICAgcmV0dXJuIHN0cmVhbS5yZWFkKCkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfcmVnaXN0ZXIoY2xzKToKICAgICAgICBsb2FkZXJfY2xzID0gZ2V0YXR0cihpbXBvcnRsaWJfbWFjaGluZXJ5LCAnU291cmNlRmlsZUxvYWRlcicsCiAgICAgICAgICAgIHR5cGUoTm9uZSkpCiAgICAgICAgcmVnaXN0ZXJfbG9hZGVyX3R5cGUobG9hZGVyX2NscywgY2xzKQoKCkRlZmF1bHRQcm92aWRlci5fcmVnaXN0ZXIoKQoKCmNsYXNzIEVtcHR5UHJvdmlkZXIoTnVsbFByb3ZpZGVyKToKICAgICIiIlByb3ZpZGVyIHRoYXQgcmV0dXJucyBub3RoaW5nIGZvciBhbGwgcmVxdWVzdHMiIiIKCiAgICBfaXNkaXIgPSBfaGFzID0gbGFtYmRhIHNlbGYsIHBhdGg6IEZhbHNlCiAgICBfZ2V0ID0gbGFtYmRhIHNlbGYsIHBhdGg6ICcnCiAgICBfbGlzdGRpciA9IGxhbWJkYSBzZWxmLCBwYXRoOiBbXQogICAgbW9kdWxlX3BhdGggPSBOb25lCgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHBhc3MKCgplbXB0eV9wcm92aWRlciA9IEVtcHR5UHJvdmlkZXIoKQoKCmNsYXNzIFppcE1hbmlmZXN0cyhkaWN0KToKICAgICIiIgogICAgemlwIG1hbmlmZXN0IGJ1aWxkZXIKICAgICIiIgoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGJ1aWxkKGNscywgcGF0aCk6CiAgICAgICAgIiIiCiAgICAgICAgQnVpbGQgYSBkaWN0aW9uYXJ5IHNpbWlsYXIgdG8gdGhlIHppcGltcG9ydCBkaXJlY3RvcnkKICAgICAgICBjYWNoZXMsIGV4Y2VwdCBpbnN0ZWFkIG9mIHR1cGxlcywgc3RvcmUgWmlwSW5mbyBvYmplY3RzLgoKICAgICAgICBVc2UgYSBwbGF0Zm9ybS1zcGVjaWZpYyBwYXRoIHNlcGFyYXRvciAob3Muc2VwKSBmb3IgdGhlIHBhdGgga2V5cwogICAgICAgIGZvciBjb21wYXRpYmlsaXR5IHdpdGggcHlweSBvbiBXaW5kb3dzLgogICAgICAgICIiIgogICAgICAgIHdpdGggQ29udGV4dHVhbFppcEZpbGUocGF0aCkgYXMgemZpbGU6CiAgICAgICAgICAgIGl0ZW1zID0gKAogICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgIG5hbWUucmVwbGFjZSgnLycsIG9zLnNlcCksCiAgICAgICAgICAgICAgICAgICAgemZpbGUuZ2V0aW5mbyhuYW1lKSwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGZvciBuYW1lIGluIHpmaWxlLm5hbWVsaXN0KCkKICAgICAgICAgICAgKQogICAgICAgICAgICByZXR1cm4gZGljdChpdGVtcykKCiAgICBsb2FkID0gYnVpbGQKCgpjbGFzcyBNZW1vaXplZFppcE1hbmlmZXN0cyhaaXBNYW5pZmVzdHMpOgogICAgIiIiCiAgICBNZW1vaXplZCB6aXBmaWxlIG1hbmlmZXN0cy4KICAgICIiIgogICAgbWFuaWZlc3RfbW9kID0gY29sbGVjdGlvbnMubmFtZWR0dXBsZSgnbWFuaWZlc3RfbW9kJywgJ21hbmlmZXN0IG10aW1lJykKCiAgICBkZWYgbG9hZChzZWxmLCBwYXRoKToKICAgICAgICAiIiIKICAgICAgICBMb2FkIGEgbWFuaWZlc3QgYXQgcGF0aCBvciByZXR1cm4gYSBzdWl0YWJsZSBtYW5pZmVzdCBhbHJlYWR5IGxvYWRlZC4KICAgICAgICAiIiIKICAgICAgICBwYXRoID0gb3MucGF0aC5ub3JtcGF0aChwYXRoKQogICAgICAgIG10aW1lID0gb3Muc3RhdChwYXRoKS5zdF9tdGltZQoKICAgICAgICBpZiBwYXRoIG5vdCBpbiBzZWxmIG9yIHNlbGZbcGF0aF0ubXRpbWUgIT0gbXRpbWU6CiAgICAgICAgICAgIG1hbmlmZXN0ID0gc2VsZi5idWlsZChwYXRoKQogICAgICAgICAgICBzZWxmW3BhdGhdID0gc2VsZi5tYW5pZmVzdF9tb2QobWFuaWZlc3QsIG10aW1lKQoKICAgICAgICByZXR1cm4gc2VsZltwYXRoXS5tYW5pZmVzdAoKCmNsYXNzIENvbnRleHR1YWxaaXBGaWxlKHppcGZpbGUuWmlwRmlsZSk6CiAgICAiIiIKICAgIFN1cHBsZW1lbnQgWmlwRmlsZSBjbGFzcyB0byBzdXBwb3J0IGNvbnRleHQgbWFuYWdlciBmb3IgUHl0aG9uIDIuNgogICAgIiIiCgogICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBfX2V4aXRfXyhzZWxmLCB0eXBlLCB2YWx1ZSwgdHJhY2ViYWNrKToKICAgICAgICBzZWxmLmNsb3NlKCkKCiAgICBkZWYgX19uZXdfXyhjbHMsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgIiIiCiAgICAgICAgQ29uc3RydWN0IGEgWmlwRmlsZSBvciBDb250ZXh0dWFsWmlwRmlsZSBhcyBhcHByb3ByaWF0ZQogICAgICAgICIiIgogICAgICAgIGlmIGhhc2F0dHIoemlwZmlsZS5aaXBGaWxlLCAnX19leGl0X18nKToKICAgICAgICAgICAgcmV0dXJuIHppcGZpbGUuWmlwRmlsZSgqYXJncywgKiprd2FyZ3MpCiAgICAgICAgcmV0dXJuIHN1cGVyKENvbnRleHR1YWxaaXBGaWxlLCBjbHMpLl9fbmV3X18oY2xzKQoKCmNsYXNzIFppcFByb3ZpZGVyKEVnZ1Byb3ZpZGVyKToKICAgICIiIlJlc291cmNlIHN1cHBvcnQgZm9yIHppcHMgYW5kIGVnZ3MiIiIKCiAgICBlYWdlcnMgPSBOb25lCiAgICBfemlwX21hbmlmZXN0cyA9IE1lbW9pemVkWmlwTWFuaWZlc3RzKCkKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbW9kdWxlKToKICAgICAgICBFZ2dQcm92aWRlci5fX2luaXRfXyhzZWxmLCBtb2R1bGUpCiAgICAgICAgc2VsZi56aXBfcHJlID0gc2VsZi5sb2FkZXIuYXJjaGl2ZSArIG9zLnNlcAoKICAgIGRlZiBfemlwaW5mb19uYW1lKHNlbGYsIGZzcGF0aCk6CiAgICAgICAgIyBDb252ZXJ0IGEgdmlydHVhbCBmaWxlbmFtZSAoZnVsbCBwYXRoIHRvIGZpbGUpIGludG8gYSB6aXBmaWxlIHN1YnBhdGgKICAgICAgICAjIHVzYWJsZSB3aXRoIHRoZSB6aXBpbXBvcnQgZGlyZWN0b3J5IGNhY2hlIGZvciBvdXIgdGFyZ2V0IGFyY2hpdmUKICAgICAgICBpZiBmc3BhdGguc3RhcnRzd2l0aChzZWxmLnppcF9wcmUpOgogICAgICAgICAgICByZXR1cm4gZnNwYXRoW2xlbihzZWxmLnppcF9wcmUpOl0KICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigKICAgICAgICAgICAgIiVzIGlzIG5vdCBhIHN1YnBhdGggb2YgJXMiICUgKGZzcGF0aCwgc2VsZi56aXBfcHJlKQogICAgICAgICkKCiAgICBkZWYgX3BhcnRzKHNlbGYsIHppcF9wYXRoKToKICAgICAgICAjIENvbnZlcnQgYSB6aXBmaWxlIHN1YnBhdGggaW50byBhbiBlZ2ctcmVsYXRpdmUgcGF0aCBwYXJ0IGxpc3QuCiAgICAgICAgIyBwc2V1ZG8tZnMgcGF0aAogICAgICAgIGZzcGF0aCA9IHNlbGYuemlwX3ByZSArIHppcF9wYXRoCiAgICAgICAgaWYgZnNwYXRoLnN0YXJ0c3dpdGgoc2VsZi5lZ2dfcm9vdCArIG9zLnNlcCk6CiAgICAgICAgICAgIHJldHVybiBmc3BhdGhbbGVuKHNlbGYuZWdnX3Jvb3QpICsgMTpdLnNwbGl0KG9zLnNlcCkKICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigKICAgICAgICAgICAgIiVzIGlzIG5vdCBhIHN1YnBhdGggb2YgJXMiICUgKGZzcGF0aCwgc2VsZi5lZ2dfcm9vdCkKICAgICAgICApCgogICAgQHByb3BlcnR5CiAgICBkZWYgemlwaW5mbyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5femlwX21hbmlmZXN0cy5sb2FkKHNlbGYubG9hZGVyLmFyY2hpdmUpCgogICAgZGVmIGdldF9yZXNvdXJjZV9maWxlbmFtZShzZWxmLCBtYW5hZ2VyLCByZXNvdXJjZV9uYW1lKToKICAgICAgICBpZiBub3Qgc2VsZi5lZ2dfbmFtZToKICAgICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigKICAgICAgICAgICAgICAgICJyZXNvdXJjZV9maWxlbmFtZSgpIG9ubHkgc3VwcG9ydGVkIGZvciAuZWdnLCBub3QgLnppcCIKICAgICAgICAgICAgKQogICAgICAgICMgbm8gbmVlZCB0byBsb2NrIGZvciBleHRyYWN0aW9uLCBzaW5jZSB3ZSB1c2UgdGVtcCBuYW1lcwogICAgICAgIHppcF9wYXRoID0gc2VsZi5fcmVzb3VyY2VfdG9femlwKHJlc291cmNlX25hbWUpCiAgICAgICAgZWFnZXJzID0gc2VsZi5fZ2V0X2VhZ2VyX3Jlc291cmNlcygpCiAgICAgICAgaWYgJy8nLmpvaW4oc2VsZi5fcGFydHMoemlwX3BhdGgpKSBpbiBlYWdlcnM6CiAgICAgICAgICAgIGZvciBuYW1lIGluIGVhZ2VyczoKICAgICAgICAgICAgICAgIHNlbGYuX2V4dHJhY3RfcmVzb3VyY2UobWFuYWdlciwgc2VsZi5fZWFnZXJfdG9femlwKG5hbWUpKQogICAgICAgIHJldHVybiBzZWxmLl9leHRyYWN0X3Jlc291cmNlKG1hbmFnZXIsIHppcF9wYXRoKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfZ2V0X2RhdGVfYW5kX3NpemUoemlwX3N0YXQpOgogICAgICAgIHNpemUgPSB6aXBfc3RhdC5maWxlX3NpemUKICAgICAgICAjIHltZGhtcyt3ZGF5LCB5ZGF5LCBkc3QKICAgICAgICBkYXRlX3RpbWUgPSB6aXBfc3RhdC5kYXRlX3RpbWUgKyAoMCwgMCwgLTEpCiAgICAgICAgIyAxOTgwIG9mZnNldCBhbHJlYWR5IGRvbmUKICAgICAgICB0aW1lc3RhbXAgPSB0aW1lLm1rdGltZShkYXRlX3RpbWUpCiAgICAgICAgcmV0dXJuIHRpbWVzdGFtcCwgc2l6ZQoKICAgIGRlZiBfZXh0cmFjdF9yZXNvdXJjZShzZWxmLCBtYW5hZ2VyLCB6aXBfcGF0aCk6CgogICAgICAgIGlmIHppcF9wYXRoIGluIHNlbGYuX2luZGV4KCk6CiAgICAgICAgICAgIGZvciBuYW1lIGluIHNlbGYuX2luZGV4KClbemlwX3BhdGhdOgogICAgICAgICAgICAgICAgbGFzdCA9IHNlbGYuX2V4dHJhY3RfcmVzb3VyY2UoCiAgICAgICAgICAgICAgICAgICAgbWFuYWdlciwgb3MucGF0aC5qb2luKHppcF9wYXRoLCBuYW1lKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAjIHJldHVybiB0aGUgZXh0cmFjdGVkIGRpcmVjdG9yeSBuYW1lCiAgICAgICAgICAgIHJldHVybiBvcy5wYXRoLmRpcm5hbWUobGFzdCkKCiAgICAgICAgdGltZXN0YW1wLCBzaXplID0gc2VsZi5fZ2V0X2RhdGVfYW5kX3NpemUoc2VsZi56aXBpbmZvW3ppcF9wYXRoXSkKCiAgICAgICAgaWYgbm90IFdSSVRFX1NVUFBPUlQ6CiAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoJyJvcy5yZW5hbWUiIGFuZCAib3MudW5saW5rIiBhcmUgbm90IHN1cHBvcnRlZCAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgJ29uIHRoaXMgcGxhdGZvcm0nKQogICAgICAgIHRyeToKCiAgICAgICAgICAgIHJlYWxfcGF0aCA9IG1hbmFnZXIuZ2V0X2NhY2hlX3BhdGgoCiAgICAgICAgICAgICAgICBzZWxmLmVnZ19uYW1lLCBzZWxmLl9wYXJ0cyh6aXBfcGF0aCkKICAgICAgICAgICAgKQoKICAgICAgICAgICAgaWYgc2VsZi5faXNfY3VycmVudChyZWFsX3BhdGgsIHppcF9wYXRoKToKICAgICAgICAgICAgICAgIHJldHVybiByZWFsX3BhdGgKCiAgICAgICAgICAgIG91dGYsIHRtcG5hbSA9IF9ta3N0ZW1wKCIuJGV4dHJhY3QiLCBkaXI9b3MucGF0aC5kaXJuYW1lKHJlYWxfcGF0aCkpCiAgICAgICAgICAgIG9zLndyaXRlKG91dGYsIHNlbGYubG9hZGVyLmdldF9kYXRhKHppcF9wYXRoKSkKICAgICAgICAgICAgb3MuY2xvc2Uob3V0ZikKICAgICAgICAgICAgdXRpbWUodG1wbmFtLCAodGltZXN0YW1wLCB0aW1lc3RhbXApKQogICAgICAgICAgICBtYW5hZ2VyLnBvc3Rwcm9jZXNzKHRtcG5hbSwgcmVhbF9wYXRoKQoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcmVuYW1lKHRtcG5hbSwgcmVhbF9wYXRoKQoKICAgICAgICAgICAgZXhjZXB0IG9zLmVycm9yOgogICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUocmVhbF9wYXRoKToKICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLl9pc19jdXJyZW50KHJlYWxfcGF0aCwgemlwX3BhdGgpOgogICAgICAgICAgICAgICAgICAgICAgICAjIHRoZSBmaWxlIGJlY2FtZSBjdXJyZW50IHNpbmNlIGl0IHdhcyBjaGVja2VkIGFib3ZlLAogICAgICAgICAgICAgICAgICAgICAgICAjICBzbyBwcm9jZWVkLgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVhbF9wYXRoCiAgICAgICAgICAgICAgICAgICAgIyBXaW5kb3dzLCBkZWwgb2xkIGZpbGUgYW5kIHJldHJ5CiAgICAgICAgICAgICAgICAgICAgZWxpZiBvcy5uYW1lID09ICdudCc6CiAgICAgICAgICAgICAgICAgICAgICAgIHVubGluayhyZWFsX3BhdGgpCiAgICAgICAgICAgICAgICAgICAgICAgIHJlbmFtZSh0bXBuYW0sIHJlYWxfcGF0aCkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWxfcGF0aAogICAgICAgICAgICAgICAgcmFpc2UKCiAgICAgICAgZXhjZXB0IG9zLmVycm9yOgogICAgICAgICAgICAjIHJlcG9ydCBhIHVzZXItZnJpZW5kbHkgZXJyb3IKICAgICAgICAgICAgbWFuYWdlci5leHRyYWN0aW9uX2Vycm9yKCkKCiAgICAgICAgcmV0dXJuIHJlYWxfcGF0aAoKICAgIGRlZiBfaXNfY3VycmVudChzZWxmLCBmaWxlX3BhdGgsIHppcF9wYXRoKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gVHJ1ZSBpZiB0aGUgZmlsZV9wYXRoIGlzIGN1cnJlbnQgZm9yIHRoaXMgemlwX3BhdGgKICAgICAgICAiIiIKICAgICAgICB0aW1lc3RhbXAsIHNpemUgPSBzZWxmLl9nZXRfZGF0ZV9hbmRfc2l6ZShzZWxmLnppcGluZm9bemlwX3BhdGhdKQogICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZmlsZShmaWxlX3BhdGgpOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICBzdGF0ID0gb3Muc3RhdChmaWxlX3BhdGgpCiAgICAgICAgaWYgc3RhdC5zdF9zaXplICE9IHNpemUgb3Igc3RhdC5zdF9tdGltZSAhPSB0aW1lc3RhbXA6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgICMgY2hlY2sgdGhhdCB0aGUgY29udGVudHMgbWF0Y2gKICAgICAgICB6aXBfY29udGVudHMgPSBzZWxmLmxvYWRlci5nZXRfZGF0YSh6aXBfcGF0aCkKICAgICAgICB3aXRoIG9wZW4oZmlsZV9wYXRoLCAncmInKSBhcyBmOgogICAgICAgICAgICBmaWxlX2NvbnRlbnRzID0gZi5yZWFkKCkKICAgICAgICByZXR1cm4gemlwX2NvbnRlbnRzID09IGZpbGVfY29udGVudHMKCiAgICBkZWYgX2dldF9lYWdlcl9yZXNvdXJjZXMoc2VsZik6CiAgICAgICAgaWYgc2VsZi5lYWdlcnMgaXMgTm9uZToKICAgICAgICAgICAgZWFnZXJzID0gW10KICAgICAgICAgICAgZm9yIG5hbWUgaW4gKCduYXRpdmVfbGlicy50eHQnLCAnZWFnZXJfcmVzb3VyY2VzLnR4dCcpOgogICAgICAgICAgICAgICAgaWYgc2VsZi5oYXNfbWV0YWRhdGEobmFtZSk6CiAgICAgICAgICAgICAgICAgICAgZWFnZXJzLmV4dGVuZChzZWxmLmdldF9tZXRhZGF0YV9saW5lcyhuYW1lKSkKICAgICAgICAgICAgc2VsZi5lYWdlcnMgPSBlYWdlcnMKICAgICAgICByZXR1cm4gc2VsZi5lYWdlcnMKCiAgICBkZWYgX2luZGV4KHNlbGYpOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2RpcmluZGV4CiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICBpbmQgPSB7fQogICAgICAgICAgICBmb3IgcGF0aCBpbiBzZWxmLnppcGluZm86CiAgICAgICAgICAgICAgICBwYXJ0cyA9IHBhdGguc3BsaXQob3Muc2VwKQogICAgICAgICAgICAgICAgd2hpbGUgcGFydHM6CiAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gb3Muc2VwLmpvaW4ocGFydHNbOi0xXSkKICAgICAgICAgICAgICAgICAgICBpZiBwYXJlbnQgaW4gaW5kOgogICAgICAgICAgICAgICAgICAgICAgICBpbmRbcGFyZW50XS5hcHBlbmQocGFydHNbLTFdKQogICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGluZFtwYXJlbnRdID0gW3BhcnRzLnBvcCgpXQogICAgICAgICAgICBzZWxmLl9kaXJpbmRleCA9IGluZAogICAgICAgICAgICByZXR1cm4gaW5kCgogICAgZGVmIF9oYXMoc2VsZiwgZnNwYXRoKToKICAgICAgICB6aXBfcGF0aCA9IHNlbGYuX3ppcGluZm9fbmFtZShmc3BhdGgpCiAgICAgICAgcmV0dXJuIHppcF9wYXRoIGluIHNlbGYuemlwaW5mbyBvciB6aXBfcGF0aCBpbiBzZWxmLl9pbmRleCgpCgogICAgZGVmIF9pc2RpcihzZWxmLCBmc3BhdGgpOgogICAgICAgIHJldHVybiBzZWxmLl96aXBpbmZvX25hbWUoZnNwYXRoKSBpbiBzZWxmLl9pbmRleCgpCgogICAgZGVmIF9saXN0ZGlyKHNlbGYsIGZzcGF0aCk6CiAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi5faW5kZXgoKS5nZXQoc2VsZi5femlwaW5mb19uYW1lKGZzcGF0aCksICgpKSkKCiAgICBkZWYgX2VhZ2VyX3RvX3ppcChzZWxmLCByZXNvdXJjZV9uYW1lKToKICAgICAgICByZXR1cm4gc2VsZi5femlwaW5mb19uYW1lKHNlbGYuX2ZuKHNlbGYuZWdnX3Jvb3QsIHJlc291cmNlX25hbWUpKQoKICAgIGRlZiBfcmVzb3VyY2VfdG9femlwKHNlbGYsIHJlc291cmNlX25hbWUpOgogICAgICAgIHJldHVybiBzZWxmLl96aXBpbmZvX25hbWUoc2VsZi5fZm4oc2VsZi5tb2R1bGVfcGF0aCwgcmVzb3VyY2VfbmFtZSkpCgoKcmVnaXN0ZXJfbG9hZGVyX3R5cGUoemlwaW1wb3J0LnppcGltcG9ydGVyLCBaaXBQcm92aWRlcikKCgpjbGFzcyBGaWxlTWV0YWRhdGEoRW1wdHlQcm92aWRlcik6CiAgICAiIiJNZXRhZGF0YSBoYW5kbGVyIGZvciBzdGFuZGFsb25lIFBLRy1JTkZPIGZpbGVzCgogICAgVXNhZ2U6OgoKICAgICAgICBtZXRhZGF0YSA9IEZpbGVNZXRhZGF0YSgiL3BhdGgvdG8vUEtHLUlORk8iKQoKICAgIFRoaXMgcHJvdmlkZXIgcmVqZWN0cyBhbGwgZGF0YSBhbmQgbWV0YWRhdGEgcmVxdWVzdHMgZXhjZXB0IGZvciBQS0ctSU5GTywKICAgIHdoaWNoIGlzIHRyZWF0ZWQgYXMgZXhpc3RpbmcsIGFuZCB3aWxsIGJlIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZSBhdAogICAgdGhlIHByb3ZpZGVkIGxvY2F0aW9uLgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdGgpOgogICAgICAgIHNlbGYucGF0aCA9IHBhdGgKCiAgICBkZWYgaGFzX21ldGFkYXRhKHNlbGYsIG5hbWUpOgogICAgICAgIHJldHVybiBuYW1lID09ICdQS0ctSU5GTycgYW5kIG9zLnBhdGguaXNmaWxlKHNlbGYucGF0aCkKCiAgICBkZWYgZ2V0X21ldGFkYXRhKHNlbGYsIG5hbWUpOgogICAgICAgIGlmIG5hbWUgIT0gJ1BLRy1JTkZPJzoKICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IoIk5vIG1ldGFkYXRhIGV4Y2VwdCBQS0ctSU5GTyBpcyBhdmFpbGFibGUiKQoKICAgICAgICB3aXRoIGlvLm9wZW4oc2VsZi5wYXRoLCBlbmNvZGluZz0ndXRmLTgnLCBlcnJvcnM9InJlcGxhY2UiKSBhcyBmOgogICAgICAgICAgICBtZXRhZGF0YSA9IGYucmVhZCgpCiAgICAgICAgc2VsZi5fd2Fybl9vbl9yZXBsYWNlbWVudChtZXRhZGF0YSkKICAgICAgICByZXR1cm4gbWV0YWRhdGEKCiAgICBkZWYgX3dhcm5fb25fcmVwbGFjZW1lbnQoc2VsZiwgbWV0YWRhdGEpOgogICAgICAgICMgUHl0aG9uIDIuNiBhbmQgMy4yIGNvbXBhdCBmb3I6IHJlcGxhY2VtZW50X2NoYXIgPSAn77+9JwogICAgICAgIHJlcGxhY2VtZW50X2NoYXIgPSBiJ1x4ZWZceGJmXHhiZCcuZGVjb2RlKCd1dGYtOCcpCiAgICAgICAgaWYgcmVwbGFjZW1lbnRfY2hhciBpbiBtZXRhZGF0YToKICAgICAgICAgICAgdG1wbCA9ICJ7c2VsZi5wYXRofSBjb3VsZCBub3QgYmUgcHJvcGVybHkgZGVjb2RlZCBpbiBVVEYtOCIKICAgICAgICAgICAgbXNnID0gdG1wbC5mb3JtYXQoKipsb2NhbHMoKSkKICAgICAgICAgICAgd2FybmluZ3Mud2Fybihtc2cpCgogICAgZGVmIGdldF9tZXRhZGF0YV9saW5lcyhzZWxmLCBuYW1lKToKICAgICAgICByZXR1cm4geWllbGRfbGluZXMoc2VsZi5nZXRfbWV0YWRhdGEobmFtZSkpCgoKY2xhc3MgUGF0aE1ldGFkYXRhKERlZmF1bHRQcm92aWRlcik6CiAgICAiIiJNZXRhZGF0YSBwcm92aWRlciBmb3IgZWdnIGRpcmVjdG9yaWVzCgogICAgVXNhZ2U6OgoKICAgICAgICAjIERldmVsb3BtZW50IGVnZ3M6CgogICAgICAgIGVnZ19pbmZvID0gIi9wYXRoL3RvL1BhY2thZ2VOYW1lLmVnZy1pbmZvIgogICAgICAgIGJhc2VfZGlyID0gb3MucGF0aC5kaXJuYW1lKGVnZ19pbmZvKQogICAgICAgIG1ldGFkYXRhID0gUGF0aE1ldGFkYXRhKGJhc2VfZGlyLCBlZ2dfaW5mbykKICAgICAgICBkaXN0X25hbWUgPSBvcy5wYXRoLnNwbGl0ZXh0KG9zLnBhdGguYmFzZW5hbWUoZWdnX2luZm8pKVswXQogICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24oYmFzZWRpciwgcHJvamVjdF9uYW1lPWRpc3RfbmFtZSwgbWV0YWRhdGE9bWV0YWRhdGEpCgogICAgICAgICMgVW5wYWNrZWQgZWdnIGRpcmVjdG9yaWVzOgoKICAgICAgICBlZ2dfcGF0aCA9ICIvcGF0aC90by9QYWNrYWdlTmFtZS12ZXItcHl2ZXItZXRjLmVnZyIKICAgICAgICBtZXRhZGF0YSA9IFBhdGhNZXRhZGF0YShlZ2dfcGF0aCwgb3MucGF0aC5qb2luKGVnZ19wYXRoLCdFR0ctSU5GTycpKQogICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24uZnJvbV9maWxlbmFtZShlZ2dfcGF0aCwgbWV0YWRhdGE9bWV0YWRhdGEpCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgcGF0aCwgZWdnX2luZm8pOgogICAgICAgIHNlbGYubW9kdWxlX3BhdGggPSBwYXRoCiAgICAgICAgc2VsZi5lZ2dfaW5mbyA9IGVnZ19pbmZvCgoKY2xhc3MgRWdnTWV0YWRhdGEoWmlwUHJvdmlkZXIpOgogICAgIiIiTWV0YWRhdGEgcHJvdmlkZXIgZm9yIC5lZ2cgZmlsZXMiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgaW1wb3J0ZXIpOgogICAgICAgICIiIkNyZWF0ZSBhIG1ldGFkYXRhIHByb3ZpZGVyIGZyb20gYSB6aXBpbXBvcnRlciIiIgoKICAgICAgICBzZWxmLnppcF9wcmUgPSBpbXBvcnRlci5hcmNoaXZlICsgb3Muc2VwCiAgICAgICAgc2VsZi5sb2FkZXIgPSBpbXBvcnRlcgogICAgICAgIGlmIGltcG9ydGVyLnByZWZpeDoKICAgICAgICAgICAgc2VsZi5tb2R1bGVfcGF0aCA9IG9zLnBhdGguam9pbihpbXBvcnRlci5hcmNoaXZlLCBpbXBvcnRlci5wcmVmaXgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5tb2R1bGVfcGF0aCA9IGltcG9ydGVyLmFyY2hpdmUKICAgICAgICBzZWxmLl9zZXR1cF9wcmVmaXgoKQoKCl9kZWNsYXJlX3N0YXRlKCdkaWN0JywgX2Rpc3RyaWJ1dGlvbl9maW5kZXJzPXt9KQoKCmRlZiByZWdpc3Rlcl9maW5kZXIoaW1wb3J0ZXJfdHlwZSwgZGlzdHJpYnV0aW9uX2ZpbmRlcik6CiAgICAiIiJSZWdpc3RlciBgZGlzdHJpYnV0aW9uX2ZpbmRlcmAgdG8gZmluZCBkaXN0cmlidXRpb25zIGluIHN5cy5wYXRoIGl0ZW1zCgogICAgYGltcG9ydGVyX3R5cGVgIGlzIHRoZSB0eXBlIG9yIGNsYXNzIG9mIGEgUEVQIDMwMiAiSW1wb3J0ZXIiIChzeXMucGF0aCBpdGVtCiAgICBoYW5kbGVyKSwgYW5kIGBkaXN0cmlidXRpb25fZmluZGVyYCBpcyBhIGNhbGxhYmxlIHRoYXQsIHBhc3NlZCBhIHBhdGgKICAgIGl0ZW0gYW5kIHRoZSBpbXBvcnRlciBpbnN0YW5jZSwgeWllbGRzIGBgRGlzdHJpYnV0aW9uYGAgaW5zdGFuY2VzIGZvdW5kIG9uCiAgICB0aGF0IHBhdGggaXRlbS4gIFNlZSBgYHBrZ19yZXNvdXJjZXMuZmluZF9vbl9wYXRoYGAgZm9yIGFuIGV4YW1wbGUuIiIiCiAgICBfZGlzdHJpYnV0aW9uX2ZpbmRlcnNbaW1wb3J0ZXJfdHlwZV0gPSBkaXN0cmlidXRpb25fZmluZGVyCgoKZGVmIGZpbmRfZGlzdHJpYnV0aW9ucyhwYXRoX2l0ZW0sIG9ubHk9RmFsc2UpOgogICAgIiIiWWllbGQgZGlzdHJpYnV0aW9ucyBhY2Nlc3NpYmxlIHZpYSBgcGF0aF9pdGVtYCIiIgogICAgaW1wb3J0ZXIgPSBnZXRfaW1wb3J0ZXIocGF0aF9pdGVtKQogICAgZmluZGVyID0gX2ZpbmRfYWRhcHRlcihfZGlzdHJpYnV0aW9uX2ZpbmRlcnMsIGltcG9ydGVyKQogICAgcmV0dXJuIGZpbmRlcihpbXBvcnRlciwgcGF0aF9pdGVtLCBvbmx5KQoKCmRlZiBmaW5kX2VnZ3NfaW5femlwKGltcG9ydGVyLCBwYXRoX2l0ZW0sIG9ubHk9RmFsc2UpOgogICAgIiIiCiAgICBGaW5kIGVnZ3MgaW4gemlwIGZpbGVzOyBwb3NzaWJseSBtdWx0aXBsZSBuZXN0ZWQgZWdncy4KICAgICIiIgogICAgaWYgaW1wb3J0ZXIuYXJjaGl2ZS5lbmRzd2l0aCgnLndobCcpOgogICAgICAgICMgd2hlZWxzIGFyZSBub3Qgc3VwcG9ydGVkIHdpdGggdGhpcyBmaW5kZXIKICAgICAgICAjIHRoZXkgZG9uJ3QgaGF2ZSBQS0ctSU5GTyBtZXRhZGF0YSwgYW5kIHdvbid0IGV2ZXIgY29udGFpbiBlZ2dzCiAgICAgICAgcmV0dXJuCiAgICBtZXRhZGF0YSA9IEVnZ01ldGFkYXRhKGltcG9ydGVyKQogICAgaWYgbWV0YWRhdGEuaGFzX21ldGFkYXRhKCdQS0ctSU5GTycpOgogICAgICAgIHlpZWxkIERpc3RyaWJ1dGlvbi5mcm9tX2ZpbGVuYW1lKHBhdGhfaXRlbSwgbWV0YWRhdGE9bWV0YWRhdGEpCiAgICBpZiBvbmx5OgogICAgICAgICMgZG9uJ3QgeWllbGQgbmVzdGVkIGRpc3Ryb3MKICAgICAgICByZXR1cm4KICAgIGZvciBzdWJpdGVtIGluIG1ldGFkYXRhLnJlc291cmNlX2xpc3RkaXIoJy8nKToKICAgICAgICBpZiBfaXNfdW5wYWNrZWRfZWdnKHN1Yml0ZW0pOgogICAgICAgICAgICBzdWJwYXRoID0gb3MucGF0aC5qb2luKHBhdGhfaXRlbSwgc3ViaXRlbSkKICAgICAgICAgICAgZm9yIGRpc3QgaW4gZmluZF9lZ2dzX2luX3ppcCh6aXBpbXBvcnQuemlwaW1wb3J0ZXIoc3VicGF0aCksIHN1YnBhdGgpOgogICAgICAgICAgICAgICAgeWllbGQgZGlzdAoKCnJlZ2lzdGVyX2ZpbmRlcih6aXBpbXBvcnQuemlwaW1wb3J0ZXIsIGZpbmRfZWdnc19pbl96aXApCgoKZGVmIGZpbmRfbm90aGluZyhpbXBvcnRlciwgcGF0aF9pdGVtLCBvbmx5PUZhbHNlKToKICAgIHJldHVybiAoKQoKCnJlZ2lzdGVyX2ZpbmRlcihvYmplY3QsIGZpbmRfbm90aGluZykKCgpkZWYgX2J5X3ZlcnNpb25fZGVzY2VuZGluZyhuYW1lcyk6CiAgICAiIiIKICAgIEdpdmVuIGEgbGlzdCBvZiBmaWxlbmFtZXMsIHJldHVybiB0aGVtIGluIGRlc2NlbmRpbmcgb3JkZXIKICAgIGJ5IHZlcnNpb24gbnVtYmVyLgoKICAgID4+PiBuYW1lcyA9ICdiYXInLCAnZm9vJywgJ1B5dGhvbi0yLjcuMTAuZWdnJywgJ1B5dGhvbi0yLjcuMi5lZ2cnCiAgICA+Pj4gX2J5X3ZlcnNpb25fZGVzY2VuZGluZyhuYW1lcykKICAgIFsnUHl0aG9uLTIuNy4xMC5lZ2cnLCAnUHl0aG9uLTIuNy4yLmVnZycsICdmb28nLCAnYmFyJ10KICAgID4+PiBuYW1lcyA9ICdTZXR1cHRvb2xzLTEuMi4zYjEuZWdnJywgJ1NldHVwdG9vbHMtMS4yLjMuZWdnJwogICAgPj4+IF9ieV92ZXJzaW9uX2Rlc2NlbmRpbmcobmFtZXMpCiAgICBbJ1NldHVwdG9vbHMtMS4yLjMuZWdnJywgJ1NldHVwdG9vbHMtMS4yLjNiMS5lZ2cnXQogICAgPj4+IG5hbWVzID0gJ1NldHVwdG9vbHMtMS4yLjNiMS5lZ2cnLCAnU2V0dXB0b29scy0xLjIuMy5wb3N0MS5lZ2cnCiAgICA+Pj4gX2J5X3ZlcnNpb25fZGVzY2VuZGluZyhuYW1lcykKICAgIFsnU2V0dXB0b29scy0xLjIuMy5wb3N0MS5lZ2cnLCAnU2V0dXB0b29scy0xLjIuM2IxLmVnZyddCiAgICAiIiIKICAgIGRlZiBfYnlfdmVyc2lvbihuYW1lKToKICAgICAgICAiIiIKICAgICAgICBQYXJzZSBlYWNoIGNvbXBvbmVudCBvZiB0aGUgZmlsZW5hbWUKICAgICAgICAiIiIKICAgICAgICBuYW1lLCBleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KG5hbWUpCiAgICAgICAgcGFydHMgPSBpdGVydG9vbHMuY2hhaW4obmFtZS5zcGxpdCgnLScpLCBbZXh0XSkKICAgICAgICByZXR1cm4gW3BhY2thZ2luZy52ZXJzaW9uLnBhcnNlKHBhcnQpIGZvciBwYXJ0IGluIHBhcnRzXQoKICAgIHJldHVybiBzb3J0ZWQobmFtZXMsIGtleT1fYnlfdmVyc2lvbiwgcmV2ZXJzZT1UcnVlKQoKCmRlZiBmaW5kX29uX3BhdGgoaW1wb3J0ZXIsIHBhdGhfaXRlbSwgb25seT1GYWxzZSk6CiAgICAiIiJZaWVsZCBkaXN0cmlidXRpb25zIGFjY2Vzc2libGUgb24gYSBzeXMucGF0aCBkaXJlY3RvcnkiIiIKICAgIHBhdGhfaXRlbSA9IF9ub3JtYWxpemVfY2FjaGVkKHBhdGhfaXRlbSkKCiAgICBpZiBvcy5wYXRoLmlzZGlyKHBhdGhfaXRlbSkgYW5kIG9zLmFjY2VzcyhwYXRoX2l0ZW0sIG9zLlJfT0spOgogICAgICAgIGlmIF9pc191bnBhY2tlZF9lZ2cocGF0aF9pdGVtKToKICAgICAgICAgICAgeWllbGQgRGlzdHJpYnV0aW9uLmZyb21fZmlsZW5hbWUoCiAgICAgICAgICAgICAgICBwYXRoX2l0ZW0sIG1ldGFkYXRhPVBhdGhNZXRhZGF0YSgKICAgICAgICAgICAgICAgICAgICBwYXRoX2l0ZW0sIG9zLnBhdGguam9pbihwYXRoX2l0ZW0sICdFR0ctSU5GTycpCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICkKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIHNjYW4gZm9yIC5lZ2cgYW5kIC5lZ2ctaW5mbyBpbiBkaXJlY3RvcnkKICAgICAgICAgICAgcGF0aF9pdGVtX2VudHJpZXMgPSBfYnlfdmVyc2lvbl9kZXNjZW5kaW5nKG9zLmxpc3RkaXIocGF0aF9pdGVtKSkKICAgICAgICAgICAgZm9yIGVudHJ5IGluIHBhdGhfaXRlbV9lbnRyaWVzOgogICAgICAgICAgICAgICAgbG93ZXIgPSBlbnRyeS5sb3dlcigpCiAgICAgICAgICAgICAgICBpZiBsb3dlci5lbmRzd2l0aCgnLmVnZy1pbmZvJykgb3IgbG93ZXIuZW5kc3dpdGgoJy5kaXN0LWluZm8nKToKICAgICAgICAgICAgICAgICAgICBmdWxscGF0aCA9IG9zLnBhdGguam9pbihwYXRoX2l0ZW0sIGVudHJ5KQogICAgICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZnVsbHBhdGgpOgogICAgICAgICAgICAgICAgICAgICAgICAjIGVnZy1pbmZvIGRpcmVjdG9yeSwgYWxsb3cgZ2V0dGluZyBtZXRhZGF0YQogICAgICAgICAgICAgICAgICAgICAgICBpZiBsZW4ob3MubGlzdGRpcihmdWxscGF0aCkpID09IDA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIEVtcHR5IGVnZyBkaXJlY3RvcnksIHNraXAuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSA9IFBhdGhNZXRhZGF0YShwYXRoX2l0ZW0sIGZ1bGxwYXRoKQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhID0gRmlsZU1ldGFkYXRhKGZ1bGxwYXRoKQogICAgICAgICAgICAgICAgICAgIHlpZWxkIERpc3RyaWJ1dGlvbi5mcm9tX2xvY2F0aW9uKAogICAgICAgICAgICAgICAgICAgICAgICBwYXRoX2l0ZW0sIGVudHJ5LCBtZXRhZGF0YSwgcHJlY2VkZW5jZT1ERVZFTE9QX0RJU1QKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBlbGlmIG5vdCBvbmx5IGFuZCBfaXNfdW5wYWNrZWRfZWdnKGVudHJ5KToKICAgICAgICAgICAgICAgICAgICBkaXN0cyA9IGZpbmRfZGlzdHJpYnV0aW9ucyhvcy5wYXRoLmpvaW4ocGF0aF9pdGVtLCBlbnRyeSkpCiAgICAgICAgICAgICAgICAgICAgZm9yIGRpc3QgaW4gZGlzdHM6CiAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIGRpc3QKICAgICAgICAgICAgICAgIGVsaWYgbm90IG9ubHkgYW5kIGxvd2VyLmVuZHN3aXRoKCcuZWdnLWxpbmsnKToKICAgICAgICAgICAgICAgICAgICB3aXRoIG9wZW4ob3MucGF0aC5qb2luKHBhdGhfaXRlbSwgZW50cnkpKSBhcyBlbnRyeV9maWxlOgogICAgICAgICAgICAgICAgICAgICAgICBlbnRyeV9saW5lcyA9IGVudHJ5X2ZpbGUucmVhZGxpbmVzKCkKICAgICAgICAgICAgICAgICAgICBmb3IgbGluZSBpbiBlbnRyeV9saW5lczoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IGxpbmUuc3RyaXAoKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aF9pdGVtLCBsaW5lLnJzdHJpcCgpKQogICAgICAgICAgICAgICAgICAgICAgICBkaXN0cyA9IGZpbmRfZGlzdHJpYnV0aW9ucyhwYXRoKQogICAgICAgICAgICAgICAgICAgICAgICBmb3IgaXRlbSBpbiBkaXN0czoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIGl0ZW0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKCgpyZWdpc3Rlcl9maW5kZXIocGtndXRpbC5JbXBJbXBvcnRlciwgZmluZF9vbl9wYXRoKQoKaWYgaGFzYXR0cihpbXBvcnRsaWJfbWFjaGluZXJ5LCAnRmlsZUZpbmRlcicpOgogICAgcmVnaXN0ZXJfZmluZGVyKGltcG9ydGxpYl9tYWNoaW5lcnkuRmlsZUZpbmRlciwgZmluZF9vbl9wYXRoKQoKX2RlY2xhcmVfc3RhdGUoJ2RpY3QnLCBfbmFtZXNwYWNlX2hhbmRsZXJzPXt9KQpfZGVjbGFyZV9zdGF0ZSgnZGljdCcsIF9uYW1lc3BhY2VfcGFja2FnZXM9e30pCgoKZGVmIHJlZ2lzdGVyX25hbWVzcGFjZV9oYW5kbGVyKGltcG9ydGVyX3R5cGUsIG5hbWVzcGFjZV9oYW5kbGVyKToKICAgICIiIlJlZ2lzdGVyIGBuYW1lc3BhY2VfaGFuZGxlcmAgdG8gZGVjbGFyZSBuYW1lc3BhY2UgcGFja2FnZXMKCiAgICBgaW1wb3J0ZXJfdHlwZWAgaXMgdGhlIHR5cGUgb3IgY2xhc3Mgb2YgYSBQRVAgMzAyICJJbXBvcnRlciIgKHN5cy5wYXRoIGl0ZW0KICAgIGhhbmRsZXIpLCBhbmQgYG5hbWVzcGFjZV9oYW5kbGVyYCBpcyBhIGNhbGxhYmxlIGxpa2UgdGhpczo6CgogICAgICAgIGRlZiBuYW1lc3BhY2VfaGFuZGxlcihpbXBvcnRlciwgcGF0aF9lbnRyeSwgbW9kdWxlTmFtZSwgbW9kdWxlKToKICAgICAgICAgICAgIyByZXR1cm4gYSBwYXRoX2VudHJ5IHRvIHVzZSBmb3IgY2hpbGQgcGFja2FnZXMKCiAgICBOYW1lc3BhY2UgaGFuZGxlcnMgYXJlIG9ubHkgY2FsbGVkIGlmIHRoZSBpbXBvcnRlciBvYmplY3QgaGFzIGFscmVhZHkKICAgIGFncmVlZCB0aGF0IGl0IGNhbiBoYW5kbGUgdGhlIHJlbGV2YW50IHBhdGggaXRlbSwgYW5kIHRoZXkgc2hvdWxkIG9ubHkKICAgIHJldHVybiBhIHN1YnBhdGggaWYgdGhlIG1vZHVsZSBfX3BhdGhfXyBkb2VzIG5vdCBhbHJlYWR5IGNvbnRhaW4gYW4KICAgIGVxdWl2YWxlbnQgc3VicGF0aC4gIEZvciBhbiBleGFtcGxlIG5hbWVzcGFjZSBoYW5kbGVyLCBzZWUKICAgIGBgcGtnX3Jlc291cmNlcy5maWxlX25zX2hhbmRsZXJgYC4KICAgICIiIgogICAgX25hbWVzcGFjZV9oYW5kbGVyc1tpbXBvcnRlcl90eXBlXSA9IG5hbWVzcGFjZV9oYW5kbGVyCgoKZGVmIF9oYW5kbGVfbnMocGFja2FnZU5hbWUsIHBhdGhfaXRlbSk6CiAgICAiIiJFbnN1cmUgdGhhdCBuYW1lZCBwYWNrYWdlIGluY2x1ZGVzIGEgc3VicGF0aCBvZiBwYXRoX2l0ZW0gKGlmIG5lZWRlZCkiIiIKCiAgICBpbXBvcnRlciA9IGdldF9pbXBvcnRlcihwYXRoX2l0ZW0pCiAgICBpZiBpbXBvcnRlciBpcyBOb25lOgogICAgICAgIHJldHVybiBOb25lCiAgICBsb2FkZXIgPSBpbXBvcnRlci5maW5kX21vZHVsZShwYWNrYWdlTmFtZSkKICAgIGlmIGxvYWRlciBpcyBOb25lOgogICAgICAgIHJldHVybiBOb25lCiAgICBtb2R1bGUgPSBzeXMubW9kdWxlcy5nZXQocGFja2FnZU5hbWUpCiAgICBpZiBtb2R1bGUgaXMgTm9uZToKICAgICAgICBtb2R1bGUgPSBzeXMubW9kdWxlc1twYWNrYWdlTmFtZV0gPSB0eXBlcy5Nb2R1bGVUeXBlKHBhY2thZ2VOYW1lKQogICAgICAgIG1vZHVsZS5fX3BhdGhfXyA9IFtdCiAgICAgICAgX3NldF9wYXJlbnRfbnMocGFja2FnZU5hbWUpCiAgICBlbGlmIG5vdCBoYXNhdHRyKG1vZHVsZSwgJ19fcGF0aF9fJyk6CiAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJOb3QgYSBwYWNrYWdlOiIsIHBhY2thZ2VOYW1lKQogICAgaGFuZGxlciA9IF9maW5kX2FkYXB0ZXIoX25hbWVzcGFjZV9oYW5kbGVycywgaW1wb3J0ZXIpCiAgICBzdWJwYXRoID0gaGFuZGxlcihpbXBvcnRlciwgcGF0aF9pdGVtLCBwYWNrYWdlTmFtZSwgbW9kdWxlKQogICAgaWYgc3VicGF0aCBpcyBub3QgTm9uZToKICAgICAgICBwYXRoID0gbW9kdWxlLl9fcGF0aF9fCiAgICAgICAgcGF0aC5hcHBlbmQoc3VicGF0aCkKICAgICAgICBsb2FkZXIubG9hZF9tb2R1bGUocGFja2FnZU5hbWUpCiAgICAgICAgX3JlYnVpbGRfbW9kX3BhdGgocGF0aCwgcGFja2FnZU5hbWUsIG1vZHVsZSkKICAgIHJldHVybiBzdWJwYXRoCgoKZGVmIF9yZWJ1aWxkX21vZF9wYXRoKG9yaWdfcGF0aCwgcGFja2FnZV9uYW1lLCBtb2R1bGUpOgogICAgIiIiCiAgICBSZWJ1aWxkIG1vZHVsZS5fX3BhdGhfXyBlbnN1cmluZyB0aGF0IGFsbCBlbnRyaWVzIGFyZSBvcmRlcmVkCiAgICBjb3JyZXNwb25kaW5nIHRvIHRoZWlyIHN5cy5wYXRoIG9yZGVyCiAgICAiIiIKICAgIHN5c19wYXRoID0gW19ub3JtYWxpemVfY2FjaGVkKHApIGZvciBwIGluIHN5cy5wYXRoXQoKICAgIGRlZiBzYWZlX3N5c19wYXRoX2luZGV4KGVudHJ5KToKICAgICAgICAiIiIKICAgICAgICBXb3JrYXJvdW5kIGZvciAjNTIwIGFuZCAjNTEzLgogICAgICAgICIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHN5c19wYXRoLmluZGV4KGVudHJ5KQogICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICByZXR1cm4gZmxvYXQoJ2luZicpCgogICAgZGVmIHBvc2l0aW9uX2luX3N5c19wYXRoKHBhdGgpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiB0aGUgb3JkaW5hbCBvZiB0aGUgcGF0aCBiYXNlZCBvbiBpdHMgcG9zaXRpb24gaW4gc3lzLnBhdGgKICAgICAgICAiIiIKICAgICAgICBwYXRoX3BhcnRzID0gcGF0aC5zcGxpdChvcy5zZXApCiAgICAgICAgbW9kdWxlX3BhcnRzID0gcGFja2FnZV9uYW1lLmNvdW50KCcuJykgKyAxCiAgICAgICAgcGFydHMgPSBwYXRoX3BhcnRzWzotbW9kdWxlX3BhcnRzXQogICAgICAgIHJldHVybiBzYWZlX3N5c19wYXRoX2luZGV4KF9ub3JtYWxpemVfY2FjaGVkKG9zLnNlcC5qb2luKHBhcnRzKSkpCgogICAgb3JpZ19wYXRoLnNvcnQoa2V5PXBvc2l0aW9uX2luX3N5c19wYXRoKQogICAgbW9kdWxlLl9fcGF0aF9fWzpdID0gW19ub3JtYWxpemVfY2FjaGVkKHApIGZvciBwIGluIG9yaWdfcGF0aF0KCgpkZWYgZGVjbGFyZV9uYW1lc3BhY2UocGFja2FnZU5hbWUpOgogICAgIiIiRGVjbGFyZSB0aGF0IHBhY2thZ2UgJ3BhY2thZ2VOYW1lJyBpcyBhIG5hbWVzcGFjZSBwYWNrYWdlIiIiCgogICAgX2ltcC5hY3F1aXJlX2xvY2soKQogICAgdHJ5OgogICAgICAgIGlmIHBhY2thZ2VOYW1lIGluIF9uYW1lc3BhY2VfcGFja2FnZXM6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBwYXRoLCBwYXJlbnQgPSBzeXMucGF0aCwgTm9uZQogICAgICAgIGlmICcuJyBpbiBwYWNrYWdlTmFtZToKICAgICAgICAgICAgcGFyZW50ID0gJy4nLmpvaW4ocGFja2FnZU5hbWUuc3BsaXQoJy4nKVs6LTFdKQogICAgICAgICAgICBkZWNsYXJlX25hbWVzcGFjZShwYXJlbnQpCiAgICAgICAgICAgIGlmIHBhcmVudCBub3QgaW4gX25hbWVzcGFjZV9wYWNrYWdlczoKICAgICAgICAgICAgICAgIF9faW1wb3J0X18ocGFyZW50KQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBwYXRoID0gc3lzLm1vZHVsZXNbcGFyZW50XS5fX3BhdGhfXwogICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIk5vdCBhIHBhY2thZ2U6IiwgcGFyZW50KQoKICAgICAgICAjIFRyYWNrIHdoYXQgcGFja2FnZXMgYXJlIG5hbWVzcGFjZXMsIHNvIHdoZW4gbmV3IHBhdGggaXRlbXMgYXJlIGFkZGVkLAogICAgICAgICMgdGhleSBjYW4gYmUgdXBkYXRlZAogICAgICAgIF9uYW1lc3BhY2VfcGFja2FnZXMuc2V0ZGVmYXVsdChwYXJlbnQsIFtdKS5hcHBlbmQocGFja2FnZU5hbWUpCiAgICAgICAgX25hbWVzcGFjZV9wYWNrYWdlcy5zZXRkZWZhdWx0KHBhY2thZ2VOYW1lLCBbXSkKCiAgICAgICAgZm9yIHBhdGhfaXRlbSBpbiBwYXRoOgogICAgICAgICAgICAjIEVuc3VyZSBhbGwgdGhlIHBhcmVudCdzIHBhdGggaXRlbXMgYXJlIHJlZmxlY3RlZCBpbiB0aGUgY2hpbGQsCiAgICAgICAgICAgICMgaWYgdGhleSBhcHBseQogICAgICAgICAgICBfaGFuZGxlX25zKHBhY2thZ2VOYW1lLCBwYXRoX2l0ZW0pCgogICAgZmluYWxseToKICAgICAgICBfaW1wLnJlbGVhc2VfbG9jaygpCgoKZGVmIGZpeHVwX25hbWVzcGFjZV9wYWNrYWdlcyhwYXRoX2l0ZW0sIHBhcmVudD1Ob25lKToKICAgICIiIkVuc3VyZSB0aGF0IHByZXZpb3VzbHktZGVjbGFyZWQgbmFtZXNwYWNlIHBhY2thZ2VzIGluY2x1ZGUgcGF0aF9pdGVtIiIiCiAgICBfaW1wLmFjcXVpcmVfbG9jaygpCiAgICB0cnk6CiAgICAgICAgZm9yIHBhY2thZ2UgaW4gX25hbWVzcGFjZV9wYWNrYWdlcy5nZXQocGFyZW50LCAoKSk6CiAgICAgICAgICAgIHN1YnBhdGggPSBfaGFuZGxlX25zKHBhY2thZ2UsIHBhdGhfaXRlbSkKICAgICAgICAgICAgaWYgc3VicGF0aDoKICAgICAgICAgICAgICAgIGZpeHVwX25hbWVzcGFjZV9wYWNrYWdlcyhzdWJwYXRoLCBwYWNrYWdlKQogICAgZmluYWxseToKICAgICAgICBfaW1wLnJlbGVhc2VfbG9jaygpCgoKZGVmIGZpbGVfbnNfaGFuZGxlcihpbXBvcnRlciwgcGF0aF9pdGVtLCBwYWNrYWdlTmFtZSwgbW9kdWxlKToKICAgICIiIkNvbXB1dGUgYW4gbnMtcGFja2FnZSBzdWJwYXRoIGZvciBhIGZpbGVzeXN0ZW0gb3IgemlwZmlsZSBpbXBvcnRlciIiIgoKICAgIHN1YnBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aF9pdGVtLCBwYWNrYWdlTmFtZS5zcGxpdCgnLicpWy0xXSkKICAgIG5vcm1hbGl6ZWQgPSBfbm9ybWFsaXplX2NhY2hlZChzdWJwYXRoKQogICAgZm9yIGl0ZW0gaW4gbW9kdWxlLl9fcGF0aF9fOgogICAgICAgIGlmIF9ub3JtYWxpemVfY2FjaGVkKGl0ZW0pID09IG5vcm1hbGl6ZWQ6CiAgICAgICAgICAgIGJyZWFrCiAgICBlbHNlOgogICAgICAgICMgT25seSByZXR1cm4gdGhlIHBhdGggaWYgaXQncyBub3QgYWxyZWFkeSB0aGVyZQogICAgICAgIHJldHVybiBzdWJwYXRoCgoKcmVnaXN0ZXJfbmFtZXNwYWNlX2hhbmRsZXIocGtndXRpbC5JbXBJbXBvcnRlciwgZmlsZV9uc19oYW5kbGVyKQpyZWdpc3Rlcl9uYW1lc3BhY2VfaGFuZGxlcih6aXBpbXBvcnQuemlwaW1wb3J0ZXIsIGZpbGVfbnNfaGFuZGxlcikKCmlmIGhhc2F0dHIoaW1wb3J0bGliX21hY2hpbmVyeSwgJ0ZpbGVGaW5kZXInKToKICAgIHJlZ2lzdGVyX25hbWVzcGFjZV9oYW5kbGVyKGltcG9ydGxpYl9tYWNoaW5lcnkuRmlsZUZpbmRlciwgZmlsZV9uc19oYW5kbGVyKQoKCmRlZiBudWxsX25zX2hhbmRsZXIoaW1wb3J0ZXIsIHBhdGhfaXRlbSwgcGFja2FnZU5hbWUsIG1vZHVsZSk6CiAgICByZXR1cm4gTm9uZQoKCnJlZ2lzdGVyX25hbWVzcGFjZV9oYW5kbGVyKG9iamVjdCwgbnVsbF9uc19oYW5kbGVyKQoKCmRlZiBub3JtYWxpemVfcGF0aChmaWxlbmFtZSk6CiAgICAiIiJOb3JtYWxpemUgYSBmaWxlL2RpciBuYW1lIGZvciBjb21wYXJpc29uIHB1cnBvc2VzIiIiCiAgICByZXR1cm4gb3MucGF0aC5ub3JtY2FzZShvcy5wYXRoLnJlYWxwYXRoKGZpbGVuYW1lKSkKCgpkZWYgX25vcm1hbGl6ZV9jYWNoZWQoZmlsZW5hbWUsIF9jYWNoZT17fSk6CiAgICB0cnk6CiAgICAgICAgcmV0dXJuIF9jYWNoZVtmaWxlbmFtZV0KICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICBfY2FjaGVbZmlsZW5hbWVdID0gcmVzdWx0ID0gbm9ybWFsaXplX3BhdGgoZmlsZW5hbWUpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKCmRlZiBfaXNfdW5wYWNrZWRfZWdnKHBhdGgpOgogICAgIiIiCiAgICBEZXRlcm1pbmUgaWYgZ2l2ZW4gcGF0aCBhcHBlYXJzIHRvIGJlIGFuIHVucGFja2VkIGVnZy4KICAgICIiIgogICAgcmV0dXJuICgKICAgICAgICBwYXRoLmxvd2VyKCkuZW5kc3dpdGgoJy5lZ2cnKQogICAgKQoKCmRlZiBfc2V0X3BhcmVudF9ucyhwYWNrYWdlTmFtZSk6CiAgICBwYXJ0cyA9IHBhY2thZ2VOYW1lLnNwbGl0KCcuJykKICAgIG5hbWUgPSBwYXJ0cy5wb3AoKQogICAgaWYgcGFydHM6CiAgICAgICAgcGFyZW50ID0gJy4nLmpvaW4ocGFydHMpCiAgICAgICAgc2V0YXR0cihzeXMubW9kdWxlc1twYXJlbnRdLCBuYW1lLCBzeXMubW9kdWxlc1twYWNrYWdlTmFtZV0pCgoKZGVmIHlpZWxkX2xpbmVzKHN0cnMpOgogICAgIiIiWWllbGQgbm9uLWVtcHR5L25vbi1jb21tZW50IGxpbmVzIG9mIGEgc3RyaW5nIG9yIHNlcXVlbmNlIiIiCiAgICBpZiBpc2luc3RhbmNlKHN0cnMsIHNpeC5zdHJpbmdfdHlwZXMpOgogICAgICAgIGZvciBzIGluIHN0cnMuc3BsaXRsaW5lcygpOgogICAgICAgICAgICBzID0gcy5zdHJpcCgpCiAgICAgICAgICAgICMgc2tpcCBibGFuayBsaW5lcy9jb21tZW50cwogICAgICAgICAgICBpZiBzIGFuZCBub3Qgcy5zdGFydHN3aXRoKCcjJyk6CiAgICAgICAgICAgICAgICB5aWVsZCBzCiAgICBlbHNlOgogICAgICAgIGZvciBzcyBpbiBzdHJzOgogICAgICAgICAgICBmb3IgcyBpbiB5aWVsZF9saW5lcyhzcyk6CiAgICAgICAgICAgICAgICB5aWVsZCBzCgoKTU9EVUxFID0gcmUuY29tcGlsZShyIlx3KyhcLlx3KykqJCIpLm1hdGNoCkVHR19OQU1FID0gcmUuY29tcGlsZSgKICAgIHIiIiIKICAgICg/UDxuYW1lPlteLV0rKSAoCiAgICAgICAgLSg/UDx2ZXI+W14tXSspICgKICAgICAgICAgICAgLXB5KD9QPHB5dmVyPlteLV0rKSAoCiAgICAgICAgICAgICAgICAtKD9QPHBsYXQ+LispCiAgICAgICAgICAgICk/CiAgICAgICAgKT8KICAgICk/CiAgICAiIiIsCiAgICByZS5WRVJCT1NFIHwgcmUuSUdOT1JFQ0FTRSwKKS5tYXRjaAoKCmNsYXNzIEVudHJ5UG9pbnQob2JqZWN0KToKICAgICIiIk9iamVjdCByZXByZXNlbnRpbmcgYW4gYWR2ZXJ0aXNlZCBpbXBvcnRhYmxlIG9iamVjdCIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBtb2R1bGVfbmFtZSwgYXR0cnM9KCksIGV4dHJhcz0oKSwgZGlzdD1Ob25lKToKICAgICAgICBpZiBub3QgTU9EVUxFKG1vZHVsZV9uYW1lKToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiSW52YWxpZCBtb2R1bGUgbmFtZSIsIG1vZHVsZV9uYW1lKQogICAgICAgIHNlbGYubmFtZSA9IG5hbWUKICAgICAgICBzZWxmLm1vZHVsZV9uYW1lID0gbW9kdWxlX25hbWUKICAgICAgICBzZWxmLmF0dHJzID0gdHVwbGUoYXR0cnMpCiAgICAgICAgc2VsZi5leHRyYXMgPSBSZXF1aXJlbWVudC5wYXJzZSgoInhbJXNdIiAlICcsJy5qb2luKGV4dHJhcykpKS5leHRyYXMKICAgICAgICBzZWxmLmRpc3QgPSBkaXN0CgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcyA9ICIlcyA9ICVzIiAlIChzZWxmLm5hbWUsIHNlbGYubW9kdWxlX25hbWUpCiAgICAgICAgaWYgc2VsZi5hdHRyczoKICAgICAgICAgICAgcyArPSAnOicgKyAnLicuam9pbihzZWxmLmF0dHJzKQogICAgICAgIGlmIHNlbGYuZXh0cmFzOgogICAgICAgICAgICBzICs9ICcgWyVzXScgJSAnLCcuam9pbihzZWxmLmV4dHJhcykKICAgICAgICByZXR1cm4gcwoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIkVudHJ5UG9pbnQucGFyc2UoJXIpIiAlIHN0cihzZWxmKQoKICAgIGRlZiBsb2FkKHNlbGYsIHJlcXVpcmU9VHJ1ZSwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAiIiIKICAgICAgICBSZXF1aXJlIHBhY2thZ2VzIGZvciB0aGlzIEVudHJ5UG9pbnQsIHRoZW4gcmVzb2x2ZSBpdC4KICAgICAgICAiIiIKICAgICAgICBpZiBub3QgcmVxdWlyZSBvciBhcmdzIG9yIGt3YXJnczoKICAgICAgICAgICAgd2FybmluZ3Mud2FybigKICAgICAgICAgICAgICAgICJQYXJhbWV0ZXJzIHRvIGxvYWQgYXJlIGRlcHJlY2F0ZWQuICBDYWxsIC5yZXNvbHZlIGFuZCAiCiAgICAgICAgICAgICAgICAiLnJlcXVpcmUgc2VwYXJhdGVseS4iLAogICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLAogICAgICAgICAgICAgICAgc3RhY2tsZXZlbD0yLAogICAgICAgICAgICApCiAgICAgICAgaWYgcmVxdWlyZToKICAgICAgICAgICAgc2VsZi5yZXF1aXJlKCphcmdzLCAqKmt3YXJncykKICAgICAgICByZXR1cm4gc2VsZi5yZXNvbHZlKCkKCiAgICBkZWYgcmVzb2x2ZShzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXNvbHZlIHRoZSBlbnRyeSBwb2ludCBmcm9tIGl0cyBtb2R1bGUgYW5kIGF0dHJzLgogICAgICAgICIiIgogICAgICAgIG1vZHVsZSA9IF9faW1wb3J0X18oc2VsZi5tb2R1bGVfbmFtZSwgZnJvbWxpc3Q9WydfX25hbWVfXyddLCBsZXZlbD0wKQogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0b29scy5yZWR1Y2UoZ2V0YXR0ciwgc2VsZi5hdHRycywgbW9kdWxlKQogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvciBhcyBleGM6CiAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yKHN0cihleGMpKQoKICAgIGRlZiByZXF1aXJlKHNlbGYsIGVudj1Ob25lLCBpbnN0YWxsZXI9Tm9uZSk6CiAgICAgICAgaWYgc2VsZi5leHRyYXMgYW5kIG5vdCBzZWxmLmRpc3Q6CiAgICAgICAgICAgIHJhaXNlIFVua25vd25FeHRyYSgiQ2FuJ3QgcmVxdWlyZSgpIHdpdGhvdXQgYSBkaXN0cmlidXRpb24iLCBzZWxmKQogICAgICAgIHJlcXMgPSBzZWxmLmRpc3QucmVxdWlyZXMoc2VsZi5leHRyYXMpCiAgICAgICAgaXRlbXMgPSB3b3JraW5nX3NldC5yZXNvbHZlKHJlcXMsIGVudiwgaW5zdGFsbGVyKQogICAgICAgIGxpc3QobWFwKHdvcmtpbmdfc2V0LmFkZCwgaXRlbXMpKQoKICAgIHBhdHRlcm4gPSByZS5jb21waWxlKAogICAgICAgIHInXHMqJwogICAgICAgIHInKD9QPG5hbWU+Lis/KVxzKicKICAgICAgICByJz1ccyonCiAgICAgICAgcicoP1A8bW9kdWxlPltcdy5dKylccyonCiAgICAgICAgcicoOlxzKig/UDxhdHRyPltcdy5dKykpP1xzKicKICAgICAgICByJyg/UDxleHRyYXM+XFsuKlxdKT9ccyokJwogICAgKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIHBhcnNlKGNscywgc3JjLCBkaXN0PU5vbmUpOgogICAgICAgICIiIlBhcnNlIGEgc2luZ2xlIGVudHJ5IHBvaW50IGZyb20gc3RyaW5nIGBzcmNgCgogICAgICAgIEVudHJ5IHBvaW50IHN5bnRheCBmb2xsb3dzIHRoZSBmb3JtOjoKCiAgICAgICAgICAgIG5hbWUgPSBzb21lLm1vZHVsZTpzb21lLmF0dHIgW2V4dHJhMSwgZXh0cmEyXQoKICAgICAgICBUaGUgZW50cnkgbmFtZSBhbmQgbW9kdWxlIG5hbWUgYXJlIHJlcXVpcmVkLCBidXQgdGhlIGBgOmF0dHJzYGAgYW5kCiAgICAgICAgYGBbZXh0cmFzXWBgIHBhcnRzIGFyZSBvcHRpb25hbAogICAgICAgICIiIgogICAgICAgIG0gPSBjbHMucGF0dGVybi5tYXRjaChzcmMpCiAgICAgICAgaWYgbm90IG06CiAgICAgICAgICAgIG1zZyA9ICJFbnRyeVBvaW50IG11c3QgYmUgaW4gJ25hbWU9bW9kdWxlOmF0dHJzIFtleHRyYXNdJyBmb3JtYXQiCiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IobXNnLCBzcmMpCiAgICAgICAgcmVzID0gbS5ncm91cGRpY3QoKQogICAgICAgIGV4dHJhcyA9IGNscy5fcGFyc2VfZXh0cmFzKHJlc1snZXh0cmFzJ10pCiAgICAgICAgYXR0cnMgPSByZXNbJ2F0dHInXS5zcGxpdCgnLicpIGlmIHJlc1snYXR0ciddIGVsc2UgKCkKICAgICAgICByZXR1cm4gY2xzKHJlc1snbmFtZSddLCByZXNbJ21vZHVsZSddLCBhdHRycywgZXh0cmFzLCBkaXN0KQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9wYXJzZV9leHRyYXMoY2xzLCBleHRyYXNfc3BlYyk6CiAgICAgICAgaWYgbm90IGV4dHJhc19zcGVjOgogICAgICAgICAgICByZXR1cm4gKCkKICAgICAgICByZXEgPSBSZXF1aXJlbWVudC5wYXJzZSgneCcgKyBleHRyYXNfc3BlYykKICAgICAgICBpZiByZXEuc3BlY3M6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoKQogICAgICAgIHJldHVybiByZXEuZXh0cmFzCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgcGFyc2VfZ3JvdXAoY2xzLCBncm91cCwgbGluZXMsIGRpc3Q9Tm9uZSk6CiAgICAgICAgIiIiUGFyc2UgYW4gZW50cnkgcG9pbnQgZ3JvdXAiIiIKICAgICAgICBpZiBub3QgTU9EVUxFKGdyb3VwKToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiSW52YWxpZCBncm91cCBuYW1lIiwgZ3JvdXApCiAgICAgICAgdGhpcyA9IHt9CiAgICAgICAgZm9yIGxpbmUgaW4geWllbGRfbGluZXMobGluZXMpOgogICAgICAgICAgICBlcCA9IGNscy5wYXJzZShsaW5lLCBkaXN0KQogICAgICAgICAgICBpZiBlcC5uYW1lIGluIHRoaXM6CiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJEdXBsaWNhdGUgZW50cnkgcG9pbnQiLCBncm91cCwgZXAubmFtZSkKICAgICAgICAgICAgdGhpc1tlcC5uYW1lXSA9IGVwCiAgICAgICAgcmV0dXJuIHRoaXMKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBwYXJzZV9tYXAoY2xzLCBkYXRhLCBkaXN0PU5vbmUpOgogICAgICAgICIiIlBhcnNlIGEgbWFwIG9mIGVudHJ5IHBvaW50IGdyb3VwcyIiIgogICAgICAgIGlmIGlzaW5zdGFuY2UoZGF0YSwgZGljdCk6CiAgICAgICAgICAgIGRhdGEgPSBkYXRhLml0ZW1zKCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBkYXRhID0gc3BsaXRfc2VjdGlvbnMoZGF0YSkKICAgICAgICBtYXBzID0ge30KICAgICAgICBmb3IgZ3JvdXAsIGxpbmVzIGluIGRhdGE6CiAgICAgICAgICAgIGlmIGdyb3VwIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBpZiBub3QgbGluZXM6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkVudHJ5IHBvaW50cyBtdXN0IGJlIGxpc3RlZCBpbiBncm91cHMiKQogICAgICAgICAgICBncm91cCA9IGdyb3VwLnN0cmlwKCkKICAgICAgICAgICAgaWYgZ3JvdXAgaW4gbWFwczoKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkR1cGxpY2F0ZSBncm91cCBuYW1lIiwgZ3JvdXApCiAgICAgICAgICAgIG1hcHNbZ3JvdXBdID0gY2xzLnBhcnNlX2dyb3VwKGdyb3VwLCBsaW5lcywgZGlzdCkKICAgICAgICByZXR1cm4gbWFwcwoKCmRlZiBfcmVtb3ZlX21kNV9mcmFnbWVudChsb2NhdGlvbik6CiAgICBpZiBub3QgbG9jYXRpb246CiAgICAgICAgcmV0dXJuICcnCiAgICBwYXJzZWQgPSB1cmxsaWIucGFyc2UudXJscGFyc2UobG9jYXRpb24pCiAgICBpZiBwYXJzZWRbLTFdLnN0YXJ0c3dpdGgoJ21kNT0nKToKICAgICAgICByZXR1cm4gdXJsbGliLnBhcnNlLnVybHVucGFyc2UocGFyc2VkWzotMV0gKyAoJycsKSkKICAgIHJldHVybiBsb2NhdGlvbgoKCmRlZiBfdmVyc2lvbl9mcm9tX2ZpbGUobGluZXMpOgogICAgIiIiCiAgICBHaXZlbiBhbiBpdGVyYWJsZSBvZiBsaW5lcyBmcm9tIGEgTWV0YWRhdGEgZmlsZSwgcmV0dXJuCiAgICB0aGUgdmFsdWUgb2YgdGhlIFZlcnNpb24gZmllbGQsIGlmIHByZXNlbnQsIG9yIE5vbmUgb3RoZXJ3aXNlLgogICAgIiIiCiAgICBpc192ZXJzaW9uX2xpbmUgPSBsYW1iZGEgbGluZTogbGluZS5sb3dlcigpLnN0YXJ0c3dpdGgoJ3ZlcnNpb246JykKICAgIHZlcnNpb25fbGluZXMgPSBmaWx0ZXIoaXNfdmVyc2lvbl9saW5lLCBsaW5lcykKICAgIGxpbmUgPSBuZXh0KGl0ZXIodmVyc2lvbl9saW5lcyksICcnKQogICAgXywgXywgdmFsdWUgPSBsaW5lLnBhcnRpdGlvbignOicpCiAgICByZXR1cm4gc2FmZV92ZXJzaW9uKHZhbHVlLnN0cmlwKCkpIG9yIE5vbmUKCgpjbGFzcyBEaXN0cmlidXRpb24ob2JqZWN0KToKICAgICIiIldyYXAgYW4gYWN0dWFsIG9yIHBvdGVudGlhbCBzeXMucGF0aCBlbnRyeSB3L21ldGFkYXRhIiIiCiAgICBQS0dfSU5GTyA9ICdQS0ctSU5GTycKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbG9jYXRpb249Tm9uZSwgbWV0YWRhdGE9Tm9uZSwgcHJvamVjdF9uYW1lPU5vbmUsCiAgICAgICAgICAgIHZlcnNpb249Tm9uZSwgcHlfdmVyc2lvbj1QWV9NQUpPUiwgcGxhdGZvcm09Tm9uZSwKICAgICAgICAgICAgcHJlY2VkZW5jZT1FR0dfRElTVCk6CiAgICAgICAgc2VsZi5wcm9qZWN0X25hbWUgPSBzYWZlX25hbWUocHJvamVjdF9uYW1lIG9yICdVbmtub3duJykKICAgICAgICBpZiB2ZXJzaW9uIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLl92ZXJzaW9uID0gc2FmZV92ZXJzaW9uKHZlcnNpb24pCiAgICAgICAgc2VsZi5weV92ZXJzaW9uID0gcHlfdmVyc2lvbgogICAgICAgIHNlbGYucGxhdGZvcm0gPSBwbGF0Zm9ybQogICAgICAgIHNlbGYubG9jYXRpb24gPSBsb2NhdGlvbgogICAgICAgIHNlbGYucHJlY2VkZW5jZSA9IHByZWNlZGVuY2UKICAgICAgICBzZWxmLl9wcm92aWRlciA9IG1ldGFkYXRhIG9yIGVtcHR5X3Byb3ZpZGVyCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgZnJvbV9sb2NhdGlvbihjbHMsIGxvY2F0aW9uLCBiYXNlbmFtZSwgbWV0YWRhdGE9Tm9uZSwgKiprdyk6CiAgICAgICAgcHJvamVjdF9uYW1lLCB2ZXJzaW9uLCBweV92ZXJzaW9uLCBwbGF0Zm9ybSA9IFtOb25lXSAqIDQKICAgICAgICBiYXNlbmFtZSwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChiYXNlbmFtZSkKICAgICAgICBpZiBleHQubG93ZXIoKSBpbiBfZGlzdHJpYnV0aW9uSW1wbDoKICAgICAgICAgICAgY2xzID0gX2Rpc3RyaWJ1dGlvbkltcGxbZXh0Lmxvd2VyKCldCgogICAgICAgICAgICBtYXRjaCA9IEVHR19OQU1FKGJhc2VuYW1lKQogICAgICAgICAgICBpZiBtYXRjaDoKICAgICAgICAgICAgICAgIHByb2plY3RfbmFtZSwgdmVyc2lvbiwgcHlfdmVyc2lvbiwgcGxhdGZvcm0gPSBtYXRjaC5ncm91cCgKICAgICAgICAgICAgICAgICAgICAnbmFtZScsICd2ZXInLCAncHl2ZXInLCAncGxhdCcKICAgICAgICAgICAgICAgICkKICAgICAgICByZXR1cm4gY2xzKAogICAgICAgICAgICBsb2NhdGlvbiwgbWV0YWRhdGEsIHByb2plY3RfbmFtZT1wcm9qZWN0X25hbWUsIHZlcnNpb249dmVyc2lvbiwKICAgICAgICAgICAgcHlfdmVyc2lvbj1weV92ZXJzaW9uLCBwbGF0Zm9ybT1wbGF0Zm9ybSwgKiprdwogICAgICAgICkuX3JlbG9hZF92ZXJzaW9uKCkKCiAgICBkZWYgX3JlbG9hZF92ZXJzaW9uKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmCgogICAgQHByb3BlcnR5CiAgICBkZWYgaGFzaGNtcChzZWxmKToKICAgICAgICByZXR1cm4gKAogICAgICAgICAgICBzZWxmLnBhcnNlZF92ZXJzaW9uLAogICAgICAgICAgICBzZWxmLnByZWNlZGVuY2UsCiAgICAgICAgICAgIHNlbGYua2V5LAogICAgICAgICAgICBfcmVtb3ZlX21kNV9mcmFnbWVudChzZWxmLmxvY2F0aW9uKSwKICAgICAgICAgICAgc2VsZi5weV92ZXJzaW9uIG9yICcnLAogICAgICAgICAgICBzZWxmLnBsYXRmb3JtIG9yICcnLAogICAgICAgICkKCiAgICBkZWYgX19oYXNoX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGhhc2goc2VsZi5oYXNoY21wKQoKICAgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmLmhhc2hjbXAgPCBvdGhlci5oYXNoY21wCgogICAgZGVmIF9fbGVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYuaGFzaGNtcCA8PSBvdGhlci5oYXNoY21wCgogICAgZGVmIF9fZ3RfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYuaGFzaGNtcCA+IG90aGVyLmhhc2hjbXAKCiAgICBkZWYgX19nZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5oYXNoY21wID49IG90aGVyLmhhc2hjbXAKCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pOgogICAgICAgICAgICAjIEl0J3Mgbm90IGEgRGlzdHJpYnV0aW9uLCBzbyB0aGV5IGFyZSBub3QgZXF1YWwKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgcmV0dXJuIHNlbGYuaGFzaGNtcCA9PSBvdGhlci5oYXNoY21wCgogICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIG5vdCBzZWxmID09IG90aGVyCgogICAgIyBUaGVzZSBwcm9wZXJ0aWVzIGhhdmUgdG8gYmUgbGF6eSBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gbG9hZCBhbnkKICAgICMgbWV0YWRhdGEgdW50aWwvdW5sZXNzIGl0J3MgYWN0dWFsbHkgbmVlZGVkLiAgKGkuZS4sIHNvbWUgZGlzdHJpYnV0aW9ucwogICAgIyBtYXkgbm90IGtub3cgdGhlaXIgbmFtZSBvciB2ZXJzaW9uIHdpdGhvdXQgbG9hZGluZyBQS0ctSU5GTykKCiAgICBAcHJvcGVydHkKICAgIGRlZiBrZXkoc2VsZik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc2VsZi5fa2V5CiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICBzZWxmLl9rZXkgPSBrZXkgPSBzZWxmLnByb2plY3RfbmFtZS5sb3dlcigpCiAgICAgICAgICAgIHJldHVybiBrZXkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBwYXJzZWRfdmVyc2lvbihzZWxmKToKICAgICAgICBpZiBub3QgaGFzYXR0cihzZWxmLCAiX3BhcnNlZF92ZXJzaW9uIik6CiAgICAgICAgICAgIHNlbGYuX3BhcnNlZF92ZXJzaW9uID0gcGFyc2VfdmVyc2lvbihzZWxmLnZlcnNpb24pCgogICAgICAgIHJldHVybiBzZWxmLl9wYXJzZWRfdmVyc2lvbgoKICAgIGRlZiBfd2Fybl9sZWdhY3lfdmVyc2lvbihzZWxmKToKICAgICAgICBMViA9IHBhY2thZ2luZy52ZXJzaW9uLkxlZ2FjeVZlcnNpb24KICAgICAgICBpc19sZWdhY3kgPSBpc2luc3RhbmNlKHNlbGYuX3BhcnNlZF92ZXJzaW9uLCBMVikKICAgICAgICBpZiBub3QgaXNfbGVnYWN5OgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgIyBXaGlsZSBhbiBlbXB0eSB2ZXJzaW9uIGlzIHRlY2huaWNhbGx5IGEgbGVnYWN5IHZlcnNpb24gYW5kCiAgICAgICAgIyBpcyBub3QgYSB2YWxpZCBQRVAgNDQwIHZlcnNpb24sIGl0J3MgYWxzbyB1bmxpa2VseSB0bwogICAgICAgICMgYWN0dWFsbHkgY29tZSBmcm9tIHNvbWVvbmUgYW5kIGluc3RlYWQgaXQgaXMgbW9yZSBsaWtlbHkgdGhhdAogICAgICAgICMgaXQgY29tZXMgZnJvbSBzZXR1cHRvb2xzIGF0dGVtcHRpbmcgdG8gcGFyc2UgYSBmaWxlbmFtZSBhbmQKICAgICAgICAjIGluY2x1ZGluZyBpdCBpbiB0aGUgbGlzdC4gU28gZm9yIHRoYXQgd2UnbGwgZ2F0ZSB0aGlzIHdhcm5pbmcKICAgICAgICAjIG9uIGlmIHRoZSB2ZXJzaW9uIGlzIGFueXRoaW5nIGF0IGFsbCBvciBub3QuCiAgICAgICAgaWYgbm90IHNlbGYudmVyc2lvbjoKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIHRtcGwgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiCiAgICAgICAgICAgICd7cHJvamVjdF9uYW1lfSAoe3ZlcnNpb259KScgaXMgYmVpbmcgcGFyc2VkIGFzIGEgbGVnYWN5LAogICAgICAgICAgICBub24gUEVQIDQ0MCwKICAgICAgICAgICAgdmVyc2lvbi4gWW91IG1heSBmaW5kIG9kZCBiZWhhdmlvciBhbmQgc29ydCBvcmRlci4KICAgICAgICAgICAgSW4gcGFydGljdWxhciBpdCB3aWxsIGJlIHNvcnRlZCBhcyBsZXNzIHRoYW4gMC4wLiBJdAogICAgICAgICAgICBpcyByZWNvbW1lbmRlZCB0byBtaWdyYXRlIHRvIFBFUCA0NDAgY29tcGF0aWJsZQogICAgICAgICAgICB2ZXJzaW9ucy4KICAgICAgICAgICAgIiIiKS5zdHJpcCgpLnJlcGxhY2UoJ1xuJywgJyAnKQoKICAgICAgICB3YXJuaW5ncy53YXJuKHRtcGwuZm9ybWF0KCoqdmFycyhzZWxmKSksIFBFUDQ0MFdhcm5pbmcpCgogICAgQHByb3BlcnR5CiAgICBkZWYgdmVyc2lvbihzZWxmKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl92ZXJzaW9uCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICB2ZXJzaW9uID0gX3ZlcnNpb25fZnJvbV9maWxlKHNlbGYuX2dldF9tZXRhZGF0YShzZWxmLlBLR19JTkZPKSkKICAgICAgICAgICAgaWYgdmVyc2lvbiBpcyBOb25lOgogICAgICAgICAgICAgICAgdG1wbCA9ICJNaXNzaW5nICdWZXJzaW9uOicgaGVhZGVyIGFuZC9vciAlcyBmaWxlIgogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcih0bXBsICUgc2VsZi5QS0dfSU5GTywgc2VsZikKICAgICAgICAgICAgcmV0dXJuIHZlcnNpb24KCiAgICBAcHJvcGVydHkKICAgIGRlZiBfZGVwX21hcChzZWxmKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9fZGVwX21hcAogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgZG0gPSBzZWxmLl9fZGVwX21hcCA9IHtOb25lOiBbXX0KICAgICAgICAgICAgZm9yIG5hbWUgaW4gJ3JlcXVpcmVzLnR4dCcsICdkZXBlbmRzLnR4dCc6CiAgICAgICAgICAgICAgICBmb3IgZXh0cmEsIHJlcXMgaW4gc3BsaXRfc2VjdGlvbnMoc2VsZi5fZ2V0X21ldGFkYXRhKG5hbWUpKToKICAgICAgICAgICAgICAgICAgICBpZiBleHRyYToKICAgICAgICAgICAgICAgICAgICAgICAgaWYgJzonIGluIGV4dHJhOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmEsIG1hcmtlciA9IGV4dHJhLnNwbGl0KCc6JywgMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGludmFsaWRfbWFya2VyKG1hcmtlcik6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBYWFggd2FybgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXMgPSBbXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxpZiBub3QgZXZhbHVhdGVfbWFya2VyKG1hcmtlcik6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxcyA9IFtdCiAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhID0gc2FmZV9leHRyYShleHRyYSkgb3IgTm9uZQogICAgICAgICAgICAgICAgICAgIGRtLnNldGRlZmF1bHQoZXh0cmEsIFtdKS5leHRlbmQocGFyc2VfcmVxdWlyZW1lbnRzKHJlcXMpKQogICAgICAgICAgICByZXR1cm4gZG0KCiAgICBkZWYgcmVxdWlyZXMoc2VsZiwgZXh0cmFzPSgpKToKICAgICAgICAiIiJMaXN0IG9mIFJlcXVpcmVtZW50cyBuZWVkZWQgZm9yIHRoaXMgZGlzdHJvIGlmIGBleHRyYXNgIGFyZSB1c2VkIiIiCiAgICAgICAgZG0gPSBzZWxmLl9kZXBfbWFwCiAgICAgICAgZGVwcyA9IFtdCiAgICAgICAgZGVwcy5leHRlbmQoZG0uZ2V0KE5vbmUsICgpKSkKICAgICAgICBmb3IgZXh0IGluIGV4dHJhczoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgZGVwcy5leHRlbmQoZG1bc2FmZV9leHRyYShleHQpXSkKICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICAgICAgcmFpc2UgVW5rbm93bkV4dHJhKAogICAgICAgICAgICAgICAgICAgICIlcyBoYXMgbm8gc3VjaCBleHRyYSBmZWF0dXJlICVyIiAlIChzZWxmLCBleHQpCiAgICAgICAgICAgICAgICApCiAgICAgICAgcmV0dXJuIGRlcHMKCiAgICBkZWYgX2dldF9tZXRhZGF0YShzZWxmLCBuYW1lKToKICAgICAgICBpZiBzZWxmLmhhc19tZXRhZGF0YShuYW1lKToKICAgICAgICAgICAgZm9yIGxpbmUgaW4gc2VsZi5nZXRfbWV0YWRhdGFfbGluZXMobmFtZSk6CiAgICAgICAgICAgICAgICB5aWVsZCBsaW5lCgogICAgZGVmIGFjdGl2YXRlKHNlbGYsIHBhdGg9Tm9uZSwgcmVwbGFjZT1GYWxzZSk6CiAgICAgICAgIiIiRW5zdXJlIGRpc3RyaWJ1dGlvbiBpcyBpbXBvcnRhYmxlIG9uIGBwYXRoYCAoZGVmYXVsdD1zeXMucGF0aCkiIiIKICAgICAgICBpZiBwYXRoIGlzIE5vbmU6CiAgICAgICAgICAgIHBhdGggPSBzeXMucGF0aAogICAgICAgIHNlbGYuaW5zZXJ0X29uKHBhdGgsIHJlcGxhY2U9cmVwbGFjZSkKICAgICAgICBpZiBwYXRoIGlzIHN5cy5wYXRoOgogICAgICAgICAgICBmaXh1cF9uYW1lc3BhY2VfcGFja2FnZXMoc2VsZi5sb2NhdGlvbikKICAgICAgICAgICAgZm9yIHBrZyBpbiBzZWxmLl9nZXRfbWV0YWRhdGEoJ25hbWVzcGFjZV9wYWNrYWdlcy50eHQnKToKICAgICAgICAgICAgICAgIGlmIHBrZyBpbiBzeXMubW9kdWxlczoKICAgICAgICAgICAgICAgICAgICBkZWNsYXJlX25hbWVzcGFjZShwa2cpCgogICAgZGVmIGVnZ19uYW1lKHNlbGYpOgogICAgICAgICIiIlJldHVybiB3aGF0IHRoaXMgZGlzdHJpYnV0aW9uJ3Mgc3RhbmRhcmQgLmVnZyBmaWxlbmFtZSBzaG91bGQgYmUiIiIKICAgICAgICBmaWxlbmFtZSA9ICIlcy0lcy1weSVzIiAlICgKICAgICAgICAgICAgdG9fZmlsZW5hbWUoc2VsZi5wcm9qZWN0X25hbWUpLCB0b19maWxlbmFtZShzZWxmLnZlcnNpb24pLAogICAgICAgICAgICBzZWxmLnB5X3ZlcnNpb24gb3IgUFlfTUFKT1IKICAgICAgICApCgogICAgICAgIGlmIHNlbGYucGxhdGZvcm06CiAgICAgICAgICAgIGZpbGVuYW1lICs9ICctJyArIHNlbGYucGxhdGZvcm0KICAgICAgICByZXR1cm4gZmlsZW5hbWUKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgaWYgc2VsZi5sb2NhdGlvbjoKICAgICAgICAgICAgcmV0dXJuICIlcyAoJXMpIiAlIChzZWxmLCBzZWxmLmxvY2F0aW9uKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBzdHIoc2VsZikKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHZlcnNpb24gPSBnZXRhdHRyKHNlbGYsICd2ZXJzaW9uJywgTm9uZSkKICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgdmVyc2lvbiA9IE5vbmUKICAgICAgICB2ZXJzaW9uID0gdmVyc2lvbiBvciAiW3Vua25vd24gdmVyc2lvbl0iCiAgICAgICAgcmV0dXJuICIlcyAlcyIgJSAoc2VsZi5wcm9qZWN0X25hbWUsIHZlcnNpb24pCgogICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIGF0dHIpOgogICAgICAgICIiIkRlbGVnYXRlIGFsbCB1bnJlY29nbml6ZWQgcHVibGljIGF0dHJpYnV0ZXMgdG8gLm1ldGFkYXRhIHByb3ZpZGVyIiIiCiAgICAgICAgaWYgYXR0ci5zdGFydHN3aXRoKCdfJyk6CiAgICAgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yKGF0dHIpCiAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZi5fcHJvdmlkZXIsIGF0dHIpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgZnJvbV9maWxlbmFtZShjbHMsIGZpbGVuYW1lLCBtZXRhZGF0YT1Ob25lLCAqKmt3KToKICAgICAgICByZXR1cm4gY2xzLmZyb21fbG9jYXRpb24oCiAgICAgICAgICAgIF9ub3JtYWxpemVfY2FjaGVkKGZpbGVuYW1lKSwgb3MucGF0aC5iYXNlbmFtZShmaWxlbmFtZSksIG1ldGFkYXRhLAogICAgICAgICAgICAqKmt3CiAgICAgICAgKQoKICAgIGRlZiBhc19yZXF1aXJlbWVudChzZWxmKToKICAgICAgICAiIiJSZXR1cm4gYSBgYFJlcXVpcmVtZW50YGAgdGhhdCBtYXRjaGVzIHRoaXMgZGlzdHJpYnV0aW9uIGV4YWN0bHkiIiIKICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYucGFyc2VkX3ZlcnNpb24sIHBhY2thZ2luZy52ZXJzaW9uLlZlcnNpb24pOgogICAgICAgICAgICBzcGVjID0gIiVzPT0lcyIgJSAoc2VsZi5wcm9qZWN0X25hbWUsIHNlbGYucGFyc2VkX3ZlcnNpb24pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc3BlYyA9ICIlcz09PSVzIiAlIChzZWxmLnByb2plY3RfbmFtZSwgc2VsZi5wYXJzZWRfdmVyc2lvbikKCiAgICAgICAgcmV0dXJuIFJlcXVpcmVtZW50LnBhcnNlKHNwZWMpCgogICAgZGVmIGxvYWRfZW50cnlfcG9pbnQoc2VsZiwgZ3JvdXAsIG5hbWUpOgogICAgICAgICIiIlJldHVybiB0aGUgYG5hbWVgIGVudHJ5IHBvaW50IG9mIGBncm91cGAgb3IgcmFpc2UgSW1wb3J0RXJyb3IiIiIKICAgICAgICBlcCA9IHNlbGYuZ2V0X2VudHJ5X2luZm8oZ3JvdXAsIG5hbWUpCiAgICAgICAgaWYgZXAgaXMgTm9uZToKICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IoIkVudHJ5IHBvaW50ICVyIG5vdCBmb3VuZCIgJSAoKGdyb3VwLCBuYW1lKSwpKQogICAgICAgIHJldHVybiBlcC5sb2FkKCkKCiAgICBkZWYgZ2V0X2VudHJ5X21hcChzZWxmLCBncm91cD1Ob25lKToKICAgICAgICAiIiJSZXR1cm4gdGhlIGVudHJ5IHBvaW50IG1hcCBmb3IgYGdyb3VwYCwgb3IgdGhlIGZ1bGwgZW50cnkgbWFwIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICBlcF9tYXAgPSBzZWxmLl9lcF9tYXAKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIGVwX21hcCA9IHNlbGYuX2VwX21hcCA9IEVudHJ5UG9pbnQucGFyc2VfbWFwKAogICAgICAgICAgICAgICAgc2VsZi5fZ2V0X21ldGFkYXRhKCdlbnRyeV9wb2ludHMudHh0JyksIHNlbGYKICAgICAgICAgICAgKQogICAgICAgIGlmIGdyb3VwIGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4gZXBfbWFwLmdldChncm91cCwge30pCiAgICAgICAgcmV0dXJuIGVwX21hcAoKICAgIGRlZiBnZXRfZW50cnlfaW5mbyhzZWxmLCBncm91cCwgbmFtZSk6CiAgICAgICAgIiIiUmV0dXJuIHRoZSBFbnRyeVBvaW50IG9iamVjdCBmb3IgYGdyb3VwYCtgbmFtZWAsIG9yIGBgTm9uZWBgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuZ2V0X2VudHJ5X21hcChncm91cCkuZ2V0KG5hbWUpCgogICAgZGVmIGluc2VydF9vbihzZWxmLCBwYXRoLCBsb2M9Tm9uZSwgcmVwbGFjZT1GYWxzZSk6CiAgICAgICAgIiIiRW5zdXJlIHNlbGYubG9jYXRpb24gaXMgb24gcGF0aAoKICAgICAgICBJZiByZXBsYWNlPUZhbHNlIChkZWZhdWx0KToKICAgICAgICAgICAgLSBJZiBsb2NhdGlvbiBpcyBhbHJlYWR5IGluIHBhdGggYW55d2hlcmUsIGRvIG5vdGhpbmcuCiAgICAgICAgICAgIC0gRWxzZToKICAgICAgICAgICAgICAtIElmIGl0J3MgYW4gZWdnIGFuZCBpdHMgcGFyZW50IGRpcmVjdG9yeSBpcyBvbiBwYXRoLAogICAgICAgICAgICAgICAgaW5zZXJ0IGp1c3QgYWhlYWQgb2YgdGhlIHBhcmVudC4KICAgICAgICAgICAgICAtIEVsc2U6IGFkZCB0byB0aGUgZW5kIG9mIHBhdGguCiAgICAgICAgSWYgcmVwbGFjZT1UcnVlOgogICAgICAgICAgICAtIElmIGxvY2F0aW9uIGlzIGFscmVhZHkgb24gcGF0aCBhbnl3aGVyZSAobm90IGVnZ3MpCiAgICAgICAgICAgICAgb3IgaGlnaGVyIHByaW9yaXR5IHRoYW4gaXRzIHBhcmVudCAoZWdncykKICAgICAgICAgICAgICBkbyBub3RoaW5nLgogICAgICAgICAgICAtIEVsc2U6CiAgICAgICAgICAgICAgLSBJZiBpdCdzIGFuIGVnZyBhbmQgaXRzIHBhcmVudCBkaXJlY3RvcnkgaXMgb24gcGF0aCwKICAgICAgICAgICAgICAgIGluc2VydCBqdXN0IGFoZWFkIG9mIHRoZSBwYXJlbnQsCiAgICAgICAgICAgICAgICByZW1vdmluZyBhbnkgbG93ZXItcHJpb3JpdHkgZW50cmllcy4KICAgICAgICAgICAgICAtIEVsc2U6IGFkZCBpdCB0byB0aGUgZnJvbnQgb2YgcGF0aC4KICAgICAgICAiIiIKCiAgICAgICAgbG9jID0gbG9jIG9yIHNlbGYubG9jYXRpb24KICAgICAgICBpZiBub3QgbG9jOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgbmxvYyA9IF9ub3JtYWxpemVfY2FjaGVkKGxvYykKICAgICAgICBiZGlyID0gb3MucGF0aC5kaXJuYW1lKG5sb2MpCiAgICAgICAgbnBhdGggPSBbKHAgYW5kIF9ub3JtYWxpemVfY2FjaGVkKHApIG9yIHApIGZvciBwIGluIHBhdGhdCgogICAgICAgIGZvciBwLCBpdGVtIGluIGVudW1lcmF0ZShucGF0aCk6CiAgICAgICAgICAgIGlmIGl0ZW0gPT0gbmxvYzoKICAgICAgICAgICAgICAgIGlmIHJlcGxhY2U6CiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgIyBkb24ndCBtb2RpZnkgcGF0aCAoZXZlbiByZW1vdmluZyBkdXBsaWNhdGVzKSBpZiBmb3VuZCBhbmQgbm90IHJlcGxhY2UKICAgICAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgZWxpZiBpdGVtID09IGJkaXIgYW5kIHNlbGYucHJlY2VkZW5jZSA9PSBFR0dfRElTVDoKICAgICAgICAgICAgICAgICMgaWYgaXQncyBhbiAuZWdnLCBnaXZlIGl0IHByZWNlZGVuY2Ugb3ZlciBpdHMgZGlyZWN0b3J5CiAgICAgICAgICAgICAgICAjIFVOTEVTUyBpdCdzIGFscmVhZHkgYmVlbiBhZGRlZCB0byBzeXMucGF0aCBhbmQgcmVwbGFjZT1GYWxzZQogICAgICAgICAgICAgICAgaWYgKG5vdCByZXBsYWNlKSBhbmQgbmxvYyBpbiBucGF0aFtwOl06CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICAgICBpZiBwYXRoIGlzIHN5cy5wYXRoOgogICAgICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tfdmVyc2lvbl9jb25mbGljdCgpCiAgICAgICAgICAgICAgICBwYXRoLmluc2VydChwLCBsb2MpCiAgICAgICAgICAgICAgICBucGF0aC5pbnNlcnQocCwgbmxvYykKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaWYgcGF0aCBpcyBzeXMucGF0aDoKICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tfdmVyc2lvbl9jb25mbGljdCgpCiAgICAgICAgICAgIGlmIHJlcGxhY2U6CiAgICAgICAgICAgICAgICBwYXRoLmluc2VydCgwLCBsb2MpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBwYXRoLmFwcGVuZChsb2MpCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICAjIHAgaXMgdGhlIHNwb3Qgd2hlcmUgd2UgZm91bmQgb3IgaW5zZXJ0ZWQgbG9jOyBub3cgcmVtb3ZlIGR1cGxpY2F0ZXMKICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBucCA9IG5wYXRoLmluZGV4KG5sb2MsIHAgKyAxKQogICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBkZWwgbnBhdGhbbnBdLCBwYXRoW25wXQogICAgICAgICAgICAgICAgIyBoYSEKICAgICAgICAgICAgICAgIHAgPSBucAoKICAgICAgICByZXR1cm4KCiAgICBkZWYgY2hlY2tfdmVyc2lvbl9jb25mbGljdChzZWxmKToKICAgICAgICBpZiBzZWxmLmtleSA9PSAnc2V0dXB0b29scyc6CiAgICAgICAgICAgICMgaWdub3JlIHRoZSBpbmV2aXRhYmxlIHNldHVwdG9vbHMgc2VsZi1jb25mbGljdHMgIDooCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBuc3AgPSBkaWN0LmZyb21rZXlzKHNlbGYuX2dldF9tZXRhZGF0YSgnbmFtZXNwYWNlX3BhY2thZ2VzLnR4dCcpKQogICAgICAgIGxvYyA9IG5vcm1hbGl6ZV9wYXRoKHNlbGYubG9jYXRpb24pCiAgICAgICAgZm9yIG1vZG5hbWUgaW4gc2VsZi5fZ2V0X21ldGFkYXRhKCd0b3BfbGV2ZWwudHh0Jyk6CiAgICAgICAgICAgIGlmIChtb2RuYW1lIG5vdCBpbiBzeXMubW9kdWxlcyBvciBtb2RuYW1lIGluIG5zcAogICAgICAgICAgICAgICAgICAgIG9yIG1vZG5hbWUgaW4gX25hbWVzcGFjZV9wYWNrYWdlcyk6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBpZiBtb2RuYW1lIGluICgncGtnX3Jlc291cmNlcycsICdzZXR1cHRvb2xzJywgJ3NpdGUnKToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGZuID0gZ2V0YXR0cihzeXMubW9kdWxlc1ttb2RuYW1lXSwgJ19fZmlsZV9fJywgTm9uZSkKICAgICAgICAgICAgaWYgZm4gYW5kIChub3JtYWxpemVfcGF0aChmbikuc3RhcnRzd2l0aChsb2MpIG9yCiAgICAgICAgICAgICAgICAgICAgICAgZm4uc3RhcnRzd2l0aChzZWxmLmxvY2F0aW9uKSk6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBpc3N1ZV93YXJuaW5nKAogICAgICAgICAgICAgICAgIk1vZHVsZSAlcyB3YXMgYWxyZWFkeSBpbXBvcnRlZCBmcm9tICVzLCBidXQgJXMgaXMgYmVpbmcgYWRkZWQiCiAgICAgICAgICAgICAgICAiIHRvIHN5cy5wYXRoIiAlIChtb2RuYW1lLCBmbiwgc2VsZi5sb2NhdGlvbiksCiAgICAgICAgICAgICkKCiAgICBkZWYgaGFzX3ZlcnNpb24oc2VsZik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLnZlcnNpb24KICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgaXNzdWVfd2FybmluZygiVW5idWlsdCBlZ2cgZm9yICIgKyByZXByKHNlbGYpKQogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBjbG9uZShzZWxmLCAqKmt3KToKICAgICAgICAiIiJDb3B5IHRoaXMgZGlzdHJpYnV0aW9uLCBzdWJzdGl0dXRpbmcgaW4gYW55IGNoYW5nZWQga2V5d29yZCBhcmdzIiIiCiAgICAgICAgbmFtZXMgPSAncHJvamVjdF9uYW1lIHZlcnNpb24gcHlfdmVyc2lvbiBwbGF0Zm9ybSBsb2NhdGlvbiBwcmVjZWRlbmNlJwogICAgICAgIGZvciBhdHRyIGluIG5hbWVzLnNwbGl0KCk6CiAgICAgICAgICAgIGt3LnNldGRlZmF1bHQoYXR0ciwgZ2V0YXR0cihzZWxmLCBhdHRyLCBOb25lKSkKICAgICAgICBrdy5zZXRkZWZhdWx0KCdtZXRhZGF0YScsIHNlbGYuX3Byb3ZpZGVyKQogICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXygqKmt3KQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGV4dHJhcyhzZWxmKToKICAgICAgICByZXR1cm4gW2RlcCBmb3IgZGVwIGluIHNlbGYuX2RlcF9tYXAgaWYgZGVwXQoKCmNsYXNzIEVnZ0luZm9EaXN0cmlidXRpb24oRGlzdHJpYnV0aW9uKToKICAgIGRlZiBfcmVsb2FkX3ZlcnNpb24oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUGFja2FnZXMgaW5zdGFsbGVkIGJ5IGRpc3R1dGlscyAoZS5nLiBudW1weSBvciBzY2lweSksCiAgICAgICAgd2hpY2ggdXNlcyBhbiBvbGQgc2FmZV92ZXJzaW9uLCBhbmQgc28KICAgICAgICB0aGVpciB2ZXJzaW9uIG51bWJlcnMgY2FuIGdldCBtYW5nbGVkIHdoZW4KICAgICAgICBjb252ZXJ0ZWQgdG8gZmlsZW5hbWVzIChlLmcuLCAxLjExLjAuZGV2MCsyMzI5ZWFlIHRvCiAgICAgICAgMS4xMS4wLmRldjBfMjMyOWVhZSkuIFRoZXNlIGRpc3RyaWJ1dGlvbnMgd2lsbCBub3QgYmUKICAgICAgICBwYXJzZWQgcHJvcGVybHkKICAgICAgICBkb3duc3RyZWFtIGJ5IERpc3RyaWJ1dGlvbiBhbmQgc2FmZV92ZXJzaW9uLCBzbwogICAgICAgIHRha2UgYW4gZXh0cmEgc3RlcCBhbmQgdHJ5IHRvIGdldCB0aGUgdmVyc2lvbiBudW1iZXIgZnJvbQogICAgICAgIHRoZSBtZXRhZGF0YSBmaWxlIGl0c2VsZiBpbnN0ZWFkIG9mIHRoZSBmaWxlbmFtZS4KICAgICAgICAiIiIKICAgICAgICBtZF92ZXJzaW9uID0gX3ZlcnNpb25fZnJvbV9maWxlKHNlbGYuX2dldF9tZXRhZGF0YShzZWxmLlBLR19JTkZPKSkKICAgICAgICBpZiBtZF92ZXJzaW9uOgogICAgICAgICAgICBzZWxmLl92ZXJzaW9uID0gbWRfdmVyc2lvbgogICAgICAgIHJldHVybiBzZWxmCgoKY2xhc3MgRGlzdEluZm9EaXN0cmlidXRpb24oRGlzdHJpYnV0aW9uKToKICAgICIiIldyYXAgYW4gYWN0dWFsIG9yIHBvdGVudGlhbCBzeXMucGF0aCBlbnRyeSB3L21ldGFkYXRhLCAuZGlzdC1pbmZvIHN0eWxlIiIiCiAgICBQS0dfSU5GTyA9ICdNRVRBREFUQScKICAgIEVRRVEgPSByZS5jb21waWxlKHIiKFtcKCxdKVxzKihcZC4qPylccyooWyxcKV0pIikKCiAgICBAcHJvcGVydHkKICAgIGRlZiBfcGFyc2VkX3BrZ19pbmZvKHNlbGYpOgogICAgICAgICIiIlBhcnNlIGFuZCBjYWNoZSBtZXRhZGF0YSIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3BrZ19pbmZvCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICBtZXRhZGF0YSA9IHNlbGYuZ2V0X21ldGFkYXRhKHNlbGYuUEtHX0lORk8pCiAgICAgICAgICAgIHNlbGYuX3BrZ19pbmZvID0gZW1haWwucGFyc2VyLlBhcnNlcigpLnBhcnNlc3RyKG1ldGFkYXRhKQogICAgICAgICAgICByZXR1cm4gc2VsZi5fcGtnX2luZm8KCiAgICBAcHJvcGVydHkKICAgIGRlZiBfZGVwX21hcChzZWxmKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9fZGVwX21hcAogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgc2VsZi5fX2RlcF9tYXAgPSBzZWxmLl9jb21wdXRlX2RlcGVuZGVuY2llcygpCiAgICAgICAgICAgIHJldHVybiBzZWxmLl9fZGVwX21hcAoKICAgIGRlZiBfY29tcHV0ZV9kZXBlbmRlbmNpZXMoc2VsZik6CiAgICAgICAgIiIiUmVjb21wdXRlIHRoaXMgZGlzdHJpYnV0aW9uJ3MgZGVwZW5kZW5jaWVzLiIiIgogICAgICAgIGRtID0gc2VsZi5fX2RlcF9tYXAgPSB7Tm9uZTogW119CgogICAgICAgIHJlcXMgPSBbXQogICAgICAgICMgSW5jbHVkaW5nIGFueSBjb25kaXRpb24gZXhwcmVzc2lvbnMKICAgICAgICBmb3IgcmVxIGluIHNlbGYuX3BhcnNlZF9wa2dfaW5mby5nZXRfYWxsKCdSZXF1aXJlcy1EaXN0Jykgb3IgW106CiAgICAgICAgICAgIHJlcXMuZXh0ZW5kKHBhcnNlX3JlcXVpcmVtZW50cyhyZXEpKQoKICAgICAgICBkZWYgcmVxc19mb3JfZXh0cmEoZXh0cmEpOgogICAgICAgICAgICBmb3IgcmVxIGluIHJlcXM6CiAgICAgICAgICAgICAgICBpZiBub3QgcmVxLm1hcmtlciBvciByZXEubWFya2VyLmV2YWx1YXRlKHsnZXh0cmEnOiBleHRyYX0pOgogICAgICAgICAgICAgICAgICAgIHlpZWxkIHJlcQoKICAgICAgICBjb21tb24gPSBmcm96ZW5zZXQocmVxc19mb3JfZXh0cmEoTm9uZSkpCiAgICAgICAgZG1bTm9uZV0uZXh0ZW5kKGNvbW1vbikKCiAgICAgICAgZm9yIGV4dHJhIGluIHNlbGYuX3BhcnNlZF9wa2dfaW5mby5nZXRfYWxsKCdQcm92aWRlcy1FeHRyYScpIG9yIFtdOgogICAgICAgICAgICBzX2V4dHJhID0gc2FmZV9leHRyYShleHRyYS5zdHJpcCgpKQogICAgICAgICAgICBkbVtzX2V4dHJhXSA9IGxpc3QoZnJvemVuc2V0KHJlcXNfZm9yX2V4dHJhKGV4dHJhKSkgLSBjb21tb24pCgogICAgICAgIHJldHVybiBkbQoKCl9kaXN0cmlidXRpb25JbXBsID0gewogICAgJy5lZ2cnOiBEaXN0cmlidXRpb24sCiAgICAnLmVnZy1pbmZvJzogRWdnSW5mb0Rpc3RyaWJ1dGlvbiwKICAgICcuZGlzdC1pbmZvJzogRGlzdEluZm9EaXN0cmlidXRpb24sCiAgICB9CgoKZGVmIGlzc3VlX3dhcm5pbmcoKmFyZ3MsICoqa3cpOgogICAgbGV2ZWwgPSAxCiAgICBnID0gZ2xvYmFscygpCiAgICB0cnk6CiAgICAgICAgIyBmaW5kIHRoZSBmaXJzdCBzdGFjayBmcmFtZSB0aGF0IGlzICpub3QqIGNvZGUgaW4KICAgICAgICAjIHRoZSBwa2dfcmVzb3VyY2VzIG1vZHVsZSwgdG8gdXNlIGZvciB0aGUgd2FybmluZwogICAgICAgIHdoaWxlIHN5cy5fZ2V0ZnJhbWUobGV2ZWwpLmZfZ2xvYmFscyBpcyBnOgogICAgICAgICAgICBsZXZlbCArPSAxCiAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICBwYXNzCiAgICB3YXJuaW5ncy53YXJuKHN0YWNrbGV2ZWw9bGV2ZWwgKyAxLCAqYXJncywgKiprdykKCgpjbGFzcyBSZXF1aXJlbWVudFBhcnNlRXJyb3IoVmFsdWVFcnJvcik6CiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gJyAnLmpvaW4oc2VsZi5hcmdzKQoKCmRlZiBwYXJzZV9yZXF1aXJlbWVudHMoc3Rycyk6CiAgICAiIiJZaWVsZCBgYFJlcXVpcmVtZW50YGAgb2JqZWN0cyBmb3IgZWFjaCBzcGVjaWZpY2F0aW9uIGluIGBzdHJzYAoKICAgIGBzdHJzYCBtdXN0IGJlIGEgc3RyaW5nLCBvciBhIChwb3NzaWJseS1uZXN0ZWQpIGl0ZXJhYmxlIHRoZXJlb2YuCiAgICAiIiIKICAgICMgY3JlYXRlIGEgc3RlcHBhYmxlIGl0ZXJhdG9yLCBzbyB3ZSBjYW4gaGFuZGxlIFwtY29udGludWF0aW9ucwogICAgbGluZXMgPSBpdGVyKHlpZWxkX2xpbmVzKHN0cnMpKQoKICAgIGZvciBsaW5lIGluIGxpbmVzOgogICAgICAgICMgRHJvcCBjb21tZW50cyAtLSBhIGhhc2ggd2l0aG91dCBhIHNwYWNlIG1heSBiZSBpbiBhIFVSTC4KICAgICAgICBpZiAnICMnIGluIGxpbmU6CiAgICAgICAgICAgIGxpbmUgPSBsaW5lWzpsaW5lLmZpbmQoJyAjJyldCiAgICAgICAgIyBJZiB0aGVyZSBpcyBhIGxpbmUgY29udGludWF0aW9uLCBkcm9wIGl0LCBhbmQgYXBwZW5kIHRoZSBuZXh0IGxpbmUuCiAgICAgICAgaWYgbGluZS5lbmRzd2l0aCgnXFwnKToKICAgICAgICAgICAgbGluZSA9IGxpbmVbOi0yXS5zdHJpcCgpCiAgICAgICAgICAgIGxpbmUgKz0gbmV4dChsaW5lcykKICAgICAgICB5aWVsZCBSZXF1aXJlbWVudChsaW5lKQoKCmNsYXNzIFJlcXVpcmVtZW50KHBhY2thZ2luZy5yZXF1aXJlbWVudHMuUmVxdWlyZW1lbnQpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHJlcXVpcmVtZW50X3N0cmluZyk6CiAgICAgICAgIiIiRE8gTk9UIENBTEwgVEhJUyBVTkRPQ1VNRU5URUQgTUVUSE9EOyB1c2UgUmVxdWlyZW1lbnQucGFyc2UoKSEiIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIHN1cGVyKFJlcXVpcmVtZW50LCBzZWxmKS5fX2luaXRfXyhyZXF1aXJlbWVudF9zdHJpbmcpCiAgICAgICAgZXhjZXB0IHBhY2thZ2luZy5yZXF1aXJlbWVudHMuSW52YWxpZFJlcXVpcmVtZW50IGFzIGU6CiAgICAgICAgICAgIHJhaXNlIFJlcXVpcmVtZW50UGFyc2VFcnJvcihzdHIoZSkpCiAgICAgICAgc2VsZi51bnNhZmVfbmFtZSA9IHNlbGYubmFtZQogICAgICAgIHByb2plY3RfbmFtZSA9IHNhZmVfbmFtZShzZWxmLm5hbWUpCiAgICAgICAgc2VsZi5wcm9qZWN0X25hbWUsIHNlbGYua2V5ID0gcHJvamVjdF9uYW1lLCBwcm9qZWN0X25hbWUubG93ZXIoKQogICAgICAgIHNlbGYuc3BlY3MgPSBbCiAgICAgICAgICAgIChzcGVjLm9wZXJhdG9yLCBzcGVjLnZlcnNpb24pIGZvciBzcGVjIGluIHNlbGYuc3BlY2lmaWVyXQogICAgICAgIHNlbGYuZXh0cmFzID0gdHVwbGUobWFwKHNhZmVfZXh0cmEsIHNlbGYuZXh0cmFzKSkKICAgICAgICBzZWxmLmhhc2hDbXAgPSAoCiAgICAgICAgICAgIHNlbGYua2V5LAogICAgICAgICAgICBzZWxmLnNwZWNpZmllciwKICAgICAgICAgICAgZnJvemVuc2V0KHNlbGYuZXh0cmFzKSwKICAgICAgICAgICAgc3RyKHNlbGYubWFya2VyKSBpZiBzZWxmLm1hcmtlciBlbHNlIE5vbmUsCiAgICAgICAgKQogICAgICAgIHNlbGYuX19oYXNoID0gaGFzaChzZWxmLmhhc2hDbXApCgogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgaXNpbnN0YW5jZShvdGhlciwgUmVxdWlyZW1lbnQpIGFuZAogICAgICAgICAgICBzZWxmLmhhc2hDbXAgPT0gb3RoZXIuaGFzaENtcAogICAgICAgICkKCiAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gbm90IHNlbGYgPT0gb3RoZXIKCiAgICBkZWYgX19jb250YWluc19fKHNlbGYsIGl0ZW0pOgogICAgICAgIGlmIGlzaW5zdGFuY2UoaXRlbSwgRGlzdHJpYnV0aW9uKToKICAgICAgICAgICAgaWYgaXRlbS5rZXkgIT0gc2VsZi5rZXk6CiAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgICAgIGl0ZW0gPSBpdGVtLnZlcnNpb24KCiAgICAgICAgIyBBbGxvdyBwcmVyZWxlYXNlcyBhbHdheXMgaW4gb3JkZXIgdG8gbWF0Y2ggdGhlIHByZXZpb3VzIGJlaGF2aW9yIG9mCiAgICAgICAgIyB0aGlzIG1ldGhvZC4gSW4gdGhlIGZ1dHVyZSB0aGlzIHNob3VsZCBiZSBzbWFydGVyIGFuZCBmb2xsb3cgUEVQIDQ0MAogICAgICAgICMgbW9yZSBhY2N1cmF0ZWx5LgogICAgICAgIHJldHVybiBzZWxmLnNwZWNpZmllci5jb250YWlucyhpdGVtLCBwcmVyZWxlYXNlcz1UcnVlKQoKICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fX2hhc2gKCiAgICBkZWYgX19yZXByX18oc2VsZik6IHJldHVybiAiUmVxdWlyZW1lbnQucGFyc2UoJXIpIiAlIHN0cihzZWxmKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBwYXJzZShzKToKICAgICAgICByZXEsID0gcGFyc2VfcmVxdWlyZW1lbnRzKHMpCiAgICAgICAgcmV0dXJuIHJlcQoKCmRlZiBfZ2V0X21ybyhjbHMpOgogICAgIiIiR2V0IGFuIG1ybyBmb3IgYSB0eXBlIG9yIGNsYXNzaWMgY2xhc3MiIiIKICAgIGlmIG5vdCBpc2luc3RhbmNlKGNscywgdHlwZSk6CgogICAgICAgIGNsYXNzIGNscyhjbHMsIG9iamVjdCk6CiAgICAgICAgICAgIHBhc3MKCiAgICAgICAgcmV0dXJuIGNscy5fX21yb19fWzE6XQogICAgcmV0dXJuIGNscy5fX21yb19fCgoKZGVmIF9maW5kX2FkYXB0ZXIocmVnaXN0cnksIG9iKToKICAgICIiIlJldHVybiBhbiBhZGFwdGVyIGZhY3RvcnkgZm9yIGBvYmAgZnJvbSBgcmVnaXN0cnlgIiIiCiAgICBmb3IgdCBpbiBfZ2V0X21ybyhnZXRhdHRyKG9iLCAnX19jbGFzc19fJywgdHlwZShvYikpKToKICAgICAgICBpZiB0IGluIHJlZ2lzdHJ5OgogICAgICAgICAgICByZXR1cm4gcmVnaXN0cnlbdF0KCgpkZWYgZW5zdXJlX2RpcmVjdG9yeShwYXRoKToKICAgICIiIkVuc3VyZSB0aGF0IHRoZSBwYXJlbnQgZGlyZWN0b3J5IG9mIGBwYXRoYCBleGlzdHMiIiIKICAgIGRpcm5hbWUgPSBvcy5wYXRoLmRpcm5hbWUocGF0aCkKICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKGRpcm5hbWUpOgogICAgICAgIG9zLm1ha2VkaXJzKGRpcm5hbWUpCgoKZGVmIF9ieXBhc3NfZW5zdXJlX2RpcmVjdG9yeShwYXRoKToKICAgICIiIlNhbmRib3gtYnlwYXNzaW5nIHZlcnNpb24gb2YgZW5zdXJlX2RpcmVjdG9yeSgpIiIiCiAgICBpZiBub3QgV1JJVEVfU1VQUE9SVDoKICAgICAgICByYWlzZSBJT0Vycm9yKCcib3MubWtkaXIiIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwbGF0Zm9ybS4nKQogICAgZGlybmFtZSwgZmlsZW5hbWUgPSBzcGxpdChwYXRoKQogICAgaWYgZGlybmFtZSBhbmQgZmlsZW5hbWUgYW5kIG5vdCBpc2RpcihkaXJuYW1lKToKICAgICAgICBfYnlwYXNzX2Vuc3VyZV9kaXJlY3RvcnkoZGlybmFtZSkKICAgICAgICBta2RpcihkaXJuYW1lLCAwbzc1NSkKCgpkZWYgc3BsaXRfc2VjdGlvbnMocyk6CiAgICAiIiJTcGxpdCBhIHN0cmluZyBvciBpdGVyYWJsZSB0aGVyZW9mIGludG8gKHNlY3Rpb24sIGNvbnRlbnQpIHBhaXJzCgogICAgRWFjaCBgYHNlY3Rpb25gYCBpcyBhIHN0cmlwcGVkIHZlcnNpb24gb2YgdGhlIHNlY3Rpb24gaGVhZGVyICgiW3NlY3Rpb25dIikKICAgIGFuZCBlYWNoIGBgY29udGVudGBgIGlzIGEgbGlzdCBvZiBzdHJpcHBlZCBsaW5lcyBleGNsdWRpbmcgYmxhbmsgbGluZXMgYW5kCiAgICBjb21tZW50LW9ubHkgbGluZXMuICBJZiB0aGVyZSBhcmUgYW55IHN1Y2ggbGluZXMgYmVmb3JlIHRoZSBmaXJzdCBzZWN0aW9uCiAgICBoZWFkZXIsIHRoZXkncmUgcmV0dXJuZWQgaW4gYSBmaXJzdCBgYHNlY3Rpb25gYCBvZiBgYE5vbmVgYC4KICAgICIiIgogICAgc2VjdGlvbiA9IE5vbmUKICAgIGNvbnRlbnQgPSBbXQogICAgZm9yIGxpbmUgaW4geWllbGRfbGluZXMocyk6CiAgICAgICAgaWYgbGluZS5zdGFydHN3aXRoKCJbIik6CiAgICAgICAgICAgIGlmIGxpbmUuZW5kc3dpdGgoIl0iKToKICAgICAgICAgICAgICAgIGlmIHNlY3Rpb24gb3IgY29udGVudDoKICAgICAgICAgICAgICAgICAgICB5aWVsZCBzZWN0aW9uLCBjb250ZW50CiAgICAgICAgICAgICAgICBzZWN0aW9uID0gbGluZVsxOi0xXS5zdHJpcCgpCiAgICAgICAgICAgICAgICBjb250ZW50ID0gW10KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkludmFsaWQgc2VjdGlvbiBoZWFkaW5nIiwgbGluZSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBjb250ZW50LmFwcGVuZChsaW5lKQoKICAgICMgd3JhcCB1cCBsYXN0IHNlZ21lbnQKICAgIHlpZWxkIHNlY3Rpb24sIGNvbnRlbnQKCgpkZWYgX21rc3RlbXAoKmFyZ3MsICoqa3cpOgogICAgb2xkX29wZW4gPSBvcy5vcGVuCiAgICB0cnk6CiAgICAgICAgIyB0ZW1wb3JhcmlseSBieXBhc3Mgc2FuZGJveGluZwogICAgICAgIG9zLm9wZW4gPSBvc19vcGVuCiAgICAgICAgcmV0dXJuIHRlbXBmaWxlLm1rc3RlbXAoKmFyZ3MsICoqa3cpCiAgICBmaW5hbGx5OgogICAgICAgICMgYW5kIHRoZW4gcHV0IGl0IGJhY2sKICAgICAgICBvcy5vcGVuID0gb2xkX29wZW4KCgojIFNpbGVuY2UgdGhlIFBFUDQ0MFdhcm5pbmcgYnkgZGVmYXVsdCwgc28gdGhhdCBlbmQgdXNlcnMgZG9uJ3QgZ2V0IGhpdCBieSBpdAojIHJhbmRvbWx5IGp1c3QgYmVjYXVzZSB0aGV5IHVzZSBwa2dfcmVzb3VyY2VzLiBXZSB3YW50IHRvIGFwcGVuZCB0aGUgcnVsZQojIGJlY2F1c2Ugd2Ugd2FudCBlYXJsaWVyIHVzZXMgb2YgZmlsdGVyd2FybmluZ3MgdG8gdGFrZSBwcmVjZWRlbmNlIG92ZXIgdGhpcwojIG9uZS4Kd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsIGNhdGVnb3J5PVBFUDQ0MFdhcm5pbmcsIGFwcGVuZD1UcnVlKQoKCiMgZnJvbSBqYXJhY28uZnVuY3Rvb2xzIDEuMwpkZWYgX2NhbGxfYXNpZGUoZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgIGYoKmFyZ3MsICoqa3dhcmdzKQogICAgcmV0dXJuIGYKCgpAX2NhbGxfYXNpZGUKZGVmIF9pbml0aWFsaXplKGc9Z2xvYmFscygpKToKICAgICJTZXQgdXAgZ2xvYmFsIHJlc291cmNlIG1hbmFnZXIgKGRlbGliZXJhdGVseSBub3Qgc3RhdGUtc2F2ZWQpIgogICAgbWFuYWdlciA9IFJlc291cmNlTWFuYWdlcigpCiAgICBnWydfbWFuYWdlciddID0gbWFuYWdlcgogICAgZm9yIG5hbWUgaW4gZGlyKG1hbmFnZXIpOgogICAgICAgIGlmIG5vdCBuYW1lLnN0YXJ0c3dpdGgoJ18nKToKICAgICAgICAgICAgZ1tuYW1lXSA9IGdldGF0dHIobWFuYWdlciwgbmFtZSkKCgpAX2NhbGxfYXNpZGUKZGVmIF9pbml0aWFsaXplX21hc3Rlcl93b3JraW5nX3NldCgpOgogICAgIiIiCiAgICBQcmVwYXJlIHRoZSBtYXN0ZXIgd29ya2luZyBzZXQgYW5kIG1ha2UgdGhlIGBgcmVxdWlyZSgpYGAKICAgIEFQSSBhdmFpbGFibGUuCgogICAgVGhpcyBmdW5jdGlvbiBoYXMgZXhwbGljaXQgZWZmZWN0cyBvbiB0aGUgZ2xvYmFsIHN0YXRlCiAgICBvZiBwa2dfcmVzb3VyY2VzLiBJdCBpcyBpbnRlbmRlZCB0byBiZSBpbnZva2VkIG9uY2UgYXQKICAgIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGlzIG1vZHVsZS4KCiAgICBJbnZvY2F0aW9uIGJ5IG90aGVyIHBhY2thZ2VzIGlzIHVuc3VwcG9ydGVkIGFuZCBkb25lCiAgICBhdCB0aGVpciBvd24gcmlzay4KICAgICIiIgogICAgd29ya2luZ19zZXQgPSBXb3JraW5nU2V0Ll9idWlsZF9tYXN0ZXIoKQogICAgX2RlY2xhcmVfc3RhdGUoJ29iamVjdCcsIHdvcmtpbmdfc2V0PXdvcmtpbmdfc2V0KQoKICAgIHJlcXVpcmUgPSB3b3JraW5nX3NldC5yZXF1aXJlCiAgICBpdGVyX2VudHJ5X3BvaW50cyA9IHdvcmtpbmdfc2V0Lml0ZXJfZW50cnlfcG9pbnRzCiAgICBhZGRfYWN0aXZhdGlvbl9saXN0ZW5lciA9IHdvcmtpbmdfc2V0LnN1YnNjcmliZQogICAgcnVuX3NjcmlwdCA9IHdvcmtpbmdfc2V0LnJ1bl9zY3JpcHQKICAgICMgYmFja3dhcmQgY29tcGF0aWJpbGl0eQogICAgcnVuX21haW4gPSBydW5fc2NyaXB0CiAgICAjIEFjdGl2YXRlIGFsbCBkaXN0cmlidXRpb25zIGFscmVhZHkgb24gc3lzLnBhdGggd2l0aCByZXBsYWNlPUZhbHNlIGFuZAogICAgIyBlbnN1cmUgdGhhdCBhbGwgZGlzdHJpYnV0aW9ucyBhZGRlZCB0byB0aGUgd29ya2luZyBzZXQgaW4gdGhlIGZ1dHVyZQogICAgIyAoZS5nLiBieSBjYWxsaW5nIGBgcmVxdWlyZSgpYGApIHdpbGwgZ2V0IGFjdGl2YXRlZCBhcyB3ZWxsLAogICAgIyB3aXRoIGhpZ2hlciBwcmlvcml0eSAocmVwbGFjZT1UcnVlKS4KICAgIGRpc3QgPSBOb25lICAjIGVuc3VyZSBkaXN0IGlzIGRlZmluZWQgZm9yIGRlbCBkaXN0IGJlbG93CiAgICBmb3IgZGlzdCBpbiB3b3JraW5nX3NldDoKICAgICAgICBkaXN0LmFjdGl2YXRlKHJlcGxhY2U9RmFsc2UpCiAgICBkZWwgZGlzdAogICAgYWRkX2FjdGl2YXRpb25fbGlzdGVuZXIobGFtYmRhIGRpc3Q6IGRpc3QuYWN0aXZhdGUocmVwbGFjZT1UcnVlKSwgZXhpc3Rpbmc9RmFsc2UpCiAgICB3b3JraW5nX3NldC5lbnRyaWVzID0gW10KICAgICMgbWF0Y2ggb3JkZXIKICAgIGxpc3QobWFwKHdvcmtpbmdfc2V0LmFkZF9lbnRyeSwgc3lzLnBhdGgpKQogICAgZ2xvYmFscygpLnVwZGF0ZShsb2NhbHMoKSkKUEsDBBQAAAAAAAAAIQD6WnGMzwsAAM8LAAA9AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9wcm9ncmVzcy9fX2luaXRfXy5weSMgQ29weXJpZ2h0IChjKSAyMDEyIEdpb3Jnb3MgVmVyaWdha2lzIDx2ZXJpZ2FrQGdtYWlsLmNvbT4KIwojIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQojIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKIyBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgojCiMgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCiMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgojIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCiMgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwojIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgojIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCiMgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgZGl2aXNpb24KCmZyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlcXVlCmZyb20gZGF0ZXRpbWUgaW1wb3J0IHRpbWVkZWx0YQpmcm9tIG1hdGggaW1wb3J0IGNlaWwKZnJvbSBzeXMgaW1wb3J0IHN0ZGVycgpmcm9tIHRpbWUgaW1wb3J0IHRpbWUKCgpfX3ZlcnNpb25fXyA9ICcxLjInCgoKY2xhc3MgSW5maW5pdGUob2JqZWN0KToKICAgIGZpbGUgPSBzdGRlcnIKICAgIHNtYV93aW5kb3cgPSAxMAoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgIHNlbGYuaW5kZXggPSAwCiAgICAgICAgc2VsZi5zdGFydF90cyA9IHRpbWUoKQogICAgICAgIHNlbGYuX3RzID0gc2VsZi5zdGFydF90cwogICAgICAgIHNlbGYuX2R0ID0gZGVxdWUobWF4bGVuPXNlbGYuc21hX3dpbmRvdykKICAgICAgICBmb3Iga2V5LCB2YWwgaW4ga3dhcmdzLml0ZW1zKCk6CiAgICAgICAgICAgIHNldGF0dHIoc2VsZiwga2V5LCB2YWwpCgogICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CiAgICAgICAgaWYga2V5LnN0YXJ0c3dpdGgoJ18nKToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLCBrZXksIE5vbmUpCgogICAgQHByb3BlcnR5CiAgICBkZWYgYXZnKHNlbGYpOgogICAgICAgIHJldHVybiBzdW0oc2VsZi5fZHQpIC8gbGVuKHNlbGYuX2R0KSBpZiBzZWxmLl9kdCBlbHNlIDAKCiAgICBAcHJvcGVydHkKICAgIGRlZiBlbGFwc2VkKHNlbGYpOgogICAgICAgIHJldHVybiBpbnQodGltZSgpIC0gc2VsZi5zdGFydF90cykKCiAgICBAcHJvcGVydHkKICAgIGRlZiBlbGFwc2VkX3RkKHNlbGYpOgogICAgICAgIHJldHVybiB0aW1lZGVsdGEoc2Vjb25kcz1zZWxmLmVsYXBzZWQpCgogICAgZGVmIHVwZGF0ZShzZWxmKToKICAgICAgICBwYXNzCgogICAgZGVmIHN0YXJ0KHNlbGYpOgogICAgICAgIHBhc3MKCiAgICBkZWYgZmluaXNoKHNlbGYpOgogICAgICAgIHBhc3MKCiAgICBkZWYgbmV4dChzZWxmLCBuPTEpOgogICAgICAgIGlmIG4gPiAwOgogICAgICAgICAgICBub3cgPSB0aW1lKCkKICAgICAgICAgICAgZHQgPSAobm93IC0gc2VsZi5fdHMpIC8gbgogICAgICAgICAgICBzZWxmLl9kdC5hcHBlbmQoZHQpCiAgICAgICAgICAgIHNlbGYuX3RzID0gbm93CgogICAgICAgIHNlbGYuaW5kZXggPSBzZWxmLmluZGV4ICsgbgogICAgICAgIHNlbGYudXBkYXRlKCkKCiAgICBkZWYgaXRlcihzZWxmLCBpdCk6CiAgICAgICAgZm9yIHggaW4gaXQ6CiAgICAgICAgICAgIHlpZWxkIHgKICAgICAgICAgICAgc2VsZi5uZXh0KCkKICAgICAgICBzZWxmLmZpbmlzaCgpCgoKY2xhc3MgUHJvZ3Jlc3MoSW5maW5pdGUpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgc3VwZXIoUHJvZ3Jlc3MsIHNlbGYpLl9faW5pdF9fKCphcmdzLCAqKmt3YXJncykKICAgICAgICBzZWxmLm1heCA9IGt3YXJncy5nZXQoJ21heCcsIDEwMCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBldGEoc2VsZik6CiAgICAgICAgcmV0dXJuIGludChjZWlsKHNlbGYuYXZnICogc2VsZi5yZW1haW5pbmcpKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGV0YV90ZChzZWxmKToKICAgICAgICByZXR1cm4gdGltZWRlbHRhKHNlY29uZHM9c2VsZi5ldGEpCgogICAgQHByb3BlcnR5CiAgICBkZWYgcGVyY2VudChzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5wcm9ncmVzcyAqIDEwMAoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHByb2dyZXNzKHNlbGYpOgogICAgICAgIHJldHVybiBtaW4oMSwgc2VsZi5pbmRleCAvIHNlbGYubWF4KQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHJlbWFpbmluZyhzZWxmKToKICAgICAgICByZXR1cm4gbWF4KHNlbGYubWF4IC0gc2VsZi5pbmRleCwgMCkKCiAgICBkZWYgc3RhcnQoc2VsZik6CiAgICAgICAgc2VsZi51cGRhdGUoKQoKICAgIGRlZiBnb3RvKHNlbGYsIGluZGV4KToKICAgICAgICBpbmNyID0gaW5kZXggLSBzZWxmLmluZGV4CiAgICAgICAgc2VsZi5uZXh0KGluY3IpCgogICAgZGVmIGl0ZXIoc2VsZiwgaXQpOgogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5tYXggPSBsZW4oaXQpCiAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKICAgICAgICAgICAgcGFzcwoKICAgICAgICBmb3IgeCBpbiBpdDoKICAgICAgICAgICAgeWllbGQgeAogICAgICAgICAgICBzZWxmLm5leHQoKQogICAgICAgIHNlbGYuZmluaXNoKCkKUEsDBBQAAAAAAAAAIQAPw0YDfQoAAH0KAAA4AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9wcm9ncmVzcy9iYXIucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQoKIyBDb3B5cmlnaHQgKGMpIDIwMTIgR2lvcmdvcyBWZXJpZ2FraXMgPHZlcmlnYWtAZ21haWwuY29tPgojCiMgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CiMgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQojIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCiMKIyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKIyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCiMgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKIyBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCiMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCiMgQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKIyBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgoKZnJvbSAuIGltcG9ydCBQcm9ncmVzcwpmcm9tIC5oZWxwZXJzIGltcG9ydCBXcml0ZWxuTWl4aW4KCgpjbGFzcyBCYXIoV3JpdGVsbk1peGluLCBQcm9ncmVzcyk6CiAgICB3aWR0aCA9IDMyCiAgICBtZXNzYWdlID0gJycKICAgIHN1ZmZpeCA9ICclKGluZGV4KWQvJShtYXgpZCcKICAgIGJhcl9wcmVmaXggPSAnIHwnCiAgICBiYXJfc3VmZml4ID0gJ3wgJwogICAgZW1wdHlfZmlsbCA9ICcgJwogICAgZmlsbCA9ICcjJwogICAgaGlkZV9jdXJzb3IgPSBUcnVlCgogICAgZGVmIHVwZGF0ZShzZWxmKToKICAgICAgICBmaWxsZWRfbGVuZ3RoID0gaW50KHNlbGYud2lkdGggKiBzZWxmLnByb2dyZXNzKQogICAgICAgIGVtcHR5X2xlbmd0aCA9IHNlbGYud2lkdGggLSBmaWxsZWRfbGVuZ3RoCgogICAgICAgIG1lc3NhZ2UgPSBzZWxmLm1lc3NhZ2UgJSBzZWxmCiAgICAgICAgYmFyID0gc2VsZi5maWxsICogZmlsbGVkX2xlbmd0aAogICAgICAgIGVtcHR5ID0gc2VsZi5lbXB0eV9maWxsICogZW1wdHlfbGVuZ3RoCiAgICAgICAgc3VmZml4ID0gc2VsZi5zdWZmaXggJSBzZWxmCiAgICAgICAgbGluZSA9ICcnLmpvaW4oW21lc3NhZ2UsIHNlbGYuYmFyX3ByZWZpeCwgYmFyLCBlbXB0eSwgc2VsZi5iYXJfc3VmZml4LAogICAgICAgICAgICAgICAgICAgICAgICBzdWZmaXhdKQogICAgICAgIHNlbGYud3JpdGVsbihsaW5lKQoKCmNsYXNzIENoYXJnaW5nQmFyKEJhcik6CiAgICBzdWZmaXggPSAnJShwZXJjZW50KWQlJScKICAgIGJhcl9wcmVmaXggPSAnICcKICAgIGJhcl9zdWZmaXggPSAnICcKICAgIGVtcHR5X2ZpbGwgPSB1J+KImScKICAgIGZpbGwgPSB1J+KWiCcKCgpjbGFzcyBGaWxsaW5nU3F1YXJlc0JhcihDaGFyZ2luZ0Jhcik6CiAgICBlbXB0eV9maWxsID0gdSfilqInCiAgICBmaWxsID0gdSfilqMnCgoKY2xhc3MgRmlsbGluZ0NpcmNsZXNCYXIoQ2hhcmdpbmdCYXIpOgogICAgZW1wdHlfZmlsbCA9IHUn4pevJwogICAgZmlsbCA9IHUn4peJJwoKCmNsYXNzIEluY3JlbWVudGFsQmFyKEJhcik6CiAgICBwaGFzZXMgPSAodScgJywgdSfilo8nLCB1J+KWjicsIHUn4paNJywgdSfilownLCB1J+KWiycsIHUn4paKJywgdSfiloknLCB1J+KWiCcpCgogICAgZGVmIHVwZGF0ZShzZWxmKToKICAgICAgICBucGhhc2VzID0gbGVuKHNlbGYucGhhc2VzKQogICAgICAgIGV4cGFuZGVkX2xlbmd0aCA9IGludChucGhhc2VzICogc2VsZi53aWR0aCAqIHNlbGYucHJvZ3Jlc3MpCiAgICAgICAgZmlsbGVkX2xlbmd0aCA9IGludChzZWxmLndpZHRoICogc2VsZi5wcm9ncmVzcykKICAgICAgICBlbXB0eV9sZW5ndGggPSBzZWxmLndpZHRoIC0gZmlsbGVkX2xlbmd0aAogICAgICAgIHBoYXNlID0gZXhwYW5kZWRfbGVuZ3RoIC0gKGZpbGxlZF9sZW5ndGggKiBucGhhc2VzKQoKICAgICAgICBtZXNzYWdlID0gc2VsZi5tZXNzYWdlICUgc2VsZgogICAgICAgIGJhciA9IHNlbGYucGhhc2VzWy0xXSAqIGZpbGxlZF9sZW5ndGgKICAgICAgICBjdXJyZW50ID0gc2VsZi5waGFzZXNbcGhhc2VdIGlmIHBoYXNlID4gMCBlbHNlICcnCiAgICAgICAgZW1wdHkgPSBzZWxmLmVtcHR5X2ZpbGwgKiBtYXgoMCwgZW1wdHlfbGVuZ3RoIC0gbGVuKGN1cnJlbnQpKQogICAgICAgIHN1ZmZpeCA9IHNlbGYuc3VmZml4ICUgc2VsZgogICAgICAgIGxpbmUgPSAnJy5qb2luKFttZXNzYWdlLCBzZWxmLmJhcl9wcmVmaXgsIGJhciwgY3VycmVudCwgZW1wdHksCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYmFyX3N1ZmZpeCwgc3VmZml4XSkKICAgICAgICBzZWxmLndyaXRlbG4obGluZSkKCgpjbGFzcyBTaGFkeUJhcihJbmNyZW1lbnRhbEJhcik6CiAgICBwaGFzZXMgPSAodScgJywgdSfilpEnLCB1J+KWkicsIHUn4paTJywgdSfilognKQpQSwMEFAAAAAAAAAAhACp/8TDeBQAA3gUAADwAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3Byb2dyZXNzL2NvdW50ZXIucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQoKIyBDb3B5cmlnaHQgKGMpIDIwMTIgR2lvcmdvcyBWZXJpZ2FraXMgPHZlcmlnYWtAZ21haWwuY29tPgojCiMgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CiMgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQojIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCiMKIyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKIyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCiMgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKIyBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCiMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCiMgQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKIyBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgoKZnJvbSAuIGltcG9ydCBJbmZpbml0ZSwgUHJvZ3Jlc3MKZnJvbSAuaGVscGVycyBpbXBvcnQgV3JpdGVNaXhpbgoKCmNsYXNzIENvdW50ZXIoV3JpdGVNaXhpbiwgSW5maW5pdGUpOgogICAgbWVzc2FnZSA9ICcnCiAgICBoaWRlX2N1cnNvciA9IFRydWUKCiAgICBkZWYgdXBkYXRlKHNlbGYpOgogICAgICAgIHNlbGYud3JpdGUoc3RyKHNlbGYuaW5kZXgpKQoKCmNsYXNzIENvdW50ZG93bihXcml0ZU1peGluLCBQcm9ncmVzcyk6CiAgICBoaWRlX2N1cnNvciA9IFRydWUKCiAgICBkZWYgdXBkYXRlKHNlbGYpOgogICAgICAgIHNlbGYud3JpdGUoc3RyKHNlbGYucmVtYWluaW5nKSkKCgpjbGFzcyBTdGFjayhXcml0ZU1peGluLCBQcm9ncmVzcyk6CiAgICBwaGFzZXMgPSAodScgJywgdSfiloEnLCB1J+KWgicsIHUn4paDJywgdSfiloQnLCB1J+KWhScsIHUn4paGJywgdSfilocnLCB1J+KWiCcpCiAgICBoaWRlX2N1cnNvciA9IFRydWUKCiAgICBkZWYgdXBkYXRlKHNlbGYpOgogICAgICAgIG5waGFzZXMgPSBsZW4oc2VsZi5waGFzZXMpCiAgICAgICAgaSA9IG1pbihucGhhc2VzIC0gMSwgaW50KHNlbGYucHJvZ3Jlc3MgKiBucGhhc2VzKSkKICAgICAgICBzZWxmLndyaXRlKHNlbGYucGhhc2VzW2ldKQoKCmNsYXNzIFBpZShTdGFjayk6CiAgICBwaGFzZXMgPSAodSfil4snLCB1J+KXlCcsIHUn4peRJywgdSfil5UnLCB1J+KXjycpClBLAwQUAAAAAAAAACEAzuwPTiYLAAAmCwAAPAAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcHJvZ3Jlc3MvaGVscGVycy5weSMgQ29weXJpZ2h0IChjKSAyMDEyIEdpb3Jnb3MgVmVyaWdha2lzIDx2ZXJpZ2FrQGdtYWlsLmNvbT4KIwojIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQojIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKIyBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgojCiMgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCiMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgojIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCiMgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwojIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgojIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCiMgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KCgpISURFX0NVUlNPUiA9ICdceDFiWz8yNWwnClNIT1dfQ1VSU09SID0gJ1x4MWJbPzI1aCcKCgpjbGFzcyBXcml0ZU1peGluKG9iamVjdCk6CiAgICBoaWRlX2N1cnNvciA9IEZhbHNlCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG1lc3NhZ2U9Tm9uZSwgKiprd2FyZ3MpOgogICAgICAgIHN1cGVyKFdyaXRlTWl4aW4sIHNlbGYpLl9faW5pdF9fKCoqa3dhcmdzKQogICAgICAgIHNlbGYuX3dpZHRoID0gMAogICAgICAgIGlmIG1lc3NhZ2U6CiAgICAgICAgICAgIHNlbGYubWVzc2FnZSA9IG1lc3NhZ2UKCiAgICAgICAgaWYgc2VsZi5maWxlLmlzYXR0eSgpOgogICAgICAgICAgICBpZiBzZWxmLmhpZGVfY3Vyc29yOgogICAgICAgICAgICAgICAgcHJpbnQoSElERV9DVVJTT1IsIGVuZD0nJywgZmlsZT1zZWxmLmZpbGUpCiAgICAgICAgICAgIHByaW50KHNlbGYubWVzc2FnZSwgZW5kPScnLCBmaWxlPXNlbGYuZmlsZSkKICAgICAgICAgICAgc2VsZi5maWxlLmZsdXNoKCkKCiAgICBkZWYgd3JpdGUoc2VsZiwgcyk6CiAgICAgICAgaWYgc2VsZi5maWxlLmlzYXR0eSgpOgogICAgICAgICAgICBiID0gJ1xiJyAqIHNlbGYuX3dpZHRoCiAgICAgICAgICAgIGMgPSBzLmxqdXN0KHNlbGYuX3dpZHRoKQogICAgICAgICAgICBwcmludChiICsgYywgZW5kPScnLCBmaWxlPXNlbGYuZmlsZSkKICAgICAgICAgICAgc2VsZi5fd2lkdGggPSBtYXgoc2VsZi5fd2lkdGgsIGxlbihzKSkKICAgICAgICAgICAgc2VsZi5maWxlLmZsdXNoKCkKCiAgICBkZWYgZmluaXNoKHNlbGYpOgogICAgICAgIGlmIHNlbGYuZmlsZS5pc2F0dHkoKSBhbmQgc2VsZi5oaWRlX2N1cnNvcjoKICAgICAgICAgICAgcHJpbnQoU0hPV19DVVJTT1IsIGVuZD0nJywgZmlsZT1zZWxmLmZpbGUpCgoKY2xhc3MgV3JpdGVsbk1peGluKG9iamVjdCk6CiAgICBoaWRlX2N1cnNvciA9IEZhbHNlCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG1lc3NhZ2U9Tm9uZSwgKiprd2FyZ3MpOgogICAgICAgIHN1cGVyKFdyaXRlbG5NaXhpbiwgc2VsZikuX19pbml0X18oKiprd2FyZ3MpCiAgICAgICAgaWYgbWVzc2FnZToKICAgICAgICAgICAgc2VsZi5tZXNzYWdlID0gbWVzc2FnZQoKICAgICAgICBpZiBzZWxmLmZpbGUuaXNhdHR5KCkgYW5kIHNlbGYuaGlkZV9jdXJzb3I6CiAgICAgICAgICAgIHByaW50KEhJREVfQ1VSU09SLCBlbmQ9JycsIGZpbGU9c2VsZi5maWxlKQoKICAgIGRlZiBjbGVhcmxuKHNlbGYpOgogICAgICAgIGlmIHNlbGYuZmlsZS5pc2F0dHkoKToKICAgICAgICAgICAgcHJpbnQoJ1xyXHgxYltLJywgZW5kPScnLCBmaWxlPXNlbGYuZmlsZSkKCiAgICBkZWYgd3JpdGVsbihzZWxmLCBsaW5lKToKICAgICAgICBpZiBzZWxmLmZpbGUuaXNhdHR5KCk6CiAgICAgICAgICAgIHNlbGYuY2xlYXJsbigpCiAgICAgICAgICAgIHByaW50KGxpbmUsIGVuZD0nJywgZmlsZT1zZWxmLmZpbGUpCiAgICAgICAgICAgIHNlbGYuZmlsZS5mbHVzaCgpCgogICAgZGVmIGZpbmlzaChzZWxmKToKICAgICAgICBpZiBzZWxmLmZpbGUuaXNhdHR5KCk6CiAgICAgICAgICAgIHByaW50KGZpbGU9c2VsZi5maWxlKQogICAgICAgICAgICBpZiBzZWxmLmhpZGVfY3Vyc29yOgogICAgICAgICAgICAgICAgcHJpbnQoU0hPV19DVVJTT1IsIGVuZD0nJywgZmlsZT1zZWxmLmZpbGUpCgoKZnJvbSBzaWduYWwgaW1wb3J0IHNpZ25hbCwgU0lHSU5UCmZyb20gc3lzIGltcG9ydCBleGl0CgoKY2xhc3MgU2lnSW50TWl4aW4ob2JqZWN0KToKICAgICIiIlJlZ2lzdGVycyBhIHNpZ25hbCBoYW5kbGVyIHRoYXQgY2FsbHMgZmluaXNoIG9uIFNJR0lOVCIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgIHN1cGVyKFNpZ0ludE1peGluLCBzZWxmKS5fX2luaXRfXygqYXJncywgKiprd2FyZ3MpCiAgICAgICAgc2lnbmFsKFNJR0lOVCwgc2VsZi5fc2lnaW50X2hhbmRsZXIpCgogICAgZGVmIF9zaWdpbnRfaGFuZGxlcihzZWxmLCBzaWdudW0sIGZyYW1lKToKICAgICAgICBzZWxmLmZpbmlzaCgpCiAgICAgICAgZXhpdCgwKQpQSwMEFAAAAAAAAAAhAHcIUnsiBQAAIgUAADwAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3Byb2dyZXNzL3NwaW5uZXIucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQoKIyBDb3B5cmlnaHQgKGMpIDIwMTIgR2lvcmdvcyBWZXJpZ2FraXMgPHZlcmlnYWtAZ21haWwuY29tPgojCiMgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CiMgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQojIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCiMKIyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKIyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCiMgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKIyBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCiMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCiMgQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKIyBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgoKZnJvbSAuIGltcG9ydCBJbmZpbml0ZQpmcm9tIC5oZWxwZXJzIGltcG9ydCBXcml0ZU1peGluCgoKY2xhc3MgU3Bpbm5lcihXcml0ZU1peGluLCBJbmZpbml0ZSk6CiAgICBtZXNzYWdlID0gJycKICAgIHBoYXNlcyA9ICgnLScsICdcXCcsICd8JywgJy8nKQogICAgaGlkZV9jdXJzb3IgPSBUcnVlCgogICAgZGVmIHVwZGF0ZShzZWxmKToKICAgICAgICBpID0gc2VsZi5pbmRleCAlIGxlbihzZWxmLnBoYXNlcykKICAgICAgICBzZWxmLndyaXRlKHNlbGYucGhhc2VzW2ldKQoKCmNsYXNzIFBpZVNwaW5uZXIoU3Bpbm5lcik6CiAgICBwaGFzZXMgPSBbdSfil7cnLCB1J+KXticsIHUn4pe1JywgdSfil7QnXQoKCmNsYXNzIE1vb25TcGlubmVyKFNwaW5uZXIpOgogICAgcGhhc2VzID0gW3Un4peRJywgdSfil5InLCB1J+KXkCcsIHUn4peTJ10KCgpjbGFzcyBMaW5lU3Bpbm5lcihTcGlubmVyKToKICAgIHBoYXNlcyA9IFt1J+KOuicsIHUn4o67JywgdSfijrwnLCB1J+KOvScsIHUn4o68JywgdSfijrsnXQpQSwMEFAAAAAAAAAAhAMEgdI6rawMAq2sDADUAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3B5cGFyc2luZy5weSMgbW9kdWxlIHB5cGFyc2luZy5weQojCiMgQ29weXJpZ2h0IChjKSAyMDAzLTIwMTYgIFBhdWwgVC4gTWNHdWlyZQojCiMgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCiMgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCiMgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwojIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKIyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KIyBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KIyB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiMKIyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQojIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgojCiMgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCiMgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCiMgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgojIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCiMgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKIyBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQojIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgojCgpfX2RvY19fID0gXAoiIiIKcHlwYXJzaW5nIG1vZHVsZSAtIENsYXNzZXMgYW5kIG1ldGhvZHMgdG8gZGVmaW5lIGFuZCBleGVjdXRlIHBhcnNpbmcgZ3JhbW1hcnMKClRoZSBweXBhcnNpbmcgbW9kdWxlIGlzIGFuIGFsdGVybmF0aXZlIGFwcHJvYWNoIHRvIGNyZWF0aW5nIGFuZCBleGVjdXRpbmcgc2ltcGxlIGdyYW1tYXJzLAp2cy4gdGhlIHRyYWRpdGlvbmFsIGxleC95YWNjIGFwcHJvYWNoLCBvciB0aGUgdXNlIG9mIHJlZ3VsYXIgZXhwcmVzc2lvbnMuICBXaXRoIHB5cGFyc2luZywgeW91CmRvbid0IG5lZWQgdG8gbGVhcm4gYSBuZXcgc3ludGF4IGZvciBkZWZpbmluZyBncmFtbWFycyBvciBtYXRjaGluZyBleHByZXNzaW9ucyAtIHRoZSBwYXJzaW5nIG1vZHVsZQpwcm92aWRlcyBhIGxpYnJhcnkgb2YgY2xhc3NlcyB0aGF0IHlvdSB1c2UgdG8gY29uc3RydWN0IHRoZSBncmFtbWFyIGRpcmVjdGx5IGluIFB5dGhvbi4KCkhlcmUgaXMgYSBwcm9ncmFtIHRvIHBhcnNlICJIZWxsbywgV29ybGQhIiAob3IgYW55IGdyZWV0aW5nIG9mIHRoZSBmb3JtIApDeyI8c2FsdXRhdGlvbj4sIDxhZGRyZXNzZWU+ISJ9KSwgYnVpbHQgdXAgdXNpbmcgTHtXb3JkfSwgTHtMaXRlcmFsfSwgYW5kIEx7QW5kfSBlbGVtZW50cyAKKEx7JysnPFBhcnNlckVsZW1lbnQuX19hZGRfXz59IG9wZXJhdG9yIGdpdmVzIEx7QW5kfSBleHByZXNzaW9ucywgc3RyaW5ncyBhcmUgYXV0by1jb252ZXJ0ZWQgdG8KTHtMaXRlcmFsfSBleHByZXNzaW9ucyk6OgoKICAgIGZyb20gcHlwYXJzaW5nIGltcG9ydCBXb3JkLCBhbHBoYXMKCiAgICAjIGRlZmluZSBncmFtbWFyIG9mIGEgZ3JlZXRpbmcKICAgIGdyZWV0ID0gV29yZChhbHBoYXMpICsgIiwiICsgV29yZChhbHBoYXMpICsgIiEiCgogICAgaGVsbG8gPSAiSGVsbG8sIFdvcmxkISIKICAgIHByaW50IChoZWxsbywgIi0+IiwgZ3JlZXQucGFyc2VTdHJpbmcoaGVsbG8pKQoKVGhlIHByb2dyYW0gb3V0cHV0cyB0aGUgZm9sbG93aW5nOjoKCiAgICBIZWxsbywgV29ybGQhIC0+IFsnSGVsbG8nLCAnLCcsICdXb3JsZCcsICchJ10KClRoZSBQeXRob24gcmVwcmVzZW50YXRpb24gb2YgdGhlIGdyYW1tYXIgaXMgcXVpdGUgcmVhZGFibGUsIG93aW5nIHRvIHRoZSBzZWxmLWV4cGxhbmF0b3J5CmNsYXNzIG5hbWVzLCBhbmQgdGhlIHVzZSBvZiAnKycsICd8JyBhbmQgJ14nIG9wZXJhdG9ycy4KClRoZSBMe1BhcnNlUmVzdWx0c30gb2JqZWN0IHJldHVybmVkIGZyb20gTHtQYXJzZXJFbGVtZW50LnBhcnNlU3RyaW5nPFBhcnNlckVsZW1lbnQucGFyc2VTdHJpbmc+fSBjYW4gYmUgYWNjZXNzZWQgYXMgYSBuZXN0ZWQgbGlzdCwgYSBkaWN0aW9uYXJ5LCBvciBhbgpvYmplY3Qgd2l0aCBuYW1lZCBhdHRyaWJ1dGVzLgoKVGhlIHB5cGFyc2luZyBtb2R1bGUgaGFuZGxlcyBzb21lIG9mIHRoZSBwcm9ibGVtcyB0aGF0IGFyZSB0eXBpY2FsbHkgdmV4aW5nIHdoZW4gd3JpdGluZyB0ZXh0IHBhcnNlcnM6CiAtIGV4dHJhIG9yIG1pc3Npbmcgd2hpdGVzcGFjZSAodGhlIGFib3ZlIHByb2dyYW0gd2lsbCBhbHNvIGhhbmRsZSAiSGVsbG8sV29ybGQhIiwgIkhlbGxvICAsICBXb3JsZCAgISIsIGV0Yy4pCiAtIHF1b3RlZCBzdHJpbmdzCiAtIGVtYmVkZGVkIGNvbW1lbnRzCiIiIgoKX192ZXJzaW9uX18gPSAiMi4xLjEwIgpfX3ZlcnNpb25UaW1lX18gPSAiMDcgT2N0IDIwMTYgMDE6MzEgVVRDIgpfX2F1dGhvcl9fID0gIlBhdWwgTWNHdWlyZSA8cHRtY2dAdXNlcnMuc291cmNlZm9yZ2UubmV0PiIKCmltcG9ydCBzdHJpbmcKZnJvbSB3ZWFrcmVmIGltcG9ydCByZWYgYXMgd2tyZWYKaW1wb3J0IGNvcHkKaW1wb3J0IHN5cwppbXBvcnQgd2FybmluZ3MKaW1wb3J0IHJlCmltcG9ydCBzcmVfY29uc3RhbnRzCmltcG9ydCBjb2xsZWN0aW9ucwppbXBvcnQgcHByaW50CmltcG9ydCB0cmFjZWJhY2sKaW1wb3J0IHR5cGVzCmZyb20gZGF0ZXRpbWUgaW1wb3J0IGRhdGV0aW1lCgp0cnk6CiAgICBmcm9tIF90aHJlYWQgaW1wb3J0IFJMb2NrCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGZyb20gdGhyZWFkaW5nIGltcG9ydCBSTG9jawoKdHJ5OgogICAgZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgT3JkZXJlZERpY3QgYXMgX09yZGVyZWREaWN0CmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIHRyeToKICAgICAgICBmcm9tIG9yZGVyZWRkaWN0IGltcG9ydCBPcmRlcmVkRGljdCBhcyBfT3JkZXJlZERpY3QKICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICBfT3JkZXJlZERpY3QgPSBOb25lCgojfiBzeXMuc3RkZXJyLndyaXRlKCAidGVzdGluZyBweXBhcnNpbmcgbW9kdWxlLCB2ZXJzaW9uICVzLCAlc1xuIiAlIChfX3ZlcnNpb25fXyxfX3ZlcnNpb25UaW1lX18gKSApCgpfX2FsbF9fID0gWwonQW5kJywgJ0Nhc2VsZXNzS2V5d29yZCcsICdDYXNlbGVzc0xpdGVyYWwnLCAnQ2hhcnNOb3RJbicsICdDb21iaW5lJywgJ0RpY3QnLCAnRWFjaCcsICdFbXB0eScsCidGb2xsb3dlZEJ5JywgJ0ZvcndhcmQnLCAnR29Ub0NvbHVtbicsICdHcm91cCcsICdLZXl3b3JkJywgJ0xpbmVFbmQnLCAnTGluZVN0YXJ0JywgJ0xpdGVyYWwnLAonTWF0Y2hGaXJzdCcsICdOb01hdGNoJywgJ05vdEFueScsICdPbmVPck1vcmUnLCAnT25seU9uY2UnLCAnT3B0aW9uYWwnLCAnT3InLAonUGFyc2VCYXNlRXhjZXB0aW9uJywgJ1BhcnNlRWxlbWVudEVuaGFuY2UnLCAnUGFyc2VFeGNlcHRpb24nLCAnUGFyc2VFeHByZXNzaW9uJywgJ1BhcnNlRmF0YWxFeGNlcHRpb24nLAonUGFyc2VSZXN1bHRzJywgJ1BhcnNlU3ludGF4RXhjZXB0aW9uJywgJ1BhcnNlckVsZW1lbnQnLCAnUXVvdGVkU3RyaW5nJywgJ1JlY3Vyc2l2ZUdyYW1tYXJFeGNlcHRpb24nLAonUmVnZXgnLCAnU2tpcFRvJywgJ1N0cmluZ0VuZCcsICdTdHJpbmdTdGFydCcsICdTdXBwcmVzcycsICdUb2tlbicsICdUb2tlbkNvbnZlcnRlcicsIAonV2hpdGUnLCAnV29yZCcsICdXb3JkRW5kJywgJ1dvcmRTdGFydCcsICdaZXJvT3JNb3JlJywKJ2FscGhhbnVtcycsICdhbHBoYXMnLCAnYWxwaGFzOGJpdCcsICdhbnlDbG9zZVRhZycsICdhbnlPcGVuVGFnJywgJ2NTdHlsZUNvbW1lbnQnLCAnY29sJywKJ2NvbW1hU2VwYXJhdGVkTGlzdCcsICdjb21tb25IVE1MRW50aXR5JywgJ2NvdW50ZWRBcnJheScsICdjcHBTdHlsZUNvbW1lbnQnLCAnZGJsUXVvdGVkU3RyaW5nJywKJ2RibFNsYXNoQ29tbWVudCcsICdkZWxpbWl0ZWRMaXN0JywgJ2RpY3RPZicsICdkb3duY2FzZVRva2VucycsICdlbXB0eScsICdoZXhudW1zJywKJ2h0bWxDb21tZW50JywgJ2phdmFTdHlsZUNvbW1lbnQnLCAnbGluZScsICdsaW5lRW5kJywgJ2xpbmVTdGFydCcsICdsaW5lbm8nLAonbWFrZUhUTUxUYWdzJywgJ21ha2VYTUxUYWdzJywgJ21hdGNoT25seUF0Q29sJywgJ21hdGNoUHJldmlvdXNFeHByJywgJ21hdGNoUHJldmlvdXNMaXRlcmFsJywKJ25lc3RlZEV4cHInLCAnbnVsbERlYnVnQWN0aW9uJywgJ251bXMnLCAnb25lT2YnLCAnb3BBc3NvYycsICdvcGVyYXRvclByZWNlZGVuY2UnLCAncHJpbnRhYmxlcycsCidwdW5jOGJpdCcsICdweXRob25TdHlsZUNvbW1lbnQnLCAncXVvdGVkU3RyaW5nJywgJ3JlbW92ZVF1b3RlcycsICdyZXBsYWNlSFRNTEVudGl0eScsIAoncmVwbGFjZVdpdGgnLCAncmVzdE9mTGluZScsICdzZ2xRdW90ZWRTdHJpbmcnLCAnc3JhbmdlJywgJ3N0cmluZ0VuZCcsCidzdHJpbmdTdGFydCcsICd0cmFjZVBhcnNlQWN0aW9uJywgJ3VuaWNvZGVTdHJpbmcnLCAndXBjYXNlVG9rZW5zJywgJ3dpdGhBdHRyaWJ1dGUnLAonaW5kZW50ZWRCbG9jaycsICdvcmlnaW5hbFRleHRGb3InLCAndW5ncm91cCcsICdpbmZpeE5vdGF0aW9uJywnbG9jYXRlZEV4cHInLCAnd2l0aENsYXNzJywKJ0Nsb3NlTWF0Y2gnLCAndG9rZW5NYXAnLCAncHlwYXJzaW5nX2NvbW1vbicsCl0KCnN5c3RlbV92ZXJzaW9uID0gdHVwbGUoc3lzLnZlcnNpb25faW5mbylbOjNdClBZXzMgPSBzeXN0ZW1fdmVyc2lvblswXSA9PSAzCmlmIFBZXzM6CiAgICBfTUFYX0lOVCA9IHN5cy5tYXhzaXplCiAgICBiYXNlc3RyaW5nID0gc3RyCiAgICB1bmljaHIgPSBjaHIKICAgIF91c3RyID0gc3RyCgogICAgIyBidWlsZCBsaXN0IG9mIHNpbmdsZSBhcmcgYnVpbHRpbnMsIHRoYXQgY2FuIGJlIHVzZWQgYXMgcGFyc2UgYWN0aW9ucwogICAgc2luZ2xlQXJnQnVpbHRpbnMgPSBbc3VtLCBsZW4sIHNvcnRlZCwgcmV2ZXJzZWQsIGxpc3QsIHR1cGxlLCBzZXQsIGFueSwgYWxsLCBtaW4sIG1heF0KCmVsc2U6CiAgICBfTUFYX0lOVCA9IHN5cy5tYXhpbnQKICAgIHJhbmdlID0geHJhbmdlCgogICAgZGVmIF91c3RyKG9iaik6CiAgICAgICAgIiIiRHJvcC1pbiByZXBsYWNlbWVudCBmb3Igc3RyKG9iaikgdGhhdCB0cmllcyB0byBiZSBVbmljb2RlIGZyaWVuZGx5LiBJdCBmaXJzdCB0cmllcwogICAgICAgICAgIHN0cihvYmopLiBJZiB0aGF0IGZhaWxzIHdpdGggYSBVbmljb2RlRW5jb2RlRXJyb3IsIHRoZW4gaXQgdHJpZXMgdW5pY29kZShvYmopLiBJdAogICAgICAgICAgIHRoZW4gPCByZXR1cm5zIHRoZSB1bmljb2RlIG9iamVjdCB8IGVuY29kZXMgaXQgd2l0aCB0aGUgZGVmYXVsdCBlbmNvZGluZyB8IC4uLiA+LgogICAgICAgICIiIgogICAgICAgIGlmIGlzaW5zdGFuY2Uob2JqLHVuaWNvZGUpOgogICAgICAgICAgICByZXR1cm4gb2JqCgogICAgICAgIHRyeToKICAgICAgICAgICAgIyBJZiB0aGlzIHdvcmtzLCB0aGVuIF91c3RyKG9iaikgaGFzIHRoZSBzYW1lIGJlaGF2aW91ciBhcyBzdHIob2JqKSwgc28KICAgICAgICAgICAgIyBpdCB3b24ndCBicmVhayBhbnkgZXhpc3RpbmcgY29kZS4KICAgICAgICAgICAgcmV0dXJuIHN0cihvYmopCgogICAgICAgIGV4Y2VwdCBVbmljb2RlRW5jb2RlRXJyb3I6CiAgICAgICAgICAgICMgRWxzZSBlbmNvZGUgaXQKICAgICAgICAgICAgcmV0ID0gdW5pY29kZShvYmopLmVuY29kZShzeXMuZ2V0ZGVmYXVsdGVuY29kaW5nKCksICd4bWxjaGFycmVmcmVwbGFjZScpCiAgICAgICAgICAgIHhtbGNoYXJyZWYgPSBSZWdleCgnJiNcZCs7JykKICAgICAgICAgICAgeG1sY2hhcnJlZi5zZXRQYXJzZUFjdGlvbihsYW1iZGEgdDogJ1xcdScgKyBoZXgoaW50KHRbMF1bMjotMV0pKVsyOl0pCiAgICAgICAgICAgIHJldHVybiB4bWxjaGFycmVmLnRyYW5zZm9ybVN0cmluZyhyZXQpCgogICAgIyBidWlsZCBsaXN0IG9mIHNpbmdsZSBhcmcgYnVpbHRpbnMsIHRvbGVyYW50IG9mIFB5dGhvbiB2ZXJzaW9uLCB0aGF0IGNhbiBiZSB1c2VkIGFzIHBhcnNlIGFjdGlvbnMKICAgIHNpbmdsZUFyZ0J1aWx0aW5zID0gW10KICAgIGltcG9ydCBfX2J1aWx0aW5fXwogICAgZm9yIGZuYW1lIGluICJzdW0gbGVuIHNvcnRlZCByZXZlcnNlZCBsaXN0IHR1cGxlIHNldCBhbnkgYWxsIG1pbiBtYXgiLnNwbGl0KCk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBzaW5nbGVBcmdCdWlsdGlucy5hcHBlbmQoZ2V0YXR0cihfX2J1aWx0aW5fXyxmbmFtZSkpCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAKX2dlbmVyYXRvclR5cGUgPSB0eXBlKCh5IGZvciB5IGluIHJhbmdlKDEpKSkKIApkZWYgX3htbF9lc2NhcGUoZGF0YSk6CiAgICAiIiJFc2NhcGUgJiwgPCwgPiwgIiwgJywgZXRjLiBpbiBhIHN0cmluZyBvZiBkYXRhLiIiIgoKICAgICMgYW1wZXJzYW5kIG11c3QgYmUgcmVwbGFjZWQgZmlyc3QKICAgIGZyb21fc3ltYm9scyA9ICcmPjwiXCcnCiAgICB0b19zeW1ib2xzID0gKCcmJytzKyc7JyBmb3IgcyBpbiAiYW1wIGd0IGx0IHF1b3QgYXBvcyIuc3BsaXQoKSkKICAgIGZvciBmcm9tXyx0b18gaW4gemlwKGZyb21fc3ltYm9scywgdG9fc3ltYm9scyk6CiAgICAgICAgZGF0YSA9IGRhdGEucmVwbGFjZShmcm9tXywgdG9fKQogICAgcmV0dXJuIGRhdGEKCmNsYXNzIF9Db25zdGFudHMob2JqZWN0KToKICAgIHBhc3MKCmFscGhhcyAgICAgPSBzdHJpbmcuYXNjaWlfdXBwZXJjYXNlICsgc3RyaW5nLmFzY2lpX2xvd2VyY2FzZQpudW1zICAgICAgID0gIjAxMjM0NTY3ODkiCmhleG51bXMgICAgPSBudW1zICsgIkFCQ0RFRmFiY2RlZiIKYWxwaGFudW1zICA9IGFscGhhcyArIG51bXMKX2JzbGFzaCAgICA9IGNocig5MikKcHJpbnRhYmxlcyA9ICIiLmpvaW4oYyBmb3IgYyBpbiBzdHJpbmcucHJpbnRhYmxlIGlmIGMgbm90IGluIHN0cmluZy53aGl0ZXNwYWNlKQoKY2xhc3MgUGFyc2VCYXNlRXhjZXB0aW9uKEV4Y2VwdGlvbik6CiAgICAiIiJiYXNlIGV4Y2VwdGlvbiBjbGFzcyBmb3IgYWxsIHBhcnNpbmcgcnVudGltZSBleGNlcHRpb25zIiIiCiAgICAjIFBlcmZvcm1hbmNlIHR1bmluZzogd2UgY29uc3RydWN0IGEgKmxvdCogb2YgdGhlc2UsIHNvIGtlZXAgdGhpcwogICAgIyBjb25zdHJ1Y3RvciBhcyBzbWFsbCBhbmQgZmFzdCBhcyBwb3NzaWJsZQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBwc3RyLCBsb2M9MCwgbXNnPU5vbmUsIGVsZW09Tm9uZSApOgogICAgICAgIHNlbGYubG9jID0gbG9jCiAgICAgICAgaWYgbXNnIGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYubXNnID0gcHN0cgogICAgICAgICAgICBzZWxmLnBzdHIgPSAiIgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYubXNnID0gbXNnCiAgICAgICAgICAgIHNlbGYucHN0ciA9IHBzdHIKICAgICAgICBzZWxmLnBhcnNlckVsZW1lbnQgPSBlbGVtCiAgICAgICAgc2VsZi5hcmdzID0gKHBzdHIsIGxvYywgbXNnKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9mcm9tX2V4Y2VwdGlvbihjbHMsIHBlKToKICAgICAgICAiIiIKICAgICAgICBpbnRlcm5hbCBmYWN0b3J5IG1ldGhvZCB0byBzaW1wbGlmeSBjcmVhdGluZyBvbmUgdHlwZSBvZiBQYXJzZUV4Y2VwdGlvbiAKICAgICAgICBmcm9tIGFub3RoZXIgLSBhdm9pZHMgaGF2aW5nIF9faW5pdF9fIHNpZ25hdHVyZSBjb25mbGljdHMgYW1vbmcgc3ViY2xhc3NlcwogICAgICAgICIiIgogICAgICAgIHJldHVybiBjbHMocGUucHN0ciwgcGUubG9jLCBwZS5tc2csIHBlLnBhcnNlckVsZW1lbnQpCgogICAgZGVmIF9fZ2V0YXR0cl9fKCBzZWxmLCBhbmFtZSApOgogICAgICAgICIiInN1cHBvcnRlZCBhdHRyaWJ1dGVzIGJ5IG5hbWUgYXJlOgogICAgICAgICAgICAtIGxpbmVubyAtIHJldHVybnMgdGhlIGxpbmUgbnVtYmVyIG9mIHRoZSBleGNlcHRpb24gdGV4dAogICAgICAgICAgICAtIGNvbCAtIHJldHVybnMgdGhlIGNvbHVtbiBudW1iZXIgb2YgdGhlIGV4Y2VwdGlvbiB0ZXh0CiAgICAgICAgICAgIC0gbGluZSAtIHJldHVybnMgdGhlIGxpbmUgY29udGFpbmluZyB0aGUgZXhjZXB0aW9uIHRleHQKICAgICAgICAiIiIKICAgICAgICBpZiggYW5hbWUgPT0gImxpbmVubyIgKToKICAgICAgICAgICAgcmV0dXJuIGxpbmVubyggc2VsZi5sb2MsIHNlbGYucHN0ciApCiAgICAgICAgZWxpZiggYW5hbWUgaW4gKCJjb2wiLCAiY29sdW1uIikgKToKICAgICAgICAgICAgcmV0dXJuIGNvbCggc2VsZi5sb2MsIHNlbGYucHN0ciApCiAgICAgICAgZWxpZiggYW5hbWUgPT0gImxpbmUiICk6CiAgICAgICAgICAgIHJldHVybiBsaW5lKCBzZWxmLmxvYywgc2VsZi5wc3RyICkKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcihhbmFtZSkKCiAgICBkZWYgX19zdHJfXyggc2VsZiApOgogICAgICAgIHJldHVybiAiJXMgKGF0IGNoYXIgJWQpLCAobGluZTolZCwgY29sOiVkKSIgJSBcCiAgICAgICAgICAgICAgICAoIHNlbGYubXNnLCBzZWxmLmxvYywgc2VsZi5saW5lbm8sIHNlbGYuY29sdW1uICkKICAgIGRlZiBfX3JlcHJfXyggc2VsZiApOgogICAgICAgIHJldHVybiBfdXN0cihzZWxmKQogICAgZGVmIG1hcmtJbnB1dGxpbmUoIHNlbGYsIG1hcmtlclN0cmluZyA9ICI+ITwiICk6CiAgICAgICAgIiIiRXh0cmFjdHMgdGhlIGV4Y2VwdGlvbiBsaW5lIGZyb20gdGhlIGlucHV0IHN0cmluZywgYW5kIG1hcmtzCiAgICAgICAgICAgdGhlIGxvY2F0aW9uIG9mIHRoZSBleGNlcHRpb24gd2l0aCBhIHNwZWNpYWwgc3ltYm9sLgogICAgICAgICIiIgogICAgICAgIGxpbmVfc3RyID0gc2VsZi5saW5lCiAgICAgICAgbGluZV9jb2x1bW4gPSBzZWxmLmNvbHVtbiAtIDEKICAgICAgICBpZiBtYXJrZXJTdHJpbmc6CiAgICAgICAgICAgIGxpbmVfc3RyID0gIiIuam9pbigobGluZV9zdHJbOmxpbmVfY29sdW1uXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXJTdHJpbmcsIGxpbmVfc3RyW2xpbmVfY29sdW1uOl0pKQogICAgICAgIHJldHVybiBsaW5lX3N0ci5zdHJpcCgpCiAgICBkZWYgX19kaXJfXyhzZWxmKToKICAgICAgICByZXR1cm4gImxpbmVubyBjb2wgbGluZSIuc3BsaXQoKSArIGRpcih0eXBlKHNlbGYpKQoKY2xhc3MgUGFyc2VFeGNlcHRpb24oUGFyc2VCYXNlRXhjZXB0aW9uKToKICAgICIiIgogICAgRXhjZXB0aW9uIHRocm93biB3aGVuIHBhcnNlIGV4cHJlc3Npb25zIGRvbid0IG1hdGNoIGNsYXNzOwogICAgc3VwcG9ydGVkIGF0dHJpYnV0ZXMgYnkgbmFtZSBhcmU6CiAgICAgLSBsaW5lbm8gLSByZXR1cm5zIHRoZSBsaW5lIG51bWJlciBvZiB0aGUgZXhjZXB0aW9uIHRleHQKICAgICAtIGNvbCAtIHJldHVybnMgdGhlIGNvbHVtbiBudW1iZXIgb2YgdGhlIGV4Y2VwdGlvbiB0ZXh0CiAgICAgLSBsaW5lIC0gcmV0dXJucyB0aGUgbGluZSBjb250YWluaW5nIHRoZSBleGNlcHRpb24gdGV4dAogICAgICAgIAogICAgRXhhbXBsZTo6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBXb3JkKG51bXMpLnNldE5hbWUoImludGVnZXIiKS5wYXJzZVN0cmluZygiQUJDIikKICAgICAgICBleGNlcHQgUGFyc2VFeGNlcHRpb24gYXMgcGU6CiAgICAgICAgICAgIHByaW50KHBlKQogICAgICAgICAgICBwcmludCgiY29sdW1uOiB7fSIuZm9ybWF0KHBlLmNvbCkpCiAgICAgICAgICAgIAogICAgcHJpbnRzOjoKICAgICAgIEV4cGVjdGVkIGludGVnZXIgKGF0IGNoYXIgMCksIChsaW5lOjEsIGNvbDoxKQogICAgICAgIGNvbHVtbjogMQogICAgIiIiCiAgICBwYXNzCgpjbGFzcyBQYXJzZUZhdGFsRXhjZXB0aW9uKFBhcnNlQmFzZUV4Y2VwdGlvbik6CiAgICAiIiJ1c2VyLXRocm93YWJsZSBleGNlcHRpb24gdGhyb3duIHdoZW4gaW5jb25zaXN0ZW50IHBhcnNlIGNvbnRlbnQKICAgICAgIGlzIGZvdW5kOyBzdG9wcyBhbGwgcGFyc2luZyBpbW1lZGlhdGVseSIiIgogICAgcGFzcwoKY2xhc3MgUGFyc2VTeW50YXhFeGNlcHRpb24oUGFyc2VGYXRhbEV4Y2VwdGlvbik6CiAgICAiIiJqdXN0IGxpa2UgTHtQYXJzZUZhdGFsRXhjZXB0aW9ufSwgYnV0IHRocm93biBpbnRlcm5hbGx5IHdoZW4gYW4KICAgICAgIEx7RXJyb3JTdG9wPEFuZC5fRXJyb3JTdG9wPn0gKCctJyBvcGVyYXRvcikgaW5kaWNhdGVzIHRoYXQgcGFyc2luZyBpcyB0byBzdG9wIAogICAgICAgaW1tZWRpYXRlbHkgYmVjYXVzZSBhbiB1bmJhY2t0cmFja2FibGUgc3ludGF4IGVycm9yIGhhcyBiZWVuIGZvdW5kIiIiCiAgICBwYXNzCgojfiBjbGFzcyBSZXBhcnNlRXhjZXB0aW9uKFBhcnNlQmFzZUV4Y2VwdGlvbik6CiAgICAjfiAiIiJFeHBlcmltZW50YWwgY2xhc3MgLSBwYXJzZSBhY3Rpb25zIGNhbiByYWlzZSB0aGlzIGV4Y2VwdGlvbiB0byBjYXVzZQogICAgICAgI34gcHlwYXJzaW5nIHRvIHJlcGFyc2UgdGhlIGlucHV0IHN0cmluZzoKICAgICAgICAjfiAtIHdpdGggYSBtb2RpZmllZCBpbnB1dCBzdHJpbmcsIGFuZC9vcgogICAgICAgICN+IC0gd2l0aCBhIG1vZGlmaWVkIHN0YXJ0IGxvY2F0aW9uCiAgICAgICAjfiBTZXQgdGhlIHZhbHVlcyBvZiB0aGUgUmVwYXJzZUV4Y2VwdGlvbiBpbiB0aGUgY29uc3RydWN0b3IsIGFuZCByYWlzZSB0aGUKICAgICAgICN+IGV4Y2VwdGlvbiBpbiBhIHBhcnNlIGFjdGlvbiB0byBjYXVzZSBweXBhcnNpbmcgdG8gdXNlIHRoZSBuZXcgc3RyaW5nL2xvY2F0aW9uLgogICAgICAgI34gU2V0dGluZyB0aGUgdmFsdWVzIGFzIE5vbmUgY2F1c2VzIG5vIGNoYW5nZSB0byBiZSBtYWRlLgogICAgICAgI34gIiIiCiAgICAjfiBkZWYgX19pbml0Xyggc2VsZiwgbmV3c3RyaW5nLCByZXN0YXJ0TG9jICk6CiAgICAgICAgI34gc2VsZi5uZXdQYXJzZVRleHQgPSBuZXdzdHJpbmcKICAgICAgICAjfiBzZWxmLnJlcGFyc2VMb2MgPSByZXN0YXJ0TG9jCgpjbGFzcyBSZWN1cnNpdmVHcmFtbWFyRXhjZXB0aW9uKEV4Y2VwdGlvbik6CiAgICAiIiJleGNlcHRpb24gdGhyb3duIGJ5IEx7UGFyc2VyRWxlbWVudC52YWxpZGF0ZX0gaWYgdGhlIGdyYW1tYXIgY291bGQgYmUgaW1wcm9wZXJseSByZWN1cnNpdmUiIiIKICAgIGRlZiBfX2luaXRfXyggc2VsZiwgcGFyc2VFbGVtZW50TGlzdCApOgogICAgICAgIHNlbGYucGFyc2VFbGVtZW50VHJhY2UgPSBwYXJzZUVsZW1lbnRMaXN0CgogICAgZGVmIF9fc3RyX18oIHNlbGYgKToKICAgICAgICByZXR1cm4gIlJlY3Vyc2l2ZUdyYW1tYXJFeGNlcHRpb246ICVzIiAlIHNlbGYucGFyc2VFbGVtZW50VHJhY2UKCmNsYXNzIF9QYXJzZVJlc3VsdHNXaXRoT2Zmc2V0KG9iamVjdCk6CiAgICBkZWYgX19pbml0X18oc2VsZixwMSxwMik6CiAgICAgICAgc2VsZi50dXAgPSAocDEscDIpCiAgICBkZWYgX19nZXRpdGVtX18oc2VsZixpKToKICAgICAgICByZXR1cm4gc2VsZi50dXBbaV0KICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gcmVwcihzZWxmLnR1cFswXSkKICAgIGRlZiBzZXRPZmZzZXQoc2VsZixpKToKICAgICAgICBzZWxmLnR1cCA9IChzZWxmLnR1cFswXSxpKQoKY2xhc3MgUGFyc2VSZXN1bHRzKG9iamVjdCk6CiAgICAiIiIKICAgIFN0cnVjdHVyZWQgcGFyc2UgcmVzdWx0cywgdG8gcHJvdmlkZSBtdWx0aXBsZSBtZWFucyBvZiBhY2Nlc3MgdG8gdGhlIHBhcnNlZCBkYXRhOgogICAgICAgLSBhcyBhIGxpc3QgKEN7bGVuKHJlc3VsdHMpfSkKICAgICAgIC0gYnkgbGlzdCBpbmRleCAoQ3tyZXN1bHRzWzBdLCByZXN1bHRzWzFdfSwgZXRjLikKICAgICAgIC0gYnkgYXR0cmlidXRlIChDe3Jlc3VsdHMuPHJlc3VsdHNOYW1lPn0gLSBzZWUgTHtQYXJzZXJFbGVtZW50LnNldFJlc3VsdHNOYW1lfSkKCiAgICBFeGFtcGxlOjoKICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKQogICAgICAgIGRhdGVfc3RyID0gKGludGVnZXIuc2V0UmVzdWx0c05hbWUoInllYXIiKSArICcvJyAKICAgICAgICAgICAgICAgICAgICAgICAgKyBpbnRlZ2VyLnNldFJlc3VsdHNOYW1lKCJtb250aCIpICsgJy8nIAogICAgICAgICAgICAgICAgICAgICAgICArIGludGVnZXIuc2V0UmVzdWx0c05hbWUoImRheSIpKQogICAgICAgICMgZXF1aXZhbGVudCBmb3JtOgogICAgICAgICMgZGF0ZV9zdHIgPSBpbnRlZ2VyKCJ5ZWFyIikgKyAnLycgKyBpbnRlZ2VyKCJtb250aCIpICsgJy8nICsgaW50ZWdlcigiZGF5IikKCiAgICAgICAgIyBwYXJzZVN0cmluZyByZXR1cm5zIGEgUGFyc2VSZXN1bHRzIG9iamVjdAogICAgICAgIHJlc3VsdCA9IGRhdGVfc3RyLnBhcnNlU3RyaW5nKCIxOTk5LzEyLzMxIikKCiAgICAgICAgZGVmIHRlc3QocywgZm49cmVwcik6CiAgICAgICAgICAgIHByaW50KCIlcyAtPiAlcyIgJSAocywgZm4oZXZhbChzKSkpKQogICAgICAgIHRlc3QoImxpc3QocmVzdWx0KSIpCiAgICAgICAgdGVzdCgicmVzdWx0WzBdIikKICAgICAgICB0ZXN0KCJyZXN1bHRbJ21vbnRoJ10iKQogICAgICAgIHRlc3QoInJlc3VsdC5kYXkiKQogICAgICAgIHRlc3QoIidtb250aCcgaW4gcmVzdWx0IikKICAgICAgICB0ZXN0KCInbWludXRlcycgaW4gcmVzdWx0IikKICAgICAgICB0ZXN0KCJyZXN1bHQuZHVtcCgpIiwgc3RyKQogICAgcHJpbnRzOjoKICAgICAgICBsaXN0KHJlc3VsdCkgLT4gWycxOTk5JywgJy8nLCAnMTInLCAnLycsICczMSddCiAgICAgICAgcmVzdWx0WzBdIC0+ICcxOTk5JwogICAgICAgIHJlc3VsdFsnbW9udGgnXSAtPiAnMTInCiAgICAgICAgcmVzdWx0LmRheSAtPiAnMzEnCiAgICAgICAgJ21vbnRoJyBpbiByZXN1bHQgLT4gVHJ1ZQogICAgICAgICdtaW51dGVzJyBpbiByZXN1bHQgLT4gRmFsc2UKICAgICAgICByZXN1bHQuZHVtcCgpIC0+IFsnMTk5OScsICcvJywgJzEyJywgJy8nLCAnMzEnXQogICAgICAgIC0gZGF5OiAzMQogICAgICAgIC0gbW9udGg6IDEyCiAgICAgICAgLSB5ZWFyOiAxOTk5CiAgICAiIiIKICAgIGRlZiBfX25ld19fKGNscywgdG9rbGlzdD1Ob25lLCBuYW1lPU5vbmUsIGFzTGlzdD1UcnVlLCBtb2RhbD1UcnVlICk6CiAgICAgICAgaWYgaXNpbnN0YW5jZSh0b2tsaXN0LCBjbHMpOgogICAgICAgICAgICByZXR1cm4gdG9rbGlzdAogICAgICAgIHJldG9iaiA9IG9iamVjdC5fX25ld19fKGNscykKICAgICAgICByZXRvYmouX19kb2luaXQgPSBUcnVlCiAgICAgICAgcmV0dXJuIHJldG9iagoKICAgICMgUGVyZm9ybWFuY2UgdHVuaW5nOiB3ZSBjb25zdHJ1Y3QgYSAqbG90KiBvZiB0aGVzZSwgc28ga2VlcCB0aGlzCiAgICAjIGNvbnN0cnVjdG9yIGFzIHNtYWxsIGFuZCBmYXN0IGFzIHBvc3NpYmxlCiAgICBkZWYgX19pbml0X18oIHNlbGYsIHRva2xpc3Q9Tm9uZSwgbmFtZT1Ob25lLCBhc0xpc3Q9VHJ1ZSwgbW9kYWw9VHJ1ZSwgaXNpbnN0YW5jZT1pc2luc3RhbmNlICk6CiAgICAgICAgaWYgc2VsZi5fX2RvaW5pdDoKICAgICAgICAgICAgc2VsZi5fX2RvaW5pdCA9IEZhbHNlCiAgICAgICAgICAgIHNlbGYuX19uYW1lID0gTm9uZQogICAgICAgICAgICBzZWxmLl9fcGFyZW50ID0gTm9uZQogICAgICAgICAgICBzZWxmLl9fYWNjdW1OYW1lcyA9IHt9CiAgICAgICAgICAgIHNlbGYuX19hc0xpc3QgPSBhc0xpc3QKICAgICAgICAgICAgc2VsZi5fX21vZGFsID0gbW9kYWwKICAgICAgICAgICAgaWYgdG9rbGlzdCBpcyBOb25lOgogICAgICAgICAgICAgICAgdG9rbGlzdCA9IFtdCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodG9rbGlzdCwgbGlzdCk6CiAgICAgICAgICAgICAgICBzZWxmLl9fdG9rbGlzdCA9IHRva2xpc3RbOl0KICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKHRva2xpc3QsIF9nZW5lcmF0b3JUeXBlKToKICAgICAgICAgICAgICAgIHNlbGYuX190b2tsaXN0ID0gbGlzdCh0b2tsaXN0KQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi5fX3Rva2xpc3QgPSBbdG9rbGlzdF0KICAgICAgICAgICAgc2VsZi5fX3Rva2RpY3QgPSBkaWN0KCkKCiAgICAgICAgaWYgbmFtZSBpcyBub3QgTm9uZSBhbmQgbmFtZToKICAgICAgICAgICAgaWYgbm90IG1vZGFsOgogICAgICAgICAgICAgICAgc2VsZi5fX2FjY3VtTmFtZXNbbmFtZV0gPSAwCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UobmFtZSxpbnQpOgogICAgICAgICAgICAgICAgbmFtZSA9IF91c3RyKG5hbWUpICMgd2lsbCBhbHdheXMgcmV0dXJuIGEgc3RyLCBidXQgdXNlIF91c3RyIGZvciBjb25zaXN0ZW5jeQogICAgICAgICAgICBzZWxmLl9fbmFtZSA9IG5hbWUKICAgICAgICAgICAgaWYgbm90IChpc2luc3RhbmNlKHRva2xpc3QsICh0eXBlKE5vbmUpLCBiYXNlc3RyaW5nLCBsaXN0KSkgYW5kIHRva2xpc3QgaW4gKE5vbmUsJycsW10pKToKICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodG9rbGlzdCxiYXNlc3RyaW5nKToKICAgICAgICAgICAgICAgICAgICB0b2tsaXN0ID0gWyB0b2tsaXN0IF0KICAgICAgICAgICAgICAgIGlmIGFzTGlzdDoKICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHRva2xpc3QsUGFyc2VSZXN1bHRzKToKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZltuYW1lXSA9IF9QYXJzZVJlc3VsdHNXaXRoT2Zmc2V0KHRva2xpc3QuY29weSgpLDApCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZltuYW1lXSA9IF9QYXJzZVJlc3VsdHNXaXRoT2Zmc2V0KFBhcnNlUmVzdWx0cyh0b2tsaXN0WzBdKSwwKQogICAgICAgICAgICAgICAgICAgIHNlbGZbbmFtZV0uX19uYW1lID0gbmFtZQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGZbbmFtZV0gPSB0b2tsaXN0WzBdCiAgICAgICAgICAgICAgICAgICAgZXhjZXB0IChLZXlFcnJvcixUeXBlRXJyb3IsSW5kZXhFcnJvcik6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGZbbmFtZV0gPSB0b2tsaXN0CgogICAgZGVmIF9fZ2V0aXRlbV9fKCBzZWxmLCBpICk6CiAgICAgICAgaWYgaXNpbnN0YW5jZSggaSwgKGludCxzbGljZSkgKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX190b2tsaXN0W2ldCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaWYgaSBub3QgaW4gc2VsZi5fX2FjY3VtTmFtZXM6CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fX3Rva2RpY3RbaV1bLTFdWzBdCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXR1cm4gUGFyc2VSZXN1bHRzKFsgdlswXSBmb3IgdiBpbiBzZWxmLl9fdG9rZGljdFtpXSBdKQoKICAgIGRlZiBfX3NldGl0ZW1fXyggc2VsZiwgaywgdiwgaXNpbnN0YW5jZT1pc2luc3RhbmNlICk6CiAgICAgICAgaWYgaXNpbnN0YW5jZSh2LF9QYXJzZVJlc3VsdHNXaXRoT2Zmc2V0KToKICAgICAgICAgICAgc2VsZi5fX3Rva2RpY3Rba10gPSBzZWxmLl9fdG9rZGljdC5nZXQoayxsaXN0KCkpICsgW3ZdCiAgICAgICAgICAgIHN1YiA9IHZbMF0KICAgICAgICBlbGlmIGlzaW5zdGFuY2UoaywoaW50LHNsaWNlKSk6CiAgICAgICAgICAgIHNlbGYuX190b2tsaXN0W2tdID0gdgogICAgICAgICAgICBzdWIgPSB2CiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5fX3Rva2RpY3Rba10gPSBzZWxmLl9fdG9rZGljdC5nZXQoayxsaXN0KCkpICsgW19QYXJzZVJlc3VsdHNXaXRoT2Zmc2V0KHYsMCldCiAgICAgICAgICAgIHN1YiA9IHYKICAgICAgICBpZiBpc2luc3RhbmNlKHN1YixQYXJzZVJlc3VsdHMpOgogICAgICAgICAgICBzdWIuX19wYXJlbnQgPSB3a3JlZihzZWxmKQoKICAgIGRlZiBfX2RlbGl0ZW1fXyggc2VsZiwgaSApOgogICAgICAgIGlmIGlzaW5zdGFuY2UoaSwoaW50LHNsaWNlKSk6CiAgICAgICAgICAgIG15bGVuID0gbGVuKCBzZWxmLl9fdG9rbGlzdCApCiAgICAgICAgICAgIGRlbCBzZWxmLl9fdG9rbGlzdFtpXQoKICAgICAgICAgICAgIyBjb252ZXJ0IGludCB0byBzbGljZQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGksIGludCk6CiAgICAgICAgICAgICAgICBpZiBpIDwgMDoKICAgICAgICAgICAgICAgICAgICBpICs9IG15bGVuCiAgICAgICAgICAgICAgICBpID0gc2xpY2UoaSwgaSsxKQogICAgICAgICAgICAjIGdldCByZW1vdmVkIGluZGljZXMKICAgICAgICAgICAgcmVtb3ZlZCA9IGxpc3QocmFuZ2UoKmkuaW5kaWNlcyhteWxlbikpKQogICAgICAgICAgICByZW1vdmVkLnJldmVyc2UoKQogICAgICAgICAgICAjIGZpeHVwIGluZGljZXMgaW4gdG9rZW4gZGljdGlvbmFyeQogICAgICAgICAgICBmb3IgbmFtZSxvY2N1cnJlbmNlcyBpbiBzZWxmLl9fdG9rZGljdC5pdGVtcygpOgogICAgICAgICAgICAgICAgZm9yIGogaW4gcmVtb3ZlZDoKICAgICAgICAgICAgICAgICAgICBmb3IgaywgKHZhbHVlLCBwb3NpdGlvbikgaW4gZW51bWVyYXRlKG9jY3VycmVuY2VzKToKICAgICAgICAgICAgICAgICAgICAgICAgb2NjdXJyZW5jZXNba10gPSBfUGFyc2VSZXN1bHRzV2l0aE9mZnNldCh2YWx1ZSwgcG9zaXRpb24gLSAocG9zaXRpb24gPiBqKSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBkZWwgc2VsZi5fX3Rva2RpY3RbaV0KCiAgICBkZWYgX19jb250YWluc19fKCBzZWxmLCBrICk6CiAgICAgICAgcmV0dXJuIGsgaW4gc2VsZi5fX3Rva2RpY3QKCiAgICBkZWYgX19sZW5fXyggc2VsZiApOiByZXR1cm4gbGVuKCBzZWxmLl9fdG9rbGlzdCApCiAgICBkZWYgX19ib29sX18oc2VsZik6IHJldHVybiAoIG5vdCBub3Qgc2VsZi5fX3Rva2xpc3QgKQogICAgX19ub256ZXJvX18gPSBfX2Jvb2xfXwogICAgZGVmIF9faXRlcl9fKCBzZWxmICk6IHJldHVybiBpdGVyKCBzZWxmLl9fdG9rbGlzdCApCiAgICBkZWYgX19yZXZlcnNlZF9fKCBzZWxmICk6IHJldHVybiBpdGVyKCBzZWxmLl9fdG9rbGlzdFs6Oi0xXSApCiAgICBkZWYgX2l0ZXJrZXlzKCBzZWxmICk6CiAgICAgICAgaWYgaGFzYXR0cihzZWxmLl9fdG9rZGljdCwgIml0ZXJrZXlzIik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9fdG9rZGljdC5pdGVya2V5cygpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIGl0ZXIoc2VsZi5fX3Rva2RpY3QpCgogICAgZGVmIF9pdGVydmFsdWVzKCBzZWxmICk6CiAgICAgICAgcmV0dXJuIChzZWxmW2tdIGZvciBrIGluIHNlbGYuX2l0ZXJrZXlzKCkpCiAgICAgICAgICAgIAogICAgZGVmIF9pdGVyaXRlbXMoIHNlbGYgKToKICAgICAgICByZXR1cm4gKChrLCBzZWxmW2tdKSBmb3IgayBpbiBzZWxmLl9pdGVya2V5cygpKQoKICAgIGlmIFBZXzM6CiAgICAgICAga2V5cyA9IF9pdGVya2V5cyAgICAgICAKICAgICAgICAiIiJSZXR1cm5zIGFuIGl0ZXJhdG9yIG9mIGFsbCBuYW1lZCByZXN1bHQga2V5cyAoUHl0aG9uIDMueCBvbmx5KS4iIiIKCiAgICAgICAgdmFsdWVzID0gX2l0ZXJ2YWx1ZXMKICAgICAgICAiIiJSZXR1cm5zIGFuIGl0ZXJhdG9yIG9mIGFsbCBuYW1lZCByZXN1bHQgdmFsdWVzIChQeXRob24gMy54IG9ubHkpLiIiIgoKICAgICAgICBpdGVtcyA9IF9pdGVyaXRlbXMKICAgICAgICAiIiJSZXR1cm5zIGFuIGl0ZXJhdG9yIG9mIGFsbCBuYW1lZCByZXN1bHQga2V5LXZhbHVlIHR1cGxlcyAoUHl0aG9uIDMueCBvbmx5KS4iIiIKCiAgICBlbHNlOgogICAgICAgIGl0ZXJrZXlzID0gX2l0ZXJrZXlzCiAgICAgICAgIiIiUmV0dXJucyBhbiBpdGVyYXRvciBvZiBhbGwgbmFtZWQgcmVzdWx0IGtleXMgKFB5dGhvbiAyLnggb25seSkuIiIiCgogICAgICAgIGl0ZXJ2YWx1ZXMgPSBfaXRlcnZhbHVlcwogICAgICAgICIiIlJldHVybnMgYW4gaXRlcmF0b3Igb2YgYWxsIG5hbWVkIHJlc3VsdCB2YWx1ZXMgKFB5dGhvbiAyLnggb25seSkuIiIiCgogICAgICAgIGl0ZXJpdGVtcyA9IF9pdGVyaXRlbXMKICAgICAgICAiIiJSZXR1cm5zIGFuIGl0ZXJhdG9yIG9mIGFsbCBuYW1lZCByZXN1bHQga2V5LXZhbHVlIHR1cGxlcyAoUHl0aG9uIDIueCBvbmx5KS4iIiIKCiAgICAgICAgZGVmIGtleXMoIHNlbGYgKToKICAgICAgICAgICAgIiIiUmV0dXJucyBhbGwgbmFtZWQgcmVzdWx0IGtleXMgKGFzIGEgbGlzdCBpbiBQeXRob24gMi54LCBhcyBhbiBpdGVyYXRvciBpbiBQeXRob24gMy54KS4iIiIKICAgICAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi5pdGVya2V5cygpKQoKICAgICAgICBkZWYgdmFsdWVzKCBzZWxmICk6CiAgICAgICAgICAgICIiIlJldHVybnMgYWxsIG5hbWVkIHJlc3VsdCB2YWx1ZXMgKGFzIGEgbGlzdCBpbiBQeXRob24gMi54LCBhcyBhbiBpdGVyYXRvciBpbiBQeXRob24gMy54KS4iIiIKICAgICAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi5pdGVydmFsdWVzKCkpCiAgICAgICAgICAgICAgICAKICAgICAgICBkZWYgaXRlbXMoIHNlbGYgKToKICAgICAgICAgICAgIiIiUmV0dXJucyBhbGwgbmFtZWQgcmVzdWx0IGtleS12YWx1ZXMgKGFzIGEgbGlzdCBvZiB0dXBsZXMgaW4gUHl0aG9uIDIueCwgYXMgYW4gaXRlcmF0b3IgaW4gUHl0aG9uIDMueCkuIiIiCiAgICAgICAgICAgIHJldHVybiBsaXN0KHNlbGYuaXRlcml0ZW1zKCkpCgogICAgZGVmIGhhc2tleXMoIHNlbGYgKToKICAgICAgICAiIiJTaW5jZSBrZXlzKCkgcmV0dXJucyBhbiBpdGVyYXRvciwgdGhpcyBtZXRob2QgaXMgaGVscGZ1bCBpbiBieXBhc3NpbmcKICAgICAgICAgICBjb2RlIHRoYXQgbG9va3MgZm9yIHRoZSBleGlzdGVuY2Ugb2YgYW55IGRlZmluZWQgcmVzdWx0cyBuYW1lcy4iIiIKICAgICAgICByZXR1cm4gYm9vbChzZWxmLl9fdG9rZGljdCkKICAgICAgICAKICAgIGRlZiBwb3AoIHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgIiIiCiAgICAgICAgUmVtb3ZlcyBhbmQgcmV0dXJucyBpdGVtIGF0IHNwZWNpZmllZCBpbmRleCAoZGVmYXVsdD1De2xhc3R9KS4KICAgICAgICBTdXBwb3J0cyBib3RoIEN7bGlzdH0gYW5kIEN7ZGljdH0gc2VtYW50aWNzIGZvciBDe3BvcCgpfS4gSWYgcGFzc2VkIG5vCiAgICAgICAgYXJndW1lbnQgb3IgYW4gaW50ZWdlciBhcmd1bWVudCwgaXQgd2lsbCB1c2UgQ3tsaXN0fSBzZW1hbnRpY3MKICAgICAgICBhbmQgcG9wIHRva2VucyBmcm9tIHRoZSBsaXN0IG9mIHBhcnNlZCB0b2tlbnMuIElmIHBhc3NlZCBhIAogICAgICAgIG5vbi1pbnRlZ2VyIGFyZ3VtZW50IChtb3N0IGxpa2VseSBhIHN0cmluZyksIGl0IHdpbGwgdXNlIEN7ZGljdH0KICAgICAgICBzZW1hbnRpY3MgYW5kIHBvcCB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBmcm9tIGFueSBkZWZpbmVkIAogICAgICAgIHJlc3VsdHMgbmFtZXMuIEEgc2Vjb25kIGRlZmF1bHQgcmV0dXJuIHZhbHVlIGFyZ3VtZW50IGlzIAogICAgICAgIHN1cHBvcnRlZCwganVzdCBhcyBpbiBDe2RpY3QucG9wKCl9LgoKICAgICAgICBFeGFtcGxlOjoKICAgICAgICAgICAgZGVmIHJlbW92ZV9maXJzdCh0b2tlbnMpOgogICAgICAgICAgICAgICAgdG9rZW5zLnBvcCgwKQogICAgICAgICAgICBwcmludChPbmVPck1vcmUoV29yZChudW1zKSkucGFyc2VTdHJpbmcoIjAgMTIzIDMyMSIpKSAjIC0+IFsnMCcsICcxMjMnLCAnMzIxJ10KICAgICAgICAgICAgcHJpbnQoT25lT3JNb3JlKFdvcmQobnVtcykpLmFkZFBhcnNlQWN0aW9uKHJlbW92ZV9maXJzdCkucGFyc2VTdHJpbmcoIjAgMTIzIDMyMSIpKSAjIC0+IFsnMTIzJywgJzMyMSddCgogICAgICAgICAgICBsYWJlbCA9IFdvcmQoYWxwaGFzKQogICAgICAgICAgICBwYXR0ID0gbGFiZWwoIkxBQkVMIikgKyBPbmVPck1vcmUoV29yZChudW1zKSkKICAgICAgICAgICAgcHJpbnQocGF0dC5wYXJzZVN0cmluZygiQUFCIDEyMyAzMjEiKS5kdW1wKCkpCgogICAgICAgICAgICAjIFVzZSBwb3AoKSBpbiBhIHBhcnNlIGFjdGlvbiB0byByZW1vdmUgbmFtZWQgcmVzdWx0IChub3RlIHRoYXQgY29ycmVzcG9uZGluZyB2YWx1ZSBpcyBub3QKICAgICAgICAgICAgIyByZW1vdmVkIGZyb20gbGlzdCBmb3JtIG9mIHJlc3VsdHMpCiAgICAgICAgICAgIGRlZiByZW1vdmVfTEFCRUwodG9rZW5zKToKICAgICAgICAgICAgICAgIHRva2Vucy5wb3AoIkxBQkVMIikKICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbnMKICAgICAgICAgICAgcGF0dC5hZGRQYXJzZUFjdGlvbihyZW1vdmVfTEFCRUwpCiAgICAgICAgICAgIHByaW50KHBhdHQucGFyc2VTdHJpbmcoIkFBQiAxMjMgMzIxIikuZHVtcCgpKQogICAgICAgIHByaW50czo6CiAgICAgICAgICAgIFsnQUFCJywgJzEyMycsICczMjEnXQogICAgICAgICAgICAtIExBQkVMOiBBQUIKCiAgICAgICAgICAgIFsnQUFCJywgJzEyMycsICczMjEnXQogICAgICAgICIiIgogICAgICAgIGlmIG5vdCBhcmdzOgogICAgICAgICAgICBhcmdzID0gWy0xXQogICAgICAgIGZvciBrLHYgaW4ga3dhcmdzLml0ZW1zKCk6CiAgICAgICAgICAgIGlmIGsgPT0gJ2RlZmF1bHQnOgogICAgICAgICAgICAgICAgYXJncyA9IChhcmdzWzBdLCB2KQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJwb3AoKSBnb3QgYW4gdW5leHBlY3RlZCBrZXl3b3JkIGFyZ3VtZW50ICclcyciICUgaykKICAgICAgICBpZiAoaXNpbnN0YW5jZShhcmdzWzBdLCBpbnQpIG9yIAogICAgICAgICAgICAgICAgICAgICAgICBsZW4oYXJncykgPT0gMSBvciAKICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1swXSBpbiBzZWxmKToKICAgICAgICAgICAgaW5kZXggPSBhcmdzWzBdCiAgICAgICAgICAgIHJldCA9IHNlbGZbaW5kZXhdCiAgICAgICAgICAgIGRlbCBzZWxmW2luZGV4XQogICAgICAgICAgICByZXR1cm4gcmV0CiAgICAgICAgZWxzZToKICAgICAgICAgICAgZGVmYXVsdHZhbHVlID0gYXJnc1sxXQogICAgICAgICAgICByZXR1cm4gZGVmYXVsdHZhbHVlCgogICAgZGVmIGdldChzZWxmLCBrZXksIGRlZmF1bHRWYWx1ZT1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm5zIG5hbWVkIHJlc3VsdCBtYXRjaGluZyB0aGUgZ2l2ZW4ga2V5LCBvciBpZiB0aGVyZSBpcyBubwogICAgICAgIHN1Y2ggbmFtZSwgdGhlbiByZXR1cm5zIHRoZSBnaXZlbiBDe2RlZmF1bHRWYWx1ZX0gb3IgQ3tOb25lfSBpZiBubwogICAgICAgIEN7ZGVmYXVsdFZhbHVlfSBpcyBzcGVjaWZpZWQuCgogICAgICAgIFNpbWlsYXIgdG8gQ3tkaWN0LmdldCgpfS4KICAgICAgICAKICAgICAgICBFeGFtcGxlOjoKICAgICAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykKICAgICAgICAgICAgZGF0ZV9zdHIgPSBpbnRlZ2VyKCJ5ZWFyIikgKyAnLycgKyBpbnRlZ2VyKCJtb250aCIpICsgJy8nICsgaW50ZWdlcigiZGF5IikgICAgICAgICAgIAoKICAgICAgICAgICAgcmVzdWx0ID0gZGF0ZV9zdHIucGFyc2VTdHJpbmcoIjE5OTkvMTIvMzEiKQogICAgICAgICAgICBwcmludChyZXN1bHQuZ2V0KCJ5ZWFyIikpICMgLT4gJzE5OTknCiAgICAgICAgICAgIHByaW50KHJlc3VsdC5nZXQoImhvdXIiLCAibm90IHNwZWNpZmllZCIpKSAjIC0+ICdub3Qgc3BlY2lmaWVkJwogICAgICAgICAgICBwcmludChyZXN1bHQuZ2V0KCJob3VyIikpICMgLT4gTm9uZQogICAgICAgICIiIgogICAgICAgIGlmIGtleSBpbiBzZWxmOgogICAgICAgICAgICByZXR1cm4gc2VsZltrZXldCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZQoKICAgIGRlZiBpbnNlcnQoIHNlbGYsIGluZGV4LCBpbnNTdHIgKToKICAgICAgICAiIiIKICAgICAgICBJbnNlcnRzIG5ldyBlbGVtZW50IGF0IGxvY2F0aW9uIGluZGV4IGluIHRoZSBsaXN0IG9mIHBhcnNlZCB0b2tlbnMuCiAgICAgICAgCiAgICAgICAgU2ltaWxhciB0byBDe2xpc3QuaW5zZXJ0KCl9LgoKICAgICAgICBFeGFtcGxlOjoKICAgICAgICAgICAgcHJpbnQoT25lT3JNb3JlKFdvcmQobnVtcykpLnBhcnNlU3RyaW5nKCIwIDEyMyAzMjEiKSkgIyAtPiBbJzAnLCAnMTIzJywgJzMyMSddCgogICAgICAgICAgICAjIHVzZSBhIHBhcnNlIGFjdGlvbiB0byBpbnNlcnQgdGhlIHBhcnNlIGxvY2F0aW9uIGluIHRoZSBmcm9udCBvZiB0aGUgcGFyc2VkIHJlc3VsdHMKICAgICAgICAgICAgZGVmIGluc2VydF9sb2NuKGxvY24sIHRva2Vucyk6CiAgICAgICAgICAgICAgICB0b2tlbnMuaW5zZXJ0KDAsIGxvY24pCiAgICAgICAgICAgIHByaW50KE9uZU9yTW9yZShXb3JkKG51bXMpKS5hZGRQYXJzZUFjdGlvbihpbnNlcnRfbG9jbikucGFyc2VTdHJpbmcoIjAgMTIzIDMyMSIpKSAjIC0+IFswLCAnMCcsICcxMjMnLCAnMzIxJ10KICAgICAgICAiIiIKICAgICAgICBzZWxmLl9fdG9rbGlzdC5pbnNlcnQoaW5kZXgsIGluc1N0cikKICAgICAgICAjIGZpeHVwIGluZGljZXMgaW4gdG9rZW4gZGljdGlvbmFyeQogICAgICAgIGZvciBuYW1lLG9jY3VycmVuY2VzIGluIHNlbGYuX190b2tkaWN0Lml0ZW1zKCk6CiAgICAgICAgICAgIGZvciBrLCAodmFsdWUsIHBvc2l0aW9uKSBpbiBlbnVtZXJhdGUob2NjdXJyZW5jZXMpOgogICAgICAgICAgICAgICAgb2NjdXJyZW5jZXNba10gPSBfUGFyc2VSZXN1bHRzV2l0aE9mZnNldCh2YWx1ZSwgcG9zaXRpb24gKyAocG9zaXRpb24gPiBpbmRleCkpCgogICAgZGVmIGFwcGVuZCggc2VsZiwgaXRlbSApOgogICAgICAgICIiIgogICAgICAgIEFkZCBzaW5nbGUgZWxlbWVudCB0byBlbmQgb2YgUGFyc2VSZXN1bHRzIGxpc3Qgb2YgZWxlbWVudHMuCgogICAgICAgIEV4YW1wbGU6OgogICAgICAgICAgICBwcmludChPbmVPck1vcmUoV29yZChudW1zKSkucGFyc2VTdHJpbmcoIjAgMTIzIDMyMSIpKSAjIC0+IFsnMCcsICcxMjMnLCAnMzIxJ10KICAgICAgICAgICAgCiAgICAgICAgICAgICMgdXNlIGEgcGFyc2UgYWN0aW9uIHRvIGNvbXB1dGUgdGhlIHN1bSBvZiB0aGUgcGFyc2VkIGludGVnZXJzLCBhbmQgYWRkIGl0IHRvIHRoZSBlbmQKICAgICAgICAgICAgZGVmIGFwcGVuZF9zdW0odG9rZW5zKToKICAgICAgICAgICAgICAgIHRva2Vucy5hcHBlbmQoc3VtKG1hcChpbnQsIHRva2VucykpKQogICAgICAgICAgICBwcmludChPbmVPck1vcmUoV29yZChudW1zKSkuYWRkUGFyc2VBY3Rpb24oYXBwZW5kX3N1bSkucGFyc2VTdHJpbmcoIjAgMTIzIDMyMSIpKSAjIC0+IFsnMCcsICcxMjMnLCAnMzIxJywgNDQ0XQogICAgICAgICIiIgogICAgICAgIHNlbGYuX190b2tsaXN0LmFwcGVuZChpdGVtKQoKICAgIGRlZiBleHRlbmQoIHNlbGYsIGl0ZW1zZXEgKToKICAgICAgICAiIiIKICAgICAgICBBZGQgc2VxdWVuY2Ugb2YgZWxlbWVudHMgdG8gZW5kIG9mIFBhcnNlUmVzdWx0cyBsaXN0IG9mIGVsZW1lbnRzLgoKICAgICAgICBFeGFtcGxlOjoKICAgICAgICAgICAgcGF0dCA9IE9uZU9yTW9yZShXb3JkKGFscGhhcykpCiAgICAgICAgICAgIAogICAgICAgICAgICAjIHVzZSBhIHBhcnNlIGFjdGlvbiB0byBhcHBlbmQgdGhlIHJldmVyc2Ugb2YgdGhlIG1hdGNoZWQgc3RyaW5ncywgdG8gbWFrZSBhIHBhbGluZHJvbWUKICAgICAgICAgICAgZGVmIG1ha2VfcGFsaW5kcm9tZSh0b2tlbnMpOgogICAgICAgICAgICAgICAgdG9rZW5zLmV4dGVuZChyZXZlcnNlZChbdFs6Oi0xXSBmb3IgdCBpbiB0b2tlbnNdKSkKICAgICAgICAgICAgICAgIHJldHVybiAnJy5qb2luKHRva2VucykKICAgICAgICAgICAgcHJpbnQocGF0dC5hZGRQYXJzZUFjdGlvbihtYWtlX3BhbGluZHJvbWUpLnBhcnNlU3RyaW5nKCJsc2tkaiBzZGxramYgbGtzZCIpKSAjIC0+ICdsc2tkanNkbGtqZmxrc2Rkc2tsZmprbGRzamRrc2wnCiAgICAgICAgIiIiCiAgICAgICAgaWYgaXNpbnN0YW5jZShpdGVtc2VxLCBQYXJzZVJlc3VsdHMpOgogICAgICAgICAgICBzZWxmICs9IGl0ZW1zZXEKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLl9fdG9rbGlzdC5leHRlbmQoaXRlbXNlcSkKCiAgICBkZWYgY2xlYXIoIHNlbGYgKToKICAgICAgICAiIiIKICAgICAgICBDbGVhciBhbGwgZWxlbWVudHMgYW5kIHJlc3VsdHMgbmFtZXMuCiAgICAgICAgIiIiCiAgICAgICAgZGVsIHNlbGYuX190b2tsaXN0WzpdCiAgICAgICAgc2VsZi5fX3Rva2RpY3QuY2xlYXIoKQoKICAgIGRlZiBfX2dldGF0dHJfXyggc2VsZiwgbmFtZSApOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHNlbGZbbmFtZV0KICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgIHJldHVybiAiIgogICAgICAgICAgICAKICAgICAgICBpZiBuYW1lIGluIHNlbGYuX190b2tkaWN0OgogICAgICAgICAgICBpZiBuYW1lIG5vdCBpbiBzZWxmLl9fYWNjdW1OYW1lczoKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9fdG9rZGljdFtuYW1lXVstMV1bMF0KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJldHVybiBQYXJzZVJlc3VsdHMoWyB2WzBdIGZvciB2IGluIHNlbGYuX190b2tkaWN0W25hbWVdIF0pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuICIiCgogICAgZGVmIF9fYWRkX18oIHNlbGYsIG90aGVyICk6CiAgICAgICAgcmV0ID0gc2VsZi5jb3B5KCkKICAgICAgICByZXQgKz0gb3RoZXIKICAgICAgICByZXR1cm4gcmV0CgogICAgZGVmIF9faWFkZF9fKCBzZWxmLCBvdGhlciApOgogICAgICAgIGlmIG90aGVyLl9fdG9rZGljdDoKICAgICAgICAgICAgb2Zmc2V0ID0gbGVuKHNlbGYuX190b2tsaXN0KQogICAgICAgICAgICBhZGRvZmZzZXQgPSBsYW1iZGEgYTogb2Zmc2V0IGlmIGE8MCBlbHNlIGErb2Zmc2V0CiAgICAgICAgICAgIG90aGVyaXRlbXMgPSBvdGhlci5fX3Rva2RpY3QuaXRlbXMoKQogICAgICAgICAgICBvdGhlcmRpY3RpdGVtcyA9IFsoaywgX1BhcnNlUmVzdWx0c1dpdGhPZmZzZXQodlswXSxhZGRvZmZzZXQodlsxXSkpICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGssdmxpc3QpIGluIG90aGVyaXRlbXMgZm9yIHYgaW4gdmxpc3RdCiAgICAgICAgICAgIGZvciBrLHYgaW4gb3RoZXJkaWN0aXRlbXM6CiAgICAgICAgICAgICAgICBzZWxmW2tdID0gdgogICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2WzBdLFBhcnNlUmVzdWx0cyk6CiAgICAgICAgICAgICAgICAgICAgdlswXS5fX3BhcmVudCA9IHdrcmVmKHNlbGYpCiAgICAgICAgICAgIAogICAgICAgIHNlbGYuX190b2tsaXN0ICs9IG90aGVyLl9fdG9rbGlzdAogICAgICAgIHNlbGYuX19hY2N1bU5hbWVzLnVwZGF0ZSggb3RoZXIuX19hY2N1bU5hbWVzICkKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBfX3JhZGRfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlcixpbnQpIGFuZCBvdGhlciA9PSAwOgogICAgICAgICAgICAjIHVzZWZ1bCBmb3IgbWVyZ2luZyBtYW55IFBhcnNlUmVzdWx0cyB1c2luZyBzdW0oKSBidWlsdGluCiAgICAgICAgICAgIHJldHVybiBzZWxmLmNvcHkoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgdGhpcyBtYXkgcmFpc2UgYSBUeXBlRXJyb3IgLSBzbyBiZSBpdAogICAgICAgICAgICByZXR1cm4gb3RoZXIgKyBzZWxmCiAgICAgICAgCiAgICBkZWYgX19yZXByX18oIHNlbGYgKToKICAgICAgICByZXR1cm4gIiglcywgJXMpIiAlICggcmVwciggc2VsZi5fX3Rva2xpc3QgKSwgcmVwciggc2VsZi5fX3Rva2RpY3QgKSApCgogICAgZGVmIF9fc3RyX18oIHNlbGYgKToKICAgICAgICByZXR1cm4gJ1snICsgJywgJy5qb2luKF91c3RyKGkpIGlmIGlzaW5zdGFuY2UoaSwgUGFyc2VSZXN1bHRzKSBlbHNlIHJlcHIoaSkgZm9yIGkgaW4gc2VsZi5fX3Rva2xpc3QpICsgJ10nCgogICAgZGVmIF9hc1N0cmluZ0xpc3QoIHNlbGYsIHNlcD0nJyApOgogICAgICAgIG91dCA9IFtdCiAgICAgICAgZm9yIGl0ZW0gaW4gc2VsZi5fX3Rva2xpc3Q6CiAgICAgICAgICAgIGlmIG91dCBhbmQgc2VwOgogICAgICAgICAgICAgICAgb3V0LmFwcGVuZChzZXApCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoIGl0ZW0sIFBhcnNlUmVzdWx0cyApOgogICAgICAgICAgICAgICAgb3V0ICs9IGl0ZW0uX2FzU3RyaW5nTGlzdCgpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCBfdXN0cihpdGVtKSApCiAgICAgICAgcmV0dXJuIG91dAoKICAgIGRlZiBhc0xpc3QoIHNlbGYgKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm5zIHRoZSBwYXJzZSByZXN1bHRzIGFzIGEgbmVzdGVkIGxpc3Qgb2YgbWF0Y2hpbmcgdG9rZW5zLCBhbGwgY29udmVydGVkIHRvIHN0cmluZ3MuCgogICAgICAgIEV4YW1wbGU6OgogICAgICAgICAgICBwYXR0ID0gT25lT3JNb3JlKFdvcmQoYWxwaGFzKSkKICAgICAgICAgICAgcmVzdWx0ID0gcGF0dC5wYXJzZVN0cmluZygic2xka2ogbHNka2ogc2xka2oiKQogICAgICAgICAgICAjIGV2ZW4gdGhvdWdoIHRoZSByZXN1bHQgcHJpbnRzIGluIHN0cmluZy1saWtlIGZvcm0sIGl0IGlzIGFjdHVhbGx5IGEgcHlwYXJzaW5nIFBhcnNlUmVzdWx0cwogICAgICAgICAgICBwcmludCh0eXBlKHJlc3VsdCksIHJlc3VsdCkgIyAtPiA8Y2xhc3MgJ3B5cGFyc2luZy5QYXJzZVJlc3VsdHMnPiBbJ3NsZGtqJywgJ2xzZGtqJywgJ3NsZGtqJ10KICAgICAgICAgICAgCiAgICAgICAgICAgICMgVXNlIGFzTGlzdCgpIHRvIGNyZWF0ZSBhbiBhY3R1YWwgbGlzdAogICAgICAgICAgICByZXN1bHRfbGlzdCA9IHJlc3VsdC5hc0xpc3QoKQogICAgICAgICAgICBwcmludCh0eXBlKHJlc3VsdF9saXN0KSwgcmVzdWx0X2xpc3QpICMgLT4gPGNsYXNzICdsaXN0Jz4gWydzbGRraicsICdsc2RraicsICdzbGRraiddCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIFtyZXMuYXNMaXN0KCkgaWYgaXNpbnN0YW5jZShyZXMsUGFyc2VSZXN1bHRzKSBlbHNlIHJlcyBmb3IgcmVzIGluIHNlbGYuX190b2tsaXN0XQoKICAgIGRlZiBhc0RpY3QoIHNlbGYgKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm5zIHRoZSBuYW1lZCBwYXJzZSByZXN1bHRzIGFzIGEgbmVzdGVkIGRpY3Rpb25hcnkuCgogICAgICAgIEV4YW1wbGU6OgogICAgICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKQogICAgICAgICAgICBkYXRlX3N0ciA9IGludGVnZXIoInllYXIiKSArICcvJyArIGludGVnZXIoIm1vbnRoIikgKyAnLycgKyBpbnRlZ2VyKCJkYXkiKQogICAgICAgICAgICAKICAgICAgICAgICAgcmVzdWx0ID0gZGF0ZV9zdHIucGFyc2VTdHJpbmcoJzEyLzMxLzE5OTknKQogICAgICAgICAgICBwcmludCh0eXBlKHJlc3VsdCksIHJlcHIocmVzdWx0KSkgIyAtPiA8Y2xhc3MgJ3B5cGFyc2luZy5QYXJzZVJlc3VsdHMnPiAoWycxMicsICcvJywgJzMxJywgJy8nLCAnMTk5OSddLCB7J2RheSc6IFsoJzE5OTknLCA0KV0sICd5ZWFyJzogWygnMTInLCAwKV0sICdtb250aCc6IFsoJzMxJywgMildfSkKICAgICAgICAgICAgCiAgICAgICAgICAgIHJlc3VsdF9kaWN0ID0gcmVzdWx0LmFzRGljdCgpCiAgICAgICAgICAgIHByaW50KHR5cGUocmVzdWx0X2RpY3QpLCByZXByKHJlc3VsdF9kaWN0KSkgIyAtPiA8Y2xhc3MgJ2RpY3QnPiB7J2RheSc6ICcxOTk5JywgJ3llYXInOiAnMTInLCAnbW9udGgnOiAnMzEnfQoKICAgICAgICAgICAgIyBldmVuIHRob3VnaCBhIFBhcnNlUmVzdWx0cyBzdXBwb3J0cyBkaWN0LWxpa2UgYWNjZXNzLCBzb21ldGltZSB5b3UganVzdCBuZWVkIHRvIGhhdmUgYSBkaWN0CiAgICAgICAgICAgIGltcG9ydCBqc29uCiAgICAgICAgICAgIHByaW50KGpzb24uZHVtcHMocmVzdWx0KSkgIyAtPiBFeGNlcHRpb246IFR5cGVFcnJvcjogLi4uIGlzIG5vdCBKU09OIHNlcmlhbGl6YWJsZQogICAgICAgICAgICBwcmludChqc29uLmR1bXBzKHJlc3VsdC5hc0RpY3QoKSkpICMgLT4geyJtb250aCI6ICIzMSIsICJkYXkiOiAiMTk5OSIsICJ5ZWFyIjogIjEyIn0KICAgICAgICAiIiIKICAgICAgICBpZiBQWV8zOgogICAgICAgICAgICBpdGVtX2ZuID0gc2VsZi5pdGVtcwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGl0ZW1fZm4gPSBzZWxmLml0ZXJpdGVtcwogICAgICAgICAgICAKICAgICAgICBkZWYgdG9JdGVtKG9iaik6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uob2JqLCBQYXJzZVJlc3VsdHMpOgogICAgICAgICAgICAgICAgaWYgb2JqLmhhc2tleXMoKToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2JqLmFzRGljdCgpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBbdG9JdGVtKHYpIGZvciB2IGluIG9ial0KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJldHVybiBvYmoKICAgICAgICAgICAgICAgIAogICAgICAgIHJldHVybiBkaWN0KChrLHRvSXRlbSh2KSkgZm9yIGssdiBpbiBpdGVtX2ZuKCkpCgogICAgZGVmIGNvcHkoIHNlbGYgKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm5zIGEgbmV3IGNvcHkgb2YgYSBDe1BhcnNlUmVzdWx0c30gb2JqZWN0LgogICAgICAgICIiIgogICAgICAgIHJldCA9IFBhcnNlUmVzdWx0cyggc2VsZi5fX3Rva2xpc3QgKQogICAgICAgIHJldC5fX3Rva2RpY3QgPSBzZWxmLl9fdG9rZGljdC5jb3B5KCkKICAgICAgICByZXQuX19wYXJlbnQgPSBzZWxmLl9fcGFyZW50CiAgICAgICAgcmV0Ll9fYWNjdW1OYW1lcy51cGRhdGUoIHNlbGYuX19hY2N1bU5hbWVzICkKICAgICAgICByZXQuX19uYW1lID0gc2VsZi5fX25hbWUKICAgICAgICByZXR1cm4gcmV0CgogICAgZGVmIGFzWE1MKCBzZWxmLCBkb2N0YWc9Tm9uZSwgbmFtZWRJdGVtc09ubHk9RmFsc2UsIGluZGVudD0iIiwgZm9ybWF0dGVkPVRydWUgKToKICAgICAgICAiIiIKICAgICAgICAoRGVwcmVjYXRlZCkgUmV0dXJucyB0aGUgcGFyc2UgcmVzdWx0cyBhcyBYTUwuIFRhZ3MgYXJlIGNyZWF0ZWQgZm9yIHRva2VucyBhbmQgbGlzdHMgdGhhdCBoYXZlIGRlZmluZWQgcmVzdWx0cyBuYW1lcy4KICAgICAgICAiIiIKICAgICAgICBubCA9ICJcbiIKICAgICAgICBvdXQgPSBbXQogICAgICAgIG5hbWVkSXRlbXMgPSBkaWN0KCh2WzFdLGspIGZvciAoayx2bGlzdCkgaW4gc2VsZi5fX3Rva2RpY3QuaXRlbXMoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdiBpbiB2bGlzdCkKICAgICAgICBuZXh0TGV2ZWxJbmRlbnQgPSBpbmRlbnQgKyAiICAiCgogICAgICAgICMgY29sbGFwc2Ugb3V0IGluZGVudHMgaWYgZm9ybWF0dGluZyBpcyBub3QgZGVzaXJlZAogICAgICAgIGlmIG5vdCBmb3JtYXR0ZWQ6CiAgICAgICAgICAgIGluZGVudCA9ICIiCiAgICAgICAgICAgIG5leHRMZXZlbEluZGVudCA9ICIiCiAgICAgICAgICAgIG5sID0gIiIKCiAgICAgICAgc2VsZlRhZyA9IE5vbmUKICAgICAgICBpZiBkb2N0YWcgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGZUYWcgPSBkb2N0YWcKICAgICAgICBlbHNlOgogICAgICAgICAgICBpZiBzZWxmLl9fbmFtZToKICAgICAgICAgICAgICAgIHNlbGZUYWcgPSBzZWxmLl9fbmFtZQoKICAgICAgICBpZiBub3Qgc2VsZlRhZzoKICAgICAgICAgICAgaWYgbmFtZWRJdGVtc09ubHk6CiAgICAgICAgICAgICAgICByZXR1cm4gIiIKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGZUYWcgPSAiSVRFTSIKCiAgICAgICAgb3V0ICs9IFsgbmwsIGluZGVudCwgIjwiLCBzZWxmVGFnLCAiPiIgXQoKICAgICAgICBmb3IgaSxyZXMgaW4gZW51bWVyYXRlKHNlbGYuX190b2tsaXN0KToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShyZXMsUGFyc2VSZXN1bHRzKToKICAgICAgICAgICAgICAgIGlmIGkgaW4gbmFtZWRJdGVtczoKICAgICAgICAgICAgICAgICAgICBvdXQgKz0gWyByZXMuYXNYTUwobmFtZWRJdGVtc1tpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVkSXRlbXNPbmx5IGFuZCBkb2N0YWcgaXMgTm9uZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRMZXZlbEluZGVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlZCldCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIG91dCArPSBbIHJlcy5hc1hNTChOb25lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZWRJdGVtc09ubHkgYW5kIGRvY3RhZyBpcyBOb25lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dExldmVsSW5kZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVkKV0KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgaW5kaXZpZHVhbCB0b2tlbiwgc2VlIGlmIHRoZXJlIGlzIGEgbmFtZSBmb3IgaXQKICAgICAgICAgICAgICAgIHJlc1RhZyA9IE5vbmUKICAgICAgICAgICAgICAgIGlmIGkgaW4gbmFtZWRJdGVtczoKICAgICAgICAgICAgICAgICAgICByZXNUYWcgPSBuYW1lZEl0ZW1zW2ldCiAgICAgICAgICAgICAgICBpZiBub3QgcmVzVGFnOgogICAgICAgICAgICAgICAgICAgIGlmIG5hbWVkSXRlbXNPbmx5OgogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc1RhZyA9ICJJVEVNIgogICAgICAgICAgICAgICAgeG1sQm9keVRleHQgPSBfeG1sX2VzY2FwZShfdXN0cihyZXMpKQogICAgICAgICAgICAgICAgb3V0ICs9IFsgbmwsIG5leHRMZXZlbEluZGVudCwgIjwiLCByZXNUYWcsICI+IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sQm9keVRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8LyIsIHJlc1RhZywgIj4iIF0KCiAgICAgICAgb3V0ICs9IFsgbmwsIGluZGVudCwgIjwvIiwgc2VsZlRhZywgIj4iIF0KICAgICAgICByZXR1cm4gIiIuam9pbihvdXQpCgogICAgZGVmIF9fbG9va3VwKHNlbGYsc3ViKToKICAgICAgICBmb3Igayx2bGlzdCBpbiBzZWxmLl9fdG9rZGljdC5pdGVtcygpOgogICAgICAgICAgICBmb3Igdixsb2MgaW4gdmxpc3Q6CiAgICAgICAgICAgICAgICBpZiBzdWIgaXMgdjoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gawogICAgICAgIHJldHVybiBOb25lCgogICAgZGVmIGdldE5hbWUoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJucyB0aGUgcmVzdWx0cyBuYW1lIGZvciB0aGlzIHRva2VuIGV4cHJlc3Npb24uIFVzZWZ1bCB3aGVuIHNldmVyYWwgCiAgICAgICAgZGlmZmVyZW50IGV4cHJlc3Npb25zIG1pZ2h0IG1hdGNoIGF0IGEgcGFydGljdWxhciBsb2NhdGlvbi4KCiAgICAgICAgRXhhbXBsZTo6CiAgICAgICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpCiAgICAgICAgICAgIHNzbl9leHByID0gUmVnZXgociJcZFxkXGQtXGRcZC1cZFxkXGRcZCIpCiAgICAgICAgICAgIGhvdXNlX251bWJlcl9leHByID0gU3VwcHJlc3MoJyMnKSArIFdvcmQobnVtcywgYWxwaGFudW1zKQogICAgICAgICAgICB1c2VyX2RhdGEgPSAoR3JvdXAoaG91c2VfbnVtYmVyX2V4cHIpKCJob3VzZV9udW1iZXIiKSAKICAgICAgICAgICAgICAgICAgICAgICAgfCBHcm91cChzc25fZXhwcikoInNzbiIpCiAgICAgICAgICAgICAgICAgICAgICAgIHwgR3JvdXAoaW50ZWdlcikoImFnZSIpKQogICAgICAgICAgICB1c2VyX2luZm8gPSBPbmVPck1vcmUodXNlcl9kYXRhKQogICAgICAgICAgICAKICAgICAgICAgICAgcmVzdWx0ID0gdXNlcl9pbmZvLnBhcnNlU3RyaW5nKCIyMiAxMTEtMjItMzMzMyAjMjIxQiIpCiAgICAgICAgICAgIGZvciBpdGVtIGluIHJlc3VsdDoKICAgICAgICAgICAgICAgIHByaW50KGl0ZW0uZ2V0TmFtZSgpLCAnOicsIGl0ZW1bMF0pCiAgICAgICAgcHJpbnRzOjoKICAgICAgICAgICAgYWdlIDogMjIKICAgICAgICAgICAgc3NuIDogMTExLTIyLTMzMzMKICAgICAgICAgICAgaG91c2VfbnVtYmVyIDogMjIxQgogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYuX19uYW1lOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fX25hbWUKICAgICAgICBlbGlmIHNlbGYuX19wYXJlbnQ6CiAgICAgICAgICAgIHBhciA9IHNlbGYuX19wYXJlbnQoKQogICAgICAgICAgICBpZiBwYXI6CiAgICAgICAgICAgICAgICByZXR1cm4gcGFyLl9fbG9va3VwKHNlbGYpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIGVsaWYgKGxlbihzZWxmKSA9PSAxIGFuZAogICAgICAgICAgICAgICBsZW4oc2VsZi5fX3Rva2RpY3QpID09IDEgYW5kCiAgICAgICAgICAgICAgIG5leHQoaXRlcihzZWxmLl9fdG9rZGljdC52YWx1ZXMoKSkpWzBdWzFdIGluICgwLC0xKSk6CiAgICAgICAgICAgIHJldHVybiBuZXh0KGl0ZXIoc2VsZi5fX3Rva2RpY3Qua2V5cygpKSkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgIGRlZiBkdW1wKHNlbGYsIGluZGVudD0nJywgZGVwdGg9MCwgZnVsbD1UcnVlKToKICAgICAgICAiIiIKICAgICAgICBEaWFnbm9zdGljIG1ldGhvZCBmb3IgbGlzdGluZyBvdXQgdGhlIGNvbnRlbnRzIG9mIGEgQ3tQYXJzZVJlc3VsdHN9LgogICAgICAgIEFjY2VwdHMgYW4gb3B0aW9uYWwgQ3tpbmRlbnR9IGFyZ3VtZW50IHNvIHRoYXQgdGhpcyBzdHJpbmcgY2FuIGJlIGVtYmVkZGVkCiAgICAgICAgaW4gYSBuZXN0ZWQgZGlzcGxheSBvZiBvdGhlciBkYXRhLgoKICAgICAgICBFeGFtcGxlOjoKICAgICAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykKICAgICAgICAgICAgZGF0ZV9zdHIgPSBpbnRlZ2VyKCJ5ZWFyIikgKyAnLycgKyBpbnRlZ2VyKCJtb250aCIpICsgJy8nICsgaW50ZWdlcigiZGF5IikKICAgICAgICAgICAgCiAgICAgICAgICAgIHJlc3VsdCA9IGRhdGVfc3RyLnBhcnNlU3RyaW5nKCcxMi8zMS8xOTk5JykKICAgICAgICAgICAgcHJpbnQocmVzdWx0LmR1bXAoKSkKICAgICAgICBwcmludHM6OgogICAgICAgICAgICBbJzEyJywgJy8nLCAnMzEnLCAnLycsICcxOTk5J10KICAgICAgICAgICAgLSBkYXk6IDE5OTkKICAgICAgICAgICAgLSBtb250aDogMzEKICAgICAgICAgICAgLSB5ZWFyOiAxMgogICAgICAgICIiIgogICAgICAgIG91dCA9IFtdCiAgICAgICAgTkwgPSAnXG4nCiAgICAgICAgb3V0LmFwcGVuZCggaW5kZW50K191c3RyKHNlbGYuYXNMaXN0KCkpICkKICAgICAgICBpZiBmdWxsOgogICAgICAgICAgICBpZiBzZWxmLmhhc2tleXMoKToKICAgICAgICAgICAgICAgIGl0ZW1zID0gc29ydGVkKChzdHIoayksIHYpIGZvciBrLHYgaW4gc2VsZi5pdGVtcygpKQogICAgICAgICAgICAgICAgZm9yIGssdiBpbiBpdGVtczoKICAgICAgICAgICAgICAgICAgICBpZiBvdXQ6CiAgICAgICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoTkwpCiAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZCggIiVzJXMtICVzOiAiICUgKGluZGVudCwoJyAgJypkZXB0aCksIGspICkKICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHYsUGFyc2VSZXN1bHRzKToKICAgICAgICAgICAgICAgICAgICAgICAgaWYgdjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoIHYuZHVtcChpbmRlbnQsZGVwdGgrMSkgKQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZChfdXN0cih2KSkKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKHJlcHIodikpCiAgICAgICAgICAgIGVsaWYgYW55KGlzaW5zdGFuY2UodnYsUGFyc2VSZXN1bHRzKSBmb3IgdnYgaW4gc2VsZik6CiAgICAgICAgICAgICAgICB2ID0gc2VsZgogICAgICAgICAgICAgICAgZm9yIGksdnYgaW4gZW51bWVyYXRlKHYpOgogICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodnYsUGFyc2VSZXN1bHRzKToKICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZCgiXG4lcyVzWyVkXTpcbiVzJXMlcyIgJSAoaW5kZW50LCgnICAnKihkZXB0aCkpLGksaW5kZW50LCgnICAnKihkZXB0aCsxKSksdnYuZHVtcChpbmRlbnQsZGVwdGgrMSkgKSkKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCJcbiVzJXNbJWRdOlxuJXMlcyVzIiAlIChpbmRlbnQsKCcgICcqKGRlcHRoKSksaSxpbmRlbnQsKCcgICcqKGRlcHRoKzEpKSxfdXN0cih2dikpKQogICAgICAgICAgICAKICAgICAgICByZXR1cm4gIiIuam9pbihvdXQpCgogICAgZGVmIHBwcmludChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgICIiIgogICAgICAgIFByZXR0eS1wcmludGVyIGZvciBwYXJzZWQgcmVzdWx0cyBhcyBhIGxpc3QsIHVzaW5nIHRoZSBDe3BwcmludH0gbW9kdWxlLgogICAgICAgIEFjY2VwdHMgYWRkaXRpb25hbCBwb3NpdGlvbmFsIG9yIGtleXdvcmQgYXJncyBhcyBkZWZpbmVkIGZvciB0aGUgCiAgICAgICAgQ3twcHJpbnQucHByaW50fSBtZXRob2QuIChVe2h0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvMy9saWJyYXJ5L3BwcmludC5odG1sI3BwcmludC5wcHJpbnR9KQoKICAgICAgICBFeGFtcGxlOjoKICAgICAgICAgICAgaWRlbnQgPSBXb3JkKGFscGhhcywgYWxwaGFudW1zKQogICAgICAgICAgICBudW0gPSBXb3JkKG51bXMpCiAgICAgICAgICAgIGZ1bmMgPSBGb3J3YXJkKCkKICAgICAgICAgICAgdGVybSA9IGlkZW50IHwgbnVtIHwgR3JvdXAoJygnICsgZnVuYyArICcpJykKICAgICAgICAgICAgZnVuYyA8PD0gaWRlbnQgKyBHcm91cChPcHRpb25hbChkZWxpbWl0ZWRMaXN0KHRlcm0pKSkKICAgICAgICAgICAgcmVzdWx0ID0gZnVuYy5wYXJzZVN0cmluZygiZm5hIGEsYiwoZm5iIGMsZCwyMDApLDEwMCIpCiAgICAgICAgICAgIHJlc3VsdC5wcHJpbnQod2lkdGg9NDApCiAgICAgICAgcHJpbnRzOjoKICAgICAgICAgICAgWydmbmEnLAogICAgICAgICAgICAgWydhJywKICAgICAgICAgICAgICAnYicsCiAgICAgICAgICAgICAgWycoJywgJ2ZuYicsIFsnYycsICdkJywgJzIwMCddLCAnKSddLAogICAgICAgICAgICAgICcxMDAnXV0KICAgICAgICAiIiIKICAgICAgICBwcHJpbnQucHByaW50KHNlbGYuYXNMaXN0KCksICphcmdzLCAqKmt3YXJncykKCiAgICAjIGFkZCBzdXBwb3J0IGZvciBwaWNrbGUgcHJvdG9jb2wKICAgIGRlZiBfX2dldHN0YXRlX18oc2VsZik6CiAgICAgICAgcmV0dXJuICggc2VsZi5fX3Rva2xpc3QsCiAgICAgICAgICAgICAgICAgKCBzZWxmLl9fdG9rZGljdC5jb3B5KCksCiAgICAgICAgICAgICAgICAgICBzZWxmLl9fcGFyZW50IGlzIG5vdCBOb25lIGFuZCBzZWxmLl9fcGFyZW50KCkgb3IgTm9uZSwKICAgICAgICAgICAgICAgICAgIHNlbGYuX19hY2N1bU5hbWVzLAogICAgICAgICAgICAgICAgICAgc2VsZi5fX25hbWUgKSApCgogICAgZGVmIF9fc2V0c3RhdGVfXyhzZWxmLHN0YXRlKToKICAgICAgICBzZWxmLl9fdG9rbGlzdCA9IHN0YXRlWzBdCiAgICAgICAgKHNlbGYuX190b2tkaWN0LAogICAgICAgICBwYXIsCiAgICAgICAgIGluQWNjdW1OYW1lcywKICAgICAgICAgc2VsZi5fX25hbWUpID0gc3RhdGVbMV0KICAgICAgICBzZWxmLl9fYWNjdW1OYW1lcyA9IHt9CiAgICAgICAgc2VsZi5fX2FjY3VtTmFtZXMudXBkYXRlKGluQWNjdW1OYW1lcykKICAgICAgICBpZiBwYXIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGYuX19wYXJlbnQgPSB3a3JlZihwYXIpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5fX3BhcmVudCA9IE5vbmUKCiAgICBkZWYgX19nZXRuZXdhcmdzX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX190b2tsaXN0LCBzZWxmLl9fbmFtZSwgc2VsZi5fX2FzTGlzdCwgc2VsZi5fX21vZGFsCgogICAgZGVmIF9fZGlyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIChkaXIodHlwZShzZWxmKSkgKyBsaXN0KHNlbGYua2V5cygpKSkKCmNvbGxlY3Rpb25zLk11dGFibGVNYXBwaW5nLnJlZ2lzdGVyKFBhcnNlUmVzdWx0cykKCmRlZiBjb2wgKGxvYyxzdHJnKToKICAgICIiIlJldHVybnMgY3VycmVudCBjb2x1bW4gd2l0aGluIGEgc3RyaW5nLCBjb3VudGluZyBuZXdsaW5lcyBhcyBsaW5lIHNlcGFyYXRvcnMuCiAgIFRoZSBmaXJzdCBjb2x1bW4gaXMgbnVtYmVyIDEuCgogICBOb3RlOiB0aGUgZGVmYXVsdCBwYXJzaW5nIGJlaGF2aW9yIGlzIHRvIGV4cGFuZCB0YWJzIGluIHRoZSBpbnB1dCBzdHJpbmcKICAgYmVmb3JlIHN0YXJ0aW5nIHRoZSBwYXJzaW5nIHByb2Nlc3MuICBTZWUgTHtJe1BhcnNlckVsZW1lbnQucGFyc2VTdHJpbmd9PFBhcnNlckVsZW1lbnQucGFyc2VTdHJpbmc+fSBmb3IgbW9yZSBpbmZvcm1hdGlvbgogICBvbiBwYXJzaW5nIHN0cmluZ3MgY29udGFpbmluZyBDezxUQUI+fXMsIGFuZCBzdWdnZXN0ZWQgbWV0aG9kcyB0byBtYWludGFpbiBhCiAgIGNvbnNpc3RlbnQgdmlldyBvZiB0aGUgcGFyc2VkIHN0cmluZywgdGhlIHBhcnNlIGxvY2F0aW9uLCBhbmQgbGluZSBhbmQgY29sdW1uCiAgIHBvc2l0aW9ucyB3aXRoaW4gdGhlIHBhcnNlZCBzdHJpbmcuCiAgICIiIgogICAgcyA9IHN0cmcKICAgIHJldHVybiAxIGlmIDA8bG9jPGxlbihzKSBhbmQgc1tsb2MtMV0gPT0gJ1xuJyBlbHNlIGxvYyAtIHMucmZpbmQoIlxuIiwgMCwgbG9jKQoKZGVmIGxpbmVubyhsb2Msc3RyZyk6CiAgICAiIiJSZXR1cm5zIGN1cnJlbnQgbGluZSBudW1iZXIgd2l0aGluIGEgc3RyaW5nLCBjb3VudGluZyBuZXdsaW5lcyBhcyBsaW5lIHNlcGFyYXRvcnMuCiAgIFRoZSBmaXJzdCBsaW5lIGlzIG51bWJlciAxLgoKICAgTm90ZTogdGhlIGRlZmF1bHQgcGFyc2luZyBiZWhhdmlvciBpcyB0byBleHBhbmQgdGFicyBpbiB0aGUgaW5wdXQgc3RyaW5nCiAgIGJlZm9yZSBzdGFydGluZyB0aGUgcGFyc2luZyBwcm9jZXNzLiAgU2VlIEx7SXtQYXJzZXJFbGVtZW50LnBhcnNlU3RyaW5nfTxQYXJzZXJFbGVtZW50LnBhcnNlU3RyaW5nPn0gZm9yIG1vcmUgaW5mb3JtYXRpb24KICAgb24gcGFyc2luZyBzdHJpbmdzIGNvbnRhaW5pbmcgQ3s8VEFCPn1zLCBhbmQgc3VnZ2VzdGVkIG1ldGhvZHMgdG8gbWFpbnRhaW4gYQogICBjb25zaXN0ZW50IHZpZXcgb2YgdGhlIHBhcnNlZCBzdHJpbmcsIHRoZSBwYXJzZSBsb2NhdGlvbiwgYW5kIGxpbmUgYW5kIGNvbHVtbgogICBwb3NpdGlvbnMgd2l0aGluIHRoZSBwYXJzZWQgc3RyaW5nLgogICAiIiIKICAgIHJldHVybiBzdHJnLmNvdW50KCJcbiIsMCxsb2MpICsgMQoKZGVmIGxpbmUoIGxvYywgc3RyZyApOgogICAgIiIiUmV0dXJucyB0aGUgbGluZSBvZiB0ZXh0IGNvbnRhaW5pbmcgbG9jIHdpdGhpbiBhIHN0cmluZywgY291bnRpbmcgbmV3bGluZXMgYXMgbGluZSBzZXBhcmF0b3JzLgogICAgICAgIiIiCiAgICBsYXN0Q1IgPSBzdHJnLnJmaW5kKCJcbiIsIDAsIGxvYykKICAgIG5leHRDUiA9IHN0cmcuZmluZCgiXG4iLCBsb2MpCiAgICBpZiBuZXh0Q1IgPj0gMDoKICAgICAgICByZXR1cm4gc3RyZ1tsYXN0Q1IrMTpuZXh0Q1JdCiAgICBlbHNlOgogICAgICAgIHJldHVybiBzdHJnW2xhc3RDUisxOl0KCmRlZiBfZGVmYXVsdFN0YXJ0RGVidWdBY3Rpb24oIGluc3RyaW5nLCBsb2MsIGV4cHIgKToKICAgIHByaW50ICgoIk1hdGNoICIgKyBfdXN0cihleHByKSArICIgYXQgbG9jICIgKyBfdXN0cihsb2MpICsgIiglZCwlZCkiICUgKCBsaW5lbm8obG9jLGluc3RyaW5nKSwgY29sKGxvYyxpbnN0cmluZykgKSkpCgpkZWYgX2RlZmF1bHRTdWNjZXNzRGVidWdBY3Rpb24oIGluc3RyaW5nLCBzdGFydGxvYywgZW5kbG9jLCBleHByLCB0b2tzICk6CiAgICBwcmludCAoIk1hdGNoZWQgIiArIF91c3RyKGV4cHIpICsgIiAtPiAiICsgc3RyKHRva3MuYXNMaXN0KCkpKQoKZGVmIF9kZWZhdWx0RXhjZXB0aW9uRGVidWdBY3Rpb24oIGluc3RyaW5nLCBsb2MsIGV4cHIsIGV4YyApOgogICAgcHJpbnQgKCJFeGNlcHRpb24gcmFpc2VkOiIgKyBfdXN0cihleGMpKQoKZGVmIG51bGxEZWJ1Z0FjdGlvbigqYXJncyk6CiAgICAiIiInRG8tbm90aGluZycgZGVidWcgYWN0aW9uLCB0byBzdXBwcmVzcyBkZWJ1Z2dpbmcgb3V0cHV0IGR1cmluZyBwYXJzaW5nLiIiIgogICAgcGFzcwoKIyBPbmx5IHdvcmtzIG9uIFB5dGhvbiAzLnggLSBub25sb2NhbCBpcyB0b3hpYyB0byBQeXRob24gMiBpbnN0YWxscwojfiAnZGVjb3JhdG9yIHRvIHRyaW0gZnVuY3Rpb24gY2FsbHMgdG8gbWF0Y2ggdGhlIGFyaXR5IG9mIHRoZSB0YXJnZXQnCiN+IGRlZiBfdHJpbV9hcml0eShmdW5jLCBtYXhhcmdzPTMpOgogICAgI34gaWYgZnVuYyBpbiBzaW5nbGVBcmdCdWlsdGluczoKICAgICAgICAjfiByZXR1cm4gbGFtYmRhIHMsbCx0OiBmdW5jKHQpCiAgICAjfiBsaW1pdCA9IDAKICAgICN+IGZvdW5kQXJpdHkgPSBGYWxzZQogICAgI34gZGVmIHdyYXBwZXIoKmFyZ3MpOgogICAgICAgICN+IG5vbmxvY2FsIGxpbWl0LGZvdW5kQXJpdHkKICAgICAgICAjfiB3aGlsZSAxOgogICAgICAgICAgICAjfiB0cnk6CiAgICAgICAgICAgICAgICAjfiByZXQgPSBmdW5jKCphcmdzW2xpbWl0Ol0pCiAgICAgICAgICAgICAgICAjfiBmb3VuZEFyaXR5ID0gVHJ1ZQogICAgICAgICAgICAgICAgI34gcmV0dXJuIHJldAogICAgICAgICAgICAjfiBleGNlcHQgVHlwZUVycm9yOgogICAgICAgICAgICAgICAgI34gaWYgbGltaXQgPT0gbWF4YXJncyBvciBmb3VuZEFyaXR5OgogICAgICAgICAgICAgICAgICAgICN+IHJhaXNlCiAgICAgICAgICAgICAgICAjfiBsaW1pdCArPSAxCiAgICAgICAgICAgICAgICAjfiBjb250aW51ZQogICAgI34gcmV0dXJuIHdyYXBwZXIKCiMgdGhpcyB2ZXJzaW9uIGlzIFB5dGhvbiAyLngtMy54IGNyb3NzLWNvbXBhdGlibGUKJ2RlY29yYXRvciB0byB0cmltIGZ1bmN0aW9uIGNhbGxzIHRvIG1hdGNoIHRoZSBhcml0eSBvZiB0aGUgdGFyZ2V0JwpkZWYgX3RyaW1fYXJpdHkoZnVuYywgbWF4YXJncz0yKToKICAgIGlmIGZ1bmMgaW4gc2luZ2xlQXJnQnVpbHRpbnM6CiAgICAgICAgcmV0dXJuIGxhbWJkYSBzLGwsdDogZnVuYyh0KQogICAgbGltaXQgPSBbMF0KICAgIGZvdW5kQXJpdHkgPSBbRmFsc2VdCiAgICAKICAgICMgdHJhY2ViYWNrIHJldHVybiBkYXRhIHN0cnVjdHVyZSBjaGFuZ2VkIGluIFB5My41IC0gbm9ybWFsaXplIGJhY2sgdG8gcGxhaW4gdHVwbGVzCiAgICBpZiBzeXN0ZW1fdmVyc2lvbls6Ml0gPj0gKDMsNSk6CiAgICAgICAgZGVmIGV4dHJhY3Rfc3RhY2sobGltaXQ9MCk6CiAgICAgICAgICAgICMgc3BlY2lhbCBoYW5kbGluZyBmb3IgUHl0aG9uIDMuNS4wIC0gZXh0cmEgZGVlcCBjYWxsIHN0YWNrIGJ5IDEKICAgICAgICAgICAgb2Zmc2V0ID0gLTMgaWYgc3lzdGVtX3ZlcnNpb24gPT0gKDMsNSwwKSBlbHNlIC0yCiAgICAgICAgICAgIGZyYW1lX3N1bW1hcnkgPSB0cmFjZWJhY2suZXh0cmFjdF9zdGFjayhsaW1pdD0tb2Zmc2V0K2xpbWl0LTEpW29mZnNldF0KICAgICAgICAgICAgcmV0dXJuIFsoZnJhbWVfc3VtbWFyeS5maWxlbmFtZSwgZnJhbWVfc3VtbWFyeS5saW5lbm8pXQogICAgICAgIGRlZiBleHRyYWN0X3RiKHRiLCBsaW1pdD0wKToKICAgICAgICAgICAgZnJhbWVzID0gdHJhY2ViYWNrLmV4dHJhY3RfdGIodGIsIGxpbWl0PWxpbWl0KQogICAgICAgICAgICBmcmFtZV9zdW1tYXJ5ID0gZnJhbWVzWy0xXQogICAgICAgICAgICByZXR1cm4gWyhmcmFtZV9zdW1tYXJ5LmZpbGVuYW1lLCBmcmFtZV9zdW1tYXJ5LmxpbmVubyldCiAgICBlbHNlOgogICAgICAgIGV4dHJhY3Rfc3RhY2sgPSB0cmFjZWJhY2suZXh0cmFjdF9zdGFjawogICAgICAgIGV4dHJhY3RfdGIgPSB0cmFjZWJhY2suZXh0cmFjdF90YgogICAgCiAgICAjIHN5bnRoZXNpemUgd2hhdCB3b3VsZCBiZSByZXR1cm5lZCBieSB0cmFjZWJhY2suZXh0cmFjdF9zdGFjayBhdCB0aGUgY2FsbCB0byAKICAgICMgdXNlcidzIHBhcnNlIGFjdGlvbiAnZnVuYycsIHNvIHRoYXQgd2UgZG9uJ3QgaW5jdXIgY2FsbCBwZW5hbHR5IGF0IHBhcnNlIHRpbWUKICAgIAogICAgTElORV9ESUZGID0gNgogICAgIyBJRiBBTlkgQ09ERSBDSEFOR0VTLCBFVkVOIEpVU1QgQ09NTUVOVFMgT1IgQkxBTksgTElORVMsIEJFVFdFRU4gVEhFIE5FWFQgTElORSBBTkQgCiAgICAjIFRIRSBDQUxMIFRPIEZVTkMgSU5TSURFIFdSQVBQRVIsIExJTkVfRElGRiBNVVNUIEJFIE1PRElGSUVEISEhIQogICAgdGhpc19saW5lID0gZXh0cmFjdF9zdGFjayhsaW1pdD0yKVstMV0KICAgIHBhX2NhbGxfbGluZV9zeW50aCA9ICh0aGlzX2xpbmVbMF0sIHRoaXNfbGluZVsxXStMSU5FX0RJRkYpCgogICAgZGVmIHdyYXBwZXIoKmFyZ3MpOgogICAgICAgIHdoaWxlIDE6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHJldCA9IGZ1bmMoKmFyZ3NbbGltaXRbMF06XSkKICAgICAgICAgICAgICAgIGZvdW5kQXJpdHlbMF0gPSBUcnVlCiAgICAgICAgICAgICAgICByZXR1cm4gcmV0CiAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CiAgICAgICAgICAgICAgICAjIHJlLXJhaXNlIFR5cGVFcnJvcnMgaWYgdGhleSBkaWQgbm90IGNvbWUgZnJvbSBvdXIgYXJpdHkgdGVzdGluZwogICAgICAgICAgICAgICAgaWYgZm91bmRBcml0eVswXToKICAgICAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgIHRiID0gc3lzLmV4Y19pbmZvKClbLTFdCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBleHRyYWN0X3RiKHRiLCBsaW1pdD0yKVstMV1bOjJdID09IHBhX2NhbGxfbGluZV9zeW50aDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlCiAgICAgICAgICAgICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgICAgICAgICAgICAgZGVsIHRiCgogICAgICAgICAgICAgICAgaWYgbGltaXRbMF0gPD0gbWF4YXJnczoKICAgICAgICAgICAgICAgICAgICBsaW1pdFswXSArPSAxCiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIHJhaXNlCgogICAgIyBjb3B5IGZ1bmMgbmFtZSB0byB3cmFwcGVyIGZvciBzZW5zaWJsZSBkZWJ1ZyBvdXRwdXQKICAgIGZ1bmNfbmFtZSA9ICI8cGFyc2UgYWN0aW9uPiIKICAgIHRyeToKICAgICAgICBmdW5jX25hbWUgPSBnZXRhdHRyKGZ1bmMsICdfX25hbWVfXycsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0YXR0cihmdW5jLCAnX19jbGFzc19fJykuX19uYW1lX18pCiAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgIGZ1bmNfbmFtZSA9IHN0cihmdW5jKQogICAgd3JhcHBlci5fX25hbWVfXyA9IGZ1bmNfbmFtZQoKICAgIHJldHVybiB3cmFwcGVyCgpjbGFzcyBQYXJzZXJFbGVtZW50KG9iamVjdCk6CiAgICAiIiJBYnN0cmFjdCBiYXNlIGxldmVsIHBhcnNlciBlbGVtZW50IGNsYXNzLiIiIgogICAgREVGQVVMVF9XSElURV9DSEFSUyA9ICIgXG5cdFxyIgogICAgdmVyYm9zZV9zdGFja3RyYWNlID0gRmFsc2UKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgc2V0RGVmYXVsdFdoaXRlc3BhY2VDaGFycyggY2hhcnMgKToKICAgICAgICByIiIiCiAgICAgICAgT3ZlcnJpZGVzIHRoZSBkZWZhdWx0IHdoaXRlc3BhY2UgY2hhcnMKCiAgICAgICAgRXhhbXBsZTo6CiAgICAgICAgICAgICMgZGVmYXVsdCB3aGl0ZXNwYWNlIGNoYXJzIGFyZSBzcGFjZSwgPFRBQj4gYW5kIG5ld2xpbmUKICAgICAgICAgICAgT25lT3JNb3JlKFdvcmQoYWxwaGFzKSkucGFyc2VTdHJpbmcoImFiYyBkZWZcbmdoaSBqa2wiKSAgIyAtPiBbJ2FiYycsICdkZWYnLCAnZ2hpJywgJ2prbCddCiAgICAgICAgICAgIAogICAgICAgICAgICAjIGNoYW5nZSB0byBqdXN0IHRyZWF0IG5ld2xpbmUgYXMgc2lnbmlmaWNhbnQKICAgICAgICAgICAgUGFyc2VyRWxlbWVudC5zZXREZWZhdWx0V2hpdGVzcGFjZUNoYXJzKCIgXHQiKQogICAgICAgICAgICBPbmVPck1vcmUoV29yZChhbHBoYXMpKS5wYXJzZVN0cmluZygiYWJjIGRlZlxuZ2hpIGprbCIpICAjIC0+IFsnYWJjJywgJ2RlZiddCiAgICAgICAgIiIiCiAgICAgICAgUGFyc2VyRWxlbWVudC5ERUZBVUxUX1dISVRFX0NIQVJTID0gY2hhcnMKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgaW5saW5lTGl0ZXJhbHNVc2luZyhjbHMpOgogICAgICAgICIiIgogICAgICAgIFNldCBjbGFzcyB0byBiZSB1c2VkIGZvciBpbmNsdXNpb24gb2Ygc3RyaW5nIGxpdGVyYWxzIGludG8gYSBwYXJzZXIuCiAgICAgICAgCiAgICAgICAgRXhhbXBsZTo6CiAgICAgICAgICAgICMgZGVmYXVsdCBsaXRlcmFsIGNsYXNzIHVzZWQgaXMgTGl0ZXJhbAogICAgICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKQogICAgICAgICAgICBkYXRlX3N0ciA9IGludGVnZXIoInllYXIiKSArICcvJyArIGludGVnZXIoIm1vbnRoIikgKyAnLycgKyBpbnRlZ2VyKCJkYXkiKSAgICAgICAgICAgCgogICAgICAgICAgICBkYXRlX3N0ci5wYXJzZVN0cmluZygiMTk5OS8xMi8zMSIpICAjIC0+IFsnMTk5OScsICcvJywgJzEyJywgJy8nLCAnMzEnXQoKCiAgICAgICAgICAgICMgY2hhbmdlIHRvIFN1cHByZXNzCiAgICAgICAgICAgIFBhcnNlckVsZW1lbnQuaW5saW5lTGl0ZXJhbHNVc2luZyhTdXBwcmVzcykKICAgICAgICAgICAgZGF0ZV9zdHIgPSBpbnRlZ2VyKCJ5ZWFyIikgKyAnLycgKyBpbnRlZ2VyKCJtb250aCIpICsgJy8nICsgaW50ZWdlcigiZGF5IikgICAgICAgICAgIAoKICAgICAgICAgICAgZGF0ZV9zdHIucGFyc2VTdHJpbmcoIjE5OTkvMTIvMzEiKSAgIyAtPiBbJzE5OTknLCAnMTInLCAnMzEnXQogICAgICAgICIiIgogICAgICAgIFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyA9IGNscwoKICAgIGRlZiBfX2luaXRfXyggc2VsZiwgc2F2ZWxpc3Q9RmFsc2UgKToKICAgICAgICBzZWxmLnBhcnNlQWN0aW9uID0gbGlzdCgpCiAgICAgICAgc2VsZi5mYWlsQWN0aW9uID0gTm9uZQogICAgICAgICN+IHNlbGYubmFtZSA9ICI8dW5rbm93bj4iICAjIGRvbid0IGRlZmluZSBzZWxmLm5hbWUsIGxldCBzdWJjbGFzc2VzIHRyeS9leGNlcHQgdXBjYWxsCiAgICAgICAgc2VsZi5zdHJSZXByID0gTm9uZQogICAgICAgIHNlbGYucmVzdWx0c05hbWUgPSBOb25lCiAgICAgICAgc2VsZi5zYXZlQXNMaXN0ID0gc2F2ZWxpc3QKICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gVHJ1ZQogICAgICAgIHNlbGYud2hpdGVDaGFycyA9IFBhcnNlckVsZW1lbnQuREVGQVVMVF9XSElURV9DSEFSUwogICAgICAgIHNlbGYuY29weURlZmF1bHRXaGl0ZUNoYXJzID0gVHJ1ZQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBGYWxzZSAjIHVzZWQgd2hlbiBjaGVja2luZyBmb3IgbGVmdC1yZWN1cnNpb24KICAgICAgICBzZWxmLmtlZXBUYWJzID0gRmFsc2UKICAgICAgICBzZWxmLmlnbm9yZUV4cHJzID0gbGlzdCgpCiAgICAgICAgc2VsZi5kZWJ1ZyA9IEZhbHNlCiAgICAgICAgc2VsZi5zdHJlYW1saW5lZCA9IEZhbHNlCiAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gVHJ1ZSAjIHVzZWQgdG8gb3B0aW1pemUgZXhjZXB0aW9uIGhhbmRsaW5nIGZvciBzdWJjbGFzc2VzIHRoYXQgZG9uJ3QgYWR2YW5jZSBwYXJzZSBpbmRleAogICAgICAgIHNlbGYuZXJybXNnID0gIiIKICAgICAgICBzZWxmLm1vZGFsUmVzdWx0cyA9IFRydWUgIyB1c2VkIHRvIG1hcmsgcmVzdWx0cyBuYW1lcyBhcyBtb2RhbCAocmVwb3J0IG9ubHkgbGFzdCkgb3IgY3VtdWxhdGl2ZSAobGlzdCBhbGwpCiAgICAgICAgc2VsZi5kZWJ1Z0FjdGlvbnMgPSAoIE5vbmUsIE5vbmUsIE5vbmUgKSAjY3VzdG9tIGRlYnVnIGFjdGlvbnMKICAgICAgICBzZWxmLnJlID0gTm9uZQogICAgICAgIHNlbGYuY2FsbFByZXBhcnNlID0gVHJ1ZSAjIHVzZWQgdG8gYXZvaWQgcmVkdW5kYW50IGNhbGxzIHRvIHByZVBhcnNlCiAgICAgICAgc2VsZi5jYWxsRHVyaW5nVHJ5ID0gRmFsc2UKCiAgICBkZWYgY29weSggc2VsZiApOgogICAgICAgICIiIgogICAgICAgIE1ha2UgYSBjb3B5IG9mIHRoaXMgQ3tQYXJzZXJFbGVtZW50fS4gIFVzZWZ1bCBmb3IgZGVmaW5pbmcgZGlmZmVyZW50IHBhcnNlIGFjdGlvbnMKICAgICAgICBmb3IgdGhlIHNhbWUgcGFyc2luZyBwYXR0ZXJuLCB1c2luZyBjb3BpZXMgb2YgdGhlIG9yaWdpbmFsIHBhcnNlIGVsZW1lbnQuCiAgICAgICAgCiAgICAgICAgRXhhbXBsZTo6CiAgICAgICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0b2tzOiBpbnQodG9rc1swXSkpCiAgICAgICAgICAgIGludGVnZXJLID0gaW50ZWdlci5jb3B5KCkuYWRkUGFyc2VBY3Rpb24obGFtYmRhIHRva3M6IHRva3NbMF0qMTAyNCkgKyBTdXBwcmVzcygiSyIpCiAgICAgICAgICAgIGludGVnZXJNID0gaW50ZWdlci5jb3B5KCkuYWRkUGFyc2VBY3Rpb24obGFtYmRhIHRva3M6IHRva3NbMF0qMTAyNCoxMDI0KSArIFN1cHByZXNzKCJNIikKICAgICAgICAgICAgCiAgICAgICAgICAgIHByaW50KE9uZU9yTW9yZShpbnRlZ2VySyB8IGludGVnZXJNIHwgaW50ZWdlcikucGFyc2VTdHJpbmcoIjVLIDEwMCA2NDBLIDI1Nk0iKSkKICAgICAgICBwcmludHM6OgogICAgICAgICAgICBbNTEyMCwgMTAwLCA2NTUzNjAsIDI2ODQzNTQ1Nl0KICAgICAgICBFcXVpdmFsZW50IGZvcm0gb2YgQ3tleHByLmNvcHkoKX0gaXMganVzdCBDe2V4cHIoKX06OgogICAgICAgICAgICBpbnRlZ2VyTSA9IGludGVnZXIoKS5hZGRQYXJzZUFjdGlvbihsYW1iZGEgdG9rczogdG9rc1swXSoxMDI0KjEwMjQpICsgU3VwcHJlc3MoIk0iKQogICAgICAgICIiIgogICAgICAgIGNweSA9IGNvcHkuY29weSggc2VsZiApCiAgICAgICAgY3B5LnBhcnNlQWN0aW9uID0gc2VsZi5wYXJzZUFjdGlvbls6XQogICAgICAgIGNweS5pZ25vcmVFeHBycyA9IHNlbGYuaWdub3JlRXhwcnNbOl0KICAgICAgICBpZiBzZWxmLmNvcHlEZWZhdWx0V2hpdGVDaGFyczoKICAgICAgICAgICAgY3B5LndoaXRlQ2hhcnMgPSBQYXJzZXJFbGVtZW50LkRFRkFVTFRfV0hJVEVfQ0hBUlMKICAgICAgICByZXR1cm4gY3B5CgogICAgZGVmIHNldE5hbWUoIHNlbGYsIG5hbWUgKToKICAgICAgICAiIiIKICAgICAgICBEZWZpbmUgbmFtZSBmb3IgdGhpcyBleHByZXNzaW9uLCBtYWtlcyBkZWJ1Z2dpbmcgYW5kIGV4Y2VwdGlvbiBtZXNzYWdlcyBjbGVhcmVyLgogICAgICAgIAogICAgICAgIEV4YW1wbGU6OgogICAgICAgICAgICBXb3JkKG51bXMpLnBhcnNlU3RyaW5nKCJBQkMiKSAgIyAtPiBFeGNlcHRpb246IEV4cGVjdGVkIFc6KDAxMjMuLi4pIChhdCBjaGFyIDApLCAobGluZToxLCBjb2w6MSkKICAgICAgICAgICAgV29yZChudW1zKS5zZXROYW1lKCJpbnRlZ2VyIikucGFyc2VTdHJpbmcoIkFCQyIpICAjIC0+IEV4Y2VwdGlvbjogRXhwZWN0ZWQgaW50ZWdlciAoYXQgY2hhciAwKSwgKGxpbmU6MSwgY29sOjEpCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5uYW1lID0gbmFtZQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkICIgKyBzZWxmLm5hbWUKICAgICAgICBpZiBoYXNhdHRyKHNlbGYsImV4Y2VwdGlvbiIpOgogICAgICAgICAgICBzZWxmLmV4Y2VwdGlvbi5tc2cgPSBzZWxmLmVycm1zZwogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIHNldFJlc3VsdHNOYW1lKCBzZWxmLCBuYW1lLCBsaXN0QWxsTWF0Y2hlcz1GYWxzZSApOgogICAgICAgICIiIgogICAgICAgIERlZmluZSBuYW1lIGZvciByZWZlcmVuY2luZyBtYXRjaGluZyB0b2tlbnMgYXMgYSBuZXN0ZWQgYXR0cmlidXRlCiAgICAgICAgb2YgdGhlIHJldHVybmVkIHBhcnNlIHJlc3VsdHMuCiAgICAgICAgTk9URTogdGhpcyByZXR1cm5zIGEgKmNvcHkqIG9mIHRoZSBvcmlnaW5hbCBDe1BhcnNlckVsZW1lbnR9IG9iamVjdDsKICAgICAgICB0aGlzIGlzIHNvIHRoYXQgdGhlIGNsaWVudCBjYW4gZGVmaW5lIGEgYmFzaWMgZWxlbWVudCwgc3VjaCBhcyBhbgogICAgICAgIGludGVnZXIsIGFuZCByZWZlcmVuY2UgaXQgaW4gbXVsdGlwbGUgcGxhY2VzIHdpdGggZGlmZmVyZW50IG5hbWVzLgoKICAgICAgICBZb3UgY2FuIGFsc28gc2V0IHJlc3VsdHMgbmFtZXMgdXNpbmcgdGhlIGFiYnJldmlhdGVkIHN5bnRheCwKICAgICAgICBDe2V4cHIoIm5hbWUiKX0gaW4gcGxhY2Ugb2YgQ3tleHByLnNldFJlc3VsdHNOYW1lKCJuYW1lIil9IC0gCiAgICAgICAgc2VlIEx7SXtfX2NhbGxfX308X19jYWxsX18+fS4KCiAgICAgICAgRXhhbXBsZTo6CiAgICAgICAgICAgIGRhdGVfc3RyID0gKGludGVnZXIuc2V0UmVzdWx0c05hbWUoInllYXIiKSArICcvJyAKICAgICAgICAgICAgICAgICAgICAgICAgKyBpbnRlZ2VyLnNldFJlc3VsdHNOYW1lKCJtb250aCIpICsgJy8nIAogICAgICAgICAgICAgICAgICAgICAgICArIGludGVnZXIuc2V0UmVzdWx0c05hbWUoImRheSIpKQoKICAgICAgICAgICAgIyBlcXVpdmFsZW50IGZvcm06CiAgICAgICAgICAgIGRhdGVfc3RyID0gaW50ZWdlcigieWVhciIpICsgJy8nICsgaW50ZWdlcigibW9udGgiKSArICcvJyArIGludGVnZXIoImRheSIpCiAgICAgICAgIiIiCiAgICAgICAgbmV3c2VsZiA9IHNlbGYuY29weSgpCiAgICAgICAgaWYgbmFtZS5lbmRzd2l0aCgiKiIpOgogICAgICAgICAgICBuYW1lID0gbmFtZVs6LTFdCiAgICAgICAgICAgIGxpc3RBbGxNYXRjaGVzPVRydWUKICAgICAgICBuZXdzZWxmLnJlc3VsdHNOYW1lID0gbmFtZQogICAgICAgIG5ld3NlbGYubW9kYWxSZXN1bHRzID0gbm90IGxpc3RBbGxNYXRjaGVzCiAgICAgICAgcmV0dXJuIG5ld3NlbGYKCiAgICBkZWYgc2V0QnJlYWsoc2VsZixicmVha0ZsYWcgPSBUcnVlKToKICAgICAgICAiIiJNZXRob2QgdG8gaW52b2tlIHRoZSBQeXRob24gcGRiIGRlYnVnZ2VyIHdoZW4gdGhpcyBlbGVtZW50IGlzCiAgICAgICAgICAgYWJvdXQgdG8gYmUgcGFyc2VkLiBTZXQgQ3ticmVha0ZsYWd9IHRvIFRydWUgdG8gZW5hYmxlLCBGYWxzZSB0bwogICAgICAgICAgIGRpc2FibGUuCiAgICAgICAgIiIiCiAgICAgICAgaWYgYnJlYWtGbGFnOgogICAgICAgICAgICBfcGFyc2VNZXRob2QgPSBzZWxmLl9wYXJzZQogICAgICAgICAgICBkZWYgYnJlYWtlcihpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSwgY2FsbFByZVBhcnNlPVRydWUpOgogICAgICAgICAgICAgICAgaW1wb3J0IHBkYgogICAgICAgICAgICAgICAgcGRiLnNldF90cmFjZSgpCiAgICAgICAgICAgICAgICByZXR1cm4gX3BhcnNlTWV0aG9kKCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnMsIGNhbGxQcmVQYXJzZSApCiAgICAgICAgICAgIGJyZWFrZXIuX29yaWdpbmFsUGFyc2VNZXRob2QgPSBfcGFyc2VNZXRob2QKICAgICAgICAgICAgc2VsZi5fcGFyc2UgPSBicmVha2VyCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaWYgaGFzYXR0cihzZWxmLl9wYXJzZSwiX29yaWdpbmFsUGFyc2VNZXRob2QiKToKICAgICAgICAgICAgICAgIHNlbGYuX3BhcnNlID0gc2VsZi5fcGFyc2UuX29yaWdpbmFsUGFyc2VNZXRob2QKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBzZXRQYXJzZUFjdGlvbiggc2VsZiwgKmZucywgKiprd2FyZ3MgKToKICAgICAgICAiIiIKICAgICAgICBEZWZpbmUgYWN0aW9uIHRvIHBlcmZvcm0gd2hlbiBzdWNjZXNzZnVsbHkgbWF0Y2hpbmcgcGFyc2UgZWxlbWVudCBkZWZpbml0aW9uLgogICAgICAgIFBhcnNlIGFjdGlvbiBmbiBpcyBhIGNhbGxhYmxlIG1ldGhvZCB3aXRoIDAtMyBhcmd1bWVudHMsIGNhbGxlZCBhcyBDe2ZuKHMsbG9jLHRva3MpfSwKICAgICAgICBDe2ZuKGxvYyx0b2tzKX0sIEN7Zm4odG9rcyl9LCBvciBqdXN0IEN7Zm4oKX0sIHdoZXJlOgogICAgICAgICAtIHMgICA9IHRoZSBvcmlnaW5hbCBzdHJpbmcgYmVpbmcgcGFyc2VkIChzZWUgbm90ZSBiZWxvdykKICAgICAgICAgLSBsb2MgPSB0aGUgbG9jYXRpb24gb2YgdGhlIG1hdGNoaW5nIHN1YnN0cmluZwogICAgICAgICAtIHRva3MgPSBhIGxpc3Qgb2YgdGhlIG1hdGNoZWQgdG9rZW5zLCBwYWNrYWdlZCBhcyBhIEN7THtQYXJzZVJlc3VsdHN9fSBvYmplY3QKICAgICAgICBJZiB0aGUgZnVuY3Rpb25zIGluIGZucyBtb2RpZnkgdGhlIHRva2VucywgdGhleSBjYW4gcmV0dXJuIHRoZW0gYXMgdGhlIHJldHVybgogICAgICAgIHZhbHVlIGZyb20gZm4sIGFuZCB0aGUgbW9kaWZpZWQgbGlzdCBvZiB0b2tlbnMgd2lsbCByZXBsYWNlIHRoZSBvcmlnaW5hbC4KICAgICAgICBPdGhlcndpc2UsIGZuIGRvZXMgbm90IG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZS4KCiAgICAgICAgT3B0aW9uYWwga2V5d29yZCBhcmd1bWVudHM6CiAgICAgICAgIC0gY2FsbER1cmluZ1RyeSA9IChkZWZhdWx0PUN7RmFsc2V9KSBpbmRpY2F0ZSBpZiBwYXJzZSBhY3Rpb24gc2hvdWxkIGJlIHJ1biBkdXJpbmcgbG9va2FoZWFkcyBhbmQgYWx0ZXJuYXRlIHRlc3RpbmcKCiAgICAgICAgTm90ZTogdGhlIGRlZmF1bHQgcGFyc2luZyBiZWhhdmlvciBpcyB0byBleHBhbmQgdGFicyBpbiB0aGUgaW5wdXQgc3RyaW5nCiAgICAgICAgYmVmb3JlIHN0YXJ0aW5nIHRoZSBwYXJzaW5nIHByb2Nlc3MuICBTZWUgTHtJe3BhcnNlU3RyaW5nfTxwYXJzZVN0cmluZz59IGZvciBtb3JlIGluZm9ybWF0aW9uCiAgICAgICAgb24gcGFyc2luZyBzdHJpbmdzIGNvbnRhaW5pbmcgQ3s8VEFCPn1zLCBhbmQgc3VnZ2VzdGVkIG1ldGhvZHMgdG8gbWFpbnRhaW4gYQogICAgICAgIGNvbnNpc3RlbnQgdmlldyBvZiB0aGUgcGFyc2VkIHN0cmluZywgdGhlIHBhcnNlIGxvY2F0aW9uLCBhbmQgbGluZSBhbmQgY29sdW1uCiAgICAgICAgcG9zaXRpb25zIHdpdGhpbiB0aGUgcGFyc2VkIHN0cmluZy4KICAgICAgICAKICAgICAgICBFeGFtcGxlOjoKICAgICAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykKICAgICAgICAgICAgZGF0ZV9zdHIgPSBpbnRlZ2VyICsgJy8nICsgaW50ZWdlciArICcvJyArIGludGVnZXIKCiAgICAgICAgICAgIGRhdGVfc3RyLnBhcnNlU3RyaW5nKCIxOTk5LzEyLzMxIikgICMgLT4gWycxOTk5JywgJy8nLCAnMTInLCAnLycsICczMSddCgogICAgICAgICAgICAjIHVzZSBwYXJzZSBhY3Rpb24gdG8gY29udmVydCB0byBpbnRzIGF0IHBhcnNlIHRpbWUKICAgICAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHRva3M6IGludCh0b2tzWzBdKSkKICAgICAgICAgICAgZGF0ZV9zdHIgPSBpbnRlZ2VyICsgJy8nICsgaW50ZWdlciArICcvJyArIGludGVnZXIKCiAgICAgICAgICAgICMgbm90ZSB0aGF0IGludGVnZXIgZmllbGRzIGFyZSBub3cgaW50cywgbm90IHN0cmluZ3MKICAgICAgICAgICAgZGF0ZV9zdHIucGFyc2VTdHJpbmcoIjE5OTkvMTIvMzEiKSAgIyAtPiBbMTk5OSwgJy8nLCAxMiwgJy8nLCAzMV0KICAgICAgICAiIiIKICAgICAgICBzZWxmLnBhcnNlQWN0aW9uID0gbGlzdChtYXAoX3RyaW1fYXJpdHksIGxpc3QoZm5zKSkpCiAgICAgICAgc2VsZi5jYWxsRHVyaW5nVHJ5ID0ga3dhcmdzLmdldCgiY2FsbER1cmluZ1RyeSIsIEZhbHNlKQogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIGFkZFBhcnNlQWN0aW9uKCBzZWxmLCAqZm5zLCAqKmt3YXJncyApOgogICAgICAgICIiIgogICAgICAgIEFkZCBwYXJzZSBhY3Rpb24gdG8gZXhwcmVzc2lvbidzIGxpc3Qgb2YgcGFyc2UgYWN0aW9ucy4gU2VlIEx7SXtzZXRQYXJzZUFjdGlvbn08c2V0UGFyc2VBY3Rpb24+fS4KICAgICAgICAKICAgICAgICBTZWUgZXhhbXBsZXMgaW4gTHtJe2NvcHl9PGNvcHk+fS4KICAgICAgICAiIiIKICAgICAgICBzZWxmLnBhcnNlQWN0aW9uICs9IGxpc3QobWFwKF90cmltX2FyaXR5LCBsaXN0KGZucykpKQogICAgICAgIHNlbGYuY2FsbER1cmluZ1RyeSA9IHNlbGYuY2FsbER1cmluZ1RyeSBvciBrd2FyZ3MuZ2V0KCJjYWxsRHVyaW5nVHJ5IiwgRmFsc2UpCiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgYWRkQ29uZGl0aW9uKHNlbGYsICpmbnMsICoqa3dhcmdzKToKICAgICAgICAiIiJBZGQgYSBib29sZWFuIHByZWRpY2F0ZSBmdW5jdGlvbiB0byBleHByZXNzaW9uJ3MgbGlzdCBvZiBwYXJzZSBhY3Rpb25zLiBTZWUgCiAgICAgICAgTHtJe3NldFBhcnNlQWN0aW9ufTxzZXRQYXJzZUFjdGlvbj59IGZvciBmdW5jdGlvbiBjYWxsIHNpZ25hdHVyZXMuIFVubGlrZSBDe3NldFBhcnNlQWN0aW9ufSwgCiAgICAgICAgZnVuY3Rpb25zIHBhc3NlZCB0byBDe2FkZENvbmRpdGlvbn0gbmVlZCB0byByZXR1cm4gYm9vbGVhbiBzdWNjZXNzL2ZhaWwgb2YgdGhlIGNvbmRpdGlvbi4KCiAgICAgICAgT3B0aW9uYWwga2V5d29yZCBhcmd1bWVudHM6CiAgICAgICAgIC0gbWVzc2FnZSA9IGRlZmluZSBhIGN1c3RvbSBtZXNzYWdlIHRvIGJlIHVzZWQgaW4gdGhlIHJhaXNlZCBleGNlcHRpb24KICAgICAgICAgLSBmYXRhbCAgID0gaWYgVHJ1ZSwgd2lsbCByYWlzZSBQYXJzZUZhdGFsRXhjZXB0aW9uIHRvIHN0b3AgcGFyc2luZyBpbW1lZGlhdGVseTsgb3RoZXJ3aXNlIHdpbGwgcmFpc2UgUGFyc2VFeGNlcHRpb24KICAgICAgICAgCiAgICAgICAgRXhhbXBsZTo6CiAgICAgICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0b2tzOiBpbnQodG9rc1swXSkpCiAgICAgICAgICAgIHllYXJfaW50ID0gaW50ZWdlci5jb3B5KCkKICAgICAgICAgICAgeWVhcl9pbnQuYWRkQ29uZGl0aW9uKGxhbWJkYSB0b2tzOiB0b2tzWzBdID49IDIwMDAsIG1lc3NhZ2U9Ik9ubHkgc3VwcG9ydCB5ZWFycyAyMDAwIGFuZCBsYXRlciIpCiAgICAgICAgICAgIGRhdGVfc3RyID0geWVhcl9pbnQgKyAnLycgKyBpbnRlZ2VyICsgJy8nICsgaW50ZWdlcgoKICAgICAgICAgICAgcmVzdWx0ID0gZGF0ZV9zdHIucGFyc2VTdHJpbmcoIjE5OTkvMTIvMzEiKSAgIyAtPiBFeGNlcHRpb246IE9ubHkgc3VwcG9ydCB5ZWFycyAyMDAwIGFuZCBsYXRlciAoYXQgY2hhciAwKSwgKGxpbmU6MSwgY29sOjEpCiAgICAgICAgIiIiCiAgICAgICAgbXNnID0ga3dhcmdzLmdldCgibWVzc2FnZSIsICJmYWlsZWQgdXNlci1kZWZpbmVkIGNvbmRpdGlvbiIpCiAgICAgICAgZXhjX3R5cGUgPSBQYXJzZUZhdGFsRXhjZXB0aW9uIGlmIGt3YXJncy5nZXQoImZhdGFsIiwgRmFsc2UpIGVsc2UgUGFyc2VFeGNlcHRpb24KICAgICAgICBmb3IgZm4gaW4gZm5zOgogICAgICAgICAgICBkZWYgcGEocyxsLHQpOgogICAgICAgICAgICAgICAgaWYgbm90IGJvb2woX3RyaW1fYXJpdHkoZm4pKHMsbCx0KSk6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgZXhjX3R5cGUocyxsLG1zZykKICAgICAgICAgICAgc2VsZi5wYXJzZUFjdGlvbi5hcHBlbmQocGEpCiAgICAgICAgc2VsZi5jYWxsRHVyaW5nVHJ5ID0gc2VsZi5jYWxsRHVyaW5nVHJ5IG9yIGt3YXJncy5nZXQoImNhbGxEdXJpbmdUcnkiLCBGYWxzZSkKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBzZXRGYWlsQWN0aW9uKCBzZWxmLCBmbiApOgogICAgICAgICIiIkRlZmluZSBhY3Rpb24gdG8gcGVyZm9ybSBpZiBwYXJzaW5nIGZhaWxzIGF0IHRoaXMgZXhwcmVzc2lvbi4KICAgICAgICAgICBGYWlsIGFjdG9uIGZuIGlzIGEgY2FsbGFibGUgZnVuY3Rpb24gdGhhdCB0YWtlcyB0aGUgYXJndW1lbnRzCiAgICAgICAgICAgQ3tmbihzLGxvYyxleHByLGVycil9IHdoZXJlOgogICAgICAgICAgICAtIHMgPSBzdHJpbmcgYmVpbmcgcGFyc2VkCiAgICAgICAgICAgIC0gbG9jID0gbG9jYXRpb24gd2hlcmUgZXhwcmVzc2lvbiBtYXRjaCB3YXMgYXR0ZW1wdGVkIGFuZCBmYWlsZWQKICAgICAgICAgICAgLSBleHByID0gdGhlIHBhcnNlIGV4cHJlc3Npb24gdGhhdCBmYWlsZWQKICAgICAgICAgICAgLSBlcnIgPSB0aGUgZXhjZXB0aW9uIHRocm93bgogICAgICAgICAgIFRoZSBmdW5jdGlvbiByZXR1cm5zIG5vIHZhbHVlLiAgSXQgbWF5IHRocm93IEN7THtQYXJzZUZhdGFsRXhjZXB0aW9ufX0KICAgICAgICAgICBpZiBpdCBpcyBkZXNpcmVkIHRvIHN0b3AgcGFyc2luZyBpbW1lZGlhdGVseS4iIiIKICAgICAgICBzZWxmLmZhaWxBY3Rpb24gPSBmbgogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIF9za2lwSWdub3JhYmxlcyggc2VsZiwgaW5zdHJpbmcsIGxvYyApOgogICAgICAgIGV4cHJzRm91bmQgPSBUcnVlCiAgICAgICAgd2hpbGUgZXhwcnNGb3VuZDoKICAgICAgICAgICAgZXhwcnNGb3VuZCA9IEZhbHNlCiAgICAgICAgICAgIGZvciBlIGluIHNlbGYuaWdub3JlRXhwcnM6CiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgd2hpbGUgMToKICAgICAgICAgICAgICAgICAgICAgICAgbG9jLGR1bW15ID0gZS5fcGFyc2UoIGluc3RyaW5nLCBsb2MgKQogICAgICAgICAgICAgICAgICAgICAgICBleHByc0ZvdW5kID0gVHJ1ZQogICAgICAgICAgICAgICAgZXhjZXB0IFBhcnNlRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICByZXR1cm4gbG9jCgogICAgZGVmIHByZVBhcnNlKCBzZWxmLCBpbnN0cmluZywgbG9jICk6CiAgICAgICAgaWYgc2VsZi5pZ25vcmVFeHByczoKICAgICAgICAgICAgbG9jID0gc2VsZi5fc2tpcElnbm9yYWJsZXMoIGluc3RyaW5nLCBsb2MgKQoKICAgICAgICBpZiBzZWxmLnNraXBXaGl0ZXNwYWNlOgogICAgICAgICAgICB3dCA9IHNlbGYud2hpdGVDaGFycwogICAgICAgICAgICBpbnN0cmxlbiA9IGxlbihpbnN0cmluZykKICAgICAgICAgICAgd2hpbGUgbG9jIDwgaW5zdHJsZW4gYW5kIGluc3RyaW5nW2xvY10gaW4gd3Q6CiAgICAgICAgICAgICAgICBsb2MgKz0gMQoKICAgICAgICByZXR1cm4gbG9jCgogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToKICAgICAgICByZXR1cm4gbG9jLCBbXQoKICAgIGRlZiBwb3N0UGFyc2UoIHNlbGYsIGluc3RyaW5nLCBsb2MsIHRva2VubGlzdCApOgogICAgICAgIHJldHVybiB0b2tlbmxpc3QKCiAgICAjfiBAcHJvZmlsZQogICAgZGVmIF9wYXJzZU5vQ2FjaGUoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlLCBjYWxsUHJlUGFyc2U9VHJ1ZSApOgogICAgICAgIGRlYnVnZ2luZyA9ICggc2VsZi5kZWJ1ZyApICNhbmQgZG9BY3Rpb25zICkKCiAgICAgICAgaWYgZGVidWdnaW5nIG9yIHNlbGYuZmFpbEFjdGlvbjoKICAgICAgICAgICAgI34gcHJpbnQgKCJNYXRjaCIsc2VsZiwiYXQgbG9jIixsb2MsIiglZCwlZCkiICUgKCBsaW5lbm8obG9jLGluc3RyaW5nKSwgY29sKGxvYyxpbnN0cmluZykgKSkKICAgICAgICAgICAgaWYgKHNlbGYuZGVidWdBY3Rpb25zWzBdICk6CiAgICAgICAgICAgICAgICBzZWxmLmRlYnVnQWN0aW9uc1swXSggaW5zdHJpbmcsIGxvYywgc2VsZiApCiAgICAgICAgICAgIGlmIGNhbGxQcmVQYXJzZSBhbmQgc2VsZi5jYWxsUHJlcGFyc2U6CiAgICAgICAgICAgICAgICBwcmVsb2MgPSBzZWxmLnByZVBhcnNlKCBpbnN0cmluZywgbG9jICkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHByZWxvYyA9IGxvYwogICAgICAgICAgICB0b2tlbnNTdGFydCA9IHByZWxvYwogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgbG9jLHRva2VucyA9IHNlbGYucGFyc2VJbXBsKCBpbnN0cmluZywgcHJlbG9jLCBkb0FjdGlvbnMgKQogICAgICAgICAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oIGluc3RyaW5nLCBsZW4oaW5zdHJpbmcpLCBzZWxmLmVycm1zZywgc2VsZiApCiAgICAgICAgICAgIGV4Y2VwdCBQYXJzZUJhc2VFeGNlcHRpb24gYXMgZXJyOgogICAgICAgICAgICAgICAgI34gcHJpbnQgKCJFeGNlcHRpb24gcmFpc2VkOiIsIGVycikKICAgICAgICAgICAgICAgIGlmIHNlbGYuZGVidWdBY3Rpb25zWzJdOgogICAgICAgICAgICAgICAgICAgIHNlbGYuZGVidWdBY3Rpb25zWzJdKCBpbnN0cmluZywgdG9rZW5zU3RhcnQsIHNlbGYsIGVyciApCiAgICAgICAgICAgICAgICBpZiBzZWxmLmZhaWxBY3Rpb246CiAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsQWN0aW9uKCBpbnN0cmluZywgdG9rZW5zU3RhcnQsIHNlbGYsIGVyciApCiAgICAgICAgICAgICAgICByYWlzZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlmIGNhbGxQcmVQYXJzZSBhbmQgc2VsZi5jYWxsUHJlcGFyc2U6CiAgICAgICAgICAgICAgICBwcmVsb2MgPSBzZWxmLnByZVBhcnNlKCBpbnN0cmluZywgbG9jICkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHByZWxvYyA9IGxvYwogICAgICAgICAgICB0b2tlbnNTdGFydCA9IHByZWxvYwogICAgICAgICAgICBpZiBzZWxmLm1heUluZGV4RXJyb3Igb3IgbG9jID49IGxlbihpbnN0cmluZyk6CiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgbG9jLHRva2VucyA9IHNlbGYucGFyc2VJbXBsKCBpbnN0cmluZywgcHJlbG9jLCBkb0FjdGlvbnMgKQogICAgICAgICAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oIGluc3RyaW5nLCBsZW4oaW5zdHJpbmcpLCBzZWxmLmVycm1zZywgc2VsZiApCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBsb2MsdG9rZW5zID0gc2VsZi5wYXJzZUltcGwoIGluc3RyaW5nLCBwcmVsb2MsIGRvQWN0aW9ucyApCgogICAgICAgIHRva2VucyA9IHNlbGYucG9zdFBhcnNlKCBpbnN0cmluZywgbG9jLCB0b2tlbnMgKQoKICAgICAgICByZXRUb2tlbnMgPSBQYXJzZVJlc3VsdHMoIHRva2Vucywgc2VsZi5yZXN1bHRzTmFtZSwgYXNMaXN0PXNlbGYuc2F2ZUFzTGlzdCwgbW9kYWw9c2VsZi5tb2RhbFJlc3VsdHMgKQogICAgICAgIGlmIHNlbGYucGFyc2VBY3Rpb24gYW5kIChkb0FjdGlvbnMgb3Igc2VsZi5jYWxsRHVyaW5nVHJ5KToKICAgICAgICAgICAgaWYgZGVidWdnaW5nOgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIGZvciBmbiBpbiBzZWxmLnBhcnNlQWN0aW9uOgogICAgICAgICAgICAgICAgICAgICAgICB0b2tlbnMgPSBmbiggaW5zdHJpbmcsIHRva2Vuc1N0YXJ0LCByZXRUb2tlbnMgKQogICAgICAgICAgICAgICAgICAgICAgICBpZiB0b2tlbnMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRUb2tlbnMgPSBQYXJzZVJlc3VsdHMoIHRva2VucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXN1bHRzTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNMaXN0PXNlbGYuc2F2ZUFzTGlzdCBhbmQgaXNpbnN0YW5jZSh0b2tlbnMsKFBhcnNlUmVzdWx0cyxsaXN0KSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGFsPXNlbGYubW9kYWxSZXN1bHRzICkKICAgICAgICAgICAgICAgIGV4Y2VwdCBQYXJzZUJhc2VFeGNlcHRpb24gYXMgZXJyOgogICAgICAgICAgICAgICAgICAgICN+IHByaW50ICJFeGNlcHRpb24gcmFpc2VkIGluIHVzZXIgcGFyc2UgYWN0aW9uOiIsIGVycgogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmRlYnVnQWN0aW9uc1syXSApOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRlYnVnQWN0aW9uc1syXSggaW5zdHJpbmcsIHRva2Vuc1N0YXJ0LCBzZWxmLCBlcnIgKQogICAgICAgICAgICAgICAgICAgIHJhaXNlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBmb3IgZm4gaW4gc2VsZi5wYXJzZUFjdGlvbjoKICAgICAgICAgICAgICAgICAgICB0b2tlbnMgPSBmbiggaW5zdHJpbmcsIHRva2Vuc1N0YXJ0LCByZXRUb2tlbnMgKQogICAgICAgICAgICAgICAgICAgIGlmIHRva2VucyBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICAgICAgcmV0VG9rZW5zID0gUGFyc2VSZXN1bHRzKCB0b2tlbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXN1bHRzTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc0xpc3Q9c2VsZi5zYXZlQXNMaXN0IGFuZCBpc2luc3RhbmNlKHRva2VucywoUGFyc2VSZXN1bHRzLGxpc3QpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RhbD1zZWxmLm1vZGFsUmVzdWx0cyApCgogICAgICAgIGlmIGRlYnVnZ2luZzoKICAgICAgICAgICAgI34gcHJpbnQgKCJNYXRjaGVkIixzZWxmLCItPiIscmV0VG9rZW5zLmFzTGlzdCgpKQogICAgICAgICAgICBpZiAoc2VsZi5kZWJ1Z0FjdGlvbnNbMV0gKToKICAgICAgICAgICAgICAgIHNlbGYuZGVidWdBY3Rpb25zWzFdKCBpbnN0cmluZywgdG9rZW5zU3RhcnQsIGxvYywgc2VsZiwgcmV0VG9rZW5zICkKCiAgICAgICAgcmV0dXJuIGxvYywgcmV0VG9rZW5zCgogICAgZGVmIHRyeVBhcnNlKCBzZWxmLCBpbnN0cmluZywgbG9jICk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc2VsZi5fcGFyc2UoIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1GYWxzZSApWzBdCiAgICAgICAgZXhjZXB0IFBhcnNlRmF0YWxFeGNlcHRpb246CiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKCBpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikKICAgIAogICAgZGVmIGNhblBhcnNlTmV4dChzZWxmLCBpbnN0cmluZywgbG9jKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYudHJ5UGFyc2UoaW5zdHJpbmcsIGxvYykKICAgICAgICBleGNlcHQgKFBhcnNlRXhjZXB0aW9uLCBJbmRleEVycm9yKToKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICBjbGFzcyBfVW5ib3VuZGVkQ2FjaGUob2JqZWN0KToKICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgICAgIGNhY2hlID0ge30KICAgICAgICAgICAgc2VsZi5ub3RfaW5fY2FjaGUgPSBub3RfaW5fY2FjaGUgPSBvYmplY3QoKQoKICAgICAgICAgICAgZGVmIGdldChzZWxmLCBrZXkpOgogICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlLmdldChrZXksIG5vdF9pbl9jYWNoZSkKCiAgICAgICAgICAgIGRlZiBzZXQoc2VsZiwga2V5LCB2YWx1ZSk6CiAgICAgICAgICAgICAgICBjYWNoZVtrZXldID0gdmFsdWUKCiAgICAgICAgICAgIGRlZiBjbGVhcihzZWxmKToKICAgICAgICAgICAgICAgIGNhY2hlLmNsZWFyKCkKCiAgICAgICAgICAgIHNlbGYuZ2V0ID0gdHlwZXMuTWV0aG9kVHlwZShnZXQsIHNlbGYpCiAgICAgICAgICAgIHNlbGYuc2V0ID0gdHlwZXMuTWV0aG9kVHlwZShzZXQsIHNlbGYpCiAgICAgICAgICAgIHNlbGYuY2xlYXIgPSB0eXBlcy5NZXRob2RUeXBlKGNsZWFyLCBzZWxmKQoKICAgIGlmIF9PcmRlcmVkRGljdCBpcyBub3QgTm9uZToKICAgICAgICBjbGFzcyBfRmlmb0NhY2hlKG9iamVjdCk6CiAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzaXplKToKICAgICAgICAgICAgICAgIHNlbGYubm90X2luX2NhY2hlID0gbm90X2luX2NhY2hlID0gb2JqZWN0KCkKCiAgICAgICAgICAgICAgICBjYWNoZSA9IF9PcmRlcmVkRGljdCgpCgogICAgICAgICAgICAgICAgZGVmIGdldChzZWxmLCBrZXkpOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZS5nZXQoa2V5LCBub3RfaW5fY2FjaGUpCgogICAgICAgICAgICAgICAgZGVmIHNldChzZWxmLCBrZXksIHZhbHVlKToKICAgICAgICAgICAgICAgICAgICBjYWNoZVtrZXldID0gdmFsdWUKICAgICAgICAgICAgICAgICAgICBpZiBsZW4oY2FjaGUpID4gc2l6ZToKICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGUucG9waXRlbShGYWxzZSkKCiAgICAgICAgICAgICAgICBkZWYgY2xlYXIoc2VsZik6CiAgICAgICAgICAgICAgICAgICAgY2FjaGUuY2xlYXIoKQoKICAgICAgICAgICAgICAgIHNlbGYuZ2V0ID0gdHlwZXMuTWV0aG9kVHlwZShnZXQsIHNlbGYpCiAgICAgICAgICAgICAgICBzZWxmLnNldCA9IHR5cGVzLk1ldGhvZFR5cGUoc2V0LCBzZWxmKQogICAgICAgICAgICAgICAgc2VsZi5jbGVhciA9IHR5cGVzLk1ldGhvZFR5cGUoY2xlYXIsIHNlbGYpCgogICAgZWxzZToKICAgICAgICBjbGFzcyBfRmlmb0NhY2hlKG9iamVjdCk6CiAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzaXplKToKICAgICAgICAgICAgICAgIHNlbGYubm90X2luX2NhY2hlID0gbm90X2luX2NhY2hlID0gb2JqZWN0KCkKCiAgICAgICAgICAgICAgICBjYWNoZSA9IHt9CiAgICAgICAgICAgICAgICBrZXlfZmlmbyA9IGNvbGxlY3Rpb25zLmRlcXVlKFtdLCBzaXplKQoKICAgICAgICAgICAgICAgIGRlZiBnZXQoc2VsZiwga2V5KToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FjaGUuZ2V0KGtleSwgbm90X2luX2NhY2hlKQoKICAgICAgICAgICAgICAgIGRlZiBzZXQoc2VsZiwga2V5LCB2YWx1ZSk6CiAgICAgICAgICAgICAgICAgICAgY2FjaGVba2V5XSA9IHZhbHVlCiAgICAgICAgICAgICAgICAgICAgaWYgbGVuKGNhY2hlKSA+IHNpemU6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlLnBvcChrZXlfZmlmby5wb3BsZWZ0KCksIE5vbmUpCiAgICAgICAgICAgICAgICAgICAga2V5X2ZpZm8uYXBwZW5kKGtleSkKCiAgICAgICAgICAgICAgICBkZWYgY2xlYXIoc2VsZik6CiAgICAgICAgICAgICAgICAgICAgY2FjaGUuY2xlYXIoKQogICAgICAgICAgICAgICAgICAgIGtleV9maWZvLmNsZWFyKCkKCiAgICAgICAgICAgICAgICBzZWxmLmdldCA9IHR5cGVzLk1ldGhvZFR5cGUoZ2V0LCBzZWxmKQogICAgICAgICAgICAgICAgc2VsZi5zZXQgPSB0eXBlcy5NZXRob2RUeXBlKHNldCwgc2VsZikKICAgICAgICAgICAgICAgIHNlbGYuY2xlYXIgPSB0eXBlcy5NZXRob2RUeXBlKGNsZWFyLCBzZWxmKQoKICAgICMgYXJndW1lbnQgY2FjaGUgZm9yIG9wdGltaXppbmcgcmVwZWF0ZWQgY2FsbHMgd2hlbiBiYWNrdHJhY2tpbmcgdGhyb3VnaCByZWN1cnNpdmUgZXhwcmVzc2lvbnMKICAgIHBhY2tyYXRfY2FjaGUgPSB7fSAjIHRoaXMgaXMgc2V0IGxhdGVyIGJ5IGVuYWJsZWRQYWNrcmF0KCk7IHRoaXMgaXMgaGVyZSBzbyB0aGF0IHJlc2V0Q2FjaGUoKSBkb2Vzbid0IGZhaWwKICAgIHBhY2tyYXRfY2FjaGVfbG9jayA9IFJMb2NrKCkKICAgIHBhY2tyYXRfY2FjaGVfc3RhdHMgPSBbMCwgMF0KCiAgICAjIHRoaXMgbWV0aG9kIGdldHMgcmVwZWF0ZWRseSBjYWxsZWQgZHVyaW5nIGJhY2t0cmFja2luZyB3aXRoIHRoZSBzYW1lIGFyZ3VtZW50cyAtCiAgICAjIHdlIGNhbiBjYWNoZSB0aGVzZSBhcmd1bWVudHMgYW5kIHNhdmUgb3Vyc2VsdmVzIHRoZSB0cm91YmxlIG9mIHJlLXBhcnNpbmcgdGhlIGNvbnRhaW5lZCBleHByZXNzaW9uCiAgICBkZWYgX3BhcnNlQ2FjaGUoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlLCBjYWxsUHJlUGFyc2U9VHJ1ZSApOgogICAgICAgIEhJVCwgTUlTUyA9IDAsIDEKICAgICAgICBsb29rdXAgPSAoc2VsZiwgaW5zdHJpbmcsIGxvYywgY2FsbFByZVBhcnNlLCBkb0FjdGlvbnMpCiAgICAgICAgd2l0aCBQYXJzZXJFbGVtZW50LnBhY2tyYXRfY2FjaGVfbG9jazoKICAgICAgICAgICAgY2FjaGUgPSBQYXJzZXJFbGVtZW50LnBhY2tyYXRfY2FjaGUKICAgICAgICAgICAgdmFsdWUgPSBjYWNoZS5nZXQobG9va3VwKQogICAgICAgICAgICBpZiB2YWx1ZSBpcyBjYWNoZS5ub3RfaW5fY2FjaGU6CiAgICAgICAgICAgICAgICBQYXJzZXJFbGVtZW50LnBhY2tyYXRfY2FjaGVfc3RhdHNbTUlTU10gKz0gMQogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gc2VsZi5fcGFyc2VOb0NhY2hlKGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucywgY2FsbFByZVBhcnNlKQogICAgICAgICAgICAgICAgZXhjZXB0IFBhcnNlQmFzZUV4Y2VwdGlvbiBhcyBwZToKICAgICAgICAgICAgICAgICAgICAjIGNhY2hlIGEgY29weSBvZiB0aGUgZXhjZXB0aW9uLCB3aXRob3V0IHRoZSB0cmFjZWJhY2sKICAgICAgICAgICAgICAgICAgICBjYWNoZS5zZXQobG9va3VwLCBwZS5fX2NsYXNzX18oKnBlLmFyZ3MpKQogICAgICAgICAgICAgICAgICAgIHJhaXNlCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGNhY2hlLnNldChsb29rdXAsICh2YWx1ZVswXSwgdmFsdWVbMV0uY29weSgpKSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIFBhcnNlckVsZW1lbnQucGFja3JhdF9jYWNoZV9zdGF0c1tISVRdICs9IDEKICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIEV4Y2VwdGlvbik6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgdmFsdWUKICAgICAgICAgICAgICAgIHJldHVybiAodmFsdWVbMF0sIHZhbHVlWzFdLmNvcHkoKSkKCiAgICBfcGFyc2UgPSBfcGFyc2VOb0NhY2hlCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIHJlc2V0Q2FjaGUoKToKICAgICAgICBQYXJzZXJFbGVtZW50LnBhY2tyYXRfY2FjaGUuY2xlYXIoKQogICAgICAgIFBhcnNlckVsZW1lbnQucGFja3JhdF9jYWNoZV9zdGF0c1s6XSA9IFswXSAqIGxlbihQYXJzZXJFbGVtZW50LnBhY2tyYXRfY2FjaGVfc3RhdHMpCgogICAgX3BhY2tyYXRFbmFibGVkID0gRmFsc2UKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBlbmFibGVQYWNrcmF0KGNhY2hlX3NpemVfbGltaXQ9MTI4KToKICAgICAgICAiIiJFbmFibGVzICJwYWNrcmF0IiBwYXJzaW5nLCB3aGljaCBhZGRzIG1lbW9pemluZyB0byB0aGUgcGFyc2luZyBsb2dpYy4KICAgICAgICAgICBSZXBlYXRlZCBwYXJzZSBhdHRlbXB0cyBhdCB0aGUgc2FtZSBzdHJpbmcgbG9jYXRpb24gKHdoaWNoIGhhcHBlbnMKICAgICAgICAgICBvZnRlbiBpbiBtYW55IGNvbXBsZXggZ3JhbW1hcnMpIGNhbiBpbW1lZGlhdGVseSByZXR1cm4gYSBjYWNoZWQgdmFsdWUsCiAgICAgICAgICAgaW5zdGVhZCBvZiByZS1leGVjdXRpbmcgcGFyc2luZy92YWxpZGF0aW5nIGNvZGUuICBNZW1vaXppbmcgaXMgZG9uZSBvZgogICAgICAgICAgIGJvdGggdmFsaWQgcmVzdWx0cyBhbmQgcGFyc2luZyBleGNlcHRpb25zLgogICAgICAgICAgIAogICAgICAgICAgIFBhcmFtZXRlcnM6CiAgICAgICAgICAgIC0gY2FjaGVfc2l6ZV9saW1pdCAtIChkZWZhdWx0PUN7MTI4fSkgLSBpZiBhbiBpbnRlZ2VyIHZhbHVlIGlzIHByb3ZpZGVkCiAgICAgICAgICAgICAgd2lsbCBsaW1pdCB0aGUgc2l6ZSBvZiB0aGUgcGFja3JhdCBjYWNoZTsgaWYgTm9uZSBpcyBwYXNzZWQsIHRoZW4KICAgICAgICAgICAgICB0aGUgY2FjaGUgc2l6ZSB3aWxsIGJlIHVuYm91bmRlZDsgaWYgMCBpcyBwYXNzZWQsIHRoZSBjYWNoZSB3aWxsCiAgICAgICAgICAgICAgYmUgZWZmZWN0aXZlbHkgZGlzYWJsZWQuCiAgICAgICAgICAgIAogICAgICAgICAgIFRoaXMgc3BlZWR1cCBtYXkgYnJlYWsgZXhpc3RpbmcgcHJvZ3JhbXMgdGhhdCB1c2UgcGFyc2UgYWN0aW9ucyB0aGF0CiAgICAgICAgICAgaGF2ZSBzaWRlLWVmZmVjdHMuICBGb3IgdGhpcyByZWFzb24sIHBhY2tyYXQgcGFyc2luZyBpcyBkaXNhYmxlZCB3aGVuCiAgICAgICAgICAgeW91IGZpcnN0IGltcG9ydCBweXBhcnNpbmcuICBUbyBhY3RpdmF0ZSB0aGUgcGFja3JhdCBmZWF0dXJlLCB5b3VyCiAgICAgICAgICAgcHJvZ3JhbSBtdXN0IGNhbGwgdGhlIGNsYXNzIG1ldGhvZCBDe1BhcnNlckVsZW1lbnQuZW5hYmxlUGFja3JhdCgpfS4gIElmCiAgICAgICAgICAgeW91ciBwcm9ncmFtIHVzZXMgQ3twc3ljb30gdG8gImNvbXBpbGUgYXMgeW91IGdvIiwgeW91IG11c3QgY2FsbAogICAgICAgICAgIEN7ZW5hYmxlUGFja3JhdH0gYmVmb3JlIGNhbGxpbmcgQ3twc3ljby5mdWxsKCl9LiAgSWYgeW91IGRvIG5vdCBkbyB0aGlzLAogICAgICAgICAgIFB5dGhvbiB3aWxsIGNyYXNoLiAgRm9yIGJlc3QgcmVzdWx0cywgY2FsbCBDe2VuYWJsZVBhY2tyYXQoKX0gaW1tZWRpYXRlbHkKICAgICAgICAgICBhZnRlciBpbXBvcnRpbmcgcHlwYXJzaW5nLgogICAgICAgICAgIAogICAgICAgICAgIEV4YW1wbGU6OgogICAgICAgICAgICAgICBpbXBvcnQgcHlwYXJzaW5nCiAgICAgICAgICAgICAgIHB5cGFyc2luZy5QYXJzZXJFbGVtZW50LmVuYWJsZVBhY2tyYXQoKQogICAgICAgICIiIgogICAgICAgIGlmIG5vdCBQYXJzZXJFbGVtZW50Ll9wYWNrcmF0RW5hYmxlZDoKICAgICAgICAgICAgUGFyc2VyRWxlbWVudC5fcGFja3JhdEVuYWJsZWQgPSBUcnVlCiAgICAgICAgICAgIGlmIGNhY2hlX3NpemVfbGltaXQgaXMgTm9uZToKICAgICAgICAgICAgICAgIFBhcnNlckVsZW1lbnQucGFja3JhdF9jYWNoZSA9IFBhcnNlckVsZW1lbnQuX1VuYm91bmRlZENhY2hlKCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIFBhcnNlckVsZW1lbnQucGFja3JhdF9jYWNoZSA9IFBhcnNlckVsZW1lbnQuX0ZpZm9DYWNoZShjYWNoZV9zaXplX2xpbWl0KQogICAgICAgICAgICBQYXJzZXJFbGVtZW50Ll9wYXJzZSA9IFBhcnNlckVsZW1lbnQuX3BhcnNlQ2FjaGUKCiAgICBkZWYgcGFyc2VTdHJpbmcoIHNlbGYsIGluc3RyaW5nLCBwYXJzZUFsbD1GYWxzZSApOgogICAgICAgICIiIgogICAgICAgIEV4ZWN1dGUgdGhlIHBhcnNlIGV4cHJlc3Npb24gd2l0aCB0aGUgZ2l2ZW4gc3RyaW5nLgogICAgICAgIFRoaXMgaXMgdGhlIG1haW4gaW50ZXJmYWNlIHRvIHRoZSBjbGllbnQgY29kZSwgb25jZSB0aGUgY29tcGxldGUKICAgICAgICBleHByZXNzaW9uIGhhcyBiZWVuIGJ1aWx0LgoKICAgICAgICBJZiB5b3Ugd2FudCB0aGUgZ3JhbW1hciB0byByZXF1aXJlIHRoYXQgdGhlIGVudGlyZSBpbnB1dCBzdHJpbmcgYmUKICAgICAgICBzdWNjZXNzZnVsbHkgcGFyc2VkLCB0aGVuIHNldCBDe3BhcnNlQWxsfSB0byBUcnVlIChlcXVpdmFsZW50IHRvIGVuZGluZwogICAgICAgIHRoZSBncmFtbWFyIHdpdGggQ3tMe1N0cmluZ0VuZCgpfX0pLgoKICAgICAgICBOb3RlOiBDe3BhcnNlU3RyaW5nfSBpbXBsaWNpdGx5IGNhbGxzIEN7ZXhwYW5kdGFicygpfSBvbiB0aGUgaW5wdXQgc3RyaW5nLAogICAgICAgIGluIG9yZGVyIHRvIHJlcG9ydCBwcm9wZXIgY29sdW1uIG51bWJlcnMgaW4gcGFyc2UgYWN0aW9ucy4KICAgICAgICBJZiB0aGUgaW5wdXQgc3RyaW5nIGNvbnRhaW5zIHRhYnMgYW5kCiAgICAgICAgdGhlIGdyYW1tYXIgdXNlcyBwYXJzZSBhY3Rpb25zIHRoYXQgdXNlIHRoZSBDe2xvY30gYXJndW1lbnQgdG8gaW5kZXggaW50byB0aGUKICAgICAgICBzdHJpbmcgYmVpbmcgcGFyc2VkLCB5b3UgY2FuIGVuc3VyZSB5b3UgaGF2ZSBhIGNvbnNpc3RlbnQgdmlldyBvZiB0aGUgaW5wdXQKICAgICAgICBzdHJpbmcgYnk6CiAgICAgICAgIC0gY2FsbGluZyBDe3BhcnNlV2l0aFRhYnN9IG9uIHlvdXIgZ3JhbW1hciBiZWZvcmUgY2FsbGluZyBDe3BhcnNlU3RyaW5nfQogICAgICAgICAgIChzZWUgTHtJe3BhcnNlV2l0aFRhYnN9PHBhcnNlV2l0aFRhYnM+fSkKICAgICAgICAgLSBkZWZpbmUgeW91ciBwYXJzZSBhY3Rpb24gdXNpbmcgdGhlIGZ1bGwgQ3socyxsb2MsdG9rcyl9IHNpZ25hdHVyZSwgYW5kCiAgICAgICAgICAgcmVmZXJlbmNlIHRoZSBpbnB1dCBzdHJpbmcgdXNpbmcgdGhlIHBhcnNlIGFjdGlvbidzIEN7c30gYXJndW1lbnQKICAgICAgICAgLSBleHBsaWN0bHkgZXhwYW5kIHRoZSB0YWJzIGluIHlvdXIgaW5wdXQgc3RyaW5nIGJlZm9yZSBjYWxsaW5nCiAgICAgICAgICAgQ3twYXJzZVN0cmluZ30KICAgICAgICAKICAgICAgICBFeGFtcGxlOjoKICAgICAgICAgICAgV29yZCgnYScpLnBhcnNlU3RyaW5nKCdhYWFhYWJhYWEnKSAgIyAtPiBbJ2FhYWFhJ10KICAgICAgICAgICAgV29yZCgnYScpLnBhcnNlU3RyaW5nKCdhYWFhYWJhYWEnLCBwYXJzZUFsbD1UcnVlKSAgIyAtPiBFeGNlcHRpb246IEV4cGVjdGVkIGVuZCBvZiB0ZXh0CiAgICAgICAgIiIiCiAgICAgICAgUGFyc2VyRWxlbWVudC5yZXNldENhY2hlKCkKICAgICAgICBpZiBub3Qgc2VsZi5zdHJlYW1saW5lZDoKICAgICAgICAgICAgc2VsZi5zdHJlYW1saW5lKCkKICAgICAgICAgICAgI34gc2VsZi5zYXZlQXNMaXN0ID0gVHJ1ZQogICAgICAgIGZvciBlIGluIHNlbGYuaWdub3JlRXhwcnM6CiAgICAgICAgICAgIGUuc3RyZWFtbGluZSgpCiAgICAgICAgaWYgbm90IHNlbGYua2VlcFRhYnM6CiAgICAgICAgICAgIGluc3RyaW5nID0gaW5zdHJpbmcuZXhwYW5kdGFicygpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBsb2MsIHRva2VucyA9IHNlbGYuX3BhcnNlKCBpbnN0cmluZywgMCApCiAgICAgICAgICAgIGlmIHBhcnNlQWxsOgogICAgICAgICAgICAgICAgbG9jID0gc2VsZi5wcmVQYXJzZSggaW5zdHJpbmcsIGxvYyApCiAgICAgICAgICAgICAgICBzZSA9IEVtcHR5KCkgKyBTdHJpbmdFbmQoKQogICAgICAgICAgICAgICAgc2UuX3BhcnNlKCBpbnN0cmluZywgbG9jICkKICAgICAgICBleGNlcHQgUGFyc2VCYXNlRXhjZXB0aW9uIGFzIGV4YzoKICAgICAgICAgICAgaWYgUGFyc2VyRWxlbWVudC52ZXJib3NlX3N0YWNrdHJhY2U6CiAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBjYXRjaCBhbmQgcmUtcmFpc2UgZXhjZXB0aW9uIGZyb20gaGVyZSwgY2xlYXJzIG91dCBweXBhcnNpbmcgaW50ZXJuYWwgc3RhY2sgdHJhY2UKICAgICAgICAgICAgICAgIHJhaXNlIGV4YwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiB0b2tlbnMKCiAgICBkZWYgc2NhblN0cmluZyggc2VsZiwgaW5zdHJpbmcsIG1heE1hdGNoZXM9X01BWF9JTlQsIG92ZXJsYXA9RmFsc2UgKToKICAgICAgICAiIiIKICAgICAgICBTY2FuIHRoZSBpbnB1dCBzdHJpbmcgZm9yIGV4cHJlc3Npb24gbWF0Y2hlcy4gIEVhY2ggbWF0Y2ggd2lsbCByZXR1cm4gdGhlCiAgICAgICAgbWF0Y2hpbmcgdG9rZW5zLCBzdGFydCBsb2NhdGlvbiwgYW5kIGVuZCBsb2NhdGlvbi4gIE1heSBiZSBjYWxsZWQgd2l0aCBvcHRpb25hbAogICAgICAgIEN7bWF4TWF0Y2hlc30gYXJndW1lbnQsIHRvIGNsaXAgc2Nhbm5pbmcgYWZ0ZXIgJ24nIG1hdGNoZXMgYXJlIGZvdW5kLiAgSWYKICAgICAgICBDe292ZXJsYXB9IGlzIHNwZWNpZmllZCwgdGhlbiBvdmVybGFwcGluZyBtYXRjaGVzIHdpbGwgYmUgcmVwb3J0ZWQuCgogICAgICAgIE5vdGUgdGhhdCB0aGUgc3RhcnQgYW5kIGVuZCBsb2NhdGlvbnMgYXJlIHJlcG9ydGVkIHJlbGF0aXZlIHRvIHRoZSBzdHJpbmcKICAgICAgICBiZWluZyBwYXJzZWQuICBTZWUgTHtJe3BhcnNlU3RyaW5nfTxwYXJzZVN0cmluZz59IGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHBhcnNpbmcKICAgICAgICBzdHJpbmdzIHdpdGggZW1iZWRkZWQgdGFicy4KCiAgICAgICAgRXhhbXBsZTo6CiAgICAgICAgICAgIHNvdXJjZSA9ICJzbGRqZjEyM2xzZGpqa2YzNDVzbGRramY4Nzlsa2pzZmQ5ODciCiAgICAgICAgICAgIHByaW50KHNvdXJjZSkKICAgICAgICAgICAgZm9yIHRva2VucyxzdGFydCxlbmQgaW4gV29yZChhbHBoYXMpLnNjYW5TdHJpbmcoc291cmNlKToKICAgICAgICAgICAgICAgIHByaW50KCcgJypzdGFydCArICdeJyooZW5kLXN0YXJ0KSkKICAgICAgICAgICAgICAgIHByaW50KCcgJypzdGFydCArIHRva2Vuc1swXSkKICAgICAgICAKICAgICAgICBwcmludHM6OgogICAgICAgIAogICAgICAgICAgICBzbGRqZjEyM2xzZGpqa2YzNDVzbGRramY4Nzlsa2pzZmQ5ODcKICAgICAgICAgICAgXl5eXl4KICAgICAgICAgICAgc2xkamYKICAgICAgICAgICAgICAgICAgICBeXl5eXl5eCiAgICAgICAgICAgICAgICAgICAgbHNkamprZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xka2pmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsa2pzZmQKICAgICAgICAiIiIKICAgICAgICBpZiBub3Qgc2VsZi5zdHJlYW1saW5lZDoKICAgICAgICAgICAgc2VsZi5zdHJlYW1saW5lKCkKICAgICAgICBmb3IgZSBpbiBzZWxmLmlnbm9yZUV4cHJzOgogICAgICAgICAgICBlLnN0cmVhbWxpbmUoKQoKICAgICAgICBpZiBub3Qgc2VsZi5rZWVwVGFiczoKICAgICAgICAgICAgaW5zdHJpbmcgPSBfdXN0cihpbnN0cmluZykuZXhwYW5kdGFicygpCiAgICAgICAgaW5zdHJsZW4gPSBsZW4oaW5zdHJpbmcpCiAgICAgICAgbG9jID0gMAogICAgICAgIHByZXBhcnNlRm4gPSBzZWxmLnByZVBhcnNlCiAgICAgICAgcGFyc2VGbiA9IHNlbGYuX3BhcnNlCiAgICAgICAgUGFyc2VyRWxlbWVudC5yZXNldENhY2hlKCkKICAgICAgICBtYXRjaGVzID0gMAogICAgICAgIHRyeToKICAgICAgICAgICAgd2hpbGUgbG9jIDw9IGluc3RybGVuIGFuZCBtYXRjaGVzIDwgbWF4TWF0Y2hlczoKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBwcmVsb2MgPSBwcmVwYXJzZUZuKCBpbnN0cmluZywgbG9jICkKICAgICAgICAgICAgICAgICAgICBuZXh0TG9jLHRva2VucyA9IHBhcnNlRm4oIGluc3RyaW5nLCBwcmVsb2MsIGNhbGxQcmVQYXJzZT1GYWxzZSApCiAgICAgICAgICAgICAgICBleGNlcHQgUGFyc2VFeGNlcHRpb246CiAgICAgICAgICAgICAgICAgICAgbG9jID0gcHJlbG9jKzEKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgaWYgbmV4dExvYyA+IGxvYzoKICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcyArPSAxCiAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIHRva2VucywgcHJlbG9jLCBuZXh0TG9jCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIG92ZXJsYXA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0bG9jID0gcHJlcGFyc2VGbiggaW5zdHJpbmcsIGxvYyApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBuZXh0bG9jID4gbG9jOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYyA9IG5leHRMb2MKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jICs9IDEKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYyA9IG5leHRMb2MKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBsb2MgPSBwcmVsb2MrMQogICAgICAgIGV4Y2VwdCBQYXJzZUJhc2VFeGNlcHRpb24gYXMgZXhjOgogICAgICAgICAgICBpZiBQYXJzZXJFbGVtZW50LnZlcmJvc2Vfc3RhY2t0cmFjZToKICAgICAgICAgICAgICAgIHJhaXNlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIGNhdGNoIGFuZCByZS1yYWlzZSBleGNlcHRpb24gZnJvbSBoZXJlLCBjbGVhcnMgb3V0IHB5cGFyc2luZyBpbnRlcm5hbCBzdGFjayB0cmFjZQogICAgICAgICAgICAgICAgcmFpc2UgZXhjCgogICAgZGVmIHRyYW5zZm9ybVN0cmluZyggc2VsZiwgaW5zdHJpbmcgKToKICAgICAgICAiIiIKICAgICAgICBFeHRlbnNpb24gdG8gQ3tMe3NjYW5TdHJpbmd9fSwgdG8gbW9kaWZ5IG1hdGNoaW5nIHRleHQgd2l0aCBtb2RpZmllZCB0b2tlbnMgdGhhdCBtYXkKICAgICAgICBiZSByZXR1cm5lZCBmcm9tIGEgcGFyc2UgYWN0aW9uLiAgVG8gdXNlIEN7dHJhbnNmb3JtU3RyaW5nfSwgZGVmaW5lIGEgZ3JhbW1hciBhbmQKICAgICAgICBhdHRhY2ggYSBwYXJzZSBhY3Rpb24gdG8gaXQgdGhhdCBtb2RpZmllcyB0aGUgcmV0dXJuZWQgdG9rZW4gbGlzdC4KICAgICAgICBJbnZva2luZyBDe3RyYW5zZm9ybVN0cmluZygpfSBvbiBhIHRhcmdldCBzdHJpbmcgd2lsbCB0aGVuIHNjYW4gZm9yIG1hdGNoZXMsCiAgICAgICAgYW5kIHJlcGxhY2UgdGhlIG1hdGNoZWQgdGV4dCBwYXR0ZXJucyBhY2NvcmRpbmcgdG8gdGhlIGxvZ2ljIGluIHRoZSBwYXJzZQogICAgICAgIGFjdGlvbi4gIEN7dHJhbnNmb3JtU3RyaW5nKCl9IHJldHVybnMgdGhlIHJlc3VsdGluZyB0cmFuc2Zvcm1lZCBzdHJpbmcuCiAgICAgICAgCiAgICAgICAgRXhhbXBsZTo6CiAgICAgICAgICAgIHdkID0gV29yZChhbHBoYXMpCiAgICAgICAgICAgIHdkLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0b2tzOiB0b2tzWzBdLnRpdGxlKCkpCiAgICAgICAgICAgIAogICAgICAgICAgICBwcmludCh3ZC50cmFuc2Zvcm1TdHJpbmcoIm5vdyBpcyB0aGUgd2ludGVyIG9mIG91ciBkaXNjb250ZW50IG1hZGUgZ2xvcmlvdXMgc3VtbWVyIGJ5IHRoaXMgc3VuIG9mIHlvcmsuIikpCiAgICAgICAgUHJpbnRzOjoKICAgICAgICAgICAgTm93IElzIFRoZSBXaW50ZXIgT2YgT3VyIERpc2NvbnRlbnQgTWFkZSBHbG9yaW91cyBTdW1tZXIgQnkgVGhpcyBTdW4gT2YgWW9yay4KICAgICAgICAiIiIKICAgICAgICBvdXQgPSBbXQogICAgICAgIGxhc3RFID0gMAogICAgICAgICMgZm9yY2UgcHJlc2VydmF0aW9uIG9mIDxUQUI+cywgdG8gbWluaW1pemUgdW53YW50ZWQgdHJhbnNmb3JtYXRpb24gb2Ygc3RyaW5nLCBhbmQgdG8KICAgICAgICAjIGtlZXAgc3RyaW5nIGxvY3Mgc3RyYWlnaHQgYmV0d2VlbiB0cmFuc2Zvcm1TdHJpbmcgYW5kIHNjYW5TdHJpbmcKICAgICAgICBzZWxmLmtlZXBUYWJzID0gVHJ1ZQogICAgICAgIHRyeToKICAgICAgICAgICAgZm9yIHQscyxlIGluIHNlbGYuc2NhblN0cmluZyggaW5zdHJpbmcgKToKICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoIGluc3RyaW5nW2xhc3RFOnNdICkKICAgICAgICAgICAgICAgIGlmIHQ6CiAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh0LFBhcnNlUmVzdWx0cyk6CiAgICAgICAgICAgICAgICAgICAgICAgIG91dCArPSB0LmFzTGlzdCgpCiAgICAgICAgICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKHQsbGlzdCk6CiAgICAgICAgICAgICAgICAgICAgICAgIG91dCArPSB0CiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZCh0KQogICAgICAgICAgICAgICAgbGFzdEUgPSBlCiAgICAgICAgICAgIG91dC5hcHBlbmQoaW5zdHJpbmdbbGFzdEU6XSkKICAgICAgICAgICAgb3V0ID0gW28gZm9yIG8gaW4gb3V0IGlmIG9dCiAgICAgICAgICAgIHJldHVybiAiIi5qb2luKG1hcChfdXN0cixfZmxhdHRlbihvdXQpKSkKICAgICAgICBleGNlcHQgUGFyc2VCYXNlRXhjZXB0aW9uIGFzIGV4YzoKICAgICAgICAgICAgaWYgUGFyc2VyRWxlbWVudC52ZXJib3NlX3N0YWNrdHJhY2U6CiAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBjYXRjaCBhbmQgcmUtcmFpc2UgZXhjZXB0aW9uIGZyb20gaGVyZSwgY2xlYXJzIG91dCBweXBhcnNpbmcgaW50ZXJuYWwgc3RhY2sgdHJhY2UKICAgICAgICAgICAgICAgIHJhaXNlIGV4YwoKICAgIGRlZiBzZWFyY2hTdHJpbmcoIHNlbGYsIGluc3RyaW5nLCBtYXhNYXRjaGVzPV9NQVhfSU5UICk6CiAgICAgICAgIiIiCiAgICAgICAgQW5vdGhlciBleHRlbnNpb24gdG8gQ3tMe3NjYW5TdHJpbmd9fSwgc2ltcGxpZnlpbmcgdGhlIGFjY2VzcyB0byB0aGUgdG9rZW5zIGZvdW5kCiAgICAgICAgdG8gbWF0Y2ggdGhlIGdpdmVuIHBhcnNlIGV4cHJlc3Npb24uICBNYXkgYmUgY2FsbGVkIHdpdGggb3B0aW9uYWwKICAgICAgICBDe21heE1hdGNoZXN9IGFyZ3VtZW50LCB0byBjbGlwIHNlYXJjaGluZyBhZnRlciAnbicgbWF0Y2hlcyBhcmUgZm91bmQuCiAgICAgICAgCiAgICAgICAgRXhhbXBsZTo6CiAgICAgICAgICAgICMgYSBjYXBpdGFsaXplZCB3b3JkIHN0YXJ0cyB3aXRoIGFuIHVwcGVyY2FzZSBsZXR0ZXIsIGZvbGxvd2VkIGJ5IHplcm8gb3IgbW9yZSBsb3dlcmNhc2UgbGV0dGVycwogICAgICAgICAgICBjYXBfd29yZCA9IFdvcmQoYWxwaGFzLnVwcGVyKCksIGFscGhhcy5sb3dlcigpKQogICAgICAgICAgICAKICAgICAgICAgICAgcHJpbnQoY2FwX3dvcmQuc2VhcmNoU3RyaW5nKCJNb3JlIHRoYW4gSXJvbiwgbW9yZSB0aGFuIExlYWQsIG1vcmUgdGhhbiBHb2xkIEkgbmVlZCBFbGVjdHJpY2l0eSIpKQogICAgICAgIHByaW50czo6CiAgICAgICAgICAgIFsnTW9yZScsICdJcm9uJywgJ0xlYWQnLCAnR29sZCcsICdJJ10KICAgICAgICAiIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBQYXJzZVJlc3VsdHMoWyB0IGZvciB0LHMsZSBpbiBzZWxmLnNjYW5TdHJpbmcoIGluc3RyaW5nLCBtYXhNYXRjaGVzICkgXSkKICAgICAgICBleGNlcHQgUGFyc2VCYXNlRXhjZXB0aW9uIGFzIGV4YzoKICAgICAgICAgICAgaWYgUGFyc2VyRWxlbWVudC52ZXJib3NlX3N0YWNrdHJhY2U6CiAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBjYXRjaCBhbmQgcmUtcmFpc2UgZXhjZXB0aW9uIGZyb20gaGVyZSwgY2xlYXJzIG91dCBweXBhcnNpbmcgaW50ZXJuYWwgc3RhY2sgdHJhY2UKICAgICAgICAgICAgICAgIHJhaXNlIGV4YwoKICAgIGRlZiBzcGxpdChzZWxmLCBpbnN0cmluZywgbWF4c3BsaXQ9X01BWF9JTlQsIGluY2x1ZGVTZXBhcmF0b3JzPUZhbHNlKToKICAgICAgICAiIiIKICAgICAgICBHZW5lcmF0b3IgbWV0aG9kIHRvIHNwbGl0IGEgc3RyaW5nIHVzaW5nIHRoZSBnaXZlbiBleHByZXNzaW9uIGFzIGEgc2VwYXJhdG9yLgogICAgICAgIE1heSBiZSBjYWxsZWQgd2l0aCBvcHRpb25hbCBDe21heHNwbGl0fSBhcmd1bWVudCwgdG8gbGltaXQgdGhlIG51bWJlciBvZiBzcGxpdHM7CiAgICAgICAgYW5kIHRoZSBvcHRpb25hbCBDe2luY2x1ZGVTZXBhcmF0b3JzfSBhcmd1bWVudCAoZGVmYXVsdD1De0ZhbHNlfSksIGlmIHRoZSBzZXBhcmF0aW5nCiAgICAgICAgbWF0Y2hpbmcgdGV4dCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIHNwbGl0IHJlc3VsdHMuCiAgICAgICAgCiAgICAgICAgRXhhbXBsZTo6ICAgICAgICAKICAgICAgICAgICAgcHVuYyA9IG9uZU9mKGxpc3QoIi4sOzovLSE/IikpCiAgICAgICAgICAgIHByaW50KGxpc3QocHVuYy5zcGxpdCgiVGhpcywgdGhpcz8sIHRoaXMgc2VudGVuY2UsIGlzIGJhZGx5IHB1bmN0dWF0ZWQhIikpKQogICAgICAgIHByaW50czo6CiAgICAgICAgICAgIFsnVGhpcycsICcgdGhpcycsICcnLCAnIHRoaXMgc2VudGVuY2UnLCAnIGlzIGJhZGx5IHB1bmN0dWF0ZWQnLCAnJ10KICAgICAgICAiIiIKICAgICAgICBzcGxpdHMgPSAwCiAgICAgICAgbGFzdCA9IDAKICAgICAgICBmb3IgdCxzLGUgaW4gc2VsZi5zY2FuU3RyaW5nKGluc3RyaW5nLCBtYXhNYXRjaGVzPW1heHNwbGl0KToKICAgICAgICAgICAgeWllbGQgaW5zdHJpbmdbbGFzdDpzXQogICAgICAgICAgICBpZiBpbmNsdWRlU2VwYXJhdG9yczoKICAgICAgICAgICAgICAgIHlpZWxkIHRbMF0KICAgICAgICAgICAgbGFzdCA9IGUKICAgICAgICB5aWVsZCBpbnN0cmluZ1tsYXN0Ol0KCiAgICBkZWYgX19hZGRfXyhzZWxmLCBvdGhlciApOgogICAgICAgICIiIgogICAgICAgIEltcGxlbWVudGF0aW9uIG9mICsgb3BlcmF0b3IgLSByZXR1cm5zIEN7THtBbmR9fS4gQWRkaW5nIHN0cmluZ3MgdG8gYSBQYXJzZXJFbGVtZW50CiAgICAgICAgY29udmVydHMgdGhlbSB0byBMe0xpdGVyYWx9cyBieSBkZWZhdWx0LgogICAgICAgIAogICAgICAgIEV4YW1wbGU6OgogICAgICAgICAgICBncmVldCA9IFdvcmQoYWxwaGFzKSArICIsIiArIFdvcmQoYWxwaGFzKSArICIhIgogICAgICAgICAgICBoZWxsbyA9ICJIZWxsbywgV29ybGQhIgogICAgICAgICAgICBwcmludCAoaGVsbG8sICItPiIsIGdyZWV0LnBhcnNlU3RyaW5nKGhlbGxvKSkKICAgICAgICBQcmludHM6OgogICAgICAgICAgICBIZWxsbywgV29ybGQhIC0+IFsnSGVsbG8nLCAnLCcsICdXb3JsZCcsICchJ10KICAgICAgICAiIiIKICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOgogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKCBvdGhlciwgUGFyc2VyRWxlbWVudCApOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJDYW5ub3QgY29tYmluZSBlbGVtZW50IG9mIHR5cGUgJXMgd2l0aCBQYXJzZXJFbGVtZW50IiAlIHR5cGUob3RoZXIpLAogICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICByZXR1cm4gQW5kKCBbIHNlbGYsIG90aGVyIF0gKQoKICAgIGRlZiBfX3JhZGRfXyhzZWxmLCBvdGhlciApOgogICAgICAgICIiIgogICAgICAgIEltcGxlbWVudGF0aW9uIG9mICsgb3BlcmF0b3Igd2hlbiBsZWZ0IG9wZXJhbmQgaXMgbm90IGEgQ3tMe1BhcnNlckVsZW1lbnR9fQogICAgICAgICIiIgogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6CiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBvdGhlciApCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoIG90aGVyLCBQYXJzZXJFbGVtZW50ICk6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkNhbm5vdCBjb21iaW5lIGVsZW1lbnQgb2YgdHlwZSAlcyB3aXRoIFBhcnNlckVsZW1lbnQiICUgdHlwZShvdGhlciksCiAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIHJldHVybiBvdGhlciArIHNlbGYKCiAgICBkZWYgX19zdWJfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgIiIiCiAgICAgICAgSW1wbGVtZW50YXRpb24gb2YgLSBvcGVyYXRvciwgcmV0dXJucyBDe0x7QW5kfX0gd2l0aCBlcnJvciBzdG9wCiAgICAgICAgIiIiCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToKICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIG90aGVyICkKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSggb3RoZXIsIFBhcnNlckVsZW1lbnQgKToKICAgICAgICAgICAgd2FybmluZ3Mud2FybigiQ2Fubm90IGNvbWJpbmUgZWxlbWVudCBvZiB0eXBlICVzIHdpdGggUGFyc2VyRWxlbWVudCIgJSB0eXBlKG90aGVyKSwKICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpCiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgcmV0dXJuIEFuZCggWyBzZWxmLCBBbmQuX0Vycm9yU3RvcCgpLCBvdGhlciBdICkKCiAgICBkZWYgX19yc3ViX18oc2VsZiwgb3RoZXIgKToKICAgICAgICAiIiIKICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiAtIG9wZXJhdG9yIHdoZW4gbGVmdCBvcGVyYW5kIGlzIG5vdCBhIEN7THtQYXJzZXJFbGVtZW50fX0KICAgICAgICAiIiIKICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOgogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKCBvdGhlciwgUGFyc2VyRWxlbWVudCApOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJDYW5ub3QgY29tYmluZSBlbGVtZW50IG9mIHR5cGUgJXMgd2l0aCBQYXJzZXJFbGVtZW50IiAlIHR5cGUob3RoZXIpLAogICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICByZXR1cm4gb3RoZXIgLSBzZWxmCgogICAgZGVmIF9fbXVsX18oc2VsZixvdGhlcik6CiAgICAgICAgIiIiCiAgICAgICAgSW1wbGVtZW50YXRpb24gb2YgKiBvcGVyYXRvciwgYWxsb3dzIHVzZSBvZiBDe2V4cHIgKiAzfSBpbiBwbGFjZSBvZgogICAgICAgIEN7ZXhwciArIGV4cHIgKyBleHByfS4gIEV4cHJlc3Npb25zIG1heSBhbHNvIG1lIG11bHRpcGxpZWQgYnkgYSAyLWludGVnZXIKICAgICAgICB0dXBsZSwgc2ltaWxhciB0byBDe3ttaW4sbWF4fX0gbXVsdGlwbGllcnMgaW4gcmVndWxhciBleHByZXNzaW9ucy4gIFR1cGxlcwogICAgICAgIG1heSBhbHNvIGluY2x1ZGUgQ3tOb25lfSBhcyBpbjoKICAgICAgICAgLSBDe2V4cHIqKG4sTm9uZSl9IG9yIEN7ZXhwcioobiwpfSBpcyBlcXVpdmFsZW50CiAgICAgICAgICAgICAgdG8gQ3tleHByKm4gKyBMe1plcm9Pck1vcmV9KGV4cHIpfQogICAgICAgICAgICAgIChyZWFkIGFzICJhdCBsZWFzdCBuIGluc3RhbmNlcyBvZiBDe2V4cHJ9IikKICAgICAgICAgLSBDe2V4cHIqKE5vbmUsbil9IGlzIGVxdWl2YWxlbnQgdG8gQ3tleHByKigwLG4pfQogICAgICAgICAgICAgIChyZWFkIGFzICIwIHRvIG4gaW5zdGFuY2VzIG9mIEN7ZXhwcn0iKQogICAgICAgICAtIEN7ZXhwciooTm9uZSxOb25lKX0gaXMgZXF1aXZhbGVudCB0byBDe0x7WmVyb09yTW9yZX0oZXhwcil9CiAgICAgICAgIC0gQ3tleHByKigxLE5vbmUpfSBpcyBlcXVpdmFsZW50IHRvIEN7THtPbmVPck1vcmV9KGV4cHIpfQoKICAgICAgICBOb3RlIHRoYXQgQ3tleHByKihOb25lLG4pfSBkb2VzIG5vdCByYWlzZSBhbiBleGNlcHRpb24gaWYKICAgICAgICBtb3JlIHRoYW4gbiBleHBycyBleGlzdCBpbiB0aGUgaW5wdXQgc3RyZWFtOyB0aGF0IGlzLAogICAgICAgIEN7ZXhwciooTm9uZSxuKX0gZG9lcyBub3QgZW5mb3JjZSBhIG1heGltdW0gbnVtYmVyIG9mIGV4cHIKICAgICAgICBvY2N1cnJlbmNlcy4gIElmIHRoaXMgYmVoYXZpb3IgaXMgZGVzaXJlZCwgdGhlbiB3cml0ZQogICAgICAgIEN7ZXhwciooTm9uZSxuKSArIH5leHByfQogICAgICAgICIiIgogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsaW50KToKICAgICAgICAgICAgbWluRWxlbWVudHMsIG9wdEVsZW1lbnRzID0gb3RoZXIsMAogICAgICAgIGVsaWYgaXNpbnN0YW5jZShvdGhlcix0dXBsZSk6CiAgICAgICAgICAgIG90aGVyID0gKG90aGVyICsgKE5vbmUsIE5vbmUpKVs6Ml0KICAgICAgICAgICAgaWYgb3RoZXJbMF0gaXMgTm9uZToKICAgICAgICAgICAgICAgIG90aGVyID0gKDAsIG90aGVyWzFdKQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyWzBdLGludCkgYW5kIG90aGVyWzFdIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBpZiBvdGhlclswXSA9PSAwOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBaZXJvT3JNb3JlKHNlbGYpCiAgICAgICAgICAgICAgICBpZiBvdGhlclswXSA9PSAxOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBPbmVPck1vcmUoc2VsZikKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYqb3RoZXJbMF0gKyBaZXJvT3JNb3JlKHNlbGYpCiAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShvdGhlclswXSxpbnQpIGFuZCBpc2luc3RhbmNlKG90aGVyWzFdLGludCk6CiAgICAgICAgICAgICAgICBtaW5FbGVtZW50cywgb3B0RWxlbWVudHMgPSBvdGhlcgogICAgICAgICAgICAgICAgb3B0RWxlbWVudHMgLT0gbWluRWxlbWVudHMKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiY2Fubm90IG11bHRpcGx5ICdQYXJzZXJFbGVtZW50JyBhbmQgKCclcycsJyVzJykgb2JqZWN0cyIsIHR5cGUob3RoZXJbMF0pLHR5cGUob3RoZXJbMV0pKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiY2Fubm90IG11bHRpcGx5ICdQYXJzZXJFbGVtZW50JyBhbmQgJyVzJyBvYmplY3RzIiwgdHlwZShvdGhlcikpCgogICAgICAgIGlmIG1pbkVsZW1lbnRzIDwgMDoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiY2Fubm90IG11bHRpcGx5IFBhcnNlckVsZW1lbnQgYnkgbmVnYXRpdmUgdmFsdWUiKQogICAgICAgIGlmIG9wdEVsZW1lbnRzIDwgMDoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigic2Vjb25kIHR1cGxlIHZhbHVlIG11c3QgYmUgZ3JlYXRlciBvciBlcXVhbCB0byBmaXJzdCB0dXBsZSB2YWx1ZSIpCiAgICAgICAgaWYgbWluRWxlbWVudHMgPT0gb3B0RWxlbWVudHMgPT0gMDoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiY2Fubm90IG11bHRpcGx5IFBhcnNlckVsZW1lbnQgYnkgMCBvciAoMCwwKSIpCgogICAgICAgIGlmIChvcHRFbGVtZW50cyk6CiAgICAgICAgICAgIGRlZiBtYWtlT3B0aW9uYWxMaXN0KG4pOgogICAgICAgICAgICAgICAgaWYgbj4xOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBPcHRpb25hbChzZWxmICsgbWFrZU9wdGlvbmFsTGlzdChuLTEpKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gT3B0aW9uYWwoc2VsZikKICAgICAgICAgICAgaWYgbWluRWxlbWVudHM6CiAgICAgICAgICAgICAgICBpZiBtaW5FbGVtZW50cyA9PSAxOgogICAgICAgICAgICAgICAgICAgIHJldCA9IHNlbGYgKyBtYWtlT3B0aW9uYWxMaXN0KG9wdEVsZW1lbnRzKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICByZXQgPSBBbmQoW3NlbGZdKm1pbkVsZW1lbnRzKSArIG1ha2VPcHRpb25hbExpc3Qob3B0RWxlbWVudHMpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXQgPSBtYWtlT3B0aW9uYWxMaXN0KG9wdEVsZW1lbnRzKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlmIG1pbkVsZW1lbnRzID09IDE6CiAgICAgICAgICAgICAgICByZXQgPSBzZWxmCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXQgPSBBbmQoW3NlbGZdKm1pbkVsZW1lbnRzKQogICAgICAgIHJldHVybiByZXQKCiAgICBkZWYgX19ybXVsX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmLl9fbXVsX18ob3RoZXIpCgogICAgZGVmIF9fb3JfXyhzZWxmLCBvdGhlciApOgogICAgICAgICIiIgogICAgICAgIEltcGxlbWVudGF0aW9uIG9mIHwgb3BlcmF0b3IgLSByZXR1cm5zIEN7THtNYXRjaEZpcnN0fX0KICAgICAgICAiIiIKICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOgogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKCBvdGhlciwgUGFyc2VyRWxlbWVudCApOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJDYW5ub3QgY29tYmluZSBlbGVtZW50IG9mIHR5cGUgJXMgd2l0aCBQYXJzZXJFbGVtZW50IiAlIHR5cGUob3RoZXIpLAogICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICByZXR1cm4gTWF0Y2hGaXJzdCggWyBzZWxmLCBvdGhlciBdICkKCiAgICBkZWYgX19yb3JfXyhzZWxmLCBvdGhlciApOgogICAgICAgICIiIgogICAgICAgIEltcGxlbWVudGF0aW9uIG9mIHwgb3BlcmF0b3Igd2hlbiBsZWZ0IG9wZXJhbmQgaXMgbm90IGEgQ3tMe1BhcnNlckVsZW1lbnR9fQogICAgICAgICIiIgogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6CiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBvdGhlciApCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoIG90aGVyLCBQYXJzZXJFbGVtZW50ICk6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkNhbm5vdCBjb21iaW5lIGVsZW1lbnQgb2YgdHlwZSAlcyB3aXRoIFBhcnNlckVsZW1lbnQiICUgdHlwZShvdGhlciksCiAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIHJldHVybiBvdGhlciB8IHNlbGYKCiAgICBkZWYgX194b3JfXyhzZWxmLCBvdGhlciApOgogICAgICAgICIiIgogICAgICAgIEltcGxlbWVudGF0aW9uIG9mIF4gb3BlcmF0b3IgLSByZXR1cm5zIEN7THtPcn19CiAgICAgICAgIiIiCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToKICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIG90aGVyICkKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSggb3RoZXIsIFBhcnNlckVsZW1lbnQgKToKICAgICAgICAgICAgd2FybmluZ3Mud2FybigiQ2Fubm90IGNvbWJpbmUgZWxlbWVudCBvZiB0eXBlICVzIHdpdGggUGFyc2VyRWxlbWVudCIgJSB0eXBlKG90aGVyKSwKICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpCiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgcmV0dXJuIE9yKCBbIHNlbGYsIG90aGVyIF0gKQoKICAgIGRlZiBfX3J4b3JfXyhzZWxmLCBvdGhlciApOgogICAgICAgICIiIgogICAgICAgIEltcGxlbWVudGF0aW9uIG9mIF4gb3BlcmF0b3Igd2hlbiBsZWZ0IG9wZXJhbmQgaXMgbm90IGEgQ3tMe1BhcnNlckVsZW1lbnR9fQogICAgICAgICIiIgogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6CiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBvdGhlciApCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoIG90aGVyLCBQYXJzZXJFbGVtZW50ICk6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkNhbm5vdCBjb21iaW5lIGVsZW1lbnQgb2YgdHlwZSAlcyB3aXRoIFBhcnNlckVsZW1lbnQiICUgdHlwZShvdGhlciksCiAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIHJldHVybiBvdGhlciBeIHNlbGYKCiAgICBkZWYgX19hbmRfXyhzZWxmLCBvdGhlciApOgogICAgICAgICIiIgogICAgICAgIEltcGxlbWVudGF0aW9uIG9mICYgb3BlcmF0b3IgLSByZXR1cm5zIEN7THtFYWNofX0KICAgICAgICAiIiIKICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOgogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKCBvdGhlciwgUGFyc2VyRWxlbWVudCApOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJDYW5ub3QgY29tYmluZSBlbGVtZW50IG9mIHR5cGUgJXMgd2l0aCBQYXJzZXJFbGVtZW50IiAlIHR5cGUob3RoZXIpLAogICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICByZXR1cm4gRWFjaCggWyBzZWxmLCBvdGhlciBdICkKCiAgICBkZWYgX19yYW5kX18oc2VsZiwgb3RoZXIgKToKICAgICAgICAiIiIKICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiAmIG9wZXJhdG9yIHdoZW4gbGVmdCBvcGVyYW5kIGlzIG5vdCBhIEN7THtQYXJzZXJFbGVtZW50fX0KICAgICAgICAiIiIKICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOgogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKCBvdGhlciwgUGFyc2VyRWxlbWVudCApOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJDYW5ub3QgY29tYmluZSBlbGVtZW50IG9mIHR5cGUgJXMgd2l0aCBQYXJzZXJFbGVtZW50IiAlIHR5cGUob3RoZXIpLAogICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICByZXR1cm4gb3RoZXIgJiBzZWxmCgogICAgZGVmIF9faW52ZXJ0X18oIHNlbGYgKToKICAgICAgICAiIiIKICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiB+IG9wZXJhdG9yIC0gcmV0dXJucyBDe0x7Tm90QW55fX0KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gTm90QW55KCBzZWxmICkKCiAgICBkZWYgX19jYWxsX18oc2VsZiwgbmFtZT1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBTaG9ydGN1dCBmb3IgQ3tMe3NldFJlc3VsdHNOYW1lfX0sIHdpdGggQ3tsaXN0QWxsTWF0Y2hlcz1GYWxzZX0uCiAgICAgICAgCiAgICAgICAgSWYgQ3tuYW1lfSBpcyBnaXZlbiB3aXRoIGEgdHJhaWxpbmcgQ3snKid9IGNoYXJhY3RlciwgdGhlbiBDe2xpc3RBbGxNYXRjaGVzfSB3aWxsIGJlCiAgICAgICAgcGFzc2VkIGFzIEN7VHJ1ZX0uCiAgICAgICAgICAgCiAgICAgICAgSWYgQ3tuYW1lfSBpcyBvbWl0dGVkLCBzYW1lIGFzIGNhbGxpbmcgQ3tMe2NvcHl9fS4KCiAgICAgICAgRXhhbXBsZTo6CiAgICAgICAgICAgICMgdGhlc2UgYXJlIGVxdWl2YWxlbnQKICAgICAgICAgICAgdXNlcmRhdGEgPSBXb3JkKGFscGhhcykuc2V0UmVzdWx0c05hbWUoIm5hbWUiKSArIFdvcmQobnVtcysiLSIpLnNldFJlc3VsdHNOYW1lKCJzb2NzZWNubyIpCiAgICAgICAgICAgIHVzZXJkYXRhID0gV29yZChhbHBoYXMpKCJuYW1lIikgKyBXb3JkKG51bXMrIi0iKSgic29jc2Vjbm8iKSAgICAgICAgICAgICAKICAgICAgICAiIiIKICAgICAgICBpZiBuYW1lIGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4gc2VsZi5zZXRSZXN1bHRzTmFtZShuYW1lKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmNvcHkoKQoKICAgIGRlZiBzdXBwcmVzcyggc2VsZiApOgogICAgICAgICIiIgogICAgICAgIFN1cHByZXNzZXMgdGhlIG91dHB1dCBvZiB0aGlzIEN7UGFyc2VyRWxlbWVudH07IHVzZWZ1bCB0byBrZWVwIHB1bmN0dWF0aW9uIGZyb20KICAgICAgICBjbHV0dGVyaW5nIHVwIHJldHVybmVkIG91dHB1dC4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gU3VwcHJlc3MoIHNlbGYgKQoKICAgIGRlZiBsZWF2ZVdoaXRlc3BhY2UoIHNlbGYgKToKICAgICAgICAiIiIKICAgICAgICBEaXNhYmxlcyB0aGUgc2tpcHBpbmcgb2Ygd2hpdGVzcGFjZSBiZWZvcmUgbWF0Y2hpbmcgdGhlIGNoYXJhY3RlcnMgaW4gdGhlCiAgICAgICAgQ3tQYXJzZXJFbGVtZW50fSdzIGRlZmluZWQgcGF0dGVybi4gIFRoaXMgaXMgbm9ybWFsbHkgb25seSB1c2VkIGludGVybmFsbHkgYnkKICAgICAgICB0aGUgcHlwYXJzaW5nIG1vZHVsZSwgYnV0IG1heSBiZSBuZWVkZWQgaW4gc29tZSB3aGl0ZXNwYWNlLXNlbnNpdGl2ZSBncmFtbWFycy4KICAgICAgICAiIiIKICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gRmFsc2UKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBzZXRXaGl0ZXNwYWNlQ2hhcnMoIHNlbGYsIGNoYXJzICk6CiAgICAgICAgIiIiCiAgICAgICAgT3ZlcnJpZGVzIHRoZSBkZWZhdWx0IHdoaXRlc3BhY2UgY2hhcnMKICAgICAgICAiIiIKICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gVHJ1ZQogICAgICAgIHNlbGYud2hpdGVDaGFycyA9IGNoYXJzCiAgICAgICAgc2VsZi5jb3B5RGVmYXVsdFdoaXRlQ2hhcnMgPSBGYWxzZQogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIHBhcnNlV2l0aFRhYnMoIHNlbGYgKToKICAgICAgICAiIiIKICAgICAgICBPdmVycmlkZXMgZGVmYXVsdCBiZWhhdmlvciB0byBleHBhbmQgQ3s8VEFCPn1zIHRvIHNwYWNlcyBiZWZvcmUgcGFyc2luZyB0aGUgaW5wdXQgc3RyaW5nLgogICAgICAgIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBDe3BhcnNlU3RyaW5nfSB3aGVuIHRoZSBpbnB1dCBncmFtbWFyIGNvbnRhaW5zIGVsZW1lbnRzIHRoYXQKICAgICAgICBtYXRjaCBDezxUQUI+fSBjaGFyYWN0ZXJzLgogICAgICAgICIiIgogICAgICAgIHNlbGYua2VlcFRhYnMgPSBUcnVlCiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgaWdub3JlKCBzZWxmLCBvdGhlciApOgogICAgICAgICIiIgogICAgICAgIERlZmluZSBleHByZXNzaW9uIHRvIGJlIGlnbm9yZWQgKGUuZy4sIGNvbW1lbnRzKSB3aGlsZSBkb2luZyBwYXR0ZXJuCiAgICAgICAgbWF0Y2hpbmc7IG1heSBiZSBjYWxsZWQgcmVwZWF0ZWRseSwgdG8gZGVmaW5lIG11bHRpcGxlIGNvbW1lbnQgb3Igb3RoZXIKICAgICAgICBpZ25vcmFibGUgcGF0dGVybnMuCiAgICAgICAgCiAgICAgICAgRXhhbXBsZTo6CiAgICAgICAgICAgIHBhdHQgPSBPbmVPck1vcmUoV29yZChhbHBoYXMpKQogICAgICAgICAgICBwYXR0LnBhcnNlU3RyaW5nKCdhYmxhaiAvKiBjb21tZW50ICovIGxza2pkJykgIyAtPiBbJ2FibGFqJ10KICAgICAgICAgICAgCiAgICAgICAgICAgIHBhdHQuaWdub3JlKGNTdHlsZUNvbW1lbnQpCiAgICAgICAgICAgIHBhdHQucGFyc2VTdHJpbmcoJ2FibGFqIC8qIGNvbW1lbnQgKi8gbHNramQnKSAjIC0+IFsnYWJsYWonLCAnbHNramQnXQogICAgICAgICIiIgogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIGJhc2VzdHJpbmcpOgogICAgICAgICAgICBvdGhlciA9IFN1cHByZXNzKG90aGVyKQoKICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgU3VwcHJlc3MgKToKICAgICAgICAgICAgaWYgb3RoZXIgbm90IGluIHNlbGYuaWdub3JlRXhwcnM6CiAgICAgICAgICAgICAgICBzZWxmLmlnbm9yZUV4cHJzLmFwcGVuZChvdGhlcikKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmlnbm9yZUV4cHJzLmFwcGVuZCggU3VwcHJlc3MoIG90aGVyLmNvcHkoKSApICkKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBzZXREZWJ1Z0FjdGlvbnMoIHNlbGYsIHN0YXJ0QWN0aW9uLCBzdWNjZXNzQWN0aW9uLCBleGNlcHRpb25BY3Rpb24gKToKICAgICAgICAiIiIKICAgICAgICBFbmFibGUgZGlzcGxheSBvZiBkZWJ1Z2dpbmcgbWVzc2FnZXMgd2hpbGUgZG9pbmcgcGF0dGVybiBtYXRjaGluZy4KICAgICAgICAiIiIKICAgICAgICBzZWxmLmRlYnVnQWN0aW9ucyA9IChzdGFydEFjdGlvbiBvciBfZGVmYXVsdFN0YXJ0RGVidWdBY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc0FjdGlvbiBvciBfZGVmYXVsdFN1Y2Nlc3NEZWJ1Z0FjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb25BY3Rpb24gb3IgX2RlZmF1bHRFeGNlcHRpb25EZWJ1Z0FjdGlvbikKICAgICAgICBzZWxmLmRlYnVnID0gVHJ1ZQogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIHNldERlYnVnKCBzZWxmLCBmbGFnPVRydWUgKToKICAgICAgICAiIiIKICAgICAgICBFbmFibGUgZGlzcGxheSBvZiBkZWJ1Z2dpbmcgbWVzc2FnZXMgd2hpbGUgZG9pbmcgcGF0dGVybiBtYXRjaGluZy4KICAgICAgICBTZXQgQ3tmbGFnfSB0byBUcnVlIHRvIGVuYWJsZSwgRmFsc2UgdG8gZGlzYWJsZS4KCiAgICAgICAgRXhhbXBsZTo6CiAgICAgICAgICAgIHdkID0gV29yZChhbHBoYXMpLnNldE5hbWUoImFscGhhd29yZCIpCiAgICAgICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpLnNldE5hbWUoIm51bXdvcmQiKQogICAgICAgICAgICB0ZXJtID0gd2QgfCBpbnRlZ2VyCiAgICAgICAgICAgIAogICAgICAgICAgICAjIHR1cm4gb24gZGVidWdnaW5nIGZvciB3ZAogICAgICAgICAgICB3ZC5zZXREZWJ1ZygpCgogICAgICAgICAgICBPbmVPck1vcmUodGVybSkucGFyc2VTdHJpbmcoImFiYyAxMjMgeHl6IDg5MCIpCiAgICAgICAgCiAgICAgICAgcHJpbnRzOjoKICAgICAgICAgICAgTWF0Y2ggYWxwaGF3b3JkIGF0IGxvYyAwKDEsMSkKICAgICAgICAgICAgTWF0Y2hlZCBhbHBoYXdvcmQgLT4gWydhYmMnXQogICAgICAgICAgICBNYXRjaCBhbHBoYXdvcmQgYXQgbG9jIDMoMSw0KQogICAgICAgICAgICBFeGNlcHRpb24gcmFpc2VkOkV4cGVjdGVkIGFscGhhd29yZCAoYXQgY2hhciA0KSwgKGxpbmU6MSwgY29sOjUpCiAgICAgICAgICAgIE1hdGNoIGFscGhhd29yZCBhdCBsb2MgNygxLDgpCiAgICAgICAgICAgIE1hdGNoZWQgYWxwaGF3b3JkIC0+IFsneHl6J10KICAgICAgICAgICAgTWF0Y2ggYWxwaGF3b3JkIGF0IGxvYyAxMSgxLDEyKQogICAgICAgICAgICBFeGNlcHRpb24gcmFpc2VkOkV4cGVjdGVkIGFscGhhd29yZCAoYXQgY2hhciAxMiksIChsaW5lOjEsIGNvbDoxMykKICAgICAgICAgICAgTWF0Y2ggYWxwaGF3b3JkIGF0IGxvYyAxNSgxLDE2KQogICAgICAgICAgICBFeGNlcHRpb24gcmFpc2VkOkV4cGVjdGVkIGFscGhhd29yZCAoYXQgY2hhciAxNSksIChsaW5lOjEsIGNvbDoxNikKCiAgICAgICAgVGhlIG91dHB1dCBzaG93biBpcyB0aGF0IHByb2R1Y2VkIGJ5IHRoZSBkZWZhdWx0IGRlYnVnIGFjdGlvbnMgLSBjdXN0b20gZGVidWcgYWN0aW9ucyBjYW4gYmUKICAgICAgICBzcGVjaWZpZWQgdXNpbmcgTHtzZXREZWJ1Z0FjdGlvbnN9LiBQcmlvciB0byBhdHRlbXB0aW5nCiAgICAgICAgdG8gbWF0Y2ggdGhlIEN7d2R9IGV4cHJlc3Npb24sIHRoZSBkZWJ1Z2dpbmcgbWVzc2FnZSBDeyJNYXRjaCA8ZXhwcm5hbWU+IGF0IGxvYyA8bj4oPGxpbmU+LDxjb2w+KSJ9CiAgICAgICAgaXMgc2hvd24uIFRoZW4gaWYgdGhlIHBhcnNlIHN1Y2NlZWRzLCBhIEN7Ik1hdGNoZWQifSBtZXNzYWdlIGlzIHNob3duLCBvciBhbiBDeyJFeGNlcHRpb24gcmFpc2VkIn0KICAgICAgICBtZXNzYWdlIGlzIHNob3duLiBBbHNvIG5vdGUgdGhlIHVzZSBvZiBMe3NldE5hbWV9IHRvIGFzc2lnbiBhIGh1bWFuLXJlYWRhYmxlIG5hbWUgdG8gdGhlIGV4cHJlc3Npb24sCiAgICAgICAgd2hpY2ggbWFrZXMgZGVidWdnaW5nIGFuZCBleGNlcHRpb24gbWVzc2FnZXMgZWFzaWVyIHRvIHVuZGVyc3RhbmQgLSBmb3IgaW5zdGFuY2UsIHRoZSBkZWZhdWx0CiAgICAgICAgbmFtZSBjcmVhdGVkIGZvciB0aGUgQ3tXb3JkfSBleHByZXNzaW9uIHdpdGhvdXQgY2FsbGluZyBDe3NldE5hbWV9IGlzIEN7Ilc6KEFCQ0QuLi4pIn0uCiAgICAgICAgIiIiCiAgICAgICAgaWYgZmxhZzoKICAgICAgICAgICAgc2VsZi5zZXREZWJ1Z0FjdGlvbnMoIF9kZWZhdWx0U3RhcnREZWJ1Z0FjdGlvbiwgX2RlZmF1bHRTdWNjZXNzRGVidWdBY3Rpb24sIF9kZWZhdWx0RXhjZXB0aW9uRGVidWdBY3Rpb24gKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuZGVidWcgPSBGYWxzZQogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIF9fc3RyX18oIHNlbGYgKToKICAgICAgICByZXR1cm4gc2VsZi5uYW1lCgogICAgZGVmIF9fcmVwcl9fKCBzZWxmICk6CiAgICAgICAgcmV0dXJuIF91c3RyKHNlbGYpCgogICAgZGVmIHN0cmVhbWxpbmUoIHNlbGYgKToKICAgICAgICBzZWxmLnN0cmVhbWxpbmVkID0gVHJ1ZQogICAgICAgIHNlbGYuc3RyUmVwciA9IE5vbmUKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBjaGVja1JlY3Vyc2lvbiggc2VsZiwgcGFyc2VFbGVtZW50TGlzdCApOgogICAgICAgIHBhc3MKCiAgICBkZWYgdmFsaWRhdGUoIHNlbGYsIHZhbGlkYXRlVHJhY2U9W10gKToKICAgICAgICAiIiIKICAgICAgICBDaGVjayBkZWZpbmVkIGV4cHJlc3Npb25zIGZvciB2YWxpZCBzdHJ1Y3R1cmUsIGNoZWNrIGZvciBpbmZpbml0ZSByZWN1cnNpdmUgZGVmaW5pdGlvbnMuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5jaGVja1JlY3Vyc2lvbiggW10gKQoKICAgIGRlZiBwYXJzZUZpbGUoIHNlbGYsIGZpbGVfb3JfZmlsZW5hbWUsIHBhcnNlQWxsPUZhbHNlICk6CiAgICAgICAgIiIiCiAgICAgICAgRXhlY3V0ZSB0aGUgcGFyc2UgZXhwcmVzc2lvbiBvbiB0aGUgZ2l2ZW4gZmlsZSBvciBmaWxlbmFtZS4KICAgICAgICBJZiBhIGZpbGVuYW1lIGlzIHNwZWNpZmllZCAoaW5zdGVhZCBvZiBhIGZpbGUgb2JqZWN0KSwKICAgICAgICB0aGUgZW50aXJlIGZpbGUgaXMgb3BlbmVkLCByZWFkLCBhbmQgY2xvc2VkIGJlZm9yZSBwYXJzaW5nLgogICAgICAgICIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgZmlsZV9jb250ZW50cyA9IGZpbGVfb3JfZmlsZW5hbWUucmVhZCgpCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICB3aXRoIG9wZW4oZmlsZV9vcl9maWxlbmFtZSwgInIiKSBhcyBmOgogICAgICAgICAgICAgICAgZmlsZV9jb250ZW50cyA9IGYucmVhZCgpCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZVN0cmluZyhmaWxlX2NvbnRlbnRzLCBwYXJzZUFsbCkKICAgICAgICBleGNlcHQgUGFyc2VCYXNlRXhjZXB0aW9uIGFzIGV4YzoKICAgICAgICAgICAgaWYgUGFyc2VyRWxlbWVudC52ZXJib3NlX3N0YWNrdHJhY2U6CiAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBjYXRjaCBhbmQgcmUtcmFpc2UgZXhjZXB0aW9uIGZyb20gaGVyZSwgY2xlYXJzIG91dCBweXBhcnNpbmcgaW50ZXJuYWwgc3RhY2sgdHJhY2UKICAgICAgICAgICAgICAgIHJhaXNlIGV4YwoKICAgIGRlZiBfX2VxX18oc2VsZixvdGhlcik6CiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgUGFyc2VyRWxlbWVudCk6CiAgICAgICAgICAgIHJldHVybiBzZWxmIGlzIG90aGVyIG9yIHZhcnMoc2VsZikgPT0gdmFycyhvdGhlcikKICAgICAgICBlbGlmIGlzaW5zdGFuY2Uob3RoZXIsIGJhc2VzdHJpbmcpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5tYXRjaGVzKG90aGVyKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBzdXBlcihQYXJzZXJFbGVtZW50LHNlbGYpPT1vdGhlcgoKICAgIGRlZiBfX25lX18oc2VsZixvdGhlcik6CiAgICAgICAgcmV0dXJuIG5vdCAoc2VsZiA9PSBvdGhlcikKCiAgICBkZWYgX19oYXNoX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGhhc2goaWQoc2VsZikpCgogICAgZGVmIF9fcmVxX18oc2VsZixvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYgPT0gb3RoZXIKCiAgICBkZWYgX19ybmVfXyhzZWxmLG90aGVyKToKICAgICAgICByZXR1cm4gbm90IChzZWxmID09IG90aGVyKQoKICAgIGRlZiBtYXRjaGVzKHNlbGYsIHRlc3RTdHJpbmcsIHBhcnNlQWxsPVRydWUpOgogICAgICAgICIiIgogICAgICAgIE1ldGhvZCBmb3IgcXVpY2sgdGVzdGluZyBvZiBhIHBhcnNlciBhZ2FpbnN0IGEgdGVzdCBzdHJpbmcuIEdvb2QgZm9yIHNpbXBsZSAKICAgICAgICBpbmxpbmUgbWljcm90ZXN0cyBvZiBzdWIgZXhwcmVzc2lvbnMgd2hpbGUgYnVpbGRpbmcgdXAgbGFyZ2VyIHBhcnNlci4KICAgICAgICAgICAKICAgICAgICBQYXJhbWV0ZXJzOgogICAgICAgICAtIHRlc3RTdHJpbmcgLSB0byB0ZXN0IGFnYWluc3QgdGhpcyBleHByZXNzaW9uIGZvciBhIG1hdGNoCiAgICAgICAgIC0gcGFyc2VBbGwgLSAoZGVmYXVsdD1De1RydWV9KSAtIGZsYWcgdG8gcGFzcyB0byBDe0x7cGFyc2VTdHJpbmd9fSB3aGVuIHJ1bm5pbmcgdGVzdHMKICAgICAgICAgICAgCiAgICAgICAgRXhhbXBsZTo6CiAgICAgICAgICAgIGV4cHIgPSBXb3JkKG51bXMpCiAgICAgICAgICAgIGFzc2VydCBleHByLm1hdGNoZXMoIjEwMCIpCiAgICAgICAgIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLnBhcnNlU3RyaW5nKF91c3RyKHRlc3RTdHJpbmcpLCBwYXJzZUFsbD1wYXJzZUFsbCkKICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICBleGNlcHQgUGFyc2VCYXNlRXhjZXB0aW9uOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAgICAgICAgIAogICAgZGVmIHJ1blRlc3RzKHNlbGYsIHRlc3RzLCBwYXJzZUFsbD1UcnVlLCBjb21tZW50PScjJywgZnVsbER1bXA9VHJ1ZSwgcHJpbnRSZXN1bHRzPVRydWUsIGZhaWx1cmVUZXN0cz1GYWxzZSk6CiAgICAgICAgIiIiCiAgICAgICAgRXhlY3V0ZSB0aGUgcGFyc2UgZXhwcmVzc2lvbiBvbiBhIHNlcmllcyBvZiB0ZXN0IHN0cmluZ3MsIHNob3dpbmcgZWFjaAogICAgICAgIHRlc3QsIHRoZSBwYXJzZWQgcmVzdWx0cyBvciB3aGVyZSB0aGUgcGFyc2UgZmFpbGVkLiBRdWljayBhbmQgZWFzeSB3YXkgdG8KICAgICAgICBydW4gYSBwYXJzZSBleHByZXNzaW9uIGFnYWluc3QgYSBsaXN0IG9mIHNhbXBsZSBzdHJpbmdzLgogICAgICAgICAgIAogICAgICAgIFBhcmFtZXRlcnM6CiAgICAgICAgIC0gdGVzdHMgLSBhIGxpc3Qgb2Ygc2VwYXJhdGUgdGVzdCBzdHJpbmdzLCBvciBhIG11bHRpbGluZSBzdHJpbmcgb2YgdGVzdCBzdHJpbmdzCiAgICAgICAgIC0gcGFyc2VBbGwgLSAoZGVmYXVsdD1De1RydWV9KSAtIGZsYWcgdG8gcGFzcyB0byBDe0x7cGFyc2VTdHJpbmd9fSB3aGVuIHJ1bm5pbmcgdGVzdHMgICAgICAgICAgIAogICAgICAgICAtIGNvbW1lbnQgLSAoZGVmYXVsdD1DeycjJ30pIC0gZXhwcmVzc2lvbiBmb3IgaW5kaWNhdGluZyBlbWJlZGRlZCBjb21tZW50cyBpbiB0aGUgdGVzdCAKICAgICAgICAgICAgICBzdHJpbmc7IHBhc3MgTm9uZSB0byBkaXNhYmxlIGNvbW1lbnQgZmlsdGVyaW5nCiAgICAgICAgIC0gZnVsbER1bXAgLSAoZGVmYXVsdD1De1RydWV9KSAtIGR1bXAgcmVzdWx0cyBhcyBsaXN0IGZvbGxvd2VkIGJ5IHJlc3VsdHMgbmFtZXMgaW4gbmVzdGVkIG91dGxpbmU7CiAgICAgICAgICAgICAgaWYgRmFsc2UsIG9ubHkgZHVtcCBuZXN0ZWQgbGlzdAogICAgICAgICAtIHByaW50UmVzdWx0cyAtIChkZWZhdWx0PUN7VHJ1ZX0pIHByaW50cyB0ZXN0IG91dHB1dCB0byBzdGRvdXQKICAgICAgICAgLSBmYWlsdXJlVGVzdHMgLSAoZGVmYXVsdD1De0ZhbHNlfSkgaW5kaWNhdGVzIGlmIHRoZXNlIHRlc3RzIGFyZSBleHBlY3RlZCB0byBmYWlsIHBhcnNpbmcKCiAgICAgICAgUmV0dXJuczogYSAoc3VjY2VzcywgcmVzdWx0cykgdHVwbGUsIHdoZXJlIHN1Y2Nlc3MgaW5kaWNhdGVzIHRoYXQgYWxsIHRlc3RzIHN1Y2NlZWRlZAogICAgICAgIChvciBmYWlsZWQgaWYgQ3tmYWlsdXJlVGVzdHN9IGlzIFRydWUpLCBhbmQgdGhlIHJlc3VsdHMgY29udGFpbiBhIGxpc3Qgb2YgbGluZXMgb2YgZWFjaCAKICAgICAgICB0ZXN0J3Mgb3V0cHV0CiAgICAgICAgCiAgICAgICAgRXhhbXBsZTo6CiAgICAgICAgICAgIG51bWJlcl9leHByID0gcHlwYXJzaW5nX2NvbW1vbi5udW1iZXIuY29weSgpCgogICAgICAgICAgICByZXN1bHQgPSBudW1iZXJfZXhwci5ydW5UZXN0cygnJycKICAgICAgICAgICAgICAgICMgdW5zaWduZWQgaW50ZWdlcgogICAgICAgICAgICAgICAgMTAwCiAgICAgICAgICAgICAgICAjIG5lZ2F0aXZlIGludGVnZXIKICAgICAgICAgICAgICAgIC0xMDAKICAgICAgICAgICAgICAgICMgZmxvYXQgd2l0aCBzY2llbnRpZmljIG5vdGF0aW9uCiAgICAgICAgICAgICAgICA2LjAyZTIzCiAgICAgICAgICAgICAgICAjIGludGVnZXIgd2l0aCBzY2llbnRpZmljIG5vdGF0aW9uCiAgICAgICAgICAgICAgICAxZS0xMgogICAgICAgICAgICAgICAgJycnKQogICAgICAgICAgICBwcmludCgiU3VjY2VzcyIgaWYgcmVzdWx0WzBdIGVsc2UgIkZhaWxlZCEiKQoKICAgICAgICAgICAgcmVzdWx0ID0gbnVtYmVyX2V4cHIucnVuVGVzdHMoJycnCiAgICAgICAgICAgICAgICAjIHN0cmF5IGNoYXJhY3RlcgogICAgICAgICAgICAgICAgMTAwWgogICAgICAgICAgICAgICAgIyBtaXNzaW5nIGxlYWRpbmcgZGlnaXQgYmVmb3JlICcuJwogICAgICAgICAgICAgICAgLS4xMDAKICAgICAgICAgICAgICAgICMgdG9vIG1hbnkgJy4nCiAgICAgICAgICAgICAgICAzLjE0LjE1OQogICAgICAgICAgICAgICAgJycnLCBmYWlsdXJlVGVzdHM9VHJ1ZSkKICAgICAgICAgICAgcHJpbnQoIlN1Y2Nlc3MiIGlmIHJlc3VsdFswXSBlbHNlICJGYWlsZWQhIikKICAgICAgICBwcmludHM6OgogICAgICAgICAgICAjIHVuc2lnbmVkIGludGVnZXIKICAgICAgICAgICAgMTAwCiAgICAgICAgICAgIFsxMDBdCgogICAgICAgICAgICAjIG5lZ2F0aXZlIGludGVnZXIKICAgICAgICAgICAgLTEwMAogICAgICAgICAgICBbLTEwMF0KCiAgICAgICAgICAgICMgZmxvYXQgd2l0aCBzY2llbnRpZmljIG5vdGF0aW9uCiAgICAgICAgICAgIDYuMDJlMjMKICAgICAgICAgICAgWzYuMDJlKzIzXQoKICAgICAgICAgICAgIyBpbnRlZ2VyIHdpdGggc2NpZW50aWZpYyBub3RhdGlvbgogICAgICAgICAgICAxZS0xMgogICAgICAgICAgICBbMWUtMTJdCgogICAgICAgICAgICBTdWNjZXNzCiAgICAgICAgICAgIAogICAgICAgICAgICAjIHN0cmF5IGNoYXJhY3RlcgogICAgICAgICAgICAxMDBaCiAgICAgICAgICAgICAgIF4KICAgICAgICAgICAgRkFJTDogRXhwZWN0ZWQgZW5kIG9mIHRleHQgKGF0IGNoYXIgMyksIChsaW5lOjEsIGNvbDo0KQoKICAgICAgICAgICAgIyBtaXNzaW5nIGxlYWRpbmcgZGlnaXQgYmVmb3JlICcuJwogICAgICAgICAgICAtLjEwMAogICAgICAgICAgICBeCiAgICAgICAgICAgIEZBSUw6IEV4cGVjdGVkIHtyZWFsIG51bWJlciB3aXRoIHNjaWVudGlmaWMgbm90YXRpb24gfCByZWFsIG51bWJlciB8IHNpZ25lZCBpbnRlZ2VyfSAoYXQgY2hhciAwKSwgKGxpbmU6MSwgY29sOjEpCgogICAgICAgICAgICAjIHRvbyBtYW55ICcuJwogICAgICAgICAgICAzLjE0LjE1OQogICAgICAgICAgICAgICAgXgogICAgICAgICAgICBGQUlMOiBFeHBlY3RlZCBlbmQgb2YgdGV4dCAoYXQgY2hhciA0KSwgKGxpbmU6MSwgY29sOjUpCgogICAgICAgICAgICBTdWNjZXNzCgogICAgICAgIEVhY2ggdGVzdCBzdHJpbmcgbXVzdCBiZSBvbiBhIHNpbmdsZSBsaW5lLiBJZiB5b3Ugd2FudCB0byB0ZXN0IGEgc3RyaW5nIHRoYXQgc3BhbnMgbXVsdGlwbGUKICAgICAgICBsaW5lcywgY3JlYXRlIGEgdGVzdCBsaWtlIHRoaXM6OgoKICAgICAgICAgICAgZXhwci5ydW5UZXN0KHIidGhpcyBpcyBhIHRlc3RcXG4gb2Ygc3RyaW5ncyB0aGF0IHNwYW5zIFxcbiAzIGxpbmVzIikKICAgICAgICAKICAgICAgICAoTm90ZSB0aGF0IHRoaXMgaXMgYSByYXcgc3RyaW5nIGxpdGVyYWwsIHlvdSBtdXN0IGluY2x1ZGUgdGhlIGxlYWRpbmcgJ3InLikKICAgICAgICAiIiIKICAgICAgICBpZiBpc2luc3RhbmNlKHRlc3RzLCBiYXNlc3RyaW5nKToKICAgICAgICAgICAgdGVzdHMgPSBsaXN0KG1hcChzdHIuc3RyaXAsIHRlc3RzLnJzdHJpcCgpLnNwbGl0bGluZXMoKSkpCiAgICAgICAgaWYgaXNpbnN0YW5jZShjb21tZW50LCBiYXNlc3RyaW5nKToKICAgICAgICAgICAgY29tbWVudCA9IExpdGVyYWwoY29tbWVudCkKICAgICAgICBhbGxSZXN1bHRzID0gW10KICAgICAgICBjb21tZW50cyA9IFtdCiAgICAgICAgc3VjY2VzcyA9IFRydWUKICAgICAgICBmb3IgdCBpbiB0ZXN0czoKICAgICAgICAgICAgaWYgY29tbWVudCBpcyBub3QgTm9uZSBhbmQgY29tbWVudC5tYXRjaGVzKHQsIEZhbHNlKSBvciBjb21tZW50cyBhbmQgbm90IHQ6CiAgICAgICAgICAgICAgICBjb21tZW50cy5hcHBlbmQodCkKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlmIG5vdCB0OgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgb3V0ID0gWydcbicuam9pbihjb21tZW50cyksIHRdCiAgICAgICAgICAgIGNvbW1lbnRzID0gW10KICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgdCA9IHQucmVwbGFjZShyJ1xuJywnXG4nKQogICAgICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5wYXJzZVN0cmluZyh0LCBwYXJzZUFsbD1wYXJzZUFsbCkKICAgICAgICAgICAgICAgIG91dC5hcHBlbmQocmVzdWx0LmR1bXAoZnVsbD1mdWxsRHVtcCkpCiAgICAgICAgICAgICAgICBzdWNjZXNzID0gc3VjY2VzcyBhbmQgbm90IGZhaWx1cmVUZXN0cwogICAgICAgICAgICBleGNlcHQgUGFyc2VCYXNlRXhjZXB0aW9uIGFzIHBlOgogICAgICAgICAgICAgICAgZmF0YWwgPSAiKEZBVEFMKSIgaWYgaXNpbnN0YW5jZShwZSwgUGFyc2VGYXRhbEV4Y2VwdGlvbikgZWxzZSAiIgogICAgICAgICAgICAgICAgaWYgJ1xuJyBpbiB0OgogICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQobGluZShwZS5sb2MsIHQpKQogICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoJyAnKihjb2wocGUubG9jLHQpLTEpICsgJ14nICsgZmF0YWwpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoJyAnKnBlLmxvYyArICdeJyArIGZhdGFsKQogICAgICAgICAgICAgICAgb3V0LmFwcGVuZCgiRkFJTDogIiArIHN0cihwZSkpCiAgICAgICAgICAgICAgICBzdWNjZXNzID0gc3VjY2VzcyBhbmQgZmFpbHVyZVRlc3RzCiAgICAgICAgICAgICAgICByZXN1bHQgPSBwZQogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4YzoKICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoIkZBSUwtRVhDRVBUSU9OOiAiICsgc3RyKGV4YykpCiAgICAgICAgICAgICAgICBzdWNjZXNzID0gc3VjY2VzcyBhbmQgZmFpbHVyZVRlc3RzCiAgICAgICAgICAgICAgICByZXN1bHQgPSBleGMKCiAgICAgICAgICAgIGlmIHByaW50UmVzdWx0czoKICAgICAgICAgICAgICAgIGlmIGZ1bGxEdW1wOgogICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoJycpCiAgICAgICAgICAgICAgICBwcmludCgnXG4nLmpvaW4ob3V0KSkKCiAgICAgICAgICAgIGFsbFJlc3VsdHMuYXBwZW5kKCh0LCByZXN1bHQpKQogICAgICAgIAogICAgICAgIHJldHVybiBzdWNjZXNzLCBhbGxSZXN1bHRzCgogICAgICAgIApjbGFzcyBUb2tlbihQYXJzZXJFbGVtZW50KToKICAgICIiIgogICAgQWJzdHJhY3QgQ3tQYXJzZXJFbGVtZW50fSBzdWJjbGFzcywgZm9yIGRlZmluaW5nIGF0b21pYyBtYXRjaGluZyBwYXR0ZXJucy4KICAgICIiIgogICAgZGVmIF9faW5pdF9fKCBzZWxmICk6CiAgICAgICAgc3VwZXIoVG9rZW4sc2VsZikuX19pbml0X18oIHNhdmVsaXN0PUZhbHNlICkKCgpjbGFzcyBFbXB0eShUb2tlbik6CiAgICAiIiIKICAgIEFuIGVtcHR5IHRva2VuLCB3aWxsIGFsd2F5cyBtYXRjaC4KICAgICIiIgogICAgZGVmIF9faW5pdF9fKCBzZWxmICk6CiAgICAgICAgc3VwZXIoRW1wdHksc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYubmFtZSA9ICJFbXB0eSIKICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gVHJ1ZQogICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IEZhbHNlCgoKY2xhc3MgTm9NYXRjaChUb2tlbik6CiAgICAiIiIKICAgIEEgdG9rZW4gdGhhdCB3aWxsIG5ldmVyIG1hdGNoLgogICAgIiIiCiAgICBkZWYgX19pbml0X18oIHNlbGYgKToKICAgICAgICBzdXBlcihOb01hdGNoLHNlbGYpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLm5hbWUgPSAiTm9NYXRjaCIKICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gVHJ1ZQogICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IEZhbHNlCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiVW5tYXRjaGFibGUgdG9rZW4iCgogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToKICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikKCgpjbGFzcyBMaXRlcmFsKFRva2VuKToKICAgICIiIgogICAgVG9rZW4gdG8gZXhhY3RseSBtYXRjaCBhIHNwZWNpZmllZCBzdHJpbmcuCiAgICAKICAgIEV4YW1wbGU6OgogICAgICAgIExpdGVyYWwoJ2JsYWgnKS5wYXJzZVN0cmluZygnYmxhaCcpICAjIC0+IFsnYmxhaCddCiAgICAgICAgTGl0ZXJhbCgnYmxhaCcpLnBhcnNlU3RyaW5nKCdibGFoZm9vYmxhaCcpICAjIC0+IFsnYmxhaCddCiAgICAgICAgTGl0ZXJhbCgnYmxhaCcpLnBhcnNlU3RyaW5nKCdibGEnKSAgIyAtPiBFeGNlcHRpb246IEV4cGVjdGVkICJibGFoIgogICAgCiAgICBGb3IgY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaGluZywgdXNlIEx7Q2FzZWxlc3NMaXRlcmFsfS4KICAgIAogICAgRm9yIGtleXdvcmQgbWF0Y2hpbmcgKGZvcmNlIHdvcmQgYnJlYWsgYmVmb3JlIGFuZCBhZnRlciB0aGUgbWF0Y2hlZCBzdHJpbmcpLAogICAgdXNlIEx7S2V5d29yZH0gb3IgTHtDYXNlbGVzc0tleXdvcmR9LgogICAgIiIiCiAgICBkZWYgX19pbml0X18oIHNlbGYsIG1hdGNoU3RyaW5nICk6CiAgICAgICAgc3VwZXIoTGl0ZXJhbCxzZWxmKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5tYXRjaCA9IG1hdGNoU3RyaW5nCiAgICAgICAgc2VsZi5tYXRjaExlbiA9IGxlbihtYXRjaFN0cmluZykKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYuZmlyc3RNYXRjaENoYXIgPSBtYXRjaFN0cmluZ1swXQogICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJudWxsIHN0cmluZyBwYXNzZWQgdG8gTGl0ZXJhbDsgdXNlIEVtcHR5KCkgaW5zdGVhZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpCiAgICAgICAgICAgIHNlbGYuX19jbGFzc19fID0gRW1wdHkKICAgICAgICBzZWxmLm5hbWUgPSAnIiVzIicgJSBfdXN0cihzZWxmLm1hdGNoKQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkICIgKyBzZWxmLm5hbWUKICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gRmFsc2UKICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBGYWxzZQoKICAgICMgUGVyZm9ybWFuY2UgdHVuaW5nOiB0aGlzIHJvdXRpbmUgZ2V0cyBjYWxsZWQgYSAqbG90KgogICAgIyBpZiB0aGlzIGlzIGEgc2luZ2xlIGNoYXJhY3RlciBtYXRjaCBzdHJpbmcgIGFuZCB0aGUgZmlyc3QgY2hhcmFjdGVyIG1hdGNoZXMsCiAgICAjIHNob3J0LWNpcmN1aXQgYXMgcXVpY2tseSBhcyBwb3NzaWJsZSwgYW5kIGF2b2lkIGNhbGxpbmcgc3RhcnRzd2l0aAogICAgI34gQHByb2ZpbGUKICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6CiAgICAgICAgaWYgKGluc3RyaW5nW2xvY10gPT0gc2VsZi5maXJzdE1hdGNoQ2hhciBhbmQKICAgICAgICAgICAgKHNlbGYubWF0Y2hMZW49PTEgb3IgaW5zdHJpbmcuc3RhcnRzd2l0aChzZWxmLm1hdGNoLGxvYykpICk6CiAgICAgICAgICAgIHJldHVybiBsb2Mrc2VsZi5tYXRjaExlbiwgc2VsZi5tYXRjaAogICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQpfTCA9IExpdGVyYWwKUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzID0gTGl0ZXJhbAoKY2xhc3MgS2V5d29yZChUb2tlbik6CiAgICAiIiIKICAgIFRva2VuIHRvIGV4YWN0bHkgbWF0Y2ggYSBzcGVjaWZpZWQgc3RyaW5nIGFzIGEga2V5d29yZCwgdGhhdCBpcywgaXQgbXVzdCBiZQogICAgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYSBub24ta2V5d29yZCBjaGFyYWN0ZXIuICBDb21wYXJlIHdpdGggQ3tMe0xpdGVyYWx9fToKICAgICAtIEN7TGl0ZXJhbCgiaWYiKX0gd2lsbCBtYXRjaCB0aGUgbGVhZGluZyBDeydpZid9IGluIEN7J2lmQW5kT25seUlmJ30uCiAgICAgLSBDe0tleXdvcmQoImlmIil9IHdpbGwgbm90OyBpdCB3aWxsIG9ubHkgbWF0Y2ggdGhlIGxlYWRpbmcgQ3snaWYnfSBpbiBDeydpZiB4PTEnfSwgb3IgQ3snaWYoeT09MiknfQogICAgQWNjZXB0cyB0d28gb3B0aW9uYWwgY29uc3RydWN0b3IgYXJndW1lbnRzIGluIGFkZGl0aW9uIHRvIHRoZSBrZXl3b3JkIHN0cmluZzoKICAgICAtIEN7aWRlbnRDaGFyc30gaXMgYSBzdHJpbmcgb2YgY2hhcmFjdGVycyB0aGF0IHdvdWxkIGJlIHZhbGlkIGlkZW50aWZpZXIgY2hhcmFjdGVycywKICAgICAgICAgIGRlZmF1bHRpbmcgdG8gYWxsIGFscGhhbnVtZXJpY3MgKyAiXyIgYW5kICIkIgogICAgIC0gQ3tjYXNlbGVzc30gYWxsb3dzIGNhc2UtaW5zZW5zaXRpdmUgbWF0Y2hpbmcsIGRlZmF1bHQgaXMgQ3tGYWxzZX0uCiAgICAgICAKICAgIEV4YW1wbGU6OgogICAgICAgIEtleXdvcmQoInN0YXJ0IikucGFyc2VTdHJpbmcoInN0YXJ0IikgICMgLT4gWydzdGFydCddCiAgICAgICAgS2V5d29yZCgic3RhcnQiKS5wYXJzZVN0cmluZygic3RhcnRpbmciKSAgIyAtPiBFeGNlcHRpb24KCiAgICBGb3IgY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaGluZywgdXNlIEx7Q2FzZWxlc3NLZXl3b3JkfS4KICAgICIiIgogICAgREVGQVVMVF9LRVlXT1JEX0NIQVJTID0gYWxwaGFudW1zKyJfJCIKCiAgICBkZWYgX19pbml0X18oIHNlbGYsIG1hdGNoU3RyaW5nLCBpZGVudENoYXJzPU5vbmUsIGNhc2VsZXNzPUZhbHNlICk6CiAgICAgICAgc3VwZXIoS2V5d29yZCxzZWxmKS5fX2luaXRfXygpCiAgICAgICAgaWYgaWRlbnRDaGFycyBpcyBOb25lOgogICAgICAgICAgICBpZGVudENoYXJzID0gS2V5d29yZC5ERUZBVUxUX0tFWVdPUkRfQ0hBUlMKICAgICAgICBzZWxmLm1hdGNoID0gbWF0Y2hTdHJpbmcKICAgICAgICBzZWxmLm1hdGNoTGVuID0gbGVuKG1hdGNoU3RyaW5nKQogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5maXJzdE1hdGNoQ2hhciA9IG1hdGNoU3RyaW5nWzBdCiAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIm51bGwgc3RyaW5nIHBhc3NlZCB0byBLZXl3b3JkOyB1c2UgRW1wdHkoKSBpbnN0ZWFkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikKICAgICAgICBzZWxmLm5hbWUgPSAnIiVzIicgJSBzZWxmLm1hdGNoCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgIiArIHNlbGYubmFtZQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBGYWxzZQogICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IEZhbHNlCiAgICAgICAgc2VsZi5jYXNlbGVzcyA9IGNhc2VsZXNzCiAgICAgICAgaWYgY2FzZWxlc3M6CiAgICAgICAgICAgIHNlbGYuY2FzZWxlc3NtYXRjaCA9IG1hdGNoU3RyaW5nLnVwcGVyKCkKICAgICAgICAgICAgaWRlbnRDaGFycyA9IGlkZW50Q2hhcnMudXBwZXIoKQogICAgICAgIHNlbGYuaWRlbnRDaGFycyA9IHNldChpZGVudENoYXJzKQoKICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6CiAgICAgICAgaWYgc2VsZi5jYXNlbGVzczoKICAgICAgICAgICAgaWYgKCAoaW5zdHJpbmdbIGxvYzpsb2Mrc2VsZi5tYXRjaExlbiBdLnVwcGVyKCkgPT0gc2VsZi5jYXNlbGVzc21hdGNoKSBhbmQKICAgICAgICAgICAgICAgICAobG9jID49IGxlbihpbnN0cmluZyktc2VsZi5tYXRjaExlbiBvciBpbnN0cmluZ1tsb2Mrc2VsZi5tYXRjaExlbl0udXBwZXIoKSBub3QgaW4gc2VsZi5pZGVudENoYXJzKSBhbmQKICAgICAgICAgICAgICAgICAobG9jID09IDAgb3IgaW5zdHJpbmdbbG9jLTFdLnVwcGVyKCkgbm90IGluIHNlbGYuaWRlbnRDaGFycykgKToKICAgICAgICAgICAgICAgIHJldHVybiBsb2Mrc2VsZi5tYXRjaExlbiwgc2VsZi5tYXRjaAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlmIChpbnN0cmluZ1tsb2NdID09IHNlbGYuZmlyc3RNYXRjaENoYXIgYW5kCiAgICAgICAgICAgICAgICAoc2VsZi5tYXRjaExlbj09MSBvciBpbnN0cmluZy5zdGFydHN3aXRoKHNlbGYubWF0Y2gsbG9jKSkgYW5kCiAgICAgICAgICAgICAgICAobG9jID49IGxlbihpbnN0cmluZyktc2VsZi5tYXRjaExlbiBvciBpbnN0cmluZ1tsb2Mrc2VsZi5tYXRjaExlbl0gbm90IGluIHNlbGYuaWRlbnRDaGFycykgYW5kCiAgICAgICAgICAgICAgICAobG9jID09IDAgb3IgaW5zdHJpbmdbbG9jLTFdIG5vdCBpbiBzZWxmLmlkZW50Q2hhcnMpICk6CiAgICAgICAgICAgICAgICByZXR1cm4gbG9jK3NlbGYubWF0Y2hMZW4sIHNlbGYubWF0Y2gKICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikKCiAgICBkZWYgY29weShzZWxmKToKICAgICAgICBjID0gc3VwZXIoS2V5d29yZCxzZWxmKS5jb3B5KCkKICAgICAgICBjLmlkZW50Q2hhcnMgPSBLZXl3b3JkLkRFRkFVTFRfS0VZV09SRF9DSEFSUwogICAgICAgIHJldHVybiBjCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIHNldERlZmF1bHRLZXl3b3JkQ2hhcnMoIGNoYXJzICk6CiAgICAgICAgIiIiT3ZlcnJpZGVzIHRoZSBkZWZhdWx0IEtleXdvcmQgY2hhcnMKICAgICAgICAiIiIKICAgICAgICBLZXl3b3JkLkRFRkFVTFRfS0VZV09SRF9DSEFSUyA9IGNoYXJzCgpjbGFzcyBDYXNlbGVzc0xpdGVyYWwoTGl0ZXJhbCk6CiAgICAiIiIKICAgIFRva2VuIHRvIG1hdGNoIGEgc3BlY2lmaWVkIHN0cmluZywgaWdub3JpbmcgY2FzZSBvZiBsZXR0ZXJzLgogICAgTm90ZTogdGhlIG1hdGNoZWQgcmVzdWx0cyB3aWxsIGFsd2F5cyBiZSBpbiB0aGUgY2FzZSBvZiB0aGUgZ2l2ZW4KICAgIG1hdGNoIHN0cmluZywgTk9UIHRoZSBjYXNlIG9mIHRoZSBpbnB1dCB0ZXh0LgoKICAgIEV4YW1wbGU6OgogICAgICAgIE9uZU9yTW9yZShDYXNlbGVzc0xpdGVyYWwoIkNNRCIpKS5wYXJzZVN0cmluZygiY21kIENNRCBDbWQxMCIpICMgLT4gWydDTUQnLCAnQ01EJywgJ0NNRCddCiAgICAgICAgCiAgICAoQ29udHJhc3Qgd2l0aCBleGFtcGxlIGZvciBMe0Nhc2VsZXNzS2V5d29yZH0uKQogICAgIiIiCiAgICBkZWYgX19pbml0X18oIHNlbGYsIG1hdGNoU3RyaW5nICk6CiAgICAgICAgc3VwZXIoQ2FzZWxlc3NMaXRlcmFsLHNlbGYpLl9faW5pdF9fKCBtYXRjaFN0cmluZy51cHBlcigpICkKICAgICAgICAjIFByZXNlcnZlIHRoZSBkZWZpbmluZyBsaXRlcmFsLgogICAgICAgIHNlbGYucmV0dXJuU3RyaW5nID0gbWF0Y2hTdHJpbmcKICAgICAgICBzZWxmLm5hbWUgPSAiJyVzJyIgJSBzZWxmLnJldHVyblN0cmluZwogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkICIgKyBzZWxmLm5hbWUKCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOgogICAgICAgIGlmIGluc3RyaW5nWyBsb2M6bG9jK3NlbGYubWF0Y2hMZW4gXS51cHBlcigpID09IHNlbGYubWF0Y2g6CiAgICAgICAgICAgIHJldHVybiBsb2Mrc2VsZi5tYXRjaExlbiwgc2VsZi5yZXR1cm5TdHJpbmcKICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikKCmNsYXNzIENhc2VsZXNzS2V5d29yZChLZXl3b3JkKToKICAgICIiIgogICAgQ2FzZWxlc3MgdmVyc2lvbiBvZiBMe0tleXdvcmR9LgoKICAgIEV4YW1wbGU6OgogICAgICAgIE9uZU9yTW9yZShDYXNlbGVzc0tleXdvcmQoIkNNRCIpKS5wYXJzZVN0cmluZygiY21kIENNRCBDbWQxMCIpICMgLT4gWydDTUQnLCAnQ01EJ10KICAgICAgICAKICAgIChDb250cmFzdCB3aXRoIGV4YW1wbGUgZm9yIEx7Q2FzZWxlc3NMaXRlcmFsfS4pCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyggc2VsZiwgbWF0Y2hTdHJpbmcsIGlkZW50Q2hhcnM9Tm9uZSApOgogICAgICAgIHN1cGVyKENhc2VsZXNzS2V5d29yZCxzZWxmKS5fX2luaXRfXyggbWF0Y2hTdHJpbmcsIGlkZW50Q2hhcnMsIGNhc2VsZXNzPVRydWUgKQoKICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6CiAgICAgICAgaWYgKCAoaW5zdHJpbmdbIGxvYzpsb2Mrc2VsZi5tYXRjaExlbiBdLnVwcGVyKCkgPT0gc2VsZi5jYXNlbGVzc21hdGNoKSBhbmQKICAgICAgICAgICAgIChsb2MgPj0gbGVuKGluc3RyaW5nKS1zZWxmLm1hdGNoTGVuIG9yIGluc3RyaW5nW2xvYytzZWxmLm1hdGNoTGVuXS51cHBlcigpIG5vdCBpbiBzZWxmLmlkZW50Q2hhcnMpICk6CiAgICAgICAgICAgIHJldHVybiBsb2Mrc2VsZi5tYXRjaExlbiwgc2VsZi5tYXRjaAogICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQoKY2xhc3MgQ2xvc2VNYXRjaChUb2tlbik6CiAgICAiIiIKICAgIEEgdmFyaWF0aW9uIG9uIEx7TGl0ZXJhbH0gd2hpY2ggbWF0Y2hlcyAiY2xvc2UiIG1hdGNoZXMsIHRoYXQgaXMsIAogICAgc3RyaW5ncyB3aXRoIGF0IG1vc3QgJ24nIG1pc21hdGNoaW5nIGNoYXJhY3RlcnMuIEN7Q2xvc2VNYXRjaH0gdGFrZXMgcGFyYW1ldGVyczoKICAgICAtIEN7bWF0Y2hfc3RyaW5nfSAtIHN0cmluZyB0byBiZSBtYXRjaGVkCiAgICAgLSBDe21heE1pc21hdGNoZXN9IC0gKEN7ZGVmYXVsdD0xfSkgbWF4aW11bSBudW1iZXIgb2YgbWlzbWF0Y2hlcyBhbGxvd2VkIHRvIGNvdW50IGFzIGEgbWF0Y2gKICAgIAogICAgVGhlIHJlc3VsdHMgZnJvbSBhIHN1Y2Nlc3NmdWwgcGFyc2Ugd2lsbCBjb250YWluIHRoZSBtYXRjaGVkIHRleHQgZnJvbSB0aGUgaW5wdXQgc3RyaW5nIGFuZCB0aGUgZm9sbG93aW5nIG5hbWVkIHJlc3VsdHM6CiAgICAgLSBDe21pc21hdGNoZXN9IC0gYSBsaXN0IG9mIHRoZSBwb3NpdGlvbnMgd2l0aGluIHRoZSBtYXRjaF9zdHJpbmcgd2hlcmUgbWlzbWF0Y2hlcyB3ZXJlIGZvdW5kCiAgICAgLSBDe29yaWdpbmFsfSAtIHRoZSBvcmlnaW5hbCBtYXRjaF9zdHJpbmcgdXNlZCB0byBjb21wYXJlIGFnYWluc3QgdGhlIGlucHV0IHN0cmluZwogICAgCiAgICBJZiBDe21pc21hdGNoZXN9IGlzIGFuIGVtcHR5IGxpc3QsIHRoZW4gdGhlIG1hdGNoIHdhcyBhbiBleGFjdCBtYXRjaC4KICAgIAogICAgRXhhbXBsZTo6CiAgICAgICAgcGF0dCA9IENsb3NlTWF0Y2goIkFUQ0FUQ0dBQVRHR0EiKQogICAgICAgIHBhdHQucGFyc2VTdHJpbmcoIkFUQ0FUQ0dBQVhHR0EiKSAjIC0+IChbJ0FUQ0FUQ0dBQVhHR0EnXSwgeydtaXNtYXRjaGVzJzogW1s5XV0sICdvcmlnaW5hbCc6IFsnQVRDQVRDR0FBVEdHQSddfSkKICAgICAgICBwYXR0LnBhcnNlU3RyaW5nKCJBVENBWENHQUFYR0dBIikgIyAtPiBFeGNlcHRpb246IEV4cGVjdGVkICdBVENBVENHQUFUR0dBJyAod2l0aCB1cCB0byAxIG1pc21hdGNoZXMpIChhdCBjaGFyIDApLCAobGluZToxLCBjb2w6MSkKCiAgICAgICAgIyBleGFjdCBtYXRjaAogICAgICAgIHBhdHQucGFyc2VTdHJpbmcoIkFUQ0FUQ0dBQVRHR0EiKSAjIC0+IChbJ0FUQ0FUQ0dBQVRHR0EnXSwgeydtaXNtYXRjaGVzJzogW1tdXSwgJ29yaWdpbmFsJzogWydBVENBVENHQUFUR0dBJ119KQoKICAgICAgICAjIGNsb3NlIG1hdGNoIGFsbG93aW5nIHVwIHRvIDIgbWlzbWF0Y2hlcwogICAgICAgIHBhdHQgPSBDbG9zZU1hdGNoKCJBVENBVENHQUFUR0dBIiwgbWF4TWlzbWF0Y2hlcz0yKQogICAgICAgIHBhdHQucGFyc2VTdHJpbmcoIkFUQ0FYQ0dBQVhHR0EiKSAjIC0+IChbJ0FUQ0FYQ0dBQVhHR0EnXSwgeydtaXNtYXRjaGVzJzogW1s0LCA5XV0sICdvcmlnaW5hbCc6IFsnQVRDQVRDR0FBVEdHQSddfSkKICAgICIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hdGNoX3N0cmluZywgbWF4TWlzbWF0Y2hlcz0xKToKICAgICAgICBzdXBlcihDbG9zZU1hdGNoLHNlbGYpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLm5hbWUgPSBtYXRjaF9zdHJpbmcKICAgICAgICBzZWxmLm1hdGNoX3N0cmluZyA9IG1hdGNoX3N0cmluZwogICAgICAgIHNlbGYubWF4TWlzbWF0Y2hlcyA9IG1heE1pc21hdGNoZXMKICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCAlciAod2l0aCB1cCB0byAlZCBtaXNtYXRjaGVzKSIgJSAoc2VsZi5tYXRjaF9zdHJpbmcsIHNlbGYubWF4TWlzbWF0Y2hlcykKICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBGYWxzZQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBGYWxzZQoKICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6CiAgICAgICAgc3RhcnQgPSBsb2MKICAgICAgICBpbnN0cmxlbiA9IGxlbihpbnN0cmluZykKICAgICAgICBtYXhsb2MgPSBzdGFydCArIGxlbihzZWxmLm1hdGNoX3N0cmluZykKCiAgICAgICAgaWYgbWF4bG9jIDw9IGluc3RybGVuOgogICAgICAgICAgICBtYXRjaF9zdHJpbmcgPSBzZWxmLm1hdGNoX3N0cmluZwogICAgICAgICAgICBtYXRjaF9zdHJpbmdsb2MgPSAwCiAgICAgICAgICAgIG1pc21hdGNoZXMgPSBbXQogICAgICAgICAgICBtYXhNaXNtYXRjaGVzID0gc2VsZi5tYXhNaXNtYXRjaGVzCgogICAgICAgICAgICBmb3IgbWF0Y2hfc3RyaW5nbG9jLHNfbSBpbiBlbnVtZXJhdGUoemlwKGluc3RyaW5nW2xvYzptYXhsb2NdLCBzZWxmLm1hdGNoX3N0cmluZykpOgogICAgICAgICAgICAgICAgc3JjLG1hdCA9IHNfbQogICAgICAgICAgICAgICAgaWYgc3JjICE9IG1hdDoKICAgICAgICAgICAgICAgICAgICBtaXNtYXRjaGVzLmFwcGVuZChtYXRjaF9zdHJpbmdsb2MpCiAgICAgICAgICAgICAgICAgICAgaWYgbGVuKG1pc21hdGNoZXMpID4gbWF4TWlzbWF0Y2hlczoKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGxvYyA9IG1hdGNoX3N0cmluZ2xvYyArIDEKICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBQYXJzZVJlc3VsdHMoW2luc3RyaW5nW3N0YXJ0OmxvY11dKQogICAgICAgICAgICAgICAgcmVzdWx0c1snb3JpZ2luYWwnXSA9IHNlbGYubWF0Y2hfc3RyaW5nCiAgICAgICAgICAgICAgICByZXN1bHRzWydtaXNtYXRjaGVzJ10gPSBtaXNtYXRjaGVzCiAgICAgICAgICAgICAgICByZXR1cm4gbG9jLCByZXN1bHRzCgogICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQoKCmNsYXNzIFdvcmQoVG9rZW4pOgogICAgIiIiCiAgICBUb2tlbiBmb3IgbWF0Y2hpbmcgd29yZHMgY29tcG9zZWQgb2YgYWxsb3dlZCBjaGFyYWN0ZXIgc2V0cy4KICAgIERlZmluZWQgd2l0aCBzdHJpbmcgY29udGFpbmluZyBhbGwgYWxsb3dlZCBpbml0aWFsIGNoYXJhY3RlcnMsCiAgICBhbiBvcHRpb25hbCBzdHJpbmcgY29udGFpbmluZyBhbGxvd2VkIGJvZHkgY2hhcmFjdGVycyAoaWYgb21pdHRlZCwKICAgIGRlZmF1bHRzIHRvIHRoZSBpbml0aWFsIGNoYXJhY3RlciBzZXQpLCBhbmQgYW4gb3B0aW9uYWwgbWluaW11bSwKICAgIG1heGltdW0sIGFuZC9vciBleGFjdCBsZW5ndGguICBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgQ3ttaW59IGlzIDEgKGEKICAgIG1pbmltdW0gdmFsdWUgPCAxIGlzIG5vdCB2YWxpZCk7IHRoZSBkZWZhdWx0IHZhbHVlcyBmb3IgQ3ttYXh9IGFuZCBDe2V4YWN0fQogICAgYXJlIDAsIG1lYW5pbmcgbm8gbWF4aW11bSBvciBleGFjdCBsZW5ndGggcmVzdHJpY3Rpb24uIEFuIG9wdGlvbmFsCiAgICBDe2V4Y2x1ZGVDaGFyc30gcGFyYW1ldGVyIGNhbiBsaXN0IGNoYXJhY3RlcnMgdGhhdCBtaWdodCBiZSBmb3VuZCBpbiAKICAgIHRoZSBpbnB1dCBDe2JvZHlDaGFyc30gc3RyaW5nOyB1c2VmdWwgdG8gZGVmaW5lIGEgd29yZCBvZiBhbGwgcHJpbnRhYmxlcwogICAgZXhjZXB0IGZvciBvbmUgb3IgdHdvIGNoYXJhY3RlcnMsIGZvciBpbnN0YW5jZS4KICAgIAogICAgTHtzcmFuZ2V9IGlzIHVzZWZ1bCBmb3IgZGVmaW5pbmcgY3VzdG9tIGNoYXJhY3RlciBzZXQgc3RyaW5ncyBmb3IgZGVmaW5pbmcgCiAgICBDe1dvcmR9IGV4cHJlc3Npb25zLCB1c2luZyByYW5nZSBub3RhdGlvbiBmcm9tIHJlZ3VsYXIgZXhwcmVzc2lvbiBjaGFyYWN0ZXIgc2V0cy4KICAgIAogICAgQSBjb21tb24gbWlzdGFrZSBpcyB0byB1c2UgQ3tXb3JkfSB0byBtYXRjaCBhIHNwZWNpZmljIGxpdGVyYWwgc3RyaW5nLCBhcyBpbiAKICAgIEN7V29yZCgiQWRkcmVzcyIpfS4gUmVtZW1iZXIgdGhhdCBDe1dvcmR9IHVzZXMgdGhlIHN0cmluZyBhcmd1bWVudCB0byBkZWZpbmUKICAgIEl7c2V0c30gb2YgbWF0Y2hhYmxlIGNoYXJhY3RlcnMuIFRoaXMgZXhwcmVzc2lvbiB3b3VsZCBtYXRjaCAiQWRkIiwgIkFBQSIsCiAgICAiZEFyZWQiLCBvciBhbnkgb3RoZXIgd29yZCBtYWRlIHVwIG9mIHRoZSBjaGFyYWN0ZXJzICdBJywgJ2QnLCAncicsICdlJywgYW5kICdzJy4KICAgIFRvIG1hdGNoIGFuIGV4YWN0IGxpdGVyYWwgc3RyaW5nLCB1c2UgTHtMaXRlcmFsfSBvciBMe0tleXdvcmR9LgoKICAgIHB5cGFyc2luZyBpbmNsdWRlcyBoZWxwZXIgc3RyaW5ncyBmb3IgYnVpbGRpbmcgV29yZHM6CiAgICAgLSBMe2FscGhhc30KICAgICAtIEx7bnVtc30KICAgICAtIEx7YWxwaGFudW1zfQogICAgIC0gTHtoZXhudW1zfQogICAgIC0gTHthbHBoYXM4Yml0fSAoYWxwaGFiZXRpYyBjaGFyYWN0ZXJzIGluIEFTQ0lJIHJhbmdlIDEyOC0yNTUgLSBhY2NlbnRlZCwgdGlsZGVkLCB1bWxhdXRlZCwgZXRjLikKICAgICAtIEx7cHVuYzhiaXR9IChub24tYWxwaGFiZXRpYyBjaGFyYWN0ZXJzIGluIEFTQ0lJIHJhbmdlIDEyOC0yNTUgLSBjdXJyZW5jeSwgc3ltYm9scywgc3VwZXJzY3JpcHRzLCBkaWFjcml0aWNhbHMsIGV0Yy4pCiAgICAgLSBMe3ByaW50YWJsZXN9IChhbnkgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyKQoKICAgIEV4YW1wbGU6OgogICAgICAgICMgYSB3b3JkIGNvbXBvc2VkIG9mIGRpZ2l0cwogICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpICMgZXF1aXZhbGVudCB0byBXb3JkKCIwMTIzNDU2Nzg5Iikgb3IgV29yZChzcmFuZ2UoIjAtOSIpKQogICAgICAgIAogICAgICAgICMgYSB3b3JkIHdpdGggYSBsZWFkaW5nIGNhcGl0YWwsIGFuZCB6ZXJvIG9yIG1vcmUgbG93ZXJjYXNlCiAgICAgICAgY2FwaXRhbF93b3JkID0gV29yZChhbHBoYXMudXBwZXIoKSwgYWxwaGFzLmxvd2VyKCkpCgogICAgICAgICMgaG9zdG5hbWVzIGFyZSBhbHBoYW51bWVyaWMsIHdpdGggbGVhZGluZyBhbHBoYSwgYW5kICctJwogICAgICAgIGhvc3RuYW1lID0gV29yZChhbHBoYXMsIGFscGhhbnVtcysnLScpCiAgICAgICAgCiAgICAgICAgIyByb21hbiBudW1lcmFsIChub3QgYSBzdHJpY3QgcGFyc2VyLCBhY2NlcHRzIGludmFsaWQgbWl4IG9mIGNoYXJhY3RlcnMpCiAgICAgICAgcm9tYW4gPSBXb3JkKCJJVlhMQ0RNIikKICAgICAgICAKICAgICAgICAjIGFueSBzdHJpbmcgb2Ygbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVycywgZXhjZXB0IGZvciAnLCcKICAgICAgICBjc3ZfdmFsdWUgPSBXb3JkKHByaW50YWJsZXMsIGV4Y2x1ZGVDaGFycz0iLCIpCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyggc2VsZiwgaW5pdENoYXJzLCBib2R5Q2hhcnM9Tm9uZSwgbWluPTEsIG1heD0wLCBleGFjdD0wLCBhc0tleXdvcmQ9RmFsc2UsIGV4Y2x1ZGVDaGFycz1Ob25lICk6CiAgICAgICAgc3VwZXIoV29yZCxzZWxmKS5fX2luaXRfXygpCiAgICAgICAgaWYgZXhjbHVkZUNoYXJzOgogICAgICAgICAgICBpbml0Q2hhcnMgPSAnJy5qb2luKGMgZm9yIGMgaW4gaW5pdENoYXJzIGlmIGMgbm90IGluIGV4Y2x1ZGVDaGFycykKICAgICAgICAgICAgaWYgYm9keUNoYXJzOgogICAgICAgICAgICAgICAgYm9keUNoYXJzID0gJycuam9pbihjIGZvciBjIGluIGJvZHlDaGFycyBpZiBjIG5vdCBpbiBleGNsdWRlQ2hhcnMpCiAgICAgICAgc2VsZi5pbml0Q2hhcnNPcmlnID0gaW5pdENoYXJzCiAgICAgICAgc2VsZi5pbml0Q2hhcnMgPSBzZXQoaW5pdENoYXJzKQogICAgICAgIGlmIGJvZHlDaGFycyA6CiAgICAgICAgICAgIHNlbGYuYm9keUNoYXJzT3JpZyA9IGJvZHlDaGFycwogICAgICAgICAgICBzZWxmLmJvZHlDaGFycyA9IHNldChib2R5Q2hhcnMpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5ib2R5Q2hhcnNPcmlnID0gaW5pdENoYXJzCiAgICAgICAgICAgIHNlbGYuYm9keUNoYXJzID0gc2V0KGluaXRDaGFycykKCiAgICAgICAgc2VsZi5tYXhTcGVjaWZpZWQgPSBtYXggPiAwCgogICAgICAgIGlmIG1pbiA8IDE6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImNhbm5vdCBzcGVjaWZ5IGEgbWluaW11bSBsZW5ndGggPCAxOyB1c2UgT3B0aW9uYWwoV29yZCgpKSBpZiB6ZXJvLWxlbmd0aCB3b3JkIGlzIHBlcm1pdHRlZCIpCgogICAgICAgIHNlbGYubWluTGVuID0gbWluCgogICAgICAgIGlmIG1heCA+IDA6CiAgICAgICAgICAgIHNlbGYubWF4TGVuID0gbWF4CiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5tYXhMZW4gPSBfTUFYX0lOVAoKICAgICAgICBpZiBleGFjdCA+IDA6CiAgICAgICAgICAgIHNlbGYubWF4TGVuID0gZXhhY3QKICAgICAgICAgICAgc2VsZi5taW5MZW4gPSBleGFjdAoKICAgICAgICBzZWxmLm5hbWUgPSBfdXN0cihzZWxmKQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkICIgKyBzZWxmLm5hbWUKICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBGYWxzZQogICAgICAgIHNlbGYuYXNLZXl3b3JkID0gYXNLZXl3b3JkCgogICAgICAgIGlmICcgJyBub3QgaW4gc2VsZi5pbml0Q2hhcnNPcmlnK3NlbGYuYm9keUNoYXJzT3JpZyBhbmQgKG1pbj09MSBhbmQgbWF4PT0wIGFuZCBleGFjdD09MCk6CiAgICAgICAgICAgIGlmIHNlbGYuYm9keUNoYXJzT3JpZyA9PSBzZWxmLmluaXRDaGFyc09yaWc6CiAgICAgICAgICAgICAgICBzZWxmLnJlU3RyaW5nID0gIlslc10rIiAlIF9lc2NhcGVSZWdleFJhbmdlQ2hhcnMoc2VsZi5pbml0Q2hhcnNPcmlnKQogICAgICAgICAgICBlbGlmIGxlbihzZWxmLmluaXRDaGFyc09yaWcpID09IDE6CiAgICAgICAgICAgICAgICBzZWxmLnJlU3RyaW5nID0gIiVzWyVzXSoiICUgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZS5lc2NhcGUoc2VsZi5pbml0Q2hhcnNPcmlnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZXNjYXBlUmVnZXhSYW5nZUNoYXJzKHNlbGYuYm9keUNoYXJzT3JpZyksKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi5yZVN0cmluZyA9ICJbJXNdWyVzXSoiICUgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfZXNjYXBlUmVnZXhSYW5nZUNoYXJzKHNlbGYuaW5pdENoYXJzT3JpZyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2VzY2FwZVJlZ2V4UmFuZ2VDaGFycyhzZWxmLmJvZHlDaGFyc09yaWcpLCkKICAgICAgICAgICAgaWYgc2VsZi5hc0tleXdvcmQ6CiAgICAgICAgICAgICAgICBzZWxmLnJlU3RyaW5nID0gciJcYiIrc2VsZi5yZVN0cmluZytyIlxiIgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBzZWxmLnJlID0gcmUuY29tcGlsZSggc2VsZi5yZVN0cmluZyApCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgICAgICBzZWxmLnJlID0gTm9uZQoKICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6CiAgICAgICAgaWYgc2VsZi5yZToKICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5yZS5tYXRjaChpbnN0cmluZyxsb2MpCiAgICAgICAgICAgIGlmIG5vdCByZXN1bHQ6CiAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikKCiAgICAgICAgICAgIGxvYyA9IHJlc3VsdC5lbmQoKQogICAgICAgICAgICByZXR1cm4gbG9jLCByZXN1bHQuZ3JvdXAoKQoKICAgICAgICBpZiBub3QoaW5zdHJpbmdbIGxvYyBdIGluIHNlbGYuaW5pdENoYXJzKToKICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpCgogICAgICAgIHN0YXJ0ID0gbG9jCiAgICAgICAgbG9jICs9IDEKICAgICAgICBpbnN0cmxlbiA9IGxlbihpbnN0cmluZykKICAgICAgICBib2R5Y2hhcnMgPSBzZWxmLmJvZHlDaGFycwogICAgICAgIG1heGxvYyA9IHN0YXJ0ICsgc2VsZi5tYXhMZW4KICAgICAgICBtYXhsb2MgPSBtaW4oIG1heGxvYywgaW5zdHJsZW4gKQogICAgICAgIHdoaWxlIGxvYyA8IG1heGxvYyBhbmQgaW5zdHJpbmdbbG9jXSBpbiBib2R5Y2hhcnM6CiAgICAgICAgICAgIGxvYyArPSAxCgogICAgICAgIHRocm93RXhjZXB0aW9uID0gRmFsc2UKICAgICAgICBpZiBsb2MgLSBzdGFydCA8IHNlbGYubWluTGVuOgogICAgICAgICAgICB0aHJvd0V4Y2VwdGlvbiA9IFRydWUKICAgICAgICBpZiBzZWxmLm1heFNwZWNpZmllZCBhbmQgbG9jIDwgaW5zdHJsZW4gYW5kIGluc3RyaW5nW2xvY10gaW4gYm9keWNoYXJzOgogICAgICAgICAgICB0aHJvd0V4Y2VwdGlvbiA9IFRydWUKICAgICAgICBpZiBzZWxmLmFzS2V5d29yZDoKICAgICAgICAgICAgaWYgKHN0YXJ0PjAgYW5kIGluc3RyaW5nW3N0YXJ0LTFdIGluIGJvZHljaGFycykgb3IgKGxvYzxpbnN0cmxlbiBhbmQgaW5zdHJpbmdbbG9jXSBpbiBib2R5Y2hhcnMpOgogICAgICAgICAgICAgICAgdGhyb3dFeGNlcHRpb24gPSBUcnVlCgogICAgICAgIGlmIHRocm93RXhjZXB0aW9uOgogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikKCiAgICAgICAgcmV0dXJuIGxvYywgaW5zdHJpbmdbc3RhcnQ6bG9jXQoKICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc3VwZXIoV29yZCxzZWxmKS5fX3N0cl9fKCkKICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICBwYXNzCgoKICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZToKCiAgICAgICAgICAgIGRlZiBjaGFyc0FzU3RyKHMpOgogICAgICAgICAgICAgICAgaWYgbGVuKHMpPjQ6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNbOjRdKyIuLi4iCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBzCgogICAgICAgICAgICBpZiAoIHNlbGYuaW5pdENoYXJzT3JpZyAhPSBzZWxmLmJvZHlDaGFyc09yaWcgKToKICAgICAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICJXOiglcywlcykiICUgKCBjaGFyc0FzU3RyKHNlbGYuaW5pdENoYXJzT3JpZyksIGNoYXJzQXNTdHIoc2VsZi5ib2R5Q2hhcnNPcmlnKSApCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAiVzooJXMpIiAlIGNoYXJzQXNTdHIoc2VsZi5pbml0Q2hhcnNPcmlnKQoKICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByCgoKY2xhc3MgUmVnZXgoVG9rZW4pOgogICAgIiIiCiAgICBUb2tlbiBmb3IgbWF0Y2hpbmcgc3RyaW5ncyB0aGF0IG1hdGNoIGEgZ2l2ZW4gcmVndWxhciBleHByZXNzaW9uLgogICAgRGVmaW5lZCB3aXRoIHN0cmluZyBzcGVjaWZ5aW5nIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gaW4gYSBmb3JtIHJlY29nbml6ZWQgYnkgdGhlIGluYnVpbHQgUHl0aG9uIHJlIG1vZHVsZS4KICAgIElmIHRoZSBnaXZlbiByZWdleCBjb250YWlucyBuYW1lZCBncm91cHMgKGRlZmluZWQgdXNpbmcgQ3soP1A8bmFtZT4uLi4pfSksIHRoZXNlIHdpbGwgYmUgcHJlc2VydmVkIGFzIAogICAgbmFtZWQgcGFyc2UgcmVzdWx0cy4KCiAgICBFeGFtcGxlOjoKICAgICAgICByZWFsbnVtID0gUmVnZXgociJbKy1dP1xkK1wuXGQqIikKICAgICAgICBkYXRlID0gUmVnZXgocicoP1A8eWVhcj5cZHs0fSktKD9QPG1vbnRoPlxkXGQ/KS0oP1A8ZGF5PlxkXGQ/KScpCiAgICAgICAgIyByZWY6IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMjY3Mzk5L2hvdy1kby15b3UtbWF0Y2gtb25seS12YWxpZC1yb21hbi1udW1lcmFscy13aXRoLWEtcmVndWxhci1leHByZXNzaW9uCiAgICAgICAgcm9tYW4gPSBSZWdleChyIk17MCw0fShDTXxDRHxEP0N7MCwzfSkoWEN8WEx8TD9YezAsM30pKElYfElWfFY/SXswLDN9KSIpCiAgICAiIiIKICAgIGNvbXBpbGVkUkV0eXBlID0gdHlwZShyZS5jb21waWxlKCJbQS1aXSIpKQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBwYXR0ZXJuLCBmbGFncz0wKToKICAgICAgICAiIiJUaGUgcGFyYW1ldGVycyBDe3BhdHRlcm59IGFuZCBDe2ZsYWdzfSBhcmUgcGFzc2VkIHRvIHRoZSBDe3JlLmNvbXBpbGUoKX0gZnVuY3Rpb24gYXMtaXMuIFNlZSB0aGUgUHl0aG9uIEN7cmV9IG1vZHVsZSBmb3IgYW4gZXhwbGFuYXRpb24gb2YgdGhlIGFjY2VwdGFibGUgcGF0dGVybnMgYW5kIGZsYWdzLiIiIgogICAgICAgIHN1cGVyKFJlZ2V4LHNlbGYpLl9faW5pdF9fKCkKCiAgICAgICAgaWYgaXNpbnN0YW5jZShwYXR0ZXJuLCBiYXNlc3RyaW5nKToKICAgICAgICAgICAgaWYgbm90IHBhdHRlcm46CiAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJudWxsIHN0cmluZyBwYXNzZWQgdG8gUmVnZXg7IHVzZSBFbXB0eSgpIGluc3RlYWQiLAogICAgICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpCgogICAgICAgICAgICBzZWxmLnBhdHRlcm4gPSBwYXR0ZXJuCiAgICAgICAgICAgIHNlbGYuZmxhZ3MgPSBmbGFncwoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgc2VsZi5yZSA9IHJlLmNvbXBpbGUoc2VsZi5wYXR0ZXJuLCBzZWxmLmZsYWdzKQogICAgICAgICAgICAgICAgc2VsZi5yZVN0cmluZyA9IHNlbGYucGF0dGVybgogICAgICAgICAgICBleGNlcHQgc3JlX2NvbnN0YW50cy5lcnJvcjoKICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oImludmFsaWQgcGF0dGVybiAoJXMpIHBhc3NlZCB0byBSZWdleCIgJSBwYXR0ZXJuLAogICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikKICAgICAgICAgICAgICAgIHJhaXNlCgogICAgICAgIGVsaWYgaXNpbnN0YW5jZShwYXR0ZXJuLCBSZWdleC5jb21waWxlZFJFdHlwZSk6CiAgICAgICAgICAgIHNlbGYucmUgPSBwYXR0ZXJuCiAgICAgICAgICAgIHNlbGYucGF0dGVybiA9IFwKICAgICAgICAgICAgc2VsZi5yZVN0cmluZyA9IHN0cihwYXR0ZXJuKQogICAgICAgICAgICBzZWxmLmZsYWdzID0gZmxhZ3MKICAgICAgICAgICAgCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiUmVnZXggbWF5IG9ubHkgYmUgY29uc3RydWN0ZWQgd2l0aCBhIHN0cmluZyBvciBhIGNvbXBpbGVkIFJFIG9iamVjdCIpCgogICAgICAgIHNlbGYubmFtZSA9IF91c3RyKHNlbGYpCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgIiArIHNlbGYubmFtZQogICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IEZhbHNlCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUKCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOgogICAgICAgIHJlc3VsdCA9IHNlbGYucmUubWF0Y2goaW5zdHJpbmcsbG9jKQogICAgICAgIGlmIG5vdCByZXN1bHQ6CiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQoKICAgICAgICBsb2MgPSByZXN1bHQuZW5kKCkKICAgICAgICBkID0gcmVzdWx0Lmdyb3VwZGljdCgpCiAgICAgICAgcmV0ID0gUGFyc2VSZXN1bHRzKHJlc3VsdC5ncm91cCgpKQogICAgICAgIGlmIGQ6CiAgICAgICAgICAgIGZvciBrIGluIGQ6CiAgICAgICAgICAgICAgICByZXRba10gPSBkW2tdCiAgICAgICAgcmV0dXJuIGxvYyxyZXQKCiAgICBkZWYgX19zdHJfXyggc2VsZiApOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHN1cGVyKFJlZ2V4LHNlbGYpLl9fc3RyX18oKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIHBhc3MKCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICJSZTooJXMpIiAlIHJlcHIoc2VsZi5wYXR0ZXJuKQoKICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByCgoKY2xhc3MgUXVvdGVkU3RyaW5nKFRva2VuKToKICAgIHIiIiIKICAgIFRva2VuIGZvciBtYXRjaGluZyBzdHJpbmdzIHRoYXQgYXJlIGRlbGltaXRlZCBieSBxdW90aW5nIGNoYXJhY3RlcnMuCiAgICAKICAgIERlZmluZWQgd2l0aCB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6CiAgICAgICAgLSBxdW90ZUNoYXIgLSBzdHJpbmcgb2Ygb25lIG9yIG1vcmUgY2hhcmFjdGVycyBkZWZpbmluZyB0aGUgcXVvdGUgZGVsaW1pdGluZyBzdHJpbmcKICAgICAgICAtIGVzY0NoYXIgLSBjaGFyYWN0ZXIgdG8gZXNjYXBlIHF1b3RlcywgdHlwaWNhbGx5IGJhY2tzbGFzaCAoZGVmYXVsdD1De05vbmV9KQogICAgICAgIC0gZXNjUXVvdGUgLSBzcGVjaWFsIHF1b3RlIHNlcXVlbmNlIHRvIGVzY2FwZSBhbiBlbWJlZGRlZCBxdW90ZSBzdHJpbmcgKHN1Y2ggYXMgU1FMJ3MgIiIgdG8gZXNjYXBlIGFuIGVtYmVkZGVkICIpIChkZWZhdWx0PUN7Tm9uZX0pCiAgICAgICAgLSBtdWx0aWxpbmUgLSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBxdW90ZXMgY2FuIHNwYW4gbXVsdGlwbGUgbGluZXMgKGRlZmF1bHQ9Q3tGYWxzZX0pCiAgICAgICAgLSB1bnF1b3RlUmVzdWx0cyAtIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBtYXRjaGVkIHRleHQgc2hvdWxkIGJlIHVucXVvdGVkIChkZWZhdWx0PUN7VHJ1ZX0pCiAgICAgICAgLSBlbmRRdW90ZUNoYXIgLSBzdHJpbmcgb2Ygb25lIG9yIG1vcmUgY2hhcmFjdGVycyBkZWZpbmluZyB0aGUgZW5kIG9mIHRoZSBxdW90ZSBkZWxpbWl0ZWQgc3RyaW5nIChkZWZhdWx0PUN7Tm9uZX0gPT4gc2FtZSBhcyBxdW90ZUNoYXIpCiAgICAgICAgLSBjb252ZXJ0V2hpdGVzcGFjZUVzY2FwZXMgLSBjb252ZXJ0IGVzY2FwZWQgd2hpdGVzcGFjZSAoQ3snXHQnfSwgQ3snXG4nfSwgZXRjLikgdG8gYWN0dWFsIHdoaXRlc3BhY2UgKGRlZmF1bHQ9Q3tUcnVlfSkKCiAgICBFeGFtcGxlOjoKICAgICAgICBxcyA9IFF1b3RlZFN0cmluZygnIicpCiAgICAgICAgcHJpbnQocXMuc2VhcmNoU3RyaW5nKCdsc2pkZiAiVGhpcyBpcyB0aGUgcXVvdGUiIHNsZGpmJykpCiAgICAgICAgY29tcGxleF9xcyA9IFF1b3RlZFN0cmluZygne3snLCBlbmRRdW90ZUNoYXI9J319JykKICAgICAgICBwcmludChjb21wbGV4X3FzLnNlYXJjaFN0cmluZygnbHNqZGYge3tUaGlzIGlzIHRoZSAicXVvdGUifX0gc2xkamYnKSkKICAgICAgICBzcWxfcXMgPSBRdW90ZWRTdHJpbmcoJyInLCBlc2NRdW90ZT0nIiInKQogICAgICAgIHByaW50KHNxbF9xcy5zZWFyY2hTdHJpbmcoJ2xzamRmICJUaGlzIGlzIHRoZSBxdW90ZSB3aXRoICIiZW1iZWRkZWQiIiBxdW90ZXMiIHNsZGpmJykpCiAgICBwcmludHM6OgogICAgICAgIFtbJ1RoaXMgaXMgdGhlIHF1b3RlJ11dCiAgICAgICAgW1snVGhpcyBpcyB0aGUgInF1b3RlIiddXQogICAgICAgIFtbJ1RoaXMgaXMgdGhlIHF1b3RlIHdpdGggImVtYmVkZGVkIiBxdW90ZXMnXV0KICAgICIiIgogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBxdW90ZUNoYXIsIGVzY0NoYXI9Tm9uZSwgZXNjUXVvdGU9Tm9uZSwgbXVsdGlsaW5lPUZhbHNlLCB1bnF1b3RlUmVzdWx0cz1UcnVlLCBlbmRRdW90ZUNoYXI9Tm9uZSwgY29udmVydFdoaXRlc3BhY2VFc2NhcGVzPVRydWUpOgogICAgICAgIHN1cGVyKFF1b3RlZFN0cmluZyxzZWxmKS5fX2luaXRfXygpCgogICAgICAgICMgcmVtb3ZlIHdoaXRlIHNwYWNlIGZyb20gcXVvdGUgY2hhcnMgLSB3b250IHdvcmsgYW55d2F5CiAgICAgICAgcXVvdGVDaGFyID0gcXVvdGVDaGFyLnN0cmlwKCkKICAgICAgICBpZiBub3QgcXVvdGVDaGFyOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJxdW90ZUNoYXIgY2Fubm90IGJlIHRoZSBlbXB0eSBzdHJpbmciLFN5bnRheFdhcm5pbmcsc3RhY2tsZXZlbD0yKQogICAgICAgICAgICByYWlzZSBTeW50YXhFcnJvcigpCgogICAgICAgIGlmIGVuZFF1b3RlQ2hhciBpcyBOb25lOgogICAgICAgICAgICBlbmRRdW90ZUNoYXIgPSBxdW90ZUNoYXIKICAgICAgICBlbHNlOgogICAgICAgICAgICBlbmRRdW90ZUNoYXIgPSBlbmRRdW90ZUNoYXIuc3RyaXAoKQogICAgICAgICAgICBpZiBub3QgZW5kUXVvdGVDaGFyOgogICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybigiZW5kUXVvdGVDaGFyIGNhbm5vdCBiZSB0aGUgZW1wdHkgc3RyaW5nIixTeW50YXhXYXJuaW5nLHN0YWNrbGV2ZWw9MikKICAgICAgICAgICAgICAgIHJhaXNlIFN5bnRheEVycm9yKCkKCiAgICAgICAgc2VsZi5xdW90ZUNoYXIgPSBxdW90ZUNoYXIKICAgICAgICBzZWxmLnF1b3RlQ2hhckxlbiA9IGxlbihxdW90ZUNoYXIpCiAgICAgICAgc2VsZi5maXJzdFF1b3RlQ2hhciA9IHF1b3RlQ2hhclswXQogICAgICAgIHNlbGYuZW5kUXVvdGVDaGFyID0gZW5kUXVvdGVDaGFyCiAgICAgICAgc2VsZi5lbmRRdW90ZUNoYXJMZW4gPSBsZW4oZW5kUXVvdGVDaGFyKQogICAgICAgIHNlbGYuZXNjQ2hhciA9IGVzY0NoYXIKICAgICAgICBzZWxmLmVzY1F1b3RlID0gZXNjUXVvdGUKICAgICAgICBzZWxmLnVucXVvdGVSZXN1bHRzID0gdW5xdW90ZVJlc3VsdHMKICAgICAgICBzZWxmLmNvbnZlcnRXaGl0ZXNwYWNlRXNjYXBlcyA9IGNvbnZlcnRXaGl0ZXNwYWNlRXNjYXBlcwoKICAgICAgICBpZiBtdWx0aWxpbmU6CiAgICAgICAgICAgIHNlbGYuZmxhZ3MgPSByZS5NVUxUSUxJTkUgfCByZS5ET1RBTEwKICAgICAgICAgICAgc2VsZi5wYXR0ZXJuID0gciclcyg/OlteJXMlc10nICUgXAogICAgICAgICAgICAgICAgKCByZS5lc2NhcGUoc2VsZi5xdW90ZUNoYXIpLAogICAgICAgICAgICAgICAgICBfZXNjYXBlUmVnZXhSYW5nZUNoYXJzKHNlbGYuZW5kUXVvdGVDaGFyWzBdKSwKICAgICAgICAgICAgICAgICAgKGVzY0NoYXIgaXMgbm90IE5vbmUgYW5kIF9lc2NhcGVSZWdleFJhbmdlQ2hhcnMoZXNjQ2hhcikgb3IgJycpICkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmZsYWdzID0gMAogICAgICAgICAgICBzZWxmLnBhdHRlcm4gPSByJyVzKD86W14lc1xuXHIlc10nICUgXAogICAgICAgICAgICAgICAgKCByZS5lc2NhcGUoc2VsZi5xdW90ZUNoYXIpLAogICAgICAgICAgICAgICAgICBfZXNjYXBlUmVnZXhSYW5nZUNoYXJzKHNlbGYuZW5kUXVvdGVDaGFyWzBdKSwKICAgICAgICAgICAgICAgICAgKGVzY0NoYXIgaXMgbm90IE5vbmUgYW5kIF9lc2NhcGVSZWdleFJhbmdlQ2hhcnMoZXNjQ2hhcikgb3IgJycpICkKICAgICAgICBpZiBsZW4oc2VsZi5lbmRRdW90ZUNoYXIpID4gMToKICAgICAgICAgICAgc2VsZi5wYXR0ZXJuICs9ICgKICAgICAgICAgICAgICAgICd8KD86JyArICcpfCg/Oicuam9pbigiJXNbXiVzXSIgJSAocmUuZXNjYXBlKHNlbGYuZW5kUXVvdGVDaGFyWzppXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2VzY2FwZVJlZ2V4UmFuZ2VDaGFycyhzZWxmLmVuZFF1b3RlQ2hhcltpXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihzZWxmLmVuZFF1b3RlQ2hhciktMSwwLC0xKSkgKyAnKScKICAgICAgICAgICAgICAgICkKICAgICAgICBpZiBlc2NRdW90ZToKICAgICAgICAgICAgc2VsZi5wYXR0ZXJuICs9IChyJ3woPzolcyknICUgcmUuZXNjYXBlKGVzY1F1b3RlKSkKICAgICAgICBpZiBlc2NDaGFyOgogICAgICAgICAgICBzZWxmLnBhdHRlcm4gKz0gKHInfCg/OiVzLiknICUgcmUuZXNjYXBlKGVzY0NoYXIpKQogICAgICAgICAgICBzZWxmLmVzY0NoYXJSZXBsYWNlUGF0dGVybiA9IHJlLmVzY2FwZShzZWxmLmVzY0NoYXIpKyIoLikiCiAgICAgICAgc2VsZi5wYXR0ZXJuICs9IChyJykqJXMnICUgcmUuZXNjYXBlKHNlbGYuZW5kUXVvdGVDaGFyKSkKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLnJlID0gcmUuY29tcGlsZShzZWxmLnBhdHRlcm4sIHNlbGYuZmxhZ3MpCiAgICAgICAgICAgIHNlbGYucmVTdHJpbmcgPSBzZWxmLnBhdHRlcm4KICAgICAgICBleGNlcHQgc3JlX2NvbnN0YW50cy5lcnJvcjoKICAgICAgICAgICAgd2FybmluZ3Mud2FybigiaW52YWxpZCBwYXR0ZXJuICglcykgcGFzc2VkIHRvIFJlZ2V4IiAlIHNlbGYucGF0dGVybiwKICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikKICAgICAgICAgICAgcmFpc2UKCiAgICAgICAgc2VsZi5uYW1lID0gX3VzdHIoc2VsZikKICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCAiICsgc2VsZi5uYW1lCiAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gRmFsc2UKICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gVHJ1ZQoKICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6CiAgICAgICAgcmVzdWx0ID0gaW5zdHJpbmdbbG9jXSA9PSBzZWxmLmZpcnN0UXVvdGVDaGFyIGFuZCBzZWxmLnJlLm1hdGNoKGluc3RyaW5nLGxvYykgb3IgTm9uZQogICAgICAgIGlmIG5vdCByZXN1bHQ6CiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQoKICAgICAgICBsb2MgPSByZXN1bHQuZW5kKCkKICAgICAgICByZXQgPSByZXN1bHQuZ3JvdXAoKQoKICAgICAgICBpZiBzZWxmLnVucXVvdGVSZXN1bHRzOgoKICAgICAgICAgICAgIyBzdHJpcCBvZmYgcXVvdGVzCiAgICAgICAgICAgIHJldCA9IHJldFtzZWxmLnF1b3RlQ2hhckxlbjotc2VsZi5lbmRRdW90ZUNoYXJMZW5dCgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHJldCxiYXNlc3RyaW5nKToKICAgICAgICAgICAgICAgICMgcmVwbGFjZSBlc2NhcGVkIHdoaXRlc3BhY2UKICAgICAgICAgICAgICAgIGlmICdcXCcgaW4gcmV0IGFuZCBzZWxmLmNvbnZlcnRXaGl0ZXNwYWNlRXNjYXBlczoKICAgICAgICAgICAgICAgICAgICB3c19tYXAgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHInXHQnIDogJ1x0JywKICAgICAgICAgICAgICAgICAgICAgICAgcidcbicgOiAnXG4nLAogICAgICAgICAgICAgICAgICAgICAgICByJ1xmJyA6ICdcZicsCiAgICAgICAgICAgICAgICAgICAgICAgIHInXHInIDogJ1xyJywKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZm9yIHdzbGl0LHdzY2hhciBpbiB3c19tYXAuaXRlbXMoKToKICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gcmV0LnJlcGxhY2Uod3NsaXQsIHdzY2hhcikKCiAgICAgICAgICAgICAgICAjIHJlcGxhY2UgZXNjYXBlZCBjaGFyYWN0ZXJzCiAgICAgICAgICAgICAgICBpZiBzZWxmLmVzY0NoYXI6CiAgICAgICAgICAgICAgICAgICAgcmV0ID0gcmUuc3ViKHNlbGYuZXNjQ2hhclJlcGxhY2VQYXR0ZXJuLCJcZzwxPiIscmV0KQoKICAgICAgICAgICAgICAgICMgcmVwbGFjZSBlc2NhcGVkIHF1b3RlcwogICAgICAgICAgICAgICAgaWYgc2VsZi5lc2NRdW90ZToKICAgICAgICAgICAgICAgICAgICByZXQgPSByZXQucmVwbGFjZShzZWxmLmVzY1F1b3RlLCBzZWxmLmVuZFF1b3RlQ2hhcikKCiAgICAgICAgcmV0dXJuIGxvYywgcmV0CgogICAgZGVmIF9fc3RyX18oIHNlbGYgKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzdXBlcihRdW90ZWRTdHJpbmcsc2VsZikuX19zdHJfXygpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgcGFzcwoKICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZToKICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gInF1b3RlZCBzdHJpbmcsIHN0YXJ0aW5nIHdpdGggJXMgZW5kaW5nIHdpdGggJXMiICUgKHNlbGYucXVvdGVDaGFyLCBzZWxmLmVuZFF1b3RlQ2hhcikKCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcgoKCmNsYXNzIENoYXJzTm90SW4oVG9rZW4pOgogICAgIiIiCiAgICBUb2tlbiBmb3IgbWF0Y2hpbmcgd29yZHMgY29tcG9zZWQgb2YgY2hhcmFjdGVycyBJe25vdH0gaW4gYSBnaXZlbiBzZXQgKHdpbGwKICAgIGluY2x1ZGUgd2hpdGVzcGFjZSBpbiBtYXRjaGVkIGNoYXJhY3RlcnMgaWYgbm90IGxpc3RlZCBpbiB0aGUgcHJvdmlkZWQgZXhjbHVzaW9uIHNldCAtIHNlZSBleGFtcGxlKS4KICAgIERlZmluZWQgd2l0aCBzdHJpbmcgY29udGFpbmluZyBhbGwgZGlzYWxsb3dlZCBjaGFyYWN0ZXJzLCBhbmQgYW4gb3B0aW9uYWwKICAgIG1pbmltdW0sIG1heGltdW0sIGFuZC9vciBleGFjdCBsZW5ndGguICBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgQ3ttaW59IGlzIDEgKGEKICAgIG1pbmltdW0gdmFsdWUgPCAxIGlzIG5vdCB2YWxpZCk7IHRoZSBkZWZhdWx0IHZhbHVlcyBmb3IgQ3ttYXh9IGFuZCBDe2V4YWN0fQogICAgYXJlIDAsIG1lYW5pbmcgbm8gbWF4aW11bSBvciBleGFjdCBsZW5ndGggcmVzdHJpY3Rpb24uCgogICAgRXhhbXBsZTo6CiAgICAgICAgIyBkZWZpbmUgYSBjb21tYS1zZXBhcmF0ZWQtdmFsdWUgYXMgYW55dGhpbmcgdGhhdCBpcyBub3QgYSAnLCcKICAgICAgICBjc3ZfdmFsdWUgPSBDaGFyc05vdEluKCcsJykKICAgICAgICBwcmludChkZWxpbWl0ZWRMaXN0KGNzdl92YWx1ZSkucGFyc2VTdHJpbmcoImRrbHMsbHNka2pmLHMxMiAzNCxAISMsMjEzIikpCiAgICBwcmludHM6OgogICAgICAgIFsnZGtscycsICdsc2RramYnLCAnczEyIDM0JywgJ0AhIycsICcyMTMnXQogICAgIiIiCiAgICBkZWYgX19pbml0X18oIHNlbGYsIG5vdENoYXJzLCBtaW49MSwgbWF4PTAsIGV4YWN0PTAgKToKICAgICAgICBzdXBlcihDaGFyc05vdEluLHNlbGYpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gRmFsc2UKICAgICAgICBzZWxmLm5vdENoYXJzID0gbm90Q2hhcnMKCiAgICAgICAgaWYgbWluIDwgMToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiY2Fubm90IHNwZWNpZnkgYSBtaW5pbXVtIGxlbmd0aCA8IDE7IHVzZSBPcHRpb25hbChDaGFyc05vdEluKCkpIGlmIHplcm8tbGVuZ3RoIGNoYXIgZ3JvdXAgaXMgcGVybWl0dGVkIikKCiAgICAgICAgc2VsZi5taW5MZW4gPSBtaW4KCiAgICAgICAgaWYgbWF4ID4gMDoKICAgICAgICAgICAgc2VsZi5tYXhMZW4gPSBtYXgKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLm1heExlbiA9IF9NQVhfSU5UCgogICAgICAgIGlmIGV4YWN0ID4gMDoKICAgICAgICAgICAgc2VsZi5tYXhMZW4gPSBleGFjdAogICAgICAgICAgICBzZWxmLm1pbkxlbiA9IGV4YWN0CgogICAgICAgIHNlbGYubmFtZSA9IF91c3RyKHNlbGYpCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgIiArIHNlbGYubmFtZQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSAoIHNlbGYubWluTGVuID09IDAgKQogICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IEZhbHNlCgogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToKICAgICAgICBpZiBpbnN0cmluZ1tsb2NdIGluIHNlbGYubm90Q2hhcnM6CiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQoKICAgICAgICBzdGFydCA9IGxvYwogICAgICAgIGxvYyArPSAxCiAgICAgICAgbm90Y2hhcnMgPSBzZWxmLm5vdENoYXJzCiAgICAgICAgbWF4bGVuID0gbWluKCBzdGFydCtzZWxmLm1heExlbiwgbGVuKGluc3RyaW5nKSApCiAgICAgICAgd2hpbGUgbG9jIDwgbWF4bGVuIGFuZCBcCiAgICAgICAgICAgICAgKGluc3RyaW5nW2xvY10gbm90IGluIG5vdGNoYXJzKToKICAgICAgICAgICAgbG9jICs9IDEKCiAgICAgICAgaWYgbG9jIC0gc3RhcnQgPCBzZWxmLm1pbkxlbjoKICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpCgogICAgICAgIHJldHVybiBsb2MsIGluc3RyaW5nW3N0YXJ0OmxvY10KCiAgICBkZWYgX19zdHJfXyggc2VsZiApOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHN1cGVyKENoYXJzTm90SW4sIHNlbGYpLl9fc3RyX18oKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIHBhc3MKCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6CiAgICAgICAgICAgIGlmIGxlbihzZWxmLm5vdENoYXJzKSA+IDQ6CiAgICAgICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAiIVc6KCVzLi4uKSIgJSBzZWxmLm5vdENoYXJzWzo0XQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gIiFXOiglcykiICUgc2VsZi5ub3RDaGFycwoKICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByCgpjbGFzcyBXaGl0ZShUb2tlbik6CiAgICAiIiIKICAgIFNwZWNpYWwgbWF0Y2hpbmcgY2xhc3MgZm9yIG1hdGNoaW5nIHdoaXRlc3BhY2UuICBOb3JtYWxseSwgd2hpdGVzcGFjZSBpcyBpZ25vcmVkCiAgICBieSBweXBhcnNpbmcgZ3JhbW1hcnMuICBUaGlzIGNsYXNzIGlzIGluY2x1ZGVkIHdoZW4gc29tZSB3aGl0ZXNwYWNlIHN0cnVjdHVyZXMKICAgIGFyZSBzaWduaWZpY2FudC4gIERlZmluZSB3aXRoIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHdoaXRlc3BhY2UgY2hhcmFjdGVycyB0byBiZQogICAgbWF0Y2hlZDsgZGVmYXVsdCBpcyBDeyIgXFx0XFxyXFxuIn0uICBBbHNvIHRha2VzIG9wdGlvbmFsIEN7bWlufSwgQ3ttYXh9LCBhbmQgQ3tleGFjdH0gYXJndW1lbnRzLAogICAgYXMgZGVmaW5lZCBmb3IgdGhlIEN7THtXb3JkfX0gY2xhc3MuCiAgICAiIiIKICAgIHdoaXRlU3RycyA9IHsKICAgICAgICAiICIgOiAiPFNQQz4iLAogICAgICAgICJcdCI6ICI8VEFCPiIsCiAgICAgICAgIlxuIjogIjxMRj4iLAogICAgICAgICJcciI6ICI8Q1I+IiwKICAgICAgICAiXGYiOiAiPEZGPiIsCiAgICAgICAgfQogICAgZGVmIF9faW5pdF9fKHNlbGYsIHdzPSIgXHRcclxuIiwgbWluPTEsIG1heD0wLCBleGFjdD0wKToKICAgICAgICBzdXBlcihXaGl0ZSxzZWxmKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5tYXRjaFdoaXRlID0gd3MKICAgICAgICBzZWxmLnNldFdoaXRlc3BhY2VDaGFycyggIiIuam9pbihjIGZvciBjIGluIHNlbGYud2hpdGVDaGFycyBpZiBjIG5vdCBpbiBzZWxmLm1hdGNoV2hpdGUpICkKICAgICAgICAjfiBzZWxmLmxlYXZlV2hpdGVzcGFjZSgpCiAgICAgICAgc2VsZi5uYW1lID0gKCIiLmpvaW4oV2hpdGUud2hpdGVTdHJzW2NdIGZvciBjIGluIHNlbGYubWF0Y2hXaGl0ZSkpCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUKICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCAiICsgc2VsZi5uYW1lCgogICAgICAgIHNlbGYubWluTGVuID0gbWluCgogICAgICAgIGlmIG1heCA+IDA6CiAgICAgICAgICAgIHNlbGYubWF4TGVuID0gbWF4CiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5tYXhMZW4gPSBfTUFYX0lOVAoKICAgICAgICBpZiBleGFjdCA+IDA6CiAgICAgICAgICAgIHNlbGYubWF4TGVuID0gZXhhY3QKICAgICAgICAgICAgc2VsZi5taW5MZW4gPSBleGFjdAoKICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6CiAgICAgICAgaWYgbm90KGluc3RyaW5nWyBsb2MgXSBpbiBzZWxmLm1hdGNoV2hpdGUpOgogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikKICAgICAgICBzdGFydCA9IGxvYwogICAgICAgIGxvYyArPSAxCiAgICAgICAgbWF4bG9jID0gc3RhcnQgKyBzZWxmLm1heExlbgogICAgICAgIG1heGxvYyA9IG1pbiggbWF4bG9jLCBsZW4oaW5zdHJpbmcpICkKICAgICAgICB3aGlsZSBsb2MgPCBtYXhsb2MgYW5kIGluc3RyaW5nW2xvY10gaW4gc2VsZi5tYXRjaFdoaXRlOgogICAgICAgICAgICBsb2MgKz0gMQoKICAgICAgICBpZiBsb2MgLSBzdGFydCA8IHNlbGYubWluTGVuOgogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikKCiAgICAgICAgcmV0dXJuIGxvYywgaW5zdHJpbmdbc3RhcnQ6bG9jXQoKCmNsYXNzIF9Qb3NpdGlvblRva2VuKFRva2VuKToKICAgIGRlZiBfX2luaXRfXyggc2VsZiApOgogICAgICAgIHN1cGVyKF9Qb3NpdGlvblRva2VuLHNlbGYpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLm5hbWU9c2VsZi5fX2NsYXNzX18uX19uYW1lX18KICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gVHJ1ZQogICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IEZhbHNlCgpjbGFzcyBHb1RvQ29sdW1uKF9Qb3NpdGlvblRva2VuKToKICAgICIiIgogICAgVG9rZW4gdG8gYWR2YW5jZSB0byBhIHNwZWNpZmljIGNvbHVtbiBvZiBpbnB1dCB0ZXh0OyB1c2VmdWwgZm9yIHRhYnVsYXIgcmVwb3J0IHNjcmFwaW5nLgogICAgIiIiCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGNvbG5vICk6CiAgICAgICAgc3VwZXIoR29Ub0NvbHVtbixzZWxmKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5jb2wgPSBjb2xubwoKICAgIGRlZiBwcmVQYXJzZSggc2VsZiwgaW5zdHJpbmcsIGxvYyApOgogICAgICAgIGlmIGNvbChsb2MsaW5zdHJpbmcpICE9IHNlbGYuY29sOgogICAgICAgICAgICBpbnN0cmxlbiA9IGxlbihpbnN0cmluZykKICAgICAgICAgICAgaWYgc2VsZi5pZ25vcmVFeHByczoKICAgICAgICAgICAgICAgIGxvYyA9IHNlbGYuX3NraXBJZ25vcmFibGVzKCBpbnN0cmluZywgbG9jICkKICAgICAgICAgICAgd2hpbGUgbG9jIDwgaW5zdHJsZW4gYW5kIGluc3RyaW5nW2xvY10uaXNzcGFjZSgpIGFuZCBjb2woIGxvYywgaW5zdHJpbmcgKSAhPSBzZWxmLmNvbCA6CiAgICAgICAgICAgICAgICBsb2MgKz0gMQogICAgICAgIHJldHVybiBsb2MKCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOgogICAgICAgIHRoaXNjb2wgPSBjb2woIGxvYywgaW5zdHJpbmcgKQogICAgICAgIGlmIHRoaXNjb2wgPiBzZWxmLmNvbDoKICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oIGluc3RyaW5nLCBsb2MsICJUZXh0IG5vdCBpbiBleHBlY3RlZCBjb2x1bW4iLCBzZWxmICkKICAgICAgICBuZXdsb2MgPSBsb2MgKyBzZWxmLmNvbCAtIHRoaXNjb2wKICAgICAgICByZXQgPSBpbnN0cmluZ1sgbG9jOiBuZXdsb2MgXQogICAgICAgIHJldHVybiBuZXdsb2MsIHJldAoKCmNsYXNzIExpbmVTdGFydChfUG9zaXRpb25Ub2tlbik6CiAgICAiIiIKICAgIE1hdGNoZXMgaWYgY3VycmVudCBwb3NpdGlvbiBpcyBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZSB3aXRoaW4gdGhlIHBhcnNlIHN0cmluZwogICAgCiAgICBFeGFtcGxlOjoKICAgIAogICAgICAgIHRlc3QgPSAnJydcCiAgICAgICAgQUFBIHRoaXMgbGluZQogICAgICAgIEFBQSBhbmQgdGhpcyBsaW5lCiAgICAgICAgICBBQUEgYnV0IG5vdCB0aGlzIG9uZQogICAgICAgIEIgQUFBIGFuZCBkZWZpbml0ZWx5IG5vdCB0aGlzIG9uZQogICAgICAgICcnJwoKICAgICAgICBmb3IgdCBpbiAoTGluZVN0YXJ0KCkgKyAnQUFBJyArIHJlc3RPZkxpbmUpLnNlYXJjaFN0cmluZyh0ZXN0KToKICAgICAgICAgICAgcHJpbnQodCkKICAgIAogICAgUHJpbnRzOjoKICAgICAgICBbJ0FBQScsICcgdGhpcyBsaW5lJ10KICAgICAgICBbJ0FBQScsICcgYW5kIHRoaXMgbGluZSddICAgIAoKICAgICIiIgogICAgZGVmIF9faW5pdF9fKCBzZWxmICk6CiAgICAgICAgc3VwZXIoTGluZVN0YXJ0LHNlbGYpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCBzdGFydCBvZiBsaW5lIgoKICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6CiAgICAgICAgaWYgY29sKGxvYywgaW5zdHJpbmcpID09IDE6CiAgICAgICAgICAgIHJldHVybiBsb2MsIFtdCiAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpCgpjbGFzcyBMaW5lRW5kKF9Qb3NpdGlvblRva2VuKToKICAgICIiIgogICAgTWF0Y2hlcyBpZiBjdXJyZW50IHBvc2l0aW9uIGlzIGF0IHRoZSBlbmQgb2YgYSBsaW5lIHdpdGhpbiB0aGUgcGFyc2Ugc3RyaW5nCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyggc2VsZiApOgogICAgICAgIHN1cGVyKExpbmVFbmQsc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYuc2V0V2hpdGVzcGFjZUNoYXJzKCBQYXJzZXJFbGVtZW50LkRFRkFVTFRfV0hJVEVfQ0hBUlMucmVwbGFjZSgiXG4iLCIiKSApCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgZW5kIG9mIGxpbmUiCgogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToKICAgICAgICBpZiBsb2M8bGVuKGluc3RyaW5nKToKICAgICAgICAgICAgaWYgaW5zdHJpbmdbbG9jXSA9PSAiXG4iOgogICAgICAgICAgICAgICAgcmV0dXJuIGxvYysxLCAiXG4iCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikKICAgICAgICBlbGlmIGxvYyA9PSBsZW4oaW5zdHJpbmcpOgogICAgICAgICAgICByZXR1cm4gbG9jKzEsIFtdCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpCgpjbGFzcyBTdHJpbmdTdGFydChfUG9zaXRpb25Ub2tlbik6CiAgICAiIiIKICAgIE1hdGNoZXMgaWYgY3VycmVudCBwb3NpdGlvbiBpcyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwYXJzZSBzdHJpbmcKICAgICIiIgogICAgZGVmIF9faW5pdF9fKCBzZWxmICk6CiAgICAgICAgc3VwZXIoU3RyaW5nU3RhcnQsc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkIHN0YXJ0IG9mIHRleHQiCgogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToKICAgICAgICBpZiBsb2MgIT0gMDoKICAgICAgICAgICAgIyBzZWUgaWYgZW50aXJlIHN0cmluZyB1cCB0byBoZXJlIGlzIGp1c3Qgd2hpdGVzcGFjZSBhbmQgaWdub3JlYWJsZXMKICAgICAgICAgICAgaWYgbG9jICE9IHNlbGYucHJlUGFyc2UoIGluc3RyaW5nLCAwICk6CiAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikKICAgICAgICByZXR1cm4gbG9jLCBbXQoKY2xhc3MgU3RyaW5nRW5kKF9Qb3NpdGlvblRva2VuKToKICAgICIiIgogICAgTWF0Y2hlcyBpZiBjdXJyZW50IHBvc2l0aW9uIGlzIGF0IHRoZSBlbmQgb2YgdGhlIHBhcnNlIHN0cmluZwogICAgIiIiCiAgICBkZWYgX19pbml0X18oIHNlbGYgKToKICAgICAgICBzdXBlcihTdHJpbmdFbmQsc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkIGVuZCBvZiB0ZXh0IgoKICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6CiAgICAgICAgaWYgbG9jIDwgbGVuKGluc3RyaW5nKToKICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpCiAgICAgICAgZWxpZiBsb2MgPT0gbGVuKGluc3RyaW5nKToKICAgICAgICAgICAgcmV0dXJuIGxvYysxLCBbXQogICAgICAgIGVsaWYgbG9jID4gbGVuKGluc3RyaW5nKToKICAgICAgICAgICAgcmV0dXJuIGxvYywgW10KICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikKCmNsYXNzIFdvcmRTdGFydChfUG9zaXRpb25Ub2tlbik6CiAgICAiIiIKICAgIE1hdGNoZXMgaWYgdGhlIGN1cnJlbnQgcG9zaXRpb24gaXMgYXQgdGhlIGJlZ2lubmluZyBvZiBhIFdvcmQsIGFuZAogICAgaXMgbm90IHByZWNlZGVkIGJ5IGFueSBjaGFyYWN0ZXIgaW4gYSBnaXZlbiBzZXQgb2YgQ3t3b3JkQ2hhcnN9CiAgICAoZGVmYXVsdD1De3ByaW50YWJsZXN9KS4gVG8gZW11bGF0ZSB0aGUgQ3tcYn0gYmVoYXZpb3Igb2YgcmVndWxhciBleHByZXNzaW9ucywKICAgIHVzZSBDe1dvcmRTdGFydChhbHBoYW51bXMpfS4gQ3tXb3JkU3RhcnR9IHdpbGwgYWxzbyBtYXRjaCBhdCB0aGUgYmVnaW5uaW5nIG9mCiAgICB0aGUgc3RyaW5nIGJlaW5nIHBhcnNlZCwgb3IgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUuCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB3b3JkQ2hhcnMgPSBwcmludGFibGVzKToKICAgICAgICBzdXBlcihXb3JkU3RhcnQsc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYud29yZENoYXJzID0gc2V0KHdvcmRDaGFycykKICAgICAgICBzZWxmLmVycm1zZyA9ICJOb3QgYXQgdGhlIHN0YXJ0IG9mIGEgd29yZCIKCiAgICBkZWYgcGFyc2VJbXBsKHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6CiAgICAgICAgaWYgbG9jICE9IDA6CiAgICAgICAgICAgIGlmIChpbnN0cmluZ1tsb2MtMV0gaW4gc2VsZi53b3JkQ2hhcnMgb3IKICAgICAgICAgICAgICAgIGluc3RyaW5nW2xvY10gbm90IGluIHNlbGYud29yZENoYXJzKToKICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQogICAgICAgIHJldHVybiBsb2MsIFtdCgpjbGFzcyBXb3JkRW5kKF9Qb3NpdGlvblRva2VuKToKICAgICIiIgogICAgTWF0Y2hlcyBpZiB0aGUgY3VycmVudCBwb3NpdGlvbiBpcyBhdCB0aGUgZW5kIG9mIGEgV29yZCwgYW5kCiAgICBpcyBub3QgZm9sbG93ZWQgYnkgYW55IGNoYXJhY3RlciBpbiBhIGdpdmVuIHNldCBvZiBDe3dvcmRDaGFyc30KICAgIChkZWZhdWx0PUN7cHJpbnRhYmxlc30pLiBUbyBlbXVsYXRlIHRoZSBDe1xifSBiZWhhdmlvciBvZiByZWd1bGFyIGV4cHJlc3Npb25zLAogICAgdXNlIEN7V29yZEVuZChhbHBoYW51bXMpfS4gQ3tXb3JkRW5kfSB3aWxsIGFsc28gbWF0Y2ggYXQgdGhlIGVuZCBvZgogICAgdGhlIHN0cmluZyBiZWluZyBwYXJzZWQsIG9yIGF0IHRoZSBlbmQgb2YgYSBsaW5lLgogICAgIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgd29yZENoYXJzID0gcHJpbnRhYmxlcyk6CiAgICAgICAgc3VwZXIoV29yZEVuZCxzZWxmKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi53b3JkQ2hhcnMgPSBzZXQod29yZENoYXJzKQogICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBGYWxzZQogICAgICAgIHNlbGYuZXJybXNnID0gIk5vdCBhdCB0aGUgZW5kIG9mIGEgd29yZCIKCiAgICBkZWYgcGFyc2VJbXBsKHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6CiAgICAgICAgaW5zdHJsZW4gPSBsZW4oaW5zdHJpbmcpCiAgICAgICAgaWYgaW5zdHJsZW4+MCBhbmQgbG9jPGluc3RybGVuOgogICAgICAgICAgICBpZiAoaW5zdHJpbmdbbG9jXSBpbiBzZWxmLndvcmRDaGFycyBvcgogICAgICAgICAgICAgICAgaW5zdHJpbmdbbG9jLTFdIG5vdCBpbiBzZWxmLndvcmRDaGFycyk6CiAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikKICAgICAgICByZXR1cm4gbG9jLCBbXQoKCmNsYXNzIFBhcnNlRXhwcmVzc2lvbihQYXJzZXJFbGVtZW50KToKICAgICIiIgogICAgQWJzdHJhY3Qgc3ViY2xhc3Mgb2YgUGFyc2VyRWxlbWVudCwgZm9yIGNvbWJpbmluZyBhbmQgcG9zdC1wcm9jZXNzaW5nIHBhcnNlZCB0b2tlbnMuCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwcnMsIHNhdmVsaXN0ID0gRmFsc2UgKToKICAgICAgICBzdXBlcihQYXJzZUV4cHJlc3Npb24sc2VsZikuX19pbml0X18oc2F2ZWxpc3QpCiAgICAgICAgaWYgaXNpbnN0YW5jZSggZXhwcnMsIF9nZW5lcmF0b3JUeXBlICk6CiAgICAgICAgICAgIGV4cHJzID0gbGlzdChleHBycykKCiAgICAgICAgaWYgaXNpbnN0YW5jZSggZXhwcnMsIGJhc2VzdHJpbmcgKToKICAgICAgICAgICAgc2VsZi5leHBycyA9IFsgUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBleHBycyApIF0KICAgICAgICBlbGlmIGlzaW5zdGFuY2UoIGV4cHJzLCBjb2xsZWN0aW9ucy5JdGVyYWJsZSApOgogICAgICAgICAgICBleHBycyA9IGxpc3QoZXhwcnMpCiAgICAgICAgICAgICMgaWYgc2VxdWVuY2Ugb2Ygc3RyaW5ncyBwcm92aWRlZCwgd3JhcCB3aXRoIExpdGVyYWwKICAgICAgICAgICAgaWYgYWxsKGlzaW5zdGFuY2UoZXhwciwgYmFzZXN0cmluZykgZm9yIGV4cHIgaW4gZXhwcnMpOgogICAgICAgICAgICAgICAgZXhwcnMgPSBtYXAoUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzLCBleHBycykKICAgICAgICAgICAgc2VsZi5leHBycyA9IGxpc3QoZXhwcnMpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgc2VsZi5leHBycyA9IGxpc3QoIGV4cHJzICkKICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKICAgICAgICAgICAgICAgIHNlbGYuZXhwcnMgPSBbIGV4cHJzIF0KICAgICAgICBzZWxmLmNhbGxQcmVwYXJzZSA9IEZhbHNlCgogICAgZGVmIF9fZ2V0aXRlbV9fKCBzZWxmLCBpICk6CiAgICAgICAgcmV0dXJuIHNlbGYuZXhwcnNbaV0KCiAgICBkZWYgYXBwZW5kKCBzZWxmLCBvdGhlciApOgogICAgICAgIHNlbGYuZXhwcnMuYXBwZW5kKCBvdGhlciApCiAgICAgICAgc2VsZi5zdHJSZXByID0gTm9uZQogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIGxlYXZlV2hpdGVzcGFjZSggc2VsZiApOgogICAgICAgICIiIkV4dGVuZHMgQ3tsZWF2ZVdoaXRlc3BhY2V9IGRlZmluZWQgaW4gYmFzZSBjbGFzcywgYW5kIGFsc28gaW52b2tlcyBDe2xlYXZlV2hpdGVzcGFjZX0gb24KICAgICAgICAgICBhbGwgY29udGFpbmVkIGV4cHJlc3Npb25zLiIiIgogICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBGYWxzZQogICAgICAgIHNlbGYuZXhwcnMgPSBbIGUuY29weSgpIGZvciBlIGluIHNlbGYuZXhwcnMgXQogICAgICAgIGZvciBlIGluIHNlbGYuZXhwcnM6CiAgICAgICAgICAgIGUubGVhdmVXaGl0ZXNwYWNlKCkKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBpZ25vcmUoIHNlbGYsIG90aGVyICk6CiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIFN1cHByZXNzICk6CiAgICAgICAgICAgIGlmIG90aGVyIG5vdCBpbiBzZWxmLmlnbm9yZUV4cHJzOgogICAgICAgICAgICAgICAgc3VwZXIoIFBhcnNlRXhwcmVzc2lvbiwgc2VsZikuaWdub3JlKCBvdGhlciApCiAgICAgICAgICAgICAgICBmb3IgZSBpbiBzZWxmLmV4cHJzOgogICAgICAgICAgICAgICAgICAgIGUuaWdub3JlKCBzZWxmLmlnbm9yZUV4cHJzWy0xXSApCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc3VwZXIoIFBhcnNlRXhwcmVzc2lvbiwgc2VsZikuaWdub3JlKCBvdGhlciApCiAgICAgICAgICAgIGZvciBlIGluIHNlbGYuZXhwcnM6CiAgICAgICAgICAgICAgICBlLmlnbm9yZSggc2VsZi5pZ25vcmVFeHByc1stMV0gKQogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIF9fc3RyX18oIHNlbGYgKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzdXBlcihQYXJzZUV4cHJlc3Npb24sc2VsZikuX19zdHJfXygpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgcGFzcwoKICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZToKICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gIiVzOiglcykiICUgKCBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgX3VzdHIoc2VsZi5leHBycykgKQogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHIKCiAgICBkZWYgc3RyZWFtbGluZSggc2VsZiApOgogICAgICAgIHN1cGVyKFBhcnNlRXhwcmVzc2lvbixzZWxmKS5zdHJlYW1saW5lKCkKCiAgICAgICAgZm9yIGUgaW4gc2VsZi5leHByczoKICAgICAgICAgICAgZS5zdHJlYW1saW5lKCkKCiAgICAgICAgIyBjb2xsYXBzZSBuZXN0ZWQgQW5kJ3Mgb2YgdGhlIGZvcm0gQW5kKCBBbmQoIEFuZCggYSxiKSwgYyksIGQpIHRvIEFuZCggYSxiLGMsZCApCiAgICAgICAgIyBidXQgb25seSBpZiB0aGVyZSBhcmUgbm8gcGFyc2UgYWN0aW9ucyBvciByZXN1bHRzTmFtZXMgb24gdGhlIG5lc3RlZCBBbmQncwogICAgICAgICMgKGxpa2V3aXNlIGZvciBPcidzIGFuZCBNYXRjaEZpcnN0J3MpCiAgICAgICAgaWYgKCBsZW4oc2VsZi5leHBycykgPT0gMiApOgogICAgICAgICAgICBvdGhlciA9IHNlbGYuZXhwcnNbMF0KICAgICAgICAgICAgaWYgKCBpc2luc3RhbmNlKCBvdGhlciwgc2VsZi5fX2NsYXNzX18gKSBhbmQKICAgICAgICAgICAgICAgICAgbm90KG90aGVyLnBhcnNlQWN0aW9uKSBhbmQKICAgICAgICAgICAgICAgICAgb3RoZXIucmVzdWx0c05hbWUgaXMgTm9uZSBhbmQKICAgICAgICAgICAgICAgICAgbm90IG90aGVyLmRlYnVnICk6CiAgICAgICAgICAgICAgICBzZWxmLmV4cHJzID0gb3RoZXIuZXhwcnNbOl0gKyBbIHNlbGYuZXhwcnNbMV0gXQogICAgICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gTm9uZQogICAgICAgICAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSB8PSBvdGhlci5tYXlSZXR1cm5FbXB0eQogICAgICAgICAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yICB8PSBvdGhlci5tYXlJbmRleEVycm9yCgogICAgICAgICAgICBvdGhlciA9IHNlbGYuZXhwcnNbLTFdCiAgICAgICAgICAgIGlmICggaXNpbnN0YW5jZSggb3RoZXIsIHNlbGYuX19jbGFzc19fICkgYW5kCiAgICAgICAgICAgICAgICAgIG5vdChvdGhlci5wYXJzZUFjdGlvbikgYW5kCiAgICAgICAgICAgICAgICAgIG90aGVyLnJlc3VsdHNOYW1lIGlzIE5vbmUgYW5kCiAgICAgICAgICAgICAgICAgIG5vdCBvdGhlci5kZWJ1ZyApOgogICAgICAgICAgICAgICAgc2VsZi5leHBycyA9IHNlbGYuZXhwcnNbOi0xXSArIG90aGVyLmV4cHJzWzpdCiAgICAgICAgICAgICAgICBzZWxmLnN0clJlcHIgPSBOb25lCiAgICAgICAgICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5IHw9IG90aGVyLm1heVJldHVybkVtcHR5CiAgICAgICAgICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgIHw9IG90aGVyLm1heUluZGV4RXJyb3IKCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgIiArIF91c3RyKHNlbGYpCiAgICAgICAgCiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgc2V0UmVzdWx0c05hbWUoIHNlbGYsIG5hbWUsIGxpc3RBbGxNYXRjaGVzPUZhbHNlICk6CiAgICAgICAgcmV0ID0gc3VwZXIoUGFyc2VFeHByZXNzaW9uLHNlbGYpLnNldFJlc3VsdHNOYW1lKG5hbWUsbGlzdEFsbE1hdGNoZXMpCiAgICAgICAgcmV0dXJuIHJldAoKICAgIGRlZiB2YWxpZGF0ZSggc2VsZiwgdmFsaWRhdGVUcmFjZT1bXSApOgogICAgICAgIHRtcCA9IHZhbGlkYXRlVHJhY2VbOl0rW3NlbGZdCiAgICAgICAgZm9yIGUgaW4gc2VsZi5leHByczoKICAgICAgICAgICAgZS52YWxpZGF0ZSh0bXApCiAgICAgICAgc2VsZi5jaGVja1JlY3Vyc2lvbiggW10gKQogICAgICAgIAogICAgZGVmIGNvcHkoc2VsZik6CiAgICAgICAgcmV0ID0gc3VwZXIoUGFyc2VFeHByZXNzaW9uLHNlbGYpLmNvcHkoKQogICAgICAgIHJldC5leHBycyA9IFtlLmNvcHkoKSBmb3IgZSBpbiBzZWxmLmV4cHJzXQogICAgICAgIHJldHVybiByZXQKCmNsYXNzIEFuZChQYXJzZUV4cHJlc3Npb24pOgogICAgIiIiCiAgICBSZXF1aXJlcyBhbGwgZ2l2ZW4gQ3tQYXJzZUV4cHJlc3Npb259cyB0byBiZSBmb3VuZCBpbiB0aGUgZ2l2ZW4gb3JkZXIuCiAgICBFeHByZXNzaW9ucyBtYXkgYmUgc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2UuCiAgICBNYXkgYmUgY29uc3RydWN0ZWQgdXNpbmcgdGhlIEN7JysnfSBvcGVyYXRvci4KICAgIE1heSBhbHNvIGJlIGNvbnN0cnVjdGVkIHVzaW5nIHRoZSBDeyctJ30gb3BlcmF0b3IsIHdoaWNoIHdpbGwgc3VwcHJlc3MgYmFja3RyYWNraW5nLgoKICAgIEV4YW1wbGU6OgogICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpCiAgICAgICAgbmFtZV9leHByID0gT25lT3JNb3JlKFdvcmQoYWxwaGFzKSkKCiAgICAgICAgZXhwciA9IEFuZChbaW50ZWdlcigiaWQiKSxuYW1lX2V4cHIoIm5hbWUiKSxpbnRlZ2VyKCJhZ2UiKV0pCiAgICAgICAgIyBtb3JlIGVhc2lseSB3cml0dGVuIGFzOgogICAgICAgIGV4cHIgPSBpbnRlZ2VyKCJpZCIpICsgbmFtZV9leHByKCJuYW1lIikgKyBpbnRlZ2VyKCJhZ2UiKQogICAgIiIiCgogICAgY2xhc3MgX0Vycm9yU3RvcChFbXB0eSk6CiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgICAgIHN1cGVyKEFuZC5fRXJyb3JTdG9wLHNlbGYpLl9faW5pdF9fKCphcmdzLCAqKmt3YXJncykKICAgICAgICAgICAgc2VsZi5uYW1lID0gJy0nCiAgICAgICAgICAgIHNlbGYubGVhdmVXaGl0ZXNwYWNlKCkKCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHJzLCBzYXZlbGlzdCA9IFRydWUgKToKICAgICAgICBzdXBlcihBbmQsc2VsZikuX19pbml0X18oZXhwcnMsIHNhdmVsaXN0KQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBhbGwoZS5tYXlSZXR1cm5FbXB0eSBmb3IgZSBpbiBzZWxmLmV4cHJzKQogICAgICAgIHNlbGYuc2V0V2hpdGVzcGFjZUNoYXJzKCBzZWxmLmV4cHJzWzBdLndoaXRlQ2hhcnMgKQogICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBzZWxmLmV4cHJzWzBdLnNraXBXaGl0ZXNwYWNlCiAgICAgICAgc2VsZi5jYWxsUHJlcGFyc2UgPSBUcnVlCgogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToKICAgICAgICAjIHBhc3MgRmFsc2UgYXMgbGFzdCBhcmcgdG8gX3BhcnNlIGZvciBmaXJzdCBlbGVtZW50LCBzaW5jZSB3ZSBhbHJlYWR5CiAgICAgICAgIyBwcmUtcGFyc2VkIHRoZSBzdHJpbmcgYXMgcGFydCBvZiBvdXIgQW5kIHByZS1wYXJzaW5nCiAgICAgICAgbG9jLCByZXN1bHRsaXN0ID0gc2VsZi5leHByc1swXS5fcGFyc2UoIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucywgY2FsbFByZVBhcnNlPUZhbHNlICkKICAgICAgICBlcnJvclN0b3AgPSBGYWxzZQogICAgICAgIGZvciBlIGluIHNlbGYuZXhwcnNbMTpdOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGUsIEFuZC5fRXJyb3JTdG9wKToKICAgICAgICAgICAgICAgIGVycm9yU3RvcCA9IFRydWUKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlmIGVycm9yU3RvcDoKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBsb2MsIGV4cHJ0b2tlbnMgPSBlLl9wYXJzZSggaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zICkKICAgICAgICAgICAgICAgIGV4Y2VwdCBQYXJzZVN5bnRheEV4Y2VwdGlvbjoKICAgICAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICAgICAgICAgZXhjZXB0IFBhcnNlQmFzZUV4Y2VwdGlvbiBhcyBwZToKICAgICAgICAgICAgICAgICAgICBwZS5fX3RyYWNlYmFja19fID0gTm9uZQogICAgICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlU3ludGF4RXhjZXB0aW9uLl9mcm9tX2V4Y2VwdGlvbihwZSkKICAgICAgICAgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlU3ludGF4RXhjZXB0aW9uKGluc3RyaW5nLCBsZW4oaW5zdHJpbmcpLCBzZWxmLmVycm1zZywgc2VsZikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGxvYywgZXhwcnRva2VucyA9IGUuX3BhcnNlKCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnMgKQogICAgICAgICAgICBpZiBleHBydG9rZW5zIG9yIGV4cHJ0b2tlbnMuaGFza2V5cygpOgogICAgICAgICAgICAgICAgcmVzdWx0bGlzdCArPSBleHBydG9rZW5zCiAgICAgICAgcmV0dXJuIGxvYywgcmVzdWx0bGlzdAoKICAgIGRlZiBfX2lhZGRfXyhzZWxmLCBvdGhlciApOgogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6CiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBvdGhlciApCiAgICAgICAgcmV0dXJuIHNlbGYuYXBwZW5kKCBvdGhlciApICNBbmQoIFsgc2VsZiwgb3RoZXIgXSApCgogICAgZGVmIGNoZWNrUmVjdXJzaW9uKCBzZWxmLCBwYXJzZUVsZW1lbnRMaXN0ICk6CiAgICAgICAgc3ViUmVjQ2hlY2tMaXN0ID0gcGFyc2VFbGVtZW50TGlzdFs6XSArIFsgc2VsZiBdCiAgICAgICAgZm9yIGUgaW4gc2VsZi5leHByczoKICAgICAgICAgICAgZS5jaGVja1JlY3Vyc2lvbiggc3ViUmVjQ2hlY2tMaXN0ICkKICAgICAgICAgICAgaWYgbm90IGUubWF5UmV0dXJuRW1wdHk6CiAgICAgICAgICAgICAgICBicmVhawoKICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6CiAgICAgICAgaWYgaGFzYXR0cihzZWxmLCJuYW1lIik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLm5hbWUKCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICJ7IiArICIgIi5qb2luKF91c3RyKGUpIGZvciBlIGluIHNlbGYuZXhwcnMpICsgIn0iCgogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHIKCgpjbGFzcyBPcihQYXJzZUV4cHJlc3Npb24pOgogICAgIiIiCiAgICBSZXF1aXJlcyB0aGF0IGF0IGxlYXN0IG9uZSBDe1BhcnNlRXhwcmVzc2lvbn0gaXMgZm91bmQuCiAgICBJZiB0d28gZXhwcmVzc2lvbnMgbWF0Y2gsIHRoZSBleHByZXNzaW9uIHRoYXQgbWF0Y2hlcyB0aGUgbG9uZ2VzdCBzdHJpbmcgd2lsbCBiZSB1c2VkLgogICAgTWF5IGJlIGNvbnN0cnVjdGVkIHVzaW5nIHRoZSBDeydeJ30gb3BlcmF0b3IuCgogICAgRXhhbXBsZTo6CiAgICAgICAgIyBjb25zdHJ1Y3QgT3IgdXNpbmcgJ14nIG9wZXJhdG9yCiAgICAgICAgCiAgICAgICAgbnVtYmVyID0gV29yZChudW1zKSBeIENvbWJpbmUoV29yZChudW1zKSArICcuJyArIFdvcmQobnVtcykpCiAgICAgICAgcHJpbnQobnVtYmVyLnNlYXJjaFN0cmluZygiMTIzIDMuMTQxNiA3ODkiKSkKICAgIHByaW50czo6CiAgICAgICAgW1snMTIzJ10sIFsnMy4xNDE2J10sIFsnNzg5J11dCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwcnMsIHNhdmVsaXN0ID0gRmFsc2UgKToKICAgICAgICBzdXBlcihPcixzZWxmKS5fX2luaXRfXyhleHBycywgc2F2ZWxpc3QpCiAgICAgICAgaWYgc2VsZi5leHByczoKICAgICAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IGFueShlLm1heVJldHVybkVtcHR5IGZvciBlIGluIHNlbGYuZXhwcnMpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUKCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOgogICAgICAgIG1heEV4Y0xvYyA9IC0xCiAgICAgICAgbWF4RXhjZXB0aW9uID0gTm9uZQogICAgICAgIG1hdGNoZXMgPSBbXQogICAgICAgIGZvciBlIGluIHNlbGYuZXhwcnM6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGxvYzIgPSBlLnRyeVBhcnNlKCBpbnN0cmluZywgbG9jICkKICAgICAgICAgICAgZXhjZXB0IFBhcnNlRXhjZXB0aW9uIGFzIGVycjoKICAgICAgICAgICAgICAgIGVyci5fX3RyYWNlYmFja19fID0gTm9uZQogICAgICAgICAgICAgICAgaWYgZXJyLmxvYyA+IG1heEV4Y0xvYzoKICAgICAgICAgICAgICAgICAgICBtYXhFeGNlcHRpb24gPSBlcnIKICAgICAgICAgICAgICAgICAgICBtYXhFeGNMb2MgPSBlcnIubG9jCiAgICAgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgogICAgICAgICAgICAgICAgaWYgbGVuKGluc3RyaW5nKSA+IG1heEV4Y0xvYzoKICAgICAgICAgICAgICAgICAgICBtYXhFeGNlcHRpb24gPSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZyxsZW4oaW5zdHJpbmcpLGUuZXJybXNnLHNlbGYpCiAgICAgICAgICAgICAgICAgICAgbWF4RXhjTG9jID0gbGVuKGluc3RyaW5nKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBzYXZlIG1hdGNoIGFtb25nIGFsbCBtYXRjaGVzLCB0byByZXRyeSBsb25nZXN0IHRvIHNob3J0ZXN0CiAgICAgICAgICAgICAgICBtYXRjaGVzLmFwcGVuZCgobG9jMiwgZSkpCgogICAgICAgIGlmIG1hdGNoZXM6CiAgICAgICAgICAgIG1hdGNoZXMuc29ydChrZXk9bGFtYmRhIHg6IC14WzBdKQogICAgICAgICAgICBmb3IgXyxlIGluIG1hdGNoZXM6CiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuX3BhcnNlKCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnMgKQogICAgICAgICAgICAgICAgZXhjZXB0IFBhcnNlRXhjZXB0aW9uIGFzIGVycjoKICAgICAgICAgICAgICAgICAgICBlcnIuX190cmFjZWJhY2tfXyA9IE5vbmUKICAgICAgICAgICAgICAgICAgICBpZiBlcnIubG9jID4gbWF4RXhjTG9jOgogICAgICAgICAgICAgICAgICAgICAgICBtYXhFeGNlcHRpb24gPSBlcnIKICAgICAgICAgICAgICAgICAgICAgICAgbWF4RXhjTG9jID0gZXJyLmxvYwoKICAgICAgICBpZiBtYXhFeGNlcHRpb24gaXMgbm90IE5vbmU6CiAgICAgICAgICAgIG1heEV4Y2VwdGlvbi5tc2cgPSBzZWxmLmVycm1zZwogICAgICAgICAgICByYWlzZSBtYXhFeGNlcHRpb24KICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCAibm8gZGVmaW5lZCBhbHRlcm5hdGl2ZXMgdG8gbWF0Y2giLCBzZWxmKQoKCiAgICBkZWYgX19peG9yX18oc2VsZiwgb3RoZXIgKToKICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOgogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQogICAgICAgIHJldHVybiBzZWxmLmFwcGVuZCggb3RoZXIgKSAjT3IoIFsgc2VsZiwgb3RoZXIgXSApCgogICAgZGVmIF9fc3RyX18oIHNlbGYgKToKICAgICAgICBpZiBoYXNhdHRyKHNlbGYsIm5hbWUiKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYubmFtZQoKICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZToKICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gInsiICsgIiBeICIuam9pbihfdXN0cihlKSBmb3IgZSBpbiBzZWxmLmV4cHJzKSArICJ9IgoKICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByCgogICAgZGVmIGNoZWNrUmVjdXJzaW9uKCBzZWxmLCBwYXJzZUVsZW1lbnRMaXN0ICk6CiAgICAgICAgc3ViUmVjQ2hlY2tMaXN0ID0gcGFyc2VFbGVtZW50TGlzdFs6XSArIFsgc2VsZiBdCiAgICAgICAgZm9yIGUgaW4gc2VsZi5leHByczoKICAgICAgICAgICAgZS5jaGVja1JlY3Vyc2lvbiggc3ViUmVjQ2hlY2tMaXN0ICkKCgpjbGFzcyBNYXRjaEZpcnN0KFBhcnNlRXhwcmVzc2lvbik6CiAgICAiIiIKICAgIFJlcXVpcmVzIHRoYXQgYXQgbGVhc3Qgb25lIEN7UGFyc2VFeHByZXNzaW9ufSBpcyBmb3VuZC4KICAgIElmIHR3byBleHByZXNzaW9ucyBtYXRjaCwgdGhlIGZpcnN0IG9uZSBsaXN0ZWQgaXMgdGhlIG9uZSB0aGF0IHdpbGwgbWF0Y2guCiAgICBNYXkgYmUgY29uc3RydWN0ZWQgdXNpbmcgdGhlIEN7J3wnfSBvcGVyYXRvci4KCiAgICBFeGFtcGxlOjoKICAgICAgICAjIGNvbnN0cnVjdCBNYXRjaEZpcnN0IHVzaW5nICd8JyBvcGVyYXRvcgogICAgICAgIAogICAgICAgICMgd2F0Y2ggdGhlIG9yZGVyIG9mIGV4cHJlc3Npb25zIHRvIG1hdGNoCiAgICAgICAgbnVtYmVyID0gV29yZChudW1zKSB8IENvbWJpbmUoV29yZChudW1zKSArICcuJyArIFdvcmQobnVtcykpCiAgICAgICAgcHJpbnQobnVtYmVyLnNlYXJjaFN0cmluZygiMTIzIDMuMTQxNiA3ODkiKSkgIyAgRmFpbCEgLT4gW1snMTIzJ10sIFsnMyddLCBbJzE0MTYnXSwgWyc3ODknXV0KCiAgICAgICAgIyBwdXQgbW9yZSBzZWxlY3RpdmUgZXhwcmVzc2lvbiBmaXJzdAogICAgICAgIG51bWJlciA9IENvbWJpbmUoV29yZChudW1zKSArICcuJyArIFdvcmQobnVtcykpIHwgV29yZChudW1zKQogICAgICAgIHByaW50KG51bWJlci5zZWFyY2hTdHJpbmcoIjEyMyAzLjE0MTYgNzg5IikpICMgIEJldHRlciAtPiBbWycxMjMnXSwgWyczLjE0MTYnXSwgWyc3ODknXV0KICAgICIiIgogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHBycywgc2F2ZWxpc3QgPSBGYWxzZSApOgogICAgICAgIHN1cGVyKE1hdGNoRmlyc3Qsc2VsZikuX19pbml0X18oZXhwcnMsIHNhdmVsaXN0KQogICAgICAgIGlmIHNlbGYuZXhwcnM6CiAgICAgICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBhbnkoZS5tYXlSZXR1cm5FbXB0eSBmb3IgZSBpbiBzZWxmLmV4cHJzKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBUcnVlCgogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToKICAgICAgICBtYXhFeGNMb2MgPSAtMQogICAgICAgIG1heEV4Y2VwdGlvbiA9IE5vbmUKICAgICAgICBmb3IgZSBpbiBzZWxmLmV4cHJzOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICByZXQgPSBlLl9wYXJzZSggaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zICkKICAgICAgICAgICAgICAgIHJldHVybiByZXQKICAgICAgICAgICAgZXhjZXB0IFBhcnNlRXhjZXB0aW9uIGFzIGVycjoKICAgICAgICAgICAgICAgIGlmIGVyci5sb2MgPiBtYXhFeGNMb2M6CiAgICAgICAgICAgICAgICAgICAgbWF4RXhjZXB0aW9uID0gZXJyCiAgICAgICAgICAgICAgICAgICAgbWF4RXhjTG9jID0gZXJyLmxvYwogICAgICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoKICAgICAgICAgICAgICAgIGlmIGxlbihpbnN0cmluZykgPiBtYXhFeGNMb2M6CiAgICAgICAgICAgICAgICAgICAgbWF4RXhjZXB0aW9uID0gUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsbGVuKGluc3RyaW5nKSxlLmVycm1zZyxzZWxmKQogICAgICAgICAgICAgICAgICAgIG1heEV4Y0xvYyA9IGxlbihpbnN0cmluZykKCiAgICAgICAgIyBvbmx5IGdvdCBoZXJlIGlmIG5vIGV4cHJlc3Npb24gbWF0Y2hlZCwgcmFpc2UgZXhjZXB0aW9uIGZvciBtYXRjaCB0aGF0IG1hZGUgaXQgdGhlIGZ1cnRoZXN0CiAgICAgICAgZWxzZToKICAgICAgICAgICAgaWYgbWF4RXhjZXB0aW9uIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgbWF4RXhjZXB0aW9uLm1zZyA9IHNlbGYuZXJybXNnCiAgICAgICAgICAgICAgICByYWlzZSBtYXhFeGNlcHRpb24KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsICJubyBkZWZpbmVkIGFsdGVybmF0aXZlcyB0byBtYXRjaCIsIHNlbGYpCgogICAgZGVmIF9faW9yX18oc2VsZiwgb3RoZXIgKToKICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOgogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQogICAgICAgIHJldHVybiBzZWxmLmFwcGVuZCggb3RoZXIgKSAjTWF0Y2hGaXJzdCggWyBzZWxmLCBvdGhlciBdICkKCiAgICBkZWYgX19zdHJfXyggc2VsZiApOgogICAgICAgIGlmIGhhc2F0dHIoc2VsZiwibmFtZSIpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5uYW1lCgogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lOgogICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAieyIgKyAiIHwgIi5qb2luKF91c3RyKGUpIGZvciBlIGluIHNlbGYuZXhwcnMpICsgIn0iCgogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHIKCiAgICBkZWYgY2hlY2tSZWN1cnNpb24oIHNlbGYsIHBhcnNlRWxlbWVudExpc3QgKToKICAgICAgICBzdWJSZWNDaGVja0xpc3QgPSBwYXJzZUVsZW1lbnRMaXN0WzpdICsgWyBzZWxmIF0KICAgICAgICBmb3IgZSBpbiBzZWxmLmV4cHJzOgogICAgICAgICAgICBlLmNoZWNrUmVjdXJzaW9uKCBzdWJSZWNDaGVja0xpc3QgKQoKCmNsYXNzIEVhY2goUGFyc2VFeHByZXNzaW9uKToKICAgICIiIgogICAgUmVxdWlyZXMgYWxsIGdpdmVuIEN7UGFyc2VFeHByZXNzaW9ufXMgdG8gYmUgZm91bmQsIGJ1dCBpbiBhbnkgb3JkZXIuCiAgICBFeHByZXNzaW9ucyBtYXkgYmUgc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2UuCiAgICBNYXkgYmUgY29uc3RydWN0ZWQgdXNpbmcgdGhlIEN7JyYnfSBvcGVyYXRvci4KCiAgICBFeGFtcGxlOjoKICAgICAgICBjb2xvciA9IG9uZU9mKCJSRUQgT1JBTkdFIFlFTExPVyBHUkVFTiBCTFVFIFBVUlBMRSBCTEFDSyBXSElURSBCUk9XTiIpCiAgICAgICAgc2hhcGVfdHlwZSA9IG9uZU9mKCJTUVVBUkUgQ0lSQ0xFIFRSSUFOR0xFIFNUQVIgSEVYQUdPTiBPQ1RBR09OIikKICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKQogICAgICAgIHNoYXBlX2F0dHIgPSAic2hhcGU6IiArIHNoYXBlX3R5cGUoInNoYXBlIikKICAgICAgICBwb3NuX2F0dHIgPSAicG9zbjoiICsgR3JvdXAoaW50ZWdlcigieCIpICsgJywnICsgaW50ZWdlcigieSIpKSgicG9zbiIpCiAgICAgICAgY29sb3JfYXR0ciA9ICJjb2xvcjoiICsgY29sb3IoImNvbG9yIikKICAgICAgICBzaXplX2F0dHIgPSAic2l6ZToiICsgaW50ZWdlcigic2l6ZSIpCgogICAgICAgICMgdXNlIEVhY2ggKHVzaW5nIG9wZXJhdG9yICcmJykgdG8gYWNjZXB0IGF0dHJpYnV0ZXMgaW4gYW55IG9yZGVyIAogICAgICAgICMgKHNoYXBlIGFuZCBwb3NuIGFyZSByZXF1aXJlZCwgY29sb3IgYW5kIHNpemUgYXJlIG9wdGlvbmFsKQogICAgICAgIHNoYXBlX3NwZWMgPSBzaGFwZV9hdHRyICYgcG9zbl9hdHRyICYgT3B0aW9uYWwoY29sb3JfYXR0cikgJiBPcHRpb25hbChzaXplX2F0dHIpCgogICAgICAgIHNoYXBlX3NwZWMucnVuVGVzdHMoJycnCiAgICAgICAgICAgIHNoYXBlOiBTUVVBUkUgY29sb3I6IEJMQUNLIHBvc246IDEwMCwgMTIwCiAgICAgICAgICAgIHNoYXBlOiBDSVJDTEUgc2l6ZTogNTAgY29sb3I6IEJMVUUgcG9zbjogNTAsODAKICAgICAgICAgICAgY29sb3I6R1JFRU4gc2l6ZToyMCBzaGFwZTpUUklBTkdMRSBwb3NuOjIwLDQwCiAgICAgICAgICAgICcnJwogICAgICAgICAgICApCiAgICBwcmludHM6OgogICAgICAgIHNoYXBlOiBTUVVBUkUgY29sb3I6IEJMQUNLIHBvc246IDEwMCwgMTIwCiAgICAgICAgWydzaGFwZTonLCAnU1FVQVJFJywgJ2NvbG9yOicsICdCTEFDSycsICdwb3NuOicsIFsnMTAwJywgJywnLCAnMTIwJ11dCiAgICAgICAgLSBjb2xvcjogQkxBQ0sKICAgICAgICAtIHBvc246IFsnMTAwJywgJywnLCAnMTIwJ10KICAgICAgICAgIC0geDogMTAwCiAgICAgICAgICAtIHk6IDEyMAogICAgICAgIC0gc2hhcGU6IFNRVUFSRQoKCiAgICAgICAgc2hhcGU6IENJUkNMRSBzaXplOiA1MCBjb2xvcjogQkxVRSBwb3NuOiA1MCw4MAogICAgICAgIFsnc2hhcGU6JywgJ0NJUkNMRScsICdzaXplOicsICc1MCcsICdjb2xvcjonLCAnQkxVRScsICdwb3NuOicsIFsnNTAnLCAnLCcsICc4MCddXQogICAgICAgIC0gY29sb3I6IEJMVUUKICAgICAgICAtIHBvc246IFsnNTAnLCAnLCcsICc4MCddCiAgICAgICAgICAtIHg6IDUwCiAgICAgICAgICAtIHk6IDgwCiAgICAgICAgLSBzaGFwZTogQ0lSQ0xFCiAgICAgICAgLSBzaXplOiA1MAoKCiAgICAgICAgY29sb3I6IEdSRUVOIHNpemU6IDIwIHNoYXBlOiBUUklBTkdMRSBwb3NuOiAyMCw0MAogICAgICAgIFsnY29sb3I6JywgJ0dSRUVOJywgJ3NpemU6JywgJzIwJywgJ3NoYXBlOicsICdUUklBTkdMRScsICdwb3NuOicsIFsnMjAnLCAnLCcsICc0MCddXQogICAgICAgIC0gY29sb3I6IEdSRUVOCiAgICAgICAgLSBwb3NuOiBbJzIwJywgJywnLCAnNDAnXQogICAgICAgICAgLSB4OiAyMAogICAgICAgICAgLSB5OiA0MAogICAgICAgIC0gc2hhcGU6IFRSSUFOR0xFCiAgICAgICAgLSBzaXplOiAyMAogICAgIiIiCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHJzLCBzYXZlbGlzdCA9IFRydWUgKToKICAgICAgICBzdXBlcihFYWNoLHNlbGYpLl9faW5pdF9fKGV4cHJzLCBzYXZlbGlzdCkKICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gYWxsKGUubWF5UmV0dXJuRW1wdHkgZm9yIGUgaW4gc2VsZi5leHBycykKICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gVHJ1ZQogICAgICAgIHNlbGYuaW5pdEV4cHJHcm91cHMgPSBUcnVlCgogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToKICAgICAgICBpZiBzZWxmLmluaXRFeHByR3JvdXBzOgogICAgICAgICAgICBzZWxmLm9wdDFtYXAgPSBkaWN0KChpZChlLmV4cHIpLGUpIGZvciBlIGluIHNlbGYuZXhwcnMgaWYgaXNpbnN0YW5jZShlLE9wdGlvbmFsKSkKICAgICAgICAgICAgb3B0MSA9IFsgZS5leHByIGZvciBlIGluIHNlbGYuZXhwcnMgaWYgaXNpbnN0YW5jZShlLE9wdGlvbmFsKSBdCiAgICAgICAgICAgIG9wdDIgPSBbIGUgZm9yIGUgaW4gc2VsZi5leHBycyBpZiBlLm1heVJldHVybkVtcHR5IGFuZCBub3QgaXNpbnN0YW5jZShlLE9wdGlvbmFsKV0KICAgICAgICAgICAgc2VsZi5vcHRpb25hbHMgPSBvcHQxICsgb3B0MgogICAgICAgICAgICBzZWxmLm11bHRpb3B0aW9uYWxzID0gWyBlLmV4cHIgZm9yIGUgaW4gc2VsZi5leHBycyBpZiBpc2luc3RhbmNlKGUsWmVyb09yTW9yZSkgXQogICAgICAgICAgICBzZWxmLm11bHRpcmVxdWlyZWQgPSBbIGUuZXhwciBmb3IgZSBpbiBzZWxmLmV4cHJzIGlmIGlzaW5zdGFuY2UoZSxPbmVPck1vcmUpIF0KICAgICAgICAgICAgc2VsZi5yZXF1aXJlZCA9IFsgZSBmb3IgZSBpbiBzZWxmLmV4cHJzIGlmIG5vdCBpc2luc3RhbmNlKGUsKE9wdGlvbmFsLFplcm9Pck1vcmUsT25lT3JNb3JlKSkgXQogICAgICAgICAgICBzZWxmLnJlcXVpcmVkICs9IHNlbGYubXVsdGlyZXF1aXJlZAogICAgICAgICAgICBzZWxmLmluaXRFeHByR3JvdXBzID0gRmFsc2UKICAgICAgICB0bXBMb2MgPSBsb2MKICAgICAgICB0bXBSZXFkID0gc2VsZi5yZXF1aXJlZFs6XQogICAgICAgIHRtcE9wdCAgPSBzZWxmLm9wdGlvbmFsc1s6XQogICAgICAgIG1hdGNoT3JkZXIgPSBbXQoKICAgICAgICBrZWVwTWF0Y2hpbmcgPSBUcnVlCiAgICAgICAgd2hpbGUga2VlcE1hdGNoaW5nOgogICAgICAgICAgICB0bXBFeHBycyA9IHRtcFJlcWQgKyB0bXBPcHQgKyBzZWxmLm11bHRpb3B0aW9uYWxzICsgc2VsZi5tdWx0aXJlcXVpcmVkCiAgICAgICAgICAgIGZhaWxlZCA9IFtdCiAgICAgICAgICAgIGZvciBlIGluIHRtcEV4cHJzOgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIHRtcExvYyA9IGUudHJ5UGFyc2UoIGluc3RyaW5nLCB0bXBMb2MgKQogICAgICAgICAgICAgICAgZXhjZXB0IFBhcnNlRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgICAgIGZhaWxlZC5hcHBlbmQoZSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgbWF0Y2hPcmRlci5hcHBlbmQoc2VsZi5vcHQxbWFwLmdldChpZChlKSxlKSkKICAgICAgICAgICAgICAgICAgICBpZiBlIGluIHRtcFJlcWQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHRtcFJlcWQucmVtb3ZlKGUpCiAgICAgICAgICAgICAgICAgICAgZWxpZiBlIGluIHRtcE9wdDoKICAgICAgICAgICAgICAgICAgICAgICAgdG1wT3B0LnJlbW92ZShlKQogICAgICAgICAgICBpZiBsZW4oZmFpbGVkKSA9PSBsZW4odG1wRXhwcnMpOgogICAgICAgICAgICAgICAga2VlcE1hdGNoaW5nID0gRmFsc2UKCiAgICAgICAgaWYgdG1wUmVxZDoKICAgICAgICAgICAgbWlzc2luZyA9ICIsICIuam9pbihfdXN0cihlKSBmb3IgZSBpbiB0bXBSZXFkKQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZyxsb2MsIk1pc3Npbmcgb25lIG9yIG1vcmUgcmVxdWlyZWQgZWxlbWVudHMgKCVzKSIgJSBtaXNzaW5nICkKCiAgICAgICAgIyBhZGQgYW55IHVubWF0Y2hlZCBPcHRpb25hbHMsIGluIGNhc2UgdGhleSBoYXZlIGRlZmF1bHQgdmFsdWVzIGRlZmluZWQKICAgICAgICBtYXRjaE9yZGVyICs9IFtlIGZvciBlIGluIHNlbGYuZXhwcnMgaWYgaXNpbnN0YW5jZShlLE9wdGlvbmFsKSBhbmQgZS5leHByIGluIHRtcE9wdF0KCiAgICAgICAgcmVzdWx0bGlzdCA9IFtdCiAgICAgICAgZm9yIGUgaW4gbWF0Y2hPcmRlcjoKICAgICAgICAgICAgbG9jLHJlc3VsdHMgPSBlLl9wYXJzZShpbnN0cmluZyxsb2MsZG9BY3Rpb25zKQogICAgICAgICAgICByZXN1bHRsaXN0LmFwcGVuZChyZXN1bHRzKQoKICAgICAgICBmaW5hbFJlc3VsdHMgPSBzdW0ocmVzdWx0bGlzdCwgUGFyc2VSZXN1bHRzKFtdKSkKICAgICAgICByZXR1cm4gbG9jLCBmaW5hbFJlc3VsdHMKCiAgICBkZWYgX19zdHJfXyggc2VsZiApOgogICAgICAgIGlmIGhhc2F0dHIoc2VsZiwibmFtZSIpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5uYW1lCgogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lOgogICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAieyIgKyAiICYgIi5qb2luKF91c3RyKGUpIGZvciBlIGluIHNlbGYuZXhwcnMpICsgIn0iCgogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHIKCiAgICBkZWYgY2hlY2tSZWN1cnNpb24oIHNlbGYsIHBhcnNlRWxlbWVudExpc3QgKToKICAgICAgICBzdWJSZWNDaGVja0xpc3QgPSBwYXJzZUVsZW1lbnRMaXN0WzpdICsgWyBzZWxmIF0KICAgICAgICBmb3IgZSBpbiBzZWxmLmV4cHJzOgogICAgICAgICAgICBlLmNoZWNrUmVjdXJzaW9uKCBzdWJSZWNDaGVja0xpc3QgKQoKCmNsYXNzIFBhcnNlRWxlbWVudEVuaGFuY2UoUGFyc2VyRWxlbWVudCk6CiAgICAiIiIKICAgIEFic3RyYWN0IHN1YmNsYXNzIG9mIEN7UGFyc2VyRWxlbWVudH0sIGZvciBjb21iaW5pbmcgYW5kIHBvc3QtcHJvY2Vzc2luZyBwYXJzZWQgdG9rZW5zLgogICAgIiIiCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHIsIHNhdmVsaXN0PUZhbHNlICk6CiAgICAgICAgc3VwZXIoUGFyc2VFbGVtZW50RW5oYW5jZSxzZWxmKS5fX2luaXRfXyhzYXZlbGlzdCkKICAgICAgICBpZiBpc2luc3RhbmNlKCBleHByLCBiYXNlc3RyaW5nICk6CiAgICAgICAgICAgIGlmIGlzc3ViY2xhc3MoUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzLCBUb2tlbik6CiAgICAgICAgICAgICAgICBleHByID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKGV4cHIpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBleHByID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKExpdGVyYWwoZXhwcikpCiAgICAgICAgc2VsZi5leHByID0gZXhwcgogICAgICAgIHNlbGYuc3RyUmVwciA9IE5vbmUKICAgICAgICBpZiBleHByIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBleHByLm1heUluZGV4RXJyb3IKICAgICAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IGV4cHIubWF5UmV0dXJuRW1wdHkKICAgICAgICAgICAgc2VsZi5zZXRXaGl0ZXNwYWNlQ2hhcnMoIGV4cHIud2hpdGVDaGFycyApCiAgICAgICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBleHByLnNraXBXaGl0ZXNwYWNlCiAgICAgICAgICAgIHNlbGYuc2F2ZUFzTGlzdCA9IGV4cHIuc2F2ZUFzTGlzdAogICAgICAgICAgICBzZWxmLmNhbGxQcmVwYXJzZSA9IGV4cHIuY2FsbFByZXBhcnNlCiAgICAgICAgICAgIHNlbGYuaWdub3JlRXhwcnMuZXh0ZW5kKGV4cHIuaWdub3JlRXhwcnMpCgogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToKICAgICAgICBpZiBzZWxmLmV4cHIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmV4cHIuX3BhcnNlKCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnMsIGNhbGxQcmVQYXJzZT1GYWxzZSApCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oIiIsbG9jLHNlbGYuZXJybXNnLHNlbGYpCgogICAgZGVmIGxlYXZlV2hpdGVzcGFjZSggc2VsZiApOgogICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBGYWxzZQogICAgICAgIHNlbGYuZXhwciA9IHNlbGYuZXhwci5jb3B5KCkKICAgICAgICBpZiBzZWxmLmV4cHIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGYuZXhwci5sZWF2ZVdoaXRlc3BhY2UoKQogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIGlnbm9yZSggc2VsZiwgb3RoZXIgKToKICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgU3VwcHJlc3MgKToKICAgICAgICAgICAgaWYgb3RoZXIgbm90IGluIHNlbGYuaWdub3JlRXhwcnM6CiAgICAgICAgICAgICAgICBzdXBlciggUGFyc2VFbGVtZW50RW5oYW5jZSwgc2VsZikuaWdub3JlKCBvdGhlciApCiAgICAgICAgICAgICAgICBpZiBzZWxmLmV4cHIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5leHByLmlnbm9yZSggc2VsZi5pZ25vcmVFeHByc1stMV0gKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHN1cGVyKCBQYXJzZUVsZW1lbnRFbmhhbmNlLCBzZWxmKS5pZ25vcmUoIG90aGVyICkKICAgICAgICAgICAgaWYgc2VsZi5leHByIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgc2VsZi5leHByLmlnbm9yZSggc2VsZi5pZ25vcmVFeHByc1stMV0gKQogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIHN0cmVhbWxpbmUoIHNlbGYgKToKICAgICAgICBzdXBlcihQYXJzZUVsZW1lbnRFbmhhbmNlLHNlbGYpLnN0cmVhbWxpbmUoKQogICAgICAgIGlmIHNlbGYuZXhwciBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5leHByLnN0cmVhbWxpbmUoKQogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIGNoZWNrUmVjdXJzaW9uKCBzZWxmLCBwYXJzZUVsZW1lbnRMaXN0ICk6CiAgICAgICAgaWYgc2VsZiBpbiBwYXJzZUVsZW1lbnRMaXN0OgogICAgICAgICAgICByYWlzZSBSZWN1cnNpdmVHcmFtbWFyRXhjZXB0aW9uKCBwYXJzZUVsZW1lbnRMaXN0K1tzZWxmXSApCiAgICAgICAgc3ViUmVjQ2hlY2tMaXN0ID0gcGFyc2VFbGVtZW50TGlzdFs6XSArIFsgc2VsZiBdCiAgICAgICAgaWYgc2VsZi5leHByIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLmV4cHIuY2hlY2tSZWN1cnNpb24oIHN1YlJlY0NoZWNrTGlzdCApCgogICAgZGVmIHZhbGlkYXRlKCBzZWxmLCB2YWxpZGF0ZVRyYWNlPVtdICk6CiAgICAgICAgdG1wID0gdmFsaWRhdGVUcmFjZVs6XStbc2VsZl0KICAgICAgICBpZiBzZWxmLmV4cHIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGYuZXhwci52YWxpZGF0ZSh0bXApCiAgICAgICAgc2VsZi5jaGVja1JlY3Vyc2lvbiggW10gKQoKICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc3VwZXIoUGFyc2VFbGVtZW50RW5oYW5jZSxzZWxmKS5fX3N0cl9fKCkKICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICBwYXNzCgogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lIGFuZCBzZWxmLmV4cHIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICIlczooJXMpIiAlICggc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIF91c3RyKHNlbGYuZXhwcikgKQogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHIKCgpjbGFzcyBGb2xsb3dlZEJ5KFBhcnNlRWxlbWVudEVuaGFuY2UpOgogICAgIiIiCiAgICBMb29rYWhlYWQgbWF0Y2hpbmcgb2YgdGhlIGdpdmVuIHBhcnNlIGV4cHJlc3Npb24uICBDe0ZvbGxvd2VkQnl9CiAgICBkb2VzIEl7bm90fSBhZHZhbmNlIHRoZSBwYXJzaW5nIHBvc2l0aW9uIHdpdGhpbiB0aGUgaW5wdXQgc3RyaW5nLCBpdCBvbmx5CiAgICB2ZXJpZmllcyB0aGF0IHRoZSBzcGVjaWZpZWQgcGFyc2UgZXhwcmVzc2lvbiBtYXRjaGVzIGF0IHRoZSBjdXJyZW50CiAgICBwb3NpdGlvbi4gIEN7Rm9sbG93ZWRCeX0gYWx3YXlzIHJldHVybnMgYSBudWxsIHRva2VuIGxpc3QuCgogICAgRXhhbXBsZTo6CiAgICAgICAgIyB1c2UgRm9sbG93ZWRCeSB0byBtYXRjaCBhIGxhYmVsIG9ubHkgaWYgaXQgaXMgZm9sbG93ZWQgYnkgYSAnOicKICAgICAgICBkYXRhX3dvcmQgPSBXb3JkKGFscGhhcykKICAgICAgICBsYWJlbCA9IGRhdGFfd29yZCArIEZvbGxvd2VkQnkoJzonKQogICAgICAgIGF0dHJfZXhwciA9IEdyb3VwKGxhYmVsICsgU3VwcHJlc3MoJzonKSArIE9uZU9yTW9yZShkYXRhX3dvcmQsIHN0b3BPbj1sYWJlbCkuc2V0UGFyc2VBY3Rpb24oJyAnLmpvaW4pKQogICAgICAgIAogICAgICAgIE9uZU9yTW9yZShhdHRyX2V4cHIpLnBhcnNlU3RyaW5nKCJzaGFwZTogU1FVQVJFIGNvbG9yOiBCTEFDSyBwb3NuOiB1cHBlciBsZWZ0IikucHByaW50KCkKICAgIHByaW50czo6CiAgICAgICAgW1snc2hhcGUnLCAnU1FVQVJFJ10sIFsnY29sb3InLCAnQkxBQ0snXSwgWydwb3NuJywgJ3VwcGVyIGxlZnQnXV0KICAgICIiIgogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHByICk6CiAgICAgICAgc3VwZXIoRm9sbG93ZWRCeSxzZWxmKS5fX2luaXRfXyhleHByKQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBUcnVlCgogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToKICAgICAgICBzZWxmLmV4cHIudHJ5UGFyc2UoIGluc3RyaW5nLCBsb2MgKQogICAgICAgIHJldHVybiBsb2MsIFtdCgoKY2xhc3MgTm90QW55KFBhcnNlRWxlbWVudEVuaGFuY2UpOgogICAgIiIiCiAgICBMb29rYWhlYWQgdG8gZGlzYWxsb3cgbWF0Y2hpbmcgd2l0aCB0aGUgZ2l2ZW4gcGFyc2UgZXhwcmVzc2lvbi4gIEN7Tm90QW55fQogICAgZG9lcyBJe25vdH0gYWR2YW5jZSB0aGUgcGFyc2luZyBwb3NpdGlvbiB3aXRoaW4gdGhlIGlucHV0IHN0cmluZywgaXQgb25seQogICAgdmVyaWZpZXMgdGhhdCB0aGUgc3BlY2lmaWVkIHBhcnNlIGV4cHJlc3Npb24gZG9lcyBJe25vdH0gbWF0Y2ggYXQgdGhlIGN1cnJlbnQKICAgIHBvc2l0aW9uLiAgQWxzbywgQ3tOb3RBbnl9IGRvZXMgSXtub3R9IHNraXAgb3ZlciBsZWFkaW5nIHdoaXRlc3BhY2UuIEN7Tm90QW55fQogICAgYWx3YXlzIHJldHVybnMgYSBudWxsIHRva2VuIGxpc3QuICBNYXkgYmUgY29uc3RydWN0ZWQgdXNpbmcgdGhlICd+JyBvcGVyYXRvci4KCiAgICBFeGFtcGxlOjoKICAgICAgICAKICAgICIiIgogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHByICk6CiAgICAgICAgc3VwZXIoTm90QW55LHNlbGYpLl9faW5pdF9fKGV4cHIpCiAgICAgICAgI34gc2VsZi5sZWF2ZVdoaXRlc3BhY2UoKQogICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBGYWxzZSAgIyBkbyBOT1QgdXNlIHNlbGYubGVhdmVXaGl0ZXNwYWNlKCksIGRvbid0IHdhbnQgdG8gcHJvcGFnYXRlIHRvIGV4cHJzCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUKICAgICAgICBzZWxmLmVycm1zZyA9ICJGb3VuZCB1bndhbnRlZCB0b2tlbiwgIitfdXN0cihzZWxmLmV4cHIpCgogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToKICAgICAgICBpZiBzZWxmLmV4cHIuY2FuUGFyc2VOZXh0KGluc3RyaW5nLCBsb2MpOgogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikKICAgICAgICByZXR1cm4gbG9jLCBbXQoKICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6CiAgICAgICAgaWYgaGFzYXR0cihzZWxmLCJuYW1lIik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLm5hbWUKCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICJ+eyIgKyBfdXN0cihzZWxmLmV4cHIpICsgIn0iCgogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHIKCmNsYXNzIF9NdWx0aXBsZU1hdGNoKFBhcnNlRWxlbWVudEVuaGFuY2UpOgogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHByLCBzdG9wT249Tm9uZSk6CiAgICAgICAgc3VwZXIoX011bHRpcGxlTWF0Y2gsIHNlbGYpLl9faW5pdF9fKGV4cHIpCiAgICAgICAgc2VsZi5zYXZlQXNMaXN0ID0gVHJ1ZQogICAgICAgIGVuZGVyID0gc3RvcE9uCiAgICAgICAgaWYgaXNpbnN0YW5jZShlbmRlciwgYmFzZXN0cmluZyk6CiAgICAgICAgICAgIGVuZGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKGVuZGVyKQogICAgICAgIHNlbGYubm90X2VuZGVyID0gfmVuZGVyIGlmIGVuZGVyIGlzIG5vdCBOb25lIGVsc2UgTm9uZQoKICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6CiAgICAgICAgc2VsZl9leHByX3BhcnNlID0gc2VsZi5leHByLl9wYXJzZQogICAgICAgIHNlbGZfc2tpcF9pZ25vcmFibGVzID0gc2VsZi5fc2tpcElnbm9yYWJsZXMKICAgICAgICBjaGVja19lbmRlciA9IHNlbGYubm90X2VuZGVyIGlzIG5vdCBOb25lCiAgICAgICAgaWYgY2hlY2tfZW5kZXI6CiAgICAgICAgICAgIHRyeV9ub3RfZW5kZXIgPSBzZWxmLm5vdF9lbmRlci50cnlQYXJzZQogICAgICAgIAogICAgICAgICMgbXVzdCBiZSBhdCBsZWFzdCBvbmUgKGJ1dCBmaXJzdCBzZWUgaWYgd2UgYXJlIHRoZSBzdG9wT24gc2VudGluZWw7CiAgICAgICAgIyBpZiBzbywgZmFpbCkKICAgICAgICBpZiBjaGVja19lbmRlcjoKICAgICAgICAgICAgdHJ5X25vdF9lbmRlcihpbnN0cmluZywgbG9jKQogICAgICAgIGxvYywgdG9rZW5zID0gc2VsZl9leHByX3BhcnNlKCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnMsIGNhbGxQcmVQYXJzZT1GYWxzZSApCiAgICAgICAgdHJ5OgogICAgICAgICAgICBoYXNJZ25vcmVFeHBycyA9IChub3Qgbm90IHNlbGYuaWdub3JlRXhwcnMpCiAgICAgICAgICAgIHdoaWxlIDE6CiAgICAgICAgICAgICAgICBpZiBjaGVja19lbmRlcjoKICAgICAgICAgICAgICAgICAgICB0cnlfbm90X2VuZGVyKGluc3RyaW5nLCBsb2MpCiAgICAgICAgICAgICAgICBpZiBoYXNJZ25vcmVFeHByczoKICAgICAgICAgICAgICAgICAgICBwcmVsb2MgPSBzZWxmX3NraXBfaWdub3JhYmxlcyggaW5zdHJpbmcsIGxvYyApCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHByZWxvYyA9IGxvYwogICAgICAgICAgICAgICAgbG9jLCB0bXB0b2tlbnMgPSBzZWxmX2V4cHJfcGFyc2UoIGluc3RyaW5nLCBwcmVsb2MsIGRvQWN0aW9ucyApCiAgICAgICAgICAgICAgICBpZiB0bXB0b2tlbnMgb3IgdG1wdG9rZW5zLmhhc2tleXMoKToKICAgICAgICAgICAgICAgICAgICB0b2tlbnMgKz0gdG1wdG9rZW5zCiAgICAgICAgZXhjZXB0IChQYXJzZUV4Y2VwdGlvbixJbmRleEVycm9yKToKICAgICAgICAgICAgcGFzcwoKICAgICAgICByZXR1cm4gbG9jLCB0b2tlbnMKICAgICAgICAKY2xhc3MgT25lT3JNb3JlKF9NdWx0aXBsZU1hdGNoKToKICAgICIiIgogICAgUmVwZXRpdGlvbiBvZiBvbmUgb3IgbW9yZSBvZiB0aGUgZ2l2ZW4gZXhwcmVzc2lvbi4KICAgIAogICAgUGFyYW1ldGVyczoKICAgICAtIGV4cHIgLSBleHByZXNzaW9uIHRoYXQgbXVzdCBtYXRjaCBvbmUgb3IgbW9yZSB0aW1lcwogICAgIC0gc3RvcE9uIC0gKGRlZmF1bHQ9Q3tOb25lfSkgLSBleHByZXNzaW9uIGZvciBhIHRlcm1pbmF0aW5nIHNlbnRpbmVsCiAgICAgICAgICAob25seSByZXF1aXJlZCBpZiB0aGUgc2VudGluZWwgd291bGQgb3JkaW5hcmlseSBtYXRjaCB0aGUgcmVwZXRpdGlvbiAKICAgICAgICAgIGV4cHJlc3Npb24pICAgICAgICAgIAoKICAgIEV4YW1wbGU6OgogICAgICAgIGRhdGFfd29yZCA9IFdvcmQoYWxwaGFzKQogICAgICAgIGxhYmVsID0gZGF0YV93b3JkICsgRm9sbG93ZWRCeSgnOicpCiAgICAgICAgYXR0cl9leHByID0gR3JvdXAobGFiZWwgKyBTdXBwcmVzcygnOicpICsgT25lT3JNb3JlKGRhdGFfd29yZCkuc2V0UGFyc2VBY3Rpb24oJyAnLmpvaW4pKQoKICAgICAgICB0ZXh0ID0gInNoYXBlOiBTUVVBUkUgcG9zbjogdXBwZXIgbGVmdCBjb2xvcjogQkxBQ0siCiAgICAgICAgT25lT3JNb3JlKGF0dHJfZXhwcikucGFyc2VTdHJpbmcodGV4dCkucHByaW50KCkgICMgRmFpbCEgcmVhZCAnY29sb3InIGFzIGRhdGEgaW5zdGVhZCBvZiBuZXh0IGxhYmVsIC0+IFtbJ3NoYXBlJywgJ1NRVUFSRSBjb2xvciddXQoKICAgICAgICAjIHVzZSBzdG9wT24gYXR0cmlidXRlIGZvciBPbmVPck1vcmUgdG8gYXZvaWQgcmVhZGluZyBsYWJlbCBzdHJpbmcgYXMgcGFydCBvZiB0aGUgZGF0YQogICAgICAgIGF0dHJfZXhwciA9IEdyb3VwKGxhYmVsICsgU3VwcHJlc3MoJzonKSArIE9uZU9yTW9yZShkYXRhX3dvcmQsIHN0b3BPbj1sYWJlbCkuc2V0UGFyc2VBY3Rpb24oJyAnLmpvaW4pKQogICAgICAgIE9uZU9yTW9yZShhdHRyX2V4cHIpLnBhcnNlU3RyaW5nKHRleHQpLnBwcmludCgpICMgQmV0dGVyIC0+IFtbJ3NoYXBlJywgJ1NRVUFSRSddLCBbJ3Bvc24nLCAndXBwZXIgbGVmdCddLCBbJ2NvbG9yJywgJ0JMQUNLJ11dCiAgICAgICAgCiAgICAgICAgIyBjb3VsZCBhbHNvIGJlIHdyaXR0ZW4gYXMKICAgICAgICAoYXR0cl9leHByICogKDEsKSkucGFyc2VTdHJpbmcodGV4dCkucHByaW50KCkKICAgICIiIgoKICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6CiAgICAgICAgaWYgaGFzYXR0cihzZWxmLCJuYW1lIik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLm5hbWUKCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICJ7IiArIF91c3RyKHNlbGYuZXhwcikgKyAifS4uLiIKCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcgoKY2xhc3MgWmVyb09yTW9yZShfTXVsdGlwbGVNYXRjaCk6CiAgICAiIiIKICAgIE9wdGlvbmFsIHJlcGV0aXRpb24gb2YgemVybyBvciBtb3JlIG9mIHRoZSBnaXZlbiBleHByZXNzaW9uLgogICAgCiAgICBQYXJhbWV0ZXJzOgogICAgIC0gZXhwciAtIGV4cHJlc3Npb24gdGhhdCBtdXN0IG1hdGNoIHplcm8gb3IgbW9yZSB0aW1lcwogICAgIC0gc3RvcE9uIC0gKGRlZmF1bHQ9Q3tOb25lfSkgLSBleHByZXNzaW9uIGZvciBhIHRlcm1pbmF0aW5nIHNlbnRpbmVsCiAgICAgICAgICAob25seSByZXF1aXJlZCBpZiB0aGUgc2VudGluZWwgd291bGQgb3JkaW5hcmlseSBtYXRjaCB0aGUgcmVwZXRpdGlvbiAKICAgICAgICAgIGV4cHJlc3Npb24pICAgICAgICAgIAoKICAgIEV4YW1wbGU6IHNpbWlsYXIgdG8gTHtPbmVPck1vcmV9CiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwciwgc3RvcE9uPU5vbmUpOgogICAgICAgIHN1cGVyKFplcm9Pck1vcmUsc2VsZikuX19pbml0X18oZXhwciwgc3RvcE9uPXN0b3BPbikKICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gVHJ1ZQogICAgICAgIAogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzdXBlcihaZXJvT3JNb3JlLCBzZWxmKS5wYXJzZUltcGwoaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zKQogICAgICAgIGV4Y2VwdCAoUGFyc2VFeGNlcHRpb24sSW5kZXhFcnJvcik6CiAgICAgICAgICAgIHJldHVybiBsb2MsIFtdCgogICAgZGVmIF9fc3RyX18oIHNlbGYgKToKICAgICAgICBpZiBoYXNhdHRyKHNlbGYsIm5hbWUiKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYubmFtZQoKICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZToKICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gIlsiICsgX3VzdHIoc2VsZi5leHByKSArICJdLi4uIgoKICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByCgpjbGFzcyBfTnVsbFRva2VuKG9iamVjdCk6CiAgICBkZWYgX19ib29sX18oc2VsZik6CiAgICAgICAgcmV0dXJuIEZhbHNlCiAgICBfX25vbnplcm9fXyA9IF9fYm9vbF9fCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIiIKCl9vcHRpb25hbE5vdE1hdGNoZWQgPSBfTnVsbFRva2VuKCkKY2xhc3MgT3B0aW9uYWwoUGFyc2VFbGVtZW50RW5oYW5jZSk6CiAgICAiIiIKICAgIE9wdGlvbmFsIG1hdGNoaW5nIG9mIHRoZSBnaXZlbiBleHByZXNzaW9uLgoKICAgIFBhcmFtZXRlcnM6CiAgICAgLSBleHByIC0gZXhwcmVzc2lvbiB0aGF0IG11c3QgbWF0Y2ggemVybyBvciBtb3JlIHRpbWVzCiAgICAgLSBkZWZhdWx0IChvcHRpb25hbCkgLSB2YWx1ZSB0byBiZSByZXR1cm5lZCBpZiB0aGUgb3B0aW9uYWwgZXhwcmVzc2lvbiBpcyBub3QgZm91bmQuCgogICAgRXhhbXBsZTo6CiAgICAgICAgIyBVUyBwb3N0YWwgY29kZSBjYW4gYmUgYSA1LWRpZ2l0IHppcCwgcGx1cyBvcHRpb25hbCA0LWRpZ2l0IHF1YWxpZmllcgogICAgICAgIHppcCA9IENvbWJpbmUoV29yZChudW1zLCBleGFjdD01KSArIE9wdGlvbmFsKCctJyArIFdvcmQobnVtcywgZXhhY3Q9NCkpKQogICAgICAgIHppcC5ydW5UZXN0cygnJycKICAgICAgICAgICAgIyB0cmFkaXRpb25hbCBaSVAgY29kZQogICAgICAgICAgICAxMjM0NQogICAgICAgICAgICAKICAgICAgICAgICAgIyBaSVArNCBmb3JtCiAgICAgICAgICAgIDEyMTAxLTAwMDEKICAgICAgICAgICAgCiAgICAgICAgICAgICMgaW52YWxpZCBaSVAKICAgICAgICAgICAgOTg3NjUtCiAgICAgICAgICAgICcnJykKICAgIHByaW50czo6CiAgICAgICAgIyB0cmFkaXRpb25hbCBaSVAgY29kZQogICAgICAgIDEyMzQ1CiAgICAgICAgWycxMjM0NSddCgogICAgICAgICMgWklQKzQgZm9ybQogICAgICAgIDEyMTAxLTAwMDEKICAgICAgICBbJzEyMTAxLTAwMDEnXQoKICAgICAgICAjIGludmFsaWQgWklQCiAgICAgICAgOTg3NjUtCiAgICAgICAgICAgICBeCiAgICAgICAgRkFJTDogRXhwZWN0ZWQgZW5kIG9mIHRleHQgKGF0IGNoYXIgNSksIChsaW5lOjEsIGNvbDo2KQogICAgIiIiCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHIsIGRlZmF1bHQ9X29wdGlvbmFsTm90TWF0Y2hlZCApOgogICAgICAgIHN1cGVyKE9wdGlvbmFsLHNlbGYpLl9faW5pdF9fKCBleHByLCBzYXZlbGlzdD1GYWxzZSApCiAgICAgICAgc2VsZi5zYXZlQXNMaXN0ID0gc2VsZi5leHByLnNhdmVBc0xpc3QKICAgICAgICBzZWxmLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHQKICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gVHJ1ZQoKICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBsb2MsIHRva2VucyA9IHNlbGYuZXhwci5fcGFyc2UoIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucywgY2FsbFByZVBhcnNlPUZhbHNlICkKICAgICAgICBleGNlcHQgKFBhcnNlRXhjZXB0aW9uLEluZGV4RXJyb3IpOgogICAgICAgICAgICBpZiBzZWxmLmRlZmF1bHRWYWx1ZSBpcyBub3QgX29wdGlvbmFsTm90TWF0Y2hlZDoKICAgICAgICAgICAgICAgIGlmIHNlbGYuZXhwci5yZXN1bHRzTmFtZToKICAgICAgICAgICAgICAgICAgICB0b2tlbnMgPSBQYXJzZVJlc3VsdHMoWyBzZWxmLmRlZmF1bHRWYWx1ZSBdKQogICAgICAgICAgICAgICAgICAgIHRva2Vuc1tzZWxmLmV4cHIucmVzdWx0c05hbWVdID0gc2VsZi5kZWZhdWx0VmFsdWUKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgdG9rZW5zID0gWyBzZWxmLmRlZmF1bHRWYWx1ZSBdCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICB0b2tlbnMgPSBbXQogICAgICAgIHJldHVybiBsb2MsIHRva2VucwoKICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6CiAgICAgICAgaWYgaGFzYXR0cihzZWxmLCJuYW1lIik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLm5hbWUKCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICJbIiArIF91c3RyKHNlbGYuZXhwcikgKyAiXSIKCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcgoKY2xhc3MgU2tpcFRvKFBhcnNlRWxlbWVudEVuaGFuY2UpOgogICAgIiIiCiAgICBUb2tlbiBmb3Igc2tpcHBpbmcgb3ZlciBhbGwgdW5kZWZpbmVkIHRleHQgdW50aWwgdGhlIG1hdGNoZWQgZXhwcmVzc2lvbiBpcyBmb3VuZC4KCiAgICBQYXJhbWV0ZXJzOgogICAgIC0gZXhwciAtIHRhcmdldCBleHByZXNzaW9uIG1hcmtpbmcgdGhlIGVuZCBvZiB0aGUgZGF0YSB0byBiZSBza2lwcGVkCiAgICAgLSBpbmNsdWRlIC0gKGRlZmF1bHQ9Q3tGYWxzZX0pIGlmIFRydWUsIHRoZSB0YXJnZXQgZXhwcmVzc2lvbiBpcyBhbHNvIHBhcnNlZCAKICAgICAgICAgICh0aGUgc2tpcHBlZCB0ZXh0IGFuZCB0YXJnZXQgZXhwcmVzc2lvbiBhcmUgcmV0dXJuZWQgYXMgYSAyLWVsZW1lbnQgbGlzdCkuCiAgICAgLSBpZ25vcmUgLSAoZGVmYXVsdD1De05vbmV9KSB1c2VkIHRvIGRlZmluZSBncmFtbWFycyAodHlwaWNhbGx5IHF1b3RlZCBzdHJpbmdzIGFuZCAKICAgICAgICAgIGNvbW1lbnRzKSB0aGF0IG1pZ2h0IGNvbnRhaW4gZmFsc2UgbWF0Y2hlcyB0byB0aGUgdGFyZ2V0IGV4cHJlc3Npb24KICAgICAtIGZhaWxPbiAtIChkZWZhdWx0PUN7Tm9uZX0pIGRlZmluZSBleHByZXNzaW9ucyB0aGF0IGFyZSBub3QgYWxsb3dlZCB0byBiZSAKICAgICAgICAgIGluY2x1ZGVkIGluIHRoZSBza2lwcGVkIHRlc3Q7IGlmIGZvdW5kIGJlZm9yZSB0aGUgdGFyZ2V0IGV4cHJlc3Npb24gaXMgZm91bmQsIAogICAgICAgICAgdGhlIFNraXBUbyBpcyBub3QgYSBtYXRjaAoKICAgIEV4YW1wbGU6OgogICAgICAgIHJlcG9ydCA9ICcnJwogICAgICAgICAgICBPdXRzdGFuZGluZyBJc3N1ZXMgUmVwb3J0IC0gMSBKYW4gMjAwMAoKICAgICAgICAgICAgICAgIyB8IFNldmVyaXR5IHwgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgRGF5cyBPcGVuCiAgICAgICAgICAgIC0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLQogICAgICAgICAgICAgMTAxIHwgQ3JpdGljYWwgfCBJbnRlcm1pdHRlbnQgc3lzdGVtIGNyYXNoICAgICAgICAgICAgICAgICB8ICAgICAgICAgIDYKICAgICAgICAgICAgICA5NCB8IENvc21ldGljIHwgU3BlbGxpbmcgZXJyb3Igb24gTG9naW4gKCdsb2d8bicpICAgICAgICAgfCAgICAgICAgIDE0CiAgICAgICAgICAgICAgNzkgfCBNaW5vciAgICB8IFN5c3RlbSBzbG93IHdoZW4gcnVubmluZyB0b28gbWFueSByZXBvcnRzIHwgICAgICAgICA0NwogICAgICAgICAgICAnJycKICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKQogICAgICAgIFNFUCA9IFN1cHByZXNzKCd8JykKICAgICAgICAjIHVzZSBTa2lwVG8gdG8gc2ltcGx5IG1hdGNoIGV2ZXJ5dGhpbmcgdXAgdW50aWwgdGhlIG5leHQgU0VQCiAgICAgICAgIyAtIGlnbm9yZSBxdW90ZWQgc3RyaW5ncywgc28gdGhhdCBhICd8JyBjaGFyYWN0ZXIgaW5zaWRlIGEgcXVvdGVkIHN0cmluZyBkb2VzIG5vdCBtYXRjaAogICAgICAgICMgLSBwYXJzZSBhY3Rpb24gd2lsbCBjYWxsIHRva2VuLnN0cmlwKCkgZm9yIGVhY2ggbWF0Y2hlZCB0b2tlbiwgaS5lLiwgdGhlIGRlc2NyaXB0aW9uIGJvZHkKICAgICAgICBzdHJpbmdfZGF0YSA9IFNraXBUbyhTRVAsIGlnbm9yZT1xdW90ZWRTdHJpbmcpCiAgICAgICAgc3RyaW5nX2RhdGEuc2V0UGFyc2VBY3Rpb24odG9rZW5NYXAoc3RyLnN0cmlwKSkKICAgICAgICB0aWNrZXRfZXhwciA9IChpbnRlZ2VyKCJpc3N1ZV9udW0iKSArIFNFUCAKICAgICAgICAgICAgICAgICAgICAgICsgc3RyaW5nX2RhdGEoInNldiIpICsgU0VQIAogICAgICAgICAgICAgICAgICAgICAgKyBzdHJpbmdfZGF0YSgiZGVzYyIpICsgU0VQIAogICAgICAgICAgICAgICAgICAgICAgKyBpbnRlZ2VyKCJkYXlzX29wZW4iKSkKICAgICAgICAKICAgICAgICBmb3IgdGt0IGluIHRpY2tldF9leHByLnNlYXJjaFN0cmluZyhyZXBvcnQpOgogICAgICAgICAgICBwcmludCB0a3QuZHVtcCgpCiAgICBwcmludHM6OgogICAgICAgIFsnMTAxJywgJ0NyaXRpY2FsJywgJ0ludGVybWl0dGVudCBzeXN0ZW0gY3Jhc2gnLCAnNiddCiAgICAgICAgLSBkYXlzX29wZW46IDYKICAgICAgICAtIGRlc2M6IEludGVybWl0dGVudCBzeXN0ZW0gY3Jhc2gKICAgICAgICAtIGlzc3VlX251bTogMTAxCiAgICAgICAgLSBzZXY6IENyaXRpY2FsCiAgICAgICAgWyc5NCcsICdDb3NtZXRpYycsICJTcGVsbGluZyBlcnJvciBvbiBMb2dpbiAoJ2xvZ3xuJykiLCAnMTQnXQogICAgICAgIC0gZGF5c19vcGVuOiAxNAogICAgICAgIC0gZGVzYzogU3BlbGxpbmcgZXJyb3Igb24gTG9naW4gKCdsb2d8bicpCiAgICAgICAgLSBpc3N1ZV9udW06IDk0CiAgICAgICAgLSBzZXY6IENvc21ldGljCiAgICAgICAgWyc3OScsICdNaW5vcicsICdTeXN0ZW0gc2xvdyB3aGVuIHJ1bm5pbmcgdG9vIG1hbnkgcmVwb3J0cycsICc0NyddCiAgICAgICAgLSBkYXlzX29wZW46IDQ3CiAgICAgICAgLSBkZXNjOiBTeXN0ZW0gc2xvdyB3aGVuIHJ1bm5pbmcgdG9vIG1hbnkgcmVwb3J0cwogICAgICAgIC0gaXNzdWVfbnVtOiA3OQogICAgICAgIC0gc2V2OiBNaW5vcgogICAgIiIiCiAgICBkZWYgX19pbml0X18oIHNlbGYsIG90aGVyLCBpbmNsdWRlPUZhbHNlLCBpZ25vcmU9Tm9uZSwgZmFpbE9uPU5vbmUgKToKICAgICAgICBzdXBlciggU2tpcFRvLCBzZWxmICkuX19pbml0X18oIG90aGVyICkKICAgICAgICBzZWxmLmlnbm9yZUV4cHIgPSBpZ25vcmUKICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gVHJ1ZQogICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IEZhbHNlCiAgICAgICAgc2VsZi5pbmNsdWRlTWF0Y2ggPSBpbmNsdWRlCiAgICAgICAgc2VsZi5hc0xpc3QgPSBGYWxzZQogICAgICAgIGlmIGlzaW5zdGFuY2UoZmFpbE9uLCBiYXNlc3RyaW5nKToKICAgICAgICAgICAgc2VsZi5mYWlsT24gPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoZmFpbE9uKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuZmFpbE9uID0gZmFpbE9uCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiTm8gbWF0Y2ggZm91bmQgZm9yICIrX3VzdHIoc2VsZi5leHByKQoKICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6CiAgICAgICAgc3RhcnRsb2MgPSBsb2MKICAgICAgICBpbnN0cmxlbiA9IGxlbihpbnN0cmluZykKICAgICAgICBleHByID0gc2VsZi5leHByCiAgICAgICAgZXhwcl9wYXJzZSA9IHNlbGYuZXhwci5fcGFyc2UKICAgICAgICBzZWxmX2ZhaWxPbl9jYW5QYXJzZU5leHQgPSBzZWxmLmZhaWxPbi5jYW5QYXJzZU5leHQgaWYgc2VsZi5mYWlsT24gaXMgbm90IE5vbmUgZWxzZSBOb25lCiAgICAgICAgc2VsZl9pZ25vcmVFeHByX3RyeVBhcnNlID0gc2VsZi5pZ25vcmVFeHByLnRyeVBhcnNlIGlmIHNlbGYuaWdub3JlRXhwciBpcyBub3QgTm9uZSBlbHNlIE5vbmUKICAgICAgICAKICAgICAgICB0bXBsb2MgPSBsb2MKICAgICAgICB3aGlsZSB0bXBsb2MgPD0gaW5zdHJsZW46CiAgICAgICAgICAgIGlmIHNlbGZfZmFpbE9uX2NhblBhcnNlTmV4dCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICMgYnJlYWsgaWYgZmFpbE9uIGV4cHJlc3Npb24gbWF0Y2hlcwogICAgICAgICAgICAgICAgaWYgc2VsZl9mYWlsT25fY2FuUGFyc2VOZXh0KGluc3RyaW5nLCB0bXBsb2MpOgogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIGlmIHNlbGZfaWdub3JlRXhwcl90cnlQYXJzZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICMgYWR2YW5jZSBwYXN0IGlnbm9yZSBleHByZXNzaW9ucwogICAgICAgICAgICAgICAgd2hpbGUgMToKICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgIHRtcGxvYyA9IHNlbGZfaWdub3JlRXhwcl90cnlQYXJzZShpbnN0cmluZywgdG1wbG9jKQogICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBQYXJzZUJhc2VFeGNlcHRpb246CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIAogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBleHByX3BhcnNlKGluc3RyaW5nLCB0bXBsb2MsIGRvQWN0aW9ucz1GYWxzZSwgY2FsbFByZVBhcnNlPUZhbHNlKQogICAgICAgICAgICBleGNlcHQgKFBhcnNlRXhjZXB0aW9uLCBJbmRleEVycm9yKToKICAgICAgICAgICAgICAgICMgbm8gbWF0Y2gsIGFkdmFuY2UgbG9jIGluIHN0cmluZwogICAgICAgICAgICAgICAgdG1wbG9jICs9IDEKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgbWF0Y2hlZCBza2lwdG8gZXhwciwgZG9uZQogICAgICAgICAgICAgICAgYnJlYWsKCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyByYW4gb2ZmIHRoZSBlbmQgb2YgdGhlIGlucHV0IHN0cmluZyB3aXRob3V0IG1hdGNoaW5nIHNraXB0byBleHByLCBmYWlsCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQoKICAgICAgICAjIGJ1aWxkIHVwIHJldHVybiB2YWx1ZXMKICAgICAgICBsb2MgPSB0bXBsb2MKICAgICAgICBza2lwdGV4dCA9IGluc3RyaW5nW3N0YXJ0bG9jOmxvY10KICAgICAgICBza2lwcmVzdWx0ID0gUGFyc2VSZXN1bHRzKHNraXB0ZXh0KQogICAgICAgIAogICAgICAgIGlmIHNlbGYuaW5jbHVkZU1hdGNoOgogICAgICAgICAgICBsb2MsIG1hdCA9IGV4cHJfcGFyc2UoaW5zdHJpbmcsbG9jLGRvQWN0aW9ucyxjYWxsUHJlUGFyc2U9RmFsc2UpCiAgICAgICAgICAgIHNraXByZXN1bHQgKz0gbWF0CgogICAgICAgIHJldHVybiBsb2MsIHNraXByZXN1bHQKCmNsYXNzIEZvcndhcmQoUGFyc2VFbGVtZW50RW5oYW5jZSk6CiAgICAiIiIKICAgIEZvcndhcmQgZGVjbGFyYXRpb24gb2YgYW4gZXhwcmVzc2lvbiB0byBiZSBkZWZpbmVkIGxhdGVyIC0KICAgIHVzZWQgZm9yIHJlY3Vyc2l2ZSBncmFtbWFycywgc3VjaCBhcyBhbGdlYnJhaWMgaW5maXggbm90YXRpb24uCiAgICBXaGVuIHRoZSBleHByZXNzaW9uIGlzIGtub3duLCBpdCBpcyBhc3NpZ25lZCB0byB0aGUgQ3tGb3J3YXJkfSB2YXJpYWJsZSB1c2luZyB0aGUgJzw8JyBvcGVyYXRvci4KCiAgICBOb3RlOiB0YWtlIGNhcmUgd2hlbiBhc3NpZ25pbmcgdG8gQ3tGb3J3YXJkfSBub3QgdG8gb3Zlcmxvb2sgcHJlY2VkZW5jZSBvZiBvcGVyYXRvcnMuCiAgICBTcGVjaWZpY2FsbHksICd8JyBoYXMgYSBsb3dlciBwcmVjZWRlbmNlIHRoYW4gJzw8Jywgc28gdGhhdDo6CiAgICAgICAgZndkRXhwciA8PCBhIHwgYiB8IGMKICAgIHdpbGwgYWN0dWFsbHkgYmUgZXZhbHVhdGVkIGFzOjoKICAgICAgICAoZndkRXhwciA8PCBhKSB8IGIgfCBjCiAgICB0aGVyZWJ5IGxlYXZpbmcgYiBhbmQgYyBvdXQgYXMgcGFyc2VhYmxlIGFsdGVybmF0aXZlcy4gIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgeW91CiAgICBleHBsaWNpdGx5IGdyb3VwIHRoZSB2YWx1ZXMgaW5zZXJ0ZWQgaW50byB0aGUgQ3tGb3J3YXJkfTo6CiAgICAgICAgZndkRXhwciA8PCAoYSB8IGIgfCBjKQogICAgQ29udmVydGluZyB0byB1c2UgdGhlICc8PD0nIG9wZXJhdG9yIGluc3RlYWQgd2lsbCBhdm9pZCB0aGlzIHByb2JsZW0uCgogICAgU2VlIEx7UGFyc2VSZXN1bHRzLnBwcmludH0gZm9yIGFuIGV4YW1wbGUgb2YgYSByZWN1cnNpdmUgcGFyc2VyIGNyZWF0ZWQgdXNpbmcKICAgIEN7Rm9yd2FyZH0uCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyggc2VsZiwgb3RoZXI9Tm9uZSApOgogICAgICAgIHN1cGVyKEZvcndhcmQsc2VsZikuX19pbml0X18oIG90aGVyLCBzYXZlbGlzdD1GYWxzZSApCgogICAgZGVmIF9fbHNoaWZ0X18oIHNlbGYsIG90aGVyICk6CiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToKICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3Mob3RoZXIpCiAgICAgICAgc2VsZi5leHByID0gb3RoZXIKICAgICAgICBzZWxmLnN0clJlcHIgPSBOb25lCiAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gc2VsZi5leHByLm1heUluZGV4RXJyb3IKICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gc2VsZi5leHByLm1heVJldHVybkVtcHR5CiAgICAgICAgc2VsZi5zZXRXaGl0ZXNwYWNlQ2hhcnMoIHNlbGYuZXhwci53aGl0ZUNoYXJzICkKICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gc2VsZi5leHByLnNraXBXaGl0ZXNwYWNlCiAgICAgICAgc2VsZi5zYXZlQXNMaXN0ID0gc2VsZi5leHByLnNhdmVBc0xpc3QKICAgICAgICBzZWxmLmlnbm9yZUV4cHJzLmV4dGVuZChzZWxmLmV4cHIuaWdub3JlRXhwcnMpCiAgICAgICAgcmV0dXJuIHNlbGYKICAgICAgICAKICAgIGRlZiBfX2lsc2hpZnRfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYgPDwgb3RoZXIKICAgIAogICAgZGVmIGxlYXZlV2hpdGVzcGFjZSggc2VsZiApOgogICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBGYWxzZQogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIHN0cmVhbWxpbmUoIHNlbGYgKToKICAgICAgICBpZiBub3Qgc2VsZi5zdHJlYW1saW5lZDoKICAgICAgICAgICAgc2VsZi5zdHJlYW1saW5lZCA9IFRydWUKICAgICAgICAgICAgaWYgc2VsZi5leHByIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgc2VsZi5leHByLnN0cmVhbWxpbmUoKQogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIHZhbGlkYXRlKCBzZWxmLCB2YWxpZGF0ZVRyYWNlPVtdICk6CiAgICAgICAgaWYgc2VsZiBub3QgaW4gdmFsaWRhdGVUcmFjZToKICAgICAgICAgICAgdG1wID0gdmFsaWRhdGVUcmFjZVs6XStbc2VsZl0KICAgICAgICAgICAgaWYgc2VsZi5leHByIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgc2VsZi5leHByLnZhbGlkYXRlKHRtcCkKICAgICAgICBzZWxmLmNoZWNrUmVjdXJzaW9uKFtdKQoKICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6CiAgICAgICAgaWYgaGFzYXR0cihzZWxmLCJuYW1lIik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLm5hbWUKICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18uX19uYW1lX18gKyAiOiAuLi4iCgogICAgICAgICMgc3R1YmJlZCBvdXQgZm9yIG5vdyAtIGNyZWF0ZXMgYXdmdWwgbWVtb3J5IGFuZCBwZXJmIGlzc3VlcwogICAgICAgIHNlbGYuX3JldmVydENsYXNzID0gc2VsZi5fX2NsYXNzX18KICAgICAgICBzZWxmLl9fY2xhc3NfXyA9IF9Gb3J3YXJkTm9SZWN1cnNlCiAgICAgICAgdHJ5OgogICAgICAgICAgICBpZiBzZWxmLmV4cHIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICByZXRTdHJpbmcgPSBfdXN0cihzZWxmLmV4cHIpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXRTdHJpbmcgPSAiTm9uZSIKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBzZWxmLl9fY2xhc3NfXyA9IHNlbGYuX3JldmVydENsYXNzCiAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fICsgIjogIiArIHJldFN0cmluZwoKICAgIGRlZiBjb3B5KHNlbGYpOgogICAgICAgIGlmIHNlbGYuZXhwciBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuIHN1cGVyKEZvcndhcmQsc2VsZikuY29weSgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0ID0gRm9yd2FyZCgpCiAgICAgICAgICAgIHJldCA8PD0gc2VsZgogICAgICAgICAgICByZXR1cm4gcmV0CgpjbGFzcyBfRm9yd2FyZE5vUmVjdXJzZShGb3J3YXJkKToKICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6CiAgICAgICAgcmV0dXJuICIuLi4iCgpjbGFzcyBUb2tlbkNvbnZlcnRlcihQYXJzZUVsZW1lbnRFbmhhbmNlKToKICAgICIiIgogICAgQWJzdHJhY3Qgc3ViY2xhc3Mgb2YgQ3tQYXJzZUV4cHJlc3Npb259LCBmb3IgY29udmVydGluZyBwYXJzZWQgcmVzdWx0cy4KICAgICIiIgogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHByLCBzYXZlbGlzdD1GYWxzZSApOgogICAgICAgIHN1cGVyKFRva2VuQ29udmVydGVyLHNlbGYpLl9faW5pdF9fKCBleHByICkjLCBzYXZlbGlzdCApCiAgICAgICAgc2VsZi5zYXZlQXNMaXN0ID0gRmFsc2UKCmNsYXNzIENvbWJpbmUoVG9rZW5Db252ZXJ0ZXIpOgogICAgIiIiCiAgICBDb252ZXJ0ZXIgdG8gY29uY2F0ZW5hdGUgYWxsIG1hdGNoaW5nIHRva2VucyB0byBhIHNpbmdsZSBzdHJpbmcuCiAgICBCeSBkZWZhdWx0LCB0aGUgbWF0Y2hpbmcgcGF0dGVybnMgbXVzdCBhbHNvIGJlIGNvbnRpZ3VvdXMgaW4gdGhlIGlucHV0IHN0cmluZzsKICAgIHRoaXMgY2FuIGJlIGRpc2FibGVkIGJ5IHNwZWNpZnlpbmcgQ3snYWRqYWNlbnQ9RmFsc2UnfSBpbiB0aGUgY29uc3RydWN0b3IuCgogICAgRXhhbXBsZTo6CiAgICAgICAgcmVhbCA9IFdvcmQobnVtcykgKyAnLicgKyBXb3JkKG51bXMpCiAgICAgICAgcHJpbnQocmVhbC5wYXJzZVN0cmluZygnMy4xNDE2JykpICMgLT4gWyczJywgJy4nLCAnMTQxNiddCiAgICAgICAgIyB3aWxsIGFsc28gZXJyb25lb3VzbHkgbWF0Y2ggdGhlIGZvbGxvd2luZwogICAgICAgIHByaW50KHJlYWwucGFyc2VTdHJpbmcoJzMuIDE0MTYnKSkgIyAtPiBbJzMnLCAnLicsICcxNDE2J10KCiAgICAgICAgcmVhbCA9IENvbWJpbmUoV29yZChudW1zKSArICcuJyArIFdvcmQobnVtcykpCiAgICAgICAgcHJpbnQocmVhbC5wYXJzZVN0cmluZygnMy4xNDE2JykpICMgLT4gWyczLjE0MTYnXQogICAgICAgICMgbm8gbWF0Y2ggd2hlbiB0aGVyZSBhcmUgaW50ZXJuYWwgc3BhY2VzCiAgICAgICAgcHJpbnQocmVhbC5wYXJzZVN0cmluZygnMy4gMTQxNicpKSAjIC0+IEV4Y2VwdGlvbjogRXhwZWN0ZWQgVzooMDEyMy4uLikKICAgICIiIgogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHByLCBqb2luU3RyaW5nPSIiLCBhZGphY2VudD1UcnVlICk6CiAgICAgICAgc3VwZXIoQ29tYmluZSxzZWxmKS5fX2luaXRfXyggZXhwciApCiAgICAgICAgIyBzdXBwcmVzcyB3aGl0ZXNwYWNlLXN0cmlwcGluZyBpbiBjb250YWluZWQgcGFyc2UgZXhwcmVzc2lvbnMsIGJ1dCByZS1lbmFibGUgaXQgb24gdGhlIENvbWJpbmUgaXRzZWxmCiAgICAgICAgaWYgYWRqYWNlbnQ6CiAgICAgICAgICAgIHNlbGYubGVhdmVXaGl0ZXNwYWNlKCkKICAgICAgICBzZWxmLmFkamFjZW50ID0gYWRqYWNlbnQKICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gVHJ1ZQogICAgICAgIHNlbGYuam9pblN0cmluZyA9IGpvaW5TdHJpbmcKICAgICAgICBzZWxmLmNhbGxQcmVwYXJzZSA9IFRydWUKCiAgICBkZWYgaWdub3JlKCBzZWxmLCBvdGhlciApOgogICAgICAgIGlmIHNlbGYuYWRqYWNlbnQ6CiAgICAgICAgICAgIFBhcnNlckVsZW1lbnQuaWdub3JlKHNlbGYsIG90aGVyKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHN1cGVyKCBDb21iaW5lLCBzZWxmKS5pZ25vcmUoIG90aGVyICkKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBwb3N0UGFyc2UoIHNlbGYsIGluc3RyaW5nLCBsb2MsIHRva2VubGlzdCApOgogICAgICAgIHJldFRva3MgPSB0b2tlbmxpc3QuY29weSgpCiAgICAgICAgZGVsIHJldFRva3NbOl0KICAgICAgICByZXRUb2tzICs9IFBhcnNlUmVzdWx0cyhbICIiLmpvaW4odG9rZW5saXN0Ll9hc1N0cmluZ0xpc3Qoc2VsZi5qb2luU3RyaW5nKSkgXSwgbW9kYWw9c2VsZi5tb2RhbFJlc3VsdHMpCgogICAgICAgIGlmIHNlbGYucmVzdWx0c05hbWUgYW5kIHJldFRva3MuaGFza2V5cygpOgogICAgICAgICAgICByZXR1cm4gWyByZXRUb2tzIF0KICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gcmV0VG9rcwoKY2xhc3MgR3JvdXAoVG9rZW5Db252ZXJ0ZXIpOgogICAgIiIiCiAgICBDb252ZXJ0ZXIgdG8gcmV0dXJuIHRoZSBtYXRjaGVkIHRva2VucyBhcyBhIGxpc3QgLSB1c2VmdWwgZm9yIHJldHVybmluZyB0b2tlbnMgb2YgQ3tMe1plcm9Pck1vcmV9fSBhbmQgQ3tMe09uZU9yTW9yZX19IGV4cHJlc3Npb25zLgoKICAgIEV4YW1wbGU6OgogICAgICAgIGlkZW50ID0gV29yZChhbHBoYXMpCiAgICAgICAgbnVtID0gV29yZChudW1zKQogICAgICAgIHRlcm0gPSBpZGVudCB8IG51bQogICAgICAgIGZ1bmMgPSBpZGVudCArIE9wdGlvbmFsKGRlbGltaXRlZExpc3QodGVybSkpCiAgICAgICAgcHJpbnQoZnVuYy5wYXJzZVN0cmluZygiZm4gYSxiLDEwMCIpKSAgIyAtPiBbJ2ZuJywgJ2EnLCAnYicsICcxMDAnXQoKICAgICAgICBmdW5jID0gaWRlbnQgKyBHcm91cChPcHRpb25hbChkZWxpbWl0ZWRMaXN0KHRlcm0pKSkKICAgICAgICBwcmludChmdW5jLnBhcnNlU3RyaW5nKCJmbiBhLGIsMTAwIikpICAjIC0+IFsnZm4nLCBbJ2EnLCAnYicsICcxMDAnXV0KICAgICIiIgogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHByICk6CiAgICAgICAgc3VwZXIoR3JvdXAsc2VsZikuX19pbml0X18oIGV4cHIgKQogICAgICAgIHNlbGYuc2F2ZUFzTGlzdCA9IFRydWUKCiAgICBkZWYgcG9zdFBhcnNlKCBzZWxmLCBpbnN0cmluZywgbG9jLCB0b2tlbmxpc3QgKToKICAgICAgICByZXR1cm4gWyB0b2tlbmxpc3QgXQoKY2xhc3MgRGljdChUb2tlbkNvbnZlcnRlcik6CiAgICAiIiIKICAgIENvbnZlcnRlciB0byByZXR1cm4gYSByZXBldGl0aXZlIGV4cHJlc3Npb24gYXMgYSBsaXN0LCBidXQgYWxzbyBhcyBhIGRpY3Rpb25hcnkuCiAgICBFYWNoIGVsZW1lbnQgY2FuIGFsc28gYmUgcmVmZXJlbmNlZCB1c2luZyB0aGUgZmlyc3QgdG9rZW4gaW4gdGhlIGV4cHJlc3Npb24gYXMgaXRzIGtleS4KICAgIFVzZWZ1bCBmb3IgdGFidWxhciByZXBvcnQgc2NyYXBpbmcgd2hlbiB0aGUgZmlyc3QgY29sdW1uIGNhbiBiZSB1c2VkIGFzIGEgaXRlbSBrZXkuCgogICAgRXhhbXBsZTo6CiAgICAgICAgZGF0YV93b3JkID0gV29yZChhbHBoYXMpCiAgICAgICAgbGFiZWwgPSBkYXRhX3dvcmQgKyBGb2xsb3dlZEJ5KCc6JykKICAgICAgICBhdHRyX2V4cHIgPSBHcm91cChsYWJlbCArIFN1cHByZXNzKCc6JykgKyBPbmVPck1vcmUoZGF0YV93b3JkKS5zZXRQYXJzZUFjdGlvbignICcuam9pbikpCgogICAgICAgIHRleHQgPSAic2hhcGU6IFNRVUFSRSBwb3NuOiB1cHBlciBsZWZ0IGNvbG9yOiBsaWdodCBibHVlIHRleHR1cmU6IGJ1cmxhcCIKICAgICAgICBhdHRyX2V4cHIgPSAobGFiZWwgKyBTdXBwcmVzcygnOicpICsgT25lT3JNb3JlKGRhdGFfd29yZCwgc3RvcE9uPWxhYmVsKS5zZXRQYXJzZUFjdGlvbignICcuam9pbikpCiAgICAgICAgCiAgICAgICAgIyBwcmludCBhdHRyaWJ1dGVzIGFzIHBsYWluIGdyb3VwcwogICAgICAgIHByaW50KE9uZU9yTW9yZShhdHRyX2V4cHIpLnBhcnNlU3RyaW5nKHRleHQpLmR1bXAoKSkKICAgICAgICAKICAgICAgICAjIGluc3RlYWQgb2YgT25lT3JNb3JlKGV4cHIpLCBwYXJzZSB1c2luZyBEaWN0KE9uZU9yTW9yZShHcm91cChleHByKSkpIC0gRGljdCB3aWxsIGF1dG8tYXNzaWduIG5hbWVzCiAgICAgICAgcmVzdWx0ID0gRGljdChPbmVPck1vcmUoR3JvdXAoYXR0cl9leHByKSkpLnBhcnNlU3RyaW5nKHRleHQpCiAgICAgICAgcHJpbnQocmVzdWx0LmR1bXAoKSkKICAgICAgICAKICAgICAgICAjIGFjY2VzcyBuYW1lZCBmaWVsZHMgYXMgZGljdCBlbnRyaWVzLCBvciBvdXRwdXQgYXMgZGljdAogICAgICAgIHByaW50KHJlc3VsdFsnc2hhcGUnXSkgICAgICAgIAogICAgICAgIHByaW50KHJlc3VsdC5hc0RpY3QoKSkKICAgIHByaW50czo6CiAgICAgICAgWydzaGFwZScsICdTUVVBUkUnLCAncG9zbicsICd1cHBlciBsZWZ0JywgJ2NvbG9yJywgJ2xpZ2h0IGJsdWUnLCAndGV4dHVyZScsICdidXJsYXAnXQoKICAgICAgICBbWydzaGFwZScsICdTUVVBUkUnXSwgWydwb3NuJywgJ3VwcGVyIGxlZnQnXSwgWydjb2xvcicsICdsaWdodCBibHVlJ10sIFsndGV4dHVyZScsICdidXJsYXAnXV0KICAgICAgICAtIGNvbG9yOiBsaWdodCBibHVlCiAgICAgICAgLSBwb3NuOiB1cHBlciBsZWZ0CiAgICAgICAgLSBzaGFwZTogU1FVQVJFCiAgICAgICAgLSB0ZXh0dXJlOiBidXJsYXAKICAgICAgICBTUVVBUkUKICAgICAgICB7J2NvbG9yJzogJ2xpZ2h0IGJsdWUnLCAncG9zbic6ICd1cHBlciBsZWZ0JywgJ3RleHR1cmUnOiAnYnVybGFwJywgJ3NoYXBlJzogJ1NRVUFSRSd9CiAgICBTZWUgbW9yZSBleGFtcGxlcyBhdCBMe1BhcnNlUmVzdWx0c30gb2YgYWNjZXNzaW5nIGZpZWxkcyBieSByZXN1bHRzIG5hbWUuCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwciApOgogICAgICAgIHN1cGVyKERpY3Qsc2VsZikuX19pbml0X18oIGV4cHIgKQogICAgICAgIHNlbGYuc2F2ZUFzTGlzdCA9IFRydWUKCiAgICBkZWYgcG9zdFBhcnNlKCBzZWxmLCBpbnN0cmluZywgbG9jLCB0b2tlbmxpc3QgKToKICAgICAgICBmb3IgaSx0b2sgaW4gZW51bWVyYXRlKHRva2VubGlzdCk6CiAgICAgICAgICAgIGlmIGxlbih0b2spID09IDA6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBpa2V5ID0gdG9rWzBdCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoaWtleSxpbnQpOgogICAgICAgICAgICAgICAgaWtleSA9IF91c3RyKHRva1swXSkuc3RyaXAoKQogICAgICAgICAgICBpZiBsZW4odG9rKT09MToKICAgICAgICAgICAgICAgIHRva2VubGlzdFtpa2V5XSA9IF9QYXJzZVJlc3VsdHNXaXRoT2Zmc2V0KCIiLGkpCiAgICAgICAgICAgIGVsaWYgbGVuKHRvayk9PTIgYW5kIG5vdCBpc2luc3RhbmNlKHRva1sxXSxQYXJzZVJlc3VsdHMpOgogICAgICAgICAgICAgICAgdG9rZW5saXN0W2lrZXldID0gX1BhcnNlUmVzdWx0c1dpdGhPZmZzZXQodG9rWzFdLGkpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBkaWN0dmFsdWUgPSB0b2suY29weSgpICNQYXJzZVJlc3VsdHMoaSkKICAgICAgICAgICAgICAgIGRlbCBkaWN0dmFsdWVbMF0KICAgICAgICAgICAgICAgIGlmIGxlbihkaWN0dmFsdWUpIT0gMSBvciAoaXNpbnN0YW5jZShkaWN0dmFsdWUsUGFyc2VSZXN1bHRzKSBhbmQgZGljdHZhbHVlLmhhc2tleXMoKSk6CiAgICAgICAgICAgICAgICAgICAgdG9rZW5saXN0W2lrZXldID0gX1BhcnNlUmVzdWx0c1dpdGhPZmZzZXQoZGljdHZhbHVlLGkpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHRva2VubGlzdFtpa2V5XSA9IF9QYXJzZVJlc3VsdHNXaXRoT2Zmc2V0KGRpY3R2YWx1ZVswXSxpKQoKICAgICAgICBpZiBzZWxmLnJlc3VsdHNOYW1lOgogICAgICAgICAgICByZXR1cm4gWyB0b2tlbmxpc3QgXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiB0b2tlbmxpc3QKCgpjbGFzcyBTdXBwcmVzcyhUb2tlbkNvbnZlcnRlcik6CiAgICAiIiIKICAgIENvbnZlcnRlciBmb3IgaWdub3JpbmcgdGhlIHJlc3VsdHMgb2YgYSBwYXJzZWQgZXhwcmVzc2lvbi4KCiAgICBFeGFtcGxlOjoKICAgICAgICBzb3VyY2UgPSAiYSwgYiwgYyxkIgogICAgICAgIHdkID0gV29yZChhbHBoYXMpCiAgICAgICAgd2RfbGlzdDEgPSB3ZCArIFplcm9Pck1vcmUoJywnICsgd2QpCiAgICAgICAgcHJpbnQod2RfbGlzdDEucGFyc2VTdHJpbmcoc291cmNlKSkKCiAgICAgICAgIyBvZnRlbiwgZGVsaW1pdGVycyB0aGF0IGFyZSB1c2VmdWwgZHVyaW5nIHBhcnNpbmcgYXJlIGp1c3QgaW4gdGhlCiAgICAgICAgIyB3YXkgYWZ0ZXJ3YXJkIC0gdXNlIFN1cHByZXNzIHRvIGtlZXAgdGhlbSBvdXQgb2YgdGhlIHBhcnNlZCBvdXRwdXQKICAgICAgICB3ZF9saXN0MiA9IHdkICsgWmVyb09yTW9yZShTdXBwcmVzcygnLCcpICsgd2QpCiAgICAgICAgcHJpbnQod2RfbGlzdDIucGFyc2VTdHJpbmcoc291cmNlKSkKICAgIHByaW50czo6CiAgICAgICAgWydhJywgJywnLCAnYicsICcsJywgJ2MnLCAnLCcsICdkJ10KICAgICAgICBbJ2EnLCAnYicsICdjJywgJ2QnXQogICAgKFNlZSBhbHNvIEx7ZGVsaW1pdGVkTGlzdH0uKQogICAgIiIiCiAgICBkZWYgcG9zdFBhcnNlKCBzZWxmLCBpbnN0cmluZywgbG9jLCB0b2tlbmxpc3QgKToKICAgICAgICByZXR1cm4gW10KCiAgICBkZWYgc3VwcHJlc3MoIHNlbGYgKToKICAgICAgICByZXR1cm4gc2VsZgoKCmNsYXNzIE9ubHlPbmNlKG9iamVjdCk6CiAgICAiIiIKICAgIFdyYXBwZXIgZm9yIHBhcnNlIGFjdGlvbnMsIHRvIGVuc3VyZSB0aGV5IGFyZSBvbmx5IGNhbGxlZCBvbmNlLgogICAgIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgbWV0aG9kQ2FsbCk6CiAgICAgICAgc2VsZi5jYWxsYWJsZSA9IF90cmltX2FyaXR5KG1ldGhvZENhbGwpCiAgICAgICAgc2VsZi5jYWxsZWQgPSBGYWxzZQogICAgZGVmIF9fY2FsbF9fKHNlbGYscyxsLHQpOgogICAgICAgIGlmIG5vdCBzZWxmLmNhbGxlZDoKICAgICAgICAgICAgcmVzdWx0cyA9IHNlbGYuY2FsbGFibGUocyxsLHQpCiAgICAgICAgICAgIHNlbGYuY2FsbGVkID0gVHJ1ZQogICAgICAgICAgICByZXR1cm4gcmVzdWx0cwogICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKHMsbCwiIikKICAgIGRlZiByZXNldChzZWxmKToKICAgICAgICBzZWxmLmNhbGxlZCA9IEZhbHNlCgpkZWYgdHJhY2VQYXJzZUFjdGlvbihmKToKICAgICIiIgogICAgRGVjb3JhdG9yIGZvciBkZWJ1Z2dpbmcgcGFyc2UgYWN0aW9ucy4gCiAgICAKICAgIFdoZW4gdGhlIHBhcnNlIGFjdGlvbiBpcyBjYWxsZWQsIHRoaXMgZGVjb3JhdG9yIHdpbGwgcHJpbnQgQ3siPj4gZW50ZXJpbmcgSXttZXRob2QtbmFtZX0obGluZTpJe2N1cnJlbnRfc291cmNlX2xpbmV9LCBJe3BhcnNlX2xvY2F0aW9ufSwgSXttYXRjaGVkX3Rva2Vuc30pIi59CiAgICBXaGVuIHRoZSBwYXJzZSBhY3Rpb24gY29tcGxldGVzLCB0aGUgZGVjb3JhdG9yIHdpbGwgcHJpbnQgQ3siPDwifSBmb2xsb3dlZCBieSB0aGUgcmV0dXJuZWQgdmFsdWUsIG9yIGFueSBleGNlcHRpb24gdGhhdCB0aGUgcGFyc2UgYWN0aW9uIHJhaXNlZC4KCiAgICBFeGFtcGxlOjoKICAgICAgICB3ZCA9IFdvcmQoYWxwaGFzKQoKICAgICAgICBAdHJhY2VQYXJzZUFjdGlvbgogICAgICAgIGRlZiByZW1vdmVfZHVwbGljYXRlX2NoYXJzKHRva2Vucyk6CiAgICAgICAgICAgIHJldHVybiAnJy5qb2luKHNvcnRlZChzZXQoJycuam9pbih0b2tlbnMpKSkKCiAgICAgICAgd2RzID0gT25lT3JNb3JlKHdkKS5zZXRQYXJzZUFjdGlvbihyZW1vdmVfZHVwbGljYXRlX2NoYXJzKQogICAgICAgIHByaW50KHdkcy5wYXJzZVN0cmluZygic2xrZGpzIHNsZCBzbGRkIHNkbGYgc2RsamYiKSkKICAgIHByaW50czo6CiAgICAgICAgPj5lbnRlcmluZyByZW1vdmVfZHVwbGljYXRlX2NoYXJzKGxpbmU6ICdzbGtkanMgc2xkIHNsZGQgc2RsZiBzZGxqZicsIDAsIChbJ3Nsa2RqcycsICdzbGQnLCAnc2xkZCcsICdzZGxmJywgJ3NkbGpmJ10sIHt9KSkKICAgICAgICA8PGxlYXZpbmcgcmVtb3ZlX2R1cGxpY2F0ZV9jaGFycyAocmV0OiAnZGZqa2xzJykKICAgICAgICBbJ2RmamtscyddCiAgICAiIiIKICAgIGYgPSBfdHJpbV9hcml0eShmKQogICAgZGVmIHooKnBhQXJncyk6CiAgICAgICAgdGhpc0Z1bmMgPSBmLl9fbmFtZV9fCiAgICAgICAgcyxsLHQgPSBwYUFyZ3NbLTM6XQogICAgICAgIGlmIGxlbihwYUFyZ3MpPjM6CiAgICAgICAgICAgIHRoaXNGdW5jID0gcGFBcmdzWzBdLl9fY2xhc3NfXy5fX25hbWVfXyArICcuJyArIHRoaXNGdW5jCiAgICAgICAgc3lzLnN0ZGVyci53cml0ZSggIj4+ZW50ZXJpbmcgJXMobGluZTogJyVzJywgJWQsICVyKVxuIiAlICh0aGlzRnVuYyxsaW5lKGwscyksbCx0KSApCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXQgPSBmKCpwYUFyZ3MpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBleGM6CiAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoICI8PGxlYXZpbmcgJXMgKGV4Y2VwdGlvbjogJXMpXG4iICUgKHRoaXNGdW5jLGV4YykgKQogICAgICAgICAgICByYWlzZQogICAgICAgIHN5cy5zdGRlcnIud3JpdGUoICI8PGxlYXZpbmcgJXMgKHJldDogJXIpXG4iICUgKHRoaXNGdW5jLHJldCkgKQogICAgICAgIHJldHVybiByZXQKICAgIHRyeToKICAgICAgICB6Ll9fbmFtZV9fID0gZi5fX25hbWVfXwogICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgIHBhc3MKICAgIHJldHVybiB6CgojCiMgZ2xvYmFsIGhlbHBlcnMKIwpkZWYgZGVsaW1pdGVkTGlzdCggZXhwciwgZGVsaW09IiwiLCBjb21iaW5lPUZhbHNlICk6CiAgICAiIiIKICAgIEhlbHBlciB0byBkZWZpbmUgYSBkZWxpbWl0ZWQgbGlzdCBvZiBleHByZXNzaW9ucyAtIHRoZSBkZWxpbWl0ZXIgZGVmYXVsdHMgdG8gJywnLgogICAgQnkgZGVmYXVsdCwgdGhlIGxpc3QgZWxlbWVudHMgYW5kIGRlbGltaXRlcnMgY2FuIGhhdmUgaW50ZXJ2ZW5pbmcgd2hpdGVzcGFjZSwgYW5kCiAgICBjb21tZW50cywgYnV0IHRoaXMgY2FuIGJlIG92ZXJyaWRkZW4gYnkgcGFzc2luZyBDe2NvbWJpbmU9VHJ1ZX0gaW4gdGhlIGNvbnN0cnVjdG9yLgogICAgSWYgQ3tjb21iaW5lfSBpcyBzZXQgdG8gQ3tUcnVlfSwgdGhlIG1hdGNoaW5nIHRva2VucyBhcmUgcmV0dXJuZWQgYXMgYSBzaW5nbGUgdG9rZW4KICAgIHN0cmluZywgd2l0aCB0aGUgZGVsaW1pdGVycyBpbmNsdWRlZDsgb3RoZXJ3aXNlLCB0aGUgbWF0Y2hpbmcgdG9rZW5zIGFyZSByZXR1cm5lZAogICAgYXMgYSBsaXN0IG9mIHRva2Vucywgd2l0aCB0aGUgZGVsaW1pdGVycyBzdXBwcmVzc2VkLgoKICAgIEV4YW1wbGU6OgogICAgICAgIGRlbGltaXRlZExpc3QoV29yZChhbHBoYXMpKS5wYXJzZVN0cmluZygiYWEsYmIsY2MiKSAjIC0+IFsnYWEnLCAnYmInLCAnY2MnXQogICAgICAgIGRlbGltaXRlZExpc3QoV29yZChoZXhudW1zKSwgZGVsaW09JzonLCBjb21iaW5lPVRydWUpLnBhcnNlU3RyaW5nKCJBQTpCQjpDQzpERDpFRSIpICMgLT4gWydBQTpCQjpDQzpERDpFRSddCiAgICAiIiIKICAgIGRsTmFtZSA9IF91c3RyKGV4cHIpKyIgWyIrX3VzdHIoZGVsaW0pKyIgIitfdXN0cihleHByKSsiXS4uLiIKICAgIGlmIGNvbWJpbmU6CiAgICAgICAgcmV0dXJuIENvbWJpbmUoIGV4cHIgKyBaZXJvT3JNb3JlKCBkZWxpbSArIGV4cHIgKSApLnNldE5hbWUoZGxOYW1lKQogICAgZWxzZToKICAgICAgICByZXR1cm4gKCBleHByICsgWmVyb09yTW9yZSggU3VwcHJlc3MoIGRlbGltICkgKyBleHByICkgKS5zZXROYW1lKGRsTmFtZSkKCmRlZiBjb3VudGVkQXJyYXkoIGV4cHIsIGludEV4cHI9Tm9uZSApOgogICAgIiIiCiAgICBIZWxwZXIgdG8gZGVmaW5lIGEgY291bnRlZCBsaXN0IG9mIGV4cHJlc3Npb25zLgogICAgVGhpcyBoZWxwZXIgZGVmaW5lcyBhIHBhdHRlcm4gb2YgdGhlIGZvcm06OgogICAgICAgIGludGVnZXIgZXhwciBleHByIGV4cHIuLi4KICAgIHdoZXJlIHRoZSBsZWFkaW5nIGludGVnZXIgdGVsbHMgaG93IG1hbnkgZXhwciBleHByZXNzaW9ucyBmb2xsb3cuCiAgICBUaGUgbWF0Y2hlZCB0b2tlbnMgcmV0dXJucyB0aGUgYXJyYXkgb2YgZXhwciB0b2tlbnMgYXMgYSBsaXN0IC0gdGhlIGxlYWRpbmcgY291bnQgdG9rZW4gaXMgc3VwcHJlc3NlZC4KICAgIAogICAgSWYgQ3tpbnRFeHByfSBpcyBzcGVjaWZpZWQsIGl0IHNob3VsZCBiZSBhIHB5cGFyc2luZyBleHByZXNzaW9uIHRoYXQgcHJvZHVjZXMgYW4gaW50ZWdlciB2YWx1ZS4KCiAgICBFeGFtcGxlOjoKICAgICAgICBjb3VudGVkQXJyYXkoV29yZChhbHBoYXMpKS5wYXJzZVN0cmluZygnMiBhYiBjZCBlZicpICAjIC0+IFsnYWInLCAnY2QnXQoKICAgICAgICAjIGluIHRoaXMgcGFyc2VyLCB0aGUgbGVhZGluZyBpbnRlZ2VyIHZhbHVlIGlzIGdpdmVuIGluIGJpbmFyeSwKICAgICAgICAjICcxMCcgaW5kaWNhdGluZyB0aGF0IDIgdmFsdWVzIGFyZSBpbiB0aGUgYXJyYXkKICAgICAgICBiaW5hcnlDb25zdGFudCA9IFdvcmQoJzAxJykuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHQ6IGludCh0WzBdLCAyKSkKICAgICAgICBjb3VudGVkQXJyYXkoV29yZChhbHBoYXMpLCBpbnRFeHByPWJpbmFyeUNvbnN0YW50KS5wYXJzZVN0cmluZygnMTAgYWIgY2QgZWYnKSAgIyAtPiBbJ2FiJywgJ2NkJ10KICAgICIiIgogICAgYXJyYXlFeHByID0gRm9yd2FyZCgpCiAgICBkZWYgY291bnRGaWVsZFBhcnNlQWN0aW9uKHMsbCx0KToKICAgICAgICBuID0gdFswXQogICAgICAgIGFycmF5RXhwciA8PCAobiBhbmQgR3JvdXAoQW5kKFtleHByXSpuKSkgb3IgR3JvdXAoZW1wdHkpKQogICAgICAgIHJldHVybiBbXQogICAgaWYgaW50RXhwciBpcyBOb25lOgogICAgICAgIGludEV4cHIgPSBXb3JkKG51bXMpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0OmludCh0WzBdKSkKICAgIGVsc2U6CiAgICAgICAgaW50RXhwciA9IGludEV4cHIuY29weSgpCiAgICBpbnRFeHByLnNldE5hbWUoImFycmF5TGVuIikKICAgIGludEV4cHIuYWRkUGFyc2VBY3Rpb24oY291bnRGaWVsZFBhcnNlQWN0aW9uLCBjYWxsRHVyaW5nVHJ5PVRydWUpCiAgICByZXR1cm4gKCBpbnRFeHByICsgYXJyYXlFeHByICkuc2V0TmFtZSgnKGxlbikgJyArIF91c3RyKGV4cHIpICsgJy4uLicpCgpkZWYgX2ZsYXR0ZW4oTCk6CiAgICByZXQgPSBbXQogICAgZm9yIGkgaW4gTDoKICAgICAgICBpZiBpc2luc3RhbmNlKGksbGlzdCk6CiAgICAgICAgICAgIHJldC5leHRlbmQoX2ZsYXR0ZW4oaSkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0LmFwcGVuZChpKQogICAgcmV0dXJuIHJldAoKZGVmIG1hdGNoUHJldmlvdXNMaXRlcmFsKGV4cHIpOgogICAgIiIiCiAgICBIZWxwZXIgdG8gZGVmaW5lIGFuIGV4cHJlc3Npb24gdGhhdCBpcyBpbmRpcmVjdGx5IGRlZmluZWQgZnJvbQogICAgdGhlIHRva2VucyBtYXRjaGVkIGluIGEgcHJldmlvdXMgZXhwcmVzc2lvbiwgdGhhdCBpcywgaXQgbG9va3MKICAgIGZvciBhICdyZXBlYXQnIG9mIGEgcHJldmlvdXMgZXhwcmVzc2lvbi4gIEZvciBleGFtcGxlOjoKICAgICAgICBmaXJzdCA9IFdvcmQobnVtcykKICAgICAgICBzZWNvbmQgPSBtYXRjaFByZXZpb3VzTGl0ZXJhbChmaXJzdCkKICAgICAgICBtYXRjaEV4cHIgPSBmaXJzdCArICI6IiArIHNlY29uZAogICAgd2lsbCBtYXRjaCBDeyIxOjEifSwgYnV0IG5vdCBDeyIxOjIifS4gIEJlY2F1c2UgdGhpcyBtYXRjaGVzIGEKICAgIHByZXZpb3VzIGxpdGVyYWwsIHdpbGwgYWxzbyBtYXRjaCB0aGUgbGVhZGluZyBDeyIxOjEifSBpbiBDeyIxOjEwIn0uCiAgICBJZiB0aGlzIGlzIG5vdCBkZXNpcmVkLCB1c2UgQ3ttYXRjaFByZXZpb3VzRXhwcn0uCiAgICBEbyBJe25vdH0gdXNlIHdpdGggcGFja3JhdCBwYXJzaW5nIGVuYWJsZWQuCiAgICAiIiIKICAgIHJlcCA9IEZvcndhcmQoKQogICAgZGVmIGNvcHlUb2tlblRvUmVwZWF0ZXIocyxsLHQpOgogICAgICAgIGlmIHQ6CiAgICAgICAgICAgIGlmIGxlbih0KSA9PSAxOgogICAgICAgICAgICAgICAgcmVwIDw8IHRbMF0KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgZmxhdHRlbiB0IHRva2VucwogICAgICAgICAgICAgICAgdGZsYXQgPSBfZmxhdHRlbih0LmFzTGlzdCgpKQogICAgICAgICAgICAgICAgcmVwIDw8IEFuZChMaXRlcmFsKHR0KSBmb3IgdHQgaW4gdGZsYXQpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmVwIDw8IEVtcHR5KCkKICAgIGV4cHIuYWRkUGFyc2VBY3Rpb24oY29weVRva2VuVG9SZXBlYXRlciwgY2FsbER1cmluZ1RyeT1UcnVlKQogICAgcmVwLnNldE5hbWUoJyhwcmV2KSAnICsgX3VzdHIoZXhwcikpCiAgICByZXR1cm4gcmVwCgpkZWYgbWF0Y2hQcmV2aW91c0V4cHIoZXhwcik6CiAgICAiIiIKICAgIEhlbHBlciB0byBkZWZpbmUgYW4gZXhwcmVzc2lvbiB0aGF0IGlzIGluZGlyZWN0bHkgZGVmaW5lZCBmcm9tCiAgICB0aGUgdG9rZW5zIG1hdGNoZWQgaW4gYSBwcmV2aW91cyBleHByZXNzaW9uLCB0aGF0IGlzLCBpdCBsb29rcwogICAgZm9yIGEgJ3JlcGVhdCcgb2YgYSBwcmV2aW91cyBleHByZXNzaW9uLiAgRm9yIGV4YW1wbGU6OgogICAgICAgIGZpcnN0ID0gV29yZChudW1zKQogICAgICAgIHNlY29uZCA9IG1hdGNoUHJldmlvdXNFeHByKGZpcnN0KQogICAgICAgIG1hdGNoRXhwciA9IGZpcnN0ICsgIjoiICsgc2Vjb25kCiAgICB3aWxsIG1hdGNoIEN7IjE6MSJ9LCBidXQgbm90IEN7IjE6MiJ9LiAgQmVjYXVzZSB0aGlzIG1hdGNoZXMgYnkKICAgIGV4cHJlc3Npb25zLCB3aWxsIEl7bm90fSBtYXRjaCB0aGUgbGVhZGluZyBDeyIxOjEifSBpbiBDeyIxOjEwIn07CiAgICB0aGUgZXhwcmVzc2lvbnMgYXJlIGV2YWx1YXRlZCBmaXJzdCwgYW5kIHRoZW4gY29tcGFyZWQsIHNvCiAgICBDeyIxIn0gaXMgY29tcGFyZWQgd2l0aCBDeyIxMCJ9LgogICAgRG8gSXtub3R9IHVzZSB3aXRoIHBhY2tyYXQgcGFyc2luZyBlbmFibGVkLgogICAgIiIiCiAgICByZXAgPSBGb3J3YXJkKCkKICAgIGUyID0gZXhwci5jb3B5KCkKICAgIHJlcCA8PD0gZTIKICAgIGRlZiBjb3B5VG9rZW5Ub1JlcGVhdGVyKHMsbCx0KToKICAgICAgICBtYXRjaFRva2VucyA9IF9mbGF0dGVuKHQuYXNMaXN0KCkpCiAgICAgICAgZGVmIG11c3RNYXRjaFRoZXNlVG9rZW5zKHMsbCx0KToKICAgICAgICAgICAgdGhlc2VUb2tlbnMgPSBfZmxhdHRlbih0LmFzTGlzdCgpKQogICAgICAgICAgICBpZiAgdGhlc2VUb2tlbnMgIT0gbWF0Y2hUb2tlbnM6CiAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbigiIiwwLCIiKQogICAgICAgIHJlcC5zZXRQYXJzZUFjdGlvbiggbXVzdE1hdGNoVGhlc2VUb2tlbnMsIGNhbGxEdXJpbmdUcnk9VHJ1ZSApCiAgICBleHByLmFkZFBhcnNlQWN0aW9uKGNvcHlUb2tlblRvUmVwZWF0ZXIsIGNhbGxEdXJpbmdUcnk9VHJ1ZSkKICAgIHJlcC5zZXROYW1lKCcocHJldikgJyArIF91c3RyKGV4cHIpKQogICAgcmV0dXJuIHJlcAoKZGVmIF9lc2NhcGVSZWdleFJhbmdlQ2hhcnMocyk6CiAgICAjfiAgZXNjYXBlIHRoZXNlIGNoYXJzOiBeLV0KICAgIGZvciBjIGluIHIiXF4tXSI6CiAgICAgICAgcyA9IHMucmVwbGFjZShjLF9ic2xhc2grYykKICAgIHMgPSBzLnJlcGxhY2UoIlxuIixyIlxuIikKICAgIHMgPSBzLnJlcGxhY2UoIlx0IixyIlx0IikKICAgIHJldHVybiBfdXN0cihzKQoKZGVmIG9uZU9mKCBzdHJzLCBjYXNlbGVzcz1GYWxzZSwgdXNlUmVnZXg9VHJ1ZSApOgogICAgIiIiCiAgICBIZWxwZXIgdG8gcXVpY2tseSBkZWZpbmUgYSBzZXQgb2YgYWx0ZXJuYXRpdmUgTGl0ZXJhbHMsIGFuZCBtYWtlcyBzdXJlIHRvIGRvCiAgICBsb25nZXN0LWZpcnN0IHRlc3Rpbmcgd2hlbiB0aGVyZSBpcyBhIGNvbmZsaWN0LCByZWdhcmRsZXNzIG9mIHRoZSBpbnB1dCBvcmRlciwKICAgIGJ1dCByZXR1cm5zIGEgQ3tMe01hdGNoRmlyc3R9fSBmb3IgYmVzdCBwZXJmb3JtYW5jZS4KCiAgICBQYXJhbWV0ZXJzOgogICAgIC0gc3RycyAtIGEgc3RyaW5nIG9mIHNwYWNlLWRlbGltaXRlZCBsaXRlcmFscywgb3IgYSBjb2xsZWN0aW9uIG9mIHN0cmluZyBsaXRlcmFscwogICAgIC0gY2FzZWxlc3MgLSAoZGVmYXVsdD1De0ZhbHNlfSkgLSB0cmVhdCBhbGwgbGl0ZXJhbHMgYXMgY2FzZWxlc3MKICAgICAtIHVzZVJlZ2V4IC0gKGRlZmF1bHQ9Q3tUcnVlfSkgLSBhcyBhbiBvcHRpbWl6YXRpb24sIHdpbGwgZ2VuZXJhdGUgYSBSZWdleAogICAgICAgICAgb2JqZWN0OyBvdGhlcndpc2UsIHdpbGwgZ2VuZXJhdGUgYSBDe01hdGNoRmlyc3R9IG9iamVjdCAoaWYgQ3tjYXNlbGVzcz1UcnVlfSwgb3IKICAgICAgICAgIGlmIGNyZWF0aW5nIGEgQ3tSZWdleH0gcmFpc2VzIGFuIGV4Y2VwdGlvbikKCiAgICBFeGFtcGxlOjoKICAgICAgICBjb21wX29wZXIgPSBvbmVPZigiPCA9ID4gPD0gPj0gIT0iKQogICAgICAgIHZhciA9IFdvcmQoYWxwaGFzKQogICAgICAgIG51bWJlciA9IFdvcmQobnVtcykKICAgICAgICB0ZXJtID0gdmFyIHwgbnVtYmVyCiAgICAgICAgY29tcGFyaXNvbl9leHByID0gdGVybSArIGNvbXBfb3BlciArIHRlcm0KICAgICAgICBwcmludChjb21wYXJpc29uX2V4cHIuc2VhcmNoU3RyaW5nKCJCID0gMTIgIEFBPTIzIEI8PUFBIEFBPjEyIikpCiAgICBwcmludHM6OgogICAgICAgIFtbJ0InLCAnPScsICcxMiddLCBbJ0FBJywgJz0nLCAnMjMnXSwgWydCJywgJzw9JywgJ0FBJ10sIFsnQUEnLCAnPicsICcxMiddXQogICAgIiIiCiAgICBpZiBjYXNlbGVzczoKICAgICAgICBpc2VxdWFsID0gKCBsYW1iZGEgYSxiOiBhLnVwcGVyKCkgPT0gYi51cHBlcigpICkKICAgICAgICBtYXNrcyA9ICggbGFtYmRhIGEsYjogYi51cHBlcigpLnN0YXJ0c3dpdGgoYS51cHBlcigpKSApCiAgICAgICAgcGFyc2VFbGVtZW50Q2xhc3MgPSBDYXNlbGVzc0xpdGVyYWwKICAgIGVsc2U6CiAgICAgICAgaXNlcXVhbCA9ICggbGFtYmRhIGEsYjogYSA9PSBiICkKICAgICAgICBtYXNrcyA9ICggbGFtYmRhIGEsYjogYi5zdGFydHN3aXRoKGEpICkKICAgICAgICBwYXJzZUVsZW1lbnRDbGFzcyA9IExpdGVyYWwKCiAgICBzeW1ib2xzID0gW10KICAgIGlmIGlzaW5zdGFuY2Uoc3RycyxiYXNlc3RyaW5nKToKICAgICAgICBzeW1ib2xzID0gc3Rycy5zcGxpdCgpCiAgICBlbGlmIGlzaW5zdGFuY2Uoc3RycywgY29sbGVjdGlvbnMuSXRlcmFibGUpOgogICAgICAgIHN5bWJvbHMgPSBsaXN0KHN0cnMpCiAgICBlbHNlOgogICAgICAgIHdhcm5pbmdzLndhcm4oIkludmFsaWQgYXJndW1lbnQgdG8gb25lT2YsIGV4cGVjdGVkIHN0cmluZyBvciBpdGVyYWJsZSIsCiAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpCiAgICBpZiBub3Qgc3ltYm9sczoKICAgICAgICByZXR1cm4gTm9NYXRjaCgpCgogICAgaSA9IDAKICAgIHdoaWxlIGkgPCBsZW4oc3ltYm9scyktMToKICAgICAgICBjdXIgPSBzeW1ib2xzW2ldCiAgICAgICAgZm9yIGosb3RoZXIgaW4gZW51bWVyYXRlKHN5bWJvbHNbaSsxOl0pOgogICAgICAgICAgICBpZiAoIGlzZXF1YWwob3RoZXIsIGN1cikgKToKICAgICAgICAgICAgICAgIGRlbCBzeW1ib2xzW2kraisxXQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgZWxpZiAoIG1hc2tzKGN1ciwgb3RoZXIpICk6CiAgICAgICAgICAgICAgICBkZWwgc3ltYm9sc1tpK2orMV0KICAgICAgICAgICAgICAgIHN5bWJvbHMuaW5zZXJ0KGksb3RoZXIpCiAgICAgICAgICAgICAgICBjdXIgPSBvdGhlcgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICBlbHNlOgogICAgICAgICAgICBpICs9IDEKCiAgICBpZiBub3QgY2FzZWxlc3MgYW5kIHVzZVJlZ2V4OgogICAgICAgICN+IHByaW50IChzdHJzLCItPiIsICJ8Ii5qb2luKCBbIF9lc2NhcGVSZWdleENoYXJzKHN5bSkgZm9yIHN5bSBpbiBzeW1ib2xzXSApKQogICAgICAgIHRyeToKICAgICAgICAgICAgaWYgbGVuKHN5bWJvbHMpPT1sZW4oIiIuam9pbihzeW1ib2xzKSk6CiAgICAgICAgICAgICAgICByZXR1cm4gUmVnZXgoICJbJXNdIiAlICIiLmpvaW4oX2VzY2FwZVJlZ2V4UmFuZ2VDaGFycyhzeW0pIGZvciBzeW0gaW4gc3ltYm9scykgKS5zZXROYW1lKCcgfCAnLmpvaW4oc3ltYm9scykpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXR1cm4gUmVnZXgoICJ8Ii5qb2luKHJlLmVzY2FwZShzeW0pIGZvciBzeW0gaW4gc3ltYm9scykgKS5zZXROYW1lKCcgfCAnLmpvaW4oc3ltYm9scykpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgd2FybmluZ3Mud2FybigiRXhjZXB0aW9uIGNyZWF0aW5nIFJlZ2V4IGZvciBvbmVPZiwgYnVpbGRpbmcgTWF0Y2hGaXJzdCIsCiAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQoKCiAgICAjIGxhc3QgcmVzb3J0LCBqdXN0IHVzZSBNYXRjaEZpcnN0CiAgICByZXR1cm4gTWF0Y2hGaXJzdChwYXJzZUVsZW1lbnRDbGFzcyhzeW0pIGZvciBzeW0gaW4gc3ltYm9scykuc2V0TmFtZSgnIHwgJy5qb2luKHN5bWJvbHMpKQoKZGVmIGRpY3RPZigga2V5LCB2YWx1ZSApOgogICAgIiIiCiAgICBIZWxwZXIgdG8gZWFzaWx5IGFuZCBjbGVhcmx5IGRlZmluZSBhIGRpY3Rpb25hcnkgYnkgc3BlY2lmeWluZyB0aGUgcmVzcGVjdGl2ZSBwYXR0ZXJucwogICAgZm9yIHRoZSBrZXkgYW5kIHZhbHVlLiAgVGFrZXMgY2FyZSBvZiBkZWZpbmluZyB0aGUgQ3tMe0RpY3R9fSwgQ3tMe1plcm9Pck1vcmV9fSwgYW5kIEN7THtHcm91cH19IHRva2VucwogICAgaW4gdGhlIHByb3BlciBvcmRlci4gIFRoZSBrZXkgcGF0dGVybiBjYW4gaW5jbHVkZSBkZWxpbWl0aW5nIG1hcmtlcnMgb3IgcHVuY3R1YXRpb24sCiAgICBhcyBsb25nIGFzIHRoZXkgYXJlIHN1cHByZXNzZWQsIHRoZXJlYnkgbGVhdmluZyB0aGUgc2lnbmlmaWNhbnQga2V5IHRleHQuICBUaGUgdmFsdWUKICAgIHBhdHRlcm4gY2FuIGluY2x1ZGUgbmFtZWQgcmVzdWx0cywgc28gdGhhdCB0aGUgQ3tEaWN0fSByZXN1bHRzIGNhbiBpbmNsdWRlIG5hbWVkIHRva2VuCiAgICBmaWVsZHMuCgogICAgRXhhbXBsZTo6CiAgICAgICAgdGV4dCA9ICJzaGFwZTogU1FVQVJFIHBvc246IHVwcGVyIGxlZnQgY29sb3I6IGxpZ2h0IGJsdWUgdGV4dHVyZTogYnVybGFwIgogICAgICAgIGF0dHJfZXhwciA9IChsYWJlbCArIFN1cHByZXNzKCc6JykgKyBPbmVPck1vcmUoZGF0YV93b3JkLCBzdG9wT249bGFiZWwpLnNldFBhcnNlQWN0aW9uKCcgJy5qb2luKSkKICAgICAgICBwcmludChPbmVPck1vcmUoYXR0cl9leHByKS5wYXJzZVN0cmluZyh0ZXh0KS5kdW1wKCkpCiAgICAgICAgCiAgICAgICAgYXR0cl9sYWJlbCA9IGxhYmVsCiAgICAgICAgYXR0cl92YWx1ZSA9IFN1cHByZXNzKCc6JykgKyBPbmVPck1vcmUoZGF0YV93b3JkLCBzdG9wT249bGFiZWwpLnNldFBhcnNlQWN0aW9uKCcgJy5qb2luKQoKICAgICAgICAjIHNpbWlsYXIgdG8gRGljdCwgYnV0IHNpbXBsZXIgY2FsbCBmb3JtYXQKICAgICAgICByZXN1bHQgPSBkaWN0T2YoYXR0cl9sYWJlbCwgYXR0cl92YWx1ZSkucGFyc2VTdHJpbmcodGV4dCkKICAgICAgICBwcmludChyZXN1bHQuZHVtcCgpKQogICAgICAgIHByaW50KHJlc3VsdFsnc2hhcGUnXSkKICAgICAgICBwcmludChyZXN1bHQuc2hhcGUpICAjIG9iamVjdCBhdHRyaWJ1dGUgYWNjZXNzIHdvcmtzIHRvbwogICAgICAgIHByaW50KHJlc3VsdC5hc0RpY3QoKSkKICAgIHByaW50czo6CiAgICAgICAgW1snc2hhcGUnLCAnU1FVQVJFJ10sIFsncG9zbicsICd1cHBlciBsZWZ0J10sIFsnY29sb3InLCAnbGlnaHQgYmx1ZSddLCBbJ3RleHR1cmUnLCAnYnVybGFwJ11dCiAgICAgICAgLSBjb2xvcjogbGlnaHQgYmx1ZQogICAgICAgIC0gcG9zbjogdXBwZXIgbGVmdAogICAgICAgIC0gc2hhcGU6IFNRVUFSRQogICAgICAgIC0gdGV4dHVyZTogYnVybGFwCiAgICAgICAgU1FVQVJFCiAgICAgICAgU1FVQVJFCiAgICAgICAgeydjb2xvcic6ICdsaWdodCBibHVlJywgJ3NoYXBlJzogJ1NRVUFSRScsICdwb3NuJzogJ3VwcGVyIGxlZnQnLCAndGV4dHVyZSc6ICdidXJsYXAnfQogICAgIiIiCiAgICByZXR1cm4gRGljdCggWmVyb09yTW9yZSggR3JvdXAgKCBrZXkgKyB2YWx1ZSApICkgKQoKZGVmIG9yaWdpbmFsVGV4dEZvcihleHByLCBhc1N0cmluZz1UcnVlKToKICAgICIiIgogICAgSGVscGVyIHRvIHJldHVybiB0aGUgb3JpZ2luYWwsIHVudG9rZW5pemVkIHRleHQgZm9yIGEgZ2l2ZW4gZXhwcmVzc2lvbi4gIFVzZWZ1bCB0bwogICAgcmVzdG9yZSB0aGUgcGFyc2VkIGZpZWxkcyBvZiBhbiBIVE1MIHN0YXJ0IHRhZyBpbnRvIHRoZSByYXcgdGFnIHRleHQgaXRzZWxmLCBvciB0bwogICAgcmV2ZXJ0IHNlcGFyYXRlIHRva2VucyB3aXRoIGludGVydmVuaW5nIHdoaXRlc3BhY2UgYmFjayB0byB0aGUgb3JpZ2luYWwgbWF0Y2hpbmcKICAgIGlucHV0IHRleHQuIEJ5IGRlZmF1bHQsIHJldHVybnMgYXN0cmluZyBjb250YWluaW5nIHRoZSBvcmlnaW5hbCBwYXJzZWQgdGV4dC4gIAogICAgICAgCiAgICBJZiB0aGUgb3B0aW9uYWwgQ3thc1N0cmluZ30gYXJndW1lbnQgaXMgcGFzc2VkIGFzIEN7RmFsc2V9LCB0aGVuIHRoZSByZXR1cm4gdmFsdWUgaXMgYSAKICAgIEN7THtQYXJzZVJlc3VsdHN9fSBjb250YWluaW5nIGFueSByZXN1bHRzIG5hbWVzIHRoYXQgd2VyZSBvcmlnaW5hbGx5IG1hdGNoZWQsIGFuZCBhIAogICAgc2luZ2xlIHRva2VuIGNvbnRhaW5pbmcgdGhlIG9yaWdpbmFsIG1hdGNoZWQgdGV4dCBmcm9tIHRoZSBpbnB1dCBzdHJpbmcuICBTbyBpZiAKICAgIHRoZSBleHByZXNzaW9uIHBhc3NlZCB0byBDe0x7b3JpZ2luYWxUZXh0Rm9yfX0gY29udGFpbnMgZXhwcmVzc2lvbnMgd2l0aCBkZWZpbmVkCiAgICByZXN1bHRzIG5hbWVzLCB5b3UgbXVzdCBzZXQgQ3thc1N0cmluZ30gdG8gQ3tGYWxzZX0gaWYgeW91IHdhbnQgdG8gcHJlc2VydmUgdGhvc2UKICAgIHJlc3VsdHMgbmFtZSB2YWx1ZXMuCgogICAgRXhhbXBsZTo6CiAgICAgICAgc3JjID0gInRoaXMgaXMgdGVzdCA8Yj4gYm9sZCA8aT50ZXh0PC9pPiA8L2I+IG5vcm1hbCB0ZXh0ICIKICAgICAgICBmb3IgdGFnIGluICgiYiIsImkiKToKICAgICAgICAgICAgb3BlbmVyLGNsb3NlciA9IG1ha2VIVE1MVGFncyh0YWcpCiAgICAgICAgICAgIHBhdHQgPSBvcmlnaW5hbFRleHRGb3Iob3BlbmVyICsgU2tpcFRvKGNsb3NlcikgKyBjbG9zZXIpCiAgICAgICAgICAgIHByaW50KHBhdHQuc2VhcmNoU3RyaW5nKHNyYylbMF0pCiAgICBwcmludHM6OgogICAgICAgIFsnPGI+IGJvbGQgPGk+dGV4dDwvaT4gPC9iPiddCiAgICAgICAgWyc8aT50ZXh0PC9pPiddCiAgICAiIiIKICAgIGxvY01hcmtlciA9IEVtcHR5KCkuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHMsbG9jLHQ6IGxvYykKICAgIGVuZGxvY01hcmtlciA9IGxvY01hcmtlci5jb3B5KCkKICAgIGVuZGxvY01hcmtlci5jYWxsUHJlcGFyc2UgPSBGYWxzZQogICAgbWF0Y2hFeHByID0gbG9jTWFya2VyKCJfb3JpZ2luYWxfc3RhcnQiKSArIGV4cHIgKyBlbmRsb2NNYXJrZXIoIl9vcmlnaW5hbF9lbmQiKQogICAgaWYgYXNTdHJpbmc6CiAgICAgICAgZXh0cmFjdFRleHQgPSBsYW1iZGEgcyxsLHQ6IHNbdC5fb3JpZ2luYWxfc3RhcnQ6dC5fb3JpZ2luYWxfZW5kXQogICAgZWxzZToKICAgICAgICBkZWYgZXh0cmFjdFRleHQocyxsLHQpOgogICAgICAgICAgICB0WzpdID0gW3NbdC5wb3AoJ19vcmlnaW5hbF9zdGFydCcpOnQucG9wKCdfb3JpZ2luYWxfZW5kJyldXQogICAgbWF0Y2hFeHByLnNldFBhcnNlQWN0aW9uKGV4dHJhY3RUZXh0KQogICAgbWF0Y2hFeHByLmlnbm9yZUV4cHJzID0gZXhwci5pZ25vcmVFeHBycwogICAgcmV0dXJuIG1hdGNoRXhwcgoKZGVmIHVuZ3JvdXAoZXhwcik6IAogICAgIiIiCiAgICBIZWxwZXIgdG8gdW5kbyBweXBhcnNpbmcncyBkZWZhdWx0IGdyb3VwaW5nIG9mIEFuZCBleHByZXNzaW9ucywgZXZlbgogICAgaWYgYWxsIGJ1dCBvbmUgYXJlIG5vbi1lbXB0eS4KICAgICIiIgogICAgcmV0dXJuIFRva2VuQ29udmVydGVyKGV4cHIpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0OnRbMF0pCgpkZWYgbG9jYXRlZEV4cHIoZXhwcik6CiAgICAiIiIKICAgIEhlbHBlciB0byBkZWNvcmF0ZSBhIHJldHVybmVkIHRva2VuIHdpdGggaXRzIHN0YXJ0aW5nIGFuZCBlbmRpbmcgbG9jYXRpb25zIGluIHRoZSBpbnB1dCBzdHJpbmcuCiAgICBUaGlzIGhlbHBlciBhZGRzIHRoZSBmb2xsb3dpbmcgcmVzdWx0cyBuYW1lczoKICAgICAtIGxvY25fc3RhcnQgPSBsb2NhdGlvbiB3aGVyZSBtYXRjaGVkIGV4cHJlc3Npb24gYmVnaW5zCiAgICAgLSBsb2NuX2VuZCA9IGxvY2F0aW9uIHdoZXJlIG1hdGNoZWQgZXhwcmVzc2lvbiBlbmRzCiAgICAgLSB2YWx1ZSA9IHRoZSBhY3R1YWwgcGFyc2VkIHJlc3VsdHMKCiAgICBCZSBjYXJlZnVsIGlmIHRoZSBpbnB1dCB0ZXh0IGNvbnRhaW5zIEN7PFRBQj59IGNoYXJhY3RlcnMsIHlvdSBtYXkgd2FudCB0byBjYWxsCiAgICBDe0x7UGFyc2VyRWxlbWVudC5wYXJzZVdpdGhUYWJzfX0KCiAgICBFeGFtcGxlOjoKICAgICAgICB3ZCA9IFdvcmQoYWxwaGFzKQogICAgICAgIGZvciBtYXRjaCBpbiBsb2NhdGVkRXhwcih3ZCkuc2VhcmNoU3RyaW5nKCJsanNkZjEyM2xrc2RqamYxMjNsa2tqajEyMjIiKToKICAgICAgICAgICAgcHJpbnQobWF0Y2gpCiAgICBwcmludHM6OgogICAgICAgIFtbMCwgJ2xqc2RmJywgNV1dCiAgICAgICAgW1s4LCAnbGtzZGpqZicsIDE1XV0KICAgICAgICBbWzE4LCAnbGtramonLCAyM11dCiAgICAiIiIKICAgIGxvY2F0b3IgPSBFbXB0eSgpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSBzLGwsdDogbCkKICAgIHJldHVybiBHcm91cChsb2NhdG9yKCJsb2NuX3N0YXJ0IikgKyBleHByKCJ2YWx1ZSIpICsgbG9jYXRvci5jb3B5KCkubGVhdmVXaGl0ZXNwYWNlKCkoImxvY25fZW5kIikpCgoKIyBjb252ZW5pZW5jZSBjb25zdGFudHMgZm9yIHBvc2l0aW9uYWwgZXhwcmVzc2lvbnMKZW1wdHkgICAgICAgPSBFbXB0eSgpLnNldE5hbWUoImVtcHR5IikKbGluZVN0YXJ0ICAgPSBMaW5lU3RhcnQoKS5zZXROYW1lKCJsaW5lU3RhcnQiKQpsaW5lRW5kICAgICA9IExpbmVFbmQoKS5zZXROYW1lKCJsaW5lRW5kIikKc3RyaW5nU3RhcnQgPSBTdHJpbmdTdGFydCgpLnNldE5hbWUoInN0cmluZ1N0YXJ0IikKc3RyaW5nRW5kICAgPSBTdHJpbmdFbmQoKS5zZXROYW1lKCJzdHJpbmdFbmQiKQoKX2VzY2FwZWRQdW5jID0gV29yZCggX2JzbGFzaCwgciJcW10tKi4kK14/KCl+ICIsIGV4YWN0PTIgKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcyxsLHQ6dFswXVsxXSkKX2VzY2FwZWRIZXhDaGFyID0gUmVnZXgociJcXDA/W3hYXVswLTlhLWZBLUZdKyIpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSBzLGwsdDp1bmljaHIoaW50KHRbMF0ubHN0cmlwKHInXDB4JyksMTYpKSkKX2VzY2FwZWRPY3RDaGFyID0gUmVnZXgociJcXDBbMC03XSsiKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcyxsLHQ6dW5pY2hyKGludCh0WzBdWzE6XSw4KSkpCl9zaW5nbGVDaGFyID0gX2VzY2FwZWRQdW5jIHwgX2VzY2FwZWRIZXhDaGFyIHwgX2VzY2FwZWRPY3RDaGFyIHwgV29yZChwcmludGFibGVzLCBleGNsdWRlQ2hhcnM9cidcXScsIGV4YWN0PTEpIHwgUmVnZXgociJcdyIsIHJlLlVOSUNPREUpCl9jaGFyUmFuZ2UgPSBHcm91cChfc2luZ2xlQ2hhciArIFN1cHByZXNzKCItIikgKyBfc2luZ2xlQ2hhcikKX3JlQnJhY2tldEV4cHIgPSBMaXRlcmFsKCJbIikgKyBPcHRpb25hbCgiXiIpLnNldFJlc3VsdHNOYW1lKCJuZWdhdGUiKSArIEdyb3VwKCBPbmVPck1vcmUoIF9jaGFyUmFuZ2UgfCBfc2luZ2xlQ2hhciApICkuc2V0UmVzdWx0c05hbWUoImJvZHkiKSArICJdIgoKZGVmIHNyYW5nZShzKToKICAgIHIiIiIKICAgIEhlbHBlciB0byBlYXNpbHkgZGVmaW5lIHN0cmluZyByYW5nZXMgZm9yIHVzZSBpbiBXb3JkIGNvbnN0cnVjdGlvbi4gIEJvcnJvd3MKICAgIHN5bnRheCBmcm9tIHJlZ2V4cCAnW10nIHN0cmluZyByYW5nZSBkZWZpbml0aW9uczo6CiAgICAgICAgc3JhbmdlKCJbMC05XSIpICAgLT4gIjAxMjM0NTY3ODkiCiAgICAgICAgc3JhbmdlKCJbYS16XSIpICAgLT4gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IgogICAgICAgIHNyYW5nZSgiW2EteiRfXSIpIC0+ICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiRfIgogICAgVGhlIGlucHV0IHN0cmluZyBtdXN0IGJlIGVuY2xvc2VkIGluIFtdJ3MsIGFuZCB0aGUgcmV0dXJuZWQgc3RyaW5nIGlzIHRoZSBleHBhbmRlZAogICAgY2hhcmFjdGVyIHNldCBqb2luZWQgaW50byBhIHNpbmdsZSBzdHJpbmcuCiAgICBUaGUgdmFsdWVzIGVuY2xvc2VkIGluIHRoZSBbXSdzIG1heSBiZToKICAgICAtIGEgc2luZ2xlIGNoYXJhY3RlcgogICAgIC0gYW4gZXNjYXBlZCBjaGFyYWN0ZXIgd2l0aCBhIGxlYWRpbmcgYmFja3NsYXNoIChzdWNoIGFzIEN7XC19IG9yIEN7XF19KQogICAgIC0gYW4gZXNjYXBlZCBoZXggY2hhcmFjdGVyIHdpdGggYSBsZWFkaW5nIEN7J1x4J30gKEN7XHgyMX0sIHdoaWNoIGlzIGEgQ3snISd9IGNoYXJhY3RlcikgCiAgICAgICAgIChDe1wweCMjfSBpcyBhbHNvIHN1cHBvcnRlZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkpIAogICAgIC0gYW4gZXNjYXBlZCBvY3RhbCBjaGFyYWN0ZXIgd2l0aCBhIGxlYWRpbmcgQ3snXDAnfSAoQ3tcMDQxfSwgd2hpY2ggaXMgYSBDeychJ30gY2hhcmFjdGVyKQogICAgIC0gYSByYW5nZSBvZiBhbnkgb2YgdGhlIGFib3ZlLCBzZXBhcmF0ZWQgYnkgYSBkYXNoIChDeydhLXonfSwgZXRjLikKICAgICAtIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgYWJvdmUgKEN7J2FlaW91eSd9LCBDeydhLXpBLVowLTlfJCd9LCBldGMuKQogICAgIiIiCiAgICBfZXhwYW5kZWQgPSBsYW1iZGEgcDogcCBpZiBub3QgaXNpbnN0YW5jZShwLFBhcnNlUmVzdWx0cykgZWxzZSAnJy5qb2luKHVuaWNocihjKSBmb3IgYyBpbiByYW5nZShvcmQocFswXSksb3JkKHBbMV0pKzEpKQogICAgdHJ5OgogICAgICAgIHJldHVybiAiIi5qb2luKF9leHBhbmRlZChwYXJ0KSBmb3IgcGFydCBpbiBfcmVCcmFja2V0RXhwci5wYXJzZVN0cmluZyhzKS5ib2R5KQogICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICByZXR1cm4gIiIKCmRlZiBtYXRjaE9ubHlBdENvbChuKToKICAgICIiIgogICAgSGVscGVyIG1ldGhvZCBmb3IgZGVmaW5pbmcgcGFyc2UgYWN0aW9ucyB0aGF0IHJlcXVpcmUgbWF0Y2hpbmcgYXQgYSBzcGVjaWZpYwogICAgY29sdW1uIGluIHRoZSBpbnB1dCB0ZXh0LgogICAgIiIiCiAgICBkZWYgdmVyaWZ5Q29sKHN0cmcsbG9jbix0b2tzKToKICAgICAgICBpZiBjb2wobG9jbixzdHJnKSAhPSBuOgogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihzdHJnLGxvY24sIm1hdGNoZWQgdG9rZW4gbm90IGF0IGNvbHVtbiAlZCIgJSBuKQogICAgcmV0dXJuIHZlcmlmeUNvbAoKZGVmIHJlcGxhY2VXaXRoKHJlcGxTdHIpOgogICAgIiIiCiAgICBIZWxwZXIgbWV0aG9kIGZvciBjb21tb24gcGFyc2UgYWN0aW9ucyB0aGF0IHNpbXBseSByZXR1cm4gYSBsaXRlcmFsIHZhbHVlLiAgRXNwZWNpYWxseQogICAgdXNlZnVsIHdoZW4gdXNlZCB3aXRoIEN7THt0cmFuc2Zvcm1TdHJpbmc8UGFyc2VyRWxlbWVudC50cmFuc2Zvcm1TdHJpbmc+fSgpfS4KCiAgICBFeGFtcGxlOjoKICAgICAgICBudW0gPSBXb3JkKG51bXMpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0b2tzOiBpbnQodG9rc1swXSkpCiAgICAgICAgbmEgPSBvbmVPZigiTi9BIE5BIikuc2V0UGFyc2VBY3Rpb24ocmVwbGFjZVdpdGgobWF0aC5uYW4pKQogICAgICAgIHRlcm0gPSBuYSB8IG51bQogICAgICAgIAogICAgICAgIE9uZU9yTW9yZSh0ZXJtKS5wYXJzZVN0cmluZygiMzI0IDIzNCBOL0EgMjM0IikgIyAtPiBbMzI0LCAyMzQsIG5hbiwgMjM0XQogICAgIiIiCiAgICByZXR1cm4gbGFtYmRhIHMsbCx0OiBbcmVwbFN0cl0KCmRlZiByZW1vdmVRdW90ZXMocyxsLHQpOgogICAgIiIiCiAgICBIZWxwZXIgcGFyc2UgYWN0aW9uIGZvciByZW1vdmluZyBxdW90YXRpb24gbWFya3MgZnJvbSBwYXJzZWQgcXVvdGVkIHN0cmluZ3MuCgogICAgRXhhbXBsZTo6CiAgICAgICAgIyBieSBkZWZhdWx0LCBxdW90YXRpb24gbWFya3MgYXJlIGluY2x1ZGVkIGluIHBhcnNlZCByZXN1bHRzCiAgICAgICAgcXVvdGVkU3RyaW5nLnBhcnNlU3RyaW5nKCInTm93IGlzIHRoZSBXaW50ZXIgb2Ygb3VyIERpc2NvbnRlbnQnIikgIyAtPiBbIidOb3cgaXMgdGhlIFdpbnRlciBvZiBvdXIgRGlzY29udGVudCciXQoKICAgICAgICAjIHVzZSByZW1vdmVRdW90ZXMgdG8gc3RyaXAgcXVvdGF0aW9uIG1hcmtzIGZyb20gcGFyc2VkIHJlc3VsdHMKICAgICAgICBxdW90ZWRTdHJpbmcuc2V0UGFyc2VBY3Rpb24ocmVtb3ZlUXVvdGVzKQogICAgICAgIHF1b3RlZFN0cmluZy5wYXJzZVN0cmluZygiJ05vdyBpcyB0aGUgV2ludGVyIG9mIG91ciBEaXNjb250ZW50JyIpICMgLT4gWyJOb3cgaXMgdGhlIFdpbnRlciBvZiBvdXIgRGlzY29udGVudCJdCiAgICAiIiIKICAgIHJldHVybiB0WzBdWzE6LTFdCgpkZWYgdG9rZW5NYXAoZnVuYywgKmFyZ3MpOgogICAgIiIiCiAgICBIZWxwZXIgdG8gZGVmaW5lIGEgcGFyc2UgYWN0aW9uIGJ5IG1hcHBpbmcgYSBmdW5jdGlvbiB0byBhbGwgZWxlbWVudHMgb2YgYSBQYXJzZVJlc3VsdHMgbGlzdC5JZiBhbnkgYWRkaXRpb25hbCAKICAgIGFyZ3MgYXJlIHBhc3NlZCwgdGhleSBhcmUgZm9yd2FyZGVkIHRvIHRoZSBnaXZlbiBmdW5jdGlvbiBhcyBhZGRpdGlvbmFsIGFyZ3VtZW50cyBhZnRlcgogICAgdGhlIHRva2VuLCBhcyBpbiBDe2hleF9pbnRlZ2VyID0gV29yZChoZXhudW1zKS5zZXRQYXJzZUFjdGlvbih0b2tlbk1hcChpbnQsIDE2KSl9LCB3aGljaCB3aWxsIGNvbnZlcnQgdGhlCiAgICBwYXJzZWQgZGF0YSB0byBhbiBpbnRlZ2VyIHVzaW5nIGJhc2UgMTYuCgogICAgRXhhbXBsZSAoY29tcGFyZSB0aGUgbGFzdCB0byBleGFtcGxlIGluIEx7UGFyc2VyRWxlbWVudC50cmFuc2Zvcm1TdHJpbmd9OjoKICAgICAgICBoZXhfaW50cyA9IE9uZU9yTW9yZShXb3JkKGhleG51bXMpKS5zZXRQYXJzZUFjdGlvbih0b2tlbk1hcChpbnQsIDE2KSkKICAgICAgICBoZXhfaW50cy5ydW5UZXN0cygnJycKICAgICAgICAgICAgMDAgMTEgMjIgYWEgRkYgMGEgMGQgMWEKICAgICAgICAgICAgJycnKQogICAgICAgIAogICAgICAgIHVwcGVyd29yZCA9IFdvcmQoYWxwaGFzKS5zZXRQYXJzZUFjdGlvbih0b2tlbk1hcChzdHIudXBwZXIpKQogICAgICAgIE9uZU9yTW9yZSh1cHBlcndvcmQpLnJ1blRlc3RzKCcnJwogICAgICAgICAgICBteSBraW5nZG9tIGZvciBhIGhvcnNlCiAgICAgICAgICAgICcnJykKCiAgICAgICAgd2QgPSBXb3JkKGFscGhhcykuc2V0UGFyc2VBY3Rpb24odG9rZW5NYXAoc3RyLnRpdGxlKSkKICAgICAgICBPbmVPck1vcmUod2QpLnNldFBhcnNlQWN0aW9uKCcgJy5qb2luKS5ydW5UZXN0cygnJycKICAgICAgICAgICAgbm93IGlzIHRoZSB3aW50ZXIgb2Ygb3VyIGRpc2NvbnRlbnQgbWFkZSBnbG9yaW91cyBzdW1tZXIgYnkgdGhpcyBzdW4gb2YgeW9yawogICAgICAgICAgICAnJycpCiAgICBwcmludHM6OgogICAgICAgIDAwIDExIDIyIGFhIEZGIDBhIDBkIDFhCiAgICAgICAgWzAsIDE3LCAzNCwgMTcwLCAyNTUsIDEwLCAxMywgMjZdCgogICAgICAgIG15IGtpbmdkb20gZm9yIGEgaG9yc2UKICAgICAgICBbJ01ZJywgJ0tJTkdET00nLCAnRk9SJywgJ0EnLCAnSE9SU0UnXQoKICAgICAgICBub3cgaXMgdGhlIHdpbnRlciBvZiBvdXIgZGlzY29udGVudCBtYWRlIGdsb3Jpb3VzIHN1bW1lciBieSB0aGlzIHN1biBvZiB5b3JrCiAgICAgICAgWydOb3cgSXMgVGhlIFdpbnRlciBPZiBPdXIgRGlzY29udGVudCBNYWRlIEdsb3Jpb3VzIFN1bW1lciBCeSBUaGlzIFN1biBPZiBZb3JrJ10KICAgICIiIgogICAgZGVmIHBhKHMsbCx0KToKICAgICAgICByZXR1cm4gW2Z1bmModG9rbiwgKmFyZ3MpIGZvciB0b2tuIGluIHRdCgogICAgdHJ5OgogICAgICAgIGZ1bmNfbmFtZSA9IGdldGF0dHIoZnVuYywgJ19fbmFtZV9fJywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRhdHRyKGZ1bmMsICdfX2NsYXNzX18nKS5fX25hbWVfXykKICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgZnVuY19uYW1lID0gc3RyKGZ1bmMpCiAgICBwYS5fX25hbWVfXyA9IGZ1bmNfbmFtZQoKICAgIHJldHVybiBwYQoKdXBjYXNlVG9rZW5zID0gdG9rZW5NYXAobGFtYmRhIHQ6IF91c3RyKHQpLnVwcGVyKCkpCiIiIihEZXByZWNhdGVkKSBIZWxwZXIgcGFyc2UgYWN0aW9uIHRvIGNvbnZlcnQgdG9rZW5zIHRvIHVwcGVyIGNhc2UuIERlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgTHtweXBhcnNpbmdfY29tbW9uLnVwY2FzZVRva2Vuc30iIiIKCmRvd25jYXNlVG9rZW5zID0gdG9rZW5NYXAobGFtYmRhIHQ6IF91c3RyKHQpLmxvd2VyKCkpCiIiIihEZXByZWNhdGVkKSBIZWxwZXIgcGFyc2UgYWN0aW9uIHRvIGNvbnZlcnQgdG9rZW5zIHRvIGxvd2VyIGNhc2UuIERlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgTHtweXBhcnNpbmdfY29tbW9uLmRvd25jYXNlVG9rZW5zfSIiIgogICAgCmRlZiBfbWFrZVRhZ3ModGFnU3RyLCB4bWwpOgogICAgIiIiSW50ZXJuYWwgaGVscGVyIHRvIGNvbnN0cnVjdCBvcGVuaW5nIGFuZCBjbG9zaW5nIHRhZyBleHByZXNzaW9ucywgZ2l2ZW4gYSB0YWcgbmFtZSIiIgogICAgaWYgaXNpbnN0YW5jZSh0YWdTdHIsYmFzZXN0cmluZyk6CiAgICAgICAgcmVzbmFtZSA9IHRhZ1N0cgogICAgICAgIHRhZ1N0ciA9IEtleXdvcmQodGFnU3RyLCBjYXNlbGVzcz1ub3QgeG1sKQogICAgZWxzZToKICAgICAgICByZXNuYW1lID0gdGFnU3RyLm5hbWUKCiAgICB0YWdBdHRyTmFtZSA9IFdvcmQoYWxwaGFzLGFscGhhbnVtcysiXy06IikKICAgIGlmICh4bWwpOgogICAgICAgIHRhZ0F0dHJWYWx1ZSA9IGRibFF1b3RlZFN0cmluZy5jb3B5KCkuc2V0UGFyc2VBY3Rpb24oIHJlbW92ZVF1b3RlcyApCiAgICAgICAgb3BlblRhZyA9IFN1cHByZXNzKCI8IikgKyB0YWdTdHIoInRhZyIpICsgXAogICAgICAgICAgICAgICAgRGljdChaZXJvT3JNb3JlKEdyb3VwKCB0YWdBdHRyTmFtZSArIFN1cHByZXNzKCI9IikgKyB0YWdBdHRyVmFsdWUgKSkpICsgXAogICAgICAgICAgICAgICAgT3B0aW9uYWwoIi8iLGRlZmF1bHQ9W0ZhbHNlXSkuc2V0UmVzdWx0c05hbWUoImVtcHR5Iikuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHMsbCx0OnRbMF09PScvJykgKyBTdXBwcmVzcygiPiIpCiAgICBlbHNlOgogICAgICAgIHByaW50YWJsZXNMZXNzUkFicmFjayA9ICIiLmpvaW4oYyBmb3IgYyBpbiBwcmludGFibGVzIGlmIGMgbm90IGluICI+IikKICAgICAgICB0YWdBdHRyVmFsdWUgPSBxdW90ZWRTdHJpbmcuY29weSgpLnNldFBhcnNlQWN0aW9uKCByZW1vdmVRdW90ZXMgKSB8IFdvcmQocHJpbnRhYmxlc0xlc3NSQWJyYWNrKQogICAgICAgIG9wZW5UYWcgPSBTdXBwcmVzcygiPCIpICsgdGFnU3RyKCJ0YWciKSArIFwKICAgICAgICAgICAgICAgIERpY3QoWmVyb09yTW9yZShHcm91cCggdGFnQXR0ck5hbWUuc2V0UGFyc2VBY3Rpb24oZG93bmNhc2VUb2tlbnMpICsgXAogICAgICAgICAgICAgICAgT3B0aW9uYWwoIFN1cHByZXNzKCI9IikgKyB0YWdBdHRyVmFsdWUgKSApKSkgKyBcCiAgICAgICAgICAgICAgICBPcHRpb25hbCgiLyIsZGVmYXVsdD1bRmFsc2VdKS5zZXRSZXN1bHRzTmFtZSgiZW1wdHkiKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcyxsLHQ6dFswXT09Jy8nKSArIFN1cHByZXNzKCI+IikKICAgIGNsb3NlVGFnID0gQ29tYmluZShfTCgiPC8iKSArIHRhZ1N0ciArICI+IikKCiAgICBvcGVuVGFnID0gb3BlblRhZy5zZXRSZXN1bHRzTmFtZSgic3RhcnQiKyIiLmpvaW4ocmVzbmFtZS5yZXBsYWNlKCI6IiwiICIpLnRpdGxlKCkuc3BsaXQoKSkpLnNldE5hbWUoIjwlcz4iICUgcmVzbmFtZSkKICAgIGNsb3NlVGFnID0gY2xvc2VUYWcuc2V0UmVzdWx0c05hbWUoImVuZCIrIiIuam9pbihyZXNuYW1lLnJlcGxhY2UoIjoiLCIgIikudGl0bGUoKS5zcGxpdCgpKSkuc2V0TmFtZSgiPC8lcz4iICUgcmVzbmFtZSkKICAgIG9wZW5UYWcudGFnID0gcmVzbmFtZQogICAgY2xvc2VUYWcudGFnID0gcmVzbmFtZQogICAgcmV0dXJuIG9wZW5UYWcsIGNsb3NlVGFnCgpkZWYgbWFrZUhUTUxUYWdzKHRhZ1N0cik6CiAgICAiIiIKICAgIEhlbHBlciB0byBjb25zdHJ1Y3Qgb3BlbmluZyBhbmQgY2xvc2luZyB0YWcgZXhwcmVzc2lvbnMgZm9yIEhUTUwsIGdpdmVuIGEgdGFnIG5hbWUuIE1hdGNoZXMKICAgIHRhZ3MgaW4gZWl0aGVyIHVwcGVyIG9yIGxvd2VyIGNhc2UsIGF0dHJpYnV0ZXMgd2l0aCBuYW1lc3BhY2VzIGFuZCB3aXRoIHF1b3RlZCBvciB1bnF1b3RlZCB2YWx1ZXMuCgogICAgRXhhbXBsZTo6CiAgICAgICAgdGV4dCA9ICc8dGQ+TW9yZSBpbmZvIGF0IHRoZSA8YSBocmVmPSJodHRwOi8vcHlwYXJzaW5nLndpa2lzcGFjZXMuY29tIj5weXBhcnNpbmc8L2E+IHdpa2kgcGFnZTwvdGQ+JwogICAgICAgICMgbWFrZUhUTUxUYWdzIHJldHVybnMgcHlwYXJzaW5nIGV4cHJlc3Npb25zIGZvciB0aGUgb3BlbmluZyBhbmQgY2xvc2luZyB0YWdzIGFzIGEgMi10dXBsZQogICAgICAgIGEsYV9lbmQgPSBtYWtlSFRNTFRhZ3MoIkEiKQogICAgICAgIGxpbmtfZXhwciA9IGEgKyBTa2lwVG8oYV9lbmQpKCJsaW5rX3RleHQiKSArIGFfZW5kCiAgICAgICAgCiAgICAgICAgZm9yIGxpbmsgaW4gbGlua19leHByLnNlYXJjaFN0cmluZyh0ZXh0KToKICAgICAgICAgICAgIyBhdHRyaWJ1dGVzIGluIHRoZSA8QT4gdGFnIChsaWtlICJocmVmIiBzaG93biBoZXJlKSBhcmUgYWxzbyBhY2Nlc3NpYmxlIGFzIG5hbWVkIHJlc3VsdHMKICAgICAgICAgICAgcHJpbnQobGluay5saW5rX3RleHQsICctPicsIGxpbmsuaHJlZikKICAgIHByaW50czo6CiAgICAgICAgcHlwYXJzaW5nIC0+IGh0dHA6Ly9weXBhcnNpbmcud2lraXNwYWNlcy5jb20KICAgICIiIgogICAgcmV0dXJuIF9tYWtlVGFncyggdGFnU3RyLCBGYWxzZSApCgpkZWYgbWFrZVhNTFRhZ3ModGFnU3RyKToKICAgICIiIgogICAgSGVscGVyIHRvIGNvbnN0cnVjdCBvcGVuaW5nIGFuZCBjbG9zaW5nIHRhZyBleHByZXNzaW9ucyBmb3IgWE1MLCBnaXZlbiBhIHRhZyBuYW1lLiBNYXRjaGVzCiAgICB0YWdzIG9ubHkgaW4gdGhlIGdpdmVuIHVwcGVyL2xvd2VyIGNhc2UuCgogICAgRXhhbXBsZTogc2ltaWxhciB0byBMe21ha2VIVE1MVGFnc30KICAgICIiIgogICAgcmV0dXJuIF9tYWtlVGFncyggdGFnU3RyLCBUcnVlICkKCmRlZiB3aXRoQXR0cmlidXRlKCphcmdzLCoqYXR0ckRpY3QpOgogICAgIiIiCiAgICBIZWxwZXIgdG8gY3JlYXRlIGEgdmFsaWRhdGluZyBwYXJzZSBhY3Rpb24gdG8gYmUgdXNlZCB3aXRoIHN0YXJ0IHRhZ3MgY3JlYXRlZAogICAgd2l0aCBDe0x7bWFrZVhNTFRhZ3N9fSBvciBDe0x7bWFrZUhUTUxUYWdzfX0uIFVzZSBDe3dpdGhBdHRyaWJ1dGV9IHRvIHF1YWxpZnkgYSBzdGFydGluZyB0YWcKICAgIHdpdGggYSByZXF1aXJlZCBhdHRyaWJ1dGUgdmFsdWUsIHRvIGF2b2lkIGZhbHNlIG1hdGNoZXMgb24gY29tbW9uIHRhZ3Mgc3VjaCBhcwogICAgQ3s8VEQ+fSBvciBDezxESVY+fS4KCiAgICBDYWxsIEN7d2l0aEF0dHJpYnV0ZX0gd2l0aCBhIHNlcmllcyBvZiBhdHRyaWJ1dGUgbmFtZXMgYW5kIHZhbHVlcy4gU3BlY2lmeSB0aGUgbGlzdAogICAgb2YgZmlsdGVyIGF0dHJpYnV0ZXMgbmFtZXMgYW5kIHZhbHVlcyBhczoKICAgICAtIGtleXdvcmQgYXJndW1lbnRzLCBhcyBpbiBDeyhhbGlnbj0icmlnaHQiKX0sIG9yCiAgICAgLSBhcyBhbiBleHBsaWNpdCBkaWN0IHdpdGggQ3sqKn0gb3BlcmF0b3IsIHdoZW4gYW4gYXR0cmlidXRlIG5hbWUgaXMgYWxzbyBhIFB5dGhvbgogICAgICAgICAgcmVzZXJ2ZWQgd29yZCwgYXMgaW4gQ3sqKnsiY2xhc3MiOiJDdXN0b21lciIsICJhbGlnbiI6InJpZ2h0In19CiAgICAgLSBhIGxpc3Qgb2YgbmFtZS12YWx1ZSB0dXBsZXMsIGFzIGluICggKCJuczE6Y2xhc3MiLCAiQ3VzdG9tZXIiKSwgKCJuczI6YWxpZ24iLCJyaWdodCIpICkKICAgIEZvciBhdHRyaWJ1dGUgbmFtZXMgd2l0aCBhIG5hbWVzcGFjZSBwcmVmaXgsIHlvdSBtdXN0IHVzZSB0aGUgc2Vjb25kIGZvcm0uICBBdHRyaWJ1dGUKICAgIG5hbWVzIGFyZSBtYXRjaGVkIGluc2Vuc2l0aXZlIHRvIHVwcGVyL2xvd2VyIGNhc2UuCiAgICAgICAKICAgIElmIGp1c3QgdGVzdGluZyBmb3IgQ3tjbGFzc30gKHdpdGggb3Igd2l0aG91dCBhIG5hbWVzcGFjZSksIHVzZSBDe0x7d2l0aENsYXNzfX0uCgogICAgVG8gdmVyaWZ5IHRoYXQgdGhlIGF0dHJpYnV0ZSBleGlzdHMsIGJ1dCB3aXRob3V0IHNwZWNpZnlpbmcgYSB2YWx1ZSwgcGFzcwogICAgQ3t3aXRoQXR0cmlidXRlLkFOWV9WQUxVRX0gYXMgdGhlIHZhbHVlLgoKICAgIEV4YW1wbGU6OgogICAgICAgIGh0bWwgPSAnJycKICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgU29tZSB0ZXh0CiAgICAgICAgICAgIDxkaXYgdHlwZT0iZ3JpZCI+MSA0IDAgMSAwPC9kaXY+CiAgICAgICAgICAgIDxkaXYgdHlwZT0iZ3JhcGgiPjEsMyAyLDMgMSwxPC9kaXY+CiAgICAgICAgICAgIDxkaXY+dGhpcyBoYXMgbm8gdHlwZTwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIAogICAgICAgICcnJwogICAgICAgIGRpdixkaXZfZW5kID0gbWFrZUhUTUxUYWdzKCJkaXYiKQoKICAgICAgICAjIG9ubHkgbWF0Y2ggZGl2IHRhZyBoYXZpbmcgYSB0eXBlIGF0dHJpYnV0ZSB3aXRoIHZhbHVlICJncmlkIgogICAgICAgIGRpdl9ncmlkID0gZGl2KCkuc2V0UGFyc2VBY3Rpb24od2l0aEF0dHJpYnV0ZSh0eXBlPSJncmlkIikpCiAgICAgICAgZ3JpZF9leHByID0gZGl2X2dyaWQgKyBTa2lwVG8oZGl2IHwgZGl2X2VuZCkoImJvZHkiKQogICAgICAgIGZvciBncmlkX2hlYWRlciBpbiBncmlkX2V4cHIuc2VhcmNoU3RyaW5nKGh0bWwpOgogICAgICAgICAgICBwcmludChncmlkX2hlYWRlci5ib2R5KQogICAgICAgIAogICAgICAgICMgY29uc3RydWN0IGEgbWF0Y2ggd2l0aCBhbnkgZGl2IHRhZyBoYXZpbmcgYSB0eXBlIGF0dHJpYnV0ZSwgcmVnYXJkbGVzcyBvZiB0aGUgdmFsdWUKICAgICAgICBkaXZfYW55X3R5cGUgPSBkaXYoKS5zZXRQYXJzZUFjdGlvbih3aXRoQXR0cmlidXRlKHR5cGU9d2l0aEF0dHJpYnV0ZS5BTllfVkFMVUUpKQogICAgICAgIGRpdl9leHByID0gZGl2X2FueV90eXBlICsgU2tpcFRvKGRpdiB8IGRpdl9lbmQpKCJib2R5IikKICAgICAgICBmb3IgZGl2X2hlYWRlciBpbiBkaXZfZXhwci5zZWFyY2hTdHJpbmcoaHRtbCk6CiAgICAgICAgICAgIHByaW50KGRpdl9oZWFkZXIuYm9keSkKICAgIHByaW50czo6CiAgICAgICAgMSA0IDAgMSAwCgogICAgICAgIDEgNCAwIDEgMAogICAgICAgIDEsMyAyLDMgMSwxCiAgICAiIiIKICAgIGlmIGFyZ3M6CiAgICAgICAgYXR0cnMgPSBhcmdzWzpdCiAgICBlbHNlOgogICAgICAgIGF0dHJzID0gYXR0ckRpY3QuaXRlbXMoKQogICAgYXR0cnMgPSBbKGssdikgZm9yIGssdiBpbiBhdHRyc10KICAgIGRlZiBwYShzLGwsdG9rZW5zKToKICAgICAgICBmb3IgYXR0ck5hbWUsYXR0clZhbHVlIGluIGF0dHJzOgogICAgICAgICAgICBpZiBhdHRyTmFtZSBub3QgaW4gdG9rZW5zOgogICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24ocyxsLCJubyBtYXRjaGluZyBhdHRyaWJ1dGUgIiArIGF0dHJOYW1lKQogICAgICAgICAgICBpZiBhdHRyVmFsdWUgIT0gd2l0aEF0dHJpYnV0ZS5BTllfVkFMVUUgYW5kIHRva2Vuc1thdHRyTmFtZV0gIT0gYXR0clZhbHVlOgogICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24ocyxsLCJhdHRyaWJ1dGUgJyVzJyBoYXMgdmFsdWUgJyVzJywgbXVzdCBiZSAnJXMnIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF0dHJOYW1lLCB0b2tlbnNbYXR0ck5hbWVdLCBhdHRyVmFsdWUpKQogICAgcmV0dXJuIHBhCndpdGhBdHRyaWJ1dGUuQU5ZX1ZBTFVFID0gb2JqZWN0KCkKCmRlZiB3aXRoQ2xhc3MoY2xhc3NuYW1lLCBuYW1lc3BhY2U9JycpOgogICAgIiIiCiAgICBTaW1wbGlmaWVkIHZlcnNpb24gb2YgQ3tMe3dpdGhBdHRyaWJ1dGV9fSB3aGVuIG1hdGNoaW5nIG9uIGEgZGl2IGNsYXNzIC0gbWFkZQogICAgZGlmZmljdWx0IGJlY2F1c2UgQ3tjbGFzc30gaXMgYSByZXNlcnZlZCB3b3JkIGluIFB5dGhvbi4KCiAgICBFeGFtcGxlOjoKICAgICAgICBodG1sID0gJycnCiAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgIFNvbWUgdGV4dAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJncmlkIj4xIDQgMCAxIDA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZ3JhcGgiPjEsMyAyLDMgMSwxPC9kaXY+CiAgICAgICAgICAgIDxkaXY+dGhpcyAmbHQ7ZGl2Jmd0OyBoYXMgbm8gY2xhc3M8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAKICAgICAgICAnJycKICAgICAgICBkaXYsZGl2X2VuZCA9IG1ha2VIVE1MVGFncygiZGl2IikKICAgICAgICBkaXZfZ3JpZCA9IGRpdigpLnNldFBhcnNlQWN0aW9uKHdpdGhDbGFzcygiZ3JpZCIpKQogICAgICAgIAogICAgICAgIGdyaWRfZXhwciA9IGRpdl9ncmlkICsgU2tpcFRvKGRpdiB8IGRpdl9lbmQpKCJib2R5IikKICAgICAgICBmb3IgZ3JpZF9oZWFkZXIgaW4gZ3JpZF9leHByLnNlYXJjaFN0cmluZyhodG1sKToKICAgICAgICAgICAgcHJpbnQoZ3JpZF9oZWFkZXIuYm9keSkKICAgICAgICAKICAgICAgICBkaXZfYW55X3R5cGUgPSBkaXYoKS5zZXRQYXJzZUFjdGlvbih3aXRoQ2xhc3Mod2l0aEF0dHJpYnV0ZS5BTllfVkFMVUUpKQogICAgICAgIGRpdl9leHByID0gZGl2X2FueV90eXBlICsgU2tpcFRvKGRpdiB8IGRpdl9lbmQpKCJib2R5IikKICAgICAgICBmb3IgZGl2X2hlYWRlciBpbiBkaXZfZXhwci5zZWFyY2hTdHJpbmcoaHRtbCk6CiAgICAgICAgICAgIHByaW50KGRpdl9oZWFkZXIuYm9keSkKICAgIHByaW50czo6CiAgICAgICAgMSA0IDAgMSAwCgogICAgICAgIDEgNCAwIDEgMAogICAgICAgIDEsMyAyLDMgMSwxCiAgICAiIiIKICAgIGNsYXNzYXR0ciA9ICIlczpjbGFzcyIgJSBuYW1lc3BhY2UgaWYgbmFtZXNwYWNlIGVsc2UgImNsYXNzIgogICAgcmV0dXJuIHdpdGhBdHRyaWJ1dGUoKip7Y2xhc3NhdHRyIDogY2xhc3NuYW1lfSkgICAgICAgIAoKb3BBc3NvYyA9IF9Db25zdGFudHMoKQpvcEFzc29jLkxFRlQgPSBvYmplY3QoKQpvcEFzc29jLlJJR0hUID0gb2JqZWN0KCkKCmRlZiBpbmZpeE5vdGF0aW9uKCBiYXNlRXhwciwgb3BMaXN0LCBscGFyPVN1cHByZXNzKCcoJyksIHJwYXI9U3VwcHJlc3MoJyknKSApOgogICAgIiIiCiAgICBIZWxwZXIgbWV0aG9kIGZvciBjb25zdHJ1Y3RpbmcgZ3JhbW1hcnMgb2YgZXhwcmVzc2lvbnMgbWFkZSB1cCBvZgogICAgb3BlcmF0b3JzIHdvcmtpbmcgaW4gYSBwcmVjZWRlbmNlIGhpZXJhcmNoeS4gIE9wZXJhdG9ycyBtYXkgYmUgdW5hcnkgb3IKICAgIGJpbmFyeSwgbGVmdC0gb3IgcmlnaHQtYXNzb2NpYXRpdmUuICBQYXJzZSBhY3Rpb25zIGNhbiBhbHNvIGJlIGF0dGFjaGVkCiAgICB0byBvcGVyYXRvciBleHByZXNzaW9ucy4gVGhlIGdlbmVyYXRlZCBwYXJzZXIgd2lsbCBhbHNvIHJlY29nbml6ZSB0aGUgdXNlIAogICAgb2YgcGFyZW50aGVzZXMgdG8gb3ZlcnJpZGUgb3BlcmF0b3IgcHJlY2VkZW5jZXMgKHNlZSBleGFtcGxlIGJlbG93KS4KICAgIAogICAgTm90ZTogaWYgeW91IGRlZmluZSBhIGRlZXAgb3BlcmF0b3IgbGlzdCwgeW91IG1heSBzZWUgcGVyZm9ybWFuY2UgaXNzdWVzCiAgICB3aGVuIHVzaW5nIGluZml4Tm90YXRpb24uIFNlZSBMe1BhcnNlckVsZW1lbnQuZW5hYmxlUGFja3JhdH0gZm9yIGEKICAgIG1lY2hhbmlzbSB0byBwb3RlbnRpYWxseSBpbXByb3ZlIHlvdXIgcGFyc2VyIHBlcmZvcm1hbmNlLgoKICAgIFBhcmFtZXRlcnM6CiAgICAgLSBiYXNlRXhwciAtIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSBtb3N0IGJhc2ljIGVsZW1lbnQgZm9yIHRoZSBuZXN0ZWQKICAgICAtIG9wTGlzdCAtIGxpc3Qgb2YgdHVwbGVzLCBvbmUgZm9yIGVhY2ggb3BlcmF0b3IgcHJlY2VkZW5jZSBsZXZlbCBpbiB0aGUKICAgICAgZXhwcmVzc2lvbiBncmFtbWFyOyBlYWNoIHR1cGxlIGlzIG9mIHRoZSBmb3JtCiAgICAgIChvcEV4cHIsIG51bVRlcm1zLCByaWdodExlZnRBc3NvYywgcGFyc2VBY3Rpb24pLCB3aGVyZToKICAgICAgIC0gb3BFeHByIGlzIHRoZSBweXBhcnNpbmcgZXhwcmVzc2lvbiBmb3IgdGhlIG9wZXJhdG9yOwogICAgICAgICAgbWF5IGFsc28gYmUgYSBzdHJpbmcsIHdoaWNoIHdpbGwgYmUgY29udmVydGVkIHRvIGEgTGl0ZXJhbDsKICAgICAgICAgIGlmIG51bVRlcm1zIGlzIDMsIG9wRXhwciBpcyBhIHR1cGxlIG9mIHR3byBleHByZXNzaW9ucywgZm9yIHRoZQogICAgICAgICAgdHdvIG9wZXJhdG9ycyBzZXBhcmF0aW5nIHRoZSAzIHRlcm1zCiAgICAgICAtIG51bVRlcm1zIGlzIHRoZSBudW1iZXIgb2YgdGVybXMgZm9yIHRoaXMgb3BlcmF0b3IgKG11c3QKICAgICAgICAgIGJlIDEsIDIsIG9yIDMpCiAgICAgICAtIHJpZ2h0TGVmdEFzc29jIGlzIHRoZSBpbmRpY2F0b3Igd2hldGhlciB0aGUgb3BlcmF0b3IgaXMKICAgICAgICAgIHJpZ2h0IG9yIGxlZnQgYXNzb2NpYXRpdmUsIHVzaW5nIHRoZSBweXBhcnNpbmctZGVmaW5lZAogICAgICAgICAgY29uc3RhbnRzIEN7b3BBc3NvYy5SSUdIVH0gYW5kIEN7b3BBc3NvYy5MRUZUfS4KICAgICAgIC0gcGFyc2VBY3Rpb24gaXMgdGhlIHBhcnNlIGFjdGlvbiB0byBiZSBhc3NvY2lhdGVkIHdpdGgKICAgICAgICAgIGV4cHJlc3Npb25zIG1hdGNoaW5nIHRoaXMgb3BlcmF0b3IgZXhwcmVzc2lvbiAodGhlCiAgICAgICAgICBwYXJzZSBhY3Rpb24gdHVwbGUgbWVtYmVyIG1heSBiZSBvbWl0dGVkKQogICAgIC0gbHBhciAtIGV4cHJlc3Npb24gZm9yIG1hdGNoaW5nIGxlZnQtcGFyZW50aGVzZXMgKGRlZmF1bHQ9Q3tTdXBwcmVzcygnKCcpfSkKICAgICAtIHJwYXIgLSBleHByZXNzaW9uIGZvciBtYXRjaGluZyByaWdodC1wYXJlbnRoZXNlcyAoZGVmYXVsdD1De1N1cHByZXNzKCcpJyl9KQoKICAgIEV4YW1wbGU6OgogICAgICAgICMgc2ltcGxlIGV4YW1wbGUgb2YgZm91ci1mdW5jdGlvbiBhcml0aG1ldGljIHdpdGggaW50cyBhbmQgdmFyaWFibGUgbmFtZXMKICAgICAgICBpbnRlZ2VyID0gcHlwYXJzaW5nX2NvbW1vbi5zaWduZWRfaW50ZWdlcgogICAgICAgIHZhcm5hbWUgPSBweXBhcnNpbmdfY29tbW9uLmlkZW50aWZpZXIgCiAgICAgICAgCiAgICAgICAgYXJpdGhfZXhwciA9IGluZml4Tm90YXRpb24oaW50ZWdlciB8IHZhcm5hbWUsCiAgICAgICAgICAgIFsKICAgICAgICAgICAgKCctJywgMSwgb3BBc3NvYy5SSUdIVCksCiAgICAgICAgICAgIChvbmVPZignKiAvJyksIDIsIG9wQXNzb2MuTEVGVCksCiAgICAgICAgICAgIChvbmVPZignKyAtJyksIDIsIG9wQXNzb2MuTEVGVCksCiAgICAgICAgICAgIF0pCiAgICAgICAgCiAgICAgICAgYXJpdGhfZXhwci5ydW5UZXN0cygnJycKICAgICAgICAgICAgNSszKjYKICAgICAgICAgICAgKDUrMykqNgogICAgICAgICAgICAtMi0tMTEKICAgICAgICAgICAgJycnLCBmdWxsRHVtcD1GYWxzZSkKICAgIHByaW50czo6CiAgICAgICAgNSszKjYKICAgICAgICBbWzUsICcrJywgWzMsICcqJywgNl1dXQoKICAgICAgICAoNSszKSo2CiAgICAgICAgW1tbNSwgJysnLCAzXSwgJyonLCA2XV0KCiAgICAgICAgLTItLTExCiAgICAgICAgW1tbJy0nLCAyXSwgJy0nLCBbJy0nLCAxMV1dXQogICAgIiIiCiAgICByZXQgPSBGb3J3YXJkKCkKICAgIGxhc3RFeHByID0gYmFzZUV4cHIgfCAoIGxwYXIgKyByZXQgKyBycGFyICkKICAgIGZvciBpLG9wZXJEZWYgaW4gZW51bWVyYXRlKG9wTGlzdCk6CiAgICAgICAgb3BFeHByLGFyaXR5LHJpZ2h0TGVmdEFzc29jLHBhID0gKG9wZXJEZWYgKyAoTm9uZSwpKVs6NF0KICAgICAgICB0ZXJtTmFtZSA9ICIlcyB0ZXJtIiAlIG9wRXhwciBpZiBhcml0eSA8IDMgZWxzZSAiJXMlcyB0ZXJtIiAlIG9wRXhwcgogICAgICAgIGlmIGFyaXR5ID09IDM6CiAgICAgICAgICAgIGlmIG9wRXhwciBpcyBOb25lIG9yIGxlbihvcEV4cHIpICE9IDI6CiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJpZiBudW10ZXJtcz0zLCBvcEV4cHIgbXVzdCBiZSBhIHR1cGxlIG9yIGxpc3Qgb2YgdHdvIGV4cHJlc3Npb25zIikKICAgICAgICAgICAgb3BFeHByMSwgb3BFeHByMiA9IG9wRXhwcgogICAgICAgIHRoaXNFeHByID0gRm9yd2FyZCgpLnNldE5hbWUodGVybU5hbWUpCiAgICAgICAgaWYgcmlnaHRMZWZ0QXNzb2MgPT0gb3BBc3NvYy5MRUZUOgogICAgICAgICAgICBpZiBhcml0eSA9PSAxOgogICAgICAgICAgICAgICAgbWF0Y2hFeHByID0gRm9sbG93ZWRCeShsYXN0RXhwciArIG9wRXhwcikgKyBHcm91cCggbGFzdEV4cHIgKyBPbmVPck1vcmUoIG9wRXhwciApICkKICAgICAgICAgICAgZWxpZiBhcml0eSA9PSAyOgogICAgICAgICAgICAgICAgaWYgb3BFeHByIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgIG1hdGNoRXhwciA9IEZvbGxvd2VkQnkobGFzdEV4cHIgKyBvcEV4cHIgKyBsYXN0RXhwcikgKyBHcm91cCggbGFzdEV4cHIgKyBPbmVPck1vcmUoIG9wRXhwciArIGxhc3RFeHByICkgKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBtYXRjaEV4cHIgPSBGb2xsb3dlZEJ5KGxhc3RFeHByK2xhc3RFeHByKSArIEdyb3VwKCBsYXN0RXhwciArIE9uZU9yTW9yZShsYXN0RXhwcikgKQogICAgICAgICAgICBlbGlmIGFyaXR5ID09IDM6CiAgICAgICAgICAgICAgICBtYXRjaEV4cHIgPSBGb2xsb3dlZEJ5KGxhc3RFeHByICsgb3BFeHByMSArIGxhc3RFeHByICsgb3BFeHByMiArIGxhc3RFeHByKSArIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyb3VwKCBsYXN0RXhwciArIG9wRXhwcjEgKyBsYXN0RXhwciArIG9wRXhwcjIgKyBsYXN0RXhwciApCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJvcGVyYXRvciBtdXN0IGJlIHVuYXJ5ICgxKSwgYmluYXJ5ICgyKSwgb3IgdGVybmFyeSAoMykiKQogICAgICAgIGVsaWYgcmlnaHRMZWZ0QXNzb2MgPT0gb3BBc3NvYy5SSUdIVDoKICAgICAgICAgICAgaWYgYXJpdHkgPT0gMToKICAgICAgICAgICAgICAgICMgdHJ5IHRvIGF2b2lkIExSIHdpdGggdGhpcyBleHRyYSB0ZXN0CiAgICAgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvcEV4cHIsIE9wdGlvbmFsKToKICAgICAgICAgICAgICAgICAgICBvcEV4cHIgPSBPcHRpb25hbChvcEV4cHIpCiAgICAgICAgICAgICAgICBtYXRjaEV4cHIgPSBGb2xsb3dlZEJ5KG9wRXhwci5leHByICsgdGhpc0V4cHIpICsgR3JvdXAoIG9wRXhwciArIHRoaXNFeHByICkKICAgICAgICAgICAgZWxpZiBhcml0eSA9PSAyOgogICAgICAgICAgICAgICAgaWYgb3BFeHByIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgIG1hdGNoRXhwciA9IEZvbGxvd2VkQnkobGFzdEV4cHIgKyBvcEV4cHIgKyB0aGlzRXhwcikgKyBHcm91cCggbGFzdEV4cHIgKyBPbmVPck1vcmUoIG9wRXhwciArIHRoaXNFeHByICkgKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBtYXRjaEV4cHIgPSBGb2xsb3dlZEJ5KGxhc3RFeHByICsgdGhpc0V4cHIpICsgR3JvdXAoIGxhc3RFeHByICsgT25lT3JNb3JlKCB0aGlzRXhwciApICkKICAgICAgICAgICAgZWxpZiBhcml0eSA9PSAzOgogICAgICAgICAgICAgICAgbWF0Y2hFeHByID0gRm9sbG93ZWRCeShsYXN0RXhwciArIG9wRXhwcjEgKyB0aGlzRXhwciArIG9wRXhwcjIgKyB0aGlzRXhwcikgKyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcm91cCggbGFzdEV4cHIgKyBvcEV4cHIxICsgdGhpc0V4cHIgKyBvcEV4cHIyICsgdGhpc0V4cHIgKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigib3BlcmF0b3IgbXVzdCBiZSB1bmFyeSAoMSksIGJpbmFyeSAoMiksIG9yIHRlcm5hcnkgKDMpIikKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJvcGVyYXRvciBtdXN0IGluZGljYXRlIHJpZ2h0IG9yIGxlZnQgYXNzb2NpYXRpdml0eSIpCiAgICAgICAgaWYgcGE6CiAgICAgICAgICAgIG1hdGNoRXhwci5zZXRQYXJzZUFjdGlvbiggcGEgKQogICAgICAgIHRoaXNFeHByIDw8PSAoIG1hdGNoRXhwci5zZXROYW1lKHRlcm1OYW1lKSB8IGxhc3RFeHByICkKICAgICAgICBsYXN0RXhwciA9IHRoaXNFeHByCiAgICByZXQgPDw9IGxhc3RFeHByCiAgICByZXR1cm4gcmV0CgpvcGVyYXRvclByZWNlZGVuY2UgPSBpbmZpeE5vdGF0aW9uCiIiIihEZXByZWNhdGVkKSBGb3JtZXIgbmFtZSBvZiBDe0x7aW5maXhOb3RhdGlvbn19LCB3aWxsIGJlIGRyb3BwZWQgaW4gYSBmdXR1cmUgcmVsZWFzZS4iIiIKCmRibFF1b3RlZFN0cmluZyA9IENvbWJpbmUoUmVnZXgociciKD86W14iXG5cclxcXXwoPzoiIil8KD86XFwoPzpbXnhdfHhbMC05YS1mQS1GXSspKSkqJykrJyInKS5zZXROYW1lKCJzdHJpbmcgZW5jbG9zZWQgaW4gZG91YmxlIHF1b3RlcyIpCnNnbFF1b3RlZFN0cmluZyA9IENvbWJpbmUoUmVnZXgociInKD86W14nXG5cclxcXXwoPzonJyl8KD86XFwoPzpbXnhdfHhbMC05YS1mQS1GXSspKSkqIikrIiciKS5zZXROYW1lKCJzdHJpbmcgZW5jbG9zZWQgaW4gc2luZ2xlIHF1b3RlcyIpCnF1b3RlZFN0cmluZyA9IENvbWJpbmUoUmVnZXgociciKD86W14iXG5cclxcXXwoPzoiIil8KD86XFwoPzpbXnhdfHhbMC05YS1mQS1GXSspKSkqJykrJyInfAogICAgICAgICAgICAgICAgICAgICAgIFJlZ2V4KHIiJyg/OlteJ1xuXHJcXF18KD86JycpfCg/OlxcKD86W154XXx4WzAtOWEtZkEtRl0rKSkpKiIpKyInIikuc2V0TmFtZSgicXVvdGVkU3RyaW5nIHVzaW5nIHNpbmdsZSBvciBkb3VibGUgcXVvdGVzIikKdW5pY29kZVN0cmluZyA9IENvbWJpbmUoX0woJ3UnKSArIHF1b3RlZFN0cmluZy5jb3B5KCkpLnNldE5hbWUoInVuaWNvZGUgc3RyaW5nIGxpdGVyYWwiKQoKZGVmIG5lc3RlZEV4cHIob3BlbmVyPSIoIiwgY2xvc2VyPSIpIiwgY29udGVudD1Ob25lLCBpZ25vcmVFeHByPXF1b3RlZFN0cmluZy5jb3B5KCkpOgogICAgIiIiCiAgICBIZWxwZXIgbWV0aG9kIGZvciBkZWZpbmluZyBuZXN0ZWQgbGlzdHMgZW5jbG9zZWQgaW4gb3BlbmluZyBhbmQgY2xvc2luZwogICAgZGVsaW1pdGVycyAoIigiIGFuZCAiKSIgYXJlIHRoZSBkZWZhdWx0KS4KCiAgICBQYXJhbWV0ZXJzOgogICAgIC0gb3BlbmVyIC0gb3BlbmluZyBjaGFyYWN0ZXIgZm9yIGEgbmVzdGVkIGxpc3QgKGRlZmF1bHQ9Q3siKCJ9KTsgY2FuIGFsc28gYmUgYSBweXBhcnNpbmcgZXhwcmVzc2lvbgogICAgIC0gY2xvc2VyIC0gY2xvc2luZyBjaGFyYWN0ZXIgZm9yIGEgbmVzdGVkIGxpc3QgKGRlZmF1bHQ9Q3siKSJ9KTsgY2FuIGFsc28gYmUgYSBweXBhcnNpbmcgZXhwcmVzc2lvbgogICAgIC0gY29udGVudCAtIGV4cHJlc3Npb24gZm9yIGl0ZW1zIHdpdGhpbiB0aGUgbmVzdGVkIGxpc3RzIChkZWZhdWx0PUN7Tm9uZX0pCiAgICAgLSBpZ25vcmVFeHByIC0gZXhwcmVzc2lvbiBmb3IgaWdub3Jpbmcgb3BlbmluZyBhbmQgY2xvc2luZyBkZWxpbWl0ZXJzIChkZWZhdWx0PUN7cXVvdGVkU3RyaW5nfSkKCiAgICBJZiBhbiBleHByZXNzaW9uIGlzIG5vdCBwcm92aWRlZCBmb3IgdGhlIGNvbnRlbnQgYXJndW1lbnQsIHRoZSBuZXN0ZWQKICAgIGV4cHJlc3Npb24gd2lsbCBjYXB0dXJlIGFsbCB3aGl0ZXNwYWNlLWRlbGltaXRlZCBjb250ZW50IGJldHdlZW4gZGVsaW1pdGVycwogICAgYXMgYSBsaXN0IG9mIHNlcGFyYXRlIHZhbHVlcy4KCiAgICBVc2UgdGhlIEN7aWdub3JlRXhwcn0gYXJndW1lbnQgdG8gZGVmaW5lIGV4cHJlc3Npb25zIHRoYXQgbWF5IGNvbnRhaW4KICAgIG9wZW5pbmcgb3IgY2xvc2luZyBjaGFyYWN0ZXJzIHRoYXQgc2hvdWxkIG5vdCBiZSB0cmVhdGVkIGFzIG9wZW5pbmcKICAgIG9yIGNsb3NpbmcgY2hhcmFjdGVycyBmb3IgbmVzdGluZywgc3VjaCBhcyBxdW90ZWRTdHJpbmcgb3IgYSBjb21tZW50CiAgICBleHByZXNzaW9uLiAgU3BlY2lmeSBtdWx0aXBsZSBleHByZXNzaW9ucyB1c2luZyBhbiBDe0x7T3J9fSBvciBDe0x7TWF0Y2hGaXJzdH19LgogICAgVGhlIGRlZmF1bHQgaXMgTHtxdW90ZWRTdHJpbmd9LCBidXQgaWYgbm8gZXhwcmVzc2lvbnMgYXJlIHRvIGJlIGlnbm9yZWQsCiAgICB0aGVuIHBhc3MgQ3tOb25lfSBmb3IgdGhpcyBhcmd1bWVudC4KCiAgICBFeGFtcGxlOjoKICAgICAgICBkYXRhX3R5cGUgPSBvbmVPZigidm9pZCBpbnQgc2hvcnQgbG9uZyBjaGFyIGZsb2F0IGRvdWJsZSIpCiAgICAgICAgZGVjbF9kYXRhX3R5cGUgPSBDb21iaW5lKGRhdGFfdHlwZSArIE9wdGlvbmFsKFdvcmQoJyonKSkpCiAgICAgICAgaWRlbnQgPSBXb3JkKGFscGhhcysnXycsIGFscGhhbnVtcysnXycpCiAgICAgICAgbnVtYmVyID0gcHlwYXJzaW5nX2NvbW1vbi5udW1iZXIKICAgICAgICBhcmcgPSBHcm91cChkZWNsX2RhdGFfdHlwZSArIGlkZW50KQogICAgICAgIExQQVIsUlBBUiA9IG1hcChTdXBwcmVzcywgIigpIikKCiAgICAgICAgY29kZV9ib2R5ID0gbmVzdGVkRXhwcigneycsICd9JywgaWdub3JlRXhwcj0ocXVvdGVkU3RyaW5nIHwgY1N0eWxlQ29tbWVudCkpCgogICAgICAgIGNfZnVuY3Rpb24gPSAoZGVjbF9kYXRhX3R5cGUoInR5cGUiKSAKICAgICAgICAgICAgICAgICAgICAgICsgaWRlbnQoIm5hbWUiKQogICAgICAgICAgICAgICAgICAgICAgKyBMUEFSICsgT3B0aW9uYWwoZGVsaW1pdGVkTGlzdChhcmcpLCBbXSkoImFyZ3MiKSArIFJQQVIgCiAgICAgICAgICAgICAgICAgICAgICArIGNvZGVfYm9keSgiYm9keSIpKQogICAgICAgIGNfZnVuY3Rpb24uaWdub3JlKGNTdHlsZUNvbW1lbnQpCiAgICAgICAgCiAgICAgICAgc291cmNlX2NvZGUgPSAnJycKICAgICAgICAgICAgaW50IGlzX29kZChpbnQgeCkgeyAKICAgICAgICAgICAgICAgIHJldHVybiAoeCUyKTsgCiAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICBpbnQgZGVjX3RvX2hleChjaGFyIGhjaGFyKSB7IAogICAgICAgICAgICAgICAgaWYgKGhjaGFyID49ICcwJyAmJiBoY2hhciA8PSAnOScpIHsgCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChvcmQoaGNoYXIpLW9yZCgnMCcpKTsgCiAgICAgICAgICAgICAgICB9IGVsc2UgeyAKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDEwK29yZChoY2hhciktb3JkKCdBJykpOwogICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgfQogICAgICAgICcnJwogICAgICAgIGZvciBmdW5jIGluIGNfZnVuY3Rpb24uc2VhcmNoU3RyaW5nKHNvdXJjZV9jb2RlKToKICAgICAgICAgICAgcHJpbnQoIiUobmFtZSlzICglKHR5cGUpcykgYXJnczogJShhcmdzKXMiICUgZnVuYykKCiAgICBwcmludHM6OgogICAgICAgIGlzX29kZCAoaW50KSBhcmdzOiBbWydpbnQnLCAneCddXQogICAgICAgIGRlY190b19oZXggKGludCkgYXJnczogW1snY2hhcicsICdoY2hhciddXQogICAgIiIiCiAgICBpZiBvcGVuZXIgPT0gY2xvc2VyOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm9wZW5pbmcgYW5kIGNsb3Npbmcgc3RyaW5ncyBjYW5ub3QgYmUgdGhlIHNhbWUiKQogICAgaWYgY29udGVudCBpcyBOb25lOgogICAgICAgIGlmIGlzaW5zdGFuY2Uob3BlbmVyLGJhc2VzdHJpbmcpIGFuZCBpc2luc3RhbmNlKGNsb3NlcixiYXNlc3RyaW5nKToKICAgICAgICAgICAgaWYgbGVuKG9wZW5lcikgPT0gMSBhbmQgbGVuKGNsb3Nlcik9PTE6CiAgICAgICAgICAgICAgICBpZiBpZ25vcmVFeHByIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSAoQ29tYmluZShPbmVPck1vcmUofmlnbm9yZUV4cHIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyc05vdEluKG9wZW5lcitjbG9zZXIrUGFyc2VyRWxlbWVudC5ERUZBVUxUX1dISVRFX0NIQVJTLGV4YWN0PTEpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHQ6dFswXS5zdHJpcCgpKSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IChlbXB0eS5jb3B5KCkrQ2hhcnNOb3RJbihvcGVuZXIrY2xvc2VyK1BhcnNlckVsZW1lbnQuREVGQVVMVF9XSElURV9DSEFSUwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHQ6dFswXS5zdHJpcCgpKSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGlmIGlnbm9yZUV4cHIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IChDb21iaW5lKE9uZU9yTW9yZSh+aWdub3JlRXhwciArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+TGl0ZXJhbChvcGVuZXIpICsgfkxpdGVyYWwoY2xvc2VyKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJzTm90SW4oUGFyc2VyRWxlbWVudC5ERUZBVUxUX1dISVRFX0NIQVJTLGV4YWN0PTEpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHQ6dFswXS5zdHJpcCgpKSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IChDb21iaW5lKE9uZU9yTW9yZSh+TGl0ZXJhbChvcGVuZXIpICsgfkxpdGVyYWwoY2xvc2VyKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJzTm90SW4oUGFyc2VyRWxlbWVudC5ERUZBVUxUX1dISVRFX0NIQVJTLGV4YWN0PTEpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHQ6dFswXS5zdHJpcCgpKSkKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJvcGVuaW5nIGFuZCBjbG9zaW5nIGFyZ3VtZW50cyBtdXN0IGJlIHN0cmluZ3MgaWYgbm8gY29udGVudCBleHByZXNzaW9uIGlzIGdpdmVuIikKICAgIHJldCA9IEZvcndhcmQoKQogICAgaWYgaWdub3JlRXhwciBpcyBub3QgTm9uZToKICAgICAgICByZXQgPDw9IEdyb3VwKCBTdXBwcmVzcyhvcGVuZXIpICsgWmVyb09yTW9yZSggaWdub3JlRXhwciB8IHJldCB8IGNvbnRlbnQgKSArIFN1cHByZXNzKGNsb3NlcikgKQogICAgZWxzZToKICAgICAgICByZXQgPDw9IEdyb3VwKCBTdXBwcmVzcyhvcGVuZXIpICsgWmVyb09yTW9yZSggcmV0IHwgY29udGVudCApICArIFN1cHByZXNzKGNsb3NlcikgKQogICAgcmV0LnNldE5hbWUoJ25lc3RlZCAlcyVzIGV4cHJlc3Npb24nICUgKG9wZW5lcixjbG9zZXIpKQogICAgcmV0dXJuIHJldAoKZGVmIGluZGVudGVkQmxvY2soYmxvY2tTdGF0ZW1lbnRFeHByLCBpbmRlbnRTdGFjaywgaW5kZW50PVRydWUpOgogICAgIiIiCiAgICBIZWxwZXIgbWV0aG9kIGZvciBkZWZpbmluZyBzcGFjZS1kZWxpbWl0ZWQgaW5kZW50YXRpb24gYmxvY2tzLCBzdWNoIGFzCiAgICB0aG9zZSB1c2VkIHRvIGRlZmluZSBibG9jayBzdGF0ZW1lbnRzIGluIFB5dGhvbiBzb3VyY2UgY29kZS4KCiAgICBQYXJhbWV0ZXJzOgogICAgIC0gYmxvY2tTdGF0ZW1lbnRFeHByIC0gZXhwcmVzc2lvbiBkZWZpbmluZyBzeW50YXggb2Ygc3RhdGVtZW50IHRoYXQKICAgICAgICAgICAgaXMgcmVwZWF0ZWQgd2l0aGluIHRoZSBpbmRlbnRlZCBibG9jawogICAgIC0gaW5kZW50U3RhY2sgLSBsaXN0IGNyZWF0ZWQgYnkgY2FsbGVyIHRvIG1hbmFnZSBpbmRlbnRhdGlvbiBzdGFjawogICAgICAgICAgICAobXVsdGlwbGUgc3RhdGVtZW50V2l0aEluZGVudGVkQmxvY2sgZXhwcmVzc2lvbnMgd2l0aGluIGEgc2luZ2xlIGdyYW1tYXIKICAgICAgICAgICAgc2hvdWxkIHNoYXJlIGEgY29tbW9uIGluZGVudFN0YWNrKQogICAgIC0gaW5kZW50IC0gYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgYmxvY2sgbXVzdCBiZSBpbmRlbnRlZCBiZXlvbmQgdGhlCiAgICAgICAgICAgIHRoZSBjdXJyZW50IGxldmVsOyBzZXQgdG8gRmFsc2UgZm9yIGJsb2NrIG9mIGxlZnQtbW9zdCBzdGF0ZW1lbnRzCiAgICAgICAgICAgIChkZWZhdWx0PUN7VHJ1ZX0pCgogICAgQSB2YWxpZCBibG9jayBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIEN7YmxvY2tTdGF0ZW1lbnR9LgoKICAgIEV4YW1wbGU6OgogICAgICAgIGRhdGEgPSAnJycKICAgICAgICBkZWYgQSh6KToKICAgICAgICAgIEExCiAgICAgICAgICBCID0gMTAwCiAgICAgICAgICBHID0gQTIKICAgICAgICAgIEEyCiAgICAgICAgICBBMwogICAgICAgIEIKICAgICAgICBkZWYgQkIoYSxiLGMpOgogICAgICAgICAgQkIxCiAgICAgICAgICBkZWYgQkJBKCk6CiAgICAgICAgICAgIGJiYTEKICAgICAgICAgICAgYmJhMgogICAgICAgICAgICBiYmEzCiAgICAgICAgQwogICAgICAgIEQKICAgICAgICBkZWYgc3BhbSh4LHkpOgogICAgICAgICAgICAgZGVmIGVnZ3Moeik6CiAgICAgICAgICAgICAgICAgcGFzcwogICAgICAgICcnJwoKCiAgICAgICAgaW5kZW50U3RhY2sgPSBbMV0KICAgICAgICBzdG10ID0gRm9yd2FyZCgpCgogICAgICAgIGlkZW50aWZpZXIgPSBXb3JkKGFscGhhcywgYWxwaGFudW1zKQogICAgICAgIGZ1bmNEZWNsID0gKCJkZWYiICsgaWRlbnRpZmllciArIEdyb3VwKCAiKCIgKyBPcHRpb25hbCggZGVsaW1pdGVkTGlzdChpZGVudGlmaWVyKSApICsgIikiICkgKyAiOiIpCiAgICAgICAgZnVuY19ib2R5ID0gaW5kZW50ZWRCbG9jayhzdG10LCBpbmRlbnRTdGFjaykKICAgICAgICBmdW5jRGVmID0gR3JvdXAoIGZ1bmNEZWNsICsgZnVuY19ib2R5ICkKCiAgICAgICAgcnZhbHVlID0gRm9yd2FyZCgpCiAgICAgICAgZnVuY0NhbGwgPSBHcm91cChpZGVudGlmaWVyICsgIigiICsgT3B0aW9uYWwoZGVsaW1pdGVkTGlzdChydmFsdWUpKSArICIpIikKICAgICAgICBydmFsdWUgPDwgKGZ1bmNDYWxsIHwgaWRlbnRpZmllciB8IFdvcmQobnVtcykpCiAgICAgICAgYXNzaWdubWVudCA9IEdyb3VwKGlkZW50aWZpZXIgKyAiPSIgKyBydmFsdWUpCiAgICAgICAgc3RtdCA8PCAoIGZ1bmNEZWYgfCBhc3NpZ25tZW50IHwgaWRlbnRpZmllciApCgogICAgICAgIG1vZHVsZV9ib2R5ID0gT25lT3JNb3JlKHN0bXQpCgogICAgICAgIHBhcnNlVHJlZSA9IG1vZHVsZV9ib2R5LnBhcnNlU3RyaW5nKGRhdGEpCiAgICAgICAgcGFyc2VUcmVlLnBwcmludCgpCiAgICBwcmludHM6OgogICAgICAgIFtbJ2RlZicsCiAgICAgICAgICAnQScsCiAgICAgICAgICBbJygnLCAneicsICcpJ10sCiAgICAgICAgICAnOicsCiAgICAgICAgICBbWydBMSddLCBbWydCJywgJz0nLCAnMTAwJ11dLCBbWydHJywgJz0nLCAnQTInXV0sIFsnQTInXSwgWydBMyddXV0sCiAgICAgICAgICdCJywKICAgICAgICAgWydkZWYnLAogICAgICAgICAgJ0JCJywKICAgICAgICAgIFsnKCcsICdhJywgJ2InLCAnYycsICcpJ10sCiAgICAgICAgICAnOicsCiAgICAgICAgICBbWydCQjEnXSwgW1snZGVmJywgJ0JCQScsIFsnKCcsICcpJ10sICc6JywgW1snYmJhMSddLCBbJ2JiYTInXSwgWydiYmEzJ11dXV1dXSwKICAgICAgICAgJ0MnLAogICAgICAgICAnRCcsCiAgICAgICAgIFsnZGVmJywKICAgICAgICAgICdzcGFtJywKICAgICAgICAgIFsnKCcsICd4JywgJ3knLCAnKSddLAogICAgICAgICAgJzonLAogICAgICAgICAgW1tbJ2RlZicsICdlZ2dzJywgWycoJywgJ3onLCAnKSddLCAnOicsIFtbJ3Bhc3MnXV1dXV1dXSAKICAgICIiIgogICAgZGVmIGNoZWNrUGVlckluZGVudChzLGwsdCk6CiAgICAgICAgaWYgbCA+PSBsZW4ocyk6IHJldHVybgogICAgICAgIGN1ckNvbCA9IGNvbChsLHMpCiAgICAgICAgaWYgY3VyQ29sICE9IGluZGVudFN0YWNrWy0xXToKICAgICAgICAgICAgaWYgY3VyQ29sID4gaW5kZW50U3RhY2tbLTFdOgogICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VGYXRhbEV4Y2VwdGlvbihzLGwsImlsbGVnYWwgbmVzdGluZyIpCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKHMsbCwibm90IGEgcGVlciBlbnRyeSIpCgogICAgZGVmIGNoZWNrU3ViSW5kZW50KHMsbCx0KToKICAgICAgICBjdXJDb2wgPSBjb2wobCxzKQogICAgICAgIGlmIGN1ckNvbCA+IGluZGVudFN0YWNrWy0xXToKICAgICAgICAgICAgaW5kZW50U3RhY2suYXBwZW5kKCBjdXJDb2wgKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKHMsbCwibm90IGEgc3ViZW50cnkiKQoKICAgIGRlZiBjaGVja1VuaW5kZW50KHMsbCx0KToKICAgICAgICBpZiBsID49IGxlbihzKTogcmV0dXJuCiAgICAgICAgY3VyQ29sID0gY29sKGwscykKICAgICAgICBpZiBub3QoaW5kZW50U3RhY2sgYW5kIGN1ckNvbCA8IGluZGVudFN0YWNrWy0xXSBhbmQgY3VyQ29sIDw9IGluZGVudFN0YWNrWy0yXSk6CiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKHMsbCwibm90IGFuIHVuaW5kZW50IikKICAgICAgICBpbmRlbnRTdGFjay5wb3AoKQoKICAgIE5MID0gT25lT3JNb3JlKExpbmVFbmQoKS5zZXRXaGl0ZXNwYWNlQ2hhcnMoIlx0ICIpLnN1cHByZXNzKCkpCiAgICBJTkRFTlQgPSAoRW1wdHkoKSArIEVtcHR5KCkuc2V0UGFyc2VBY3Rpb24oY2hlY2tTdWJJbmRlbnQpKS5zZXROYW1lKCdJTkRFTlQnKQogICAgUEVFUiAgID0gRW1wdHkoKS5zZXRQYXJzZUFjdGlvbihjaGVja1BlZXJJbmRlbnQpLnNldE5hbWUoJycpCiAgICBVTkRFTlQgPSBFbXB0eSgpLnNldFBhcnNlQWN0aW9uKGNoZWNrVW5pbmRlbnQpLnNldE5hbWUoJ1VOSU5ERU5UJykKICAgIGlmIGluZGVudDoKICAgICAgICBzbUV4cHIgPSBHcm91cCggT3B0aW9uYWwoTkwpICsKICAgICAgICAgICAgI34gRm9sbG93ZWRCeShibG9ja1N0YXRlbWVudEV4cHIpICsKICAgICAgICAgICAgSU5ERU5UICsgKE9uZU9yTW9yZSggUEVFUiArIEdyb3VwKGJsb2NrU3RhdGVtZW50RXhwcikgKyBPcHRpb25hbChOTCkgKSkgKyBVTkRFTlQpCiAgICBlbHNlOgogICAgICAgIHNtRXhwciA9IEdyb3VwKCBPcHRpb25hbChOTCkgKwogICAgICAgICAgICAoT25lT3JNb3JlKCBQRUVSICsgR3JvdXAoYmxvY2tTdGF0ZW1lbnRFeHByKSArIE9wdGlvbmFsKE5MKSApKSApCiAgICBibG9ja1N0YXRlbWVudEV4cHIuaWdub3JlKF9ic2xhc2ggKyBMaW5lRW5kKCkpCiAgICByZXR1cm4gc21FeHByLnNldE5hbWUoJ2luZGVudGVkIGJsb2NrJykKCmFscGhhczhiaXQgPSBzcmFuZ2UociJbXDB4YzAtXDB4ZDZcMHhkOC1cMHhmNlwweGY4LVwweGZmXSIpCnB1bmM4Yml0ID0gc3JhbmdlKHIiW1wweGExLVwweGJmXDB4ZDdcMHhmN10iKQoKYW55T3BlblRhZyxhbnlDbG9zZVRhZyA9IG1ha2VIVE1MVGFncyhXb3JkKGFscGhhcyxhbHBoYW51bXMrIl86Iikuc2V0TmFtZSgnYW55IHRhZycpKQpfaHRtbEVudGl0eU1hcCA9IGRpY3QoemlwKCJndCBsdCBhbXAgbmJzcCBxdW90IGFwb3MiLnNwbGl0KCksJz48JiAiXCcnKSkKY29tbW9uSFRNTEVudGl0eSA9IFJlZ2V4KCcmKD9QPGVudGl0eT4nICsgJ3wnLmpvaW4oX2h0bWxFbnRpdHlNYXAua2V5cygpKSArIik7Iikuc2V0TmFtZSgiY29tbW9uIEhUTUwgZW50aXR5IikKZGVmIHJlcGxhY2VIVE1MRW50aXR5KHQpOgogICAgIiIiSGVscGVyIHBhcnNlciBhY3Rpb24gdG8gcmVwbGFjZSBjb21tb24gSFRNTCBlbnRpdGllcyB3aXRoIHRoZWlyIHNwZWNpYWwgY2hhcmFjdGVycyIiIgogICAgcmV0dXJuIF9odG1sRW50aXR5TWFwLmdldCh0LmVudGl0eSkKCiMgaXQncyBlYXN5IHRvIGdldCB0aGVzZSBjb21tZW50IHN0cnVjdHVyZXMgd3JvbmcgLSB0aGV5J3JlIHZlcnkgY29tbW9uLCBzbyBtYXkgYXMgd2VsbCBtYWtlIHRoZW0gYXZhaWxhYmxlCmNTdHlsZUNvbW1lbnQgPSBDb21iaW5lKFJlZ2V4KHIiL1wqKD86W14qXXxcKig/IS8pKSoiKSArICcqLycpLnNldE5hbWUoIkMgc3R5bGUgY29tbWVudCIpCiJDb21tZW50IG9mIHRoZSBmb3JtIEN7LyogLi4uICovfSIKCmh0bWxDb21tZW50ID0gUmVnZXgociI8IS0tW1xzXFNdKj8tLT4iKS5zZXROYW1lKCJIVE1MIGNvbW1lbnQiKQoiQ29tbWVudCBvZiB0aGUgZm9ybSBDezwhLS0gLi4uIC0tPn0iCgpyZXN0T2ZMaW5lID0gUmVnZXgociIuKiIpLmxlYXZlV2hpdGVzcGFjZSgpLnNldE5hbWUoInJlc3Qgb2YgbGluZSIpCmRibFNsYXNoQ29tbWVudCA9IFJlZ2V4KHIiLy8oPzpcXFxufFteXG5dKSoiKS5zZXROYW1lKCIvLyBjb21tZW50IikKIkNvbW1lbnQgb2YgdGhlIGZvcm0gQ3svLyAuLi4gKHRvIGVuZCBvZiBsaW5lKX0iCgpjcHBTdHlsZUNvbW1lbnQgPSBDb21iaW5lKFJlZ2V4KHIiL1wqKD86W14qXXxcKig/IS8pKSoiKSArICcqLyd8IGRibFNsYXNoQ29tbWVudCkuc2V0TmFtZSgiQysrIHN0eWxlIGNvbW1lbnQiKQoiQ29tbWVudCBvZiBlaXRoZXIgZm9ybSBDe0x7Y1N0eWxlQ29tbWVudH19IG9yIEN7THtkYmxTbGFzaENvbW1lbnR9fSIKCmphdmFTdHlsZUNvbW1lbnQgPSBjcHBTdHlsZUNvbW1lbnQKIlNhbWUgYXMgQ3tMe2NwcFN0eWxlQ29tbWVudH19IgoKcHl0aG9uU3R5bGVDb21tZW50ID0gUmVnZXgociIjLioiKS5zZXROYW1lKCJQeXRob24gc3R5bGUgY29tbWVudCIpCiJDb21tZW50IG9mIHRoZSBmb3JtIEN7IyAuLi4gKHRvIGVuZCBvZiBsaW5lKX0iCgpfY29tbWFzZXBpdGVtID0gQ29tYmluZShPbmVPck1vcmUoV29yZChwcmludGFibGVzLCBleGNsdWRlQ2hhcnM9JywnKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbCggV29yZCgiIFx0IikgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH5MaXRlcmFsKCIsIikgKyB+TGluZUVuZCgpICkgKSApLnN0cmVhbWxpbmUoKS5zZXROYW1lKCJjb21tYUl0ZW0iKQpjb21tYVNlcGFyYXRlZExpc3QgPSBkZWxpbWl0ZWRMaXN0KCBPcHRpb25hbCggcXVvdGVkU3RyaW5nLmNvcHkoKSB8IF9jb21tYXNlcGl0ZW0sIGRlZmF1bHQ9IiIpICkuc2V0TmFtZSgiY29tbWFTZXBhcmF0ZWRMaXN0IikKIiIiKERlcHJlY2F0ZWQpIFByZWRlZmluZWQgZXhwcmVzc2lvbiBvZiAxIG9yIG1vcmUgcHJpbnRhYmxlIHdvcmRzIG9yIHF1b3RlZCBzdHJpbmdzLCBzZXBhcmF0ZWQgYnkgY29tbWFzLgogICBUaGlzIGV4cHJlc3Npb24gaXMgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBMe3B5cGFyc2luZ19jb21tb24uY29tbWFfc2VwYXJhdGVkX2xpc3R9LiIiIgoKIyBzb21lIG90aGVyIHVzZWZ1bCBleHByZXNzaW9ucyAtIHVzaW5nIGxvd2VyLWNhc2UgY2xhc3MgbmFtZSBzaW5jZSB3ZSBhcmUgcmVhbGx5IHVzaW5nIHRoaXMgYXMgYSBuYW1lc3BhY2UKY2xhc3MgcHlwYXJzaW5nX2NvbW1vbjoKICAgICIiIgogICAgSGVyZSBhcmUgc29tZSBjb21tb24gbG93LWxldmVsIGV4cHJlc3Npb25zIHRoYXQgbWF5IGJlIHVzZWZ1bCBpbiBqdW1wLXN0YXJ0aW5nIHBhcnNlciBkZXZlbG9wbWVudDoKICAgICAtIG51bWVyaWMgZm9ybXMgKEx7aW50ZWdlcnM8aW50ZWdlcj59LCBMe3JlYWxzPHJlYWw+fSwgTHtzY2llbnRpZmljIG5vdGF0aW9uPHNjaV9yZWFsPn0pCiAgICAgLSBjb21tb24gTHtwcm9ncmFtbWluZyBpZGVudGlmaWVyczxpZGVudGlmaWVyPn0KICAgICAtIG5ldHdvcmsgYWRkcmVzc2VzIChMe01BQzxtYWNfYWRkcmVzcz59LCBMe0lQdjQ8aXB2NF9hZGRyZXNzPn0sIEx7SVB2NjxpcHY2X2FkZHJlc3M+fSkKICAgICAtIElTTzg2MDEgTHtkYXRlczxpc284NjAxX2RhdGU+fSBhbmQgTHtkYXRldGltZTxpc284NjAxX2RhdGV0aW1lPn0KICAgICAtIEx7VVVJRDx1dWlkPn0KICAgICAtIEx7Y29tbWEtc2VwYXJhdGVkIGxpc3Q8Y29tbWFfc2VwYXJhdGVkX2xpc3Q+fQogICAgUGFyc2UgYWN0aW9uczoKICAgICAtIEN7THtjb252ZXJ0VG9JbnRlZ2VyfX0KICAgICAtIEN7THtjb252ZXJ0VG9GbG9hdH19CiAgICAgLSBDe0x7Y29udmVydFRvRGF0ZX19CiAgICAgLSBDe0x7Y29udmVydFRvRGF0ZXRpbWV9fQogICAgIC0gQ3tMe3N0cmlwSFRNTFRhZ3N9fQogICAgIC0gQ3tMe3VwY2FzZVRva2Vuc319CiAgICAgLSBDe0x7ZG93bmNhc2VUb2tlbnN9fQoKICAgIEV4YW1wbGU6OgogICAgICAgIHB5cGFyc2luZ19jb21tb24ubnVtYmVyLnJ1blRlc3RzKCcnJwogICAgICAgICAgICAjIGFueSBpbnQgb3IgcmVhbCBudW1iZXIsIHJldHVybmVkIGFzIHRoZSBhcHByb3ByaWF0ZSB0eXBlCiAgICAgICAgICAgIDEwMAogICAgICAgICAgICAtMTAwCiAgICAgICAgICAgICsxMDAKICAgICAgICAgICAgMy4xNDE1OQogICAgICAgICAgICA2LjAyZTIzCiAgICAgICAgICAgIDFlLTEyCiAgICAgICAgICAgICcnJykKCiAgICAgICAgcHlwYXJzaW5nX2NvbW1vbi5mbnVtYmVyLnJ1blRlc3RzKCcnJwogICAgICAgICAgICAjIGFueSBpbnQgb3IgcmVhbCBudW1iZXIsIHJldHVybmVkIGFzIGZsb2F0CiAgICAgICAgICAgIDEwMAogICAgICAgICAgICAtMTAwCiAgICAgICAgICAgICsxMDAKICAgICAgICAgICAgMy4xNDE1OQogICAgICAgICAgICA2LjAyZTIzCiAgICAgICAgICAgIDFlLTEyCiAgICAgICAgICAgICcnJykKCiAgICAgICAgcHlwYXJzaW5nX2NvbW1vbi5oZXhfaW50ZWdlci5ydW5UZXN0cygnJycKICAgICAgICAgICAgIyBoZXggbnVtYmVycwogICAgICAgICAgICAxMDAKICAgICAgICAgICAgRkYKICAgICAgICAgICAgJycnKQoKICAgICAgICBweXBhcnNpbmdfY29tbW9uLmZyYWN0aW9uLnJ1blRlc3RzKCcnJwogICAgICAgICAgICAjIGZyYWN0aW9ucwogICAgICAgICAgICAxLzIKICAgICAgICAgICAgLTMvNAogICAgICAgICAgICAnJycpCgogICAgICAgIHB5cGFyc2luZ19jb21tb24ubWl4ZWRfaW50ZWdlci5ydW5UZXN0cygnJycKICAgICAgICAgICAgIyBtaXhlZCBmcmFjdGlvbnMKICAgICAgICAgICAgMQogICAgICAgICAgICAxLzIKICAgICAgICAgICAgLTMvNAogICAgICAgICAgICAxLTMvNAogICAgICAgICAgICAnJycpCgogICAgICAgIGltcG9ydCB1dWlkCiAgICAgICAgcHlwYXJzaW5nX2NvbW1vbi51dWlkLnNldFBhcnNlQWN0aW9uKHRva2VuTWFwKHV1aWQuVVVJRCkpCiAgICAgICAgcHlwYXJzaW5nX2NvbW1vbi51dWlkLnJ1blRlc3RzKCcnJwogICAgICAgICAgICAjIHV1aWQKICAgICAgICAgICAgMTIzNDU2NzgtMTIzNC01Njc4LTEyMzQtNTY3ODEyMzQ1Njc4CiAgICAgICAgICAgICcnJykKICAgIHByaW50czo6CiAgICAgICAgIyBhbnkgaW50IG9yIHJlYWwgbnVtYmVyLCByZXR1cm5lZCBhcyB0aGUgYXBwcm9wcmlhdGUgdHlwZQogICAgICAgIDEwMAogICAgICAgIFsxMDBdCgogICAgICAgIC0xMDAKICAgICAgICBbLTEwMF0KCiAgICAgICAgKzEwMAogICAgICAgIFsxMDBdCgogICAgICAgIDMuMTQxNTkKICAgICAgICBbMy4xNDE1OV0KCiAgICAgICAgNi4wMmUyMwogICAgICAgIFs2LjAyZSsyM10KCiAgICAgICAgMWUtMTIKICAgICAgICBbMWUtMTJdCgogICAgICAgICMgYW55IGludCBvciByZWFsIG51bWJlciwgcmV0dXJuZWQgYXMgZmxvYXQKICAgICAgICAxMDAKICAgICAgICBbMTAwLjBdCgogICAgICAgIC0xMDAKICAgICAgICBbLTEwMC4wXQoKICAgICAgICArMTAwCiAgICAgICAgWzEwMC4wXQoKICAgICAgICAzLjE0MTU5CiAgICAgICAgWzMuMTQxNTldCgogICAgICAgIDYuMDJlMjMKICAgICAgICBbNi4wMmUrMjNdCgogICAgICAgIDFlLTEyCiAgICAgICAgWzFlLTEyXQoKICAgICAgICAjIGhleCBudW1iZXJzCiAgICAgICAgMTAwCiAgICAgICAgWzI1Nl0KCiAgICAgICAgRkYKICAgICAgICBbMjU1XQoKICAgICAgICAjIGZyYWN0aW9ucwogICAgICAgIDEvMgogICAgICAgIFswLjVdCgogICAgICAgIC0zLzQKICAgICAgICBbLTAuNzVdCgogICAgICAgICMgbWl4ZWQgZnJhY3Rpb25zCiAgICAgICAgMQogICAgICAgIFsxXQoKICAgICAgICAxLzIKICAgICAgICBbMC41XQoKICAgICAgICAtMy80CiAgICAgICAgWy0wLjc1XQoKICAgICAgICAxLTMvNAogICAgICAgIFsxLjc1XQoKICAgICAgICAjIHV1aWQKICAgICAgICAxMjM0NTY3OC0xMjM0LTU2NzgtMTIzNC01Njc4MTIzNDU2NzgKICAgICAgICBbVVVJRCgnMTIzNDU2NzgtMTIzNC01Njc4LTEyMzQtNTY3ODEyMzQ1Njc4JyldCiAgICAiIiIKCiAgICBjb252ZXJ0VG9JbnRlZ2VyID0gdG9rZW5NYXAoaW50KQogICAgIiIiCiAgICBQYXJzZSBhY3Rpb24gZm9yIGNvbnZlcnRpbmcgcGFyc2VkIGludGVnZXJzIHRvIFB5dGhvbiBpbnQKICAgICIiIgoKICAgIGNvbnZlcnRUb0Zsb2F0ID0gdG9rZW5NYXAoZmxvYXQpCiAgICAiIiIKICAgIFBhcnNlIGFjdGlvbiBmb3IgY29udmVydGluZyBwYXJzZWQgbnVtYmVycyB0byBQeXRob24gZmxvYXQKICAgICIiIgoKICAgIGludGVnZXIgPSBXb3JkKG51bXMpLnNldE5hbWUoImludGVnZXIiKS5zZXRQYXJzZUFjdGlvbihjb252ZXJ0VG9JbnRlZ2VyKQogICAgIiIiZXhwcmVzc2lvbiB0aGF0IHBhcnNlcyBhbiB1bnNpZ25lZCBpbnRlZ2VyLCByZXR1cm5zIGFuIGludCIiIgoKICAgIGhleF9pbnRlZ2VyID0gV29yZChoZXhudW1zKS5zZXROYW1lKCJoZXggaW50ZWdlciIpLnNldFBhcnNlQWN0aW9uKHRva2VuTWFwKGludCwxNikpCiAgICAiIiJleHByZXNzaW9uIHRoYXQgcGFyc2VzIGEgaGV4YWRlY2ltYWwgaW50ZWdlciwgcmV0dXJucyBhbiBpbnQiIiIKCiAgICBzaWduZWRfaW50ZWdlciA9IFJlZ2V4KHInWystXT9cZCsnKS5zZXROYW1lKCJzaWduZWQgaW50ZWdlciIpLnNldFBhcnNlQWN0aW9uKGNvbnZlcnRUb0ludGVnZXIpCiAgICAiIiJleHByZXNzaW9uIHRoYXQgcGFyc2VzIGFuIGludGVnZXIgd2l0aCBvcHRpb25hbCBsZWFkaW5nIHNpZ24sIHJldHVybnMgYW4gaW50IiIiCgogICAgZnJhY3Rpb24gPSAoc2lnbmVkX2ludGVnZXIoKS5zZXRQYXJzZUFjdGlvbihjb252ZXJ0VG9GbG9hdCkgKyAnLycgKyBzaWduZWRfaW50ZWdlcigpLnNldFBhcnNlQWN0aW9uKGNvbnZlcnRUb0Zsb2F0KSkuc2V0TmFtZSgiZnJhY3Rpb24iKQogICAgIiIiZnJhY3Rpb25hbCBleHByZXNzaW9uIG9mIGFuIGludGVnZXIgZGl2aWRlZCBieSBhbiBpbnRlZ2VyLCByZXR1cm5zIGEgZmxvYXQiIiIKICAgIGZyYWN0aW9uLmFkZFBhcnNlQWN0aW9uKGxhbWJkYSB0OiB0WzBdL3RbLTFdKQoKICAgIG1peGVkX2ludGVnZXIgPSAoZnJhY3Rpb24gfCBzaWduZWRfaW50ZWdlciArIE9wdGlvbmFsKE9wdGlvbmFsKCctJykuc3VwcHJlc3MoKSArIGZyYWN0aW9uKSkuc2V0TmFtZSgiZnJhY3Rpb24gb3IgbWl4ZWQgaW50ZWdlci1mcmFjdGlvbiIpCiAgICAiIiJtaXhlZCBpbnRlZ2VyIG9mIHRoZSBmb3JtICdpbnRlZ2VyIC0gZnJhY3Rpb24nLCB3aXRoIG9wdGlvbmFsIGxlYWRpbmcgaW50ZWdlciwgcmV0dXJucyBmbG9hdCIiIgogICAgbWl4ZWRfaW50ZWdlci5hZGRQYXJzZUFjdGlvbihzdW0pCgogICAgcmVhbCA9IFJlZ2V4KHInWystXT9cZCtcLlxkKicpLnNldE5hbWUoInJlYWwgbnVtYmVyIikuc2V0UGFyc2VBY3Rpb24oY29udmVydFRvRmxvYXQpCiAgICAiIiJleHByZXNzaW9uIHRoYXQgcGFyc2VzIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGFuZCByZXR1cm5zIGEgZmxvYXQiIiIKCiAgICBzY2lfcmVhbCA9IFJlZ2V4KHInWystXT9cZCsoW2VFXVsrLV0/XGQrfFwuXGQqKFtlRV1bKy1dP1xkKyk/KScpLnNldE5hbWUoInJlYWwgbnVtYmVyIHdpdGggc2NpZW50aWZpYyBub3RhdGlvbiIpLnNldFBhcnNlQWN0aW9uKGNvbnZlcnRUb0Zsb2F0KQogICAgIiIiZXhwcmVzc2lvbiB0aGF0IHBhcnNlcyBhIGZsb2F0aW5nIHBvaW50IG51bWJlciB3aXRoIG9wdGlvbmFsIHNjaWVudGlmaWMgbm90YXRpb24gYW5kIHJldHVybnMgYSBmbG9hdCIiIgoKICAgICMgc3RyZWFtbGluaW5nIHRoaXMgZXhwcmVzc2lvbiBtYWtlcyB0aGUgZG9jcyBuaWNlci1sb29raW5nCiAgICBudW1iZXIgPSAoc2NpX3JlYWwgfCByZWFsIHwgc2lnbmVkX2ludGVnZXIpLnN0cmVhbWxpbmUoKQogICAgIiIiYW55IG51bWVyaWMgZXhwcmVzc2lvbiwgcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBQeXRob24gdHlwZSIiIgoKICAgIGZudW1iZXIgPSBSZWdleChyJ1srLV0/XGQrXC4/XGQqKFtlRV1bKy1dP1xkKyk/Jykuc2V0TmFtZSgiZm51bWJlciIpLnNldFBhcnNlQWN0aW9uKGNvbnZlcnRUb0Zsb2F0KQogICAgIiIiYW55IGludCBvciByZWFsIG51bWJlciwgcmV0dXJuZWQgYXMgZmxvYXQiIiIKICAgIAogICAgaWRlbnRpZmllciA9IFdvcmQoYWxwaGFzKydfJywgYWxwaGFudW1zKydfJykuc2V0TmFtZSgiaWRlbnRpZmllciIpCiAgICAiIiJ0eXBpY2FsIGNvZGUgaWRlbnRpZmllciAobGVhZGluZyBhbHBoYSBvciAnXycsIGZvbGxvd2VkIGJ5IDAgb3IgbW9yZSBhbHBoYXMsIG51bXMsIG9yICdfJykiIiIKICAgIAogICAgaXB2NF9hZGRyZXNzID0gUmVnZXgocicoMjVbMC01XXwyWzAtNF1bMC05XXwxP1swLTldezEsMn0pKFwuKDI1WzAtNV18MlswLTRdWzAtOV18MT9bMC05XXsxLDJ9KSl7M30nKS5zZXROYW1lKCJJUHY0IGFkZHJlc3MiKQogICAgIklQdjQgYWRkcmVzcyAoQ3swLjAuMC4wIC0gMjU1LjI1NS4yNTUuMjU1fSkiCgogICAgX2lwdjZfcGFydCA9IFJlZ2V4KHInWzAtOWEtZkEtRl17MSw0fScpLnNldE5hbWUoImhleF9pbnRlZ2VyIikKICAgIF9mdWxsX2lwdjZfYWRkcmVzcyA9IChfaXB2Nl9wYXJ0ICsgKCc6JyArIF9pcHY2X3BhcnQpKjcpLnNldE5hbWUoImZ1bGwgSVB2NiBhZGRyZXNzIikKICAgIF9zaG9ydF9pcHY2X2FkZHJlc3MgPSAoT3B0aW9uYWwoX2lwdjZfcGFydCArICgnOicgKyBfaXB2Nl9wYXJ0KSooMCw2KSkgKyAiOjoiICsgT3B0aW9uYWwoX2lwdjZfcGFydCArICgnOicgKyBfaXB2Nl9wYXJ0KSooMCw2KSkpLnNldE5hbWUoInNob3J0IElQdjYgYWRkcmVzcyIpCiAgICBfc2hvcnRfaXB2Nl9hZGRyZXNzLmFkZENvbmRpdGlvbihsYW1iZGEgdDogc3VtKDEgZm9yIHR0IGluIHQgaWYgcHlwYXJzaW5nX2NvbW1vbi5faXB2Nl9wYXJ0Lm1hdGNoZXModHQpKSA8IDgpCiAgICBfbWl4ZWRfaXB2Nl9hZGRyZXNzID0gKCI6OmZmZmY6IiArIGlwdjRfYWRkcmVzcykuc2V0TmFtZSgibWl4ZWQgSVB2NiBhZGRyZXNzIikKICAgIGlwdjZfYWRkcmVzcyA9IENvbWJpbmUoKF9mdWxsX2lwdjZfYWRkcmVzcyB8IF9taXhlZF9pcHY2X2FkZHJlc3MgfCBfc2hvcnRfaXB2Nl9hZGRyZXNzKS5zZXROYW1lKCJJUHY2IGFkZHJlc3MiKSkuc2V0TmFtZSgiSVB2NiBhZGRyZXNzIikKICAgICJJUHY2IGFkZHJlc3MgKGxvbmcsIHNob3J0LCBvciBtaXhlZCBmb3JtKSIKICAgIAogICAgbWFjX2FkZHJlc3MgPSBSZWdleChyJ1swLTlhLWZBLUZdezJ9KFs6Li1dKVswLTlhLWZBLUZdezJ9KD86XDFbMC05YS1mQS1GXXsyfSl7NH0nKS5zZXROYW1lKCJNQUMgYWRkcmVzcyIpCiAgICAiTUFDIGFkZHJlc3MgeHg6eHg6eHg6eHg6eHggKG1heSBhbHNvIGhhdmUgJy0nIG9yICcuJyBkZWxpbWl0ZXJzKSIKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgY29udmVydFRvRGF0ZShmbXQ9IiVZLSVtLSVkIik6CiAgICAgICAgIiIiCiAgICAgICAgSGVscGVyIHRvIGNyZWF0ZSBhIHBhcnNlIGFjdGlvbiBmb3IgY29udmVydGluZyBwYXJzZWQgZGF0ZSBzdHJpbmcgdG8gUHl0aG9uIGRhdGV0aW1lLmRhdGUKCiAgICAgICAgUGFyYW1zIC0KICAgICAgICAgLSBmbXQgLSBmb3JtYXQgdG8gYmUgcGFzc2VkIHRvIGRhdGV0aW1lLnN0cnB0aW1lIChkZWZhdWx0PUN7IiVZLSVtLSVkIn0pCgogICAgICAgIEV4YW1wbGU6OgogICAgICAgICAgICBkYXRlX2V4cHIgPSBweXBhcnNpbmdfY29tbW9uLmlzbzg2MDFfZGF0ZS5jb3B5KCkKICAgICAgICAgICAgZGF0ZV9leHByLnNldFBhcnNlQWN0aW9uKHB5cGFyc2luZ19jb21tb24uY29udmVydFRvRGF0ZSgpKQogICAgICAgICAgICBwcmludChkYXRlX2V4cHIucGFyc2VTdHJpbmcoIjE5OTktMTItMzEiKSkKICAgICAgICBwcmludHM6OgogICAgICAgICAgICBbZGF0ZXRpbWUuZGF0ZSgxOTk5LCAxMiwgMzEpXQogICAgICAgICIiIgogICAgICAgIGRlZiBjdnRfZm4ocyxsLHQpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICByZXR1cm4gZGF0ZXRpbWUuc3RycHRpbWUodFswXSwgZm10KS5kYXRlKCkKICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3IgYXMgdmU6CiAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihzLCBsLCBzdHIodmUpKQogICAgICAgIHJldHVybiBjdnRfZm4KCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgY29udmVydFRvRGF0ZXRpbWUoZm10PSIlWS0lbS0lZFQlSDolTTolUy4lZiIpOgogICAgICAgICIiIgogICAgICAgIEhlbHBlciB0byBjcmVhdGUgYSBwYXJzZSBhY3Rpb24gZm9yIGNvbnZlcnRpbmcgcGFyc2VkIGRhdGV0aW1lIHN0cmluZyB0byBQeXRob24gZGF0ZXRpbWUuZGF0ZXRpbWUKCiAgICAgICAgUGFyYW1zIC0KICAgICAgICAgLSBmbXQgLSBmb3JtYXQgdG8gYmUgcGFzc2VkIHRvIGRhdGV0aW1lLnN0cnB0aW1lIChkZWZhdWx0PUN7IiVZLSVtLSVkVCVIOiVNOiVTLiVmIn0pCgogICAgICAgIEV4YW1wbGU6OgogICAgICAgICAgICBkdF9leHByID0gcHlwYXJzaW5nX2NvbW1vbi5pc284NjAxX2RhdGV0aW1lLmNvcHkoKQogICAgICAgICAgICBkdF9leHByLnNldFBhcnNlQWN0aW9uKHB5cGFyc2luZ19jb21tb24uY29udmVydFRvRGF0ZXRpbWUoKSkKICAgICAgICAgICAgcHJpbnQoZHRfZXhwci5wYXJzZVN0cmluZygiMTk5OS0xMi0zMVQyMzo1OTo1OS45OTkiKSkKICAgICAgICBwcmludHM6OgogICAgICAgICAgICBbZGF0ZXRpbWUuZGF0ZXRpbWUoMTk5OSwgMTIsIDMxLCAyMywgNTksIDU5LCA5OTkwMDApXQogICAgICAgICIiIgogICAgICAgIGRlZiBjdnRfZm4ocyxsLHQpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICByZXR1cm4gZGF0ZXRpbWUuc3RycHRpbWUodFswXSwgZm10KQogICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvciBhcyB2ZToKICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKHMsIGwsIHN0cih2ZSkpCiAgICAgICAgcmV0dXJuIGN2dF9mbgoKICAgIGlzbzg2MDFfZGF0ZSA9IFJlZ2V4KHInKD9QPHllYXI+XGR7NH0pKD86LSg/UDxtb250aD5cZFxkKSg/Oi0oP1A8ZGF5PlxkXGQpKT8pPycpLnNldE5hbWUoIklTTzg2MDEgZGF0ZSIpCiAgICAiSVNPODYwMSBkYXRlIChDe3l5eXktbW0tZGR9KSIKCiAgICBpc284NjAxX2RhdGV0aW1lID0gUmVnZXgocicoP1A8eWVhcj5cZHs0fSktKD9QPG1vbnRoPlxkXGQpLSg/UDxkYXk+XGRcZClbVCBdKD9QPGhvdXI+XGRcZCk6KD9QPG1pbnV0ZT5cZFxkKSg6KD9QPHNlY29uZD5cZFxkKFwuXGQqKT8pPyk/KD9QPHR6Plp8WystXVxkXGQ6P1xkXGQpPycpLnNldE5hbWUoIklTTzg2MDEgZGF0ZXRpbWUiKQogICAgIklTTzg2MDEgZGF0ZXRpbWUgKEN7eXl5eS1tbS1kZFRoaDptbTpzcy5zKFp8Ky0wMDowMCl9KSAtIHRyYWlsaW5nIHNlY29uZHMsIG1pbGxpc2Vjb25kcywgYW5kIHRpbWV6b25lIG9wdGlvbmFsOyBhY2NlcHRzIHNlcGFyYXRpbmcgQ3snVCd9IG9yIEN7JyAnfSIKCiAgICB1dWlkID0gUmVnZXgocidbMC05YS1mQS1GXXs4fSgtWzAtOWEtZkEtRl17NH0pezN9LVswLTlhLWZBLUZdezEyfScpLnNldE5hbWUoIlVVSUQiKQogICAgIlVVSUQgKEN7eHh4eHh4eHgteHh4eC14eHh4LXh4eHgteHh4eHh4eHh4eHh4fSkiCgogICAgX2h0bWxfc3RyaXBwZXIgPSBhbnlPcGVuVGFnLnN1cHByZXNzKCkgfCBhbnlDbG9zZVRhZy5zdXBwcmVzcygpCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgc3RyaXBIVE1MVGFncyhzLCBsLCB0b2tlbnMpOgogICAgICAgICIiIgogICAgICAgIFBhcnNlIGFjdGlvbiB0byByZW1vdmUgSFRNTCB0YWdzIGZyb20gd2ViIHBhZ2UgSFRNTCBzb3VyY2UKCiAgICAgICAgRXhhbXBsZTo6CiAgICAgICAgICAgICMgc3RyaXAgSFRNTCBsaW5rcyBmcm9tIG5vcm1hbCB0ZXh0IAogICAgICAgICAgICB0ZXh0ID0gJzx0ZD5Nb3JlIGluZm8gYXQgdGhlIDxhIGhyZWY9Imh0dHA6Ly9weXBhcnNpbmcud2lraXNwYWNlcy5jb20iPnB5cGFyc2luZzwvYT4gd2lraSBwYWdlPC90ZD4nCiAgICAgICAgICAgIHRkLHRkX2VuZCA9IG1ha2VIVE1MVGFncygiVEQiKQogICAgICAgICAgICB0YWJsZV90ZXh0ID0gdGQgKyBTa2lwVG8odGRfZW5kKS5zZXRQYXJzZUFjdGlvbihweXBhcnNpbmdfY29tbW9uLnN0cmlwSFRNTFRhZ3MpKCJib2R5IikgKyB0ZF9lbmQKICAgICAgICAgICAgCiAgICAgICAgICAgIHByaW50KHRhYmxlX3RleHQucGFyc2VTdHJpbmcodGV4dCkuYm9keSkgIyAtPiAnTW9yZSBpbmZvIGF0IHRoZSBweXBhcnNpbmcgd2lraSBwYWdlJwogICAgICAgICIiIgogICAgICAgIHJldHVybiBweXBhcnNpbmdfY29tbW9uLl9odG1sX3N0cmlwcGVyLnRyYW5zZm9ybVN0cmluZyh0b2tlbnNbMF0pCgogICAgX2NvbW1hc2VwaXRlbSA9IENvbWJpbmUoT25lT3JNb3JlKH5MaXRlcmFsKCIsIikgKyB+TGluZUVuZCgpICsgV29yZChwcmludGFibGVzLCBleGNsdWRlQ2hhcnM9JywnKSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgT3B0aW9uYWwoIFdoaXRlKCIgXHQiKSApICkgKS5zdHJlYW1saW5lKCkuc2V0TmFtZSgiY29tbWFJdGVtIikKICAgIGNvbW1hX3NlcGFyYXRlZF9saXN0ID0gZGVsaW1pdGVkTGlzdCggT3B0aW9uYWwoIHF1b3RlZFN0cmluZy5jb3B5KCkgfCBfY29tbWFzZXBpdGVtLCBkZWZhdWx0PSIiKSApLnNldE5hbWUoImNvbW1hIHNlcGFyYXRlZCBsaXN0IikKICAgICIiIlByZWRlZmluZWQgZXhwcmVzc2lvbiBvZiAxIG9yIG1vcmUgcHJpbnRhYmxlIHdvcmRzIG9yIHF1b3RlZCBzdHJpbmdzLCBzZXBhcmF0ZWQgYnkgY29tbWFzLiIiIgoKICAgIHVwY2FzZVRva2VucyA9IHN0YXRpY21ldGhvZCh0b2tlbk1hcChsYW1iZGEgdDogX3VzdHIodCkudXBwZXIoKSkpCiAgICAiIiJQYXJzZSBhY3Rpb24gdG8gY29udmVydCB0b2tlbnMgdG8gdXBwZXIgY2FzZS4iIiIKCiAgICBkb3duY2FzZVRva2VucyA9IHN0YXRpY21ldGhvZCh0b2tlbk1hcChsYW1iZGEgdDogX3VzdHIodCkubG93ZXIoKSkpCiAgICAiIiJQYXJzZSBhY3Rpb24gdG8gY29udmVydCB0b2tlbnMgdG8gbG93ZXIgY2FzZS4iIiIKCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgoKICAgIHNlbGVjdFRva2VuICAgID0gQ2FzZWxlc3NMaXRlcmFsKCJzZWxlY3QiKQogICAgZnJvbVRva2VuICAgICAgPSBDYXNlbGVzc0xpdGVyYWwoImZyb20iKQoKICAgIGlkZW50ICAgICAgICAgID0gV29yZChhbHBoYXMsIGFscGhhbnVtcyArICJfJCIpCgogICAgY29sdW1uTmFtZSAgICAgPSBkZWxpbWl0ZWRMaXN0KGlkZW50LCAiLiIsIGNvbWJpbmU9VHJ1ZSkuc2V0UGFyc2VBY3Rpb24odXBjYXNlVG9rZW5zKQogICAgY29sdW1uTmFtZUxpc3QgPSBHcm91cChkZWxpbWl0ZWRMaXN0KGNvbHVtbk5hbWUpKS5zZXROYW1lKCJjb2x1bW5zIikKICAgIGNvbHVtblNwZWMgICAgID0gKCcqJyB8IGNvbHVtbk5hbWVMaXN0KQoKICAgIHRhYmxlTmFtZSAgICAgID0gZGVsaW1pdGVkTGlzdChpZGVudCwgIi4iLCBjb21iaW5lPVRydWUpLnNldFBhcnNlQWN0aW9uKHVwY2FzZVRva2VucykKICAgIHRhYmxlTmFtZUxpc3QgID0gR3JvdXAoZGVsaW1pdGVkTGlzdCh0YWJsZU5hbWUpKS5zZXROYW1lKCJ0YWJsZXMiKQogICAgCiAgICBzaW1wbGVTUUwgICAgICA9IHNlbGVjdFRva2VuKCJjb21tYW5kIikgKyBjb2x1bW5TcGVjKCJjb2x1bW5zIikgKyBmcm9tVG9rZW4gKyB0YWJsZU5hbWVMaXN0KCJ0YWJsZXMiKQoKICAgICMgZGVtbyBydW5UZXN0cyBtZXRob2QsIGluY2x1ZGluZyBlbWJlZGRlZCBjb21tZW50cyBpbiB0ZXN0IHN0cmluZwogICAgc2ltcGxlU1FMLnJ1blRlc3RzKCIiIgogICAgICAgICMgJyonIGFzIGNvbHVtbiBsaXN0IGFuZCBkb3R0ZWQgdGFibGUgbmFtZQogICAgICAgIHNlbGVjdCAqIGZyb20gU1lTLlhZWlpZCgogICAgICAgICMgY2FzZWxlc3MgbWF0Y2ggb24gIlNFTEVDVCIsIGFuZCBjYXN0cyBiYWNrIHRvICJzZWxlY3QiCiAgICAgICAgU0VMRUNUICogZnJvbSBYWVpaWSwgQUJDCgogICAgICAgICMgbGlzdCBvZiBjb2x1bW4gbmFtZXMsIGFuZCBtaXhlZCBjYXNlIFNFTEVDVCBrZXl3b3JkCiAgICAgICAgU2VsZWN0IEFBLEJCLENDIGZyb20gU3lzLmR1YWwKCiAgICAgICAgIyBtdWx0aXBsZSB0YWJsZXMKICAgICAgICBTZWxlY3QgQSwgQiwgQyBmcm9tIFN5cy5kdWFsLCBUYWJsZTIKCiAgICAgICAgIyBpbnZhbGlkIFNFTEVDVCBrZXl3b3JkIC0gc2hvdWxkIGZhaWwKICAgICAgICBYZWxlY3QgQSwgQiwgQyBmcm9tIFN5cy5kdWFsCgogICAgICAgICMgaW5jb21wbGV0ZSBjb21tYW5kIC0gc2hvdWxkIGZhaWwKICAgICAgICBTZWxlY3QKCiAgICAgICAgIyBpbnZhbGlkIGNvbHVtbiBuYW1lIC0gc2hvdWxkIGZhaWwKICAgICAgICBTZWxlY3QgXl5eIGZyb3ggU3lzLmR1YWwKCiAgICAgICAgIiIiKQoKICAgIHB5cGFyc2luZ19jb21tb24ubnVtYmVyLnJ1blRlc3RzKCIiIgogICAgICAgIDEwMAogICAgICAgIC0xMDAKICAgICAgICArMTAwCiAgICAgICAgMy4xNDE1OQogICAgICAgIDYuMDJlMjMKICAgICAgICAxZS0xMgogICAgICAgICIiIikKCiAgICAjIGFueSBpbnQgb3IgcmVhbCBudW1iZXIsIHJldHVybmVkIGFzIGZsb2F0CiAgICBweXBhcnNpbmdfY29tbW9uLmZudW1iZXIucnVuVGVzdHMoIiIiCiAgICAgICAgMTAwCiAgICAgICAgLTEwMAogICAgICAgICsxMDAKICAgICAgICAzLjE0MTU5CiAgICAgICAgNi4wMmUyMwogICAgICAgIDFlLTEyCiAgICAgICAgIiIiKQoKICAgIHB5cGFyc2luZ19jb21tb24uaGV4X2ludGVnZXIucnVuVGVzdHMoIiIiCiAgICAgICAgMTAwCiAgICAgICAgRkYKICAgICAgICAiIiIpCgogICAgaW1wb3J0IHV1aWQKICAgIHB5cGFyc2luZ19jb21tb24udXVpZC5zZXRQYXJzZUFjdGlvbih0b2tlbk1hcCh1dWlkLlVVSUQpKQogICAgcHlwYXJzaW5nX2NvbW1vbi51dWlkLnJ1blRlc3RzKCIiIgogICAgICAgIDEyMzQ1Njc4LTEyMzQtNTY3OC0xMjM0LTU2NzgxMjM0NTY3OAogICAgICAgICIiIikKUEsDBBQAAAAAAAAAIQBgHgeNBQMAAAUDAAA1AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9yZS12ZW5kb3IucHlpbXBvcnQgb3MKaW1wb3J0IHN5cwppbXBvcnQgcGlwCmltcG9ydCBnbG9iCmltcG9ydCBzaHV0aWwKCmhlcmUgPSBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSkKCmRlZiB1c2FnZSgpOgogICAgcHJpbnQoIlVzYWdlOiByZS12ZW5kb3IucHkgW2NsZWFufHZlbmRvcl0iKQogICAgc3lzLmV4aXQoMSkKCmRlZiBjbGVhbigpOgogICAgZm9yIGZuIGluIG9zLmxpc3RkaXIoaGVyZSk6CiAgICAgICAgZGlybmFtZSA9IG9zLnBhdGguam9pbihoZXJlLCBmbikKICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGRpcm5hbWUpOgogICAgICAgICAgICBzaHV0aWwucm10cmVlKGRpcm5hbWUpCiAgICAjIHNpeCBpcyBhIHNpbmdsZSBmaWxlLCBub3QgYSBwYWNrYWdlCiAgICBvcy51bmxpbmsob3MucGF0aC5qb2luKGhlcmUsICdzaXgucHknKSkKCmRlZiB2ZW5kb3IoKToKICAgIHBpcC5tYWluKFsnaW5zdGFsbCcsICctdCcsIGhlcmUsICctcicsICd2ZW5kb3IudHh0J10pCiAgICBmb3IgZGlybmFtZSBpbiBnbG9iLmdsb2IoJyouZWdnLWluZm8nKToKICAgICAgICBzaHV0aWwucm10cmVlKGRpcm5hbWUpCgppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgaWYgbGVuKHN5cy5hcmd2KSAhPSAyOgogICAgICAgIHVzYWdlKCkKICAgIGlmIHN5cy5hcmd2WzFdID09ICdjbGVhbic6CiAgICAgICAgY2xlYW4oKQogICAgZWxpZiBzeXMuYXJndlsxXSA9PSAndmVuZG9yJzoKICAgICAgICB2ZW5kb3IoKQogICAgZWxzZToKICAgICAgICB1c2FnZSgpClBLAwQUAAAAAAAAACEAH8buMPcNAAD3DQAAPQAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvX19pbml0X18ucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQoKIyAgIF9fCiMgIC9fXykgIF8gIF8gICAgIF8gICBfIF8vICAgXwojIC8gKCAgICgtICgvICgvICgtIF8pICAvICBfKQojICAgICAgICAgIC8KCiIiIgpSZXF1ZXN0cyBIVFRQIExpYnJhcnkKfn5+fn5+fn5+fn5+fn5+fn5+fn5+CgpSZXF1ZXN0cyBpcyBhbiBIVFRQIGxpYnJhcnksIHdyaXR0ZW4gaW4gUHl0aG9uLCBmb3IgaHVtYW4gYmVpbmdzLiBCYXNpYyBHRVQKdXNhZ2U6CgogICA+Pj4gaW1wb3J0IHJlcXVlc3RzCiAgID4+PiByID0gcmVxdWVzdHMuZ2V0KCdodHRwczovL3d3dy5weXRob24ub3JnJykKICAgPj4+IHIuc3RhdHVzX2NvZGUKICAgMjAwCiAgID4+PiAnUHl0aG9uIGlzIGEgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UnIGluIHIuY29udGVudAogICBUcnVlCgouLi4gb3IgUE9TVDoKCiAgID4+PiBwYXlsb2FkID0gZGljdChrZXkxPSd2YWx1ZTEnLCBrZXkyPSd2YWx1ZTInKQogICA+Pj4gciA9IHJlcXVlc3RzLnBvc3QoJ2h0dHA6Ly9odHRwYmluLm9yZy9wb3N0JywgZGF0YT1wYXlsb2FkKQogICA+Pj4gcHJpbnQoci50ZXh0KQogICB7CiAgICAgLi4uCiAgICAgImZvcm0iOiB7CiAgICAgICAia2V5MiI6ICJ2YWx1ZTIiLAogICAgICAgImtleTEiOiAidmFsdWUxIgogICAgIH0sCiAgICAgLi4uCiAgIH0KClRoZSBvdGhlciBIVFRQIG1ldGhvZHMgYXJlIHN1cHBvcnRlZCAtIHNlZSBgcmVxdWVzdHMuYXBpYC4gRnVsbCBkb2N1bWVudGF0aW9uCmlzIGF0IDxodHRwOi8vcHl0aG9uLXJlcXVlc3RzLm9yZz4uCgo6Y29weXJpZ2h0OiAoYykgMjAxNyBieSBLZW5uZXRoIFJlaXR6Lgo6bGljZW5zZTogQXBhY2hlIDIuMCwgc2VlIExJQ0VOU0UgZm9yIG1vcmUgZGV0YWlscy4KIiIiCgpmcm9tIHBpcC5fdmVuZG9yIGltcG9ydCB1cmxsaWIzCmZyb20gcGlwLl92ZW5kb3IgaW1wb3J0IGNoYXJkZXQKaW1wb3J0IHdhcm5pbmdzCmZyb20gLmV4Y2VwdGlvbnMgaW1wb3J0IFJlcXVlc3RzRGVwZW5kZW5jeVdhcm5pbmcKCgpkZWYgY2hlY2tfY29tcGF0aWJpbGl0eSh1cmxsaWIzX3ZlcnNpb24sIGNoYXJkZXRfdmVyc2lvbik6CiAgICB1cmxsaWIzX3ZlcnNpb24gPSB1cmxsaWIzX3ZlcnNpb24uc3BsaXQoJy4nKQogICAgYXNzZXJ0IHVybGxpYjNfdmVyc2lvbiAhPSBbJ2RldiddICAjIFZlcmlmeSB1cmxsaWIzIGlzbid0IGluc3RhbGxlZCBmcm9tIGdpdC4KCiAgICAjIFNvbWV0aW1lcywgdXJsbGliMyBvbmx5IHJlcG9ydHMgaXRzIHZlcnNpb24gYXMgMTYuMS4KICAgIGlmIGxlbih1cmxsaWIzX3ZlcnNpb24pID09IDI6CiAgICAgICAgdXJsbGliM192ZXJzaW9uLmFwcGVuZCgnMCcpCgogICAgIyBDaGVjayB1cmxsaWIzIGZvciBjb21wYXRpYmlsaXR5LgogICAgbWFqb3IsIG1pbm9yLCBwYXRjaCA9IHVybGxpYjNfdmVyc2lvbiAgIyBub3FhOiBGODExCiAgICBtYWpvciwgbWlub3IsIHBhdGNoID0gaW50KG1ham9yKSwgaW50KG1pbm9yKSwgaW50KHBhdGNoKQogICAgIyB1cmxsaWIzID49IDEuMjEuMSwgPD0gMS4yMgogICAgYXNzZXJ0IG1ham9yID09IDEKICAgIGFzc2VydCBtaW5vciA+PSAyMQogICAgYXNzZXJ0IG1pbm9yIDw9IDIyCgogICAgIyBDaGVjayBjaGFyZGV0IGZvciBjb21wYXRpYmlsaXR5LgogICAgbWFqb3IsIG1pbm9yLCBwYXRjaCA9IGNoYXJkZXRfdmVyc2lvbi5zcGxpdCgnLicpWzozXQogICAgbWFqb3IsIG1pbm9yLCBwYXRjaCA9IGludChtYWpvciksIGludChtaW5vciksIGludChwYXRjaCkKICAgICMgY2hhcmRldCA+PSAzLjAuMiwgPCAzLjEuMAogICAgYXNzZXJ0IG1ham9yID09IDMKICAgIGFzc2VydCBtaW5vciA8IDEKICAgIGFzc2VydCBwYXRjaCA+PSAyCgoKIyBDaGVjayBpbXBvcnRlZCBkZXBlbmRlbmNpZXMgZm9yIGNvbXBhdGliaWxpdHkuCnRyeToKICAgIGNoZWNrX2NvbXBhdGliaWxpdHkodXJsbGliMy5fX3ZlcnNpb25fXywgY2hhcmRldC5fX3ZlcnNpb25fXykKZXhjZXB0IChBc3NlcnRpb25FcnJvciwgVmFsdWVFcnJvcik6CiAgICB3YXJuaW5ncy53YXJuKCJ1cmxsaWIzICh7MH0pIG9yIGNoYXJkZXQgKHsxfSkgZG9lc24ndCBtYXRjaCBhIHN1cHBvcnRlZCAiCiAgICAgICAgICAgICAgICAgICJ2ZXJzaW9uISIuZm9ybWF0KHVybGxpYjMuX192ZXJzaW9uX18sIGNoYXJkZXQuX192ZXJzaW9uX18pLAogICAgICAgICAgICAgICAgICBSZXF1ZXN0c0RlcGVuZGVuY3lXYXJuaW5nKQoKIyBBdHRlbXB0IHRvIGVuYWJsZSB1cmxsaWIzJ3MgU05JIHN1cHBvcnQsIGlmIHBvc3NpYmxlCiMgdHJ5OgojICAgICBmcm9tIHBpcC5fdmVuZG9yLnVybGxpYjMuY29udHJpYiBpbXBvcnQgcHlvcGVuc3NsCiMgICAgIHB5b3BlbnNzbC5pbmplY3RfaW50b191cmxsaWIzKCkKIyBleGNlcHQgSW1wb3J0RXJyb3I6CiMgICAgIHBhc3MKCiMgdXJsbGliMydzIERlcGVuZGVuY3lXYXJuaW5ncyBzaG91bGQgYmUgc2lsZW5jZWQuCmZyb20gcGlwLl92ZW5kb3IudXJsbGliMy5leGNlcHRpb25zIGltcG9ydCBEZXBlbmRlbmN5V2FybmluZwp3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoJ2lnbm9yZScsIERlcGVuZGVuY3lXYXJuaW5nKQoKZnJvbSAuX192ZXJzaW9uX18gaW1wb3J0IF9fdGl0bGVfXywgX19kZXNjcmlwdGlvbl9fLCBfX3VybF9fLCBfX3ZlcnNpb25fXwpmcm9tIC5fX3ZlcnNpb25fXyBpbXBvcnQgX19idWlsZF9fLCBfX2F1dGhvcl9fLCBfX2F1dGhvcl9lbWFpbF9fLCBfX2xpY2Vuc2VfXwpmcm9tIC5fX3ZlcnNpb25fXyBpbXBvcnQgX19jb3B5cmlnaHRfXywgX19jYWtlX18KCmZyb20gLiBpbXBvcnQgdXRpbHMKZnJvbSAuIGltcG9ydCBwYWNrYWdlcwpmcm9tIC5tb2RlbHMgaW1wb3J0IFJlcXVlc3QsIFJlc3BvbnNlLCBQcmVwYXJlZFJlcXVlc3QKZnJvbSAuYXBpIGltcG9ydCByZXF1ZXN0LCBnZXQsIGhlYWQsIHBvc3QsIHBhdGNoLCBwdXQsIGRlbGV0ZSwgb3B0aW9ucwpmcm9tIC5zZXNzaW9ucyBpbXBvcnQgc2Vzc2lvbiwgU2Vzc2lvbgpmcm9tIC5zdGF0dXNfY29kZXMgaW1wb3J0IGNvZGVzCmZyb20gLmV4Y2VwdGlvbnMgaW1wb3J0ICgKICAgIFJlcXVlc3RFeGNlcHRpb24sIFRpbWVvdXQsIFVSTFJlcXVpcmVkLAogICAgVG9vTWFueVJlZGlyZWN0cywgSFRUUEVycm9yLCBDb25uZWN0aW9uRXJyb3IsCiAgICBGaWxlTW9kZVdhcm5pbmcsIENvbm5lY3RUaW1lb3V0LCBSZWFkVGltZW91dAopCgojIFNldCBkZWZhdWx0IGxvZ2dpbmcgaGFuZGxlciB0byBhdm9pZCAiTm8gaGFuZGxlciBmb3VuZCIgd2FybmluZ3MuCmltcG9ydCBsb2dnaW5nCnRyeTogICMgUHl0aG9uIDIuNysKICAgIGZyb20gbG9nZ2luZyBpbXBvcnQgTnVsbEhhbmRsZXIKZXhjZXB0IEltcG9ydEVycm9yOgogICAgY2xhc3MgTnVsbEhhbmRsZXIobG9nZ2luZy5IYW5kbGVyKToKICAgICAgICBkZWYgZW1pdChzZWxmLCByZWNvcmQpOgogICAgICAgICAgICBwYXNzCgpsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykuYWRkSGFuZGxlcihOdWxsSGFuZGxlcigpKQoKIyBGaWxlTW9kZVdhcm5pbmdzIGdvIG9mZiBwZXIgdGhlIGRlZmF1bHQuCndhcm5pbmdzLnNpbXBsZWZpbHRlcignZGVmYXVsdCcsIEZpbGVNb2RlV2FybmluZywgYXBwZW5kPVRydWUpClBLAwQUAAAAAAAAACEA33x5JbQBAAC0AQAAQAAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvX192ZXJzaW9uX18ucHkjIC4tLiAuLS4gLi0uIC4gLiAuLS4gLi0uIC4tLiAuLS4KIyB8KCAgfC0gIHwufCB8IHwgfC0gIGAtLiAgfCAgYC0uCiMgJyAnIGAtJyBgLWAuYC0nIGAtJyBgLScgICcgIGAtJwoKX190aXRsZV9fID0gJ3JlcXVlc3RzJwpfX2Rlc2NyaXB0aW9uX18gPSAnUHl0aG9uIEhUVFAgZm9yIEh1bWFucy4nCl9fdXJsX18gPSAnaHR0cDovL3B5dGhvbi1yZXF1ZXN0cy5vcmcnCl9fdmVyc2lvbl9fID0gJzIuMTguNCcKX19idWlsZF9fID0gMHgwMjE4MDQKX19hdXRob3JfXyA9ICdLZW5uZXRoIFJlaXR6JwpfX2F1dGhvcl9lbWFpbF9fID0gJ21lQGtlbm5ldGhyZWl0ei5vcmcnCl9fbGljZW5zZV9fID0gJ0FwYWNoZSAyLjAnCl9fY29weXJpZ2h0X18gPSAnQ29weXJpZ2h0IDIwMTcgS2VubmV0aCBSZWl0eicKX19jYWtlX18gPSB1J1x1MjcyOCBcVTAwMDFmMzcwIFx1MjcyOCcKUEsDBBQAAAAAAAAAIQCIqTm7SAQAAEgEAABEAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9yZXF1ZXN0cy9faW50ZXJuYWxfdXRpbHMucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQoKIiIiCnJlcXVlc3RzLl9pbnRlcm5hbF91dGlscwp+fn5+fn5+fn5+fn5+fgoKUHJvdmlkZXMgdXRpbGl0eSBmdW5jdGlvbnMgdGhhdCBhcmUgY29uc3VtZWQgaW50ZXJuYWxseSBieSBSZXF1ZXN0cwp3aGljaCBkZXBlbmQgb24gZXh0cmVtZWx5IGZldyBleHRlcm5hbCBoZWxwZXJzIChzdWNoIGFzIGNvbXBhdCkKIiIiCgpmcm9tIC5jb21wYXQgaW1wb3J0IGlzX3B5MiwgYnVpbHRpbl9zdHIsIHN0cgoKCmRlZiB0b19uYXRpdmVfc3RyaW5nKHN0cmluZywgZW5jb2Rpbmc9J2FzY2lpJyk6CiAgICAiIiJHaXZlbiBhIHN0cmluZyBvYmplY3QsIHJlZ2FyZGxlc3Mgb2YgdHlwZSwgcmV0dXJucyBhIHJlcHJlc2VudGF0aW9uIG9mCiAgICB0aGF0IHN0cmluZyBpbiB0aGUgbmF0aXZlIHN0cmluZyB0eXBlLCBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgd2hlcmUKICAgIG5lY2Vzc2FyeS4gVGhpcyBhc3N1bWVzIEFTQ0lJIHVubGVzcyB0b2xkIG90aGVyd2lzZS4KICAgICIiIgogICAgaWYgaXNpbnN0YW5jZShzdHJpbmcsIGJ1aWx0aW5fc3RyKToKICAgICAgICBvdXQgPSBzdHJpbmcKICAgIGVsc2U6CiAgICAgICAgaWYgaXNfcHkyOgogICAgICAgICAgICBvdXQgPSBzdHJpbmcuZW5jb2RlKGVuY29kaW5nKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG91dCA9IHN0cmluZy5kZWNvZGUoZW5jb2RpbmcpCgogICAgcmV0dXJuIG91dAoKCmRlZiB1bmljb2RlX2lzX2FzY2lpKHVfc3RyaW5nKToKICAgICIiIkRldGVybWluZSBpZiB1bmljb2RlIHN0cmluZyBvbmx5IGNvbnRhaW5zIEFTQ0lJIGNoYXJhY3RlcnMuCgogICAgOnBhcmFtIHN0ciB1X3N0cmluZzogdW5pY29kZSBzdHJpbmcgdG8gY2hlY2suIE11c3QgYmUgdW5pY29kZQogICAgICAgIGFuZCBub3QgUHl0aG9uIDIgYHN0cmAuCiAgICA6cnR5cGU6IGJvb2wKICAgICIiIgogICAgYXNzZXJ0IGlzaW5zdGFuY2UodV9zdHJpbmcsIHN0cikKICAgIHRyeToKICAgICAgICB1X3N0cmluZy5lbmNvZGUoJ2FzY2lpJykKICAgICAgICByZXR1cm4gVHJ1ZQogICAgZXhjZXB0IFVuaWNvZGVFbmNvZGVFcnJvcjoKICAgICAgICByZXR1cm4gRmFsc2UKUEsDBBQAAAAAAAAAIQAjUN5SGFIAABhSAAA9AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9yZXF1ZXN0cy9hZGFwdGVycy5weSMgLSotIGNvZGluZzogdXRmLTggLSotCgoiIiIKcmVxdWVzdHMuYWRhcHRlcnMKfn5+fn5+fn5+fn5+fn5+fn4KClRoaXMgbW9kdWxlIGNvbnRhaW5zIHRoZSB0cmFuc3BvcnQgYWRhcHRlcnMgdGhhdCBSZXF1ZXN0cyB1c2VzIHRvIGRlZmluZQphbmQgbWFpbnRhaW4gY29ubmVjdGlvbnMuCiIiIgoKaW1wb3J0IG9zLnBhdGgKaW1wb3J0IHNvY2tldAoKZnJvbSBwaXAuX3ZlbmRvci51cmxsaWIzLnBvb2xtYW5hZ2VyIGltcG9ydCBQb29sTWFuYWdlciwgcHJveHlfZnJvbV91cmwKZnJvbSBwaXAuX3ZlbmRvci51cmxsaWIzLnJlc3BvbnNlIGltcG9ydCBIVFRQUmVzcG9uc2UKZnJvbSBwaXAuX3ZlbmRvci51cmxsaWIzLnV0aWwgaW1wb3J0IFRpbWVvdXQgYXMgVGltZW91dFNhdWNlCmZyb20gcGlwLl92ZW5kb3IudXJsbGliMy51dGlsLnJldHJ5IGltcG9ydCBSZXRyeQpmcm9tIHBpcC5fdmVuZG9yLnVybGxpYjMuZXhjZXB0aW9ucyBpbXBvcnQgQ2xvc2VkUG9vbEVycm9yCmZyb20gcGlwLl92ZW5kb3IudXJsbGliMy5leGNlcHRpb25zIGltcG9ydCBDb25uZWN0VGltZW91dEVycm9yCmZyb20gcGlwLl92ZW5kb3IudXJsbGliMy5leGNlcHRpb25zIGltcG9ydCBIVFRQRXJyb3IgYXMgX0hUVFBFcnJvcgpmcm9tIHBpcC5fdmVuZG9yLnVybGxpYjMuZXhjZXB0aW9ucyBpbXBvcnQgTWF4UmV0cnlFcnJvcgpmcm9tIHBpcC5fdmVuZG9yLnVybGxpYjMuZXhjZXB0aW9ucyBpbXBvcnQgTmV3Q29ubmVjdGlvbkVycm9yCmZyb20gcGlwLl92ZW5kb3IudXJsbGliMy5leGNlcHRpb25zIGltcG9ydCBQcm94eUVycm9yIGFzIF9Qcm94eUVycm9yCmZyb20gcGlwLl92ZW5kb3IudXJsbGliMy5leGNlcHRpb25zIGltcG9ydCBQcm90b2NvbEVycm9yCmZyb20gcGlwLl92ZW5kb3IudXJsbGliMy5leGNlcHRpb25zIGltcG9ydCBSZWFkVGltZW91dEVycm9yCmZyb20gcGlwLl92ZW5kb3IudXJsbGliMy5leGNlcHRpb25zIGltcG9ydCBTU0xFcnJvciBhcyBfU1NMRXJyb3IKZnJvbSBwaXAuX3ZlbmRvci51cmxsaWIzLmV4Y2VwdGlvbnMgaW1wb3J0IFJlc3BvbnNlRXJyb3IKCmZyb20gLm1vZGVscyBpbXBvcnQgUmVzcG9uc2UKZnJvbSAuY29tcGF0IGltcG9ydCB1cmxwYXJzZSwgYmFzZXN0cmluZwpmcm9tIC51dGlscyBpbXBvcnQgKERFRkFVTFRfQ0FfQlVORExFX1BBVEgsIGdldF9lbmNvZGluZ19mcm9tX2hlYWRlcnMsCiAgICAgICAgICAgICAgICAgICAgcHJlcGVuZF9zY2hlbWVfaWZfbmVlZGVkLCBnZXRfYXV0aF9mcm9tX3VybCwgdXJsZGVmcmFnYXV0aCwKICAgICAgICAgICAgICAgICAgICBzZWxlY3RfcHJveHkpCmZyb20gLnN0cnVjdHVyZXMgaW1wb3J0IENhc2VJbnNlbnNpdGl2ZURpY3QKZnJvbSAuY29va2llcyBpbXBvcnQgZXh0cmFjdF9jb29raWVzX3RvX2phcgpmcm9tIC5leGNlcHRpb25zIGltcG9ydCAoQ29ubmVjdGlvbkVycm9yLCBDb25uZWN0VGltZW91dCwgUmVhZFRpbWVvdXQsIFNTTEVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgUHJveHlFcnJvciwgUmV0cnlFcnJvciwgSW52YWxpZFNjaGVtYSkKZnJvbSAuYXV0aCBpbXBvcnQgX2Jhc2ljX2F1dGhfc3RyCgp0cnk6CiAgICBmcm9tIHBpcC5fdmVuZG9yLnVybGxpYjMuY29udHJpYi5zb2NrcyBpbXBvcnQgU09DS1NQcm94eU1hbmFnZXIKZXhjZXB0IEltcG9ydEVycm9yOgogICAgZGVmIFNPQ0tTUHJveHlNYW5hZ2VyKCphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgcmFpc2UgSW52YWxpZFNjaGVtYSgiTWlzc2luZyBkZXBlbmRlbmNpZXMgZm9yIFNPQ0tTIHN1cHBvcnQuIikKCkRFRkFVTFRfUE9PTEJMT0NLID0gRmFsc2UKREVGQVVMVF9QT09MU0laRSA9IDEwCkRFRkFVTFRfUkVUUklFUyA9IDAKREVGQVVMVF9QT09MX1RJTUVPVVQgPSBOb25lCgoKY2xhc3MgQmFzZUFkYXB0ZXIob2JqZWN0KToKICAgICIiIlRoZSBCYXNlIFRyYW5zcG9ydCBBZGFwdGVyIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHN1cGVyKEJhc2VBZGFwdGVyLCBzZWxmKS5fX2luaXRfXygpCgogICAgZGVmIHNlbmQoc2VsZiwgcmVxdWVzdCwgc3RyZWFtPUZhbHNlLCB0aW1lb3V0PU5vbmUsIHZlcmlmeT1UcnVlLAogICAgICAgICAgICAgY2VydD1Ob25lLCBwcm94aWVzPU5vbmUpOgogICAgICAgICIiIlNlbmRzIFByZXBhcmVkUmVxdWVzdCBvYmplY3QuIFJldHVybnMgUmVzcG9uc2Ugb2JqZWN0LgoKICAgICAgICA6cGFyYW0gcmVxdWVzdDogVGhlIDpjbGFzczpgUHJlcGFyZWRSZXF1ZXN0IDxQcmVwYXJlZFJlcXVlc3Q+YCBiZWluZyBzZW50LgogICAgICAgIDpwYXJhbSBzdHJlYW06IChvcHRpb25hbCkgV2hldGhlciB0byBzdHJlYW0gdGhlIHJlcXVlc3QgY29udGVudC4KICAgICAgICA6cGFyYW0gdGltZW91dDogKG9wdGlvbmFsKSBIb3cgbG9uZyB0byB3YWl0IGZvciB0aGUgc2VydmVyIHRvIHNlbmQKICAgICAgICAgICAgZGF0YSBiZWZvcmUgZ2l2aW5nIHVwLCBhcyBhIGZsb2F0LCBvciBhIDpyZWY6YChjb25uZWN0IHRpbWVvdXQsCiAgICAgICAgICAgIHJlYWQgdGltZW91dCkgPHRpbWVvdXRzPmAgdHVwbGUuCiAgICAgICAgOnR5cGUgdGltZW91dDogZmxvYXQgb3IgdHVwbGUKICAgICAgICA6cGFyYW0gdmVyaWZ5OiAob3B0aW9uYWwpIEVpdGhlciBhIGJvb2xlYW4sIGluIHdoaWNoIGNhc2UgaXQgY29udHJvbHMgd2hldGhlciB3ZSB2ZXJpZnkKICAgICAgICAgICAgdGhlIHNlcnZlcidzIFRMUyBjZXJ0aWZpY2F0ZSwgb3IgYSBzdHJpbmcsIGluIHdoaWNoIGNhc2UgaXQgbXVzdCBiZSBhIHBhdGgKICAgICAgICAgICAgdG8gYSBDQSBidW5kbGUgdG8gdXNlCiAgICAgICAgOnBhcmFtIGNlcnQ6IChvcHRpb25hbCkgQW55IHVzZXItcHJvdmlkZWQgU1NMIGNlcnRpZmljYXRlIHRvIGJlIHRydXN0ZWQuCiAgICAgICAgOnBhcmFtIHByb3hpZXM6IChvcHRpb25hbCkgVGhlIHByb3hpZXMgZGljdGlvbmFyeSB0byBhcHBseSB0byB0aGUgcmVxdWVzdC4KICAgICAgICAiIiIKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCgogICAgZGVmIGNsb3NlKHNlbGYpOgogICAgICAgICIiIkNsZWFucyB1cCBhZGFwdGVyIHNwZWNpZmljIGl0ZW1zLiIiIgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKCgpjbGFzcyBIVFRQQWRhcHRlcihCYXNlQWRhcHRlcik6CiAgICAiIiJUaGUgYnVpbHQtaW4gSFRUUCBBZGFwdGVyIGZvciB1cmxsaWIzLgoKICAgIFByb3ZpZGVzIGEgZ2VuZXJhbC1jYXNlIGludGVyZmFjZSBmb3IgUmVxdWVzdHMgc2Vzc2lvbnMgdG8gY29udGFjdCBIVFRQIGFuZAogICAgSFRUUFMgdXJscyBieSBpbXBsZW1lbnRpbmcgdGhlIFRyYW5zcG9ydCBBZGFwdGVyIGludGVyZmFjZS4gVGhpcyBjbGFzcyB3aWxsCiAgICB1c3VhbGx5IGJlIGNyZWF0ZWQgYnkgdGhlIDpjbGFzczpgU2Vzc2lvbiA8U2Vzc2lvbj5gIGNsYXNzIHVuZGVyIHRoZQogICAgY292ZXJzLgoKICAgIDpwYXJhbSBwb29sX2Nvbm5lY3Rpb25zOiBUaGUgbnVtYmVyIG9mIHVybGxpYjMgY29ubmVjdGlvbiBwb29scyB0byBjYWNoZS4KICAgIDpwYXJhbSBwb29sX21heHNpemU6IFRoZSBtYXhpbXVtIG51bWJlciBvZiBjb25uZWN0aW9ucyB0byBzYXZlIGluIHRoZSBwb29sLgogICAgOnBhcmFtIG1heF9yZXRyaWVzOiBUaGUgbWF4aW11bSBudW1iZXIgb2YgcmV0cmllcyBlYWNoIGNvbm5lY3Rpb24KICAgICAgICBzaG91bGQgYXR0ZW1wdC4gTm90ZSwgdGhpcyBhcHBsaWVzIG9ubHkgdG8gZmFpbGVkIEROUyBsb29rdXBzLCBzb2NrZXQKICAgICAgICBjb25uZWN0aW9ucyBhbmQgY29ubmVjdGlvbiB0aW1lb3V0cywgbmV2ZXIgdG8gcmVxdWVzdHMgd2hlcmUgZGF0YSBoYXMKICAgICAgICBtYWRlIGl0IHRvIHRoZSBzZXJ2ZXIuIEJ5IGRlZmF1bHQsIFJlcXVlc3RzIGRvZXMgbm90IHJldHJ5IGZhaWxlZAogICAgICAgIGNvbm5lY3Rpb25zLiBJZiB5b3UgbmVlZCBncmFudWxhciBjb250cm9sIG92ZXIgdGhlIGNvbmRpdGlvbnMgdW5kZXIKICAgICAgICB3aGljaCB3ZSByZXRyeSBhIHJlcXVlc3QsIGltcG9ydCB1cmxsaWIzJ3MgYGBSZXRyeWBgIGNsYXNzIGFuZCBwYXNzCiAgICAgICAgdGhhdCBpbnN0ZWFkLgogICAgOnBhcmFtIHBvb2xfYmxvY2s6IFdoZXRoZXIgdGhlIGNvbm5lY3Rpb24gcG9vbCBzaG91bGQgYmxvY2sgZm9yIGNvbm5lY3Rpb25zLgoKICAgIFVzYWdlOjoKCiAgICAgID4+PiBpbXBvcnQgcmVxdWVzdHMKICAgICAgPj4+IHMgPSByZXF1ZXN0cy5TZXNzaW9uKCkKICAgICAgPj4+IGEgPSByZXF1ZXN0cy5hZGFwdGVycy5IVFRQQWRhcHRlcihtYXhfcmV0cmllcz0zKQogICAgICA+Pj4gcy5tb3VudCgnaHR0cDovLycsIGEpCiAgICAiIiIKICAgIF9fYXR0cnNfXyA9IFsnbWF4X3JldHJpZXMnLCAnY29uZmlnJywgJ19wb29sX2Nvbm5lY3Rpb25zJywgJ19wb29sX21heHNpemUnLAogICAgICAgICAgICAgICAgICdfcG9vbF9ibG9jayddCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHBvb2xfY29ubmVjdGlvbnM9REVGQVVMVF9QT09MU0laRSwKICAgICAgICAgICAgICAgICBwb29sX21heHNpemU9REVGQVVMVF9QT09MU0laRSwgbWF4X3JldHJpZXM9REVGQVVMVF9SRVRSSUVTLAogICAgICAgICAgICAgICAgIHBvb2xfYmxvY2s9REVGQVVMVF9QT09MQkxPQ0spOgogICAgICAgIGlmIG1heF9yZXRyaWVzID09IERFRkFVTFRfUkVUUklFUzoKICAgICAgICAgICAgc2VsZi5tYXhfcmV0cmllcyA9IFJldHJ5KDAsIHJlYWQ9RmFsc2UpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5tYXhfcmV0cmllcyA9IFJldHJ5LmZyb21faW50KG1heF9yZXRyaWVzKQogICAgICAgIHNlbGYuY29uZmlnID0ge30KICAgICAgICBzZWxmLnByb3h5X21hbmFnZXIgPSB7fQoKICAgICAgICBzdXBlcihIVFRQQWRhcHRlciwgc2VsZikuX19pbml0X18oKQoKICAgICAgICBzZWxmLl9wb29sX2Nvbm5lY3Rpb25zID0gcG9vbF9jb25uZWN0aW9ucwogICAgICAgIHNlbGYuX3Bvb2xfbWF4c2l6ZSA9IHBvb2xfbWF4c2l6ZQogICAgICAgIHNlbGYuX3Bvb2xfYmxvY2sgPSBwb29sX2Jsb2NrCgogICAgICAgIHNlbGYuaW5pdF9wb29sbWFuYWdlcihwb29sX2Nvbm5lY3Rpb25zLCBwb29sX21heHNpemUsIGJsb2NrPXBvb2xfYmxvY2spCgogICAgZGVmIF9fZ2V0c3RhdGVfXyhzZWxmKToKICAgICAgICByZXR1cm4gZGljdCgoYXR0ciwgZ2V0YXR0cihzZWxmLCBhdHRyLCBOb25lKSkgZm9yIGF0dHIgaW4KICAgICAgICAgICAgICAgICAgICBzZWxmLl9fYXR0cnNfXykKCiAgICBkZWYgX19zZXRzdGF0ZV9fKHNlbGYsIHN0YXRlKToKICAgICAgICAjIENhbid0IGhhbmRsZSBieSBhZGRpbmcgJ3Byb3h5X21hbmFnZXInIHRvIHNlbGYuX19hdHRyc19fIGJlY2F1c2UKICAgICAgICAjIHNlbGYucG9vbG1hbmFnZXIgdXNlcyBhIGxhbWJkYSBmdW5jdGlvbiwgd2hpY2ggaXNuJ3QgcGlja2xlYWJsZS4KICAgICAgICBzZWxmLnByb3h5X21hbmFnZXIgPSB7fQogICAgICAgIHNlbGYuY29uZmlnID0ge30KCiAgICAgICAgZm9yIGF0dHIsIHZhbHVlIGluIHN0YXRlLml0ZW1zKCk6CiAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgYXR0ciwgdmFsdWUpCgogICAgICAgIHNlbGYuaW5pdF9wb29sbWFuYWdlcihzZWxmLl9wb29sX2Nvbm5lY3Rpb25zLCBzZWxmLl9wb29sX21heHNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrPXNlbGYuX3Bvb2xfYmxvY2spCgogICAgZGVmIGluaXRfcG9vbG1hbmFnZXIoc2VsZiwgY29ubmVjdGlvbnMsIG1heHNpemUsIGJsb2NrPURFRkFVTFRfUE9PTEJMT0NLLCAqKnBvb2xfa3dhcmdzKToKICAgICAgICAiIiJJbml0aWFsaXplcyBhIHVybGxpYjMgUG9vbE1hbmFnZXIuCgogICAgICAgIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgY2FsbGVkIGZyb20gdXNlciBjb2RlLCBhbmQgaXMgb25seQogICAgICAgIGV4cG9zZWQgZm9yIHVzZSB3aGVuIHN1YmNsYXNzaW5nIHRoZQogICAgICAgIDpjbGFzczpgSFRUUEFkYXB0ZXIgPHJlcXVlc3RzLmFkYXB0ZXJzLkhUVFBBZGFwdGVyPmAuCgogICAgICAgIDpwYXJhbSBjb25uZWN0aW9uczogVGhlIG51bWJlciBvZiB1cmxsaWIzIGNvbm5lY3Rpb24gcG9vbHMgdG8gY2FjaGUuCiAgICAgICAgOnBhcmFtIG1heHNpemU6IFRoZSBtYXhpbXVtIG51bWJlciBvZiBjb25uZWN0aW9ucyB0byBzYXZlIGluIHRoZSBwb29sLgogICAgICAgIDpwYXJhbSBibG9jazogQmxvY2sgd2hlbiBubyBmcmVlIGNvbm5lY3Rpb25zIGFyZSBhdmFpbGFibGUuCiAgICAgICAgOnBhcmFtIHBvb2xfa3dhcmdzOiBFeHRyYSBrZXl3b3JkIGFyZ3VtZW50cyB1c2VkIHRvIGluaXRpYWxpemUgdGhlIFBvb2wgTWFuYWdlci4KICAgICAgICAiIiIKICAgICAgICAjIHNhdmUgdGhlc2UgdmFsdWVzIGZvciBwaWNrbGluZwogICAgICAgIHNlbGYuX3Bvb2xfY29ubmVjdGlvbnMgPSBjb25uZWN0aW9ucwogICAgICAgIHNlbGYuX3Bvb2xfbWF4c2l6ZSA9IG1heHNpemUKICAgICAgICBzZWxmLl9wb29sX2Jsb2NrID0gYmxvY2sKCiAgICAgICAgc2VsZi5wb29sbWFuYWdlciA9IFBvb2xNYW5hZ2VyKG51bV9wb29scz1jb25uZWN0aW9ucywgbWF4c2l6ZT1tYXhzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jaz1ibG9jaywgc3RyaWN0PVRydWUsICoqcG9vbF9rd2FyZ3MpCgogICAgZGVmIHByb3h5X21hbmFnZXJfZm9yKHNlbGYsIHByb3h5LCAqKnByb3h5X2t3YXJncyk6CiAgICAgICAgIiIiUmV0dXJuIHVybGxpYjMgUHJveHlNYW5hZ2VyIGZvciB0aGUgZ2l2ZW4gcHJveHkuCgogICAgICAgIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgY2FsbGVkIGZyb20gdXNlciBjb2RlLCBhbmQgaXMgb25seQogICAgICAgIGV4cG9zZWQgZm9yIHVzZSB3aGVuIHN1YmNsYXNzaW5nIHRoZQogICAgICAgIDpjbGFzczpgSFRUUEFkYXB0ZXIgPHJlcXVlc3RzLmFkYXB0ZXJzLkhUVFBBZGFwdGVyPmAuCgogICAgICAgIDpwYXJhbSBwcm94eTogVGhlIHByb3h5IHRvIHJldHVybiBhIHVybGxpYjMgUHJveHlNYW5hZ2VyIGZvci4KICAgICAgICA6cGFyYW0gcHJveHlfa3dhcmdzOiBFeHRyYSBrZXl3b3JkIGFyZ3VtZW50cyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgUHJveHkgTWFuYWdlci4KICAgICAgICA6cmV0dXJuczogUHJveHlNYW5hZ2VyCiAgICAgICAgOnJ0eXBlOiB1cmxsaWIzLlByb3h5TWFuYWdlcgogICAgICAgICIiIgogICAgICAgIGlmIHByb3h5IGluIHNlbGYucHJveHlfbWFuYWdlcjoKICAgICAgICAgICAgbWFuYWdlciA9IHNlbGYucHJveHlfbWFuYWdlcltwcm94eV0KICAgICAgICBlbGlmIHByb3h5Lmxvd2VyKCkuc3RhcnRzd2l0aCgnc29ja3MnKToKICAgICAgICAgICAgdXNlcm5hbWUsIHBhc3N3b3JkID0gZ2V0X2F1dGhfZnJvbV91cmwocHJveHkpCiAgICAgICAgICAgIG1hbmFnZXIgPSBzZWxmLnByb3h5X21hbmFnZXJbcHJveHldID0gU09DS1NQcm94eU1hbmFnZXIoCiAgICAgICAgICAgICAgICBwcm94eSwKICAgICAgICAgICAgICAgIHVzZXJuYW1lPXVzZXJuYW1lLAogICAgICAgICAgICAgICAgcGFzc3dvcmQ9cGFzc3dvcmQsCiAgICAgICAgICAgICAgICBudW1fcG9vbHM9c2VsZi5fcG9vbF9jb25uZWN0aW9ucywKICAgICAgICAgICAgICAgIG1heHNpemU9c2VsZi5fcG9vbF9tYXhzaXplLAogICAgICAgICAgICAgICAgYmxvY2s9c2VsZi5fcG9vbF9ibG9jaywKICAgICAgICAgICAgICAgICoqcHJveHlfa3dhcmdzCiAgICAgICAgICAgICkKICAgICAgICBlbHNlOgogICAgICAgICAgICBwcm94eV9oZWFkZXJzID0gc2VsZi5wcm94eV9oZWFkZXJzKHByb3h5KQogICAgICAgICAgICBtYW5hZ2VyID0gc2VsZi5wcm94eV9tYW5hZ2VyW3Byb3h5XSA9IHByb3h5X2Zyb21fdXJsKAogICAgICAgICAgICAgICAgcHJveHksCiAgICAgICAgICAgICAgICBwcm94eV9oZWFkZXJzPXByb3h5X2hlYWRlcnMsCiAgICAgICAgICAgICAgICBudW1fcG9vbHM9c2VsZi5fcG9vbF9jb25uZWN0aW9ucywKICAgICAgICAgICAgICAgIG1heHNpemU9c2VsZi5fcG9vbF9tYXhzaXplLAogICAgICAgICAgICAgICAgYmxvY2s9c2VsZi5fcG9vbF9ibG9jaywKICAgICAgICAgICAgICAgICoqcHJveHlfa3dhcmdzKQoKICAgICAgICByZXR1cm4gbWFuYWdlcgoKICAgIGRlZiBjZXJ0X3ZlcmlmeShzZWxmLCBjb25uLCB1cmwsIHZlcmlmeSwgY2VydCk6CiAgICAgICAgIiIiVmVyaWZ5IGEgU1NMIGNlcnRpZmljYXRlLiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZCBmcm9tIHVzZXIKICAgICAgICBjb2RlLCBhbmQgaXMgb25seSBleHBvc2VkIGZvciB1c2Ugd2hlbiBzdWJjbGFzc2luZyB0aGUKICAgICAgICA6Y2xhc3M6YEhUVFBBZGFwdGVyIDxyZXF1ZXN0cy5hZGFwdGVycy5IVFRQQWRhcHRlcj5gLgoKICAgICAgICA6cGFyYW0gY29ubjogVGhlIHVybGxpYjMgY29ubmVjdGlvbiBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBjZXJ0LgogICAgICAgIDpwYXJhbSB1cmw6IFRoZSByZXF1ZXN0ZWQgVVJMLgogICAgICAgIDpwYXJhbSB2ZXJpZnk6IEVpdGhlciBhIGJvb2xlYW4sIGluIHdoaWNoIGNhc2UgaXQgY29udHJvbHMgd2hldGhlciB3ZSB2ZXJpZnkKICAgICAgICAgICAgdGhlIHNlcnZlcidzIFRMUyBjZXJ0aWZpY2F0ZSwgb3IgYSBzdHJpbmcsIGluIHdoaWNoIGNhc2UgaXQgbXVzdCBiZSBhIHBhdGgKICAgICAgICAgICAgdG8gYSBDQSBidW5kbGUgdG8gdXNlCiAgICAgICAgOnBhcmFtIGNlcnQ6IFRoZSBTU0wgY2VydGlmaWNhdGUgdG8gdmVyaWZ5LgogICAgICAgICIiIgogICAgICAgIGlmIHVybC5sb3dlcigpLnN0YXJ0c3dpdGgoJ2h0dHBzJykgYW5kIHZlcmlmeToKCiAgICAgICAgICAgIGNlcnRfbG9jID0gTm9uZQoKICAgICAgICAgICAgIyBBbGxvdyBzZWxmLXNwZWNpZmllZCBjZXJ0IGxvY2F0aW9uLgogICAgICAgICAgICBpZiB2ZXJpZnkgaXMgbm90IFRydWU6CiAgICAgICAgICAgICAgICBjZXJ0X2xvYyA9IHZlcmlmeQoKICAgICAgICAgICAgaWYgbm90IGNlcnRfbG9jOgogICAgICAgICAgICAgICAgY2VydF9sb2MgPSBERUZBVUxUX0NBX0JVTkRMRV9QQVRICgogICAgICAgICAgICBpZiBub3QgY2VydF9sb2Mgb3Igbm90IG9zLnBhdGguZXhpc3RzKGNlcnRfbG9jKToKICAgICAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoIkNvdWxkIG5vdCBmaW5kIGEgc3VpdGFibGUgVExTIENBIGNlcnRpZmljYXRlIGJ1bmRsZSwgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBwYXRoOiB7MH0iLmZvcm1hdChjZXJ0X2xvYykpCgogICAgICAgICAgICBjb25uLmNlcnRfcmVxcyA9ICdDRVJUX1JFUVVJUkVEJwoKICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguaXNkaXIoY2VydF9sb2MpOgogICAgICAgICAgICAgICAgY29ubi5jYV9jZXJ0cyA9IGNlcnRfbG9jCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBjb25uLmNhX2NlcnRfZGlyID0gY2VydF9sb2MKICAgICAgICBlbHNlOgogICAgICAgICAgICBjb25uLmNlcnRfcmVxcyA9ICdDRVJUX05PTkUnCiAgICAgICAgICAgIGNvbm4uY2FfY2VydHMgPSBOb25lCiAgICAgICAgICAgIGNvbm4uY2FfY2VydF9kaXIgPSBOb25lCgogICAgICAgIGlmIGNlcnQ6CiAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGNlcnQsIGJhc2VzdHJpbmcpOgogICAgICAgICAgICAgICAgY29ubi5jZXJ0X2ZpbGUgPSBjZXJ0WzBdCiAgICAgICAgICAgICAgICBjb25uLmtleV9maWxlID0gY2VydFsxXQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgY29ubi5jZXJ0X2ZpbGUgPSBjZXJ0CiAgICAgICAgICAgICAgICBjb25uLmtleV9maWxlID0gTm9uZQogICAgICAgICAgICBpZiBjb25uLmNlcnRfZmlsZSBhbmQgbm90IG9zLnBhdGguZXhpc3RzKGNvbm4uY2VydF9maWxlKToKICAgICAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoIkNvdWxkIG5vdCBmaW5kIHRoZSBUTFMgY2VydGlmaWNhdGUgZmlsZSwgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBwYXRoOiB7MH0iLmZvcm1hdChjb25uLmNlcnRfZmlsZSkpCiAgICAgICAgICAgIGlmIGNvbm4ua2V5X2ZpbGUgYW5kIG5vdCBvcy5wYXRoLmV4aXN0cyhjb25uLmtleV9maWxlKToKICAgICAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoIkNvdWxkIG5vdCBmaW5kIHRoZSBUTFMga2V5IGZpbGUsICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgcGF0aDogezB9Ii5mb3JtYXQoY29ubi5rZXlfZmlsZSkpCgogICAgZGVmIGJ1aWxkX3Jlc3BvbnNlKHNlbGYsIHJlcSwgcmVzcCk6CiAgICAgICAgIiIiQnVpbGRzIGEgOmNsYXNzOmBSZXNwb25zZSA8cmVxdWVzdHMuUmVzcG9uc2U+YCBvYmplY3QgZnJvbSBhIHVybGxpYjMKICAgICAgICByZXNwb25zZS4gVGhpcyBzaG91bGQgbm90IGJlIGNhbGxlZCBmcm9tIHVzZXIgY29kZSwgYW5kIGlzIG9ubHkgZXhwb3NlZAogICAgICAgIGZvciB1c2Ugd2hlbiBzdWJjbGFzc2luZyB0aGUKICAgICAgICA6Y2xhc3M6YEhUVFBBZGFwdGVyIDxyZXF1ZXN0cy5hZGFwdGVycy5IVFRQQWRhcHRlcj5gCgogICAgICAgIDpwYXJhbSByZXE6IFRoZSA6Y2xhc3M6YFByZXBhcmVkUmVxdWVzdCA8UHJlcGFyZWRSZXF1ZXN0PmAgdXNlZCB0byBnZW5lcmF0ZSB0aGUgcmVzcG9uc2UuCiAgICAgICAgOnBhcmFtIHJlc3A6IFRoZSB1cmxsaWIzIHJlc3BvbnNlIG9iamVjdC4KICAgICAgICA6cnR5cGU6IHJlcXVlc3RzLlJlc3BvbnNlCiAgICAgICAgIiIiCiAgICAgICAgcmVzcG9uc2UgPSBSZXNwb25zZSgpCgogICAgICAgICMgRmFsbGJhY2sgdG8gTm9uZSBpZiB0aGVyZSdzIG5vIHN0YXR1c19jb2RlLCBmb3Igd2hhdGV2ZXIgcmVhc29uLgogICAgICAgIHJlc3BvbnNlLnN0YXR1c19jb2RlID0gZ2V0YXR0cihyZXNwLCAnc3RhdHVzJywgTm9uZSkKCiAgICAgICAgIyBNYWtlIGhlYWRlcnMgY2FzZS1pbnNlbnNpdGl2ZS4KICAgICAgICByZXNwb25zZS5oZWFkZXJzID0gQ2FzZUluc2Vuc2l0aXZlRGljdChnZXRhdHRyKHJlc3AsICdoZWFkZXJzJywge30pKQoKICAgICAgICAjIFNldCBlbmNvZGluZy4KICAgICAgICByZXNwb25zZS5lbmNvZGluZyA9IGdldF9lbmNvZGluZ19mcm9tX2hlYWRlcnMocmVzcG9uc2UuaGVhZGVycykKICAgICAgICByZXNwb25zZS5yYXcgPSByZXNwCiAgICAgICAgcmVzcG9uc2UucmVhc29uID0gcmVzcG9uc2UucmF3LnJlYXNvbgoKICAgICAgICBpZiBpc2luc3RhbmNlKHJlcS51cmwsIGJ5dGVzKToKICAgICAgICAgICAgcmVzcG9uc2UudXJsID0gcmVxLnVybC5kZWNvZGUoJ3V0Zi04JykKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXNwb25zZS51cmwgPSByZXEudXJsCgogICAgICAgICMgQWRkIG5ldyBjb29raWVzIGZyb20gdGhlIHNlcnZlci4KICAgICAgICBleHRyYWN0X2Nvb2tpZXNfdG9famFyKHJlc3BvbnNlLmNvb2tpZXMsIHJlcSwgcmVzcCkKCiAgICAgICAgIyBHaXZlIHRoZSBSZXNwb25zZSBzb21lIGNvbnRleHQuCiAgICAgICAgcmVzcG9uc2UucmVxdWVzdCA9IHJlcQogICAgICAgIHJlc3BvbnNlLmNvbm5lY3Rpb24gPSBzZWxmCgogICAgICAgIHJldHVybiByZXNwb25zZQoKICAgIGRlZiBnZXRfY29ubmVjdGlvbihzZWxmLCB1cmwsIHByb3hpZXM9Tm9uZSk6CiAgICAgICAgIiIiUmV0dXJucyBhIHVybGxpYjMgY29ubmVjdGlvbiBmb3IgdGhlIGdpdmVuIFVSTC4gVGhpcyBzaG91bGQgbm90IGJlCiAgICAgICAgY2FsbGVkIGZyb20gdXNlciBjb2RlLCBhbmQgaXMgb25seSBleHBvc2VkIGZvciB1c2Ugd2hlbiBzdWJjbGFzc2luZyB0aGUKICAgICAgICA6Y2xhc3M6YEhUVFBBZGFwdGVyIDxyZXF1ZXN0cy5hZGFwdGVycy5IVFRQQWRhcHRlcj5gLgoKICAgICAgICA6cGFyYW0gdXJsOiBUaGUgVVJMIHRvIGNvbm5lY3QgdG8uCiAgICAgICAgOnBhcmFtIHByb3hpZXM6IChvcHRpb25hbCkgQSBSZXF1ZXN0cy1zdHlsZSBkaWN0aW9uYXJ5IG9mIHByb3hpZXMgdXNlZCBvbiB0aGlzIHJlcXVlc3QuCiAgICAgICAgOnJ0eXBlOiB1cmxsaWIzLkNvbm5lY3Rpb25Qb29sCiAgICAgICAgIiIiCiAgICAgICAgcHJveHkgPSBzZWxlY3RfcHJveHkodXJsLCBwcm94aWVzKQoKICAgICAgICBpZiBwcm94eToKICAgICAgICAgICAgcHJveHkgPSBwcmVwZW5kX3NjaGVtZV9pZl9uZWVkZWQocHJveHksICdodHRwJykKICAgICAgICAgICAgcHJveHlfbWFuYWdlciA9IHNlbGYucHJveHlfbWFuYWdlcl9mb3IocHJveHkpCiAgICAgICAgICAgIGNvbm4gPSBwcm94eV9tYW5hZ2VyLmNvbm5lY3Rpb25fZnJvbV91cmwodXJsKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgT25seSBzY2hlbWUgc2hvdWxkIGJlIGxvd2VyIGNhc2UKICAgICAgICAgICAgcGFyc2VkID0gdXJscGFyc2UodXJsKQogICAgICAgICAgICB1cmwgPSBwYXJzZWQuZ2V0dXJsKCkKICAgICAgICAgICAgY29ubiA9IHNlbGYucG9vbG1hbmFnZXIuY29ubmVjdGlvbl9mcm9tX3VybCh1cmwpCgogICAgICAgIHJldHVybiBjb25uCgogICAgZGVmIGNsb3NlKHNlbGYpOgogICAgICAgICIiIkRpc3Bvc2VzIG9mIGFueSBpbnRlcm5hbCBzdGF0ZS4KCiAgICAgICAgQ3VycmVudGx5LCB0aGlzIGNsb3NlcyB0aGUgUG9vbE1hbmFnZXIgYW5kIGFueSBhY3RpdmUgUHJveHlNYW5hZ2VyLAogICAgICAgIHdoaWNoIGNsb3NlcyBhbnkgcG9vbGVkIGNvbm5lY3Rpb25zLgogICAgICAgICIiIgogICAgICAgIHNlbGYucG9vbG1hbmFnZXIuY2xlYXIoKQogICAgICAgIGZvciBwcm94eSBpbiBzZWxmLnByb3h5X21hbmFnZXIudmFsdWVzKCk6CiAgICAgICAgICAgIHByb3h5LmNsZWFyKCkKCiAgICBkZWYgcmVxdWVzdF91cmwoc2VsZiwgcmVxdWVzdCwgcHJveGllcyk6CiAgICAgICAgIiIiT2J0YWluIHRoZSB1cmwgdG8gdXNlIHdoZW4gbWFraW5nIHRoZSBmaW5hbCByZXF1ZXN0LgoKICAgICAgICBJZiB0aGUgbWVzc2FnZSBpcyBiZWluZyBzZW50IHRocm91Z2ggYSBIVFRQIHByb3h5LCB0aGUgZnVsbCBVUkwgaGFzIHRvCiAgICAgICAgYmUgdXNlZC4gT3RoZXJ3aXNlLCB3ZSBzaG91bGQgb25seSB1c2UgdGhlIHBhdGggcG9ydGlvbiBvZiB0aGUgVVJMLgoKICAgICAgICBUaGlzIHNob3VsZCBub3QgYmUgY2FsbGVkIGZyb20gdXNlciBjb2RlLCBhbmQgaXMgb25seSBleHBvc2VkIGZvciB1c2UKICAgICAgICB3aGVuIHN1YmNsYXNzaW5nIHRoZQogICAgICAgIDpjbGFzczpgSFRUUEFkYXB0ZXIgPHJlcXVlc3RzLmFkYXB0ZXJzLkhUVFBBZGFwdGVyPmAuCgogICAgICAgIDpwYXJhbSByZXF1ZXN0OiBUaGUgOmNsYXNzOmBQcmVwYXJlZFJlcXVlc3QgPFByZXBhcmVkUmVxdWVzdD5gIGJlaW5nIHNlbnQuCiAgICAgICAgOnBhcmFtIHByb3hpZXM6IEEgZGljdGlvbmFyeSBvZiBzY2hlbWVzIG9yIHNjaGVtZXMgYW5kIGhvc3RzIHRvIHByb3h5IFVSTHMuCiAgICAgICAgOnJ0eXBlOiBzdHIKICAgICAgICAiIiIKICAgICAgICBwcm94eSA9IHNlbGVjdF9wcm94eShyZXF1ZXN0LnVybCwgcHJveGllcykKICAgICAgICBzY2hlbWUgPSB1cmxwYXJzZShyZXF1ZXN0LnVybCkuc2NoZW1lCgogICAgICAgIGlzX3Byb3hpZWRfaHR0cF9yZXF1ZXN0ID0gKHByb3h5IGFuZCBzY2hlbWUgIT0gJ2h0dHBzJykKICAgICAgICB1c2luZ19zb2Nrc19wcm94eSA9IEZhbHNlCiAgICAgICAgaWYgcHJveHk6CiAgICAgICAgICAgIHByb3h5X3NjaGVtZSA9IHVybHBhcnNlKHByb3h5KS5zY2hlbWUubG93ZXIoKQogICAgICAgICAgICB1c2luZ19zb2Nrc19wcm94eSA9IHByb3h5X3NjaGVtZS5zdGFydHN3aXRoKCdzb2NrcycpCgogICAgICAgIHVybCA9IHJlcXVlc3QucGF0aF91cmwKICAgICAgICBpZiBpc19wcm94aWVkX2h0dHBfcmVxdWVzdCBhbmQgbm90IHVzaW5nX3NvY2tzX3Byb3h5OgogICAgICAgICAgICB1cmwgPSB1cmxkZWZyYWdhdXRoKHJlcXVlc3QudXJsKQoKICAgICAgICByZXR1cm4gdXJsCgogICAgZGVmIGFkZF9oZWFkZXJzKHNlbGYsIHJlcXVlc3QsICoqa3dhcmdzKToKICAgICAgICAiIiJBZGQgYW55IGhlYWRlcnMgbmVlZGVkIGJ5IHRoZSBjb25uZWN0aW9uLiBBcyBvZiB2Mi4wIHRoaXMgZG9lcwogICAgICAgIG5vdGhpbmcgYnkgZGVmYXVsdCwgYnV0IGlzIGxlZnQgZm9yIG92ZXJyaWRpbmcgYnkgdXNlcnMgdGhhdCBzdWJjbGFzcwogICAgICAgIHRoZSA6Y2xhc3M6YEhUVFBBZGFwdGVyIDxyZXF1ZXN0cy5hZGFwdGVycy5IVFRQQWRhcHRlcj5gLgoKICAgICAgICBUaGlzIHNob3VsZCBub3QgYmUgY2FsbGVkIGZyb20gdXNlciBjb2RlLCBhbmQgaXMgb25seSBleHBvc2VkIGZvciB1c2UKICAgICAgICB3aGVuIHN1YmNsYXNzaW5nIHRoZQogICAgICAgIDpjbGFzczpgSFRUUEFkYXB0ZXIgPHJlcXVlc3RzLmFkYXB0ZXJzLkhUVFBBZGFwdGVyPmAuCgogICAgICAgIDpwYXJhbSByZXF1ZXN0OiBUaGUgOmNsYXNzOmBQcmVwYXJlZFJlcXVlc3QgPFByZXBhcmVkUmVxdWVzdD5gIHRvIGFkZCBoZWFkZXJzIHRvLgogICAgICAgIDpwYXJhbSBrd2FyZ3M6IFRoZSBrZXl3b3JkIGFyZ3VtZW50cyBmcm9tIHRoZSBjYWxsIHRvIHNlbmQoKS4KICAgICAgICAiIiIKICAgICAgICBwYXNzCgogICAgZGVmIHByb3h5X2hlYWRlcnMoc2VsZiwgcHJveHkpOgogICAgICAgICIiIlJldHVybnMgYSBkaWN0aW9uYXJ5IG9mIHRoZSBoZWFkZXJzIHRvIGFkZCB0byBhbnkgcmVxdWVzdCBzZW50CiAgICAgICAgdGhyb3VnaCBhIHByb3h5LiBUaGlzIHdvcmtzIHdpdGggdXJsbGliMyBtYWdpYyB0byBlbnN1cmUgdGhhdCB0aGV5IGFyZQogICAgICAgIGNvcnJlY3RseSBzZW50IHRvIHRoZSBwcm94eSwgcmF0aGVyIHRoYW4gaW4gYSB0dW5uZWxsZWQgcmVxdWVzdCBpZgogICAgICAgIENPTk5FQ1QgaXMgYmVpbmcgdXNlZC4KCiAgICAgICAgVGhpcyBzaG91bGQgbm90IGJlIGNhbGxlZCBmcm9tIHVzZXIgY29kZSwgYW5kIGlzIG9ubHkgZXhwb3NlZCBmb3IgdXNlCiAgICAgICAgd2hlbiBzdWJjbGFzc2luZyB0aGUKICAgICAgICA6Y2xhc3M6YEhUVFBBZGFwdGVyIDxyZXF1ZXN0cy5hZGFwdGVycy5IVFRQQWRhcHRlcj5gLgoKICAgICAgICA6cGFyYW0gcHJveGllczogVGhlIHVybCBvZiB0aGUgcHJveHkgYmVpbmcgdXNlZCBmb3IgdGhpcyByZXF1ZXN0LgogICAgICAgIDpydHlwZTogZGljdAogICAgICAgICIiIgogICAgICAgIGhlYWRlcnMgPSB7fQogICAgICAgIHVzZXJuYW1lLCBwYXNzd29yZCA9IGdldF9hdXRoX2Zyb21fdXJsKHByb3h5KQoKICAgICAgICBpZiB1c2VybmFtZToKICAgICAgICAgICAgaGVhZGVyc1snUHJveHktQXV0aG9yaXphdGlvbiddID0gX2Jhc2ljX2F1dGhfc3RyKHVzZXJuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQpCgogICAgICAgIHJldHVybiBoZWFkZXJzCgogICAgZGVmIHNlbmQoc2VsZiwgcmVxdWVzdCwgc3RyZWFtPUZhbHNlLCB0aW1lb3V0PU5vbmUsIHZlcmlmeT1UcnVlLCBjZXJ0PU5vbmUsIHByb3hpZXM9Tm9uZSk6CiAgICAgICAgIiIiU2VuZHMgUHJlcGFyZWRSZXF1ZXN0IG9iamVjdC4gUmV0dXJucyBSZXNwb25zZSBvYmplY3QuCgogICAgICAgIDpwYXJhbSByZXF1ZXN0OiBUaGUgOmNsYXNzOmBQcmVwYXJlZFJlcXVlc3QgPFByZXBhcmVkUmVxdWVzdD5gIGJlaW5nIHNlbnQuCiAgICAgICAgOnBhcmFtIHN0cmVhbTogKG9wdGlvbmFsKSBXaGV0aGVyIHRvIHN0cmVhbSB0aGUgcmVxdWVzdCBjb250ZW50LgogICAgICAgIDpwYXJhbSB0aW1lb3V0OiAob3B0aW9uYWwpIEhvdyBsb25nIHRvIHdhaXQgZm9yIHRoZSBzZXJ2ZXIgdG8gc2VuZAogICAgICAgICAgICBkYXRhIGJlZm9yZSBnaXZpbmcgdXAsIGFzIGEgZmxvYXQsIG9yIGEgOnJlZjpgKGNvbm5lY3QgdGltZW91dCwKICAgICAgICAgICAgcmVhZCB0aW1lb3V0KSA8dGltZW91dHM+YCB0dXBsZS4KICAgICAgICA6dHlwZSB0aW1lb3V0OiBmbG9hdCBvciB0dXBsZSBvciB1cmxsaWIzIFRpbWVvdXQgb2JqZWN0CiAgICAgICAgOnBhcmFtIHZlcmlmeTogKG9wdGlvbmFsKSBFaXRoZXIgYSBib29sZWFuLCBpbiB3aGljaCBjYXNlIGl0IGNvbnRyb2xzIHdoZXRoZXIKICAgICAgICAgICAgd2UgdmVyaWZ5IHRoZSBzZXJ2ZXIncyBUTFMgY2VydGlmaWNhdGUsIG9yIGEgc3RyaW5nLCBpbiB3aGljaCBjYXNlIGl0CiAgICAgICAgICAgIG11c3QgYmUgYSBwYXRoIHRvIGEgQ0EgYnVuZGxlIHRvIHVzZQogICAgICAgIDpwYXJhbSBjZXJ0OiAob3B0aW9uYWwpIEFueSB1c2VyLXByb3ZpZGVkIFNTTCBjZXJ0aWZpY2F0ZSB0byBiZSB0cnVzdGVkLgogICAgICAgIDpwYXJhbSBwcm94aWVzOiAob3B0aW9uYWwpIFRoZSBwcm94aWVzIGRpY3Rpb25hcnkgdG8gYXBwbHkgdG8gdGhlIHJlcXVlc3QuCiAgICAgICAgOnJ0eXBlOiByZXF1ZXN0cy5SZXNwb25zZQogICAgICAgICIiIgoKICAgICAgICBjb25uID0gc2VsZi5nZXRfY29ubmVjdGlvbihyZXF1ZXN0LnVybCwgcHJveGllcykKCiAgICAgICAgc2VsZi5jZXJ0X3ZlcmlmeShjb25uLCByZXF1ZXN0LnVybCwgdmVyaWZ5LCBjZXJ0KQogICAgICAgIHVybCA9IHNlbGYucmVxdWVzdF91cmwocmVxdWVzdCwgcHJveGllcykKICAgICAgICBzZWxmLmFkZF9oZWFkZXJzKHJlcXVlc3QpCgogICAgICAgIGNodW5rZWQgPSBub3QgKHJlcXVlc3QuYm9keSBpcyBOb25lIG9yICdDb250ZW50LUxlbmd0aCcgaW4gcmVxdWVzdC5oZWFkZXJzKQoKICAgICAgICBpZiBpc2luc3RhbmNlKHRpbWVvdXQsIHR1cGxlKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgY29ubmVjdCwgcmVhZCA9IHRpbWVvdXQKICAgICAgICAgICAgICAgIHRpbWVvdXQgPSBUaW1lb3V0U2F1Y2UoY29ubmVjdD1jb25uZWN0LCByZWFkPXJlYWQpCiAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yIGFzIGU6CiAgICAgICAgICAgICAgICAjIHRoaXMgbWF5IHJhaXNlIGEgc3RyaW5nIGZvcm1hdHRpbmcgZXJyb3IuCiAgICAgICAgICAgICAgICBlcnIgPSAoIkludmFsaWQgdGltZW91dCB7MH0uIFBhc3MgYSAoY29ubmVjdCwgcmVhZCkgIgogICAgICAgICAgICAgICAgICAgICAgICJ0aW1lb3V0IHR1cGxlLCBvciBhIHNpbmdsZSBmbG9hdCB0byBzZXQgIgogICAgICAgICAgICAgICAgICAgICAgICJib3RoIHRpbWVvdXRzIHRvIHRoZSBzYW1lIHZhbHVlIi5mb3JtYXQodGltZW91dCkpCiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKGVycikKICAgICAgICBlbGlmIGlzaW5zdGFuY2UodGltZW91dCwgVGltZW91dFNhdWNlKToKICAgICAgICAgICAgcGFzcwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHRpbWVvdXQgPSBUaW1lb3V0U2F1Y2UoY29ubmVjdD10aW1lb3V0LCByZWFkPXRpbWVvdXQpCgogICAgICAgIHRyeToKICAgICAgICAgICAgaWYgbm90IGNodW5rZWQ6CiAgICAgICAgICAgICAgICByZXNwID0gY29ubi51cmxvcGVuKAogICAgICAgICAgICAgICAgICAgIG1ldGhvZD1yZXF1ZXN0Lm1ldGhvZCwKICAgICAgICAgICAgICAgICAgICB1cmw9dXJsLAogICAgICAgICAgICAgICAgICAgIGJvZHk9cmVxdWVzdC5ib2R5LAogICAgICAgICAgICAgICAgICAgIGhlYWRlcnM9cmVxdWVzdC5oZWFkZXJzLAogICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0PUZhbHNlLAogICAgICAgICAgICAgICAgICAgIGFzc2VydF9zYW1lX2hvc3Q9RmFsc2UsCiAgICAgICAgICAgICAgICAgICAgcHJlbG9hZF9jb250ZW50PUZhbHNlLAogICAgICAgICAgICAgICAgICAgIGRlY29kZV9jb250ZW50PUZhbHNlLAogICAgICAgICAgICAgICAgICAgIHJldHJpZXM9c2VsZi5tYXhfcmV0cmllcywKICAgICAgICAgICAgICAgICAgICB0aW1lb3V0PXRpbWVvdXQKICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgICMgU2VuZCB0aGUgcmVxdWVzdC4KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIoY29ubiwgJ3Byb3h5X3Bvb2wnKToKICAgICAgICAgICAgICAgICAgICBjb25uID0gY29ubi5wcm94eV9wb29sCgogICAgICAgICAgICAgICAgbG93X2Nvbm4gPSBjb25uLl9nZXRfY29ubih0aW1lb3V0PURFRkFVTFRfUE9PTF9USU1FT1VUKQoKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBsb3dfY29ubi5wdXRyZXF1ZXN0KHJlcXVlc3QubWV0aG9kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcF9hY2NlcHRfZW5jb2Rpbmc9VHJ1ZSkKCiAgICAgICAgICAgICAgICAgICAgZm9yIGhlYWRlciwgdmFsdWUgaW4gcmVxdWVzdC5oZWFkZXJzLml0ZW1zKCk6CiAgICAgICAgICAgICAgICAgICAgICAgIGxvd19jb25uLnB1dGhlYWRlcihoZWFkZXIsIHZhbHVlKQoKICAgICAgICAgICAgICAgICAgICBsb3dfY29ubi5lbmRoZWFkZXJzKCkKCiAgICAgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmVxdWVzdC5ib2R5OgogICAgICAgICAgICAgICAgICAgICAgICBsb3dfY29ubi5zZW5kKGhleChsZW4oaSkpWzI6XS5lbmNvZGUoJ3V0Zi04JykpCiAgICAgICAgICAgICAgICAgICAgICAgIGxvd19jb25uLnNlbmQoYidcclxuJykKICAgICAgICAgICAgICAgICAgICAgICAgbG93X2Nvbm4uc2VuZChpKQogICAgICAgICAgICAgICAgICAgICAgICBsb3dfY29ubi5zZW5kKGInXHJcbicpCiAgICAgICAgICAgICAgICAgICAgbG93X2Nvbm4uc2VuZChiJzBcclxuXHJcbicpCgogICAgICAgICAgICAgICAgICAgICMgUmVjZWl2ZSB0aGUgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyCiAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICAjIEZvciBQeXRob24gMi43KyB2ZXJzaW9ucywgdXNlIGJ1ZmZlcmluZyBvZiBIVFRQCiAgICAgICAgICAgICAgICAgICAgICAgICMgcmVzcG9uc2VzCiAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBsb3dfY29ubi5nZXRyZXNwb25zZShidWZmZXJpbmc9VHJ1ZSkKICAgICAgICAgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOgogICAgICAgICAgICAgICAgICAgICAgICAjIEZvciBjb21wYXRpYmlsaXR5IHdpdGggUHl0aG9uIDIuNiB2ZXJzaW9ucyBhbmQgYmFjawogICAgICAgICAgICAgICAgICAgICAgICByID0gbG93X2Nvbm4uZ2V0cmVzcG9uc2UoKQoKICAgICAgICAgICAgICAgICAgICByZXNwID0gSFRUUFJlc3BvbnNlLmZyb21faHR0cGxpYigKICAgICAgICAgICAgICAgICAgICAgICAgciwKICAgICAgICAgICAgICAgICAgICAgICAgcG9vbD1jb25uLAogICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uPWxvd19jb25uLAogICAgICAgICAgICAgICAgICAgICAgICBwcmVsb2FkX2NvbnRlbnQ9RmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZV9jb250ZW50PUZhbHNlCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgZXhjZXB0OgogICAgICAgICAgICAgICAgICAgICMgSWYgd2UgaGl0IGFueSBwcm9ibGVtcyBoZXJlLCBjbGVhbiB1cCB0aGUgY29ubmVjdGlvbi4KICAgICAgICAgICAgICAgICAgICAjIFRoZW4sIHJlcmFpc2Ugc28gdGhhdCB3ZSBjYW4gaGFuZGxlIHRoZSBhY3R1YWwgZXhjZXB0aW9uLgogICAgICAgICAgICAgICAgICAgIGxvd19jb25uLmNsb3NlKCkKICAgICAgICAgICAgICAgICAgICByYWlzZQoKICAgICAgICBleGNlcHQgKFByb3RvY29sRXJyb3IsIHNvY2tldC5lcnJvcikgYXMgZXJyOgogICAgICAgICAgICByYWlzZSBDb25uZWN0aW9uRXJyb3IoZXJyLCByZXF1ZXN0PXJlcXVlc3QpCgogICAgICAgIGV4Y2VwdCBNYXhSZXRyeUVycm9yIGFzIGU6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZS5yZWFzb24sIENvbm5lY3RUaW1lb3V0RXJyb3IpOgogICAgICAgICAgICAgICAgIyBUT0RPOiBSZW1vdmUgdGhpcyBpbiAzLjAuMDogc2VlICMyODExCiAgICAgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShlLnJlYXNvbiwgTmV3Q29ubmVjdGlvbkVycm9yKToKICAgICAgICAgICAgICAgICAgICByYWlzZSBDb25uZWN0VGltZW91dChlLCByZXF1ZXN0PXJlcXVlc3QpCgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGUucmVhc29uLCBSZXNwb25zZUVycm9yKToKICAgICAgICAgICAgICAgIHJhaXNlIFJldHJ5RXJyb3IoZSwgcmVxdWVzdD1yZXF1ZXN0KQoKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShlLnJlYXNvbiwgX1Byb3h5RXJyb3IpOgogICAgICAgICAgICAgICAgcmFpc2UgUHJveHlFcnJvcihlLCByZXF1ZXN0PXJlcXVlc3QpCgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGUucmVhc29uLCBfU1NMRXJyb3IpOgogICAgICAgICAgICAgICAgIyBUaGlzIGJyYW5jaCBpcyBmb3IgdXJsbGliMyB2MS4yMiBhbmQgbGF0ZXIuCiAgICAgICAgICAgICAgICByYWlzZSBTU0xFcnJvcihlLCByZXF1ZXN0PXJlcXVlc3QpCgogICAgICAgICAgICByYWlzZSBDb25uZWN0aW9uRXJyb3IoZSwgcmVxdWVzdD1yZXF1ZXN0KQoKICAgICAgICBleGNlcHQgQ2xvc2VkUG9vbEVycm9yIGFzIGU6CiAgICAgICAgICAgIHJhaXNlIENvbm5lY3Rpb25FcnJvcihlLCByZXF1ZXN0PXJlcXVlc3QpCgogICAgICAgIGV4Y2VwdCBfUHJveHlFcnJvciBhcyBlOgogICAgICAgICAgICByYWlzZSBQcm94eUVycm9yKGUpCgogICAgICAgIGV4Y2VwdCAoX1NTTEVycm9yLCBfSFRUUEVycm9yKSBhcyBlOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGUsIF9TU0xFcnJvcik6CiAgICAgICAgICAgICAgICAjIFRoaXMgYnJhbmNoIGlzIGZvciB1cmxsaWIzIHZlcnNpb25zIGVhcmxpZXIgdGhhbiB2MS4yMgogICAgICAgICAgICAgICAgcmFpc2UgU1NMRXJyb3IoZSwgcmVxdWVzdD1yZXF1ZXN0KQogICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UoZSwgUmVhZFRpbWVvdXRFcnJvcik6CiAgICAgICAgICAgICAgICByYWlzZSBSZWFkVGltZW91dChlLCByZXF1ZXN0PXJlcXVlc3QpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByYWlzZQoKICAgICAgICByZXR1cm4gc2VsZi5idWlsZF9yZXNwb25zZShyZXF1ZXN0LCByZXNwKQpQSwMEFAAAAAAAAAAhAJhj6C9dGAAAXRgAADgAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3JlcXVlc3RzL2FwaS5weSMgLSotIGNvZGluZzogdXRmLTggLSotCgoiIiIKcmVxdWVzdHMuYXBpCn5+fn5+fn5+fn5+fgoKVGhpcyBtb2R1bGUgaW1wbGVtZW50cyB0aGUgUmVxdWVzdHMgQVBJLgoKOmNvcHlyaWdodDogKGMpIDIwMTIgYnkgS2VubmV0aCBSZWl0ei4KOmxpY2Vuc2U6IEFwYWNoZTIsIHNlZSBMSUNFTlNFIGZvciBtb3JlIGRldGFpbHMuCiIiIgoKZnJvbSAuIGltcG9ydCBzZXNzaW9ucwoKCmRlZiByZXF1ZXN0KG1ldGhvZCwgdXJsLCAqKmt3YXJncyk6CiAgICAiIiJDb25zdHJ1Y3RzIGFuZCBzZW5kcyBhIDpjbGFzczpgUmVxdWVzdCA8UmVxdWVzdD5gLgoKICAgIDpwYXJhbSBtZXRob2Q6IG1ldGhvZCBmb3IgdGhlIG5ldyA6Y2xhc3M6YFJlcXVlc3RgIG9iamVjdC4KICAgIDpwYXJhbSB1cmw6IFVSTCBmb3IgdGhlIG5ldyA6Y2xhc3M6YFJlcXVlc3RgIG9iamVjdC4KICAgIDpwYXJhbSBwYXJhbXM6IChvcHRpb25hbCkgRGljdGlvbmFyeSBvciBieXRlcyB0byBiZSBzZW50IGluIHRoZSBxdWVyeSBzdHJpbmcgZm9yIHRoZSA6Y2xhc3M6YFJlcXVlc3RgLgogICAgOnBhcmFtIGRhdGE6IChvcHRpb25hbCkgRGljdGlvbmFyeSBvciBsaXN0IG9mIHR1cGxlcyBgYFsoa2V5LCB2YWx1ZSldYGAgKHdpbGwgYmUgZm9ybS1lbmNvZGVkKSwgYnl0ZXMsIG9yIGZpbGUtbGlrZSBvYmplY3QgdG8gc2VuZCBpbiB0aGUgYm9keSBvZiB0aGUgOmNsYXNzOmBSZXF1ZXN0YC4KICAgIDpwYXJhbSBqc29uOiAob3B0aW9uYWwpIGpzb24gZGF0YSB0byBzZW5kIGluIHRoZSBib2R5IG9mIHRoZSA6Y2xhc3M6YFJlcXVlc3RgLgogICAgOnBhcmFtIGhlYWRlcnM6IChvcHRpb25hbCkgRGljdGlvbmFyeSBvZiBIVFRQIEhlYWRlcnMgdG8gc2VuZCB3aXRoIHRoZSA6Y2xhc3M6YFJlcXVlc3RgLgogICAgOnBhcmFtIGNvb2tpZXM6IChvcHRpb25hbCkgRGljdCBvciBDb29raWVKYXIgb2JqZWN0IHRvIHNlbmQgd2l0aCB0aGUgOmNsYXNzOmBSZXF1ZXN0YC4KICAgIDpwYXJhbSBmaWxlczogKG9wdGlvbmFsKSBEaWN0aW9uYXJ5IG9mIGBgJ25hbWUnOiBmaWxlLWxpa2Utb2JqZWN0c2BgIChvciBgYHsnbmFtZSc6IGZpbGUtdHVwbGV9YGApIGZvciBtdWx0aXBhcnQgZW5jb2RpbmcgdXBsb2FkLgogICAgICAgIGBgZmlsZS10dXBsZWBgIGNhbiBiZSBhIDItdHVwbGUgYGAoJ2ZpbGVuYW1lJywgZmlsZW9iailgYCwgMy10dXBsZSBgYCgnZmlsZW5hbWUnLCBmaWxlb2JqLCAnY29udGVudF90eXBlJylgYAogICAgICAgIG9yIGEgNC10dXBsZSBgYCgnZmlsZW5hbWUnLCBmaWxlb2JqLCAnY29udGVudF90eXBlJywgY3VzdG9tX2hlYWRlcnMpYGAsIHdoZXJlIGBgJ2NvbnRlbnQtdHlwZSdgYCBpcyBhIHN0cmluZwogICAgICAgIGRlZmluaW5nIHRoZSBjb250ZW50IHR5cGUgb2YgdGhlIGdpdmVuIGZpbGUgYW5kIGBgY3VzdG9tX2hlYWRlcnNgYCBhIGRpY3QtbGlrZSBvYmplY3QgY29udGFpbmluZyBhZGRpdGlvbmFsIGhlYWRlcnMKICAgICAgICB0byBhZGQgZm9yIHRoZSBmaWxlLgogICAgOnBhcmFtIGF1dGg6IChvcHRpb25hbCkgQXV0aCB0dXBsZSB0byBlbmFibGUgQmFzaWMvRGlnZXN0L0N1c3RvbSBIVFRQIEF1dGguCiAgICA6cGFyYW0gdGltZW91dDogKG9wdGlvbmFsKSBIb3cgbWFueSBzZWNvbmRzIHRvIHdhaXQgZm9yIHRoZSBzZXJ2ZXIgdG8gc2VuZCBkYXRhCiAgICAgICAgYmVmb3JlIGdpdmluZyB1cCwgYXMgYSBmbG9hdCwgb3IgYSA6cmVmOmAoY29ubmVjdCB0aW1lb3V0LCByZWFkCiAgICAgICAgdGltZW91dCkgPHRpbWVvdXRzPmAgdHVwbGUuCiAgICA6dHlwZSB0aW1lb3V0OiBmbG9hdCBvciB0dXBsZQogICAgOnBhcmFtIGFsbG93X3JlZGlyZWN0czogKG9wdGlvbmFsKSBCb29sZWFuLiBFbmFibGUvZGlzYWJsZSBHRVQvT1BUSU9OUy9QT1NUL1BVVC9QQVRDSC9ERUxFVEUvSEVBRCByZWRpcmVjdGlvbi4gRGVmYXVsdHMgdG8gYGBUcnVlYGAuCiAgICA6dHlwZSBhbGxvd19yZWRpcmVjdHM6IGJvb2wKICAgIDpwYXJhbSBwcm94aWVzOiAob3B0aW9uYWwpIERpY3Rpb25hcnkgbWFwcGluZyBwcm90b2NvbCB0byB0aGUgVVJMIG9mIHRoZSBwcm94eS4KICAgIDpwYXJhbSB2ZXJpZnk6IChvcHRpb25hbCkgRWl0aGVyIGEgYm9vbGVhbiwgaW4gd2hpY2ggY2FzZSBpdCBjb250cm9scyB3aGV0aGVyIHdlIHZlcmlmeQogICAgICAgICAgICB0aGUgc2VydmVyJ3MgVExTIGNlcnRpZmljYXRlLCBvciBhIHN0cmluZywgaW4gd2hpY2ggY2FzZSBpdCBtdXN0IGJlIGEgcGF0aAogICAgICAgICAgICB0byBhIENBIGJ1bmRsZSB0byB1c2UuIERlZmF1bHRzIHRvIGBgVHJ1ZWBgLgogICAgOnBhcmFtIHN0cmVhbTogKG9wdGlvbmFsKSBpZiBgYEZhbHNlYGAsIHRoZSByZXNwb25zZSBjb250ZW50IHdpbGwgYmUgaW1tZWRpYXRlbHkgZG93bmxvYWRlZC4KICAgIDpwYXJhbSBjZXJ0OiAob3B0aW9uYWwpIGlmIFN0cmluZywgcGF0aCB0byBzc2wgY2xpZW50IGNlcnQgZmlsZSAoLnBlbSkuIElmIFR1cGxlLCAoJ2NlcnQnLCAna2V5JykgcGFpci4KICAgIDpyZXR1cm46IDpjbGFzczpgUmVzcG9uc2UgPFJlc3BvbnNlPmAgb2JqZWN0CiAgICA6cnR5cGU6IHJlcXVlc3RzLlJlc3BvbnNlCgogICAgVXNhZ2U6OgoKICAgICAgPj4+IGltcG9ydCByZXF1ZXN0cwogICAgICA+Pj4gcmVxID0gcmVxdWVzdHMucmVxdWVzdCgnR0VUJywgJ2h0dHA6Ly9odHRwYmluLm9yZy9nZXQnKQogICAgICA8UmVzcG9uc2UgWzIwMF0+CiAgICAiIiIKCiAgICAjIEJ5IHVzaW5nIHRoZSAnd2l0aCcgc3RhdGVtZW50IHdlIGFyZSBzdXJlIHRoZSBzZXNzaW9uIGlzIGNsb3NlZCwgdGh1cyB3ZQogICAgIyBhdm9pZCBsZWF2aW5nIHNvY2tldHMgb3BlbiB3aGljaCBjYW4gdHJpZ2dlciBhIFJlc291cmNlV2FybmluZyBpbiBzb21lCiAgICAjIGNhc2VzLCBhbmQgbG9vayBsaWtlIGEgbWVtb3J5IGxlYWsgaW4gb3RoZXJzLgogICAgd2l0aCBzZXNzaW9ucy5TZXNzaW9uKCkgYXMgc2Vzc2lvbjoKICAgICAgICByZXR1cm4gc2Vzc2lvbi5yZXF1ZXN0KG1ldGhvZD1tZXRob2QsIHVybD11cmwsICoqa3dhcmdzKQoKCmRlZiBnZXQodXJsLCBwYXJhbXM9Tm9uZSwgKiprd2FyZ3MpOgogICAgciIiIlNlbmRzIGEgR0VUIHJlcXVlc3QuCgogICAgOnBhcmFtIHVybDogVVJMIGZvciB0aGUgbmV3IDpjbGFzczpgUmVxdWVzdGAgb2JqZWN0LgogICAgOnBhcmFtIHBhcmFtczogKG9wdGlvbmFsKSBEaWN0aW9uYXJ5IG9yIGJ5dGVzIHRvIGJlIHNlbnQgaW4gdGhlIHF1ZXJ5IHN0cmluZyBmb3IgdGhlIDpjbGFzczpgUmVxdWVzdGAuCiAgICA6cGFyYW0gXCpcKmt3YXJnczogT3B0aW9uYWwgYXJndW1lbnRzIHRoYXQgYGByZXF1ZXN0YGAgdGFrZXMuCiAgICA6cmV0dXJuOiA6Y2xhc3M6YFJlc3BvbnNlIDxSZXNwb25zZT5gIG9iamVjdAogICAgOnJ0eXBlOiByZXF1ZXN0cy5SZXNwb25zZQogICAgIiIiCgogICAga3dhcmdzLnNldGRlZmF1bHQoJ2FsbG93X3JlZGlyZWN0cycsIFRydWUpCiAgICByZXR1cm4gcmVxdWVzdCgnZ2V0JywgdXJsLCBwYXJhbXM9cGFyYW1zLCAqKmt3YXJncykKCgpkZWYgb3B0aW9ucyh1cmwsICoqa3dhcmdzKToKICAgIHIiIiJTZW5kcyBhbiBPUFRJT05TIHJlcXVlc3QuCgogICAgOnBhcmFtIHVybDogVVJMIGZvciB0aGUgbmV3IDpjbGFzczpgUmVxdWVzdGAgb2JqZWN0LgogICAgOnBhcmFtIFwqXCprd2FyZ3M6IE9wdGlvbmFsIGFyZ3VtZW50cyB0aGF0IGBgcmVxdWVzdGBgIHRha2VzLgogICAgOnJldHVybjogOmNsYXNzOmBSZXNwb25zZSA8UmVzcG9uc2U+YCBvYmplY3QKICAgIDpydHlwZTogcmVxdWVzdHMuUmVzcG9uc2UKICAgICIiIgoKICAgIGt3YXJncy5zZXRkZWZhdWx0KCdhbGxvd19yZWRpcmVjdHMnLCBUcnVlKQogICAgcmV0dXJuIHJlcXVlc3QoJ29wdGlvbnMnLCB1cmwsICoqa3dhcmdzKQoKCmRlZiBoZWFkKHVybCwgKiprd2FyZ3MpOgogICAgciIiIlNlbmRzIGEgSEVBRCByZXF1ZXN0LgoKICAgIDpwYXJhbSB1cmw6IFVSTCBmb3IgdGhlIG5ldyA6Y2xhc3M6YFJlcXVlc3RgIG9iamVjdC4KICAgIDpwYXJhbSBcKlwqa3dhcmdzOiBPcHRpb25hbCBhcmd1bWVudHMgdGhhdCBgYHJlcXVlc3RgYCB0YWtlcy4KICAgIDpyZXR1cm46IDpjbGFzczpgUmVzcG9uc2UgPFJlc3BvbnNlPmAgb2JqZWN0CiAgICA6cnR5cGU6IHJlcXVlc3RzLlJlc3BvbnNlCiAgICAiIiIKCiAgICBrd2FyZ3Muc2V0ZGVmYXVsdCgnYWxsb3dfcmVkaXJlY3RzJywgRmFsc2UpCiAgICByZXR1cm4gcmVxdWVzdCgnaGVhZCcsIHVybCwgKiprd2FyZ3MpCgoKZGVmIHBvc3QodXJsLCBkYXRhPU5vbmUsIGpzb249Tm9uZSwgKiprd2FyZ3MpOgogICAgciIiIlNlbmRzIGEgUE9TVCByZXF1ZXN0LgoKICAgIDpwYXJhbSB1cmw6IFVSTCBmb3IgdGhlIG5ldyA6Y2xhc3M6YFJlcXVlc3RgIG9iamVjdC4KICAgIDpwYXJhbSBkYXRhOiAob3B0aW9uYWwpIERpY3Rpb25hcnkgKHdpbGwgYmUgZm9ybS1lbmNvZGVkKSwgYnl0ZXMsIG9yIGZpbGUtbGlrZSBvYmplY3QgdG8gc2VuZCBpbiB0aGUgYm9keSBvZiB0aGUgOmNsYXNzOmBSZXF1ZXN0YC4KICAgIDpwYXJhbSBqc29uOiAob3B0aW9uYWwpIGpzb24gZGF0YSB0byBzZW5kIGluIHRoZSBib2R5IG9mIHRoZSA6Y2xhc3M6YFJlcXVlc3RgLgogICAgOnBhcmFtIFwqXCprd2FyZ3M6IE9wdGlvbmFsIGFyZ3VtZW50cyB0aGF0IGBgcmVxdWVzdGBgIHRha2VzLgogICAgOnJldHVybjogOmNsYXNzOmBSZXNwb25zZSA8UmVzcG9uc2U+YCBvYmplY3QKICAgIDpydHlwZTogcmVxdWVzdHMuUmVzcG9uc2UKICAgICIiIgoKICAgIHJldHVybiByZXF1ZXN0KCdwb3N0JywgdXJsLCBkYXRhPWRhdGEsIGpzb249anNvbiwgKiprd2FyZ3MpCgoKZGVmIHB1dCh1cmwsIGRhdGE9Tm9uZSwgKiprd2FyZ3MpOgogICAgciIiIlNlbmRzIGEgUFVUIHJlcXVlc3QuCgogICAgOnBhcmFtIHVybDogVVJMIGZvciB0aGUgbmV3IDpjbGFzczpgUmVxdWVzdGAgb2JqZWN0LgogICAgOnBhcmFtIGRhdGE6IChvcHRpb25hbCkgRGljdGlvbmFyeSAod2lsbCBiZSBmb3JtLWVuY29kZWQpLCBieXRlcywgb3IgZmlsZS1saWtlIG9iamVjdCB0byBzZW5kIGluIHRoZSBib2R5IG9mIHRoZSA6Y2xhc3M6YFJlcXVlc3RgLgogICAgOnBhcmFtIGpzb246IChvcHRpb25hbCkganNvbiBkYXRhIHRvIHNlbmQgaW4gdGhlIGJvZHkgb2YgdGhlIDpjbGFzczpgUmVxdWVzdGAuCiAgICA6cGFyYW0gXCpcKmt3YXJnczogT3B0aW9uYWwgYXJndW1lbnRzIHRoYXQgYGByZXF1ZXN0YGAgdGFrZXMuCiAgICA6cmV0dXJuOiA6Y2xhc3M6YFJlc3BvbnNlIDxSZXNwb25zZT5gIG9iamVjdAogICAgOnJ0eXBlOiByZXF1ZXN0cy5SZXNwb25zZQogICAgIiIiCgogICAgcmV0dXJuIHJlcXVlc3QoJ3B1dCcsIHVybCwgZGF0YT1kYXRhLCAqKmt3YXJncykKCgpkZWYgcGF0Y2godXJsLCBkYXRhPU5vbmUsICoqa3dhcmdzKToKICAgIHIiIiJTZW5kcyBhIFBBVENIIHJlcXVlc3QuCgogICAgOnBhcmFtIHVybDogVVJMIGZvciB0aGUgbmV3IDpjbGFzczpgUmVxdWVzdGAgb2JqZWN0LgogICAgOnBhcmFtIGRhdGE6IChvcHRpb25hbCkgRGljdGlvbmFyeSAod2lsbCBiZSBmb3JtLWVuY29kZWQpLCBieXRlcywgb3IgZmlsZS1saWtlIG9iamVjdCB0byBzZW5kIGluIHRoZSBib2R5IG9mIHRoZSA6Y2xhc3M6YFJlcXVlc3RgLgogICAgOnBhcmFtIGpzb246IChvcHRpb25hbCkganNvbiBkYXRhIHRvIHNlbmQgaW4gdGhlIGJvZHkgb2YgdGhlIDpjbGFzczpgUmVxdWVzdGAuCiAgICA6cGFyYW0gXCpcKmt3YXJnczogT3B0aW9uYWwgYXJndW1lbnRzIHRoYXQgYGByZXF1ZXN0YGAgdGFrZXMuCiAgICA6cmV0dXJuOiA6Y2xhc3M6YFJlc3BvbnNlIDxSZXNwb25zZT5gIG9iamVjdAogICAgOnJ0eXBlOiByZXF1ZXN0cy5SZXNwb25zZQogICAgIiIiCgogICAgcmV0dXJuIHJlcXVlc3QoJ3BhdGNoJywgdXJsLCBkYXRhPWRhdGEsICoqa3dhcmdzKQoKCmRlZiBkZWxldGUodXJsLCAqKmt3YXJncyk6CiAgICByIiIiU2VuZHMgYSBERUxFVEUgcmVxdWVzdC4KCiAgICA6cGFyYW0gdXJsOiBVUkwgZm9yIHRoZSBuZXcgOmNsYXNzOmBSZXF1ZXN0YCBvYmplY3QuCiAgICA6cGFyYW0gXCpcKmt3YXJnczogT3B0aW9uYWwgYXJndW1lbnRzIHRoYXQgYGByZXF1ZXN0YGAgdGFrZXMuCiAgICA6cmV0dXJuOiA6Y2xhc3M6YFJlc3BvbnNlIDxSZXNwb25zZT5gIG9iamVjdAogICAgOnJ0eXBlOiByZXF1ZXN0cy5SZXNwb25zZQogICAgIiIiCgogICAgcmV0dXJuIHJlcXVlc3QoJ2RlbGV0ZScsIHVybCwgKiprd2FyZ3MpClBLAwQUAAAAAAAAACEAA63ykgAmAAAAJgAAOQAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvYXV0aC5weSMgLSotIGNvZGluZzogdXRmLTggLSotCgoiIiIKcmVxdWVzdHMuYXV0aAp+fn5+fn5+fn5+fn5+CgpUaGlzIG1vZHVsZSBjb250YWlucyB0aGUgYXV0aGVudGljYXRpb24gaGFuZGxlcnMgZm9yIFJlcXVlc3RzLgoiIiIKCmltcG9ydCBvcwppbXBvcnQgcmUKaW1wb3J0IHRpbWUKaW1wb3J0IGhhc2hsaWIKaW1wb3J0IHRocmVhZGluZwppbXBvcnQgd2FybmluZ3MKCmZyb20gYmFzZTY0IGltcG9ydCBiNjRlbmNvZGUKCmZyb20gLmNvbXBhdCBpbXBvcnQgdXJscGFyc2UsIHN0ciwgYmFzZXN0cmluZwpmcm9tIC5jb29raWVzIGltcG9ydCBleHRyYWN0X2Nvb2tpZXNfdG9famFyCmZyb20gLl9pbnRlcm5hbF91dGlscyBpbXBvcnQgdG9fbmF0aXZlX3N0cmluZwpmcm9tIC51dGlscyBpbXBvcnQgcGFyc2VfZGljdF9oZWFkZXIKCkNPTlRFTlRfVFlQRV9GT1JNX1VSTEVOQ09ERUQgPSAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJwpDT05URU5UX1RZUEVfTVVMVElfUEFSVCA9ICdtdWx0aXBhcnQvZm9ybS1kYXRhJwoKCmRlZiBfYmFzaWNfYXV0aF9zdHIodXNlcm5hbWUsIHBhc3N3b3JkKToKICAgICIiIlJldHVybnMgYSBCYXNpYyBBdXRoIHN0cmluZy4iIiIKCiAgICAjICJJIHdhbnQgdXMgdG8gcHV0IGEgYmlnLW9sJyBjb21tZW50IG9uIHRvcCBvZiBpdCB0aGF0CiAgICAjIHNheXMgdGhhdCB0aGlzIGJlaGF2aW91ciBpcyBkdW1iIGJ1dCB3ZSBuZWVkIHRvIHByZXNlcnZlCiAgICAjIGl0IGJlY2F1c2UgcGVvcGxlIGFyZSByZWx5aW5nIG9uIGl0LiIKICAgICMgICAgLSBMdWthc2EKICAgICMKICAgICMgVGhlc2UgYXJlIGhlcmUgc29sZWx5IHRvIG1haW50YWluIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CiAgICAjIGZvciB0aGluZ3MgbGlrZSBpbnRzLiBUaGlzIHdpbGwgYmUgcmVtb3ZlZCBpbiAzLjAuMC4KICAgIGlmIG5vdCBpc2luc3RhbmNlKHVzZXJuYW1lLCBiYXNlc3RyaW5nKToKICAgICAgICB3YXJuaW5ncy53YXJuKAogICAgICAgICAgICAiTm9uLXN0cmluZyB1c2VybmFtZXMgd2lsbCBubyBsb25nZXIgYmUgc3VwcG9ydGVkIGluIFJlcXVlc3RzICIKICAgICAgICAgICAgIjMuMC4wLiBQbGVhc2UgY29udmVydCB0aGUgb2JqZWN0IHlvdSd2ZSBwYXNzZWQgaW4gKHswIXJ9KSB0byAiCiAgICAgICAgICAgICJhIHN0cmluZyBvciBieXRlcyBvYmplY3QgaW4gdGhlIG5lYXIgZnV0dXJlIHRvIGF2b2lkICIKICAgICAgICAgICAgInByb2JsZW1zLiIuZm9ybWF0KHVzZXJuYW1lKSwKICAgICAgICAgICAgY2F0ZWdvcnk9RGVwcmVjYXRpb25XYXJuaW5nLAogICAgICAgICkKICAgICAgICB1c2VybmFtZSA9IHN0cih1c2VybmFtZSkKCiAgICBpZiBub3QgaXNpbnN0YW5jZShwYXNzd29yZCwgYmFzZXN0cmluZyk6CiAgICAgICAgd2FybmluZ3Mud2FybigKICAgICAgICAgICAgIk5vbi1zdHJpbmcgcGFzc3dvcmRzIHdpbGwgbm8gbG9uZ2VyIGJlIHN1cHBvcnRlZCBpbiBSZXF1ZXN0cyAiCiAgICAgICAgICAgICIzLjAuMC4gUGxlYXNlIGNvbnZlcnQgdGhlIG9iamVjdCB5b3UndmUgcGFzc2VkIGluICh7MCFyfSkgdG8gIgogICAgICAgICAgICAiYSBzdHJpbmcgb3IgYnl0ZXMgb2JqZWN0IGluIHRoZSBuZWFyIGZ1dHVyZSB0byBhdm9pZCAiCiAgICAgICAgICAgICJwcm9ibGVtcy4iLmZvcm1hdChwYXNzd29yZCksCiAgICAgICAgICAgIGNhdGVnb3J5PURlcHJlY2F0aW9uV2FybmluZywKICAgICAgICApCiAgICAgICAgcGFzc3dvcmQgPSBzdHIocGFzc3dvcmQpCiAgICAjIC0tIEVuZCBSZW1vdmFsIC0tCgogICAgaWYgaXNpbnN0YW5jZSh1c2VybmFtZSwgc3RyKToKICAgICAgICB1c2VybmFtZSA9IHVzZXJuYW1lLmVuY29kZSgnbGF0aW4xJykKCiAgICBpZiBpc2luc3RhbmNlKHBhc3N3b3JkLCBzdHIpOgogICAgICAgIHBhc3N3b3JkID0gcGFzc3dvcmQuZW5jb2RlKCdsYXRpbjEnKQoKICAgIGF1dGhzdHIgPSAnQmFzaWMgJyArIHRvX25hdGl2ZV9zdHJpbmcoCiAgICAgICAgYjY0ZW5jb2RlKGInOicuam9pbigodXNlcm5hbWUsIHBhc3N3b3JkKSkpLnN0cmlwKCkKICAgICkKCiAgICByZXR1cm4gYXV0aHN0cgoKCmNsYXNzIEF1dGhCYXNlKG9iamVjdCk6CiAgICAiIiJCYXNlIGNsYXNzIHRoYXQgYWxsIGF1dGggaW1wbGVtZW50YXRpb25zIGRlcml2ZSBmcm9tIiIiCgogICAgZGVmIF9fY2FsbF9fKHNlbGYsIHIpOgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoJ0F1dGggaG9va3MgbXVzdCBiZSBjYWxsYWJsZS4nKQoKCmNsYXNzIEhUVFBCYXNpY0F1dGgoQXV0aEJhc2UpOgogICAgIiIiQXR0YWNoZXMgSFRUUCBCYXNpYyBBdXRoZW50aWNhdGlvbiB0byB0aGUgZ2l2ZW4gUmVxdWVzdCBvYmplY3QuIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHVzZXJuYW1lLCBwYXNzd29yZCk6CiAgICAgICAgc2VsZi51c2VybmFtZSA9IHVzZXJuYW1lCiAgICAgICAgc2VsZi5wYXNzd29yZCA9IHBhc3N3b3JkCgogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIGFsbChbCiAgICAgICAgICAgIHNlbGYudXNlcm5hbWUgPT0gZ2V0YXR0cihvdGhlciwgJ3VzZXJuYW1lJywgTm9uZSksCiAgICAgICAgICAgIHNlbGYucGFzc3dvcmQgPT0gZ2V0YXR0cihvdGhlciwgJ3Bhc3N3b3JkJywgTm9uZSkKICAgICAgICBdKQoKICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBub3Qgc2VsZiA9PSBvdGhlcgoKICAgIGRlZiBfX2NhbGxfXyhzZWxmLCByKToKICAgICAgICByLmhlYWRlcnNbJ0F1dGhvcml6YXRpb24nXSA9IF9iYXNpY19hdXRoX3N0cihzZWxmLnVzZXJuYW1lLCBzZWxmLnBhc3N3b3JkKQogICAgICAgIHJldHVybiByCgoKY2xhc3MgSFRUUFByb3h5QXV0aChIVFRQQmFzaWNBdXRoKToKICAgICIiIkF0dGFjaGVzIEhUVFAgUHJveHkgQXV0aGVudGljYXRpb24gdG8gYSBnaXZlbiBSZXF1ZXN0IG9iamVjdC4iIiIKCiAgICBkZWYgX19jYWxsX18oc2VsZiwgcik6CiAgICAgICAgci5oZWFkZXJzWydQcm94eS1BdXRob3JpemF0aW9uJ10gPSBfYmFzaWNfYXV0aF9zdHIoc2VsZi51c2VybmFtZSwgc2VsZi5wYXNzd29yZCkKICAgICAgICByZXR1cm4gcgoKCmNsYXNzIEhUVFBEaWdlc3RBdXRoKEF1dGhCYXNlKToKICAgICIiIkF0dGFjaGVzIEhUVFAgRGlnZXN0IEF1dGhlbnRpY2F0aW9uIHRvIHRoZSBnaXZlbiBSZXF1ZXN0IG9iamVjdC4iIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgdXNlcm5hbWUsIHBhc3N3b3JkKToKICAgICAgICBzZWxmLnVzZXJuYW1lID0gdXNlcm5hbWUKICAgICAgICBzZWxmLnBhc3N3b3JkID0gcGFzc3dvcmQKICAgICAgICAjIEtlZXAgc3RhdGUgaW4gcGVyLXRocmVhZCBsb2NhbCBzdG9yYWdlCiAgICAgICAgc2VsZi5fdGhyZWFkX2xvY2FsID0gdGhyZWFkaW5nLmxvY2FsKCkKCiAgICBkZWYgaW5pdF9wZXJfdGhyZWFkX3N0YXRlKHNlbGYpOgogICAgICAgICMgRW5zdXJlIHN0YXRlIGlzIGluaXRpYWxpemVkIGp1c3Qgb25jZSBwZXItdGhyZWFkCiAgICAgICAgaWYgbm90IGhhc2F0dHIoc2VsZi5fdGhyZWFkX2xvY2FsLCAnaW5pdCcpOgogICAgICAgICAgICBzZWxmLl90aHJlYWRfbG9jYWwuaW5pdCA9IFRydWUKICAgICAgICAgICAgc2VsZi5fdGhyZWFkX2xvY2FsLmxhc3Rfbm9uY2UgPSAnJwogICAgICAgICAgICBzZWxmLl90aHJlYWRfbG9jYWwubm9uY2VfY291bnQgPSAwCiAgICAgICAgICAgIHNlbGYuX3RocmVhZF9sb2NhbC5jaGFsID0ge30KICAgICAgICAgICAgc2VsZi5fdGhyZWFkX2xvY2FsLnBvcyA9IE5vbmUKICAgICAgICAgICAgc2VsZi5fdGhyZWFkX2xvY2FsLm51bV80MDFfY2FsbHMgPSBOb25lCgogICAgZGVmIGJ1aWxkX2RpZ2VzdF9oZWFkZXIoc2VsZiwgbWV0aG9kLCB1cmwpOgogICAgICAgICIiIgogICAgICAgIDpydHlwZTogc3RyCiAgICAgICAgIiIiCgogICAgICAgIHJlYWxtID0gc2VsZi5fdGhyZWFkX2xvY2FsLmNoYWxbJ3JlYWxtJ10KICAgICAgICBub25jZSA9IHNlbGYuX3RocmVhZF9sb2NhbC5jaGFsWydub25jZSddCiAgICAgICAgcW9wID0gc2VsZi5fdGhyZWFkX2xvY2FsLmNoYWwuZ2V0KCdxb3AnKQogICAgICAgIGFsZ29yaXRobSA9IHNlbGYuX3RocmVhZF9sb2NhbC5jaGFsLmdldCgnYWxnb3JpdGhtJykKICAgICAgICBvcGFxdWUgPSBzZWxmLl90aHJlYWRfbG9jYWwuY2hhbC5nZXQoJ29wYXF1ZScpCiAgICAgICAgaGFzaF91dGY4ID0gTm9uZQoKICAgICAgICBpZiBhbGdvcml0aG0gaXMgTm9uZToKICAgICAgICAgICAgX2FsZ29yaXRobSA9ICdNRDUnCiAgICAgICAgZWxzZToKICAgICAgICAgICAgX2FsZ29yaXRobSA9IGFsZ29yaXRobS51cHBlcigpCiAgICAgICAgIyBsYW1iZGFzIGFzc3VtZSBkaWdlc3QgbW9kdWxlcyBhcmUgaW1wb3J0ZWQgYXQgdGhlIHRvcCBsZXZlbAogICAgICAgIGlmIF9hbGdvcml0aG0gPT0gJ01ENScgb3IgX2FsZ29yaXRobSA9PSAnTUQ1LVNFU1MnOgogICAgICAgICAgICBkZWYgbWQ1X3V0ZjgoeCk6CiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHgsIHN0cik6CiAgICAgICAgICAgICAgICAgICAgeCA9IHguZW5jb2RlKCd1dGYtOCcpCiAgICAgICAgICAgICAgICByZXR1cm4gaGFzaGxpYi5tZDUoeCkuaGV4ZGlnZXN0KCkKICAgICAgICAgICAgaGFzaF91dGY4ID0gbWQ1X3V0ZjgKICAgICAgICBlbGlmIF9hbGdvcml0aG0gPT0gJ1NIQSc6CiAgICAgICAgICAgIGRlZiBzaGFfdXRmOCh4KToKICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoeCwgc3RyKToKICAgICAgICAgICAgICAgICAgICB4ID0geC5lbmNvZGUoJ3V0Zi04JykKICAgICAgICAgICAgICAgIHJldHVybiBoYXNobGliLnNoYTEoeCkuaGV4ZGlnZXN0KCkKICAgICAgICAgICAgaGFzaF91dGY4ID0gc2hhX3V0ZjgKCiAgICAgICAgS0QgPSBsYW1iZGEgcywgZDogaGFzaF91dGY4KCIlczolcyIgJSAocywgZCkpCgogICAgICAgIGlmIGhhc2hfdXRmOCBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgICAgICAjIFhYWCBub3QgaW1wbGVtZW50ZWQgeWV0CiAgICAgICAgZW50ZGlnID0gTm9uZQogICAgICAgIHBfcGFyc2VkID0gdXJscGFyc2UodXJsKQogICAgICAgICM6IHBhdGggaXMgcmVxdWVzdC11cmkgZGVmaW5lZCBpbiBSRkMgMjYxNiB3aGljaCBzaG91bGQgbm90IGJlIGVtcHR5CiAgICAgICAgcGF0aCA9IHBfcGFyc2VkLnBhdGggb3IgIi8iCiAgICAgICAgaWYgcF9wYXJzZWQucXVlcnk6CiAgICAgICAgICAgIHBhdGggKz0gJz8nICsgcF9wYXJzZWQucXVlcnkKCiAgICAgICAgQTEgPSAnJXM6JXM6JXMnICUgKHNlbGYudXNlcm5hbWUsIHJlYWxtLCBzZWxmLnBhc3N3b3JkKQogICAgICAgIEEyID0gJyVzOiVzJyAlIChtZXRob2QsIHBhdGgpCgogICAgICAgIEhBMSA9IGhhc2hfdXRmOChBMSkKICAgICAgICBIQTIgPSBoYXNoX3V0ZjgoQTIpCgogICAgICAgIGlmIG5vbmNlID09IHNlbGYuX3RocmVhZF9sb2NhbC5sYXN0X25vbmNlOgogICAgICAgICAgICBzZWxmLl90aHJlYWRfbG9jYWwubm9uY2VfY291bnQgKz0gMQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuX3RocmVhZF9sb2NhbC5ub25jZV9jb3VudCA9IDEKICAgICAgICBuY3ZhbHVlID0gJyUwOHgnICUgc2VsZi5fdGhyZWFkX2xvY2FsLm5vbmNlX2NvdW50CiAgICAgICAgcyA9IHN0cihzZWxmLl90aHJlYWRfbG9jYWwubm9uY2VfY291bnQpLmVuY29kZSgndXRmLTgnKQogICAgICAgIHMgKz0gbm9uY2UuZW5jb2RlKCd1dGYtOCcpCiAgICAgICAgcyArPSB0aW1lLmN0aW1lKCkuZW5jb2RlKCd1dGYtOCcpCiAgICAgICAgcyArPSBvcy51cmFuZG9tKDgpCgogICAgICAgIGNub25jZSA9IChoYXNobGliLnNoYTEocykuaGV4ZGlnZXN0KClbOjE2XSkKICAgICAgICBpZiBfYWxnb3JpdGhtID09ICdNRDUtU0VTUyc6CiAgICAgICAgICAgIEhBMSA9IGhhc2hfdXRmOCgnJXM6JXM6JXMnICUgKEhBMSwgbm9uY2UsIGNub25jZSkpCgogICAgICAgIGlmIG5vdCBxb3A6CiAgICAgICAgICAgIHJlc3BkaWcgPSBLRChIQTEsICIlczolcyIgJSAobm9uY2UsIEhBMikpCiAgICAgICAgZWxpZiBxb3AgPT0gJ2F1dGgnIG9yICdhdXRoJyBpbiBxb3Auc3BsaXQoJywnKToKICAgICAgICAgICAgbm9uY2ViaXQgPSAiJXM6JXM6JXM6JXM6JXMiICUgKAogICAgICAgICAgICAgICAgbm9uY2UsIG5jdmFsdWUsIGNub25jZSwgJ2F1dGgnLCBIQTIKICAgICAgICAgICAgKQogICAgICAgICAgICByZXNwZGlnID0gS0QoSEExLCBub25jZWJpdCkKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIFhYWCBoYW5kbGUgYXV0aC1pbnQuCiAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgICAgIHNlbGYuX3RocmVhZF9sb2NhbC5sYXN0X25vbmNlID0gbm9uY2UKCiAgICAgICAgIyBYWFggc2hvdWxkIHRoZSBwYXJ0aWFsIGRpZ2VzdHMgYmUgZW5jb2RlZCB0b28/CiAgICAgICAgYmFzZSA9ICd1c2VybmFtZT0iJXMiLCByZWFsbT0iJXMiLCBub25jZT0iJXMiLCB1cmk9IiVzIiwgJyBcCiAgICAgICAgICAgICAgICdyZXNwb25zZT0iJXMiJyAlIChzZWxmLnVzZXJuYW1lLCByZWFsbSwgbm9uY2UsIHBhdGgsIHJlc3BkaWcpCiAgICAgICAgaWYgb3BhcXVlOgogICAgICAgICAgICBiYXNlICs9ICcsIG9wYXF1ZT0iJXMiJyAlIG9wYXF1ZQogICAgICAgIGlmIGFsZ29yaXRobToKICAgICAgICAgICAgYmFzZSArPSAnLCBhbGdvcml0aG09IiVzIicgJSBhbGdvcml0aG0KICAgICAgICBpZiBlbnRkaWc6CiAgICAgICAgICAgIGJhc2UgKz0gJywgZGlnZXN0PSIlcyInICUgZW50ZGlnCiAgICAgICAgaWYgcW9wOgogICAgICAgICAgICBiYXNlICs9ICcsIHFvcD0iYXV0aCIsIG5jPSVzLCBjbm9uY2U9IiVzIicgJSAobmN2YWx1ZSwgY25vbmNlKQoKICAgICAgICByZXR1cm4gJ0RpZ2VzdCAlcycgJSAoYmFzZSkKCiAgICBkZWYgaGFuZGxlX3JlZGlyZWN0KHNlbGYsIHIsICoqa3dhcmdzKToKICAgICAgICAiIiJSZXNldCBudW1fNDAxX2NhbGxzIGNvdW50ZXIgb24gcmVkaXJlY3RzLiIiIgogICAgICAgIGlmIHIuaXNfcmVkaXJlY3Q6CiAgICAgICAgICAgIHNlbGYuX3RocmVhZF9sb2NhbC5udW1fNDAxX2NhbGxzID0gMQoKICAgIGRlZiBoYW5kbGVfNDAxKHNlbGYsIHIsICoqa3dhcmdzKToKICAgICAgICAiIiIKICAgICAgICBUYWtlcyB0aGUgZ2l2ZW4gcmVzcG9uc2UgYW5kIHRyaWVzIGRpZ2VzdC1hdXRoLCBpZiBuZWVkZWQuCgogICAgICAgIDpydHlwZTogcmVxdWVzdHMuUmVzcG9uc2UKICAgICAgICAiIiIKCiAgICAgICAgIyBJZiByZXNwb25zZSBpcyBub3QgNHh4LCBkbyBub3QgYXV0aAogICAgICAgICMgU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9yZXF1ZXN0cy9yZXF1ZXN0cy9pc3N1ZXMvMzc3MgogICAgICAgIGlmIG5vdCA0MDAgPD0gci5zdGF0dXNfY29kZSA8IDUwMDoKICAgICAgICAgICAgc2VsZi5fdGhyZWFkX2xvY2FsLm51bV80MDFfY2FsbHMgPSAxCiAgICAgICAgICAgIHJldHVybiByCgogICAgICAgIGlmIHNlbGYuX3RocmVhZF9sb2NhbC5wb3MgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICMgUmV3aW5kIHRoZSBmaWxlIHBvc2l0aW9uIGluZGljYXRvciBvZiB0aGUgYm9keSB0byB3aGVyZQogICAgICAgICAgICAjIGl0IHdhcyB0byByZXNlbmQgdGhlIHJlcXVlc3QuCiAgICAgICAgICAgIHIucmVxdWVzdC5ib2R5LnNlZWsoc2VsZi5fdGhyZWFkX2xvY2FsLnBvcykKICAgICAgICBzX2F1dGggPSByLmhlYWRlcnMuZ2V0KCd3d3ctYXV0aGVudGljYXRlJywgJycpCgogICAgICAgIGlmICdkaWdlc3QnIGluIHNfYXV0aC5sb3dlcigpIGFuZCBzZWxmLl90aHJlYWRfbG9jYWwubnVtXzQwMV9jYWxscyA8IDI6CgogICAgICAgICAgICBzZWxmLl90aHJlYWRfbG9jYWwubnVtXzQwMV9jYWxscyArPSAxCiAgICAgICAgICAgIHBhdCA9IHJlLmNvbXBpbGUocidkaWdlc3QgJywgZmxhZ3M9cmUuSUdOT1JFQ0FTRSkKICAgICAgICAgICAgc2VsZi5fdGhyZWFkX2xvY2FsLmNoYWwgPSBwYXJzZV9kaWN0X2hlYWRlcihwYXQuc3ViKCcnLCBzX2F1dGgsIGNvdW50PTEpKQoKICAgICAgICAgICAgIyBDb25zdW1lIGNvbnRlbnQgYW5kIHJlbGVhc2UgdGhlIG9yaWdpbmFsIGNvbm5lY3Rpb24KICAgICAgICAgICAgIyB0byBhbGxvdyBvdXIgbmV3IHJlcXVlc3QgdG8gcmV1c2UgdGhlIHNhbWUgb25lLgogICAgICAgICAgICByLmNvbnRlbnQKICAgICAgICAgICAgci5jbG9zZSgpCiAgICAgICAgICAgIHByZXAgPSByLnJlcXVlc3QuY29weSgpCiAgICAgICAgICAgIGV4dHJhY3RfY29va2llc190b19qYXIocHJlcC5fY29va2llcywgci5yZXF1ZXN0LCByLnJhdykKICAgICAgICAgICAgcHJlcC5wcmVwYXJlX2Nvb2tpZXMocHJlcC5fY29va2llcykKCiAgICAgICAgICAgIHByZXAuaGVhZGVyc1snQXV0aG9yaXphdGlvbiddID0gc2VsZi5idWlsZF9kaWdlc3RfaGVhZGVyKAogICAgICAgICAgICAgICAgcHJlcC5tZXRob2QsIHByZXAudXJsKQogICAgICAgICAgICBfciA9IHIuY29ubmVjdGlvbi5zZW5kKHByZXAsICoqa3dhcmdzKQogICAgICAgICAgICBfci5oaXN0b3J5LmFwcGVuZChyKQogICAgICAgICAgICBfci5yZXF1ZXN0ID0gcHJlcAoKICAgICAgICAgICAgcmV0dXJuIF9yCgogICAgICAgIHNlbGYuX3RocmVhZF9sb2NhbC5udW1fNDAxX2NhbGxzID0gMQogICAgICAgIHJldHVybiByCgogICAgZGVmIF9fY2FsbF9fKHNlbGYsIHIpOgogICAgICAgICMgSW5pdGlhbGl6ZSBwZXItdGhyZWFkIHN0YXRlLCBpZiBuZWVkZWQKICAgICAgICBzZWxmLmluaXRfcGVyX3RocmVhZF9zdGF0ZSgpCiAgICAgICAgIyBJZiB3ZSBoYXZlIGEgc2F2ZWQgbm9uY2UsIHNraXAgdGhlIDQwMQogICAgICAgIGlmIHNlbGYuX3RocmVhZF9sb2NhbC5sYXN0X25vbmNlOgogICAgICAgICAgICByLmhlYWRlcnNbJ0F1dGhvcml6YXRpb24nXSA9IHNlbGYuYnVpbGRfZGlnZXN0X2hlYWRlcihyLm1ldGhvZCwgci51cmwpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLl90aHJlYWRfbG9jYWwucG9zID0gci5ib2R5LnRlbGwoKQogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgIyBJbiB0aGUgY2FzZSBvZiBIVFRQRGlnZXN0QXV0aCBiZWluZyByZXVzZWQgYW5kIHRoZSBib2R5IG9mCiAgICAgICAgICAgICMgdGhlIHByZXZpb3VzIHJlcXVlc3Qgd2FzIGEgZmlsZS1saWtlIG9iamVjdCwgcG9zIGhhcyB0aGUKICAgICAgICAgICAgIyBmaWxlIHBvc2l0aW9uIG9mIHRoZSBwcmV2aW91cyBib2R5LiBFbnN1cmUgaXQncyBzZXQgdG8KICAgICAgICAgICAgIyBOb25lLgogICAgICAgICAgICBzZWxmLl90aHJlYWRfbG9jYWwucG9zID0gTm9uZQogICAgICAgIHIucmVnaXN0ZXJfaG9vaygncmVzcG9uc2UnLCBzZWxmLmhhbmRsZV80MDEpCiAgICAgICAgci5yZWdpc3Rlcl9ob29rKCdyZXNwb25zZScsIHNlbGYuaGFuZGxlX3JlZGlyZWN0KQogICAgICAgIHNlbGYuX3RocmVhZF9sb2NhbC5udW1fNDAxX2NhbGxzID0gMQoKICAgICAgICByZXR1cm4gcgoKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBhbGwoWwogICAgICAgICAgICBzZWxmLnVzZXJuYW1lID09IGdldGF0dHIob3RoZXIsICd1c2VybmFtZScsIE5vbmUpLAogICAgICAgICAgICBzZWxmLnBhc3N3b3JkID09IGdldGF0dHIob3RoZXIsICdwYXNzd29yZCcsIE5vbmUpCiAgICAgICAgXSkKCiAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gbm90IHNlbGYgPT0gb3RoZXIKUEsDBBQAAAAAAAAAIQAFodr18CIEAPAiBAA8AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9yZXF1ZXN0cy9jYWNlcnQucGVtCiMgSXNzdWVyOiBDTj1HbG9iYWxTaWduIFJvb3QgQ0EgTz1HbG9iYWxTaWduIG52LXNhIE9VPVJvb3QgQ0EKIyBTdWJqZWN0OiBDTj1HbG9iYWxTaWduIFJvb3QgQ0EgTz1HbG9iYWxTaWduIG52LXNhIE9VPVJvb3QgQ0EKIyBMYWJlbDogIkdsb2JhbFNpZ24gUm9vdCBDQSIKIyBTZXJpYWw6IDQ4MzU3MDMyNzg0NTk3MDc2NjkwMDUyMDQKIyBNRDUgRmluZ2VycHJpbnQ6IDNlOjQ1OjUyOjE1OjA5OjUxOjkyOmUxOmI3OjVkOjM3OjlmOmIxOjg3OjI5OjhhCiMgU0hBMSBGaW5nZXJwcmludDogYjE6YmM6OTY6OGI6ZDQ6ZjQ6OWQ6NjI6MmE6YTg6OWE6ODE6ZjI6MTU6MDE6NTI6YTQ6MWQ6ODI6OWMKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGViOmQ0OjEwOjQwOmU0OmJiOjNlOmM3OjQyOmM5OmUzOjgxOmQzOjFlOmYyOmE0OjFhOjQ4OmI2OjY4OjVjOjk2OmU3OmNlOmYzOmMxOmRmOjZjOmQ0OjMzOjFjOjk5Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEZFRDQ0FsMmdBd0lCQWdJTEJBQUFBQUFCRlV0YXc1UXdEUVlKS29aSWh2Y05BUUVGQlFBd1Z6RUxNQWtHCkExVUVCaE1DUWtVeEdUQVhCZ05WQkFvVEVFZHNiMkpoYkZOcFoyNGdibll0YzJFeEVEQU9CZ05WQkFzVEIxSnYKYjNRZ1EwRXhHekFaQmdOVkJBTVRFa2RzYjJKaGJGTnBaMjRnVW05dmRDQkRRVEFlRncwNU9EQTVNREV4TWpBdwpNREJhRncweU9EQXhNamd4TWpBd01EQmFNRmN4Q3pBSkJnTlZCQVlUQWtKRk1Sa3dGd1lEVlFRS0V4QkhiRzlpCllXeFRhV2R1SUc1MkxYTmhNUkF3RGdZRFZRUUxFd2RTYjI5MElFTkJNUnN3R1FZRFZRUURFeEpIYkc5aVlXeFQKYVdkdUlGSnZiM1FnUTBFd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUURhRHVhWgpqYzZqNDArS2Z2dnhpNE1sYStwSUgvRXFzTG1WRVFTOThHUFI0bWRtenh6ZHp4dElLKzZOaVk2YXJ5bUFaYXZwCnh5MFN5NnNjVEhBSG9UMEtNTTBWalUvNDNkU01VQlVjNzFEdXhDNzMvT2xTOHBGOTRHM1ZOVENPWGtOejhrSHAKMVdyanNvazZWams0YndZOGlHbGJLazNGcDFTNGJJbk1tL2s4eXVYOWlmVVNQSko0bHRiY2RHNlRSR0hSamNkRwpzblVPaHVnWml0VnRiTlY0RnBXaTZjZ0tPT3Z5SkJOUGMxU1RFNFU2Rzd3ZU5MV0xCWXk1ZDR1eDJ4OGdrYXNKClUyNlF6bnMzZExsd1I1RWlVV01XZWE2eHJrRW1DTWdaSzlGR3FraldaQ3JYZ3pUL0xDckJiQmxEU2dlRjU5TjgKOWlGbzcrcnlVcDkvazVEUEFnTUJBQUdqUWpCQU1BNEdBMVVkRHdFQi93UUVBd0lCQmpBUEJnTlZIUk1CQWY4RQpCVEFEQVFIL01CMEdBMVVkRGdRV0JCUmdlMllhUlEyWHlvbFFMMzBFelRTby8vejlTekFOQmdrcWhraUc5dzBCCkFRVUZBQU9DQVFFQTFuUG5mRTkyMEkyLzdMcWl2alRGS0RLMWZQeHNuQ3dydlFtZVU3OXJYcW9SU0xibENLT3oKeWoxaFRkTkdDYk0rdzZEalkxVWI4cnJ2clRuaFE3azRvK1l2aWlZNzc2QlFWdm5HQ3YwNHpjUUxjRkdVbDVnRQozOE5mbE5VVnlSUkJuTVJkZFdRVkRmOVZNT3lHai84Tjd5eTVZMGIycXZ6ZnZHbjlMaEpJWkpyZ2xmQ203eW1QCkFiRVZ0UXdkcGY1cExHa2tlQjZ6cHh4eFl1N0t5SmVzRjEyS3d2aEhobTRxeEZZeGxkQm5pWVVyK1d5bVhVYWQKREtxQzVKbFIzWEMzMjFZOVllUnE0VnpXOXY0OTNrSE1CNjVqVXI5VFUvUXI2Y2Y5dHZlQ1g0WFNRUmpiZ2JNRQpITVVmcElCdkZTREozZ3lJQ2gzV1psWGkvRWpKS1NacDRBPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUdsb2JhbFNpZ24gTz1HbG9iYWxTaWduIE9VPUdsb2JhbFNpZ24gUm9vdCBDQSAtIFIyCiMgU3ViamVjdDogQ049R2xvYmFsU2lnbiBPPUdsb2JhbFNpZ24gT1U9R2xvYmFsU2lnbiBSb290IENBIC0gUjIKIyBMYWJlbDogIkdsb2JhbFNpZ24gUm9vdCBDQSAtIFIyIgojIFNlcmlhbDogNDgzNTcwMzI3ODQ1OTY4Mjg4NTY1ODEyNQojIE1ENSBGaW5nZXJwcmludDogOTQ6MTQ6Nzc6N2U6M2U6NWU6ZmQ6OGY6MzA6YmQ6NDE6YjA6Y2Y6ZTc6ZDA6MzAKIyBTSEExIEZpbmdlcnByaW50OiA3NTplMDphYjpiNjoxMzo4NToxMjoyNzoxYzowNDpmODo1ZjpkZDpkZTozODplNDpiNzoyNDoyZTpmZQojIFNIQTI1NiBGaW5nZXJwcmludDogY2E6NDI6ZGQ6NDE6NzQ6NWY6ZDA6Yjg6MWU6Yjk6MDI6MzY6MmM6Zjk6ZDg6YmY6NzE6OWQ6YTE6YmQ6MWI6MWU6ZmM6OTQ6NmY6NWI6NGM6OTk6ZjQ6MmM6MWI6OWUKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR1akNDQXFLZ0F3SUJBZ0lMQkFBQUFBQUJENFltNWcwd0RRWUpLb1pJaHZjTkFRRUZCUUF3VERFZ01CNEcKQTFVRUN4TVhSMnh2WW1Gc1UybG5iaUJTYjI5MElFTkJJQzBnVWpJeEV6QVJCZ05WQkFvVENrZHNiMkpoYkZOcApaMjR4RXpBUkJnTlZCQU1UQ2tkc2IySmhiRk5wWjI0d0hoY05NRFl4TWpFMU1EZ3dNREF3V2hjTk1qRXhNakUxCk1EZ3dNREF3V2pCTU1TQXdIZ1lEVlFRTEV4ZEhiRzlpWVd4VGFXZHVJRkp2YjNRZ1EwRWdMU0JTTWpFVE1CRUcKQTFVRUNoTUtSMnh2WW1Gc1UybG5iakVUTUJFR0ExVUVBeE1LUjJ4dlltRnNVMmxuYmpDQ0FTSXdEUVlKS29aSQpodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUtiUEpBNitMbThvbVVWQ3hLcytJVlNiQzlOL2hIRDZFclBMCnY0ZGZ4bitHMDdJd1hOYjlyZkY3M09YNFlKWUpraEQxMEZQZSszdCtjNGlzVW9oN1NxYktTYVplcUtlTVdoRzgKZW9McnZvenBzNnlXSlFlWFNwa3FCeSswSG5lL2lnKzFBbndibHJqRnVUb3N2TllTdWV0WmZlTFFCb1pmWGtscQp0VGxlaURUc3ZIZ01DSmlFYktqTlM3U2dmUXg1VGZDNExjc2h5dFZzVzMzaG9DbUVvZm5UbEVuTEpHS1JJTHpkCkM5WFp6UG5xSndvcmM1SEduUnVzeU12bzRLRDBMNUNMVGZ1d05odjJHWHFGNEczeVlST0lYSi9na3dwUmw0cGEKenErcjFmZXFDYXBndmR6Wlg5OXlxV0FUWGdBQnlVcjZQNlRxQndNaEFvNkN5Z1BDbTQ4Q0F3RUFBYU9CbkRDQgptVEFPQmdOVkhROEJBZjhFQkFNQ0FRWXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QWRCZ05WSFE0RUZnUVVtK0lIClYyY2NIc0JxQnQ1WnRKb3QzOXdaaGk0d05nWURWUjBmQkM4d0xUQXJvQ21nSjRZbGFIUjBjRG92TDJOeWJDNW4KYkc5aVlXeHphV2R1TG01bGRDOXliMjkwTFhJeUxtTnliREFmQmdOVkhTTUVHREFXZ0JTYjRnZFhaeHdld0dvRwozbG0wbWkzZjNCbUdMakFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBbVlGVGh4eG9sNGFSN09CS3VFUUxxNEdzCkowL1d3YmdjUTNpekRKcjg2aXc4Ym1FYlRVc3A5WjhGSFNiQnVPbURBR0pGdHFrSWs3bXBNMHNZbXNMNGg0aE8KMjkxeE5CckJWTnBHUCtEVEtxdHRWQ0wxT21MTklHKzZLWW5YM1pIdTAxeWlQcUZiUWZYZjVXUkRMZW5WT2F2UwpvdCszaTlEQWdCa2NSY0F0ak9qNExhUjBWa25GQmJWUEZkNXVSSGc1aDZoK3UvTjVHSkc3OUcrZHdmQ01OWXhkCkFmdkRiYm52UkcxNVJqRitDdjZwZ3NILzc2dHVJTVJReVYrZFRac1hqQXpsQWNtZ1FXcHpVL3FsVUxSdUpRLzcKVEJqMC9WTFpqbW14NkJFUDNvalkreDFKOTZyZWxjOGdlTUpnRXRzbFFJeHEvSDVDT0VCa0V2ZWVnZUdUTGc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049VmVyaVNpZ24gQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczIE89VmVyaVNpZ24sIEluYy4gT1U9VmVyaVNpZ24gVHJ1c3QgTmV0d29yay8oYykgMTk5OSBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgU3ViamVjdDogQ049VmVyaVNpZ24gQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczIE89VmVyaVNpZ24sIEluYy4gT1U9VmVyaVNpZ24gVHJ1c3QgTmV0d29yay8oYykgMTk5OSBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgTGFiZWw6ICJWZXJpc2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzMiCiMgU2VyaWFsOiAyMDY2ODQ2OTYyNzk0NzIzMTAyNTQyNzc4NzAxODA5NjY3MjM0MTUKIyBNRDUgRmluZ2VycHJpbnQ6IGNkOjY4OmI2OmE3OmM3OmM0OmNlOjc1OmUwOjFkOjRmOjU3OjQ0OjYxOjkyOjA5CiMgU0hBMSBGaW5nZXJwcmludDogMTM6MmQ6MGQ6NDU6NTM6NGI6Njk6OTc6Y2Q6YjI6ZDU6YzM6Mzk6ZTI6NTU6NzY6NjA6OWI6NWM6YzYKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGViOjA0OmNmOjVlOmIxOmYzOjlhOmZhOjc2OjJmOjJiOmIxOjIwOmYyOjk2OmNiOmE1OjIwOmMxOmI5OjdkOmIxOjU4Ojk1OjY1OmI4OjFjOmI5OmExOjdiOjcyOjQ0Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFR2pDQ0F3SUNFUUNiZmdaSm96NWl1ZFh1a0VoeEtlOVhNQTBHQ1NxR1NJYjNEUUVCQlFVQU1JSEtNUXN3CkNRWURWUVFHRXdKVlV6RVhNQlVHQTFVRUNoTU9WbVZ5YVZOcFoyNHNJRWx1WXk0eEh6QWRCZ05WQkFzVEZsWmwKY21sVGFXZHVJRlJ5ZFhOMElFNWxkSGR2Y21zeE9qQTRCZ05WQkFzVE1TaGpLU0F4T1RrNUlGWmxjbWxUYVdkdQpMQ0JKYm1NdUlDMGdSbTl5SUdGMWRHaHZjbWw2WldRZ2RYTmxJRzl1YkhreFJUQkRCZ05WQkFNVFBGWmxjbWxUCmFXZHVJRU5zWVhOeklETWdVSFZpYkdsaklGQnlhVzFoY25rZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnAKZEhrZ0xTQkhNekFlRncwNU9URXdNREV3TURBd01EQmFGdzB6TmpBM01UWXlNelU1TlRsYU1JSEtNUXN3Q1FZRApWUVFHRXdKVlV6RVhNQlVHQTFVRUNoTU9WbVZ5YVZOcFoyNHNJRWx1WXk0eEh6QWRCZ05WQkFzVEZsWmxjbWxUCmFXZHVJRlJ5ZFhOMElFNWxkSGR2Y21zeE9qQTRCZ05WQkFzVE1TaGpLU0F4T1RrNUlGWmxjbWxUYVdkdUxDQkoKYm1NdUlDMGdSbTl5SUdGMWRHaHZjbWw2WldRZ2RYTmxJRzl1YkhreFJUQkRCZ05WQkFNVFBGWmxjbWxUYVdkdQpJRU5zWVhOeklETWdVSFZpYkdsaklGQnlhVzFoY25rZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGtnCkxTQkhNekNDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFNdTZuRkw4ZUI4YUhtOGIKTjNPOStNbHJsQkl3VC9BMlIvWFFrUXIxRjhpbFljRVdRRTM3aW1HUTVYWWd3UkVHZmFzc2JxYjFFVUdPK2kydApLbUZacEdjbVRORG92RkpiY0NBRVdORjZ5YVJwdklNWFpLMEZpN3pRV002TmpQWHI4RUpKQzUyWEoyY3lidUd1Cmt4VWNjTHdnVFM4WTNwS0k2R3lGVnhFYTZYN2pKaEZVb2tXV1ZZUEtNSW5vM05pajdTcUFQMzk1WlZjK0ZTQm0KQ0MrVms3K3FSeStvUnBmd0V1TCt3Z29yVWVaMjVyZEd0K0lOcHN5b3cweFpWWW5tNkZOY0hPcWQ4R0lXQzZmSgpYd3p3M3NKMnpxLzNhdkw2UWFhaU14VEo1WHBqMDU1aU45V0ZaWjRPNWxNa2RCdGVIUkpUVzhjczU0TkpPeFd1CmltaTVWNWNDQXdFQUFUQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFFUlNXd2F1U0NQYy9MOG15L3VSYW4yVGUKMnlGUGhwazBkalpYM2RBVkw4V3RmeFVmTjJKelB0VG5YODRYQTlzMStpdmJybUFKWHg1ZmoyNjdDejNxV2hNZQpER0J2dGNDMUl5SXVCd3ZMcVhUTFI3c2R3ZGVsYTh3djBrTDlTZDJuaWM5VHV0b0FXaWkvZ3QvNHVoTWRVSWFDCi9ZNHdqeWxHc0I0OU5kbzRZaFlZU3EzbXRsRnMzcTlpNndIUUhpVCtlbzhTR2hKb3VQdG1tUlFVUlZ5dTU2NXAKRjRFcldqZkpYaXIweHVLaFhGU2JwbFFBei9EeHdjZVlNQm83TmhiYm8yN3EvYTJ5d3RydkFrY1Rpc0R4c3pHdApUeHpoVDV5dkR3eWQ5M2dOMlBRMVZvRGF0MjBYajUwZWdXVGgvc1ZGdXExcnVRcDZUazlMaE81TDhYM2RFUT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1FbnRydXN0Lm5ldCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAoMjA0OCkgTz1FbnRydXN0Lm5ldCBPVT13d3cuZW50cnVzdC5uZXQvQ1BTXzIwNDggaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pLyhjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQKIyBTdWJqZWN0OiBDTj1FbnRydXN0Lm5ldCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAoMjA0OCkgTz1FbnRydXN0Lm5ldCBPVT13d3cuZW50cnVzdC5uZXQvQ1BTXzIwNDggaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pLyhjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQKIyBMYWJlbDogIkVudHJ1c3QubmV0IFByZW1pdW0gMjA0OCBTZWN1cmUgU2VydmVyIENBIgojIFNlcmlhbDogOTQ2MDY5MjQwCiMgTUQ1IEZpbmdlcnByaW50OiBlZToyOTozMTpiYzozMjo3ZTo5YTplNjplODpiNTpmNzo1MTpiNDozNDo3MTo5MAojIFNIQTEgRmluZ2VycHJpbnQ6IDUwOjMwOjA2OjA5OjFkOjk3OmQ0OmY1OmFlOjM5OmY3OmNiOmU3OjkyOjdkOjdkOjY1OjJkOjM0OjMxCiMgU0hBMjU2IEZpbmdlcnByaW50OiA2ZDpjNDo3MTo3MjplMDoxYzpiYzpiMDpiZjo2Mjo1ODowZDo4OTo1ZjplMjpiODphYzo5YTpkNDpmODo3Mzo4MDoxZTowYzoxMDpiOTpjODozNzpkMjoxZTpiMTo3NwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRUtqQ0NBeEtnQXdJQkFnSUVPR1BlK0RBTkJna3Foa2lHOXcwQkFRVUZBRENCdERFVU1CSUdBMVVFQ2hNTApSVzUwY25WemRDNXVaWFF4UURBK0JnTlZCQXNVTjNkM2R5NWxiblJ5ZFhOMExtNWxkQzlEVUZOZk1qQTBPQ0JwCmJtTnZjbkF1SUdKNUlISmxaaTRnS0d4cGJXbDBjeUJzYVdGaUxpa3hKVEFqQmdOVkJBc1RIQ2hqS1NBeE9UazUKSUVWdWRISjFjM1F1Ym1WMElFeHBiV2wwWldReE16QXhCZ05WQkFNVEtrVnVkSEoxYzNRdWJtVjBJRU5sY25ScApabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVJQ2d5TURRNEtUQWVGdzA1T1RFeU1qUXhOelV3TlRGYUZ3MHlPVEEzCk1qUXhOREUxTVRKYU1JRzBNUlF3RWdZRFZRUUtFd3RGYm5SeWRYTjBMbTVsZERGQU1ENEdBMVVFQ3hRM2QzZDMKTG1WdWRISjFjM1F1Ym1WMEwwTlFVMTh5TURRNElHbHVZMjl5Y0M0Z1lua2djbVZtTGlBb2JHbHRhWFJ6SUd4cApZV0l1S1RFbE1DTUdBMVVFQ3hNY0tHTXBJREU1T1RrZ1JXNTBjblZ6ZEM1dVpYUWdUR2x0YVhSbFpERXpNREVHCkExVUVBeE1xUlc1MGNuVnpkQzV1WlhRZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGtnS0RJd05EZ3AKTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUFyVTFMcVJLR3N1cWpJQWNWRm1RcQpLMHZSdnd0S1RZN3RnSGFsWjdkNFFNQnpRc2hvd050VEs5MWV1SGFZTlpPTEdwMThFem9PSDF1M0hzL2xKQlFlCnNZR3BqWDI0ekd0TEEvRUNETnlycFVBa0FIOTBsS0dkQ0NtemlBdjFoM2VkVmMza3czN1hhbVNyaFJTR2xWdVgKTWxCdlBjaTZaZ3pqL0wyNFNjRjJpVWtaL2NDb3ZZbWpaeS9Hbjd4eEdXQzRMZWtzeVpCMlpudVU0cTk0MW1WVApYVHpXbkxMUEtRUDVMNlJRc3RSSXpnVXlWWXI5c21STUR1U1lCM1hiZjkrNUNGVmdoVEFwK1h0SXBHbUc0elUvCkhvWmRlbm9WdmU4QWpoVWlWQmNBa0NhVHZBNUphSkcvK0VmVG5aVkN3UTVOMzI4bXo4TVlJV0ptUTNEVzFjQUgKNFFJREFRQUJvMEl3UURBT0JnTlZIUThCQWY4RUJBTUNBUVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFkQmdOVgpIUTRFRmdRVVZlU0IwUkdBdnRpSnVRaWpNZm1oSkFrV3VYQXdEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUJBRHViCmoxYWJNT2RUbVh4NmVhZE5sOWNabFpEN0JoL0tNM3hHWTQrV1ppVDZRQnNoSjhybWNuUHlULzR4bWYzSURFeG8KVThhQWdoT1krcmF0MmwwOThjNXU5aFVSbElJTTdqK1ZyeEdyRDljdjNoOERqMWNzSHNtN21ocEVsZXNZVDZZZgp6WDFYRUMrYkJBbGFoTFZ1MkIwNjRkYWUwV3g1WG5rY0ZNWGowRXlUTzJVODdkODl2cWJsbFJyRHRSbkR2VjViCnUvOGo3MmdaeXhLVEoxd0RMVzh3MEI2MkdxemVXdmZScXFnbnB2NTVnY1I1bVROWHVoS3dxZUJDYkpQS1Z0NysKYllRTENJdCtqZXJYbUNIRzgrYzhlUzllbk5GTUZZM2g3Q0kzekpwREM1ZmNnSkNOczJlYmIwZ0lGVmJQdi9FcgpmRjZhZHVsWmtNVjhnelVSWlZFPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049QmFsdGltb3JlIEN5YmVyVHJ1c3QgUm9vdCBPPUJhbHRpbW9yZSBPVT1DeWJlclRydXN0CiMgU3ViamVjdDogQ049QmFsdGltb3JlIEN5YmVyVHJ1c3QgUm9vdCBPPUJhbHRpbW9yZSBPVT1DeWJlclRydXN0CiMgTGFiZWw6ICJCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290IgojIFNlcmlhbDogMzM1NTQ2MTcKIyBNRDUgRmluZ2VycHJpbnQ6IGFjOmI2Ojk0OmE1OjljOjE3OmUwOmQ3OjkxOjUyOjliOmIxOjk3OjA2OmE2OmU0CiMgU0hBMSBGaW5nZXJwcmludDogZDQ6ZGU6MjA6ZDA6NWU6NjY6ZmM6NTM6ZmU6MWE6NTA6ODg6MmM6Nzg6ZGI6Mjg6NTI6Y2E6ZTQ6NzQKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDE2OmFmOjU3OmE5OmY2Ojc2OmIwOmFiOjEyOjYwOjk1OmFhOjVlOmJhOmRlOmYyOjJhOmIzOjExOjE5OmQ2OjQ0OmFjOjk1OmNkOjRiOjkzOmRiOmYzOmYyOjZhOmViCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEZHpDQ0FsK2dBd0lCQWdJRUFnQUF1VEFOQmdrcWhraUc5dzBCQVFVRkFEQmFNUXN3Q1FZRFZRUUdFd0pKClJURVNNQkFHQTFVRUNoTUpRbUZzZEdsdGIzSmxNUk13RVFZRFZRUUxFd3BEZVdKbGNsUnlkWE4wTVNJd0lBWUQKVlFRREV4bENZV3gwYVcxdmNtVWdRM2xpWlhKVWNuVnpkQ0JTYjI5ME1CNFhEVEF3TURVeE1qRTRORFl3TUZvWApEVEkxTURVeE1qSXpOVGt3TUZvd1dqRUxNQWtHQTFVRUJoTUNTVVV4RWpBUUJnTlZCQW9UQ1VKaGJIUnBiVzl5ClpURVRNQkVHQTFVRUN4TUtRM2xpWlhKVWNuVnpkREVpTUNBR0ExVUVBeE1aUW1Gc2RHbHRiM0psSUVONVltVnkKVkhKMWMzUWdVbTl2ZERDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBS01FdXlLcgptRDFYNkNaeW1yVjUxQ25pNGVpVmdMR3c0MXVPS3ltYVpOK2hYZTJ3Q1FWdDJ5Z3V6bUtpWXY2MGlOb1M2empyCklaM0FRU3NCVW51SWQ5TWNqOGU2dVlpMWFnbm5jK2dSUUtmUnpNcGlqUzNsand1bVVOS29VTU1vNnZXckpZZUsKbXBZY3FXZTRQd3pWOS9sU0V5L0NHOVZ3Y1BDUHdCTEtCc3VhNGRuS00zcDMxdmpzdWZGb1JFSklFOUxBd3FTdQpYbUQrdHFZRi9MVGRCMWtDMUZrWW1HUDFwV1Bna0F4OVhiSUdldk9GNnV2VUE2NWVoRDVmL3hYdGFiejVPVFp5CmRjOTNVazN6eVpBc3VUM2x5U05UUHg4a21DRmNCNWtwdmNZNjdPZHVoanBybDNSak03MW9HREh3ZUkxMnYveWUKamwwcWhxZE5rTnduR2prQ0F3RUFBYU5GTUVNd0hRWURWUjBPQkJZRUZPV2RXVENDUjFqTXJQb0lWRGFHZXpxMQpCRTN3TUJJR0ExVWRFd0VCL3dRSU1BWUJBZjhDQVFNd0RnWURWUjBQQVFIL0JBUURBZ0VHTUEwR0NTcUdTSWIzCkRRRUJCUVVBQTRJQkFRQ0ZERjJPNUc5UmFFSUZvTjI3VHljbGhBTzk5MlQ5TGRjdzQ2UVFGK3ZhS1NtMmVUOTIKOWhrVEk3Z1FDdmxZcE5SaGNMMEVZV29TaWhmVkNyM0Z2REI4MXVrTUpZMkdRRS9zektOK09NWTNFVS90M1dneApqa3pTc3dGMDdyNTFYZ2RJR245dy94WmNoTUI1aGJnRi9YKytaUkdqRDhBQ3RQaFNOemtFMWFreGVoaS9vQ3IwCkVwbjNvMFdDNHp4ZTlaMmV0Y2llZkM3SXBKNU9DQlJMYmYxd2JXc2FZNzFrNWgrM3p2RHlueTY3RzdmeVVJaHoKa3NMaTR4YU5taklDcTQ0WTNla1FFZTUrTmF1UXJ6NHdsSHJRTXoyblpRLzEvSTZlWXM5SFJDd0JYYnNkdFRMUwpSOUk0THREK2dkd3lhaDYxN2p6Vi9PZUJIUm5ESkVMcVl6bXAKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3QgTz1BZGRUcnVzdCBBQiBPVT1BZGRUcnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yawojIFN1YmplY3Q6IENOPUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3QgTz1BZGRUcnVzdCBBQiBPVT1BZGRUcnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yawojIExhYmVsOiAiQWRkVHJ1c3QgRXh0ZXJuYWwgUm9vdCIKIyBTZXJpYWw6IDEKIyBNRDUgRmluZ2VycHJpbnQ6IDFkOjM1OjU0OjA0Ojg1Ojc4OmIwOjNmOjQyOjQyOjRkOmJmOjIwOjczOjBhOjNmCiMgU0hBMSBGaW5nZXJwcmludDogMDI6ZmE6ZjM6ZTI6OTE6NDM6NTQ6Njg6NjA6Nzg6NTc6Njk6NGQ6ZjU6ZTQ6NWI6Njg6ODU6MTg6NjgKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDY4OjdmOmE0OjUxOjM4OjIyOjc4OmZmOmYwOmM4OmIxOjFmOjhkOjQzOmQ1Ojc2OjY3OjFjOjZlOmIyOmJjOmVhOmI0OjEzOmZiOjgzOmQ5OjY1OmQwOjZkOjJmOmYyCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFTmpDQ0F4NmdBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURCdk1Rc3dDUVlEVlFRR0V3SlRSVEVVCk1CSUdBMVVFQ2hNTFFXUmtWSEoxYzNRZ1FVSXhKakFrQmdOVkJBc1RIVUZrWkZSeWRYTjBJRVY0ZEdWeWJtRnMKSUZSVVVDQk9aWFIzYjNKck1TSXdJQVlEVlFRREV4bEJaR1JVY25WemRDQkZlSFJsY201aGJDQkRRU0JTYjI5MApNQjRYRFRBd01EVXpNREV3TkRnek9Gb1hEVEl3TURVek1ERXdORGd6T0Zvd2J6RUxNQWtHQTFVRUJoTUNVMFV4CkZEQVNCZ05WQkFvVEMwRmtaRlJ5ZFhOMElFRkNNU1l3SkFZRFZRUUxFeDFCWkdSVWNuVnpkQ0JGZUhSbGNtNWgKYkNCVVZGQWdUbVYwZDI5eWF6RWlNQ0FHQTFVRUF4TVpRV1JrVkhKMWMzUWdSWGgwWlhKdVlXd2dRMEVnVW05dgpkRENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFMZjNHalBtOGdBRUxUbmdUbHZ0Ckg3eHNEODIxK2lPMnp0NmJFVE9YcENsTWZaT2Z2VXE4ayswREd1T1B6K1Z0VUZyV2x5bVVXb0N3U1hyYkxwWDkKdU1xL056Z3RIajZSUWExd1ZzZndUei9vTXA1MHlzaVFWT25HWHc5NG5acEFQQTZzWWFwZUZJK2VoNkZxVU56WAptazZ2QmJPbWNaU2NjYk5RWUFySEU1MDRCNFlDcU9tb2FTWVlrS3RNc0U4anF6cFBoTmpmenAvaGFXKzcxMExYCmEwVGt4NjN1YlVGZmNscHhDRGV6ZVdXa1dhQ1VOL2NBTHczQ2tuTGEwRGh5MnhTb1JjUmRLbjIzdE5iRTdxek4KRTBTM3lTdmRRd0FsK21HNWFXcFlJeEczcHpPUFZuVlo5YzBwMTBhM0NpdGx0dE5DYnhXeXVIdjc3K2xkVTlVMApXaWNDQXdFQUFhT0IzRENCMlRBZEJnTlZIUTRFRmdRVXJiMlllalMwSnZmNnhDWlU3d085NENUTFZCb3dDd1lEClZSMFBCQVFEQWdFR01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d2daa0dBMVVkSXdTQmtUQ0Jqb0FVcmIyWWVqUzAKSnZmNnhDWlU3d085NENUTFZCcWhjNlJ4TUc4eEN6QUpCZ05WQkFZVEFsTkZNUlF3RWdZRFZRUUtFd3RCWkdSVQpjblZ6ZENCQlFqRW1NQ1FHQTFVRUN4TWRRV1JrVkhKMWMzUWdSWGgwWlhKdVlXd2dWRlJRSUU1bGRIZHZjbXN4CklqQWdCZ05WQkFNVEdVRmtaRlJ5ZFhOMElFVjRkR1Z5Ym1Gc0lFTkJJRkp2YjNTQ0FRRXdEUVlKS29aSWh2Y04KQVFFRkJRQURnZ0VCQUxDYjRJVWx3dFlqNGcrV0JwS2RRWmljMllSNWdka2VXeFFISXpabGo3RFlkN3VzUVd4SApZSU5Sc1BreVBlZjg5aVlUeDRBV3BiOWEvSWZQZUhtSklacmlUQWNLaGpXODh0NVJ4TktXdDl4K1R1NXcvUnc1CjZ3d0NVUlF0anIwVzRNSGZSblhuSkszczlFSzBoWk53RUdlNm5RWTFTaGpUSzNyTVVVS2hlbVBSNXJ1aHhTdkMKTnI0VERlYTlZMzU1ZTZjSkRVQ3JhdDJQaXNQMjlvd2FRZ1ZSMUVYMW42ZGlJV2dWSUVNOG1lZDh2U1RZcVpFWApjNGcvVmhzeE9CaTBjUSthemNnT25vNHVHK0dNbUlQTEh6SHhSRXpHQkhOSmRtQVB4L2k5RjRCckx1bk1UQTVhCm1ua1BJQW91MVo1akpoNVZrcFRZZ2hkYWU5Qzh4NDlPaGdRPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89RW50cnVzdCwgSW5jLiBPVT13d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVuY2UvKGMpIDIwMDYgRW50cnVzdCwgSW5jLgojIFN1YmplY3Q6IENOPUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPUVudHJ1c3QsIEluYy4gT1U9d3d3LmVudHJ1c3QubmV0L0NQUyBpcyBpbmNvcnBvcmF0ZWQgYnkgcmVmZXJlbmNlLyhjKSAyMDA2IEVudHJ1c3QsIEluYy4KIyBMYWJlbDogIkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSIKIyBTZXJpYWw6IDExNjQ2NjA4MjAKIyBNRDUgRmluZ2VycHJpbnQ6IGQ2OmE1OmMzOmVkOjVkOmRkOjNlOjAwOmMxOjNkOjg3OjkyOjFmOjFkOjNmOmU0CiMgU0hBMSBGaW5nZXJwcmludDogYjM6MWU6YjE6Yjc6NDA6ZTM6NmM6ODQ6MDI6ZGE6ZGM6Mzc6ZDQ6NGQ6ZjU6ZDQ6Njc6NDk6NTI6ZjkKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDczOmMxOjc2OjQzOjRmOjFiOmM2OmQ1OmFkOmY0OjViOjBlOjc2OmU3OjI3OjI4OjdjOjhkOmU1Ojc2OjE2OmMxOmU2OmU2OjE0OjFhOjJiOjJjOmJjOjdkOjhlOjRjCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFa1RDQ0EzbWdBd0lCQWdJRVJXdFFWREFOQmdrcWhraUc5dzBCQVFVRkFEQ0JzREVMTUFrR0ExVUVCaE1DClZWTXhGakFVQmdOVkJBb1REVVZ1ZEhKMWMzUXNJRWx1WXk0eE9UQTNCZ05WQkFzVE1IZDNkeTVsYm5SeWRYTjAKTG01bGRDOURVRk1nYVhNZ2FXNWpiM0p3YjNKaGRHVmtJR0o1SUhKbFptVnlaVzVqWlRFZk1CMEdBMVVFQ3hNVwpLR01wSURJd01EWWdSVzUwY25WemRDd2dTVzVqTGpFdE1Dc0dBMVVFQXhNa1JXNTBjblZ6ZENCU2IyOTBJRU5sCmNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNQjRYRFRBMk1URXlOekl3TWpNME1sb1hEVEkyTVRFeU56SXcKTlRNME1sb3dnYkF4Q3pBSkJnTlZCQVlUQWxWVE1SWXdGQVlEVlFRS0V3MUZiblJ5ZFhOMExDQkpibU11TVRrdwpOd1lEVlFRTEV6QjNkM2N1Wlc1MGNuVnpkQzV1WlhRdlExQlRJR2x6SUdsdVkyOXljRzl5WVhSbFpDQmllU0J5ClpXWmxjbVZ1WTJVeEh6QWRCZ05WQkFzVEZpaGpLU0F5TURBMklFVnVkSEoxYzNRc0lFbHVZeTR4TFRBckJnTlYKQkFNVEpFVnVkSEoxYzNRZ1VtOXZkQ0JEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVUQ0NBU0l3RFFZSgpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFMYVZ0a05DK3NadEttOUkzNVJNT1ZjRjdzTjVFVUZvCk51M3MvcG9CajZFNEtQejNFRVptTGswZUdyRWFUc2JSd0pXSXNNbi9NWXN6QTl1M2czcytJSVJlN2JKV0tLZjQKNExsQWNUZkZ5MGNPbHlwb3dDS1ZZaFhiUjluMTBDdi9na3ZKclQ3ZVROdVFnRkEvQ1lxRUFPd3dDajBZemZ2OQpLbG1hSTVVWExFV2VIMjVEZVcwTVhKaitTS2ZGSTBkY1h2MXU1eDYwOW1oRjBZYURXNktLamJIaktZRCtKWEdJCnJiNjhqNnhTbGt1cVVZM2tFekVaNkU1Tm45dXNzMnJWdkRsVWNjcDZlbitRM1gwZGdObUJ1MWttd2hIKzVwUGkKOTREa1pmczBOdzRwZ0hCTnJ6aUdMcDUvVjYrZUY2N3JITXNvSVYrMkhOam5vZ1FpK2RQYTJNc0NBd0VBQWFPQgpzRENCclRBT0JnTlZIUThCQWY4RUJBTUNBUVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFyQmdOVkhSQUVKREFpCmdBOHlNREEyTVRFeU56SXdNak0wTWxxQkR6SXdNall4TVRJM01qQTFNelF5V2pBZkJnTlZIU01FR0RBV2dCUm8Ka09SbnBLWlRnTWVHWnFUeDkwdEQrNFM5YlRBZEJnTlZIUTRFRmdRVWFKRGtaNlNtVTRESGhtYWs4ZmRMUS91RQp2VzB3SFFZSktvWklodlo5QjBFQUJCQXdEaHNJVmpjdU1UbzBMakFEQWdTUU1BMEdDU3FHU0liM0RRRUJCUVVBCkE0SUJBUUNUMURDdzF3TWdLdEQ1WStpUkRBVWdxVjhaeW50eVR0U3gyOUNXKzFSYUdTd01DUGV5dklXb25YOXQKTzFLekt0dm4xSVNNWS9ZUHl5WUJrVkJzOUY4VTRwTjB3Qk9lTURwUTQ3Umd4Unp3SWtTTmNVZXN5QnJKNlp1YQpBR0FULzNCK1h4Rk5TUnV6RlZKN3lWVGF2NTJWcjJ1YTJKN3A4ZVJEamVJUlJEcS9yNzJEUW5OU2k2cTdweW5QCjlXUWNDazNSdktxc255clEvMzkvMm4zcXNlMHdKY0dFMmpUU1czaURWdXljTnNNbTRoSDJaMGtka3F1TSsrdi8KZXU2RlNxZFFnUENuWEVxVUxsOEZtVHhTUWVETnRHUFBBVU82bklQY2oyQTc4MXEwdEh1dTJndVFPSFh2Z1IxbQowdmRYY0RhenYvd29yM0VsaFZzVC9oNS9XclE4Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1HZW9UcnVzdCBHbG9iYWwgQ0EgTz1HZW9UcnVzdCBJbmMuCiMgU3ViamVjdDogQ049R2VvVHJ1c3QgR2xvYmFsIENBIE89R2VvVHJ1c3QgSW5jLgojIExhYmVsOiAiR2VvVHJ1c3QgR2xvYmFsIENBIgojIFNlcmlhbDogMTQ0NDcwCiMgTUQ1IEZpbmdlcnByaW50OiBmNzo3NTphYjoyOTpmYjo1MTo0ZTpiNzo3Nzo1ZTpmZjowNTozYzo5OTo4ZTpmNQojIFNIQTEgRmluZ2VycHJpbnQ6IGRlOjI4OmY0OmE0OmZmOmU1OmI5OjJmOmEzOmM1OjAzOmQxOmEzOjQ5OmE3OmY5Ojk2OjJhOjgyOjEyCiMgU0hBMjU2IEZpbmdlcnByaW50OiBmZjo4NTo2YToyZDoyNToxZDpjZDo4ODpkMzo2Njo1NjpmNDo1MDoxMjo2Nzo5ODpjZjphYjphYTpkZTo0MDo3OTo5Yzo3MjoyZDplNDpkMjpiNTpkYjozNjphNzozYQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRFZEQ0NBanlnQXdJQkFnSURBalJXTUEwR0NTcUdTSWIzRFFFQkJRVUFNRUl4Q3pBSkJnTlZCQVlUQWxWVApNUll3RkFZRFZRUUtFdzFIWlc5VWNuVnpkQ0JKYm1NdU1Sc3dHUVlEVlFRREV4SkhaVzlVY25WemRDQkhiRzlpCllXd2dRMEV3SGhjTk1ESXdOVEl4TURRd01EQXdXaGNOTWpJd05USXhNRFF3TURBd1dqQkNNUXN3Q1FZRFZRUUcKRXdKVlV6RVdNQlFHQTFVRUNoTU5SMlZ2VkhKMWMzUWdTVzVqTGpFYk1Ca0dBMVVFQXhNU1IyVnZWSEoxYzNRZwpSMnh2WW1Gc0lFTkJNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQTJzd1lZekQ5CjlCY2pHbForVzk4OGJEamtjYmQ0a2RTOG9kaE0rS2hEdGdQcFRTRUhDSWphV0M5bU9TbTlCWGlMblRqb0JiZHEKZm5HazVzUmdwckR2Z09TSktBK2VKZGJ0Zy9PdHBwSEhtTWxDR0RVVW5hMllScEl1VDhyeGgwUEJGcFZYTFZEdgppUzJBZWxldDh1NWZhOUlBamJrVStCUVZOZG5BUnFON2NzaVJ2OGxWSzgzUWx6NmNKbVRNMzg2REdYSEtUdWJVCjFYdXBHYzFWM3NqczBsNDRVK1ZjVDR3dC9sQWpOdnhtNXN1T3BEa1pBTGVWQWptUkN3NytPQzdSSFFXYTlrMCsKYnc4SEhhOHNIbzlnT2VMNk5sTVRPZFJlSml2YlBhZ1V2VExyR0FNb1VnUng1YXN6UGVFNHV3YzJoR0tjZWVvVwpNUFJmd0N2b2NXdmsrUUlEQVFBQm8xTXdVVEFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVdCQlRBCmVwaG9qWW43cXdWa0RCRjlxbjFsdU1yTVRqQWZCZ05WSFNNRUdEQVdnQlRBZXBob2pZbjdxd1ZrREJGOXFuMWwKdU1yTVRqQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFOZU1wYXVVdlhWU09LVkNVbjVrYUZPU1BlQ3BpbEtJbgpaNTdRenhwZVIrbkJzcVRQM1VFYUJVNmJTKzVLYjFWU3N5U2hOd3JyWkhZcUxpenovVHQxa0wvNmNkakhQVGZTCnRRV1ZZcm1tM29rOU5uczRkMGlYcktZZ2p5Nm15UXpDc3BsRkFNZk9FVkVpSXVDbDZyWVZTQWxrNmw1UGRQY0YKUHNlS1VnemJGYlM5Ylp2bHhyRlVhS25qYVpDMm1xVVB1TGsvSUgydVNyVzRuT1FkdHF2bWxLWEJ4NE90Mi9VbgpodzRFYk5YLzNhQmQ3WWRTdHlzVkFxNDVwbXAwNmRyRTU3eE5OQjZwWEUwelg1SUpMNGhtWFhlWHh4MTJFNm5WCjVmRVdDUkUxMWF6YkpIRndMSmhXQzlrWHROSGpVU3RlZGVqVjBOeFBOTzNDQldhQW9jdm1Ndz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1HZW9UcnVzdCBVbml2ZXJzYWwgQ0EgTz1HZW9UcnVzdCBJbmMuCiMgU3ViamVjdDogQ049R2VvVHJ1c3QgVW5pdmVyc2FsIENBIE89R2VvVHJ1c3QgSW5jLgojIExhYmVsOiAiR2VvVHJ1c3QgVW5pdmVyc2FsIENBIgojIFNlcmlhbDogMQojIE1ENSBGaW5nZXJwcmludDogOTI6NjU6NTg6OGI6YTI6MWE6MzE6NzI6NzM6Njg6NWM6YjQ6YTU6N2E6MDc6NDgKIyBTSEExIEZpbmdlcnByaW50OiBlNjoyMTpmMzozNTo0Mzo3OTowNTo5YTo0Yjo2ODozMDo5ZDo4YToyZjo3NDoyMjoxNTo4NzplYzo3OQojIFNIQTI1NiBGaW5nZXJwcmludDogYTA6NDU6OWI6OWY6NjM6YjI6MjU6NTk6ZjU6ZmE6NWQ6NGM6NmQ6YjM6Zjk6Zjc6MmY6ZjE6OTM6NDI6MDM6MzU6Nzg6ZjA6NzM6YmY6MWQ6MWI6NDY6Y2I6Yjk6MTIKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZhRENDQTFDZ0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRVUZBREJGTVFzd0NRWURWUVFHRXdKVlV6RVcKTUJRR0ExVUVDaE1OUjJWdlZISjFjM1FnU1c1akxqRWVNQndHQTFVRUF4TVZSMlZ2VkhKMWMzUWdWVzVwZG1WeQpjMkZzSUVOQk1CNFhEVEEwTURNd05EQTFNREF3TUZvWERUSTVNRE13TkRBMU1EQXdNRm93UlRFTE1Ba0dBMVVFCkJoTUNWVk14RmpBVUJnTlZCQW9URFVkbGIxUnlkWE4wSUVsdVl5NHhIakFjQmdOVkJBTVRGVWRsYjFSeWRYTjAKSUZWdWFYWmxjbk5oYkNCRFFUQ0NBaUl3RFFZSktvWklodmNOQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQUtZVgpWYUNqeHVBZmpKMGhVTmZCdml0YnRhU2VvZGx5V0wwQUcweS9ZY2tVSFVXQ3E4WWRnTlk5NnhDY09xOXRKUGk4CmNRR2VCdlY4WHg3QkRsWEtnNXBaTUs0Wnl6QklsZTBpTjQzMFNwcHlaajZ0bGNEZ0ZnRGdFQjhyTVE3WGxGVFQKUWpPZ05CMGVSWGJkVDhvWU4reUZGWG9aQ1B6Vng1enc4cWt1RUttUzVqMVlQYWtXYUR3dmRTRVlmeWgzcGVGaApGN2VtNmZnZW1kdHpidlFLb2lGczd0cXFoWkptci9aNmE0TGF1aUlJTlEvUFF2RTErbXJ1ZmlzbHpEb1I1RzJ2CmM3SjJIYTNRc25obkdxUTVIRkVMWjFhRC9UaGREYzdkOExzcmxoL2VlekpTL1IyN3RRYWhzaUZlcGRhVmFIL3cKbVo3Y1JRZys1OUlKRFRXVTNZQk9VNWZYdFFsRUlHUVdGd01DVEZNTmFON1ZxbkpOazIyQ0R0dWN2YyswODF4ZApWSHBwQ1piVzJ4SEJqWFdvdE04NXlNNDh2Q1I4NW1MSzRiMTlwNzFYWlF2ay9pWHR0bWtRM0NnYVJyMEJIZENYCnRlR1lPOEEzWk5ZOWxPNEw0ZlVvcmd0V3YzR0xJeWxCam9iRlMxSjcySEdySDRvVnBqdURXdGRZQVZIR1RFSFoKZjloQlozS2lLTjlnZzZtZXlIdjhVM055V2ZXVGVoZDJEczczNVZ6WkMxVTBvcXBidFdwVTV4UEtWK3lYYmZSZQpCaTlGaTFqVUl4YVM1Qlp1S0dOWk1OOVFBWnhqaVJxZjJ4ZVVnbkEzd3lTZW1rZldXc3BPcUdtSmNoK1JiTnQrCm5odXR4eDl6M1N4UEdXWDlmNU5BRUM3UzhPMDhuaTRvUG1rbU04VjdBZ01CQUFHall6QmhNQThHQTFVZEV3RUIKL3dRRk1BTUJBZjh3SFFZRFZSME9CQllFRk5xN0xxcXdETGlJSmxGMFhHMEQwOERZajNyV01COEdBMVVkSXdRWQpNQmFBRk5xN0xxcXdETGlJSmxGMFhHMEQwOERZajNyV01BNEdBMVVkRHdFQi93UUVBd0lCaGpBTkJna3Foa2lHCjl3MEJBUVVGQUFPQ0FnRUFNWGpteDdYZnVKUkF5WEhFcURYc1JoM0NoZk1vV0lhd0MveU9zam1QUkZXclpJUmMKYWFuUW1qZzgrdVVmTmVWRTQ0QjVsR2lrdThTZlBlRTB6VEJHaTFRcmxhWHY5eitaaFAwMTVzOHh4dHhxdjZmWApJd2pobUY3RFdnaDJxYWF2ZHkrM1lMMUVSbXJ2bC85emxjR082SlA3L1RHMzdGY1JFVVdiTVBFYWlEbkJUenluCkFOWEgvS3R0Z0NKd3BRemdYUVFwQXZ2TG9KSFJmTmJEZmxEVm5WaStRVGpydVhVOEZkbWJ5VXFEV2NEYVUvMHoKdXpZWW00VVBGZDN1TGF4Mms3blpBWTFJRUtqNzlUaUc4ZHNLeHIyRW95TkIzdFozYjRYVWhSeFE0SzVSaXJxTgpQbmJpdWNvbjhsK2Y3MjVaRFFiWUt4ZWswbnhydTE4VUdraVBHa3puczBjY2preEZLeUR1U04vbjNRbU9HS2phClFJMlNKaEZUWVhOZDY3M254RTBwTjJIcnJEa3RaeTRXMXZVQWc0V2h6SDkyeEgza3QwdG03d05GWUdtMkRGS1cKa29SZXBxTzFwRDRyMmN6WUcwZXE4a1RhVC9rRDZQQVV5ei96Zzk3UXdWVGp0K2dLTjAyTElGa0RNQm1oTE1pOQpFUi9mcnNsS3hmTW5abWFHckdpUi85bm1VeHdQaTF4cFpRb215QjQwdzExUmU5ZXBuQWFoTnQzVmlaUzgyZVF0CkRGNEpiQWlYZktNOWZKUC9QNkVVcDgrMVhldmIyeHpFZHQrSXViMUZCWlVicnZ4R2FreXZTT1BPcmcvU2Z1dm0KYkp4UGdXcDZaS3k3UHRYbnkzWXV4YWRJd1Z5UUQ4dklQL3JtTXVHTkcyK2s1bzdZK1NsSWlzNXovaXc9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1HZW9UcnVzdCBVbml2ZXJzYWwgQ0EgMiBPPUdlb1RydXN0IEluYy4KIyBTdWJqZWN0OiBDTj1HZW9UcnVzdCBVbml2ZXJzYWwgQ0EgMiBPPUdlb1RydXN0IEluYy4KIyBMYWJlbDogIkdlb1RydXN0IFVuaXZlcnNhbCBDQSAyIgojIFNlcmlhbDogMQojIE1ENSBGaW5nZXJwcmludDogMzQ6ZmM6Yjg6ZDA6MzY6ZGI6OWU6MTQ6YjM6YzI6ZjI6ZGI6OGY6ZTQ6OTQ6YzcKIyBTSEExIEZpbmdlcnByaW50OiAzNzo5YToxOTo3Yjo0MTo4NTo0NTozNTowYzphNjowMzo2OTpmMzozYzoyZTphZjo0Nzo0ZjoyMDo3OQojIFNIQTI1NiBGaW5nZXJwcmludDogYTA6MjM6NGY6M2I6Yzg6NTI6N2M6YTU6NjI6OGU6ZWM6ODE6YWQ6NWQ6Njk6ODk6NWQ6YTU6Njg6MGQ6Yzk6MWQ6MWM6Yjg6NDc6N2Y6MzM6Zjg6Nzg6Yjk6NWI6MGIKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZiRENDQTFTZ0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRVUZBREJITVFzd0NRWURWUVFHRXdKVlV6RVcKTUJRR0ExVUVDaE1OUjJWdlZISjFjM1FnU1c1akxqRWdNQjRHQTFVRUF4TVhSMlZ2VkhKMWMzUWdWVzVwZG1WeQpjMkZzSUVOQklESXdIaGNOTURRd016QTBNRFV3TURBd1doY05Namt3TXpBME1EVXdNREF3V2pCSE1Rc3dDUVlEClZRUUdFd0pWVXpFV01CUUdBMVVFQ2hNTlIyVnZWSEoxYzNRZ1NXNWpMakVnTUI0R0ExVUVBeE1YUjJWdlZISjEKYzNRZ1ZXNXBkbVZ5YzJGc0lFTkJJREl3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQwpBUUN6VkZMQnlUN3kyZHl4VXhwWktlZXh3MFVvNWRmUjdjWEZTNkdxZEh0WHIwb20vTmoxWHFkdUdkdDBERTgxCld6SUxBZVBiNjNwM05lcXFXdURXNktGWGxQQ1FvM1JXbEVRd0F4NWNUaXVGSm5TQ2VneDJvRzlOemtFdG9CVUcKRkYrM1FzMTdqMWhoTk53cUNQa3V3d0dtSWtRY1RBZUM1bHZPMEVwOEJOTVpjeWZ3cXBoL0xxOU82NGNlSkhkcQpYYmJvVzBXNjNNT2hCVzlXam84UUpxVkp3eTdYUVljaTRFK0d5bUMxNnFGandBR1hFSG05QUR3U2JTc1ZzYXhMCnNlNFl1VTZXM054Mi96dSt6MThEd1B3NzZMNUdHLy9hUU1KUzkvN2pPdmRxZHpYUTJvM3JYaGhxTWNjZXVqd2IKS05aclZNYXFXOWVpTEJzWnpLSUM5cHRadlRkcmhyVnRncnJZNnNsV3ZLazJXUDArR2ZQdERDYXBremo0VDhGZApJZ2JRbCtyaHJjWlY0SUVyS0lNNit2UjdJVkVBdmxJNHpzMW1lYWowZ1ZiaTBJTUpSMUZiVUdyUDIwZ2FYVDczCnkvWmw5Mnp4bGZnQ096Sldnamw2VzcwdmlSdS9vYlRvLzMrTmpOOEQ4V0JPV0JGTTY2TS9FQ3VEbWdGejJaUnQKaEFBblpxendjRUFKUXBLdFQ1TU5ZUWxSSk5pUzFRdVVZYktIc3UzL21qWC9oVlRLN1VSRHJCczhGbXRJU2dvYwpRSWdma3NJTEFBWC84c2dDU3FTcXFjeVpscHd2V09COTRiNjdCOXhmQkhKY01UVEQ3Rjh0NEQxa2tDTG0wZXk0Ckx0MVpydG1oTjc5VU5keHpNaytNQkI0enNzbEc4ZGhjeUZWUXlXaTlxTG8yQ1FJREFRQUJvMk13WVRBUEJnTlYKSFJNQkFmOEVCVEFEQVFIL01CMEdBMVVkRGdRV0JCUjI4MVhoK3FRMisvQ2ZYR0p4N1R6MFJ6Z1FLekFmQmdOVgpIU01FR0RBV2dCUjI4MVhoK3FRMisvQ2ZYR0p4N1R6MFJ6Z1FLekFPQmdOVkhROEJBZjhFQkFNQ0FZWXdEUVlKCktvWklodmNOQVFFRkJRQURnZ0lCQUdiQnhpUHoyZUF1Ymwvb3o2NndzQ1ZOSy9nN1dKdEFKRGRheTZzV1NmK3oKZFhrem9TOXRjQmMwa2Y1bmZvL3NtK1ZlZ3FsVkh5L2MxRkVIRXY2c0ZqNHNOY1pqL053UTZ3MmpxdEI4ek5IUQpMMUV1eEJSYTN1Z1o0VDdHektRcDV5NkVxZ1l3ZUhaVWN5aVlXVGpnQUExaTAwSjlJWit1UFRxTTFmcDNEUmdyCkZnNWZOdUg4S3JVd0pNL2dZd3g3V0JyK21icENFckdSOUh4bzRzam9yeXpxeVg2dXV5bzlEUlhjTkpXMkdIU28KYWcvSHRQUVR4T1JiN1FyU3BKZE1LdTB2YkJLSlBmRW5jS3BxQTFJaG4wQ29aMUR5ODFvZjM5OGo5dHg0VHVhWQpUMVU2VStQdjh2U2Z4M3pZV0s4cElwZTQ0TDJSTHJCMjdGY1J6KzhwUlBQcGhYcGdZK1JkTTRrWDJUR3EydGJ6CkdEVnl6NGNyTDJNamhGMkVqRDlYb0lqOG1aRW9KbW1aMUkrWFJMNk8xVWl4cENncDhSVzA0ZVdlM2ZpUHBtOG0KMXdrOE9od1JEcVpzTi9ldFJJY3NLTWZZZElLejBHOUtWN3MxS1NlZ2krZ2hwNGRrTmwzTTJCYXN4N0luUUpKVgpPQ2lOVVc3ZEZHZFRiSEZjSm9STmRWcTJmbUJXcVUydCs1c2VsL01OMmRLWFZIZmFQUkszNEI3dkNBYXMrWVdICjZhTGNyMzRZRW9QOVZoZEJMdFVwZ24yWjlESDJjYW5QTEFFbnBRVzVxckpJVGlydm41TlNVWlU4VW5PT1Zrd1gKUU1BSktPU0xha2hUMit6TlZWWHh4dmpwb2l4TXB0RW1YMzZ2V2t6YUg2YnlIQ3grcmdJVzBsYlFMMWRUUitpUwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049VmlzYSBlQ29tbWVyY2UgUm9vdCBPPVZJU0EgT1U9VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24KIyBTdWJqZWN0OiBDTj1WaXNhIGVDb21tZXJjZSBSb290IE89VklTQSBPVT1WaXNhIEludGVybmF0aW9uYWwgU2VydmljZSBBc3NvY2lhdGlvbgojIExhYmVsOiAiVmlzYSBlQ29tbWVyY2UgUm9vdCIKIyBTZXJpYWw6IDI1OTUyMTgwNzc2Mjg1ODM2MDQ4MDI0ODkwMjQxNTA1NTY1Nzk0CiMgTUQ1IEZpbmdlcnByaW50OiBmYzoxMTpiODpkODowODo5MzozMDowMDo2ZDoyMzpmOTo3ZTplYjo1MjoxZTowMgojIFNIQTEgRmluZ2VycHJpbnQ6IDcwOjE3OjliOjg2OjhjOjAwOmE0OmZhOjYwOjkxOjUyOjIyOjNmOjlmOjNlOjMyOmJkOmUwOjA1OjYyCiMgU0hBMjU2IEZpbmdlcnByaW50OiA2OTpmYTpjOTpiZDo1NTpmYjowYTpjNzo4ZDo1MzpiYjplZTo1YzpmMTpkNTo5Nzo5ODo5ZjpkMDphYTphYjoyMDphMjo1MTo1MTpiZDpmMTo3MzozZTplNzpkMToyMgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRG9qQ0NBb3FnQXdJQkFnSVFFNFkxVFIwL0J2TEIrV1VGMVpBY1lqQU5CZ2txaGtpRzl3MEJBUVVGQURCcgpNUXN3Q1FZRFZRUUdFd0pWVXpFTk1Bc0dBMVVFQ2hNRVZrbFRRVEV2TUMwR0ExVUVDeE1tVm1sellTQkpiblJsCmNtNWhkR2x2Ym1Gc0lGTmxjblpwWTJVZ1FYTnpiMk5wWVhScGIyNHhIREFhQmdOVkJBTVRFMVpwYzJFZ1pVTnYKYlcxbGNtTmxJRkp2YjNRd0hoY05NREl3TmpJMk1ESXhPRE0yV2hjTk1qSXdOakkwTURBeE5qRXlXakJyTVFzdwpDUVlEVlFRR0V3SlZVekVOTUFzR0ExVUVDaE1FVmtsVFFURXZNQzBHQTFVRUN4TW1WbWx6WVNCSmJuUmxjbTVoCmRHbHZibUZzSUZObGNuWnBZMlVnUVhOemIyTnBZWFJwYjI0eEhEQWFCZ05WQkFNVEUxWnBjMkVnWlVOdmJXMWwKY21ObElGSnZiM1F3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ3ZWOTVXSG02aAoybUN4bENmTEY5c0hQNENGVDhpY3R0RDBiMC9QbWRqaDI4SklYRHFzT1RQSEgycUxKajByTmZWSXNaSEJBazRFCmxwRjdzRFB3c1JST0VXKzFRSzhiUmFWSzczNjJyUEtnSDFnL0VrWmdQSTJoNEgzUFZ6NHpIdnRIOGFvVmx3ZFYKWnFXMUxTN1lnRm15cHcyM1J1d2hZLzgxcTZVQ3p5cjBUUDU3OVpSZGhFMm84bUNQMnc0bFBKOXpjYytVMzBycQoyOTl5T0l6emxyM3hGN3pTdWp0RldzYW45c1lYaXdHZC9CbW9Lb01XdURwSS9rNCtvS3NHR2VsVDg0QVRCKzB0CnZ6OEtQRlVnT1N3c0FHbDBsVXE4SUxLcGVlVVlpWkdvM0J4Tjc3dCtOd3RkL2ptbGlGS01BR3pzR0h4QnZmYUwKZFhlNllKMkU1LzR0QWdNQkFBR2pRakJBTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RGdZRFZSMFBBUUgvQkFRRApBZ0VHTUIwR0ExVWREZ1FXQkJRVk9JTVBQeXcvY0RNZXpVYitCNHdnNE5mRHR6QU5CZ2txaGtpRzl3MEJBUVVGCkFBT0NBUUVBWC9GQmZYeGNDTGtyNE5XU1IvcG5YS1VUd3dNaG15dE1pVWJQV1UzSi9xVkF0bVBOM1hFb2xXY1IKekNTczAwUnNjYTRCSUdzRG9vOFl0eWs2ZmVVV1lGTjRQTUN2RllQM2oxSXpKTDFrazVmdWkvZmJHS2h0Y2JQMwpMQmZRZENWcDkvNXJQSlMrVFV0QmpFN2ljOURqa0NKelE4M3o3K3B6emtXS3NLWkovMHg5blhHSXhIWWRrRnNkCjd2M005Kzc5WUtXeGVoWngwUmJRZkJJOGJHbVgyNjVmT1pwd0x3VThHVVlFbVNBMjBHQnVZUWE3RmtLTWNQY3cKKytEYlpxTUFBYjNtTE5xUlg2QkdpMDFxbkQwOTNRVkcvbmEvb0FvODVBRG1KN2YvaEMzZXVpSW5saEJ4NnlMdAozOTh6bk0vanJhNk8xSTdtVDFHdkZwTGdYUFlIRHc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049QUFBIENlcnRpZmljYXRlIFNlcnZpY2VzIE89Q29tb2RvIENBIExpbWl0ZWQKIyBTdWJqZWN0OiBDTj1BQUEgQ2VydGlmaWNhdGUgU2VydmljZXMgTz1Db21vZG8gQ0EgTGltaXRlZAojIExhYmVsOiAiQ29tb2RvIEFBQSBTZXJ2aWNlcyByb290IgojIFNlcmlhbDogMQojIE1ENSBGaW5nZXJwcmludDogNDk6Nzk6MDQ6YjA6ZWI6ODc6MTk6YWM6NDc6YjA6YmM6MTE6NTE6OWI6NzQ6ZDAKIyBTSEExIEZpbmdlcnByaW50OiBkMTplYjoyMzphNDo2ZDoxNzpkNjo4ZjpkOToyNTo2NDpjMjpmMTpmMTo2MDoxNzo2NDpkODplMzo0OQojIFNIQTI1NiBGaW5nZXJwcmludDogZDc6YTc6YTA6ZmI6NWQ6N2U6Mjc6MzE6ZDc6NzE6ZTk6NDg6NGU6YmM6ZGU6Zjc6MWQ6NWY6MGM6M2U6MGE6Mjk6NDg6Nzg6MmI6Yzg6M2U6ZTA6ZWE6Njk6OWU6ZjQKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVNakNDQXhxZ0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRVUZBREI3TVFzd0NRWURWUVFHRXdKSFFqRWIKTUJrR0ExVUVDQXdTUjNKbFlYUmxjaUJOWVc1amFHVnpkR1Z5TVJBd0RnWURWUVFIREFkVFlXeG1iM0prTVJvdwpHQVlEVlFRS0RCRkRiMjF2Wkc4Z1EwRWdUR2x0YVhSbFpERWhNQjhHQTFVRUF3d1lRVUZCSUVObGNuUnBabWxqCllYUmxJRk5sY25acFkyVnpNQjRYRFRBME1ERXdNVEF3TURBd01Gb1hEVEk0TVRJek1USXpOVGsxT1Zvd2V6RUwKTUFrR0ExVUVCaE1DUjBJeEd6QVpCZ05WQkFnTUVrZHlaV0YwWlhJZ1RXRnVZMmhsYzNSbGNqRVFNQTRHQTFVRQpCd3dIVTJGc1ptOXlaREVhTUJnR0ExVUVDZ3dSUTI5dGIyUnZJRU5CSUV4cGJXbDBaV1F4SVRBZkJnTlZCQU1NCkdFRkJRU0JEWlhKMGFXWnBZMkYwWlNCVFpYSjJhV05sY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVAKQURDQ0FRb0NnZ0VCQUw1QW5mUnU0ZXAyaHh4TlJVU092a2JJZ3dhZHdTcitHQitPNUFMNjg2dGRVSW9XTVF1YQpCdERGY0NMTlNTMVVZOHkyYm1oR0MxUHF5MHdrd0x4eVR1cnhGYTcwVkpvU0NzTjZzak5nNHRxSlZmTWlXUFBlCjNNL3ZnNGFpakpSUG4yanltSkJHaENmSGRyL2p6RFVzaTE0SFpHV0N3RWl3cUpINVlaOTJJRkNva2NkbXRldDQKWWdOVzhJb2FFK294b3g2Z21mMDQ5dlluTWxodkIvVnJ1UHNVSzYrM3FzeldZMTl6ak5vRm1hZzRxTXNYZURaUgpyT21lOUhnNmpjOFAyVUxpbUF5ckw1OE9BZDd2bjVsSjhTM2ZySFJORzVpMVI4WGxLZEg1a0JqSFlweStnOGNtCmV6NktKY2ZBM1ozbU5XZ1FJSjJQMk43U3c0U2NEVjdvTDhrQ0F3RUFBYU9Cd0RDQnZUQWRCZ05WSFE0RUZnUVUKb0JFS0l6Nlc4UWZzNHE4cDc0S2xmOUF3cExRd0RnWURWUjBQQVFIL0JBUURBZ0VHTUE4R0ExVWRFd0VCL3dRRgpNQU1CQWY4d2V3WURWUjBmQkhRd2NqQTRvRGFnTklZeWFIUjBjRG92TDJOeWJDNWpiMjF2Wkc5allTNWpiMjB2ClFVRkJRMlZ5ZEdsbWFXTmhkR1ZUWlhKMmFXTmxjeTVqY213d05xQTBvREtHTUdoMGRIQTZMeTlqY213dVkyOXQKYjJSdkxtNWxkQzlCUVVGRFpYSjBhV1pwWTJGMFpWTmxjblpwWTJWekxtTnliREFOQmdrcWhraUc5dzBCQVFVRgpBQU9DQVFFQUNGYjhBdkNiNlArayt0Wjd4a1NBemsvRXhmWUFXTXltdHJ3VVNXZ0VkdWptN2wzc0FnOWcxbzFRCkdFOG1UZ0hqNXJDbDdyKzhkRlJCdi8zOEVyakhUMXIwaVdBRmYyQzNCVXJ6OXZIQ3Y4UzVkSWEyTFgxcnpOTHoKUnQwdnh1QnF3OE0wQXl4OWx0MWF3ZzZuQ3BuQkJZdXJEQy96WERyUGJEZFZDWWZlVTBCc1dPLzh0cXRsYmdUMgpHOXc4NEZvVnhwN1o4VmxJTUNGbEEyenM2U0Z6N0pzRG9lQTNyYUFWR0kvNnVnTE9weXlwRUJNczFPVUlKcXNpCmwyRDRrRjUwMUtLYVU3M3lxV2pnb203QzEyeXhvdytldit0bzUxYnlydkxqS3pnNkNZRzFhNFhYdmkzdFB4cTMKc21QaTlXSXNndFJxQUVGUThUbURuNVhwTnBhWWJnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVF1b1ZhZGlzIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1RdW9WYWRpcyBMaW1pdGVkIE9VPVJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKIyBTdWJqZWN0OiBDTj1RdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89UXVvVmFkaXMgTGltaXRlZCBPVT1Sb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5CiMgTGFiZWw6ICJRdW9WYWRpcyBSb290IENBIgojIFNlcmlhbDogOTg1MDI2Njk5CiMgTUQ1IEZpbmdlcnByaW50OiAyNzpkZTozNjpmZTo3MjpiNzowMDowMzowMDo5ZDpmNDpmMDoxZTo2YzowNDoyNAojIFNIQTEgRmluZ2VycHJpbnQ6IGRlOjNmOjQwOmJkOjUwOjkzOmQzOjliOjZjOjYwOmY2OmRhOmJjOjA3OjYyOjAxOjAwOjg5Ojc2OmM5CiMgU0hBMjU2IEZpbmdlcnByaW50OiBhNDo1ZTpkZTozYjpiYjpmMDo5Yzo4YTplMTo1Yzo3MjplZjpjMDo3Mjo2ODpkNjo5MzphMjoxYzo5OTo2ZjpkNToxZTo2NzpjYTowNzo5NDo2MDpmZDo2ZDo4ODo3MwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRjBEQ0NCTGlnQXdJQkFnSUVPclpRaXpBTkJna3Foa2lHOXcwQkFRVUZBREIvTVFzd0NRWURWUVFHRXdKQwpUVEVaTUJjR0ExVUVDaE1RVVhWdlZtRmthWE1nVEdsdGFYUmxaREVsTUNNR0ExVUVDeE1jVW05dmRDQkRaWEowCmFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVURXVNQ3dHQTFVRUF4TWxVWFZ2Vm1Ga2FYTWdVbTl2ZENCRFpYSjAKYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVRBZUZ3MHdNVEF6TVRreE9ETXpNek5hRncweU1UQXpNVGN4T0RNegpNek5hTUg4eEN6QUpCZ05WQkFZVEFrSk5NUmt3RndZRFZRUUtFeEJSZFc5V1lXUnBjeUJNYVcxcGRHVmtNU1V3Ckl3WURWUVFMRXh4U2IyOTBJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1TNHdMQVlEVlFRREV5VlIKZFc5V1lXUnBjeUJTYjI5MElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1TUlJQklqQU5CZ2txaGtpRwo5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBdjJHMWxWTzZWL3o2OG1jTE9ocmZFWUJrbGJUUnZNMTZ6L1lwCmxpNGtWRUFrT1BjYWhkeFlUTXVrSjBLWDBKK0Rpc1BrQmdOYkFLVlJIbkFFZE9MQjFEcXIxNjA3QnhnRmp2MkQKck9wbTJSZ2JhSXIxVnhxWXV2WHRkajE4MmQ2VWFqdExGOEhWajcxbE9EcVYwRDFWTms3ZmVWY3hLaDdZV1dWSgpXQ0NZZnF0ZmZwL3AxazNzZzNTcHgyelk3aWxLaFNvR0ZQbFU1dFBhWlFlTFl6Y1MxOURzdzNzZ1FVU2o3Y3VnCkYrRnhaYzRkWmpIM2RnRVp5SDBEV0xhVlNSMm1FaWJveGd4MjRPTm15K3BkcGlidTVjeGZ2V2VuQVNjT29zcFUKeGJGNmxSMXhIa29waWdQY2FrWEJwQmxlYnpiTnc2S3d0LzVjT09KU3ZQaEVRK2FRdXdJREFRQUJvNElDVWpDQwpBazR3UFFZSUt3WUJCUVVIQVFFRU1UQXZNQzBHQ0NzR0FRVUZCekFCaGlGb2RIUndjem92TDI5amMzQXVjWFZ2CmRtRmthWE52Wm1aemFHOXlaUzVqYjIwd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pDQ0FSb0dBMVVkSUFTQ0FSRXcKZ2dFTk1JSUJDUVlKS3dZQkJBRytXQUFCTUlIN01JSFVCZ2dyQmdFRkJRY0NBakNCeHhxQnhGSmxiR2xoYm1ObApJRzl1SUhSb1pTQlJkVzlXWVdScGN5QlNiMjkwSUVObGNuUnBabWxqWVhSbElHSjVJR0Z1ZVNCd1lYSjBlU0JoCmMzTjFiV1Z6SUdGalkyVndkR0Z1WTJVZ2IyWWdkR2hsSUhSb1pXNGdZWEJ3YkdsallXSnNaU0J6ZEdGdVpHRnkKWkNCMFpYSnRjeUJoYm1RZ1kyOXVaR2wwYVc5dWN5QnZaaUIxYzJVc0lHTmxjblJwWm1sallYUnBiMjRnY0hKaApZM1JwWTJWekxDQmhibVFnZEdobElGRjFiMVpoWkdseklFTmxjblJwWm1sallYUmxJRkJ2YkdsamVTNHdJZ1lJCkt3WUJCUVVIQWdFV0ZtaDBkSEE2THk5M2QzY3VjWFZ2ZG1Ga2FYTXVZbTB3SFFZRFZSME9CQllFRkl0TGJlM1QKS2JrR0dldzVPYW53bDRScXkrL2ZNSUd1QmdOVkhTTUVnYVl3Z2FPQUZJdExiZTNUS2JrR0dldzVPYW53bDRScQp5Ky9mb1lHRXBJR0JNSDh4Q3pBSkJnTlZCQVlUQWtKTk1Sa3dGd1lEVlFRS0V4QlJkVzlXWVdScGN5Qk1hVzFwCmRHVmtNU1V3SXdZRFZRUUxFeHhTYjI5MElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1TVM0d0xBWUQKVlFRREV5VlJkVzlXWVdScGN5QlNiMjkwSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVnZ1E2dGxDTApNQTRHQTFVZER3RUIvd1FFQXdJQkJqQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFpdFFVdGY3MG1wS25HZFNrCmZuSVlqOWxvZkZJazNXZHZPWHJFcWw0OTRsaXdUWENZaEdIb0crTnBHQTdPKzBkUW9FNy84Q1FmdmJMTzlTZjgKN0M5VHFuTjdBejEwYnVZV251dWxMc1MvVmlkUUsySzZ2a3NjUEZWY1FSMGt2b0lnUjEzVlJINTZGbWpmZlUxUgpjSGhYSFRNZS9RS1puQXpOQ2dWUHg3dU9wSFg2U20yeGdJNEpWcm1jR21EK1hjSFhldHdSZU5EV1hjRzMxYTB5Cm1RTTZpc3hVSlRreGdYc1RJbEc2Um15aHU1NzZCR3hKSm5TUDBuUHJ6RENpNXVwWklvZjRsL1VPL2VyTWtxUVcKeEZJWTZpSE9zZkhtaElIbHVxbUdLUEpEV2wwU25hd2UyYWpsQ21xbmY2Q0hLYy95aVUzVTdNWGk1bnJRTmlPSwpTblEyK1E9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049UXVvVmFkaXMgUm9vdCBDQSAyIE89UXVvVmFkaXMgTGltaXRlZAojIFN1YmplY3Q6IENOPVF1b1ZhZGlzIFJvb3QgQ0EgMiBPPVF1b1ZhZGlzIExpbWl0ZWQKIyBMYWJlbDogIlF1b1ZhZGlzIFJvb3QgQ0EgMiIKIyBTZXJpYWw6IDEyODkKIyBNRDUgRmluZ2VycHJpbnQ6IDVlOjM5OjdiOmRkOmY4OmJhOmVjOjgyOmU5OmFjOjYyOmJhOjBjOjU0OjAwOjJiCiMgU0hBMSBGaW5nZXJwcmludDogY2E6M2E6ZmI6Y2Y6MTI6NDA6MzY6NGI6NDQ6YjI6MTY6MjA6ODg6ODA6NDg6Mzk6MTk6OTM6N2M6ZjcKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDg1OmEwOmRkOjdkOmQ3OjIwOmFkOmI3OmZmOjA1OmY4OjNkOjU0OjJiOjIwOjlkOmM3OmZmOjQ1OjI4OmY3OmQ2Ojc3OmIxOjgzOjg5OmZlOmE1OmU1OmM0OjllOjg2Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGdHpDQ0E1K2dBd0lCQWdJQ0JRa3dEUVlKS29aSWh2Y05BUUVGQlFBd1JURUxNQWtHQTFVRUJoTUNRazB4CkdUQVhCZ05WQkFvVEVGRjFiMVpoWkdseklFeHBiV2wwWldReEd6QVpCZ05WQkFNVEVsRjFiMVpoWkdseklGSnYKYjNRZ1EwRWdNakFlRncwd05qRXhNalF4T0RJM01EQmFGdzB6TVRFeE1qUXhPREl6TXpOYU1FVXhDekFKQmdOVgpCQVlUQWtKTk1Sa3dGd1lEVlFRS0V4QlJkVzlXWVdScGN5Qk1hVzFwZEdWa01Sc3dHUVlEVlFRREV4SlJkVzlXCllXUnBjeUJTYjI5MElFTkJJREl3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQ2EKR01wTGxBMEFMYThES1lyd0Q0SElya3daaFIwSW42c3BSSVh6TDRHdE1oNlFScitqaGlZYUh2NStIQmc2WEp4ZwpGeW82ZElNek1IMWhWQkhMN2F2ZzV0S2lmdlZyYnhpM0Nnc3QvZWsrN3dyR3N4RHAzTUpHRi9oZC9hVGEvNTVKCldwem1NK1lrbHZjL3Vsc3JISG8xd3Rabi9xdG1VSXR0S0dBcjc5ZGd3OGVUdkkwMmtmTi8rTnNSRThTY2QzYkIKcnJjQ2FvRjZxVVdENGdYbXVWYkJsRGVQU0hGakl1d1haUWVWaWt2Zmo4WmFDdVd3NDE5ZWF4R3JEUG1GNjBUcAorQVJ6OHVuK1hKaU05WE92YTdSK3pkUmNBaXRNT2VHeWxaVXRRb2ZYMWJPUVE3ZHNFL0hlM2ZiRStJay8wWFgxCmtzT1IxWXFJMEpEczNHM2VpY0psY1phTERRUDluTDliRnF5UzIrcitlWHl0NjYvM0ZzdmJ6U1VyNVIvN21wL2kKVWN3NlV3eEk1ZzY5eWJSMkJsTG1FUk9GY21NREJPQUVOaXNnR1FMb2RLY2Z0c2xXWnZCMUpkeG53UTVoWUlpegpQdEdvL0tQYUhiRFJzU05VMzBSMmJlMUIyTUd5SXJaVEhOODFIZHloZHlveDVDMzE1ZVhieU9ELzVZRFhDMk9nCi96T2hEN29zRlJYcWw3UFNvclcrOG95V0hocVBIV3lrWVRlNWhuTXoxNWVXbmlOOWdxUk1nZUtoMGJwblg1VUgKb3ljUjdoWVFlN3hGU2t5eUJOS3I3OVg5REZIT1VHb0lNZm1SMmd5UFpGd0R3enFMSUQ5dWpXYzlPdGIrZlZ1SQp5Vjc3ekdIY2l6TjMwMFF5TlFsaUJKSVdFTmllSjBmN095SGorT3NkV3dJREFRQUJvNEd3TUlHdE1BOEdBMVVkCkV3RUIvd1FGTUFNQkFmOHdDd1lEVlIwUEJBUURBZ0VHTUIwR0ExVWREZ1FXQkJRYWhHSzhTRXd6SlFUVTd0RDIKQThRWlJ0R1VhekJ1QmdOVkhTTUVaekJsZ0JRYWhHSzhTRXd6SlFUVTd0RDJBOFFaUnRHVWE2RkpwRWN3UlRFTApNQWtHQTFVRUJoTUNRazB4R1RBWEJnTlZCQW9URUZGMWIxWmhaR2x6SUV4cGJXbDBaV1F4R3pBWkJnTlZCQU1UCkVsRjFiMVpoWkdseklGSnZiM1FnUTBFZ01vSUNCUWt3RFFZSktvWklodmNOQVFFRkJRQURnZ0lCQUQ0S0ZrMmYKQmx1b3JuRmRMd1V2WitZVFJZUEVOdmJ6d0NZTURiVkhaRjM0dEhMSlJxVURHQ2RWaVhoOWR1cVdOSUFYSU56bgpnL2lOL0FlNDJsOU5MbWV5aFAzWlJQeDNVSUhtZkxUSkRRdHlVL2gyQndkQlI1WU0rK0NDSnBOVmpQNGlIMkJsCmZGL25KclAzTXBDWVVOUTNjVlgya2lGNDk1VjUrdmd0Sm9kbVZqQjNwamQ0TTFJUVdLNC9ZWTd5YXJIdkdINUsKV1dQS2phSlcxYWN2dkZZZnp6bkI0dnNLcUJVc2ZVMTZZOFpzbDBRODBtL0RTaGNLK0pEU1Y2SVpVYVV0bDBIYQpCMCtwVU5xUWpaUkc0VDd3bFAwUUFEajFPK2hBNGJSdVZob2d6RzlZamUwdVJZL1c2Wk0vNTdFczN6cldJb3pjCmhMc2liOUQ0NU1ZNTZRU0lQTU82NjFWNmJZQ1pKUFZzQWZ2NGw3Q1VXK3Y5MG0veGQyZ05OV1FqckxoVm9RUFIKVFVJWjNQaDFXVmFqK2FoSmVmaXZEcmtSb0h5M2F1MDAwTFltWWpnYWh3ejQ2UDB1MDVCL0I1RXFIZForWElXRAptYkE0Q0QvcFh2azFCK1RKWW01WGY2ZFFsZmU2eUp2bWpxSUJ4ZFptdjNsaDh6d2M0Ym1DWEYyZ3crbllTTDBaCm9oRVVHVzZ5aGh0b1BrZzNHb2kzWFpaZW5NZnZKMklJNHBFWlhOTHhJZDI2RjBLQ2wzR0JVekdwbi9aOVlyOXkKNGFPVEhjeUtKbG9KT05ETzF3MkFGclI0cFRxSFRJMktwZFZHbC9Jc0VMbThWQ0xBQVZCcFE1NzBzdTl0K096YQo4ZU94NzkrUmoxUXFDeVhCSmhuRVVoQUZaZFdDRU9yQ01jMHUKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVF1b1ZhZGlzIFJvb3QgQ0EgMyBPPVF1b1ZhZGlzIExpbWl0ZWQKIyBTdWJqZWN0OiBDTj1RdW9WYWRpcyBSb290IENBIDMgTz1RdW9WYWRpcyBMaW1pdGVkCiMgTGFiZWw6ICJRdW9WYWRpcyBSb290IENBIDMiCiMgU2VyaWFsOiAxNDc4CiMgTUQ1IEZpbmdlcnByaW50OiAzMTo4NTozYzo2Mjo5NDo5Nzo2MzpiOTphYTpmZDo4OTo0ZTphZjo2ZjplMDpjZgojIFNIQTEgRmluZ2VycHJpbnQ6IDFmOjQ5OjE0OmY3OmQ4Ojc0Ojk1OjFkOmRkOmFlOjAyOmMwOmJlOmZkOjNhOjJkOjgyOjc1OjUxOjg1CiMgU0hBMjU2IEZpbmdlcnByaW50OiAxODpmMTpmYzo3ZjoyMDo1ZDpmODphZDpkZDplYjo3ZjplMDowNzpkZDo1NzplMzphZjozNzo1YTo5Yzo0ZDo4ZDo3Mzo1NDo2YjpmNDpmMTpmZTpkMTplMTo4ZDozNQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJR25UQ0NCSVdnQXdJQkFnSUNCY1l3RFFZSktvWklodmNOQVFFRkJRQXdSVEVMTUFrR0ExVUVCaE1DUWsweApHVEFYQmdOVkJBb1RFRkYxYjFaaFpHbHpJRXhwYldsMFpXUXhHekFaQmdOVkJBTVRFbEYxYjFaaFpHbHpJRkp2CmIzUWdRMEVnTXpBZUZ3MHdOakV4TWpReE9URXhNak5hRncwek1URXhNalF4T1RBMk5EUmFNRVV4Q3pBSkJnTlYKQkFZVEFrSk5NUmt3RndZRFZRUUtFeEJSZFc5V1lXUnBjeUJNYVcxcGRHVmtNUnN3R1FZRFZRUURFeEpSZFc5VwpZV1JwY3lCU2IyOTBJRU5CSURNd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUURNClYwSVdWSnptbU5QVFRlNys3Y2VmUXpsS1piUG9Gb2cwMncxWmtYVFBrcmdFUUswQ1N6R3J2STJSYU5nZ0Rob0IKNGhwN1RoZGQ0b3EzUDVrYXpldGhxOEpscGgrM3Q3MjNqL3o5Y0k4TG9HZStBYUpaejNIbUR5bDIvN0ZXZVVVcgpINTU2Vk9paktUVm9wQUZQRDZRdU4rOGJ2K09QRUtoeXExaFg1MVNHeU1uelc5b3MybDJPYmp5alB0cjdndVhkCjhseXlCVE52aWpiTzBCTk8vNzlLRERSTXBzTWh2VkFFVmV1eHU1MzdSUjVrRmQ1VkFZd0NkclhMb1Q5Q2Fid3YKdldoREZsYUpLamRoa2YybXJrN0F5eFJsbERkTGtnYnZCTkRJbklqYkMzdUJyN0U5S3NSbE9uaTI3dHlBc2RMVAptWnc2N210YWE3T050OVhPbk1LK3BVc3ZGckdlYURzR2I2NTluL2plN013cHA1aWpKVU12Ny9GZkp1R0lUZmhlCmJ0ZlpGRzRaTTJtbk80U0prOFJUVlJPaFVYaEErTGpKb3U1N3VsSkNnNTRVN1FWU1dsbFdwNWY4blQ4S0tkamMKVDVFT0U3emVsYVRmaTVtK3JKc3ppTysxZ2E4YnhpSlR5UGJIN3BjVXNNVjhlRkxJOE01dWQyQ0VwdWtxZGlEdApXQUVYTUpQcEdvdmdjMlBaYXBLVVNVNjByVXFGeEtNaU1Qd0o3V2dpYzZhSURGVWhXTVhoT3A4cTNjcmhrT0RaCmM2dHNnTGpvQzJTVG9KeU1HZit6MGd6c2tTYUhpck9pNFhDUExBcmx6VzFvVWV2YVB3Vi9pekxtRTF4ci9sOUEKNGlMSXRMUmtUOWE2ZlVnK3FHa00xN3VHY2NsenVEODduU1ZMMnY5QTZ3SURBUUFCbzRJQmxUQ0NBWkV3RHdZRApWUjBUQVFIL0JBVXdBd0VCL3pDQjRRWURWUjBnQklIWk1JSFdNSUhUQmdrckJnRUVBYjVZQUFNd2djVXdnWk1HCkNDc0dBUVVGQndJQ01JR0dHb0dEUVc1NUlIVnpaU0J2WmlCMGFHbHpJRU5sY25ScFptbGpZWFJsSUdOdmJuTjAKYVhSMWRHVnpJR0ZqWTJWd2RHRnVZMlVnYjJZZ2RHaGxJRkYxYjFaaFpHbHpJRkp2YjNRZ1EwRWdNeUJEWlhKMAphV1pwWTJGMFpTQlFiMnhwWTNrZ0x5QkRaWEowYVdacFkyRjBhVzl1SUZCeVlXTjBhV05sSUZOMFlYUmxiV1Z1CmRDNHdMUVlJS3dZQkJRVUhBZ0VXSVdoMGRIQTZMeTkzZDNjdWNYVnZkbUZrYVhObmJHOWlZV3d1WTI5dEwyTncKY3pBTEJnTlZIUThFQkFNQ0FRWXdIUVlEVlIwT0JCWUVGUExBRStDQ1F6Nzc3aTluTXBZMVhOdTR5d0xRTUc0RwpBMVVkSXdSbk1HV0FGUExBRStDQ1F6Nzc3aTluTXBZMVhOdTR5d0xRb1Vta1J6QkZNUXN3Q1FZRFZRUUdFd0pDClRURVpNQmNHQTFVRUNoTVFVWFZ2Vm1Ga2FYTWdUR2x0YVhSbFpERWJNQmtHQTFVRUF4TVNVWFZ2Vm1Ga2FYTWcKVW05dmRDQkRRU0F6Z2dJRnhqQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FnRUFUNjJnTEV6NndQSnY5MlpWcXlNMAo3dWNwMnNOYnRyQ0QyZERRNGlINzgyQ25PMTFnVXllaW0vWUlJaXJudjZCeTVad2thakd4a0hvbjI0UVJpU2VtCmQxbzQxNytzaHZ6dVhZTzhCc2JSZDJzUGJTUXZTM3BzcHdlV3l1T0VuNjJJaXgyckZvMWJaaGZaRnZTTGdOTGQKK0xKMncvdzRFNm9NM2tKcEsyN3pQT3VBSjl2MXBrUU5uMXBWV1F2VkRWSkl4YTZmOGkrQXhlb3lVRFVTbHk3Qgo0Zi94STRoUk9KL3labFoyNXc5Umw2VlNERTFKVVpVMlBiK2lTd3dRSFlhWlRLcnpjaEdUNU9yMm05cW9YYWROCnQ1NENybk1BeU5vakErajU2aGwwWWdDVXl5SWd2cFNuV2JXQ2FyNlplWHFwOGtva1V2ZDAvYnBPNXFnZEFtNngKRFlCRXdhN1RJemRmdTRWOEs1SXU2SDZsaTkyWjRiOG5ieTFkcW51SC9ncmRTL3lPOVNia2JuQkNialBzTVo1NwprOEhreVdrYVBjQnJUaUp0N3F0WVRjYlFRY0VyNms4U2gxN3JSZGhzOVpnQzA2RFlWWW9HbVJtaW9IZlJNSjZzCnpIWHVnL1d3WWpuUGJGZmlUTktSQ3c1MUtCdWF2LzBhUS9IS2QvczdqMkc0YVNnV1FnUmVjQ29jSWRpUDRiMGoKV3kxMFFKTFpZeGtOYzkxcHZHSkh2T0IwSzdMcmZiNUJHN1hBUnNXaElzdGZUc0Vva3Q0WXV0VXFLTHNSaXhlVAptSmxnbEZ3anoxb25sMTRMQlFhVE54NDdhVGJycVo1aEhZOHkybzRNMW5RK2V3a2syZ0YzUjhRN3pUU01tZlhLCjRTVmhNN0paRytKdTF6ZFh0ZzJwRXRvPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogTz1TRUNPTSBUcnVzdC5uZXQgT1U9U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0ExCiMgU3ViamVjdDogTz1TRUNPTSBUcnVzdC5uZXQgT1U9U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0ExCiMgTGFiZWw6ICJTZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3QgQ0EiCiMgU2VyaWFsOiAwCiMgTUQ1IEZpbmdlcnByaW50OiBmMTpiYzo2Mzo2YTo1NDplMDpiNToyNzpmNTpjZDplNzoxYTplMzo0ZDo2ZTo0YQojIFNIQTEgRmluZ2VycHJpbnQ6IDM2OmIxOjJiOjQ5OmY5OjgxOjllOmQ3OjRjOjllOmJjOjM4OjBmOmM2OjU2OjhmOjVkOmFjOmIyOmY3CiMgU0hBMjU2IEZpbmdlcnByaW50OiBlNzo1ZTo3MjplZDo5Zjo1NjowZTplYzo2ZTpiNDo4MDowMDo3MzphNDozZjpjMzphZDoxOToxOTo1YTozOToyMjo4MjowMTo3ODo5NTo5Nzo0YTo5OTowMjo2Yjo2YwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRFdqQ0NBa0tnQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFVRkFEQlFNUXN3Q1FZRFZRUUdFd0pLVURFWQpNQllHQTFVRUNoTVBVMFZEVDAwZ1ZISjFjM1F1Ym1WME1TY3dKUVlEVlFRTEV4NVRaV04xY21sMGVTQkRiMjF0CmRXNXBZMkYwYVc5dUlGSnZiM1JEUVRFd0hoY05NRE13T1RNd01EUXlNRFE1V2hjTk1qTXdPVE13TURReU1EUTUKV2pCUU1Rc3dDUVlEVlFRR0V3SktVREVZTUJZR0ExVUVDaE1QVTBWRFQwMGdWSEoxYzNRdWJtVjBNU2N3SlFZRApWUVFMRXg1VFpXTjFjbWwwZVNCRGIyMXRkVzVwWTJGMGFXOXVJRkp2YjNSRFFURXdnZ0VpTUEwR0NTcUdTSWIzCkRRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ3pzLzUvMDIyeDd4WjhWNlVNYlhhS0wwdS9aUHRNN29ydzh5bDgKOWYvdUt1RHA2YnBiWkNLYW1tOHNPaVpwVVFXWkp0elZIR3B4eHBwOUhwM2RmR3pHakdkblNqNzRjYkFaSjZrSgpES2FWdjB1TURQcFZtRHZZNkNLaFMzRTRlYXlYa21temlYN3FJV2dHbUJTV2g5SmhOcnh0SjFhZVYrN0F3RmI5Ck1zK2syWTdDSTllTnFQUFlKYXlYNUhBNDlMWTZ0SjA3bHlaRG82RzhTVmx5VENNd2h3Rlk5azYrSEdoV1pxL04KUVYzSXMwMHFWVWFySDlvZTRrQTkyODE5dVpLQW5EZmRESlprbmR3aTkyU0wzMkhlRlpSU0ZhQjlVc2xMcUNISgp4ckh0eThPVllORVA4S3R3K04vTFRYN3MxdnFyMmIxL1ZQS2w2WG42MmRaMkpDaHpBZ01CQUFHalB6QTlNQjBHCkExVWREZ1FXQkJTZ2MwbVphTnlGVzJYam15Z3ZWNSs5TTd3SFNEQUxCZ05WSFE4RUJBTUNBUVl3RHdZRFZSMFQKQVFIL0JBVXdBd0VCL3pBTkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQWFFQ3BxTHZrVDExNXN3VzFGN05nRSt2RwprbDNnMGROcS92dSttMjIveHdWdFdTREVIUEMzMm9SWUFtUDZTQmJ2VDZVTDkwcVk4aitlRzYxSGEyUE9DRWZyClVqOTRuSzlOcnZqVlQ4K2FtQ29RUVRsU3hOM1ptdzd2a3dHdXNpN0thRUlrUW15d3N6byt6ZW5hU01RVnkrbjUKQncrU1VFbUszVEdYWDhucE42bzdXV1dYbERMSnM1OCtPbUpZeFVtdFlnNXhwVEtxTDhhSmRrTkFFeE5uUGFKVQpKUkRMOFRyeTJmcmJTVmE3cHY2blFUWEQ0SWhoeVlqSDN6WVFJcGhaNnJCSysxWVdjMjZzVGZjaW9VK3RIWG90ClJTZmxNTUZlOHRvVHl5VkNVWlZIQTR4c0ljeDBRdTFUL3pPTGp3OVhBUll2ejZidXlYQWlGTDM5dm13TEF3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVNvbmVyYSBDbGFzczIgQ0EgTz1Tb25lcmEKIyBTdWJqZWN0OiBDTj1Tb25lcmEgQ2xhc3MyIENBIE89U29uZXJhCiMgTGFiZWw6ICJTb25lcmEgQ2xhc3MgMiBSb290IENBIgojIFNlcmlhbDogMjkKIyBNRDUgRmluZ2VycHJpbnQ6IGEzOmVjOjc1OjBmOjJlOjg4OmRmOmZhOjQ4OjAxOjRlOjBiOjVjOjQ4OjZmOmZiCiMgU0hBMSBGaW5nZXJwcmludDogMzc6Zjc6NmQ6ZTY6MDc6N2M6OTA6YzU6YjE6M2U6OTM6MWE6Yjc6NDE6MTA6YjQ6ZjI6ZTQ6OWE6MjcKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDc5OjA4OmI0OjAzOjE0OmMxOjM4OjEwOjBiOjUxOjhkOjA3OjM1OjgwOjdmOmZiOmZjOmY4OjUxOjhhOjAwOjk1OjMzOjcxOjA1OmJhOjM4OjZiOjE1OjNkOmQ5OjI3Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlESURDQ0FnaWdBd0lCQWdJQkhUQU5CZ2txaGtpRzl3MEJBUVVGQURBNU1Rc3dDUVlEVlFRR0V3SkdTVEVQCk1BMEdBMVVFQ2hNR1UyOXVaWEpoTVJrd0Z3WURWUVFERXhCVGIyNWxjbUVnUTJ4aGMzTXlJRU5CTUI0WERUQXgKTURRd05qQTNNamswTUZvWERUSXhNRFF3TmpBM01qazBNRm93T1RFTE1Ba0dBMVVFQmhNQ1Jra3hEekFOQmdOVgpCQW9UQmxOdmJtVnlZVEVaTUJjR0ExVUVBeE1RVTI5dVpYSmhJRU5zWVhOek1pQkRRVENDQVNJd0RRWUpLb1pJCmh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBSkFYU2pXZHl2QU5sc2RFK2hZMy9FaTl2WCtBTFRVNzRXK28KWjZtL0F4eE5qRzh5UjlWQmFLUVRCTUUxREpxRVEveGNIZitKcytnWEdNMlJYL3VKNCtxL1RsMThHeWJUZFhudAo1b1RqVitXdEtjVDBPaWpucFh1RU5tbXovVjUydmFNdG1kT1FUaU1vZlJoajhWUTdKcDEyVzVkQ3N2K3U4RTdzCjNUbVZUb01HZitkSlFNakZBYkpVV21ZZFBmejU2VHdLbm9HNGNQQUJpK1FqVkh6SXJ2aVFIZ0NXY3RSVXoyRWoKdk9yN25RS1YwYmE1Y1RwcENEOFB0T0ZDeDRqMVA1aW9wN29jNEhGeDcxaFhnVkI2WEd0MFJnNkRBNWpEanFodQo4bll5YmllRHduUHozQmpvdEpQcWRVUnJCR0FnY1ZlSG5mTytvSkFqUFlvazRkb2gyOE1DQXdFQUFhTXpNREV3CkR3WURWUjBUQVFIL0JBVXdBd0VCL3pBUkJnTlZIUTRFQ2dRSVNxQ3FXSVRUWGp3d0N3WURWUjBQQkFRREFnRUcKTUEwR0NTcUdTSWIzRFFFQkJRVUFBNElCQVFCYXpvZjVGbklWVjBzZDJadm5vaVl3N0pObjM5WXQwalN2OXppbAp6cXNXdWFzdmZEWExyTkFQdEV3ci9JRHZhNHlSWHpaMjk5dXpHeG5xOUxJUi9XRnhSTDhvc3pvZHY3TkQ2SisvCjNERUljYkNkamRZMFJ6S1F4bVVrOTZCS2ZBUnpqemx2RjR4eXRiMUx5SHI0ZTRQREtFNmNDZXBuUDdKbkJCdkQKRk5yNDUwa2trZEFkYXZwaE9lOXI1eUYxQmdmWUVyUWhJSEJDY1lIYVBKbzJ2cVpiRFdwc21oK1JlL241NzBLNgpUazZlekF5TmxOelpSWnhlN0VKUVk2NzBYY1N4RXR6S082Z3VuUlJhQlhXMzdOZGo0cm8xdGdRSWtlamFuWnoyClpyVVlyQXFtVkNZME05SWJ3ZFIvR2pxT0M2b3lidHY4VHlXZjJUTEhsbHB3ck45TQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049WFJhbXAgR2xvYmFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89WFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jIE9VPXd3dy54cmFtcHNlY3VyaXR5LmNvbQojIFN1YmplY3Q6IENOPVhSYW1wIEdsb2JhbCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPVhSYW1wIFNlY3VyaXR5IFNlcnZpY2VzIEluYyBPVT13d3cueHJhbXBzZWN1cml0eS5jb20KIyBMYWJlbDogIlhSYW1wIEdsb2JhbCBDQSBSb290IgojIFNlcmlhbDogMTA3MTA4OTA4ODAzNjUxNTA5NjkyOTgwMTI0MjMzNzQ1MDE0OTU3CiMgTUQ1IEZpbmdlcnByaW50OiBhMTowYjo0NDpiMzpjYToxMDpkODowMDo2ZTo5ZDowZjpkODowZjo5MjowYTpkMQojIFNIQTEgRmluZ2VycHJpbnQ6IGI4OjAxOjg2OmQxOmViOjljOjg2OmE1OjQxOjA0OmNmOjMwOjU0OmYzOjRjOjUyOmI3OmU1OjU4OmM2CiMgU0hBMjU2IEZpbmdlcnByaW50OiBjZTpjZDpkYzo5MDo1MDo5OTpkODpkYTpkZjpjNTpiMTpkMjowOTpiNzozNzpjYjplMjpjMTo4YzpmYjoyYzoxMDpjMDpmZjowYjpjZjowZDozMjo4NjpmYzoxYTphMgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRU1EQ0NBeGlnQXdJQkFnSVFVSlJzN0JqcTFaeE4xWmZ2ZFkrZ3JUQU5CZ2txaGtpRzl3MEJBUVVGQURDQgpnakVMTUFrR0ExVUVCaE1DVlZNeEhqQWNCZ05WQkFzVEZYZDNkeTU0Y21GdGNITmxZM1Z5YVhSNUxtTnZiVEVrCk1DSUdBMVVFQ2hNYldGSmhiWEFnVTJWamRYSnBkSGtnVTJWeWRtbGpaWE1nU1c1ak1TMHdLd1lEVlFRREV5UlkKVW1GdGNDQkhiRzlpWVd3Z1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGt3SGhjTk1EUXhNVEF4TVRjeApOREEwV2hjTk16VXdNVEF4TURVek56RTVXakNCZ2pFTE1Ba0dBMVVFQmhNQ1ZWTXhIakFjQmdOVkJBc1RGWGQzCmR5NTRjbUZ0Y0hObFkzVnlhWFI1TG1OdmJURWtNQ0lHQTFVRUNoTWJXRkpoYlhBZ1UyVmpkWEpwZEhrZ1UyVnkKZG1salpYTWdTVzVqTVMwd0t3WURWUVFERXlSWVVtRnRjQ0JIYkc5aVlXd2dRMlZ5ZEdsbWFXTmhkR2x2YmlCQgpkWFJvYjNKcGRIa3dnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDWUpCNjlGYlM2CjM4ZU1wU2UyT0F0cDg3Wk9xQ3d1SVIxY1JOOGhYWDRqZFA1ZWZyUkt0NmF0SDY3Z0JoYmltMXZaWjNSclhZQ1AKS1oyR0c5bWNEWmh0ZGhBb1dPUmxzSDlLbUhtZjRNTXhmb0FydFl6QVFEc1JodERMb29ZMllLVFZNSUp0Mlc3UQpEeElFTTVkZlQyRmE4T1Q1a2F2bkhUdTg2TS8wYXkwMGZPSklZUnlPODJGRXpHK2dTcW1Vc0UzYTU2azBlbkk0CnFFSE1QSlFSZmV2SXBveTNoc3ZLTXp2WlBUZUwrM28raGl6bmM5Y0tWNnhrbXhucjlBOEVDSXFzQXhjWlpQUmEKSlNLTk5DeXk5bWdkRW0zVGloNFUyc1NQcHVJamhkVjZEYjFxNE9uczdCZTdRaHRucWlYdFJZTWgvTUhKZk5WaQpQdnJ5eFMzVC9kUmxBZ01CQUFHamdaOHdnWnd3RXdZSkt3WUJCQUdDTnhRQ0JBWWVCQUJEQUVFd0N3WURWUjBQCkJBUURBZ0dHTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SFFZRFZSME9CQllFRk1aUG9qMEdZNFFKbk01aTVBU3MKalZ5MTZiWWJNRFlHQTFVZEh3UXZNQzB3SzZBcG9DZUdKV2gwZEhBNkx5OWpjbXd1ZUhKaGJYQnpaV04xY21sMAplUzVqYjIwdldFZERRUzVqY213d0VBWUpLd1lCQkFHQ054VUJCQU1DQVFFd0RRWUpLb1pJaHZjTkFRRUZCUUFECmdnRUJBSkVWT1FNQkcyZjdTaHo1Q21CYm9kcE5sMkw1SkZNbjE0SmtUcEF1dzBrYks1cmMvS2g0WnpYeEhmQVIKdmJkSTR4RDJEZDgvMHNtMnFsV2tTTG9DMjk1WkxoVmJPNTBXZlVmWE4rcGZUWFlTTnJzZjE2R0JCRVlnb3l4dApxWjRCZmo4cHpnQ1QzLzNKa25PSmlXU2U1eXZrSEpFczBybk9mYzV2TVpuVDVyN1NIcER3Q1JSNVhDT3JUZExhCklSOU5tWG1kNGM4bm54Q2JISWdOc0lwa1FURzREbXlRSktTYlhIR1B1cnQrSEJ2YmFvQVBJYnpwMjZhM1FQU3kKaTZteDVPK2FHdEE5YVpudXFDaWo0VHl6OExJUm5NOThRT2JkNTBOOW90ZzZ0YW1OOGpTWnhOUVE0UWI5Q1lRUQpPKzdFVFBUc0ozeEN3blI4Z29vSnliUURKYnc9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBPPVRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLiBPVT1HbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5CiMgU3ViamVjdDogTz1UaGUgR28gRGFkZHkgR3JvdXAsIEluYy4gT1U9R28gRGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQojIExhYmVsOiAiR28gRGFkZHkgQ2xhc3MgMiBDQSIKIyBTZXJpYWw6IDAKIyBNRDUgRmluZ2VycHJpbnQ6IDkxOmRlOjA2OjI1OmFiOmRhOmZkOjMyOjE3OjBjOmJiOjI1OjE3OjJhOjg0OjY3CiMgU0hBMSBGaW5nZXJwcmludDogMjc6OTY6YmE6ZTY6M2Y6MTg6MDE6ZTI6Nzc6MjY6MWI6YTA6ZDc6Nzc6NzA6MDI6OGY6MjA6ZWU6ZTQKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGMzOjg0OjZiOmYyOjRiOjllOjkzOmNhOjY0OjI3OjRjOjBlOmM2OjdjOjFlOmNjOjVlOjAyOjRmOmZjOmFjOmQyOmQ3OjQwOjE5OjM1OjBlOjgxOmZlOjU0OjZhOmU0Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFQURDQ0F1aWdBd0lCQWdJQkFEQU5CZ2txaGtpRzl3MEJBUVVGQURCak1Rc3dDUVlEVlFRR0V3SlZVekVoCk1COEdBMVVFQ2hNWVZHaGxJRWR2SUVSaFpHUjVJRWR5YjNWd0xDQkpibU11TVRFd0x3WURWUVFMRXloSGJ5QkUKWVdSa2VTQkRiR0Z6Y3lBeUlFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1TUI0WERUQTBNRFl5T1RFMwpNRFl5TUZvWERUTTBNRFl5T1RFM01EWXlNRm93WXpFTE1Ba0dBMVVFQmhNQ1ZWTXhJVEFmQmdOVkJBb1RHRlJvClpTQkhieUJFWVdSa2VTQkhjbTkxY0N3Z1NXNWpMakV4TUM4R0ExVUVDeE1vUjI4Z1JHRmtaSGtnUTJ4aGMzTWcKTWlCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVENDQVNBd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFTgpBRENDQVFnQ2dnRUJBTjZkMStwWEdFbWhXK3ZYWDBpRzZyN2QvK1R2Wnh6MFpXaXpWM0dnWG5lNzdadEo2WENBClBWWVlZd2h2MnZMTTBEOS9BbFFpVkJEWXNvSFV3SFU5UzMvSGQ4TStlS3NhQTdVZ2F5OXFLN0hGaUg3RXV4NncKd2RoRkoyK3FOMWozaHliWDJDMzJxUmUzSDNJMlRxWVhQMldZa3RzcWJsMmkvb2pnQzk1LzVZMFY0ZXZMT3RYaQpFcUlUTGRpT3IxOFNQYUFJQlFpMlhLVmxPQVJGbVI2allHQjB4VUdsY21JYllzVWZiMThhUXI0Q1VXV29yaU1ZCmF2eDRBNmxOZjRERCtxdGEvS0ZBcE1vWkZ2Nnl5TzllY3czdWQ3MmE5bm1ZdkxFSFo2SVZEZDJnV01aRWV3bysKWWloZnVrRUhVMWpQRVg0NGRNWDQvN1Zwa0krRWRPcVhHNjhDQVFPamdjQXdnYjB3SFFZRFZSME9CQllFRk5MRQpzTktSMUV3UmNiTmh5ejJoL3Qyb2F0VGpNSUdOQmdOVkhTTUVnWVV3Z1lLQUZOTEVzTktSMUV3UmNiTmh5ejJoCi90Mm9hdFRqb1dla1pUQmpNUXN3Q1FZRFZRUUdFd0pWVXpFaE1COEdBMVVFQ2hNWVZHaGxJRWR2SUVSaFpHUjUKSUVkeWIzVndMQ0JKYm1NdU1URXdMd1lEVlFRTEV5aEhieUJFWVdSa2VTQkRiR0Z6Y3lBeUlFTmxjblJwWm1sagpZWFJwYjI0Z1FYVjBhRzl5YVhSNWdnRUFNQXdHQTFVZEV3UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUZCUUFECmdnRUJBREpMODdMS1BwSDhFc2FoQjR5T2Q2QXpCaFJja0I0WTl3aW1QUW9aK1llQUVXNXA1SllYTVA4MGtXTnkKT083TUhBR2pIWlFvcERIMmVzUlUxL2JsTVZnRG9zek9ZdHVVUlhPMXYwWEpKTFhWZ2dLdEkzbHBqYmkyVGM3UApUTW96SStnY2lLcWRpMEZ1RnNrZzVZbWV6VHZhY1BkK21TWWdGRlFscTI1emhlYWJJWjBLYklJT3FQakNEUG9RCkhteVc3NGNOeEE5aGk2M3VneXVWK0k2U2hISTU2eURxZysyRHpaZHVDTHpyVGlhMmN5dmswL1pNL2laeDRtRVIKZEVyL1Z4cUhEM1ZJTHM5UmFSZWdBaEpobGRYUlFMSVFUTzdFckJCRHBxV2VDdFdWWXBvTno0aUN4VElNNUN1ZgpSZVlObnlpY3Nia3FXbGV0TncrdkhYL2J2Wjg9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBPPVN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4gT1U9U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKIyBTdWJqZWN0OiBPPVN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4gT1U9U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKIyBMYWJlbDogIlN0YXJmaWVsZCBDbGFzcyAyIENBIgojIFNlcmlhbDogMAojIE1ENSBGaW5nZXJwcmludDogMzI6NGE6NGI6YmI6Yzg6NjM6Njk6OWI6YmU6NzQ6OWE6YzY6ZGQ6MWQ6NDY6MjQKIyBTSEExIEZpbmdlcnByaW50OiBhZDo3ZToxYzoyODpiMDo2NDplZjo4Zjo2MDowMzo0MDoyMDoxNDpjMzpkMDplMzozNzowZTpiNTo4YQojIFNIQTI1NiBGaW5nZXJwcmludDogMTQ6NjU6ZmE6MjA6NTM6OTc6Yjg6NzY6ZmE6YTY6ZjA6YTk6OTU6OGU6NTU6OTA6ZTQ6MGY6Y2M6N2Y6YWE6NGY6Yjc6YzI6Yzg6Njc6NzU6MjE6ZmI6NWY6YjY6NTgKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVEekNDQXZlZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRVUZBREJvTVFzd0NRWURWUVFHRXdKVlV6RWwKTUNNR0ExVUVDaE1jVTNSaGNtWnBaV3hrSUZSbFkyaHViMnh2WjJsbGN5d2dTVzVqTGpFeU1EQUdBMVVFQ3hNcApVM1JoY21acFpXeGtJRU5zWVhOeklESWdRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrd0hoY05NRFF3Ck5qSTVNVGN6T1RFMldoY05NelF3TmpJNU1UY3pPVEUyV2pCb01Rc3dDUVlEVlFRR0V3SlZVekVsTUNNR0ExVUUKQ2hNY1UzUmhjbVpwWld4a0lGUmxZMmh1YjJ4dloybGxjeXdnU1c1akxqRXlNREFHQTFVRUN4TXBVM1JoY21acApaV3hrSUVOc1lYTnpJRElnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa3dnZ0VnTUEwR0NTcUdTSWIzCkRRRUJBUVVBQTRJQkRRQXdnZ0VJQW9JQkFRQzNNc2orNlhHbUJJV3REQkZrMzg1Tjc4Z0RHSWMvb2F2N1BLYWYKOE1PaDJ0VFliaXRUa1Bza3BENkU4SjdvWCt6bEowVDFLS1kvZTk3Z0t2RElyMU12bnNvRkFaTWVqMlljT2FkTgorbHEyY3dRbFp1dDNmK2RaeGtxWkpSUlU2eWJIODM4WjFUQndqNit3UmlyL3Jlc3A3ZGVmcWdTSG85VDVpYVUwClg5dERrWUkyMldZOHNiaTVndjJjT2o0UXlEdnZCbVZtZXBzWkdEMy9jVkU4TUM1ZnZqMTNjN0pkQm16REkxYWEKSzRVbWtoeW5BclBrUHcydkNIbUN1RFk5NnB6VE5iTzhhY3Ixekozby9XU05GNEF6Ymw1S1habkpIb2UwblJyQQoxVzRUTlNOZTM1dGZQZS9XOTNiQzZqNjdlQTBjUW1kckJOajQxdHB2aS9KRW9BR3JBZ0VEbzRIRk1JSENNQjBHCkExVWREZ1FXQkJTL1g3ZlJ6dDBmaHZSYlZhemMxeERDRHFtSTV6Q0JrZ1lEVlIwakJJR0tNSUdIZ0JTL1g3ZlIKenQwZmh2UmJWYXpjMXhEQ0RxbUk1NkZzcEdvd2FERUxNQWtHQTFVRUJoTUNWVk14SlRBakJnTlZCQW9USEZOMApZWEptYVdWc1pDQlVaV05vYm05c2IyZHBaWE1zSUVsdVl5NHhNakF3QmdOVkJBc1RLVk4wWVhKbWFXVnNaQ0JECmJHRnpjeUF5SUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVnZ0VBTUF3R0ExVWRFd1FGTUFNQkFmOHcKRFFZSktvWklodmNOQVFFRkJRQURnZ0VCQUFXZFA0aWQwY2thVmFHc2FmUHpXZHFiQVljYVQxZXBvWGtKS3R2MwpMN0llek1kZWF0aURoNkdYNzBrMVBuY0dRVmhpdjQ1WXVBcG5QK3l6M1NGbUg4bFUrbkxNUFV4QTJJR3ZkNTZECmVydWl4L1UwRjQ3WkVVRDAvQ3dxVFJWL3AySmRMaVhUQUFzZ0doMW8rUmU0OUwyTDdTaFozVTBXaXhlRHlMSmwKeHkxNnBhcThVNFp0M1Zla3l2Z2dRUXRvOFBUN2RMNVdYWHA1OWZrZGhlTXRsYjcxY1pCRHpJMGZtZ0FLaHlucApWU0pZQUNQcTR4SkRLVnRIQ04yTVFXcGxCcWpsSWFwQnRKVWhsYmw5MFRTckU5YXR2TnppUFRuTnZUNTFjS0VZCldRUEpJclNQbk5WZUt0ZWx0dFFLYmZpM1FCRkdtaDk1RG1LL0Q1ZnM0QzhmRjVRPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogTz1Hb3Zlcm5tZW50IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKIyBTdWJqZWN0OiBPPUdvdmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQojIExhYmVsOiAiVGFpd2FuIEdSQ0EiCiMgU2VyaWFsOiA0MjAyMzA3MDgwNzcwODcyNDE1OTk5MTE0MDU1NjUyNzA2Njg3MAojIE1ENSBGaW5nZXJwcmludDogMzc6ODU6NDQ6NTM6MzI6NDU6MWY6MjA6ZjA6ZjM6OTU6ZTE6MjU6YzQ6NDM6NGUKIyBTSEExIEZpbmdlcnByaW50OiBmNDo4YjoxMTpiZjpkZTphYjpiZTo5NDo1NDoyMDo3MTplNjo0MTpkZTo2YjpiZTo4ODoyYjo0MDpiOQojIFNIQTI1NiBGaW5nZXJwcmludDogNzY6MDA6Mjk6NWU6ZWY6ZTg6NWI6OWU6MWY6ZDY6MjQ6ZGI6NzY6MDY6MmE6YWE6YWU6NTk6ODE6OGE6NTQ6ZDI6Nzc6NGM6ZDQ6YzA6YjI6YzA6MTE6MzE6ZTE6YjMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZjakNDQTFxZ0F3SUJBZ0lRSDUxWld0Y3Z3Z1pFcFlBSWFlTmU5akFOQmdrcWhraUc5dzBCQVFVRkFEQS8KTVFzd0NRWURWUVFHRXdKVVZ6RXdNQzRHQTFVRUNnd25SMjkyWlhKdWJXVnVkQ0JTYjI5MElFTmxjblJwWm1sagpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1CNFhEVEF5TVRJd05URXpNak16TTFvWERUTXlNVEl3TlRFek1qTXpNMW93ClB6RUxNQWtHQTFVRUJoTUNWRmN4TURBdUJnTlZCQW9NSjBkdmRtVnlibTFsYm5RZ1VtOXZkQ0JEWlhKMGFXWnAKWTJGMGFXOXVJRUYxZEdodmNtbDBlVENDQWlJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQgpBSm9sdU96TW9uV29lL2ZPVzFtS3lkR0dFZ2hVN0p6eTUwYjJpUE44NmFYZlRFYzJwQnNCSEg4ZVY0cU53OFhSCkllUGFKRDlJSy91ZkxxR1U1eXdjazlHL0d3R0hVNW5PcC9VS0lYWjMvNm0zeG5PVVQwYjNFRWszK3FoWlNWMXEKZ1FkVzhvcjVCdEQzY0NKTnRMZEJ1VEs0c2ZDeHc1dy9jUDFUM1lHcTJHTjQ5dGhUYnFHc2FvUWtjbFNHeHRLeQp5aHdPZVlIV3RYQmlDQUV1VGs4TzFSR3ZxYS9sbXIvY3pJZHRKdVRKVjZMN2x2bk00VDlUakd4TWZwdFRDQXRzCkYvdG55TUt0c2MyQXRKZmNkZ0VXRmVscTE2VGhlRWZPaHRYN01mUDZNYjQwcWlqN2NFd2RTY2V2TEoxdFpxYTIKaldSK3RTQnFuVHVCdG85QUFHZExpWWE0ekdYK0ZWUHBCTUhXWHgxRTF3b3ZKNXBHZmFFTmRhMVVoaFhjU1R2eApsczRQbTZEc28zcGR2dFVxZFVMbGU5Nmx0cXF2S0t5c2tLdzR0OVZvTlNaNjNQYzc4LzFGbTlHN1EzaHViL0ZDClZHcVk4QTJ0bCtsU1h1blZhbkxlYXZjYllCVDBwZVMyY1dlcUgrcmlUY0ZDUVA1blJoYzRMMGMvY1p5dTVTSEsKWVMxdEI2aUVmQzN1VVNYeFk1Q2UvZUZYaUd2dmlpTnRzZWE5UDYzUlBaWUxoWTNOYXllN3R3V2I3THVScVFvSApFZ0tYVGlDUThQOE5IdUpCTzlOQU91ZU5YZHBtNUFLd0IxS1lYQTZPTTV6Q3BwWDdWUmx1VEk2dVN3Kzl3VGhOClhvK0VIV2JOeFdDV3RGSmFCWW1PbFhxWXdaRThsU095RHZSNXRNbDh3VW9oQWdNQkFBR2phakJvTUIwR0ExVWQKRGdRV0JCVE16Ty9NS1dDa083R1N0ano2TW1LUHJDVVZPekFNQmdOVkhSTUVCVEFEQVFIL01Ea0dCR2NxQndBRQpNVEF2TUMwQ0FRQXdDUVlGS3c0REFob0ZBREFIQmdWbktnTUFBQVFVQTV2d0loUC9sU2cyMDl5ZXdETDdNVHFLClVXVXdEUVlKS29aSWh2Y05BUUVGQlFBRGdnSUJBRUNBU3ZvbXljNWVNTjFQaG5SMldQV3VzNE16ZUtSNmRCY1oKVHVsU3RibmdDblJpcW1qS2VLQk1tbzRzSXk3VmFoSWt2OVJvMDRyUTJKeWZ0QjhNM2poK1Z6ajhqZUpQWGd5ZgpxenZTLzNXWHk2VGpad2ovNWNBV3RVZ0JmZW41Q3Y4YjVXcHB2M2docU1Lbkk2bUdxM1pXNkE0TTloUGRLbWFLClpFazlHaGlIa0FTZlFsSzNUOHYrUjBGMk5lLy9BSFkyUlRLYnhrYUZYZUlrc0I3alNKYVlWMGVVVlhvUFFiRkUKSlBQQi9ocHJ2NGo5d2FiYWsyQmVnVXFaSUp4SVpobTFBSGxVRDdnc0wwdThxVjFiWUgrTWg2WGdVbU1xdnRnNwpoVUFWL2g2MlpUL0ZTOXArdFhvMUthTXVlcGhnSXFQMGZTZE9MZXEwZER6cEQ2UXpEeEFSdkJNQjF1VU8wNysxCkVxTGhSU1BBekFodVliZUpxNFBqSkI3bVhRZm5IeUErejJmSTU2d3diU2RMYUc1TEtsd0NDRFRiK0hia1o2TW0KbkQraU1zSkt4WUVZTVJCV3FvVHZMUXIvdUI5MzByK2xXS0JpNU5kTGtYV05pWUNZZm0zTFUwNWVyL2F5bDRXWAp1ZHBWQnJrazd0ZkdPQjVqR3hJN2xlRllyUExmaE5WZm1TOE5WVnZtT05zdVAzTHBTSVhMdXlrVGp4NDRWYm56CnNzUXdtU05PWGZKSW9SSU0zQktRQ1pCVWtRTThSK1hWeVdYZ3QwdDk3RWZUc3dzK3JaN1FkQUFPNjcxUnJjRGUKTE1ERGF2N3YzQXVuK2tiZllOdWNwbGxRZFNOcGM1T3krZndDMDBmbWNjNFFBdTRuaklUL3JFVU5FMXlETXVBbApwWVlzZlBRUwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049RGlnaUNlcnQgQXNzdXJlZCBJRCBSb290IENBIE89RGlnaUNlcnQgSW5jIE9VPXd3dy5kaWdpY2VydC5jb20KIyBTdWJqZWN0OiBDTj1EaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EgTz1EaWdpQ2VydCBJbmMgT1U9d3d3LmRpZ2ljZXJ0LmNvbQojIExhYmVsOiAiRGlnaUNlcnQgQXNzdXJlZCBJRCBSb290IENBIgojIFNlcmlhbDogMTcxNTQ3MTc5MzQxMjA1ODc4NjIxNjc3OTQ5MTQwNzE0MjUwODEKIyBNRDUgRmluZ2VycHJpbnQ6IDg3OmNlOjBiOjdiOjJhOjBlOjQ5OjAwOmUxOjU4OjcxOjliOjM3OmE4OjkzOjcyCiMgU0hBMSBGaW5nZXJwcmludDogMDU6NjM6Yjg6NjM6MGQ6NjI6ZDc6NWE6YmI6Yzg6YWI6MWU6NGI6ZGY6YjU6YTg6OTk6YjI6NGQ6NDMKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDNlOjkwOjk5OmI1OjAxOjVlOjhmOjQ4OjZjOjAwOmJjOmVhOjlkOjExOjFlOmU3OjIxOmZhOmJhOjM1OjVhOjg5OmJjOmYxOmRmOjY5OjU2OjFlOjNkOmM2OjMyOjVjCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEdHpDQ0FwK2dBd0lCQWdJUURPZmc1UmZZUnY2UDVXRDhHL0F3T1RBTkJna3Foa2lHOXcwQkFRVUZBREJsCk1Rc3dDUVlEVlFRR0V3SlZVekVWTUJNR0ExVUVDaE1NUkdsbmFVTmxjblFnU1c1ak1Sa3dGd1lEVlFRTEV4QjMKZDNjdVpHbG5hV05sY25RdVkyOXRNU1F3SWdZRFZRUURFeHRFYVdkcFEyVnlkQ0JCYzNOMWNtVmtJRWxFSUZKdgpiM1FnUTBFd0hoY05NRFl4TVRFd01EQXdNREF3V2hjTk16RXhNVEV3TURBd01EQXdXakJsTVFzd0NRWURWUVFHCkV3SlZVekVWTUJNR0ExVUVDaE1NUkdsbmFVTmxjblFnU1c1ak1Sa3dGd1lEVlFRTEV4QjNkM2N1WkdsbmFXTmwKY25RdVkyOXRNU1F3SWdZRFZRUURFeHRFYVdkcFEyVnlkQ0JCYzNOMWNtVmtJRWxFSUZKdmIzUWdRMEV3Z2dFaQpNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUN0RGhYTzVFT0FYTEdIODdkZytYRVNwYTdjCkpwU0lxdlRPOVNBNUtGaGdEUGlBMnFrVmxUSmhQTFd4S0lTS2l0eWZDZ3lERjNxUGtLeUs1M2xUWERHRUt2WVAKbURJMmRzemUzVHlvb3U5cSt5SHlVbUhmbnlEWEgrS3gyZjRZWk5JU1cxLzVXQmcxdkVmTm9UYjVhMy9Vc0RnKwp3UnZEakRQWjJDOFkvaWdQczZlRDFzTnVSTUJoTlpZVy9sbWNpM1p0MS9HaVN3MHIvd3R5MnA1ZzBJNlFOY1o0ClZZY2dvYy9sYlFySVNYd3htRE5zSXVtSDBESmFvcm9UZ2hIdE9SZWRtVHB5b2ViNnBOblZGekYxcm9WOUlxNC8KQVVhRzlpaDV5TEhhNUZjWHhINGNEckMwa3FaV3M3MnlsKzJxcC9DM3hhZy9sUmJRLzZHVzZ3aGZHSGRQQWdNQgpBQUdqWXpCaE1BNEdBMVVkRHdFQi93UUVBd0lCaGpBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXCkJCUkY2Nkt2OUpMTGdqRXRVWXVucHlHZDgyM0lEekFmQmdOVkhTTUVHREFXZ0JSRjY2S3Y5SkxMZ2pFdFVZdW4KcHlHZDgyM0lEekFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBb2c2ODMrTHQ4T055YzNwa2xMLzNjbWJZTXVSQwpkV0t1aCt2eTFkbmVWck9mek00VUtMa05sMkJjRWt4WTVOTTlnMGxGV0pjMWFScW9SK3BXeG5tckV0aG5nWVRmCmZ3azhsT2E0Sml3Z3ZUMnpLSW4zWC84aTRwZUVIK2xsNzRmZzM4Rm5TYk5kNjdJSkt1c203WGkrZlQ4cjg3Y20KTlcxZmlRRzJTVnVmQVFXYnF6MGx3Y3kyZjhMeGI0YkcrbVJvNjRFdGxPdEN0L3FNSHQxaThiNVFaN2RzdmZQeApIMnNNTmdjV2Z6ZDhxVnR0ZXZFU1JtQ0QxeWNFdmt2T2w3N0RaeXBvRWQrQTV3d3pacjhURFJSdTgzOGZZeEFlCitvMGJKVzFzajZXM1lRR3gwcU1tb1JCeG5hM2l3L25EbVZHM0t3Y0l6aTdtVUxLbitncEZMNkx3OGc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049RGlnaUNlcnQgR2xvYmFsIFJvb3QgQ0EgTz1EaWdpQ2VydCBJbmMgT1U9d3d3LmRpZ2ljZXJ0LmNvbQojIFN1YmplY3Q6IENOPURpZ2lDZXJ0IEdsb2JhbCBSb290IENBIE89RGlnaUNlcnQgSW5jIE9VPXd3dy5kaWdpY2VydC5jb20KIyBMYWJlbDogIkRpZ2lDZXJ0IEdsb2JhbCBSb290IENBIgojIFNlcmlhbDogMTA5NDQ3MTk1OTg5NTIwNDAzNzQ5NTE4MzI5NjM3OTQ0NTQzNDYKIyBNRDUgRmluZ2VycHJpbnQ6IDc5OmU0OmE5Ojg0OjBkOjdkOjNhOjk2OmQ3OmMwOjRmOmUyOjQzOjRjOjg5OjJlCiMgU0hBMSBGaW5nZXJwcmludDogYTg6OTg6NWQ6M2E6NjU6ZTU6ZTU6YzQ6YjI6ZDc6ZDY6NmQ6NDA6YzY6ZGQ6MmY6YjE6OWM6NTQ6MzYKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDQzOjQ4OmEwOmU5OjQ0OjRjOjc4OmNiOjI2OjVlOjA1OjhkOjVlOjg5OjQ0OmI0OmQ4OjRmOjk2OjYyOmJkOjI2OmRiOjI1OjdmOjg5OjM0OmE0OjQzOmM3OjAxOjYxCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEcnpDQ0FwZWdBd0lCQWdJUUNEdmdWcEJDUnJHaGRXckpXWkhIU2pBTkJna3Foa2lHOXcwQkFRVUZBREJoCk1Rc3dDUVlEVlFRR0V3SlZVekVWTUJNR0ExVUVDaE1NUkdsbmFVTmxjblFnU1c1ak1Sa3dGd1lEVlFRTEV4QjMKZDNjdVpHbG5hV05sY25RdVkyOXRNU0F3SGdZRFZRUURFeGRFYVdkcFEyVnlkQ0JIYkc5aVlXd2dVbTl2ZENCRApRVEFlRncwd05qRXhNVEF3TURBd01EQmFGdzB6TVRFeE1UQXdNREF3TURCYU1HRXhDekFKQmdOVkJBWVRBbFZUCk1SVXdFd1lEVlFRS0V3eEVhV2RwUTJWeWRDQkpibU14R1RBWEJnTlZCQXNURUhkM2R5NWthV2RwWTJWeWRDNWoKYjIweElEQWVCZ05WQkFNVEYwUnBaMmxEWlhKMElFZHNiMkpoYkNCU2IyOTBJRU5CTUlJQklqQU5CZ2txaGtpRwo5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBNGp2aEVYTGVxS1RUbzFlcVVLS1BDM2VReWFLbDdoTE9sbHNCCkNTRE1BWk9uVGpDM1UvZER4R2tBVjUzaWpTTGRod1pBQUlFSnpzNGJnNy9melR0eFJ1TFdac2NGczNZbkZvOTcKbmg2VmZlNjNTS01JMnRhdmVndzVCbVYvU2wwZnZCZjRxNzd1S05kMGYzcDRtVm1GYUc1Y0l6Skx2MDdBNkZwdAo0M0MvZHhDLy9BSDJoZG1vUkJCWU1xbDFHTlhSb3I1SDRpZHE5Sm96K0VrSVlJdlVYN1E2aEwraHFrcE1mVDdQClQxOXNkbDZnU3plUm50d2k1bTNPRkJxT2Fzdit6Yk1VWkJmSFd5bWVNci95N3ZyVEMwTFVxN2RCTXRvTTFPLzQKZ2RXN2pWZy90UnZvU1NpaWNOb3hCTjMzc2hieVRBcE9CNmp0U2oxZXRYK2prTU92SndJREFRQUJvMk13WVRBTwpCZ05WSFE4QkFmOEVCQU1DQVlZd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVUE5NVFOVmJSClRMdG04S1BpR3h2RGw3STkwVlV3SHdZRFZSMGpCQmd3Rm9BVUE5NVFOVmJSVEx0bThLUGlHeHZEbDdJOTBWVXcKRFFZSktvWklodmNOQVFFRkJRQURnZ0VCQU11Y042cElFeElLK3QxRW5FOVNzUFRmcmdUMWVYa0lveVFZL0VzcgpoTUF0dWRYSC92VEJIMWpMdUcyY2VuVG5tQ21yRWJYamNLQ2h6VXlJbVpPTWtYRGlxdzhjdnBPcC8yUFY1QWRnCjA2Ty9uVnNKOGRXTzQxUDBqbVA2UDZmYnRHYmZZbWJXMFc1QmpmSXR0ZXAzU3ArZFdPSXJXY0JBSSswdEtJSkYKUG5sVWtpYVk0SUJJcURmdjhOWjVZQmJlck9nT3pXNnNSQmM0TDBuYTRVVStLcmsyVTg4NlVBYjNMdWpFVjBscwpZU0VZMVFTdGVEd3NPb0JycCt1dkZSVHAySW5CdVRoczRwRnNpdjlrdVhjbFZ6REFHeVNqNGR6cDMwZDh0YlFrCkNBVXc3QzI5Qzc5RnYxQzVxZlBybUFFU3JjaUl4cGcwWDQwS1BNYnAxWldWYmQ0PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049RGlnaUNlcnQgSGlnaCBBc3N1cmFuY2UgRVYgUm9vdCBDQSBPPURpZ2lDZXJ0IEluYyBPVT13d3cuZGlnaWNlcnQuY29tCiMgU3ViamVjdDogQ049RGlnaUNlcnQgSGlnaCBBc3N1cmFuY2UgRVYgUm9vdCBDQSBPPURpZ2lDZXJ0IEluYyBPVT13d3cuZGlnaWNlcnQuY29tCiMgTGFiZWw6ICJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBIgojIFNlcmlhbDogMzU1MzQwMDA3NjQxMDU0NzkxOTcyNDczMDczNDM3ODEwMDA4NwojIE1ENSBGaW5nZXJwcmludDogZDQ6NzQ6ZGU6NTc6NWM6Mzk6YjI6ZDM6OWM6ODU6ODM6YzU6YzA6NjU6NDk6OGEKIyBTSEExIEZpbmdlcnByaW50OiA1ZjpiNzplZTowNjozMzplMjo1OTpkYjphZDowYzo0Yzo5YTplNjpkMzo4ZjoxYTo2MTpjNzpkYzoyNQojIFNIQTI1NiBGaW5nZXJwcmludDogNzQ6MzE6ZTU6ZjQ6YzM6YzE6Y2U6NDY6OTA6Nzc6NGY6MGI6NjE6ZTA6NTQ6NDA6ODg6M2I6YTk6YTA6MWU6ZDA6MGI6YTY6YWI6ZDc6ODA6NmU6ZDM6YjE6MTg6Y2YKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR4VENDQXEyZ0F3SUJBZ0lRQXF4Y0ptb0xRSnVQQzNueXJrWWxkekFOQmdrcWhraUc5dzBCQVFVRkFEQnMKTVFzd0NRWURWUVFHRXdKVlV6RVZNQk1HQTFVRUNoTU1SR2xuYVVObGNuUWdTVzVqTVJrd0Z3WURWUVFMRXhCMwpkM2N1WkdsbmFXTmxjblF1WTI5dE1Tc3dLUVlEVlFRREV5SkVhV2RwUTJWeWRDQklhV2RvSUVGemMzVnlZVzVqClpTQkZWaUJTYjI5MElFTkJNQjRYRFRBMk1URXhNREF3TURBd01Gb1hEVE14TVRFeE1EQXdNREF3TUZvd2JERUwKTUFrR0ExVUVCaE1DVlZNeEZUQVRCZ05WQkFvVERFUnBaMmxEWlhKMElFbHVZekVaTUJjR0ExVUVDeE1RZDNkMwpMbVJwWjJsalpYSjBMbU52YlRFck1Da0dBMVVFQXhNaVJHbG5hVU5sY25RZ1NHbG5hQ0JCYzNOMWNtRnVZMlVnClJWWWdVbTl2ZENCRFFUQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQU1iTTVYUG0KKzlTNzVTMHRNcWJmNVlFL3ljMGxTYlp4S3NQVmxEUm5vZ29jc0Y5cHBrQ3h4TGV5ajlDWXBLbEJXVHJUM0pUVwpQTnQwT0tSS3pFMGxndmRLcFZNU09PN3pTVzF4a1g1anRxdW1YOE9raFBoUFlsRysrTVhzMnppUzR3YmxDSkVNCnhDaEJWZnZMV29rVmZuSG9OYjlOY2drOXZqbzRVRnQzTVJ1TnM4Y2tSWnFuckcwQUZGb0V0N29UNjFFS21FRkIKSWs1bFlZZUJRVkNtZVZ5SjNobEtWOVV1NWwwY1V5eCttTTBhQmhha2FIUFFOQVFUWEtGeDAxcDhWZHRlWk9FMwpoekJXQk9VUnRDbUFFdkY1T1lpaUFoRjhKMmEzaUxkNDhzb0txRGlyQ21UQ3YyWmRsWVRCb1NVZWgxMGFVQXNnCkVzeEJ1MjRMVVRpNFM4c0NBd0VBQWFOak1HRXdEZ1lEVlIwUEFRSC9CQVFEQWdHR01BOEdBMVVkRXdFQi93UUYKTUFNQkFmOHdIUVlEVlIwT0JCWUVGTEUrdzJrRCtMOUhBZFNZSmhvSUF1OWpaQ3ZETUI4R0ExVWRJd1FZTUJhQQpGTEUrdzJrRCtMOUhBZFNZSmhvSUF1OWpaQ3ZETUEwR0NTcUdTSWIzRFFFQkJRVUFBNElCQVFBY0dnYVgzTmVjCm56eUlaZ1lJVnlIYklVZjRLbWVxdnhneWRrQVFWOEdLODNyWkVXV09OZnFlL0VXMW50bE1NVXU0a2VoRExJNnoKZU03YjQxTjVjZGJsSVpRQjJsV0htaVJrOW9wbXpONmNOODJvTkxGcG15UElubmdpSzNCRDQxVkhNV0VaNzFqRgpoUzlPTVBhZ01SWWp5T2ZpWlJZenk3OGFHNkE5K01wZWl6R0xZQWlKTFF3R1hGSzN4UGtLbU5FVlg1OFN2bncyCll6aTlSS1IvNUNZckNzU1hhUTNwak9MQUVGZTR5SFlTa1ZYeVNHbll2Q29DV3c5RTFDQXgyL1M2Y0NaZGtHQ2UKdkVzWENTKzB5eDVEYU1rSEo4SFNYUGZxSWJsb0VwdzhuTCtlL0lCY20yUE43RWVxSlNkbm9EZnpBSUo5Vk5lcAorT2t1RTZOMzZCOUsKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUNsYXNzIDIgUHJpbWFyeSBDQSBPPUNlcnRwbHVzCiMgU3ViamVjdDogQ049Q2xhc3MgMiBQcmltYXJ5IENBIE89Q2VydHBsdXMKIyBMYWJlbDogIkNlcnRwbHVzIENsYXNzIDIgUHJpbWFyeSBDQSIKIyBTZXJpYWw6IDE3Nzc3MDIwODA0NTkzNDA0MDI0MTQ2ODc2MDQ4ODMyNzU5NTA0MwojIE1ENSBGaW5nZXJwcmludDogODg6MmM6OGM6NTI6Yjg6YTI6M2M6ZjM6Zjc6YmI6MDM6ZWE6YWU6YWM6NDI6MGIKIyBTSEExIEZpbmdlcnByaW50OiA3NDoyMDo3NDo0MTo3Mjo5YzpkZDo5MjplYzo3OTozMTpkODoyMzoxMDo4ZDpjMjo4MTo5MjplMjpiYgojIFNIQTI1NiBGaW5nZXJwcmludDogMGY6OTk6M2M6OGE6ZWY6OTc6YmE6YWY6NTY6ODc6MTQ6MGU6ZDU6OWE6ZDE6ODI6MWI6YjQ6YWY6YWM6ZjA6YWE6OWE6NTg6YjU6ZDU6N2E6MzM6OGE6M2E6ZmI6Y2IKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURrakNDQW5xZ0F3SUJBZ0lSQUlXOVMvUFkydU5wOXBUWFg4T2xSQ013RFFZSktvWklodmNOQVFFRkJRQXcKUFRFTE1Ba0dBMVVFQmhNQ1JsSXhFVEFQQmdOVkJBb1RDRU5sY25Sd2JIVnpNUnN3R1FZRFZRUURFeEpEYkdGegpjeUF5SUZCeWFXMWhjbmtnUTBFd0hoY05PVGt3TnpBM01UY3dOVEF3V2hjTk1Ua3dOekEyTWpNMU9UVTVXakE5Ck1Rc3dDUVlEVlFRR0V3SkdVakVSTUE4R0ExVUVDaE1JUTJWeWRIQnNkWE14R3pBWkJnTlZCQU1URWtOc1lYTnoKSURJZ1VISnBiV0Z5ZVNCRFFUQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQU54UQpsdEFTK0RYU0NIaDZ0bEp3L1cvdXo3a1J5MTEzNGV6cGZnU04xc3h2YzBOWFlLd3pDa1RzQTE4Y2dDU1I1YWlSClZoS0M5K0FyOU51dVlTNkpFSTFyYkxxekFyM1ZOc1ZJTnlQaThGbzNVak1YRXVMUllFMitMMEVSNC9ZWEpReUwKa2NBYm1YdVpWZzJ2N3RLOFIxZmplVWw3TklrbkpJVGVzZXpwV0U3K1R0OWF2a0d0ckFqRkdBN3YwbFB1Yk5DZApFZ0VUamR5QVl2ZVZxVVNJU25GT1lGV2UyeU1aZVZZSEREOWpDMXl3NHI1K0ZmeVVNMWhCT0hURTRZK0wzeWFzCkg3V0xPN2REV1d1d0pLWnRrSXZFY3VwZE01aTN5OTVlZSsrVThScyt5c2tod2NXWUFxcWk5bHQzbS9WK2xsVTAKSEdkcHdQRkM0MGVzL0NnY1psVUNBd0VBQWFPQmpEQ0JpVEFQQmdOVkhSTUVDREFHQVFIL0FnRUtNQXNHQTFVZApEd1FFQXdJQkJqQWRCZ05WSFE0RUZnUVU0M010MzhzT0tBemUzYk9reW5tNGpydm9NSWt3RVFZSllJWklBWWI0ClFnRUJCQVFEQWdFR01EY0dBMVVkSHdRd01DNHdMS0Fxb0NpR0ptaDBkSEE2THk5M2QzY3VZMlZ5ZEhCc2RYTXUKWTI5dEwwTlNUQzlqYkdGemN6SXVZM0pzTUEwR0NTcUdTSWIzRFFFQkJRVUFBNElCQVFDblZNK0lSQm5MMzlSLwpBTjlXTTJLMTkxRUJrT3ZEUDlHSVJPa2tYZS9uRkwwZ3Q1bzhBUDV0bjl1UTNOZjBZdGFMY0YzbjVRUklxV2g4CnlmRkM4MngveFhwOEhWR0l1dElLUGlkZDNpMVJUdE1UWkdua0x1UFQ1NXNKbWFiZ2xadk9HdGQvdmp6T1VyTVIKRmNFUEY4MER1NXdsRmJxaWRvbjhCdkVZMEpOTERueUN0NlgwOWwvKzdVQ21uWVIwT2JuY0hvVVcyaWtiaGlNQQp5YnVKZm02QWlCNHZGTFFESktneWJ3T2FSeXd3dmxiR3AwSUNjQnZxUU5pNkJRTndCNlNXLy8xSU13cmgzS1dCCmtKdE4zWDNuNTdMTlhNaHFsZmlsOW8zRVhYZ0l2bnNHMWtuUEdUWlFJeTRJNXA0RlRVY1kxUmJwc2RhMkVOVzcKbDcraWpyUlUKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPURTVCBSb290IENBIFgzIE89RGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uCiMgU3ViamVjdDogQ049RFNUIFJvb3QgQ0EgWDMgTz1EaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4KIyBMYWJlbDogIkRTVCBSb290IENBIFgzIgojIFNlcmlhbDogOTEyOTk3MzU1NzUzMzk5NTMzMzU5MTkyNjY5NjU4MDM3NzgxNTUKIyBNRDUgRmluZ2VycHJpbnQ6IDQxOjAzOjUyOmRjOjBmOmY3OjUwOjFiOjE2OmYwOjAyOjhlOmJhOjZmOjQ1OmM1CiMgU0hBMSBGaW5nZXJwcmludDogZGE6Yzk6MDI6NGY6NTQ6ZDg6ZjY6ZGY6OTQ6OTM6NWY6YjE6NzM6MjY6Mzg6Y2E6NmE6ZDc6N2M6MTMKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDA2Ojg3OjI2OjAzOjMxOmE3OjI0OjAzOmQ5OjA5OmYxOjA1OmU2OjliOmNmOjBkOjMyOmUxOmJkOjI0OjkzOmZmOmM2OmQ5OjIwOjZkOjExOmJjOmQ2Ojc3OjA3OjM5Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEU2pDQ0FqS2dBd0lCQWdJUVJLK3dnTmFqSjdxSk1EbUdMdmhBYXpBTkJna3Foa2lHOXcwQkFRVUZBREEvCk1TUXdJZ1lEVlFRS0V4dEVhV2RwZEdGc0lGTnBaMjVoZEhWeVpTQlVjblZ6ZENCRGJ5NHhGekFWQmdOVkJBTVQKRGtSVFZDQlNiMjkwSUVOQklGZ3pNQjRYRFRBd01Ea3pNREl4TVRJeE9Wb1hEVEl4TURrek1ERTBNREV4TlZvdwpQekVrTUNJR0ExVUVDaE1iUkdsbmFYUmhiQ0JUYVdkdVlYUjFjbVVnVkhKMWMzUWdRMjh1TVJjd0ZRWURWUVFECkV3NUVVMVFnVW05dmRDQkRRU0JZTXpDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUIKQU4rdjZaZFFDSU5YdE14aVpmYVFndXpIMHl4ck1NcGI3Tm5EZmNkQXdSZ1VpK0RvTTNaSkt1TS9JVW1UckU0TwpyejVJeTJYdS9OTWhEMlhTS3RreWo0emw5M2V3RW51MWxjQ0pvNm02N1hNdWVnd0dNb09pZm9vVU1NMFJvT0VxCk9MbDVDakg5VUwyQVpkKzNVV09EeU9LSVllcExZWUhzVW11NW91SkxHaWlmU0tPZUROb0pqajRYTGg3ZElOOWIKeGlxS3F5NjljSzNGQ3hvbGtIUnl4WHRxcXpUV01Jbi81V2dUZTFRTHlOYXU3RnFja2g0OVpMT014dCsveVVGdwo3Qlp5MVNic09GVTVROUQ4L1JoY1FQR1g2OVdhbTQwZHV0b2x1Y2JZMzhFVkFqcXIybTd4UGk3MVhBaWNQTmFECmFlUVFteGtxdGlsWDQrVTltNS93QWwwQ0F3RUFBYU5DTUVBd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlYKSFE4QkFmOEVCQU1DQVFZd0hRWURWUjBPQkJZRUZNU25zYVI3TEhINjIrRkxrSFgveEJWZ2hZa1FNQTBHQ1NxRwpTSWIzRFFFQkJRVUFBNElCQVFDakdpeWJGd0JjcVI3dUtHWTNPcitEeHo5THd3bWdsU0JkNDlsWlJOSStEVDY5CmlrdWdkQi9PRUlLY2RCb2RmcGdhM2NzVFM3TWdST1NSNmN6OGZhWGJhdVgrNXYzZ1R0MjNBRHExY0Vtdjh1WHIKQXZIUkFvc1p5NVE2WGtqRUdCNVlHVjhlQWxyd0RQR3hyYW5jV1lhTGJ1bVI5WWJLK3JsbU02cFpXODdpcHhaegpSOHNyekptd04walA0MVpMOWM4UERISXloOGJ3Ukx0VGNtMUQ5U1pJbWxKbnQxaXIvbWQyY1hqYkRhSldGQk01CkpER0ZvcWdDV2pCSDRkMVFCN3dDQ1pBQTYyUmpZSnNXdklqSkV1YlNmWkdMK1QweWpXVzA2WHl4VjNicXhiWW8KT2I4VlpSekk5bmVXYWdxTmR3dllrUXNFamdmYktiWUs3cDJDTlRVUQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049U3dpc3NTaWduIEdvbGQgQ0EgLSBHMiBPPVN3aXNzU2lnbiBBRwojIFN1YmplY3Q6IENOPVN3aXNzU2lnbiBHb2xkIENBIC0gRzIgTz1Td2lzc1NpZ24gQUcKIyBMYWJlbDogIlN3aXNzU2lnbiBHb2xkIENBIC0gRzIiCiMgU2VyaWFsOiAxMzQ5MjgxNTU2MTgwNjk5MTI4MAojIE1ENSBGaW5nZXJwcmludDogMjQ6Nzc6ZDk6YTg6OTE6ZDE6M2I6ZmE6ODg6MmQ6YzI6ZmY6Zjg6Y2Q6MzM6OTMKIyBTSEExIEZpbmdlcnByaW50OiBkODpjNTozODo4YTpiNzozMDoxYjoxYjo2ZTpkNDo3YTplNjo0NToyNTozYTo2Zjo5ZjoxYToyNzo2MQojIFNIQTI1NiBGaW5nZXJwcmludDogNjI6ZGQ6MGI6ZTk6Yjk6ZjU6MGE6MTY6M2U6YTA6Zjg6ZTc6NWM6MDU6M2I6MWU6Y2E6NTc6ZWE6NTU6Yzg6Njg6OGY6NjQ6N2M6Njg6ODE6ZjI6Yzg6MzU6N2I6OTUKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZ1akNDQTZLZ0F3SUJBZ0lKQUx0QUhFUDFYayt3TUEwR0NTcUdTSWIzRFFFQkJRVUFNRVV4Q3pBSkJnTlYKQkFZVEFrTklNUlV3RXdZRFZRUUtFd3hUZDJsemMxTnBaMjRnUVVjeEh6QWRCZ05WQkFNVEZsTjNhWE56VTJsbgpiaUJIYjJ4a0lFTkJJQzBnUnpJd0hoY05NRFl4TURJMU1EZ3pNRE0xV2hjTk16WXhNREkxTURnek1ETTFXakJGCk1Rc3dDUVlEVlFRR0V3SkRTREVWTUJNR0ExVUVDaE1NVTNkcGMzTlRhV2R1SUVGSE1SOHdIUVlEVlFRREV4WlQKZDJsemMxTnBaMjRnUjI5c1pDQkRRU0F0SUVjeU1JSUNJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBZzhBTUlJQwpDZ0tDQWdFQXIrVHVmb3NrRGhKdXFWQXRGa1E3a3BKY3lyaGRoSkpDRXlxOFpWZUNRRDVYSk0xUWl5VXF0Mi84Cjc2TFF3QjhDSkVvVGxvOGpFK1lvV0FDalI4Y0dwNFFqSzd1OWxpdC9WY3lMd1ZjZkRtSmxEOTA5Vm9wejJxNSsKYmJxQkhINUNqQ0ExMlVOTmhQcUUyMUlzOHc0bmR3dHJ2eEV2Y25pZkx0Zys1aGczV2lweStkcGlrSktWeWgrYwo2Yk04Szh2ekFSTy9Xcy9CdFFwZ3ZkMjFtV1JUdUtDV3MyL2lKbmVSak9CaUVBS2ZOQStrMVpJelVkNitqYnFFCmVtQThhdHVmSyt6ZTNnRS9iazNsVUliTHRLL3RSRURGeWxxTTJ0SXJmS2p1dnFibENxb09wZDhGVXJkVnh5SmQKTW1xWGwyTVQyOG5iZVRaN2hUcEt4VktKK1NUbm5YZXBndjlWSEtWeGFTdlJBaVR5c3liVWE5b0VWZVhCQ3NkdApNRGVRS3VTZUZETmVGaGRWeFZ1MXl6U0prdkdkSm8raEI5VEdzbmhRMnd3TUMzd0xqRUhYdWVuZGpJajNvMDJ5Ck1zellGOXJOdDg1bW5kVDlYdis5bHo0cGRlZCtwMkpZcnlVMHBVSEhQYndOVU1vREF3OElXaCtWYzNoaXY2OXkKRkdrT3BlVUREbmlPSmloQzhBY0xZaUFRWnpsRytxa0R6QVE0ZW1idklJTzFqRXBXanBFQS9JNWNndDZJb01QaQphRzU5amU4ODNXWDBYYXhSN3lTQXJxcFdsMi81clgzYVlUK1lkenlsa2JZY2pDYmFaYUlKYmNIaVZPTzV5a3hNCmdJOTNlMkNhSHQrMjhrZ2VEcnBPVkcyWTRPR2lHcUozVU0vRVk1THNSeG1kNitacnpzRUNBd0VBQWFPQnJEQ0IKcVRBT0JnTlZIUThCQWY4RUJBTUNBUVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVV3lWNwpscVJsVVg2NE9mUEFlR1plNkRybjhPNHdId1lEVlIwakJCZ3dGb0FVV3lWN2xxUmxVWDY0T2ZQQWVHWmU2RHJuCjhPNHdSZ1lEVlIwZ0JEOHdQVEE3QmdsZ2hYUUJXUUVDQVFFd0xqQXNCZ2dyQmdFRkJRY0NBUllnYUhSMGNEb3YKTDNKbGNHOXphWFJ2Y25rdWMzZHBjM056YVdkdUxtTnZiUzh3RFFZSktvWklodmNOQVFFRkJRQURnZ0lCQUNlNgo0NVI4OGE3QTNoZm01ZGpWOVZTd2cvUzd6VjRGZTArZmRXYXZQT2hXZnZ4eWVEZ0QyU3RpR3dDNStPbGd6Y3pPClVZckhVREZ1NFVwK0dDOXBXYlk5WklFcjQ0T0U1aUtIam4zZzdnS1pZYmdlOUxncmlCSVdoTUl4a3ppV01hYTUKTzFNL3d5U1RWbHRwa3V6RndiczRBT1BzRjZtNDNNZDhBWU9mTWtlNlVpSTBIVEo2Q1ZhbmZDVTJxVDFMMnNDQwpid3E3RXNpSFN5Y1IrUjR0eDVNL250dGZKbXRTMlM2SzhSVEdSSTBWcWJlL3ZkNm1HdTZ1TGZ0SWR4Zit1K3l2CkdQVXFVZkE1aEplVmJHNGJ3eXZFZEdCNUpiQUtKOS9mWHRJNXowVjlRa3Zmc3l3ZXhjWmR5bFU2b0p4cG1vL2EKNzdLd1BKK0hiQklyWlhBVlVqRWFKTTl2TVNOUUg0eFBqeVBEZEVGakhGV29GTjArNEZGUXovRWJNRllPa3JDQwpoZGlEeXlKa3ZDMjRKZFZVb3JnRzZxMlNwQ1Nnd1lhMVNoTnFSODh1QzFhVlZNdk9tdHRxdEtheTIwRUloaWQzCjkycWdRbXdMT003WGRWQXlrc0xmS3pBaVNORFZRVGdsWGFUcFhaL0dsSFhRUmYwd2wwT1BrS3NLeDRaellFcHAKTGQ2bGVOY0cybXFlU3o1M09pQVRJZ0hRdjJpZVkyQnJOVTBMYmJxaFBjQ1Q0SDhqczFXdGNpVk9Sdm5TRnUrdwpaTUVCbnVuS29HcVlEcy9ZWVBJdlNiamtRdUU0TlJiMHlHNVA5NEZXNkxxanZpT3ZydjF2QStBQ096QjIraHR0ClFjOEJzZW00eVdiMDJ5YnpPcVIwOGtra1c4bXcwRmZCK2o1NjRaZkoKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVN3aXNzU2lnbiBTaWx2ZXIgQ0EgLSBHMiBPPVN3aXNzU2lnbiBBRwojIFN1YmplY3Q6IENOPVN3aXNzU2lnbiBTaWx2ZXIgQ0EgLSBHMiBPPVN3aXNzU2lnbiBBRwojIExhYmVsOiAiU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyIgojIFNlcmlhbDogNTcwMDM4MzA1MzExNzU5OTU2MwojIE1ENSBGaW5nZXJwcmludDogZTA6MDY6YTE6Yzk6N2Q6Y2Y6Yzk6ZmM6MGQ6YzA6NTY6NzU6OTY6ZDg6NjI6MTMKIyBTSEExIEZpbmdlcnByaW50OiA5YjphYTplNTo5Zjo1NjplZToyMTpjYjo0Mzo1YTpiZToyNTo5MzpkZjphNzpmMDo0MDpkMToxZDpjYgojIFNIQTI1NiBGaW5nZXJwcmludDogYmU6NmM6NGQ6YTI6YmI6Yjk6YmE6NTk6YjY6ZjM6OTM6OTc6Njg6Mzc6NDI6NDY6YzM6YzA6MDU6OTk6M2Y6YTk6OGY6MDI6MGQ6MWQ6ZWQ6YmU6ZDQ6OGE6ODE6ZDUKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZ2VENDQTZXZ0F3SUJBZ0lJVHh2VUwxUzdMMHN3RFFZSktvWklodmNOQVFFRkJRQXdSekVMTUFrR0ExVUUKQmhNQ1EwZ3hGVEFUQmdOVkJBb1RERk4zYVhOelUybG5iaUJCUnpFaE1COEdBMVVFQXhNWVUzZHBjM05UYVdkdQpJRk5wYkhabGNpQkRRU0F0SUVjeU1CNFhEVEEyTVRBeU5UQTRNekkwTmxvWERUTTJNVEF5TlRBNE16STBObG93ClJ6RUxNQWtHQTFVRUJoTUNRMGd4RlRBVEJnTlZCQW9UREZOM2FYTnpVMmxuYmlCQlJ6RWhNQjhHQTFVRUF4TVkKVTNkcGMzTlRhV2R1SUZOcGJIWmxjaUJEUVNBdElFY3lNSUlDSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQWc4QQpNSUlDQ2dLQ0FnRUF4UEdIZjlONE1mYzR5ZmpEbVVPOHgvZThOK2RPY2JwTGo2VnpIVnh1bUs0RFY2NDROME12CkZ6MGZ5TTVvRU1GNHJoa0RLeEQ2TEhtRDl1aTVhTGxWOGdSRXB6bjUvQVNMSHZHaVRTZjVZWHU2dCtXaUU3YnIKWVQ3UWJOSG0rL3BlN1IyMG5xQTFXNkdTeS9CSmt2NkZDZ1UrNXRrTDRrKzczSlUzL0pIcE1qVWkwUjg2VGllRgpuYkFWbERMYVlRMUhUV0JDcnBKSDZJTmFVRmpwaW91NVhhSGMzWmxLSHpabnUwamtnN1kzNjBnNnJ3OW5qeGNICjZBVEs3Mm94aDlUQXR2bVVjWHRuWkxpMmtVcENlMlV1TUdvTTlaRHVsZWJ5ellMczJhRks3UGF5UytWRmhlWnQKZUpNRUxweUNiVGFweERGa0g0YURDeXIwTlFwNHlWWFBRYkJINlRDZm1iNWhxQWFFdVNoNlh6alpHNms0c0lOLwpjOEhETzBncWdnOGhtN2pNcURYRGhCdURzejYrcEpWcEFUcUpBSGdFMmNuMG1SbXJWbjViaTRZNUZaR2tFQ3dKCk1vQmdzNVBBS3JZWUM1MStqVW55RUVwLytkVkdMeG1TbzVtbkpxeTdqRHptRHJ4SEI5eHpVZkZ3WkM4SStiUkgKSFRCc1JPb3BONFdTYUdhOGd6aitlemt1MDFEd0gvdGVZTGFwcHZvblFmR2JHSEx5OVlSMFNzbG54RlN1U0dUZgpqTkZ1c0IzaEI0OElIcG1jY2VsTTJLWDNSeElmZE5GUm5vYnp3cUlqUUF0ejIwdW01M01Hak1HZzZjRlpyRWI2CjVpLzR6M0djUm0yNXhCV05PSGtEUlVqdnhGM1hDTzZIT1NLR3NnMFBXRVAzY2FsSUx2M3ExaDhDQXdFQUFhT0IKckRDQnFUQU9CZ05WSFE4QkFmOEVCQU1DQVFZd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVQpGNkROd2VSQnRqcGJPOHRGbmIwY3dwajZobGd3SHdZRFZSMGpCQmd3Rm9BVUY2RE53ZVJCdGpwYk84dEZuYjBjCndwajZobGd3UmdZRFZSMGdCRDh3UFRBN0JnbGdoWFFCV1FFREFRRXdMakFzQmdnckJnRUZCUWNDQVJZZ2FIUjAKY0RvdkwzSmxjRzl6YVhSdmNua3VjM2RwYzNOemFXZHVMbU52YlM4d0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dJQgpBSFBHZ2VBbjBpMFA0SlV3NHBwQmYxQXNYMTlpWWFtR2Fta1lESFJKMWwyRTZrRlNHRzlZclZCV0lHckd2U2hwCldKSGNrUkUxcVRvZHZCcWxZSjdZSDM5RmtXblpmcnQ0Y3NFR0R5ck9qNFZ3WWF5Z3pRdTRPU2xXaERKT2hyczkKeENyWjF4OXk3djVSb1NKQnNYRUNZeHFDc0dLclhsY1NIOS9MM1hXZ3dGMTVrSXdiNEZEbTNqSCttSHR3WDZXUQoySzM0QXJadjAyRGRRRXNpeFQydE9ucWZHaHBIa1hrenVvTGNNbWtEbG00ZlMvQngvdU5uY3FDeHYxeUw1UHFaCklzZUV1UnVOSTVjLzdTWGd6Mlc3OVdFRTc5MGVzbHBCSWxxaG4xMHM2RnZKYmFrTURIaXFZTVpXandGYURHaTgKYVJsNXhCOStsd1cveGVra1VWN1UxVXRUN2RraldqWURaYVBCQTYxQk1QTkdHNFdRcjJXMTFiSGtGbHQ0ZFIyWAplbTFacVNxUGU5N0RoNGtRbVVsemVNZzl2VkUxZENyVjhYNXBHeXE3TzcwbHVKcGFQWEpoa0dhSDdneldUZFFSCmRBdHEvZ3NEL0tOVlY0bitTc3V1V3hjRnlQS05JekZUT05JdGFqK0N1WTBJYXZkZVFYUnV3eEYrQjZ3cFlKRS8KT01wWEVBMjlNQy9IcGVaQm9OcXVCWWVhb0tSbGJFd0pESW02dU5PNXdKT0tNUHFONVpwckZRRk9aNnJhWWxZKwpoQWhtMHNRMmZhYytFUHlJNE5TQTVRQzlxdk5PQnFONmF2bGljdU1KVCt1YkRnRWo4Wis3Zk56Y2JCR1hKYkx5CnRHTVUwZ1lxWjR5RDljN3FCOWlhYWg3czVBcTdLa3pyQ1dBNXpzcGkyQzV1Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1HZW9UcnVzdCBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89R2VvVHJ1c3QgSW5jLgojIFN1YmplY3Q6IENOPUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1HZW9UcnVzdCBJbmMuCiMgTGFiZWw6ICJHZW9UcnVzdCBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IgojIFNlcmlhbDogMzI3OTgyMjY1NTEyNTY5NjMzMjQzMTM4MDY0MzY5ODE5ODIzNjkKIyBNRDUgRmluZ2VycHJpbnQ6IDAyOjI2OmMzOjAxOjVlOjA4OjMwOjM3OjQzOmE5OmQwOjdkOmNmOjM3OmU2OmJmCiMgU0hBMSBGaW5nZXJwcmludDogMzI6M2M6MTE6OGU6MWI6Zjc6Yjg6YjY6NTI6NTQ6ZTI6ZTI6MTA6MGQ6ZDY6MDI6OTA6Mzc6ZjA6OTYKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDM3OmQ1OjEwOjA2OmM1OjEyOmVhOmFiOjYyOjY0OjIxOmYxOmVjOjhjOjkyOjAxOjNmOmM1OmY4OjJhOmU5OjhlOmU1OjMzOmViOjQ2OjE5OmI4OmRlOmI0OmQwOjZjCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEZkRDQ0FtU2dBd0lCQWdJUUdLeTFhdjFwdGhVNlkyeXYydnJFb1RBTkJna3Foa2lHOXcwQkFRVUZBREJZCk1Rc3dDUVlEVlFRR0V3SlZVekVXTUJRR0ExVUVDaE1OUjJWdlZISjFjM1FnU1c1akxqRXhNQzhHQTFVRUF4TW8KUjJWdlZISjFjM1FnVUhKcGJXRnllU0JEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVUQWVGdzB3TmpFeApNamN3TURBd01EQmFGdzB6TmpBM01UWXlNelU1TlRsYU1GZ3hDekFKQmdOVkJBWVRBbFZUTVJZd0ZBWURWUVFLCkV3MUhaVzlVY25WemRDQkpibU11TVRFd0x3WURWUVFERXloSFpXOVVjblZ6ZENCUWNtbHRZWEo1SUVObGNuUnAKWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQwpBUUVBdnJnVmUvL1VmSDFucllOa2U4aENVeTNmOW9RSUlHSFdBVmxxbkVRUnIrOTIvWlYrem1Fd3UzcURYd0s5CkFXYks3aFdOYjZFd25MMmhoWjZVT3ZOV2lBQXh6OWp1YXBZQzJlMERqUHQxYmVmcXVGVVdCUmFhOU9CZXNZakEKWklWY0ZVMkl4N2U2NEhYcHJRVTluY2VKU09DN0tNZ0Q0VENUWkY1U3dGbHdJalZYaUlyeGxRcUQxN3d4Y3dFMAo3ZTlHY2VCckFxZzFjbXVYbTJiZ3l4eDVYOWdhQkdnZVJ3TG1uV0RpTnBjQjM4NDFrdCsrWjhkdGQxazdqNTNXCmtCV1V2RUkwRU1FNStiRW5QbjdXaW5YRnNxK1cwNkxlbStTWXZuM2g2WUd0dG0vODF3N2E0RFN3RFJwMzUrTUkKbU85WStweUV0emF2d3QrczB2UVFCbkJ4TlFJREFRQUJvMEl3UURBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUE0RwpBMVVkRHdFQi93UUVBd0lCQmpBZEJnTlZIUTRFRmdRVUxOVlFRWmNWaS9DUE5tRmJTdnRyMlpuSk01SXdEUVlKCktvWklodmNOQVFFRkJRQURnZ0VCQUZwd2Z5emR0elJQOVlaUnFTYStTN2lxOFhFTjNHSEhvT28wSG5wM0R3UTEKNkNlUGJKQy9rUllrUmo1S1RzNHJGdFVMVWgzOEgyZWlBa1V4VDg3eitnT25lWjFUYXRuYVl6cjRnTmZUbWVHbAo0YjdVVlhHWU5UcStrK3F1clVLeWtHL2cvQ0ZOTldNemlVbldtMDdLeCtkT0NRRDMyc2Z2bVdLWmQ3YVZJbDZLCm9LdjB1SGlZeWpnWm1jbHlubmpOUzZ5dkdhQnpFaTM4d2tHNmdaSGFGbG94dC9tMGNZQVNTSmx5YzFwWlU4RmoKVWpQdHA4blNPUUp3K3VDeFFtWXBxcHRSN1RCVUloUmYyYXNkd2VTVThQajFLL2ZxeW5oRzFyaVIvYVlOS3hvVQpBVDZBOEVLZ2xRZGViYzNNUzZSRmphc1M2TFBlV3VXZ2ZPZ1BJaDFhNlZrPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049dGhhd3RlIFByaW1hcnkgUm9vdCBDQSBPPXRoYXd0ZSwgSW5jLiBPVT1DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uLyhjKSAyMDA2IHRoYXd0ZSwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgU3ViamVjdDogQ049dGhhd3RlIFByaW1hcnkgUm9vdCBDQSBPPXRoYXd0ZSwgSW5jLiBPVT1DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uLyhjKSAyMDA2IHRoYXd0ZSwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgTGFiZWw6ICJ0aGF3dGUgUHJpbWFyeSBSb290IENBIgojIFNlcmlhbDogNjk1MjkxODE5OTIwMzkyMDM1NjYyOTg5NTM3ODc3MTI5NDA5MDkKIyBNRDUgRmluZ2VycHJpbnQ6IDhjOmNhOmRjOjBiOjIyOmNlOmY1OmJlOjcyOmFjOjQxOjFhOjExOmE4OmQ4OjEyCiMgU0hBMSBGaW5nZXJwcmludDogOTE6YzY6ZDY6ZWU6M2U6OGE6Yzg6NjM6ODQ6ZTU6NDg6YzI6OTk6Mjk6NWM6NzU6NmM6ODE6N2I6ODEKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDhkOjcyOjJmOjgxOmE5OmMxOjEzOmMwOjc5OjFkOmYxOjM2OmEyOjk2OjZkOmIyOjZjOjk1OjBhOjk3OjFkOmI0OjZiOjQxOjk5OmY0OmVhOjU0OmI3OjhiOmZiOjlmCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFSURDQ0F3aWdBd0lCQWdJUU5FN1ZWeURWN2V4SjlDL09OOXNyYlRBTkJna3Foa2lHOXcwQkFRVUZBRENCCnFURUxNQWtHQTFVRUJoTUNWVk14RlRBVEJnTlZCQW9UREhSb1lYZDBaU3dnU1c1akxqRW9NQ1lHQTFVRUN4TWYKUTJWeWRHbG1hV05oZEdsdmJpQlRaWEoyYVdObGN5QkVhWFpwYzJsdmJqRTRNRFlHQTFVRUN4TXZLR01wSURJdwpNRFlnZEdoaGQzUmxMQ0JKYm1NdUlDMGdSbTl5SUdGMWRHaHZjbWw2WldRZ2RYTmxJRzl1YkhreEh6QWRCZ05WCkJBTVRGblJvWVhkMFpTQlFjbWx0WVhKNUlGSnZiM1FnUTBFd0hoY05NRFl4TVRFM01EQXdNREF3V2hjTk16WXcKTnpFMk1qTTFPVFU1V2pDQnFURUxNQWtHQTFVRUJoTUNWVk14RlRBVEJnTlZCQW9UREhSb1lYZDBaU3dnU1c1agpMakVvTUNZR0ExVUVDeE1mUTJWeWRHbG1hV05oZEdsdmJpQlRaWEoyYVdObGN5QkVhWFpwYzJsdmJqRTRNRFlHCkExVUVDeE12S0dNcElESXdNRFlnZEdoaGQzUmxMQ0JKYm1NdUlDMGdSbTl5SUdGMWRHaHZjbWw2WldRZ2RYTmwKSUc5dWJIa3hIekFkQmdOVkJBTVRGblJvWVhkMFpTQlFjbWx0WVhKNUlGSnZiM1FnUTBFd2dnRWlNQTBHQ1NxRwpTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDc29QRDdnRm5Vbk1la3o1MmhXWE1KRUVVTURTeHVhUEZzClcwaG9TVmszL0FzekdjSjNmOHdRTFpVMEhPYnJUUW1uSE5LNHlaYzJBcmVKMUNSZkJzRE1SSlNValFKaWIrdGEKM1JHTktKcGNoSkFRZWcyOWRHWXZhamlnNHRWVVJPc2RCNThIdW0vdTZmMU9DeW4xUG9TZ0FmR2NxL2djZm9tawo2S0hZY1dVTm8xRjc3cnpTSW1BTnVWdWQzN3I4VVZzTHI1aXk2UzdwQk9oaWg5NHJ5TmRPd1V4a0h0M1BoMWk2ClNrL0thQWNkSEoxS3h0VXZrY3g4Y1hJY3hjQm42ekw5eVpKY2xOcUZ3SnUvVTMwckNmU01uWkVmbDJwU3k5NEoKTnFSMzJIdUhVRVRWUG00cGFmczVTU1llQ2FXQWUwQXQ2K2duaGNuK1lmMSs1bnlYSGRXZEFnTUJBQUdqUWpCQQpNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEZ1lEVlIwUEFRSC9CQVFEQWdFR01CMEdBMVVkRGdRV0JCUjdXMFhQCnI4N0xldjB4a2hwcXR2Tkc2MWRJVURBTkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQWVSSEFTN09SdHZ6dzZXZlUKRFc1RnZsWG9rOUxPQXovdDJpV3dIVmZMSGpwMm9FenNVSGJvWkhJTXBLbnh1SXZXMW9lRXV6TGxRUkhBZDltegpZSjNyRzlYUmJrUkVxYVlCN0ZWaUhYZTRYSTVJU1h5Y08xY1JySzF6TjQ0dmVGeVFhRWZaWUdEbS9BYzlJaUFYCnhQY1c2Y1RZY3ZuSWMzemZGaThWcVQ3OWFpZTJvZXRhdXBnZjFlTk5aQXFkRThoaHV2VTVISWU2dUwxN0luLzIKL3F4QWVlV3NFRzg5anh0NWRvdkVON01oR0lUbE5nRHJZeUNadWVuK013UzdRY2pCQXZsRVl5Q2VnYzVDMDlZLwpMSGJUWTV4WjNZK200UTZnTGtIM0xwVkh6N3o5TS9QMkMyRitmcEVyZ1VmQ0p6RHVweEJkTjQ5Y09TdmtCUEI3CmpWYU1hQT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1WZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUgTz1WZXJpU2lnbiwgSW5jLiBPVT1WZXJpU2lnbiBUcnVzdCBOZXR3b3JrLyhjKSAyMDA2IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBTdWJqZWN0OiBDTj1WZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUgTz1WZXJpU2lnbiwgSW5jLiBPVT1WZXJpU2lnbiBUcnVzdCBOZXR3b3JrLyhjKSAyMDA2IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBMYWJlbDogIlZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHNSIKIyBTZXJpYWw6IDMzMDM3NjQ0MTY3NTY4MDU4OTcwMTY0NzE5NDc1Njc2MTAxNDUwCiMgTUQ1IEZpbmdlcnByaW50OiBjYjoxNzplNDozMTo2NzozZTplMjowOTpmZTo0NTo1Nzo5MzpmMzowYTpmYToxYwojIFNIQTEgRmluZ2VycHJpbnQ6IDRlOmI2OmQ1Ojc4OjQ5OjliOjFjOmNmOjVmOjU4OjFlOmFkOjU2OmJlOjNkOjliOjY3OjQ0OmE1OmU1CiMgU0hBMjU2IEZpbmdlcnByaW50OiA5YTpjZjphYjo3ZTo0MzpjODpkODo4MDpkMDo2YjoyNjoyYTo5NDpkZTplZTplNDpiNDo2NTo5OTo4OTpjMzpkMDpjYTpmMTo5YjphZjo2NDowNTplNDoxYTpiNzpkZgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRTB6Q0NBN3VnQXdJQkFnSVFHTnJSbmlaOTZMdEtJVmpOekdzN1NqQU5CZ2txaGtpRzl3MEJBUVVGQURDQgp5akVMTUFrR0ExVUVCaE1DVlZNeEZ6QVZCZ05WQkFvVERsWmxjbWxUYVdkdUxDQkpibU11TVI4d0hRWURWUVFMCkV4WldaWEpwVTJsbmJpQlVjblZ6ZENCT1pYUjNiM0pyTVRvd09BWURWUVFMRXpFb1l5a2dNakF3TmlCV1pYSnAKVTJsbmJpd2dTVzVqTGlBdElFWnZjaUJoZFhSb2IzSnBlbVZrSUhWelpTQnZibXg1TVVVd1F3WURWUVFERXp4VwpaWEpwVTJsbmJpQkRiR0Z6Y3lBeklGQjFZbXhwWXlCUWNtbHRZWEo1SUVObGNuUnBabWxqWVhScGIyNGdRWFYwCmFHOXlhWFI1SUMwZ1J6VXdIaGNOTURZeE1UQTRNREF3TURBd1doY05Nell3TnpFMk1qTTFPVFU1V2pDQnlqRUwKTUFrR0ExVUVCaE1DVlZNeEZ6QVZCZ05WQkFvVERsWmxjbWxUYVdkdUxDQkpibU11TVI4d0hRWURWUVFMRXhaVwpaWEpwVTJsbmJpQlVjblZ6ZENCT1pYUjNiM0pyTVRvd09BWURWUVFMRXpFb1l5a2dNakF3TmlCV1pYSnBVMmxuCmJpd2dTVzVqTGlBdElFWnZjaUJoZFhSb2IzSnBlbVZrSUhWelpTQnZibXg1TVVVd1F3WURWUVFERXp4V1pYSnAKVTJsbmJpQkRiR0Z6Y3lBeklGQjFZbXhwWXlCUWNtbHRZWEo1SUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eQphWFI1SUMwZ1J6VXdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDdkpBZ0lLWG8xCm5tQU1xdWRMTzA3Y2ZMdzhSUnk3SytEK0tRTDVWd2lqWklVVkovWHhyY2d4aVYwaTZDcXFwa0t6ai9pNVZiZXgKdDB1ei9vOStCMWZzNzBQYlptSVZZYzlnRGFUWTN2amd3MklJUFZRVDYwbktXVlNGSnVVcmp4dWY2L1doa2NJegpTZGhEWTJwU1M5S1A2SEJSVGRHSmFYdkhjUGF6M0JKMDIzdGRTMWJUbHI4VmQ2R3c5S0lsOHE4Y2ttY1k1ZlFHCkJPK1F1ZVFBNU4wNnRSbi9BcnIwUE83Z2krczNpK3owMTZ6eTl2QTlyOTExa1RNWkhSeEF5M1FrR1NHVDJSVCsKckNwU3g0L1ZCRW5raldOSGlEeHBnOHYrUjcwcmZrL0ZsYTRPbmRUUlE4Qm5jK01VQ0g3bFA1OXp1RE1LejEwLwpOSWVXaXU1VDZDVVZBZ01CQUFHamdiSXdnYTh3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVkhROEJBZjhFCkJBTUNBUVl3YlFZSUt3WUJCUVVIQVF3RVlUQmZvVjJnV3pCWk1GY3dWUllKYVcxaFoyVXZaMmxtTUNFd0h6QUgKQmdVckRnTUNHZ1FVaitYVEdvYXNqWTVydzgrQWF0UklHQ3g3R1M0d0pSWWphSFIwY0RvdkwyeHZaMjh1ZG1WeQphWE5wWjI0dVkyOXRMM1p6Ykc5bmJ5NW5hV1l3SFFZRFZSME9CQllFRkgvVFphZkMzZXk3OERBSjgwTTUrZ0t2Ck16RXpNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUJBUUNUSkVvd1gyTFAyQnFZTHozcTNKa3R2WGYycFhraU9PekUKcDZCNEVxMWlEa1Z3Wk1YbmwyWXRtQWwrWDYvV3pDaGw4Z0dxQ0JwSDN2bjVmSkphQ0drZ0RkaytiVzQ4RFc3WQo1Z2FSUUJpNStNSHQzOXRCcXVDV0lNbk5aQlU0Z2NtVTdxS0VLUXNUYjQ3YkROMGxBdHVraXhsRTBrRjZCV2xLCldFOWd5bjZDYWdzQ3FpVVhPYlhiZitlRVpTcVZpcjJHM2w2QkZvTXRFTXplL2FpQ0ttMG9IdzBMeE9YbkdpWVoKNGZRUmJ4QzFsZnpuUWdVeTI4NmRVVjRvdHA2RjAxdnZwWDFGUUhLT3R3NXJEZ2I3TXpWSWNiaWRKNHZFWlY4TgpobmFjUkhyMmxWejJYVElJTTZSVXRoZy9hRnp5UWtxRk9GU0RYOUhvTFBLc0VkYW83V05xCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1TZWN1cmVUcnVzdCBDQSBPPVNlY3VyZVRydXN0IENvcnBvcmF0aW9uCiMgU3ViamVjdDogQ049U2VjdXJlVHJ1c3QgQ0EgTz1TZWN1cmVUcnVzdCBDb3Jwb3JhdGlvbgojIExhYmVsOiAiU2VjdXJlVHJ1c3QgQ0EiCiMgU2VyaWFsOiAxNzE5OTc3NDU4OTEyNTI3Nzc4ODM2Mjc1NzAxNDI2Njg2MjAzMgojIE1ENSBGaW5nZXJwcmludDogZGM6MzI6YzM6YTc6NmQ6MjU6NTc6Yzc6Njg6MDk6OWQ6ZWE6MmQ6YTk6YTI6ZDEKIyBTSEExIEZpbmdlcnByaW50OiA4Nzo4MjpjNjpjMzowNDozNTozYjpjZjpkMjo5Njo5MjpkMjo1OTozZTo3ZDo0NDpkOTozNDpmZjoxMQojIFNIQTI1NiBGaW5nZXJwcmludDogZjE6YzE6YjU6MGE6ZTU6YTI6MGQ6ZDg6MDM6MGU6Yzk6ZjY6YmM6MjQ6ODI6M2Q6ZDM6Njc6YjU6MjU6NTc6NTk6YjQ6ZTc6MWI6NjE6ZmM6ZTk6Zjc6Mzc6NWQ6NzMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR1RENDQXFDZ0F3SUJBZ0lRRFBDT1hBZ1dwYTFDZi9Eckp4aFowREFOQmdrcWhraUc5dzBCQVFVRkFEQkkKTVFzd0NRWURWUVFHRXdKVlV6RWdNQjRHQTFVRUNoTVhVMlZqZFhKbFZISjFjM1FnUTI5eWNHOXlZWFJwYjI0eApGekFWQmdOVkJBTVREbE5sWTNWeVpWUnlkWE4wSUVOQk1CNFhEVEEyTVRFd056RTVNekV4T0ZvWERUSTVNVEl6Ck1URTVOREExTlZvd1NERUxNQWtHQTFVRUJoTUNWVk14SURBZUJnTlZCQW9URjFObFkzVnlaVlJ5ZFhOMElFTnYKY25CdmNtRjBhVzl1TVJjd0ZRWURWUVFERXc1VFpXTjFjbVZVY25WemRDQkRRVENDQVNJd0RRWUpLb1pJaHZjTgpBUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBS3VrZ2VXVnpmWDJGSTdDVDhyVTRuaVZXSnhCNFEyWlFDUVhPWkV6Clp1bSs0WU92WWx5SjBmd2tXMkd6NEJFUlFSd2RidkM0dS9qZXA0RzZwa2pHbngyOXZvNnBRVDY0bE8wcEd0U08KMGdNZEErOXREV2NjVjljR3Jjckk5ZjRPcjJZbFNBU1dDMTJqdWhiRENFL1JSdmdVWFBMSVhnR1piZjJJeklhbwp3Vzh4UW14U1Btakw4eGswMzd1SEdGYUFKc1RRM01CdjM5Nmd3cEVXb0dRUlMwUzhIdmJuK21QZVpxeDJwSEdqCjdEYVVhSHAzcExIbkRpK0JldUsxY29idm9tdUw4QS9iMDFrL3VuSzhSQ1NjNDNPejk2OVhMMEltbmFsMHVnQlMKOGt2TlUzeEhDemFGRG1hcENKY1dORmZCWnZlQTQrMXdWTWVUNEM0b0ZWbUh1cnNDQXdFQUFhT0JuVENCbWpBVApCZ2tyQmdFRUFZSTNGQUlFQmg0RUFFTUFRVEFMQmdOVkhROEVCQU1DQVlZd0R3WURWUjBUQVFIL0JBVXdBd0VCCi96QWRCZ05WSFE0RUZnUVVRaksyRnZvRS9mNWRTM3JEL2ZkTVFCMWFRNjh3TkFZRFZSMGZCQzB3S3pBcG9DZWcKSllZamFIUjBjRG92TDJOeWJDNXpaV04xY21WMGNuVnpkQzVqYjIwdlUxUkRRUzVqY213d0VBWUpLd1lCQkFHQwpOeFVCQkFNQ0FRQXdEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUJBRER0VDByaFdEcFNjbHUxcHFObEdLYTdVVHQzCjZaM3EwNTljNEVWbGV3M0tXK0p3VUxLVUJSU3VTY2VOUVFjU2M1UitEQ01oL2J3UWYyQVFXbkwxbUE2czdMbC8KM1hwdlhkTWM5UCtJQldsQ3FRVnh5TGVzSnVndXRJeHEvM0hjdUxIZm1ieDhJVlFyNUZpaXUxY3BycDZwb3hrbQpENWt1Q0xEdi9XblBtUm9KamVPbm55dkpOalI3SkxONFRKVVhwQVltSHJaa1VqWmZZR2Zabk1VRmRBdm5aeVBTCkNQeUk2YTZMZitFdzlEZCsvY1l5MmkyZVJEQXdiTzRIM3RJMC9OTC9RUFpMOUdaR0JsU204aklLWXlZd2E1dlIKM0l0SHV1RzUxV0xRb3FEMFp3VjRLV01hYndUVytNWk1vNXF4TjdTTjVTaExIWjRzd3Job3ZPMEM3akU9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1TZWN1cmUgR2xvYmFsIENBIE89U2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24KIyBTdWJqZWN0OiBDTj1TZWN1cmUgR2xvYmFsIENBIE89U2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24KIyBMYWJlbDogIlNlY3VyZSBHbG9iYWwgQ0EiCiMgU2VyaWFsOiA5NzUxODM2MTY3NzMxMDUxNTU0MjMyMTE5NDgxNDU2OTc4NTk3CiMgTUQ1IEZpbmdlcnByaW50OiBjZjpmNDoyNzowZDpkNDplZDpkYzo2NToxNjo0OTo2ZDozZDpkYTpiZjo2ZTpkZQojIFNIQTEgRmluZ2VycHJpbnQ6IDNhOjQ0OjczOjVhOmU1OjgxOjkwOjFmOjI0Ojg2OjYxOjQ2OjFlOjNiOjljOmM0OjVmOmY1OjNhOjFiCiMgU0hBMjU2IEZpbmdlcnByaW50OiA0MjowMDpmNTowNDozYTpjODo1OTowZTpiYjo1Mjo3ZDoyMDo5ZTpkMTo1MDozMDoyOTpmYjpjYjpkNDoxYzphMTpiNTowNjplYzoyNzpmMTo1YTpkZTo3ZDphYzo2OQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRHZEQ0NBcVNnQXdJQkFnSVFCMVlpcE9qVWlvbE45QlBJOFBqcXBUQU5CZ2txaGtpRzl3MEJBUVVGQURCSwpNUXN3Q1FZRFZRUUdFd0pWVXpFZ01CNEdBMVVFQ2hNWFUyVmpkWEpsVkhKMWMzUWdRMjl5Y0c5eVlYUnBiMjR4CkdUQVhCZ05WQkFNVEVGTmxZM1Z5WlNCSGJHOWlZV3dnUTBFd0hoY05NRFl4TVRBM01UazBNakk0V2hjTk1qa3gKTWpNeE1UazFNakEyV2pCS01Rc3dDUVlEVlFRR0V3SlZVekVnTUI0R0ExVUVDaE1YVTJWamRYSmxWSEoxYzNRZwpRMjl5Y0c5eVlYUnBiMjR4R1RBWEJnTlZCQU1URUZObFkzVnlaU0JIYkc5aVlXd2dRMEV3Z2dFaU1BMEdDU3FHClNJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUN2TlM3WXJHeFZhUVp4NVJOb0pMTlAyTXdoUi9qeFlEaUoKaVFQcHZlcGVSbE1KM0Z6MVd1ajNSU29DNnpGaDF5a3pUTTdIZkFvM2ZnKzZNcGpoSFpldmo4ZmN5VGlXODlzYQovRkh0YU1iUWJxUjhKTkd1UXNpV1VHTXU0UDUxL3Bpblgwa3VsZU01TTJTT0hxUmZrTkpuUExMWi9rRzVWYWNKCmpuSUZIb3ZkUklXQ1F0Qkp3QjFnOE5FWExKWHI5cVhCa3FQRndxY0lZQTFnQkJDV2VaNFdOT2FwdHZvbFJUbkkKSG1YNWsvV3E4VkxjbVpnOXBZWWFERFV6K2t1bEJBWVZIREdBNzZvWWE4SjcxOXJPK1RNZzFmVzlhak10Z1FUNwpzRnpVbktQaVhCM2pxVUoxWG52VWQrODVWTHJKQ2hnYkVwbEpMNGhML1ZCaTBYUG5qM3BEQWdNQkFBR2pnWjB3Cmdab3dFd1lKS3dZQkJBR0NOeFFDQkFZZUJBQkRBRUV3Q3dZRFZSMFBCQVFEQWdHR01BOEdBMVVkRXdFQi93UUYKTUFNQkFmOHdIUVlEVlIwT0JCWUVGSzlFQk1KQmZraUQyMDQ1QXV6c2hIcm16c21rTURRR0ExVWRId1F0TUNzdwpLYUFub0NXR0kyaDBkSEE2THk5amNtd3VjMlZqZFhKbGRISjFjM1F1WTI5dEwxTkhRMEV1WTNKc01CQUdDU3NHCkFRUUJnamNWQVFRREFnRUFNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUJBUUJqR2doQWZhUmVVdzEzMkhxdUh3MEwKVVJZRDd4aDh5T092YWxpVEZHQ1Jzb1RjaUU2K09ZbzY4K2FDaVYwQk43T3JKS1FWRHBJMVdrcEVYazVYK25YTwpIMGpPWnZROFFDYVNtR3diN2lSR0RCZXpVcVhicFpHUnp6ZlRiK2NuQ0RwT0dSODZwMWhjRjg5NVA0dmtwOU1tCkk1MG1EMWhwL0VkK3N0Q05pNU8vS1U5RGFYUjJaMHZQQjR6bUF2ZTE0YlJEdFVzdEZKLzUzQ1lOdjZaSGRBYlkKaU5FNktUQ0V6dEk1Z0dJYnFNZFhTYnhxVlZGbkZVcStOUWZrMVhXWU4za3dGTnNwbld6RmFjeEhWYUl3OTh4YwpmOExEbUJ4clRoYUE2M3A0WlVXaUFCcXZEQTFWWkRSSXVKSzU4YlJRS2ZKUEl4L2FiS3dmUk9IZEkzaFJXOGNXCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1DT01PRE8gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1DT01PRE8gQ0EgTGltaXRlZAojIFN1YmplY3Q6IENOPUNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPUNPTU9ETyBDQSBMaW1pdGVkCiMgTGFiZWw6ICJDT01PRE8gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkiCiMgU2VyaWFsOiAxMDQzNTA1MTM2NDgyNDkyMzI5NDE5OTg1MDg5ODU4MzQ0NjQ1NzMKIyBNRDUgRmluZ2VycHJpbnQ6IDVjOjQ4OmRjOmY3OjQyOjcyOmVjOjU2Ojk0OjZkOjFjOmNjOjcxOjM1OjgwOjc1CiMgU0hBMSBGaW5nZXJwcmludDogNjY6MzE6YmY6OWU6Zjc6NGY6OWU6YjY6Yzk6ZDU6YTY6MGM6YmE6NmE6YmU6ZDE6Zjc6YmQ6ZWY6N2IKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDBjOjJjOmQ2OjNkOmY3OjgwOjZmOmEzOjk5OmVkOmU4OjA5OjExOjZiOjU3OjViOmY4Ojc5Ojg5OmYwOjY1OjE4OmY5OjgwOjhjOjg2OjA1OjAzOjE3OjhiOmFmOjY2Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFSFRDQ0F3V2dBd0lCQWdJUVRvRXRpb0psNEFzQzdqNDFBa2JsUFRBTkJna3Foa2lHOXcwQkFRVUZBRENCCmdURUxNQWtHQTFVRUJoTUNSMEl4R3pBWkJnTlZCQWdURWtkeVpXRjBaWElnVFdGdVkyaGxjM1JsY2pFUU1BNEcKQTFVRUJ4TUhVMkZzWm05eVpERWFNQmdHQTFVRUNoTVJRMDlOVDBSUElFTkJJRXhwYldsMFpXUXhKekFsQmdOVgpCQU1USGtOUFRVOUVUeUJEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVUQWVGdzB3TmpFeU1ERXdNREF3Ck1EQmFGdzB5T1RFeU16RXlNelU1TlRsYU1JR0JNUXN3Q1FZRFZRUUdFd0pIUWpFYk1Ca0dBMVVFQ0JNU1IzSmwKWVhSbGNpQk5ZVzVqYUdWemRHVnlNUkF3RGdZRFZRUUhFd2RUWVd4bWIzSmtNUm93R0FZRFZRUUtFeEZEVDAxUApSRThnUTBFZ1RHbHRhWFJsWkRFbk1DVUdBMVVFQXhNZVEwOU5UMFJQSUVObGNuUnBabWxqWVhScGIyNGdRWFYwCmFHOXlhWFI1TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUEwRUNMaTNMamtSdjMKVWNFYlZBU1kwNm0vd2VhS1hUdUgrN3VJemczakx6OEdsdkNpS1ZDWnJ0czdvVmV3ZEZGeHplMUNrVTFCL3FuSQoyR3FHZDBTN1dXYVhVRjYwMUN4d1JNL2FONVZDYVR3d3hIR3pVdkFoVGFIWXVqbDhISjZqSkozeWd4YVlxaFo4ClE1c1ZXN2V1TkpIKzFHSW1HRWFhUCt2QitmR1FWK3VzZWcyTDIzSXdhbWJWNEVhamNOeG8yZjhFU0lsMzNyWHAKKzJkdFFlbThPYjB5MldJQzhiR29QVzQzbk9JdjR0T2lKb3ZHdUZWRGlPRWpQcVhTSkRscVI2c0ExS0d6cVNYKwpEVCtuSGJyVFVjRUxwTnFzT085VlVDUUZaVWFUTkU4dGphM0cxQ0VaMG83S0JXRnhCM05INVlvWkVyMEVUYzVPCm5LVklyTHNtOXdJREFRQUJvNEdPTUlHTE1CMEdBMVVkRGdRV0JCUUxXT1dMeGt3Vk42UkFxVENwSWI1SE5scFcKL3pBT0JnTlZIUThCQWY4RUJBTUNBUVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekJKQmdOVkhSOEVRakJBTUQ2ZwpQS0E2aGpob2RIUndPaTh2WTNKc0xtTnZiVzlrYjJOaExtTnZiUzlEVDAxUFJFOURaWEowYVdacFkyRjBhVzl1ClFYVjBhRzl5YVhSNUxtTnliREFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBUHBpZW0vWWI2ZGM1dDNpdUhYSVkKU2RPSDVFT0M2ei9KcXZXb3RlOVZmQ0ZTWmZuVkRlRnM5RDZNazNPUkxnTEVUZ2R4YjhDUE9HRUlxQjZCQ3NBdgpJQzlCaTVIY1NFVzg4Y2JldW5ack04Z0FMVEZHVE8zbm5jK0lsUDh6d0Zib0pJWW11Tmc0T044cWE5MFN6TWMvClJ4ZE1vc0lHbGduVzIvNC9QRVpCMzFqaVZnODhPOEVja3pYWk9GS3M3c2pzTGpCT2xEVzBKQjlMZUduYThnSTQKekpWU2svQndKVm1jSUdmRTd2bUxWMkgwa25aOVA0U05WYmZvNWF6VjhmVVpWcVphKzVBY3I1UHI1UnpVWjVkZApCQTYrQzRPbUY0TzVNQktneFRNVkJia04rOGNGZHVQWVNvMzhOQmVqeGlFb3ZqQkZNUjdIZUw1WVlUaXNPK0lCClpRPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPU5ldHdvcmsgU29sdXRpb25zIENlcnRpZmljYXRlIEF1dGhvcml0eSBPPU5ldHdvcmsgU29sdXRpb25zIEwuTC5DLgojIFN1YmplY3Q6IENOPU5ldHdvcmsgU29sdXRpb25zIENlcnRpZmljYXRlIEF1dGhvcml0eSBPPU5ldHdvcmsgU29sdXRpb25zIEwuTC5DLgojIExhYmVsOiAiTmV0d29yayBTb2x1dGlvbnMgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IgojIFNlcmlhbDogMTE2Njk3OTE1MTUyOTM3NDk3NDkwNDM3NTU2Mzg2ODEyNDg3OTA0CiMgTUQ1IEZpbmdlcnByaW50OiBkMzpmMzphNjoxNjpjMDpmYTo2YjoxZDo1OTpiMToyZDo5Njo0ZDowZToxMToyZQojIFNIQTEgRmluZ2VycHJpbnQ6IDc0OmY4OmEzOmMzOmVmOmU3OmIzOjkwOjA2OjRiOjgzOjkwOjNjOjIxOjY0OjYwOjIwOmU1OmRmOmNlCiMgU0hBMjU2IEZpbmdlcnByaW50OiAxNTpmMDpiYTowMDphMzphYzo3YTpmMzphYzo4ODo0YzowNzoyYjoxMDoxMTphMDo3NzpiZDo3NzpjMDo5NzpmNDowMTo2NDpiMjpmODo1OTo4YTpiZDo4Mzo4NjowYwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRDVqQ0NBczZnQXdJQkFnSVFWOHN6YjhKY0Z1WkhGaGZqa0RGbzREQU5CZ2txaGtpRzl3MEJBUVVGQURCaQpNUXN3Q1FZRFZRUUdFd0pWVXpFaE1COEdBMVVFQ2hNWVRtVjBkMjl5YXlCVGIyeDFkR2x2Ym5NZ1RDNU1Ma011Ck1UQXdMZ1lEVlFRREV5ZE9aWFIzYjNKcklGTnZiSFYwYVc5dWN5QkRaWEowYVdacFkyRjBaU0JCZFhSb2IzSnAKZEhrd0hoY05NRFl4TWpBeE1EQXdNREF3V2hjTk1qa3hNak14TWpNMU9UVTVXakJpTVFzd0NRWURWUVFHRXdKVgpVekVoTUI4R0ExVUVDaE1ZVG1WMGQyOXlheUJUYjJ4MWRHbHZibk1nVEM1TUxrTXVNVEF3TGdZRFZRUURFeWRPClpYUjNiM0pySUZOdmJIVjBhVzl1Y3lCRFpYSjBhV1pwWTJGMFpTQkJkWFJvYjNKcGRIa3dnZ0VpTUEwR0NTcUcKU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRRGt2SDZTTUczRzJJNHJDN3hHenVBbmx0N2UrZm9TMHp3egpjN01FTDd4eGpPV2Z0aUpnUGw5ZHpnbi9nZ3dibWxGUUdpYUozZFZoWFJuY0VnOHRDcUpEWFJmUU5KSWc2blBQCk9Dd0dKZ2w2Y3ZmNlVETDR3cFBUYWFJanprR3h6T1RWSHpiUmlqcjRqR1BpRkZscDdRM1RmMnZvdUFQbFQycmwKbUdOcFNBVytMdjh6dHVtWFdXbjRaeG11azJHV1JCWFRjckEvdkdwOTdFaC9qY09ycW5FclUybEJVelMxc0xuRgpCZ3JFc0VYMVFWMXVpVVY3UFRzbWpIVEM1ZExSZmJJUjFQdFlNaUthZ01uYy9RenBmMTREbDg0N0FCU0hKM0E0CnFZNXVzeWQybUZIZ0JlTWhxeHJWaFNJOEtiV2FGc1dBcVBTN2F6Q1BMMFlDb3JFTUl1RFRBZ01CQUFHamdaY3cKZ1pRd0hRWURWUjBPQkJZRUZDRXd5ZnNBMTA2WTJvZXFLdENuTHJGQU1hZE1NQTRHQTFVZER3RUIvd1FFQXdJQgpCakFQQmdOVkhSTUJBZjhFQlRBREFRSC9NRklHQTFVZEh3UkxNRWt3UjZCRm9FT0dRV2gwZEhBNkx5OWpjbXd1CmJtVjBjMjlzYzNOc0xtTnZiUzlPWlhSM2IzSnJVMjlzZFhScGIyNXpRMlZ5ZEdsbWFXTmhkR1ZCZFhSb2IzSnAKZEhrdVkzSnNNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUJBUUM3cmt2bnQxZnJmNm90dDNOSGhXckI1S1VkNU9jOAo2ZlJaWlhlMWVsdGFqU1UyNEhxWExqakFWMkNEbUFhRG43bDJlbTVRNExxSUxQeEZ6Qml3bVpWUkR1d2R1SWovCmgxQWNnc0xqNERLQXY2QUxSOGpETWUrWlp6S0FUeGNoZVF4cFhONWVOSzRDdFNicVVOOS9HR1VzeWZKajRha0gKL254eEgyc3pKR29lQmZjRmFNQnFFc3N1WG1ITHJpalRmc0swWnBFbVh6d3VKRi9MV0EvcktPeXZFWmJ6M0h0dgp3S2VJOGxOM3MyQmVycTRvMmpVc2J6UkYweWJoM3V4YlR5ZHJGbnk5UkFRWWdyT0plUmNRY1QxNm9oWk85UUhOCnBHeGxhS0ZKZGx4RHlkaThObWRzcFpTMTFNeTV2V28xVmlIZTJNUHIrOHVrWUV5d1ZhQ2dlMWV5Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1DT01PRE8gRUNDIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89Q09NT0RPIENBIExpbWl0ZWQKIyBTdWJqZWN0OiBDTj1DT01PRE8gRUNDIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89Q09NT0RPIENBIExpbWl0ZWQKIyBMYWJlbDogIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkiCiMgU2VyaWFsOiA0MTU3ODI4Mzg2NzA4NjY5MjYzODI1NjkyMTU4OTcwNzkzODA5MAojIE1ENSBGaW5nZXJwcmludDogN2M6NjI6ZmY6NzQ6OWQ6MzE6NTM6NWU6Njg6NGE6ZDU6Nzg6YWE6MWU6YmY6MjMKIyBTSEExIEZpbmdlcnByaW50OiA5Zjo3NDo0ZTo5ZjoyYjo0ZDpiYTplYzowZjozMToyYzo1MDpiNjo1NjozYjo4ZToyZDo5MzpjMzoxMQojIFNIQTI1NiBGaW5nZXJwcmludDogMTc6OTM6OTI6N2E6MDY6MTQ6NTQ6OTc6ODk6YWQ6Y2U6MmY6OGY6MzQ6Zjc6ZjA6YjY6NmQ6MGY6M2E6ZTM6YTM6Yjg6NGQ6MjE6ZWM6MTU6ZGI6YmE6NGY6YWQ6YzcKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNpVENDQWcrZ0F3SUJBZ0lRSDBldnFtSUFjRkJVVEFHZW0yT1pLakFLQmdncWhrak9QUVFEQXpDQmhURUwKTUFrR0ExVUVCaE1DUjBJeEd6QVpCZ05WQkFnVEVrZHlaV0YwWlhJZ1RXRnVZMmhsYzNSbGNqRVFNQTRHQTFVRQpCeE1IVTJGc1ptOXlaREVhTUJnR0ExVUVDaE1SUTA5TlQwUlBJRU5CSUV4cGJXbDBaV1F4S3pBcEJnTlZCQU1UCklrTlBUVTlFVHlCRlEwTWdRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrd0hoY05NRGd3TXpBMk1EQXcKTURBd1doY05Nemd3TVRFNE1qTTFPVFU1V2pDQmhURUxNQWtHQTFVRUJoTUNSMEl4R3pBWkJnTlZCQWdURWtkeQpaV0YwWlhJZ1RXRnVZMmhsYzNSbGNqRVFNQTRHQTFVRUJ4TUhVMkZzWm05eVpERWFNQmdHQTFVRUNoTVJRMDlOClQwUlBJRU5CSUV4cGJXbDBaV1F4S3pBcEJnTlZCQU1USWtOUFRVOUVUeUJGUTBNZ1EyVnlkR2xtYVdOaGRHbHYKYmlCQmRYUm9iM0pwZEhrd2RqQVFCZ2NxaGtqT1BRSUJCZ1VyZ1FRQUlnTmlBQVFEUjNzdmRjbUNGWVg3ZGVTUgpGdFNyWXBuMVBsSUxCczVCQUgrWDRRb2tQQjBCQk80OTBvMEpsd3pnZGVUNiszZUtLdlVEWUVzMml4WWpGcTBKCmNmUks5Q2hRdFA2SUhHNC9iQzh2Q1ZsYnBWc0xNNW5pd3oySitXb3M3N0xUQnVtalFqQkFNQjBHQTFVZERnUVcKQkJSMWNhY1pTQm04blozcVFVZmZsTVJJZDVuVGVUQU9CZ05WSFE4QkFmOEVCQU1DQVFZd0R3WURWUjBUQVFILwpCQVV3QXdFQi96QUtCZ2dxaGtqT1BRUURBd05vQURCbEFqRUE3d05iZXF5M2VBcHl0NGpmLzdWR0ZBa0srcURtCmZRakdHb2U5R0toenZTYktZQXlkenBtZnoxd1BNT0crRkRIcUFqQVU5Sk04U2FjemVwQkdSN05qZlJPYlRyZHYKR0RlQVUvN2RJT0ExbWpiUnh3RzU1dHpkOC84ZExEb1dWOW1TT2RZPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049T0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQSBPPVdJU2VLZXkgT1U9Q29weXJpZ2h0IChjKSAyMDA1L09JU1RFIEZvdW5kYXRpb24gRW5kb3JzZWQKIyBTdWJqZWN0OiBDTj1PSVNURSBXSVNlS2V5IEdsb2JhbCBSb290IEdBIENBIE89V0lTZUtleSBPVT1Db3B5cmlnaHQgKGMpIDIwMDUvT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZAojIExhYmVsOiAiT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQSIKIyBTZXJpYWw6IDg2NzE4ODc3ODcxMTMzMTU5MDkwMDgwNTU1OTExODIzNTQ4MzE0CiMgTUQ1IEZpbmdlcnByaW50OiBiYzo2Yzo1MTozMzphNzplOTpkMzo2Njo2Mzo1NDoxNTo3MjoxYjoyMTo5Mjo5MwojIFNIQTEgRmluZ2VycHJpbnQ6IDU5OjIyOmExOmUxOjVhOmVhOjE2OjM1OjIxOmY4Ojk4OjM5OjZhOjQ2OjQ2OmIwOjQ0OjFiOjBmOmE5CiMgU0hBMjU2IEZpbmdlcnByaW50OiA0MTpjOToyMzo4Njo2YTpiNDpjYTpkNjpiNzphZDo1Nzo4MDo4MTo1ODoyZTowMjowNzo5NzphNjpjYjpkZjo0ZjpmZjo3ODpjZTo4Mzo5NjpiMzo4OTozNzpkNzpmNQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRDhUQ0NBdG1nQXdJQkFnSVFRVDF5eC9Sckg0RkRmZkhTS0ZUZm1qQU5CZ2txaGtpRzl3MEJBUVVGQURDQgppakVMTUFrR0ExVUVCaE1DUTBneEVEQU9CZ05WQkFvVEIxZEpVMlZMWlhreEd6QVpCZ05WQkFzVEVrTnZjSGx5CmFXZG9kQ0FvWXlrZ01qQXdOVEVpTUNBR0ExVUVDeE1aVDBsVFZFVWdSbTkxYm1SaGRHbHZiaUJGYm1SdmNuTmwKWkRFb01DWUdBMVVFQXhNZlQwbFRWRVVnVjBsVFpVdGxlU0JIYkc5aVlXd2dVbTl2ZENCSFFTQkRRVEFlRncwdwpOVEV5TVRFeE5qQXpORFJhRncwek56RXlNVEV4TmpBNU5URmFNSUdLTVFzd0NRWURWUVFHRXdKRFNERVFNQTRHCkExVUVDaE1IVjBsVFpVdGxlVEViTUJrR0ExVUVDeE1TUTI5d2VYSnBaMmgwSUNoaktTQXlNREExTVNJd0lBWUQKVlFRTEV4bFBTVk5VUlNCR2IzVnVaR0YwYVc5dUlFVnVaRzl5YzJWa01TZ3dKZ1lEVlFRREV4OVBTVk5VUlNCWApTVk5sUzJWNUlFZHNiMkpoYkNCU2IyOTBJRWRCSUVOQk1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBCk1JSUJDZ0tDQVFFQXkwK3pBSnM5TnQzNTBVbHFheEJKSCt6WUs3TEcrREtCS1VPVlRKb1pJeUVWUmQ3anlCeFIKVlZ1dWsrZzMveXRyNmRUcXZpcmRxRkVyMTJiRFlWeGdBc2oxem5KN083anlUbVVJbXMya2FobkJBYnR6cHRmMgp3OTNOdktTTHRabGh1QUdpbzlSTjFBVTlrYTM0dEFoeFpLOXc4UnhyZnZiRGQ1MGtjM3ZrREl6aDJUYmhtWXNGCm1RdnRSVEVKeXNJQTIvZHlvSmFxbFlmUWpzZTJZWE1OZG1hTTNCdTBZNktmZjVNVE1QR2hKOXZaL3l4VmlKR2cKNEU4SHNDaFdqQmdibDBTT2lkM2dGMjduS3UrUE9Rb3hoSUxZUUJSSkxucEI1S2YrNDJUTXdWbHhTeXdocDF0OQo0QjNSTG9HYnc5aG85NzJXRzZ4d3NSWVVDOXRndVNZQkJRSURBUUFCbzFFd1R6QUxCZ05WSFE4RUJBTUNBWVl3CkR3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVXN3TityamE4c0huUjNKUW10aEcrSWJKcGhwUXcKRUFZSkt3WUJCQUdDTnhVQkJBTUNBUUF3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCQUV1aC93dUhiclA1d1VPeApTUE1vd0IwdXlRbEIrcFFBSEtTa3EwbFBqejBlNzAxdnZieWs5dkltTU1rUXloMkkrM1FaSDRWRnZiQnNVZmsyCmZ0djFUREk2UVU5YlI4L29DeTIyeEJtZGRNVkh4anRxRDZ3VTJ6ejBjNXlwQmQ4QTNIUjQrdmcxWUZrQ0V4aDgKdlB0TnNDQnRRN3RnTUhwbk0xekZtZEg0TFRsU2MvdU1xcGNsWEhMWkNCNnJUanpqZ1RHZkE2Yjd3UDRwaUZYYQpoTlZRQTdiaWhLT21OcW9ST2dIaEdFdldSR2l6UGZsVGRJU3pScEZHbGdDM2dDeTI0ZU1RNHR1aTV5aVBBWlppCkZqNEE0eHlsTm9FWW9reFNkc0FSbzI3bUhicmpXcjQyVThVK2RZK0dhU2xZVTdXY3UyK2ZYTVVZN04wdjRaakoKL0w3ZkNnMD0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUNlcnRpZ25hIE89RGhpbXlvdGlzCiMgU3ViamVjdDogQ049Q2VydGlnbmEgTz1EaGlteW90aXMKIyBMYWJlbDogIkNlcnRpZ25hIgojIFNlcmlhbDogMTgzNjQ4MDI5NzQyMDkzNjIxNzUKIyBNRDUgRmluZ2VycHJpbnQ6IGFiOjU3OmE2OjViOjdkOjQyOjgyOjE5OmI1OmQ4OjU4OjI2OjI4OjVlOmZkOmZmCiMgU0hBMSBGaW5nZXJwcmludDogYjE6MmU6MTM6NjM6NDU6ODY6YTQ6NmY6MWE6YjI6NjA6Njg6Mzc6NTg6MmQ6YzQ6YWM6ZmQ6OTQ6OTcKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGUzOmI2OmEyOmRiOjJlOmQ3OmNlOjQ4Ojg0OjJmOjdhOmM1OjMyOjQxOmM3OmI3OjFkOjU0OjE0OjRiOmZiOjQwOmMxOjFmOjNmOjFkOjBiOjQyOmY1OmVlOmExOjJkCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEcURDQ0FwQ2dBd0lCQWdJSkFQN2M0d0VQeVVqL01BMEdDU3FHU0liM0RRRUJCUVVBTURReEN6QUpCZ05WCkJBWVRBa1pTTVJJd0VBWURWUVFLREFsRWFHbHRlVzkwYVhNeEVUQVBCZ05WQkFNTUNFTmxjblJwWjI1aE1CNFgKRFRBM01EWXlPVEUxTVRNd05Wb1hEVEkzTURZeU9URTFNVE13TlZvd05ERUxNQWtHQTFVRUJoTUNSbEl4RWpBUQpCZ05WQkFvTUNVUm9hVzE1YjNScGN6RVJNQThHQTFVRUF3d0lRMlZ5ZEdsbmJtRXdnZ0VpTUEwR0NTcUdTSWIzCkRRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRRElhUEhKMXRhek5IVW1naDdzdEw3cVhPRW03UkZIWWVHaWZCWjQKUUNIa1lKNWF5R1BoeExHV2t2OFliV2tqNFN0aTk5M2lOaStSQjdsSXp3N3NlYllzNXpSTGNBZ2xvenlIR3hueQpnUWNQT0pBWjB4SCtoclR5MFY0ZUhwYk5nR3pPT3pHVHR2S2cwS21WRW4ybG1zeHJ5SVJXaWpPcDV5SVZVeGJ3CnpCZnNWMS9wb2dxWUNkN2pYNXh2M0VqamhRc1ZXcWE2bjZ4STR3bXk5L1F5M2w0MHZoeDRYVUpiemc0aWowMlEKMTMweUdMTUxMR3Evamo4VUVZa2dEbmNVdFQyVUNJZjNKUjdWc21BQTdHOHFLQ1Z1S2o0WVl4Y2xQejVFSUJiMgpKc2dscmdWS3RPZGpMUE9NRmxOK1hQc1JHZ2pCUm1LZklyanh3bzFwM1BvNldBYmZBZ01CQUFHamdid3dnYmt3CkR3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVUd1MytRVG1RdENSWnZnSHlVdFZGOWxvNTNCRXcKWkFZRFZSMGpCRjB3VzRBVUd1MytRVG1RdENSWnZnSHlVdFZGOWxvNTNCR2hPS1EyTURReEN6QUpCZ05WQkFZVApBa1pTTVJJd0VBWURWUVFLREFsRWFHbHRlVzkwYVhNeEVUQVBCZ05WQkFNTUNFTmxjblJwWjI1aGdna0EvdHpqCkFRL0pTUDh3RGdZRFZSMFBBUUgvQkFRREFnRUdNQkVHQ1dDR1NBR0crRUlCQVFRRUF3SUFCekFOQmdrcWhraUcKOXcwQkFRVUZBQU9DQVFFQWhRTWVrbkgyUXEvaG8yR2U2L1BBRC9LbDFOcVY1dGErYURZOWZtNGZUSXJ2MFE4aApiVjZsVW1QT0V2anZLdHB2NnpmK0V3TEh5enMrSW12YVlTNS8xSEk5M1REaEhreEFHWXdQMTV6Umd6QjdtRm5jCmZjYTVEQ2xNb1RPaTYyYzZaWVRUbHVMdGRrVndqN1VyM3ZrajFrbHVQQlMxeHA4MUhsRFF3WTlxY0VRQ1lzdXUKSFdoQnA2cFg2Rk9xQjlJRzl0VVVCZ3VSQTNVc2JISzFZWldhRFl1NURlZjEzMVROM3ViWTFna0lsMlBsd1M2dwp0MFFtd0NiQXIxVXduanZWTmlvWkJQUmNIdi9QTExmLzBQMkhRQkhWRVNPN1NNQWhxYVFvTGYwVitMQk9LL1F3Cld5SDhFWkUwdmtIdmU1MlhkZitYbGNDV1dDL3F1MGJYdStUWkxnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPURldXRzY2hlIFRlbGVrb20gUm9vdCBDQSAyIE89RGV1dHNjaGUgVGVsZWtvbSBBRyBPVT1ULVRlbGVTZWMgVHJ1c3QgQ2VudGVyCiMgU3ViamVjdDogQ049RGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIgTz1EZXV0c2NoZSBUZWxla29tIEFHIE9VPVQtVGVsZVNlYyBUcnVzdCBDZW50ZXIKIyBMYWJlbDogIkRldXRzY2hlIFRlbGVrb20gUm9vdCBDQSAyIgojIFNlcmlhbDogMzgKIyBNRDUgRmluZ2VycHJpbnQ6IDc0OjAxOjRhOjkxOmIxOjA4OmM0OjU4OmNlOjQ3OmNkOmYwOmRkOjExOjUzOjA4CiMgU0hBMSBGaW5nZXJwcmludDogODU6YTQ6MDg6YzA6OWM6MTk6M2U6NWQ6NTE6NTg6N2Q6Y2Q6ZDY6MTM6MzA6ZmQ6OGM6ZGU6Mzc6YmYKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGI2OjE5OjFhOjUwOmQwOmMzOjk3OjdmOjdkOmE5OjliOmNkOmFhOmM4OjZhOjIyOjdkOmFlOmI5OjY3OjllOmM3OjBiOmEzOmIwOmM5OmQ5OjIyOjcxOmMxOjcwOmQzCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEbnpDQ0FvZWdBd0lCQWdJQkpqQU5CZ2txaGtpRzl3MEJBUVVGQURCeE1Rc3dDUVlEVlFRR0V3SkVSVEVjCk1Cb0dBMVVFQ2hNVFJHVjFkSE5qYUdVZ1ZHVnNaV3R2YlNCQlJ6RWZNQjBHQTFVRUN4TVdWQzFVWld4bFUyVmoKSUZSeWRYTjBJRU5sYm5SbGNqRWpNQ0VHQTFVRUF4TWFSR1YxZEhOamFHVWdWR1ZzWld0dmJTQlNiMjkwSUVOQgpJREl3SGhjTk9Ua3dOekE1TVRJeE1UQXdXaGNOTVRrd056QTVNak0xT1RBd1dqQnhNUXN3Q1FZRFZRUUdFd0pFClJURWNNQm9HQTFVRUNoTVRSR1YxZEhOamFHVWdWR1ZzWld0dmJTQkJSekVmTUIwR0ExVUVDeE1XVkMxVVpXeGwKVTJWaklGUnlkWE4wSUVObGJuUmxjakVqTUNFR0ExVUVBeE1hUkdWMWRITmphR1VnVkdWc1pXdHZiU0JTYjI5MApJRU5CSURJd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUNyQzZNMTRJc3BGTEVVCmhhODhFT1E1YnpWZFNxN2Q2bUdObFVuMGIyU2pHbUJtcEtsQUlvVFoxS1hsZUpNT2FBR3R1VTFjT3M3VHVLaEMKUU4vUG83cUNXV3FTRzZ3Y210b0lLeVVuK1dralIvSGc2eXg2bS9VVEF0QitOSHpDbmp3QVdhdjEyZ3oxTWp3cgpyRkRhMXNQZWc1VEtxQXlaTWc0SVNGWmJhdnZhNFZoWUFVbGZja0U4RlFZQmpsMnRxcmlUdE0yZTY2Zm9haTFTCk5OczY3MXgxVWRyYjh6SDU3bkdZTXNSVUZVUU0rWnRWN2EzZkdBaWdvNGFLU2U1VEJZOFpUTlhlV0htYjBtb2MKUXF2RjFhZlBhQStXNU9GaG1IWmh5SkY4MWo0QTRwRlFoK0dkQ3VhdGw5SWR4anA5eTd6YUF6VFZqbHNCOVdvSAp0eGEyYmtwL0FnTUJBQUdqUWpCQU1CMEdBMVVkRGdRV0JCUXh3M2tidXZWVDF4ZmdpWG90RjJ3S3N5dWRNekFQCkJnTlZIUk1FQ0RBR0FRSC9BZ0VGTUE0R0ExVWREd0VCL3dRRUF3SUJCakFOQmdrcWhraUc5dzBCQVFVRkFBT0MKQVFFQWxHUlpyVGxrNXluckUvNWF3NHNUVjhnRUpQQjBkOEJnNDJmNzZZbW1nNytXZ254dTFNTTk3NTZBYnJzcAp0Smg2c1R0VTZ6a1hSMzRhamd2OEh6RlpNUVN5emhmekxNZGlObFhpSXRpSlZiU1lTS3BrK3RZY050aEVlRnBhCkl6cFhsL1Y2TUUrdW4ycE1TeXVPb0FQalB1Q3AxTko3MHJPbzRuSThyWjcvZ0Zua20wVzA5anV3elRrWm1ETGwKNmlGaGtPUXhJWTQwc2Zjdk5VcUZFTnJuaWpjaHZsbGo0UEtGaURGVDFGUVVoWEI1OUM0R2R5ZDFMeCs0aXZuKwp4YnJZTnVTRDdPZGx0NzlqV3ZOR3I0R1VOOVJCak5ZajFoN1A5V2diUkdPaVdycW5OVm1oNVhBRm13NGpWNW1VCkNtMjZPV01vaHBMekdJVFkrOUhQQlZaa1Z3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUN5YmVydHJ1c3QgR2xvYmFsIFJvb3QgTz1DeWJlcnRydXN0LCBJbmMKIyBTdWJqZWN0OiBDTj1DeWJlcnRydXN0IEdsb2JhbCBSb290IE89Q3liZXJ0cnVzdCwgSW5jCiMgTGFiZWw6ICJDeWJlcnRydXN0IEdsb2JhbCBSb290IgojIFNlcmlhbDogNDgzNTcwMzI3ODQ1OTY4Mjg3NzQ4NDM2MAojIE1ENSBGaW5nZXJwcmludDogNzI6ZTQ6NGE6ODc6ZTM6Njk6NDA6ODA6Nzc6ZWE6YmM6ZTM6ZjQ6ZmY6ZjA6ZTEKIyBTSEExIEZpbmdlcnByaW50OiA1Zjo0MzplNTpiMTpiZjpmODo3ODo4YzphYzoxYzpjNzpjYTo0YTo5YTpjNjoyMjoyYjpjYzozNDpjNgojIFNIQTI1NiBGaW5nZXJwcmludDogOTY6MGE6ZGY6MDA6NjM6ZTk6NjM6NTY6NzU6MGM6Mjk6NjU6ZGQ6MGE6MDg6Njc6ZGE6MGI6OWM6YmQ6NmU6Nzc6NzE6NGE6ZWE6ZmI6MjM6NDk6YWI6Mzk6M2Q6YTMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURvVENDQW9tZ0F3SUJBZ0lMQkFBQUFBQUJENFdxTFVnd0RRWUpLb1pJaHZjTkFRRUZCUUF3T3pFWU1CWUcKQTFVRUNoTVBRM2xpWlhKMGNuVnpkQ3dnU1c1ak1SOHdIUVlEVlFRREV4WkRlV0psY25SeWRYTjBJRWRzYjJKaApiQ0JTYjI5ME1CNFhEVEEyTVRJeE5UQTRNREF3TUZvWERUSXhNVEl4TlRBNE1EQXdNRm93T3pFWU1CWUdBMVVFCkNoTVBRM2xpWlhKMGNuVnpkQ3dnU1c1ak1SOHdIUVlEVlFRREV4WkRlV0psY25SeWRYTjBJRWRzYjJKaGJDQlMKYjI5ME1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBK01pOHZSUlFaaFAvOE5ONQo3Q1B5dHhySGpvWHhFbk9tR2FvUTI1eWlaWFJhZHo1UmZWYjIzQ08yMU8xZldMRTNUZFZKRG03MWFvZlcwb3pTCko4YmkvemFmbUdXZ0UwN0dLbVNiMVpBU3p4UUc5RHZqMUNpKzZBNzRxMDVJbEcyT2xURVFYTzJpTGIzVk9tMnkKSEx0Z3dFWkxBZlZKcm41R2l0QjBqYUVNQXM3dS9PZVB1R3RtODM5RUFMOW1KUlFyM1JBd0hRZVdQMDMyYTdpUAp0M3NNcFRqcjNrZmIxVjA1L0lpbjg5Y3FkUEhvV3FJN24xQzZwb3hGTmNKUVpaWGNZNEx2M2I5M1RaeGl5V056CkZ0QXBEMG1wU1BDenFyZHN4YWN3T1VCZHJzVGlYU1pUOE00Y0l3aGhxSlFadWdSaVFPd2ZPSEIzRWdaeHB6QVkKWFNVbnBRSURBUUFCbzRHbE1JR2lNQTRHQTFVZER3RUIvd1FFQXdJQkJqQVBCZ05WSFJNQkFmOEVCVEFEQVFILwpNQjBHQTFVZERnUVdCQlMyQ0hzTmVzeXNJRXlHVmpKZXo2dHVoUzF3VnpBL0JnTlZIUjhFT0RBMk1EU2dNcUF3CmhpNW9kSFJ3T2k4dmQzZDNNaTV3ZFdKc2FXTXRkSEoxYzNRdVkyOXRMMk55YkM5amRDOWpkSEp2YjNRdVkzSnMKTUI4R0ExVWRJd1FZTUJhQUZMWUlldzE2ekt3Z1RJWldNbDdQcTI2RkxYQlhNQTBHQ1NxR1NJYjNEUUVCQlFVQQpBNElCQVFCVzd3b2pvRlJPbFpmSitJbmFSY0hVb3dBbDlCOFRxN2VqaFZocHdqQ3QyQldLTGVQSnpZRmErSE1qCldxZDhCZlA5SWpzTzBRYkUyelpNY3dTTzViQWk1TVh6THFYWkkrTzRUa29ncDI0Q0pKOGlZR2Q3aXgxeUNjVXgKWE9sNW40QkhQYTJoQ3djVVBVZi9BMmthREF0RTUyTWxwMyt5eWJoMmhPMGo5bjBIcTBWKzA5K3p2K21LdHMybwpvbWNyVXRXM1pmQTVUR09na1htVFVnOVUzWU83bjlHUHAxTnp3OHYvTU94OEJMallSQitUWDNFSklyZHVQdW9jCkEwNmRHaUJoKzRFMzdGNzhDa1dyMStjWFZkQ2c2bUNicHZiampGc3B3Z1pnRkowdGwweXBreFdkWWNRQlgwalcKV0wxV01SSk9FY2doNExNUmtXWGJ0S2FJT001VgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogTz1DaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLiBPVT1lUEtJIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKIyBTdWJqZWN0OiBPPUNodW5naHdhIFRlbGVjb20gQ28uLCBMdGQuIE9VPWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQojIExhYmVsOiAiZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IgojIFNlcmlhbDogMjg5NTYwODg2ODI3MzUxODk2NTUwMzA1MjkwNTczNTI3NjA0NzcKIyBNRDUgRmluZ2VycHJpbnQ6IDFiOjJlOjAwOmNhOjI2OjA2OjkwOjNkOmFkOmZlOjZmOjE1OjY4OmQzOjZiOmIzCiMgU0hBMSBGaW5nZXJwcmludDogNjc6NjU6MGQ6ZjE6N2U6OGU6N2U6NWI6ODI6NDA6YTQ6ZjQ6NTY6NGI6Y2Y6ZTI6M2Q6Njk6YzY6ZjAKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGMwOmE2OmY0OmRjOjYzOmEyOjRiOmZkOmNmOjU0OmVmOjJhOjZhOjA4OjJhOjBhOjcyOmRlOjM1OjgwOjNlOjJmOmY1OmZmOjUyOjdhOmU1OmQ4OjcyOjA2OmRmOmQ1Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGc0RDQ0E1aWdBd0lCQWdJUUZjaTlaVWRjcjdpWEFGN2tCdEs4blRBTkJna3Foa2lHOXcwQkFRVUZBREJlCk1Rc3dDUVlEVlFRR0V3SlVWekVqTUNFR0ExVUVDZ3dhUTJoMWJtZG9kMkVnVkdWc1pXTnZiU0JEYnk0c0lFeDAKWkM0eEtqQW9CZ05WQkFzTUlXVlFTMGtnVW05dmRDQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVRBZQpGdzB3TkRFeU1qQXdNak14TWpkYUZ3MHpOREV5TWpBd01qTXhNamRhTUY0eEN6QUpCZ05WQkFZVEFsUlhNU013CklRWURWUVFLREJwRGFIVnVaMmgzWVNCVVpXeGxZMjl0SUVOdkxpd2dUSFJrTGpFcU1DZ0dBMVVFQ3d3aFpWQkwKU1NCU2IyOTBJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1JSUNJakFOQmdrcWhraUc5dzBCQVFFRgpBQU9DQWc4QU1JSUNDZ0tDQWdFQTRTVVA3bzNiaUROMVo4MnRIMzA2VG0yZDB5OFU4Mk4weXdFaGFqZnFoRkFIClN5WmJDVU5zSVo1cXlOVUQ5V0Jwajh6d0l1UWY1L2RxSWpHM0xCWHk0UDRBYWtQL2gyWEd0UnJCcDB4dEluQWgKaWpIeWwzU0pDUkltSEo3SzJSS2lsVHphNldlL0NLQms0OVpDdDBYdmwvVDI5ZGUxU2hVQ1dIMllXRXRndk0zWApEWm9UTTFQUllmbDYxZGQ0czVvejl3Q0d6aDFObERpdnFPeDRVWENLWEJDRFVTSDNFVDAwaGw3bFNNMlhnWUkxClRCbnNaZlpyeFFXaDdrY1Qxck1oSjVRUUN0a2tPN3ErUkJOR01EK1hQTmpYMTJydU96ampLOVNYRHJrYjV3ZEoKZnpjcStYZDR6MVR0VzBhZG80QU9rVVBCMWx0ZkZMcWZwbzBrUjBCWnYzSTRzalpzTi8rWjBWME9XUXFyYWZmQQpzZ1JGZWxRQXJyNVQ5clhuNGZnOG96SFNxZjRoVW1URnBtZndkUWNHbEJTQlZjWW41QUdQRjhGcWNkZStTL3VVCldIMStFVE94UXZkaWJCald6d2xvUG45czloNlBZcTJsWTlzSnB4OGlRa0VlYjVtS1B0ZjVQMEI2ZWJDbEFaTFMKblQwSUZhVVFBUzJ6TW5hb2xRMnplcHI3QnhCNEVXL2hqOGU2RHlVYWRDcmxISmhCbWQ4aGgraVZCbW9LczJwSApkbVgyT3MrUFloY1pld29velJyU2d4NGh4eXkvdnY5aGFMZG5HN3Q0VFkzT1orWGt3WTYzSTJiaW5aQjFOSmlwCk5pdUttcFM1bmV6TWlySDRKWWxjV3JZdmpCOXRlU1NuVW1qRGhEWGlabzFqRGlWTjFSbXk1bmszcHlLZFZERUMKQXdFQUFhTnFNR2d3SFFZRFZSME9CQllFRkI0TTk3Wm44dUdTSmdsRndGVTVMbmMvUWtxaU1Bd0dBMVVkRXdRRgpNQU1CQWY4d09RWUVaeW9IQUFReE1DOHdMUUlCQURBSkJnVXJEZ01DR2dVQU1BY0dCV2NxQXdBQUJCUkZzTUxICkNsWjg3bHQ0REpYNUdGUEJwaHpZRURBTkJna3Foa2lHOXcwQkFRVUZBQU9DQWdFQUNiT0RVMWtCUHBWSnVmR0IKdXZsMklDTzFKMkIwMUdxWk5GNXNBRlBabi9LbXNTUUhSR29xeHFXT2VCTG9SOWxZR3hNcVhubWJud29xWjZZbApQd1pwVm5QRGltWkkreW1CVjNRR3lwenFLT2c0WnlZcjhkVzFQMldUK0RaZGpvMk5RQ0NIR2Vydko4QTl0RGtQCkpYdG9VSFJWbkF4WmZWbzlRWlFsVWdqZ1J5d1ZNUm5WdndkVnhyc1N0WmYwWDRPRnVuSEIyV3lCRVhZS0NyQy8KZ3BmMzZqMzYrdXd0cVNpVU8xYmQwbEV1cnNDOUNCV01kMUkwbHRhYnJOTWRqbUVQTlh1YnJqbHBDMkpnUUNBMgpqNi83TnU0dENFb2R1TCtiWFBqcXBSdWdjNmJZK0c3Z013UmZhS29uaCszWndaQ2M3YjNqYWpXdlk5K3JHTm02CjV1bEs2bENLRDJHVEh1SXRHZUl3bERXU1hRNjJCNjhaZ0k5SGtGRkxMazNkaGVMU0NsSUtGNXI4R3JCUUF1VUIKbzJNM0lVeEV4SnRSbVJFT2M1d0dqMVF1cHloZVJEbUhWaTAzdllWRWxPRU1TeXljdzVLRk5HSExEN2liU2tOUwovalE2ZmJqcEtkeDJxY2d3K0JSeGdNWWVOa2gwSWtGY2g0TG9HSEdMUVlsRTUzNVlXNmk0alJQcHAyekRSKzJ6CkdwMWlybzJDNnBTZTNWa1F3NjNkNGszak1kWEg3T2p5c1A2U0hoWUtHdnpaOC9nbnRzbStIYlJzWkpCLzlPVEUKVzljM3JrSU8zYVFhYjN5SVZNVVdidUY2YUM3NE9yOE5wRHlKTzNpblRtT0RCQ0VJWjQzeWdrblFXLzJ4elErRApoTlErSUlYM1NqMHJuUDBxQ2dsTjZvSDRFWnc9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBPPWNlcnRTSUdOIE9VPWNlcnRTSUdOIFJPT1QgQ0EKIyBTdWJqZWN0OiBPPWNlcnRTSUdOIE9VPWNlcnRTSUdOIFJPT1QgQ0EKIyBMYWJlbDogImNlcnRTSUdOIFJPT1QgQ0EiCiMgU2VyaWFsOiAzNTIxMDIyNzI0OTE1NAojIE1ENSBGaW5nZXJwcmludDogMTg6OTg6YzA6ZDY6ZTk6M2E6ZmM6Zjk6YjA6ZjU6MGM6Zjc6NGI6MDE6NDQ6MTcKIyBTSEExIEZpbmdlcnByaW50OiBmYTpiNzplZTozNjo5NzoyNjo2MjpmYjoyZDpiMDoyYTpmNjpiZjowMzpmZDplODo3Yzo0YjoyZjo5YgojIFNIQTI1NiBGaW5nZXJwcmludDogZWE6YTk6NjI6YzQ6ZmE6NGE6NmI6YWY6ZWI6ZTQ6MTU6MTk6NmQ6MzU6MWM6Y2Q6ODg6OGQ6NGY6NTM6ZjM6ZmE6OGE6ZTY6ZDc6YzQ6NjY6YTk6NGU6NjA6NDI6YmIKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURPRENDQWlDZ0F3SUJBZ0lHSUFZRkZuQUNNQTBHQ1NxR1NJYjNEUUVCQlFVQU1Ec3hDekFKQmdOVkJBWVQKQWxKUE1SRXdEd1lEVlFRS0V3aGpaWEowVTBsSFRqRVpNQmNHQTFVRUN4TVFZMlZ5ZEZOSlIwNGdVazlQVkNCRApRVEFlRncwd05qQTNNRFF4TnpJd01EUmFGdzB6TVRBM01EUXhOekl3TURSYU1Ec3hDekFKQmdOVkJBWVRBbEpQCk1SRXdEd1lEVlFRS0V3aGpaWEowVTBsSFRqRVpNQmNHQTFVRUN4TVFZMlZ5ZEZOSlIwNGdVazlQVkNCRFFUQ0MKQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFMY3p1WDdJSlVxT3RkdTBLQnVxVjVEbwowU0xUWkxyVGsralVySVpoUUdwZ1YyaFVoRTI4YWxRQ0JmL2ZtNW9xcmwwSGowckRLSC92K3l2NmVmSEhyZkFRClV5U1FpMmJKcUlpcnIxcWpBT20rdWtidVczTjdMQmVDZ1Y1aUxLRUNaYk85eFNzQWZzVDhBek5YRGUzaStzNWQKUmRZNHpUVzJzc0hRbklGS3F1U3lBVndkajErWnhMR3QyNGdoNjVBSWdvRHpNS05ENXBDQ3JsVW9TZTFiMTZrUQpPQTcrajB4Ym0wYnFRZld3Q0hURDBJZ3p0bnpYZE4vY2hORkREblU1b1NWQUtPcDR5dzRzTGptZGpJdHVGaHd2CkpvSVE0dU5sbEFvRXdGNzNYVnY0RU9MUXVucEwrOTQzQUFBYVd5amowcHh6UGpLSG1LSEpVUy9YM3F3enMwOEMKQXdFQUFhTkNNRUF3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVkhROEJBZjhFQkFNQ0FjWXdIUVlEVlIwTwpCQllFRk9DTW05c2xTYlB4ZkliV3NrS0hDOUJyb05ua01BMEdDU3FHU0liM0RRRUJCUVVBQTRJQkFRQSswaHlKCkxqWDgrSFhkNW45bGlQUnlUTWtzMXpKTzg5MFplVWU5amp0Ymt3OVFTU1FUYXhRR2N1OEowNkdoNDBDRXllY1kKTW5ROFNHNFBuMHZVOXg3VGs0WmtWSmRqY2xEVlZjLzZJSk1Db3B2REk1Tk9GbFYyb0hCNWJjMGhIODh2TGJ3Wgo0NGd4K0ZrYWdRbklsNloweDJERVc4eFhqckoxL1JzQ0NkdFpiM0tUYWZjeFFkYUlPTCtIc3IwV2VmbXE1TDZJCkpkMWhKeU1jdFRFSEJEYTBHcEM5b0hSeFVJbHR2QlRqRDRhdThhcyt4NkFKektOSTBlRGJaT2VTdGMrdmNrTncKaS9uRGhEd1RxbjZTbTFkVGsvcHd3cEVPTWZtYloxM3BsamhlWDdOelRvZ1ZaOTZlZGhCaUlMNVZhWlZEQURsTgo5dTZ3V2s1SlJGUllYMEtECi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1HZW9UcnVzdCBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzMgTz1HZW9UcnVzdCBJbmMuIE9VPShjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIFN1YmplY3Q6IENOPUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMyBPPUdlb1RydXN0IEluYy4gT1U9KGMpIDIwMDggR2VvVHJ1c3QgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgTGFiZWw6ICJHZW9UcnVzdCBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzMiCiMgU2VyaWFsOiAyODgwOTEwNTc2OTkyODU2NDMxMzk4NDA4NTIwOTk3NTg4NTU5OQojIE1ENSBGaW5nZXJwcmludDogYjU6ZTg6MzQ6MzY6Yzk6MTA6NDQ6NTg6NDg6NzA6NmQ6MmU6ODM6ZDQ6Yjg6MDUKIyBTSEExIEZpbmdlcnByaW50OiAwMzo5ZTplZDpiODowYjplNzphMDozYzo2OTo1Mzo4OTozYjoyMDpkMjpkOTozMjozYTo0YzoyYTpmZAojIFNIQTI1NiBGaW5nZXJwcmludDogYjQ6Nzg6Yjg6MTI6MjU6MGQ6Zjg6Nzg6NjM6NWM6MmE6YTc6ZWM6N2Q6MTU6NWU6YWE6NjI6NWU6ZTg6Mjk6MTY6ZTI6Y2Q6Mjk6NDM6NjE6ODg6NmM6ZDE6ZmI6ZDQKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUQvakNDQXVhZ0F3SUJBZ0lRRmF4dWxCbXllVXRCOWllcHd4Z1BIekFOQmdrcWhraUc5dzBCQVFzRkFEQ0IKbURFTE1Ba0dBMVVFQmhNQ1ZWTXhGakFVQmdOVkJBb1REVWRsYjFSeWRYTjBJRWx1WXk0eE9UQTNCZ05WQkFzVApNQ2hqS1NBeU1EQTRJRWRsYjFSeWRYTjBJRWx1WXk0Z0xTQkdiM0lnWVhWMGFHOXlhWHBsWkNCMWMyVWdiMjVzCmVURTJNRFFHQTFVRUF4TXRSMlZ2VkhKMWMzUWdVSEpwYldGeWVTQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHYKY21sMGVTQXRJRWN6TUI0WERUQTRNRFF3TWpBd01EQXdNRm9YRFRNM01USXdNVEl6TlRrMU9Wb3dnWmd4Q3pBSgpCZ05WQkFZVEFsVlRNUll3RkFZRFZRUUtFdzFIWlc5VWNuVnpkQ0JKYm1NdU1Ua3dOd1lEVlFRTEV6QW9ZeWtnCk1qQXdPQ0JIWlc5VWNuVnpkQ0JKYm1NdUlDMGdSbTl5SUdGMWRHaHZjbWw2WldRZ2RYTmxJRzl1YkhreE5qQTAKQmdOVkJBTVRMVWRsYjFSeWRYTjBJRkJ5YVcxaGNua2dRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrZwpMU0JITXpDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTnppWG1KWUhUTlhPVEl6Cit1dkxoNHluMUVyZEJvanFaSTR4bUtVNGtCNll6eTVqSy9CR3ZFU3lpYUhBS0F4SmNDR1ZuMlRBcHBNU0FtVW0KaHNhbGlmRDYxNFNnY0s5UEdwYy9Ca1RWeWV0eUVIM2tNU2o3SEdIbUtBZEVjNUlpYWFjRGlHeWRZOGhTMnBnbgo1d2hNY0Q2MHlSTEJ4V2VEWFRQekF4SHNhdEJUNHRHNk5tQ1VnTHRoWTJ4YkYzN2ZRSlFlcXczQ0lTaHdpUC9XCkpteHNZQVFsVGxWK2ZlKy9sRWpldHgzZGNJMEZYNGlsbS9MQzd1clJRRUZ0WWpnZFZnYkZBMGRSSUJuOGV4QUwKRG1LdWRsVy9YM2UrUGtrQlV6MllKUU4ySkZvZHROdUo2bm5sdHJNN1A3cE1LRUYvQnF4cWpzSFE5Z1VkZmVaQwpodU9sMVVjQ0F3RUFBYU5DTUVBd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUNBUVl3CkhRWURWUjBPQkJZRUZNUjV5bzZoVGdNZEhOeHIyekZibEQ0L01IOHRNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUIKQVFBdHhSUFBWb0I3ZW5pOW42NHNtZWZ2MnQrVVhnbHBwK2R1YUl5OWNyNUhxUTZYRXJoSzhXVFRPZDhsTk5UQgp6VTZCOEE4RXhDU3pOSmJHcHFvdzMyaGhjOWY1am9XSjd3NWVsU2hLS2llUEVJNHVmSWJFQXA3YURIZGxEa1FOCmt2MzlzeFkyK2hFTkhZd09CNGxxS1ZiM2N2VGRGWngzTldaWHF4TlQySTdCUU1YWEV4WmFjc2UzYVFIRWVyR0QKQVdoOWpVR2hsQmpCSlZ6ODhQNkRBb2Q4RFEzUExnaGNTa0FOUHV5QlllWWsyOHJnRGkwSHNqNVczSTMxUVlVSApTSnNNQzh0SlAzM3N0LzNMaldlSkdxdnR1eDZqQUFnSUZ5cUNYREZkUm9vdEQ0YWJkTmxGKzlSQXNYcXFhQzJHCnNwa2k0Y0VyeDV6NDgxK29naExyR1JFdAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049dGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcyIE89dGhhd3RlLCBJbmMuIE9VPShjKSAyMDA3IHRoYXd0ZSwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgU3ViamVjdDogQ049dGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcyIE89dGhhd3RlLCBJbmMuIE9VPShjKSAyMDA3IHRoYXd0ZSwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgTGFiZWw6ICJ0aGF3dGUgUHJpbWFyeSBSb290IENBIC0gRzIiCiMgU2VyaWFsOiA3MTc1ODMyMDY3MjgyNTQxMDAyMDY2MTYyMTA4NTI1NjQ3MjQwNgojIE1ENSBGaW5nZXJwcmludDogNzQ6OWQ6ZWE6NjA6MjQ6YzQ6ZmQ6MjI6NTM6M2U6Y2M6M2E6NzI6ZDk6Mjk6NGYKIyBTSEExIEZpbmdlcnByaW50OiBhYTpkYjpiYzoyMjoyMzo4ZjpjNDowMTphMToyNzpiYjozODpkZDpmNDoxZDpkYjowODo5ZTpmMDoxMgojIFNIQTI1NiBGaW5nZXJwcmludDogYTQ6MzE6MGQ6NTA6YWY6MTg6YTY6NDQ6NzE6OTA6Mzc6MmE6ODY6YWY6YWY6OGI6OTU6MWY6ZmI6NDM6MWQ6ODM6N2Y6MWU6NTY6ODg6YjQ6NTk6NzE6ZWQ6MTU6NTcKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNpRENDQWcyZ0F3SUJBZ0lRTmZ3bVhObUVUOGs5SmoxWG02N1hWakFLQmdncWhrak9QUVFEQXpDQmhERUwKTUFrR0ExVUVCaE1DVlZNeEZUQVRCZ05WQkFvVERIUm9ZWGQwWlN3Z1NXNWpMakU0TURZR0ExVUVDeE12S0dNcApJREl3TURjZ2RHaGhkM1JsTENCSmJtTXVJQzBnUm05eUlHRjFkR2h2Y21sNlpXUWdkWE5sSUc5dWJIa3hKREFpCkJnTlZCQU1URzNSb1lYZDBaU0JRY21sdFlYSjVJRkp2YjNRZ1EwRWdMU0JITWpBZUZ3MHdOekV4TURVd01EQXcKTURCYUZ3MHpPREF4TVRneU16VTVOVGxhTUlHRU1Rc3dDUVlEVlFRR0V3SlZVekVWTUJNR0ExVUVDaE1NZEdoaApkM1JsTENCSmJtTXVNVGd3TmdZRFZRUUxFeThvWXlrZ01qQXdOeUIwYUdGM2RHVXNJRWx1WXk0Z0xTQkdiM0lnCllYVjBhRzl5YVhwbFpDQjFjMlVnYjI1c2VURWtNQ0lHQTFVRUF4TWJkR2hoZDNSbElGQnlhVzFoY25rZ1VtOXYKZENCRFFTQXRJRWN5TUhZd0VBWUhLb1pJemowQ0FRWUZLNEVFQUNJRFlnQUVvdFdjZ251Vm5mRlNlSWYraWhhLwpCZWJmb3dKUERRZkdBRkc2REFKU0xTS2tRam5FL28vcXljRysxRTMvbjNxZTRyRjhtcTJuaGdsemg5SG5tdU42CnBhcHUrN3F6Y01CbmlLSTExS09hc2YydHd1OHgrcWk1OC9zSXhwSFIreW1WbzBJd1FEQVBCZ05WSFJNQkFmOEUKQlRBREFRSC9NQTRHQTFVZER3RUIvd1FFQXdJQkJqQWRCZ05WSFE0RUZnUVVtdGdBTUFEbmEzK0ZHTzZMdHM2SwpEUGdSNGJzd0NnWUlLb1pJemowRUF3TURhUUF3WmdJeEFOMzQ0RmRIVzZmbUNzTzk5WUNLbHpVTkc0azhWSVozCktNcWg5SG5ldGVZNHNQQmxjSXgvQWxUQ3YvL1lvVDdaendJeEFNU05sUHpjVTlMY25YZ1dIeFV6STFOUzQxb3gKWFozS3JyMFRLVVFOSjF1bzUyaWNFdmRZUHk1eUFsZWpqNkVVTGc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049dGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczIE89dGhhd3RlLCBJbmMuIE9VPUNlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24vKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBTdWJqZWN0OiBDTj10aGF3dGUgUHJpbWFyeSBSb290IENBIC0gRzMgTz10aGF3dGUsIEluYy4gT1U9Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbi8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIExhYmVsOiAidGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczIgojIFNlcmlhbDogMTI3NjE0MTU3MDU2NjgxMjk5ODA1NTU2NDc2Mjc1OTk1NDE0Nzc5CiMgTUQ1IEZpbmdlcnByaW50OiBmYjoxYjo1ZDo0Mzo4YTo5NDpjZDo0NDpjNjo3NjpmMjo0Mzo0Yjo0NzplNzozMQojIFNIQTEgRmluZ2VycHJpbnQ6IGYxOjhiOjUzOjhkOjFiOmU5OjAzOmI2OmE2OmYwOjU2OjQzOjViOjE3OjE1Ojg5OmNhOmYzOjZiOmYyCiMgU0hBMjU2IEZpbmdlcnByaW50OiA0YjowMzpmNDo1ODowNzphZDo3MDpmMjoxYjpmYzoyYzphZTo3MTpjOTpmZDplNDo2MDo0YzowNjo0YzpmNTpmZjpiNjo4NjpiYTplNTpkYjphYTpkNzpmZDpkMzo0YwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRUtqQ0NBeEtnQXdJQkFnSVFZQUdYdDBhbjZyUzBtdFpMTC9lUSt6QU5CZ2txaGtpRzl3MEJBUXNGQURDQgpyakVMTUFrR0ExVUVCaE1DVlZNeEZUQVRCZ05WQkFvVERIUm9ZWGQwWlN3Z1NXNWpMakVvTUNZR0ExVUVDeE1mClEyVnlkR2xtYVdOaGRHbHZiaUJUWlhKMmFXTmxjeUJFYVhacGMybHZiakU0TURZR0ExVUVDeE12S0dNcElESXcKTURnZ2RHaGhkM1JsTENCSmJtTXVJQzBnUm05eUlHRjFkR2h2Y21sNlpXUWdkWE5sSUc5dWJIa3hKREFpQmdOVgpCQU1URzNSb1lYZDBaU0JRY21sdFlYSjVJRkp2YjNRZ1EwRWdMU0JITXpBZUZ3MHdPREEwTURJd01EQXdNREJhCkZ3MHpOekV5TURFeU16VTVOVGxhTUlHdU1Rc3dDUVlEVlFRR0V3SlZVekVWTUJNR0ExVUVDaE1NZEdoaGQzUmwKTENCSmJtTXVNU2d3SmdZRFZRUUxFeDlEWlhKMGFXWnBZMkYwYVc5dUlGTmxjblpwWTJWeklFUnBkbWx6YVc5dQpNVGd3TmdZRFZRUUxFeThvWXlrZ01qQXdPQ0IwYUdGM2RHVXNJRWx1WXk0Z0xTQkdiM0lnWVhWMGFHOXlhWHBsClpDQjFjMlVnYjI1c2VURWtNQ0lHQTFVRUF4TWJkR2hoZDNSbElGQnlhVzFoY25rZ1VtOXZkQ0JEUVNBdElFY3oKTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUFzcjhuTFB2YjJGdmRlSHNibm5kbQpnY3Mrdkh5dTg2WW5talNqYURGeE9ETmk1UE54Wm5teHFXV2pwWXZWajJBdFAwTE1xbXN5d0NQTExFSGQ1Ti84CllaemljN0lpbFJGREdGL0V0aDlYYkFvRldDTElOa3c2ZktYUno0YXZpS2RFQWhOMGNYTUtRbGtDK0JzVWEwTGYKYjErNmE0S2luVnZuU3IwZUFYTGJTM1RvTzM5L2ZSOEV0Q2FiNExSYXJFYzlWYmpYc0NaU0tBRXhRR2JZMlNTOQo5aXJZN0NGSlhKdjJldWwvVlRWK2xtdU5rNU1ueTVLNzZxeEF3Si9DK0lEUFhmUmEzTTUwaHFZK2JBdFR5cjJTCnpoa0djdVlNWERocHh3VFd2R3pPVy9iM2FKemNKUlZJaUtIcHFmaVluT0R6MVRFb1lSRnNaNWFOT1puTHdrVWsKT1FJREFRQUJvMEl3UURBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUE0R0ExVWREd0VCL3dRRUF3SUJCakFkQmdOVgpIUTRFRmdRVXJXeXFsR0NjN2VULytqNEtkQ3RqQS9lMldiOHdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBQnBBCjJKVmxyQW1TaWNZNTlCRGxxUTVtVTExNDN2b2trYnZuUkZIZnhoWTBDdTlxUkZIcUt3ZUtBM3JENno4S0xGSVcKb0N0RHVTV1FQM0NwTXlWdFJSb29PeWZQcXNNcFFodmZPMHpBTXpSYlFZaS9heXRscnlqdnN2WERxbWJPZTFidQp0OGpMWjhISm5Cb1l1TVREU1FQeFlBNVF6VWJGODNkNTk3WVY0RGpieHk4b29Bdy9keVowMlNVUzJqSGFHaDdjCktVR1JJanhwcDdzQzhyWmNKd09KOUFicW0rUnlndU9oQ2NIcEFCblRQdFJ3YTdweHBxcFlydlM3Nld5Mjc0Zk0KbTd2L09lWldZZE1LcDhSY1RHQjdCWGNtZXIvWUIxSXNZdmR3WTlrNXZHOGN3bm5jZGltdnpzVXNaQVJlaURadQpNZFJBR21JME5qODFBYTZzWTZBPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyIE89R2VvVHJ1c3QgSW5jLiBPVT0oYykgMjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBTdWJqZWN0OiBDTj1HZW9UcnVzdCBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIgTz1HZW9UcnVzdCBJbmMuIE9VPShjKSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIExhYmVsOiAiR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyIgojIFNlcmlhbDogODA2ODI4NjMyMDMzODEwNjU3ODIxNzc5MDg3NTE3OTQ2MTkyNDMKIyBNRDUgRmluZ2VycHJpbnQ6IDAxOjVlOmQ4OjZiOmJkOjZmOjNkOjhlOmExOjMxOmY4OjEyOmUwOjk4OjczOjZhCiMgU0hBMSBGaW5nZXJwcmludDogOGQ6MTc6ODQ6ZDU6Mzc6ZjM6MDM6N2Q6ZWM6NzA6ZmU6NTc6OGI6NTE6OWE6OTk6ZTY6MTA6ZDc6YjAKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDVlOmRiOjdhOmM0OjNiOjgyOmEwOjZhOjg3OjYxOmU4OmQ3OmJlOjQ5Ojc5OmViOmYyOjYxOjFmOjdkOmQ3OjliOmY5OjFjOjFjOjZiOjU2OjZhOjIxOjllOmQ3OjY2Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDcmpDQ0FqV2dBd0lCQWdJUVBMTDBTQW9BNHY3ckpEdGVZRDdEYXpBS0JnZ3Foa2pPUFFRREF6Q0JtREVMCk1Ba0dBMVVFQmhNQ1ZWTXhGakFVQmdOVkJBb1REVWRsYjFSeWRYTjBJRWx1WXk0eE9UQTNCZ05WQkFzVE1DaGoKS1NBeU1EQTNJRWRsYjFSeWRYTjBJRWx1WXk0Z0xTQkdiM0lnWVhWMGFHOXlhWHBsWkNCMWMyVWdiMjVzZVRFMgpNRFFHQTFVRUF4TXRSMlZ2VkhKMWMzUWdVSEpwYldGeWVTQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwCmVTQXRJRWN5TUI0WERUQTNNVEV3TlRBd01EQXdNRm9YRFRNNE1ERXhPREl6TlRrMU9Wb3dnWmd4Q3pBSkJnTlYKQkFZVEFsVlRNUll3RkFZRFZRUUtFdzFIWlc5VWNuVnpkQ0JKYm1NdU1Ua3dOd1lEVlFRTEV6QW9ZeWtnTWpBdwpOeUJIWlc5VWNuVnpkQ0JKYm1NdUlDMGdSbTl5SUdGMWRHaHZjbWw2WldRZ2RYTmxJRzl1YkhreE5qQTBCZ05WCkJBTVRMVWRsYjFSeWRYTjBJRkJ5YVcxaGNua2dRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrZ0xTQkgKTWpCMk1CQUdCeXFHU000OUFnRUdCU3VCQkFBaUEySUFCQld4NlAwREZVUGxyT3VITnhGaTc5S0RObEo5UlZjTApTbzE3VkRzNmJsOFZBc0JRcHM4bEwzM0tTTGpIVUdNY0tpRUlmSm8yMkF2KzBTYkZXREV3S0NYelhWMmp1TGFsCnRKTHRiQ3lmNjkxRGlhSThTMGlSSFZEc0p0L1dZQzY5SWFOQ01FQXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU8KQmdOVkhROEJBZjhFQkFNQ0FRWXdIUVlEVlIwT0JCWUVGQlZmTlZkUlZmc2xzcTBEYWZ3Qm8vcStFVlhWTUFvRwpDQ3FHU000OUJBTURBMmNBTUdRQ01HU1dXYWJvQ2Q2THV2cGFpSWp3SDVIVFJxanlTa3dDWS90c1h6amJMa0dUCnFRN21uZHd4SExLZ3B4Z2NlZUhITmdJd09sYXZtblJzOXZ1RDREUFRDRitobk1KYm4wYld0c3VSQm1PaUJ1Y3oKckQ2b2dSTFF5N3JRa2d1Mm5wYXFCQStLCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPVZlcmlTaWduLCBJbmMuIE9VPVZlcmlTaWduIFRydXN0IE5ldHdvcmsvKGMpIDIwMDggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIFN1YmplY3Q6IENOPVZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89VmVyaVNpZ24sIEluYy4gT1U9VmVyaVNpZ24gVHJ1c3QgTmV0d29yay8oYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgTGFiZWw6ICJWZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSIKIyBTZXJpYWw6IDg1MjA5NTc0NzM0MDg0NTgxOTE3NzYzNzUyNjQ0MDMxNzI2ODc3CiMgTUQ1IEZpbmdlcnByaW50OiA4ZTphZDpiNTowMTphYTo0ZDo4MTplNDo4YzoxZDpkMTplMToxNDowMDo5NToxOQojIFNIQTEgRmluZ2VycHJpbnQ6IDM2Ojc5OmNhOjM1OjY2Ojg3OjcyOjMwOjRkOjMwOmE1OmZiOjg3OjNiOjBmOmE3OjdiOmI3OjBkOjU0CiMgU0hBMjU2IEZpbmdlcnByaW50OiAyMzo5OTo1NjoxMToyNzphNTo3MToyNTpkZTo4YzplZjplYTo2MTowZDpkZjoyZjphMDo3ODpiNTpjODowNjo3Zjo0ZTo4Mjo4Mjo5MDpiZjpiODo2MDplODo0YjozYwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRXVUQ0NBNkdnQXdJQkFnSVFRQnJFWkNHekV5RUREcnZrRWhyRkhUQU5CZ2txaGtpRzl3MEJBUXNGQURDQgp2VEVMTUFrR0ExVUVCaE1DVlZNeEZ6QVZCZ05WQkFvVERsWmxjbWxUYVdkdUxDQkpibU11TVI4d0hRWURWUVFMCkV4WldaWEpwVTJsbmJpQlVjblZ6ZENCT1pYUjNiM0pyTVRvd09BWURWUVFMRXpFb1l5a2dNakF3T0NCV1pYSnAKVTJsbmJpd2dTVzVqTGlBdElFWnZjaUJoZFhSb2IzSnBlbVZrSUhWelpTQnZibXg1TVRnd05nWURWUVFERXk5VwpaWEpwVTJsbmJpQlZibWwyWlhKellXd2dVbTl2ZENCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVEFlCkZ3MHdPREEwTURJd01EQXdNREJhRncwek56RXlNREV5TXpVNU5UbGFNSUc5TVFzd0NRWURWUVFHRXdKVlV6RVgKTUJVR0ExVUVDaE1PVm1WeWFWTnBaMjRzSUVsdVl5NHhIekFkQmdOVkJBc1RGbFpsY21sVGFXZHVJRlJ5ZFhOMApJRTVsZEhkdmNtc3hPakE0QmdOVkJBc1RNU2hqS1NBeU1EQTRJRlpsY21sVGFXZHVMQ0JKYm1NdUlDMGdSbTl5CklHRjFkR2h2Y21sNlpXUWdkWE5sSUc5dWJIa3hPREEyQmdOVkJBTVRMMVpsY21sVGFXZHVJRlZ1YVhabGNuTmgKYkNCU2IyOTBJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1JSUJJakFOQmdrcWhraUc5dzBCQVFFRgpBQU9DQVE4QU1JSUJDZ0tDQVFFQXgyRTNYckVCTk50aTF4V2IvMWhhakNNajFtQ09rZGVRbUlONjVsZ1pPSXpGCjl1VmtoYlNpY2Z2dHZibmF6VTBBdE1ndGM2WEhhWEdWSHprOHNrUUhuT2dPK2sxS3hDSGZLV0dQTWlKaGdzV0gKSDI2TWZGOFdJRkZFMFhCUFYrcmpIT1BNZWU1WTJBN0NzMFdUd0N6bm1oY3Jld0EzZWtFemVPRXo0dk1RR24rSApMTDcyOWZkQzR1Vy9oMktKWHdCTDM4WGQ1SFZFTWtFNkhuRnVhY3NMZFVZSTBjclNLNVhRei91NVFHdGtqRmROCi9CTVJlWVR0WGxUMk5KOElBZk1RSlFZWFN0cnhIWHBtYTVoZ1pxVFo3OUl1Z3ZIdzd3bnFSTWtWYXVJRGJqUFQKcko5VkFNZjJDR3FVdVYvYzREUHhoR0Q1V3ljUnRQd1c4cnRXYW9BbGpRSURBUUFCbzRHeU1JR3ZNQThHQTFVZApFd0VCL3dRRk1BTUJBZjh3RGdZRFZSMFBBUUgvQkFRREFnRUdNRzBHQ0NzR0FRVUZCd0VNQkdFd1g2RmRvRnN3CldUQlhNRlVXQ1dsdFlXZGxMMmRwWmpBaE1COHdCd1lGS3c0REFob0VGSS9sMHhxR3JJMk9hOFBQZ0dyVVNCZ3MKZXhrdU1DVVdJMmgwZEhBNkx5OXNiMmR2TG5abGNtbHphV2R1TG1OdmJTOTJjMnh2WjI4dVoybG1NQjBHQTFVZApEZ1FXQkJTMmQvcHBTRWVmVXhMVnd1b0hNbllIMFpjSEdUQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FRRUFTdmo0CnNBUG1MR2Q3NUpSM1k4eHVUUGw5RGczY3lMazF1WEJQWS9vaytteURqRWVkTzJQem12bDJNcFdSc1hlOHJKcSsKc2VReEljYUJsVlphRHJIQzFMR21XYXp4WTh1NFRCMVprRXJ2a0JZb0gxcXVFUHVCVURnTWJNenhQY1AxWStPego0eUhKSkRucC9SVm1SdlFiRWRCTmM2TjlSdms5N2FoZll0VHhQL2pnZEZjckdKMkJ0TVFvMnBTWHBYRHJyQjIrCkJ4SHcxZHZkNVl6dzFUS3dnK1pYNG8rL3ZxR3F2ejBkdGRRNDZ0ZXdYRHBQYWorUHdHWnNZNnJwMmFRVzlJSFIKbFJRT2ZjMlZOTm5TajNCemdYdWNmcjJZWWRoRmg1aVF4ZXVHTU1ZMXYvRC93MVdJZzB2dkJaSUdjZks0bUpPMwo3TTJDWWZFNDVrK1htQ3BhalE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049VmVyaVNpZ24gQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc0IE89VmVyaVNpZ24sIEluYy4gT1U9VmVyaVNpZ24gVHJ1c3QgTmV0d29yay8oYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgU3ViamVjdDogQ049VmVyaVNpZ24gQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc0IE89VmVyaVNpZ24sIEluYy4gT1U9VmVyaVNpZ24gVHJ1c3QgTmV0d29yay8oYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgTGFiZWw6ICJWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQiCiMgU2VyaWFsOiA2MzE0MzQ4NDM0ODE1MzUwNjY2NTMxMTk4NTUwMTQ1ODY0MDA1MQojIE1ENSBGaW5nZXJwcmludDogM2E6NTI6ZTE6ZTc6ZmQ6NmY6M2E6ZTM6NmY6ZjM6NmY6OTk6MWI6Zjk6MjI6NDEKIyBTSEExIEZpbmdlcnByaW50OiAyMjpkNTpkODpkZjo4ZjowMjozMTpkMTo4ZDpmNzo5ZDpiNzpjZjo4YToyZDo2NDpjOTozZjo2YzozYQojIFNIQTI1NiBGaW5nZXJwcmludDogNjk6ZGQ6ZDc6ZWE6OTA6YmI6NTc6Yzk6M2U6MTM6NWQ6Yzg6NWU6YTY6ZmM6ZDU6NDg6MGI6NjA6MzI6Mzk6YmQ6YzQ6NTQ6ZmM6NzU6OGI6MmE6MjY6Y2Y6N2Y6NzkKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURoRENDQXdxZ0F3SUJBZ0lRTDREK0k0d09JZzlJWnhJb2tZZXNzekFLQmdncWhrak9QUVFEQXpDQnlqRUwKTUFrR0ExVUVCaE1DVlZNeEZ6QVZCZ05WQkFvVERsWmxjbWxUYVdkdUxDQkpibU11TVI4d0hRWURWUVFMRXhaVwpaWEpwVTJsbmJpQlVjblZ6ZENCT1pYUjNiM0pyTVRvd09BWURWUVFMRXpFb1l5a2dNakF3TnlCV1pYSnBVMmxuCmJpd2dTVzVqTGlBdElFWnZjaUJoZFhSb2IzSnBlbVZrSUhWelpTQnZibXg1TVVVd1F3WURWUVFERXp4V1pYSnAKVTJsbmJpQkRiR0Z6Y3lBeklGQjFZbXhwWXlCUWNtbHRZWEo1SUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eQphWFI1SUMwZ1J6UXdIaGNOTURjeE1UQTFNREF3TURBd1doY05Nemd3TVRFNE1qTTFPVFU1V2pDQnlqRUxNQWtHCkExVUVCaE1DVlZNeEZ6QVZCZ05WQkFvVERsWmxjbWxUYVdkdUxDQkpibU11TVI4d0hRWURWUVFMRXhaV1pYSnAKVTJsbmJpQlVjblZ6ZENCT1pYUjNiM0pyTVRvd09BWURWUVFMRXpFb1l5a2dNakF3TnlCV1pYSnBVMmxuYml3ZwpTVzVqTGlBdElFWnZjaUJoZFhSb2IzSnBlbVZrSUhWelpTQnZibXg1TVVVd1F3WURWUVFERXp4V1pYSnBVMmxuCmJpQkRiR0Z6Y3lBeklGQjFZbXhwWXlCUWNtbHRZWEo1SUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjUKSUMwZ1J6UXdkakFRQmdjcWhrak9QUUlCQmdVcmdRUUFJZ05pQUFTblZucDhVdHBrbXc0dFhOaGVySkk5L2dIbQpHVW85RkFOTCttQW5JTm1EaVduNlZNYWFHRjVWS21UZUJ2YU5TanV0RUR4bFBaQ0lCSW5nTUdHenJsMEJwM3ZlCmZMSyt5bVZoQUlhdTJvOTcwSW10VFIxWm1rR3h2RWVBM0o1aXcvbWpnYkl3Z2E4d0R3WURWUjBUQVFIL0JBVXcKQXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DQVFZd2JRWUlLd1lCQlFVSEFRd0VZVEJmb1YyZ1d6QlpNRmN3VlJZSgphVzFoWjJVdloybG1NQ0V3SHpBSEJnVXJEZ01DR2dRVWorWFRHb2Fzalk1cnc4K0FhdFJJR0N4N0dTNHdKUllqCmFIUjBjRG92TDJ4dloyOHVkbVZ5YVhOcFoyNHVZMjl0TDNaemJHOW5ieTVuYVdZd0hRWURWUjBPQkJZRUZMTVcKa2YzdXBtN2t0UzVKajRkNGdZRHM1YkcxTUFvR0NDcUdTTTQ5QkFNREEyZ0FNR1VDTUdZaERCZ21ZRm80ZTFaQwo0S2Y4Tm9SUmtTQXNkazFEUGNRZGhDUFFyTlo4TlFiT3pXbTlrQTNiYkVoQ0hRNnFRZ0l4QUp3OVNEa2pPVmdhCkZSSlphcDd2MVZteUhWSXNtWEhOeHluZkd5cGhlM0hSM3ZQQTVRMDZTcW90cDlpR0t0MHVFQT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1OZXRMb2NrIEFyYW55IChDbGFzcyBHb2xkKSBGXHUwMTUxdGFuXHhmYXNceGVkdHZceGUxbnkgTz1OZXRMb2NrIEtmdC4gT1U9VGFuXHhmYXNceGVkdHZceGUxbnlraWFkXHhmM2sgKENlcnRpZmljYXRpb24gU2VydmljZXMpCiMgU3ViamVjdDogQ049TmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRlx1MDE1MXRhblx4ZmFzXHhlZHR2XHhlMW55IE89TmV0TG9jayBLZnQuIE9VPVRhblx4ZmFzXHhlZHR2XHhlMW55a2lhZFx4ZjNrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKQojIExhYmVsOiAiTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRlx1MDE1MXRhblx4ZmFzXHhlZHR2XHhlMW55IgojIFNlcmlhbDogODA1NDQyNzQ4NDE2MTYKIyBNRDUgRmluZ2VycHJpbnQ6IGM1OmExOmI3OmZmOjczOmRkOmQ2OmQ3OjM0OjMyOjE4OmRmOmZjOjNjOmFkOjg4CiMgU0hBMSBGaW5nZXJwcmludDogMDY6MDg6M2Y6NTk6M2Y6MTU6YTE6MDQ6YTA6Njk6YTQ6NmI6YTk6MDM6ZDA6MDY6Yjc6OTc6MDk6OTEKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDZjOjYxOmRhOmMzOmEyOmRlOmYwOjMxOjUwOjZiOmUwOjM2OmQyOmE2OmZlOjQwOjE5Ojk0OmZiOmQxOjNkOmY5OmM4OmQ0OjY2OjU5OjkyOjc0OmM0OjQ2OmVjOjk4Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFRlRDQ0F2MmdBd0lCQWdJR1NVRXM1QUFRTUEwR0NTcUdTSWIzRFFFQkN3VUFNSUduTVFzd0NRWURWUVFHCkV3SklWVEVSTUE4R0ExVUVCd3dJUW5Wa1lYQmxjM1F4RlRBVEJnTlZCQW9NREU1bGRFeHZZMnNnUzJaMExqRTMKTURVR0ExVUVDd3d1VkdGdXc3cHp3NjEwZHNPaGJubHJhV0ZrdzdOcklDaERaWEowYVdacFkyRjBhVzl1SUZObApjblpwWTJWektURTFNRE1HQTFVRUF3d3NUbVYwVEc5amF5QkJjbUZ1ZVNBb1EyeGhjM01nUjI5c1pDa2dSc1dSCmRHRnV3N3B6dzYxMGRzT2hibmt3SGhjTk1EZ3hNakV4TVRVd09ESXhXaGNOTWpneE1qQTJNVFV3T0RJeFdqQ0IKcHpFTE1Ba0dBMVVFQmhNQ1NGVXhFVEFQQmdOVkJBY01DRUoxWkdGd1pYTjBNUlV3RXdZRFZRUUtEQXhPWlhSTQpiMk5ySUV0bWRDNHhOekExQmdOVkJBc01MbFJoYnNPNmM4T3RkSGJEb1c1NWEybGhaTU96YXlBb1EyVnlkR2xtCmFXTmhkR2x2YmlCVFpYSjJhV05sY3lreE5UQXpCZ05WQkFNTUxFNWxkRXh2WTJzZ1FYSmhibmtnS0VOc1lYTnoKSUVkdmJHUXBJRWJGa1hSaGJzTzZjOE90ZEhiRG9XNTVNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QQpNSUlCQ2dLQ0FRRUF4Q1JlYzc1TGJSVERvZlRqbDVCdTBqQkZIanp1WjlsazRCcUtmOG93eW9QaklNSGo5RHJUCmxGOGFmRnR0dnpCUGhDZjJueDlKdk1hWkNwRHlEL1YvUTRRM1kxR0xlcVZ3L0hwWXpZNmI3Y05HYklSd1hkcnoKQVpBai9FNHdxWDdoSjJQbjdXUThvTGpKTTJQK0ZwRC9zTGo5MTZqQXdKUkRDN2JWV2FhZVZ0QWtIM0I1cjlzNQpWQTFsZGRrVlFaUUJyMTdzOW8zeC82MWsvaUNhMTF6ci9xWWZDR1NqaTNaVnJSNDdLR0F1aHlYb3FxOGZ4bVJHCklMZHdmenplU051V1U3YzVkK1FhNHNjV2hIYVhXeSs3R1JXRitHbUY5Wm1ucWZJMHA2bTJwZ1A4YjRZOVZIeDIKQkp0citVQmRBRFRITHBsMW5lV0lBNnBOK0FQU1FuYkFHd0lEQUtpTG8wVXdRekFTQmdOVkhSTUJBZjhFQ0RBRwpBUUgvQWdFRU1BNEdBMVVkRHdFQi93UUVBd0lCQmpBZEJnTlZIUTRFRmdRVXpQcG5rL0MydU5DbHdCN3pVLzJNClU5K0QxNVl3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQUt0Lzdod1dxWnc4VVFDZ3dCRUlCYWVaNW04QmlGUmgKYnZHNUdLMUtyZjZCUUNPVUwvdDFmQzhvUzJJa2dZSUw5V0h4SEc2NFlUanJnZnBpb1R0YVl0T1VaY1RoNW0yQworQzhsY0xJaEpzRnlVUitNTE1PRWtNTmFqN3JQOUtkbHBldVkwZnNGc2taMUZTTnFiNFZqTUlEdzFaNGZLUnpDCmJMQlFXVjJRV3p1b0RURFB2MzEvenZHZGc3M0pSbTRncHZsaFVib2hMM3UrcFJWam9kU1ZoL0dldWZPSjh6MkYKdUxqYnZyVzVLZm5hTndVQVNaUURoRVRudjBNeHozV0xKZEgwcG1UMWt2YXJCZXM5NmFVTE5tTGF6QVpmTm91MgpYakc0S3Z0ZTluSGZSQ2FleE9ZTmtiUXVkWldBVVdwTE1LYXdZcUdUOFp2WXpzUmpkVDlaUjdFPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049U3RhYXQgZGVyIE5lZGVybGFuZGVuIFJvb3QgQ0EgLSBHMiBPPVN0YWF0IGRlciBOZWRlcmxhbmRlbgojIFN1YmplY3Q6IENOPVN0YWF0IGRlciBOZWRlcmxhbmRlbiBSb290IENBIC0gRzIgTz1TdGFhdCBkZXIgTmVkZXJsYW5kZW4KIyBMYWJlbDogIlN0YWF0IGRlciBOZWRlcmxhbmRlbiBSb290IENBIC0gRzIiCiMgU2VyaWFsOiAxMDAwMDAxMgojIE1ENSBGaW5nZXJwcmludDogN2M6YTU6MGY6Zjg6NWI6OWE6N2Q6NmQ6MzA6YWU6NTQ6NWE6ZTM6NDI6YTI6OGEKIyBTSEExIEZpbmdlcnByaW50OiA1OTphZjo4Mjo3OTo5MTo4NjpjNzpiNDo3NTowNzpjYjpjZjowMzo1Nzo0NjplYjowNDpkZDpiNzoxNgojIFNIQTI1NiBGaW5nZXJwcmludDogNjY6OGM6ODM6OTQ6N2Q6YTY6M2I6NzI6NGI6ZWM6ZTE6NzQ6M2M6MzE6YTA6ZTY6YWU6ZDA6ZGI6OGU6YzU6YjM6MWI6ZTM6Nzc6YmI6Nzg6NGY6OTE6YjY6NzE6NmYKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZ5akNDQTdLZ0F3SUJBZ0lFQUppV2pEQU5CZ2txaGtpRzl3MEJBUXNGQURCYU1Rc3dDUVlEVlFRR0V3Sk8KVERFZU1Cd0dBMVVFQ2d3VlUzUmhZWFFnWkdWeUlFNWxaR1Z5YkdGdVpHVnVNU3N3S1FZRFZRUUREQ0pUZEdGaApkQ0JrWlhJZ1RtVmtaWEpzWVc1a1pXNGdVbTl2ZENCRFFTQXRJRWN5TUI0WERUQTRNRE15TmpFeE1UZ3hOMW9YCkRUSXdNRE15TlRFeE1ETXhNRm93V2pFTE1Ba0dBMVVFQmhNQ1Rrd3hIakFjQmdOVkJBb01GVk4wWVdGMElHUmwKY2lCT1pXUmxjbXhoYm1SbGJqRXJNQ2tHQTFVRUF3d2lVM1JoWVhRZ1pHVnlJRTVsWkdWeWJHRnVaR1Z1SUZKdgpiM1FnUTBFZ0xTQkhNakNDQWlJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFNVlo1MjkxCnFqNUxuTFc0cko0TDVQblp5cXRkajdVNUVJTFhyMUhnTytFQVNHclAydUVHUXhHWnFoUWxFcTBpNkFCdFE4U3AKdU9VZmlVdG52V0ZJNy8zUzRHQ0k1YmtZWUNqRGR5dXRzRGVxTjk1a1dTcEdWK1JMdWZnM2ZOVTI1NERCdHZQVQpaNXVXNk03WHhncFQwR3RKbHZPakN3VjNTUGNsNVhDc01CUWdKZU4vZFZybFNQaE9ld01IQlBxQ1lZZHU4RHZFCnBNZlE5WFErcFYwYUNQS2JKZEwyckFRbVBsVTZZaWlsZTdJd3IvZzN3dEc2MWpqOTlPOUpNRGVaSmlGSWhRR3AKNVJibjNKQlYzdy9vT00yWk55RlBYZlVpYjJyRkVoWmdGMVh5WldhbXB6Q1JPTUU0SFlZRWhMb2FKWGhlbmEvTQpVR0RXRTRkUzdXTWZiV1Y5d2hVWWRNcmhmbVFwakhMWUZoTjlDMGxLOFNnYklIUnJ4VDNkc0twSUNUMHVncFROCkdtWFpLNGlhbWJ3WWZwL3VmV1o4UHIyVXVJSE96Wmd3ZU1Gdlo5QytYK0JvN2Q3aXNja3NXWGlTcXQ4cllHUHkKNVY2NTQ4cjZmMUNHUHFJMEdBd0phQ2dSSE9UaHVWdytSN295UHhqTVc0VDE4MnQweEhKMDRlT0xvRXE5aldZdgo2cTAxMmlEVGlJSmg4QklpdHJ6UTFhVHNyMVNJSlNROHAyMnhjaWsvUGxlbWYxV3ZiaWJHL3VmTVFGeFJSSUVLCmVONUt6bFcvSGRYWnQxYnY4SGIvQzNtMXI3MzdxV21SUnBkb2dCUTJIYk4vdXltWU5xVWcrb0pnWWpPazdOYTYKQjZkdXhjOFVwdWZXa2pUWWdmWDhIVjJxWEI3Mm8wMDd1UGM1QWdNQkFBR2pnWmN3Z1pRd0R3WURWUjBUQVFILwpCQVV3QXdFQi96QlNCZ05WSFNBRVN6QkpNRWNHQkZVZElBQXdQekE5QmdnckJnRUZCUWNDQVJZeGFIUjBjRG92CkwzZDNkeTV3YTJsdmRtVnlhR1ZwWkM1dWJDOXdiMnhwWTJsbGN5OXliMjkwTFhCdmJHbGplUzFITWpBT0JnTlYKSFE4QkFmOEVCQU1DQVFZd0hRWURWUjBPQkJZRUZKRm9Nb2NWSFluaXRmR3NOaWcwalF0OFlvanJNQTBHQ1NxRwpTSWIzRFFFQkN3VUFBNElDQVFDb1FVcG5LcEtCZ2xCdTRkZllzems3OHdJVkNWQlI3eTI5Skh1SWhqdjV0THlTCkNaYTU5c0NySTJBR2VZd1JUbEhTZVlBeis1MUl2dXhCUTRFZmZrZEFIT1Y2Q01xcWkzV3RGTVRDNkdZOGdnZW4KNWllQ1d4am1EMjdaVUQ2S1FoZ3B4clJXL0ZZUW9BVVh2UXdqZi9TVDdad2FVYjdkUlVHL2tTUzBINHpwWDg5NwpJWm1mbFo4NU9rWWNiUG5OZTV5UXpTaXB4NmxWdTZ4aU5HSTFFMHNVT2xXRHVZYU5rcWJHOUFjbFZNd1dWeEpLCmduaklGTmtYZ2lZdFhTQWZlYTcrMUhBV0ZwV0QyRFU1LzFKZGRSd1d4Uk5WejBmTWRXVlNTdDd3c0tma0NwWUwKKzYzQzRpV0VzdDNrdlg1WmJKdnc4TmpueXZMcGx6aCtpYjdNK3prWFlUOXkyenFSMkdVQkdSMnRVS1JYQ254TAp2Snh4Y3lwRlVSbUZ6STc5UjZkMGxSMm8wYTlPRjdGcEpzS3FlRmRieFUybjVaNEZGNVRLc2wrZ1NSaU5OT2ttCmJFZ2VxbWlTQmVHQ2MxcWIzQWRiQ0cxOW5kZU5JZG44RkNDcXdrWGZQK2NBc2xIa3d2Z0Z1WGthakRUem5sdmsKTjF0clN0OHNWNHBBV2phNjNYVkVDRGRDY0F6KzNGNGhvS09Ld0pDY2FOcFE1a1VRUjNpMlR0Smx5Y00zMytGQwpZN0JYTjBVdGU0cWN2d1hxWlZVejl6a1F4U2dxSVhvYmlzUWsrVDhWeUpvVklQVlZZcGJ0YlpOUXZPU3FlSzNaCnl3cGxoNlptd2NTQm8zYzZXQjRMN29PTG5SN1NVcVRNSFcrd21HMlVNYlg0Y1FyY3VmeDlNbURtNjYrS0FRPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUhvbmdrb25nIFBvc3QgUm9vdCBDQSAxIE89SG9uZ2tvbmcgUG9zdAojIFN1YmplY3Q6IENOPUhvbmdrb25nIFBvc3QgUm9vdCBDQSAxIE89SG9uZ2tvbmcgUG9zdAojIExhYmVsOiAiSG9uZ2tvbmcgUG9zdCBSb290IENBIDEiCiMgU2VyaWFsOiAxMDAwCiMgTUQ1IEZpbmdlcnByaW50OiBhODowZDo2ZjozOTo3ODpiOTo0Mzo2ZDo3Nzo0Mjo2ZDo5ODo1YTpjYzoyMzpjYQojIFNIQTEgRmluZ2VycHJpbnQ6IGQ2OmRhOmE4OjIwOjhkOjA5OmQyOjE1OjRkOjI0OmI1OjJmOmNiOjM0OjZlOmIyOjU4OmIyOjhhOjU4CiMgU0hBMjU2IEZpbmdlcnByaW50OiBmOTplNjo3ZDozMzo2Yzo1MTowMDoyYTpjMDo1NDpjNjozMjowMjoyZDo2NjpkZDphMjplNzplMzpmZjpmMTowYTpkMDo2MTplZDozMTpkODpiYjpiNDoxMDpjZjpiMgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRE1EQ0NBaGlnQXdJQkFnSUNBK2d3RFFZSktvWklodmNOQVFFRkJRQXdSekVMTUFrR0ExVUVCaE1DU0VzeApGakFVQmdOVkJBb1REVWh2Ym1kcmIyNW5JRkJ2YzNReElEQWVCZ05WQkFNVEYwaHZibWRyYjI1bklGQnZjM1FnClVtOXZkQ0JEUVNBeE1CNFhEVEF6TURVeE5UQTFNVE14TkZvWERUSXpNRFV4TlRBME5USXlPVm93UnpFTE1Ba0cKQTFVRUJoTUNTRXN4RmpBVUJnTlZCQW9URFVodmJtZHJiMjVuSUZCdmMzUXhJREFlQmdOVkJBTVRGMGh2Ym1kcgpiMjVuSUZCdmMzUWdVbTl2ZENCRFFTQXhNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDCkFRRUFyUDg0dHVsbUFrbmpvclRoa1BsQWozbjU0cjE1L2dLOTdpU1NIU0wyMm9WeWFmN1hQd25VM1pHMUFwelEKalZyaFZjTlFocmtwSnNMajJhRHhhUU1vSUlCRklpMVdwenRVbFZZaVdSOG8zeDhnUFcyaU5yNGpvTEZ1dGJFbgpQemxUQ2VxcmF1aDBzc0psWEk2L2ZNTjRoTTJlRnZ6MUxrOGdLZ2lmZC9QRkhzU2FVbVllU0Y3akVBYVBJcGpoClpZNGJYU05tTzdpbE1sSElocXFocVo1L2RwVENwbXkzUWZEVnlBWTQ1dFFNNHZNN1RHMVFqTVNESjhFVGhGazkKbm5WMHR0Z0NYanFRZXNCQ05uTHNhazNjNzhRQTN4TVlWMThtZU1qV0NubDN2L2V2dDNhNXBRdUVGMTBRNm0vaApxNVVSWDIwOG8xeE5nMXZ5c3htS2dJc0xod0lEQVFBQm95WXdKREFTQmdOVkhSTUJBZjhFQ0RBR0FRSC9BZ0VECk1BNEdBMVVkRHdFQi93UUVBd0lCeGpBTkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQURrYlZQSzdpaDlsZWdZc0MKbUVFSWpFeTgydHZ1Snh1QzUycEY3QmFMVDRXZzg3Snd2VnFXdXNwdWJlNUdpMjduS2k2V3N4a3o2N1NmcUxJMwo3cGlvbDdZdXRtY24xS1pKL1J5VFpYYWVRaS9jSW15YVQvSmFGVG14Y2RjclVlaHRISmpBMlNyMG9ZSjcxY2xCCm9pTUJkRGhWaXcrNUxtZWlJQVEzMnB3TDB4Y2g0SStYZVRSdmhFZ0NJRE1iNWpSRW41Rnc5SUJlaEVQQ0tkSnMKRWhUa1lZMnNFSkNlaEZDNzhKWnZSWitLODhwc1Qvb1JPaFVWUnNQTkg0TmJMVUVTN1ZCblFSTTlJYXVVaXFwTwpmTUd4KzZmV3RTY3ZsNnR1NEIzaTBSd3NIMFRpL0w2Um9aejcxaWxUYzRhZlU5aEREbDNXWTRKeEhZQjB5dmJpCkFtdlpXZz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1TZWN1cmVTaWduIFJvb3RDQTExIE89SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLgojIFN1YmplY3Q6IENOPVNlY3VyZVNpZ24gUm9vdENBMTEgTz1KYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuCiMgTGFiZWw6ICJTZWN1cmVTaWduIFJvb3RDQTExIgojIFNlcmlhbDogMQojIE1ENSBGaW5nZXJwcmludDogYjc6NTI6NzQ6ZTI6OTI6YjQ6ODA6OTM6ZjI6NzU6ZTQ6Y2M6ZDc6ZjI6ZWE6MjYKIyBTSEExIEZpbmdlcnByaW50OiAzYjpjNDo5Zjo0ODpmODpmMzo3MzphMDo5YzoxZTpiZDpmODo1YjpiMTpjMzo2NTpjNzpkODoxMTpiMwojIFNIQTI1NiBGaW5nZXJwcmludDogYmY6MGY6ZWU6ZmI6OWU6M2E6NTg6MWE6ZDU6Zjk6ZTk6ZGI6NzU6ODk6OTg6NTc6NDM6ZDI6NjE6MDg6NWM6NGQ6MzE6NGY6NmY6NWQ6NzI6NTk6YWE6NDI6MTY6MTIKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURiVENDQWxXZ0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRVUZBREJZTVFzd0NRWURWUVFHRXdKS1VERXIKTUNrR0ExVUVDaE1pU21Gd1lXNGdRMlZ5ZEdsbWFXTmhkR2x2YmlCVFpYSjJhV05sY3l3Z1NXNWpMakVjTUJvRwpBMVVFQXhNVFUyVmpkWEpsVTJsbmJpQlNiMjkwUTBFeE1UQWVGdzB3T1RBME1EZ3dORFUyTkRkYUZ3MHlPVEEwCk1EZ3dORFUyTkRkYU1GZ3hDekFKQmdOVkJBWVRBa3BRTVNzd0tRWURWUVFLRXlKS1lYQmhiaUJEWlhKMGFXWnAKWTJGMGFXOXVJRk5sY25acFkyVnpMQ0JKYm1NdU1Sd3dHZ1lEVlFRREV4TlRaV04xY21WVGFXZHVJRkp2YjNSRApRVEV4TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUEvWGVxcFJ5UUJUdkxUSnN6Cmkxb1VSYVRua0JiUjMxZlNJUkNrRi8zZnJOWWZwK1RiZlBmczM3Z0QycFJZL1YxeWZJdy9Yd0ZuZEJXVzR3STgKaDl1dXl3R093dk5teG9WRjlBTEdPclZpc3EvNm5MK2s1dFNBTUpqekRiYVRqNm5VMkRieXNQeUt5aXloRlRPVgpNZHJBRy9MdVlwbUdZeisvM1pNcWc2aDJ1Uk1mdDg1T1FvV1BJdWN1R3ZLVkNiSUZ0VVJPZDZFZ3ZhbnlUZ3A5ClVLMzFCUTFGVDBaeC9TZytVL3NFMkMzWFpSMUtHL3JQTzdBeG1qVnV5SXNHMHdDUjhwUUlaVXl4TkFZQWVvbmkKOE1jRFdjL1YxdWluTXJQbW1FQ0d4YzBuRW92TWU4NjNFVHhpWUFjalBpdEFicFNBQ1cyMnMyOTNielVJVVBzQwpoOFUraVFJREFRQUJvMEl3UURBZEJnTlZIUTRFRmdRVVcvaE5UN0tsaHRRNjB2RmptcUMrQ2ZaWHQ5NHdEZ1lEClZSMFBBUUgvQkFRREFnRUdNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUIKQUtDaE9CWm1McWRXSHlHY0J2b2Q3YmtpeFRnbTJFNVA3S04vZWQ1R0lhR0hkNDhIQ0pxeXBNV3ZEektZQzN4bQpLYmFiZlNWU1NVT3JUQzRyYm5wd3J4WU80d0pzKzBMbUdKMUYyRlhJNkR2ZDUrSDBMZ3NjTkZ4c1dFcjdqSWhRClg1VWN2KzJySXJWbHM0VzZuZys0cmVWNkc0cFFPaDI5RGJ4N1ZGQUx1VUt2VmFBWWdhMWxtZSsrNUp5L3hJV3IKUWJKVWI5d2x6ZTE0NG80TWpRbEozV043V21tV0FpR292VkpaNlgwMXk4aFN5bitCL3RscjAvY1I3U1hmK09mNQpwUHB5bDRSVERhWFFNaGhSZGxrVWJBL3I3RitBakhWRGc4T0ZtUDlNbmkwTjVIZURrMDYxbGdlTEtCT2JqQm1OClFTZEpRTzdlNWlORU9keWhJdGE2QS9JPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049TWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQSAyMDA5IE89TWljcm9zZWMgTHRkLgojIFN1YmplY3Q6IENOPU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOSBPPU1pY3Jvc2VjIEx0ZC4KIyBMYWJlbDogIk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOSIKIyBTZXJpYWw6IDE0MDE0NzEyNzc2MTk1Nzg0NDczCiMgTUQ1IEZpbmdlcnByaW50OiBmODo0OTpmNDowMzpiYzo0NDoyZDo4MzpiZTo0ODo2OTo3ZDoyOTo2NDpmYzpiMQojIFNIQTEgRmluZ2VycHJpbnQ6IDg5OmRmOjc0OmZlOjVjOmY0OjBmOjRhOjgwOmY5OmUzOjM3OjdkOjU0OmRhOjkxOmUxOjAxOjMxOjhlCiMgU0hBMjU2IEZpbmdlcnByaW50OiAzYzo1Zjo4MTpmZTphNTpmYTpiODoyYzo2NDpiZjphMjplYTplYzphZjpjZDplODplMDo3NzpmYzo4NjoyMDphNzpjYTplNTozNzoxNjozZDpmMzo2ZTpkYjpmMzo3OAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRUNqQ0NBdktnQXdJQkFnSUpBTUorUXdST1J6OFpNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1JR0NNUXN3Q1FZRApWUVFHRXdKSVZURVJNQThHQTFVRUJ3d0lRblZrWVhCbGMzUXhGakFVQmdOVkJBb01EVTFwWTNKdmMyVmpJRXgwClpDNHhKekFsQmdOVkJBTU1IazFwWTNKdmMyVmpJR1V0VTNwcFoyNXZJRkp2YjNRZ1EwRWdNakF3T1RFZk1CMEcKQ1NxR1NJYjNEUUVKQVJZUWFXNW1iMEJsTFhONmFXZHVieTVvZFRBZUZ3MHdPVEEyTVRZeE1UTXdNVGhhRncweQpPVEV5TXpBeE1UTXdNVGhhTUlHQ01Rc3dDUVlEVlFRR0V3SklWVEVSTUE4R0ExVUVCd3dJUW5Wa1lYQmxjM1F4CkZqQVVCZ05WQkFvTURVMXBZM0p2YzJWaklFeDBaQzR4SnpBbEJnTlZCQU1NSGsxcFkzSnZjMlZqSUdVdFUzcHAKWjI1dklGSnZiM1FnUTBFZ01qQXdPVEVmTUIwR0NTcUdTSWIzRFFFSkFSWVFhVzVtYjBCbExYTjZhV2R1Ynk1bwpkVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFPbjRqL05qcmRxRzJLZmdRdnZQCmtkNm1KdmlacFdOd3JadXV5ak5BZlcyV2JxRU9STzdoRTUyVVFsS2F2WFdGZEN5b0RoMlR0aGkzakN5b3ovdGMKY2JuYTdQN29mby9rTHgyeXFIV0gyTGVoNVR2UG1VcEcwSU1aZmNDaEVoeVZiVXIwMk1lbFRUTXVoVGxBZFg0VQpmSUFTbUZESFFXZTRvSUJoVktac1RoL2duUTRINmNtNk0rZit3RlVvTEFLQXB4bjFudHhWVXdPWGV3ZEkvNW43Ck40b2t4Rm5NVUJCampxcXBHckNFR29iNVg3dXhVRzZrMFFyTTFYRitINmNiZlBWVGJpSmZ5eXZtMUh4ZHJ0YkMKeGt6bEJRSFo3VmY4d1NONS9QcklKSU9WODdWcVVRSFFkOWJwRXFINUdvUDdnaHU1c0pmMGRnWXpRMG1nL3d1MQorclVDQXdFQUFhT0JnREIrTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RGdZRFZSMFBBUUgvQkFRREFnRUdNQjBHCkExVWREZ1FXQkJUTEQ4YmZRa1BNUGN1MVNDT2hHbnFtS3JzMGFEQWZCZ05WSFNNRUdEQVdnQlRMRDhiZlFrUE0KUGN1MVNDT2hHbnFtS3JzMGFEQWJCZ05WSFJFRUZEQVNnUkJwYm1adlFHVXRjM3BwWjI1dkxtaDFNQTBHQ1NxRwpTSWIzRFFFQkN3VUFBNElCQVFESjBRNWVMdFhNczN3K3kvdzkvdzBvbFpNRXlML2F6WG00UTVEd3BMN3Y4dThoCm1MelUxRjBHOXU1QzdEQnNvS3FweXZHdml2by9DM05xUHVvdVFINGZybFJoZWVzdUNEZlhJL09Nbjc0ZHNlR2sKZGR1ZzRsUVVzYm9jS2FRWTloSzZvaFFVNHpFMXlFRC90K0FGZGxmQkhGbnkrTC9rN1NWaVhJVHdmbjRmczc3NQp0eUVSekFNQlZuQ25FSkllR3pTQkhxMmNHc01FUE8wQ1lkWWVCdk5mT29meUsvRkZoK1U5ck5ISFY0UzlhNjdjCjJQbTJHMkp3Q3owMnlVTHlNdGQ2WWViUzJ6M1B5S25KbTl6YldFVFhieml2ZjNqVG82MGFkYm9jd1RaOGp4NXQKSE1OMVJxNDFCYWIyWEQwaDdsYnd5WUlpTFhwVXEzRERmU0psZ25DVwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049R2xvYmFsU2lnbiBPPUdsb2JhbFNpZ24gT1U9R2xvYmFsU2lnbiBSb290IENBIC0gUjMKIyBTdWJqZWN0OiBDTj1HbG9iYWxTaWduIE89R2xvYmFsU2lnbiBPVT1HbG9iYWxTaWduIFJvb3QgQ0EgLSBSMwojIExhYmVsOiAiR2xvYmFsU2lnbiBSb290IENBIC0gUjMiCiMgU2VyaWFsOiA0ODM1NzAzMjc4NDU5NzU5NDI2MjA5OTU0CiMgTUQ1IEZpbmdlcnByaW50OiBjNTpkZjpiODo0OTpjYTowNToxMzo1NTplZToyZDpiYToxYTpjMzozZTpiMDoyOAojIFNIQTEgRmluZ2VycHJpbnQ6IGQ2OjliOjU2OjExOjQ4OmYwOjFjOjc3OmM1OjQ1Ojc4OmMxOjA5OjI2OmRmOjViOjg1OjY5Ojc2OmFkCiMgU0hBMjU2IEZpbmdlcnByaW50OiBjYjpiNToyMjpkNzpiNzpmMToyNzphZDo2YTowMToxMzo4Njo1YjpkZjoxYzpkNDoxMDoyZTo3ZDowNzo1OTphZjo2Mzo1YTo3YzpmNDo3MjowZDpjOTo2MzpjNTozYgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRFh6Q0NBa2VnQXdJQkFnSUxCQUFBQUFBQklWaFRDS0l3RFFZSktvWklodmNOQVFFTEJRQXdUREVnTUI0RwpBMVVFQ3hNWFIyeHZZbUZzVTJsbmJpQlNiMjkwSUVOQklDMGdVak14RXpBUkJnTlZCQW9UQ2tkc2IySmhiRk5wCloyNHhFekFSQmdOVkJBTVRDa2RzYjJKaGJGTnBaMjR3SGhjTk1Ea3dNekU0TVRBd01EQXdXaGNOTWprd016RTQKTVRBd01EQXdXakJNTVNBd0hnWURWUVFMRXhkSGJHOWlZV3hUYVdkdUlGSnZiM1FnUTBFZ0xTQlNNekVUTUJFRwpBMVVFQ2hNS1IyeHZZbUZzVTJsbmJqRVRNQkVHQTFVRUF4TUtSMnh2WW1Gc1UybG5iakNDQVNJd0RRWUpLb1pJCmh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTXdsZHBCNUJuZ2lGdlhBZzdhRXlpaWUvUVYyRWNXdGlITDgKUmdKRHg3S0tuUVJmSk1zdVMrRmdna2JoVXFzTWdVZHdiTjFrMGV2MUxLTVBnajBNSzY2WDE3WVVoaEI1dXpzVApnSGVNQ09GSjBtcGlMeDllK3BabzM0a25sVGlmQnRjK3ljc21XUTF6M3JESTZTWU9neFhHNzF1TDBnUmd5a21tCktQWnBPL2JMeUNpUjVaMktZVmMzckhRVTNIVGdPdTV5THk2Yys5Qzd2L1U5QU9FR00raUNLNjVUcGpvV2M0emQKUVE0Z09zQzBwNkhwc2srUUxqSmc2VmZMdVFTU2FHamxPQ1pnZGJLZmQvK1JGTyt1SUVuOHJVQVZTTkVDTVdFWgpYcmlYNzYxM3QyU2Flcjlmd1JQdm0yTDdEV3pnVkdrV3FRUGFidW1EazNGMnhtbUZnaGNDQXdFQUFhTkNNRUF3CkRnWURWUjBQQVFIL0JBUURBZ0VHTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SFFZRFZSME9CQllFRkkvd1MzK28KTGtVa3JrMVErbU9haTk3aTNSdThNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUJBUUJMUU52QVVLcit5QXp2OTVaVQpSVW03bGdBSlFheXpFNGFHS0Fjenltdm1kTG02QUMydXBBclQ5Zkh4RDRxL2MyZEtnOGRFZTNqZ3IyNXNid01wCmpqTTVSY09PNUxsWGJLcjhFcGJzVThZdDVDUnN1WlJqKzl4VGFHZFdQb080enpVaHc4bG8vczdhd2xPcXpKQ0sKNmZCZFJveVYzWHBZS0JvdkhkN05BRGRCaisxRWJkZFRLSmQrODJjRUhoWFhpcGEwMDk1TUo2Uk1HM056ZHZRWAptY0lmZWc3akxRaXRDaHdzL3p5clZRNFBrWDQyNjhOWFNiN2hMaTE4WUl2RFFWRVRJNTNPOXpKcmxBR29tZWNzCk14ODZPeVhTaGtET095eUdlTWxoTHhTNjd0dFZiOStFN2dVSlRiMG8ySExPMDJKUVpSN3JrcGVETWRtenRjcEgKV0Q5ZgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049QXV0b3JpZGFkIGRlIENlcnRpZmljYWNpb24gRmlybWFwcm9mZXNpb25hbCBDSUYgQTYyNjM0MDY4CiMgU3ViamVjdDogQ049QXV0b3JpZGFkIGRlIENlcnRpZmljYWNpb24gRmlybWFwcm9mZXNpb25hbCBDSUYgQTYyNjM0MDY4CiMgTGFiZWw6ICJBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgiCiMgU2VyaWFsOiA2MDQ3Mjc0Mjk3MjYyNzUzODg3CiMgTUQ1IEZpbmdlcnByaW50OiA3MzozYTo3NDo3YTplYzpiYjphMzo5NjphNjpjMjplNDplMjpjODo5YjpjMDpjMwojIFNIQTEgRmluZ2VycHJpbnQ6IGFlOmM1OmZiOjNmOmM4OmUxOmJmOmM0OmU1OjRmOjAzOjA3OjVhOjlhOmU4OjAwOmI3OmY3OmI2OmZhCiMgU0hBMjU2IEZpbmdlcnByaW50OiAwNDowNDo4MDoyODpiZjoxZjoyODo2NDpkNDo4Zjo5YTpkNDpkODozMjo5NDozNjo2YTo4Mjo4ODo1Njo1NTozZjozYjoxNDozMDozZjo5MDoxNDo3Zjo1ZDo0MDplZgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJR0ZEQ0NBL3lnQXdJQkFnSUlVK3c3N3Z1eVNGOHdEUVlKS29aSWh2Y05BUUVGQlFBd1VURUxNQWtHQTFVRQpCaE1DUlZNeFFqQkFCZ05WQkFNTU9VRjFkRzl5YVdSaFpDQmtaU0JEWlhKMGFXWnBZMkZqYVc5dUlFWnBjbTFoCmNISnZabVZ6YVc5dVlXd2dRMGxHSUVFMk1qWXpOREEyT0RBZUZ3MHdPVEExTWpBd09ETTRNVFZhRncwek1ERXkKTXpFd09ETTRNVFZhTUZFeEN6QUpCZ05WQkFZVEFrVlRNVUl3UUFZRFZRUURERGxCZFhSdmNtbGtZV1FnWkdVZwpRMlZ5ZEdsbWFXTmhZMmx2YmlCR2FYSnRZWEJ5YjJabGMybHZibUZzSUVOSlJpQkJOakkyTXpRd05qZ3dnZ0lpCk1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRREtsbXVPNnZqNzhhSTE0SDlNMnVERFV0ZDkKdGhESUFsNnpReXJFVDJxeXloeGRLSnA0RVJwcFdWZXZ0U0JDNUlzUDV0OWJwZ09TTC9VUjVHTFhNbkU0MlFRTQpjYXM5VVg0UEI5OWpCVnpwdjVSdndTbUN3TFRhVWJEQlBMdXROMHBjeXZGTE5nNGtxNy9EaEhmOXFGRDBzZWZHCkw5SXRXWTE2Q2s2V2FWSUNxamFZN1B6NkZJTU1OeC9Ka2pkLzE0RXQ1Y1M1NEQ0MC9tZjBQbWJSMC9SQXoxNWkKTkE5d0JqNGdHRnJPOTNJYkpXeVRkQlNUbzNPeERxcUhFQ05aWHlBRkdVZnRhSTZTRXNwZC9OWXJzcEk4SU0vaApYNjhndnFCMmYzYmw3QnFHWVRNKzUzdTBQNkFQanFLNWFtKzVoeVp2UVd5SXBsRDlhbU1MOVpNV0d4bVBzdTJiCm04bVE5UUVNM3hrOUR6NDRJOGt2and6UkF2NGJWZFpPMEkwOHIwK2s4LzZ2S3RNRm5Ya0lvY3RYTWJTY3lKQ3kKWi9RWUZwTTYvRWZZMFhpV01SKzZLd3hmWFptdFk0bGFKQ0IyMk4vOXEwNm1JcXFkWHVZbmluMW9LYVBuaXJqYQpFYnNYTFptZEV5Ukc5OFhpMkorT2Y4ZVBkRzFhc3VoeTlhenVKQkN0THhUYS95MmFSbkZIdmtMZnV3SGI5SC9UCktJOHhXVnZUeVFLbXRGTEticGY3UThVSUptK0s5THY5bnlpcURkVkY4eE02SGRqQWVJOUJaendlbEdTdWV3dkYKNk5rQmlEa2FsNFprUWRVN2h3eHUrZy9HdlVnVXZ6bE4xSjVCdG8rV0hXT1drOW1WQm5neGFKNDNCanVBaVVWaApPU1BIRzBTakZlVWMrSkl3dXdJREFRQUJvNEh2TUlIc01CSUdBMVVkRXdFQi93UUlNQVlCQWY4Q0FRRXdEZ1lEClZSMFBBUUgvQkFRREFnRUdNQjBHQTFVZERnUVdCQlJsemV1ck5SNEFQbjdWZE1BY3RITkhEaHBrTHpDQnBnWUQKVlIwZ0JJR2VNSUdiTUlHWUJnUlZIU0FBTUlHUE1DOEdDQ3NHQVFVRkJ3SUJGaU5vZEhSd09pOHZkM2QzTG1acApjbTFoY0hKdlptVnphVzl1WVd3dVkyOXRMMk53Y3pCY0JnZ3JCZ0VGQlFjQ0FqQlFIazRBVUFCaEFITUFaUUJ2CkFDQUFaQUJsQUNBQWJBQmhBQ0FBUWdCdkFHNEFZUUJ1QUc4QWRnQmhBQ0FBTkFBM0FDQUFRZ0JoQUhJQVl3QmwKQUd3QWJ3QnVBR0VBSUFBd0FEZ0FNQUF4QURjd0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dJQkFCZDlvUG0wM2NYRgo2NjFMSkxXaEFxdmRwWWhLc2c5VlN5dFhqRHZsTWQzK3hETHg1MXRrbGpZeUdPeWxNbmZYNDBTMndCRXFnTGs5CmFtNThtOU90L01QV28rWmtLWHpSNFRnZWdpdi9KMld2K3hZVnhDNXhoT1cxLy9xa1I3MWtNcnYySllTaUowTDEKSUxEQ0V4QVJ6UkFWdWtLUUt0SkU0WlltNnpGSUV2MHEyc2tHejNRZXFVdlZoeWo1ZVRTU1BpNUU2UGFQVDQ4MQpQeVd6T2R4aktwQnJJRi9FVWhKT2x5d3FySjJYM2tqeW8yYmJ3dEtEbGFabXA1NGxEK2tMTTVGbENsckQyVlFTCjNhL0RUZzRmSmw0TjNMT043TldCY043U1R5UUY4MnhPOVV4SlpvM1IvOUlMSlVGSS9sR0V4a0t2Z0FUUDBINWsKU2VUeTM2THNzVXpBS2gzbnRMRmxvc1M4OFpqMHFuQUhZN1M0Mmp0TStrQWlNRnNScHZBRkRzWUNBMGlyaHB1RgozZHZkNnFKMmdITjk5WndFeEVXTjU3a2NpNTdxMTNYUmNySGVkVVRuUW4zaVYydDkzSm04UFlNbzZvQ1RqY1ZNClpjRndnYmc0L0VNeHN2WURORWV5clBzaUJzc2UzUmRISEY5bXVkTWFvdG9Sc2FTOEk4bmt2b2YvdVpTMitGMGcKU3RSZjU3MW9lMlh5RlI3U09xa3Q2ZGhySkt5WFdFUkhyVmtZOFNGbGNON09OR0NvUVBIelBLVERLQ09NL2ljegpRMENnRnp6cjZqdXdjcWFqdVVwTFhoWkk5TEs4eUl5U3haMmZySEkydkRTQU5HdXBpNUxBdUJmdDdIWlQ5U1FCCmpMTWk2RXQ4VmNhZCtxTVV1MldGYm01UEVuNEtQSjJWCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1JemVucGUuY29tIE89SVpFTlBFIFMuQS4KIyBTdWJqZWN0OiBDTj1JemVucGUuY29tIE89SVpFTlBFIFMuQS4KIyBMYWJlbDogIkl6ZW5wZS5jb20iCiMgU2VyaWFsOiA5MTc1NjMwNjU0OTAzODkyNDE1OTU1MzY2ODY5OTE0MDI2MjEKIyBNRDUgRmluZ2VycHJpbnQ6IGE2OmIwOmNkOjg1OjgwOmRhOjVjOjUwOjM0OmEzOjM5OjkwOjJmOjU1OjY3OjczCiMgU0hBMSBGaW5nZXJwcmludDogMmY6Nzg6M2Q6MjU6NTI6MTg6YTc6NGE6NjU6Mzk6NzE6YjU6MmM6YTI6OWM6NDU6MTU6NmY6ZTk6MTkKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDI1OjMwOmNjOjhlOjk4OjMyOjE1OjAyOmJhOmQ5OjZmOjliOjFmOmJhOjFiOjA5OjllOjJkOjI5OjllOjBmOjQ1OjQ4OmJiOjkxOjRmOjM2OjNiOmMwOmQ0OjUzOjFmCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGOFRDQ0E5bWdBd0lCQWdJUUFMQzNXaFpJWDcvaHkvV0wxeG5tZlRBTkJna3Foa2lHOXcwQkFRc0ZBREE0Ck1Rc3dDUVlEVlFRR0V3SkZVekVVTUJJR0ExVUVDZ3dMU1ZwRlRsQkZJRk11UVM0eEV6QVJCZ05WQkFNTUNrbDYKWlc1d1pTNWpiMjB3SGhjTk1EY3hNakV6TVRNd09ESTRXaGNOTXpjeE1qRXpNRGd5TnpJMVdqQTRNUXN3Q1FZRApWUVFHRXdKRlV6RVVNQklHQTFVRUNnd0xTVnBGVGxCRklGTXVRUzR4RXpBUkJnTlZCQU1NQ2tsNlpXNXdaUzVqCmIyMHdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFESjAzcktEeDZzcDRib0ZtVnEKc2NJYlJUSnhsZG4rRUZ2TXIrZWxlUUdQaWNQSzhsVng5M2UrZDVUemNxUXNSTmlla3BzVU9xSG5KSkFLQ2xhTwp4ZGdtbE9IWlNPRXRQdG9LY3Qyam1SWGFnYUtIOUh0dUpuZUpXSzNXNnd5eVFYcHpibTNiZW5oQjZRaUlFbjZICkxtWVJZMnhVK3p5ZGNzQzhMdi9DdDkwTmR1TTYxL2UwYUw2aTllT0Jic0ZHYjEyTjRFM0dWRldKR2pNeENyRlgKdWFPS21NUHNPelRGbFVGcGZuWENQQ0RGWWJwUlI2QWdrSk9oa0V2elRueUZSVlNhMFFVbVFiQzFUUjB6dnNRRAp5Q1Y4d1hEYk8vUUpMVlFuU0t3djRjU3NQc2pMa2t4VE9UY2o3Tk1CK2VBSlJFMU5aTURoRFZxSElyeXRHNlArCkpyVVY4NmY4aEJucDdLR0l0RVJwaElQemlkRjBCcW5NQzliQzNpZUZVQ2JLRjdqSmVvZFdMQm9CSG15K0U2MFEKckxVazlUaVJvZFpMMnZHNzB0NUh0Zkc4Z2ZaWmE4OFpVK21ORmN0S3k2bHZST1ViUWMvaGhxZkswR3FmdkV5TgpCak5hb29YbGtEV2dZbHdXVHZEam92b0RHclFzY2JOWUxONTdDOXNhRCt2ZUlSOEdkd1lEc01udm1mekF1VThMCmhpaiswcm5xNDlxbHcwZHBFdURiOFBZWmkrMTdjTmNDMXUySEdDZ3NCQ1JNZCtSSWlockdPNXJVRDhyNmRkSUIKUUZxTmViK0x6MHZQcWhiQmxlU3RUSW8rRjVIVXNXTGxndVdBQktRRGZvMi8ybitpRDVkUEROTU4rOWZSNVhKKwpITWgzLzF1YUQ3ZXVCVWJsOGFnVzdFZWtGd0lEQVFBQm80SDJNSUh6TUlHd0JnTlZIUkVFZ2Fnd2dhV0JEMmx1ClptOUFhWHBsYm5CbExtTnZiYVNCa1RDQmpqRkhNRVVHQTFVRUNndytTVnBGVGxCRklGTXVRUzRnTFNCRFNVWWcKUVRBeE16TTNNall3TFZKTlpYSmpMbFpwZEc5eWFXRXRSMkZ6ZEdWcGVpQlVNVEExTlNCR05qSWdVemd4UXpCQgpCZ05WQkFrTU9rRjJaR0VnWkdWc0lFMWxaR2wwWlhKeVlXNWxieUJGZEc5eVltbGtaV0VnTVRRZ0xTQXdNVEF4Ck1DQldhWFJ2Y21saExVZGhjM1JsYVhvd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUMKQVFZd0hRWURWUjBPQkJZRUZCMGNaUTZvOGlWN3RKSFA1TEd4NXIxVmRHd0ZNQTBHQ1NxR1NJYjNEUUVCQ3dVQQpBNElDQVFCNHBnd1dTcDlNaURyQXl3NmxGbjJmdVVoZkdJOE5ZamIyelJscnJLdlY5cEY5cm5IelA3TU9lSVdiCmxhUW5JVWRDU254SU92VkZmTE1NamxGNHJKVVQzc2I5ZmJnYWtFeXJrZ1BIN1VJQnpnL1lzZnFpa3VGZ2JhNTYKYXdtcXhpbnVhRWxuTUlBa2VqRVdPVnQrOFJ3dTNXd0pyZkl4d1lKT3VidjV2cjhxaFQvQVFLTTZXZnhaU3p3bwpKTnUwRlhXdURZaTZMblBBdlZpSDVVTHk2MTd1SGpBaW1jczMwY1FoYklIc3ZtMG01aHprUWlDZVI3Q3NnMWx3CkxEWFdyelkwdE0wNytES283K040aWZ1TlJTemFuTGgrUUJ4aDV6NmlraXhMOHMzNm1MWXAvL1B5ZTZrZkxxQ1QKVnl2ZWhRUDVhVGZMbm5ocUJiVEZNWGlKN0hxbmhlRzVlenpldmg1NWhNNmZjQTVad2pVdWtDb3gyZVJGZWtHawpMaE9iTkE1bWUwbXJaSmZRUnNONW5YSlFZNmFZV3dhOVNHM1lPWU53NkRYd0JkR3F2T1BieUFMcWZQMkMyc0piClVqV3VtRHF0dWpXVEk2Y2ZTTjAxUnBpeUVHamtwVEhDQ2xndUdZRVF5VkIxL09wYUZzNFIxKzd2VUlndFlmOC8KUW5NRmxFUFZqanhPQVRvWnBSOUdUbmZRWGVXQklpR0gvcFI5aE5pVHJkWm9RMGl5Mit0ekpPZVJmMVNrdG9BKwpuYU04VEhMQ1Y4U2cxTXc0Sjg3VkJwNmlTTm5wbjg2Q2NEYVRtanZmbGlIaldiY00ycEUzOFAxWldyT1p5R2xzClF5WUJOV05nVllrRE9uWFl1a3JaVlAvdTNvRFlMZEU0MVY0dEM1aDlQbXpiL0NhSXh3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUNoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4IE89QUMgQ2FtZXJmaXJtYSBTLkEuCiMgU3ViamVjdDogQ049Q2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDggTz1BQyBDYW1lcmZpcm1hIFMuQS4KIyBMYWJlbDogIkNoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4IgojIFNlcmlhbDogMTE4MDY4MjI0ODQ4MDE1OTcxNDYKIyBNRDUgRmluZ2VycHJpbnQ6IDVlOjgwOjllOjg0OjVhOjBlOjY1OjBiOjE3OjAyOmYzOjU1OjE4OjJhOjNlOmQ3CiMgU0hBMSBGaW5nZXJwcmludDogNzg6NmE6NzQ6YWM6NzY6YWI6MTQ6N2Y6OWM6NmE6MzA6NTA6YmE6OWU6YTg6N2U6ZmU6OWE6Y2U6M2MKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDA2OjNlOjRhOmZhOmM0OjkxOmRmOmQzOjMyOmYzOjA4OjliOjg1OjQyOmU5OjQ2OjE3OmQ4OjkzOmQ3OmZlOjk0OjRlOjEwOmE3OjkzOjdlOmUyOjlkOjk2OjkzOmMwCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlIVHpDQ0JUZWdBd0lCQWdJSkFLUGFRbjZrc2E3YU1BMEdDU3FHU0liM0RRRUJCUVVBTUlHdU1Rc3dDUVlEClZRUUdFd0pGVlRGRE1FRUdBMVVFQnhNNlRXRmtjbWxrSUNoelpXVWdZM1Z5Y21WdWRDQmhaR1J5WlhOeklHRjAKSUhkM2R5NWpZVzFsY21acGNtMWhMbU52YlM5aFpHUnlaWE56S1RFU01CQUdBMVVFQlJNSlFUZ3lOelF6TWpnMwpNUnN3R1FZRFZRUUtFeEpCUXlCRFlXMWxjbVpwY20xaElGTXVRUzR4S1RBbkJnTlZCQU1USUVOb1lXMWlaWEp6CklHOW1JRU52YlcxbGNtTmxJRkp2YjNRZ0xTQXlNREE0TUI0WERUQTRNRGd3TVRFeU1qazFNRm9YRFRNNE1EY3oKTVRFeU1qazFNRm93Z2E0eEN6QUpCZ05WQkFZVEFrVlZNVU13UVFZRFZRUUhFenBOWVdSeWFXUWdLSE5sWlNCagpkWEp5Wlc1MElHRmtaSEpsYzNNZ1lYUWdkM2QzTG1OaGJXVnlabWx5YldFdVkyOXRMMkZrWkhKbGMzTXBNUkl3CkVBWURWUVFGRXdsQk9ESTNORE15T0RjeEd6QVpCZ05WQkFvVEVrRkRJRU5oYldWeVptbHliV0VnVXk1QkxqRXAKTUNjR0ExVUVBeE1nUTJoaGJXSmxjbk1nYjJZZ1EyOXRiV1Z5WTJVZ1VtOXZkQ0F0SURJd01EZ3dnZ0lpTUEwRwpDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQ3ZBTXR3Tnl1QVdrbzZiSGlVZmFOL0doLzJOZFc5CjI4c05SSEkrSnJLUVVycGpPeWhZYjZXemJaU204OTFrREZYMjl1ZnlJaUtBWHVGaXhyWXA0WUZzOHIvbGZUSnEKVktBeUdWbitINHZYUFdDR2hTUnY0eEd6ZHo0Z2xqVWhhN01JMlhBdVpQZUVrbFBXRHJDUWlvcmpoNDBHMDcyUQpEdUtab1J1R0R0cWFDcnNMWVZBR1V2R2VmM2JzeXcvUUhnM1BtVEE5SE1SRkVGaXMxdFBvMStYcXhRRUhkOVpSCjVnTi9pa2lsVFdoMXVlbThuazRaY2ZVeVM1eHRZQmtMKzh5ZGRkeS9KczJQazNnNWVYTmVKUTdLWE90M0VnZkwKWkVGSGNwT3JVTVByQ1haa05OSTV0M1lSQ1ExMlJjU3ByajFxcjdWOVpTK1VXQkRzWEh5dmZ1SzJHTm5RbTA1YQpTZCtwWmd2TVBNWjRmS2VjSGVQT2psTytCZDVnRDJ2bEd0cy80K0VoeVNuQjhlc0huRkliQVVSUlBIc2wxOFRsClVsUmRKUWZLRmlDNHJlUkI3bm9JL3Bsdmc2YVJBckJzTmxWcTUzMzFsdWJLZ2RhWDhaU0Q2ZTJ3c1dzU2FSNnMKKzEycHhaanB0RnRZZXI0OW9rUTZZMW5VQ3lYZUcwKzk1UUdlemRJcDFaOFhHUXB2dnd5UTB3bGYyZU9LTmN4NQpXazBaTjVLM3hNR3RyL1I1SkpxeUFRdXhyMXlXODRBeSsxdzltUEdnUDByZXZxK1VMdGxWbWhkdVlKMWpiTGhqCnlhNkJYQmcxNEpDN3ZqeFBOeUs1ZnV2UG5uY2hwajA0Z2Z0STJqRTlLK09KOWRDMXZYN2dVTVFTaWJNam1oQXgKaGR1dWIrODRNeGgyRVFJREFRQUJvNElCYkRDQ0FXZ3dFZ1lEVlIwVEFRSC9CQWd3QmdFQi93SUJEREFkQmdOVgpIUTRFRmdRVStTU3NEN0sxK0huQSttQ0lHOFRaVFFLZUZ4a3dnZU1HQTFVZEl3U0IyekNCMklBVStTU3NEN0sxCitIbkErbUNJRzhUWlRRS2VGeG1oZ2JTa2diRXdnYTR4Q3pBSkJnTlZCQVlUQWtWVk1VTXdRUVlEVlFRSEV6cE4KWVdSeWFXUWdLSE5sWlNCamRYSnlaVzUwSUdGa1pISmxjM01nWVhRZ2QzZDNMbU5oYldWeVptbHliV0V1WTI5dApMMkZrWkhKbGMzTXBNUkl3RUFZRFZRUUZFd2xCT0RJM05ETXlPRGN4R3pBWkJnTlZCQW9URWtGRElFTmhiV1Z5ClptbHliV0VnVXk1QkxqRXBNQ2NHQTFVRUF4TWdRMmhoYldKbGNuTWdiMllnUTI5dGJXVnlZMlVnVW05dmRDQXQKSURJd01EaUNDUUNqMmtKK3BMR3UyakFPQmdOVkhROEJBZjhFQkFNQ0FRWXdQUVlEVlIwZ0JEWXdOREF5QmdSVgpIU0FBTUNvd0tBWUlLd1lCQlFVSEFnRVdIR2gwZEhBNkx5OXdiMnhwWTNrdVkyRnRaWEptYVhKdFlTNWpiMjB3CkRRWUpLb1pJaHZjTkFRRUZCUUFEZ2dJQkFKQVNyeUkxd3FNNThDN2U2YlhwZUh4SXZqOTlSWkplNmRxeEdmd1cKUEorMFcyYWVhdWZEdVYySTZBK3R6eU1QM2lVNlhzeFBwY0cxTGF3azBsZ0gzcUxQYVlSZ00rZ1FEUk9wSTlDRgo1WTU3cHA0OWNoTnlNL1dxZmNaakh3ajAvZ0YvSk04ckxGUUozdUlyYlpMR09VOFc2angrZWtiVVJXcEdxT3QxCmdsYW5xNkI4YUJNejlwMHc4RzhuT1NRaktwRDlrQ2sxOHBQZk5LWEc5L2p2akE5aVNueXUwL1ZVK0kyMm1sYUgKRm9JNk02dGFJZ2ozZ3JycUx1QkhtclMxUmFNRk85bmNMa1ZBTytyY2YrZzc2OUhzSnRnMXBEREZPcXhYbnJOMgpwU0I3K1I1S0JXSUJwaWgxWUplU0RXNCtUVGRERFpJVm5CZ2l6Vkdab0NrYVBGK0tNak5iTU1lSkwwZVlENk1ECnh2YnhyTjh5OE5tQkd1U2N2ZmFBRlBEUkxMbUY5ZGlqc2NpbEllVWNFNWZ1RHIzZkthbnZORk5iMCtScUU0UUcKdGpJQ3hGS3VJdExjc2lGQ0d0cEE4Q25KN0FvTVhPTFF1c3hJMHpjS3pCSUtpbm13UFFOL2FVdjBOQ0I5c3pUcQpqa3RrOVQ3OXN5Tm5GUTBFdVBBdHdRbFJQTEpzRmZDbEk5ZURkT1RsTHNuK21DZEN4cXZHbnJEUVd6aWxtMURlCmZoaVl0VVU3OW5tMDZQY2Fld2FEKzlDTDJydkh2UmlyQ0c4OGdHdEFQeGtadW1XSzVyN1ZYTk0yMSs5QVVpUmcKT0djRU1leVA4NExHM3JsVjh6c3hrVnJjdFFnVnJYWWxDZzE3TG9maURLWUd2Q1lRYlRlZDdOMTRqSHlBeGZEWgpkMGpRCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDggTz1BQyBDYW1lcmZpcm1hIFMuQS4KIyBTdWJqZWN0OiBDTj1HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDggTz1BQyBDYW1lcmZpcm1hIFMuQS4KIyBMYWJlbDogIkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwOCIKIyBTZXJpYWw6IDE0NTQxNTExNzczMTExNzg4NDk0CiMgTUQ1IEZpbmdlcnByaW50OiA5ZTo4MDpmZjo3ODowMTowYzoyZTpjMTozNjpiZDpmZTo5Njo5MDo2ZTowODpmMwojIFNIQTEgRmluZ2VycHJpbnQ6IDRhOmJkOmVlOmVjOjk1OjBkOjM1OjljOjg5OmFlOmM3OjUyOmExOjJjOjViOjI5OmY2OmQ2OmFhOjBjCiMgU0hBMjU2IEZpbmdlcnByaW50OiAxMzo2MzozNTo0Mzo5MzozNDphNzo2OTo4MDoxNjphMDpkMzoyNDpkZTo3MjoyODo0ZTowNzo5ZDo3Yjo1MjoyMDpiYjo4ZjpiZDo3NDo3ODoxNjplZTpiZTpiYTpjYQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJSFNUQ0NCVEdnQXdJQkFnSUpBTW5OMCtuVmZTUE9NQTBHQ1NxR1NJYjNEUUVCQlFVQU1JR3NNUXN3Q1FZRApWUVFHRXdKRlZURkRNRUVHQTFVRUJ4TTZUV0ZrY21sa0lDaHpaV1VnWTNWeWNtVnVkQ0JoWkdSeVpYTnpJR0YwCklIZDNkeTVqWVcxbGNtWnBjbTFoTG1OdmJTOWhaR1J5WlhOektURVNNQkFHQTFVRUJSTUpRVGd5TnpRek1qZzMKTVJzd0dRWURWUVFLRXhKQlF5QkRZVzFsY21acGNtMWhJRk11UVM0eEp6QWxCZ05WQkFNVEhrZHNiMkpoYkNCRAphR0Z0WW1WeWMybG5iaUJTYjI5MElDMGdNakF3T0RBZUZ3MHdPREE0TURFeE1qTXhOREJhRncwek9EQTNNekV4Ck1qTXhOREJhTUlHc01Rc3dDUVlEVlFRR0V3SkZWVEZETUVFR0ExVUVCeE02VFdGa2NtbGtJQ2h6WldVZ1kzVnkKY21WdWRDQmhaR1J5WlhOeklHRjBJSGQzZHk1allXMWxjbVpwY20xaExtTnZiUzloWkdSeVpYTnpLVEVTTUJBRwpBMVVFQlJNSlFUZ3lOelF6TWpnM01Sc3dHUVlEVlFRS0V4SkJReUJEWVcxbGNtWnBjbTFoSUZNdVFTNHhKekFsCkJnTlZCQU1USGtkc2IySmhiQ0JEYUdGdFltVnljMmxuYmlCU2IyOTBJQzBnTWpBd09EQ0NBaUl3RFFZSktvWkkKaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFNRGZWdFBrT3B0MlJiUVQyLy9CdGhtTE4wRVlsVkpINnhlZApLWWlPTld3R01pNUhZdk5KQkw5OVJEYXhjY3k5V2dsejFkbUZSUCtSVnlYZlhqYU9jTkZjY1VNZDJkcnZYTkw3Ckc3MDZ0Y3V0bzh4RXB3MnVJUlUvdVhwYmtuWFlwQkk0aVJtS3Q0RFM0akp2VnB5UjFvZ1FDN04wWkpKMFlQUDIKenhoUFlMSWowTWM3em1GTG1ZL0NETkJBc3BqY0RhaE9vN2tLcm1DZ3JVVlNZN3BtdldqZytiNGFxSUc3SGtGNApkZFBCL2dCVnNJZFU2Q2VRTlIxTU02MlgvSmN1bUlTL0xNbWp2OUdZRVJUdFkvakttSWhZRjVudFJRT1hmanlHCkhvaU12dktSaEk5bE5OZ0FUSDIzTVJkYUtYb0tHQ1F3b3plMWVxa0JmU2JXK1E2T1dmSDlHek8xS1RzWE8wRzIKSWQzVXdEMmxuNThmUTFESnU3eHNlcGVZN3MyTUgvdWNVYTZMY0wwbm4zSEFhNng5a0dibzExMDZEYkRWd28zVgp5SjJkd1czUTBMOVI1T1A0d3pnMnJ0YW5kZWF2aEVOZGs1SU1hZ2ZlT3gyWUl0YXN3VFhibzZBbC8zSzFkaDNlCmJla3NaaXhTaE5CRmtzNGM1ZVV6SGR3SFUxU2pxb0k3bWpjdjNOMmdaT25tM2IydS9HU0ZIVHlueVFiZWhQOXIKNkdzYVBNV2lzMEw3aXdrK1h3aFN4MkxFMUFWeHY4Ums1UGloZytnK0VwdW9IdFEyVFM5eDlvMG85b09wRTlKaAp3Wkc3U01BMGowR01TMHpiYVJML1VKU2NJSU5aYysxOG9mTHgvZDMzU2RORFdLQldZOG85UGVVMVZsbnBEc29nCnpDdExreWtQQWdNQkFBR2pnZ0ZxTUlJQlpqQVNCZ05WSFJNQkFmOEVDREFHQVFIL0FnRU1NQjBHQTFVZERnUVcKQkJTNUNjcWNIdHZUYkRwcnJ1MVU4VnVUQmpVdVhqQ0I0UVlEVlIwakJJSFpNSUhXZ0JTNUNjcWNIdHZUYkRwcgpydTFVOFZ1VEJqVXVYcUdCc3FTQnJ6Q0JyREVMTUFrR0ExVUVCaE1DUlZVeFF6QkJCZ05WQkFjVE9rMWhaSEpwClpDQW9jMlZsSUdOMWNuSmxiblFnWVdSa2NtVnpjeUJoZENCM2QzY3VZMkZ0WlhKbWFYSnRZUzVqYjIwdllXUmsKY21WemN5a3hFakFRQmdOVkJBVVRDVUU0TWpjME16STROekViTUJrR0ExVUVDaE1TUVVNZ1EyRnRaWEptYVhKdApZU0JUTGtFdU1TY3dKUVlEVlFRREV4NUhiRzlpWVd3Z1EyaGhiV0psY25OcFoyNGdVbTl2ZENBdElESXdNRGlDCkNRREp6ZFBwMVgwanpqQU9CZ05WSFE4QkFmOEVCQU1DQVFZd1BRWURWUjBnQkRZd05EQXlCZ1JWSFNBQU1Db3cKS0FZSUt3WUJCUVVIQWdFV0hHaDBkSEE2THk5d2IyeHBZM2t1WTJGdFpYSm1hWEp0WVM1amIyMHdEUVlKS29aSQpodmNOQVFFRkJRQURnZ0lCQUlDSWYzRGVraWpaQlpSRy81QlhxZkV2M3hvTmEvcDhEaHhKSkhrbjJFYXFieWxaClVvaHdFdXJkUGZXYlUxUnY0V0NpcUFtNTdPdFpmTVkxOGR3WTZmRm41YSs2UmVBSjNzcEVEOElYRG5lUlJYb3oKWDErV0xHaUx3VWVQbUpzOXdPekw5ZFdDa29RMTBiNDJPRlp5TVZ0SExhb1hwR05SNndvQnJYL3NkWjdMb1IveApmeEt4dWVSa2YyZldJeXIwdURsZG1PZ2hwK0c5UFVJYWRKcHdyMmhzVUYxSnovLzdEbDNtTEVmWGdUcFpBTFZ6CmEyTWc5akZGQ0RrTzlIQitRSEJhUDlCclFxbDBQU2d2QW0xMWNwVUpqVWhqeHNZalY1S1RYalhCamZrSzl5eWQKWWh6MnJYemRwakVldHJISGZvVW0rcVJxdGRwak1OSHZremV5Wmk5OUJmZm50MHVZbERYQTJUb3B3WjJ5VURNZApTcWxhcHNrRDcrMzA1Nmh1aXJSWGhPdWtQOUR1cXFxSFcyUG9rK0pycU5TNGNuaHJHKzA1NUYzTG02cUgxVTlPCkFQN1phcDg4TVE4b0FnRjltT2luc0tKa25ubjRTUElWcWN6bXlFVHJQM2laOG50eFBqenhtS2ZGR0JJLzVyc28KTTBMcFJRcDhiZktHZVMvRmdobDlDWWw4c2xSMmlLN2V3ZlBNNFc3Yk1kYVRycG1nN3lWcWM1aUpXem91RTRnZQp2OENTbERRYjR5ZTNpeDV2UXYvbjZUZWJVQjB0b3ZrQzdzdFlXRHB4dkdqanFzR3ZIQ2dmb3R3alpUK0I2cTZaCjA5Z3d6eE1OVHhYSmhMeW5TQzM0TUNOMzJFWkxlVzMyak8wNmYyQVJlUFRwbTY3VlZNQjBnTkVMUXAvQgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049R28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMiBPPUdvRGFkZHkuY29tLCBJbmMuCiMgU3ViamVjdDogQ049R28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMiBPPUdvRGFkZHkuY29tLCBJbmMuCiMgTGFiZWw6ICJHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyIgojIFNlcmlhbDogMAojIE1ENSBGaW5nZXJwcmludDogODA6M2E6YmM6MjI6YzE6ZTY6ZmI6OGQ6OWI6M2I6Mjc6NGE6MzI6MWI6OWE6MDEKIyBTSEExIEZpbmdlcnByaW50OiA0NzpiZTphYjpjOToyMjplYTplODowZTo3ODo3ODozNDo2MjphNzo5Zjo0NTpjMjo1NDpmZDplNjo4YgojIFNIQTI1NiBGaW5nZXJwcmludDogNDU6MTQ6MGI6MzI6NDc6ZWI6OWM6Yzg6YzU6YjQ6ZjA6ZDc6YjU6MzA6OTE6Zjc6MzI6OTI6MDg6OWU6NmU6NWE6NjM6ZTI6NzQ6OWQ6ZDM6YWM6YTk6MTk6OGU6ZGEKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR4VENDQXEyZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBRENCZ3pFTE1Ba0dBMVVFQmhNQ1ZWTXgKRURBT0JnTlZCQWdUQjBGeWFYcHZibUV4RXpBUkJnTlZCQWNUQ2xOamIzUjBjMlJoYkdVeEdqQVlCZ05WQkFvVApFVWR2UkdGa1pIa3VZMjl0TENCSmJtTXVNVEV3THdZRFZRUURFeWhIYnlCRVlXUmtlU0JTYjI5MElFTmxjblJwClptbGpZWFJsSUVGMWRHaHZjbWwwZVNBdElFY3lNQjRYRFRBNU1Ea3dNVEF3TURBd01Gb1hEVE0zTVRJek1USXoKTlRrMU9Wb3dnWU14Q3pBSkJnTlZCQVlUQWxWVE1SQXdEZ1lEVlFRSUV3ZEJjbWw2YjI1aE1STXdFUVlEVlFRSApFd3BUWTI5MGRITmtZV3hsTVJvd0dBWURWUVFLRXhGSGIwUmhaR1I1TG1OdmJTd2dTVzVqTGpFeE1DOEdBMVVFCkF4TW9SMjhnUkdGa1pIa2dVbTl2ZENCRFpYSjBhV1pwWTJGMFpTQkJkWFJvYjNKcGRIa2dMU0JITWpDQ0FTSXcKRFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUw5eFlnangrbGswOXh2SkdLUDNnRWxZNlNLRApFNmJGSUVNQk80VHg1b1ZKbnlmcTlvUWJUcUMwMjNDWXh6SUJzUVUrQjA3dTlQcFBMMWt3SXVlckdWWnI0b0FICi9QTVdkWUE1VVh2bCtUVzJkRTZwallJVDVMWS9xUU9EK3FLK2loVnFmOTRMdzdZWkZBWEs2c09vQkpRN1Jud3kKRGZNQVppTElqV2x0Tm93UkdMZlRzaHhndERqNkFvek8wOTFHQjk0S1B1dGRmTWg4KzdBclU2U1NZbWxSSlFWaApHa1NCakN5cFE1WWozNnc2Z1pvT0tjVWNxZWxkSHJhZW5qQUtPYzd4aUlEN1MxM01NdXlGWWtNbE5BSldKd0dSCnREdHdLajl1c2VpY2lBRjluOVQ1MjFOdFlKMi9MT2RZcTdoZlJ2ek94QnNEUEFuclNURmNhVWF6NEVjQ0F3RUEKQWFOQ01FQXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DQVFZd0hRWURWUjBPQkJZRQpGRHFhaFFjUVp5aTI3L2E5QlVGdUlNR1UyZy9lTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElCQVFDWjIxMTUxZm1YCldXY0RZZkYrT3dZeGRTMmhJSTVQWlllMDk2YWN2TmpwTDlEYld1N1BkSXh6dERoQzJnVjcrQUoxdVAybHNkZXUKOXRmZUU4dFRFSDZLUnRHWCtyY3VLeEdya0xBbmdQbm9uMXJwTjUrcjVOOXNzNFVYblQzWkpFOTVrVFhXWHdUcgpnSU9ybWdJdHRSRDAySkRIQkhOQTdYSWxvS21mN0o2cmFCS1pWOGFQRWpvSnBMMUUvUVlWTjhHYjVES2o3VGpvCjJHVHpMSDRVL0FMcW44My9CMmdYMnlLUU9DMTZqZEZVOFdualh6UEtlajE3Q3VQS2YxODU1ZUoxdXNWMkdEUE8KTFBBdlRLMzNzZWZPVDZqRW0wcFVCc1YvZmRVSUQrSWMvbjRYdUt4ZTl0UVdza01KREUzMnAydTBtWVJseW5xSQo0dUpFdmx6MzZoejEKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyIE89U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLgojIFN1YmplY3Q6IENOPVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyIE89U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLgojIExhYmVsOiAiU3RhcmZpZWxkIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzIiCiMgU2VyaWFsOiAwCiMgTUQ1IEZpbmdlcnByaW50OiBkNjozOTo4MTpjNjo1Mjo3ZTo5Njo2OTpmYzpmYzpjYTo2NjplZDowNTpmMjo5NgojIFNIQTEgRmluZ2VycHJpbnQ6IGI1OjFjOjA2OjdjOmVlOjJiOjBjOjNkOmY4OjU1OmFiOjJkOjkyOmY0OmZlOjM5OmQ0OmU3OjBmOjBlCiMgU0hBMjU2IEZpbmdlcnByaW50OiAyYzplMTpjYjowYjpmOTpkMjpmOTplMTowMjo5OTozZjpiZToyMTo1MTo1MjpjMzpiMjpkZDowYzphYjpkZToxYzo2ODplNTozMTo5Yjo4Mzo5MTo1NDpkYjpiNzpmNQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRDNUQ0NBc1dnQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFzRkFEQ0JqekVMTUFrR0ExVUVCaE1DVlZNeApFREFPQmdOVkJBZ1RCMEZ5YVhwdmJtRXhFekFSQmdOVkJBY1RDbE5qYjNSMGMyUmhiR1V4SlRBakJnTlZCQW9UCkhGTjBZWEptYVdWc1pDQlVaV05vYm05c2IyZHBaWE1zSUVsdVl5NHhNakF3QmdOVkJBTVRLVk4wWVhKbWFXVnMKWkNCU2IyOTBJRU5sY25ScFptbGpZWFJsSUVGMWRHaHZjbWwwZVNBdElFY3lNQjRYRFRBNU1Ea3dNVEF3TURBdwpNRm9YRFRNM01USXpNVEl6TlRrMU9Wb3dnWTh4Q3pBSkJnTlZCQVlUQWxWVE1SQXdEZ1lEVlFRSUV3ZEJjbWw2CmIyNWhNUk13RVFZRFZRUUhFd3BUWTI5MGRITmtZV3hsTVNVd0l3WURWUVFLRXh4VGRHRnlabWxsYkdRZ1ZHVmoKYUc1dmJHOW5hV1Z6TENCSmJtTXVNVEl3TUFZRFZRUURFeWxUZEdGeVptbGxiR1FnVW05dmRDQkRaWEowYVdacApZMkYwWlNCQmRYUm9iM0pwZEhrZ0xTQkhNakNDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DCmdnRUJBTDN0d1FQODlvLzhBckZ2VzU5STJaMTU0cUszQTJGV0dNTkh0dGZLUFRVdWlVUDNvV21iM29vYS9STWcKbkxSSmR6SXBWdjI1N0l6ZEl2cHkzQ2RobCs3MldvVHNiaG01aVN6Y2hGdlZkUHRyWDhXSnBSQlNpVVpWOUxoMQpIT1ovNUZTdVMvaFZjbGNDR2ZnWGNWbnJIaWdIZE1XZFNMNXN0UFNrc1BOa04zbVN3T3hHWG4vaGJWTk1ZcS9OCkh3dGp1enFkKy94NUFKaGhkTThtZ2tCajg3SnlhaGtObWNyVURuWE1OL3VMaWNGWjhXSi9YN05mWlRENHA3ZE4KZGxvZWRsNDB3T2lXVnBtS3MvQi9wTTI5M0RJeGZKSFA0RjhSK0d1cVNWelJtWlRSb3VOald3bDJ0VlppNFV0MApIWmJVSnRRSUJGblFtQTRPNXQ3OHcrd2ZrUEVDQXdFQUFhTkNNRUF3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPCkJnTlZIUThCQWY4RUJBTUNBUVl3SFFZRFZSME9CQllFRkh3TU1oK24yVEIveEgxb28yS29vYzZyQjFzbk1BMEcKQ1NxR1NJYjNEUUVCQ3dVQUE0SUJBUUFSV2ZvbFR3TnZsSms3bWgrQ2hUblVkZ1dVWHVFb2syMWlYUW5Db0tqVQpzSFU0OFRScW5lU2Zpb1ltVWVZczBjWXRicFVnU3BJQjdMaUtaM3N4NG1jdWpKVURKaTVEblVveDlnNjFETHUzCjRqZC9Jcm9Bb3c1N1V2dHJ1enZFMDNsUlRzMlE5R2NIR2NnOFJub05BWDNGV09kdDVvVXdGNW9reEJEZ0JQZmcKOG4vVXFnci9RaDAzN1pUbFpGa1NJSGM0MHpJK09JRjFsblA2YUkreHk4NGZ4ZXo2bkg3UGZySHhCeTIyL0wvSwpwTC9RbHdWS3ZPb1lLQUtRdlZSNENTRngwOUY5SGRrV3NLbGhQZEFLQUNMOHgzdkxDV1JGQ3p0QWdmZDlmREwxCm1NcFlqbjBxN3BCWmMyVDVOblJlSmFIMVpnVXVmemtWcVNyN1VJdU9oV24wCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1TdGFyZmllbGQgU2VydmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMiBPPVN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4KIyBTdWJqZWN0OiBDTj1TdGFyZmllbGQgU2VydmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMiBPPVN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4KIyBMYWJlbDogIlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyIgojIFNlcmlhbDogMAojIE1ENSBGaW5nZXJwcmludDogMTc6MzU6NzQ6YWY6N2I6NjE6MWM6ZWI6ZjQ6Zjk6M2M6ZTI6ZWU6NDA6Zjk6YTIKIyBTSEExIEZpbmdlcnByaW50OiA5Mjo1YTo4Zjo4ZDoyYzo2ZDowNDplMDo2Njo1Zjo1OTo2YTpmZjoyMjpkODo2MzplODoyNTo2ZjozZgojIFNIQTI1NiBGaW5nZXJwcmludDogNTY6OGQ6Njk6MDU6YTI6Yzg6ODc6MDg6YTQ6YjM6MDI6NTE6OTA6ZWQ6Y2Y6ZWQ6YjE6OTc6NGE6NjA6NmE6MTM6YzY6ZTU6Mjk6MGY6Y2I6MmE6ZTY6M2U6ZGE6YjUKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUQ3ekNDQXRlZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBRENCbURFTE1Ba0dBMVVFQmhNQ1ZWTXgKRURBT0JnTlZCQWdUQjBGeWFYcHZibUV4RXpBUkJnTlZCQWNUQ2xOamIzUjBjMlJoYkdVeEpUQWpCZ05WQkFvVApIRk4wWVhKbWFXVnNaQ0JVWldOb2JtOXNiMmRwWlhNc0lFbHVZeTR4T3pBNUJnTlZCQU1UTWxOMFlYSm1hV1ZzClpDQlRaWEoyYVdObGN5QlNiMjkwSUVObGNuUnBabWxqWVhSbElFRjFkR2h2Y21sMGVTQXRJRWN5TUI0WERUQTUKTURrd01UQXdNREF3TUZvWERUTTNNVEl6TVRJek5UazFPVm93Z1pneEN6QUpCZ05WQkFZVEFsVlRNUkF3RGdZRApWUVFJRXdkQmNtbDZiMjVoTVJNd0VRWURWUVFIRXdwVFkyOTBkSE5rWVd4bE1TVXdJd1lEVlFRS0V4eFRkR0Z5ClptbGxiR1FnVkdWamFHNXZiRzluYVdWekxDQkpibU11TVRzd09RWURWUVFERXpKVGRHRnlabWxsYkdRZ1UyVnkKZG1salpYTWdVbTl2ZENCRFpYSjBhV1pwWTJGMFpTQkJkWFJvYjNKcGRIa2dMU0JITWpDQ0FTSXdEUVlKS29aSQpodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQU5VTU9zUXErVTdpOWI0WmwxK09pRk94SHovTHo1OGdFMjBwCk9zZ1BmVHozYTNZNFk5azJZS2liWGx3QWdMSXZXWC8yaC9rbFE0Ym5hUnRTbXBEaGNlUFlMUTFPYi9iSVNkbTIKOHhwV3JpdTJkQlRyei9zbTR4cTZIWll1YWp0WWxJbEhWdjhsb0pOd1U0UGFoSFFVdzJlZUJHZzYzNDVBV2gxSwpUczlEa1R2blZ0WUFjTXRTN250OXJqcm52REg1UmZiQ1lNOFRXUUlyZ013MFI5KzUzcEJsYlFMUExKR21wdWZlCmhSaEpmR1pPb3pwdHFiWHVOQzY2RFFPNE05OUg2N0ZyalNYWm04NkIwVVZHTXBad2g5NENEa2xEaGJac2M3dGsKNm1GQnJNblVWTitITDhjaXNpYk1uMWxVYUovOHZpb3Z4RlVjZFVCZ0Y0VUNWVG1MZndVQ0F3RUFBYU5DTUVBdwpEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DQVFZd0hRWURWUjBPQkJZRUZKeGZBTitxCkFkY3dLemlJb3JodFNwenlFWkdETUEwR0NTcUdTSWIzRFFFQkN3VUFBNElCQVFCTE5xYUVkMm5kT3htZlp5TUkKYnc1aHlmMkUzRi9ZTm9ITjJCdEJMWjlnM2NjYWFOblJib2JoaUNQUEU5NUR6K0kwc3dTZEh5blZ2L2hleU5YQgp2ZTZTYnpKMDhwR0NMNzJDUW5xdEtyY2dmVTI4ZWxVU3doWHF2ZmRxbFM1c2RKL1BITFR5eFFHamhkQnlQcTF6CnF3dWJkUXh0UmJlT2xLeVdON1dnMEk4VlJ3N2o2SVBkai8zdlFRRjN6Q2VwWW9VejhqY0k3M0hQZHdiZXlCa2QKaUVEUGZVWWQveDdINGM3L0k5dkcrbzFWVHFrQzUwY1JSajcwL2IxN0tTYTdxV0ZpTnlpMkxTcjJFSVpreVhDbgowcTIzS1hCNTZqemFZeVdmL1dpM01PeHcrM1dLdDIxZ1o3SWV5TG5wMktodkFvdG5EVTBtVjNIYUlQekJTbENOCnNTaTYKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUFmZmlybVRydXN0IENvbW1lcmNpYWwgTz1BZmZpcm1UcnVzdAojIFN1YmplY3Q6IENOPUFmZmlybVRydXN0IENvbW1lcmNpYWwgTz1BZmZpcm1UcnVzdAojIExhYmVsOiAiQWZmaXJtVHJ1c3QgQ29tbWVyY2lhbCIKIyBTZXJpYWw6IDg2MDgzNTU5Nzc5NjQxMzg4NzYKIyBNRDUgRmluZ2VycHJpbnQ6IDgyOjkyOmJhOjViOmVmOmNkOjhhOjZmOmE2OjNkOjU1OmY5Ojg0OmY2OmQ2OmI3CiMgU0hBMSBGaW5nZXJwcmludDogZjk6YjU6YjY6MzI6NDU6NWY6OWM6YmU6ZWM6NTc6NWY6ODA6ZGM6ZTk6NmU6MmM6Yzc6YjI6Nzg6YjcKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDAzOjc2OmFiOjFkOjU0OmM1OmY5OjgwOjNjOmU0OmIyOmUyOjAxOmEwOmVlOjdlOmVmOjdiOjU3OmI2OjM2OmU4OmE5OjNjOjliOjhkOjQ4OjYwOmM5OjZmOjVmOmE3Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEVERDQ0FqU2dBd0lCQWdJSWQzY0dKeWFwc1h3d0RRWUpLb1pJaHZjTkFRRUxCUUF3UkRFTE1Ba0dBMVVFCkJoTUNWVk14RkRBU0JnTlZCQW9NQzBGbVptbHliVlJ5ZFhOME1SOHdIUVlEVlFRRERCWkJabVpwY20xVWNuVnoKZENCRGIyMXRaWEpqYVdGc01CNFhEVEV3TURFeU9URTBNRFl3TmxvWERUTXdNVEl6TVRFME1EWXdObG93UkRFTApNQWtHQTFVRUJoTUNWVk14RkRBU0JnTlZCQW9NQzBGbVptbHliVlJ5ZFhOME1SOHdIUVlEVlFRRERCWkJabVpwCmNtMVVjblZ6ZENCRGIyMXRaWEpqYVdGc01JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0MKQVFFQTlodFBad2Nyb1JYMUJpTExId0d5NDNORkJrUkpMTHRKSlJUV3pzTzNxeXhQeGtFeWxGZjZFcWRiRHVLUApIeDZHR2FlcXRTMjVYdzJLd3ErRk5Ya3lMYnNjWWpmeXNWdEtQY3JOY1YvcFFyNlU2TWplK1NKSVpNYmxxOFlyCmJhMEY4UHJWQzgrYTVmQlFwSXM3UjZValczcDYrRE0vdU8rWmwrTWd3ZFlvaWMrVSs3bEY3ZU5BRnhIVWRQQUwKTWVJckptcWJURmV1ckNBK3VrVjZCZk85bTJrVnJuMU9JR1BFTlhZNkJ3TEpOLzNIUis3bzhYWWRjeFh5bDZTMQp5SHA1MlVLcUszOWMvczRtVDZObWdUV3ZSTHBVSGh3d01tV2Q1anlUWGxCT2V1TTYxRzdNR3Z2NTBqZXVKQ3FyClZ3TWlLQTFKZFgrM0tOcDF2NDdqM0E1NU1RSURBUUFCbzBJd1FEQWRCZ05WSFE0RUZnUVVuWlBHVTR0ZXlxOC8Kbng0UDVabVZ2Q1QybEk4d0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUNBUVl3RFFZSgpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFGaXM5QVFPemNBTi93cjkxTG9XWHltOWUyaVpXRW5TdEIwM1RYOG5mVVlHClhVUEdoaTQrYzdJbWZVK1RxYmJFS3BxcklaY1VzZDZNMDZ1SkZkaHJKTlR4RnE3WXBGelVmMUdPN1JnQnNaTmoKdmJ6NFlZQ2FuckhPUW5EaXFYMEdKWDBub2Y1djdMTWVKTnJqUzFVYUFEczF0RHZaMTEwdy9ZRVRpZkxDQml2dApaOFNPeVVPeVhHc1ZpUUs4WXZ4TzhyVXpxckp2MHdxaVVPUDJPK2d1Uk1MYlpqaXBNMVpJOFcwYk00ME5qRDlnCk41M1R5bTErTkg0Tm4zSjJpeHVmY3YxU05VRkZBcFl2SExLYWMwa2hzVWxIUlVlMDcybzBFY2xObXN4WnQ5WUMKbmxwT1piV1VyaHZmS2JBVzhiOEFuZ2M2RjJTMUJMVWpJWmtLbFR1WGZPOD0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUFmZmlybVRydXN0IE5ldHdvcmtpbmcgTz1BZmZpcm1UcnVzdAojIFN1YmplY3Q6IENOPUFmZmlybVRydXN0IE5ldHdvcmtpbmcgTz1BZmZpcm1UcnVzdAojIExhYmVsOiAiQWZmaXJtVHJ1c3QgTmV0d29ya2luZyIKIyBTZXJpYWw6IDg5NTczODI4MjcyMDY1NDc3NTcKIyBNRDUgRmluZ2VycHJpbnQ6IDQyOjY1OmNhOmJlOjAxOjlhOjlhOjRjOmE5OjhjOjQxOjQ5OmNkOmMwOmQ1OjdmCiMgU0hBMSBGaW5nZXJwcmludDogMjk6MzY6MjE6MDI6OGI6MjA6ZWQ6MDI6ZjU6NjY6YzU6MzI6ZDE6ZDY6ZWQ6OTA6OWY6NDU6MDA6MmYKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDBhOjgxOmVjOjVhOjkyOjk3Ojc3OmYxOjQ1OjkwOjRhOmYzOjhkOjVkOjUwOjlmOjY2OmI1OmUyOmM1OjhmOmNkOmI1OjMxOjA1OjhiOjBlOjE3OmYzOmYwOmI0OjFiCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEVERDQ0FqU2dBd0lCQWdJSWZFOEVPUnpVbVMwd0RRWUpLb1pJaHZjTkFRRUZCUUF3UkRFTE1Ba0dBMVVFCkJoTUNWVk14RkRBU0JnTlZCQW9NQzBGbVptbHliVlJ5ZFhOME1SOHdIUVlEVlFRRERCWkJabVpwY20xVWNuVnoKZENCT1pYUjNiM0pyYVc1bk1CNFhEVEV3TURFeU9URTBNRGd5TkZvWERUTXdNVEl6TVRFME1EZ3lORm93UkRFTApNQWtHQTFVRUJoTUNWVk14RkRBU0JnTlZCQW9NQzBGbVptbHliVlJ5ZFhOME1SOHdIUVlEVlFRRERCWkJabVpwCmNtMVVjblZ6ZENCT1pYUjNiM0pyYVc1bk1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0MKQVFFQXRJVE1NeGN1YTVSc2EyRlNvT3VqejNtVVRPV1VnSm5MVldSRVpZOW5aT0lHNDF3M1NmWXZtNFNFSGkzeQpZSjB3VHN5RWhlSXN6eDZlL2phck0zYzFSTmcxbGhvOU51aDZEdGpWUjZGcWFZdlovTHM2cm5sYTFmVFdjYnVhCmtDTnJtcmVJZEljTUhsKzVuaTM2cTFNcjNMdDJQcE5NQ0FpTUhxSWpITlJxclNLNm1RRXViV1hMdmlSbVZTUkwKUUVTeEc5Zmh3b1hBM2hBL1BlMjQvUEh4STFQY3YyV1hiOW41UUhHTmZiMlYxTTYrb0Y0bkk5NzlwdEFtRGdBcAo2enhHOEQxZ3Z6OVEwdHdtUVZHZUZEZENCS053VjZnYmgrMHQrbnZ1akFyanFXYUpHY3RCK2QxRU5tSFA0bmRHCnlIMzI5SktCTnYzYk5QRnlmdk1NRnIyMEZRSURBUUFCbzBJd1FEQWRCZ05WSFE0RUZnUVVCeC9TNTV6YXdtNmkKUUxTd2VsQVFVSFRFeUwwd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUNBUVl3RFFZSgpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFJbFhzaFo2cU1MOTF0bWJtelRDbkxReUZFMm5wTi9zdnFlKytFUGJrVGZPCnRESXVVRlVhTlU1MlEzRWc3NU4zVGhWd0xvZkR3UjF0M011MUo5UXNWdEZTVXpwRTBuUEl4QnNGWlZwaWtwenUKUVkweDIrYzA2bGtoMVFGNjEyUzRaRG5OeWUydjdVc0RTS2VnbVFHQTNHV2pOcTVsV1VoUGdrdklaZkZYSGVWWgpMZ28vYk5qUjllVUp0R3hVQUFyZ0ZVMkhkVzIzV0paYTNXM1NBS0QwbTBpK3d6ZWt1amJnZkllRmx4b1ZvdDR1Cm9sdTlyeGo1a0ZETmNGbjRKMmRIeThlZ0J6cDkwU3hkYkJrNlpyVjkvWkZ2Z3JHK0NKUGJGRWZ4b2pmSFJaNDgKeDNldlpLaVQzL1pwZzRKZzhrbENOTzFhQUZTRkhCWTJrZ3hjK3FhdHY5cz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUFmZmlybVRydXN0IFByZW1pdW0gTz1BZmZpcm1UcnVzdAojIFN1YmplY3Q6IENOPUFmZmlybVRydXN0IFByZW1pdW0gTz1BZmZpcm1UcnVzdAojIExhYmVsOiAiQWZmaXJtVHJ1c3QgUHJlbWl1bSIKIyBTZXJpYWw6IDc4OTM3MDY1NDA3MzQzNTIxMTAKIyBNRDUgRmluZ2VycHJpbnQ6IGM0OjVkOjBlOjQ4OmI2OmFjOjI4OjMwOjRlOjBhOmJjOmY5OjM4OjE2Ojg3OjU3CiMgU0hBMSBGaW5nZXJwcmludDogZDg6YTY6MzM6MmM6ZTA6MDM6NmY6YjE6ODU6ZjY6NjM6NGY6N2Q6NmE6MDY6NjU6MjY6MzI6Mjg6MjcKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDcwOmE3OjNmOjdmOjM3OjZiOjYwOjA3OjQyOjQ4OjkwOjQ1OjM0OmIxOjE0OjgyOmQ1OmJmOjBlOjY5OjhlOmNjOjQ5OjhkOmY1OjI1Ojc3OmViOmYyOmU5OjNiOjlhCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGUmpDQ0F5NmdBd0lCQWdJSWJZd1VSckdtQ3U0d0RRWUpLb1pJaHZjTkFRRU1CUUF3UVRFTE1Ba0dBMVVFCkJoTUNWVk14RkRBU0JnTlZCQW9NQzBGbVptbHliVlJ5ZFhOME1Sd3dHZ1lEVlFRRERCTkJabVpwY20xVWNuVnoKZENCUWNtVnRhWFZ0TUI0WERURXdNREV5T1RFME1UQXpObG9YRFRRd01USXpNVEUwTVRBek5sb3dRVEVMTUFrRwpBMVVFQmhNQ1ZWTXhGREFTQmdOVkJBb01DMEZtWm1seWJWUnlkWE4wTVJ3d0dnWURWUVFEREJOQlptWnBjbTFVCmNuVnpkQ0JRY21WdGFYVnRNSUlDSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQWc4QU1JSUNDZ0tDQWdFQXhCTGYKcVYvK1FkM2Q5WitLNC9hczRUeDRtcnpZOEg5Nm9ETXEzSTBnVzY0dGIrZVQyVFp3YW1qUGpsR2poVnRuQktBUQpKRzlkS0lMQmwxZllTQ2tUdHVHK2tVM2ZoUXhUR0pvZUpLSlBqL0NpaFF2TDlDbC8wcVJZN2laTnlhcW9lNXJaCitqamVSRmNWNWZpTXlObEk0ZzBXSngwZXlJT0ZKYmU2cWxWQnpBTWlTeTJSall2bWlhOW14K24vSytrOHJOclMKczhQaGFKeUorSG9BVnQ3MFZaVnMrN3BrM1dLTDN3dDNNdXRpekNhYW03dXFZb05NdEFaNk1NZ3B2KzBHVFplNQpITVF4SzlWZnZGTVNGNXlaVnlsbWQyRWhNUWN1SlVtZEdQTHU4eXR4akxXNk9RZEpkL3p2THBLUUJZMHRMM2Q3CjcwTy9OYnVhMlBsenB5enkwRmZ1S0U0bVg0K1FhQWt2dVBqY0J1a3VtajVScDlFaXhBcW5PRWhzcy9uL2ZhdUcKVitPNjFvVjRkN3BENmtoLzl0aStJMjBldjlFMmJGaGM4ZTZrR1ZRYTlRUFNkdWJoakwwOHM5TklTK0xJK0grUwpxSFpHbkVKbFBxUWV3UWNEV2tZdHVKZnp0OVd5VlNIdnV0eE1BSmY3RkpVbk03L29RMGRHMGdpWkZtQTdtbjdTCjV1MDQ2dXdCSGp4SVZra0p4MHczQUo2SURzQno0VzltNlhKSE1ENFE1UXNEeVpwQ0FHekZsSDVoeElyZmY0SWEKQzFuRVdUSjNzN3hnYVZZNS9iUUdleXpXWkRiWnZVanRoQjkrcFNLUEtyaEM5SUszMUZPUWVFNHRHdjJCYjBUWApPd0YwbGtMZ0FPSXVhK3JGN25Lc3U3Lys2cXFvK056MnNubUt0bWNDQXdFQUFhTkNNRUF3SFFZRFZSME9CQllFCkZKM0FaNllNSXRrbTlVV3JwbVZTRVNmWVJheGpNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEZ1lEVlIwUEFRSC8KQkFRREFnRUdNQTBHQ1NxR1NJYjNEUUVCREFVQUE0SUNBUUN6VjAwUVlrNDY1S3pxdUJ5dk1pUElzMGxhVVp4MgpLSTE1cWxkR0Y5WDFVdmEzUk9nSVJMOFloTklMZ00zRkV2MEFWUVZoaDBIY3RTU2VQTVRZeVB0d25pOTRsb01nCk50NThEMmtUaUtWMU5wZ0lwc2Jmck03aldOYTNQdDY2OCtzMFFOaWlnZlY0UHkvVnBmelpvdFJlQkE0WHJmNUIKOE9XeWN2cEVnak5DNkMxWTkxYU1Zais2UXJDY0RGeCtMbVVtWEZOUEFMSjRmcUVObVMyTnVCMk9vc1N3L1dEUQpNS1NPeUFSaXFjVHROZDU2bCswT09GNlNMNU53cGFtY2I2ZDlFeDEreGdoSXNWNW42MUVJSmVubUpXdFNLWkdjCjBqbHpDRmZlbVFhMFc1MFFCdUhDQUtpNEhFb0NDaFRRd1VISys0dzFJWDJDT1BLcFZKRVpOWk9VYldvNnhiTFEKdTRtR2sraWJ5UTg2cDNxNG9mQjRSdnI4TnkvbGlvVHozLzRFMmFGb29DOGs0Z21WQnRXVnl1RWtsdXQ4OXBNRgp1KzF6NlMzUmRUblg1eVRiMkU1ZlE0K2UwQlE1djFWd1NKbFhNYlNjN2txWUE1WXdIMkFHN2hzai9vRmdJeHBICllvV2x6QmswZ0crenJCcmpuL0I3U0szVkFkbG50cWx5aytvdFpyV3l1T1E5UExMdlRJenE2d2UvcXpXYVZZYTgKR0thMXFGNjBnMnhyYVVEVG45enh3MmxydWVGdENmVHhxbEIyQ25wOWVoZWhWWlpDbVRFSjNXQVJqUVV3ZnVhTwpSdEdkRk5ySEYrUUZsb3pFSkxVYnp4UUhza0Q0bzU1Qmhyd0UwR3VXeUNxQU5QMi83d2FqM1ZqRmhUMCtqLzZlCktlQzJ1QWxvR1J3WVF3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUFmZmlybVRydXN0IFByZW1pdW0gRUNDIE89QWZmaXJtVHJ1c3QKIyBTdWJqZWN0OiBDTj1BZmZpcm1UcnVzdCBQcmVtaXVtIEVDQyBPPUFmZmlybVRydXN0CiMgTGFiZWw6ICJBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQyIKIyBTZXJpYWw6IDg0MDEyMjQ5MDc4NjE0OTAyNjAKIyBNRDUgRmluZ2VycHJpbnQ6IDY0OmIwOjA5OjU1OmNmOmIxOmQ1Ojk5OmUyOmJlOjEzOmFiOmE2OjVkOmVhOjRkCiMgU0hBMSBGaW5nZXJwcmludDogYjg6MjM6NmI6MDA6MmY6MWQ6MTY6ODY6NTM6MDE6NTU6NmM6MTE6YTQ6Mzc6Y2E6ZWI6ZmY6YzM6YmIKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGJkOjcxOmZkOmY2OmRhOjk3OmU0OmNmOjYyOmQxOjY0OjdhOmRkOjI1OjgxOmIwOjdkOjc5OmFkOmY4OjM5OjdlOmI0OmVjOmJhOjljOjVlOjg0Ojg4OjgyOjE0OjIzCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlCL2pDQ0FZV2dBd0lCQWdJSWRKY2xpc2MvZWxRd0NnWUlLb1pJemowRUF3TXdSVEVMTUFrR0ExVUVCaE1DClZWTXhGREFTQmdOVkJBb01DMEZtWm1seWJWUnlkWE4wTVNBd0hnWURWUVFEREJkQlptWnBjbTFVY25WemRDQlEKY21WdGFYVnRJRVZEUXpBZUZ3MHhNREF4TWpreE5ESXdNalJhRncwME1ERXlNekV4TkRJd01qUmFNRVV4Q3pBSgpCZ05WQkFZVEFsVlRNUlF3RWdZRFZRUUtEQXRCWm1acGNtMVVjblZ6ZERFZ01CNEdBMVVFQXd3WFFXWm1hWEp0ClZISjFjM1FnVUhKbGJXbDFiU0JGUTBNd2RqQVFCZ2NxaGtqT1BRSUJCZ1VyZ1FRQUlnTmlBQVFOTUY0YkZaMEQKMEtGNU5iYzZQSko2eWhVY3pXTHpuQ1pjQnozbFZQcWoxc3dTNnZRVVgraU9HYXN2TGtqbXJCaERlS3pRTjhPOQpzczBzNWtmaUd1Wmp1RDB1TDNqRVQ5djBENlJvVEZWeWE1VWRUaGhDbFhqTU56eVI0cHRsS3ltalFqQkFNQjBHCkExVWREZ1FXQkJTYXJ5bDZ3QkUxTlNaUk1BRERhdjVBMWE3V1BEQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BNEcKQTFVZER3RUIvd1FFQXdJQkJqQUtCZ2dxaGtqT1BRUURBd05uQURCa0FqQVhDZk9IaUZCYXI4akFRcjlIWC9Wcwphb2JneENkMDVEaFQxd1YvR3pUanhpK3p5Z2s4TjUzWDU3aEc4ZjJoNG5FQ01FSlpoMFBVVWQrNjB3a3lXczZJCmZsYzluRjlDYS9VSExiWHdncFA1V1crdVpQcFk1WXNlNDJPK3RZSE5id0tNZVE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049Q2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSBPPVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4gT1U9Q2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5CiMgU3ViamVjdDogQ049Q2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSBPPVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4gT1U9Q2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5CiMgTGFiZWw6ICJDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBIgojIFNlcmlhbDogMjc5NzQ0CiMgTUQ1IEZpbmdlcnByaW50OiBkNTplOTo4MTo0MDpjNToxODo2OTpmYzo0NjoyYzo4OTo3NTo2MjowZjphYTo3OAojIFNIQTEgRmluZ2VycHJpbnQ6IDA3OmUwOjMyOmUwOjIwOmI3OjJjOjNmOjE5OjJmOjA2OjI4OmEyOjU5OjNhOjE5OmE3OjBmOjA2OjllCiMgU0hBMjU2IEZpbmdlcnByaW50OiA1Yzo1ODo0Njo4ZDo1NTpmNTo4ZTo0OTo3ZTo3NDozOTo4MjpkMjpiNTowMDoxMDpiNjpkMTo2NTozNzo0YTpjZjo4MzphNzpkNDphMzoyZDpiNzo2ODpjNDo0MDo4ZQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRHV6Q0NBcU9nQXdJQkFnSURCRVRBTUEwR0NTcUdTSWIzRFFFQkJRVUFNSDR4Q3pBSkJnTlZCQVlUQWxCTQpNU0l3SUFZRFZRUUtFeGxWYm1sNlpYUnZJRlJsWTJodWIyeHZaMmxsY3lCVExrRXVNU2N3SlFZRFZRUUxFeDVEClpYSjBkVzBnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa3hJakFnQmdOVkJBTVRHVU5sY25SMWJTQlUKY25WemRHVmtJRTVsZEhkdmNtc2dRMEV3SGhjTk1EZ3hNREl5TVRJd056TTNXaGNOTWpreE1qTXhNVEl3TnpNMwpXakIrTVFzd0NRWURWUVFHRXdKUVRERWlNQ0FHQTFVRUNoTVpWVzVwZW1WMGJ5QlVaV05vYm05c2IyZHBaWE1nClV5NUJMakVuTUNVR0ExVUVDeE1lUTJWeWRIVnRJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1TSXcKSUFZRFZRUURFeGxEWlhKMGRXMGdWSEoxYzNSbFpDQk9aWFIzYjNKcklFTkJNSUlCSWpBTkJna3Foa2lHOXcwQgpBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUE0L3Q5bzNLNnd2REpGSWYxYXdGTzRXNUFCN3B0SjExLzkxc3RzMXJIClVWK3JwREttWVllMmJnK0cwakFDbC9qWGFWZWhHRGxkYW1SNXhnRlpyRHd4U2poODBnVFNTeWpvSUY4N0I2TE0KVFhQYjg2NVB4MWJWV3FlV2lmcnpxMmpVSTRaWko4OEpKN3lzYm5LREhEQnkzK0NpNmRMaGRIVVp2U3FlZXhWVQpCQnZYUXptdFZTakY0aHE3OU1Ea3JqaEpNOHgyaFo4NVJkS2tudklTakZINGZPUXRmL1dzWCtzV243RXQwYnJNCmtVSjNUQ1hKa0RodjIvRE0rNDRlbDFrKzFXQk81Z1VvN1VsNUUwdTZTTnN2K1hMVE9jcitIOWcwY3ZXMFFNOHgKQWNQczNoRXRGMTBmdUZEUlhobW5hZDRITXlqS1VKWDVwMVRMVklaUVJhbjVTUUlEQVFBQm8wSXdRREFQQmdOVgpIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJRSWRzM0xCLzhrOXNYTjdidVF2T0tFTjBaMTl6QU9CZ05WCkhROEJBZjhFQkFNQ0FRWXdEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUJBS2FvclNMT0FUMm1vLzlpMEVpZGkxNXkKc0hoRTQ5d2Nyd245STBqNnZTckV1VlVFdFJDampTZmVDNEpqME83ZUREZDVRVnNpc3JDYVFWeW1jT0RVMEhmTApJOU1BNEd4V0wrRnBEUTNacXI4aGdWRFpCcVdvLzVVMzBLcis0clAxbVMxRmhJcmxRZ25YZEFJdjk0blltZW04Cko5UkhqYm9OUmh4M3p4U2tITG1rTWNTY0tIUUROUDh6R1NhbDZRMTB0ejZYeG5ib0o1YWpadDNocnZKQlc4cVkKVm9OemNPU0dHdEl4UWJvdnZpMFRXblp2VHVoT2dRNC9Xd01pb0JLK1psZ1JTc3NEeExRcUtpMldGK0E1Vkx4SQowM1lublpvdEJxYko3RG5TcTl1Zm1nc25BalVwc1VDVjUvbm9uRldJR1ViV3R6VDFmczQ1bXRrNDhWSDNUeXc9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1UV0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1UQUlXQU4tQ0EgT1U9Um9vdCBDQQojIFN1YmplY3Q6IENOPVRXQ0EgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPVRBSVdBTi1DQSBPVT1Sb290IENBCiMgTGFiZWw6ICJUV0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkiCiMgU2VyaWFsOiAxCiMgTUQ1IEZpbmdlcnByaW50OiBhYTowODo4ZjpmNjpmOTo3YjpiNzpmMjpiMTphNzoxZTo5YjplYTplYTpiZDo3OQojIFNIQTEgRmluZ2VycHJpbnQ6IGNmOjllOjg3OjZkOmQzOmViOmZjOjQyOjI2Ojk3OmEzOmI1OmEzOjdhOmEwOjc2OmE5OjA2OjIzOjQ4CiMgU0hBMjU2IEZpbmdlcnByaW50OiBiZjpkODo4ZjplMToxMDoxYzo0MTphZTozZTo4MDoxYjpmODpiZTo1NjozNTowZTplOTpiYTpkMTphNjpiOTpiZDo1MTo1ZTpkYzo1Yzo2ZDo1Yjo4NzoxMTphYzo0NAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRGV6Q0NBbU9nQXdJQkFnSUJBVEFOQmdrcWhraUc5dzBCQVFVRkFEQmZNUXN3Q1FZRFZRUUdFd0pVVnpFUwpNQkFHQTFVRUNnd0pWRUZKVjBGT0xVTkJNUkF3RGdZRFZRUUxEQWRTYjI5MElFTkJNU293S0FZRFZRUUREQ0ZVClYwTkJJRkp2YjNRZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGt3SGhjTk1EZ3dPREk0TURjeU5ETXoKV2hjTk16QXhNak14TVRVMU9UVTVXakJmTVFzd0NRWURWUVFHRXdKVVZ6RVNNQkFHQTFVRUNnd0pWRUZKVjBGTwpMVU5CTVJBd0RnWURWUVFMREFkU2IyOTBJRU5CTVNvd0tBWURWUVFERENGVVYwTkJJRkp2YjNRZ1EyVnlkR2xtCmFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUIKQVFDd2ZuSzRwQU9VNXFmZUNUaVJTaEZBaDZkOFdXUVVlN1VSRU4zK3Y5WEF1MWJpaFNYME5YSVArRlBRUWVGRQpBY0swSE1NeFFoWkhoVE1pZHJJS2J3L2xKVkJQaFlhK3Y1Z3VFR2NldmhFRmhnV1F4Rm5RZkhnUXNJQmN0K0hICkszWExmSit1dGRHZEl6ZGpwOXhDb2kyU0JCdFF3WHU0UGh2SlZnU0xMMUticmFsVzZjSC9yYWxZaHpDMmdmZVgKUmZ3WlZ6c3JiK1JIOUpsRi9oM3grSmVqaUIwM0hGeVA0SFlsbWxENG9GVC9SSkIySTlJeXhzT3JCci84KzcvegpyWDJTWWdKYktkTTFvNU9hUTJSZ1hiTDZNdjg3Qks5TlFHcjV4K1B2SS8xcnkrVVBpemdON2dyOC9nK1luekF4CjNXeFNaZm1MZ2I0aTRSeFlBN3FSRzRrSEFnTUJBQUdqUWpCQU1BNEdBMVVkRHdFQi93UUVBd0lCQmpBUEJnTlYKSFJNQkFmOEVCVEFEQVFIL01CMEdBMVVkRGdRV0JCUnFPRnNtamQ2TFd2SlBlbFNER1JqakNEV211akFOQmdrcQpoa2lHOXcwQkFRVUZBQU9DQVFFQVBOVjNQZHJmaWJxSERBaFVhaUJRa3I2d1FUMjVKbVNEQ2kvb1FNQ1hLQ2VDCk1FckprLzlxNTZZQWY0bENtdFlSNVZQT0w4enkyZ1hFL3VKUXhEcUdmY3phZmhBSk81STFLbE95L3VzckJkbHMKWGViUTc5TnFacDRWS0lWNjZJSUFyQjZuQ1dsV1F0Tm9VUmkrVkpxL1JFRzZTYjRndW1sYzdyaDN6YzVzSDYyRApsaGg5RHJVVU9ZVHhLT2t0bzU1N0hucHlXb096ZVcvdnRQelFDcVZZVDBiZisyMTVXZktFSWxLdUQ4ejdmRHZuCmFzcEhZY042K05PU0JCKzRJSVRoTmxRV3gwRGVPNHB6M04vR0NVemY3TnIvMUZOQ29jbnlZaDBpZ3p5WHhma1oKWWllc1pTTFgwenpHNVk2eVU4eEp6cnd3L25zT001RDc3ZElVa1I4SHJ3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IE89U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELiBPVT1TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTIKIyBTdWJqZWN0OiBPPVNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4gT1U9U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyCiMgTGFiZWw6ICJTZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTIiCiMgU2VyaWFsOiAwCiMgTUQ1IEZpbmdlcnByaW50OiA2YzozOTo3ZDphNDowZTo1NTo1OTpiMjozZjpkNjo0MTpiMToxMjo1MDpkZTo0MwojIFNIQTEgRmluZ2VycHJpbnQ6IDVmOjNiOjhjOmYyOmY4OjEwOmIzOjdkOjc4OmI0OmNlOmVjOjE5OjE5OmMzOjczOjM0OmI5OmM3Ojc0CiMgU0hBMjU2IEZpbmdlcnByaW50OiA1MTozYjoyYzplYzpiODoxMDpkNDpjZDplNTpkZDo4NTozOToxYTpkZjpjNjpjMjpkZDo2MDpkODo3YjpiNzozNjpkMjpiNToyMTo0ODo0YTphNDo3YTowZTpiZTpmNgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRGR6Q0NBbCtnQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFzRkFEQmRNUXN3Q1FZRFZRUUdFd0pLVURFbApNQ01HQTFVRUNoTWNVMFZEVDAwZ1ZISjFjM1FnVTNsemRHVnRjeUJEVHk0c1RGUkVMakVuTUNVR0ExVUVDeE1lClUyVmpkWEpwZEhrZ1EyOXRiWFZ1YVdOaGRHbHZiaUJTYjI5MFEwRXlNQjRYRFRBNU1EVXlPVEExTURBek9Wb1gKRFRJNU1EVXlPVEExTURBek9Wb3dYVEVMTUFrR0ExVUVCaE1DU2xBeEpUQWpCZ05WQkFvVEhGTkZRMDlOSUZSeQpkWE4wSUZONWMzUmxiWE1nUTA4dUxFeFVSQzR4SnpBbEJnTlZCQXNUSGxObFkzVnlhWFI1SUVOdmJXMTFibWxqCllYUnBiMjRnVW05dmRFTkJNakNDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFOQVYKT1ZLeFVyTzZ4Vm1DeEYxU3JqcERaWUJMeC9LV3ZOczJsOWFtWkl5b1h2RGpDaHozMzVjOVM2NzJYZXdodFVHcgp6YmwrZHArKytUNDJOS0E3d2ZZeEVVVjBrejFYZ01YNWlabks1YXRxMUxYYVFaQVF3ZGJXUW9uQ3YvUTRFcFZNClZBWDNOdVJGZzNzVVpkYmNERTNSM240TXF6dkVGYjQ2VnFaYWIzWnBVcWw2dWNqcmFwcGRVdEF0Q21zMUZna1EKaE5CcXlqb0dBRGRINUg1WFR6K0w2MmU0aUtyRnZsTlZzcEhFZmJtd2hSa0dlQzdiWVJyNmhmVktrYUhuRnRXTwpvam5mbExod0h5Zy9pL3hBWG1PRFBJTXFHcGxyejk1WmFqdjhieGJYSC8xS0VPdE9naFk2ckNjTVUvR3QxU1N3CmF3TlF3UzA4RnQxRU5DY2FkZnNDQXdFQUFhTkNNRUF3SFFZRFZSME9CQllFRkFxRnFYZGxCWmg4UUlINEQ1Y3MKT1BFSzdEelBNQTRHQTFVZER3RUIvd1FFQXdJQkJqQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BMEdDU3FHU0liMwpEUUVCQ3dVQUE0SUJBUUJNT3FORXJMbEZzY2VUZnNnTENrTGZaT29jN2xsc0NMcUpYMnJLU3BXZWVvOEh4ZHBGCmNvSnhEanJTekcrbnRLRWp1L1lrbjhzWC9veW16c0xTMjh5Ti9ISDhBeW5CYkYwelgyUzJaVHVKYnhoMmVQWGMKb2tnZkdUK09rK3Z4K2hmdXpVN2pCQkpWMXVYazNmcytCWHppSFY3R3A3eVhUMmc2OWVrdUNrTzJyMWRjWW1oOAp0LzJqaW9TZ3JHSytLd21ITlBCcUFidWJLVlk4L2dBM3p5TnM4VTZxdG5SR0VteVI3alRWN0pxUjUwUytrREZ5CjFVa0M5Z0xsOUIvcmZObVdWYW4vN0lyNW1VZi9OVm9DcWdUTGlsdUhjU21SdmFTMGVnMjltdlZYSXdBSElSYy8KU2puUkJVa0xwN1kzZ2FWZGpLb3pYb0VvZktkOUorc0FybzAzCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1IZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDExIE89SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkKIyBTdWJqZWN0OiBDTj1IZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDExIE89SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkKIyBMYWJlbDogIkhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTEiCiMgU2VyaWFsOiAwCiMgTUQ1IEZpbmdlcnByaW50OiA3Mzo5Zjo0Yzo0Yjo3Mzo1Yjo3OTplOTpmYTpiYToxYzplZjo2ZTpjYjpkNTpjOQojIFNIQTEgRmluZ2VycHJpbnQ6IGZlOjQ1OjY1OjliOjc5OjAzOjViOjk4OmExOjYxOmI1OjUxOjJlOmFjOmRhOjU4OjA5OjQ4OjIyOjRkCiMgU0hBMjU2IEZpbmdlcnByaW50OiBiYzoxMDo0ZjoxNTphNDo4YjplNzowOTpkYzphNTo0MjphNzplMTpkNDpiOTpkZjo2ZjowNTo0NToyNzplODowMjplYTphOToyZDo1OTo1NDo0NDoyNTo4YTpmZTo3MQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRU1UQ0NBeG1nQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFVRkFEQ0JsVEVMTUFrR0ExVUVCaE1DUjFJeApSREJDQmdOVkJBb1RPMGhsYkd4bGJtbGpJRUZqWVdSbGJXbGpJR0Z1WkNCU1pYTmxZWEpqYUNCSmJuTjBhWFIxCmRHbHZibk1nUTJWeWRDNGdRWFYwYUc5eWFYUjVNVUF3UGdZRFZRUURFemRJWld4c1pXNXBZeUJCWTJGa1pXMXAKWXlCaGJtUWdVbVZ6WldGeVkyZ2dTVzV6ZEdsMGRYUnBiMjV6SUZKdmIzUkRRU0F5TURFeE1CNFhEVEV4TVRJdwpOakV6TkRrMU1sb1hEVE14TVRJd01URXpORGsxTWxvd2daVXhDekFKQmdOVkJBWVRBa2RTTVVRd1FnWURWUVFLCkV6dElaV3hzWlc1cFl5QkJZMkZrWlcxcFl5QmhibVFnVW1WelpXRnlZMmdnU1c1emRHbDBkWFJwYjI1eklFTmwKY25RdUlFRjFkR2h2Y21sMGVURkFNRDRHQTFVRUF4TTNTR1ZzYkdWdWFXTWdRV05oWkdWdGFXTWdZVzVrSUZKbApjMlZoY21Ob0lFbHVjM1JwZEhWMGFXOXVjeUJTYjI5MFEwRWdNakF4TVRDQ0FTSXdEUVlKS29aSWh2Y05BUUVCCkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUtsVEFPTXVwdmFPK21EWUxaVSsrQ3dxVkU3TnVZUmhsRmhQanoyTDVFUHoKZFltTlVlVEROOUtLaUUxNUhyY1MzVU40U29xUzV0ZEkxUStrT2lsRU5iZ0g5bWdkVmMwNFVmQ01KREdGcjRQSgpmZWwzciswYWU1MFgrYk9kT0ZBUHBscDVrWUN2TjY2bTB6SDd0U1lKblR4YTcxSEZLOStXWGVzeUhnTGFjRW5zCmJnekltamVOOS9FMllFc21MSUtlMEhqekRROWpwRkV3NGZrckp4SUgyT3E5R0dLWXNGazNmYjd1OHlCUlFscUQKNzVPNmFSWHhZcDJmbVRtQ29iZDBMb3ZVeFF0N0wvRElDdG85ZVFxYWt4eWxLSEp6a1VPYXA5Rk5oWVM1cVhTUApGRURIM042c1FXUnN0Qm1iQW1OdEpHU1BSTElsNnM1ZGRBeGpNbHlOaCtVQ0F3RUFBYU9CaVRDQmhqQVBCZ05WCkhSTUJBZjhFQlRBREFRSC9NQXNHQTFVZER3UUVBd0lCQmpBZEJnTlZIUTRFRmdRVXBwRkMvUk5oU2lPZUNLUXAKNWRnVEJDUHVRU1V3UndZRFZSMGVCRUF3UHFBOE1BV0NBeTVuY2pBRmdnTXVaWFV3Qm9JRUxtVmtkVEFHZ2dRdQpiM0puTUFXQkF5NW5jakFGZ1FNdVpYVXdCb0VFTG1Wa2RUQUdnUVF1YjNKbk1BMEdDU3FHU0liM0RRRUJCUVVBCkE0SUJBUUFmNzNsQjRYdHVQN0tNaGpkQ1NrNGNOeDZOWnJva2djbFBFZzhod0FPWGhpVnRYZE1pS2Foc29nMnAKNnowR1c1azZ4OHpEbWpSL3F3N0lUaHpoK3VUY3pRMit2eVQrYk9kcndnM0lCcDVPaldFb3Btcjk1ZlppNmhnOApUcUJUbmJJNm5PdWxuSkVXdGsyQzRBd0ZTS2xzOWN6NHk1MUp0UEFDcGYxd0ErMktJYVd1RTRaSnd6Tnp2b2M3CmRJc1hSU1pNRnBHRC9tZDl6VTFqWi9yekF4S1dlQWFOc1dmdGpqKytuMDhDOWJNSkwvTk1oOThxeTVWOEFjeXMKTm5xL29uTjY5NC9CdFpxaEZMS1BNNThON3lMY1pudUV2VVVYQmowOHlybDNOSS9LNnM4L01UN2ppT09BU1NYSQpsN1dkbXBsTnNEejRTZ0NiWk4yZk9VdlJKOWU0Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1BY3RhbGlzIEF1dGhlbnRpY2F0aW9uIFJvb3QgQ0EgTz1BY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NwojIFN1YmplY3Q6IENOPUFjdGFsaXMgQXV0aGVudGljYXRpb24gUm9vdCBDQSBPPUFjdGFsaXMgUy5wLkEuLzAzMzU4NTIwOTY3CiMgTGFiZWw6ICJBY3RhbGlzIEF1dGhlbnRpY2F0aW9uIFJvb3QgQ0EiCiMgU2VyaWFsOiA2MjcxODQ0NzcyNDI0NzcwNTA4CiMgTUQ1IEZpbmdlcnByaW50OiA2OTpjMTowZDo0ZjowNzphMzoxYjpjMzpmZTo1NjozZDowNDpiYzoxMTpmNjphNgojIFNIQTEgRmluZ2VycHJpbnQ6IGYzOjczOmIzOjg3OjA2OjVhOjI4Ojg0OjhhOmYyOmYzOjRhOmNlOjE5OjJiOmRkOmM3OjhlOjljOmFjCiMgU0hBMjU2IEZpbmdlcnByaW50OiA1NTo5Mjo2MDo4NDplYzo5NjozYTo2NDpiOTo2ZToyYTpiZTowMTpjZTowYjphODo2YTo2NDpmYjpmZTpiYzpjNzphYTpiNTphZjpjMTo1NTpiMzo3ZjpkNzo2MDo2NgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRnV6Q0NBNk9nQXdJQkFnSUlWd29SbDBMRTQ4d3dEUVlKS29aSWh2Y05BUUVMQlFBd2F6RUxNQWtHQTFVRQpCaE1DU1ZReERqQU1CZ05WQkFjTUJVMXBiR0Z1TVNNd0lRWURWUVFLREJwQlkzUmhiR2x6SUZNdWNDNUJMaTh3Ck16TTFPRFV5TURrMk56RW5NQ1VHQTFVRUF3d2VRV04wWVd4cGN5QkJkWFJvWlc1MGFXTmhkR2x2YmlCU2IyOTAKSUVOQk1CNFhEVEV4TURreU1qRXhNakl3TWxvWERUTXdNRGt5TWpFeE1qSXdNbG93YXpFTE1Ba0dBMVVFQmhNQwpTVlF4RGpBTUJnTlZCQWNNQlUxcGJHRnVNU013SVFZRFZRUUtEQnBCWTNSaGJHbHpJRk11Y0M1QkxpOHdNek0xCk9EVXlNRGsyTnpFbk1DVUdBMVVFQXd3ZVFXTjBZV3hwY3lCQmRYUm9aVzUwYVdOaGRHbHZiaUJTYjI5MElFTkIKTUlJQ0lqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FnOEFNSUlDQ2dLQ0FnRUFwOGJFcFNta0xPL2xHTVd3VUtOdgpVVHVmQ2xySndrZzRDc0ljb0JoL2tiV0h1VUEvM1Ixb0h3aUQxUzBlaUtENGoxYVBiWmtDa3BBVzFWOEliSW5YCjRheThJTUt4NElOUmltbE5BSlphYnkvQVJINmpEdVNSelZqdTNQdkhIa1ZIM1NlNUNBR2ZwaUVkOVVFdEwwejkKS0szZ2lxMGl0Rlpsam9aVWo1TkRLZDQ1Um5pak1DTzZ6ZkI5RTFmQVhkS0RhMGhNeEt1ZmdGcGJPcjNKcHlJLwpnQ2N6V3c2M2lneGRCemNJeTJ6U2VrY2lSRFhGek13dWp0MHE3YmQ5WmcxZllWRWlWUnZqUnVQalBkQTFZcHJiCnJ4VElXNkhNaVJ2aE1DYjhvSnNmZ2FkSEh3VHJvem1TQnArWjA3L1Q2azlRbkJuK2xvY2VQR1gyb3hna2c0WVEKNTFRK3FEcDJKRStCSWNYakR3TDRrNVJISUx2KzFBN1RhTG5keEhxRWd1TlRWSG5kMjV6UzhnZWJMcmE4UHUyRgpiZThsRWZLWEdrSmg5MHFYNkl1eEVBZjZaWUd5b2puUDl6ei9HUHZHOFZxTFdlSUNySHVTMEU0VVQxbEY5Z3hlCktGK3c2RDlGejgrdm0yLzdoTk4zV3BWdnJKU0VudTY4d0VxUFNwUDRSQ0hpTVVWaFVFNFEyT00xZkV3WnRONEYKdjZNR244aTF6ZVFmMXhjR0RYcVZkRlVOYUJyOEVCdGlaSjF0NEpXZ3c1UUhWdzBVNXIwRis3aWY1dCtMNHNibgpmcGIyVThXQU5GQW9XUEFTVUhFWE1Mcm1lR084OUxLdG15dXkvdUU1akY2NkN5Q1UzbnVEdVAvalZvMjNFZWs3CmpQS3h3VjJkcEF0TUs5bXlHUFcxbjBzQ0F3RUFBYU5qTUdFd0hRWURWUjBPQkJZRUZGTFlpRHJJbjNobTdZbnoKZXpod2xNa0NBamJRTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SHdZRFZSMGpCQmd3Rm9BVVV0aUlPc2lmZUdidAppZk43T0hDVXlRSUNOdEF3RGdZRFZSMFBBUUgvQkFRREFnRUdNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUNBUUFMCmUzS0h3R0NtU1V5SVdPWWRpUGNVWkVpbTJGZ0tEazhUTmQ4MUhkVHRCakhJZ1Q1cTFkMDdHakx1a0QwUjBpNzAKanNOakxpTm1zR2UrYjdiQUV6bGdxcUkwSlpOMVV0Nm5uYTBPaDRsU2NXb1dQQmtkZy9pYUtXVys5RCthMmZEegpXb2NoY1lCTnkrQTRteis3K3VBd1RjK0cwMlVRR1JqUmx3S3hLM0pDYUt5Z3ZVNWEyaGkvYTVpQjBQMmF2bDRWClNNMFJGYm5BS1Z5MDZJajNQamF1dDJMOUhtTGVjSGdRSEVoYjJyeWtPTHBuN1ZVK1hsZmYxQU5BVElHazBrOWoKcHdsQ0NSVDhBS25DZ0hOUExzQkEyUkY3U09wNkFzRFQ2eWdCSmxoMHdjQnpJbTJUbGYwNWZic3E0L2FDNHl5WApYMDRma1pUNi9peWoySFlhdUUyeU9FK2IraDFJWUhrbTR2UDlxZENhNkhDUFNYclc1YjBLRHRzdDg0Mi82K09rCmZjdkhsWEhvMnFOOHhjTDRkSklFRzRhc3BDSlRRTGFzL2t4MnovdVVNc0ExbjNZL2J1V1FicUNtSnFLNExMN1IKSzRYOXAyakl1Z0Vyc1d4MEhiaHpsZWZ1dDhjbDhBQk1BTEordGd1TEhQUEFVSjRsdWVBSTNqWm0vemVsMGJ0VQpaQ3pKSjdWTGtuNWwvOU10NGJsT3ZIK2tRU0dRUVhlbU9SL3FudU9mMEdadkJleXFkbjYvYXhhZzY3WEgvSkpVCkx5c1JKeVUzZUV4UmFyRHp6RmhkRlBGcVNCWC93Z2Uyc1kwUGpseFFSck05dndHWVQ3SlpWRWMrTkh0NGJWYVQKTG5QcVppaDR6UjBVdjZDUEx5NjRMbzd5RklyTTZiVjgrMnlkREtYaGxnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IE89VHJ1c3RpcyBMaW1pdGVkIE9VPVRydXN0aXMgRlBTIFJvb3QgQ0EKIyBTdWJqZWN0OiBPPVRydXN0aXMgTGltaXRlZCBPVT1UcnVzdGlzIEZQUyBSb290IENBCiMgTGFiZWw6ICJUcnVzdGlzIEZQUyBSb290IENBIgojIFNlcmlhbDogMzYwNTM2NDAzNzUzOTkwMzQzMDQ3MjQ5ODg5NzU1NjM3MTA1NTMKIyBNRDUgRmluZ2VycHJpbnQ6IDMwOmM5OmU3OjFlOjZiOmU2OjE0OmViOjY1OmIyOjE2OjY5OjIwOjMxOjY3OjRkCiMgU0hBMSBGaW5nZXJwcmludDogM2I6YzA6Mzg6MGI6MzM6YzM6ZjY6YTY6MGM6ODY6MTU6MjI6OTM6ZDk6ZGY6ZjU6NGI6ODE6YzA6MDQKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGMxOmI0OjgyOjk5OmFiOmE1OjIwOjhmOmU5OjYzOjBhOmNlOjU1OmNhOjY4OmEwOjNlOmRhOjVhOjUxOjljOjg4OjAyOmEwOmQzOmE2OjczOmJlOjhmOjhlOjU1OjdkCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEWnpDQ0FrK2dBd0lCQWdJUUd4K3R0aUQ1Sk5NMmEvZkg4WXlnV1RBTkJna3Foa2lHOXcwQkFRVUZBREJGCk1Rc3dDUVlEVlFRR0V3SkhRakVZTUJZR0ExVUVDaE1QVkhKMWMzUnBjeUJNYVcxcGRHVmtNUnd3R2dZRFZRUUwKRXhOVWNuVnpkR2x6SUVaUVV5QlNiMjkwSUVOQk1CNFhEVEF6TVRJeU16RXlNVFF3TmxvWERUSTBNREV5TVRFeApNelkxTkZvd1JURUxNQWtHQTFVRUJoTUNSMEl4R0RBV0JnTlZCQW9URDFSeWRYTjBhWE1nVEdsdGFYUmxaREVjCk1Cb0dBMVVFQ3hNVFZISjFjM1JwY3lCR1VGTWdVbTl2ZENCRFFUQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQUQKZ2dFUEFEQ0NBUW9DZ2dFQkFNVlFlNTQ3TmREZnhJek5qcHZ0bzhBMm1mUkM2cWMrZ0lNUHBxZFpoOG1RUlVOKwpBT3FHZVNvRHZUMDNtWWxtdCtXS1ZvYVRuR2hMYUFTTWs1TUNQakRTTnpvaVlZa2NoVTU5ajlXdmV6WDJmaWhICmlUSGNEbmxrSDVuU1c3citmMkMvcmV2blBEZ3BhaS9sa1F0Vi8reHZXTlV0eWQ1TVpuR1BETmNFMmdmbUhoamoKdlNrQ3FQb2M0VnU1ZzZoQlNMd2FjWTNuWXVVdHN1dmZmTS9icTFyS01mRk1Jdk1GRS9lQytYTjVETDdYU3h6QQowUlU4azBGazBlYStJeGNpQUlsZUgydWxyRzZuUzR6dG8zTG1yMk5OTDRYU0ZEV2FMazZNNmpLWUtJYWhrUWxCCk9yVGg0L0w2OE1rS29rSGRxZU1EeDRnVk94elVHcFRYbjJSWkVtMENBd0VBQWFOVE1GRXdEd1lEVlIwVEFRSC8KQkFVd0F3RUIvekFmQmdOVkhTTUVHREFXZ0JTNituRWxlWXRYUVNVaGhndHg2N0prRG9zaFp6QWRCZ05WSFE0RQpGZ1FVdXZweEpYbUxWMEVsSVlZTGNldXlaQTZMSVdjd0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFINVkvLzAxCkdYMmNHRStlc0N1OGpvd1UveXlnMmtkYncrK0JMYThGNm5SSVcvTStUZ2ZIYmNXems4OGlOVnkyUDNVblh3bVcKemFEK3ZrQU1YQkpWK0pPQ3lpbnBYajlXVjRzNE52ZEZHa3dvelo1QnVPMVdUSVNrUU1pNHNLVXJhWEFFYXNQNAoxQkl5K1E3RHNkd3loRVFzYjh0R0QrcG1RUTlQOFZpbHBnME5EMkhlcFo1ZGZXV2hQQmZucUZWTzc2REg3Y1pFCmYxVDFvK0NQOEh4VklvOHB0b0dqNFcxT0xCdUFaK3l0SUo4TVltSFZsLzlEN1MzQjJsMHBLb1UvckdYdWhnOEYKalpCZjMrNmY5TC91SGZ1WTVIK1FLNFI0RUE1c1NWUHZGVnRsUmtwZHI3cjdPbklkemZZbGlCNlh6Q0djS1FFTgpaZXRYMmZOWGxydEl6WUU9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1CdXlwYXNzIENsYXNzIDIgUm9vdCBDQSBPPUJ1eXBhc3MgQVMtOTgzMTYzMzI3CiMgU3ViamVjdDogQ049QnV5cGFzcyBDbGFzcyAyIFJvb3QgQ0EgTz1CdXlwYXNzIEFTLTk4MzE2MzMyNwojIExhYmVsOiAiQnV5cGFzcyBDbGFzcyAyIFJvb3QgQ0EiCiMgU2VyaWFsOiAyCiMgTUQ1IEZpbmdlcnByaW50OiA0NjphNzpkMjpmZTo0NTpmYjo2NDo1YTphODo1OTo5MDo5Yjo3ODo0NDo5YjoyOQojIFNIQTEgRmluZ2VycHJpbnQ6IDQ5OjBhOjc1Ojc0OmRlOjg3OjBhOjQ3OmZlOjU4OmVlOmY2OmM3OjZiOmViOmM2OjBiOjEyOjQwOjk5CiMgU0hBMjU2IEZpbmdlcnByaW50OiA5YToxMTo0MDoyNToxOTo3Yzo1YjpiOTo1ZDo5NDplNjozZDo1NTpjZDo0Mzo3OTowODo0NzpiNjo0NjpiMjozYzpkZjoxMTphZDphNDphMDowZTpmZjoxNTpmYjo0OAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRldUQ0NBMEdnQXdJQkFnSUJBakFOQmdrcWhraUc5dzBCQVFzRkFEQk9NUXN3Q1FZRFZRUUdFd0pPVHpFZApNQnNHQTFVRUNnd1VRblY1Y0dGemN5QkJVeTA1T0RNeE5qTXpNamN4SURBZUJnTlZCQU1NRjBKMWVYQmhjM01nClEyeGhjM01nTWlCU2IyOTBJRU5CTUI0WERURXdNVEF5TmpBNE16Z3dNMW9YRFRRd01UQXlOakE0TXpnd00xb3cKVGpFTE1Ba0dBMVVFQmhNQ1RrOHhIVEFiQmdOVkJBb01GRUoxZVhCaGMzTWdRVk10T1Rnek1UWXpNekkzTVNBdwpIZ1lEVlFRRERCZENkWGx3WVhOeklFTnNZWE56SURJZ1VtOXZkQ0JEUVRDQ0FpSXdEUVlKS29aSWh2Y05BUUVCCkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQU5mSFh2ZkJCOVIzKzBNaDlQVDFhZVR1TWdIYm80WWY1RmtOdXVkMWcxTHIKNmh4aEZVaTdIUWZLaks2dzNKYWQ2c05na29hQ0tIT2NWZ2IvUzJUd0RDbzNTYlhsend4ODd2Rkt1M013WmZQVgpMNE8yZnVQbjlaNnJZUG5UOFoyU2RJcmtISmFzVzREcHRmUXhoNk5SL01kK29XK09VM2ZVbDhGVk01SStHQzkxCjFLMkdTY3VWcjFRR2JOZ0dFNDFiLytFbUdWbkFKTHFCY1htUVJGQm9KSlJmdUxNUjhTbEJZYU5CeXlNMjFjSHgKTWxBUVRuLzBocFBzaE5PT3ZFdS9YQUZPQnozY0ZJcVVDcVRxYy9zTFVlZ1RCeGo2RHZFcjBWUVZmVHpoOTdRWgpRbWRpWG5mZ29sWHN0dGxwRjlVNnIwVHRTc1dlNUhvbmZPVjExNnJMSmVmZmF3cmJEMDJUVHFpZ3pYc3U4bGtCCmFyY051QWVCZm9zNEd6am1DbGVaUGU0aDZLUDFEQmJkaSt3MGpwd3FIQUFWRjQxb2c5SndueGdJelJGbzFjbHIKVXMzRVJvL2N0ZlBZVjNNZTZaUTVCTC9UM2pqZXRGUHNhUnlpZnNTUDVCdHdyZktpK2Z2M0ZtUm1hWjlKVWFMaQpGUmhuQmtwLzFXeTFUYk16NEdIclhiN3BtQTh5MXgxTFBDNWFBVktSQ2ZMZjZvM1lCa0JqcWhIay9zTTNuaFJTClAvVGl6UEpoazlIOVoydlhVcTYvYUt0QVE2QlhOVk40OEZQNFlVSUhaTWJYYjV0TU9BMWpyR0t2Tm91aWN3b04KOVNHOWRLcE42bklEU2R2SFh4MWlZOGY5M1pIc00rNzFiYlJ1TUdqZXlOWW1zSFZlZTdRSElKaWhkaks0VFd4UApBZ01CQUFHalFqQkFNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdIUVlEVlIwT0JCWUVGTW1BZCtCaWtvTDFScHp6CnV2ZE13OTY0bzYwNU1BNEdBMVVkRHdFQi93UUVBd0lCQmpBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQWdFQVUxOGgKOWJxd09sSTVMSkt3YkFESjc4NGc3d2J5bHA3cHBIUi9laGI4dC9XMit4VWJQNnVtd0hKZEVMRng3cnhQNDYycwpBMjB1Y1M2dnhPT3RvNzBNRWFlMC8wcXlleEFRSDZkWFFiTEFydlFzV2RaSEVJanpJVkVwTU1wZ2hxOUdxeDN0Ck9sdXdsTjVFNDBFSW9zSHNIZGI5VDdiV1I5QVVDOHJteXJWN2QzNUJIMTZEeDdhTU9aYXdQNWFCUVc5Z2tPTG8KK2ZzaWNkbDlzejFHdjdTRXI1QWNENDhTYXEvdjdoNTZyZ0pLaWhjcmR2NnNWSWtrTEU4L3RyS25Ub3lva1pmNwpLY1o3WEMyNXkyYTJ0NmhiRWxHRnRRbCtZbmh3L3FscVlMWWREbmtNL2NycUpJQnl3NWMvOG5lclF5SUt4K3UyCkRJU0NMSUJyUVlvSXdPdWxhOStaRXN1SzFWNkFESkhnSmdnMlNNWDZPQkUxL3lXRExmSjZ2OXI5anY2bHkwVXMKSDhTSVU2NTNEdG1hZHNXT0xCMmp1dFhzTXE3QXFxejMwWHBONjlRSDRrajNJbzZ3cEo5cXpvNnlzbUQwb3lMUQpJK3VVV25wcDNRKy9RRmVzYTFsUTJhT1o0VzcralFGNUp5TVYzcEtkZXdsTld1ZExTREJhR09ZS2JlYVA0Tks3CjV0OThiaUdDd1dnNVRiU1lXR1ppekVxUVhzUDZKd1N4ZVJWMG1jeStyU0RlSm1BYzYxWlJwcVBxNUtNL3AvOWgKM1BGYVRXd3lJMFB1cktqdTdrb1NDVHhkY2NLK2VmckNoMmdkQy8xY2Fjd0cwSnA5VkprcXlUa2FHYTlMS2tQegpZMTFhV09JdjR4M2txZGJRQ3RDZXY5ZUJDZkhKeHlZTnJKZ1dWcUE9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1CdXlwYXNzIENsYXNzIDMgUm9vdCBDQSBPPUJ1eXBhc3MgQVMtOTgzMTYzMzI3CiMgU3ViamVjdDogQ049QnV5cGFzcyBDbGFzcyAzIFJvb3QgQ0EgTz1CdXlwYXNzIEFTLTk4MzE2MzMyNwojIExhYmVsOiAiQnV5cGFzcyBDbGFzcyAzIFJvb3QgQ0EiCiMgU2VyaWFsOiAyCiMgTUQ1IEZpbmdlcnByaW50OiAzZDozYjoxODo5ZToyYzo2NDo1YTplODpkNTo4ODpjZTowZTpmOTozNzpjMjplYwojIFNIQTEgRmluZ2VycHJpbnQ6IGRhOmZhOmY3OmZhOjY2Ojg0OmVjOjA2OjhmOjE0OjUwOmJkOmM3OmMyOjgxOmE1OmJjOmE5OjY0OjU3CiMgU0hBMjU2IEZpbmdlcnByaW50OiBlZDpmNzplYjpiYzphMjo3YToyYTozODo0ZDozODo3Yjo3ZDo0MDoxMDpjNjo2NjplMjplZDpiNDo4NDozZTo0YzoyOTpiNDphZToxZDo1Yjo5MzozMjplNjpiMjo0ZAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRldUQ0NBMEdnQXdJQkFnSUJBakFOQmdrcWhraUc5dzBCQVFzRkFEQk9NUXN3Q1FZRFZRUUdFd0pPVHpFZApNQnNHQTFVRUNnd1VRblY1Y0dGemN5QkJVeTA1T0RNeE5qTXpNamN4SURBZUJnTlZCQU1NRjBKMWVYQmhjM01nClEyeGhjM01nTXlCU2IyOTBJRU5CTUI0WERURXdNVEF5TmpBNE1qZzFPRm9YRFRRd01UQXlOakE0TWpnMU9Gb3cKVGpFTE1Ba0dBMVVFQmhNQ1RrOHhIVEFiQmdOVkJBb01GRUoxZVhCaGMzTWdRVk10T1Rnek1UWXpNekkzTVNBdwpIZ1lEVlFRRERCZENkWGx3WVhOeklFTnNZWE56SURNZ1VtOXZkQ0JEUVRDQ0FpSXdEUVlKS29aSWh2Y05BUUVCCkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQUtYYUNwVVdVT09WOGw2ZGRqRUdNbnFiOFJCMnVBQ2F0VkkyelNSSHNKOFkKWkx5YTl2clZlZGlRWWt3aUw5NDRQZGJncU9rY0xOdDRFZW1PYUZFVmNzZnpNNGZrb0YwTFhPQlhCeW93OWMzRQpOM2NvVFJpUjVyL1ZVdjF4TFhBKzU4YkVpdVB3S0F2MGRwaWhpNGRWc2pvVC9MYytKemVPSXVPb1R5cnZZTHM5CnR6bkREZ0ZIbVYwU1Q5dEQrbGVoN2ZtZHZoRkhKbHNUbUt0ZEZvcXdOeHhYblVYL2lKWTJ2N3ZLQjN0dmgyUFgKMERKcTFsMXNEUEd6YmpuaWF6RXVPUUFuRk40NHdPd1pab1lTNkoxeUZoTmtVc2VwTnh6OWdqRHRoQmdkOUs1YwovM0FUQU91eDlUTjZTOVpWK0FXTlMybXc5Yk1vTmx3VXhGRnpUV3NMOFRRSDJ4YzUxOXdvZTJ2MW4vTXV3VThYCktoRHp6TXJvNi8xcnF5NmFueTJDYmdUVVVnR1RMVDJHL0g3ODMrOUNIYVpyNzdrZ3h2ZTlvS2VWL2FmbWlTVFkKekl3MGJPSWpMOWtTR2lHNVZaRnZDNUY1R1F5dFFJZ0xjT0o2MGc3WWFFaTdnaE01RUZqcDJDb0h4aExiV052UwpPMVVRUndVVloySitHR09tUmo4SkRsUXlYcjhOWW5vbjc0RG8yOWxMQmxvM1dpWFFDQkozMUc4SlVKYzl5QjNECjM0eEZNRmJHMDJTclp2UEFYcGFjdzhUdnczeHJpenA1ZjdOSnp6M2lpWitnTUV1RnVaeVVKSG1QZld1cFJXZ1AKSzlEeDJoekxhYmpLU1dKdHlOQmpZdDFnRDFpcWo2RzhCYVZtb3M4YmRyS0VaTEZNT1ZMQU1McndqRXNDc0xhMwpBZ01CQUFHalFqQkFNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdIUVlEVlIwT0JCWUVGRWU0emYvbGIrNzRzdXd2ClRnNzVKYkNPUEd2RE1BNEdBMVVkRHdFQi93UUVBd0lCQmpBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQWdFQUFDQWoKUVRVRWtNSkFZbUR2NGpWTTF6K3M0alNRdUtGdmR2b1dGcVJJTnl6cGtNTHlQUGdLbjlpQjVidGIyaVVzcEtkVgpjU1F5OXNnTDhyeHErSk9zc2dmQ1g1L2J6TWlLcXI1cWIrRkpFTXd4MTRDN3U4allvZzVrVitxaTljS3BNUlhTCklHcnMvQ0lCS00rR3VJQWVxY3dScFR6eUZyTkhuZnpTZ0NIRXk5QkhjRUdoeW9NWkNDeHQ4bDEzbklvVUU5UTIKSEpMdzVRWTMzS2Jta0pzNGoxeHJHMGFHUTBKZlBnRUhVMVJkWlgzM2luT2htbFJhSHlsREZDZkNoUSsxaUhzYQpPNVMzSFdDbnRaem5LV2xYV3B1VGVrTXdHd1BYWXNoQXBxcjhaT1JLMTVGVEFhZ2dpRzZjWDBTNXkyQ0JOT3h2CjAzM2FTRi9ydEpDOExha2NDNndjMWFKb0lJQUUxdnl4ankrN1NqRU5Tb1ljNitJMktTYjEydGpFOG5WaHozNnUKZG1OS2VrQmxrNGY0SG9DTWh1V0cxbzhPL0ZNc1lPZ1dZUnFpUGtON3pUbGdWR3IxOG9rbUFXaURTS0l6Nk1rRQprYklSTkJFKzZ0QkRHUjhEazVBTS8xRTlWL1JCYnVITG9MN3J5V1BOYmN6aytEYXFhSjN0dlYyWGNFUU50ZzQxCjNPRU1YYnVnVVpUTGZoYnJFUytqa2tYSVRISFp2TW1aVWxkR0wxRFB2VFZwOUQwVnpnYWxMQTgrOW9HNmxMdkQKdTc5bGVOS0dlZjlKT3hxRERQRGVlT3pJOGsxTUd0NkNLZmpCV3RydDd1WW5YdWhGMEowY1VhaG9xMFRqMEl0cQo0L2c3dTl4TjEyVHlVYjdtcXF0YTZUSHVCcnh6dnhOaUNwL0h1WmM9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1ULVRlbGVTZWMgR2xvYmFsUm9vdCBDbGFzcyAzIE89VC1TeXN0ZW1zIEVudGVycHJpc2UgU2VydmljZXMgR21iSCBPVT1ULVN5c3RlbXMgVHJ1c3QgQ2VudGVyCiMgU3ViamVjdDogQ049VC1UZWxlU2VjIEdsb2JhbFJvb3QgQ2xhc3MgMyBPPVQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkggT1U9VC1TeXN0ZW1zIFRydXN0IENlbnRlcgojIExhYmVsOiAiVC1UZWxlU2VjIEdsb2JhbFJvb3QgQ2xhc3MgMyIKIyBTZXJpYWw6IDEKIyBNRDUgRmluZ2VycHJpbnQ6IGNhOmZiOjQwOmE4OjRlOjM5OjkyOjhhOjFkOmZlOjhlOjJmOmM0OjI3OmVhOmVmCiMgU0hBMSBGaW5nZXJwcmludDogNTU6YTY6NzI6M2U6Y2I6ZjI6ZWM6Y2Q6YzM6MjM6NzQ6NzA6MTk6OWQ6MmE6YmU6MTE6ZTM6ODE6ZDEKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGZkOjczOmRhOmQzOjFjOjY0OjRmOmYxOmI0OjNiOmVmOjBjOmNkOmRhOjk2OjcxOjBiOjljOmQ5Ojg3OjVlOmNhOjdlOjMxOjcwOjdhOmYzOmU5OjZkOjUyOjJiOmJkCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEd3pDQ0FxdWdBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUXNGQURDQmdqRUxNQWtHQTFVRUJoTUNSRVV4Ckt6QXBCZ05WQkFvTUlsUXRVM2x6ZEdWdGN5QkZiblJsY25CeWFYTmxJRk5sY25acFkyVnpJRWR0WWtneEh6QWQKQmdOVkJBc01GbFF0VTNsemRHVnRjeUJVY25WemRDQkRaVzUwWlhJeEpUQWpCZ05WQkFNTUhGUXRWR1ZzWlZObApZeUJIYkc5aVlXeFNiMjkwSUVOc1lYTnpJRE13SGhjTk1EZ3hNREF4TVRBeU9UVTJXaGNOTXpNeE1EQXhNak0xCk9UVTVXakNCZ2pFTE1Ba0dBMVVFQmhNQ1JFVXhLekFwQmdOVkJBb01JbFF0VTNsemRHVnRjeUJGYm5SbGNuQnkKYVhObElGTmxjblpwWTJWeklFZHRZa2d4SHpBZEJnTlZCQXNNRmxRdFUzbHpkR1Z0Y3lCVWNuVnpkQ0JEWlc1MApaWEl4SlRBakJnTlZCQU1NSEZRdFZHVnNaVk5sWXlCSGJHOWlZV3hTYjI5MElFTnNZWE56SURNd2dnRWlNQTBHCkNTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDOWRaUHdZaUp2Sks3Z2VuYXNmYjNaSk5XNHQvek4KOEVMZzYzaUlWbDZibWxRZFRReUs5dFBQY1BSU3RkaVRCT05HaG5GQlNpdndLaXhWQTlaSXcrQTVPTzN5WER3LwpSTHlUUFdHclRzME52dkFnSjFnT1JIOEVHb2VsMTVZVU5wRFFTWHVoZGZzYWEzT3grTTZwQ1N6eVU5WERGRVM0CmhxWDJpeXM1MnFNelZObjZjaHIzSWhVY2lKRnJmMmJsdzJxQXNDVHozNFpGaVAwWmYzV0hIeCt4R3dwekpGdTUKWmVBc1ZNaGcwMllYUCtITVZETnprUUk2cG45N2RqbWlINWEyT0s2MXlKTjBIWjY1dE9WZ25TOVcwZURyWGx0TQpFbkFNYkVRZ3F4SFk5Qm4yMHB4U04rZjZ0c0l4TzByVUZKbXR4eHIxWFYvNkI3aDhEUi9XZ3g2ekFnTUJBQUdqClFqQkFNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEZ1lEVlIwUEFRSC9CQVFEQWdFR01CMEdBMVVkRGdRV0JCUzEKQS9kMk8yR0NhaEtxR0ZQckF5R1V2LzdPeWpBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQVFFQVZqM3ZsTlc5Mm5PeQpXTDZ1a0syWUo1ZitBYkd3VWdDNFRlUWJJWFFiZnNEdVhta3FKYTljMWgzYTBubko4NWNwNElhSDNnUlpEL0ZaCjFHU0ZTNW12SlFRZXlVYXBsOTZDc2h0d241ejJyM0V4M1hzRnBTelR1Y3BIOXNyeTl1ZXR1VWcvdkJhM3dXMzAKNmdtdjdQTzE1d1dlcGg2S1UxSFdrNEhNZEpQMnVkcW1KUVYwZVZwK1FENkNTeVlSTUc3aFAwSEhSd0ExMWZYVAo5MVErZ1QzYVNXcWFzKzhRUGVicmI5SElJa2ZMek04Qk1aTFpHT01pdmdrZUdqNWFzdVJyREZSNmZVTk91SW1sCmU5ZWlQWmFHelBJbU5DMXFrcDJhR3RBdzRsMU9CTEJmaXlCK2Q4RTlsWUxSUnBvN1BIaTRiNkhRRFdTaWVCNHAKVHBQRHBGUVVXdz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1FRSBDZXJ0aWZpY2F0aW9uIENlbnRyZSBSb290IENBIE89QVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1cwojIFN1YmplY3Q6IENOPUVFIENlcnRpZmljYXRpb24gQ2VudHJlIFJvb3QgQ0EgTz1BUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzCiMgTGFiZWw6ICJFRSBDZXJ0aWZpY2F0aW9uIENlbnRyZSBSb290IENBIgojIFNlcmlhbDogMTEyMzI0ODI4Njc2MjAwMjkxODcxOTI2NDMxODg4NDk0OTQ1ODY2CiMgTUQ1IEZpbmdlcnByaW50OiA0Mzo1ZTo4ODpkNDo3ZDoxYTo0YTo3ZTpmZDo4NDoyZTo1MjplYjowMTpkNDo2ZgojIFNIQTEgRmluZ2VycHJpbnQ6IGM5OmE4OmI5OmU3OjU1OjgwOjVlOjU4OmUzOjUzOjc3OmE3OjI1OmViOmFmOmMzOjdiOjI3OmNjOmQ3CiMgU0hBMjU2IEZpbmdlcnByaW50OiAzZTo4NDpiYTo0Mzo0Mjo5MDo4NToxNjplNzo3NTo3MzpjMDo5OToyZjowOTo3OTpjYTowODo0ZTo0Njo4NTo2ODoxZjpmMTo5NTpjYzpiYTo4YToyMjo5Yjo4YTo3NgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRUF6Q0NBdXVnQXdJQkFnSVFWSUQ1b0hQdFB3Qk15b25ZNDNIbVNqQU5CZ2txaGtpRzl3MEJBUVVGQURCMQpNUXN3Q1FZRFZRUUdFd0pGUlRFaU1DQUdBMVVFQ2d3WlFWTWdVMlZ5ZEdsbWFYUnpaV1Z5YVcxcGMydGxjMnQxCmN6RW9NQ1lHQTFVRUF3d2ZSVVVnUTJWeWRHbG1hV05oZEdsdmJpQkRaVzUwY21VZ1VtOXZkQ0JEUVRFWU1CWUcKQ1NxR1NJYjNEUUVKQVJZSmNHdHBRSE5yTG1WbE1DSVlEekl3TVRBeE1ETXdNVEF4TURNd1doZ1BNakF6TURFeQpNVGN5TXpVNU5UbGFNSFV4Q3pBSkJnTlZCQVlUQWtWRk1TSXdJQVlEVlFRS0RCbEJVeUJUWlhKMGFXWnBkSE5sClpYSnBiV2x6YTJWemEzVnpNU2d3SmdZRFZRUUREQjlGUlNCRFpYSjBhV1pwWTJGMGFXOXVJRU5sYm5SeVpTQlMKYjI5MElFTkJNUmd3RmdZSktvWklodmNOQVFrQkZnbHdhMmxBYzJzdVpXVXdnZ0VpTUEwR0NTcUdTSWIzRFFFQgpBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRRElJTURzNE1WTHF3ZDRsZk5FN3ZzTERQOTBqbUc3c1dMcUk5aXJvV1V5CmV1dU9GMCtXMkFwN2thSmpiTWVNVEM1NXY2a0YvR2xjbFkxaStibHc3Y05SZmRDVDVtenJNRXZodkgyL1Vwdk8KYm50bDhqaXh3S0l5NzJLeWFPQmhVOEUybGYvc2xMbzJycHdjcHpJUDVYeTB4bTkwL1hzWTZLeFg3UVlnU3pJdwpXRnY5emFqbW9meHd2STZTYzl1WHAzd2hyajNCOVVpSGJDZTlueVYwZ1ZXdzkzWDJQYVJrYTlaUDU4NUFyUS9kCk10TzhpaEpUbU1tSit4QWRUWDdOZmg5V0RTRndoZllnZ3gvMnVoOEVqK3AzaURYRS8rcE9vWXROUDJNYlJNTkUKMUNWMnlyZU4xeDVLWm1UTlhNV2NnK0hDQ0lpYTdFNmo4VDRjTE5sc0hhRkxBZ01CQUFHamdZb3dnWWN3RHdZRApWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUNBUVl3SFFZRFZSME9CQllFRkJMeVdqN3FWaHkvCnpRYXM4ZkVseWFsTDFCU1pNRVVHQTFVZEpRUStNRHdHQ0NzR0FRVUZCd01DQmdnckJnRUZCUWNEQVFZSUt3WUIKQlFVSEF3TUdDQ3NHQVFVRkJ3TUVCZ2dyQmdFRkJRY0RDQVlJS3dZQkJRVUhBd2t3RFFZSktvWklodmNOQVFFRgpCUUFEZ2dFQkFIdjI1TUFOcWhsSHQwMVhvLzZ0dTdGcTFRK2UyK1JqeFk2aFVGYVRscmc0d0NRaVpyeFRGR0dWCnY5REhLcFk1UDMwb3N4QkFJV3JFcjdCU2R4amhsdGhXWGVQZE5sNGRwMUJVb01VcTVLcU1sSXBQblRYL2RxUUcKRTVHaW9uMEFSRDlWMDRJOEd0VmJ2RlpNSWk1R1E0b2tRQzN6RXJnN2NCcWtscmthcjRkQkdtb1lEUVpQeHo1dQp1U2xORFVtSkVZY3lXK1pMQk1qa1hPWjBjNVJkRnBnVGxmNzcyN0ZFNVRwd3JEZHI1ck16Y2lqSnMxZWc5Z0lXCmlBWUx0cVpMSUNqVTNqMkxyVGNGVTNUK2JzeThReGR4WHZuRnpCcXBZZTczZGd6emN2UnlyYzl5QWpZSFI4L3YKR1ZDSllNenBKSlVQd3NzZDhtOTJrTWZNZGNHV3haMD0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOSBPPUQtVHJ1c3QgR21iSAojIFN1YmplY3Q6IENOPUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOSBPPUQtVHJ1c3QgR21iSAojIExhYmVsOiAiRC1UUlVTVCBSb290IENsYXNzIDMgQ0EgMiAyMDA5IgojIFNlcmlhbDogNjIzNjAzCiMgTUQ1IEZpbmdlcnByaW50OiBjZDplMDoyNTo2OTo4ZDo0NzphYzo5Yzo4OTozNTo5MDpmNzpmZDo1MTozZDoyZgojIFNIQTEgRmluZ2VycHJpbnQ6IDU4OmU4OmFiOmIwOjM2OjE1OjMzOmZiOjgwOmY3OjliOjFiOjZkOjI5OmQzOmZmOjhkOjVmOjAwOmYwCiMgU0hBMjU2IEZpbmdlcnByaW50OiA0OTplNzphNDo0MjphYzpmMDplYTo2Mjo4NzowNTowMDo1NDpiNToyNTo2NDpiNjo1MDplNDpmNDo5ZTo0MjplMzo0ODpkNjphYTozODplMDozOTplOTo1NzpiMTpjMQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRU16Q0NBeHVnQXdJQkFnSURDWVB6TUEwR0NTcUdTSWIzRFFFQkN3VUFNRTB4Q3pBSkJnTlZCQVlUQWtSRgpNUlV3RXdZRFZRUUtEQXhFTFZSeWRYTjBJRWR0WWtneEp6QWxCZ05WQkFNTUhrUXRWRkpWVTFRZ1VtOXZkQ0JECmJHRnpjeUF6SUVOQklESWdNakF3T1RBZUZ3MHdPVEV4TURVd09ETTFOVGhhRncweU9URXhNRFV3T0RNMU5UaGEKTUUweEN6QUpCZ05WQkFZVEFrUkZNUlV3RXdZRFZRUUtEQXhFTFZSeWRYTjBJRWR0WWtneEp6QWxCZ05WQkFNTQpIa1F0VkZKVlUxUWdVbTl2ZENCRGJHRnpjeUF6SUVOQklESWdNakF3T1RDQ0FTSXdEUVlKS29aSWh2Y05BUUVCCkJRQURnZ0VQQURDQ0FRb0NnZ0VCQU5PeVNzOTZSKzkxbXlQNk9pL1dVRVdKTlRyR2E5disyd0JvcU9BREVSMDMKVUFpZlRVcG9sRFd6VTlHVVk2Y2dWcS9lVVhqc0tqM3pTRWhRUGdyZlJsV0xKMjNERUUwTmtWSkQySWZnWFU0Mgp0U0hLWHpsQUJGOWJmc3lqeGl1cFFCN1pOb1RXU1BPU0hqUkdJQ1RCcEZHT1NocnZVRDlwWFJsL1JjUEhBWTlSCnlTUG9jcTYwdkZZSmZ4TExITEd2S1pBS3lWWE1EOU8wR3UxSE5WcEs3Wnh6QkNIUXFyME1FN1VBeWlac3hHc00KbEZxVmxOcFFtdkgvcFN0bU1hVEpPS0RmSFIrNENTN3pwK2huVXF1VkgrQkdQdGlrdzhwYXhUR0E2RWlhbjVScAovaG5kMkhOOGdjcVczbzd0c3pJRlpZUTA1dWI5VnhDMVgzYS9MN0FRRGNVQ0F3RUFBYU9DQVJvd2dnRVdNQThHCkExVWRFd0VCL3dRRk1BTUJBZjh3SFFZRFZSME9CQllFRlAzYUZNU2ZNTjRodlI1Q09meXJZeU5KNFBHRU1BNEcKQTFVZER3RUIvd1FFQXdJQkJqQ0Iwd1lEVlIwZkJJSExNSUhJTUlHQW9INmdmSVo2YkdSaGNEb3ZMMlJwY21WagpkRzl5ZVM1a0xYUnlkWE4wTG01bGRDOURUajFFTFZSU1ZWTlVKVEl3VW05dmRDVXlNRU5zWVhOekpUSXdNeVV5Ck1FTkJKVEl3TWlVeU1ESXdNRGtzVHoxRUxWUnlkWE4wSlRJd1IyMWlTQ3hEUFVSRlAyTmxjblJwWm1sallYUmwKY21WMmIyTmhkR2x2Ym14cGMzUXdRNkJCb0QrR1BXaDBkSEE2THk5M2QzY3VaQzEwY25WemRDNXVaWFF2WTNKcwpMMlF0ZEhKMWMzUmZjbTl2ZEY5amJHRnpjMTh6WDJOaFh6SmZNakF3T1M1amNtd3dEUVlKS29aSWh2Y05BUUVMCkJRQURnZ0VCQUgrWDJ6REkzNlNjZlNGNmdIRE9GQkpwaUJTVllFUUJyTExwTUUrYlVNSm0ySDZOTUxWd01lbmkKYWNmemNOc2dGWWJRRGZDK3JBRjFoTTUrbjAyL3QyQTduUFBLSGVKZWFOaWpuWmZsUUdEU05pSCswTFM0RjlwMApvMy9VMzdDWUFxeHZhMnNzSlNSeW9XWHVKVnJsNWpMbjh0K3JTZnJ6a0drajJ3VFo1MXhZL0dYVWw3N00vQzRLCnpDVXFOUVQ0WUpFVmRUMUIveU1mR2NoczY0SlRCS2JrVENKTmpZeTZ6bHR6N0dSVVVHM1JuRlg3YWNNMnc0eTgKUElXbWF3b21EZUNUbUdDdWZzWWtsNHBoWDVHT1pwSUpoemJOaTVzdFB2WlIxRkRVV1NpOWcvTE1LSHRUaG0zWQpKb2h3MStxUnpUNjV5c0NRYmxyR1huUmwxMXorbytJPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049RC1UUlVTVCBSb290IENsYXNzIDMgQ0EgMiBFViAyMDA5IE89RC1UcnVzdCBHbWJICiMgU3ViamVjdDogQ049RC1UUlVTVCBSb290IENsYXNzIDMgQ0EgMiBFViAyMDA5IE89RC1UcnVzdCBHbWJICiMgTGFiZWw6ICJELVRSVVNUIFJvb3QgQ2xhc3MgMyBDQSAyIEVWIDIwMDkiCiMgU2VyaWFsOiA2MjM2MDQKIyBNRDUgRmluZ2VycHJpbnQ6IGFhOmM2OjQzOjJjOjVlOjJkOmNkOmM0OjM0OmMwOjUwOjRmOjExOjAyOjRmOmI2CiMgU0hBMSBGaW5nZXJwcmludDogOTY6Yzk6MWI6MGI6OTU6YjQ6MTA6OTg6NDI6ZmE6ZDA6ZDg6MjI6Nzk6ZmU6NjA6ZmE6Yjk6MTY6ODMKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGVlOmM1OjQ5OjZiOjk4OjhjOmU5Ojg2OjI1OmI5OjM0OjA5OjJlOmVjOjI5OjA4OmJlOmQwOmIwOmYzOjE2OmMyOmQ0OjczOjBjOjg0OmVhOmYxOmYzOmQzOjQ4OjgxCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFUXpDQ0F5dWdBd0lCQWdJRENZUDBNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1GQXhDekFKQmdOVkJBWVRBa1JGCk1SVXdFd1lEVlFRS0RBeEVMVlJ5ZFhOMElFZHRZa2d4S2pBb0JnTlZCQU1NSVVRdFZGSlZVMVFnVW05dmRDQkQKYkdGemN5QXpJRU5CSURJZ1JWWWdNakF3T1RBZUZ3MHdPVEV4TURVd09EVXdORFphRncweU9URXhNRFV3T0RVdwpORFphTUZBeEN6QUpCZ05WQkFZVEFrUkZNUlV3RXdZRFZRUUtEQXhFTFZSeWRYTjBJRWR0WWtneEtqQW9CZ05WCkJBTU1JVVF0VkZKVlUxUWdVbTl2ZENCRGJHRnpjeUF6SUVOQklESWdSVllnTWpBd09UQ0NBU0l3RFFZSktvWkkKaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFKbnhoRFJ3dWkrM01LQ092WHdFejc1aXZKbjlncGZTZWdwbgpsamdKOWhCT2xTSnptWTNhRlMzbkJmd1pjeUszanBnQXZEdzlyS0ZzKzlaNUpVdXQ4TXhrMm9nK0tiZ1BDZE0wCjNUUDFZdEhoelJucDdoaFBURml1NGg3V0RGc1ZXdGc2dU1RWVpCN2pNN0sxaVhkT0RML1psR3NUbDI4U28vNloKcVFUTUZleGdhRGJ0Q0h1MzliK1Q3V1l4ZzR6R2NUU0hUaGZxcjR1UmpSeFdRYTRpTjE0MzhoM1owUzBOTDJsUgpwNzVtcG9vNktyM0hHckhoRlBDK09oMjV6MXV4YXY2MHNVWWdvdnNlTzNEdms1aDlqSE9XOHNYdmhYQ3RLU2I4CkhnUStIS0RZRDh0U2cySjg3b3RUbFpDcFY2THFZUVhZK1UzRUovcHVyZTM1MTFIM2E2VUNBd0VBQWFPQ0FTUXcKZ2dFZ01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZOT1Vpa3hpRXlvWkxzeXZjb3A5TnRlYQpITnhuTUE0R0ExVWREd0VCL3dRRUF3SUJCakNCM1FZRFZSMGZCSUhWTUlIU01JR0hvSUdFb0lHQmhuOXNaR0Z3Ck9pOHZaR2x5WldOMGIzSjVMbVF0ZEhKMWMzUXVibVYwTDBOT1BVUXRWRkpWVTFRbE1qQlNiMjkwSlRJd1EyeGgKYzNNbE1qQXpKVEl3UTBFbE1qQXlKVEl3UlZZbE1qQXlNREE1TEU4OVJDMVVjblZ6ZENVeU1FZHRZa2dzUXoxRQpSVDlqWlhKMGFXWnBZMkYwWlhKbGRtOWpZWFJwYjI1c2FYTjBNRWFnUktCQ2hrQm9kSFJ3T2k4dmQzZDNMbVF0CmRISjFjM1F1Ym1WMEwyTnliQzlrTFhSeWRYTjBYM0p2YjNSZlkyeGhjM05mTTE5allWOHlYMlYyWHpJd01Ea3UKWTNKc01BMEdDU3FHU0liM0RRRUJDd1VBQTRJQkFRQTA3WHRhUEtTVWlPOGFFWFVITDdQK1BQb2VVU2JyaC9ZcAozdUR4MU1Za0NlbkJ6MVVidEREWnpocitCbEdtRmFRdDc3Skx2eUFvSlVuUnBqWjNOT2hrMzFLeEVjZHplczA1Cm5zS3RqSEVoOGxwcnI5ODhUbFd2c29SbEZJbTVkOHNxTWI3UG8yM1BiMGlVTWtadjUzR01vS2FFR1RjSDhnTkYKQ1N1R2RYemZYMmxYQU50dTJLWnlJa3RRMUhXWVZ0KzNHUDlEUTFDdWVrUjc4SGxSMTBNOXA5T0IwL0RKVDduYQp4cGVHMElMRDVFSnQvckRpWkU0T0p1ZEFOQ2ExQ0luWENHTmpPQ2QxSGpQcWJxamRuNWxQZEUyQmlZQkwzWnFYCktWd3Z2b0ZCdVl6LzZuMWdCcDdOMXozVExxTVZ2S2ptSnVWdnc5eTRBeUhxbnhieExGUzEKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUNBIERpc2lnIFJvb3QgUjIgTz1EaXNpZyBhLnMuCiMgU3ViamVjdDogQ049Q0EgRGlzaWcgUm9vdCBSMiBPPURpc2lnIGEucy4KIyBMYWJlbDogIkNBIERpc2lnIFJvb3QgUjIiCiMgU2VyaWFsOiAxMDU3MjM1MDYwMjM5MzMzODIxMQojIE1ENSBGaW5nZXJwcmludDogMjY6MDE6ZmI6ZDg6Mjc6YTc6MTc6OWE6NDU6NTQ6Mzg6MWE6NDM6MDE6M2I6MDMKIyBTSEExIEZpbmdlcnByaW50OiBiNTo2MTplYjplYTphNDpkZTplNDoyNTo0Yjo2OToxYTo5ODphNTo1Nzo0NzpjMjozNDpjNzpkOTo3MQojIFNIQTI1NiBGaW5nZXJwcmludDogZTI6M2Q6NGE6MDM6NmQ6N2I6NzA6ZTk6ZjU6OTU6YjE6NDI6MjA6Nzk6ZDI6Yjk6MWU6ZGY6YmI6MWY6YjY6NTE6YTA6NjM6M2U6YWE6OGE6OWQ6YzU6Zjg6MDc6MDMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZhVENDQTFHZ0F3SUJBZ0lKQUpLNGlOdXdpc0ZqTUEwR0NTcUdTSWIzRFFFQkN3VUFNRkl4Q3pBSkJnTlYKQkFZVEFsTkxNUk13RVFZRFZRUUhFd3BDY21GMGFYTnNZWFpoTVJNd0VRWURWUVFLRXdwRWFYTnBaeUJoTG5NdQpNUmt3RndZRFZRUURFeEJEUVNCRWFYTnBaeUJTYjI5MElGSXlNQjRYRFRFeU1EY3hPVEE1TVRVek1Gb1hEVFF5Ck1EY3hPVEE1TVRVek1Gb3dVakVMTUFrR0ExVUVCaE1DVTBzeEV6QVJCZ05WQkFjVENrSnlZWFJwYzJ4aGRtRXgKRXpBUkJnTlZCQW9UQ2tScGMybG5JR0V1Y3k0eEdUQVhCZ05WQkFNVEVFTkJJRVJwYzJsbklGSnZiM1FnVWpJdwpnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFDaW84UUFDZGFGWFMxdEZQYkN3M09lCk5jSnhWWDZCKzZ0R1VPREJmRWw0NXF0NVdEemEvM3djbjlpWEFuZythMEVFNlVHOXZnTXNSZll2Wk5TclhhTkgKUFdTYjZXaWF4c3diUDdxK3NvczBBaTZZVlJuOGpHK3FYOXBNemswRElhUFkwalNUVnBiTFRBd0FGanhmR3MzSQp4MnltcmRNeHA3em81ZUZtMXRMN0E3UkJaY2tRcmc0Rlk4YUFhbWt3L2RMdWtPOE5KOStmbFhQMDRTWGFiQmJlClFUZzA2b3Y4MGVnRUZHRXRRWDZzeDNkT3kxRlUrMTZTR0JzRVdtakd5Y1Q2dHhPZ21MY1JLN2ZXVjh4OG5oZlIKeXlYK2hrNGtMbFlNZUUyZUFSS21LNmNCWlc1OFloMkVoTi9xd0d1MXBTcVZnOE5URVF4ekhRdXlScERSUWpyTwpRRzZWcmYvR2xLMXVsNFNPZlcrZWlvQU5TVzF6NG51U0hzUHp3ZlByTGdWdjJSdlBOM1lFeUxSYTVCZW55OTEyCkg5QVpkdWdzQmJQV25EVFlsdHhoaDVFRjVFUUlNOEhhdVFobDFLNnlOZzNydWppNkRPV2JudXVOWnQyWno5YUoKUWZZRWtvb3BLVzFyT2h6bmRYMENjUTd6d09lOXl4bmRuV0N5d21aZ3RyRUU3c25taHJtYVprQ281eEh0Z1VVRAppL1puV2VqQkJoRzkzYytBQWs5bFFIaGNSMURJbStZZmdYdmtSS2hiaFpyaTNsclZ4L2s2UkdaTDVESlVmT1JzCm5MTU9QUmVpc2pRUzFuNnlxRW03MFhvb1FMNmlGaC9mNURjZkVYUDdrQXBsUTZJTmZQZ0dBVlV6ZmJBTnVQVDEKcnFWQ1YzdzJFWXg3WHNRRG5ZeDVuUUlEQVFBQm8wSXdRREFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQTRHQTFVZApEd0VCL3dRRUF3SUJCakFkQmdOVkhRNEVGZ1FVdFpuNHI3Q1U5ZU1nMWdxdHprNVdwQzV1UXUwd0RRWUpLb1pJCmh2Y05BUUVMQlFBRGdnSUJBQ1lHWG5EblpUUElnbTdabkJjNkczcG1zZ0gyZUR0cFhpL3EvMDc1S01PWUttRk0KdENRU2luMXRFUlQzbkxYSzVyeWVKNDVNR2NpcHZYckExellPYllWeWJxakdvbTMyK25OamY3eHVlUWdjbllxZgpHb3BUcHRpNzJUVlZzUkhGcVFPelZqdTVoSk1pWG43QjloSlNpK29zWjd6K05rejF1TS9SczBtU085TXBEcGtiCmx2ZGh1RHZFSzdaNGJMUWpiL0Q5MDdKZWRSK1psYWlzOXRyaHhURjcrOUZHczlLOFo3UmlWTG9KOTJPd2s2S2EKK2VsU0xvdGdFcXY4OVdCVzd4QmNpOFFhUXR5RFcyUU95N1c4MWsvQmZEeHVqUk50KzN2ck1ORGNUYS9GMWJhbApURnR4eWVneHZ1ZzRCa2loR3VMcTB0NFNPVmdhLzRBT2duWG10OGtIYkE3di96anhtSEhFdDM4T0ZkQWxhYjBpCm5TdnRCZlpHUjZ6dHdQRFVPK0xzN3BaYmtCTk9IbFk2NjdEdmxydVdJeEc2OGtPR2RHU1Z5Q2gxM3gwMXV0STMKZ3poVE9EWTd6MnpwK1dzTzBQc0U2RTkzMTJVQmVJWU1lajRoWXZGL1kzRU15WjlFMjZnbm9uVytib0UrMThEcgpHNWdQY0Z3MHNvck13SVVZNjI1NnMvZGFvUWUvcVVLUzgyQWlsK1FVb1FlYlRuYkFqbjM5cENYSFIrMy9IM09zCnpNT2w2VzhLanB0bHdsQ0Z0YU9nVXhMTVZZZGg4NEd1RUVaaHZVUWh1TUk5ZE05K0pEWDZIQWNPbXowaXl1OHgKTDR5c0VyM3ZRQ2o4S1dlZnNoTlBaaVRFVXhucEhpa1Y3K1p0c0g4dFovM3piQnQxUnFQbFNoZnBwTmNMCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1BQ0NWUkFJWjEgTz1BQ0NWIE9VPVBLSUFDQ1YKIyBTdWJqZWN0OiBDTj1BQ0NWUkFJWjEgTz1BQ0NWIE9VPVBLSUFDQ1YKIyBMYWJlbDogIkFDQ1ZSQUlaMSIKIyBTZXJpYWw6IDY4Mjg1MDMzODQ3NDg2OTY4MDAKIyBNRDUgRmluZ2VycHJpbnQ6IGQwOmEwOjVhOmVlOjA1OmI2OjA5Ojk0OjIxOmExOjdkOmYxOmIyOjI5OjgyOjAyCiMgU0hBMSBGaW5nZXJwcmludDogOTM6MDU6N2E6ODg6MTU6YzY6NGY6Y2U6ODg6MmY6ZmE6OTE6MTY6NTI6Mjg6Nzg6YmM6NTM6NjQ6MTcKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDlhOjZlOmMwOjEyOmUxOmE3OmRhOjlkOmJlOjM0OjE5OjRkOjQ3OjhhOmQ3OmMwOmRiOjE4OjIyOmZiOjA3OjFkOmYxOjI5OjgxOjQ5OjZlOmQxOjA0OjM4OjQxOjEzCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlIMHpDQ0JidWdBd0lCQWdJSVhzTzNwa04vcE9Bd0RRWUpLb1pJaHZjTkFRRUZCUUF3UWpFU01CQUdBMVVFCkF3d0pRVU5EVmxKQlNWb3hNUkF3RGdZRFZRUUxEQWRRUzBsQlEwTldNUTB3Q3dZRFZRUUtEQVJCUTBOV01Rc3cKQ1FZRFZRUUdFd0pGVXpBZUZ3MHhNVEExTURVd09UTTNNemRhRncwek1ERXlNekV3T1RNM016ZGFNRUl4RWpBUQpCZ05WQkFNTUNVRkRRMVpTUVVsYU1URVFNQTRHQTFVRUN3d0hVRXRKUVVORFZqRU5NQXNHQTFVRUNnd0VRVU5EClZqRUxNQWtHQTFVRUJoTUNSVk13Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQ2IKcWF1L1lVcVhyeStYWnBwMFg5RFpsdjNQNHVSbTd4OGZSelBDUktQZm10NGZ0VlRkRlh4cE5SRnZ1OGdNam1vWQpIdGlQMlJhOEVFZzJYUEJqczVCYVhDUTMxNlBXeXdseHVmRUJjb1N3ZmR0TmdNMzgwMi9KK05xMkRvTFNSWVdvCkcyaW9QZWowUkd5OW9jTExBNzZNUGhNQWhOOUtTTURqSWdybzZUZW5HRXl4Q1EwalZuOEVUZGtYaEJpbHlOcEEKbEhQcnpnNVhQQU9CT3AwS29WZERhYXhYYlhtUWVPVzF0RHZZdkV5TktLR25vNmU2QWs0bDBTcXU3YTRESXJocgpJQTh3S0ZTVmYrRHV6Z3BtbmRGQUxXNGlyNTBhd1FVWjBtL0E4cC80ZTdNQ1F2dFFxUjB0a3c4anE4YkJENUwvCjBLSVY5Vk1KY1J6L1JST0U1aVplK09DSUhBcjhGcmFvY3dhNDhHT0VBcURHV3V6bmROOXdycU9ESmVyV3g1ZUgKazZmR2lvb3psMkEzRUQ2WFBtNHBGZGFoRDlHSUxCS2ZiNnFreGtMclFhTGpsVVBUQVlWdGpyczc4eU0yeC80Nwo0S0VsQjBpcnlZbDAvd2lQZ0wvQWxtWHo3dXhMYUwyZGlNTXhzMER4Nk0vMk9MdWM1TkYvMU9WWW0zejYxUE1PCm0zV1I1THBTTGhsKzBmWE5XaG44dWdiMisxS29TNWtFM2ZqNXRJdFFvMDVpaWZDSEpQcURRc0dIK3RVdEtTcGEKY1hwa2F0Y25ZR01OMjg1SjlZMGZrSWt5Ri9oelE3alNXcE9HWWRiaGRRcnFlV1oyaUU5eDZ3UWwxZ3BhZXBQbAp1VXNYUUEreHRybjEzay9jNExPc094RndZSVJLUTI2WklNQXBjUXJBWlFJREFRQUJvNElDeXpDQ0FzY3dmUVlJCkt3WUJCUVVIQVFFRWNUQnZNRXdHQ0NzR0FRVUZCekFDaGtCb2RIUndPaTh2ZDNkM0xtRmpZM1l1WlhNdlptbHMKWldGa2JXbHVMMEZ5WTJocGRtOXpMMk5sY25ScFptbGpZV1J2Y3k5eVlXbDZZV05qZGpFdVkzSjBNQjhHQ0NzRwpBUVVGQnpBQmhoTm9kSFJ3T2k4dmIyTnpjQzVoWTJOMkxtVnpNQjBHQTFVZERnUVdCQlRTaDdUajN6Y25rMVgyClZ1cUI1VGJNakI0L3ZUQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01COEdBMVVkSXdRWU1CYUFGTktIdE9QZk55ZVQKVmZaVzZvSGxOc3lNSGorOU1JSUJjd1lEVlIwZ0JJSUJhakNDQVdZd2dnRmlCZ1JWSFNBQU1JSUJXRENDQVNJRwpDQ3NHQVFVRkJ3SUNNSUlCRkI2Q0FSQUFRUUIxQUhRQWJ3QnlBR2tBWkFCaEFHUUFJQUJrQUdVQUlBQkRBR1VBCmNnQjBBR2tBWmdCcEFHTUFZUUJqQUdrQTh3QnVBQ0FBVWdCaEFPMEFlZ0FnQUdRQVpRQWdBR3dBWVFBZ0FFRUEKUXdCREFGWUFJQUFvQUVFQVp3QmxBRzRBWXdCcEFHRUFJQUJrQUdVQUlBQlVBR1VBWXdCdUFHOEFiQUJ2QUdjQQo3UUJoQUNBQWVRQWdBRU1BWlFCeUFIUUFhUUJtQUdrQVl3QmhBR01BYVFEekFHNEFJQUJGQUd3QVpRQmpBSFFBCmNnRHpBRzRBYVFCakFHRUFMQUFnQUVNQVNRQkdBQ0FBVVFBMEFEWUFNQUF4QURFQU5RQTJBRVVBS1FBdUFDQUEKUXdCUUFGTUFJQUJsQUc0QUlBQm9BSFFBZEFCd0FEb0FMd0F2QUhjQWR3QjNBQzRBWVFCakFHTUFkZ0F1QUdVQQpjekF3QmdnckJnRUZCUWNDQVJZa2FIUjBjRG92TDNkM2R5NWhZMk4yTG1WekwyeGxaMmx6YkdGamFXOXVYMk11CmFIUnRNRlVHQTFVZEh3Uk9NRXd3U3FCSW9FYUdSR2gwZEhBNkx5OTNkM2N1WVdOamRpNWxjeTltYVd4bFlXUnQKYVc0dlFYSmphR2wyYjNNdlkyVnlkR2xtYVdOaFpHOXpMM0poYVhwaFkyTjJNVjlrWlhJdVkzSnNNQTRHQTFVZApEd0VCL3dRRUF3SUJCakFYQmdOVkhSRUVFREFPZ1F4aFkyTjJRR0ZqWTNZdVpYTXdEUVlKS29aSWh2Y05BUUVGCkJRQURnZ0lCQUpjeEFwL24vVU5uU0VRVTVDbUg3VXdvWnRDUE5kcE5ZYmRLbDAyMTI1RGdCUzRPeG5uUThwZHAKRDcwRVI5bSsyN1VwMnB2WnJxbVoxZE04TUpQMWphR28vQWFOUlBUS0ZwVjhNOXhpaTZnMytDZllDUzBiNzhnVQpKeUNwWkVUL0x0WjFxbXhOWUVBWlNVTlVZOXJpekxwbTVVOUVlbHZaYW9FclFOVi8rUUVuV0N6STdVaVJmRCttCkFNL0VLWE1STnQ2R0dUNmQ3aG1LRzlXdzdZNDluQ3JBRGRnOVp1TThEYjNWbEZ6aTRxYzFHd1FBOWo5YWplcEQKdlYrSkhhbkJzTXlaNGswQUN0ckpKMXZuRTVCYzVQVXpvbFZ0M09BSlRTK3hKbHNuZFFBSnhHSjNLUWhmbmxtcwp0bjZ0bjFRd0lnUEJIbkZrL3ZrNENwWVkzUUlVckNQTEJod2VwSDJORGQ0blFlaXQyaFczc0NQZEs2alQyaVdICjdlaFZSRTJJOURaK2hKcDRyUGNPVmtrTzFqTWwxb1JRUW13Z0VoMHExYjY4OG5DQnBIQmd2Z1cxbTU0RVJMNWgKSTZ6cHBTU01FWUNVV3FLaXVVblN3ZHpScCsweEVTeWVHYWJ1NFZYaHdPclBEWVRrRjdlaWZLWGVWU1VHN3N6QQpoMXhBMnN5VlAxWGdOY2U0aEw2MFhjMTZnd0Z5N29mbVh4MnV0WVhHSnQvbXdacnBIZ0pIbnlxb2JhbGJ6K3hGCmQzK1lKNW95WFNyamhPN0ZtR1l2bGlBZDNkakRKOWV3K2Y3WmZjM1FuNDhMRkZoUm55K0x3emd0M3VpUDFvMkgKcFBWV1F4YVpMUFNrVnJRMHVHRTN5Y0pZZ0J1Z2w2SDhXWTNwRWZiUkQwdFZORVlxaTRZNwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049VFdDQSBHbG9iYWwgUm9vdCBDQSBPPVRBSVdBTi1DQSBPVT1Sb290IENBCiMgU3ViamVjdDogQ049VFdDQSBHbG9iYWwgUm9vdCBDQSBPPVRBSVdBTi1DQSBPVT1Sb290IENBCiMgTGFiZWw6ICJUV0NBIEdsb2JhbCBSb290IENBIgojIFNlcmlhbDogMzI2MgojIE1ENSBGaW5nZXJwcmludDogZjk6MDM6N2U6Y2Y6ZTY6OWU6M2M6NzM6N2E6MmE6OTA6MDc6Njk6ZmY6MmI6OTYKIyBTSEExIEZpbmdlcnByaW50OiA5YzpiYjo0ODo1MzpmNjphNDpmNjpkMzo1MjphNDplODozMjo1Mjo1NTo2MDoxMzpmNTphZDphZjo2NQojIFNIQTI1NiBGaW5nZXJwcmludDogNTk6NzY6OTA6MDc6Zjc6Njg6NWQ6MGY6Y2Q6NTA6ODc6MmY6OWY6OTU6ZDU6NzU6NWE6NWI6MmI6NDU6N2Q6ODE6ZjM6Njk6MmI6NjE6MGE6OTg6Njc6MmY6MGU6MWIKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZRVENDQXltZ0F3SUJBZ0lDREw0d0RRWUpLb1pJaHZjTkFRRUxCUUF3VVRFTE1Ba0dBMVVFQmhNQ1ZGY3gKRWpBUUJnTlZCQW9UQ1ZSQlNWZEJUaTFEUVRFUU1BNEdBMVVFQ3hNSFVtOXZkQ0JEUVRFY01Cb0dBMVVFQXhNVApWRmREUVNCSGJHOWlZV3dnVW05dmRDQkRRVEFlRncweE1qQTJNamN3TmpJNE16TmFGdzB6TURFeU16RXhOVFU1Ck5UbGFNRkV4Q3pBSkJnTlZCQVlUQWxSWE1SSXdFQVlEVlFRS0V3bFVRVWxYUVU0dFEwRXhFREFPQmdOVkJBc1QKQjFKdmIzUWdRMEV4SERBYUJnTlZCQU1URTFSWFEwRWdSMnh2WW1Gc0lGSnZiM1FnUTBFd2dnSWlNQTBHQ1NxRwpTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFDd0Jkdkk2NHpFYm9vaDc0NU5uSEVLSDFKdzdXMkNuSmZGCjEweE9SVW5MUUVLMUVqUnNHY0owcERGZmhRS1g3RU16Q2xQU25JeU90N2g1Mnl2VmF2S09ac1R1S3dFSGt0U3oKMEFMZlVQWlZyMllPeStCSFlDOHJNamsxVWpvb2cvaDdGc1lZdUdMV1J5V1J6dkFaRWsydFkvWFRQM1ZmS2ZDaApNQndxb0ppbUZiM3UvUmsyOE9LUlE0LzZ5dFlRSjBsTTc5M0I4WVZ3bThycXFGcEQvRzJHYjNQcE4wV3A4RGJICnpJaDFIcnRzQnYrYmF6NFg3R0dxY1h6R0hhTDNTZWtWdFR6V29XSDFFZmNGYngzOUViN1FNQWZDS2JBSlRpYmMKNDZLb2tXb2Z3cEZGaUZ6bG1MaHhwUlVaeVh4MUVjeHdkRTh0bXgyUlJQMVdLS0QrdTRacXlQcGNDMWpjeGt0Mgp5S3NpMlhNUHBmUmFBb2svVDU0aWd1NmlkRk1xUFZNbmFSMXNqaklzWkFBbVkyRTJUcU5HdHo5OXN5MnNiWkNpCmxhTE96OXFDNXdjMEdaYnB1Q0dxS1g2bU9MNk9LVW9oWm5rZnM4TzFDV2ZlMXRRSFJ2TXEydVlpTjJETGdiWVAKb0EvcHlKVi92MVdSQlhyUFBSWEFiOTRKbEFHRDF6UWJ6RUNsOExpYlo5V1lrVHVuaEhpVkpxUmFDUGdyZExRQQpCRHpmdUJTTzZOK3BqV3hua2pNZHdMZlM3SkxJdmdtL0xDa0Zid0pybnUrOHZ5cThXOEJRajBGd2NZZXlUYmNFCnFZU2pNcSt1N21zWGk3S3gvbXpoa0l5SXFKZEl6c2hOeS9NR3oxOXFDa0t4SGg1M0w0Nmc1cElPQnZ3Rkl0SW0KNFRGUmZUTGNEd0lEQVFBQm95TXdJVEFPQmdOVkhROEJBZjhFQkFNQ0FRWXdEd1lEVlIwVEFRSC9CQVV3QXdFQgovekFOQmdrcWhraUc5dzBCQVFzRkFBT0NBZ0VBWHpTQmR1K1dIZFhsdGRrQ1k0UVd3YTZnY0ZHbjkweEhOY2dMCjF5ZzlpWEhacWpOQjZoUWJiQ0VBd0d4Q0dYNmZhVnNnUXQraTB0ckVmSmRMamJEb3JNanVwV2tFbVFxU3Bxc24KTGhwTmdiK0UxSEFlclVmKy9VcWRNK0R5dWNSRkNDRUsybWxwYzNJTnZqVCtsSXV0d3g0MTE2S0Q3K1U0eDZXRgpINnZQTk93L0tQNE04VmVHVHNsVjl4elUyS1Y5Qm5wdjFkOFEzNEZPSVdXeHR1RVhlWlZGQnM1ZnpOeEdpV05vClJJMlQ5R1J3b0QyZEtBWERPWEM0WW5zZy9lVGI2UWlodUo0OUNjZFAreXo0azNaQjNsTGc0VmZTblFPOGQ1NysKbmlsZTk4RlJZQi9lMmd1eUxYVzNRMGlUNS9aNXhvUmRnRmxnbFB4NG1JODhrMUh0UUpBSDMyUmpKTXRPY1FXaAoxNVFhaURMeEluUWlycVdtMkJKcFRHQ2pBdTRyN05SamtndGV2aTkyYTZPMkpyeVBBOWdLOGt4a1JyMDVZdVdXCjZ6UmpFU2pNbGZHdDcrL2NnRmhJNlV1NDZtV3M2ZnlBdGJYSVJmbXN3Wi9adWVwaWlJN0U4VXVERXEzbWk0VFcKbnNMcmd4aWZhcnNiSkdBemNNenM5ekx6WE5sNWZlK2VwUDdKSThNazdoV1NzVDJSVHlhR3ZXWnpKQlBxcEs1agp3YTE5aEFNOEVIaUdHM25qeFBQeUJKVWdyaU9DeExNNkFHSy81allrNFZlNnh4NlFkZFZmUDVWaEs4RTd6ZVd6CmFHSFFSaWFwSVZKcExlc3V4K3QzenFZNnRRTXpUM2JSNTF4VUFWM0xlUFRKREwvUEVvNFhMU05vbE9lci9xbXkKS3diUUJNMD0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVRlbGlhU29uZXJhIFJvb3QgQ0EgdjEgTz1UZWxpYVNvbmVyYQojIFN1YmplY3Q6IENOPVRlbGlhU29uZXJhIFJvb3QgQ0EgdjEgTz1UZWxpYVNvbmVyYQojIExhYmVsOiAiVGVsaWFTb25lcmEgUm9vdCBDQSB2MSIKIyBTZXJpYWw6IDE5OTA0MTk2Njc0MTA5MDEwNzk2NDkwNDI4NzIxNzc4NjgwMTU1OAojIE1ENSBGaW5nZXJwcmludDogMzc6NDE6NDk6MWI6MTg6NTY6OWE6MjY6ZjU6YWQ6YzI6NjY6ZmI6NDA6YTU6NGMKIyBTSEExIEZpbmdlcnByaW50OiA0MzoxMzpiYjo5NjpmMTpkNTo4Njo5YjpjMTo0ZTo2YTo5MjpmNjpjZjpmNjozNDo2OTo4Nzo4MjozNwojIFNIQTI1NiBGaW5nZXJwcmludDogZGQ6Njk6MzY6ZmU6MjE6Zjg6ZjA6Nzc6YzE6MjM6YTE6YTU6MjE6YzE6MjI6MjQ6Zjc6MjI6NTU6Yjc6M2U6MDM6YTc6MjY6MDY6OTM6ZTg6YTI6NGI6MGY6YTM6ODkKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZPRENDQXlDZ0F3SUJBZ0lSQUpXK0ZxRDNMa2J4ZXptQ2N2cUx6Wll3RFFZSktvWklodmNOQVFFRkJRQXcKTnpFVU1CSUdBMVVFQ2d3TFZHVnNhV0ZUYjI1bGNtRXhIekFkQmdOVkJBTU1GbFJsYkdsaFUyOXVaWEpoSUZKdgpiM1FnUTBFZ2RqRXdIaGNOTURjeE1ERTRNVEl3TURVd1doY05Nekl4TURFNE1USXdNRFV3V2pBM01SUXdFZ1lEClZRUUtEQXRVWld4cFlWTnZibVZ5WVRFZk1CMEdBMVVFQXd3V1ZHVnNhV0ZUYjI1bGNtRWdVbTl2ZENCRFFTQjIKTVRDQ0FpSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUJBTUsrNnlmd0lhUHphU1pWZnAzRgpWUmFSWFAzdkliOVRnSG90MHBHTVl6SHc3Q1R3dzZYU2Nud1FiZlEzdCtYbWZIbnFqTFdDaTY1SXRxd0EzR1YxCjdDcE5YOEdIOVNCbEs0R29SejZKSTVVd0ZwQi82RmNIU09jWnJyOUZaN0UzR3dZcS90NzVySDJEKzE2NjVJK1gKWjc1TGpvMWtCMWM0VldrME5qMFRTTzlQNHRObUhxVFBHcmRlTmpQVXRBYTlHQUg5ZDRSUUFFWDFqRjNvSTd4KwovalhoN1ZCN3FUQ05HZE1Kam1oblhiODhseGhUdXlsaXhjcGVjc0hIbHRUYkxhQzBIMmtEN09yaVVQRU1QUENzCjgxTXQ4QnoxN1d3NU9YT0FGc2hTc0NQTjREN2MzVHhIb0xzMWl1S1lhSXUrNWI5eTd0TDZwZTBTN2Z5WUdLa20KZHR3b1N4QWdITk4vRm5jdDdXK0E5MG03VXdXN1hXakgxTWgxRmorSldvdjNGMGZVVFBIU2lYaytUVDJZcUdIZQpPaDdTK0Y0RDRNSEpISXpUalUzVGxUYXpOMTlqWTVzekZQQXRKbXRUZkltTU1zSnU3RDBoQURuSm9XamlVSU11CnNEb3I4emFnckMva2IySENVUWs1UG90VHVidG4ydHhUdVhaWk5wMUQ1U0RnUFRKZ2hTSlJ0OGN6dTkwVkw2UjQKcGdkN2dVWTJCSWJkZVRYSGxTdzdzS01YTmVWekg3UmNXZS9hNmhCbGUzclFmNSt6dENvM08zQ0xtMXU1SzdmcwpzbEVTbDFNcFd0VHdFaERjVHdLN0VwSXZZdFEvYVVOOERkYjhXSFVCaUoxWUZrdmV1cEQvUndHSkJtcjJYN0tRCmFyTUNwZ0tJdjdOSGZpcloxZnBvZURWTkFnTUJBQUdqUHpBOU1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0N3WUQKVlIwUEJBUURBZ0VHTUIwR0ExVWREZ1FXQkJUd2oxazRBTFAxajVxV0ROWHIrbnVxRitnVEVqQU5CZ2txaGtpRwo5dzBCQVFVRkFBT0NBZ0VBdnVSY1lrNGs5QXdJLy9EVERHamtrMGtpUDBRbmI3dHQzb05tenFqTURmejFtZ2JsCmR4U1I2NTFCZTVrcWhPWC8vQ0hCWGZEa0gxZTNkYW1oWHdJbS85Zkg5MDdlVC9qM0hFYkFlazlBTENJMThCbXgKMEd0bkxMQ280TUJBTnpYMmhGeGM0NjlDZVA2bnlRMVE2ZzJFZHZaUjc0TlR4bnIvRGxaSkxvOTYxZ3ptSjFUagpUUXBnY21MTmtRZldwYi9JbVd2dHhCbm1xMHdST01Wdk1lSnVTY2cvZG9BbUF5WXA0RGIyOWlCVDR4ZHdOQmVkClkyZ2VhK3pEVFlhNEV6QXZYVVlOUjBQVkc2cFpEcmxjalFaSXJYU0hYOGY4TVZSQkUrTEhJUTZlNEI0TjRjQjcKUTRXUXhZcFl4bVVLZUZmeXhpTVBBZGtnUzk0UCs1S0ZkU3BjYzQxdGV5V1J5dTVGcmdaTEFNelRzVmxRMmpxSQpPeWxEUmw2WEsxVE9VMitOU3VlVytyOXhEa0tMZlAwb29OQkl5dHJFZ1V5N29uT1RKc2pyRE5ZbWlMYkFKTSs3CnZWdnJkWDNwQ0k2R015eDVkd2xwcFluOHMzQ1FoM2FQMHlLN1FzNjljd3NnSmlyUW16MXdIaVJzellkMnFSZVcKdDg4Tmt2dU9HS21ZU2RHZS9tQkVjaUc1R2UzQzlUSHhPVWlJa0NSMVZCYXR6dlQ0YVJSa09mdWp1THB3UU1jbgpITC9FVmxQNlkyWFE4eHdPRnZWcmhsaE5HTlRrRFk2bG5WdVIzSFlrVUQvR0t2dlp0NXkxMXViUTJlZ1ppeFZ4ClNLMjM2dGhaaU5TUXZ4YXoyZW1zV1dGVXlCeTZ5c0hLNGJrZ1RJODZrNG1sb015LzAvWjFwSFdXYlZZPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049RS1UdWdyYSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPUUtVHVcdTAxMWZyYSBFQkcgQmlsaVx1MDE1ZmltIFRla25vbG9qaWxlcmkgdmUgSGl6bWV0bGVyaSBBLlx1MDE1ZS4gT1U9RS1UdWdyYSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkKIyBTdWJqZWN0OiBDTj1FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89RS1UdVx1MDExZnJhIEVCRyBCaWxpXHUwMTVmaW0gVGVrbm9sb2ppbGVyaSB2ZSBIaXptZXRsZXJpIEEuXHUwMTVlLiBPVT1FLVR1Z3JhIFNlcnRpZmlrYXN5b24gTWVya2V6aQojIExhYmVsOiAiRS1UdWdyYSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSIKIyBTZXJpYWw6IDc2Njc0NDcyMDY3MDMyNTQzNTUKIyBNRDUgRmluZ2VycHJpbnQ6IGI4OmExOjAzOjYzOmIwOmJkOjIxOjcxOjcwOjhhOjZmOjEzOjNhOmJiOjc5OjQ5CiMgU0hBMSBGaW5nZXJwcmludDogNTE6YzY6ZTc6MDg6NDk6MDY6NmU6ZjM6OTI6ZDQ6NWM6YTA6MGQ6NmQ6YTM6NjI6OGY6YzM6NTI6MzkKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGIwOmJmOmQ1OjJiOmIwOmQ3OmQ5OmJkOjkyOmJmOjVkOjRkOmMxOjNkOmEyOjU1OmMwOjJjOjU0OjJmOjM3OjgzOjY1OmVhOjg5OjM5OjExOmY1OjVlOjU1OmYyOjNjCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlHU3pDQ0JET2dBd0lCQWdJSWFtZytuRkdieTFNd0RRWUpLb1pJaHZjTkFRRUxCUUF3Z2JJeEN6QUpCZ05WCkJBWVRBbFJTTVE4d0RRWURWUVFIREFaQmJtdGhjbUV4UURBK0JnTlZCQW9NTjBVdFZIWEVuM0poSUVWQ1J5QkMKYVd4cHhaOXBiU0JVWld0dWIyeHZhbWxzWlhKcElIWmxJRWhwZW0xbGRHeGxjbWtnUVM3Rm5pNHhKakFrQmdOVgpCQXNNSFVVdFZIVm5jbUVnVTJWeWRHbG1hV3RoYzNsdmJpQk5aWEpyWlhwcE1TZ3dKZ1lEVlFRRERCOUZMVlIxClozSmhJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1CNFhEVEV6TURNd05URXlNRGswT0ZvWERUSXoKTURNd016RXlNRGswT0Zvd2diSXhDekFKQmdOVkJBWVRBbFJTTVE4d0RRWURWUVFIREFaQmJtdGhjbUV4UURBKwpCZ05WQkFvTU4wVXRWSFhFbjNKaElFVkNSeUJDYVd4cHhaOXBiU0JVWld0dWIyeHZhbWxzWlhKcElIWmxJRWhwCmVtMWxkR3hsY21rZ1FTN0ZuaTR4SmpBa0JnTlZCQXNNSFVVdFZIVm5jbUVnVTJWeWRHbG1hV3RoYzNsdmJpQk4KWlhKclpYcHBNU2d3SmdZRFZRUUREQjlGTFZSMVozSmhJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNQpNSUlDSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQWc4QU1JSUNDZ0tDQWdFQTR2VS9rd1ZSSG9WaVZGNTZDL1VZCkI0T3VmcTk4OTlTS2E2VmpRem01Uy9mRHhtU0pQWlF1VklCU09Ua0hTMHZkaFFkMmg4eS9MNVZNekgyblBieEgKRDVodytJeUZIblNPa20wYlFOR1pEYnQxYnNpcGE1ckFoREd2eWtQTDZ5czA2SStYYXdHYjFRNUtDS3Bia25TRgpROU9BcnFHSVc2Nno2bDdMRnBwM1JNaWg5bFJvenQ2UGx5dTZXMEFDREdRWHdMV1R6ZUh4RTJiT0RIbnYwWkVvCnExK2dFbEl3Y3htT2orR01CNkxEdTBydzZoOFZxTzRsektSRytCc2k3N01PUTdvc0pMakZMRnpVSFBoZFpMM0QKazE0b3B6OG44WTRlMHlwUUJhTlYyY3ZuT1ZQQW1KNk1WR0tMSnJEM2ZZMTg1TWFlWmtKVmdrZm5zbGlOWnZjSApmQzQyNWxBY1A5dERKTVcvaGtkNXMza2M5MXIwRSt4cytEL2lXUitWN2tJK3VhMm9Nb1ZKbDBiK1N6R1BXc3V0CmRFY2Y2WkczM3lnRUlxRFVEMTNpZVUvcWJJV0d2YWltenVUNncrR3pydDQ4VWU3TEUzd0JmNFFPWFZHVW5oTU0KdGk2bFRQazVjRFp2bHNvdURFUlZ4Y3I2WFFLajM5WmtqRnF6QVFxcHRRcEhGLy92a1VBcWpxRkdPakdZNVJIOAp6THRKVm9yOHVkQmhtbTlsYk9iRHl6NTFTZjZQcCtLSnhXZlhuVVlUVGpGMk95U3puaEZsaHF0Lzd4M1UrTHpuCnJGcGN0MXBIWEZYT1ZiUWljVnRiQy9EUDNLQmhaT3FwMTJnS1k2ZmdEVCtncjlPcTBuN3ZVYURtVVN0VmtoVVgKVTh1M1pnNW1UUGo1ZFV5UTV4Snd4MFVDQXdFQUFhTmpNR0V3SFFZRFZSME9CQllFRkM3ajI3SkowSnhVZVZ6NgpKeXIrekU3UzZFNVVNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdId1lEVlIwakJCZ3dGb0FVTHVQYnNrblFuRlI1ClhQb25LdjdNVHRMb1RsUXdEZ1lEVlIwUEFRSC9CQVFEQWdFR01BMEdDU3FHU0liM0RRRUJDd1VBQTRJQ0FRQUYKTnpyMFRiZEY0a1YxSkkrMmQxTG9ITmdRazJYejhsa0dwRDRlS2V4ZDBkQ3JmT0FLa0VoNDdVNllBNW4rS0dDUgpIVEFkdUdOOHFPWTF0ZnJUWVhibTFnZEx5bW1hc29SNmQ1TkZGeFdmSk5DWUV4TC91NkF1L1U1TWgvak9YS3FZCkd3WGdBRVpLZ29DbE00c28zTzA0MDkvbFB1bisrMW5kWVlSUDBsU1dFMkVUUG8rQWFiNlRSN1UxUTlKYXV6MWMKNzdOQ1I4MDdWUk1Hc0FuYi9XUDJPb2dLbVc5KzRjNGJVMnBFWmlOUkNIdThXMUtpL1FZM09FQmhqMHFXdUpBMworR2JIZUpBQUZTNkxyVkUxVXdlb2EyaXUrVTQ4QnliTkNBVnd6RGsvZHIybDAyY21BWWFtVTlKZ08zeERmMVdLCnZKVWF3U2c1VEI5RDBwSDBjbG1LdVZiOFA3U2QybkNjZGxxTVExRHVqakJ5VGQvL1NmZkdxV2ZaYmF3Q0VlSTYKRmlXbldBakxiMU5CbkVnNFIyZ3owZGZIajlSMElkVERCWkI2Lzg2V2lMRVZLVjBqcTlCZ29SSlAzdlFYelRMbAp5Yi9JUTYzOUxvN3hyK0wwbVBvU0h5RFl3S2NNaGNXUTlEc3RsaWF4TEw1TXErdXgwb3JKMjNnVER4NEpuVzJQCkFKOEMyc0g2SDNwNkNjUks1b2dxbDUrSmkvMDNYMTg2empoWmhrdXZjUXUwMlBKd1Q1OHlFK093cDFmbDJ0cEQKeTRRMDhpakU2bTMwS3UvQmEzYmErMzY3aFR6U1U4Sk52bkhoUmRIOUkyY05FM1g3ejJWbklwMnVzQW5SQ2Y4ZApOTC8rSTVjMzBqbjZQUTBHQzdUYk82T3JiMXdkdG43b3M0STA3UVpjSkE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049VC1UZWxlU2VjIEdsb2JhbFJvb3QgQ2xhc3MgMiBPPVQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkggT1U9VC1TeXN0ZW1zIFRydXN0IENlbnRlcgojIFN1YmplY3Q6IENOPVQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIgTz1ULVN5c3RlbXMgRW50ZXJwcmlzZSBTZXJ2aWNlcyBHbWJIIE9VPVQtU3lzdGVtcyBUcnVzdCBDZW50ZXIKIyBMYWJlbDogIlQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIiCiMgU2VyaWFsOiAxCiMgTUQ1IEZpbmdlcnByaW50OiAyYjo5Yjo5ZTplNDo3Yjo2YzoxZjowMDo3MjoxYTpjYzpjMTo3Nzo3OTpkZjo2YQojIFNIQTEgRmluZ2VycHJpbnQ6IDU5OjBkOjJkOjdkOjg4OjRmOjQwOjJlOjYxOjdlOmE1OjYyOjMyOjE3OjY1OmNmOjE3OmQ4Ojk0OmU5CiMgU0hBMjU2IEZpbmdlcnByaW50OiA5MTplMjpmNTo3ODo4ZDo1ODoxMDplYjphNzpiYTo1ODo3Mzo3ZDplMTo1NDo4YTo4ZTpjYTpjZDowMTo0NTo5ODpiYzowYjoxNDozZTowNDoxYjoxNzowNToyNTo1MgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRHd6Q0NBcXVnQXdJQkFnSUJBVEFOQmdrcWhraUc5dzBCQVFzRkFEQ0JnakVMTUFrR0ExVUVCaE1DUkVVeApLekFwQmdOVkJBb01JbFF0VTNsemRHVnRjeUJGYm5SbGNuQnlhWE5sSUZObGNuWnBZMlZ6SUVkdFlrZ3hIekFkCkJnTlZCQXNNRmxRdFUzbHpkR1Z0Y3lCVWNuVnpkQ0JEWlc1MFpYSXhKVEFqQmdOVkJBTU1IRlF0VkdWc1pWTmwKWXlCSGJHOWlZV3hTYjI5MElFTnNZWE56SURJd0hoY05NRGd4TURBeE1UQTBNREUwV2hjTk16TXhNREF4TWpNMQpPVFU1V2pDQmdqRUxNQWtHQTFVRUJoTUNSRVV4S3pBcEJnTlZCQW9NSWxRdFUzbHpkR1Z0Y3lCRmJuUmxjbkJ5CmFYTmxJRk5sY25acFkyVnpJRWR0WWtneEh6QWRCZ05WQkFzTUZsUXRVM2x6ZEdWdGN5QlVjblZ6ZENCRFpXNTAKWlhJeEpUQWpCZ05WQkFNTUhGUXRWR1ZzWlZObFl5QkhiRzlpWVd4U2IyOTBJRU5zWVhOeklESXdnZ0VpTUEwRwpDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ3FYOW9iWCtoemtlWGFYUFNpNWtmbDgyaFZZQVVkCkFxU3ptMW56SG9xdk5LMzhEY0xaU0JudWFZL0pJUHdocWdjWjdiQmNyR1hIWCswQ2ZIdDhMUnZXdXJtQXdoaUMKRm9UNlpyQUl4bFFqZ2VUTnVVay85azl1TjBnb09BL0Z2dWRvY1AwNWwwM1N4NWlSVUtyRVJMTWpmVGxINlZKaQoxaEtUWHJjeGxrSUYrM2FuSHFQMXd2enBlc1ZzcVhGUDZzdDR2R0N2eDk3MDJjdStmak9sYnBTRDhEVDZJYXZxCmpuS2dQNlRlTUZ2dmhrMXFsVnREUktnUUZSemxBVmZGbVBIbUJpaVJxaURGdDFNbVVVT3lDeEdWV09IQUQzYloKd0kxOGdmTnljSjV2L2hxTzJWODF4ckp2Tkh5K1NFL2lXam5YMkoxNG5wK0dQZ05lR1l0RW90WEhBZ01CQUFHagpRakJBTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RGdZRFZSMFBBUUgvQkFRREFnRUdNQjBHQTFVZERnUVdCQlMvCldTQTJBSG1nb0NKcmpOWHlZZEs0TE11Q1NqQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FRRUFNUU9pWVFzZmRPaHkKTnNadCtVMmUraUtvNFlGV3o4MjduK3Fya1JrNHI2cDhGVTN6dHFPTnBmU085a1NwcCtnaGxhMCtBR0lXaVBBQwp1dnhoSStZem16QjZhelppZTYwRUk0UllaZUxiSzRybkpWTTNZbE5mdk5vQllpbWlwaWR4NWpvaWZzRnZIWlZ3CklFb0hOTi9xL3hXQTViclhldGhiZFh3RmVpbEhma0NvTVJOM3pVQTd0RkZIZWk0UjQwY1IzcDFtMEl2VlZHYjYKZzFYcWZNSXBpUnZwYjdQTzRnV0V5UzgrZUlWaWJzbGZ3WGhqZEZqQVNCZ01tVG5ycE13YXRYbGFqUldjMkJRTgo5bm9IVjhjaWd3VXRQSnNsSmowWXM2bERmTWpJcTJTUERxTy9uQnVkTU52YTBCa3Vxanp4K3pPQWR1VE5yUmxQCkJTZU9FNkZ1d2c9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049QXRvcyBUcnVzdGVkUm9vdCAyMDExIE89QXRvcwojIFN1YmplY3Q6IENOPUF0b3MgVHJ1c3RlZFJvb3QgMjAxMSBPPUF0b3MKIyBMYWJlbDogIkF0b3MgVHJ1c3RlZFJvb3QgMjAxMSIKIyBTZXJpYWw6IDY2NDM4Nzc0OTc4MTMzMTY0MDIKIyBNRDUgRmluZ2VycHJpbnQ6IGFlOmI5OmM0OjMyOjRiOmFjOjdmOjVkOjY2OmNjOjc3Ojk0OmJiOjJhOjc3OjU2CiMgU0hBMSBGaW5nZXJwcmludDogMmI6YjE6ZjU6M2U6NTU6MGM6MWQ6YzU6ZjE6ZDQ6ZTY6Yjc6NmE6NDY6NGI6NTU6MDY6MDI6YWM6MjEKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGYzOjU2OmJlOmEyOjQ0OmI3OmE5OjFlOmIzOjVkOjUzOmNhOjlhOmQ3Ojg2OjRhOmNlOjAxOjhlOjJkOjM1OmQ1OmY4OmY5OjZkOmRmOjY4OmE2OmY0OjFhOmE0Ojc0Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEZHpDQ0FsK2dBd0lCQWdJSVhEUExZaXhmc3pJd0RRWUpLb1pJaHZjTkFRRUxCUUF3UERFZU1Cd0dBMVVFCkF3d1ZRWFJ2Y3lCVWNuVnpkR1ZrVW05dmRDQXlNREV4TVEwd0N3WURWUVFLREFSQmRHOXpNUXN3Q1FZRFZRUUcKRXdKRVJUQWVGdzB4TVRBM01EY3hORFU0TXpCYUZ3MHpNREV5TXpFeU16VTVOVGxhTUR3eEhqQWNCZ05WQkFNTQpGVUYwYjNNZ1ZISjFjM1JsWkZKdmIzUWdNakF4TVRFTk1Bc0dBMVVFQ2d3RVFYUnZjekVMTUFrR0ExVUVCaE1DClJFVXdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDVmhUdVhieW83TGp2UHB2TXAKTmI3UEdLdytxdG40VGFBK0drZTV2SnJmOHY3TVBrZm9lcGJDSkk0MTlLa00vSUw5YmNGeVlpZTk2bXZyNTRyTQpWRDZRVU0rQTFKWDc2TFdDMUJURnRxbFZKVmZic1ZEMnNHQmtXWHBwendPM2J3Mit5ajV2ZEhMcXFqQXFjMksrClNaRmh5QkgrRGdNcTkyb2czQUlWRFY0VmF2empnc0cxeFoxa0NXeWpXWmdISjhjYmxpdGhkSEZzUS9IM05Za1EKNEo3c1ZhRTNJcUtIQkFVc1IzMjBITGxpS1dZb3lyZmhrL1drbEFPWnVYQ0Z0ZVpJNm8xUS9ObmV6RzhIRHQwTApjcDJBTUJZSGxUOG9EdjNGZFU5VDFuU2F0Q1F1amdLUnozYkZteDVWZEp4NEliSHdMZkVMbjhMVmxoZ2Y4RlFpCmVvd0hBZ01CQUFHamZUQjdNQjBHQTFVZERnUVdCQlNucFFheExLWUpZTzdSbCtsd3JydzdHV3piSVRBUEJnTlYKSFJNQkFmOEVCVEFEQVFIL01COEdBMVVkSXdRWU1CYUFGS2VsQnJFc3BnbGc3dEdYNlhDdXZEc1piTnNoTUJnRwpBMVVkSUFRUk1BOHdEUVlMS3dZQkJBR3dMUU1FQVFFd0RnWURWUjBQQVFIL0JBUURBZ0dHTUEwR0NTcUdTSWIzCkRRRUJDd1VBQTRJQkFRQW1kelRibEVpR0trR2RMRDRHa0dERWpLd0xWTGdmdVh2VEJ6bmsrajU3c2oxTzdaOGoKdlpmemExenY3djFBcHQraGs2RUtocXp2SU5CNUFiMTQ5eG5ZSkRFMEJBR211aFdhd3lmYzJFOFB6QmhqLzVrUApEcEZyZFJiaElmellKc2RIdDZiUFdISnhmcnJoVFpWSE84bXZiYUcwd2V5SjlyUVBPTFhpWk53bHo2YmI2NXBjCm1hSEZDTjc5NXRyVjFscEZETVMzd3JVVTc3UVIvdzRWdGZYMTI4YTk2MXFuOEZZaXFUeGxWTVlWcUwyR25zMkQKbG1oNmNZR0o0UXZoNmhFYmFBak1hWjdzbmtHZVJESW1ldUtIQ25FOTYrUmFwTkxieGMzRzNtQi91Zk5QUkpMdgpLcmNZUHFjWjJRdDlzVGRCUXJDNllCM3kvZ2tSc1BDSGU2ZWQKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVF1b1ZhZGlzIFJvb3QgQ0EgMSBHMyBPPVF1b1ZhZGlzIExpbWl0ZWQKIyBTdWJqZWN0OiBDTj1RdW9WYWRpcyBSb290IENBIDEgRzMgTz1RdW9WYWRpcyBMaW1pdGVkCiMgTGFiZWw6ICJRdW9WYWRpcyBSb290IENBIDEgRzMiCiMgU2VyaWFsOiA2ODcwNDk2NDk2MjY2NjkyNTA3MzYyNzEwMzc2MDY1NTQ2MjQwNzg3MjAwMzQxOTUKIyBNRDUgRmluZ2VycHJpbnQ6IGE0OmJjOjViOjNmOmZlOjM3OjlhOmZhOjY0OmYwOmUyOmZhOjA1OjNkOjBiOmFiCiMgU0hBMSBGaW5nZXJwcmludDogMWI6OGU6ZWE6NTc6OTY6Mjk6MWE6Yzk6Mzk6ZWE6Yjg6MGE6ODE6MWE6NzM6NzM6YzA6OTM6Nzk6NjcKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDhhOjg2OjZmOmQxOmIyOjc2OmI1OjdlOjU3OjhlOjkyOjFjOjY1OjgyOjhhOjJiOmVkOjU4OmU5OmYyOmYyOjg4OjA1OjQxOjM0OmI3OmYxOmY0OmJmOmM5OmNjOjc0Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGWURDQ0EwaWdBd0lCQWdJVWVGaGZMcTBzR1V2ak53YzFOQk1vdFpiVVpaTXdEUVlKS29aSWh2Y05BUUVMCkJRQXdTREVMTUFrR0ExVUVCaE1DUWsweEdUQVhCZ05WQkFvVEVGRjFiMVpoWkdseklFeHBiV2wwWldReEhqQWMKQmdOVkJBTVRGVkYxYjFaaFpHbHpJRkp2YjNRZ1EwRWdNU0JITXpBZUZ3MHhNakF4TVRJeE56STNORFJhRncwMApNakF4TVRJeE56STNORFJhTUVneEN6QUpCZ05WQkFZVEFrSk5NUmt3RndZRFZRUUtFeEJSZFc5V1lXUnBjeUJNCmFXMXBkR1ZrTVI0d0hBWURWUVFERXhWUmRXOVdZV1JwY3lCU2IyOTBJRU5CSURFZ1J6TXdnZ0lpTUEwR0NTcUcKU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQ2d2bEFRanVueWJFQzBCSnlGdVRISzNDM2tFYWtFUEJ0Vgp3ZWRZTUIwa3RNUHZoZDZNTE9IQlBkK0M1ayt0UjRkczdGdEp3VXJWdTQvc2g2eC9ncHFHN0QwRG1WSUIwaldlCnJOcndVOGxtUE5Tc0FnSGFKTk03cUFKR3I2UWM0L2h6V0hhMzlnNlFEYlh3ejh6NitjWk01Y09HTUFxTkYzNDEKNjhYZnV3NmN3STJINDRnNGhXZjZQc2VyNEJPY0JSaVl6NVAxc1pLMC9DUFR6OVhFSjBuZ25qeWJDS09MWFNvaAo0UHc1cWxQYWZYN1BHZ2xUdkYwRkJNK2hTbytMZG9JTm9malN4eFIzVzVBMkI0R2JQZ2I2VWw1anhhWUEvcVhwClVodFN0Wkk1Y2dNSllyMndZQlp1cHQwbHdnTm0zZk1FMFVEaVRvdUc5Ry9sZzZBbmhGNEV3ZldRdlRBOXhPK28KYWJ3NG02U2tsdEZpMm1uQUFaYXV5OFJSTk9vTXF2OGhqbG1QU2x6a1lacW4wdWtxZUkxUlBUb1Y3cUpaanFsYwozc1g1a0NMbGlFVngzWkdaYkhxZlBUMllmRjcydmhab29GNnVDeVA4V2crcUluWXR5YUVRSGVUVFJDT1FpSi9HCkt1Ylg5WnF6V0I0dk1Ja0lHMVNpdFpnajdBaDNISlZkWWRITGlaeGZva3FSbXU4aHFra1dDS2k5WVNneHlYU3QKaGZiWnhiR0wwZVVRTWsxZml5QTZQRWtmTTRWWkRkdkxDWFZEYVhQN2EzRjk4Ti9FVEgzR295N0lsWG5MYzZLTwpUazBrKzE3a0JMNXlHNlluTFVsYW1YclhYQWtndDMrVXVVL3hEUnhlaUVJYkViZm5rZHVlYlBScTM0d0dtQU90CnpDanZwVWZ6VXdJREFRQUJvMEl3UURBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUE0R0ExVWREd0VCL3dRRUF3SUIKQmpBZEJnTlZIUTRFRmdRVW81Zlc4MTZpRU9HclJaODhGMlE4N2dGd25Nd3dEUVlKS29aSWh2Y05BUUVMQlFBRApnZ0lCQUJqNlczWDhQbnJIWDNmSHl0L1BYOE1TeEVCZDFES3F1R3JYMVJVVlJwZ2pwZWFRV3hpWlRPT3RRcU9DCk1UYUl6ZW43eEFTV1NJc0J4NDBCejFzekJwWkdablFkVCszQnRybTBEV0hNWTM3WExuZU1saHdxSTJocmhWZDIKY0RNVC91RlBwaU4zR1BvYWpPaTlaY25QUC9USkY5enJ4N3pBQkM0dFJpOXBac01iai83c1B0UEtsTDkyQ2lVTgpxWHNDSEtuUU8xOEx3SUU2UFdUaHY2Y3RUcjFOeE5ncHhpSVkwTVdzY2dLQ1A2bzZvam9pbHpIZENHUERkUlM1CllDZ3RXMmpnRnFsbWdpTlI5ZXRUMkRHYmUrbTNuVXZyaUJiUCtWMDRpa2t3aiszeDZ4bjBkeG94R0UxblZHd3YKYjJYNTJ6M3NJZXhlOVBTTHltQmxWTkZ4WlBUNXBxT0JNell6Y2ZDa2VGOU9yWU1oM2pSSmplaFpySjN5ZGxvMgo4aFAwcitBSngyRXFiUGZnbmE2N2hrb29ieTd1dEhuTmtEUERzM2I2OWZCc25RR1ErcDZROXB4eXowZmF3eC9rCk5TQlQ4bFRSMzJHRHBnTGlKVGplaFRJdFhuT1FVbDFDeE00OVMrSDVHWVFkMWFKUXpFSDdRUlREdmRiSldxTmoKWmdLQXZRVTZPMGVjN0FBbVRQV0lVYitvSTM4WUI3QUw3WXNtb1dUVFlVcnJYSi9lczY5bkE3TWYzVzFkYVdocApxMTQ2N0h4cHZNYzdoVTZlRmJtMEZVL0RsWHBZMThsczZXeTU4eWxqWHJRczhDMDk3VnBsNEtsYlFNSkltWUZ0Cm5oOEdLandTdElzUG02SWs4S2FOMW5yZ1M3WmtsbU9WaE1KS3pSd3VKSWN6WU9YRAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049UXVvVmFkaXMgUm9vdCBDQSAyIEczIE89UXVvVmFkaXMgTGltaXRlZAojIFN1YmplY3Q6IENOPVF1b1ZhZGlzIFJvb3QgQ0EgMiBHMyBPPVF1b1ZhZGlzIExpbWl0ZWQKIyBMYWJlbDogIlF1b1ZhZGlzIFJvb3QgQ0EgMiBHMyIKIyBTZXJpYWw6IDM5MDE1NjA3OTQ1ODk1OTI1NzQ0NjEzMzE2OTI2NjA3OTk2MjAyNjgyNDcyNTgwMAojIE1ENSBGaW5nZXJwcmludDogYWY6MGM6ODY6NmU6YmY6NDA6MmQ6N2Y6MGI6M2U6MTI6NTA6YmE6MTI6M2Q6MDYKIyBTSEExIEZpbmdlcnByaW50OiAwOTozYzo2MTpmMzo4Yjo4YjpkYzo3ZDo1NTpkZjo3NTozODowMjowNTowMDplMToyNTpmNTpjODozNgojIFNIQTI1NiBGaW5nZXJwcmludDogOGY6ZTQ6ZmI6MGE6Zjk6M2E6NGQ6MGQ6Njc6ZGI6MGI6ZWI6YjI6M2U6Mzc6Yzc6MWI6ZjM6MjU6ZGM6YmM6ZGQ6MjQ6MGU6YTA6NGQ6YWY6NTg6YjQ6N2U6MTg6NDAKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZZRENDQTBpZ0F3SUJBZ0lVUkZjMEpGdUJpWnMxOHM2NEt6dGJweWJ3ZFNnd0RRWUpLb1pJaHZjTkFRRUwKQlFBd1NERUxNQWtHQTFVRUJoTUNRazB4R1RBWEJnTlZCQW9URUZGMWIxWmhaR2x6SUV4cGJXbDBaV1F4SGpBYwpCZ05WQkFNVEZWRjFiMVpoWkdseklGSnZiM1FnUTBFZ01pQkhNekFlRncweE1qQXhNVEl4T0RVNU16SmFGdzAwCk1qQXhNVEl4T0RVNU16SmFNRWd4Q3pBSkJnTlZCQVlUQWtKTk1Sa3dGd1lEVlFRS0V4QlJkVzlXWVdScGN5Qk0KYVcxcGRHVmtNUjR3SEFZRFZRUURFeFZSZFc5V1lXUnBjeUJTYjI5MElFTkJJRElnUnpNd2dnSWlNQTBHQ1NxRwpTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFDaHJpV3lBUmpjVjRnL1J1djVyK0xySTNIaW10RmhaaUZmCnFxOG5VZVZ1R3hiVUxYMVFzRk4zdlhnNllPSmtBcHQ4aHB2V0dvNnQveDhWZjlXVkhoTEw1aFNFQk1IZk5yTVcKbjRyanlkdVlOTTdZTXhjb1J2eW55ZkRTdE5WTkNYSkorZktINDZuYWZhRjlhN0k2SmFsdFVrU3MrTDV1Kzl5bQpjNUdRWWFZREZDRHk1NGVqaUsydG9Jei9wZ3NsVWlYbkZnSFZ5N2cxZ1F5ak8vRGg0ZnhhWGM2QWNXMzRTYXMrCk83cTQxNEFCKzZYclc3UEZYbUFxTWFDdk4rZ2dPcCtvTWl3TXpBa2QwNTZPWGJ4TW1PN0ZHbWg3N0ZPbTZSUTEKbzkvTmdKOE1TUHNjOVBHL1NyajYxWXh4U3NjZnJmNUJtck9EWGZLRVZ1K2xWMFBPS2EyTXExVy94UHRiQWQwagpJYUZZQUk3RDBHb1Q3UlBqRWl1QTNHZm1sYkxOSGlKdUt2aEIxUExLRkFlTmlsVVN4bW4xdUlab0wxTmVzTktxCkljR1k1akRqWjFYSG0yNnNHYWhWcGtVRzBDTTYyK3RsWFNvUkVmQTdUOHB0OURURWNlVC9BRnIyWEs0allJVnoKOGVRUXNTV3UxWks3RThFTTREbmF0RGxYdGFzMXFuSWhPNE0xNXpIZmVpRnV1RElJZlIweWtSVktZbkxQNDNlaAp2TlVSRzNZQlp3amdRUXZENnhWdStLUVoyYUtycitJblVsWXJBb29zRkNUNXYwSUN2eWJJeG8vZ2JqaDlVeTNsCjdaaXpsV05vZi9rMTlOK0l4V0Exa3NCOGFSeGhsUmJRNjk0THJ6NEVFRVZsV0ZBNHIwanlXYllXOGp3TmtBTEcKY0M0QnJUd1Yxd0lEQVFBQm8wSXdRREFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQTRHQTFVZER3RUIvd1FFQXdJQgpCakFkQmdOVkhRNEVGZ1FVN2VkdmRscS9ZT3hKVzhhbGQ3dHlGbkdieEQwd0RRWUpLb1pJaHZjTkFRRUxCUUFECmdnSUJBSkhmZ0Q5RENYNXh3dmZyczRpUDRWR3l2RDExK1NoZHlMeVptM3RkcXVYSzRRcjM2TExUbjkxbk1YNjYKQWFySGFrRTdrTlFJWExKZ2FwRHd5TTREWXZtTDdmdHVLdHdHVFR3cEQ0a1dpbGhNU0Evb2hHSHFQSEttZCtSQwpyb2lqUTFoNWZxN0twVk1OcVQxd3ZTQVpZYVJzT1B4RE11SEJSLy80N1BFUklqS1duTUwyVzJtV2V5QU1RMEdhClcvWlpHWWplVllnM1VRdDRYQW9lbzBMOXg1MklEOER5ZUFJa1ZKT3ZpWWVJeVVxQUhlclFiajVoTGphN05RNG4KbHYxbU5EdGhjblB4Rmx4SEJsUkpBSHBZRXJBSzc0WDlzYmd6ZFdxVEhCTG1ZRjV2SFgvSkh5UExoR0dmSG9KRQorVit0WWxVa21sS1k3Vkhub1g2WE91WXZIeEhhVTRBc2haNnJOUkRiSWw5cXhWNlhVL0l5QWdrd28xandEUUhWCmNzYXhmR2w3dy9VMlJjeGhibDVNbE1WZXJ1Z09Yb3UvOTgzZzdhRU9HelB1VkJqK0Q3N3Zmb1JyUStOd21OdGQKZGJJTldRZUZGU001MXZIZnFTWVAxa2pIczZZaTlUTTNXcFZIbjN1NkdCVnYvOVlVWklOSjBncG5JZHNQTldOZwpLQ0xqc1pXRHpZV20zUzhQNTJkU2Jyc3ZoWHoxU25QbnhUN0F2U0VTQlQvOHR3TkpBbHZJSmViaVZEajFlWWVNCkhWT3lUb1Y3QmpqSExQajRzSEtOSmVWM1V2UURIRWltVUYrSUlEQnU4b0pEcXoyWGhPZFQreUhCVHc4aW1vYTQKV1NyMlJ6MFppQzNvaGVHZTdJVUlhckZzTk1rZDdFZ3JPM2p0WnNTT2VXbUQzbitNCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1RdW9WYWRpcyBSb290IENBIDMgRzMgTz1RdW9WYWRpcyBMaW1pdGVkCiMgU3ViamVjdDogQ049UXVvVmFkaXMgUm9vdCBDQSAzIEczIE89UXVvVmFkaXMgTGltaXRlZAojIExhYmVsOiAiUXVvVmFkaXMgUm9vdCBDQSAzIEczIgojIFNlcmlhbDogMjY4MDkwNzYxMTcwNDYxNDYyNDYzOTk1OTUyMTU3MzI3MjQyMTM3MDg5MjM5NTgxCiMgTUQ1IEZpbmdlcnByaW50OiBkZjo3ZDpiOTphZDo1NDo2Zjo2ODphMTpkZjo4OTo1NzowMzo5Nzo0MzpiMDpkNwojIFNIQTEgRmluZ2VycHJpbnQ6IDQ4OjEyOmJkOjkyOjNjOmE4OmM0OjM5OjA2OmU3OjMwOjZkOjI3Ojk2OmU2OmE0OmNmOjIyOjJlOjdkCiMgU0hBMjU2IEZpbmdlcnByaW50OiA4ODplZjo4MTpkZToyMDoyZTpiMDoxODo0NToyZTo0MzpmODo2NDo3Mjo1YzplYTo1ZjpiZDoxZjpjMjpkOTpkMjowNTo3MzowNzowOTpjNTpkODpiODo2OTowZjo0NgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRllEQ0NBMGlnQXdJQkFnSVVMdldiQWlpbjIzci8xYU9wN3IwRG9NOFNhaDB3RFFZSktvWklodmNOQVFFTApCUUF3U0RFTE1Ba0dBMVVFQmhNQ1FrMHhHVEFYQmdOVkJBb1RFRkYxYjFaaFpHbHpJRXhwYldsMFpXUXhIakFjCkJnTlZCQU1URlZGMWIxWmhaR2x6SUZKdmIzUWdRMEVnTXlCSE16QWVGdzB4TWpBeE1USXlNREkyTXpKYUZ3MDAKTWpBeE1USXlNREkyTXpKYU1FZ3hDekFKQmdOVkJBWVRBa0pOTVJrd0Z3WURWUVFLRXhCUmRXOVdZV1JwY3lCTQphVzFwZEdWa01SNHdIQVlEVlFRREV4VlJkVzlXWVdScGN5QlNiMjkwSUVOQklETWdSek13Z2dJaU1BMEdDU3FHClNJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUN6eXc0UVo0N3FGSmVuTWlvS1ZqWi9hRXpIczI4Nkl4U1IKL3hsL3BjcXM3ck4yblhycGl4dXJhekhiK2d0VFRLL0ZwUnA1UElwTS82emZKZDVPMllJeUMwVGV5dHVNcktOdQpGb003cG1STE1vbjdGaFk0ZnV0RDR0TjBTc0ppQ25NSzNVbXpWOUt3Q29XZGNUemVvOHZBTXZNQk9TQkRHelhSClU3T3g3c1dUYVlJK0ZyVW9ScUhlNm9rSjdVTzRCVWFLaHZWWlI3NGJid0VoRUxuOXFkSW95aEE1Q2NvVE5zK2MKcmExQWRIa3JBajgwLy9vZ2FYM1Q3bUgxdXJQbk1OQTNJNFp5WVVVcFNGbG9iM2VtTG9HK0IwMXZyODdFUlJPUgpGSEFHangrZitJZHBzUTd2dzRrWjYrb2NZZng2YklyYzFnTUxuaWE2RXQzVVZEbXJKcU16Nm5XQjJpM05EMC9rCkE5SHZGWmNiYTVERkFwQ1RaZ0loc1VmZWk1cEtnTGxWajdXaUw4RFdNMmZhZnNTbnRBUkU2MGY3NWxpNTl3encKZXl1eHdIQXB3MEJpTFR0SWFkd2pQRWpyZXdsNXFXM2FxRENZejRCeUE0aW1XMGF1Y25sOENBTWhaYTYzNFJ5bApzU3FpTWQ1bUJQZkFkT2h4M3Y4OVdjeVdKaEtMaFpWWEdxdHJkUXRFUFJFb1BIdGh0K0tQWjAvbDdEeE1ZSUJwClZ6Z2VBVnVOVmVqSDM4RE1keU0wU1hWODlwZ1I2eTNlN1VFdUZBVUNmK0QrSU9zMTV4R3NJczVYUGQ3Sk1HMFEKQTRYTjhmK01GclhCc2o2SWJHQi9rRStWOS9ZdHJRRTVCd1Q2ZFlCOXYwbFE3ZS9KeEh3YzY0QisyN2JRM1JQKwp5ZE9jMTdLWHFRSURBUUFCbzBJd1FEQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BNEdBMVVkRHdFQi93UUVBd0lCCkJqQWRCZ05WSFE0RUZnUVV4aGZRdktqcUFrUHlHd2FaWFN1UUlMblhuT1F3RFFZSktvWklodmNOQVFFTEJRQUQKZ2dJQkFEUmgyVmExRW9kVlRkMmpOVEZHdTZRSGNyeGZZV0xvcGZzTE43RTh0clA2S1oxL0F2V2t5YWlUdDNweApLR21QYytGU2tOclZ2anJsdDNacVZvQWgzMTNtNlRxZTVUNzJvbW5IS2dxd0dFZmNJSEI5VXFNK1dYekJ1c25JCkZVQmh5bkxXY0t6U3QvQWM1SVlwOE03dmFHUFF0U0NLRldHYWZvYVl0TW5DZHZ2TXVqQVd6S05oeG5RVDVXdnYKb3hYcUEvNFRpMlRrMDhIUzZJVDdTZEVRVFhsbTY2cjk5STB4SG5BVXJkemVaeE5NZ1JWaHZMZlprWGR4R1lGZwp1L0JZcGJXY0MvZVBJbFVud0VzQmJUdVpEZFFkbTJObkw5RHVEY3BtdkpSUHBxM3QvTzVqckZjL1pTWFBzb2FQCjBBai91SFlVYnQ3bEoreXJlTFZUdWJZLzZDRDUwcWkrWVViS2g0eUU4L254b0dpYkloNkJKcHNRQkpGeHdBWWYKM0tEVHVWYW40NWd0ZjRPZDM0d3JuREtPTXBUd0FUd2lLcDlEd2k3RG1Ea0hPSHY4WGdCQ0gvTXlKbm1EaFBibAo4TUZSRXNBTEhnUWpERlNsVEM5SnhVclJ0bTVnRFd2OGE0dUZKR1MzaVE2ckpVZGJQTTkrU2IzSDZRckcydmQrCkRoY0kwMGlYMEhHUzhBODVQalJxSEgzWThpS3V1Mm4wTTdTbVNGWFJEdzRtNk95MkN5Mm5oVFhOL1ZuSW45SE4KUGxvcE5MazloTTZ4WmRSWmtaRldkU0hCZDU3NWV1RmduZE90QkJqMGZPdGVrNDlUU2lJcCtFZ3JQazJHckZ0Lwp5d2FaV1dEWVdHV1ZqVVRSOTM5K0ozOTlyb0QxQjB5MlBweHhWSmtFUy8xWStaajAKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPURpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBHMiBPPURpZ2lDZXJ0IEluYyBPVT13d3cuZGlnaWNlcnQuY29tCiMgU3ViamVjdDogQ049RGlnaUNlcnQgQXNzdXJlZCBJRCBSb290IEcyIE89RGlnaUNlcnQgSW5jIE9VPXd3dy5kaWdpY2VydC5jb20KIyBMYWJlbDogIkRpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBHMiIKIyBTZXJpYWw6IDE1Mzg1MzQ4MTYwODQwMjEzOTM4NjQzMDMzNjIwODk0OTA1NDE5CiMgTUQ1IEZpbmdlcnByaW50OiA5MjozODpiOTpmODo2MzoyNDo4Mjo2NToyYzo1NzozMzplNjpmZTo4MTo4Zjo5ZAojIFNIQTEgRmluZ2VycHJpbnQ6IGExOjRiOjQ4OmQ5OjQzOmVlOjBhOjBlOjQwOjkwOjRmOjNjOmUwOmE0OmMwOjkxOjkzOjUxOjVkOjNmCiMgU0hBMjU2IEZpbmdlcnByaW50OiA3ZDowNTplYjpiNjo4MjozMzo5Zjo4Yzo5NDo1MTplZTowOTo0ZTplYjpmZTpmYTo3OTo1MzphMToxNDplZDpiMjpmNDo0OTo0OTo0NToyZjphYjo3ZDoyZjpjMTo4NQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRGxqQ0NBbjZnQXdJQkFnSVFDNU1jT3RZNVorcG5JNy9EcjVyMFN6QU5CZ2txaGtpRzl3MEJBUXNGQURCbApNUXN3Q1FZRFZRUUdFd0pWVXpFVk1CTUdBMVVFQ2hNTVJHbG5hVU5sY25RZ1NXNWpNUmt3RndZRFZRUUxFeEIzCmQzY3VaR2xuYVdObGNuUXVZMjl0TVNRd0lnWURWUVFERXh0RWFXZHBRMlZ5ZENCQmMzTjFjbVZrSUVsRUlGSnYKYjNRZ1J6SXdIaGNOTVRNd09EQXhNVEl3TURBd1doY05Nemd3TVRFMU1USXdNREF3V2pCbE1Rc3dDUVlEVlFRRwpFd0pWVXpFVk1CTUdBMVVFQ2hNTVJHbG5hVU5sY25RZ1NXNWpNUmt3RndZRFZRUUxFeEIzZDNjdVpHbG5hV05sCmNuUXVZMjl0TVNRd0lnWURWUVFERXh0RWFXZHBRMlZ5ZENCQmMzTjFjbVZrSUVsRUlGSnZiM1FnUnpJd2dnRWkKTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFEWjV5Z3ZVajgyY2ttSWt6VHorR29lTVZTQQpuNjFVUWJWSDM1YW8xSytBTGJrS3ozWDlpYVY5SlByaklnd3J2SlVYQ3pPL0dVMUJCcEFBdlF4TkVQNEh0ZWNjCmJpSlZNV1dYdmRNWDBoNWk4OXZxYkZDTVA0UU1scyszeXdQZ3ltMmhGRXdiaWQzdEFMQlNmSytSYkxFNEU5SHAKRWdqQUFMQWNLeEhhZDNBMm02N09lWWZjZ25EbUNYUndWV212bzJpZnY5MjJlYlB5blhBcFZmU3IvNVZoODhsQQpieDNSdnBPNzA0Z3F1NTIvY2xwV2NUcy8xUFBSQ3Y0bzc2UHUyWm12QTlPUFlMZnlrcUd4dlltSkh6RE53Nll1CllqT3VGZ0ozUkZybmdRbzhwMFF1ZWJnL0JMeGNvSWZoRzY5UmpzM3NMUHI0L20zd09ueXFpK1JubFRHTkFnTUIKQUFHalFqQkFNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEZ1lEVlIwUEFRSC9CQVFEQWdHR01CMEdBMVVkRGdRVwpCQlRPdzBxNW1WWHl1TnRndjZsK3ZWYTFsemFuMWpBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQVFFQXlxVlZqT1BJClFXNXBKNmQxRWU4OGhqWnYwcDNHZURnZGFaYWlrbWt1T0d5YmZRVFVpYVd4TVRlS3lTSE1xMnpOaXh5YTFyOUkKMGpKbXdZckE4eTg2NzhEajFKR0cwVkRqQTl0emQyOUtPVlB0M2liSHRYMnZLMExSZFdMalNpc0N4MUJMNEduaQpsbXdPUkdZUVJJK3RCZXY0ZWF5bUcrZzNOSjFUeVdHcW9sS3ZTbkFXaHNJNnlMRVRjRGJZeis3MENqVFZXMHo5CkI1eWl1dGtCY2x6elRjSGREckVjRGNSanZxMzBGUHVKN0tKQkRrek15RmRBMEc0RHFzME1qb21abVd6d1BEQ3YKT045dnZLTytLU0FucTNUL0V5SjQzcGRTVlI2RHRWUWdBKzZ1d0U5VzNqZk13MytxQkNlNzAzZTRZdHNYZkp3bwpJaE56Yk04bTlZb3A1dz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1EaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMgTz1EaWdpQ2VydCBJbmMgT1U9d3d3LmRpZ2ljZXJ0LmNvbQojIFN1YmplY3Q6IENOPURpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBHMyBPPURpZ2lDZXJ0IEluYyBPVT13d3cuZGlnaWNlcnQuY29tCiMgTGFiZWw6ICJEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMiCiMgU2VyaWFsOiAxNTQ1OTMxMjk4MTAwODU1MzczMTkyODM4NDk1MzEzNTQyNjc5NgojIE1ENSBGaW5nZXJwcmludDogN2M6N2Y6NjU6MzE6MGM6ODE6ZGY6OGQ6YmE6M2U6OTk6ZTI6NWM6YWQ6NmU6ZmIKIyBTSEExIEZpbmdlcnByaW50OiBmNToxNzphMjo0Zjo5YTo0ODpjNjpjOTpmODphMjowMDoyNjo5ZjpkYzowZjo0ODoyYzphYjozMDo4OQojIFNIQTI1NiBGaW5nZXJwcmludDogN2U6Mzc6Y2I6OGI6NGM6NDc6MDk6MGM6YWI6MzY6NTU6MWI6YTY6ZjQ6NWQ6Yjg6NDA6Njg6MGY6YmE6MTY6NmE6OTU6MmQ6YjE6MDA6NzE6N2Y6NDM6MDU6M2Y6YzIKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNSakNDQWMyZ0F3SUJBZ0lRQzZGYStoM2ZvTFZKUksvTkpLQnM3REFLQmdncWhrak9QUVFEQXpCbE1Rc3cKQ1FZRFZRUUdFd0pWVXpFVk1CTUdBMVVFQ2hNTVJHbG5hVU5sY25RZ1NXNWpNUmt3RndZRFZRUUxFeEIzZDNjdQpaR2xuYVdObGNuUXVZMjl0TVNRd0lnWURWUVFERXh0RWFXZHBRMlZ5ZENCQmMzTjFjbVZrSUVsRUlGSnZiM1FnClJ6TXdIaGNOTVRNd09EQXhNVEl3TURBd1doY05Nemd3TVRFMU1USXdNREF3V2pCbE1Rc3dDUVlEVlFRR0V3SlYKVXpFVk1CTUdBMVVFQ2hNTVJHbG5hVU5sY25RZ1NXNWpNUmt3RndZRFZRUUxFeEIzZDNjdVpHbG5hV05sY25RdQpZMjl0TVNRd0lnWURWUVFERXh0RWFXZHBRMlZ5ZENCQmMzTjFjbVZrSUVsRUlGSnZiM1FnUnpNd2RqQVFCZ2NxCmhrak9QUUlCQmdVcmdRUUFJZ05pQUFRWjU3eXNSR1h0emJnL1dQdU5zVmVwUkMwRkZmTHZDLzhRZEorMVlsSmYKWm40ZjVkd2JSWGtMek1aVENwMk5YUUxacVZuZUFscjJsU29PalRoS2lrbkd2TVlET0FkZlZkcCtDVzdpZjE3UQpSU0FQV1hZUTFxQWs4QzNlTnZKc0tUbWpRakJBTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RGdZRFZSMFBBUUgvCkJBUURBZ0dHTUIwR0ExVWREZ1FXQkJUTDBMMnA0WmdGVWFGTk42S0RlYzZOSFNya2hEQUtCZ2dxaGtqT1BRUUQKQXdObkFEQmtBakFscElGRkFtc1NTM1YwVDhnajQzRHlkWExlZklud3o1RnlZWjVlRUpKWlZybUR4eERuT09sWQpKalo5MWVRMGhqa0NNSHcyVS9BdzVXSmpPcG5pdHFNN216VDZIdG9Ra25GZWtST24zYVJ1a3N3eTF2VWhac2N2CjZwWmphbVZGa3BVQnRBPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPURpZ2lDZXJ0IEdsb2JhbCBSb290IEcyIE89RGlnaUNlcnQgSW5jIE9VPXd3dy5kaWdpY2VydC5jb20KIyBTdWJqZWN0OiBDTj1EaWdpQ2VydCBHbG9iYWwgUm9vdCBHMiBPPURpZ2lDZXJ0IEluYyBPVT13d3cuZGlnaWNlcnQuY29tCiMgTGFiZWw6ICJEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMiIKIyBTZXJpYWw6IDQyOTM3NDM1NDAwNDY5NzUzNzg1MzQ4Nzk1MDMyMDIyNTM1NDEKIyBNRDUgRmluZ2VycHJpbnQ6IGU0OmE2OjhhOmM4OjU0OmFjOjUyOjQyOjQ2OjBhOmZkOjcyOjQ4OjFiOjJhOjQ0CiMgU0hBMSBGaW5nZXJwcmludDogZGY6M2M6MjQ6Zjk6YmY6ZDY6NjY6NzY6MWI6MjY6ODA6NzM6ZmU6MDY6ZDE6Y2M6OGQ6NGY6ODI6YTQKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGNiOjNjOmNiOmI3OjYwOjMxOmU1OmUwOjEzOjhmOjhkOmQzOjlhOjIzOmY5OmRlOjQ3OmZmOmMzOjVlOjQzOmMxOjE0OjRjOmVhOjI3OmQ0OjZhOjVhOmIxOmNiOjVmCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEampDQ0FuYWdBd0lCQWdJUUF6cng1cWNScWFDN0tHU3hIUW42NVRBTkJna3Foa2lHOXcwQkFRc0ZBREJoCk1Rc3dDUVlEVlFRR0V3SlZVekVWTUJNR0ExVUVDaE1NUkdsbmFVTmxjblFnU1c1ak1Sa3dGd1lEVlFRTEV4QjMKZDNjdVpHbG5hV05sY25RdVkyOXRNU0F3SGdZRFZRUURFeGRFYVdkcFEyVnlkQ0JIYkc5aVlXd2dVbTl2ZENCSApNakFlRncweE16QTRNREV4TWpBd01EQmFGdzB6T0RBeE1UVXhNakF3TURCYU1HRXhDekFKQmdOVkJBWVRBbFZUCk1SVXdFd1lEVlFRS0V3eEVhV2RwUTJWeWRDQkpibU14R1RBWEJnTlZCQXNURUhkM2R5NWthV2RwWTJWeWRDNWoKYjIweElEQWVCZ05WQkFNVEYwUnBaMmxEWlhKMElFZHNiMkpoYkNCU2IyOTBJRWN5TUlJQklqQU5CZ2txaGtpRwo5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBdXpmTk5OeDdhOG15YUpDdFNuWC9Scm9oQ2dpTjlSbFV5ZnVJCjIvT3U4anFKa1R4NjVxc0dHbXZQckMzb1hna2tSTHBpbW43V282aCs0RlIxSUFXc1VMZWNZeHBzTU56YUh4bXgKMXg3ZS9kZmd5NVNETjY3c0gwTk8zWHNzMHIwdXBTL2txYml0T3RTWnBMWWw2WnRyQUdDU1lQOVBJVWtZOTJlUQpxMkVHbkkveXV1bTA2Wkl5YTdYelYraGRHODJNSGF1VkJKVko4elV0bHVOSmJkMTM0L3RKUzdTc1ZRZXBqNVd6CnRDTzdURzFGOFBhcHNwVXd0UDFNVll3blNsY1VmSUtkelhPUzB4WktCZ3lNVU5HUEhnbStGNkhtSWNyOWcrVVEKdklPbENzUm5LUFp6RkJROVJuYkRoeFNKSVRSTnJ3OUZES1pKb2JxN25NV3hNNE1waFFJREFRQUJvMEl3UURBUApCZ05WSFJNQkFmOEVCVEFEQVFIL01BNEdBMVVkRHdFQi93UUVBd0lCaGpBZEJnTlZIUTRFRmdRVVRpSlVJQmlWCjV1TnU1Zy82K3JrUzdRWVhqemt3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQUdCbktKUnZEa2hqNnpIZDZtY1kKMVlsOVBNV0xTbi9wdnRzckY5K3dYM04zS2pJVE9ZRm5Rb1FqOGtWbk5leUl2L2lQc0dFTU5LU3VJRXlFeHR2NApOZUYyMmQrbVFydkhSQWlHZnpaMEpGcmFiQTBVV1RXOThrbmR0aC9Kc3cxSEtqMlpMN3RjdTdYVUlPR1pYMU5HCkZkdG9tL0R6TU5VK01lS05oSjdqaXRyYWxqNDFFNlZmOFBsd1VIQkhRUkZYR1U3QWo2NEd4SlVURnk4YkpaOTEKOHJHT21hRnZFN0ZCY2Y2SUtzaFBFQ0JWMS9NVVJlWGdSUFRxaDVVeWt3NytVMGI2TEozL2l5SzVTOWtKUmFUZQpwTGlhV04wYmZWS2ZqbGxEaUlHa25pYlZiNjNkRGNZM2ZlMERraHZsZDE5MjdqeU54RjFXVzZMWlptNnpOVGZsCk1yWT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPURpZ2lDZXJ0IEdsb2JhbCBSb290IEczIE89RGlnaUNlcnQgSW5jIE9VPXd3dy5kaWdpY2VydC5jb20KIyBTdWJqZWN0OiBDTj1EaWdpQ2VydCBHbG9iYWwgUm9vdCBHMyBPPURpZ2lDZXJ0IEluYyBPVT13d3cuZGlnaWNlcnQuY29tCiMgTGFiZWw6ICJEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMyIKIyBTZXJpYWw6IDcwODkyNDQ0NjkwMzAyOTMyOTE3NjAwODMzMzM4ODQzNjQxNDYKIyBNRDUgRmluZ2VycHJpbnQ6IGY1OjVkOmE0OjUwOmE1OmZiOjI4OjdlOjFlOjBmOjBkOmNjOjk2OjU3OjU2OmNhCiMgU0hBMSBGaW5nZXJwcmludDogN2U6MDQ6ZGU6ODk6NmE6M2U6NjY6NmQ6MDA6ZTY6ODc6ZDM6M2Y6ZmE6ZDk6M2I6ZTg6M2Q6MzQ6OWUKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDMxOmFkOjY2OjQ4OmY4OjEwOjQxOjM4OmM3OjM4OmYzOjllOmE0OjMyOjAxOjMzOjM5OjNlOjNhOjE4OmNjOjAyOjI5OjZlOmY5OjdjOjJhOmM5OmVmOjY3OjMxOmQwCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDUHpDQ0FjV2dBd0lCQWdJUUJWVld2UEplcERVMXc2UVAxYXRGY2pBS0JnZ3Foa2pPUFFRREF6QmhNUXN3CkNRWURWUVFHRXdKVlV6RVZNQk1HQTFVRUNoTU1SR2xuYVVObGNuUWdTVzVqTVJrd0Z3WURWUVFMRXhCM2QzY3UKWkdsbmFXTmxjblF1WTI5dE1TQXdIZ1lEVlFRREV4ZEVhV2RwUTJWeWRDQkhiRzlpWVd3Z1VtOXZkQ0JITXpBZQpGdzB4TXpBNE1ERXhNakF3TURCYUZ3MHpPREF4TVRVeE1qQXdNREJhTUdFeEN6QUpCZ05WQkFZVEFsVlRNUlV3CkV3WURWUVFLRXd4RWFXZHBRMlZ5ZENCSmJtTXhHVEFYQmdOVkJBc1RFSGQzZHk1a2FXZHBZMlZ5ZEM1amIyMHgKSURBZUJnTlZCQU1URjBScFoybERaWEowSUVkc2IySmhiQ0JTYjI5MElFY3pNSFl3RUFZSEtvWkl6ajBDQVFZRgpLNEVFQUNJRFlnQUUzYWZadTRxNEMvc0xmeUhTOEw2K2MvTXpYUnE4Tk9yZXhwdTgwSlgyOE16UUM3cGhXMUZHCmZwNHRuKzZPWXd3WDdBZHc5YytFTGtDRG5PZy9RVzA3cmRPa0ZGazJlSjBEUSs0UUUyeHkzcTZJcDZGcnRVUE8KWjl3ai93TWNvK0krbzBJd1FEQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BNEdBMVVkRHdFQi93UUVBd0lCaGpBZApCZ05WSFE0RUZnUVVzOXRJcFBtaHhkaXVOa0hNRVdOcFlpbThTOFl3Q2dZSUtvWkl6ajBFQXdNRGFBQXdaUUl4CkFLMjg4bXcvRWtyUkxUbkRDZ21YYy9TSU5veUlKN3ZtaUkxUWhhZGorWjR5M21hVEQvSE1zUW1QM1d5cittdC8Kb0FJd09XWmJ3bVNOdUo1UTNLalZTYUx0eDl6UlNYOFhBYmpJaG85T2pJZ3JxSnFwaXNYUkFMMzRWT0thNVZ0OApzeWNYCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1EaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQgTz1EaWdpQ2VydCBJbmMgT1U9d3d3LmRpZ2ljZXJ0LmNvbQojIFN1YmplY3Q6IENOPURpZ2lDZXJ0IFRydXN0ZWQgUm9vdCBHNCBPPURpZ2lDZXJ0IEluYyBPVT13d3cuZGlnaWNlcnQuY29tCiMgTGFiZWw6ICJEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQiCiMgU2VyaWFsOiA3NDUxNTAwNTU4OTc3MzcwNzc3OTMwMDg0ODY5MDE2NjE0MjM2CiMgTUQ1IEZpbmdlcnByaW50OiA3ODpmMjpmYzphYTo2MDoxZjoyZjpiNDplYjpjOTozNzpiYTo1MzoyZTo3NTo0OQojIFNIQTEgRmluZ2VycHJpbnQ6IGRkOmZiOjE2OmNkOjQ5OjMxOmM5OjczOmEyOjAzOjdkOjNmOmM4OjNhOjRkOjdkOjc3OjVkOjA1OmU0CiMgU0hBMjU2IEZpbmdlcnByaW50OiA1NToyZjo3YjpkYzpmMTphNzphZjo5ZTo2YzplNjo3MjowMTo3Zjo0ZjoxMjphYjpmNzo3Mjo0MDpjNzo4ZTo3NjoxYTpjMjowMzpkMTpkOTpkMjowYTpjODo5OTo4OAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmtEQ0NBM2lnQXdJQkFnSVFCWnNiVjU2T0lUTGlPUWU5cDNkMVhEQU5CZ2txaGtpRzl3MEJBUXdGQURCaQpNUXN3Q1FZRFZRUUdFd0pWVXpFVk1CTUdBMVVFQ2hNTVJHbG5hVU5sY25RZ1NXNWpNUmt3RndZRFZRUUxFeEIzCmQzY3VaR2xuYVdObGNuUXVZMjl0TVNFd0h3WURWUVFERXhoRWFXZHBRMlZ5ZENCVWNuVnpkR1ZrSUZKdmIzUWcKUnpRd0hoY05NVE13T0RBeE1USXdNREF3V2hjTk16Z3dNVEUxTVRJd01EQXdXakJpTVFzd0NRWURWUVFHRXdKVgpVekVWTUJNR0ExVUVDaE1NUkdsbmFVTmxjblFnU1c1ak1Sa3dGd1lEVlFRTEV4QjNkM2N1WkdsbmFXTmxjblF1ClkyOXRNU0V3SHdZRFZRUURFeGhFYVdkcFEyVnlkQ0JVY25WemRHVmtJRkp2YjNRZ1J6UXdnZ0lpTUEwR0NTcUcKU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQy81cEJ6YU42NzVGMUtQREFpTUdrejdNS25KUzdKSVQzeQppdGhad3VFcHB6MVlxM2FhemE1N0c0UU54REFmOHh1a09CYnJWc2FYYlIycnNubnl5aEhTNUYvV0JUeFNEMUlmCnhwNFZwWDYrbjZsWEZsbFZjcTlvazNEQ3NycDFtV3B6TXBUUkVFUVFMdCtDOHdlRTVuUTdiWEhpTFF3YjdpRFYKeVNBZFl5a3R6dXhlVHNpVCtDRmhtelRyQmNaZTdGc2F2T3ZKejgyc05FQmZzWHBtN25mSVNLaG1WMWVmVkZpTwpEQ3UzVDZjdzJWYnV5bnRkNDYzSlQxN2xOZWN4eTlxVFh0eU9qNERhdHBHWVFKQjV3M2pIdHJIRXRXb1lPQU1RCmpkalVONlF1QlgySTlZSStFSkZ3cTFXQ1FUTFgyd1J6S202UkFYd2hUTlM4cmhzRGRWMTRadGs2TVVTYU0wQy8KQ05kYVNhVEM1cW1nWjkya0o3eWhUem0xRVZnWDl5UmNSbzlrOThGcGlIYVlkajFaWFVKMmg0bVhhWHBJOE9DaQpFaHRtbW5USzNrc2U1dzVqcnViVTc1S1NPcDQ5M0FEa1JTV0p0cHBFR1N0K3dKUzAwbUZ0NnpQWnhkOUxCQURNCmZSeVZ3NC8zSWJLeUViZTdmL0xWakhBc1FXQ3FzV01ZUkpVYWRtSis5b0N3Kytoa3BqUFJpUWZodmJmbVE2UVkKdUtaM0FlRVBsQXdoSGJKVUtTV0piT1VPVWxGSGRMNG1yTFpCZGQ1NnJGK05QOG04MDBFUkVsdmxFRkRyTWNYSwpjaFlpQ2Q5OFRIVS9ZK3doWDhRZ1VXdHZzYXVHaTAvQzFrVmZuU0Q4b1I3RndJK2lzWDRLSnBuMTVHa3ZtQjB0CjlkbXBzaDNsR3dJREFRQUJvMEl3UURBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUE0R0ExVWREd0VCL3dRRUF3SUIKaGpBZEJnTlZIUTRFRmdRVTdOZmpndEp4WFdSTTN5NW5QK2U2bUs0Y0QwOHdEUVlKS29aSWh2Y05BUUVNQlFBRApnZ0lCQUx0aDJYMnBiTDRYeEpFYnc2R2lBSTNqWkdnUFZzOTNybkQ1L1pwS21ibkplRndNREYvazVoUXBWZ3MyClNWMUVZK0N0bkpZWVpoc2pEVDE1NlcxcjFsVDQwanpCUTBDdUhWRDFVdnlRTzd1WW1XbHJ4OEducUdpa0o5eWQKK1NldU1JVzU5bWROT2o2UFdUa2lVMFRyeUYwRHl1MVFlbjFpSVFxQXlITm0wYUFGWUYvb3BiU25yNmozYlRXYwpmRnFLMXFJNG1mTjRpL1JOMGlBTDNnVHVqSnRIZ1hJTndCUXk3ekJaTHE3Z2NmSlc1R3FYYjVKUWJaYU5hSHFhCnNqWVVlZ2J5SkxrSkVWRFhDTEc0aVhxRUkyRkNLZVdqemFJZ1FkZlJuR1RaNmlhaGl4VFhUQm15VUVGeFBUOU4KY0NPR0RFcmNnZExNTXBTRURRZ0pseHhQd081cklIUXcwdUE1TkJDRklSVUJDT2hWTXQ1eFNka29GMUJONXI1TgowWFdzME1yN1FiaERwYXJUd3dWRVR5dzJtK0w2NGtXNEkxTnNCbTluVlg5R3RVdy9iaWhhZVNiU3BLaGlsOUllCjR1MUtpN3diL1VkS0RkOW5abjZ5VzBIUU8rVDBPL1FFWStudndsUUFVYUNLS3NuT2VNelY2b2NFR0xQT3IwbUkKci9PU21iYXo1bUVQMG9VQTUxQWE1QnVWblJtaHVaeXhtN0VBSHUvUUQwOUNiTWtLdk81RCtqcHhwY2hOSnFVMQovWWxkdklWaUhUTFNvQ3RVN1pwWHdkdjZFTThadDR0S0c0OEJ0aWVWVStpMmlXMWJ2R2pVSStpTFVhSlcrZkNtCmdLRFdIck84RHc5VGRTbXE2aE4zNU42TWdTR3RCeEJIRWEySFBRZlJkYnpQODJaKwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049Q09NT0RPIFJTQSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPUNPTU9ETyBDQSBMaW1pdGVkCiMgU3ViamVjdDogQ049Q09NT0RPIFJTQSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPUNPTU9ETyBDQSBMaW1pdGVkCiMgTGFiZWw6ICJDT01PRE8gUlNBIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IgojIFNlcmlhbDogMTAxOTA5MDg0NTM3NTgyMDkzMzA4OTQxMzYzNTI0ODczMTkzMTE3CiMgTUQ1IEZpbmdlcnByaW50OiAxYjozMTpiMDo3MTo0MDozNjpjYzoxNDozNjo5MTphZDpjNDozZTpmZDplYzoxOAojIFNIQTEgRmluZ2VycHJpbnQ6IGFmOmU1OmQyOjQ0OmE4OmQxOjE5OjQyOjMwOmZmOjQ3OjlmOmUyOmY4Ojk3OmJiOmNkOjdhOjhjOmI0CiMgU0hBMjU2IEZpbmdlcnByaW50OiA1MjpmMDplMTpjNDplNTo4ZTpjNjoyOToyOToxYjo2MDozMTo3ZjowNzo0Njo3MTpiODo1ZDo3ZTphODowZDo1YjowNzoyNzozNDo2Mzo1Mzo0YjozMjpiNDowMjozNAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRjJEQ0NBOENnQXdJQkFnSVFUS3I1eXR0amIrQWY5MDdZV3dPR25UQU5CZ2txaGtpRzl3MEJBUXdGQURDQgpoVEVMTUFrR0ExVUVCaE1DUjBJeEd6QVpCZ05WQkFnVEVrZHlaV0YwWlhJZ1RXRnVZMmhsYzNSbGNqRVFNQTRHCkExVUVCeE1IVTJGc1ptOXlaREVhTUJnR0ExVUVDaE1SUTA5TlQwUlBJRU5CSUV4cGJXbDBaV1F4S3pBcEJnTlYKQkFNVElrTlBUVTlFVHlCU1UwRWdRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrd0hoY05NVEF3TVRFNQpNREF3TURBd1doY05Nemd3TVRFNE1qTTFPVFU1V2pDQmhURUxNQWtHQTFVRUJoTUNSMEl4R3pBWkJnTlZCQWdUCkVrZHlaV0YwWlhJZ1RXRnVZMmhsYzNSbGNqRVFNQTRHQTFVRUJ4TUhVMkZzWm05eVpERWFNQmdHQTFVRUNoTVIKUTA5TlQwUlBJRU5CSUV4cGJXbDBaV1F4S3pBcEJnTlZCQU1USWtOUFRVOUVUeUJTVTBFZ1EyVnlkR2xtYVdOaApkR2x2YmlCQmRYUm9iM0pwZEhrd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUNSCjZGU1MwZ3BXc2F3TkpOM0Z6MFJuZEprck42TjlJM0FBY2J4VDM4VDZLaEtQUzM4UVZyMmZjSEszWVgvSlN3OFgKcHozanNBUmg3djhSbDhmMGhqNEsrajVjK1pQbU5IclpGR3ZubkxPRm9JSjZkcTl4a05mcy9RMzZuR3o2MzdDQwo5QlIrK2I3RXBpOVBmNWwvdGZ4blEzSzlEQURXaWV0ckxOUHRqNWdjRkt0KzVlTnUvTmlvNUpJazJrTnJZcmhWCi9lckJ2R3kyaS9NT2pacmttMnhwbWZoNFNEQkYxYTNoRFR4RllQd3lsbEVudkdmRHlpNjJhK3BHeDhjZ29MRWYKWmQ1SUNMcWtUcW55ZzBZM2hPdm96SUZJUTJkT2NpcWJYTDFNR3lpS1hDSjd0S3VZMmU3Z1VZUERDVVpPYlQ2WgorcFVYMm53elYwRThqVkh0QzdaY3J5eGpHdDlYeUQrODZWM0VtNjlGbWVLaldpUzB1cWxXUGM5dnF2OUpXTDd3CnFQLzB1SzNwTi91NnVQUUxPdm5vUTBJZWlkaUV5eFB4MmJ2aGlXQzRqQ2hXckJRZG5Bcm5jZXZQRHQwOXFaYWgKU0wwODk2KzFEU0pNd0JHQjdGWTc5dE9pNGx1M3NnUWlVcFdBazJub2preGw4WkVETFhCMEF1cUxaeFVwYVZJQwp1OWZmVUdwVlJyK2dveWhoZjNEUXc2S3FMQ0dxUjg0b25BWkZkcitDR0NlMDFhNjB5MURtYS9STWhuRXc2YWJmCkZvYmcyUDlBM2Z2UVFvaC9vek02TGx3ZVFSR0JZODRZY1dzcjdLYUt0ekZjT21wSDRNTjVXZFlnR3EveWFwaXEKY3J4WFN0SkxuYnNRL0xCTVFlWHRIVDFlS0oyY3pMK3pVZHFuUitXRVV3SURBUUFCbzBJd1FEQWRCZ05WSFE0RQpGZ1FVdTY5K0FqMzZwdkU4aEk2dDdqaVk3Tmt5TXRRd0RnWURWUjBQQVFIL0JBUURBZ0VHTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRU1CUUFEZ2dJQkFBcngxVWFFdDY1UnUyeXlUVUVVQUpOTW5NdmwKd0ZUUG9DV09Bdm45c0tJTjlTQ1lQQk10ckZhaXNOWitFWkxwTHJxZUxwcHlzYjBaUkd4aE5hS2F0QllTYVZxTQo0ZGMrcEJyb0x3UDBybUVkRUJzcXBJdDZ4ZjRGcHVIQTFzaitucTZQSzdvOW1malljd2xZUm02bW5QVFhKOU9WCjJqZURjaHpUYytDaVI1a0RPRjNWU1hrQUtSekg3SnNnSEFja2FWZDRzam44T29TZ3RaeDhqYjh1azJJbnR6bmEKRnhpdXZUd0phUCtFbXp6VjFnc0Q0MWVlRlBmUjYwL0l2WWNqdDdaSlEzbUZYTHJya2d1aHh1aG9xRXdXc1JxWgpDdWhUTEpLN29Ra1lkUXhscUh2TEk3Y2F3aWlGd3h2LzBDdGk3NlI3Q1pHWVo0d1VBYzFvQm1waklYVURnSWlLCmJvSEdoZktwcEMzbjlLVWtFRWVEeXMzMGpYbFlzUWFiNXhvcTJaMEIxNVI5N1FOS3l2RGI2S2tCUHZWV21ja2UKamtrOXUrVUp1ZUJQU1pJOUZvSkF6TXhaeHVZNjdSSXVhVHhzbGJIOXFoMTdmNGErSGc0eVJ2djdFNDkxZjB5TApTMFpqL2dBMFFIREJ3N21oM2FadzRnU3pRYnpwZ0pIcVpKeDY0U0lEcVp4dWJ3NWxUMnlIaDE3emJxRDVkYVdiClFPaFRzaWVkU3JuQWR5R04vNGZ5M3J5TTd4ZmZ0MGtMMGZKdU1Bc2FEazUyN1JIODllbFdzbjIveDIwS2s0eWwKME1DMkhiNDZUcFNpMTI1c0M4S0tmUG9nODhUazVjME5xTXVSa3JGOGhleTFGR2xtRG9MbnpjN0lMYVpSZnlIQgpOVk9GQmtwZG42MjdHMTkwCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1VU0VSVHJ1c3QgUlNBIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89VGhlIFVTRVJUUlVTVCBOZXR3b3JrCiMgU3ViamVjdDogQ049VVNFUlRydXN0IFJTQSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPVRoZSBVU0VSVFJVU1QgTmV0d29yawojIExhYmVsOiAiVVNFUlRydXN0IFJTQSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSIKIyBTZXJpYWw6IDI2NDUwOTM3NjQ3ODEwNTg3ODc1OTE4NzE2NDU2NjU3ODg3MTcKIyBNRDUgRmluZ2VycHJpbnQ6IDFiOmZlOjY5OmQxOjkxOmI3OjE5OjMzOmEzOjcyOmE4OjBmOmUxOjU1OmU1OmI1CiMgU0hBMSBGaW5nZXJwcmludDogMmI6OGY6MWI6NTc6MzM6MGQ6YmI6YTI6ZDA6N2E6NmM6NTE6Zjc6MGU6ZTk6MGQ6ZGE6Yjk6YWQ6OGUKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGU3OjkzOmM5OmIwOjJmOmQ4OmFhOjEzOmUyOjFjOjMxOjIyOjhhOmNjOmIwOjgxOjE5OjY0OjNiOjc0OjljOjg5Ojg5OjY0OmIxOjc0OjZkOjQ2OmMzOmQ0OmNiOmQyCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGM2pDQ0E4YWdBd0lCQWdJUUFmMXRNUHlqeWxHb0c3eGtEalVETFRBTkJna3Foa2lHOXcwQkFRd0ZBRENCCmlERUxNQWtHQTFVRUJoTUNWVk14RXpBUkJnTlZCQWdUQ2s1bGR5QktaWEp6WlhreEZEQVNCZ05WQkFjVEMwcGwKY25ObGVTQkRhWFI1TVI0d0hBWURWUVFLRXhWVWFHVWdWVk5GVWxSU1ZWTlVJRTVsZEhkdmNtc3hMakFzQmdOVgpCQU1USlZWVFJWSlVjblZ6ZENCU1UwRWdRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrd0hoY05NVEF3Ck1qQXhNREF3TURBd1doY05Nemd3TVRFNE1qTTFPVFU1V2pDQmlERUxNQWtHQTFVRUJoTUNWVk14RXpBUkJnTlYKQkFnVENrNWxkeUJLWlhKelpYa3hGREFTQmdOVkJBY1RDMHBsY25ObGVTQkRhWFI1TVI0d0hBWURWUVFLRXhWVQphR1VnVlZORlVsUlNWVk5VSUU1bGRIZHZjbXN4TGpBc0JnTlZCQU1USlZWVFJWSlVjblZ6ZENCU1UwRWdRMlZ5CmRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa3dnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUsKQW9JQ0FRQ0FFbVVYTmc3RDJ3aXowS3hYRFhidHpTZlRUSzFRZzJIaXFpQk5DUzFrQ2R6T2laL01QYW5zOXMvQgozUEhUc2RaN055Z1JLMGZhT2NhOE9obTBYNmE5ZloyalkwSzJkdktwT3l1UitPSnYwT3dXSUpBSlB1TG9kTWtZCnRKSFVZbVRiZjZNRzhZZ1lhcEFpUEx6K0UvQ0hGSHYyNUIrTzFPUlJ4aEZuUmdoUnk0WVVWRCs4TS81K2JKei8KRnAwWXZWR09OYWFuWnNoeVo5c2hackhVbTNnRHdGQTY2TXp3M0x5ZVRQNnZCWlkxSDFkYXQvL08rVDIzTExiMgpWTjNJNXhJNlRhNU1pcmRjbXJTM0lEM0tmeUkwcm40N2FHWUJST2NCVGtaVG16Tmc5NVMrVXplUWMwUHpNc05UCjc5dXEvblJPYWNkcmpHQ1Qzc1RIRE4vaE1xN01renRSZUpWbmkrNDlWdjRNMEdrUEd3L3pKU1pyTTIzM2JrZjYKYzBQbGZnNmxackVwZkRLRVkxV0p4QTNCazFRd0dST3MwMzAzcCt0ZE9tdzFYTnRCMXhMYXFVa0wzOWlBaWdtVApZbzYxWnM4bGlNMkV1TEUvcERrUDJRS2U2eEpNbFh6emF3V3BYaGFEekxobjR1Z1RuY3hiZ3ROTXMrMWIvOTdsCmM2d2pPeTBBdnpWVmRBbEoyRWxZR24rU051WlJrZzd6Sm4wY1RSZTh5ZXhESnRDL1FWOUFxVVJFOUpublY0ZWUKVUI5WFZLZysvWFJqTDdGUVpRbm1XRUl1UXhwTXRQQWxSMW42QkI2VDFDWkdTbENCc3Q2K2VMZjhaeFhoeVZlRQpIZzlqMXVsaXV0WmZWUzdxWE1Zb0NBUWxPYmdPSzZueVRKY2NCejhOVXZYdDd5K0NEd0lEQVFBQm8wSXdRREFkCkJnTlZIUTRFRmdRVVUzbS9XcW9yU3M5VWdPSFltOENkOHJJRFpzc3dEZ1lEVlIwUEFRSC9CQVFEQWdFR01BOEcKQTFVZEV3RUIvd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVNQlFBRGdnSUJBRnpVZkEzUDl3RjlRWmxsREhQRgpVcC9MK00rWkJuOGIya01WbjU0Q1ZWZVdGUEZTUENlSGxDanRIem9CTjZKMi9GTlF3SVNieG10T3Vvd2hUNktPClZXS1I4MmtWMkx5STQ4U3FDLzN2cU9sTFZTb0dJRzFWZUNrWjdsOHdYRXNrRVZYL0pKcHVYaW9yN2d0Tm4zLzMKQVRpVUZKVkRCd243WUtudUhLc1NqS0NhWHFlWWFsbHRpejhJKzhqUlJhOFlGV1NRRWc5ektDN0Y0aVJPL0Zqcwo4UFJGL2lLejZ5K08wdGxGWVFYQmwyK29kbktQaTR3MnI3OE5CYzV4amVhbWJ4OXNwbkZpeGRqUWczSU04V2NSCmlReWNFMHh5Tk4rODFYSGZxbkhkNGJsc2pEd1NYV1hhdlZjU3RrTnIvK1hlVFdZUlVjK1pydXdYdHVoeGtZemUKU2Y3ZE5YR2lGU2VVSE05aDR5YTdiNk5uSlNGZDV0MGRDeTVvR3p1Q3IreURaNFhVbUZGMHNibVpnSW4vZjNnWgpYSGxLWUM2U1FLNU1OeW9zeWNkaXlBNWQ5elpieXVBbEpRRzAzUm9IbkhjQVA5RGMxZXc5MVBxN1A4eUYxbTkvCnFTM2Z1UUwzOVplYXRUWGF3MmV3aDBxcEtKNGpqdjljSjJ2aHNFL3pCKzRBTHRSWmg4dFNRWlhxOUVmWDdtUkIKVlh5TldRS1YzV0tkd3JudVdpaDBoS1didDVESERBZmY5WWsyZERMV0tNR3dzQXZnbkV6REhOYjg0Mm0xUjBhQgpMNktDcTlOalJIREVqZjh0TTdxdGozdTFjSWl1UGhuUFFDalkvTWlRdTEyWkl2VlM1bGpGSDRneFErNklIZGZHCmpqeERhaDJuR041OVBSYnhZdm5La0tqOQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049VVNFUlRydXN0IEVDQyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPVRoZSBVU0VSVFJVU1QgTmV0d29yawojIFN1YmplY3Q6IENOPVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1UaGUgVVNFUlRSVVNUIE5ldHdvcmsKIyBMYWJlbDogIlVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkiCiMgU2VyaWFsOiAxMjMwMTM4MjM3MjAxOTk0ODE0NTY1Njk3MjA0NDM5OTc1NzIxMzQKIyBNRDUgRmluZ2VycHJpbnQ6IGZhOjY4OmJjOmQ5OmI1OjdmOmFkOmZkOmM5OjFkOjA2OjgzOjI4OmNjOjI0OmMxCiMgU0hBMSBGaW5nZXJwcmludDogZDE6Y2I6Y2E6NWQ6YjI6ZDU6MmE6N2Y6Njk6M2I6Njc6NGQ6ZTU6ZjA6NWE6MWQ6MGM6OTU6N2Q6ZjAKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDRmOmY0OjYwOmQ1OjRiOjljOjg2OmRhOmJmOmJjOmZjOjU3OjEyOmUwOjQwOjBkOjJiOmVkOjNmOmJjOjRkOjRmOmJkOmFhOjg2OmUwOjZhOmRjOmQyOmE5OmFkOjdhCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDanpDQ0FoV2dBd0lCQWdJUVhJdVp4VnFVeGRKeFZ0N05pWURNSmpBS0JnZ3Foa2pPUFFRREF6Q0JpREVMCk1Ba0dBMVVFQmhNQ1ZWTXhFekFSQmdOVkJBZ1RDazVsZHlCS1pYSnpaWGt4RkRBU0JnTlZCQWNUQzBwbGNuTmwKZVNCRGFYUjVNUjR3SEFZRFZRUUtFeFZVYUdVZ1ZWTkZVbFJTVlZOVUlFNWxkSGR2Y21zeExqQXNCZ05WQkFNVApKVlZUUlZKVWNuVnpkQ0JGUTBNZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGt3SGhjTk1UQXdNakF4Ck1EQXdNREF3V2hjTk16Z3dNVEU0TWpNMU9UVTVXakNCaURFTE1Ba0dBMVVFQmhNQ1ZWTXhFekFSQmdOVkJBZ1QKQ2s1bGR5QktaWEp6WlhreEZEQVNCZ05WQkFjVEMwcGxjbk5sZVNCRGFYUjVNUjR3SEFZRFZRUUtFeFZVYUdVZwpWVk5GVWxSU1ZWTlVJRTVsZEhkdmNtc3hMakFzQmdOVkJBTVRKVlZUUlZKVWNuVnpkQ0JGUTBNZ1EyVnlkR2xtCmFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrd2RqQVFCZ2NxaGtqT1BRSUJCZ1VyZ1FRQUlnTmlBQVFhckZSYXFmbG8KSStkNjFTUnZVOFphMkV1cnh0VzIwZVp6Y2E3ZG5OWU1ZZjNib0lrRHVBVVU3RmZPN2wwLzRpR3p6dmZVaW5uZwpvNE4rTFpmUVljVHhtZHdsa1dPcmZ6Q2p0SERpeDZFem5QTy9MbHhUc1YremZUSi9palRqZVhtalFqQkFNQjBHCkExVWREZ1FXQkJRNjRRbUcxTThad3BaMmRFbDIzT0ExeG1Oam1qQU9CZ05WSFE4QkFmOEVCQU1DQVFZd0R3WUQKVlIwVEFRSC9CQVV3QXdFQi96QUtCZ2dxaGtqT1BRUURBd05vQURCbEFqQTJaNkVXQ056a2x3QkJIVTYrNFdNQgp6enVxUWhGa29KMlVPUUlSZVZ4N0hmcGt1ZTRXUXJPL2lzSUp4T3prc1UwQ01RRHBLbUZIakZKS1MwNFljUGJXClJOWnU5WU82YlZpOUpObFdTT3J2eEtKR2dZaHFPa2JScVp0TnlXSGEwVjFYYWhnPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049R2xvYmFsU2lnbiBPPUdsb2JhbFNpZ24gT1U9R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0CiMgU3ViamVjdDogQ049R2xvYmFsU2lnbiBPPUdsb2JhbFNpZ24gT1U9R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0CiMgTGFiZWw6ICJHbG9iYWxTaWduIEVDQyBSb290IENBIC0gUjQiCiMgU2VyaWFsOiAxNDM2NzE0ODI5NDkyMjk2NDQ4MDg1OTAyMjEyNTgwMDk3Nzg5NzQ3NAojIE1ENSBGaW5nZXJwcmludDogMjA6ZjA6Mjc6Njg6ZDE6N2U6YTA6OWQ6MGU6ZTY6MmE6Y2E6ZGY6NWM6ODk6OGUKIyBTSEExIEZpbmdlcnByaW50OiA2OTo2OTo1NjoyZTo0MDo4MDpmNDoyNDphMTplNzoxOTo5ZjoxNDpiYTpmMzplZTo1ODphYjo2YTpiYgojIFNIQTI1NiBGaW5nZXJwcmludDogYmU6Yzk6NDk6MTE6YzI6OTU6NTY6NzY6ZGI6NmM6MGE6NTU6MDk6ODY6ZDc6NmU6M2I6YTA6MDU6NjY6N2M6NDQ6MmM6OTc6NjI6YjQ6ZmI6Yjc6NzM6ZGU6MjI6OGMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUI0VENDQVllZ0F3SUJBZ0lSS2ppa0hKWUtCTjVDc2lpbEMrZzBtQUl3Q2dZSUtvWkl6ajBFQXdJd1VERWsKTUNJR0ExVUVDeE1iUjJ4dlltRnNVMmxuYmlCRlEwTWdVbTl2ZENCRFFTQXRJRkkwTVJNd0VRWURWUVFLRXdwSApiRzlpWVd4VGFXZHVNUk13RVFZRFZRUURFd3BIYkc5aVlXeFRhV2R1TUI0WERURXlNVEV4TXpBd01EQXdNRm9YCkRUTTRNREV4T1RBek1UUXdOMW93VURFa01DSUdBMVVFQ3hNYlIyeHZZbUZzVTJsbmJpQkZRME1nVW05dmRDQkQKUVNBdElGSTBNUk13RVFZRFZRUUtFd3BIYkc5aVlXeFRhV2R1TVJNd0VRWURWUVFERXdwSGJHOWlZV3hUYVdkdQpNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUV1TVo1MDQ5c0pRNmZMamtaSEFPa3JwcmxPUWNKCkZzcGpzYm1HK0lwWHdWZk9RdnB6b2ZkbFF2OGV3UUN5Ym5NTy84Y2g1UmlrcXRseFA2alV1YzZNSGFOQ01FQXcKRGdZRFZSMFBBUUgvQkFRREFnRUdNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdIUVlEVlIwT0JCWUVGRlN3ZTYxRgp1T0pBZi9zS2J2dStNOGs4bzRUVk1Bb0dDQ3FHU000OUJBTUNBMGdBTUVVQ0lRRGNrcUdnRTZiUEE3RG14Q0dYCmtQb1VWeTBEN080ODAyN0txR3gydktMZXV3SWdKNmlGSnpXYlZzYWo4a2ZTdDI0YkFnQVhxbWVtRlpIZStwVHMKZXd2NG40UT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUdsb2JhbFNpZ24gTz1HbG9iYWxTaWduIE9VPUdsb2JhbFNpZ24gRUNDIFJvb3QgQ0EgLSBSNQojIFN1YmplY3Q6IENOPUdsb2JhbFNpZ24gTz1HbG9iYWxTaWduIE9VPUdsb2JhbFNpZ24gRUNDIFJvb3QgQ0EgLSBSNQojIExhYmVsOiAiR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1IgojIFNlcmlhbDogMzI3ODU3OTIwOTk5OTA1MDcyMjY2ODA2OTgwMTE1NjA5NDc5MzEyNDQKIyBNRDUgRmluZ2VycHJpbnQ6IDlmOmFkOjNiOjFjOjAyOjFlOjhhOmJhOjE3Ojc0OjM4OjgxOjBjOmEyOmJjOjA4CiMgU0hBMSBGaW5nZXJwcmludDogMWY6MjQ6YzY6MzA6Y2Q6YTQ6MTg6ZWY6MjA6Njk6ZmY6YWQ6NGY6ZGQ6NWY6NDY6M2E6MWI6Njk6YWEKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDE3OjlmOmJjOjE0OjhhOjNkOmQwOjBmOmQyOjRlOmExOjM0OjU4OmNjOjQzOmJmOmE3OmY1OjljOjgxOjgyOmQ3OjgzOmE1OjEzOmY2OmViOmVjOjEwOjBjOjg5OjI0Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDSGpDQ0FhU2dBd0lCQWdJUllGbEo0Q1l1dTFYNUNuZUtjZmxLMkd3d0NnWUlLb1pJemowRUF3TXdVREVrCk1DSUdBMVVFQ3hNYlIyeHZZbUZzVTJsbmJpQkZRME1nVW05dmRDQkRRU0F0SUZJMU1STXdFUVlEVlFRS0V3cEgKYkc5aVlXeFRhV2R1TVJNd0VRWURWUVFERXdwSGJHOWlZV3hUYVdkdU1CNFhEVEV5TVRFeE16QXdNREF3TUZvWApEVE00TURFeE9UQXpNVFF3TjFvd1VERWtNQ0lHQTFVRUN4TWJSMnh2WW1Gc1UybG5iaUJGUTBNZ1VtOXZkQ0JEClFTQXRJRkkxTVJNd0VRWURWUVFLRXdwSGJHOWlZV3hUYVdkdU1STXdFUVlEVlFRREV3cEhiRzlpWVd4VGFXZHUKTUhZd0VBWUhLb1pJemowQ0FRWUZLNEVFQUNJRFlnQUVSMFVPbHZ0OVhiL3BPZEVoK0o4THR0VjdIcEk2U0ZrYwo4R0l4TGNCNktQNGFwMXl6dHN5WDUwWFVXUHJSZDIxRG9zQ0haVFFLSDNyZDZ6d3pvY1dkVGFSdlFaVTRmOGtlCmhPdlJua21TaDVTSEREcUZTbWFmblZtVFRaZGhCb1pLbzBJd1FEQU9CZ05WSFE4QkFmOEVCQU1DQVFZd0R3WUQKVlIwVEFRSC9CQVV3QXdFQi96QWRCZ05WSFE0RUZnUVVQZVlwU0p2cUI4b2hSRW9tM203ZTBvUFFuMWt3Q2dZSQpLb1pJemowRUF3TURhQUF3WlFJeEFPVnBFc2x1MjhZeHVnbEI0WmY0Ky8yYTRuMFN5ZTE4Wk5QTEJTV0xWdG1nCjUxNWRUZ3VEbkZ0MkthQUpKaUZxWWdJd2NkSzFqMXpxTytGNENZV29kWkk3eUZ6OVNPOE5kQ0tvQ09KdXhVbk8KeHd5OHAyRnA4ZmM3NFNyTCtTdnpacEEzCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1TdGFhdCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEczIE89U3RhYXQgZGVyIE5lZGVybGFuZGVuCiMgU3ViamVjdDogQ049U3RhYXQgZGVyIE5lZGVybGFuZGVuIFJvb3QgQ0EgLSBHMyBPPVN0YWF0IGRlciBOZWRlcmxhbmRlbgojIExhYmVsOiAiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJvb3QgQ0EgLSBHMyIKIyBTZXJpYWw6IDEwMDAzMDAxCiMgTUQ1IEZpbmdlcnByaW50OiAwYjo0Njo2NzowNzpkYjoxMDoyZjoxOTo4YzozNTo1MDo2MDpkMTowYjpmNDozNwojIFNIQTEgRmluZ2VycHJpbnQ6IGQ4OmViOjZiOjQxOjUxOjkyOjU5OmUwOmYzOmU3Ojg1OjAwOmMwOjNkOmI2Ojg4Ojk3OmM5OmVlOmZjCiMgU0hBMjU2IEZpbmdlcnByaW50OiAzYzo0ZjpiMDpiOTo1YTpiODpiMzowMDozMjpmNDozMjpiODo2Zjo1Mzo1ZjplMTo3MjpjMTo4NTpkMDpmZDozOTo4Njo1ODozNzpjZjozNjoxODo3ZjphNjpmNDoyOAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmREQ0NBMXlnQXdJQkFnSUVBSmlpT1RBTkJna3Foa2lHOXcwQkFRc0ZBREJhTVFzd0NRWURWUVFHRXdKTwpUREVlTUJ3R0ExVUVDZ3dWVTNSaFlYUWdaR1Z5SUU1bFpHVnliR0Z1WkdWdU1Tc3dLUVlEVlFRRERDSlRkR0ZoCmRDQmtaWElnVG1Wa1pYSnNZVzVrWlc0Z1VtOXZkQ0JEUVNBdElFY3pNQjRYRFRFek1URXhOREV4TWpnME1sb1gKRFRJNE1URXhNekl6TURBd01Gb3dXakVMTUFrR0ExVUVCaE1DVGt3eEhqQWNCZ05WQkFvTUZWTjBZV0YwSUdSbApjaUJPWldSbGNteGhibVJsYmpFck1Da0dBMVVFQXd3aVUzUmhZWFFnWkdWeUlFNWxaR1Z5YkdGdVpHVnVJRkp2CmIzUWdRMEVnTFNCSE16Q0NBaUl3RFFZSktvWklodmNOQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQUw0eW9sUVAKY1Bzc1hGbnJiTVNrVWVpRktyUE1TalR5c0YvekRzY2NQVk1laUFobzJHODlyY0tleklKbkJ5ZUhhSEU2bjNXVwpJa1lGc08ydHgxdWVLdDZjL0RyR2xhZjFGMmNZNXk5SkNBeGN6K2JNTk8xNCsxQ3gzR3N5OEtMK3Rqems3RnFYCnh6OGVjQWd3b056RnMyMXYwSUp5RWF2U2dXaFpnaGUzZUpKZytzemVQNFRyalRnemtBcHlJL28xekNaeE1kRnkKS0pMWld5TnRaclZ0QjBMcnBqUE9rdHZBOW14amVNM0tUajIxNVZLYjhiNDc1bFJnc0dZZUNhc0gvbFNKRVVMUgo5eVM2WUhnYW1QZkpFZjBXd1RVYVZIWHZROVBscms3TzUzdkR4azVoVVV1cm1rVkxvUjlCdlVoVEZYRmtDNGF6CjVTNit6cVFid1NtRW9yWExDQ04yUXlJa0h4Y0UxRzZjeHZ4L0syWWE3SXJsMXM5TjlXTUp0eFU1MW51czYrTjgKNlU3OGRVTEk3VmlWREFaQ29wejM1SEN6MzNKdldqZEFpZGlGcE5meEM5NURHZFJLV0N5TWlqbWV2NFNIOFJZNwpOZ3pwMDdUS2JCbEJVZ21oSGJCcXY0THZjRkVoTXR3RmRvekw5MlRrQTFDdmpKRm5xOFh5N2xqWTNyNzM1ekhQCmJNazdjY0hWaUxWbHZNRG9GeGNIRXJWYzBxc2drN1RtZ29Od05zWE5vNDJ0aSt5andVT0g1a1BpTkw2Vml6WHQKQnpuYXFCMTZuemFlRXJBTVpSS1FGV0RaSmtCRTQxWmdwUkRVYWp6OVFkd09Xa2UyNzVkaGRVL1ovc2V5SGRUdApYVW16cVdyTFpvUVQxVnlnM045dWR3YlJjWFhJVjIrdkQzZGJBZ01CQUFHalFqQkFNQThHQTFVZEV3RUIvd1FGCk1BTUJBZjh3RGdZRFZSMFBBUUgvQkFRREFnRUdNQjBHQTFVZERnUVdCQlJVcmZySGtsZXV5aldjTGhMNzVMcGQKSU55VVZ6QU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FnRUFNSm1kQlRMSVhnNDdtQUU2aXFUbkIvZDYrT2VhMzFCRApVNWNxUGNvOFI1Z3U0UlY3OFpMellkcVFKUlpsd0o5VVhRNERPMXQzQXB5RXRnMllYelRkTzJQQ3d5aUJ3cHdwCkxpbml5TU1COGpQcUtxck1DUWozWldmR3pkL1R0aXVudmN6UkRuQmZ1Q1BSeTVGT0N2VElldVhaWXpiQjFOLzgKSXBmM1lGM3FLUzlZc3IxWXZZMldUeEIxdjBoN1BWR0hvVHgwSXNMOEIzK0EzTVNzL21yQmNEQ3c2WTVwNGl4cApnWlFKdXQzK1RjQ0RqSlJZd0VZZ3I1d2ZBdmcxVlVrdlJ0VEE4S0NXQWc4enhYSHpuaU45bExmOU90TUpnd1loCi9XQTlyakxBMHU2TnB2RG50SUo4Q3N4d3lYbUErUDVNOXpXRUdZb3grd3JaMTMrYjhLS2FhOE1GU3UxQllCUXcKMGFvUlFtN1RJd0lFQzhabDNkMVNkOXFCYTdLbytnRTR1WmJxS214bmw0bVVucnpoVk5Ya2FuanZTcjBybWoxQQpmc2JBZGRKdSsyZ3c3T3lMbmZsSk5ab2FMTm16bFRuVkhwTDNwcmxsTCtVOWJUcElUQWpjNUNnU0tMNTlOVnpxCjRCWitFeHRxMXo3WG52d3RkYkxCRk5VakE5dGJid3MrZUM4TjNqT05GcmRJNTRPYWdROTd3VU5OVlFRWE9FcFIKMVZtaWlYVFRuNzRlUzlmR2JiZUlKRzlna2FTQ2hWdFdRYnpRUkt0cUU3N1JMRmkzRWpOWXNqZGozQlAxbEIwLwpRRkgxVC9VNjdjakY2OEllSFJhVmVzZCtRbkdUYmtzVnR6RGZxdTFYaFVpc0hXcmRPV25rNFhsNHZzNEZ2NkVNCjk0QjdJV2NuTUZrPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049U3RhYXQgZGVyIE5lZGVybGFuZGVuIEVWIFJvb3QgQ0EgTz1TdGFhdCBkZXIgTmVkZXJsYW5kZW4KIyBTdWJqZWN0OiBDTj1TdGFhdCBkZXIgTmVkZXJsYW5kZW4gRVYgUm9vdCBDQSBPPVN0YWF0IGRlciBOZWRlcmxhbmRlbgojIExhYmVsOiAiU3RhYXQgZGVyIE5lZGVybGFuZGVuIEVWIFJvb3QgQ0EiCiMgU2VyaWFsOiAxMDAwMDAxMwojIE1ENSBGaW5nZXJwcmludDogZmM6MDY6YWY6N2I6ZTg6MWE6ZjE6OWE6YjQ6ZTg6ZDI6NzA6MWY6YzA6ZjU6YmEKIyBTSEExIEZpbmdlcnByaW50OiA3NjplMjo3ZTpjMTo0ZjpkYjo4MjpjMTpjMDphNjo3NTpiNTowNTpiZTozZDoyOTpiNDplZDpkYjpiYgojIFNIQTI1NiBGaW5nZXJwcmludDogNGQ6MjQ6OTE6NDE6NGM6ZmU6OTU6Njc6NDY6ZWM6NGM6ZWY6YTY6Y2Y6NmY6NzI6ZTI6OGE6MTM6Mjk6NDM6MmY6OWQ6OGE6OTA6N2E6YzQ6Y2I6NWQ6YWQ6YzE6NWEKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZjRENDQTFpZ0F3SUJBZ0lFQUppV2pUQU5CZ2txaGtpRzl3MEJBUXNGQURCWU1Rc3dDUVlEVlFRR0V3Sk8KVERFZU1Cd0dBMVVFQ2d3VlUzUmhZWFFnWkdWeUlFNWxaR1Z5YkdGdVpHVnVNU2t3SndZRFZRUUREQ0JUZEdGaApkQ0JrWlhJZ1RtVmtaWEpzWVc1a1pXNGdSVllnVW05dmRDQkRRVEFlRncweE1ERXlNRGd4TVRFNU1qbGFGdzB5Ck1qRXlNRGd4TVRFd01qaGFNRmd4Q3pBSkJnTlZCQVlUQWs1TU1SNHdIQVlEVlFRS0RCVlRkR0ZoZENCa1pYSWcKVG1Wa1pYSnNZVzVrWlc0eEtUQW5CZ05WQkFNTUlGTjBZV0YwSUdSbGNpQk9aV1JsY214aGJtUmxiaUJGVmlCUwpiMjkwSUVOQk1JSUNJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBZzhBTUlJQ0NnS0NBZ0VBNDhkK2lma2tTenJTCk00TTFMR25zM0FtazQxR29KU3Q1dUFnOTRKRzZoSVhHaGFUSzVza3VVNlRKSkI3OVZXWnhYU3pGWUdnRXQ5bkMKVWlZNGlLVFdPMENtd3MwL3paaVRzMVFVV0paVjFWRCtocTJrWTM5Y2gvYU81aWVTWnhlU0FnTXMzTlptZE8zZApaLy9CWVkxalR3K2JiUmN3SnUrcjBoOFFvUG5GZnhacGdRTkg3UjVvalhLaFRiSW14cnBzWDIzV3I5R3hFNDZwCnJmTmVhWFVtR0Q1Qkt5Ri83b3RkQndhZFE4UXBDaXY4S2o2R3l6eURPdm5KRGRyRm1lSzhlRUV6ZHVHL0wxM2wKcEpoUURCWGQ0UHFjZnpobzBMS21lcWZSTWIxK2lsZ25RN082TTVIVHA1Z1ZYSnJtMHc5MTJmeEJtSmMrcWlYYgpqNUl1c0hzTVgvRmpxVGY1bTNWcFRDZ21KZHJWOGhKd1JWWGozM05lTi9VaGJKQ09OVnJKMHlQcjA4QytlS3hDCktGaG1wVVp0Y0FMWEVQbExWUHhkaGtxSHozL0tSYXdSV3JVZ1VZMHZpRWVYT2NEUHVzQkNBVUNaU0NFTGE2ZlMKL1piVjBiNUduVW5nQzZhZ0lrNDQwTUU4TUx4d2p5eDF6TkRGakZFN1BaUUlaQ1poZmJuRFpZOFVuQ0hRcXYwWApjZ09Qdlp1TTVsNVRucm1kNzRLNzRiemlja0ZiSVpUVFJUZVUwZDhKT1Yzbkk2cWFIY3B0cUFxR2hZcUN2a0lICjF2STRnblBhaDF2bFBOT2VQcWM3bnZRRHMvbnhmUk4wQXYrN29lWDZBSGtjcG1aQmlGeGdWNll1Q2NTNi9aclAKcHg5QXc3dk1XZ3BWU3pzNGRsRzRZNHVFbEJibVZ2TUNBd0VBQWFOQ01FQXdEd1lEVlIwVEFRSC9CQVV3QXdFQgovekFPQmdOVkhROEJBZjhFQkFNQ0FRWXdIUVlEVlIwT0JCWUVGUDZyQUpDWW5pVDhxY3dhaXZzbnVMOHdicWc3Ck1BMEdDU3FHU0liM0RRRUJDd1VBQTRJQ0FRRFBkeXh1VnI1T3M3YUVBSlNyUjhrTjBuYkhocDhkQjlPMnRMc0kKZUs5cDBndEozalBGckszQ2lBSjlCcmMxQXNGZ3liL0U2SlRlMU5PcEV5VmEvbTZpcm4wRjNIM3piUEIrcG8zdQoyZGZPV0Jmb3FTbXVjMGlINTV2S2JpbWhaRjhaRS9ldUJoRC9VY2FiVFZVbFQ1T1pFQUZUZGZFVHpzZW1RVUhTCnY0aWxmMFg4ckxpbHRUTU1nc1Q3Qi9acTVTV0VYd2JLd1lZNUVkdFl6WGM3TE1KTUQxNmE0L0NyUG1FYlVDVEMKd1BUeEdmQVJLYmFsR0FLYjEyTk1jSXhIb3dORFhMbGRScUFOYi85WmpyN2RuM0xEV3l2ZmpGdk81UXhHYkpLeQpDcU5NVkVJWUZSSVl2ZHI4dW5SdS84RzJvR1RZcVY5VnJwOWNhbmFXMkhObmgvdE5mMXp1YWNwekVQdUtxZjJlCnZUWTRTVW1IOUE0VThPbUh1RCtuVDNwYWpublVrK1M3YUZLRXJHenA4NWh3VlhJeStUU3JLMG0xelNCaTVEcDYKWjJPcmx0eHRycGZzL0o5MlZvZ3VaczlidHNta3NOY0Z1dUVuTDVPN0ppcWlrN0FiODQ2K0hVQ2p1VGFQUG9JYQpHbDZJNmxENFdlS0RSaWtMNDBSYzRaVzJhWkNhRkcrWHJvSFBhTytabXI2MTUrRi8rUG9UUnhaTXpHMElRT2VMCmVHOVFna1JRUDJZR2lxdERoRlpLRHlBdGhnNzEwdHZTZW9wTHphWG9UdkZlSmlVQldTT2dmdEwyZmlGWDF5ZTgKRlZkTXBFYkI0SU1lREV4TkgwOEdHZUw1cVBRNmdxR3llVU41MXExdmVpZVFBNlRxSkljLzJiM1o2ZkpmVUVrYwo3dXpYTGc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049SWRlblRydXN0IENvbW1lcmNpYWwgUm9vdCBDQSAxIE89SWRlblRydXN0CiMgU3ViamVjdDogQ049SWRlblRydXN0IENvbW1lcmNpYWwgUm9vdCBDQSAxIE89SWRlblRydXN0CiMgTGFiZWw6ICJJZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEiCiMgU2VyaWFsOiAxMzI5ODgyMTAzNDk0NjM0MjM5MDUyMDAwMzg3Nzc5NjgzOTQyNgojIE1ENSBGaW5nZXJwcmludDogYjM6M2U6Nzc6NzM6NzU6ZWU6YTA6ZDM6ZTM6N2U6NDk6NjM6NDk6NTk6YmI6YzcKIyBTSEExIEZpbmdlcnByaW50OiBkZjo3MTo3ZTphYTo0YTpkOTo0ZTpjOTo1NTo4NDo5OTo2MDoyZDo0ODpkZTo1ZjpiYzpmMDozYToyNQojIFNIQTI1NiBGaW5nZXJwcmludDogNWQ6NTY6NDk6OWI6ZTQ6ZDI6ZTA6OGI6Y2Y6Y2E6ZDA6OGE6M2U6Mzg6NzI6M2Q6NTA6NTA6M2I6ZGU6NzA6Njk6NDg6ZTQ6MmY6NTU6NjA6MzA6MTk6ZTU6Mjg6YWUKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZZRENDQTBpZ0F3SUJBZ0lRQ2dGQ2dBQUFBVVVqeUVTMUFBQUFBakFOQmdrcWhraUc5dzBCQVFzRkFEQksKTVFzd0NRWURWUVFHRXdKVlV6RVNNQkFHQTFVRUNoTUpTV1JsYmxSeWRYTjBNU2N3SlFZRFZRUURFeDVKWkdWdQpWSEoxYzNRZ1EyOXRiV1Z5WTJsaGJDQlNiMjkwSUVOQklERXdIaGNOTVRRd01URTJNVGd4TWpJeldoY05NelF3Ck1URTJNVGd4TWpJeldqQktNUXN3Q1FZRFZRUUdFd0pWVXpFU01CQUdBMVVFQ2hNSlNXUmxibFJ5ZFhOME1TY3cKSlFZRFZRUURFeDVKWkdWdVZISjFjM1FnUTI5dGJXVnlZMmxoYkNCU2IyOTBJRU5CSURFd2dnSWlNQTBHQ1NxRwpTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFDblVCbmVQNWs5MURORzhXOVJZWUt5cVUrUFo0bGRoTmxUCjNRd28yZGZ3LzY2VlEzS1orYlZkZklyQlF1RXhVSFRSZ1ExOHpac2hxMFBpcksxZWhtN3pDWW9mV2pLOW91dVUKK2VoY0N1ei9tTkt2Y2JPMFU1OU9oKytTdkwzc1R6SXdpRXNYWGxmRVU4TDJBcGVOMldJcnZ5UWZZbzNmdzdncApTMGw0UEpOZ2lDTDhtZG8yeU1LaTFDeFVBR2MxYm5PL0FsandwTjNsc0tJbWVzcmdOcVVaRnZYOXQrK3VQMEQxCmJWb0UvYzQweWlUY2RDTWJYVE1URWwzRUFTWDJNTjBDWFovZzFVZTl0T3Nib2J0SlNkaWZXd0x6aXVRa2tPUmkKVDAvQnI0c09kQmVvMFhLSWFub0JTY3kwUm5uR0Y3SGFtQjRIV2ZwMUlZVmwzWkJXenZ1cnBXQ2R4SjM1VXJDTAp2WWY1anlzakNpTjJPL2N6NGNrQTgybjVTNkxnVHJ4K2t6bUVCL2RFY0g3K0IxcmxzYXpSR016eU5lVkpTUWpLClZzazkrdzhZZllzN3dSUENUWS9KVHc0MzZSK2hEbXJmWWk3TE5RWlJlU3pJSlRqMCtrdW5pVnljMHVNTk9ZWksKZEh6VldZZkNQMDRNWEZMMFBmZFNndkhxbzZ6OVNUUWFLUE5CaURvVDd1amUvNWtkWDdyTDZCN3l1VkJnd0RIVApjK1h2dnFEdE13dDB2aUFneEdkczhBZ0RlbFdBZjBaT2xxZjBIajdoOXRnSjRUTmtLMlBYTWw2ZitjQjdEM2h2Cmw3eVRtdm1jRXBCNGVvQ0hGZGR5ZEp4VmRIaXh1dUZ1Y0FTNlQ2QzZhTU43L3pId2N6MDlsQ3F4QzBFT29QNU4KaUdWcmVUTzAxd0lEQVFBQm8wSXdRREFPQmdOVkhROEJBZjhFQkFNQ0FRWXdEd1lEVlIwVEFRSC9CQVV3QXdFQgovekFkQmdOVkhRNEVGZ1FVN1VRWndOUHdCb3Z1cEh1K1F1Y21WTWlPTm5Zd0RRWUpLb1pJaHZjTkFRRUxCUUFECmdnSUJBQTJ1a0RMMnBrdDhSSFlaWVI0bktNMWVWTzhsdk9NSWtQa3AxNjVvQ09HVUFGanZMaTUrVTFLTXRsd0gKNm9pNm1ZdFFsTmVDZ045aENRQ1RyUTBVNXM3QjhqZVVlTEJmbkxPaWM3aVBCWk00elkwK3NMajd3TSt4OHV3dApMUnZNN0txYXM2cGdnaHN0TzhPRVBWZUtsaDZjZGJqVE1NMWdDSU9RMDQ1VThVMW13RjEwQTBDajdvVit3aDkzCm5BYm93YWNZWFZLVjdjbmRKWjV0K3FudG96bzAwRmw3MnUxUTh6Vy83ZXNVVFRISFlQVGE4WWVjNGtqaXhzVTMKK3dZUStuVlpaakZIS2RwMm1oenBncTd2bXJsUjk0Z2ptbW1WWWp6bFZZQTIxMVFDLy9HNVhjN1VJMi9ZUllSSwpXMlh2aVF6ZEZLY2d5eGlsSmJRTitRSHdvdEwwQU1oMGpxRXFTSTVsMnhQRTRpVVhmZXUraDFzWElGUlJrMHBUCkF3dnNYY296N1dMOVJjY3ZXOXhZb0lBNTV2clgvaE1VcHUwOWxFcENkTlREZDFsenpZOUd2bFU0Ny9yb2tUTHEKbDFnRUl0NDR3OHk4YmNrek9tb0thVCtneU9weWo0eGpoaU85YlR5V25wWGdTVXlxb3JrcUc1dzJnWGp0dytoRwo0aVpaUkhVZTJYV0pVYzBRaEoxaFlNdGQrWmNpVFk2WTV1Ti85bHU3cnMzS1NvRnJYZ3Z6VWVGMEsrbCtKNmZaCm1VbE8rS1dBMnlVUEhHTmlpc2t6WjJzOEVJUEdyZDZvelJhT2pmQUhOM0dmOHF2OFFmWEJpK3dBTjEwSjVVNkEKNy9xeFhEZ0dwUnRLNGR3NExUemNxeCtRR3RWS25PN1JjR3pNN3ZSWCtCaTZoRzZICi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1JZGVuVHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEgTz1JZGVuVHJ1c3QKIyBTdWJqZWN0OiBDTj1JZGVuVHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEgTz1JZGVuVHJ1c3QKIyBMYWJlbDogIklkZW5UcnVzdCBQdWJsaWMgU2VjdG9yIFJvb3QgQ0EgMSIKIyBTZXJpYWw6IDEzMjk4ODIxMDM0OTQ2MzQyMzkwNTIxOTc2MTU2ODQzOTMzNjk4CiMgTUQ1IEZpbmdlcnByaW50OiAzNzowNjphNTpiMDpmYzo4OTo5ZDpiYTpmNDo2Yjo4YzoxYTo2NDpjZDpkNTpiYQojIFNIQTEgRmluZ2VycHJpbnQ6IGJhOjI5OjQxOjYwOjc3Ojk4OjNmOmY0OmYzOmVmOmYyOjMxOjA1OjNiOjJlOmVhOjZkOjRkOjQ1OmZkCiMgU0hBMjU2IEZpbmdlcnByaW50OiAzMDpkMDo4OTo1YTo5YTo0NDo4YToyNjoyMDo5MTo2Mzo1NToyMjpkMTpmNToyMDoxMDpiNTo4Njo3YTpjYTplMToyYzo3ODplZjo5NTo4ZjpkNDpmNDozODo5ZjoyZgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRlpqQ0NBMDZnQXdJQkFnSVFDZ0ZDZ0FBQUFVVWp6MFo4QUFBQUFqQU5CZ2txaGtpRzl3MEJBUXNGQURCTgpNUXN3Q1FZRFZRUUdFd0pWVXpFU01CQUdBMVVFQ2hNSlNXUmxibFJ5ZFhOME1Tb3dLQVlEVlFRREV5RkpaR1Z1ClZISjFjM1FnVUhWaWJHbGpJRk5sWTNSdmNpQlNiMjkwSUVOQklERXdIaGNOTVRRd01URTJNVGMxTXpNeVdoY04KTXpRd01URTJNVGMxTXpNeVdqQk5NUXN3Q1FZRFZRUUdFd0pWVXpFU01CQUdBMVVFQ2hNSlNXUmxibFJ5ZFhOMApNU293S0FZRFZRUURFeUZKWkdWdVZISjFjM1FnVUhWaWJHbGpJRk5sWTNSdmNpQlNiMjkwSUVOQklERXdnZ0lpCk1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQzJJcFQ4cEVpdjZFZHJDdnNuZHVUeVA0bzcKZWtvc01TcU1qYkNwd3pGcnFIZDJoQ2EycklGQ0RRanJWVmk3ZXZpOFpYM3lvRzJMcUVmcFluWWVFZTRJRk5HeQpSQmIwNnRENkhpOWUyOHR6UWE2OEFMQktLMEN5ck9FN1M4SXRuZVNobSt3YU9oN3dDTFBRNUNRMUI1K2N0TWxTCmJkc0h5bysxVy9DRDgwL0hMYVhJcmN1VklLUXhLRmRZV3VTTkc1cXJuZzBNOGdvek9TSTVDcGN1ODFOM3VVUkYKL1lUTE5pQ0JXUzJhYjIxSVNHSEtUTjlUMGE5U3ZFU2ZxeTlyZzNMdmRZRGFCak1iWGNqYVk4Wk56YXhtTWMzUgozajZIRURiaHVhUjY3MkJRc3N2S3BsYmdONityTkJNNUplZzVadVNZZXFvU21KeFpab1krcmZHd3lqNEdEM3Z3CkVVczNvRVJ0ZTh1b2pISDAxYldSTnN6d0ZjWXIzbEVYc1pkTVVEMnhsVmw4QlgwdElkVUF2d0Zub2w1N3BsenkKOXlMeGtBMlQyNnBFVVdiTWZYWUQ2MnFvS2pnWmwzWU5hNHBoK2J6MjduYjljQ3ZkS1R6NENoNWJRaHlMVmk5VgpHeHloTHJYSEZ1YjRxanlTam1tMkFjRzFocDJKRHdzNGxGVG82dHllUFNXOFV5YnQxYXM1cXNWQVRGU3JzclRaCjJmalhjdHNjdkcyOVpWL3ZpRFVxWmkvdTlyTmw4RE9OZkpoQmFVWVBReHhwK3B1MTBHRnF6Y3BMMlV5UVJxc1YKV2FGSFZDa3VneWhmSE1LaXEzSVhBQWFPUmV5TDRqTTlmOW9aUk9SaWNzUGZJc2J5VnRUZFg1Vnk3VzFmOTBnRApXLzNGS3FEMmN5T0VFQnNCNXdJREFRQUJvMEl3UURBT0JnTlZIUThCQWY4RUJBTUNBUVl3RHdZRFZSMFRBUUgvCkJBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVTQzSGdudGluUXRuYmNaRnJsSlBydzZQUkZLTXdEUVlKS29aSWh2Y04KQVFFTEJRQURnZ0lCQUVmNjNRcXdFWkU0clUxZDkrVU9sMVFaZ2tpSFZJeXFaSm5ZV3Y2SUFjVllwWm14STFRagp0Mm9kSUZmbEFXSkJGOU1KMjNYTGJsU1FkZjRhbjRFS3d0M1g5d25RVzNJVjVCNEphajB6OHlHYTVoVityVkhWCkRSRHRmVUxBais3QW1nalZRZFpjRGlGcGJvQmhEaFhBdU0vRlNSSlN6TDQ2ek5RdU9BWGVOZjBmYjdpQWFKZzkKVGFES1FHWFNjM3oxaTlrS2xUL1lQeU50R3RFcUpCblpoYk1YNzNodXFWalJJOVBIRSsxeUpYOWRzWE53MEg4Rwpsd21FS1lCaEhmcGUvM09zb09PSnVCeHhGY2JlTVg4UzNPRnRtNi9uNko5MWVFeXJSanVhenI4RkdGMU5GVHdXCm1obFFCSnF5bW05bGkxSmZQRmdFS0NYQVptRXhmcm5nZGJrYXFJSFdjaGV6eFFNeE5SRjRlS0xnNlRDTWY0RGYKV044OHVpZVc0b0EwYmVPWTAyUW5yRWgrS0hkY3hpVmhKZmlGREdYNnhESXZwWmdGNVBnTFp4WVd4b0s0TWhuNQorYmw1M0IvTjY2K3JEdDBiMjBYa2V1Y0M0cFZkL0dud1UybGhsWFY1QzE1VjVqZ2NsS2xaTTU3SWNYUjVmMUdKCnRzaHF1RERJYWpqRGJwN2hOeGJxQldKTVd4Skg3YWUwczFoV3gwbnpmeEpvQ1RGeDhHMzRUa2Y3MW9YdXhWaEEKR2FRZHAvbExRemZjYUZwUHordkNaSFRldEJYWjlGUlVHaThjMTVkeFZKQ08yU0NkVXl0L3E0L2k2akM4VURmdgo4VWUxZlh3c0JPeG9uYlJKUkJEMGNrc2NaT2Y4NW11UTNXbDlhZjBBVnFXM3JMYXR0OG8rQWUrYwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIgTz1FbnRydXN0LCBJbmMuIE9VPVNlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMvKGMpIDIwMDkgRW50cnVzdCwgSW5jLiAtIGZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgU3ViamVjdDogQ049RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIgTz1FbnRydXN0LCBJbmMuIE9VPVNlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMvKGMpIDIwMDkgRW50cnVzdCwgSW5jLiAtIGZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgTGFiZWw6ICJFbnRydXN0IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMiIKIyBTZXJpYWw6IDEyNDY5ODkzNTIKIyBNRDUgRmluZ2VycHJpbnQ6IDRiOmUyOmM5OjkxOjk2OjY1OjBjOmY0OjBlOjVhOjkzOjkyOmEwOjBhOmZlOmIyCiMgU0hBMSBGaW5nZXJwcmludDogOGM6ZjQ6Mjc6ZmQ6Nzk6MGM6M2E6ZDE6NjY6MDY6OGQ6ZTg6MWU6NTc6ZWY6YmI6OTM6MjI6NzI6ZDQKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDQzOmRmOjU3Ojc0OmIwOjNlOjdmOmVmOjVmOmU0OjBkOjkzOjFhOjdiOmVkOmYxOmJiOjJlOjZiOjQyOjczOjhjOjRlOjZkOjM4OjQxOjEwOjNkOjNhOmE3OmYzOjM5Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFUGpDQ0F5YWdBd0lCQWdJRVNsT01LREFOQmdrcWhraUc5dzBCQVFzRkFEQ0J2akVMTUFrR0ExVUVCaE1DClZWTXhGakFVQmdOVkJBb1REVVZ1ZEhKMWMzUXNJRWx1WXk0eEtEQW1CZ05WQkFzVEgxTmxaU0IzZDNjdVpXNTAKY25WemRDNXVaWFF2YkdWbllXd3RkR1Z5YlhNeE9UQTNCZ05WQkFzVE1DaGpLU0F5TURBNUlFVnVkSEoxYzNRcwpJRWx1WXk0Z0xTQm1iM0lnWVhWMGFHOXlhWHBsWkNCMWMyVWdiMjVzZVRFeU1EQUdBMVVFQXhNcFJXNTBjblZ6CmRDQlNiMjkwSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVJQzBnUnpJd0hoY05NRGt3TnpBM01UY3kKTlRVMFdoY05NekF4TWpBM01UYzFOVFUwV2pDQnZqRUxNQWtHQTFVRUJoTUNWVk14RmpBVUJnTlZCQW9URFVWdQpkSEoxYzNRc0lFbHVZeTR4S0RBbUJnTlZCQXNUSDFObFpTQjNkM2N1Wlc1MGNuVnpkQzV1WlhRdmJHVm5ZV3d0CmRHVnliWE14T1RBM0JnTlZCQXNUTUNoaktTQXlNREE1SUVWdWRISjFjM1FzSUVsdVl5NGdMU0JtYjNJZ1lYVjAKYUc5eWFYcGxaQ0IxYzJVZ2IyNXNlVEV5TURBR0ExVUVBeE1wUlc1MGNuVnpkQ0JTYjI5MElFTmxjblJwWm1sagpZWFJwYjI0Z1FYVjBhRzl5YVhSNUlDMGdSekl3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLCkFvSUJBUUM2aExaeTI1NE1hK0taNlRBQnAzYnFNcmlWUVJySjJtRk9XSExQL3ZhQ2ViOXpZUVlLcFNmWXMxL1QKUlU0Y2N0Wk9Ndkp5aWcvM2d4blFhb0NBQUVVZXNNZm5tcjhTVnljY28yZ3ZDb2U5YW1zT1htWHpISGZWMUlXTgpjQ0cwc3pMbmk2TFZoamtDc2JqU1I4N2t5VW5FTzZmZSsxUjlWNzd3Nkc3Q2ViSTZDMVhpVUpnV01oTmNMM2hXCndjS1VzL0phNUNlYW55VFh4dXpRbXlXQzQ4ekN4RVhGakpkNkJtc3FFWitwQ201SU8yL2IxQkVaUXZlUEI3LzEKVTErY1B2UVhMT1pwckU0eVRHSjM2cmZvNWJzMHZCbUxycHhSNTdkK3RWT3hNeUxsYmM5d1BCcjY0cHRudG9QMApqYVd2WWt4TjRGaXNaRFFTQS9pMmpaUmpKS1J4QWdNQkFBR2pRakJBTUE0R0ExVWREd0VCL3dRRUF3SUJCakFQCkJnTlZIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJScWNpWjYwQjd2ZmVjN2FWSFViSTJma0JKbXF6QU4KQmdrcWhraUc5dzBCQVFzRkFBT0NBUUVBZVo4ZGxzYTJlVDhpallmVGh3TUVZR3BybWk1WmlYTVJyRVBSOVJQLwpqVGtyd1BLOVQzQ01xUy9xRjhRTFZKN1VHNWFZTXp5b3JXS2lBSGFyV1dsdUJoMSt4TGxFalppdkV0Umgyd29aClJrZno2L2Rqd1VBRlFLWFN0L1MxbWphL3FZaDJpQVJWQkN1Y2gzOGFOengrTGFVYTJOU0pYc3E5ckQxczJHMnYKMWZOMkQ4MDdpRGdpbld5VG1zUTl2NEliWlQrbUQxMnEvT1d5RmNxMXJjYThQZENFNk9vR2NyQk5PVEo0dno0UgpuQXVrblpvaDgvQ2JDekI0MjhIY2gwUCt2R09heXNYQ0hNbkhqZjg3RWxnSTVyWTk3SG9zVHZ1RGxzNE1QR21IClZIT2tjOEtULzFFUXJCVlVBZGo4QmJHSm9YOTBnNXBKMTl4T2U0cEliNHRGOWc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxIE89RW50cnVzdCwgSW5jLiBPVT1TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2FsLXRlcm1zLyhjKSAyMDEyIEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIFN1YmplY3Q6IENOPUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMSBPPUVudHJ1c3QsIEluYy4gT1U9U2VlIHd3dy5lbnRydXN0Lm5ldC9sZWdhbC10ZXJtcy8oYykgMjAxMiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBMYWJlbDogIkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMSIKIyBTZXJpYWw6IDUxNTQzMTI0NDgxOTMwNjQ5MTE0MTE2MTMzMzY5CiMgTUQ1IEZpbmdlcnByaW50OiBiNjo3ZToxZDpmMDo1ODpjNTo0OTo2YzoyNDozYjozZDplZDo5ODoxODplZDpiYwojIFNIQTEgRmluZ2VycHJpbnQ6IDIwOmQ4OjA2OjQwOmRmOjliOjI1OmY1OjEyOjI1OjNhOjExOmVhOmY3OjU5OjhhOmViOjE0OmI1OjQ3CiMgU0hBMjU2IEZpbmdlcnByaW50OiAwMjplZDowZTpiMjo4YzoxNDpkYTo0NToxNjo1Yzo1Njo2Nzo5MTo3MDowZDo2NDo1MTpkNzpmYjo1NjpmMDpiMjphYjoxZDozYjo4ZTpiMDo3MDplNTo2ZTpkZjpmNQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQytUQ0NBb0NnQXdJQkFnSU5BS2FMZVNrQUFBQUFVTkNSK1RBS0JnZ3Foa2pPUFFRREF6Q0J2ekVMTUFrRwpBMVVFQmhNQ1ZWTXhGakFVQmdOVkJBb1REVVZ1ZEhKMWMzUXNJRWx1WXk0eEtEQW1CZ05WQkFzVEgxTmxaU0IzCmQzY3VaVzUwY25WemRDNXVaWFF2YkdWbllXd3RkR1Z5YlhNeE9UQTNCZ05WQkFzVE1DaGpLU0F5TURFeUlFVnUKZEhKMWMzUXNJRWx1WXk0Z0xTQm1iM0lnWVhWMGFHOXlhWHBsWkNCMWMyVWdiMjVzZVRFek1ERUdBMVVFQXhNcQpSVzUwY25WemRDQlNiMjkwSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVJQzBnUlVNeE1CNFhEVEV5Ck1USXhPREUxTWpVek5sb1hEVE0zTVRJeE9ERTFOVFV6Tmxvd2diOHhDekFKQmdOVkJBWVRBbFZUTVJZd0ZBWUQKVlFRS0V3MUZiblJ5ZFhOMExDQkpibU11TVNnd0pnWURWUVFMRXg5VFpXVWdkM2QzTG1WdWRISjFjM1F1Ym1WMApMMnhsWjJGc0xYUmxjbTF6TVRrd053WURWUVFMRXpBb1l5a2dNakF4TWlCRmJuUnlkWE4wTENCSmJtTXVJQzBnClptOXlJR0YxZEdodmNtbDZaV1FnZFhObElHOXViSGt4TXpBeEJnTlZCQU1US2tWdWRISjFjM1FnVW05dmRDQkQKWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVTQXRJRVZETVRCMk1CQUdCeXFHU000OUFnRUdCU3VCQkFBaQpBMklBQklRVHlkQzZiVUY3NG16UTYxVmZaZ0lhSlBSYmlXbEg0N2pDZmZIeUFzV2ZvUFpiMVlzR0dZWlBVeEJ0CkJ5UW5vYUQ0MVVjWllVeDl5cE1uNm5RTTcyK1dDZjVqN0hCZE5xMW5kNjdKblh4VlJEcWlZMUVmOWVOaTFLbEgKQno3TUlLTkNNRUF3RGdZRFZSMFBBUUgvQkFRREFnRUdNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdIUVlEVlIwTwpCQllFRkxkajV4cmRqZWtJcGxXRHBPQnFVRUZsRVVKSk1Bb0dDQ3FHU000OUJBTURBMmNBTUdRQ01HRjUyT1ZDClI5OGNybE9aRjdadkhIM2h2eEdVMFFPSWRlU05pYVNLZDBiZWJXSHZBdlg3dGQvTS9rNy8vcW5tcHdJd1c1blgKaFRjR3RYc0kvZXNuaTBxVStlSDZwNDRtQ09oOGttaHRjOWh2SnF3aEFyaVp0eVpCV3lWZ3J0QklHdTRHCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1DRkNBIEVWIFJPT1QgTz1DaGluYSBGaW5hbmNpYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKIyBTdWJqZWN0OiBDTj1DRkNBIEVWIFJPT1QgTz1DaGluYSBGaW5hbmNpYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKIyBMYWJlbDogIkNGQ0EgRVYgUk9PVCIKIyBTZXJpYWw6IDQwNzU1NTI4NgojIE1ENSBGaW5nZXJwcmludDogNzQ6ZTE6YjY6ZWQ6MjY6N2E6N2E6NDQ6MzA6MzM6OTQ6YWI6N2I6Mjc6ODE6MzAKIyBTSEExIEZpbmdlcnByaW50OiBlMjpiODoyOTo0Yjo1NTo4NDphYjo2Yjo1ODpjMjo5MDo0Njo2YzphYzozZjpiODozOTo4Zjo4NDo4MwojIFNIQTI1NiBGaW5nZXJwcmludDogNWM6YzM6ZDc6OGU6NGU6MWQ6NWU6NDU6NTQ6N2E6MDQ6ZTY6ODc6M2U6NjQ6Zjk6MGM6Zjk6NTM6NmQ6MWM6Y2M6MmU6Zjg6MDA6ZjM6NTU6YzQ6YzU6ZmQ6NzA6ZmQKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZqVENDQTNXZ0F3SUJBZ0lFR0VyTTFqQU5CZ2txaGtpRzl3MEJBUXNGQURCV01Rc3dDUVlEVlFRR0V3SkQKVGpFd01DNEdBMVVFQ2d3blEyaHBibUVnUm1sdVlXNWphV0ZzSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eQphWFI1TVJVd0V3WURWUVFEREF4RFJrTkJJRVZXSUZKUFQxUXdIaGNOTVRJd09EQTRNRE13TnpBeFdoY05Namt4Ck1qTXhNRE13TnpBeFdqQldNUXN3Q1FZRFZRUUdFd0pEVGpFd01DNEdBMVVFQ2d3blEyaHBibUVnUm1sdVlXNWoKYVdGc0lFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1TVJVd0V3WURWUVFEREF4RFJrTkJJRVZXSUZKUApUMVF3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRRFhYV3ZORUQ4ZkJWblZCVTAzCnNRN3NtQ3VPRlIzNmswc1hnaUZ4RUZMWFVXUndGc0pWYVUyT0ZXMmZ2d3did3VDalo5WU1yTThpcnE5M1ZDcEwKVElwVFVuckQ3aTdlczNFbHdlbGRQZTZoTDZQM0tqekpJeDFxcXgyaHAvSHo3S0RWUk04VnozSXZIV09YNkpuNQovWk9rVklCTVV0UlNxeTVKMzVETnVGKytQOTZoeWswZzFDWG9oQ2xUdDdHSUgvLzYycENmQ3FrdFFUK3g4UmdwCjdoWlpMRFJKR3FnRzE2aUkwZ055ZWpMaTZtaE5iaXlXWlh2S1dmcnk0dDN1TUN6N3pFYXN4R1ByYjM4Mkt6UnoKRXBSLzM4d21udkZ5WFZCbFdZOXBzNGRlTW0vREdJcTFsWSt3ZWpmZVdrVTd4emJoNzJmUk9kT1hXM05pR1VndApoeHdHKzNTWUlFbHo4QVhTRzdHZ283Y2JjTk9JYWJsYTFqajBZdHdsaTNpLytPaCt1RnpKbFU5ZnB5MjVJR3ZQCmE5MzFEZlNDdC9TeVppNFFLUGFYV251V0ZvOEJHUzFzYm44NVdBWmtnd0dEZzhOTmt0MHl4b2VrTitrV3pxb3QKYUs4S2dXVTZjTUdiclUxdFZNb3FMVXVGRzdPQTVuQkZEV3RlTmZCL083aWM1QVJ3aVJJbGs5b0ttU0pnYW1OZwpUbllHbUU2OWc2MGRXSW9saGRMSFpSNHRqc2JmdHNiaGY0b0VJUlVwZFBBK25KQ2REQzd4aWo1YXFnd0pIc2ZWClBLUHRsOE1lTlBvNCtRZ080OEJkSzRQUlZtckp0cWhVVXk1NE1tYzlnbjkwMFB2aHRnVmd1WERiamd2NUUxaHYKY1dBUVVoQzV3VUVKNzNJZlp6RjQvNVlGalFJREFRQUJvMk13WVRBZkJnTlZIU01FR0RBV2dCVGovaTM5S05BTAp0YnEyb3NTL0Jxb0ZqSlA3THpBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUE0R0ExVWREd0VCL3dRRUF3SUJCakFkCkJnTlZIUTRFRmdRVTQvNHQvU2pRQzdXNnRxTEV2d2FxQll5VCt5OHdEUVlKS29aSWh2Y05BUUVMQlFBRGdnSUIKQUNYR3VtdnJoOHZlZ2ptV1BmQkVwMnVFY3dQZW5TdFB1aUIvdkhpeXo1ZXdHNXp6MTNrdTlVaTIwdnNYaU9iVAplai90VXhQUTRpOXFlY3NBSXlqbUhqZFhOWW1Fd25aUE5EYXRaOFBPUVFhSXhmZnUyQnE0MWd0L1VQK1RxaGRMCmpPenRVbUN5cEFicVR1djBheG45Ni9VYTRDVXFtdHpIUVRiM3lIUUZoRG1WT2RZTE82UW4rZ2pZWEI3NEJHQlMKRVNnb0EvL3ZVMllBcFVvMEZtWjgvUW1rcnA1bkdtOUJDMnNHRTV1UGhuRUZ0QytOaVdZektYWlVtaEg0Si9xeQpQNUhnemcwYjh6QWFyYjhpWFJ2VHZ5VUZUZUdTR24rWm56eEVrOHJVUUVsc2dJZlhCRHJETWxJMURsYjRwZDE5CnhJc05FUjlUeXg2eUY3Wm9kMXJnMU12SUI2NzFPaTZPTjdmUUFVdERLWGVNT1plUGdscjRVZVdKb0JqbmFIOWQKQ2k3N28wY09QYVlqZXNZQng0L0lYcjl0Z0ZhK2lpUzZNK3FmNFRJUm52SFNUNEQyRzBDdk9KNFJVSGx6RWhMTgo1bXlkTEloeVBEQ0JCcEVpNmxtdDJoa3VJc0tOdVl5SDRHYThjeU5mSVdSamdFajFvRHdZUFpUSVNFRWRRTHBlCi92NVdPYUhJejE2ZUdXUkdFTm9Ya2JjRmdLeUxtWko5NTZMWUJ3czJKK2RJZVdDS3c5Y1RYUGh5UU45S3k4K1oKQUFvQUN4R1YybFpGQTRnS24yZlExWG14cUkxQWJRM0Nla0Q2ODE5a1I1TExVN203V2M1UC9kQVZVd0hZMyt2Wgo1bmJ2MENPN082bDVzOVVDS2MySm81WVBTalhuVGtMQWRjMEh6K1lzNjNzdQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049VFx4ZGNSS1RSVVNUIEVsZWt0cm9uaWsgU2VydGlmaWthIEhpem1ldCBTYVx1MDExZmxheVx1MDEzMWNcdTAxMzFzXHUwMTMxIEg1IE89VFx4ZGNSS1RSVVNUIEJpbGdpIFx1MDEzMGxldGlcdTAxNWZpbSB2ZSBCaWxpXHUwMTVmaW0gR1x4ZmN2ZW5saVx1MDExZmkgSGl6bWV0bGVyaSBBLlx1MDE1ZS4KIyBTdWJqZWN0OiBDTj1UXHhkY1JLVFJVU1QgRWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhXHUwMTFmbGF5XHUwMTMxY1x1MDEzMXNcdTAxMzEgSDUgTz1UXHhkY1JLVFJVU1QgQmlsZ2kgXHUwMTMwbGV0aVx1MDE1ZmltIHZlIEJpbGlcdTAxNWZpbSBHXHhmY3ZlbmxpXHUwMTFmaSBIaXptZXRsZXJpIEEuXHUwMTVlLgojIExhYmVsOiAiVFx4ZGNSS1RSVVNUIEVsZWt0cm9uaWsgU2VydGlmaWthIEhpem1ldCBTYVx1MDExZmxheVx1MDEzMWNcdTAxMzFzXHUwMTMxIEg1IgojIFNlcmlhbDogMTU2MjMzNjk5MTcyNDgxCiMgTUQ1IEZpbmdlcnByaW50OiBkYTo3MDo4ZTpmMDoyMjpkZjo5MzoyNjpmNjo1Zjo5ZjpkMzoxNTowNjo1Mjo0ZQojIFNIQTEgRmluZ2VycHJpbnQ6IGM0OjE4OmY2OjRkOjQ2OmQxOmRmOjAwOjNkOjI3OjMwOjEzOjcyOjQzOmE5OjEyOjExOmM2Ojc1OmZiCiMgU0hBMjU2IEZpbmdlcnByaW50OiA0OTozNToxYjo5MDozNDo0NDpjMTo4NTpjYzpkYzo1Yzo2OTozZDoyNDpkODo1NTo1YzpiMjowODpkNjphODoxNDoxMzowNzo2OTo5Zjo0YTpmMDo2MzoxOTo5ZDo3OAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRUp6Q0NBdytnQXdJQkFnSUhBSTRYL2lRZ2dUQU5CZ2txaGtpRzl3MEJBUXNGQURDQnNURUxNQWtHQTFVRQpCaE1DVkZJeER6QU5CZ05WQkFjTUJrRnVhMkZ5WVRGTk1Fc0dBMVVFQ2d4RVZNT2NVa3RVVWxWVFZDQkNhV3huCmFTREVzR3hsZEduRm4ybHRJSFpsSUVKcGJHbkZuMmx0SUVmRHZIWmxibXhweEo5cElFaHBlbTFsZEd4bGNta2cKUVM3Rm5pNHhRakJBQmdOVkJBTU1PVlREbkZKTFZGSlZVMVFnUld4bGEzUnliMjVwYXlCVFpYSjBhV1pwYTJFZwpTR2w2YldWMElGTmh4SjlzWVhuRXNXUEVzWFBFc1NCSU5UQWVGdzB4TXpBME16QXdPREEzTURGYUZ3MHlNekEwCk1qZ3dPREEzTURGYU1JR3hNUXN3Q1FZRFZRUUdFd0pVVWpFUE1BMEdBMVVFQnd3R1FXNXJZWEpoTVUwd1N3WUQKVlFRS0RFUlV3NXhTUzFSU1ZWTlVJRUpwYkdkcElNU3diR1YwYWNXZmFXMGdkbVVnUW1sc2FjV2ZhVzBnUjhPOApkbVZ1YkduRW4ya2dTR2w2YldWMGJHVnlhU0JCTHNXZUxqRkNNRUFHQTFVRUF3dzVWTU9jVWt0VVVsVlRWQ0JGCmJHVnJkSEp2Ym1scklGTmxjblJwWm1scllTQklhWHB0WlhRZ1UySEVuMnhoZWNTeFk4U3hjOFN4SUVnMU1JSUIKSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXBDVVo0V1dlNjBnaFVFb0k1Ukh3V3JvbQovNE5aemtRcUwvN2h6bUFEL0kwRHBlMy9hNmk2ekRRR24xazE5dXdzdTUzN2pWSnA0NXduRUZQenBBTEZwL2tSCkdtbDFic01kaTlHWWpaT0hwM0dYRFNISG1mbFMweXhqWFZXODZCOEJTTGxnL2tKSzlzaUFyczFtZXA1RmltaDMKNGtob242TGE4ZUhCRUovclBDbUJwK0V5Q05TZ0JiR00rNDJXQUE0K0pkOVRoaUk3L1BTOTh3bCtkK3lHNnc4ego1VU5QOUZSMWJTbVpMbVphUTkvTFhNckk1VGp4ZmpzMW5RLzB4VnFoelBNZ2dDVFRWK3dWdW5VbG0raGtTN00wCmhPOEV1UGJKYktvQ1ByWlY0akkzWC94bWwxL04xcDdISUw5Tnhxdy9kVjhjN1RLY2ZHa0FhWkhqSXhoVDZRSUQKQVFBQm8wSXdRREFkQmdOVkhRNEVGZ1FVVnBrSEh0T3NER2xrdEF4UVI5NURMTDRnd1Bzd0RnWURWUjBQQVFILwpCQVFEQWdFR01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFKNUZkbnNYClNETHlPSXNwdmU2V1NrNkJHTEZSUnlETjBHU3hEc25aQWRrSnpzaVozR2dsRTlSYzhxUG9CUDV5Q2NjTHFoMGwKVlg2V21sZTN1c1VSZWhubXAzNDloUTcxK1M0cEwrZjViRmdXVjFBbDlqNHVQcXJ0ZDNHcXFwbVdSZ3F1anV3cQpVUmF3WHMzcVp3UWNXREQxWUlxOXByMU41WmEwL0VLSkFXdjJjTWhRT1F3dDFXYlp5Tkt6TXJjYkdXM0xNL25mCnBlWVZoRGZ3d3ZKbGxwS1FkL0N0OUpEcEVYalhrNG5BUFF1NktmVG9tWjF5anUyZEwrNlNmYUh4LzEyNk0yQ0YKWXY0SEFxR0VWa2ErbGdxYUU5Y2hUTGQ4QjU5T1RqK1JkUHNublJITTNlYXh5bkZORXhjNUpzVXBJU3VUS1dxVworcXRCNFV1Mk5RdkFteFU9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1DZXJ0aW5vbWlzIC0gUm9vdCBDQSBPPUNlcnRpbm9taXMgT1U9MDAwMiA0MzM5OTg5MDMKIyBTdWJqZWN0OiBDTj1DZXJ0aW5vbWlzIC0gUm9vdCBDQSBPPUNlcnRpbm9taXMgT1U9MDAwMiA0MzM5OTg5MDMKIyBMYWJlbDogIkNlcnRpbm9taXMgLSBSb290IENBIgojIFNlcmlhbDogMQojIE1ENSBGaW5nZXJwcmludDogMTQ6MGE6ZmQ6OGQ6YTg6Mjg6YjU6Mzg6Njk6ZGI6NTY6N2U6NjE6MjI6MDM6M2YKIyBTSEExIEZpbmdlcnByaW50OiA5ZDo3MDpiYjowMTphNTphNDphMDoxODoxMToyZTpmNzoxYzowMTpiOTozMjpjNTozNDplNzo4ODphOAojIFNIQTI1NiBGaW5nZXJwcmludDogMmE6OTk6ZjU6YmM6MTE6NzQ6Yjc6M2M6YmI6MWQ6NjI6MDg6ODQ6ZTA6MWM6MzQ6ZTU6MWM6Y2I6Mzk6Nzg6ZGE6MTI6NWY6MGU6MzM6MjY6ODg6ODM6YmY6NDE6NTgKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZrakNDQTNxZ0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRc0ZBREJhTVFzd0NRWURWUVFHRXdKR1VqRVQKTUJFR0ExVUVDaE1LUTJWeWRHbHViMjFwY3pFWE1CVUdBMVVFQ3hNT01EQXdNaUEwTXpNNU9UZzVNRE14SFRBYgpCZ05WQkFNVEZFTmxjblJwYm05dGFYTWdMU0JTYjI5MElFTkJNQjRYRFRFek1UQXlNVEE1TVRjeE9Gb1hEVE16Ck1UQXlNVEE1TVRjeE9Gb3dXakVMTUFrR0ExVUVCaE1DUmxJeEV6QVJCZ05WQkFvVENrTmxjblJwYm05dGFYTXgKRnpBVkJnTlZCQXNURGpBd01ESWdORE16T1RrNE9UQXpNUjB3R3dZRFZRUURFeFJEWlhKMGFXNXZiV2x6SUMwZwpVbTl2ZENCRFFUQ0NBaUl3RFFZSktvWklodmNOQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQU5UTUNRb3NQNUwyCmZ4U2VDNXlhYWgxQU1HVDlxdDhPSGdaYm4xQ0Y2czJOcTBObjNyRDZmb0NXbm9SNGtralc0em51enVSWldKZmwKTGllWTZwT29kNXRLOE85MGdDM3JNQisxMmNlQW5HSW5rWWp3U29uZDNJam1GUG5WQXkvL2xkdTluK3dzK2hRVgpXWlVLeGtkOGFSaTVwd1A1eW5hcHo4ZHZ0RjRGL3U3QlVySjFNb2ZzN1NsbU8vTktGb0wyMXByYmNwanAzdkRGClRLV3J0ZW9CNG93dVpIOWtiLzJqSlpPTHlLSU9TWTAwOEIvc1dFVXVOS3FFVUwzbnNrb1R1TEFQcmpoZHNLa2IKNW5QSldxSFpaa0NxcVUybU5BS3RoSDZ5SThIN0tzWm45RFMyc0pWcU0wOXhSTFd0d0hremlPQy83YU9nRkxTYwpDYkFLNDJDKytQaG1pTTFiOFhjRjRMVnpic0Y5Umk2T1N5ZW16VFVLL2VWTmZhb3FveW5IV21nRTZPWFdrNlJpCndzWG05RS9HK1o4YWpZSkpHWXJLV1VNNjZBMHl3ZlJNRXdOdmJxWS9rWFBMeW5OdkVpQ0w3c0NDZU41TExzSkoKd3gzdEZ2WWs5Q2NiWEZjeDNGWHVxQjV2Ykt6aVJjeFhWNHAxVnhuZ3RWaVpTVFl4UERNQmJSWkt6YmdxZzRTRwptL2xnMGg5dGtRUFRZS2JWUFpyZGQ1QTlOYVNmRDE3MVVrUnB1Y0M2M005OTMzelp4S3lHSWpLOGUydVI3M3I0CkYyaXc0bE5WWUMydlBzS0QyTmtKSy9EQVpOdUhpNUhNa2VzRS9YYTBsWnJtRkFZYjFUUWR2dGovZEJ4VGhabmcKV1ZKS1llMklubXRKaVVaK0lGclo1MHJsYXU3U1pSRkRBZ01CQUFHall6QmhNQTRHQTFVZER3RUIvd1FFQXdJQgpCakFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVdCQlR2a1V6MXBjTXc2QzhJNnROeElxU1NhSGgwCjJUQWZCZ05WSFNNRUdEQVdnQlR2a1V6MXBjTXc2QzhJNnROeElxU1NhSGgwMlRBTkJna3Foa2lHOXcwQkFRc0YKQUFPQ0FnRUFmajFVMmlKZEdsZytPMVFudXJyTXlPTWFhdW8rK1JMclZsODlVTTdnNmtnbUpzOTVWbjZSSEprLwowS0dSSEN3UFQ1aVZXVk85MENMWWlGMmNOL3o3Wk1GNGpJdWFZQW5xMWZvaFg5QjBaZWRReGI4dXVRc0xyYld3CkY2WVNqTlJpZU9wV2F1d0swa0REUEFVd1BrMlV0NTlLQTlOOUowdTIva1RPK2hrekdtMmtRdEhkek1qSTF4WlMKZzA4MWxMTVNWWDNsNGtMcjVKeVRDY0JNV3dlcngyMFJvRkFYbENPb3RRcVNEN0o2d1dBc09Nd2FwbHYvOGd6agpxaDhjM0xpZ2t5ZmVZK04vSVo4NjVaNzY0Qk5xZGV1V1hHS1JsSTVuVTdhSitCSUp5MjlTV3dOeWhsQ1ZDTlNOCmg0WVZINVVrMktSdm1zNmtuWnR0MHJKMkJvYkdWZ2pGNnduYU5zSWJXMEcrWVNyamNPYTRwdmkyV3NTOUlmZi8KcWwraGJIWTVadGJxVEZYaEFET2JFNWhqeVcvUUFTQUpOMUxuREU4K3piejFYNVlucHlBQ2xlQXU2QWRCQlI4VgpidGF3NUJuZ0R3S1RBQ2R5eFl2UlZCOWRTc05BbDM1VnBuekJNd1FVQVIxSklHa0xHWk9kYmxnaTkwQU1SZ3dqClkvTTUwbjkyVWFmMHlLSHhESFlpSTBaU0tTM2lvMEVIVm1tWTBnVUp2R25IV21ITmo0RmdGVTJBM1pEaWZjUlEKOG93N2Jrckh4dWFBS3p5QnZCR0FGaEFuMS9ETlAzbk1jeXJEZmxPUjFtNzQ5ZlBIMEZGTmprdWxXK1laRnp2VwpnUW5jSXR6dWpybkVqMVBoWjdzenVJZ1ZScy90YVRYL2RRMUc4ODV4NGNWcmhrSUd1VUU9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1PSVNURSBXSVNlS2V5IEdsb2JhbCBSb290IEdCIENBIE89V0lTZUtleSBPVT1PSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkCiMgU3ViamVjdDogQ049T0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQiBDQSBPPVdJU2VLZXkgT1U9T0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZAojIExhYmVsOiAiT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQiBDQSIKIyBTZXJpYWw6IDE1Nzc2ODU5NTYxNjU4ODQxNDQyMjE1OTI3ODk2Njc1MDc1NzU2OAojIE1ENSBGaW5nZXJwcmludDogYTQ6ZWI6Yjk6NjE6Mjg6MmU6Yjc6MmY6OTg6YjA6MzU6MjY6OTA6OTk6NTE6MWQKIyBTSEExIEZpbmdlcnByaW50OiAwZjpmOTo0MDo3NjoxODpkMzpkNzo2YTo0Yjo5ODpmMDphODozNTo5ZTowYzpmZDoyNzphYzpjYzplZAojIFNIQTI1NiBGaW5nZXJwcmludDogNmI6OWM6MDg6ZTg6NmU6YjA6Zjc6Njc6Y2Y6YWQ6NjU6Y2Q6OTg6YjY6MjE6NDk6ZTU6NDk6NGE6Njc6ZjU6ODQ6NWU6N2I6ZDE6ZWQ6MDE6OWY6Mjc6Yjg6NmI6ZDYKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR0VENDQXAyZ0F3SUJBZ0lRZHJFZ1VuVHdoWWRHcy9nakd2YkN3REFOQmdrcWhraUc5dzBCQVFzRkFEQnQKTVFzd0NRWURWUVFHRXdKRFNERVFNQTRHQTFVRUNoTUhWMGxUWlV0bGVURWlNQ0FHQTFVRUN4TVpUMGxUVkVVZwpSbTkxYm1SaGRHbHZiaUJGYm1SdmNuTmxaREVvTUNZR0ExVUVBeE1mVDBsVFZFVWdWMGxUWlV0bGVTQkhiRzlpCllXd2dVbTl2ZENCSFFpQkRRVEFlRncweE5ERXlNREV4TlRBd016SmFGdzB6T1RFeU1ERXhOVEV3TXpGYU1HMHgKQ3pBSkJnTlZCQVlUQWtOSU1SQXdEZ1lEVlFRS0V3ZFhTVk5sUzJWNU1TSXdJQVlEVlFRTEV4bFBTVk5VUlNCRwpiM1Z1WkdGMGFXOXVJRVZ1Wkc5eWMyVmtNU2d3SmdZRFZRUURFeDlQU1ZOVVJTQlhTVk5sUzJWNUlFZHNiMkpoCmJDQlNiMjkwSUVkQ0lFTkJNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQTJCZTMKSEVva0t0YVhzY3JpSHZ0OU9PK1k5Ykk1bUU0bnVCRmRlOUlsbElpQ0ZTWnFHekc3cUZzaElTdllEMDZmV3ZHeApXdVI1MWpJaksrRlR6SmxGWEh0UHJieS9oMG9MUzVkYXFQWkk3SDE3RGMwaEJ0K2VGZjFCaWtpM0lQU2hlaHRYCjFGMVEvN3BuMkNPWkg4Zy80OTcvYjF0M3NXdHV1TWxrOStIS1FVWU9LWEhRdVNQOHlZRmZUdmR2MzcrRXJYTmsKdTdkQ2ptbjIxSFlkZnAybnVGZUtVV2R5MTlTb3VKVlVRSE1EOXVyMDYvNG9RbmMvblNNYnNyWTlnQlFIVEM1UAo5OVVLRmcyOVprTTNmaU5EZWNOQWh2Vk1LZHFPbXEwTnBRU0hpQjZGNCtsVDFadklpd05qZU92Z0dVcHV1eTlyCk0yUllrNjFwdjQ4Yjc0Skl4d0lEQVFBQm8xRXdUekFMQmdOVkhROEVCQU1DQVlZd0R3WURWUjBUQVFIL0JBVXcKQXdFQi96QWRCZ05WSFE0RUZnUVVOUS9JTm1OZTRxUHMrVHRtRmM1UlV1T1JtajB3RUFZSkt3WUJCQUdDTnhVQgpCQU1DQVFBd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFFQk0rNGV5bVlHUWZwM0ZzTEFtelloN0t6S05icmdoCmNWaVhmYTQzRks4KzUvZWE0bjMyY1ppWkJLcERkSGlqNDBsaFBuT01UWlRnK1hIRXRoWU9VM2dmMXFLSEx3STUKZ1NrOHJ4V1lJVEQrS0pBQWpOSGh5L3BleVAzNEVFWTdvbmhDa1JkMFZRcmVVR2ROWnRHbi8vM1p3TFdvbzRyTwpadlVQUTgybksxZDdZMFpxcWk1UzJQVHQ0VzJ0S1pCNFNMcmhJNnFqaWV5MXE1YkF0RXVpSFplZWV2SnVRSEhmCmFQRmxUYzU4QmQ5VFphbWw4TEdYQkhBVlJnT1kxTksvVkxTZ1dIMVNiOXBXSm1MVTJOdUpNVzhjOENMQzAySWMKTmMxTWFSVlVHcENZM3VzZVg4cDN4OHVPUFVOcG5KcFkwQ1E3M3h0QWxuNDFyWUhIVG5HNmlCTT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVNaQUZJUiBST09UIENBMiBPPUtyYWpvd2EgSXpiYSBSb3psaWN6ZW5pb3dhIFMuQS4KIyBTdWJqZWN0OiBDTj1TWkFGSVIgUk9PVCBDQTIgTz1LcmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuCiMgTGFiZWw6ICJTWkFGSVIgUk9PVCBDQTIiCiMgU2VyaWFsOiAzNTcwNDMwMzQ3NjcxODY5MTQyMTcyNzczNDQ1ODczODY3NDMzNzc1NTgyOTYyOTIKIyBNRDUgRmluZ2VycHJpbnQ6IDExOjY0OmMxOjg5OmIwOjI0OmIxOjhjOmIxOjA3OjdlOjg5OjllOjUxOjllOjk5CiMgU0hBMSBGaW5nZXJwcmludDogZTI6NTI6ZmE6OTU6M2Y6ZWQ6ZGI6MjQ6NjA6YmQ6NmU6Mjg6ZjM6OWM6Y2M6Y2Y6NWU6YjM6M2Y6ZGUKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGExOjMzOjlkOjMzOjI4OjFhOjBiOjU2OmU1OjU3OmQzOmQzOjJiOjFjOmU3OmY5OjM2OjdlOmIwOjk0OmJkOjVmOmE3OjJhOjdlOjUwOjA0OmM4OmRlOmQ3OmNhOmZlCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEY2pDQ0FscWdBd0lCQWdJVVBvcGRCK3hWMGpMVnQrTzJYd0hyTGR6azF1UXdEUVlKS29aSWh2Y05BUUVMCkJRQXdVVEVMTUFrR0ExVUVCaE1DVUV3eEtEQW1CZ05WQkFvTUgwdHlZV3B2ZDJFZ1NYcGlZU0JTYjNwc2FXTjYKWlc1cGIzZGhJRk11UVM0eEdEQVdCZ05WQkFNTUQxTmFRVVpKVWlCU1QwOVVJRU5CTWpBZUZ3MHhOVEV3TVRrdwpOelF6TXpCYUZ3MHpOVEV3TVRrd056UXpNekJhTUZFeEN6QUpCZ05WQkFZVEFsQk1NU2d3SmdZRFZRUUtEQjlMCmNtRnFiM2RoSUVsNlltRWdVbTk2YkdsamVtVnVhVzkzWVNCVExrRXVNUmd3RmdZRFZRUUREQTlUV2tGR1NWSWcKVWs5UFZDQkRRVEl3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQzN2RDVRcUV2TgpRTFhPWWVlV3lyU2gyZ3dpc1BxMWUzWUFkNHdMejMyb2hzd21VZVFnUFlVTTFsamo1L1FxR0ozYTBhNG03dXRUCjNQU1ExaE5LREpBOHcvVGEwbzROa2pyY3NiSC9PTjdEdWkxZmdMa0N2VXFkR3crMHc4TEJad1BkM0J1Y1BiT3cKM2dBZXFEUkh1NXJyL2dzVXZUYUUyZzBndi9wYnk2a1dJSzA1WU80dmRiYm5sNXo1UHYxK1RXOU5MKytJRFdyNgozZkU5YmlDbG9CSzBUWEM1enRkeU80bVRwNENFSENkSmNrbTEvenVWbnNITXlBSHM2QTZLQ3BibnM2YUg1ZGI1CkJTc05sMEJ3UExxc2RWcWMxVTJkQWdyU1M1dG1TMFlIRjJXdG4yeUlBTndpaWVEaFpOUm52REY1WVR5N3lrSE4KWEdvQXlEdzRqbGl2QWdNQkFBR2pRakJBTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RGdZRFZSMFBBUUgvQkFRRApBZ0VHTUIwR0ExVWREZ1FXQkJRdUZxbEtHTFhMelBWdlVQTWpYL2hkNTZ6d3lEQU5CZ2txaGtpRzl3MEJBUXNGCkFBT0NBUUVBdFhQNEE5eFpXeDEyNmFNcWU1QW9zazNBTTArcW1ySFV1T1FuLzZtV21jNUc0RzE4VEtJNHBBWncKOFBSQkVldy9SNDAvY29mNU8vMmtieXRUQU9EL09ibHFCdzdySFJ6Mm9uS1F5NEk5RVlLTDBydWZLcThoNW1PRwpuWGtaNy9lN0REV1F3NHJ0VHcvMXpCTFpwRDY3b1B3Z2xWOVBKaThSSTROT2RRY1B2NXZSdEIzcEVBVCt5bUNQCm9reTRyYy9oa0EvTnJnckhYWHUzVU5MVVlmclZGZHZYbjRkUlZPdWw0K3ZKaGFBbElEZjdqczRNTklUaFBJR3kKZDA1RHBZaGZobWVoUGVhMFhHRzJQdHYrdHlqRm9nZXV0Y3JLalNvUzc1ZnR3akNreVNwNisvTk5JeHVaTXpTZwpMdldwQ3ovVVhlSFBoSi9pR2NKZml0WWdIdU56dHc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049Q2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSAyIE89VW5pemV0byBUZWNobm9sb2dpZXMgUy5BLiBPVT1DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKIyBTdWJqZWN0OiBDTj1DZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBIDIgTz1Vbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuIE9VPUNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQojIExhYmVsOiAiQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSAyIgojIFNlcmlhbDogNDQ5Nzk5MDAwMTcyMDQzODMwOTk0NjM3NjQzNTc1MTI1OTY5NjkKIyBNRDUgRmluZ2VycHJpbnQ6IDZkOjQ2OjllOmQ5OjI1OjZkOjA4OjIzOjViOjVlOjc0OjdkOjFlOjI3OmRiOmYyCiMgU0hBMSBGaW5nZXJwcmludDogZDM6ZGQ6NDg6M2U6MmI6YmY6NGM6MDU6ZTg6YWY6MTA6ZjU6ZmE6NzY6MjY6Y2Y6ZDM6ZGM6MzA6OTIKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGI2Ojc2OmYyOmVkOmRhOmU4Ojc3OjVjOmQzOjZjOmIwOmY2OjNjOmQxOmQ0OjYwOjM5OjYxOmY0OjllOjYyOjY1OmJhOjAxOjNhOjJmOjAzOjA3OmI2OmQwOmI4OjA0Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGMGpDQ0E3cWdBd0lCQWdJUUlkYlFTazhsRDhreU4veXFYaEtONlRBTkJna3Foa2lHOXcwQkFRMEZBRENCCmdERUxNQWtHQTFVRUJoTUNVRXd4SWpBZ0JnTlZCQW9UR1ZWdWFYcGxkRzhnVkdWamFHNXZiRzluYVdWeklGTXUKUVM0eEp6QWxCZ05WQkFzVEhrTmxjblIxYlNCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVEVrTUNJRwpBMVVFQXhNYlEyVnlkSFZ0SUZSeWRYTjBaV1FnVG1WMGQyOXlheUJEUVNBeU1DSVlEekl3TVRFeE1EQTJNRGd6Ck9UVTJXaGdQTWpBME5qRXdNRFl3T0RNNU5UWmFNSUdBTVFzd0NRWURWUVFHRXdKUVRERWlNQ0FHQTFVRUNoTVoKVlc1cGVtVjBieUJVWldOb2JtOXNiMmRwWlhNZ1V5NUJMakVuTUNVR0ExVUVDeE1lUTJWeWRIVnRJRU5sY25ScApabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNU1F3SWdZRFZRUURFeHREWlhKMGRXMGdWSEoxYzNSbFpDQk9aWFIzCmIzSnJJRU5CSURJd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUM5K1hqNDV0V0EKREdTZGhodVdaR2MvSWpvZWRRRjk3L3RjWjR6SnpGeHJxWkhtdVVMbElFdWIycHQ3dVpsZDJadUFTOWVFUUNzbgowK2k2TUxzK0NScW5TWlh2SzBBa3dwZkhwKzZiSmUrb0NnQ1hoVnFxbmR3cHllSTFCK3R3VFVyV3diTld1S0ZCCk9KdlIrekYvaitCZjRiRS9ENDRXU1dEWEJvMFkrYW9tRUtzcTA5RFJaNDBiUnI1SE1OVXVjdEhGWTlyblkzbEUKZmt0akpJbUdMalEvS1V4U2l5cW53T0tSS0ltNXdGdjVIZG5uSjYzL21nS1h3Y1pRa3BzQ0xMMnB1VFJaQ3IrRQpTdi9mL3JPZjY5bWU0SmdqN0tacmR4WXEyOHl0T3h5a2g5eEdjMTRaWW1oRlYrU1Fna0s3UXRid1llREJvejFtCm8xMzBHTzZJeVkwWFJTbVpNblVDTWU0cEpzaHJBdWExWWtWL054VmFJMmlKMUQ3ZVRpZXc4RUFNdkUwWHkwMmkKc3g3UUJscmQ5cFBQVjNXWjlmcUdHbWQ0czcrVy9qVGN2ZWRTVnVXejVYVjcxMEdSQmR4ZGFlT1ZEVU81L0lPVwpPWlY3YklCYVR4Tnl4dGQ5S1hwRXVsS2tLdFZCUmdrZy9pS2d0bHN3amJ5SkROWFhjUGlIVXYzYTc2eFJMZ2V6ClR2N1FDZHB3NzVqNlZ1WnQyN1ZYUzl6bExDVVZ5SjR1ZUU3NDJweWVoaXpLVi9NYTVjaVNpeHFDbG5yRHZGQVMKYWRnT1drYUxPdXNtK2lQSnRyQ0J2a0lBcFBqVy9qQXV4OUpHOXVXT2RmM3l6TG5RaDF2TUJoQmd1NE0xdDE1bgoza2ZzbVVqeHBLRVYvcTJNWW80NVZVODVGcm14WTUzL3R3SURBUUFCbzBJd1FEQVBCZ05WSFJNQkFmOEVCVEFECkFRSC9NQjBHQTFVZERnUVdCQlMyb1ZRNUFzT2dQNDZLdlByVStCeW0wVG9PL1RBT0JnTlZIUThCQWY4RUJBTUMKQVFZd0RRWUpLb1pJaHZjTkFRRU5CUUFEZ2dJQkFIR2xEczdrNmI4L09OV0pXc1FDWWZ0TXhSUVhMWXRQVTJzUQpGL3hsaE1jUVNaRGUyOGNtazRnbWIzRFdBbDQ1b1BlUHE1YTFwUk5jZ1JSdERvR0NFUnVLVHNaUHBkMWlIa1RmCkNWbjBXM2NMTittTElNYjRDazR1V0J6ck05RFBobURKMnZ1QUw1NU1ZSVI0UFNGazF2dEJIeGdQNThsMWNiMjkKWE40MGh6NUJzQTcydWRZL0NST1dGQy9lbWgxYXVWYk9OVHF3WDNCTlh1TXA4U01vY2xtMnE4S01aaVljZHl3bQpkaldMS0tkcG9Qazc5U1BkaFJCMHlaQURWcEhucjdwSDFCS1hFU0xqb2ttVWJPZTNsRXU2TGFUYU00dE1wa1QvCldqekdIV1RZdFRIa3BqeDZxRmNMMisxaEdzdnh6bk4zWTZTSGIweFJPTmJrWDhlZnRvRXE1SVZJZVZoZU8vamIKQW9KbndUbmJ3M1JMUFRZZStTbVRpR2hicUVRWklmQ242SUVOTE9pVE5yUTNzc3F3R3laNm1pVWZtcHFBbmtzcQpQL3VqbXY1ek1uSENuc1p5NFlwb0ovSGtEN1RFVEtWaGsvaVhFQWNxTUNXcHVjaHh1TzlvekMxKzllQitENEtvCmI3YTZiSU5EZDgyS2toZWhubHQ0RmoxRjRqTnkzZUZteXBuVHljVW0vUTFvQkVhdXR0bWJqTDRadnJIRzhobmoKWEFMS0xOaHZTZ2ZaeVRYYVFIWHl4S2NaYjU1Q0VKaDE1cFdMWUx6dHhSTFhpczdWbUZ4V2xnUEY3bmNHTmYvUAo1TzQvRTJIdTI5b3RoZkROcnAyeUdBbEZ3NUtoY2hmOFI3YWdDeXp4eE41RGFBaHFYenZ3ZG1QN3pBWXNwc2JpCkRyVzV2aVNQCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1IZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDE1IE89SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkKIyBTdWJqZWN0OiBDTj1IZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDE1IE89SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkKIyBMYWJlbDogIkhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTUiCiMgU2VyaWFsOiAwCiMgTUQ1IEZpbmdlcnByaW50OiBjYTpmZjplMjpkYjowMzpkOTpjYjo0YjplOTowZjphZDo4NDpmZDo3YjoxODpjZQojIFNIQTEgRmluZ2VycHJpbnQ6IDAxOjBjOjA2Ojk1OmE2Ojk4OjE5OjE0OmZmOmJmOjVmOmM2OmIwOmI2Ojk1OmVhOjI5OmU5OjEyOmE2CiMgU0hBMjU2IEZpbmdlcnByaW50OiBhMDo0MDo5Mjo5YTowMjpjZTo1MzpiNDphYzpmNDpmMjpmZjpjNjo5ODoxYzplNDo0OTo2Zjo3NTo1ZTo2ZDo0NTpmZTowYjoyYTo2OToyYjpjZDo1Mjo1MjozZjozNgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJR0N6Q0NBL09nQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFzRkFEQ0JwakVMTUFrR0ExVUVCaE1DUjFJeApEekFOQmdOVkJBY1RCa0YwYUdWdWN6RkVNRUlHQTFVRUNoTTdTR1ZzYkdWdWFXTWdRV05oWkdWdGFXTWdZVzVrCklGSmxjMlZoY21Ob0lFbHVjM1JwZEhWMGFXOXVjeUJEWlhKMExpQkJkWFJvYjNKcGRIa3hRREErQmdOVkJBTVQKTjBobGJHeGxibWxqSUVGallXUmxiV2xqSUdGdVpDQlNaWE5sWVhKamFDQkpibk4wYVhSMWRHbHZibk1nVW05dgpkRU5CSURJd01UVXdIaGNOTVRVd056QTNNVEF4TVRJeFdoY05OREF3TmpNd01UQXhNVEl4V2pDQnBqRUxNQWtHCkExVUVCaE1DUjFJeER6QU5CZ05WQkFjVEJrRjBhR1Z1Y3pGRU1FSUdBMVVFQ2hNN1NHVnNiR1Z1YVdNZ1FXTmgKWkdWdGFXTWdZVzVrSUZKbGMyVmhjbU5vSUVsdWMzUnBkSFYwYVc5dWN5QkRaWEowTGlCQmRYUm9iM0pwZEhreApRREErQmdOVkJBTVROMGhsYkd4bGJtbGpJRUZqWVdSbGJXbGpJR0Z1WkNCU1pYTmxZWEpqYUNCSmJuTjBhWFIxCmRHbHZibk1nVW05dmRFTkJJREl3TVRVd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUMKQVFEQytLay9HNG44UER3RVhUMlFOckNST25rOFpscnZiVGtCU1JxMHQ4OS9UU05UdDVBQTR4TXFLS1l4OFpFQQo0eWpzcmlGQnpoL2EvWDBTV3dHREQ3bXdYNW5oOGhLRGdFMEdQdCtzcitlaGlHc3hyL0NMMEJnenVOdEZhalQwCkFvQWtLQW9DRlpWZWRpb05tVG9VVy9iTHkxTzhFMDBCaURlVUpSdEN2Q0xZanFPV1hqclpNdHMrNlBBUVplMTAKNFMrbmZLOG5OTHNwZlp1Mnp3bkk1ZE1LL0lobFpYUUszSE1jWE0xQXNSelV0b1NNVEZEUGFJNm9XYTdDSjA2QwpvalhkRlBRZi83SjMxWWN2cW01OUpDZm54c3NtNXVYK1p3ZGoyRVVOM1RwWlpUbFllcEtaY2oyY2hGNklJYmpWCjlDejgyWEJTVDNpNHZUd3JpNVdZOWJQUmFNOGdGSDVNWEYvbmkrWDFOWUVaTjljUkNMZG12dE5Lem9OWEFEckQKZ2ZnWHk1STJYZEdqMkhVYjRZc242bnBJUWYxRkdRYXRKNWxPd1hCSDNiV2ZnVk1TNWJHTVNGMHhReGZqak1aNgpZNVpMS1RCT2hFNWlHVjQ4enBlUXBYOEI2NTNnK0l1SjNTV1lQWksyZnUvWjhWRlJmUzBteUdsWlllQ3NhcmdxCk5oRUVlbEM5TW9TK0w5eHkxZGNkRmtma1IyWWdQL1NXeGErT0FYcWxEM3BrOVEwWWg5bXVpTlg2aE1FNndHa28KTGZJTmFGR3E0NlYzeHFTUURxRTNpekVqUjhFSkNPdHU5M2liMTRMOGhDQ1pTUm0yRWtheCswVlZGcW1qWmF5YwpCdy9xYTl3ZkxnWnk3SWFJRXVRdDIxOEZMK1R3QTlNbU0rZUF3czFDb1JjMEN3SURBUUFCbzBJd1FEQVBCZ05WCkhSTUJBZjhFQlRBREFRSC9NQTRHQTFVZER3RUIvd1FFQXdJQkJqQWRCZ05WSFE0RUZnUVVjUlZueU1qSnZYVmQKY3RBNEdHcWQ4M0VrVkFzd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dJQkFIVzdiVlJMcWhCWVJqVHlZdGNXTmwwSQpYdFZzeUllOXRDNUc4akg0Zk9wQ3RaTVdWZHloREJLZzJtRitEMWhZYzJSeXgraEZqdHlwOGlZL3hubU1zVk1JCk00R3dWaE8rNWxGYzJKc0tUMHVjVmxNQzZVLzJEV0RxVFVKVjZId2JJU0hUR3pyTWQvSzRrUEZveC9sYS92b3QKOUwvSjlVVWJ6amdRS2plS2VhTzA0d2xzaFlhVC80bVdKM2lCajJmalJuUlVqdGtOYWVKSzlFMTBBLyt5ZCsyVgpaNWZrc2NXcnYyb2o2TlNVNGtRb1lzUkw0dkRZNGlsckduQitKR0dUZTA4RE1pVU5SU1FybHJSR2FyOUtDL2VhCmo4R3NHc1ZuODI4MDB2cHpZNHp2RnJDb3BFWXErT3NTN0hLMDcvZ3Jmb3hTd0l1RVZQa3ZQdU5WcU54bXNkbmgKWDlpempGazBXYVNyVDJ5N0h4amJkYXZZeTVMTmxEaGhEZ2NHSDB0R0VQRVZ2bzJGWER0S0s0RjVEN1JwbjBsUQpsMDMzRGxaZHdKVnF3amJERzJqSjlTcmNSNXErc3M3RkplajZBN25hK1JadWtZVDFIQ2pJL0NiTTF4eVFWcWRmCmJ6b0V2TTE0aVF1T0R5K2pxaytpR3hJOUZnaEFEL0ZHVE5lcWV3akJDdlZ0Sjk0Q2o4ckR0U3ZLNmV2SUlWTTQKcGN3NzJIYzNNS0pQMlcvUjhrQ3RRWG9YeGRaS05ZbTNRZFY4aG45VlRZTktwWE1nd0RxdmtQR2FKSTdaam5ISwplN2lHMnJLUG1UNGRFdzBTRWU3VXEvRHBGWFlDNU9EZnFpQWVXMkdGWkVDcGtKY05yVlBTV2gySGFnQ1haV0swCnZtOXFwL1VzUXUweXJiWWhucjY4Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1IZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIEVDQyBSb290Q0EgMjAxNSBPPUhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5CiMgU3ViamVjdDogQ049SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBFQ0MgUm9vdENBIDIwMTUgTz1IZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENlcnQuIEF1dGhvcml0eQojIExhYmVsOiAiSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBFQ0MgUm9vdENBIDIwMTUiCiMgU2VyaWFsOiAwCiMgTUQ1IEZpbmdlcnByaW50OiA4MTplNTpiNDoxNzplYjpjMjpmNTplMTo0YjowZDo0MTo3Yjo0OTo5MjpmZTplZgojIFNIQTEgRmluZ2VycHJpbnQ6IDlmOmYxOjcxOjhkOjkyOmQ1OjlhOmYzOjdkOjc0Ojk3OmI0OmJjOjZmOjg0OjY4OjBiOmJhOmI2OjY2CiMgU0hBMjU2IEZpbmdlcnByaW50OiA0NDpiNTo0NTphYTo4YToyNTplNjo1YTo3MzpjYToxNTpkYzoyNzpmYzozNjpkMjo0YzoxYzpiOTo5NTozYTowNjo2NTozOTpiMToxNTo4MjpkYzo0ODo3Yjo0ODozMwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ3d6Q0NBa3FnQXdJQkFnSUJBREFLQmdncWhrak9QUVFEQWpDQnFqRUxNQWtHQTFVRUJoTUNSMUl4RHpBTgpCZ05WQkFjVEJrRjBhR1Z1Y3pGRU1FSUdBMVVFQ2hNN1NHVnNiR1Z1YVdNZ1FXTmhaR1Z0YVdNZ1lXNWtJRkpsCmMyVmhjbU5vSUVsdWMzUnBkSFYwYVc5dWN5QkRaWEowTGlCQmRYUm9iM0pwZEhreFJEQkNCZ05WQkFNVE8waGwKYkd4bGJtbGpJRUZqWVdSbGJXbGpJR0Z1WkNCU1pYTmxZWEpqYUNCSmJuTjBhWFIxZEdsdmJuTWdSVU5ESUZKdgpiM1JEUVNBeU1ERTFNQjRYRFRFMU1EY3dOekV3TXpjeE1sb1hEVFF3TURZek1ERXdNemN4TWxvd2dhb3hDekFKCkJnTlZCQVlUQWtkU01ROHdEUVlEVlFRSEV3WkJkR2hsYm5NeFJEQkNCZ05WQkFvVE8waGxiR3hsYm1saklFRmoKWVdSbGJXbGpJR0Z1WkNCU1pYTmxZWEpqYUNCSmJuTjBhWFIxZEdsdmJuTWdRMlZ5ZEM0Z1FYVjBhRzl5YVhSNQpNVVF3UWdZRFZRUURFenRJWld4c1pXNXBZeUJCWTJGa1pXMXBZeUJoYm1RZ1VtVnpaV0Z5WTJnZ1NXNXpkR2wwCmRYUnBiMjV6SUVWRFF5QlNiMjkwUTBFZ01qQXhOVEIyTUJBR0J5cUdTTTQ5QWdFR0JTdUJCQUFpQTJJQUJKS2cKUWVoTGdvUmM0dmd4RVptR1pFNEpKUytkUVM4S3JqVlBkSld5VVdScmpXdm1QM0NWOEFWRVI2WnlPRkIybFFKYQpqcTRvbnZrdFRwbnZMRWh2VENVcDZORnhXOThkd1hVM3ROZjZlM3BDbkdvS1ZscDhhUXVxZ0Fra2JIN0JScU5DCk1FQXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DQVFZd0hRWURWUjBPQkJZRUZMUWkKQzRLWkpBRU9uTHZrRHYyLys1Y2drNWtxTUFvR0NDcUdTTTQ5QkFNQ0EyY0FNR1FDTUdmT0ZtSTRvcXhpUmFlcApsU1RBR2llY01qdkF3Tlc2cWVmNEJFTlRoZTVTSWQ2ZDlTV0RQcDVZU3kvWFp4TU9JUUl3QmVGMUFkNW83U29mClRVd0pDQTNzUzYxa0Z5am5kYzVGWlhJaEY4c2lRUTZNRTVnNG1sUnRtOHJpZk9vQ1dDS1IKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUNlcnRwbHVzIFJvb3QgQ0EgRzEgTz1DZXJ0cGx1cwojIFN1YmplY3Q6IENOPUNlcnRwbHVzIFJvb3QgQ0EgRzEgTz1DZXJ0cGx1cwojIExhYmVsOiAiQ2VydHBsdXMgUm9vdCBDQSBHMSIKIyBTZXJpYWw6IDE0OTE5MTE1NjU3Nzk4OTgzNTY3MDk3MzExNzY5NjU2MTU1NjQ2Mzc3MTMKIyBNRDUgRmluZ2VycHJpbnQ6IDdmOjA5OjljOmY3OmQ5OmI5OjVjOjY5OjY5OjU2OmQ1OjM3OjNlOjE0OjBkOjQyCiMgU0hBMSBGaW5nZXJwcmludDogMjI6ZmQ6ZDA6Yjc6ZmQ6YTI6NGU6MGQ6YWM6NDk6MmM6YTA6YWM6YTY6N2I6NmE6MWY6ZTM6Zjc6NjYKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDE1OjJhOjQwOjJiOmZjOmRmOjJjOmQ1OjQ4OjA1OjRkOjIyOjc1OmIzOjljOjdmOmNhOjNlOmMwOjk3OjgwOjc4OmIwOmYwOmVhOjc2OmU1OjYxOmE2OmM3OjQzOjNlCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGYXpDQ0ExT2dBd0lCQWdJU0VTQlZnK1F0UGxSV2hTMkRON2NzM0VZUk1BMEdDU3FHU0liM0RRRUJEUVVBCk1ENHhDekFKQmdOVkJBWVRBa1pTTVJFd0R3WURWUVFLREFoRFpYSjBjR3gxY3pFY01Cb0dBMVVFQXd3VFEyVnkKZEhCc2RYTWdVbTl2ZENCRFFTQkhNVEFlRncweE5EQTFNall3TURBd01EQmFGdzB6T0RBeE1UVXdNREF3TURCYQpNRDR4Q3pBSkJnTlZCQVlUQWtaU01SRXdEd1lEVlFRS0RBaERaWEowY0d4MWN6RWNNQm9HQTFVRUF3d1RRMlZ5CmRIQnNkWE1nVW05dmRDQkRRU0JITVRDQ0FpSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUIKQU5wUWg3YmF1S2srbldUNlZqT2FWajBXNVFPVnNqUWNtbTFpQmRUWWorZUpaSis2MjJTTFpPWjVLbUhOcjQ5YQppWkZsdVZqOHRBTmZrVDh0RUJYZ2ZzKzgvSDlEWjZpdFhqWWoySml6VGZORG5qbDhLdnpzaU5XSTduQzloUll0CjZrdUpQS054UXY0Yy9kTWNMUkM0aGxUcVE3amJ4b2ZhcUs2QUpjOTZKaDJxa2JCSWI2NjEzcDdZMS9vQS9jYVAKMEZHN1luMmtzWXl5L3lBUnVqVmpCWVpIWUVNemtQWkhvZ05QbGsyZFQ4SHE2cHlpL2pRdTNyZktHM2FrdDYyZgo2YWpVZUQ5NC92STRDVFlkMGhZQ3lPd3FhSy8xanBUdkxSTjZIa0pLSFJVeHJnd0VWL3hoYy9NeFZvWXhnS0RFCkVXNHdkdU9VOEY4RXhLeUhjb21ZeFozTVZ3aWE5QXo4ZlhvRk92cEhnRG0yejRRVGQyOG42ditXWnhjSWJla04KMWlOUU1MQVZkQk0rNVMvL0RzM0VDMHBkOE5nQU0wbG02NkVZZkZrdVBTaTVZWEhMdGFXNnVPcmM0bkJ2Q0dyYwpoMmMwNzk4d2N0M3p5VDhqL3pYaHZpRXBJRENCNUJtbElPa2x5bk14ZENtKzRrTFY4N0ltWnNkby9SbXo1eUNUCm1laGQ0RjZINTBib0pad0tLU1RVelZpR1VrQWtzbnNQbUJJZ0pQYVFiRWZJRGJzWUlDN1ovZnlMOGlucWgzU1YKNEVKUWVJUUVRV0d3OUNFamp5M0xLQ0h5YW16MEdxYkZGTFEzWlUrVi9ZREkrSExsSld2RVlMRjdiWTVLaW5QTwpXZnR3ZW5NR0U5blRkRGNrUVFvUmI1ZmM1K1Irb2IwVjhycUhEejFvaWhZSEFnTUJBQUdqWXpCaE1BNEdBMVVkCkR3RUIvd1FFQXdJQkJqQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01CMEdBMVVkRGdRV0JCU293Y0Nia2FoREZYeGQKQmllMEtsSFlsd3VCc1RBZkJnTlZIU01FR0RBV2dCU293Y0Nia2FoREZYeGRCaWUwS2xIWWx3dUJzVEFOQmdrcQpoa2lHOXcwQkFRMEZBQU9DQWdFQW5GWnZBWDdSdlV6MWlzYndKaC9rNERnWXpETERLVHVkUVNrMFljYlg4QUNoCjY2UnlqNVFYdkJNc2RiUlg3Z3A4Q1hyYzFjcWgwRFFUK0hlcm4rWCsyQjUwaW9VSGozL01lWHJLbHMzTi9VLzcKL1NNTmtQWDBYdFBHWVgyZUVlQUM3Z2tFMlFmZHBvcTNESU1rdTROUWt2NWdkUkUrMkoyd2lucTE0SjJieTVCUwpTN0NUS3RRK0ZqUGxuc1psRlQ1a093US8yd3lQWDF3ZGFSK3Y4K2toalBQdmwvYWF0eG0yaEhTY28xUzFjRTVqCjJGZGRVeUdiUUpKRCt0WjNWVE5QWk5YNzBDeHFqbTBscHUrRjZBTEVVejY1bm9lOHpEVWEzcUhwaW1PSFpSNFIKS3R0amQ1Y1V2cG9VbVJHeXdPNndUL2dVSVRKRFQ1K3Jvc3VvRDZvN0JsWEdFaWxYQ05RMzE0Y25yVWxacDVHcgpSSHBlalhEYmw4NUlVTEZ6ay9id2cyRDV6ZkhoTWYxYmZIRWhZeFFVcXEvRjNwTithTEhzSXFLcWtIV2V0VU55CjZtU2poRXY5REtnbWEzR1g3bFpqWnVoQ1ZQbkhIZC9RajF2ZnlEQnZpUDROeERNY1U2aWovVWdROHVRS1R1RVYKVi94dVpERENWUkhjNnFuTlNsU3NLV05FejBwQW9OWm9XUnN6K2U4Nmk5c2drdHhDaEw4QnE0ZkExU0NDMjhhNQpnNFZDWEE5RE8ycEpOZFdZOUJXLyttR0JEQWtnR05MUUZ3ekxTQUJRNlhhQ2pHVFhPcUFIVmN3ZU1jRHZPclJsCisrTy9RbXVlRDZpOWE1amMyTnZMaTZUZDExbjBidDMrcXNPUjBDNUNCOEFNVFZQTkpMRk1XeDVSOU4vcGt2bz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUNlcnRwbHVzIFJvb3QgQ0EgRzIgTz1DZXJ0cGx1cwojIFN1YmplY3Q6IENOPUNlcnRwbHVzIFJvb3QgQ0EgRzIgTz1DZXJ0cGx1cwojIExhYmVsOiAiQ2VydHBsdXMgUm9vdCBDQSBHMiIKIyBTZXJpYWw6IDE0OTIwODcwOTYxMzE1MzY4NDQyMDk1NjM1MDkyMjg5NTE4NzU4NjE1ODkKIyBNRDUgRmluZ2VycHJpbnQ6IGE3OmVlOmM0Ojc4OjJkOjFiOmVlOjJkOmI5OjI5OmNlOmQ2OmE3Ojk2OjMyOjMxCiMgU0hBMSBGaW5nZXJwcmludDogNGY6NjU6OGU6MWY6ZTk6MDY6ZDg6Mjg6MDI6ZTk6NTQ6NDc6NDE6Yzk6NTQ6MjU6NWQ6Njk6Y2M6MWEKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDZjOmMwOjUwOjQxOmU2OjQ0OjVlOjc0OjY5OjZjOjRjOmZiOmM5OmY4OjBmOjU0OjNiOjdlOmFiOmJiOjQ0OmI0OmNlOjZmOjc4OjdjOjZhOjk5OjcxOmM0OjJmOjE3Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDSERDQ0FhS2dBd0lCQWdJU0VTRFprYzZ1bytqRjUvL3BBcS9QYzd4Vk1Bb0dDQ3FHU000OUJBTURNRDR4CkN6QUpCZ05WQkFZVEFrWlNNUkV3RHdZRFZRUUtEQWhEWlhKMGNHeDFjekVjTUJvR0ExVUVBd3dUUTJWeWRIQnMKZFhNZ1VtOXZkQ0JEUVNCSE1qQWVGdzB4TkRBMU1qWXdNREF3TURCYUZ3MHpPREF4TVRVd01EQXdNREJhTUQ0eApDekFKQmdOVkJBWVRBa1pTTVJFd0R3WURWUVFLREFoRFpYSjBjR3gxY3pFY01Cb0dBMVVFQXd3VFEyVnlkSEJzCmRYTWdVbTl2ZENCRFFTQkhNakIyTUJBR0J5cUdTTTQ5QWdFR0JTdUJCQUFpQTJJQUJNMFBXMWFDMy9CRkd0YXQKOTNud0hjbXNsdGFlVHB3ZnRFSVJ5b2EvYmZ1Rm84WGxHVnpYN3FZL2FXZlllT0tteWNUYkxYa3U1NHVOQW04eApJazBHNDJCeVJaME9RbmVlenMvbGY0V2JHT1Q4ekM1eTB4YVRUc3FaWTF5aEJTcHNCcU5qTUdFd0RnWURWUjBQCkFRSC9CQVFEQWdFR01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZOcURZd0o1anRwTXhqd2oKRk5pUHd5Q3JLR0JaTUI4R0ExVWRJd1FZTUJhQUZOcURZd0o1anRwTXhqd2pGTmlQd3lDcktHQlpNQW9HQ0NxRwpTTTQ5QkFNREEyZ0FNR1VDTUhEK3NBdlo5NE9YN1BOVkhkVGNzd1lPL2pPWW5ZczVrR3VVSWUyMjExM1dUTmNoCnArZS9JUThyemZjcTNJVUhuUUl4QUlZVUZ1WGNzR1hDd0k0VW43OGtGbWpsdlBsNWFkeXRSU3YzdGpGenpBYWwKVTVPUkdwT3VjR3BudXRlZTVXRWFYdz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1PcGVuVHJ1c3QgUm9vdCBDQSBHMSBPPU9wZW5UcnVzdAojIFN1YmplY3Q6IENOPU9wZW5UcnVzdCBSb290IENBIEcxIE89T3BlblRydXN0CiMgTGFiZWw6ICJPcGVuVHJ1c3QgUm9vdCBDQSBHMSIKIyBTZXJpYWw6IDE0OTIwMzY1Nzc4MTE5NDcwMTM3NzA0MDAxMjcwMzQ4MjUxNzg4NDQ3NzUKIyBNRDUgRmluZ2VycHJpbnQ6IDc2OjAwOmNjOjgxOjI5OmNkOjU1OjVlOjg4OjZhOjdhOjJlOmY3OjRkOjM5OmRhCiMgU0hBMSBGaW5nZXJwcmludDogNzk6OTE6ZTg6MzQ6Zjc6ZTI6ZWU6ZGQ6MDg6OTU6MDE6NTI6ZTk6NTU6MmQ6MTQ6ZTk6NTg6ZDU6N2UKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDU2OmM3OjcxOjI4OmQ5OjhjOjE4OmQ5OjFiOjRjOmZkOmZmOmJjOjI1OmVlOjkxOjAzOmQ0Ojc1OjhlOmEyOmFiOmFkOjgyOjZhOjkwOmYzOjQ1OjdkOjQ2OjBlOmI0Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGYnpDQ0ExZWdBd0lCQWdJU0VTQ3prRlU1Zlg4MmJXVENwNTlyWTQ1bk1BMEdDU3FHU0liM0RRRUJDd1VBCk1FQXhDekFKQmdOVkJBWVRBa1pTTVJJd0VBWURWUVFLREFsUGNHVnVWSEoxYzNReEhUQWJCZ05WQkFNTUZFOXcKWlc1VWNuVnpkQ0JTYjI5MElFTkJJRWN4TUI0WERURTBNRFV5TmpBNE5EVTFNRm9YRFRNNE1ERXhOVEF3TURBdwpNRm93UURFTE1Ba0dBMVVFQmhNQ1JsSXhFakFRQmdOVkJBb01DVTl3Wlc1VWNuVnpkREVkTUJzR0ExVUVBd3dVClQzQmxibFJ5ZFhOMElGSnZiM1FnUTBFZ1J6RXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUsKQW9JQ0FRRDRlVWJhbHNVd1hvcHhBeTF3cEx1d3hRamN6ZVkxd0lDa0VTM2Q1b2V1WFQyUjBvZHNON2ZhWXA2Ygp3aVRYai9IYnBxYmZSbTlScG5ITFBoc3haMkwzRVZzMEo5VjVUb3liV0wwaUVBMWNKd3pkTU9XbzAxMGhPSFFYCi91TWZ0azg3YXkzYmZXQWZqSDFNQmNMckFSWVZtQlNPMFpCM0lqL3N3am00ZVRyd1NTVGlsWkhjWVRTU2pGUjAKNzdGOWpBSGlPSDNCWDJwZkpMS09ZaGV0ZVNDdHF4MjM0TFNXU0U5bVF4QUdGaVFENGVDY2pzWkdUNDRhbWVHUAp1WTR6YkduZVdLMmdEcWRrVkJGcFJHWlBUQktuaml4OXhOUmJ4UUEwTU1IWm1mNHl6Z2VFdEU3TkN2ODJUV0x4CnAyTlg1TnRxcDY2L0s3bko1ckluaWVWK21oeE5hTWJCR040eksxRkdTeHlPOXowTStZbzBGTVQ3TXpVajhjengKS3NlbHU3Q2l6djVUYTAxQkcyWW9zcGI2cDY0S1RyazVNMFNjZE1HVEhQamduaVFsUS9HYkk0S3EzeXdnc053MgpUZ096ZkFMVTVuc2Fxb2NUdno2aGRMdWJEdUhBazUvWHBHYkt1eHM3NHpEME0xbUtCM0lEVmVkemFnTXhibStXCkcrT2luNitTeCszMVFyY2xURHNUQk04Y2xxOGNJcVBRcXdXeVRCSWpVdHo5R1Zzbm5CNDdldjFDSTlzamdCUHcKdkZFVlZKU21kejdRZEZHOVVSUUlPVGZMSHpTcE1KMVNoQzVWa0xHNjMxVUFDOWhXTGJGSlNYS0FxV0xYd1BZWQpFUVJWelhSN3oyRndlZlI3TEZ4Y2t2emx1RnFyVEpPVm9TZnVwYjdQY1NOQ3VwdDJMUUlEQVFBQm8yTXdZVEFPCkJnTlZIUThCQWY4RUJBTUNBUVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVbDBZaFZ5RTEKMmpaVngvUHhOM0RsQ1BhVEtiWXdId1lEVlIwakJCZ3dGb0FVbDBZaFZ5RTEyalpWeC9QeE4zRGxDUGFUS2JZdwpEUVlKS29aSWh2Y05BUUVMQlFBRGdnSUJBQjNkQW1CODREV241cGg3NmtUT1owQlA4cE51WnRRNWlTYXMwMDBFClBMdUhJVDgzOUhFbDJrdTZxNWFDZ1pHMjdkbXhwR1dYNG05a1dhU1c3bURLSHlQN1Jici9qeVR3eXFreGYza2YKZ0xNdE1ycGtaMkN2dVZuTjM1cEowNmlDc2ZtWWxJck00THZnQkJ1WllMRkdaZHdJb3JKR25rU0k2cE4rVnhiUwpGWEpmTGt1cjFKMWp1T05JNWY2RUxsZ0tuME1kL3JjWWtvWkRTdzZjTW9Zc1lQWHBTT3FWN1hBcDhkVXYvVFcwClY4L2JoVWladWNKdmJJL05lSldzWkNqOVZyRERiOE8rV1ZMaFg0U1BnUEwwRFRhdGRyT2p0ZUZrZGpwWTNIMVAKWGxaczVWVlpWNlhmOFlwbU1JelVVbUk0ZDdTK0tOZktOc1NiQmZENEZkdmI4ZTgwblIxNFNvaFdaMjVnLzQvSQppK0dPdlVLcE13cFpRaElTS3ZxeG5VT09CWnVaMm1LdFZ6YXpIYllOZVMyV3VPdnlERXNNcFpUR01LY21HUzN0ClRBWlFNUEg5V0QyNVN4ZGZHYlJxaEZTME9FODVvZzJXYU1Nb2xQM3RMUjlLYTBPV0xwQUJFUHM0cG9FTDBMOTEKMDlTNXp2RS9idzRjSGpkeDVSaUhkUmsvVUxsZXBFVTByYkRLNXVVVGRnOHhGS21PTFpUVzFZVk5jeFZQUy9LeQpQdTFzdmYwT25XWnpzRDIwOTcrbzRCR2t4SzUxQ1VwakFFZ2dwc2FkQ3dtS3RPRG16ajdIUGlZNDZTdmVwZ2hKCkF3U1FpdW1QditpMnRDcWpJNDBjSExJNWtxaVBBbHhBT1hYVWMwRUNkOTdONEVPSDF1UzZTc05zRW4vK0t1WWoKMW94eAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049T3BlblRydXN0IFJvb3QgQ0EgRzIgTz1PcGVuVHJ1c3QKIyBTdWJqZWN0OiBDTj1PcGVuVHJ1c3QgUm9vdCBDQSBHMiBPPU9wZW5UcnVzdAojIExhYmVsOiAiT3BlblRydXN0IFJvb3QgQ0EgRzIiCiMgU2VyaWFsOiAxNDkyMDEyNDQ4MDQyNzAyMDk2OTg2ODc1OTg3Njc2OTM1NTczNDE1NDQxCiMgTUQ1IEZpbmdlcnByaW50OiA1NzoyNDpiNjo1OToyNDo2YjphZTpjODpmZToxYzowYzoyMDpmMjpjMDo0ZTplYgojIFNIQTEgRmluZ2VycHJpbnQ6IDc5OjVmOjg4OjYwOmM1OmFiOjdjOjNkOjkyOmU2OmNiOmY0OjhkOmUxOjQ1OmNkOjExOmVmOjYwOjBiCiMgU0hBMjU2IEZpbmdlcnByaW50OiAyNzo5OTo1ODoyOTpmZTo2YTo3NToxNTpjMTpiZjplODo0ODpmOTpjNDo3NjoxZDpiMTo2YzoyMjo1OToyOToyNTo3YjpmNDowZDowODo5NDpmMjo5ZTphODpiYTpmMgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmJ6Q0NBMWVnQXdJQkFnSVNFU0NoYVJ1L3ZibTlVcGFQSStoSXZ5WVJNQTBHQ1NxR1NJYjNEUUVCRFFVQQpNRUF4Q3pBSkJnTlZCQVlUQWtaU01SSXdFQVlEVlFRS0RBbFBjR1Z1VkhKMWMzUXhIVEFiQmdOVkJBTU1GRTl3ClpXNVVjblZ6ZENCU2IyOTBJRU5CSUVjeU1CNFhEVEUwTURVeU5qQXdNREF3TUZvWERUTTRNREV4TlRBd01EQXcKTUZvd1FERUxNQWtHQTFVRUJoTUNSbEl4RWpBUUJnTlZCQW9NQ1U5d1pXNVVjblZ6ZERFZE1Cc0dBMVVFQXd3VQpUM0JsYmxSeWRYTjBJRkp2YjNRZ1EwRWdSekl3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLCkFvSUNBUURNdGxlbE01UVFnVEpUMzJGK0QzWTV6MXpDVTNVZFNYcVdPTjJpYzJyeGI5NWVvbHE1Y1NHK050bWgKL0x6dWJLaDhOQnB4R3VnYTJGOE9SQWJ0cCtEejBtRUw0REtpbHRFNDhNTGFBUmY4NUt4UDZPNkpIblNyVDc4ZQpDYlkyYWxiejRlNldpV1lrQnVUTlFqcEszZUNhc01TQ1JiUCt5YXRjZkQ3SjZ4Y3ZESDF1cnFXUHlLd2xDbS82CjFVV1kwalVKOWdORGxQN1p2eUNWZVlDWWl0bUpOYnRSRzZRM2ZmeVpPNnYvdjZ3TmowT3htWHNXRUg0ZGIwZkUKRlk4RWxnZ0dRZ1Q0aE5ZZHZKR21RcjVKMVdxSVA3d3RVZEdlamVCU3pGZmROVFZZMjdTUEpJamtpOS9jYTFUUwpnU3V5enBKTEhCOUcraDNZa3N0Mlo3VUptUW5sckJjVVZYREdQS0JXQ2dPejNHSVozOGkxTUgvMVBDWjFFYjNYCkc3T0huZ2V2WlhIbG9NOGFwd2tRSFpPSlpsdm9QR0l5dGJVNmJ1bUZBWXVlUTR4bmN5aFpXK3ZqM0N6TXBTWnkKWWhLMDVweURSUFpScE9MQWVpUlh5ZzZsUHpxMU80dmxkdTV3NXBMZUZsd29XNWNaSjVMK2VwSlV6cE01Q2hhSAp2R096OWJHVFhPQnV0OURxK1dJeWlFVDd2eWNvdGpDVlhSSW91WlcrajFNWTVhSVlGdUpXcExJc0VQVWRONmI0CnQvYlFXVnlKOThMVnRaUjAwZFgrRzdidzV0WWVlOUk4eTZqajlSanpJUjl1NzAxb0Juc3RYVzVEaWFiQSthQy8KZ2g3UFUzKzA2eXpiWGZacWZVQWtCWEtKT0FHVHkzSENPVjBHRWZadmVQZzNEVG1FSndJREFRQUJvMk13WVRBTwpCZ05WSFE4QkFmOEVCQU1DQVFZd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVWFqbjZRaUwzCjVva0FUVjU5TTRQTHVHNTNocTh3SHdZRFZSMGpCQmd3Rm9BVWFqbjZRaUwzNW9rQVRWNTlNNFBMdUc1M2hxOHcKRFFZSktvWklodmNOQVFFTkJRQURnZ0lCQUpqTHEwQTg1VE1DbDM4dGg2YVAxRjVLcjdnZTU3dHgrNEJrSmFtegpHajVvWFNjbXA3b3E0ZkJYZ3dwa1R4NGlkQnZwa0Yvd3JNLy9UMmg2T0tRUWJBMnh4NlIzZ0JpMm9paEVkcWMwCm5YR0VMOHBaMGtlSW1VRWl5VENZWVc0OXFLZ0ZiZEVmd0ZGRVZuOG5OUUxkWHBnS1F1c3d2NDJobTFHcU8rcVQKUm1URkFIbmVJV3YyVjZDRzF3Wnk3SEJHUzR0ejNhQWhkVDdjSGNDUDAwOXpISVhaL245aXlKVnZ0dE43akxwVAp3bStiUkV4NTBCMXdzOWVmQXZTeUI3REg1Zml0SXc2bVZza3BFbmRJMlM5Ry9UdncvSFJ3a3FXT09BZ2ZaREMyCnQwdjdOcXdRanFCU00yT2RBelZXeFdtOXhpTmFKNVQycEJMNExUTThvVmFsWDlZWjZlMThDTDEzelNka3pKVGEKVGtaUWgrRDV3Vk9BSHJ1dCswZFNpeHY5b3ZuZURpSzNQVE5aYk5UZTlaVUdNZzFSR1VGY1BrOEc5N2tyZ0NmMgpvNnA2ZkFiaFE4TVRPV0lhTnIzZ0tDNlVBdVFwTG1CVnJrQTlzSFNTWHZBZ1pKWS9YMFZkaUxXSzJnS2dXMFZVCjNqZzlDY0NvU21WR0Z2eXF2MVJPVFZ1K09FTzNLTXFMTTZvYUpib2xYQ2t2VzBwdWpPb3RuQ3IyQlhiZ2Q1ZUEKaU4xbkUyOGRhQ1NMVDdkMGdlWDBZSjk2VmRjK045b1dhejUzcks0WWNKVUllU2tEaXY3Qk83TS9HZytrTzE0ZgpXS0dWeWFzdmMwclFMVzZhV1E5VkdIZ3RQRkdtbDR2bXU3Sndxa3dSM3Y5OEt6ZlVldEYzTkkvbitVTDNQSUVNClMxSUsKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPU9wZW5UcnVzdCBSb290IENBIEczIE89T3BlblRydXN0CiMgU3ViamVjdDogQ049T3BlblRydXN0IFJvb3QgQ0EgRzMgTz1PcGVuVHJ1c3QKIyBMYWJlbDogIk9wZW5UcnVzdCBSb290IENBIEczIgojIFNlcmlhbDogMTQ5MjEwNDkwODI3MTQ4NTY1MzA3MTIxOTk0MTg2NDE3MTE3MDQ1NTYxNQojIE1ENSBGaW5nZXJwcmludDogMjE6Mzc6YjQ6MTc6MTY6OTI6N2I6Njc6NDY6NzA6YTk6OTY6ZDc6YTg6MTM6MjQKIyBTSEExIEZpbmdlcnByaW50OiA2ZToyNjo2NDpmMzo1NjpiZjozNDo1NTpiZjpkMTo5MzozZjo3YzowMTpkZTpkODoxMzpkYTo4YTphNgojIFNIQTI1NiBGaW5nZXJwcmludDogYjc6YzM6NjI6MzE6NzA6NmU6ODE6MDc6OGM6MzY6N2M6Yjg6OTY6MTk6OGY6MWU6MzI6MDg6ZGQ6OTI6Njk6NDk6ZGQ6OGY6NTc6MDk6YTQ6MTA6Zjc6NWI6NjI6OTIKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNJVENDQWFhZ0F3SUJBZ0lTRVNEbStFejhKTEMrQlVDczJvTWJOR0EvTUFvR0NDcUdTTTQ5QkFNRE1FQXgKQ3pBSkJnTlZCQVlUQWtaU01SSXdFQVlEVlFRS0RBbFBjR1Z1VkhKMWMzUXhIVEFiQmdOVkJBTU1GRTl3Wlc1VQpjblZ6ZENCU2IyOTBJRU5CSUVjek1CNFhEVEUwTURVeU5qQXdNREF3TUZvWERUTTRNREV4TlRBd01EQXdNRm93ClFERUxNQWtHQTFVRUJoTUNSbEl4RWpBUUJnTlZCQW9NQ1U5d1pXNVVjblZ6ZERFZE1Cc0dBMVVFQXd3VVQzQmwKYmxSeWRYTjBJRkp2YjNRZ1EwRWdSek13ZGpBUUJnY3Foa2pPUFFJQkJnVXJnUVFBSWdOaUFBUks3bGl1VGNwbQozZ1k2b3hIODRCandiaHk2TFRBTWlkblc3cHR6ZzZrakZZd3ZXWXBhM1JUcW5Wa3JRN2NHN0RLMnV1NUJ0YTFkCm9ZWE02aDBVWnFObmZrYmlsUFBudGxhaEZWbWhUemVYdVNJZXZSSHI5TElmWHNNVW11WFpsNW1qWXpCaE1BNEcKQTFVZER3RUIvd1FFQXdJQkJqQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01CMEdBMVVkRGdRV0JCUkhkOE1VaTJJNQpETWx2NFZCTjBCQlkzSldJYlRBZkJnTlZIU01FR0RBV2dCUkhkOE1VaTJJNURNbHY0VkJOMEJCWTNKV0liVEFLCkJnZ3Foa2pPUFFRREF3TnBBREJtQWpFQWo2amNuYm9NQkJmNkZlazlMeWtCbDcrQkZqTkFrMno4K2UyQWNHK3EKajl1RXdvdjFOY29HM0dSdmFCYmhqNUc1QWpFQTJFdWx5OExRQ0d6cEdQdGEzVTFmSkF1d0FDRWw3NCtuQkNaeAo0bnhwNVYyYStFRWZPem1UazUxVjZzMk44ZnZCCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1JU1JHIFJvb3QgWDEgTz1JbnRlcm5ldCBTZWN1cml0eSBSZXNlYXJjaCBHcm91cAojIFN1YmplY3Q6IENOPUlTUkcgUm9vdCBYMSBPPUludGVybmV0IFNlY3VyaXR5IFJlc2VhcmNoIEdyb3VwCiMgTGFiZWw6ICJJU1JHIFJvb3QgWDEiCiMgU2VyaWFsOiAxNzI4ODY5Mjg2Njk3OTA0NzYwNjQ2NzAyNDM1MDQxNjkwNjExMjAKIyBNRDUgRmluZ2VycHJpbnQ6IDBjOmQyOmY5OmUwOmRhOjE3OjczOmU5OmVkOjg2OjRkOmE1OmUzOjcwOmU3OjRlCiMgU0hBMSBGaW5nZXJwcmludDogY2E6YmQ6MmE6Nzk6YTE6MDc6NmE6MzE6ZjI6MWQ6MjU6MzY6MzU6Y2I6MDM6OWQ6NDM6Mjk6YTU6ZTgKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDk2OmJjOmVjOjA2OjI2OjQ5Ojc2OmYzOjc0OjYwOjc3OjlhOmNmOjI4OmM1OmE3OmNmOmU4OmEzOmMwOmFhOmUxOjFhOjhmOmZjOmVlOjA1OmMwOmJkOmRmOjA4OmM2Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGYXpDQ0ExT2dBd0lCQWdJUkFJSVF6N0RTUU9OWlJHUGd1Mk9DaXdBd0RRWUpLb1pJaHZjTkFRRUxCUUF3ClR6RUxNQWtHQTFVRUJoTUNWVk14S1RBbkJnTlZCQW9USUVsdWRHVnlibVYwSUZObFkzVnlhWFI1SUZKbGMyVmgKY21Ob0lFZHliM1Z3TVJVd0V3WURWUVFERXd4SlUxSkhJRkp2YjNRZ1dERXdIaGNOTVRVd05qQTBNVEV3TkRNNApXaGNOTXpVd05qQTBNVEV3TkRNNFdqQlBNUXN3Q1FZRFZRUUdFd0pWVXpFcE1DY0dBMVVFQ2hNZ1NXNTBaWEp1ClpYUWdVMlZqZFhKcGRIa2dVbVZ6WldGeVkyZ2dSM0p2ZFhBeEZUQVRCZ05WQkFNVERFbFRVa2NnVW05dmRDQlkKTVRDQ0FpSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUJBSzNvSkhQMEZEZnptNTRyVnlnYwpoNzdjdDk4NGtJeHVQT1pYb0hqM2RjS2kvdlZxYnZZQVR5amIzbWlHYkVTVHRyRmovUlFTYTc4ZjB1b3hteUYrCjBUTTh1a2oxM1huZnM3ai9FdkVobWt2QmlvWnhhVXBtWm15UGZqeHd2NjBwSWdiejVNRG1nSzdpUzQrM21YNlUKQTUvVFI1ZDhtVWdqVStnNHJrOEtiNE11MFVsWGpJQjB0dG92MERpTmV3TndJUnQxOGpBOCtvK3UzZHBqcStzVwpUOEtPRVV0K3p3dm8vN1YzTHZTeWUwcmdUQklsREhDTkF5bWc0Vk1rN0JQWjdobS9FTE5LakQrSm8yRlIzcXlICkI1VDBZM0hzTHVKdlc1aUI0WWxjTkhsc2R1ODdrR0o1NXR1a21pOG14ZEFRNFE3ZTJSQ09GdnUzOTZqM3grVUMKQjVpUE5naVY1K0kzbGcwMmRaNzdEbkt4SFp1OEEvbEpCZGlCM1FXMEt0WkI2YXdCZHBVS0Q5amYxYjBTSHpVdgpLQmRzMHBqQnFBbGtkMjVITjdyT3JGbGVhSjEvY3RhSnhRWkJLVDVaUHQwbTlTVEpFYWRhbzB4QUgwYWhtYlduCk9sRnVoanVlZlhLbkVnVjRXZTArVVhnVkN3T1BqZEF2QmJJK2Uwb2NTM01GRXZ6RzZ1QlFFM3hEazNTenluVG4Kamg4QkNOQXcxRnR4TnJRSHVzRXdNRnhJdDRJN21LWjlZSXFpb3ltQ3pMcTlnd1Fib29NRFFhSFdCZkVid3JidwpxSHlHTzBhb1NDcUkzSGFhZHI4ZmFxVTlHWS9yT1BOazNzZ3JEUW9vLy9mYjRoVkMxQ0xRSjEzaGVmNFk1M0NJCnJVN20yWXM2eHQwblVXNy92R1QxTTBOUEFnTUJBQUdqUWpCQU1BNEdBMVVkRHdFQi93UUVBd0lCQmpBUEJnTlYKSFJNQkFmOEVCVEFEQVFIL01CMEdBMVVkRGdRV0JCUjV0Rm5tZTdibDVBRnpnQWlJeUJwWTl1bWJiakFOQmdrcQpoa2lHOXcwQkFRc0ZBQU9DQWdFQVZSOVlxYnl5cUZEUURMSFlHbWtnSnlrSXJHRjFYSXB1K0lMbGFTL1Y5bFpMCnViaHpFRm5USVpkKzUweHgrN0xTWUswNXFBdnFGeUZXaGZGUURsbnJ6dUJaNmJySkZlK0duWStFZ1BiazZaR1EKM0JlYllodEY4R2FWMG54dnd1bzc3eC9QeTlhdUovR3BzTWl1L1gxK212b2lCT3YvMlgvcWtTc2lzUmNPai9LSwpORnRZMlB3QnlWUzV1Q2JNaW9nemlVd3RoRHlDMys2V1Z3VzZMTHYzeExmSFRqdUN2akhJSW5Oemt0SENnS1E1Ck9SQXpJNEpNUEorR3NsV1lIYjRwaG93aW01N2lhenRYT29Kd1Rkd0p4NG5MQ2dkTmJPaGRqc252enF2SHU3VXIKVGtYV1N0QW16T1Z5eWdocXBaWGpGYUgzcE8zSkxGK2wrLytzS0FJdXZ0ZDd1K054ZTVBVzB3ZGVSbE44TndkQwpqTlBFbHB6Vm1iVXE0SlVhZ0VpdVREa0h6c3hIcEZLVks3cTQrNjNTTTFOOTVSMU5iZFdoc2NkQ2IrWkFKelZjCm95aTNCNDNualRPUTV5T2YrMUNjZVd4RzFiUVZzNVp1ZnBzTWxqcTRVaTAvMWx2aCt3akNoUDRrcUtPSjJxeHEKNFJncXNhaERZVnZUSDl3N2pYYnlMZWlOZGQ4WE0ydzlVL3Q3eTBGZi85eWkwR0U0NFphNHJGMkxOOWQxMVRQQQptUkd1blVIQmNuV0V2Z0pCUWw5bkpFaVUwWnNudmdjL3ViaFBnWFJSNFhxMzdaMGo0cjdnMVNnRUV6d3hBNTdkCmVteVB4Z2NZeG4vZVI0NC9LSjRFQnMrbFZEUjN2ZXlKbStrWFE5OWIyMS8ramg1WG9zMUFuWDVpSXRyZUdDYz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IE89Rk5NVC1SQ00gT1U9QUMgUkFJWiBGTk1ULVJDTQojIFN1YmplY3Q6IE89Rk5NVC1SQ00gT1U9QUMgUkFJWiBGTk1ULVJDTQojIExhYmVsOiAiQUMgUkFJWiBGTk1ULVJDTSIKIyBTZXJpYWw6IDQ4NTg3NjMwODIwNjQ0ODgwNDcwMTU1NDY4Mjc2MDU1NDc1OQojIE1ENSBGaW5nZXJwcmludDogZTI6MDk6MDQ6YjQ6ZDM6YmQ6ZDE6YTA6MTQ6ZmQ6MWE6ZDI6NDc6YzQ6NTc6MWQKIyBTSEExIEZpbmdlcnByaW50OiBlYzo1MDozNTowNzpiMjoxNTpjNDo5NTo2MjoxOTplMjphODo5YTo1Yjo0Mjo5OToyYzo0YzoyYzoyMAojIFNIQTI1NiBGaW5nZXJwcmludDogZWI6YzU6NTc6MGM6Mjk6MDE6OGM6NGQ6Njc6YjE6YWE6MTI6N2I6YWY6MTI6Zjc6MDM6YjQ6NjE6MWU6YmM6MTc6Yjc6ZGE6YjU6NTc6Mzg6OTQ6MTc6OWI6OTM6ZmEKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZnekNDQTJ1Z0F3SUJBZ0lQWFpPTk1HYzJ5QVlkR3NkVWhHa0hNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1Ec3gKQ3pBSkJnTlZCQVlUQWtWVE1SRXdEd1lEVlFRS0RBaEdUazFVTFZKRFRURVpNQmNHQTFVRUN3d1FRVU1nVWtGSgpXaUJHVGsxVUxWSkRUVEFlRncwd09ERXdNamt4TlRVNU5UWmFGdzB6TURBeE1ERXdNREF3TURCYU1Ec3hDekFKCkJnTlZCQVlUQWtWVE1SRXdEd1lEVlFRS0RBaEdUazFVTFZKRFRURVpNQmNHQTFVRUN3d1FRVU1nVWtGSldpQkcKVGsxVUxWSkRUVENDQWlJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFMcHhnSHBNaG01Lwp5Qk50d01aOUhBQ1hqeXdNSTdzUW1rQ3BHcmVIaVBpYlZtcjc1bnVPaTVLT3B5VmRXUkhiTmk2M1VSY2ZxUWdmCkJCY2tXS28zU2hqZjVUblVWLzNYd1N5UkFaSGlJdFFEd0ZqOGQwZnNqejUwUTdxc05JMU5PSFpuanJESWJ6QXoKV0hGY3RQVnJidFFCVUxnVGZteEtvMG5SSUJudXZNQXBHR1duM3Y3djNRcVFJZWNhWjVKQ0VKaGZUekM4UGh4Rgp0QkRYYUVBVXdFRDY1M2NYZXVZTGoyVmJQTm1hVXR1MXZaNUd6ejNya1FVQ3dKYXlka3hORUpZN2t2cWNmdytaCjM3NGpOVVVlQWx6K3RhaWJtU1hhWHZNaXd6bjE1Q291MDhZZnhHeXF4UnhxQVFWS0w5TEZ3YWcwSmwxbXBkSUMKSWZrWXR3YjFUcGx2cUt0TVVlalBVQmpGZDhnNUNTeEpraktacUxzWEYzbXdXc1htbzhSWlpVYzFnMTZwNkRVTAptYnZrelNER20wb0dPYlZvL0NLNjdsV01LMDdxODdIai9MYVptdFZDK25GTkNNK0hIbXB4ZmZuVHRPbWxjWUY3CndrNUhscVgyZG9XaktJL3BnRzZCVTZWdFg3aEkrY0w1TnFZdVNmKzRsc0tNQjdPYmlGajg2eHNjM2kxdzRwZVMKTUtHSjQ3eFZxQ2ZXUysyUXJZdjZZeVZaTGFnMTNjcVhNN3psemNlZDBlenZYZzVLa0FZbVk2MjUyVFV0QjdwMgpaU3lzVjQ5OTlBZVUxNEVDbGwyakIwblZldEJYK1J2blUwWjFxckI1UXN0b2NRanBZTDA1YWM3MHI4TldRTWV0ClVxSUo1RytHUjRvZjZ5Z25YWU1ncndUSmJGYWFpMGIxQWdNQkFBR2pnWU13Z1lBd0R3WURWUjBUQVFIL0JBVXcKQXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DQVFZd0hRWURWUjBPQkJZRUZQZDl4ZjNFNkpvYmQyU245UjJnekwrSApZSnB0TUQ0R0ExVWRJQVEzTURVd013WUVWUjBnQURBck1Da0dDQ3NHQVFVRkJ3SUJGaDFvZEhSd09pOHZkM2QzCkxtTmxjblF1Wm01dGRDNWxjeTlrY0dOekx6QU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FnRUFCNUJLMy9NalR2REQKbkZGbG01d2lvb29NaGZOektXdE4vZ0hpcVF4akFiOEVaNldkbUYvOUFSUDY3SnBpNlliK3RtTFNia3lVKzhCMQpSWHhsRFBpeU44K3NEOCtOYi9rWjk0L3NIdkp3bnZES3VPKzMvM1kzZGx2MmJvanpyMkl5SXBNTk9tcU9GR1lNCkxWTjBWMlVlMWJMZEk0RTdwV1lqSjJjSmorRjNxa1BOWlZFSTdWRlkvdVk1K2N0SGhLUVY4WGE3cE82a084UmYKNzdJemxoRVl0OGxsdmhqaG82VGMraGo1MDd3VG16bDZOTHJUUWZ2Nk1vb3F0eXVHQzJtRE9MN05paTRMY0syTgpKcEx1SHZVQkt3cloxcGViYnVDb0dSdzZJWXNNSGtDdEErZmRabjcxdVNBTkEraVcrWUpGMURuZ29BQmQxNWptCmZaNW5jOE9hS3Zlcmk2RTZGTzgwdkZJT2laaWFCRUNFSFg1RmFaTlh6dXZPK0ZCOFR4eHVCRU9iK2RZN0l4anAKNm83UlRVYU44VHZrYXNxNit5TzNtL3FaQVNsYVdGb3Q0L25VYlE0bXJjRnVOTHd5K0F3RittV2oyenMzZ3lMcAoxdHh5TS8xZDhpQzlkandqMmlqMytSdnJXV1RWM0Y5eWZpRDh6WW0xa0dkTlluby9UcTBkd3puK2V2UW9GdDlCCjlraUFCZGNQVVhtc0VLdlU3QU5tNW1xd3VqR1NRa0JxdmpyVGN1RnFOMVc4ckIyVnQybGg4a09SZE9hZzB3b2sKUnFFSXI5YmFSUm1XMUZNZFc0UjU4TUQzUisrTGo4VUdycDFNWXAzL1JnVDQwOG0yRUNWQWRmNFdxc2xLWUlZdgp1dTh3ZCtSVTRyaUVtVmlBcWhPTFVUcFBTUGFMdHJNPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049QW1hem9uIFJvb3QgQ0EgMSBPPUFtYXpvbgojIFN1YmplY3Q6IENOPUFtYXpvbiBSb290IENBIDEgTz1BbWF6b24KIyBMYWJlbDogIkFtYXpvbiBSb290IENBIDEiCiMgU2VyaWFsOiAxNDMyNjY5Nzg5MTY2NTU4NTY4NzgwMzQ3MTIzMTcyMzAwNTQ1MzgzNjk5OTQKIyBNRDUgRmluZ2VycHJpbnQ6IDQzOmM2OmJmOmFlOmVjOmZlOmFkOjJmOjE4OmM2Ojg4OjY4OjMwOmZjOmM4OmU2CiMgU0hBMSBGaW5nZXJwcmludDogOGQ6YTc6Zjk6NjU6ZWM6NWU6ZmM6Mzc6OTE6MGY6MWM6NmU6NTk6ZmQ6YzE6Y2M6NmE6NmU6ZGU6MTYKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDhlOmNkOmU2Ojg4OjRmOjNkOjg3OmIxOjEyOjViOmEzOjFhOmMzOmZjOmIxOjNkOjcwOjE2OmRlOjdmOjU3OmNjOjkwOjRmOmUxOmNiOjk3OmM2OmFlOjk4OjE5OjZlCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEUVRDQ0FpbWdBd0lCQWdJVEJteWZ6NW0vakFvNTR2QjRpa1BtbGpaYnlqQU5CZ2txaGtpRzl3MEJBUXNGCkFEQTVNUXN3Q1FZRFZRUUdFd0pWVXpFUE1BMEdBMVVFQ2hNR1FXMWhlbTl1TVJrd0Z3WURWUVFERXhCQmJXRjYKYjI0Z1VtOXZkQ0JEUVNBeE1CNFhEVEUxTURVeU5qQXdNREF3TUZvWERUTTRNREV4TnpBd01EQXdNRm93T1RFTApNQWtHQTFVRUJoTUNWVk14RHpBTkJnTlZCQW9UQmtGdFlYcHZiakVaTUJjR0ExVUVBeE1RUVcxaGVtOXVJRkp2CmIzUWdRMEVnTVRDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTEo0Z0hIS2VOWGoKY2E5SGdGQjBmVzdZMTRoMjlKbG85MWdoWVBsMGhBRXZyQUl0aHRPZ1EzcE9zcVRRTnJvQnZvM2JTTWdIRnpaTQo5TzZJSThjKzZ6ZjF0Um40U1dpdzN0ZTVkamdkWVo2ay9vSTJwZVZLVnVSRjRmbjl0QmI2ZE5xY216VTVML3F3CklGQUdiSHJRZ0xLbSthL3NSeG1QVURnSDNLS0hPVmo0dXRXcCtVaG5NSmJ1bEhoZWI0bWpVY0F3aG1haFJXYTYKVk91anc1SDVTTnovMGVnd0xYMHRkSEExMTRnazk1N0VXVzY3YzRjWDhqSkdLTGhEK3JjZHFzcTA4cDhrRGkxTAo5M0ZjWG1uLzZwVUN5emlLcmxBNGI5djdMV0lieGNjZVZPRjM0R2ZJRDV5SEk5WS9RQ0IvSUlERWdFdytPeVFtCmpnU3ViSnJJcWcwQ0F3RUFBYU5DTUVBd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUMKQVlZd0hRWURWUjBPQkJZRUZJUVl6SVUwN0x3TWxKUXVDRm1jeDdJUVRnb0lNQTBHQ1NxR1NJYjNEUUVCQ3dVQQpBNElCQVFDWThqZGFRWkNoR3NWMlVTZ2dOaU1PcnVZb3U2cjRsSzVJcERCL0cvd2tqVXUweUtHWDlyYnhlbkRJClU1UE1DQ2pqbUNYUEk2VDUzaUhUZklVSnJVNmFkVHJDQzJxSmVIWkVSeGhsYkkxQmpqdC9tc3YwdGFkUTF3VXMKTitnRFM2M3BZYUFDYnZYeThNV3k3VnUzM1BxVVhIZWVFNlYvVXEyVjh2aVRPOTZMWEZ2S1dsSmJZSzhVOTB2dgpvL3VmUUpWdE1WVDhRdFBIUmg4anJka1BTSENhMlhWNGNkRnlRelIxYmxkWndnSmNKbUFwenlNWkZvNklRNlhVCjVNc0kreU1SUStoREtYSmlvYWxkWGdqVWtLNjQyTTRVd3RCVjhvYjJ4Sk5EZDJaaHdMbm9RZGVYZUdBRGJrcHkKcnFYUmZib1Fub1pzRzRxNVdUUDQ2OFNRdnZHNQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049QW1hem9uIFJvb3QgQ0EgMiBPPUFtYXpvbgojIFN1YmplY3Q6IENOPUFtYXpvbiBSb290IENBIDIgTz1BbWF6b24KIyBMYWJlbDogIkFtYXpvbiBSb290IENBIDIiCiMgU2VyaWFsOiAxNDMyNjY5ODI4ODU5NjM1NTE4MTgzNDkxNjA2NTg5MjUwMDY5NzA2NTMyMzkKIyBNRDUgRmluZ2VycHJpbnQ6IGM4OmU1OjhkOmNlOmE4OjQyOmUyOjdhOmMwOjJhOjVjOjdjOjllOjI2OmJmOjY2CiMgU0hBMSBGaW5nZXJwcmludDogNWE6OGM6ZWY6NDU6ZDc6YTY6OTg6NTk6NzY6N2E6OGM6OGI6NDQ6OTY6YjU6Nzg6Y2Y6NDc6NGI6MWEKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDFiOmE1OmIyOmFhOjhjOjY1OjQwOjFhOjgyOjk2OjAxOjE4OmY4OjBiOmVjOjRmOjYyOjMwOjRkOjgzOmNlOmM0OjcxOjNhOjE5OmMzOjljOjAxOjFlOmE0OjZkOmI0Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGUVRDQ0F5bWdBd0lCQWdJVEJteWYwcFkxaHA4S0QrV0dlUGhiSnJ1S056QU5CZ2txaGtpRzl3MEJBUXdGCkFEQTVNUXN3Q1FZRFZRUUdFd0pWVXpFUE1BMEdBMVVFQ2hNR1FXMWhlbTl1TVJrd0Z3WURWUVFERXhCQmJXRjYKYjI0Z1VtOXZkQ0JEUVNBeU1CNFhEVEUxTURVeU5qQXdNREF3TUZvWERUUXdNRFV5TmpBd01EQXdNRm93T1RFTApNQWtHQTFVRUJoTUNWVk14RHpBTkJnTlZCQW9UQmtGdFlYcHZiakVaTUJjR0ExVUVBeE1RUVcxaGVtOXVJRkp2CmIzUWdRMEVnTWpDQ0FpSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUJBSzJXbnkyY1NreEsKZ1hsUm1leUt5MnRnVVJPOFRXMEcvTEFJamQwWkVHckhKZ3cxMk1CdklJVHBsTEdiaFFQRFc5dEs2TWo0a0hiWgpXMC9qVE9nR05rM01tcXc5REpBcmt0UUdHV0NzTjBSNWhZR0NyVm8zNEEzTW5hWk1VbmJxUTUyM0JORlE5bFhnCjFkS21TWVhwTituS2ZxNWNsVTFJbWordUlGcHRpSlhaTkxoU0drT1FzTDlzQmJtMmVMZnEwT1E2UEJKVFl2OUsKOG51K05RV3BFalRqODJSMFlpdzlBRWxhS1A0eVJMdUgzV1VuQW5FNzJrcjNIOXJOOXlGVmtFOFA3SzZDNFo5cgoyVVhUdS9CZmgrMDhMRG1HMmovZTdISlY2M21qcmR2ZGZMQzZITTc4M2s4MWRzOFArSGdmYWpaUlJpZGhXK21lCnovQ2lWWDE4Sllwdkw3VEZ6NFF1Sy8wTlVSQnMrMThidkJ0K3hhNDdtQUV4a3Y4TFYvU2FzcmxYNmF2dkRYYlIKOE83MHpvYW40RzdwdEdtaDMybjJNOFpwTHBjVG5xV0hzRmNRZ1RmSlU3TzdmL2FTMFp6UUdQU1NidHFEVDZaagptVXlsKzE3dklXUjZJRjlzWklVVnl6ZnBZZ3dMS2hiY0FTNHkyajVMOVo0NjloZEFsTytla1FpRytyNWpxRm96CjdNdDBRNVg1YkdsU05zY3BiL3hWQTF3Zis1KzlSK3ZuU1VlVkMwNkpJZ2xKNFBWaEh2Ry9Mb3B5Ym9CWi8xYzYKK1hVeW8wNWY3TzBvWXRsTmMvTE1nUmRnN2MzcjNOdW55c1YrQXIzeVZBaFUvYlF0Q1N3WFZFcVkwVlRoVVdjSQowdTF1Zm04LzBpMkJXU2xteTVBNWxSRWVkQ2YrM2V1dkFnTUJBQUdqUWpCQU1BOEdBMVVkRXdFQi93UUZNQU1CCkFmOHdEZ1lEVlIwUEFRSC9CQVFEQWdHR01CMEdBMVVkRGdRV0JCU3dEUEJNTVBRRldBSkkvVFBsVXE5TGhPTm0KVWpBTkJna3Foa2lHOXcwQkFRd0ZBQU9DQWdFQXFxaUFqdzU0bytDaTFNM205Wmg2TytvQUE3Q1hEcE84V3FqMgpMSXh5aDZteC9IOXovV054ZUtXSFdjOHc0UTBRc2hOYWJZTDFhdWFBbjZBRkMyamtSMnZIYXQrMi9YY3ljdVVZCitnbjBvSk1zWGRLTWRZVjJaWkFNQTNtM01TTmpyWGlEQ1lab2hNci8rYzhtbXBKNTU4MUx4ZWRocHhmTDg2a1MKazVOcnArZ3ZVNUxFWUZpd3pBSlJHRnVGaldKWlk3YXR0TjZhK3liM0FDZkFYVlUzZEpuSlVIL2pXUzVFNHl3bAo3dXhNTW5lMG54cnBTMTBneGRyOUhJY1d4a1BvMUxzbW1rVndYcWtMTjFQaVJuc24vZUJHOG9tM3pFSzJ5eWdtCmJ0bWx5VHJJUVJOZzkxQ01GYTZ5YlJvVkdsZDQ1cElxMldXUWdqOXNBcSt1RWpvbmxqWUUxeDJpZ0dPcG0vSGwKdXJSOEZMQk95YkVmZEY4NDlsSHFtL29zb2hIVXFTMG5Ha1d4cjdKT2NRM0FXRWJXYVFiTFU4dXovbXRCelVGKwpmVXdQZkhKNWVsbk5Ya29Pckp1cG1ITjVmTFQwekxtNEJ3eXlkRnk0eDIrSW9aQ245S3I1djJjNjlCb1ZZaDYzCm43NDlzU212WjZFUzhsZ1FHVk1ETUJ1NEdvbjJuTDJYQTQ2akNmTWRpeUh4dE4va0hOR2ZaUUlHNmx6V0U3T0UKNzZLbFhJeDNLYWRvd0d1dVFOS290T3JOOEkxTE9Kd1ptaHNvVkxpSmtPL0tkWUUrSHZKa0pNY1lyMDcvUjU0SAo5alZscE5NS1Z2LzFGMlJzNzZnaUpVbVR0dDhBRjlwWWZsM3V4UnV3MGRGZklSREgrZk82QWdvbkI4WHgxc2ZUCjRQc0pZR3c9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1BbWF6b24gUm9vdCBDQSAzIE89QW1hem9uCiMgU3ViamVjdDogQ049QW1hem9uIFJvb3QgQ0EgMyBPPUFtYXpvbgojIExhYmVsOiAiQW1hem9uIFJvb3QgQ0EgMyIKIyBTZXJpYWw6IDE0MzI2Njk4NjY5OTA5MDc2NjI5NDcwMDYzNTM4MTIzMDkzNDc4ODY2NTkzMAojIE1ENSBGaW5nZXJwcmludDogYTA6ZDQ6ZWY6MGI6Zjc6YjU6ZDg6NDk6OTU6MmE6ZWM6ZjU6YzQ6ZmM6ODE6ODcKIyBTSEExIEZpbmdlcnByaW50OiAwZDo0NDpkZDo4YzozYzo4YzoxYToxYTo1ODo3NTo2NDo4MTplOTowZjoyZToyYTpmZjpiMzpkMjo2ZQojIFNIQTI1NiBGaW5nZXJwcmludDogMTg6Y2U6NmM6ZmU6N2I6ZjE6NGU6NjA6YjI6ZTM6NDc6Yjg6ZGY6ZTg6Njg6Y2I6MzE6ZDA6MmU6YmI6M2E6ZGE6Mjc6MTU6Njk6ZjU6MDM6NDM6YjQ6NmQ6YjM6YTQKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJ0akNDQVZ1Z0F3SUJBZ0lUQm15ZjFYU1hObVkvT3d1YTJlaWVkZ1B5U2pBS0JnZ3Foa2pPUFFRREFqQTUKTVFzd0NRWURWUVFHRXdKVlV6RVBNQTBHQTFVRUNoTUdRVzFoZW05dU1Sa3dGd1lEVlFRREV4QkJiV0Y2YjI0ZwpVbTl2ZENCRFFTQXpNQjRYRFRFMU1EVXlOakF3TURBd01Gb1hEVFF3TURVeU5qQXdNREF3TUZvd09URUxNQWtHCkExVUVCaE1DVlZNeER6QU5CZ05WQkFvVEJrRnRZWHB2YmpFWk1CY0dBMVVFQXhNUVFXMWhlbTl1SUZKdmIzUWcKUTBFZ016QlpNQk1HQnlxR1NNNDlBZ0VHQ0NxR1NNNDlBd0VIQTBJQUJDbVhwOFpCZjhBTm0rZ0JHMWJHOGxLbAp1aTJ5RXVqU0x0ZjZ5Y1hZcW0wZmM0RTdPNWhyT1h3enBjVk9obzZBRjJoaVJWZDlSRmdkc3pmbFp3anJadDZqClFqQkFNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEZ1lEVlIwUEFRSC9CQVFEQWdHR01CMEdBMVVkRGdRV0JCU3IKdHR2WEJwNDNyRENHQjVGd3g1ekVHYkY0d0RBS0JnZ3Foa2pPUFFRREFnTkpBREJHQWlFQTRJV1NveGUzamZrcgpCcVdUckJxWWFHRnkrdUdoMFBzY2VHQ21RNW5GdU1RQ0lRQ2NBdS94bEp5emx2bnJ4aXI0dGl6K09wQVVGdGVNCll5UklITjh3ZmRWb093PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUFtYXpvbiBSb290IENBIDQgTz1BbWF6b24KIyBTdWJqZWN0OiBDTj1BbWF6b24gUm9vdCBDQSA0IE89QW1hem9uCiMgTGFiZWw6ICJBbWF6b24gUm9vdCBDQSA0IgojIFNlcmlhbDogMTQzMjY2OTg5NzU4MDgwNzYzOTc0MTA1MjAwNjMwNzYzODc3ODQ5Mjg0ODc4CiMgTUQ1IEZpbmdlcnByaW50OiA4OTpiYzoyNzpkNTplYjoxNzo4ZDowNjo2YTo2OTpkNTpmZDo4OTo0NzpiNDpjZAojIFNIQTEgRmluZ2VycHJpbnQ6IGY2OjEwOjg0OjA3OmQ2OmY4OmJiOjY3Ojk4OjBjOmMyOmUyOjQ0OmMyOmViOmFlOjFjOmVmOjYzOmJlCiMgU0hBMjU2IEZpbmdlcnByaW50OiBlMzo1ZDoyODo0MTo5ZTpkMDoyMDoyNTpjZjphNjo5MDozODpjZDo2MjozOTo2Mjo0NTo4ZDphNTpjNjo5NTpmYjpkZTphMzpjMjoyYjowYjpmYjoyNTo4OTo3MDo5MgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQjhqQ0NBWGlnQXdJQkFnSVRCbXlmMThHN0VFd3BRK1Z4ZTNzc3lCckJEakFLQmdncWhrak9QUVFEQXpBNQpNUXN3Q1FZRFZRUUdFd0pWVXpFUE1BMEdBMVVFQ2hNR1FXMWhlbTl1TVJrd0Z3WURWUVFERXhCQmJXRjZiMjRnClVtOXZkQ0JEUVNBME1CNFhEVEUxTURVeU5qQXdNREF3TUZvWERUUXdNRFV5TmpBd01EQXdNRm93T1RFTE1Ba0cKQTFVRUJoTUNWVk14RHpBTkJnTlZCQW9UQmtGdFlYcHZiakVaTUJjR0ExVUVBeE1RUVcxaGVtOXVJRkp2YjNRZwpRMEVnTkRCMk1CQUdCeXFHU000OUFnRUdCU3VCQkFBaUEySUFCTktyaWpkUG8xTU4vc0dLZTB1b2UwWkxZN0JpCjlpMGIyd2h4SWRJQTZHTzltaWY3OERsdVhlbzlwY21CcXFOYklKaEZYUmJiL2VnUWJlT2M0T085WDRSaTgzQmsKTTZETEpDOXd1b2loS3FCMStJR3VZZ2JFZ2RzNWJpbXdIdm91WEtOQ01FQXdEd1lEVlIwVEFRSC9CQVV3QXdFQgovekFPQmdOVkhROEJBZjhFQkFNQ0FZWXdIUVlEVlIwT0JCWUVGTlBzeHpwbGJzemgybmFhVnZ1Yzg0WnRWK1dCCk1Bb0dDQ3FHU000OUJBTURBMmdBTUdVQ01EcUxJZkc5ZmhHdDBPOVlsaS9XNjUxK2tJMHJ6MlpWd3l6aktLbHcKQ2tjTzhEZFpFdjh0bVpRb1RpcFBOVTB6V2dJeEFPcDFBRTQ3eERxVUVwSEpXRWFkSVJOeXA0aWNpdVJNU3R1VwoxS3lMYTJ0SkVsTXpyZGZrdmlUOHRRcDIxS1c4RUE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049THV4VHJ1c3QgR2xvYmFsIFJvb3QgMiBPPUx1eFRydXN0IFMuQS4KIyBTdWJqZWN0OiBDTj1MdXhUcnVzdCBHbG9iYWwgUm9vdCAyIE89THV4VHJ1c3QgUy5BLgojIExhYmVsOiAiTHV4VHJ1c3QgR2xvYmFsIFJvb3QgMiIKIyBTZXJpYWw6IDU5OTE0MzM4MjI1NzM0MTQ3MTIzOTQxMDU4Mzc2Nzg4MTEwMzA1ODIyNDg5NTIxCiMgTUQ1IEZpbmdlcnByaW50OiBiMjplMTowOTowMDo2MTphZjpmNzpmMTo5MTo2ZjpjNDphZDo4ZDo1ZTozYjo3YwojIFNIQTEgRmluZ2VycHJpbnQ6IDFlOjBlOjU2OjE5OjBhOmQxOjhiOjI1Ojk4OmIyOjA0OjQ0OmZmOjY2OjhhOjA0OjE3Ojk5OjVmOjNmCiMgU0hBMjU2IEZpbmdlcnByaW50OiA1NDo0NTo1Zjo3MToyOTpjMjowYjoxNDo0NzpjNDoxODpmOTo5NzoxNjo4ZjoyNDpjNTo4ZjpjNTowMjozYjpmNTpkYTo1YjplMjplYjo2ZToxZDpkODo5MDoyZTpkNQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRnd6Q0NBNnVnQXdJQkFnSVVDbjZtMzB0RW50cHFKSVdlNXJnVjB4Wi91N0V3RFFZSktvWklodmNOQVFFTApCUUF3UmpFTE1Ba0dBMVVFQmhNQ1RGVXhGakFVQmdOVkJBb01EVXgxZUZSeWRYTjBJRk11UVM0eEh6QWRCZ05WCkJBTU1Ga3gxZUZSeWRYTjBJRWRzYjJKaGJDQlNiMjkwSURJd0hoY05NVFV3TXpBMU1UTXlNVFUzV2hjTk16VXcKTXpBMU1UTXlNVFUzV2pCR01Rc3dDUVlEVlFRR0V3Sk1WVEVXTUJRR0ExVUVDZ3dOVEhWNFZISjFjM1FnVXk1QgpMakVmTUIwR0ExVUVBd3dXVEhWNFZISjFjM1FnUjJ4dlltRnNJRkp2YjNRZ01qQ0NBaUl3RFFZSktvWklodmNOCkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFOZUZsNzhSbU9ud1lvTk1QSWY1VTJvM0MvSVBQSWZPYjl3bUtiM0YKaWJySmd6MzM3c3BieG0xSmM3VEpScU1iTkJNL3dZbEZWL1Rac2ZzMlpVdjdDT0pJY1JISWJqdWVuZCtKWlRlbQpoZlk3UkJpMnhqY3dZa1NTbDJsOVFqQWs1QTBNaVd0ajNzWGgzMDZwRkd4VDRHSE85aGN2SFR5OTVpSk1IWlAxCkVNU2hkdXhxM3NWczM1YTBWa0JDd0dLU01LRXRGWlNnMGlBR0NXNXFiZVhydDc3VThQRVZmSXZtVHJvVHpFc24KWHBrOEYxMlBnWDh6UFUvVFB4dnNYRC93UEV4MWJ2S20xWjNhTFFkakFzWnk2WlM4VEVtVlQ0aFN5TnZvYVlMNAp6RFJiSXZDR3A0bTlTQXB0Wm9GdHlNaGsrd0hoOU9IZTJaN2QyMXZVS3BrbUZSc2VUSklwZ3A3VmtvR1NRWEFaCjk2VGxrMHU4ZDJjeDNSejlNWEFORjVrTStRdzVHU29YdFRCeFZkVVBybGpoUFM4MG04K2Y5bmlGd3BONmNqNW0KajV3V0VXQ1Bub2x2Wjc3Z1IxbzdESnBuaTg5R3hxNDRvL0tudk9iV2hXc3pKSEFpUzhzSW03dkkrQUlwSGI0ZwpERWEvYTRlYnN5cG1RalZHYktxNnJmbVllK2xRVlJReHY3SGFMZTJBcldnaysybXIySEVUTU9abnM0ZEEvWWwrCjhrUFJFZDh2WlM5a3psOFV1YkcvTWIySGVGcFpaWWlxL0ZreVNJYldUTGtwUzVYVGR2TjNKVzFDSERpRFRmMmoKWDV0L0xheDVHdzVDTVpkanBQdUthZFVpRFRTUU1DNm90T0J0dHBTc3ZJdE8xM0Q4eFRpT1pDWGhUVG1RenNtSApoRmh4QWdNQkFBR2pnYWd3Z2FVd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pCQ0JnTlZIU0FFT3pBNU1EY0dCeXVCCkt3RUJBUW93TERBcUJnZ3JCZ0VGQlFjQ0FSWWVhSFIwY0hNNkx5OXlaWEJ2YzJsMGIzSjVMbXgxZUhSeWRYTjAKTG14MU1BNEdBMVVkRHdFQi93UUVBd0lCQmpBZkJnTlZIU01FR0RBV2dCVC9HQ2gyK1VnRkxLR3U4U3NiSzdKVAorRXQ4c3pBZEJnTlZIUTRFRmdRVS94Z29kdmxJQlN5aHJ2RXJHeXV5VS9oTGZMTXdEUVlKS29aSWh2Y05BUUVMCkJRQURnZ0lCQUdvWkZPMXVlY0VzaDlRTmNIN1g5bmpKQ3dST3hMSE9rM0Qrc0ZUQU1zMlpNR1FYdncvbDRqUDkKQnpaQWNnNGF0bXBaMWdEbGFDRGRMbklOSDJwa01TQ0VmVW1tV2pmclJjbUY5ZFRIRjVrSDVwdFY1QXpvcWJUTwpqRnUxRVZ6UGlnNE4xcXgzZ2Y0eW5DU2VjczVVODlCdm9sYlc3TU0zTEdWWXZsY0FHdkkxK3V0N01WM0N3Ukk5CmxvR0lsb25CV1Z4NjVuOXdOT2VENHJIaDRiaFk3OVNWNUdDYzhKYVhjb3pyaEFJdVpZK2t0OUovWjkzSTA1NWMKcXFta29DVVVCcHZzVDM0dEMzOGRkZkV6Mk8zT3VIVnRQbHU1bUIweERWYllRdzh3a2JJRWE5MVd2cFdBVldlKwoyTTJEMlJqdUxnK0dMWktlY0JQczNsSEpRM2dDcFUzSStWL0VrVmhHRm5kYWRLcEF2QWVmTUxteDl4SVgzZVAvCkpFQWRlbXJSVHhnS3FwQWQ2MEFlMzZFZVJKSVFtdktONGRGTFJwN29SVUtYNmtXWjgreG0xUUw2OHFaS0pLcmUKenJuSytUK1RiL21qdXVxbFBwbXQvZjk3bWZWbDd2QlpLR2ZYa0pXa0U0U3BoTUhvenM1MWsyTWF2RHpxMVdRZgpMU29TT2NiRFdqTHRSNUVXRHJ3NHdWRGVqOG9xa0RRYzdrR1VuRjRaTHZoRlNabDBrYkFFYitNRVdyR3JLcXYrCng5Q1d0dHJoU21RR2JtQk52VUpPLzNqYUpNb2J0TmVXT1d5dThRNnFwMzFJaXlCTXoyVFd1SmRHc0U3UktsWTYKb0pPOXI0QWs0QXArNThyVnl1aUZWZHcyS3VHVWFKUEhabkpFRDRBaE1td2x4eU9BZ3dycgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049VFVCSVRBSyBLYW11IFNNIFNTTCBLb2sgU2VydGlmaWthc2kgLSBTdXJ1bSAxIE89VHVya2l5ZSBCaWxpbXNlbCB2ZSBUZWtub2xvamlrIEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLIE9VPUthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBTTQojIFN1YmplY3Q6IENOPVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRpZmlrYXNpIC0gU3VydW0gMSBPPVR1cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmFzdGlybWEgS3VydW11IC0gVFVCSVRBSyBPVT1LYW11IFNlcnRpZmlrYXN5b24gTWVya2V6aSAtIEthbXUgU00KIyBMYWJlbDogIlRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRpZmlrYXNpIC0gU3VydW0gMSIKIyBTZXJpYWw6IDEKIyBNRDUgRmluZ2VycHJpbnQ6IGRjOjAwOjgxOmRjOjY5OjJmOjNlOjJmOmIwOjNiOmY2OjNkOjVhOjkxOjhlOjQ5CiMgU0hBMSBGaW5nZXJwcmludDogMzE6NDM6NjQ6OWI6ZWM6Y2U6Mjc6ZWM6ZWQ6M2E6M2Y6MGI6OGY6MGQ6ZTQ6ZTg6OTE6ZGQ6ZWU6Y2EKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDQ2OmVkOmMzOjY4OjkwOjQ2OmQ1OjNhOjQ1OjNmOmIzOjEwOjRhOmI4OjBkOmNhOmVjOjY1OjhiOjI2OjYwOmVhOjE2OjI5OmRkOjdlOjg2Ojc5OjkwOjY0Ojg3OjE2Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFWXpDQ0EwdWdBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUXNGQURDQjBqRUxNQWtHQTFVRUJoTUNWRkl4CkdEQVdCZ05WQkFjVEQwZGxZbnBsSUMwZ1MyOWpZV1ZzYVRGQ01FQUdBMVVFQ2hNNVZIVnlhMmw1WlNCQ2FXeHAKYlhObGJDQjJaU0JVWld0dWIyeHZhbWxySUVGeVlYTjBhWEp0WVNCTGRYSjFiWFVnTFNCVVZVSkpWRUZMTVMwdwpLd1lEVlFRTEV5UkxZVzExSUZObGNuUnBabWxyWVhONWIyNGdUV1Z5YTJWNmFTQXRJRXRoYlhVZ1UwMHhOakEwCkJnTlZCQU1UTFZSVlFrbFVRVXNnUzJGdGRTQlRUU0JUVTB3Z1MyOXJJRk5sY25ScFptbHJZWE5wSUMwZ1UzVnkKZFcwZ01UQWVGdzB4TXpFeE1qVXdPREkxTlRWYUZ3MDBNekV3TWpVd09ESTFOVFZhTUlIU01Rc3dDUVlEVlFRRwpFd0pVVWpFWU1CWUdBMVVFQnhNUFIyVmllbVVnTFNCTGIyTmhaV3hwTVVJd1FBWURWUVFLRXpsVWRYSnJhWGxsCklFSnBiR2x0YzJWc0lIWmxJRlJsYTI1dmJHOXFhV3NnUVhKaGMzUnBjbTFoSUV0MWNuVnRkU0F0SUZSVlFrbFUKUVVzeExUQXJCZ05WQkFzVEpFdGhiWFVnVTJWeWRHbG1hV3RoYzNsdmJpQk5aWEpyWlhwcElDMGdTMkZ0ZFNCVApUVEUyTURRR0ExVUVBeE10VkZWQ1NWUkJTeUJMWVcxMUlGTk5JRk5UVENCTGIyc2dVMlZ5ZEdsbWFXdGhjMmtnCkxTQlRkWEoxYlNBeE1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBcjNVd002cTcKYTlPWkxCSTNoTm1OZTVlQTAyN24vNXRRbFQ2UWxWWkMxeGw4Sm9TTmt2b0JIVG9QNG1RNHQ0eTg2SWo1aXlTcgpMcVAxTitSQWpoZ2xlWU4xSHp2L2JLakZ4bGI0dE8yS1JLT3JiRXo4SGREYzcyaTl6K1NxenZCVjk2STAxSU5yCk4zd2N3djYxQSt4WHpyeTB0Y1h0QUE5VE55cE45RThNZy91R3o4ditqRTY5aC9tbml5RlhuSHJmQTJlSkxKMlgKWWFjUXVGV1FmdzR0SnpoMDMrZjkyazRTNDAwVklnTEk0T0Q4RDYySzE4bFVVTXc3RDhvV2dJVFFVVmJEamxaLwppU0l6TCthRkNyMmxxQnMyM3RQY0xHMDd4eE85V1NNczV1V2s5OWdMN2VxUVFFU29sYnVUMWRDQU5MWkdlQTRmCkFKTkc0ZTdwK2V4UEZ3SURBUUFCbzBJd1FEQWRCZ05WSFE0RUZnUVVaVC9IaW9iR1BOMDhWRncxK0RydFVneEgKVjhnd0RnWURWUjBQQVFIL0JBUURBZ0VHTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RFFZSktvWklodmNOQVFFTApCUUFEZ2dFQkFDby80ZkV5anE3aG1GeExYczlySG1vSjBpS3BFc2RlVjMxelZtU0FoSHFUNUFtNUVNMmZLaWZoCkFIZStTTWcxcUlHZjVMZ3N5WDhPc05KTE4xM3F1ZFVMWGpTOTlITXB3KzBtRlp4K0NGT0tXSTNRU3lqZndiUGYKSVBQNTQrTTYzOHljbE5oT1Q4TnJGN2YzY3VpdFpqTzFKVk9yNFBoTXFaMzk4ZzI2cnJuWnFzWnIrWk83cnF1NApsendER3JwRHhwYTVSWEk0czZlaGxqMlJlMzdBSVZOTWgrM3lDMVNWVVpQVklxVU5pdkdURGo1VURyRFl5VTdjCjhqRXlWdXBrK2VxMW5SWm1Rbkx6ZjlPeE1VUDhwSTRYOFcwanE1Um0rSzM3RHdodUppMS9Gd2NKc296N1VNQ2YKbG8zUHR2MEFuVm9VbXI4Q1JQWEJ3cDhpWHFJUG9lTT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUdEQ0EgVHJ1c3RBVVRIIFI1IFJPT1QgTz1HVUFORyBET05HIENFUlRJRklDQVRFIEFVVEhPUklUWSBDTy4sTFRELgojIFN1YmplY3Q6IENOPUdEQ0EgVHJ1c3RBVVRIIFI1IFJPT1QgTz1HVUFORyBET05HIENFUlRJRklDQVRFIEFVVEhPUklUWSBDTy4sTFRELgojIExhYmVsOiAiR0RDQSBUcnVzdEFVVEggUjUgUk9PVCIKIyBTZXJpYWw6IDkwMDk4OTk2NTA3NDAxMjAxODYKIyBNRDUgRmluZ2VycHJpbnQ6IDYzOmNjOmQ5OjNkOjM0OjM1OjVjOjZmOjUzOmEzOmUyOjA4OjcwOjQ4OjFmOmI0CiMgU0hBMSBGaW5nZXJwcmludDogMGY6MzY6Mzg6NWI6ODE6MWE6MjU6YzM6OWI6MzE6NGU6ODM6Y2E6ZTk6MzQ6NjY6NzA6Y2M6NzQ6YjQKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGJmOmZmOjhmOmQwOjQ0OjMzOjQ4OjdkOjZhOjhhOmE2OjBjOjFhOjI5Ojc2OjdhOjlmOmMyOmJiOmIwOjVlOjQyOjBmOjcxOjNhOjEzOmI5OjkyOjg5OjFkOjM4OjkzCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGaURDQ0EzQ2dBd0lCQWdJSWZRbVgvdkJINm5vd0RRWUpLb1pJaHZjTkFRRUxCUUF3WWpFTE1Ba0dBMVVFCkJoTUNRMDR4TWpBd0JnTlZCQW9NS1VkVlFVNUhJRVJQVGtjZ1EwVlNWRWxHU1VOQlZFVWdRVlZVU0U5U1NWUloKSUVOUExpeE1WRVF1TVI4d0hRWURWUVFEREJaSFJFTkJJRlJ5ZFhOMFFWVlVTQ0JTTlNCU1QwOVVNQjRYRFRFMApNVEV5TmpBMU1UTXhOVm9YRFRRd01USXpNVEUxTlRrMU9Wb3dZakVMTUFrR0ExVUVCaE1DUTA0eE1qQXdCZ05WCkJBb01LVWRWUVU1SElFUlBUa2NnUTBWU1ZFbEdTVU5CVkVVZ1FWVlVTRTlTU1ZSWklFTlBMaXhNVkVRdU1SOHcKSFFZRFZRUUREQlpIUkVOQklGUnlkWE4wUVZWVVNDQlNOU0JTVDA5VU1JSUNJakFOQmdrcWhraUc5dzBCQVFFRgpBQU9DQWc4QU1JSUNDZ0tDQWdFQTJhTVc4TWgwZEhlYjd6TU5Pd1orVmZ5MVlJOTJoaEpDZlZabVBvaUM3WEpqCkRwNkwzVFFzQWxGUnd4bjlXVlNFeWZGcnMweXc2ZWhHWFRqR29xY3VFVmU2Z2hXaW5JOXRzSmxLQ3ZMcmlYQmoKVG5uRXQxdTlvbDJ4OGtFQ0s2MnBPcVBzZVFyc1h6cmovZStBUEswMG14cXJpQ1o3VnFLQ2hoL3JOWW1EZjErdQpLVTQ5dG03c3JzSHdKNXV1NC9Uczc2NS85NFk5Y25ycnBmdFpUcWZybFl3aU9YbmhMUWlQekx5UnVFSDNGTUVqCnFjT3Rta1ZFczdMWExNM0dLZUpRRUs1Y3k0S09GeGcyZlpmbWlKcXdUVFFKOUN5NVdtWXFzQmVibmg1Mm5VcG0KTVVIZlAvdkZCdThidG40YVJqYjNaR003NHprWUkrZG5kUlRWZFZlU043MithaHNtVVBJMkpnYVF4WEFCWkcxMgpadUdSMjI0SHdHR0FMckl1TDR4d3A5RTdQTE9SNUc2MnhEdHc4bXlTbHduTlIzMFl3UE83bmcvV2k2NEh0bG9QCnpnc01SNmZsUHJpOWZjZWJOYUJobHpwQmRSZk1LNVozS3BJaEh0bVZkaUJuYU04TnZkL1dId2xxbXVMTWMzR2sKTDMwU2dMZFRNRVplUzFTWkQyZkpwY2p5SU1HQzdKMFIzOElDK3hvNzBlMGdtdTlsWkpJUURTcmkzbkR4R0dlQwpqR0hldUx6Ukw1ejdEOUFyN1J0MnVlUTVWZmo0b1IyNHFvQUFUSUxuc244SnVMd3dvQzhOOVZLZWp2ZVNzd29BCkhRQlVsd2Jnc1FmWnh3OWNaWDA4YlZsWDVPMmxqZWxBVTU4VlM2Qng5aG9oNDlwd0JpRllGSWVGZDNtcWdua0MKQXdFQUFhTkNNRUF3SFFZRFZSME9CQllFRk9MSlFKOU56dWlhb1h6UERqOWx4U21JYWhsUk1BOEdBMVVkRXdFQgovd1FGTUFNQkFmOHdEZ1lEVlIwUEFRSC9CQVFEQWdHR01BMEdDU3FHU0liM0RRRUJDd1VBQTRJQ0FRRFJTVmZnCnA4eG9XTG9CRHlzWnpZMndZVVdzRWUxalVHbjRIMysrRm8vOW5lc0xxakpIZHRKbkpPMjlmRE15bHlySEJZWm0KRFJkOUZCVWIxT3Y5SDVyMlhwZHB0eG9scEFxemtUOWZOcXlMN0Zlb1B1ZUJpaGhYT1lWMEdrTEg2VnNUWDQvNQpDT21TZEkzMVI5S3JPOWI3ZUdaT05uMzU2WkxwQk43OVNXUDhiZnNVY1pObkwwZEt0N24vSGlwemNFWXd2MXJ5CkwzbWw0WTBNMmZteVl6ZU1OMldGY0dwY1d3bHl1YTFqUExIZCtQd3l2emVHNUx1T21DZCt1aDhXNFhBUjhnUGYKSldJeUp5WVlNb1NmL3dBNkU3cWFUZlJQdUJSd0lySEtLNURPS2NGdzlDK2RmL0tRSHRaYTM3ZEcvT2FHK3N2ZwpJSFo2dXFiTDlYemVZcVd4aSs3ZWdtYUtUam93SHorQXk2MG51Z3hlMTlDeFZzcDNjYksxZGFGUXFVQkRGOElvCjJjOVNpMXZJWTlSQ1BxQXpla1l1OXdvZ1JsUithazh4OFlGK1FuUTRaWE1uN3NaOHVJN1hwVHJYbUtHY2pCQlYKMDl0TDdFQ1E4czF1VjlKaURueFhrN0duYmMyZGc3c3E1K1cyTzNGWXJmM1JSYnhha2U1VEZXL1RSUWwxYnJxUQpYUjRFenpmZkhxaG1zWXptSUdydi9FaE9kSmhDcnlsdkxtckgrMzNSWmpFaXpJWUFmbWFEREVMMHZUU1N3eHJxClQ4cCtjazBMY0l5bVNMdW1vUlQyKzFoRW1SU3VxZ3VUYWFBcEpVcWx5eXZkaW1ZSEZuZ1ZWM0ViN1BWSGhQT2UKTVRkNjFYOGtyZVM4L2YzTWJvUG9ES2kzUVd3SDNiMDhocGN2MGc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049VHJ1c3RDb3IgUm9vdENlcnQgQ0EtMSBPPVRydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLiBPVT1UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkKIyBTdWJqZWN0OiBDTj1UcnVzdENvciBSb290Q2VydCBDQS0xIE89VHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuIE9VPVRydXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eQojIExhYmVsOiAiVHJ1c3RDb3IgUm9vdENlcnQgQ0EtMSIKIyBTZXJpYWw6IDE1NzUyNDQ0MDk1ODExMDA2NDg5CiMgTUQ1IEZpbmdlcnByaW50OiA2ZTo4NTpmMTpkYzoxYTowMDpkMzoyMjpkNTpiMjpiMjphYzo2YjozNzowNTo0NQojIFNIQTEgRmluZ2VycHJpbnQ6IGZmOmJkOmNkOmU3OjgyOmM4OjQzOjVlOjNjOjZmOjI2Ojg2OjVjOmNhOmE4OjNhOjQ1OjViOmMzOjBhCiMgU0hBMjU2IEZpbmdlcnByaW50OiBkNDowZTo5Yzo4NjpjZDo4ZjplNDo2ODpjMTo3Nzo2OTo1OTpmNDo5ZTphNzo3NDpmYTo1NDo4Njo4NDpiNjpjNDowNjpmMzo5MDo5Mjo2MTpmNDpkYzplMjo1Nzo1YwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRU1EQ0NBeGlnQXdJQkFnSUpBTnFiN0hIekE3QVpNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1JR2tNUXN3Q1FZRApWUVFHRXdKUVFURVBNQTBHQTFVRUNBd0dVR0Z1WVcxaE1SUXdFZ1lEVlFRSERBdFFZVzVoYldFZ1EybDBlVEVrCk1DSUdBMVVFQ2d3YlZISjFjM1JEYjNJZ1UzbHpkR1Z0Y3lCVExpQmtaU0JTTGt3dU1TY3dKUVlEVlFRTERCNVUKY25WemRFTnZjaUJEWlhKMGFXWnBZMkYwWlNCQmRYUm9iM0pwZEhreEh6QWRCZ05WQkFNTUZsUnlkWE4wUTI5eQpJRkp2YjNSRFpYSjBJRU5CTFRFd0hoY05NVFl3TWpBME1USXpNakUyV2hjTk1qa3hNak14TVRjeU16RTJXakNCCnBERUxNQWtHQTFVRUJoTUNVRUV4RHpBTkJnTlZCQWdNQmxCaGJtRnRZVEVVTUJJR0ExVUVCd3dMVUdGdVlXMWgKSUVOcGRIa3hKREFpQmdOVkJBb01HMVJ5ZFhOMFEyOXlJRk41YzNSbGJYTWdVeTRnWkdVZ1VpNU1MakVuTUNVRwpBMVVFQ3d3ZVZISjFjM1JEYjNJZ1EyVnlkR2xtYVdOaGRHVWdRWFYwYUc5eWFYUjVNUjh3SFFZRFZRUUREQlpVCmNuVnpkRU52Y2lCU2IyOTBRMlZ5ZENCRFFTMHhNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUIKQ2dLQ0FRRUF2NDYzbGVMQ0poSnJNeG5IUUZnS3ExbXFqUUNqL0lESFVIdU8xQ0FtdWpJUzJDTlVTU1VRSXBpZApSdExCeVo1T0d5NHNEamp6R2lWb0hLWmFCZVllaTBpL21KWjBQbW5LNmJWNHBRYTgxUUJlQ1FyeUozcFMvQzNWCnNlcTBpV0VrOHhvVDI2blBVdTBNSkxxNW51eCtBSFQ2azYxc0taS3VVYlM3MDFlL3MvT29qWnowSkVzcTFwbWUKOUo3K3dINUNPdWNMbFZQYXQyZ09rRXo3Y0QrUFNpeVU4eWJkWTJtcGxOZ1FUc1ZIQ0pDWkd4ZE51V3h1NzJDVgpFWTRoZ0xXOW9IUFkwTEozeEVYcVdpYjdabloyK0FZZllXMFBWY1dEdHhCV2NnWUhwZk94R2dNRlpBNmRXb3JXCmhuQWJKTjcrS0lvcjBHcXcvSHFpM0xKNURvdGxEd0lEQVFBQm8yTXdZVEFkQmdOVkhRNEVGZ1FVN210SlBIby8KRGVPeENiZUt5S3NabjNNelVPY3dId1lEVlIwakJCZ3dGb0FVN210SlBIby9EZU94Q2JlS3lLc1puM016VU9jdwpEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DQVlZd0RRWUpLb1pJaHZjTkFRRUxCUUFECmdnRUJBQ1VZMUpHUEUrNlBIaDBSVTlvdFJDa1pvQjVyTVo1TkRwNnRQVnhCYjVVckpLRjVtRG80TnZ1N1pwNUkKLzVDUTd6M1V1SnUwaDNVL0lKdk9jcytoVmNGTlpLSVpCcUVITXd3TEtlWHg2cXVqN0xVS2RKREhmWEx5MTF5ZgprZStSaTdmYzdXYWl6NDVtTzd5Zk9nTGdKOTBXbU1DVjFBcWs1SUdhZFpRMW5KQmZpRGNHclZtVkNyRFJaOU1aCnlvbm5NbG8ySEQ2Q3FGcVR2c2JRWkpHMno5bTJHTS9iZnRKbG82YkVqaGN4d2Z0K2R0dlRoZU5Zc25kNmRqdHMKTDFBYzU5djJaM2tmOVlLVm1nZW5GSytQM0NnaFp3blMxazFhSEJrY2puZGN3NVFrUFRKclMzN1VlSlNEdmpkTgp6bC9ISGs0ODRJa3psUXNQcFRMV1BGcDVMQms9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1UcnVzdENvciBSb290Q2VydCBDQS0yIE89VHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuIE9VPVRydXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eQojIFN1YmplY3Q6IENOPVRydXN0Q29yIFJvb3RDZXJ0IENBLTIgTz1UcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4gT1U9VHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5CiMgTGFiZWw6ICJUcnVzdENvciBSb290Q2VydCBDQS0yIgojIFNlcmlhbDogMjcxMTY5NDUxMDE5OTEwMTY5OAojIE1ENSBGaW5nZXJwcmludDogYTI6ZTE6Zjg6MTg6MGI6YmE6NDU6ZDU6Yzc6NDE6MmE6YmI6Mzc6NTI6NDU6NjQKIyBTSEExIEZpbmdlcnByaW50OiBiODpiZTo2ZDpjYjo1NjpmMTo1NTpiOTo2MzpkNDoxMjpjYTo0ZTowNjozNDpjNzo5NDpiMjoxYzpjMAojIFNIQTI1NiBGaW5nZXJwcmludDogMDc6NTM6ZTk6NDA6Mzc6OGM6MWI6ZDU6ZTM6ODM6NmU6Mzk6NWQ6YWU6YTU6Y2I6ODM6OWU6NTA6NDY6ZjE6YmQ6MGU6YWU6MTk6NTE6Y2Y6MTA6ZmU6Yzc6Yzk6NjUKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUdMekNDQkJlZ0F3SUJBZ0lJSmFIZnlqUExXUUl3RFFZSktvWklodmNOQVFFTEJRQXdnYVF4Q3pBSkJnTlYKQkFZVEFsQkJNUTh3RFFZRFZRUUlEQVpRWVc1aGJXRXhGREFTQmdOVkJBY01DMUJoYm1GdFlTQkRhWFI1TVNRdwpJZ1lEVlFRS0RCdFVjblZ6ZEVOdmNpQlRlWE4wWlcxeklGTXVJR1JsSUZJdVRDNHhKekFsQmdOVkJBc01IbFJ5CmRYTjBRMjl5SUVObGNuUnBabWxqWVhSbElFRjFkR2h2Y21sMGVURWZNQjBHQTFVRUF3d1dWSEoxYzNSRGIzSWcKVW05dmRFTmxjblFnUTBFdE1qQWVGdzB4TmpBeU1EUXhNak15TWpOYUZ3MHpOREV5TXpFeE56STJNemxhTUlHawpNUXN3Q1FZRFZRUUdFd0pRUVRFUE1BMEdBMVVFQ0F3R1VHRnVZVzFoTVJRd0VnWURWUVFIREF0UVlXNWhiV0VnClEybDBlVEVrTUNJR0ExVUVDZ3diVkhKMWMzUkRiM0lnVTNsemRHVnRjeUJUTGlCa1pTQlNMa3d1TVNjd0pRWUQKVlFRTERCNVVjblZ6ZEVOdmNpQkRaWEowYVdacFkyRjBaU0JCZFhSb2IzSnBkSGt4SHpBZEJnTlZCQU1NRmxSeQpkWE4wUTI5eUlGSnZiM1JEWlhKMElFTkJMVEl3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLCkFvSUNBUUNuSUc3Q0txSmlKSldRZHNnNGZvRFNxOEdiWlFXVTlNRUtFTlVDck8yZms4ZUh5TEFuSzBJTVBRbysKUVZxZWRkMk55dUNiN0dneXBHbVNhSXdMZ1E1V29ENGEzU3dsRklJdmw5TmtSdlJVcWR3NlZDMHhLNW1DOHRrcQoxKzl4QUxneHBMNTZKQWZEUWlEeWl0U1NCQnRsVmt4czFQdTJZVnBISTdUWWFiUzNPdEIwUEF4MW9ZeE9kcUhwCjJ5cWxPL3JPc1A5K2FpajlKeHpJc2VrcDhWZHVaTFRRd1JWdERyNHVEa2JJWHZSUi91OE9Zem83Y2JyUGIxbksKRE9PYlhVbTRUT0pYc1ppS1FsZWNkdS92dmRGb3FOTDBDYnQzTmI0bGdnakVGaXhFSUZhcFJCRjM3MTIwSGFwZQphejZMTXZZSEwxY0Vrc3IxL3AzQzZlaXpqa3hMQWpIWjVEeElnaWYzR0lKMlNEcHhzUk9oT2RVdXhUVENIV0tGCjN3UCtUZlN2UGQ5Y1c0MzZjT0dsZmlmSGhpNXFqeExHaEY1RFVWQ2NHWnQ0NXZ6MjdVZCtlejFtN3hNVGlGODgKb1dQNytheUhOWi96Z3A2a1B3cWNNV21MbWFTSVNvNXVaazN2RnNRUGVTZ2hZQTJGRm4zWFZEanhrbGI5dFROTQpnOXpYRUo5TC9jYjRRcjI2ZkhNQzRQOTl6VnZoMUt4aGUxZlZTbnRiMUlWWUoxMi8rQ3RncktBbXJoUWhKOFozCm1qT0FQRjVHUC9mRHNhT0dNOGJvWGcyNU5TeXFSc0dGQW5XQW9Pc2sreFdxNUdkL2JuYy85QVNLTDN4NzR4ZGgKOE4wSnFTREl2Z21rMEg1RXc3SXdTamlxcWV3WW1nZUNLOXU0bkJpdDJ1QkdGNnpQWFFJREFRQUJvMk13WVRBZApCZ05WSFE0RUZnUVUyZjRoUUc2VW5yeWJQWng5bUNBWjVZd3dZckl3SHdZRFZSMGpCQmd3Rm9BVTJmNGhRRzZVCm5yeWJQWng5bUNBWjVZd3dZckl3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVkhROEJBZjhFQkFNQ0FZWXcKRFFZSktvWklodmNOQVFFTEJRQURnZ0lCQUo1Rm5ndzd0dS9oT3NoODBRQTl6K0xxQnJXeU9yc0dTMmg2MENPWApkS2NzOEFqWWVWclhXb1NLMkJLYUc5bDlYRTF3eGFYNXErV2ppWW5kQWZyczNmbnBrcGZic0VaQzg5TmlxcFgrCk1XY1VhVmlRQ3FvTDdqY2p4MUJSdFBWK251Tjc5K1RNUWpJdFNRekwvMGtNbXg0MC9XNXVsb3A1QTdadjJ3bkwKL1Y5bEZEZmhPUFh6WVJaWTVMVnREUXNFR3o5UUxYK3p4M29hRm9CZytJb2Y2UnNxeHZtNkFScHB2OUpZeDFSWApDSS9oT1dCM1M2eFpoQnFJOGQzTFQzalg1K0V6TGZ6dVFmb2dzTDdMOXppVXdPSFFoUSs3N1N4enErMytrbllhClpIOWJEVE1KQnpON0JqOFJwRnh3UElYQXorT1FxSU4zK3R2bXhZeG9aeEJucFZJdDhNU1pqMysvMFd2aXRVZlcKMmRDRm1VMlVtdzlMamU0QVdrY2RFUU9zUVJpdmg3ZHZERHFQeXMvY0E4R2lDY2psL1lCZXlHQkNBUnNhVTFxNwpONmEzdkxxRTZSNXNHdFJrMnRSRC9wT0xTL0lzZVJZUTFKTUxpSStoMklZVVJwRkhteWdrNzFkU1RseENuS3IzClNld242RUFlczZhSkluS2M5UTB6dEZpak1EdmQxR3BVazc0YVRmT1RsUGY4aEFzL2hDQmNOQU5FeGRxdHZBckIKQXM4ZTVaVFo4NDViMkV6d25leGhGN3NVTWxRTUFpbVRIcEtHOW4vdjU1SUZEbG5kbVFndUx2cWNBRkxUeFdZcAo1S2VYUktRT0tJRVROY1gyYjJUbVFjVFZMOHcwUlNYUFFRQ1dQVW91d3BhWVQwNUtuSmUzMngrU01zai9EMUZ1CjF1d0oKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVRydXN0Q29yIEVDQS0xIE89VHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuIE9VPVRydXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eQojIFN1YmplY3Q6IENOPVRydXN0Q29yIEVDQS0xIE89VHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuIE9VPVRydXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eQojIExhYmVsOiAiVHJ1c3RDb3IgRUNBLTEiCiMgU2VyaWFsOiA5NTQ4MjQyOTQ2OTg4NjI1OTg0CiMgTUQ1IEZpbmdlcnByaW50OiAyNzo5MjoyMzoxZDowYTpmNTo0MDo3YzplOTplNjo2Yjo5ZDpkODpmNTplNzo2YwojIFNIQTEgRmluZ2VycHJpbnQ6IDU4OmQxOmRmOjk1Ojk1OjY3OjZiOjYzOmMwOmYwOjViOjFjOjE3OjRkOjhiOjg0OjBiOmM4Ojc4OmJkCiMgU0hBMjU2IEZpbmdlcnByaW50OiA1YTo4ODo1ZDpiMTo5YzowMTpkOToxMjpjNTo3NTo5Mzo4ODo5Mzo4YzphZjpiYjpkZjowMzoxYTpiMjpkNDo4ZTo5MTplZToxNTo1ODo5Yjo0Mjo5NzoxZDowMzo5YwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRUlEQ0NBd2lnQXdJQkFnSUpBSVNDTEY4Y1l0QkFNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1JR2NNUXN3Q1FZRApWUVFHRXdKUVFURVBNQTBHQTFVRUNBd0dVR0Z1WVcxaE1SUXdFZ1lEVlFRSERBdFFZVzVoYldFZ1EybDBlVEVrCk1DSUdBMVVFQ2d3YlZISjFjM1JEYjNJZ1UzbHpkR1Z0Y3lCVExpQmtaU0JTTGt3dU1TY3dKUVlEVlFRTERCNVUKY25WemRFTnZjaUJEWlhKMGFXWnBZMkYwWlNCQmRYUm9iM0pwZEhreEZ6QVZCZ05WQkFNTURsUnlkWE4wUTI5eQpJRVZEUVMweE1CNFhEVEUyTURJd05ERXlNekl6TTFvWERUSTVNVEl6TVRFM01qZ3dOMW93Z1p3eEN6QUpCZ05WCkJBWVRBbEJCTVE4d0RRWURWUVFJREFaUVlXNWhiV0V4RkRBU0JnTlZCQWNNQzFCaGJtRnRZU0JEYVhSNU1TUXcKSWdZRFZRUUtEQnRVY25WemRFTnZjaUJUZVhOMFpXMXpJRk11SUdSbElGSXVUQzR4SnpBbEJnTlZCQXNNSGxSeQpkWE4wUTI5eUlFTmxjblJwWm1sallYUmxJRUYxZEdodmNtbDBlVEVYTUJVR0ExVUVBd3dPVkhKMWMzUkRiM0lnClJVTkJMVEV3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRRFBqK0FSdForb2RuYmIKM3c5VTczTmpLWUt0UjhhamErMytYelA0UTFIcEdqT1JNUmVnZE1UVXB3SG1zcEkrYXAzdER2bDBtRURUUHdPQQpCb0pBNkxIaXAxR25IWU1tYTZ2ZStoZVJLOWpHckI2eG5oa0IxWmVtNmcyM3hGVWZKM3pTQ05WMkh5a1ZoMEE1CjNUaEZFWFhRbXFjMDRML055RklkdVVkK0RiaTd4Z3oyYzFjV1duNURrUjlWT3NadFJBU3FuS21jcDB5SkY0T3UKb3dSZVVvQ0xIaElsRVJuWERIMTlNVVJCNnR1dnNCenZnZEFzeFpvaG16M3RRanRRSnZMc3puRmhCbUloVkU1Lwp3WjArZnlDTWdNc3EySmRpeUlNemtYMndvbG9QVitnN3pQSWxzdFI4TCt4TnhxRTZGWHJudGwwMTlmWklTalpGClp0UzZtRmpCQWdNQkFBR2pZekJoTUIwR0ExVWREZ1FXQkJSRW5rajF6RzFJMUtCTGYvNVpKQytEbDVtYWhqQWYKQmdOVkhTTUVHREFXZ0JSRW5rajF6RzFJMUtCTGYvNVpKQytEbDVtYWhqQVBCZ05WSFJNQkFmOEVCVEFEQVFILwpNQTRHQTFVZER3RUIvd1FFQXdJQmhqQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FRRUFCVDQxWEJWd204bkhjMkZ2CmNpdlV3by95UTEwQ3pzU1V1WlFSZzJkZDRtZHNkWGEvdXd5cU5zYXRSNU5qM0I1KzF0NHUvdWtaTWpnRGZ4VDIKQUhNc1diRWhCdUg3ckJpVkRLUC9tWmIzS3llYjFTVE1IZDNCT3VDWVJMREU1RDUzc1hPcFpDejJIQUY4UDExRgpoY0NGNXlXUGxkd1g4enlmR202d3l1TWRLdWxNWS9va1lXTFcybjYySEd6MUFoM1VLdDFWa09zcUVVYzhMbDUwCnNvSWlwWDFUSDBYc0o1Rjk1eUlXNk1Cb050akc4VStBUkRMNTRkSFJIYXJlcUt1Y0JLK3RJQTVrbUUybGE4QkkKV0pacFRkd0hqRkdUb3QrZkR6MkxZTFNDamFvSVRtSkY0UGtMMHVEZ1BGdmVYSEVuSmNMbUE0R0xFRlBqeDFXaQp0Si9YNWc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049U1NMLmNvbSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQSBPPVNTTCBDb3Jwb3JhdGlvbgojIFN1YmplY3Q6IENOPVNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBSU0EgTz1TU0wgQ29ycG9yYXRpb24KIyBMYWJlbDogIlNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBSU0EiCiMgU2VyaWFsOiA4ODc1NjQwMjk2NTU4MzEwMDQxCiMgTUQ1IEZpbmdlcnByaW50OiA4Njo2OToxMjpjMDo3MDpmMTplYzphYzphYzpjMjpkNTpiYzphNTo1YjphMToyOQojIFNIQTEgRmluZ2VycHJpbnQ6IGI3OmFiOjMzOjA4OmQxOmVhOjQ0Ojc3OmJhOjE0OjgwOjEyOjVhOjZmOmJkOmE5OjM2OjQ5OjBjOmJiCiMgU0hBMjU2IEZpbmdlcnByaW50OiA4NTo2Njo2YTo1NjoyZTplMDpiZTo1YzplOToyNTpjMTpkODo4OTowYTo2Zjo3NjphODo3ZTpjMTo2ZDo0ZDo3ZDo1ZjoyOTplYTo3NDoxOTpjZjoyMDoxMjozYjo2OQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRjNUQ0NBOFdnQXdJQkFnSUlleXliMHhhQU1wa3dEUVlKS29aSWh2Y05BUUVMQlFBd2ZERUxNQWtHQTFVRQpCaE1DVlZNeERqQU1CZ05WQkFnTUJWUmxlR0Z6TVJBd0RnWURWUVFIREFkSWIzVnpkRzl1TVJnd0ZnWURWUVFLCkRBOVRVMHdnUTI5eWNHOXlZWFJwYjI0eE1UQXZCZ05WQkFNTUtGTlRUQzVqYjIwZ1VtOXZkQ0JEWlhKMGFXWnAKWTJGMGFXOXVJRUYxZEdodmNtbDBlU0JTVTBFd0hoY05NVFl3TWpFeU1UY3pPVE01V2hjTk5ERXdNakV5TVRjegpPVE01V2pCOE1Rc3dDUVlEVlFRR0V3SlZVekVPTUF3R0ExVUVDQXdGVkdWNFlYTXhFREFPQmdOVkJBY01CMGh2CmRYTjBiMjR4R0RBV0JnTlZCQW9NRDFOVFRDQkRiM0p3YjNKaGRHbHZiakV4TUM4R0ExVUVBd3dvVTFOTUxtTnYKYlNCU2IyOTBJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNUlGSlRRVENDQWlJd0RRWUpLb1pJaHZjTgpBUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUJBUGtQM2FNcmZjdlFLdjdzWjRXbTV5NGJ1bmZoNC9XdnBPejZTbDJSCnhGZEhheGgzYTNieS9aUGtQUS9DRnA0TFpzTldsSjRYZzRYT1Z1L3lGdjBBWXZVaUNWVG9aUmRPUWJuZ1QwYVgKcWh2SXVHNWlYbW14WDlzcUFuNzhiTXJ6UWRqdDBPajhQMkZJN2JBREZCMFFEa3NaNEx0TzdJWmwvemJ6WG1jQwpDNTJHVldIOWVqanQvdUlaQUxkdm9WQmlkWFE4b1BySUpaSzBibm9peC9nZW9lT3kzWkV4cXlzZEJQK2xTZ1EzCjZZV2tNeXY5NHRaVk5Id1pwRXBveDdLbzA3ZktvWk9JNjhHWHZJejVIZGtpaENSMHh3UTlhcWtwazh6cnVGdmgKL2w4bHFqUll5TUVqVkowYm1CSERPSngrUFlac3BROUFobndDOUZ3Q1R5akxybkdmRHpySU0vNFJKVFhxL0xyRgpZRDNaZkJqVnNxblRkWGdEY2lMS09zTWY3eXpsTHFuNm5peTJVVWI5cndQVzZtQm82b1VXTm11RjZSN0FzOTNFCkpOeUFLb0ZCYlpRK3lPREpnVUVBbmw2L2Y4VUltS0lZTEVKQXMvbHZPQ2RMVG9EMFBZRkg0SWg4Nmh6T3RYVmMKVVM0Y0szOGFjaWpuQUxYUmRNYlg1Sit0QjVPMlV6VTEvRGZrdy9aZEZyNGhjOTZTQ3ZpZ1kycThscEpxUHZpOApaVldiM3ZVTmlTWUUvQ1VhcGlWcHk4SnR5bnppV1YrWHJPdnZMc2k4MXh0WlBDdk04aG5JazJzbll4blAvT2ttCitNcHhtMytUL2pSbmhFNlo2L3l6ZUFremNMcG1wbmJ0RzNQckdxVU54Q0lUSUpSV0NrNHNiRTZ4L2MrY0NicWkKTSsySEFnTUJBQUdqWXpCaE1CMEdBMVVkRGdRV0JCVGRCQWtIb3ZWNmZWSlRFcEtWN2ppQUpRMm1XVEFQQmdOVgpIUk1CQWY4RUJUQURBUUgvTUI4R0ExVWRJd1FZTUJhQUZOMEVDUWVpOVhwOVVsTVNrcFh1T0lBbERhWlpNQTRHCkExVWREd0VCL3dRRUF3SUJoakFOQmdrcWhraUc5dzBCQVFzRkFBT0NBZ0VBSUJnUmxDbjdKcDBjSGg1d1lmR1YKY3BOeEpLMW9rMWlPTXE4YnMzQUQvQ1VyZElXUVBYaHE5TG1McFpjN3RSaVJ1eDZuK1VCYmtmbFZtYThlRWRCYwpIYWRtNDdHVUJ3d3lPYWJxRzdCNTJCMmNjRVRqaXQzRStaVWZpamhEUHdHRnBVZW5QVWF5dk9VaWFQZDduTmdzClBnb2h5QzB6ckwvRmdaa3hkTUYxY2NXK3NmQWpSZlNkYS93Wlk1Mmp2QVRHR0FzbHUxT0pEN09BVU41RjdrUi8KcTVSNFpKalQ5aWpkaDlod1pYVDdEcmtUNjZjUFlha3lsc3pldSsxalRCaTdxVUQzb0ZSdUlJaHhkUmpxZXJRMApjdUFqSjNkY3RwRHFoaVZBcSs4ekQ4dWZncjZpSVB2MnRTMGE1c0tGc1hRUCs4aGxBcVJTQVVmZFNTTEJ2OWpyCmE2eCszdXhqTXhXM0l3aVB4ZytOUVZyZGpzVzVqK1ZGUDNqYnV0SWJRTEgrY1UwLzRJR2l1bDYwN0JYZ2s5MEkKSDM3aFZaa0xJZDZUbmdyNzVxTkp2VFl3L3VkM3NxQjFsN1V0Z1lnWFpTRDMycEFBbjhsU3pETEtOWHoxUFEvWQpLOWYxSm16SkJqU1dGdXB3V1JveWVYa0x0b2gvRDFKSVBiOXMyS0pFTHRGT3QzSlkwNGtUbGY1RXEvalhpeHR1Cm5Md3NvRnZWYWdDdlh6ZmgxZm9RQzVpY2h1Y21qODd3N0c2S1Z3dUE0MDZ5d0tCallaQzZWV2czZEdxMmt0dWYKb1lZaXRtVW5EdXkybjBKZzVHZkN0ZHBCQzhUVGkyRWJ2UG9ma1N2WFJBZGV1aW1zMmNYcDcxTklXdXVBOFNoWQpJYzJ3QmxYN0p6OVRrSENwQkI1WEo3az0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MgTz1TU0wgQ29ycG9yYXRpb24KIyBTdWJqZWN0OiBDTj1TU0wuY29tIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgRUNDIE89U1NMIENvcnBvcmF0aW9uCiMgTGFiZWw6ICJTU0wuY29tIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgRUNDIgojIFNlcmlhbDogODQ5NTcyMzgxMzI5NzIxNjQyNAojIE1ENSBGaW5nZXJwcmludDogMmU6ZGE6ZTQ6Mzk6N2Y6OWM6OGY6Mzc6ZDE6NzA6OWY6MjY6MTc6NTE6M2E6OGUKIyBTSEExIEZpbmdlcnByaW50OiBjMzoxOTo3YzozOToyNDplNjo1NDphZjoxYjpjNDphYjoyMDo5NTo3YTplMjpjMzowZToxMzowMjo2YQojIFNIQTI1NiBGaW5nZXJwcmludDogMzQ6MTc6YmI6MDY6Y2M6NjA6MDc6ZGE6MWI6OTY6MWM6OTI6MGI6OGE6YjQ6Y2U6M2Y6YWQ6ODI6MGU6NGE6YTM6MGI6OWE6Y2I6YzQ6YTc6NGU6YmQ6Y2U6YmM6NjUKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNqVENDQWhTZ0F3SUJBZ0lJZGViZnk4Rm9XNmd3Q2dZSUtvWkl6ajBFQXdJd2ZERUxNQWtHQTFVRUJoTUMKVlZNeERqQU1CZ05WQkFnTUJWUmxlR0Z6TVJBd0RnWURWUVFIREFkSWIzVnpkRzl1TVJnd0ZnWURWUVFLREE5VApVMHdnUTI5eWNHOXlZWFJwYjI0eE1UQXZCZ05WQkFNTUtGTlRUQzVqYjIwZ1VtOXZkQ0JEWlhKMGFXWnBZMkYwCmFXOXVJRUYxZEdodmNtbDBlU0JGUTBNd0hoY05NVFl3TWpFeU1UZ3hOREF6V2hjTk5ERXdNakV5TVRneE5EQXoKV2pCOE1Rc3dDUVlEVlFRR0V3SlZVekVPTUF3R0ExVUVDQXdGVkdWNFlYTXhFREFPQmdOVkJBY01CMGh2ZFhOMApiMjR4R0RBV0JnTlZCQW9NRDFOVFRDQkRiM0p3YjNKaGRHbHZiakV4TUM4R0ExVUVBd3dvVTFOTUxtTnZiU0JTCmIyOTBJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNUlFVkRRekIyTUJBR0J5cUdTTTQ5QWdFR0JTdUIKQkFBaUEySUFCRVZ1cVZERXBpTTJubDhvalJmTGxpSmtQOXg2amgzTUNMT2ljU1M2amttNUJCdEhsbGlyTFpYSQo3WjRJTmNnbjY0bU1VMWpyWW9yKzhGc1BhekZTWTBFN2ljM3M3TGFOR2RNMEI5eTd4Z1ovd2tXVjdNdC9xQ1BnCkNlbUIrdk5IMDZOak1HRXdIUVlEVlIwT0JCWUVGSUxSaFhNdzV6VUUwNDRDa3Z2bHBOSEVJZWpOTUE4R0ExVWQKRXdFQi93UUZNQU1CQWY4d0h3WURWUjBqQkJnd0ZvQVVndEdGY3pEbk5RVFRqZ0tTKytXazBjUWg2TTB3RGdZRApWUjBQQVFIL0JBUURBZ0dHTUFvR0NDcUdTTTQ5QkFNQ0EyY0FNR1FDTUcvbjYxa1JwR0RQWWJDV2UrMEYrUzhUCmtkenQ1ZnhRYXhGR1JyTWNJUUJpdTc3RDUrak5CNW41RFF0ZGNqN0VxZ0l3SDd5NkMrSXdKUHQ4YllCVkNwaysKZ0EwejVXYWpzNk83cGRXTGp3a3NwbDErNHZBSENHaHQwbnhwYmwvZjVXcGwKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVNTTC5jb20gRVYgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBSU0EgUjIgTz1TU0wgQ29ycG9yYXRpb24KIyBTdWJqZWN0OiBDTj1TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyIE89U1NMIENvcnBvcmF0aW9uCiMgTGFiZWw6ICJTU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyIgojIFNlcmlhbDogNjI0ODIyNzQ5NDM1Mjk0MzM1MAojIE1ENSBGaW5nZXJwcmludDogZTE6MWU6MzE6NTg6MWE6YWU6NTQ6NTM6MDI6ZjY6MTc6NmE6MTE6N2I6NGQ6OTUKIyBTSEExIEZpbmdlcnByaW50OiA3NDozYTpmMDo1Mjo5YjpkMDozMjphMDpmNDo0YTo4MzpjZDpkNDpiYTphOTo3Yjo3YzoyZTpjNDo5YQojIFNIQTI1NiBGaW5nZXJwcmludDogMmU6N2I6ZjE6NmM6YzI6MjQ6ODU6YTc6YmI6ZTI6YWE6ODY6OTY6NzU6MDc6NjE6YjA6YWU6Mzk6YmU6M2I6MmY6ZTk6ZDA6Y2M6NmQ6NGU6Zjc6MzQ6OTE6NDI6NWMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUY2ekNDQTlPZ0F3SUJBZ0lJVnJZcHpUUzhlUFl3RFFZSktvWklodmNOQVFFTEJRQXdnWUl4Q3pBSkJnTlYKQkFZVEFsVlRNUTR3REFZRFZRUUlEQVZVWlhoaGN6RVFNQTRHQTFVRUJ3d0hTRzkxYzNSdmJqRVlNQllHQTFVRQpDZ3dQVTFOTUlFTnZjbkJ2Y21GMGFXOXVNVGN3TlFZRFZRUUREQzVUVTB3dVkyOXRJRVZXSUZKdmIzUWdRMlZ5CmRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa2dVbE5CSUZJeU1CNFhEVEUzTURVek1URTRNVFF6TjFvWERUUXkKTURVek1ERTRNVFF6TjFvd2dZSXhDekFKQmdOVkJBWVRBbFZUTVE0d0RBWURWUVFJREFWVVpYaGhjekVRTUE0RwpBMVVFQnd3SFNHOTFjM1J2YmpFWU1CWUdBMVVFQ2d3UFUxTk1JRU52Y25CdmNtRjBhVzl1TVRjd05RWURWUVFECkRDNVRVMHd1WTI5dElFVldJRkp2YjNRZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGtnVWxOQklGSXkKTUlJQ0lqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FnOEFNSUlDQ2dLQ0FnRUFqelpsUU9IV1RjRFh0T2xHMm12cQpNMGZOVFBsOWZiNjlMVDN3MjNqaGhxWFp1Z2xYYU8xWFBxRFFDRUdENXloQkpCL2pjaFhRQVJyN1huQWpzc3VmCk9lUFB4VTdHa20wbXhudTdzOW9ublFxRzZZRTNCZjd3Y1hIc3d4enBZNklYRkozdkcyZlRoVlVDQXRaSnljeGEKNGJIM2J6S2Z5ZFE3aUVHb25MM0xxOXR0ZXdrZm9reHlrTm9yQ1B6UFBGVE9adytvejEyV0dRdkU0M0xycmRGOQpIU2Z2a3VzUXYxdnJPNi9QZ04zQjBwWUVXM3ArcEtrOE9IYWtZbzZnT1Y3cWQ4OWRBRm1QWml3K0I2S2pCU1lSCmFaZnFoYmNQbGd0THlFRGhVTG91aXN2M0Q1b2k1MythTnhQTjhrMFRheUhSd013aThxRkc5a1Jwbk1waE5RY0EKYjlaaENCSHF1cmoyNmJOZzVVMjU3SjhVWnNsWFdOdk5oMm40aW9ZU0EwZS9aaE4yckhkOU5DU0ZnODNYcXB5UQpHcDhoTEg5NHQyUzQyT2ltOUhpelZjdUUwakxFZUs2amoySGR6Z2hUcmV5SS9CWGttZzNtbnhwM3preVB1QlFWClBXS2NoamdHQUdZUzVGbDJXbFBBQXBpaUVDdG9SSHVPZWM0elNuYXFXNEVXRzdXSzJOQUFlMTVpdEFuV2htTU8KcGdXVlNib29pNGlUc2pRYzJLUlZicmNjME42WlZUc2o5Q0xnK1NsbUp1d2dVSGZiU2d1UHZ1VUNZSEJCWHRTdQpVRGtpRkNiTHNqdHpkRlZIQjNtQk9hZ3dFMFRsQklxdWxoTWxRZys1VThTYi9NM2tITjQ4K3F2V0Jrb2ZaNmFZCk1CemRMTnZjR0pWWFpzYi9YSXRXOVhjQ0F3RUFBYU5qTUdFd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZkJnTlYKSFNNRUdEQVdnQlQ1WUx2VTQ5VTA5cmoxQm9BbHAzUGJSbW1vbmpBZEJnTlZIUTRFRmdRVStXQzcxT1BWTlBhNAo5UWFBSmFkejIwWnBxSjR3RGdZRFZSMFBBUUgvQkFRREFnR0dNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUNBUUJXCnM0N0xDcDFKanIra3hKRzdaaGNGVVpoMSsrVlFMSHFlOFJUNnE5T0tQditSS1k5amk5aTBxVlFCRGI2VGhpLzUKU20zSFh2VlgrY3BWSEJLK1J3ODJ4ZDlxdDl0MXdrY2xmN254WS9ob0xWVUUwZktOc0tUUHZEeGVIM2pucGFBZwpjTEFFeGJmM2NxZmVJZzI5TXlWR2pHU1NKdU0rTG1PVzJwdU1QZmdZQ2RjRHpIMkdndURLQkFkUlVOZi9rdFVNCjc5cUduNW5YNjdldmFPSTVKcFM2YUxlL2c5UHFlbWM5WW1ldUplVnk2T0xrN0s0Uzlrc3JQSi9wc0VEek9GU3oKL2Jkb3lOckdqMUU4c3Z1UjNCem5tNTNodHcxeWorS2t4S2w0K2VzVXJNWkRCY0psT1NnWUFzT0NzcDBGdm1YdApsbDlsZER6N0NUVXVlNXdUL1JzUFhjZHRnVHBXRDh3NzRhOENMeUtzUnNwR1BLQWNUTlpFdEY0dVhCVm1DZUVtCktmN0dVbUc2c1hQL3d3eWM1V3hxbEQ4VXlrQVdsWVR6V2Ftc1gweGhrMjNSTzh5aWxRd2lwbWRuUkM2NTJkS0sKUWJObUMxcjdmU09sOGhxdy85NmJnNVF1MFQvZmtyZVJyd1U3WmNlZ2JMSE5ZaExEa0J2akpjNDB2RzkzZHJFUQp3L2NGR3NEV3IzUmlTQmQza21tUVlSemVsWUIwVkk4WUhNUHpBOUMvcEVOMWhsTVllZ291Q1J3Mm41SDlnb29pClM5RU9VQ1hkeXdNTUY4bURBQWhPTlUyS2krM3dBcFJtTEVSL3k1VW5saGV0Q1RDc3RuRVhib3NYOWh3SjFDMDcKbUtWeDAxUVQyV0R6OVV0bVQvcng3aUFTamJTc1Y3RkZZNkdzZHFuQyt3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVNTTC5jb20gRVYgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MgTz1TU0wgQ29ycG9yYXRpb24KIyBTdWJqZWN0OiBDTj1TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgRUNDIE89U1NMIENvcnBvcmF0aW9uCiMgTGFiZWw6ICJTU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgRUNDIgojIFNlcmlhbDogMzE4MjI0NjUyNjc1NDU1NTI4NQojIE1ENSBGaW5nZXJwcmludDogNTk6NTM6MjI6NjU6ODM6NDI6MDE6NTQ6YzA6Y2U6NDI6Yjk6NWE6N2M6ZjI6OTAKIyBTSEExIEZpbmdlcnByaW50OiA0YzpkZDo1MTphMzpkMTpmNToyMDozMjoxNDpiMDpjNjpjNTozMjoyMzowMzo5MTpjNzo0Njo0Mjo2ZAojIFNIQTI1NiBGaW5nZXJwcmludDogMjI6YTI6YzE6Zjc6YmQ6ZWQ6NzA6NGM6YzE6ZTc6MDE6YjU6ZjQ6MDg6YzM6MTA6ODg6MGY6ZTk6NTY6YjU6ZGU6MmE6NGE6NDQ6Zjk6OWM6ODc6M2E6MjU6YTc6YzgKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNsRENDQWhxZ0F3SUJBZ0lJTENtY1d4YnRCWlV3Q2dZSUtvWkl6ajBFQXdJd2Z6RUxNQWtHQTFVRUJoTUMKVlZNeERqQU1CZ05WQkFnTUJWUmxlR0Z6TVJBd0RnWURWUVFIREFkSWIzVnpkRzl1TVJnd0ZnWURWUVFLREE5VApVMHdnUTI5eWNHOXlZWFJwYjI0eE5EQXlCZ05WQkFNTUsxTlRUQzVqYjIwZ1JWWWdVbTl2ZENCRFpYSjBhV1pwClkyRjBhVzl1SUVGMWRHaHZjbWwwZVNCRlEwTXdIaGNOTVRZd01qRXlNVGd4TlRJeldoY05OREV3TWpFeU1UZ3gKTlRJeldqQi9NUXN3Q1FZRFZRUUdFd0pWVXpFT01Bd0dBMVVFQ0F3RlZHVjRZWE14RURBT0JnTlZCQWNNQjBodgpkWE4wYjI0eEdEQVdCZ05WQkFvTUQxTlRUQ0JEYjNKd2IzSmhkR2x2YmpFME1ESUdBMVVFQXd3clUxTk1MbU52CmJTQkZWaUJTYjI5MElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1SUVWRFF6QjJNQkFHQnlxR1NNNDkKQWdFR0JTdUJCQUFpQTJJQUJLb1NSNUNZRy92dncwQUhneUJPOFRDQ29nYlI4cEtHWWZMMklXaktBTVRINmtNQQpWSWJjL1IvZkFMaEJZbHpjY0JZeTNoK1oxTXpGQjhnSUgyRVdCMUU5ZlZ3SFUrTTFPSXpmelovWkxnMUt0aGt1ClduQmFCdTIrOEtHd3l0QUpLYU5qTUdFd0hRWURWUjBPQkJZRUZGdktYdVhlMG9HcXphZ3RaRkcyMlhLYmwrWlAKTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SHdZRFZSMGpCQmd3Rm9BVVc4cGU1ZDdTZ2FyTnFDMWtVYmJaY3B1WAo1azh3RGdZRFZSMFBBUUgvQkFRREFnR0dNQW9HQ0NxR1NNNDlCQU1DQTJnQU1HVUNNUUNLNWtDSk4rdnAxUlBaCnl0UnJKUE93UFlkR1dCcnNzZDl2KzFhNmNHdkhPTXpvc1l4UEQvZnhaM1lPZzlBZVVZOENNRDMySXlnbVRNWmcKaDVNbW03STFIcnJXOXp6UkhNNzZKVHltR29FVlcvTVNEMnp1WllySmg2ajVCK0JpbW94Y1NnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQpQSwMEFAAAAAAAAAAhAIKyos/RAQAA0QEAADoAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3JlcXVlc3RzL2NlcnRzLnB5IyEvdXNyL2Jpbi9lbnYgcHl0aG9uCiMgLSotIGNvZGluZzogdXRmLTggLSotCgoiIiIKcmVxdWVzdHMuY2VydHMKfn5+fn5+fn5+fn5+fn4KClRoaXMgbW9kdWxlIHJldHVybnMgdGhlIHByZWZlcnJlZCBkZWZhdWx0IENBIGNlcnRpZmljYXRlIGJ1bmRsZS4gVGhlcmUgaXMKb25seSBvbmUg4oCUIHRoZSBvbmUgZnJvbSB0aGUgY2VydGlmaSBwYWNrYWdlLgoKSWYgeW91IGFyZSBwYWNrYWdpbmcgUmVxdWVzdHMsIGUuZy4sIGZvciBhIExpbnV4IGRpc3RyaWJ1dGlvbiBvciBhIG1hbmFnZWQKZW52aXJvbm1lbnQsIHlvdSBjYW4gY2hhbmdlIHRoZSBkZWZpbml0aW9uIG9mIHdoZXJlKCkgdG8gcmV0dXJuIGEgc2VwYXJhdGVseQpwYWNrYWdlZCBDQSBidW5kbGUuCiIiIgpmcm9tIHBpcC5fdmVuZG9yLmNlcnRpZmkgaW1wb3J0IHdoZXJlCgppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgcHJpbnQod2hlcmUoKSkKUEsDBBQAAAAAAAAAIQB3yWFNWgYAAFoGAAA7AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9yZXF1ZXN0cy9jb21wYXQucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQoKIiIiCnJlcXVlc3RzLmNvbXBhdAp+fn5+fn5+fn5+fn5+fn4KClRoaXMgbW9kdWxlIGhhbmRsZXMgaW1wb3J0IGNvbXBhdGliaWxpdHkgaXNzdWVzIGJldHdlZW4gUHl0aG9uIDIgYW5kClB5dGhvbiAzLgoiIiIKCmZyb20gcGlwLl92ZW5kb3IgaW1wb3J0IGNoYXJkZXQKCmltcG9ydCBzeXMKCiMgLS0tLS0tLQojIFB5dGhvbnMKIyAtLS0tLS0tCgojIFN5bnRheCBzdWdhci4KX3ZlciA9IHN5cy52ZXJzaW9uX2luZm8KCiM6IFB5dGhvbiAyLng/CmlzX3B5MiA9IChfdmVyWzBdID09IDIpCgojOiBQeXRob24gMy54Pwppc19weTMgPSAoX3ZlclswXSA9PSAzKQoKIyB0cnk6CiMgICAgIGltcG9ydCBzaW1wbGVqc29uIGFzIGpzb24KIyBleGNlcHQgSW1wb3J0RXJyb3I6CmltcG9ydCBqc29uCgojIC0tLS0tLS0tLQojIFNwZWNpZmljcwojIC0tLS0tLS0tLQoKaWYgaXNfcHkyOgogICAgZnJvbSB1cmxsaWIgaW1wb3J0ICgKICAgICAgICBxdW90ZSwgdW5xdW90ZSwgcXVvdGVfcGx1cywgdW5xdW90ZV9wbHVzLCB1cmxlbmNvZGUsIGdldHByb3hpZXMsCiAgICAgICAgcHJveHlfYnlwYXNzLCBwcm94eV9ieXBhc3NfZW52aXJvbm1lbnQsIGdldHByb3hpZXNfZW52aXJvbm1lbnQpCiAgICBmcm9tIHVybHBhcnNlIGltcG9ydCB1cmxwYXJzZSwgdXJsdW5wYXJzZSwgdXJsam9pbiwgdXJsc3BsaXQsIHVybGRlZnJhZwogICAgZnJvbSB1cmxsaWIyIGltcG9ydCBwYXJzZV9odHRwX2xpc3QKICAgIGltcG9ydCBjb29raWVsaWIKICAgIGZyb20gQ29va2llIGltcG9ydCBNb3JzZWwKICAgIGZyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCgogICAgZnJvbSBwaXAuX3ZlbmRvci51cmxsaWIzLnBhY2thZ2VzLm9yZGVyZWRfZGljdCBpbXBvcnQgT3JkZXJlZERpY3QKCiAgICBidWlsdGluX3N0ciA9IHN0cgogICAgYnl0ZXMgPSBzdHIKICAgIHN0ciA9IHVuaWNvZGUKICAgIGJhc2VzdHJpbmcgPSBiYXNlc3RyaW5nCiAgICBudW1lcmljX3R5cGVzID0gKGludCwgbG9uZywgZmxvYXQpCiAgICBpbnRlZ2VyX3R5cGVzID0gKGludCwgbG9uZykKCmVsaWYgaXNfcHkzOgogICAgZnJvbSB1cmxsaWIucGFyc2UgaW1wb3J0IHVybHBhcnNlLCB1cmx1bnBhcnNlLCB1cmxqb2luLCB1cmxzcGxpdCwgdXJsZW5jb2RlLCBxdW90ZSwgdW5xdW90ZSwgcXVvdGVfcGx1cywgdW5xdW90ZV9wbHVzLCB1cmxkZWZyYWcKICAgIGZyb20gdXJsbGliLnJlcXVlc3QgaW1wb3J0IHBhcnNlX2h0dHBfbGlzdCwgZ2V0cHJveGllcywgcHJveHlfYnlwYXNzLCBwcm94eV9ieXBhc3NfZW52aXJvbm1lbnQsIGdldHByb3hpZXNfZW52aXJvbm1lbnQKICAgIGZyb20gaHR0cCBpbXBvcnQgY29va2llamFyIGFzIGNvb2tpZWxpYgogICAgZnJvbSBodHRwLmNvb2tpZXMgaW1wb3J0IE1vcnNlbAogICAgZnJvbSBpbyBpbXBvcnQgU3RyaW5nSU8KICAgIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IE9yZGVyZWREaWN0CgogICAgYnVpbHRpbl9zdHIgPSBzdHIKICAgIHN0ciA9IHN0cgogICAgYnl0ZXMgPSBieXRlcwogICAgYmFzZXN0cmluZyA9IChzdHIsIGJ5dGVzKQogICAgbnVtZXJpY190eXBlcyA9IChpbnQsIGZsb2F0KQogICAgaW50ZWdlcl90eXBlcyA9IChpbnQsKQpQSwMEFAAAAAAAAAAhABNDyTMgRwAAIEcAADwAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3JlcXVlc3RzL2Nvb2tpZXMucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQoKIiIiCnJlcXVlc3RzLmNvb2tpZXMKfn5+fn5+fn5+fn5+fn5+fgoKQ29tcGF0aWJpbGl0eSBjb2RlIHRvIGJlIGFibGUgdG8gdXNlIGBjb29raWVsaWIuQ29va2llSmFyYCB3aXRoIHJlcXVlc3RzLgoKcmVxdWVzdHMudXRpbHMgaW1wb3J0cyBmcm9tIGhlcmUsIHNvIGJlIGNhcmVmdWwgd2l0aCBpbXBvcnRzLgoiIiIKCmltcG9ydCBjb3B5CmltcG9ydCB0aW1lCmltcG9ydCBjYWxlbmRhcgppbXBvcnQgY29sbGVjdGlvbnMKCmZyb20gLl9pbnRlcm5hbF91dGlscyBpbXBvcnQgdG9fbmF0aXZlX3N0cmluZwpmcm9tIC5jb21wYXQgaW1wb3J0IGNvb2tpZWxpYiwgdXJscGFyc2UsIHVybHVucGFyc2UsIE1vcnNlbAoKdHJ5OgogICAgaW1wb3J0IHRocmVhZGluZwpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBpbXBvcnQgZHVtbXlfdGhyZWFkaW5nIGFzIHRocmVhZGluZwoKCmNsYXNzIE1vY2tSZXF1ZXN0KG9iamVjdCk6CiAgICAiIiJXcmFwcyBhIGByZXF1ZXN0cy5SZXF1ZXN0YCB0byBtaW1pYyBhIGB1cmxsaWIyLlJlcXVlc3RgLgoKICAgIFRoZSBjb2RlIGluIGBjb29raWVsaWIuQ29va2llSmFyYCBleHBlY3RzIHRoaXMgaW50ZXJmYWNlIGluIG9yZGVyIHRvIGNvcnJlY3RseQogICAgbWFuYWdlIGNvb2tpZSBwb2xpY2llcywgaS5lLiwgZGV0ZXJtaW5lIHdoZXRoZXIgYSBjb29raWUgY2FuIGJlIHNldCwgZ2l2ZW4gdGhlCiAgICBkb21haW5zIG9mIHRoZSByZXF1ZXN0IGFuZCB0aGUgY29va2llLgoKICAgIFRoZSBvcmlnaW5hbCByZXF1ZXN0IG9iamVjdCBpcyByZWFkLW9ubHkuIFRoZSBjbGllbnQgaXMgcmVzcG9uc2libGUgZm9yIGNvbGxlY3RpbmcKICAgIHRoZSBuZXcgaGVhZGVycyB2aWEgYGdldF9uZXdfaGVhZGVycygpYCBhbmQgaW50ZXJwcmV0aW5nIHRoZW0gYXBwcm9wcmlhdGVseS4gWW91CiAgICBwcm9iYWJseSB3YW50IGBnZXRfY29va2llX2hlYWRlcmAsIGRlZmluZWQgYmVsb3cuCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgcmVxdWVzdCk6CiAgICAgICAgc2VsZi5fciA9IHJlcXVlc3QKICAgICAgICBzZWxmLl9uZXdfaGVhZGVycyA9IHt9CiAgICAgICAgc2VsZi50eXBlID0gdXJscGFyc2Uoc2VsZi5fci51cmwpLnNjaGVtZQoKICAgIGRlZiBnZXRfdHlwZShzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi50eXBlCgogICAgZGVmIGdldF9ob3N0KHNlbGYpOgogICAgICAgIHJldHVybiB1cmxwYXJzZShzZWxmLl9yLnVybCkubmV0bG9jCgogICAgZGVmIGdldF9vcmlnaW5fcmVxX2hvc3Qoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuZ2V0X2hvc3QoKQoKICAgIGRlZiBnZXRfZnVsbF91cmwoc2VsZik6CiAgICAgICAgIyBPbmx5IHJldHVybiB0aGUgcmVzcG9uc2UncyBVUkwgaWYgdGhlIHVzZXIgaGFkbid0IHNldCB0aGUgSG9zdAogICAgICAgICMgaGVhZGVyCiAgICAgICAgaWYgbm90IHNlbGYuX3IuaGVhZGVycy5nZXQoJ0hvc3QnKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3IudXJsCiAgICAgICAgIyBJZiB0aGV5IGRpZCBzZXQgaXQsIHJldHJpZXZlIGl0IGFuZCByZWNvbnN0cnVjdCB0aGUgZXhwZWN0ZWQgZG9tYWluCiAgICAgICAgaG9zdCA9IHRvX25hdGl2ZV9zdHJpbmcoc2VsZi5fci5oZWFkZXJzWydIb3N0J10sIGVuY29kaW5nPSd1dGYtOCcpCiAgICAgICAgcGFyc2VkID0gdXJscGFyc2Uoc2VsZi5fci51cmwpCiAgICAgICAgIyBSZWNvbnN0cnVjdCB0aGUgVVJMIGFzIHdlIGV4cGVjdCBpdAogICAgICAgIHJldHVybiB1cmx1bnBhcnNlKFsKICAgICAgICAgICAgcGFyc2VkLnNjaGVtZSwgaG9zdCwgcGFyc2VkLnBhdGgsIHBhcnNlZC5wYXJhbXMsIHBhcnNlZC5xdWVyeSwKICAgICAgICAgICAgcGFyc2VkLmZyYWdtZW50CiAgICAgICAgXSkKCiAgICBkZWYgaXNfdW52ZXJpZmlhYmxlKHNlbGYpOgogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGhhc19oZWFkZXIoc2VsZiwgbmFtZSk6CiAgICAgICAgcmV0dXJuIG5hbWUgaW4gc2VsZi5fci5oZWFkZXJzIG9yIG5hbWUgaW4gc2VsZi5fbmV3X2hlYWRlcnMKCiAgICBkZWYgZ2V0X2hlYWRlcihzZWxmLCBuYW1lLCBkZWZhdWx0PU5vbmUpOgogICAgICAgIHJldHVybiBzZWxmLl9yLmhlYWRlcnMuZ2V0KG5hbWUsIHNlbGYuX25ld19oZWFkZXJzLmdldChuYW1lLCBkZWZhdWx0KSkKCiAgICBkZWYgYWRkX2hlYWRlcihzZWxmLCBrZXksIHZhbCk6CiAgICAgICAgIiIiY29va2llbGliIGhhcyBubyBsZWdpdGltYXRlIHVzZSBmb3IgdGhpcyBtZXRob2Q7IGFkZCBpdCBiYWNrIGlmIHlvdSBmaW5kIG9uZS4iIiIKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCJDb29raWUgaGVhZGVycyBzaG91bGQgYmUgYWRkZWQgd2l0aCBhZGRfdW5yZWRpcmVjdGVkX2hlYWRlcigpIikKCiAgICBkZWYgYWRkX3VucmVkaXJlY3RlZF9oZWFkZXIoc2VsZiwgbmFtZSwgdmFsdWUpOgogICAgICAgIHNlbGYuX25ld19oZWFkZXJzW25hbWVdID0gdmFsdWUKCiAgICBkZWYgZ2V0X25ld19oZWFkZXJzKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9uZXdfaGVhZGVycwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHVudmVyaWZpYWJsZShzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5pc191bnZlcmlmaWFibGUoKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIG9yaWdpbl9yZXFfaG9zdChzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5nZXRfb3JpZ2luX3JlcV9ob3N0KCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBob3N0KHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLmdldF9ob3N0KCkKCgpjbGFzcyBNb2NrUmVzcG9uc2Uob2JqZWN0KToKICAgICIiIldyYXBzIGEgYGh0dHBsaWIuSFRUUE1lc3NhZ2VgIHRvIG1pbWljIGEgYHVybGxpYi5hZGRpbmZvdXJsYC4KCiAgICAuLi53aGF0PyBCYXNpY2FsbHksIGV4cG9zZSB0aGUgcGFyc2VkIEhUVFAgaGVhZGVycyBmcm9tIHRoZSBzZXJ2ZXIgcmVzcG9uc2UKICAgIHRoZSB3YXkgYGNvb2tpZWxpYmAgZXhwZWN0cyB0byBzZWUgdGhlbS4KICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBoZWFkZXJzKToKICAgICAgICAiIiJNYWtlIGEgTW9ja1Jlc3BvbnNlIGZvciBgY29va2llbGliYCB0byByZWFkLgoKICAgICAgICA6cGFyYW0gaGVhZGVyczogYSBodHRwbGliLkhUVFBNZXNzYWdlIG9yIGFuYWxvZ291cyBjYXJyeWluZyB0aGUgaGVhZGVycwogICAgICAgICIiIgogICAgICAgIHNlbGYuX2hlYWRlcnMgPSBoZWFkZXJzCgogICAgZGVmIGluZm8oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2hlYWRlcnMKCiAgICBkZWYgZ2V0aGVhZGVycyhzZWxmLCBuYW1lKToKICAgICAgICBzZWxmLl9oZWFkZXJzLmdldGhlYWRlcnMobmFtZSkKCgpkZWYgZXh0cmFjdF9jb29raWVzX3RvX2phcihqYXIsIHJlcXVlc3QsIHJlc3BvbnNlKToKICAgICIiIkV4dHJhY3QgdGhlIGNvb2tpZXMgZnJvbSB0aGUgcmVzcG9uc2UgaW50byBhIENvb2tpZUphci4KCiAgICA6cGFyYW0gamFyOiBjb29raWVsaWIuQ29va2llSmFyIChub3QgbmVjZXNzYXJpbHkgYSBSZXF1ZXN0c0Nvb2tpZUphcikKICAgIDpwYXJhbSByZXF1ZXN0OiBvdXIgb3duIHJlcXVlc3RzLlJlcXVlc3Qgb2JqZWN0CiAgICA6cGFyYW0gcmVzcG9uc2U6IHVybGxpYjMuSFRUUFJlc3BvbnNlIG9iamVjdAogICAgIiIiCiAgICBpZiBub3QgKGhhc2F0dHIocmVzcG9uc2UsICdfb3JpZ2luYWxfcmVzcG9uc2UnKSBhbmQKICAgICAgICAgICAgcmVzcG9uc2UuX29yaWdpbmFsX3Jlc3BvbnNlKToKICAgICAgICByZXR1cm4KICAgICMgdGhlIF9vcmlnaW5hbF9yZXNwb25zZSBmaWVsZCBpcyB0aGUgd3JhcHBlZCBodHRwbGliLkhUVFBSZXNwb25zZSBvYmplY3QsCiAgICByZXEgPSBNb2NrUmVxdWVzdChyZXF1ZXN0KQogICAgIyBwdWxsIG91dCB0aGUgSFRUUE1lc3NhZ2Ugd2l0aCB0aGUgaGVhZGVycyBhbmQgcHV0IGl0IGluIHRoZSBtb2NrOgogICAgcmVzID0gTW9ja1Jlc3BvbnNlKHJlc3BvbnNlLl9vcmlnaW5hbF9yZXNwb25zZS5tc2cpCiAgICBqYXIuZXh0cmFjdF9jb29raWVzKHJlcywgcmVxKQoKCmRlZiBnZXRfY29va2llX2hlYWRlcihqYXIsIHJlcXVlc3QpOgogICAgIiIiCiAgICBQcm9kdWNlIGFuIGFwcHJvcHJpYXRlIENvb2tpZSBoZWFkZXIgc3RyaW5nIHRvIGJlIHNlbnQgd2l0aCBgcmVxdWVzdGAsIG9yIE5vbmUuCgogICAgOnJ0eXBlOiBzdHIKICAgICIiIgogICAgciA9IE1vY2tSZXF1ZXN0KHJlcXVlc3QpCiAgICBqYXIuYWRkX2Nvb2tpZV9oZWFkZXIocikKICAgIHJldHVybiByLmdldF9uZXdfaGVhZGVycygpLmdldCgnQ29va2llJykKCgpkZWYgcmVtb3ZlX2Nvb2tpZV9ieV9uYW1lKGNvb2tpZWphciwgbmFtZSwgZG9tYWluPU5vbmUsIHBhdGg9Tm9uZSk6CiAgICAiIiJVbnNldHMgYSBjb29raWUgYnkgbmFtZSwgYnkgZGVmYXVsdCBvdmVyIGFsbCBkb21haW5zIGFuZCBwYXRocy4KCiAgICBXcmFwcyBDb29raWVKYXIuY2xlYXIoKSwgaXMgTyhuKS4KICAgICIiIgogICAgY2xlYXJhYmxlcyA9IFtdCiAgICBmb3IgY29va2llIGluIGNvb2tpZWphcjoKICAgICAgICBpZiBjb29raWUubmFtZSAhPSBuYW1lOgogICAgICAgICAgICBjb250aW51ZQogICAgICAgIGlmIGRvbWFpbiBpcyBub3QgTm9uZSBhbmQgZG9tYWluICE9IGNvb2tpZS5kb21haW46CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgaWYgcGF0aCBpcyBub3QgTm9uZSBhbmQgcGF0aCAhPSBjb29raWUucGF0aDoKICAgICAgICAgICAgY29udGludWUKICAgICAgICBjbGVhcmFibGVzLmFwcGVuZCgoY29va2llLmRvbWFpbiwgY29va2llLnBhdGgsIGNvb2tpZS5uYW1lKSkKCiAgICBmb3IgZG9tYWluLCBwYXRoLCBuYW1lIGluIGNsZWFyYWJsZXM6CiAgICAgICAgY29va2llamFyLmNsZWFyKGRvbWFpbiwgcGF0aCwgbmFtZSkKCgpjbGFzcyBDb29raWVDb25mbGljdEVycm9yKFJ1bnRpbWVFcnJvcik6CiAgICAiIiJUaGVyZSBhcmUgdHdvIGNvb2tpZXMgdGhhdCBtZWV0IHRoZSBjcml0ZXJpYSBzcGVjaWZpZWQgaW4gdGhlIGNvb2tpZSBqYXIuCiAgICBVc2UgLmdldCBhbmQgLnNldCBhbmQgaW5jbHVkZSBkb21haW4gYW5kIHBhdGggYXJncyBpbiBvcmRlciB0byBiZSBtb3JlIHNwZWNpZmljLgogICAgIiIiCgoKY2xhc3MgUmVxdWVzdHNDb29raWVKYXIoY29va2llbGliLkNvb2tpZUphciwgY29sbGVjdGlvbnMuTXV0YWJsZU1hcHBpbmcpOgogICAgIiIiQ29tcGF0aWJpbGl0eSBjbGFzczsgaXMgYSBjb29raWVsaWIuQ29va2llSmFyLCBidXQgZXhwb3NlcyBhIGRpY3QKICAgIGludGVyZmFjZS4KCiAgICBUaGlzIGlzIHRoZSBDb29raWVKYXIgd2UgY3JlYXRlIGJ5IGRlZmF1bHQgZm9yIHJlcXVlc3RzIGFuZCBzZXNzaW9ucyB0aGF0CiAgICBkb24ndCBzcGVjaWZ5IG9uZSwgc2luY2Ugc29tZSBjbGllbnRzIG1heSBleHBlY3QgcmVzcG9uc2UuY29va2llcyBhbmQKICAgIHNlc3Npb24uY29va2llcyB0byBzdXBwb3J0IGRpY3Qgb3BlcmF0aW9ucy4KCiAgICBSZXF1ZXN0cyBkb2VzIG5vdCB1c2UgdGhlIGRpY3QgaW50ZXJmYWNlIGludGVybmFsbHk7IGl0J3MganVzdCBmb3IKICAgIGNvbXBhdGliaWxpdHkgd2l0aCBleHRlcm5hbCBjbGllbnQgY29kZS4gQWxsIHJlcXVlc3RzIGNvZGUgc2hvdWxkIHdvcmsKICAgIG91dCBvZiB0aGUgYm94IHdpdGggZXh0ZXJuYWxseSBwcm92aWRlZCBpbnN0YW5jZXMgb2YgYGBDb29raWVKYXJgYCwgZS5nLgogICAgYGBMV1BDb29raWVKYXJgYCBhbmQgYGBGaWxlQ29va2llSmFyYGAuCgogICAgVW5saWtlIGEgcmVndWxhciBDb29raWVKYXIsIHRoaXMgY2xhc3MgaXMgcGlja2xlYWJsZS4KCiAgICAuLiB3YXJuaW5nOjogZGljdGlvbmFyeSBvcGVyYXRpb25zIHRoYXQgYXJlIG5vcm1hbGx5IE8oMSkgbWF5IGJlIE8obikuCiAgICAiIiIKCiAgICBkZWYgZ2V0KHNlbGYsIG5hbWUsIGRlZmF1bHQ9Tm9uZSwgZG9tYWluPU5vbmUsIHBhdGg9Tm9uZSk6CiAgICAgICAgIiIiRGljdC1saWtlIGdldCgpIHRoYXQgYWxzbyBzdXBwb3J0cyBvcHRpb25hbCBkb21haW4gYW5kIHBhdGggYXJncyBpbgogICAgICAgIG9yZGVyIHRvIHJlc29sdmUgbmFtaW5nIGNvbGxpc2lvbnMgZnJvbSB1c2luZyBvbmUgY29va2llIGphciBvdmVyCiAgICAgICAgbXVsdGlwbGUgZG9tYWlucy4KCiAgICAgICAgLi4gd2FybmluZzo6IG9wZXJhdGlvbiBpcyBPKG4pLCBub3QgTygxKS4KICAgICAgICAiIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9maW5kX25vX2R1cGxpY2F0ZXMobmFtZSwgZG9tYWluLCBwYXRoKQogICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHQKCiAgICBkZWYgc2V0KHNlbGYsIG5hbWUsIHZhbHVlLCAqKmt3YXJncyk6CiAgICAgICAgIiIiRGljdC1saWtlIHNldCgpIHRoYXQgYWxzbyBzdXBwb3J0cyBvcHRpb25hbCBkb21haW4gYW5kIHBhdGggYXJncyBpbgogICAgICAgIG9yZGVyIHRvIHJlc29sdmUgbmFtaW5nIGNvbGxpc2lvbnMgZnJvbSB1c2luZyBvbmUgY29va2llIGphciBvdmVyCiAgICAgICAgbXVsdGlwbGUgZG9tYWlucy4KICAgICAgICAiIiIKICAgICAgICAjIHN1cHBvcnQgY2xpZW50IGNvZGUgdGhhdCB1bnNldHMgY29va2llcyBieSBhc3NpZ25tZW50IG9mIGEgTm9uZSB2YWx1ZToKICAgICAgICBpZiB2YWx1ZSBpcyBOb25lOgogICAgICAgICAgICByZW1vdmVfY29va2llX2J5X25hbWUoc2VsZiwgbmFtZSwgZG9tYWluPWt3YXJncy5nZXQoJ2RvbWFpbicpLCBwYXRoPWt3YXJncy5nZXQoJ3BhdGgnKSkKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIE1vcnNlbCk6CiAgICAgICAgICAgIGMgPSBtb3JzZWxfdG9fY29va2llKHZhbHVlKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGMgPSBjcmVhdGVfY29va2llKG5hbWUsIHZhbHVlLCAqKmt3YXJncykKICAgICAgICBzZWxmLnNldF9jb29raWUoYykKICAgICAgICByZXR1cm4gYwoKICAgIGRlZiBpdGVya2V5cyhzZWxmKToKICAgICAgICAiIiJEaWN0LWxpa2UgaXRlcmtleXMoKSB0aGF0IHJldHVybnMgYW4gaXRlcmF0b3Igb2YgbmFtZXMgb2YgY29va2llcwogICAgICAgIGZyb20gdGhlIGphci4KCiAgICAgICAgLi4gc2VlYWxzbzo6IGl0ZXJ2YWx1ZXMoKSBhbmQgaXRlcml0ZW1zKCkuCiAgICAgICAgIiIiCiAgICAgICAgZm9yIGNvb2tpZSBpbiBpdGVyKHNlbGYpOgogICAgICAgICAgICB5aWVsZCBjb29raWUubmFtZQoKICAgIGRlZiBrZXlzKHNlbGYpOgogICAgICAgICIiIkRpY3QtbGlrZSBrZXlzKCkgdGhhdCByZXR1cm5zIGEgbGlzdCBvZiBuYW1lcyBvZiBjb29raWVzIGZyb20gdGhlCiAgICAgICAgamFyLgoKICAgICAgICAuLiBzZWVhbHNvOjogdmFsdWVzKCkgYW5kIGl0ZW1zKCkuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi5pdGVya2V5cygpKQoKICAgIGRlZiBpdGVydmFsdWVzKHNlbGYpOgogICAgICAgICIiIkRpY3QtbGlrZSBpdGVydmFsdWVzKCkgdGhhdCByZXR1cm5zIGFuIGl0ZXJhdG9yIG9mIHZhbHVlcyBvZiBjb29raWVzCiAgICAgICAgZnJvbSB0aGUgamFyLgoKICAgICAgICAuLiBzZWVhbHNvOjogaXRlcmtleXMoKSBhbmQgaXRlcml0ZW1zKCkuCiAgICAgICAgIiIiCiAgICAgICAgZm9yIGNvb2tpZSBpbiBpdGVyKHNlbGYpOgogICAgICAgICAgICB5aWVsZCBjb29raWUudmFsdWUKCiAgICBkZWYgdmFsdWVzKHNlbGYpOgogICAgICAgICIiIkRpY3QtbGlrZSB2YWx1ZXMoKSB0aGF0IHJldHVybnMgYSBsaXN0IG9mIHZhbHVlcyBvZiBjb29raWVzIGZyb20gdGhlCiAgICAgICAgamFyLgoKICAgICAgICAuLiBzZWVhbHNvOjoga2V5cygpIGFuZCBpdGVtcygpLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBsaXN0KHNlbGYuaXRlcnZhbHVlcygpKQoKICAgIGRlZiBpdGVyaXRlbXMoc2VsZik6CiAgICAgICAgIiIiRGljdC1saWtlIGl0ZXJpdGVtcygpIHRoYXQgcmV0dXJucyBhbiBpdGVyYXRvciBvZiBuYW1lLXZhbHVlIHR1cGxlcwogICAgICAgIGZyb20gdGhlIGphci4KCiAgICAgICAgLi4gc2VlYWxzbzo6IGl0ZXJrZXlzKCkgYW5kIGl0ZXJ2YWx1ZXMoKS4KICAgICAgICAiIiIKICAgICAgICBmb3IgY29va2llIGluIGl0ZXIoc2VsZik6CiAgICAgICAgICAgIHlpZWxkIGNvb2tpZS5uYW1lLCBjb29raWUudmFsdWUKCiAgICBkZWYgaXRlbXMoc2VsZik6CiAgICAgICAgIiIiRGljdC1saWtlIGl0ZW1zKCkgdGhhdCByZXR1cm5zIGEgbGlzdCBvZiBuYW1lLXZhbHVlIHR1cGxlcyBmcm9tIHRoZQogICAgICAgIGphci4gQWxsb3dzIGNsaWVudC1jb2RlIHRvIGNhbGwgYGBkaWN0KFJlcXVlc3RzQ29va2llSmFyKWBgIGFuZCBnZXQgYQogICAgICAgIHZhbmlsbGEgcHl0aG9uIGRpY3Qgb2Yga2V5IHZhbHVlIHBhaXJzLgoKICAgICAgICAuLiBzZWVhbHNvOjoga2V5cygpIGFuZCB2YWx1ZXMoKS4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gbGlzdChzZWxmLml0ZXJpdGVtcygpKQoKICAgIGRlZiBsaXN0X2RvbWFpbnMoc2VsZik6CiAgICAgICAgIiIiVXRpbGl0eSBtZXRob2QgdG8gbGlzdCBhbGwgdGhlIGRvbWFpbnMgaW4gdGhlIGphci4iIiIKICAgICAgICBkb21haW5zID0gW10KICAgICAgICBmb3IgY29va2llIGluIGl0ZXIoc2VsZik6CiAgICAgICAgICAgIGlmIGNvb2tpZS5kb21haW4gbm90IGluIGRvbWFpbnM6CiAgICAgICAgICAgICAgICBkb21haW5zLmFwcGVuZChjb29raWUuZG9tYWluKQogICAgICAgIHJldHVybiBkb21haW5zCgogICAgZGVmIGxpc3RfcGF0aHMoc2VsZik6CiAgICAgICAgIiIiVXRpbGl0eSBtZXRob2QgdG8gbGlzdCBhbGwgdGhlIHBhdGhzIGluIHRoZSBqYXIuIiIiCiAgICAgICAgcGF0aHMgPSBbXQogICAgICAgIGZvciBjb29raWUgaW4gaXRlcihzZWxmKToKICAgICAgICAgICAgaWYgY29va2llLnBhdGggbm90IGluIHBhdGhzOgogICAgICAgICAgICAgICAgcGF0aHMuYXBwZW5kKGNvb2tpZS5wYXRoKQogICAgICAgIHJldHVybiBwYXRocwoKICAgIGRlZiBtdWx0aXBsZV9kb21haW5zKHNlbGYpOgogICAgICAgICIiIlJldHVybnMgVHJ1ZSBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgZG9tYWlucyBpbiB0aGUgamFyLgogICAgICAgIFJldHVybnMgRmFsc2Ugb3RoZXJ3aXNlLgoKICAgICAgICA6cnR5cGU6IGJvb2wKICAgICAgICAiIiIKICAgICAgICBkb21haW5zID0gW10KICAgICAgICBmb3IgY29va2llIGluIGl0ZXIoc2VsZik6CiAgICAgICAgICAgIGlmIGNvb2tpZS5kb21haW4gaXMgbm90IE5vbmUgYW5kIGNvb2tpZS5kb21haW4gaW4gZG9tYWluczoKICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgICAgIGRvbWFpbnMuYXBwZW5kKGNvb2tpZS5kb21haW4pCiAgICAgICAgcmV0dXJuIEZhbHNlICAjIHRoZXJlIGlzIG9ubHkgb25lIGRvbWFpbiBpbiBqYXIKCiAgICBkZWYgZ2V0X2RpY3Qoc2VsZiwgZG9tYWluPU5vbmUsIHBhdGg9Tm9uZSk6CiAgICAgICAgIiIiVGFrZXMgYXMgYW4gYXJndW1lbnQgYW4gb3B0aW9uYWwgZG9tYWluIGFuZCBwYXRoIGFuZCByZXR1cm5zIGEgcGxhaW4KICAgICAgICBvbGQgUHl0aG9uIGRpY3Qgb2YgbmFtZS12YWx1ZSBwYWlycyBvZiBjb29raWVzIHRoYXQgbWVldCB0aGUKICAgICAgICByZXF1aXJlbWVudHMuCgogICAgICAgIDpydHlwZTogZGljdAogICAgICAgICIiIgogICAgICAgIGRpY3Rpb25hcnkgPSB7fQogICAgICAgIGZvciBjb29raWUgaW4gaXRlcihzZWxmKToKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgKGRvbWFpbiBpcyBOb25lIG9yIGNvb2tpZS5kb21haW4gPT0gZG9tYWluKSBhbmQKICAgICAgICAgICAgICAgIChwYXRoIGlzIE5vbmUgb3IgY29va2llLnBhdGggPT0gcGF0aCkKICAgICAgICAgICAgKToKICAgICAgICAgICAgICAgIGRpY3Rpb25hcnlbY29va2llLm5hbWVdID0gY29va2llLnZhbHVlCiAgICAgICAgcmV0dXJuIGRpY3Rpb25hcnkKCiAgICBkZWYgX19jb250YWluc19fKHNlbGYsIG5hbWUpOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHN1cGVyKFJlcXVlc3RzQ29va2llSmFyLCBzZWxmKS5fX2NvbnRhaW5zX18obmFtZSkKICAgICAgICBleGNlcHQgQ29va2llQ29uZmxpY3RFcnJvcjoKICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgbmFtZSk6CiAgICAgICAgIiIiRGljdC1saWtlIF9fZ2V0aXRlbV9fKCkgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBjbGllbnQgY29kZS4gVGhyb3dzCiAgICAgICAgZXhjZXB0aW9uIGlmIHRoZXJlIGFyZSBtb3JlIHRoYW4gb25lIGNvb2tpZSB3aXRoIG5hbWUuIEluIHRoYXQgY2FzZSwKICAgICAgICB1c2UgdGhlIG1vcmUgZXhwbGljaXQgZ2V0KCkgbWV0aG9kIGluc3RlYWQuCgogICAgICAgIC4uIHdhcm5pbmc6OiBvcGVyYXRpb24gaXMgTyhuKSwgbm90IE8oMSkuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuX2ZpbmRfbm9fZHVwbGljYXRlcyhuYW1lKQoKICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBuYW1lLCB2YWx1ZSk6CiAgICAgICAgIiIiRGljdC1saWtlIF9fc2V0aXRlbV9fIGZvciBjb21wYXRpYmlsaXR5IHdpdGggY2xpZW50IGNvZGUuIFRocm93cwogICAgICAgIGV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbHJlYWR5IGEgY29va2llIG9mIHRoYXQgbmFtZSBpbiB0aGUgamFyLiBJbiB0aGF0CiAgICAgICAgY2FzZSwgdXNlIHRoZSBtb3JlIGV4cGxpY2l0IHNldCgpIG1ldGhvZCBpbnN0ZWFkLgogICAgICAgICIiIgogICAgICAgIHNlbGYuc2V0KG5hbWUsIHZhbHVlKQoKICAgIGRlZiBfX2RlbGl0ZW1fXyhzZWxmLCBuYW1lKToKICAgICAgICAiIiJEZWxldGVzIGEgY29va2llIGdpdmVuIGEgbmFtZS4gV3JhcHMgYGBjb29raWVsaWIuQ29va2llSmFyYGAncwogICAgICAgIGBgcmVtb3ZlX2Nvb2tpZV9ieV9uYW1lKClgYC4KICAgICAgICAiIiIKICAgICAgICByZW1vdmVfY29va2llX2J5X25hbWUoc2VsZiwgbmFtZSkKCiAgICBkZWYgc2V0X2Nvb2tpZShzZWxmLCBjb29raWUsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgaWYgaGFzYXR0cihjb29raWUudmFsdWUsICdzdGFydHN3aXRoJykgYW5kIGNvb2tpZS52YWx1ZS5zdGFydHN3aXRoKCciJykgYW5kIGNvb2tpZS52YWx1ZS5lbmRzd2l0aCgnIicpOgogICAgICAgICAgICBjb29raWUudmFsdWUgPSBjb29raWUudmFsdWUucmVwbGFjZSgnXFwiJywgJycpCiAgICAgICAgcmV0dXJuIHN1cGVyKFJlcXVlc3RzQ29va2llSmFyLCBzZWxmKS5zZXRfY29va2llKGNvb2tpZSwgKmFyZ3MsICoqa3dhcmdzKQoKICAgIGRlZiB1cGRhdGUoc2VsZiwgb3RoZXIpOgogICAgICAgICIiIlVwZGF0ZXMgdGhpcyBqYXIgd2l0aCBjb29raWVzIGZyb20gYW5vdGhlciBDb29raWVKYXIgb3IgZGljdC1saWtlIiIiCiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgY29va2llbGliLkNvb2tpZUphcik6CiAgICAgICAgICAgIGZvciBjb29raWUgaW4gb3RoZXI6CiAgICAgICAgICAgICAgICBzZWxmLnNldF9jb29raWUoY29weS5jb3B5KGNvb2tpZSkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc3VwZXIoUmVxdWVzdHNDb29raWVKYXIsIHNlbGYpLnVwZGF0ZShvdGhlcikKCiAgICBkZWYgX2ZpbmQoc2VsZiwgbmFtZSwgZG9tYWluPU5vbmUsIHBhdGg9Tm9uZSk6CiAgICAgICAgIiIiUmVxdWVzdHMgdXNlcyB0aGlzIG1ldGhvZCBpbnRlcm5hbGx5IHRvIGdldCBjb29raWUgdmFsdWVzLgoKICAgICAgICBJZiB0aGVyZSBhcmUgY29uZmxpY3RpbmcgY29va2llcywgX2ZpbmQgYXJiaXRyYXJpbHkgY2hvb3NlcyBvbmUuCiAgICAgICAgU2VlIF9maW5kX25vX2R1cGxpY2F0ZXMgaWYgeW91IHdhbnQgYW4gZXhjZXB0aW9uIHRocm93biBpZiB0aGVyZSBhcmUKICAgICAgICBjb25mbGljdGluZyBjb29raWVzLgoKICAgICAgICA6cGFyYW0gbmFtZTogYSBzdHJpbmcgY29udGFpbmluZyBuYW1lIG9mIGNvb2tpZQogICAgICAgIDpwYXJhbSBkb21haW46IChvcHRpb25hbCkgc3RyaW5nIGNvbnRhaW5pbmcgZG9tYWluIG9mIGNvb2tpZQogICAgICAgIDpwYXJhbSBwYXRoOiAob3B0aW9uYWwpIHN0cmluZyBjb250YWluaW5nIHBhdGggb2YgY29va2llCiAgICAgICAgOnJldHVybjogY29va2llLnZhbHVlCiAgICAgICAgIiIiCiAgICAgICAgZm9yIGNvb2tpZSBpbiBpdGVyKHNlbGYpOgogICAgICAgICAgICBpZiBjb29raWUubmFtZSA9PSBuYW1lOgogICAgICAgICAgICAgICAgaWYgZG9tYWluIGlzIE5vbmUgb3IgY29va2llLmRvbWFpbiA9PSBkb21haW46CiAgICAgICAgICAgICAgICAgICAgaWYgcGF0aCBpcyBOb25lIG9yIGNvb2tpZS5wYXRoID09IHBhdGg6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb29raWUudmFsdWUKCiAgICAgICAgcmFpc2UgS2V5RXJyb3IoJ25hbWU9JXIsIGRvbWFpbj0lciwgcGF0aD0lcicgJSAobmFtZSwgZG9tYWluLCBwYXRoKSkKCiAgICBkZWYgX2ZpbmRfbm9fZHVwbGljYXRlcyhzZWxmLCBuYW1lLCBkb21haW49Tm9uZSwgcGF0aD1Ob25lKToKICAgICAgICAiIiJCb3RoIGBgX19nZXRfaXRlbV9fYGAgYW5kIGBgZ2V0YGAgY2FsbCB0aGlzIGZ1bmN0aW9uOiBpdCdzIG5ldmVyCiAgICAgICAgdXNlZCBlbHNld2hlcmUgaW4gUmVxdWVzdHMuCgogICAgICAgIDpwYXJhbSBuYW1lOiBhIHN0cmluZyBjb250YWluaW5nIG5hbWUgb2YgY29va2llCiAgICAgICAgOnBhcmFtIGRvbWFpbjogKG9wdGlvbmFsKSBzdHJpbmcgY29udGFpbmluZyBkb21haW4gb2YgY29va2llCiAgICAgICAgOnBhcmFtIHBhdGg6IChvcHRpb25hbCkgc3RyaW5nIGNvbnRhaW5pbmcgcGF0aCBvZiBjb29raWUKICAgICAgICA6cmFpc2VzIEtleUVycm9yOiBpZiBjb29raWUgaXMgbm90IGZvdW5kCiAgICAgICAgOnJhaXNlcyBDb29raWVDb25mbGljdEVycm9yOiBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgY29va2llcwogICAgICAgICAgICB0aGF0IG1hdGNoIG5hbWUgYW5kIG9wdGlvbmFsbHkgZG9tYWluIGFuZCBwYXRoCiAgICAgICAgOnJldHVybjogY29va2llLnZhbHVlCiAgICAgICAgIiIiCiAgICAgICAgdG9SZXR1cm4gPSBOb25lCiAgICAgICAgZm9yIGNvb2tpZSBpbiBpdGVyKHNlbGYpOgogICAgICAgICAgICBpZiBjb29raWUubmFtZSA9PSBuYW1lOgogICAgICAgICAgICAgICAgaWYgZG9tYWluIGlzIE5vbmUgb3IgY29va2llLmRvbWFpbiA9PSBkb21haW46CiAgICAgICAgICAgICAgICAgICAgaWYgcGF0aCBpcyBOb25lIG9yIGNvb2tpZS5wYXRoID09IHBhdGg6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRvUmV0dXJuIGlzIG5vdCBOb25lOiAgIyBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgY29va2llcyB0aGF0IG1lZXQgcGFzc2VkIGluIGNyaXRlcmlhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBDb29raWVDb25mbGljdEVycm9yKCdUaGVyZSBhcmUgbXVsdGlwbGUgY29va2llcyB3aXRoIG5hbWUsICVyJyAlIChuYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgdG9SZXR1cm4gPSBjb29raWUudmFsdWUgICMgd2Ugd2lsbCBldmVudHVhbGx5IHJldHVybiB0aGlzIGFzIGxvbmcgYXMgbm8gY29va2llIGNvbmZsaWN0CgogICAgICAgIGlmIHRvUmV0dXJuOgogICAgICAgICAgICByZXR1cm4gdG9SZXR1cm4KICAgICAgICByYWlzZSBLZXlFcnJvcignbmFtZT0lciwgZG9tYWluPSVyLCBwYXRoPSVyJyAlIChuYW1lLCBkb21haW4sIHBhdGgpKQoKICAgIGRlZiBfX2dldHN0YXRlX18oc2VsZik6CiAgICAgICAgIiIiVW5saWtlIGEgbm9ybWFsIENvb2tpZUphciwgdGhpcyBjbGFzcyBpcyBwaWNrbGVhYmxlLiIiIgogICAgICAgIHN0YXRlID0gc2VsZi5fX2RpY3RfXy5jb3B5KCkKICAgICAgICAjIHJlbW92ZSB0aGUgdW5waWNrbGVhYmxlIFJMb2NrIG9iamVjdAogICAgICAgIHN0YXRlLnBvcCgnX2Nvb2tpZXNfbG9jaycpCiAgICAgICAgcmV0dXJuIHN0YXRlCgogICAgZGVmIF9fc2V0c3RhdGVfXyhzZWxmLCBzdGF0ZSk6CiAgICAgICAgIiIiVW5saWtlIGEgbm9ybWFsIENvb2tpZUphciwgdGhpcyBjbGFzcyBpcyBwaWNrbGVhYmxlLiIiIgogICAgICAgIHNlbGYuX19kaWN0X18udXBkYXRlKHN0YXRlKQogICAgICAgIGlmICdfY29va2llc19sb2NrJyBub3QgaW4gc2VsZi5fX2RpY3RfXzoKICAgICAgICAgICAgc2VsZi5fY29va2llc19sb2NrID0gdGhyZWFkaW5nLlJMb2NrKCkKCiAgICBkZWYgY29weShzZWxmKToKICAgICAgICAiIiJSZXR1cm4gYSBjb3B5IG9mIHRoaXMgUmVxdWVzdHNDb29raWVKYXIuIiIiCiAgICAgICAgbmV3X2NqID0gUmVxdWVzdHNDb29raWVKYXIoKQogICAgICAgIG5ld19jai51cGRhdGUoc2VsZikKICAgICAgICByZXR1cm4gbmV3X2NqCgoKZGVmIF9jb3B5X2Nvb2tpZV9qYXIoamFyKToKICAgIGlmIGphciBpcyBOb25lOgogICAgICAgIHJldHVybiBOb25lCgogICAgaWYgaGFzYXR0cihqYXIsICdjb3B5Jyk6CiAgICAgICAgIyBXZSdyZSBkZWFsaW5nIHdpdGggYW4gaW5zdGFuY2Ugb2YgUmVxdWVzdHNDb29raWVKYXIKICAgICAgICByZXR1cm4gamFyLmNvcHkoKQogICAgIyBXZSdyZSBkZWFsaW5nIHdpdGggYSBnZW5lcmljIENvb2tpZUphciBpbnN0YW5jZQogICAgbmV3X2phciA9IGNvcHkuY29weShqYXIpCiAgICBuZXdfamFyLmNsZWFyKCkKICAgIGZvciBjb29raWUgaW4gamFyOgogICAgICAgIG5ld19qYXIuc2V0X2Nvb2tpZShjb3B5LmNvcHkoY29va2llKSkKICAgIHJldHVybiBuZXdfamFyCgoKZGVmIGNyZWF0ZV9jb29raWUobmFtZSwgdmFsdWUsICoqa3dhcmdzKToKICAgICIiIk1ha2UgYSBjb29raWUgZnJvbSB1bmRlcnNwZWNpZmllZCBwYXJhbWV0ZXJzLgoKICAgIEJ5IGRlZmF1bHQsIHRoZSBwYWlyIG9mIGBuYW1lYCBhbmQgYHZhbHVlYCB3aWxsIGJlIHNldCBmb3IgdGhlIGRvbWFpbiAnJwogICAgYW5kIHNlbnQgb24gZXZlcnkgcmVxdWVzdCAodGhpcyBpcyBzb21ldGltZXMgY2FsbGVkIGEgInN1cGVyY29va2llIikuCiAgICAiIiIKICAgIHJlc3VsdCA9IGRpY3QoCiAgICAgICAgdmVyc2lvbj0wLAogICAgICAgIG5hbWU9bmFtZSwKICAgICAgICB2YWx1ZT12YWx1ZSwKICAgICAgICBwb3J0PU5vbmUsCiAgICAgICAgZG9tYWluPScnLAogICAgICAgIHBhdGg9Jy8nLAogICAgICAgIHNlY3VyZT1GYWxzZSwKICAgICAgICBleHBpcmVzPU5vbmUsCiAgICAgICAgZGlzY2FyZD1UcnVlLAogICAgICAgIGNvbW1lbnQ9Tm9uZSwKICAgICAgICBjb21tZW50X3VybD1Ob25lLAogICAgICAgIHJlc3Q9eydIdHRwT25seSc6IE5vbmV9LAogICAgICAgIHJmYzIxMDk9RmFsc2UsKQoKICAgIGJhZGFyZ3MgPSBzZXQoa3dhcmdzKSAtIHNldChyZXN1bHQpCiAgICBpZiBiYWRhcmdzOgogICAgICAgIGVyciA9ICdjcmVhdGVfY29va2llKCkgZ290IHVuZXhwZWN0ZWQga2V5d29yZCBhcmd1bWVudHM6ICVzJwogICAgICAgIHJhaXNlIFR5cGVFcnJvcihlcnIgJSBsaXN0KGJhZGFyZ3MpKQoKICAgIHJlc3VsdC51cGRhdGUoa3dhcmdzKQogICAgcmVzdWx0Wydwb3J0X3NwZWNpZmllZCddID0gYm9vbChyZXN1bHRbJ3BvcnQnXSkKICAgIHJlc3VsdFsnZG9tYWluX3NwZWNpZmllZCddID0gYm9vbChyZXN1bHRbJ2RvbWFpbiddKQogICAgcmVzdWx0Wydkb21haW5faW5pdGlhbF9kb3QnXSA9IHJlc3VsdFsnZG9tYWluJ10uc3RhcnRzd2l0aCgnLicpCiAgICByZXN1bHRbJ3BhdGhfc3BlY2lmaWVkJ10gPSBib29sKHJlc3VsdFsncGF0aCddKQoKICAgIHJldHVybiBjb29raWVsaWIuQ29va2llKCoqcmVzdWx0KQoKCmRlZiBtb3JzZWxfdG9fY29va2llKG1vcnNlbCk6CiAgICAiIiJDb252ZXJ0IGEgTW9yc2VsIG9iamVjdCBpbnRvIGEgQ29va2llIGNvbnRhaW5pbmcgdGhlIG9uZSBrL3YgcGFpci4iIiIKCiAgICBleHBpcmVzID0gTm9uZQogICAgaWYgbW9yc2VsWydtYXgtYWdlJ106CiAgICAgICAgdHJ5OgogICAgICAgICAgICBleHBpcmVzID0gaW50KHRpbWUudGltZSgpICsgaW50KG1vcnNlbFsnbWF4LWFnZSddKSkKICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdtYXgtYWdlOiAlcyBtdXN0IGJlIGludGVnZXInICUgbW9yc2VsWydtYXgtYWdlJ10pCiAgICBlbGlmIG1vcnNlbFsnZXhwaXJlcyddOgogICAgICAgIHRpbWVfdGVtcGxhdGUgPSAnJWEsICVkLSViLSVZICVIOiVNOiVTIEdNVCcKICAgICAgICBleHBpcmVzID0gY2FsZW5kYXIudGltZWdtKAogICAgICAgICAgICB0aW1lLnN0cnB0aW1lKG1vcnNlbFsnZXhwaXJlcyddLCB0aW1lX3RlbXBsYXRlKQogICAgICAgICkKICAgIHJldHVybiBjcmVhdGVfY29va2llKAogICAgICAgIGNvbW1lbnQ9bW9yc2VsWydjb21tZW50J10sCiAgICAgICAgY29tbWVudF91cmw9Ym9vbChtb3JzZWxbJ2NvbW1lbnQnXSksCiAgICAgICAgZGlzY2FyZD1GYWxzZSwKICAgICAgICBkb21haW49bW9yc2VsWydkb21haW4nXSwKICAgICAgICBleHBpcmVzPWV4cGlyZXMsCiAgICAgICAgbmFtZT1tb3JzZWwua2V5LAogICAgICAgIHBhdGg9bW9yc2VsWydwYXRoJ10sCiAgICAgICAgcG9ydD1Ob25lLAogICAgICAgIHJlc3Q9eydIdHRwT25seSc6IG1vcnNlbFsnaHR0cG9ubHknXX0sCiAgICAgICAgcmZjMjEwOT1GYWxzZSwKICAgICAgICBzZWN1cmU9Ym9vbChtb3JzZWxbJ3NlY3VyZSddKSwKICAgICAgICB2YWx1ZT1tb3JzZWwudmFsdWUsCiAgICAgICAgdmVyc2lvbj1tb3JzZWxbJ3ZlcnNpb24nXSBvciAwLAogICAgKQoKCmRlZiBjb29raWVqYXJfZnJvbV9kaWN0KGNvb2tpZV9kaWN0LCBjb29raWVqYXI9Tm9uZSwgb3ZlcndyaXRlPVRydWUpOgogICAgIiIiUmV0dXJucyBhIENvb2tpZUphciBmcm9tIGEga2V5L3ZhbHVlIGRpY3Rpb25hcnkuCgogICAgOnBhcmFtIGNvb2tpZV9kaWN0OiBEaWN0IG9mIGtleS92YWx1ZXMgdG8gaW5zZXJ0IGludG8gQ29va2llSmFyLgogICAgOnBhcmFtIGNvb2tpZWphcjogKG9wdGlvbmFsKSBBIGNvb2tpZWphciB0byBhZGQgdGhlIGNvb2tpZXMgdG8uCiAgICA6cGFyYW0gb3ZlcndyaXRlOiAob3B0aW9uYWwpIElmIEZhbHNlLCB3aWxsIG5vdCByZXBsYWNlIGNvb2tpZXMKICAgICAgICBhbHJlYWR5IGluIHRoZSBqYXIgd2l0aCBuZXcgb25lcy4KICAgICIiIgogICAgaWYgY29va2llamFyIGlzIE5vbmU6CiAgICAgICAgY29va2llamFyID0gUmVxdWVzdHNDb29raWVKYXIoKQoKICAgIGlmIGNvb2tpZV9kaWN0IGlzIG5vdCBOb25lOgogICAgICAgIG5hbWVzX2Zyb21famFyID0gW2Nvb2tpZS5uYW1lIGZvciBjb29raWUgaW4gY29va2llamFyXQogICAgICAgIGZvciBuYW1lIGluIGNvb2tpZV9kaWN0OgogICAgICAgICAgICBpZiBvdmVyd3JpdGUgb3IgKG5hbWUgbm90IGluIG5hbWVzX2Zyb21famFyKToKICAgICAgICAgICAgICAgIGNvb2tpZWphci5zZXRfY29va2llKGNyZWF0ZV9jb29raWUobmFtZSwgY29va2llX2RpY3RbbmFtZV0pKQoKICAgIHJldHVybiBjb29raWVqYXIKCgpkZWYgbWVyZ2VfY29va2llcyhjb29raWVqYXIsIGNvb2tpZXMpOgogICAgIiIiQWRkIGNvb2tpZXMgdG8gY29va2llamFyIGFuZCByZXR1cm5zIGEgbWVyZ2VkIENvb2tpZUphci4KCiAgICA6cGFyYW0gY29va2llamFyOiBDb29raWVKYXIgb2JqZWN0IHRvIGFkZCB0aGUgY29va2llcyB0by4KICAgIDpwYXJhbSBjb29raWVzOiBEaWN0aW9uYXJ5IG9yIENvb2tpZUphciBvYmplY3QgdG8gYmUgYWRkZWQuCiAgICAiIiIKICAgIGlmIG5vdCBpc2luc3RhbmNlKGNvb2tpZWphciwgY29va2llbGliLkNvb2tpZUphcik6CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignWW91IGNhbiBvbmx5IG1lcmdlIGludG8gQ29va2llSmFyJykKCiAgICBpZiBpc2luc3RhbmNlKGNvb2tpZXMsIGRpY3QpOgogICAgICAgIGNvb2tpZWphciA9IGNvb2tpZWphcl9mcm9tX2RpY3QoCiAgICAgICAgICAgIGNvb2tpZXMsIGNvb2tpZWphcj1jb29raWVqYXIsIG92ZXJ3cml0ZT1GYWxzZSkKICAgIGVsaWYgaXNpbnN0YW5jZShjb29raWVzLCBjb29raWVsaWIuQ29va2llSmFyKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIGNvb2tpZWphci51cGRhdGUoY29va2llcykKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIGZvciBjb29raWVfaW5famFyIGluIGNvb2tpZXM6CiAgICAgICAgICAgICAgICBjb29raWVqYXIuc2V0X2Nvb2tpZShjb29raWVfaW5famFyKQoKICAgIHJldHVybiBjb29raWVqYXIKUEsDBBQAAAAAAAAAIQD5zunQKwwAACsMAAA/AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9yZXF1ZXN0cy9leGNlcHRpb25zLnB5IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KCiIiIgpyZXF1ZXN0cy5leGNlcHRpb25zCn5+fn5+fn5+fn5+fn5+fn5+fn4KClRoaXMgbW9kdWxlIGNvbnRhaW5zIHRoZSBzZXQgb2YgUmVxdWVzdHMnIGV4Y2VwdGlvbnMuCiIiIgpmcm9tIHBpcC5fdmVuZG9yLnVybGxpYjMuZXhjZXB0aW9ucyBpbXBvcnQgSFRUUEVycm9yIGFzIEJhc2VIVFRQRXJyb3IKCgpjbGFzcyBSZXF1ZXN0RXhjZXB0aW9uKElPRXJyb3IpOgogICAgIiIiVGhlcmUgd2FzIGFuIGFtYmlndW91cyBleGNlcHRpb24gdGhhdCBvY2N1cnJlZCB3aGlsZSBoYW5kbGluZyB5b3VyCiAgICByZXF1ZXN0LgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgIiIiSW5pdGlhbGl6ZSBSZXF1ZXN0RXhjZXB0aW9uIHdpdGggYHJlcXVlc3RgIGFuZCBgcmVzcG9uc2VgIG9iamVjdHMuIiIiCiAgICAgICAgcmVzcG9uc2UgPSBrd2FyZ3MucG9wKCdyZXNwb25zZScsIE5vbmUpCiAgICAgICAgc2VsZi5yZXNwb25zZSA9IHJlc3BvbnNlCiAgICAgICAgc2VsZi5yZXF1ZXN0ID0ga3dhcmdzLnBvcCgncmVxdWVzdCcsIE5vbmUpCiAgICAgICAgaWYgKHJlc3BvbnNlIGlzIG5vdCBOb25lIGFuZCBub3Qgc2VsZi5yZXF1ZXN0IGFuZAogICAgICAgICAgICAgICAgaGFzYXR0cihyZXNwb25zZSwgJ3JlcXVlc3QnKSk6CiAgICAgICAgICAgIHNlbGYucmVxdWVzdCA9IHNlbGYucmVzcG9uc2UucmVxdWVzdAogICAgICAgIHN1cGVyKFJlcXVlc3RFeGNlcHRpb24sIHNlbGYpLl9faW5pdF9fKCphcmdzLCAqKmt3YXJncykKCgpjbGFzcyBIVFRQRXJyb3IoUmVxdWVzdEV4Y2VwdGlvbik6CiAgICAiIiJBbiBIVFRQIGVycm9yIG9jY3VycmVkLiIiIgoKCmNsYXNzIENvbm5lY3Rpb25FcnJvcihSZXF1ZXN0RXhjZXB0aW9uKToKICAgICIiIkEgQ29ubmVjdGlvbiBlcnJvciBvY2N1cnJlZC4iIiIKCgpjbGFzcyBQcm94eUVycm9yKENvbm5lY3Rpb25FcnJvcik6CiAgICAiIiJBIHByb3h5IGVycm9yIG9jY3VycmVkLiIiIgoKCmNsYXNzIFNTTEVycm9yKENvbm5lY3Rpb25FcnJvcik6CiAgICAiIiJBbiBTU0wgZXJyb3Igb2NjdXJyZWQuIiIiCgoKY2xhc3MgVGltZW91dChSZXF1ZXN0RXhjZXB0aW9uKToKICAgICIiIlRoZSByZXF1ZXN0IHRpbWVkIG91dC4KCiAgICBDYXRjaGluZyB0aGlzIGVycm9yIHdpbGwgY2F0Y2ggYm90aAogICAgOmV4YzpgfnJlcXVlc3RzLmV4Y2VwdGlvbnMuQ29ubmVjdFRpbWVvdXRgIGFuZAogICAgOmV4YzpgfnJlcXVlc3RzLmV4Y2VwdGlvbnMuUmVhZFRpbWVvdXRgIGVycm9ycy4KICAgICIiIgoKCmNsYXNzIENvbm5lY3RUaW1lb3V0KENvbm5lY3Rpb25FcnJvciwgVGltZW91dCk6CiAgICAiIiJUaGUgcmVxdWVzdCB0aW1lZCBvdXQgd2hpbGUgdHJ5aW5nIHRvIGNvbm5lY3QgdG8gdGhlIHJlbW90ZSBzZXJ2ZXIuCgogICAgUmVxdWVzdHMgdGhhdCBwcm9kdWNlZCB0aGlzIGVycm9yIGFyZSBzYWZlIHRvIHJldHJ5LgogICAgIiIiCgoKY2xhc3MgUmVhZFRpbWVvdXQoVGltZW91dCk6CiAgICAiIiJUaGUgc2VydmVyIGRpZCBub3Qgc2VuZCBhbnkgZGF0YSBpbiB0aGUgYWxsb3R0ZWQgYW1vdW50IG9mIHRpbWUuIiIiCgoKY2xhc3MgVVJMUmVxdWlyZWQoUmVxdWVzdEV4Y2VwdGlvbik6CiAgICAiIiJBIHZhbGlkIFVSTCBpcyByZXF1aXJlZCB0byBtYWtlIGEgcmVxdWVzdC4iIiIKCgpjbGFzcyBUb29NYW55UmVkaXJlY3RzKFJlcXVlc3RFeGNlcHRpb24pOgogICAgIiIiVG9vIG1hbnkgcmVkaXJlY3RzLiIiIgoKCmNsYXNzIE1pc3NpbmdTY2hlbWEoUmVxdWVzdEV4Y2VwdGlvbiwgVmFsdWVFcnJvcik6CiAgICAiIiJUaGUgVVJMIHNjaGVtYSAoZS5nLiBodHRwIG9yIGh0dHBzKSBpcyBtaXNzaW5nLiIiIgoKCmNsYXNzIEludmFsaWRTY2hlbWEoUmVxdWVzdEV4Y2VwdGlvbiwgVmFsdWVFcnJvcik6CiAgICAiIiJTZWUgZGVmYXVsdHMucHkgZm9yIHZhbGlkIHNjaGVtYXMuIiIiCgoKY2xhc3MgSW52YWxpZFVSTChSZXF1ZXN0RXhjZXB0aW9uLCBWYWx1ZUVycm9yKToKICAgICIiIlRoZSBVUkwgcHJvdmlkZWQgd2FzIHNvbWVob3cgaW52YWxpZC4iIiIKCgpjbGFzcyBJbnZhbGlkSGVhZGVyKFJlcXVlc3RFeGNlcHRpb24sIFZhbHVlRXJyb3IpOgogICAgIiIiVGhlIGhlYWRlciB2YWx1ZSBwcm92aWRlZCB3YXMgc29tZWhvdyBpbnZhbGlkLiIiIgoKCmNsYXNzIENodW5rZWRFbmNvZGluZ0Vycm9yKFJlcXVlc3RFeGNlcHRpb24pOgogICAgIiIiVGhlIHNlcnZlciBkZWNsYXJlZCBjaHVua2VkIGVuY29kaW5nIGJ1dCBzZW50IGFuIGludmFsaWQgY2h1bmsuIiIiCgoKY2xhc3MgQ29udGVudERlY29kaW5nRXJyb3IoUmVxdWVzdEV4Y2VwdGlvbiwgQmFzZUhUVFBFcnJvcik6CiAgICAiIiJGYWlsZWQgdG8gZGVjb2RlIHJlc3BvbnNlIGNvbnRlbnQiIiIKCgpjbGFzcyBTdHJlYW1Db25zdW1lZEVycm9yKFJlcXVlc3RFeGNlcHRpb24sIFR5cGVFcnJvcik6CiAgICAiIiJUaGUgY29udGVudCBmb3IgdGhpcyByZXNwb25zZSB3YXMgYWxyZWFkeSBjb25zdW1lZCIiIgoKCmNsYXNzIFJldHJ5RXJyb3IoUmVxdWVzdEV4Y2VwdGlvbik6CiAgICAiIiJDdXN0b20gcmV0cmllcyBsb2dpYyBmYWlsZWQiIiIKCgpjbGFzcyBVbnJld2luZGFibGVCb2R5RXJyb3IoUmVxdWVzdEV4Y2VwdGlvbik6CiAgICAiIiJSZXF1ZXN0cyBlbmNvdW50ZXJlZCBhbiBlcnJvciB3aGVuIHRyeWluZyB0byByZXdpbmQgYSBib2R5IiIiCgojIFdhcm5pbmdzCgoKY2xhc3MgUmVxdWVzdHNXYXJuaW5nKFdhcm5pbmcpOgogICAgIiIiQmFzZSB3YXJuaW5nIGZvciBSZXF1ZXN0cy4iIiIKICAgIHBhc3MKCgpjbGFzcyBGaWxlTW9kZVdhcm5pbmcoUmVxdWVzdHNXYXJuaW5nLCBEZXByZWNhdGlvbldhcm5pbmcpOgogICAgIiIiQSBmaWxlIHdhcyBvcGVuZWQgaW4gdGV4dCBtb2RlLCBidXQgUmVxdWVzdHMgZGV0ZXJtaW5lZCBpdHMgYmluYXJ5IGxlbmd0aC4iIiIKICAgIHBhc3MKCgpjbGFzcyBSZXF1ZXN0c0RlcGVuZGVuY3lXYXJuaW5nKFJlcXVlc3RzV2FybmluZyk6CiAgICAiIiJBbiBpbXBvcnRlZCBkZXBlbmRlbmN5IGRvZXNuJ3QgbWF0Y2ggdGhlIGV4cGVjdGVkIHZlcnNpb24gcmFuZ2UuIiIiCiAgICBwYXNzClBLAwQUAAAAAAAAACEAhB1g4lMOAABTDgAAOQAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvaGVscC5weSIiIk1vZHVsZSBjb250YWluaW5nIGJ1ZyByZXBvcnQgaGVscGVyKHMpLiIiIgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCgppbXBvcnQganNvbgppbXBvcnQgcGxhdGZvcm0KaW1wb3J0IHN5cwppbXBvcnQgc3NsCgpmcm9tIHBpcC5fdmVuZG9yIGltcG9ydCBpZG5hCmZyb20gcGlwLl92ZW5kb3IgaW1wb3J0IHVybGxpYjMKZnJvbSBwaXAuX3ZlbmRvciBpbXBvcnQgY2hhcmRldAoKZnJvbSAuIGltcG9ydCBfX3ZlcnNpb25fXyBhcyByZXF1ZXN0c192ZXJzaW9uCgp0cnk6CiAgICBmcm9tIC5wYWNrYWdlcy51cmxsaWIzLmNvbnRyaWIgaW1wb3J0IHB5b3BlbnNzbApleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBweW9wZW5zc2wgPSBOb25lCiAgICBPcGVuU1NMID0gTm9uZQogICAgY3J5cHRvZ3JhcGh5ID0gTm9uZQplbHNlOgogICAgaW1wb3J0IE9wZW5TU0wKICAgIGltcG9ydCBjcnlwdG9ncmFwaHkKCgpkZWYgX2ltcGxlbWVudGF0aW9uKCk6CiAgICAiIiJSZXR1cm4gYSBkaWN0IHdpdGggdGhlIFB5dGhvbiBpbXBsZW1lbnRhdGlvbiBhbmQgdmVyc2lvbi4KCiAgICBQcm92aWRlIGJvdGggdGhlIG5hbWUgYW5kIHRoZSB2ZXJzaW9uIG9mIHRoZSBQeXRob24gaW1wbGVtZW50YXRpb24KICAgIGN1cnJlbnRseSBydW5uaW5nLiBGb3IgZXhhbXBsZSwgb24gQ1B5dGhvbiAyLjcuNSBpdCB3aWxsIHJldHVybgogICAgeyduYW1lJzogJ0NQeXRob24nLCAndmVyc2lvbic6ICcyLjcuNSd9LgoKICAgIFRoaXMgZnVuY3Rpb24gd29ya3MgYmVzdCBvbiBDUHl0aG9uIGFuZCBQeVB5OiBpbiBwYXJ0aWN1bGFyLCBpdCBwcm9iYWJseQogICAgZG9lc24ndCB3b3JrIGZvciBKeXRob24gb3IgSXJvblB5dGhvbi4gRnV0dXJlIGludmVzdGlnYXRpb24gc2hvdWxkIGJlIGRvbmUKICAgIHRvIHdvcmsgb3V0IHRoZSBjb3JyZWN0IHNoYXBlIG9mIHRoZSBjb2RlIGZvciB0aG9zZSBwbGF0Zm9ybXMuCiAgICAiIiIKICAgIGltcGxlbWVudGF0aW9uID0gcGxhdGZvcm0ucHl0aG9uX2ltcGxlbWVudGF0aW9uKCkKCiAgICBpZiBpbXBsZW1lbnRhdGlvbiA9PSAnQ1B5dGhvbic6CiAgICAgICAgaW1wbGVtZW50YXRpb25fdmVyc2lvbiA9IHBsYXRmb3JtLnB5dGhvbl92ZXJzaW9uKCkKICAgIGVsaWYgaW1wbGVtZW50YXRpb24gPT0gJ1B5UHknOgogICAgICAgIGltcGxlbWVudGF0aW9uX3ZlcnNpb24gPSAnJXMuJXMuJXMnICUgKHN5cy5weXB5X3ZlcnNpb25faW5mby5tYWpvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXMucHlweV92ZXJzaW9uX2luZm8ubWlub3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzLnB5cHlfdmVyc2lvbl9pbmZvLm1pY3JvKQogICAgICAgIGlmIHN5cy5weXB5X3ZlcnNpb25faW5mby5yZWxlYXNlbGV2ZWwgIT0gJ2ZpbmFsJzoKICAgICAgICAgICAgaW1wbGVtZW50YXRpb25fdmVyc2lvbiA9ICcnLmpvaW4oWwogICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb25fdmVyc2lvbiwgc3lzLnB5cHlfdmVyc2lvbl9pbmZvLnJlbGVhc2VsZXZlbAogICAgICAgICAgICBdKQogICAgZWxpZiBpbXBsZW1lbnRhdGlvbiA9PSAnSnl0aG9uJzoKICAgICAgICBpbXBsZW1lbnRhdGlvbl92ZXJzaW9uID0gcGxhdGZvcm0ucHl0aG9uX3ZlcnNpb24oKSAgIyBDb21wbGV0ZSBHdWVzcwogICAgZWxpZiBpbXBsZW1lbnRhdGlvbiA9PSAnSXJvblB5dGhvbic6CiAgICAgICAgaW1wbGVtZW50YXRpb25fdmVyc2lvbiA9IHBsYXRmb3JtLnB5dGhvbl92ZXJzaW9uKCkgICMgQ29tcGxldGUgR3Vlc3MKICAgIGVsc2U6CiAgICAgICAgaW1wbGVtZW50YXRpb25fdmVyc2lvbiA9ICdVbmtub3duJwoKICAgIHJldHVybiB7J25hbWUnOiBpbXBsZW1lbnRhdGlvbiwgJ3ZlcnNpb24nOiBpbXBsZW1lbnRhdGlvbl92ZXJzaW9ufQoKCmRlZiBpbmZvKCk6CiAgICAiIiJHZW5lcmF0ZSBpbmZvcm1hdGlvbiBmb3IgYSBidWcgcmVwb3J0LiIiIgogICAgdHJ5OgogICAgICAgIHBsYXRmb3JtX2luZm8gPSB7CiAgICAgICAgICAgICdzeXN0ZW0nOiBwbGF0Zm9ybS5zeXN0ZW0oKSwKICAgICAgICAgICAgJ3JlbGVhc2UnOiBwbGF0Zm9ybS5yZWxlYXNlKCksCiAgICAgICAgfQogICAgZXhjZXB0IElPRXJyb3I6CiAgICAgICAgcGxhdGZvcm1faW5mbyA9IHsKICAgICAgICAgICAgJ3N5c3RlbSc6ICdVbmtub3duJywKICAgICAgICAgICAgJ3JlbGVhc2UnOiAnVW5rbm93bicsCiAgICAgICAgfQoKICAgIGltcGxlbWVudGF0aW9uX2luZm8gPSBfaW1wbGVtZW50YXRpb24oKQogICAgdXJsbGliM19pbmZvID0geyd2ZXJzaW9uJzogdXJsbGliMy5fX3ZlcnNpb25fX30KICAgIGNoYXJkZXRfaW5mbyA9IHsndmVyc2lvbic6IGNoYXJkZXQuX192ZXJzaW9uX199CgogICAgcHlvcGVuc3NsX2luZm8gPSB7CiAgICAgICAgJ3ZlcnNpb24nOiBOb25lLAogICAgICAgICdvcGVuc3NsX3ZlcnNpb24nOiAnJywKICAgIH0KICAgIGlmIE9wZW5TU0w6CiAgICAgICAgcHlvcGVuc3NsX2luZm8gPSB7CiAgICAgICAgICAgICd2ZXJzaW9uJzogT3BlblNTTC5fX3ZlcnNpb25fXywKICAgICAgICAgICAgJ29wZW5zc2xfdmVyc2lvbic6ICcleCcgJSBPcGVuU1NMLlNTTC5PUEVOU1NMX1ZFUlNJT05fTlVNQkVSLAogICAgICAgIH0KICAgIGNyeXB0b2dyYXBoeV9pbmZvID0gewogICAgICAgICd2ZXJzaW9uJzogZ2V0YXR0cihjcnlwdG9ncmFwaHksICdfX3ZlcnNpb25fXycsICcnKSwKICAgIH0KICAgIGlkbmFfaW5mbyA9IHsKICAgICAgICAndmVyc2lvbic6IGdldGF0dHIoaWRuYSwgJ19fdmVyc2lvbl9fJywgJycpLAogICAgfQoKICAgICMgT1BFTlNTTF9WRVJTSU9OX05VTUJFUiBkb2Vzbid0IGV4aXN0IGluIHRoZSBQeXRob24gMi42IHNzbCBtb2R1bGUuCiAgICBzeXN0ZW1fc3NsID0gZ2V0YXR0cihzc2wsICdPUEVOU1NMX1ZFUlNJT05fTlVNQkVSJywgTm9uZSkKICAgIHN5c3RlbV9zc2xfaW5mbyA9IHsKICAgICAgICAndmVyc2lvbic6ICcleCcgJSBzeXN0ZW1fc3NsIGlmIHN5c3RlbV9zc2wgaXMgbm90IE5vbmUgZWxzZSAnJwogICAgfQoKICAgIHJldHVybiB7CiAgICAgICAgJ3BsYXRmb3JtJzogcGxhdGZvcm1faW5mbywKICAgICAgICAnaW1wbGVtZW50YXRpb24nOiBpbXBsZW1lbnRhdGlvbl9pbmZvLAogICAgICAgICdzeXN0ZW1fc3NsJzogc3lzdGVtX3NzbF9pbmZvLAogICAgICAgICd1c2luZ19weW9wZW5zc2wnOiBweW9wZW5zc2wgaXMgbm90IE5vbmUsCiAgICAgICAgJ3B5T3BlblNTTCc6IHB5b3BlbnNzbF9pbmZvLAogICAgICAgICd1cmxsaWIzJzogdXJsbGliM19pbmZvLAogICAgICAgICdjaGFyZGV0JzogY2hhcmRldF9pbmZvLAogICAgICAgICdjcnlwdG9ncmFwaHknOiBjcnlwdG9ncmFwaHlfaW5mbywKICAgICAgICAnaWRuYSc6IGlkbmFfaW5mbywKICAgICAgICAncmVxdWVzdHMnOiB7CiAgICAgICAgICAgICd2ZXJzaW9uJzogcmVxdWVzdHNfdmVyc2lvbiwKICAgICAgICB9LAogICAgfQoKCmRlZiBtYWluKCk6CiAgICAiIiJQcmV0dHktcHJpbnQgdGhlIGJ1ZyBpbmZvcm1hdGlvbiBhcyBKU09OLiIiIgogICAgcHJpbnQoanNvbi5kdW1wcyhpbmZvKCksIHNvcnRfa2V5cz1UcnVlLCBpbmRlbnQ9MikpCgoKaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgIG1haW4oKQpQSwMEFAAAAAAAAAAhAHnao8r/AgAA/wIAADoAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3JlcXVlc3RzL2hvb2tzLnB5IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KCiIiIgpyZXF1ZXN0cy5ob29rcwp+fn5+fn5+fn5+fn5+fgoKVGhpcyBtb2R1bGUgcHJvdmlkZXMgdGhlIGNhcGFiaWxpdGllcyBmb3IgdGhlIFJlcXVlc3RzIGhvb2tzIHN5c3RlbS4KCkF2YWlsYWJsZSBob29rczoKCmBgcmVzcG9uc2VgYDoKICAgIFRoZSByZXNwb25zZSBnZW5lcmF0ZWQgZnJvbSBhIFJlcXVlc3QuCiIiIgpIT09LUyA9IFsncmVzcG9uc2UnXQoKCmRlZiBkZWZhdWx0X2hvb2tzKCk6CiAgICByZXR1cm4gZGljdCgoZXZlbnQsIFtdKSBmb3IgZXZlbnQgaW4gSE9PS1MpCgojIFRPRE86IHJlc3BvbnNlIGlzIHRoZSBvbmx5IG9uZQoKCmRlZiBkaXNwYXRjaF9ob29rKGtleSwgaG9va3MsIGhvb2tfZGF0YSwgKiprd2FyZ3MpOgogICAgIiIiRGlzcGF0Y2hlcyBhIGhvb2sgZGljdGlvbmFyeSBvbiBhIGdpdmVuIHBpZWNlIG9mIGRhdGEuIiIiCiAgICBob29rcyA9IGhvb2tzIG9yIGRpY3QoKQogICAgaG9va3MgPSBob29rcy5nZXQoa2V5KQogICAgaWYgaG9va3M6CiAgICAgICAgaWYgaGFzYXR0cihob29rcywgJ19fY2FsbF9fJyk6CiAgICAgICAgICAgIGhvb2tzID0gW2hvb2tzXQogICAgICAgIGZvciBob29rIGluIGhvb2tzOgogICAgICAgICAgICBfaG9va19kYXRhID0gaG9vayhob29rX2RhdGEsICoqa3dhcmdzKQogICAgICAgICAgICBpZiBfaG9va19kYXRhIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgaG9va19kYXRhID0gX2hvb2tfZGF0YQogICAgcmV0dXJuIGhvb2tfZGF0YQpQSwMEFAAAAAAAAAAhAGV9R3QDhQAAA4UAADsAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3JlcXVlc3RzL21vZGVscy5weSMgLSotIGNvZGluZzogdXRmLTggLSotCgoiIiIKcmVxdWVzdHMubW9kZWxzCn5+fn5+fn5+fn5+fn5+fgoKVGhpcyBtb2R1bGUgY29udGFpbnMgdGhlIHByaW1hcnkgb2JqZWN0cyB0aGF0IHBvd2VyIFJlcXVlc3RzLgoiIiIKCmltcG9ydCBjb2xsZWN0aW9ucwppbXBvcnQgZGF0ZXRpbWUKaW1wb3J0IHN5cwoKIyBJbXBvcnQgZW5jb2Rpbmcgbm93LCB0byBhdm9pZCBpbXBsaWNpdCBpbXBvcnQgbGF0ZXIuCiMgSW1wbGljaXQgaW1wb3J0IHdpdGhpbiB0aHJlYWRzIG1heSBjYXVzZSBMb29rdXBFcnJvciB3aGVuIHN0YW5kYXJkIGxpYnJhcnkgaXMgaW4gYSBaSVAsCiMgc3VjaCBhcyBpbiBFbWJlZGRlZCBQeXRob24uIFNlZSBodHRwczovL2dpdGh1Yi5jb20vcmVxdWVzdHMvcmVxdWVzdHMvaXNzdWVzLzM1NzguCmltcG9ydCBlbmNvZGluZ3MuaWRuYQoKZnJvbSBwaXAuX3ZlbmRvci51cmxsaWIzLmZpZWxkcyBpbXBvcnQgUmVxdWVzdEZpZWxkCmZyb20gcGlwLl92ZW5kb3IudXJsbGliMy5maWxlcG9zdCBpbXBvcnQgZW5jb2RlX211bHRpcGFydF9mb3JtZGF0YQpmcm9tIHBpcC5fdmVuZG9yLnVybGxpYjMudXRpbCBpbXBvcnQgcGFyc2VfdXJsCmZyb20gcGlwLl92ZW5kb3IudXJsbGliMy5leGNlcHRpb25zIGltcG9ydCAoCiAgICBEZWNvZGVFcnJvciwgUmVhZFRpbWVvdXRFcnJvciwgUHJvdG9jb2xFcnJvciwgTG9jYXRpb25QYXJzZUVycm9yKQoKZnJvbSBpbyBpbXBvcnQgVW5zdXBwb3J0ZWRPcGVyYXRpb24KZnJvbSAuaG9va3MgaW1wb3J0IGRlZmF1bHRfaG9va3MKZnJvbSAuc3RydWN0dXJlcyBpbXBvcnQgQ2FzZUluc2Vuc2l0aXZlRGljdAoKZnJvbSAuYXV0aCBpbXBvcnQgSFRUUEJhc2ljQXV0aApmcm9tIC5jb29raWVzIGltcG9ydCBjb29raWVqYXJfZnJvbV9kaWN0LCBnZXRfY29va2llX2hlYWRlciwgX2NvcHlfY29va2llX2phcgpmcm9tIC5leGNlcHRpb25zIGltcG9ydCAoCiAgICBIVFRQRXJyb3IsIE1pc3NpbmdTY2hlbWEsIEludmFsaWRVUkwsIENodW5rZWRFbmNvZGluZ0Vycm9yLAogICAgQ29udGVudERlY29kaW5nRXJyb3IsIENvbm5lY3Rpb25FcnJvciwgU3RyZWFtQ29uc3VtZWRFcnJvcikKZnJvbSAuX2ludGVybmFsX3V0aWxzIGltcG9ydCB0b19uYXRpdmVfc3RyaW5nLCB1bmljb2RlX2lzX2FzY2lpCmZyb20gLnV0aWxzIGltcG9ydCAoCiAgICBndWVzc19maWxlbmFtZSwgZ2V0X2F1dGhfZnJvbV91cmwsIHJlcXVvdGVfdXJpLAogICAgc3RyZWFtX2RlY29kZV9yZXNwb25zZV91bmljb2RlLCB0b19rZXlfdmFsX2xpc3QsIHBhcnNlX2hlYWRlcl9saW5rcywKICAgIGl0ZXJfc2xpY2VzLCBndWVzc19qc29uX3V0Ziwgc3VwZXJfbGVuLCBjaGVja19oZWFkZXJfdmFsaWRpdHkpCmZyb20gLmNvbXBhdCBpbXBvcnQgKAogICAgY29va2llbGliLCB1cmx1bnBhcnNlLCB1cmxzcGxpdCwgdXJsZW5jb2RlLCBzdHIsIGJ5dGVzLAogICAgaXNfcHkyLCBjaGFyZGV0LCBidWlsdGluX3N0ciwgYmFzZXN0cmluZykKZnJvbSAuY29tcGF0IGltcG9ydCBqc29uIGFzIGNvbXBsZXhqc29uCmZyb20gLnN0YXR1c19jb2RlcyBpbXBvcnQgY29kZXMKCiM6IFRoZSBzZXQgb2YgSFRUUCBzdGF0dXMgY29kZXMgdGhhdCBpbmRpY2F0ZSBhbiBhdXRvbWF0aWNhbGx5CiM6IHByb2Nlc3NhYmxlIHJlZGlyZWN0LgpSRURJUkVDVF9TVEFUSSA9ICgKICAgIGNvZGVzLm1vdmVkLCAgICAgICAgICAgICAgICMgMzAxCiAgICBjb2Rlcy5mb3VuZCwgICAgICAgICAgICAgICAjIDMwMgogICAgY29kZXMub3RoZXIsICAgICAgICAgICAgICAgIyAzMDMKICAgIGNvZGVzLnRlbXBvcmFyeV9yZWRpcmVjdCwgICMgMzA3CiAgICBjb2Rlcy5wZXJtYW5lbnRfcmVkaXJlY3QsICAjIDMwOAopCgpERUZBVUxUX1JFRElSRUNUX0xJTUlUID0gMzAKQ09OVEVOVF9DSFVOS19TSVpFID0gMTAgKiAxMDI0CklURVJfQ0hVTktfU0laRSA9IDUxMgoKCmNsYXNzIFJlcXVlc3RFbmNvZGluZ01peGluKG9iamVjdCk6CiAgICBAcHJvcGVydHkKICAgIGRlZiBwYXRoX3VybChzZWxmKToKICAgICAgICAiIiJCdWlsZCB0aGUgcGF0aCBVUkwgdG8gdXNlLiIiIgoKICAgICAgICB1cmwgPSBbXQoKICAgICAgICBwID0gdXJsc3BsaXQoc2VsZi51cmwpCgogICAgICAgIHBhdGggPSBwLnBhdGgKICAgICAgICBpZiBub3QgcGF0aDoKICAgICAgICAgICAgcGF0aCA9ICcvJwoKICAgICAgICB1cmwuYXBwZW5kKHBhdGgpCgogICAgICAgIHF1ZXJ5ID0gcC5xdWVyeQogICAgICAgIGlmIHF1ZXJ5OgogICAgICAgICAgICB1cmwuYXBwZW5kKCc/JykKICAgICAgICAgICAgdXJsLmFwcGVuZChxdWVyeSkKCiAgICAgICAgcmV0dXJuICcnLmpvaW4odXJsKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfZW5jb2RlX3BhcmFtcyhkYXRhKToKICAgICAgICAiIiJFbmNvZGUgcGFyYW1ldGVycyBpbiBhIHBpZWNlIG9mIGRhdGEuCgogICAgICAgIFdpbGwgc3VjY2Vzc2Z1bGx5IGVuY29kZSBwYXJhbWV0ZXJzIHdoZW4gcGFzc2VkIGFzIGEgZGljdCBvciBhIGxpc3Qgb2YKICAgICAgICAyLXR1cGxlcy4gT3JkZXIgaXMgcmV0YWluZWQgaWYgZGF0YSBpcyBhIGxpc3Qgb2YgMi10dXBsZXMgYnV0IGFyYml0cmFyeQogICAgICAgIGlmIHBhcmFtZXRlcnMgYXJlIHN1cHBsaWVkIGFzIGEgZGljdC4KICAgICAgICAiIiIKCiAgICAgICAgaWYgaXNpbnN0YW5jZShkYXRhLCAoc3RyLCBieXRlcykpOgogICAgICAgICAgICByZXR1cm4gZGF0YQogICAgICAgIGVsaWYgaGFzYXR0cihkYXRhLCAncmVhZCcpOgogICAgICAgICAgICByZXR1cm4gZGF0YQogICAgICAgIGVsaWYgaGFzYXR0cihkYXRhLCAnX19pdGVyX18nKToKICAgICAgICAgICAgcmVzdWx0ID0gW10KICAgICAgICAgICAgZm9yIGssIHZzIGluIHRvX2tleV92YWxfbGlzdChkYXRhKToKICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodnMsIGJhc2VzdHJpbmcpIG9yIG5vdCBoYXNhdHRyKHZzLCAnX19pdGVyX18nKToKICAgICAgICAgICAgICAgICAgICB2cyA9IFt2c10KICAgICAgICAgICAgICAgIGZvciB2IGluIHZzOgogICAgICAgICAgICAgICAgICAgIGlmIHYgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoay5lbmNvZGUoJ3V0Zi04JykgaWYgaXNpbnN0YW5jZShrLCBzdHIpIGVsc2UgaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LmVuY29kZSgndXRmLTgnKSBpZiBpc2luc3RhbmNlKHYsIHN0cikgZWxzZSB2KSkKICAgICAgICAgICAgcmV0dXJuIHVybGVuY29kZShyZXN1bHQsIGRvc2VxPVRydWUpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIGRhdGEKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX2VuY29kZV9maWxlcyhmaWxlcywgZGF0YSk6CiAgICAgICAgIiIiQnVpbGQgdGhlIGJvZHkgZm9yIGEgbXVsdGlwYXJ0L2Zvcm0tZGF0YSByZXF1ZXN0LgoKICAgICAgICBXaWxsIHN1Y2Nlc3NmdWxseSBlbmNvZGUgZmlsZXMgd2hlbiBwYXNzZWQgYXMgYSBkaWN0IG9yIGEgbGlzdCBvZgogICAgICAgIHR1cGxlcy4gT3JkZXIgaXMgcmV0YWluZWQgaWYgZGF0YSBpcyBhIGxpc3Qgb2YgdHVwbGVzIGJ1dCBhcmJpdHJhcnkKICAgICAgICBpZiBwYXJhbWV0ZXJzIGFyZSBzdXBwbGllZCBhcyBhIGRpY3QuCiAgICAgICAgVGhlIHR1cGxlcyBtYXkgYmUgMi10dXBsZXMgKGZpbGVuYW1lLCBmaWxlb2JqKSwgMy10dXBsZXMgKGZpbGVuYW1lLCBmaWxlb2JqLCBjb250ZW50eXBlKQogICAgICAgIG9yIDQtdHVwbGVzIChmaWxlbmFtZSwgZmlsZW9iaiwgY29udGVudHlwZSwgY3VzdG9tX2hlYWRlcnMpLgogICAgICAgICIiIgogICAgICAgIGlmIChub3QgZmlsZXMpOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJGaWxlcyBtdXN0IGJlIHByb3ZpZGVkLiIpCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKGRhdGEsIGJhc2VzdHJpbmcpOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJEYXRhIG11c3Qgbm90IGJlIGEgc3RyaW5nLiIpCgogICAgICAgIG5ld19maWVsZHMgPSBbXQogICAgICAgIGZpZWxkcyA9IHRvX2tleV92YWxfbGlzdChkYXRhIG9yIHt9KQogICAgICAgIGZpbGVzID0gdG9fa2V5X3ZhbF9saXN0KGZpbGVzIG9yIHt9KQoKICAgICAgICBmb3IgZmllbGQsIHZhbCBpbiBmaWVsZHM6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsLCBiYXNlc3RyaW5nKSBvciBub3QgaGFzYXR0cih2YWwsICdfX2l0ZXJfXycpOgogICAgICAgICAgICAgICAgdmFsID0gW3ZhbF0KICAgICAgICAgICAgZm9yIHYgaW4gdmFsOgogICAgICAgICAgICAgICAgaWYgdiBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICAjIERvbid0IGNhbGwgc3RyKCkgb24gYnl0ZXN0cmluZ3M6IGluIFB5MyBpdCBhbGwgZ29lcyB3cm9uZy4KICAgICAgICAgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh2LCBieXRlcyk6CiAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBzdHIodikKCiAgICAgICAgICAgICAgICAgICAgbmV3X2ZpZWxkcy5hcHBlbmQoCiAgICAgICAgICAgICAgICAgICAgICAgIChmaWVsZC5kZWNvZGUoJ3V0Zi04JykgaWYgaXNpbnN0YW5jZShmaWVsZCwgYnl0ZXMpIGVsc2UgZmllbGQsCiAgICAgICAgICAgICAgICAgICAgICAgICB2LmVuY29kZSgndXRmLTgnKSBpZiBpc2luc3RhbmNlKHYsIHN0cikgZWxzZSB2KSkKCiAgICAgICAgZm9yIChrLCB2KSBpbiBmaWxlczoKICAgICAgICAgICAgIyBzdXBwb3J0IGZvciBleHBsaWNpdCBmaWxlbmFtZQogICAgICAgICAgICBmdCA9IE5vbmUKICAgICAgICAgICAgZmggPSBOb25lCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodiwgKHR1cGxlLCBsaXN0KSk6CiAgICAgICAgICAgICAgICBpZiBsZW4odikgPT0gMjoKICAgICAgICAgICAgICAgICAgICBmbiwgZnAgPSB2CiAgICAgICAgICAgICAgICBlbGlmIGxlbih2KSA9PSAzOgogICAgICAgICAgICAgICAgICAgIGZuLCBmcCwgZnQgPSB2CiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGZuLCBmcCwgZnQsIGZoID0gdgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgZm4gPSBndWVzc19maWxlbmFtZSh2KSBvciBrCiAgICAgICAgICAgICAgICBmcCA9IHYKCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZnAsIChzdHIsIGJ5dGVzLCBieXRlYXJyYXkpKToKICAgICAgICAgICAgICAgIGZkYXRhID0gZnAKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGZkYXRhID0gZnAucmVhZCgpCgogICAgICAgICAgICByZiA9IFJlcXVlc3RGaWVsZChuYW1lPWssIGRhdGE9ZmRhdGEsIGZpbGVuYW1lPWZuLCBoZWFkZXJzPWZoKQogICAgICAgICAgICByZi5tYWtlX211bHRpcGFydChjb250ZW50X3R5cGU9ZnQpCiAgICAgICAgICAgIG5ld19maWVsZHMuYXBwZW5kKHJmKQoKICAgICAgICBib2R5LCBjb250ZW50X3R5cGUgPSBlbmNvZGVfbXVsdGlwYXJ0X2Zvcm1kYXRhKG5ld19maWVsZHMpCgogICAgICAgIHJldHVybiBib2R5LCBjb250ZW50X3R5cGUKCgpjbGFzcyBSZXF1ZXN0SG9va3NNaXhpbihvYmplY3QpOgogICAgZGVmIHJlZ2lzdGVyX2hvb2soc2VsZiwgZXZlbnQsIGhvb2spOgogICAgICAgICIiIlByb3Blcmx5IHJlZ2lzdGVyIGEgaG9vay4iIiIKCiAgICAgICAgaWYgZXZlbnQgbm90IGluIHNlbGYuaG9va3M6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1Vuc3VwcG9ydGVkIGV2ZW50IHNwZWNpZmllZCwgd2l0aCBldmVudCBuYW1lICIlcyInICUgKGV2ZW50KSkKCiAgICAgICAgaWYgaXNpbnN0YW5jZShob29rLCBjb2xsZWN0aW9ucy5DYWxsYWJsZSk6CiAgICAgICAgICAgIHNlbGYuaG9va3NbZXZlbnRdLmFwcGVuZChob29rKQogICAgICAgIGVsaWYgaGFzYXR0cihob29rLCAnX19pdGVyX18nKToKICAgICAgICAgICAgc2VsZi5ob29rc1tldmVudF0uZXh0ZW5kKGggZm9yIGggaW4gaG9vayBpZiBpc2luc3RhbmNlKGgsIGNvbGxlY3Rpb25zLkNhbGxhYmxlKSkKCiAgICBkZWYgZGVyZWdpc3Rlcl9ob29rKHNlbGYsIGV2ZW50LCBob29rKToKICAgICAgICAiIiJEZXJlZ2lzdGVyIGEgcHJldmlvdXNseSByZWdpc3RlcmVkIGhvb2suCiAgICAgICAgUmV0dXJucyBUcnVlIGlmIHRoZSBob29rIGV4aXN0ZWQsIEZhbHNlIGlmIG5vdC4KICAgICAgICAiIiIKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLmhvb2tzW2V2ZW50XS5yZW1vdmUoaG9vaykKICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgoKY2xhc3MgUmVxdWVzdChSZXF1ZXN0SG9va3NNaXhpbik6CiAgICAiIiJBIHVzZXItY3JlYXRlZCA6Y2xhc3M6YFJlcXVlc3QgPFJlcXVlc3Q+YCBvYmplY3QuCgogICAgVXNlZCB0byBwcmVwYXJlIGEgOmNsYXNzOmBQcmVwYXJlZFJlcXVlc3QgPFByZXBhcmVkUmVxdWVzdD5gLCB3aGljaCBpcyBzZW50IHRvIHRoZSBzZXJ2ZXIuCgogICAgOnBhcmFtIG1ldGhvZDogSFRUUCBtZXRob2QgdG8gdXNlLgogICAgOnBhcmFtIHVybDogVVJMIHRvIHNlbmQuCiAgICA6cGFyYW0gaGVhZGVyczogZGljdGlvbmFyeSBvZiBoZWFkZXJzIHRvIHNlbmQuCiAgICA6cGFyYW0gZmlsZXM6IGRpY3Rpb25hcnkgb2Yge2ZpbGVuYW1lOiBmaWxlb2JqZWN0fSBmaWxlcyB0byBtdWx0aXBhcnQgdXBsb2FkLgogICAgOnBhcmFtIGRhdGE6IHRoZSBib2R5IHRvIGF0dGFjaCB0byB0aGUgcmVxdWVzdC4gSWYgYSBkaWN0aW9uYXJ5IGlzIHByb3ZpZGVkLCBmb3JtLWVuY29kaW5nIHdpbGwgdGFrZSBwbGFjZS4KICAgIDpwYXJhbSBqc29uOiBqc29uIGZvciB0aGUgYm9keSB0byBhdHRhY2ggdG8gdGhlIHJlcXVlc3QgKGlmIGZpbGVzIG9yIGRhdGEgaXMgbm90IHNwZWNpZmllZCkuCiAgICA6cGFyYW0gcGFyYW1zOiBkaWN0aW9uYXJ5IG9mIFVSTCBwYXJhbWV0ZXJzIHRvIGFwcGVuZCB0byB0aGUgVVJMLgogICAgOnBhcmFtIGF1dGg6IEF1dGggaGFuZGxlciBvciAodXNlciwgcGFzcykgdHVwbGUuCiAgICA6cGFyYW0gY29va2llczogZGljdGlvbmFyeSBvciBDb29raWVKYXIgb2YgY29va2llcyB0byBhdHRhY2ggdG8gdGhpcyByZXF1ZXN0LgogICAgOnBhcmFtIGhvb2tzOiBkaWN0aW9uYXJ5IG9mIGNhbGxiYWNrIGhvb2tzLCBmb3IgaW50ZXJuYWwgdXNhZ2UuCgogICAgVXNhZ2U6OgoKICAgICAgPj4+IGltcG9ydCByZXF1ZXN0cwogICAgICA+Pj4gcmVxID0gcmVxdWVzdHMuUmVxdWVzdCgnR0VUJywgJ2h0dHA6Ly9odHRwYmluLm9yZy9nZXQnKQogICAgICA+Pj4gcmVxLnByZXBhcmUoKQogICAgICA8UHJlcGFyZWRSZXF1ZXN0IFtHRVRdPgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsCiAgICAgICAgICAgIG1ldGhvZD1Ob25lLCB1cmw9Tm9uZSwgaGVhZGVycz1Ob25lLCBmaWxlcz1Ob25lLCBkYXRhPU5vbmUsCiAgICAgICAgICAgIHBhcmFtcz1Ob25lLCBhdXRoPU5vbmUsIGNvb2tpZXM9Tm9uZSwgaG9va3M9Tm9uZSwganNvbj1Ob25lKToKCiAgICAgICAgIyBEZWZhdWx0IGVtcHR5IGRpY3RzIGZvciBkaWN0IHBhcmFtcy4KICAgICAgICBkYXRhID0gW10gaWYgZGF0YSBpcyBOb25lIGVsc2UgZGF0YQogICAgICAgIGZpbGVzID0gW10gaWYgZmlsZXMgaXMgTm9uZSBlbHNlIGZpbGVzCiAgICAgICAgaGVhZGVycyA9IHt9IGlmIGhlYWRlcnMgaXMgTm9uZSBlbHNlIGhlYWRlcnMKICAgICAgICBwYXJhbXMgPSB7fSBpZiBwYXJhbXMgaXMgTm9uZSBlbHNlIHBhcmFtcwogICAgICAgIGhvb2tzID0ge30gaWYgaG9va3MgaXMgTm9uZSBlbHNlIGhvb2tzCgogICAgICAgIHNlbGYuaG9va3MgPSBkZWZhdWx0X2hvb2tzKCkKICAgICAgICBmb3IgKGssIHYpIGluIGxpc3QoaG9va3MuaXRlbXMoKSk6CiAgICAgICAgICAgIHNlbGYucmVnaXN0ZXJfaG9vayhldmVudD1rLCBob29rPXYpCgogICAgICAgIHNlbGYubWV0aG9kID0gbWV0aG9kCiAgICAgICAgc2VsZi51cmwgPSB1cmwKICAgICAgICBzZWxmLmhlYWRlcnMgPSBoZWFkZXJzCiAgICAgICAgc2VsZi5maWxlcyA9IGZpbGVzCiAgICAgICAgc2VsZi5kYXRhID0gZGF0YQogICAgICAgIHNlbGYuanNvbiA9IGpzb24KICAgICAgICBzZWxmLnBhcmFtcyA9IHBhcmFtcwogICAgICAgIHNlbGYuYXV0aCA9IGF1dGgKICAgICAgICBzZWxmLmNvb2tpZXMgPSBjb29raWVzCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAnPFJlcXVlc3QgWyVzXT4nICUgKHNlbGYubWV0aG9kKQoKICAgIGRlZiBwcmVwYXJlKHNlbGYpOgogICAgICAgICIiIkNvbnN0cnVjdHMgYSA6Y2xhc3M6YFByZXBhcmVkUmVxdWVzdCA8UHJlcGFyZWRSZXF1ZXN0PmAgZm9yIHRyYW5zbWlzc2lvbiBhbmQgcmV0dXJucyBpdC4iIiIKICAgICAgICBwID0gUHJlcGFyZWRSZXF1ZXN0KCkKICAgICAgICBwLnByZXBhcmUoCiAgICAgICAgICAgIG1ldGhvZD1zZWxmLm1ldGhvZCwKICAgICAgICAgICAgdXJsPXNlbGYudXJsLAogICAgICAgICAgICBoZWFkZXJzPXNlbGYuaGVhZGVycywKICAgICAgICAgICAgZmlsZXM9c2VsZi5maWxlcywKICAgICAgICAgICAgZGF0YT1zZWxmLmRhdGEsCiAgICAgICAgICAgIGpzb249c2VsZi5qc29uLAogICAgICAgICAgICBwYXJhbXM9c2VsZi5wYXJhbXMsCiAgICAgICAgICAgIGF1dGg9c2VsZi5hdXRoLAogICAgICAgICAgICBjb29raWVzPXNlbGYuY29va2llcywKICAgICAgICAgICAgaG9va3M9c2VsZi5ob29rcywKICAgICAgICApCiAgICAgICAgcmV0dXJuIHAKCgpjbGFzcyBQcmVwYXJlZFJlcXVlc3QoUmVxdWVzdEVuY29kaW5nTWl4aW4sIFJlcXVlc3RIb29rc01peGluKToKICAgICIiIlRoZSBmdWxseSBtdXRhYmxlIDpjbGFzczpgUHJlcGFyZWRSZXF1ZXN0IDxQcmVwYXJlZFJlcXVlc3Q+YCBvYmplY3QsCiAgICBjb250YWluaW5nIHRoZSBleGFjdCBieXRlcyB0aGF0IHdpbGwgYmUgc2VudCB0byB0aGUgc2VydmVyLgoKICAgIEdlbmVyYXRlZCBmcm9tIGVpdGhlciBhIDpjbGFzczpgUmVxdWVzdCA8UmVxdWVzdD5gIG9iamVjdCBvciBtYW51YWxseS4KCiAgICBVc2FnZTo6CgogICAgICA+Pj4gaW1wb3J0IHJlcXVlc3RzCiAgICAgID4+PiByZXEgPSByZXF1ZXN0cy5SZXF1ZXN0KCdHRVQnLCAnaHR0cDovL2h0dHBiaW4ub3JnL2dldCcpCiAgICAgID4+PiByID0gcmVxLnByZXBhcmUoKQogICAgICA8UHJlcGFyZWRSZXF1ZXN0IFtHRVRdPgoKICAgICAgPj4+IHMgPSByZXF1ZXN0cy5TZXNzaW9uKCkKICAgICAgPj4+IHMuc2VuZChyKQogICAgICA8UmVzcG9uc2UgWzIwMF0+CiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgIzogSFRUUCB2ZXJiIHRvIHNlbmQgdG8gdGhlIHNlcnZlci4KICAgICAgICBzZWxmLm1ldGhvZCA9IE5vbmUKICAgICAgICAjOiBIVFRQIFVSTCB0byBzZW5kIHRoZSByZXF1ZXN0IHRvLgogICAgICAgIHNlbGYudXJsID0gTm9uZQogICAgICAgICM6IGRpY3Rpb25hcnkgb2YgSFRUUCBoZWFkZXJzLgogICAgICAgIHNlbGYuaGVhZGVycyA9IE5vbmUKICAgICAgICAjIFRoZSBgQ29va2llSmFyYCB1c2VkIHRvIGNyZWF0ZSB0aGUgQ29va2llIGhlYWRlciB3aWxsIGJlIHN0b3JlZCBoZXJlCiAgICAgICAgIyBhZnRlciBwcmVwYXJlX2Nvb2tpZXMgaXMgY2FsbGVkCiAgICAgICAgc2VsZi5fY29va2llcyA9IE5vbmUKICAgICAgICAjOiByZXF1ZXN0IGJvZHkgdG8gc2VuZCB0byB0aGUgc2VydmVyLgogICAgICAgIHNlbGYuYm9keSA9IE5vbmUKICAgICAgICAjOiBkaWN0aW9uYXJ5IG9mIGNhbGxiYWNrIGhvb2tzLCBmb3IgaW50ZXJuYWwgdXNhZ2UuCiAgICAgICAgc2VsZi5ob29rcyA9IGRlZmF1bHRfaG9va3MoKQogICAgICAgICM6IGludGVnZXIgZGVub3Rpbmcgc3RhcnRpbmcgcG9zaXRpb24gb2YgYSByZWFkYWJsZSBmaWxlLWxpa2UgYm9keS4KICAgICAgICBzZWxmLl9ib2R5X3Bvc2l0aW9uID0gTm9uZQoKICAgIGRlZiBwcmVwYXJlKHNlbGYsCiAgICAgICAgICAgIG1ldGhvZD1Ob25lLCB1cmw9Tm9uZSwgaGVhZGVycz1Ob25lLCBmaWxlcz1Ob25lLCBkYXRhPU5vbmUsCiAgICAgICAgICAgIHBhcmFtcz1Ob25lLCBhdXRoPU5vbmUsIGNvb2tpZXM9Tm9uZSwgaG9va3M9Tm9uZSwganNvbj1Ob25lKToKICAgICAgICAiIiJQcmVwYXJlcyB0aGUgZW50aXJlIHJlcXVlc3Qgd2l0aCB0aGUgZ2l2ZW4gcGFyYW1ldGVycy4iIiIKCiAgICAgICAgc2VsZi5wcmVwYXJlX21ldGhvZChtZXRob2QpCiAgICAgICAgc2VsZi5wcmVwYXJlX3VybCh1cmwsIHBhcmFtcykKICAgICAgICBzZWxmLnByZXBhcmVfaGVhZGVycyhoZWFkZXJzKQogICAgICAgIHNlbGYucHJlcGFyZV9jb29raWVzKGNvb2tpZXMpCiAgICAgICAgc2VsZi5wcmVwYXJlX2JvZHkoZGF0YSwgZmlsZXMsIGpzb24pCiAgICAgICAgc2VsZi5wcmVwYXJlX2F1dGgoYXV0aCwgdXJsKQoKICAgICAgICAjIE5vdGUgdGhhdCBwcmVwYXJlX2F1dGggbXVzdCBiZSBsYXN0IHRvIGVuYWJsZSBhdXRoZW50aWNhdGlvbiBzY2hlbWVzCiAgICAgICAgIyBzdWNoIGFzIE9BdXRoIHRvIHdvcmsgb24gYSBmdWxseSBwcmVwYXJlZCByZXF1ZXN0LgoKICAgICAgICAjIFRoaXMgTVVTVCBnbyBhZnRlciBwcmVwYXJlX2F1dGguIEF1dGhlbnRpY2F0b3JzIGNvdWxkIGFkZCBhIGhvb2sKICAgICAgICBzZWxmLnByZXBhcmVfaG9va3MoaG9va3MpCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAnPFByZXBhcmVkUmVxdWVzdCBbJXNdPicgJSAoc2VsZi5tZXRob2QpCgogICAgZGVmIGNvcHkoc2VsZik6CiAgICAgICAgcCA9IFByZXBhcmVkUmVxdWVzdCgpCiAgICAgICAgcC5tZXRob2QgPSBzZWxmLm1ldGhvZAogICAgICAgIHAudXJsID0gc2VsZi51cmwKICAgICAgICBwLmhlYWRlcnMgPSBzZWxmLmhlYWRlcnMuY29weSgpIGlmIHNlbGYuaGVhZGVycyBpcyBub3QgTm9uZSBlbHNlIE5vbmUKICAgICAgICBwLl9jb29raWVzID0gX2NvcHlfY29va2llX2phcihzZWxmLl9jb29raWVzKQogICAgICAgIHAuYm9keSA9IHNlbGYuYm9keQogICAgICAgIHAuaG9va3MgPSBzZWxmLmhvb2tzCiAgICAgICAgcC5fYm9keV9wb3NpdGlvbiA9IHNlbGYuX2JvZHlfcG9zaXRpb24KICAgICAgICByZXR1cm4gcAoKICAgIGRlZiBwcmVwYXJlX21ldGhvZChzZWxmLCBtZXRob2QpOgogICAgICAgICIiIlByZXBhcmVzIHRoZSBnaXZlbiBIVFRQIG1ldGhvZC4iIiIKICAgICAgICBzZWxmLm1ldGhvZCA9IG1ldGhvZAogICAgICAgIGlmIHNlbGYubWV0aG9kIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLm1ldGhvZCA9IHRvX25hdGl2ZV9zdHJpbmcoc2VsZi5tZXRob2QudXBwZXIoKSkKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX2dldF9pZG5hX2VuY29kZWRfaG9zdChob3N0KToKICAgICAgICBpbXBvcnQgaWRuYQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGhvc3QgPSBpZG5hLmVuY29kZShob3N0LCB1dHM0Nj1UcnVlKS5kZWNvZGUoJ3V0Zi04JykKICAgICAgICBleGNlcHQgaWRuYS5JRE5BRXJyb3I6CiAgICAgICAgICAgIHJhaXNlIFVuaWNvZGVFcnJvcgogICAgICAgIHJldHVybiBob3N0CgogICAgZGVmIHByZXBhcmVfdXJsKHNlbGYsIHVybCwgcGFyYW1zKToKICAgICAgICAiIiJQcmVwYXJlcyB0aGUgZ2l2ZW4gSFRUUCBVUkwuIiIiCiAgICAgICAgIzogQWNjZXB0IG9iamVjdHMgdGhhdCBoYXZlIHN0cmluZyByZXByZXNlbnRhdGlvbnMuCiAgICAgICAgIzogV2UncmUgdW5hYmxlIHRvIGJsaW5kbHkgY2FsbCB1bmljb2RlL3N0ciBmdW5jdGlvbnMKICAgICAgICAjOiBhcyB0aGlzIHdpbGwgaW5jbHVkZSB0aGUgYnl0ZXN0cmluZyBpbmRpY2F0b3IgKGInJykKICAgICAgICAjOiBvbiBweXRob24gMy54LgogICAgICAgICM6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZXF1ZXN0cy9yZXF1ZXN0cy9wdWxsLzIyMzgKICAgICAgICBpZiBpc2luc3RhbmNlKHVybCwgYnl0ZXMpOgogICAgICAgICAgICB1cmwgPSB1cmwuZGVjb2RlKCd1dGY4JykKICAgICAgICBlbHNlOgogICAgICAgICAgICB1cmwgPSB1bmljb2RlKHVybCkgaWYgaXNfcHkyIGVsc2Ugc3RyKHVybCkKCiAgICAgICAgIyBSZW1vdmUgbGVhZGluZyB3aGl0ZXNwYWNlcyBmcm9tIHVybAogICAgICAgIHVybCA9IHVybC5sc3RyaXAoKQoKICAgICAgICAjIERvbid0IGRvIGFueSBVUkwgcHJlcGFyYXRpb24gZm9yIG5vbi1IVFRQIHNjaGVtZXMgbGlrZSBgbWFpbHRvYCwKICAgICAgICAjIGBkYXRhYCBldGMgdG8gd29yayBhcm91bmQgZXhjZXB0aW9ucyBmcm9tIGB1cmxfcGFyc2VgLCB3aGljaAogICAgICAgICMgaGFuZGxlcyBSRkMgMzk4NiBvbmx5LgogICAgICAgIGlmICc6JyBpbiB1cmwgYW5kIG5vdCB1cmwubG93ZXIoKS5zdGFydHN3aXRoKCdodHRwJyk6CiAgICAgICAgICAgIHNlbGYudXJsID0gdXJsCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICAjIFN1cHBvcnQgZm9yIHVuaWNvZGUgZG9tYWluIG5hbWVzIGFuZCBwYXRocy4KICAgICAgICB0cnk6CiAgICAgICAgICAgIHNjaGVtZSwgYXV0aCwgaG9zdCwgcG9ydCwgcGF0aCwgcXVlcnksIGZyYWdtZW50ID0gcGFyc2VfdXJsKHVybCkKICAgICAgICBleGNlcHQgTG9jYXRpb25QYXJzZUVycm9yIGFzIGU6CiAgICAgICAgICAgIHJhaXNlIEludmFsaWRVUkwoKmUuYXJncykKCiAgICAgICAgaWYgbm90IHNjaGVtZToKICAgICAgICAgICAgZXJyb3IgPSAoIkludmFsaWQgVVJMIHswIXJ9OiBObyBzY2hlbWEgc3VwcGxpZWQuIFBlcmhhcHMgeW91IG1lYW50IGh0dHA6Ly97MH0/IikKICAgICAgICAgICAgZXJyb3IgPSBlcnJvci5mb3JtYXQodG9fbmF0aXZlX3N0cmluZyh1cmwsICd1dGY4JykpCgogICAgICAgICAgICByYWlzZSBNaXNzaW5nU2NoZW1hKGVycm9yKQoKICAgICAgICBpZiBub3QgaG9zdDoKICAgICAgICAgICAgcmFpc2UgSW52YWxpZFVSTCgiSW52YWxpZCBVUkwgJXI6IE5vIGhvc3Qgc3VwcGxpZWQiICUgdXJsKQoKICAgICAgICAjIEluIGdlbmVyYWwsIHdlIHdhbnQgdG8gdHJ5IElETkEgZW5jb2RpbmcgdGhlIGhvc3RuYW1lIGlmIHRoZSBzdHJpbmcgY29udGFpbnMKICAgICAgICAjIG5vbi1BU0NJSSBjaGFyYWN0ZXJzLiBUaGlzIGFsbG93cyB1c2VycyB0byBhdXRvbWF0aWNhbGx5IGdldCB0aGUgY29ycmVjdCBJRE5BCiAgICAgICAgIyBiZWhhdmlvdXIuIEZvciBzdHJpbmdzIGNvbnRhaW5pbmcgb25seSBBU0NJSSBjaGFyYWN0ZXJzLCB3ZSBuZWVkIHRvIGFsc28gdmVyaWZ5CiAgICAgICAgIyBpdCBkb2Vzbid0IHN0YXJ0IHdpdGggYSB3aWxkY2FyZCAoKiksIGJlZm9yZSBhbGxvd2luZyB0aGUgdW5lbmNvZGVkIGhvc3RuYW1lLgogICAgICAgIGlmIG5vdCB1bmljb2RlX2lzX2FzY2lpKGhvc3QpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBob3N0ID0gc2VsZi5fZ2V0X2lkbmFfZW5jb2RlZF9ob3N0KGhvc3QpCiAgICAgICAgICAgIGV4Y2VwdCBVbmljb2RlRXJyb3I6CiAgICAgICAgICAgICAgICByYWlzZSBJbnZhbGlkVVJMKCdVUkwgaGFzIGFuIGludmFsaWQgbGFiZWwuJykKICAgICAgICBlbGlmIGhvc3Quc3RhcnRzd2l0aCh1JyonKToKICAgICAgICAgICAgcmFpc2UgSW52YWxpZFVSTCgnVVJMIGhhcyBhbiBpbnZhbGlkIGxhYmVsLicpCgogICAgICAgICMgQ2FyZWZ1bGx5IHJlY29uc3RydWN0IHRoZSBuZXR3b3JrIGxvY2F0aW9uCiAgICAgICAgbmV0bG9jID0gYXV0aCBvciAnJwogICAgICAgIGlmIG5ldGxvYzoKICAgICAgICAgICAgbmV0bG9jICs9ICdAJwogICAgICAgIG5ldGxvYyArPSBob3N0CiAgICAgICAgaWYgcG9ydDoKICAgICAgICAgICAgbmV0bG9jICs9ICc6JyArIHN0cihwb3J0KQoKICAgICAgICAjIEJhcmUgZG9tYWlucyBhcmVuJ3QgdmFsaWQgVVJMcy4KICAgICAgICBpZiBub3QgcGF0aDoKICAgICAgICAgICAgcGF0aCA9ICcvJwoKICAgICAgICBpZiBpc19weTI6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2NoZW1lLCBzdHIpOgogICAgICAgICAgICAgICAgc2NoZW1lID0gc2NoZW1lLmVuY29kZSgndXRmLTgnKQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKG5ldGxvYywgc3RyKToKICAgICAgICAgICAgICAgIG5ldGxvYyA9IG5ldGxvYy5lbmNvZGUoJ3V0Zi04JykKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShwYXRoLCBzdHIpOgogICAgICAgICAgICAgICAgcGF0aCA9IHBhdGguZW5jb2RlKCd1dGYtOCcpCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UocXVlcnksIHN0cik6CiAgICAgICAgICAgICAgICBxdWVyeSA9IHF1ZXJ5LmVuY29kZSgndXRmLTgnKQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGZyYWdtZW50LCBzdHIpOgogICAgICAgICAgICAgICAgZnJhZ21lbnQgPSBmcmFnbWVudC5lbmNvZGUoJ3V0Zi04JykKCiAgICAgICAgaWYgaXNpbnN0YW5jZShwYXJhbXMsIChzdHIsIGJ5dGVzKSk6CiAgICAgICAgICAgIHBhcmFtcyA9IHRvX25hdGl2ZV9zdHJpbmcocGFyYW1zKQoKICAgICAgICBlbmNfcGFyYW1zID0gc2VsZi5fZW5jb2RlX3BhcmFtcyhwYXJhbXMpCiAgICAgICAgaWYgZW5jX3BhcmFtczoKICAgICAgICAgICAgaWYgcXVlcnk6CiAgICAgICAgICAgICAgICBxdWVyeSA9ICclcyYlcycgJSAocXVlcnksIGVuY19wYXJhbXMpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBxdWVyeSA9IGVuY19wYXJhbXMKCiAgICAgICAgdXJsID0gcmVxdW90ZV91cmkodXJsdW5wYXJzZShbc2NoZW1lLCBuZXRsb2MsIHBhdGgsIE5vbmUsIHF1ZXJ5LCBmcmFnbWVudF0pKQogICAgICAgIHNlbGYudXJsID0gdXJsCgogICAgZGVmIHByZXBhcmVfaGVhZGVycyhzZWxmLCBoZWFkZXJzKToKICAgICAgICAiIiJQcmVwYXJlcyB0aGUgZ2l2ZW4gSFRUUCBoZWFkZXJzLiIiIgoKICAgICAgICBzZWxmLmhlYWRlcnMgPSBDYXNlSW5zZW5zaXRpdmVEaWN0KCkKICAgICAgICBpZiBoZWFkZXJzOgogICAgICAgICAgICBmb3IgaGVhZGVyIGluIGhlYWRlcnMuaXRlbXMoKToKICAgICAgICAgICAgICAgICMgUmFpc2UgZXhjZXB0aW9uIG9uIGludmFsaWQgaGVhZGVyIHZhbHVlLgogICAgICAgICAgICAgICAgY2hlY2tfaGVhZGVyX3ZhbGlkaXR5KGhlYWRlcikKICAgICAgICAgICAgICAgIG5hbWUsIHZhbHVlID0gaGVhZGVyCiAgICAgICAgICAgICAgICBzZWxmLmhlYWRlcnNbdG9fbmF0aXZlX3N0cmluZyhuYW1lKV0gPSB2YWx1ZQoKICAgIGRlZiBwcmVwYXJlX2JvZHkoc2VsZiwgZGF0YSwgZmlsZXMsIGpzb249Tm9uZSk6CiAgICAgICAgIiIiUHJlcGFyZXMgdGhlIGdpdmVuIEhUVFAgYm9keSBkYXRhLiIiIgoKICAgICAgICAjIENoZWNrIGlmIGZpbGUsIGZvLCBnZW5lcmF0b3IsIGl0ZXJhdG9yLgogICAgICAgICMgSWYgbm90LCBydW4gdGhyb3VnaCBub3JtYWwgcHJvY2Vzcy4KCiAgICAgICAgIyBOb3R0aW4nIG9uIHlvdS4KICAgICAgICBib2R5ID0gTm9uZQogICAgICAgIGNvbnRlbnRfdHlwZSA9IE5vbmUKCiAgICAgICAgaWYgbm90IGRhdGEgYW5kIGpzb24gaXMgbm90IE5vbmU6CiAgICAgICAgICAgICMgdXJsbGliMyByZXF1aXJlcyBhIGJ5dGVzLWxpa2UgYm9keS4gUHl0aG9uIDIncyBqc29uLmR1bXBzCiAgICAgICAgICAgICMgcHJvdmlkZXMgdGhpcyBuYXRpdmVseSwgYnV0IFB5dGhvbiAzIGdpdmVzIGEgVW5pY29kZSBzdHJpbmcuCiAgICAgICAgICAgIGNvbnRlbnRfdHlwZSA9ICdhcHBsaWNhdGlvbi9qc29uJwogICAgICAgICAgICBib2R5ID0gY29tcGxleGpzb24uZHVtcHMoanNvbikKICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoYm9keSwgYnl0ZXMpOgogICAgICAgICAgICAgICAgYm9keSA9IGJvZHkuZW5jb2RlKCd1dGYtOCcpCgogICAgICAgIGlzX3N0cmVhbSA9IGFsbChbCiAgICAgICAgICAgIGhhc2F0dHIoZGF0YSwgJ19faXRlcl9fJyksCiAgICAgICAgICAgIG5vdCBpc2luc3RhbmNlKGRhdGEsIChiYXNlc3RyaW5nLCBsaXN0LCB0dXBsZSwgY29sbGVjdGlvbnMuTWFwcGluZykpCiAgICAgICAgXSkKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBsZW5ndGggPSBzdXBlcl9sZW4oZGF0YSkKICAgICAgICBleGNlcHQgKFR5cGVFcnJvciwgQXR0cmlidXRlRXJyb3IsIFVuc3VwcG9ydGVkT3BlcmF0aW9uKToKICAgICAgICAgICAgbGVuZ3RoID0gTm9uZQoKICAgICAgICBpZiBpc19zdHJlYW06CiAgICAgICAgICAgIGJvZHkgPSBkYXRhCgogICAgICAgICAgICBpZiBnZXRhdHRyKGJvZHksICd0ZWxsJywgTm9uZSkgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAjIFJlY29yZCB0aGUgY3VycmVudCBmaWxlIHBvc2l0aW9uIGJlZm9yZSByZWFkaW5nLgogICAgICAgICAgICAgICAgIyBUaGlzIHdpbGwgYWxsb3cgdXMgdG8gcmV3aW5kIGEgZmlsZSBpbiB0aGUgZXZlbnQKICAgICAgICAgICAgICAgICMgb2YgYSByZWRpcmVjdC4KICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBzZWxmLl9ib2R5X3Bvc2l0aW9uID0gYm9keS50ZWxsKCkKICAgICAgICAgICAgICAgIGV4Y2VwdCAoSU9FcnJvciwgT1NFcnJvcik6CiAgICAgICAgICAgICAgICAgICAgIyBUaGlzIGRpZmZlcmVudGlhdGVzIGZyb20gTm9uZSwgYWxsb3dpbmcgdXMgdG8gY2F0Y2gKICAgICAgICAgICAgICAgICAgICAjIGEgZmFpbGVkIGB0ZWxsKClgIGxhdGVyIHdoZW4gdHJ5aW5nIHRvIHJld2luZCB0aGUgYm9keQogICAgICAgICAgICAgICAgICAgIHNlbGYuX2JvZHlfcG9zaXRpb24gPSBvYmplY3QoKQoKICAgICAgICAgICAgaWYgZmlsZXM6CiAgICAgICAgICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCdTdHJlYW1lZCBib2RpZXMgYW5kIGZpbGVzIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuJykKCiAgICAgICAgICAgIGlmIGxlbmd0aDoKICAgICAgICAgICAgICAgIHNlbGYuaGVhZGVyc1snQ29udGVudC1MZW5ndGgnXSA9IGJ1aWx0aW5fc3RyKGxlbmd0aCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYuaGVhZGVyc1snVHJhbnNmZXItRW5jb2RpbmcnXSA9ICdjaHVua2VkJwogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgTXVsdGktcGFydCBmaWxlIHVwbG9hZHMuCiAgICAgICAgICAgIGlmIGZpbGVzOgogICAgICAgICAgICAgICAgKGJvZHksIGNvbnRlbnRfdHlwZSkgPSBzZWxmLl9lbmNvZGVfZmlsZXMoZmlsZXMsIGRhdGEpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBpZiBkYXRhOgogICAgICAgICAgICAgICAgICAgIGJvZHkgPSBzZWxmLl9lbmNvZGVfcGFyYW1zKGRhdGEpCiAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShkYXRhLCBiYXNlc3RyaW5nKSBvciBoYXNhdHRyKGRhdGEsICdyZWFkJyk6CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRfdHlwZSA9IE5vbmUKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50X3R5cGUgPSAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJwoKICAgICAgICAgICAgc2VsZi5wcmVwYXJlX2NvbnRlbnRfbGVuZ3RoKGJvZHkpCgogICAgICAgICAgICAjIEFkZCBjb250ZW50LXR5cGUgaWYgaXQgd2Fzbid0IGV4cGxpY2l0bHkgcHJvdmlkZWQuCiAgICAgICAgICAgIGlmIGNvbnRlbnRfdHlwZSBhbmQgKCdjb250ZW50LXR5cGUnIG5vdCBpbiBzZWxmLmhlYWRlcnMpOgogICAgICAgICAgICAgICAgc2VsZi5oZWFkZXJzWydDb250ZW50LVR5cGUnXSA9IGNvbnRlbnRfdHlwZQoKICAgICAgICBzZWxmLmJvZHkgPSBib2R5CgogICAgZGVmIHByZXBhcmVfY29udGVudF9sZW5ndGgoc2VsZiwgYm9keSk6CiAgICAgICAgIiIiUHJlcGFyZSBDb250ZW50LUxlbmd0aCBoZWFkZXIgYmFzZWQgb24gcmVxdWVzdCBtZXRob2QgYW5kIGJvZHkiIiIKICAgICAgICBpZiBib2R5IGlzIG5vdCBOb25lOgogICAgICAgICAgICBsZW5ndGggPSBzdXBlcl9sZW4oYm9keSkKICAgICAgICAgICAgaWYgbGVuZ3RoOgogICAgICAgICAgICAgICAgIyBJZiBsZW5ndGggZXhpc3RzLCBzZXQgaXQuIE90aGVyd2lzZSwgd2UgZmFsbGJhY2sKICAgICAgICAgICAgICAgICMgdG8gVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWQuCiAgICAgICAgICAgICAgICBzZWxmLmhlYWRlcnNbJ0NvbnRlbnQtTGVuZ3RoJ10gPSBidWlsdGluX3N0cihsZW5ndGgpCiAgICAgICAgZWxpZiBzZWxmLm1ldGhvZCBub3QgaW4gKCdHRVQnLCAnSEVBRCcpIGFuZCBzZWxmLmhlYWRlcnMuZ2V0KCdDb250ZW50LUxlbmd0aCcpIGlzIE5vbmU6CiAgICAgICAgICAgICMgU2V0IENvbnRlbnQtTGVuZ3RoIHRvIDAgZm9yIG1ldGhvZHMgdGhhdCBjYW4gaGF2ZSBhIGJvZHkKICAgICAgICAgICAgIyBidXQgZG9uJ3QgcHJvdmlkZSBvbmUuIChpLmUuIG5vdCBHRVQgb3IgSEVBRCkKICAgICAgICAgICAgc2VsZi5oZWFkZXJzWydDb250ZW50LUxlbmd0aCddID0gJzAnCgogICAgZGVmIHByZXBhcmVfYXV0aChzZWxmLCBhdXRoLCB1cmw9JycpOgogICAgICAgICIiIlByZXBhcmVzIHRoZSBnaXZlbiBIVFRQIGF1dGggZGF0YS4iIiIKCiAgICAgICAgIyBJZiBubyBBdXRoIGlzIGV4cGxpY2l0bHkgcHJvdmlkZWQsIGV4dHJhY3QgaXQgZnJvbSB0aGUgVVJMIGZpcnN0LgogICAgICAgIGlmIGF1dGggaXMgTm9uZToKICAgICAgICAgICAgdXJsX2F1dGggPSBnZXRfYXV0aF9mcm9tX3VybChzZWxmLnVybCkKICAgICAgICAgICAgYXV0aCA9IHVybF9hdXRoIGlmIGFueSh1cmxfYXV0aCkgZWxzZSBOb25lCgogICAgICAgIGlmIGF1dGg6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoYXV0aCwgdHVwbGUpIGFuZCBsZW4oYXV0aCkgPT0gMjoKICAgICAgICAgICAgICAgICMgc3BlY2lhbC1jYXNlIGJhc2ljIEhUVFAgYXV0aAogICAgICAgICAgICAgICAgYXV0aCA9IEhUVFBCYXNpY0F1dGgoKmF1dGgpCgogICAgICAgICAgICAjIEFsbG93IGF1dGggdG8gbWFrZSBpdHMgY2hhbmdlcy4KICAgICAgICAgICAgciA9IGF1dGgoc2VsZikKCiAgICAgICAgICAgICMgVXBkYXRlIHNlbGYgdG8gcmVmbGVjdCB0aGUgYXV0aCBjaGFuZ2VzLgogICAgICAgICAgICBzZWxmLl9fZGljdF9fLnVwZGF0ZShyLl9fZGljdF9fKQoKICAgICAgICAgICAgIyBSZWNvbXB1dGUgQ29udGVudC1MZW5ndGgKICAgICAgICAgICAgc2VsZi5wcmVwYXJlX2NvbnRlbnRfbGVuZ3RoKHNlbGYuYm9keSkKCiAgICBkZWYgcHJlcGFyZV9jb29raWVzKHNlbGYsIGNvb2tpZXMpOgogICAgICAgICIiIlByZXBhcmVzIHRoZSBnaXZlbiBIVFRQIGNvb2tpZSBkYXRhLgoKICAgICAgICBUaGlzIGZ1bmN0aW9uIGV2ZW50dWFsbHkgZ2VuZXJhdGVzIGEgYGBDb29raWVgYCBoZWFkZXIgZnJvbSB0aGUKICAgICAgICBnaXZlbiBjb29raWVzIHVzaW5nIGNvb2tpZWxpYi4gRHVlIHRvIGNvb2tpZWxpYidzIGRlc2lnbiwgdGhlIGhlYWRlcgogICAgICAgIHdpbGwgbm90IGJlIHJlZ2VuZXJhdGVkIGlmIGl0IGFscmVhZHkgZXhpc3RzLCBtZWFuaW5nIHRoaXMgZnVuY3Rpb24KICAgICAgICBjYW4gb25seSBiZSBjYWxsZWQgb25jZSBmb3IgdGhlIGxpZmUgb2YgdGhlCiAgICAgICAgOmNsYXNzOmBQcmVwYXJlZFJlcXVlc3QgPFByZXBhcmVkUmVxdWVzdD5gIG9iamVjdC4gQW55IHN1YnNlcXVlbnQgY2FsbHMKICAgICAgICB0byBgYHByZXBhcmVfY29va2llc2BgIHdpbGwgaGF2ZSBubyBhY3R1YWwgZWZmZWN0LCB1bmxlc3MgdGhlICJDb29raWUiCiAgICAgICAgaGVhZGVyIGlzIHJlbW92ZWQgYmVmb3JlaGFuZC4KICAgICAgICAiIiIKICAgICAgICBpZiBpc2luc3RhbmNlKGNvb2tpZXMsIGNvb2tpZWxpYi5Db29raWVKYXIpOgogICAgICAgICAgICBzZWxmLl9jb29raWVzID0gY29va2llcwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuX2Nvb2tpZXMgPSBjb29raWVqYXJfZnJvbV9kaWN0KGNvb2tpZXMpCgogICAgICAgIGNvb2tpZV9oZWFkZXIgPSBnZXRfY29va2llX2hlYWRlcihzZWxmLl9jb29raWVzLCBzZWxmKQogICAgICAgIGlmIGNvb2tpZV9oZWFkZXIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGYuaGVhZGVyc1snQ29va2llJ10gPSBjb29raWVfaGVhZGVyCgogICAgZGVmIHByZXBhcmVfaG9va3Moc2VsZiwgaG9va3MpOgogICAgICAgICIiIlByZXBhcmVzIHRoZSBnaXZlbiBob29rcy4iIiIKICAgICAgICAjIGhvb2tzIGNhbiBiZSBwYXNzZWQgYXMgTm9uZSB0byB0aGUgcHJlcGFyZSBtZXRob2QgYW5kIHRvIHRoaXMKICAgICAgICAjIG1ldGhvZC4gVG8gcHJldmVudCBpdGVyYXRpbmcgb3ZlciBOb25lLCBzaW1wbHkgdXNlIGFuIGVtcHR5IGxpc3QKICAgICAgICAjIGlmIGhvb2tzIGlzIEZhbHNlLXkKICAgICAgICBob29rcyA9IGhvb2tzIG9yIFtdCiAgICAgICAgZm9yIGV2ZW50IGluIGhvb2tzOgogICAgICAgICAgICBzZWxmLnJlZ2lzdGVyX2hvb2soZXZlbnQsIGhvb2tzW2V2ZW50XSkKCgpjbGFzcyBSZXNwb25zZShvYmplY3QpOgogICAgIiIiVGhlIDpjbGFzczpgUmVzcG9uc2UgPFJlc3BvbnNlPmAgb2JqZWN0LCB3aGljaCBjb250YWlucyBhCiAgICBzZXJ2ZXIncyByZXNwb25zZSB0byBhbiBIVFRQIHJlcXVlc3QuCiAgICAiIiIKCiAgICBfX2F0dHJzX18gPSBbCiAgICAgICAgJ19jb250ZW50JywgJ3N0YXR1c19jb2RlJywgJ2hlYWRlcnMnLCAndXJsJywgJ2hpc3RvcnknLAogICAgICAgICdlbmNvZGluZycsICdyZWFzb24nLCAnY29va2llcycsICdlbGFwc2VkJywgJ3JlcXVlc3QnCiAgICBdCgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHNlbGYuX2NvbnRlbnQgPSBGYWxzZQogICAgICAgIHNlbGYuX2NvbnRlbnRfY29uc3VtZWQgPSBGYWxzZQogICAgICAgIHNlbGYuX25leHQgPSBOb25lCgogICAgICAgICM6IEludGVnZXIgQ29kZSBvZiByZXNwb25kZWQgSFRUUCBTdGF0dXMsIGUuZy4gNDA0IG9yIDIwMC4KICAgICAgICBzZWxmLnN0YXR1c19jb2RlID0gTm9uZQoKICAgICAgICAjOiBDYXNlLWluc2Vuc2l0aXZlIERpY3Rpb25hcnkgb2YgUmVzcG9uc2UgSGVhZGVycy4KICAgICAgICAjOiBGb3IgZXhhbXBsZSwgYGBoZWFkZXJzWydjb250ZW50LWVuY29kaW5nJ11gYCB3aWxsIHJldHVybiB0aGUKICAgICAgICAjOiB2YWx1ZSBvZiBhIGBgJ0NvbnRlbnQtRW5jb2RpbmcnYGAgcmVzcG9uc2UgaGVhZGVyLgogICAgICAgIHNlbGYuaGVhZGVycyA9IENhc2VJbnNlbnNpdGl2ZURpY3QoKQoKICAgICAgICAjOiBGaWxlLWxpa2Ugb2JqZWN0IHJlcHJlc2VudGF0aW9uIG9mIHJlc3BvbnNlIChmb3IgYWR2YW5jZWQgdXNhZ2UpLgogICAgICAgICM6IFVzZSBvZiBgYHJhd2BgIHJlcXVpcmVzIHRoYXQgYGBzdHJlYW09VHJ1ZWBgIGJlIHNldCBvbiB0aGUgcmVxdWVzdC4KICAgICAgICAjIFRoaXMgcmVxdWlyZW1lbnQgZG9lcyBub3QgYXBwbHkgZm9yIHVzZSBpbnRlcm5hbGx5IHRvIFJlcXVlc3RzLgogICAgICAgIHNlbGYucmF3ID0gTm9uZQoKICAgICAgICAjOiBGaW5hbCBVUkwgbG9jYXRpb24gb2YgUmVzcG9uc2UuCiAgICAgICAgc2VsZi51cmwgPSBOb25lCgogICAgICAgICM6IEVuY29kaW5nIHRvIGRlY29kZSB3aXRoIHdoZW4gYWNjZXNzaW5nIHIudGV4dC4KICAgICAgICBzZWxmLmVuY29kaW5nID0gTm9uZQoKICAgICAgICAjOiBBIGxpc3Qgb2YgOmNsYXNzOmBSZXNwb25zZSA8UmVzcG9uc2U+YCBvYmplY3RzIGZyb20KICAgICAgICAjOiB0aGUgaGlzdG9yeSBvZiB0aGUgUmVxdWVzdC4gQW55IHJlZGlyZWN0IHJlc3BvbnNlcyB3aWxsIGVuZAogICAgICAgICM6IHVwIGhlcmUuIFRoZSBsaXN0IGlzIHNvcnRlZCBmcm9tIHRoZSBvbGRlc3QgdG8gdGhlIG1vc3QgcmVjZW50IHJlcXVlc3QuCiAgICAgICAgc2VsZi5oaXN0b3J5ID0gW10KCiAgICAgICAgIzogVGV4dHVhbCByZWFzb24gb2YgcmVzcG9uZGVkIEhUVFAgU3RhdHVzLCBlLmcuICJOb3QgRm91bmQiIG9yICJPSyIuCiAgICAgICAgc2VsZi5yZWFzb24gPSBOb25lCgogICAgICAgICM6IEEgQ29va2llSmFyIG9mIENvb2tpZXMgdGhlIHNlcnZlciBzZW50IGJhY2suCiAgICAgICAgc2VsZi5jb29raWVzID0gY29va2llamFyX2Zyb21fZGljdCh7fSkKCiAgICAgICAgIzogVGhlIGFtb3VudCBvZiB0aW1lIGVsYXBzZWQgYmV0d2VlbiBzZW5kaW5nIHRoZSByZXF1ZXN0CiAgICAgICAgIzogYW5kIHRoZSBhcnJpdmFsIG9mIHRoZSByZXNwb25zZSAoYXMgYSB0aW1lZGVsdGEpLgogICAgICAgICM6IFRoaXMgcHJvcGVydHkgc3BlY2lmaWNhbGx5IG1lYXN1cmVzIHRoZSB0aW1lIHRha2VuIGJldHdlZW4gc2VuZGluZwogICAgICAgICM6IHRoZSBmaXJzdCBieXRlIG9mIHRoZSByZXF1ZXN0IGFuZCBmaW5pc2hpbmcgcGFyc2luZyB0aGUgaGVhZGVycy4gSXQKICAgICAgICAjOiBpcyB0aGVyZWZvcmUgdW5hZmZlY3RlZCBieSBjb25zdW1pbmcgdGhlIHJlc3BvbnNlIGNvbnRlbnQgb3IgdGhlCiAgICAgICAgIzogdmFsdWUgb2YgdGhlIGBgc3RyZWFtYGAga2V5d29yZCBhcmd1bWVudC4KICAgICAgICBzZWxmLmVsYXBzZWQgPSBkYXRldGltZS50aW1lZGVsdGEoMCkKCiAgICAgICAgIzogVGhlIDpjbGFzczpgUHJlcGFyZWRSZXF1ZXN0IDxQcmVwYXJlZFJlcXVlc3Q+YCBvYmplY3QgdG8gd2hpY2ggdGhpcwogICAgICAgICM6IGlzIGEgcmVzcG9uc2UuCiAgICAgICAgc2VsZi5yZXF1ZXN0ID0gTm9uZQoKICAgIGRlZiBfX2VudGVyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgX19leGl0X18oc2VsZiwgKmFyZ3MpOgogICAgICAgIHNlbGYuY2xvc2UoKQoKICAgIGRlZiBfX2dldHN0YXRlX18oc2VsZik6CiAgICAgICAgIyBDb25zdW1lIGV2ZXJ5dGhpbmc7IGFjY2Vzc2luZyB0aGUgY29udGVudCBhdHRyaWJ1dGUgbWFrZXMKICAgICAgICAjIHN1cmUgdGhlIGNvbnRlbnQgaGFzIGJlZW4gZnVsbHkgcmVhZC4KICAgICAgICBpZiBub3Qgc2VsZi5fY29udGVudF9jb25zdW1lZDoKICAgICAgICAgICAgc2VsZi5jb250ZW50CgogICAgICAgIHJldHVybiBkaWN0KAogICAgICAgICAgICAoYXR0ciwgZ2V0YXR0cihzZWxmLCBhdHRyLCBOb25lKSkKICAgICAgICAgICAgZm9yIGF0dHIgaW4gc2VsZi5fX2F0dHJzX18KICAgICAgICApCgogICAgZGVmIF9fc2V0c3RhdGVfXyhzZWxmLCBzdGF0ZSk6CiAgICAgICAgZm9yIG5hbWUsIHZhbHVlIGluIHN0YXRlLml0ZW1zKCk6CiAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgbmFtZSwgdmFsdWUpCgogICAgICAgICMgcGlja2xlZCBvYmplY3RzIGRvIG5vdCBoYXZlIC5yYXcKICAgICAgICBzZXRhdHRyKHNlbGYsICdfY29udGVudF9jb25zdW1lZCcsIFRydWUpCiAgICAgICAgc2V0YXR0cihzZWxmLCAncmF3JywgTm9uZSkKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICc8UmVzcG9uc2UgWyVzXT4nICUgKHNlbGYuc3RhdHVzX2NvZGUpCgogICAgZGVmIF9fYm9vbF9fKHNlbGYpOgogICAgICAgICIiIlJldHVybnMgVHJ1ZSBpZiA6YXR0cjpgc3RhdHVzX2NvZGVgIGlzIGxlc3MgdGhhbiA0MDAuCgogICAgICAgIFRoaXMgYXR0cmlidXRlIGNoZWNrcyBpZiB0aGUgc3RhdHVzIGNvZGUgb2YgdGhlIHJlc3BvbnNlIGlzIGJldHdlZW4KICAgICAgICA0MDAgYW5kIDYwMCB0byBzZWUgaWYgdGhlcmUgd2FzIGEgY2xpZW50IGVycm9yIG9yIGEgc2VydmVyIGVycm9yLiBJZgogICAgICAgIHRoZSBzdGF0dXMgY29kZSwgaXMgYmV0d2VlbiAyMDAgYW5kIDQwMCwgdGhpcyB3aWxsIHJldHVybiBUcnVlLiBUaGlzCiAgICAgICAgaXMgKipub3QqKiBhIGNoZWNrIHRvIHNlZSBpZiB0aGUgcmVzcG9uc2UgY29kZSBpcyBgYDIwMCBPS2BgLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmLm9rCgogICAgZGVmIF9fbm9uemVyb19fKHNlbGYpOgogICAgICAgICIiIlJldHVybnMgVHJ1ZSBpZiA6YXR0cjpgc3RhdHVzX2NvZGVgIGlzIGxlc3MgdGhhbiA0MDAuCgogICAgICAgIFRoaXMgYXR0cmlidXRlIGNoZWNrcyBpZiB0aGUgc3RhdHVzIGNvZGUgb2YgdGhlIHJlc3BvbnNlIGlzIGJldHdlZW4KICAgICAgICA0MDAgYW5kIDYwMCB0byBzZWUgaWYgdGhlcmUgd2FzIGEgY2xpZW50IGVycm9yIG9yIGEgc2VydmVyIGVycm9yLiBJZgogICAgICAgIHRoZSBzdGF0dXMgY29kZSwgaXMgYmV0d2VlbiAyMDAgYW5kIDQwMCwgdGhpcyB3aWxsIHJldHVybiBUcnVlLiBUaGlzCiAgICAgICAgaXMgKipub3QqKiBhIGNoZWNrIHRvIHNlZSBpZiB0aGUgcmVzcG9uc2UgY29kZSBpcyBgYDIwMCBPS2BgLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmLm9rCgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgICIiIkFsbG93cyB5b3UgdG8gdXNlIGEgcmVzcG9uc2UgYXMgYW4gaXRlcmF0b3IuIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuaXRlcl9jb250ZW50KDEyOCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBvayhzZWxmKToKICAgICAgICAiIiJSZXR1cm5zIFRydWUgaWYgOmF0dHI6YHN0YXR1c19jb2RlYCBpcyBsZXNzIHRoYW4gNDAwLgoKICAgICAgICBUaGlzIGF0dHJpYnV0ZSBjaGVja3MgaWYgdGhlIHN0YXR1cyBjb2RlIG9mIHRoZSByZXNwb25zZSBpcyBiZXR3ZWVuCiAgICAgICAgNDAwIGFuZCA2MDAgdG8gc2VlIGlmIHRoZXJlIHdhcyBhIGNsaWVudCBlcnJvciBvciBhIHNlcnZlciBlcnJvci4gSWYKICAgICAgICB0aGUgc3RhdHVzIGNvZGUsIGlzIGJldHdlZW4gMjAwIGFuZCA0MDAsIHRoaXMgd2lsbCByZXR1cm4gVHJ1ZS4gVGhpcwogICAgICAgIGlzICoqbm90KiogYSBjaGVjayB0byBzZWUgaWYgdGhlIHJlc3BvbnNlIGNvZGUgaXMgYGAyMDAgT0tgYC4KICAgICAgICAiIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYucmFpc2VfZm9yX3N0YXR1cygpCiAgICAgICAgZXhjZXB0IEhUVFBFcnJvcjoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc19yZWRpcmVjdChzZWxmKToKICAgICAgICAiIiJUcnVlIGlmIHRoaXMgUmVzcG9uc2UgaXMgYSB3ZWxsLWZvcm1lZCBIVFRQIHJlZGlyZWN0IHRoYXQgY291bGQgaGF2ZQogICAgICAgIGJlZW4gcHJvY2Vzc2VkIGF1dG9tYXRpY2FsbHkgKGJ5IDptZXRoOmBTZXNzaW9uLnJlc29sdmVfcmVkaXJlY3RzYCkuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuICgnbG9jYXRpb24nIGluIHNlbGYuaGVhZGVycyBhbmQgc2VsZi5zdGF0dXNfY29kZSBpbiBSRURJUkVDVF9TVEFUSSkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc19wZXJtYW5lbnRfcmVkaXJlY3Qoc2VsZik6CiAgICAgICAgIiIiVHJ1ZSBpZiB0aGlzIFJlc3BvbnNlIG9uZSBvZiB0aGUgcGVybWFuZW50IHZlcnNpb25zIG9mIHJlZGlyZWN0LiIiIgogICAgICAgIHJldHVybiAoJ2xvY2F0aW9uJyBpbiBzZWxmLmhlYWRlcnMgYW5kIHNlbGYuc3RhdHVzX2NvZGUgaW4gKGNvZGVzLm1vdmVkX3Blcm1hbmVudGx5LCBjb2Rlcy5wZXJtYW5lbnRfcmVkaXJlY3QpKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIG5leHQoc2VsZik6CiAgICAgICAgIiIiUmV0dXJucyBhIFByZXBhcmVkUmVxdWVzdCBmb3IgdGhlIG5leHQgcmVxdWVzdCBpbiBhIHJlZGlyZWN0IGNoYWluLCBpZiB0aGVyZSBpcyBvbmUuIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuX25leHQKCiAgICBAcHJvcGVydHkKICAgIGRlZiBhcHBhcmVudF9lbmNvZGluZyhzZWxmKToKICAgICAgICAiIiJUaGUgYXBwYXJlbnQgZW5jb2RpbmcsIHByb3ZpZGVkIGJ5IHRoZSBjaGFyZGV0IGxpYnJhcnkuIiIiCiAgICAgICAgcmV0dXJuIGNoYXJkZXQuZGV0ZWN0KHNlbGYuY29udGVudClbJ2VuY29kaW5nJ10KCiAgICBkZWYgaXRlcl9jb250ZW50KHNlbGYsIGNodW5rX3NpemU9MSwgZGVjb2RlX3VuaWNvZGU9RmFsc2UpOgogICAgICAgICIiIkl0ZXJhdGVzIG92ZXIgdGhlIHJlc3BvbnNlIGRhdGEuICBXaGVuIHN0cmVhbT1UcnVlIGlzIHNldCBvbiB0aGUKICAgICAgICByZXF1ZXN0LCB0aGlzIGF2b2lkcyByZWFkaW5nIHRoZSBjb250ZW50IGF0IG9uY2UgaW50byBtZW1vcnkgZm9yCiAgICAgICAgbGFyZ2UgcmVzcG9uc2VzLiAgVGhlIGNodW5rIHNpemUgaXMgdGhlIG51bWJlciBvZiBieXRlcyBpdCBzaG91bGQKICAgICAgICByZWFkIGludG8gbWVtb3J5LiAgVGhpcyBpcyBub3QgbmVjZXNzYXJpbHkgdGhlIGxlbmd0aCBvZiBlYWNoIGl0ZW0KICAgICAgICByZXR1cm5lZCBhcyBkZWNvZGluZyBjYW4gdGFrZSBwbGFjZS4KCiAgICAgICAgY2h1bmtfc2l6ZSBtdXN0IGJlIG9mIHR5cGUgaW50IG9yIE5vbmUuIEEgdmFsdWUgb2YgTm9uZSB3aWxsCiAgICAgICAgZnVuY3Rpb24gZGlmZmVyZW50bHkgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiBgc3RyZWFtYC4KICAgICAgICBzdHJlYW09VHJ1ZSB3aWxsIHJlYWQgZGF0YSBhcyBpdCBhcnJpdmVzIGluIHdoYXRldmVyIHNpemUgdGhlCiAgICAgICAgY2h1bmtzIGFyZSByZWNlaXZlZC4gSWYgc3RyZWFtPUZhbHNlLCBkYXRhIGlzIHJldHVybmVkIGFzCiAgICAgICAgYSBzaW5nbGUgY2h1bmsuCgogICAgICAgIElmIGRlY29kZV91bmljb2RlIGlzIFRydWUsIGNvbnRlbnQgd2lsbCBiZSBkZWNvZGVkIHVzaW5nIHRoZSBiZXN0CiAgICAgICAgYXZhaWxhYmxlIGVuY29kaW5nIGJhc2VkIG9uIHRoZSByZXNwb25zZS4KICAgICAgICAiIiIKCiAgICAgICAgZGVmIGdlbmVyYXRlKCk6CiAgICAgICAgICAgICMgU3BlY2lhbCBjYXNlIGZvciB1cmxsaWIzLgogICAgICAgICAgICBpZiBoYXNhdHRyKHNlbGYucmF3LCAnc3RyZWFtJyk6CiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgZm9yIGNodW5rIGluIHNlbGYucmF3LnN0cmVhbShjaHVua19zaXplLCBkZWNvZGVfY29udGVudD1UcnVlKToKICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgY2h1bmsKICAgICAgICAgICAgICAgIGV4Y2VwdCBQcm90b2NvbEVycm9yIGFzIGU6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgQ2h1bmtlZEVuY29kaW5nRXJyb3IoZSkKICAgICAgICAgICAgICAgIGV4Y2VwdCBEZWNvZGVFcnJvciBhcyBlOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIENvbnRlbnREZWNvZGluZ0Vycm9yKGUpCiAgICAgICAgICAgICAgICBleGNlcHQgUmVhZFRpbWVvdXRFcnJvciBhcyBlOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIENvbm5lY3Rpb25FcnJvcihlKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBTdGFuZGFyZCBmaWxlLWxpa2Ugb2JqZWN0LgogICAgICAgICAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgICAgICAgICBjaHVuayA9IHNlbGYucmF3LnJlYWQoY2h1bmtfc2l6ZSkKICAgICAgICAgICAgICAgICAgICBpZiBub3QgY2h1bms6CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICAgICAgeWllbGQgY2h1bmsKCiAgICAgICAgICAgIHNlbGYuX2NvbnRlbnRfY29uc3VtZWQgPSBUcnVlCgogICAgICAgIGlmIHNlbGYuX2NvbnRlbnRfY29uc3VtZWQgYW5kIGlzaW5zdGFuY2Uoc2VsZi5fY29udGVudCwgYm9vbCk6CiAgICAgICAgICAgIHJhaXNlIFN0cmVhbUNvbnN1bWVkRXJyb3IoKQogICAgICAgIGVsaWYgY2h1bmtfc2l6ZSBpcyBub3QgTm9uZSBhbmQgbm90IGlzaW5zdGFuY2UoY2h1bmtfc2l6ZSwgaW50KToKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJjaHVua19zaXplIG11c3QgYmUgYW4gaW50LCBpdCBpcyBpbnN0ZWFkIGEgJXMuIiAlIHR5cGUoY2h1bmtfc2l6ZSkpCiAgICAgICAgIyBzaW11bGF0ZSByZWFkaW5nIHNtYWxsIGNodW5rcyBvZiB0aGUgY29udGVudAogICAgICAgIHJldXNlZF9jaHVua3MgPSBpdGVyX3NsaWNlcyhzZWxmLl9jb250ZW50LCBjaHVua19zaXplKQoKICAgICAgICBzdHJlYW1fY2h1bmtzID0gZ2VuZXJhdGUoKQoKICAgICAgICBjaHVua3MgPSByZXVzZWRfY2h1bmtzIGlmIHNlbGYuX2NvbnRlbnRfY29uc3VtZWQgZWxzZSBzdHJlYW1fY2h1bmtzCgogICAgICAgIGlmIGRlY29kZV91bmljb2RlOgogICAgICAgICAgICBjaHVua3MgPSBzdHJlYW1fZGVjb2RlX3Jlc3BvbnNlX3VuaWNvZGUoY2h1bmtzLCBzZWxmKQoKICAgICAgICByZXR1cm4gY2h1bmtzCgogICAgZGVmIGl0ZXJfbGluZXMoc2VsZiwgY2h1bmtfc2l6ZT1JVEVSX0NIVU5LX1NJWkUsIGRlY29kZV91bmljb2RlPU5vbmUsIGRlbGltaXRlcj1Ob25lKToKICAgICAgICAiIiJJdGVyYXRlcyBvdmVyIHRoZSByZXNwb25zZSBkYXRhLCBvbmUgbGluZSBhdCBhIHRpbWUuICBXaGVuCiAgICAgICAgc3RyZWFtPVRydWUgaXMgc2V0IG9uIHRoZSByZXF1ZXN0LCB0aGlzIGF2b2lkcyByZWFkaW5nIHRoZQogICAgICAgIGNvbnRlbnQgYXQgb25jZSBpbnRvIG1lbW9yeSBmb3IgbGFyZ2UgcmVzcG9uc2VzLgoKICAgICAgICAuLiBub3RlOjogVGhpcyBtZXRob2QgaXMgbm90IHJlZW50cmFudCBzYWZlLgogICAgICAgICIiIgoKICAgICAgICBwZW5kaW5nID0gTm9uZQoKICAgICAgICBmb3IgY2h1bmsgaW4gc2VsZi5pdGVyX2NvbnRlbnQoY2h1bmtfc2l6ZT1jaHVua19zaXplLCBkZWNvZGVfdW5pY29kZT1kZWNvZGVfdW5pY29kZSk6CgogICAgICAgICAgICBpZiBwZW5kaW5nIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgY2h1bmsgPSBwZW5kaW5nICsgY2h1bmsKCiAgICAgICAgICAgIGlmIGRlbGltaXRlcjoKICAgICAgICAgICAgICAgIGxpbmVzID0gY2h1bmsuc3BsaXQoZGVsaW1pdGVyKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgbGluZXMgPSBjaHVuay5zcGxpdGxpbmVzKCkKCiAgICAgICAgICAgIGlmIGxpbmVzIGFuZCBsaW5lc1stMV0gYW5kIGNodW5rIGFuZCBsaW5lc1stMV1bLTFdID09IGNodW5rWy0xXToKICAgICAgICAgICAgICAgIHBlbmRpbmcgPSBsaW5lcy5wb3AoKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcGVuZGluZyA9IE5vbmUKCiAgICAgICAgICAgIGZvciBsaW5lIGluIGxpbmVzOgogICAgICAgICAgICAgICAgeWllbGQgbGluZQoKICAgICAgICBpZiBwZW5kaW5nIGlzIG5vdCBOb25lOgogICAgICAgICAgICB5aWVsZCBwZW5kaW5nCgogICAgQHByb3BlcnR5CiAgICBkZWYgY29udGVudChzZWxmKToKICAgICAgICAiIiJDb250ZW50IG9mIHRoZSByZXNwb25zZSwgaW4gYnl0ZXMuIiIiCgogICAgICAgIGlmIHNlbGYuX2NvbnRlbnQgaXMgRmFsc2U6CiAgICAgICAgICAgICMgUmVhZCB0aGUgY29udGVudHMuCiAgICAgICAgICAgIGlmIHNlbGYuX2NvbnRlbnRfY29uc3VtZWQ6CiAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgJ1RoZSBjb250ZW50IGZvciB0aGlzIHJlc3BvbnNlIHdhcyBhbHJlYWR5IGNvbnN1bWVkJykKCiAgICAgICAgICAgIGlmIHNlbGYuc3RhdHVzX2NvZGUgPT0gMCBvciBzZWxmLnJhdyBpcyBOb25lOgogICAgICAgICAgICAgICAgc2VsZi5fY29udGVudCA9IE5vbmUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYuX2NvbnRlbnQgPSBieXRlcygpLmpvaW4oc2VsZi5pdGVyX2NvbnRlbnQoQ09OVEVOVF9DSFVOS19TSVpFKSkgb3IgYnl0ZXMoKQoKICAgICAgICBzZWxmLl9jb250ZW50X2NvbnN1bWVkID0gVHJ1ZQogICAgICAgICMgZG9uJ3QgbmVlZCB0byByZWxlYXNlIHRoZSBjb25uZWN0aW9uOyB0aGF0J3MgYmVlbiBoYW5kbGVkIGJ5IHVybGxpYjMKICAgICAgICAjIHNpbmNlIHdlIGV4aGF1c3RlZCB0aGUgZGF0YS4KICAgICAgICByZXR1cm4gc2VsZi5fY29udGVudAoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHRleHQoc2VsZik6CiAgICAgICAgIiIiQ29udGVudCBvZiB0aGUgcmVzcG9uc2UsIGluIHVuaWNvZGUuCgogICAgICAgIElmIFJlc3BvbnNlLmVuY29kaW5nIGlzIE5vbmUsIGVuY29kaW5nIHdpbGwgYmUgZ3Vlc3NlZCB1c2luZwogICAgICAgIGBgY2hhcmRldGBgLgoKICAgICAgICBUaGUgZW5jb2Rpbmcgb2YgdGhlIHJlc3BvbnNlIGNvbnRlbnQgaXMgZGV0ZXJtaW5lZCBiYXNlZCBzb2xlbHkgb24gSFRUUAogICAgICAgIGhlYWRlcnMsIGZvbGxvd2luZyBSRkMgMjYxNiB0byB0aGUgbGV0dGVyLiBJZiB5b3UgY2FuIHRha2UgYWR2YW50YWdlIG9mCiAgICAgICAgbm9uLUhUVFAga25vd2xlZGdlIHRvIG1ha2UgYSBiZXR0ZXIgZ3Vlc3MgYXQgdGhlIGVuY29kaW5nLCB5b3Ugc2hvdWxkCiAgICAgICAgc2V0IGBgci5lbmNvZGluZ2BgIGFwcHJvcHJpYXRlbHkgYmVmb3JlIGFjY2Vzc2luZyB0aGlzIHByb3BlcnR5LgogICAgICAgICIiIgoKICAgICAgICAjIFRyeSBjaGFyc2V0IGZyb20gY29udGVudC10eXBlCiAgICAgICAgY29udGVudCA9IE5vbmUKICAgICAgICBlbmNvZGluZyA9IHNlbGYuZW5jb2RpbmcKCiAgICAgICAgaWYgbm90IHNlbGYuY29udGVudDoKICAgICAgICAgICAgcmV0dXJuIHN0cignJykKCiAgICAgICAgIyBGYWxsYmFjayB0byBhdXRvLWRldGVjdGVkIGVuY29kaW5nLgogICAgICAgIGlmIHNlbGYuZW5jb2RpbmcgaXMgTm9uZToKICAgICAgICAgICAgZW5jb2RpbmcgPSBzZWxmLmFwcGFyZW50X2VuY29kaW5nCgogICAgICAgICMgRGVjb2RlIHVuaWNvZGUgZnJvbSBnaXZlbiBlbmNvZGluZy4KICAgICAgICB0cnk6CiAgICAgICAgICAgIGNvbnRlbnQgPSBzdHIoc2VsZi5jb250ZW50LCBlbmNvZGluZywgZXJyb3JzPSdyZXBsYWNlJykKICAgICAgICBleGNlcHQgKExvb2t1cEVycm9yLCBUeXBlRXJyb3IpOgogICAgICAgICAgICAjIEEgTG9va3VwRXJyb3IgaXMgcmFpc2VkIGlmIHRoZSBlbmNvZGluZyB3YXMgbm90IGZvdW5kIHdoaWNoIGNvdWxkCiAgICAgICAgICAgICMgaW5kaWNhdGUgYSBtaXNzcGVsbGluZyBvciBzaW1pbGFyIG1pc3Rha2UuCiAgICAgICAgICAgICMKICAgICAgICAgICAgIyBBIFR5cGVFcnJvciBjYW4gYmUgcmFpc2VkIGlmIGVuY29kaW5nIGlzIE5vbmUKICAgICAgICAgICAgIwogICAgICAgICAgICAjIFNvIHdlIHRyeSBibGluZGx5IGVuY29kaW5nLgogICAgICAgICAgICBjb250ZW50ID0gc3RyKHNlbGYuY29udGVudCwgZXJyb3JzPSdyZXBsYWNlJykKCiAgICAgICAgcmV0dXJuIGNvbnRlbnQKCiAgICBkZWYganNvbihzZWxmLCAqKmt3YXJncyk6CiAgICAgICAgciIiIlJldHVybnMgdGhlIGpzb24tZW5jb2RlZCBjb250ZW50IG9mIGEgcmVzcG9uc2UsIGlmIGFueS4KCiAgICAgICAgOnBhcmFtIFwqXCprd2FyZ3M6IE9wdGlvbmFsIGFyZ3VtZW50cyB0aGF0IGBganNvbi5sb2Fkc2BgIHRha2VzLgogICAgICAgIDpyYWlzZXMgVmFsdWVFcnJvcjogSWYgdGhlIHJlc3BvbnNlIGJvZHkgZG9lcyBub3QgY29udGFpbiB2YWxpZCBqc29uLgogICAgICAgICIiIgoKICAgICAgICBpZiBub3Qgc2VsZi5lbmNvZGluZyBhbmQgc2VsZi5jb250ZW50IGFuZCBsZW4oc2VsZi5jb250ZW50KSA+IDM6CiAgICAgICAgICAgICMgTm8gZW5jb2Rpbmcgc2V0LiBKU09OIFJGQyA0NjI3IHNlY3Rpb24gMyBzdGF0ZXMgd2Ugc2hvdWxkIGV4cGVjdAogICAgICAgICAgICAjIFVURi04LCAtMTYgb3IgLTMyLiBEZXRlY3Qgd2hpY2ggb25lIHRvIHVzZTsgSWYgdGhlIGRldGVjdGlvbiBvcgogICAgICAgICAgICAjIGRlY29kaW5nIGZhaWxzLCBmYWxsIGJhY2sgdG8gYHNlbGYudGV4dGAgKHVzaW5nIGNoYXJkZXQgdG8gbWFrZQogICAgICAgICAgICAjIGEgYmVzdCBndWVzcykuCiAgICAgICAgICAgIGVuY29kaW5nID0gZ3Vlc3NfanNvbl91dGYoc2VsZi5jb250ZW50KQogICAgICAgICAgICBpZiBlbmNvZGluZyBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcGxleGpzb24ubG9hZHMoCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udGVudC5kZWNvZGUoZW5jb2RpbmcpLCAqKmt3YXJncwogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGV4Y2VwdCBVbmljb2RlRGVjb2RlRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgIyBXcm9uZyBVVEYgY29kZWMgZGV0ZWN0ZWQ7IHVzdWFsbHkgYmVjYXVzZSBpdCdzIG5vdCBVVEYtOAogICAgICAgICAgICAgICAgICAgICMgYnV0IHNvbWUgb3RoZXIgOC1iaXQgY29kZWMuICBUaGlzIGlzIGFuIFJGQyB2aW9sYXRpb24sCiAgICAgICAgICAgICAgICAgICAgIyBhbmQgdGhlIHNlcnZlciBkaWRuJ3QgYm90aGVyIHRvIHRlbGwgdXMgd2hhdCBjb2RlYyAqd2FzKgogICAgICAgICAgICAgICAgICAgICMgdXNlZC4KICAgICAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgcmV0dXJuIGNvbXBsZXhqc29uLmxvYWRzKHNlbGYudGV4dCwgKiprd2FyZ3MpCgogICAgQHByb3BlcnR5CiAgICBkZWYgbGlua3Moc2VsZik6CiAgICAgICAgIiIiUmV0dXJucyB0aGUgcGFyc2VkIGhlYWRlciBsaW5rcyBvZiB0aGUgcmVzcG9uc2UsIGlmIGFueS4iIiIKCiAgICAgICAgaGVhZGVyID0gc2VsZi5oZWFkZXJzLmdldCgnbGluaycpCgogICAgICAgICMgbCA9IE11bHRpRGljdCgpCiAgICAgICAgbCA9IHt9CgogICAgICAgIGlmIGhlYWRlcjoKICAgICAgICAgICAgbGlua3MgPSBwYXJzZV9oZWFkZXJfbGlua3MoaGVhZGVyKQoKICAgICAgICAgICAgZm9yIGxpbmsgaW4gbGlua3M6CiAgICAgICAgICAgICAgICBrZXkgPSBsaW5rLmdldCgncmVsJykgb3IgbGluay5nZXQoJ3VybCcpCiAgICAgICAgICAgICAgICBsW2tleV0gPSBsaW5rCgogICAgICAgIHJldHVybiBsCgogICAgZGVmIHJhaXNlX2Zvcl9zdGF0dXMoc2VsZik6CiAgICAgICAgIiIiUmFpc2VzIHN0b3JlZCA6Y2xhc3M6YEhUVFBFcnJvcmAsIGlmIG9uZSBvY2N1cnJlZC4iIiIKCiAgICAgICAgaHR0cF9lcnJvcl9tc2cgPSAnJwogICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5yZWFzb24sIGJ5dGVzKToKICAgICAgICAgICAgIyBXZSBhdHRlbXB0IHRvIGRlY29kZSB1dGYtOCBmaXJzdCBiZWNhdXNlIHNvbWUgc2VydmVycwogICAgICAgICAgICAjIGNob29zZSB0byBsb2NhbGl6ZSB0aGVpciByZWFzb24gc3RyaW5ncy4gSWYgdGhlIHN0cmluZwogICAgICAgICAgICAjIGlzbid0IHV0Zi04LCB3ZSBmYWxsIGJhY2sgdG8gaXNvLTg4NTktMSBmb3IgYWxsIG90aGVyCiAgICAgICAgICAgICMgZW5jb2RpbmdzLiAoU2VlIFBSICMzNTM4KQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICByZWFzb24gPSBzZWxmLnJlYXNvbi5kZWNvZGUoJ3V0Zi04JykKICAgICAgICAgICAgZXhjZXB0IFVuaWNvZGVEZWNvZGVFcnJvcjoKICAgICAgICAgICAgICAgIHJlYXNvbiA9IHNlbGYucmVhc29uLmRlY29kZSgnaXNvLTg4NTktMScpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmVhc29uID0gc2VsZi5yZWFzb24KCiAgICAgICAgaWYgNDAwIDw9IHNlbGYuc3RhdHVzX2NvZGUgPCA1MDA6CiAgICAgICAgICAgIGh0dHBfZXJyb3JfbXNnID0gdSclcyBDbGllbnQgRXJyb3I6ICVzIGZvciB1cmw6ICVzJyAlIChzZWxmLnN0YXR1c19jb2RlLCByZWFzb24sIHNlbGYudXJsKQoKICAgICAgICBlbGlmIDUwMCA8PSBzZWxmLnN0YXR1c19jb2RlIDwgNjAwOgogICAgICAgICAgICBodHRwX2Vycm9yX21zZyA9IHUnJXMgU2VydmVyIEVycm9yOiAlcyBmb3IgdXJsOiAlcycgJSAoc2VsZi5zdGF0dXNfY29kZSwgcmVhc29uLCBzZWxmLnVybCkKCiAgICAgICAgaWYgaHR0cF9lcnJvcl9tc2c6CiAgICAgICAgICAgIHJhaXNlIEhUVFBFcnJvcihodHRwX2Vycm9yX21zZywgcmVzcG9uc2U9c2VsZikKCiAgICBkZWYgY2xvc2Uoc2VsZik6CiAgICAgICAgIiIiUmVsZWFzZXMgdGhlIGNvbm5lY3Rpb24gYmFjayB0byB0aGUgcG9vbC4gT25jZSB0aGlzIG1ldGhvZCBoYXMgYmVlbgogICAgICAgIGNhbGxlZCB0aGUgdW5kZXJseWluZyBgYHJhd2BgIG9iamVjdCBtdXN0IG5vdCBiZSBhY2Nlc3NlZCBhZ2Fpbi4KCiAgICAgICAgKk5vdGU6IFNob3VsZCBub3Qgbm9ybWFsbHkgbmVlZCB0byBiZSBjYWxsZWQgZXhwbGljaXRseS4qCiAgICAgICAgIiIiCiAgICAgICAgaWYgbm90IHNlbGYuX2NvbnRlbnRfY29uc3VtZWQ6CiAgICAgICAgICAgIHNlbGYucmF3LmNsb3NlKCkKCiAgICAgICAgcmVsZWFzZV9jb25uID0gZ2V0YXR0cihzZWxmLnJhdywgJ3JlbGVhc2VfY29ubicsIE5vbmUpCiAgICAgICAgaWYgcmVsZWFzZV9jb25uIGlzIG5vdCBOb25lOgogICAgICAgICAgICByZWxlYXNlX2Nvbm4oKQpQSwMEFAAAAAAAAAAhABI83oG3AgAAtwIAAD0AAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3JlcXVlc3RzL3BhY2thZ2VzLnB5aW1wb3J0IHN5cwoKIyBUaGlzIGNvZGUgZXhpc3RzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSByZWFzb25zLgojIEkgZG9uJ3QgbGlrZSBpdCBlaXRoZXIuIEp1c3QgbG9vayB0aGUgb3RoZXIgd2F5LiA6KQoKZm9yIHBhY2thZ2UgaW4gKCd1cmxsaWIzJywgJ2lkbmEnLCAnY2hhcmRldCcpOgogICAgdmVuZG9yZWRfcGFja2FnZSA9ICJwaXAuX3ZlbmRvci4iICsgcGFja2FnZQogICAgbG9jYWxzKClbcGFja2FnZV0gPSBfX2ltcG9ydF9fKHZlbmRvcmVkX3BhY2thZ2UpCiAgICAjIFRoaXMgdHJhdmVyc2FsIGlzIGFwcGFyZW50bHkgbmVjZXNzYXJ5IHN1Y2ggdGhhdCB0aGUgaWRlbnRpdGllcyBhcmUKICAgICMgcHJlc2VydmVkIChyZXF1ZXN0cy5wYWNrYWdlcy51cmxsaWIzLiogaXMgdXJsbGliMy4qKQogICAgZm9yIG1vZCBpbiBsaXN0KHN5cy5tb2R1bGVzKToKICAgICAgICBpZiBtb2QgPT0gdmVuZG9yZWRfcGFja2FnZSBvciBtb2Quc3RhcnRzd2l0aCh2ZW5kb3JlZF9wYWNrYWdlICsgJy4nKToKICAgICAgICAgICAgdW5wcmVmaXhlZF9tb2QgPSBtb2RbbGVuKCJwaXAuX3ZlbmRvci4iKTpdCiAgICAgICAgICAgIHN5cy5tb2R1bGVzWydwaXAuX3ZlbmRvci5yZXF1ZXN0cy5wYWNrYWdlcy4nICsgdW5wcmVmaXhlZF9tb2RdID0gc3lzLm1vZHVsZXNbbW9kXQoKIyBLaW5kYSBjb29sLCB0aG91Z2gsIHJpZ2h0PwpQSwMEFAAAAAAAAAAhAF+fZpmaawAAmmsAAD0AAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3JlcXVlc3RzL3Nlc3Npb25zLnB5IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KCiIiIgpyZXF1ZXN0cy5zZXNzaW9uCn5+fn5+fn5+fn5+fn5+fn4KClRoaXMgbW9kdWxlIHByb3ZpZGVzIGEgU2Vzc2lvbiBvYmplY3QgdG8gbWFuYWdlIGFuZCBwZXJzaXN0IHNldHRpbmdzIGFjcm9zcwpyZXF1ZXN0cyAoY29va2llcywgYXV0aCwgcHJveGllcykuCiIiIgppbXBvcnQgb3MKaW1wb3J0IHBsYXRmb3JtCmltcG9ydCB0aW1lCmZyb20gY29sbGVjdGlvbnMgaW1wb3J0IE1hcHBpbmcKZnJvbSBkYXRldGltZSBpbXBvcnQgdGltZWRlbHRhCgpmcm9tIC5hdXRoIGltcG9ydCBfYmFzaWNfYXV0aF9zdHIKZnJvbSAuY29tcGF0IGltcG9ydCBjb29raWVsaWIsIGlzX3B5MywgT3JkZXJlZERpY3QsIHVybGpvaW4sIHVybHBhcnNlCmZyb20gLmNvb2tpZXMgaW1wb3J0ICgKICAgIGNvb2tpZWphcl9mcm9tX2RpY3QsIGV4dHJhY3RfY29va2llc190b19qYXIsIFJlcXVlc3RzQ29va2llSmFyLCBtZXJnZV9jb29raWVzKQpmcm9tIC5tb2RlbHMgaW1wb3J0IFJlcXVlc3QsIFByZXBhcmVkUmVxdWVzdCwgREVGQVVMVF9SRURJUkVDVF9MSU1JVApmcm9tIC5ob29rcyBpbXBvcnQgZGVmYXVsdF9ob29rcywgZGlzcGF0Y2hfaG9vawpmcm9tIC5faW50ZXJuYWxfdXRpbHMgaW1wb3J0IHRvX25hdGl2ZV9zdHJpbmcKZnJvbSAudXRpbHMgaW1wb3J0IHRvX2tleV92YWxfbGlzdCwgZGVmYXVsdF9oZWFkZXJzCmZyb20gLmV4Y2VwdGlvbnMgaW1wb3J0ICgKICAgIFRvb01hbnlSZWRpcmVjdHMsIEludmFsaWRTY2hlbWEsIENodW5rZWRFbmNvZGluZ0Vycm9yLCBDb250ZW50RGVjb2RpbmdFcnJvcikKCmZyb20gLnN0cnVjdHVyZXMgaW1wb3J0IENhc2VJbnNlbnNpdGl2ZURpY3QKZnJvbSAuYWRhcHRlcnMgaW1wb3J0IEhUVFBBZGFwdGVyCgpmcm9tIC51dGlscyBpbXBvcnQgKAogICAgcmVxdW90ZV91cmksIGdldF9lbnZpcm9uX3Byb3hpZXMsIGdldF9uZXRyY19hdXRoLCBzaG91bGRfYnlwYXNzX3Byb3hpZXMsCiAgICBnZXRfYXV0aF9mcm9tX3VybCwgcmV3aW5kX2JvZHkKKQoKZnJvbSAuc3RhdHVzX2NvZGVzIGltcG9ydCBjb2RlcwoKIyBmb3JtZXJseSBkZWZpbmVkIGhlcmUsIHJlZXhwb3NlZCBoZXJlIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CmZyb20gLm1vZGVscyBpbXBvcnQgUkVESVJFQ1RfU1RBVEkKCiMgUHJlZmVycmVkIGNsb2NrLCBiYXNlZCBvbiB3aGljaCBvbmUgaXMgbW9yZSBhY2N1cmF0ZSBvbiBhIGdpdmVuIHN5c3RlbS4KaWYgcGxhdGZvcm0uc3lzdGVtKCkgPT0gJ1dpbmRvd3MnOgogICAgdHJ5OiAgIyBQeXRob24gMy4zKwogICAgICAgIHByZWZlcnJlZF9jbG9jayA9IHRpbWUucGVyZl9jb3VudGVyCiAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6ICAjIEVhcmxpZXIgdGhhbiBQeXRob24gMy4KICAgICAgICBwcmVmZXJyZWRfY2xvY2sgPSB0aW1lLmNsb2NrCmVsc2U6CiAgICBwcmVmZXJyZWRfY2xvY2sgPSB0aW1lLnRpbWUKCgpkZWYgbWVyZ2Vfc2V0dGluZyhyZXF1ZXN0X3NldHRpbmcsIHNlc3Npb25fc2V0dGluZywgZGljdF9jbGFzcz1PcmRlcmVkRGljdCk6CiAgICAiIiJEZXRlcm1pbmVzIGFwcHJvcHJpYXRlIHNldHRpbmcgZm9yIGEgZ2l2ZW4gcmVxdWVzdCwgdGFraW5nIGludG8gYWNjb3VudAogICAgdGhlIGV4cGxpY2l0IHNldHRpbmcgb24gdGhhdCByZXF1ZXN0LCBhbmQgdGhlIHNldHRpbmcgaW4gdGhlIHNlc3Npb24uIElmIGEKICAgIHNldHRpbmcgaXMgYSBkaWN0aW9uYXJ5LCB0aGV5IHdpbGwgYmUgbWVyZ2VkIHRvZ2V0aGVyIHVzaW5nIGBkaWN0X2NsYXNzYAogICAgIiIiCgogICAgaWYgc2Vzc2lvbl9zZXR0aW5nIGlzIE5vbmU6CiAgICAgICAgcmV0dXJuIHJlcXVlc3Rfc2V0dGluZwoKICAgIGlmIHJlcXVlc3Rfc2V0dGluZyBpcyBOb25lOgogICAgICAgIHJldHVybiBzZXNzaW9uX3NldHRpbmcKCiAgICAjIEJ5cGFzcyBpZiBub3QgYSBkaWN0aW9uYXJ5IChlLmcuIHZlcmlmeSkKICAgIGlmIG5vdCAoCiAgICAgICAgICAgIGlzaW5zdGFuY2Uoc2Vzc2lvbl9zZXR0aW5nLCBNYXBwaW5nKSBhbmQKICAgICAgICAgICAgaXNpbnN0YW5jZShyZXF1ZXN0X3NldHRpbmcsIE1hcHBpbmcpCiAgICApOgogICAgICAgIHJldHVybiByZXF1ZXN0X3NldHRpbmcKCiAgICBtZXJnZWRfc2V0dGluZyA9IGRpY3RfY2xhc3ModG9fa2V5X3ZhbF9saXN0KHNlc3Npb25fc2V0dGluZykpCiAgICBtZXJnZWRfc2V0dGluZy51cGRhdGUodG9fa2V5X3ZhbF9saXN0KHJlcXVlc3Rfc2V0dGluZykpCgogICAgIyBSZW1vdmUga2V5cyB0aGF0IGFyZSBzZXQgdG8gTm9uZS4gRXh0cmFjdCBrZXlzIGZpcnN0IHRvIGF2b2lkIGFsdGVyaW5nCiAgICAjIHRoZSBkaWN0aW9uYXJ5IGR1cmluZyBpdGVyYXRpb24uCiAgICBub25lX2tleXMgPSBbayBmb3IgKGssIHYpIGluIG1lcmdlZF9zZXR0aW5nLml0ZW1zKCkgaWYgdiBpcyBOb25lXQogICAgZm9yIGtleSBpbiBub25lX2tleXM6CiAgICAgICAgZGVsIG1lcmdlZF9zZXR0aW5nW2tleV0KCiAgICByZXR1cm4gbWVyZ2VkX3NldHRpbmcKCgpkZWYgbWVyZ2VfaG9va3MocmVxdWVzdF9ob29rcywgc2Vzc2lvbl9ob29rcywgZGljdF9jbGFzcz1PcmRlcmVkRGljdCk6CiAgICAiIiJQcm9wZXJseSBtZXJnZXMgYm90aCByZXF1ZXN0cyBhbmQgc2Vzc2lvbiBob29rcy4KCiAgICBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHdoZW4gcmVxdWVzdF9ob29rcyA9PSB7J3Jlc3BvbnNlJzogW119LCB0aGUKICAgIG1lcmdlIGJyZWFrcyBTZXNzaW9uIGhvb2tzIGVudGlyZWx5LgogICAgIiIiCiAgICBpZiBzZXNzaW9uX2hvb2tzIGlzIE5vbmUgb3Igc2Vzc2lvbl9ob29rcy5nZXQoJ3Jlc3BvbnNlJykgPT0gW106CiAgICAgICAgcmV0dXJuIHJlcXVlc3RfaG9va3MKCiAgICBpZiByZXF1ZXN0X2hvb2tzIGlzIE5vbmUgb3IgcmVxdWVzdF9ob29rcy5nZXQoJ3Jlc3BvbnNlJykgPT0gW106CiAgICAgICAgcmV0dXJuIHNlc3Npb25faG9va3MKCiAgICByZXR1cm4gbWVyZ2Vfc2V0dGluZyhyZXF1ZXN0X2hvb2tzLCBzZXNzaW9uX2hvb2tzLCBkaWN0X2NsYXNzKQoKCmNsYXNzIFNlc3Npb25SZWRpcmVjdE1peGluKG9iamVjdCk6CgogICAgZGVmIGdldF9yZWRpcmVjdF90YXJnZXQoc2VsZiwgcmVzcCk6CiAgICAgICAgIiIiUmVjZWl2ZXMgYSBSZXNwb25zZS4gUmV0dXJucyBhIHJlZGlyZWN0IFVSSSBvciBgYE5vbmVgYCIiIgogICAgICAgICMgRHVlIHRvIHRoZSBuYXR1cmUgb2YgaG93IHJlcXVlc3RzIHByb2Nlc3NlcyByZWRpcmVjdHMgdGhpcyBtZXRob2Qgd2lsbAogICAgICAgICMgYmUgY2FsbGVkIGF0IGxlYXN0IG9uY2UgdXBvbiB0aGUgb3JpZ2luYWwgcmVzcG9uc2UgYW5kIGF0IGxlYXN0IHR3aWNlCiAgICAgICAgIyBvbiBlYWNoIHN1YnNlcXVlbnQgcmVkaXJlY3QgcmVzcG9uc2UgKGlmIGFueSkuCiAgICAgICAgIyBJZiBhIGN1c3RvbSBtaXhpbiBpcyB1c2VkIHRvIGhhbmRsZSB0aGlzIGxvZ2ljLCBpdCBtYXkgYmUgYWR2YW50YWdlb3VzCiAgICAgICAgIyB0byBjYWNoZSB0aGUgcmVkaXJlY3QgbG9jYXRpb24gb250byB0aGUgcmVzcG9uc2Ugb2JqZWN0IGFzIGEgcHJpdmF0ZQogICAgICAgICMgYXR0cmlidXRlLgogICAgICAgIGlmIHJlc3AuaXNfcmVkaXJlY3Q6CiAgICAgICAgICAgIGxvY2F0aW9uID0gcmVzcC5oZWFkZXJzWydsb2NhdGlvbiddCiAgICAgICAgICAgICMgQ3VycmVudGx5IHRoZSB1bmRlcmx5aW5nIGh0dHAgbW9kdWxlIG9uIHB5MyBkZWNvZGUgaGVhZGVycwogICAgICAgICAgICAjIGluIGxhdGluMSwgYnV0IGVtcGlyaWNhbCBldmlkZW5jZSBzdWdnZXN0cyB0aGF0IGxhdGluMSBpcyB2ZXJ5CiAgICAgICAgICAgICMgcmFyZWx5IHVzZWQgd2l0aCBub24tQVNDSUkgY2hhcmFjdGVycyBpbiBIVFRQIGhlYWRlcnMuCiAgICAgICAgICAgICMgSXQgaXMgbW9yZSBsaWtlbHkgdG8gZ2V0IFVURjggaGVhZGVyIHJhdGhlciB0aGFuIGxhdGluMS4KICAgICAgICAgICAgIyBUaGlzIGNhdXNlcyBpbmNvcnJlY3QgaGFuZGxpbmcgb2YgVVRGOCBlbmNvZGVkIGxvY2F0aW9uIGhlYWRlcnMuCiAgICAgICAgICAgICMgVG8gc29sdmUgdGhpcywgd2UgcmUtZW5jb2RlIHRoZSBsb2NhdGlvbiBpbiBsYXRpbjEuCiAgICAgICAgICAgIGlmIGlzX3B5MzoKICAgICAgICAgICAgICAgIGxvY2F0aW9uID0gbG9jYXRpb24uZW5jb2RlKCdsYXRpbjEnKQogICAgICAgICAgICByZXR1cm4gdG9fbmF0aXZlX3N0cmluZyhsb2NhdGlvbiwgJ3V0ZjgnKQogICAgICAgIHJldHVybiBOb25lCgogICAgZGVmIHJlc29sdmVfcmVkaXJlY3RzKHNlbGYsIHJlc3AsIHJlcSwgc3RyZWFtPUZhbHNlLCB0aW1lb3V0PU5vbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyaWZ5PVRydWUsIGNlcnQ9Tm9uZSwgcHJveGllcz1Ob25lLCB5aWVsZF9yZXF1ZXN0cz1GYWxzZSwgKiphZGFwdGVyX2t3YXJncyk6CiAgICAgICAgIiIiUmVjZWl2ZXMgYSBSZXNwb25zZS4gUmV0dXJucyBhIGdlbmVyYXRvciBvZiBSZXNwb25zZXMgb3IgUmVxdWVzdHMuIiIiCgogICAgICAgIGhpc3QgPSBbXSAgIyBrZWVwIHRyYWNrIG9mIGhpc3RvcnkKCiAgICAgICAgdXJsID0gc2VsZi5nZXRfcmVkaXJlY3RfdGFyZ2V0KHJlc3ApCiAgICAgICAgd2hpbGUgdXJsOgogICAgICAgICAgICBwcmVwYXJlZF9yZXF1ZXN0ID0gcmVxLmNvcHkoKQoKICAgICAgICAgICAgIyBVcGRhdGUgaGlzdG9yeSBhbmQga2VlcCB0cmFjayBvZiByZWRpcmVjdHMuCiAgICAgICAgICAgICMgcmVzcC5oaXN0b3J5IG11c3QgaWdub3JlIHRoZSBvcmlnaW5hbCByZXF1ZXN0IGluIHRoaXMgbG9vcAogICAgICAgICAgICBoaXN0LmFwcGVuZChyZXNwKQogICAgICAgICAgICByZXNwLmhpc3RvcnkgPSBoaXN0WzE6XQoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcmVzcC5jb250ZW50ICAjIENvbnN1bWUgc29ja2V0IHNvIGl0IGNhbiBiZSByZWxlYXNlZAogICAgICAgICAgICBleGNlcHQgKENodW5rZWRFbmNvZGluZ0Vycm9yLCBDb250ZW50RGVjb2RpbmdFcnJvciwgUnVudGltZUVycm9yKToKICAgICAgICAgICAgICAgIHJlc3AucmF3LnJlYWQoZGVjb2RlX2NvbnRlbnQ9RmFsc2UpCgogICAgICAgICAgICBpZiBsZW4ocmVzcC5oaXN0b3J5KSA+PSBzZWxmLm1heF9yZWRpcmVjdHM6CiAgICAgICAgICAgICAgICByYWlzZSBUb29NYW55UmVkaXJlY3RzKCdFeGNlZWRlZCAlcyByZWRpcmVjdHMuJyAlIHNlbGYubWF4X3JlZGlyZWN0cywgcmVzcG9uc2U9cmVzcCkKCiAgICAgICAgICAgICMgUmVsZWFzZSB0aGUgY29ubmVjdGlvbiBiYWNrIGludG8gdGhlIHBvb2wuCiAgICAgICAgICAgIHJlc3AuY2xvc2UoKQoKICAgICAgICAgICAgIyBIYW5kbGUgcmVkaXJlY3Rpb24gd2l0aG91dCBzY2hlbWUgKHNlZTogUkZDIDE4MDggU2VjdGlvbiA0KQogICAgICAgICAgICBpZiB1cmwuc3RhcnRzd2l0aCgnLy8nKToKICAgICAgICAgICAgICAgIHBhcnNlZF9ydXJsID0gdXJscGFyc2UocmVzcC51cmwpCiAgICAgICAgICAgICAgICB1cmwgPSAnJXM6JXMnICUgKHRvX25hdGl2ZV9zdHJpbmcocGFyc2VkX3J1cmwuc2NoZW1lKSwgdXJsKQoKICAgICAgICAgICAgIyBUaGUgc2NoZW1lIHNob3VsZCBiZSBsb3dlciBjYXNlLi4uCiAgICAgICAgICAgIHBhcnNlZCA9IHVybHBhcnNlKHVybCkKICAgICAgICAgICAgdXJsID0gcGFyc2VkLmdldHVybCgpCgogICAgICAgICAgICAjIEZhY2lsaXRhdGUgcmVsYXRpdmUgJ2xvY2F0aW9uJyBoZWFkZXJzLCBhcyBhbGxvd2VkIGJ5IFJGQyA3MjMxLgogICAgICAgICAgICAjIChlLmcuICcvcGF0aC90by9yZXNvdXJjZScgaW5zdGVhZCBvZiAnaHR0cDovL2RvbWFpbi50bGQvcGF0aC90by9yZXNvdXJjZScpCiAgICAgICAgICAgICMgQ29tcGxpYW50IHdpdGggUkZDMzk4Niwgd2UgcGVyY2VudCBlbmNvZGUgdGhlIHVybC4KICAgICAgICAgICAgaWYgbm90IHBhcnNlZC5uZXRsb2M6CiAgICAgICAgICAgICAgICB1cmwgPSB1cmxqb2luKHJlc3AudXJsLCByZXF1b3RlX3VyaSh1cmwpKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgdXJsID0gcmVxdW90ZV91cmkodXJsKQoKICAgICAgICAgICAgcHJlcGFyZWRfcmVxdWVzdC51cmwgPSB0b19uYXRpdmVfc3RyaW5nKHVybCkKCiAgICAgICAgICAgIHNlbGYucmVidWlsZF9tZXRob2QocHJlcGFyZWRfcmVxdWVzdCwgcmVzcCkKCiAgICAgICAgICAgICMgaHR0cHM6Ly9naXRodWIuY29tL3JlcXVlc3RzL3JlcXVlc3RzL2lzc3Vlcy8xMDg0CiAgICAgICAgICAgIGlmIHJlc3Auc3RhdHVzX2NvZGUgbm90IGluIChjb2Rlcy50ZW1wb3JhcnlfcmVkaXJlY3QsIGNvZGVzLnBlcm1hbmVudF9yZWRpcmVjdCk6CiAgICAgICAgICAgICAgICAjIGh0dHBzOi8vZ2l0aHViLmNvbS9yZXF1ZXN0cy9yZXF1ZXN0cy9pc3N1ZXMvMzQ5MAogICAgICAgICAgICAgICAgcHVyZ2VkX2hlYWRlcnMgPSAoJ0NvbnRlbnQtTGVuZ3RoJywgJ0NvbnRlbnQtVHlwZScsICdUcmFuc2Zlci1FbmNvZGluZycpCiAgICAgICAgICAgICAgICBmb3IgaGVhZGVyIGluIHB1cmdlZF9oZWFkZXJzOgogICAgICAgICAgICAgICAgICAgIHByZXBhcmVkX3JlcXVlc3QuaGVhZGVycy5wb3AoaGVhZGVyLCBOb25lKQogICAgICAgICAgICAgICAgcHJlcGFyZWRfcmVxdWVzdC5ib2R5ID0gTm9uZQoKICAgICAgICAgICAgaGVhZGVycyA9IHByZXBhcmVkX3JlcXVlc3QuaGVhZGVycwogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBkZWwgaGVhZGVyc1snQ29va2llJ10KICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICAgICAgcGFzcwoKICAgICAgICAgICAgIyBFeHRyYWN0IGFueSBjb29raWVzIHNlbnQgb24gdGhlIHJlc3BvbnNlIHRvIHRoZSBjb29raWVqYXIKICAgICAgICAgICAgIyBpbiB0aGUgbmV3IHJlcXVlc3QuIEJlY2F1c2Ugd2UndmUgbXV0YXRlZCBvdXIgY29waWVkIHByZXBhcmVkCiAgICAgICAgICAgICMgcmVxdWVzdCwgdXNlIHRoZSBvbGQgb25lIHRoYXQgd2UgaGF2ZW4ndCB5ZXQgdG91Y2hlZC4KICAgICAgICAgICAgZXh0cmFjdF9jb29raWVzX3RvX2phcihwcmVwYXJlZF9yZXF1ZXN0Ll9jb29raWVzLCByZXEsIHJlc3AucmF3KQogICAgICAgICAgICBtZXJnZV9jb29raWVzKHByZXBhcmVkX3JlcXVlc3QuX2Nvb2tpZXMsIHNlbGYuY29va2llcykKICAgICAgICAgICAgcHJlcGFyZWRfcmVxdWVzdC5wcmVwYXJlX2Nvb2tpZXMocHJlcGFyZWRfcmVxdWVzdC5fY29va2llcykKCiAgICAgICAgICAgICMgUmVidWlsZCBhdXRoIGFuZCBwcm94eSBpbmZvcm1hdGlvbi4KICAgICAgICAgICAgcHJveGllcyA9IHNlbGYucmVidWlsZF9wcm94aWVzKHByZXBhcmVkX3JlcXVlc3QsIHByb3hpZXMpCiAgICAgICAgICAgIHNlbGYucmVidWlsZF9hdXRoKHByZXBhcmVkX3JlcXVlc3QsIHJlc3ApCgogICAgICAgICAgICAjIEEgZmFpbGVkIHRlbGwoKSBzZXRzIGBfYm9keV9wb3NpdGlvbmAgdG8gYG9iamVjdCgpYC4gVGhpcyBub24tTm9uZQogICAgICAgICAgICAjIHZhbHVlIGVuc3VyZXMgYHJld2luZGFibGVgIHdpbGwgYmUgVHJ1ZSwgYWxsb3dpbmcgdXMgdG8gcmFpc2UgYW4KICAgICAgICAgICAgIyBVbnJld2luZGFibGVCb2R5RXJyb3IsIGluc3RlYWQgb2YgaGFuZ2luZyB0aGUgY29ubmVjdGlvbi4KICAgICAgICAgICAgcmV3aW5kYWJsZSA9ICgKICAgICAgICAgICAgICAgIHByZXBhcmVkX3JlcXVlc3QuX2JvZHlfcG9zaXRpb24gaXMgbm90IE5vbmUgYW5kCiAgICAgICAgICAgICAgICAoJ0NvbnRlbnQtTGVuZ3RoJyBpbiBoZWFkZXJzIG9yICdUcmFuc2Zlci1FbmNvZGluZycgaW4gaGVhZGVycykKICAgICAgICAgICAgKQoKICAgICAgICAgICAgIyBBdHRlbXB0IHRvIHJld2luZCBjb25zdW1lZCBmaWxlLWxpa2Ugb2JqZWN0LgogICAgICAgICAgICBpZiByZXdpbmRhYmxlOgogICAgICAgICAgICAgICAgcmV3aW5kX2JvZHkocHJlcGFyZWRfcmVxdWVzdCkKCiAgICAgICAgICAgICMgT3ZlcnJpZGUgdGhlIG9yaWdpbmFsIHJlcXVlc3QuCiAgICAgICAgICAgIHJlcSA9IHByZXBhcmVkX3JlcXVlc3QKCiAgICAgICAgICAgIGlmIHlpZWxkX3JlcXVlc3RzOgogICAgICAgICAgICAgICAgeWllbGQgcmVxCiAgICAgICAgICAgIGVsc2U6CgogICAgICAgICAgICAgICAgcmVzcCA9IHNlbGYuc2VuZCgKICAgICAgICAgICAgICAgICAgICByZXEsCiAgICAgICAgICAgICAgICAgICAgc3RyZWFtPXN0cmVhbSwKICAgICAgICAgICAgICAgICAgICB0aW1lb3V0PXRpbWVvdXQsCiAgICAgICAgICAgICAgICAgICAgdmVyaWZ5PXZlcmlmeSwKICAgICAgICAgICAgICAgICAgICBjZXJ0PWNlcnQsCiAgICAgICAgICAgICAgICAgICAgcHJveGllcz1wcm94aWVzLAogICAgICAgICAgICAgICAgICAgIGFsbG93X3JlZGlyZWN0cz1GYWxzZSwKICAgICAgICAgICAgICAgICAgICAqKmFkYXB0ZXJfa3dhcmdzCiAgICAgICAgICAgICAgICApCgogICAgICAgICAgICAgICAgZXh0cmFjdF9jb29raWVzX3RvX2phcihzZWxmLmNvb2tpZXMsIHByZXBhcmVkX3JlcXVlc3QsIHJlc3AucmF3KQoKICAgICAgICAgICAgICAgICMgZXh0cmFjdCByZWRpcmVjdCB1cmwsIGlmIGFueSwgZm9yIHRoZSBuZXh0IGxvb3AKICAgICAgICAgICAgICAgIHVybCA9IHNlbGYuZ2V0X3JlZGlyZWN0X3RhcmdldChyZXNwKQogICAgICAgICAgICAgICAgeWllbGQgcmVzcAoKICAgIGRlZiByZWJ1aWxkX2F1dGgoc2VsZiwgcHJlcGFyZWRfcmVxdWVzdCwgcmVzcG9uc2UpOgogICAgICAgICIiIldoZW4gYmVpbmcgcmVkaXJlY3RlZCB3ZSBtYXkgd2FudCB0byBzdHJpcCBhdXRoZW50aWNhdGlvbiBmcm9tIHRoZQogICAgICAgIHJlcXVlc3QgdG8gYXZvaWQgbGVha2luZyBjcmVkZW50aWFscy4gVGhpcyBtZXRob2QgaW50ZWxsaWdlbnRseSByZW1vdmVzCiAgICAgICAgYW5kIHJlYXBwbGllcyBhdXRoZW50aWNhdGlvbiB3aGVyZSBwb3NzaWJsZSB0byBhdm9pZCBjcmVkZW50aWFsIGxvc3MuCiAgICAgICAgIiIiCiAgICAgICAgaGVhZGVycyA9IHByZXBhcmVkX3JlcXVlc3QuaGVhZGVycwogICAgICAgIHVybCA9IHByZXBhcmVkX3JlcXVlc3QudXJsCgogICAgICAgIGlmICdBdXRob3JpemF0aW9uJyBpbiBoZWFkZXJzOgogICAgICAgICAgICAjIElmIHdlIGdldCByZWRpcmVjdGVkIHRvIGEgbmV3IGhvc3QsIHdlIHNob3VsZCBzdHJpcCBvdXQgYW55CiAgICAgICAgICAgICMgYXV0aGVudGljYXRpb24gaGVhZGVycy4KICAgICAgICAgICAgb3JpZ2luYWxfcGFyc2VkID0gdXJscGFyc2UocmVzcG9uc2UucmVxdWVzdC51cmwpCiAgICAgICAgICAgIHJlZGlyZWN0X3BhcnNlZCA9IHVybHBhcnNlKHVybCkKCiAgICAgICAgICAgIGlmIChvcmlnaW5hbF9wYXJzZWQuaG9zdG5hbWUgIT0gcmVkaXJlY3RfcGFyc2VkLmhvc3RuYW1lKToKICAgICAgICAgICAgICAgIGRlbCBoZWFkZXJzWydBdXRob3JpemF0aW9uJ10KCiAgICAgICAgIyAubmV0cmMgbWlnaHQgaGF2ZSBtb3JlIGF1dGggZm9yIHVzIG9uIG91ciBuZXcgaG9zdC4KICAgICAgICBuZXdfYXV0aCA9IGdldF9uZXRyY19hdXRoKHVybCkgaWYgc2VsZi50cnVzdF9lbnYgZWxzZSBOb25lCiAgICAgICAgaWYgbmV3X2F1dGggaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHByZXBhcmVkX3JlcXVlc3QucHJlcGFyZV9hdXRoKG5ld19hdXRoKQoKICAgICAgICByZXR1cm4KCiAgICBkZWYgcmVidWlsZF9wcm94aWVzKHNlbGYsIHByZXBhcmVkX3JlcXVlc3QsIHByb3hpZXMpOgogICAgICAgICIiIlRoaXMgbWV0aG9kIHJlLWV2YWx1YXRlcyB0aGUgcHJveHkgY29uZmlndXJhdGlvbiBieSBjb25zaWRlcmluZyB0aGUKICAgICAgICBlbnZpcm9ubWVudCB2YXJpYWJsZXMuIElmIHdlIGFyZSByZWRpcmVjdGVkIHRvIGEgVVJMIGNvdmVyZWQgYnkKICAgICAgICBOT19QUk9YWSwgd2Ugc3RyaXAgdGhlIHByb3h5IGNvbmZpZ3VyYXRpb24uIE90aGVyd2lzZSwgd2Ugc2V0IG1pc3NpbmcKICAgICAgICBwcm94eSBrZXlzIGZvciB0aGlzIFVSTCAoaW4gY2FzZSB0aGV5IHdlcmUgc3RyaXBwZWQgYnkgYSBwcmV2aW91cwogICAgICAgIHJlZGlyZWN0KS4KCiAgICAgICAgVGhpcyBtZXRob2QgYWxzbyByZXBsYWNlcyB0aGUgUHJveHktQXV0aG9yaXphdGlvbiBoZWFkZXIgd2hlcmUKICAgICAgICBuZWNlc3NhcnkuCgogICAgICAgIDpydHlwZTogZGljdAogICAgICAgICIiIgogICAgICAgIHByb3hpZXMgPSBwcm94aWVzIGlmIHByb3hpZXMgaXMgbm90IE5vbmUgZWxzZSB7fQogICAgICAgIGhlYWRlcnMgPSBwcmVwYXJlZF9yZXF1ZXN0LmhlYWRlcnMKICAgICAgICB1cmwgPSBwcmVwYXJlZF9yZXF1ZXN0LnVybAogICAgICAgIHNjaGVtZSA9IHVybHBhcnNlKHVybCkuc2NoZW1lCiAgICAgICAgbmV3X3Byb3hpZXMgPSBwcm94aWVzLmNvcHkoKQogICAgICAgIG5vX3Byb3h5ID0gcHJveGllcy5nZXQoJ25vX3Byb3h5JykKCiAgICAgICAgYnlwYXNzX3Byb3h5ID0gc2hvdWxkX2J5cGFzc19wcm94aWVzKHVybCwgbm9fcHJveHk9bm9fcHJveHkpCiAgICAgICAgaWYgc2VsZi50cnVzdF9lbnYgYW5kIG5vdCBieXBhc3NfcHJveHk6CiAgICAgICAgICAgIGVudmlyb25fcHJveGllcyA9IGdldF9lbnZpcm9uX3Byb3hpZXModXJsLCBub19wcm94eT1ub19wcm94eSkKCiAgICAgICAgICAgIHByb3h5ID0gZW52aXJvbl9wcm94aWVzLmdldChzY2hlbWUsIGVudmlyb25fcHJveGllcy5nZXQoJ2FsbCcpKQoKICAgICAgICAgICAgaWYgcHJveHk6CiAgICAgICAgICAgICAgICBuZXdfcHJveGllcy5zZXRkZWZhdWx0KHNjaGVtZSwgcHJveHkpCgogICAgICAgIGlmICdQcm94eS1BdXRob3JpemF0aW9uJyBpbiBoZWFkZXJzOgogICAgICAgICAgICBkZWwgaGVhZGVyc1snUHJveHktQXV0aG9yaXphdGlvbiddCgogICAgICAgIHRyeToKICAgICAgICAgICAgdXNlcm5hbWUsIHBhc3N3b3JkID0gZ2V0X2F1dGhfZnJvbV91cmwobmV3X3Byb3hpZXNbc2NoZW1lXSkKICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgIHVzZXJuYW1lLCBwYXNzd29yZCA9IE5vbmUsIE5vbmUKCiAgICAgICAgaWYgdXNlcm5hbWUgYW5kIHBhc3N3b3JkOgogICAgICAgICAgICBoZWFkZXJzWydQcm94eS1BdXRob3JpemF0aW9uJ10gPSBfYmFzaWNfYXV0aF9zdHIodXNlcm5hbWUsIHBhc3N3b3JkKQoKICAgICAgICByZXR1cm4gbmV3X3Byb3hpZXMKCiAgICBkZWYgcmVidWlsZF9tZXRob2Qoc2VsZiwgcHJlcGFyZWRfcmVxdWVzdCwgcmVzcG9uc2UpOgogICAgICAgICIiIldoZW4gYmVpbmcgcmVkaXJlY3RlZCB3ZSBtYXkgd2FudCB0byBjaGFuZ2UgdGhlIG1ldGhvZCBvZiB0aGUgcmVxdWVzdAogICAgICAgIGJhc2VkIG9uIGNlcnRhaW4gc3BlY3Mgb3IgYnJvd3NlciBiZWhhdmlvci4KICAgICAgICAiIiIKICAgICAgICBtZXRob2QgPSBwcmVwYXJlZF9yZXF1ZXN0Lm1ldGhvZAoKICAgICAgICAjIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzEjc2VjdGlvbi02LjQuNAogICAgICAgIGlmIHJlc3BvbnNlLnN0YXR1c19jb2RlID09IGNvZGVzLnNlZV9vdGhlciBhbmQgbWV0aG9kICE9ICdIRUFEJzoKICAgICAgICAgICAgbWV0aG9kID0gJ0dFVCcKCiAgICAgICAgIyBEbyB3aGF0IHRoZSBicm93c2VycyBkbywgZGVzcGl0ZSBzdGFuZGFyZHMuLi4KICAgICAgICAjIEZpcnN0LCB0dXJuIDMwMnMgaW50byBHRVRzLgogICAgICAgIGlmIHJlc3BvbnNlLnN0YXR1c19jb2RlID09IGNvZGVzLmZvdW5kIGFuZCBtZXRob2QgIT0gJ0hFQUQnOgogICAgICAgICAgICBtZXRob2QgPSAnR0VUJwoKICAgICAgICAjIFNlY29uZCwgaWYgYSBQT1NUIGlzIHJlc3BvbmRlZCB0byB3aXRoIGEgMzAxLCB0dXJuIGl0IGludG8gYSBHRVQuCiAgICAgICAgIyBUaGlzIGJpemFycmUgYmVoYXZpb3VyIGlzIGV4cGxhaW5lZCBpbiBJc3N1ZSAxNzA0LgogICAgICAgIGlmIHJlc3BvbnNlLnN0YXR1c19jb2RlID09IGNvZGVzLm1vdmVkIGFuZCBtZXRob2QgPT0gJ1BPU1QnOgogICAgICAgICAgICBtZXRob2QgPSAnR0VUJwoKICAgICAgICBwcmVwYXJlZF9yZXF1ZXN0Lm1ldGhvZCA9IG1ldGhvZAoKCmNsYXNzIFNlc3Npb24oU2Vzc2lvblJlZGlyZWN0TWl4aW4pOgogICAgIiIiQSBSZXF1ZXN0cyBzZXNzaW9uLgoKICAgIFByb3ZpZGVzIGNvb2tpZSBwZXJzaXN0ZW5jZSwgY29ubmVjdGlvbi1wb29saW5nLCBhbmQgY29uZmlndXJhdGlvbi4KCiAgICBCYXNpYyBVc2FnZTo6CgogICAgICA+Pj4gaW1wb3J0IHJlcXVlc3RzCiAgICAgID4+PiBzID0gcmVxdWVzdHMuU2Vzc2lvbigpCiAgICAgID4+PiBzLmdldCgnaHR0cDovL2h0dHBiaW4ub3JnL2dldCcpCiAgICAgIDxSZXNwb25zZSBbMjAwXT4KCiAgICBPciBhcyBhIGNvbnRleHQgbWFuYWdlcjo6CgogICAgICA+Pj4gd2l0aCByZXF1ZXN0cy5TZXNzaW9uKCkgYXMgczoKICAgICAgPj4+ICAgICBzLmdldCgnaHR0cDovL2h0dHBiaW4ub3JnL2dldCcpCiAgICAgIDxSZXNwb25zZSBbMjAwXT4KICAgICIiIgoKICAgIF9fYXR0cnNfXyA9IFsKICAgICAgICAnaGVhZGVycycsICdjb29raWVzJywgJ2F1dGgnLCAncHJveGllcycsICdob29rcycsICdwYXJhbXMnLCAndmVyaWZ5JywKICAgICAgICAnY2VydCcsICdwcmVmZXRjaCcsICdhZGFwdGVycycsICdzdHJlYW0nLCAndHJ1c3RfZW52JywKICAgICAgICAnbWF4X3JlZGlyZWN0cycsCiAgICBdCgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgoKICAgICAgICAjOiBBIGNhc2UtaW5zZW5zaXRpdmUgZGljdGlvbmFyeSBvZiBoZWFkZXJzIHRvIGJlIHNlbnQgb24gZWFjaAogICAgICAgICM6IDpjbGFzczpgUmVxdWVzdCA8UmVxdWVzdD5gIHNlbnQgZnJvbSB0aGlzCiAgICAgICAgIzogOmNsYXNzOmBTZXNzaW9uIDxTZXNzaW9uPmAuCiAgICAgICAgc2VsZi5oZWFkZXJzID0gZGVmYXVsdF9oZWFkZXJzKCkKCiAgICAgICAgIzogRGVmYXVsdCBBdXRoZW50aWNhdGlvbiB0dXBsZSBvciBvYmplY3QgdG8gYXR0YWNoIHRvCiAgICAgICAgIzogOmNsYXNzOmBSZXF1ZXN0IDxSZXF1ZXN0PmAuCiAgICAgICAgc2VsZi5hdXRoID0gTm9uZQoKICAgICAgICAjOiBEaWN0aW9uYXJ5IG1hcHBpbmcgcHJvdG9jb2wgb3IgcHJvdG9jb2wgYW5kIGhvc3QgdG8gdGhlIFVSTCBvZiB0aGUgcHJveHkKICAgICAgICAjOiAoZS5nLiB7J2h0dHAnOiAnZm9vLmJhcjozMTI4JywgJ2h0dHA6Ly9ob3N0Lm5hbWUnOiAnZm9vLmJhcjo0MDEyJ30pIHRvCiAgICAgICAgIzogYmUgdXNlZCBvbiBlYWNoIDpjbGFzczpgUmVxdWVzdCA8UmVxdWVzdD5gLgogICAgICAgIHNlbGYucHJveGllcyA9IHt9CgogICAgICAgICM6IEV2ZW50LWhhbmRsaW5nIGhvb2tzLgogICAgICAgIHNlbGYuaG9va3MgPSBkZWZhdWx0X2hvb2tzKCkKCiAgICAgICAgIzogRGljdGlvbmFyeSBvZiBxdWVyeXN0cmluZyBkYXRhIHRvIGF0dGFjaCB0byBlYWNoCiAgICAgICAgIzogOmNsYXNzOmBSZXF1ZXN0IDxSZXF1ZXN0PmAuIFRoZSBkaWN0aW9uYXJ5IHZhbHVlcyBtYXkgYmUgbGlzdHMgZm9yCiAgICAgICAgIzogcmVwcmVzZW50aW5nIG11bHRpdmFsdWVkIHF1ZXJ5IHBhcmFtZXRlcnMuCiAgICAgICAgc2VsZi5wYXJhbXMgPSB7fQoKICAgICAgICAjOiBTdHJlYW0gcmVzcG9uc2UgY29udGVudCBkZWZhdWx0LgogICAgICAgIHNlbGYuc3RyZWFtID0gRmFsc2UKCiAgICAgICAgIzogU1NMIFZlcmlmaWNhdGlvbiBkZWZhdWx0LgogICAgICAgIHNlbGYudmVyaWZ5ID0gVHJ1ZQoKICAgICAgICAjOiBTU0wgY2xpZW50IGNlcnRpZmljYXRlIGRlZmF1bHQsIGlmIFN0cmluZywgcGF0aCB0byBzc2wgY2xpZW50CiAgICAgICAgIzogY2VydCBmaWxlICgucGVtKS4gSWYgVHVwbGUsICgnY2VydCcsICdrZXknKSBwYWlyLgogICAgICAgIHNlbGYuY2VydCA9IE5vbmUKCiAgICAgICAgIzogTWF4aW11bSBudW1iZXIgb2YgcmVkaXJlY3RzIGFsbG93ZWQuIElmIHRoZSByZXF1ZXN0IGV4Y2VlZHMgdGhpcwogICAgICAgICM6IGxpbWl0LCBhIDpjbGFzczpgVG9vTWFueVJlZGlyZWN0c2AgZXhjZXB0aW9uIGlzIHJhaXNlZC4KICAgICAgICAjOiBUaGlzIGRlZmF1bHRzIHRvIHJlcXVlc3RzLm1vZGVscy5ERUZBVUxUX1JFRElSRUNUX0xJTUlULCB3aGljaCBpcwogICAgICAgICM6IDMwLgogICAgICAgIHNlbGYubWF4X3JlZGlyZWN0cyA9IERFRkFVTFRfUkVESVJFQ1RfTElNSVQKCiAgICAgICAgIzogVHJ1c3QgZW52aXJvbm1lbnQgc2V0dGluZ3MgZm9yIHByb3h5IGNvbmZpZ3VyYXRpb24sIGRlZmF1bHQKICAgICAgICAjOiBhdXRoZW50aWNhdGlvbiBhbmQgc2ltaWxhci4KICAgICAgICBzZWxmLnRydXN0X2VudiA9IFRydWUKCiAgICAgICAgIzogQSBDb29raWVKYXIgY29udGFpbmluZyBhbGwgY3VycmVudGx5IG91dHN0YW5kaW5nIGNvb2tpZXMgc2V0IG9uIHRoaXMKICAgICAgICAjOiBzZXNzaW9uLiBCeSBkZWZhdWx0IGl0IGlzIGEKICAgICAgICAjOiA6Y2xhc3M6YFJlcXVlc3RzQ29va2llSmFyIDxyZXF1ZXN0cy5jb29raWVzLlJlcXVlc3RzQ29va2llSmFyPmAsIGJ1dAogICAgICAgICM6IG1heSBiZSBhbnkgb3RoZXIgYGBjb29raWVsaWIuQ29va2llSmFyYGAgY29tcGF0aWJsZSBvYmplY3QuCiAgICAgICAgc2VsZi5jb29raWVzID0gY29va2llamFyX2Zyb21fZGljdCh7fSkKCiAgICAgICAgIyBEZWZhdWx0IGNvbm5lY3Rpb24gYWRhcHRlcnMuCiAgICAgICAgc2VsZi5hZGFwdGVycyA9IE9yZGVyZWREaWN0KCkKICAgICAgICBzZWxmLm1vdW50KCdodHRwczovLycsIEhUVFBBZGFwdGVyKCkpCiAgICAgICAgc2VsZi5tb3VudCgnaHR0cDovLycsIEhUVFBBZGFwdGVyKCkpCgogICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBfX2V4aXRfXyhzZWxmLCAqYXJncyk6CiAgICAgICAgc2VsZi5jbG9zZSgpCgogICAgZGVmIHByZXBhcmVfcmVxdWVzdChzZWxmLCByZXF1ZXN0KToKICAgICAgICAiIiJDb25zdHJ1Y3RzIGEgOmNsYXNzOmBQcmVwYXJlZFJlcXVlc3QgPFByZXBhcmVkUmVxdWVzdD5gIGZvcgogICAgICAgIHRyYW5zbWlzc2lvbiBhbmQgcmV0dXJucyBpdC4gVGhlIDpjbGFzczpgUHJlcGFyZWRSZXF1ZXN0YCBoYXMgc2V0dGluZ3MKICAgICAgICBtZXJnZWQgZnJvbSB0aGUgOmNsYXNzOmBSZXF1ZXN0IDxSZXF1ZXN0PmAgaW5zdGFuY2UgYW5kIHRob3NlIG9mIHRoZQogICAgICAgIDpjbGFzczpgU2Vzc2lvbmAuCgogICAgICAgIDpwYXJhbSByZXF1ZXN0OiA6Y2xhc3M6YFJlcXVlc3RgIGluc3RhbmNlIHRvIHByZXBhcmUgd2l0aCB0aGlzCiAgICAgICAgICAgIHNlc3Npb24ncyBzZXR0aW5ncy4KICAgICAgICA6cnR5cGU6IHJlcXVlc3RzLlByZXBhcmVkUmVxdWVzdAogICAgICAgICIiIgogICAgICAgIGNvb2tpZXMgPSByZXF1ZXN0LmNvb2tpZXMgb3Ige30KCiAgICAgICAgIyBCb290c3RyYXAgQ29va2llSmFyLgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGNvb2tpZXMsIGNvb2tpZWxpYi5Db29raWVKYXIpOgogICAgICAgICAgICBjb29raWVzID0gY29va2llamFyX2Zyb21fZGljdChjb29raWVzKQoKICAgICAgICAjIE1lcmdlIHdpdGggc2Vzc2lvbiBjb29raWVzCiAgICAgICAgbWVyZ2VkX2Nvb2tpZXMgPSBtZXJnZV9jb29raWVzKAogICAgICAgICAgICBtZXJnZV9jb29raWVzKFJlcXVlc3RzQ29va2llSmFyKCksIHNlbGYuY29va2llcyksIGNvb2tpZXMpCgogICAgICAgICMgU2V0IGVudmlyb25tZW50J3MgYmFzaWMgYXV0aGVudGljYXRpb24gaWYgbm90IGV4cGxpY2l0bHkgc2V0LgogICAgICAgIGF1dGggPSByZXF1ZXN0LmF1dGgKICAgICAgICBpZiBzZWxmLnRydXN0X2VudiBhbmQgbm90IGF1dGggYW5kIG5vdCBzZWxmLmF1dGg6CiAgICAgICAgICAgIGF1dGggPSBnZXRfbmV0cmNfYXV0aChyZXF1ZXN0LnVybCkKCiAgICAgICAgcCA9IFByZXBhcmVkUmVxdWVzdCgpCiAgICAgICAgcC5wcmVwYXJlKAogICAgICAgICAgICBtZXRob2Q9cmVxdWVzdC5tZXRob2QudXBwZXIoKSwKICAgICAgICAgICAgdXJsPXJlcXVlc3QudXJsLAogICAgICAgICAgICBmaWxlcz1yZXF1ZXN0LmZpbGVzLAogICAgICAgICAgICBkYXRhPXJlcXVlc3QuZGF0YSwKICAgICAgICAgICAganNvbj1yZXF1ZXN0Lmpzb24sCiAgICAgICAgICAgIGhlYWRlcnM9bWVyZ2Vfc2V0dGluZyhyZXF1ZXN0LmhlYWRlcnMsIHNlbGYuaGVhZGVycywgZGljdF9jbGFzcz1DYXNlSW5zZW5zaXRpdmVEaWN0KSwKICAgICAgICAgICAgcGFyYW1zPW1lcmdlX3NldHRpbmcocmVxdWVzdC5wYXJhbXMsIHNlbGYucGFyYW1zKSwKICAgICAgICAgICAgYXV0aD1tZXJnZV9zZXR0aW5nKGF1dGgsIHNlbGYuYXV0aCksCiAgICAgICAgICAgIGNvb2tpZXM9bWVyZ2VkX2Nvb2tpZXMsCiAgICAgICAgICAgIGhvb2tzPW1lcmdlX2hvb2tzKHJlcXVlc3QuaG9va3MsIHNlbGYuaG9va3MpLAogICAgICAgICkKICAgICAgICByZXR1cm4gcAoKICAgIGRlZiByZXF1ZXN0KHNlbGYsIG1ldGhvZCwgdXJsLAogICAgICAgICAgICBwYXJhbXM9Tm9uZSwgZGF0YT1Ob25lLCBoZWFkZXJzPU5vbmUsIGNvb2tpZXM9Tm9uZSwgZmlsZXM9Tm9uZSwKICAgICAgICAgICAgYXV0aD1Ob25lLCB0aW1lb3V0PU5vbmUsIGFsbG93X3JlZGlyZWN0cz1UcnVlLCBwcm94aWVzPU5vbmUsCiAgICAgICAgICAgIGhvb2tzPU5vbmUsIHN0cmVhbT1Ob25lLCB2ZXJpZnk9Tm9uZSwgY2VydD1Ob25lLCBqc29uPU5vbmUpOgogICAgICAgICIiIkNvbnN0cnVjdHMgYSA6Y2xhc3M6YFJlcXVlc3QgPFJlcXVlc3Q+YCwgcHJlcGFyZXMgaXQgYW5kIHNlbmRzIGl0LgogICAgICAgIFJldHVybnMgOmNsYXNzOmBSZXNwb25zZSA8UmVzcG9uc2U+YCBvYmplY3QuCgogICAgICAgIDpwYXJhbSBtZXRob2Q6IG1ldGhvZCBmb3IgdGhlIG5ldyA6Y2xhc3M6YFJlcXVlc3RgIG9iamVjdC4KICAgICAgICA6cGFyYW0gdXJsOiBVUkwgZm9yIHRoZSBuZXcgOmNsYXNzOmBSZXF1ZXN0YCBvYmplY3QuCiAgICAgICAgOnBhcmFtIHBhcmFtczogKG9wdGlvbmFsKSBEaWN0aW9uYXJ5IG9yIGJ5dGVzIHRvIGJlIHNlbnQgaW4gdGhlIHF1ZXJ5CiAgICAgICAgICAgIHN0cmluZyBmb3IgdGhlIDpjbGFzczpgUmVxdWVzdGAuCiAgICAgICAgOnBhcmFtIGRhdGE6IChvcHRpb25hbCkgRGljdGlvbmFyeSwgYnl0ZXMsIG9yIGZpbGUtbGlrZSBvYmplY3QgdG8gc2VuZAogICAgICAgICAgICBpbiB0aGUgYm9keSBvZiB0aGUgOmNsYXNzOmBSZXF1ZXN0YC4KICAgICAgICA6cGFyYW0ganNvbjogKG9wdGlvbmFsKSBqc29uIHRvIHNlbmQgaW4gdGhlIGJvZHkgb2YgdGhlCiAgICAgICAgICAgIDpjbGFzczpgUmVxdWVzdGAuCiAgICAgICAgOnBhcmFtIGhlYWRlcnM6IChvcHRpb25hbCkgRGljdGlvbmFyeSBvZiBIVFRQIEhlYWRlcnMgdG8gc2VuZCB3aXRoIHRoZQogICAgICAgICAgICA6Y2xhc3M6YFJlcXVlc3RgLgogICAgICAgIDpwYXJhbSBjb29raWVzOiAob3B0aW9uYWwpIERpY3Qgb3IgQ29va2llSmFyIG9iamVjdCB0byBzZW5kIHdpdGggdGhlCiAgICAgICAgICAgIDpjbGFzczpgUmVxdWVzdGAuCiAgICAgICAgOnBhcmFtIGZpbGVzOiAob3B0aW9uYWwpIERpY3Rpb25hcnkgb2YgYGAnZmlsZW5hbWUnOiBmaWxlLWxpa2Utb2JqZWN0c2BgCiAgICAgICAgICAgIGZvciBtdWx0aXBhcnQgZW5jb2RpbmcgdXBsb2FkLgogICAgICAgIDpwYXJhbSBhdXRoOiAob3B0aW9uYWwpIEF1dGggdHVwbGUgb3IgY2FsbGFibGUgdG8gZW5hYmxlCiAgICAgICAgICAgIEJhc2ljL0RpZ2VzdC9DdXN0b20gSFRUUCBBdXRoLgogICAgICAgIDpwYXJhbSB0aW1lb3V0OiAob3B0aW9uYWwpIEhvdyBsb25nIHRvIHdhaXQgZm9yIHRoZSBzZXJ2ZXIgdG8gc2VuZAogICAgICAgICAgICBkYXRhIGJlZm9yZSBnaXZpbmcgdXAsIGFzIGEgZmxvYXQsIG9yIGEgOnJlZjpgKGNvbm5lY3QgdGltZW91dCwKICAgICAgICAgICAgcmVhZCB0aW1lb3V0KSA8dGltZW91dHM+YCB0dXBsZS4KICAgICAgICA6dHlwZSB0aW1lb3V0OiBmbG9hdCBvciB0dXBsZQogICAgICAgIDpwYXJhbSBhbGxvd19yZWRpcmVjdHM6IChvcHRpb25hbCkgU2V0IHRvIFRydWUgYnkgZGVmYXVsdC4KICAgICAgICA6dHlwZSBhbGxvd19yZWRpcmVjdHM6IGJvb2wKICAgICAgICA6cGFyYW0gcHJveGllczogKG9wdGlvbmFsKSBEaWN0aW9uYXJ5IG1hcHBpbmcgcHJvdG9jb2wgb3IgcHJvdG9jb2wgYW5kCiAgICAgICAgICAgIGhvc3RuYW1lIHRvIHRoZSBVUkwgb2YgdGhlIHByb3h5LgogICAgICAgIDpwYXJhbSBzdHJlYW06IChvcHRpb25hbCkgd2hldGhlciB0byBpbW1lZGlhdGVseSBkb3dubG9hZCB0aGUgcmVzcG9uc2UKICAgICAgICAgICAgY29udGVudC4gRGVmYXVsdHMgdG8gYGBGYWxzZWBgLgogICAgICAgIDpwYXJhbSB2ZXJpZnk6IChvcHRpb25hbCkgRWl0aGVyIGEgYm9vbGVhbiwgaW4gd2hpY2ggY2FzZSBpdCBjb250cm9scyB3aGV0aGVyIHdlIHZlcmlmeQogICAgICAgICAgICB0aGUgc2VydmVyJ3MgVExTIGNlcnRpZmljYXRlLCBvciBhIHN0cmluZywgaW4gd2hpY2ggY2FzZSBpdCBtdXN0IGJlIGEgcGF0aAogICAgICAgICAgICB0byBhIENBIGJ1bmRsZSB0byB1c2UuIERlZmF1bHRzIHRvIGBgVHJ1ZWBgLgogICAgICAgIDpwYXJhbSBjZXJ0OiAob3B0aW9uYWwpIGlmIFN0cmluZywgcGF0aCB0byBzc2wgY2xpZW50IGNlcnQgZmlsZSAoLnBlbSkuCiAgICAgICAgICAgIElmIFR1cGxlLCAoJ2NlcnQnLCAna2V5JykgcGFpci4KICAgICAgICA6cnR5cGU6IHJlcXVlc3RzLlJlc3BvbnNlCiAgICAgICAgIiIiCiAgICAgICAgIyBDcmVhdGUgdGhlIFJlcXVlc3QuCiAgICAgICAgcmVxID0gUmVxdWVzdCgKICAgICAgICAgICAgbWV0aG9kPW1ldGhvZC51cHBlcigpLAogICAgICAgICAgICB1cmw9dXJsLAogICAgICAgICAgICBoZWFkZXJzPWhlYWRlcnMsCiAgICAgICAgICAgIGZpbGVzPWZpbGVzLAogICAgICAgICAgICBkYXRhPWRhdGEgb3Ige30sCiAgICAgICAgICAgIGpzb249anNvbiwKICAgICAgICAgICAgcGFyYW1zPXBhcmFtcyBvciB7fSwKICAgICAgICAgICAgYXV0aD1hdXRoLAogICAgICAgICAgICBjb29raWVzPWNvb2tpZXMsCiAgICAgICAgICAgIGhvb2tzPWhvb2tzLAogICAgICAgICkKICAgICAgICBwcmVwID0gc2VsZi5wcmVwYXJlX3JlcXVlc3QocmVxKQoKICAgICAgICBwcm94aWVzID0gcHJveGllcyBvciB7fQoKICAgICAgICBzZXR0aW5ncyA9IHNlbGYubWVyZ2VfZW52aXJvbm1lbnRfc2V0dGluZ3MoCiAgICAgICAgICAgIHByZXAudXJsLCBwcm94aWVzLCBzdHJlYW0sIHZlcmlmeSwgY2VydAogICAgICAgICkKCiAgICAgICAgIyBTZW5kIHRoZSByZXF1ZXN0LgogICAgICAgIHNlbmRfa3dhcmdzID0gewogICAgICAgICAgICAndGltZW91dCc6IHRpbWVvdXQsCiAgICAgICAgICAgICdhbGxvd19yZWRpcmVjdHMnOiBhbGxvd19yZWRpcmVjdHMsCiAgICAgICAgfQogICAgICAgIHNlbmRfa3dhcmdzLnVwZGF0ZShzZXR0aW5ncykKICAgICAgICByZXNwID0gc2VsZi5zZW5kKHByZXAsICoqc2VuZF9rd2FyZ3MpCgogICAgICAgIHJldHVybiByZXNwCgogICAgZGVmIGdldChzZWxmLCB1cmwsICoqa3dhcmdzKToKICAgICAgICByIiIiU2VuZHMgYSBHRVQgcmVxdWVzdC4gUmV0dXJucyA6Y2xhc3M6YFJlc3BvbnNlYCBvYmplY3QuCgogICAgICAgIDpwYXJhbSB1cmw6IFVSTCBmb3IgdGhlIG5ldyA6Y2xhc3M6YFJlcXVlc3RgIG9iamVjdC4KICAgICAgICA6cGFyYW0gXCpcKmt3YXJnczogT3B0aW9uYWwgYXJndW1lbnRzIHRoYXQgYGByZXF1ZXN0YGAgdGFrZXMuCiAgICAgICAgOnJ0eXBlOiByZXF1ZXN0cy5SZXNwb25zZQogICAgICAgICIiIgoKICAgICAgICBrd2FyZ3Muc2V0ZGVmYXVsdCgnYWxsb3dfcmVkaXJlY3RzJywgVHJ1ZSkKICAgICAgICByZXR1cm4gc2VsZi5yZXF1ZXN0KCdHRVQnLCB1cmwsICoqa3dhcmdzKQoKICAgIGRlZiBvcHRpb25zKHNlbGYsIHVybCwgKiprd2FyZ3MpOgogICAgICAgIHIiIiJTZW5kcyBhIE9QVElPTlMgcmVxdWVzdC4gUmV0dXJucyA6Y2xhc3M6YFJlc3BvbnNlYCBvYmplY3QuCgogICAgICAgIDpwYXJhbSB1cmw6IFVSTCBmb3IgdGhlIG5ldyA6Y2xhc3M6YFJlcXVlc3RgIG9iamVjdC4KICAgICAgICA6cGFyYW0gXCpcKmt3YXJnczogT3B0aW9uYWwgYXJndW1lbnRzIHRoYXQgYGByZXF1ZXN0YGAgdGFrZXMuCiAgICAgICAgOnJ0eXBlOiByZXF1ZXN0cy5SZXNwb25zZQogICAgICAgICIiIgoKICAgICAgICBrd2FyZ3Muc2V0ZGVmYXVsdCgnYWxsb3dfcmVkaXJlY3RzJywgVHJ1ZSkKICAgICAgICByZXR1cm4gc2VsZi5yZXF1ZXN0KCdPUFRJT05TJywgdXJsLCAqKmt3YXJncykKCiAgICBkZWYgaGVhZChzZWxmLCB1cmwsICoqa3dhcmdzKToKICAgICAgICByIiIiU2VuZHMgYSBIRUFEIHJlcXVlc3QuIFJldHVybnMgOmNsYXNzOmBSZXNwb25zZWAgb2JqZWN0LgoKICAgICAgICA6cGFyYW0gdXJsOiBVUkwgZm9yIHRoZSBuZXcgOmNsYXNzOmBSZXF1ZXN0YCBvYmplY3QuCiAgICAgICAgOnBhcmFtIFwqXCprd2FyZ3M6IE9wdGlvbmFsIGFyZ3VtZW50cyB0aGF0IGBgcmVxdWVzdGBgIHRha2VzLgogICAgICAgIDpydHlwZTogcmVxdWVzdHMuUmVzcG9uc2UKICAgICAgICAiIiIKCiAgICAgICAga3dhcmdzLnNldGRlZmF1bHQoJ2FsbG93X3JlZGlyZWN0cycsIEZhbHNlKQogICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3QoJ0hFQUQnLCB1cmwsICoqa3dhcmdzKQoKICAgIGRlZiBwb3N0KHNlbGYsIHVybCwgZGF0YT1Ob25lLCBqc29uPU5vbmUsICoqa3dhcmdzKToKICAgICAgICByIiIiU2VuZHMgYSBQT1NUIHJlcXVlc3QuIFJldHVybnMgOmNsYXNzOmBSZXNwb25zZWAgb2JqZWN0LgoKICAgICAgICA6cGFyYW0gdXJsOiBVUkwgZm9yIHRoZSBuZXcgOmNsYXNzOmBSZXF1ZXN0YCBvYmplY3QuCiAgICAgICAgOnBhcmFtIGRhdGE6IChvcHRpb25hbCkgRGljdGlvbmFyeSwgYnl0ZXMsIG9yIGZpbGUtbGlrZSBvYmplY3QgdG8gc2VuZCBpbiB0aGUgYm9keSBvZiB0aGUgOmNsYXNzOmBSZXF1ZXN0YC4KICAgICAgICA6cGFyYW0ganNvbjogKG9wdGlvbmFsKSBqc29uIHRvIHNlbmQgaW4gdGhlIGJvZHkgb2YgdGhlIDpjbGFzczpgUmVxdWVzdGAuCiAgICAgICAgOnBhcmFtIFwqXCprd2FyZ3M6IE9wdGlvbmFsIGFyZ3VtZW50cyB0aGF0IGBgcmVxdWVzdGBgIHRha2VzLgogICAgICAgIDpydHlwZTogcmVxdWVzdHMuUmVzcG9uc2UKICAgICAgICAiIiIKCiAgICAgICAgcmV0dXJuIHNlbGYucmVxdWVzdCgnUE9TVCcsIHVybCwgZGF0YT1kYXRhLCBqc29uPWpzb24sICoqa3dhcmdzKQoKICAgIGRlZiBwdXQoc2VsZiwgdXJsLCBkYXRhPU5vbmUsICoqa3dhcmdzKToKICAgICAgICByIiIiU2VuZHMgYSBQVVQgcmVxdWVzdC4gUmV0dXJucyA6Y2xhc3M6YFJlc3BvbnNlYCBvYmplY3QuCgogICAgICAgIDpwYXJhbSB1cmw6IFVSTCBmb3IgdGhlIG5ldyA6Y2xhc3M6YFJlcXVlc3RgIG9iamVjdC4KICAgICAgICA6cGFyYW0gZGF0YTogKG9wdGlvbmFsKSBEaWN0aW9uYXJ5LCBieXRlcywgb3IgZmlsZS1saWtlIG9iamVjdCB0byBzZW5kIGluIHRoZSBib2R5IG9mIHRoZSA6Y2xhc3M6YFJlcXVlc3RgLgogICAgICAgIDpwYXJhbSBcKlwqa3dhcmdzOiBPcHRpb25hbCBhcmd1bWVudHMgdGhhdCBgYHJlcXVlc3RgYCB0YWtlcy4KICAgICAgICA6cnR5cGU6IHJlcXVlc3RzLlJlc3BvbnNlCiAgICAgICAgIiIiCgogICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3QoJ1BVVCcsIHVybCwgZGF0YT1kYXRhLCAqKmt3YXJncykKCiAgICBkZWYgcGF0Y2goc2VsZiwgdXJsLCBkYXRhPU5vbmUsICoqa3dhcmdzKToKICAgICAgICByIiIiU2VuZHMgYSBQQVRDSCByZXF1ZXN0LiBSZXR1cm5zIDpjbGFzczpgUmVzcG9uc2VgIG9iamVjdC4KCiAgICAgICAgOnBhcmFtIHVybDogVVJMIGZvciB0aGUgbmV3IDpjbGFzczpgUmVxdWVzdGAgb2JqZWN0LgogICAgICAgIDpwYXJhbSBkYXRhOiAob3B0aW9uYWwpIERpY3Rpb25hcnksIGJ5dGVzLCBvciBmaWxlLWxpa2Ugb2JqZWN0IHRvIHNlbmQgaW4gdGhlIGJvZHkgb2YgdGhlIDpjbGFzczpgUmVxdWVzdGAuCiAgICAgICAgOnBhcmFtIFwqXCprd2FyZ3M6IE9wdGlvbmFsIGFyZ3VtZW50cyB0aGF0IGBgcmVxdWVzdGBgIHRha2VzLgogICAgICAgIDpydHlwZTogcmVxdWVzdHMuUmVzcG9uc2UKICAgICAgICAiIiIKCiAgICAgICAgcmV0dXJuIHNlbGYucmVxdWVzdCgnUEFUQ0gnLCB1cmwsIGRhdGE9ZGF0YSwgKiprd2FyZ3MpCgogICAgZGVmIGRlbGV0ZShzZWxmLCB1cmwsICoqa3dhcmdzKToKICAgICAgICByIiIiU2VuZHMgYSBERUxFVEUgcmVxdWVzdC4gUmV0dXJucyA6Y2xhc3M6YFJlc3BvbnNlYCBvYmplY3QuCgogICAgICAgIDpwYXJhbSB1cmw6IFVSTCBmb3IgdGhlIG5ldyA6Y2xhc3M6YFJlcXVlc3RgIG9iamVjdC4KICAgICAgICA6cGFyYW0gXCpcKmt3YXJnczogT3B0aW9uYWwgYXJndW1lbnRzIHRoYXQgYGByZXF1ZXN0YGAgdGFrZXMuCiAgICAgICAgOnJ0eXBlOiByZXF1ZXN0cy5SZXNwb25zZQogICAgICAgICIiIgoKICAgICAgICByZXR1cm4gc2VsZi5yZXF1ZXN0KCdERUxFVEUnLCB1cmwsICoqa3dhcmdzKQoKICAgIGRlZiBzZW5kKHNlbGYsIHJlcXVlc3QsICoqa3dhcmdzKToKICAgICAgICAiIiJTZW5kIGEgZ2l2ZW4gUHJlcGFyZWRSZXF1ZXN0LgoKICAgICAgICA6cnR5cGU6IHJlcXVlc3RzLlJlc3BvbnNlCiAgICAgICAgIiIiCiAgICAgICAgIyBTZXQgZGVmYXVsdHMgdGhhdCB0aGUgaG9va3MgY2FuIHV0aWxpemUgdG8gZW5zdXJlIHRoZXkgYWx3YXlzIGhhdmUKICAgICAgICAjIHRoZSBjb3JyZWN0IHBhcmFtZXRlcnMgdG8gcmVwcm9kdWNlIHRoZSBwcmV2aW91cyByZXF1ZXN0LgogICAgICAgIGt3YXJncy5zZXRkZWZhdWx0KCdzdHJlYW0nLCBzZWxmLnN0cmVhbSkKICAgICAgICBrd2FyZ3Muc2V0ZGVmYXVsdCgndmVyaWZ5Jywgc2VsZi52ZXJpZnkpCiAgICAgICAga3dhcmdzLnNldGRlZmF1bHQoJ2NlcnQnLCBzZWxmLmNlcnQpCiAgICAgICAga3dhcmdzLnNldGRlZmF1bHQoJ3Byb3hpZXMnLCBzZWxmLnByb3hpZXMpCgogICAgICAgICMgSXQncyBwb3NzaWJsZSB0aGF0IHVzZXJzIG1pZ2h0IGFjY2lkZW50YWxseSBzZW5kIGEgUmVxdWVzdCBvYmplY3QuCiAgICAgICAgIyBHdWFyZCBhZ2FpbnN0IHRoYXQgc3BlY2lmaWMgZmFpbHVyZSBjYXNlLgogICAgICAgIGlmIGlzaW5zdGFuY2UocmVxdWVzdCwgUmVxdWVzdCk6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1lvdSBjYW4gb25seSBzZW5kIFByZXBhcmVkUmVxdWVzdHMuJykKCiAgICAgICAgIyBTZXQgdXAgdmFyaWFibGVzIG5lZWRlZCBmb3IgcmVzb2x2ZV9yZWRpcmVjdHMgYW5kIGRpc3BhdGNoaW5nIG9mIGhvb2tzCiAgICAgICAgYWxsb3dfcmVkaXJlY3RzID0ga3dhcmdzLnBvcCgnYWxsb3dfcmVkaXJlY3RzJywgVHJ1ZSkKICAgICAgICBzdHJlYW0gPSBrd2FyZ3MuZ2V0KCdzdHJlYW0nKQogICAgICAgIGhvb2tzID0gcmVxdWVzdC5ob29rcwoKICAgICAgICAjIEdldCB0aGUgYXBwcm9wcmlhdGUgYWRhcHRlciB0byB1c2UKICAgICAgICBhZGFwdGVyID0gc2VsZi5nZXRfYWRhcHRlcih1cmw9cmVxdWVzdC51cmwpCgogICAgICAgICMgU3RhcnQgdGltZSAoYXBwcm94aW1hdGVseSkgb2YgdGhlIHJlcXVlc3QKICAgICAgICBzdGFydCA9IHByZWZlcnJlZF9jbG9jaygpCgogICAgICAgICMgU2VuZCB0aGUgcmVxdWVzdAogICAgICAgIHIgPSBhZGFwdGVyLnNlbmQocmVxdWVzdCwgKiprd2FyZ3MpCgogICAgICAgICMgVG90YWwgZWxhcHNlZCB0aW1lIG9mIHRoZSByZXF1ZXN0IChhcHByb3hpbWF0ZWx5KQogICAgICAgIGVsYXBzZWQgPSBwcmVmZXJyZWRfY2xvY2soKSAtIHN0YXJ0CiAgICAgICAgci5lbGFwc2VkID0gdGltZWRlbHRhKHNlY29uZHM9ZWxhcHNlZCkKCiAgICAgICAgIyBSZXNwb25zZSBtYW5pcHVsYXRpb24gaG9va3MKICAgICAgICByID0gZGlzcGF0Y2hfaG9vaygncmVzcG9uc2UnLCBob29rcywgciwgKiprd2FyZ3MpCgogICAgICAgICMgUGVyc2lzdCBjb29raWVzCiAgICAgICAgaWYgci5oaXN0b3J5OgoKICAgICAgICAgICAgIyBJZiB0aGUgaG9va3MgY3JlYXRlIGhpc3RvcnkgdGhlbiB3ZSB3YW50IHRob3NlIGNvb2tpZXMgdG9vCiAgICAgICAgICAgIGZvciByZXNwIGluIHIuaGlzdG9yeToKICAgICAgICAgICAgICAgIGV4dHJhY3RfY29va2llc190b19qYXIoc2VsZi5jb29raWVzLCByZXNwLnJlcXVlc3QsIHJlc3AucmF3KQoKICAgICAgICBleHRyYWN0X2Nvb2tpZXNfdG9famFyKHNlbGYuY29va2llcywgcmVxdWVzdCwgci5yYXcpCgogICAgICAgICMgUmVkaXJlY3QgcmVzb2x2aW5nIGdlbmVyYXRvci4KICAgICAgICBnZW4gPSBzZWxmLnJlc29sdmVfcmVkaXJlY3RzKHIsIHJlcXVlc3QsICoqa3dhcmdzKQoKICAgICAgICAjIFJlc29sdmUgcmVkaXJlY3RzIGlmIGFsbG93ZWQuCiAgICAgICAgaGlzdG9yeSA9IFtyZXNwIGZvciByZXNwIGluIGdlbl0gaWYgYWxsb3dfcmVkaXJlY3RzIGVsc2UgW10KCiAgICAgICAgIyBTaHVmZmxlIHRoaW5ncyBhcm91bmQgaWYgdGhlcmUncyBoaXN0b3J5LgogICAgICAgIGlmIGhpc3Rvcnk6CiAgICAgICAgICAgICMgSW5zZXJ0IHRoZSBmaXJzdCAob3JpZ2luYWwpIHJlcXVlc3QgYXQgdGhlIHN0YXJ0CiAgICAgICAgICAgIGhpc3RvcnkuaW5zZXJ0KDAsIHIpCiAgICAgICAgICAgICMgR2V0IHRoZSBsYXN0IHJlcXVlc3QgbWFkZQogICAgICAgICAgICByID0gaGlzdG9yeS5wb3AoKQogICAgICAgICAgICByLmhpc3RvcnkgPSBoaXN0b3J5CgogICAgICAgICMgSWYgcmVkaXJlY3RzIGFyZW4ndCBiZWluZyBmb2xsb3dlZCwgc3RvcmUgdGhlIHJlc3BvbnNlIG9uIHRoZSBSZXF1ZXN0IGZvciBSZXNwb25zZS5uZXh0KCkuCiAgICAgICAgaWYgbm90IGFsbG93X3JlZGlyZWN0czoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgci5fbmV4dCA9IG5leHQoc2VsZi5yZXNvbHZlX3JlZGlyZWN0cyhyLCByZXF1ZXN0LCB5aWVsZF9yZXF1ZXN0cz1UcnVlLCAqKmt3YXJncykpCiAgICAgICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uOgogICAgICAgICAgICAgICAgcGFzcwoKICAgICAgICBpZiBub3Qgc3RyZWFtOgogICAgICAgICAgICByLmNvbnRlbnQKCiAgICAgICAgcmV0dXJuIHIKCiAgICBkZWYgbWVyZ2VfZW52aXJvbm1lbnRfc2V0dGluZ3Moc2VsZiwgdXJsLCBwcm94aWVzLCBzdHJlYW0sIHZlcmlmeSwgY2VydCk6CiAgICAgICAgIiIiCiAgICAgICAgQ2hlY2sgdGhlIGVudmlyb25tZW50IGFuZCBtZXJnZSBpdCB3aXRoIHNvbWUgc2V0dGluZ3MuCgogICAgICAgIDpydHlwZTogZGljdAogICAgICAgICIiIgogICAgICAgICMgR2F0aGVyIGNsdWVzIGZyb20gdGhlIHN1cnJvdW5kaW5nIGVudmlyb25tZW50LgogICAgICAgIGlmIHNlbGYudHJ1c3RfZW52OgogICAgICAgICAgICAjIFNldCBlbnZpcm9ubWVudCdzIHByb3hpZXMuCiAgICAgICAgICAgIG5vX3Byb3h5ID0gcHJveGllcy5nZXQoJ25vX3Byb3h5JykgaWYgcHJveGllcyBpcyBub3QgTm9uZSBlbHNlIE5vbmUKICAgICAgICAgICAgZW52X3Byb3hpZXMgPSBnZXRfZW52aXJvbl9wcm94aWVzKHVybCwgbm9fcHJveHk9bm9fcHJveHkpCiAgICAgICAgICAgIGZvciAoaywgdikgaW4gZW52X3Byb3hpZXMuaXRlbXMoKToKICAgICAgICAgICAgICAgIHByb3hpZXMuc2V0ZGVmYXVsdChrLCB2KQoKICAgICAgICAgICAgIyBMb29rIGZvciByZXF1ZXN0cyBlbnZpcm9ubWVudCBjb25maWd1cmF0aW9uIGFuZCBiZSBjb21wYXRpYmxlCiAgICAgICAgICAgICMgd2l0aCBjVVJMLgogICAgICAgICAgICBpZiB2ZXJpZnkgaXMgVHJ1ZSBvciB2ZXJpZnkgaXMgTm9uZToKICAgICAgICAgICAgICAgIHZlcmlmeSA9IChvcy5lbnZpcm9uLmdldCgnUkVRVUVTVFNfQ0FfQlVORExFJykgb3IKICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5lbnZpcm9uLmdldCgnQ1VSTF9DQV9CVU5ETEUnKSkKCiAgICAgICAgIyBNZXJnZSBhbGwgdGhlIGt3YXJncy4KICAgICAgICBwcm94aWVzID0gbWVyZ2Vfc2V0dGluZyhwcm94aWVzLCBzZWxmLnByb3hpZXMpCiAgICAgICAgc3RyZWFtID0gbWVyZ2Vfc2V0dGluZyhzdHJlYW0sIHNlbGYuc3RyZWFtKQogICAgICAgIHZlcmlmeSA9IG1lcmdlX3NldHRpbmcodmVyaWZ5LCBzZWxmLnZlcmlmeSkKICAgICAgICBjZXJ0ID0gbWVyZ2Vfc2V0dGluZyhjZXJ0LCBzZWxmLmNlcnQpCgogICAgICAgIHJldHVybiB7J3ZlcmlmeSc6IHZlcmlmeSwgJ3Byb3hpZXMnOiBwcm94aWVzLCAnc3RyZWFtJzogc3RyZWFtLAogICAgICAgICAgICAgICAgJ2NlcnQnOiBjZXJ0fQoKICAgIGRlZiBnZXRfYWRhcHRlcihzZWxmLCB1cmwpOgogICAgICAgICIiIgogICAgICAgIFJldHVybnMgdGhlIGFwcHJvcHJpYXRlIGNvbm5lY3Rpb24gYWRhcHRlciBmb3IgdGhlIGdpdmVuIFVSTC4KCiAgICAgICAgOnJ0eXBlOiByZXF1ZXN0cy5hZGFwdGVycy5CYXNlQWRhcHRlcgogICAgICAgICIiIgogICAgICAgIGZvciAocHJlZml4LCBhZGFwdGVyKSBpbiBzZWxmLmFkYXB0ZXJzLml0ZW1zKCk6CgogICAgICAgICAgICBpZiB1cmwubG93ZXIoKS5zdGFydHN3aXRoKHByZWZpeCk6CiAgICAgICAgICAgICAgICByZXR1cm4gYWRhcHRlcgoKICAgICAgICAjIE5vdGhpbmcgbWF0Y2hlcyA6LS8KICAgICAgICByYWlzZSBJbnZhbGlkU2NoZW1hKCJObyBjb25uZWN0aW9uIGFkYXB0ZXJzIHdlcmUgZm91bmQgZm9yICclcyciICUgdXJsKQoKICAgIGRlZiBjbG9zZShzZWxmKToKICAgICAgICAiIiJDbG9zZXMgYWxsIGFkYXB0ZXJzIGFuZCBhcyBzdWNoIHRoZSBzZXNzaW9uIiIiCiAgICAgICAgZm9yIHYgaW4gc2VsZi5hZGFwdGVycy52YWx1ZXMoKToKICAgICAgICAgICAgdi5jbG9zZSgpCgogICAgZGVmIG1vdW50KHNlbGYsIHByZWZpeCwgYWRhcHRlcik6CiAgICAgICAgIiIiUmVnaXN0ZXJzIGEgY29ubmVjdGlvbiBhZGFwdGVyIHRvIGEgcHJlZml4LgoKICAgICAgICBBZGFwdGVycyBhcmUgc29ydGVkIGluIGRlc2NlbmRpbmcgb3JkZXIgYnkgcHJlZml4IGxlbmd0aC4KICAgICAgICAiIiIKICAgICAgICBzZWxmLmFkYXB0ZXJzW3ByZWZpeF0gPSBhZGFwdGVyCiAgICAgICAga2V5c190b19tb3ZlID0gW2sgZm9yIGsgaW4gc2VsZi5hZGFwdGVycyBpZiBsZW4oaykgPCBsZW4ocHJlZml4KV0KCiAgICAgICAgZm9yIGtleSBpbiBrZXlzX3RvX21vdmU6CiAgICAgICAgICAgIHNlbGYuYWRhcHRlcnNba2V5XSA9IHNlbGYuYWRhcHRlcnMucG9wKGtleSkKCiAgICBkZWYgX19nZXRzdGF0ZV9fKHNlbGYpOgogICAgICAgIHN0YXRlID0gZGljdCgoYXR0ciwgZ2V0YXR0cihzZWxmLCBhdHRyLCBOb25lKSkgZm9yIGF0dHIgaW4gc2VsZi5fX2F0dHJzX18pCiAgICAgICAgcmV0dXJuIHN0YXRlCgogICAgZGVmIF9fc2V0c3RhdGVfXyhzZWxmLCBzdGF0ZSk6CiAgICAgICAgZm9yIGF0dHIsIHZhbHVlIGluIHN0YXRlLml0ZW1zKCk6CiAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgYXR0ciwgdmFsdWUpCgoKZGVmIHNlc3Npb24oKToKICAgICIiIgogICAgUmV0dXJucyBhIDpjbGFzczpgU2Vzc2lvbmAgZm9yIGNvbnRleHQtbWFuYWdlbWVudC4KCiAgICA6cnR5cGU6IFNlc3Npb24KICAgICIiIgoKICAgIHJldHVybiBTZXNzaW9uKCkKUEsDBBQAAAAAAAAAIQBBONfi+wwAAPsMAABBAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9yZXF1ZXN0cy9zdGF0dXNfY29kZXMucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQoKZnJvbSAuc3RydWN0dXJlcyBpbXBvcnQgTG9va3VwRGljdAoKX2NvZGVzID0gewoKICAgICMgSW5mb3JtYXRpb25hbC4KICAgIDEwMDogKCdjb250aW51ZScsKSwKICAgIDEwMTogKCdzd2l0Y2hpbmdfcHJvdG9jb2xzJywpLAogICAgMTAyOiAoJ3Byb2Nlc3NpbmcnLCksCiAgICAxMDM6ICgnY2hlY2twb2ludCcsKSwKICAgIDEyMjogKCd1cmlfdG9vX2xvbmcnLCAncmVxdWVzdF91cmlfdG9vX2xvbmcnKSwKICAgIDIwMDogKCdvaycsICdva2F5JywgJ2FsbF9vaycsICdhbGxfb2theScsICdhbGxfZ29vZCcsICdcXG8vJywgJ+KckycpLAogICAgMjAxOiAoJ2NyZWF0ZWQnLCksCiAgICAyMDI6ICgnYWNjZXB0ZWQnLCksCiAgICAyMDM6ICgnbm9uX2F1dGhvcml0YXRpdmVfaW5mbycsICdub25fYXV0aG9yaXRhdGl2ZV9pbmZvcm1hdGlvbicpLAogICAgMjA0OiAoJ25vX2NvbnRlbnQnLCksCiAgICAyMDU6ICgncmVzZXRfY29udGVudCcsICdyZXNldCcpLAogICAgMjA2OiAoJ3BhcnRpYWxfY29udGVudCcsICdwYXJ0aWFsJyksCiAgICAyMDc6ICgnbXVsdGlfc3RhdHVzJywgJ211bHRpcGxlX3N0YXR1cycsICdtdWx0aV9zdGF0aScsICdtdWx0aXBsZV9zdGF0aScpLAogICAgMjA4OiAoJ2FscmVhZHlfcmVwb3J0ZWQnLCksCiAgICAyMjY6ICgnaW1fdXNlZCcsKSwKCiAgICAjIFJlZGlyZWN0aW9uLgogICAgMzAwOiAoJ211bHRpcGxlX2Nob2ljZXMnLCksCiAgICAzMDE6ICgnbW92ZWRfcGVybWFuZW50bHknLCAnbW92ZWQnLCAnXFxvLScpLAogICAgMzAyOiAoJ2ZvdW5kJywpLAogICAgMzAzOiAoJ3NlZV9vdGhlcicsICdvdGhlcicpLAogICAgMzA0OiAoJ25vdF9tb2RpZmllZCcsKSwKICAgIDMwNTogKCd1c2VfcHJveHknLCksCiAgICAzMDY6ICgnc3dpdGNoX3Byb3h5JywpLAogICAgMzA3OiAoJ3RlbXBvcmFyeV9yZWRpcmVjdCcsICd0ZW1wb3JhcnlfbW92ZWQnLCAndGVtcG9yYXJ5JyksCiAgICAzMDg6ICgncGVybWFuZW50X3JlZGlyZWN0JywKICAgICAgICAgICdyZXN1bWVfaW5jb21wbGV0ZScsICdyZXN1bWUnLCksICAjIFRoZXNlIDIgdG8gYmUgcmVtb3ZlZCBpbiAzLjAKCiAgICAjIENsaWVudCBFcnJvci4KICAgIDQwMDogKCdiYWRfcmVxdWVzdCcsICdiYWQnKSwKICAgIDQwMTogKCd1bmF1dGhvcml6ZWQnLCksCiAgICA0MDI6ICgncGF5bWVudF9yZXF1aXJlZCcsICdwYXltZW50JyksCiAgICA0MDM6ICgnZm9yYmlkZGVuJywpLAogICAgNDA0OiAoJ25vdF9mb3VuZCcsICctby0nKSwKICAgIDQwNTogKCdtZXRob2Rfbm90X2FsbG93ZWQnLCAnbm90X2FsbG93ZWQnKSwKICAgIDQwNjogKCdub3RfYWNjZXB0YWJsZScsKSwKICAgIDQwNzogKCdwcm94eV9hdXRoZW50aWNhdGlvbl9yZXF1aXJlZCcsICdwcm94eV9hdXRoJywgJ3Byb3h5X2F1dGhlbnRpY2F0aW9uJyksCiAgICA0MDg6ICgncmVxdWVzdF90aW1lb3V0JywgJ3RpbWVvdXQnKSwKICAgIDQwOTogKCdjb25mbGljdCcsKSwKICAgIDQxMDogKCdnb25lJywpLAogICAgNDExOiAoJ2xlbmd0aF9yZXF1aXJlZCcsKSwKICAgIDQxMjogKCdwcmVjb25kaXRpb25fZmFpbGVkJywgJ3ByZWNvbmRpdGlvbicpLAogICAgNDEzOiAoJ3JlcXVlc3RfZW50aXR5X3Rvb19sYXJnZScsKSwKICAgIDQxNDogKCdyZXF1ZXN0X3VyaV90b29fbGFyZ2UnLCksCiAgICA0MTU6ICgndW5zdXBwb3J0ZWRfbWVkaWFfdHlwZScsICd1bnN1cHBvcnRlZF9tZWRpYScsICdtZWRpYV90eXBlJyksCiAgICA0MTY6ICgncmVxdWVzdGVkX3JhbmdlX25vdF9zYXRpc2ZpYWJsZScsICdyZXF1ZXN0ZWRfcmFuZ2UnLCAncmFuZ2Vfbm90X3NhdGlzZmlhYmxlJyksCiAgICA0MTc6ICgnZXhwZWN0YXRpb25fZmFpbGVkJywpLAogICAgNDE4OiAoJ2ltX2FfdGVhcG90JywgJ3RlYXBvdCcsICdpX2FtX2FfdGVhcG90JyksCiAgICA0MjE6ICgnbWlzZGlyZWN0ZWRfcmVxdWVzdCcsKSwKICAgIDQyMjogKCd1bnByb2Nlc3NhYmxlX2VudGl0eScsICd1bnByb2Nlc3NhYmxlJyksCiAgICA0MjM6ICgnbG9ja2VkJywpLAogICAgNDI0OiAoJ2ZhaWxlZF9kZXBlbmRlbmN5JywgJ2RlcGVuZGVuY3knKSwKICAgIDQyNTogKCd1bm9yZGVyZWRfY29sbGVjdGlvbicsICd1bm9yZGVyZWQnKSwKICAgIDQyNjogKCd1cGdyYWRlX3JlcXVpcmVkJywgJ3VwZ3JhZGUnKSwKICAgIDQyODogKCdwcmVjb25kaXRpb25fcmVxdWlyZWQnLCAncHJlY29uZGl0aW9uJyksCiAgICA0Mjk6ICgndG9vX21hbnlfcmVxdWVzdHMnLCAndG9vX21hbnknKSwKICAgIDQzMTogKCdoZWFkZXJfZmllbGRzX3Rvb19sYXJnZScsICdmaWVsZHNfdG9vX2xhcmdlJyksCiAgICA0NDQ6ICgnbm9fcmVzcG9uc2UnLCAnbm9uZScpLAogICAgNDQ5OiAoJ3JldHJ5X3dpdGgnLCAncmV0cnknKSwKICAgIDQ1MDogKCdibG9ja2VkX2J5X3dpbmRvd3NfcGFyZW50YWxfY29udHJvbHMnLCAncGFyZW50YWxfY29udHJvbHMnKSwKICAgIDQ1MTogKCd1bmF2YWlsYWJsZV9mb3JfbGVnYWxfcmVhc29ucycsICdsZWdhbF9yZWFzb25zJyksCiAgICA0OTk6ICgnY2xpZW50X2Nsb3NlZF9yZXF1ZXN0JywpLAoKICAgICMgU2VydmVyIEVycm9yLgogICAgNTAwOiAoJ2ludGVybmFsX3NlcnZlcl9lcnJvcicsICdzZXJ2ZXJfZXJyb3InLCAnL29cXCcsICfinJcnKSwKICAgIDUwMTogKCdub3RfaW1wbGVtZW50ZWQnLCksCiAgICA1MDI6ICgnYmFkX2dhdGV3YXknLCksCiAgICA1MDM6ICgnc2VydmljZV91bmF2YWlsYWJsZScsICd1bmF2YWlsYWJsZScpLAogICAgNTA0OiAoJ2dhdGV3YXlfdGltZW91dCcsKSwKICAgIDUwNTogKCdodHRwX3ZlcnNpb25fbm90X3N1cHBvcnRlZCcsICdodHRwX3ZlcnNpb24nKSwKICAgIDUwNjogKCd2YXJpYW50X2Fsc29fbmVnb3RpYXRlcycsKSwKICAgIDUwNzogKCdpbnN1ZmZpY2llbnRfc3RvcmFnZScsKSwKICAgIDUwOTogKCdiYW5kd2lkdGhfbGltaXRfZXhjZWVkZWQnLCAnYmFuZHdpZHRoJyksCiAgICA1MTA6ICgnbm90X2V4dGVuZGVkJywpLAogICAgNTExOiAoJ25ldHdvcmtfYXV0aGVudGljYXRpb25fcmVxdWlyZWQnLCAnbmV0d29ya19hdXRoJywgJ25ldHdvcmtfYXV0aGVudGljYXRpb24nKSwKfQoKY29kZXMgPSBMb29rdXBEaWN0KG5hbWU9J3N0YXR1c19jb2RlcycpCgpmb3IgY29kZSwgdGl0bGVzIGluIF9jb2Rlcy5pdGVtcygpOgogICAgZm9yIHRpdGxlIGluIHRpdGxlczoKICAgICAgICBzZXRhdHRyKGNvZGVzLCB0aXRsZSwgY29kZSkKICAgICAgICBpZiBub3QgdGl0bGUuc3RhcnRzd2l0aCgoJ1xcJywgJy8nKSk6CiAgICAgICAgICAgIHNldGF0dHIoY29kZXMsIHRpdGxlLnVwcGVyKCksIGNvZGUpClBLAwQUAAAAAAAAACEA5iDKD8QLAADECwAAPwAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvc3RydWN0dXJlcy5weSMgLSotIGNvZGluZzogdXRmLTggLSotCgoiIiIKcmVxdWVzdHMuc3RydWN0dXJlcwp+fn5+fn5+fn5+fn5+fn5+fn5+CgpEYXRhIHN0cnVjdHVyZXMgdGhhdCBwb3dlciBSZXF1ZXN0cy4KIiIiCgppbXBvcnQgY29sbGVjdGlvbnMKCmZyb20gLmNvbXBhdCBpbXBvcnQgT3JkZXJlZERpY3QKCgpjbGFzcyBDYXNlSW5zZW5zaXRpdmVEaWN0KGNvbGxlY3Rpb25zLk11dGFibGVNYXBwaW5nKToKICAgICIiIkEgY2FzZS1pbnNlbnNpdGl2ZSBgYGRpY3RgYC1saWtlIG9iamVjdC4KCiAgICBJbXBsZW1lbnRzIGFsbCBtZXRob2RzIGFuZCBvcGVyYXRpb25zIG9mCiAgICBgYGNvbGxlY3Rpb25zLk11dGFibGVNYXBwaW5nYGAgYXMgd2VsbCBhcyBkaWN0J3MgYGBjb3B5YGAuIEFsc28KICAgIHByb3ZpZGVzIGBgbG93ZXJfaXRlbXNgYC4KCiAgICBBbGwga2V5cyBhcmUgZXhwZWN0ZWQgdG8gYmUgc3RyaW5ncy4gVGhlIHN0cnVjdHVyZSByZW1lbWJlcnMgdGhlCiAgICBjYXNlIG9mIHRoZSBsYXN0IGtleSB0byBiZSBzZXQsIGFuZCBgYGl0ZXIoaW5zdGFuY2UpYGAsCiAgICBgYGtleXMoKWBgLCBgYGl0ZW1zKClgYCwgYGBpdGVya2V5cygpYGAsIGFuZCBgYGl0ZXJpdGVtcygpYGAKICAgIHdpbGwgY29udGFpbiBjYXNlLXNlbnNpdGl2ZSBrZXlzLiBIb3dldmVyLCBxdWVyeWluZyBhbmQgY29udGFpbnMKICAgIHRlc3RpbmcgaXMgY2FzZSBpbnNlbnNpdGl2ZTo6CgogICAgICAgIGNpZCA9IENhc2VJbnNlbnNpdGl2ZURpY3QoKQogICAgICAgIGNpZFsnQWNjZXB0J10gPSAnYXBwbGljYXRpb24vanNvbicKICAgICAgICBjaWRbJ2FDQ0VQVCddID09ICdhcHBsaWNhdGlvbi9qc29uJyAgIyBUcnVlCiAgICAgICAgbGlzdChjaWQpID09IFsnQWNjZXB0J10gICMgVHJ1ZQoKICAgIEZvciBleGFtcGxlLCBgYGhlYWRlcnNbJ2NvbnRlbnQtZW5jb2RpbmcnXWBgIHdpbGwgcmV0dXJuIHRoZQogICAgdmFsdWUgb2YgYSBgYCdDb250ZW50LUVuY29kaW5nJ2BgIHJlc3BvbnNlIGhlYWRlciwgcmVnYXJkbGVzcwogICAgb2YgaG93IHRoZSBoZWFkZXIgbmFtZSB3YXMgb3JpZ2luYWxseSBzdG9yZWQuCgogICAgSWYgdGhlIGNvbnN0cnVjdG9yLCBgYC51cGRhdGVgYCwgb3IgZXF1YWxpdHkgY29tcGFyaXNvbgogICAgb3BlcmF0aW9ucyBhcmUgZ2l2ZW4ga2V5cyB0aGF0IGhhdmUgZXF1YWwgYGAubG93ZXIoKWBgcywgdGhlCiAgICBiZWhhdmlvciBpcyB1bmRlZmluZWQuCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgZGF0YT1Ob25lLCAqKmt3YXJncyk6CiAgICAgICAgc2VsZi5fc3RvcmUgPSBPcmRlcmVkRGljdCgpCiAgICAgICAgaWYgZGF0YSBpcyBOb25lOgogICAgICAgICAgICBkYXRhID0ge30KICAgICAgICBzZWxmLnVwZGF0ZShkYXRhLCAqKmt3YXJncykKCiAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwga2V5LCB2YWx1ZSk6CiAgICAgICAgIyBVc2UgdGhlIGxvd2VyY2FzZWQga2V5IGZvciBsb29rdXBzLCBidXQgc3RvcmUgdGhlIGFjdHVhbAogICAgICAgICMga2V5IGFsb25nc2lkZSB0aGUgdmFsdWUuCiAgICAgICAgc2VsZi5fc3RvcmVba2V5Lmxvd2VyKCldID0gKGtleSwgdmFsdWUpCgogICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CiAgICAgICAgcmV0dXJuIHNlbGYuX3N0b3JlW2tleS5sb3dlcigpXVsxXQoKICAgIGRlZiBfX2RlbGl0ZW1fXyhzZWxmLCBrZXkpOgogICAgICAgIGRlbCBzZWxmLl9zdG9yZVtrZXkubG93ZXIoKV0KCiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIChjYXNlZGtleSBmb3IgY2FzZWRrZXksIG1hcHBlZHZhbHVlIGluIHNlbGYuX3N0b3JlLnZhbHVlcygpKQoKICAgIGRlZiBfX2xlbl9fKHNlbGYpOgogICAgICAgIHJldHVybiBsZW4oc2VsZi5fc3RvcmUpCgogICAgZGVmIGxvd2VyX2l0ZW1zKHNlbGYpOgogICAgICAgICIiIkxpa2UgaXRlcml0ZW1zKCksIGJ1dCB3aXRoIGFsbCBsb3dlcmNhc2Uga2V5cy4iIiIKICAgICAgICByZXR1cm4gKAogICAgICAgICAgICAobG93ZXJrZXksIGtleXZhbFsxXSkKICAgICAgICAgICAgZm9yIChsb3dlcmtleSwga2V5dmFsKQogICAgICAgICAgICBpbiBzZWxmLl9zdG9yZS5pdGVtcygpCiAgICAgICAgKQoKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIGNvbGxlY3Rpb25zLk1hcHBpbmcpOgogICAgICAgICAgICBvdGhlciA9IENhc2VJbnNlbnNpdGl2ZURpY3Qob3RoZXIpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCiAgICAgICAgIyBDb21wYXJlIGluc2Vuc2l0aXZlbHkKICAgICAgICByZXR1cm4gZGljdChzZWxmLmxvd2VyX2l0ZW1zKCkpID09IGRpY3Qob3RoZXIubG93ZXJfaXRlbXMoKSkKCiAgICAjIENvcHkgaXMgcmVxdWlyZWQKICAgIGRlZiBjb3B5KHNlbGYpOgogICAgICAgIHJldHVybiBDYXNlSW5zZW5zaXRpdmVEaWN0KHNlbGYuX3N0b3JlLnZhbHVlcygpKQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gc3RyKGRpY3Qoc2VsZi5pdGVtcygpKSkKCgpjbGFzcyBMb29rdXBEaWN0KGRpY3QpOgogICAgIiIiRGljdGlvbmFyeSBsb29rdXAgb2JqZWN0LiIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lPU5vbmUpOgogICAgICAgIHNlbGYubmFtZSA9IG5hbWUKICAgICAgICBzdXBlcihMb29rdXBEaWN0LCBzZWxmKS5fX2luaXRfXygpCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAnPGxvb2t1cCBcJyVzXCc+JyAlIChzZWxmLm5hbWUpCgogICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CiAgICAgICAgIyBXZSBhbGxvdyBmYWxsLXRocm91Z2ggaGVyZSwgc28gdmFsdWVzIGRlZmF1bHQgdG8gTm9uZQoKICAgICAgICByZXR1cm4gc2VsZi5fX2RpY3RfXy5nZXQoa2V5LCBOb25lKQoKICAgIGRlZiBnZXQoc2VsZiwga2V5LCBkZWZhdWx0PU5vbmUpOgogICAgICAgIHJldHVybiBzZWxmLl9fZGljdF9fLmdldChrZXksIGRlZmF1bHQpClBLAwQUAAAAAAAAACEAR8HZVwRsAAAEbAAAOgAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvdXRpbHMucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQoKIiIiCnJlcXVlc3RzLnV0aWxzCn5+fn5+fn5+fn5+fn5+CgpUaGlzIG1vZHVsZSBwcm92aWRlcyB1dGlsaXR5IGZ1bmN0aW9ucyB0aGF0IGFyZSB1c2VkIHdpdGhpbiBSZXF1ZXN0cwp0aGF0IGFyZSBhbHNvIHVzZWZ1bCBmb3IgZXh0ZXJuYWwgY29uc3VtcHRpb24uCiIiIgoKaW1wb3J0IGNnaQppbXBvcnQgY29kZWNzCmltcG9ydCBjb2xsZWN0aW9ucwppbXBvcnQgY29udGV4dGxpYgppbXBvcnQgaW8KaW1wb3J0IG9zCmltcG9ydCBwbGF0Zm9ybQppbXBvcnQgcmUKaW1wb3J0IHNvY2tldAppbXBvcnQgc3RydWN0CmltcG9ydCB3YXJuaW5ncwoKZnJvbSAuX192ZXJzaW9uX18gaW1wb3J0IF9fdmVyc2lvbl9fCmZyb20gLiBpbXBvcnQgY2VydHMKIyB0b19uYXRpdmVfc3RyaW5nIGlzIHVudXNlZCBoZXJlLCBidXQgaW1wb3J0ZWQgaGVyZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKZnJvbSAuX2ludGVybmFsX3V0aWxzIGltcG9ydCB0b19uYXRpdmVfc3RyaW5nCmZyb20gLmNvbXBhdCBpbXBvcnQgcGFyc2VfaHR0cF9saXN0IGFzIF9wYXJzZV9saXN0X2hlYWRlcgpmcm9tIC5jb21wYXQgaW1wb3J0ICgKICAgIHF1b3RlLCB1cmxwYXJzZSwgYnl0ZXMsIHN0ciwgT3JkZXJlZERpY3QsIHVucXVvdGUsIGdldHByb3hpZXMsCiAgICBwcm94eV9ieXBhc3MsIHVybHVucGFyc2UsIGJhc2VzdHJpbmcsIGludGVnZXJfdHlwZXMsIGlzX3B5MywKICAgIHByb3h5X2J5cGFzc19lbnZpcm9ubWVudCwgZ2V0cHJveGllc19lbnZpcm9ubWVudCkKZnJvbSAuY29va2llcyBpbXBvcnQgY29va2llamFyX2Zyb21fZGljdApmcm9tIC5zdHJ1Y3R1cmVzIGltcG9ydCBDYXNlSW5zZW5zaXRpdmVEaWN0CmZyb20gLmV4Y2VwdGlvbnMgaW1wb3J0ICgKICAgIEludmFsaWRVUkwsIEludmFsaWRIZWFkZXIsIEZpbGVNb2RlV2FybmluZywgVW5yZXdpbmRhYmxlQm9keUVycm9yKQoKTkVUUkNfRklMRVMgPSAoJy5uZXRyYycsICdfbmV0cmMnKQoKREVGQVVMVF9DQV9CVU5ETEVfUEFUSCA9IGNlcnRzLndoZXJlKCkKCgppZiBwbGF0Zm9ybS5zeXN0ZW0oKSA9PSAnV2luZG93cyc6CiAgICAjIHByb3ZpZGUgYSBwcm94eV9ieXBhc3MgdmVyc2lvbiBvbiBXaW5kb3dzIHdpdGhvdXQgRE5TIGxvb2t1cHMKCiAgICBkZWYgcHJveHlfYnlwYXNzX3JlZ2lzdHJ5KGhvc3QpOgogICAgICAgIGlmIGlzX3B5MzoKICAgICAgICAgICAgaW1wb3J0IHdpbnJlZwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGltcG9ydCBfd2lucmVnIGFzIHdpbnJlZwogICAgICAgIHRyeToKICAgICAgICAgICAgaW50ZXJuZXRTZXR0aW5ncyA9IHdpbnJlZy5PcGVuS2V5KHdpbnJlZy5IS0VZX0NVUlJFTlRfVVNFUiwKICAgICAgICAgICAgICAgIHInU29mdHdhcmVcTWljcm9zb2Z0XFdpbmRvd3NcQ3VycmVudFZlcnNpb25cSW50ZXJuZXQgU2V0dGluZ3MnKQogICAgICAgICAgICBwcm94eUVuYWJsZSA9IHdpbnJlZy5RdWVyeVZhbHVlRXgoaW50ZXJuZXRTZXR0aW5ncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQcm94eUVuYWJsZScpWzBdCiAgICAgICAgICAgIHByb3h5T3ZlcnJpZGUgPSB3aW5yZWcuUXVlcnlWYWx1ZUV4KGludGVybmV0U2V0dGluZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQcm94eU92ZXJyaWRlJylbMF0KICAgICAgICBleGNlcHQgT1NFcnJvcjoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgaWYgbm90IHByb3h5RW5hYmxlIG9yIG5vdCBwcm94eU92ZXJyaWRlOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgIyBtYWtlIGEgY2hlY2sgdmFsdWUgbGlzdCBmcm9tIHRoZSByZWdpc3RyeSBlbnRyeTogcmVwbGFjZSB0aGUKICAgICAgICAjICc8bG9jYWw+JyBzdHJpbmcgYnkgdGhlIGxvY2FsaG9zdCBlbnRyeSBhbmQgdGhlIGNvcnJlc3BvbmRpbmcKICAgICAgICAjIGNhbm9uaWNhbCBlbnRyeS4KICAgICAgICBwcm94eU92ZXJyaWRlID0gcHJveHlPdmVycmlkZS5zcGxpdCgnOycpCiAgICAgICAgIyBub3cgY2hlY2sgaWYgd2UgbWF0Y2ggb25lIG9mIHRoZSByZWdpc3RyeSB2YWx1ZXMuCiAgICAgICAgZm9yIHRlc3QgaW4gcHJveHlPdmVycmlkZToKICAgICAgICAgICAgaWYgdGVzdCA9PSAnPGxvY2FsPic6CiAgICAgICAgICAgICAgICBpZiAnLicgbm90IGluIGhvc3Q6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICAgICAgdGVzdCA9IHRlc3QucmVwbGFjZSgiLiIsIHIiXC4iKSAgICAgIyBtYXNrIGRvdHMKICAgICAgICAgICAgdGVzdCA9IHRlc3QucmVwbGFjZSgiKiIsIHIiLioiKSAgICAgIyBjaGFuZ2UgZ2xvYiBzZXF1ZW5jZQogICAgICAgICAgICB0ZXN0ID0gdGVzdC5yZXBsYWNlKCI/IiwgciIuIikgICAgICAjIGNoYW5nZSBnbG9iIGNoYXIKICAgICAgICAgICAgaWYgcmUubWF0Y2godGVzdCwgaG9zdCwgcmUuSSk6CiAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGRlZiBwcm94eV9ieXBhc3MoaG9zdCk6ICAjIG5vcWEKICAgICAgICAiIiJSZXR1cm4gVHJ1ZSwgaWYgdGhlIGhvc3Qgc2hvdWxkIGJlIGJ5cGFzc2VkLgoKICAgICAgICBDaGVja3MgcHJveHkgc2V0dGluZ3MgZ2F0aGVyZWQgZnJvbSB0aGUgZW52aXJvbm1lbnQsIGlmIHNwZWNpZmllZCwKICAgICAgICBvciB0aGUgcmVnaXN0cnkuCiAgICAgICAgIiIiCiAgICAgICAgaWYgZ2V0cHJveGllc19lbnZpcm9ubWVudCgpOgogICAgICAgICAgICByZXR1cm4gcHJveHlfYnlwYXNzX2Vudmlyb25tZW50KGhvc3QpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHByb3h5X2J5cGFzc19yZWdpc3RyeShob3N0KQoKCmRlZiBkaWN0X3RvX3NlcXVlbmNlKGQpOgogICAgIiIiUmV0dXJucyBhbiBpbnRlcm5hbCBzZXF1ZW5jZSBkaWN0aW9uYXJ5IHVwZGF0ZS4iIiIKCiAgICBpZiBoYXNhdHRyKGQsICdpdGVtcycpOgogICAgICAgIGQgPSBkLml0ZW1zKCkKCiAgICByZXR1cm4gZAoKCmRlZiBzdXBlcl9sZW4obyk6CiAgICB0b3RhbF9sZW5ndGggPSBOb25lCiAgICBjdXJyZW50X3Bvc2l0aW9uID0gMAoKICAgIGlmIGhhc2F0dHIobywgJ19fbGVuX18nKToKICAgICAgICB0b3RhbF9sZW5ndGggPSBsZW4obykKCiAgICBlbGlmIGhhc2F0dHIobywgJ2xlbicpOgogICAgICAgIHRvdGFsX2xlbmd0aCA9IG8ubGVuCgogICAgZWxpZiBoYXNhdHRyKG8sICdmaWxlbm8nKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIGZpbGVubyA9IG8uZmlsZW5vKCkKICAgICAgICBleGNlcHQgaW8uVW5zdXBwb3J0ZWRPcGVyYXRpb246CiAgICAgICAgICAgIHBhc3MKICAgICAgICBlbHNlOgogICAgICAgICAgICB0b3RhbF9sZW5ndGggPSBvcy5mc3RhdChmaWxlbm8pLnN0X3NpemUKCiAgICAgICAgICAgICMgSGF2aW5nIHVzZWQgZnN0YXQgdG8gZGV0ZXJtaW5lIHRoZSBmaWxlIGxlbmd0aCwgd2UgbmVlZCB0bwogICAgICAgICAgICAjIGNvbmZpcm0gdGhhdCB0aGlzIGZpbGUgd2FzIG9wZW5lZCB1cCBpbiBiaW5hcnkgbW9kZS4KICAgICAgICAgICAgaWYgJ2InIG5vdCBpbiBvLm1vZGU6CiAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCgKICAgICAgICAgICAgICAgICAgICAiUmVxdWVzdHMgaGFzIGRldGVybWluZWQgdGhlIGNvbnRlbnQtbGVuZ3RoIGZvciB0aGlzICIKICAgICAgICAgICAgICAgICAgICAicmVxdWVzdCB1c2luZyB0aGUgYmluYXJ5IHNpemUgb2YgdGhlIGZpbGU6IGhvd2V2ZXIsIHRoZSAiCiAgICAgICAgICAgICAgICAgICAgImZpbGUgaGFzIGJlZW4gb3BlbmVkIGluIHRleHQgbW9kZSAoaS5lLiB3aXRob3V0IHRoZSAnYicgIgogICAgICAgICAgICAgICAgICAgICJmbGFnIGluIHRoZSBtb2RlKS4gVGhpcyBtYXkgbGVhZCB0byBhbiBpbmNvcnJlY3QgIgogICAgICAgICAgICAgICAgICAgICJjb250ZW50LWxlbmd0aC4gSW4gUmVxdWVzdHMgMy4wLCBzdXBwb3J0IHdpbGwgYmUgcmVtb3ZlZCAiCiAgICAgICAgICAgICAgICAgICAgImZvciBmaWxlcyBpbiB0ZXh0IG1vZGUuIiksCiAgICAgICAgICAgICAgICAgICAgRmlsZU1vZGVXYXJuaW5nCiAgICAgICAgICAgICAgICApCgogICAgaWYgaGFzYXR0cihvLCAndGVsbCcpOgogICAgICAgIHRyeToKICAgICAgICAgICAgY3VycmVudF9wb3NpdGlvbiA9IG8udGVsbCgpCiAgICAgICAgZXhjZXB0IChPU0Vycm9yLCBJT0Vycm9yKToKICAgICAgICAgICAgIyBUaGlzIGNhbiBoYXBwZW4gaW4gc29tZSB3ZWlyZCBzaXR1YXRpb25zLCBzdWNoIGFzIHdoZW4gdGhlIGZpbGUKICAgICAgICAgICAgIyBpcyBhY3R1YWxseSBhIHNwZWNpYWwgZmlsZSBkZXNjcmlwdG9yIGxpa2Ugc3RkaW4uIEluIHRoaXMKICAgICAgICAgICAgIyBpbnN0YW5jZSwgd2UgZG9uJ3Qga25vdyB3aGF0IHRoZSBsZW5ndGggaXMsIHNvIHNldCBpdCB0byB6ZXJvIGFuZAogICAgICAgICAgICAjIGxldCByZXF1ZXN0cyBjaHVuayBpdCBpbnN0ZWFkLgogICAgICAgICAgICBpZiB0b3RhbF9sZW5ndGggaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBjdXJyZW50X3Bvc2l0aW9uID0gdG90YWxfbGVuZ3RoCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaWYgaGFzYXR0cihvLCAnc2VlaycpIGFuZCB0b3RhbF9sZW5ndGggaXMgTm9uZToKICAgICAgICAgICAgICAgICMgU3RyaW5nSU8gYW5kIEJ5dGVzSU8gaGF2ZSBzZWVrIGJ1dCBubyB1c2VhYmxlIGZpbGVubwogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICMgc2VlayB0byBlbmQgb2YgZmlsZQogICAgICAgICAgICAgICAgICAgIG8uc2VlaygwLCAyKQogICAgICAgICAgICAgICAgICAgIHRvdGFsX2xlbmd0aCA9IG8udGVsbCgpCgogICAgICAgICAgICAgICAgICAgICMgc2VlayBiYWNrIHRvIGN1cnJlbnQgcG9zaXRpb24gdG8gc3VwcG9ydAogICAgICAgICAgICAgICAgICAgICMgcGFydGlhbGx5IHJlYWQgZmlsZS1saWtlIG9iamVjdHMKICAgICAgICAgICAgICAgICAgICBvLnNlZWsoY3VycmVudF9wb3NpdGlvbiBvciAwKQogICAgICAgICAgICAgICAgZXhjZXB0IChPU0Vycm9yLCBJT0Vycm9yKToKICAgICAgICAgICAgICAgICAgICB0b3RhbF9sZW5ndGggPSAwCgogICAgaWYgdG90YWxfbGVuZ3RoIGlzIE5vbmU6CiAgICAgICAgdG90YWxfbGVuZ3RoID0gMAoKICAgIHJldHVybiBtYXgoMCwgdG90YWxfbGVuZ3RoIC0gY3VycmVudF9wb3NpdGlvbikKCgpkZWYgZ2V0X25ldHJjX2F1dGgodXJsLCByYWlzZV9lcnJvcnM9RmFsc2UpOgogICAgIiIiUmV0dXJucyB0aGUgUmVxdWVzdHMgdHVwbGUgYXV0aCBmb3IgYSBnaXZlbiB1cmwgZnJvbSBuZXRyYy4iIiIKCiAgICB0cnk6CiAgICAgICAgZnJvbSBuZXRyYyBpbXBvcnQgbmV0cmMsIE5ldHJjUGFyc2VFcnJvcgoKICAgICAgICBuZXRyY19wYXRoID0gTm9uZQoKICAgICAgICBmb3IgZiBpbiBORVRSQ19GSUxFUzoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgbG9jID0gb3MucGF0aC5leHBhbmR1c2VyKCd+L3swfScuZm9ybWF0KGYpKQogICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgICAgICAjIG9zLnBhdGguZXhwYW5kdXNlciBjYW4gZmFpbCB3aGVuICRIT01FIGlzIHVuZGVmaW5lZCBhbmQKICAgICAgICAgICAgICAgICMgZ2V0cHd1aWQgZmFpbHMuIFNlZSBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMjAxNjQgJgogICAgICAgICAgICAgICAgIyBodHRwczovL2dpdGh1Yi5jb20vcmVxdWVzdHMvcmVxdWVzdHMvaXNzdWVzLzE4NDYKICAgICAgICAgICAgICAgIHJldHVybgoKICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMobG9jKToKICAgICAgICAgICAgICAgIG5ldHJjX3BhdGggPSBsb2MKICAgICAgICAgICAgICAgIGJyZWFrCgogICAgICAgICMgQWJvcnQgZWFybHkgaWYgdGhlcmUgaXNuJ3Qgb25lLgogICAgICAgIGlmIG5ldHJjX3BhdGggaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIHJpID0gdXJscGFyc2UodXJsKQoKICAgICAgICAjIFN0cmlwIHBvcnQgbnVtYmVycyBmcm9tIG5ldGxvYy4gVGhpcyB3ZWlyZCBgaWYuLi5lbmNvZGVgYCBkYW5jZSBpcwogICAgICAgICMgdXNlZCBmb3IgUHl0aG9uIDMuMiwgd2hpY2ggZG9lc24ndCBzdXBwb3J0IHVuaWNvZGUgbGl0ZXJhbHMuCiAgICAgICAgc3BsaXRzdHIgPSBiJzonCiAgICAgICAgaWYgaXNpbnN0YW5jZSh1cmwsIHN0cik6CiAgICAgICAgICAgIHNwbGl0c3RyID0gc3BsaXRzdHIuZGVjb2RlKCdhc2NpaScpCiAgICAgICAgaG9zdCA9IHJpLm5ldGxvYy5zcGxpdChzcGxpdHN0cilbMF0KCiAgICAgICAgdHJ5OgogICAgICAgICAgICBfbmV0cmMgPSBuZXRyYyhuZXRyY19wYXRoKS5hdXRoZW50aWNhdG9ycyhob3N0KQogICAgICAgICAgICBpZiBfbmV0cmM6CiAgICAgICAgICAgICAgICAjIFJldHVybiB3aXRoIGxvZ2luIC8gcGFzc3dvcmQKICAgICAgICAgICAgICAgIGxvZ2luX2kgPSAoMCBpZiBfbmV0cmNbMF0gZWxzZSAxKQogICAgICAgICAgICAgICAgcmV0dXJuIChfbmV0cmNbbG9naW5faV0sIF9uZXRyY1syXSkKICAgICAgICBleGNlcHQgKE5ldHJjUGFyc2VFcnJvciwgSU9FcnJvcik6CiAgICAgICAgICAgICMgSWYgdGhlcmUgd2FzIGEgcGFyc2luZyBlcnJvciBvciBhIHBlcm1pc3Npb25zIGlzc3VlIHJlYWRpbmcgdGhlIGZpbGUsCiAgICAgICAgICAgICMgd2UnbGwganVzdCBza2lwIG5ldHJjIGF1dGggdW5sZXNzIGV4cGxpY2l0bHkgYXNrZWQgdG8gcmFpc2UgZXJyb3JzLgogICAgICAgICAgICBpZiByYWlzZV9lcnJvcnM6CiAgICAgICAgICAgICAgICByYWlzZQoKICAgICMgQXBwRW5naW5lIGhhY2tpbmVzcy4KICAgIGV4Y2VwdCAoSW1wb3J0RXJyb3IsIEF0dHJpYnV0ZUVycm9yKToKICAgICAgICBwYXNzCgoKZGVmIGd1ZXNzX2ZpbGVuYW1lKG9iaik6CiAgICAiIiJUcmllcyB0byBndWVzcyB0aGUgZmlsZW5hbWUgb2YgdGhlIGdpdmVuIG9iamVjdC4iIiIKICAgIG5hbWUgPSBnZXRhdHRyKG9iaiwgJ25hbWUnLCBOb25lKQogICAgaWYgKG5hbWUgYW5kIGlzaW5zdGFuY2UobmFtZSwgYmFzZXN0cmluZykgYW5kIG5hbWVbMF0gIT0gJzwnIGFuZAogICAgICAgICAgICBuYW1lWy0xXSAhPSAnPicpOgogICAgICAgIHJldHVybiBvcy5wYXRoLmJhc2VuYW1lKG5hbWUpCgoKZGVmIGZyb21fa2V5X3ZhbF9saXN0KHZhbHVlKToKICAgICIiIlRha2UgYW4gb2JqZWN0IGFuZCB0ZXN0IHRvIHNlZSBpZiBpdCBjYW4gYmUgcmVwcmVzZW50ZWQgYXMgYQogICAgZGljdGlvbmFyeS4gVW5sZXNzIGl0IGNhbiBub3QgYmUgcmVwcmVzZW50ZWQgYXMgc3VjaCwgcmV0dXJuIGFuCiAgICBPcmRlcmVkRGljdCwgZS5nLiwKCiAgICA6OgoKICAgICAgICA+Pj4gZnJvbV9rZXlfdmFsX2xpc3QoWygna2V5JywgJ3ZhbCcpXSkKICAgICAgICBPcmRlcmVkRGljdChbKCdrZXknLCAndmFsJyldKQogICAgICAgID4+PiBmcm9tX2tleV92YWxfbGlzdCgnc3RyaW5nJykKICAgICAgICBWYWx1ZUVycm9yOiBuZWVkIG1vcmUgdGhhbiAxIHZhbHVlIHRvIHVucGFjawogICAgICAgID4+PiBmcm9tX2tleV92YWxfbGlzdCh7J2tleSc6ICd2YWwnfSkKICAgICAgICBPcmRlcmVkRGljdChbKCdrZXknLCAndmFsJyldKQoKICAgIDpydHlwZTogT3JkZXJlZERpY3QKICAgICIiIgogICAgaWYgdmFsdWUgaXMgTm9uZToKICAgICAgICByZXR1cm4gTm9uZQoKICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIChzdHIsIGJ5dGVzLCBib29sLCBpbnQpKToKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdjYW5ub3QgZW5jb2RlIG9iamVjdHMgdGhhdCBhcmUgbm90IDItdHVwbGVzJykKCiAgICByZXR1cm4gT3JkZXJlZERpY3QodmFsdWUpCgoKZGVmIHRvX2tleV92YWxfbGlzdCh2YWx1ZSk6CiAgICAiIiJUYWtlIGFuIG9iamVjdCBhbmQgdGVzdCB0byBzZWUgaWYgaXQgY2FuIGJlIHJlcHJlc2VudGVkIGFzIGEKICAgIGRpY3Rpb25hcnkuIElmIGl0IGNhbiBiZSwgcmV0dXJuIGEgbGlzdCBvZiB0dXBsZXMsIGUuZy4sCgogICAgOjoKCiAgICAgICAgPj4+IHRvX2tleV92YWxfbGlzdChbKCdrZXknLCAndmFsJyldKQogICAgICAgIFsoJ2tleScsICd2YWwnKV0KICAgICAgICA+Pj4gdG9fa2V5X3ZhbF9saXN0KHsna2V5JzogJ3ZhbCd9KQogICAgICAgIFsoJ2tleScsICd2YWwnKV0KICAgICAgICA+Pj4gdG9fa2V5X3ZhbF9saXN0KCdzdHJpbmcnKQogICAgICAgIFZhbHVlRXJyb3I6IGNhbm5vdCBlbmNvZGUgb2JqZWN0cyB0aGF0IGFyZSBub3QgMi10dXBsZXMuCgogICAgOnJ0eXBlOiBsaXN0CiAgICAiIiIKICAgIGlmIHZhbHVlIGlzIE5vbmU6CiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCAoc3RyLCBieXRlcywgYm9vbCwgaW50KSk6CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignY2Fubm90IGVuY29kZSBvYmplY3RzIHRoYXQgYXJlIG5vdCAyLXR1cGxlcycpCgogICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgY29sbGVjdGlvbnMuTWFwcGluZyk6CiAgICAgICAgdmFsdWUgPSB2YWx1ZS5pdGVtcygpCgogICAgcmV0dXJuIGxpc3QodmFsdWUpCgoKIyBGcm9tIG1pdHN1aGlrby93ZXJremV1ZyAodXNlZCB3aXRoIHBlcm1pc3Npb24pLgpkZWYgcGFyc2VfbGlzdF9oZWFkZXIodmFsdWUpOgogICAgIiIiUGFyc2UgbGlzdHMgYXMgZGVzY3JpYmVkIGJ5IFJGQyAyMDY4IFNlY3Rpb24gMi4KCiAgICBJbiBwYXJ0aWN1bGFyLCBwYXJzZSBjb21tYS1zZXBhcmF0ZWQgbGlzdHMgd2hlcmUgdGhlIGVsZW1lbnRzIG9mCiAgICB0aGUgbGlzdCBtYXkgaW5jbHVkZSBxdW90ZWQtc3RyaW5ncy4gIEEgcXVvdGVkLXN0cmluZyBjb3VsZAogICAgY29udGFpbiBhIGNvbW1hLiAgQSBub24tcXVvdGVkIHN0cmluZyBjb3VsZCBoYXZlIHF1b3RlcyBpbiB0aGUKICAgIG1pZGRsZS4gIFF1b3RlcyBhcmUgcmVtb3ZlZCBhdXRvbWF0aWNhbGx5IGFmdGVyIHBhcnNpbmcuCgogICAgSXQgYmFzaWNhbGx5IHdvcmtzIGxpa2UgOmZ1bmM6YHBhcnNlX3NldF9oZWFkZXJgIGp1c3QgdGhhdCBpdGVtcwogICAgbWF5IGFwcGVhciBtdWx0aXBsZSB0aW1lcyBhbmQgY2FzZSBzZW5zaXRpdml0eSBpcyBwcmVzZXJ2ZWQuCgogICAgVGhlIHJldHVybiB2YWx1ZSBpcyBhIHN0YW5kYXJkIDpjbGFzczpgbGlzdGA6CgogICAgPj4+IHBhcnNlX2xpc3RfaGVhZGVyKCd0b2tlbiwgInF1b3RlZCB2YWx1ZSInKQogICAgWyd0b2tlbicsICdxdW90ZWQgdmFsdWUnXQoKICAgIFRvIGNyZWF0ZSBhIGhlYWRlciBmcm9tIHRoZSA6Y2xhc3M6YGxpc3RgIGFnYWluLCB1c2UgdGhlCiAgICA6ZnVuYzpgZHVtcF9oZWFkZXJgIGZ1bmN0aW9uLgoKICAgIDpwYXJhbSB2YWx1ZTogYSBzdHJpbmcgd2l0aCBhIGxpc3QgaGVhZGVyLgogICAgOnJldHVybjogOmNsYXNzOmBsaXN0YAogICAgOnJ0eXBlOiBsaXN0CiAgICAiIiIKICAgIHJlc3VsdCA9IFtdCiAgICBmb3IgaXRlbSBpbiBfcGFyc2VfbGlzdF9oZWFkZXIodmFsdWUpOgogICAgICAgIGlmIGl0ZW1bOjFdID09IGl0ZW1bLTE6XSA9PSAnIic6CiAgICAgICAgICAgIGl0ZW0gPSB1bnF1b3RlX2hlYWRlcl92YWx1ZShpdGVtWzE6LTFdKQogICAgICAgIHJlc3VsdC5hcHBlbmQoaXRlbSkKICAgIHJldHVybiByZXN1bHQKCgojIEZyb20gbWl0c3VoaWtvL3dlcmt6ZXVnICh1c2VkIHdpdGggcGVybWlzc2lvbikuCmRlZiBwYXJzZV9kaWN0X2hlYWRlcih2YWx1ZSk6CiAgICAiIiJQYXJzZSBsaXN0cyBvZiBrZXksIHZhbHVlIHBhaXJzIGFzIGRlc2NyaWJlZCBieSBSRkMgMjA2OCBTZWN0aW9uIDIgYW5kCiAgICBjb252ZXJ0IHRoZW0gaW50byBhIHB5dGhvbiBkaWN0OgoKICAgID4+PiBkID0gcGFyc2VfZGljdF9oZWFkZXIoJ2Zvbz0iaXMgYSBmaXNoIiwgYmFyPSJhcyB3ZWxsIicpCiAgICA+Pj4gdHlwZShkKSBpcyBkaWN0CiAgICBUcnVlCiAgICA+Pj4gc29ydGVkKGQuaXRlbXMoKSkKICAgIFsoJ2JhcicsICdhcyB3ZWxsJyksICgnZm9vJywgJ2lzIGEgZmlzaCcpXQoKICAgIElmIHRoZXJlIGlzIG5vIHZhbHVlIGZvciBhIGtleSBpdCB3aWxsIGJlIGBOb25lYDoKCiAgICA+Pj4gcGFyc2VfZGljdF9oZWFkZXIoJ2tleV93aXRob3V0X3ZhbHVlJykKICAgIHsna2V5X3dpdGhvdXRfdmFsdWUnOiBOb25lfQoKICAgIFRvIGNyZWF0ZSBhIGhlYWRlciBmcm9tIHRoZSA6Y2xhc3M6YGRpY3RgIGFnYWluLCB1c2UgdGhlCiAgICA6ZnVuYzpgZHVtcF9oZWFkZXJgIGZ1bmN0aW9uLgoKICAgIDpwYXJhbSB2YWx1ZTogYSBzdHJpbmcgd2l0aCBhIGRpY3QgaGVhZGVyLgogICAgOnJldHVybjogOmNsYXNzOmBkaWN0YAogICAgOnJ0eXBlOiBkaWN0CiAgICAiIiIKICAgIHJlc3VsdCA9IHt9CiAgICBmb3IgaXRlbSBpbiBfcGFyc2VfbGlzdF9oZWFkZXIodmFsdWUpOgogICAgICAgIGlmICc9JyBub3QgaW4gaXRlbToKICAgICAgICAgICAgcmVzdWx0W2l0ZW1dID0gTm9uZQogICAgICAgICAgICBjb250aW51ZQogICAgICAgIG5hbWUsIHZhbHVlID0gaXRlbS5zcGxpdCgnPScsIDEpCiAgICAgICAgaWYgdmFsdWVbOjFdID09IHZhbHVlWy0xOl0gPT0gJyInOgogICAgICAgICAgICB2YWx1ZSA9IHVucXVvdGVfaGVhZGVyX3ZhbHVlKHZhbHVlWzE6LTFdKQogICAgICAgIHJlc3VsdFtuYW1lXSA9IHZhbHVlCiAgICByZXR1cm4gcmVzdWx0CgoKIyBGcm9tIG1pdHN1aGlrby93ZXJremV1ZyAodXNlZCB3aXRoIHBlcm1pc3Npb24pLgpkZWYgdW5xdW90ZV9oZWFkZXJfdmFsdWUodmFsdWUsIGlzX2ZpbGVuYW1lPUZhbHNlKToKICAgIHIiIiJVbnF1b3RlcyBhIGhlYWRlciB2YWx1ZS4gIChSZXZlcnNhbCBvZiA6ZnVuYzpgcXVvdGVfaGVhZGVyX3ZhbHVlYCkuCiAgICBUaGlzIGRvZXMgbm90IHVzZSB0aGUgcmVhbCB1bnF1b3RpbmcgYnV0IHdoYXQgYnJvd3NlcnMgYXJlIGFjdHVhbGx5CiAgICB1c2luZyBmb3IgcXVvdGluZy4KCiAgICA6cGFyYW0gdmFsdWU6IHRoZSBoZWFkZXIgdmFsdWUgdG8gdW5xdW90ZS4KICAgIDpydHlwZTogc3RyCiAgICAiIiIKICAgIGlmIHZhbHVlIGFuZCB2YWx1ZVswXSA9PSB2YWx1ZVstMV0gPT0gJyInOgogICAgICAgICMgdGhpcyBpcyBub3QgdGhlIHJlYWwgdW5xdW90aW5nLCBidXQgZml4aW5nIHRoaXMgc28gdGhhdCB0aGUKICAgICAgICAjIFJGQyBpcyBtZXQgd2lsbCByZXN1bHQgaW4gYnVncyB3aXRoIGludGVybmV0IGV4cGxvcmVyIGFuZAogICAgICAgICMgcHJvYmFibHkgc29tZSBvdGhlciBicm93c2VycyBhcyB3ZWxsLiAgSUUgZm9yIGV4YW1wbGUgaXMKICAgICAgICAjIHVwbG9hZGluZyBmaWxlcyB3aXRoICJDOlxmb29cYmFyLnR4dCIgYXMgZmlsZW5hbWUKICAgICAgICB2YWx1ZSA9IHZhbHVlWzE6LTFdCgogICAgICAgICMgaWYgdGhpcyBpcyBhIGZpbGVuYW1lIGFuZCB0aGUgc3RhcnRpbmcgY2hhcmFjdGVycyBsb29rIGxpa2UKICAgICAgICAjIGEgVU5DIHBhdGgsIHRoZW4ganVzdCByZXR1cm4gdGhlIHZhbHVlIHdpdGhvdXQgcXVvdGVzLiAgVXNpbmcgdGhlCiAgICAgICAgIyByZXBsYWNlIHNlcXVlbmNlIGJlbG93IG9uIGEgVU5DIHBhdGggaGFzIHRoZSBlZmZlY3Qgb2YgdHVybmluZwogICAgICAgICMgdGhlIGxlYWRpbmcgZG91YmxlIHNsYXNoIGludG8gYSBzaW5nbGUgc2xhc2ggYW5kIHRoZW4KICAgICAgICAjIF9maXhfaWVfZmlsZW5hbWUoKSBkb2Vzbid0IHdvcmsgY29ycmVjdGx5LiAgU2VlICM0NTguCiAgICAgICAgaWYgbm90IGlzX2ZpbGVuYW1lIG9yIHZhbHVlWzoyXSAhPSAnXFxcXCc6CiAgICAgICAgICAgIHJldHVybiB2YWx1ZS5yZXBsYWNlKCdcXFxcJywgJ1xcJykucmVwbGFjZSgnXFwiJywgJyInKQogICAgcmV0dXJuIHZhbHVlCgoKZGVmIGRpY3RfZnJvbV9jb29raWVqYXIoY2opOgogICAgIiIiUmV0dXJucyBhIGtleS92YWx1ZSBkaWN0aW9uYXJ5IGZyb20gYSBDb29raWVKYXIuCgogICAgOnBhcmFtIGNqOiBDb29raWVKYXIgb2JqZWN0IHRvIGV4dHJhY3QgY29va2llcyBmcm9tLgogICAgOnJ0eXBlOiBkaWN0CiAgICAiIiIKCiAgICBjb29raWVfZGljdCA9IHt9CgogICAgZm9yIGNvb2tpZSBpbiBjajoKICAgICAgICBjb29raWVfZGljdFtjb29raWUubmFtZV0gPSBjb29raWUudmFsdWUKCiAgICByZXR1cm4gY29va2llX2RpY3QKCgpkZWYgYWRkX2RpY3RfdG9fY29va2llamFyKGNqLCBjb29raWVfZGljdCk6CiAgICAiIiJSZXR1cm5zIGEgQ29va2llSmFyIGZyb20gYSBrZXkvdmFsdWUgZGljdGlvbmFyeS4KCiAgICA6cGFyYW0gY2o6IENvb2tpZUphciB0byBpbnNlcnQgY29va2llcyBpbnRvLgogICAgOnBhcmFtIGNvb2tpZV9kaWN0OiBEaWN0IG9mIGtleS92YWx1ZXMgdG8gaW5zZXJ0IGludG8gQ29va2llSmFyLgogICAgOnJ0eXBlOiBDb29raWVKYXIKICAgICIiIgoKICAgIHJldHVybiBjb29raWVqYXJfZnJvbV9kaWN0KGNvb2tpZV9kaWN0LCBjaikKCgpkZWYgZ2V0X2VuY29kaW5nc19mcm9tX2NvbnRlbnQoY29udGVudCk6CiAgICAiIiJSZXR1cm5zIGVuY29kaW5ncyBmcm9tIGdpdmVuIGNvbnRlbnQgc3RyaW5nLgoKICAgIDpwYXJhbSBjb250ZW50OiBieXRlc3RyaW5nIHRvIGV4dHJhY3QgZW5jb2RpbmdzIGZyb20uCiAgICAiIiIKICAgIHdhcm5pbmdzLndhcm4oKAogICAgICAgICdJbiByZXF1ZXN0cyAzLjAsIGdldF9lbmNvZGluZ3NfZnJvbV9jb250ZW50IHdpbGwgYmUgcmVtb3ZlZC4gRm9yICcKICAgICAgICAnbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHNlZSB0aGUgZGlzY3Vzc2lvbiBvbiBpc3N1ZSAjMjI2Ni4gKFRoaXMnCiAgICAgICAgJyB3YXJuaW5nIHNob3VsZCBvbmx5IGFwcGVhciBvbmNlLiknKSwKICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcpCgogICAgY2hhcnNldF9yZSA9IHJlLmNvbXBpbGUocic8bWV0YS4qP2NoYXJzZXQ9WyJcJ10qKC4rPylbIlwnPl0nLCBmbGFncz1yZS5JKQogICAgcHJhZ21hX3JlID0gcmUuY29tcGlsZShyJzxtZXRhLio/Y29udGVudD1bIlwnXSo7P2NoYXJzZXQ9KC4rPylbIlwnPl0nLCBmbGFncz1yZS5JKQogICAgeG1sX3JlID0gcmUuY29tcGlsZShyJ148XD94bWwuKj9lbmNvZGluZz1bIlwnXSooLis/KVsiXCc+XScpCgogICAgcmV0dXJuIChjaGFyc2V0X3JlLmZpbmRhbGwoY29udGVudCkgKwogICAgICAgICAgICBwcmFnbWFfcmUuZmluZGFsbChjb250ZW50KSArCiAgICAgICAgICAgIHhtbF9yZS5maW5kYWxsKGNvbnRlbnQpKQoKCmRlZiBnZXRfZW5jb2RpbmdfZnJvbV9oZWFkZXJzKGhlYWRlcnMpOgogICAgIiIiUmV0dXJucyBlbmNvZGluZ3MgZnJvbSBnaXZlbiBIVFRQIEhlYWRlciBEaWN0LgoKICAgIDpwYXJhbSBoZWFkZXJzOiBkaWN0aW9uYXJ5IHRvIGV4dHJhY3QgZW5jb2RpbmcgZnJvbS4KICAgIDpydHlwZTogc3RyCiAgICAiIiIKCiAgICBjb250ZW50X3R5cGUgPSBoZWFkZXJzLmdldCgnY29udGVudC10eXBlJykKCiAgICBpZiBub3QgY29udGVudF90eXBlOgogICAgICAgIHJldHVybiBOb25lCgogICAgY29udGVudF90eXBlLCBwYXJhbXMgPSBjZ2kucGFyc2VfaGVhZGVyKGNvbnRlbnRfdHlwZSkKCiAgICBpZiAnY2hhcnNldCcgaW4gcGFyYW1zOgogICAgICAgIHJldHVybiBwYXJhbXNbJ2NoYXJzZXQnXS5zdHJpcCgiJ1wiIikKCiAgICBpZiAndGV4dCcgaW4gY29udGVudF90eXBlOgogICAgICAgIHJldHVybiAnSVNPLTg4NTktMScKCgpkZWYgc3RyZWFtX2RlY29kZV9yZXNwb25zZV91bmljb2RlKGl0ZXJhdG9yLCByKToKICAgICIiIlN0cmVhbSBkZWNvZGVzIGEgaXRlcmF0b3IuIiIiCgogICAgaWYgci5lbmNvZGluZyBpcyBOb25lOgogICAgICAgIGZvciBpdGVtIGluIGl0ZXJhdG9yOgogICAgICAgICAgICB5aWVsZCBpdGVtCiAgICAgICAgcmV0dXJuCgogICAgZGVjb2RlciA9IGNvZGVjcy5nZXRpbmNyZW1lbnRhbGRlY29kZXIoci5lbmNvZGluZykoZXJyb3JzPSdyZXBsYWNlJykKICAgIGZvciBjaHVuayBpbiBpdGVyYXRvcjoKICAgICAgICBydiA9IGRlY29kZXIuZGVjb2RlKGNodW5rKQogICAgICAgIGlmIHJ2OgogICAgICAgICAgICB5aWVsZCBydgogICAgcnYgPSBkZWNvZGVyLmRlY29kZShiJycsIGZpbmFsPVRydWUpCiAgICBpZiBydjoKICAgICAgICB5aWVsZCBydgoKCmRlZiBpdGVyX3NsaWNlcyhzdHJpbmcsIHNsaWNlX2xlbmd0aCk6CiAgICAiIiJJdGVyYXRlIG92ZXIgc2xpY2VzIG9mIGEgc3RyaW5nLiIiIgogICAgcG9zID0gMAogICAgaWYgc2xpY2VfbGVuZ3RoIGlzIE5vbmUgb3Igc2xpY2VfbGVuZ3RoIDw9IDA6CiAgICAgICAgc2xpY2VfbGVuZ3RoID0gbGVuKHN0cmluZykKICAgIHdoaWxlIHBvcyA8IGxlbihzdHJpbmcpOgogICAgICAgIHlpZWxkIHN0cmluZ1twb3M6cG9zICsgc2xpY2VfbGVuZ3RoXQogICAgICAgIHBvcyArPSBzbGljZV9sZW5ndGgKCgpkZWYgZ2V0X3VuaWNvZGVfZnJvbV9yZXNwb25zZShyKToKICAgICIiIlJldHVybnMgdGhlIHJlcXVlc3RlZCBjb250ZW50IGJhY2sgaW4gdW5pY29kZS4KCiAgICA6cGFyYW0gcjogUmVzcG9uc2Ugb2JqZWN0IHRvIGdldCB1bmljb2RlIGNvbnRlbnQgZnJvbS4KCiAgICBUcmllZDoKCiAgICAxLiBjaGFyc2V0IGZyb20gY29udGVudC10eXBlCiAgICAyLiBmYWxsIGJhY2sgYW5kIHJlcGxhY2UgYWxsIHVuaWNvZGUgY2hhcmFjdGVycwoKICAgIDpydHlwZTogc3RyCiAgICAiIiIKICAgIHdhcm5pbmdzLndhcm4oKAogICAgICAgICdJbiByZXF1ZXN0cyAzLjAsIGdldF91bmljb2RlX2Zyb21fcmVzcG9uc2Ugd2lsbCBiZSByZW1vdmVkLiBGb3IgJwogICAgICAgICdtb3JlIGluZm9ybWF0aW9uLCBwbGVhc2Ugc2VlIHRoZSBkaXNjdXNzaW9uIG9uIGlzc3VlICMyMjY2LiAoVGhpcycKICAgICAgICAnIHdhcm5pbmcgc2hvdWxkIG9ubHkgYXBwZWFyIG9uY2UuKScpLAogICAgICAgIERlcHJlY2F0aW9uV2FybmluZykKCiAgICB0cmllZF9lbmNvZGluZ3MgPSBbXQoKICAgICMgVHJ5IGNoYXJzZXQgZnJvbSBjb250ZW50LXR5cGUKICAgIGVuY29kaW5nID0gZ2V0X2VuY29kaW5nX2Zyb21faGVhZGVycyhyLmhlYWRlcnMpCgogICAgaWYgZW5jb2Rpbmc6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc3RyKHIuY29udGVudCwgZW5jb2RpbmcpCiAgICAgICAgZXhjZXB0IFVuaWNvZGVFcnJvcjoKICAgICAgICAgICAgdHJpZWRfZW5jb2RpbmdzLmFwcGVuZChlbmNvZGluZykKCiAgICAjIEZhbGwgYmFjazoKICAgIHRyeToKICAgICAgICByZXR1cm4gc3RyKHIuY29udGVudCwgZW5jb2RpbmcsIGVycm9ycz0ncmVwbGFjZScpCiAgICBleGNlcHQgVHlwZUVycm9yOgogICAgICAgIHJldHVybiByLmNvbnRlbnQKCgojIFRoZSB1bnJlc2VydmVkIFVSSSBjaGFyYWN0ZXJzIChSRkMgMzk4NikKVU5SRVNFUlZFRF9TRVQgPSBmcm96ZW5zZXQoCiAgICAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIgKyAiMDEyMzQ1Njc4OS0uX34iKQoKCmRlZiB1bnF1b3RlX3VucmVzZXJ2ZWQodXJpKToKICAgICIiIlVuLWVzY2FwZSBhbnkgcGVyY2VudC1lc2NhcGUgc2VxdWVuY2VzIGluIGEgVVJJIHRoYXQgYXJlIHVucmVzZXJ2ZWQKICAgIGNoYXJhY3RlcnMuIFRoaXMgbGVhdmVzIGFsbCByZXNlcnZlZCwgaWxsZWdhbCBhbmQgbm9uLUFTQ0lJIGJ5dGVzIGVuY29kZWQuCgogICAgOnJ0eXBlOiBzdHIKICAgICIiIgogICAgcGFydHMgPSB1cmkuc3BsaXQoJyUnKQogICAgZm9yIGkgaW4gcmFuZ2UoMSwgbGVuKHBhcnRzKSk6CiAgICAgICAgaCA9IHBhcnRzW2ldWzA6Ml0KICAgICAgICBpZiBsZW4oaCkgPT0gMiBhbmQgaC5pc2FsbnVtKCk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGMgPSBjaHIoaW50KGgsIDE2KSkKICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICAgICByYWlzZSBJbnZhbGlkVVJMKCJJbnZhbGlkIHBlcmNlbnQtZXNjYXBlIHNlcXVlbmNlOiAnJXMnIiAlIGgpCgogICAgICAgICAgICBpZiBjIGluIFVOUkVTRVJWRURfU0VUOgogICAgICAgICAgICAgICAgcGFydHNbaV0gPSBjICsgcGFydHNbaV1bMjpdCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBwYXJ0c1tpXSA9ICclJyArIHBhcnRzW2ldCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcGFydHNbaV0gPSAnJScgKyBwYXJ0c1tpXQogICAgcmV0dXJuICcnLmpvaW4ocGFydHMpCgoKZGVmIHJlcXVvdGVfdXJpKHVyaSk6CiAgICAiIiJSZS1xdW90ZSB0aGUgZ2l2ZW4gVVJJLgoKICAgIFRoaXMgZnVuY3Rpb24gcGFzc2VzIHRoZSBnaXZlbiBVUkkgdGhyb3VnaCBhbiB1bnF1b3RlL3F1b3RlIGN5Y2xlIHRvCiAgICBlbnN1cmUgdGhhdCBpdCBpcyBmdWxseSBhbmQgY29uc2lzdGVudGx5IHF1b3RlZC4KCiAgICA6cnR5cGU6IHN0cgogICAgIiIiCiAgICBzYWZlX3dpdGhfcGVyY2VudCA9ICIhIyQlJicoKSorLC86Oz0/QFtdfiIKICAgIHNhZmVfd2l0aG91dF9wZXJjZW50ID0gIiEjJCYnKCkqKywvOjs9P0BbXX4iCiAgICB0cnk6CiAgICAgICAgIyBVbnF1b3RlIG9ubHkgdGhlIHVucmVzZXJ2ZWQgY2hhcmFjdGVycwogICAgICAgICMgVGhlbiBxdW90ZSBvbmx5IGlsbGVnYWwgY2hhcmFjdGVycyAoZG8gbm90IHF1b3RlIHJlc2VydmVkLAogICAgICAgICMgdW5yZXNlcnZlZCwgb3IgJyUnKQogICAgICAgIHJldHVybiBxdW90ZSh1bnF1b3RlX3VucmVzZXJ2ZWQodXJpKSwgc2FmZT1zYWZlX3dpdGhfcGVyY2VudCkKICAgIGV4Y2VwdCBJbnZhbGlkVVJMOgogICAgICAgICMgV2UgY291bGRuJ3QgdW5xdW90ZSB0aGUgZ2l2ZW4gVVJJLCBzbyBsZXQncyB0cnkgcXVvdGluZyBpdCwgYnV0CiAgICAgICAgIyB0aGVyZSBtYXkgYmUgdW5xdW90ZWQgJyUncyBpbiB0aGUgVVJJLiBXZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGV5J3JlCiAgICAgICAgIyBwcm9wZXJseSBxdW90ZWQgc28gdGhleSBkbyBub3QgY2F1c2UgaXNzdWVzIGVsc2V3aGVyZS4KICAgICAgICByZXR1cm4gcXVvdGUodXJpLCBzYWZlPXNhZmVfd2l0aG91dF9wZXJjZW50KQoKCmRlZiBhZGRyZXNzX2luX25ldHdvcmsoaXAsIG5ldCk6CiAgICAiIiJUaGlzIGZ1bmN0aW9uIGFsbG93cyB5b3UgdG8gY2hlY2sgaWYgYW4gSVAgYmVsb25ncyB0byBhIG5ldHdvcmsgc3VibmV0CgogICAgRXhhbXBsZTogcmV0dXJucyBUcnVlIGlmIGlwID0gMTkyLjE2OC4xLjEgYW5kIG5ldCA9IDE5Mi4xNjguMS4wLzI0CiAgICAgICAgICAgICByZXR1cm5zIEZhbHNlIGlmIGlwID0gMTkyLjE2OC4xLjEgYW5kIG5ldCA9IDE5Mi4xNjguMTAwLjAvMjQKCiAgICA6cnR5cGU6IGJvb2wKICAgICIiIgogICAgaXBhZGRyID0gc3RydWN0LnVucGFjaygnPUwnLCBzb2NrZXQuaW5ldF9hdG9uKGlwKSlbMF0KICAgIG5ldGFkZHIsIGJpdHMgPSBuZXQuc3BsaXQoJy8nKQogICAgbmV0bWFzayA9IHN0cnVjdC51bnBhY2soJz1MJywgc29ja2V0LmluZXRfYXRvbihkb3R0ZWRfbmV0bWFzayhpbnQoYml0cykpKSlbMF0KICAgIG5ldHdvcmsgPSBzdHJ1Y3QudW5wYWNrKCc9TCcsIHNvY2tldC5pbmV0X2F0b24obmV0YWRkcikpWzBdICYgbmV0bWFzawogICAgcmV0dXJuIChpcGFkZHIgJiBuZXRtYXNrKSA9PSAobmV0d29yayAmIG5ldG1hc2spCgoKZGVmIGRvdHRlZF9uZXRtYXNrKG1hc2spOgogICAgIiIiQ29udmVydHMgbWFzayBmcm9tIC94eCBmb3JtYXQgdG8geHh4Lnh4eC54eHgueHh4CgogICAgRXhhbXBsZTogaWYgbWFzayBpcyAyNCBmdW5jdGlvbiByZXR1cm5zIDI1NS4yNTUuMjU1LjAKCiAgICA6cnR5cGU6IHN0cgogICAgIiIiCiAgICBiaXRzID0gMHhmZmZmZmZmZiBeICgxIDw8IDMyIC0gbWFzaykgLSAxCiAgICByZXR1cm4gc29ja2V0LmluZXRfbnRvYShzdHJ1Y3QucGFjaygnPkknLCBiaXRzKSkKCgpkZWYgaXNfaXB2NF9hZGRyZXNzKHN0cmluZ19pcCk6CiAgICAiIiIKICAgIDpydHlwZTogYm9vbAogICAgIiIiCiAgICB0cnk6CiAgICAgICAgc29ja2V0LmluZXRfYXRvbihzdHJpbmdfaXApCiAgICBleGNlcHQgc29ja2V0LmVycm9yOgogICAgICAgIHJldHVybiBGYWxzZQogICAgcmV0dXJuIFRydWUKCgpkZWYgaXNfdmFsaWRfY2lkcihzdHJpbmdfbmV0d29yayk6CiAgICAiIiIKICAgIFZlcnkgc2ltcGxlIGNoZWNrIG9mIHRoZSBjaWRyIGZvcm1hdCBpbiBub19wcm94eSB2YXJpYWJsZS4KCiAgICA6cnR5cGU6IGJvb2wKICAgICIiIgogICAgaWYgc3RyaW5nX25ldHdvcmsuY291bnQoJy8nKSA9PSAxOgogICAgICAgIHRyeToKICAgICAgICAgICAgbWFzayA9IGludChzdHJpbmdfbmV0d29yay5zcGxpdCgnLycpWzFdKQogICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgaWYgbWFzayA8IDEgb3IgbWFzayA+IDMyOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzb2NrZXQuaW5ldF9hdG9uKHN0cmluZ19uZXR3b3JrLnNwbGl0KCcvJylbMF0pCiAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvcjoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICBlbHNlOgogICAgICAgIHJldHVybiBGYWxzZQogICAgcmV0dXJuIFRydWUKCgpAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgpkZWYgc2V0X2Vudmlyb24oZW52X25hbWUsIHZhbHVlKToKICAgICIiIlNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgJ2Vudl9uYW1lJyB0byAndmFsdWUnCgogICAgU2F2ZSBwcmV2aW91cyB2YWx1ZSwgeWllbGQsIGFuZCB0aGVuIHJlc3RvcmUgdGhlIHByZXZpb3VzIHZhbHVlIHN0b3JlZCBpbgogICAgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlICdlbnZfbmFtZScuCgogICAgSWYgJ3ZhbHVlJyBpcyBOb25lLCBkbyBub3RoaW5nIiIiCiAgICB2YWx1ZV9jaGFuZ2VkID0gdmFsdWUgaXMgbm90IE5vbmUKICAgIGlmIHZhbHVlX2NoYW5nZWQ6CiAgICAgICAgb2xkX3ZhbHVlID0gb3MuZW52aXJvbi5nZXQoZW52X25hbWUpCiAgICAgICAgb3MuZW52aXJvbltlbnZfbmFtZV0gPSB2YWx1ZQogICAgdHJ5OgogICAgICAgIHlpZWxkCiAgICBmaW5hbGx5OgogICAgICAgIGlmIHZhbHVlX2NoYW5nZWQ6CiAgICAgICAgICAgIGlmIG9sZF92YWx1ZSBpcyBOb25lOgogICAgICAgICAgICAgICAgZGVsIG9zLmVudmlyb25bZW52X25hbWVdCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBvcy5lbnZpcm9uW2Vudl9uYW1lXSA9IG9sZF92YWx1ZQoKCmRlZiBzaG91bGRfYnlwYXNzX3Byb3hpZXModXJsLCBub19wcm94eSk6CiAgICAiIiIKICAgIFJldHVybnMgd2hldGhlciB3ZSBzaG91bGQgYnlwYXNzIHByb3hpZXMgb3Igbm90LgoKICAgIDpydHlwZTogYm9vbAogICAgIiIiCiAgICBnZXRfcHJveHkgPSBsYW1iZGEgazogb3MuZW52aXJvbi5nZXQoaykgb3Igb3MuZW52aXJvbi5nZXQoay51cHBlcigpKQoKICAgICMgRmlyc3QgY2hlY2sgd2hldGhlciBub19wcm94eSBpcyBkZWZpbmVkLiBJZiBpdCBpcywgY2hlY2sgdGhhdCB0aGUgVVJMCiAgICAjIHdlJ3JlIGdldHRpbmcgaXNuJ3QgaW4gdGhlIG5vX3Byb3h5IGxpc3QuCiAgICBub19wcm94eV9hcmcgPSBub19wcm94eQogICAgaWYgbm9fcHJveHkgaXMgTm9uZToKICAgICAgICBub19wcm94eSA9IGdldF9wcm94eSgnbm9fcHJveHknKQogICAgbmV0bG9jID0gdXJscGFyc2UodXJsKS5uZXRsb2MKCiAgICBpZiBub19wcm94eToKICAgICAgICAjIFdlIG5lZWQgdG8gY2hlY2sgd2hldGhlciB3ZSBtYXRjaCBoZXJlLiBXZSBuZWVkIHRvIHNlZSBpZiB3ZSBtYXRjaAogICAgICAgICMgdGhlIGVuZCBvZiB0aGUgbmV0bG9jLCBib3RoIHdpdGggYW5kIHdpdGhvdXQgdGhlIHBvcnQuCiAgICAgICAgbm9fcHJveHkgPSAoCiAgICAgICAgICAgIGhvc3QgZm9yIGhvc3QgaW4gbm9fcHJveHkucmVwbGFjZSgnICcsICcnKS5zcGxpdCgnLCcpIGlmIGhvc3QKICAgICAgICApCgogICAgICAgIGlwID0gbmV0bG9jLnNwbGl0KCc6JylbMF0KICAgICAgICBpZiBpc19pcHY0X2FkZHJlc3MoaXApOgogICAgICAgICAgICBmb3IgcHJveHlfaXAgaW4gbm9fcHJveHk6CiAgICAgICAgICAgICAgICBpZiBpc192YWxpZF9jaWRyKHByb3h5X2lwKToKICAgICAgICAgICAgICAgICAgICBpZiBhZGRyZXNzX2luX25ldHdvcmsoaXAsIHByb3h5X2lwKToKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICAgICAgICAgIGVsaWYgaXAgPT0gcHJveHlfaXA6CiAgICAgICAgICAgICAgICAgICAgIyBJZiBub19wcm94eSBpcCB3YXMgZGVmaW5lZCBpbiBwbGFpbiBJUCBub3RhdGlvbiBpbnN0ZWFkIG9mIGNpZHIgbm90YXRpb24gJgogICAgICAgICAgICAgICAgICAgICMgbWF0Y2hlcyB0aGUgSVAgb2YgdGhlIGluZGV4CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICBlbHNlOgogICAgICAgICAgICBmb3IgaG9zdCBpbiBub19wcm94eToKICAgICAgICAgICAgICAgIGlmIG5ldGxvYy5lbmRzd2l0aChob3N0KSBvciBuZXRsb2Muc3BsaXQoJzonKVswXS5lbmRzd2l0aChob3N0KToKICAgICAgICAgICAgICAgICAgICAjIFRoZSBVUkwgZG9lcyBtYXRjaCBzb21ldGhpbmcgaW4gbm9fcHJveHksIHNvIHdlIGRvbid0IHdhbnQKICAgICAgICAgICAgICAgICAgICAjIHRvIGFwcGx5IHRoZSBwcm94aWVzIG9uIHRoaXMgVVJMLgogICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgIyBJZiB0aGUgc3lzdGVtIHByb3h5IHNldHRpbmdzIGluZGljYXRlIHRoYXQgdGhpcyBVUkwgc2hvdWxkIGJlIGJ5cGFzc2VkLAogICAgIyBkb24ndCBwcm94eS4KICAgICMgVGhlIHByb3h5X2J5cGFzcyBmdW5jdGlvbiBpcyBpbmNyZWRpYmx5IGJ1Z2d5IG9uIE9TIFggaW4gZWFybHkgdmVyc2lvbnMKICAgICMgb2YgUHl0aG9uIDIuNiwgc28gYWxsb3cgdGhpcyBjYWxsIHRvIGZhaWwuIE9ubHkgY2F0Y2ggdGhlIHNwZWNpZmljCiAgICAjIGV4Y2VwdGlvbnMgd2UndmUgc2VlbiwgdGhvdWdoOiB0aGlzIGNhbGwgZmFpbGluZyBpbiBvdGhlciB3YXlzIGNhbiByZXZlYWwKICAgICMgbGVnaXRpbWF0ZSBwcm9ibGVtcy4KICAgIHdpdGggc2V0X2Vudmlyb24oJ25vX3Byb3h5Jywgbm9fcHJveHlfYXJnKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIGJ5cGFzcyA9IHByb3h5X2J5cGFzcyhuZXRsb2MpCiAgICAgICAgZXhjZXB0IChUeXBlRXJyb3IsIHNvY2tldC5nYWllcnJvcik6CiAgICAgICAgICAgIGJ5cGFzcyA9IEZhbHNlCgogICAgaWYgYnlwYXNzOgogICAgICAgIHJldHVybiBUcnVlCgogICAgcmV0dXJuIEZhbHNlCgoKZGVmIGdldF9lbnZpcm9uX3Byb3hpZXModXJsLCBub19wcm94eT1Ob25lKToKICAgICIiIgogICAgUmV0dXJuIGEgZGljdCBvZiBlbnZpcm9ubWVudCBwcm94aWVzLgoKICAgIDpydHlwZTogZGljdAogICAgIiIiCiAgICBpZiBzaG91bGRfYnlwYXNzX3Byb3hpZXModXJsLCBub19wcm94eT1ub19wcm94eSk6CiAgICAgICAgcmV0dXJuIHt9CiAgICBlbHNlOgogICAgICAgIHJldHVybiBnZXRwcm94aWVzKCkKCgpkZWYgc2VsZWN0X3Byb3h5KHVybCwgcHJveGllcyk6CiAgICAiIiJTZWxlY3QgYSBwcm94eSBmb3IgdGhlIHVybCwgaWYgYXBwbGljYWJsZS4KCiAgICA6cGFyYW0gdXJsOiBUaGUgdXJsIGJlaW5nIGZvciB0aGUgcmVxdWVzdAogICAgOnBhcmFtIHByb3hpZXM6IEEgZGljdGlvbmFyeSBvZiBzY2hlbWVzIG9yIHNjaGVtZXMgYW5kIGhvc3RzIHRvIHByb3h5IFVSTHMKICAgICIiIgogICAgcHJveGllcyA9IHByb3hpZXMgb3Ige30KICAgIHVybHBhcnRzID0gdXJscGFyc2UodXJsKQogICAgaWYgdXJscGFydHMuaG9zdG5hbWUgaXMgTm9uZToKICAgICAgICByZXR1cm4gcHJveGllcy5nZXQodXJscGFydHMuc2NoZW1lLCBwcm94aWVzLmdldCgnYWxsJykpCgogICAgcHJveHlfa2V5cyA9IFsKICAgICAgICB1cmxwYXJ0cy5zY2hlbWUgKyAnOi8vJyArIHVybHBhcnRzLmhvc3RuYW1lLAogICAgICAgIHVybHBhcnRzLnNjaGVtZSwKICAgICAgICAnYWxsOi8vJyArIHVybHBhcnRzLmhvc3RuYW1lLAogICAgICAgICdhbGwnLAogICAgXQogICAgcHJveHkgPSBOb25lCiAgICBmb3IgcHJveHlfa2V5IGluIHByb3h5X2tleXM6CiAgICAgICAgaWYgcHJveHlfa2V5IGluIHByb3hpZXM6CiAgICAgICAgICAgIHByb3h5ID0gcHJveGllc1twcm94eV9rZXldCiAgICAgICAgICAgIGJyZWFrCgogICAgcmV0dXJuIHByb3h5CgoKZGVmIGRlZmF1bHRfdXNlcl9hZ2VudChuYW1lPSJweXRob24tcmVxdWVzdHMiKToKICAgICIiIgogICAgUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZGVmYXVsdCB1c2VyIGFnZW50LgoKICAgIDpydHlwZTogc3RyCiAgICAiIiIKICAgIHJldHVybiAnJXMvJXMnICUgKG5hbWUsIF9fdmVyc2lvbl9fKQoKCmRlZiBkZWZhdWx0X2hlYWRlcnMoKToKICAgICIiIgogICAgOnJ0eXBlOiByZXF1ZXN0cy5zdHJ1Y3R1cmVzLkNhc2VJbnNlbnNpdGl2ZURpY3QKICAgICIiIgogICAgcmV0dXJuIENhc2VJbnNlbnNpdGl2ZURpY3QoewogICAgICAgICdVc2VyLUFnZW50JzogZGVmYXVsdF91c2VyX2FnZW50KCksCiAgICAgICAgJ0FjY2VwdC1FbmNvZGluZyc6ICcsICcuam9pbigoJ2d6aXAnLCAnZGVmbGF0ZScpKSwKICAgICAgICAnQWNjZXB0JzogJyovKicsCiAgICAgICAgJ0Nvbm5lY3Rpb24nOiAna2VlcC1hbGl2ZScsCiAgICB9KQoKCmRlZiBwYXJzZV9oZWFkZXJfbGlua3ModmFsdWUpOgogICAgIiIiUmV0dXJuIGEgZGljdCBvZiBwYXJzZWQgbGluayBoZWFkZXJzIHByb3hpZXMuCgogICAgaS5lLiBMaW5rOiA8aHR0cDovLi4uL2Zyb250LmpwZWc+OyByZWw9ZnJvbnQ7IHR5cGU9ImltYWdlL2pwZWciLDxodHRwOi8vLi4uL2JhY2suanBlZz47IHJlbD1iYWNrO3R5cGU9ImltYWdlL2pwZWciCgogICAgOnJ0eXBlOiBsaXN0CiAgICAiIiIKCiAgICBsaW5rcyA9IFtdCgogICAgcmVwbGFjZV9jaGFycyA9ICcgXCciJwoKICAgIGZvciB2YWwgaW4gcmUuc3BsaXQoJywgKjwnLCB2YWx1ZSk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICB1cmwsIHBhcmFtcyA9IHZhbC5zcGxpdCgnOycsIDEpCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgIHVybCwgcGFyYW1zID0gdmFsLCAnJwoKICAgICAgICBsaW5rID0geyd1cmwnOiB1cmwuc3RyaXAoJzw+IFwnIicpfQoKICAgICAgICBmb3IgcGFyYW0gaW4gcGFyYW1zLnNwbGl0KCc7Jyk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGtleSwgdmFsdWUgPSBwYXJhbS5zcGxpdCgnPScpCiAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgICAgYnJlYWsKCiAgICAgICAgICAgIGxpbmtba2V5LnN0cmlwKHJlcGxhY2VfY2hhcnMpXSA9IHZhbHVlLnN0cmlwKHJlcGxhY2VfY2hhcnMpCgogICAgICAgIGxpbmtzLmFwcGVuZChsaW5rKQoKICAgIHJldHVybiBsaW5rcwoKCiMgTnVsbCBieXRlczsgbm8gbmVlZCB0byByZWNyZWF0ZSB0aGVzZSBvbiBlYWNoIGNhbGwgdG8gZ3Vlc3NfanNvbl91dGYKX251bGwgPSAnXHgwMCcuZW5jb2RlKCdhc2NpaScpICAjIGVuY29kaW5nIHRvIEFTQ0lJIGZvciBQeXRob24gMwpfbnVsbDIgPSBfbnVsbCAqIDIKX251bGwzID0gX251bGwgKiAzCgoKZGVmIGd1ZXNzX2pzb25fdXRmKGRhdGEpOgogICAgIiIiCiAgICA6cnR5cGU6IHN0cgogICAgIiIiCiAgICAjIEpTT04gYWx3YXlzIHN0YXJ0cyB3aXRoIHR3byBBU0NJSSBjaGFyYWN0ZXJzLCBzbyBkZXRlY3Rpb24gaXMgYXMKICAgICMgZWFzeSBhcyBjb3VudGluZyB0aGUgbnVsbHMgYW5kIGZyb20gdGhlaXIgbG9jYXRpb24gYW5kIGNvdW50CiAgICAjIGRldGVybWluZSB0aGUgZW5jb2RpbmcuIEFsc28gZGV0ZWN0IGEgQk9NLCBpZiBwcmVzZW50LgogICAgc2FtcGxlID0gZGF0YVs6NF0KICAgIGlmIHNhbXBsZSBpbiAoY29kZWNzLkJPTV9VVEYzMl9MRSwgY29kZWNzLkJPTV9VVEYzMl9CRSk6CiAgICAgICAgcmV0dXJuICd1dGYtMzInICAgICAjIEJPTSBpbmNsdWRlZAogICAgaWYgc2FtcGxlWzozXSA9PSBjb2RlY3MuQk9NX1VURjg6CiAgICAgICAgcmV0dXJuICd1dGYtOC1zaWcnICAjIEJPTSBpbmNsdWRlZCwgTVMgc3R5bGUgKGRpc2NvdXJhZ2VkKQogICAgaWYgc2FtcGxlWzoyXSBpbiAoY29kZWNzLkJPTV9VVEYxNl9MRSwgY29kZWNzLkJPTV9VVEYxNl9CRSk6CiAgICAgICAgcmV0dXJuICd1dGYtMTYnICAgICAjIEJPTSBpbmNsdWRlZAogICAgbnVsbGNvdW50ID0gc2FtcGxlLmNvdW50KF9udWxsKQogICAgaWYgbnVsbGNvdW50ID09IDA6CiAgICAgICAgcmV0dXJuICd1dGYtOCcKICAgIGlmIG51bGxjb3VudCA9PSAyOgogICAgICAgIGlmIHNhbXBsZVs6OjJdID09IF9udWxsMjogICAjIDFzdCBhbmQgM3JkIGFyZSBudWxsCiAgICAgICAgICAgIHJldHVybiAndXRmLTE2LWJlJwogICAgICAgIGlmIHNhbXBsZVsxOjoyXSA9PSBfbnVsbDI6ICAjIDJuZCBhbmQgNHRoIGFyZSBudWxsCiAgICAgICAgICAgIHJldHVybiAndXRmLTE2LWxlJwogICAgICAgICMgRGlkIG5vdCBkZXRlY3QgMiB2YWxpZCBVVEYtMTYgYXNjaWktcmFuZ2UgY2hhcmFjdGVycwogICAgaWYgbnVsbGNvdW50ID09IDM6CiAgICAgICAgaWYgc2FtcGxlWzozXSA9PSBfbnVsbDM6CiAgICAgICAgICAgIHJldHVybiAndXRmLTMyLWJlJwogICAgICAgIGlmIHNhbXBsZVsxOl0gPT0gX251bGwzOgogICAgICAgICAgICByZXR1cm4gJ3V0Zi0zMi1sZScKICAgICAgICAjIERpZCBub3QgZGV0ZWN0IGEgdmFsaWQgVVRGLTMyIGFzY2lpLXJhbmdlIGNoYXJhY3RlcgogICAgcmV0dXJuIE5vbmUKCgpkZWYgcHJlcGVuZF9zY2hlbWVfaWZfbmVlZGVkKHVybCwgbmV3X3NjaGVtZSk6CiAgICAiIiJHaXZlbiBhIFVSTCB0aGF0IG1heSBvciBtYXkgbm90IGhhdmUgYSBzY2hlbWUsIHByZXBlbmQgdGhlIGdpdmVuIHNjaGVtZS4KICAgIERvZXMgbm90IHJlcGxhY2UgYSBwcmVzZW50IHNjaGVtZSB3aXRoIHRoZSBvbmUgcHJvdmlkZWQgYXMgYW4gYXJndW1lbnQuCgogICAgOnJ0eXBlOiBzdHIKICAgICIiIgogICAgc2NoZW1lLCBuZXRsb2MsIHBhdGgsIHBhcmFtcywgcXVlcnksIGZyYWdtZW50ID0gdXJscGFyc2UodXJsLCBuZXdfc2NoZW1lKQoKICAgICMgdXJscGFyc2UgaXMgYSBmaW5pY2t5IGJlYXN0LCBhbmQgc29tZXRpbWVzIGRlY2lkZXMgdGhhdCB0aGVyZSBpc24ndCBhCiAgICAjIG5ldGxvYyBwcmVzZW50LiBBc3N1bWUgdGhhdCBpdCdzIGJlaW5nIG92ZXItY2F1dGlvdXMsIGFuZCBzd2l0Y2ggbmV0bG9jCiAgICAjIGFuZCBwYXRoIGlmIHVybHBhcnNlIGRlY2lkZWQgdGhlcmUgd2FzIG5vIG5ldGxvYy4KICAgIGlmIG5vdCBuZXRsb2M6CiAgICAgICAgbmV0bG9jLCBwYXRoID0gcGF0aCwgbmV0bG9jCgogICAgcmV0dXJuIHVybHVucGFyc2UoKHNjaGVtZSwgbmV0bG9jLCBwYXRoLCBwYXJhbXMsIHF1ZXJ5LCBmcmFnbWVudCkpCgoKZGVmIGdldF9hdXRoX2Zyb21fdXJsKHVybCk6CiAgICAiIiJHaXZlbiBhIHVybCB3aXRoIGF1dGhlbnRpY2F0aW9uIGNvbXBvbmVudHMsIGV4dHJhY3QgdGhlbSBpbnRvIGEgdHVwbGUgb2YKICAgIHVzZXJuYW1lLHBhc3N3b3JkLgoKICAgIDpydHlwZTogKHN0cixzdHIpCiAgICAiIiIKICAgIHBhcnNlZCA9IHVybHBhcnNlKHVybCkKCiAgICB0cnk6CiAgICAgICAgYXV0aCA9ICh1bnF1b3RlKHBhcnNlZC51c2VybmFtZSksIHVucXVvdGUocGFyc2VkLnBhc3N3b3JkKSkKICAgIGV4Y2VwdCAoQXR0cmlidXRlRXJyb3IsIFR5cGVFcnJvcik6CiAgICAgICAgYXV0aCA9ICgnJywgJycpCgogICAgcmV0dXJuIGF1dGgKCgojIE1vdmVkIG91dHNpZGUgb2YgZnVuY3Rpb24gdG8gYXZvaWQgcmVjb21waWxlIGV2ZXJ5IGNhbGwKX0NMRUFOX0hFQURFUl9SRUdFWF9CWVRFID0gcmUuY29tcGlsZShiJ15cXFNbXlxcclxcbl0qJHxeJCcpCl9DTEVBTl9IRUFERVJfUkVHRVhfU1RSID0gcmUuY29tcGlsZShyJ15cU1teXHJcbl0qJHxeJCcpCgoKZGVmIGNoZWNrX2hlYWRlcl92YWxpZGl0eShoZWFkZXIpOgogICAgIiIiVmVyaWZpZXMgdGhhdCBoZWFkZXIgdmFsdWUgaXMgYSBzdHJpbmcgd2hpY2ggZG9lc24ndCBjb250YWluCiAgICBsZWFkaW5nIHdoaXRlc3BhY2Ugb3IgcmV0dXJuIGNoYXJhY3RlcnMuIFRoaXMgcHJldmVudHMgdW5pbnRlbmRlZAogICAgaGVhZGVyIGluamVjdGlvbi4KCiAgICA6cGFyYW0gaGVhZGVyOiB0dXBsZSwgaW4gdGhlIGZvcm1hdCAobmFtZSwgdmFsdWUpLgogICAgIiIiCiAgICBuYW1lLCB2YWx1ZSA9IGhlYWRlcgoKICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIGJ5dGVzKToKICAgICAgICBwYXQgPSBfQ0xFQU5fSEVBREVSX1JFR0VYX0JZVEUKICAgIGVsc2U6CiAgICAgICAgcGF0ID0gX0NMRUFOX0hFQURFUl9SRUdFWF9TVFIKICAgIHRyeToKICAgICAgICBpZiBub3QgcGF0Lm1hdGNoKHZhbHVlKToKICAgICAgICAgICAgcmFpc2UgSW52YWxpZEhlYWRlcigiSW52YWxpZCByZXR1cm4gY2hhcmFjdGVyIG9yIGxlYWRpbmcgc3BhY2UgaW4gaGVhZGVyOiAlcyIgJSBuYW1lKQogICAgZXhjZXB0IFR5cGVFcnJvcjoKICAgICAgICByYWlzZSBJbnZhbGlkSGVhZGVyKCJWYWx1ZSBmb3IgaGVhZGVyIHslczogJXN9IG11c3QgYmUgb2YgdHlwZSBzdHIgb3IgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ5dGVzLCBub3QgJXMiICUgKG5hbWUsIHZhbHVlLCB0eXBlKHZhbHVlKSkpCgoKZGVmIHVybGRlZnJhZ2F1dGgodXJsKToKICAgICIiIgogICAgR2l2ZW4gYSB1cmwgcmVtb3ZlIHRoZSBmcmFnbWVudCBhbmQgdGhlIGF1dGhlbnRpY2F0aW9uIHBhcnQuCgogICAgOnJ0eXBlOiBzdHIKICAgICIiIgogICAgc2NoZW1lLCBuZXRsb2MsIHBhdGgsIHBhcmFtcywgcXVlcnksIGZyYWdtZW50ID0gdXJscGFyc2UodXJsKQoKICAgICMgc2VlIGZ1bmM6YHByZXBlbmRfc2NoZW1lX2lmX25lZWRlZGAKICAgIGlmIG5vdCBuZXRsb2M6CiAgICAgICAgbmV0bG9jLCBwYXRoID0gcGF0aCwgbmV0bG9jCgogICAgbmV0bG9jID0gbmV0bG9jLnJzcGxpdCgnQCcsIDEpWy0xXQoKICAgIHJldHVybiB1cmx1bnBhcnNlKChzY2hlbWUsIG5ldGxvYywgcGF0aCwgcGFyYW1zLCBxdWVyeSwgJycpKQoKCmRlZiByZXdpbmRfYm9keShwcmVwYXJlZF9yZXF1ZXN0KToKICAgICIiIk1vdmUgZmlsZSBwb2ludGVyIGJhY2sgdG8gaXRzIHJlY29yZGVkIHN0YXJ0aW5nIHBvc2l0aW9uCiAgICBzbyBpdCBjYW4gYmUgcmVhZCBhZ2FpbiBvbiByZWRpcmVjdC4KICAgICIiIgogICAgYm9keV9zZWVrID0gZ2V0YXR0cihwcmVwYXJlZF9yZXF1ZXN0LmJvZHksICdzZWVrJywgTm9uZSkKICAgIGlmIGJvZHlfc2VlayBpcyBub3QgTm9uZSBhbmQgaXNpbnN0YW5jZShwcmVwYXJlZF9yZXF1ZXN0Ll9ib2R5X3Bvc2l0aW9uLCBpbnRlZ2VyX3R5cGVzKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIGJvZHlfc2VlayhwcmVwYXJlZF9yZXF1ZXN0Ll9ib2R5X3Bvc2l0aW9uKQogICAgICAgIGV4Y2VwdCAoSU9FcnJvciwgT1NFcnJvcik6CiAgICAgICAgICAgIHJhaXNlIFVucmV3aW5kYWJsZUJvZHlFcnJvcigiQW4gZXJyb3Igb2NjdXJyZWQgd2hlbiByZXdpbmRpbmcgcmVxdWVzdCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYm9keSBmb3IgcmVkaXJlY3QuIikKICAgIGVsc2U6CiAgICAgICAgcmFpc2UgVW5yZXdpbmRhYmxlQm9keUVycm9yKCJVbmFibGUgdG8gcmV3aW5kIHJlcXVlc3QgYm9keSBmb3IgcmVkaXJlY3QuIikKUEsDBBQAAAAAAAAAIQAhe7wK9CYAAPQmAAA0AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9yZXRyeWluZy5weSMjIENvcHlyaWdodCAyMDEzLTIwMTQgUmF5IEhvbGRlcgojIwojIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgojIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIyMKIyMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiMjCiMjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKIyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKIyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiMjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCgppbXBvcnQgcmFuZG9tCmZyb20gcGlwLl92ZW5kb3IgaW1wb3J0IHNpeAppbXBvcnQgc3lzCmltcG9ydCB0aW1lCmltcG9ydCB0cmFjZWJhY2sKCgojIHN5cy5tYXhpbnQgLyAyLCBzaW5jZSBQeXRob24gMy4yIGRvZXNuJ3QgaGF2ZSBhIHN5cy5tYXhpbnQuLi4KTUFYX1dBSVQgPSAxMDczNzQxODIzCgoKZGVmIHJldHJ5KCpkYXJncywgKipka3cpOgogICAgIiIiCiAgICBEZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBpbnN0YW50aWF0ZXMgdGhlIFJldHJ5aW5nIG9iamVjdAogICAgQHBhcmFtICpkYXJnczogcG9zaXRpb25hbCBhcmd1bWVudHMgcGFzc2VkIHRvIFJldHJ5aW5nIG9iamVjdAogICAgQHBhcmFtICoqZGt3OiBrZXl3b3JkIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIFJldHJ5aW5nIG9iamVjdAogICAgIiIiCiAgICAjIHN1cHBvcnQgYm90aCBAcmV0cnkgYW5kIEByZXRyeSgpIGFzIHZhbGlkIHN5bnRheAogICAgaWYgbGVuKGRhcmdzKSA9PSAxIGFuZCBjYWxsYWJsZShkYXJnc1swXSk6CiAgICAgICAgZGVmIHdyYXBfc2ltcGxlKGYpOgoKICAgICAgICAgICAgQHNpeC53cmFwcyhmKQogICAgICAgICAgICBkZWYgd3JhcHBlZF9mKCphcmdzLCAqKmt3KToKICAgICAgICAgICAgICAgIHJldHVybiBSZXRyeWluZygpLmNhbGwoZiwgKmFyZ3MsICoqa3cpCgogICAgICAgICAgICByZXR1cm4gd3JhcHBlZF9mCgogICAgICAgIHJldHVybiB3cmFwX3NpbXBsZShkYXJnc1swXSkKCiAgICBlbHNlOgogICAgICAgIGRlZiB3cmFwKGYpOgoKICAgICAgICAgICAgQHNpeC53cmFwcyhmKQogICAgICAgICAgICBkZWYgd3JhcHBlZF9mKCphcmdzLCAqKmt3KToKICAgICAgICAgICAgICAgIHJldHVybiBSZXRyeWluZygqZGFyZ3MsICoqZGt3KS5jYWxsKGYsICphcmdzLCAqKmt3KQoKICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWRfZgoKICAgICAgICByZXR1cm4gd3JhcAoKCmNsYXNzIFJldHJ5aW5nKG9iamVjdCk6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsCiAgICAgICAgICAgICAgICAgc3RvcD1Ob25lLCB3YWl0PU5vbmUsCiAgICAgICAgICAgICAgICAgc3RvcF9tYXhfYXR0ZW1wdF9udW1iZXI9Tm9uZSwKICAgICAgICAgICAgICAgICBzdG9wX21heF9kZWxheT1Ob25lLAogICAgICAgICAgICAgICAgIHdhaXRfZml4ZWQ9Tm9uZSwKICAgICAgICAgICAgICAgICB3YWl0X3JhbmRvbV9taW49Tm9uZSwgd2FpdF9yYW5kb21fbWF4PU5vbmUsCiAgICAgICAgICAgICAgICAgd2FpdF9pbmNyZW1lbnRpbmdfc3RhcnQ9Tm9uZSwgd2FpdF9pbmNyZW1lbnRpbmdfaW5jcmVtZW50PU5vbmUsCiAgICAgICAgICAgICAgICAgd2FpdF9leHBvbmVudGlhbF9tdWx0aXBsaWVyPU5vbmUsIHdhaXRfZXhwb25lbnRpYWxfbWF4PU5vbmUsCiAgICAgICAgICAgICAgICAgcmV0cnlfb25fZXhjZXB0aW9uPU5vbmUsCiAgICAgICAgICAgICAgICAgcmV0cnlfb25fcmVzdWx0PU5vbmUsCiAgICAgICAgICAgICAgICAgd3JhcF9leGNlcHRpb249RmFsc2UsCiAgICAgICAgICAgICAgICAgc3RvcF9mdW5jPU5vbmUsCiAgICAgICAgICAgICAgICAgd2FpdF9mdW5jPU5vbmUsCiAgICAgICAgICAgICAgICAgd2FpdF9qaXR0ZXJfbWF4PU5vbmUpOgoKICAgICAgICBzZWxmLl9zdG9wX21heF9hdHRlbXB0X251bWJlciA9IDUgaWYgc3RvcF9tYXhfYXR0ZW1wdF9udW1iZXIgaXMgTm9uZSBlbHNlIHN0b3BfbWF4X2F0dGVtcHRfbnVtYmVyCiAgICAgICAgc2VsZi5fc3RvcF9tYXhfZGVsYXkgPSAxMDAgaWYgc3RvcF9tYXhfZGVsYXkgaXMgTm9uZSBlbHNlIHN0b3BfbWF4X2RlbGF5CiAgICAgICAgc2VsZi5fd2FpdF9maXhlZCA9IDEwMDAgaWYgd2FpdF9maXhlZCBpcyBOb25lIGVsc2Ugd2FpdF9maXhlZAogICAgICAgIHNlbGYuX3dhaXRfcmFuZG9tX21pbiA9IDAgaWYgd2FpdF9yYW5kb21fbWluIGlzIE5vbmUgZWxzZSB3YWl0X3JhbmRvbV9taW4KICAgICAgICBzZWxmLl93YWl0X3JhbmRvbV9tYXggPSAxMDAwIGlmIHdhaXRfcmFuZG9tX21heCBpcyBOb25lIGVsc2Ugd2FpdF9yYW5kb21fbWF4CiAgICAgICAgc2VsZi5fd2FpdF9pbmNyZW1lbnRpbmdfc3RhcnQgPSAwIGlmIHdhaXRfaW5jcmVtZW50aW5nX3N0YXJ0IGlzIE5vbmUgZWxzZSB3YWl0X2luY3JlbWVudGluZ19zdGFydAogICAgICAgIHNlbGYuX3dhaXRfaW5jcmVtZW50aW5nX2luY3JlbWVudCA9IDEwMCBpZiB3YWl0X2luY3JlbWVudGluZ19pbmNyZW1lbnQgaXMgTm9uZSBlbHNlIHdhaXRfaW5jcmVtZW50aW5nX2luY3JlbWVudAogICAgICAgIHNlbGYuX3dhaXRfZXhwb25lbnRpYWxfbXVsdGlwbGllciA9IDEgaWYgd2FpdF9leHBvbmVudGlhbF9tdWx0aXBsaWVyIGlzIE5vbmUgZWxzZSB3YWl0X2V4cG9uZW50aWFsX211bHRpcGxpZXIKICAgICAgICBzZWxmLl93YWl0X2V4cG9uZW50aWFsX21heCA9IE1BWF9XQUlUIGlmIHdhaXRfZXhwb25lbnRpYWxfbWF4IGlzIE5vbmUgZWxzZSB3YWl0X2V4cG9uZW50aWFsX21heAogICAgICAgIHNlbGYuX3dhaXRfaml0dGVyX21heCA9IDAgaWYgd2FpdF9qaXR0ZXJfbWF4IGlzIE5vbmUgZWxzZSB3YWl0X2ppdHRlcl9tYXgKCiAgICAgICAgIyBUT0RPIGFkZCBjaGFpbmluZyBvZiBzdG9wIGJlaGF2aW9ycwogICAgICAgICMgc3RvcCBiZWhhdmlvcgogICAgICAgIHN0b3BfZnVuY3MgPSBbXQogICAgICAgIGlmIHN0b3BfbWF4X2F0dGVtcHRfbnVtYmVyIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzdG9wX2Z1bmNzLmFwcGVuZChzZWxmLnN0b3BfYWZ0ZXJfYXR0ZW1wdCkKCiAgICAgICAgaWYgc3RvcF9tYXhfZGVsYXkgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHN0b3BfZnVuY3MuYXBwZW5kKHNlbGYuc3RvcF9hZnRlcl9kZWxheSkKCiAgICAgICAgaWYgc3RvcF9mdW5jIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLnN0b3AgPSBzdG9wX2Z1bmMKCiAgICAgICAgZWxpZiBzdG9wIGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYuc3RvcCA9IGxhbWJkYSBhdHRlbXB0cywgZGVsYXk6IGFueShmKGF0dGVtcHRzLCBkZWxheSkgZm9yIGYgaW4gc3RvcF9mdW5jcykKCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5zdG9wID0gZ2V0YXR0cihzZWxmLCBzdG9wKQoKICAgICAgICAjIFRPRE8gYWRkIGNoYWluaW5nIG9mIHdhaXQgYmVoYXZpb3JzCiAgICAgICAgIyB3YWl0IGJlaGF2aW9yCiAgICAgICAgd2FpdF9mdW5jcyA9IFtsYW1iZGEgKmFyZ3MsICoqa3dhcmdzOiAwXQogICAgICAgIGlmIHdhaXRfZml4ZWQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHdhaXRfZnVuY3MuYXBwZW5kKHNlbGYuZml4ZWRfc2xlZXApCgogICAgICAgIGlmIHdhaXRfcmFuZG9tX21pbiBpcyBub3QgTm9uZSBvciB3YWl0X3JhbmRvbV9tYXggaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHdhaXRfZnVuY3MuYXBwZW5kKHNlbGYucmFuZG9tX3NsZWVwKQoKICAgICAgICBpZiB3YWl0X2luY3JlbWVudGluZ19zdGFydCBpcyBub3QgTm9uZSBvciB3YWl0X2luY3JlbWVudGluZ19pbmNyZW1lbnQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHdhaXRfZnVuY3MuYXBwZW5kKHNlbGYuaW5jcmVtZW50aW5nX3NsZWVwKQoKICAgICAgICBpZiB3YWl0X2V4cG9uZW50aWFsX211bHRpcGxpZXIgaXMgbm90IE5vbmUgb3Igd2FpdF9leHBvbmVudGlhbF9tYXggaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHdhaXRfZnVuY3MuYXBwZW5kKHNlbGYuZXhwb25lbnRpYWxfc2xlZXApCgogICAgICAgIGlmIHdhaXRfZnVuYyBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi53YWl0ID0gd2FpdF9mdW5jCgogICAgICAgIGVsaWYgd2FpdCBpcyBOb25lOgogICAgICAgICAgICBzZWxmLndhaXQgPSBsYW1iZGEgYXR0ZW1wdHMsIGRlbGF5OiBtYXgoZihhdHRlbXB0cywgZGVsYXkpIGZvciBmIGluIHdhaXRfZnVuY3MpCgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYud2FpdCA9IGdldGF0dHIoc2VsZiwgd2FpdCkKCiAgICAgICAgIyByZXRyeSBvbiBleGNlcHRpb24gZmlsdGVyCiAgICAgICAgaWYgcmV0cnlfb25fZXhjZXB0aW9uIGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYuX3JldHJ5X29uX2V4Y2VwdGlvbiA9IHNlbGYuYWx3YXlzX3JlamVjdAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuX3JldHJ5X29uX2V4Y2VwdGlvbiA9IHJldHJ5X29uX2V4Y2VwdGlvbgoKICAgICAgICAjIFRPRE8gc2ltcGxpZnkgcmV0cnlpbmcgYnkgRXhjZXB0aW9uIHR5cGVzCiAgICAgICAgIyByZXRyeSBvbiByZXN1bHQgZmlsdGVyCiAgICAgICAgaWYgcmV0cnlfb25fcmVzdWx0IGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYuX3JldHJ5X29uX3Jlc3VsdCA9IHNlbGYubmV2ZXJfcmVqZWN0CiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5fcmV0cnlfb25fcmVzdWx0ID0gcmV0cnlfb25fcmVzdWx0CgogICAgICAgIHNlbGYuX3dyYXBfZXhjZXB0aW9uID0gd3JhcF9leGNlcHRpb24KCiAgICBkZWYgc3RvcF9hZnRlcl9hdHRlbXB0KHNlbGYsIHByZXZpb3VzX2F0dGVtcHRfbnVtYmVyLCBkZWxheV9zaW5jZV9maXJzdF9hdHRlbXB0X21zKToKICAgICAgICAiIiJTdG9wIGFmdGVyIHRoZSBwcmV2aW91cyBhdHRlbXB0ID49IHN0b3BfbWF4X2F0dGVtcHRfbnVtYmVyLiIiIgogICAgICAgIHJldHVybiBwcmV2aW91c19hdHRlbXB0X251bWJlciA+PSBzZWxmLl9zdG9wX21heF9hdHRlbXB0X251bWJlcgoKICAgIGRlZiBzdG9wX2FmdGVyX2RlbGF5KHNlbGYsIHByZXZpb3VzX2F0dGVtcHRfbnVtYmVyLCBkZWxheV9zaW5jZV9maXJzdF9hdHRlbXB0X21zKToKICAgICAgICAiIiJTdG9wIGFmdGVyIHRoZSB0aW1lIGZyb20gdGhlIGZpcnN0IGF0dGVtcHQgPj0gc3RvcF9tYXhfZGVsYXkuIiIiCiAgICAgICAgcmV0dXJuIGRlbGF5X3NpbmNlX2ZpcnN0X2F0dGVtcHRfbXMgPj0gc2VsZi5fc3RvcF9tYXhfZGVsYXkKCiAgICBkZWYgbm9fc2xlZXAoc2VsZiwgcHJldmlvdXNfYXR0ZW1wdF9udW1iZXIsIGRlbGF5X3NpbmNlX2ZpcnN0X2F0dGVtcHRfbXMpOgogICAgICAgICIiIkRvbid0IHNsZWVwIGF0IGFsbCBiZWZvcmUgcmV0cnlpbmcuIiIiCiAgICAgICAgcmV0dXJuIDAKCiAgICBkZWYgZml4ZWRfc2xlZXAoc2VsZiwgcHJldmlvdXNfYXR0ZW1wdF9udW1iZXIsIGRlbGF5X3NpbmNlX2ZpcnN0X2F0dGVtcHRfbXMpOgogICAgICAgICIiIlNsZWVwIGEgZml4ZWQgYW1vdW50IG9mIHRpbWUgYmV0d2VlbiBlYWNoIHJldHJ5LiIiIgogICAgICAgIHJldHVybiBzZWxmLl93YWl0X2ZpeGVkCgogICAgZGVmIHJhbmRvbV9zbGVlcChzZWxmLCBwcmV2aW91c19hdHRlbXB0X251bWJlciwgZGVsYXlfc2luY2VfZmlyc3RfYXR0ZW1wdF9tcyk6CiAgICAgICAgIiIiU2xlZXAgYSByYW5kb20gYW1vdW50IG9mIHRpbWUgYmV0d2VlbiB3YWl0X3JhbmRvbV9taW4gYW5kIHdhaXRfcmFuZG9tX21heCIiIgogICAgICAgIHJldHVybiByYW5kb20ucmFuZGludChzZWxmLl93YWl0X3JhbmRvbV9taW4sIHNlbGYuX3dhaXRfcmFuZG9tX21heCkKCiAgICBkZWYgaW5jcmVtZW50aW5nX3NsZWVwKHNlbGYsIHByZXZpb3VzX2F0dGVtcHRfbnVtYmVyLCBkZWxheV9zaW5jZV9maXJzdF9hdHRlbXB0X21zKToKICAgICAgICAiIiIKICAgICAgICBTbGVlcCBhbiBpbmNyZW1lbnRhbCBhbW91bnQgb2YgdGltZSBhZnRlciBlYWNoIGF0dGVtcHQsIHN0YXJ0aW5nIGF0CiAgICAgICAgd2FpdF9pbmNyZW1lbnRpbmdfc3RhcnQgYW5kIGluY3JlbWVudGluZyBieSB3YWl0X2luY3JlbWVudGluZ19pbmNyZW1lbnQKICAgICAgICAiIiIKICAgICAgICByZXN1bHQgPSBzZWxmLl93YWl0X2luY3JlbWVudGluZ19zdGFydCArIChzZWxmLl93YWl0X2luY3JlbWVudGluZ19pbmNyZW1lbnQgKiAocHJldmlvdXNfYXR0ZW1wdF9udW1iZXIgLSAxKSkKICAgICAgICBpZiByZXN1bHQgPCAwOgogICAgICAgICAgICByZXN1bHQgPSAwCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBleHBvbmVudGlhbF9zbGVlcChzZWxmLCBwcmV2aW91c19hdHRlbXB0X251bWJlciwgZGVsYXlfc2luY2VfZmlyc3RfYXR0ZW1wdF9tcyk6CiAgICAgICAgZXhwID0gMiAqKiBwcmV2aW91c19hdHRlbXB0X251bWJlcgogICAgICAgIHJlc3VsdCA9IHNlbGYuX3dhaXRfZXhwb25lbnRpYWxfbXVsdGlwbGllciAqIGV4cAogICAgICAgIGlmIHJlc3VsdCA+IHNlbGYuX3dhaXRfZXhwb25lbnRpYWxfbWF4OgogICAgICAgICAgICByZXN1bHQgPSBzZWxmLl93YWl0X2V4cG9uZW50aWFsX21heAogICAgICAgIGlmIHJlc3VsdCA8IDA6CiAgICAgICAgICAgIHJlc3VsdCA9IDAKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIG5ldmVyX3JlamVjdChzZWxmLCByZXN1bHQpOgogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGRlZiBhbHdheXNfcmVqZWN0KHNlbGYsIHJlc3VsdCk6CiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgc2hvdWxkX3JlamVjdChzZWxmLCBhdHRlbXB0KToKICAgICAgICByZWplY3QgPSBGYWxzZQogICAgICAgIGlmIGF0dGVtcHQuaGFzX2V4Y2VwdGlvbjoKICAgICAgICAgICAgcmVqZWN0IHw9IHNlbGYuX3JldHJ5X29uX2V4Y2VwdGlvbihhdHRlbXB0LnZhbHVlWzFdKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJlamVjdCB8PSBzZWxmLl9yZXRyeV9vbl9yZXN1bHQoYXR0ZW1wdC52YWx1ZSkKCiAgICAgICAgcmV0dXJuIHJlamVjdAoKICAgIGRlZiBjYWxsKHNlbGYsIGZuLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgIHN0YXJ0X3RpbWUgPSBpbnQocm91bmQodGltZS50aW1lKCkgKiAxMDAwKSkKICAgICAgICBhdHRlbXB0X251bWJlciA9IDEKICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBhdHRlbXB0ID0gQXR0ZW1wdChmbigqYXJncywgKiprd2FyZ3MpLCBhdHRlbXB0X251bWJlciwgRmFsc2UpCiAgICAgICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgICAgIHRiID0gc3lzLmV4Y19pbmZvKCkKICAgICAgICAgICAgICAgIGF0dGVtcHQgPSBBdHRlbXB0KHRiLCBhdHRlbXB0X251bWJlciwgVHJ1ZSkKCiAgICAgICAgICAgIGlmIG5vdCBzZWxmLnNob3VsZF9yZWplY3QoYXR0ZW1wdCk6CiAgICAgICAgICAgICAgICByZXR1cm4gYXR0ZW1wdC5nZXQoc2VsZi5fd3JhcF9leGNlcHRpb24pCgogICAgICAgICAgICBkZWxheV9zaW5jZV9maXJzdF9hdHRlbXB0X21zID0gaW50KHJvdW5kKHRpbWUudGltZSgpICogMTAwMCkpIC0gc3RhcnRfdGltZQogICAgICAgICAgICBpZiBzZWxmLnN0b3AoYXR0ZW1wdF9udW1iZXIsIGRlbGF5X3NpbmNlX2ZpcnN0X2F0dGVtcHRfbXMpOgogICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuX3dyYXBfZXhjZXB0aW9uIGFuZCBhdHRlbXB0Lmhhc19leGNlcHRpb246CiAgICAgICAgICAgICAgICAgICAgIyBnZXQoKSBvbiBhbiBhdHRlbXB0IHdpdGggYW4gZXhjZXB0aW9uIHNob3VsZCBjYXVzZSBpdCB0byBiZSByYWlzZWQsIGJ1dCByYWlzZSBqdXN0IGluIGNhc2UKICAgICAgICAgICAgICAgICAgICByYWlzZSBhdHRlbXB0LmdldCgpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIFJldHJ5RXJyb3IoYXR0ZW1wdCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNsZWVwID0gc2VsZi53YWl0KGF0dGVtcHRfbnVtYmVyLCBkZWxheV9zaW5jZV9maXJzdF9hdHRlbXB0X21zKQogICAgICAgICAgICAgICAgaWYgc2VsZi5fd2FpdF9qaXR0ZXJfbWF4OgogICAgICAgICAgICAgICAgICAgIGppdHRlciA9IHJhbmRvbS5yYW5kb20oKSAqIHNlbGYuX3dhaXRfaml0dGVyX21heAogICAgICAgICAgICAgICAgICAgIHNsZWVwID0gc2xlZXAgKyBtYXgoMCwgaml0dGVyKQogICAgICAgICAgICAgICAgdGltZS5zbGVlcChzbGVlcCAvIDEwMDAuMCkKCiAgICAgICAgICAgIGF0dGVtcHRfbnVtYmVyICs9IDEKCgpjbGFzcyBBdHRlbXB0KG9iamVjdCk6CiAgICAiIiIKICAgIEFuIEF0dGVtcHQgZW5jYXBzdWxhdGVzIGEgY2FsbCB0byBhIHRhcmdldCBmdW5jdGlvbiB0aGF0IG1heSBlbmQgYXMgYQogICAgbm9ybWFsIHJldHVybiB2YWx1ZSBmcm9tIHRoZSBmdW5jdGlvbiBvciBhbiBFeGNlcHRpb24gZGVwZW5kaW5nIG9uIHdoYXQKICAgIG9jY3VycmVkIGR1cmluZyB0aGUgZXhlY3V0aW9uLgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHZhbHVlLCBhdHRlbXB0X251bWJlciwgaGFzX2V4Y2VwdGlvbik6CiAgICAgICAgc2VsZi52YWx1ZSA9IHZhbHVlCiAgICAgICAgc2VsZi5hdHRlbXB0X251bWJlciA9IGF0dGVtcHRfbnVtYmVyCiAgICAgICAgc2VsZi5oYXNfZXhjZXB0aW9uID0gaGFzX2V4Y2VwdGlvbgoKICAgIGRlZiBnZXQoc2VsZiwgd3JhcF9leGNlcHRpb249RmFsc2UpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoaXMgQXR0ZW1wdCBpbnN0YW5jZSBvciByYWlzZSBhbiBFeGNlcHRpb24uCiAgICAgICAgSWYgd3JhcF9leGNlcHRpb24gaXMgdHJ1ZSwgdGhpcyBBdHRlbXB0IGlzIHdyYXBwZWQgaW5zaWRlIG9mIGEKICAgICAgICBSZXRyeUVycm9yIGJlZm9yZSBiZWluZyByYWlzZWQuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5oYXNfZXhjZXB0aW9uOgogICAgICAgICAgICBpZiB3cmFwX2V4Y2VwdGlvbjoKICAgICAgICAgICAgICAgIHJhaXNlIFJldHJ5RXJyb3Ioc2VsZikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNpeC5yZXJhaXNlKHNlbGYudmFsdWVbMF0sIHNlbGYudmFsdWVbMV0sIHNlbGYudmFsdWVbMl0pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHNlbGYudmFsdWUKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgaWYgc2VsZi5oYXNfZXhjZXB0aW9uOgogICAgICAgICAgICByZXR1cm4gIkF0dGVtcHRzOiB7MH0sIEVycm9yOlxuezF9Ii5mb3JtYXQoc2VsZi5hdHRlbXB0X251bWJlciwgIiIuam9pbih0cmFjZWJhY2suZm9ybWF0X3RiKHNlbGYudmFsdWVbMl0pKSkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gIkF0dGVtcHRzOiB7MH0sIFZhbHVlOiB7MX0iLmZvcm1hdChzZWxmLmF0dGVtcHRfbnVtYmVyLCBzZWxmLnZhbHVlKQoKCmNsYXNzIFJldHJ5RXJyb3IoRXhjZXB0aW9uKToKICAgICIiIgogICAgQSBSZXRyeUVycm9yIGVuY2Fwc3VsYXRlcyB0aGUgbGFzdCBBdHRlbXB0IGluc3RhbmNlIHJpZ2h0IGJlZm9yZSBnaXZpbmcgdXAuCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbGFzdF9hdHRlbXB0KToKICAgICAgICBzZWxmLmxhc3RfYXR0ZW1wdCA9IGxhc3RfYXR0ZW1wdAoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiUmV0cnlFcnJvclt7MH1dIi5mb3JtYXQoc2VsZi5sYXN0X2F0dGVtcHQpClBLAwQUAAAAAAAAACEAmVhNWpJ1AACSdQAALwAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3Ivc2l4LnB5IiIiVXRpbGl0aWVzIGZvciB3cml0aW5nIGNvZGUgdGhhdCBydW5zIG9uIFB5dGhvbiAyIGFuZCAzIiIiCgojIENvcHlyaWdodCAoYykgMjAxMC0yMDE1IEJlbmphbWluIFBldGVyc29uCiMKIyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CiMgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKIyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCiMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAojIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwojIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiMKIyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKIyBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgojCiMgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKIyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKIyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKIyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCiMgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKIyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQojIFNPRlRXQVJFLgoKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBmdW5jdG9vbHMKaW1wb3J0IGl0ZXJ0b29scwppbXBvcnQgb3BlcmF0b3IKaW1wb3J0IHN5cwppbXBvcnQgdHlwZXMKCl9fYXV0aG9yX18gPSAiQmVuamFtaW4gUGV0ZXJzb24gPGJlbmphbWluQHB5dGhvbi5vcmc+IgpfX3ZlcnNpb25fXyA9ICIxLjEwLjAiCgoKIyBVc2VmdWwgZm9yIHZlcnkgY29hcnNlIHZlcnNpb24gZGlmZmVyZW50aWF0aW9uLgpQWTIgPSBzeXMudmVyc2lvbl9pbmZvWzBdID09IDIKUFkzID0gc3lzLnZlcnNpb25faW5mb1swXSA9PSAzClBZMzQgPSBzeXMudmVyc2lvbl9pbmZvWzA6Ml0gPj0gKDMsIDQpCgppZiBQWTM6CiAgICBzdHJpbmdfdHlwZXMgPSBzdHIsCiAgICBpbnRlZ2VyX3R5cGVzID0gaW50LAogICAgY2xhc3NfdHlwZXMgPSB0eXBlLAogICAgdGV4dF90eXBlID0gc3RyCiAgICBiaW5hcnlfdHlwZSA9IGJ5dGVzCgogICAgTUFYU0laRSA9IHN5cy5tYXhzaXplCmVsc2U6CiAgICBzdHJpbmdfdHlwZXMgPSBiYXNlc3RyaW5nLAogICAgaW50ZWdlcl90eXBlcyA9IChpbnQsIGxvbmcpCiAgICBjbGFzc190eXBlcyA9ICh0eXBlLCB0eXBlcy5DbGFzc1R5cGUpCiAgICB0ZXh0X3R5cGUgPSB1bmljb2RlCiAgICBiaW5hcnlfdHlwZSA9IHN0cgoKICAgIGlmIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCJqYXZhIik6CiAgICAgICAgIyBKeXRob24gYWx3YXlzIHVzZXMgMzIgYml0cy4KICAgICAgICBNQVhTSVpFID0gaW50KCgxIDw8IDMxKSAtIDEpCiAgICBlbHNlOgogICAgICAgICMgSXQncyBwb3NzaWJsZSB0byBoYXZlIHNpemVvZihsb25nKSAhPSBzaXplb2YoUHlfc3NpemVfdCkuCiAgICAgICAgY2xhc3MgWChvYmplY3QpOgoKICAgICAgICAgICAgZGVmIF9fbGVuX18oc2VsZik6CiAgICAgICAgICAgICAgICByZXR1cm4gMSA8PCAzMQogICAgICAgIHRyeToKICAgICAgICAgICAgbGVuKFgoKSkKICAgICAgICBleGNlcHQgT3ZlcmZsb3dFcnJvcjoKICAgICAgICAgICAgIyAzMi1iaXQKICAgICAgICAgICAgTUFYU0laRSA9IGludCgoMSA8PCAzMSkgLSAxKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgNjQtYml0CiAgICAgICAgICAgIE1BWFNJWkUgPSBpbnQoKDEgPDwgNjMpIC0gMSkKICAgICAgICBkZWwgWAoKCmRlZiBfYWRkX2RvYyhmdW5jLCBkb2MpOgogICAgIiIiQWRkIGRvY3VtZW50YXRpb24gdG8gYSBmdW5jdGlvbi4iIiIKICAgIGZ1bmMuX19kb2NfXyA9IGRvYwoKCmRlZiBfaW1wb3J0X21vZHVsZShuYW1lKToKICAgICIiIkltcG9ydCBtb2R1bGUsIHJldHVybmluZyB0aGUgbW9kdWxlIGFmdGVyIHRoZSBsYXN0IGRvdC4iIiIKICAgIF9faW1wb3J0X18obmFtZSkKICAgIHJldHVybiBzeXMubW9kdWxlc1tuYW1lXQoKCmNsYXNzIF9MYXp5RGVzY3Iob2JqZWN0KToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSk6CiAgICAgICAgc2VsZi5uYW1lID0gbmFtZQoKICAgIGRlZiBfX2dldF9fKHNlbGYsIG9iaiwgdHApOgogICAgICAgIHJlc3VsdCA9IHNlbGYuX3Jlc29sdmUoKQogICAgICAgIHNldGF0dHIob2JqLCBzZWxmLm5hbWUsIHJlc3VsdCkgICMgSW52b2tlcyBfX3NldF9fLgogICAgICAgIHRyeToKICAgICAgICAgICAgIyBUaGlzIGlzIGEgYml0IHVnbHksIGJ1dCBpdCBhdm9pZHMgcnVubmluZyB0aGlzIGFnYWluIGJ5CiAgICAgICAgICAgICMgcmVtb3ZpbmcgdGhpcyBkZXNjcmlwdG9yLgogICAgICAgICAgICBkZWxhdHRyKG9iai5fX2NsYXNzX18sIHNlbGYubmFtZSkKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIHBhc3MKICAgICAgICByZXR1cm4gcmVzdWx0CgoKY2xhc3MgTW92ZWRNb2R1bGUoX0xhenlEZXNjcik6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIG9sZCwgbmV3PU5vbmUpOgogICAgICAgIHN1cGVyKE1vdmVkTW9kdWxlLCBzZWxmKS5fX2luaXRfXyhuYW1lKQogICAgICAgIGlmIFBZMzoKICAgICAgICAgICAgaWYgbmV3IGlzIE5vbmU6CiAgICAgICAgICAgICAgICBuZXcgPSBuYW1lCiAgICAgICAgICAgIHNlbGYubW9kID0gbmV3CiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5tb2QgPSBvbGQKCiAgICBkZWYgX3Jlc29sdmUoc2VsZik6CiAgICAgICAgcmV0dXJuIF9pbXBvcnRfbW9kdWxlKHNlbGYubW9kKQoKICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBhdHRyKToKICAgICAgICBfbW9kdWxlID0gc2VsZi5fcmVzb2x2ZSgpCiAgICAgICAgdmFsdWUgPSBnZXRhdHRyKF9tb2R1bGUsIGF0dHIpCiAgICAgICAgc2V0YXR0cihzZWxmLCBhdHRyLCB2YWx1ZSkKICAgICAgICByZXR1cm4gdmFsdWUKCgpjbGFzcyBfTGF6eU1vZHVsZSh0eXBlcy5Nb2R1bGVUeXBlKToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSk6CiAgICAgICAgc3VwZXIoX0xhenlNb2R1bGUsIHNlbGYpLl9faW5pdF9fKG5hbWUpCiAgICAgICAgc2VsZi5fX2RvY19fID0gc2VsZi5fX2NsYXNzX18uX19kb2NfXwoKICAgIGRlZiBfX2Rpcl9fKHNlbGYpOgogICAgICAgIGF0dHJzID0gWyJfX2RvY19fIiwgIl9fbmFtZV9fIl0KICAgICAgICBhdHRycyArPSBbYXR0ci5uYW1lIGZvciBhdHRyIGluIHNlbGYuX21vdmVkX2F0dHJpYnV0ZXNdCiAgICAgICAgcmV0dXJuIGF0dHJzCgogICAgIyBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0aGlzCiAgICBfbW92ZWRfYXR0cmlidXRlcyA9IFtdCgoKY2xhc3MgTW92ZWRBdHRyaWJ1dGUoX0xhenlEZXNjcik6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIG9sZF9tb2QsIG5ld19tb2QsIG9sZF9hdHRyPU5vbmUsIG5ld19hdHRyPU5vbmUpOgogICAgICAgIHN1cGVyKE1vdmVkQXR0cmlidXRlLCBzZWxmKS5fX2luaXRfXyhuYW1lKQogICAgICAgIGlmIFBZMzoKICAgICAgICAgICAgaWYgbmV3X21vZCBpcyBOb25lOgogICAgICAgICAgICAgICAgbmV3X21vZCA9IG5hbWUKICAgICAgICAgICAgc2VsZi5tb2QgPSBuZXdfbW9kCiAgICAgICAgICAgIGlmIG5ld19hdHRyIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBpZiBvbGRfYXR0ciBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgIG5ld19hdHRyID0gbmFtZQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBuZXdfYXR0ciA9IG9sZF9hdHRyCiAgICAgICAgICAgIHNlbGYuYXR0ciA9IG5ld19hdHRyCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5tb2QgPSBvbGRfbW9kCiAgICAgICAgICAgIGlmIG9sZF9hdHRyIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBvbGRfYXR0ciA9IG5hbWUKICAgICAgICAgICAgc2VsZi5hdHRyID0gb2xkX2F0dHIKCiAgICBkZWYgX3Jlc29sdmUoc2VsZik6CiAgICAgICAgbW9kdWxlID0gX2ltcG9ydF9tb2R1bGUoc2VsZi5tb2QpCiAgICAgICAgcmV0dXJuIGdldGF0dHIobW9kdWxlLCBzZWxmLmF0dHIpCgoKY2xhc3MgX1NpeE1ldGFQYXRoSW1wb3J0ZXIob2JqZWN0KToKCiAgICAiIiIKICAgIEEgbWV0YSBwYXRoIGltcG9ydGVyIHRvIGltcG9ydCBzaXgubW92ZXMgYW5kIGl0cyBzdWJtb2R1bGVzLgoKICAgIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhIFBFUDMwMiBmaW5kZXIgYW5kIGxvYWRlci4gSXQgc2hvdWxkIGJlIGNvbXBhdGlibGUKICAgIHdpdGggUHl0aG9uIDIuNSBhbmQgYWxsIGV4aXN0aW5nIHZlcnNpb25zIG9mIFB5dGhvbjMKICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzaXhfbW9kdWxlX25hbWUpOgogICAgICAgIHNlbGYubmFtZSA9IHNpeF9tb2R1bGVfbmFtZQogICAgICAgIHNlbGYua25vd25fbW9kdWxlcyA9IHt9CgogICAgZGVmIF9hZGRfbW9kdWxlKHNlbGYsIG1vZCwgKmZ1bGxuYW1lcyk6CiAgICAgICAgZm9yIGZ1bGxuYW1lIGluIGZ1bGxuYW1lczoKICAgICAgICAgICAgc2VsZi5rbm93bl9tb2R1bGVzW3NlbGYubmFtZSArICIuIiArIGZ1bGxuYW1lXSA9IG1vZAoKICAgIGRlZiBfZ2V0X21vZHVsZShzZWxmLCBmdWxsbmFtZSk6CiAgICAgICAgcmV0dXJuIHNlbGYua25vd25fbW9kdWxlc1tzZWxmLm5hbWUgKyAiLiIgKyBmdWxsbmFtZV0KCiAgICBkZWYgZmluZF9tb2R1bGUoc2VsZiwgZnVsbG5hbWUsIHBhdGg9Tm9uZSk6CiAgICAgICAgaWYgZnVsbG5hbWUgaW4gc2VsZi5rbm93bl9tb2R1bGVzOgogICAgICAgICAgICByZXR1cm4gc2VsZgogICAgICAgIHJldHVybiBOb25lCgogICAgZGVmIF9fZ2V0X21vZHVsZShzZWxmLCBmdWxsbmFtZSk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc2VsZi5rbm93bl9tb2R1bGVzW2Z1bGxuYW1lXQogICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IoIlRoaXMgbG9hZGVyIGRvZXMgbm90IGtub3cgbW9kdWxlICIgKyBmdWxsbmFtZSkKCiAgICBkZWYgbG9hZF9tb2R1bGUoc2VsZiwgZnVsbG5hbWUpOgogICAgICAgIHRyeToKICAgICAgICAgICAgIyBpbiBjYXNlIG9mIGEgcmVsb2FkCiAgICAgICAgICAgIHJldHVybiBzeXMubW9kdWxlc1tmdWxsbmFtZV0KICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgIHBhc3MKICAgICAgICBtb2QgPSBzZWxmLl9fZ2V0X21vZHVsZShmdWxsbmFtZSkKICAgICAgICBpZiBpc2luc3RhbmNlKG1vZCwgTW92ZWRNb2R1bGUpOgogICAgICAgICAgICBtb2QgPSBtb2QuX3Jlc29sdmUoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG1vZC5fX2xvYWRlcl9fID0gc2VsZgogICAgICAgIHN5cy5tb2R1bGVzW2Z1bGxuYW1lXSA9IG1vZAogICAgICAgIHJldHVybiBtb2QKCiAgICBkZWYgaXNfcGFja2FnZShzZWxmLCBmdWxsbmFtZSk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIHRydWUsIGlmIHRoZSBuYW1lZCBtb2R1bGUgaXMgYSBwYWNrYWdlLgoKICAgICAgICBXZSBuZWVkIHRoaXMgbWV0aG9kIHRvIGdldCBjb3JyZWN0IHNwZWMgb2JqZWN0cyB3aXRoCiAgICAgICAgUHl0aG9uIDMuNCAoc2VlIFBFUDQ1MSkKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gaGFzYXR0cihzZWxmLl9fZ2V0X21vZHVsZShmdWxsbmFtZSksICJfX3BhdGhfXyIpCgogICAgZGVmIGdldF9jb2RlKHNlbGYsIGZ1bGxuYW1lKToKICAgICAgICAiIiJSZXR1cm4gTm9uZQoKICAgICAgICBSZXF1aXJlZCwgaWYgaXNfcGFja2FnZSBpcyBpbXBsZW1lbnRlZCIiIgogICAgICAgIHNlbGYuX19nZXRfbW9kdWxlKGZ1bGxuYW1lKSAgIyBldmVudHVhbGx5IHJhaXNlcyBJbXBvcnRFcnJvcgogICAgICAgIHJldHVybiBOb25lCiAgICBnZXRfc291cmNlID0gZ2V0X2NvZGUgICMgc2FtZSBhcyBnZXRfY29kZQoKX2ltcG9ydGVyID0gX1NpeE1ldGFQYXRoSW1wb3J0ZXIoX19uYW1lX18pCgoKY2xhc3MgX01vdmVkSXRlbXMoX0xhenlNb2R1bGUpOgoKICAgICIiIkxhenkgbG9hZGluZyBvZiBtb3ZlZCBvYmplY3RzIiIiCiAgICBfX3BhdGhfXyA9IFtdICAjIG1hcmsgYXMgcGFja2FnZQoKCl9tb3ZlZF9hdHRyaWJ1dGVzID0gWwogICAgTW92ZWRBdHRyaWJ1dGUoImNTdHJpbmdJTyIsICJjU3RyaW5nSU8iLCAiaW8iLCAiU3RyaW5nSU8iKSwKICAgIE1vdmVkQXR0cmlidXRlKCJmaWx0ZXIiLCAiaXRlcnRvb2xzIiwgImJ1aWx0aW5zIiwgImlmaWx0ZXIiLCAiZmlsdGVyIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiZmlsdGVyZmFsc2UiLCAiaXRlcnRvb2xzIiwgIml0ZXJ0b29scyIsICJpZmlsdGVyZmFsc2UiLCAiZmlsdGVyZmFsc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJpbnB1dCIsICJfX2J1aWx0aW5fXyIsICJidWlsdGlucyIsICJyYXdfaW5wdXQiLCAiaW5wdXQiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJpbnRlcm4iLCAiX19idWlsdGluX18iLCAic3lzIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgibWFwIiwgIml0ZXJ0b29scyIsICJidWlsdGlucyIsICJpbWFwIiwgIm1hcCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImdldGN3ZCIsICJvcyIsICJvcyIsICJnZXRjd2R1IiwgImdldGN3ZCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImdldGN3ZGIiLCAib3MiLCAib3MiLCAiZ2V0Y3dkIiwgImdldGN3ZGIiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJyYW5nZSIsICJfX2J1aWx0aW5fXyIsICJidWlsdGlucyIsICJ4cmFuZ2UiLCAicmFuZ2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJyZWxvYWRfbW9kdWxlIiwgIl9fYnVpbHRpbl9fIiwgImltcG9ydGxpYiIgaWYgUFkzNCBlbHNlICJpbXAiLCAicmVsb2FkIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgicmVkdWNlIiwgIl9fYnVpbHRpbl9fIiwgImZ1bmN0b29scyIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInNobGV4X3F1b3RlIiwgInBpcGVzIiwgInNobGV4IiwgInF1b3RlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiU3RyaW5nSU8iLCAiU3RyaW5nSU8iLCAiaW8iKSwKICAgIE1vdmVkQXR0cmlidXRlKCJVc2VyRGljdCIsICJVc2VyRGljdCIsICJjb2xsZWN0aW9ucyIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlVzZXJMaXN0IiwgIlVzZXJMaXN0IiwgImNvbGxlY3Rpb25zIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiVXNlclN0cmluZyIsICJVc2VyU3RyaW5nIiwgImNvbGxlY3Rpb25zIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgieHJhbmdlIiwgIl9fYnVpbHRpbl9fIiwgImJ1aWx0aW5zIiwgInhyYW5nZSIsICJyYW5nZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInppcCIsICJpdGVydG9vbHMiLCAiYnVpbHRpbnMiLCAiaXppcCIsICJ6aXAiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ6aXBfbG9uZ2VzdCIsICJpdGVydG9vbHMiLCAiaXRlcnRvb2xzIiwgIml6aXBfbG9uZ2VzdCIsICJ6aXBfbG9uZ2VzdCIpLAogICAgTW92ZWRNb2R1bGUoImJ1aWx0aW5zIiwgIl9fYnVpbHRpbl9fIiksCiAgICBNb3ZlZE1vZHVsZSgiY29uZmlncGFyc2VyIiwgIkNvbmZpZ1BhcnNlciIpLAogICAgTW92ZWRNb2R1bGUoImNvcHlyZWciLCAiY29weV9yZWciKSwKICAgIE1vdmVkTW9kdWxlKCJkYm1fZ251IiwgImdkYm0iLCAiZGJtLmdudSIpLAogICAgTW92ZWRNb2R1bGUoIl9kdW1teV90aHJlYWQiLCAiZHVtbXlfdGhyZWFkIiwgIl9kdW1teV90aHJlYWQiKSwKICAgIE1vdmVkTW9kdWxlKCJodHRwX2Nvb2tpZWphciIsICJjb29raWVsaWIiLCAiaHR0cC5jb29raWVqYXIiKSwKICAgIE1vdmVkTW9kdWxlKCJodHRwX2Nvb2tpZXMiLCAiQ29va2llIiwgImh0dHAuY29va2llcyIpLAogICAgTW92ZWRNb2R1bGUoImh0bWxfZW50aXRpZXMiLCAiaHRtbGVudGl0eWRlZnMiLCAiaHRtbC5lbnRpdGllcyIpLAogICAgTW92ZWRNb2R1bGUoImh0bWxfcGFyc2VyIiwgIkhUTUxQYXJzZXIiLCAiaHRtbC5wYXJzZXIiKSwKICAgIE1vdmVkTW9kdWxlKCJodHRwX2NsaWVudCIsICJodHRwbGliIiwgImh0dHAuY2xpZW50IiksCiAgICBNb3ZlZE1vZHVsZSgiZW1haWxfbWltZV9tdWx0aXBhcnQiLCAiZW1haWwuTUlNRU11bHRpcGFydCIsICJlbWFpbC5taW1lLm11bHRpcGFydCIpLAogICAgTW92ZWRNb2R1bGUoImVtYWlsX21pbWVfbm9ubXVsdGlwYXJ0IiwgImVtYWlsLk1JTUVOb25NdWx0aXBhcnQiLCAiZW1haWwubWltZS5ub25tdWx0aXBhcnQiKSwKICAgIE1vdmVkTW9kdWxlKCJlbWFpbF9taW1lX3RleHQiLCAiZW1haWwuTUlNRVRleHQiLCAiZW1haWwubWltZS50ZXh0IiksCiAgICBNb3ZlZE1vZHVsZSgiZW1haWxfbWltZV9iYXNlIiwgImVtYWlsLk1JTUVCYXNlIiwgImVtYWlsLm1pbWUuYmFzZSIpLAogICAgTW92ZWRNb2R1bGUoIkJhc2VIVFRQU2VydmVyIiwgIkJhc2VIVFRQU2VydmVyIiwgImh0dHAuc2VydmVyIiksCiAgICBNb3ZlZE1vZHVsZSgiQ0dJSFRUUFNlcnZlciIsICJDR0lIVFRQU2VydmVyIiwgImh0dHAuc2VydmVyIiksCiAgICBNb3ZlZE1vZHVsZSgiU2ltcGxlSFRUUFNlcnZlciIsICJTaW1wbGVIVFRQU2VydmVyIiwgImh0dHAuc2VydmVyIiksCiAgICBNb3ZlZE1vZHVsZSgiY1BpY2tsZSIsICJjUGlja2xlIiwgInBpY2tsZSIpLAogICAgTW92ZWRNb2R1bGUoInF1ZXVlIiwgIlF1ZXVlIiksCiAgICBNb3ZlZE1vZHVsZSgicmVwcmxpYiIsICJyZXByIiksCiAgICBNb3ZlZE1vZHVsZSgic29ja2V0c2VydmVyIiwgIlNvY2tldFNlcnZlciIpLAogICAgTW92ZWRNb2R1bGUoIl90aHJlYWQiLCAidGhyZWFkIiwgIl90aHJlYWQiKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyIiwgIlRraW50ZXIiKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX2RpYWxvZyIsICJEaWFsb2ciLCAidGtpbnRlci5kaWFsb2ciKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX2ZpbGVkaWFsb2ciLCAiRmlsZURpYWxvZyIsICJ0a2ludGVyLmZpbGVkaWFsb2ciKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX3Njcm9sbGVkdGV4dCIsICJTY3JvbGxlZFRleHQiLCAidGtpbnRlci5zY3JvbGxlZHRleHQiKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX3NpbXBsZWRpYWxvZyIsICJTaW1wbGVEaWFsb2ciLCAidGtpbnRlci5zaW1wbGVkaWFsb2ciKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX3RpeCIsICJUaXgiLCAidGtpbnRlci50aXgiKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX3R0ayIsICJ0dGsiLCAidGtpbnRlci50dGsiKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX2NvbnN0YW50cyIsICJUa2NvbnN0YW50cyIsICJ0a2ludGVyLmNvbnN0YW50cyIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfZG5kIiwgIlRrZG5kIiwgInRraW50ZXIuZG5kIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl9jb2xvcmNob29zZXIiLCAidGtDb2xvckNob29zZXIiLAogICAgICAgICAgICAgICAgInRraW50ZXIuY29sb3JjaG9vc2VyIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl9jb21tb25kaWFsb2ciLCAidGtDb21tb25EaWFsb2ciLAogICAgICAgICAgICAgICAgInRraW50ZXIuY29tbW9uZGlhbG9nIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl90a2ZpbGVkaWFsb2ciLCAidGtGaWxlRGlhbG9nIiwgInRraW50ZXIuZmlsZWRpYWxvZyIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfZm9udCIsICJ0a0ZvbnQiLCAidGtpbnRlci5mb250IiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl9tZXNzYWdlYm94IiwgInRrTWVzc2FnZUJveCIsICJ0a2ludGVyLm1lc3NhZ2Vib3giKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX3Rrc2ltcGxlZGlhbG9nIiwgInRrU2ltcGxlRGlhbG9nIiwKICAgICAgICAgICAgICAgICJ0a2ludGVyLnNpbXBsZWRpYWxvZyIpLAogICAgTW92ZWRNb2R1bGUoInVybGxpYl9wYXJzZSIsIF9fbmFtZV9fICsgIi5tb3Zlcy51cmxsaWJfcGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZE1vZHVsZSgidXJsbGliX2Vycm9yIiwgX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYl9lcnJvciIsICJ1cmxsaWIuZXJyb3IiKSwKICAgIE1vdmVkTW9kdWxlKCJ1cmxsaWIiLCBfX25hbWVfXyArICIubW92ZXMudXJsbGliIiwgX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYiIpLAogICAgTW92ZWRNb2R1bGUoInVybGxpYl9yb2JvdHBhcnNlciIsICJyb2JvdHBhcnNlciIsICJ1cmxsaWIucm9ib3RwYXJzZXIiKSwKICAgIE1vdmVkTW9kdWxlKCJ4bWxycGNfY2xpZW50IiwgInhtbHJwY2xpYiIsICJ4bWxycGMuY2xpZW50IiksCiAgICBNb3ZlZE1vZHVsZSgieG1scnBjX3NlcnZlciIsICJTaW1wbGVYTUxSUENTZXJ2ZXIiLCAieG1scnBjLnNlcnZlciIpLApdCiMgQWRkIHdpbmRvd3Mgc3BlY2lmaWMgbW9kdWxlcy4KaWYgc3lzLnBsYXRmb3JtID09ICJ3aW4zMiI6CiAgICBfbW92ZWRfYXR0cmlidXRlcyArPSBbCiAgICAgICAgTW92ZWRNb2R1bGUoIndpbnJlZyIsICJfd2lucmVnIiksCiAgICBdCgpmb3IgYXR0ciBpbiBfbW92ZWRfYXR0cmlidXRlczoKICAgIHNldGF0dHIoX01vdmVkSXRlbXMsIGF0dHIubmFtZSwgYXR0cikKICAgIGlmIGlzaW5zdGFuY2UoYXR0ciwgTW92ZWRNb2R1bGUpOgogICAgICAgIF9pbXBvcnRlci5fYWRkX21vZHVsZShhdHRyLCAibW92ZXMuIiArIGF0dHIubmFtZSkKZGVsIGF0dHIKCl9Nb3ZlZEl0ZW1zLl9tb3ZlZF9hdHRyaWJ1dGVzID0gX21vdmVkX2F0dHJpYnV0ZXMKCm1vdmVzID0gX01vdmVkSXRlbXMoX19uYW1lX18gKyAiLm1vdmVzIikKX2ltcG9ydGVyLl9hZGRfbW9kdWxlKG1vdmVzLCAibW92ZXMiKQoKCmNsYXNzIE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3BhcnNlKF9MYXp5TW9kdWxlKToKCiAgICAiIiJMYXp5IGxvYWRpbmcgb2YgbW92ZWQgb2JqZWN0cyBpbiBzaXgubW92ZXMudXJsbGliX3BhcnNlIiIiCgoKX3VybGxpYl9wYXJzZV9tb3ZlZF9hdHRyaWJ1dGVzID0gWwogICAgTW92ZWRBdHRyaWJ1dGUoIlBhcnNlUmVzdWx0IiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlNwbGl0UmVzdWx0IiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInBhcnNlX3FzIiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInBhcnNlX3FzbCIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmxkZWZyYWciLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJsam9pbiIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmxwYXJzZSIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmxzcGxpdCIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmx1bnBhcnNlIiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVybHVuc3BsaXQiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgicXVvdGUiLCAidXJsbGliIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInF1b3RlX3BsdXMiLCAidXJsbGliIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVucXVvdGUiLCAidXJsbGliIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVucXVvdGVfcGx1cyIsICJ1cmxsaWIiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJsZW5jb2RlIiwgInVybGxpYiIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJzcGxpdHF1ZXJ5IiwgInVybGxpYiIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJzcGxpdHRhZyIsICJ1cmxsaWIiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgic3BsaXR1c2VyIiwgInVybGxpYiIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1c2VzX2ZyYWdtZW50IiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVzZXNfbmV0bG9jIiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVzZXNfcGFyYW1zIiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVzZXNfcXVlcnkiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXNlc19yZWxhdGl2ZSIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKXQpmb3IgYXR0ciBpbiBfdXJsbGliX3BhcnNlX21vdmVkX2F0dHJpYnV0ZXM6CiAgICBzZXRhdHRyKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3BhcnNlLCBhdHRyLm5hbWUsIGF0dHIpCmRlbCBhdHRyCgpNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9wYXJzZS5fbW92ZWRfYXR0cmlidXRlcyA9IF91cmxsaWJfcGFyc2VfbW92ZWRfYXR0cmlidXRlcwoKX2ltcG9ydGVyLl9hZGRfbW9kdWxlKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3BhcnNlKF9fbmFtZV9fICsgIi5tb3Zlcy51cmxsaWJfcGFyc2UiKSwKICAgICAgICAgICAgICAgICAgICAgICJtb3Zlcy51cmxsaWJfcGFyc2UiLCAibW92ZXMudXJsbGliLnBhcnNlIikKCgpjbGFzcyBNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9lcnJvcihfTGF6eU1vZHVsZSk6CgogICAgIiIiTGF6eSBsb2FkaW5nIG9mIG1vdmVkIG9iamVjdHMgaW4gc2l4Lm1vdmVzLnVybGxpYl9lcnJvciIiIgoKCl91cmxsaWJfZXJyb3JfbW92ZWRfYXR0cmlidXRlcyA9IFsKICAgIE1vdmVkQXR0cmlidXRlKCJVUkxFcnJvciIsICJ1cmxsaWIyIiwgInVybGxpYi5lcnJvciIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBFcnJvciIsICJ1cmxsaWIyIiwgInVybGxpYi5lcnJvciIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkNvbnRlbnRUb29TaG9ydEVycm9yIiwgInVybGxpYiIsICJ1cmxsaWIuZXJyb3IiKSwKXQpmb3IgYXR0ciBpbiBfdXJsbGliX2Vycm9yX21vdmVkX2F0dHJpYnV0ZXM6CiAgICBzZXRhdHRyKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX2Vycm9yLCBhdHRyLm5hbWUsIGF0dHIpCmRlbCBhdHRyCgpNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9lcnJvci5fbW92ZWRfYXR0cmlidXRlcyA9IF91cmxsaWJfZXJyb3JfbW92ZWRfYXR0cmlidXRlcwoKX2ltcG9ydGVyLl9hZGRfbW9kdWxlKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX2Vycm9yKF9fbmFtZV9fICsgIi5tb3Zlcy51cmxsaWIuZXJyb3IiKSwKICAgICAgICAgICAgICAgICAgICAgICJtb3Zlcy51cmxsaWJfZXJyb3IiLCAibW92ZXMudXJsbGliLmVycm9yIikKCgpjbGFzcyBNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yZXF1ZXN0KF9MYXp5TW9kdWxlKToKCiAgICAiIiJMYXp5IGxvYWRpbmcgb2YgbW92ZWQgb2JqZWN0cyBpbiBzaXgubW92ZXMudXJsbGliX3JlcXVlc3QiIiIKCgpfdXJsbGliX3JlcXVlc3RfbW92ZWRfYXR0cmlidXRlcyA9IFsKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmxvcGVuIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJpbnN0YWxsX29wZW5lciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiYnVpbGRfb3BlbmVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJwYXRobmFtZTJ1cmwiLCAidXJsbGliIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJsMnBhdGhuYW1lIiwgInVybGxpYiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImdldHByb3hpZXMiLCAidXJsbGliIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiUmVxdWVzdCIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiT3BlbmVyRGlyZWN0b3IiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBEZWZhdWx0RXJyb3JIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQUmVkaXJlY3RIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQQ29va2llUHJvY2Vzc29yIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJQcm94eUhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkJhc2VIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQUGFzc3dvcmRNZ3IiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBQYXNzd29yZE1ncldpdGhEZWZhdWx0UmVhbG0iLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkFic3RyYWN0QmFzaWNBdXRoSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUEJhc2ljQXV0aEhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlByb3h5QmFzaWNBdXRoSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiQWJzdHJhY3REaWdlc3RBdXRoSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUERpZ2VzdEF1dGhIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJQcm94eURpZ2VzdEF1dGhIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUFNIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJGaWxlSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiRlRQSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiQ2FjaGVGVFBIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJVbmtub3duSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUEVycm9yUHJvY2Vzc29yIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmxyZXRyaWV2ZSIsICJ1cmxsaWIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmxjbGVhbnVwIiwgInVybGxpYiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlVSTG9wZW5lciIsICJ1cmxsaWIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJGYW5jeVVSTG9wZW5lciIsICJ1cmxsaWIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJwcm94eV9ieXBhc3MiLCAidXJsbGliIiwgInVybGxpYi5yZXF1ZXN0IiksCl0KZm9yIGF0dHIgaW4gX3VybGxpYl9yZXF1ZXN0X21vdmVkX2F0dHJpYnV0ZXM6CiAgICBzZXRhdHRyKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3JlcXVlc3QsIGF0dHIubmFtZSwgYXR0cikKZGVsIGF0dHIKCk1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3JlcXVlc3QuX21vdmVkX2F0dHJpYnV0ZXMgPSBfdXJsbGliX3JlcXVlc3RfbW92ZWRfYXR0cmlidXRlcwoKX2ltcG9ydGVyLl9hZGRfbW9kdWxlKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3JlcXVlc3QoX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYi5yZXF1ZXN0IiksCiAgICAgICAgICAgICAgICAgICAgICAibW92ZXMudXJsbGliX3JlcXVlc3QiLCAibW92ZXMudXJsbGliLnJlcXVlc3QiKQoKCmNsYXNzIE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3Jlc3BvbnNlKF9MYXp5TW9kdWxlKToKCiAgICAiIiJMYXp5IGxvYWRpbmcgb2YgbW92ZWQgb2JqZWN0cyBpbiBzaXgubW92ZXMudXJsbGliX3Jlc3BvbnNlIiIiCgoKX3VybGxpYl9yZXNwb25zZV9tb3ZlZF9hdHRyaWJ1dGVzID0gWwogICAgTW92ZWRBdHRyaWJ1dGUoImFkZGJhc2UiLCAidXJsbGliIiwgInVybGxpYi5yZXNwb25zZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImFkZGNsb3NlaG9vayIsICJ1cmxsaWIiLCAidXJsbGliLnJlc3BvbnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiYWRkaW5mbyIsICJ1cmxsaWIiLCAidXJsbGliLnJlc3BvbnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiYWRkaW5mb3VybCIsICJ1cmxsaWIiLCAidXJsbGliLnJlc3BvbnNlIiksCl0KZm9yIGF0dHIgaW4gX3VybGxpYl9yZXNwb25zZV9tb3ZlZF9hdHRyaWJ1dGVzOgogICAgc2V0YXR0cihNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yZXNwb25zZSwgYXR0ci5uYW1lLCBhdHRyKQpkZWwgYXR0cgoKTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcmVzcG9uc2UuX21vdmVkX2F0dHJpYnV0ZXMgPSBfdXJsbGliX3Jlc3BvbnNlX21vdmVkX2F0dHJpYnV0ZXMKCl9pbXBvcnRlci5fYWRkX21vZHVsZShNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yZXNwb25zZShfX25hbWVfXyArICIubW92ZXMudXJsbGliLnJlc3BvbnNlIiksCiAgICAgICAgICAgICAgICAgICAgICAibW92ZXMudXJsbGliX3Jlc3BvbnNlIiwgIm1vdmVzLnVybGxpYi5yZXNwb25zZSIpCgoKY2xhc3MgTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcm9ib3RwYXJzZXIoX0xhenlNb2R1bGUpOgoKICAgICIiIkxhenkgbG9hZGluZyBvZiBtb3ZlZCBvYmplY3RzIGluIHNpeC5tb3Zlcy51cmxsaWJfcm9ib3RwYXJzZXIiIiIKCgpfdXJsbGliX3JvYm90cGFyc2VyX21vdmVkX2F0dHJpYnV0ZXMgPSBbCiAgICBNb3ZlZEF0dHJpYnV0ZSgiUm9ib3RGaWxlUGFyc2VyIiwgInJvYm90cGFyc2VyIiwgInVybGxpYi5yb2JvdHBhcnNlciIpLApdCmZvciBhdHRyIGluIF91cmxsaWJfcm9ib3RwYXJzZXJfbW92ZWRfYXR0cmlidXRlczoKICAgIHNldGF0dHIoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcm9ib3RwYXJzZXIsIGF0dHIubmFtZSwgYXR0cikKZGVsIGF0dHIKCk1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3JvYm90cGFyc2VyLl9tb3ZlZF9hdHRyaWJ1dGVzID0gX3VybGxpYl9yb2JvdHBhcnNlcl9tb3ZlZF9hdHRyaWJ1dGVzCgpfaW1wb3J0ZXIuX2FkZF9tb2R1bGUoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcm9ib3RwYXJzZXIoX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYi5yb2JvdHBhcnNlciIpLAogICAgICAgICAgICAgICAgICAgICAgIm1vdmVzLnVybGxpYl9yb2JvdHBhcnNlciIsICJtb3Zlcy51cmxsaWIucm9ib3RwYXJzZXIiKQoKCmNsYXNzIE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliKHR5cGVzLk1vZHVsZVR5cGUpOgoKICAgICIiIkNyZWF0ZSBhIHNpeC5tb3Zlcy51cmxsaWIgbmFtZXNwYWNlIHRoYXQgcmVzZW1ibGVzIHRoZSBQeXRob24gMyBuYW1lc3BhY2UiIiIKICAgIF9fcGF0aF9fID0gW10gICMgbWFyayBhcyBwYWNrYWdlCiAgICBwYXJzZSA9IF9pbXBvcnRlci5fZ2V0X21vZHVsZSgibW92ZXMudXJsbGliX3BhcnNlIikKICAgIGVycm9yID0gX2ltcG9ydGVyLl9nZXRfbW9kdWxlKCJtb3Zlcy51cmxsaWJfZXJyb3IiKQogICAgcmVxdWVzdCA9IF9pbXBvcnRlci5fZ2V0X21vZHVsZSgibW92ZXMudXJsbGliX3JlcXVlc3QiKQogICAgcmVzcG9uc2UgPSBfaW1wb3J0ZXIuX2dldF9tb2R1bGUoIm1vdmVzLnVybGxpYl9yZXNwb25zZSIpCiAgICByb2JvdHBhcnNlciA9IF9pbXBvcnRlci5fZ2V0X21vZHVsZSgibW92ZXMudXJsbGliX3JvYm90cGFyc2VyIikKCiAgICBkZWYgX19kaXJfXyhzZWxmKToKICAgICAgICByZXR1cm4gWydwYXJzZScsICdlcnJvcicsICdyZXF1ZXN0JywgJ3Jlc3BvbnNlJywgJ3JvYm90cGFyc2VyJ10KCl9pbXBvcnRlci5fYWRkX21vZHVsZShNb2R1bGVfc2l4X21vdmVzX3VybGxpYihfX25hbWVfXyArICIubW92ZXMudXJsbGliIiksCiAgICAgICAgICAgICAgICAgICAgICAibW92ZXMudXJsbGliIikKCgpkZWYgYWRkX21vdmUobW92ZSk6CiAgICAiIiJBZGQgYW4gaXRlbSB0byBzaXgubW92ZXMuIiIiCiAgICBzZXRhdHRyKF9Nb3ZlZEl0ZW1zLCBtb3ZlLm5hbWUsIG1vdmUpCgoKZGVmIHJlbW92ZV9tb3ZlKG5hbWUpOgogICAgIiIiUmVtb3ZlIGl0ZW0gZnJvbSBzaXgubW92ZXMuIiIiCiAgICB0cnk6CiAgICAgICAgZGVsYXR0cihfTW92ZWRJdGVtcywgbmFtZSkKICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGRlbCBtb3Zlcy5fX2RpY3RfX1tuYW1lXQogICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IoIm5vIHN1Y2ggbW92ZSwgJXIiICUgKG5hbWUsKSkKCgppZiBQWTM6CiAgICBfbWV0aF9mdW5jID0gIl9fZnVuY19fIgogICAgX21ldGhfc2VsZiA9ICJfX3NlbGZfXyIKCiAgICBfZnVuY19jbG9zdXJlID0gIl9fY2xvc3VyZV9fIgogICAgX2Z1bmNfY29kZSA9ICJfX2NvZGVfXyIKICAgIF9mdW5jX2RlZmF1bHRzID0gIl9fZGVmYXVsdHNfXyIKICAgIF9mdW5jX2dsb2JhbHMgPSAiX19nbG9iYWxzX18iCmVsc2U6CiAgICBfbWV0aF9mdW5jID0gImltX2Z1bmMiCiAgICBfbWV0aF9zZWxmID0gImltX3NlbGYiCgogICAgX2Z1bmNfY2xvc3VyZSA9ICJmdW5jX2Nsb3N1cmUiCiAgICBfZnVuY19jb2RlID0gImZ1bmNfY29kZSIKICAgIF9mdW5jX2RlZmF1bHRzID0gImZ1bmNfZGVmYXVsdHMiCiAgICBfZnVuY19nbG9iYWxzID0gImZ1bmNfZ2xvYmFscyIKCgp0cnk6CiAgICBhZHZhbmNlX2l0ZXJhdG9yID0gbmV4dApleGNlcHQgTmFtZUVycm9yOgogICAgZGVmIGFkdmFuY2VfaXRlcmF0b3IoaXQpOgogICAgICAgIHJldHVybiBpdC5uZXh0KCkKbmV4dCA9IGFkdmFuY2VfaXRlcmF0b3IKCgp0cnk6CiAgICBjYWxsYWJsZSA9IGNhbGxhYmxlCmV4Y2VwdCBOYW1lRXJyb3I6CiAgICBkZWYgY2FsbGFibGUob2JqKToKICAgICAgICByZXR1cm4gYW55KCJfX2NhbGxfXyIgaW4ga2xhc3MuX19kaWN0X18gZm9yIGtsYXNzIGluIHR5cGUob2JqKS5fX21yb19fKQoKCmlmIFBZMzoKICAgIGRlZiBnZXRfdW5ib3VuZF9mdW5jdGlvbih1bmJvdW5kKToKICAgICAgICByZXR1cm4gdW5ib3VuZAoKICAgIGNyZWF0ZV9ib3VuZF9tZXRob2QgPSB0eXBlcy5NZXRob2RUeXBlCgogICAgZGVmIGNyZWF0ZV91bmJvdW5kX21ldGhvZChmdW5jLCBjbHMpOgogICAgICAgIHJldHVybiBmdW5jCgogICAgSXRlcmF0b3IgPSBvYmplY3QKZWxzZToKICAgIGRlZiBnZXRfdW5ib3VuZF9mdW5jdGlvbih1bmJvdW5kKToKICAgICAgICByZXR1cm4gdW5ib3VuZC5pbV9mdW5jCgogICAgZGVmIGNyZWF0ZV9ib3VuZF9tZXRob2QoZnVuYywgb2JqKToKICAgICAgICByZXR1cm4gdHlwZXMuTWV0aG9kVHlwZShmdW5jLCBvYmosIG9iai5fX2NsYXNzX18pCgogICAgZGVmIGNyZWF0ZV91bmJvdW5kX21ldGhvZChmdW5jLCBjbHMpOgogICAgICAgIHJldHVybiB0eXBlcy5NZXRob2RUeXBlKGZ1bmMsIE5vbmUsIGNscykKCiAgICBjbGFzcyBJdGVyYXRvcihvYmplY3QpOgoKICAgICAgICBkZWYgbmV4dChzZWxmKToKICAgICAgICAgICAgcmV0dXJuIHR5cGUoc2VsZikuX19uZXh0X18oc2VsZikKCiAgICBjYWxsYWJsZSA9IGNhbGxhYmxlCl9hZGRfZG9jKGdldF91bmJvdW5kX2Z1bmN0aW9uLAogICAgICAgICAiIiJHZXQgdGhlIGZ1bmN0aW9uIG91dCBvZiBhIHBvc3NpYmx5IHVuYm91bmQgZnVuY3Rpb24iIiIpCgoKZ2V0X21ldGhvZF9mdW5jdGlvbiA9IG9wZXJhdG9yLmF0dHJnZXR0ZXIoX21ldGhfZnVuYykKZ2V0X21ldGhvZF9zZWxmID0gb3BlcmF0b3IuYXR0cmdldHRlcihfbWV0aF9zZWxmKQpnZXRfZnVuY3Rpb25fY2xvc3VyZSA9IG9wZXJhdG9yLmF0dHJnZXR0ZXIoX2Z1bmNfY2xvc3VyZSkKZ2V0X2Z1bmN0aW9uX2NvZGUgPSBvcGVyYXRvci5hdHRyZ2V0dGVyKF9mdW5jX2NvZGUpCmdldF9mdW5jdGlvbl9kZWZhdWx0cyA9IG9wZXJhdG9yLmF0dHJnZXR0ZXIoX2Z1bmNfZGVmYXVsdHMpCmdldF9mdW5jdGlvbl9nbG9iYWxzID0gb3BlcmF0b3IuYXR0cmdldHRlcihfZnVuY19nbG9iYWxzKQoKCmlmIFBZMzoKICAgIGRlZiBpdGVya2V5cyhkLCAqKmt3KToKICAgICAgICByZXR1cm4gaXRlcihkLmtleXMoKiprdykpCgogICAgZGVmIGl0ZXJ2YWx1ZXMoZCwgKiprdyk6CiAgICAgICAgcmV0dXJuIGl0ZXIoZC52YWx1ZXMoKiprdykpCgogICAgZGVmIGl0ZXJpdGVtcyhkLCAqKmt3KToKICAgICAgICByZXR1cm4gaXRlcihkLml0ZW1zKCoqa3cpKQoKICAgIGRlZiBpdGVybGlzdHMoZCwgKiprdyk6CiAgICAgICAgcmV0dXJuIGl0ZXIoZC5saXN0cygqKmt3KSkKCiAgICB2aWV3a2V5cyA9IG9wZXJhdG9yLm1ldGhvZGNhbGxlcigia2V5cyIpCgogICAgdmlld3ZhbHVlcyA9IG9wZXJhdG9yLm1ldGhvZGNhbGxlcigidmFsdWVzIikKCiAgICB2aWV3aXRlbXMgPSBvcGVyYXRvci5tZXRob2RjYWxsZXIoIml0ZW1zIikKZWxzZToKICAgIGRlZiBpdGVya2V5cyhkLCAqKmt3KToKICAgICAgICByZXR1cm4gZC5pdGVya2V5cygqKmt3KQoKICAgIGRlZiBpdGVydmFsdWVzKGQsICoqa3cpOgogICAgICAgIHJldHVybiBkLml0ZXJ2YWx1ZXMoKiprdykKCiAgICBkZWYgaXRlcml0ZW1zKGQsICoqa3cpOgogICAgICAgIHJldHVybiBkLml0ZXJpdGVtcygqKmt3KQoKICAgIGRlZiBpdGVybGlzdHMoZCwgKiprdyk6CiAgICAgICAgcmV0dXJuIGQuaXRlcmxpc3RzKCoqa3cpCgogICAgdmlld2tleXMgPSBvcGVyYXRvci5tZXRob2RjYWxsZXIoInZpZXdrZXlzIikKCiAgICB2aWV3dmFsdWVzID0gb3BlcmF0b3IubWV0aG9kY2FsbGVyKCJ2aWV3dmFsdWVzIikKCiAgICB2aWV3aXRlbXMgPSBvcGVyYXRvci5tZXRob2RjYWxsZXIoInZpZXdpdGVtcyIpCgpfYWRkX2RvYyhpdGVya2V5cywgIlJldHVybiBhbiBpdGVyYXRvciBvdmVyIHRoZSBrZXlzIG9mIGEgZGljdGlvbmFyeS4iKQpfYWRkX2RvYyhpdGVydmFsdWVzLCAiUmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIHZhbHVlcyBvZiBhIGRpY3Rpb25hcnkuIikKX2FkZF9kb2MoaXRlcml0ZW1zLAogICAgICAgICAiUmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIChrZXksIHZhbHVlKSBwYWlycyBvZiBhIGRpY3Rpb25hcnkuIikKX2FkZF9kb2MoaXRlcmxpc3RzLAogICAgICAgICAiUmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIChrZXksIFt2YWx1ZXNdKSBwYWlycyBvZiBhIGRpY3Rpb25hcnkuIikKCgppZiBQWTM6CiAgICBkZWYgYihzKToKICAgICAgICByZXR1cm4gcy5lbmNvZGUoImxhdGluLTEiKQoKICAgIGRlZiB1KHMpOgogICAgICAgIHJldHVybiBzCiAgICB1bmljaHIgPSBjaHIKICAgIGltcG9ydCBzdHJ1Y3QKICAgIGludDJieXRlID0gc3RydWN0LlN0cnVjdCgiPkIiKS5wYWNrCiAgICBkZWwgc3RydWN0CiAgICBieXRlMmludCA9IG9wZXJhdG9yLml0ZW1nZXR0ZXIoMCkKICAgIGluZGV4Ynl0ZXMgPSBvcGVyYXRvci5nZXRpdGVtCiAgICBpdGVyYnl0ZXMgPSBpdGVyCiAgICBpbXBvcnQgaW8KICAgIFN0cmluZ0lPID0gaW8uU3RyaW5nSU8KICAgIEJ5dGVzSU8gPSBpby5CeXRlc0lPCiAgICBfYXNzZXJ0Q291bnRFcXVhbCA9ICJhc3NlcnRDb3VudEVxdWFsIgogICAgaWYgc3lzLnZlcnNpb25faW5mb1sxXSA8PSAxOgogICAgICAgIF9hc3NlcnRSYWlzZXNSZWdleCA9ICJhc3NlcnRSYWlzZXNSZWdleHAiCiAgICAgICAgX2Fzc2VydFJlZ2V4ID0gImFzc2VydFJlZ2V4cE1hdGNoZXMiCiAgICBlbHNlOgogICAgICAgIF9hc3NlcnRSYWlzZXNSZWdleCA9ICJhc3NlcnRSYWlzZXNSZWdleCIKICAgICAgICBfYXNzZXJ0UmVnZXggPSAiYXNzZXJ0UmVnZXgiCmVsc2U6CiAgICBkZWYgYihzKToKICAgICAgICByZXR1cm4gcwogICAgIyBXb3JrYXJvdW5kIGZvciBzdGFuZGFsb25lIGJhY2tzbGFzaAoKICAgIGRlZiB1KHMpOgogICAgICAgIHJldHVybiB1bmljb2RlKHMucmVwbGFjZShyJ1xcJywgcidcXFxcJyksICJ1bmljb2RlX2VzY2FwZSIpCiAgICB1bmljaHIgPSB1bmljaHIKICAgIGludDJieXRlID0gY2hyCgogICAgZGVmIGJ5dGUyaW50KGJzKToKICAgICAgICByZXR1cm4gb3JkKGJzWzBdKQoKICAgIGRlZiBpbmRleGJ5dGVzKGJ1ZiwgaSk6CiAgICAgICAgcmV0dXJuIG9yZChidWZbaV0pCiAgICBpdGVyYnl0ZXMgPSBmdW5jdG9vbHMucGFydGlhbChpdGVydG9vbHMuaW1hcCwgb3JkKQogICAgaW1wb3J0IFN0cmluZ0lPCiAgICBTdHJpbmdJTyA9IEJ5dGVzSU8gPSBTdHJpbmdJTy5TdHJpbmdJTwogICAgX2Fzc2VydENvdW50RXF1YWwgPSAiYXNzZXJ0SXRlbXNFcXVhbCIKICAgIF9hc3NlcnRSYWlzZXNSZWdleCA9ICJhc3NlcnRSYWlzZXNSZWdleHAiCiAgICBfYXNzZXJ0UmVnZXggPSAiYXNzZXJ0UmVnZXhwTWF0Y2hlcyIKX2FkZF9kb2MoYiwgIiIiQnl0ZSBsaXRlcmFsIiIiKQpfYWRkX2RvYyh1LCAiIiJUZXh0IGxpdGVyYWwiIiIpCgoKZGVmIGFzc2VydENvdW50RXF1YWwoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgIHJldHVybiBnZXRhdHRyKHNlbGYsIF9hc3NlcnRDb3VudEVxdWFsKSgqYXJncywgKiprd2FyZ3MpCgoKZGVmIGFzc2VydFJhaXNlc1JlZ2V4KHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICByZXR1cm4gZ2V0YXR0cihzZWxmLCBfYXNzZXJ0UmFpc2VzUmVnZXgpKCphcmdzLCAqKmt3YXJncykKCgpkZWYgYXNzZXJ0UmVnZXgoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgIHJldHVybiBnZXRhdHRyKHNlbGYsIF9hc3NlcnRSZWdleCkoKmFyZ3MsICoqa3dhcmdzKQoKCmlmIFBZMzoKICAgIGV4ZWNfID0gZ2V0YXR0cihtb3Zlcy5idWlsdGlucywgImV4ZWMiKQoKICAgIGRlZiByZXJhaXNlKHRwLCB2YWx1ZSwgdGI9Tm9uZSk6CiAgICAgICAgaWYgdmFsdWUgaXMgTm9uZToKICAgICAgICAgICAgdmFsdWUgPSB0cCgpCiAgICAgICAgaWYgdmFsdWUuX190cmFjZWJhY2tfXyBpcyBub3QgdGI6CiAgICAgICAgICAgIHJhaXNlIHZhbHVlLndpdGhfdHJhY2ViYWNrKHRiKQogICAgICAgIHJhaXNlIHZhbHVlCgplbHNlOgogICAgZGVmIGV4ZWNfKF9jb2RlXywgX2dsb2JzXz1Ob25lLCBfbG9jc189Tm9uZSk6CiAgICAgICAgIiIiRXhlY3V0ZSBjb2RlIGluIGEgbmFtZXNwYWNlLiIiIgogICAgICAgIGlmIF9nbG9ic18gaXMgTm9uZToKICAgICAgICAgICAgZnJhbWUgPSBzeXMuX2dldGZyYW1lKDEpCiAgICAgICAgICAgIF9nbG9ic18gPSBmcmFtZS5mX2dsb2JhbHMKICAgICAgICAgICAgaWYgX2xvY3NfIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBfbG9jc18gPSBmcmFtZS5mX2xvY2FscwogICAgICAgICAgICBkZWwgZnJhbWUKICAgICAgICBlbGlmIF9sb2NzXyBpcyBOb25lOgogICAgICAgICAgICBfbG9jc18gPSBfZ2xvYnNfCiAgICAgICAgZXhlYygiIiJleGVjIF9jb2RlXyBpbiBfZ2xvYnNfLCBfbG9jc18iIiIpCgogICAgZXhlY18oIiIiZGVmIHJlcmFpc2UodHAsIHZhbHVlLCB0Yj1Ob25lKToKICAgIHJhaXNlIHRwLCB2YWx1ZSwgdGIKIiIiKQoKCmlmIHN5cy52ZXJzaW9uX2luZm9bOjJdID09ICgzLCAyKToKICAgIGV4ZWNfKCIiImRlZiByYWlzZV9mcm9tKHZhbHVlLCBmcm9tX3ZhbHVlKToKICAgIGlmIGZyb21fdmFsdWUgaXMgTm9uZToKICAgICAgICByYWlzZSB2YWx1ZQogICAgcmFpc2UgdmFsdWUgZnJvbSBmcm9tX3ZhbHVlCiIiIikKZWxpZiBzeXMudmVyc2lvbl9pbmZvWzoyXSA+ICgzLCAyKToKICAgIGV4ZWNfKCIiImRlZiByYWlzZV9mcm9tKHZhbHVlLCBmcm9tX3ZhbHVlKToKICAgIHJhaXNlIHZhbHVlIGZyb20gZnJvbV92YWx1ZQoiIiIpCmVsc2U6CiAgICBkZWYgcmFpc2VfZnJvbSh2YWx1ZSwgZnJvbV92YWx1ZSk6CiAgICAgICAgcmFpc2UgdmFsdWUKCgpwcmludF8gPSBnZXRhdHRyKG1vdmVzLmJ1aWx0aW5zLCAicHJpbnQiLCBOb25lKQppZiBwcmludF8gaXMgTm9uZToKICAgIGRlZiBwcmludF8oKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAiIiJUaGUgbmV3LXN0eWxlIHByaW50IGZ1bmN0aW9uIGZvciBQeXRob24gMi40IGFuZCAyLjUuIiIiCiAgICAgICAgZnAgPSBrd2FyZ3MucG9wKCJmaWxlIiwgc3lzLnN0ZG91dCkKICAgICAgICBpZiBmcCBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgZGVmIHdyaXRlKGRhdGEpOgogICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShkYXRhLCBiYXNlc3RyaW5nKToKICAgICAgICAgICAgICAgIGRhdGEgPSBzdHIoZGF0YSkKICAgICAgICAgICAgIyBJZiB0aGUgZmlsZSBoYXMgYW4gZW5jb2RpbmcsIGVuY29kZSB1bmljb2RlIHdpdGggaXQuCiAgICAgICAgICAgIGlmIChpc2luc3RhbmNlKGZwLCBmaWxlKSBhbmQKICAgICAgICAgICAgICAgICAgICBpc2luc3RhbmNlKGRhdGEsIHVuaWNvZGUpIGFuZAogICAgICAgICAgICAgICAgICAgIGZwLmVuY29kaW5nIGlzIG5vdCBOb25lKToKICAgICAgICAgICAgICAgIGVycm9ycyA9IGdldGF0dHIoZnAsICJlcnJvcnMiLCBOb25lKQogICAgICAgICAgICAgICAgaWYgZXJyb3JzIGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgICAgZXJyb3JzID0gInN0cmljdCIKICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLmVuY29kZShmcC5lbmNvZGluZywgZXJyb3JzKQogICAgICAgICAgICBmcC53cml0ZShkYXRhKQogICAgICAgIHdhbnRfdW5pY29kZSA9IEZhbHNlCiAgICAgICAgc2VwID0ga3dhcmdzLnBvcCgic2VwIiwgTm9uZSkKICAgICAgICBpZiBzZXAgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VwLCB1bmljb2RlKToKICAgICAgICAgICAgICAgIHdhbnRfdW5pY29kZSA9IFRydWUKICAgICAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZShzZXAsIHN0cik6CiAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoInNlcCBtdXN0IGJlIE5vbmUgb3IgYSBzdHJpbmciKQogICAgICAgIGVuZCA9IGt3YXJncy5wb3AoImVuZCIsIE5vbmUpCiAgICAgICAgaWYgZW5kIGlzIG5vdCBOb25lOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGVuZCwgdW5pY29kZSk6CiAgICAgICAgICAgICAgICB3YW50X3VuaWNvZGUgPSBUcnVlCiAgICAgICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2UoZW5kLCBzdHIpOgogICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJlbmQgbXVzdCBiZSBOb25lIG9yIGEgc3RyaW5nIikKICAgICAgICBpZiBrd2FyZ3M6CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiaW52YWxpZCBrZXl3b3JkIGFyZ3VtZW50cyB0byBwcmludCgpIikKICAgICAgICBpZiBub3Qgd2FudF91bmljb2RlOgogICAgICAgICAgICBmb3IgYXJnIGluIGFyZ3M6CiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGFyZywgdW5pY29kZSk6CiAgICAgICAgICAgICAgICAgICAgd2FudF91bmljb2RlID0gVHJ1ZQogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgaWYgd2FudF91bmljb2RlOgogICAgICAgICAgICBuZXdsaW5lID0gdW5pY29kZSgiXG4iKQogICAgICAgICAgICBzcGFjZSA9IHVuaWNvZGUoIiAiKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG5ld2xpbmUgPSAiXG4iCiAgICAgICAgICAgIHNwYWNlID0gIiAiCiAgICAgICAgaWYgc2VwIGlzIE5vbmU6CiAgICAgICAgICAgIHNlcCA9IHNwYWNlCiAgICAgICAgaWYgZW5kIGlzIE5vbmU6CiAgICAgICAgICAgIGVuZCA9IG5ld2xpbmUKICAgICAgICBmb3IgaSwgYXJnIGluIGVudW1lcmF0ZShhcmdzKToKICAgICAgICAgICAgaWYgaToKICAgICAgICAgICAgICAgIHdyaXRlKHNlcCkKICAgICAgICAgICAgd3JpdGUoYXJnKQogICAgICAgIHdyaXRlKGVuZCkKaWYgc3lzLnZlcnNpb25faW5mb1s6Ml0gPCAoMywgMyk6CiAgICBfcHJpbnQgPSBwcmludF8KCiAgICBkZWYgcHJpbnRfKCphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgZnAgPSBrd2FyZ3MuZ2V0KCJmaWxlIiwgc3lzLnN0ZG91dCkKICAgICAgICBmbHVzaCA9IGt3YXJncy5wb3AoImZsdXNoIiwgRmFsc2UpCiAgICAgICAgX3ByaW50KCphcmdzLCAqKmt3YXJncykKICAgICAgICBpZiBmbHVzaCBhbmQgZnAgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGZwLmZsdXNoKCkKCl9hZGRfZG9jKHJlcmFpc2UsICIiIlJlcmFpc2UgYW4gZXhjZXB0aW9uLiIiIikKCmlmIHN5cy52ZXJzaW9uX2luZm9bMDoyXSA8ICgzLCA0KToKICAgIGRlZiB3cmFwcyh3cmFwcGVkLCBhc3NpZ25lZD1mdW5jdG9vbHMuV1JBUFBFUl9BU1NJR05NRU5UUywKICAgICAgICAgICAgICB1cGRhdGVkPWZ1bmN0b29scy5XUkFQUEVSX1VQREFURVMpOgogICAgICAgIGRlZiB3cmFwcGVyKGYpOgogICAgICAgICAgICBmID0gZnVuY3Rvb2xzLndyYXBzKHdyYXBwZWQsIGFzc2lnbmVkLCB1cGRhdGVkKShmKQogICAgICAgICAgICBmLl9fd3JhcHBlZF9fID0gd3JhcHBlZAogICAgICAgICAgICByZXR1cm4gZgogICAgICAgIHJldHVybiB3cmFwcGVyCmVsc2U6CiAgICB3cmFwcyA9IGZ1bmN0b29scy53cmFwcwoKCmRlZiB3aXRoX21ldGFjbGFzcyhtZXRhLCAqYmFzZXMpOgogICAgIiIiQ3JlYXRlIGEgYmFzZSBjbGFzcyB3aXRoIGEgbWV0YWNsYXNzLiIiIgogICAgIyBUaGlzIHJlcXVpcmVzIGEgYml0IG9mIGV4cGxhbmF0aW9uOiB0aGUgYmFzaWMgaWRlYSBpcyB0byBtYWtlIGEgZHVtbXkKICAgICMgbWV0YWNsYXNzIGZvciBvbmUgbGV2ZWwgb2YgY2xhc3MgaW5zdGFudGlhdGlvbiB0aGF0IHJlcGxhY2VzIGl0c2VsZiB3aXRoCiAgICAjIHRoZSBhY3R1YWwgbWV0YWNsYXNzLgogICAgY2xhc3MgbWV0YWNsYXNzKG1ldGEpOgoKICAgICAgICBkZWYgX19uZXdfXyhjbHMsIG5hbWUsIHRoaXNfYmFzZXMsIGQpOgogICAgICAgICAgICByZXR1cm4gbWV0YShuYW1lLCBiYXNlcywgZCkKICAgIHJldHVybiB0eXBlLl9fbmV3X18obWV0YWNsYXNzLCAndGVtcG9yYXJ5X2NsYXNzJywgKCksIHt9KQoKCmRlZiBhZGRfbWV0YWNsYXNzKG1ldGFjbGFzcyk6CiAgICAiIiJDbGFzcyBkZWNvcmF0b3IgZm9yIGNyZWF0aW5nIGEgY2xhc3Mgd2l0aCBhIG1ldGFjbGFzcy4iIiIKICAgIGRlZiB3cmFwcGVyKGNscyk6CiAgICAgICAgb3JpZ192YXJzID0gY2xzLl9fZGljdF9fLmNvcHkoKQogICAgICAgIHNsb3RzID0gb3JpZ192YXJzLmdldCgnX19zbG90c19fJykKICAgICAgICBpZiBzbG90cyBpcyBub3QgTm9uZToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShzbG90cywgc3RyKToKICAgICAgICAgICAgICAgIHNsb3RzID0gW3Nsb3RzXQogICAgICAgICAgICBmb3Igc2xvdHNfdmFyIGluIHNsb3RzOgogICAgICAgICAgICAgICAgb3JpZ192YXJzLnBvcChzbG90c192YXIpCiAgICAgICAgb3JpZ192YXJzLnBvcCgnX19kaWN0X18nLCBOb25lKQogICAgICAgIG9yaWdfdmFycy5wb3AoJ19fd2Vha3JlZl9fJywgTm9uZSkKICAgICAgICByZXR1cm4gbWV0YWNsYXNzKGNscy5fX25hbWVfXywgY2xzLl9fYmFzZXNfXywgb3JpZ192YXJzKQogICAgcmV0dXJuIHdyYXBwZXIKCgpkZWYgcHl0aG9uXzJfdW5pY29kZV9jb21wYXRpYmxlKGtsYXNzKToKICAgICIiIgogICAgQSBkZWNvcmF0b3IgdGhhdCBkZWZpbmVzIF9fdW5pY29kZV9fIGFuZCBfX3N0cl9fIG1ldGhvZHMgdW5kZXIgUHl0aG9uIDIuCiAgICBVbmRlciBQeXRob24gMyBpdCBkb2VzIG5vdGhpbmcuCgogICAgVG8gc3VwcG9ydCBQeXRob24gMiBhbmQgMyB3aXRoIGEgc2luZ2xlIGNvZGUgYmFzZSwgZGVmaW5lIGEgX19zdHJfXyBtZXRob2QKICAgIHJldHVybmluZyB0ZXh0IGFuZCBhcHBseSB0aGlzIGRlY29yYXRvciB0byB0aGUgY2xhc3MuCiAgICAiIiIKICAgIGlmIFBZMjoKICAgICAgICBpZiAnX19zdHJfXycgbm90IGluIGtsYXNzLl9fZGljdF9fOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJAcHl0aG9uXzJfdW5pY29kZV9jb21wYXRpYmxlIGNhbm5vdCBiZSBhcHBsaWVkICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG8gJXMgYmVjYXVzZSBpdCBkb2Vzbid0IGRlZmluZSBfX3N0cl9fKCkuIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2xhc3MuX19uYW1lX18pCiAgICAgICAga2xhc3MuX191bmljb2RlX18gPSBrbGFzcy5fX3N0cl9fCiAgICAgICAga2xhc3MuX19zdHJfXyA9IGxhbWJkYSBzZWxmOiBzZWxmLl9fdW5pY29kZV9fKCkuZW5jb2RlKCd1dGYtOCcpCiAgICByZXR1cm4ga2xhc3MKCgojIENvbXBsZXRlIHRoZSBtb3ZlcyBpbXBsZW1lbnRhdGlvbi4KIyBUaGlzIGNvZGUgaXMgYXQgdGhlIGVuZCBvZiB0aGlzIG1vZHVsZSB0byBzcGVlZCB1cCBtb2R1bGUgbG9hZGluZy4KIyBUdXJuIHRoaXMgbW9kdWxlIGludG8gYSBwYWNrYWdlLgpfX3BhdGhfXyA9IFtdICAjIHJlcXVpcmVkIGZvciBQRVAgMzAyIGFuZCBQRVAgNDUxCl9fcGFja2FnZV9fID0gX19uYW1lX18gICMgc2VlIFBFUCAzNjYgQFJlc2VydmVkQXNzaWdubWVudAppZiBnbG9iYWxzKCkuZ2V0KCJfX3NwZWNfXyIpIGlzIG5vdCBOb25lOgogICAgX19zcGVjX18uc3VibW9kdWxlX3NlYXJjaF9sb2NhdGlvbnMgPSBbXSAgIyBQRVAgNDUxIEBVbmRlZmluZWRWYXJpYWJsZQojIFJlbW92ZSBvdGhlciBzaXggbWV0YSBwYXRoIGltcG9ydGVycywgc2luY2UgdGhleSBjYXVzZSBwcm9ibGVtcy4gVGhpcyBjYW4KIyBoYXBwZW4gaWYgc2l4IGlzIHJlbW92ZWQgZnJvbSBzeXMubW9kdWxlcyBhbmQgdGhlbiByZWxvYWRlZC4gKFNldHVwdG9vbHMgZG9lcwojIHRoaXMgZm9yIHNvbWUgcmVhc29uLikKaWYgc3lzLm1ldGFfcGF0aDoKICAgIGZvciBpLCBpbXBvcnRlciBpbiBlbnVtZXJhdGUoc3lzLm1ldGFfcGF0aCk6CiAgICAgICAgIyBIZXJlJ3Mgc29tZSByZWFsIG5hc3RpbmVzczogQW5vdGhlciAiaW5zdGFuY2UiIG9mIHRoZSBzaXggbW9kdWxlIG1pZ2h0CiAgICAgICAgIyBiZSBmbG9hdGluZyBhcm91bmQuIFRoZXJlZm9yZSwgd2UgY2FuJ3QgdXNlIGlzaW5zdGFuY2UoKSB0byBjaGVjayBmb3IKICAgICAgICAjIHRoZSBzaXggbWV0YSBwYXRoIGltcG9ydGVyLCBzaW5jZSB0aGUgb3RoZXIgc2l4IGluc3RhbmNlIHdpbGwgaGF2ZQogICAgICAgICMgaW5zZXJ0ZWQgYW4gaW1wb3J0ZXIgd2l0aCBkaWZmZXJlbnQgY2xhc3MuCiAgICAgICAgaWYgKHR5cGUoaW1wb3J0ZXIpLl9fbmFtZV9fID09ICJfU2l4TWV0YVBhdGhJbXBvcnRlciIgYW5kCiAgICAgICAgICAgICAgICBpbXBvcnRlci5uYW1lID09IF9fbmFtZV9fKToKICAgICAgICAgICAgZGVsIHN5cy5tZXRhX3BhdGhbaV0KICAgICAgICAgICAgYnJlYWsKICAgIGRlbCBpLCBpbXBvcnRlcgojIEZpbmFsbHksIGFkZCB0aGUgaW1wb3J0ZXIgdG8gdGhlIG1ldGEgcGF0aCBpbXBvcnQgaG9vay4Kc3lzLm1ldGFfcGF0aC5hcHBlbmQoX2ltcG9ydGVyKQpQSwMEFAAAAAAAAAAhAJI+9YclCwAAJQsAADwAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvX19pbml0X18ucHkiIiIKdXJsbGliMyAtIFRocmVhZC1zYWZlIGNvbm5lY3Rpb24gcG9vbGluZyBhbmQgcmUtdXNpbmcuCiIiIgoKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKaW1wb3J0IHdhcm5pbmdzCgpmcm9tIC5jb25uZWN0aW9ucG9vbCBpbXBvcnQgKAogICAgSFRUUENvbm5lY3Rpb25Qb29sLAogICAgSFRUUFNDb25uZWN0aW9uUG9vbCwKICAgIGNvbm5lY3Rpb25fZnJvbV91cmwKKQoKZnJvbSAuIGltcG9ydCBleGNlcHRpb25zCmZyb20gLmZpbGVwb3N0IGltcG9ydCBlbmNvZGVfbXVsdGlwYXJ0X2Zvcm1kYXRhCmZyb20gLnBvb2xtYW5hZ2VyIGltcG9ydCBQb29sTWFuYWdlciwgUHJveHlNYW5hZ2VyLCBwcm94eV9mcm9tX3VybApmcm9tIC5yZXNwb25zZSBpbXBvcnQgSFRUUFJlc3BvbnNlCmZyb20gLnV0aWwucmVxdWVzdCBpbXBvcnQgbWFrZV9oZWFkZXJzCmZyb20gLnV0aWwudXJsIGltcG9ydCBnZXRfaG9zdApmcm9tIC51dGlsLnRpbWVvdXQgaW1wb3J0IFRpbWVvdXQKZnJvbSAudXRpbC5yZXRyeSBpbXBvcnQgUmV0cnkKCgojIFNldCBkZWZhdWx0IGxvZ2dpbmcgaGFuZGxlciB0byBhdm9pZCAiTm8gaGFuZGxlciBmb3VuZCIgd2FybmluZ3MuCmltcG9ydCBsb2dnaW5nCnRyeTogICMgUHl0aG9uIDIuNysKICAgIGZyb20gbG9nZ2luZyBpbXBvcnQgTnVsbEhhbmRsZXIKZXhjZXB0IEltcG9ydEVycm9yOgogICAgY2xhc3MgTnVsbEhhbmRsZXIobG9nZ2luZy5IYW5kbGVyKToKICAgICAgICBkZWYgZW1pdChzZWxmLCByZWNvcmQpOgogICAgICAgICAgICBwYXNzCgpfX2F1dGhvcl9fID0gJ0FuZHJleSBQZXRyb3YgKGFuZHJleS5wZXRyb3ZAc2hhem93Lm5ldCknCl9fbGljZW5zZV9fID0gJ01JVCcKX192ZXJzaW9uX18gPSAnMS4yMicKCl9fYWxsX18gPSAoCiAgICAnSFRUUENvbm5lY3Rpb25Qb29sJywKICAgICdIVFRQU0Nvbm5lY3Rpb25Qb29sJywKICAgICdQb29sTWFuYWdlcicsCiAgICAnUHJveHlNYW5hZ2VyJywKICAgICdIVFRQUmVzcG9uc2UnLAogICAgJ1JldHJ5JywKICAgICdUaW1lb3V0JywKICAgICdhZGRfc3RkZXJyX2xvZ2dlcicsCiAgICAnY29ubmVjdGlvbl9mcm9tX3VybCcsCiAgICAnZGlzYWJsZV93YXJuaW5ncycsCiAgICAnZW5jb2RlX211bHRpcGFydF9mb3JtZGF0YScsCiAgICAnZ2V0X2hvc3QnLAogICAgJ21ha2VfaGVhZGVycycsCiAgICAncHJveHlfZnJvbV91cmwnLAopCgpsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykuYWRkSGFuZGxlcihOdWxsSGFuZGxlcigpKQoKCmRlZiBhZGRfc3RkZXJyX2xvZ2dlcihsZXZlbD1sb2dnaW5nLkRFQlVHKToKICAgICIiIgogICAgSGVscGVyIGZvciBxdWlja2x5IGFkZGluZyBhIFN0cmVhbUhhbmRsZXIgdG8gdGhlIGxvZ2dlci4gVXNlZnVsIGZvcgogICAgZGVidWdnaW5nLgoKICAgIFJldHVybnMgdGhlIGhhbmRsZXIgYWZ0ZXIgYWRkaW5nIGl0LgogICAgIiIiCiAgICAjIFRoaXMgbWV0aG9kIG5lZWRzIHRvIGJlIGluIHRoaXMgX19pbml0X18ucHkgdG8gZ2V0IHRoZSBfX25hbWVfXyBjb3JyZWN0CiAgICAjIGV2ZW4gaWYgdXJsbGliMyBpcyB2ZW5kb3JlZCB3aXRoaW4gYW5vdGhlciBwYWNrYWdlLgogICAgbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCiAgICBoYW5kbGVyID0gbG9nZ2luZy5TdHJlYW1IYW5kbGVyKCkKICAgIGhhbmRsZXIuc2V0Rm9ybWF0dGVyKGxvZ2dpbmcuRm9ybWF0dGVyKCclKGFzY3RpbWUpcyAlKGxldmVsbmFtZSlzICUobWVzc2FnZSlzJykpCiAgICBsb2dnZXIuYWRkSGFuZGxlcihoYW5kbGVyKQogICAgbG9nZ2VyLnNldExldmVsKGxldmVsKQogICAgbG9nZ2VyLmRlYnVnKCdBZGRlZCBhIHN0ZGVyciBsb2dnaW5nIGhhbmRsZXIgdG8gbG9nZ2VyOiAlcycsIF9fbmFtZV9fKQogICAgcmV0dXJuIGhhbmRsZXIKCgojIC4uLiBDbGVhbiB1cC4KZGVsIE51bGxIYW5kbGVyCgoKIyBBbGwgd2FybmluZyBmaWx0ZXJzICptdXN0KiBiZSBhcHBlbmRlZCB1bmxlc3MgeW91J3JlIHJlYWxseSBjZXJ0YWluIHRoYXQgdGhleQojIHNob3VsZG4ndCBiZTogb3RoZXJ3aXNlLCBpdCdzIHZlcnkgaGFyZCBmb3IgdXNlcnMgdG8gdXNlIG1vc3QgUHl0aG9uCiMgbWVjaGFuaXNtcyB0byBzaWxlbmNlIHRoZW0uCiMgU2VjdXJpdHlXYXJuaW5nJ3MgYWx3YXlzIGdvIG9mZiBieSBkZWZhdWx0Lgp3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoJ2Fsd2F5cycsIGV4Y2VwdGlvbnMuU2VjdXJpdHlXYXJuaW5nLCBhcHBlbmQ9VHJ1ZSkKIyBTdWJqZWN0QWx0TmFtZVdhcm5pbmcncyBzaG91bGQgZ28gb2ZmIG9uY2UgcGVyIGhvc3QKd2FybmluZ3Muc2ltcGxlZmlsdGVyKCdkZWZhdWx0JywgZXhjZXB0aW9ucy5TdWJqZWN0QWx0TmFtZVdhcm5pbmcsIGFwcGVuZD1UcnVlKQojIEluc2VjdXJlUGxhdGZvcm1XYXJuaW5nJ3MgZG9uJ3QgdmFyeSBiZXR3ZWVuIHJlcXVlc3RzLCBzbyB3ZSBrZWVwIGl0IGRlZmF1bHQuCndhcm5pbmdzLnNpbXBsZWZpbHRlcignZGVmYXVsdCcsIGV4Y2VwdGlvbnMuSW5zZWN1cmVQbGF0Zm9ybVdhcm5pbmcsCiAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQ9VHJ1ZSkKIyBTTklNaXNzaW5nV2FybmluZ3Mgc2hvdWxkIGdvIG9mZiBvbmx5IG9uY2UuCndhcm5pbmdzLnNpbXBsZWZpbHRlcignZGVmYXVsdCcsIGV4Y2VwdGlvbnMuU05JTWlzc2luZ1dhcm5pbmcsIGFwcGVuZD1UcnVlKQoKCmRlZiBkaXNhYmxlX3dhcm5pbmdzKGNhdGVnb3J5PWV4Y2VwdGlvbnMuSFRUUFdhcm5pbmcpOgogICAgIiIiCiAgICBIZWxwZXIgZm9yIHF1aWNrbHkgZGlzYWJsaW5nIGFsbCB1cmxsaWIzIHdhcm5pbmdzLgogICAgIiIiCiAgICB3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoJ2lnbm9yZScsIGNhdGVnb3J5KQpQSwMEFAAAAAAAAAAhAAAZ05TcJwAA3CcAAEAAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvX2NvbGxlY3Rpb25zLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgTWFwcGluZywgTXV0YWJsZU1hcHBpbmcKdHJ5OgogICAgZnJvbSB0aHJlYWRpbmcgaW1wb3J0IFJMb2NrCmV4Y2VwdCBJbXBvcnRFcnJvcjogICMgUGxhdGZvcm0tc3BlY2lmaWM6IE5vIHRocmVhZHMgYXZhaWxhYmxlCiAgICBjbGFzcyBSTG9jazoKICAgICAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgogICAgICAgICAgICBwYXNzCgogICAgICAgIGRlZiBfX2V4aXRfXyhzZWxmLCBleGNfdHlwZSwgZXhjX3ZhbHVlLCB0cmFjZWJhY2spOgogICAgICAgICAgICBwYXNzCgoKdHJ5OiAgIyBQeXRob24gMi43KwogICAgZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgT3JkZXJlZERpY3QKZXhjZXB0IEltcG9ydEVycm9yOgogICAgZnJvbSAucGFja2FnZXMub3JkZXJlZF9kaWN0IGltcG9ydCBPcmRlcmVkRGljdApmcm9tIC5wYWNrYWdlcy5zaXggaW1wb3J0IGl0ZXJrZXlzLCBpdGVydmFsdWVzLCBQWTMKCgpfX2FsbF9fID0gWydSZWNlbnRseVVzZWRDb250YWluZXInLCAnSFRUUEhlYWRlckRpY3QnXQoKCl9OdWxsID0gb2JqZWN0KCkKCgpjbGFzcyBSZWNlbnRseVVzZWRDb250YWluZXIoTXV0YWJsZU1hcHBpbmcpOgogICAgIiIiCiAgICBQcm92aWRlcyBhIHRocmVhZC1zYWZlIGRpY3QtbGlrZSBjb250YWluZXIgd2hpY2ggbWFpbnRhaW5zIHVwIHRvCiAgICBgYG1heHNpemVgYCBrZXlzIHdoaWxlIHRocm93aW5nIGF3YXkgdGhlIGxlYXN0LXJlY2VudGx5LXVzZWQga2V5cyBiZXlvbmQKICAgIGBgbWF4c2l6ZWBgLgoKICAgIDpwYXJhbSBtYXhzaXplOgogICAgICAgIE1heGltdW0gbnVtYmVyIG9mIHJlY2VudCBlbGVtZW50cyB0byByZXRhaW4uCgogICAgOnBhcmFtIGRpc3Bvc2VfZnVuYzoKICAgICAgICBFdmVyeSB0aW1lIGFuIGl0ZW0gaXMgZXZpY3RlZCBmcm9tIHRoZSBjb250YWluZXIsCiAgICAgICAgYGBkaXNwb3NlX2Z1bmModmFsdWUpYGAgaXMgY2FsbGVkLiAgQ2FsbGJhY2sgd2hpY2ggd2lsbCBnZXQgY2FsbGVkCiAgICAiIiIKCiAgICBDb250YWluZXJDbHMgPSBPcmRlcmVkRGljdAoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXhzaXplPTEwLCBkaXNwb3NlX2Z1bmM9Tm9uZSk6CiAgICAgICAgc2VsZi5fbWF4c2l6ZSA9IG1heHNpemUKICAgICAgICBzZWxmLmRpc3Bvc2VfZnVuYyA9IGRpc3Bvc2VfZnVuYwoKICAgICAgICBzZWxmLl9jb250YWluZXIgPSBzZWxmLkNvbnRhaW5lckNscygpCiAgICAgICAgc2VsZi5sb2NrID0gUkxvY2soKQoKICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgogICAgICAgICMgUmUtaW5zZXJ0IHRoZSBpdGVtLCBtb3ZpbmcgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZXZpY3Rpb24gbGluZS4KICAgICAgICB3aXRoIHNlbGYubG9jazoKICAgICAgICAgICAgaXRlbSA9IHNlbGYuX2NvbnRhaW5lci5wb3Aoa2V5KQogICAgICAgICAgICBzZWxmLl9jb250YWluZXJba2V5XSA9IGl0ZW0KICAgICAgICAgICAgcmV0dXJuIGl0ZW0KCiAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwga2V5LCB2YWx1ZSk6CiAgICAgICAgZXZpY3RlZF92YWx1ZSA9IF9OdWxsCiAgICAgICAgd2l0aCBzZWxmLmxvY2s6CiAgICAgICAgICAgICMgUG9zc2libHkgZXZpY3QgdGhlIGV4aXN0aW5nIHZhbHVlIG9mICdrZXknCiAgICAgICAgICAgIGV2aWN0ZWRfdmFsdWUgPSBzZWxmLl9jb250YWluZXIuZ2V0KGtleSwgX051bGwpCiAgICAgICAgICAgIHNlbGYuX2NvbnRhaW5lcltrZXldID0gdmFsdWUKCiAgICAgICAgICAgICMgSWYgd2UgZGlkbid0IGV2aWN0IGFuIGV4aXN0aW5nIHZhbHVlLCB3ZSBtaWdodCBoYXZlIHRvIGV2aWN0IHRoZQogICAgICAgICAgICAjIGxlYXN0IHJlY2VudGx5IHVzZWQgaXRlbSBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNvbnRhaW5lci4KICAgICAgICAgICAgaWYgbGVuKHNlbGYuX2NvbnRhaW5lcikgPiBzZWxmLl9tYXhzaXplOgogICAgICAgICAgICAgICAgX2tleSwgZXZpY3RlZF92YWx1ZSA9IHNlbGYuX2NvbnRhaW5lci5wb3BpdGVtKGxhc3Q9RmFsc2UpCgogICAgICAgIGlmIHNlbGYuZGlzcG9zZV9mdW5jIGFuZCBldmljdGVkX3ZhbHVlIGlzIG5vdCBfTnVsbDoKICAgICAgICAgICAgc2VsZi5kaXNwb3NlX2Z1bmMoZXZpY3RlZF92YWx1ZSkKCiAgICBkZWYgX19kZWxpdGVtX18oc2VsZiwga2V5KToKICAgICAgICB3aXRoIHNlbGYubG9jazoKICAgICAgICAgICAgdmFsdWUgPSBzZWxmLl9jb250YWluZXIucG9wKGtleSkKCiAgICAgICAgaWYgc2VsZi5kaXNwb3NlX2Z1bmM6CiAgICAgICAgICAgIHNlbGYuZGlzcG9zZV9mdW5jKHZhbHVlKQoKICAgIGRlZiBfX2xlbl9fKHNlbGYpOgogICAgICAgIHdpdGggc2VsZi5sb2NrOgogICAgICAgICAgICByZXR1cm4gbGVuKHNlbGYuX2NvbnRhaW5lcikKCiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcignSXRlcmF0aW9uIG92ZXIgdGhpcyBjbGFzcyBpcyB1bmxpa2VseSB0byBiZSB0aHJlYWRzYWZlLicpCgogICAgZGVmIGNsZWFyKHNlbGYpOgogICAgICAgIHdpdGggc2VsZi5sb2NrOgogICAgICAgICAgICAjIENvcHkgcG9pbnRlcnMgdG8gYWxsIHZhbHVlcywgdGhlbiB3aXBlIHRoZSBtYXBwaW5nCiAgICAgICAgICAgIHZhbHVlcyA9IGxpc3QoaXRlcnZhbHVlcyhzZWxmLl9jb250YWluZXIpKQogICAgICAgICAgICBzZWxmLl9jb250YWluZXIuY2xlYXIoKQoKICAgICAgICBpZiBzZWxmLmRpc3Bvc2VfZnVuYzoKICAgICAgICAgICAgZm9yIHZhbHVlIGluIHZhbHVlczoKICAgICAgICAgICAgICAgIHNlbGYuZGlzcG9zZV9mdW5jKHZhbHVlKQoKICAgIGRlZiBrZXlzKHNlbGYpOgogICAgICAgIHdpdGggc2VsZi5sb2NrOgogICAgICAgICAgICByZXR1cm4gbGlzdChpdGVya2V5cyhzZWxmLl9jb250YWluZXIpKQoKCmNsYXNzIEhUVFBIZWFkZXJEaWN0KE11dGFibGVNYXBwaW5nKToKICAgICIiIgogICAgOnBhcmFtIGhlYWRlcnM6CiAgICAgICAgQW4gaXRlcmFibGUgb2YgZmllbGQtdmFsdWUgcGFpcnMuIE11c3Qgbm90IGNvbnRhaW4gbXVsdGlwbGUgZmllbGQgbmFtZXMKICAgICAgICB3aGVuIGNvbXBhcmVkIGNhc2UtaW5zZW5zaXRpdmVseS4KCiAgICA6cGFyYW0ga3dhcmdzOgogICAgICAgIEFkZGl0aW9uYWwgZmllbGQtdmFsdWUgcGFpcnMgdG8gcGFzcyBpbiB0byBgYGRpY3QudXBkYXRlYGAuCgogICAgQSBgYGRpY3RgYCBsaWtlIGNvbnRhaW5lciBmb3Igc3RvcmluZyBIVFRQIEhlYWRlcnMuCgogICAgRmllbGQgbmFtZXMgYXJlIHN0b3JlZCBhbmQgY29tcGFyZWQgY2FzZS1pbnNlbnNpdGl2ZWx5IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgUkZDIDcyMzAuIEl0ZXJhdGlvbiBwcm92aWRlcyB0aGUgZmlyc3QgY2FzZS1zZW5zaXRpdmUga2V5IHNlZW4gZm9yIGVhY2gKICAgIGNhc2UtaW5zZW5zaXRpdmUgcGFpci4KCiAgICBVc2luZyBgYF9fc2V0aXRlbV9fYGAgc3ludGF4IG92ZXJ3cml0ZXMgZmllbGRzIHRoYXQgY29tcGFyZSBlcXVhbAogICAgY2FzZS1pbnNlbnNpdGl2ZWx5IGluIG9yZGVyIHRvIG1haW50YWluIGBgZGljdGBgJ3MgYXBpLiBGb3IgZmllbGRzIHRoYXQKICAgIGNvbXBhcmUgZXF1YWwsIGluc3RlYWQgY3JlYXRlIGEgbmV3IGBgSFRUUEhlYWRlckRpY3RgYCBhbmQgdXNlIGBgLmFkZGBgCiAgICBpbiBhIGxvb3AuCgogICAgSWYgbXVsdGlwbGUgZmllbGRzIHRoYXQgYXJlIGVxdWFsIGNhc2UtaW5zZW5zaXRpdmVseSBhcmUgcGFzc2VkIHRvIHRoZQogICAgY29uc3RydWN0b3Igb3IgYGAudXBkYXRlYGAsIHRoZSBiZWhhdmlvciBpcyB1bmRlZmluZWQgYW5kIHNvbWUgd2lsbCBiZQogICAgbG9zdC4KCiAgICA+Pj4gaGVhZGVycyA9IEhUVFBIZWFkZXJEaWN0KCkKICAgID4+PiBoZWFkZXJzLmFkZCgnU2V0LUNvb2tpZScsICdmb289YmFyJykKICAgID4+PiBoZWFkZXJzLmFkZCgnc2V0LWNvb2tpZScsICdiYXo9cXV4eCcpCiAgICA+Pj4gaGVhZGVyc1snY29udGVudC1sZW5ndGgnXSA9ICc3JwogICAgPj4+IGhlYWRlcnNbJ1NFVC1jb29raWUnXQogICAgJ2Zvbz1iYXIsIGJhej1xdXh4JwogICAgPj4+IGhlYWRlcnNbJ0NvbnRlbnQtTGVuZ3RoJ10KICAgICc3JwogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGhlYWRlcnM9Tm9uZSwgKiprd2FyZ3MpOgogICAgICAgIHN1cGVyKEhUVFBIZWFkZXJEaWN0LCBzZWxmKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5fY29udGFpbmVyID0gT3JkZXJlZERpY3QoKQogICAgICAgIGlmIGhlYWRlcnMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoaGVhZGVycywgSFRUUEhlYWRlckRpY3QpOgogICAgICAgICAgICAgICAgc2VsZi5fY29weV9mcm9tKGhlYWRlcnMpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLmV4dGVuZChoZWFkZXJzKQogICAgICAgIGlmIGt3YXJnczoKICAgICAgICAgICAgc2VsZi5leHRlbmQoa3dhcmdzKQoKICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBrZXksIHZhbCk6CiAgICAgICAgc2VsZi5fY29udGFpbmVyW2tleS5sb3dlcigpXSA9IFtrZXksIHZhbF0KICAgICAgICByZXR1cm4gc2VsZi5fY29udGFpbmVyW2tleS5sb3dlcigpXQoKICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgogICAgICAgIHZhbCA9IHNlbGYuX2NvbnRhaW5lcltrZXkubG93ZXIoKV0KICAgICAgICByZXR1cm4gJywgJy5qb2luKHZhbFsxOl0pCgogICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsIGtleSk6CiAgICAgICAgZGVsIHNlbGYuX2NvbnRhaW5lcltrZXkubG93ZXIoKV0KCiAgICBkZWYgX19jb250YWluc19fKHNlbGYsIGtleSk6CiAgICAgICAgcmV0dXJuIGtleS5sb3dlcigpIGluIHNlbGYuX2NvbnRhaW5lcgoKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBNYXBwaW5nKSBhbmQgbm90IGhhc2F0dHIob3RoZXIsICdrZXlzJyk6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCB0eXBlKHNlbGYpKToKICAgICAgICAgICAgb3RoZXIgPSB0eXBlKHNlbGYpKG90aGVyKQogICAgICAgIHJldHVybiAoZGljdCgoay5sb3dlcigpLCB2KSBmb3IgaywgdiBpbiBzZWxmLml0ZXJtZXJnZWQoKSkgPT0KICAgICAgICAgICAgICAgIGRpY3QoKGsubG93ZXIoKSwgdikgZm9yIGssIHYgaW4gb3RoZXIuaXRlcm1lcmdlZCgpKSkKCiAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gbm90IHNlbGYuX19lcV9fKG90aGVyKQoKICAgIGlmIG5vdCBQWTM6ICAjIFB5dGhvbiAyCiAgICAgICAgaXRlcmtleXMgPSBNdXRhYmxlTWFwcGluZy5pdGVya2V5cwogICAgICAgIGl0ZXJ2YWx1ZXMgPSBNdXRhYmxlTWFwcGluZy5pdGVydmFsdWVzCgogICAgX19tYXJrZXIgPSBvYmplY3QoKQoKICAgIGRlZiBfX2xlbl9fKHNlbGYpOgogICAgICAgIHJldHVybiBsZW4oc2VsZi5fY29udGFpbmVyKQoKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICAjIE9ubHkgcHJvdmlkZSB0aGUgb3JpZ2luYWxseSBjYXNlZCBuYW1lcwogICAgICAgIGZvciB2YWxzIGluIHNlbGYuX2NvbnRhaW5lci52YWx1ZXMoKToKICAgICAgICAgICAgeWllbGQgdmFsc1swXQoKICAgIGRlZiBwb3Aoc2VsZiwga2V5LCBkZWZhdWx0PV9fbWFya2VyKToKICAgICAgICAnJydELnBvcChrWyxkXSkgLT4gdiwgcmVtb3ZlIHNwZWNpZmllZCBrZXkgYW5kIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZS4KICAgICAgICAgIElmIGtleSBpcyBub3QgZm91bmQsIGQgaXMgcmV0dXJuZWQgaWYgZ2l2ZW4sIG90aGVyd2lzZSBLZXlFcnJvciBpcyByYWlzZWQuCiAgICAgICAgJycnCiAgICAgICAgIyBVc2luZyB0aGUgTXV0YWJsZU1hcHBpbmcgZnVuY3Rpb24gZGlyZWN0bHkgZmFpbHMgZHVlIHRvIHRoZSBwcml2YXRlIG1hcmtlci4KICAgICAgICAjIFVzaW5nIG9yZGluYXJ5IGRpY3QucG9wIHdvdWxkIGV4cG9zZSB0aGUgaW50ZXJuYWwgc3RydWN0dXJlcy4KICAgICAgICAjIFNvIGxldCdzIHJlaW52ZW50IHRoZSB3aGVlbC4KICAgICAgICB0cnk6CiAgICAgICAgICAgIHZhbHVlID0gc2VsZltrZXldCiAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICBpZiBkZWZhdWx0IGlzIHNlbGYuX19tYXJrZXI6CiAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICAgICByZXR1cm4gZGVmYXVsdAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGRlbCBzZWxmW2tleV0KICAgICAgICAgICAgcmV0dXJuIHZhbHVlCgogICAgZGVmIGRpc2NhcmQoc2VsZiwga2V5KToKICAgICAgICB0cnk6CiAgICAgICAgICAgIGRlbCBzZWxmW2tleV0KICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgIHBhc3MKCiAgICBkZWYgYWRkKHNlbGYsIGtleSwgdmFsKToKICAgICAgICAiIiJBZGRzIGEgKG5hbWUsIHZhbHVlKSBwYWlyLCBkb2Vzbid0IG92ZXJ3cml0ZSB0aGUgdmFsdWUgaWYgaXQgYWxyZWFkeQogICAgICAgIGV4aXN0cy4KCiAgICAgICAgPj4+IGhlYWRlcnMgPSBIVFRQSGVhZGVyRGljdChmb289J2JhcicpCiAgICAgICAgPj4+IGhlYWRlcnMuYWRkKCdGb28nLCAnYmF6JykKICAgICAgICA+Pj4gaGVhZGVyc1snZm9vJ10KICAgICAgICAnYmFyLCBiYXonCiAgICAgICAgIiIiCiAgICAgICAga2V5X2xvd2VyID0ga2V5Lmxvd2VyKCkKICAgICAgICBuZXdfdmFscyA9IFtrZXksIHZhbF0KICAgICAgICAjIEtlZXAgdGhlIGNvbW1vbiBjYXNlIGFrYSBubyBpdGVtIHByZXNlbnQgYXMgZmFzdCBhcyBwb3NzaWJsZQogICAgICAgIHZhbHMgPSBzZWxmLl9jb250YWluZXIuc2V0ZGVmYXVsdChrZXlfbG93ZXIsIG5ld192YWxzKQogICAgICAgIGlmIG5ld192YWxzIGlzIG5vdCB2YWxzOgogICAgICAgICAgICB2YWxzLmFwcGVuZCh2YWwpCgogICAgZGVmIGV4dGVuZChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgICIiIkdlbmVyaWMgaW1wb3J0IGZ1bmN0aW9uIGZvciBhbnkgdHlwZSBvZiBoZWFkZXItbGlrZSBvYmplY3QuCiAgICAgICAgQWRhcHRlZCB2ZXJzaW9uIG9mIE11dGFibGVNYXBwaW5nLnVwZGF0ZSBpbiBvcmRlciB0byBpbnNlcnQgaXRlbXMKICAgICAgICB3aXRoIHNlbGYuYWRkIGluc3RlYWQgb2Ygc2VsZi5fX3NldGl0ZW1fXwogICAgICAgICIiIgogICAgICAgIGlmIGxlbihhcmdzKSA+IDE6CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiZXh0ZW5kKCkgdGFrZXMgYXQgbW9zdCAxIHBvc2l0aW9uYWwgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgImFyZ3VtZW50cyAoezB9IGdpdmVuKSIuZm9ybWF0KGxlbihhcmdzKSkpCiAgICAgICAgb3RoZXIgPSBhcmdzWzBdIGlmIGxlbihhcmdzKSA+PSAxIGVsc2UgKCkKCiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgSFRUUEhlYWRlckRpY3QpOgogICAgICAgICAgICBmb3Iga2V5LCB2YWwgaW4gb3RoZXIuaXRlcml0ZW1zKCk6CiAgICAgICAgICAgICAgICBzZWxmLmFkZChrZXksIHZhbCkKICAgICAgICBlbGlmIGlzaW5zdGFuY2Uob3RoZXIsIE1hcHBpbmcpOgogICAgICAgICAgICBmb3Iga2V5IGluIG90aGVyOgogICAgICAgICAgICAgICAgc2VsZi5hZGQoa2V5LCBvdGhlcltrZXldKQogICAgICAgIGVsaWYgaGFzYXR0cihvdGhlciwgImtleXMiKToKICAgICAgICAgICAgZm9yIGtleSBpbiBvdGhlci5rZXlzKCk6CiAgICAgICAgICAgICAgICBzZWxmLmFkZChrZXksIG90aGVyW2tleV0pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gb3RoZXI6CiAgICAgICAgICAgICAgICBzZWxmLmFkZChrZXksIHZhbHVlKQoKICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBrd2FyZ3MuaXRlbXMoKToKICAgICAgICAgICAgc2VsZi5hZGQoa2V5LCB2YWx1ZSkKCiAgICBkZWYgZ2V0bGlzdChzZWxmLCBrZXksIGRlZmF1bHQ9X19tYXJrZXIpOgogICAgICAgICIiIlJldHVybnMgYSBsaXN0IG9mIGFsbCB0aGUgdmFsdWVzIGZvciB0aGUgbmFtZWQgZmllbGQuIFJldHVybnMgYW4KICAgICAgICBlbXB0eSBsaXN0IGlmIHRoZSBrZXkgZG9lc24ndCBleGlzdC4iIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIHZhbHMgPSBzZWxmLl9jb250YWluZXJba2V5Lmxvd2VyKCldCiAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICBpZiBkZWZhdWx0IGlzIHNlbGYuX19tYXJrZXI6CiAgICAgICAgICAgICAgICByZXR1cm4gW10KICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHQKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gdmFsc1sxOl0KCiAgICAjIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciBodHRwbGliCiAgICBnZXRoZWFkZXJzID0gZ2V0bGlzdAogICAgZ2V0YWxsbWF0Y2hpbmdoZWFkZXJzID0gZ2V0bGlzdAogICAgaWdldCA9IGdldGxpc3QKCiAgICAjIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciBodHRwLmNvb2tpZWphcgogICAgZ2V0X2FsbCA9IGdldGxpc3QKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICIlcyglcykiICUgKHR5cGUoc2VsZikuX19uYW1lX18sIGRpY3Qoc2VsZi5pdGVybWVyZ2VkKCkpKQoKICAgIGRlZiBfY29weV9mcm9tKHNlbGYsIG90aGVyKToKICAgICAgICBmb3Iga2V5IGluIG90aGVyOgogICAgICAgICAgICB2YWwgPSBvdGhlci5nZXRsaXN0KGtleSkKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWwsIGxpc3QpOgogICAgICAgICAgICAgICAgIyBEb24ndCBuZWVkIHRvIGNvbnZlcnQgdHVwbGVzCiAgICAgICAgICAgICAgICB2YWwgPSBsaXN0KHZhbCkKICAgICAgICAgICAgc2VsZi5fY29udGFpbmVyW2tleS5sb3dlcigpXSA9IFtrZXldICsgdmFsCgogICAgZGVmIGNvcHkoc2VsZik6CiAgICAgICAgY2xvbmUgPSB0eXBlKHNlbGYpKCkKICAgICAgICBjbG9uZS5fY29weV9mcm9tKHNlbGYpCiAgICAgICAgcmV0dXJuIGNsb25lCgogICAgZGVmIGl0ZXJpdGVtcyhzZWxmKToKICAgICAgICAiIiJJdGVyYXRlIG92ZXIgYWxsIGhlYWRlciBsaW5lcywgaW5jbHVkaW5nIGR1cGxpY2F0ZSBvbmVzLiIiIgogICAgICAgIGZvciBrZXkgaW4gc2VsZjoKICAgICAgICAgICAgdmFscyA9IHNlbGYuX2NvbnRhaW5lcltrZXkubG93ZXIoKV0KICAgICAgICAgICAgZm9yIHZhbCBpbiB2YWxzWzE6XToKICAgICAgICAgICAgICAgIHlpZWxkIHZhbHNbMF0sIHZhbAoKICAgIGRlZiBpdGVybWVyZ2VkKHNlbGYpOgogICAgICAgICIiIkl0ZXJhdGUgb3ZlciBhbGwgaGVhZGVycywgbWVyZ2luZyBkdXBsaWNhdGUgb25lcyB0b2dldGhlci4iIiIKICAgICAgICBmb3Iga2V5IGluIHNlbGY6CiAgICAgICAgICAgIHZhbCA9IHNlbGYuX2NvbnRhaW5lcltrZXkubG93ZXIoKV0KICAgICAgICAgICAgeWllbGQgdmFsWzBdLCAnLCAnLmpvaW4odmFsWzE6XSkKCiAgICBkZWYgaXRlbXMoc2VsZik6CiAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi5pdGVyaXRlbXMoKSkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBmcm9tX2h0dHBsaWIoY2xzLCBtZXNzYWdlKTogICMgUHl0aG9uIDIKICAgICAgICAiIiJSZWFkIGhlYWRlcnMgZnJvbSBhIFB5dGhvbiAyIGh0dHBsaWIgbWVzc2FnZSBvYmplY3QuIiIiCiAgICAgICAgIyBweXRob24yLjcgZG9lcyBub3QgZXhwb3NlIGEgcHJvcGVyIEFQSSBmb3IgZXhwb3J0aW5nIG11bHRpaGVhZGVycwogICAgICAgICMgZWZmaWNpZW50bHkuIFRoaXMgZnVuY3Rpb24gcmUtcmVhZHMgcmF3IGxpbmVzIGZyb20gdGhlIG1lc3NhZ2UKICAgICAgICAjIG9iamVjdCBhbmQgZXh0cmFjdHMgdGhlIG11bHRpaGVhZGVycyBwcm9wZXJseS4KICAgICAgICBoZWFkZXJzID0gW10KCiAgICAgICAgZm9yIGxpbmUgaW4gbWVzc2FnZS5oZWFkZXJzOgogICAgICAgICAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoKCcgJywgJ1x0JykpOgogICAgICAgICAgICAgICAga2V5LCB2YWx1ZSA9IGhlYWRlcnNbLTFdCiAgICAgICAgICAgICAgICBoZWFkZXJzWy0xXSA9IChrZXksIHZhbHVlICsgJ1xyXG4nICsgbGluZS5yc3RyaXAoKSkKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICBrZXksIHZhbHVlID0gbGluZS5zcGxpdCgnOicsIDEpCiAgICAgICAgICAgIGhlYWRlcnMuYXBwZW5kKChrZXksIHZhbHVlLnN0cmlwKCkpKQoKICAgICAgICByZXR1cm4gY2xzKGhlYWRlcnMpClBLAwQUAAAAAAAAACEAYISup8syAADLMgAAPgAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9jb25uZWN0aW9uLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKaW1wb3J0IGRhdGV0aW1lCmltcG9ydCBsb2dnaW5nCmltcG9ydCBvcwppbXBvcnQgc3lzCmltcG9ydCBzb2NrZXQKZnJvbSBzb2NrZXQgaW1wb3J0IGVycm9yIGFzIFNvY2tldEVycm9yLCB0aW1lb3V0IGFzIFNvY2tldFRpbWVvdXQKaW1wb3J0IHdhcm5pbmdzCmZyb20gLnBhY2thZ2VzIGltcG9ydCBzaXgKZnJvbSAucGFja2FnZXMuc2l4Lm1vdmVzLmh0dHBfY2xpZW50IGltcG9ydCBIVFRQQ29ubmVjdGlvbiBhcyBfSFRUUENvbm5lY3Rpb24KZnJvbSAucGFja2FnZXMuc2l4Lm1vdmVzLmh0dHBfY2xpZW50IGltcG9ydCBIVFRQRXhjZXB0aW9uICAjIG5vcWE6IEY0MDEKCnRyeTogICMgQ29tcGlsZWQgd2l0aCBTU0w/CiAgICBpbXBvcnQgc3NsCiAgICBCYXNlU1NMRXJyb3IgPSBzc2wuU1NMRXJyb3IKZXhjZXB0IChJbXBvcnRFcnJvciwgQXR0cmlidXRlRXJyb3IpOiAgIyBQbGF0Zm9ybS1zcGVjaWZpYzogTm8gU1NMLgogICAgc3NsID0gTm9uZQoKICAgIGNsYXNzIEJhc2VTU0xFcnJvcihCYXNlRXhjZXB0aW9uKToKICAgICAgICBwYXNzCgoKdHJ5OiAgIyBQeXRob24gMzoKICAgICMgTm90IGEgbm8tb3AsIHdlJ3JlIGFkZGluZyB0aGlzIHRvIHRoZSBuYW1lc3BhY2Ugc28gaXQgY2FuIGJlIGltcG9ydGVkLgogICAgQ29ubmVjdGlvbkVycm9yID0gQ29ubmVjdGlvbkVycm9yCmV4Y2VwdCBOYW1lRXJyb3I6ICAjIFB5dGhvbiAyOgogICAgY2xhc3MgQ29ubmVjdGlvbkVycm9yKEV4Y2VwdGlvbik6CiAgICAgICAgcGFzcwoKCmZyb20gLmV4Y2VwdGlvbnMgaW1wb3J0ICgKICAgIE5ld0Nvbm5lY3Rpb25FcnJvciwKICAgIENvbm5lY3RUaW1lb3V0RXJyb3IsCiAgICBTdWJqZWN0QWx0TmFtZVdhcm5pbmcsCiAgICBTeXN0ZW1UaW1lV2FybmluZywKKQpmcm9tIC5wYWNrYWdlcy5zc2xfbWF0Y2hfaG9zdG5hbWUgaW1wb3J0IG1hdGNoX2hvc3RuYW1lLCBDZXJ0aWZpY2F0ZUVycm9yCgpmcm9tIC51dGlsLnNzbF8gaW1wb3J0ICgKICAgIHJlc29sdmVfY2VydF9yZXFzLAogICAgcmVzb2x2ZV9zc2xfdmVyc2lvbiwKICAgIGFzc2VydF9maW5nZXJwcmludCwKICAgIGNyZWF0ZV91cmxsaWIzX2NvbnRleHQsCiAgICBzc2xfd3JhcF9zb2NrZXQKKQoKCmZyb20gLnV0aWwgaW1wb3J0IGNvbm5lY3Rpb24KCmZyb20gLl9jb2xsZWN0aW9ucyBpbXBvcnQgSFRUUEhlYWRlckRpY3QKCmxvZyA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKcG9ydF9ieV9zY2hlbWUgPSB7CiAgICAnaHR0cCc6IDgwLAogICAgJ2h0dHBzJzogNDQzLAp9CgojIFdoZW4gdXBkYXRpbmcgUkVDRU5UX0RBVEUsIG1vdmUgaXQgdG8KIyB3aXRoaW4gdHdvIHllYXJzIG9mIHRoZSBjdXJyZW50IGRhdGUsIGFuZCBubwojIGVhcmxpZXIgdGhhbiA2IG1vbnRocyBhZ28uClJFQ0VOVF9EQVRFID0gZGF0ZXRpbWUuZGF0ZSgyMDE2LCAxLCAxKQoKCmNsYXNzIER1bW15Q29ubmVjdGlvbihvYmplY3QpOgogICAgIiIiVXNlZCB0byBkZXRlY3QgYSBmYWlsZWQgQ29ubmVjdGlvbkNscyBpbXBvcnQuIiIiCiAgICBwYXNzCgoKY2xhc3MgSFRUUENvbm5lY3Rpb24oX0hUVFBDb25uZWN0aW9uLCBvYmplY3QpOgogICAgIiIiCiAgICBCYXNlZCBvbiBodHRwbGliLkhUVFBDb25uZWN0aW9uIGJ1dCBwcm92aWRlcyBhbiBleHRyYSBjb25zdHJ1Y3RvcgogICAgYmFja3dhcmRzLWNvbXBhdGliaWxpdHkgbGF5ZXIgYmV0d2VlbiBvbGRlciBhbmQgbmV3ZXIgUHl0aG9ucy4KCiAgICBBZGRpdGlvbmFsIGtleXdvcmQgcGFyYW1ldGVycyBhcmUgdXNlZCB0byBjb25maWd1cmUgYXR0cmlidXRlcyBvZiB0aGUgY29ubmVjdGlvbi4KICAgIEFjY2VwdGVkIHBhcmFtZXRlcnMgaW5jbHVkZToKCiAgICAgIC0gYGBzdHJpY3RgYDogU2VlIHRoZSBkb2N1bWVudGF0aW9uIG9uIDpjbGFzczpgdXJsbGliMy5jb25uZWN0aW9ucG9vbC5IVFRQQ29ubmVjdGlvblBvb2xgCiAgICAgIC0gYGBzb3VyY2VfYWRkcmVzc2BgOiBTZXQgdGhlIHNvdXJjZSBhZGRyZXNzIGZvciB0aGUgY3VycmVudCBjb25uZWN0aW9uLgoKICAgICAgICAuLiBub3RlOjogVGhpcyBpcyBpZ25vcmVkIGZvciBQeXRob24gMi42LiBJdCBpcyBvbmx5IGFwcGxpZWQgZm9yIDIuNyBhbmQgMy54CgogICAgICAtIGBgc29ja2V0X29wdGlvbnNgYDogU2V0IHNwZWNpZmljIG9wdGlvbnMgb24gdGhlIHVuZGVybHlpbmcgc29ja2V0LiBJZiBub3Qgc3BlY2lmaWVkLCB0aGVuCiAgICAgICAgZGVmYXVsdHMgYXJlIGxvYWRlZCBmcm9tIGBgSFRUUENvbm5lY3Rpb24uZGVmYXVsdF9zb2NrZXRfb3B0aW9uc2BgIHdoaWNoIGluY2x1ZGVzIGRpc2FibGluZwogICAgICAgIE5hZ2xlJ3MgYWxnb3JpdGhtIChzZXRzIFRDUF9OT0RFTEFZIHRvIDEpIHVubGVzcyB0aGUgY29ubmVjdGlvbiBpcyBiZWhpbmQgYSBwcm94eS4KCiAgICAgICAgRm9yIGV4YW1wbGUsIGlmIHlvdSB3aXNoIHRvIGVuYWJsZSBUQ1AgS2VlcCBBbGl2ZSBpbiBhZGRpdGlvbiB0byB0aGUgZGVmYXVsdHMsCiAgICAgICAgeW91IG1pZ2h0IHBhc3M6OgoKICAgICAgICAgICAgSFRUUENvbm5lY3Rpb24uZGVmYXVsdF9zb2NrZXRfb3B0aW9ucyArIFsKICAgICAgICAgICAgICAgIChzb2NrZXQuU09MX1NPQ0tFVCwgc29ja2V0LlNPX0tFRVBBTElWRSwgMSksCiAgICAgICAgICAgIF0KCiAgICAgICAgT3IgeW91IG1heSB3YW50IHRvIGRpc2FibGUgdGhlIGRlZmF1bHRzIGJ5IHBhc3NpbmcgYW4gZW1wdHkgbGlzdCAoZS5nLiwgYGBbXWBgKS4KICAgICIiIgoKICAgIGRlZmF1bHRfcG9ydCA9IHBvcnRfYnlfc2NoZW1lWydodHRwJ10KCiAgICAjOiBEaXNhYmxlIE5hZ2xlJ3MgYWxnb3JpdGhtIGJ5IGRlZmF1bHQuCiAgICAjOiBgYFsoc29ja2V0LklQUFJPVE9fVENQLCBzb2NrZXQuVENQX05PREVMQVksIDEpXWBgCiAgICBkZWZhdWx0X3NvY2tldF9vcHRpb25zID0gWyhzb2NrZXQuSVBQUk9UT19UQ1AsIHNvY2tldC5UQ1BfTk9ERUxBWSwgMSldCgogICAgIzogV2hldGhlciB0aGlzIGNvbm5lY3Rpb24gdmVyaWZpZXMgdGhlIGhvc3QncyBjZXJ0aWZpY2F0ZS4KICAgIGlzX3ZlcmlmaWVkID0gRmFsc2UKCiAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3cpOgogICAgICAgIGlmIHNpeC5QWTM6ICAjIFB5dGhvbiAzCiAgICAgICAgICAgIGt3LnBvcCgnc3RyaWN0JywgTm9uZSkKCiAgICAgICAgIyBQcmUtc2V0IHNvdXJjZV9hZGRyZXNzIGluIGNhc2Ugd2UgaGF2ZSBhbiBvbGRlciBQeXRob24gbGlrZSAyLjYuCiAgICAgICAgc2VsZi5zb3VyY2VfYWRkcmVzcyA9IGt3LmdldCgnc291cmNlX2FkZHJlc3MnKQoKICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvIDwgKDIsIDcpOiAgIyBQeXRob24gMi42CiAgICAgICAgICAgICMgX0hUVFBDb25uZWN0aW9uIG9uIFB5dGhvbiAyLjYgd2lsbCBiYWxrIGF0IHRoaXMga2V5d29yZCBhcmcsIGJ1dAogICAgICAgICAgICAjIG5vdCBuZXdlciB2ZXJzaW9ucy4gV2UgY2FuIHN0aWxsIHVzZSBpdCB3aGVuIGNyZWF0aW5nIGEKICAgICAgICAgICAgIyBjb25uZWN0aW9uIHRob3VnaCwgc28gd2UgcG9wIGl0ICphZnRlciogd2UgaGF2ZSBzYXZlZCBpdCBhcwogICAgICAgICAgICAjIHNlbGYuc291cmNlX2FkZHJlc3MuCiAgICAgICAgICAgIGt3LnBvcCgnc291cmNlX2FkZHJlc3MnLCBOb25lKQoKICAgICAgICAjOiBUaGUgc29ja2V0IG9wdGlvbnMgcHJvdmlkZWQgYnkgdGhlIHVzZXIuIElmIG5vIG9wdGlvbnMgYXJlCiAgICAgICAgIzogcHJvdmlkZWQsIHdlIHVzZSB0aGUgZGVmYXVsdCBvcHRpb25zLgogICAgICAgIHNlbGYuc29ja2V0X29wdGlvbnMgPSBrdy5wb3AoJ3NvY2tldF9vcHRpb25zJywgc2VsZi5kZWZhdWx0X3NvY2tldF9vcHRpb25zKQoKICAgICAgICAjIFN1cGVyY2xhc3MgYWxzbyBzZXRzIHNlbGYuc291cmNlX2FkZHJlc3MgaW4gUHl0aG9uIDIuNysuCiAgICAgICAgX0hUVFBDb25uZWN0aW9uLl9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3KQoKICAgIGRlZiBfbmV3X2Nvbm4oc2VsZik6CiAgICAgICAgIiIiIEVzdGFibGlzaCBhIHNvY2tldCBjb25uZWN0aW9uIGFuZCBzZXQgbm9kZWxheSBzZXR0aW5ncyBvbiBpdC4KCiAgICAgICAgOnJldHVybjogTmV3IHNvY2tldCBjb25uZWN0aW9uLgogICAgICAgICIiIgogICAgICAgIGV4dHJhX2t3ID0ge30KICAgICAgICBpZiBzZWxmLnNvdXJjZV9hZGRyZXNzOgogICAgICAgICAgICBleHRyYV9rd1snc291cmNlX2FkZHJlc3MnXSA9IHNlbGYuc291cmNlX2FkZHJlc3MKCiAgICAgICAgaWYgc2VsZi5zb2NrZXRfb3B0aW9uczoKICAgICAgICAgICAgZXh0cmFfa3dbJ3NvY2tldF9vcHRpb25zJ10gPSBzZWxmLnNvY2tldF9vcHRpb25zCgogICAgICAgIHRyeToKICAgICAgICAgICAgY29ubiA9IGNvbm5lY3Rpb24uY3JlYXRlX2Nvbm5lY3Rpb24oCiAgICAgICAgICAgICAgICAoc2VsZi5ob3N0LCBzZWxmLnBvcnQpLCBzZWxmLnRpbWVvdXQsICoqZXh0cmFfa3cpCgogICAgICAgIGV4Y2VwdCBTb2NrZXRUaW1lb3V0IGFzIGU6CiAgICAgICAgICAgIHJhaXNlIENvbm5lY3RUaW1lb3V0RXJyb3IoCiAgICAgICAgICAgICAgICBzZWxmLCAiQ29ubmVjdGlvbiB0byAlcyB0aW1lZCBvdXQuIChjb25uZWN0IHRpbWVvdXQ9JXMpIiAlCiAgICAgICAgICAgICAgICAoc2VsZi5ob3N0LCBzZWxmLnRpbWVvdXQpKQoKICAgICAgICBleGNlcHQgU29ja2V0RXJyb3IgYXMgZToKICAgICAgICAgICAgcmFpc2UgTmV3Q29ubmVjdGlvbkVycm9yKAogICAgICAgICAgICAgICAgc2VsZiwgIkZhaWxlZCB0byBlc3RhYmxpc2ggYSBuZXcgY29ubmVjdGlvbjogJXMiICUgZSkKCiAgICAgICAgcmV0dXJuIGNvbm4KCiAgICBkZWYgX3ByZXBhcmVfY29ubihzZWxmLCBjb25uKToKICAgICAgICBzZWxmLnNvY2sgPSBjb25uCiAgICAgICAgIyB0aGUgX3R1bm5lbF9ob3N0IGF0dHJpYnV0ZSB3YXMgYWRkZWQgaW4gcHl0aG9uIDIuNi4zICh2aWEKICAgICAgICAjIGh0dHA6Ly9oZy5weXRob24ub3JnL2NweXRob24vcmV2LzBmNTdiMzBhMTUyZikgc28gcHl0aG9ucyAyLjYoMC0yKSBkbwogICAgICAgICMgbm90IGhhdmUgdGhlbS4KICAgICAgICBpZiBnZXRhdHRyKHNlbGYsICdfdHVubmVsX2hvc3QnLCBOb25lKToKICAgICAgICAgICAgIyBUT0RPOiBGaXggdHVubmVsIHNvIGl0IGRvZXNuJ3QgZGVwZW5kIG9uIHNlbGYuc29jayBzdGF0ZS4KICAgICAgICAgICAgc2VsZi5fdHVubmVsKCkKICAgICAgICAgICAgIyBNYXJrIHRoaXMgY29ubmVjdGlvbiBhcyBub3QgcmV1c2FibGUKICAgICAgICAgICAgc2VsZi5hdXRvX29wZW4gPSAwCgogICAgZGVmIGNvbm5lY3Qoc2VsZik6CiAgICAgICAgY29ubiA9IHNlbGYuX25ld19jb25uKCkKICAgICAgICBzZWxmLl9wcmVwYXJlX2Nvbm4oY29ubikKCiAgICBkZWYgcmVxdWVzdF9jaHVua2VkKHNlbGYsIG1ldGhvZCwgdXJsLCBib2R5PU5vbmUsIGhlYWRlcnM9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgQWx0ZXJuYXRpdmUgdG8gdGhlIGNvbW1vbiByZXF1ZXN0IG1ldGhvZCwgd2hpY2ggc2VuZHMgdGhlCiAgICAgICAgYm9keSB3aXRoIGNodW5rZWQgZW5jb2RpbmcgYW5kIG5vdCBhcyBvbmUgYmxvY2sKICAgICAgICAiIiIKICAgICAgICBoZWFkZXJzID0gSFRUUEhlYWRlckRpY3QoaGVhZGVycyBpZiBoZWFkZXJzIGlzIG5vdCBOb25lIGVsc2Uge30pCiAgICAgICAgc2tpcF9hY2NlcHRfZW5jb2RpbmcgPSAnYWNjZXB0LWVuY29kaW5nJyBpbiBoZWFkZXJzCiAgICAgICAgc2tpcF9ob3N0ID0gJ2hvc3QnIGluIGhlYWRlcnMKICAgICAgICBzZWxmLnB1dHJlcXVlc3QoCiAgICAgICAgICAgIG1ldGhvZCwKICAgICAgICAgICAgdXJsLAogICAgICAgICAgICBza2lwX2FjY2VwdF9lbmNvZGluZz1za2lwX2FjY2VwdF9lbmNvZGluZywKICAgICAgICAgICAgc2tpcF9ob3N0PXNraXBfaG9zdAogICAgICAgICkKICAgICAgICBmb3IgaGVhZGVyLCB2YWx1ZSBpbiBoZWFkZXJzLml0ZW1zKCk6CiAgICAgICAgICAgIHNlbGYucHV0aGVhZGVyKGhlYWRlciwgdmFsdWUpCiAgICAgICAgaWYgJ3RyYW5zZmVyLWVuY29kaW5nJyBub3QgaW4gaGVhZGVyczoKICAgICAgICAgICAgc2VsZi5wdXRoZWFkZXIoJ1RyYW5zZmVyLUVuY29kaW5nJywgJ2NodW5rZWQnKQogICAgICAgIHNlbGYuZW5kaGVhZGVycygpCgogICAgICAgIGlmIGJvZHkgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHN0cmluZ2lzaF90eXBlcyA9IHNpeC5zdHJpbmdfdHlwZXMgKyAoc2l4LmJpbmFyeV90eXBlLCkKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShib2R5LCBzdHJpbmdpc2hfdHlwZXMpOgogICAgICAgICAgICAgICAgYm9keSA9IChib2R5LCkKICAgICAgICAgICAgZm9yIGNodW5rIGluIGJvZHk6CiAgICAgICAgICAgICAgICBpZiBub3QgY2h1bms6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGNodW5rLCBzaXguYmluYXJ5X3R5cGUpOgogICAgICAgICAgICAgICAgICAgIGNodW5rID0gY2h1bmsuZW5jb2RlKCd1dGY4JykKICAgICAgICAgICAgICAgIGxlbl9zdHIgPSBoZXgobGVuKGNodW5rKSlbMjpdCiAgICAgICAgICAgICAgICBzZWxmLnNlbmQobGVuX3N0ci5lbmNvZGUoJ3V0Zi04JykpCiAgICAgICAgICAgICAgICBzZWxmLnNlbmQoYidcclxuJykKICAgICAgICAgICAgICAgIHNlbGYuc2VuZChjaHVuaykKICAgICAgICAgICAgICAgIHNlbGYuc2VuZChiJ1xyXG4nKQoKICAgICAgICAjIEFmdGVyIHRoZSBpZiBjbGF1c2UsIHRvIGFsd2F5cyBoYXZlIGEgY2xvc2VkIGJvZHkKICAgICAgICBzZWxmLnNlbmQoYicwXHJcblxyXG4nKQoKCmNsYXNzIEhUVFBTQ29ubmVjdGlvbihIVFRQQ29ubmVjdGlvbik6CiAgICBkZWZhdWx0X3BvcnQgPSBwb3J0X2J5X3NjaGVtZVsnaHR0cHMnXQoKICAgIHNzbF92ZXJzaW9uID0gTm9uZQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0LCBwb3J0PU5vbmUsIGtleV9maWxlPU5vbmUsIGNlcnRfZmlsZT1Ob25lLAogICAgICAgICAgICAgICAgIHN0cmljdD1Ob25lLCB0aW1lb3V0PXNvY2tldC5fR0xPQkFMX0RFRkFVTFRfVElNRU9VVCwKICAgICAgICAgICAgICAgICBzc2xfY29udGV4dD1Ob25lLCAqKmt3KToKCiAgICAgICAgSFRUUENvbm5lY3Rpb24uX19pbml0X18oc2VsZiwgaG9zdCwgcG9ydCwgc3RyaWN0PXN0cmljdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0PXRpbWVvdXQsICoqa3cpCgogICAgICAgIHNlbGYua2V5X2ZpbGUgPSBrZXlfZmlsZQogICAgICAgIHNlbGYuY2VydF9maWxlID0gY2VydF9maWxlCiAgICAgICAgc2VsZi5zc2xfY29udGV4dCA9IHNzbF9jb250ZXh0CgogICAgICAgICMgUmVxdWlyZWQgcHJvcGVydHkgZm9yIEdvb2dsZSBBcHBFbmdpbmUgMS45LjAgd2hpY2ggb3RoZXJ3aXNlIGNhdXNlcwogICAgICAgICMgSFRUUFMgcmVxdWVzdHMgdG8gZ28gb3V0IGFzIEhUVFAuIChTZWUgSXNzdWUgIzM1NikKICAgICAgICBzZWxmLl9wcm90b2NvbCA9ICdodHRwcycKCiAgICBkZWYgY29ubmVjdChzZWxmKToKICAgICAgICBjb25uID0gc2VsZi5fbmV3X2Nvbm4oKQogICAgICAgIHNlbGYuX3ByZXBhcmVfY29ubihjb25uKQoKICAgICAgICBpZiBzZWxmLnNzbF9jb250ZXh0IGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYuc3NsX2NvbnRleHQgPSBjcmVhdGVfdXJsbGliM19jb250ZXh0KAogICAgICAgICAgICAgICAgc3NsX3ZlcnNpb249cmVzb2x2ZV9zc2xfdmVyc2lvbihOb25lKSwKICAgICAgICAgICAgICAgIGNlcnRfcmVxcz1yZXNvbHZlX2NlcnRfcmVxcyhOb25lKSwKICAgICAgICAgICAgKQoKICAgICAgICBzZWxmLnNvY2sgPSBzc2xfd3JhcF9zb2NrZXQoCiAgICAgICAgICAgIHNvY2s9Y29ubiwKICAgICAgICAgICAga2V5ZmlsZT1zZWxmLmtleV9maWxlLAogICAgICAgICAgICBjZXJ0ZmlsZT1zZWxmLmNlcnRfZmlsZSwKICAgICAgICAgICAgc3NsX2NvbnRleHQ9c2VsZi5zc2xfY29udGV4dCwKICAgICAgICApCgoKY2xhc3MgVmVyaWZpZWRIVFRQU0Nvbm5lY3Rpb24oSFRUUFNDb25uZWN0aW9uKToKICAgICIiIgogICAgQmFzZWQgb24gaHR0cGxpYi5IVFRQU0Nvbm5lY3Rpb24gYnV0IHdyYXBzIHRoZSBzb2NrZXQgd2l0aAogICAgU1NMIGNlcnRpZmljYXRpb24uCiAgICAiIiIKICAgIGNlcnRfcmVxcyA9IE5vbmUKICAgIGNhX2NlcnRzID0gTm9uZQogICAgY2FfY2VydF9kaXIgPSBOb25lCiAgICBzc2xfdmVyc2lvbiA9IE5vbmUKICAgIGFzc2VydF9maW5nZXJwcmludCA9IE5vbmUKCiAgICBkZWYgc2V0X2NlcnQoc2VsZiwga2V5X2ZpbGU9Tm9uZSwgY2VydF9maWxlPU5vbmUsCiAgICAgICAgICAgICAgICAgY2VydF9yZXFzPU5vbmUsIGNhX2NlcnRzPU5vbmUsCiAgICAgICAgICAgICAgICAgYXNzZXJ0X2hvc3RuYW1lPU5vbmUsIGFzc2VydF9maW5nZXJwcmludD1Ob25lLAogICAgICAgICAgICAgICAgIGNhX2NlcnRfZGlyPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbmNlLCBiZWZvcmUgdGhlIGNvbm5lY3Rpb24gaXMgdXNlZC4KICAgICAgICAiIiIKICAgICAgICAjIElmIGNlcnRfcmVxcyBpcyBub3QgcHJvdmlkZWQsIHdlIGNhbiB0cnkgdG8gZ3Vlc3MuIElmIHRoZSB1c2VyIGdhdmUKICAgICAgICAjIHVzIGEgY2VydCBkYXRhYmFzZSwgd2UgYXNzdW1lIHRoZXkgd2FudCB0byB1c2UgaXQ6IG90aGVyd2lzZSwgaWYKICAgICAgICAjIHRoZXkgZ2F2ZSB1cyBhbiBTU0wgQ29udGV4dCBvYmplY3Qgd2Ugc2hvdWxkIHVzZSB3aGF0ZXZlciBpcyBzZXQgZm9yCiAgICAgICAgIyBpdC4KICAgICAgICBpZiBjZXJ0X3JlcXMgaXMgTm9uZToKICAgICAgICAgICAgaWYgY2FfY2VydHMgb3IgY2FfY2VydF9kaXI6CiAgICAgICAgICAgICAgICBjZXJ0X3JlcXMgPSAnQ0VSVF9SRVFVSVJFRCcKICAgICAgICAgICAgZWxpZiBzZWxmLnNzbF9jb250ZXh0IGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgY2VydF9yZXFzID0gc2VsZi5zc2xfY29udGV4dC52ZXJpZnlfbW9kZQoKICAgICAgICBzZWxmLmtleV9maWxlID0ga2V5X2ZpbGUKICAgICAgICBzZWxmLmNlcnRfZmlsZSA9IGNlcnRfZmlsZQogICAgICAgIHNlbGYuY2VydF9yZXFzID0gY2VydF9yZXFzCiAgICAgICAgc2VsZi5hc3NlcnRfaG9zdG5hbWUgPSBhc3NlcnRfaG9zdG5hbWUKICAgICAgICBzZWxmLmFzc2VydF9maW5nZXJwcmludCA9IGFzc2VydF9maW5nZXJwcmludAogICAgICAgIHNlbGYuY2FfY2VydHMgPSBjYV9jZXJ0cyBhbmQgb3MucGF0aC5leHBhbmR1c2VyKGNhX2NlcnRzKQogICAgICAgIHNlbGYuY2FfY2VydF9kaXIgPSBjYV9jZXJ0X2RpciBhbmQgb3MucGF0aC5leHBhbmR1c2VyKGNhX2NlcnRfZGlyKQoKICAgIGRlZiBjb25uZWN0KHNlbGYpOgogICAgICAgICMgQWRkIGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbgogICAgICAgIGNvbm4gPSBzZWxmLl9uZXdfY29ubigpCgogICAgICAgIGhvc3RuYW1lID0gc2VsZi5ob3N0CiAgICAgICAgaWYgZ2V0YXR0cihzZWxmLCAnX3R1bm5lbF9ob3N0JywgTm9uZSk6CiAgICAgICAgICAgICMgX3R1bm5lbF9ob3N0IHdhcyBhZGRlZCBpbiBQeXRob24gMi42LjMKICAgICAgICAgICAgIyAoU2VlOiBodHRwOi8vaGcucHl0aG9uLm9yZy9jcHl0aG9uL3Jldi8wZjU3YjMwYTE1MmYpCgogICAgICAgICAgICBzZWxmLnNvY2sgPSBjb25uCiAgICAgICAgICAgICMgQ2FsbHMgc2VsZi5fc2V0X2hvc3Rwb3J0KCksIHNvIHNlbGYuaG9zdCBpcwogICAgICAgICAgICAjIHNlbGYuX3R1bm5lbF9ob3N0IGJlbG93LgogICAgICAgICAgICBzZWxmLl90dW5uZWwoKQogICAgICAgICAgICAjIE1hcmsgdGhpcyBjb25uZWN0aW9uIGFzIG5vdCByZXVzYWJsZQogICAgICAgICAgICBzZWxmLmF1dG9fb3BlbiA9IDAKCiAgICAgICAgICAgICMgT3ZlcnJpZGUgdGhlIGhvc3Qgd2l0aCB0aGUgb25lIHdlJ3JlIHJlcXVlc3RpbmcgZGF0YSBmcm9tLgogICAgICAgICAgICBob3N0bmFtZSA9IHNlbGYuX3R1bm5lbF9ob3N0CgogICAgICAgIGlzX3RpbWVfb2ZmID0gZGF0ZXRpbWUuZGF0ZS50b2RheSgpIDwgUkVDRU5UX0RBVEUKICAgICAgICBpZiBpc190aW1lX29mZjoKICAgICAgICAgICAgd2FybmluZ3Mud2FybigoCiAgICAgICAgICAgICAgICAnU3lzdGVtIHRpbWUgaXMgd2F5IG9mZiAoYmVmb3JlIHswfSkuIFRoaXMgd2lsbCBwcm9iYWJseSAnCiAgICAgICAgICAgICAgICAnbGVhZCB0byBTU0wgdmVyaWZpY2F0aW9uIGVycm9ycycpLmZvcm1hdChSRUNFTlRfREFURSksCiAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lV2FybmluZwogICAgICAgICAgICApCgogICAgICAgICMgV3JhcCBzb2NrZXQgdXNpbmcgdmVyaWZpY2F0aW9uIHdpdGggdGhlIHJvb3QgY2VydHMgaW4KICAgICAgICAjIHRydXN0ZWRfcm9vdF9jZXJ0cwogICAgICAgIGlmIHNlbGYuc3NsX2NvbnRleHQgaXMgTm9uZToKICAgICAgICAgICAgc2VsZi5zc2xfY29udGV4dCA9IGNyZWF0ZV91cmxsaWIzX2NvbnRleHQoCiAgICAgICAgICAgICAgICBzc2xfdmVyc2lvbj1yZXNvbHZlX3NzbF92ZXJzaW9uKHNlbGYuc3NsX3ZlcnNpb24pLAogICAgICAgICAgICAgICAgY2VydF9yZXFzPXJlc29sdmVfY2VydF9yZXFzKHNlbGYuY2VydF9yZXFzKSwKICAgICAgICAgICAgKQoKICAgICAgICBjb250ZXh0ID0gc2VsZi5zc2xfY29udGV4dAogICAgICAgIGNvbnRleHQudmVyaWZ5X21vZGUgPSByZXNvbHZlX2NlcnRfcmVxcyhzZWxmLmNlcnRfcmVxcykKICAgICAgICBzZWxmLnNvY2sgPSBzc2xfd3JhcF9zb2NrZXQoCiAgICAgICAgICAgIHNvY2s9Y29ubiwKICAgICAgICAgICAga2V5ZmlsZT1zZWxmLmtleV9maWxlLAogICAgICAgICAgICBjZXJ0ZmlsZT1zZWxmLmNlcnRfZmlsZSwKICAgICAgICAgICAgY2FfY2VydHM9c2VsZi5jYV9jZXJ0cywKICAgICAgICAgICAgY2FfY2VydF9kaXI9c2VsZi5jYV9jZXJ0X2RpciwKICAgICAgICAgICAgc2VydmVyX2hvc3RuYW1lPWhvc3RuYW1lLAogICAgICAgICAgICBzc2xfY29udGV4dD1jb250ZXh0KQoKICAgICAgICBpZiBzZWxmLmFzc2VydF9maW5nZXJwcmludDoKICAgICAgICAgICAgYXNzZXJ0X2ZpbmdlcnByaW50KHNlbGYuc29jay5nZXRwZWVyY2VydChiaW5hcnlfZm9ybT1UcnVlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0X2ZpbmdlcnByaW50KQogICAgICAgIGVsaWYgY29udGV4dC52ZXJpZnlfbW9kZSAhPSBzc2wuQ0VSVF9OT05FIFwKICAgICAgICAgICAgICAgIGFuZCBub3QgZ2V0YXR0cihjb250ZXh0LCAnY2hlY2tfaG9zdG5hbWUnLCBGYWxzZSkgXAogICAgICAgICAgICAgICAgYW5kIHNlbGYuYXNzZXJ0X2hvc3RuYW1lIGlzIG5vdCBGYWxzZToKICAgICAgICAgICAgIyBXaGlsZSB1cmxsaWIzIGF0dGVtcHRzIHRvIGFsd2F5cyB0dXJuIG9mZiBob3N0bmFtZSBtYXRjaGluZyBmcm9tCiAgICAgICAgICAgICMgdGhlIFRMUyBsaWJyYXJ5LCB0aGlzIGNhbm5vdCBhbHdheXMgYmUgZG9uZS4gU28gd2UgY2hlY2sgd2hldGhlcgogICAgICAgICAgICAjIHRoZSBUTFMgTGlicmFyeSBzdGlsbCB0aGlua3MgaXQncyBtYXRjaGluZyBob3N0bmFtZXMuCiAgICAgICAgICAgIGNlcnQgPSBzZWxmLnNvY2suZ2V0cGVlcmNlcnQoKQogICAgICAgICAgICBpZiBub3QgY2VydC5nZXQoJ3N1YmplY3RBbHROYW1lJywgKCkpOgogICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybigoCiAgICAgICAgICAgICAgICAgICAgJ0NlcnRpZmljYXRlIGZvciB7MH0gaGFzIG5vIGBzdWJqZWN0QWx0TmFtZWAsIGZhbGxpbmcgYmFjayB0byBjaGVjayBmb3IgYSAnCiAgICAgICAgICAgICAgICAgICAgJ2Bjb21tb25OYW1lYCBmb3Igbm93LiBUaGlzIGZlYXR1cmUgaXMgYmVpbmcgcmVtb3ZlZCBieSBtYWpvciBicm93c2VycyBhbmQgJwogICAgICAgICAgICAgICAgICAgICdkZXByZWNhdGVkIGJ5IFJGQyAyODE4LiAoU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9zaGF6b3cvdXJsbGliMy9pc3N1ZXMvNDk3ICcKICAgICAgICAgICAgICAgICAgICAnZm9yIGRldGFpbHMuKScuZm9ybWF0KGhvc3RuYW1lKSksCiAgICAgICAgICAgICAgICAgICAgU3ViamVjdEFsdE5hbWVXYXJuaW5nCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIF9tYXRjaF9ob3N0bmFtZShjZXJ0LCBzZWxmLmFzc2VydF9ob3N0bmFtZSBvciBob3N0bmFtZSkKCiAgICAgICAgc2VsZi5pc192ZXJpZmllZCA9ICgKICAgICAgICAgICAgY29udGV4dC52ZXJpZnlfbW9kZSA9PSBzc2wuQ0VSVF9SRVFVSVJFRCBvcgogICAgICAgICAgICBzZWxmLmFzc2VydF9maW5nZXJwcmludCBpcyBub3QgTm9uZQogICAgICAgICkKCgpkZWYgX21hdGNoX2hvc3RuYW1lKGNlcnQsIGFzc2VydGVkX2hvc3RuYW1lKToKICAgIHRyeToKICAgICAgICBtYXRjaF9ob3N0bmFtZShjZXJ0LCBhc3NlcnRlZF9ob3N0bmFtZSkKICAgIGV4Y2VwdCBDZXJ0aWZpY2F0ZUVycm9yIGFzIGU6CiAgICAgICAgbG9nLmVycm9yKAogICAgICAgICAgICAnQ2VydGlmaWNhdGUgZGlkIG5vdCBtYXRjaCBleHBlY3RlZCBob3N0bmFtZTogJXMuICcKICAgICAgICAgICAgJ0NlcnRpZmljYXRlOiAlcycsIGFzc2VydGVkX2hvc3RuYW1lLCBjZXJ0CiAgICAgICAgKQogICAgICAgICMgQWRkIGNlcnQgdG8gZXhjZXB0aW9uIGFuZCByZXJhaXNlIHNvIGNsaWVudCBjb2RlIGNhbiBpbnNwZWN0CiAgICAgICAgIyB0aGUgY2VydCB3aGVuIGNhdGNoaW5nIHRoZSBleGNlcHRpb24sIGlmIHRoZXkgd2FudCB0bwogICAgICAgIGUuX3BlZXJfY2VydCA9IGNlcnQKICAgICAgICByYWlzZQoKCmlmIHNzbDoKICAgICMgTWFrZSBhIGNvcHkgZm9yIHRlc3RpbmcuCiAgICBVbnZlcmlmaWVkSFRUUFNDb25uZWN0aW9uID0gSFRUUFNDb25uZWN0aW9uCiAgICBIVFRQU0Nvbm5lY3Rpb24gPSBWZXJpZmllZEhUVFBTQ29ubmVjdGlvbgplbHNlOgogICAgSFRUUFNDb25uZWN0aW9uID0gRHVtbXlDb25uZWN0aW9uClBLAwQUAAAAAAAAACEAFxocbx6KAAAeigAAQgAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9jb25uZWN0aW9ucG9vbC5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CmltcG9ydCBlcnJubwppbXBvcnQgbG9nZ2luZwppbXBvcnQgc3lzCmltcG9ydCB3YXJuaW5ncwoKZnJvbSBzb2NrZXQgaW1wb3J0IGVycm9yIGFzIFNvY2tldEVycm9yLCB0aW1lb3V0IGFzIFNvY2tldFRpbWVvdXQKaW1wb3J0IHNvY2tldAoKCmZyb20gLmV4Y2VwdGlvbnMgaW1wb3J0ICgKICAgIENsb3NlZFBvb2xFcnJvciwKICAgIFByb3RvY29sRXJyb3IsCiAgICBFbXB0eVBvb2xFcnJvciwKICAgIEhlYWRlclBhcnNpbmdFcnJvciwKICAgIEhvc3RDaGFuZ2VkRXJyb3IsCiAgICBMb2NhdGlvblZhbHVlRXJyb3IsCiAgICBNYXhSZXRyeUVycm9yLAogICAgUHJveHlFcnJvciwKICAgIFJlYWRUaW1lb3V0RXJyb3IsCiAgICBTU0xFcnJvciwKICAgIFRpbWVvdXRFcnJvciwKICAgIEluc2VjdXJlUmVxdWVzdFdhcm5pbmcsCiAgICBOZXdDb25uZWN0aW9uRXJyb3IsCikKZnJvbSAucGFja2FnZXMuc3NsX21hdGNoX2hvc3RuYW1lIGltcG9ydCBDZXJ0aWZpY2F0ZUVycm9yCmZyb20gLnBhY2thZ2VzIGltcG9ydCBzaXgKZnJvbSAucGFja2FnZXMuc2l4Lm1vdmVzIGltcG9ydCBxdWV1ZQpmcm9tIC5jb25uZWN0aW9uIGltcG9ydCAoCiAgICBwb3J0X2J5X3NjaGVtZSwKICAgIER1bW15Q29ubmVjdGlvbiwKICAgIEhUVFBDb25uZWN0aW9uLCBIVFRQU0Nvbm5lY3Rpb24sIFZlcmlmaWVkSFRUUFNDb25uZWN0aW9uLAogICAgSFRUUEV4Y2VwdGlvbiwgQmFzZVNTTEVycm9yLAopCmZyb20gLnJlcXVlc3QgaW1wb3J0IFJlcXVlc3RNZXRob2RzCmZyb20gLnJlc3BvbnNlIGltcG9ydCBIVFRQUmVzcG9uc2UKCmZyb20gLnV0aWwuY29ubmVjdGlvbiBpbXBvcnQgaXNfY29ubmVjdGlvbl9kcm9wcGVkCmZyb20gLnV0aWwucmVxdWVzdCBpbXBvcnQgc2V0X2ZpbGVfcG9zaXRpb24KZnJvbSAudXRpbC5yZXNwb25zZSBpbXBvcnQgYXNzZXJ0X2hlYWRlcl9wYXJzaW5nCmZyb20gLnV0aWwucmV0cnkgaW1wb3J0IFJldHJ5CmZyb20gLnV0aWwudGltZW91dCBpbXBvcnQgVGltZW91dApmcm9tIC51dGlsLnVybCBpbXBvcnQgZ2V0X2hvc3QsIFVybAoKCmlmIHNpeC5QWTI6CiAgICAjIFF1ZXVlIGlzIGltcG9ydGVkIGZvciBzaWRlIGVmZmVjdHMgb24gTVMgV2luZG93cwogICAgaW1wb3J0IFF1ZXVlIGFzIF91bnVzZWRfbW9kdWxlX1F1ZXVlICAjIG5vcWE6IEY0MDEKCnhyYW5nZSA9IHNpeC5tb3Zlcy54cmFuZ2UKCmxvZyA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKX0RlZmF1bHQgPSBvYmplY3QoKQoKCiMgUG9vbCBvYmplY3RzCmNsYXNzIENvbm5lY3Rpb25Qb29sKG9iamVjdCk6CiAgICAiIiIKICAgIEJhc2UgY2xhc3MgZm9yIGFsbCBjb25uZWN0aW9uIHBvb2xzLCBzdWNoIGFzCiAgICA6Y2xhc3M6YC5IVFRQQ29ubmVjdGlvblBvb2xgIGFuZCA6Y2xhc3M6YC5IVFRQU0Nvbm5lY3Rpb25Qb29sYC4KICAgICIiIgoKICAgIHNjaGVtZSA9IE5vbmUKICAgIFF1ZXVlQ2xzID0gcXVldWUuTGlmb1F1ZXVlCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3QsIHBvcnQ9Tm9uZSk6CiAgICAgICAgaWYgbm90IGhvc3Q6CiAgICAgICAgICAgIHJhaXNlIExvY2F0aW9uVmFsdWVFcnJvcigiTm8gaG9zdCBzcGVjaWZpZWQuIikKCiAgICAgICAgc2VsZi5ob3N0ID0gX2lwdjZfaG9zdChob3N0KS5sb3dlcigpCiAgICAgICAgc2VsZi5fcHJveHlfaG9zdCA9IGhvc3QubG93ZXIoKQogICAgICAgIHNlbGYucG9ydCA9IHBvcnQKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gJyVzKGhvc3Q9JXIsIHBvcnQ9JXIpJyAlICh0eXBlKHNlbGYpLl9fbmFtZV9fLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaG9zdCwgc2VsZi5wb3J0KQoKICAgIGRlZiBfX2VudGVyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgX19leGl0X18oc2VsZiwgZXhjX3R5cGUsIGV4Y192YWwsIGV4Y190Yik6CiAgICAgICAgc2VsZi5jbG9zZSgpCiAgICAgICAgIyBSZXR1cm4gRmFsc2UgdG8gcmUtcmFpc2UgYW55IHBvdGVudGlhbCBleGNlcHRpb25zCiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZGVmIGNsb3NlKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIENsb3NlIGFsbCBwb29sZWQgY29ubmVjdGlvbnMgYW5kIGRpc2FibGUgdGhlIHBvb2wuCiAgICAgICAgIiIiCiAgICAgICAgcGFzcwoKCiMgVGhpcyBpcyB0YWtlbiBmcm9tIGh0dHA6Ly9oZy5weXRob24ub3JnL2NweXRob24vZmlsZS83YWFiYTcyMWViYzAvTGliL3NvY2tldC5weSNsMjUyCl9ibG9ja2luZ19lcnJub3MgPSBzZXQoW2Vycm5vLkVBR0FJTiwgZXJybm8uRVdPVUxEQkxPQ0tdKQoKCmNsYXNzIEhUVFBDb25uZWN0aW9uUG9vbChDb25uZWN0aW9uUG9vbCwgUmVxdWVzdE1ldGhvZHMpOgogICAgIiIiCiAgICBUaHJlYWQtc2FmZSBjb25uZWN0aW9uIHBvb2wgZm9yIG9uZSBob3N0LgoKICAgIDpwYXJhbSBob3N0OgogICAgICAgIEhvc3QgdXNlZCBmb3IgdGhpcyBIVFRQIENvbm5lY3Rpb24gKGUuZy4gImxvY2FsaG9zdCIpLCBwYXNzZWQgaW50bwogICAgICAgIDpjbGFzczpgaHR0cGxpYi5IVFRQQ29ubmVjdGlvbmAuCgogICAgOnBhcmFtIHBvcnQ6CiAgICAgICAgUG9ydCB1c2VkIGZvciB0aGlzIEhUVFAgQ29ubmVjdGlvbiAoTm9uZSBpcyBlcXVpdmFsZW50IHRvIDgwKSwgcGFzc2VkCiAgICAgICAgaW50byA6Y2xhc3M6YGh0dHBsaWIuSFRUUENvbm5lY3Rpb25gLgoKICAgIDpwYXJhbSBzdHJpY3Q6CiAgICAgICAgQ2F1c2VzIEJhZFN0YXR1c0xpbmUgdG8gYmUgcmFpc2VkIGlmIHRoZSBzdGF0dXMgbGluZSBjYW4ndCBiZSBwYXJzZWQKICAgICAgICBhcyBhIHZhbGlkIEhUVFAvMS4wIG9yIDEuMSBzdGF0dXMgbGluZSwgcGFzc2VkIGludG8KICAgICAgICA6Y2xhc3M6YGh0dHBsaWIuSFRUUENvbm5lY3Rpb25gLgoKICAgICAgICAuLiBub3RlOjoKICAgICAgICAgICBPbmx5IHdvcmtzIGluIFB5dGhvbiAyLiBUaGlzIHBhcmFtZXRlciBpcyBpZ25vcmVkIGluIFB5dGhvbiAzLgoKICAgIDpwYXJhbSB0aW1lb3V0OgogICAgICAgIFNvY2tldCB0aW1lb3V0IGluIHNlY29uZHMgZm9yIGVhY2ggaW5kaXZpZHVhbCBjb25uZWN0aW9uLiBUaGlzIGNhbgogICAgICAgIGJlIGEgZmxvYXQgb3IgaW50ZWdlciwgd2hpY2ggc2V0cyB0aGUgdGltZW91dCBmb3IgdGhlIEhUVFAgcmVxdWVzdCwKICAgICAgICBvciBhbiBpbnN0YW5jZSBvZiA6Y2xhc3M6YHVybGxpYjMudXRpbC5UaW1lb3V0YCB3aGljaCBnaXZlcyB5b3UgbW9yZQogICAgICAgIGZpbmUtZ3JhaW5lZCBjb250cm9sIG92ZXIgcmVxdWVzdCB0aW1lb3V0cy4gQWZ0ZXIgdGhlIGNvbnN0cnVjdG9yIGhhcwogICAgICAgIGJlZW4gcGFyc2VkLCB0aGlzIGlzIGFsd2F5cyBhIGB1cmxsaWIzLnV0aWwuVGltZW91dGAgb2JqZWN0LgoKICAgIDpwYXJhbSBtYXhzaXplOgogICAgICAgIE51bWJlciBvZiBjb25uZWN0aW9ucyB0byBzYXZlIHRoYXQgY2FuIGJlIHJldXNlZC4gTW9yZSB0aGFuIDEgaXMgdXNlZnVsCiAgICAgICAgaW4gbXVsdGl0aHJlYWRlZCBzaXR1YXRpb25zLiBJZiBgYGJsb2NrYGAgaXMgc2V0IHRvIEZhbHNlLCBtb3JlCiAgICAgICAgY29ubmVjdGlvbnMgd2lsbCBiZSBjcmVhdGVkIGJ1dCB0aGV5IHdpbGwgbm90IGJlIHNhdmVkIG9uY2UgdGhleSd2ZQogICAgICAgIGJlZW4gdXNlZC4KCiAgICA6cGFyYW0gYmxvY2s6CiAgICAgICAgSWYgc2V0IHRvIFRydWUsIG5vIG1vcmUgdGhhbiBgYG1heHNpemVgYCBjb25uZWN0aW9ucyB3aWxsIGJlIHVzZWQgYXQKICAgICAgICBhIHRpbWUuIFdoZW4gbm8gZnJlZSBjb25uZWN0aW9ucyBhcmUgYXZhaWxhYmxlLCB0aGUgY2FsbCB3aWxsIGJsb2NrCiAgICAgICAgdW50aWwgYSBjb25uZWN0aW9uIGhhcyBiZWVuIHJlbGVhc2VkLiBUaGlzIGlzIGEgdXNlZnVsIHNpZGUgZWZmZWN0IGZvcgogICAgICAgIHBhcnRpY3VsYXIgbXVsdGl0aHJlYWRlZCBzaXR1YXRpb25zIHdoZXJlIG9uZSBkb2VzIG5vdCB3YW50IHRvIHVzZSBtb3JlCiAgICAgICAgdGhhbiBtYXhzaXplIGNvbm5lY3Rpb25zIHBlciBob3N0IHRvIHByZXZlbnQgZmxvb2RpbmcuCgogICAgOnBhcmFtIGhlYWRlcnM6CiAgICAgICAgSGVhZGVycyB0byBpbmNsdWRlIHdpdGggYWxsIHJlcXVlc3RzLCB1bmxlc3Mgb3RoZXIgaGVhZGVycyBhcmUgZ2l2ZW4KICAgICAgICBleHBsaWNpdGx5LgoKICAgIDpwYXJhbSByZXRyaWVzOgogICAgICAgIFJldHJ5IGNvbmZpZ3VyYXRpb24gdG8gdXNlIGJ5IGRlZmF1bHQgd2l0aCByZXF1ZXN0cyBpbiB0aGlzIHBvb2wuCgogICAgOnBhcmFtIF9wcm94eToKICAgICAgICBQYXJzZWQgcHJveHkgVVJMLCBzaG91bGQgbm90IGJlIHVzZWQgZGlyZWN0bHksIGluc3RlYWQsIHNlZQogICAgICAgIDpjbGFzczpgdXJsbGliMy5jb25uZWN0aW9ucG9vbC5Qcm94eU1hbmFnZXJgIgoKICAgIDpwYXJhbSBfcHJveHlfaGVhZGVyczoKICAgICAgICBBIGRpY3Rpb25hcnkgd2l0aCBwcm94eSBoZWFkZXJzLCBzaG91bGQgbm90IGJlIHVzZWQgZGlyZWN0bHksCiAgICAgICAgaW5zdGVhZCwgc2VlIDpjbGFzczpgdXJsbGliMy5jb25uZWN0aW9ucG9vbC5Qcm94eU1hbmFnZXJgIgoKICAgIDpwYXJhbSBcXCoqY29ubl9rdzoKICAgICAgICBBZGRpdGlvbmFsIHBhcmFtZXRlcnMgYXJlIHVzZWQgdG8gY3JlYXRlIGZyZXNoIDpjbGFzczpgdXJsbGliMy5jb25uZWN0aW9uLkhUVFBDb25uZWN0aW9uYCwKICAgICAgICA6Y2xhc3M6YHVybGxpYjMuY29ubmVjdGlvbi5IVFRQU0Nvbm5lY3Rpb25gIGluc3RhbmNlcy4KICAgICIiIgoKICAgIHNjaGVtZSA9ICdodHRwJwogICAgQ29ubmVjdGlvbkNscyA9IEhUVFBDb25uZWN0aW9uCiAgICBSZXNwb25zZUNscyA9IEhUVFBSZXNwb25zZQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0LCBwb3J0PU5vbmUsIHN0cmljdD1GYWxzZSwKICAgICAgICAgICAgICAgICB0aW1lb3V0PVRpbWVvdXQuREVGQVVMVF9USU1FT1VULCBtYXhzaXplPTEsIGJsb2NrPUZhbHNlLAogICAgICAgICAgICAgICAgIGhlYWRlcnM9Tm9uZSwgcmV0cmllcz1Ob25lLAogICAgICAgICAgICAgICAgIF9wcm94eT1Ob25lLCBfcHJveHlfaGVhZGVycz1Ob25lLAogICAgICAgICAgICAgICAgICoqY29ubl9rdyk6CiAgICAgICAgQ29ubmVjdGlvblBvb2wuX19pbml0X18oc2VsZiwgaG9zdCwgcG9ydCkKICAgICAgICBSZXF1ZXN0TWV0aG9kcy5fX2luaXRfXyhzZWxmLCBoZWFkZXJzKQoKICAgICAgICBzZWxmLnN0cmljdCA9IHN0cmljdAoKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh0aW1lb3V0LCBUaW1lb3V0KToKICAgICAgICAgICAgdGltZW91dCA9IFRpbWVvdXQuZnJvbV9mbG9hdCh0aW1lb3V0KQoKICAgICAgICBpZiByZXRyaWVzIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHJpZXMgPSBSZXRyeS5ERUZBVUxUCgogICAgICAgIHNlbGYudGltZW91dCA9IHRpbWVvdXQKICAgICAgICBzZWxmLnJldHJpZXMgPSByZXRyaWVzCgogICAgICAgIHNlbGYucG9vbCA9IHNlbGYuUXVldWVDbHMobWF4c2l6ZSkKICAgICAgICBzZWxmLmJsb2NrID0gYmxvY2sKCiAgICAgICAgc2VsZi5wcm94eSA9IF9wcm94eQogICAgICAgIHNlbGYucHJveHlfaGVhZGVycyA9IF9wcm94eV9oZWFkZXJzIG9yIHt9CgogICAgICAgICMgRmlsbCB0aGUgcXVldWUgdXAgc28gdGhhdCBkb2luZyBnZXQoKSBvbiBpdCB3aWxsIGJsb2NrIHByb3Blcmx5CiAgICAgICAgZm9yIF8gaW4geHJhbmdlKG1heHNpemUpOgogICAgICAgICAgICBzZWxmLnBvb2wucHV0KE5vbmUpCgogICAgICAgICMgVGhlc2UgYXJlIG1vc3RseSBmb3IgdGVzdGluZyBhbmQgZGVidWdnaW5nIHB1cnBvc2VzLgogICAgICAgIHNlbGYubnVtX2Nvbm5lY3Rpb25zID0gMAogICAgICAgIHNlbGYubnVtX3JlcXVlc3RzID0gMAogICAgICAgIHNlbGYuY29ubl9rdyA9IGNvbm5fa3cKCiAgICAgICAgaWYgc2VsZi5wcm94eToKICAgICAgICAgICAgIyBFbmFibGUgTmFnbGUncyBhbGdvcml0aG0gZm9yIHByb3hpZXMsIHRvIGF2b2lkIHBhY2tldCBmcmFnbWVudGF0aW9uLgogICAgICAgICAgICAjIFdlIGNhbm5vdCBrbm93IGlmIHRoZSB1c2VyIGhhcyBhZGRlZCBkZWZhdWx0IHNvY2tldCBvcHRpb25zLCBzbyB3ZSBjYW5ub3QgcmVwbGFjZSB0aGUKICAgICAgICAgICAgIyBsaXN0LgogICAgICAgICAgICBzZWxmLmNvbm5fa3cuc2V0ZGVmYXVsdCgnc29ja2V0X29wdGlvbnMnLCBbXSkKCiAgICBkZWYgX25ld19jb25uKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBhIGZyZXNoIDpjbGFzczpgSFRUUENvbm5lY3Rpb25gLgogICAgICAgICIiIgogICAgICAgIHNlbGYubnVtX2Nvbm5lY3Rpb25zICs9IDEKICAgICAgICBsb2cuZGVidWcoIlN0YXJ0aW5nIG5ldyBIVFRQIGNvbm5lY3Rpb24gKCVkKTogJXMiLAogICAgICAgICAgICAgICAgICBzZWxmLm51bV9jb25uZWN0aW9ucywgc2VsZi5ob3N0KQoKICAgICAgICBjb25uID0gc2VsZi5Db25uZWN0aW9uQ2xzKGhvc3Q9c2VsZi5ob3N0LCBwb3J0PXNlbGYucG9ydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ9c2VsZi50aW1lb3V0LmNvbm5lY3RfdGltZW91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmljdD1zZWxmLnN0cmljdCwgKipzZWxmLmNvbm5fa3cpCiAgICAgICAgcmV0dXJuIGNvbm4KCiAgICBkZWYgX2dldF9jb25uKHNlbGYsIHRpbWVvdXQ9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgR2V0IGEgY29ubmVjdGlvbi4gV2lsbCByZXR1cm4gYSBwb29sZWQgY29ubmVjdGlvbiBpZiBvbmUgaXMgYXZhaWxhYmxlLgoKICAgICAgICBJZiBubyBjb25uZWN0aW9ucyBhcmUgYXZhaWxhYmxlIGFuZCA6cHJvcDpgLmJsb2NrYCBpcyBgYEZhbHNlYGAsIHRoZW4gYQogICAgICAgIGZyZXNoIGNvbm5lY3Rpb24gaXMgcmV0dXJuZWQuCgogICAgICAgIDpwYXJhbSB0aW1lb3V0OgogICAgICAgICAgICBTZWNvbmRzIHRvIHdhaXQgYmVmb3JlIGdpdmluZyB1cCBhbmQgcmFpc2luZwogICAgICAgICAgICA6Y2xhc3M6YHVybGxpYjMuZXhjZXB0aW9ucy5FbXB0eVBvb2xFcnJvcmAgaWYgdGhlIHBvb2wgaXMgZW1wdHkgYW5kCiAgICAgICAgICAgIDpwcm9wOmAuYmxvY2tgIGlzIGBgVHJ1ZWBgLgogICAgICAgICIiIgogICAgICAgIGNvbm4gPSBOb25lCiAgICAgICAgdHJ5OgogICAgICAgICAgICBjb25uID0gc2VsZi5wb29sLmdldChibG9jaz1zZWxmLmJsb2NrLCB0aW1lb3V0PXRpbWVvdXQpCgogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjogICMgc2VsZi5wb29sIGlzIE5vbmUKICAgICAgICAgICAgcmFpc2UgQ2xvc2VkUG9vbEVycm9yKHNlbGYsICJQb29sIGlzIGNsb3NlZC4iKQoKICAgICAgICBleGNlcHQgcXVldWUuRW1wdHk6CiAgICAgICAgICAgIGlmIHNlbGYuYmxvY2s6CiAgICAgICAgICAgICAgICByYWlzZSBFbXB0eVBvb2xFcnJvcihzZWxmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBvb2wgcmVhY2hlZCBtYXhpbXVtIHNpemUgYW5kIG5vIG1vcmUgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbm5lY3Rpb25zIGFyZSBhbGxvd2VkLiIpCiAgICAgICAgICAgIHBhc3MgICMgT2ggd2VsbCwgd2UnbGwgY3JlYXRlIGEgbmV3IGNvbm5lY3Rpb24gdGhlbgoKICAgICAgICAjIElmIHRoaXMgaXMgYSBwZXJzaXN0ZW50IGNvbm5lY3Rpb24sIGNoZWNrIGlmIGl0IGdvdCBkaXNjb25uZWN0ZWQKICAgICAgICBpZiBjb25uIGFuZCBpc19jb25uZWN0aW9uX2Ryb3BwZWQoY29ubik6CiAgICAgICAgICAgIGxvZy5kZWJ1ZygiUmVzZXR0aW5nIGRyb3BwZWQgY29ubmVjdGlvbjogJXMiLCBzZWxmLmhvc3QpCiAgICAgICAgICAgIGNvbm4uY2xvc2UoKQogICAgICAgICAgICBpZiBnZXRhdHRyKGNvbm4sICdhdXRvX29wZW4nLCAxKSA9PSAwOgogICAgICAgICAgICAgICAgIyBUaGlzIGlzIGEgcHJveGllZCBjb25uZWN0aW9uIHRoYXQgaGFzIGJlZW4gbXV0YXRlZCBieQogICAgICAgICAgICAgICAgIyBodHRwbGliLl90dW5uZWwoKSBhbmQgY2Fubm90IGJlIHJldXNlZCAoc2luY2UgaXQgd291bGQKICAgICAgICAgICAgICAgICMgYXR0ZW1wdCB0byBieXBhc3MgdGhlIHByb3h5KQogICAgICAgICAgICAgICAgY29ubiA9IE5vbmUKCiAgICAgICAgcmV0dXJuIGNvbm4gb3Igc2VsZi5fbmV3X2Nvbm4oKQoKICAgIGRlZiBfcHV0X2Nvbm4oc2VsZiwgY29ubik6CiAgICAgICAgIiIiCiAgICAgICAgUHV0IGEgY29ubmVjdGlvbiBiYWNrIGludG8gdGhlIHBvb2wuCgogICAgICAgIDpwYXJhbSBjb25uOgogICAgICAgICAgICBDb25uZWN0aW9uIG9iamVjdCBmb3IgdGhlIGN1cnJlbnQgaG9zdCBhbmQgcG9ydCBhcyByZXR1cm5lZCBieQogICAgICAgICAgICA6bWV0aDpgLl9uZXdfY29ubmAgb3IgOm1ldGg6YC5fZ2V0X2Nvbm5gLgoKICAgICAgICBJZiB0aGUgcG9vbCBpcyBhbHJlYWR5IGZ1bGwsIHRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZCBhbmQgZGlzY2FyZGVkCiAgICAgICAgYmVjYXVzZSB3ZSBleGNlZWRlZCBtYXhzaXplLiBJZiBjb25uZWN0aW9ucyBhcmUgZGlzY2FyZGVkIGZyZXF1ZW50bHksCiAgICAgICAgdGhlbiBtYXhzaXplIHNob3VsZCBiZSBpbmNyZWFzZWQuCgogICAgICAgIElmIHRoZSBwb29sIGlzIGNsb3NlZCwgdGhlbiB0aGUgY29ubmVjdGlvbiB3aWxsIGJlIGNsb3NlZCBhbmQgZGlzY2FyZGVkLgogICAgICAgICIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5wb29sLnB1dChjb25uLCBibG9jaz1GYWxzZSkKICAgICAgICAgICAgcmV0dXJuICAjIEV2ZXJ5dGhpbmcgaXMgZGFuZHksIGRvbmUuCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICAjIHNlbGYucG9vbCBpcyBOb25lLgogICAgICAgICAgICBwYXNzCiAgICAgICAgZXhjZXB0IHF1ZXVlLkZ1bGw6CiAgICAgICAgICAgICMgVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIGlmIHNlbGYuYmxvY2sgPT0gVHJ1ZQogICAgICAgICAgICBsb2cud2FybmluZygKICAgICAgICAgICAgICAgICJDb25uZWN0aW9uIHBvb2wgaXMgZnVsbCwgZGlzY2FyZGluZyBjb25uZWN0aW9uOiAlcyIsCiAgICAgICAgICAgICAgICBzZWxmLmhvc3QpCgogICAgICAgICMgQ29ubmVjdGlvbiBuZXZlciBnb3QgcHV0IGJhY2sgaW50byB0aGUgcG9vbCwgY2xvc2UgaXQuCiAgICAgICAgaWYgY29ubjoKICAgICAgICAgICAgY29ubi5jbG9zZSgpCgogICAgZGVmIF92YWxpZGF0ZV9jb25uKHNlbGYsIGNvbm4pOgogICAgICAgICIiIgogICAgICAgIENhbGxlZCByaWdodCBiZWZvcmUgYSByZXF1ZXN0IGlzIG1hZGUsIGFmdGVyIHRoZSBzb2NrZXQgaXMgY3JlYXRlZC4KICAgICAgICAiIiIKICAgICAgICBwYXNzCgogICAgZGVmIF9wcmVwYXJlX3Byb3h5KHNlbGYsIGNvbm4pOgogICAgICAgICMgTm90aGluZyB0byBkbyBmb3IgSFRUUCBjb25uZWN0aW9ucy4KICAgICAgICBwYXNzCgogICAgZGVmIF9nZXRfdGltZW91dChzZWxmLCB0aW1lb3V0KToKICAgICAgICAiIiIgSGVscGVyIHRoYXQgYWx3YXlzIHJldHVybnMgYSA6Y2xhc3M6YHVybGxpYjMudXRpbC5UaW1lb3V0YCAiIiIKICAgICAgICBpZiB0aW1lb3V0IGlzIF9EZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gc2VsZi50aW1lb3V0LmNsb25lKCkKCiAgICAgICAgaWYgaXNpbnN0YW5jZSh0aW1lb3V0LCBUaW1lb3V0KToKICAgICAgICAgICAgcmV0dXJuIHRpbWVvdXQuY2xvbmUoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgVXNlciBwYXNzZWQgdXMgYW4gaW50L2Zsb2F0LiBUaGlzIGlzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwKICAgICAgICAgICAgIyBjYW4gYmUgcmVtb3ZlZCBsYXRlcgogICAgICAgICAgICByZXR1cm4gVGltZW91dC5mcm9tX2Zsb2F0KHRpbWVvdXQpCgogICAgZGVmIF9yYWlzZV90aW1lb3V0KHNlbGYsIGVyciwgdXJsLCB0aW1lb3V0X3ZhbHVlKToKICAgICAgICAiIiJJcyB0aGUgZXJyb3IgYWN0dWFsbHkgYSB0aW1lb3V0PyBXaWxsIHJhaXNlIGEgUmVhZFRpbWVvdXQgb3IgcGFzcyIiIgoKICAgICAgICBpZiBpc2luc3RhbmNlKGVyciwgU29ja2V0VGltZW91dCk6CiAgICAgICAgICAgIHJhaXNlIFJlYWRUaW1lb3V0RXJyb3Ioc2VsZiwgdXJsLCAiUmVhZCB0aW1lZCBvdXQuIChyZWFkIHRpbWVvdXQ9JXMpIiAlIHRpbWVvdXRfdmFsdWUpCgogICAgICAgICMgU2VlIHRoZSBhYm92ZSBjb21tZW50IGFib3V0IEVBR0FJTiBpbiBQeXRob24gMy4gSW4gUHl0aG9uIDIgd2UgaGF2ZQogICAgICAgICMgdG8gc3BlY2lmaWNhbGx5IGNhdGNoIGl0IGFuZCB0aHJvdyB0aGUgdGltZW91dCBlcnJvcgogICAgICAgIGlmIGhhc2F0dHIoZXJyLCAnZXJybm8nKSBhbmQgZXJyLmVycm5vIGluIF9ibG9ja2luZ19lcnJub3M6CiAgICAgICAgICAgIHJhaXNlIFJlYWRUaW1lb3V0RXJyb3Ioc2VsZiwgdXJsLCAiUmVhZCB0aW1lZCBvdXQuIChyZWFkIHRpbWVvdXQ9JXMpIiAlIHRpbWVvdXRfdmFsdWUpCgogICAgICAgICMgQ2F0Y2ggcG9zc2libGUgcmVhZCB0aW1lb3V0cyB0aHJvd24gYXMgU1NMIGVycm9ycy4gSWYgbm90IHRoZQogICAgICAgICMgY2FzZSwgcmV0aHJvdyB0aGUgb3JpZ2luYWwuIFdlIG5lZWQgdG8gZG8gdGhpcyBiZWNhdXNlIG9mOgogICAgICAgICMgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTEwMjcyCiAgICAgICAgaWYgJ3RpbWVkIG91dCcgaW4gc3RyKGVycikgb3IgJ2RpZCBub3QgY29tcGxldGUgKHJlYWQpJyBpbiBzdHIoZXJyKTogICMgUHl0aG9uIDIuNgogICAgICAgICAgICByYWlzZSBSZWFkVGltZW91dEVycm9yKHNlbGYsIHVybCwgIlJlYWQgdGltZWQgb3V0LiAocmVhZCB0aW1lb3V0PSVzKSIgJSB0aW1lb3V0X3ZhbHVlKQoKICAgIGRlZiBfbWFrZV9yZXF1ZXN0KHNlbGYsIGNvbm4sIG1ldGhvZCwgdXJsLCB0aW1lb3V0PV9EZWZhdWx0LCBjaHVua2VkPUZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgKipodHRwbGliX3JlcXVlc3Rfa3cpOgogICAgICAgICIiIgogICAgICAgIFBlcmZvcm0gYSByZXF1ZXN0IG9uIGEgZ2l2ZW4gdXJsbGliIGNvbm5lY3Rpb24gb2JqZWN0IHRha2VuIGZyb20gb3VyCiAgICAgICAgcG9vbC4KCiAgICAgICAgOnBhcmFtIGNvbm46CiAgICAgICAgICAgIGEgY29ubmVjdGlvbiBmcm9tIG9uZSBvZiBvdXIgY29ubmVjdGlvbiBwb29scwoKICAgICAgICA6cGFyYW0gdGltZW91dDoKICAgICAgICAgICAgU29ja2V0IHRpbWVvdXQgaW4gc2Vjb25kcyBmb3IgdGhlIHJlcXVlc3QuIFRoaXMgY2FuIGJlIGEKICAgICAgICAgICAgZmxvYXQgb3IgaW50ZWdlciwgd2hpY2ggd2lsbCBzZXQgdGhlIHNhbWUgdGltZW91dCB2YWx1ZSBmb3IKICAgICAgICAgICAgdGhlIHNvY2tldCBjb25uZWN0IGFuZCB0aGUgc29ja2V0IHJlYWQsIG9yIGFuIGluc3RhbmNlIG9mCiAgICAgICAgICAgIDpjbGFzczpgdXJsbGliMy51dGlsLlRpbWVvdXRgLCB3aGljaCBnaXZlcyB5b3UgbW9yZSBmaW5lLWdyYWluZWQKICAgICAgICAgICAgY29udHJvbCBvdmVyIHlvdXIgdGltZW91dHMuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5udW1fcmVxdWVzdHMgKz0gMQoKICAgICAgICB0aW1lb3V0X29iaiA9IHNlbGYuX2dldF90aW1lb3V0KHRpbWVvdXQpCiAgICAgICAgdGltZW91dF9vYmouc3RhcnRfY29ubmVjdCgpCiAgICAgICAgY29ubi50aW1lb3V0ID0gdGltZW91dF9vYmouY29ubmVjdF90aW1lb3V0CgogICAgICAgICMgVHJpZ2dlciBhbnkgZXh0cmEgdmFsaWRhdGlvbiB3ZSBuZWVkIHRvIGRvLgogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5fdmFsaWRhdGVfY29ubihjb25uKQogICAgICAgIGV4Y2VwdCAoU29ja2V0VGltZW91dCwgQmFzZVNTTEVycm9yKSBhcyBlOgogICAgICAgICAgICAjIFB5MiByYWlzZXMgdGhpcyBhcyBhIEJhc2VTU0xFcnJvciwgUHkzIHJhaXNlcyBpdCBhcyBzb2NrZXQgdGltZW91dC4KICAgICAgICAgICAgc2VsZi5fcmFpc2VfdGltZW91dChlcnI9ZSwgdXJsPXVybCwgdGltZW91dF92YWx1ZT1jb25uLnRpbWVvdXQpCiAgICAgICAgICAgIHJhaXNlCgogICAgICAgICMgY29ubi5yZXF1ZXN0KCkgY2FsbHMgaHR0cGxpYi4qLnJlcXVlc3QsIG5vdCB0aGUgbWV0aG9kIGluCiAgICAgICAgIyB1cmxsaWIzLnJlcXVlc3QuIEl0IGFsc28gY2FsbHMgbWFrZWZpbGUgKHJlY3YpIG9uIHRoZSBzb2NrZXQuCiAgICAgICAgaWYgY2h1bmtlZDoKICAgICAgICAgICAgY29ubi5yZXF1ZXN0X2NodW5rZWQobWV0aG9kLCB1cmwsICoqaHR0cGxpYl9yZXF1ZXN0X2t3KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGNvbm4ucmVxdWVzdChtZXRob2QsIHVybCwgKipodHRwbGliX3JlcXVlc3Rfa3cpCgogICAgICAgICMgUmVzZXQgdGhlIHRpbWVvdXQgZm9yIHRoZSByZWN2KCkgb24gdGhlIHNvY2tldAogICAgICAgIHJlYWRfdGltZW91dCA9IHRpbWVvdXRfb2JqLnJlYWRfdGltZW91dAoKICAgICAgICAjIEFwcCBFbmdpbmUgZG9lc24ndCBoYXZlIGEgc29jayBhdHRyCiAgICAgICAgaWYgZ2V0YXR0cihjb25uLCAnc29jaycsIE5vbmUpOgogICAgICAgICAgICAjIEluIFB5dGhvbiAzIHNvY2tldC5weSB3aWxsIGNhdGNoIEVBR0FJTiBhbmQgcmV0dXJuIE5vbmUgd2hlbiB5b3UKICAgICAgICAgICAgIyB0cnkgYW5kIHJlYWQgaW50byB0aGUgZmlsZSBwb2ludGVyIGNyZWF0ZWQgYnkgaHR0cC5jbGllbnQsIHdoaWNoCiAgICAgICAgICAgICMgaW5zdGVhZCByYWlzZXMgYSBCYWRTdGF0dXNMaW5lIGV4Y2VwdGlvbi4gSW5zdGVhZCBvZiBjYXRjaGluZwogICAgICAgICAgICAjIHRoZSBleGNlcHRpb24gYW5kIGFzc3VtaW5nIGFsbCBCYWRTdGF0dXNMaW5lIGV4Y2VwdGlvbnMgYXJlIHJlYWQKICAgICAgICAgICAgIyB0aW1lb3V0cywgY2hlY2sgZm9yIGEgemVybyB0aW1lb3V0IGJlZm9yZSBtYWtpbmcgdGhlIHJlcXVlc3QuCiAgICAgICAgICAgIGlmIHJlYWRfdGltZW91dCA9PSAwOgogICAgICAgICAgICAgICAgcmFpc2UgUmVhZFRpbWVvdXRFcnJvcigKICAgICAgICAgICAgICAgICAgICBzZWxmLCB1cmwsICJSZWFkIHRpbWVkIG91dC4gKHJlYWQgdGltZW91dD0lcykiICUgcmVhZF90aW1lb3V0KQogICAgICAgICAgICBpZiByZWFkX3RpbWVvdXQgaXMgVGltZW91dC5ERUZBVUxUX1RJTUVPVVQ6CiAgICAgICAgICAgICAgICBjb25uLnNvY2suc2V0dGltZW91dChzb2NrZXQuZ2V0ZGVmYXVsdHRpbWVvdXQoKSkKICAgICAgICAgICAgZWxzZTogICMgTm9uZSBvciBhIHZhbHVlCiAgICAgICAgICAgICAgICBjb25uLnNvY2suc2V0dGltZW91dChyZWFkX3RpbWVvdXQpCgogICAgICAgICMgUmVjZWl2ZSB0aGUgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyCiAgICAgICAgdHJ5OgogICAgICAgICAgICB0cnk6ICAjIFB5dGhvbiAyLjcsIHVzZSBidWZmZXJpbmcgb2YgSFRUUCByZXNwb25zZXMKICAgICAgICAgICAgICAgIGh0dHBsaWJfcmVzcG9uc2UgPSBjb25uLmdldHJlc3BvbnNlKGJ1ZmZlcmluZz1UcnVlKQogICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOiAgIyBQeXRob24gMi42IGFuZCBvbGRlciwgUHl0aG9uIDMKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBodHRwbGliX3Jlc3BvbnNlID0gY29ubi5nZXRyZXNwb25zZSgpCiAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgICAgICAgICAgIyBSZW1vdmUgdGhlIFR5cGVFcnJvciBmcm9tIHRoZSBleGNlcHRpb24gY2hhaW4gaW4gUHl0aG9uIDM7CiAgICAgICAgICAgICAgICAgICAgIyBvdGhlcndpc2UgaXQgbG9va3MgbGlrZSBhIHByb2dyYW1taW5nIGVycm9yIHdhcyB0aGUgY2F1c2UuCiAgICAgICAgICAgICAgICAgICAgc2l4LnJhaXNlX2Zyb20oZSwgTm9uZSkKICAgICAgICBleGNlcHQgKFNvY2tldFRpbWVvdXQsIEJhc2VTU0xFcnJvciwgU29ja2V0RXJyb3IpIGFzIGU6CiAgICAgICAgICAgIHNlbGYuX3JhaXNlX3RpbWVvdXQoZXJyPWUsIHVybD11cmwsIHRpbWVvdXRfdmFsdWU9cmVhZF90aW1lb3V0KQogICAgICAgICAgICByYWlzZQoKICAgICAgICAjIEFwcEVuZ2luZSBkb2Vzbid0IGhhdmUgYSB2ZXJzaW9uIGF0dHIuCiAgICAgICAgaHR0cF92ZXJzaW9uID0gZ2V0YXR0cihjb25uLCAnX2h0dHBfdnNuX3N0cicsICdIVFRQLz8nKQogICAgICAgIGxvZy5kZWJ1ZygiJXM6Ly8lczolcyBcIiVzICVzICVzXCIgJXMgJXMiLCBzZWxmLnNjaGVtZSwgc2VsZi5ob3N0LCBzZWxmLnBvcnQsCiAgICAgICAgICAgICAgICAgIG1ldGhvZCwgdXJsLCBodHRwX3ZlcnNpb24sIGh0dHBsaWJfcmVzcG9uc2Uuc3RhdHVzLAogICAgICAgICAgICAgICAgICBodHRwbGliX3Jlc3BvbnNlLmxlbmd0aCkKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBhc3NlcnRfaGVhZGVyX3BhcnNpbmcoaHR0cGxpYl9yZXNwb25zZS5tc2cpCiAgICAgICAgZXhjZXB0IChIZWFkZXJQYXJzaW5nRXJyb3IsIFR5cGVFcnJvcikgYXMgaHBlOiAgIyBQbGF0Zm9ybS1zcGVjaWZpYzogUHl0aG9uIDMKICAgICAgICAgICAgbG9nLndhcm5pbmcoCiAgICAgICAgICAgICAgICAnRmFpbGVkIHRvIHBhcnNlIGhlYWRlcnMgKHVybD0lcyk6ICVzJywKICAgICAgICAgICAgICAgIHNlbGYuX2Fic29sdXRlX3VybCh1cmwpLCBocGUsIGV4Y19pbmZvPVRydWUpCgogICAgICAgIHJldHVybiBodHRwbGliX3Jlc3BvbnNlCgogICAgZGVmIF9hYnNvbHV0ZV91cmwoc2VsZiwgcGF0aCk6CiAgICAgICAgcmV0dXJuIFVybChzY2hlbWU9c2VsZi5zY2hlbWUsIGhvc3Q9c2VsZi5ob3N0LCBwb3J0PXNlbGYucG9ydCwgcGF0aD1wYXRoKS51cmwKCiAgICBkZWYgY2xvc2Uoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgQ2xvc2UgYWxsIHBvb2xlZCBjb25uZWN0aW9ucyBhbmQgZGlzYWJsZSB0aGUgcG9vbC4KICAgICAgICAiIiIKICAgICAgICAjIERpc2FibGUgYWNjZXNzIHRvIHRoZSBwb29sCiAgICAgICAgb2xkX3Bvb2wsIHNlbGYucG9vbCA9IHNlbGYucG9vbCwgTm9uZQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgICAgICBjb25uID0gb2xkX3Bvb2wuZ2V0KGJsb2NrPUZhbHNlKQogICAgICAgICAgICAgICAgaWYgY29ubjoKICAgICAgICAgICAgICAgICAgICBjb25uLmNsb3NlKCkKCiAgICAgICAgZXhjZXB0IHF1ZXVlLkVtcHR5OgogICAgICAgICAgICBwYXNzICAjIERvbmUuCgogICAgZGVmIGlzX3NhbWVfaG9zdChzZWxmLCB1cmwpOgogICAgICAgICIiIgogICAgICAgIENoZWNrIGlmIHRoZSBnaXZlbiBgYHVybGBgIGlzIGEgbWVtYmVyIG9mIHRoZSBzYW1lIGhvc3QgYXMgdGhpcwogICAgICAgIGNvbm5lY3Rpb24gcG9vbC4KICAgICAgICAiIiIKICAgICAgICBpZiB1cmwuc3RhcnRzd2l0aCgnLycpOgogICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICAgICAjIFRPRE86IEFkZCBvcHRpb25hbCBzdXBwb3J0IGZvciBzb2NrZXQuZ2V0aG9zdGJ5bmFtZSBjaGVja2luZy4KICAgICAgICBzY2hlbWUsIGhvc3QsIHBvcnQgPSBnZXRfaG9zdCh1cmwpCgogICAgICAgIGhvc3QgPSBfaXB2Nl9ob3N0KGhvc3QpLmxvd2VyKCkKCiAgICAgICAgIyBVc2UgZXhwbGljaXQgZGVmYXVsdCBwb3J0IGZvciBjb21wYXJpc29uIHdoZW4gbm9uZSBpcyBnaXZlbgogICAgICAgIGlmIHNlbGYucG9ydCBhbmQgbm90IHBvcnQ6CiAgICAgICAgICAgIHBvcnQgPSBwb3J0X2J5X3NjaGVtZS5nZXQoc2NoZW1lKQogICAgICAgIGVsaWYgbm90IHNlbGYucG9ydCBhbmQgcG9ydCA9PSBwb3J0X2J5X3NjaGVtZS5nZXQoc2NoZW1lKToKICAgICAgICAgICAgcG9ydCA9IE5vbmUKCiAgICAgICAgcmV0dXJuIChzY2hlbWUsIGhvc3QsIHBvcnQpID09IChzZWxmLnNjaGVtZSwgc2VsZi5ob3N0LCBzZWxmLnBvcnQpCgogICAgZGVmIHVybG9wZW4oc2VsZiwgbWV0aG9kLCB1cmwsIGJvZHk9Tm9uZSwgaGVhZGVycz1Ob25lLCByZXRyaWVzPU5vbmUsCiAgICAgICAgICAgICAgICByZWRpcmVjdD1UcnVlLCBhc3NlcnRfc2FtZV9ob3N0PVRydWUsIHRpbWVvdXQ9X0RlZmF1bHQsCiAgICAgICAgICAgICAgICBwb29sX3RpbWVvdXQ9Tm9uZSwgcmVsZWFzZV9jb25uPU5vbmUsIGNodW5rZWQ9RmFsc2UsCiAgICAgICAgICAgICAgICBib2R5X3Bvcz1Ob25lLCAqKnJlc3BvbnNlX2t3KToKICAgICAgICAiIiIKICAgICAgICBHZXQgYSBjb25uZWN0aW9uIGZyb20gdGhlIHBvb2wgYW5kIHBlcmZvcm0gYW4gSFRUUCByZXF1ZXN0LiBUaGlzIGlzIHRoZQogICAgICAgIGxvd2VzdCBsZXZlbCBjYWxsIGZvciBtYWtpbmcgYSByZXF1ZXN0LCBzbyB5b3UnbGwgbmVlZCB0byBzcGVjaWZ5IGFsbAogICAgICAgIHRoZSByYXcgZGV0YWlscy4KCiAgICAgICAgLi4gbm90ZTo6CgogICAgICAgICAgIE1vcmUgY29tbW9ubHksIGl0J3MgYXBwcm9wcmlhdGUgdG8gdXNlIGEgY29udmVuaWVuY2UgbWV0aG9kIHByb3ZpZGVkCiAgICAgICAgICAgYnkgOmNsYXNzOmAuUmVxdWVzdE1ldGhvZHNgLCBzdWNoIGFzIDptZXRoOmByZXF1ZXN0YC4KCiAgICAgICAgLi4gbm90ZTo6CgogICAgICAgICAgIGByZWxlYXNlX2Nvbm5gIHdpbGwgb25seSBiZWhhdmUgYXMgZXhwZWN0ZWQgaWYKICAgICAgICAgICBgcHJlbG9hZF9jb250ZW50PUZhbHNlYCBiZWNhdXNlIHdlIHdhbnQgdG8gbWFrZQogICAgICAgICAgIGBwcmVsb2FkX2NvbnRlbnQ9RmFsc2VgIHRoZSBkZWZhdWx0IGJlaGF2aW91ciBzb21lZGF5IHNvb24gd2l0aG91dAogICAgICAgICAgIGJyZWFraW5nIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgoKICAgICAgICA6cGFyYW0gbWV0aG9kOgogICAgICAgICAgICBIVFRQIHJlcXVlc3QgbWV0aG9kIChzdWNoIGFzIEdFVCwgUE9TVCwgUFVULCBldGMuKQoKICAgICAgICA6cGFyYW0gYm9keToKICAgICAgICAgICAgRGF0YSB0byBzZW5kIGluIHRoZSByZXF1ZXN0IGJvZHkgKHVzZWZ1bCBmb3IgY3JlYXRpbmcKICAgICAgICAgICAgUE9TVCByZXF1ZXN0cywgc2VlIEhUVFBDb25uZWN0aW9uUG9vbC5wb3N0X3VybCBmb3IKICAgICAgICAgICAgbW9yZSBjb252ZW5pZW5jZSkuCgogICAgICAgIDpwYXJhbSBoZWFkZXJzOgogICAgICAgICAgICBEaWN0aW9uYXJ5IG9mIGN1c3RvbSBoZWFkZXJzIHRvIHNlbmQsIHN1Y2ggYXMgVXNlci1BZ2VudCwKICAgICAgICAgICAgSWYtTm9uZS1NYXRjaCwgZXRjLiBJZiBOb25lLCBwb29sIGhlYWRlcnMgYXJlIHVzZWQuIElmIHByb3ZpZGVkLAogICAgICAgICAgICB0aGVzZSBoZWFkZXJzIGNvbXBsZXRlbHkgcmVwbGFjZSBhbnkgcG9vbC1zcGVjaWZpYyBoZWFkZXJzLgoKICAgICAgICA6cGFyYW0gcmV0cmllczoKICAgICAgICAgICAgQ29uZmlndXJlIHRoZSBudW1iZXIgb2YgcmV0cmllcyB0byBhbGxvdyBiZWZvcmUgcmFpc2luZyBhCiAgICAgICAgICAgIDpjbGFzczpgfnVybGxpYjMuZXhjZXB0aW9ucy5NYXhSZXRyeUVycm9yYCBleGNlcHRpb24uCgogICAgICAgICAgICBQYXNzIGBgTm9uZWBgIHRvIHJldHJ5IHVudGlsIHlvdSByZWNlaXZlIGEgcmVzcG9uc2UuIFBhc3MgYQogICAgICAgICAgICA6Y2xhc3M6YH51cmxsaWIzLnV0aWwucmV0cnkuUmV0cnlgIG9iamVjdCBmb3IgZmluZS1ncmFpbmVkIGNvbnRyb2wKICAgICAgICAgICAgb3ZlciBkaWZmZXJlbnQgdHlwZXMgb2YgcmV0cmllcy4KICAgICAgICAgICAgUGFzcyBhbiBpbnRlZ2VyIG51bWJlciB0byByZXRyeSBjb25uZWN0aW9uIGVycm9ycyB0aGF0IG1hbnkgdGltZXMsCiAgICAgICAgICAgIGJ1dCBubyBvdGhlciB0eXBlcyBvZiBlcnJvcnMuIFBhc3MgemVybyB0byBuZXZlciByZXRyeS4KCiAgICAgICAgICAgIElmIGBgRmFsc2VgYCwgdGhlbiByZXRyaWVzIGFyZSBkaXNhYmxlZCBhbmQgYW55IGV4Y2VwdGlvbiBpcyByYWlzZWQKICAgICAgICAgICAgaW1tZWRpYXRlbHkuIEFsc28sIGluc3RlYWQgb2YgcmFpc2luZyBhIE1heFJldHJ5RXJyb3Igb24gcmVkaXJlY3RzLAogICAgICAgICAgICB0aGUgcmVkaXJlY3QgcmVzcG9uc2Ugd2lsbCBiZSByZXR1cm5lZC4KCiAgICAgICAgOnR5cGUgcmV0cmllczogOmNsYXNzOmB+dXJsbGliMy51dGlsLnJldHJ5LlJldHJ5YCwgRmFsc2UsIG9yIGFuIGludC4KCiAgICAgICAgOnBhcmFtIHJlZGlyZWN0OgogICAgICAgICAgICBJZiBUcnVlLCBhdXRvbWF0aWNhbGx5IGhhbmRsZSByZWRpcmVjdHMgKHN0YXR1cyBjb2RlcyAzMDEsIDMwMiwKICAgICAgICAgICAgMzAzLCAzMDcsIDMwOCkuIEVhY2ggcmVkaXJlY3QgY291bnRzIGFzIGEgcmV0cnkuIERpc2FibGluZyByZXRyaWVzCiAgICAgICAgICAgIHdpbGwgZGlzYWJsZSByZWRpcmVjdCwgdG9vLgoKICAgICAgICA6cGFyYW0gYXNzZXJ0X3NhbWVfaG9zdDoKICAgICAgICAgICAgSWYgYGBUcnVlYGAsIHdpbGwgbWFrZSBzdXJlIHRoYXQgdGhlIGhvc3Qgb2YgdGhlIHBvb2wgcmVxdWVzdHMgaXMKICAgICAgICAgICAgY29uc2lzdGVudCBlbHNlIHdpbGwgcmFpc2UgSG9zdENoYW5nZWRFcnJvci4gV2hlbiBGYWxzZSwgeW91IGNhbgogICAgICAgICAgICB1c2UgdGhlIHBvb2wgb24gYW4gSFRUUCBwcm94eSBhbmQgcmVxdWVzdCBmb3JlaWduIGhvc3RzLgoKICAgICAgICA6cGFyYW0gdGltZW91dDoKICAgICAgICAgICAgSWYgc3BlY2lmaWVkLCBvdmVycmlkZXMgdGhlIGRlZmF1bHQgdGltZW91dCBmb3IgdGhpcyBvbmUKICAgICAgICAgICAgcmVxdWVzdC4gSXQgbWF5IGJlIGEgZmxvYXQgKGluIHNlY29uZHMpIG9yIGFuIGluc3RhbmNlIG9mCiAgICAgICAgICAgIDpjbGFzczpgdXJsbGliMy51dGlsLlRpbWVvdXRgLgoKICAgICAgICA6cGFyYW0gcG9vbF90aW1lb3V0OgogICAgICAgICAgICBJZiBzZXQgYW5kIHRoZSBwb29sIGlzIHNldCB0byBibG9jaz1UcnVlLCB0aGVuIHRoaXMgbWV0aG9kIHdpbGwKICAgICAgICAgICAgYmxvY2sgZm9yIGBgcG9vbF90aW1lb3V0YGAgc2Vjb25kcyBhbmQgcmFpc2UgRW1wdHlQb29sRXJyb3IgaWYgbm8KICAgICAgICAgICAgY29ubmVjdGlvbiBpcyBhdmFpbGFibGUgd2l0aGluIHRoZSB0aW1lIHBlcmlvZC4KCiAgICAgICAgOnBhcmFtIHJlbGVhc2VfY29ubjoKICAgICAgICAgICAgSWYgRmFsc2UsIHRoZW4gdGhlIHVybG9wZW4gY2FsbCB3aWxsIG5vdCByZWxlYXNlIHRoZSBjb25uZWN0aW9uCiAgICAgICAgICAgIGJhY2sgaW50byB0aGUgcG9vbCBvbmNlIGEgcmVzcG9uc2UgaXMgcmVjZWl2ZWQgKGJ1dCB3aWxsIHJlbGVhc2UgaWYKICAgICAgICAgICAgeW91IHJlYWQgdGhlIGVudGlyZSBjb250ZW50cyBvZiB0aGUgcmVzcG9uc2Ugc3VjaCBhcyB3aGVuCiAgICAgICAgICAgIGBwcmVsb2FkX2NvbnRlbnQ9VHJ1ZWApLiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3UncmUgbm90IHByZWxvYWRpbmcKICAgICAgICAgICAgdGhlIHJlc3BvbnNlJ3MgY29udGVudCBpbW1lZGlhdGVseS4gWW91IHdpbGwgbmVlZCB0byBjYWxsCiAgICAgICAgICAgIGBgci5yZWxlYXNlX2Nvbm4oKWBgIG9uIHRoZSByZXNwb25zZSBgYHJgYCB0byByZXR1cm4gdGhlIGNvbm5lY3Rpb24KICAgICAgICAgICAgYmFjayBpbnRvIHRoZSBwb29sLiBJZiBOb25lLCBpdCB0YWtlcyB0aGUgdmFsdWUgb2YKICAgICAgICAgICAgYGByZXNwb25zZV9rdy5nZXQoJ3ByZWxvYWRfY29udGVudCcsIFRydWUpYGAuCgogICAgICAgIDpwYXJhbSBjaHVua2VkOgogICAgICAgICAgICBJZiBUcnVlLCB1cmxsaWIzIHdpbGwgc2VuZCB0aGUgYm9keSB1c2luZyBjaHVua2VkIHRyYW5zZmVyCiAgICAgICAgICAgIGVuY29kaW5nLiBPdGhlcndpc2UsIHVybGxpYjMgd2lsbCBzZW5kIHRoZSBib2R5IHVzaW5nIHRoZSBzdGFuZGFyZAogICAgICAgICAgICBjb250ZW50LWxlbmd0aCBmb3JtLiBEZWZhdWx0cyB0byBGYWxzZS4KCiAgICAgICAgOnBhcmFtIGludCBib2R5X3BvczoKICAgICAgICAgICAgUG9zaXRpb24gdG8gc2VlayB0byBpbiBmaWxlLWxpa2UgYm9keSBpbiB0aGUgZXZlbnQgb2YgYSByZXRyeSBvcgogICAgICAgICAgICByZWRpcmVjdC4gVHlwaWNhbGx5IHRoaXMgd29uJ3QgbmVlZCB0byBiZSBzZXQgYmVjYXVzZSB1cmxsaWIzIHdpbGwKICAgICAgICAgICAgYXV0by1wb3B1bGF0ZSB0aGUgdmFsdWUgd2hlbiBuZWVkZWQuCgogICAgICAgIDpwYXJhbSBcXCoqcmVzcG9uc2Vfa3c6CiAgICAgICAgICAgIEFkZGl0aW9uYWwgcGFyYW1ldGVycyBhcmUgcGFzc2VkIHRvCiAgICAgICAgICAgIDptZXRoOmB1cmxsaWIzLnJlc3BvbnNlLkhUVFBSZXNwb25zZS5mcm9tX2h0dHBsaWJgCiAgICAgICAgIiIiCiAgICAgICAgaWYgaGVhZGVycyBpcyBOb25lOgogICAgICAgICAgICBoZWFkZXJzID0gc2VsZi5oZWFkZXJzCgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHJldHJpZXMsIFJldHJ5KToKICAgICAgICAgICAgcmV0cmllcyA9IFJldHJ5LmZyb21faW50KHJldHJpZXMsIHJlZGlyZWN0PXJlZGlyZWN0LCBkZWZhdWx0PXNlbGYucmV0cmllcykKCiAgICAgICAgaWYgcmVsZWFzZV9jb25uIGlzIE5vbmU6CiAgICAgICAgICAgIHJlbGVhc2VfY29ubiA9IHJlc3BvbnNlX2t3LmdldCgncHJlbG9hZF9jb250ZW50JywgVHJ1ZSkKCiAgICAgICAgIyBDaGVjayBob3N0CiAgICAgICAgaWYgYXNzZXJ0X3NhbWVfaG9zdCBhbmQgbm90IHNlbGYuaXNfc2FtZV9ob3N0KHVybCk6CiAgICAgICAgICAgIHJhaXNlIEhvc3RDaGFuZ2VkRXJyb3Ioc2VsZiwgdXJsLCByZXRyaWVzKQoKICAgICAgICBjb25uID0gTm9uZQoKICAgICAgICAjIFRyYWNrIHdoZXRoZXIgYGNvbm5gIG5lZWRzIHRvIGJlIHJlbGVhc2VkIGJlZm9yZQogICAgICAgICMgcmV0dXJuaW5nL3JhaXNpbmcvcmVjdXJzaW5nLiBVcGRhdGUgdGhpcyB2YXJpYWJsZSBpZiBuZWNlc3NhcnksIGFuZAogICAgICAgICMgbGVhdmUgYHJlbGVhc2VfY29ubmAgY29uc3RhbnQgdGhyb3VnaG91dCB0aGUgZnVuY3Rpb24uIFRoYXQgd2F5LCBpZgogICAgICAgICMgdGhlIGZ1bmN0aW9uIHJlY3Vyc2VzLCB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgYHJlbGVhc2VfY29ubmAgd2lsbCBiZQogICAgICAgICMgcGFzc2VkIGRvd24gaW50byB0aGUgcmVjdXJzaXZlIGNhbGwsIGFuZCBpdHMgdmFsdWUgd2lsbCBiZSByZXNwZWN0ZWQuCiAgICAgICAgIwogICAgICAgICMgU2VlIGlzc3VlICM2NTEgWzFdIGZvciBkZXRhaWxzLgogICAgICAgICMKICAgICAgICAjIFsxXSA8aHR0cHM6Ly9naXRodWIuY29tL3NoYXpvdy91cmxsaWIzL2lzc3Vlcy82NTE+CiAgICAgICAgcmVsZWFzZV90aGlzX2Nvbm4gPSByZWxlYXNlX2Nvbm4KCiAgICAgICAgIyBNZXJnZSB0aGUgcHJveHkgaGVhZGVycy4gT25seSBkbyB0aGlzIGluIEhUVFAuIFdlIGhhdmUgdG8gY29weSB0aGUKICAgICAgICAjIGhlYWRlcnMgZGljdCBzbyB3ZSBjYW4gc2FmZWx5IGNoYW5nZSBpdCB3aXRob3V0IHRob3NlIGNoYW5nZXMgYmVpbmcKICAgICAgICAjIHJlZmxlY3RlZCBpbiBhbnlvbmUgZWxzZSdzIGNvcHkuCiAgICAgICAgaWYgc2VsZi5zY2hlbWUgPT0gJ2h0dHAnOgogICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5jb3B5KCkKICAgICAgICAgICAgaGVhZGVycy51cGRhdGUoc2VsZi5wcm94eV9oZWFkZXJzKQoKICAgICAgICAjIE11c3Qga2VlcCB0aGUgZXhjZXB0aW9uIGJvdW5kIHRvIGEgc2VwYXJhdGUgdmFyaWFibGUgb3IgZWxzZSBQeXRob24gMwogICAgICAgICMgY29tcGxhaW5zIGFib3V0IFVuYm91bmRMb2NhbEVycm9yLgogICAgICAgIGVyciA9IE5vbmUKCiAgICAgICAgIyBLZWVwIHRyYWNrIG9mIHdoZXRoZXIgd2UgY2xlYW5seSBleGl0ZWQgdGhlIGV4Y2VwdCBibG9jay4gVGhpcwogICAgICAgICMgZW5zdXJlcyB3ZSBkbyBwcm9wZXIgY2xlYW51cCBpbiBmaW5hbGx5LgogICAgICAgIGNsZWFuX2V4aXQgPSBGYWxzZQoKICAgICAgICAjIFJld2luZCBib2R5IHBvc2l0aW9uLCBpZiBuZWVkZWQuIFJlY29yZCBjdXJyZW50IHBvc2l0aW9uCiAgICAgICAgIyBmb3IgZnV0dXJlIHJld2luZHMgaW4gdGhlIGV2ZW50IG9mIGEgcmVkaXJlY3QvcmV0cnkuCiAgICAgICAgYm9keV9wb3MgPSBzZXRfZmlsZV9wb3NpdGlvbihib2R5LCBib2R5X3BvcykKCiAgICAgICAgdHJ5OgogICAgICAgICAgICAjIFJlcXVlc3QgYSBjb25uZWN0aW9uIGZyb20gdGhlIHF1ZXVlLgogICAgICAgICAgICB0aW1lb3V0X29iaiA9IHNlbGYuX2dldF90aW1lb3V0KHRpbWVvdXQpCiAgICAgICAgICAgIGNvbm4gPSBzZWxmLl9nZXRfY29ubih0aW1lb3V0PXBvb2xfdGltZW91dCkKCiAgICAgICAgICAgIGNvbm4udGltZW91dCA9IHRpbWVvdXRfb2JqLmNvbm5lY3RfdGltZW91dAoKICAgICAgICAgICAgaXNfbmV3X3Byb3h5X2Nvbm4gPSBzZWxmLnByb3h5IGlzIG5vdCBOb25lIGFuZCBub3QgZ2V0YXR0cihjb25uLCAnc29jaycsIE5vbmUpCiAgICAgICAgICAgIGlmIGlzX25ld19wcm94eV9jb25uOgogICAgICAgICAgICAgICAgc2VsZi5fcHJlcGFyZV9wcm94eShjb25uKQoKICAgICAgICAgICAgIyBNYWtlIHRoZSByZXF1ZXN0IG9uIHRoZSBodHRwbGliIGNvbm5lY3Rpb24gb2JqZWN0LgogICAgICAgICAgICBodHRwbGliX3Jlc3BvbnNlID0gc2VsZi5fbWFrZV9yZXF1ZXN0KGNvbm4sIG1ldGhvZCwgdXJsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ9dGltZW91dF9vYmosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keT1ib2R5LCBoZWFkZXJzPWhlYWRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtlZD1jaHVua2VkKQoKICAgICAgICAgICAgIyBJZiB3ZSdyZSBnb2luZyB0byByZWxlYXNlIHRoZSBjb25uZWN0aW9uIGluIGBgZmluYWxseTpgYCwgdGhlbgogICAgICAgICAgICAjIHRoZSByZXNwb25zZSBkb2Vzbid0IG5lZWQgdG8ga25vdyBhYm91dCB0aGUgY29ubmVjdGlvbi4gT3RoZXJ3aXNlCiAgICAgICAgICAgICMgaXQgd2lsbCBhbHNvIHRyeSB0byByZWxlYXNlIGl0IGFuZCB3ZSdsbCBoYXZlIGEgZG91YmxlLXJlbGVhc2UKICAgICAgICAgICAgIyBtZXNzLgogICAgICAgICAgICByZXNwb25zZV9jb25uID0gY29ubiBpZiBub3QgcmVsZWFzZV9jb25uIGVsc2UgTm9uZQoKICAgICAgICAgICAgIyBQYXNzIG1ldGhvZCB0byBSZXNwb25zZSBmb3IgbGVuZ3RoIGNoZWNraW5nCiAgICAgICAgICAgIHJlc3BvbnNlX2t3WydyZXF1ZXN0X21ldGhvZCddID0gbWV0aG9kCgogICAgICAgICAgICAjIEltcG9ydCBodHRwbGliJ3MgcmVzcG9uc2UgaW50byBvdXIgb3duIHdyYXBwZXIgb2JqZWN0CiAgICAgICAgICAgIHJlc3BvbnNlID0gc2VsZi5SZXNwb25zZUNscy5mcm9tX2h0dHBsaWIoaHR0cGxpYl9yZXNwb25zZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb29sPXNlbGYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbj1yZXNwb25zZV9jb25uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHJpZXM9cmV0cmllcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKnJlc3BvbnNlX2t3KQoKICAgICAgICAgICAgIyBFdmVyeXRoaW5nIHdlbnQgZ3JlYXQhCiAgICAgICAgICAgIGNsZWFuX2V4aXQgPSBUcnVlCgogICAgICAgIGV4Y2VwdCBxdWV1ZS5FbXB0eToKICAgICAgICAgICAgIyBUaW1lZCBvdXQgYnkgcXVldWUuCiAgICAgICAgICAgIHJhaXNlIEVtcHR5UG9vbEVycm9yKHNlbGYsICJObyBwb29sIGNvbm5lY3Rpb25zIGFyZSBhdmFpbGFibGUuIikKCiAgICAgICAgZXhjZXB0IChUaW1lb3V0RXJyb3IsIEhUVFBFeGNlcHRpb24sIFNvY2tldEVycm9yLCBQcm90b2NvbEVycm9yLAogICAgICAgICAgICAgICAgQmFzZVNTTEVycm9yLCBTU0xFcnJvciwgQ2VydGlmaWNhdGVFcnJvcikgYXMgZToKICAgICAgICAgICAgIyBEaXNjYXJkIHRoZSBjb25uZWN0aW9uIGZvciB0aGVzZSBleGNlcHRpb25zLiBJdCB3aWxsIGJlCiAgICAgICAgICAgICMgcmVwbGFjZWQgZHVyaW5nIHRoZSBuZXh0IF9nZXRfY29ubigpIGNhbGwuCiAgICAgICAgICAgIGNsZWFuX2V4aXQgPSBGYWxzZQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGUsIChCYXNlU1NMRXJyb3IsIENlcnRpZmljYXRlRXJyb3IpKToKICAgICAgICAgICAgICAgIGUgPSBTU0xFcnJvcihlKQogICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UoZSwgKFNvY2tldEVycm9yLCBOZXdDb25uZWN0aW9uRXJyb3IpKSBhbmQgc2VsZi5wcm94eToKICAgICAgICAgICAgICAgIGUgPSBQcm94eUVycm9yKCdDYW5ub3QgY29ubmVjdCB0byBwcm94eS4nLCBlKQogICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UoZSwgKFNvY2tldEVycm9yLCBIVFRQRXhjZXB0aW9uKSk6CiAgICAgICAgICAgICAgICBlID0gUHJvdG9jb2xFcnJvcignQ29ubmVjdGlvbiBhYm9ydGVkLicsIGUpCgogICAgICAgICAgICByZXRyaWVzID0gcmV0cmllcy5pbmNyZW1lbnQobWV0aG9kLCB1cmwsIGVycm9yPWUsIF9wb29sPXNlbGYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc3RhY2t0cmFjZT1zeXMuZXhjX2luZm8oKVsyXSkKICAgICAgICAgICAgcmV0cmllcy5zbGVlcCgpCgogICAgICAgICAgICAjIEtlZXAgdHJhY2sgb2YgdGhlIGVycm9yIGZvciB0aGUgcmV0cnkgd2FybmluZy4KICAgICAgICAgICAgZXJyID0gZQoKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBpZiBub3QgY2xlYW5fZXhpdDoKICAgICAgICAgICAgICAgICMgV2UgaGl0IHNvbWUga2luZCBvZiBleGNlcHRpb24sIGhhbmRsZWQgb3Igb3RoZXJ3aXNlLiBXZSBuZWVkCiAgICAgICAgICAgICAgICAjIHRvIHRocm93IHRoZSBjb25uZWN0aW9uIGF3YXkgdW5sZXNzIGV4cGxpY2l0bHkgdG9sZCBub3QgdG8uCiAgICAgICAgICAgICAgICAjIENsb3NlIHRoZSBjb25uZWN0aW9uLCBzZXQgdGhlIHZhcmlhYmxlIHRvIE5vbmUsIGFuZCBtYWtlIHN1cmUKICAgICAgICAgICAgICAgICMgd2UgcHV0IHRoZSBOb25lIGJhY2sgaW4gdGhlIHBvb2wgdG8gYXZvaWQgbGVha2luZyBpdC4KICAgICAgICAgICAgICAgIGNvbm4gPSBjb25uIGFuZCBjb25uLmNsb3NlKCkKICAgICAgICAgICAgICAgIHJlbGVhc2VfdGhpc19jb25uID0gVHJ1ZQoKICAgICAgICAgICAgaWYgcmVsZWFzZV90aGlzX2Nvbm46CiAgICAgICAgICAgICAgICAjIFB1dCB0aGUgY29ubmVjdGlvbiBiYWNrIHRvIGJlIHJldXNlZC4gSWYgdGhlIGNvbm5lY3Rpb24gaXMKICAgICAgICAgICAgICAgICMgZXhwaXJlZCB0aGVuIGl0IHdpbGwgYmUgTm9uZSwgd2hpY2ggd2lsbCBnZXQgcmVwbGFjZWQgd2l0aCBhCiAgICAgICAgICAgICAgICAjIGZyZXNoIGNvbm5lY3Rpb24gZHVyaW5nIF9nZXRfY29ubi4KICAgICAgICAgICAgICAgIHNlbGYuX3B1dF9jb25uKGNvbm4pCgogICAgICAgIGlmIG5vdCBjb25uOgogICAgICAgICAgICAjIFRyeSBhZ2FpbgogICAgICAgICAgICBsb2cud2FybmluZygiUmV0cnlpbmcgKCVyKSBhZnRlciBjb25uZWN0aW9uICIKICAgICAgICAgICAgICAgICAgICAgICAgImJyb2tlbiBieSAnJXInOiAlcyIsIHJldHJpZXMsIGVyciwgdXJsKQogICAgICAgICAgICByZXR1cm4gc2VsZi51cmxvcGVuKG1ldGhvZCwgdXJsLCBib2R5LCBoZWFkZXJzLCByZXRyaWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0LCBhc3NlcnRfc2FtZV9ob3N0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ9dGltZW91dCwgcG9vbF90aW1lb3V0PXBvb2xfdGltZW91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxlYXNlX2Nvbm49cmVsZWFzZV9jb25uLCBib2R5X3Bvcz1ib2R5X3BvcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKnJlc3BvbnNlX2t3KQoKICAgICAgICBkZWYgZHJhaW5fYW5kX3JlbGVhc2VfY29ubihyZXNwb25zZSk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICMgZGlzY2FyZCBhbnkgcmVtYWluaW5nIHJlc3BvbnNlIGJvZHksIHRoZSBjb25uZWN0aW9uIHdpbGwgYmUKICAgICAgICAgICAgICAgICMgcmVsZWFzZWQgYmFjayB0byB0aGUgcG9vbCBvbmNlIHRoZSBlbnRpcmUgcmVzcG9uc2UgaXMgcmVhZAogICAgICAgICAgICAgICAgcmVzcG9uc2UucmVhZCgpCiAgICAgICAgICAgIGV4Y2VwdCAoVGltZW91dEVycm9yLCBIVFRQRXhjZXB0aW9uLCBTb2NrZXRFcnJvciwgUHJvdG9jb2xFcnJvciwKICAgICAgICAgICAgICAgICAgICBCYXNlU1NMRXJyb3IsIFNTTEVycm9yKSBhcyBlOgogICAgICAgICAgICAgICAgcGFzcwoKICAgICAgICAjIEhhbmRsZSByZWRpcmVjdD8KICAgICAgICByZWRpcmVjdF9sb2NhdGlvbiA9IHJlZGlyZWN0IGFuZCByZXNwb25zZS5nZXRfcmVkaXJlY3RfbG9jYXRpb24oKQogICAgICAgIGlmIHJlZGlyZWN0X2xvY2F0aW9uOgogICAgICAgICAgICBpZiByZXNwb25zZS5zdGF0dXMgPT0gMzAzOgogICAgICAgICAgICAgICAgbWV0aG9kID0gJ0dFVCcKCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHJldHJpZXMgPSByZXRyaWVzLmluY3JlbWVudChtZXRob2QsIHVybCwgcmVzcG9uc2U9cmVzcG9uc2UsIF9wb29sPXNlbGYpCiAgICAgICAgICAgIGV4Y2VwdCBNYXhSZXRyeUVycm9yOgogICAgICAgICAgICAgICAgaWYgcmV0cmllcy5yYWlzZV9vbl9yZWRpcmVjdDoKICAgICAgICAgICAgICAgICAgICAjIERyYWluIGFuZCByZWxlYXNlIHRoZSBjb25uZWN0aW9uIGZvciB0aGlzIHJlc3BvbnNlLCBzaW5jZQogICAgICAgICAgICAgICAgICAgICMgd2UncmUgbm90IHJldHVybmluZyBpdCB0byBiZSByZWxlYXNlZCBtYW51YWxseS4KICAgICAgICAgICAgICAgICAgICBkcmFpbl9hbmRfcmVsZWFzZV9jb25uKHJlc3BvbnNlKQogICAgICAgICAgICAgICAgICAgIHJhaXNlCiAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UKCiAgICAgICAgICAgICMgZHJhaW4gYW5kIHJldHVybiB0aGUgY29ubmVjdGlvbiB0byB0aGUgcG9vbCBiZWZvcmUgcmVjdXJzaW5nCiAgICAgICAgICAgIGRyYWluX2FuZF9yZWxlYXNlX2Nvbm4ocmVzcG9uc2UpCgogICAgICAgICAgICByZXRyaWVzLnNsZWVwX2Zvcl9yZXRyeShyZXNwb25zZSkKICAgICAgICAgICAgbG9nLmRlYnVnKCJSZWRpcmVjdGluZyAlcyAtPiAlcyIsIHVybCwgcmVkaXJlY3RfbG9jYXRpb24pCiAgICAgICAgICAgIHJldHVybiBzZWxmLnVybG9wZW4oCiAgICAgICAgICAgICAgICBtZXRob2QsIHJlZGlyZWN0X2xvY2F0aW9uLCBib2R5LCBoZWFkZXJzLAogICAgICAgICAgICAgICAgcmV0cmllcz1yZXRyaWVzLCByZWRpcmVjdD1yZWRpcmVjdCwKICAgICAgICAgICAgICAgIGFzc2VydF9zYW1lX2hvc3Q9YXNzZXJ0X3NhbWVfaG9zdCwKICAgICAgICAgICAgICAgIHRpbWVvdXQ9dGltZW91dCwgcG9vbF90aW1lb3V0PXBvb2xfdGltZW91dCwKICAgICAgICAgICAgICAgIHJlbGVhc2VfY29ubj1yZWxlYXNlX2Nvbm4sIGJvZHlfcG9zPWJvZHlfcG9zLAogICAgICAgICAgICAgICAgKipyZXNwb25zZV9rdykKCiAgICAgICAgIyBDaGVjayBpZiB3ZSBzaG91bGQgcmV0cnkgdGhlIEhUVFAgcmVzcG9uc2UuCiAgICAgICAgaGFzX3JldHJ5X2FmdGVyID0gYm9vbChyZXNwb25zZS5nZXRoZWFkZXIoJ1JldHJ5LUFmdGVyJykpCiAgICAgICAgaWYgcmV0cmllcy5pc19yZXRyeShtZXRob2QsIHJlc3BvbnNlLnN0YXR1cywgaGFzX3JldHJ5X2FmdGVyKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcmV0cmllcyA9IHJldHJpZXMuaW5jcmVtZW50KG1ldGhvZCwgdXJsLCByZXNwb25zZT1yZXNwb25zZSwgX3Bvb2w9c2VsZikKICAgICAgICAgICAgZXhjZXB0IE1heFJldHJ5RXJyb3I6CiAgICAgICAgICAgICAgICBpZiByZXRyaWVzLnJhaXNlX29uX3N0YXR1czoKICAgICAgICAgICAgICAgICAgICAjIERyYWluIGFuZCByZWxlYXNlIHRoZSBjb25uZWN0aW9uIGZvciB0aGlzIHJlc3BvbnNlLCBzaW5jZQogICAgICAgICAgICAgICAgICAgICMgd2UncmUgbm90IHJldHVybmluZyBpdCB0byBiZSByZWxlYXNlZCBtYW51YWxseS4KICAgICAgICAgICAgICAgICAgICBkcmFpbl9hbmRfcmVsZWFzZV9jb25uKHJlc3BvbnNlKQogICAgICAgICAgICAgICAgICAgIHJhaXNlCiAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UKCiAgICAgICAgICAgICMgZHJhaW4gYW5kIHJldHVybiB0aGUgY29ubmVjdGlvbiB0byB0aGUgcG9vbCBiZWZvcmUgcmVjdXJzaW5nCiAgICAgICAgICAgIGRyYWluX2FuZF9yZWxlYXNlX2Nvbm4ocmVzcG9uc2UpCgogICAgICAgICAgICByZXRyaWVzLnNsZWVwKHJlc3BvbnNlKQogICAgICAgICAgICBsb2cuZGVidWcoIlJldHJ5OiAlcyIsIHVybCkKICAgICAgICAgICAgcmV0dXJuIHNlbGYudXJsb3BlbigKICAgICAgICAgICAgICAgIG1ldGhvZCwgdXJsLCBib2R5LCBoZWFkZXJzLAogICAgICAgICAgICAgICAgcmV0cmllcz1yZXRyaWVzLCByZWRpcmVjdD1yZWRpcmVjdCwKICAgICAgICAgICAgICAgIGFzc2VydF9zYW1lX2hvc3Q9YXNzZXJ0X3NhbWVfaG9zdCwKICAgICAgICAgICAgICAgIHRpbWVvdXQ9dGltZW91dCwgcG9vbF90aW1lb3V0PXBvb2xfdGltZW91dCwKICAgICAgICAgICAgICAgIHJlbGVhc2VfY29ubj1yZWxlYXNlX2Nvbm4sCiAgICAgICAgICAgICAgICBib2R5X3Bvcz1ib2R5X3BvcywgKipyZXNwb25zZV9rdykKCiAgICAgICAgcmV0dXJuIHJlc3BvbnNlCgoKY2xhc3MgSFRUUFNDb25uZWN0aW9uUG9vbChIVFRQQ29ubmVjdGlvblBvb2wpOgogICAgIiIiCiAgICBTYW1lIGFzIDpjbGFzczpgLkhUVFBDb25uZWN0aW9uUG9vbGAsIGJ1dCBIVFRQUy4KCiAgICBXaGVuIFB5dGhvbiBpcyBjb21waWxlZCB3aXRoIHRoZSA6bW9kOmBzc2xgIG1vZHVsZSwgdGhlbgogICAgOmNsYXNzOmAuVmVyaWZpZWRIVFRQU0Nvbm5lY3Rpb25gIGlzIHVzZWQsIHdoaWNoICpjYW4qIHZlcmlmeSBjZXJ0aWZpY2F0ZXMsCiAgICBpbnN0ZWFkIG9mIDpjbGFzczpgLkhUVFBTQ29ubmVjdGlvbmAuCgogICAgOmNsYXNzOmAuVmVyaWZpZWRIVFRQU0Nvbm5lY3Rpb25gIHVzZXMgb25lIG9mIGBgYXNzZXJ0X2ZpbmdlcnByaW50YGAsCiAgICBgYGFzc2VydF9ob3N0bmFtZWBgIGFuZCBgYGhvc3RgYCBpbiB0aGlzIG9yZGVyIHRvIHZlcmlmeSBjb25uZWN0aW9ucy4KICAgIElmIGBgYXNzZXJ0X2hvc3RuYW1lYGAgaXMgRmFsc2UsIG5vIHZlcmlmaWNhdGlvbiBpcyBkb25lLgoKICAgIFRoZSBgYGtleV9maWxlYGAsIGBgY2VydF9maWxlYGAsIGBgY2VydF9yZXFzYGAsIGBgY2FfY2VydHNgYCwKICAgIGBgY2FfY2VydF9kaXJgYCwgYW5kIGBgc3NsX3ZlcnNpb25gYCBhcmUgb25seSB1c2VkIGlmIDptb2Q6YHNzbGAgaXMKICAgIGF2YWlsYWJsZSBhbmQgYXJlIGZlZCBpbnRvIDptZXRoOmB1cmxsaWIzLnV0aWwuc3NsX3dyYXBfc29ja2V0YCB0byB1cGdyYWRlCiAgICB0aGUgY29ubmVjdGlvbiBzb2NrZXQgaW50byBhbiBTU0wgc29ja2V0LgogICAgIiIiCgogICAgc2NoZW1lID0gJ2h0dHBzJwogICAgQ29ubmVjdGlvbkNscyA9IEhUVFBTQ29ubmVjdGlvbgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0LCBwb3J0PU5vbmUsCiAgICAgICAgICAgICAgICAgc3RyaWN0PUZhbHNlLCB0aW1lb3V0PVRpbWVvdXQuREVGQVVMVF9USU1FT1VULCBtYXhzaXplPTEsCiAgICAgICAgICAgICAgICAgYmxvY2s9RmFsc2UsIGhlYWRlcnM9Tm9uZSwgcmV0cmllcz1Ob25lLAogICAgICAgICAgICAgICAgIF9wcm94eT1Ob25lLCBfcHJveHlfaGVhZGVycz1Ob25lLAogICAgICAgICAgICAgICAgIGtleV9maWxlPU5vbmUsIGNlcnRfZmlsZT1Ob25lLCBjZXJ0X3JlcXM9Tm9uZSwKICAgICAgICAgICAgICAgICBjYV9jZXJ0cz1Ob25lLCBzc2xfdmVyc2lvbj1Ob25lLAogICAgICAgICAgICAgICAgIGFzc2VydF9ob3N0bmFtZT1Ob25lLCBhc3NlcnRfZmluZ2VycHJpbnQ9Tm9uZSwKICAgICAgICAgICAgICAgICBjYV9jZXJ0X2Rpcj1Ob25lLCAqKmNvbm5fa3cpOgoKICAgICAgICBIVFRQQ29ubmVjdGlvblBvb2wuX19pbml0X18oc2VsZiwgaG9zdCwgcG9ydCwgc3RyaWN0LCB0aW1lb3V0LCBtYXhzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jaywgaGVhZGVycywgcmV0cmllcywgX3Byb3h5LCBfcHJveHlfaGVhZGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipjb25uX2t3KQoKICAgICAgICBpZiBjYV9jZXJ0cyBhbmQgY2VydF9yZXFzIGlzIE5vbmU6CiAgICAgICAgICAgIGNlcnRfcmVxcyA9ICdDRVJUX1JFUVVJUkVEJwoKICAgICAgICBzZWxmLmtleV9maWxlID0ga2V5X2ZpbGUKICAgICAgICBzZWxmLmNlcnRfZmlsZSA9IGNlcnRfZmlsZQogICAgICAgIHNlbGYuY2VydF9yZXFzID0gY2VydF9yZXFzCiAgICAgICAgc2VsZi5jYV9jZXJ0cyA9IGNhX2NlcnRzCiAgICAgICAgc2VsZi5jYV9jZXJ0X2RpciA9IGNhX2NlcnRfZGlyCiAgICAgICAgc2VsZi5zc2xfdmVyc2lvbiA9IHNzbF92ZXJzaW9uCiAgICAgICAgc2VsZi5hc3NlcnRfaG9zdG5hbWUgPSBhc3NlcnRfaG9zdG5hbWUKICAgICAgICBzZWxmLmFzc2VydF9maW5nZXJwcmludCA9IGFzc2VydF9maW5nZXJwcmludAoKICAgIGRlZiBfcHJlcGFyZV9jb25uKHNlbGYsIGNvbm4pOgogICAgICAgICIiIgogICAgICAgIFByZXBhcmUgdGhlIGBgY29ubmVjdGlvbmBgIGZvciA6bWV0aDpgdXJsbGliMy51dGlsLnNzbF93cmFwX3NvY2tldGAKICAgICAgICBhbmQgZXN0YWJsaXNoIHRoZSB0dW5uZWwgaWYgcHJveHkgaXMgdXNlZC4KICAgICAgICAiIiIKCiAgICAgICAgaWYgaXNpbnN0YW5jZShjb25uLCBWZXJpZmllZEhUVFBTQ29ubmVjdGlvbik6CiAgICAgICAgICAgIGNvbm4uc2V0X2NlcnQoa2V5X2ZpbGU9c2VsZi5rZXlfZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0X2ZpbGU9c2VsZi5jZXJ0X2ZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9yZXFzPXNlbGYuY2VydF9yZXFzLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNhX2NlcnRzPXNlbGYuY2FfY2VydHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FfY2VydF9kaXI9c2VsZi5jYV9jZXJ0X2RpciwKICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRfaG9zdG5hbWU9c2VsZi5hc3NlcnRfaG9zdG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0X2ZpbmdlcnByaW50PXNlbGYuYXNzZXJ0X2ZpbmdlcnByaW50KQogICAgICAgICAgICBjb25uLnNzbF92ZXJzaW9uID0gc2VsZi5zc2xfdmVyc2lvbgogICAgICAgIHJldHVybiBjb25uCgogICAgZGVmIF9wcmVwYXJlX3Byb3h5KHNlbGYsIGNvbm4pOgogICAgICAgICIiIgogICAgICAgIEVzdGFibGlzaCB0dW5uZWwgY29ubmVjdGlvbiBlYXJseSwgYmVjYXVzZSBvdGhlcndpc2UgaHR0cGxpYgogICAgICAgIHdvdWxkIGltcHJvcGVybHkgc2V0IEhvc3Q6IGhlYWRlciB0byBwcm94eSdzIElQOnBvcnQuCiAgICAgICAgIiIiCiAgICAgICAgIyBQeXRob24gMi43KwogICAgICAgIHRyeToKICAgICAgICAgICAgc2V0X3R1bm5lbCA9IGNvbm4uc2V0X3R1bm5lbAogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjogICMgUGxhdGZvcm0tc3BlY2lmaWM6IFB5dGhvbiAyLjYKICAgICAgICAgICAgc2V0X3R1bm5lbCA9IGNvbm4uX3NldF90dW5uZWwKCiAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mbyA8PSAoMiwgNiwgNCkgYW5kIG5vdCBzZWxmLnByb3h5X2hlYWRlcnM6ICAjIFB5dGhvbiAyLjYuNCBhbmQgb2xkZXIKICAgICAgICAgICAgc2V0X3R1bm5lbChzZWxmLl9wcm94eV9ob3N0LCBzZWxmLnBvcnQpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2V0X3R1bm5lbChzZWxmLl9wcm94eV9ob3N0LCBzZWxmLnBvcnQsIHNlbGYucHJveHlfaGVhZGVycykKCiAgICAgICAgY29ubi5jb25uZWN0KCkKCiAgICBkZWYgX25ld19jb25uKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBhIGZyZXNoIDpjbGFzczpgaHR0cGxpYi5IVFRQU0Nvbm5lY3Rpb25gLgogICAgICAgICIiIgogICAgICAgIHNlbGYubnVtX2Nvbm5lY3Rpb25zICs9IDEKICAgICAgICBsb2cuZGVidWcoIlN0YXJ0aW5nIG5ldyBIVFRQUyBjb25uZWN0aW9uICglZCk6ICVzIiwKICAgICAgICAgICAgICAgICAgc2VsZi5udW1fY29ubmVjdGlvbnMsIHNlbGYuaG9zdCkKCiAgICAgICAgaWYgbm90IHNlbGYuQ29ubmVjdGlvbkNscyBvciBzZWxmLkNvbm5lY3Rpb25DbHMgaXMgRHVtbXlDb25uZWN0aW9uOgogICAgICAgICAgICByYWlzZSBTU0xFcnJvcigiQ2FuJ3QgY29ubmVjdCB0byBIVFRQUyBVUkwgYmVjYXVzZSB0aGUgU1NMICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1vZHVsZSBpcyBub3QgYXZhaWxhYmxlLiIpCgogICAgICAgIGFjdHVhbF9ob3N0ID0gc2VsZi5ob3N0CiAgICAgICAgYWN0dWFsX3BvcnQgPSBzZWxmLnBvcnQKICAgICAgICBpZiBzZWxmLnByb3h5IGlzIG5vdCBOb25lOgogICAgICAgICAgICBhY3R1YWxfaG9zdCA9IHNlbGYucHJveHkuaG9zdAogICAgICAgICAgICBhY3R1YWxfcG9ydCA9IHNlbGYucHJveHkucG9ydAoKICAgICAgICBjb25uID0gc2VsZi5Db25uZWN0aW9uQ2xzKGhvc3Q9YWN0dWFsX2hvc3QsIHBvcnQ9YWN0dWFsX3BvcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0PXNlbGYudGltZW91dC5jb25uZWN0X3RpbWVvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpY3Q9c2VsZi5zdHJpY3QsICoqc2VsZi5jb25uX2t3KQoKICAgICAgICByZXR1cm4gc2VsZi5fcHJlcGFyZV9jb25uKGNvbm4pCgogICAgZGVmIF92YWxpZGF0ZV9jb25uKHNlbGYsIGNvbm4pOgogICAgICAgICIiIgogICAgICAgIENhbGxlZCByaWdodCBiZWZvcmUgYSByZXF1ZXN0IGlzIG1hZGUsIGFmdGVyIHRoZSBzb2NrZXQgaXMgY3JlYXRlZC4KICAgICAgICAiIiIKICAgICAgICBzdXBlcihIVFRQU0Nvbm5lY3Rpb25Qb29sLCBzZWxmKS5fdmFsaWRhdGVfY29ubihjb25uKQoKICAgICAgICAjIEZvcmNlIGNvbm5lY3QgZWFybHkgdG8gYWxsb3cgdXMgdG8gdmFsaWRhdGUgdGhlIGNvbm5lY3Rpb24uCiAgICAgICAgaWYgbm90IGdldGF0dHIoY29ubiwgJ3NvY2snLCBOb25lKTogICMgQXBwRW5naW5lIG1pZ2h0IG5vdCBoYXZlICBgLnNvY2tgCiAgICAgICAgICAgIGNvbm4uY29ubmVjdCgpCgogICAgICAgIGlmIG5vdCBjb25uLmlzX3ZlcmlmaWVkOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCgKICAgICAgICAgICAgICAgICdVbnZlcmlmaWVkIEhUVFBTIHJlcXVlc3QgaXMgYmVpbmcgbWFkZS4gJwogICAgICAgICAgICAgICAgJ0FkZGluZyBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24gaXMgc3Ryb25nbHkgYWR2aXNlZC4gU2VlOiAnCiAgICAgICAgICAgICAgICAnaHR0cHM6Ly91cmxsaWIzLnJlYWR0aGVkb2NzLmlvL2VuL2xhdGVzdC9hZHZhbmNlZC11c2FnZS5odG1sJwogICAgICAgICAgICAgICAgJyNzc2wtd2FybmluZ3MnKSwKICAgICAgICAgICAgICAgIEluc2VjdXJlUmVxdWVzdFdhcm5pbmcpCgoKZGVmIGNvbm5lY3Rpb25fZnJvbV91cmwodXJsLCAqKmt3KToKICAgICIiIgogICAgR2l2ZW4gYSB1cmwsIHJldHVybiBhbiA6Y2xhc3M6YC5Db25uZWN0aW9uUG9vbGAgaW5zdGFuY2Ugb2YgaXRzIGhvc3QuCgogICAgVGhpcyBpcyBhIHNob3J0Y3V0IGZvciBub3QgaGF2aW5nIHRvIHBhcnNlIG91dCB0aGUgc2NoZW1lLCBob3N0LCBhbmQgcG9ydAogICAgb2YgdGhlIHVybCBiZWZvcmUgY3JlYXRpbmcgYW4gOmNsYXNzOmAuQ29ubmVjdGlvblBvb2xgIGluc3RhbmNlLgoKICAgIDpwYXJhbSB1cmw6CiAgICAgICAgQWJzb2x1dGUgVVJMIHN0cmluZyB0aGF0IG11c3QgaW5jbHVkZSB0aGUgc2NoZW1lLiBQb3J0IGlzIG9wdGlvbmFsLgoKICAgIDpwYXJhbSBcXCoqa3c6CiAgICAgICAgUGFzc2VzIGFkZGl0aW9uYWwgcGFyYW1ldGVycyB0byB0aGUgY29uc3RydWN0b3Igb2YgdGhlIGFwcHJvcHJpYXRlCiAgICAgICAgOmNsYXNzOmAuQ29ubmVjdGlvblBvb2xgLiBVc2VmdWwgZm9yIHNwZWNpZnlpbmcgdGhpbmdzIGxpa2UKICAgICAgICB0aW1lb3V0LCBtYXhzaXplLCBoZWFkZXJzLCBldGMuCgogICAgRXhhbXBsZTo6CgogICAgICAgID4+PiBjb25uID0gY29ubmVjdGlvbl9mcm9tX3VybCgnaHR0cDovL2dvb2dsZS5jb20vJykKICAgICAgICA+Pj4gciA9IGNvbm4ucmVxdWVzdCgnR0VUJywgJy8nKQogICAgIiIiCiAgICBzY2hlbWUsIGhvc3QsIHBvcnQgPSBnZXRfaG9zdCh1cmwpCiAgICBwb3J0ID0gcG9ydCBvciBwb3J0X2J5X3NjaGVtZS5nZXQoc2NoZW1lLCA4MCkKICAgIGlmIHNjaGVtZSA9PSAnaHR0cHMnOgogICAgICAgIHJldHVybiBIVFRQU0Nvbm5lY3Rpb25Qb29sKGhvc3QsIHBvcnQ9cG9ydCwgKiprdykKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIEhUVFBDb25uZWN0aW9uUG9vbChob3N0LCBwb3J0PXBvcnQsICoqa3cpCgoKZGVmIF9pcHY2X2hvc3QoaG9zdCk6CiAgICAiIiIKICAgIFByb2Nlc3MgSVB2NiBhZGRyZXNzIGxpdGVyYWxzCiAgICAiIiIKCiAgICAjIGh0dHBsaWIgZG9lc24ndCBsaWtlIGl0IHdoZW4gd2UgaW5jbHVkZSBicmFja2V0cyBpbiBJUHY2IGFkZHJlc3NlcwogICAgIyBTcGVjaWZpY2FsbHksIGlmIHdlIGluY2x1ZGUgYnJhY2tldHMgYnV0IGFsc28gcGFzcyB0aGUgcG9ydCB0aGVuCiAgICAjIGh0dHBsaWIgY3JhemlseSBkb3VibGVzIHVwIHRoZSBzcXVhcmUgYnJhY2tldHMgb24gdGhlIEhvc3QgaGVhZGVyLgogICAgIyBJbnN0ZWFkLCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB3ZSBuZXZlciBwYXNzIGBgTm9uZWBgIGFzIHRoZSBwb3J0LgogICAgIyBIb3dldmVyLCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSByZWFzb25zIHdlIGNhbid0IGFjdHVhbGx5CiAgICAjICphc3NlcnQqIHRoYXQuICBTZWUgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTI4NTM5CiAgICAjCiAgICAjIEFsc28gaWYgYW4gSVB2NiBhZGRyZXNzIGxpdGVyYWwgaGFzIGEgem9uZSBpZGVudGlmaWVyLCB0aGUKICAgICMgcGVyY2VudCBzaWduIG1pZ2h0IGJlIFVSSWVuY29kZWQsIGNvbnZlcnQgaXQgYmFjayBpbnRvIEFTQ0lJCiAgICBpZiBob3N0LnN0YXJ0c3dpdGgoJ1snKSBhbmQgaG9zdC5lbmRzd2l0aCgnXScpOgogICAgICAgIGhvc3QgPSBob3N0LnJlcGxhY2UoJyUyNScsICclJykuc3RyaXAoJ1tdJykKICAgIHJldHVybiBob3N0ClBLAwQUAAAAAAAAACEAAAAAAAAAAAAAAAAARAAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9jb250cmliL19faW5pdF9fLnB5UEsDBBQAAAAAAAAAIQAAAAAAAAAAAAAAAABVAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL2NvbnRyaWIvX3NlY3VyZXRyYW5zcG9ydC9fX2luaXRfXy5weVBLAwQUAAAAAAAAACEAt1mLfZhEAACYRAAAVQAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9jb250cmliL19zZWN1cmV0cmFuc3BvcnQvYmluZGluZ3MucHkiIiIKVGhpcyBtb2R1bGUgdXNlcyBjdHlwZXMgdG8gYmluZCBhIHdob2xlIGJ1bmNoIG9mIGZ1bmN0aW9ucyBhbmQgY29uc3RhbnRzIGZyb20KU2VjdXJlVHJhbnNwb3J0LiBUaGUgZ29hbCBoZXJlIGlzIHRvIHByb3ZpZGUgdGhlIGxvdy1sZXZlbCBBUEkgdG8KU2VjdXJlVHJhbnNwb3J0LiBUaGVzZSBhcmUgZXNzZW50aWFsbHkgdGhlIEMtbGV2ZWwgZnVuY3Rpb25zIGFuZCBjb25zdGFudHMsIGFuZAp0aGV5J3JlIHByZXR0eSBncm9zcyB0byB3b3JrIHdpdGguCgpUaGlzIGNvZGUgaXMgYSBiYXN0YXJkaXNlZCB2ZXJzaW9uIG9mIHRoZSBjb2RlIGZvdW5kIGluIFdpbGwgQm9uZCdzIG9zY3J5cHRvCmxpYnJhcnkuIEFuIGVub3Jtb3VzIGRlYnQgaXMgb3dlZCB0byBoaW0gZm9yIGJsYXppbmcgdGhpcyB0cmFpbCBmb3IgdXMuIEZvcgp0aGF0IHJlYXNvbiwgdGhpcyBjb2RlIHNob3VsZCBiZSBjb25zaWRlcmVkIHRvIGJlIGNvdmVyZWQgYm90aCBieSB1cmxsaWIzJ3MKbGljZW5zZSBhbmQgYnkgb3NjcnlwdG8nczoKCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiBXaWxsIEJvbmQgPHdpbGxAd2JvbmQubmV0PgoKICAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCiAgICBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAogICAgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgogICAgdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCiAgICBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKICAgIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgogICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KICAgIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKICAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCiAgICBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKICAgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQogICAgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgogICAgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKICAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKICAgIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KIiIiCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgcGxhdGZvcm0KZnJvbSBjdHlwZXMudXRpbCBpbXBvcnQgZmluZF9saWJyYXJ5CmZyb20gY3R5cGVzIGltcG9ydCAoCiAgICBjX3ZvaWRfcCwgY19pbnQzMiwgY19jaGFyX3AsIGNfc2l6ZV90LCBjX2J5dGUsIGNfdWludDMyLCBjX3Vsb25nLCBjX2xvbmcsCiAgICBjX2Jvb2wKKQpmcm9tIGN0eXBlcyBpbXBvcnQgQ0RMTCwgUE9JTlRFUiwgQ0ZVTkNUWVBFCgoKc2VjdXJpdHlfcGF0aCA9IGZpbmRfbGlicmFyeSgnU2VjdXJpdHknKQppZiBub3Qgc2VjdXJpdHlfcGF0aDoKICAgIHJhaXNlIEltcG9ydEVycm9yKCdUaGUgbGlicmFyeSBTZWN1cml0eSBjb3VsZCBub3QgYmUgZm91bmQnKQoKCmNvcmVfZm91bmRhdGlvbl9wYXRoID0gZmluZF9saWJyYXJ5KCdDb3JlRm91bmRhdGlvbicpCmlmIG5vdCBjb3JlX2ZvdW5kYXRpb25fcGF0aDoKICAgIHJhaXNlIEltcG9ydEVycm9yKCdUaGUgbGlicmFyeSBDb3JlRm91bmRhdGlvbiBjb3VsZCBub3QgYmUgZm91bmQnKQoKCnZlcnNpb24gPSBwbGF0Zm9ybS5tYWNfdmVyKClbMF0KdmVyc2lvbl9pbmZvID0gdHVwbGUobWFwKGludCwgdmVyc2lvbi5zcGxpdCgnLicpKSkKaWYgdmVyc2lvbl9pbmZvIDwgKDEwLCA4KToKICAgIHJhaXNlIE9TRXJyb3IoCiAgICAgICAgJ09ubHkgT1MgWCAxMC44IGFuZCBuZXdlciBhcmUgc3VwcG9ydGVkLCBub3QgJXMuJXMnICUgKAogICAgICAgICAgICB2ZXJzaW9uX2luZm9bMF0sIHZlcnNpb25faW5mb1sxXQogICAgICAgICkKICAgICkKClNlY3VyaXR5ID0gQ0RMTChzZWN1cml0eV9wYXRoLCB1c2VfZXJybm89VHJ1ZSkKQ29yZUZvdW5kYXRpb24gPSBDRExMKGNvcmVfZm91bmRhdGlvbl9wYXRoLCB1c2VfZXJybm89VHJ1ZSkKCkJvb2xlYW4gPSBjX2Jvb2wKQ0ZJbmRleCA9IGNfbG9uZwpDRlN0cmluZ0VuY29kaW5nID0gY191aW50MzIKQ0ZEYXRhID0gY192b2lkX3AKQ0ZTdHJpbmcgPSBjX3ZvaWRfcApDRkFycmF5ID0gY192b2lkX3AKQ0ZNdXRhYmxlQXJyYXkgPSBjX3ZvaWRfcApDRkRpY3Rpb25hcnkgPSBjX3ZvaWRfcApDRkVycm9yID0gY192b2lkX3AKQ0ZUeXBlID0gY192b2lkX3AKQ0ZUeXBlSUQgPSBjX3Vsb25nCgpDRlR5cGVSZWYgPSBQT0lOVEVSKENGVHlwZSkKQ0ZBbGxvY2F0b3JSZWYgPSBjX3ZvaWRfcAoKT1NTdGF0dXMgPSBjX2ludDMyCgpDRkRhdGFSZWYgPSBQT0lOVEVSKENGRGF0YSkKQ0ZTdHJpbmdSZWYgPSBQT0lOVEVSKENGU3RyaW5nKQpDRkFycmF5UmVmID0gUE9JTlRFUihDRkFycmF5KQpDRk11dGFibGVBcnJheVJlZiA9IFBPSU5URVIoQ0ZNdXRhYmxlQXJyYXkpCkNGRGljdGlvbmFyeVJlZiA9IFBPSU5URVIoQ0ZEaWN0aW9uYXJ5KQpDRkFycmF5Q2FsbEJhY2tzID0gY192b2lkX3AKQ0ZEaWN0aW9uYXJ5S2V5Q2FsbEJhY2tzID0gY192b2lkX3AKQ0ZEaWN0aW9uYXJ5VmFsdWVDYWxsQmFja3MgPSBjX3ZvaWRfcAoKU2VjQ2VydGlmaWNhdGVSZWYgPSBQT0lOVEVSKGNfdm9pZF9wKQpTZWNFeHRlcm5hbEZvcm1hdCA9IGNfdWludDMyClNlY0V4dGVybmFsSXRlbVR5cGUgPSBjX3VpbnQzMgpTZWNJZGVudGl0eVJlZiA9IFBPSU5URVIoY192b2lkX3ApClNlY0l0ZW1JbXBvcnRFeHBvcnRGbGFncyA9IGNfdWludDMyClNlY0l0ZW1JbXBvcnRFeHBvcnRLZXlQYXJhbWV0ZXJzID0gY192b2lkX3AKU2VjS2V5Y2hhaW5SZWYgPSBQT0lOVEVSKGNfdm9pZF9wKQpTU0xQcm90b2NvbCA9IGNfdWludDMyClNTTENpcGhlclN1aXRlID0gY191aW50MzIKU1NMQ29udGV4dFJlZiA9IFBPSU5URVIoY192b2lkX3ApClNlY1RydXN0UmVmID0gUE9JTlRFUihjX3ZvaWRfcCkKU1NMQ29ubmVjdGlvblJlZiA9IGNfdWludDMyClNlY1RydXN0UmVzdWx0VHlwZSA9IGNfdWludDMyClNlY1RydXN0T3B0aW9uRmxhZ3MgPSBjX3VpbnQzMgpTU0xQcm90b2NvbFNpZGUgPSBjX3VpbnQzMgpTU0xDb25uZWN0aW9uVHlwZSA9IGNfdWludDMyClNTTFNlc3Npb25PcHRpb24gPSBjX3VpbnQzMgoKCnRyeToKICAgIFNlY3VyaXR5LlNlY0l0ZW1JbXBvcnQuYXJndHlwZXMgPSBbCiAgICAgICAgQ0ZEYXRhUmVmLAogICAgICAgIENGU3RyaW5nUmVmLAogICAgICAgIFBPSU5URVIoU2VjRXh0ZXJuYWxGb3JtYXQpLAogICAgICAgIFBPSU5URVIoU2VjRXh0ZXJuYWxJdGVtVHlwZSksCiAgICAgICAgU2VjSXRlbUltcG9ydEV4cG9ydEZsYWdzLAogICAgICAgIFBPSU5URVIoU2VjSXRlbUltcG9ydEV4cG9ydEtleVBhcmFtZXRlcnMpLAogICAgICAgIFNlY0tleWNoYWluUmVmLAogICAgICAgIFBPSU5URVIoQ0ZBcnJheVJlZiksCiAgICBdCiAgICBTZWN1cml0eS5TZWNJdGVtSW1wb3J0LnJlc3R5cGUgPSBPU1N0YXR1cwoKICAgIFNlY3VyaXR5LlNlY0NlcnRpZmljYXRlR2V0VHlwZUlELmFyZ3R5cGVzID0gW10KICAgIFNlY3VyaXR5LlNlY0NlcnRpZmljYXRlR2V0VHlwZUlELnJlc3R5cGUgPSBDRlR5cGVJRAoKICAgIFNlY3VyaXR5LlNlY0lkZW50aXR5R2V0VHlwZUlELmFyZ3R5cGVzID0gW10KICAgIFNlY3VyaXR5LlNlY0lkZW50aXR5R2V0VHlwZUlELnJlc3R5cGUgPSBDRlR5cGVJRAoKICAgIFNlY3VyaXR5LlNlY0tleUdldFR5cGVJRC5hcmd0eXBlcyA9IFtdCiAgICBTZWN1cml0eS5TZWNLZXlHZXRUeXBlSUQucmVzdHlwZSA9IENGVHlwZUlECgogICAgU2VjdXJpdHkuU2VjQ2VydGlmaWNhdGVDcmVhdGVXaXRoRGF0YS5hcmd0eXBlcyA9IFsKICAgICAgICBDRkFsbG9jYXRvclJlZiwKICAgICAgICBDRkRhdGFSZWYKICAgIF0KICAgIFNlY3VyaXR5LlNlY0NlcnRpZmljYXRlQ3JlYXRlV2l0aERhdGEucmVzdHlwZSA9IFNlY0NlcnRpZmljYXRlUmVmCgogICAgU2VjdXJpdHkuU2VjQ2VydGlmaWNhdGVDb3B5RGF0YS5hcmd0eXBlcyA9IFsKICAgICAgICBTZWNDZXJ0aWZpY2F0ZVJlZgogICAgXQogICAgU2VjdXJpdHkuU2VjQ2VydGlmaWNhdGVDb3B5RGF0YS5yZXN0eXBlID0gQ0ZEYXRhUmVmCgogICAgU2VjdXJpdHkuU2VjQ29weUVycm9yTWVzc2FnZVN0cmluZy5hcmd0eXBlcyA9IFsKICAgICAgICBPU1N0YXR1cywKICAgICAgICBjX3ZvaWRfcAogICAgXQogICAgU2VjdXJpdHkuU2VjQ29weUVycm9yTWVzc2FnZVN0cmluZy5yZXN0eXBlID0gQ0ZTdHJpbmdSZWYKCiAgICBTZWN1cml0eS5TZWNJZGVudGl0eUNyZWF0ZVdpdGhDZXJ0aWZpY2F0ZS5hcmd0eXBlcyA9IFsKICAgICAgICBDRlR5cGVSZWYsCiAgICAgICAgU2VjQ2VydGlmaWNhdGVSZWYsCiAgICAgICAgUE9JTlRFUihTZWNJZGVudGl0eVJlZikKICAgIF0KICAgIFNlY3VyaXR5LlNlY0lkZW50aXR5Q3JlYXRlV2l0aENlcnRpZmljYXRlLnJlc3R5cGUgPSBPU1N0YXR1cwoKICAgIFNlY3VyaXR5LlNlY0tleWNoYWluQ3JlYXRlLmFyZ3R5cGVzID0gWwogICAgICAgIGNfY2hhcl9wLAogICAgICAgIGNfdWludDMyLAogICAgICAgIGNfdm9pZF9wLAogICAgICAgIEJvb2xlYW4sCiAgICAgICAgY192b2lkX3AsCiAgICAgICAgUE9JTlRFUihTZWNLZXljaGFpblJlZikKICAgIF0KICAgIFNlY3VyaXR5LlNlY0tleWNoYWluQ3JlYXRlLnJlc3R5cGUgPSBPU1N0YXR1cwoKICAgIFNlY3VyaXR5LlNlY0tleWNoYWluRGVsZXRlLmFyZ3R5cGVzID0gWwogICAgICAgIFNlY0tleWNoYWluUmVmCiAgICBdCiAgICBTZWN1cml0eS5TZWNLZXljaGFpbkRlbGV0ZS5yZXN0eXBlID0gT1NTdGF0dXMKCiAgICBTZWN1cml0eS5TZWNQS0NTMTJJbXBvcnQuYXJndHlwZXMgPSBbCiAgICAgICAgQ0ZEYXRhUmVmLAogICAgICAgIENGRGljdGlvbmFyeVJlZiwKICAgICAgICBQT0lOVEVSKENGQXJyYXlSZWYpCiAgICBdCiAgICBTZWN1cml0eS5TZWNQS0NTMTJJbXBvcnQucmVzdHlwZSA9IE9TU3RhdHVzCgogICAgU1NMUmVhZEZ1bmMgPSBDRlVOQ1RZUEUoT1NTdGF0dXMsIFNTTENvbm5lY3Rpb25SZWYsIGNfdm9pZF9wLCBQT0lOVEVSKGNfc2l6ZV90KSkKICAgIFNTTFdyaXRlRnVuYyA9IENGVU5DVFlQRShPU1N0YXR1cywgU1NMQ29ubmVjdGlvblJlZiwgUE9JTlRFUihjX2J5dGUpLCBQT0lOVEVSKGNfc2l6ZV90KSkKCiAgICBTZWN1cml0eS5TU0xTZXRJT0Z1bmNzLmFyZ3R5cGVzID0gWwogICAgICAgIFNTTENvbnRleHRSZWYsCiAgICAgICAgU1NMUmVhZEZ1bmMsCiAgICAgICAgU1NMV3JpdGVGdW5jCiAgICBdCiAgICBTZWN1cml0eS5TU0xTZXRJT0Z1bmNzLnJlc3R5cGUgPSBPU1N0YXR1cwoKICAgIFNlY3VyaXR5LlNTTFNldFBlZXJJRC5hcmd0eXBlcyA9IFsKICAgICAgICBTU0xDb250ZXh0UmVmLAogICAgICAgIGNfY2hhcl9wLAogICAgICAgIGNfc2l6ZV90CiAgICBdCiAgICBTZWN1cml0eS5TU0xTZXRQZWVySUQucmVzdHlwZSA9IE9TU3RhdHVzCgogICAgU2VjdXJpdHkuU1NMU2V0Q2VydGlmaWNhdGUuYXJndHlwZXMgPSBbCiAgICAgICAgU1NMQ29udGV4dFJlZiwKICAgICAgICBDRkFycmF5UmVmCiAgICBdCiAgICBTZWN1cml0eS5TU0xTZXRDZXJ0aWZpY2F0ZS5yZXN0eXBlID0gT1NTdGF0dXMKCiAgICBTZWN1cml0eS5TU0xTZXRDZXJ0aWZpY2F0ZUF1dGhvcml0aWVzLmFyZ3R5cGVzID0gWwogICAgICAgIFNTTENvbnRleHRSZWYsCiAgICAgICAgQ0ZUeXBlUmVmLAogICAgICAgIEJvb2xlYW4KICAgIF0KICAgIFNlY3VyaXR5LlNTTFNldENlcnRpZmljYXRlQXV0aG9yaXRpZXMucmVzdHlwZSA9IE9TU3RhdHVzCgogICAgU2VjdXJpdHkuU1NMU2V0Q29ubmVjdGlvbi5hcmd0eXBlcyA9IFsKICAgICAgICBTU0xDb250ZXh0UmVmLAogICAgICAgIFNTTENvbm5lY3Rpb25SZWYKICAgIF0KICAgIFNlY3VyaXR5LlNTTFNldENvbm5lY3Rpb24ucmVzdHlwZSA9IE9TU3RhdHVzCgogICAgU2VjdXJpdHkuU1NMU2V0UGVlckRvbWFpbk5hbWUuYXJndHlwZXMgPSBbCiAgICAgICAgU1NMQ29udGV4dFJlZiwKICAgICAgICBjX2NoYXJfcCwKICAgICAgICBjX3NpemVfdAogICAgXQogICAgU2VjdXJpdHkuU1NMU2V0UGVlckRvbWFpbk5hbWUucmVzdHlwZSA9IE9TU3RhdHVzCgogICAgU2VjdXJpdHkuU1NMSGFuZHNoYWtlLmFyZ3R5cGVzID0gWwogICAgICAgIFNTTENvbnRleHRSZWYKICAgIF0KICAgIFNlY3VyaXR5LlNTTEhhbmRzaGFrZS5yZXN0eXBlID0gT1NTdGF0dXMKCiAgICBTZWN1cml0eS5TU0xSZWFkLmFyZ3R5cGVzID0gWwogICAgICAgIFNTTENvbnRleHRSZWYsCiAgICAgICAgY19jaGFyX3AsCiAgICAgICAgY19zaXplX3QsCiAgICAgICAgUE9JTlRFUihjX3NpemVfdCkKICAgIF0KICAgIFNlY3VyaXR5LlNTTFJlYWQucmVzdHlwZSA9IE9TU3RhdHVzCgogICAgU2VjdXJpdHkuU1NMV3JpdGUuYXJndHlwZXMgPSBbCiAgICAgICAgU1NMQ29udGV4dFJlZiwKICAgICAgICBjX2NoYXJfcCwKICAgICAgICBjX3NpemVfdCwKICAgICAgICBQT0lOVEVSKGNfc2l6ZV90KQogICAgXQogICAgU2VjdXJpdHkuU1NMV3JpdGUucmVzdHlwZSA9IE9TU3RhdHVzCgogICAgU2VjdXJpdHkuU1NMQ2xvc2UuYXJndHlwZXMgPSBbCiAgICAgICAgU1NMQ29udGV4dFJlZgogICAgXQogICAgU2VjdXJpdHkuU1NMQ2xvc2UucmVzdHlwZSA9IE9TU3RhdHVzCgogICAgU2VjdXJpdHkuU1NMR2V0TnVtYmVyU3VwcG9ydGVkQ2lwaGVycy5hcmd0eXBlcyA9IFsKICAgICAgICBTU0xDb250ZXh0UmVmLAogICAgICAgIFBPSU5URVIoY19zaXplX3QpCiAgICBdCiAgICBTZWN1cml0eS5TU0xHZXROdW1iZXJTdXBwb3J0ZWRDaXBoZXJzLnJlc3R5cGUgPSBPU1N0YXR1cwoKICAgIFNlY3VyaXR5LlNTTEdldFN1cHBvcnRlZENpcGhlcnMuYXJndHlwZXMgPSBbCiAgICAgICAgU1NMQ29udGV4dFJlZiwKICAgICAgICBQT0lOVEVSKFNTTENpcGhlclN1aXRlKSwKICAgICAgICBQT0lOVEVSKGNfc2l6ZV90KQogICAgXQogICAgU2VjdXJpdHkuU1NMR2V0U3VwcG9ydGVkQ2lwaGVycy5yZXN0eXBlID0gT1NTdGF0dXMKCiAgICBTZWN1cml0eS5TU0xTZXRFbmFibGVkQ2lwaGVycy5hcmd0eXBlcyA9IFsKICAgICAgICBTU0xDb250ZXh0UmVmLAogICAgICAgIFBPSU5URVIoU1NMQ2lwaGVyU3VpdGUpLAogICAgICAgIGNfc2l6ZV90CiAgICBdCiAgICBTZWN1cml0eS5TU0xTZXRFbmFibGVkQ2lwaGVycy5yZXN0eXBlID0gT1NTdGF0dXMKCiAgICBTZWN1cml0eS5TU0xHZXROdW1iZXJFbmFibGVkQ2lwaGVycy5hcmd0eXBlID0gWwogICAgICAgIFNTTENvbnRleHRSZWYsCiAgICAgICAgUE9JTlRFUihjX3NpemVfdCkKICAgIF0KICAgIFNlY3VyaXR5LlNTTEdldE51bWJlckVuYWJsZWRDaXBoZXJzLnJlc3R5cGUgPSBPU1N0YXR1cwoKICAgIFNlY3VyaXR5LlNTTEdldEVuYWJsZWRDaXBoZXJzLmFyZ3R5cGVzID0gWwogICAgICAgIFNTTENvbnRleHRSZWYsCiAgICAgICAgUE9JTlRFUihTU0xDaXBoZXJTdWl0ZSksCiAgICAgICAgUE9JTlRFUihjX3NpemVfdCkKICAgIF0KICAgIFNlY3VyaXR5LlNTTEdldEVuYWJsZWRDaXBoZXJzLnJlc3R5cGUgPSBPU1N0YXR1cwoKICAgIFNlY3VyaXR5LlNTTEdldE5lZ290aWF0ZWRDaXBoZXIuYXJndHlwZXMgPSBbCiAgICAgICAgU1NMQ29udGV4dFJlZiwKICAgICAgICBQT0lOVEVSKFNTTENpcGhlclN1aXRlKQogICAgXQogICAgU2VjdXJpdHkuU1NMR2V0TmVnb3RpYXRlZENpcGhlci5yZXN0eXBlID0gT1NTdGF0dXMKCiAgICBTZWN1cml0eS5TU0xHZXROZWdvdGlhdGVkUHJvdG9jb2xWZXJzaW9uLmFyZ3R5cGVzID0gWwogICAgICAgIFNTTENvbnRleHRSZWYsCiAgICAgICAgUE9JTlRFUihTU0xQcm90b2NvbCkKICAgIF0KICAgIFNlY3VyaXR5LlNTTEdldE5lZ290aWF0ZWRQcm90b2NvbFZlcnNpb24ucmVzdHlwZSA9IE9TU3RhdHVzCgogICAgU2VjdXJpdHkuU1NMQ29weVBlZXJUcnVzdC5hcmd0eXBlcyA9IFsKICAgICAgICBTU0xDb250ZXh0UmVmLAogICAgICAgIFBPSU5URVIoU2VjVHJ1c3RSZWYpCiAgICBdCiAgICBTZWN1cml0eS5TU0xDb3B5UGVlclRydXN0LnJlc3R5cGUgPSBPU1N0YXR1cwoKICAgIFNlY3VyaXR5LlNlY1RydXN0U2V0QW5jaG9yQ2VydGlmaWNhdGVzLmFyZ3R5cGVzID0gWwogICAgICAgIFNlY1RydXN0UmVmLAogICAgICAgIENGQXJyYXlSZWYKICAgIF0KICAgIFNlY3VyaXR5LlNlY1RydXN0U2V0QW5jaG9yQ2VydGlmaWNhdGVzLnJlc3R5cGUgPSBPU1N0YXR1cwoKICAgIFNlY3VyaXR5LlNlY1RydXN0U2V0QW5jaG9yQ2VydGlmaWNhdGVzT25seS5hcmdzdHlwZXMgPSBbCiAgICAgICAgU2VjVHJ1c3RSZWYsCiAgICAgICAgQm9vbGVhbgogICAgXQogICAgU2VjdXJpdHkuU2VjVHJ1c3RTZXRBbmNob3JDZXJ0aWZpY2F0ZXNPbmx5LnJlc3R5cGUgPSBPU1N0YXR1cwoKICAgIFNlY3VyaXR5LlNlY1RydXN0RXZhbHVhdGUuYXJndHlwZXMgPSBbCiAgICAgICAgU2VjVHJ1c3RSZWYsCiAgICAgICAgUE9JTlRFUihTZWNUcnVzdFJlc3VsdFR5cGUpCiAgICBdCiAgICBTZWN1cml0eS5TZWNUcnVzdEV2YWx1YXRlLnJlc3R5cGUgPSBPU1N0YXR1cwoKICAgIFNlY3VyaXR5LlNlY1RydXN0R2V0Q2VydGlmaWNhdGVDb3VudC5hcmd0eXBlcyA9IFsKICAgICAgICBTZWNUcnVzdFJlZgogICAgXQogICAgU2VjdXJpdHkuU2VjVHJ1c3RHZXRDZXJ0aWZpY2F0ZUNvdW50LnJlc3R5cGUgPSBDRkluZGV4CgogICAgU2VjdXJpdHkuU2VjVHJ1c3RHZXRDZXJ0aWZpY2F0ZUF0SW5kZXguYXJndHlwZXMgPSBbCiAgICAgICAgU2VjVHJ1c3RSZWYsCiAgICAgICAgQ0ZJbmRleAogICAgXQogICAgU2VjdXJpdHkuU2VjVHJ1c3RHZXRDZXJ0aWZpY2F0ZUF0SW5kZXgucmVzdHlwZSA9IFNlY0NlcnRpZmljYXRlUmVmCgogICAgU2VjdXJpdHkuU1NMQ3JlYXRlQ29udGV4dC5hcmd0eXBlcyA9IFsKICAgICAgICBDRkFsbG9jYXRvclJlZiwKICAgICAgICBTU0xQcm90b2NvbFNpZGUsCiAgICAgICAgU1NMQ29ubmVjdGlvblR5cGUKICAgIF0KICAgIFNlY3VyaXR5LlNTTENyZWF0ZUNvbnRleHQucmVzdHlwZSA9IFNTTENvbnRleHRSZWYKCiAgICBTZWN1cml0eS5TU0xTZXRTZXNzaW9uT3B0aW9uLmFyZ3R5cGVzID0gWwogICAgICAgIFNTTENvbnRleHRSZWYsCiAgICAgICAgU1NMU2Vzc2lvbk9wdGlvbiwKICAgICAgICBCb29sZWFuCiAgICBdCiAgICBTZWN1cml0eS5TU0xTZXRTZXNzaW9uT3B0aW9uLnJlc3R5cGUgPSBPU1N0YXR1cwoKICAgIFNlY3VyaXR5LlNTTFNldFByb3RvY29sVmVyc2lvbk1pbi5hcmd0eXBlcyA9IFsKICAgICAgICBTU0xDb250ZXh0UmVmLAogICAgICAgIFNTTFByb3RvY29sCiAgICBdCiAgICBTZWN1cml0eS5TU0xTZXRQcm90b2NvbFZlcnNpb25NaW4ucmVzdHlwZSA9IE9TU3RhdHVzCgogICAgU2VjdXJpdHkuU1NMU2V0UHJvdG9jb2xWZXJzaW9uTWF4LmFyZ3R5cGVzID0gWwogICAgICAgIFNTTENvbnRleHRSZWYsCiAgICAgICAgU1NMUHJvdG9jb2wKICAgIF0KICAgIFNlY3VyaXR5LlNTTFNldFByb3RvY29sVmVyc2lvbk1heC5yZXN0eXBlID0gT1NTdGF0dXMKCiAgICBTZWN1cml0eS5TZWNDb3B5RXJyb3JNZXNzYWdlU3RyaW5nLmFyZ3R5cGVzID0gWwogICAgICAgIE9TU3RhdHVzLAogICAgICAgIGNfdm9pZF9wCiAgICBdCiAgICBTZWN1cml0eS5TZWNDb3B5RXJyb3JNZXNzYWdlU3RyaW5nLnJlc3R5cGUgPSBDRlN0cmluZ1JlZgoKICAgIFNlY3VyaXR5LlNTTFJlYWRGdW5jID0gU1NMUmVhZEZ1bmMKICAgIFNlY3VyaXR5LlNTTFdyaXRlRnVuYyA9IFNTTFdyaXRlRnVuYwogICAgU2VjdXJpdHkuU1NMQ29udGV4dFJlZiA9IFNTTENvbnRleHRSZWYKICAgIFNlY3VyaXR5LlNTTFByb3RvY29sID0gU1NMUHJvdG9jb2wKICAgIFNlY3VyaXR5LlNTTENpcGhlclN1aXRlID0gU1NMQ2lwaGVyU3VpdGUKICAgIFNlY3VyaXR5LlNlY0lkZW50aXR5UmVmID0gU2VjSWRlbnRpdHlSZWYKICAgIFNlY3VyaXR5LlNlY0tleWNoYWluUmVmID0gU2VjS2V5Y2hhaW5SZWYKICAgIFNlY3VyaXR5LlNlY1RydXN0UmVmID0gU2VjVHJ1c3RSZWYKICAgIFNlY3VyaXR5LlNlY1RydXN0UmVzdWx0VHlwZSA9IFNlY1RydXN0UmVzdWx0VHlwZQogICAgU2VjdXJpdHkuU2VjRXh0ZXJuYWxGb3JtYXQgPSBTZWNFeHRlcm5hbEZvcm1hdAogICAgU2VjdXJpdHkuT1NTdGF0dXMgPSBPU1N0YXR1cwoKICAgIFNlY3VyaXR5LmtTZWNJbXBvcnRFeHBvcnRQYXNzcGhyYXNlID0gQ0ZTdHJpbmdSZWYuaW5fZGxsKAogICAgICAgIFNlY3VyaXR5LCAna1NlY0ltcG9ydEV4cG9ydFBhc3NwaHJhc2UnCiAgICApCiAgICBTZWN1cml0eS5rU2VjSW1wb3J0SXRlbUlkZW50aXR5ID0gQ0ZTdHJpbmdSZWYuaW5fZGxsKAogICAgICAgIFNlY3VyaXR5LCAna1NlY0ltcG9ydEl0ZW1JZGVudGl0eScKICAgICkKCiAgICAjIENvcmVGb3VuZGF0aW9uIHRpbWUhCiAgICBDb3JlRm91bmRhdGlvbi5DRlJldGFpbi5hcmd0eXBlcyA9IFsKICAgICAgICBDRlR5cGVSZWYKICAgIF0KICAgIENvcmVGb3VuZGF0aW9uLkNGUmV0YWluLnJlc3R5cGUgPSBDRlR5cGVSZWYKCiAgICBDb3JlRm91bmRhdGlvbi5DRlJlbGVhc2UuYXJndHlwZXMgPSBbCiAgICAgICAgQ0ZUeXBlUmVmCiAgICBdCiAgICBDb3JlRm91bmRhdGlvbi5DRlJlbGVhc2UucmVzdHlwZSA9IE5vbmUKCiAgICBDb3JlRm91bmRhdGlvbi5DRkdldFR5cGVJRC5hcmd0eXBlcyA9IFsKICAgICAgICBDRlR5cGVSZWYKICAgIF0KICAgIENvcmVGb3VuZGF0aW9uLkNGR2V0VHlwZUlELnJlc3R5cGUgPSBDRlR5cGVJRAoKICAgIENvcmVGb3VuZGF0aW9uLkNGU3RyaW5nQ3JlYXRlV2l0aENTdHJpbmcuYXJndHlwZXMgPSBbCiAgICAgICAgQ0ZBbGxvY2F0b3JSZWYsCiAgICAgICAgY19jaGFyX3AsCiAgICAgICAgQ0ZTdHJpbmdFbmNvZGluZwogICAgXQogICAgQ29yZUZvdW5kYXRpb24uQ0ZTdHJpbmdDcmVhdGVXaXRoQ1N0cmluZy5yZXN0eXBlID0gQ0ZTdHJpbmdSZWYKCiAgICBDb3JlRm91bmRhdGlvbi5DRlN0cmluZ0dldENTdHJpbmdQdHIuYXJndHlwZXMgPSBbCiAgICAgICAgQ0ZTdHJpbmdSZWYsCiAgICAgICAgQ0ZTdHJpbmdFbmNvZGluZwogICAgXQogICAgQ29yZUZvdW5kYXRpb24uQ0ZTdHJpbmdHZXRDU3RyaW5nUHRyLnJlc3R5cGUgPSBjX2NoYXJfcAoKICAgIENvcmVGb3VuZGF0aW9uLkNGU3RyaW5nR2V0Q1N0cmluZy5hcmd0eXBlcyA9IFsKICAgICAgICBDRlN0cmluZ1JlZiwKICAgICAgICBjX2NoYXJfcCwKICAgICAgICBDRkluZGV4LAogICAgICAgIENGU3RyaW5nRW5jb2RpbmcKICAgIF0KICAgIENvcmVGb3VuZGF0aW9uLkNGU3RyaW5nR2V0Q1N0cmluZy5yZXN0eXBlID0gY19ib29sCgogICAgQ29yZUZvdW5kYXRpb24uQ0ZEYXRhQ3JlYXRlLmFyZ3R5cGVzID0gWwogICAgICAgIENGQWxsb2NhdG9yUmVmLAogICAgICAgIGNfY2hhcl9wLAogICAgICAgIENGSW5kZXgKICAgIF0KICAgIENvcmVGb3VuZGF0aW9uLkNGRGF0YUNyZWF0ZS5yZXN0eXBlID0gQ0ZEYXRhUmVmCgogICAgQ29yZUZvdW5kYXRpb24uQ0ZEYXRhR2V0TGVuZ3RoLmFyZ3R5cGVzID0gWwogICAgICAgIENGRGF0YVJlZgogICAgXQogICAgQ29yZUZvdW5kYXRpb24uQ0ZEYXRhR2V0TGVuZ3RoLnJlc3R5cGUgPSBDRkluZGV4CgogICAgQ29yZUZvdW5kYXRpb24uQ0ZEYXRhR2V0Qnl0ZVB0ci5hcmd0eXBlcyA9IFsKICAgICAgICBDRkRhdGFSZWYKICAgIF0KICAgIENvcmVGb3VuZGF0aW9uLkNGRGF0YUdldEJ5dGVQdHIucmVzdHlwZSA9IGNfdm9pZF9wCgogICAgQ29yZUZvdW5kYXRpb24uQ0ZEaWN0aW9uYXJ5Q3JlYXRlLmFyZ3R5cGVzID0gWwogICAgICAgIENGQWxsb2NhdG9yUmVmLAogICAgICAgIFBPSU5URVIoQ0ZUeXBlUmVmKSwKICAgICAgICBQT0lOVEVSKENGVHlwZVJlZiksCiAgICAgICAgQ0ZJbmRleCwKICAgICAgICBDRkRpY3Rpb25hcnlLZXlDYWxsQmFja3MsCiAgICAgICAgQ0ZEaWN0aW9uYXJ5VmFsdWVDYWxsQmFja3MKICAgIF0KICAgIENvcmVGb3VuZGF0aW9uLkNGRGljdGlvbmFyeUNyZWF0ZS5yZXN0eXBlID0gQ0ZEaWN0aW9uYXJ5UmVmCgogICAgQ29yZUZvdW5kYXRpb24uQ0ZEaWN0aW9uYXJ5R2V0VmFsdWUuYXJndHlwZXMgPSBbCiAgICAgICAgQ0ZEaWN0aW9uYXJ5UmVmLAogICAgICAgIENGVHlwZVJlZgogICAgXQogICAgQ29yZUZvdW5kYXRpb24uQ0ZEaWN0aW9uYXJ5R2V0VmFsdWUucmVzdHlwZSA9IENGVHlwZVJlZgoKICAgIENvcmVGb3VuZGF0aW9uLkNGQXJyYXlDcmVhdGUuYXJndHlwZXMgPSBbCiAgICAgICAgQ0ZBbGxvY2F0b3JSZWYsCiAgICAgICAgUE9JTlRFUihDRlR5cGVSZWYpLAogICAgICAgIENGSW5kZXgsCiAgICAgICAgQ0ZBcnJheUNhbGxCYWNrcywKICAgIF0KICAgIENvcmVGb3VuZGF0aW9uLkNGQXJyYXlDcmVhdGUucmVzdHlwZSA9IENGQXJyYXlSZWYKCiAgICBDb3JlRm91bmRhdGlvbi5DRkFycmF5Q3JlYXRlTXV0YWJsZS5hcmd0eXBlcyA9IFsKICAgICAgICBDRkFsbG9jYXRvclJlZiwKICAgICAgICBDRkluZGV4LAogICAgICAgIENGQXJyYXlDYWxsQmFja3MKICAgIF0KICAgIENvcmVGb3VuZGF0aW9uLkNGQXJyYXlDcmVhdGVNdXRhYmxlLnJlc3R5cGUgPSBDRk11dGFibGVBcnJheVJlZgoKICAgIENvcmVGb3VuZGF0aW9uLkNGQXJyYXlBcHBlbmRWYWx1ZS5hcmd0eXBlcyA9IFsKICAgICAgICBDRk11dGFibGVBcnJheVJlZiwKICAgICAgICBjX3ZvaWRfcAogICAgXQogICAgQ29yZUZvdW5kYXRpb24uQ0ZBcnJheUFwcGVuZFZhbHVlLnJlc3R5cGUgPSBOb25lCgogICAgQ29yZUZvdW5kYXRpb24uQ0ZBcnJheUdldENvdW50LmFyZ3R5cGVzID0gWwogICAgICAgIENGQXJyYXlSZWYKICAgIF0KICAgIENvcmVGb3VuZGF0aW9uLkNGQXJyYXlHZXRDb3VudC5yZXN0eXBlID0gQ0ZJbmRleAoKICAgIENvcmVGb3VuZGF0aW9uLkNGQXJyYXlHZXRWYWx1ZUF0SW5kZXguYXJndHlwZXMgPSBbCiAgICAgICAgQ0ZBcnJheVJlZiwKICAgICAgICBDRkluZGV4CiAgICBdCiAgICBDb3JlRm91bmRhdGlvbi5DRkFycmF5R2V0VmFsdWVBdEluZGV4LnJlc3R5cGUgPSBjX3ZvaWRfcAoKICAgIENvcmVGb3VuZGF0aW9uLmtDRkFsbG9jYXRvckRlZmF1bHQgPSBDRkFsbG9jYXRvclJlZi5pbl9kbGwoCiAgICAgICAgQ29yZUZvdW5kYXRpb24sICdrQ0ZBbGxvY2F0b3JEZWZhdWx0JwogICAgKQogICAgQ29yZUZvdW5kYXRpb24ua0NGVHlwZUFycmF5Q2FsbEJhY2tzID0gY192b2lkX3AuaW5fZGxsKENvcmVGb3VuZGF0aW9uLCAna0NGVHlwZUFycmF5Q2FsbEJhY2tzJykKICAgIENvcmVGb3VuZGF0aW9uLmtDRlR5cGVEaWN0aW9uYXJ5S2V5Q2FsbEJhY2tzID0gY192b2lkX3AuaW5fZGxsKAogICAgICAgIENvcmVGb3VuZGF0aW9uLCAna0NGVHlwZURpY3Rpb25hcnlLZXlDYWxsQmFja3MnCiAgICApCiAgICBDb3JlRm91bmRhdGlvbi5rQ0ZUeXBlRGljdGlvbmFyeVZhbHVlQ2FsbEJhY2tzID0gY192b2lkX3AuaW5fZGxsKAogICAgICAgIENvcmVGb3VuZGF0aW9uLCAna0NGVHlwZURpY3Rpb25hcnlWYWx1ZUNhbGxCYWNrcycKICAgICkKCiAgICBDb3JlRm91bmRhdGlvbi5DRlR5cGVSZWYgPSBDRlR5cGVSZWYKICAgIENvcmVGb3VuZGF0aW9uLkNGQXJyYXlSZWYgPSBDRkFycmF5UmVmCiAgICBDb3JlRm91bmRhdGlvbi5DRlN0cmluZ1JlZiA9IENGU3RyaW5nUmVmCiAgICBDb3JlRm91bmRhdGlvbi5DRkRpY3Rpb25hcnlSZWYgPSBDRkRpY3Rpb25hcnlSZWYKCmV4Y2VwdCAoQXR0cmlidXRlRXJyb3IpOgogICAgcmFpc2UgSW1wb3J0RXJyb3IoJ0Vycm9yIGluaXRpYWxpemluZyBjdHlwZXMnKQoKCmNsYXNzIENGQ29uc3Qob2JqZWN0KToKICAgICIiIgogICAgQSBjbGFzcyBvYmplY3QgdGhhdCBhY3RzIGFzIGVzc2VudGlhbGx5IGEgbmFtZXNwYWNlIGZvciBDb3JlRm91bmRhdGlvbgogICAgY29uc3RhbnRzLgogICAgIiIiCiAgICBrQ0ZTdHJpbmdFbmNvZGluZ1VURjggPSBDRlN0cmluZ0VuY29kaW5nKDB4MDgwMDAxMDApCgoKY2xhc3MgU2VjdXJpdHlDb25zdChvYmplY3QpOgogICAgIiIiCiAgICBBIGNsYXNzIG9iamVjdCB0aGF0IGFjdHMgYXMgZXNzZW50aWFsbHkgYSBuYW1lc3BhY2UgZm9yIFNlY3VyaXR5IGNvbnN0YW50cy4KICAgICIiIgogICAga1NTTFNlc3Npb25PcHRpb25CcmVha09uU2VydmVyQXV0aCA9IDAKCiAgICBrU1NMUHJvdG9jb2wyID0gMQogICAga1NTTFByb3RvY29sMyA9IDIKICAgIGtUTFNQcm90b2NvbDEgPSA0CiAgICBrVExTUHJvdG9jb2wxMSA9IDcKICAgIGtUTFNQcm90b2NvbDEyID0gOAoKICAgIGtTU0xDbGllbnRTaWRlID0gMQogICAga1NTTFN0cmVhbVR5cGUgPSAwCgogICAga1NlY0Zvcm1hdFBFTVNlcXVlbmNlID0gMTAKCiAgICBrU2VjVHJ1c3RSZXN1bHRJbnZhbGlkID0gMAogICAga1NlY1RydXN0UmVzdWx0UHJvY2VlZCA9IDEKICAgICMgVGhpcyBnYXAgaXMgcHJlc2VudCBvbiBwdXJwb3NlOiB0aGlzIHdhcyBrU2VjVHJ1c3RSZXN1bHRDb25maXJtLCB3aGljaAogICAgIyBpcyBkZXByZWNhdGVkLgogICAga1NlY1RydXN0UmVzdWx0RGVueSA9IDMKICAgIGtTZWNUcnVzdFJlc3VsdFVuc3BlY2lmaWVkID0gNAogICAga1NlY1RydXN0UmVzdWx0UmVjb3ZlcmFibGVUcnVzdEZhaWx1cmUgPSA1CiAgICBrU2VjVHJ1c3RSZXN1bHRGYXRhbFRydXN0RmFpbHVyZSA9IDYKICAgIGtTZWNUcnVzdFJlc3VsdE90aGVyRXJyb3IgPSA3CgogICAgZXJyU1NMUHJvdG9jb2wgPSAtOTgwMAogICAgZXJyU1NMV291bGRCbG9jayA9IC05ODAzCiAgICBlcnJTU0xDbG9zZWRHcmFjZWZ1bCA9IC05ODA1CiAgICBlcnJTU0xDbG9zZWROb05vdGlmeSA9IC05ODE2CiAgICBlcnJTU0xDbG9zZWRBYm9ydCA9IC05ODA2CgogICAgZXJyU1NMWENlcnRDaGFpbkludmFsaWQgPSAtOTgwNwogICAgZXJyU1NMQ3J5cHRvID0gLTk4MDkKICAgIGVyclNTTEludGVybmFsID0gLTk4MTAKICAgIGVyclNTTENlcnRFeHBpcmVkID0gLTk4MTQKICAgIGVyclNTTENlcnROb3RZZXRWYWxpZCA9IC05ODE1CiAgICBlcnJTU0xVbmtub3duUm9vdENlcnQgPSAtOTgxMgogICAgZXJyU1NMTm9Sb290Q2VydCA9IC05ODEzCiAgICBlcnJTU0xIb3N0TmFtZU1pc21hdGNoID0gLTk4NDMKICAgIGVyclNTTFBlZXJIYW5kc2hha2VGYWlsID0gLTk4MjQKICAgIGVyclNTTFBlZXJVc2VyQ2FuY2VsbGVkID0gLTk4MzkKICAgIGVyclNTTFdlYWtQZWVyRXBoZW1lcmFsREhLZXkgPSAtOTg1MAogICAgZXJyU1NMU2VydmVyQXV0aENvbXBsZXRlZCA9IC05ODQxCiAgICBlcnJTU0xSZWNvcmRPdmVyZmxvdyA9IC05ODQ3CgogICAgZXJyU2VjVmVyaWZ5RmFpbGVkID0gLTY3ODA4CiAgICBlcnJTZWNOb1RydXN0U2V0dGluZ3MgPSAtMjUyNjMKICAgIGVyclNlY0l0ZW1Ob3RGb3VuZCA9IC0yNTMwMAogICAgZXJyU2VjSW52YWxpZFRydXN0U2V0dGluZ3MgPSAtMjUyNjIKCiAgICAjIENpcGhlciBzdWl0ZXMuIFdlIG9ubHkgcGljayB0aGUgb25lcyBvdXIgZGVmYXVsdCBjaXBoZXIgc3RyaW5nIGFsbG93cy4KICAgIFRMU19FQ0RIRV9FQ0RTQV9XSVRIX0FFU18yNTZfR0NNX1NIQTM4NCA9IDB4QzAyQwogICAgVExTX0VDREhFX1JTQV9XSVRIX0FFU18yNTZfR0NNX1NIQTM4NCA9IDB4QzAzMAogICAgVExTX0VDREhFX0VDRFNBX1dJVEhfQUVTXzEyOF9HQ01fU0hBMjU2ID0gMHhDMDJCCiAgICBUTFNfRUNESEVfUlNBX1dJVEhfQUVTXzEyOF9HQ01fU0hBMjU2ID0gMHhDMDJGCiAgICBUTFNfREhFX0RTU19XSVRIX0FFU18yNTZfR0NNX1NIQTM4NCA9IDB4MDBBMwogICAgVExTX0RIRV9SU0FfV0lUSF9BRVNfMjU2X0dDTV9TSEEzODQgPSAweDAwOUYKICAgIFRMU19ESEVfRFNTX1dJVEhfQUVTXzEyOF9HQ01fU0hBMjU2ID0gMHgwMEEyCiAgICBUTFNfREhFX1JTQV9XSVRIX0FFU18xMjhfR0NNX1NIQTI1NiA9IDB4MDA5RQogICAgVExTX0VDREhFX0VDRFNBX1dJVEhfQUVTXzI1Nl9DQkNfU0hBMzg0ID0gMHhDMDI0CiAgICBUTFNfRUNESEVfUlNBX1dJVEhfQUVTXzI1Nl9DQkNfU0hBMzg0ID0gMHhDMDI4CiAgICBUTFNfRUNESEVfRUNEU0FfV0lUSF9BRVNfMjU2X0NCQ19TSEEgPSAweEMwMEEKICAgIFRMU19FQ0RIRV9SU0FfV0lUSF9BRVNfMjU2X0NCQ19TSEEgPSAweEMwMTQKICAgIFRMU19ESEVfUlNBX1dJVEhfQUVTXzI1Nl9DQkNfU0hBMjU2ID0gMHgwMDZCCiAgICBUTFNfREhFX0RTU19XSVRIX0FFU18yNTZfQ0JDX1NIQTI1NiA9IDB4MDA2QQogICAgVExTX0RIRV9SU0FfV0lUSF9BRVNfMjU2X0NCQ19TSEEgPSAweDAwMzkKICAgIFRMU19ESEVfRFNTX1dJVEhfQUVTXzI1Nl9DQkNfU0hBID0gMHgwMDM4CiAgICBUTFNfRUNESEVfRUNEU0FfV0lUSF9BRVNfMTI4X0NCQ19TSEEyNTYgPSAweEMwMjMKICAgIFRMU19FQ0RIRV9SU0FfV0lUSF9BRVNfMTI4X0NCQ19TSEEyNTYgPSAweEMwMjcKICAgIFRMU19FQ0RIRV9FQ0RTQV9XSVRIX0FFU18xMjhfQ0JDX1NIQSA9IDB4QzAwOQogICAgVExTX0VDREhFX1JTQV9XSVRIX0FFU18xMjhfQ0JDX1NIQSA9IDB4QzAxMwogICAgVExTX0RIRV9SU0FfV0lUSF9BRVNfMTI4X0NCQ19TSEEyNTYgPSAweDAwNjcKICAgIFRMU19ESEVfRFNTX1dJVEhfQUVTXzEyOF9DQkNfU0hBMjU2ID0gMHgwMDQwCiAgICBUTFNfREhFX1JTQV9XSVRIX0FFU18xMjhfQ0JDX1NIQSA9IDB4MDAzMwogICAgVExTX0RIRV9EU1NfV0lUSF9BRVNfMTI4X0NCQ19TSEEgPSAweDAwMzIKICAgIFRMU19SU0FfV0lUSF9BRVNfMjU2X0dDTV9TSEEzODQgPSAweDAwOUQKICAgIFRMU19SU0FfV0lUSF9BRVNfMTI4X0dDTV9TSEEyNTYgPSAweDAwOUMKICAgIFRMU19SU0FfV0lUSF9BRVNfMjU2X0NCQ19TSEEyNTYgPSAweDAwM0QKICAgIFRMU19SU0FfV0lUSF9BRVNfMTI4X0NCQ19TSEEyNTYgPSAweDAwM0MKICAgIFRMU19SU0FfV0lUSF9BRVNfMjU2X0NCQ19TSEEgPSAweDAwMzUKICAgIFRMU19SU0FfV0lUSF9BRVNfMTI4X0NCQ19TSEEgPSAweDAwMkYKICAgIFRMU19BRVNfMTI4X0dDTV9TSEEyNTYgPSAweDEzMDEKICAgIFRMU19BRVNfMjU2X0dDTV9TSEEzODQgPSAweDEzMDIKICAgIFRMU19DSEFDSEEyMF9QT0xZMTMwNV9TSEEyNTYgPSAweDEzMDMKUEsDBBQAAAAAAAAAIQAEr9yQHi8AAB4vAABWAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL2NvbnRyaWIvX3NlY3VyZXRyYW5zcG9ydC9sb3dfbGV2ZWwucHkiIiIKTG93LWxldmVsIGhlbHBlcnMgZm9yIHRoZSBTZWN1cmVUcmFuc3BvcnQgYmluZGluZ3MuCgpUaGVzZSBhcmUgUHl0aG9uIGZ1bmN0aW9ucyB0aGF0IGFyZSBub3QgZGlyZWN0bHkgcmVsYXRlZCB0byB0aGUgaGlnaC1sZXZlbCBBUElzCmJ1dCBhcmUgbmVjZXNzYXJ5IHRvIGdldCB0aGVtIHRvIHdvcmsuIFRoZXkgaW5jbHVkZSBhIHdob2xlIGJ1bmNoIG9mIGxvdy1sZXZlbApDb3JlRm91bmRhdGlvbiBtZXNzaW5nIGFib3V0IGFuZCBtZW1vcnkgbWFuYWdlbWVudC4gVGhlIGNvbmNlcm5zIGluIHRoaXMgbW9kdWxlCmFyZSBhbG1vc3QgZW50aXJlbHkgYWJvdXQgdHJ5aW5nIHRvIGF2b2lkIG1lbW9yeSBsZWFrcyBhbmQgcHJvdmlkaW5nCmFwcHJvcHJpYXRlIGFuZCB1c2VmdWwgYXNzaXN0YW5jZSB0byB0aGUgaGlnaGVyLWxldmVsIGNvZGUuCiIiIgppbXBvcnQgYmFzZTY0CmltcG9ydCBjdHlwZXMKaW1wb3J0IGl0ZXJ0b29scwppbXBvcnQgcmUKaW1wb3J0IG9zCmltcG9ydCBzc2wKaW1wb3J0IHRlbXBmaWxlCgpmcm9tIC5iaW5kaW5ncyBpbXBvcnQgU2VjdXJpdHksIENvcmVGb3VuZGF0aW9uLCBDRkNvbnN0CgoKIyBUaGlzIHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyB1c2VkIHRvIGdyYWIgUEVNIGRhdGEgb3V0IG9mIGEgUEVNIGJ1bmRsZS4KX1BFTV9DRVJUU19SRSA9IHJlLmNvbXBpbGUoCiAgICBiIi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLVxuKC4qPylcbi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0iLCByZS5ET1RBTEwKKQoKCmRlZiBfY2ZfZGF0YV9mcm9tX2J5dGVzKGJ5dGVzdHJpbmcpOgogICAgIiIiCiAgICBHaXZlbiBhIGJ5dGVzdHJpbmcsIGNyZWF0ZSBhIENGRGF0YSBvYmplY3QgZnJvbSBpdC4gVGhpcyBDRkRhdGEgb2JqZWN0IG11c3QKICAgIGJlIENGUmVsZWFzZWQgYnkgdGhlIGNhbGxlci4KICAgICIiIgogICAgcmV0dXJuIENvcmVGb3VuZGF0aW9uLkNGRGF0YUNyZWF0ZSgKICAgICAgICBDb3JlRm91bmRhdGlvbi5rQ0ZBbGxvY2F0b3JEZWZhdWx0LCBieXRlc3RyaW5nLCBsZW4oYnl0ZXN0cmluZykKICAgICkKCgpkZWYgX2NmX2RpY3Rpb25hcnlfZnJvbV90dXBsZXModHVwbGVzKToKICAgICIiIgogICAgR2l2ZW4gYSBsaXN0IG9mIFB5dGhvbiB0dXBsZXMsIGNyZWF0ZSBhbiBhc3NvY2lhdGVkIENGRGljdGlvbmFyeS4KICAgICIiIgogICAgZGljdGlvbmFyeV9zaXplID0gbGVuKHR1cGxlcykKCiAgICAjIFdlIG5lZWQgdG8gZ2V0IHRoZSBkaWN0aW9uYXJ5IGtleXMgYW5kIHZhbHVlcyBvdXQgaW4gdGhlIHNhbWUgb3JkZXIuCiAgICBrZXlzID0gKHRbMF0gZm9yIHQgaW4gdHVwbGVzKQogICAgdmFsdWVzID0gKHRbMV0gZm9yIHQgaW4gdHVwbGVzKQogICAgY2Zfa2V5cyA9IChDb3JlRm91bmRhdGlvbi5DRlR5cGVSZWYgKiBkaWN0aW9uYXJ5X3NpemUpKCprZXlzKQogICAgY2ZfdmFsdWVzID0gKENvcmVGb3VuZGF0aW9uLkNGVHlwZVJlZiAqIGRpY3Rpb25hcnlfc2l6ZSkoKnZhbHVlcykKCiAgICByZXR1cm4gQ29yZUZvdW5kYXRpb24uQ0ZEaWN0aW9uYXJ5Q3JlYXRlKAogICAgICAgIENvcmVGb3VuZGF0aW9uLmtDRkFsbG9jYXRvckRlZmF1bHQsCiAgICAgICAgY2Zfa2V5cywKICAgICAgICBjZl92YWx1ZXMsCiAgICAgICAgZGljdGlvbmFyeV9zaXplLAogICAgICAgIENvcmVGb3VuZGF0aW9uLmtDRlR5cGVEaWN0aW9uYXJ5S2V5Q2FsbEJhY2tzLAogICAgICAgIENvcmVGb3VuZGF0aW9uLmtDRlR5cGVEaWN0aW9uYXJ5VmFsdWVDYWxsQmFja3MsCiAgICApCgoKZGVmIF9jZl9zdHJpbmdfdG9fdW5pY29kZSh2YWx1ZSk6CiAgICAiIiIKICAgIENyZWF0ZXMgYSBVbmljb2RlIHN0cmluZyBmcm9tIGEgQ0ZTdHJpbmcgb2JqZWN0LiBVc2VkIGVudGlyZWx5IGZvciBlcnJvcgogICAgcmVwb3J0aW5nLgoKICAgIFllcywgaXQgYW5ub3lzIG1lIHF1aXRlIGEgbG90IHRoYXQgdGhpcyBmdW5jdGlvbiBpcyB0aGlzIGNvbXBsZXguCiAgICAiIiIKICAgIHZhbHVlX2FzX3ZvaWRfcCA9IGN0eXBlcy5jYXN0KHZhbHVlLCBjdHlwZXMuUE9JTlRFUihjdHlwZXMuY192b2lkX3ApKQoKICAgIHN0cmluZyA9IENvcmVGb3VuZGF0aW9uLkNGU3RyaW5nR2V0Q1N0cmluZ1B0cigKICAgICAgICB2YWx1ZV9hc192b2lkX3AsCiAgICAgICAgQ0ZDb25zdC5rQ0ZTdHJpbmdFbmNvZGluZ1VURjgKICAgICkKICAgIGlmIHN0cmluZyBpcyBOb25lOgogICAgICAgIGJ1ZmZlciA9IGN0eXBlcy5jcmVhdGVfc3RyaW5nX2J1ZmZlcigxMDI0KQogICAgICAgIHJlc3VsdCA9IENvcmVGb3VuZGF0aW9uLkNGU3RyaW5nR2V0Q1N0cmluZygKICAgICAgICAgICAgdmFsdWVfYXNfdm9pZF9wLAogICAgICAgICAgICBidWZmZXIsCiAgICAgICAgICAgIDEwMjQsCiAgICAgICAgICAgIENGQ29uc3Qua0NGU3RyaW5nRW5jb2RpbmdVVEY4CiAgICAgICAgKQogICAgICAgIGlmIG5vdCByZXN1bHQ6CiAgICAgICAgICAgIHJhaXNlIE9TRXJyb3IoJ0Vycm9yIGNvcHlpbmcgQyBzdHJpbmcgZnJvbSBDRlN0cmluZ1JlZicpCiAgICAgICAgc3RyaW5nID0gYnVmZmVyLnZhbHVlCiAgICBpZiBzdHJpbmcgaXMgbm90IE5vbmU6CiAgICAgICAgc3RyaW5nID0gc3RyaW5nLmRlY29kZSgndXRmLTgnKQogICAgcmV0dXJuIHN0cmluZwoKCmRlZiBfYXNzZXJ0X25vX2Vycm9yKGVycm9yLCBleGNlcHRpb25fY2xhc3M9Tm9uZSk6CiAgICAiIiIKICAgIENoZWNrcyB0aGUgcmV0dXJuIGNvZGUgYW5kIHRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gZXJyb3IgdG8KICAgIHJlcG9ydAogICAgIiIiCiAgICBpZiBlcnJvciA9PSAwOgogICAgICAgIHJldHVybgoKICAgIGNmX2Vycm9yX3N0cmluZyA9IFNlY3VyaXR5LlNlY0NvcHlFcnJvck1lc3NhZ2VTdHJpbmcoZXJyb3IsIE5vbmUpCiAgICBvdXRwdXQgPSBfY2Zfc3RyaW5nX3RvX3VuaWNvZGUoY2ZfZXJyb3Jfc3RyaW5nKQogICAgQ29yZUZvdW5kYXRpb24uQ0ZSZWxlYXNlKGNmX2Vycm9yX3N0cmluZykKCiAgICBpZiBvdXRwdXQgaXMgTm9uZSBvciBvdXRwdXQgPT0gdScnOgogICAgICAgIG91dHB1dCA9IHUnT1NTdGF0dXMgJXMnICUgZXJyb3IKCiAgICBpZiBleGNlcHRpb25fY2xhc3MgaXMgTm9uZToKICAgICAgICBleGNlcHRpb25fY2xhc3MgPSBzc2wuU1NMRXJyb3IKCiAgICByYWlzZSBleGNlcHRpb25fY2xhc3Mob3V0cHV0KQoKCmRlZiBfY2VydF9hcnJheV9mcm9tX3BlbShwZW1fYnVuZGxlKToKICAgICIiIgogICAgR2l2ZW4gYSBidW5kbGUgb2YgY2VydHMgaW4gUEVNIGZvcm1hdCwgdHVybnMgdGhlbSBpbnRvIGEgQ0ZBcnJheSBvZiBjZXJ0cwogICAgdGhhdCBjYW4gYmUgdXNlZCB0byB2YWxpZGF0ZSBhIGNlcnQgY2hhaW4uCiAgICAiIiIKICAgIGRlcl9jZXJ0cyA9IFsKICAgICAgICBiYXNlNjQuYjY0ZGVjb2RlKG1hdGNoLmdyb3VwKDEpKQogICAgICAgIGZvciBtYXRjaCBpbiBfUEVNX0NFUlRTX1JFLmZpbmRpdGVyKHBlbV9idW5kbGUpCiAgICBdCiAgICBpZiBub3QgZGVyX2NlcnRzOgogICAgICAgIHJhaXNlIHNzbC5TU0xFcnJvcigiTm8gcm9vdCBjZXJ0aWZpY2F0ZXMgc3BlY2lmaWVkIikKCiAgICBjZXJ0X2FycmF5ID0gQ29yZUZvdW5kYXRpb24uQ0ZBcnJheUNyZWF0ZU11dGFibGUoCiAgICAgICAgQ29yZUZvdW5kYXRpb24ua0NGQWxsb2NhdG9yRGVmYXVsdCwKICAgICAgICAwLAogICAgICAgIGN0eXBlcy5ieXJlZihDb3JlRm91bmRhdGlvbi5rQ0ZUeXBlQXJyYXlDYWxsQmFja3MpCiAgICApCiAgICBpZiBub3QgY2VydF9hcnJheToKICAgICAgICByYWlzZSBzc2wuU1NMRXJyb3IoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkhIikKCiAgICB0cnk6CiAgICAgICAgZm9yIGRlcl9ieXRlcyBpbiBkZXJfY2VydHM6CiAgICAgICAgICAgIGNlcnRkYXRhID0gX2NmX2RhdGFfZnJvbV9ieXRlcyhkZXJfYnl0ZXMpCiAgICAgICAgICAgIGlmIG5vdCBjZXJ0ZGF0YToKICAgICAgICAgICAgICAgIHJhaXNlIHNzbC5TU0xFcnJvcigiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSEiKQogICAgICAgICAgICBjZXJ0ID0gU2VjdXJpdHkuU2VjQ2VydGlmaWNhdGVDcmVhdGVXaXRoRGF0YSgKICAgICAgICAgICAgICAgIENvcmVGb3VuZGF0aW9uLmtDRkFsbG9jYXRvckRlZmF1bHQsIGNlcnRkYXRhCiAgICAgICAgICAgICkKICAgICAgICAgICAgQ29yZUZvdW5kYXRpb24uQ0ZSZWxlYXNlKGNlcnRkYXRhKQogICAgICAgICAgICBpZiBub3QgY2VydDoKICAgICAgICAgICAgICAgIHJhaXNlIHNzbC5TU0xFcnJvcigiVW5hYmxlIHRvIGJ1aWxkIGNlcnQgb2JqZWN0ISIpCgogICAgICAgICAgICBDb3JlRm91bmRhdGlvbi5DRkFycmF5QXBwZW5kVmFsdWUoY2VydF9hcnJheSwgY2VydCkKICAgICAgICAgICAgQ29yZUZvdW5kYXRpb24uQ0ZSZWxlYXNlKGNlcnQpCiAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICMgV2UgbmVlZCB0byBmcmVlIHRoZSBhcnJheSBiZWZvcmUgdGhlIGV4Y2VwdGlvbiBidWJibGVzIGZ1cnRoZXIuCiAgICAgICAgIyBXZSBvbmx5IHdhbnQgdG8gZG8gdGhhdCBpZiBhbiBlcnJvciBvY2N1cnM6IG90aGVyd2lzZSwgdGhlIGNhbGxlcgogICAgICAgICMgc2hvdWxkIGZyZWUuCiAgICAgICAgQ29yZUZvdW5kYXRpb24uQ0ZSZWxlYXNlKGNlcnRfYXJyYXkpCgogICAgcmV0dXJuIGNlcnRfYXJyYXkKCgpkZWYgX2lzX2NlcnQoaXRlbSk6CiAgICAiIiIKICAgIFJldHVybnMgVHJ1ZSBpZiBhIGdpdmVuIENGVHlwZVJlZiBpcyBhIGNlcnRpZmljYXRlLgogICAgIiIiCiAgICBleHBlY3RlZCA9IFNlY3VyaXR5LlNlY0NlcnRpZmljYXRlR2V0VHlwZUlEKCkKICAgIHJldHVybiBDb3JlRm91bmRhdGlvbi5DRkdldFR5cGVJRChpdGVtKSA9PSBleHBlY3RlZAoKCmRlZiBfaXNfaWRlbnRpdHkoaXRlbSk6CiAgICAiIiIKICAgIFJldHVybnMgVHJ1ZSBpZiBhIGdpdmVuIENGVHlwZVJlZiBpcyBhbiBpZGVudGl0eS4KICAgICIiIgogICAgZXhwZWN0ZWQgPSBTZWN1cml0eS5TZWNJZGVudGl0eUdldFR5cGVJRCgpCiAgICByZXR1cm4gQ29yZUZvdW5kYXRpb24uQ0ZHZXRUeXBlSUQoaXRlbSkgPT0gZXhwZWN0ZWQKCgpkZWYgX3RlbXBvcmFyeV9rZXljaGFpbigpOgogICAgIiIiCiAgICBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYSB0ZW1wb3JhcnkgTWFjIGtleWNoYWluIHRoYXQgd2UgY2FuIHVzZSB0byB3b3JrIHdpdGgKICAgIGNyZWRlbnRpYWxzLiBUaGlzIGtleWNoYWluIHVzZXMgYSBvbmUtdGltZSBwYXNzd29yZCBhbmQgYSB0ZW1wb3JhcnkgZmlsZSB0bwogICAgc3RvcmUgdGhlIGRhdGEuIFdlIGV4cGVjdCB0byBoYXZlIG9uZSBrZXljaGFpbiBwZXIgc29ja2V0LiBUaGUgcmV0dXJuZWQKICAgIFNlY0tleWNoYWluUmVmIG11c3QgYmUgZnJlZWQgYnkgdGhlIGNhbGxlciwgaW5jbHVkaW5nIGNhbGxpbmcKICAgIFNlY0tleWNoYWluRGVsZXRlLgoKICAgIFJldHVybnMgYSB0dXBsZSBvZiB0aGUgU2VjS2V5Y2hhaW5SZWYgYW5kIHRoZSBwYXRoIHRvIHRoZSB0ZW1wb3JhcnkKICAgIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIGl0LgogICAgIiIiCiAgICAjIFVuZm9ydHVuYXRlbHksIFNlY0tleWNoYWluQ3JlYXRlIHJlcXVpcmVzIGEgcGF0aCB0byBhIGtleWNoYWluLiBUaGlzCiAgICAjIG1lYW5zIHdlIGNhbm5vdCB1c2UgbWtzdGVtcCB0byB1c2UgYSBnZW5lcmljIHRlbXBvcmFyeSBmaWxlLiBJbnN0ZWFkLAogICAgIyB3ZSdyZSBnb2luZyB0byBjcmVhdGUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGFuZCBhIGZpbGVuYW1lIHRvIHVzZSB0aGVyZS4KICAgICMgVGhpcyBmaWxlbmFtZSB3aWxsIGJlIDggcmFuZG9tIGJ5dGVzIGV4cGFuZGVkIGludG8gYmFzZTY0LiBXZSBhbHNvIG5lZWQKICAgICMgc29tZSByYW5kb20gYnl0ZXMgdG8gcGFzc3dvcmQtcHJvdGVjdCB0aGUga2V5Y2hhaW4gd2UncmUgY3JlYXRpbmcsIHNvIHdlCiAgICAjIGFzayBmb3IgNDAgcmFuZG9tIGJ5dGVzLgogICAgcmFuZG9tX2J5dGVzID0gb3MudXJhbmRvbSg0MCkKICAgIGZpbGVuYW1lID0gYmFzZTY0LmI2NGVuY29kZShyYW5kb21fYnl0ZXNbOjhdKS5kZWNvZGUoJ3V0Zi04JykKICAgIHBhc3N3b3JkID0gYmFzZTY0LmI2NGVuY29kZShyYW5kb21fYnl0ZXNbODpdKSAgIyBNdXN0IGJlIHZhbGlkIFVURi04CiAgICB0ZW1wZGlyZWN0b3J5ID0gdGVtcGZpbGUubWtkdGVtcCgpCgogICAga2V5Y2hhaW5fcGF0aCA9IG9zLnBhdGguam9pbih0ZW1wZGlyZWN0b3J5LCBmaWxlbmFtZSkuZW5jb2RlKCd1dGYtOCcpCgogICAgIyBXZSBub3cgd2FudCB0byBjcmVhdGUgdGhlIGtleWNoYWluIGl0c2VsZi4KICAgIGtleWNoYWluID0gU2VjdXJpdHkuU2VjS2V5Y2hhaW5SZWYoKQogICAgc3RhdHVzID0gU2VjdXJpdHkuU2VjS2V5Y2hhaW5DcmVhdGUoCiAgICAgICAga2V5Y2hhaW5fcGF0aCwKICAgICAgICBsZW4ocGFzc3dvcmQpLAogICAgICAgIHBhc3N3b3JkLAogICAgICAgIEZhbHNlLAogICAgICAgIE5vbmUsCiAgICAgICAgY3R5cGVzLmJ5cmVmKGtleWNoYWluKQogICAgKQogICAgX2Fzc2VydF9ub19lcnJvcihzdGF0dXMpCgogICAgIyBIYXZpbmcgY3JlYXRlZCB0aGUga2V5Y2hhaW4sIHdlIHdhbnQgdG8gcGFzcyBpdCBvZmYgdG8gdGhlIGNhbGxlci4KICAgIHJldHVybiBrZXljaGFpbiwgdGVtcGRpcmVjdG9yeQoKCmRlZiBfbG9hZF9pdGVtc19mcm9tX2ZpbGUoa2V5Y2hhaW4sIHBhdGgpOgogICAgIiIiCiAgICBHaXZlbiBhIHNpbmdsZSBmaWxlLCBsb2FkcyBhbGwgdGhlIHRydXN0IG9iamVjdHMgZnJvbSBpdCBpbnRvIGFycmF5cyBhbmQKICAgIHRoZSBrZXljaGFpbi4KICAgIFJldHVybnMgYSB0dXBsZSBvZiBsaXN0czogdGhlIGZpcnN0IGxpc3QgaXMgYSBsaXN0IG9mIGlkZW50aXRpZXMsIHRoZQogICAgc2Vjb25kIGEgbGlzdCBvZiBjZXJ0cy4KICAgICIiIgogICAgY2VydGlmaWNhdGVzID0gW10KICAgIGlkZW50aXRpZXMgPSBbXQogICAgcmVzdWx0X2FycmF5ID0gTm9uZQoKICAgIHdpdGggb3BlbihwYXRoLCAncmInKSBhcyBmOgogICAgICAgIHJhd19maWxlZGF0YSA9IGYucmVhZCgpCgogICAgdHJ5OgogICAgICAgIGZpbGVkYXRhID0gQ29yZUZvdW5kYXRpb24uQ0ZEYXRhQ3JlYXRlKAogICAgICAgICAgICBDb3JlRm91bmRhdGlvbi5rQ0ZBbGxvY2F0b3JEZWZhdWx0LAogICAgICAgICAgICByYXdfZmlsZWRhdGEsCiAgICAgICAgICAgIGxlbihyYXdfZmlsZWRhdGEpCiAgICAgICAgKQogICAgICAgIHJlc3VsdF9hcnJheSA9IENvcmVGb3VuZGF0aW9uLkNGQXJyYXlSZWYoKQogICAgICAgIHJlc3VsdCA9IFNlY3VyaXR5LlNlY0l0ZW1JbXBvcnQoCiAgICAgICAgICAgIGZpbGVkYXRhLCAgIyBjZXJ0IGRhdGEKICAgICAgICAgICAgTm9uZSwgICMgRmlsZW5hbWUsIGxlYXZpbmcgaXQgb3V0IGZvciBub3cKICAgICAgICAgICAgTm9uZSwgICMgV2hhdCB0aGUgdHlwZSBvZiB0aGUgZmlsZSBpcywgd2UgZG9uJ3QgY2FyZQogICAgICAgICAgICBOb25lLCAgIyB3aGF0J3MgaW4gdGhlIGZpbGUsIHdlIGRvbid0IGNhcmUKICAgICAgICAgICAgMCwgICMgaW1wb3J0IGZsYWdzCiAgICAgICAgICAgIE5vbmUsICAjIGtleSBwYXJhbXMsIGNhbiBpbmNsdWRlIHBhc3NwaHJhc2UgaW4gdGhlIGZ1dHVyZQogICAgICAgICAgICBrZXljaGFpbiwgICMgVGhlIGtleWNoYWluIHRvIGluc2VydCBpbnRvCiAgICAgICAgICAgIGN0eXBlcy5ieXJlZihyZXN1bHRfYXJyYXkpICAjIFJlc3VsdHMKICAgICAgICApCiAgICAgICAgX2Fzc2VydF9ub19lcnJvcihyZXN1bHQpCgogICAgICAgICMgQSBDRkFycmF5IGlzIG5vdCB2ZXJ5IHVzZWZ1bCB0byB1cyBhcyBhbiBpbnRlcm1lZGlhcnkKICAgICAgICAjIHJlcHJlc2VudGF0aW9uLCBzbyB3ZSBhcmUgZ29pbmcgdG8gZXh0cmFjdCB0aGUgb2JqZWN0cyB3ZSB3YW50CiAgICAgICAgIyBhbmQgdGhlbiBmcmVlIHRoZSBhcnJheS4gV2UgZG9uJ3QgbmVlZCB0byBrZWVwIGhvbGQgb2Yga2V5czogdGhlCiAgICAgICAgIyBrZXljaGFpbiBhbHJlYWR5IGhhcyB0aGVtIQogICAgICAgIHJlc3VsdF9jb3VudCA9IENvcmVGb3VuZGF0aW9uLkNGQXJyYXlHZXRDb3VudChyZXN1bHRfYXJyYXkpCiAgICAgICAgZm9yIGluZGV4IGluIHJhbmdlKHJlc3VsdF9jb3VudCk6CiAgICAgICAgICAgIGl0ZW0gPSBDb3JlRm91bmRhdGlvbi5DRkFycmF5R2V0VmFsdWVBdEluZGV4KAogICAgICAgICAgICAgICAgcmVzdWx0X2FycmF5LCBpbmRleAogICAgICAgICAgICApCiAgICAgICAgICAgIGl0ZW0gPSBjdHlwZXMuY2FzdChpdGVtLCBDb3JlRm91bmRhdGlvbi5DRlR5cGVSZWYpCgogICAgICAgICAgICBpZiBfaXNfY2VydChpdGVtKToKICAgICAgICAgICAgICAgIENvcmVGb3VuZGF0aW9uLkNGUmV0YWluKGl0ZW0pCiAgICAgICAgICAgICAgICBjZXJ0aWZpY2F0ZXMuYXBwZW5kKGl0ZW0pCiAgICAgICAgICAgIGVsaWYgX2lzX2lkZW50aXR5KGl0ZW0pOgogICAgICAgICAgICAgICAgQ29yZUZvdW5kYXRpb24uQ0ZSZXRhaW4oaXRlbSkKICAgICAgICAgICAgICAgIGlkZW50aXRpZXMuYXBwZW5kKGl0ZW0pCiAgICBmaW5hbGx5OgogICAgICAgIGlmIHJlc3VsdF9hcnJheToKICAgICAgICAgICAgQ29yZUZvdW5kYXRpb24uQ0ZSZWxlYXNlKHJlc3VsdF9hcnJheSkKCiAgICAgICAgQ29yZUZvdW5kYXRpb24uQ0ZSZWxlYXNlKGZpbGVkYXRhKQoKICAgIHJldHVybiAoaWRlbnRpdGllcywgY2VydGlmaWNhdGVzKQoKCmRlZiBfbG9hZF9jbGllbnRfY2VydF9jaGFpbihrZXljaGFpbiwgKnBhdGhzKToKICAgICIiIgogICAgTG9hZCBjZXJ0aWZpY2F0ZXMgYW5kIG1heWJlIGtleXMgZnJvbSBhIG51bWJlciBvZiBmaWxlcy4gSGFzIHRoZSBlbmQgZ29hbAogICAgb2YgcmV0dXJuaW5nIGEgQ0ZBcnJheSBjb250YWluaW5nIG9uZSBTZWNJZGVudGl0eVJlZiwgYW5kIHRoZW4gemVybyBvciBtb3JlCiAgICBTZWNDZXJ0aWZpY2F0ZVJlZiBvYmplY3RzLCBzdWl0YWJsZSBmb3IgdXNlIGFzIGEgY2xpZW50IGNlcnRpZmljYXRlIHRydXN0CiAgICBjaGFpbi4KICAgICIiIgogICAgIyBPaywgdGhlIHN0cmF0ZWd5LgogICAgIwogICAgIyBUaGlzIHJlbGllcyBvbiBrbm93aW5nIHRoYXQgbWFjT1Mgd2lsbCBub3QgZ2l2ZSB5b3UgYSBTZWNJZGVudGl0eVJlZgogICAgIyB1bmxlc3MgeW91IGhhdmUgaW1wb3J0ZWQgYSBrZXkgaW50byBhIGtleWNoYWluLiBUaGlzIGlzIGEgc29tZXdoYXQKICAgICMgYXJ0aWZpY2lhbCBsaW1pdGF0aW9uIG9mIG1hY09TIChmb3IgZXhhbXBsZSwgaXQgZG9lc24ndCBuZWNlc3NhcmlseQogICAgIyBhZmZlY3QgaU9TKSwgYnV0IHRoZXJlIGlzIG5vdGhpbmcgaW5zaWRlIFNlY3VyaXR5LmZyYW1ld29yayB0aGF0IGxldHMgeW91CiAgICAjIGdldCBhIFNlY0lkZW50aXR5UmVmIHdpdGhvdXQgaGF2aW5nIGEga2V5IGluIGEga2V5Y2hhaW4uCiAgICAjCiAgICAjIFNvIHRoZSBwb2xpY3kgaGVyZSBpcyB3ZSB0YWtlIGFsbCB0aGUgZmlsZXMgYW5kIGl0ZXJhdGUgdGhlbSBpbiBvcmRlci4KICAgICMgRWFjaCBvbmUgd2lsbCB1c2UgU2VjSXRlbUltcG9ydCB0byBoYXZlIG9uZSBvciBtb3JlIG9iamVjdHMgbG9hZGVkIGZyb20KICAgICMgaXQuIFdlIHdpbGwgYWxzbyBwb2ludCBhdCBhIGtleWNoYWluIHRoYXQgbWFjT1MgY2FuIHVzZSB0byB3b3JrIHdpdGggdGhlCiAgICAjIHByaXZhdGUga2V5LgogICAgIwogICAgIyBPbmNlIHdlIGhhdmUgYWxsIHRoZSBvYmplY3RzLCB3ZSdsbCBjaGVjayB3aGF0IHdlIGFjdHVhbGx5IGhhdmUuIElmIHdlCiAgICAjIGFscmVhZHkgaGF2ZSBhIFNlY0lkZW50aXR5UmVmIGluIGhhbmQsIGZhYjogd2UnbGwgdXNlIHRoYXQuIE90aGVyd2lzZSwKICAgICMgd2UnbGwgdGFrZSB0aGUgZmlyc3QgY2VydGlmaWNhdGUgKHdoaWNoIHdlIGFzc3VtZSB0byBiZSBvdXIgbGVhZikgYW5kCiAgICAjIGFzayB0aGUga2V5Y2hhaW4gdG8gZ2l2ZSB1cyBhIFNlY0lkZW50aXR5UmVmIHdpdGggdGhhdCBjZXJ0J3MgYXNzb2NpYXRlZAogICAgIyBrZXkuCiAgICAjCiAgICAjIFdlJ2xsIHRoZW4gcmV0dXJuIGEgQ0ZBcnJheSBjb250YWluaW5nIHRoZSB0cnVzdCBjaGFpbjogb25lCiAgICAjIFNlY0lkZW50aXR5UmVmIGFuZCB0aGVuIHplcm8tb3ItbW9yZSBTZWNDZXJ0aWZpY2F0ZVJlZiBvYmplY3RzLiBUaGUKICAgICMgcmVzcG9uc2liaWxpdHkgZm9yIGZyZWVpbmcgdGhpcyBDRkFycmF5IHdpbGwgYmUgd2l0aCB0aGUgY2FsbGVyLiBUaGlzCiAgICAjIENGQXJyYXkgbXVzdCByZW1haW4gYWxpdmUgZm9yIHRoZSBlbnRpcmUgY29ubmVjdGlvbiwgc28gaW4gcHJhY3RpY2UgaXQKICAgICMgd2lsbCBiZSBzdG9yZWQgd2l0aCBhIHNpbmdsZSBTU0xTb2NrZXQsIGFsb25nIHdpdGggdGhlIHJlZmVyZW5jZSB0byB0aGUKICAgICMga2V5Y2hhaW4uCiAgICBjZXJ0aWZpY2F0ZXMgPSBbXQogICAgaWRlbnRpdGllcyA9IFtdCgogICAgIyBGaWx0ZXIgb3V0IGJhZCBwYXRocy4KICAgIHBhdGhzID0gKHBhdGggZm9yIHBhdGggaW4gcGF0aHMgaWYgcGF0aCkKCiAgICB0cnk6CiAgICAgICAgZm9yIGZpbGVfcGF0aCBpbiBwYXRoczoKICAgICAgICAgICAgbmV3X2lkZW50aXRpZXMsIG5ld19jZXJ0cyA9IF9sb2FkX2l0ZW1zX2Zyb21fZmlsZSgKICAgICAgICAgICAgICAgIGtleWNoYWluLCBmaWxlX3BhdGgKICAgICAgICAgICAgKQogICAgICAgICAgICBpZGVudGl0aWVzLmV4dGVuZChuZXdfaWRlbnRpdGllcykKICAgICAgICAgICAgY2VydGlmaWNhdGVzLmV4dGVuZChuZXdfY2VydHMpCgogICAgICAgICMgT2ssIHdlIGhhdmUgZXZlcnl0aGluZy4gVGhlIHF1ZXN0aW9uIGlzOiBkbyB3ZSBoYXZlIGFuIGlkZW50aXR5PyBJZgogICAgICAgICMgbm90LCB3ZSB3YW50IHRvIGdyYWIgb25lIGZyb20gdGhlIGZpcnN0IGNlcnQgd2UgaGF2ZS4KICAgICAgICBpZiBub3QgaWRlbnRpdGllczoKICAgICAgICAgICAgbmV3X2lkZW50aXR5ID0gU2VjdXJpdHkuU2VjSWRlbnRpdHlSZWYoKQogICAgICAgICAgICBzdGF0dXMgPSBTZWN1cml0eS5TZWNJZGVudGl0eUNyZWF0ZVdpdGhDZXJ0aWZpY2F0ZSgKICAgICAgICAgICAgICAgIGtleWNoYWluLAogICAgICAgICAgICAgICAgY2VydGlmaWNhdGVzWzBdLAogICAgICAgICAgICAgICAgY3R5cGVzLmJ5cmVmKG5ld19pZGVudGl0eSkKICAgICAgICAgICAgKQogICAgICAgICAgICBfYXNzZXJ0X25vX2Vycm9yKHN0YXR1cykKICAgICAgICAgICAgaWRlbnRpdGllcy5hcHBlbmQobmV3X2lkZW50aXR5KQoKICAgICAgICAgICAgIyBXZSBub3cgd2FudCB0byByZWxlYXNlIHRoZSBvcmlnaW5hbCBjZXJ0aWZpY2F0ZSwgYXMgd2Ugbm8gbG9uZ2VyCiAgICAgICAgICAgICMgbmVlZCBpdC4KICAgICAgICAgICAgQ29yZUZvdW5kYXRpb24uQ0ZSZWxlYXNlKGNlcnRpZmljYXRlcy5wb3AoMCkpCgogICAgICAgICMgV2Ugbm93IG5lZWQgdG8gYnVpbGQgYSBuZXcgQ0ZBcnJheSB0aGF0IGhvbGRzIHRoZSB0cnVzdCBjaGFpbi4KICAgICAgICB0cnVzdF9jaGFpbiA9IENvcmVGb3VuZGF0aW9uLkNGQXJyYXlDcmVhdGVNdXRhYmxlKAogICAgICAgICAgICBDb3JlRm91bmRhdGlvbi5rQ0ZBbGxvY2F0b3JEZWZhdWx0LAogICAgICAgICAgICAwLAogICAgICAgICAgICBjdHlwZXMuYnlyZWYoQ29yZUZvdW5kYXRpb24ua0NGVHlwZUFycmF5Q2FsbEJhY2tzKSwKICAgICAgICApCiAgICAgICAgZm9yIGl0ZW0gaW4gaXRlcnRvb2xzLmNoYWluKGlkZW50aXRpZXMsIGNlcnRpZmljYXRlcyk6CiAgICAgICAgICAgICMgQXJyYXlBcHBlbmRWYWx1ZSBkb2VzIGEgQ0ZSZXRhaW4gb24gdGhlIGl0ZW0uIFRoYXQncyBmaW5lLAogICAgICAgICAgICAjIGJlY2F1c2UgdGhlIGZpbmFsbHkgYmxvY2sgd2lsbCByZWxlYXNlIG91ciBvdGhlciByZWZzIHRvIHRoZW0uCiAgICAgICAgICAgIENvcmVGb3VuZGF0aW9uLkNGQXJyYXlBcHBlbmRWYWx1ZSh0cnVzdF9jaGFpbiwgaXRlbSkKCiAgICAgICAgcmV0dXJuIHRydXN0X2NoYWluCiAgICBmaW5hbGx5OgogICAgICAgIGZvciBvYmogaW4gaXRlcnRvb2xzLmNoYWluKGlkZW50aXRpZXMsIGNlcnRpZmljYXRlcyk6CiAgICAgICAgICAgIENvcmVGb3VuZGF0aW9uLkNGUmVsZWFzZShvYmopClBLAwQUAAAAAAAAACEAGMOtk3EqAABxKgAARQAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9jb250cmliL2FwcGVuZ2luZS5weSIiIgpUaGlzIG1vZHVsZSBwcm92aWRlcyBhIHBvb2wgbWFuYWdlciB0aGF0IHVzZXMgR29vZ2xlIEFwcCBFbmdpbmUncwpgVVJMRmV0Y2ggU2VydmljZSA8aHR0cHM6Ly9jbG91ZC5nb29nbGUuY29tL2FwcGVuZ2luZS9kb2NzL3B5dGhvbi91cmxmZXRjaD5gXy4KCkV4YW1wbGUgdXNhZ2U6OgoKICAgIGZyb20gdXJsbGliMyBpbXBvcnQgUG9vbE1hbmFnZXIKICAgIGZyb20gdXJsbGliMy5jb250cmliLmFwcGVuZ2luZSBpbXBvcnQgQXBwRW5naW5lTWFuYWdlciwgaXNfYXBwZW5naW5lX3NhbmRib3gKCiAgICBpZiBpc19hcHBlbmdpbmVfc2FuZGJveCgpOgogICAgICAgICMgQXBwRW5naW5lTWFuYWdlciB1c2VzIEFwcEVuZ2luZSdzIFVSTEZldGNoIEFQSSBiZWhpbmQgdGhlIHNjZW5lcwogICAgICAgIGh0dHAgPSBBcHBFbmdpbmVNYW5hZ2VyKCkKICAgIGVsc2U6CiAgICAgICAgIyBQb29sTWFuYWdlciB1c2VzIGEgc29ja2V0LWxldmVsIEFQSSBiZWhpbmQgdGhlIHNjZW5lcwogICAgICAgIGh0dHAgPSBQb29sTWFuYWdlcigpCgogICAgciA9IGh0dHAucmVxdWVzdCgnR0VUJywgJ2h0dHBzOi8vZ29vZ2xlLmNvbS8nKQoKVGhlcmUgYXJlIGBsaW1pdGF0aW9ucyA8aHR0cHM6Ly9jbG91ZC5nb29nbGUuY29tL2FwcGVuZ2luZS9kb2NzL3B5dGhvbi9cCnVybGZldGNoLyNQeXRob25fUXVvdGFzX2FuZF9saW1pdHM+YF8gdG8gdGhlIFVSTEZldGNoIHNlcnZpY2UgYW5kIGl0IG1heSBub3QgYmUKdGhlIGJlc3QgY2hvaWNlIGZvciB5b3VyIGFwcGxpY2F0aW9uLiBUaGVyZSBhcmUgdGhyZWUgb3B0aW9ucyBmb3IgdXNpbmcKdXJsbGliMyBvbiBHb29nbGUgQXBwIEVuZ2luZToKCjEuIFlvdSBjYW4gdXNlIDpjbGFzczpgQXBwRW5naW5lTWFuYWdlcmAgd2l0aCBVUkxGZXRjaC4gVVJMRmV0Y2ggaXMKICAgY29zdC1lZmZlY3RpdmUgaW4gbWFueSBjaXJjdW1zdGFuY2VzIGFzIGxvbmcgYXMgeW91ciB1c2FnZSBpcyB3aXRoaW4gdGhlCiAgIGxpbWl0YXRpb25zLgoyLiBZb3UgY2FuIHVzZSBhIG5vcm1hbCA6Y2xhc3M6YH51cmxsaWIzLlBvb2xNYW5hZ2VyYCBieSBlbmFibGluZyBzb2NrZXRzLgogICBTb2NrZXRzIGFsc28gaGF2ZSBgbGltaXRhdGlvbnMgYW5kIHJlc3RyaWN0aW9ucwogICA8aHR0cHM6Ly9jbG91ZC5nb29nbGUuY29tL2FwcGVuZ2luZS9kb2NzL3B5dGhvbi9zb2NrZXRzL1wKICAgI2xpbWl0YXRpb25zLWFuZC1yZXN0cmljdGlvbnM+YF8gYW5kIGhhdmUgYSBsb3dlciBmcmVlIHF1b3RhIHRoYW4gVVJMRmV0Y2guCiAgIFRvIHVzZSBzb2NrZXRzLCBiZSBzdXJlIHRvIHNwZWNpZnkgdGhlIGZvbGxvd2luZyBpbiB5b3VyIGBgYXBwLnlhbWxgYDo6CgogICAgICAgIGVudl92YXJpYWJsZXM6CiAgICAgICAgICAgIEdBRV9VU0VfU09DS0VUU19IVFRQTElCIDogJ3RydWUnCgozLiBJZiB5b3UgYXJlIHVzaW5nIGBBcHAgRW5naW5lIEZsZXhpYmxlCjxodHRwczovL2Nsb3VkLmdvb2dsZS5jb20vYXBwZW5naW5lL2RvY3MvZmxleGlibGUvPmBfLCB5b3UgY2FuIHVzZSB0aGUgc3RhbmRhcmQKOmNsYXNzOmBQb29sTWFuYWdlcmAgd2l0aG91dCBhbnkgY29uZmlndXJhdGlvbiBvciBzcGVjaWFsIGVudmlyb25tZW50IHZhcmlhYmxlcy4KIiIiCgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAppbXBvcnQgbG9nZ2luZwppbXBvcnQgb3MKaW1wb3J0IHdhcm5pbmdzCmZyb20gLi5wYWNrYWdlcy5zaXgubW92ZXMudXJsbGliLnBhcnNlIGltcG9ydCB1cmxqb2luCgpmcm9tIC4uZXhjZXB0aW9ucyBpbXBvcnQgKAogICAgSFRUUEVycm9yLAogICAgSFRUUFdhcm5pbmcsCiAgICBNYXhSZXRyeUVycm9yLAogICAgUHJvdG9jb2xFcnJvciwKICAgIFRpbWVvdXRFcnJvciwKICAgIFNTTEVycm9yCikKCmZyb20gLi5wYWNrYWdlcy5zaXggaW1wb3J0IEJ5dGVzSU8KZnJvbSAuLnJlcXVlc3QgaW1wb3J0IFJlcXVlc3RNZXRob2RzCmZyb20gLi5yZXNwb25zZSBpbXBvcnQgSFRUUFJlc3BvbnNlCmZyb20gLi51dGlsLnRpbWVvdXQgaW1wb3J0IFRpbWVvdXQKZnJvbSAuLnV0aWwucmV0cnkgaW1wb3J0IFJldHJ5Cgp0cnk6CiAgICBmcm9tIGdvb2dsZS5hcHBlbmdpbmUuYXBpIGltcG9ydCB1cmxmZXRjaApleGNlcHQgSW1wb3J0RXJyb3I6CiAgICB1cmxmZXRjaCA9IE5vbmUKCgpsb2cgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCgpjbGFzcyBBcHBFbmdpbmVQbGF0Zm9ybVdhcm5pbmcoSFRUUFdhcm5pbmcpOgogICAgcGFzcwoKCmNsYXNzIEFwcEVuZ2luZVBsYXRmb3JtRXJyb3IoSFRUUEVycm9yKToKICAgIHBhc3MKCgpjbGFzcyBBcHBFbmdpbmVNYW5hZ2VyKFJlcXVlc3RNZXRob2RzKToKICAgICIiIgogICAgQ29ubmVjdGlvbiBtYW5hZ2VyIGZvciBHb29nbGUgQXBwIEVuZ2luZSBzYW5kYm94IGFwcGxpY2F0aW9ucy4KCiAgICBUaGlzIG1hbmFnZXIgdXNlcyB0aGUgVVJMRmV0Y2ggc2VydmljZSBkaXJlY3RseSBpbnN0ZWFkIG9mIHVzaW5nIHRoZQogICAgZW11bGF0ZWQgaHR0cGxpYiwgYW5kIGlzIHN1YmplY3QgdG8gVVJMRmV0Y2ggbGltaXRhdGlvbnMgYXMgZGVzY3JpYmVkIGluCiAgICB0aGUgQXBwIEVuZ2luZSBkb2N1bWVudGF0aW9uIGBoZXJlCiAgICA8aHR0cHM6Ly9jbG91ZC5nb29nbGUuY29tL2FwcGVuZ2luZS9kb2NzL3B5dGhvbi91cmxmZXRjaD5gXy4KCiAgICBOb3RhYmx5IGl0IHdpbGwgcmFpc2UgYW4gOmNsYXNzOmBBcHBFbmdpbmVQbGF0Zm9ybUVycm9yYCBpZjoKICAgICAgICAqIFVSTEZldGNoIGlzIG5vdCBhdmFpbGFibGUuCiAgICAgICAgKiBJZiB5b3UgYXR0ZW1wdCB0byB1c2UgdGhpcyBvbiBBcHAgRW5naW5lIEZsZXhpYmxlLCBhcyBmdWxsIHNvY2tldAogICAgICAgICAgc3VwcG9ydCBpcyBhdmFpbGFibGUuCiAgICAgICAgKiBJZiBhIHJlcXVlc3Qgc2l6ZSBpcyBtb3JlIHRoYW4gMTAgbWVnYWJ5dGVzLgogICAgICAgICogSWYgYSByZXNwb25zZSBzaXplIGlzIG1vcmUgdGhhbiAzMiBtZWdhYnR5ZXMuCiAgICAgICAgKiBJZiB5b3UgdXNlIGFuIHVuc3VwcG9ydGVkIHJlcXVlc3QgbWV0aG9kIHN1Y2ggYXMgT1BUSU9OUy4KCiAgICBCZXlvbmQgdGhvc2UgY2FzZXMsIGl0IHdpbGwgcmFpc2Ugbm9ybWFsIHVybGxpYjMgZXJyb3JzLgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGhlYWRlcnM9Tm9uZSwgcmV0cmllcz1Ob25lLCB2YWxpZGF0ZV9jZXJ0aWZpY2F0ZT1UcnVlLAogICAgICAgICAgICAgICAgIHVybGZldGNoX3JldHJpZXM9VHJ1ZSk6CiAgICAgICAgaWYgbm90IHVybGZldGNoOgogICAgICAgICAgICByYWlzZSBBcHBFbmdpbmVQbGF0Zm9ybUVycm9yKAogICAgICAgICAgICAgICAgIlVSTEZldGNoIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhpcyBlbnZpcm9ubWVudC4iKQoKICAgICAgICBpZiBpc19wcm9kX2FwcGVuZ2luZV9tdm1zKCk6CiAgICAgICAgICAgIHJhaXNlIEFwcEVuZ2luZVBsYXRmb3JtRXJyb3IoCiAgICAgICAgICAgICAgICAiVXNlIG5vcm1hbCB1cmxsaWIzLlBvb2xNYW5hZ2VyIGluc3RlYWQgb2YgQXBwRW5naW5lTWFuYWdlciIKICAgICAgICAgICAgICAgICJvbiBNYW5hZ2VkIFZNcywgYXMgdXNpbmcgVVJMRmV0Y2ggaXMgbm90IG5lY2Vzc2FyeSBpbiAiCiAgICAgICAgICAgICAgICAidGhpcyBlbnZpcm9ubWVudC4iKQoKICAgICAgICB3YXJuaW5ncy53YXJuKAogICAgICAgICAgICAidXJsbGliMyBpcyB1c2luZyBVUkxGZXRjaCBvbiBHb29nbGUgQXBwIEVuZ2luZSBzYW5kYm94IGluc3RlYWQgIgogICAgICAgICAgICAib2Ygc29ja2V0cy4gVG8gdXNlIHNvY2tldHMgZGlyZWN0bHkgaW5zdGVhZCBvZiBVUkxGZXRjaCBzZWUgIgogICAgICAgICAgICAiaHR0cHM6Ly91cmxsaWIzLnJlYWR0aGVkb2NzLmlvL2VuL2xhdGVzdC9yZWZlcmVuY2UvdXJsbGliMy5jb250cmliLmh0bWwuIiwKICAgICAgICAgICAgQXBwRW5naW5lUGxhdGZvcm1XYXJuaW5nKQoKICAgICAgICBSZXF1ZXN0TWV0aG9kcy5fX2luaXRfXyhzZWxmLCBoZWFkZXJzKQogICAgICAgIHNlbGYudmFsaWRhdGVfY2VydGlmaWNhdGUgPSB2YWxpZGF0ZV9jZXJ0aWZpY2F0ZQogICAgICAgIHNlbGYudXJsZmV0Y2hfcmV0cmllcyA9IHVybGZldGNoX3JldHJpZXMKCiAgICAgICAgc2VsZi5yZXRyaWVzID0gcmV0cmllcyBvciBSZXRyeS5ERUZBVUxUCgogICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBfX2V4aXRfXyhzZWxmLCBleGNfdHlwZSwgZXhjX3ZhbCwgZXhjX3RiKToKICAgICAgICAjIFJldHVybiBGYWxzZSB0byByZS1yYWlzZSBhbnkgcG90ZW50aWFsIGV4Y2VwdGlvbnMKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgdXJsb3BlbihzZWxmLCBtZXRob2QsIHVybCwgYm9keT1Ob25lLCBoZWFkZXJzPU5vbmUsCiAgICAgICAgICAgICAgICByZXRyaWVzPU5vbmUsIHJlZGlyZWN0PVRydWUsIHRpbWVvdXQ9VGltZW91dC5ERUZBVUxUX1RJTUVPVVQsCiAgICAgICAgICAgICAgICAqKnJlc3BvbnNlX2t3KToKCiAgICAgICAgcmV0cmllcyA9IHNlbGYuX2dldF9yZXRyaWVzKHJldHJpZXMsIHJlZGlyZWN0KQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGZvbGxvd19yZWRpcmVjdHMgPSAoCiAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3QgYW5kCiAgICAgICAgICAgICAgICAgICAgcmV0cmllcy5yZWRpcmVjdCAhPSAwIGFuZAogICAgICAgICAgICAgICAgICAgIHJldHJpZXMudG90YWwpCiAgICAgICAgICAgIHJlc3BvbnNlID0gdXJsZmV0Y2guZmV0Y2goCiAgICAgICAgICAgICAgICB1cmwsCiAgICAgICAgICAgICAgICBwYXlsb2FkPWJvZHksCiAgICAgICAgICAgICAgICBtZXRob2Q9bWV0aG9kLAogICAgICAgICAgICAgICAgaGVhZGVycz1oZWFkZXJzIG9yIHt9LAogICAgICAgICAgICAgICAgYWxsb3dfdHJ1bmNhdGVkPUZhbHNlLAogICAgICAgICAgICAgICAgZm9sbG93X3JlZGlyZWN0cz1zZWxmLnVybGZldGNoX3JldHJpZXMgYW5kIGZvbGxvd19yZWRpcmVjdHMsCiAgICAgICAgICAgICAgICBkZWFkbGluZT1zZWxmLl9nZXRfYWJzb2x1dGVfdGltZW91dCh0aW1lb3V0KSwKICAgICAgICAgICAgICAgIHZhbGlkYXRlX2NlcnRpZmljYXRlPXNlbGYudmFsaWRhdGVfY2VydGlmaWNhdGUsCiAgICAgICAgICAgICkKICAgICAgICBleGNlcHQgdXJsZmV0Y2guRGVhZGxpbmVFeGNlZWRlZEVycm9yIGFzIGU6CiAgICAgICAgICAgIHJhaXNlIFRpbWVvdXRFcnJvcihzZWxmLCBlKQoKICAgICAgICBleGNlcHQgdXJsZmV0Y2guSW52YWxpZFVSTEVycm9yIGFzIGU6CiAgICAgICAgICAgIGlmICd0b28gbGFyZ2UnIGluIHN0cihlKToKICAgICAgICAgICAgICAgIHJhaXNlIEFwcEVuZ2luZVBsYXRmb3JtRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgIlVSTEZldGNoIHJlcXVlc3QgdG9vIGxhcmdlLCBVUkxGZXRjaCBvbmx5ICIKICAgICAgICAgICAgICAgICAgICAic3VwcG9ydHMgcmVxdWVzdHMgdXAgdG8gMTBtYiBpbiBzaXplLiIsIGUpCiAgICAgICAgICAgIHJhaXNlIFByb3RvY29sRXJyb3IoZSkKCiAgICAgICAgZXhjZXB0IHVybGZldGNoLkRvd25sb2FkRXJyb3IgYXMgZToKICAgICAgICAgICAgaWYgJ1RvbyBtYW55IHJlZGlyZWN0cycgaW4gc3RyKGUpOgogICAgICAgICAgICAgICAgcmFpc2UgTWF4UmV0cnlFcnJvcihzZWxmLCB1cmwsIHJlYXNvbj1lKQogICAgICAgICAgICByYWlzZSBQcm90b2NvbEVycm9yKGUpCgogICAgICAgIGV4Y2VwdCB1cmxmZXRjaC5SZXNwb25zZVRvb0xhcmdlRXJyb3IgYXMgZToKICAgICAgICAgICAgcmFpc2UgQXBwRW5naW5lUGxhdGZvcm1FcnJvcigKICAgICAgICAgICAgICAgICJVUkxGZXRjaCByZXNwb25zZSB0b28gbGFyZ2UsIFVSTEZldGNoIG9ubHkgc3VwcG9ydHMiCiAgICAgICAgICAgICAgICAicmVzcG9uc2VzIHVwIHRvIDMybWIgaW4gc2l6ZS4iLCBlKQoKICAgICAgICBleGNlcHQgdXJsZmV0Y2guU1NMQ2VydGlmaWNhdGVFcnJvciBhcyBlOgogICAgICAgICAgICByYWlzZSBTU0xFcnJvcihlKQoKICAgICAgICBleGNlcHQgdXJsZmV0Y2guSW52YWxpZE1ldGhvZEVycm9yIGFzIGU6CiAgICAgICAgICAgIHJhaXNlIEFwcEVuZ2luZVBsYXRmb3JtRXJyb3IoCiAgICAgICAgICAgICAgICAiVVJMRmV0Y2ggZG9lcyBub3Qgc3VwcG9ydCBtZXRob2Q6ICVzIiAlIG1ldGhvZCwgZSkKCiAgICAgICAgaHR0cF9yZXNwb25zZSA9IHNlbGYuX3VybGZldGNoX3Jlc3BvbnNlX3RvX2h0dHBfcmVzcG9uc2UoCiAgICAgICAgICAgIHJlc3BvbnNlLCByZXRyaWVzPXJldHJpZXMsICoqcmVzcG9uc2Vfa3cpCgogICAgICAgICMgSGFuZGxlIHJlZGlyZWN0PwogICAgICAgIHJlZGlyZWN0X2xvY2F0aW9uID0gcmVkaXJlY3QgYW5kIGh0dHBfcmVzcG9uc2UuZ2V0X3JlZGlyZWN0X2xvY2F0aW9uKCkKICAgICAgICBpZiByZWRpcmVjdF9sb2NhdGlvbjoKICAgICAgICAgICAgIyBDaGVjayBmb3IgcmVkaXJlY3QgcmVzcG9uc2UKICAgICAgICAgICAgaWYgKHNlbGYudXJsZmV0Y2hfcmV0cmllcyBhbmQgcmV0cmllcy5yYWlzZV9vbl9yZWRpcmVjdCk6CiAgICAgICAgICAgICAgICByYWlzZSBNYXhSZXRyeUVycm9yKHNlbGYsIHVybCwgInRvbyBtYW55IHJlZGlyZWN0cyIpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBpZiBodHRwX3Jlc3BvbnNlLnN0YXR1cyA9PSAzMDM6CiAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gJ0dFVCcKCiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgcmV0cmllcyA9IHJldHJpZXMuaW5jcmVtZW50KG1ldGhvZCwgdXJsLCByZXNwb25zZT1odHRwX3Jlc3BvbnNlLCBfcG9vbD1zZWxmKQogICAgICAgICAgICAgICAgZXhjZXB0IE1heFJldHJ5RXJyb3I6CiAgICAgICAgICAgICAgICAgICAgaWYgcmV0cmllcy5yYWlzZV9vbl9yZWRpcmVjdDoKICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgTWF4UmV0cnlFcnJvcihzZWxmLCB1cmwsICJ0b28gbWFueSByZWRpcmVjdHMiKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBodHRwX3Jlc3BvbnNlCgogICAgICAgICAgICAgICAgcmV0cmllcy5zbGVlcF9mb3JfcmV0cnkoaHR0cF9yZXNwb25zZSkKICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUmVkaXJlY3RpbmcgJXMgLT4gJXMiLCB1cmwsIHJlZGlyZWN0X2xvY2F0aW9uKQogICAgICAgICAgICAgICAgcmVkaXJlY3RfdXJsID0gdXJsam9pbih1cmwsIHJlZGlyZWN0X2xvY2F0aW9uKQogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYudXJsb3BlbigKICAgICAgICAgICAgICAgICAgICBtZXRob2QsIHJlZGlyZWN0X3VybCwgYm9keSwgaGVhZGVycywKICAgICAgICAgICAgICAgICAgICByZXRyaWVzPXJldHJpZXMsIHJlZGlyZWN0PXJlZGlyZWN0LAogICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ9dGltZW91dCwgKipyZXNwb25zZV9rdykKCiAgICAgICAgIyBDaGVjayBpZiB3ZSBzaG91bGQgcmV0cnkgdGhlIEhUVFAgcmVzcG9uc2UuCiAgICAgICAgaGFzX3JldHJ5X2FmdGVyID0gYm9vbChodHRwX3Jlc3BvbnNlLmdldGhlYWRlcignUmV0cnktQWZ0ZXInKSkKICAgICAgICBpZiByZXRyaWVzLmlzX3JldHJ5KG1ldGhvZCwgaHR0cF9yZXNwb25zZS5zdGF0dXMsIGhhc19yZXRyeV9hZnRlcik6CiAgICAgICAgICAgIHJldHJpZXMgPSByZXRyaWVzLmluY3JlbWVudCgKICAgICAgICAgICAgICAgIG1ldGhvZCwgdXJsLCByZXNwb25zZT1odHRwX3Jlc3BvbnNlLCBfcG9vbD1zZWxmKQogICAgICAgICAgICBsb2cuZGVidWcoIlJldHJ5OiAlcyIsIHVybCkKICAgICAgICAgICAgcmV0cmllcy5zbGVlcChodHRwX3Jlc3BvbnNlKQogICAgICAgICAgICByZXR1cm4gc2VsZi51cmxvcGVuKAogICAgICAgICAgICAgICAgbWV0aG9kLCB1cmwsCiAgICAgICAgICAgICAgICBib2R5PWJvZHksIGhlYWRlcnM9aGVhZGVycywKICAgICAgICAgICAgICAgIHJldHJpZXM9cmV0cmllcywgcmVkaXJlY3Q9cmVkaXJlY3QsCiAgICAgICAgICAgICAgICB0aW1lb3V0PXRpbWVvdXQsICoqcmVzcG9uc2Vfa3cpCgogICAgICAgIHJldHVybiBodHRwX3Jlc3BvbnNlCgogICAgZGVmIF91cmxmZXRjaF9yZXNwb25zZV90b19odHRwX3Jlc3BvbnNlKHNlbGYsIHVybGZldGNoX3Jlc3AsICoqcmVzcG9uc2Vfa3cpOgoKICAgICAgICBpZiBpc19wcm9kX2FwcGVuZ2luZSgpOgogICAgICAgICAgICAjIFByb2R1Y3Rpb24gR0FFIGhhbmRsZXMgZGVmbGF0ZSBlbmNvZGluZyBhdXRvbWF0aWNhbGx5LCBidXQgZG9lcwogICAgICAgICAgICAjIG5vdCByZW1vdmUgdGhlIGVuY29kaW5nIGhlYWRlci4KICAgICAgICAgICAgY29udGVudF9lbmNvZGluZyA9IHVybGZldGNoX3Jlc3AuaGVhZGVycy5nZXQoJ2NvbnRlbnQtZW5jb2RpbmcnKQoKICAgICAgICAgICAgaWYgY29udGVudF9lbmNvZGluZyA9PSAnZGVmbGF0ZSc6CiAgICAgICAgICAgICAgICBkZWwgdXJsZmV0Y2hfcmVzcC5oZWFkZXJzWydjb250ZW50LWVuY29kaW5nJ10KCiAgICAgICAgdHJhbnNmZXJfZW5jb2RpbmcgPSB1cmxmZXRjaF9yZXNwLmhlYWRlcnMuZ2V0KCd0cmFuc2Zlci1lbmNvZGluZycpCiAgICAgICAgIyBXZSBoYXZlIGEgZnVsbCByZXNwb25zZSdzIGNvbnRlbnQsCiAgICAgICAgIyBzbyBsZXQncyBtYWtlIHN1cmUgd2UgZG9uJ3QgcmVwb3J0IG91cnNlbHZlcyBhcyBjaHVua2VkIGRhdGEuCiAgICAgICAgaWYgdHJhbnNmZXJfZW5jb2RpbmcgPT0gJ2NodW5rZWQnOgogICAgICAgICAgICBlbmNvZGluZ3MgPSB0cmFuc2Zlcl9lbmNvZGluZy5zcGxpdCgiLCIpCiAgICAgICAgICAgIGVuY29kaW5ncy5yZW1vdmUoJ2NodW5rZWQnKQogICAgICAgICAgICB1cmxmZXRjaF9yZXNwLmhlYWRlcnNbJ3RyYW5zZmVyLWVuY29kaW5nJ10gPSAnLCcuam9pbihlbmNvZGluZ3MpCgogICAgICAgIHJldHVybiBIVFRQUmVzcG9uc2UoCiAgICAgICAgICAgICMgSW4gb3JkZXIgZm9yIGRlY29kaW5nIHRvIHdvcmssIHdlIG11c3QgcHJlc2VudCB0aGUgY29udGVudCBhcwogICAgICAgICAgICAjIGEgZmlsZS1saWtlIG9iamVjdC4KICAgICAgICAgICAgYm9keT1CeXRlc0lPKHVybGZldGNoX3Jlc3AuY29udGVudCksCiAgICAgICAgICAgIGhlYWRlcnM9dXJsZmV0Y2hfcmVzcC5oZWFkZXJzLAogICAgICAgICAgICBzdGF0dXM9dXJsZmV0Y2hfcmVzcC5zdGF0dXNfY29kZSwKICAgICAgICAgICAgKipyZXNwb25zZV9rdwogICAgICAgICkKCiAgICBkZWYgX2dldF9hYnNvbHV0ZV90aW1lb3V0KHNlbGYsIHRpbWVvdXQpOgogICAgICAgIGlmIHRpbWVvdXQgaXMgVGltZW91dC5ERUZBVUxUX1RJTUVPVVQ6CiAgICAgICAgICAgIHJldHVybiBOb25lICAjIERlZmVyIHRvIFVSTEZldGNoJ3MgZGVmYXVsdC4KICAgICAgICBpZiBpc2luc3RhbmNlKHRpbWVvdXQsIFRpbWVvdXQpOgogICAgICAgICAgICBpZiB0aW1lb3V0Ll9yZWFkIGlzIG5vdCBOb25lIG9yIHRpbWVvdXQuX2Nvbm5lY3QgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKAogICAgICAgICAgICAgICAgICAgICJVUkxGZXRjaCBkb2VzIG5vdCBzdXBwb3J0IGdyYW51bGFyIHRpbWVvdXQgc2V0dGluZ3MsICIKICAgICAgICAgICAgICAgICAgICAicmV2ZXJ0aW5nIHRvIHRvdGFsIG9yIGRlZmF1bHQgVVJMRmV0Y2ggdGltZW91dC4iLAogICAgICAgICAgICAgICAgICAgIEFwcEVuZ2luZVBsYXRmb3JtV2FybmluZykKICAgICAgICAgICAgcmV0dXJuIHRpbWVvdXQudG90YWwKICAgICAgICByZXR1cm4gdGltZW91dAoKICAgIGRlZiBfZ2V0X3JldHJpZXMoc2VsZiwgcmV0cmllcywgcmVkaXJlY3QpOgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHJldHJpZXMsIFJldHJ5KToKICAgICAgICAgICAgcmV0cmllcyA9IFJldHJ5LmZyb21faW50KAogICAgICAgICAgICAgICAgcmV0cmllcywgcmVkaXJlY3Q9cmVkaXJlY3QsIGRlZmF1bHQ9c2VsZi5yZXRyaWVzKQoKICAgICAgICBpZiByZXRyaWVzLmNvbm5lY3Qgb3IgcmV0cmllcy5yZWFkIG9yIHJldHJpZXMucmVkaXJlY3Q6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCiAgICAgICAgICAgICAgICAiVVJMRmV0Y2ggb25seSBzdXBwb3J0cyB0b3RhbCByZXRyaWVzIGFuZCBkb2VzIG5vdCAiCiAgICAgICAgICAgICAgICAicmVjb2duaXplIGNvbm5lY3QsIHJlYWQsIG9yIHJlZGlyZWN0IHJldHJ5IHBhcmFtZXRlcnMuIiwKICAgICAgICAgICAgICAgIEFwcEVuZ2luZVBsYXRmb3JtV2FybmluZykKCiAgICAgICAgcmV0dXJuIHJldHJpZXMKCgpkZWYgaXNfYXBwZW5naW5lKCk6CiAgICByZXR1cm4gKGlzX2xvY2FsX2FwcGVuZ2luZSgpIG9yCiAgICAgICAgICAgIGlzX3Byb2RfYXBwZW5naW5lKCkgb3IKICAgICAgICAgICAgaXNfcHJvZF9hcHBlbmdpbmVfbXZtcygpKQoKCmRlZiBpc19hcHBlbmdpbmVfc2FuZGJveCgpOgogICAgcmV0dXJuIGlzX2FwcGVuZ2luZSgpIGFuZCBub3QgaXNfcHJvZF9hcHBlbmdpbmVfbXZtcygpCgoKZGVmIGlzX2xvY2FsX2FwcGVuZ2luZSgpOgogICAgcmV0dXJuICgnQVBQRU5HSU5FX1JVTlRJTUUnIGluIG9zLmVudmlyb24gYW5kCiAgICAgICAgICAgICdEZXZlbG9wbWVudC8nIGluIG9zLmVudmlyb25bJ1NFUlZFUl9TT0ZUV0FSRSddKQoKCmRlZiBpc19wcm9kX2FwcGVuZ2luZSgpOgogICAgcmV0dXJuICgnQVBQRU5HSU5FX1JVTlRJTUUnIGluIG9zLmVudmlyb24gYW5kCiAgICAgICAgICAgICdHb29nbGUgQXBwIEVuZ2luZS8nIGluIG9zLmVudmlyb25bJ1NFUlZFUl9TT0ZUV0FSRSddIGFuZAogICAgICAgICAgICBub3QgaXNfcHJvZF9hcHBlbmdpbmVfbXZtcygpKQoKCmRlZiBpc19wcm9kX2FwcGVuZ2luZV9tdm1zKCk6CiAgICByZXR1cm4gb3MuZW52aXJvbi5nZXQoJ0dBRV9WTScsIEZhbHNlKSA9PSAndHJ1ZScKUEsDBBQAAAAAAAAAIQAupXGNfhEAAH4RAABEAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL2NvbnRyaWIvbnRsbXBvb2wucHkiIiIKTlRMTSBhdXRoZW50aWNhdGluZyBwb29sLCBjb250cmlidXRlZCBieSBlcmlrY2VkZXJzdHJhbgoKSXNzdWUgIzEwLCBzZWU6IGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC91cmxsaWIzL2lzc3Vlcy9kZXRhaWw/aWQ9MTAKIiIiCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0Cgpmcm9tIGxvZ2dpbmcgaW1wb3J0IGdldExvZ2dlcgpmcm9tIG50bG0gaW1wb3J0IG50bG0KCmZyb20gLi4gaW1wb3J0IEhUVFBTQ29ubmVjdGlvblBvb2wKZnJvbSAuLnBhY2thZ2VzLnNpeC5tb3Zlcy5odHRwX2NsaWVudCBpbXBvcnQgSFRUUFNDb25uZWN0aW9uCgoKbG9nID0gZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKCmNsYXNzIE5UTE1Db25uZWN0aW9uUG9vbChIVFRQU0Nvbm5lY3Rpb25Qb29sKToKICAgICIiIgogICAgSW1wbGVtZW50cyBhbiBOVExNIGF1dGhlbnRpY2F0aW9uIHZlcnNpb24gb2YgYW4gdXJsbGliMyBjb25uZWN0aW9uIHBvb2wKICAgICIiIgoKICAgIHNjaGVtZSA9ICdodHRwcycKCiAgICBkZWYgX19pbml0X18oc2VsZiwgdXNlciwgcHcsIGF1dGh1cmwsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgIiIiCiAgICAgICAgYXV0aHVybCBpcyBhIHJhbmRvbSBVUkwgb24gdGhlIHNlcnZlciB0aGF0IGlzIHByb3RlY3RlZCBieSBOVExNLgogICAgICAgIHVzZXIgaXMgdGhlIFdpbmRvd3MgdXNlciwgcHJvYmFibHkgaW4gdGhlIERPTUFJTlxcdXNlcm5hbWUgZm9ybWF0LgogICAgICAgIHB3IGlzIHRoZSBwYXNzd29yZCBmb3IgdGhlIHVzZXIuCiAgICAgICAgIiIiCiAgICAgICAgc3VwZXIoTlRMTUNvbm5lY3Rpb25Qb29sLCBzZWxmKS5fX2luaXRfXygqYXJncywgKiprd2FyZ3MpCiAgICAgICAgc2VsZi5hdXRodXJsID0gYXV0aHVybAogICAgICAgIHNlbGYucmF3dXNlciA9IHVzZXIKICAgICAgICB1c2VyX3BhcnRzID0gdXNlci5zcGxpdCgnXFwnLCAxKQogICAgICAgIHNlbGYuZG9tYWluID0gdXNlcl9wYXJ0c1swXS51cHBlcigpCiAgICAgICAgc2VsZi51c2VyID0gdXNlcl9wYXJ0c1sxXQogICAgICAgIHNlbGYucHcgPSBwdwoKICAgIGRlZiBfbmV3X2Nvbm4oc2VsZik6CiAgICAgICAgIyBQZXJmb3JtcyB0aGUgTlRMTSBoYW5kc2hha2UgdGhhdCBzZWN1cmVzIHRoZSBjb25uZWN0aW9uLiBUaGUgc29ja2V0CiAgICAgICAgIyBtdXN0IGJlIGtlcHQgb3BlbiB3aGlsZSByZXF1ZXN0cyBhcmUgcGVyZm9ybWVkLgogICAgICAgIHNlbGYubnVtX2Nvbm5lY3Rpb25zICs9IDEKICAgICAgICBsb2cuZGVidWcoJ1N0YXJ0aW5nIE5UTE0gSFRUUFMgY29ubmVjdGlvbiBuby4gJWQ6IGh0dHBzOi8vJXMlcycsCiAgICAgICAgICAgICAgICAgIHNlbGYubnVtX2Nvbm5lY3Rpb25zLCBzZWxmLmhvc3QsIHNlbGYuYXV0aHVybCkKCiAgICAgICAgaGVhZGVycyA9IHt9CiAgICAgICAgaGVhZGVyc1snQ29ubmVjdGlvbiddID0gJ0tlZXAtQWxpdmUnCiAgICAgICAgcmVxX2hlYWRlciA9ICdBdXRob3JpemF0aW9uJwogICAgICAgIHJlc3BfaGVhZGVyID0gJ3d3dy1hdXRoZW50aWNhdGUnCgogICAgICAgIGNvbm4gPSBIVFRQU0Nvbm5lY3Rpb24oaG9zdD1zZWxmLmhvc3QsIHBvcnQ9c2VsZi5wb3J0KQoKICAgICAgICAjIFNlbmQgbmVnb3RpYXRpb24gbWVzc2FnZQogICAgICAgIGhlYWRlcnNbcmVxX2hlYWRlcl0gPSAoCiAgICAgICAgICAgICdOVExNICVzJyAlIG50bG0uY3JlYXRlX05UTE1fTkVHT1RJQVRFX01FU1NBR0Uoc2VsZi5yYXd1c2VyKSkKICAgICAgICBsb2cuZGVidWcoJ1JlcXVlc3QgaGVhZGVyczogJXMnLCBoZWFkZXJzKQogICAgICAgIGNvbm4ucmVxdWVzdCgnR0VUJywgc2VsZi5hdXRodXJsLCBOb25lLCBoZWFkZXJzKQogICAgICAgIHJlcyA9IGNvbm4uZ2V0cmVzcG9uc2UoKQogICAgICAgIHJlc2hkciA9IGRpY3QocmVzLmdldGhlYWRlcnMoKSkKICAgICAgICBsb2cuZGVidWcoJ1Jlc3BvbnNlIHN0YXR1czogJXMgJXMnLCByZXMuc3RhdHVzLCByZXMucmVhc29uKQogICAgICAgIGxvZy5kZWJ1ZygnUmVzcG9uc2UgaGVhZGVyczogJXMnLCByZXNoZHIpCiAgICAgICAgbG9nLmRlYnVnKCdSZXNwb25zZSBkYXRhOiAlcyBbLi4uXScsIHJlcy5yZWFkKDEwMCkpCgogICAgICAgICMgUmVtb3ZlIHRoZSByZWZlcmVuY2UgdG8gdGhlIHNvY2tldCwgc28gdGhhdCBpdCBjYW4gbm90IGJlIGNsb3NlZCBieQogICAgICAgICMgdGhlIHJlc3BvbnNlIG9iamVjdCAod2Ugd2FudCB0byBrZWVwIHRoZSBzb2NrZXQgb3BlbikKICAgICAgICByZXMuZnAgPSBOb25lCgogICAgICAgICMgU2VydmVyIHNob3VsZCByZXNwb25kIHdpdGggYSBjaGFsbGVuZ2UgbWVzc2FnZQogICAgICAgIGF1dGhfaGVhZGVyX3ZhbHVlcyA9IHJlc2hkcltyZXNwX2hlYWRlcl0uc3BsaXQoJywgJykKICAgICAgICBhdXRoX2hlYWRlcl92YWx1ZSA9IE5vbmUKICAgICAgICBmb3IgcyBpbiBhdXRoX2hlYWRlcl92YWx1ZXM6CiAgICAgICAgICAgIGlmIHNbOjVdID09ICdOVExNICc6CiAgICAgICAgICAgICAgICBhdXRoX2hlYWRlcl92YWx1ZSA9IHNbNTpdCiAgICAgICAgaWYgYXV0aF9oZWFkZXJfdmFsdWUgaXMgTm9uZToKICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCdVbmV4cGVjdGVkICVzIHJlc3BvbnNlIGhlYWRlcjogJXMnICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZXNwX2hlYWRlciwgcmVzaGRyW3Jlc3BfaGVhZGVyXSkpCgogICAgICAgICMgU2VuZCBhdXRoZW50aWNhdGlvbiBtZXNzYWdlCiAgICAgICAgU2VydmVyQ2hhbGxlbmdlLCBOZWdvdGlhdGVGbGFncyA9IFwKICAgICAgICAgICAgbnRsbS5wYXJzZV9OVExNX0NIQUxMRU5HRV9NRVNTQUdFKGF1dGhfaGVhZGVyX3ZhbHVlKQogICAgICAgIGF1dGhfbXNnID0gbnRsbS5jcmVhdGVfTlRMTV9BVVRIRU5USUNBVEVfTUVTU0FHRShTZXJ2ZXJDaGFsbGVuZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudXNlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kb21haW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucHcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5lZ290aWF0ZUZsYWdzKQogICAgICAgIGhlYWRlcnNbcmVxX2hlYWRlcl0gPSAnTlRMTSAlcycgJSBhdXRoX21zZwogICAgICAgIGxvZy5kZWJ1ZygnUmVxdWVzdCBoZWFkZXJzOiAlcycsIGhlYWRlcnMpCiAgICAgICAgY29ubi5yZXF1ZXN0KCdHRVQnLCBzZWxmLmF1dGh1cmwsIE5vbmUsIGhlYWRlcnMpCiAgICAgICAgcmVzID0gY29ubi5nZXRyZXNwb25zZSgpCiAgICAgICAgbG9nLmRlYnVnKCdSZXNwb25zZSBzdGF0dXM6ICVzICVzJywgcmVzLnN0YXR1cywgcmVzLnJlYXNvbikKICAgICAgICBsb2cuZGVidWcoJ1Jlc3BvbnNlIGhlYWRlcnM6ICVzJywgZGljdChyZXMuZ2V0aGVhZGVycygpKSkKICAgICAgICBsb2cuZGVidWcoJ1Jlc3BvbnNlIGRhdGE6ICVzIFsuLi5dJywgcmVzLnJlYWQoKVs6MTAwXSkKICAgICAgICBpZiByZXMuc3RhdHVzICE9IDIwMDoKICAgICAgICAgICAgaWYgcmVzLnN0YXR1cyA9PSA0MDE6CiAgICAgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oJ1NlcnZlciByZWplY3RlZCByZXF1ZXN0OiB3cm9uZyAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZXJuYW1lIG9yIHBhc3N3b3JkJykKICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCdXcm9uZyBzZXJ2ZXIgcmVzcG9uc2U6ICVzICVzJyAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVzLnN0YXR1cywgcmVzLnJlYXNvbikpCgogICAgICAgIHJlcy5mcCA9IE5vbmUKICAgICAgICBsb2cuZGVidWcoJ0Nvbm5lY3Rpb24gZXN0YWJsaXNoZWQnKQogICAgICAgIHJldHVybiBjb25uCgogICAgZGVmIHVybG9wZW4oc2VsZiwgbWV0aG9kLCB1cmwsIGJvZHk9Tm9uZSwgaGVhZGVycz1Ob25lLCByZXRyaWVzPTMsCiAgICAgICAgICAgICAgICByZWRpcmVjdD1UcnVlLCBhc3NlcnRfc2FtZV9ob3N0PVRydWUpOgogICAgICAgIGlmIGhlYWRlcnMgaXMgTm9uZToKICAgICAgICAgICAgaGVhZGVycyA9IHt9CiAgICAgICAgaGVhZGVyc1snQ29ubmVjdGlvbiddID0gJ0tlZXAtQWxpdmUnCiAgICAgICAgcmV0dXJuIHN1cGVyKE5UTE1Db25uZWN0aW9uUG9vbCwgc2VsZikudXJsb3BlbihtZXRob2QsIHVybCwgYm9keSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnMsIHJldHJpZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydF9zYW1lX2hvc3QpClBLAwQUAAAAAAAAACEA8yq2cfo7AAD6OwAARQAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9jb250cmliL3B5b3BlbnNzbC5weSIiIgpTU0wgd2l0aCBTTklfLXN1cHBvcnQgZm9yIFB5dGhvbiAyLiBGb2xsb3cgdGhlc2UgaW5zdHJ1Y3Rpb25zIGlmIHlvdSB3b3VsZApsaWtlIHRvIHZlcmlmeSBTU0wgY2VydGlmaWNhdGVzIGluIFB5dGhvbiAyLiBOb3RlLCB0aGUgZGVmYXVsdCBsaWJyYXJpZXMgZG8KKm5vdCogZG8gY2VydGlmaWNhdGUgY2hlY2tpbmc7IHlvdSBuZWVkIHRvIGRvIGFkZGl0aW9uYWwgd29yayB0byB2YWxpZGF0ZQpjZXJ0aWZpY2F0ZXMgeW91cnNlbGYuCgpUaGlzIG5lZWRzIHRoZSBmb2xsb3dpbmcgcGFja2FnZXMgaW5zdGFsbGVkOgoKKiBweU9wZW5TU0wgKHRlc3RlZCB3aXRoIDE2LjAuMCkKKiBjcnlwdG9ncmFwaHkgKG1pbmltdW0gMS4zLjQsIGZyb20gcHlvcGVuc3NsKQoqIGlkbmEgKG1pbmltdW0gMi4wLCBmcm9tIGNyeXB0b2dyYXBoeSkKCkhvd2V2ZXIsIHB5b3BlbnNzbCBkZXBlbmRzIG9uIGNyeXB0b2dyYXBoeSwgd2hpY2ggZGVwZW5kcyBvbiBpZG5hLCBzbyB3aGlsZSB3ZQp1c2UgYWxsIHRocmVlIGRpcmVjdGx5IGhlcmUgd2UgZW5kIHVwIGhhdmluZyByZWxhdGl2ZWx5IGZldyBwYWNrYWdlcyByZXF1aXJlZC4KCllvdSBjYW4gaW5zdGFsbCB0aGVtIHdpdGggdGhlIGZvbGxvd2luZyBjb21tYW5kOgoKICAgIHBpcCBpbnN0YWxsIHB5b3BlbnNzbCBjcnlwdG9ncmFwaHkgaWRuYQoKVG8gYWN0aXZhdGUgY2VydGlmaWNhdGUgY2hlY2tpbmcsIGNhbGwKOmZ1bmM6YH51cmxsaWIzLmNvbnRyaWIucHlvcGVuc3NsLmluamVjdF9pbnRvX3VybGxpYjNgIGZyb20geW91ciBQeXRob24gY29kZQpiZWZvcmUgeW91IGJlZ2luIG1ha2luZyBIVFRQIHJlcXVlc3RzLiBUaGlzIGNhbiBiZSBkb25lIGluIGEgYGBzaXRlY3VzdG9taXplYGAKbW9kdWxlLCBvciBhdCBhbnkgb3RoZXIgdGltZSBiZWZvcmUgeW91ciBhcHBsaWNhdGlvbiBiZWdpbnMgdXNpbmcgYGB1cmxsaWIzYGAsCmxpa2UgdGhpczo6CgogICAgdHJ5OgogICAgICAgIGltcG9ydCB1cmxsaWIzLmNvbnRyaWIucHlvcGVuc3NsCiAgICAgICAgdXJsbGliMy5jb250cmliLnB5b3BlbnNzbC5pbmplY3RfaW50b191cmxsaWIzKCkKICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICBwYXNzCgpOb3cgeW91IGNhbiB1c2UgOm1vZDpgdXJsbGliM2AgYXMgeW91IG5vcm1hbGx5IHdvdWxkLCBhbmQgaXQgd2lsbCBzdXBwb3J0IFNOSQp3aGVuIHRoZSByZXF1aXJlZCBtb2R1bGVzIGFyZSBpbnN0YWxsZWQuCgpBY3RpdmF0aW5nIHRoaXMgbW9kdWxlIGFsc28gaGFzIHRoZSBwb3NpdGl2ZSBzaWRlIGVmZmVjdCBvZiBkaXNhYmxpbmcgU1NML1RMUwpjb21wcmVzc2lvbiBpbiBQeXRob24gMiAoc2VlIGBDUklNRSBhdHRhY2tgXykuCgpJZiB5b3Ugd2FudCB0byBjb25maWd1cmUgdGhlIGRlZmF1bHQgbGlzdCBvZiBzdXBwb3J0ZWQgY2lwaGVyIHN1aXRlcywgeW91IGNhbgpzZXQgdGhlIGBgdXJsbGliMy5jb250cmliLnB5b3BlbnNzbC5ERUZBVUxUX1NTTF9DSVBIRVJfTElTVGBgIHZhcmlhYmxlLgoKLi4gX3NuaTogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU2VydmVyX05hbWVfSW5kaWNhdGlvbgouLiBfY3JpbWUgYXR0YWNrOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9DUklNRV8oc2VjdXJpdHlfZXhwbG9pdCkKIiIiCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgT3BlblNTTC5TU0wKZnJvbSBjcnlwdG9ncmFwaHkgaW1wb3J0IHg1MDkKZnJvbSBjcnlwdG9ncmFwaHkuaGF6bWF0LmJhY2tlbmRzLm9wZW5zc2wgaW1wb3J0IGJhY2tlbmQgYXMgb3BlbnNzbF9iYWNrZW5kCmZyb20gY3J5cHRvZ3JhcGh5Lmhhem1hdC5iYWNrZW5kcy5vcGVuc3NsLng1MDkgaW1wb3J0IF9DZXJ0aWZpY2F0ZQoKZnJvbSBzb2NrZXQgaW1wb3J0IHRpbWVvdXQsIGVycm9yIGFzIFNvY2tldEVycm9yCmZyb20gaW8gaW1wb3J0IEJ5dGVzSU8KCnRyeTogICMgUGxhdGZvcm0tc3BlY2lmaWM6IFB5dGhvbiAyCiAgICBmcm9tIHNvY2tldCBpbXBvcnQgX2ZpbGVvYmplY3QKZXhjZXB0IEltcG9ydEVycm9yOiAgIyBQbGF0Zm9ybS1zcGVjaWZpYzogUHl0aG9uIDMKICAgIF9maWxlb2JqZWN0ID0gTm9uZQogICAgZnJvbSAuLnBhY2thZ2VzLmJhY2twb3J0cy5tYWtlZmlsZSBpbXBvcnQgYmFja3BvcnRfbWFrZWZpbGUKCmltcG9ydCBsb2dnaW5nCmltcG9ydCBzc2wKZnJvbSAuLnBhY2thZ2VzIGltcG9ydCBzaXgKaW1wb3J0IHN5cwoKZnJvbSAuLiBpbXBvcnQgdXRpbAoKX19hbGxfXyA9IFsnaW5qZWN0X2ludG9fdXJsbGliMycsICdleHRyYWN0X2Zyb21fdXJsbGliMyddCgojIFNOSSBhbHdheXMgd29ya3MuCkhBU19TTkkgPSBUcnVlCgojIE1hcCBmcm9tIHVybGxpYjMgdG8gUHlPcGVuU1NMIGNvbXBhdGlibGUgcGFyYW1ldGVyLXZhbHVlcy4KX29wZW5zc2xfdmVyc2lvbnMgPSB7CiAgICBzc2wuUFJPVE9DT0xfU1NMdjIzOiBPcGVuU1NMLlNTTC5TU0x2MjNfTUVUSE9ELAogICAgc3NsLlBST1RPQ09MX1RMU3YxOiBPcGVuU1NMLlNTTC5UTFN2MV9NRVRIT0QsCn0KCmlmIGhhc2F0dHIoc3NsLCAnUFJPVE9DT0xfVExTdjFfMScpIGFuZCBoYXNhdHRyKE9wZW5TU0wuU1NMLCAnVExTdjFfMV9NRVRIT0QnKToKICAgIF9vcGVuc3NsX3ZlcnNpb25zW3NzbC5QUk9UT0NPTF9UTFN2MV8xXSA9IE9wZW5TU0wuU1NMLlRMU3YxXzFfTUVUSE9ECgppZiBoYXNhdHRyKHNzbCwgJ1BST1RPQ09MX1RMU3YxXzInKSBhbmQgaGFzYXR0cihPcGVuU1NMLlNTTCwgJ1RMU3YxXzJfTUVUSE9EJyk6CiAgICBfb3BlbnNzbF92ZXJzaW9uc1tzc2wuUFJPVE9DT0xfVExTdjFfMl0gPSBPcGVuU1NMLlNTTC5UTFN2MV8yX01FVEhPRAoKdHJ5OgogICAgX29wZW5zc2xfdmVyc2lvbnMudXBkYXRlKHtzc2wuUFJPVE9DT0xfU1NMdjM6IE9wZW5TU0wuU1NMLlNTTHYzX01FVEhPRH0pCmV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgIHBhc3MKCl9zdGRsaWJfdG9fb3BlbnNzbF92ZXJpZnkgPSB7CiAgICBzc2wuQ0VSVF9OT05FOiBPcGVuU1NMLlNTTC5WRVJJRllfTk9ORSwKICAgIHNzbC5DRVJUX09QVElPTkFMOiBPcGVuU1NMLlNTTC5WRVJJRllfUEVFUiwKICAgIHNzbC5DRVJUX1JFUVVJUkVEOgogICAgICAgIE9wZW5TU0wuU1NMLlZFUklGWV9QRUVSICsgT3BlblNTTC5TU0wuVkVSSUZZX0ZBSUxfSUZfTk9fUEVFUl9DRVJULAp9Cl9vcGVuc3NsX3RvX3N0ZGxpYl92ZXJpZnkgPSBkaWN0KAogICAgKHYsIGspIGZvciBrLCB2IGluIF9zdGRsaWJfdG9fb3BlbnNzbF92ZXJpZnkuaXRlbXMoKQopCgojIE9wZW5TU0wgd2lsbCBvbmx5IHdyaXRlIDE2SyBhdCBhIHRpbWUKU1NMX1dSSVRFX0JMT0NLU0laRSA9IDE2Mzg0CgpvcmlnX3V0aWxfSEFTX1NOSSA9IHV0aWwuSEFTX1NOSQpvcmlnX3V0aWxfU1NMQ29udGV4dCA9IHV0aWwuc3NsXy5TU0xDb250ZXh0CgoKbG9nID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgoKZGVmIGluamVjdF9pbnRvX3VybGxpYjMoKToKICAgICdNb25rZXktcGF0Y2ggdXJsbGliMyB3aXRoIFB5T3BlblNTTC1iYWNrZWQgU1NMLXN1cHBvcnQuJwoKICAgIF92YWxpZGF0ZV9kZXBlbmRlbmNpZXNfbWV0KCkKCiAgICB1dGlsLnNzbF8uU1NMQ29udGV4dCA9IFB5T3BlblNTTENvbnRleHQKICAgIHV0aWwuSEFTX1NOSSA9IEhBU19TTkkKICAgIHV0aWwuc3NsXy5IQVNfU05JID0gSEFTX1NOSQogICAgdXRpbC5JU19QWU9QRU5TU0wgPSBUcnVlCiAgICB1dGlsLnNzbF8uSVNfUFlPUEVOU1NMID0gVHJ1ZQoKCmRlZiBleHRyYWN0X2Zyb21fdXJsbGliMygpOgogICAgJ1VuZG8gbW9ua2V5LXBhdGNoaW5nIGJ5IDpmdW5jOmBpbmplY3RfaW50b191cmxsaWIzYC4nCgogICAgdXRpbC5zc2xfLlNTTENvbnRleHQgPSBvcmlnX3V0aWxfU1NMQ29udGV4dAogICAgdXRpbC5IQVNfU05JID0gb3JpZ191dGlsX0hBU19TTkkKICAgIHV0aWwuc3NsXy5IQVNfU05JID0gb3JpZ191dGlsX0hBU19TTkkKICAgIHV0aWwuSVNfUFlPUEVOU1NMID0gRmFsc2UKICAgIHV0aWwuc3NsXy5JU19QWU9QRU5TU0wgPSBGYWxzZQoKCmRlZiBfdmFsaWRhdGVfZGVwZW5kZW5jaWVzX21ldCgpOgogICAgIiIiCiAgICBWZXJpZmllcyB0aGF0IFB5T3BlblNTTCdzIHBhY2thZ2UtbGV2ZWwgZGVwZW5kZW5jaWVzIGhhdmUgYmVlbiBtZXQuCiAgICBUaHJvd3MgYEltcG9ydEVycm9yYCBpZiB0aGV5IGFyZSBub3QgbWV0LgogICAgIiIiCiAgICAjIE1ldGhvZCBhZGRlZCBpbiBgY3J5cHRvZ3JhcGh5PT0xLjFgOyBub3QgYXZhaWxhYmxlIGluIG9sZGVyIHZlcnNpb25zCiAgICBmcm9tIGNyeXB0b2dyYXBoeS54NTA5LmV4dGVuc2lvbnMgaW1wb3J0IEV4dGVuc2lvbnMKICAgIGlmIGdldGF0dHIoRXh0ZW5zaW9ucywgImdldF9leHRlbnNpb25fZm9yX2NsYXNzIiwgTm9uZSkgaXMgTm9uZToKICAgICAgICByYWlzZSBJbXBvcnRFcnJvcigiJ2NyeXB0b2dyYXBoeScgbW9kdWxlIG1pc3NpbmcgcmVxdWlyZWQgZnVuY3Rpb25hbGl0eS4gICIKICAgICAgICAgICAgICAgICAgICAgICAgICAiVHJ5IHVwZ3JhZGluZyB0byB2MS4zLjQgb3IgbmV3ZXIuIikKCiAgICAjIHB5T3BlblNTTCAwLjE0IGFuZCBhYm92ZSB1c2UgY3J5cHRvZ3JhcGh5IGZvciBPcGVuU1NMIGJpbmRpbmdzLiBUaGUgX3g1MDkKICAgICMgYXR0cmlidXRlIGlzIG9ubHkgcHJlc2VudCBvbiB0aG9zZSB2ZXJzaW9ucy4KICAgIGZyb20gT3BlblNTTC5jcnlwdG8gaW1wb3J0IFg1MDkKICAgIHg1MDkgPSBYNTA5KCkKICAgIGlmIGdldGF0dHIoeDUwOSwgIl94NTA5IiwgTm9uZSkgaXMgTm9uZToKICAgICAgICByYWlzZSBJbXBvcnRFcnJvcigiJ3B5T3BlblNTTCcgbW9kdWxlIG1pc3NpbmcgcmVxdWlyZWQgZnVuY3Rpb25hbGl0eS4gIgogICAgICAgICAgICAgICAgICAgICAgICAgICJUcnkgdXBncmFkaW5nIHRvIHYwLjE0IG9yIG5ld2VyLiIpCgoKZGVmIF9kbnNuYW1lX3RvX3N0ZGxpYihuYW1lKToKICAgICIiIgogICAgQ29udmVydHMgYSBkTlNOYW1lIFN1YmplY3RBbHRlcm5hdGl2ZU5hbWUgZmllbGQgdG8gdGhlIGZvcm0gdXNlZCBieSB0aGUKICAgIHN0YW5kYXJkIGxpYnJhcnkgb24gdGhlIGdpdmVuIFB5dGhvbiB2ZXJzaW9uLgoKICAgIENyeXB0b2dyYXBoeSBwcm9kdWNlcyBhIGROU05hbWUgYXMgYSB1bmljb2RlIHN0cmluZyB0aGF0IHdhcyBpZG5hLWRlY29kZWQKICAgIGZyb20gQVNDSUkgYnl0ZXMuIFdlIG5lZWQgdG8gaWRuYS1lbmNvZGUgdGhhdCBzdHJpbmcgdG8gZ2V0IGl0IGJhY2ssIGFuZAogICAgdGhlbiBvbiBQeXRob24gMyB3ZSBhbHNvIG5lZWQgdG8gY29udmVydCB0byB1bmljb2RlIHZpYSBVVEYtOCAodGhlIHN0ZGxpYgogICAgdXNlcyBQeVVuaWNvZGVfRnJvbVN0cmluZ0FuZFNpemUgb24gaXQsIHdoaWNoIGRlY29kZXMgdmlhIFVURi04KS4KICAgICIiIgogICAgZGVmIGlkbmFfZW5jb2RlKG5hbWUpOgogICAgICAgICIiIgogICAgICAgIEJvcnJvd2VkIHdob2xlc2FsZSBmcm9tIHRoZSBQeXRob24gQ3J5cHRvZ3JhcGh5IFByb2plY3QuIEl0IHR1cm5zIG91dAogICAgICAgIHRoYXQgd2UgY2FuJ3QganVzdCBzYWZlbHkgY2FsbCBgaWRuYS5lbmNvZGVgOiBpdCBjYW4gZXhwbG9kZSBmb3IKICAgICAgICB3aWxkY2FyZCBuYW1lcy4gVGhpcyBhdm9pZHMgdGhhdCBwcm9ibGVtLgogICAgICAgICIiIgogICAgICAgIGltcG9ydCBpZG5hCgogICAgICAgIGZvciBwcmVmaXggaW4gW3UnKi4nLCB1Jy4nXToKICAgICAgICAgICAgaWYgbmFtZS5zdGFydHN3aXRoKHByZWZpeCk6CiAgICAgICAgICAgICAgICBuYW1lID0gbmFtZVtsZW4ocHJlZml4KTpdCiAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4LmVuY29kZSgnYXNjaWknKSArIGlkbmEuZW5jb2RlKG5hbWUpCiAgICAgICAgcmV0dXJuIGlkbmEuZW5jb2RlKG5hbWUpCgogICAgbmFtZSA9IGlkbmFfZW5jb2RlKG5hbWUpCiAgICBpZiBzeXMudmVyc2lvbl9pbmZvID49ICgzLCAwKToKICAgICAgICBuYW1lID0gbmFtZS5kZWNvZGUoJ3V0Zi04JykKICAgIHJldHVybiBuYW1lCgoKZGVmIGdldF9zdWJqX2FsdF9uYW1lKHBlZXJfY2VydCk6CiAgICAiIiIKICAgIEdpdmVuIGFuIFB5T3BlblNTTCBjZXJ0aWZpY2F0ZSwgcHJvdmlkZXMgYWxsIHRoZSBzdWJqZWN0IGFsdGVybmF0aXZlIG5hbWVzLgogICAgIiIiCiAgICAjIFBhc3MgdGhlIGNlcnQgdG8gY3J5cHRvZ3JhcGh5LCB3aGljaCBoYXMgbXVjaCBiZXR0ZXIgQVBJcyBmb3IgdGhpcy4KICAgIGlmIGhhc2F0dHIocGVlcl9jZXJ0LCAidG9fY3J5cHRvZ3JhcGh5Iik6CiAgICAgICAgY2VydCA9IHBlZXJfY2VydC50b19jcnlwdG9ncmFwaHkoKQogICAgZWxzZToKICAgICAgICAjIFRoaXMgaXMgdGVjaG5pY2FsbHkgdXNpbmcgcHJpdmF0ZSBBUElzLCBidXQgc2hvdWxkIHdvcmsgYWNyb3NzIGFsbAogICAgICAgICMgcmVsZXZhbnQgdmVyc2lvbnMgYmVmb3JlIFB5T3BlblNTTCBnb3QgYSBwcm9wZXIgQVBJIGZvciB0aGlzLgogICAgICAgIGNlcnQgPSBfQ2VydGlmaWNhdGUob3BlbnNzbF9iYWNrZW5kLCBwZWVyX2NlcnQuX3g1MDkpCgogICAgIyBXZSB3YW50IHRvIGZpbmQgdGhlIFNBTiBleHRlbnNpb24uIEFzayBDcnlwdG9ncmFwaHkgdG8gbG9jYXRlIGl0IChpdCdzCiAgICAjIGZhc3RlciB0aGFuIGxvb3BpbmcgaW4gUHl0aG9uKQogICAgdHJ5OgogICAgICAgIGV4dCA9IGNlcnQuZXh0ZW5zaW9ucy5nZXRfZXh0ZW5zaW9uX2Zvcl9jbGFzcygKICAgICAgICAgICAgeDUwOS5TdWJqZWN0QWx0ZXJuYXRpdmVOYW1lCiAgICAgICAgKS52YWx1ZQogICAgZXhjZXB0IHg1MDkuRXh0ZW5zaW9uTm90Rm91bmQ6CiAgICAgICAgIyBObyBzdWNoIGV4dGVuc2lvbiwgcmV0dXJuIHRoZSBlbXB0eSBsaXN0LgogICAgICAgIHJldHVybiBbXQogICAgZXhjZXB0ICh4NTA5LkR1cGxpY2F0ZUV4dGVuc2lvbiwgeDUwOS5VbnN1cHBvcnRlZEV4dGVuc2lvbiwKICAgICAgICAgICAgeDUwOS5VbnN1cHBvcnRlZEdlbmVyYWxOYW1lVHlwZSwgVW5pY29kZUVycm9yKSBhcyBlOgogICAgICAgICMgQSBwcm9ibGVtIGhhcyBiZWVuIGZvdW5kIHdpdGggdGhlIHF1YWxpdHkgb2YgdGhlIGNlcnRpZmljYXRlLiBBc3N1bWUKICAgICAgICAjIG5vIFNBTiBmaWVsZCBpcyBwcmVzZW50LgogICAgICAgIGxvZy53YXJuaW5nKAogICAgICAgICAgICAiQSBwcm9ibGVtIHdhcyBlbmNvdW50ZXJlZCB3aXRoIHRoZSBjZXJ0aWZpY2F0ZSB0aGF0IHByZXZlbnRlZCAiCiAgICAgICAgICAgICJ1cmxsaWIzIGZyb20gZmluZGluZyB0aGUgU3ViamVjdEFsdGVybmF0aXZlTmFtZSBmaWVsZC4gVGhpcyBjYW4gIgogICAgICAgICAgICAiYWZmZWN0IGNlcnRpZmljYXRlIHZhbGlkYXRpb24uIFRoZSBlcnJvciB3YXMgJXMiLAogICAgICAgICAgICBlLAogICAgICAgICkKICAgICAgICByZXR1cm4gW10KCiAgICAjIFdlIHdhbnQgdG8gcmV0dXJuIGROU05hbWUgYW5kIGlQQWRkcmVzcyBmaWVsZHMuIFdlIG5lZWQgdG8gY2FzdCB0aGUgSVBzCiAgICAjIGJhY2sgdG8gc3RyaW5ncyBiZWNhdXNlIHRoZSBtYXRjaF9ob3N0bmFtZSBmdW5jdGlvbiB3YW50cyB0aGVtIGFzCiAgICAjIHN0cmluZ3MuCiAgICAjIFNhZGx5IHRoZSBETlMgbmFtZXMgbmVlZCB0byBiZSBpZG5hIGVuY29kZWQgYW5kIHRoZW4sIG9uIFB5dGhvbiAzLCBVVEYtOAogICAgIyBkZWNvZGVkLiBUaGlzIGlzIHByZXR0eSBmcnVzdHJhdGluZywgYnV0IHRoYXQncyB3aGF0IHRoZSBzdGFuZGFyZCBsaWJyYXJ5CiAgICAjIGRvZXMgd2l0aCBjZXJ0aWZpY2F0ZXMsIGFuZCBzbyB3ZSBuZWVkIHRvIGF0dGVtcHQgdG8gZG8gdGhlIHNhbWUuCiAgICBuYW1lcyA9IFsKICAgICAgICAoJ0ROUycsIF9kbnNuYW1lX3RvX3N0ZGxpYihuYW1lKSkKICAgICAgICBmb3IgbmFtZSBpbiBleHQuZ2V0X3ZhbHVlc19mb3JfdHlwZSh4NTA5LkROU05hbWUpCiAgICBdCiAgICBuYW1lcy5leHRlbmQoCiAgICAgICAgKCdJUCBBZGRyZXNzJywgc3RyKG5hbWUpKQogICAgICAgIGZvciBuYW1lIGluIGV4dC5nZXRfdmFsdWVzX2Zvcl90eXBlKHg1MDkuSVBBZGRyZXNzKQogICAgKQoKICAgIHJldHVybiBuYW1lcwoKCmNsYXNzIFdyYXBwZWRTb2NrZXQob2JqZWN0KToKICAgICcnJ0FQSS1jb21wYXRpYmlsaXR5IHdyYXBwZXIgZm9yIFB5dGhvbiBPcGVuU1NMJ3MgQ29ubmVjdGlvbi1jbGFzcy4KCiAgICBOb3RlOiBfbWFrZWZpbGVfcmVmcywgX2Ryb3AoKSBhbmQgX3JldXNlKCkgYXJlIG5lZWRlZCBmb3IgdGhlIGdhcmJhZ2UKICAgIGNvbGxlY3RvciBvZiBweXB5LgogICAgJycnCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbm5lY3Rpb24sIHNvY2tldCwgc3VwcHJlc3NfcmFnZ2VkX2VvZnM9VHJ1ZSk6CiAgICAgICAgc2VsZi5jb25uZWN0aW9uID0gY29ubmVjdGlvbgogICAgICAgIHNlbGYuc29ja2V0ID0gc29ja2V0CiAgICAgICAgc2VsZi5zdXBwcmVzc19yYWdnZWRfZW9mcyA9IHN1cHByZXNzX3JhZ2dlZF9lb2ZzCiAgICAgICAgc2VsZi5fbWFrZWZpbGVfcmVmcyA9IDAKICAgICAgICBzZWxmLl9jbG9zZWQgPSBGYWxzZQoKICAgIGRlZiBmaWxlbm8oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuc29ja2V0LmZpbGVubygpCgogICAgIyBDb3B5LXBhc3RlZCBmcm9tIFB5dGhvbiAzLjUgc291cmNlIGNvZGUKICAgIGRlZiBfZGVjcmVmX3NvY2tldGlvcyhzZWxmKToKICAgICAgICBpZiBzZWxmLl9tYWtlZmlsZV9yZWZzID4gMDoKICAgICAgICAgICAgc2VsZi5fbWFrZWZpbGVfcmVmcyAtPSAxCiAgICAgICAgaWYgc2VsZi5fY2xvc2VkOgogICAgICAgICAgICBzZWxmLmNsb3NlKCkKCiAgICBkZWYgcmVjdihzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgIHRyeToKICAgICAgICAgICAgZGF0YSA9IHNlbGYuY29ubmVjdGlvbi5yZWN2KCphcmdzLCAqKmt3YXJncykKICAgICAgICBleGNlcHQgT3BlblNTTC5TU0wuU3lzQ2FsbEVycm9yIGFzIGU6CiAgICAgICAgICAgIGlmIHNlbGYuc3VwcHJlc3NfcmFnZ2VkX2VvZnMgYW5kIGUuYXJncyA9PSAoLTEsICdVbmV4cGVjdGVkIEVPRicpOgogICAgICAgICAgICAgICAgcmV0dXJuIGInJwogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmFpc2UgU29ja2V0RXJyb3Ioc3RyKGUpKQogICAgICAgIGV4Y2VwdCBPcGVuU1NMLlNTTC5aZXJvUmV0dXJuRXJyb3IgYXMgZToKICAgICAgICAgICAgaWYgc2VsZi5jb25uZWN0aW9uLmdldF9zaHV0ZG93bigpID09IE9wZW5TU0wuU1NMLlJFQ0VJVkVEX1NIVVRET1dOOgogICAgICAgICAgICAgICAgcmV0dXJuIGInJwogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICBleGNlcHQgT3BlblNTTC5TU0wuV2FudFJlYWRFcnJvcjoKICAgICAgICAgICAgcmQgPSB1dGlsLndhaXRfZm9yX3JlYWQoc2VsZi5zb2NrZXQsIHNlbGYuc29ja2V0LmdldHRpbWVvdXQoKSkKICAgICAgICAgICAgaWYgbm90IHJkOgogICAgICAgICAgICAgICAgcmFpc2UgdGltZW91dCgnVGhlIHJlYWQgb3BlcmF0aW9uIHRpbWVkIG91dCcpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5yZWN2KCphcmdzLCAqKmt3YXJncykKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gZGF0YQoKICAgIGRlZiByZWN2X2ludG8oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmNvbm5lY3Rpb24ucmVjdl9pbnRvKCphcmdzLCAqKmt3YXJncykKICAgICAgICBleGNlcHQgT3BlblNTTC5TU0wuU3lzQ2FsbEVycm9yIGFzIGU6CiAgICAgICAgICAgIGlmIHNlbGYuc3VwcHJlc3NfcmFnZ2VkX2VvZnMgYW5kIGUuYXJncyA9PSAoLTEsICdVbmV4cGVjdGVkIEVPRicpOgogICAgICAgICAgICAgICAgcmV0dXJuIDAKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJhaXNlIFNvY2tldEVycm9yKHN0cihlKSkKICAgICAgICBleGNlcHQgT3BlblNTTC5TU0wuWmVyb1JldHVybkVycm9yIGFzIGU6CiAgICAgICAgICAgIGlmIHNlbGYuY29ubmVjdGlvbi5nZXRfc2h1dGRvd24oKSA9PSBPcGVuU1NMLlNTTC5SRUNFSVZFRF9TSFVURE9XTjoKICAgICAgICAgICAgICAgIHJldHVybiAwCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByYWlzZQogICAgICAgIGV4Y2VwdCBPcGVuU1NMLlNTTC5XYW50UmVhZEVycm9yOgogICAgICAgICAgICByZCA9IHV0aWwud2FpdF9mb3JfcmVhZChzZWxmLnNvY2tldCwgc2VsZi5zb2NrZXQuZ2V0dGltZW91dCgpKQogICAgICAgICAgICBpZiBub3QgcmQ6CiAgICAgICAgICAgICAgICByYWlzZSB0aW1lb3V0KCdUaGUgcmVhZCBvcGVyYXRpb24gdGltZWQgb3V0JykKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnJlY3ZfaW50bygqYXJncywgKiprd2FyZ3MpCgogICAgZGVmIHNldHRpbWVvdXQoc2VsZiwgdGltZW91dCk6CiAgICAgICAgcmV0dXJuIHNlbGYuc29ja2V0LnNldHRpbWVvdXQodGltZW91dCkKCiAgICBkZWYgX3NlbmRfdW50aWxfZG9uZShzZWxmLCBkYXRhKToKICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5jb25uZWN0aW9uLnNlbmQoZGF0YSkKICAgICAgICAgICAgZXhjZXB0IE9wZW5TU0wuU1NMLldhbnRXcml0ZUVycm9yOgogICAgICAgICAgICAgICAgd3IgPSB1dGlsLndhaXRfZm9yX3dyaXRlKHNlbGYuc29ja2V0LCBzZWxmLnNvY2tldC5nZXR0aW1lb3V0KCkpCiAgICAgICAgICAgICAgICBpZiBub3Qgd3I6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgdGltZW91dCgpCiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBleGNlcHQgT3BlblNTTC5TU0wuU3lzQ2FsbEVycm9yIGFzIGU6CiAgICAgICAgICAgICAgICByYWlzZSBTb2NrZXRFcnJvcihzdHIoZSkpCgogICAgZGVmIHNlbmRhbGwoc2VsZiwgZGF0YSk6CiAgICAgICAgdG90YWxfc2VudCA9IDAKICAgICAgICB3aGlsZSB0b3RhbF9zZW50IDwgbGVuKGRhdGEpOgogICAgICAgICAgICBzZW50ID0gc2VsZi5fc2VuZF91bnRpbF9kb25lKGRhdGFbdG90YWxfc2VudDp0b3RhbF9zZW50ICsgU1NMX1dSSVRFX0JMT0NLU0laRV0pCiAgICAgICAgICAgIHRvdGFsX3NlbnQgKz0gc2VudAoKICAgIGRlZiBzaHV0ZG93bihzZWxmKToKICAgICAgICAjIEZJWE1FIHJldGhyb3cgY29tcGF0aWJsZSBleGNlcHRpb25zIHNob3VsZCB3ZSBldmVyIHVzZSB0aGlzCiAgICAgICAgc2VsZi5jb25uZWN0aW9uLnNodXRkb3duKCkKCiAgICBkZWYgY2xvc2Uoc2VsZik6CiAgICAgICAgaWYgc2VsZi5fbWFrZWZpbGVfcmVmcyA8IDE6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHNlbGYuX2Nsb3NlZCA9IFRydWUKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmNvbm5lY3Rpb24uY2xvc2UoKQogICAgICAgICAgICBleGNlcHQgT3BlblNTTC5TU0wuRXJyb3I6CiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLl9tYWtlZmlsZV9yZWZzIC09IDEKCiAgICBkZWYgZ2V0cGVlcmNlcnQoc2VsZiwgYmluYXJ5X2Zvcm09RmFsc2UpOgogICAgICAgIHg1MDkgPSBzZWxmLmNvbm5lY3Rpb24uZ2V0X3BlZXJfY2VydGlmaWNhdGUoKQoKICAgICAgICBpZiBub3QgeDUwOToKICAgICAgICAgICAgcmV0dXJuIHg1MDkKCiAgICAgICAgaWYgYmluYXJ5X2Zvcm06CiAgICAgICAgICAgIHJldHVybiBPcGVuU1NMLmNyeXB0by5kdW1wX2NlcnRpZmljYXRlKAogICAgICAgICAgICAgICAgT3BlblNTTC5jcnlwdG8uRklMRVRZUEVfQVNOMSwKICAgICAgICAgICAgICAgIHg1MDkpCgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICdzdWJqZWN0JzogKAogICAgICAgICAgICAgICAgKCgnY29tbW9uTmFtZScsIHg1MDkuZ2V0X3N1YmplY3QoKS5DTiksKSwKICAgICAgICAgICAgKSwKICAgICAgICAgICAgJ3N1YmplY3RBbHROYW1lJzogZ2V0X3N1YmpfYWx0X25hbWUoeDUwOSkKICAgICAgICB9CgogICAgZGVmIF9yZXVzZShzZWxmKToKICAgICAgICBzZWxmLl9tYWtlZmlsZV9yZWZzICs9IDEKCiAgICBkZWYgX2Ryb3Aoc2VsZik6CiAgICAgICAgaWYgc2VsZi5fbWFrZWZpbGVfcmVmcyA8IDE6CiAgICAgICAgICAgIHNlbGYuY2xvc2UoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuX21ha2VmaWxlX3JlZnMgLT0gMQoKCmlmIF9maWxlb2JqZWN0OiAgIyBQbGF0Zm9ybS1zcGVjaWZpYzogUHl0aG9uIDIKICAgIGRlZiBtYWtlZmlsZShzZWxmLCBtb2RlLCBidWZzaXplPS0xKToKICAgICAgICBzZWxmLl9tYWtlZmlsZV9yZWZzICs9IDEKICAgICAgICByZXR1cm4gX2ZpbGVvYmplY3Qoc2VsZiwgbW9kZSwgYnVmc2l6ZSwgY2xvc2U9VHJ1ZSkKZWxzZTogICMgUGxhdGZvcm0tc3BlY2lmaWM6IFB5dGhvbiAzCiAgICBtYWtlZmlsZSA9IGJhY2twb3J0X21ha2VmaWxlCgpXcmFwcGVkU29ja2V0Lm1ha2VmaWxlID0gbWFrZWZpbGUKCgpjbGFzcyBQeU9wZW5TU0xDb250ZXh0KG9iamVjdCk6CiAgICAiIiIKICAgIEkgYW0gYSB3cmFwcGVyIGNsYXNzIGZvciB0aGUgUHlPcGVuU1NMIGBgQ29udGV4dGBgIG9iamVjdC4gSSBhbSByZXNwb25zaWJsZQogICAgZm9yIHRyYW5zbGF0aW5nIHRoZSBpbnRlcmZhY2Ugb2YgdGhlIHN0YW5kYXJkIGxpYnJhcnkgYGBTU0xDb250ZXh0YGAgb2JqZWN0CiAgICB0byBjYWxscyBpbnRvIFB5T3BlblNTTC4KICAgICIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHByb3RvY29sKToKICAgICAgICBzZWxmLnByb3RvY29sID0gX29wZW5zc2xfdmVyc2lvbnNbcHJvdG9jb2xdCiAgICAgICAgc2VsZi5fY3R4ID0gT3BlblNTTC5TU0wuQ29udGV4dChzZWxmLnByb3RvY29sKQogICAgICAgIHNlbGYuX29wdGlvbnMgPSAwCiAgICAgICAgc2VsZi5jaGVja19ob3N0bmFtZSA9IEZhbHNlCgogICAgQHByb3BlcnR5CiAgICBkZWYgb3B0aW9ucyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fb3B0aW9ucwoKICAgIEBvcHRpb25zLnNldHRlcgogICAgZGVmIG9wdGlvbnMoc2VsZiwgdmFsdWUpOgogICAgICAgIHNlbGYuX29wdGlvbnMgPSB2YWx1ZQogICAgICAgIHNlbGYuX2N0eC5zZXRfb3B0aW9ucyh2YWx1ZSkKCiAgICBAcHJvcGVydHkKICAgIGRlZiB2ZXJpZnlfbW9kZShzZWxmKToKICAgICAgICByZXR1cm4gX29wZW5zc2xfdG9fc3RkbGliX3ZlcmlmeVtzZWxmLl9jdHguZ2V0X3ZlcmlmeV9tb2RlKCldCgogICAgQHZlcmlmeV9tb2RlLnNldHRlcgogICAgZGVmIHZlcmlmeV9tb2RlKHNlbGYsIHZhbHVlKToKICAgICAgICBzZWxmLl9jdHguc2V0X3ZlcmlmeSgKICAgICAgICAgICAgX3N0ZGxpYl90b19vcGVuc3NsX3ZlcmlmeVt2YWx1ZV0sCiAgICAgICAgICAgIF92ZXJpZnlfY2FsbGJhY2sKICAgICAgICApCgogICAgZGVmIHNldF9kZWZhdWx0X3ZlcmlmeV9wYXRocyhzZWxmKToKICAgICAgICBzZWxmLl9jdHguc2V0X2RlZmF1bHRfdmVyaWZ5X3BhdGhzKCkKCiAgICBkZWYgc2V0X2NpcGhlcnMoc2VsZiwgY2lwaGVycyk6CiAgICAgICAgaWYgaXNpbnN0YW5jZShjaXBoZXJzLCBzaXgudGV4dF90eXBlKToKICAgICAgICAgICAgY2lwaGVycyA9IGNpcGhlcnMuZW5jb2RlKCd1dGYtOCcpCiAgICAgICAgc2VsZi5fY3R4LnNldF9jaXBoZXJfbGlzdChjaXBoZXJzKQoKICAgIGRlZiBsb2FkX3ZlcmlmeV9sb2NhdGlvbnMoc2VsZiwgY2FmaWxlPU5vbmUsIGNhcGF0aD1Ob25lLCBjYWRhdGE9Tm9uZSk6CiAgICAgICAgaWYgY2FmaWxlIGlzIG5vdCBOb25lOgogICAgICAgICAgICBjYWZpbGUgPSBjYWZpbGUuZW5jb2RlKCd1dGYtOCcpCiAgICAgICAgaWYgY2FwYXRoIGlzIG5vdCBOb25lOgogICAgICAgICAgICBjYXBhdGggPSBjYXBhdGguZW5jb2RlKCd1dGYtOCcpCiAgICAgICAgc2VsZi5fY3R4LmxvYWRfdmVyaWZ5X2xvY2F0aW9ucyhjYWZpbGUsIGNhcGF0aCkKICAgICAgICBpZiBjYWRhdGEgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGYuX2N0eC5sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoQnl0ZXNJTyhjYWRhdGEpKQoKICAgIGRlZiBsb2FkX2NlcnRfY2hhaW4oc2VsZiwgY2VydGZpbGUsIGtleWZpbGU9Tm9uZSwgcGFzc3dvcmQ9Tm9uZSk6CiAgICAgICAgc2VsZi5fY3R4LnVzZV9jZXJ0aWZpY2F0ZV9maWxlKGNlcnRmaWxlKQogICAgICAgIGlmIHBhc3N3b3JkIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLl9jdHguc2V0X3Bhc3N3ZF9jYihsYW1iZGEgbWF4X2xlbmd0aCwgcHJvbXB0X3R3aWNlLCB1c2VyZGF0YTogcGFzc3dvcmQpCiAgICAgICAgc2VsZi5fY3R4LnVzZV9wcml2YXRla2V5X2ZpbGUoa2V5ZmlsZSBvciBjZXJ0ZmlsZSkKCiAgICBkZWYgd3JhcF9zb2NrZXQoc2VsZiwgc29jaywgc2VydmVyX3NpZGU9RmFsc2UsCiAgICAgICAgICAgICAgICAgICAgZG9faGFuZHNoYWtlX29uX2Nvbm5lY3Q9VHJ1ZSwgc3VwcHJlc3NfcmFnZ2VkX2VvZnM9VHJ1ZSwKICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJfaG9zdG5hbWU9Tm9uZSk6CiAgICAgICAgY254ID0gT3BlblNTTC5TU0wuQ29ubmVjdGlvbihzZWxmLl9jdHgsIHNvY2spCgogICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VydmVyX2hvc3RuYW1lLCBzaXgudGV4dF90eXBlKTogICMgUGxhdGZvcm0tc3BlY2lmaWM6IFB5dGhvbiAzCiAgICAgICAgICAgIHNlcnZlcl9ob3N0bmFtZSA9IHNlcnZlcl9ob3N0bmFtZS5lbmNvZGUoJ3V0Zi04JykKCiAgICAgICAgaWYgc2VydmVyX2hvc3RuYW1lIGlzIG5vdCBOb25lOgogICAgICAgICAgICBjbnguc2V0X3Rsc2V4dF9ob3N0X25hbWUoc2VydmVyX2hvc3RuYW1lKQoKICAgICAgICBjbnguc2V0X2Nvbm5lY3Rfc3RhdGUoKQoKICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBjbnguZG9faGFuZHNoYWtlKCkKICAgICAgICAgICAgZXhjZXB0IE9wZW5TU0wuU1NMLldhbnRSZWFkRXJyb3I6CiAgICAgICAgICAgICAgICByZCA9IHV0aWwud2FpdF9mb3JfcmVhZChzb2NrLCBzb2NrLmdldHRpbWVvdXQoKSkKICAgICAgICAgICAgICAgIGlmIG5vdCByZDoKICAgICAgICAgICAgICAgICAgICByYWlzZSB0aW1lb3V0KCdzZWxlY3QgdGltZWQgb3V0JykKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGV4Y2VwdCBPcGVuU1NMLlNTTC5FcnJvciBhcyBlOgogICAgICAgICAgICAgICAgcmFpc2Ugc3NsLlNTTEVycm9yKCdiYWQgaGFuZHNoYWtlOiAlcicgJSBlKQogICAgICAgICAgICBicmVhawoKICAgICAgICByZXR1cm4gV3JhcHBlZFNvY2tldChjbngsIHNvY2spCgoKZGVmIF92ZXJpZnlfY2FsbGJhY2soY254LCB4NTA5LCBlcnJfbm8sIGVycl9kZXB0aCwgcmV0dXJuX2NvZGUpOgogICAgcmV0dXJuIGVycl9ubyA9PSAwClBLAwQUAAAAAAAAACEA51PA8yV3AAAldwAASwAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9jb250cmliL3NlY3VyZXRyYW5zcG9ydC5weSIiIgpTZWN1cmVUcmFucG9ydCBzdXBwb3J0IGZvciB1cmxsaWIzIHZpYSBjdHlwZXMuCgpUaGlzIG1ha2VzIHBsYXRmb3JtLW5hdGl2ZSBUTFMgYXZhaWxhYmxlIHRvIHVybGxpYjMgdXNlcnMgb24gbWFjT1Mgd2l0aG91dCB0aGUKdXNlIG9mIGEgY29tcGlsZXIuIFRoaXMgaXMgYW4gaW1wb3J0YW50IGZlYXR1cmUgYmVjYXVzZSB0aGUgUHl0aG9uIFBhY2thZ2UKSW5kZXggaXMgbW92aW5nIHRvIGJlY29tZSBhIFRMU3YxLjItb3ItaGlnaGVyIHNlcnZlciwgYW5kIHRoZSBkZWZhdWx0IE9wZW5TU0wKdGhhdCBzaGlwcyB3aXRoIG1hY09TIGlzIG5vdCBjYXBhYmxlIG9mIGRvaW5nIFRMU3YxLjIuIFRoZSBvbmx5IHdheSB0byByZXNvbHZlCnRoaXMgaXMgdG8gZ2l2ZSBtYWNPUyB1c2VycyBhbiBhbHRlcm5hdGl2ZSBzb2x1dGlvbiB0byB0aGUgcHJvYmxlbSwgYW5kIHRoYXQKc29sdXRpb24gaXMgdG8gdXNlIFNlY3VyZVRyYW5zcG9ydC4KCldlIHVzZSBjdHlwZXMgaGVyZSBiZWNhdXNlIHRoaXMgc29sdXRpb24gbXVzdCBub3QgcmVxdWlyZSBhIGNvbXBpbGVyLiBUaGF0J3MKYmVjYXVzZSBwaXAgaXMgbm90IGFsbG93ZWQgdG8gcmVxdWlyZSBhIGNvbXBpbGVyIGVpdGhlci4KClRoaXMgaXMgbm90IGludGVuZGVkIHRvIGJlIGEgc2VyaW91c2x5IGxvbmctdGVybSBzb2x1dGlvbiB0byB0aGlzIHByb2JsZW0uClRoZSBob3BlIGlzIHRoYXQgUEVQIDU0MyB3aWxsIGV2ZW50dWFsbHkgc29sdmUgdGhpcyBpc3N1ZSBmb3IgdXMsIGF0IHdoaWNoCnBvaW50IHdlIGNhbiByZXRpcmUgdGhpcyBjb250cmliIG1vZHVsZS4gQnV0IGluIHRoZSBzaG9ydCB0ZXJtLCB3ZSBuZWVkIHRvCnNvbHZlIHRoZSBpbXBlbmRpbmcgdGlyZSBmaXJlIHRoYXQgaXMgUHl0aG9uIG9uIE1hYyB3aXRob3V0IHRoaXMga2luZCBvZgpjb250cmliIG1vZHVsZS4gU28uLi5oZXJlIHdlIGFyZS4KClRvIHVzZSB0aGlzIG1vZHVsZSwgc2ltcGx5IGltcG9ydCBhbmQgaW5qZWN0IGl0OjoKCiAgICBpbXBvcnQgdXJsbGliMy5jb250cmliLnNlY3VyZXRyYW5zcG9ydAogICAgdXJsbGliMy5jb250cmliLnNlY3VyZXRyYW5zcG9ydC5pbmplY3RfaW50b191cmxsaWIzKCkKCkhhcHB5IFRMU2luZyEKIiIiCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgY29udGV4dGxpYgppbXBvcnQgY3R5cGVzCmltcG9ydCBlcnJubwppbXBvcnQgb3MucGF0aAppbXBvcnQgc2h1dGlsCmltcG9ydCBzb2NrZXQKaW1wb3J0IHNzbAppbXBvcnQgdGhyZWFkaW5nCmltcG9ydCB3ZWFrcmVmCgpmcm9tIC4uIGltcG9ydCB1dGlsCmZyb20gLl9zZWN1cmV0cmFuc3BvcnQuYmluZGluZ3MgaW1wb3J0ICgKICAgIFNlY3VyaXR5LCBTZWN1cml0eUNvbnN0LCBDb3JlRm91bmRhdGlvbgopCmZyb20gLl9zZWN1cmV0cmFuc3BvcnQubG93X2xldmVsIGltcG9ydCAoCiAgICBfYXNzZXJ0X25vX2Vycm9yLCBfY2VydF9hcnJheV9mcm9tX3BlbSwgX3RlbXBvcmFyeV9rZXljaGFpbiwKICAgIF9sb2FkX2NsaWVudF9jZXJ0X2NoYWluCikKCnRyeTogICMgUGxhdGZvcm0tc3BlY2lmaWM6IFB5dGhvbiAyCiAgICBmcm9tIHNvY2tldCBpbXBvcnQgX2ZpbGVvYmplY3QKZXhjZXB0IEltcG9ydEVycm9yOiAgIyBQbGF0Zm9ybS1zcGVjaWZpYzogUHl0aG9uIDMKICAgIF9maWxlb2JqZWN0ID0gTm9uZQogICAgZnJvbSAuLnBhY2thZ2VzLmJhY2twb3J0cy5tYWtlZmlsZSBpbXBvcnQgYmFja3BvcnRfbWFrZWZpbGUKCnRyeToKICAgIG1lbW9yeXZpZXcoYicnKQpleGNlcHQgTmFtZUVycm9yOgogICAgcmFpc2UgSW1wb3J0RXJyb3IoIlNlY3VyZVRyYW5zcG9ydCBvbmx5IHdvcmtzIG9uIFB5dGhvbnMgd2l0aCBtZW1vcnl2aWV3IikKCl9fYWxsX18gPSBbJ2luamVjdF9pbnRvX3VybGxpYjMnLCAnZXh0cmFjdF9mcm9tX3VybGxpYjMnXQoKIyBTTkkgYWx3YXlzIHdvcmtzCkhBU19TTkkgPSBUcnVlCgpvcmlnX3V0aWxfSEFTX1NOSSA9IHV0aWwuSEFTX1NOSQpvcmlnX3V0aWxfU1NMQ29udGV4dCA9IHV0aWwuc3NsXy5TU0xDb250ZXh0CgojIFRoaXMgZGljdGlvbmFyeSBpcyB1c2VkIGJ5IHRoZSByZWFkIGNhbGxiYWNrIHRvIG9idGFpbiBhIGhhbmRsZSB0byB0aGUKIyBjYWxsaW5nIHdyYXBwZWQgc29ja2V0LiBUaGlzIGlzIGEgcHJldHR5IHNpbGx5IGFwcHJvYWNoLCBidXQgZm9yIG5vdyBpdCdsbAojIGRvLiBJIGZlZWwgbGlrZSBJIHNob3VsZCBiZSBhYmxlIHRvIHNtdWdnbGUgYSBoYW5kbGUgdG8gdGhlIHdyYXBwZWQgc29ja2V0CiMgZGlyZWN0bHkgaW4gdGhlIFNTTENvbm5lY3Rpb25SZWYsIGJ1dCBmb3Igbm93IHRoaXMgYXBwcm9hY2ggd2lsbCB3b3JrIEkKIyBndWVzcy4KIwojIFdlIG5lZWQgdG8gbG9jayBhcm91bmQgdGhpcyBzdHJ1Y3R1cmUgZm9yIGluc2VydHMsIGJ1dCB3ZSBkb24ndCBkbyBpdCBmb3IKIyByZWFkcy93cml0ZXMgaW4gdGhlIGNhbGxiYWNrcy4gVGhlIHJlYXNvbmluZyBoZXJlIGdvZXMgYXMgZm9sbG93czoKIwojICAgIDEuIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBjYWxsIGludG8gdGhlIGNhbGxiYWNrcyBiZWZvcmUgdGhlIGRpY3Rpb25hcnkgaXMKIyAgICAgICBwb3B1bGF0ZWQsIHNvIG9uY2UgaW4gdGhlIGNhbGxiYWNrIHRoZSBpZCBtdXN0IGJlIGluIHRoZSBkaWN0aW9uYXJ5LgojICAgIDIuIFRoZSBjYWxsYmFja3MgZG9uJ3QgbXV0YXRlIHRoZSBkaWN0aW9uYXJ5LCB0aGV5IG9ubHkgcmVhZCBmcm9tIGl0LCBhbmQKIyAgICAgICBzbyBjYW5ub3QgY29uZmxpY3Qgd2l0aCBhbnkgb2YgdGhlIGluc2VydGlvbnMuCiMKIyBUaGlzIGlzIGdvb2Q6IGlmIHdlIGhhZCB0byBsb2NrIGluIHRoZSBjYWxsYmFja3Mgd2UnZCBkcmFzdGljYWxseSBzbG93IGRvd24KIyB0aGUgcGVyZm9ybWFuY2Ugb2YgdGhpcyBjb2RlLgpfY29ubmVjdGlvbl9yZWZzID0gd2Vha3JlZi5XZWFrVmFsdWVEaWN0aW9uYXJ5KCkKX2Nvbm5lY3Rpb25fcmVmX2xvY2sgPSB0aHJlYWRpbmcuTG9jaygpCgojIExpbWl0IHdyaXRlcyB0byAxNmtCLiBUaGlzIGlzIE9wZW5TU0wncyBsaW1pdCwgYnV0IHdlJ2xsIGNhcmdvLWN1bHQgaXQgb3ZlcgojIGZvciBubyBiZXR0ZXIgcmVhc29uIHRoYW4gd2UgbmVlZCAqYSogbGltaXQsIGFuZCB0aGlzIG9uZSBpcyByaWdodCB0aGVyZS4KU1NMX1dSSVRFX0JMT0NLU0laRSA9IDE2Mzg0CgojIFRoaXMgaXMgb3VyIGVxdWl2YWxlbnQgb2YgdXRpbC5zc2xfLkRFRkFVTFRfQ0lQSEVSUywgYnV0IGV4cGFuZGVkIG91dCB0bwojIGluZGl2aWR1YWwgY2lwaGVyIHN1aXRlcy4gV2UgbmVlZCB0byBkbyB0aGlzIGJlY3Vhc2UgdGhpcyBpcyBob3cKIyBTZWN1cmVUcmFuc3BvcnQgd2FudHMgdGhlbS4KQ0lQSEVSX1NVSVRFUyA9IFsKICAgIFNlY3VyaXR5Q29uc3QuVExTX0FFU18yNTZfR0NNX1NIQTM4NCwKICAgIFNlY3VyaXR5Q29uc3QuVExTX0NIQUNIQTIwX1BPTFkxMzA1X1NIQTI1NiwKICAgIFNlY3VyaXR5Q29uc3QuVExTX0FFU18xMjhfR0NNX1NIQTI1NiwKICAgIFNlY3VyaXR5Q29uc3QuVExTX0VDREhFX0VDRFNBX1dJVEhfQUVTXzI1Nl9HQ01fU0hBMzg0LAogICAgU2VjdXJpdHlDb25zdC5UTFNfRUNESEVfUlNBX1dJVEhfQUVTXzI1Nl9HQ01fU0hBMzg0LAogICAgU2VjdXJpdHlDb25zdC5UTFNfRUNESEVfRUNEU0FfV0lUSF9BRVNfMTI4X0dDTV9TSEEyNTYsCiAgICBTZWN1cml0eUNvbnN0LlRMU19FQ0RIRV9SU0FfV0lUSF9BRVNfMTI4X0dDTV9TSEEyNTYsCiAgICBTZWN1cml0eUNvbnN0LlRMU19ESEVfRFNTX1dJVEhfQUVTXzI1Nl9HQ01fU0hBMzg0LAogICAgU2VjdXJpdHlDb25zdC5UTFNfREhFX1JTQV9XSVRIX0FFU18yNTZfR0NNX1NIQTM4NCwKICAgIFNlY3VyaXR5Q29uc3QuVExTX0RIRV9EU1NfV0lUSF9BRVNfMTI4X0dDTV9TSEEyNTYsCiAgICBTZWN1cml0eUNvbnN0LlRMU19ESEVfUlNBX1dJVEhfQUVTXzEyOF9HQ01fU0hBMjU2LAogICAgU2VjdXJpdHlDb25zdC5UTFNfRUNESEVfRUNEU0FfV0lUSF9BRVNfMjU2X0NCQ19TSEEzODQsCiAgICBTZWN1cml0eUNvbnN0LlRMU19FQ0RIRV9SU0FfV0lUSF9BRVNfMjU2X0NCQ19TSEEzODQsCiAgICBTZWN1cml0eUNvbnN0LlRMU19FQ0RIRV9FQ0RTQV9XSVRIX0FFU18yNTZfQ0JDX1NIQSwKICAgIFNlY3VyaXR5Q29uc3QuVExTX0VDREhFX1JTQV9XSVRIX0FFU18yNTZfQ0JDX1NIQSwKICAgIFNlY3VyaXR5Q29uc3QuVExTX0RIRV9SU0FfV0lUSF9BRVNfMjU2X0NCQ19TSEEyNTYsCiAgICBTZWN1cml0eUNvbnN0LlRMU19ESEVfRFNTX1dJVEhfQUVTXzI1Nl9DQkNfU0hBMjU2LAogICAgU2VjdXJpdHlDb25zdC5UTFNfREhFX1JTQV9XSVRIX0FFU18yNTZfQ0JDX1NIQSwKICAgIFNlY3VyaXR5Q29uc3QuVExTX0RIRV9EU1NfV0lUSF9BRVNfMjU2X0NCQ19TSEEsCiAgICBTZWN1cml0eUNvbnN0LlRMU19FQ0RIRV9FQ0RTQV9XSVRIX0FFU18xMjhfQ0JDX1NIQTI1NiwKICAgIFNlY3VyaXR5Q29uc3QuVExTX0VDREhFX1JTQV9XSVRIX0FFU18xMjhfQ0JDX1NIQTI1NiwKICAgIFNlY3VyaXR5Q29uc3QuVExTX0VDREhFX0VDRFNBX1dJVEhfQUVTXzEyOF9DQkNfU0hBLAogICAgU2VjdXJpdHlDb25zdC5UTFNfRUNESEVfUlNBX1dJVEhfQUVTXzEyOF9DQkNfU0hBLAogICAgU2VjdXJpdHlDb25zdC5UTFNfREhFX1JTQV9XSVRIX0FFU18xMjhfQ0JDX1NIQTI1NiwKICAgIFNlY3VyaXR5Q29uc3QuVExTX0RIRV9EU1NfV0lUSF9BRVNfMTI4X0NCQ19TSEEyNTYsCiAgICBTZWN1cml0eUNvbnN0LlRMU19ESEVfUlNBX1dJVEhfQUVTXzEyOF9DQkNfU0hBLAogICAgU2VjdXJpdHlDb25zdC5UTFNfREhFX0RTU19XSVRIX0FFU18xMjhfQ0JDX1NIQSwKICAgIFNlY3VyaXR5Q29uc3QuVExTX1JTQV9XSVRIX0FFU18yNTZfR0NNX1NIQTM4NCwKICAgIFNlY3VyaXR5Q29uc3QuVExTX1JTQV9XSVRIX0FFU18xMjhfR0NNX1NIQTI1NiwKICAgIFNlY3VyaXR5Q29uc3QuVExTX1JTQV9XSVRIX0FFU18yNTZfQ0JDX1NIQTI1NiwKICAgIFNlY3VyaXR5Q29uc3QuVExTX1JTQV9XSVRIX0FFU18xMjhfQ0JDX1NIQTI1NiwKICAgIFNlY3VyaXR5Q29uc3QuVExTX1JTQV9XSVRIX0FFU18yNTZfQ0JDX1NIQSwKICAgIFNlY3VyaXR5Q29uc3QuVExTX1JTQV9XSVRIX0FFU18xMjhfQ0JDX1NIQSwKXQoKIyBCYXNpY2FsbHkgdGhpcyBpcyBzaW1wbGU6IGZvciBQUk9UT0NPTF9TU0x2MjMgd2UgdHVybiBpdCBpbnRvIGEgbG93IG9mCiMgVExTdjEgYW5kIGEgaGlnaCBvZiBUTFN2MS4yLiBGb3IgZXZlcnl0aGluZyBlbHNlLCB3ZSBwaW4gdG8gdGhhdCB2ZXJzaW9uLgpfcHJvdG9jb2xfdG9fbWluX21heCA9IHsKICAgIHNzbC5QUk9UT0NPTF9TU0x2MjM6IChTZWN1cml0eUNvbnN0LmtUTFNQcm90b2NvbDEsIFNlY3VyaXR5Q29uc3Qua1RMU1Byb3RvY29sMTIpLAp9CgppZiBoYXNhdHRyKHNzbCwgIlBST1RPQ09MX1NTTHYyIik6CiAgICBfcHJvdG9jb2xfdG9fbWluX21heFtzc2wuUFJPVE9DT0xfU1NMdjJdID0gKAogICAgICAgIFNlY3VyaXR5Q29uc3Qua1NTTFByb3RvY29sMiwgU2VjdXJpdHlDb25zdC5rU1NMUHJvdG9jb2wyCiAgICApCmlmIGhhc2F0dHIoc3NsLCAiUFJPVE9DT0xfU1NMdjMiKToKICAgIF9wcm90b2NvbF90b19taW5fbWF4W3NzbC5QUk9UT0NPTF9TU0x2M10gPSAoCiAgICAgICAgU2VjdXJpdHlDb25zdC5rU1NMUHJvdG9jb2wzLCBTZWN1cml0eUNvbnN0LmtTU0xQcm90b2NvbDMKICAgICkKaWYgaGFzYXR0cihzc2wsICJQUk9UT0NPTF9UTFN2MSIpOgogICAgX3Byb3RvY29sX3RvX21pbl9tYXhbc3NsLlBST1RPQ09MX1RMU3YxXSA9ICgKICAgICAgICBTZWN1cml0eUNvbnN0LmtUTFNQcm90b2NvbDEsIFNlY3VyaXR5Q29uc3Qua1RMU1Byb3RvY29sMQogICAgKQppZiBoYXNhdHRyKHNzbCwgIlBST1RPQ09MX1RMU3YxXzEiKToKICAgIF9wcm90b2NvbF90b19taW5fbWF4W3NzbC5QUk9UT0NPTF9UTFN2MV8xXSA9ICgKICAgICAgICBTZWN1cml0eUNvbnN0LmtUTFNQcm90b2NvbDExLCBTZWN1cml0eUNvbnN0LmtUTFNQcm90b2NvbDExCiAgICApCmlmIGhhc2F0dHIoc3NsLCAiUFJPVE9DT0xfVExTdjFfMiIpOgogICAgX3Byb3RvY29sX3RvX21pbl9tYXhbc3NsLlBST1RPQ09MX1RMU3YxXzJdID0gKAogICAgICAgIFNlY3VyaXR5Q29uc3Qua1RMU1Byb3RvY29sMTIsIFNlY3VyaXR5Q29uc3Qua1RMU1Byb3RvY29sMTIKICAgICkKaWYgaGFzYXR0cihzc2wsICJQUk9UT0NPTF9UTFMiKToKICAgIF9wcm90b2NvbF90b19taW5fbWF4W3NzbC5QUk9UT0NPTF9UTFNdID0gX3Byb3RvY29sX3RvX21pbl9tYXhbc3NsLlBST1RPQ09MX1NTTHYyM10KCgpkZWYgaW5qZWN0X2ludG9fdXJsbGliMygpOgogICAgIiIiCiAgICBNb25rZXktcGF0Y2ggdXJsbGliMyB3aXRoIFNlY3VyZVRyYW5zcG9ydC1iYWNrZWQgU1NMLXN1cHBvcnQuCiAgICAiIiIKICAgIHV0aWwuc3NsXy5TU0xDb250ZXh0ID0gU2VjdXJlVHJhbnNwb3J0Q29udGV4dAogICAgdXRpbC5IQVNfU05JID0gSEFTX1NOSQogICAgdXRpbC5zc2xfLkhBU19TTkkgPSBIQVNfU05JCiAgICB1dGlsLklTX1NFQ1VSRVRSQU5TUE9SVCA9IFRydWUKICAgIHV0aWwuc3NsXy5JU19TRUNVUkVUUkFOU1BPUlQgPSBUcnVlCgoKZGVmIGV4dHJhY3RfZnJvbV91cmxsaWIzKCk6CiAgICAiIiIKICAgIFVuZG8gbW9ua2V5LXBhdGNoaW5nIGJ5IDpmdW5jOmBpbmplY3RfaW50b191cmxsaWIzYC4KICAgICIiIgogICAgdXRpbC5zc2xfLlNTTENvbnRleHQgPSBvcmlnX3V0aWxfU1NMQ29udGV4dAogICAgdXRpbC5IQVNfU05JID0gb3JpZ191dGlsX0hBU19TTkkKICAgIHV0aWwuc3NsXy5IQVNfU05JID0gb3JpZ191dGlsX0hBU19TTkkKICAgIHV0aWwuSVNfU0VDVVJFVFJBTlNQT1JUID0gRmFsc2UKICAgIHV0aWwuc3NsXy5JU19TRUNVUkVUUkFOU1BPUlQgPSBGYWxzZQoKCmRlZiBfcmVhZF9jYWxsYmFjayhjb25uZWN0aW9uX2lkLCBkYXRhX2J1ZmZlciwgZGF0YV9sZW5ndGhfcG9pbnRlcik6CiAgICAiIiIKICAgIFNlY3VyZVRyYW5zcG9ydCByZWFkIGNhbGxiYWNrLiBUaGlzIGlzIGNhbGxlZCBieSBTVCB0byByZXF1ZXN0IHRoYXQgZGF0YQogICAgYmUgcmV0dXJuZWQgZnJvbSB0aGUgc29ja2V0LgogICAgIiIiCiAgICB3cmFwcGVkX3NvY2tldCA9IE5vbmUKICAgIHRyeToKICAgICAgICB3cmFwcGVkX3NvY2tldCA9IF9jb25uZWN0aW9uX3JlZnMuZ2V0KGNvbm5lY3Rpb25faWQpCiAgICAgICAgaWYgd3JhcHBlZF9zb2NrZXQgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuIFNlY3VyaXR5Q29uc3QuZXJyU1NMSW50ZXJuYWwKICAgICAgICBiYXNlX3NvY2tldCA9IHdyYXBwZWRfc29ja2V0LnNvY2tldAoKICAgICAgICByZXF1ZXN0ZWRfbGVuZ3RoID0gZGF0YV9sZW5ndGhfcG9pbnRlclswXQoKICAgICAgICB0aW1lb3V0ID0gd3JhcHBlZF9zb2NrZXQuZ2V0dGltZW91dCgpCiAgICAgICAgZXJyb3IgPSBOb25lCiAgICAgICAgcmVhZF9jb3VudCA9IDAKICAgICAgICBidWZmZXIgPSAoY3R5cGVzLmNfY2hhciAqIHJlcXVlc3RlZF9sZW5ndGgpLmZyb21fYWRkcmVzcyhkYXRhX2J1ZmZlcikKICAgICAgICBidWZmZXJfdmlldyA9IG1lbW9yeXZpZXcoYnVmZmVyKQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHdoaWxlIHJlYWRfY291bnQgPCByZXF1ZXN0ZWRfbGVuZ3RoOgogICAgICAgICAgICAgICAgaWYgdGltZW91dCBpcyBOb25lIG9yIHRpbWVvdXQgPj0gMDoKICAgICAgICAgICAgICAgICAgICByZWFkYWJsZXMgPSB1dGlsLndhaXRfZm9yX3JlYWQoW2Jhc2Vfc29ja2V0XSwgdGltZW91dCkKICAgICAgICAgICAgICAgICAgICBpZiBub3QgcmVhZGFibGVzOgogICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBzb2NrZXQuZXJyb3IoZXJybm8uRUFHQUlOLCAndGltZWQgb3V0JykKCiAgICAgICAgICAgICAgICAjIFdlIG5lZWQgdG8gdGVsbCBjdHlwZXMgdGhhdCB3ZSBoYXZlIGEgYnVmZmVyIHRoYXQgY2FuIGJlCiAgICAgICAgICAgICAgICAjIHdyaXR0ZW4gdG8uIFVwc2V0dGluZ2x5LCB3ZSBkbyB0aGF0IGxpa2UgdGhpczoKICAgICAgICAgICAgICAgIGNodW5rX3NpemUgPSBiYXNlX3NvY2tldC5yZWN2X2ludG8oCiAgICAgICAgICAgICAgICAgICAgYnVmZmVyX3ZpZXdbcmVhZF9jb3VudDpyZXF1ZXN0ZWRfbGVuZ3RoXQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgcmVhZF9jb3VudCArPSBjaHVua19zaXplCiAgICAgICAgICAgICAgICBpZiBub3QgY2h1bmtfc2l6ZToKICAgICAgICAgICAgICAgICAgICBpZiBub3QgcmVhZF9jb3VudDoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNlY3VyaXR5Q29uc3QuZXJyU1NMQ2xvc2VkR3JhY2VmdWwKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgIGV4Y2VwdCAoc29ja2V0LmVycm9yKSBhcyBlOgogICAgICAgICAgICBlcnJvciA9IGUuZXJybm8KCiAgICAgICAgICAgIGlmIGVycm9yIGlzIG5vdCBOb25lIGFuZCBlcnJvciAhPSBlcnJuby5FQUdBSU46CiAgICAgICAgICAgICAgICBpZiBlcnJvciA9PSBlcnJuby5FQ09OTlJFU0VUOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBTZWN1cml0eUNvbnN0LmVyclNTTENsb3NlZEFib3J0CiAgICAgICAgICAgICAgICByYWlzZQoKICAgICAgICBkYXRhX2xlbmd0aF9wb2ludGVyWzBdID0gcmVhZF9jb3VudAoKICAgICAgICBpZiByZWFkX2NvdW50ICE9IHJlcXVlc3RlZF9sZW5ndGg6CiAgICAgICAgICAgIHJldHVybiBTZWN1cml0eUNvbnN0LmVyclNTTFdvdWxkQmxvY2sKCiAgICAgICAgcmV0dXJuIDAKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICBpZiB3cmFwcGVkX3NvY2tldCBpcyBub3QgTm9uZToKICAgICAgICAgICAgd3JhcHBlZF9zb2NrZXQuX2V4Y2VwdGlvbiA9IGUKICAgICAgICByZXR1cm4gU2VjdXJpdHlDb25zdC5lcnJTU0xJbnRlcm5hbAoKCmRlZiBfd3JpdGVfY2FsbGJhY2soY29ubmVjdGlvbl9pZCwgZGF0YV9idWZmZXIsIGRhdGFfbGVuZ3RoX3BvaW50ZXIpOgogICAgIiIiCiAgICBTZWN1cmVUcmFuc3BvcnQgd3JpdGUgY2FsbGJhY2suIFRoaXMgaXMgY2FsbGVkIGJ5IFNUIHRvIHJlcXVlc3QgdGhhdCBkYXRhCiAgICBhY3R1YWxseSBiZSBzZW50IG9uIHRoZSBuZXR3b3JrLgogICAgIiIiCiAgICB3cmFwcGVkX3NvY2tldCA9IE5vbmUKICAgIHRyeToKICAgICAgICB3cmFwcGVkX3NvY2tldCA9IF9jb25uZWN0aW9uX3JlZnMuZ2V0KGNvbm5lY3Rpb25faWQpCiAgICAgICAgaWYgd3JhcHBlZF9zb2NrZXQgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuIFNlY3VyaXR5Q29uc3QuZXJyU1NMSW50ZXJuYWwKICAgICAgICBiYXNlX3NvY2tldCA9IHdyYXBwZWRfc29ja2V0LnNvY2tldAoKICAgICAgICBieXRlc190b193cml0ZSA9IGRhdGFfbGVuZ3RoX3BvaW50ZXJbMF0KICAgICAgICBkYXRhID0gY3R5cGVzLnN0cmluZ19hdChkYXRhX2J1ZmZlciwgYnl0ZXNfdG9fd3JpdGUpCgogICAgICAgIHRpbWVvdXQgPSB3cmFwcGVkX3NvY2tldC5nZXR0aW1lb3V0KCkKICAgICAgICBlcnJvciA9IE5vbmUKICAgICAgICBzZW50ID0gMAoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHdoaWxlIHNlbnQgPCBieXRlc190b193cml0ZToKICAgICAgICAgICAgICAgIGlmIHRpbWVvdXQgaXMgTm9uZSBvciB0aW1lb3V0ID49IDA6CiAgICAgICAgICAgICAgICAgICAgd3JpdGFibGVzID0gdXRpbC53YWl0X2Zvcl93cml0ZShbYmFzZV9zb2NrZXRdLCB0aW1lb3V0KQogICAgICAgICAgICAgICAgICAgIGlmIG5vdCB3cml0YWJsZXM6CiAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIHNvY2tldC5lcnJvcihlcnJuby5FQUdBSU4sICd0aW1lZCBvdXQnKQogICAgICAgICAgICAgICAgY2h1bmtfc2VudCA9IGJhc2Vfc29ja2V0LnNlbmQoZGF0YSkKICAgICAgICAgICAgICAgIHNlbnQgKz0gY2h1bmtfc2VudAoKICAgICAgICAgICAgICAgICMgVGhpcyBoYXMgc29tZSBuZWVkbGVzcyBjb3B5aW5nIGhlcmUsIGJ1dCBJJ20gbm90IHN1cmUgdGhlcmUncwogICAgICAgICAgICAgICAgIyBtdWNoIHZhbHVlIGluIG9wdGltaXNpbmcgdGhpcyBkYXRhIHBhdGguCiAgICAgICAgICAgICAgICBkYXRhID0gZGF0YVtjaHVua19zZW50Ol0KICAgICAgICBleGNlcHQgKHNvY2tldC5lcnJvcikgYXMgZToKICAgICAgICAgICAgZXJyb3IgPSBlLmVycm5vCgogICAgICAgICAgICBpZiBlcnJvciBpcyBub3QgTm9uZSBhbmQgZXJyb3IgIT0gZXJybm8uRUFHQUlOOgogICAgICAgICAgICAgICAgaWYgZXJyb3IgPT0gZXJybm8uRUNPTk5SRVNFVDoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gU2VjdXJpdHlDb25zdC5lcnJTU0xDbG9zZWRBYm9ydAogICAgICAgICAgICAgICAgcmFpc2UKCiAgICAgICAgZGF0YV9sZW5ndGhfcG9pbnRlclswXSA9IHNlbnQKICAgICAgICBpZiBzZW50ICE9IGJ5dGVzX3RvX3dyaXRlOgogICAgICAgICAgICByZXR1cm4gU2VjdXJpdHlDb25zdC5lcnJTU0xXb3VsZEJsb2NrCgogICAgICAgIHJldHVybiAwCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgaWYgd3JhcHBlZF9zb2NrZXQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHdyYXBwZWRfc29ja2V0Ll9leGNlcHRpb24gPSBlCiAgICAgICAgcmV0dXJuIFNlY3VyaXR5Q29uc3QuZXJyU1NMSW50ZXJuYWwKCgojIFdlIG5lZWQgdG8ga2VlcCB0aGVzZSB0d28gb2JqZWN0cyByZWZlcmVuY2VzIGFsaXZlOiBpZiB0aGV5IGdldCBHQydkIHdoaWxlCiMgaW4gdXNlIHRoZW4gU2VjdXJlVHJhbnNwb3J0IGNvdWxkIGF0dGVtcHQgdG8gY2FsbCBhIGZ1bmN0aW9uIHRoYXQgaXMgaW4gZnJlZWQKIyBtZW1vcnkuIFRoYXQgd291bGQgYmUuLi51aC4uLmJhZC4gWWVhaCwgdGhhdCdzIHRoZSB3b3JkLiBCYWQuCl9yZWFkX2NhbGxiYWNrX3BvaW50ZXIgPSBTZWN1cml0eS5TU0xSZWFkRnVuYyhfcmVhZF9jYWxsYmFjaykKX3dyaXRlX2NhbGxiYWNrX3BvaW50ZXIgPSBTZWN1cml0eS5TU0xXcml0ZUZ1bmMoX3dyaXRlX2NhbGxiYWNrKQoKCmNsYXNzIFdyYXBwZWRTb2NrZXQob2JqZWN0KToKICAgICIiIgogICAgQVBJLWNvbXBhdGliaWxpdHkgd3JhcHBlciBmb3IgUHl0aG9uJ3MgT3BlblNTTCB3cmFwcGVkIHNvY2tldCBvYmplY3QuCgogICAgTm90ZTogX21ha2VmaWxlX3JlZnMsIF9kcm9wKCksIGFuZCBfcmV1c2UoKSBhcmUgbmVlZGVkIGZvciB0aGUgZ2FyYmFnZQogICAgY29sbGVjdG9yIG9mIFB5UHkuCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzb2NrZXQpOgogICAgICAgIHNlbGYuc29ja2V0ID0gc29ja2V0CiAgICAgICAgc2VsZi5jb250ZXh0ID0gTm9uZQogICAgICAgIHNlbGYuX21ha2VmaWxlX3JlZnMgPSAwCiAgICAgICAgc2VsZi5fY2xvc2VkID0gRmFsc2UKICAgICAgICBzZWxmLl9leGNlcHRpb24gPSBOb25lCiAgICAgICAgc2VsZi5fa2V5Y2hhaW4gPSBOb25lCiAgICAgICAgc2VsZi5fa2V5Y2hhaW5fZGlyID0gTm9uZQogICAgICAgIHNlbGYuX2NsaWVudF9jZXJ0X2NoYWluID0gTm9uZQoKICAgICAgICAjIFdlIHNhdmUgb2ZmIHRoZSBwcmV2aW91c2x5LWNvbmZpZ3VyZWQgdGltZW91dCBhbmQgdGhlbiBzZXQgaXQgdG8KICAgICAgICAjIHplcm8uIFRoaXMgaXMgZG9uZSBiZWNhdXNlIHdlIHVzZSBzZWxlY3QgYW5kIGZyaWVuZHMgdG8gaGFuZGxlIHRoZQogICAgICAgICMgdGltZW91dHMsIGJ1dCBpZiB3ZSBsZWF2ZSB0aGUgdGltZW91dCBzZXQgb24gdGhlIGxvd2VyIHNvY2tldCB0aGVuCiAgICAgICAgIyBQeXRob24gd2lsbCAia2luZGx5IiBjYWxsIHNlbGVjdCBvbiB0aGF0IHNvY2tldCBhZ2FpbiBmb3IgdXMuIEF2b2lkCiAgICAgICAgIyB0aGF0IGJ5IGZvcmNpbmcgdGhlIHRpbWVvdXQgdG8gemVyby4KICAgICAgICBzZWxmLl90aW1lb3V0ID0gc2VsZi5zb2NrZXQuZ2V0dGltZW91dCgpCiAgICAgICAgc2VsZi5zb2NrZXQuc2V0dGltZW91dCgwKQoKICAgIEBjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCiAgICBkZWYgX3JhaXNlX29uX2Vycm9yKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIEEgY29udGV4dCBtYW5hZ2VyIHRoYXQgY2FuIGJlIHVzZWQgdG8gd3JhcCBjYWxscyB0aGF0IGRvIEkvTyBmcm9tCiAgICAgICAgU2VjdXJlVHJhbnNwb3J0LiBJZiBhbnkgb2YgdGhlIEkvTyBjYWxsYmFja3MgaGl0IGFuIGV4Y2VwdGlvbiwgdGhpcwogICAgICAgIGNvbnRleHQgbWFuYWdlciB3aWxsIGNvcnJlY3RseSBwcm9wYWdhdGUgdGhlIGV4Y2VwdGlvbiBhZnRlciB0aGUgZmFjdC4KICAgICAgICBUaGlzIGF2b2lkcyBzaWxlbnRseSBzd2FsbG93aW5nIHRob3NlIGV4Y2VwdGlvbnMuCgogICAgICAgIEl0IGFsc28gY29ycmVjdGx5IGZvcmNlcyB0aGUgc29ja2V0IGNsb3NlZC4KICAgICAgICAiIiIKICAgICAgICBzZWxmLl9leGNlcHRpb24gPSBOb25lCgogICAgICAgICMgV2UgZXhwbGljaXRseSBkb24ndCBjYXRjaCBhcm91bmQgdGhpcyB5aWVsZCBiZWNhdXNlIGluIHRoZSB1bmxpa2VseQogICAgICAgICMgZXZlbnQgdGhhdCBhbiBleGNlcHRpb24gd2FzIGhpdCBpbiB0aGUgYmxvY2sgd2UgZG9uJ3Qgd2FudCB0byBzd2FsbG93CiAgICAgICAgIyBpdC4KICAgICAgICB5aWVsZAogICAgICAgIGlmIHNlbGYuX2V4Y2VwdGlvbiBpcyBub3QgTm9uZToKICAgICAgICAgICAgZXhjZXB0aW9uLCBzZWxmLl9leGNlcHRpb24gPSBzZWxmLl9leGNlcHRpb24sIE5vbmUKICAgICAgICAgICAgc2VsZi5jbG9zZSgpCiAgICAgICAgICAgIHJhaXNlIGV4Y2VwdGlvbgoKICAgIGRlZiBfc2V0X2NpcGhlcnMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgU2V0cyB1cCB0aGUgYWxsb3dlZCBjaXBoZXJzLiBCeSBkZWZhdWx0IHRoaXMgbWF0Y2hlcyB0aGUgc2V0IGluCiAgICAgICAgdXRpbC5zc2xfLkRFRkFVTFRfQ0lQSEVSUywgYXQgbGVhc3QgYXMgc3VwcG9ydGVkIGJ5IG1hY09TLiBUaGlzIGlzIGRvbmUKICAgICAgICBjdXN0b20gYW5kIGRvZXNuJ3QgYWxsb3cgY2hhbmdpbmcgYXQgdGhpcyB0aW1lLCBtb3N0bHkgYmVjYXVzZSBwYXJzaW5nCiAgICAgICAgT3BlblNTTCBjaXBoZXIgc3RyaW5ncyBpcyBnb2luZyB0byBiZSBhIGZyZWFraW5nIG5pZ2h0bWFyZS4KICAgICAgICAiIiIKICAgICAgICBjaXBoZXJzID0gKFNlY3VyaXR5LlNTTENpcGhlclN1aXRlICogbGVuKENJUEhFUl9TVUlURVMpKSgqQ0lQSEVSX1NVSVRFUykKICAgICAgICByZXN1bHQgPSBTZWN1cml0eS5TU0xTZXRFbmFibGVkQ2lwaGVycygKICAgICAgICAgICAgc2VsZi5jb250ZXh0LCBjaXBoZXJzLCBsZW4oQ0lQSEVSX1NVSVRFUykKICAgICAgICApCiAgICAgICAgX2Fzc2VydF9ub19lcnJvcihyZXN1bHQpCgogICAgZGVmIF9jdXN0b21fdmFsaWRhdGUoc2VsZiwgdmVyaWZ5LCB0cnVzdF9idW5kbGUpOgogICAgICAgICIiIgogICAgICAgIENhbGxlZCB3aGVuIHdlIGhhdmUgc2V0IGN1c3RvbSB2YWxpZGF0aW9uLiBXZSBkbyB0aGlzIGluIHR3byBjYXNlczoKICAgICAgICBmaXJzdCwgd2hlbiBjZXJ0IHZhbGlkYXRpb24gaXMgZW50aXJlbHkgZGlzYWJsZWQ7IGFuZCBzZWNvbmQsIHdoZW4KICAgICAgICB1c2luZyBhIGN1c3RvbSB0cnVzdCBEQi4KICAgICAgICAiIiIKICAgICAgICAjIElmIHdlIGRpc2FibGVkIGNlcnQgdmFsaWRhdGlvbiwganVzdCBzYXk6IGNvb2wuCiAgICAgICAgaWYgbm90IHZlcmlmeToKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICMgV2Ugd2FudCBkYXRhIGluIG1lbW9yeSwgc28gbG9hZCBpdCB1cC4KICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZSh0cnVzdF9idW5kbGUpOgogICAgICAgICAgICB3aXRoIG9wZW4odHJ1c3RfYnVuZGxlLCAncmInKSBhcyBmOgogICAgICAgICAgICAgICAgdHJ1c3RfYnVuZGxlID0gZi5yZWFkKCkKCiAgICAgICAgY2VydF9hcnJheSA9IE5vbmUKICAgICAgICB0cnVzdCA9IFNlY3VyaXR5LlNlY1RydXN0UmVmKCkKCiAgICAgICAgdHJ5OgogICAgICAgICAgICAjIEdldCBhIENGQXJyYXkgdGhhdCBjb250YWlucyB0aGUgY2VydHMgd2Ugd2FudC4KICAgICAgICAgICAgY2VydF9hcnJheSA9IF9jZXJ0X2FycmF5X2Zyb21fcGVtKHRydXN0X2J1bmRsZSkKCiAgICAgICAgICAgICMgT2ssIG5vdyB0aGUgaGFyZCBwYXJ0LiBXZSB3YW50IHRvIGdldCB0aGUgU2VjVHJ1c3RSZWYgdGhhdCBTVCBoYXMKICAgICAgICAgICAgIyBjcmVhdGVkIGZvciB0aGlzIGNvbm5lY3Rpb24sIHNob3ZlIG91ciBDQXMgaW50byBpdCwgdGVsbCBTVCB0bwogICAgICAgICAgICAjIGlnbm9yZSBldmVyeXRoaW5nIGVsc2UgaXQga25vd3MsIGFuZCB0aGVuIGFzayBpZiBpdCBjYW4gYnVpbGQgYQogICAgICAgICAgICAjIGNoYWluLiBUaGlzIGlzIGEgYnV1dXVuY2ggb2YgY29kZS4KICAgICAgICAgICAgcmVzdWx0ID0gU2VjdXJpdHkuU1NMQ29weVBlZXJUcnVzdCgKICAgICAgICAgICAgICAgIHNlbGYuY29udGV4dCwgY3R5cGVzLmJ5cmVmKHRydXN0KQogICAgICAgICAgICApCiAgICAgICAgICAgIF9hc3NlcnRfbm9fZXJyb3IocmVzdWx0KQogICAgICAgICAgICBpZiBub3QgdHJ1c3Q6CiAgICAgICAgICAgICAgICByYWlzZSBzc2wuU1NMRXJyb3IoIkZhaWxlZCB0byBjb3B5IHRydXN0IHJlZmVyZW5jZSIpCgogICAgICAgICAgICByZXN1bHQgPSBTZWN1cml0eS5TZWNUcnVzdFNldEFuY2hvckNlcnRpZmljYXRlcyh0cnVzdCwgY2VydF9hcnJheSkKICAgICAgICAgICAgX2Fzc2VydF9ub19lcnJvcihyZXN1bHQpCgogICAgICAgICAgICByZXN1bHQgPSBTZWN1cml0eS5TZWNUcnVzdFNldEFuY2hvckNlcnRpZmljYXRlc09ubHkodHJ1c3QsIFRydWUpCiAgICAgICAgICAgIF9hc3NlcnRfbm9fZXJyb3IocmVzdWx0KQoKICAgICAgICAgICAgdHJ1c3RfcmVzdWx0ID0gU2VjdXJpdHkuU2VjVHJ1c3RSZXN1bHRUeXBlKCkKICAgICAgICAgICAgcmVzdWx0ID0gU2VjdXJpdHkuU2VjVHJ1c3RFdmFsdWF0ZSgKICAgICAgICAgICAgICAgIHRydXN0LCBjdHlwZXMuYnlyZWYodHJ1c3RfcmVzdWx0KQogICAgICAgICAgICApCiAgICAgICAgICAgIF9hc3NlcnRfbm9fZXJyb3IocmVzdWx0KQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIGlmIHRydXN0OgogICAgICAgICAgICAgICAgQ29yZUZvdW5kYXRpb24uQ0ZSZWxlYXNlKHRydXN0KQoKICAgICAgICAgICAgaWYgY2VydF9hcnJheSBpcyBOb25lOgogICAgICAgICAgICAgICAgQ29yZUZvdW5kYXRpb24uQ0ZSZWxlYXNlKGNlcnRfYXJyYXkpCgogICAgICAgICMgT2ssIG5vdyB3ZSBjYW4gbG9vayBhdCB3aGF0IHRoZSByZXN1bHQgd2FzLgogICAgICAgIHN1Y2Nlc3NlcyA9ICgKICAgICAgICAgICAgU2VjdXJpdHlDb25zdC5rU2VjVHJ1c3RSZXN1bHRVbnNwZWNpZmllZCwKICAgICAgICAgICAgU2VjdXJpdHlDb25zdC5rU2VjVHJ1c3RSZXN1bHRQcm9jZWVkCiAgICAgICAgKQogICAgICAgIGlmIHRydXN0X3Jlc3VsdC52YWx1ZSBub3QgaW4gc3VjY2Vzc2VzOgogICAgICAgICAgICByYWlzZSBzc2wuU1NMRXJyb3IoCiAgICAgICAgICAgICAgICAiY2VydGlmaWNhdGUgdmVyaWZ5IGZhaWxlZCwgZXJyb3IgY29kZTogJWQiICUKICAgICAgICAgICAgICAgIHRydXN0X3Jlc3VsdC52YWx1ZQogICAgICAgICAgICApCgogICAgZGVmIGhhbmRzaGFrZShzZWxmLAogICAgICAgICAgICAgICAgICBzZXJ2ZXJfaG9zdG5hbWUsCiAgICAgICAgICAgICAgICAgIHZlcmlmeSwKICAgICAgICAgICAgICAgICAgdHJ1c3RfYnVuZGxlLAogICAgICAgICAgICAgICAgICBtaW5fdmVyc2lvbiwKICAgICAgICAgICAgICAgICAgbWF4X3ZlcnNpb24sCiAgICAgICAgICAgICAgICAgIGNsaWVudF9jZXJ0LAogICAgICAgICAgICAgICAgICBjbGllbnRfa2V5LAogICAgICAgICAgICAgICAgICBjbGllbnRfa2V5X3Bhc3NwaHJhc2UpOgogICAgICAgICIiIgogICAgICAgIEFjdHVhbGx5IHBlcmZvcm1zIHRoZSBUTFMgaGFuZHNoYWtlLiBUaGlzIGlzIHJ1biBhdXRvbWF0aWNhbGx5IGJ5CiAgICAgICAgd3JhcHBlZCBzb2NrZXQsIGFuZCBzaG91bGRuJ3QgYmUgbmVlZGVkIGluIHVzZXIgY29kZS4KICAgICAgICAiIiIKICAgICAgICAjIEZpcnN0LCB3ZSBkbyB0aGUgaW5pdGlhbCBiaXRzIG9mIGNvbm5lY3Rpb24gc2V0dXAuIFdlIG5lZWQgdG8gY3JlYXRlCiAgICAgICAgIyBhIGNvbnRleHQsIHNldCBpdHMgSS9PIGZ1bmNzLCBhbmQgc2V0IHRoZSBjb25uZWN0aW9uIHJlZmVyZW5jZS4KICAgICAgICBzZWxmLmNvbnRleHQgPSBTZWN1cml0eS5TU0xDcmVhdGVDb250ZXh0KAogICAgICAgICAgICBOb25lLCBTZWN1cml0eUNvbnN0LmtTU0xDbGllbnRTaWRlLCBTZWN1cml0eUNvbnN0LmtTU0xTdHJlYW1UeXBlCiAgICAgICAgKQogICAgICAgIHJlc3VsdCA9IFNlY3VyaXR5LlNTTFNldElPRnVuY3MoCiAgICAgICAgICAgIHNlbGYuY29udGV4dCwgX3JlYWRfY2FsbGJhY2tfcG9pbnRlciwgX3dyaXRlX2NhbGxiYWNrX3BvaW50ZXIKICAgICAgICApCiAgICAgICAgX2Fzc2VydF9ub19lcnJvcihyZXN1bHQpCgogICAgICAgICMgSGVyZSB3ZSBuZWVkIHRvIGNvbXB1dGUgdGhlIGhhbmRsZSB0byB1c2UuIFdlIGRvIHRoaXMgYnkgdGFraW5nIHRoZQogICAgICAgICMgaWQgb2Ygc2VsZiBtb2R1bG8gMioqMzEgLSAxLiBJZiB0aGlzIGlzIGFscmVhZHkgaW4gdGhlIGRpY3Rpb25hcnksIHdlCiAgICAgICAgIyBqdXN0IGtlZXAgaW5jcmVtZW50aW5nIGJ5IG9uZSB1bnRpbCB3ZSBmaW5kIGEgZnJlZSBzcGFjZS4KICAgICAgICB3aXRoIF9jb25uZWN0aW9uX3JlZl9sb2NrOgogICAgICAgICAgICBoYW5kbGUgPSBpZChzZWxmKSAlIDIxNDc0ODM2NDcKICAgICAgICAgICAgd2hpbGUgaGFuZGxlIGluIF9jb25uZWN0aW9uX3JlZnM6CiAgICAgICAgICAgICAgICBoYW5kbGUgPSAoaGFuZGxlICsgMSkgJSAyMTQ3NDgzNjQ3CiAgICAgICAgICAgIF9jb25uZWN0aW9uX3JlZnNbaGFuZGxlXSA9IHNlbGYKCiAgICAgICAgcmVzdWx0ID0gU2VjdXJpdHkuU1NMU2V0Q29ubmVjdGlvbihzZWxmLmNvbnRleHQsIGhhbmRsZSkKICAgICAgICBfYXNzZXJ0X25vX2Vycm9yKHJlc3VsdCkKCiAgICAgICAgIyBJZiB3ZSBoYXZlIGEgc2VydmVyIGhvc3RuYW1lLCB3ZSBzaG91bGQgc2V0IHRoYXQgdG9vLgogICAgICAgIGlmIHNlcnZlcl9ob3N0bmFtZToKICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uoc2VydmVyX2hvc3RuYW1lLCBieXRlcyk6CiAgICAgICAgICAgICAgICBzZXJ2ZXJfaG9zdG5hbWUgPSBzZXJ2ZXJfaG9zdG5hbWUuZW5jb2RlKCd1dGYtOCcpCgogICAgICAgICAgICByZXN1bHQgPSBTZWN1cml0eS5TU0xTZXRQZWVyRG9tYWluTmFtZSgKICAgICAgICAgICAgICAgIHNlbGYuY29udGV4dCwgc2VydmVyX2hvc3RuYW1lLCBsZW4oc2VydmVyX2hvc3RuYW1lKQogICAgICAgICAgICApCiAgICAgICAgICAgIF9hc3NlcnRfbm9fZXJyb3IocmVzdWx0KQoKICAgICAgICAjIFNldHVwIHRoZSBjaXBoZXJzLgogICAgICAgIHNlbGYuX3NldF9jaXBoZXJzKCkKCiAgICAgICAgIyBTZXQgdGhlIG1pbmltdW0gYW5kIG1heGltdW0gVExTIHZlcnNpb25zLgogICAgICAgIHJlc3VsdCA9IFNlY3VyaXR5LlNTTFNldFByb3RvY29sVmVyc2lvbk1pbihzZWxmLmNvbnRleHQsIG1pbl92ZXJzaW9uKQogICAgICAgIF9hc3NlcnRfbm9fZXJyb3IocmVzdWx0KQogICAgICAgIHJlc3VsdCA9IFNlY3VyaXR5LlNTTFNldFByb3RvY29sVmVyc2lvbk1heChzZWxmLmNvbnRleHQsIG1heF92ZXJzaW9uKQogICAgICAgIF9hc3NlcnRfbm9fZXJyb3IocmVzdWx0KQoKICAgICAgICAjIElmIHRoZXJlJ3MgYSB0cnVzdCBEQiwgd2UgbmVlZCB0byB1c2UgaXQuIFdlIGRvIHRoYXQgYnkgdGVsbGluZwogICAgICAgICMgU2VjdXJlVHJhbnNwb3J0IHRvIGJyZWFrIG9uIHNlcnZlciBhdXRoLiBXZSBhbHNvIGRvIHRoYXQgaWYgd2UgZG9uJ3QKICAgICAgICAjIHdhbnQgdG8gdmFsaWRhdGUgdGhlIGNlcnRzIGF0IGFsbDogd2UganVzdCB3b24ndCBhY3R1YWxseSBkbyBhbnkKICAgICAgICAjIGF1dGhpbmcgaW4gdGhhdCBjYXNlLgogICAgICAgIGlmIG5vdCB2ZXJpZnkgb3IgdHJ1c3RfYnVuZGxlIGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXN1bHQgPSBTZWN1cml0eS5TU0xTZXRTZXNzaW9uT3B0aW9uKAogICAgICAgICAgICAgICAgc2VsZi5jb250ZXh0LAogICAgICAgICAgICAgICAgU2VjdXJpdHlDb25zdC5rU1NMU2Vzc2lvbk9wdGlvbkJyZWFrT25TZXJ2ZXJBdXRoLAogICAgICAgICAgICAgICAgVHJ1ZQogICAgICAgICAgICApCiAgICAgICAgICAgIF9hc3NlcnRfbm9fZXJyb3IocmVzdWx0KQoKICAgICAgICAjIElmIHRoZXJlJ3MgYSBjbGllbnQgY2VydCwgd2UgbmVlZCB0byB1c2UgaXQuCiAgICAgICAgaWYgY2xpZW50X2NlcnQ6CiAgICAgICAgICAgIHNlbGYuX2tleWNoYWluLCBzZWxmLl9rZXljaGFpbl9kaXIgPSBfdGVtcG9yYXJ5X2tleWNoYWluKCkKICAgICAgICAgICAgc2VsZi5fY2xpZW50X2NlcnRfY2hhaW4gPSBfbG9hZF9jbGllbnRfY2VydF9jaGFpbigKICAgICAgICAgICAgICAgIHNlbGYuX2tleWNoYWluLCBjbGllbnRfY2VydCwgY2xpZW50X2tleQogICAgICAgICAgICApCiAgICAgICAgICAgIHJlc3VsdCA9IFNlY3VyaXR5LlNTTFNldENlcnRpZmljYXRlKAogICAgICAgICAgICAgICAgc2VsZi5jb250ZXh0LCBzZWxmLl9jbGllbnRfY2VydF9jaGFpbgogICAgICAgICAgICApCiAgICAgICAgICAgIF9hc3NlcnRfbm9fZXJyb3IocmVzdWx0KQoKICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICB3aXRoIHNlbGYuX3JhaXNlX29uX2Vycm9yKCk6CiAgICAgICAgICAgICAgICByZXN1bHQgPSBTZWN1cml0eS5TU0xIYW5kc2hha2Uoc2VsZi5jb250ZXh0KQoKICAgICAgICAgICAgICAgIGlmIHJlc3VsdCA9PSBTZWN1cml0eUNvbnN0LmVyclNTTFdvdWxkQmxvY2s6CiAgICAgICAgICAgICAgICAgICAgcmFpc2Ugc29ja2V0LnRpbWVvdXQoImhhbmRzaGFrZSB0aW1lZCBvdXQiKQogICAgICAgICAgICAgICAgZWxpZiByZXN1bHQgPT0gU2VjdXJpdHlDb25zdC5lcnJTU0xTZXJ2ZXJBdXRoQ29tcGxldGVkOgogICAgICAgICAgICAgICAgICAgIHNlbGYuX2N1c3RvbV92YWxpZGF0ZSh2ZXJpZnksIHRydXN0X2J1bmRsZSkKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBfYXNzZXJ0X25vX2Vycm9yKHJlc3VsdCkKICAgICAgICAgICAgICAgICAgICBicmVhawoKICAgIGRlZiBmaWxlbm8oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuc29ja2V0LmZpbGVubygpCgogICAgIyBDb3B5LXBhc3RlZCBmcm9tIFB5dGhvbiAzLjUgc291cmNlIGNvZGUKICAgIGRlZiBfZGVjcmVmX3NvY2tldGlvcyhzZWxmKToKICAgICAgICBpZiBzZWxmLl9tYWtlZmlsZV9yZWZzID4gMDoKICAgICAgICAgICAgc2VsZi5fbWFrZWZpbGVfcmVmcyAtPSAxCiAgICAgICAgaWYgc2VsZi5fY2xvc2VkOgogICAgICAgICAgICBzZWxmLmNsb3NlKCkKCiAgICBkZWYgcmVjdihzZWxmLCBidWZzaXopOgogICAgICAgIGJ1ZmZlciA9IGN0eXBlcy5jcmVhdGVfc3RyaW5nX2J1ZmZlcihidWZzaXopCiAgICAgICAgYnl0ZXNfcmVhZCA9IHNlbGYucmVjdl9pbnRvKGJ1ZmZlciwgYnVmc2l6KQogICAgICAgIGRhdGEgPSBidWZmZXJbOmJ5dGVzX3JlYWRdCiAgICAgICAgcmV0dXJuIGRhdGEKCiAgICBkZWYgcmVjdl9pbnRvKHNlbGYsIGJ1ZmZlciwgbmJ5dGVzPU5vbmUpOgogICAgICAgICMgUmVhZCBzaG9ydCBvbiBFT0YuCiAgICAgICAgaWYgc2VsZi5fY2xvc2VkOgogICAgICAgICAgICByZXR1cm4gMAoKICAgICAgICBpZiBuYnl0ZXMgaXMgTm9uZToKICAgICAgICAgICAgbmJ5dGVzID0gbGVuKGJ1ZmZlcikKCiAgICAgICAgYnVmZmVyID0gKGN0eXBlcy5jX2NoYXIgKiBuYnl0ZXMpLmZyb21fYnVmZmVyKGJ1ZmZlcikKICAgICAgICBwcm9jZXNzZWRfYnl0ZXMgPSBjdHlwZXMuY19zaXplX3QoMCkKCiAgICAgICAgd2l0aCBzZWxmLl9yYWlzZV9vbl9lcnJvcigpOgogICAgICAgICAgICByZXN1bHQgPSBTZWN1cml0eS5TU0xSZWFkKAogICAgICAgICAgICAgICAgc2VsZi5jb250ZXh0LCBidWZmZXIsIG5ieXRlcywgY3R5cGVzLmJ5cmVmKHByb2Nlc3NlZF9ieXRlcykKICAgICAgICAgICAgKQoKICAgICAgICAjIFRoZXJlIGFyZSBzb21lIHJlc3VsdCBjb2RlcyB0aGF0IHdlIHdhbnQgdG8gdHJlYXQgYXMgIm5vdCBhbHdheXMKICAgICAgICAjIGVycm9ycyIuIFNwZWNpZmljYWxseSwgdGhvc2UgYXJlIGVyclNTTFdvdWxkQmxvY2ssCiAgICAgICAgIyBlcnJTU0xDbG9zZWRHcmFjZWZ1bCwgYW5kIGVyclNTTENsb3NlZE5vTm90aWZ5LgogICAgICAgIGlmIChyZXN1bHQgPT0gU2VjdXJpdHlDb25zdC5lcnJTU0xXb3VsZEJsb2NrKToKICAgICAgICAgICAgIyBJZiB3ZSBkaWRuJ3QgcHJvY2VzcyBhbnkgYnl0ZXMsIHRoZW4gdGhpcyB3YXMganVzdCBhIHRpbWUgb3V0LgogICAgICAgICAgICAjIEhvd2V2ZXIsIHdlIGNhbiBnZXQgZXJyU1NMV291bGRCbG9jayBpbiBzaXR1YXRpb25zIHdoZW4gd2UgKmRpZCoKICAgICAgICAgICAgIyByZWFkIHNvbWUgZGF0YSwgYW5kIGluIHRob3NlIGNhc2VzIHdlIHNob3VsZCBqdXN0IHJlYWQgInNob3J0IgogICAgICAgICAgICAjIGFuZCByZXR1cm4uCiAgICAgICAgICAgIGlmIHByb2Nlc3NlZF9ieXRlcy52YWx1ZSA9PSAwOgogICAgICAgICAgICAgICAgIyBUaW1lZCBvdXQsIG5vIGRhdGEgcmVhZC4KICAgICAgICAgICAgICAgIHJhaXNlIHNvY2tldC50aW1lb3V0KCJyZWN2IHRpbWVkIG91dCIpCiAgICAgICAgZWxpZiByZXN1bHQgaW4gKFNlY3VyaXR5Q29uc3QuZXJyU1NMQ2xvc2VkR3JhY2VmdWwsIFNlY3VyaXR5Q29uc3QuZXJyU1NMQ2xvc2VkTm9Ob3RpZnkpOgogICAgICAgICAgICAjIFRoZSByZW1vdGUgcGVlciBoYXMgY2xvc2VkIHRoaXMgY29ubmVjdGlvbi4gV2Ugc2hvdWxkIGRvIHNvIGFzCiAgICAgICAgICAgICMgd2VsbC4gTm90ZSB0aGF0IHdlIGRvbid0IGFjdHVhbGx5IHJldHVybiBoZXJlIGJlY2F1c2UgaW4KICAgICAgICAgICAgIyBwcmluY2lwbGUgdGhpcyBjb3VsZCBhY3R1YWxseSBiZSBmaXJlZCBhbG9uZyB3aXRoIHJldHVybiBkYXRhLgogICAgICAgICAgICAjIEl0J3MgdW5saWtlbHkgdGhvdWdoLgogICAgICAgICAgICBzZWxmLmNsb3NlKCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBfYXNzZXJ0X25vX2Vycm9yKHJlc3VsdCkKCiAgICAgICAgIyBPaywgd2UgcmVhZCBhbmQgcHJvYmFibHkgc3VjY2VlZGVkLiBXZSBzaG91bGQgcmV0dXJuIHdoYXRldmVyIGRhdGEKICAgICAgICAjIHdhcyBhY3R1YWxseSByZWFkLgogICAgICAgIHJldHVybiBwcm9jZXNzZWRfYnl0ZXMudmFsdWUKCiAgICBkZWYgc2V0dGltZW91dChzZWxmLCB0aW1lb3V0KToKICAgICAgICBzZWxmLl90aW1lb3V0ID0gdGltZW91dAoKICAgIGRlZiBnZXR0aW1lb3V0KHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl90aW1lb3V0CgogICAgZGVmIHNlbmQoc2VsZiwgZGF0YSk6CiAgICAgICAgcHJvY2Vzc2VkX2J5dGVzID0gY3R5cGVzLmNfc2l6ZV90KDApCgogICAgICAgIHdpdGggc2VsZi5fcmFpc2Vfb25fZXJyb3IoKToKICAgICAgICAgICAgcmVzdWx0ID0gU2VjdXJpdHkuU1NMV3JpdGUoCiAgICAgICAgICAgICAgICBzZWxmLmNvbnRleHQsIGRhdGEsIGxlbihkYXRhKSwgY3R5cGVzLmJ5cmVmKHByb2Nlc3NlZF9ieXRlcykKICAgICAgICAgICAgKQoKICAgICAgICBpZiByZXN1bHQgPT0gU2VjdXJpdHlDb25zdC5lcnJTU0xXb3VsZEJsb2NrIGFuZCBwcm9jZXNzZWRfYnl0ZXMudmFsdWUgPT0gMDoKICAgICAgICAgICAgIyBUaW1lZCBvdXQKICAgICAgICAgICAgcmFpc2Ugc29ja2V0LnRpbWVvdXQoInNlbmQgdGltZWQgb3V0IikKICAgICAgICBlbHNlOgogICAgICAgICAgICBfYXNzZXJ0X25vX2Vycm9yKHJlc3VsdCkKCiAgICAgICAgIyBXZSBzZW50LCBhbmQgcHJvYmFibHkgc3VjY2VlZGVkLiBUZWxsIHRoZW0gaG93IG11Y2ggd2Ugc2VudC4KICAgICAgICByZXR1cm4gcHJvY2Vzc2VkX2J5dGVzLnZhbHVlCgogICAgZGVmIHNlbmRhbGwoc2VsZiwgZGF0YSk6CiAgICAgICAgdG90YWxfc2VudCA9IDAKICAgICAgICB3aGlsZSB0b3RhbF9zZW50IDwgbGVuKGRhdGEpOgogICAgICAgICAgICBzZW50ID0gc2VsZi5zZW5kKGRhdGFbdG90YWxfc2VudDp0b3RhbF9zZW50ICsgU1NMX1dSSVRFX0JMT0NLU0laRV0pCiAgICAgICAgICAgIHRvdGFsX3NlbnQgKz0gc2VudAoKICAgIGRlZiBzaHV0ZG93bihzZWxmKToKICAgICAgICB3aXRoIHNlbGYuX3JhaXNlX29uX2Vycm9yKCk6CiAgICAgICAgICAgIFNlY3VyaXR5LlNTTENsb3NlKHNlbGYuY29udGV4dCkKCiAgICBkZWYgY2xvc2Uoc2VsZik6CiAgICAgICAgIyBUT0RPOiBzaG91bGQgSSBkbyBjbGVhbiBzaHV0ZG93biBoZXJlPyBEbyBJIGhhdmUgdG8/CiAgICAgICAgaWYgc2VsZi5fbWFrZWZpbGVfcmVmcyA8IDE6CiAgICAgICAgICAgIHNlbGYuX2Nsb3NlZCA9IFRydWUKICAgICAgICAgICAgaWYgc2VsZi5jb250ZXh0OgogICAgICAgICAgICAgICAgQ29yZUZvdW5kYXRpb24uQ0ZSZWxlYXNlKHNlbGYuY29udGV4dCkKICAgICAgICAgICAgICAgIHNlbGYuY29udGV4dCA9IE5vbmUKICAgICAgICAgICAgaWYgc2VsZi5fY2xpZW50X2NlcnRfY2hhaW46CiAgICAgICAgICAgICAgICBDb3JlRm91bmRhdGlvbi5DRlJlbGVhc2Uoc2VsZi5fY2xpZW50X2NlcnRfY2hhaW4pCiAgICAgICAgICAgICAgICBzZWxmLl9jbGllbnRfY2VydF9jaGFpbiA9IE5vbmUKICAgICAgICAgICAgaWYgc2VsZi5fa2V5Y2hhaW46CiAgICAgICAgICAgICAgICBTZWN1cml0eS5TZWNLZXljaGFpbkRlbGV0ZShzZWxmLl9rZXljaGFpbikKICAgICAgICAgICAgICAgIENvcmVGb3VuZGF0aW9uLkNGUmVsZWFzZShzZWxmLl9rZXljaGFpbikKICAgICAgICAgICAgICAgIHNodXRpbC5ybXRyZWUoc2VsZi5fa2V5Y2hhaW5fZGlyKQogICAgICAgICAgICAgICAgc2VsZi5fa2V5Y2hhaW4gPSBzZWxmLl9rZXljaGFpbl9kaXIgPSBOb25lCiAgICAgICAgICAgIHJldHVybiBzZWxmLnNvY2tldC5jbG9zZSgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5fbWFrZWZpbGVfcmVmcyAtPSAxCgogICAgZGVmIGdldHBlZXJjZXJ0KHNlbGYsIGJpbmFyeV9mb3JtPUZhbHNlKToKICAgICAgICAjIFVyZ2gsIGFubm95aW5nLgogICAgICAgICMKICAgICAgICAjIEhlcmUncyBob3cgd2UgZG8gdGhpczoKICAgICAgICAjCiAgICAgICAgIyAxLiBDYWxsIFNTTENvcHlQZWVyVHJ1c3QgdG8gZ2V0IGhvbGQgb2YgdGhlIHRydXN0IG9iamVjdCBmb3IgdGhpcwogICAgICAgICMgICAgY29ubmVjdGlvbi4KICAgICAgICAjIDIuIENhbGwgU2VjVHJ1c3RHZXRDZXJ0aWZpY2F0ZUF0SW5kZXggZm9yIGluZGV4IDAgdG8gZ2V0IHRoZSBsZWFmLgogICAgICAgICMgMy4gVG8gZ2V0IHRoZSBDTiwgY2FsbCBTZWNDZXJ0aWZpY2F0ZUNvcHlDb21tb25OYW1lIGFuZCBwcm9jZXNzIHRoYXQKICAgICAgICAjICAgIHN0cmluZyBzbyB0aGF0IGl0J3Mgb2YgdGhlIGFwcHJvcHJpYXRlIHR5cGUuCiAgICAgICAgIyA0LiBUbyBnZXQgdGhlIFNBTiwgd2UgbmVlZCB0byBkbyBzb21ldGhpbmcgYSBiaXQgbW9yZSBjb21wbGV4OgogICAgICAgICMgICAgYS4gQ2FsbCBTZWNDZXJ0aWZpY2F0ZUNvcHlWYWx1ZXMgdG8gZ2V0IHRoZSBkYXRhLCByZXF1ZXN0aW5nCiAgICAgICAgIyAgICAgICBrU2VjT0lEU3ViamVjdEFsdE5hbWUuCiAgICAgICAgIyAgICBiLiBNZXNzIGFib3V0IHdpdGggdGhpcyBkaWN0aW9uYXJ5IHRvIHRyeSB0byBnZXQgdGhlIFNBTnMgb3V0LgogICAgICAgICMKICAgICAgICAjIFRoaXMgaXMgZ3Jvc3MuIFJlYWxseSBncm9zcy4gSXQncyBnb2luZyB0byBiZSBhIGZldyBodW5kcmVkIExvQyBleHRyYQogICAgICAgICMganVzdCB0byByZXBlYXQgc29tZXRoaW5nIHRoYXQgU2VjdXJlVHJhbnNwb3J0IGNhbiAqYWxyZWFkeSBkbyouIFNvIG15CiAgICAgICAgIyBvcGVyYXRpbmcgYXNzdW1wdGlvbiBhdCB0aGlzIHRpbWUgaXMgdGhhdCB3aGF0IHdlIHdhbnQgdG8gZG8gaXMKICAgICAgICAjIGluc3RlYWQgdG8ganVzdCBmbGFnIHRvIHVybGxpYjMgdGhhdCBpdCBzaG91bGRuJ3QgZG8gaXRzIG93biBob3N0bmFtZQogICAgICAgICMgdmFsaWRhdGlvbiB3aGVuIHVzaW5nIFNlY3VyZVRyYW5zcG9ydC4KICAgICAgICBpZiBub3QgYmluYXJ5X2Zvcm06CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCiAgICAgICAgICAgICAgICAiU2VjdXJlVHJhbnNwb3J0IG9ubHkgc3VwcG9ydHMgZHVtcGluZyBiaW5hcnkgY2VydHMiCiAgICAgICAgICAgICkKICAgICAgICB0cnVzdCA9IFNlY3VyaXR5LlNlY1RydXN0UmVmKCkKICAgICAgICBjZXJ0ZGF0YSA9IE5vbmUKICAgICAgICBkZXJfYnl0ZXMgPSBOb25lCgogICAgICAgIHRyeToKICAgICAgICAgICAgIyBHcmFiIHRoZSB0cnVzdCBzdG9yZS4KICAgICAgICAgICAgcmVzdWx0ID0gU2VjdXJpdHkuU1NMQ29weVBlZXJUcnVzdCgKICAgICAgICAgICAgICAgIHNlbGYuY29udGV4dCwgY3R5cGVzLmJ5cmVmKHRydXN0KQogICAgICAgICAgICApCiAgICAgICAgICAgIF9hc3NlcnRfbm9fZXJyb3IocmVzdWx0KQogICAgICAgICAgICBpZiBub3QgdHJ1c3Q6CiAgICAgICAgICAgICAgICAjIFByb2JhYmx5IHdlIGhhdmVuJ3QgZG9uZSB0aGUgaGFuZHNoYWtlIHlldC4gTm8gYmlnZ2llLgogICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgICAgIGNlcnRfY291bnQgPSBTZWN1cml0eS5TZWNUcnVzdEdldENlcnRpZmljYXRlQ291bnQodHJ1c3QpCiAgICAgICAgICAgIGlmIG5vdCBjZXJ0X2NvdW50OgogICAgICAgICAgICAgICAgIyBBbHNvIGEgY2FzZSB0aGF0IG1pZ2h0IGhhcHBlbiBpZiB3ZSBoYXZlbid0IGhhbmRzaGFrZWQuCiAgICAgICAgICAgICAgICAjIEhhbmRzaG9vaz8gSGFuZHNoYWtlbj8KICAgICAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgICAgICAgICBsZWFmID0gU2VjdXJpdHkuU2VjVHJ1c3RHZXRDZXJ0aWZpY2F0ZUF0SW5kZXgodHJ1c3QsIDApCiAgICAgICAgICAgIGFzc2VydCBsZWFmCgogICAgICAgICAgICAjIE9rLCBub3cgd2Ugd2FudCB0aGUgREVSIGJ5dGVzLgogICAgICAgICAgICBjZXJ0ZGF0YSA9IFNlY3VyaXR5LlNlY0NlcnRpZmljYXRlQ29weURhdGEobGVhZikKICAgICAgICAgICAgYXNzZXJ0IGNlcnRkYXRhCgogICAgICAgICAgICBkYXRhX2xlbmd0aCA9IENvcmVGb3VuZGF0aW9uLkNGRGF0YUdldExlbmd0aChjZXJ0ZGF0YSkKICAgICAgICAgICAgZGF0YV9idWZmZXIgPSBDb3JlRm91bmRhdGlvbi5DRkRhdGFHZXRCeXRlUHRyKGNlcnRkYXRhKQogICAgICAgICAgICBkZXJfYnl0ZXMgPSBjdHlwZXMuc3RyaW5nX2F0KGRhdGFfYnVmZmVyLCBkYXRhX2xlbmd0aCkKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBpZiBjZXJ0ZGF0YToKICAgICAgICAgICAgICAgIENvcmVGb3VuZGF0aW9uLkNGUmVsZWFzZShjZXJ0ZGF0YSkKICAgICAgICAgICAgaWYgdHJ1c3Q6CiAgICAgICAgICAgICAgICBDb3JlRm91bmRhdGlvbi5DRlJlbGVhc2UodHJ1c3QpCgogICAgICAgIHJldHVybiBkZXJfYnl0ZXMKCiAgICBkZWYgX3JldXNlKHNlbGYpOgogICAgICAgIHNlbGYuX21ha2VmaWxlX3JlZnMgKz0gMQoKICAgIGRlZiBfZHJvcChzZWxmKToKICAgICAgICBpZiBzZWxmLl9tYWtlZmlsZV9yZWZzIDwgMToKICAgICAgICAgICAgc2VsZi5jbG9zZSgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5fbWFrZWZpbGVfcmVmcyAtPSAxCgoKaWYgX2ZpbGVvYmplY3Q6ICAjIFBsYXRmb3JtLXNwZWNpZmljOiBQeXRob24gMgogICAgZGVmIG1ha2VmaWxlKHNlbGYsIG1vZGUsIGJ1ZnNpemU9LTEpOgogICAgICAgIHNlbGYuX21ha2VmaWxlX3JlZnMgKz0gMQogICAgICAgIHJldHVybiBfZmlsZW9iamVjdChzZWxmLCBtb2RlLCBidWZzaXplLCBjbG9zZT1UcnVlKQplbHNlOiAgIyBQbGF0Zm9ybS1zcGVjaWZpYzogUHl0aG9uIDMKICAgIGRlZiBtYWtlZmlsZShzZWxmLCBtb2RlPSJyIiwgYnVmZmVyaW5nPU5vbmUsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgIyBXZSBkaXNhYmxlIGJ1ZmZlcmluZyB3aXRoIFNlY3VyZVRyYW5zcG9ydCBiZWNhdXNlIGl0IGNvbmZsaWN0cyB3aXRoCiAgICAgICAgIyB0aGUgYnVmZmVyaW5nIHRoYXQgU1QgZG9lcyBpbnRlcm5hbGx5IChzZWUgaXNzdWUgIzExNTMgZm9yIG1vcmUpLgogICAgICAgIGJ1ZmZlcmluZyA9IDAKICAgICAgICByZXR1cm4gYmFja3BvcnRfbWFrZWZpbGUoc2VsZiwgbW9kZSwgYnVmZmVyaW5nLCAqYXJncywgKiprd2FyZ3MpCgpXcmFwcGVkU29ja2V0Lm1ha2VmaWxlID0gbWFrZWZpbGUKCgpjbGFzcyBTZWN1cmVUcmFuc3BvcnRDb250ZXh0KG9iamVjdCk6CiAgICAiIiIKICAgIEkgYW0gYSB3cmFwcGVyIGNsYXNzIGZvciB0aGUgU2VjdXJlVHJhbnNwb3J0IGxpYnJhcnksIHRvIHRyYW5zbGF0ZSB0aGUKICAgIGludGVyZmFjZSBvZiB0aGUgc3RhbmRhcmQgbGlicmFyeSBgYFNTTENvbnRleHRgYCBvYmplY3QgdG8gY2FsbHMgaW50bwogICAgU2VjdXJlVHJhbnNwb3J0LgogICAgIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgcHJvdG9jb2wpOgogICAgICAgIHNlbGYuX21pbl92ZXJzaW9uLCBzZWxmLl9tYXhfdmVyc2lvbiA9IF9wcm90b2NvbF90b19taW5fbWF4W3Byb3RvY29sXQogICAgICAgIHNlbGYuX29wdGlvbnMgPSAwCiAgICAgICAgc2VsZi5fdmVyaWZ5ID0gRmFsc2UKICAgICAgICBzZWxmLl90cnVzdF9idW5kbGUgPSBOb25lCiAgICAgICAgc2VsZi5fY2xpZW50X2NlcnQgPSBOb25lCiAgICAgICAgc2VsZi5fY2xpZW50X2tleSA9IE5vbmUKICAgICAgICBzZWxmLl9jbGllbnRfa2V5X3Bhc3NwaHJhc2UgPSBOb25lCgogICAgQHByb3BlcnR5CiAgICBkZWYgY2hlY2tfaG9zdG5hbWUoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgU2VjdXJlVHJhbnNwb3J0IGNhbm5vdCBoYXZlIGl0cyBob3N0bmFtZSBjaGVja2luZyBkaXNhYmxlZC4gRm9yIG1vcmUsCiAgICAgICAgc2VlIHRoZSBjb21tZW50IG9uIGdldHBlZXJjZXJ0KCkgaW4gdGhpcyBmaWxlLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBUcnVlCgogICAgQGNoZWNrX2hvc3RuYW1lLnNldHRlcgogICAgZGVmIGNoZWNrX2hvc3RuYW1lKHNlbGYsIHZhbHVlKToKICAgICAgICAiIiIKICAgICAgICBTZWN1cmVUcmFuc3BvcnQgY2Fubm90IGhhdmUgaXRzIGhvc3RuYW1lIGNoZWNraW5nIGRpc2FibGVkLiBGb3IgbW9yZSwKICAgICAgICBzZWUgdGhlIGNvbW1lbnQgb24gZ2V0cGVlcmNlcnQoKSBpbiB0aGlzIGZpbGUuCiAgICAgICAgIiIiCiAgICAgICAgcGFzcwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIG9wdGlvbnMoc2VsZik6CiAgICAgICAgIyBUT0RPOiBXZWxsLCBjcmFwLgogICAgICAgICMKICAgICAgICAjIFNvIHRoaXMgaXMgdGhlIGJpdCBvZiB0aGUgY29kZSB0aGF0IGlzIHRoZSBtb3N0IGxpa2VseSB0byBjYXVzZSB1cwogICAgICAgICMgdHJvdWJsZS4gRXNzZW50aWFsbHkgd2UgbmVlZCB0byBlbnVtZXJhdGUgYWxsIG9mIHRoZSBTU0wgb3B0aW9ucyB0aGF0CiAgICAgICAgIyB1c2VycyBtaWdodCB3YW50IHRvIHVzZSBhbmQgdHJ5IHRvIHNlZSBpZiB3ZSBjYW4gc2Vuc2libHkgdHJhbnNsYXRlCiAgICAgICAgIyB0aGVtLCBvciB3aGV0aGVyIHdlIHNob3VsZCBqdXN0IGlnbm9yZSB0aGVtLgogICAgICAgIHJldHVybiBzZWxmLl9vcHRpb25zCgogICAgQG9wdGlvbnMuc2V0dGVyCiAgICBkZWYgb3B0aW9ucyhzZWxmLCB2YWx1ZSk6CiAgICAgICAgIyBUT0RPOiBVcGRhdGUgaW4gbGluZSB3aXRoIGFib3ZlLgogICAgICAgIHNlbGYuX29wdGlvbnMgPSB2YWx1ZQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHZlcmlmeV9tb2RlKHNlbGYpOgogICAgICAgIHJldHVybiBzc2wuQ0VSVF9SRVFVSVJFRCBpZiBzZWxmLl92ZXJpZnkgZWxzZSBzc2wuQ0VSVF9OT05FCgogICAgQHZlcmlmeV9tb2RlLnNldHRlcgogICAgZGVmIHZlcmlmeV9tb2RlKHNlbGYsIHZhbHVlKToKICAgICAgICBzZWxmLl92ZXJpZnkgPSBUcnVlIGlmIHZhbHVlID09IHNzbC5DRVJUX1JFUVVJUkVEIGVsc2UgRmFsc2UKCiAgICBkZWYgc2V0X2RlZmF1bHRfdmVyaWZ5X3BhdGhzKHNlbGYpOgogICAgICAgICMgU28sIHRoaXMgaGFzIHRvIGRvIHNvbWV0aGluZyBhIGJpdCB3ZWlyZC4gU3BlY2lmaWNhbGx5LCB3aGF0IGl0IGRvZXMKICAgICAgICAjIGlzIG5vdGhpbmcuCiAgICAgICAgIwogICAgICAgICMgVGhpcyBtZWFucyB0aGF0LCBpZiB3ZSBoYWQgcHJldmlvdXNseSBoYWQgbG9hZF92ZXJpZnlfbG9jYXRpb25zCiAgICAgICAgIyBjYWxsZWQsIHRoaXMgZG9lcyBub3QgdW5kbyB0aGF0LiBXZSBuZWVkIHRvIGRvIHRoYXQgYmVjYXVzZSBpdCB0dXJucwogICAgICAgICMgb3V0IHRoYXQgdGhlIHJlc3Qgb2YgdGhlIHVybGxpYjMgY29kZSB3aWxsIGF0dGVtcHQgdG8gbG9hZCB0aGUKICAgICAgICAjIGRlZmF1bHQgdmVyaWZ5IHBhdGhzIGlmIGl0IGhhc24ndCBiZWVuIHRvbGQgYWJvdXQgYW55IHBhdGhzLCBldmVuIGlmCiAgICAgICAgIyB0aGUgY29udGV4dCBpdHNlbGYgd2FzIHNvbWV0aW1lIGVhcmxpZXIuIFdlIHJlc29sdmUgdGhhdCBieSBqdXN0CiAgICAgICAgIyBpZ25vcmluZyBpdC4KICAgICAgICBwYXNzCgogICAgZGVmIGxvYWRfZGVmYXVsdF9jZXJ0cyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5zZXRfZGVmYXVsdF92ZXJpZnlfcGF0aHMoKQoKICAgIGRlZiBzZXRfY2lwaGVycyhzZWxmLCBjaXBoZXJzKToKICAgICAgICAjIEZvciBub3csIHdlIGp1c3QgcmVxdWlyZSB0aGUgZGVmYXVsdCBjaXBoZXIgc3RyaW5nLgogICAgICAgIGlmIGNpcGhlcnMgIT0gdXRpbC5zc2xfLkRFRkFVTFRfQ0lQSEVSUzoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKICAgICAgICAgICAgICAgICJTZWN1cmVUcmFuc3BvcnQgZG9lc24ndCBzdXBwb3J0IGN1c3RvbSBjaXBoZXIgc3RyaW5ncyIKICAgICAgICAgICAgKQoKICAgIGRlZiBsb2FkX3ZlcmlmeV9sb2NhdGlvbnMoc2VsZiwgY2FmaWxlPU5vbmUsIGNhcGF0aD1Ob25lLCBjYWRhdGE9Tm9uZSk6CiAgICAgICAgIyBPSywgd2Ugb25seSByZWFsbHkgc3VwcG9ydCBjYWRhdGEgYW5kIGNhZmlsZS4KICAgICAgICBpZiBjYXBhdGggaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCiAgICAgICAgICAgICAgICAiU2VjdXJlVHJhbnNwb3J0IGRvZXMgbm90IHN1cHBvcnQgY2VydCBkaXJlY3RvcmllcyIKICAgICAgICAgICAgKQoKICAgICAgICBzZWxmLl90cnVzdF9idW5kbGUgPSBjYWZpbGUgb3IgY2FkYXRhCgogICAgZGVmIGxvYWRfY2VydF9jaGFpbihzZWxmLCBjZXJ0ZmlsZSwga2V5ZmlsZT1Ob25lLCBwYXNzd29yZD1Ob25lKToKICAgICAgICBzZWxmLl9jbGllbnRfY2VydCA9IGNlcnRmaWxlCiAgICAgICAgc2VsZi5fY2xpZW50X2tleSA9IGtleWZpbGUKICAgICAgICBzZWxmLl9jbGllbnRfY2VydF9wYXNzcGhyYXNlID0gcGFzc3dvcmQKCiAgICBkZWYgd3JhcF9zb2NrZXQoc2VsZiwgc29jaywgc2VydmVyX3NpZGU9RmFsc2UsCiAgICAgICAgICAgICAgICAgICAgZG9faGFuZHNoYWtlX29uX2Nvbm5lY3Q9VHJ1ZSwgc3VwcHJlc3NfcmFnZ2VkX2VvZnM9VHJ1ZSwKICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJfaG9zdG5hbWU9Tm9uZSk6CiAgICAgICAgIyBTbywgd2hhdCBkbyB3ZSBkbyBoZXJlPyBGaXJzdGx5LCB3ZSBhc3NlcnQgc29tZSBwcm9wZXJ0aWVzLiBUaGlzIGlzIGEKICAgICAgICAjIHN0cmlwcGVkIGRvd24gc2hpbSwgc28gdGhlcmUgaXMgc29tZSBmdW5jdGlvbmFsaXR5IHdlIGRvbid0IHN1cHBvcnQuCiAgICAgICAgIyBTZWUgUEVQIDU0MyBmb3IgdGhlIHJlYWwgZGVhbC4KICAgICAgICBhc3NlcnQgbm90IHNlcnZlcl9zaWRlCiAgICAgICAgYXNzZXJ0IGRvX2hhbmRzaGFrZV9vbl9jb25uZWN0CiAgICAgICAgYXNzZXJ0IHN1cHByZXNzX3JhZ2dlZF9lb2ZzCgogICAgICAgICMgT2ssIHdlJ3JlIGdvb2QgdG8gZ28uIE5vdyB3ZSB3YW50IHRvIGNyZWF0ZSB0aGUgd3JhcHBlZCBzb2NrZXQgb2JqZWN0CiAgICAgICAgIyBhbmQgc3RvcmUgaXQgaW4gdGhlIGFwcHJvcHJpYXRlIHBsYWNlLgogICAgICAgIHdyYXBwZWRfc29ja2V0ID0gV3JhcHBlZFNvY2tldChzb2NrKQoKICAgICAgICAjIE5vdyB3ZSBjYW4gaGFuZHNoYWtlCiAgICAgICAgd3JhcHBlZF9zb2NrZXQuaGFuZHNoYWtlKAogICAgICAgICAgICBzZXJ2ZXJfaG9zdG5hbWUsIHNlbGYuX3ZlcmlmeSwgc2VsZi5fdHJ1c3RfYnVuZGxlLAogICAgICAgICAgICBzZWxmLl9taW5fdmVyc2lvbiwgc2VsZi5fbWF4X3ZlcnNpb24sIHNlbGYuX2NsaWVudF9jZXJ0LAogICAgICAgICAgICBzZWxmLl9jbGllbnRfa2V5LCBzZWxmLl9jbGllbnRfa2V5X3Bhc3NwaHJhc2UKICAgICAgICApCiAgICAgICAgcmV0dXJuIHdyYXBwZWRfc29ja2V0ClBLAwQUAAAAAAAAACEA0FMpmTMYAAAzGAAAQQAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9jb250cmliL3NvY2tzLnB5IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KIiIiClRoaXMgbW9kdWxlIGNvbnRhaW5zIHByb3Zpc2lvbmFsIHN1cHBvcnQgZm9yIFNPQ0tTIHByb3hpZXMgZnJvbSB3aXRoaW4KdXJsbGliMy4gVGhpcyBtb2R1bGUgc3VwcG9ydHMgU09DS1M0IChzcGVjaWZpY2FsbHkgdGhlIFNPQ0tTNEEgdmFyaWFudCkgYW5kClNPQ0tTNS4gVG8gZW5hYmxlIGl0cyBmdW5jdGlvbmFsaXR5LCBlaXRoZXIgaW5zdGFsbCBQeVNvY2tzIG9yIGluc3RhbGwgdGhpcwptb2R1bGUgd2l0aCB0aGUgYGBzb2Nrc2BgIGV4dHJhLgoKVGhlIFNPQ0tTIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIHRoZSBmdWxsIHJhbmdlIG9mIHVybGxpYjMgZmVhdHVyZXMuIEl0IGFsc28Kc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBTT0NLUyBmZWF0dXJlczoKCi0gU09DS1M0Ci0gU09DS1M0YQotIFNPQ0tTNQotIFVzZXJuYW1lcyBhbmQgcGFzc3dvcmRzIGZvciB0aGUgU09DS1MgcHJveHkKCktub3duIExpbWl0YXRpb25zOgoKLSBDdXJyZW50bHkgUHlTb2NrcyBkb2VzIG5vdCBzdXBwb3J0IGNvbnRhY3RpbmcgcmVtb3RlIHdlYnNpdGVzIHZpYSBsaXRlcmFsCiAgSVB2NiBhZGRyZXNzZXMuIEFueSBzdWNoIGNvbm5lY3Rpb24gYXR0ZW1wdCB3aWxsIGZhaWwuIFlvdSBtdXN0IHVzZSBhIGRvbWFpbgogIG5hbWUuCi0gQ3VycmVudGx5IFB5U29ja3MgZG9lcyBub3Qgc3VwcG9ydCBJUHY2IGNvbm5lY3Rpb25zIHRvIHRoZSBTT0NLUyBwcm94eS4gQW55CiAgc3VjaCBjb25uZWN0aW9uIGF0dGVtcHQgd2lsbCBmYWlsLgoiIiIKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCnRyeToKICAgIGltcG9ydCBzb2NrcwpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBpbXBvcnQgd2FybmluZ3MKICAgIGZyb20gLi5leGNlcHRpb25zIGltcG9ydCBEZXBlbmRlbmN5V2FybmluZwoKICAgIHdhcm5pbmdzLndhcm4oKAogICAgICAgICdTT0NLUyBzdXBwb3J0IGluIHVybGxpYjMgcmVxdWlyZXMgdGhlIGluc3RhbGxhdGlvbiBvZiBvcHRpb25hbCAnCiAgICAgICAgJ2RlcGVuZGVuY2llczogc3BlY2lmaWNhbGx5LCBQeVNvY2tzLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSAnCiAgICAgICAgJ2h0dHBzOi8vdXJsbGliMy5yZWFkdGhlZG9jcy5pby9lbi9sYXRlc3QvY29udHJpYi5odG1sI3NvY2tzLXByb3hpZXMnCiAgICAgICAgKSwKICAgICAgICBEZXBlbmRlbmN5V2FybmluZwogICAgKQogICAgcmFpc2UKCmZyb20gc29ja2V0IGltcG9ydCBlcnJvciBhcyBTb2NrZXRFcnJvciwgdGltZW91dCBhcyBTb2NrZXRUaW1lb3V0Cgpmcm9tIC4uY29ubmVjdGlvbiBpbXBvcnQgKAogICAgSFRUUENvbm5lY3Rpb24sIEhUVFBTQ29ubmVjdGlvbgopCmZyb20gLi5jb25uZWN0aW9ucG9vbCBpbXBvcnQgKAogICAgSFRUUENvbm5lY3Rpb25Qb29sLCBIVFRQU0Nvbm5lY3Rpb25Qb29sCikKZnJvbSAuLmV4Y2VwdGlvbnMgaW1wb3J0IENvbm5lY3RUaW1lb3V0RXJyb3IsIE5ld0Nvbm5lY3Rpb25FcnJvcgpmcm9tIC4ucG9vbG1hbmFnZXIgaW1wb3J0IFBvb2xNYW5hZ2VyCmZyb20gLi51dGlsLnVybCBpbXBvcnQgcGFyc2VfdXJsCgp0cnk6CiAgICBpbXBvcnQgc3NsCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIHNzbCA9IE5vbmUKCgpjbGFzcyBTT0NLU0Nvbm5lY3Rpb24oSFRUUENvbm5lY3Rpb24pOgogICAgIiIiCiAgICBBIHBsYWluLXRleHQgSFRUUCBjb25uZWN0aW9uIHRoYXQgY29ubmVjdHMgdmlhIGEgU09DS1MgcHJveHkuCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgIHNlbGYuX3NvY2tzX29wdGlvbnMgPSBrd2FyZ3MucG9wKCdfc29ja3Nfb3B0aW9ucycpCiAgICAgICAgc3VwZXIoU09DS1NDb25uZWN0aW9uLCBzZWxmKS5fX2luaXRfXygqYXJncywgKiprd2FyZ3MpCgogICAgZGVmIF9uZXdfY29ubihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBFc3RhYmxpc2ggYSBuZXcgY29ubmVjdGlvbiB2aWEgdGhlIFNPQ0tTIHByb3h5LgogICAgICAgICIiIgogICAgICAgIGV4dHJhX2t3ID0ge30KICAgICAgICBpZiBzZWxmLnNvdXJjZV9hZGRyZXNzOgogICAgICAgICAgICBleHRyYV9rd1snc291cmNlX2FkZHJlc3MnXSA9IHNlbGYuc291cmNlX2FkZHJlc3MKCiAgICAgICAgaWYgc2VsZi5zb2NrZXRfb3B0aW9uczoKICAgICAgICAgICAgZXh0cmFfa3dbJ3NvY2tldF9vcHRpb25zJ10gPSBzZWxmLnNvY2tldF9vcHRpb25zCgogICAgICAgIHRyeToKICAgICAgICAgICAgY29ubiA9IHNvY2tzLmNyZWF0ZV9jb25uZWN0aW9uKAogICAgICAgICAgICAgICAgKHNlbGYuaG9zdCwgc2VsZi5wb3J0KSwKICAgICAgICAgICAgICAgIHByb3h5X3R5cGU9c2VsZi5fc29ja3Nfb3B0aW9uc1snc29ja3NfdmVyc2lvbiddLAogICAgICAgICAgICAgICAgcHJveHlfYWRkcj1zZWxmLl9zb2Nrc19vcHRpb25zWydwcm94eV9ob3N0J10sCiAgICAgICAgICAgICAgICBwcm94eV9wb3J0PXNlbGYuX3NvY2tzX29wdGlvbnNbJ3Byb3h5X3BvcnQnXSwKICAgICAgICAgICAgICAgIHByb3h5X3VzZXJuYW1lPXNlbGYuX3NvY2tzX29wdGlvbnNbJ3VzZXJuYW1lJ10sCiAgICAgICAgICAgICAgICBwcm94eV9wYXNzd29yZD1zZWxmLl9zb2Nrc19vcHRpb25zWydwYXNzd29yZCddLAogICAgICAgICAgICAgICAgcHJveHlfcmRucz1zZWxmLl9zb2Nrc19vcHRpb25zWydyZG5zJ10sCiAgICAgICAgICAgICAgICB0aW1lb3V0PXNlbGYudGltZW91dCwKICAgICAgICAgICAgICAgICoqZXh0cmFfa3cKICAgICAgICAgICAgKQoKICAgICAgICBleGNlcHQgU29ja2V0VGltZW91dCBhcyBlOgogICAgICAgICAgICByYWlzZSBDb25uZWN0VGltZW91dEVycm9yKAogICAgICAgICAgICAgICAgc2VsZiwgIkNvbm5lY3Rpb24gdG8gJXMgdGltZWQgb3V0LiAoY29ubmVjdCB0aW1lb3V0PSVzKSIgJQogICAgICAgICAgICAgICAgKHNlbGYuaG9zdCwgc2VsZi50aW1lb3V0KSkKCiAgICAgICAgZXhjZXB0IHNvY2tzLlByb3h5RXJyb3IgYXMgZToKICAgICAgICAgICAgIyBUaGlzIGlzIGZyYWdpbGUgYXMgaGVsbCwgYnV0IGl0IHNlZW1zIHRvIGJlIHRoZSBvbmx5IHdheSB0byByYWlzZQogICAgICAgICAgICAjIHVzZWZ1bCBlcnJvcnMgaGVyZS4KICAgICAgICAgICAgaWYgZS5zb2NrZXRfZXJyOgogICAgICAgICAgICAgICAgZXJyb3IgPSBlLnNvY2tldF9lcnIKICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXJyb3IsIFNvY2tldFRpbWVvdXQpOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIENvbm5lY3RUaW1lb3V0RXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYsCiAgICAgICAgICAgICAgICAgICAgICAgICJDb25uZWN0aW9uIHRvICVzIHRpbWVkIG91dC4gKGNvbm5lY3QgdGltZW91dD0lcykiICUKICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYuaG9zdCwgc2VsZi50aW1lb3V0KQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgTmV3Q29ubmVjdGlvbkVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLAogICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGVzdGFibGlzaCBhIG5ldyBjb25uZWN0aW9uOiAlcyIgJSBlcnJvcgogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJhaXNlIE5ld0Nvbm5lY3Rpb25FcnJvcigKICAgICAgICAgICAgICAgICAgICBzZWxmLAogICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZXN0YWJsaXNoIGEgbmV3IGNvbm5lY3Rpb246ICVzIiAlIGUKICAgICAgICAgICAgICAgICkKCiAgICAgICAgZXhjZXB0IFNvY2tldEVycm9yIGFzIGU6ICAjIERlZmVuc2l2ZTogUHlTb2NrcyBzaG91bGQgY2F0Y2ggYWxsIHRoZXNlLgogICAgICAgICAgICByYWlzZSBOZXdDb25uZWN0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICBzZWxmLCAiRmFpbGVkIHRvIGVzdGFibGlzaCBhIG5ldyBjb25uZWN0aW9uOiAlcyIgJSBlKQoKICAgICAgICByZXR1cm4gY29ubgoKCiMgV2UgZG9uJ3QgbmVlZCB0byBkdXBsaWNhdGUgdGhlIFZlcmlmaWVkL1VudmVyaWZpZWQgZGlzdGluY3Rpb24gZnJvbQojIHVybGxpYjMvY29ubmVjdGlvbi5weSBoZXJlIGJlY2F1c2UgdGhlIEhUVFBTQ29ubmVjdGlvbiB3aWxsIGFscmVhZHkgaGF2ZSBiZWVuCiMgY29ycmVjdGx5IHNldCB0byBlaXRoZXIgdGhlIFZlcmlmaWVkIG9yIFVudmVyaWZpZWQgZm9ybSBieSB0aGF0IG1vZHVsZS4gVGhpcwojIG1lYW5zIHRoZSBTT0NLU0hUVFBTQ29ubmVjdGlvbiB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgdGhlIGNvcnJlY3QgdHlwZS4KY2xhc3MgU09DS1NIVFRQU0Nvbm5lY3Rpb24oU09DS1NDb25uZWN0aW9uLCBIVFRQU0Nvbm5lY3Rpb24pOgogICAgcGFzcwoKCmNsYXNzIFNPQ0tTSFRUUENvbm5lY3Rpb25Qb29sKEhUVFBDb25uZWN0aW9uUG9vbCk6CiAgICBDb25uZWN0aW9uQ2xzID0gU09DS1NDb25uZWN0aW9uCgoKY2xhc3MgU09DS1NIVFRQU0Nvbm5lY3Rpb25Qb29sKEhUVFBTQ29ubmVjdGlvblBvb2wpOgogICAgQ29ubmVjdGlvbkNscyA9IFNPQ0tTSFRUUFNDb25uZWN0aW9uCgoKY2xhc3MgU09DS1NQcm94eU1hbmFnZXIoUG9vbE1hbmFnZXIpOgogICAgIiIiCiAgICBBIHZlcnNpb24gb2YgdGhlIHVybGxpYjMgUHJveHlNYW5hZ2VyIHRoYXQgcm91dGVzIGNvbm5lY3Rpb25zIHZpYSB0aGUKICAgIGRlZmluZWQgU09DS1MgcHJveHkuCiAgICAiIiIKICAgIHBvb2xfY2xhc3Nlc19ieV9zY2hlbWUgPSB7CiAgICAgICAgJ2h0dHAnOiBTT0NLU0hUVFBDb25uZWN0aW9uUG9vbCwKICAgICAgICAnaHR0cHMnOiBTT0NLU0hUVFBTQ29ubmVjdGlvblBvb2wsCiAgICB9CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHByb3h5X3VybCwgdXNlcm5hbWU9Tm9uZSwgcGFzc3dvcmQ9Tm9uZSwKICAgICAgICAgICAgICAgICBudW1fcG9vbHM9MTAsIGhlYWRlcnM9Tm9uZSwgKipjb25uZWN0aW9uX3Bvb2xfa3cpOgogICAgICAgIHBhcnNlZCA9IHBhcnNlX3VybChwcm94eV91cmwpCgogICAgICAgIGlmIHBhcnNlZC5zY2hlbWUgPT0gJ3NvY2tzNSc6CiAgICAgICAgICAgIHNvY2tzX3ZlcnNpb24gPSBzb2Nrcy5QUk9YWV9UWVBFX1NPQ0tTNQogICAgICAgICAgICByZG5zID0gRmFsc2UKICAgICAgICBlbGlmIHBhcnNlZC5zY2hlbWUgPT0gJ3NvY2tzNWgnOgogICAgICAgICAgICBzb2Nrc192ZXJzaW9uID0gc29ja3MuUFJPWFlfVFlQRV9TT0NLUzUKICAgICAgICAgICAgcmRucyA9IFRydWUKICAgICAgICBlbGlmIHBhcnNlZC5zY2hlbWUgPT0gJ3NvY2tzNCc6CiAgICAgICAgICAgIHNvY2tzX3ZlcnNpb24gPSBzb2Nrcy5QUk9YWV9UWVBFX1NPQ0tTNAogICAgICAgICAgICByZG5zID0gRmFsc2UKICAgICAgICBlbGlmIHBhcnNlZC5zY2hlbWUgPT0gJ3NvY2tzNGEnOgogICAgICAgICAgICBzb2Nrc192ZXJzaW9uID0gc29ja3MuUFJPWFlfVFlQRV9TT0NLUzQKICAgICAgICAgICAgcmRucyA9IFRydWUKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAogICAgICAgICAgICAgICAgIlVuYWJsZSB0byBkZXRlcm1pbmUgU09DS1MgdmVyc2lvbiBmcm9tICVzIiAlIHByb3h5X3VybAogICAgICAgICAgICApCgogICAgICAgIHNlbGYucHJveHlfdXJsID0gcHJveHlfdXJsCgogICAgICAgIHNvY2tzX29wdGlvbnMgPSB7CiAgICAgICAgICAgICdzb2Nrc192ZXJzaW9uJzogc29ja3NfdmVyc2lvbiwKICAgICAgICAgICAgJ3Byb3h5X2hvc3QnOiBwYXJzZWQuaG9zdCwKICAgICAgICAgICAgJ3Byb3h5X3BvcnQnOiBwYXJzZWQucG9ydCwKICAgICAgICAgICAgJ3VzZXJuYW1lJzogdXNlcm5hbWUsCiAgICAgICAgICAgICdwYXNzd29yZCc6IHBhc3N3b3JkLAogICAgICAgICAgICAncmRucyc6IHJkbnMKICAgICAgICB9CiAgICAgICAgY29ubmVjdGlvbl9wb29sX2t3Wydfc29ja3Nfb3B0aW9ucyddID0gc29ja3Nfb3B0aW9ucwoKICAgICAgICBzdXBlcihTT0NLU1Byb3h5TWFuYWdlciwgc2VsZikuX19pbml0X18oCiAgICAgICAgICAgIG51bV9wb29scywgaGVhZGVycywgKipjb25uZWN0aW9uX3Bvb2xfa3cKICAgICAgICApCgogICAgICAgIHNlbGYucG9vbF9jbGFzc2VzX2J5X3NjaGVtZSA9IFNPQ0tTUHJveHlNYW5hZ2VyLnBvb2xfY2xhc3Nlc19ieV9zY2hlbWUKUEsDBBQAAAAAAAAAIQDymskDyxkAAMsZAAA+AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL2V4Y2VwdGlvbnMucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydApmcm9tIC5wYWNrYWdlcy5zaXgubW92ZXMuaHR0cF9jbGllbnQgaW1wb3J0ICgKICAgIEluY29tcGxldGVSZWFkIGFzIGh0dHBsaWJfSW5jb21wbGV0ZVJlYWQKKQojIEJhc2UgRXhjZXB0aW9ucwoKCmNsYXNzIEhUVFBFcnJvcihFeGNlcHRpb24pOgogICAgIkJhc2UgZXhjZXB0aW9uIHVzZWQgYnkgdGhpcyBtb2R1bGUuIgogICAgcGFzcwoKCmNsYXNzIEhUVFBXYXJuaW5nKFdhcm5pbmcpOgogICAgIkJhc2Ugd2FybmluZyB1c2VkIGJ5IHRoaXMgbW9kdWxlLiIKICAgIHBhc3MKCgpjbGFzcyBQb29sRXJyb3IoSFRUUEVycm9yKToKICAgICJCYXNlIGV4Y2VwdGlvbiBmb3IgZXJyb3JzIGNhdXNlZCB3aXRoaW4gYSBwb29sLiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwb29sLCBtZXNzYWdlKToKICAgICAgICBzZWxmLnBvb2wgPSBwb29sCiAgICAgICAgSFRUUEVycm9yLl9faW5pdF9fKHNlbGYsICIlczogJXMiICUgKHBvb2wsIG1lc3NhZ2UpKQoKICAgIGRlZiBfX3JlZHVjZV9fKHNlbGYpOgogICAgICAgICMgRm9yIHBpY2tsaW5nIHB1cnBvc2VzLgogICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXywgKE5vbmUsIE5vbmUpCgoKY2xhc3MgUmVxdWVzdEVycm9yKFBvb2xFcnJvcik6CiAgICAiQmFzZSBleGNlcHRpb24gZm9yIFBvb2xFcnJvcnMgdGhhdCBoYXZlIGFzc29jaWF0ZWQgVVJMcy4iCiAgICBkZWYgX19pbml0X18oc2VsZiwgcG9vbCwgdXJsLCBtZXNzYWdlKToKICAgICAgICBzZWxmLnVybCA9IHVybAogICAgICAgIFBvb2xFcnJvci5fX2luaXRfXyhzZWxmLCBwb29sLCBtZXNzYWdlKQoKICAgIGRlZiBfX3JlZHVjZV9fKHNlbGYpOgogICAgICAgICMgRm9yIHBpY2tsaW5nIHB1cnBvc2VzLgogICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXywgKE5vbmUsIHNlbGYudXJsLCBOb25lKQoKCmNsYXNzIFNTTEVycm9yKEhUVFBFcnJvcik6CiAgICAiUmFpc2VkIHdoZW4gU1NMIGNlcnRpZmljYXRlIGZhaWxzIGluIGFuIEhUVFBTIGNvbm5lY3Rpb24uIgogICAgcGFzcwoKCmNsYXNzIFByb3h5RXJyb3IoSFRUUEVycm9yKToKICAgICJSYWlzZWQgd2hlbiB0aGUgY29ubmVjdGlvbiB0byBhIHByb3h5IGZhaWxzLiIKICAgIHBhc3MKCgpjbGFzcyBEZWNvZGVFcnJvcihIVFRQRXJyb3IpOgogICAgIlJhaXNlZCB3aGVuIGF1dG9tYXRpYyBkZWNvZGluZyBiYXNlZCBvbiBDb250ZW50LVR5cGUgZmFpbHMuIgogICAgcGFzcwoKCmNsYXNzIFByb3RvY29sRXJyb3IoSFRUUEVycm9yKToKICAgICJSYWlzZWQgd2hlbiBzb21ldGhpbmcgdW5leHBlY3RlZCBoYXBwZW5zIG1pZC1yZXF1ZXN0L3Jlc3BvbnNlLiIKICAgIHBhc3MKCgojOiBSZW5hbWVkIHRvIFByb3RvY29sRXJyb3IgYnV0IGFsaWFzZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgpDb25uZWN0aW9uRXJyb3IgPSBQcm90b2NvbEVycm9yCgoKIyBMZWFmIEV4Y2VwdGlvbnMKCmNsYXNzIE1heFJldHJ5RXJyb3IoUmVxdWVzdEVycm9yKToKICAgICIiIlJhaXNlZCB3aGVuIHRoZSBtYXhpbXVtIG51bWJlciBvZiByZXRyaWVzIGlzIGV4Y2VlZGVkLgoKICAgIDpwYXJhbSBwb29sOiBUaGUgY29ubmVjdGlvbiBwb29sCiAgICA6dHlwZSBwb29sOiA6Y2xhc3M6YH51cmxsaWIzLmNvbm5lY3Rpb25wb29sLkhUVFBDb25uZWN0aW9uUG9vbGAKICAgIDpwYXJhbSBzdHJpbmcgdXJsOiBUaGUgcmVxdWVzdGVkIFVybAogICAgOnBhcmFtIGV4Y2VwdGlvbnMuRXhjZXB0aW9uIHJlYXNvbjogVGhlIHVuZGVybHlpbmcgZXJyb3IKCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgcG9vbCwgdXJsLCByZWFzb249Tm9uZSk6CiAgICAgICAgc2VsZi5yZWFzb24gPSByZWFzb24KCiAgICAgICAgbWVzc2FnZSA9ICJNYXggcmV0cmllcyBleGNlZWRlZCB3aXRoIHVybDogJXMgKENhdXNlZCBieSAlcikiICUgKAogICAgICAgICAgICB1cmwsIHJlYXNvbikKCiAgICAgICAgUmVxdWVzdEVycm9yLl9faW5pdF9fKHNlbGYsIHBvb2wsIHVybCwgbWVzc2FnZSkKCgpjbGFzcyBIb3N0Q2hhbmdlZEVycm9yKFJlcXVlc3RFcnJvcik6CiAgICAiUmFpc2VkIHdoZW4gYW4gZXhpc3RpbmcgcG9vbCBnZXRzIGEgcmVxdWVzdCBmb3IgYSBmb3JlaWduIGhvc3QuIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwb29sLCB1cmwsIHJldHJpZXM9Myk6CiAgICAgICAgbWVzc2FnZSA9ICJUcmllZCB0byBvcGVuIGEgZm9yZWlnbiBob3N0IHdpdGggdXJsOiAlcyIgJSB1cmwKICAgICAgICBSZXF1ZXN0RXJyb3IuX19pbml0X18oc2VsZiwgcG9vbCwgdXJsLCBtZXNzYWdlKQogICAgICAgIHNlbGYucmV0cmllcyA9IHJldHJpZXMKCgpjbGFzcyBUaW1lb3V0U3RhdGVFcnJvcihIVFRQRXJyb3IpOgogICAgIiIiIFJhaXNlZCB3aGVuIHBhc3NpbmcgYW4gaW52YWxpZCBzdGF0ZSB0byBhIHRpbWVvdXQgIiIiCiAgICBwYXNzCgoKY2xhc3MgVGltZW91dEVycm9yKEhUVFBFcnJvcik6CiAgICAiIiIgUmFpc2VkIHdoZW4gYSBzb2NrZXQgdGltZW91dCBlcnJvciBvY2N1cnMuCgogICAgQ2F0Y2hpbmcgdGhpcyBlcnJvciB3aWxsIGNhdGNoIGJvdGggOmV4YzpgUmVhZFRpbWVvdXRFcnJvcnMKICAgIDxSZWFkVGltZW91dEVycm9yPmAgYW5kIDpleGM6YENvbm5lY3RUaW1lb3V0RXJyb3JzIDxDb25uZWN0VGltZW91dEVycm9yPmAuCiAgICAiIiIKICAgIHBhc3MKCgpjbGFzcyBSZWFkVGltZW91dEVycm9yKFRpbWVvdXRFcnJvciwgUmVxdWVzdEVycm9yKToKICAgICJSYWlzZWQgd2hlbiBhIHNvY2tldCB0aW1lb3V0IG9jY3VycyB3aGlsZSByZWNlaXZpbmcgZGF0YSBmcm9tIGEgc2VydmVyIgogICAgcGFzcwoKCiMgVGhpcyB0aW1lb3V0IGVycm9yIGRvZXMgbm90IGhhdmUgYSBVUkwgYXR0YWNoZWQgYW5kIG5lZWRzIHRvIGluaGVyaXQgZnJvbSB0aGUKIyBiYXNlIEhUVFBFcnJvcgpjbGFzcyBDb25uZWN0VGltZW91dEVycm9yKFRpbWVvdXRFcnJvcik6CiAgICAiUmFpc2VkIHdoZW4gYSBzb2NrZXQgdGltZW91dCBvY2N1cnMgd2hpbGUgY29ubmVjdGluZyB0byBhIHNlcnZlciIKICAgIHBhc3MKCgpjbGFzcyBOZXdDb25uZWN0aW9uRXJyb3IoQ29ubmVjdFRpbWVvdXRFcnJvciwgUG9vbEVycm9yKToKICAgICJSYWlzZWQgd2hlbiB3ZSBmYWlsIHRvIGVzdGFibGlzaCBhIG5ldyBjb25uZWN0aW9uLiBVc3VhbGx5IEVDT05OUkVGVVNFRC4iCiAgICBwYXNzCgoKY2xhc3MgRW1wdHlQb29sRXJyb3IoUG9vbEVycm9yKToKICAgICJSYWlzZWQgd2hlbiBhIHBvb2wgcnVucyBvdXQgb2YgY29ubmVjdGlvbnMgYW5kIG5vIG1vcmUgYXJlIGFsbG93ZWQuIgogICAgcGFzcwoKCmNsYXNzIENsb3NlZFBvb2xFcnJvcihQb29sRXJyb3IpOgogICAgIlJhaXNlZCB3aGVuIGEgcmVxdWVzdCBlbnRlcnMgYSBwb29sIGFmdGVyIHRoZSBwb29sIGhhcyBiZWVuIGNsb3NlZC4iCiAgICBwYXNzCgoKY2xhc3MgTG9jYXRpb25WYWx1ZUVycm9yKFZhbHVlRXJyb3IsIEhUVFBFcnJvcik6CiAgICAiUmFpc2VkIHdoZW4gdGhlcmUgaXMgc29tZXRoaW5nIHdyb25nIHdpdGggYSBnaXZlbiBVUkwgaW5wdXQuIgogICAgcGFzcwoKCmNsYXNzIExvY2F0aW9uUGFyc2VFcnJvcihMb2NhdGlvblZhbHVlRXJyb3IpOgogICAgIlJhaXNlZCB3aGVuIGdldF9ob3N0IG9yIHNpbWlsYXIgZmFpbHMgdG8gcGFyc2UgdGhlIFVSTCBpbnB1dC4iCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGxvY2F0aW9uKToKICAgICAgICBtZXNzYWdlID0gIkZhaWxlZCB0byBwYXJzZTogJXMiICUgbG9jYXRpb24KICAgICAgICBIVFRQRXJyb3IuX19pbml0X18oc2VsZiwgbWVzc2FnZSkKCiAgICAgICAgc2VsZi5sb2NhdGlvbiA9IGxvY2F0aW9uCgoKY2xhc3MgUmVzcG9uc2VFcnJvcihIVFRQRXJyb3IpOgogICAgIlVzZWQgYXMgYSBjb250YWluZXIgZm9yIGFuIGVycm9yIHJlYXNvbiBzdXBwbGllZCBpbiBhIE1heFJldHJ5RXJyb3IuIgogICAgR0VORVJJQ19FUlJPUiA9ICd0b28gbWFueSBlcnJvciByZXNwb25zZXMnCiAgICBTUEVDSUZJQ19FUlJPUiA9ICd0b28gbWFueSB7c3RhdHVzX2NvZGV9IGVycm9yIHJlc3BvbnNlcycKCgpjbGFzcyBTZWN1cml0eVdhcm5pbmcoSFRUUFdhcm5pbmcpOgogICAgIldhcm5lZCB3aGVuIHBlcmZvbWluZyBzZWN1cml0eSByZWR1Y2luZyBhY3Rpb25zIgogICAgcGFzcwoKCmNsYXNzIFN1YmplY3RBbHROYW1lV2FybmluZyhTZWN1cml0eVdhcm5pbmcpOgogICAgIldhcm5lZCB3aGVuIGNvbm5lY3RpbmcgdG8gYSBob3N0IHdpdGggYSBjZXJ0aWZpY2F0ZSBtaXNzaW5nIGEgU0FOLiIKICAgIHBhc3MKCgpjbGFzcyBJbnNlY3VyZVJlcXVlc3RXYXJuaW5nKFNlY3VyaXR5V2FybmluZyk6CiAgICAiV2FybmVkIHdoZW4gbWFraW5nIGFuIHVudmVyaWZpZWQgSFRUUFMgcmVxdWVzdC4iCiAgICBwYXNzCgoKY2xhc3MgU3lzdGVtVGltZVdhcm5pbmcoU2VjdXJpdHlXYXJuaW5nKToKICAgICJXYXJuZWQgd2hlbiBzeXN0ZW0gdGltZSBpcyBzdXNwZWN0ZWQgdG8gYmUgd3JvbmciCiAgICBwYXNzCgoKY2xhc3MgSW5zZWN1cmVQbGF0Zm9ybVdhcm5pbmcoU2VjdXJpdHlXYXJuaW5nKToKICAgICJXYXJuZWQgd2hlbiBjZXJ0YWluIFNTTCBjb25maWd1cmF0aW9uIGlzIG5vdCBhdmFpbGFibGUgb24gYSBwbGF0Zm9ybS4iCiAgICBwYXNzCgoKY2xhc3MgU05JTWlzc2luZ1dhcm5pbmcoSFRUUFdhcm5pbmcpOgogICAgIldhcm5lZCB3aGVuIG1ha2luZyBhIEhUVFBTIHJlcXVlc3Qgd2l0aG91dCBTTkkgYXZhaWxhYmxlLiIKICAgIHBhc3MKCgpjbGFzcyBEZXBlbmRlbmN5V2FybmluZyhIVFRQV2FybmluZyk6CiAgICAiIiIKICAgIFdhcm5lZCB3aGVuIGFuIGF0dGVtcHQgaXMgbWFkZSB0byBpbXBvcnQgYSBtb2R1bGUgd2l0aCBtaXNzaW5nIG9wdGlvbmFsCiAgICBkZXBlbmRlbmNpZXMuCiAgICAiIiIKICAgIHBhc3MKCgpjbGFzcyBSZXNwb25zZU5vdENodW5rZWQoUHJvdG9jb2xFcnJvciwgVmFsdWVFcnJvcik6CiAgICAiUmVzcG9uc2UgbmVlZHMgdG8gYmUgY2h1bmtlZCBpbiBvcmRlciB0byByZWFkIGl0IGFzIGNodW5rcy4iCiAgICBwYXNzCgoKY2xhc3MgQm9keU5vdEh0dHBsaWJDb21wYXRpYmxlKEhUVFBFcnJvcik6CiAgICAiIiIKICAgIEJvZHkgc2hvdWxkIGJlIGh0dHBsaWIuSFRUUFJlc3BvbnNlIGxpa2UgKGhhdmUgYW4gZnAgYXR0cmlidXRlIHdoaWNoCiAgICByZXR1cm5zIHJhdyBjaHVua3MpIGZvciByZWFkX2NodW5rZWQoKS4KICAgICIiIgogICAgcGFzcwoKCmNsYXNzIEluY29tcGxldGVSZWFkKEhUVFBFcnJvciwgaHR0cGxpYl9JbmNvbXBsZXRlUmVhZCk6CiAgICAiIiIKICAgIFJlc3BvbnNlIGxlbmd0aCBkb2Vzbid0IG1hdGNoIGV4cGVjdGVkIENvbnRlbnQtTGVuZ3RoCgogICAgU3ViY2xhc3Mgb2YgaHR0cF9jbGllbnQuSW5jb21wbGV0ZVJlYWQgdG8gYWxsb3cgaW50IHZhbHVlCiAgICBmb3IgYHBhcnRpYWxgIHRvIGF2b2lkIGNyZWF0aW5nIGxhcmdlIG9iamVjdHMgb24gc3RyZWFtZWQKICAgIHJlYWRzLgogICAgIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgcGFydGlhbCwgZXhwZWN0ZWQpOgogICAgICAgIHN1cGVyKEluY29tcGxldGVSZWFkLCBzZWxmKS5fX2luaXRfXyhwYXJ0aWFsLCBleHBlY3RlZCkKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICgnSW5jb21wbGV0ZVJlYWQoJWkgYnl0ZXMgcmVhZCwgJwogICAgICAgICAgICAgICAgJyVpIG1vcmUgZXhwZWN0ZWQpJyAlIChzZWxmLnBhcnRpYWwsIHNlbGYuZXhwZWN0ZWQpKQoKCmNsYXNzIEludmFsaWRIZWFkZXIoSFRUUEVycm9yKToKICAgICJUaGUgaGVhZGVyIHByb3ZpZGVkIHdhcyBzb21laG93IGludmFsaWQuIgogICAgcGFzcwoKCmNsYXNzIFByb3h5U2NoZW1lVW5rbm93bihBc3NlcnRpb25FcnJvciwgVmFsdWVFcnJvcik6CiAgICAiUHJveHlNYW5hZ2VyIGRvZXMgbm90IHN1cHBvcnQgdGhlIHN1cHBsaWVkIHNjaGVtZSIKICAgICMgVE9ETyh0LThjaCk6IFN0b3AgaW5oZXJpdGluZyBmcm9tIEFzc2VydGlvbkVycm9yIGluIHYyLjAuCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHNjaGVtZSk6CiAgICAgICAgbWVzc2FnZSA9ICJOb3Qgc3VwcG9ydGVkIHByb3h5IHNjaGVtZSAlcyIgJSBzY2hlbWUKICAgICAgICBzdXBlcihQcm94eVNjaGVtZVVua25vd24sIHNlbGYpLl9faW5pdF9fKG1lc3NhZ2UpCgoKY2xhc3MgSGVhZGVyUGFyc2luZ0Vycm9yKEhUVFBFcnJvcik6CiAgICAiUmFpc2VkIGJ5IGFzc2VydF9oZWFkZXJfcGFyc2luZywgYnV0IHdlIGNvbnZlcnQgaXQgdG8gYSBsb2cud2FybmluZyBzdGF0ZW1lbnQuIgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGRlZmVjdHMsIHVucGFyc2VkX2RhdGEpOgogICAgICAgIG1lc3NhZ2UgPSAnJXMsIHVucGFyc2VkIGRhdGE6ICVyJyAlIChkZWZlY3RzIG9yICdVbmtub3duJywgdW5wYXJzZWRfZGF0YSkKICAgICAgICBzdXBlcihIZWFkZXJQYXJzaW5nRXJyb3IsIHNlbGYpLl9faW5pdF9fKG1lc3NhZ2UpCgoKY2xhc3MgVW5yZXdpbmRhYmxlQm9keUVycm9yKEhUVFBFcnJvcik6CiAgICAidXJsbGliMyBlbmNvdW50ZXJlZCBhbiBlcnJvciB3aGVuIHRyeWluZyB0byByZXdpbmQgYSBib2R5IgogICAgcGFzcwpQSwMEFAAAAAAAAAAhAAE5jLI3FwAANxcAADoAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvZmllbGRzLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKaW1wb3J0IGVtYWlsLnV0aWxzCmltcG9ydCBtaW1ldHlwZXMKCmZyb20gLnBhY2thZ2VzIGltcG9ydCBzaXgKCgpkZWYgZ3Vlc3NfY29udGVudF90eXBlKGZpbGVuYW1lLCBkZWZhdWx0PSdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nKToKICAgICIiIgogICAgR3Vlc3MgdGhlICJDb250ZW50LVR5cGUiIG9mIGEgZmlsZS4KCiAgICA6cGFyYW0gZmlsZW5hbWU6CiAgICAgICAgVGhlIGZpbGVuYW1lIHRvIGd1ZXNzIHRoZSAiQ29udGVudC1UeXBlIiBvZiB1c2luZyA6bW9kOmBtaW1ldHlwZXNgLgogICAgOnBhcmFtIGRlZmF1bHQ6CiAgICAgICAgSWYgbm8gIkNvbnRlbnQtVHlwZSIgY2FuIGJlIGd1ZXNzZWQsIGRlZmF1bHQgdG8gYGRlZmF1bHRgLgogICAgIiIiCiAgICBpZiBmaWxlbmFtZToKICAgICAgICByZXR1cm4gbWltZXR5cGVzLmd1ZXNzX3R5cGUoZmlsZW5hbWUpWzBdIG9yIGRlZmF1bHQKICAgIHJldHVybiBkZWZhdWx0CgoKZGVmIGZvcm1hdF9oZWFkZXJfcGFyYW0obmFtZSwgdmFsdWUpOgogICAgIiIiCiAgICBIZWxwZXIgZnVuY3Rpb24gdG8gZm9ybWF0IGFuZCBxdW90ZSBhIHNpbmdsZSBoZWFkZXIgcGFyYW1ldGVyLgoKICAgIFBhcnRpY3VsYXJseSB1c2VmdWwgZm9yIGhlYWRlciBwYXJhbWV0ZXJzIHdoaWNoIG1pZ2h0IGNvbnRhaW4KICAgIG5vbi1BU0NJSSB2YWx1ZXMsIGxpa2UgZmlsZSBuYW1lcy4gVGhpcyBmb2xsb3dzIFJGQyAyMjMxLCBhcwogICAgc3VnZ2VzdGVkIGJ5IFJGQyAyMzg4IFNlY3Rpb24gNC40LgoKICAgIDpwYXJhbSBuYW1lOgogICAgICAgIFRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIsIGEgc3RyaW5nIGV4cGVjdGVkIHRvIGJlIEFTQ0lJIG9ubHkuCiAgICA6cGFyYW0gdmFsdWU6CiAgICAgICAgVGhlIHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIsIHByb3ZpZGVkIGFzIGEgdW5pY29kZSBzdHJpbmcuCiAgICAiIiIKICAgIGlmIG5vdCBhbnkoY2ggaW4gdmFsdWUgZm9yIGNoIGluICciXFxcclxuJyk6CiAgICAgICAgcmVzdWx0ID0gJyVzPSIlcyInICUgKG5hbWUsIHZhbHVlKQogICAgICAgIHRyeToKICAgICAgICAgICAgcmVzdWx0LmVuY29kZSgnYXNjaWknKQogICAgICAgIGV4Y2VwdCAoVW5pY29kZUVuY29kZUVycm9yLCBVbmljb2RlRGVjb2RlRXJyb3IpOgogICAgICAgICAgICBwYXNzCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAogICAgaWYgbm90IHNpeC5QWTMgYW5kIGlzaW5zdGFuY2UodmFsdWUsIHNpeC50ZXh0X3R5cGUpOiAgIyBQeXRob24gMjoKICAgICAgICB2YWx1ZSA9IHZhbHVlLmVuY29kZSgndXRmLTgnKQogICAgdmFsdWUgPSBlbWFpbC51dGlscy5lbmNvZGVfcmZjMjIzMSh2YWx1ZSwgJ3V0Zi04JykKICAgIHZhbHVlID0gJyVzKj0lcycgJSAobmFtZSwgdmFsdWUpCiAgICByZXR1cm4gdmFsdWUKCgpjbGFzcyBSZXF1ZXN0RmllbGQob2JqZWN0KToKICAgICIiIgogICAgQSBkYXRhIGNvbnRhaW5lciBmb3IgcmVxdWVzdCBib2R5IHBhcmFtZXRlcnMuCgogICAgOnBhcmFtIG5hbWU6CiAgICAgICAgVGhlIG5hbWUgb2YgdGhpcyByZXF1ZXN0IGZpZWxkLgogICAgOnBhcmFtIGRhdGE6CiAgICAgICAgVGhlIGRhdGEvdmFsdWUgYm9keS4KICAgIDpwYXJhbSBmaWxlbmFtZToKICAgICAgICBBbiBvcHRpb25hbCBmaWxlbmFtZSBvZiB0aGUgcmVxdWVzdCBmaWVsZC4KICAgIDpwYXJhbSBoZWFkZXJzOgogICAgICAgIEFuIG9wdGlvbmFsIGRpY3QtbGlrZSBvYmplY3Qgb2YgaGVhZGVycyB0byBpbml0aWFsbHkgdXNlIGZvciB0aGUgZmllbGQuCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBkYXRhLCBmaWxlbmFtZT1Ob25lLCBoZWFkZXJzPU5vbmUpOgogICAgICAgIHNlbGYuX25hbWUgPSBuYW1lCiAgICAgICAgc2VsZi5fZmlsZW5hbWUgPSBmaWxlbmFtZQogICAgICAgIHNlbGYuZGF0YSA9IGRhdGEKICAgICAgICBzZWxmLmhlYWRlcnMgPSB7fQogICAgICAgIGlmIGhlYWRlcnM6CiAgICAgICAgICAgIHNlbGYuaGVhZGVycyA9IGRpY3QoaGVhZGVycykKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBmcm9tX3R1cGxlcyhjbHMsIGZpZWxkbmFtZSwgdmFsdWUpOgogICAgICAgICIiIgogICAgICAgIEEgOmNsYXNzOmB+dXJsbGliMy5maWVsZHMuUmVxdWVzdEZpZWxkYCBmYWN0b3J5IGZyb20gb2xkLXN0eWxlIHR1cGxlIHBhcmFtZXRlcnMuCgogICAgICAgIFN1cHBvcnRzIGNvbnN0cnVjdGluZyA6Y2xhc3M6YH51cmxsaWIzLmZpZWxkcy5SZXF1ZXN0RmllbGRgIGZyb20KICAgICAgICBwYXJhbWV0ZXIgb2Yga2V5L3ZhbHVlIHN0cmluZ3MgQU5EIGtleS9maWxldHVwbGUuIEEgZmlsZXR1cGxlIGlzIGEKICAgICAgICAoZmlsZW5hbWUsIGRhdGEsIE1JTUUgdHlwZSkgdHVwbGUgd2hlcmUgdGhlIE1JTUUgdHlwZSBpcyBvcHRpb25hbC4KICAgICAgICBGb3IgZXhhbXBsZTo6CgogICAgICAgICAgICAnZm9vJzogJ2JhcicsCiAgICAgICAgICAgICdmYWtlZmlsZSc6ICgnZm9vZmlsZS50eHQnLCAnY29udGVudHMgb2YgZm9vZmlsZScpLAogICAgICAgICAgICAncmVhbGZpbGUnOiAoJ2JhcmZpbGUudHh0Jywgb3BlbigncmVhbGZpbGUnKS5yZWFkKCkpLAogICAgICAgICAgICAndHlwZWRmaWxlJzogKCdiYXpmaWxlLmJpbicsIG9wZW4oJ2JhemZpbGUnKS5yZWFkKCksICdpbWFnZS9qcGVnJyksCiAgICAgICAgICAgICdub25hbWVmaWxlJzogJ2NvbnRlbnRzIG9mIG5vbmFtZWZpbGUgZmllbGQnLAoKICAgICAgICBGaWVsZCBuYW1lcyBhbmQgZmlsZW5hbWVzIG11c3QgYmUgdW5pY29kZS4KICAgICAgICAiIiIKICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCB0dXBsZSk6CiAgICAgICAgICAgIGlmIGxlbih2YWx1ZSkgPT0gMzoKICAgICAgICAgICAgICAgIGZpbGVuYW1lLCBkYXRhLCBjb250ZW50X3R5cGUgPSB2YWx1ZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgZmlsZW5hbWUsIGRhdGEgPSB2YWx1ZQogICAgICAgICAgICAgICAgY29udGVudF90eXBlID0gZ3Vlc3NfY29udGVudF90eXBlKGZpbGVuYW1lKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGZpbGVuYW1lID0gTm9uZQogICAgICAgICAgICBjb250ZW50X3R5cGUgPSBOb25lCiAgICAgICAgICAgIGRhdGEgPSB2YWx1ZQoKICAgICAgICByZXF1ZXN0X3BhcmFtID0gY2xzKGZpZWxkbmFtZSwgZGF0YSwgZmlsZW5hbWU9ZmlsZW5hbWUpCiAgICAgICAgcmVxdWVzdF9wYXJhbS5tYWtlX211bHRpcGFydChjb250ZW50X3R5cGU9Y29udGVudF90eXBlKQoKICAgICAgICByZXR1cm4gcmVxdWVzdF9wYXJhbQoKICAgIGRlZiBfcmVuZGVyX3BhcnQoc2VsZiwgbmFtZSwgdmFsdWUpOgogICAgICAgICIiIgogICAgICAgIE92ZXJyaWRhYmxlIGhlbHBlciBmdW5jdGlvbiB0byBmb3JtYXQgYSBzaW5nbGUgaGVhZGVyIHBhcmFtZXRlci4KCiAgICAgICAgOnBhcmFtIG5hbWU6CiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIsIGEgc3RyaW5nIGV4cGVjdGVkIHRvIGJlIEFTQ0lJIG9ubHkuCiAgICAgICAgOnBhcmFtIHZhbHVlOgogICAgICAgICAgICBUaGUgdmFsdWUgb2YgdGhlIHBhcmFtZXRlciwgcHJvdmlkZWQgYXMgYSB1bmljb2RlIHN0cmluZy4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gZm9ybWF0X2hlYWRlcl9wYXJhbShuYW1lLCB2YWx1ZSkKCiAgICBkZWYgX3JlbmRlcl9wYXJ0cyhzZWxmLCBoZWFkZXJfcGFydHMpOgogICAgICAgICIiIgogICAgICAgIEhlbHBlciBmdW5jdGlvbiB0byBmb3JtYXQgYW5kIHF1b3RlIGEgc2luZ2xlIGhlYWRlci4KCiAgICAgICAgVXNlZnVsIGZvciBzaW5nbGUgaGVhZGVycyB0aGF0IGFyZSBjb21wb3NlZCBvZiBtdWx0aXBsZSBpdGVtcy4gRS5nLiwKICAgICAgICAnQ29udGVudC1EaXNwb3NpdGlvbicgZmllbGRzLgoKICAgICAgICA6cGFyYW0gaGVhZGVyX3BhcnRzOgogICAgICAgICAgICBBIHNlcXVlbmNlIG9mIChrLCB2KSB0eXBsZXMgb3IgYSA6Y2xhc3M6YGRpY3RgIG9mIChrLCB2KSB0byBmb3JtYXQKICAgICAgICAgICAgYXMgYGsxPSJ2MSI7IGsyPSJ2MiI7IC4uLmAuCiAgICAgICAgIiIiCiAgICAgICAgcGFydHMgPSBbXQogICAgICAgIGl0ZXJhYmxlID0gaGVhZGVyX3BhcnRzCiAgICAgICAgaWYgaXNpbnN0YW5jZShoZWFkZXJfcGFydHMsIGRpY3QpOgogICAgICAgICAgICBpdGVyYWJsZSA9IGhlYWRlcl9wYXJ0cy5pdGVtcygpCgogICAgICAgIGZvciBuYW1lLCB2YWx1ZSBpbiBpdGVyYWJsZToKICAgICAgICAgICAgaWYgdmFsdWUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBwYXJ0cy5hcHBlbmQoc2VsZi5fcmVuZGVyX3BhcnQobmFtZSwgdmFsdWUpKQoKICAgICAgICByZXR1cm4gJzsgJy5qb2luKHBhcnRzKQoKICAgIGRlZiByZW5kZXJfaGVhZGVycyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZW5kZXJzIHRoZSBoZWFkZXJzIGZvciB0aGlzIHJlcXVlc3QgZmllbGQuCiAgICAgICAgIiIiCiAgICAgICAgbGluZXMgPSBbXQoKICAgICAgICBzb3J0X2tleXMgPSBbJ0NvbnRlbnQtRGlzcG9zaXRpb24nLCAnQ29udGVudC1UeXBlJywgJ0NvbnRlbnQtTG9jYXRpb24nXQogICAgICAgIGZvciBzb3J0X2tleSBpbiBzb3J0X2tleXM6CiAgICAgICAgICAgIGlmIHNlbGYuaGVhZGVycy5nZXQoc29ydF9rZXksIEZhbHNlKToKICAgICAgICAgICAgICAgIGxpbmVzLmFwcGVuZCgnJXM6ICVzJyAlIChzb3J0X2tleSwgc2VsZi5oZWFkZXJzW3NvcnRfa2V5XSkpCgogICAgICAgIGZvciBoZWFkZXJfbmFtZSwgaGVhZGVyX3ZhbHVlIGluIHNlbGYuaGVhZGVycy5pdGVtcygpOgogICAgICAgICAgICBpZiBoZWFkZXJfbmFtZSBub3QgaW4gc29ydF9rZXlzOgogICAgICAgICAgICAgICAgaWYgaGVhZGVyX3ZhbHVlOgogICAgICAgICAgICAgICAgICAgIGxpbmVzLmFwcGVuZCgnJXM6ICVzJyAlIChoZWFkZXJfbmFtZSwgaGVhZGVyX3ZhbHVlKSkKCiAgICAgICAgbGluZXMuYXBwZW5kKCdcclxuJykKICAgICAgICByZXR1cm4gJ1xyXG4nLmpvaW4obGluZXMpCgogICAgZGVmIG1ha2VfbXVsdGlwYXJ0KHNlbGYsIGNvbnRlbnRfZGlzcG9zaXRpb249Tm9uZSwgY29udGVudF90eXBlPU5vbmUsCiAgICAgICAgICAgICAgICAgICAgICAgY29udGVudF9sb2NhdGlvbj1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBNYWtlcyB0aGlzIHJlcXVlc3QgZmllbGQgaW50byBhIG11bHRpcGFydCByZXF1ZXN0IGZpZWxkLgoKICAgICAgICBUaGlzIG1ldGhvZCBvdmVycmlkZXMgIkNvbnRlbnQtRGlzcG9zaXRpb24iLCAiQ29udGVudC1UeXBlIiBhbmQKICAgICAgICAiQ29udGVudC1Mb2NhdGlvbiIgaGVhZGVycyB0byB0aGUgcmVxdWVzdCBwYXJhbWV0ZXIuCgogICAgICAgIDpwYXJhbSBjb250ZW50X3R5cGU6CiAgICAgICAgICAgIFRoZSAnQ29udGVudC1UeXBlJyBvZiB0aGUgcmVxdWVzdCBib2R5LgogICAgICAgIDpwYXJhbSBjb250ZW50X2xvY2F0aW9uOgogICAgICAgICAgICBUaGUgJ0NvbnRlbnQtTG9jYXRpb24nIG9mIHRoZSByZXF1ZXN0IGJvZHkuCgogICAgICAgICIiIgogICAgICAgIHNlbGYuaGVhZGVyc1snQ29udGVudC1EaXNwb3NpdGlvbiddID0gY29udGVudF9kaXNwb3NpdGlvbiBvciAnZm9ybS1kYXRhJwogICAgICAgIHNlbGYuaGVhZGVyc1snQ29udGVudC1EaXNwb3NpdGlvbiddICs9ICc7ICcuam9pbihbCiAgICAgICAgICAgICcnLCBzZWxmLl9yZW5kZXJfcGFydHMoCiAgICAgICAgICAgICAgICAoKCduYW1lJywgc2VsZi5fbmFtZSksICgnZmlsZW5hbWUnLCBzZWxmLl9maWxlbmFtZSkpCiAgICAgICAgICAgICkKICAgICAgICBdKQogICAgICAgIHNlbGYuaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSBjb250ZW50X3R5cGUKICAgICAgICBzZWxmLmhlYWRlcnNbJ0NvbnRlbnQtTG9jYXRpb24nXSA9IGNvbnRlbnRfbG9jYXRpb24KUEsDBBQAAAAAAAAAIQDXXdAXEQkAABEJAAA8AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL2ZpbGVwb3N0LnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKaW1wb3J0IGNvZGVjcwoKZnJvbSB1dWlkIGltcG9ydCB1dWlkNApmcm9tIGlvIGltcG9ydCBCeXRlc0lPCgpmcm9tIC5wYWNrYWdlcyBpbXBvcnQgc2l4CmZyb20gLnBhY2thZ2VzLnNpeCBpbXBvcnQgYgpmcm9tIC5maWVsZHMgaW1wb3J0IFJlcXVlc3RGaWVsZAoKd3JpdGVyID0gY29kZWNzLmxvb2t1cCgndXRmLTgnKVszXQoKCmRlZiBjaG9vc2VfYm91bmRhcnkoKToKICAgICIiIgogICAgT3VyIGVtYmFycmFzc2luZ2x5LXNpbXBsZSByZXBsYWNlbWVudCBmb3IgbWltZXRvb2xzLmNob29zZV9ib3VuZGFyeS4KICAgICIiIgogICAgcmV0dXJuIHV1aWQ0KCkuaGV4CgoKZGVmIGl0ZXJfZmllbGRfb2JqZWN0cyhmaWVsZHMpOgogICAgIiIiCiAgICBJdGVyYXRlIG92ZXIgZmllbGRzLgoKICAgIFN1cHBvcnRzIGxpc3Qgb2YgKGssIHYpIHR1cGxlcyBhbmQgZGljdHMsIGFuZCBsaXN0cyBvZgogICAgOmNsYXNzOmB+dXJsbGliMy5maWVsZHMuUmVxdWVzdEZpZWxkYC4KCiAgICAiIiIKICAgIGlmIGlzaW5zdGFuY2UoZmllbGRzLCBkaWN0KToKICAgICAgICBpID0gc2l4Lml0ZXJpdGVtcyhmaWVsZHMpCiAgICBlbHNlOgogICAgICAgIGkgPSBpdGVyKGZpZWxkcykKCiAgICBmb3IgZmllbGQgaW4gaToKICAgICAgICBpZiBpc2luc3RhbmNlKGZpZWxkLCBSZXF1ZXN0RmllbGQpOgogICAgICAgICAgICB5aWVsZCBmaWVsZAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHlpZWxkIFJlcXVlc3RGaWVsZC5mcm9tX3R1cGxlcygqZmllbGQpCgoKZGVmIGl0ZXJfZmllbGRzKGZpZWxkcyk6CiAgICAiIiIKICAgIC4uIGRlcHJlY2F0ZWQ6OiAxLjYKCiAgICBJdGVyYXRlIG92ZXIgZmllbGRzLgoKICAgIFRoZSBhZGRpdGlvbiBvZiA6Y2xhc3M6YH51cmxsaWIzLmZpZWxkcy5SZXF1ZXN0RmllbGRgIG1ha2VzIHRoaXMgZnVuY3Rpb24KICAgIG9ic29sZXRlLiBJbnN0ZWFkLCB1c2UgOmZ1bmM6YGl0ZXJfZmllbGRfb2JqZWN0c2AsIHdoaWNoIHJldHVybnMKICAgIDpjbGFzczpgfnVybGxpYjMuZmllbGRzLlJlcXVlc3RGaWVsZGAgb2JqZWN0cy4KCiAgICBTdXBwb3J0cyBsaXN0IG9mIChrLCB2KSB0dXBsZXMgYW5kIGRpY3RzLgogICAgIiIiCiAgICBpZiBpc2luc3RhbmNlKGZpZWxkcywgZGljdCk6CiAgICAgICAgcmV0dXJuICgoaywgdikgZm9yIGssIHYgaW4gc2l4Lml0ZXJpdGVtcyhmaWVsZHMpKQoKICAgIHJldHVybiAoKGssIHYpIGZvciBrLCB2IGluIGZpZWxkcykKCgpkZWYgZW5jb2RlX211bHRpcGFydF9mb3JtZGF0YShmaWVsZHMsIGJvdW5kYXJ5PU5vbmUpOgogICAgIiIiCiAgICBFbmNvZGUgYSBkaWN0aW9uYXJ5IG9mIGBgZmllbGRzYGAgdXNpbmcgdGhlIG11bHRpcGFydC9mb3JtLWRhdGEgTUlNRSBmb3JtYXQuCgogICAgOnBhcmFtIGZpZWxkczoKICAgICAgICBEaWN0aW9uYXJ5IG9mIGZpZWxkcyBvciBsaXN0IG9mIChrZXksIDpjbGFzczpgfnVybGxpYjMuZmllbGRzLlJlcXVlc3RGaWVsZGApLgoKICAgIDpwYXJhbSBib3VuZGFyeToKICAgICAgICBJZiBub3Qgc3BlY2lmaWVkLCB0aGVuIGEgcmFuZG9tIGJvdW5kYXJ5IHdpbGwgYmUgZ2VuZXJhdGVkIHVzaW5nCiAgICAgICAgOmZ1bmM6YG1pbWV0b29scy5jaG9vc2VfYm91bmRhcnlgLgogICAgIiIiCiAgICBib2R5ID0gQnl0ZXNJTygpCiAgICBpZiBib3VuZGFyeSBpcyBOb25lOgogICAgICAgIGJvdW5kYXJ5ID0gY2hvb3NlX2JvdW5kYXJ5KCkKCiAgICBmb3IgZmllbGQgaW4gaXRlcl9maWVsZF9vYmplY3RzKGZpZWxkcyk6CiAgICAgICAgYm9keS53cml0ZShiKCctLSVzXHJcbicgJSAoYm91bmRhcnkpKSkKCiAgICAgICAgd3JpdGVyKGJvZHkpLndyaXRlKGZpZWxkLnJlbmRlcl9oZWFkZXJzKCkpCiAgICAgICAgZGF0YSA9IGZpZWxkLmRhdGEKCiAgICAgICAgaWYgaXNpbnN0YW5jZShkYXRhLCBpbnQpOgogICAgICAgICAgICBkYXRhID0gc3RyKGRhdGEpICAjIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CgogICAgICAgIGlmIGlzaW5zdGFuY2UoZGF0YSwgc2l4LnRleHRfdHlwZSk6CiAgICAgICAgICAgIHdyaXRlcihib2R5KS53cml0ZShkYXRhKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGJvZHkud3JpdGUoZGF0YSkKCiAgICAgICAgYm9keS53cml0ZShiJ1xyXG4nKQoKICAgIGJvZHkud3JpdGUoYignLS0lcy0tXHJcbicgJSAoYm91bmRhcnkpKSkKCiAgICBjb250ZW50X3R5cGUgPSBzdHIoJ211bHRpcGFydC9mb3JtLWRhdGE7IGJvdW5kYXJ5PSVzJyAlIGJvdW5kYXJ5KQoKICAgIHJldHVybiBib2R5LmdldHZhbHVlKCksIGNvbnRlbnRfdHlwZQpQSwMEFAAAAAAAAAAhAI9doHxtAAAAbQAAAEUAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvcGFja2FnZXMvX19pbml0X18ucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKZnJvbSAuIGltcG9ydCBzc2xfbWF0Y2hfaG9zdG5hbWUKCl9fYWxsX18gPSAoJ3NzbF9tYXRjaF9ob3N0bmFtZScsICkKUEsDBBQAAAAAAAAAIQAAAAAAAAAAAAAAAABPAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL3BhY2thZ2VzL2JhY2twb3J0cy9fX2luaXRfXy5weVBLAwQUAAAAAAAAACEAUlccubUFAAC1BQAATwAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9wYWNrYWdlcy9iYWNrcG9ydHMvbWFrZWZpbGUucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQoiIiIKYmFja3BvcnRzLm1ha2VmaWxlCn5+fn5+fn5+fn5+fn5+fn5+fgoKQmFja3BvcnRzIHRoZSBQeXRob24gMyBgYHNvY2tldC5tYWtlZmlsZWBgIG1ldGhvZCBmb3IgdXNlIHdpdGggYW55dGhpbmcgdGhhdAp3YW50cyB0byBjcmVhdGUgYSAiZmFrZSIgc29ja2V0IG9iamVjdC4KIiIiCmltcG9ydCBpbwoKZnJvbSBzb2NrZXQgaW1wb3J0IFNvY2tldElPCgoKZGVmIGJhY2twb3J0X21ha2VmaWxlKHNlbGYsIG1vZGU9InIiLCBidWZmZXJpbmc9Tm9uZSwgZW5jb2Rpbmc9Tm9uZSwKICAgICAgICAgICAgICAgICAgICAgIGVycm9ycz1Ob25lLCBuZXdsaW5lPU5vbmUpOgogICAgIiIiCiAgICBCYWNrcG9ydCBvZiBgYHNvY2tldC5tYWtlZmlsZWBgIGZyb20gUHl0aG9uIDMuNS4KICAgICIiIgogICAgaWYgbm90IHNldChtb2RlKSA8PSBzZXQoWyJyIiwgInciLCAiYiJdKToKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAogICAgICAgICAgICAiaW52YWxpZCBtb2RlICVyIChvbmx5IHIsIHcsIGIgYWxsb3dlZCkiICUgKG1vZGUsKQogICAgICAgICkKICAgIHdyaXRpbmcgPSAidyIgaW4gbW9kZQogICAgcmVhZGluZyA9ICJyIiBpbiBtb2RlIG9yIG5vdCB3cml0aW5nCiAgICBhc3NlcnQgcmVhZGluZyBvciB3cml0aW5nCiAgICBiaW5hcnkgPSAiYiIgaW4gbW9kZQogICAgcmF3bW9kZSA9ICIiCiAgICBpZiByZWFkaW5nOgogICAgICAgIHJhd21vZGUgKz0gInIiCiAgICBpZiB3cml0aW5nOgogICAgICAgIHJhd21vZGUgKz0gInciCiAgICByYXcgPSBTb2NrZXRJTyhzZWxmLCByYXdtb2RlKQogICAgc2VsZi5fbWFrZWZpbGVfcmVmcyArPSAxCiAgICBpZiBidWZmZXJpbmcgaXMgTm9uZToKICAgICAgICBidWZmZXJpbmcgPSAtMQogICAgaWYgYnVmZmVyaW5nIDwgMDoKICAgICAgICBidWZmZXJpbmcgPSBpby5ERUZBVUxUX0JVRkZFUl9TSVpFCiAgICBpZiBidWZmZXJpbmcgPT0gMDoKICAgICAgICBpZiBub3QgYmluYXJ5OgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJ1bmJ1ZmZlcmVkIHN0cmVhbXMgbXVzdCBiZSBiaW5hcnkiKQogICAgICAgIHJldHVybiByYXcKICAgIGlmIHJlYWRpbmcgYW5kIHdyaXRpbmc6CiAgICAgICAgYnVmZmVyID0gaW8uQnVmZmVyZWRSV1BhaXIocmF3LCByYXcsIGJ1ZmZlcmluZykKICAgIGVsaWYgcmVhZGluZzoKICAgICAgICBidWZmZXIgPSBpby5CdWZmZXJlZFJlYWRlcihyYXcsIGJ1ZmZlcmluZykKICAgIGVsc2U6CiAgICAgICAgYXNzZXJ0IHdyaXRpbmcKICAgICAgICBidWZmZXIgPSBpby5CdWZmZXJlZFdyaXRlcihyYXcsIGJ1ZmZlcmluZykKICAgIGlmIGJpbmFyeToKICAgICAgICByZXR1cm4gYnVmZmVyCiAgICB0ZXh0ID0gaW8uVGV4dElPV3JhcHBlcihidWZmZXIsIGVuY29kaW5nLCBlcnJvcnMsIG5ld2xpbmUpCiAgICB0ZXh0Lm1vZGUgPSBtb2RlCiAgICByZXR1cm4gdGV4dApQSwMEFAAAAAAAAAAhAEbBpmfnIgAA5yIAAEkAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvcGFja2FnZXMvb3JkZXJlZF9kaWN0LnB5IyBCYWNrcG9ydCBvZiBPcmRlcmVkRGljdCgpIGNsYXNzIHRoYXQgcnVucyBvbiBQeXRob24gMi40LCAyLjUsIDIuNiwgMi43IGFuZCBweXB5LgojIFBhc3NlcyBQeXRob24yLjcncyB0ZXN0IHN1aXRlIGFuZCBpbmNvcnBvcmF0ZXMgYWxsIHRoZSBsYXRlc3QgdXBkYXRlcy4KIyBDb3B5cmlnaHQgMjAwOSBSYXltb25kIEhldHRpbmdlciwgcmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLgojIGh0dHA6Ly9jb2RlLmFjdGl2ZXN0YXRlLmNvbS9yZWNpcGVzLzU3NjY5My8KdHJ5OgogICAgZnJvbSB0aHJlYWQgaW1wb3J0IGdldF9pZGVudCBhcyBfZ2V0X2lkZW50CmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGZyb20gZHVtbXlfdGhyZWFkIGltcG9ydCBnZXRfaWRlbnQgYXMgX2dldF9pZGVudAoKdHJ5OgogICAgZnJvbSBfYWJjb2xsIGltcG9ydCBLZXlzVmlldywgVmFsdWVzVmlldywgSXRlbXNWaWV3CmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIHBhc3MKCgpjbGFzcyBPcmRlcmVkRGljdChkaWN0KToKICAgICdEaWN0aW9uYXJ5IHRoYXQgcmVtZW1iZXJzIGluc2VydGlvbiBvcmRlcicKICAgICMgQW4gaW5oZXJpdGVkIGRpY3QgbWFwcyBrZXlzIHRvIHZhbHVlcy4KICAgICMgVGhlIGluaGVyaXRlZCBkaWN0IHByb3ZpZGVzIF9fZ2V0aXRlbV9fLCBfX2xlbl9fLCBfX2NvbnRhaW5zX18sIGFuZCBnZXQuCiAgICAjIFRoZSByZW1haW5pbmcgbWV0aG9kcyBhcmUgb3JkZXItYXdhcmUuCiAgICAjIEJpZy1PIHJ1bm5pbmcgdGltZXMgZm9yIGFsbCBtZXRob2RzIGFyZSB0aGUgc2FtZSBhcyBmb3IgcmVndWxhciBkaWN0aW9uYXJpZXMuCgogICAgIyBUaGUgaW50ZXJuYWwgc2VsZi5fX21hcCBkaWN0aW9uYXJ5IG1hcHMga2V5cyB0byBsaW5rcyBpbiBhIGRvdWJseSBsaW5rZWQgbGlzdC4KICAgICMgVGhlIGNpcmN1bGFyIGRvdWJseSBsaW5rZWQgbGlzdCBzdGFydHMgYW5kIGVuZHMgd2l0aCBhIHNlbnRpbmVsIGVsZW1lbnQuCiAgICAjIFRoZSBzZW50aW5lbCBlbGVtZW50IG5ldmVyIGdldHMgZGVsZXRlZCAodGhpcyBzaW1wbGlmaWVzIHRoZSBhbGdvcml0aG0pLgogICAgIyBFYWNoIGxpbmsgaXMgc3RvcmVkIGFzIGEgbGlzdCBvZiBsZW5ndGggdGhyZWU6ICBbUFJFViwgTkVYVCwgS0VZXS4KCiAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dkcyk6CiAgICAgICAgJycnSW5pdGlhbGl6ZSBhbiBvcmRlcmVkIGRpY3Rpb25hcnkuICBTaWduYXR1cmUgaXMgdGhlIHNhbWUgYXMgZm9yCiAgICAgICAgcmVndWxhciBkaWN0aW9uYXJpZXMsIGJ1dCBrZXl3b3JkIGFyZ3VtZW50cyBhcmUgbm90IHJlY29tbWVuZGVkCiAgICAgICAgYmVjYXVzZSB0aGVpciBpbnNlcnRpb24gb3JkZXIgaXMgYXJiaXRyYXJ5LgoKICAgICAgICAnJycKICAgICAgICBpZiBsZW4oYXJncykgPiAxOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ2V4cGVjdGVkIGF0IG1vc3QgMSBhcmd1bWVudHMsIGdvdCAlZCcgJSBsZW4oYXJncykpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLl9fcm9vdAogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgc2VsZi5fX3Jvb3QgPSByb290ID0gW10gICAgICAgICAgICAgICAgICAgICAjIHNlbnRpbmVsIG5vZGUKICAgICAgICAgICAgcm9vdFs6XSA9IFtyb290LCByb290LCBOb25lXQogICAgICAgICAgICBzZWxmLl9fbWFwID0ge30KICAgICAgICBzZWxmLl9fdXBkYXRlKCphcmdzLCAqKmt3ZHMpCgogICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGtleSwgdmFsdWUsIGRpY3Rfc2V0aXRlbT1kaWN0Ll9fc2V0aXRlbV9fKToKICAgICAgICAnb2QuX19zZXRpdGVtX18oaSwgeSkgPD09PiBvZFtpXT15JwogICAgICAgICMgU2V0dGluZyBhIG5ldyBpdGVtIGNyZWF0ZXMgYSBuZXcgbGluayB3aGljaCBnb2VzIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmtlZAogICAgICAgICMgbGlzdCwgYW5kIHRoZSBpbmhlcml0ZWQgZGljdGlvbmFyeSBpcyB1cGRhdGVkIHdpdGggdGhlIG5ldyBrZXkvdmFsdWUgcGFpci4KICAgICAgICBpZiBrZXkgbm90IGluIHNlbGY6CiAgICAgICAgICAgIHJvb3QgPSBzZWxmLl9fcm9vdAogICAgICAgICAgICBsYXN0ID0gcm9vdFswXQogICAgICAgICAgICBsYXN0WzFdID0gcm9vdFswXSA9IHNlbGYuX19tYXBba2V5XSA9IFtsYXN0LCByb290LCBrZXldCiAgICAgICAgZGljdF9zZXRpdGVtKHNlbGYsIGtleSwgdmFsdWUpCgogICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsIGtleSwgZGljdF9kZWxpdGVtPWRpY3QuX19kZWxpdGVtX18pOgogICAgICAgICdvZC5fX2RlbGl0ZW1fXyh5KSA8PT0+IGRlbCBvZFt5XScKICAgICAgICAjIERlbGV0aW5nIGFuIGV4aXN0aW5nIGl0ZW0gdXNlcyBzZWxmLl9fbWFwIHRvIGZpbmQgdGhlIGxpbmsgd2hpY2ggaXMKICAgICAgICAjIHRoZW4gcmVtb3ZlZCBieSB1cGRhdGluZyB0aGUgbGlua3MgaW4gdGhlIHByZWRlY2Vzc29yIGFuZCBzdWNjZXNzb3Igbm9kZXMuCiAgICAgICAgZGljdF9kZWxpdGVtKHNlbGYsIGtleSkKICAgICAgICBsaW5rX3ByZXYsIGxpbmtfbmV4dCwga2V5ID0gc2VsZi5fX21hcC5wb3Aoa2V5KQogICAgICAgIGxpbmtfcHJldlsxXSA9IGxpbmtfbmV4dAogICAgICAgIGxpbmtfbmV4dFswXSA9IGxpbmtfcHJldgoKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICAnb2QuX19pdGVyX18oKSA8PT0+IGl0ZXIob2QpJwogICAgICAgIHJvb3QgPSBzZWxmLl9fcm9vdAogICAgICAgIGN1cnIgPSByb290WzFdCiAgICAgICAgd2hpbGUgY3VyciBpcyBub3Qgcm9vdDoKICAgICAgICAgICAgeWllbGQgY3VyclsyXQogICAgICAgICAgICBjdXJyID0gY3VyclsxXQoKICAgIGRlZiBfX3JldmVyc2VkX18oc2VsZik6CiAgICAgICAgJ29kLl9fcmV2ZXJzZWRfXygpIDw9PT4gcmV2ZXJzZWQob2QpJwogICAgICAgIHJvb3QgPSBzZWxmLl9fcm9vdAogICAgICAgIGN1cnIgPSByb290WzBdCiAgICAgICAgd2hpbGUgY3VyciBpcyBub3Qgcm9vdDoKICAgICAgICAgICAgeWllbGQgY3VyclsyXQogICAgICAgICAgICBjdXJyID0gY3VyclswXQoKICAgIGRlZiBjbGVhcihzZWxmKToKICAgICAgICAnb2QuY2xlYXIoKSAtPiBOb25lLiAgUmVtb3ZlIGFsbCBpdGVtcyBmcm9tIG9kLicKICAgICAgICB0cnk6CiAgICAgICAgICAgIGZvciBub2RlIGluIHNlbGYuX19tYXAuaXRlcnZhbHVlcygpOgogICAgICAgICAgICAgICAgZGVsIG5vZGVbOl0KICAgICAgICAgICAgcm9vdCA9IHNlbGYuX19yb290CiAgICAgICAgICAgIHJvb3RbOl0gPSBbcm9vdCwgcm9vdCwgTm9uZV0KICAgICAgICAgICAgc2VsZi5fX21hcC5jbGVhcigpCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICBwYXNzCiAgICAgICAgZGljdC5jbGVhcihzZWxmKQoKICAgIGRlZiBwb3BpdGVtKHNlbGYsIGxhc3Q9VHJ1ZSk6CiAgICAgICAgJycnb2QucG9waXRlbSgpIC0+IChrLCB2KSwgcmV0dXJuIGFuZCByZW1vdmUgYSAoa2V5LCB2YWx1ZSkgcGFpci4KICAgICAgICBQYWlycyBhcmUgcmV0dXJuZWQgaW4gTElGTyBvcmRlciBpZiBsYXN0IGlzIHRydWUgb3IgRklGTyBvcmRlciBpZiBmYWxzZS4KCiAgICAgICAgJycnCiAgICAgICAgaWYgbm90IHNlbGY6CiAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKCdkaWN0aW9uYXJ5IGlzIGVtcHR5JykKICAgICAgICByb290ID0gc2VsZi5fX3Jvb3QKICAgICAgICBpZiBsYXN0OgogICAgICAgICAgICBsaW5rID0gcm9vdFswXQogICAgICAgICAgICBsaW5rX3ByZXYgPSBsaW5rWzBdCiAgICAgICAgICAgIGxpbmtfcHJldlsxXSA9IHJvb3QKICAgICAgICAgICAgcm9vdFswXSA9IGxpbmtfcHJldgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGxpbmsgPSByb290WzFdCiAgICAgICAgICAgIGxpbmtfbmV4dCA9IGxpbmtbMV0KICAgICAgICAgICAgcm9vdFsxXSA9IGxpbmtfbmV4dAogICAgICAgICAgICBsaW5rX25leHRbMF0gPSByb290CiAgICAgICAga2V5ID0gbGlua1syXQogICAgICAgIGRlbCBzZWxmLl9fbWFwW2tleV0KICAgICAgICB2YWx1ZSA9IGRpY3QucG9wKHNlbGYsIGtleSkKICAgICAgICByZXR1cm4ga2V5LCB2YWx1ZQoKICAgICMgLS0gdGhlIGZvbGxvd2luZyBtZXRob2RzIGRvIG5vdCBkZXBlbmQgb24gdGhlIGludGVybmFsIHN0cnVjdHVyZSAtLQoKICAgIGRlZiBrZXlzKHNlbGYpOgogICAgICAgICdvZC5rZXlzKCkgLT4gbGlzdCBvZiBrZXlzIGluIG9kJwogICAgICAgIHJldHVybiBsaXN0KHNlbGYpCgogICAgZGVmIHZhbHVlcyhzZWxmKToKICAgICAgICAnb2QudmFsdWVzKCkgLT4gbGlzdCBvZiB2YWx1ZXMgaW4gb2QnCiAgICAgICAgcmV0dXJuIFtzZWxmW2tleV0gZm9yIGtleSBpbiBzZWxmXQoKICAgIGRlZiBpdGVtcyhzZWxmKToKICAgICAgICAnb2QuaXRlbXMoKSAtPiBsaXN0IG9mIChrZXksIHZhbHVlKSBwYWlycyBpbiBvZCcKICAgICAgICByZXR1cm4gWyhrZXksIHNlbGZba2V5XSkgZm9yIGtleSBpbiBzZWxmXQoKICAgIGRlZiBpdGVya2V5cyhzZWxmKToKICAgICAgICAnb2QuaXRlcmtleXMoKSAtPiBhbiBpdGVyYXRvciBvdmVyIHRoZSBrZXlzIGluIG9kJwogICAgICAgIHJldHVybiBpdGVyKHNlbGYpCgogICAgZGVmIGl0ZXJ2YWx1ZXMoc2VsZik6CiAgICAgICAgJ29kLml0ZXJ2YWx1ZXMgLT4gYW4gaXRlcmF0b3Igb3ZlciB0aGUgdmFsdWVzIGluIG9kJwogICAgICAgIGZvciBrIGluIHNlbGY6CiAgICAgICAgICAgIHlpZWxkIHNlbGZba10KCiAgICBkZWYgaXRlcml0ZW1zKHNlbGYpOgogICAgICAgICdvZC5pdGVyaXRlbXMgLT4gYW4gaXRlcmF0b3Igb3ZlciB0aGUgKGtleSwgdmFsdWUpIGl0ZW1zIGluIG9kJwogICAgICAgIGZvciBrIGluIHNlbGY6CiAgICAgICAgICAgIHlpZWxkIChrLCBzZWxmW2tdKQoKICAgIGRlZiB1cGRhdGUoKmFyZ3MsICoqa3dkcyk6CiAgICAgICAgJycnb2QudXBkYXRlKEUsICoqRikgLT4gTm9uZS4gIFVwZGF0ZSBvZCBmcm9tIGRpY3QvaXRlcmFibGUgRSBhbmQgRi4KCiAgICAgICAgSWYgRSBpcyBhIGRpY3QgaW5zdGFuY2UsIGRvZXM6ICAgICAgICAgICBmb3IgayBpbiBFOiBvZFtrXSA9IEVba10KICAgICAgICBJZiBFIGhhcyBhIC5rZXlzKCkgbWV0aG9kLCBkb2VzOiAgICAgICAgIGZvciBrIGluIEUua2V5cygpOiBvZFtrXSA9IEVba10KICAgICAgICBPciBpZiBFIGlzIGFuIGl0ZXJhYmxlIG9mIGl0ZW1zLCBkb2VzOiAgIGZvciBrLCB2IGluIEU6IG9kW2tdID0gdgogICAgICAgIEluIGVpdGhlciBjYXNlLCB0aGlzIGlzIGZvbGxvd2VkIGJ5OiAgICAgZm9yIGssIHYgaW4gRi5pdGVtcygpOiBvZFtrXSA9IHYKCiAgICAgICAgJycnCiAgICAgICAgaWYgbGVuKGFyZ3MpID4gMjoKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCd1cGRhdGUoKSB0YWtlcyBhdCBtb3N0IDIgcG9zaXRpb25hbCAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXJndW1lbnRzICglZCBnaXZlbiknICUgKGxlbihhcmdzKSwpKQogICAgICAgIGVsaWYgbm90IGFyZ3M6CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigndXBkYXRlKCkgdGFrZXMgYXQgbGVhc3QgMSBhcmd1bWVudCAoMCBnaXZlbiknKQogICAgICAgIHNlbGYgPSBhcmdzWzBdCiAgICAgICAgIyBNYWtlIHByb2dyZXNzaXZlbHkgd2Vha2VyIGFzc3VtcHRpb25zIGFib3V0ICJvdGhlciIKICAgICAgICBvdGhlciA9ICgpCiAgICAgICAgaWYgbGVuKGFyZ3MpID09IDI6CiAgICAgICAgICAgIG90aGVyID0gYXJnc1sxXQogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIGRpY3QpOgogICAgICAgICAgICBmb3Iga2V5IGluIG90aGVyOgogICAgICAgICAgICAgICAgc2VsZltrZXldID0gb3RoZXJba2V5XQogICAgICAgIGVsaWYgaGFzYXR0cihvdGhlciwgJ2tleXMnKToKICAgICAgICAgICAgZm9yIGtleSBpbiBvdGhlci5rZXlzKCk6CiAgICAgICAgICAgICAgICBzZWxmW2tleV0gPSBvdGhlcltrZXldCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gb3RoZXI6CiAgICAgICAgICAgICAgICBzZWxmW2tleV0gPSB2YWx1ZQogICAgICAgIGZvciBrZXksIHZhbHVlIGluIGt3ZHMuaXRlbXMoKToKICAgICAgICAgICAgc2VsZltrZXldID0gdmFsdWUKCiAgICBfX3VwZGF0ZSA9IHVwZGF0ZSAgIyBsZXQgc3ViY2xhc3NlcyBvdmVycmlkZSB1cGRhdGUgd2l0aG91dCBicmVha2luZyBfX2luaXRfXwoKICAgIF9fbWFya2VyID0gb2JqZWN0KCkKCiAgICBkZWYgcG9wKHNlbGYsIGtleSwgZGVmYXVsdD1fX21hcmtlcik6CiAgICAgICAgJycnb2QucG9wKGtbLGRdKSAtPiB2LCByZW1vdmUgc3BlY2lmaWVkIGtleSBhbmQgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlLgogICAgICAgIElmIGtleSBpcyBub3QgZm91bmQsIGQgaXMgcmV0dXJuZWQgaWYgZ2l2ZW4sIG90aGVyd2lzZSBLZXlFcnJvciBpcyByYWlzZWQuCgogICAgICAgICcnJwogICAgICAgIGlmIGtleSBpbiBzZWxmOgogICAgICAgICAgICByZXN1bHQgPSBzZWxmW2tleV0KICAgICAgICAgICAgZGVsIHNlbGZba2V5XQogICAgICAgICAgICByZXR1cm4gcmVzdWx0CiAgICAgICAgaWYgZGVmYXVsdCBpcyBzZWxmLl9fbWFya2VyOgogICAgICAgICAgICByYWlzZSBLZXlFcnJvcihrZXkpCiAgICAgICAgcmV0dXJuIGRlZmF1bHQKCiAgICBkZWYgc2V0ZGVmYXVsdChzZWxmLCBrZXksIGRlZmF1bHQ9Tm9uZSk6CiAgICAgICAgJ29kLnNldGRlZmF1bHQoa1ssZF0pIC0+IG9kLmdldChrLGQpLCBhbHNvIHNldCBvZFtrXT1kIGlmIGsgbm90IGluIG9kJwogICAgICAgIGlmIGtleSBpbiBzZWxmOgogICAgICAgICAgICByZXR1cm4gc2VsZltrZXldCiAgICAgICAgc2VsZltrZXldID0gZGVmYXVsdAogICAgICAgIHJldHVybiBkZWZhdWx0CgogICAgZGVmIF9fcmVwcl9fKHNlbGYsIF9yZXByX3J1bm5pbmc9e30pOgogICAgICAgICdvZC5fX3JlcHJfXygpIDw9PT4gcmVwcihvZCknCiAgICAgICAgY2FsbF9rZXkgPSBpZChzZWxmKSwgX2dldF9pZGVudCgpCiAgICAgICAgaWYgY2FsbF9rZXkgaW4gX3JlcHJfcnVubmluZzoKICAgICAgICAgICAgcmV0dXJuICcuLi4nCiAgICAgICAgX3JlcHJfcnVubmluZ1tjYWxsX2tleV0gPSAxCiAgICAgICAgdHJ5OgogICAgICAgICAgICBpZiBub3Qgc2VsZjoKICAgICAgICAgICAgICAgIHJldHVybiAnJXMoKScgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sKQogICAgICAgICAgICByZXR1cm4gJyVzKCVyKScgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHNlbGYuaXRlbXMoKSkKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBkZWwgX3JlcHJfcnVubmluZ1tjYWxsX2tleV0KCiAgICBkZWYgX19yZWR1Y2VfXyhzZWxmKToKICAgICAgICAnUmV0dXJuIHN0YXRlIGluZm9ybWF0aW9uIGZvciBwaWNrbGluZycKICAgICAgICBpdGVtcyA9IFtbaywgc2VsZltrXV0gZm9yIGsgaW4gc2VsZl0KICAgICAgICBpbnN0X2RpY3QgPSB2YXJzKHNlbGYpLmNvcHkoKQogICAgICAgIGZvciBrIGluIHZhcnMoT3JkZXJlZERpY3QoKSk6CiAgICAgICAgICAgIGluc3RfZGljdC5wb3AoaywgTm9uZSkKICAgICAgICBpZiBpbnN0X2RpY3Q6CiAgICAgICAgICAgIHJldHVybiAoc2VsZi5fX2NsYXNzX18sIChpdGVtcywpLCBpbnN0X2RpY3QpCiAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fLCAoaXRlbXMsKQoKICAgIGRlZiBjb3B5KHNlbGYpOgogICAgICAgICdvZC5jb3B5KCkgLT4gYSBzaGFsbG93IGNvcHkgb2Ygb2QnCiAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKHNlbGYpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgZnJvbWtleXMoY2xzLCBpdGVyYWJsZSwgdmFsdWU9Tm9uZSk6CiAgICAgICAgJycnT0QuZnJvbWtleXMoU1ssIHZdKSAtPiBOZXcgb3JkZXJlZCBkaWN0aW9uYXJ5IHdpdGgga2V5cyBmcm9tIFMKICAgICAgICBhbmQgdmFsdWVzIGVxdWFsIHRvIHYgKHdoaWNoIGRlZmF1bHRzIHRvIE5vbmUpLgoKICAgICAgICAnJycKICAgICAgICBkID0gY2xzKCkKICAgICAgICBmb3Iga2V5IGluIGl0ZXJhYmxlOgogICAgICAgICAgICBkW2tleV0gPSB2YWx1ZQogICAgICAgIHJldHVybiBkCgogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgJycnb2QuX19lcV9fKHkpIDw9PT4gb2Q9PXkuICBDb21wYXJpc29uIHRvIGFub3RoZXIgT0QgaXMgb3JkZXItc2Vuc2l0aXZlCiAgICAgICAgd2hpbGUgY29tcGFyaXNvbiB0byBhIHJlZ3VsYXIgbWFwcGluZyBpcyBvcmRlci1pbnNlbnNpdGl2ZS4KCiAgICAgICAgJycnCiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgT3JkZXJlZERpY3QpOgogICAgICAgICAgICByZXR1cm4gbGVuKHNlbGYpPT1sZW4ob3RoZXIpIGFuZCBzZWxmLml0ZW1zKCkgPT0gb3RoZXIuaXRlbXMoKQogICAgICAgIHJldHVybiBkaWN0Ll9fZXFfXyhzZWxmLCBvdGhlcikKCiAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gbm90IHNlbGYgPT0gb3RoZXIKCiAgICAjIC0tIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyBhcmUgb25seSB1c2VkIGluIFB5dGhvbiAyLjcgLS0KCiAgICBkZWYgdmlld2tleXMoc2VsZik6CiAgICAgICAgIm9kLnZpZXdrZXlzKCkgLT4gYSBzZXQtbGlrZSBvYmplY3QgcHJvdmlkaW5nIGEgdmlldyBvbiBvZCdzIGtleXMiCiAgICAgICAgcmV0dXJuIEtleXNWaWV3KHNlbGYpCgogICAgZGVmIHZpZXd2YWx1ZXMoc2VsZik6CiAgICAgICAgIm9kLnZpZXd2YWx1ZXMoKSAtPiBhbiBvYmplY3QgcHJvdmlkaW5nIGEgdmlldyBvbiBvZCdzIHZhbHVlcyIKICAgICAgICByZXR1cm4gVmFsdWVzVmlldyhzZWxmKQoKICAgIGRlZiB2aWV3aXRlbXMoc2VsZik6CiAgICAgICAgIm9kLnZpZXdpdGVtcygpIC0+IGEgc2V0LWxpa2Ugb2JqZWN0IHByb3ZpZGluZyBhIHZpZXcgb24gb2QncyBpdGVtcyIKICAgICAgICByZXR1cm4gSXRlbXNWaWV3KHNlbGYpClBLAwQUAAAAAAAAACEAmVhNWpJ1AACSdQAAQAAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9wYWNrYWdlcy9zaXgucHkiIiJVdGlsaXRpZXMgZm9yIHdyaXRpbmcgY29kZSB0aGF0IHJ1bnMgb24gUHl0aG9uIDIgYW5kIDMiIiIKCiMgQ29weXJpZ2h0IChjKSAyMDEwLTIwMTUgQmVuamFtaW4gUGV0ZXJzb24KIwojIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKIyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAojIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKIyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCiMgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCiMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIwojIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAojIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCiMKIyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgojIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAojIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQojIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKIyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAojIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCiMgU09GVFdBUkUuCgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IGZ1bmN0b29scwppbXBvcnQgaXRlcnRvb2xzCmltcG9ydCBvcGVyYXRvcgppbXBvcnQgc3lzCmltcG9ydCB0eXBlcwoKX19hdXRob3JfXyA9ICJCZW5qYW1pbiBQZXRlcnNvbiA8YmVuamFtaW5AcHl0aG9uLm9yZz4iCl9fdmVyc2lvbl9fID0gIjEuMTAuMCIKCgojIFVzZWZ1bCBmb3IgdmVyeSBjb2Fyc2UgdmVyc2lvbiBkaWZmZXJlbnRpYXRpb24uClBZMiA9IHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMgpQWTMgPSBzeXMudmVyc2lvbl9pbmZvWzBdID09IDMKUFkzNCA9IHN5cy52ZXJzaW9uX2luZm9bMDoyXSA+PSAoMywgNCkKCmlmIFBZMzoKICAgIHN0cmluZ190eXBlcyA9IHN0ciwKICAgIGludGVnZXJfdHlwZXMgPSBpbnQsCiAgICBjbGFzc190eXBlcyA9IHR5cGUsCiAgICB0ZXh0X3R5cGUgPSBzdHIKICAgIGJpbmFyeV90eXBlID0gYnl0ZXMKCiAgICBNQVhTSVpFID0gc3lzLm1heHNpemUKZWxzZToKICAgIHN0cmluZ190eXBlcyA9IGJhc2VzdHJpbmcsCiAgICBpbnRlZ2VyX3R5cGVzID0gKGludCwgbG9uZykKICAgIGNsYXNzX3R5cGVzID0gKHR5cGUsIHR5cGVzLkNsYXNzVHlwZSkKICAgIHRleHRfdHlwZSA9IHVuaWNvZGUKICAgIGJpbmFyeV90eXBlID0gc3RyCgogICAgaWYgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoImphdmEiKToKICAgICAgICAjIEp5dGhvbiBhbHdheXMgdXNlcyAzMiBiaXRzLgogICAgICAgIE1BWFNJWkUgPSBpbnQoKDEgPDwgMzEpIC0gMSkKICAgIGVsc2U6CiAgICAgICAgIyBJdCdzIHBvc3NpYmxlIHRvIGhhdmUgc2l6ZW9mKGxvbmcpICE9IHNpemVvZihQeV9zc2l6ZV90KS4KICAgICAgICBjbGFzcyBYKG9iamVjdCk6CgogICAgICAgICAgICBkZWYgX19sZW5fXyhzZWxmKToKICAgICAgICAgICAgICAgIHJldHVybiAxIDw8IDMxCiAgICAgICAgdHJ5OgogICAgICAgICAgICBsZW4oWCgpKQogICAgICAgIGV4Y2VwdCBPdmVyZmxvd0Vycm9yOgogICAgICAgICAgICAjIDMyLWJpdAogICAgICAgICAgICBNQVhTSVpFID0gaW50KCgxIDw8IDMxKSAtIDEpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyA2NC1iaXQKICAgICAgICAgICAgTUFYU0laRSA9IGludCgoMSA8PCA2MykgLSAxKQogICAgICAgIGRlbCBYCgoKZGVmIF9hZGRfZG9jKGZ1bmMsIGRvYyk6CiAgICAiIiJBZGQgZG9jdW1lbnRhdGlvbiB0byBhIGZ1bmN0aW9uLiIiIgogICAgZnVuYy5fX2RvY19fID0gZG9jCgoKZGVmIF9pbXBvcnRfbW9kdWxlKG5hbWUpOgogICAgIiIiSW1wb3J0IG1vZHVsZSwgcmV0dXJuaW5nIHRoZSBtb2R1bGUgYWZ0ZXIgdGhlIGxhc3QgZG90LiIiIgogICAgX19pbXBvcnRfXyhuYW1lKQogICAgcmV0dXJuIHN5cy5tb2R1bGVzW25hbWVdCgoKY2xhc3MgX0xhenlEZXNjcihvYmplY3QpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lKToKICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCgogICAgZGVmIF9fZ2V0X18oc2VsZiwgb2JqLCB0cCk6CiAgICAgICAgcmVzdWx0ID0gc2VsZi5fcmVzb2x2ZSgpCiAgICAgICAgc2V0YXR0cihvYmosIHNlbGYubmFtZSwgcmVzdWx0KSAgIyBJbnZva2VzIF9fc2V0X18uCiAgICAgICAgdHJ5OgogICAgICAgICAgICAjIFRoaXMgaXMgYSBiaXQgdWdseSwgYnV0IGl0IGF2b2lkcyBydW5uaW5nIHRoaXMgYWdhaW4gYnkKICAgICAgICAgICAgIyByZW1vdmluZyB0aGlzIGRlc2NyaXB0b3IuCiAgICAgICAgICAgIGRlbGF0dHIob2JqLl9fY2xhc3NfXywgc2VsZi5uYW1lKQogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgcGFzcwogICAgICAgIHJldHVybiByZXN1bHQKCgpjbGFzcyBNb3ZlZE1vZHVsZShfTGF6eURlc2NyKToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgb2xkLCBuZXc9Tm9uZSk6CiAgICAgICAgc3VwZXIoTW92ZWRNb2R1bGUsIHNlbGYpLl9faW5pdF9fKG5hbWUpCiAgICAgICAgaWYgUFkzOgogICAgICAgICAgICBpZiBuZXcgaXMgTm9uZToKICAgICAgICAgICAgICAgIG5ldyA9IG5hbWUKICAgICAgICAgICAgc2VsZi5tb2QgPSBuZXcKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLm1vZCA9IG9sZAoKICAgIGRlZiBfcmVzb2x2ZShzZWxmKToKICAgICAgICByZXR1cm4gX2ltcG9ydF9tb2R1bGUoc2VsZi5tb2QpCgogICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIGF0dHIpOgogICAgICAgIF9tb2R1bGUgPSBzZWxmLl9yZXNvbHZlKCkKICAgICAgICB2YWx1ZSA9IGdldGF0dHIoX21vZHVsZSwgYXR0cikKICAgICAgICBzZXRhdHRyKHNlbGYsIGF0dHIsIHZhbHVlKQogICAgICAgIHJldHVybiB2YWx1ZQoKCmNsYXNzIF9MYXp5TW9kdWxlKHR5cGVzLk1vZHVsZVR5cGUpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lKToKICAgICAgICBzdXBlcihfTGF6eU1vZHVsZSwgc2VsZikuX19pbml0X18obmFtZSkKICAgICAgICBzZWxmLl9fZG9jX18gPSBzZWxmLl9fY2xhc3NfXy5fX2RvY19fCgogICAgZGVmIF9fZGlyX18oc2VsZik6CiAgICAgICAgYXR0cnMgPSBbIl9fZG9jX18iLCAiX19uYW1lX18iXQogICAgICAgIGF0dHJzICs9IFthdHRyLm5hbWUgZm9yIGF0dHIgaW4gc2VsZi5fbW92ZWRfYXR0cmlidXRlc10KICAgICAgICByZXR1cm4gYXR0cnMKCiAgICAjIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMKICAgIF9tb3ZlZF9hdHRyaWJ1dGVzID0gW10KCgpjbGFzcyBNb3ZlZEF0dHJpYnV0ZShfTGF6eURlc2NyKToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgb2xkX21vZCwgbmV3X21vZCwgb2xkX2F0dHI9Tm9uZSwgbmV3X2F0dHI9Tm9uZSk6CiAgICAgICAgc3VwZXIoTW92ZWRBdHRyaWJ1dGUsIHNlbGYpLl9faW5pdF9fKG5hbWUpCiAgICAgICAgaWYgUFkzOgogICAgICAgICAgICBpZiBuZXdfbW9kIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBuZXdfbW9kID0gbmFtZQogICAgICAgICAgICBzZWxmLm1vZCA9IG5ld19tb2QKICAgICAgICAgICAgaWYgbmV3X2F0dHIgaXMgTm9uZToKICAgICAgICAgICAgICAgIGlmIG9sZF9hdHRyIGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgICAgbmV3X2F0dHIgPSBuYW1lCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIG5ld19hdHRyID0gb2xkX2F0dHIKICAgICAgICAgICAgc2VsZi5hdHRyID0gbmV3X2F0dHIKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLm1vZCA9IG9sZF9tb2QKICAgICAgICAgICAgaWYgb2xkX2F0dHIgaXMgTm9uZToKICAgICAgICAgICAgICAgIG9sZF9hdHRyID0gbmFtZQogICAgICAgICAgICBzZWxmLmF0dHIgPSBvbGRfYXR0cgoKICAgIGRlZiBfcmVzb2x2ZShzZWxmKToKICAgICAgICBtb2R1bGUgPSBfaW1wb3J0X21vZHVsZShzZWxmLm1vZCkKICAgICAgICByZXR1cm4gZ2V0YXR0cihtb2R1bGUsIHNlbGYuYXR0cikKCgpjbGFzcyBfU2l4TWV0YVBhdGhJbXBvcnRlcihvYmplY3QpOgoKICAgICIiIgogICAgQSBtZXRhIHBhdGggaW1wb3J0ZXIgdG8gaW1wb3J0IHNpeC5tb3ZlcyBhbmQgaXRzIHN1Ym1vZHVsZXMuCgogICAgVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGEgUEVQMzAyIGZpbmRlciBhbmQgbG9hZGVyLiBJdCBzaG91bGQgYmUgY29tcGF0aWJsZQogICAgd2l0aCBQeXRob24gMi41IGFuZCBhbGwgZXhpc3RpbmcgdmVyc2lvbnMgb2YgUHl0aG9uMwogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHNpeF9tb2R1bGVfbmFtZSk6CiAgICAgICAgc2VsZi5uYW1lID0gc2l4X21vZHVsZV9uYW1lCiAgICAgICAgc2VsZi5rbm93bl9tb2R1bGVzID0ge30KCiAgICBkZWYgX2FkZF9tb2R1bGUoc2VsZiwgbW9kLCAqZnVsbG5hbWVzKToKICAgICAgICBmb3IgZnVsbG5hbWUgaW4gZnVsbG5hbWVzOgogICAgICAgICAgICBzZWxmLmtub3duX21vZHVsZXNbc2VsZi5uYW1lICsgIi4iICsgZnVsbG5hbWVdID0gbW9kCgogICAgZGVmIF9nZXRfbW9kdWxlKHNlbGYsIGZ1bGxuYW1lKToKICAgICAgICByZXR1cm4gc2VsZi5rbm93bl9tb2R1bGVzW3NlbGYubmFtZSArICIuIiArIGZ1bGxuYW1lXQoKICAgIGRlZiBmaW5kX21vZHVsZShzZWxmLCBmdWxsbmFtZSwgcGF0aD1Ob25lKToKICAgICAgICBpZiBmdWxsbmFtZSBpbiBzZWxmLmtub3duX21vZHVsZXM6CiAgICAgICAgICAgIHJldHVybiBzZWxmCiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBkZWYgX19nZXRfbW9kdWxlKHNlbGYsIGZ1bGxuYW1lKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmtub3duX21vZHVsZXNbZnVsbG5hbWVdCiAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICByYWlzZSBJbXBvcnRFcnJvcigiVGhpcyBsb2FkZXIgZG9lcyBub3Qga25vdyBtb2R1bGUgIiArIGZ1bGxuYW1lKQoKICAgIGRlZiBsb2FkX21vZHVsZShzZWxmLCBmdWxsbmFtZSk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICAjIGluIGNhc2Ugb2YgYSByZWxvYWQKICAgICAgICAgICAgcmV0dXJuIHN5cy5tb2R1bGVzW2Z1bGxuYW1lXQogICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgcGFzcwogICAgICAgIG1vZCA9IHNlbGYuX19nZXRfbW9kdWxlKGZ1bGxuYW1lKQogICAgICAgIGlmIGlzaW5zdGFuY2UobW9kLCBNb3ZlZE1vZHVsZSk6CiAgICAgICAgICAgIG1vZCA9IG1vZC5fcmVzb2x2ZSgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbW9kLl9fbG9hZGVyX18gPSBzZWxmCiAgICAgICAgc3lzLm1vZHVsZXNbZnVsbG5hbWVdID0gbW9kCiAgICAgICAgcmV0dXJuIG1vZAoKICAgIGRlZiBpc19wYWNrYWdlKHNlbGYsIGZ1bGxuYW1lKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gdHJ1ZSwgaWYgdGhlIG5hbWVkIG1vZHVsZSBpcyBhIHBhY2thZ2UuCgogICAgICAgIFdlIG5lZWQgdGhpcyBtZXRob2QgdG8gZ2V0IGNvcnJlY3Qgc3BlYyBvYmplY3RzIHdpdGgKICAgICAgICBQeXRob24gMy40IChzZWUgUEVQNDUxKQogICAgICAgICIiIgogICAgICAgIHJldHVybiBoYXNhdHRyKHNlbGYuX19nZXRfbW9kdWxlKGZ1bGxuYW1lKSwgIl9fcGF0aF9fIikKCiAgICBkZWYgZ2V0X2NvZGUoc2VsZiwgZnVsbG5hbWUpOgogICAgICAgICIiIlJldHVybiBOb25lCgogICAgICAgIFJlcXVpcmVkLCBpZiBpc19wYWNrYWdlIGlzIGltcGxlbWVudGVkIiIiCiAgICAgICAgc2VsZi5fX2dldF9tb2R1bGUoZnVsbG5hbWUpICAjIGV2ZW50dWFsbHkgcmFpc2VzIEltcG9ydEVycm9yCiAgICAgICAgcmV0dXJuIE5vbmUKICAgIGdldF9zb3VyY2UgPSBnZXRfY29kZSAgIyBzYW1lIGFzIGdldF9jb2RlCgpfaW1wb3J0ZXIgPSBfU2l4TWV0YVBhdGhJbXBvcnRlcihfX25hbWVfXykKCgpjbGFzcyBfTW92ZWRJdGVtcyhfTGF6eU1vZHVsZSk6CgogICAgIiIiTGF6eSBsb2FkaW5nIG9mIG1vdmVkIG9iamVjdHMiIiIKICAgIF9fcGF0aF9fID0gW10gICMgbWFyayBhcyBwYWNrYWdlCgoKX21vdmVkX2F0dHJpYnV0ZXMgPSBbCiAgICBNb3ZlZEF0dHJpYnV0ZSgiY1N0cmluZ0lPIiwgImNTdHJpbmdJTyIsICJpbyIsICJTdHJpbmdJTyIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImZpbHRlciIsICJpdGVydG9vbHMiLCAiYnVpbHRpbnMiLCAiaWZpbHRlciIsICJmaWx0ZXIiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJmaWx0ZXJmYWxzZSIsICJpdGVydG9vbHMiLCAiaXRlcnRvb2xzIiwgImlmaWx0ZXJmYWxzZSIsICJmaWx0ZXJmYWxzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImlucHV0IiwgIl9fYnVpbHRpbl9fIiwgImJ1aWx0aW5zIiwgInJhd19pbnB1dCIsICJpbnB1dCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImludGVybiIsICJfX2J1aWx0aW5fXyIsICJzeXMiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJtYXAiLCAiaXRlcnRvb2xzIiwgImJ1aWx0aW5zIiwgImltYXAiLCAibWFwIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiZ2V0Y3dkIiwgIm9zIiwgIm9zIiwgImdldGN3ZHUiLCAiZ2V0Y3dkIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiZ2V0Y3dkYiIsICJvcyIsICJvcyIsICJnZXRjd2QiLCAiZ2V0Y3dkYiIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInJhbmdlIiwgIl9fYnVpbHRpbl9fIiwgImJ1aWx0aW5zIiwgInhyYW5nZSIsICJyYW5nZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInJlbG9hZF9tb2R1bGUiLCAiX19idWlsdGluX18iLCAiaW1wb3J0bGliIiBpZiBQWTM0IGVsc2UgImltcCIsICJyZWxvYWQiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJyZWR1Y2UiLCAiX19idWlsdGluX18iLCAiZnVuY3Rvb2xzIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgic2hsZXhfcXVvdGUiLCAicGlwZXMiLCAic2hsZXgiLCAicXVvdGUiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJTdHJpbmdJTyIsICJTdHJpbmdJTyIsICJpbyIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlVzZXJEaWN0IiwgIlVzZXJEaWN0IiwgImNvbGxlY3Rpb25zIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiVXNlckxpc3QiLCAiVXNlckxpc3QiLCAiY29sbGVjdGlvbnMiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJVc2VyU3RyaW5nIiwgIlVzZXJTdHJpbmciLCAiY29sbGVjdGlvbnMiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ4cmFuZ2UiLCAiX19idWlsdGluX18iLCAiYnVpbHRpbnMiLCAieHJhbmdlIiwgInJhbmdlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiemlwIiwgIml0ZXJ0b29scyIsICJidWlsdGlucyIsICJpemlwIiwgInppcCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInppcF9sb25nZXN0IiwgIml0ZXJ0b29scyIsICJpdGVydG9vbHMiLCAiaXppcF9sb25nZXN0IiwgInppcF9sb25nZXN0IiksCiAgICBNb3ZlZE1vZHVsZSgiYnVpbHRpbnMiLCAiX19idWlsdGluX18iKSwKICAgIE1vdmVkTW9kdWxlKCJjb25maWdwYXJzZXIiLCAiQ29uZmlnUGFyc2VyIiksCiAgICBNb3ZlZE1vZHVsZSgiY29weXJlZyIsICJjb3B5X3JlZyIpLAogICAgTW92ZWRNb2R1bGUoImRibV9nbnUiLCAiZ2RibSIsICJkYm0uZ251IiksCiAgICBNb3ZlZE1vZHVsZSgiX2R1bW15X3RocmVhZCIsICJkdW1teV90aHJlYWQiLCAiX2R1bW15X3RocmVhZCIpLAogICAgTW92ZWRNb2R1bGUoImh0dHBfY29va2llamFyIiwgImNvb2tpZWxpYiIsICJodHRwLmNvb2tpZWphciIpLAogICAgTW92ZWRNb2R1bGUoImh0dHBfY29va2llcyIsICJDb29raWUiLCAiaHR0cC5jb29raWVzIiksCiAgICBNb3ZlZE1vZHVsZSgiaHRtbF9lbnRpdGllcyIsICJodG1sZW50aXR5ZGVmcyIsICJodG1sLmVudGl0aWVzIiksCiAgICBNb3ZlZE1vZHVsZSgiaHRtbF9wYXJzZXIiLCAiSFRNTFBhcnNlciIsICJodG1sLnBhcnNlciIpLAogICAgTW92ZWRNb2R1bGUoImh0dHBfY2xpZW50IiwgImh0dHBsaWIiLCAiaHR0cC5jbGllbnQiKSwKICAgIE1vdmVkTW9kdWxlKCJlbWFpbF9taW1lX211bHRpcGFydCIsICJlbWFpbC5NSU1FTXVsdGlwYXJ0IiwgImVtYWlsLm1pbWUubXVsdGlwYXJ0IiksCiAgICBNb3ZlZE1vZHVsZSgiZW1haWxfbWltZV9ub25tdWx0aXBhcnQiLCAiZW1haWwuTUlNRU5vbk11bHRpcGFydCIsICJlbWFpbC5taW1lLm5vbm11bHRpcGFydCIpLAogICAgTW92ZWRNb2R1bGUoImVtYWlsX21pbWVfdGV4dCIsICJlbWFpbC5NSU1FVGV4dCIsICJlbWFpbC5taW1lLnRleHQiKSwKICAgIE1vdmVkTW9kdWxlKCJlbWFpbF9taW1lX2Jhc2UiLCAiZW1haWwuTUlNRUJhc2UiLCAiZW1haWwubWltZS5iYXNlIiksCiAgICBNb3ZlZE1vZHVsZSgiQmFzZUhUVFBTZXJ2ZXIiLCAiQmFzZUhUVFBTZXJ2ZXIiLCAiaHR0cC5zZXJ2ZXIiKSwKICAgIE1vdmVkTW9kdWxlKCJDR0lIVFRQU2VydmVyIiwgIkNHSUhUVFBTZXJ2ZXIiLCAiaHR0cC5zZXJ2ZXIiKSwKICAgIE1vdmVkTW9kdWxlKCJTaW1wbGVIVFRQU2VydmVyIiwgIlNpbXBsZUhUVFBTZXJ2ZXIiLCAiaHR0cC5zZXJ2ZXIiKSwKICAgIE1vdmVkTW9kdWxlKCJjUGlja2xlIiwgImNQaWNrbGUiLCAicGlja2xlIiksCiAgICBNb3ZlZE1vZHVsZSgicXVldWUiLCAiUXVldWUiKSwKICAgIE1vdmVkTW9kdWxlKCJyZXBybGliIiwgInJlcHIiKSwKICAgIE1vdmVkTW9kdWxlKCJzb2NrZXRzZXJ2ZXIiLCAiU29ja2V0U2VydmVyIiksCiAgICBNb3ZlZE1vZHVsZSgiX3RocmVhZCIsICJ0aHJlYWQiLCAiX3RocmVhZCIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXIiLCAiVGtpbnRlciIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfZGlhbG9nIiwgIkRpYWxvZyIsICJ0a2ludGVyLmRpYWxvZyIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfZmlsZWRpYWxvZyIsICJGaWxlRGlhbG9nIiwgInRraW50ZXIuZmlsZWRpYWxvZyIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfc2Nyb2xsZWR0ZXh0IiwgIlNjcm9sbGVkVGV4dCIsICJ0a2ludGVyLnNjcm9sbGVkdGV4dCIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfc2ltcGxlZGlhbG9nIiwgIlNpbXBsZURpYWxvZyIsICJ0a2ludGVyLnNpbXBsZWRpYWxvZyIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfdGl4IiwgIlRpeCIsICJ0a2ludGVyLnRpeCIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfdHRrIiwgInR0ayIsICJ0a2ludGVyLnR0ayIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfY29uc3RhbnRzIiwgIlRrY29uc3RhbnRzIiwgInRraW50ZXIuY29uc3RhbnRzIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl9kbmQiLCAiVGtkbmQiLCAidGtpbnRlci5kbmQiKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX2NvbG9yY2hvb3NlciIsICJ0a0NvbG9yQ2hvb3NlciIsCiAgICAgICAgICAgICAgICAidGtpbnRlci5jb2xvcmNob29zZXIiKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX2NvbW1vbmRpYWxvZyIsICJ0a0NvbW1vbkRpYWxvZyIsCiAgICAgICAgICAgICAgICAidGtpbnRlci5jb21tb25kaWFsb2ciKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX3RrZmlsZWRpYWxvZyIsICJ0a0ZpbGVEaWFsb2ciLCAidGtpbnRlci5maWxlZGlhbG9nIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl9mb250IiwgInRrRm9udCIsICJ0a2ludGVyLmZvbnQiKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX21lc3NhZ2Vib3giLCAidGtNZXNzYWdlQm94IiwgInRraW50ZXIubWVzc2FnZWJveCIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfdGtzaW1wbGVkaWFsb2ciLCAidGtTaW1wbGVEaWFsb2ciLAogICAgICAgICAgICAgICAgInRraW50ZXIuc2ltcGxlZGlhbG9nIiksCiAgICBNb3ZlZE1vZHVsZSgidXJsbGliX3BhcnNlIiwgX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYl9wYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkTW9kdWxlKCJ1cmxsaWJfZXJyb3IiLCBfX25hbWVfXyArICIubW92ZXMudXJsbGliX2Vycm9yIiwgInVybGxpYi5lcnJvciIpLAogICAgTW92ZWRNb2R1bGUoInVybGxpYiIsIF9fbmFtZV9fICsgIi5tb3Zlcy51cmxsaWIiLCBfX25hbWVfXyArICIubW92ZXMudXJsbGliIiksCiAgICBNb3ZlZE1vZHVsZSgidXJsbGliX3JvYm90cGFyc2VyIiwgInJvYm90cGFyc2VyIiwgInVybGxpYi5yb2JvdHBhcnNlciIpLAogICAgTW92ZWRNb2R1bGUoInhtbHJwY19jbGllbnQiLCAieG1scnBjbGliIiwgInhtbHJwYy5jbGllbnQiKSwKICAgIE1vdmVkTW9kdWxlKCJ4bWxycGNfc2VydmVyIiwgIlNpbXBsZVhNTFJQQ1NlcnZlciIsICJ4bWxycGMuc2VydmVyIiksCl0KIyBBZGQgd2luZG93cyBzcGVjaWZpYyBtb2R1bGVzLgppZiBzeXMucGxhdGZvcm0gPT0gIndpbjMyIjoKICAgIF9tb3ZlZF9hdHRyaWJ1dGVzICs9IFsKICAgICAgICBNb3ZlZE1vZHVsZSgid2lucmVnIiwgIl93aW5yZWciKSwKICAgIF0KCmZvciBhdHRyIGluIF9tb3ZlZF9hdHRyaWJ1dGVzOgogICAgc2V0YXR0cihfTW92ZWRJdGVtcywgYXR0ci5uYW1lLCBhdHRyKQogICAgaWYgaXNpbnN0YW5jZShhdHRyLCBNb3ZlZE1vZHVsZSk6CiAgICAgICAgX2ltcG9ydGVyLl9hZGRfbW9kdWxlKGF0dHIsICJtb3Zlcy4iICsgYXR0ci5uYW1lKQpkZWwgYXR0cgoKX01vdmVkSXRlbXMuX21vdmVkX2F0dHJpYnV0ZXMgPSBfbW92ZWRfYXR0cmlidXRlcwoKbW92ZXMgPSBfTW92ZWRJdGVtcyhfX25hbWVfXyArICIubW92ZXMiKQpfaW1wb3J0ZXIuX2FkZF9tb2R1bGUobW92ZXMsICJtb3ZlcyIpCgoKY2xhc3MgTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcGFyc2UoX0xhenlNb2R1bGUpOgoKICAgICIiIkxhenkgbG9hZGluZyBvZiBtb3ZlZCBvYmplY3RzIGluIHNpeC5tb3Zlcy51cmxsaWJfcGFyc2UiIiIKCgpfdXJsbGliX3BhcnNlX21vdmVkX2F0dHJpYnV0ZXMgPSBbCiAgICBNb3ZlZEF0dHJpYnV0ZSgiUGFyc2VSZXN1bHQiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiU3BsaXRSZXN1bHQiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgicGFyc2VfcXMiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgicGFyc2VfcXNsIiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVybGRlZnJhZyIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmxqb2luIiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVybHBhcnNlIiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVybHNwbGl0IiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVybHVucGFyc2UiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJsdW5zcGxpdCIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJxdW90ZSIsICJ1cmxsaWIiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgicXVvdGVfcGx1cyIsICJ1cmxsaWIiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidW5xdW90ZSIsICJ1cmxsaWIiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidW5xdW90ZV9wbHVzIiwgInVybGxpYiIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmxlbmNvZGUiLCAidXJsbGliIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInNwbGl0cXVlcnkiLCAidXJsbGliIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInNwbGl0dGFnIiwgInVybGxpYiIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJzcGxpdHVzZXIiLCAidXJsbGliIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVzZXNfZnJhZ21lbnQiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXNlc19uZXRsb2MiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXNlc19wYXJhbXMiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXNlc19xdWVyeSIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1c2VzX3JlbGF0aXZlIiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLApdCmZvciBhdHRyIGluIF91cmxsaWJfcGFyc2VfbW92ZWRfYXR0cmlidXRlczoKICAgIHNldGF0dHIoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcGFyc2UsIGF0dHIubmFtZSwgYXR0cikKZGVsIGF0dHIKCk1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3BhcnNlLl9tb3ZlZF9hdHRyaWJ1dGVzID0gX3VybGxpYl9wYXJzZV9tb3ZlZF9hdHRyaWJ1dGVzCgpfaW1wb3J0ZXIuX2FkZF9tb2R1bGUoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcGFyc2UoX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYl9wYXJzZSIpLAogICAgICAgICAgICAgICAgICAgICAgIm1vdmVzLnVybGxpYl9wYXJzZSIsICJtb3Zlcy51cmxsaWIucGFyc2UiKQoKCmNsYXNzIE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX2Vycm9yKF9MYXp5TW9kdWxlKToKCiAgICAiIiJMYXp5IGxvYWRpbmcgb2YgbW92ZWQgb2JqZWN0cyBpbiBzaXgubW92ZXMudXJsbGliX2Vycm9yIiIiCgoKX3VybGxpYl9lcnJvcl9tb3ZlZF9hdHRyaWJ1dGVzID0gWwogICAgTW92ZWRBdHRyaWJ1dGUoIlVSTEVycm9yIiwgInVybGxpYjIiLCAidXJsbGliLmVycm9yIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUEVycm9yIiwgInVybGxpYjIiLCAidXJsbGliLmVycm9yIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiQ29udGVudFRvb1Nob3J0RXJyb3IiLCAidXJsbGliIiwgInVybGxpYi5lcnJvciIpLApdCmZvciBhdHRyIGluIF91cmxsaWJfZXJyb3JfbW92ZWRfYXR0cmlidXRlczoKICAgIHNldGF0dHIoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfZXJyb3IsIGF0dHIubmFtZSwgYXR0cikKZGVsIGF0dHIKCk1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX2Vycm9yLl9tb3ZlZF9hdHRyaWJ1dGVzID0gX3VybGxpYl9lcnJvcl9tb3ZlZF9hdHRyaWJ1dGVzCgpfaW1wb3J0ZXIuX2FkZF9tb2R1bGUoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfZXJyb3IoX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYi5lcnJvciIpLAogICAgICAgICAgICAgICAgICAgICAgIm1vdmVzLnVybGxpYl9lcnJvciIsICJtb3Zlcy51cmxsaWIuZXJyb3IiKQoKCmNsYXNzIE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3JlcXVlc3QoX0xhenlNb2R1bGUpOgoKICAgICIiIkxhenkgbG9hZGluZyBvZiBtb3ZlZCBvYmplY3RzIGluIHNpeC5tb3Zlcy51cmxsaWJfcmVxdWVzdCIiIgoKCl91cmxsaWJfcmVxdWVzdF9tb3ZlZF9hdHRyaWJ1dGVzID0gWwogICAgTW92ZWRBdHRyaWJ1dGUoInVybG9wZW4iLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImluc3RhbGxfb3BlbmVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJidWlsZF9vcGVuZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInBhdGhuYW1lMnVybCIsICJ1cmxsaWIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmwycGF0aG5hbWUiLCAidXJsbGliIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiZ2V0cHJveGllcyIsICJ1cmxsaWIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJSZXF1ZXN0IiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJPcGVuZXJEaXJlY3RvciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUERlZmF1bHRFcnJvckhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBSZWRpcmVjdEhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBDb29raWVQcm9jZXNzb3IiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlByb3h5SGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiQmFzZUhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBQYXNzd29yZE1nciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUFBhc3N3b3JkTWdyV2l0aERlZmF1bHRSZWFsbSIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiQWJzdHJhY3RCYXNpY0F1dGhIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQQmFzaWNBdXRoSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiUHJveHlCYXNpY0F1dGhIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJBYnN0cmFjdERpZ2VzdEF1dGhIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQRGlnZXN0QXV0aEhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlByb3h5RGlnZXN0QXV0aEhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQU0hhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkZpbGVIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJGVFBIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJDYWNoZUZUUEhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlVua25vd25IYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQRXJyb3JQcm9jZXNzb3IiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVybHJldHJpZXZlIiwgInVybGxpYiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVybGNsZWFudXAiLCAidXJsbGliIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiVVJMb3BlbmVyIiwgInVybGxpYiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkZhbmN5VVJMb3BlbmVyIiwgInVybGxpYiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInByb3h5X2J5cGFzcyIsICJ1cmxsaWIiLCAidXJsbGliLnJlcXVlc3QiKSwKXQpmb3IgYXR0ciBpbiBfdXJsbGliX3JlcXVlc3RfbW92ZWRfYXR0cmlidXRlczoKICAgIHNldGF0dHIoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcmVxdWVzdCwgYXR0ci5uYW1lLCBhdHRyKQpkZWwgYXR0cgoKTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcmVxdWVzdC5fbW92ZWRfYXR0cmlidXRlcyA9IF91cmxsaWJfcmVxdWVzdF9tb3ZlZF9hdHRyaWJ1dGVzCgpfaW1wb3J0ZXIuX2FkZF9tb2R1bGUoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcmVxdWVzdChfX25hbWVfXyArICIubW92ZXMudXJsbGliLnJlcXVlc3QiKSwKICAgICAgICAgICAgICAgICAgICAgICJtb3Zlcy51cmxsaWJfcmVxdWVzdCIsICJtb3Zlcy51cmxsaWIucmVxdWVzdCIpCgoKY2xhc3MgTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcmVzcG9uc2UoX0xhenlNb2R1bGUpOgoKICAgICIiIkxhenkgbG9hZGluZyBvZiBtb3ZlZCBvYmplY3RzIGluIHNpeC5tb3Zlcy51cmxsaWJfcmVzcG9uc2UiIiIKCgpfdXJsbGliX3Jlc3BvbnNlX21vdmVkX2F0dHJpYnV0ZXMgPSBbCiAgICBNb3ZlZEF0dHJpYnV0ZSgiYWRkYmFzZSIsICJ1cmxsaWIiLCAidXJsbGliLnJlc3BvbnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiYWRkY2xvc2Vob29rIiwgInVybGxpYiIsICJ1cmxsaWIucmVzcG9uc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJhZGRpbmZvIiwgInVybGxpYiIsICJ1cmxsaWIucmVzcG9uc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJhZGRpbmZvdXJsIiwgInVybGxpYiIsICJ1cmxsaWIucmVzcG9uc2UiKSwKXQpmb3IgYXR0ciBpbiBfdXJsbGliX3Jlc3BvbnNlX21vdmVkX2F0dHJpYnV0ZXM6CiAgICBzZXRhdHRyKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3Jlc3BvbnNlLCBhdHRyLm5hbWUsIGF0dHIpCmRlbCBhdHRyCgpNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yZXNwb25zZS5fbW92ZWRfYXR0cmlidXRlcyA9IF91cmxsaWJfcmVzcG9uc2VfbW92ZWRfYXR0cmlidXRlcwoKX2ltcG9ydGVyLl9hZGRfbW9kdWxlKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3Jlc3BvbnNlKF9fbmFtZV9fICsgIi5tb3Zlcy51cmxsaWIucmVzcG9uc2UiKSwKICAgICAgICAgICAgICAgICAgICAgICJtb3Zlcy51cmxsaWJfcmVzcG9uc2UiLCAibW92ZXMudXJsbGliLnJlc3BvbnNlIikKCgpjbGFzcyBNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yb2JvdHBhcnNlcihfTGF6eU1vZHVsZSk6CgogICAgIiIiTGF6eSBsb2FkaW5nIG9mIG1vdmVkIG9iamVjdHMgaW4gc2l4Lm1vdmVzLnVybGxpYl9yb2JvdHBhcnNlciIiIgoKCl91cmxsaWJfcm9ib3RwYXJzZXJfbW92ZWRfYXR0cmlidXRlcyA9IFsKICAgIE1vdmVkQXR0cmlidXRlKCJSb2JvdEZpbGVQYXJzZXIiLCAicm9ib3RwYXJzZXIiLCAidXJsbGliLnJvYm90cGFyc2VyIiksCl0KZm9yIGF0dHIgaW4gX3VybGxpYl9yb2JvdHBhcnNlcl9tb3ZlZF9hdHRyaWJ1dGVzOgogICAgc2V0YXR0cihNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yb2JvdHBhcnNlciwgYXR0ci5uYW1lLCBhdHRyKQpkZWwgYXR0cgoKTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcm9ib3RwYXJzZXIuX21vdmVkX2F0dHJpYnV0ZXMgPSBfdXJsbGliX3JvYm90cGFyc2VyX21vdmVkX2F0dHJpYnV0ZXMKCl9pbXBvcnRlci5fYWRkX21vZHVsZShNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yb2JvdHBhcnNlcihfX25hbWVfXyArICIubW92ZXMudXJsbGliLnJvYm90cGFyc2VyIiksCiAgICAgICAgICAgICAgICAgICAgICAibW92ZXMudXJsbGliX3JvYm90cGFyc2VyIiwgIm1vdmVzLnVybGxpYi5yb2JvdHBhcnNlciIpCgoKY2xhc3MgTW9kdWxlX3NpeF9tb3Zlc191cmxsaWIodHlwZXMuTW9kdWxlVHlwZSk6CgogICAgIiIiQ3JlYXRlIGEgc2l4Lm1vdmVzLnVybGxpYiBuYW1lc3BhY2UgdGhhdCByZXNlbWJsZXMgdGhlIFB5dGhvbiAzIG5hbWVzcGFjZSIiIgogICAgX19wYXRoX18gPSBbXSAgIyBtYXJrIGFzIHBhY2thZ2UKICAgIHBhcnNlID0gX2ltcG9ydGVyLl9nZXRfbW9kdWxlKCJtb3Zlcy51cmxsaWJfcGFyc2UiKQogICAgZXJyb3IgPSBfaW1wb3J0ZXIuX2dldF9tb2R1bGUoIm1vdmVzLnVybGxpYl9lcnJvciIpCiAgICByZXF1ZXN0ID0gX2ltcG9ydGVyLl9nZXRfbW9kdWxlKCJtb3Zlcy51cmxsaWJfcmVxdWVzdCIpCiAgICByZXNwb25zZSA9IF9pbXBvcnRlci5fZ2V0X21vZHVsZSgibW92ZXMudXJsbGliX3Jlc3BvbnNlIikKICAgIHJvYm90cGFyc2VyID0gX2ltcG9ydGVyLl9nZXRfbW9kdWxlKCJtb3Zlcy51cmxsaWJfcm9ib3RwYXJzZXIiKQoKICAgIGRlZiBfX2Rpcl9fKHNlbGYpOgogICAgICAgIHJldHVybiBbJ3BhcnNlJywgJ2Vycm9yJywgJ3JlcXVlc3QnLCAncmVzcG9uc2UnLCAncm9ib3RwYXJzZXInXQoKX2ltcG9ydGVyLl9hZGRfbW9kdWxlKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliKF9fbmFtZV9fICsgIi5tb3Zlcy51cmxsaWIiKSwKICAgICAgICAgICAgICAgICAgICAgICJtb3Zlcy51cmxsaWIiKQoKCmRlZiBhZGRfbW92ZShtb3ZlKToKICAgICIiIkFkZCBhbiBpdGVtIHRvIHNpeC5tb3Zlcy4iIiIKICAgIHNldGF0dHIoX01vdmVkSXRlbXMsIG1vdmUubmFtZSwgbW92ZSkKCgpkZWYgcmVtb3ZlX21vdmUobmFtZSk6CiAgICAiIiJSZW1vdmUgaXRlbSBmcm9tIHNpeC5tb3Zlcy4iIiIKICAgIHRyeToKICAgICAgICBkZWxhdHRyKF9Nb3ZlZEl0ZW1zLCBuYW1lKQogICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgIHRyeToKICAgICAgICAgICAgZGVsIG1vdmVzLl9fZGljdF9fW25hbWVdCiAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcigibm8gc3VjaCBtb3ZlLCAlciIgJSAobmFtZSwpKQoKCmlmIFBZMzoKICAgIF9tZXRoX2Z1bmMgPSAiX19mdW5jX18iCiAgICBfbWV0aF9zZWxmID0gIl9fc2VsZl9fIgoKICAgIF9mdW5jX2Nsb3N1cmUgPSAiX19jbG9zdXJlX18iCiAgICBfZnVuY19jb2RlID0gIl9fY29kZV9fIgogICAgX2Z1bmNfZGVmYXVsdHMgPSAiX19kZWZhdWx0c19fIgogICAgX2Z1bmNfZ2xvYmFscyA9ICJfX2dsb2JhbHNfXyIKZWxzZToKICAgIF9tZXRoX2Z1bmMgPSAiaW1fZnVuYyIKICAgIF9tZXRoX3NlbGYgPSAiaW1fc2VsZiIKCiAgICBfZnVuY19jbG9zdXJlID0gImZ1bmNfY2xvc3VyZSIKICAgIF9mdW5jX2NvZGUgPSAiZnVuY19jb2RlIgogICAgX2Z1bmNfZGVmYXVsdHMgPSAiZnVuY19kZWZhdWx0cyIKICAgIF9mdW5jX2dsb2JhbHMgPSAiZnVuY19nbG9iYWxzIgoKCnRyeToKICAgIGFkdmFuY2VfaXRlcmF0b3IgPSBuZXh0CmV4Y2VwdCBOYW1lRXJyb3I6CiAgICBkZWYgYWR2YW5jZV9pdGVyYXRvcihpdCk6CiAgICAgICAgcmV0dXJuIGl0Lm5leHQoKQpuZXh0ID0gYWR2YW5jZV9pdGVyYXRvcgoKCnRyeToKICAgIGNhbGxhYmxlID0gY2FsbGFibGUKZXhjZXB0IE5hbWVFcnJvcjoKICAgIGRlZiBjYWxsYWJsZShvYmopOgogICAgICAgIHJldHVybiBhbnkoIl9fY2FsbF9fIiBpbiBrbGFzcy5fX2RpY3RfXyBmb3Iga2xhc3MgaW4gdHlwZShvYmopLl9fbXJvX18pCgoKaWYgUFkzOgogICAgZGVmIGdldF91bmJvdW5kX2Z1bmN0aW9uKHVuYm91bmQpOgogICAgICAgIHJldHVybiB1bmJvdW5kCgogICAgY3JlYXRlX2JvdW5kX21ldGhvZCA9IHR5cGVzLk1ldGhvZFR5cGUKCiAgICBkZWYgY3JlYXRlX3VuYm91bmRfbWV0aG9kKGZ1bmMsIGNscyk6CiAgICAgICAgcmV0dXJuIGZ1bmMKCiAgICBJdGVyYXRvciA9IG9iamVjdAplbHNlOgogICAgZGVmIGdldF91bmJvdW5kX2Z1bmN0aW9uKHVuYm91bmQpOgogICAgICAgIHJldHVybiB1bmJvdW5kLmltX2Z1bmMKCiAgICBkZWYgY3JlYXRlX2JvdW5kX21ldGhvZChmdW5jLCBvYmopOgogICAgICAgIHJldHVybiB0eXBlcy5NZXRob2RUeXBlKGZ1bmMsIG9iaiwgb2JqLl9fY2xhc3NfXykKCiAgICBkZWYgY3JlYXRlX3VuYm91bmRfbWV0aG9kKGZ1bmMsIGNscyk6CiAgICAgICAgcmV0dXJuIHR5cGVzLk1ldGhvZFR5cGUoZnVuYywgTm9uZSwgY2xzKQoKICAgIGNsYXNzIEl0ZXJhdG9yKG9iamVjdCk6CgogICAgICAgIGRlZiBuZXh0KHNlbGYpOgogICAgICAgICAgICByZXR1cm4gdHlwZShzZWxmKS5fX25leHRfXyhzZWxmKQoKICAgIGNhbGxhYmxlID0gY2FsbGFibGUKX2FkZF9kb2MoZ2V0X3VuYm91bmRfZnVuY3Rpb24sCiAgICAgICAgICIiIkdldCB0aGUgZnVuY3Rpb24gb3V0IG9mIGEgcG9zc2libHkgdW5ib3VuZCBmdW5jdGlvbiIiIikKCgpnZXRfbWV0aG9kX2Z1bmN0aW9uID0gb3BlcmF0b3IuYXR0cmdldHRlcihfbWV0aF9mdW5jKQpnZXRfbWV0aG9kX3NlbGYgPSBvcGVyYXRvci5hdHRyZ2V0dGVyKF9tZXRoX3NlbGYpCmdldF9mdW5jdGlvbl9jbG9zdXJlID0gb3BlcmF0b3IuYXR0cmdldHRlcihfZnVuY19jbG9zdXJlKQpnZXRfZnVuY3Rpb25fY29kZSA9IG9wZXJhdG9yLmF0dHJnZXR0ZXIoX2Z1bmNfY29kZSkKZ2V0X2Z1bmN0aW9uX2RlZmF1bHRzID0gb3BlcmF0b3IuYXR0cmdldHRlcihfZnVuY19kZWZhdWx0cykKZ2V0X2Z1bmN0aW9uX2dsb2JhbHMgPSBvcGVyYXRvci5hdHRyZ2V0dGVyKF9mdW5jX2dsb2JhbHMpCgoKaWYgUFkzOgogICAgZGVmIGl0ZXJrZXlzKGQsICoqa3cpOgogICAgICAgIHJldHVybiBpdGVyKGQua2V5cygqKmt3KSkKCiAgICBkZWYgaXRlcnZhbHVlcyhkLCAqKmt3KToKICAgICAgICByZXR1cm4gaXRlcihkLnZhbHVlcygqKmt3KSkKCiAgICBkZWYgaXRlcml0ZW1zKGQsICoqa3cpOgogICAgICAgIHJldHVybiBpdGVyKGQuaXRlbXMoKiprdykpCgogICAgZGVmIGl0ZXJsaXN0cyhkLCAqKmt3KToKICAgICAgICByZXR1cm4gaXRlcihkLmxpc3RzKCoqa3cpKQoKICAgIHZpZXdrZXlzID0gb3BlcmF0b3IubWV0aG9kY2FsbGVyKCJrZXlzIikKCiAgICB2aWV3dmFsdWVzID0gb3BlcmF0b3IubWV0aG9kY2FsbGVyKCJ2YWx1ZXMiKQoKICAgIHZpZXdpdGVtcyA9IG9wZXJhdG9yLm1ldGhvZGNhbGxlcigiaXRlbXMiKQplbHNlOgogICAgZGVmIGl0ZXJrZXlzKGQsICoqa3cpOgogICAgICAgIHJldHVybiBkLml0ZXJrZXlzKCoqa3cpCgogICAgZGVmIGl0ZXJ2YWx1ZXMoZCwgKiprdyk6CiAgICAgICAgcmV0dXJuIGQuaXRlcnZhbHVlcygqKmt3KQoKICAgIGRlZiBpdGVyaXRlbXMoZCwgKiprdyk6CiAgICAgICAgcmV0dXJuIGQuaXRlcml0ZW1zKCoqa3cpCgogICAgZGVmIGl0ZXJsaXN0cyhkLCAqKmt3KToKICAgICAgICByZXR1cm4gZC5pdGVybGlzdHMoKiprdykKCiAgICB2aWV3a2V5cyA9IG9wZXJhdG9yLm1ldGhvZGNhbGxlcigidmlld2tleXMiKQoKICAgIHZpZXd2YWx1ZXMgPSBvcGVyYXRvci5tZXRob2RjYWxsZXIoInZpZXd2YWx1ZXMiKQoKICAgIHZpZXdpdGVtcyA9IG9wZXJhdG9yLm1ldGhvZGNhbGxlcigidmlld2l0ZW1zIikKCl9hZGRfZG9jKGl0ZXJrZXlzLCAiUmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGtleXMgb2YgYSBkaWN0aW9uYXJ5LiIpCl9hZGRfZG9jKGl0ZXJ2YWx1ZXMsICJSZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciB0aGUgdmFsdWVzIG9mIGEgZGljdGlvbmFyeS4iKQpfYWRkX2RvYyhpdGVyaXRlbXMsCiAgICAgICAgICJSZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciB0aGUgKGtleSwgdmFsdWUpIHBhaXJzIG9mIGEgZGljdGlvbmFyeS4iKQpfYWRkX2RvYyhpdGVybGlzdHMsCiAgICAgICAgICJSZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciB0aGUgKGtleSwgW3ZhbHVlc10pIHBhaXJzIG9mIGEgZGljdGlvbmFyeS4iKQoKCmlmIFBZMzoKICAgIGRlZiBiKHMpOgogICAgICAgIHJldHVybiBzLmVuY29kZSgibGF0aW4tMSIpCgogICAgZGVmIHUocyk6CiAgICAgICAgcmV0dXJuIHMKICAgIHVuaWNociA9IGNocgogICAgaW1wb3J0IHN0cnVjdAogICAgaW50MmJ5dGUgPSBzdHJ1Y3QuU3RydWN0KCI+QiIpLnBhY2sKICAgIGRlbCBzdHJ1Y3QKICAgIGJ5dGUyaW50ID0gb3BlcmF0b3IuaXRlbWdldHRlcigwKQogICAgaW5kZXhieXRlcyA9IG9wZXJhdG9yLmdldGl0ZW0KICAgIGl0ZXJieXRlcyA9IGl0ZXIKICAgIGltcG9ydCBpbwogICAgU3RyaW5nSU8gPSBpby5TdHJpbmdJTwogICAgQnl0ZXNJTyA9IGlvLkJ5dGVzSU8KICAgIF9hc3NlcnRDb3VudEVxdWFsID0gImFzc2VydENvdW50RXF1YWwiCiAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzFdIDw9IDE6CiAgICAgICAgX2Fzc2VydFJhaXNlc1JlZ2V4ID0gImFzc2VydFJhaXNlc1JlZ2V4cCIKICAgICAgICBfYXNzZXJ0UmVnZXggPSAiYXNzZXJ0UmVnZXhwTWF0Y2hlcyIKICAgIGVsc2U6CiAgICAgICAgX2Fzc2VydFJhaXNlc1JlZ2V4ID0gImFzc2VydFJhaXNlc1JlZ2V4IgogICAgICAgIF9hc3NlcnRSZWdleCA9ICJhc3NlcnRSZWdleCIKZWxzZToKICAgIGRlZiBiKHMpOgogICAgICAgIHJldHVybiBzCiAgICAjIFdvcmthcm91bmQgZm9yIHN0YW5kYWxvbmUgYmFja3NsYXNoCgogICAgZGVmIHUocyk6CiAgICAgICAgcmV0dXJuIHVuaWNvZGUocy5yZXBsYWNlKHInXFwnLCByJ1xcXFwnKSwgInVuaWNvZGVfZXNjYXBlIikKICAgIHVuaWNociA9IHVuaWNocgogICAgaW50MmJ5dGUgPSBjaHIKCiAgICBkZWYgYnl0ZTJpbnQoYnMpOgogICAgICAgIHJldHVybiBvcmQoYnNbMF0pCgogICAgZGVmIGluZGV4Ynl0ZXMoYnVmLCBpKToKICAgICAgICByZXR1cm4gb3JkKGJ1ZltpXSkKICAgIGl0ZXJieXRlcyA9IGZ1bmN0b29scy5wYXJ0aWFsKGl0ZXJ0b29scy5pbWFwLCBvcmQpCiAgICBpbXBvcnQgU3RyaW5nSU8KICAgIFN0cmluZ0lPID0gQnl0ZXNJTyA9IFN0cmluZ0lPLlN0cmluZ0lPCiAgICBfYXNzZXJ0Q291bnRFcXVhbCA9ICJhc3NlcnRJdGVtc0VxdWFsIgogICAgX2Fzc2VydFJhaXNlc1JlZ2V4ID0gImFzc2VydFJhaXNlc1JlZ2V4cCIKICAgIF9hc3NlcnRSZWdleCA9ICJhc3NlcnRSZWdleHBNYXRjaGVzIgpfYWRkX2RvYyhiLCAiIiJCeXRlIGxpdGVyYWwiIiIpCl9hZGRfZG9jKHUsICIiIlRleHQgbGl0ZXJhbCIiIikKCgpkZWYgYXNzZXJ0Q291bnRFcXVhbChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgcmV0dXJuIGdldGF0dHIoc2VsZiwgX2Fzc2VydENvdW50RXF1YWwpKCphcmdzLCAqKmt3YXJncykKCgpkZWYgYXNzZXJ0UmFpc2VzUmVnZXgoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgIHJldHVybiBnZXRhdHRyKHNlbGYsIF9hc3NlcnRSYWlzZXNSZWdleCkoKmFyZ3MsICoqa3dhcmdzKQoKCmRlZiBhc3NlcnRSZWdleChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgcmV0dXJuIGdldGF0dHIoc2VsZiwgX2Fzc2VydFJlZ2V4KSgqYXJncywgKiprd2FyZ3MpCgoKaWYgUFkzOgogICAgZXhlY18gPSBnZXRhdHRyKG1vdmVzLmJ1aWx0aW5zLCAiZXhlYyIpCgogICAgZGVmIHJlcmFpc2UodHAsIHZhbHVlLCB0Yj1Ob25lKToKICAgICAgICBpZiB2YWx1ZSBpcyBOb25lOgogICAgICAgICAgICB2YWx1ZSA9IHRwKCkKICAgICAgICBpZiB2YWx1ZS5fX3RyYWNlYmFja19fIGlzIG5vdCB0YjoKICAgICAgICAgICAgcmFpc2UgdmFsdWUud2l0aF90cmFjZWJhY2sodGIpCiAgICAgICAgcmFpc2UgdmFsdWUKCmVsc2U6CiAgICBkZWYgZXhlY18oX2NvZGVfLCBfZ2xvYnNfPU5vbmUsIF9sb2NzXz1Ob25lKToKICAgICAgICAiIiJFeGVjdXRlIGNvZGUgaW4gYSBuYW1lc3BhY2UuIiIiCiAgICAgICAgaWYgX2dsb2JzXyBpcyBOb25lOgogICAgICAgICAgICBmcmFtZSA9IHN5cy5fZ2V0ZnJhbWUoMSkKICAgICAgICAgICAgX2dsb2JzXyA9IGZyYW1lLmZfZ2xvYmFscwogICAgICAgICAgICBpZiBfbG9jc18gaXMgTm9uZToKICAgICAgICAgICAgICAgIF9sb2NzXyA9IGZyYW1lLmZfbG9jYWxzCiAgICAgICAgICAgIGRlbCBmcmFtZQogICAgICAgIGVsaWYgX2xvY3NfIGlzIE5vbmU6CiAgICAgICAgICAgIF9sb2NzXyA9IF9nbG9ic18KICAgICAgICBleGVjKCIiImV4ZWMgX2NvZGVfIGluIF9nbG9ic18sIF9sb2NzXyIiIikKCiAgICBleGVjXygiIiJkZWYgcmVyYWlzZSh0cCwgdmFsdWUsIHRiPU5vbmUpOgogICAgcmFpc2UgdHAsIHZhbHVlLCB0YgoiIiIpCgoKaWYgc3lzLnZlcnNpb25faW5mb1s6Ml0gPT0gKDMsIDIpOgogICAgZXhlY18oIiIiZGVmIHJhaXNlX2Zyb20odmFsdWUsIGZyb21fdmFsdWUpOgogICAgaWYgZnJvbV92YWx1ZSBpcyBOb25lOgogICAgICAgIHJhaXNlIHZhbHVlCiAgICByYWlzZSB2YWx1ZSBmcm9tIGZyb21fdmFsdWUKIiIiKQplbGlmIHN5cy52ZXJzaW9uX2luZm9bOjJdID4gKDMsIDIpOgogICAgZXhlY18oIiIiZGVmIHJhaXNlX2Zyb20odmFsdWUsIGZyb21fdmFsdWUpOgogICAgcmFpc2UgdmFsdWUgZnJvbSBmcm9tX3ZhbHVlCiIiIikKZWxzZToKICAgIGRlZiByYWlzZV9mcm9tKHZhbHVlLCBmcm9tX3ZhbHVlKToKICAgICAgICByYWlzZSB2YWx1ZQoKCnByaW50XyA9IGdldGF0dHIobW92ZXMuYnVpbHRpbnMsICJwcmludCIsIE5vbmUpCmlmIHByaW50XyBpcyBOb25lOgogICAgZGVmIHByaW50XygqYXJncywgKiprd2FyZ3MpOgogICAgICAgICIiIlRoZSBuZXctc3R5bGUgcHJpbnQgZnVuY3Rpb24gZm9yIFB5dGhvbiAyLjQgYW5kIDIuNS4iIiIKICAgICAgICBmcCA9IGt3YXJncy5wb3AoImZpbGUiLCBzeXMuc3Rkb3V0KQogICAgICAgIGlmIGZwIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBkZWYgd3JpdGUoZGF0YSk6CiAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGRhdGEsIGJhc2VzdHJpbmcpOgogICAgICAgICAgICAgICAgZGF0YSA9IHN0cihkYXRhKQogICAgICAgICAgICAjIElmIHRoZSBmaWxlIGhhcyBhbiBlbmNvZGluZywgZW5jb2RlIHVuaWNvZGUgd2l0aCBpdC4KICAgICAgICAgICAgaWYgKGlzaW5zdGFuY2UoZnAsIGZpbGUpIGFuZAogICAgICAgICAgICAgICAgICAgIGlzaW5zdGFuY2UoZGF0YSwgdW5pY29kZSkgYW5kCiAgICAgICAgICAgICAgICAgICAgZnAuZW5jb2RpbmcgaXMgbm90IE5vbmUpOgogICAgICAgICAgICAgICAgZXJyb3JzID0gZ2V0YXR0cihmcCwgImVycm9ycyIsIE5vbmUpCiAgICAgICAgICAgICAgICBpZiBlcnJvcnMgaXMgTm9uZToKICAgICAgICAgICAgICAgICAgICBlcnJvcnMgPSAic3RyaWN0IgogICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEuZW5jb2RlKGZwLmVuY29kaW5nLCBlcnJvcnMpCiAgICAgICAgICAgIGZwLndyaXRlKGRhdGEpCiAgICAgICAgd2FudF91bmljb2RlID0gRmFsc2UKICAgICAgICBzZXAgPSBrd2FyZ3MucG9wKCJzZXAiLCBOb25lKQogICAgICAgIGlmIHNlcCBpcyBub3QgTm9uZToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShzZXAsIHVuaWNvZGUpOgogICAgICAgICAgICAgICAgd2FudF91bmljb2RlID0gVHJ1ZQogICAgICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKHNlcCwgc3RyKToKICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigic2VwIG11c3QgYmUgTm9uZSBvciBhIHN0cmluZyIpCiAgICAgICAgZW5kID0ga3dhcmdzLnBvcCgiZW5kIiwgTm9uZSkKICAgICAgICBpZiBlbmQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZW5kLCB1bmljb2RlKToKICAgICAgICAgICAgICAgIHdhbnRfdW5pY29kZSA9IFRydWUKICAgICAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZShlbmQsIHN0cik6CiAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoImVuZCBtdXN0IGJlIE5vbmUgb3IgYSBzdHJpbmciKQogICAgICAgIGlmIGt3YXJnczoKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJpbnZhbGlkIGtleXdvcmQgYXJndW1lbnRzIHRvIHByaW50KCkiKQogICAgICAgIGlmIG5vdCB3YW50X3VuaWNvZGU6CiAgICAgICAgICAgIGZvciBhcmcgaW4gYXJnczoKICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoYXJnLCB1bmljb2RlKToKICAgICAgICAgICAgICAgICAgICB3YW50X3VuaWNvZGUgPSBUcnVlCiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICBpZiB3YW50X3VuaWNvZGU6CiAgICAgICAgICAgIG5ld2xpbmUgPSB1bmljb2RlKCJcbiIpCiAgICAgICAgICAgIHNwYWNlID0gdW5pY29kZSgiICIpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbmV3bGluZSA9ICJcbiIKICAgICAgICAgICAgc3BhY2UgPSAiICIKICAgICAgICBpZiBzZXAgaXMgTm9uZToKICAgICAgICAgICAgc2VwID0gc3BhY2UKICAgICAgICBpZiBlbmQgaXMgTm9uZToKICAgICAgICAgICAgZW5kID0gbmV3bGluZQogICAgICAgIGZvciBpLCBhcmcgaW4gZW51bWVyYXRlKGFyZ3MpOgogICAgICAgICAgICBpZiBpOgogICAgICAgICAgICAgICAgd3JpdGUoc2VwKQogICAgICAgICAgICB3cml0ZShhcmcpCiAgICAgICAgd3JpdGUoZW5kKQppZiBzeXMudmVyc2lvbl9pbmZvWzoyXSA8ICgzLCAzKToKICAgIF9wcmludCA9IHByaW50XwoKICAgIGRlZiBwcmludF8oKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICBmcCA9IGt3YXJncy5nZXQoImZpbGUiLCBzeXMuc3Rkb3V0KQogICAgICAgIGZsdXNoID0ga3dhcmdzLnBvcCgiZmx1c2giLCBGYWxzZSkKICAgICAgICBfcHJpbnQoKmFyZ3MsICoqa3dhcmdzKQogICAgICAgIGlmIGZsdXNoIGFuZCBmcCBpcyBub3QgTm9uZToKICAgICAgICAgICAgZnAuZmx1c2goKQoKX2FkZF9kb2MocmVyYWlzZSwgIiIiUmVyYWlzZSBhbiBleGNlcHRpb24uIiIiKQoKaWYgc3lzLnZlcnNpb25faW5mb1swOjJdIDwgKDMsIDQpOgogICAgZGVmIHdyYXBzKHdyYXBwZWQsIGFzc2lnbmVkPWZ1bmN0b29scy5XUkFQUEVSX0FTU0lHTk1FTlRTLAogICAgICAgICAgICAgIHVwZGF0ZWQ9ZnVuY3Rvb2xzLldSQVBQRVJfVVBEQVRFUyk6CiAgICAgICAgZGVmIHdyYXBwZXIoZik6CiAgICAgICAgICAgIGYgPSBmdW5jdG9vbHMud3JhcHMod3JhcHBlZCwgYXNzaWduZWQsIHVwZGF0ZWQpKGYpCiAgICAgICAgICAgIGYuX193cmFwcGVkX18gPSB3cmFwcGVkCiAgICAgICAgICAgIHJldHVybiBmCiAgICAgICAgcmV0dXJuIHdyYXBwZXIKZWxzZToKICAgIHdyYXBzID0gZnVuY3Rvb2xzLndyYXBzCgoKZGVmIHdpdGhfbWV0YWNsYXNzKG1ldGEsICpiYXNlcyk6CiAgICAiIiJDcmVhdGUgYSBiYXNlIGNsYXNzIHdpdGggYSBtZXRhY2xhc3MuIiIiCiAgICAjIFRoaXMgcmVxdWlyZXMgYSBiaXQgb2YgZXhwbGFuYXRpb246IHRoZSBiYXNpYyBpZGVhIGlzIHRvIG1ha2UgYSBkdW1teQogICAgIyBtZXRhY2xhc3MgZm9yIG9uZSBsZXZlbCBvZiBjbGFzcyBpbnN0YW50aWF0aW9uIHRoYXQgcmVwbGFjZXMgaXRzZWxmIHdpdGgKICAgICMgdGhlIGFjdHVhbCBtZXRhY2xhc3MuCiAgICBjbGFzcyBtZXRhY2xhc3MobWV0YSk6CgogICAgICAgIGRlZiBfX25ld19fKGNscywgbmFtZSwgdGhpc19iYXNlcywgZCk6CiAgICAgICAgICAgIHJldHVybiBtZXRhKG5hbWUsIGJhc2VzLCBkKQogICAgcmV0dXJuIHR5cGUuX19uZXdfXyhtZXRhY2xhc3MsICd0ZW1wb3JhcnlfY2xhc3MnLCAoKSwge30pCgoKZGVmIGFkZF9tZXRhY2xhc3MobWV0YWNsYXNzKToKICAgICIiIkNsYXNzIGRlY29yYXRvciBmb3IgY3JlYXRpbmcgYSBjbGFzcyB3aXRoIGEgbWV0YWNsYXNzLiIiIgogICAgZGVmIHdyYXBwZXIoY2xzKToKICAgICAgICBvcmlnX3ZhcnMgPSBjbHMuX19kaWN0X18uY29weSgpCiAgICAgICAgc2xvdHMgPSBvcmlnX3ZhcnMuZ2V0KCdfX3Nsb3RzX18nKQogICAgICAgIGlmIHNsb3RzIGlzIG5vdCBOb25lOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHNsb3RzLCBzdHIpOgogICAgICAgICAgICAgICAgc2xvdHMgPSBbc2xvdHNdCiAgICAgICAgICAgIGZvciBzbG90c192YXIgaW4gc2xvdHM6CiAgICAgICAgICAgICAgICBvcmlnX3ZhcnMucG9wKHNsb3RzX3ZhcikKICAgICAgICBvcmlnX3ZhcnMucG9wKCdfX2RpY3RfXycsIE5vbmUpCiAgICAgICAgb3JpZ192YXJzLnBvcCgnX193ZWFrcmVmX18nLCBOb25lKQogICAgICAgIHJldHVybiBtZXRhY2xhc3MoY2xzLl9fbmFtZV9fLCBjbHMuX19iYXNlc19fLCBvcmlnX3ZhcnMpCiAgICByZXR1cm4gd3JhcHBlcgoKCmRlZiBweXRob25fMl91bmljb2RlX2NvbXBhdGlibGUoa2xhc3MpOgogICAgIiIiCiAgICBBIGRlY29yYXRvciB0aGF0IGRlZmluZXMgX191bmljb2RlX18gYW5kIF9fc3RyX18gbWV0aG9kcyB1bmRlciBQeXRob24gMi4KICAgIFVuZGVyIFB5dGhvbiAzIGl0IGRvZXMgbm90aGluZy4KCiAgICBUbyBzdXBwb3J0IFB5dGhvbiAyIGFuZCAzIHdpdGggYSBzaW5nbGUgY29kZSBiYXNlLCBkZWZpbmUgYSBfX3N0cl9fIG1ldGhvZAogICAgcmV0dXJuaW5nIHRleHQgYW5kIGFwcGx5IHRoaXMgZGVjb3JhdG9yIHRvIHRoZSBjbGFzcy4KICAgICIiIgogICAgaWYgUFkyOgogICAgICAgIGlmICdfX3N0cl9fJyBub3QgaW4ga2xhc3MuX19kaWN0X186CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkBweXRob25fMl91bmljb2RlX2NvbXBhdGlibGUgY2Fubm90IGJlIGFwcGxpZWQgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0byAlcyBiZWNhdXNlIGl0IGRvZXNuJ3QgZGVmaW5lIF9fc3RyX18oKS4iICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbGFzcy5fX25hbWVfXykKICAgICAgICBrbGFzcy5fX3VuaWNvZGVfXyA9IGtsYXNzLl9fc3RyX18KICAgICAgICBrbGFzcy5fX3N0cl9fID0gbGFtYmRhIHNlbGY6IHNlbGYuX191bmljb2RlX18oKS5lbmNvZGUoJ3V0Zi04JykKICAgIHJldHVybiBrbGFzcwoKCiMgQ29tcGxldGUgdGhlIG1vdmVzIGltcGxlbWVudGF0aW9uLgojIFRoaXMgY29kZSBpcyBhdCB0aGUgZW5kIG9mIHRoaXMgbW9kdWxlIHRvIHNwZWVkIHVwIG1vZHVsZSBsb2FkaW5nLgojIFR1cm4gdGhpcyBtb2R1bGUgaW50byBhIHBhY2thZ2UuCl9fcGF0aF9fID0gW10gICMgcmVxdWlyZWQgZm9yIFBFUCAzMDIgYW5kIFBFUCA0NTEKX19wYWNrYWdlX18gPSBfX25hbWVfXyAgIyBzZWUgUEVQIDM2NiBAUmVzZXJ2ZWRBc3NpZ25tZW50CmlmIGdsb2JhbHMoKS5nZXQoIl9fc3BlY19fIikgaXMgbm90IE5vbmU6CiAgICBfX3NwZWNfXy5zdWJtb2R1bGVfc2VhcmNoX2xvY2F0aW9ucyA9IFtdICAjIFBFUCA0NTEgQFVuZGVmaW5lZFZhcmlhYmxlCiMgUmVtb3ZlIG90aGVyIHNpeCBtZXRhIHBhdGggaW1wb3J0ZXJzLCBzaW5jZSB0aGV5IGNhdXNlIHByb2JsZW1zLiBUaGlzIGNhbgojIGhhcHBlbiBpZiBzaXggaXMgcmVtb3ZlZCBmcm9tIHN5cy5tb2R1bGVzIGFuZCB0aGVuIHJlbG9hZGVkLiAoU2V0dXB0b29scyBkb2VzCiMgdGhpcyBmb3Igc29tZSByZWFzb24uKQppZiBzeXMubWV0YV9wYXRoOgogICAgZm9yIGksIGltcG9ydGVyIGluIGVudW1lcmF0ZShzeXMubWV0YV9wYXRoKToKICAgICAgICAjIEhlcmUncyBzb21lIHJlYWwgbmFzdGluZXNzOiBBbm90aGVyICJpbnN0YW5jZSIgb2YgdGhlIHNpeCBtb2R1bGUgbWlnaHQKICAgICAgICAjIGJlIGZsb2F0aW5nIGFyb3VuZC4gVGhlcmVmb3JlLCB3ZSBjYW4ndCB1c2UgaXNpbnN0YW5jZSgpIHRvIGNoZWNrIGZvcgogICAgICAgICMgdGhlIHNpeCBtZXRhIHBhdGggaW1wb3J0ZXIsIHNpbmNlIHRoZSBvdGhlciBzaXggaW5zdGFuY2Ugd2lsbCBoYXZlCiAgICAgICAgIyBpbnNlcnRlZCBhbiBpbXBvcnRlciB3aXRoIGRpZmZlcmVudCBjbGFzcy4KICAgICAgICBpZiAodHlwZShpbXBvcnRlcikuX19uYW1lX18gPT0gIl9TaXhNZXRhUGF0aEltcG9ydGVyIiBhbmQKICAgICAgICAgICAgICAgIGltcG9ydGVyLm5hbWUgPT0gX19uYW1lX18pOgogICAgICAgICAgICBkZWwgc3lzLm1ldGFfcGF0aFtpXQogICAgICAgICAgICBicmVhawogICAgZGVsIGksIGltcG9ydGVyCiMgRmluYWxseSwgYWRkIHRoZSBpbXBvcnRlciB0byB0aGUgbWV0YSBwYXRoIGltcG9ydCBob29rLgpzeXMubWV0YV9wYXRoLmFwcGVuZChfaW1wb3J0ZXIpClBLAwQUAAAAAAAAACEA+23K5bACAACwAgAAWAAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9wYWNrYWdlcy9zc2xfbWF0Y2hfaG9zdG5hbWUvX19pbml0X18ucHlpbXBvcnQgc3lzCgp0cnk6CiAgICAjIE91ciBtYXRjaF9ob3N0bmFtZSBmdW5jdGlvbiBpcyB0aGUgc2FtZSBhcyAzLjUncywgc28gd2Ugb25seSB3YW50IHRvCiAgICAjIGltcG9ydCB0aGUgbWF0Y2hfaG9zdG5hbWUgZnVuY3Rpb24gaWYgaXQncyBhdCBsZWFzdCB0aGF0IGdvb2QuCiAgICBpZiBzeXMudmVyc2lvbl9pbmZvIDwgKDMsIDUpOgogICAgICAgIHJhaXNlIEltcG9ydEVycm9yKCJGYWxsYmFjayB0byB2ZW5kb3JlZCBjb2RlIikKCiAgICBmcm9tIHNzbCBpbXBvcnQgQ2VydGlmaWNhdGVFcnJvciwgbWF0Y2hfaG9zdG5hbWUKZXhjZXB0IEltcG9ydEVycm9yOgogICAgdHJ5OgogICAgICAgICMgQmFja3BvcnQgb2YgdGhlIGZ1bmN0aW9uIGZyb20gYSBweXBpIG1vZHVsZQogICAgICAgIGZyb20gYmFja3BvcnRzLnNzbF9tYXRjaF9ob3N0bmFtZSBpbXBvcnQgQ2VydGlmaWNhdGVFcnJvciwgbWF0Y2hfaG9zdG5hbWUKICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICAjIE91ciB2ZW5kb3JlZCBjb3B5CiAgICAgICAgZnJvbSAuX2ltcGxlbWVudGF0aW9uIGltcG9ydCBDZXJ0aWZpY2F0ZUVycm9yLCBtYXRjaF9ob3N0bmFtZQoKIyBOb3QgbmVlZGVkLCBidXQgZG9jdW1lbnRpbmcgd2hhdCB3ZSBwcm92aWRlLgpfX2FsbF9fID0gKCdDZXJ0aWZpY2F0ZUVycm9yJywgJ21hdGNoX2hvc3RuYW1lJykKUEsDBBQAAAAAAAAAIQC1Oo8rRhYAAEYWAABfAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL3BhY2thZ2VzL3NzbF9tYXRjaF9ob3N0bmFtZS9faW1wbGVtZW50YXRpb24ucHkiIiJUaGUgbWF0Y2hfaG9zdG5hbWUoKSBmdW5jdGlvbiBmcm9tIFB5dGhvbiAzLjMuMywgZXNzZW50aWFsIHdoZW4gdXNpbmcgU1NMLiIiIgoKIyBOb3RlOiBUaGlzIGZpbGUgaXMgdW5kZXIgdGhlIFBTRiBsaWNlbnNlIGFzIHRoZSBjb2RlIGNvbWVzIGZyb20gdGhlIHB5dGhvbgojIHN0ZGxpYi4gICBodHRwOi8vZG9jcy5weXRob24ub3JnLzMvbGljZW5zZS5odG1sCgppbXBvcnQgcmUKaW1wb3J0IHN5cwoKIyBpcGFkZHJlc3MgaGFzIGJlZW4gYmFja3BvcnRlZCB0byAyLjYrIGluIHB5cGkuICBJZiBpdCBpcyBpbnN0YWxsZWQgb24gdGhlCiMgc3lzdGVtLCB1c2UgaXQgdG8gaGFuZGxlIElQQWRkcmVzcyBTZXJ2ZXJBbHRuYW1lcyAodGhpcyB3YXMgYWRkZWQgaW4KIyBweXRob24tMy41KSBvdGhlcndpc2Ugb25seSBkbyBETlMgbWF0Y2hpbmcuICBUaGlzIGFsbG93cwojIGJhY2twb3J0cy5zc2xfbWF0Y2hfaG9zdG5hbWUgdG8gY29udGludWUgdG8gYmUgdXNlZCBhbGwgdGhlIHdheSBiYWNrIHRvCiMgcHl0aG9uLTIuNC4KdHJ5OgogICAgaW1wb3J0IGlwYWRkcmVzcwpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBpcGFkZHJlc3MgPSBOb25lCgpfX3ZlcnNpb25fXyA9ICczLjUuMC4xJwoKCmNsYXNzIENlcnRpZmljYXRlRXJyb3IoVmFsdWVFcnJvcik6CiAgICBwYXNzCgoKZGVmIF9kbnNuYW1lX21hdGNoKGRuLCBob3N0bmFtZSwgbWF4X3dpbGRjYXJkcz0xKToKICAgICIiIk1hdGNoaW5nIGFjY29yZGluZyB0byBSRkMgNjEyNSwgc2VjdGlvbiA2LjQuMwoKICAgIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzYxMjUjc2VjdGlvbi02LjQuMwogICAgIiIiCiAgICBwYXRzID0gW10KICAgIGlmIG5vdCBkbjoKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAjIFBvcnRlZCBmcm9tIHB5dGhvbjMtc3ludGF4OgogICAgIyBsZWZ0bW9zdCwgKnJlbWFpbmRlciA9IGRuLnNwbGl0KHInLicpCiAgICBwYXJ0cyA9IGRuLnNwbGl0KHInLicpCiAgICBsZWZ0bW9zdCA9IHBhcnRzWzBdCiAgICByZW1haW5kZXIgPSBwYXJ0c1sxOl0KCiAgICB3aWxkY2FyZHMgPSBsZWZ0bW9zdC5jb3VudCgnKicpCiAgICBpZiB3aWxkY2FyZHMgPiBtYXhfd2lsZGNhcmRzOgogICAgICAgICMgSXNzdWUgIzE3OTgwOiBhdm9pZCBkZW5pYWxzIG9mIHNlcnZpY2UgYnkgcmVmdXNpbmcgbW9yZQogICAgICAgICMgdGhhbiBvbmUgd2lsZGNhcmQgcGVyIGZyYWdtZW50LiAgQSBzdXJ2ZXkgb2YgZXN0YWJsaXNoZWQKICAgICAgICAjIHBvbGljeSBhbW9uZyBTU0wgaW1wbGVtZW50YXRpb25zIHNob3dlZCBpdCB0byBiZSBhCiAgICAgICAgIyByZWFzb25hYmxlIGNob2ljZS4KICAgICAgICByYWlzZSBDZXJ0aWZpY2F0ZUVycm9yKAogICAgICAgICAgICAidG9vIG1hbnkgd2lsZGNhcmRzIGluIGNlcnRpZmljYXRlIEROUyBuYW1lOiAiICsgcmVwcihkbikpCgogICAgIyBzcGVlZCB1cCBjb21tb24gY2FzZSB3L28gd2lsZGNhcmRzCiAgICBpZiBub3Qgd2lsZGNhcmRzOgogICAgICAgIHJldHVybiBkbi5sb3dlcigpID09IGhvc3RuYW1lLmxvd2VyKCkKCiAgICAjIFJGQyA2MTI1LCBzZWN0aW9uIDYuNC4zLCBzdWJpdGVtIDEuCiAgICAjIFRoZSBjbGllbnQgU0hPVUxEIE5PVCBhdHRlbXB0IHRvIG1hdGNoIGEgcHJlc2VudGVkIGlkZW50aWZpZXIgaW4gd2hpY2gKICAgICMgdGhlIHdpbGRjYXJkIGNoYXJhY3RlciBjb21wcmlzZXMgYSBsYWJlbCBvdGhlciB0aGFuIHRoZSBsZWZ0LW1vc3QgbGFiZWwuCiAgICBpZiBsZWZ0bW9zdCA9PSAnKic6CiAgICAgICAgIyBXaGVuICcqJyBpcyBhIGZyYWdtZW50IGJ5IGl0c2VsZiwgaXQgbWF0Y2hlcyBhIG5vbi1lbXB0eSBkb3RsZXNzCiAgICAgICAgIyBmcmFnbWVudC4KICAgICAgICBwYXRzLmFwcGVuZCgnW14uXSsnKQogICAgZWxpZiBsZWZ0bW9zdC5zdGFydHN3aXRoKCd4bi0tJykgb3IgaG9zdG5hbWUuc3RhcnRzd2l0aCgneG4tLScpOgogICAgICAgICMgUkZDIDYxMjUsIHNlY3Rpb24gNi40LjMsIHN1Yml0ZW0gMy4KICAgICAgICAjIFRoZSBjbGllbnQgU0hPVUxEIE5PVCBhdHRlbXB0IHRvIG1hdGNoIGEgcHJlc2VudGVkIGlkZW50aWZpZXIKICAgICAgICAjIHdoZXJlIHRoZSB3aWxkY2FyZCBjaGFyYWN0ZXIgaXMgZW1iZWRkZWQgd2l0aGluIGFuIEEtbGFiZWwgb3IKICAgICAgICAjIFUtbGFiZWwgb2YgYW4gaW50ZXJuYXRpb25hbGl6ZWQgZG9tYWluIG5hbWUuCiAgICAgICAgcGF0cy5hcHBlbmQocmUuZXNjYXBlKGxlZnRtb3N0KSkKICAgIGVsc2U6CiAgICAgICAgIyBPdGhlcndpc2UsICcqJyBtYXRjaGVzIGFueSBkb3RsZXNzIHN0cmluZywgZS5nLiB3d3cqCiAgICAgICAgcGF0cy5hcHBlbmQocmUuZXNjYXBlKGxlZnRtb3N0KS5yZXBsYWNlKHInXConLCAnW14uXSonKSkKCiAgICAjIGFkZCB0aGUgcmVtYWluaW5nIGZyYWdtZW50cywgaWdub3JlIGFueSB3aWxkY2FyZHMKICAgIGZvciBmcmFnIGluIHJlbWFpbmRlcjoKICAgICAgICBwYXRzLmFwcGVuZChyZS5lc2NhcGUoZnJhZykpCgogICAgcGF0ID0gcmUuY29tcGlsZShyJ1xBJyArIHInXC4nLmpvaW4ocGF0cykgKyByJ1xaJywgcmUuSUdOT1JFQ0FTRSkKICAgIHJldHVybiBwYXQubWF0Y2goaG9zdG5hbWUpCgoKZGVmIF90b191bmljb2RlKG9iaik6CiAgICBpZiBpc2luc3RhbmNlKG9iaiwgc3RyKSBhbmQgc3lzLnZlcnNpb25faW5mbyA8ICgzLCk6CiAgICAgICAgb2JqID0gdW5pY29kZShvYmosIGVuY29kaW5nPSdhc2NpaScsIGVycm9ycz0nc3RyaWN0JykKICAgIHJldHVybiBvYmoKCmRlZiBfaXBhZGRyZXNzX21hdGNoKGlwbmFtZSwgaG9zdF9pcCk6CiAgICAiIiJFeGFjdCBtYXRjaGluZyBvZiBJUCBhZGRyZXNzZXMuCgogICAgUkZDIDYxMjUgZXhwbGljaXRseSBkb2Vzbid0IGRlZmluZSBhbiBhbGdvcml0aG0gZm9yIHRoaXMKICAgIChzZWN0aW9uIDEuNy4yIC0gIk91dCBvZiBTY29wZSIpLgogICAgIiIiCiAgICAjIE9wZW5TU0wgbWF5IGFkZCBhIHRyYWlsaW5nIG5ld2xpbmUgdG8gYSBzdWJqZWN0QWx0TmFtZSdzIElQIGFkZHJlc3MKICAgICMgRGl2ZXJnZW5jZSBmcm9tIHVwc3RyZWFtOiBpcGFkZHJlc3MgY2FuJ3QgaGFuZGxlIGJ5dGUgc3RyCiAgICBpcCA9IGlwYWRkcmVzcy5pcF9hZGRyZXNzKF90b191bmljb2RlKGlwbmFtZSkucnN0cmlwKCkpCiAgICByZXR1cm4gaXAgPT0gaG9zdF9pcAoKCmRlZiBtYXRjaF9ob3N0bmFtZShjZXJ0LCBob3N0bmFtZSk6CiAgICAiIiJWZXJpZnkgdGhhdCAqY2VydCogKGluIGRlY29kZWQgZm9ybWF0IGFzIHJldHVybmVkIGJ5CiAgICBTU0xTb2NrZXQuZ2V0cGVlcmNlcnQoKSkgbWF0Y2hlcyB0aGUgKmhvc3RuYW1lKi4gIFJGQyAyODE4IGFuZCBSRkMgNjEyNQogICAgcnVsZXMgYXJlIGZvbGxvd2VkLCBidXQgSVAgYWRkcmVzc2VzIGFyZSBub3QgYWNjZXB0ZWQgZm9yICpob3N0bmFtZSouCgogICAgQ2VydGlmaWNhdGVFcnJvciBpcyByYWlzZWQgb24gZmFpbHVyZS4gT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uCiAgICByZXR1cm5zIG5vdGhpbmcuCiAgICAiIiIKICAgIGlmIG5vdCBjZXJ0OgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImVtcHR5IG9yIG5vIGNlcnRpZmljYXRlLCBtYXRjaF9ob3N0bmFtZSBuZWVkcyBhICIKICAgICAgICAgICAgICAgICAgICAgICAgICJTU0wgc29ja2V0IG9yIFNTTCBjb250ZXh0IHdpdGggZWl0aGVyICIKICAgICAgICAgICAgICAgICAgICAgICAgICJDRVJUX09QVElPTkFMIG9yIENFUlRfUkVRVUlSRUQiKQogICAgdHJ5OgogICAgICAgICMgRGl2ZXJnZW5jZSBmcm9tIHVwc3RyZWFtOiBpcGFkZHJlc3MgY2FuJ3QgaGFuZGxlIGJ5dGUgc3RyCiAgICAgICAgaG9zdF9pcCA9IGlwYWRkcmVzcy5pcF9hZGRyZXNzKF90b191bmljb2RlKGhvc3RuYW1lKSkKICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICMgTm90IGFuIElQIGFkZHJlc3MgKGNvbW1vbiBjYXNlKQogICAgICAgIGhvc3RfaXAgPSBOb25lCiAgICBleGNlcHQgVW5pY29kZUVycm9yOgogICAgICAgICMgRGl2ZXJnZW5jZSBmcm9tIHVwc3RyZWFtOiBIYXZlIHRvIGRlYWwgd2l0aCBpcGFkZHJlc3Mgbm90IHRha2luZwogICAgICAgICMgYnl0ZSBzdHJpbmdzLiAgYWRkcmVzc2VzIHNob3VsZCBiZSBhbGwgYXNjaWksIHNvIHdlIGNvbnNpZGVyIGl0IG5vdAogICAgICAgICMgYW4gaXBhZGRyZXNzIGluIHRoaXMgY2FzZQogICAgICAgIGhvc3RfaXAgPSBOb25lCiAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgIyBEaXZlcmdlbmNlIGZyb20gdXBzdHJlYW06IE1ha2UgaXBhZGRyZXNzIGxpYnJhcnkgb3B0aW9uYWwKICAgICAgICBpZiBpcGFkZHJlc3MgaXMgTm9uZToKICAgICAgICAgICAgaG9zdF9pcCA9IE5vbmUKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZQogICAgZG5zbmFtZXMgPSBbXQogICAgc2FuID0gY2VydC5nZXQoJ3N1YmplY3RBbHROYW1lJywgKCkpCiAgICBmb3Iga2V5LCB2YWx1ZSBpbiBzYW46CiAgICAgICAgaWYga2V5ID09ICdETlMnOgogICAgICAgICAgICBpZiBob3N0X2lwIGlzIE5vbmUgYW5kIF9kbnNuYW1lX21hdGNoKHZhbHVlLCBob3N0bmFtZSk6CiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgZG5zbmFtZXMuYXBwZW5kKHZhbHVlKQogICAgICAgIGVsaWYga2V5ID09ICdJUCBBZGRyZXNzJzoKICAgICAgICAgICAgaWYgaG9zdF9pcCBpcyBub3QgTm9uZSBhbmQgX2lwYWRkcmVzc19tYXRjaCh2YWx1ZSwgaG9zdF9pcCk6CiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgZG5zbmFtZXMuYXBwZW5kKHZhbHVlKQogICAgaWYgbm90IGRuc25hbWVzOgogICAgICAgICMgVGhlIHN1YmplY3QgaXMgb25seSBjaGVja2VkIHdoZW4gdGhlcmUgaXMgbm8gZE5TTmFtZSBlbnRyeQogICAgICAgICMgaW4gc3ViamVjdEFsdE5hbWUKICAgICAgICBmb3Igc3ViIGluIGNlcnQuZ2V0KCdzdWJqZWN0JywgKCkpOgogICAgICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBzdWI6CiAgICAgICAgICAgICAgICAjIFhYWCBhY2NvcmRpbmcgdG8gUkZDIDI4MTgsIHRoZSBtb3N0IHNwZWNpZmljIENvbW1vbiBOYW1lCiAgICAgICAgICAgICAgICAjIG11c3QgYmUgdXNlZC4KICAgICAgICAgICAgICAgIGlmIGtleSA9PSAnY29tbW9uTmFtZSc6CiAgICAgICAgICAgICAgICAgICAgaWYgX2Ruc25hbWVfbWF0Y2godmFsdWUsIGhvc3RuYW1lKToKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICAgICAgICAgZG5zbmFtZXMuYXBwZW5kKHZhbHVlKQogICAgaWYgbGVuKGRuc25hbWVzKSA+IDE6CiAgICAgICAgcmFpc2UgQ2VydGlmaWNhdGVFcnJvcigiaG9zdG5hbWUgJXIgIgogICAgICAgICAgICAiZG9lc24ndCBtYXRjaCBlaXRoZXIgb2YgJXMiCiAgICAgICAgICAgICUgKGhvc3RuYW1lLCAnLCAnLmpvaW4obWFwKHJlcHIsIGRuc25hbWVzKSkpKQogICAgZWxpZiBsZW4oZG5zbmFtZXMpID09IDE6CiAgICAgICAgcmFpc2UgQ2VydGlmaWNhdGVFcnJvcigiaG9zdG5hbWUgJXIgIgogICAgICAgICAgICAiZG9lc24ndCBtYXRjaCAlciIKICAgICAgICAgICAgJSAoaG9zdG5hbWUsIGRuc25hbWVzWzBdKSkKICAgIGVsc2U6CiAgICAgICAgcmFpc2UgQ2VydGlmaWNhdGVFcnJvcigibm8gYXBwcm9wcmlhdGUgY29tbW9uTmFtZSBvciAiCiAgICAgICAgICAgICJzdWJqZWN0QWx0TmFtZSBmaWVsZHMgd2VyZSBmb3VuZCIpClBLAwQUAAAAAAAAACEA8K4Yktk/AADZPwAAPwAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9wb29sbWFuYWdlci5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CmltcG9ydCBjb2xsZWN0aW9ucwppbXBvcnQgZnVuY3Rvb2xzCmltcG9ydCBsb2dnaW5nCgpmcm9tIC5fY29sbGVjdGlvbnMgaW1wb3J0IFJlY2VudGx5VXNlZENvbnRhaW5lcgpmcm9tIC5jb25uZWN0aW9ucG9vbCBpbXBvcnQgSFRUUENvbm5lY3Rpb25Qb29sLCBIVFRQU0Nvbm5lY3Rpb25Qb29sCmZyb20gLmNvbm5lY3Rpb25wb29sIGltcG9ydCBwb3J0X2J5X3NjaGVtZQpmcm9tIC5leGNlcHRpb25zIGltcG9ydCBMb2NhdGlvblZhbHVlRXJyb3IsIE1heFJldHJ5RXJyb3IsIFByb3h5U2NoZW1lVW5rbm93bgpmcm9tIC5wYWNrYWdlcy5zaXgubW92ZXMudXJsbGliLnBhcnNlIGltcG9ydCB1cmxqb2luCmZyb20gLnJlcXVlc3QgaW1wb3J0IFJlcXVlc3RNZXRob2RzCmZyb20gLnV0aWwudXJsIGltcG9ydCBwYXJzZV91cmwKZnJvbSAudXRpbC5yZXRyeSBpbXBvcnQgUmV0cnkKCgpfX2FsbF9fID0gWydQb29sTWFuYWdlcicsICdQcm94eU1hbmFnZXInLCAncHJveHlfZnJvbV91cmwnXQoKCmxvZyA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKU1NMX0tFWVdPUkRTID0gKCdrZXlfZmlsZScsICdjZXJ0X2ZpbGUnLCAnY2VydF9yZXFzJywgJ2NhX2NlcnRzJywKICAgICAgICAgICAgICAgICdzc2xfdmVyc2lvbicsICdjYV9jZXJ0X2RpcicsICdzc2xfY29udGV4dCcpCgojIEFsbCBrbm93biBrZXl3b3JkIGFyZ3VtZW50cyB0aGF0IGNvdWxkIGJlIHByb3ZpZGVkIHRvIHRoZSBwb29sIG1hbmFnZXIsIGl0cwojIHBvb2xzLCBvciB0aGUgdW5kZXJseWluZyBjb25uZWN0aW9ucy4gVGhpcyBpcyB1c2VkIHRvIGNvbnN0cnVjdCBhIHBvb2wga2V5Lgpfa2V5X2ZpZWxkcyA9ICgKICAgICdrZXlfc2NoZW1lJywgICMgc3RyCiAgICAna2V5X2hvc3QnLCAgIyBzdHIKICAgICdrZXlfcG9ydCcsICAjIGludAogICAgJ2tleV90aW1lb3V0JywgICMgaW50IG9yIGZsb2F0IG9yIFRpbWVvdXQKICAgICdrZXlfcmV0cmllcycsICAjIGludCBvciBSZXRyeQogICAgJ2tleV9zdHJpY3QnLCAgIyBib29sCiAgICAna2V5X2Jsb2NrJywgICMgYm9vbAogICAgJ2tleV9zb3VyY2VfYWRkcmVzcycsICAjIHN0cgogICAgJ2tleV9rZXlfZmlsZScsICAjIHN0cgogICAgJ2tleV9jZXJ0X2ZpbGUnLCAgIyBzdHIKICAgICdrZXlfY2VydF9yZXFzJywgICMgc3RyCiAgICAna2V5X2NhX2NlcnRzJywgICMgc3RyCiAgICAna2V5X3NzbF92ZXJzaW9uJywgICMgc3RyCiAgICAna2V5X2NhX2NlcnRfZGlyJywgICMgc3RyCiAgICAna2V5X3NzbF9jb250ZXh0JywgICMgaW5zdGFuY2Ugb2Ygc3NsLlNTTENvbnRleHQgb3IgdXJsbGliMy51dGlsLnNzbF8uU1NMQ29udGV4dAogICAgJ2tleV9tYXhzaXplJywgICMgaW50CiAgICAna2V5X2hlYWRlcnMnLCAgIyBkaWN0CiAgICAna2V5X19wcm94eScsICAjIHBhcnNlZCBwcm94eSB1cmwKICAgICdrZXlfX3Byb3h5X2hlYWRlcnMnLCAgIyBkaWN0CiAgICAna2V5X3NvY2tldF9vcHRpb25zJywgICMgbGlzdCBvZiAobGV2ZWwgKGludCksIG9wdG5hbWUgKGludCksIHZhbHVlIChpbnQgb3Igc3RyKSkgdHVwbGVzCiAgICAna2V5X19zb2Nrc19vcHRpb25zJywgICMgZGljdAogICAgJ2tleV9hc3NlcnRfaG9zdG5hbWUnLCAgIyBib29sIG9yIHN0cmluZwogICAgJ2tleV9hc3NlcnRfZmluZ2VycHJpbnQnLCAgIyBzdHIKKQoKIzogVGhlIG5hbWVkdHVwbGUgY2xhc3MgdXNlZCB0byBjb25zdHJ1Y3Qga2V5cyBmb3IgdGhlIGNvbm5lY3Rpb24gcG9vbC4KIzogQWxsIGN1c3RvbSBrZXkgc2NoZW1lcyBzaG91bGQgaW5jbHVkZSB0aGUgZmllbGRzIGluIHRoaXMga2V5IGF0IGEgbWluaW11bS4KUG9vbEtleSA9IGNvbGxlY3Rpb25zLm5hbWVkdHVwbGUoJ1Bvb2xLZXknLCBfa2V5X2ZpZWxkcykKCgpkZWYgX2RlZmF1bHRfa2V5X25vcm1hbGl6ZXIoa2V5X2NsYXNzLCByZXF1ZXN0X2NvbnRleHQpOgogICAgIiIiCiAgICBDcmVhdGUgYSBwb29sIGtleSBvdXQgb2YgYSByZXF1ZXN0IGNvbnRleHQgZGljdGlvbmFyeS4KCiAgICBBY2NvcmRpbmcgdG8gUkZDIDM5ODYsIGJvdGggdGhlIHNjaGVtZSBhbmQgaG9zdCBhcmUgY2FzZS1pbnNlbnNpdGl2ZS4KICAgIFRoZXJlZm9yZSwgdGhpcyBmdW5jdGlvbiBub3JtYWxpemVzIGJvdGggYmVmb3JlIGNvbnN0cnVjdGluZyB0aGUgcG9vbAogICAga2V5IGZvciBhbiBIVFRQUyByZXF1ZXN0LiBJZiB5b3Ugd2lzaCB0byBjaGFuZ2UgdGhpcyBiZWhhdmlvdXIsIHByb3ZpZGUKICAgIGFsdGVybmF0ZSBjYWxsYWJsZXMgdG8gYGBrZXlfZm5fYnlfc2NoZW1lYGAuCgogICAgOnBhcmFtIGtleV9jbGFzczoKICAgICAgICBUaGUgY2xhc3MgdG8gdXNlIHdoZW4gY29uc3RydWN0aW5nIHRoZSBrZXkuIFRoaXMgc2hvdWxkIGJlIGEgbmFtZWR0dXBsZQogICAgICAgIHdpdGggdGhlIGBgc2NoZW1lYGAgYW5kIGBgaG9zdGBgIGtleXMgYXQgYSBtaW5pbXVtLgogICAgOnR5cGUgIGtleV9jbGFzczogbmFtZWR0dXBsZQogICAgOnBhcmFtIHJlcXVlc3RfY29udGV4dDoKICAgICAgICBBIGRpY3Rpb25hcnktbGlrZSBvYmplY3QgdGhhdCBjb250YWluIHRoZSBjb250ZXh0IGZvciBhIHJlcXVlc3QuCiAgICA6dHlwZSAgcmVxdWVzdF9jb250ZXh0OiBkaWN0CgogICAgOnJldHVybjogQSBuYW1lZHR1cGxlIHRoYXQgY2FuIGJlIHVzZWQgYXMgYSBjb25uZWN0aW9uIHBvb2wga2V5LgogICAgOnJ0eXBlOiAgUG9vbEtleQogICAgIiIiCiAgICAjIFNpbmNlIHdlIG11dGF0ZSB0aGUgZGljdGlvbmFyeSwgbWFrZSBhIGNvcHkgZmlyc3QKICAgIGNvbnRleHQgPSByZXF1ZXN0X2NvbnRleHQuY29weSgpCiAgICBjb250ZXh0WydzY2hlbWUnXSA9IGNvbnRleHRbJ3NjaGVtZSddLmxvd2VyKCkKICAgIGNvbnRleHRbJ2hvc3QnXSA9IGNvbnRleHRbJ2hvc3QnXS5sb3dlcigpCgogICAgIyBUaGVzZSBhcmUgYm90aCBkaWN0aW9uYXJpZXMgYW5kIG5lZWQgdG8gYmUgdHJhbnNmb3JtZWQgaW50byBmcm96ZW5zZXRzCiAgICBmb3Iga2V5IGluICgnaGVhZGVycycsICdfcHJveHlfaGVhZGVycycsICdfc29ja3Nfb3B0aW9ucycpOgogICAgICAgIGlmIGtleSBpbiBjb250ZXh0IGFuZCBjb250ZXh0W2tleV0gaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGNvbnRleHRba2V5XSA9IGZyb3plbnNldChjb250ZXh0W2tleV0uaXRlbXMoKSkKCiAgICAjIFRoZSBzb2NrZXRfb3B0aW9ucyBrZXkgbWF5IGJlIGEgbGlzdCBhbmQgbmVlZHMgdG8gYmUgdHJhbnNmb3JtZWQgaW50byBhCiAgICAjIHR1cGxlLgogICAgc29ja2V0X29wdHMgPSBjb250ZXh0LmdldCgnc29ja2V0X29wdGlvbnMnKQogICAgaWYgc29ja2V0X29wdHMgaXMgbm90IE5vbmU6CiAgICAgICAgY29udGV4dFsnc29ja2V0X29wdGlvbnMnXSA9IHR1cGxlKHNvY2tldF9vcHRzKQoKICAgICMgTWFwIHRoZSBrd2FyZ3MgdG8gdGhlIG5hbWVzIGluIHRoZSBuYW1lZHR1cGxlIC0gdGhpcyBpcyBuZWNlc3Nhcnkgc2luY2UKICAgICMgbmFtZWR0dXBsZXMgY2FuJ3QgaGF2ZSBmaWVsZHMgc3RhcnRpbmcgd2l0aCAnXycuCiAgICBmb3Iga2V5IGluIGxpc3QoY29udGV4dC5rZXlzKCkpOgogICAgICAgIGNvbnRleHRbJ2tleV8nICsga2V5XSA9IGNvbnRleHQucG9wKGtleSkKCiAgICAjIERlZmF1bHQgdG8gYGBOb25lYGAgZm9yIGtleXMgbWlzc2luZyBmcm9tIHRoZSBjb250ZXh0CiAgICBmb3IgZmllbGQgaW4ga2V5X2NsYXNzLl9maWVsZHM6CiAgICAgICAgaWYgZmllbGQgbm90IGluIGNvbnRleHQ6CiAgICAgICAgICAgIGNvbnRleHRbZmllbGRdID0gTm9uZQoKICAgIHJldHVybiBrZXlfY2xhc3MoKipjb250ZXh0KQoKCiM6IEEgZGljdGlvbmFyeSB0aGF0IG1hcHMgYSBzY2hlbWUgdG8gYSBjYWxsYWJsZSB0aGF0IGNyZWF0ZXMgYSBwb29sIGtleS4KIzogVGhpcyBjYW4gYmUgdXNlZCB0byBhbHRlciB0aGUgd2F5IHBvb2wga2V5cyBhcmUgY29uc3RydWN0ZWQsIGlmIGRlc2lyZWQuCiM6IEVhY2ggUG9vbE1hbmFnZXIgbWFrZXMgYSBjb3B5IG9mIHRoaXMgZGljdGlvbmFyeSBzbyB0aGV5IGNhbiBiZSBjb25maWd1cmVkCiM6IGdsb2JhbGx5IGhlcmUsIG9yIGluZGl2aWR1YWxseSBvbiB0aGUgaW5zdGFuY2UuCmtleV9mbl9ieV9zY2hlbWUgPSB7CiAgICAnaHR0cCc6IGZ1bmN0b29scy5wYXJ0aWFsKF9kZWZhdWx0X2tleV9ub3JtYWxpemVyLCBQb29sS2V5KSwKICAgICdodHRwcyc6IGZ1bmN0b29scy5wYXJ0aWFsKF9kZWZhdWx0X2tleV9ub3JtYWxpemVyLCBQb29sS2V5KSwKfQoKcG9vbF9jbGFzc2VzX2J5X3NjaGVtZSA9IHsKICAgICdodHRwJzogSFRUUENvbm5lY3Rpb25Qb29sLAogICAgJ2h0dHBzJzogSFRUUFNDb25uZWN0aW9uUG9vbCwKfQoKCmNsYXNzIFBvb2xNYW5hZ2VyKFJlcXVlc3RNZXRob2RzKToKICAgICIiIgogICAgQWxsb3dzIGZvciBhcmJpdHJhcnkgcmVxdWVzdHMgd2hpbGUgdHJhbnNwYXJlbnRseSBrZWVwaW5nIHRyYWNrIG9mCiAgICBuZWNlc3NhcnkgY29ubmVjdGlvbiBwb29scyBmb3IgeW91LgoKICAgIDpwYXJhbSBudW1fcG9vbHM6CiAgICAgICAgTnVtYmVyIG9mIGNvbm5lY3Rpb24gcG9vbHMgdG8gY2FjaGUgYmVmb3JlIGRpc2NhcmRpbmcgdGhlIGxlYXN0CiAgICAgICAgcmVjZW50bHkgdXNlZCBwb29sLgoKICAgIDpwYXJhbSBoZWFkZXJzOgogICAgICAgIEhlYWRlcnMgdG8gaW5jbHVkZSB3aXRoIGFsbCByZXF1ZXN0cywgdW5sZXNzIG90aGVyIGhlYWRlcnMgYXJlIGdpdmVuCiAgICAgICAgZXhwbGljaXRseS4KCiAgICA6cGFyYW0gXFwqKmNvbm5lY3Rpb25fcG9vbF9rdzoKICAgICAgICBBZGRpdGlvbmFsIHBhcmFtZXRlcnMgYXJlIHVzZWQgdG8gY3JlYXRlIGZyZXNoCiAgICAgICAgOmNsYXNzOmB1cmxsaWIzLmNvbm5lY3Rpb25wb29sLkNvbm5lY3Rpb25Qb29sYCBpbnN0YW5jZXMuCgogICAgRXhhbXBsZTo6CgogICAgICAgID4+PiBtYW5hZ2VyID0gUG9vbE1hbmFnZXIobnVtX3Bvb2xzPTIpCiAgICAgICAgPj4+IHIgPSBtYW5hZ2VyLnJlcXVlc3QoJ0dFVCcsICdodHRwOi8vZ29vZ2xlLmNvbS8nKQogICAgICAgID4+PiByID0gbWFuYWdlci5yZXF1ZXN0KCdHRVQnLCAnaHR0cDovL2dvb2dsZS5jb20vbWFpbCcpCiAgICAgICAgPj4+IHIgPSBtYW5hZ2VyLnJlcXVlc3QoJ0dFVCcsICdodHRwOi8veWFob28uY29tLycpCiAgICAgICAgPj4+IGxlbihtYW5hZ2VyLnBvb2xzKQogICAgICAgIDIKCiAgICAiIiIKCiAgICBwcm94eSA9IE5vbmUKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbnVtX3Bvb2xzPTEwLCBoZWFkZXJzPU5vbmUsICoqY29ubmVjdGlvbl9wb29sX2t3KToKICAgICAgICBSZXF1ZXN0TWV0aG9kcy5fX2luaXRfXyhzZWxmLCBoZWFkZXJzKQogICAgICAgIHNlbGYuY29ubmVjdGlvbl9wb29sX2t3ID0gY29ubmVjdGlvbl9wb29sX2t3CiAgICAgICAgc2VsZi5wb29scyA9IFJlY2VudGx5VXNlZENvbnRhaW5lcihudW1fcG9vbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwb3NlX2Z1bmM9bGFtYmRhIHA6IHAuY2xvc2UoKSkKCiAgICAgICAgIyBMb2NhbGx5IHNldCB0aGUgcG9vbCBjbGFzc2VzIGFuZCBrZXlzIHNvIG90aGVyIFBvb2xNYW5hZ2VycyBjYW4KICAgICAgICAjIG92ZXJyaWRlIHRoZW0uCiAgICAgICAgc2VsZi5wb29sX2NsYXNzZXNfYnlfc2NoZW1lID0gcG9vbF9jbGFzc2VzX2J5X3NjaGVtZQogICAgICAgIHNlbGYua2V5X2ZuX2J5X3NjaGVtZSA9IGtleV9mbl9ieV9zY2hlbWUuY29weSgpCgogICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBfX2V4aXRfXyhzZWxmLCBleGNfdHlwZSwgZXhjX3ZhbCwgZXhjX3RiKToKICAgICAgICBzZWxmLmNsZWFyKCkKICAgICAgICAjIFJldHVybiBGYWxzZSB0byByZS1yYWlzZSBhbnkgcG90ZW50aWFsIGV4Y2VwdGlvbnMKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgX25ld19wb29sKHNlbGYsIHNjaGVtZSwgaG9zdCwgcG9ydCwgcmVxdWVzdF9jb250ZXh0PU5vbmUpOgogICAgICAgICIiIgogICAgICAgIENyZWF0ZSBhIG5ldyA6Y2xhc3M6YENvbm5lY3Rpb25Qb29sYCBiYXNlZCBvbiBob3N0LCBwb3J0LCBzY2hlbWUsIGFuZAogICAgICAgIGFueSBhZGRpdGlvbmFsIHBvb2wga2V5d29yZCBhcmd1bWVudHMuCgogICAgICAgIElmIGBgcmVxdWVzdF9jb250ZXh0YGAgaXMgcHJvdmlkZWQsIGl0IGlzIHByb3ZpZGVkIGFzIGtleXdvcmQgYXJndW1lbnRzCiAgICAgICAgdG8gdGhlIHBvb2wgY2xhc3MgdXNlZC4gVGhpcyBtZXRob2QgaXMgdXNlZCB0byBhY3R1YWxseSBjcmVhdGUgdGhlCiAgICAgICAgY29ubmVjdGlvbiBwb29scyBoYW5kZWQgb3V0IGJ5IDptZXRoOmBjb25uZWN0aW9uX2Zyb21fdXJsYCBhbmQKICAgICAgICBjb21wYW5pb24gbWV0aG9kcy4gSXQgaXMgaW50ZW5kZWQgdG8gYmUgb3ZlcnJpZGRlbiBmb3IgY3VzdG9taXphdGlvbi4KICAgICAgICAiIiIKICAgICAgICBwb29sX2NscyA9IHNlbGYucG9vbF9jbGFzc2VzX2J5X3NjaGVtZVtzY2hlbWVdCiAgICAgICAgaWYgcmVxdWVzdF9jb250ZXh0IGlzIE5vbmU6CiAgICAgICAgICAgIHJlcXVlc3RfY29udGV4dCA9IHNlbGYuY29ubmVjdGlvbl9wb29sX2t3LmNvcHkoKQoKICAgICAgICAjIEFsdGhvdWdoIHRoZSBjb250ZXh0IGhhcyBldmVyeXRoaW5nIG5lY2Vzc2FyeSB0byBjcmVhdGUgdGhlIHBvb2wsCiAgICAgICAgIyB0aGlzIGZ1bmN0aW9uIGhhcyBoaXN0b3JpY2FsbHkgb25seSB1c2VkIHRoZSBzY2hlbWUsIGhvc3QsIGFuZCBwb3J0CiAgICAgICAgIyBpbiB0aGUgcG9zaXRpb25hbCBhcmdzLiBXaGVuIGFuIEFQSSBjaGFuZ2UgaXMgYWNjZXB0YWJsZSB0aGVzZSBjYW4KICAgICAgICAjIGJlIHJlbW92ZWQuCiAgICAgICAgZm9yIGtleSBpbiAoJ3NjaGVtZScsICdob3N0JywgJ3BvcnQnKToKICAgICAgICAgICAgcmVxdWVzdF9jb250ZXh0LnBvcChrZXksIE5vbmUpCgogICAgICAgIGlmIHNjaGVtZSA9PSAnaHR0cCc6CiAgICAgICAgICAgIGZvciBrdyBpbiBTU0xfS0VZV09SRFM6CiAgICAgICAgICAgICAgICByZXF1ZXN0X2NvbnRleHQucG9wKGt3LCBOb25lKQoKICAgICAgICByZXR1cm4gcG9vbF9jbHMoaG9zdCwgcG9ydCwgKipyZXF1ZXN0X2NvbnRleHQpCgogICAgZGVmIGNsZWFyKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIEVtcHR5IG91ciBzdG9yZSBvZiBwb29scyBhbmQgZGlyZWN0IHRoZW0gYWxsIHRvIGNsb3NlLgoKICAgICAgICBUaGlzIHdpbGwgbm90IGFmZmVjdCBpbi1mbGlnaHQgY29ubmVjdGlvbnMsIGJ1dCB0aGV5IHdpbGwgbm90IGJlCiAgICAgICAgcmUtdXNlZCBhZnRlciBjb21wbGV0aW9uLgogICAgICAgICIiIgogICAgICAgIHNlbGYucG9vbHMuY2xlYXIoKQoKICAgIGRlZiBjb25uZWN0aW9uX2Zyb21faG9zdChzZWxmLCBob3N0LCBwb3J0PU5vbmUsIHNjaGVtZT0naHR0cCcsIHBvb2xfa3dhcmdzPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIEdldCBhIDpjbGFzczpgQ29ubmVjdGlvblBvb2xgIGJhc2VkIG9uIHRoZSBob3N0LCBwb3J0LCBhbmQgc2NoZW1lLgoKICAgICAgICBJZiBgYHBvcnRgYCBpc24ndCBnaXZlbiwgaXQgd2lsbCBiZSBkZXJpdmVkIGZyb20gdGhlIGBgc2NoZW1lYGAgdXNpbmcKICAgICAgICBgYHVybGxpYjMuY29ubmVjdGlvbnBvb2wucG9ydF9ieV9zY2hlbWVgYC4gSWYgYGBwb29sX2t3YXJnc2BgIGlzCiAgICAgICAgcHJvdmlkZWQsIGl0IGlzIG1lcmdlZCB3aXRoIHRoZSBpbnN0YW5jZSdzIGBgY29ubmVjdGlvbl9wb29sX2t3YGAKICAgICAgICB2YXJpYWJsZSBhbmQgdXNlZCB0byBjcmVhdGUgdGhlIG5ldyBjb25uZWN0aW9uIHBvb2wsIGlmIG9uZSBpcwogICAgICAgIG5lZWRlZC4KICAgICAgICAiIiIKCiAgICAgICAgaWYgbm90IGhvc3Q6CiAgICAgICAgICAgIHJhaXNlIExvY2F0aW9uVmFsdWVFcnJvcigiTm8gaG9zdCBzcGVjaWZpZWQuIikKCiAgICAgICAgcmVxdWVzdF9jb250ZXh0ID0gc2VsZi5fbWVyZ2VfcG9vbF9rd2FyZ3MocG9vbF9rd2FyZ3MpCiAgICAgICAgcmVxdWVzdF9jb250ZXh0WydzY2hlbWUnXSA9IHNjaGVtZSBvciAnaHR0cCcKICAgICAgICBpZiBub3QgcG9ydDoKICAgICAgICAgICAgcG9ydCA9IHBvcnRfYnlfc2NoZW1lLmdldChyZXF1ZXN0X2NvbnRleHRbJ3NjaGVtZSddLmxvd2VyKCksIDgwKQogICAgICAgIHJlcXVlc3RfY29udGV4dFsncG9ydCddID0gcG9ydAogICAgICAgIHJlcXVlc3RfY29udGV4dFsnaG9zdCddID0gaG9zdAoKICAgICAgICByZXR1cm4gc2VsZi5jb25uZWN0aW9uX2Zyb21fY29udGV4dChyZXF1ZXN0X2NvbnRleHQpCgogICAgZGVmIGNvbm5lY3Rpb25fZnJvbV9jb250ZXh0KHNlbGYsIHJlcXVlc3RfY29udGV4dCk6CiAgICAgICAgIiIiCiAgICAgICAgR2V0IGEgOmNsYXNzOmBDb25uZWN0aW9uUG9vbGAgYmFzZWQgb24gdGhlIHJlcXVlc3QgY29udGV4dC4KCiAgICAgICAgYGByZXF1ZXN0X2NvbnRleHRgYCBtdXN0IGF0IGxlYXN0IGNvbnRhaW4gdGhlIGBgc2NoZW1lYGAga2V5IGFuZCBpdHMKICAgICAgICB2YWx1ZSBtdXN0IGJlIGEga2V5IGluIGBga2V5X2ZuX2J5X3NjaGVtZWBgIGluc3RhbmNlIHZhcmlhYmxlLgogICAgICAgICIiIgogICAgICAgIHNjaGVtZSA9IHJlcXVlc3RfY29udGV4dFsnc2NoZW1lJ10ubG93ZXIoKQogICAgICAgIHBvb2xfa2V5X2NvbnN0cnVjdG9yID0gc2VsZi5rZXlfZm5fYnlfc2NoZW1lW3NjaGVtZV0KICAgICAgICBwb29sX2tleSA9IHBvb2xfa2V5X2NvbnN0cnVjdG9yKHJlcXVlc3RfY29udGV4dCkKCiAgICAgICAgcmV0dXJuIHNlbGYuY29ubmVjdGlvbl9mcm9tX3Bvb2xfa2V5KHBvb2xfa2V5LCByZXF1ZXN0X2NvbnRleHQ9cmVxdWVzdF9jb250ZXh0KQoKICAgIGRlZiBjb25uZWN0aW9uX2Zyb21fcG9vbF9rZXkoc2VsZiwgcG9vbF9rZXksIHJlcXVlc3RfY29udGV4dD1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBHZXQgYSA6Y2xhc3M6YENvbm5lY3Rpb25Qb29sYCBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgcG9vbCBrZXkuCgogICAgICAgIGBgcG9vbF9rZXlgYCBzaG91bGQgYmUgYSBuYW1lZHR1cGxlIHRoYXQgb25seSBjb250YWlucyBpbW11dGFibGUKICAgICAgICBvYmplY3RzLiBBdCBhIG1pbmltdW0gaXQgbXVzdCBoYXZlIHRoZSBgYHNjaGVtZWBgLCBgYGhvc3RgYCwgYW5kCiAgICAgICAgYGBwb3J0YGAgZmllbGRzLgogICAgICAgICIiIgogICAgICAgIHdpdGggc2VsZi5wb29scy5sb2NrOgogICAgICAgICAgICAjIElmIHRoZSBzY2hlbWUsIGhvc3QsIG9yIHBvcnQgZG9lc24ndCBtYXRjaCBleGlzdGluZyBvcGVuCiAgICAgICAgICAgICMgY29ubmVjdGlvbnMsIG9wZW4gYSBuZXcgQ29ubmVjdGlvblBvb2wuCiAgICAgICAgICAgIHBvb2wgPSBzZWxmLnBvb2xzLmdldChwb29sX2tleSkKICAgICAgICAgICAgaWYgcG9vbDoKICAgICAgICAgICAgICAgIHJldHVybiBwb29sCgogICAgICAgICAgICAjIE1ha2UgYSBmcmVzaCBDb25uZWN0aW9uUG9vbCBvZiB0aGUgZGVzaXJlZCB0eXBlCiAgICAgICAgICAgIHNjaGVtZSA9IHJlcXVlc3RfY29udGV4dFsnc2NoZW1lJ10KICAgICAgICAgICAgaG9zdCA9IHJlcXVlc3RfY29udGV4dFsnaG9zdCddCiAgICAgICAgICAgIHBvcnQgPSByZXF1ZXN0X2NvbnRleHRbJ3BvcnQnXQogICAgICAgICAgICBwb29sID0gc2VsZi5fbmV3X3Bvb2woc2NoZW1lLCBob3N0LCBwb3J0LCByZXF1ZXN0X2NvbnRleHQ9cmVxdWVzdF9jb250ZXh0KQogICAgICAgICAgICBzZWxmLnBvb2xzW3Bvb2xfa2V5XSA9IHBvb2wKCiAgICAgICAgcmV0dXJuIHBvb2wKCiAgICBkZWYgY29ubmVjdGlvbl9mcm9tX3VybChzZWxmLCB1cmwsIHBvb2xfa3dhcmdzPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIFNpbWlsYXIgdG8gOmZ1bmM6YHVybGxpYjMuY29ubmVjdGlvbnBvb2wuY29ubmVjdGlvbl9mcm9tX3VybGAuCgogICAgICAgIElmIGBgcG9vbF9rd2FyZ3NgYCBpcyBub3QgcHJvdmlkZWQgYW5kIGEgbmV3IHBvb2wgbmVlZHMgdG8gYmUKICAgICAgICBjb25zdHJ1Y3RlZCwgYGBzZWxmLmNvbm5lY3Rpb25fcG9vbF9rd2BgIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZQogICAgICAgIHRoZSA6Y2xhc3M6YHVybGxpYjMuY29ubmVjdGlvbnBvb2wuQ29ubmVjdGlvblBvb2xgLiBJZiBgYHBvb2xfa3dhcmdzYGAKICAgICAgICBpcyBwcm92aWRlZCwgaXQgaXMgdXNlZCBpbnN0ZWFkLiBOb3RlIHRoYXQgaWYgYSBuZXcgcG9vbCBkb2VzIG5vdAogICAgICAgIG5lZWQgdG8gYmUgY3JlYXRlZCBmb3IgdGhlIHJlcXVlc3QsIHRoZSBwcm92aWRlZCBgYHBvb2xfa3dhcmdzYGAgYXJlCiAgICAgICAgbm90IHVzZWQuCiAgICAgICAgIiIiCiAgICAgICAgdSA9IHBhcnNlX3VybCh1cmwpCiAgICAgICAgcmV0dXJuIHNlbGYuY29ubmVjdGlvbl9mcm9tX2hvc3QodS5ob3N0LCBwb3J0PXUucG9ydCwgc2NoZW1lPXUuc2NoZW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvb2xfa3dhcmdzPXBvb2xfa3dhcmdzKQoKICAgIGRlZiBfbWVyZ2VfcG9vbF9rd2FyZ3Moc2VsZiwgb3ZlcnJpZGUpOgogICAgICAgICIiIgogICAgICAgIE1lcmdlIGEgZGljdGlvbmFyeSBvZiBvdmVycmlkZSB2YWx1ZXMgZm9yIHNlbGYuY29ubmVjdGlvbl9wb29sX2t3LgoKICAgICAgICBUaGlzIGRvZXMgbm90IG1vZGlmeSBzZWxmLmNvbm5lY3Rpb25fcG9vbF9rdyBhbmQgcmV0dXJucyBhIG5ldyBkaWN0LgogICAgICAgIEFueSBrZXlzIGluIHRoZSBvdmVycmlkZSBkaWN0aW9uYXJ5IHdpdGggYSB2YWx1ZSBvZiBgYE5vbmVgYCBhcmUKICAgICAgICByZW1vdmVkIGZyb20gdGhlIG1lcmdlZCBkaWN0aW9uYXJ5LgogICAgICAgICIiIgogICAgICAgIGJhc2VfcG9vbF9rd2FyZ3MgPSBzZWxmLmNvbm5lY3Rpb25fcG9vbF9rdy5jb3B5KCkKICAgICAgICBpZiBvdmVycmlkZToKICAgICAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gb3ZlcnJpZGUuaXRlbXMoKToKICAgICAgICAgICAgICAgIGlmIHZhbHVlIGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICBkZWwgYmFzZV9wb29sX2t3YXJnc1trZXldCiAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGJhc2VfcG9vbF9rd2FyZ3Nba2V5XSA9IHZhbHVlCiAgICAgICAgcmV0dXJuIGJhc2VfcG9vbF9rd2FyZ3MKCiAgICBkZWYgdXJsb3BlbihzZWxmLCBtZXRob2QsIHVybCwgcmVkaXJlY3Q9VHJ1ZSwgKiprdyk6CiAgICAgICAgIiIiCiAgICAgICAgU2FtZSBhcyA6bWV0aDpgdXJsbGliMy5jb25uZWN0aW9ucG9vbC5IVFRQQ29ubmVjdGlvblBvb2wudXJsb3BlbmAKICAgICAgICB3aXRoIGN1c3RvbSBjcm9zcy1ob3N0IHJlZGlyZWN0IGxvZ2ljIGFuZCBvbmx5IHNlbmRzIHRoZSByZXF1ZXN0LXVyaQogICAgICAgIHBvcnRpb24gb2YgdGhlIGBgdXJsYGAuCgogICAgICAgIFRoZSBnaXZlbiBgYHVybGBgIHBhcmFtZXRlciBtdXN0IGJlIGFic29sdXRlLCBzdWNoIHRoYXQgYW4gYXBwcm9wcmlhdGUKICAgICAgICA6Y2xhc3M6YHVybGxpYjMuY29ubmVjdGlvbnBvb2wuQ29ubmVjdGlvblBvb2xgIGNhbiBiZSBjaG9zZW4gZm9yIGl0LgogICAgICAgICIiIgogICAgICAgIHUgPSBwYXJzZV91cmwodXJsKQogICAgICAgIGNvbm4gPSBzZWxmLmNvbm5lY3Rpb25fZnJvbV9ob3N0KHUuaG9zdCwgcG9ydD11LnBvcnQsIHNjaGVtZT11LnNjaGVtZSkKCiAgICAgICAga3dbJ2Fzc2VydF9zYW1lX2hvc3QnXSA9IEZhbHNlCiAgICAgICAga3dbJ3JlZGlyZWN0J10gPSBGYWxzZQogICAgICAgIGlmICdoZWFkZXJzJyBub3QgaW4ga3c6CiAgICAgICAgICAgIGt3WydoZWFkZXJzJ10gPSBzZWxmLmhlYWRlcnMKCiAgICAgICAgaWYgc2VsZi5wcm94eSBpcyBub3QgTm9uZSBhbmQgdS5zY2hlbWUgPT0gImh0dHAiOgogICAgICAgICAgICByZXNwb25zZSA9IGNvbm4udXJsb3BlbihtZXRob2QsIHVybCwgKiprdykKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXNwb25zZSA9IGNvbm4udXJsb3BlbihtZXRob2QsIHUucmVxdWVzdF91cmksICoqa3cpCgogICAgICAgIHJlZGlyZWN0X2xvY2F0aW9uID0gcmVkaXJlY3QgYW5kIHJlc3BvbnNlLmdldF9yZWRpcmVjdF9sb2NhdGlvbigpCiAgICAgICAgaWYgbm90IHJlZGlyZWN0X2xvY2F0aW9uOgogICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UKCiAgICAgICAgIyBTdXBwb3J0IHJlbGF0aXZlIFVSTHMgZm9yIHJlZGlyZWN0aW5nLgogICAgICAgIHJlZGlyZWN0X2xvY2F0aW9uID0gdXJsam9pbih1cmwsIHJlZGlyZWN0X2xvY2F0aW9uKQoKICAgICAgICAjIFJGQyA3MjMxLCBTZWN0aW9uIDYuNC40CiAgICAgICAgaWYgcmVzcG9uc2Uuc3RhdHVzID09IDMwMzoKICAgICAgICAgICAgbWV0aG9kID0gJ0dFVCcKCiAgICAgICAgcmV0cmllcyA9IGt3LmdldCgncmV0cmllcycpCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UocmV0cmllcywgUmV0cnkpOgogICAgICAgICAgICByZXRyaWVzID0gUmV0cnkuZnJvbV9pbnQocmV0cmllcywgcmVkaXJlY3Q9cmVkaXJlY3QpCgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0cmllcyA9IHJldHJpZXMuaW5jcmVtZW50KG1ldGhvZCwgdXJsLCByZXNwb25zZT1yZXNwb25zZSwgX3Bvb2w9Y29ubikKICAgICAgICBleGNlcHQgTWF4UmV0cnlFcnJvcjoKICAgICAgICAgICAgaWYgcmV0cmllcy5yYWlzZV9vbl9yZWRpcmVjdDoKICAgICAgICAgICAgICAgIHJhaXNlCiAgICAgICAgICAgIHJldHVybiByZXNwb25zZQoKICAgICAgICBrd1sncmV0cmllcyddID0gcmV0cmllcwogICAgICAgIGt3WydyZWRpcmVjdCddID0gcmVkaXJlY3QKCiAgICAgICAgbG9nLmluZm8oIlJlZGlyZWN0aW5nICVzIC0+ICVzIiwgdXJsLCByZWRpcmVjdF9sb2NhdGlvbikKICAgICAgICByZXR1cm4gc2VsZi51cmxvcGVuKG1ldGhvZCwgcmVkaXJlY3RfbG9jYXRpb24sICoqa3cpCgoKY2xhc3MgUHJveHlNYW5hZ2VyKFBvb2xNYW5hZ2VyKToKICAgICIiIgogICAgQmVoYXZlcyBqdXN0IGxpa2UgOmNsYXNzOmBQb29sTWFuYWdlcmAsIGJ1dCBzZW5kcyBhbGwgcmVxdWVzdHMgdGhyb3VnaAogICAgdGhlIGRlZmluZWQgcHJveHksIHVzaW5nIHRoZSBDT05ORUNUIG1ldGhvZCBmb3IgSFRUUFMgVVJMcy4KCiAgICA6cGFyYW0gcHJveHlfdXJsOgogICAgICAgIFRoZSBVUkwgb2YgdGhlIHByb3h5IHRvIGJlIHVzZWQuCgogICAgOnBhcmFtIHByb3h5X2hlYWRlcnM6CiAgICAgICAgQSBkaWN0aW9uYXJ5IGNvbnRhbmluZyBoZWFkZXJzIHRoYXQgd2lsbCBiZSBzZW50IHRvIHRoZSBwcm94eS4gSW4gY2FzZQogICAgICAgIG9mIEhUVFAgdGhleSBhcmUgYmVpbmcgc2VudCB3aXRoIGVhY2ggcmVxdWVzdCwgd2hpbGUgaW4gdGhlCiAgICAgICAgSFRUUFMvQ09OTkVDVCBjYXNlIHRoZXkgYXJlIHNlbnQgb25seSBvbmNlLiBDb3VsZCBiZSB1c2VkIGZvciBwcm94eQogICAgICAgIGF1dGhlbnRpY2F0aW9uLgoKICAgIEV4YW1wbGU6CiAgICAgICAgPj4+IHByb3h5ID0gdXJsbGliMy5Qcm94eU1hbmFnZXIoJ2h0dHA6Ly9sb2NhbGhvc3Q6MzEyOC8nKQogICAgICAgID4+PiByMSA9IHByb3h5LnJlcXVlc3QoJ0dFVCcsICdodHRwOi8vZ29vZ2xlLmNvbS8nKQogICAgICAgID4+PiByMiA9IHByb3h5LnJlcXVlc3QoJ0dFVCcsICdodHRwOi8vaHR0cGJpbi5vcmcvJykKICAgICAgICA+Pj4gbGVuKHByb3h5LnBvb2xzKQogICAgICAgIDEKICAgICAgICA+Pj4gcjMgPSBwcm94eS5yZXF1ZXN0KCdHRVQnLCAnaHR0cHM6Ly9odHRwYmluLm9yZy8nKQogICAgICAgID4+PiByNCA9IHByb3h5LnJlcXVlc3QoJ0dFVCcsICdodHRwczovL3R3aXR0ZXIuY29tLycpCiAgICAgICAgPj4+IGxlbihwcm94eS5wb29scykKICAgICAgICAzCgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHByb3h5X3VybCwgbnVtX3Bvb2xzPTEwLCBoZWFkZXJzPU5vbmUsCiAgICAgICAgICAgICAgICAgcHJveHlfaGVhZGVycz1Ob25lLCAqKmNvbm5lY3Rpb25fcG9vbF9rdyk6CgogICAgICAgIGlmIGlzaW5zdGFuY2UocHJveHlfdXJsLCBIVFRQQ29ubmVjdGlvblBvb2wpOgogICAgICAgICAgICBwcm94eV91cmwgPSAnJXM6Ly8lczolaScgJSAocHJveHlfdXJsLnNjaGVtZSwgcHJveHlfdXJsLmhvc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm94eV91cmwucG9ydCkKICAgICAgICBwcm94eSA9IHBhcnNlX3VybChwcm94eV91cmwpCiAgICAgICAgaWYgbm90IHByb3h5LnBvcnQ6CiAgICAgICAgICAgIHBvcnQgPSBwb3J0X2J5X3NjaGVtZS5nZXQocHJveHkuc2NoZW1lLCA4MCkKICAgICAgICAgICAgcHJveHkgPSBwcm94eS5fcmVwbGFjZShwb3J0PXBvcnQpCgogICAgICAgIGlmIHByb3h5LnNjaGVtZSBub3QgaW4gKCJodHRwIiwgImh0dHBzIik6CiAgICAgICAgICAgIHJhaXNlIFByb3h5U2NoZW1lVW5rbm93bihwcm94eS5zY2hlbWUpCgogICAgICAgIHNlbGYucHJveHkgPSBwcm94eQogICAgICAgIHNlbGYucHJveHlfaGVhZGVycyA9IHByb3h5X2hlYWRlcnMgb3Ige30KCiAgICAgICAgY29ubmVjdGlvbl9wb29sX2t3WydfcHJveHknXSA9IHNlbGYucHJveHkKICAgICAgICBjb25uZWN0aW9uX3Bvb2xfa3dbJ19wcm94eV9oZWFkZXJzJ10gPSBzZWxmLnByb3h5X2hlYWRlcnMKCiAgICAgICAgc3VwZXIoUHJveHlNYW5hZ2VyLCBzZWxmKS5fX2luaXRfXygKICAgICAgICAgICAgbnVtX3Bvb2xzLCBoZWFkZXJzLCAqKmNvbm5lY3Rpb25fcG9vbF9rdykKCiAgICBkZWYgY29ubmVjdGlvbl9mcm9tX2hvc3Qoc2VsZiwgaG9zdCwgcG9ydD1Ob25lLCBzY2hlbWU9J2h0dHAnLCBwb29sX2t3YXJncz1Ob25lKToKICAgICAgICBpZiBzY2hlbWUgPT0gImh0dHBzIjoKICAgICAgICAgICAgcmV0dXJuIHN1cGVyKFByb3h5TWFuYWdlciwgc2VsZikuY29ubmVjdGlvbl9mcm9tX2hvc3QoCiAgICAgICAgICAgICAgICBob3N0LCBwb3J0LCBzY2hlbWUsIHBvb2xfa3dhcmdzPXBvb2xfa3dhcmdzKQoKICAgICAgICByZXR1cm4gc3VwZXIoUHJveHlNYW5hZ2VyLCBzZWxmKS5jb25uZWN0aW9uX2Zyb21faG9zdCgKICAgICAgICAgICAgc2VsZi5wcm94eS5ob3N0LCBzZWxmLnByb3h5LnBvcnQsIHNlbGYucHJveHkuc2NoZW1lLCBwb29sX2t3YXJncz1wb29sX2t3YXJncykKCiAgICBkZWYgX3NldF9wcm94eV9oZWFkZXJzKHNlbGYsIHVybCwgaGVhZGVycz1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBTZXRzIGhlYWRlcnMgbmVlZGVkIGJ5IHByb3hpZXM6IHNwZWNpZmljYWxseSwgdGhlIEFjY2VwdCBhbmQgSG9zdAogICAgICAgIGhlYWRlcnMuIE9ubHkgc2V0cyBoZWFkZXJzIG5vdCBwcm92aWRlZCBieSB0aGUgdXNlci4KICAgICAgICAiIiIKICAgICAgICBoZWFkZXJzXyA9IHsnQWNjZXB0JzogJyovKid9CgogICAgICAgIG5ldGxvYyA9IHBhcnNlX3VybCh1cmwpLm5ldGxvYwogICAgICAgIGlmIG5ldGxvYzoKICAgICAgICAgICAgaGVhZGVyc19bJ0hvc3QnXSA9IG5ldGxvYwoKICAgICAgICBpZiBoZWFkZXJzOgogICAgICAgICAgICBoZWFkZXJzXy51cGRhdGUoaGVhZGVycykKICAgICAgICByZXR1cm4gaGVhZGVyc18KCiAgICBkZWYgdXJsb3BlbihzZWxmLCBtZXRob2QsIHVybCwgcmVkaXJlY3Q9VHJ1ZSwgKiprdyk6CiAgICAgICAgIlNhbWUgYXMgSFRUUChTKUNvbm5lY3Rpb25Qb29sLnVybG9wZW4sIGBgdXJsYGAgbXVzdCBiZSBhYnNvbHV0ZS4iCiAgICAgICAgdSA9IHBhcnNlX3VybCh1cmwpCgogICAgICAgIGlmIHUuc2NoZW1lID09ICJodHRwIjoKICAgICAgICAgICAgIyBGb3IgcHJveGllZCBIVFRQUyByZXF1ZXN0cywgaHR0cGxpYiBzZXRzIHRoZSBuZWNlc3NhcnkgaGVhZGVycwogICAgICAgICAgICAjIG9uIHRoZSBDT05ORUNUIHRvIHRoZSBwcm94eS4gRm9yIEhUVFAsIHdlJ2xsIGRlZmluaXRlbHkKICAgICAgICAgICAgIyBuZWVkIHRvIHNldCAnSG9zdCcgYXQgdGhlIHZlcnkgbGVhc3QuCiAgICAgICAgICAgIGhlYWRlcnMgPSBrdy5nZXQoJ2hlYWRlcnMnLCBzZWxmLmhlYWRlcnMpCiAgICAgICAgICAgIGt3WydoZWFkZXJzJ10gPSBzZWxmLl9zZXRfcHJveHlfaGVhZGVycyh1cmwsIGhlYWRlcnMpCgogICAgICAgIHJldHVybiBzdXBlcihQcm94eU1hbmFnZXIsIHNlbGYpLnVybG9wZW4obWV0aG9kLCB1cmwsIHJlZGlyZWN0PXJlZGlyZWN0LCAqKmt3KQoKCmRlZiBwcm94eV9mcm9tX3VybCh1cmwsICoqa3cpOgogICAgcmV0dXJuIFByb3h5TWFuYWdlcihwcm94eV91cmw9dXJsLCAqKmt3KQpQSwMEFAAAAAAAAAAhAMox5MQ6FwAAOhcAADsAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvcmVxdWVzdC5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0Cgpmcm9tIC5maWxlcG9zdCBpbXBvcnQgZW5jb2RlX211bHRpcGFydF9mb3JtZGF0YQpmcm9tIC5wYWNrYWdlcy5zaXgubW92ZXMudXJsbGliLnBhcnNlIGltcG9ydCB1cmxlbmNvZGUKCgpfX2FsbF9fID0gWydSZXF1ZXN0TWV0aG9kcyddCgoKY2xhc3MgUmVxdWVzdE1ldGhvZHMob2JqZWN0KToKICAgICIiIgogICAgQ29udmVuaWVuY2UgbWl4aW4gZm9yIGNsYXNzZXMgd2hvIGltcGxlbWVudCBhIDptZXRoOmB1cmxvcGVuYCBtZXRob2QsIHN1Y2gKICAgIGFzIDpjbGFzczpgfnVybGxpYjMuY29ubmVjdGlvbnBvb2wuSFRUUENvbm5lY3Rpb25Qb29sYCBhbmQKICAgIDpjbGFzczpgfnVybGxpYjMucG9vbG1hbmFnZXIuUG9vbE1hbmFnZXJgLgoKICAgIFByb3ZpZGVzIGJlaGF2aW9yIGZvciBtYWtpbmcgY29tbW9uIHR5cGVzIG9mIEhUVFAgcmVxdWVzdCBtZXRob2RzIGFuZAogICAgZGVjaWRlcyB3aGljaCB0eXBlIG9mIHJlcXVlc3QgZmllbGQgZW5jb2RpbmcgdG8gdXNlLgoKICAgIFNwZWNpZmljYWxseSwKCiAgICA6bWV0aDpgLnJlcXVlc3RfZW5jb2RlX3VybGAgaXMgZm9yIHNlbmRpbmcgcmVxdWVzdHMgd2hvc2UgZmllbGRzIGFyZQogICAgZW5jb2RlZCBpbiB0aGUgVVJMIChzdWNoIGFzIEdFVCwgSEVBRCwgREVMRVRFKS4KCiAgICA6bWV0aDpgLnJlcXVlc3RfZW5jb2RlX2JvZHlgIGlzIGZvciBzZW5kaW5nIHJlcXVlc3RzIHdob3NlIGZpZWxkcyBhcmUKICAgIGVuY29kZWQgaW4gdGhlICpib2R5KiBvZiB0aGUgcmVxdWVzdCB1c2luZyBtdWx0aXBhcnQgb3Igd3d3LWZvcm0tdXJsZW5jb2RlZAogICAgKHN1Y2ggYXMgZm9yIFBPU1QsIFBVVCwgUEFUQ0gpLgoKICAgIDptZXRoOmAucmVxdWVzdGAgaXMgZm9yIG1ha2luZyBhbnkga2luZCBvZiByZXF1ZXN0LCBpdCB3aWxsIGxvb2sgdXAgdGhlCiAgICBhcHByb3ByaWF0ZSBlbmNvZGluZyBmb3JtYXQgYW5kIHVzZSBvbmUgb2YgdGhlIGFib3ZlIHR3byBtZXRob2RzIHRvIG1ha2UKICAgIHRoZSByZXF1ZXN0LgoKICAgIEluaXRpYWxpemVyIHBhcmFtZXRlcnM6CgogICAgOnBhcmFtIGhlYWRlcnM6CiAgICAgICAgSGVhZGVycyB0byBpbmNsdWRlIHdpdGggYWxsIHJlcXVlc3RzLCB1bmxlc3Mgb3RoZXIgaGVhZGVycyBhcmUgZ2l2ZW4KICAgICAgICBleHBsaWNpdGx5LgogICAgIiIiCgogICAgX2VuY29kZV91cmxfbWV0aG9kcyA9IHNldChbJ0RFTEVURScsICdHRVQnLCAnSEVBRCcsICdPUFRJT05TJ10pCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGhlYWRlcnM9Tm9uZSk6CiAgICAgICAgc2VsZi5oZWFkZXJzID0gaGVhZGVycyBvciB7fQoKICAgIGRlZiB1cmxvcGVuKHNlbGYsIG1ldGhvZCwgdXJsLCBib2R5PU5vbmUsIGhlYWRlcnM9Tm9uZSwKICAgICAgICAgICAgICAgIGVuY29kZV9tdWx0aXBhcnQ9VHJ1ZSwgbXVsdGlwYXJ0X2JvdW5kYXJ5PU5vbmUsCiAgICAgICAgICAgICAgICAqKmt3KTogICMgQWJzdHJhY3QKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZCgiQ2xhc3NlcyBleHRlbmRpbmcgUmVxdWVzdE1ldGhvZHMgbXVzdCBpbXBsZW1lbnQgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGVpciBvd24gYGB1cmxvcGVuYGAgbWV0aG9kLiIpCgogICAgZGVmIHJlcXVlc3Qoc2VsZiwgbWV0aG9kLCB1cmwsIGZpZWxkcz1Ob25lLCBoZWFkZXJzPU5vbmUsICoqdXJsb3Blbl9rdyk6CiAgICAgICAgIiIiCiAgICAgICAgTWFrZSBhIHJlcXVlc3QgdXNpbmcgOm1ldGg6YHVybG9wZW5gIHdpdGggdGhlIGFwcHJvcHJpYXRlIGVuY29kaW5nIG9mCiAgICAgICAgYGBmaWVsZHNgYCBiYXNlZCBvbiB0aGUgYGBtZXRob2RgYCB1c2VkLgoKICAgICAgICBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRoYXQgcmVxdWlyZXMgdGhlIGxlYXN0IGFtb3VudCBvZiBtYW51YWwKICAgICAgICBlZmZvcnQuIEl0IGNhbiBiZSB1c2VkIGluIG1vc3Qgc2l0dWF0aW9ucywgd2hpbGUgc3RpbGwgaGF2aW5nIHRoZQogICAgICAgIG9wdGlvbiB0byBkcm9wIGRvd24gdG8gbW9yZSBzcGVjaWZpYyBtZXRob2RzIHdoZW4gbmVjZXNzYXJ5LCBzdWNoIGFzCiAgICAgICAgOm1ldGg6YHJlcXVlc3RfZW5jb2RlX3VybGAsIDptZXRoOmByZXF1ZXN0X2VuY29kZV9ib2R5YCwKICAgICAgICBvciBldmVuIHRoZSBsb3dlc3QgbGV2ZWwgOm1ldGg6YHVybG9wZW5gLgogICAgICAgICIiIgogICAgICAgIG1ldGhvZCA9IG1ldGhvZC51cHBlcigpCgogICAgICAgIGlmIG1ldGhvZCBpbiBzZWxmLl9lbmNvZGVfdXJsX21ldGhvZHM6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RfZW5jb2RlX3VybChtZXRob2QsIHVybCwgZmllbGRzPWZpZWxkcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM9aGVhZGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqdXJsb3Blbl9rdykKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gc2VsZi5yZXF1ZXN0X2VuY29kZV9ib2R5KG1ldGhvZCwgdXJsLCBmaWVsZHM9ZmllbGRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM9aGVhZGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKnVybG9wZW5fa3cpCgogICAgZGVmIHJlcXVlc3RfZW5jb2RlX3VybChzZWxmLCBtZXRob2QsIHVybCwgZmllbGRzPU5vbmUsIGhlYWRlcnM9Tm9uZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgKip1cmxvcGVuX2t3KToKICAgICAgICAiIiIKICAgICAgICBNYWtlIGEgcmVxdWVzdCB1c2luZyA6bWV0aDpgdXJsb3BlbmAgd2l0aCB0aGUgYGBmaWVsZHNgYCBlbmNvZGVkIGluCiAgICAgICAgdGhlIHVybC4gVGhpcyBpcyB1c2VmdWwgZm9yIHJlcXVlc3QgbWV0aG9kcyBsaWtlIEdFVCwgSEVBRCwgREVMRVRFLCBldGMuCiAgICAgICAgIiIiCiAgICAgICAgaWYgaGVhZGVycyBpcyBOb25lOgogICAgICAgICAgICBoZWFkZXJzID0gc2VsZi5oZWFkZXJzCgogICAgICAgIGV4dHJhX2t3ID0geydoZWFkZXJzJzogaGVhZGVyc30KICAgICAgICBleHRyYV9rdy51cGRhdGUodXJsb3Blbl9rdykKCiAgICAgICAgaWYgZmllbGRzOgogICAgICAgICAgICB1cmwgKz0gJz8nICsgdXJsZW5jb2RlKGZpZWxkcykKCiAgICAgICAgcmV0dXJuIHNlbGYudXJsb3BlbihtZXRob2QsIHVybCwgKipleHRyYV9rdykKCiAgICBkZWYgcmVxdWVzdF9lbmNvZGVfYm9keShzZWxmLCBtZXRob2QsIHVybCwgZmllbGRzPU5vbmUsIGhlYWRlcnM9Tm9uZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZV9tdWx0aXBhcnQ9VHJ1ZSwgbXVsdGlwYXJ0X2JvdW5kYXJ5PU5vbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKnVybG9wZW5fa3cpOgogICAgICAgICIiIgogICAgICAgIE1ha2UgYSByZXF1ZXN0IHVzaW5nIDptZXRoOmB1cmxvcGVuYCB3aXRoIHRoZSBgYGZpZWxkc2BgIGVuY29kZWQgaW4KICAgICAgICB0aGUgYm9keS4gVGhpcyBpcyB1c2VmdWwgZm9yIHJlcXVlc3QgbWV0aG9kcyBsaWtlIFBPU1QsIFBVVCwgUEFUQ0gsIGV0Yy4KCiAgICAgICAgV2hlbiBgYGVuY29kZV9tdWx0aXBhcnQ9VHJ1ZWBgIChkZWZhdWx0KSwgdGhlbgogICAgICAgIDptZXRoOmB1cmxsaWIzLmZpbGVwb3N0LmVuY29kZV9tdWx0aXBhcnRfZm9ybWRhdGFgIGlzIHVzZWQgdG8gZW5jb2RlCiAgICAgICAgdGhlIHBheWxvYWQgd2l0aCB0aGUgYXBwcm9wcmlhdGUgY29udGVudCB0eXBlLiBPdGhlcndpc2UKICAgICAgICA6bWV0aDpgdXJsbGliLnVybGVuY29kZWAgaXMgdXNlZCB3aXRoIHRoZQogICAgICAgICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnIGNvbnRlbnQgdHlwZS4KCiAgICAgICAgTXVsdGlwYXJ0IGVuY29kaW5nIG11c3QgYmUgdXNlZCB3aGVuIHBvc3RpbmcgZmlsZXMsIGFuZCBpdCdzIHJlYXNvbmFibHkKICAgICAgICBzYWZlIHRvIHVzZSBpdCBpbiBvdGhlciB0aW1lcyB0b28uIEhvd2V2ZXIsIGl0IG1heSBicmVhayByZXF1ZXN0CiAgICAgICAgc2lnbmluZywgc3VjaCBhcyB3aXRoIE9BdXRoLgoKICAgICAgICBTdXBwb3J0cyBhbiBvcHRpb25hbCBgYGZpZWxkc2BgIHBhcmFtZXRlciBvZiBrZXkvdmFsdWUgc3RyaW5ncyBBTkQKICAgICAgICBrZXkvZmlsZXR1cGxlLiBBIGZpbGV0dXBsZSBpcyBhIChmaWxlbmFtZSwgZGF0YSwgTUlNRSB0eXBlKSB0dXBsZSB3aGVyZQogICAgICAgIHRoZSBNSU1FIHR5cGUgaXMgb3B0aW9uYWwuIEZvciBleGFtcGxlOjoKCiAgICAgICAgICAgIGZpZWxkcyA9IHsKICAgICAgICAgICAgICAgICdmb28nOiAnYmFyJywKICAgICAgICAgICAgICAgICdmYWtlZmlsZSc6ICgnZm9vZmlsZS50eHQnLCAnY29udGVudHMgb2YgZm9vZmlsZScpLAogICAgICAgICAgICAgICAgJ3JlYWxmaWxlJzogKCdiYXJmaWxlLnR4dCcsIG9wZW4oJ3JlYWxmaWxlJykucmVhZCgpKSwKICAgICAgICAgICAgICAgICd0eXBlZGZpbGUnOiAoJ2JhemZpbGUuYmluJywgb3BlbignYmF6ZmlsZScpLnJlYWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ltYWdlL2pwZWcnKSwKICAgICAgICAgICAgICAgICdub25hbWVmaWxlJzogJ2NvbnRlbnRzIG9mIG5vbmFtZWZpbGUgZmllbGQnLAogICAgICAgICAgICB9CgogICAgICAgIFdoZW4gdXBsb2FkaW5nIGEgZmlsZSwgcHJvdmlkaW5nIGEgZmlsZW5hbWUgKHRoZSBmaXJzdCBwYXJhbWV0ZXIgb2YgdGhlCiAgICAgICAgdHVwbGUpIGlzIG9wdGlvbmFsIGJ1dCByZWNvbW1lbmRlZCB0byBiZXN0IG1pbWljayBiZWhhdmlvciBvZiBicm93c2Vycy4KCiAgICAgICAgTm90ZSB0aGF0IGlmIGBgaGVhZGVyc2BgIGFyZSBzdXBwbGllZCwgdGhlICdDb250ZW50LVR5cGUnIGhlYWRlciB3aWxsCiAgICAgICAgYmUgb3ZlcndyaXR0ZW4gYmVjYXVzZSBpdCBkZXBlbmRzIG9uIHRoZSBkeW5hbWljIHJhbmRvbSBib3VuZGFyeSBzdHJpbmcKICAgICAgICB3aGljaCBpcyB1c2VkIHRvIGNvbXBvc2UgdGhlIGJvZHkgb2YgdGhlIHJlcXVlc3QuIFRoZSByYW5kb20gYm91bmRhcnkKICAgICAgICBzdHJpbmcgY2FuIGJlIGV4cGxpY2l0bHkgc2V0IHdpdGggdGhlIGBgbXVsdGlwYXJ0X2JvdW5kYXJ5YGAgcGFyYW1ldGVyLgogICAgICAgICIiIgogICAgICAgIGlmIGhlYWRlcnMgaXMgTm9uZToKICAgICAgICAgICAgaGVhZGVycyA9IHNlbGYuaGVhZGVycwoKICAgICAgICBleHRyYV9rdyA9IHsnaGVhZGVycyc6IHt9fQoKICAgICAgICBpZiBmaWVsZHM6CiAgICAgICAgICAgIGlmICdib2R5JyBpbiB1cmxvcGVuX2t3OgogICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKAogICAgICAgICAgICAgICAgICAgICJyZXF1ZXN0IGdvdCB2YWx1ZXMgZm9yIGJvdGggJ2ZpZWxkcycgYW5kICdib2R5JywgY2FuIG9ubHkgc3BlY2lmeSBvbmUuIikKCiAgICAgICAgICAgIGlmIGVuY29kZV9tdWx0aXBhcnQ6CiAgICAgICAgICAgICAgICBib2R5LCBjb250ZW50X3R5cGUgPSBlbmNvZGVfbXVsdGlwYXJ0X2Zvcm1kYXRhKGZpZWxkcywgYm91bmRhcnk9bXVsdGlwYXJ0X2JvdW5kYXJ5KQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgYm9keSwgY29udGVudF90eXBlID0gdXJsZW5jb2RlKGZpZWxkcyksICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnCgogICAgICAgICAgICBleHRyYV9rd1snYm9keSddID0gYm9keQogICAgICAgICAgICBleHRyYV9rd1snaGVhZGVycyddID0geydDb250ZW50LVR5cGUnOiBjb250ZW50X3R5cGV9CgogICAgICAgIGV4dHJhX2t3WydoZWFkZXJzJ10udXBkYXRlKGhlYWRlcnMpCiAgICAgICAgZXh0cmFfa3cudXBkYXRlKHVybG9wZW5fa3cpCgogICAgICAgIHJldHVybiBzZWxmLnVybG9wZW4obWV0aG9kLCB1cmwsICoqZXh0cmFfa3cpClBLAwQUAAAAAAAAACEAP0qCYXdZAAB3WQAAPAAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9yZXNwb25zZS5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CmZyb20gY29udGV4dGxpYiBpbXBvcnQgY29udGV4dG1hbmFnZXIKaW1wb3J0IHpsaWIKaW1wb3J0IGlvCmltcG9ydCBsb2dnaW5nCmZyb20gc29ja2V0IGltcG9ydCB0aW1lb3V0IGFzIFNvY2tldFRpbWVvdXQKZnJvbSBzb2NrZXQgaW1wb3J0IGVycm9yIGFzIFNvY2tldEVycm9yCgpmcm9tIC5fY29sbGVjdGlvbnMgaW1wb3J0IEhUVFBIZWFkZXJEaWN0CmZyb20gLmV4Y2VwdGlvbnMgaW1wb3J0ICgKICAgIEJvZHlOb3RIdHRwbGliQ29tcGF0aWJsZSwgUHJvdG9jb2xFcnJvciwgRGVjb2RlRXJyb3IsIFJlYWRUaW1lb3V0RXJyb3IsCiAgICBSZXNwb25zZU5vdENodW5rZWQsIEluY29tcGxldGVSZWFkLCBJbnZhbGlkSGVhZGVyCikKZnJvbSAucGFja2FnZXMuc2l4IGltcG9ydCBzdHJpbmdfdHlwZXMgYXMgYmFzZXN0cmluZywgYmluYXJ5X3R5cGUsIFBZMwpmcm9tIC5wYWNrYWdlcy5zaXgubW92ZXMgaW1wb3J0IGh0dHBfY2xpZW50IGFzIGh0dHBsaWIKZnJvbSAuY29ubmVjdGlvbiBpbXBvcnQgSFRUUEV4Y2VwdGlvbiwgQmFzZVNTTEVycm9yCmZyb20gLnV0aWwucmVzcG9uc2UgaW1wb3J0IGlzX2ZwX2Nsb3NlZCwgaXNfcmVzcG9uc2VfdG9faGVhZAoKbG9nID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgoKY2xhc3MgRGVmbGF0ZURlY29kZXIob2JqZWN0KToKCiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc2VsZi5fZmlyc3RfdHJ5ID0gVHJ1ZQogICAgICAgIHNlbGYuX2RhdGEgPSBiaW5hcnlfdHlwZSgpCiAgICAgICAgc2VsZi5fb2JqID0gemxpYi5kZWNvbXByZXNzb2JqKCkKCiAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgbmFtZSk6CiAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZi5fb2JqLCBuYW1lKQoKICAgIGRlZiBkZWNvbXByZXNzKHNlbGYsIGRhdGEpOgogICAgICAgIGlmIG5vdCBkYXRhOgogICAgICAgICAgICByZXR1cm4gZGF0YQoKICAgICAgICBpZiBub3Qgc2VsZi5fZmlyc3RfdHJ5OgogICAgICAgICAgICByZXR1cm4gc2VsZi5fb2JqLmRlY29tcHJlc3MoZGF0YSkKCiAgICAgICAgc2VsZi5fZGF0YSArPSBkYXRhCiAgICAgICAgdHJ5OgogICAgICAgICAgICBkZWNvbXByZXNzZWQgPSBzZWxmLl9vYmouZGVjb21wcmVzcyhkYXRhKQogICAgICAgICAgICBpZiBkZWNvbXByZXNzZWQ6CiAgICAgICAgICAgICAgICBzZWxmLl9maXJzdF90cnkgPSBGYWxzZQogICAgICAgICAgICAgICAgc2VsZi5fZGF0YSA9IE5vbmUKICAgICAgICAgICAgcmV0dXJuIGRlY29tcHJlc3NlZAogICAgICAgIGV4Y2VwdCB6bGliLmVycm9yOgogICAgICAgICAgICBzZWxmLl9maXJzdF90cnkgPSBGYWxzZQogICAgICAgICAgICBzZWxmLl9vYmogPSB6bGliLmRlY29tcHJlc3NvYmooLXpsaWIuTUFYX1dCSVRTKQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5kZWNvbXByZXNzKHNlbGYuX2RhdGEpCiAgICAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICAgICBzZWxmLl9kYXRhID0gTm9uZQoKCmNsYXNzIEd6aXBEZWNvZGVyKG9iamVjdCk6CgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHNlbGYuX29iaiA9IHpsaWIuZGVjb21wcmVzc29iaigxNiArIHpsaWIuTUFYX1dCSVRTKQoKICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBuYW1lKToKICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLl9vYmosIG5hbWUpCgogICAgZGVmIGRlY29tcHJlc3Moc2VsZiwgZGF0YSk6CiAgICAgICAgaWYgbm90IGRhdGE6CiAgICAgICAgICAgIHJldHVybiBkYXRhCiAgICAgICAgcmV0dXJuIHNlbGYuX29iai5kZWNvbXByZXNzKGRhdGEpCgoKZGVmIF9nZXRfZGVjb2Rlcihtb2RlKToKICAgIGlmIG1vZGUgPT0gJ2d6aXAnOgogICAgICAgIHJldHVybiBHemlwRGVjb2RlcigpCgogICAgcmV0dXJuIERlZmxhdGVEZWNvZGVyKCkKCgpjbGFzcyBIVFRQUmVzcG9uc2UoaW8uSU9CYXNlKToKICAgICIiIgogICAgSFRUUCBSZXNwb25zZSBjb250YWluZXIuCgogICAgQmFja3dhcmRzLWNvbXBhdGlibGUgdG8gaHR0cGxpYidzIEhUVFBSZXNwb25zZSBidXQgdGhlIHJlc3BvbnNlIGBgYm9keWBgIGlzCiAgICBsb2FkZWQgYW5kIGRlY29kZWQgb24tZGVtYW5kIHdoZW4gdGhlIGBgZGF0YWBgIHByb3BlcnR5IGlzIGFjY2Vzc2VkLiAgVGhpcwogICAgY2xhc3MgaXMgYWxzbyBjb21wYXRpYmxlIHdpdGggdGhlIFB5dGhvbiBzdGFuZGFyZCBsaWJyYXJ5J3MgOm1vZDpgaW9gCiAgICBtb2R1bGUsIGFuZCBjYW4gaGVuY2UgYmUgdHJlYXRlZCBhcyBhIHJlYWRhYmxlIG9iamVjdCBpbiB0aGUgY29udGV4dCBvZiB0aGF0CiAgICBmcmFtZXdvcmsuCgogICAgRXh0cmEgcGFyYW1ldGVycyBmb3IgYmVoYXZpb3VyIG5vdCBwcmVzZW50IGluIGh0dHBsaWIuSFRUUFJlc3BvbnNlOgoKICAgIDpwYXJhbSBwcmVsb2FkX2NvbnRlbnQ6CiAgICAgICAgSWYgVHJ1ZSwgdGhlIHJlc3BvbnNlJ3MgYm9keSB3aWxsIGJlIHByZWxvYWRlZCBkdXJpbmcgY29uc3RydWN0aW9uLgoKICAgIDpwYXJhbSBkZWNvZGVfY29udGVudDoKICAgICAgICBJZiBUcnVlLCBhdHRlbXB0cyB0byBkZWNvZGUgc3BlY2lmaWMgY29udGVudC1lbmNvZGluZydzIGJhc2VkIG9uIGhlYWRlcnMKICAgICAgICAobGlrZSAnZ3ppcCcgYW5kICdkZWZsYXRlJykgd2lsbCBiZSBza2lwcGVkIGFuZCByYXcgZGF0YSB3aWxsIGJlIHVzZWQKICAgICAgICBpbnN0ZWFkLgoKICAgIDpwYXJhbSBvcmlnaW5hbF9yZXNwb25zZToKICAgICAgICBXaGVuIHRoaXMgSFRUUFJlc3BvbnNlIHdyYXBwZXIgaXMgZ2VuZXJhdGVkIGZyb20gYW4gaHR0cGxpYi5IVFRQUmVzcG9uc2UKICAgICAgICBvYmplY3QsIGl0J3MgY29udmVuaWVudCB0byBpbmNsdWRlIHRoZSBvcmlnaW5hbCBmb3IgZGVidWcgcHVycG9zZXMuIEl0J3MKICAgICAgICBvdGhlcndpc2UgdW51c2VkLgoKICAgIDpwYXJhbSByZXRyaWVzOgogICAgICAgIFRoZSByZXRyaWVzIGNvbnRhaW5zIHRoZSBsYXN0IDpjbGFzczpgfnVybGxpYjMudXRpbC5yZXRyeS5SZXRyeWAgdGhhdAogICAgICAgIHdhcyB1c2VkIGR1cmluZyB0aGUgcmVxdWVzdC4KCiAgICA6cGFyYW0gZW5mb3JjZV9jb250ZW50X2xlbmd0aDoKICAgICAgICBFbmZvcmNlIGNvbnRlbnQgbGVuZ3RoIGNoZWNraW5nLiBCb2R5IHJldHVybmVkIGJ5IHNlcnZlciBtdXN0IG1hdGNoCiAgICAgICAgdmFsdWUgb2YgQ29udGVudC1MZW5ndGggaGVhZGVyLCBpZiBwcmVzZW50LiBPdGhlcndpc2UsIHJhaXNlIGVycm9yLgogICAgIiIiCgogICAgQ09OVEVOVF9ERUNPREVSUyA9IFsnZ3ppcCcsICdkZWZsYXRlJ10KICAgIFJFRElSRUNUX1NUQVRVU0VTID0gWzMwMSwgMzAyLCAzMDMsIDMwNywgMzA4XQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBib2R5PScnLCBoZWFkZXJzPU5vbmUsIHN0YXR1cz0wLCB2ZXJzaW9uPTAsIHJlYXNvbj1Ob25lLAogICAgICAgICAgICAgICAgIHN0cmljdD0wLCBwcmVsb2FkX2NvbnRlbnQ9VHJ1ZSwgZGVjb2RlX2NvbnRlbnQ9VHJ1ZSwKICAgICAgICAgICAgICAgICBvcmlnaW5hbF9yZXNwb25zZT1Ob25lLCBwb29sPU5vbmUsIGNvbm5lY3Rpb249Tm9uZSwKICAgICAgICAgICAgICAgICByZXRyaWVzPU5vbmUsIGVuZm9yY2VfY29udGVudF9sZW5ndGg9RmFsc2UsIHJlcXVlc3RfbWV0aG9kPU5vbmUpOgoKICAgICAgICBpZiBpc2luc3RhbmNlKGhlYWRlcnMsIEhUVFBIZWFkZXJEaWN0KToKICAgICAgICAgICAgc2VsZi5oZWFkZXJzID0gaGVhZGVycwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuaGVhZGVycyA9IEhUVFBIZWFkZXJEaWN0KGhlYWRlcnMpCiAgICAgICAgc2VsZi5zdGF0dXMgPSBzdGF0dXMKICAgICAgICBzZWxmLnZlcnNpb24gPSB2ZXJzaW9uCiAgICAgICAgc2VsZi5yZWFzb24gPSByZWFzb24KICAgICAgICBzZWxmLnN0cmljdCA9IHN0cmljdAogICAgICAgIHNlbGYuZGVjb2RlX2NvbnRlbnQgPSBkZWNvZGVfY29udGVudAogICAgICAgIHNlbGYucmV0cmllcyA9IHJldHJpZXMKICAgICAgICBzZWxmLmVuZm9yY2VfY29udGVudF9sZW5ndGggPSBlbmZvcmNlX2NvbnRlbnRfbGVuZ3RoCgogICAgICAgIHNlbGYuX2RlY29kZXIgPSBOb25lCiAgICAgICAgc2VsZi5fYm9keSA9IE5vbmUKICAgICAgICBzZWxmLl9mcCA9IE5vbmUKICAgICAgICBzZWxmLl9vcmlnaW5hbF9yZXNwb25zZSA9IG9yaWdpbmFsX3Jlc3BvbnNlCiAgICAgICAgc2VsZi5fZnBfYnl0ZXNfcmVhZCA9IDAKCiAgICAgICAgaWYgYm9keSBhbmQgaXNpbnN0YW5jZShib2R5LCAoYmFzZXN0cmluZywgYmluYXJ5X3R5cGUpKToKICAgICAgICAgICAgc2VsZi5fYm9keSA9IGJvZHkKCiAgICAgICAgc2VsZi5fcG9vbCA9IHBvb2wKICAgICAgICBzZWxmLl9jb25uZWN0aW9uID0gY29ubmVjdGlvbgoKICAgICAgICBpZiBoYXNhdHRyKGJvZHksICdyZWFkJyk6CiAgICAgICAgICAgIHNlbGYuX2ZwID0gYm9keQoKICAgICAgICAjIEFyZSB3ZSB1c2luZyB0aGUgY2h1bmtlZC1zdHlsZSBvZiB0cmFuc2ZlciBlbmNvZGluZz8KICAgICAgICBzZWxmLmNodW5rZWQgPSBGYWxzZQogICAgICAgIHNlbGYuY2h1bmtfbGVmdCA9IE5vbmUKICAgICAgICB0cl9lbmMgPSBzZWxmLmhlYWRlcnMuZ2V0KCd0cmFuc2Zlci1lbmNvZGluZycsICcnKS5sb3dlcigpCiAgICAgICAgIyBEb24ndCBpbmN1ciB0aGUgcGVuYWx0eSBvZiBjcmVhdGluZyBhIGxpc3QgYW5kIHRoZW4gZGlzY2FyZGluZyBpdAogICAgICAgIGVuY29kaW5ncyA9IChlbmMuc3RyaXAoKSBmb3IgZW5jIGluIHRyX2VuYy5zcGxpdCgiLCIpKQogICAgICAgIGlmICJjaHVua2VkIiBpbiBlbmNvZGluZ3M6CiAgICAgICAgICAgIHNlbGYuY2h1bmtlZCA9IFRydWUKCiAgICAgICAgIyBEZXRlcm1pbmUgbGVuZ3RoIG9mIHJlc3BvbnNlCiAgICAgICAgc2VsZi5sZW5ndGhfcmVtYWluaW5nID0gc2VsZi5faW5pdF9sZW5ndGgocmVxdWVzdF9tZXRob2QpCgogICAgICAgICMgSWYgcmVxdWVzdGVkLCBwcmVsb2FkIHRoZSBib2R5LgogICAgICAgIGlmIHByZWxvYWRfY29udGVudCBhbmQgbm90IHNlbGYuX2JvZHk6CiAgICAgICAgICAgIHNlbGYuX2JvZHkgPSBzZWxmLnJlYWQoZGVjb2RlX2NvbnRlbnQ9ZGVjb2RlX2NvbnRlbnQpCgogICAgZGVmIGdldF9yZWRpcmVjdF9sb2NhdGlvbihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBTaG91bGQgd2UgcmVkaXJlY3QgYW5kIHdoZXJlIHRvPwoKICAgICAgICA6cmV0dXJuczogVHJ1dGh5IHJlZGlyZWN0IGxvY2F0aW9uIHN0cmluZyBpZiB3ZSBnb3QgYSByZWRpcmVjdCBzdGF0dXMKICAgICAgICAgICAgY29kZSBhbmQgdmFsaWQgbG9jYXRpb24uIGBgTm9uZWBgIGlmIHJlZGlyZWN0IHN0YXR1cyBhbmQgbm8KICAgICAgICAgICAgbG9jYXRpb24uIGBgRmFsc2VgYCBpZiBub3QgYSByZWRpcmVjdCBzdGF0dXMgY29kZS4KICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLnN0YXR1cyBpbiBzZWxmLlJFRElSRUNUX1NUQVRVU0VTOgogICAgICAgICAgICByZXR1cm4gc2VsZi5oZWFkZXJzLmdldCgnbG9jYXRpb24nKQoKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgcmVsZWFzZV9jb25uKHNlbGYpOgogICAgICAgIGlmIG5vdCBzZWxmLl9wb29sIG9yIG5vdCBzZWxmLl9jb25uZWN0aW9uOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgc2VsZi5fcG9vbC5fcHV0X2Nvbm4oc2VsZi5fY29ubmVjdGlvbikKICAgICAgICBzZWxmLl9jb25uZWN0aW9uID0gTm9uZQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGRhdGEoc2VsZik6CiAgICAgICAgIyBGb3IgYmFja3dvcmRzLWNvbXBhdCB3aXRoIGVhcmxpZXIgdXJsbGliMyAwLjQgYW5kIGVhcmxpZXIuCiAgICAgICAgaWYgc2VsZi5fYm9keToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2JvZHkKCiAgICAgICAgaWYgc2VsZi5fZnA6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnJlYWQoY2FjaGVfY29udGVudD1UcnVlKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGNvbm5lY3Rpb24oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2Nvbm5lY3Rpb24KCiAgICBkZWYgdGVsbChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBPYnRhaW4gdGhlIG51bWJlciBvZiBieXRlcyBwdWxsZWQgb3ZlciB0aGUgd2lyZSBzbyBmYXIuIE1heSBkaWZmZXIgZnJvbQogICAgICAgIHRoZSBhbW91bnQgb2YgY29udGVudCByZXR1cm5lZCBieSA6bWV0aDpgYEhUVFBSZXNwb25zZS5yZWFkYGAgaWYgYnl0ZXMKICAgICAgICBhcmUgZW5jb2RlZCBvbiB0aGUgd2lyZSAoZS5nLCBjb21wcmVzc2VkKS4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZi5fZnBfYnl0ZXNfcmVhZAoKICAgIGRlZiBfaW5pdF9sZW5ndGgoc2VsZiwgcmVxdWVzdF9tZXRob2QpOgogICAgICAgICIiIgogICAgICAgIFNldCBpbml0aWFsIGxlbmd0aCB2YWx1ZSBmb3IgUmVzcG9uc2UgY29udGVudCBpZiBhdmFpbGFibGUuCiAgICAgICAgIiIiCiAgICAgICAgbGVuZ3RoID0gc2VsZi5oZWFkZXJzLmdldCgnY29udGVudC1sZW5ndGgnKQoKICAgICAgICBpZiBsZW5ndGggaXMgbm90IE5vbmUgYW5kIHNlbGYuY2h1bmtlZDoKICAgICAgICAgICAgIyBUaGlzIFJlc3BvbnNlIHdpbGwgZmFpbCB3aXRoIGFuIEluY29tcGxldGVSZWFkIGlmIGl0IGNhbid0IGJlCiAgICAgICAgICAgICMgcmVjZWl2ZWQgYXMgY2h1bmtlZC4gVGhpcyBtZXRob2QgZmFsbHMgYmFjayB0byBhdHRlbXB0IHJlYWRpbmcKICAgICAgICAgICAgIyB0aGUgcmVzcG9uc2UgYmVmb3JlIHJhaXNpbmcgYW4gZXhjZXB0aW9uLgogICAgICAgICAgICBsb2cud2FybmluZygiUmVjZWl2ZWQgcmVzcG9uc2Ugd2l0aCBib3RoIENvbnRlbnQtTGVuZ3RoIGFuZCAiCiAgICAgICAgICAgICAgICAgICAgICAgICJUcmFuc2Zlci1FbmNvZGluZyBzZXQuIFRoaXMgaXMgZXhwcmVzc2x5IGZvcmJpZGRlbiAiCiAgICAgICAgICAgICAgICAgICAgICAgICJieSBSRkMgNzIzMCBzZWMgMy4zLjIuIElnbm9yaW5nIENvbnRlbnQtTGVuZ3RoIGFuZCAiCiAgICAgICAgICAgICAgICAgICAgICAgICJhdHRlbXB0aW5nIHRvIHByb2Nlc3MgcmVzcG9uc2UgYXMgVHJhbnNmZXItRW5jb2Rpbmc6ICIKICAgICAgICAgICAgICAgICAgICAgICAgImNodW5rZWQuIikKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgZWxpZiBsZW5ndGggaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICMgUkZDIDcyMzAgc2VjdGlvbiAzLjMuMiBzcGVjaWZpZXMgbXVsdGlwbGUgY29udGVudCBsZW5ndGhzIGNhbgogICAgICAgICAgICAgICAgIyBiZSBzZW50IGluIGEgc2luZ2xlIENvbnRlbnQtTGVuZ3RoIGhlYWRlcgogICAgICAgICAgICAgICAgIyAoZS5nLiBDb250ZW50LUxlbmd0aDogNDIsIDQyKS4gVGhpcyBsaW5lIGVuc3VyZXMgdGhlIHZhbHVlcwogICAgICAgICAgICAgICAgIyBhcmUgYWxsIHZhbGlkIGludHMgYW5kIHRoYXQgYXMgbG9uZyBhcyB0aGUgYHNldGAgbGVuZ3RoIGlzIDEsCiAgICAgICAgICAgICAgICAjIGFsbCB2YWx1ZXMgYXJlIHRoZSBzYW1lLiBPdGhlcndpc2UsIHRoZSBoZWFkZXIgaXMgaW52YWxpZC4KICAgICAgICAgICAgICAgIGxlbmd0aHMgPSBzZXQoW2ludCh2YWwpIGZvciB2YWwgaW4gbGVuZ3RoLnNwbGl0KCcsJyldKQogICAgICAgICAgICAgICAgaWYgbGVuKGxlbmd0aHMpID4gMToKICAgICAgICAgICAgICAgICAgICByYWlzZSBJbnZhbGlkSGVhZGVyKCJDb250ZW50LUxlbmd0aCBjb250YWluZWQgbXVsdGlwbGUgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVubWF0Y2hpbmcgdmFsdWVzICglcykiICUgbGVuZ3RoKQogICAgICAgICAgICAgICAgbGVuZ3RoID0gbGVuZ3Rocy5wb3AoKQogICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgIGxlbmd0aCA9IE5vbmUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGlmIGxlbmd0aCA8IDA6CiAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gTm9uZQoKICAgICAgICAjIENvbnZlcnQgc3RhdHVzIHRvIGludCBmb3IgY29tcGFyaXNvbgogICAgICAgICMgSW4gc29tZSBjYXNlcywgaHR0cGxpYiByZXR1cm5zIGEgc3RhdHVzIG9mICJfVU5LTk9XTiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIHN0YXR1cyA9IGludChzZWxmLnN0YXR1cykKICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgc3RhdHVzID0gMAoKICAgICAgICAjIENoZWNrIGZvciByZXNwb25zZXMgdGhhdCBzaG91bGRuJ3QgaW5jbHVkZSBhIGJvZHkKICAgICAgICBpZiBzdGF0dXMgaW4gKDIwNCwgMzA0KSBvciAxMDAgPD0gc3RhdHVzIDwgMjAwIG9yIHJlcXVlc3RfbWV0aG9kID09ICdIRUFEJzoKICAgICAgICAgICAgbGVuZ3RoID0gMAoKICAgICAgICByZXR1cm4gbGVuZ3RoCgogICAgZGVmIF9pbml0X2RlY29kZXIoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgU2V0LXVwIHRoZSBfZGVjb2RlciBhdHRyaWJ1dGUgaWYgbmVjZXNzYXJ5LgogICAgICAgICIiIgogICAgICAgICMgTm90ZTogY29udGVudC1lbmNvZGluZyB2YWx1ZSBzaG91bGQgYmUgY2FzZS1pbnNlbnNpdGl2ZSwgcGVyIFJGQyA3MjMwCiAgICAgICAgIyBTZWN0aW9uIDMuMgogICAgICAgIGNvbnRlbnRfZW5jb2RpbmcgPSBzZWxmLmhlYWRlcnMuZ2V0KCdjb250ZW50LWVuY29kaW5nJywgJycpLmxvd2VyKCkKICAgICAgICBpZiBzZWxmLl9kZWNvZGVyIGlzIE5vbmUgYW5kIGNvbnRlbnRfZW5jb2RpbmcgaW4gc2VsZi5DT05URU5UX0RFQ09ERVJTOgogICAgICAgICAgICBzZWxmLl9kZWNvZGVyID0gX2dldF9kZWNvZGVyKGNvbnRlbnRfZW5jb2RpbmcpCgogICAgZGVmIF9kZWNvZGUoc2VsZiwgZGF0YSwgZGVjb2RlX2NvbnRlbnQsIGZsdXNoX2RlY29kZXIpOgogICAgICAgICIiIgogICAgICAgIERlY29kZSB0aGUgZGF0YSBwYXNzZWQgaW4gYW5kIHBvdGVudGlhbGx5IGZsdXNoIHRoZSBkZWNvZGVyLgogICAgICAgICIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgaWYgZGVjb2RlX2NvbnRlbnQgYW5kIHNlbGYuX2RlY29kZXI6CiAgICAgICAgICAgICAgICBkYXRhID0gc2VsZi5fZGVjb2Rlci5kZWNvbXByZXNzKGRhdGEpCiAgICAgICAgZXhjZXB0IChJT0Vycm9yLCB6bGliLmVycm9yKSBhcyBlOgogICAgICAgICAgICBjb250ZW50X2VuY29kaW5nID0gc2VsZi5oZWFkZXJzLmdldCgnY29udGVudC1lbmNvZGluZycsICcnKS5sb3dlcigpCiAgICAgICAgICAgIHJhaXNlIERlY29kZUVycm9yKAogICAgICAgICAgICAgICAgIlJlY2VpdmVkIHJlc3BvbnNlIHdpdGggY29udGVudC1lbmNvZGluZzogJXMsIGJ1dCAiCiAgICAgICAgICAgICAgICAiZmFpbGVkIHRvIGRlY29kZSBpdC4iICUgY29udGVudF9lbmNvZGluZywgZSkKCiAgICAgICAgaWYgZmx1c2hfZGVjb2RlciBhbmQgZGVjb2RlX2NvbnRlbnQ6CiAgICAgICAgICAgIGRhdGEgKz0gc2VsZi5fZmx1c2hfZGVjb2RlcigpCgogICAgICAgIHJldHVybiBkYXRhCgogICAgZGVmIF9mbHVzaF9kZWNvZGVyKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIEZsdXNoZXMgdGhlIGRlY29kZXIuIFNob3VsZCBvbmx5IGJlIGNhbGxlZCBpZiB0aGUgZGVjb2RlciBpcyBhY3R1YWxseQogICAgICAgIGJlaW5nIHVzZWQuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5fZGVjb2RlcjoKICAgICAgICAgICAgYnVmID0gc2VsZi5fZGVjb2Rlci5kZWNvbXByZXNzKGInJykKICAgICAgICAgICAgcmV0dXJuIGJ1ZiArIHNlbGYuX2RlY29kZXIuZmx1c2goKQoKICAgICAgICByZXR1cm4gYicnCgogICAgQGNvbnRleHRtYW5hZ2VyCiAgICBkZWYgX2Vycm9yX2NhdGNoZXIoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgQ2F0Y2ggbG93LWxldmVsIHB5dGhvbiBleGNlcHRpb25zLCBpbnN0ZWFkIHJlLXJhaXNpbmcgdXJsbGliMwogICAgICAgIHZhcmlhbnRzLCBzbyB0aGF0IGxvdy1sZXZlbCBleGNlcHRpb25zIGFyZSBub3QgbGVha2VkIGluIHRoZQogICAgICAgIGhpZ2gtbGV2ZWwgYXBpLgoKICAgICAgICBPbiBleGl0LCByZWxlYXNlIHRoZSBjb25uZWN0aW9uIGJhY2sgdG8gdGhlIHBvb2wuCiAgICAgICAgIiIiCiAgICAgICAgY2xlYW5fZXhpdCA9IEZhbHNlCgogICAgICAgIHRyeToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgeWllbGQKCiAgICAgICAgICAgIGV4Y2VwdCBTb2NrZXRUaW1lb3V0OgogICAgICAgICAgICAgICAgIyBGSVhNRTogSWRlYWxseSB3ZSdkIGxpa2UgdG8gaW5jbHVkZSB0aGUgdXJsIGluIHRoZSBSZWFkVGltZW91dEVycm9yIGJ1dAogICAgICAgICAgICAgICAgIyB0aGVyZSBpcyB5ZXQgbm8gY2xlYW4gd2F5IHRvIGdldCBhdCBpdCBmcm9tIHRoaXMgY29udGV4dC4KICAgICAgICAgICAgICAgIHJhaXNlIFJlYWRUaW1lb3V0RXJyb3Ioc2VsZi5fcG9vbCwgTm9uZSwgJ1JlYWQgdGltZWQgb3V0LicpCgogICAgICAgICAgICBleGNlcHQgQmFzZVNTTEVycm9yIGFzIGU6CiAgICAgICAgICAgICAgICAjIEZJWE1FOiBJcyB0aGVyZSBhIGJldHRlciB3YXkgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIFNTTEVycm9ycz8KICAgICAgICAgICAgICAgIGlmICdyZWFkIG9wZXJhdGlvbiB0aW1lZCBvdXQnIG5vdCBpbiBzdHIoZSk6ICAjIERlZmVuc2l2ZToKICAgICAgICAgICAgICAgICAgICAjIFRoaXMgc2hvdWxkbid0IGhhcHBlbiBidXQganVzdCBpbiBjYXNlIHdlJ3JlIG1pc3NpbmcgYW4gZWRnZQogICAgICAgICAgICAgICAgICAgICMgY2FzZSwgbGV0J3MgYXZvaWQgc3dhbGxvd2luZyBTU0wgZXJyb3JzLgogICAgICAgICAgICAgICAgICAgIHJhaXNlCgogICAgICAgICAgICAgICAgcmFpc2UgUmVhZFRpbWVvdXRFcnJvcihzZWxmLl9wb29sLCBOb25lLCAnUmVhZCB0aW1lZCBvdXQuJykKCiAgICAgICAgICAgIGV4Y2VwdCAoSFRUUEV4Y2VwdGlvbiwgU29ja2V0RXJyb3IpIGFzIGU6CiAgICAgICAgICAgICAgICAjIFRoaXMgaW5jbHVkZXMgSW5jb21wbGV0ZVJlYWQuCiAgICAgICAgICAgICAgICByYWlzZSBQcm90b2NvbEVycm9yKCdDb25uZWN0aW9uIGJyb2tlbjogJXInICUgZSwgZSkKCiAgICAgICAgICAgICMgSWYgbm8gZXhjZXB0aW9uIGlzIHRocm93biwgd2Ugc2hvdWxkIGF2b2lkIGNsZWFuaW5nIHVwCiAgICAgICAgICAgICMgdW5uZWNlc3NhcmlseS4KICAgICAgICAgICAgY2xlYW5fZXhpdCA9IFRydWUKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAjIElmIHdlIGRpZG4ndCB0ZXJtaW5hdGUgY2xlYW5seSwgd2UgbmVlZCB0byB0aHJvdyBhd2F5IG91cgogICAgICAgICAgICAjIGNvbm5lY3Rpb24uCiAgICAgICAgICAgIGlmIG5vdCBjbGVhbl9leGl0OgogICAgICAgICAgICAgICAgIyBUaGUgcmVzcG9uc2UgbWF5IG5vdCBiZSBjbG9zZWQgYnV0IHdlJ3JlIG5vdCBnb2luZyB0byB1c2UgaXQKICAgICAgICAgICAgICAgICMgYW55bW9yZSBzbyBjbG9zZSBpdCBub3cgdG8gZW5zdXJlIHRoYXQgdGhlIGNvbm5lY3Rpb24gaXMKICAgICAgICAgICAgICAgICMgcmVsZWFzZWQgYmFjayB0byB0aGUgcG9vbC4KICAgICAgICAgICAgICAgIGlmIHNlbGYuX29yaWdpbmFsX3Jlc3BvbnNlOgogICAgICAgICAgICAgICAgICAgIHNlbGYuX29yaWdpbmFsX3Jlc3BvbnNlLmNsb3NlKCkKCiAgICAgICAgICAgICAgICAjIENsb3NpbmcgdGhlIHJlc3BvbnNlIG1heSBub3QgYWN0dWFsbHkgYmUgc3VmZmljaWVudCB0byBjbG9zZQogICAgICAgICAgICAgICAgIyBldmVyeXRoaW5nLCBzbyBpZiB3ZSBoYXZlIGEgaG9sZCBvZiB0aGUgY29ubmVjdGlvbiBjbG9zZSB0aGF0CiAgICAgICAgICAgICAgICAjIHRvby4KICAgICAgICAgICAgICAgIGlmIHNlbGYuX2Nvbm5lY3Rpb246CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fY29ubmVjdGlvbi5jbG9zZSgpCgogICAgICAgICAgICAjIElmIHdlIGhvbGQgdGhlIG9yaWdpbmFsIHJlc3BvbnNlIGJ1dCBpdCdzIGNsb3NlZCBub3csIHdlIHNob3VsZAogICAgICAgICAgICAjIHJldHVybiB0aGUgY29ubmVjdGlvbiBiYWNrIHRvIHRoZSBwb29sLgogICAgICAgICAgICBpZiBzZWxmLl9vcmlnaW5hbF9yZXNwb25zZSBhbmQgc2VsZi5fb3JpZ2luYWxfcmVzcG9uc2UuaXNjbG9zZWQoKToKICAgICAgICAgICAgICAgIHNlbGYucmVsZWFzZV9jb25uKCkKCiAgICBkZWYgcmVhZChzZWxmLCBhbXQ9Tm9uZSwgZGVjb2RlX2NvbnRlbnQ9Tm9uZSwgY2FjaGVfY29udGVudD1GYWxzZSk6CiAgICAgICAgIiIiCiAgICAgICAgU2ltaWxhciB0byA6bWV0aDpgaHR0cGxpYi5IVFRQUmVzcG9uc2UucmVhZGAsIGJ1dCB3aXRoIHR3byBhZGRpdGlvbmFsCiAgICAgICAgcGFyYW1ldGVyczogYGBkZWNvZGVfY29udGVudGBgIGFuZCBgYGNhY2hlX2NvbnRlbnRgYC4KCiAgICAgICAgOnBhcmFtIGFtdDoKICAgICAgICAgICAgSG93IG11Y2ggb2YgdGhlIGNvbnRlbnQgdG8gcmVhZC4gSWYgc3BlY2lmaWVkLCBjYWNoaW5nIGlzIHNraXBwZWQKICAgICAgICAgICAgYmVjYXVzZSBpdCBkb2Vzbid0IG1ha2Ugc2Vuc2UgdG8gY2FjaGUgcGFydGlhbCBjb250ZW50IGFzIHRoZSBmdWxsCiAgICAgICAgICAgIHJlc3BvbnNlLgoKICAgICAgICA6cGFyYW0gZGVjb2RlX2NvbnRlbnQ6CiAgICAgICAgICAgIElmIFRydWUsIHdpbGwgYXR0ZW1wdCB0byBkZWNvZGUgdGhlIGJvZHkgYmFzZWQgb24gdGhlCiAgICAgICAgICAgICdjb250ZW50LWVuY29kaW5nJyBoZWFkZXIuCgogICAgICAgIDpwYXJhbSBjYWNoZV9jb250ZW50OgogICAgICAgICAgICBJZiBUcnVlLCB3aWxsIHNhdmUgdGhlIHJldHVybmVkIGRhdGEgc3VjaCB0aGF0IHRoZSBzYW1lIHJlc3VsdCBpcwogICAgICAgICAgICByZXR1cm5lZCBkZXNwaXRlIG9mIHRoZSBzdGF0ZSBvZiB0aGUgdW5kZXJseWluZyBmaWxlIG9iamVjdC4gVGhpcwogICAgICAgICAgICBpcyB1c2VmdWwgaWYgeW91IHdhbnQgdGhlIGBgLmRhdGFgYCBwcm9wZXJ0eSB0byBjb250aW51ZSB3b3JraW5nCiAgICAgICAgICAgIGFmdGVyIGhhdmluZyBgYC5yZWFkKClgYCB0aGUgZmlsZSBvYmplY3QuIChPdmVycmlkZGVuIGlmIGBgYW10YGAgaXMKICAgICAgICAgICAgc2V0LikKICAgICAgICAiIiIKICAgICAgICBzZWxmLl9pbml0X2RlY29kZXIoKQogICAgICAgIGlmIGRlY29kZV9jb250ZW50IGlzIE5vbmU6CiAgICAgICAgICAgIGRlY29kZV9jb250ZW50ID0gc2VsZi5kZWNvZGVfY29udGVudAoKICAgICAgICBpZiBzZWxmLl9mcCBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgZmx1c2hfZGVjb2RlciA9IEZhbHNlCiAgICAgICAgZGF0YSA9IE5vbmUKCiAgICAgICAgd2l0aCBzZWxmLl9lcnJvcl9jYXRjaGVyKCk6CiAgICAgICAgICAgIGlmIGFtdCBpcyBOb25lOgogICAgICAgICAgICAgICAgIyBjU3RyaW5nSU8gZG9lc24ndCBsaWtlIGFtdD1Ob25lCiAgICAgICAgICAgICAgICBkYXRhID0gc2VsZi5fZnAucmVhZCgpCiAgICAgICAgICAgICAgICBmbHVzaF9kZWNvZGVyID0gVHJ1ZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgY2FjaGVfY29udGVudCA9IEZhbHNlCiAgICAgICAgICAgICAgICBkYXRhID0gc2VsZi5fZnAucmVhZChhbXQpCiAgICAgICAgICAgICAgICBpZiBhbXQgIT0gMCBhbmQgbm90IGRhdGE6ICAjIFBsYXRmb3JtLXNwZWNpZmljOiBCdWdneSB2ZXJzaW9ucyBvZiBQeXRob24uCiAgICAgICAgICAgICAgICAgICAgIyBDbG9zZSB0aGUgY29ubmVjdGlvbiB3aGVuIG5vIGRhdGEgaXMgcmV0dXJuZWQKICAgICAgICAgICAgICAgICAgICAjCiAgICAgICAgICAgICAgICAgICAgIyBUaGlzIGlzIHJlZHVuZGFudCB0byB3aGF0IGh0dHBsaWIvaHR0cC5jbGllbnQgX3Nob3VsZF8KICAgICAgICAgICAgICAgICAgICAjIGFscmVhZHkgZG8uICBIb3dldmVyLCB2ZXJzaW9ucyBvZiBweXRob24gcmVsZWFzZWQgYmVmb3JlCiAgICAgICAgICAgICAgICAgICAgIyBEZWNlbWJlciAxNSwgMjAxMiAoaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTE2Mjk4KSBkbwogICAgICAgICAgICAgICAgICAgICMgbm90IHByb3Blcmx5IGNsb3NlIHRoZSBjb25uZWN0aW9uIGluIGFsbCBjYXNlcy4gVGhlcmUgaXMKICAgICAgICAgICAgICAgICAgICAjIG5vIGhhcm0gaW4gcmVkdW5kYW50bHkgY2FsbGluZyBjbG9zZS4KICAgICAgICAgICAgICAgICAgICBzZWxmLl9mcC5jbG9zZSgpCiAgICAgICAgICAgICAgICAgICAgZmx1c2hfZGVjb2RlciA9IFRydWUKICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmVuZm9yY2VfY29udGVudF9sZW5ndGggYW5kIHNlbGYubGVuZ3RoX3JlbWFpbmluZyBub3QgaW4gKDAsIE5vbmUpOgogICAgICAgICAgICAgICAgICAgICAgICAjIFRoaXMgaXMgYW4gZWRnZSBjYXNlIHRoYXQgaHR0cGxpYiBmYWlsZWQgdG8gY292ZXIgZHVlCiAgICAgICAgICAgICAgICAgICAgICAgICMgdG8gY29uY2VybnMgb2YgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4gV2UncmUKICAgICAgICAgICAgICAgICAgICAgICAgIyBhZGRyZXNzaW5nIGl0IGhlcmUgdG8gbWFrZSBzdXJlIEluY29tcGxldGVSZWFkIGlzCiAgICAgICAgICAgICAgICAgICAgICAgICMgcmFpc2VkIGR1cmluZyBzdHJlYW1pbmcsIHNvIGFsbCBjYWxscyB3aXRoIGluY29ycmVjdAogICAgICAgICAgICAgICAgICAgICAgICAjIENvbnRlbnQtTGVuZ3RoIGFyZSBjYXVnaHQuCiAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIEluY29tcGxldGVSZWFkKHNlbGYuX2ZwX2J5dGVzX3JlYWQsIHNlbGYubGVuZ3RoX3JlbWFpbmluZykKCiAgICAgICAgaWYgZGF0YToKICAgICAgICAgICAgc2VsZi5fZnBfYnl0ZXNfcmVhZCArPSBsZW4oZGF0YSkKICAgICAgICAgICAgaWYgc2VsZi5sZW5ndGhfcmVtYWluaW5nIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgc2VsZi5sZW5ndGhfcmVtYWluaW5nIC09IGxlbihkYXRhKQoKICAgICAgICAgICAgZGF0YSA9IHNlbGYuX2RlY29kZShkYXRhLCBkZWNvZGVfY29udGVudCwgZmx1c2hfZGVjb2RlcikKCiAgICAgICAgICAgIGlmIGNhY2hlX2NvbnRlbnQ6CiAgICAgICAgICAgICAgICBzZWxmLl9ib2R5ID0gZGF0YQoKICAgICAgICByZXR1cm4gZGF0YQoKICAgIGRlZiBzdHJlYW0oc2VsZiwgYW10PTIqKjE2LCBkZWNvZGVfY29udGVudD1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBBIGdlbmVyYXRvciB3cmFwcGVyIGZvciB0aGUgcmVhZCgpIG1ldGhvZC4gQSBjYWxsIHdpbGwgYmxvY2sgdW50aWwKICAgICAgICBgYGFtdGBgIGJ5dGVzIGhhdmUgYmVlbiByZWFkIGZyb20gdGhlIGNvbm5lY3Rpb24gb3IgdW50aWwgdGhlCiAgICAgICAgY29ubmVjdGlvbiBpcyBjbG9zZWQuCgogICAgICAgIDpwYXJhbSBhbXQ6CiAgICAgICAgICAgIEhvdyBtdWNoIG9mIHRoZSBjb250ZW50IHRvIHJlYWQuIFRoZSBnZW5lcmF0b3Igd2lsbCByZXR1cm4gdXAgdG8KICAgICAgICAgICAgbXVjaCBkYXRhIHBlciBpdGVyYXRpb24sIGJ1dCBtYXkgcmV0dXJuIGxlc3MuIFRoaXMgaXMgcGFydGljdWxhcmx5CiAgICAgICAgICAgIGxpa2VseSB3aGVuIHVzaW5nIGNvbXByZXNzZWQgZGF0YS4gSG93ZXZlciwgdGhlIGVtcHR5IHN0cmluZyB3aWxsCiAgICAgICAgICAgIG5ldmVyIGJlIHJldHVybmVkLgoKICAgICAgICA6cGFyYW0gZGVjb2RlX2NvbnRlbnQ6CiAgICAgICAgICAgIElmIFRydWUsIHdpbGwgYXR0ZW1wdCB0byBkZWNvZGUgdGhlIGJvZHkgYmFzZWQgb24gdGhlCiAgICAgICAgICAgICdjb250ZW50LWVuY29kaW5nJyBoZWFkZXIuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5jaHVua2VkIGFuZCBzZWxmLnN1cHBvcnRzX2NodW5rZWRfcmVhZHMoKToKICAgICAgICAgICAgZm9yIGxpbmUgaW4gc2VsZi5yZWFkX2NodW5rZWQoYW10LCBkZWNvZGVfY29udGVudD1kZWNvZGVfY29udGVudCk6CiAgICAgICAgICAgICAgICB5aWVsZCBsaW5lCiAgICAgICAgZWxzZToKICAgICAgICAgICAgd2hpbGUgbm90IGlzX2ZwX2Nsb3NlZChzZWxmLl9mcCk6CiAgICAgICAgICAgICAgICBkYXRhID0gc2VsZi5yZWFkKGFtdD1hbXQsIGRlY29kZV9jb250ZW50PWRlY29kZV9jb250ZW50KQoKICAgICAgICAgICAgICAgIGlmIGRhdGE6CiAgICAgICAgICAgICAgICAgICAgeWllbGQgZGF0YQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGZyb21faHR0cGxpYihSZXNwb25zZUNscywgciwgKipyZXNwb25zZV9rdyk6CiAgICAgICAgIiIiCiAgICAgICAgR2l2ZW4gYW4gOmNsYXNzOmBodHRwbGliLkhUVFBSZXNwb25zZWAgaW5zdGFuY2UgYGByYGAsIHJldHVybiBhCiAgICAgICAgY29ycmVzcG9uZGluZyA6Y2xhc3M6YHVybGxpYjMucmVzcG9uc2UuSFRUUFJlc3BvbnNlYCBvYmplY3QuCgogICAgICAgIFJlbWFpbmluZyBwYXJhbWV0ZXJzIGFyZSBwYXNzZWQgdG8gdGhlIEhUVFBSZXNwb25zZSBjb25zdHJ1Y3RvciwgYWxvbmcKICAgICAgICB3aXRoIGBgb3JpZ2luYWxfcmVzcG9uc2U9cmBgLgogICAgICAgICIiIgogICAgICAgIGhlYWRlcnMgPSByLm1zZwoKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShoZWFkZXJzLCBIVFRQSGVhZGVyRGljdCk6CiAgICAgICAgICAgIGlmIFBZMzogICMgUHl0aG9uIDMKICAgICAgICAgICAgICAgIGhlYWRlcnMgPSBIVFRQSGVhZGVyRGljdChoZWFkZXJzLml0ZW1zKCkpCiAgICAgICAgICAgIGVsc2U6ICAjIFB5dGhvbiAyCiAgICAgICAgICAgICAgICBoZWFkZXJzID0gSFRUUEhlYWRlckRpY3QuZnJvbV9odHRwbGliKGhlYWRlcnMpCgogICAgICAgICMgSFRUUFJlc3BvbnNlIG9iamVjdHMgaW4gUHl0aG9uIDMgZG9uJ3QgaGF2ZSBhIC5zdHJpY3QgYXR0cmlidXRlCiAgICAgICAgc3RyaWN0ID0gZ2V0YXR0cihyLCAnc3RyaWN0JywgMCkKICAgICAgICByZXNwID0gUmVzcG9uc2VDbHMoYm9keT1yLAogICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzPWhlYWRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cz1yLnN0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbj1yLnZlcnNpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbj1yLnJlYXNvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWN0PXN0cmljdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxfcmVzcG9uc2U9ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgKipyZXNwb25zZV9rdykKICAgICAgICByZXR1cm4gcmVzcAoKICAgICMgQmFja3dhcmRzLWNvbXBhdGliaWxpdHkgbWV0aG9kcyBmb3IgaHR0cGxpYi5IVFRQUmVzcG9uc2UKICAgIGRlZiBnZXRoZWFkZXJzKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLmhlYWRlcnMKCiAgICBkZWYgZ2V0aGVhZGVyKHNlbGYsIG5hbWUsIGRlZmF1bHQ9Tm9uZSk6CiAgICAgICAgcmV0dXJuIHNlbGYuaGVhZGVycy5nZXQobmFtZSwgZGVmYXVsdCkKCiAgICAjIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciBodHRwLmNvb2tpZWphcgogICAgZGVmIGluZm8oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuaGVhZGVycwoKICAgICMgT3ZlcnJpZGVzIGZyb20gaW8uSU9CYXNlCiAgICBkZWYgY2xvc2Uoc2VsZik6CiAgICAgICAgaWYgbm90IHNlbGYuY2xvc2VkOgogICAgICAgICAgICBzZWxmLl9mcC5jbG9zZSgpCgogICAgICAgIGlmIHNlbGYuX2Nvbm5lY3Rpb246CiAgICAgICAgICAgIHNlbGYuX2Nvbm5lY3Rpb24uY2xvc2UoKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGNsb3NlZChzZWxmKToKICAgICAgICBpZiBzZWxmLl9mcCBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIGVsaWYgaGFzYXR0cihzZWxmLl9mcCwgJ2lzY2xvc2VkJyk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9mcC5pc2Nsb3NlZCgpCiAgICAgICAgZWxpZiBoYXNhdHRyKHNlbGYuX2ZwLCAnY2xvc2VkJyk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9mcC5jbG9zZWQKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBmaWxlbm8oc2VsZik6CiAgICAgICAgaWYgc2VsZi5fZnAgaXMgTm9uZToKICAgICAgICAgICAgcmFpc2UgSU9FcnJvcigiSFRUUFJlc3BvbnNlIGhhcyBubyBmaWxlIHRvIGdldCBhIGZpbGVubyBmcm9tIikKICAgICAgICBlbGlmIGhhc2F0dHIoc2VsZi5fZnAsICJmaWxlbm8iKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2ZwLmZpbGVubygpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgSU9FcnJvcigiVGhlIGZpbGUtbGlrZSBvYmplY3QgdGhpcyBIVFRQUmVzcG9uc2UgaXMgd3JhcHBlZCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgImFyb3VuZCBoYXMgbm8gZmlsZSBkZXNjcmlwdG9yIikKCiAgICBkZWYgZmx1c2goc2VsZik6CiAgICAgICAgaWYgc2VsZi5fZnAgaXMgbm90IE5vbmUgYW5kIGhhc2F0dHIoc2VsZi5fZnAsICdmbHVzaCcpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fZnAuZmx1c2goKQoKICAgIGRlZiByZWFkYWJsZShzZWxmKToKICAgICAgICAjIFRoaXMgbWV0aG9kIGlzIHJlcXVpcmVkIGZvciBgaW9gIG1vZHVsZSBjb21wYXRpYmlsaXR5LgogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIHJlYWRpbnRvKHNlbGYsIGIpOgogICAgICAgICMgVGhpcyBtZXRob2QgaXMgcmVxdWlyZWQgZm9yIGBpb2AgbW9kdWxlIGNvbXBhdGliaWxpdHkuCiAgICAgICAgdGVtcCA9IHNlbGYucmVhZChsZW4oYikpCiAgICAgICAgaWYgbGVuKHRlbXApID09IDA6CiAgICAgICAgICAgIHJldHVybiAwCiAgICAgICAgZWxzZToKICAgICAgICAgICAgYls6bGVuKHRlbXApXSA9IHRlbXAKICAgICAgICAgICAgcmV0dXJuIGxlbih0ZW1wKQoKICAgIGRlZiBzdXBwb3J0c19jaHVua2VkX3JlYWRzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIENoZWNrcyBpZiB0aGUgdW5kZXJseWluZyBmaWxlLWxpa2Ugb2JqZWN0IGxvb2tzIGxpa2UgYQogICAgICAgIGh0dHBsaWIuSFRUUFJlc3BvbnNlIG9iamVjdC4gV2UgZG8gdGhpcyBieSB0ZXN0aW5nIGZvciB0aGUgZnAKICAgICAgICBhdHRyaWJ1dGUuIElmIGl0IGlzIHByZXNlbnQgd2UgYXNzdW1lIGl0IHJldHVybnMgcmF3IGNodW5rcyBhcwogICAgICAgIHByb2Nlc3NlZCBieSByZWFkX2NodW5rZWQoKS4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gaGFzYXR0cihzZWxmLl9mcCwgJ2ZwJykKCiAgICBkZWYgX3VwZGF0ZV9jaHVua19sZW5ndGgoc2VsZik6CiAgICAgICAgIyBGaXJzdCwgd2UnbGwgZmlndXJlIG91dCBsZW5ndGggb2YgYSBjaHVuayBhbmQgdGhlbgogICAgICAgICMgd2UnbGwgdHJ5IHRvIHJlYWQgaXQgZnJvbSBzb2NrZXQuCiAgICAgICAgaWYgc2VsZi5jaHVua19sZWZ0IGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBsaW5lID0gc2VsZi5fZnAuZnAucmVhZGxpbmUoKQogICAgICAgIGxpbmUgPSBsaW5lLnNwbGl0KGInOycsIDEpWzBdCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLmNodW5rX2xlZnQgPSBpbnQobGluZSwgMTYpCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICMgSW52YWxpZCBjaHVua2VkIHByb3RvY29sIHJlc3BvbnNlLCBhYm9ydC4KICAgICAgICAgICAgc2VsZi5jbG9zZSgpCiAgICAgICAgICAgIHJhaXNlIGh0dHBsaWIuSW5jb21wbGV0ZVJlYWQobGluZSkKCiAgICBkZWYgX2hhbmRsZV9jaHVuayhzZWxmLCBhbXQpOgogICAgICAgIHJldHVybmVkX2NodW5rID0gTm9uZQogICAgICAgIGlmIGFtdCBpcyBOb25lOgogICAgICAgICAgICBjaHVuayA9IHNlbGYuX2ZwLl9zYWZlX3JlYWQoc2VsZi5jaHVua19sZWZ0KQogICAgICAgICAgICByZXR1cm5lZF9jaHVuayA9IGNodW5rCiAgICAgICAgICAgIHNlbGYuX2ZwLl9zYWZlX3JlYWQoMikgICMgVG9zcyB0aGUgQ1JMRiBhdCB0aGUgZW5kIG9mIHRoZSBjaHVuay4KICAgICAgICAgICAgc2VsZi5jaHVua19sZWZ0ID0gTm9uZQogICAgICAgIGVsaWYgYW10IDwgc2VsZi5jaHVua19sZWZ0OgogICAgICAgICAgICB2YWx1ZSA9IHNlbGYuX2ZwLl9zYWZlX3JlYWQoYW10KQogICAgICAgICAgICBzZWxmLmNodW5rX2xlZnQgPSBzZWxmLmNodW5rX2xlZnQgLSBhbXQKICAgICAgICAgICAgcmV0dXJuZWRfY2h1bmsgPSB2YWx1ZQogICAgICAgIGVsaWYgYW10ID09IHNlbGYuY2h1bmtfbGVmdDoKICAgICAgICAgICAgdmFsdWUgPSBzZWxmLl9mcC5fc2FmZV9yZWFkKGFtdCkKICAgICAgICAgICAgc2VsZi5fZnAuX3NhZmVfcmVhZCgyKSAgIyBUb3NzIHRoZSBDUkxGIGF0IHRoZSBlbmQgb2YgdGhlIGNodW5rLgogICAgICAgICAgICBzZWxmLmNodW5rX2xlZnQgPSBOb25lCiAgICAgICAgICAgIHJldHVybmVkX2NodW5rID0gdmFsdWUKICAgICAgICBlbHNlOiAgIyBhbXQgPiBzZWxmLmNodW5rX2xlZnQKICAgICAgICAgICAgcmV0dXJuZWRfY2h1bmsgPSBzZWxmLl9mcC5fc2FmZV9yZWFkKHNlbGYuY2h1bmtfbGVmdCkKICAgICAgICAgICAgc2VsZi5fZnAuX3NhZmVfcmVhZCgyKSAgIyBUb3NzIHRoZSBDUkxGIGF0IHRoZSBlbmQgb2YgdGhlIGNodW5rLgogICAgICAgICAgICBzZWxmLmNodW5rX2xlZnQgPSBOb25lCiAgICAgICAgcmV0dXJuIHJldHVybmVkX2NodW5rCgogICAgZGVmIHJlYWRfY2h1bmtlZChzZWxmLCBhbXQ9Tm9uZSwgZGVjb2RlX2NvbnRlbnQ9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgU2ltaWxhciB0byA6bWV0aDpgSFRUUFJlc3BvbnNlLnJlYWRgLCBidXQgd2l0aCBhbiBhZGRpdGlvbmFsCiAgICAgICAgcGFyYW1ldGVyOiBgYGRlY29kZV9jb250ZW50YGAuCgogICAgICAgIDpwYXJhbSBkZWNvZGVfY29udGVudDoKICAgICAgICAgICAgSWYgVHJ1ZSwgd2lsbCBhdHRlbXB0IHRvIGRlY29kZSB0aGUgYm9keSBiYXNlZCBvbiB0aGUKICAgICAgICAgICAgJ2NvbnRlbnQtZW5jb2RpbmcnIGhlYWRlci4KICAgICAgICAiIiIKICAgICAgICBzZWxmLl9pbml0X2RlY29kZXIoKQogICAgICAgICMgRklYTUU6IFJld3JpdGUgdGhpcyBtZXRob2QgYW5kIG1ha2UgaXQgYSBjbGFzcyB3aXRoIGEgYmV0dGVyIHN0cnVjdHVyZWQgbG9naWMuCiAgICAgICAgaWYgbm90IHNlbGYuY2h1bmtlZDoKICAgICAgICAgICAgcmFpc2UgUmVzcG9uc2VOb3RDaHVua2VkKAogICAgICAgICAgICAgICAgIlJlc3BvbnNlIGlzIG5vdCBjaHVua2VkLiAiCiAgICAgICAgICAgICAgICAiSGVhZGVyICd0cmFuc2Zlci1lbmNvZGluZzogY2h1bmtlZCcgaXMgbWlzc2luZy4iKQogICAgICAgIGlmIG5vdCBzZWxmLnN1cHBvcnRzX2NodW5rZWRfcmVhZHMoKToKICAgICAgICAgICAgcmFpc2UgQm9keU5vdEh0dHBsaWJDb21wYXRpYmxlKAogICAgICAgICAgICAgICAgIkJvZHkgc2hvdWxkIGJlIGh0dHBsaWIuSFRUUFJlc3BvbnNlIGxpa2UuICIKICAgICAgICAgICAgICAgICJJdCBzaG91bGQgaGF2ZSBoYXZlIGFuIGZwIGF0dHJpYnV0ZSB3aGljaCByZXR1cm5zIHJhdyBjaHVua3MuIikKCiAgICAgICAgIyBEb24ndCBib3RoZXIgcmVhZGluZyB0aGUgYm9keSBvZiBhIEhFQUQgcmVxdWVzdC4KICAgICAgICBpZiBzZWxmLl9vcmlnaW5hbF9yZXNwb25zZSBhbmQgaXNfcmVzcG9uc2VfdG9faGVhZChzZWxmLl9vcmlnaW5hbF9yZXNwb25zZSk6CiAgICAgICAgICAgIHNlbGYuX29yaWdpbmFsX3Jlc3BvbnNlLmNsb3NlKCkKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIHdpdGggc2VsZi5fZXJyb3JfY2F0Y2hlcigpOgogICAgICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICAgICAgc2VsZi5fdXBkYXRlX2NodW5rX2xlbmd0aCgpCiAgICAgICAgICAgICAgICBpZiBzZWxmLmNodW5rX2xlZnQgPT0gMDoKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgY2h1bmsgPSBzZWxmLl9oYW5kbGVfY2h1bmsoYW10KQogICAgICAgICAgICAgICAgZGVjb2RlZCA9IHNlbGYuX2RlY29kZShjaHVuaywgZGVjb2RlX2NvbnRlbnQ9ZGVjb2RlX2NvbnRlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsdXNoX2RlY29kZXI9RmFsc2UpCiAgICAgICAgICAgICAgICBpZiBkZWNvZGVkOgogICAgICAgICAgICAgICAgICAgIHlpZWxkIGRlY29kZWQKCiAgICAgICAgICAgIGlmIGRlY29kZV9jb250ZW50OgogICAgICAgICAgICAgICAgIyBPbiBDUHl0aG9uIGFuZCBQeVB5LCB3ZSBzaG91bGQgbmV2ZXIgbmVlZCB0byBmbHVzaCB0aGUKICAgICAgICAgICAgICAgICMgZGVjb2Rlci4gSG93ZXZlciwgb24gSnl0aG9uIHdlICptaWdodCogbmVlZCB0bywgc28KICAgICAgICAgICAgICAgICMgbGV0cyBkZWZlbnNpdmVseSBkbyBpdCBhbnl3YXkuCiAgICAgICAgICAgICAgICBkZWNvZGVkID0gc2VsZi5fZmx1c2hfZGVjb2RlcigpCiAgICAgICAgICAgICAgICBpZiBkZWNvZGVkOiAgIyBQbGF0Zm9ybS1zcGVjaWZpYzogSnl0aG9uLgogICAgICAgICAgICAgICAgICAgIHlpZWxkIGRlY29kZWQKCiAgICAgICAgICAgICMgQ2h1bmsgY29udGVudCBlbmRzIHdpdGggXHJcbjogZGlzY2FyZCBpdC4KICAgICAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgICAgIGxpbmUgPSBzZWxmLl9mcC5mcC5yZWFkbGluZSgpCiAgICAgICAgICAgICAgICBpZiBub3QgbGluZToKICAgICAgICAgICAgICAgICAgICAjIFNvbWUgc2l0ZXMgbWF5IG5vdCBlbmQgd2l0aCAnXHJcbicuCiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgIGlmIGxpbmUgPT0gYidcclxuJzoKICAgICAgICAgICAgICAgICAgICBicmVhawoKICAgICAgICAgICAgIyBXZSByZWFkIGV2ZXJ5dGhpbmc7IGNsb3NlIHRoZSAiZmlsZSIuCiAgICAgICAgICAgIGlmIHNlbGYuX29yaWdpbmFsX3Jlc3BvbnNlOgogICAgICAgICAgICAgICAgc2VsZi5fb3JpZ2luYWxfcmVzcG9uc2UuY2xvc2UoKQpQSwMEFAAAAAAAAAAhAFJ14b8UBAAAFAQAAEEAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvdXRpbC9fX2luaXRfXy5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CiMgRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBwcm92aWRlIGltcG9ydHMgdGhhdCB1c2VkIHRvIGJlIGhlcmUuCmZyb20gLmNvbm5lY3Rpb24gaW1wb3J0IGlzX2Nvbm5lY3Rpb25fZHJvcHBlZApmcm9tIC5yZXF1ZXN0IGltcG9ydCBtYWtlX2hlYWRlcnMKZnJvbSAucmVzcG9uc2UgaW1wb3J0IGlzX2ZwX2Nsb3NlZApmcm9tIC5zc2xfIGltcG9ydCAoCiAgICBTU0xDb250ZXh0LAogICAgSEFTX1NOSSwKICAgIElTX1BZT1BFTlNTTCwKICAgIElTX1NFQ1VSRVRSQU5TUE9SVCwKICAgIGFzc2VydF9maW5nZXJwcmludCwKICAgIHJlc29sdmVfY2VydF9yZXFzLAogICAgcmVzb2x2ZV9zc2xfdmVyc2lvbiwKICAgIHNzbF93cmFwX3NvY2tldCwKKQpmcm9tIC50aW1lb3V0IGltcG9ydCAoCiAgICBjdXJyZW50X3RpbWUsCiAgICBUaW1lb3V0LAopCgpmcm9tIC5yZXRyeSBpbXBvcnQgUmV0cnkKZnJvbSAudXJsIGltcG9ydCAoCiAgICBnZXRfaG9zdCwKICAgIHBhcnNlX3VybCwKICAgIHNwbGl0X2ZpcnN0LAogICAgVXJsLAopCmZyb20gLndhaXQgaW1wb3J0ICgKICAgIHdhaXRfZm9yX3JlYWQsCiAgICB3YWl0X2Zvcl93cml0ZQopCgpfX2FsbF9fID0gKAogICAgJ0hBU19TTkknLAogICAgJ0lTX1BZT1BFTlNTTCcsCiAgICAnSVNfU0VDVVJFVFJBTlNQT1JUJywKICAgICdTU0xDb250ZXh0JywKICAgICdSZXRyeScsCiAgICAnVGltZW91dCcsCiAgICAnVXJsJywKICAgICdhc3NlcnRfZmluZ2VycHJpbnQnLAogICAgJ2N1cnJlbnRfdGltZScsCiAgICAnaXNfY29ubmVjdGlvbl9kcm9wcGVkJywKICAgICdpc19mcF9jbG9zZWQnLAogICAgJ2dldF9ob3N0JywKICAgICdwYXJzZV91cmwnLAogICAgJ21ha2VfaGVhZGVycycsCiAgICAncmVzb2x2ZV9jZXJ0X3JlcXMnLAogICAgJ3Jlc29sdmVfc3NsX3ZlcnNpb24nLAogICAgJ3NwbGl0X2ZpcnN0JywKICAgICdzc2xfd3JhcF9zb2NrZXQnLAogICAgJ3dhaXRfZm9yX3JlYWQnLAogICAgJ3dhaXRfZm9yX3dyaXRlJwopClBLAwQUAAAAAAAAACEAq59fPY0QAACNEAAAQwAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy91dGlsL2Nvbm5lY3Rpb24ucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAppbXBvcnQgc29ja2V0CmZyb20gLndhaXQgaW1wb3J0IHdhaXRfZm9yX3JlYWQKZnJvbSAuc2VsZWN0b3JzIGltcG9ydCBIQVNfU0VMRUNULCBTZWxlY3RvckVycm9yCgoKZGVmIGlzX2Nvbm5lY3Rpb25fZHJvcHBlZChjb25uKTogICMgUGxhdGZvcm0tc3BlY2lmaWMKICAgICIiIgogICAgUmV0dXJucyBUcnVlIGlmIHRoZSBjb25uZWN0aW9uIGlzIGRyb3BwZWQgYW5kIHNob3VsZCBiZSBjbG9zZWQuCgogICAgOnBhcmFtIGNvbm46CiAgICAgICAgOmNsYXNzOmBodHRwbGliLkhUVFBDb25uZWN0aW9uYCBvYmplY3QuCgogICAgTm90ZTogRm9yIHBsYXRmb3JtcyBsaWtlIEFwcEVuZ2luZSwgdGhpcyB3aWxsIGFsd2F5cyByZXR1cm4gYGBGYWxzZWBgIHRvCiAgICBsZXQgdGhlIHBsYXRmb3JtIGhhbmRsZSBjb25uZWN0aW9uIHJlY3ljbGluZyB0cmFuc3BhcmVudGx5IGZvciB1cy4KICAgICIiIgogICAgc29jayA9IGdldGF0dHIoY29ubiwgJ3NvY2snLCBGYWxzZSkKICAgIGlmIHNvY2sgaXMgRmFsc2U6ICAjIFBsYXRmb3JtLXNwZWNpZmljOiBBcHBFbmdpbmUKICAgICAgICByZXR1cm4gRmFsc2UKICAgIGlmIHNvY2sgaXMgTm9uZTogICMgQ29ubmVjdGlvbiBhbHJlYWR5IGNsb3NlZCAoc3VjaCBhcyBieSBodHRwbGliKS4KICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGlmIG5vdCBIQVNfU0VMRUNUOgogICAgICAgIHJldHVybiBGYWxzZQoKICAgIHRyeToKICAgICAgICByZXR1cm4gYm9vbCh3YWl0X2Zvcl9yZWFkKHNvY2ssIHRpbWVvdXQ9MC4wKSkKICAgIGV4Y2VwdCBTZWxlY3RvckVycm9yOgogICAgICAgIHJldHVybiBUcnVlCgoKIyBUaGlzIGZ1bmN0aW9uIGlzIGNvcGllZCBmcm9tIHNvY2tldC5weSBpbiB0aGUgUHl0aG9uIDIuNyBzdGFuZGFyZAojIGxpYnJhcnkgdGVzdCBzdWl0ZS4gQWRkZWQgdG8gaXRzIHNpZ25hdHVyZSBpcyBvbmx5IGBzb2NrZXRfb3B0aW9uc2AuCiMgT25lIGFkZGl0aW9uYWwgbW9kaWZpY2F0aW9uIGlzIHRoYXQgd2UgYXZvaWQgYmluZGluZyB0byBJUHY2IHNlcnZlcnMKIyBkaXNjb3ZlcmVkIGluIEROUyBpZiB0aGUgc3lzdGVtIGRvZXNuJ3QgaGF2ZSBJUHY2IGZ1bmN0aW9uYWxpdHkuCmRlZiBjcmVhdGVfY29ubmVjdGlvbihhZGRyZXNzLCB0aW1lb3V0PXNvY2tldC5fR0xPQkFMX0RFRkFVTFRfVElNRU9VVCwKICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZV9hZGRyZXNzPU5vbmUsIHNvY2tldF9vcHRpb25zPU5vbmUpOgogICAgIiIiQ29ubmVjdCB0byAqYWRkcmVzcyogYW5kIHJldHVybiB0aGUgc29ja2V0IG9iamVjdC4KCiAgICBDb252ZW5pZW5jZSBmdW5jdGlvbi4gIENvbm5lY3QgdG8gKmFkZHJlc3MqIChhIDItdHVwbGUgYGAoaG9zdCwKICAgIHBvcnQpYGApIGFuZCByZXR1cm4gdGhlIHNvY2tldCBvYmplY3QuICBQYXNzaW5nIHRoZSBvcHRpb25hbAogICAgKnRpbWVvdXQqIHBhcmFtZXRlciB3aWxsIHNldCB0aGUgdGltZW91dCBvbiB0aGUgc29ja2V0IGluc3RhbmNlCiAgICBiZWZvcmUgYXR0ZW1wdGluZyB0byBjb25uZWN0LiAgSWYgbm8gKnRpbWVvdXQqIGlzIHN1cHBsaWVkLCB0aGUKICAgIGdsb2JhbCBkZWZhdWx0IHRpbWVvdXQgc2V0dGluZyByZXR1cm5lZCBieSA6ZnVuYzpgZ2V0ZGVmYXVsdHRpbWVvdXRgCiAgICBpcyB1c2VkLiAgSWYgKnNvdXJjZV9hZGRyZXNzKiBpcyBzZXQgaXQgbXVzdCBiZSBhIHR1cGxlIG9mIChob3N0LCBwb3J0KQogICAgZm9yIHRoZSBzb2NrZXQgdG8gYmluZCBhcyBhIHNvdXJjZSBhZGRyZXNzIGJlZm9yZSBtYWtpbmcgdGhlIGNvbm5lY3Rpb24uCiAgICBBbiBob3N0IG9mICcnIG9yIHBvcnQgMCB0ZWxscyB0aGUgT1MgdG8gdXNlIHRoZSBkZWZhdWx0LgogICAgIiIiCgogICAgaG9zdCwgcG9ydCA9IGFkZHJlc3MKICAgIGlmIGhvc3Quc3RhcnRzd2l0aCgnWycpOgogICAgICAgIGhvc3QgPSBob3N0LnN0cmlwKCdbXScpCiAgICBlcnIgPSBOb25lCgogICAgIyBVc2luZyB0aGUgdmFsdWUgZnJvbSBhbGxvd2VkX2dhaV9mYW1pbHkoKSBpbiB0aGUgY29udGV4dCBvZiBnZXRhZGRyaW5mbyBsZXRzCiAgICAjIHVzIHNlbGVjdCB3aGV0aGVyIHRvIHdvcmsgd2l0aCBJUHY0IEROUyByZWNvcmRzLCBJUHY2IHJlY29yZHMsIG9yIGJvdGguCiAgICAjIFRoZSBvcmlnaW5hbCBjcmVhdGVfY29ubmVjdGlvbiBmdW5jdGlvbiBhbHdheXMgcmV0dXJucyBhbGwgcmVjb3Jkcy4KICAgIGZhbWlseSA9IGFsbG93ZWRfZ2FpX2ZhbWlseSgpCgogICAgZm9yIHJlcyBpbiBzb2NrZXQuZ2V0YWRkcmluZm8oaG9zdCwgcG9ydCwgZmFtaWx5LCBzb2NrZXQuU09DS19TVFJFQU0pOgogICAgICAgIGFmLCBzb2NrdHlwZSwgcHJvdG8sIGNhbm9ubmFtZSwgc2EgPSByZXMKICAgICAgICBzb2NrID0gTm9uZQogICAgICAgIHRyeToKICAgICAgICAgICAgc29jayA9IHNvY2tldC5zb2NrZXQoYWYsIHNvY2t0eXBlLCBwcm90bykKCiAgICAgICAgICAgICMgSWYgcHJvdmlkZWQsIHNldCBzb2NrZXQgbGV2ZWwgb3B0aW9ucyBiZWZvcmUgY29ubmVjdGluZy4KICAgICAgICAgICAgX3NldF9zb2NrZXRfb3B0aW9ucyhzb2NrLCBzb2NrZXRfb3B0aW9ucykKCiAgICAgICAgICAgIGlmIHRpbWVvdXQgaXMgbm90IHNvY2tldC5fR0xPQkFMX0RFRkFVTFRfVElNRU9VVDoKICAgICAgICAgICAgICAgIHNvY2suc2V0dGltZW91dCh0aW1lb3V0KQogICAgICAgICAgICBpZiBzb3VyY2VfYWRkcmVzczoKICAgICAgICAgICAgICAgIHNvY2suYmluZChzb3VyY2VfYWRkcmVzcykKICAgICAgICAgICAgc29jay5jb25uZWN0KHNhKQogICAgICAgICAgICByZXR1cm4gc29jawoKICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yIGFzIGU6CiAgICAgICAgICAgIGVyciA9IGUKICAgICAgICAgICAgaWYgc29jayBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIHNvY2suY2xvc2UoKQogICAgICAgICAgICAgICAgc29jayA9IE5vbmUKCiAgICBpZiBlcnIgaXMgbm90IE5vbmU6CiAgICAgICAgcmFpc2UgZXJyCgogICAgcmFpc2Ugc29ja2V0LmVycm9yKCJnZXRhZGRyaW5mbyByZXR1cm5zIGFuIGVtcHR5IGxpc3QiKQoKCmRlZiBfc2V0X3NvY2tldF9vcHRpb25zKHNvY2ssIG9wdGlvbnMpOgogICAgaWYgb3B0aW9ucyBpcyBOb25lOgogICAgICAgIHJldHVybgoKICAgIGZvciBvcHQgaW4gb3B0aW9uczoKICAgICAgICBzb2NrLnNldHNvY2tvcHQoKm9wdCkKCgpkZWYgYWxsb3dlZF9nYWlfZmFtaWx5KCk6CiAgICAiIiJUaGlzIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIHdvcmsgaW4gdGhlIGNvbnRleHQgb2YKICAgIGdldGFkZHJpbmZvLCB3aGVyZSBmYW1pbHk9c29ja2V0LkFGX1VOU1BFQyBpcyB0aGUgZGVmYXVsdCBhbmQKICAgIHdpbGwgcGVyZm9ybSBhIEROUyBzZWFyY2ggZm9yIGJvdGggSVB2NiBhbmQgSVB2NCByZWNvcmRzLiIiIgoKICAgIGZhbWlseSA9IHNvY2tldC5BRl9JTkVUCiAgICBpZiBIQVNfSVBWNjoKICAgICAgICBmYW1pbHkgPSBzb2NrZXQuQUZfVU5TUEVDCiAgICByZXR1cm4gZmFtaWx5CgoKZGVmIF9oYXNfaXB2Nihob3N0KToKICAgICIiIiBSZXR1cm5zIFRydWUgaWYgdGhlIHN5c3RlbSBjYW4gYmluZCBhbiBJUHY2IGFkZHJlc3MuICIiIgogICAgc29jayA9IE5vbmUKICAgIGhhc19pcHY2ID0gRmFsc2UKCiAgICBpZiBzb2NrZXQuaGFzX2lwdjY6CiAgICAgICAgIyBoYXNfaXB2NiByZXR1cm5zIHRydWUgaWYgY1B5dGhvbiB3YXMgY29tcGlsZWQgd2l0aCBJUHY2IHN1cHBvcnQuCiAgICAgICAgIyBJdCBkb2VzIG5vdCB0ZWxsIHVzIGlmIHRoZSBzeXN0ZW0gaGFzIElQdjYgc3VwcG9ydCBlbmFibGVkLiBUbwogICAgICAgICMgZGV0ZXJtaW5lIHRoYXQgd2UgbXVzdCBiaW5kIHRvIGFuIElQdjYgYWRkcmVzcy4KICAgICAgICAjIGh0dHBzOi8vZ2l0aHViLmNvbS9zaGF6b3cvdXJsbGliMy9wdWxsLzYxMQogICAgICAgICMgaHR0cHM6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWU2NTgzMjcKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNvY2sgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUNikKICAgICAgICAgICAgc29jay5iaW5kKChob3N0LCAwKSkKICAgICAgICAgICAgaGFzX2lwdjYgPSBUcnVlCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgcGFzcwoKICAgIGlmIHNvY2s6CiAgICAgICAgc29jay5jbG9zZSgpCiAgICByZXR1cm4gaGFzX2lwdjYKCgpIQVNfSVBWNiA9IF9oYXNfaXB2NignOjoxJykKUEsDBBQAAAAAAAAAIQBBYZDXeQ4AAHkOAABAAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL3V0aWwvcmVxdWVzdC5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CmZyb20gYmFzZTY0IGltcG9ydCBiNjRlbmNvZGUKCmZyb20gLi5wYWNrYWdlcy5zaXggaW1wb3J0IGIsIGludGVnZXJfdHlwZXMKZnJvbSAuLmV4Y2VwdGlvbnMgaW1wb3J0IFVucmV3aW5kYWJsZUJvZHlFcnJvcgoKQUNDRVBUX0VOQ09ESU5HID0gJ2d6aXAsZGVmbGF0ZScKX0ZBSUxFRFRFTEwgPSBvYmplY3QoKQoKCmRlZiBtYWtlX2hlYWRlcnMoa2VlcF9hbGl2ZT1Ob25lLCBhY2NlcHRfZW5jb2Rpbmc9Tm9uZSwgdXNlcl9hZ2VudD1Ob25lLAogICAgICAgICAgICAgICAgIGJhc2ljX2F1dGg9Tm9uZSwgcHJveHlfYmFzaWNfYXV0aD1Ob25lLCBkaXNhYmxlX2NhY2hlPU5vbmUpOgogICAgIiIiCiAgICBTaG9ydGN1dHMgZm9yIGdlbmVyYXRpbmcgcmVxdWVzdCBoZWFkZXJzLgoKICAgIDpwYXJhbSBrZWVwX2FsaXZlOgogICAgICAgIElmIGBgVHJ1ZWBgLCBhZGRzICdjb25uZWN0aW9uOiBrZWVwLWFsaXZlJyBoZWFkZXIuCgogICAgOnBhcmFtIGFjY2VwdF9lbmNvZGluZzoKICAgICAgICBDYW4gYmUgYSBib29sZWFuLCBsaXN0LCBvciBzdHJpbmcuCiAgICAgICAgYGBUcnVlYGAgdHJhbnNsYXRlcyB0byAnZ3ppcCxkZWZsYXRlJy4KICAgICAgICBMaXN0IHdpbGwgZ2V0IGpvaW5lZCBieSBjb21tYS4KICAgICAgICBTdHJpbmcgd2lsbCBiZSB1c2VkIGFzIHByb3ZpZGVkLgoKICAgIDpwYXJhbSB1c2VyX2FnZW50OgogICAgICAgIFN0cmluZyByZXByZXNlbnRpbmcgdGhlIHVzZXItYWdlbnQgeW91IHdhbnQsIHN1Y2ggYXMKICAgICAgICAicHl0aG9uLXVybGxpYjMvMC42IgoKICAgIDpwYXJhbSBiYXNpY19hdXRoOgogICAgICAgIENvbG9uLXNlcGFyYXRlZCB1c2VybmFtZTpwYXNzd29yZCBzdHJpbmcgZm9yICdhdXRob3JpemF0aW9uOiBiYXNpYyAuLi4nCiAgICAgICAgYXV0aCBoZWFkZXIuCgogICAgOnBhcmFtIHByb3h5X2Jhc2ljX2F1dGg6CiAgICAgICAgQ29sb24tc2VwYXJhdGVkIHVzZXJuYW1lOnBhc3N3b3JkIHN0cmluZyBmb3IgJ3Byb3h5LWF1dGhvcml6YXRpb246IGJhc2ljIC4uLicKICAgICAgICBhdXRoIGhlYWRlci4KCiAgICA6cGFyYW0gZGlzYWJsZV9jYWNoZToKICAgICAgICBJZiBgYFRydWVgYCwgYWRkcyAnY2FjaGUtY29udHJvbDogbm8tY2FjaGUnIGhlYWRlci4KCiAgICBFeGFtcGxlOjoKCiAgICAgICAgPj4+IG1ha2VfaGVhZGVycyhrZWVwX2FsaXZlPVRydWUsIHVzZXJfYWdlbnQ9IkJhdG1hbi8xLjAiKQogICAgICAgIHsnY29ubmVjdGlvbic6ICdrZWVwLWFsaXZlJywgJ3VzZXItYWdlbnQnOiAnQmF0bWFuLzEuMCd9CiAgICAgICAgPj4+IG1ha2VfaGVhZGVycyhhY2NlcHRfZW5jb2Rpbmc9VHJ1ZSkKICAgICAgICB7J2FjY2VwdC1lbmNvZGluZyc6ICdnemlwLGRlZmxhdGUnfQogICAgIiIiCiAgICBoZWFkZXJzID0ge30KICAgIGlmIGFjY2VwdF9lbmNvZGluZzoKICAgICAgICBpZiBpc2luc3RhbmNlKGFjY2VwdF9lbmNvZGluZywgc3RyKToKICAgICAgICAgICAgcGFzcwogICAgICAgIGVsaWYgaXNpbnN0YW5jZShhY2NlcHRfZW5jb2RpbmcsIGxpc3QpOgogICAgICAgICAgICBhY2NlcHRfZW5jb2RpbmcgPSAnLCcuam9pbihhY2NlcHRfZW5jb2RpbmcpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgYWNjZXB0X2VuY29kaW5nID0gQUNDRVBUX0VOQ09ESU5HCiAgICAgICAgaGVhZGVyc1snYWNjZXB0LWVuY29kaW5nJ10gPSBhY2NlcHRfZW5jb2RpbmcKCiAgICBpZiB1c2VyX2FnZW50OgogICAgICAgIGhlYWRlcnNbJ3VzZXItYWdlbnQnXSA9IHVzZXJfYWdlbnQKCiAgICBpZiBrZWVwX2FsaXZlOgogICAgICAgIGhlYWRlcnNbJ2Nvbm5lY3Rpb24nXSA9ICdrZWVwLWFsaXZlJwoKICAgIGlmIGJhc2ljX2F1dGg6CiAgICAgICAgaGVhZGVyc1snYXV0aG9yaXphdGlvbiddID0gJ0Jhc2ljICcgKyBcCiAgICAgICAgICAgIGI2NGVuY29kZShiKGJhc2ljX2F1dGgpKS5kZWNvZGUoJ3V0Zi04JykKCiAgICBpZiBwcm94eV9iYXNpY19hdXRoOgogICAgICAgIGhlYWRlcnNbJ3Byb3h5LWF1dGhvcml6YXRpb24nXSA9ICdCYXNpYyAnICsgXAogICAgICAgICAgICBiNjRlbmNvZGUoYihwcm94eV9iYXNpY19hdXRoKSkuZGVjb2RlKCd1dGYtOCcpCgogICAgaWYgZGlzYWJsZV9jYWNoZToKICAgICAgICBoZWFkZXJzWydjYWNoZS1jb250cm9sJ10gPSAnbm8tY2FjaGUnCgogICAgcmV0dXJuIGhlYWRlcnMKCgpkZWYgc2V0X2ZpbGVfcG9zaXRpb24oYm9keSwgcG9zKToKICAgICIiIgogICAgSWYgYSBwb3NpdGlvbiBpcyBwcm92aWRlZCwgbW92ZSBmaWxlIHRvIHRoYXQgcG9pbnQuCiAgICBPdGhlcndpc2UsIHdlJ2xsIGF0dGVtcHQgdG8gcmVjb3JkIGEgcG9zaXRpb24gZm9yIGZ1dHVyZSB1c2UuCiAgICAiIiIKICAgIGlmIHBvcyBpcyBub3QgTm9uZToKICAgICAgICByZXdpbmRfYm9keShib2R5LCBwb3MpCiAgICBlbGlmIGdldGF0dHIoYm9keSwgJ3RlbGwnLCBOb25lKSBpcyBub3QgTm9uZToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHBvcyA9IGJvZHkudGVsbCgpCiAgICAgICAgZXhjZXB0IChJT0Vycm9yLCBPU0Vycm9yKToKICAgICAgICAgICAgIyBUaGlzIGRpZmZlcmVudGlhdGVzIGZyb20gTm9uZSwgYWxsb3dpbmcgdXMgdG8gY2F0Y2gKICAgICAgICAgICAgIyBhIGZhaWxlZCBgdGVsbCgpYCBsYXRlciB3aGVuIHRyeWluZyB0byByZXdpbmQgdGhlIGJvZHkuCiAgICAgICAgICAgIHBvcyA9IF9GQUlMRURURUxMCgogICAgcmV0dXJuIHBvcwoKCmRlZiByZXdpbmRfYm9keShib2R5LCBib2R5X3Bvcyk6CiAgICAiIiIKICAgIEF0dGVtcHQgdG8gcmV3aW5kIGJvZHkgdG8gYSBjZXJ0YWluIHBvc2l0aW9uLgogICAgUHJpbWFyaWx5IHVzZWQgZm9yIHJlcXVlc3QgcmVkaXJlY3RzIGFuZCByZXRyaWVzLgoKICAgIDpwYXJhbSBib2R5OgogICAgICAgIEZpbGUtbGlrZSBvYmplY3QgdGhhdCBzdXBwb3J0cyBzZWVrLgoKICAgIDpwYXJhbSBpbnQgcG9zOgogICAgICAgIFBvc2l0aW9uIHRvIHNlZWsgdG8gaW4gZmlsZS4KICAgICIiIgogICAgYm9keV9zZWVrID0gZ2V0YXR0cihib2R5LCAnc2VlaycsIE5vbmUpCiAgICBpZiBib2R5X3NlZWsgaXMgbm90IE5vbmUgYW5kIGlzaW5zdGFuY2UoYm9keV9wb3MsIGludGVnZXJfdHlwZXMpOgogICAgICAgIHRyeToKICAgICAgICAgICAgYm9keV9zZWVrKGJvZHlfcG9zKQogICAgICAgIGV4Y2VwdCAoSU9FcnJvciwgT1NFcnJvcik6CiAgICAgICAgICAgIHJhaXNlIFVucmV3aW5kYWJsZUJvZHlFcnJvcigiQW4gZXJyb3Igb2NjdXJyZWQgd2hlbiByZXdpbmRpbmcgcmVxdWVzdCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYm9keSBmb3IgcmVkaXJlY3QvcmV0cnkuIikKICAgIGVsaWYgYm9keV9wb3MgaXMgX0ZBSUxFRFRFTEw6CiAgICAgICAgcmFpc2UgVW5yZXdpbmRhYmxlQm9keUVycm9yKCJVbmFibGUgdG8gcmVjb3JkIGZpbGUgcG9zaXRpb24gZm9yIHJld2luZGluZyAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXF1ZXN0IGJvZHkgZHVyaW5nIGEgcmVkaXJlY3QvcmV0cnkuIikKICAgIGVsc2U6CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiYm9keV9wb3MgbXVzdCBiZSBvZiB0eXBlIGludGVnZXIsICIKICAgICAgICAgICAgICAgICAgICAgICAgICJpbnN0ZWFkIGl0IHdhcyAlcy4iICUgdHlwZShib2R5X3BvcykpClBLAwQUAAAAAAAAACEA9DkcnycJAAAnCQAAQQAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy91dGlsL3Jlc3BvbnNlLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKZnJvbSAuLnBhY2thZ2VzLnNpeC5tb3ZlcyBpbXBvcnQgaHR0cF9jbGllbnQgYXMgaHR0cGxpYgoKZnJvbSAuLmV4Y2VwdGlvbnMgaW1wb3J0IEhlYWRlclBhcnNpbmdFcnJvcgoKCmRlZiBpc19mcF9jbG9zZWQob2JqKToKICAgICIiIgogICAgQ2hlY2tzIHdoZXRoZXIgYSBnaXZlbiBmaWxlLWxpa2Ugb2JqZWN0IGlzIGNsb3NlZC4KCiAgICA6cGFyYW0gb2JqOgogICAgICAgIFRoZSBmaWxlLWxpa2Ugb2JqZWN0IHRvIGNoZWNrLgogICAgIiIiCgogICAgdHJ5OgogICAgICAgICMgQ2hlY2sgYGlzY2xvc2VkKClgIGZpcnN0LCBpbiBjYXNlIFB5dGhvbjMgZG9lc24ndCBzZXQgYGNsb3NlZGAuCiAgICAgICAgIyBHSCBJc3N1ZSAjOTI4CiAgICAgICAgcmV0dXJuIG9iai5pc2Nsb3NlZCgpCiAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgcGFzcwoKICAgIHRyeToKICAgICAgICAjIENoZWNrIHZpYSB0aGUgb2ZmaWNpYWwgZmlsZS1saWtlLW9iamVjdCB3YXkuCiAgICAgICAgcmV0dXJuIG9iai5jbG9zZWQKICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICBwYXNzCgogICAgdHJ5OgogICAgICAgICMgQ2hlY2sgaWYgdGhlIG9iamVjdCBpcyBhIGNvbnRhaW5lciBmb3IgYW5vdGhlciBmaWxlLWxpa2Ugb2JqZWN0IHRoYXQKICAgICAgICAjIGdldHMgcmVsZWFzZWQgb24gZXhoYXVzdGlvbiAoZS5nLiBIVFRQUmVzcG9uc2UpLgogICAgICAgIHJldHVybiBvYmouZnAgaXMgTm9uZQogICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgIHBhc3MKCiAgICByYWlzZSBWYWx1ZUVycm9yKCJVbmFibGUgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgZnAgaXMgY2xvc2VkLiIpCgoKZGVmIGFzc2VydF9oZWFkZXJfcGFyc2luZyhoZWFkZXJzKToKICAgICIiIgogICAgQXNzZXJ0cyB3aGV0aGVyIGFsbCBoZWFkZXJzIGhhdmUgYmVlbiBzdWNjZXNzZnVsbHkgcGFyc2VkLgogICAgRXh0cmFjdHMgZW5jb3VudGVyZWQgZXJyb3JzIGZyb20gdGhlIHJlc3VsdCBvZiBwYXJzaW5nIGhlYWRlcnMuCgogICAgT25seSB3b3JrcyBvbiBQeXRob24gMy4KCiAgICA6cGFyYW0gaGVhZGVyczogSGVhZGVycyB0byB2ZXJpZnkuCiAgICA6dHlwZSBoZWFkZXJzOiBgaHR0cGxpYi5IVFRQTWVzc2FnZWAuCgogICAgOnJhaXNlcyB1cmxsaWIzLmV4Y2VwdGlvbnMuSGVhZGVyUGFyc2luZ0Vycm9yOgogICAgICAgIElmIHBhcnNpbmcgZXJyb3JzIGFyZSBmb3VuZC4KICAgICIiIgoKICAgICMgVGhpcyB3aWxsIGZhaWwgc2lsZW50bHkgaWYgd2UgcGFzcyBpbiB0aGUgd3Jvbmcga2luZCBvZiBwYXJhbWV0ZXIuCiAgICAjIFRvIG1ha2UgZGVidWdnaW5nIGVhc2llciBhZGQgYW4gZXhwbGljaXQgY2hlY2suCiAgICBpZiBub3QgaXNpbnN0YW5jZShoZWFkZXJzLCBodHRwbGliLkhUVFBNZXNzYWdlKToKICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ2V4cGVjdGVkIGh0dHBsaWIuTWVzc2FnZSwgZ290IHswfS4nLmZvcm1hdCgKICAgICAgICAgICAgdHlwZShoZWFkZXJzKSkpCgogICAgZGVmZWN0cyA9IGdldGF0dHIoaGVhZGVycywgJ2RlZmVjdHMnLCBOb25lKQogICAgZ2V0X3BheWxvYWQgPSBnZXRhdHRyKGhlYWRlcnMsICdnZXRfcGF5bG9hZCcsIE5vbmUpCgogICAgdW5wYXJzZWRfZGF0YSA9IE5vbmUKICAgIGlmIGdldF9wYXlsb2FkOiAgIyBQbGF0Zm9ybS1zcGVjaWZpYzogUHl0aG9uIDMuCiAgICAgICAgdW5wYXJzZWRfZGF0YSA9IGdldF9wYXlsb2FkKCkKCiAgICBpZiBkZWZlY3RzIG9yIHVucGFyc2VkX2RhdGE6CiAgICAgICAgcmFpc2UgSGVhZGVyUGFyc2luZ0Vycm9yKGRlZmVjdHM9ZGVmZWN0cywgdW5wYXJzZWRfZGF0YT11bnBhcnNlZF9kYXRhKQoKCmRlZiBpc19yZXNwb25zZV90b19oZWFkKHJlc3BvbnNlKToKICAgICIiIgogICAgQ2hlY2tzIHdoZXRoZXIgdGhlIHJlcXVlc3Qgb2YgYSByZXNwb25zZSBoYXMgYmVlbiBhIEhFQUQtcmVxdWVzdC4KICAgIEhhbmRsZXMgdGhlIHF1aXJrcyBvZiBBcHBFbmdpbmUuCgogICAgOnBhcmFtIGNvbm46CiAgICA6dHlwZSBjb25uOiA6Y2xhc3M6YGh0dHBsaWIuSFRUUFJlc3BvbnNlYAogICAgIiIiCiAgICAjIEZJWE1FOiBDYW4gd2UgZG8gdGhpcyBzb21laG93IHdpdGhvdXQgYWNjZXNzaW5nIHByaXZhdGUgaHR0cGxpYiBfbWV0aG9kPwogICAgbWV0aG9kID0gcmVzcG9uc2UuX21ldGhvZAogICAgaWYgaXNpbnN0YW5jZShtZXRob2QsIGludCk6ICAjIFBsYXRmb3JtLXNwZWNpZmljOiBBcHBlbmdpbmUKICAgICAgICByZXR1cm4gbWV0aG9kID09IDMKICAgIHJldHVybiBtZXRob2QudXBwZXIoKSA9PSAnSEVBRCcKUEsDBBQAAAAAAAAAIQA9Ye/bCTkAAAk5AAA+AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL3V0aWwvcmV0cnkucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAppbXBvcnQgdGltZQppbXBvcnQgbG9nZ2luZwpmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBuYW1lZHR1cGxlCmZyb20gaXRlcnRvb2xzIGltcG9ydCB0YWtld2hpbGUKaW1wb3J0IGVtYWlsCmltcG9ydCByZQoKZnJvbSAuLmV4Y2VwdGlvbnMgaW1wb3J0ICgKICAgIENvbm5lY3RUaW1lb3V0RXJyb3IsCiAgICBNYXhSZXRyeUVycm9yLAogICAgUHJvdG9jb2xFcnJvciwKICAgIFJlYWRUaW1lb3V0RXJyb3IsCiAgICBSZXNwb25zZUVycm9yLAogICAgSW52YWxpZEhlYWRlciwKKQpmcm9tIC4ucGFja2FnZXMgaW1wb3J0IHNpeAoKCmxvZyA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKIyBEYXRhIHN0cnVjdHVyZSBmb3IgcmVwcmVzZW50aW5nIHRoZSBtZXRhZGF0YSBvZiByZXF1ZXN0cyB0aGF0IHJlc3VsdCBpbiBhIHJldHJ5LgpSZXF1ZXN0SGlzdG9yeSA9IG5hbWVkdHVwbGUoJ1JlcXVlc3RIaXN0b3J5JywgWyJtZXRob2QiLCAidXJsIiwgImVycm9yIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RhdHVzIiwgInJlZGlyZWN0X2xvY2F0aW9uIl0pCgoKY2xhc3MgUmV0cnkob2JqZWN0KToKICAgICIiIiBSZXRyeSBjb25maWd1cmF0aW9uLgoKICAgIEVhY2ggcmV0cnkgYXR0ZW1wdCB3aWxsIGNyZWF0ZSBhIG5ldyBSZXRyeSBvYmplY3Qgd2l0aCB1cGRhdGVkIHZhbHVlcywgc28KICAgIHRoZXkgY2FuIGJlIHNhZmVseSByZXVzZWQuCgogICAgUmV0cmllcyBjYW4gYmUgZGVmaW5lZCBhcyBhIGRlZmF1bHQgZm9yIGEgcG9vbDo6CgogICAgICAgIHJldHJpZXMgPSBSZXRyeShjb25uZWN0PTUsIHJlYWQ9MiwgcmVkaXJlY3Q9NSkKICAgICAgICBodHRwID0gUG9vbE1hbmFnZXIocmV0cmllcz1yZXRyaWVzKQogICAgICAgIHJlc3BvbnNlID0gaHR0cC5yZXF1ZXN0KCdHRVQnLCAnaHR0cDovL2V4YW1wbGUuY29tLycpCgogICAgT3IgcGVyLXJlcXVlc3QgKHdoaWNoIG92ZXJyaWRlcyB0aGUgZGVmYXVsdCBmb3IgdGhlIHBvb2wpOjoKCiAgICAgICAgcmVzcG9uc2UgPSBodHRwLnJlcXVlc3QoJ0dFVCcsICdodHRwOi8vZXhhbXBsZS5jb20vJywgcmV0cmllcz1SZXRyeSgxMCkpCgogICAgUmV0cmllcyBjYW4gYmUgZGlzYWJsZWQgYnkgcGFzc2luZyBgYEZhbHNlYGA6OgoKICAgICAgICByZXNwb25zZSA9IGh0dHAucmVxdWVzdCgnR0VUJywgJ2h0dHA6Ly9leGFtcGxlLmNvbS8nLCByZXRyaWVzPUZhbHNlKQoKICAgIEVycm9ycyB3aWxsIGJlIHdyYXBwZWQgaW4gOmNsYXNzOmB+dXJsbGliMy5leGNlcHRpb25zLk1heFJldHJ5RXJyb3JgIHVubGVzcwogICAgcmV0cmllcyBhcmUgZGlzYWJsZWQsIGluIHdoaWNoIGNhc2UgdGhlIGNhdXNpbmcgZXhjZXB0aW9uIHdpbGwgYmUgcmFpc2VkLgoKICAgIDpwYXJhbSBpbnQgdG90YWw6CiAgICAgICAgVG90YWwgbnVtYmVyIG9mIHJldHJpZXMgdG8gYWxsb3cuIFRha2VzIHByZWNlZGVuY2Ugb3ZlciBvdGhlciBjb3VudHMuCgogICAgICAgIFNldCB0byBgYE5vbmVgYCB0byByZW1vdmUgdGhpcyBjb25zdHJhaW50IGFuZCBmYWxsIGJhY2sgb24gb3RoZXIKICAgICAgICBjb3VudHMuIEl0J3MgYSBnb29kIGlkZWEgdG8gc2V0IHRoaXMgdG8gc29tZSBzZW5zaWJseS1oaWdoIHZhbHVlIHRvCiAgICAgICAgYWNjb3VudCBmb3IgdW5leHBlY3RlZCBlZGdlIGNhc2VzIGFuZCBhdm9pZCBpbmZpbml0ZSByZXRyeSBsb29wcy4KCiAgICAgICAgU2V0IHRvIGBgMGBgIHRvIGZhaWwgb24gdGhlIGZpcnN0IHJldHJ5LgoKICAgICAgICBTZXQgdG8gYGBGYWxzZWBgIHRvIGRpc2FibGUgYW5kIGltcGx5IGBgcmFpc2Vfb25fcmVkaXJlY3Q9RmFsc2VgYC4KCiAgICA6cGFyYW0gaW50IGNvbm5lY3Q6CiAgICAgICAgSG93IG1hbnkgY29ubmVjdGlvbi1yZWxhdGVkIGVycm9ycyB0byByZXRyeSBvbi4KCiAgICAgICAgVGhlc2UgYXJlIGVycm9ycyByYWlzZWQgYmVmb3JlIHRoZSByZXF1ZXN0IGlzIHNlbnQgdG8gdGhlIHJlbW90ZSBzZXJ2ZXIsCiAgICAgICAgd2hpY2ggd2UgYXNzdW1lIGhhcyBub3QgdHJpZ2dlcmVkIHRoZSBzZXJ2ZXIgdG8gcHJvY2VzcyB0aGUgcmVxdWVzdC4KCiAgICAgICAgU2V0IHRvIGBgMGBgIHRvIGZhaWwgb24gdGhlIGZpcnN0IHJldHJ5IG9mIHRoaXMgdHlwZS4KCiAgICA6cGFyYW0gaW50IHJlYWQ6CiAgICAgICAgSG93IG1hbnkgdGltZXMgdG8gcmV0cnkgb24gcmVhZCBlcnJvcnMuCgogICAgICAgIFRoZXNlIGVycm9ycyBhcmUgcmFpc2VkIGFmdGVyIHRoZSByZXF1ZXN0IHdhcyBzZW50IHRvIHRoZSBzZXJ2ZXIsIHNvIHRoZQogICAgICAgIHJlcXVlc3QgbWF5IGhhdmUgc2lkZS1lZmZlY3RzLgoKICAgICAgICBTZXQgdG8gYGAwYGAgdG8gZmFpbCBvbiB0aGUgZmlyc3QgcmV0cnkgb2YgdGhpcyB0eXBlLgoKICAgIDpwYXJhbSBpbnQgcmVkaXJlY3Q6CiAgICAgICAgSG93IG1hbnkgcmVkaXJlY3RzIHRvIHBlcmZvcm0uIExpbWl0IHRoaXMgdG8gYXZvaWQgaW5maW5pdGUgcmVkaXJlY3QKICAgICAgICBsb29wcy4KCiAgICAgICAgQSByZWRpcmVjdCBpcyBhIEhUVFAgcmVzcG9uc2Ugd2l0aCBhIHN0YXR1cyBjb2RlIDMwMSwgMzAyLCAzMDMsIDMwNyBvcgogICAgICAgIDMwOC4KCiAgICAgICAgU2V0IHRvIGBgMGBgIHRvIGZhaWwgb24gdGhlIGZpcnN0IHJldHJ5IG9mIHRoaXMgdHlwZS4KCiAgICAgICAgU2V0IHRvIGBgRmFsc2VgYCB0byBkaXNhYmxlIGFuZCBpbXBseSBgYHJhaXNlX29uX3JlZGlyZWN0PUZhbHNlYGAuCgogICAgOnBhcmFtIGludCBzdGF0dXM6CiAgICAgICAgSG93IG1hbnkgdGltZXMgdG8gcmV0cnkgb24gYmFkIHN0YXR1cyBjb2Rlcy4KCiAgICAgICAgVGhlc2UgYXJlIHJldHJpZXMgbWFkZSBvbiByZXNwb25zZXMsIHdoZXJlIHN0YXR1cyBjb2RlIG1hdGNoZXMKICAgICAgICBgYHN0YXR1c19mb3JjZWxpc3RgYC4KCiAgICAgICAgU2V0IHRvIGBgMGBgIHRvIGZhaWwgb24gdGhlIGZpcnN0IHJldHJ5IG9mIHRoaXMgdHlwZS4KCiAgICA6cGFyYW0gaXRlcmFibGUgbWV0aG9kX3doaXRlbGlzdDoKICAgICAgICBTZXQgb2YgdXBwZXJjYXNlZCBIVFRQIG1ldGhvZCB2ZXJicyB0aGF0IHdlIHNob3VsZCByZXRyeSBvbi4KCiAgICAgICAgQnkgZGVmYXVsdCwgd2Ugb25seSByZXRyeSBvbiBtZXRob2RzIHdoaWNoIGFyZSBjb25zaWRlcmVkIHRvIGJlCiAgICAgICAgaWRlbXBvdGVudCAobXVsdGlwbGUgcmVxdWVzdHMgd2l0aCB0aGUgc2FtZSBwYXJhbWV0ZXJzIGVuZCB3aXRoIHRoZQogICAgICAgIHNhbWUgc3RhdGUpLiBTZWUgOmF0dHI6YFJldHJ5LkRFRkFVTFRfTUVUSE9EX1dISVRFTElTVGAuCgogICAgICAgIFNldCB0byBhIGBgRmFsc2VgYCB2YWx1ZSB0byByZXRyeSBvbiBhbnkgdmVyYi4KCiAgICA6cGFyYW0gaXRlcmFibGUgc3RhdHVzX2ZvcmNlbGlzdDoKICAgICAgICBBIHNldCBvZiBpbnRlZ2VyIEhUVFAgc3RhdHVzIGNvZGVzIHRoYXQgd2Ugc2hvdWxkIGZvcmNlIGEgcmV0cnkgb24uCiAgICAgICAgQSByZXRyeSBpcyBpbml0aWF0ZWQgaWYgdGhlIHJlcXVlc3QgbWV0aG9kIGlzIGluIGBgbWV0aG9kX3doaXRlbGlzdGBgCiAgICAgICAgYW5kIHRoZSByZXNwb25zZSBzdGF0dXMgY29kZSBpcyBpbiBgYHN0YXR1c19mb3JjZWxpc3RgYC4KCiAgICAgICAgQnkgZGVmYXVsdCwgdGhpcyBpcyBkaXNhYmxlZCB3aXRoIGBgTm9uZWBgLgoKICAgIDpwYXJhbSBmbG9hdCBiYWNrb2ZmX2ZhY3RvcjoKICAgICAgICBBIGJhY2tvZmYgZmFjdG9yIHRvIGFwcGx5IGJldHdlZW4gYXR0ZW1wdHMgYWZ0ZXIgdGhlIHNlY29uZCB0cnkKICAgICAgICAobW9zdCBlcnJvcnMgYXJlIHJlc29sdmVkIGltbWVkaWF0ZWx5IGJ5IGEgc2Vjb25kIHRyeSB3aXRob3V0IGEKICAgICAgICBkZWxheSkuIHVybGxpYjMgd2lsbCBzbGVlcCBmb3I6OgoKICAgICAgICAgICAge2JhY2tvZmYgZmFjdG9yfSAqICgyIF4gKHtudW1iZXIgb2YgdG90YWwgcmV0cmllc30gLSAxKSkKCiAgICAgICAgc2Vjb25kcy4gSWYgdGhlIGJhY2tvZmZfZmFjdG9yIGlzIDAuMSwgdGhlbiA6ZnVuYzpgLnNsZWVwYCB3aWxsIHNsZWVwCiAgICAgICAgZm9yIFswLjBzLCAwLjJzLCAwLjRzLCAuLi5dIGJldHdlZW4gcmV0cmllcy4gSXQgd2lsbCBuZXZlciBiZSBsb25nZXIKICAgICAgICB0aGFuIDphdHRyOmBSZXRyeS5CQUNLT0ZGX01BWGAuCgogICAgICAgIEJ5IGRlZmF1bHQsIGJhY2tvZmYgaXMgZGlzYWJsZWQgKHNldCB0byAwKS4KCiAgICA6cGFyYW0gYm9vbCByYWlzZV9vbl9yZWRpcmVjdDogV2hldGhlciwgaWYgdGhlIG51bWJlciBvZiByZWRpcmVjdHMgaXMKICAgICAgICBleGhhdXN0ZWQsIHRvIHJhaXNlIGEgTWF4UmV0cnlFcnJvciwgb3IgdG8gcmV0dXJuIGEgcmVzcG9uc2Ugd2l0aCBhCiAgICAgICAgcmVzcG9uc2UgY29kZSBpbiB0aGUgM3h4IHJhbmdlLgoKICAgIDpwYXJhbSBib29sIHJhaXNlX29uX3N0YXR1czogU2ltaWxhciBtZWFuaW5nIHRvIGBgcmFpc2Vfb25fcmVkaXJlY3RgYDoKICAgICAgICB3aGV0aGVyIHdlIHNob3VsZCByYWlzZSBhbiBleGNlcHRpb24sIG9yIHJldHVybiBhIHJlc3BvbnNlLAogICAgICAgIGlmIHN0YXR1cyBmYWxscyBpbiBgYHN0YXR1c19mb3JjZWxpc3RgYCByYW5nZSBhbmQgcmV0cmllcyBoYXZlCiAgICAgICAgYmVlbiBleGhhdXN0ZWQuCgogICAgOnBhcmFtIHR1cGxlIGhpc3Rvcnk6IFRoZSBoaXN0b3J5IG9mIHRoZSByZXF1ZXN0IGVuY291bnRlcmVkIGR1cmluZwogICAgICAgIGVhY2ggY2FsbCB0byA6bWV0aDpgflJldHJ5LmluY3JlbWVudGAuIFRoZSBsaXN0IGlzIGluIHRoZSBvcmRlcgogICAgICAgIHRoZSByZXF1ZXN0cyBvY2N1cnJlZC4gRWFjaCBsaXN0IGl0ZW0gaXMgb2YgY2xhc3MgOmNsYXNzOmBSZXF1ZXN0SGlzdG9yeWAuCgogICAgOnBhcmFtIGJvb2wgcmVzcGVjdF9yZXRyeV9hZnRlcl9oZWFkZXI6CiAgICAgICAgV2hldGhlciB0byByZXNwZWN0IFJldHJ5LUFmdGVyIGhlYWRlciBvbiBzdGF0dXMgY29kZXMgZGVmaW5lZCBhcwogICAgICAgIDphdHRyOmBSZXRyeS5SRVRSWV9BRlRFUl9TVEFUVVNfQ09ERVNgIG9yIG5vdC4KCiAgICAiIiIKCiAgICBERUZBVUxUX01FVEhPRF9XSElURUxJU1QgPSBmcm96ZW5zZXQoWwogICAgICAgICdIRUFEJywgJ0dFVCcsICdQVVQnLCAnREVMRVRFJywgJ09QVElPTlMnLCAnVFJBQ0UnXSkKCiAgICBSRVRSWV9BRlRFUl9TVEFUVVNfQ09ERVMgPSBmcm96ZW5zZXQoWzQxMywgNDI5LCA1MDNdKQoKICAgICM6IE1heGltdW0gYmFja29mZiB0aW1lLgogICAgQkFDS09GRl9NQVggPSAxMjAKCiAgICBkZWYgX19pbml0X18oc2VsZiwgdG90YWw9MTAsIGNvbm5lY3Q9Tm9uZSwgcmVhZD1Ob25lLCByZWRpcmVjdD1Ob25lLCBzdGF0dXM9Tm9uZSwKICAgICAgICAgICAgICAgICBtZXRob2Rfd2hpdGVsaXN0PURFRkFVTFRfTUVUSE9EX1dISVRFTElTVCwgc3RhdHVzX2ZvcmNlbGlzdD1Ob25lLAogICAgICAgICAgICAgICAgIGJhY2tvZmZfZmFjdG9yPTAsIHJhaXNlX29uX3JlZGlyZWN0PVRydWUsIHJhaXNlX29uX3N0YXR1cz1UcnVlLAogICAgICAgICAgICAgICAgIGhpc3Rvcnk9Tm9uZSwgcmVzcGVjdF9yZXRyeV9hZnRlcl9oZWFkZXI9VHJ1ZSk6CgogICAgICAgIHNlbGYudG90YWwgPSB0b3RhbAogICAgICAgIHNlbGYuY29ubmVjdCA9IGNvbm5lY3QKICAgICAgICBzZWxmLnJlYWQgPSByZWFkCiAgICAgICAgc2VsZi5zdGF0dXMgPSBzdGF0dXMKCiAgICAgICAgaWYgcmVkaXJlY3QgaXMgRmFsc2Ugb3IgdG90YWwgaXMgRmFsc2U6CiAgICAgICAgICAgIHJlZGlyZWN0ID0gMAogICAgICAgICAgICByYWlzZV9vbl9yZWRpcmVjdCA9IEZhbHNlCgogICAgICAgIHNlbGYucmVkaXJlY3QgPSByZWRpcmVjdAogICAgICAgIHNlbGYuc3RhdHVzX2ZvcmNlbGlzdCA9IHN0YXR1c19mb3JjZWxpc3Qgb3Igc2V0KCkKICAgICAgICBzZWxmLm1ldGhvZF93aGl0ZWxpc3QgPSBtZXRob2Rfd2hpdGVsaXN0CiAgICAgICAgc2VsZi5iYWNrb2ZmX2ZhY3RvciA9IGJhY2tvZmZfZmFjdG9yCiAgICAgICAgc2VsZi5yYWlzZV9vbl9yZWRpcmVjdCA9IHJhaXNlX29uX3JlZGlyZWN0CiAgICAgICAgc2VsZi5yYWlzZV9vbl9zdGF0dXMgPSByYWlzZV9vbl9zdGF0dXMKICAgICAgICBzZWxmLmhpc3RvcnkgPSBoaXN0b3J5IG9yIHR1cGxlKCkKICAgICAgICBzZWxmLnJlc3BlY3RfcmV0cnlfYWZ0ZXJfaGVhZGVyID0gcmVzcGVjdF9yZXRyeV9hZnRlcl9oZWFkZXIKCiAgICBkZWYgbmV3KHNlbGYsICoqa3cpOgogICAgICAgIHBhcmFtcyA9IGRpY3QoCiAgICAgICAgICAgIHRvdGFsPXNlbGYudG90YWwsCiAgICAgICAgICAgIGNvbm5lY3Q9c2VsZi5jb25uZWN0LCByZWFkPXNlbGYucmVhZCwgcmVkaXJlY3Q9c2VsZi5yZWRpcmVjdCwgc3RhdHVzPXNlbGYuc3RhdHVzLAogICAgICAgICAgICBtZXRob2Rfd2hpdGVsaXN0PXNlbGYubWV0aG9kX3doaXRlbGlzdCwKICAgICAgICAgICAgc3RhdHVzX2ZvcmNlbGlzdD1zZWxmLnN0YXR1c19mb3JjZWxpc3QsCiAgICAgICAgICAgIGJhY2tvZmZfZmFjdG9yPXNlbGYuYmFja29mZl9mYWN0b3IsCiAgICAgICAgICAgIHJhaXNlX29uX3JlZGlyZWN0PXNlbGYucmFpc2Vfb25fcmVkaXJlY3QsCiAgICAgICAgICAgIHJhaXNlX29uX3N0YXR1cz1zZWxmLnJhaXNlX29uX3N0YXR1cywKICAgICAgICAgICAgaGlzdG9yeT1zZWxmLmhpc3RvcnksCiAgICAgICAgKQogICAgICAgIHBhcmFtcy51cGRhdGUoa3cpCiAgICAgICAgcmV0dXJuIHR5cGUoc2VsZikoKipwYXJhbXMpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgZnJvbV9pbnQoY2xzLCByZXRyaWVzLCByZWRpcmVjdD1UcnVlLCBkZWZhdWx0PU5vbmUpOgogICAgICAgICIiIiBCYWNrd2FyZHMtY29tcGF0aWJpbGl0eSBmb3IgdGhlIG9sZCByZXRyaWVzIGZvcm1hdC4iIiIKICAgICAgICBpZiByZXRyaWVzIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHJpZXMgPSBkZWZhdWx0IGlmIGRlZmF1bHQgaXMgbm90IE5vbmUgZWxzZSBjbHMuREVGQVVMVAoKICAgICAgICBpZiBpc2luc3RhbmNlKHJldHJpZXMsIFJldHJ5KToKICAgICAgICAgICAgcmV0dXJuIHJldHJpZXMKCiAgICAgICAgcmVkaXJlY3QgPSBib29sKHJlZGlyZWN0KSBhbmQgTm9uZQogICAgICAgIG5ld19yZXRyaWVzID0gY2xzKHJldHJpZXMsIHJlZGlyZWN0PXJlZGlyZWN0KQogICAgICAgIGxvZy5kZWJ1ZygiQ29udmVydGVkIHJldHJpZXMgdmFsdWU6ICVyIC0+ICVyIiwgcmV0cmllcywgbmV3X3JldHJpZXMpCiAgICAgICAgcmV0dXJuIG5ld19yZXRyaWVzCgogICAgZGVmIGdldF9iYWNrb2ZmX3RpbWUoc2VsZik6CiAgICAgICAgIiIiIEZvcm11bGEgZm9yIGNvbXB1dGluZyB0aGUgY3VycmVudCBiYWNrb2ZmCgogICAgICAgIDpydHlwZTogZmxvYXQKICAgICAgICAiIiIKICAgICAgICAjIFdlIHdhbnQgdG8gY29uc2lkZXIgb25seSB0aGUgbGFzdCBjb25zZWN1dGl2ZSBlcnJvcnMgc2VxdWVuY2UgKElnbm9yZSByZWRpcmVjdHMpLgogICAgICAgIGNvbnNlY3V0aXZlX2Vycm9yc19sZW4gPSBsZW4obGlzdCh0YWtld2hpbGUobGFtYmRhIHg6IHgucmVkaXJlY3RfbG9jYXRpb24gaXMgTm9uZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldmVyc2VkKHNlbGYuaGlzdG9yeSkpKSkKICAgICAgICBpZiBjb25zZWN1dGl2ZV9lcnJvcnNfbGVuIDw9IDE6CiAgICAgICAgICAgIHJldHVybiAwCgogICAgICAgIGJhY2tvZmZfdmFsdWUgPSBzZWxmLmJhY2tvZmZfZmFjdG9yICogKDIgKiogKGNvbnNlY3V0aXZlX2Vycm9yc19sZW4gLSAxKSkKICAgICAgICByZXR1cm4gbWluKHNlbGYuQkFDS09GRl9NQVgsIGJhY2tvZmZfdmFsdWUpCgogICAgZGVmIHBhcnNlX3JldHJ5X2FmdGVyKHNlbGYsIHJldHJ5X2FmdGVyKToKICAgICAgICAjIFdoaXRlc3BhY2U6IGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMwI3NlY3Rpb24tMy4yLjQKICAgICAgICBpZiByZS5tYXRjaChyIl5ccypbMC05XStccyokIiwgcmV0cnlfYWZ0ZXIpOgogICAgICAgICAgICBzZWNvbmRzID0gaW50KHJldHJ5X2FmdGVyKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHJ5X2RhdGVfdHVwbGUgPSBlbWFpbC51dGlscy5wYXJzZWRhdGUocmV0cnlfYWZ0ZXIpCiAgICAgICAgICAgIGlmIHJldHJ5X2RhdGVfdHVwbGUgaXMgTm9uZToKICAgICAgICAgICAgICAgIHJhaXNlIEludmFsaWRIZWFkZXIoIkludmFsaWQgUmV0cnktQWZ0ZXIgaGVhZGVyOiAlcyIgJSByZXRyeV9hZnRlcikKICAgICAgICAgICAgcmV0cnlfZGF0ZSA9IHRpbWUubWt0aW1lKHJldHJ5X2RhdGVfdHVwbGUpCiAgICAgICAgICAgIHNlY29uZHMgPSByZXRyeV9kYXRlIC0gdGltZS50aW1lKCkKCiAgICAgICAgaWYgc2Vjb25kcyA8IDA6CiAgICAgICAgICAgIHNlY29uZHMgPSAwCgogICAgICAgIHJldHVybiBzZWNvbmRzCgogICAgZGVmIGdldF9yZXRyeV9hZnRlcihzZWxmLCByZXNwb25zZSk6CiAgICAgICAgIiIiIEdldCB0aGUgdmFsdWUgb2YgUmV0cnktQWZ0ZXIgaW4gc2Vjb25kcy4gIiIiCgogICAgICAgIHJldHJ5X2FmdGVyID0gcmVzcG9uc2UuZ2V0aGVhZGVyKCJSZXRyeS1BZnRlciIpCgogICAgICAgIGlmIHJldHJ5X2FmdGVyIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgICAgIHJldHVybiBzZWxmLnBhcnNlX3JldHJ5X2FmdGVyKHJldHJ5X2FmdGVyKQoKICAgIGRlZiBzbGVlcF9mb3JfcmV0cnkoc2VsZiwgcmVzcG9uc2U9Tm9uZSk6CiAgICAgICAgcmV0cnlfYWZ0ZXIgPSBzZWxmLmdldF9yZXRyeV9hZnRlcihyZXNwb25zZSkKICAgICAgICBpZiByZXRyeV9hZnRlcjoKICAgICAgICAgICAgdGltZS5zbGVlcChyZXRyeV9hZnRlcikKICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZGVmIF9zbGVlcF9iYWNrb2ZmKHNlbGYpOgogICAgICAgIGJhY2tvZmYgPSBzZWxmLmdldF9iYWNrb2ZmX3RpbWUoKQogICAgICAgIGlmIGJhY2tvZmYgPD0gMDoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgdGltZS5zbGVlcChiYWNrb2ZmKQoKICAgIGRlZiBzbGVlcChzZWxmLCByZXNwb25zZT1Ob25lKToKICAgICAgICAiIiIgU2xlZXAgYmV0d2VlbiByZXRyeSBhdHRlbXB0cy4KCiAgICAgICAgVGhpcyBtZXRob2Qgd2lsbCByZXNwZWN0IGEgc2VydmVyJ3MgYGBSZXRyeS1BZnRlcmBgIHJlc3BvbnNlIGhlYWRlcgogICAgICAgIGFuZCBzbGVlcCB0aGUgZHVyYXRpb24gb2YgdGhlIHRpbWUgcmVxdWVzdGVkLiBJZiB0aGF0IGlzIG5vdCBwcmVzZW50LCBpdAogICAgICAgIHdpbGwgdXNlIGFuIGV4cG9uZW50aWFsIGJhY2tvZmYuIEJ5IGRlZmF1bHQsIHRoZSBiYWNrb2ZmIGZhY3RvciBpcyAwIGFuZAogICAgICAgIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGltbWVkaWF0ZWx5LgogICAgICAgICIiIgoKICAgICAgICBpZiByZXNwb25zZToKICAgICAgICAgICAgc2xlcHQgPSBzZWxmLnNsZWVwX2Zvcl9yZXRyeShyZXNwb25zZSkKICAgICAgICAgICAgaWYgc2xlcHQ6CiAgICAgICAgICAgICAgICByZXR1cm4KCiAgICAgICAgc2VsZi5fc2xlZXBfYmFja29mZigpCgogICAgZGVmIF9pc19jb25uZWN0aW9uX2Vycm9yKHNlbGYsIGVycik6CiAgICAgICAgIiIiIEVycm9ycyB3aGVuIHdlJ3JlIGZhaXJseSBzdXJlIHRoYXQgdGhlIHNlcnZlciBkaWQgbm90IHJlY2VpdmUgdGhlCiAgICAgICAgcmVxdWVzdCwgc28gaXQgc2hvdWxkIGJlIHNhZmUgdG8gcmV0cnkuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIGlzaW5zdGFuY2UoZXJyLCBDb25uZWN0VGltZW91dEVycm9yKQoKICAgIGRlZiBfaXNfcmVhZF9lcnJvcihzZWxmLCBlcnIpOgogICAgICAgICIiIiBFcnJvcnMgdGhhdCBvY2N1ciBhZnRlciB0aGUgcmVxdWVzdCBoYXMgYmVlbiBzdGFydGVkLCBzbyB3ZSBzaG91bGQKICAgICAgICBhc3N1bWUgdGhhdCB0aGUgc2VydmVyIGJlZ2FuIHByb2Nlc3NpbmcgaXQuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIGlzaW5zdGFuY2UoZXJyLCAoUmVhZFRpbWVvdXRFcnJvciwgUHJvdG9jb2xFcnJvcikpCgogICAgZGVmIF9pc19tZXRob2RfcmV0cnlhYmxlKHNlbGYsIG1ldGhvZCk6CiAgICAgICAgIiIiIENoZWNrcyBpZiBhIGdpdmVuIEhUVFAgbWV0aG9kIHNob3VsZCBiZSByZXRyaWVkIHVwb24sIGRlcGVuZGluZyBpZgogICAgICAgIGl0IGlzIGluY2x1ZGVkIG9uIHRoZSBtZXRob2Qgd2hpdGVsaXN0LgogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYubWV0aG9kX3doaXRlbGlzdCBhbmQgbWV0aG9kLnVwcGVyKCkgbm90IGluIHNlbGYubWV0aG9kX3doaXRlbGlzdDoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGlzX3JldHJ5KHNlbGYsIG1ldGhvZCwgc3RhdHVzX2NvZGUsIGhhc19yZXRyeV9hZnRlcj1GYWxzZSk6CiAgICAgICAgIiIiIElzIHRoaXMgbWV0aG9kL3N0YXR1cyBjb2RlIHJldHJ5YWJsZT8gKEJhc2VkIG9uIHdoaXRlbGlzdHMgYW5kIGNvbnRyb2wKICAgICAgICB2YXJpYWJsZXMgc3VjaCBhcyB0aGUgbnVtYmVyIG9mIHRvdGFsIHJldHJpZXMgdG8gYWxsb3csIHdoZXRoZXIgdG8KICAgICAgICByZXNwZWN0IHRoZSBSZXRyeS1BZnRlciBoZWFkZXIsIHdoZXRoZXIgdGhpcyBoZWFkZXIgaXMgcHJlc2VudCwgYW5kCiAgICAgICAgd2hldGhlciB0aGUgcmV0dXJuZWQgc3RhdHVzIGNvZGUgaXMgb24gdGhlIGxpc3Qgb2Ygc3RhdHVzIGNvZGVzIHRvCiAgICAgICAgYmUgcmV0cmllZCB1cG9uIG9uIHRoZSBwcmVzZW5jZSBvZiB0aGUgYWZvcmVtZW50aW9uZWQgaGVhZGVyKQogICAgICAgICIiIgogICAgICAgIGlmIG5vdCBzZWxmLl9pc19tZXRob2RfcmV0cnlhYmxlKG1ldGhvZCk6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICBpZiBzZWxmLnN0YXR1c19mb3JjZWxpc3QgYW5kIHN0YXR1c19jb2RlIGluIHNlbGYuc3RhdHVzX2ZvcmNlbGlzdDoKICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICAgICAgcmV0dXJuIChzZWxmLnRvdGFsIGFuZCBzZWxmLnJlc3BlY3RfcmV0cnlfYWZ0ZXJfaGVhZGVyIGFuZAogICAgICAgICAgICAgICAgaGFzX3JldHJ5X2FmdGVyIGFuZCAoc3RhdHVzX2NvZGUgaW4gc2VsZi5SRVRSWV9BRlRFUl9TVEFUVVNfQ09ERVMpKQoKICAgIGRlZiBpc19leGhhdXN0ZWQoc2VsZik6CiAgICAgICAgIiIiIEFyZSB3ZSBvdXQgb2YgcmV0cmllcz8gIiIiCiAgICAgICAgcmV0cnlfY291bnRzID0gKHNlbGYudG90YWwsIHNlbGYuY29ubmVjdCwgc2VsZi5yZWFkLCBzZWxmLnJlZGlyZWN0LCBzZWxmLnN0YXR1cykKICAgICAgICByZXRyeV9jb3VudHMgPSBsaXN0KGZpbHRlcihOb25lLCByZXRyeV9jb3VudHMpKQogICAgICAgIGlmIG5vdCByZXRyeV9jb3VudHM6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICByZXR1cm4gbWluKHJldHJ5X2NvdW50cykgPCAwCgogICAgZGVmIGluY3JlbWVudChzZWxmLCBtZXRob2Q9Tm9uZSwgdXJsPU5vbmUsIHJlc3BvbnNlPU5vbmUsIGVycm9yPU5vbmUsCiAgICAgICAgICAgICAgICAgIF9wb29sPU5vbmUsIF9zdGFja3RyYWNlPU5vbmUpOgogICAgICAgICIiIiBSZXR1cm4gYSBuZXcgUmV0cnkgb2JqZWN0IHdpdGggaW5jcmVtZW50ZWQgcmV0cnkgY291bnRlcnMuCgogICAgICAgIDpwYXJhbSByZXNwb25zZTogQSByZXNwb25zZSBvYmplY3QsIG9yIE5vbmUsIGlmIHRoZSBzZXJ2ZXIgZGlkIG5vdAogICAgICAgICAgICByZXR1cm4gYSByZXNwb25zZS4KICAgICAgICA6dHlwZSByZXNwb25zZTogOmNsYXNzOmB+dXJsbGliMy5yZXNwb25zZS5IVFRQUmVzcG9uc2VgCiAgICAgICAgOnBhcmFtIEV4Y2VwdGlvbiBlcnJvcjogQW4gZXJyb3IgZW5jb3VudGVyZWQgZHVyaW5nIHRoZSByZXF1ZXN0LCBvcgogICAgICAgICAgICBOb25lIGlmIHRoZSByZXNwb25zZSB3YXMgcmVjZWl2ZWQgc3VjY2Vzc2Z1bGx5LgoKICAgICAgICA6cmV0dXJuOiBBIG5ldyBgYFJldHJ5YGAgb2JqZWN0LgogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYudG90YWwgaXMgRmFsc2UgYW5kIGVycm9yOgogICAgICAgICAgICAjIERpc2FibGVkLCBpbmRpY2F0ZSB0byByZS1yYWlzZSB0aGUgZXJyb3IuCiAgICAgICAgICAgIHJhaXNlIHNpeC5yZXJhaXNlKHR5cGUoZXJyb3IpLCBlcnJvciwgX3N0YWNrdHJhY2UpCgogICAgICAgIHRvdGFsID0gc2VsZi50b3RhbAogICAgICAgIGlmIHRvdGFsIGlzIG5vdCBOb25lOgogICAgICAgICAgICB0b3RhbCAtPSAxCgogICAgICAgIGNvbm5lY3QgPSBzZWxmLmNvbm5lY3QKICAgICAgICByZWFkID0gc2VsZi5yZWFkCiAgICAgICAgcmVkaXJlY3QgPSBzZWxmLnJlZGlyZWN0CiAgICAgICAgc3RhdHVzX2NvdW50ID0gc2VsZi5zdGF0dXMKICAgICAgICBjYXVzZSA9ICd1bmtub3duJwogICAgICAgIHN0YXR1cyA9IE5vbmUKICAgICAgICByZWRpcmVjdF9sb2NhdGlvbiA9IE5vbmUKCiAgICAgICAgaWYgZXJyb3IgYW5kIHNlbGYuX2lzX2Nvbm5lY3Rpb25fZXJyb3IoZXJyb3IpOgogICAgICAgICAgICAjIENvbm5lY3QgcmV0cnk/CiAgICAgICAgICAgIGlmIGNvbm5lY3QgaXMgRmFsc2U6CiAgICAgICAgICAgICAgICByYWlzZSBzaXgucmVyYWlzZSh0eXBlKGVycm9yKSwgZXJyb3IsIF9zdGFja3RyYWNlKQogICAgICAgICAgICBlbGlmIGNvbm5lY3QgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBjb25uZWN0IC09IDEKCiAgICAgICAgZWxpZiBlcnJvciBhbmQgc2VsZi5faXNfcmVhZF9lcnJvcihlcnJvcik6CiAgICAgICAgICAgICMgUmVhZCByZXRyeT8KICAgICAgICAgICAgaWYgcmVhZCBpcyBGYWxzZSBvciBub3Qgc2VsZi5faXNfbWV0aG9kX3JldHJ5YWJsZShtZXRob2QpOgogICAgICAgICAgICAgICAgcmFpc2Ugc2l4LnJlcmFpc2UodHlwZShlcnJvciksIGVycm9yLCBfc3RhY2t0cmFjZSkKICAgICAgICAgICAgZWxpZiByZWFkIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgcmVhZCAtPSAxCgogICAgICAgIGVsaWYgcmVzcG9uc2UgYW5kIHJlc3BvbnNlLmdldF9yZWRpcmVjdF9sb2NhdGlvbigpOgogICAgICAgICAgICAjIFJlZGlyZWN0IHJldHJ5PwogICAgICAgICAgICBpZiByZWRpcmVjdCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIHJlZGlyZWN0IC09IDEKICAgICAgICAgICAgY2F1c2UgPSAndG9vIG1hbnkgcmVkaXJlY3RzJwogICAgICAgICAgICByZWRpcmVjdF9sb2NhdGlvbiA9IHJlc3BvbnNlLmdldF9yZWRpcmVjdF9sb2NhdGlvbigpCiAgICAgICAgICAgIHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cwoKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIEluY3JlbWVudGluZyBiZWNhdXNlIG9mIGEgc2VydmVyIGVycm9yIGxpa2UgYSA1MDAgaW4KICAgICAgICAgICAgIyBzdGF0dXNfZm9yY2VsaXN0IGFuZCBhIHRoZSBnaXZlbiBtZXRob2QgaXMgaW4gdGhlIHdoaXRlbGlzdAogICAgICAgICAgICBjYXVzZSA9IFJlc3BvbnNlRXJyb3IuR0VORVJJQ19FUlJPUgogICAgICAgICAgICBpZiByZXNwb25zZSBhbmQgcmVzcG9uc2Uuc3RhdHVzOgogICAgICAgICAgICAgICAgaWYgc3RhdHVzX2NvdW50IGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgIHN0YXR1c19jb3VudCAtPSAxCiAgICAgICAgICAgICAgICBjYXVzZSA9IFJlc3BvbnNlRXJyb3IuU1BFQ0lGSUNfRVJST1IuZm9ybWF0KAogICAgICAgICAgICAgICAgICAgIHN0YXR1c19jb2RlPXJlc3BvbnNlLnN0YXR1cykKICAgICAgICAgICAgICAgIHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cwoKICAgICAgICBoaXN0b3J5ID0gc2VsZi5oaXN0b3J5ICsgKFJlcXVlc3RIaXN0b3J5KG1ldGhvZCwgdXJsLCBlcnJvciwgc3RhdHVzLCByZWRpcmVjdF9sb2NhdGlvbiksKQoKICAgICAgICBuZXdfcmV0cnkgPSBzZWxmLm5ldygKICAgICAgICAgICAgdG90YWw9dG90YWwsCiAgICAgICAgICAgIGNvbm5lY3Q9Y29ubmVjdCwgcmVhZD1yZWFkLCByZWRpcmVjdD1yZWRpcmVjdCwgc3RhdHVzPXN0YXR1c19jb3VudCwKICAgICAgICAgICAgaGlzdG9yeT1oaXN0b3J5KQoKICAgICAgICBpZiBuZXdfcmV0cnkuaXNfZXhoYXVzdGVkKCk6CiAgICAgICAgICAgIHJhaXNlIE1heFJldHJ5RXJyb3IoX3Bvb2wsIHVybCwgZXJyb3Igb3IgUmVzcG9uc2VFcnJvcihjYXVzZSkpCgogICAgICAgIGxvZy5kZWJ1ZygiSW5jcmVtZW50ZWQgUmV0cnkgZm9yICh1cmw9JyVzJyk6ICVyIiwgdXJsLCBuZXdfcmV0cnkpCgogICAgICAgIHJldHVybiBuZXdfcmV0cnkKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICgne2Nscy5fX25hbWVfX30odG90YWw9e3NlbGYudG90YWx9LCBjb25uZWN0PXtzZWxmLmNvbm5lY3R9LCAnCiAgICAgICAgICAgICAgICAncmVhZD17c2VsZi5yZWFkfSwgcmVkaXJlY3Q9e3NlbGYucmVkaXJlY3R9LCBzdGF0dXM9e3NlbGYuc3RhdHVzfSknKS5mb3JtYXQoCiAgICAgICAgICAgICAgICAgICAgY2xzPXR5cGUoc2VsZiksIHNlbGY9c2VsZikKCgojIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAoZXF1aXZhbGVudCB0byBwcmUtdjEuOSk6ClJldHJ5LkRFRkFVTFQgPSBSZXRyeSgzKQpQSwMEFAAAAAAAAAAhAH3POz2bUgAAm1IAAEIAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvdXRpbC9zZWxlY3RvcnMucHkjIEJhY2twb3J0IG9mIHNlbGVjdG9ycy5weSBmcm9tIFB5dGhvbiAzLjUrIHRvIHN1cHBvcnQgUHl0aG9uIDwgMy40CiMgQWxzbyBoYXMgdGhlIGJlaGF2aW9yIHNwZWNpZmllZCBpbiBQRVAgNDc1IHdoaWNoIGlzIHRvIHJldHJ5IHN5c2NhbGxzCiMgaW4gdGhlIGNhc2Ugb2YgYW4gRUlOVFIgZXJyb3IuIFRoaXMgbW9kdWxlIGlzIHJlcXVpcmVkIGJlY2F1c2Ugc2VsZWN0b3JzMzQKIyBkb2VzIG5vdCBmb2xsb3cgdGhpcyBiZWhhdmlvciBhbmQgaW5zdGVhZCByZXR1cm5zIHRoYXQgbm8gZGlsZSBkZXNjcmlwdG9yCiMgZXZlbnRzIGhhdmUgb2NjdXJyZWQgcmF0aGVyIHRoYW4gcmV0cnkgdGhlIHN5c2NhbGwuIFRoZSBkZWNpc2lvbiB0byBkcm9wCiMgc3VwcG9ydCBmb3Igc2VsZWN0LmRldnBvbGwgaXMgbWFkZSB0byBtYWludGFpbiAxMDAlIHRlc3QgY292ZXJhZ2UuCgppbXBvcnQgZXJybm8KaW1wb3J0IG1hdGgKaW1wb3J0IHNlbGVjdAppbXBvcnQgc29ja2V0CmltcG9ydCBzeXMKaW1wb3J0IHRpbWUKZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgbmFtZWR0dXBsZSwgTWFwcGluZwoKdHJ5OgogICAgbW9ub3RvbmljID0gdGltZS5tb25vdG9uaWMKZXhjZXB0IChBdHRyaWJ1dGVFcnJvciwgSW1wb3J0RXJyb3IpOiAgIyBQeXRob24gMy4zPAogICAgbW9ub3RvbmljID0gdGltZS50aW1lCgpFVkVOVF9SRUFEID0gKDEgPDwgMCkKRVZFTlRfV1JJVEUgPSAoMSA8PCAxKQoKSEFTX1NFTEVDVCA9IFRydWUgICMgVmFyaWFibGUgdGhhdCBzaG93cyB3aGV0aGVyIHRoZSBwbGF0Zm9ybSBoYXMgYSBzZWxlY3Rvci4KX1NZU0NBTExfU0VOVElORUwgPSBvYmplY3QoKSAgIyBTZW50aW5lbCBpbiBjYXNlIGEgc3lzdGVtIGNhbGwgcmV0dXJucyBOb25lLgpfREVGQVVMVF9TRUxFQ1RPUiA9IE5vbmUKCgpjbGFzcyBTZWxlY3RvckVycm9yKEV4Y2VwdGlvbik6CiAgICBkZWYgX19pbml0X18oc2VsZiwgZXJyY29kZSk6CiAgICAgICAgc3VwZXIoU2VsZWN0b3JFcnJvciwgc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYuZXJybm8gPSBlcnJjb2RlCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiPFNlbGVjdG9yRXJyb3IgZXJybm89ezB9PiIuZm9ybWF0KHNlbGYuZXJybm8pCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX19yZXByX18oKQoKCmRlZiBfZmlsZW9ial90b19mZChmaWxlb2JqKToKICAgICIiIiBSZXR1cm4gYSBmaWxlIGRlc2NyaXB0b3IgZnJvbSBhIGZpbGUgb2JqZWN0LiBJZgogICAgZ2l2ZW4gYW4gaW50ZWdlciB3aWxsIHNpbXBseSByZXR1cm4gdGhhdCBpbnRlZ2VyIGJhY2suICIiIgogICAgaWYgaXNpbnN0YW5jZShmaWxlb2JqLCBpbnQpOgogICAgICAgIGZkID0gZmlsZW9iagogICAgZWxzZToKICAgICAgICB0cnk6CiAgICAgICAgICAgIGZkID0gaW50KGZpbGVvYmouZmlsZW5vKCkpCiAgICAgICAgZXhjZXB0IChBdHRyaWJ1dGVFcnJvciwgVHlwZUVycm9yLCBWYWx1ZUVycm9yKToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiSW52YWxpZCBmaWxlIG9iamVjdDogezAhcn0iLmZvcm1hdChmaWxlb2JqKSkKICAgIGlmIGZkIDwgMDoKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJJbnZhbGlkIGZpbGUgZGVzY3JpcHRvcjogezB9Ii5mb3JtYXQoZmQpKQogICAgcmV0dXJuIGZkCgoKIyBEZXRlcm1pbmUgd2hpY2ggZnVuY3Rpb24gdG8gdXNlIHRvIHdyYXAgc3lzdGVtIGNhbGxzIGJlY2F1c2UgUHl0aG9uIDMuNSsKIyBhbHJlYWR5IGhhbmRsZXMgdGhlIGNhc2Ugd2hlbiBzeXN0ZW0gY2FsbHMgYXJlIGludGVycnVwdGVkLgppZiBzeXMudmVyc2lvbl9pbmZvID49ICgzLCA1KToKICAgIGRlZiBfc3lzY2FsbF93cmFwcGVyKGZ1bmMsIF8sICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgIiIiIFRoaXMgaXMgdGhlIHNob3J0LWNpcmN1aXQgdmVyc2lvbiBvZiB0aGUgYmVsb3cgbG9naWMKICAgICAgICBiZWNhdXNlIGluIFB5dGhvbiAzLjUrIGFsbCBzeXN0ZW0gY2FsbHMgYXV0b21hdGljYWxseSByZXN0YXJ0CiAgICAgICAgYW5kIHJlY2FsY3VsYXRlIHRoZWlyIHRpbWVvdXRzLiAiIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBmdW5jKCphcmdzLCAqKmt3YXJncykKICAgICAgICBleGNlcHQgKE9TRXJyb3IsIElPRXJyb3IsIHNlbGVjdC5lcnJvcikgYXMgZToKICAgICAgICAgICAgZXJyY29kZSA9IE5vbmUKICAgICAgICAgICAgaWYgaGFzYXR0cihlLCAiZXJybm8iKToKICAgICAgICAgICAgICAgIGVycmNvZGUgPSBlLmVycm5vCiAgICAgICAgICAgIHJhaXNlIFNlbGVjdG9yRXJyb3IoZXJyY29kZSkKZWxzZToKICAgIGRlZiBfc3lzY2FsbF93cmFwcGVyKGZ1bmMsIHJlY2FsY190aW1lb3V0LCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgICIiIiBXcmFwcGVyIGZ1bmN0aW9uIGZvciBzeXNjYWxscyB0aGF0IGNvdWxkIGZhaWwgZHVlIHRvIEVJTlRSLgogICAgICAgIEFsbCBmdW5jdGlvbnMgc2hvdWxkIGJlIHJldHJpZWQgaWYgdGhlcmUgaXMgdGltZSBsZWZ0IGluIHRoZSB0aW1lb3V0CiAgICAgICAgaW4gYWNjb3JkYW5jZSB3aXRoIFBFUCA0NzUuICIiIgogICAgICAgIHRpbWVvdXQgPSBrd2FyZ3MuZ2V0KCJ0aW1lb3V0IiwgTm9uZSkKICAgICAgICBpZiB0aW1lb3V0IGlzIE5vbmU6CiAgICAgICAgICAgIGV4cGlyZXMgPSBOb25lCiAgICAgICAgICAgIHJlY2FsY190aW1lb3V0ID0gRmFsc2UKICAgICAgICBlbHNlOgogICAgICAgICAgICB0aW1lb3V0ID0gZmxvYXQodGltZW91dCkKICAgICAgICAgICAgaWYgdGltZW91dCA8IDAuMDogICMgVGltZW91dCBsZXNzIHRoYW4gMCB0cmVhdGVkIGFzIG5vIHRpbWVvdXQuCiAgICAgICAgICAgICAgICBleHBpcmVzID0gTm9uZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgZXhwaXJlcyA9IG1vbm90b25pYygpICsgdGltZW91dAoKICAgICAgICBhcmdzID0gbGlzdChhcmdzKQogICAgICAgIGlmIHJlY2FsY190aW1lb3V0IGFuZCAidGltZW91dCIgbm90IGluIGt3YXJnczoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKICAgICAgICAgICAgICAgICJUaW1lb3V0IG11c3QgYmUgaW4gYXJncyBvciBrd2FyZ3MgdG8gYmUgcmVjYWxjdWxhdGVkIikKCiAgICAgICAgcmVzdWx0ID0gX1NZU0NBTExfU0VOVElORUwKICAgICAgICB3aGlsZSByZXN1bHQgaXMgX1NZU0NBTExfU0VOVElORUw6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZ1bmMoKmFyZ3MsICoqa3dhcmdzKQogICAgICAgICAgICAjIE9TRXJyb3IgaXMgdGhyb3duIGJ5IHNlbGVjdC5zZWxlY3QKICAgICAgICAgICAgIyBJT0Vycm9yIGlzIHRocm93biBieSBzZWxlY3QuZXBvbGwucG9sbAogICAgICAgICAgICAjIHNlbGVjdC5lcnJvciBpcyB0aHJvd24gYnkgc2VsZWN0LnBvbGwucG9sbAogICAgICAgICAgICAjIEFyZW4ndCB3ZSB0aGFua2Z1bCBmb3IgUHl0aG9uIDMueCByZXdvcmsgZm9yIGV4Y2VwdGlvbnM/CiAgICAgICAgICAgIGV4Y2VwdCAoT1NFcnJvciwgSU9FcnJvciwgc2VsZWN0LmVycm9yKSBhcyBlOgogICAgICAgICAgICAgICAgIyBzZWxlY3QuZXJyb3Igd2Fzbid0IGEgc3ViY2xhc3Mgb2YgT1NFcnJvciBpbiB0aGUgcGFzdC4KICAgICAgICAgICAgICAgIGVycmNvZGUgPSBOb25lCiAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKGUsICJlcnJubyIpOgogICAgICAgICAgICAgICAgICAgIGVycmNvZGUgPSBlLmVycm5vCiAgICAgICAgICAgICAgICBlbGlmIGhhc2F0dHIoZSwgImFyZ3MiKToKICAgICAgICAgICAgICAgICAgICBlcnJjb2RlID0gZS5hcmdzWzBdCgogICAgICAgICAgICAgICAgIyBBbHNvIHRlc3QgZm9yIHRoZSBXaW5kb3dzIGVxdWl2YWxlbnQgb2YgRUlOVFIuCiAgICAgICAgICAgICAgICBpc19pbnRlcnJ1cHQgPSAoZXJyY29kZSA9PSBlcnJuby5FSU5UUiBvciAoaGFzYXR0cihlcnJubywgIldTQUVJTlRSIikgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyY29kZSA9PSBlcnJuby5XU0FFSU5UUikpCgogICAgICAgICAgICAgICAgaWYgaXNfaW50ZXJydXB0OgogICAgICAgICAgICAgICAgICAgIGlmIGV4cGlyZXMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfdGltZSA9IG1vbm90b25pYygpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGN1cnJlbnRfdGltZSA+IGV4cGlyZXM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBPU0Vycm9yKGVycm5vPWVycm5vLkVUSU1FRE9VVCkKICAgICAgICAgICAgICAgICAgICAgICAgaWYgcmVjYWxjX3RpbWVvdXQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAidGltZW91dCIgaW4ga3dhcmdzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt3YXJnc1sidGltZW91dCJdID0gZXhwaXJlcyAtIGN1cnJlbnRfdGltZQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBpZiBlcnJjb2RlOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIFNlbGVjdG9yRXJyb3IoZXJyY29kZSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICByZXR1cm4gcmVzdWx0CgoKU2VsZWN0b3JLZXkgPSBuYW1lZHR1cGxlKCdTZWxlY3RvcktleScsIFsnZmlsZW9iaicsICdmZCcsICdldmVudHMnLCAnZGF0YSddKQoKCmNsYXNzIF9TZWxlY3Rvck1hcHBpbmcoTWFwcGluZyk6CiAgICAiIiIgTWFwcGluZyBvZiBmaWxlIG9iamVjdHMgdG8gc2VsZWN0b3Iga2V5cyAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgc2VsZWN0b3IpOgogICAgICAgIHNlbGYuX3NlbGVjdG9yID0gc2VsZWN0b3IKCiAgICBkZWYgX19sZW5fXyhzZWxmKToKICAgICAgICByZXR1cm4gbGVuKHNlbGYuX3NlbGVjdG9yLl9mZF90b19rZXkpCgogICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGZpbGVvYmopOgogICAgICAgIHRyeToKICAgICAgICAgICAgZmQgPSBzZWxmLl9zZWxlY3Rvci5fZmlsZW9ial9sb29rdXAoZmlsZW9iaikKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3NlbGVjdG9yLl9mZF90b19rZXlbZmRdCiAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICByYWlzZSBLZXlFcnJvcigiezAhcn0gaXMgbm90IHJlZ2lzdGVyZWQuIi5mb3JtYXQoZmlsZW9iaikpCgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgIHJldHVybiBpdGVyKHNlbGYuX3NlbGVjdG9yLl9mZF90b19rZXkpCgoKY2xhc3MgQmFzZVNlbGVjdG9yKG9iamVjdCk6CiAgICAiIiIgQWJzdHJhY3QgU2VsZWN0b3IgY2xhc3MKCiAgICBBIHNlbGVjdG9yIHN1cHBvcnRzIHJlZ2lzdGVyaW5nIGZpbGUgb2JqZWN0cyB0byBiZSBtb25pdG9yZWQKICAgIGZvciBzcGVjaWZpYyBJL08gZXZlbnRzLgoKICAgIEEgZmlsZSBvYmplY3QgaXMgYSBmaWxlIGRlc2NyaXB0b3Igb3IgYW55IG9iamVjdCB3aXRoIGEKICAgIGBmaWxlbm8oKWAgbWV0aG9kLiBBbiBhcmJpdHJhcnkgb2JqZWN0IGNhbiBiZSBhdHRhY2hlZCB0byB0aGUKICAgIGZpbGUgb2JqZWN0IHdoaWNoIGNhbiBiZSB1c2VkIGZvciBleGFtcGxlIHRvIHN0b3JlIGNvbnRleHQgaW5mbywKICAgIGEgY2FsbGJhY2ssIGV0Yy4KCiAgICBBIHNlbGVjdG9yIGNhbiB1c2UgdmFyaW91cyBpbXBsZW1lbnRhdGlvbnMgKHNlbGVjdCgpLCBwb2xsKCksIGVwb2xsKCksCiAgICBhbmQga3F1ZXVlKCkpIGRlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0uIFRoZSAnRGVmYXVsdFNlbGVjdG9yJyBjbGFzcyB1c2VzCiAgICB0aGUgbW9zdCBlZmZpY2llbnQgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBjdXJyZW50IHBsYXRmb3JtLgogICAgIiIiCiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgIyBNYXBzIGZpbGUgZGVzY3JpcHRvcnMgdG8ga2V5cy4KICAgICAgICBzZWxmLl9mZF90b19rZXkgPSB7fQoKICAgICAgICAjIFJlYWQtb25seSBtYXBwaW5nIHJldHVybmVkIGJ5IGdldF9tYXAoKQogICAgICAgIHNlbGYuX21hcCA9IF9TZWxlY3Rvck1hcHBpbmcoc2VsZikKCiAgICBkZWYgX2ZpbGVvYmpfbG9va3VwKHNlbGYsIGZpbGVvYmopOgogICAgICAgICIiIiBSZXR1cm4gYSBmaWxlIGRlc2NyaXB0b3IgZnJvbSBhIGZpbGUgb2JqZWN0LgogICAgICAgIFRoaXMgd3JhcHMgX2ZpbGVvYmpfdG9fZmQoKSB0byBkbyBhbiBleGhhdXN0aXZlCiAgICAgICAgc2VhcmNoIGluIGNhc2UgdGhlIG9iamVjdCBpcyBpbnZhbGlkIGJ1dCB3ZSBzdGlsbAogICAgICAgIGhhdmUgaXQgaW4gb3VyIG1hcC4gVXNlZCBieSB1bnJlZ2lzdGVyKCkgc28gd2UgY2FuCiAgICAgICAgdW5yZWdpc3RlciBhbiBvYmplY3QgdGhhdCB3YXMgcHJldmlvdXNseSByZWdpc3RlcmVkCiAgICAgICAgZXZlbiBpZiBpdCBpcyBjbG9zZWQuIEl0IGlzIGFsc28gdXNlZCBieSBfU2VsZWN0b3JNYXBwaW5nCiAgICAgICAgIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gX2ZpbGVvYmpfdG9fZmQoZmlsZW9iaikKICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKCiAgICAgICAgICAgICMgU2VhcmNoIHRocm91Z2ggYWxsIG91ciBtYXBwZWQga2V5cy4KICAgICAgICAgICAgZm9yIGtleSBpbiBzZWxmLl9mZF90b19rZXkudmFsdWVzKCk6CiAgICAgICAgICAgICAgICBpZiBrZXkuZmlsZW9iaiBpcyBmaWxlb2JqOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBrZXkuZmQKCiAgICAgICAgICAgICMgUmFpc2UgVmFsdWVFcnJvciBhZnRlciBhbGwuCiAgICAgICAgICAgIHJhaXNlCgogICAgZGVmIHJlZ2lzdGVyKHNlbGYsIGZpbGVvYmosIGV2ZW50cywgZGF0YT1Ob25lKToKICAgICAgICAiIiIgUmVnaXN0ZXIgYSBmaWxlIG9iamVjdCBmb3IgYSBzZXQgb2YgZXZlbnRzIHRvIG1vbml0b3IuICIiIgogICAgICAgIGlmIChub3QgZXZlbnRzKSBvciAoZXZlbnRzICYgfihFVkVOVF9SRUFEIHwgRVZFTlRfV1JJVEUpKToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiSW52YWxpZCBldmVudHM6IHswIXJ9Ii5mb3JtYXQoZXZlbnRzKSkKCiAgICAgICAga2V5ID0gU2VsZWN0b3JLZXkoZmlsZW9iaiwgc2VsZi5fZmlsZW9ial9sb29rdXAoZmlsZW9iaiksIGV2ZW50cywgZGF0YSkKCiAgICAgICAgaWYga2V5LmZkIGluIHNlbGYuX2ZkX3RvX2tleToKICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IoInswIXJ9IChGRCB7MX0pIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZvcm1hdChmaWxlb2JqLCBrZXkuZmQpKQoKICAgICAgICBzZWxmLl9mZF90b19rZXlba2V5LmZkXSA9IGtleQogICAgICAgIHJldHVybiBrZXkKCiAgICBkZWYgdW5yZWdpc3RlcihzZWxmLCBmaWxlb2JqKToKICAgICAgICAiIiIgVW5yZWdpc3RlciBhIGZpbGUgb2JqZWN0IGZyb20gYmVpbmcgbW9uaXRvcmVkLiAiIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIGtleSA9IHNlbGYuX2ZkX3RvX2tleS5wb3Aoc2VsZi5fZmlsZW9ial9sb29rdXAoZmlsZW9iaikpCiAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICByYWlzZSBLZXlFcnJvcigiezAhcn0gaXMgbm90IHJlZ2lzdGVyZWQiLmZvcm1hdChmaWxlb2JqKSkKCiAgICAgICAgIyBHZXR0aW5nIHRoZSBmaWxlbm8gb2YgYSBjbG9zZWQgc29ja2V0IG9uIFdpbmRvd3MgZXJyb3JzIHdpdGggRUJBREYuCiAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvciBhcyBlOiAgIyBQbGF0Zm9ybS1zcGVjaWZpYzogV2luZG93cy4KICAgICAgICAgICAgaWYgZS5lcnJubyAhPSBlcnJuby5FQkFERjoKICAgICAgICAgICAgICAgIHJhaXNlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBmb3Iga2V5IGluIHNlbGYuX2ZkX3RvX2tleS52YWx1ZXMoKToKICAgICAgICAgICAgICAgICAgICBpZiBrZXkuZmlsZW9iaiBpcyBmaWxlb2JqOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9mZF90b19rZXkucG9wKGtleS5mZCkKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IoInswIXJ9IGlzIG5vdCByZWdpc3RlcmVkIi5mb3JtYXQoZmlsZW9iaikpCiAgICAgICAgcmV0dXJuIGtleQoKICAgIGRlZiBtb2RpZnkoc2VsZiwgZmlsZW9iaiwgZXZlbnRzLCBkYXRhPU5vbmUpOgogICAgICAgICIiIiBDaGFuZ2UgYSByZWdpc3RlcmVkIGZpbGUgb2JqZWN0IG1vbml0b3JlZCBldmVudHMgYW5kIGRhdGEuICIiIgogICAgICAgICMgTk9URTogU29tZSBzdWJjbGFzc2VzIG9wdGltaXplIHRoaXMgb3BlcmF0aW9uIGV2ZW4gZnVydGhlci4KICAgICAgICB0cnk6CiAgICAgICAgICAgIGtleSA9IHNlbGYuX2ZkX3RvX2tleVtzZWxmLl9maWxlb2JqX2xvb2t1cChmaWxlb2JqKV0KICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKCJ7MCFyfSBpcyBub3QgcmVnaXN0ZXJlZCIuZm9ybWF0KGZpbGVvYmopKQoKICAgICAgICBpZiBldmVudHMgIT0ga2V5LmV2ZW50czoKICAgICAgICAgICAgc2VsZi51bnJlZ2lzdGVyKGZpbGVvYmopCiAgICAgICAgICAgIGtleSA9IHNlbGYucmVnaXN0ZXIoZmlsZW9iaiwgZXZlbnRzLCBkYXRhKQoKICAgICAgICBlbGlmIGRhdGEgIT0ga2V5LmRhdGE6CiAgICAgICAgICAgICMgVXNlIGEgc2hvcnRjdXQgdG8gdXBkYXRlIHRoZSBkYXRhLgogICAgICAgICAgICBrZXkgPSBrZXkuX3JlcGxhY2UoZGF0YT1kYXRhKQogICAgICAgICAgICBzZWxmLl9mZF90b19rZXlba2V5LmZkXSA9IGtleQoKICAgICAgICByZXR1cm4ga2V5CgogICAgZGVmIHNlbGVjdChzZWxmLCB0aW1lb3V0PU5vbmUpOgogICAgICAgICIiIiBQZXJmb3JtIHRoZSBhY3R1YWwgc2VsZWN0aW9uIHVudGlsIHNvbWUgbW9uaXRvcmVkIGZpbGUgb2JqZWN0cwogICAgICAgIGFyZSByZWFkeSBvciB0aGUgdGltZW91dCBleHBpcmVzLiAiIiIKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCkKCiAgICBkZWYgY2xvc2Uoc2VsZik6CiAgICAgICAgIiIiIENsb3NlIHRoZSBzZWxlY3Rvci4gVGhpcyBtdXN0IGJlIGNhbGxlZCB0byBlbnN1cmUgdGhhdCBhbGwKICAgICAgICB1bmRlcmx5aW5nIHJlc291cmNlcyBhcmUgZnJlZWQuICIiIgogICAgICAgIHNlbGYuX2ZkX3RvX2tleS5jbGVhcigpCiAgICAgICAgc2VsZi5fbWFwID0gTm9uZQoKICAgIGRlZiBnZXRfa2V5KHNlbGYsIGZpbGVvYmopOgogICAgICAgICIiIiBSZXR1cm4gdGhlIGtleSBhc3NvY2lhdGVkIHdpdGggYSByZWdpc3RlcmVkIGZpbGUgb2JqZWN0LiAiIiIKICAgICAgICBtYXBwaW5nID0gc2VsZi5nZXRfbWFwKCkKICAgICAgICBpZiBtYXBwaW5nIGlzIE5vbmU6CiAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiU2VsZWN0b3IgaXMgY2xvc2VkIikKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBtYXBwaW5nW2ZpbGVvYmpdCiAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICByYWlzZSBLZXlFcnJvcigiezAhcn0gaXMgbm90IHJlZ2lzdGVyZWQiLmZvcm1hdChmaWxlb2JqKSkKCiAgICBkZWYgZ2V0X21hcChzZWxmKToKICAgICAgICAiIiIgUmV0dXJuIGEgbWFwcGluZyBvZiBmaWxlIG9iamVjdHMgdG8gc2VsZWN0b3Iga2V5cyAiIiIKICAgICAgICByZXR1cm4gc2VsZi5fbWFwCgogICAgZGVmIF9rZXlfZnJvbV9mZChzZWxmLCBmZCk6CiAgICAgICAgIiIiIFJldHVybiB0aGUga2V5IGFzc29jaWF0ZWQgdG8gYSBnaXZlbiBmaWxlIGRlc2NyaXB0b3IKICAgICAgICAgUmV0dXJuIE5vbmUgaWYgaXQgaXMgbm90IGZvdW5kLiAiIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9mZF90b19rZXlbZmRdCiAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgIGRlZiBfX2VudGVyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgX19leGl0X18oc2VsZiwgKmFyZ3MpOgogICAgICAgIHNlbGYuY2xvc2UoKQoKCiMgQWxtb3N0IGFsbCBwbGF0Zm9ybXMgaGF2ZSBzZWxlY3Quc2VsZWN0KCkKaWYgaGFzYXR0cihzZWxlY3QsICJzZWxlY3QiKToKICAgIGNsYXNzIFNlbGVjdFNlbGVjdG9yKEJhc2VTZWxlY3Rvcik6CiAgICAgICAgIiIiIFNlbGVjdC1iYXNlZCBzZWxlY3Rvci4gIiIiCiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgICAgICBzdXBlcihTZWxlY3RTZWxlY3Rvciwgc2VsZikuX19pbml0X18oKQogICAgICAgICAgICBzZWxmLl9yZWFkZXJzID0gc2V0KCkKICAgICAgICAgICAgc2VsZi5fd3JpdGVycyA9IHNldCgpCgogICAgICAgIGRlZiByZWdpc3RlcihzZWxmLCBmaWxlb2JqLCBldmVudHMsIGRhdGE9Tm9uZSk6CiAgICAgICAgICAgIGtleSA9IHN1cGVyKFNlbGVjdFNlbGVjdG9yLCBzZWxmKS5yZWdpc3RlcihmaWxlb2JqLCBldmVudHMsIGRhdGEpCiAgICAgICAgICAgIGlmIGV2ZW50cyAmIEVWRU5UX1JFQUQ6CiAgICAgICAgICAgICAgICBzZWxmLl9yZWFkZXJzLmFkZChrZXkuZmQpCiAgICAgICAgICAgIGlmIGV2ZW50cyAmIEVWRU5UX1dSSVRFOgogICAgICAgICAgICAgICAgc2VsZi5fd3JpdGVycy5hZGQoa2V5LmZkKQogICAgICAgICAgICByZXR1cm4ga2V5CgogICAgICAgIGRlZiB1bnJlZ2lzdGVyKHNlbGYsIGZpbGVvYmopOgogICAgICAgICAgICBrZXkgPSBzdXBlcihTZWxlY3RTZWxlY3Rvciwgc2VsZikudW5yZWdpc3RlcihmaWxlb2JqKQogICAgICAgICAgICBzZWxmLl9yZWFkZXJzLmRpc2NhcmQoa2V5LmZkKQogICAgICAgICAgICBzZWxmLl93cml0ZXJzLmRpc2NhcmQoa2V5LmZkKQogICAgICAgICAgICByZXR1cm4ga2V5CgogICAgICAgIGRlZiBfc2VsZWN0KHNlbGYsIHIsIHcsIHRpbWVvdXQ9Tm9uZSk6CiAgICAgICAgICAgICIiIiBXcmFwcGVyIGZvciBzZWxlY3Quc2VsZWN0IGJlY2F1c2UgdGltZW91dCBpcyBhIHBvc2l0aW9uYWwgYXJnICIiIgogICAgICAgICAgICByZXR1cm4gc2VsZWN0LnNlbGVjdChyLCB3LCBbXSwgdGltZW91dCkKCiAgICAgICAgZGVmIHNlbGVjdChzZWxmLCB0aW1lb3V0PU5vbmUpOgogICAgICAgICAgICAjIFNlbGVjdGluZyBvbiBlbXB0eSBsaXN0cyBvbiBXaW5kb3dzIGVycm9ycyBvdXQuCiAgICAgICAgICAgIGlmIG5vdCBsZW4oc2VsZi5fcmVhZGVycykgYW5kIG5vdCBsZW4oc2VsZi5fd3JpdGVycyk6CiAgICAgICAgICAgICAgICByZXR1cm4gW10KCiAgICAgICAgICAgIHRpbWVvdXQgPSBOb25lIGlmIHRpbWVvdXQgaXMgTm9uZSBlbHNlIG1heCh0aW1lb3V0LCAwLjApCiAgICAgICAgICAgIHJlYWR5ID0gW10KICAgICAgICAgICAgciwgdywgXyA9IF9zeXNjYWxsX3dyYXBwZXIoc2VsZi5fc2VsZWN0LCBUcnVlLCBzZWxmLl9yZWFkZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl93cml0ZXJzLCB0aW1lb3V0KQogICAgICAgICAgICByID0gc2V0KHIpCiAgICAgICAgICAgIHcgPSBzZXQodykKICAgICAgICAgICAgZm9yIGZkIGluIHIgfCB3OgogICAgICAgICAgICAgICAgZXZlbnRzID0gMAogICAgICAgICAgICAgICAgaWYgZmQgaW4gcjoKICAgICAgICAgICAgICAgICAgICBldmVudHMgfD0gRVZFTlRfUkVBRAogICAgICAgICAgICAgICAgaWYgZmQgaW4gdzoKICAgICAgICAgICAgICAgICAgICBldmVudHMgfD0gRVZFTlRfV1JJVEUKCiAgICAgICAgICAgICAgICBrZXkgPSBzZWxmLl9rZXlfZnJvbV9mZChmZCkKICAgICAgICAgICAgICAgIGlmIGtleToKICAgICAgICAgICAgICAgICAgICByZWFkeS5hcHBlbmQoKGtleSwgZXZlbnRzICYga2V5LmV2ZW50cykpCiAgICAgICAgICAgIHJldHVybiByZWFkeQoKCmlmIGhhc2F0dHIoc2VsZWN0LCAicG9sbCIpOgogICAgY2xhc3MgUG9sbFNlbGVjdG9yKEJhc2VTZWxlY3Rvcik6CiAgICAgICAgIiIiIFBvbGwtYmFzZWQgc2VsZWN0b3IgIiIiCiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgICAgICBzdXBlcihQb2xsU2VsZWN0b3IsIHNlbGYpLl9faW5pdF9fKCkKICAgICAgICAgICAgc2VsZi5fcG9sbCA9IHNlbGVjdC5wb2xsKCkKCiAgICAgICAgZGVmIHJlZ2lzdGVyKHNlbGYsIGZpbGVvYmosIGV2ZW50cywgZGF0YT1Ob25lKToKICAgICAgICAgICAga2V5ID0gc3VwZXIoUG9sbFNlbGVjdG9yLCBzZWxmKS5yZWdpc3RlcihmaWxlb2JqLCBldmVudHMsIGRhdGEpCiAgICAgICAgICAgIGV2ZW50X21hc2sgPSAwCiAgICAgICAgICAgIGlmIGV2ZW50cyAmIEVWRU5UX1JFQUQ6CiAgICAgICAgICAgICAgICBldmVudF9tYXNrIHw9IHNlbGVjdC5QT0xMSU4KICAgICAgICAgICAgaWYgZXZlbnRzICYgRVZFTlRfV1JJVEU6CiAgICAgICAgICAgICAgICBldmVudF9tYXNrIHw9IHNlbGVjdC5QT0xMT1VUCiAgICAgICAgICAgIHNlbGYuX3BvbGwucmVnaXN0ZXIoa2V5LmZkLCBldmVudF9tYXNrKQogICAgICAgICAgICByZXR1cm4ga2V5CgogICAgICAgIGRlZiB1bnJlZ2lzdGVyKHNlbGYsIGZpbGVvYmopOgogICAgICAgICAgICBrZXkgPSBzdXBlcihQb2xsU2VsZWN0b3IsIHNlbGYpLnVucmVnaXN0ZXIoZmlsZW9iaikKICAgICAgICAgICAgc2VsZi5fcG9sbC51bnJlZ2lzdGVyKGtleS5mZCkKICAgICAgICAgICAgcmV0dXJuIGtleQoKICAgICAgICBkZWYgX3dyYXBfcG9sbChzZWxmLCB0aW1lb3V0PU5vbmUpOgogICAgICAgICAgICAiIiIgV3JhcHBlciBmdW5jdGlvbiBmb3Igc2VsZWN0LnBvbGwucG9sbCgpIHNvIHRoYXQKICAgICAgICAgICAgX3N5c2NhbGxfd3JhcHBlciBjYW4gd29yayB3aXRoIG9ubHkgc2Vjb25kcy4gIiIiCiAgICAgICAgICAgIGlmIHRpbWVvdXQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBpZiB0aW1lb3V0IDw9IDA6CiAgICAgICAgICAgICAgICAgICAgdGltZW91dCA9IDAKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgIyBzZWxlY3QucG9sbC5wb2xsKCkgaGFzIGEgcmVzb2x1dGlvbiBvZiAxIG1pbGxpc2Vjb25kLAogICAgICAgICAgICAgICAgICAgICMgcm91bmQgYXdheSBmcm9tIHplcm8gdG8gd2FpdCAqYXQgbGVhc3QqIHRpbWVvdXQgc2Vjb25kcy4KICAgICAgICAgICAgICAgICAgICB0aW1lb3V0ID0gbWF0aC5jZWlsKHRpbWVvdXQgKiAxZTMpCgogICAgICAgICAgICByZXN1bHQgPSBzZWxmLl9wb2xsLnBvbGwodGltZW91dCkKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgICAgICBkZWYgc2VsZWN0KHNlbGYsIHRpbWVvdXQ9Tm9uZSk6CiAgICAgICAgICAgIHJlYWR5ID0gW10KICAgICAgICAgICAgZmRfZXZlbnRzID0gX3N5c2NhbGxfd3JhcHBlcihzZWxmLl93cmFwX3BvbGwsIFRydWUsIHRpbWVvdXQ9dGltZW91dCkKICAgICAgICAgICAgZm9yIGZkLCBldmVudF9tYXNrIGluIGZkX2V2ZW50czoKICAgICAgICAgICAgICAgIGV2ZW50cyA9IDAKICAgICAgICAgICAgICAgIGlmIGV2ZW50X21hc2sgJiB+c2VsZWN0LlBPTExJTjoKICAgICAgICAgICAgICAgICAgICBldmVudHMgfD0gRVZFTlRfV1JJVEUKICAgICAgICAgICAgICAgIGlmIGV2ZW50X21hc2sgJiB+c2VsZWN0LlBPTExPVVQ6CiAgICAgICAgICAgICAgICAgICAgZXZlbnRzIHw9IEVWRU5UX1JFQUQKCiAgICAgICAgICAgICAgICBrZXkgPSBzZWxmLl9rZXlfZnJvbV9mZChmZCkKICAgICAgICAgICAgICAgIGlmIGtleToKICAgICAgICAgICAgICAgICAgICByZWFkeS5hcHBlbmQoKGtleSwgZXZlbnRzICYga2V5LmV2ZW50cykpCgogICAgICAgICAgICByZXR1cm4gcmVhZHkKCgppZiBoYXNhdHRyKHNlbGVjdCwgImVwb2xsIik6CiAgICBjbGFzcyBFcG9sbFNlbGVjdG9yKEJhc2VTZWxlY3Rvcik6CiAgICAgICAgIiIiIEVwb2xsLWJhc2VkIHNlbGVjdG9yICIiIgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICAgICAgc3VwZXIoRXBvbGxTZWxlY3Rvciwgc2VsZikuX19pbml0X18oKQogICAgICAgICAgICBzZWxmLl9lcG9sbCA9IHNlbGVjdC5lcG9sbCgpCgogICAgICAgIGRlZiBmaWxlbm8oc2VsZik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9lcG9sbC5maWxlbm8oKQoKICAgICAgICBkZWYgcmVnaXN0ZXIoc2VsZiwgZmlsZW9iaiwgZXZlbnRzLCBkYXRhPU5vbmUpOgogICAgICAgICAgICBrZXkgPSBzdXBlcihFcG9sbFNlbGVjdG9yLCBzZWxmKS5yZWdpc3RlcihmaWxlb2JqLCBldmVudHMsIGRhdGEpCiAgICAgICAgICAgIGV2ZW50c19tYXNrID0gMAogICAgICAgICAgICBpZiBldmVudHMgJiBFVkVOVF9SRUFEOgogICAgICAgICAgICAgICAgZXZlbnRzX21hc2sgfD0gc2VsZWN0LkVQT0xMSU4KICAgICAgICAgICAgaWYgZXZlbnRzICYgRVZFTlRfV1JJVEU6CiAgICAgICAgICAgICAgICBldmVudHNfbWFzayB8PSBzZWxlY3QuRVBPTExPVVQKICAgICAgICAgICAgX3N5c2NhbGxfd3JhcHBlcihzZWxmLl9lcG9sbC5yZWdpc3RlciwgRmFsc2UsIGtleS5mZCwgZXZlbnRzX21hc2spCiAgICAgICAgICAgIHJldHVybiBrZXkKCiAgICAgICAgZGVmIHVucmVnaXN0ZXIoc2VsZiwgZmlsZW9iaik6CiAgICAgICAgICAgIGtleSA9IHN1cGVyKEVwb2xsU2VsZWN0b3IsIHNlbGYpLnVucmVnaXN0ZXIoZmlsZW9iaikKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgX3N5c2NhbGxfd3JhcHBlcihzZWxmLl9lcG9sbC51bnJlZ2lzdGVyLCBGYWxzZSwga2V5LmZkKQogICAgICAgICAgICBleGNlcHQgU2VsZWN0b3JFcnJvcjoKICAgICAgICAgICAgICAgICMgVGhpcyBjYW4gb2NjdXIgd2hlbiB0aGUgZmQgd2FzIGNsb3NlZCBzaW5jZSByZWdpc3RyeS4KICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgcmV0dXJuIGtleQoKICAgICAgICBkZWYgc2VsZWN0KHNlbGYsIHRpbWVvdXQ9Tm9uZSk6CiAgICAgICAgICAgIGlmIHRpbWVvdXQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBpZiB0aW1lb3V0IDw9IDA6CiAgICAgICAgICAgICAgICAgICAgdGltZW91dCA9IDAuMAogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAjIHNlbGVjdC5lcG9sbC5wb2xsKCkgaGFzIGEgcmVzb2x1dGlvbiBvZiAxIG1pbGxpc2Vjb25kCiAgICAgICAgICAgICAgICAgICAgIyBidXQgbHVja2lseSB0YWtlcyBzZWNvbmRzIHNvIHdlIGRvbid0IG5lZWQgYSB3cmFwcGVyCiAgICAgICAgICAgICAgICAgICAgIyBsaWtlIFBvbGxTZWxlY3Rvci4gSnVzdCBmb3IgYmV0dGVyIHJvdW5kaW5nLgogICAgICAgICAgICAgICAgICAgIHRpbWVvdXQgPSBtYXRoLmNlaWwodGltZW91dCAqIDFlMykgKiAxZS0zCiAgICAgICAgICAgICAgICB0aW1lb3V0ID0gZmxvYXQodGltZW91dCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHRpbWVvdXQgPSAtMS4wICAjIGVwb2xsLnBvbGwoKSBtdXN0IGhhdmUgYSBmbG9hdC4KCiAgICAgICAgICAgICMgV2UgYWx3YXlzIHdhbnQgYXQgbGVhc3QgMSB0byBlbnN1cmUgdGhhdCBzZWxlY3QgY2FuIGJlIGNhbGxlZAogICAgICAgICAgICAjIHdpdGggbm8gZmlsZSBkZXNjcmlwdG9ycyByZWdpc3RlcmVkLiBPdGhlcndpc2Ugd2lsbCBmYWlsLgogICAgICAgICAgICBtYXhfZXZlbnRzID0gbWF4KGxlbihzZWxmLl9mZF90b19rZXkpLCAxKQoKICAgICAgICAgICAgcmVhZHkgPSBbXQogICAgICAgICAgICBmZF9ldmVudHMgPSBfc3lzY2FsbF93cmFwcGVyKHNlbGYuX2Vwb2xsLnBvbGwsIFRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dD10aW1lb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heGV2ZW50cz1tYXhfZXZlbnRzKQogICAgICAgICAgICBmb3IgZmQsIGV2ZW50X21hc2sgaW4gZmRfZXZlbnRzOgogICAgICAgICAgICAgICAgZXZlbnRzID0gMAogICAgICAgICAgICAgICAgaWYgZXZlbnRfbWFzayAmIH5zZWxlY3QuRVBPTExJTjoKICAgICAgICAgICAgICAgICAgICBldmVudHMgfD0gRVZFTlRfV1JJVEUKICAgICAgICAgICAgICAgIGlmIGV2ZW50X21hc2sgJiB+c2VsZWN0LkVQT0xMT1VUOgogICAgICAgICAgICAgICAgICAgIGV2ZW50cyB8PSBFVkVOVF9SRUFECgogICAgICAgICAgICAgICAga2V5ID0gc2VsZi5fa2V5X2Zyb21fZmQoZmQpCiAgICAgICAgICAgICAgICBpZiBrZXk6CiAgICAgICAgICAgICAgICAgICAgcmVhZHkuYXBwZW5kKChrZXksIGV2ZW50cyAmIGtleS5ldmVudHMpKQogICAgICAgICAgICByZXR1cm4gcmVhZHkKCiAgICAgICAgZGVmIGNsb3NlKHNlbGYpOgogICAgICAgICAgICBzZWxmLl9lcG9sbC5jbG9zZSgpCiAgICAgICAgICAgIHN1cGVyKEVwb2xsU2VsZWN0b3IsIHNlbGYpLmNsb3NlKCkKCgppZiBoYXNhdHRyKHNlbGVjdCwgImtxdWV1ZSIpOgogICAgY2xhc3MgS3F1ZXVlU2VsZWN0b3IoQmFzZVNlbGVjdG9yKToKICAgICAgICAiIiIgS3F1ZXVlIC8gS2V2ZW50LWJhc2VkIHNlbGVjdG9yICIiIgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICAgICAgc3VwZXIoS3F1ZXVlU2VsZWN0b3IsIHNlbGYpLl9faW5pdF9fKCkKICAgICAgICAgICAgc2VsZi5fa3F1ZXVlID0gc2VsZWN0LmtxdWV1ZSgpCgogICAgICAgIGRlZiBmaWxlbm8oc2VsZik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9rcXVldWUuZmlsZW5vKCkKCiAgICAgICAgZGVmIHJlZ2lzdGVyKHNlbGYsIGZpbGVvYmosIGV2ZW50cywgZGF0YT1Ob25lKToKICAgICAgICAgICAga2V5ID0gc3VwZXIoS3F1ZXVlU2VsZWN0b3IsIHNlbGYpLnJlZ2lzdGVyKGZpbGVvYmosIGV2ZW50cywgZGF0YSkKICAgICAgICAgICAgaWYgZXZlbnRzICYgRVZFTlRfUkVBRDoKICAgICAgICAgICAgICAgIGtldmVudCA9IHNlbGVjdC5rZXZlbnQoa2V5LmZkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QuS1FfRklMVEVSX1JFQUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdC5LUV9FVl9BREQpCgogICAgICAgICAgICAgICAgX3N5c2NhbGxfd3JhcHBlcihzZWxmLl9rcXVldWUuY29udHJvbCwgRmFsc2UsIFtrZXZlbnRdLCAwLCAwKQoKICAgICAgICAgICAgaWYgZXZlbnRzICYgRVZFTlRfV1JJVEU6CiAgICAgICAgICAgICAgICBrZXZlbnQgPSBzZWxlY3Qua2V2ZW50KGtleS5mZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0LktRX0ZJTFRFUl9XUklURSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0LktRX0VWX0FERCkKCiAgICAgICAgICAgICAgICBfc3lzY2FsbF93cmFwcGVyKHNlbGYuX2txdWV1ZS5jb250cm9sLCBGYWxzZSwgW2tldmVudF0sIDAsIDApCgogICAgICAgICAgICByZXR1cm4ga2V5CgogICAgICAgIGRlZiB1bnJlZ2lzdGVyKHNlbGYsIGZpbGVvYmopOgogICAgICAgICAgICBrZXkgPSBzdXBlcihLcXVldWVTZWxlY3Rvciwgc2VsZikudW5yZWdpc3RlcihmaWxlb2JqKQogICAgICAgICAgICBpZiBrZXkuZXZlbnRzICYgRVZFTlRfUkVBRDoKICAgICAgICAgICAgICAgIGtldmVudCA9IHNlbGVjdC5rZXZlbnQoa2V5LmZkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QuS1FfRklMVEVSX1JFQUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdC5LUV9FVl9ERUxFVEUpCiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgX3N5c2NhbGxfd3JhcHBlcihzZWxmLl9rcXVldWUuY29udHJvbCwgRmFsc2UsIFtrZXZlbnRdLCAwLCAwKQogICAgICAgICAgICAgICAgZXhjZXB0IFNlbGVjdG9yRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICBpZiBrZXkuZXZlbnRzICYgRVZFTlRfV1JJVEU6CiAgICAgICAgICAgICAgICBrZXZlbnQgPSBzZWxlY3Qua2V2ZW50KGtleS5mZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0LktRX0ZJTFRFUl9XUklURSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0LktRX0VWX0RFTEVURSkKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBfc3lzY2FsbF93cmFwcGVyKHNlbGYuX2txdWV1ZS5jb250cm9sLCBGYWxzZSwgW2tldmVudF0sIDAsIDApCiAgICAgICAgICAgICAgICBleGNlcHQgU2VsZWN0b3JFcnJvcjoKICAgICAgICAgICAgICAgICAgICBwYXNzCgogICAgICAgICAgICByZXR1cm4ga2V5CgogICAgICAgIGRlZiBzZWxlY3Qoc2VsZiwgdGltZW91dD1Ob25lKToKICAgICAgICAgICAgaWYgdGltZW91dCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIHRpbWVvdXQgPSBtYXgodGltZW91dCwgMCkKCiAgICAgICAgICAgIG1heF9ldmVudHMgPSBsZW4oc2VsZi5fZmRfdG9fa2V5KSAqIDIKICAgICAgICAgICAgcmVhZHlfZmRzID0ge30KCiAgICAgICAgICAgIGtldmVudF9saXN0ID0gX3N5c2NhbGxfd3JhcHBlcihzZWxmLl9rcXVldWUuY29udHJvbCwgVHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbmUsIG1heF9ldmVudHMsIHRpbWVvdXQpCgogICAgICAgICAgICBmb3Iga2V2ZW50IGluIGtldmVudF9saXN0OgogICAgICAgICAgICAgICAgZmQgPSBrZXZlbnQuaWRlbnQKICAgICAgICAgICAgICAgIGV2ZW50X21hc2sgPSBrZXZlbnQuZmlsdGVyCiAgICAgICAgICAgICAgICBldmVudHMgPSAwCiAgICAgICAgICAgICAgICBpZiBldmVudF9tYXNrID09IHNlbGVjdC5LUV9GSUxURVJfUkVBRDoKICAgICAgICAgICAgICAgICAgICBldmVudHMgfD0gRVZFTlRfUkVBRAogICAgICAgICAgICAgICAgaWYgZXZlbnRfbWFzayA9PSBzZWxlY3QuS1FfRklMVEVSX1dSSVRFOgogICAgICAgICAgICAgICAgICAgIGV2ZW50cyB8PSBFVkVOVF9XUklURQoKICAgICAgICAgICAgICAgIGtleSA9IHNlbGYuX2tleV9mcm9tX2ZkKGZkKQogICAgICAgICAgICAgICAgaWYga2V5OgogICAgICAgICAgICAgICAgICAgIGlmIGtleS5mZCBub3QgaW4gcmVhZHlfZmRzOgogICAgICAgICAgICAgICAgICAgICAgICByZWFkeV9mZHNba2V5LmZkXSA9IChrZXksIGV2ZW50cyAmIGtleS5ldmVudHMpCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgb2xkX2V2ZW50cyA9IHJlYWR5X2Zkc1trZXkuZmRdWzFdCiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWR5X2Zkc1trZXkuZmRdID0gKGtleSwgKGV2ZW50cyB8IG9sZF9ldmVudHMpICYga2V5LmV2ZW50cykKCiAgICAgICAgICAgIHJldHVybiBsaXN0KHJlYWR5X2Zkcy52YWx1ZXMoKSkKCiAgICAgICAgZGVmIGNsb3NlKHNlbGYpOgogICAgICAgICAgICBzZWxmLl9rcXVldWUuY2xvc2UoKQogICAgICAgICAgICBzdXBlcihLcXVldWVTZWxlY3Rvciwgc2VsZikuY2xvc2UoKQoKCmlmIG5vdCBoYXNhdHRyKHNlbGVjdCwgJ3NlbGVjdCcpOiAgIyBQbGF0Zm9ybS1zcGVjaWZpYzogQXBwRW5naW5lCiAgICBIQVNfU0VMRUNUID0gRmFsc2UKCgpkZWYgX2Nhbl9hbGxvY2F0ZShzdHJ1Y3QpOgogICAgIiIiIENoZWNrcyB0aGF0IHNlbGVjdCBzdHJ1Y3RzIGNhbiBiZSBhbGxvY2F0ZWQgYnkgdGhlIHVuZGVybHlpbmcKICAgIG9wZXJhdGluZyBzeXN0ZW0sIG5vdCBqdXN0IGFkdmVydGlzZWQgYnkgdGhlIHNlbGVjdCBtb2R1bGUuIFdlIGRvbid0CiAgICBjaGVjayBzZWxlY3QoKSBiZWNhdXNlIHdlJ2xsIGJlIGhvcGVmdWwgdGhhdCBtb3N0IHBsYXRmb3JtcyB0aGF0CiAgICBkb24ndCBoYXZlIGl0IGF2YWlsYWJsZSB3aWxsIG5vdCBhZHZlcnRpc2UgaXQuIChpZTogR0FFKSAiIiIKICAgIHRyeToKICAgICAgICAjIHNlbGVjdC5wb2xsKCkgb2JqZWN0cyB3b24ndCBmYWlsIHVudGlsIHVzZWQuCiAgICAgICAgaWYgc3RydWN0ID09ICdwb2xsJzoKICAgICAgICAgICAgcCA9IHNlbGVjdC5wb2xsKCkKICAgICAgICAgICAgcC5wb2xsKDApCgogICAgICAgICMgQWxsIG90aGVycyB3aWxsIGZhaWwgb24gYWxsb2NhdGlvbi4KICAgICAgICBlbHNlOgogICAgICAgICAgICBnZXRhdHRyKHNlbGVjdCwgc3RydWN0KSgpLmNsb3NlKCkKICAgICAgICByZXR1cm4gVHJ1ZQogICAgZXhjZXB0IChPU0Vycm9yLCBBdHRyaWJ1dGVFcnJvcikgYXMgZToKICAgICAgICByZXR1cm4gRmFsc2UKCgojIENob29zZSB0aGUgYmVzdCBpbXBsZW1lbnRhdGlvbiwgcm91Z2hseToKIyBrcXVldWUgPT0gZXBvbGwgPiBwb2xsID4gc2VsZWN0LiBEZXZwb2xsIG5vdCBzdXBwb3J0ZWQuIChTZWUgYWJvdmUpCiMgc2VsZWN0KCkgYWxzbyBjYW4ndCBhY2NlcHQgYSBGRCA+IEZEX1NFVFNJWkUgKHVzdWFsbHkgYXJvdW5kIDEwMjQpCmRlZiBEZWZhdWx0U2VsZWN0b3IoKToKICAgICIiIiBUaGlzIGZ1bmN0aW9uIHNlcnZlcyBhcyBhIGZpcnN0IGNhbGwgZm9yIERlZmF1bHRTZWxlY3RvciB0bwogICAgZGV0ZWN0IGlmIHRoZSBzZWxlY3QgbW9kdWxlIGlzIGJlaW5nIG1vbmtleS1wYXRjaGVkIGluY29ycmVjdGx5CiAgICBieSBldmVudGxldCwgZ3JlZW5sZXQsIGFuZCBwcmVzZXJ2ZSBwcm9wZXIgYmVoYXZpb3IuICIiIgogICAgZ2xvYmFsIF9ERUZBVUxUX1NFTEVDVE9SCiAgICBpZiBfREVGQVVMVF9TRUxFQ1RPUiBpcyBOb25lOgogICAgICAgIGlmIF9jYW5fYWxsb2NhdGUoJ2txdWV1ZScpOgogICAgICAgICAgICBfREVGQVVMVF9TRUxFQ1RPUiA9IEtxdWV1ZVNlbGVjdG9yCiAgICAgICAgZWxpZiBfY2FuX2FsbG9jYXRlKCdlcG9sbCcpOgogICAgICAgICAgICBfREVGQVVMVF9TRUxFQ1RPUiA9IEVwb2xsU2VsZWN0b3IKICAgICAgICBlbGlmIF9jYW5fYWxsb2NhdGUoJ3BvbGwnKToKICAgICAgICAgICAgX0RFRkFVTFRfU0VMRUNUT1IgPSBQb2xsU2VsZWN0b3IKICAgICAgICBlbGlmIGhhc2F0dHIoc2VsZWN0LCAnc2VsZWN0Jyk6CiAgICAgICAgICAgIF9ERUZBVUxUX1NFTEVDVE9SID0gU2VsZWN0U2VsZWN0b3IKICAgICAgICBlbHNlOiAgIyBQbGF0Zm9ybS1zcGVjaWZpYzogQXBwRW5naW5lCiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1BsYXRmb3JtIGRvZXMgbm90IGhhdmUgYSBzZWxlY3RvcicpCiAgICByZXR1cm4gX0RFRkFVTFRfU0VMRUNUT1IoKQpQSwMEFAAAAAAAAAAhANXvyKKwLwAAsC8AAD0AAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvdXRpbC9zc2xfLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKaW1wb3J0IGVycm5vCmltcG9ydCB3YXJuaW5ncwppbXBvcnQgaG1hYwoKZnJvbSBiaW5hc2NpaSBpbXBvcnQgaGV4bGlmeSwgdW5oZXhsaWZ5CmZyb20gaGFzaGxpYiBpbXBvcnQgbWQ1LCBzaGExLCBzaGEyNTYKCmZyb20gLi5leGNlcHRpb25zIGltcG9ydCBTU0xFcnJvciwgSW5zZWN1cmVQbGF0Zm9ybVdhcm5pbmcsIFNOSU1pc3NpbmdXYXJuaW5nCgoKU1NMQ29udGV4dCA9IE5vbmUKSEFTX1NOSSA9IEZhbHNlCklTX1BZT1BFTlNTTCA9IEZhbHNlCklTX1NFQ1VSRVRSQU5TUE9SVCA9IEZhbHNlCgojIE1hcHMgdGhlIGxlbmd0aCBvZiBhIGRpZ2VzdCB0byBhIHBvc3NpYmxlIGhhc2ggZnVuY3Rpb24gcHJvZHVjaW5nIHRoaXMgZGlnZXN0CkhBU0hGVU5DX01BUCA9IHsKICAgIDMyOiBtZDUsCiAgICA0MDogc2hhMSwKICAgIDY0OiBzaGEyNTYsCn0KCgpkZWYgX2NvbnN0X2NvbXBhcmVfZGlnZXN0X2JhY2twb3J0KGEsIGIpOgogICAgIiIiCiAgICBDb21wYXJlIHR3byBkaWdlc3RzIG9mIGVxdWFsIGxlbmd0aCBpbiBjb25zdGFudCB0aW1lLgoKICAgIFRoZSBkaWdlc3RzIG11c3QgYmUgb2YgdHlwZSBzdHIvYnl0ZXMuCiAgICBSZXR1cm5zIFRydWUgaWYgdGhlIGRpZ2VzdHMgbWF0Y2gsIGFuZCBGYWxzZSBvdGhlcndpc2UuCiAgICAiIiIKICAgIHJlc3VsdCA9IGFicyhsZW4oYSkgLSBsZW4oYikpCiAgICBmb3IgbCwgciBpbiB6aXAoYnl0ZWFycmF5KGEpLCBieXRlYXJyYXkoYikpOgogICAgICAgIHJlc3VsdCB8PSBsIF4gcgogICAgcmV0dXJuIHJlc3VsdCA9PSAwCgoKX2NvbnN0X2NvbXBhcmVfZGlnZXN0ID0gZ2V0YXR0cihobWFjLCAnY29tcGFyZV9kaWdlc3QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb25zdF9jb21wYXJlX2RpZ2VzdF9iYWNrcG9ydCkKCgp0cnk6ICAjIFRlc3QgZm9yIFNTTCBmZWF0dXJlcwogICAgaW1wb3J0IHNzbAogICAgZnJvbSBzc2wgaW1wb3J0IHdyYXBfc29ja2V0LCBDRVJUX05PTkUsIFBST1RPQ09MX1NTTHYyMwogICAgZnJvbSBzc2wgaW1wb3J0IEhBU19TTkkgICMgSGFzIFNOST8KZXhjZXB0IEltcG9ydEVycm9yOgogICAgcGFzcwoKCnRyeToKICAgIGZyb20gc3NsIGltcG9ydCBPUF9OT19TU0x2MiwgT1BfTk9fU1NMdjMsIE9QX05PX0NPTVBSRVNTSU9OCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIE9QX05PX1NTTHYyLCBPUF9OT19TU0x2MyA9IDB4MTAwMDAwMCwgMHgyMDAwMDAwCiAgICBPUF9OT19DT01QUkVTU0lPTiA9IDB4MjAwMDAKCiMgQSBzZWN1cmUgZGVmYXVsdC4KIyBTb3VyY2VzIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIFRMUyBjaXBoZXJzOgojCiMgLSBodHRwczovL3dpa2kubW96aWxsYS5vcmcvU2VjdXJpdHkvU2VydmVyX1NpZGVfVExTCiMgLSBodHRwczovL3d3dy5zc2xsYWJzLmNvbS9wcm9qZWN0cy9iZXN0LXByYWN0aWNlcy9pbmRleC5odG1sCiMgLSBodHRwczovL2h5bmVrLm1lL2FydGljbGVzL2hhcmRlbmluZy15b3VyLXdlYi1zZXJ2ZXJzLXNzbC1jaXBoZXJzLwojCiMgVGhlIGdlbmVyYWwgaW50ZW50IGlzOgojIC0gUHJlZmVyIFRMUyAxLjMgY2lwaGVyIHN1aXRlcwojIC0gcHJlZmVyIGNpcGhlciBzdWl0ZXMgdGhhdCBvZmZlciBwZXJmZWN0IGZvcndhcmQgc2VjcmVjeSAoREhFL0VDREhFKSwKIyAtIHByZWZlciBFQ0RIRSBvdmVyIERIRSBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlLAojIC0gcHJlZmVyIGFueSBBRVMtR0NNIGFuZCBDaGFDaGEyMCBvdmVyIGFueSBBRVMtQ0JDIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2UgYW5kCiMgICBzZWN1cml0eSwKIyAtIHByZWZlciBBRVMtR0NNIG92ZXIgQ2hhQ2hhMjAgYmVjYXVzZSBoYXJkd2FyZS1hY2NlbGVyYXRlZCBBRVMgaXMgY29tbW9uLAojIC0gZGlzYWJsZSBOVUxMIGF1dGhlbnRpY2F0aW9uLCBNRDUgTUFDcyBhbmQgRFNTIGZvciBzZWN1cml0eSByZWFzb25zLgpERUZBVUxUX0NJUEhFUlMgPSAnOicuam9pbihbCiAgICAnVExTMTMtQUVTLTI1Ni1HQ00tU0hBMzg0JywKICAgICdUTFMxMy1DSEFDSEEyMC1QT0xZMTMwNS1TSEEyNTYnLAogICAgJ1RMUzEzLUFFUy0xMjgtR0NNLVNIQTI1NicsCiAgICAnRUNESCtBRVNHQ00nLAogICAgJ0VDREgrQ0hBQ0hBMjAnLAogICAgJ0RIK0FFU0dDTScsCiAgICAnREgrQ0hBQ0hBMjAnLAogICAgJ0VDREgrQUVTMjU2JywKICAgICdESCtBRVMyNTYnLAogICAgJ0VDREgrQUVTMTI4JywKICAgICdESCtBRVMnLAogICAgJ1JTQStBRVNHQ00nLAogICAgJ1JTQStBRVMnLAogICAgJyFhTlVMTCcsCiAgICAnIWVOVUxMJywKICAgICchTUQ1JywKXSkKCnRyeToKICAgIGZyb20gc3NsIGltcG9ydCBTU0xDb250ZXh0ICAjIE1vZGVybiBTU0w/CmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGltcG9ydCBzeXMKCiAgICBjbGFzcyBTU0xDb250ZXh0KG9iamVjdCk6ICAjIFBsYXRmb3JtLXNwZWNpZmljOiBQeXRob24gMiAmIDMuMQogICAgICAgIHN1cHBvcnRzX3NldF9jaXBoZXJzID0gKCgyLCA3KSA8PSBzeXMudmVyc2lvbl9pbmZvIDwgKDMsKSBvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgzLCAyKSA8PSBzeXMudmVyc2lvbl9pbmZvKQoKICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgcHJvdG9jb2xfdmVyc2lvbik6CiAgICAgICAgICAgIHNlbGYucHJvdG9jb2wgPSBwcm90b2NvbF92ZXJzaW9uCiAgICAgICAgICAgICMgVXNlIGRlZmF1bHQgdmFsdWVzIGZyb20gYSByZWFsIFNTTENvbnRleHQKICAgICAgICAgICAgc2VsZi5jaGVja19ob3N0bmFtZSA9IEZhbHNlCiAgICAgICAgICAgIHNlbGYudmVyaWZ5X21vZGUgPSBzc2wuQ0VSVF9OT05FCiAgICAgICAgICAgIHNlbGYuY2FfY2VydHMgPSBOb25lCiAgICAgICAgICAgIHNlbGYub3B0aW9ucyA9IDAKICAgICAgICAgICAgc2VsZi5jZXJ0ZmlsZSA9IE5vbmUKICAgICAgICAgICAgc2VsZi5rZXlmaWxlID0gTm9uZQogICAgICAgICAgICBzZWxmLmNpcGhlcnMgPSBOb25lCgogICAgICAgIGRlZiBsb2FkX2NlcnRfY2hhaW4oc2VsZiwgY2VydGZpbGUsIGtleWZpbGUpOgogICAgICAgICAgICBzZWxmLmNlcnRmaWxlID0gY2VydGZpbGUKICAgICAgICAgICAgc2VsZi5rZXlmaWxlID0ga2V5ZmlsZQoKICAgICAgICBkZWYgbG9hZF92ZXJpZnlfbG9jYXRpb25zKHNlbGYsIGNhZmlsZT1Ob25lLCBjYXBhdGg9Tm9uZSk6CiAgICAgICAgICAgIHNlbGYuY2FfY2VydHMgPSBjYWZpbGUKCiAgICAgICAgICAgIGlmIGNhcGF0aCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIHJhaXNlIFNTTEVycm9yKCJDQSBkaXJlY3RvcmllcyBub3Qgc3VwcG9ydGVkIGluIG9sZGVyIFB5dGhvbnMiKQoKICAgICAgICBkZWYgc2V0X2NpcGhlcnMoc2VsZiwgY2lwaGVyX3N1aXRlKToKICAgICAgICAgICAgaWYgbm90IHNlbGYuc3VwcG9ydHNfc2V0X2NpcGhlcnM6CiAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgJ1lvdXIgdmVyc2lvbiBvZiBQeXRob24gZG9lcyBub3Qgc3VwcG9ydCBzZXR0aW5nICcKICAgICAgICAgICAgICAgICAgICAnYSBjdXN0b20gY2lwaGVyIHN1aXRlLiBQbGVhc2UgdXBncmFkZSB0byBQeXRob24gJwogICAgICAgICAgICAgICAgICAgICcyLjcsIDMuMiwgb3IgbGF0ZXIgaWYgeW91IG5lZWQgdGhpcyBmdW5jdGlvbmFsaXR5LicKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgc2VsZi5jaXBoZXJzID0gY2lwaGVyX3N1aXRlCgogICAgICAgIGRlZiB3cmFwX3NvY2tldChzZWxmLCBzb2NrZXQsIHNlcnZlcl9ob3N0bmFtZT1Ob25lLCBzZXJ2ZXJfc2lkZT1GYWxzZSk6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCiAgICAgICAgICAgICAgICAnQSB0cnVlIFNTTENvbnRleHQgb2JqZWN0IGlzIG5vdCBhdmFpbGFibGUuIFRoaXMgcHJldmVudHMgJwogICAgICAgICAgICAgICAgJ3VybGxpYjMgZnJvbSBjb25maWd1cmluZyBTU0wgYXBwcm9wcmlhdGVseSBhbmQgbWF5IGNhdXNlICcKICAgICAgICAgICAgICAgICdjZXJ0YWluIFNTTCBjb25uZWN0aW9ucyB0byBmYWlsLiBZb3UgY2FuIHVwZ3JhZGUgdG8gYSBuZXdlciAnCiAgICAgICAgICAgICAgICAndmVyc2lvbiBvZiBQeXRob24gdG8gc29sdmUgdGhpcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSAnCiAgICAgICAgICAgICAgICAnaHR0cHM6Ly91cmxsaWIzLnJlYWR0aGVkb2NzLmlvL2VuL2xhdGVzdC9hZHZhbmNlZC11c2FnZS5odG1sJwogICAgICAgICAgICAgICAgJyNzc2wtd2FybmluZ3MnLAogICAgICAgICAgICAgICAgSW5zZWN1cmVQbGF0Zm9ybVdhcm5pbmcKICAgICAgICAgICAgKQogICAgICAgICAgICBrd2FyZ3MgPSB7CiAgICAgICAgICAgICAgICAna2V5ZmlsZSc6IHNlbGYua2V5ZmlsZSwKICAgICAgICAgICAgICAgICdjZXJ0ZmlsZSc6IHNlbGYuY2VydGZpbGUsCiAgICAgICAgICAgICAgICAnY2FfY2VydHMnOiBzZWxmLmNhX2NlcnRzLAogICAgICAgICAgICAgICAgJ2NlcnRfcmVxcyc6IHNlbGYudmVyaWZ5X21vZGUsCiAgICAgICAgICAgICAgICAnc3NsX3ZlcnNpb24nOiBzZWxmLnByb3RvY29sLAogICAgICAgICAgICAgICAgJ3NlcnZlcl9zaWRlJzogc2VydmVyX3NpZGUsCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgc2VsZi5zdXBwb3J0c19zZXRfY2lwaGVyczogICMgUGxhdGZvcm0tc3BlY2lmaWM6IFB5dGhvbiAyLjcrCiAgICAgICAgICAgICAgICByZXR1cm4gd3JhcF9zb2NrZXQoc29ja2V0LCBjaXBoZXJzPXNlbGYuY2lwaGVycywgKiprd2FyZ3MpCiAgICAgICAgICAgIGVsc2U6ICAjIFBsYXRmb3JtLXNwZWNpZmljOiBQeXRob24gMi42CiAgICAgICAgICAgICAgICByZXR1cm4gd3JhcF9zb2NrZXQoc29ja2V0LCAqKmt3YXJncykKCgpkZWYgYXNzZXJ0X2ZpbmdlcnByaW50KGNlcnQsIGZpbmdlcnByaW50KToKICAgICIiIgogICAgQ2hlY2tzIGlmIGdpdmVuIGZpbmdlcnByaW50IG1hdGNoZXMgdGhlIHN1cHBsaWVkIGNlcnRpZmljYXRlLgoKICAgIDpwYXJhbSBjZXJ0OgogICAgICAgIENlcnRpZmljYXRlIGFzIGJ5dGVzIG9iamVjdC4KICAgIDpwYXJhbSBmaW5nZXJwcmludDoKICAgICAgICBGaW5nZXJwcmludCBhcyBzdHJpbmcgb2YgaGV4ZGlnaXRzLCBjYW4gYmUgaW50ZXJzcGVyc2VkIGJ5IGNvbG9ucy4KICAgICIiIgoKICAgIGZpbmdlcnByaW50ID0gZmluZ2VycHJpbnQucmVwbGFjZSgnOicsICcnKS5sb3dlcigpCiAgICBkaWdlc3RfbGVuZ3RoID0gbGVuKGZpbmdlcnByaW50KQogICAgaGFzaGZ1bmMgPSBIQVNIRlVOQ19NQVAuZ2V0KGRpZ2VzdF9sZW5ndGgpCiAgICBpZiBub3QgaGFzaGZ1bmM6CiAgICAgICAgcmFpc2UgU1NMRXJyb3IoCiAgICAgICAgICAgICdGaW5nZXJwcmludCBvZiBpbnZhbGlkIGxlbmd0aDogezB9Jy5mb3JtYXQoZmluZ2VycHJpbnQpKQoKICAgICMgV2UgbmVlZCBlbmNvZGUoKSBoZXJlIGZvciBweTMyOyB3b3JrcyBvbiBweTIgYW5kIHAzMy4KICAgIGZpbmdlcnByaW50X2J5dGVzID0gdW5oZXhsaWZ5KGZpbmdlcnByaW50LmVuY29kZSgpKQoKICAgIGNlcnRfZGlnZXN0ID0gaGFzaGZ1bmMoY2VydCkuZGlnZXN0KCkKCiAgICBpZiBub3QgX2NvbnN0X2NvbXBhcmVfZGlnZXN0KGNlcnRfZGlnZXN0LCBmaW5nZXJwcmludF9ieXRlcyk6CiAgICAgICAgcmFpc2UgU1NMRXJyb3IoJ0ZpbmdlcnByaW50cyBkaWQgbm90IG1hdGNoLiBFeHBlY3RlZCAiezB9IiwgZ290ICJ7MX0iLicKICAgICAgICAgICAgICAgICAgICAgICAuZm9ybWF0KGZpbmdlcnByaW50LCBoZXhsaWZ5KGNlcnRfZGlnZXN0KSkpCgoKZGVmIHJlc29sdmVfY2VydF9yZXFzKGNhbmRpZGF0ZSk6CiAgICAiIiIKICAgIFJlc29sdmVzIHRoZSBhcmd1bWVudCB0byBhIG51bWVyaWMgY29uc3RhbnQsIHdoaWNoIGNhbiBiZSBwYXNzZWQgdG8KICAgIHRoZSB3cmFwX3NvY2tldCBmdW5jdGlvbi9tZXRob2QgZnJvbSB0aGUgc3NsIG1vZHVsZS4KICAgIERlZmF1bHRzIHRvIDpkYXRhOmBzc2wuQ0VSVF9OT05FYC4KICAgIElmIGdpdmVuIGEgc3RyaW5nIGl0IGlzIGFzc3VtZWQgdG8gYmUgdGhlIG5hbWUgb2YgdGhlIGNvbnN0YW50IGluIHRoZQogICAgOm1vZDpgc3NsYCBtb2R1bGUgb3IgaXRzIGFiYnJldmF0aW9uLgogICAgKFNvIHlvdSBjYW4gc3BlY2lmeSBgUkVRVUlSRURgIGluc3RlYWQgb2YgYENFUlRfUkVRVUlSRURgLgogICAgSWYgaXQncyBuZWl0aGVyIGBOb25lYCBub3IgYSBzdHJpbmcgd2UgYXNzdW1lIGl0IGlzIGFscmVhZHkgdGhlIG51bWVyaWMKICAgIGNvbnN0YW50IHdoaWNoIGNhbiBkaXJlY3RseSBiZSBwYXNzZWQgdG8gd3JhcF9zb2NrZXQuCiAgICAiIiIKICAgIGlmIGNhbmRpZGF0ZSBpcyBOb25lOgogICAgICAgIHJldHVybiBDRVJUX05PTkUKCiAgICBpZiBpc2luc3RhbmNlKGNhbmRpZGF0ZSwgc3RyKToKICAgICAgICByZXMgPSBnZXRhdHRyKHNzbCwgY2FuZGlkYXRlLCBOb25lKQogICAgICAgIGlmIHJlcyBpcyBOb25lOgogICAgICAgICAgICByZXMgPSBnZXRhdHRyKHNzbCwgJ0NFUlRfJyArIGNhbmRpZGF0ZSkKICAgICAgICByZXR1cm4gcmVzCgogICAgcmV0dXJuIGNhbmRpZGF0ZQoKCmRlZiByZXNvbHZlX3NzbF92ZXJzaW9uKGNhbmRpZGF0ZSk6CiAgICAiIiIKICAgIGxpa2UgcmVzb2x2ZV9jZXJ0X3JlcXMKICAgICIiIgogICAgaWYgY2FuZGlkYXRlIGlzIE5vbmU6CiAgICAgICAgcmV0dXJuIFBST1RPQ09MX1NTTHYyMwoKICAgIGlmIGlzaW5zdGFuY2UoY2FuZGlkYXRlLCBzdHIpOgogICAgICAgIHJlcyA9IGdldGF0dHIoc3NsLCBjYW5kaWRhdGUsIE5vbmUpCiAgICAgICAgaWYgcmVzIGlzIE5vbmU6CiAgICAgICAgICAgIHJlcyA9IGdldGF0dHIoc3NsLCAnUFJPVE9DT0xfJyArIGNhbmRpZGF0ZSkKICAgICAgICByZXR1cm4gcmVzCgogICAgcmV0dXJuIGNhbmRpZGF0ZQoKCmRlZiBjcmVhdGVfdXJsbGliM19jb250ZXh0KHNzbF92ZXJzaW9uPU5vbmUsIGNlcnRfcmVxcz1Ob25lLAogICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zPU5vbmUsIGNpcGhlcnM9Tm9uZSk6CiAgICAiIiJBbGwgYXJndW1lbnRzIGhhdmUgdGhlIHNhbWUgbWVhbmluZyBhcyBgYHNzbF93cmFwX3NvY2tldGBgLgoKICAgIEJ5IGRlZmF1bHQsIHRoaXMgZnVuY3Rpb24gZG9lcyBhIGxvdCBvZiB0aGUgc2FtZSB3b3JrIHRoYXQKICAgIGBgc3NsLmNyZWF0ZV9kZWZhdWx0X2NvbnRleHRgYCBkb2VzIG9uIFB5dGhvbiAzLjQrLiBJdDoKCiAgICAtIERpc2FibGVzIFNTTHYyLCBTU0x2MywgYW5kIGNvbXByZXNzaW9uCiAgICAtIFNldHMgYSByZXN0cmljdGVkIHNldCBvZiBzZXJ2ZXIgY2lwaGVycwoKICAgIElmIHlvdSB3aXNoIHRvIGVuYWJsZSBTU0x2MywgeW91IGNhbiBkbzo6CgogICAgICAgIGZyb20gdXJsbGliMy51dGlsIGltcG9ydCBzc2xfCiAgICAgICAgY29udGV4dCA9IHNzbF8uY3JlYXRlX3VybGxpYjNfY29udGV4dCgpCiAgICAgICAgY29udGV4dC5vcHRpb25zICY9IH5zc2xfLk9QX05PX1NTTHYzCgogICAgWW91IGNhbiBkbyB0aGUgc2FtZSB0byBlbmFibGUgY29tcHJlc3Npb24gKHN1YnN0aXR1dGluZyBgYENPTVBSRVNTSU9OYGAKICAgIGZvciBgYFNTTHYzYGAgaW4gdGhlIGxhc3QgbGluZSBhYm92ZSkuCgogICAgOnBhcmFtIHNzbF92ZXJzaW9uOgogICAgICAgIFRoZSBkZXNpcmVkIHByb3RvY29sIHZlcnNpb24gdG8gdXNlLiBUaGlzIHdpbGwgZGVmYXVsdCB0bwogICAgICAgIFBST1RPQ09MX1NTTHYyMyB3aGljaCB3aWxsIG5lZ290aWF0ZSB0aGUgaGlnaGVzdCBwcm90b2NvbCB0aGF0IGJvdGgKICAgICAgICB0aGUgc2VydmVyIGFuZCB5b3VyIGluc3RhbGxhdGlvbiBvZiBPcGVuU1NMIHN1cHBvcnQuCiAgICA6cGFyYW0gY2VydF9yZXFzOgogICAgICAgIFdoZXRoZXIgdG8gcmVxdWlyZSB0aGUgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uLiBUaGlzIGRlZmF1bHRzIHRvCiAgICAgICAgYGBzc2wuQ0VSVF9SRVFVSVJFRGBgLgogICAgOnBhcmFtIG9wdGlvbnM6CiAgICAgICAgU3BlY2lmaWMgT3BlblNTTCBvcHRpb25zLiBUaGVzZSBkZWZhdWx0IHRvIGBgc3NsLk9QX05PX1NTTHYyYGAsCiAgICAgICAgYGBzc2wuT1BfTk9fU1NMdjNgYCwgYGBzc2wuT1BfTk9fQ09NUFJFU1NJT05gYC4KICAgIDpwYXJhbSBjaXBoZXJzOgogICAgICAgIFdoaWNoIGNpcGhlciBzdWl0ZXMgdG8gYWxsb3cgdGhlIHNlcnZlciB0byBzZWxlY3QuCiAgICA6cmV0dXJuczoKICAgICAgICBDb25zdHJ1Y3RlZCBTU0xDb250ZXh0IG9iamVjdCB3aXRoIHNwZWNpZmllZCBvcHRpb25zCiAgICA6cnR5cGU6IFNTTENvbnRleHQKICAgICIiIgogICAgY29udGV4dCA9IFNTTENvbnRleHQoc3NsX3ZlcnNpb24gb3Igc3NsLlBST1RPQ09MX1NTTHYyMykKCiAgICAjIFNldHRpbmcgdGhlIGRlZmF1bHQgaGVyZSwgYXMgd2UgbWF5IGhhdmUgbm8gc3NsIG1vZHVsZSBvbiBpbXBvcnQKICAgIGNlcnRfcmVxcyA9IHNzbC5DRVJUX1JFUVVJUkVEIGlmIGNlcnRfcmVxcyBpcyBOb25lIGVsc2UgY2VydF9yZXFzCgogICAgaWYgb3B0aW9ucyBpcyBOb25lOgogICAgICAgIG9wdGlvbnMgPSAwCiAgICAgICAgIyBTU0x2MiBpcyBlYXNpbHkgYnJva2VuIGFuZCBpcyBjb25zaWRlcmVkIGhhcm1mdWwgYW5kIGRhbmdlcm91cwogICAgICAgIG9wdGlvbnMgfD0gT1BfTk9fU1NMdjIKICAgICAgICAjIFNTTHYzIGhhcyBzZXZlcmFsIHByb2JsZW1zIGFuZCBpcyBub3cgZGFuZ2Vyb3VzCiAgICAgICAgb3B0aW9ucyB8PSBPUF9OT19TU0x2MwogICAgICAgICMgRGlzYWJsZSBjb21wcmVzc2lvbiB0byBwcmV2ZW50IENSSU1FIGF0dGFja3MgZm9yIE9wZW5TU0wgMS4wKwogICAgICAgICMgKGlzc3VlICMzMDkpCiAgICAgICAgb3B0aW9ucyB8PSBPUF9OT19DT01QUkVTU0lPTgoKICAgIGNvbnRleHQub3B0aW9ucyB8PSBvcHRpb25zCgogICAgaWYgZ2V0YXR0cihjb250ZXh0LCAnc3VwcG9ydHNfc2V0X2NpcGhlcnMnLCBUcnVlKTogICMgUGxhdGZvcm0tc3BlY2lmaWM6IFB5dGhvbiAyLjYKICAgICAgICBjb250ZXh0LnNldF9jaXBoZXJzKGNpcGhlcnMgb3IgREVGQVVMVF9DSVBIRVJTKQoKICAgIGNvbnRleHQudmVyaWZ5X21vZGUgPSBjZXJ0X3JlcXMKICAgIGlmIGdldGF0dHIoY29udGV4dCwgJ2NoZWNrX2hvc3RuYW1lJywgTm9uZSkgaXMgbm90IE5vbmU6ICAjIFBsYXRmb3JtLXNwZWNpZmljOiBQeXRob24gMy4yCiAgICAgICAgIyBXZSBkbyBvdXIgb3duIHZlcmlmaWNhdGlvbiwgaW5jbHVkaW5nIGZpbmdlcnByaW50cyBhbmQgYWx0ZXJuYXRpdmUKICAgICAgICAjIGhvc3RuYW1lcy4gU28gZGlzYWJsZSBpdCBoZXJlCiAgICAgICAgY29udGV4dC5jaGVja19ob3N0bmFtZSA9IEZhbHNlCiAgICByZXR1cm4gY29udGV4dAoKCmRlZiBzc2xfd3JhcF9zb2NrZXQoc29jaywga2V5ZmlsZT1Ob25lLCBjZXJ0ZmlsZT1Ob25lLCBjZXJ0X3JlcXM9Tm9uZSwKICAgICAgICAgICAgICAgICAgICBjYV9jZXJ0cz1Ob25lLCBzZXJ2ZXJfaG9zdG5hbWU9Tm9uZSwKICAgICAgICAgICAgICAgICAgICBzc2xfdmVyc2lvbj1Ob25lLCBjaXBoZXJzPU5vbmUsIHNzbF9jb250ZXh0PU5vbmUsCiAgICAgICAgICAgICAgICAgICAgY2FfY2VydF9kaXI9Tm9uZSk6CiAgICAiIiIKICAgIEFsbCBhcmd1bWVudHMgZXhjZXB0IGZvciBzZXJ2ZXJfaG9zdG5hbWUsIHNzbF9jb250ZXh0LCBhbmQgY2FfY2VydF9kaXIgaGF2ZQogICAgdGhlIHNhbWUgbWVhbmluZyBhcyB0aGV5IGRvIHdoZW4gdXNpbmcgOmZ1bmM6YHNzbC53cmFwX3NvY2tldGAuCgogICAgOnBhcmFtIHNlcnZlcl9ob3N0bmFtZToKICAgICAgICBXaGVuIFNOSSBpcyBzdXBwb3J0ZWQsIHRoZSBleHBlY3RlZCBob3N0bmFtZSBvZiB0aGUgY2VydGlmaWNhdGUKICAgIDpwYXJhbSBzc2xfY29udGV4dDoKICAgICAgICBBIHByZS1tYWRlIDpjbGFzczpgU1NMQ29udGV4dGAgb2JqZWN0LiBJZiBub25lIGlzIHByb3ZpZGVkLCBvbmUgd2lsbAogICAgICAgIGJlIGNyZWF0ZWQgdXNpbmcgOmZ1bmM6YGNyZWF0ZV91cmxsaWIzX2NvbnRleHRgLgogICAgOnBhcmFtIGNpcGhlcnM6CiAgICAgICAgQSBzdHJpbmcgb2YgY2lwaGVycyB3ZSB3aXNoIHRoZSBjbGllbnQgdG8gc3VwcG9ydC4gVGhpcyBpcyBub3QKICAgICAgICBzdXBwb3J0ZWQgb24gUHl0aG9uIDIuNiBhcyB0aGUgc3NsIG1vZHVsZSBkb2VzIG5vdCBzdXBwb3J0IGl0LgogICAgOnBhcmFtIGNhX2NlcnRfZGlyOgogICAgICAgIEEgZGlyZWN0b3J5IGNvbnRhaW5pbmcgQ0EgY2VydGlmaWNhdGVzIGluIG11bHRpcGxlIHNlcGFyYXRlIGZpbGVzLCBhcwogICAgICAgIHN1cHBvcnRlZCBieSBPcGVuU1NMJ3MgLUNBcGF0aCBmbGFnIG9yIHRoZSBjYXBhdGggYXJndW1lbnQgdG8KICAgICAgICBTU0xDb250ZXh0LmxvYWRfdmVyaWZ5X2xvY2F0aW9ucygpLgogICAgIiIiCiAgICBjb250ZXh0ID0gc3NsX2NvbnRleHQKICAgIGlmIGNvbnRleHQgaXMgTm9uZToKICAgICAgICAjIE5vdGU6IFRoaXMgYnJhbmNoIG9mIGNvZGUgYW5kIGFsbCB0aGUgdmFyaWFibGVzIGluIGl0IGFyZSBubyBsb25nZXIKICAgICAgICAjIHVzZWQgYnkgdXJsbGliMyBpdHNlbGYuIFdlIHNob3VsZCBjb25zaWRlciBkZXByZWNhdGluZyBhbmQgcmVtb3ZpbmcKICAgICAgICAjIHRoaXMgY29kZS4KICAgICAgICBjb250ZXh0ID0gY3JlYXRlX3VybGxpYjNfY29udGV4dChzc2xfdmVyc2lvbiwgY2VydF9yZXFzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpcGhlcnM9Y2lwaGVycykKCiAgICBpZiBjYV9jZXJ0cyBvciBjYV9jZXJ0X2RpcjoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGNvbnRleHQubG9hZF92ZXJpZnlfbG9jYXRpb25zKGNhX2NlcnRzLCBjYV9jZXJ0X2RpcikKICAgICAgICBleGNlcHQgSU9FcnJvciBhcyBlOiAgIyBQbGF0Zm9ybS1zcGVjaWZpYzogUHl0aG9uIDIuNiwgMi43LCAzLjIKICAgICAgICAgICAgcmFpc2UgU1NMRXJyb3IoZSkKICAgICAgICAjIFB5MzMgcmFpc2VzIEZpbGVOb3RGb3VuZEVycm9yIHdoaWNoIHN1YmNsYXNzZXMgT1NFcnJvcgogICAgICAgICMgVGhlc2UgYXJlIG5vdCBlcXVpdmFsZW50IHVubGVzcyB3ZSBjaGVjayB0aGUgZXJybm8gYXR0cmlidXRlCiAgICAgICAgZXhjZXB0IE9TRXJyb3IgYXMgZTogICMgUGxhdGZvcm0tc3BlY2lmaWM6IFB5dGhvbiAzLjMgYW5kIGJleW9uZAogICAgICAgICAgICBpZiBlLmVycm5vID09IGVycm5vLkVOT0VOVDoKICAgICAgICAgICAgICAgIHJhaXNlIFNTTEVycm9yKGUpCiAgICAgICAgICAgIHJhaXNlCiAgICBlbGlmIGdldGF0dHIoY29udGV4dCwgJ2xvYWRfZGVmYXVsdF9jZXJ0cycsIE5vbmUpIGlzIG5vdCBOb25lOgogICAgICAgICMgdHJ5IHRvIGxvYWQgT1MgZGVmYXVsdCBjZXJ0czsgd29ya3Mgd2VsbCBvbiBXaW5kb3dzIChyZXF1aXJlIFB5dGhvbjMuNCspCiAgICAgICAgY29udGV4dC5sb2FkX2RlZmF1bHRfY2VydHMoKQoKICAgIGlmIGNlcnRmaWxlOgogICAgICAgIGNvbnRleHQubG9hZF9jZXJ0X2NoYWluKGNlcnRmaWxlLCBrZXlmaWxlKQogICAgaWYgSEFTX1NOSTogICMgUGxhdGZvcm0tc3BlY2lmaWM6IE9wZW5TU0wgd2l0aCBlbmFibGVkIFNOSQogICAgICAgIHJldHVybiBjb250ZXh0LndyYXBfc29ja2V0KHNvY2ssIHNlcnZlcl9ob3N0bmFtZT1zZXJ2ZXJfaG9zdG5hbWUpCgogICAgd2FybmluZ3Mud2FybigKICAgICAgICAnQW4gSFRUUFMgcmVxdWVzdCBoYXMgYmVlbiBtYWRlLCBidXQgdGhlIFNOSSAoU3ViamVjdCBOYW1lICcKICAgICAgICAnSW5kaWNhdGlvbikgZXh0ZW5zaW9uIHRvIFRMUyBpcyBub3QgYXZhaWxhYmxlIG9uIHRoaXMgcGxhdGZvcm0uICcKICAgICAgICAnVGhpcyBtYXkgY2F1c2UgdGhlIHNlcnZlciB0byBwcmVzZW50IGFuIGluY29ycmVjdCBUTFMgJwogICAgICAgICdjZXJ0aWZpY2F0ZSwgd2hpY2ggY2FuIGNhdXNlIHZhbGlkYXRpb24gZmFpbHVyZXMuIFlvdSBjYW4gdXBncmFkZSB0byAnCiAgICAgICAgJ2EgbmV3ZXIgdmVyc2lvbiBvZiBQeXRob24gdG8gc29sdmUgdGhpcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSAnCiAgICAgICAgJ2h0dHBzOi8vdXJsbGliMy5yZWFkdGhlZG9jcy5pby9lbi9sYXRlc3QvYWR2YW5jZWQtdXNhZ2UuaHRtbCcKICAgICAgICAnI3NzbC13YXJuaW5ncycsCiAgICAgICAgU05JTWlzc2luZ1dhcm5pbmcKICAgICkKICAgIHJldHVybiBjb250ZXh0LndyYXBfc29ja2V0KHNvY2spClBLAwQUAAAAAAAAACEAVVLOIB0mAAAdJgAAQAAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy91dGlsL3RpbWVvdXQucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAojIFRoZSBkZWZhdWx0IHNvY2tldCB0aW1lb3V0LCB1c2VkIGJ5IGh0dHBsaWIgdG8gaW5kaWNhdGUgdGhhdCBubyB0aW1lb3V0IHdhcwojIHNwZWNpZmllZCBieSB0aGUgdXNlcgpmcm9tIHNvY2tldCBpbXBvcnQgX0dMT0JBTF9ERUZBVUxUX1RJTUVPVVQKaW1wb3J0IHRpbWUKCmZyb20gLi5leGNlcHRpb25zIGltcG9ydCBUaW1lb3V0U3RhdGVFcnJvcgoKIyBBIHNlbnRpbmVsIHZhbHVlIHRvIGluZGljYXRlIHRoYXQgbm8gdGltZW91dCB3YXMgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyIGluCiMgdXJsbGliMwpfRGVmYXVsdCA9IG9iamVjdCgpCgoKIyBVc2UgdGltZS5tb25vdG9uaWMgaWYgYXZhaWxhYmxlLgpjdXJyZW50X3RpbWUgPSBnZXRhdHRyKHRpbWUsICJtb25vdG9uaWMiLCB0aW1lLnRpbWUpCgoKY2xhc3MgVGltZW91dChvYmplY3QpOgogICAgIiIiIFRpbWVvdXQgY29uZmlndXJhdGlvbi4KCiAgICBUaW1lb3V0cyBjYW4gYmUgZGVmaW5lZCBhcyBhIGRlZmF1bHQgZm9yIGEgcG9vbDo6CgogICAgICAgIHRpbWVvdXQgPSBUaW1lb3V0KGNvbm5lY3Q9Mi4wLCByZWFkPTcuMCkKICAgICAgICBodHRwID0gUG9vbE1hbmFnZXIodGltZW91dD10aW1lb3V0KQogICAgICAgIHJlc3BvbnNlID0gaHR0cC5yZXF1ZXN0KCdHRVQnLCAnaHR0cDovL2V4YW1wbGUuY29tLycpCgogICAgT3IgcGVyLXJlcXVlc3QgKHdoaWNoIG92ZXJyaWRlcyB0aGUgZGVmYXVsdCBmb3IgdGhlIHBvb2wpOjoKCiAgICAgICAgcmVzcG9uc2UgPSBodHRwLnJlcXVlc3QoJ0dFVCcsICdodHRwOi8vZXhhbXBsZS5jb20vJywgdGltZW91dD1UaW1lb3V0KDEwKSkKCiAgICBUaW1lb3V0cyBjYW4gYmUgZGlzYWJsZWQgYnkgc2V0dGluZyBhbGwgdGhlIHBhcmFtZXRlcnMgdG8gYGBOb25lYGA6OgoKICAgICAgICBub190aW1lb3V0ID0gVGltZW91dChjb25uZWN0PU5vbmUsIHJlYWQ9Tm9uZSkKICAgICAgICByZXNwb25zZSA9IGh0dHAucmVxdWVzdCgnR0VUJywgJ2h0dHA6Ly9leGFtcGxlLmNvbS8sIHRpbWVvdXQ9bm9fdGltZW91dCkKCgogICAgOnBhcmFtIHRvdGFsOgogICAgICAgIFRoaXMgY29tYmluZXMgdGhlIGNvbm5lY3QgYW5kIHJlYWQgdGltZW91dHMgaW50byBvbmU7IHRoZSByZWFkIHRpbWVvdXQKICAgICAgICB3aWxsIGJlIHNldCB0byB0aGUgdGltZSBsZWZ0b3ZlciBmcm9tIHRoZSBjb25uZWN0IGF0dGVtcHQuIEluIHRoZQogICAgICAgIGV2ZW50IHRoYXQgYm90aCBhIGNvbm5lY3QgdGltZW91dCBhbmQgYSB0b3RhbCBhcmUgc3BlY2lmaWVkLCBvciBhIHJlYWQKICAgICAgICB0aW1lb3V0IGFuZCBhIHRvdGFsIGFyZSBzcGVjaWZpZWQsIHRoZSBzaG9ydGVyIHRpbWVvdXQgd2lsbCBiZSBhcHBsaWVkLgoKICAgICAgICBEZWZhdWx0cyB0byBOb25lLgoKICAgIDp0eXBlIHRvdGFsOiBpbnRlZ2VyLCBmbG9hdCwgb3IgTm9uZQoKICAgIDpwYXJhbSBjb25uZWN0OgogICAgICAgIFRoZSBtYXhpbXVtIGFtb3VudCBvZiB0aW1lIHRvIHdhaXQgZm9yIGEgY29ubmVjdGlvbiBhdHRlbXB0IHRvIGEgc2VydmVyCiAgICAgICAgdG8gc3VjY2VlZC4gT21pdHRpbmcgdGhlIHBhcmFtZXRlciB3aWxsIGRlZmF1bHQgdGhlIGNvbm5lY3QgdGltZW91dCB0bwogICAgICAgIHRoZSBzeXN0ZW0gZGVmYXVsdCwgcHJvYmFibHkgYHRoZSBnbG9iYWwgZGVmYXVsdCB0aW1lb3V0IGluIHNvY2tldC5weQogICAgICAgIDxodHRwOi8vaGcucHl0aG9uLm9yZy9jcHl0aG9uL2ZpbGUvNjAzYjRkNTkzNzU4L0xpYi9zb2NrZXQucHkjbDUzNT5gXy4KICAgICAgICBOb25lIHdpbGwgc2V0IGFuIGluZmluaXRlIHRpbWVvdXQgZm9yIGNvbm5lY3Rpb24gYXR0ZW1wdHMuCgogICAgOnR5cGUgY29ubmVjdDogaW50ZWdlciwgZmxvYXQsIG9yIE5vbmUKCiAgICA6cGFyYW0gcmVhZDoKICAgICAgICBUaGUgbWF4aW11bSBhbW91bnQgb2YgdGltZSB0byB3YWl0IGJldHdlZW4gY29uc2VjdXRpdmUKICAgICAgICByZWFkIG9wZXJhdGlvbnMgZm9yIGEgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyLiBPbWl0dGluZwogICAgICAgIHRoZSBwYXJhbWV0ZXIgd2lsbCBkZWZhdWx0IHRoZSByZWFkIHRpbWVvdXQgdG8gdGhlIHN5c3RlbQogICAgICAgIGRlZmF1bHQsIHByb2JhYmx5IGB0aGUgZ2xvYmFsIGRlZmF1bHQgdGltZW91dCBpbiBzb2NrZXQucHkKICAgICAgICA8aHR0cDovL2hnLnB5dGhvbi5vcmcvY3B5dGhvbi9maWxlLzYwM2I0ZDU5Mzc1OC9MaWIvc29ja2V0LnB5I2w1MzU+YF8uCiAgICAgICAgTm9uZSB3aWxsIHNldCBhbiBpbmZpbml0ZSB0aW1lb3V0LgoKICAgIDp0eXBlIHJlYWQ6IGludGVnZXIsIGZsb2F0LCBvciBOb25lCgogICAgLi4gbm90ZTo6CgogICAgICAgIE1hbnkgZmFjdG9ycyBjYW4gYWZmZWN0IHRoZSB0b3RhbCBhbW91bnQgb2YgdGltZSBmb3IgdXJsbGliMyB0byByZXR1cm4KICAgICAgICBhbiBIVFRQIHJlc3BvbnNlLgoKICAgICAgICBGb3IgZXhhbXBsZSwgUHl0aG9uJ3MgRE5TIHJlc29sdmVyIGRvZXMgbm90IG9iZXkgdGhlIHRpbWVvdXQgc3BlY2lmaWVkCiAgICAgICAgb24gdGhlIHNvY2tldC4gT3RoZXIgZmFjdG9ycyB0aGF0IGNhbiBhZmZlY3QgdG90YWwgcmVxdWVzdCB0aW1lIGluY2x1ZGUKICAgICAgICBoaWdoIENQVSBsb2FkLCBoaWdoIHN3YXAsIHRoZSBwcm9ncmFtIHJ1bm5pbmcgYXQgYSBsb3cgcHJpb3JpdHkgbGV2ZWwsCiAgICAgICAgb3Igb3RoZXIgYmVoYXZpb3JzLgoKICAgICAgICBJbiBhZGRpdGlvbiwgdGhlIHJlYWQgYW5kIHRvdGFsIHRpbWVvdXRzIG9ubHkgbWVhc3VyZSB0aGUgdGltZSBiZXR3ZWVuCiAgICAgICAgcmVhZCBvcGVyYXRpb25zIG9uIHRoZSBzb2NrZXQgY29ubmVjdGluZyB0aGUgY2xpZW50IGFuZCB0aGUgc2VydmVyLAogICAgICAgIG5vdCB0aGUgdG90YWwgYW1vdW50IG9mIHRpbWUgZm9yIHRoZSByZXF1ZXN0IHRvIHJldHVybiBhIGNvbXBsZXRlCiAgICAgICAgcmVzcG9uc2UuIEZvciBtb3N0IHJlcXVlc3RzLCB0aGUgdGltZW91dCBpcyByYWlzZWQgYmVjYXVzZSB0aGUgc2VydmVyCiAgICAgICAgaGFzIG5vdCBzZW50IHRoZSBmaXJzdCBieXRlIGluIHRoZSBzcGVjaWZpZWQgdGltZS4gVGhpcyBpcyBub3QgYWx3YXlzCiAgICAgICAgdGhlIGNhc2U7IGlmIGEgc2VydmVyIHN0cmVhbXMgb25lIGJ5dGUgZXZlcnkgZmlmdGVlbiBzZWNvbmRzLCBhIHRpbWVvdXQKICAgICAgICBvZiAyMCBzZWNvbmRzIHdpbGwgbm90IHRyaWdnZXIsIGV2ZW4gdGhvdWdoIHRoZSByZXF1ZXN0IHdpbGwgdGFrZQogICAgICAgIHNldmVyYWwgbWludXRlcyB0byBjb21wbGV0ZS4KCiAgICAgICAgSWYgeW91ciBnb2FsIGlzIHRvIGN1dCBvZmYgYW55IHJlcXVlc3QgYWZ0ZXIgYSBzZXQgYW1vdW50IG9mIHdhbGwgY2xvY2sKICAgICAgICB0aW1lLCBjb25zaWRlciBoYXZpbmcgYSBzZWNvbmQgIndhdGNoZXIiIHRocmVhZCB0byBjdXQgb2ZmIGEgc2xvdwogICAgICAgIHJlcXVlc3QuCiAgICAiIiIKCiAgICAjOiBBIHNlbnRpbmVsIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGRlZmF1bHQgdGltZW91dCB2YWx1ZQogICAgREVGQVVMVF9USU1FT1VUID0gX0dMT0JBTF9ERUZBVUxUX1RJTUVPVVQKCiAgICBkZWYgX19pbml0X18oc2VsZiwgdG90YWw9Tm9uZSwgY29ubmVjdD1fRGVmYXVsdCwgcmVhZD1fRGVmYXVsdCk6CiAgICAgICAgc2VsZi5fY29ubmVjdCA9IHNlbGYuX3ZhbGlkYXRlX3RpbWVvdXQoY29ubmVjdCwgJ2Nvbm5lY3QnKQogICAgICAgIHNlbGYuX3JlYWQgPSBzZWxmLl92YWxpZGF0ZV90aW1lb3V0KHJlYWQsICdyZWFkJykKICAgICAgICBzZWxmLnRvdGFsID0gc2VsZi5fdmFsaWRhdGVfdGltZW91dCh0b3RhbCwgJ3RvdGFsJykKICAgICAgICBzZWxmLl9zdGFydF9jb25uZWN0ID0gTm9uZQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJldHVybiAnJXMoY29ubmVjdD0lciwgcmVhZD0lciwgdG90YWw9JXIpJyAlICgKICAgICAgICAgICAgdHlwZShzZWxmKS5fX25hbWVfXywgc2VsZi5fY29ubmVjdCwgc2VsZi5fcmVhZCwgc2VsZi50b3RhbCkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfdmFsaWRhdGVfdGltZW91dChjbHMsIHZhbHVlLCBuYW1lKToKICAgICAgICAiIiIgQ2hlY2sgdGhhdCBhIHRpbWVvdXQgYXR0cmlidXRlIGlzIHZhbGlkLgoKICAgICAgICA6cGFyYW0gdmFsdWU6IFRoZSB0aW1lb3V0IHZhbHVlIHRvIHZhbGlkYXRlCiAgICAgICAgOnBhcmFtIG5hbWU6IFRoZSBuYW1lIG9mIHRoZSB0aW1lb3V0IGF0dHJpYnV0ZSB0byB2YWxpZGF0ZS4gVGhpcyBpcwogICAgICAgICAgICB1c2VkIHRvIHNwZWNpZnkgaW4gZXJyb3IgbWVzc2FnZXMuCiAgICAgICAgOnJldHVybjogVGhlIHZhbGlkYXRlZCBhbmQgY2FzdGVkIHZlcnNpb24gb2YgdGhlIGdpdmVuIHZhbHVlLgogICAgICAgIDpyYWlzZXMgVmFsdWVFcnJvcjogSWYgaXQgaXMgYSBudW1lcmljIHZhbHVlIGxlc3MgdGhhbiBvciBlcXVhbCB0bwogICAgICAgICAgICB6ZXJvLCBvciB0aGUgdHlwZSBpcyBub3QgYW4gaW50ZWdlciwgZmxvYXQsIG9yIE5vbmUuCiAgICAgICAgIiIiCiAgICAgICAgaWYgdmFsdWUgaXMgX0RlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiBjbHMuREVGQVVMVF9USU1FT1VUCgogICAgICAgIGlmIHZhbHVlIGlzIE5vbmUgb3IgdmFsdWUgaXMgY2xzLkRFRkFVTFRfVElNRU9VVDoKICAgICAgICAgICAgcmV0dXJuIHZhbHVlCgogICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIGJvb2wpOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJUaW1lb3V0IGNhbm5vdCBiZSBhIGJvb2xlYW4gdmFsdWUuIEl0IG11c3QgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZSBhbiBpbnQsIGZsb2F0IG9yIE5vbmUuIikKICAgICAgICB0cnk6CiAgICAgICAgICAgIGZsb2F0KHZhbHVlKQogICAgICAgIGV4Y2VwdCAoVHlwZUVycm9yLCBWYWx1ZUVycm9yKToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiVGltZW91dCB2YWx1ZSAlcyB3YXMgJXMsIGJ1dCBpdCBtdXN0IGJlIGFuICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50LCBmbG9hdCBvciBOb25lLiIgJSAobmFtZSwgdmFsdWUpKQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGlmIHZhbHVlIDw9IDA6CiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJBdHRlbXB0ZWQgdG8gc2V0ICVzIHRpbWVvdXQgdG8gJXMsIGJ1dCB0aGUgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGltZW91dCBjYW5ub3QgYmUgc2V0IHRvIGEgdmFsdWUgbGVzcyAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGFuIG9yIGVxdWFsIHRvIDAuIiAlIChuYW1lLCB2YWx1ZSkpCiAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjogICMgUHl0aG9uIDMKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiVGltZW91dCB2YWx1ZSAlcyB3YXMgJXMsIGJ1dCBpdCBtdXN0IGJlIGFuICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50LCBmbG9hdCBvciBOb25lLiIgJSAobmFtZSwgdmFsdWUpKQoKICAgICAgICByZXR1cm4gdmFsdWUKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBmcm9tX2Zsb2F0KGNscywgdGltZW91dCk6CiAgICAgICAgIiIiIENyZWF0ZSBhIG5ldyBUaW1lb3V0IGZyb20gYSBsZWdhY3kgdGltZW91dCB2YWx1ZS4KCiAgICAgICAgVGhlIHRpbWVvdXQgdmFsdWUgdXNlZCBieSBodHRwbGliLnB5IHNldHMgdGhlIHNhbWUgdGltZW91dCBvbiB0aGUKICAgICAgICBjb25uZWN0KCksIGFuZCByZWN2KCkgc29ja2V0IHJlcXVlc3RzLiBUaGlzIGNyZWF0ZXMgYSA6Y2xhc3M6YFRpbWVvdXRgCiAgICAgICAgb2JqZWN0IHRoYXQgc2V0cyB0aGUgaW5kaXZpZHVhbCB0aW1lb3V0cyB0byB0aGUgYGB0aW1lb3V0YGAgdmFsdWUKICAgICAgICBwYXNzZWQgdG8gdGhpcyBmdW5jdGlvbi4KCiAgICAgICAgOnBhcmFtIHRpbWVvdXQ6IFRoZSBsZWdhY3kgdGltZW91dCB2YWx1ZS4KICAgICAgICA6dHlwZSB0aW1lb3V0OiBpbnRlZ2VyLCBmbG9hdCwgc2VudGluZWwgZGVmYXVsdCBvYmplY3QsIG9yIE5vbmUKICAgICAgICA6cmV0dXJuOiBUaW1lb3V0IG9iamVjdAogICAgICAgIDpydHlwZTogOmNsYXNzOmBUaW1lb3V0YAogICAgICAgICIiIgogICAgICAgIHJldHVybiBUaW1lb3V0KHJlYWQ9dGltZW91dCwgY29ubmVjdD10aW1lb3V0KQoKICAgIGRlZiBjbG9uZShzZWxmKToKICAgICAgICAiIiIgQ3JlYXRlIGEgY29weSBvZiB0aGUgdGltZW91dCBvYmplY3QKCiAgICAgICAgVGltZW91dCBwcm9wZXJ0aWVzIGFyZSBzdG9yZWQgcGVyLXBvb2wgYnV0IGVhY2ggcmVxdWVzdCBuZWVkcyBhIGZyZXNoCiAgICAgICAgVGltZW91dCBvYmplY3QgdG8gZW5zdXJlIGVhY2ggb25lIGhhcyBpdHMgb3duIHN0YXJ0L3N0b3AgY29uZmlndXJlZC4KCiAgICAgICAgOnJldHVybjogYSBjb3B5IG9mIHRoZSB0aW1lb3V0IG9iamVjdAogICAgICAgIDpydHlwZTogOmNsYXNzOmBUaW1lb3V0YAogICAgICAgICIiIgogICAgICAgICMgV2UgY2FuJ3QgdXNlIGNvcHkuZGVlcGNvcHkgYmVjYXVzZSB0aGF0IHdpbGwgYWxzbyBjcmVhdGUgYSBuZXcgb2JqZWN0CiAgICAgICAgIyBmb3IgX0dMT0JBTF9ERUZBVUxUX1RJTUVPVVQsIHdoaWNoIHNvY2tldC5weSB1c2VzIGFzIGEgc2VudGluZWwgdG8KICAgICAgICAjIGRldGVjdCB0aGUgdXNlciBkZWZhdWx0LgogICAgICAgIHJldHVybiBUaW1lb3V0KGNvbm5lY3Q9c2VsZi5fY29ubmVjdCwgcmVhZD1zZWxmLl9yZWFkLAogICAgICAgICAgICAgICAgICAgICAgIHRvdGFsPXNlbGYudG90YWwpCgogICAgZGVmIHN0YXJ0X2Nvbm5lY3Qoc2VsZik6CiAgICAgICAgIiIiIFN0YXJ0IHRoZSB0aW1lb3V0IGNsb2NrLCB1c2VkIGR1cmluZyBhIGNvbm5lY3QoKSBhdHRlbXB0CgogICAgICAgIDpyYWlzZXMgdXJsbGliMy5leGNlcHRpb25zLlRpbWVvdXRTdGF0ZUVycm9yOiBpZiB5b3UgYXR0ZW1wdAogICAgICAgICAgICB0byBzdGFydCBhIHRpbWVyIHRoYXQgaGFzIGJlZW4gc3RhcnRlZCBhbHJlYWR5LgogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYuX3N0YXJ0X2Nvbm5lY3QgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJhaXNlIFRpbWVvdXRTdGF0ZUVycm9yKCJUaW1lb3V0IHRpbWVyIGhhcyBhbHJlYWR5IGJlZW4gc3RhcnRlZC4iKQogICAgICAgIHNlbGYuX3N0YXJ0X2Nvbm5lY3QgPSBjdXJyZW50X3RpbWUoKQogICAgICAgIHJldHVybiBzZWxmLl9zdGFydF9jb25uZWN0CgogICAgZGVmIGdldF9jb25uZWN0X2R1cmF0aW9uKHNlbGYpOgogICAgICAgICIiIiBHZXRzIHRoZSB0aW1lIGVsYXBzZWQgc2luY2UgdGhlIGNhbGwgdG8gOm1ldGg6YHN0YXJ0X2Nvbm5lY3RgLgoKICAgICAgICA6cmV0dXJuOiBFbGFwc2VkIHRpbWUuCiAgICAgICAgOnJ0eXBlOiBmbG9hdAogICAgICAgIDpyYWlzZXMgdXJsbGliMy5leGNlcHRpb25zLlRpbWVvdXRTdGF0ZUVycm9yOiBpZiB5b3UgYXR0ZW1wdAogICAgICAgICAgICB0byBnZXQgZHVyYXRpb24gZm9yIGEgdGltZXIgdGhhdCBoYXNuJ3QgYmVlbiBzdGFydGVkLgogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYuX3N0YXJ0X2Nvbm5lY3QgaXMgTm9uZToKICAgICAgICAgICAgcmFpc2UgVGltZW91dFN0YXRlRXJyb3IoIkNhbid0IGdldCBjb25uZWN0IGR1cmF0aW9uIGZvciB0aW1lciAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGF0IGhhcyBub3Qgc3RhcnRlZC4iKQogICAgICAgIHJldHVybiBjdXJyZW50X3RpbWUoKSAtIHNlbGYuX3N0YXJ0X2Nvbm5lY3QKCiAgICBAcHJvcGVydHkKICAgIGRlZiBjb25uZWN0X3RpbWVvdXQoc2VsZik6CiAgICAgICAgIiIiIEdldCB0aGUgdmFsdWUgdG8gdXNlIHdoZW4gc2V0dGluZyBhIGNvbm5lY3Rpb24gdGltZW91dC4KCiAgICAgICAgVGhpcyB3aWxsIGJlIGEgcG9zaXRpdmUgZmxvYXQgb3IgaW50ZWdlciwgdGhlIHZhbHVlIE5vbmUKICAgICAgICAobmV2ZXIgdGltZW91dCksIG9yIHRoZSBkZWZhdWx0IHN5c3RlbSB0aW1lb3V0LgoKICAgICAgICA6cmV0dXJuOiBDb25uZWN0IHRpbWVvdXQuCiAgICAgICAgOnJ0eXBlOiBpbnQsIGZsb2F0LCA6YXR0cjpgVGltZW91dC5ERUZBVUxUX1RJTUVPVVRgIG9yIE5vbmUKICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLnRvdGFsIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9jb25uZWN0CgogICAgICAgIGlmIHNlbGYuX2Nvbm5lY3QgaXMgTm9uZSBvciBzZWxmLl9jb25uZWN0IGlzIHNlbGYuREVGQVVMVF9USU1FT1VUOgogICAgICAgICAgICByZXR1cm4gc2VsZi50b3RhbAoKICAgICAgICByZXR1cm4gbWluKHNlbGYuX2Nvbm5lY3QsIHNlbGYudG90YWwpCgogICAgQHByb3BlcnR5CiAgICBkZWYgcmVhZF90aW1lb3V0KHNlbGYpOgogICAgICAgICIiIiBHZXQgdGhlIHZhbHVlIGZvciB0aGUgcmVhZCB0aW1lb3V0LgoKICAgICAgICBUaGlzIGFzc3VtZXMgc29tZSB0aW1lIGhhcyBlbGFwc2VkIGluIHRoZSBjb25uZWN0aW9uIHRpbWVvdXQgYW5kCiAgICAgICAgY29tcHV0ZXMgdGhlIHJlYWQgdGltZW91dCBhcHByb3ByaWF0ZWx5LgoKICAgICAgICBJZiBzZWxmLnRvdGFsIGlzIHNldCwgdGhlIHJlYWQgdGltZW91dCBpcyBkZXBlbmRlbnQgb24gdGhlIGFtb3VudCBvZgogICAgICAgIHRpbWUgdGFrZW4gYnkgdGhlIGNvbm5lY3QgdGltZW91dC4gSWYgdGhlIGNvbm5lY3Rpb24gdGltZSBoYXMgbm90IGJlZW4KICAgICAgICBlc3RhYmxpc2hlZCwgYSA6ZXhjOmB+dXJsbGliMy5leGNlcHRpb25zLlRpbWVvdXRTdGF0ZUVycm9yYCB3aWxsIGJlCiAgICAgICAgcmFpc2VkLgoKICAgICAgICA6cmV0dXJuOiBWYWx1ZSB0byB1c2UgZm9yIHRoZSByZWFkIHRpbWVvdXQuCiAgICAgICAgOnJ0eXBlOiBpbnQsIGZsb2F0LCA6YXR0cjpgVGltZW91dC5ERUZBVUxUX1RJTUVPVVRgIG9yIE5vbmUKICAgICAgICA6cmFpc2VzIHVybGxpYjMuZXhjZXB0aW9ucy5UaW1lb3V0U3RhdGVFcnJvcjogSWYgOm1ldGg6YHN0YXJ0X2Nvbm5lY3RgCiAgICAgICAgICAgIGhhcyBub3QgeWV0IGJlZW4gY2FsbGVkIG9uIHRoaXMgb2JqZWN0LgogICAgICAgICIiIgogICAgICAgIGlmIChzZWxmLnRvdGFsIGlzIG5vdCBOb25lIGFuZAogICAgICAgICAgICAgICAgc2VsZi50b3RhbCBpcyBub3Qgc2VsZi5ERUZBVUxUX1RJTUVPVVQgYW5kCiAgICAgICAgICAgICAgICBzZWxmLl9yZWFkIGlzIG5vdCBOb25lIGFuZAogICAgICAgICAgICAgICAgc2VsZi5fcmVhZCBpcyBub3Qgc2VsZi5ERUZBVUxUX1RJTUVPVVQpOgogICAgICAgICAgICAjIEluIGNhc2UgdGhlIGNvbm5lY3QgdGltZW91dCBoYXMgbm90IHlldCBiZWVuIGVzdGFibGlzaGVkLgogICAgICAgICAgICBpZiBzZWxmLl9zdGFydF9jb25uZWN0IGlzIE5vbmU6CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fcmVhZAogICAgICAgICAgICByZXR1cm4gbWF4KDAsIG1pbihzZWxmLnRvdGFsIC0gc2VsZi5nZXRfY29ubmVjdF9kdXJhdGlvbigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9yZWFkKSkKICAgICAgICBlbGlmIHNlbGYudG90YWwgaXMgbm90IE5vbmUgYW5kIHNlbGYudG90YWwgaXMgbm90IHNlbGYuREVGQVVMVF9USU1FT1VUOgogICAgICAgICAgICByZXR1cm4gbWF4KDAsIHNlbGYudG90YWwgLSBzZWxmLmdldF9jb25uZWN0X2R1cmF0aW9uKCkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3JlYWQKUEsDBBQAAAAAAAAAIQDDHm0RVxkAAFcZAAA8AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL3V0aWwvdXJsLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgbmFtZWR0dXBsZQoKZnJvbSAuLmV4Y2VwdGlvbnMgaW1wb3J0IExvY2F0aW9uUGFyc2VFcnJvcgoKCnVybF9hdHRycyA9IFsnc2NoZW1lJywgJ2F1dGgnLCAnaG9zdCcsICdwb3J0JywgJ3BhdGgnLCAncXVlcnknLCAnZnJhZ21lbnQnXQoKIyBXZSBvbmx5IHdhbnQgdG8gbm9ybWFsaXplIHVybHMgd2l0aCBhbiBIVFRQKFMpIHNjaGVtZS4KIyB1cmxsaWIzIGluZmVycyBVUkxzIHdpdGhvdXQgYSBzY2hlbWUgKE5vbmUpIHRvIGJlIGh0dHAuCk5PUk1BTElaQUJMRV9TQ0hFTUVTID0gKCdodHRwJywgJ2h0dHBzJywgTm9uZSkKCgpjbGFzcyBVcmwobmFtZWR0dXBsZSgnVXJsJywgdXJsX2F0dHJzKSk6CiAgICAiIiIKICAgIERhdGFzdHJ1Y3R1cmUgZm9yIHJlcHJlc2VudGluZyBhbiBIVFRQIFVSTC4gVXNlZCBhcyBhIHJldHVybiB2YWx1ZSBmb3IKICAgIDpmdW5jOmBwYXJzZV91cmxgLiBCb3RoIHRoZSBzY2hlbWUgYW5kIGhvc3QgYXJlIG5vcm1hbGl6ZWQgYXMgdGhleSBhcmUKICAgIGJvdGggY2FzZS1pbnNlbnNpdGl2ZSBhY2NvcmRpbmcgdG8gUkZDIDM5ODYuCiAgICAiIiIKICAgIF9fc2xvdHNfXyA9ICgpCgogICAgZGVmIF9fbmV3X18oY2xzLCBzY2hlbWU9Tm9uZSwgYXV0aD1Ob25lLCBob3N0PU5vbmUsIHBvcnQ9Tm9uZSwgcGF0aD1Ob25lLAogICAgICAgICAgICAgICAgcXVlcnk9Tm9uZSwgZnJhZ21lbnQ9Tm9uZSk6CiAgICAgICAgaWYgcGF0aCBhbmQgbm90IHBhdGguc3RhcnRzd2l0aCgnLycpOgogICAgICAgICAgICBwYXRoID0gJy8nICsgcGF0aAogICAgICAgIGlmIHNjaGVtZToKICAgICAgICAgICAgc2NoZW1lID0gc2NoZW1lLmxvd2VyKCkKICAgICAgICBpZiBob3N0IGFuZCBzY2hlbWUgaW4gTk9STUFMSVpBQkxFX1NDSEVNRVM6CiAgICAgICAgICAgIGhvc3QgPSBob3N0Lmxvd2VyKCkKICAgICAgICByZXR1cm4gc3VwZXIoVXJsLCBjbHMpLl9fbmV3X18oY2xzLCBzY2hlbWUsIGF1dGgsIGhvc3QsIHBvcnQsIHBhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5LCBmcmFnbWVudCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBob3N0bmFtZShzZWxmKToKICAgICAgICAiIiJGb3IgYmFja3dhcmRzLWNvbXBhdGliaWxpdHkgd2l0aCB1cmxwYXJzZS4gV2UncmUgbmljZSBsaWtlIHRoYXQuIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuaG9zdAoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHJlcXVlc3RfdXJpKHNlbGYpOgogICAgICAgICIiIkFic29sdXRlIHBhdGggaW5jbHVkaW5nIHRoZSBxdWVyeSBzdHJpbmcuIiIiCiAgICAgICAgdXJpID0gc2VsZi5wYXRoIG9yICcvJwoKICAgICAgICBpZiBzZWxmLnF1ZXJ5IGlzIG5vdCBOb25lOgogICAgICAgICAgICB1cmkgKz0gJz8nICsgc2VsZi5xdWVyeQoKICAgICAgICByZXR1cm4gdXJpCgogICAgQHByb3BlcnR5CiAgICBkZWYgbmV0bG9jKHNlbGYpOgogICAgICAgICIiIk5ldHdvcmsgbG9jYXRpb24gaW5jbHVkaW5nIGhvc3QgYW5kIHBvcnQiIiIKICAgICAgICBpZiBzZWxmLnBvcnQ6CiAgICAgICAgICAgIHJldHVybiAnJXM6JWQnICUgKHNlbGYuaG9zdCwgc2VsZi5wb3J0KQogICAgICAgIHJldHVybiBzZWxmLmhvc3QKCiAgICBAcHJvcGVydHkKICAgIGRlZiB1cmwoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgQ29udmVydCBzZWxmIGludG8gYSB1cmwKCiAgICAgICAgVGhpcyBmdW5jdGlvbiBzaG91bGQgbW9yZSBvciBsZXNzIHJvdW5kLXRyaXAgd2l0aCA6ZnVuYzpgLnBhcnNlX3VybGAuIFRoZQogICAgICAgIHJldHVybmVkIHVybCBtYXkgbm90IGJlIGV4YWN0bHkgdGhlIHNhbWUgYXMgdGhlIHVybCBpbnB1dHRlZCB0bwogICAgICAgIDpmdW5jOmAucGFyc2VfdXJsYCwgYnV0IGl0IHNob3VsZCBiZSBlcXVpdmFsZW50IGJ5IHRoZSBSRkMgKGUuZy4sIHVybHMKICAgICAgICB3aXRoIGEgYmxhbmsgcG9ydCB3aWxsIGhhdmUgOiByZW1vdmVkKS4KCiAgICAgICAgRXhhbXBsZTogOjoKCiAgICAgICAgICAgID4+PiBVID0gcGFyc2VfdXJsKCdodHRwOi8vZ29vZ2xlLmNvbS9tYWlsLycpCiAgICAgICAgICAgID4+PiBVLnVybAogICAgICAgICAgICAnaHR0cDovL2dvb2dsZS5jb20vbWFpbC8nCiAgICAgICAgICAgID4+PiBVcmwoJ2h0dHAnLCAndXNlcm5hbWU6cGFzc3dvcmQnLCAnaG9zdC5jb20nLCA4MCwKICAgICAgICAgICAgLi4uICcvcGF0aCcsICdxdWVyeScsICdmcmFnbWVudCcpLnVybAogICAgICAgICAgICAnaHR0cDovL3VzZXJuYW1lOnBhc3N3b3JkQGhvc3QuY29tOjgwL3BhdGg/cXVlcnkjZnJhZ21lbnQnCiAgICAgICAgIiIiCiAgICAgICAgc2NoZW1lLCBhdXRoLCBob3N0LCBwb3J0LCBwYXRoLCBxdWVyeSwgZnJhZ21lbnQgPSBzZWxmCiAgICAgICAgdXJsID0gJycKCiAgICAgICAgIyBXZSB1c2UgImlzIG5vdCBOb25lIiB3ZSB3YW50IHRoaW5ncyB0byBoYXBwZW4gd2l0aCBlbXB0eSBzdHJpbmdzIChvciAwIHBvcnQpCiAgICAgICAgaWYgc2NoZW1lIGlzIG5vdCBOb25lOgogICAgICAgICAgICB1cmwgKz0gc2NoZW1lICsgJzovLycKICAgICAgICBpZiBhdXRoIGlzIG5vdCBOb25lOgogICAgICAgICAgICB1cmwgKz0gYXV0aCArICdAJwogICAgICAgIGlmIGhvc3QgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHVybCArPSBob3N0CiAgICAgICAgaWYgcG9ydCBpcyBub3QgTm9uZToKICAgICAgICAgICAgdXJsICs9ICc6JyArIHN0cihwb3J0KQogICAgICAgIGlmIHBhdGggaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHVybCArPSBwYXRoCiAgICAgICAgaWYgcXVlcnkgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHVybCArPSAnPycgKyBxdWVyeQogICAgICAgIGlmIGZyYWdtZW50IGlzIG5vdCBOb25lOgogICAgICAgICAgICB1cmwgKz0gJyMnICsgZnJhZ21lbnQKCiAgICAgICAgcmV0dXJuIHVybAoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLnVybAoKCmRlZiBzcGxpdF9maXJzdChzLCBkZWxpbXMpOgogICAgIiIiCiAgICBHaXZlbiBhIHN0cmluZyBhbmQgYW4gaXRlcmFibGUgb2YgZGVsaW1pdGVycywgc3BsaXQgb24gdGhlIGZpcnN0IGZvdW5kCiAgICBkZWxpbWl0ZXIuIFJldHVybiB0d28gc3BsaXQgcGFydHMgYW5kIHRoZSBtYXRjaGVkIGRlbGltaXRlci4KCiAgICBJZiBub3QgZm91bmQsIHRoZW4gdGhlIGZpcnN0IHBhcnQgaXMgdGhlIGZ1bGwgaW5wdXQgc3RyaW5nLgoKICAgIEV4YW1wbGU6OgoKICAgICAgICA+Pj4gc3BsaXRfZmlyc3QoJ2Zvby9iYXI/YmF6JywgJz8vPScpCiAgICAgICAgKCdmb28nLCAnYmFyP2JheicsICcvJykKICAgICAgICA+Pj4gc3BsaXRfZmlyc3QoJ2Zvby9iYXI/YmF6JywgJzEyMycpCiAgICAgICAgKCdmb28vYmFyP2JheicsICcnLCBOb25lKQoKICAgIFNjYWxlcyBsaW5lYXJseSB3aXRoIG51bWJlciBvZiBkZWxpbXMuIE5vdCBpZGVhbCBmb3IgbGFyZ2UgbnVtYmVyIG9mIGRlbGltcy4KICAgICIiIgogICAgbWluX2lkeCA9IE5vbmUKICAgIG1pbl9kZWxpbSA9IE5vbmUKICAgIGZvciBkIGluIGRlbGltczoKICAgICAgICBpZHggPSBzLmZpbmQoZCkKICAgICAgICBpZiBpZHggPCAwOgogICAgICAgICAgICBjb250aW51ZQoKICAgICAgICBpZiBtaW5faWR4IGlzIE5vbmUgb3IgaWR4IDwgbWluX2lkeDoKICAgICAgICAgICAgbWluX2lkeCA9IGlkeAogICAgICAgICAgICBtaW5fZGVsaW0gPSBkCgogICAgaWYgbWluX2lkeCBpcyBOb25lIG9yIG1pbl9pZHggPCAwOgogICAgICAgIHJldHVybiBzLCAnJywgTm9uZQoKICAgIHJldHVybiBzWzptaW5faWR4XSwgc1ttaW5faWR4ICsgMTpdLCBtaW5fZGVsaW0KCgpkZWYgcGFyc2VfdXJsKHVybCk6CiAgICAiIiIKICAgIEdpdmVuIGEgdXJsLCByZXR1cm4gYSBwYXJzZWQgOmNsYXNzOmAuVXJsYCBuYW1lZHR1cGxlLiBCZXN0LWVmZm9ydCBpcwogICAgcGVyZm9ybWVkIHRvIHBhcnNlIGluY29tcGxldGUgdXJscy4gRmllbGRzIG5vdCBwcm92aWRlZCB3aWxsIGJlIE5vbmUuCgogICAgUGFydGx5IGJhY2t3YXJkcy1jb21wYXRpYmxlIHdpdGggOm1vZDpgdXJscGFyc2VgLgoKICAgIEV4YW1wbGU6OgoKICAgICAgICA+Pj4gcGFyc2VfdXJsKCdodHRwOi8vZ29vZ2xlLmNvbS9tYWlsLycpCiAgICAgICAgVXJsKHNjaGVtZT0naHR0cCcsIGhvc3Q9J2dvb2dsZS5jb20nLCBwb3J0PU5vbmUsIHBhdGg9Jy9tYWlsLycsIC4uLikKICAgICAgICA+Pj4gcGFyc2VfdXJsKCdnb29nbGUuY29tOjgwJykKICAgICAgICBVcmwoc2NoZW1lPU5vbmUsIGhvc3Q9J2dvb2dsZS5jb20nLCBwb3J0PTgwLCBwYXRoPU5vbmUsIC4uLikKICAgICAgICA+Pj4gcGFyc2VfdXJsKCcvZm9vP2JhcicpCiAgICAgICAgVXJsKHNjaGVtZT1Ob25lLCBob3N0PU5vbmUsIHBvcnQ9Tm9uZSwgcGF0aD0nL2ZvbycsIHF1ZXJ5PSdiYXInLCAuLi4pCiAgICAiIiIKCiAgICAjIFdoaWxlIHRoaXMgY29kZSBoYXMgb3ZlcmxhcCB3aXRoIHN0ZGxpYidzIHVybHBhcnNlLCBpdCBpcyBtdWNoCiAgICAjIHNpbXBsaWZpZWQgZm9yIG91ciBuZWVkcyBhbmQgbGVzcyBhbm5veWluZy4KICAgICMgQWRkaXRpb25hbGx5LCB0aGlzIGltcGxlbWVudGF0aW9ucyBkb2VzIHNpbGx5IHRoaW5ncyB0byBiZSBvcHRpbWFsCiAgICAjIG9uIENQeXRob24uCgogICAgaWYgbm90IHVybDoKICAgICAgICAjIEVtcHR5CiAgICAgICAgcmV0dXJuIFVybCgpCgogICAgc2NoZW1lID0gTm9uZQogICAgYXV0aCA9IE5vbmUKICAgIGhvc3QgPSBOb25lCiAgICBwb3J0ID0gTm9uZQogICAgcGF0aCA9IE5vbmUKICAgIGZyYWdtZW50ID0gTm9uZQogICAgcXVlcnkgPSBOb25lCgogICAgIyBTY2hlbWUKICAgIGlmICc6Ly8nIGluIHVybDoKICAgICAgICBzY2hlbWUsIHVybCA9IHVybC5zcGxpdCgnOi8vJywgMSkKCiAgICAjIEZpbmQgdGhlIGVhcmxpZXN0IEF1dGhvcml0eSBUZXJtaW5hdG9yCiAgICAjIChodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzOTg2I3NlY3Rpb24tMy4yKQogICAgdXJsLCBwYXRoXywgZGVsaW0gPSBzcGxpdF9maXJzdCh1cmwsIFsnLycsICc/JywgJyMnXSkKCiAgICBpZiBkZWxpbToKICAgICAgICAjIFJlYXNzZW1ibGUgdGhlIHBhdGgKICAgICAgICBwYXRoID0gZGVsaW0gKyBwYXRoXwoKICAgICMgQXV0aAogICAgaWYgJ0AnIGluIHVybDoKICAgICAgICAjIExhc3QgJ0AnIGRlbm90ZXMgZW5kIG9mIGF1dGggcGFydAogICAgICAgIGF1dGgsIHVybCA9IHVybC5yc3BsaXQoJ0AnLCAxKQoKICAgICMgSVB2NgogICAgaWYgdXJsIGFuZCB1cmxbMF0gPT0gJ1snOgogICAgICAgIGhvc3QsIHVybCA9IHVybC5zcGxpdCgnXScsIDEpCiAgICAgICAgaG9zdCArPSAnXScKCiAgICAjIFBvcnQKICAgIGlmICc6JyBpbiB1cmw6CiAgICAgICAgX2hvc3QsIHBvcnQgPSB1cmwuc3BsaXQoJzonLCAxKQoKICAgICAgICBpZiBub3QgaG9zdDoKICAgICAgICAgICAgaG9zdCA9IF9ob3N0CgogICAgICAgIGlmIHBvcnQ6CiAgICAgICAgICAgICMgSWYgZ2l2ZW4sIHBvcnRzIG11c3QgYmUgaW50ZWdlcnMuIE5vIHdoaXRlc3BhY2UsIG5vIHBsdXMgb3IKICAgICAgICAgICAgIyBtaW51cyBwcmVmaXhlcywgbm8gbm9uLWludGVnZXIgZGlnaXRzIHN1Y2ggYXMgXjIgKHN1cGVyc2NyaXB0KS4KICAgICAgICAgICAgaWYgbm90IHBvcnQuaXNkaWdpdCgpOgogICAgICAgICAgICAgICAgcmFpc2UgTG9jYXRpb25QYXJzZUVycm9yKHVybCkKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcG9ydCA9IGludChwb3J0KQogICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgIHJhaXNlIExvY2F0aW9uUGFyc2VFcnJvcih1cmwpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBCbGFuayBwb3J0cyBhcmUgY29vbCwgdG9vLiAocmZjMzk4NiNzZWN0aW9uLTMuMi4zKQogICAgICAgICAgICBwb3J0ID0gTm9uZQoKICAgIGVsaWYgbm90IGhvc3QgYW5kIHVybDoKICAgICAgICBob3N0ID0gdXJsCgogICAgaWYgbm90IHBhdGg6CiAgICAgICAgcmV0dXJuIFVybChzY2hlbWUsIGF1dGgsIGhvc3QsIHBvcnQsIHBhdGgsIHF1ZXJ5LCBmcmFnbWVudCkKCiAgICAjIEZyYWdtZW50CiAgICBpZiAnIycgaW4gcGF0aDoKICAgICAgICBwYXRoLCBmcmFnbWVudCA9IHBhdGguc3BsaXQoJyMnLCAxKQoKICAgICMgUXVlcnkKICAgIGlmICc/JyBpbiBwYXRoOgogICAgICAgIHBhdGgsIHF1ZXJ5ID0gcGF0aC5zcGxpdCgnPycsIDEpCgogICAgcmV0dXJuIFVybChzY2hlbWUsIGF1dGgsIGhvc3QsIHBvcnQsIHBhdGgsIHF1ZXJ5LCBmcmFnbWVudCkKCgpkZWYgZ2V0X2hvc3QodXJsKToKICAgICIiIgogICAgRGVwcmVjYXRlZC4gVXNlIDpmdW5jOmBwYXJzZV91cmxgIGluc3RlYWQuCiAgICAiIiIKICAgIHAgPSBwYXJzZV91cmwodXJsKQogICAgcmV0dXJuIHAuc2NoZW1lIG9yICdodHRwJywgcC5ob3N0bmFtZSwgcC5wb3J0ClBLAwQUAAAAAAAAACEAtjwj/KsFAACrBQAAPQAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy91dGlsL3dhaXQucHlmcm9tIC5zZWxlY3RvcnMgaW1wb3J0ICgKICAgIEhBU19TRUxFQ1QsCiAgICBEZWZhdWx0U2VsZWN0b3IsCiAgICBFVkVOVF9SRUFELAogICAgRVZFTlRfV1JJVEUKKQoKCmRlZiBfd2FpdF9mb3JfaW9fZXZlbnRzKHNvY2tzLCBldmVudHMsIHRpbWVvdXQ9Tm9uZSk6CiAgICAiIiIgV2FpdHMgZm9yIElPIGV2ZW50cyB0byBiZSBhdmFpbGFibGUgZnJvbSBhIGxpc3Qgb2Ygc29ja2V0cwogICAgb3Igb3B0aW9uYWxseSBhIHNpbmdsZSBzb2NrZXQgaWYgcGFzc2VkIGluLiBSZXR1cm5zIGEgbGlzdCBvZgogICAgc29ja2V0cyB0aGF0IGNhbiBiZSBpbnRlcmFjdGVkIHdpdGggaW1tZWRpYXRlbHkuICIiIgogICAgaWYgbm90IEhBU19TRUxFQ1Q6CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignUGxhdGZvcm0gZG9lcyBub3QgaGF2ZSBhIHNlbGVjdG9yJykKICAgIGlmIG5vdCBpc2luc3RhbmNlKHNvY2tzLCBsaXN0KToKICAgICAgICAjIFByb2JhYmx5IGp1c3QgYSBzaW5nbGUgc29ja2V0LgogICAgICAgIGlmIGhhc2F0dHIoc29ja3MsICJmaWxlbm8iKToKICAgICAgICAgICAgc29ja3MgPSBbc29ja3NdCiAgICAgICAgIyBPdGhlcndpc2UgaXQgbWlnaHQgYmUgYSBub24tbGlzdCBpdGVyYWJsZS4KICAgICAgICBlbHNlOgogICAgICAgICAgICBzb2NrcyA9IGxpc3Qoc29ja3MpCiAgICB3aXRoIERlZmF1bHRTZWxlY3RvcigpIGFzIHNlbGVjdG9yOgogICAgICAgIGZvciBzb2NrIGluIHNvY2tzOgogICAgICAgICAgICBzZWxlY3Rvci5yZWdpc3Rlcihzb2NrLCBldmVudHMpCiAgICAgICAgcmV0dXJuIFtrZXlbMF0uZmlsZW9iaiBmb3Iga2V5IGluCiAgICAgICAgICAgICAgICBzZWxlY3Rvci5zZWxlY3QodGltZW91dCkgaWYga2V5WzFdICYgZXZlbnRzXQoKCmRlZiB3YWl0X2Zvcl9yZWFkKHNvY2tzLCB0aW1lb3V0PU5vbmUpOgogICAgIiIiIFdhaXRzIGZvciByZWFkaW5nIHRvIGJlIGF2YWlsYWJsZSBmcm9tIGEgbGlzdCBvZiBzb2NrZXRzCiAgICBvciBvcHRpb25hbGx5IGEgc2luZ2xlIHNvY2tldCBpZiBwYXNzZWQgaW4uIFJldHVybnMgYSBsaXN0IG9mCiAgICBzb2NrZXRzIHRoYXQgY2FuIGJlIHJlYWQgZnJvbSBpbW1lZGlhdGVseS4gIiIiCiAgICByZXR1cm4gX3dhaXRfZm9yX2lvX2V2ZW50cyhzb2NrcywgRVZFTlRfUkVBRCwgdGltZW91dCkKCgpkZWYgd2FpdF9mb3Jfd3JpdGUoc29ja3MsIHRpbWVvdXQ9Tm9uZSk6CiAgICAiIiIgV2FpdHMgZm9yIHdyaXRpbmcgdG8gYmUgYXZhaWxhYmxlIGZyb20gYSBsaXN0IG9mIHNvY2tldHMKICAgIG9yIG9wdGlvbmFsbHkgYSBzaW5nbGUgc29ja2V0IGlmIHBhc3NlZCBpbi4gUmV0dXJucyBhIGxpc3Qgb2YKICAgIHNvY2tldHMgdGhhdCBjYW4gYmUgd3JpdHRlbiB0byBpbW1lZGlhdGVseS4gIiIiCiAgICByZXR1cm4gX3dhaXRfZm9yX2lvX2V2ZW50cyhzb2NrcywgRVZFTlRfV1JJVEUsIHRpbWVvdXQpClBLAwQUAAAAAAAAACEAb8GhOFApAABQKQAAQQAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3Ivd2ViZW5jb2RpbmdzL19faW5pdF9fLnB5IyBjb2Rpbmc6IHV0ZjgKIiIiCgogICAgd2ViZW5jb2RpbmdzCiAgICB+fn5+fn5+fn5+fn4KCiAgICBUaGlzIGlzIGEgUHl0aG9uIGltcGxlbWVudGF0aW9uIG9mIHRoZSBgV0hBVFdHIEVuY29kaW5nIHN0YW5kYXJkCiAgICA8aHR0cDovL2VuY29kaW5nLnNwZWMud2hhdHdnLm9yZy8+YC4gU2VlIFJFQURNRSBmb3IgZGV0YWlscy4KCiAgICA6Y29weXJpZ2h0OiBDb3B5cmlnaHQgMjAxMiBieSBTaW1vbiBTYXBpbgogICAgOmxpY2Vuc2U6IEJTRCwgc2VlIExJQ0VOU0UgZm9yIGRldGFpbHMuCgoiIiIKCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgdW5pY29kZV9saXRlcmFscwoKaW1wb3J0IGNvZGVjcwoKZnJvbSAubGFiZWxzIGltcG9ydCBMQUJFTFMKCgpWRVJTSU9OID0gJzAuNScKCgojIFNvbWUgbmFtZXMgaW4gRW5jb2RpbmcgYXJlIG5vdCB2YWxpZCBQeXRob24gYWxpYXNlcy4gUmVtYXAgdGhlc2UuClBZVEhPTl9OQU1FUyA9IHsKICAgICdpc28tODg1OS04LWknOiAnaXNvLTg4NTktOCcsCiAgICAneC1tYWMtY3lyaWxsaWMnOiAnbWFjLWN5cmlsbGljJywKICAgICdtYWNpbnRvc2gnOiAnbWFjLXJvbWFuJywKICAgICd3aW5kb3dzLTg3NCc6ICdjcDg3NCd9CgpDQUNIRSA9IHt9CgoKZGVmIGFzY2lpX2xvd2VyKHN0cmluZyk6CiAgICByIiIiVHJhbnNmb3JtIChvbmx5KSBBU0NJSSBsZXR0ZXJzIHRvIGxvd2VyIGNhc2U6IEEtWiBpcyBtYXBwZWQgdG8gYS16LgoKICAgIDpwYXJhbSBzdHJpbmc6IEFuIFVuaWNvZGUgc3RyaW5nLgogICAgOnJldHVybnM6IEEgbmV3IFVuaWNvZGUgc3RyaW5nLgoKICAgIFRoaXMgaXMgdXNlZCBmb3IgYEFTQ0lJIGNhc2UtaW5zZW5zaXRpdmUKICAgIDxodHRwOi8vZW5jb2Rpbmcuc3BlYy53aGF0d2cub3JnLyNhc2NpaS1jYXNlLWluc2Vuc2l0aXZlPmBfCiAgICBtYXRjaGluZyBvZiBlbmNvZGluZyBsYWJlbHMuCiAgICBUaGUgc2FtZSBtYXRjaGluZyBpcyBhbHNvIHVzZWQsIGFtb25nIG90aGVyIHRoaW5ncywKICAgIGZvciBgQ1NTIGtleXdvcmRzIDxodHRwOi8vZGV2LnczLm9yZy9jc3N3Zy9jc3MtdmFsdWVzLyNrZXl3b3Jkcz5gXy4KCiAgICBUaGlzIGlzIGRpZmZlcmVudCBmcm9tIHRoZSA6bWV0aDpgfnB5OnN0ci5sb3dlcmAgbWV0aG9kIG9mIFVuaWNvZGUgc3RyaW5ncwogICAgd2hpY2ggYWxzbyBhZmZlY3Qgbm9uLUFTQ0lJIGNoYXJhY3RlcnMsCiAgICBzb21ldGltZXMgbWFwcGluZyB0aGVtIGludG8gdGhlIEFTQ0lJIHJhbmdlOgoKICAgICAgICA+Pj4ga2V5d29yZCA9IHUnQmFjXE57S0VMVklOIFNJR059Z3JvdW5kJwogICAgICAgID4+PiBhc3NlcnQga2V5d29yZC5sb3dlcigpID09IHUnYmFja2dyb3VuZCcKICAgICAgICA+Pj4gYXNzZXJ0IGFzY2lpX2xvd2VyKGtleXdvcmQpICE9IGtleXdvcmQubG93ZXIoKQogICAgICAgID4+PiBhc3NlcnQgYXNjaWlfbG93ZXIoa2V5d29yZCkgPT0gdSdiYWNcTntLRUxWSU4gU0lHTn1ncm91bmQnCgogICAgIiIiCiAgICAjIFRoaXMgdHVybnMgb3V0IHRvIGJlIGZhc3RlciB0aGFuIHVuaWNvZGUudHJhbnNsYXRlKCkKICAgIHJldHVybiBzdHJpbmcuZW5jb2RlKCd1dGY4JykubG93ZXIoKS5kZWNvZGUoJ3V0ZjgnKQoKCmRlZiBsb29rdXAobGFiZWwpOgogICAgIiIiCiAgICBMb29rIGZvciBhbiBlbmNvZGluZyBieSBpdHMgbGFiZWwuCiAgICBUaGlzIGlzIHRoZSBzcGVj4oCZcyBgZ2V0IGFuIGVuY29kaW5nCiAgICA8aHR0cDovL2VuY29kaW5nLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1lbmNvZGluZy1nZXQ+YF8gYWxnb3JpdGhtLgogICAgU3VwcG9ydGVkIGxhYmVscyBhcmUgbGlzdGVkIHRoZXJlLgoKICAgIDpwYXJhbSBsYWJlbDogQSBzdHJpbmcuCiAgICA6cmV0dXJuczoKICAgICAgICBBbiA6Y2xhc3M6YEVuY29kaW5nYCBvYmplY3QsIG9yIDpvYmo6YE5vbmVgIGZvciBhbiB1bmtub3duIGxhYmVsLgoKICAgICIiIgogICAgIyBPbmx5IHN0cmlwIEFTQ0lJIHdoaXRlc3BhY2U6IFUrMDAwOSwgVSswMDBBLCBVKzAwMEMsIFUrMDAwRCwgYW5kIFUrMDAyMC4KICAgIGxhYmVsID0gYXNjaWlfbG93ZXIobGFiZWwuc3RyaXAoJ1x0XG5cZlxyICcpKQogICAgbmFtZSA9IExBQkVMUy5nZXQobGFiZWwpCiAgICBpZiBuYW1lIGlzIE5vbmU6CiAgICAgICAgcmV0dXJuIE5vbmUKICAgIGVuY29kaW5nID0gQ0FDSEUuZ2V0KG5hbWUpCiAgICBpZiBlbmNvZGluZyBpcyBOb25lOgogICAgICAgIGlmIG5hbWUgPT0gJ3gtdXNlci1kZWZpbmVkJzoKICAgICAgICAgICAgZnJvbSAueF91c2VyX2RlZmluZWQgaW1wb3J0IGNvZGVjX2luZm8KICAgICAgICBlbHNlOgogICAgICAgICAgICBweXRob25fbmFtZSA9IFBZVEhPTl9OQU1FUy5nZXQobmFtZSwgbmFtZSkKICAgICAgICAgICAgIyBBbnkgcHl0aG9uX25hbWUgdmFsdWUgdGhhdCBnZXRzIHRvIGhlcmUgc2hvdWxkIGJlIHZhbGlkLgogICAgICAgICAgICBjb2RlY19pbmZvID0gY29kZWNzLmxvb2t1cChweXRob25fbmFtZSkKICAgICAgICBlbmNvZGluZyA9IEVuY29kaW5nKG5hbWUsIGNvZGVjX2luZm8pCiAgICAgICAgQ0FDSEVbbmFtZV0gPSBlbmNvZGluZwogICAgcmV0dXJuIGVuY29kaW5nCgoKZGVmIF9nZXRfZW5jb2RpbmcoZW5jb2Rpbmdfb3JfbGFiZWwpOgogICAgIiIiCiAgICBBY2NlcHQgZWl0aGVyIGFuIGVuY29kaW5nIG9iamVjdCBvciBsYWJlbC4KCiAgICA6cGFyYW0gZW5jb2Rpbmc6IEFuIDpjbGFzczpgRW5jb2RpbmdgIG9iamVjdCBvciBhIGxhYmVsIHN0cmluZy4KICAgIDpyZXR1cm5zOiBBbiA6Y2xhc3M6YEVuY29kaW5nYCBvYmplY3QuCiAgICA6cmFpc2VzOiA6ZXhjOmB+ZXhjZXB0aW9ucy5Mb29rdXBFcnJvcmAgZm9yIGFuIHVua25vd24gbGFiZWwuCgogICAgIiIiCiAgICBpZiBoYXNhdHRyKGVuY29kaW5nX29yX2xhYmVsLCAnY29kZWNfaW5mbycpOgogICAgICAgIHJldHVybiBlbmNvZGluZ19vcl9sYWJlbAoKICAgIGVuY29kaW5nID0gbG9va3VwKGVuY29kaW5nX29yX2xhYmVsKQogICAgaWYgZW5jb2RpbmcgaXMgTm9uZToKICAgICAgICByYWlzZSBMb29rdXBFcnJvcignVW5rbm93biBlbmNvZGluZyBsYWJlbDogJXInICUgZW5jb2Rpbmdfb3JfbGFiZWwpCiAgICByZXR1cm4gZW5jb2RpbmcKCgpjbGFzcyBFbmNvZGluZyhvYmplY3QpOgogICAgIiIiUmVyZXNlbnRzIGEgY2hhcmFjdGVyIGVuY29kaW5nIHN1Y2ggYXMgVVRGLTgsCiAgICB0aGF0IGNhbiBiZSB1c2VkIGZvciBkZWNvZGluZyBvciBlbmNvZGluZy4KCiAgICAuLiBhdHRyaWJ1dGU6OiBuYW1lCgogICAgICAgIENhbm9uaWNhbCBuYW1lIG9mIHRoZSBlbmNvZGluZwoKICAgIC4uIGF0dHJpYnV0ZTo6IGNvZGVjX2luZm8KCiAgICAgICAgVGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZW5jb2RpbmcsCiAgICAgICAgYSBzdGRsaWIgOmNsYXNzOmB+Y29kZWNzLkNvZGVjSW5mb2Agb2JqZWN0LgogICAgICAgIFNlZSA6ZnVuYzpgY29kZWNzLnJlZ2lzdGVyYC4KCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBjb2RlY19pbmZvKToKICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCiAgICAgICAgc2VsZi5jb2RlY19pbmZvID0gY29kZWNfaW5mbwoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gJzxFbmNvZGluZyAlcz4nICUgc2VsZi5uYW1lCgoKIzogVGhlIFVURi04IGVuY29kaW5nLiBTaG91bGQgYmUgdXNlZCBmb3IgbmV3IGNvbnRlbnQgYW5kIGZvcm1hdHMuClVURjggPSBsb29rdXAoJ3V0Zi04JykKCl9VVEYxNkxFID0gbG9va3VwKCd1dGYtMTZsZScpCl9VVEYxNkJFID0gbG9va3VwKCd1dGYtMTZiZScpCgoKZGVmIGRlY29kZShpbnB1dCwgZmFsbGJhY2tfZW5jb2RpbmcsIGVycm9ycz0ncmVwbGFjZScpOgogICAgIiIiCiAgICBEZWNvZGUgYSBzaW5nbGUgc3RyaW5nLgoKICAgIDpwYXJhbSBpbnB1dDogQSBieXRlIHN0cmluZwogICAgOnBhcmFtIGZhbGxiYWNrX2VuY29kaW5nOgogICAgICAgIEFuIDpjbGFzczpgRW5jb2RpbmdgIG9iamVjdCBvciBhIGxhYmVsIHN0cmluZy4KICAgICAgICBUaGUgZW5jb2RpbmcgdG8gdXNlIGlmIDpvYmo6YGlucHV0YCBkb2VzIG5vdGUgaGF2ZSBhIEJPTS4KICAgIDpwYXJhbSBlcnJvcnM6IFR5cGUgb2YgZXJyb3IgaGFuZGxpbmcuIFNlZSA6ZnVuYzpgY29kZWNzLnJlZ2lzdGVyYC4KICAgIDpyYWlzZXM6IDpleGM6YH5leGNlcHRpb25zLkxvb2t1cEVycm9yYCBmb3IgYW4gdW5rbm93biBlbmNvZGluZyBsYWJlbC4KICAgIDpyZXR1cm46CiAgICAgICAgQSBgYChvdXRwdXQsIGVuY29kaW5nKWBgIHR1cGxlIG9mIGFuIFVuaWNvZGUgc3RyaW5nCiAgICAgICAgYW5kIGFuIDpvYmo6YEVuY29kaW5nYC4KCiAgICAiIiIKICAgICMgRmFpbCBlYXJseSBpZiBgZW5jb2RpbmdgIGlzIGFuIGludmFsaWQgbGFiZWwuCiAgICBmYWxsYmFja19lbmNvZGluZyA9IF9nZXRfZW5jb2RpbmcoZmFsbGJhY2tfZW5jb2RpbmcpCiAgICBib21fZW5jb2RpbmcsIGlucHV0ID0gX2RldGVjdF9ib20oaW5wdXQpCiAgICBlbmNvZGluZyA9IGJvbV9lbmNvZGluZyBvciBmYWxsYmFja19lbmNvZGluZwogICAgcmV0dXJuIGVuY29kaW5nLmNvZGVjX2luZm8uZGVjb2RlKGlucHV0LCBlcnJvcnMpWzBdLCBlbmNvZGluZwoKCmRlZiBfZGV0ZWN0X2JvbShpbnB1dCk6CiAgICAiIiJSZXR1cm4gKGJvbV9lbmNvZGluZywgaW5wdXQpLCB3aXRoIGFueSBCT00gcmVtb3ZlZCBmcm9tIHRoZSBpbnB1dC4iIiIKICAgIGlmIGlucHV0LnN0YXJ0c3dpdGgoYidceEZGXHhGRScpOgogICAgICAgIHJldHVybiBfVVRGMTZMRSwgaW5wdXRbMjpdCiAgICBpZiBpbnB1dC5zdGFydHN3aXRoKGInXHhGRVx4RkYnKToKICAgICAgICByZXR1cm4gX1VURjE2QkUsIGlucHV0WzI6XQogICAgaWYgaW5wdXQuc3RhcnRzd2l0aChiJ1x4RUZceEJCXHhCRicpOgogICAgICAgIHJldHVybiBVVEY4LCBpbnB1dFszOl0KICAgIHJldHVybiBOb25lLCBpbnB1dAoKCmRlZiBlbmNvZGUoaW5wdXQsIGVuY29kaW5nPVVURjgsIGVycm9ycz0nc3RyaWN0Jyk6CiAgICAiIiIKICAgIEVuY29kZSBhIHNpbmdsZSBzdHJpbmcuCgogICAgOnBhcmFtIGlucHV0OiBBbiBVbmljb2RlIHN0cmluZy4KICAgIDpwYXJhbSBlbmNvZGluZzogQW4gOmNsYXNzOmBFbmNvZGluZ2Agb2JqZWN0IG9yIGEgbGFiZWwgc3RyaW5nLgogICAgOnBhcmFtIGVycm9yczogVHlwZSBvZiBlcnJvciBoYW5kbGluZy4gU2VlIDpmdW5jOmBjb2RlY3MucmVnaXN0ZXJgLgogICAgOnJhaXNlczogOmV4YzpgfmV4Y2VwdGlvbnMuTG9va3VwRXJyb3JgIGZvciBhbiB1bmtub3duIGVuY29kaW5nIGxhYmVsLgogICAgOnJldHVybjogQSBieXRlIHN0cmluZy4KCiAgICAiIiIKICAgIHJldHVybiBfZ2V0X2VuY29kaW5nKGVuY29kaW5nKS5jb2RlY19pbmZvLmVuY29kZShpbnB1dCwgZXJyb3JzKVswXQoKCmRlZiBpdGVyX2RlY29kZShpbnB1dCwgZmFsbGJhY2tfZW5jb2RpbmcsIGVycm9ycz0ncmVwbGFjZScpOgogICAgIiIiCiAgICAiUHVsbCItYmFzZWQgZGVjb2Rlci4KCiAgICA6cGFyYW0gaW5wdXQ6CiAgICAgICAgQW4gaXRlcmFibGUgb2YgYnl0ZSBzdHJpbmdzLgoKICAgICAgICBUaGUgaW5wdXQgaXMgZmlyc3QgY29uc3VtZWQganVzdCBlbm91Z2ggdG8gZGV0ZXJtaW5lIHRoZSBlbmNvZGluZwogICAgICAgIGJhc2VkIG9uIHRoZSBwcmVjZW5zZSBvZiBhIEJPTSwKICAgICAgICB0aGVuIGNvbnN1bWVkIG9uIGRlbWFuZCB3aGVuIHRoZSByZXR1cm4gdmFsdWUgaXMuCiAgICA6cGFyYW0gZmFsbGJhY2tfZW5jb2Rpbmc6CiAgICAgICAgQW4gOmNsYXNzOmBFbmNvZGluZ2Agb2JqZWN0IG9yIGEgbGFiZWwgc3RyaW5nLgogICAgICAgIFRoZSBlbmNvZGluZyB0byB1c2UgaWYgOm9iajpgaW5wdXRgIGRvZXMgbm90ZSBoYXZlIGEgQk9NLgogICAgOnBhcmFtIGVycm9yczogVHlwZSBvZiBlcnJvciBoYW5kbGluZy4gU2VlIDpmdW5jOmBjb2RlY3MucmVnaXN0ZXJgLgogICAgOnJhaXNlczogOmV4YzpgfmV4Y2VwdGlvbnMuTG9va3VwRXJyb3JgIGZvciBhbiB1bmtub3duIGVuY29kaW5nIGxhYmVsLgogICAgOnJldHVybnM6CiAgICAgICAgQW4gYGAob3V0cHV0LCBlbmNvZGluZylgYCB0dXBsZS4KICAgICAgICA6b2JqOmBvdXRwdXRgIGlzIGFuIGl0ZXJhYmxlIG9mIFVuaWNvZGUgc3RyaW5ncywKICAgICAgICA6b2JqOmBlbmNvZGluZ2AgaXMgdGhlIDpvYmo6YEVuY29kaW5nYCB0aGF0IGlzIGJlaW5nIHVzZWQuCgogICAgIiIiCgogICAgZGVjb2RlciA9IEluY3JlbWVudGFsRGVjb2RlcihmYWxsYmFja19lbmNvZGluZywgZXJyb3JzKQogICAgZ2VuZXJhdG9yID0gX2l0ZXJfZGVjb2RlX2dlbmVyYXRvcihpbnB1dCwgZGVjb2RlcikKICAgIGVuY29kaW5nID0gbmV4dChnZW5lcmF0b3IpCiAgICByZXR1cm4gZ2VuZXJhdG9yLCBlbmNvZGluZwoKCmRlZiBfaXRlcl9kZWNvZGVfZ2VuZXJhdG9yKGlucHV0LCBkZWNvZGVyKToKICAgICIiIlJldHVybiBhIGdlbmVyYXRvciB0aGF0IGZpcnN0IHlpZWxkcyB0aGUgOm9iajpgRW5jb2RpbmdgLAogICAgdGhlbiB5aWVsZHMgb3V0cHV0IGNodWtucyBhcyBVbmljb2RlIHN0cmluZ3MuCgogICAgIiIiCiAgICBkZWNvZGUgPSBkZWNvZGVyLmRlY29kZQogICAgaW5wdXQgPSBpdGVyKGlucHV0KQogICAgZm9yIGNodW5jayBpbiBpbnB1dDoKICAgICAgICBvdXRwdXQgPSBkZWNvZGUoY2h1bmNrKQogICAgICAgIGlmIG91dHB1dDoKICAgICAgICAgICAgYXNzZXJ0IGRlY29kZXIuZW5jb2RpbmcgaXMgbm90IE5vbmUKICAgICAgICAgICAgeWllbGQgZGVjb2Rlci5lbmNvZGluZwogICAgICAgICAgICB5aWVsZCBvdXRwdXQKICAgICAgICAgICAgYnJlYWsKICAgIGVsc2U6CiAgICAgICAgIyBJbnB1dCBleGhhdXN0ZWQgd2l0aG91dCBkZXRlcm1pbmluZyB0aGUgZW5jb2RpbmcKICAgICAgICBvdXRwdXQgPSBkZWNvZGUoYicnLCBmaW5hbD1UcnVlKQogICAgICAgIGFzc2VydCBkZWNvZGVyLmVuY29kaW5nIGlzIG5vdCBOb25lCiAgICAgICAgeWllbGQgZGVjb2Rlci5lbmNvZGluZwogICAgICAgIGlmIG91dHB1dDoKICAgICAgICAgICAgeWllbGQgb3V0cHV0CiAgICAgICAgcmV0dXJuCgogICAgZm9yIGNodW5jayBpbiBpbnB1dDoKICAgICAgICBvdXRwdXQgPSBkZWNvZGUoY2h1bmNrKQogICAgICAgIGlmIG91dHB1dDoKICAgICAgICAgICAgeWllbGQgb3V0cHV0CiAgICBvdXRwdXQgPSBkZWNvZGUoYicnLCBmaW5hbD1UcnVlKQogICAgaWYgb3V0cHV0OgogICAgICAgIHlpZWxkIG91dHB1dAoKCmRlZiBpdGVyX2VuY29kZShpbnB1dCwgZW5jb2Rpbmc9VVRGOCwgZXJyb3JzPSdzdHJpY3QnKToKICAgICIiIgogICAg4oCcUHVsbOKAnS1iYXNlZCBlbmNvZGVyLgoKICAgIDpwYXJhbSBpbnB1dDogQW4gaXRlcmFibGUgb2YgVW5pY29kZSBzdHJpbmdzLgogICAgOnBhcmFtIGVuY29kaW5nOiBBbiA6Y2xhc3M6YEVuY29kaW5nYCBvYmplY3Qgb3IgYSBsYWJlbCBzdHJpbmcuCiAgICA6cGFyYW0gZXJyb3JzOiBUeXBlIG9mIGVycm9yIGhhbmRsaW5nLiBTZWUgOmZ1bmM6YGNvZGVjcy5yZWdpc3RlcmAuCiAgICA6cmFpc2VzOiA6ZXhjOmB+ZXhjZXB0aW9ucy5Mb29rdXBFcnJvcmAgZm9yIGFuIHVua25vd24gZW5jb2RpbmcgbGFiZWwuCiAgICA6cmV0dXJuczogQW4gaXRlcmFibGUgb2YgYnl0ZSBzdHJpbmdzLgoKICAgICIiIgogICAgIyBGYWlsIGVhcmx5IGlmIGBlbmNvZGluZ2AgaXMgYW4gaW52YWxpZCBsYWJlbC4KICAgIGVuY29kZSA9IEluY3JlbWVudGFsRW5jb2RlcihlbmNvZGluZywgZXJyb3JzKS5lbmNvZGUKICAgIHJldHVybiBfaXRlcl9lbmNvZGVfZ2VuZXJhdG9yKGlucHV0LCBlbmNvZGUpCgoKZGVmIF9pdGVyX2VuY29kZV9nZW5lcmF0b3IoaW5wdXQsIGVuY29kZSk6CiAgICBmb3IgY2h1bmNrIGluIGlucHV0OgogICAgICAgIG91dHB1dCA9IGVuY29kZShjaHVuY2spCiAgICAgICAgaWYgb3V0cHV0OgogICAgICAgICAgICB5aWVsZCBvdXRwdXQKICAgIG91dHB1dCA9IGVuY29kZSgnJywgZmluYWw9VHJ1ZSkKICAgIGlmIG91dHB1dDoKICAgICAgICB5aWVsZCBvdXRwdXQKCgpjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIob2JqZWN0KToKICAgICIiIgogICAg4oCcUHVzaOKAnS1iYXNlZCBkZWNvZGVyLgoKICAgIDpwYXJhbSBmYWxsYmFja19lbmNvZGluZzoKICAgICAgICBBbiA6Y2xhc3M6YEVuY29kaW5nYCBvYmplY3Qgb3IgYSBsYWJlbCBzdHJpbmcuCiAgICAgICAgVGhlIGVuY29kaW5nIHRvIHVzZSBpZiA6b2JqOmBpbnB1dGAgZG9lcyBub3RlIGhhdmUgYSBCT00uCiAgICA6cGFyYW0gZXJyb3JzOiBUeXBlIG9mIGVycm9yIGhhbmRsaW5nLiBTZWUgOmZ1bmM6YGNvZGVjcy5yZWdpc3RlcmAuCiAgICA6cmFpc2VzOiA6ZXhjOmB+ZXhjZXB0aW9ucy5Mb29rdXBFcnJvcmAgZm9yIGFuIHVua25vd24gZW5jb2RpbmcgbGFiZWwuCgogICAgIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgZmFsbGJhY2tfZW5jb2RpbmcsIGVycm9ycz0ncmVwbGFjZScpOgogICAgICAgICMgRmFpbCBlYXJseSBpZiBgZW5jb2RpbmdgIGlzIGFuIGludmFsaWQgbGFiZWwuCiAgICAgICAgc2VsZi5fZmFsbGJhY2tfZW5jb2RpbmcgPSBfZ2V0X2VuY29kaW5nKGZhbGxiYWNrX2VuY29kaW5nKQogICAgICAgIHNlbGYuX2Vycm9ycyA9IGVycm9ycwogICAgICAgIHNlbGYuX2J1ZmZlciA9IGInJwogICAgICAgIHNlbGYuX2RlY29kZXIgPSBOb25lCiAgICAgICAgIzogVGhlIGFjdHVhbCA6Y2xhc3M6YEVuY29kaW5nYCB0aGF0IGlzIGJlaW5nIHVzZWQsCiAgICAgICAgIzogb3IgOm9iajpgTm9uZWAgaWYgdGhhdCBpcyBub3QgZGV0ZXJtaW5lZCB5ZXQuCiAgICAgICAgIzogKEllLiBpZiB0aGVyZSBpcyBub3QgZW5vdWdoIGlucHV0IHlldCB0byBkZXRlcm1pbmUKICAgICAgICAjOiBpZiB0aGVyZSBpcyBhIEJPTS4pCiAgICAgICAgc2VsZi5lbmNvZGluZyA9IE5vbmUgICMgTm90IGtub3duIHlldC4KCiAgICBkZWYgZGVjb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CiAgICAgICAgIiIiRGVjb2RlIG9uZSBjaHVuayBvZiB0aGUgaW5wdXQuCgogICAgICAgIDpwYXJhbSBpbnB1dDogQSBieXRlIHN0cmluZy4KICAgICAgICA6cGFyYW0gZmluYWw6CiAgICAgICAgICAgIEluZGljYXRlIHRoYXQgbm8gbW9yZSBpbnB1dCBpcyBhdmFpbGFibGUuCiAgICAgICAgICAgIE11c3QgYmUgOm9iajpgVHJ1ZWAgaWYgdGhpcyBpcyB0aGUgbGFzdCBjYWxsLgogICAgICAgIDpyZXR1cm5zOiBBbiBVbmljb2RlIHN0cmluZy4KCiAgICAgICAgIiIiCiAgICAgICAgZGVjb2RlciA9IHNlbGYuX2RlY29kZXIKICAgICAgICBpZiBkZWNvZGVyIGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4gZGVjb2RlcihpbnB1dCwgZmluYWwpCgogICAgICAgIGlucHV0ID0gc2VsZi5fYnVmZmVyICsgaW5wdXQKICAgICAgICBlbmNvZGluZywgaW5wdXQgPSBfZGV0ZWN0X2JvbShpbnB1dCkKICAgICAgICBpZiBlbmNvZGluZyBpcyBOb25lOgogICAgICAgICAgICBpZiBsZW4oaW5wdXQpIDwgMyBhbmQgbm90IGZpbmFsOiAgIyBOb3QgZW5vdWdoIGRhdGEgeWV0LgogICAgICAgICAgICAgICAgc2VsZi5fYnVmZmVyID0gaW5wdXQKICAgICAgICAgICAgICAgIHJldHVybiAnJwogICAgICAgICAgICBlbHNlOiAgIyBObyBCT00KICAgICAgICAgICAgICAgIGVuY29kaW5nID0gc2VsZi5fZmFsbGJhY2tfZW5jb2RpbmcKICAgICAgICBkZWNvZGVyID0gZW5jb2RpbmcuY29kZWNfaW5mby5pbmNyZW1lbnRhbGRlY29kZXIoc2VsZi5fZXJyb3JzKS5kZWNvZGUKICAgICAgICBzZWxmLl9kZWNvZGVyID0gZGVjb2RlcgogICAgICAgIHNlbGYuZW5jb2RpbmcgPSBlbmNvZGluZwogICAgICAgIHJldHVybiBkZWNvZGVyKGlucHV0LCBmaW5hbCkKCgpjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIob2JqZWN0KToKICAgICIiIgogICAg4oCcUHVzaOKAnS1iYXNlZCBlbmNvZGVyLgoKICAgIDpwYXJhbSBlbmNvZGluZzogQW4gOmNsYXNzOmBFbmNvZGluZ2Agb2JqZWN0IG9yIGEgbGFiZWwgc3RyaW5nLgogICAgOnBhcmFtIGVycm9yczogVHlwZSBvZiBlcnJvciBoYW5kbGluZy4gU2VlIDpmdW5jOmBjb2RlY3MucmVnaXN0ZXJgLgogICAgOnJhaXNlczogOmV4YzpgfmV4Y2VwdGlvbnMuTG9va3VwRXJyb3JgIGZvciBhbiB1bmtub3duIGVuY29kaW5nIGxhYmVsLgoKICAgIC4uIG1ldGhvZDo6IGVuY29kZShpbnB1dCwgZmluYWw9RmFsc2UpCgogICAgICAgIDpwYXJhbSBpbnB1dDogQW4gVW5pY29kZSBzdHJpbmcuCiAgICAgICAgOnBhcmFtIGZpbmFsOgogICAgICAgICAgICBJbmRpY2F0ZSB0aGF0IG5vIG1vcmUgaW5wdXQgaXMgYXZhaWxhYmxlLgogICAgICAgICAgICBNdXN0IGJlIDpvYmo6YFRydWVgIGlmIHRoaXMgaXMgdGhlIGxhc3QgY2FsbC4KICAgICAgICA6cmV0dXJuczogQSBieXRlIHN0cmluZy4KCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBlbmNvZGluZz1VVEY4LCBlcnJvcnM9J3N0cmljdCcpOgogICAgICAgIGVuY29kaW5nID0gX2dldF9lbmNvZGluZyhlbmNvZGluZykKICAgICAgICBzZWxmLmVuY29kZSA9IGVuY29kaW5nLmNvZGVjX2luZm8uaW5jcmVtZW50YWxlbmNvZGVyKGVycm9ycykuZW5jb2RlClBLAwQUAAAAAAAAACEAx60IixMjAAATIwAAPwAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3Ivd2ViZW5jb2RpbmdzL2xhYmVscy5weSIiIgoKICAgIHdlYmVuY29kaW5ncy5sYWJlbHMKICAgIH5+fn5+fn5+fn5+fn5+fn5+fn4KCiAgICBNYXAgZW5jb2RpbmcgbGFiZWxzIHRvIHRoZWlyIG5hbWUuCgogICAgOmNvcHlyaWdodDogQ29weXJpZ2h0IDIwMTIgYnkgU2ltb24gU2FwaW4KICAgIDpsaWNlbnNlOiBCU0QsIHNlZSBMSUNFTlNFIGZvciBkZXRhaWxzLgoKIiIiCgojIFhYWCBEbyBub3QgZWRpdCEKIyBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgbWtsYWJlbHMucHkKCkxBQkVMUyA9IHsKICAgICd1bmljb2RlLTEtMS11dGYtOCc6ICAgJ3V0Zi04JywKICAgICd1dGYtOCc6ICAgICAgICAgICAgICAgJ3V0Zi04JywKICAgICd1dGY4JzogICAgICAgICAgICAgICAgJ3V0Zi04JywKICAgICc4NjYnOiAgICAgICAgICAgICAgICAgJ2libTg2NicsCiAgICAnY3A4NjYnOiAgICAgICAgICAgICAgICdpYm04NjYnLAogICAgJ2NzaWJtODY2JzogICAgICAgICAgICAnaWJtODY2JywKICAgICdpYm04NjYnOiAgICAgICAgICAgICAgJ2libTg2NicsCiAgICAnY3Npc29sYXRpbjInOiAgICAgICAgICdpc28tODg1OS0yJywKICAgICdpc28tODg1OS0yJzogICAgICAgICAgJ2lzby04ODU5LTInLAogICAgJ2lzby1pci0xMDEnOiAgICAgICAgICAnaXNvLTg4NTktMicsCiAgICAnaXNvODg1OS0yJzogICAgICAgICAgICdpc28tODg1OS0yJywKICAgICdpc284ODU5Mic6ICAgICAgICAgICAgJ2lzby04ODU5LTInLAogICAgJ2lzb184ODU5LTInOiAgICAgICAgICAnaXNvLTg4NTktMicsCiAgICAnaXNvXzg4NTktMjoxOTg3JzogICAgICdpc28tODg1OS0yJywKICAgICdsMic6ICAgICAgICAgICAgICAgICAgJ2lzby04ODU5LTInLAogICAgJ2xhdGluMic6ICAgICAgICAgICAgICAnaXNvLTg4NTktMicsCiAgICAnY3Npc29sYXRpbjMnOiAgICAgICAgICdpc28tODg1OS0zJywKICAgICdpc28tODg1OS0zJzogICAgICAgICAgJ2lzby04ODU5LTMnLAogICAgJ2lzby1pci0xMDknOiAgICAgICAgICAnaXNvLTg4NTktMycsCiAgICAnaXNvODg1OS0zJzogICAgICAgICAgICdpc28tODg1OS0zJywKICAgICdpc284ODU5Myc6ICAgICAgICAgICAgJ2lzby04ODU5LTMnLAogICAgJ2lzb184ODU5LTMnOiAgICAgICAgICAnaXNvLTg4NTktMycsCiAgICAnaXNvXzg4NTktMzoxOTg4JzogICAgICdpc28tODg1OS0zJywKICAgICdsMyc6ICAgICAgICAgICAgICAgICAgJ2lzby04ODU5LTMnLAogICAgJ2xhdGluMyc6ICAgICAgICAgICAgICAnaXNvLTg4NTktMycsCiAgICAnY3Npc29sYXRpbjQnOiAgICAgICAgICdpc28tODg1OS00JywKICAgICdpc28tODg1OS00JzogICAgICAgICAgJ2lzby04ODU5LTQnLAogICAgJ2lzby1pci0xMTAnOiAgICAgICAgICAnaXNvLTg4NTktNCcsCiAgICAnaXNvODg1OS00JzogICAgICAgICAgICdpc28tODg1OS00JywKICAgICdpc284ODU5NCc6ICAgICAgICAgICAgJ2lzby04ODU5LTQnLAogICAgJ2lzb184ODU5LTQnOiAgICAgICAgICAnaXNvLTg4NTktNCcsCiAgICAnaXNvXzg4NTktNDoxOTg4JzogICAgICdpc28tODg1OS00JywKICAgICdsNCc6ICAgICAgICAgICAgICAgICAgJ2lzby04ODU5LTQnLAogICAgJ2xhdGluNCc6ICAgICAgICAgICAgICAnaXNvLTg4NTktNCcsCiAgICAnY3Npc29sYXRpbmN5cmlsbGljJzogICdpc28tODg1OS01JywKICAgICdjeXJpbGxpYyc6ICAgICAgICAgICAgJ2lzby04ODU5LTUnLAogICAgJ2lzby04ODU5LTUnOiAgICAgICAgICAnaXNvLTg4NTktNScsCiAgICAnaXNvLWlyLTE0NCc6ICAgICAgICAgICdpc28tODg1OS01JywKICAgICdpc284ODU5LTUnOiAgICAgICAgICAgJ2lzby04ODU5LTUnLAogICAgJ2lzbzg4NTk1JzogICAgICAgICAgICAnaXNvLTg4NTktNScsCiAgICAnaXNvXzg4NTktNSc6ICAgICAgICAgICdpc28tODg1OS01JywKICAgICdpc29fODg1OS01OjE5ODgnOiAgICAgJ2lzby04ODU5LTUnLAogICAgJ2FyYWJpYyc6ICAgICAgICAgICAgICAnaXNvLTg4NTktNicsCiAgICAnYXNtby03MDgnOiAgICAgICAgICAgICdpc28tODg1OS02JywKICAgICdjc2lzbzg4NTk2ZSc6ICAgICAgICAgJ2lzby04ODU5LTYnLAogICAgJ2NzaXNvODg1OTZpJzogICAgICAgICAnaXNvLTg4NTktNicsCiAgICAnY3Npc29sYXRpbmFyYWJpYyc6ICAgICdpc28tODg1OS02JywKICAgICdlY21hLTExNCc6ICAgICAgICAgICAgJ2lzby04ODU5LTYnLAogICAgJ2lzby04ODU5LTYnOiAgICAgICAgICAnaXNvLTg4NTktNicsCiAgICAnaXNvLTg4NTktNi1lJzogICAgICAgICdpc28tODg1OS02JywKICAgICdpc28tODg1OS02LWknOiAgICAgICAgJ2lzby04ODU5LTYnLAogICAgJ2lzby1pci0xMjcnOiAgICAgICAgICAnaXNvLTg4NTktNicsCiAgICAnaXNvODg1OS02JzogICAgICAgICAgICdpc28tODg1OS02JywKICAgICdpc284ODU5Nic6ICAgICAgICAgICAgJ2lzby04ODU5LTYnLAogICAgJ2lzb184ODU5LTYnOiAgICAgICAgICAnaXNvLTg4NTktNicsCiAgICAnaXNvXzg4NTktNjoxOTg3JzogICAgICdpc28tODg1OS02JywKICAgICdjc2lzb2xhdGluZ3JlZWsnOiAgICAgJ2lzby04ODU5LTcnLAogICAgJ2VjbWEtMTE4JzogICAgICAgICAgICAnaXNvLTg4NTktNycsCiAgICAnZWxvdF85MjgnOiAgICAgICAgICAgICdpc28tODg1OS03JywKICAgICdncmVlayc6ICAgICAgICAgICAgICAgJ2lzby04ODU5LTcnLAogICAgJ2dyZWVrOCc6ICAgICAgICAgICAgICAnaXNvLTg4NTktNycsCiAgICAnaXNvLTg4NTktNyc6ICAgICAgICAgICdpc28tODg1OS03JywKICAgICdpc28taXItMTI2JzogICAgICAgICAgJ2lzby04ODU5LTcnLAogICAgJ2lzbzg4NTktNyc6ICAgICAgICAgICAnaXNvLTg4NTktNycsCiAgICAnaXNvODg1OTcnOiAgICAgICAgICAgICdpc28tODg1OS03JywKICAgICdpc29fODg1OS03JzogICAgICAgICAgJ2lzby04ODU5LTcnLAogICAgJ2lzb184ODU5LTc6MTk4Nyc6ICAgICAnaXNvLTg4NTktNycsCiAgICAnc3VuX2V1X2dyZWVrJzogICAgICAgICdpc28tODg1OS03JywKICAgICdjc2lzbzg4NTk4ZSc6ICAgICAgICAgJ2lzby04ODU5LTgnLAogICAgJ2NzaXNvbGF0aW5oZWJyZXcnOiAgICAnaXNvLTg4NTktOCcsCiAgICAnaGVicmV3JzogICAgICAgICAgICAgICdpc28tODg1OS04JywKICAgICdpc28tODg1OS04JzogICAgICAgICAgJ2lzby04ODU5LTgnLAogICAgJ2lzby04ODU5LTgtZSc6ICAgICAgICAnaXNvLTg4NTktOCcsCiAgICAnaXNvLWlyLTEzOCc6ICAgICAgICAgICdpc28tODg1OS04JywKICAgICdpc284ODU5LTgnOiAgICAgICAgICAgJ2lzby04ODU5LTgnLAogICAgJ2lzbzg4NTk4JzogICAgICAgICAgICAnaXNvLTg4NTktOCcsCiAgICAnaXNvXzg4NTktOCc6ICAgICAgICAgICdpc28tODg1OS04JywKICAgICdpc29fODg1OS04OjE5ODgnOiAgICAgJ2lzby04ODU5LTgnLAogICAgJ3Zpc3VhbCc6ICAgICAgICAgICAgICAnaXNvLTg4NTktOCcsCiAgICAnY3Npc284ODU5OGknOiAgICAgICAgICdpc28tODg1OS04LWknLAogICAgJ2lzby04ODU5LTgtaSc6ICAgICAgICAnaXNvLTg4NTktOC1pJywKICAgICdsb2dpY2FsJzogICAgICAgICAgICAgJ2lzby04ODU5LTgtaScsCiAgICAnY3Npc29sYXRpbjYnOiAgICAgICAgICdpc28tODg1OS0xMCcsCiAgICAnaXNvLTg4NTktMTAnOiAgICAgICAgICdpc28tODg1OS0xMCcsCiAgICAnaXNvLWlyLTE1Nyc6ICAgICAgICAgICdpc28tODg1OS0xMCcsCiAgICAnaXNvODg1OS0xMCc6ICAgICAgICAgICdpc28tODg1OS0xMCcsCiAgICAnaXNvODg1OTEwJzogICAgICAgICAgICdpc28tODg1OS0xMCcsCiAgICAnbDYnOiAgICAgICAgICAgICAgICAgICdpc28tODg1OS0xMCcsCiAgICAnbGF0aW42JzogICAgICAgICAgICAgICdpc28tODg1OS0xMCcsCiAgICAnaXNvLTg4NTktMTMnOiAgICAgICAgICdpc28tODg1OS0xMycsCiAgICAnaXNvODg1OS0xMyc6ICAgICAgICAgICdpc28tODg1OS0xMycsCiAgICAnaXNvODg1OTEzJzogICAgICAgICAgICdpc28tODg1OS0xMycsCiAgICAnaXNvLTg4NTktMTQnOiAgICAgICAgICdpc28tODg1OS0xNCcsCiAgICAnaXNvODg1OS0xNCc6ICAgICAgICAgICdpc28tODg1OS0xNCcsCiAgICAnaXNvODg1OTE0JzogICAgICAgICAgICdpc28tODg1OS0xNCcsCiAgICAnY3Npc29sYXRpbjknOiAgICAgICAgICdpc28tODg1OS0xNScsCiAgICAnaXNvLTg4NTktMTUnOiAgICAgICAgICdpc28tODg1OS0xNScsCiAgICAnaXNvODg1OS0xNSc6ICAgICAgICAgICdpc28tODg1OS0xNScsCiAgICAnaXNvODg1OTE1JzogICAgICAgICAgICdpc28tODg1OS0xNScsCiAgICAnaXNvXzg4NTktMTUnOiAgICAgICAgICdpc28tODg1OS0xNScsCiAgICAnbDknOiAgICAgICAgICAgICAgICAgICdpc28tODg1OS0xNScsCiAgICAnaXNvLTg4NTktMTYnOiAgICAgICAgICdpc28tODg1OS0xNicsCiAgICAnY3Nrb2k4cic6ICAgICAgICAgICAgICdrb2k4LXInLAogICAgJ2tvaSc6ICAgICAgICAgICAgICAgICAna29pOC1yJywKICAgICdrb2k4JzogICAgICAgICAgICAgICAgJ2tvaTgtcicsCiAgICAna29pOC1yJzogICAgICAgICAgICAgICdrb2k4LXInLAogICAgJ2tvaThfcic6ICAgICAgICAgICAgICAna29pOC1yJywKICAgICdrb2k4LXUnOiAgICAgICAgICAgICAgJ2tvaTgtdScsCiAgICAnY3NtYWNpbnRvc2gnOiAgICAgICAgICdtYWNpbnRvc2gnLAogICAgJ21hYyc6ICAgICAgICAgICAgICAgICAnbWFjaW50b3NoJywKICAgICdtYWNpbnRvc2gnOiAgICAgICAgICAgJ21hY2ludG9zaCcsCiAgICAneC1tYWMtcm9tYW4nOiAgICAgICAgICdtYWNpbnRvc2gnLAogICAgJ2Rvcy04NzQnOiAgICAgICAgICAgICAnd2luZG93cy04NzQnLAogICAgJ2lzby04ODU5LTExJzogICAgICAgICAnd2luZG93cy04NzQnLAogICAgJ2lzbzg4NTktMTEnOiAgICAgICAgICAnd2luZG93cy04NzQnLAogICAgJ2lzbzg4NTkxMSc6ICAgICAgICAgICAnd2luZG93cy04NzQnLAogICAgJ3Rpcy02MjAnOiAgICAgICAgICAgICAnd2luZG93cy04NzQnLAogICAgJ3dpbmRvd3MtODc0JzogICAgICAgICAnd2luZG93cy04NzQnLAogICAgJ2NwMTI1MCc6ICAgICAgICAgICAgICAnd2luZG93cy0xMjUwJywKICAgICd3aW5kb3dzLTEyNTAnOiAgICAgICAgJ3dpbmRvd3MtMTI1MCcsCiAgICAneC1jcDEyNTAnOiAgICAgICAgICAgICd3aW5kb3dzLTEyNTAnLAogICAgJ2NwMTI1MSc6ICAgICAgICAgICAgICAnd2luZG93cy0xMjUxJywKICAgICd3aW5kb3dzLTEyNTEnOiAgICAgICAgJ3dpbmRvd3MtMTI1MScsCiAgICAneC1jcDEyNTEnOiAgICAgICAgICAgICd3aW5kb3dzLTEyNTEnLAogICAgJ2Fuc2lfeDMuNC0xOTY4JzogICAgICAnd2luZG93cy0xMjUyJywKICAgICdhc2NpaSc6ICAgICAgICAgICAgICAgJ3dpbmRvd3MtMTI1MicsCiAgICAnY3AxMjUyJzogICAgICAgICAgICAgICd3aW5kb3dzLTEyNTInLAogICAgJ2NwODE5JzogICAgICAgICAgICAgICAnd2luZG93cy0xMjUyJywKICAgICdjc2lzb2xhdGluMSc6ICAgICAgICAgJ3dpbmRvd3MtMTI1MicsCiAgICAnaWJtODE5JzogICAgICAgICAgICAgICd3aW5kb3dzLTEyNTInLAogICAgJ2lzby04ODU5LTEnOiAgICAgICAgICAnd2luZG93cy0xMjUyJywKICAgICdpc28taXItMTAwJzogICAgICAgICAgJ3dpbmRvd3MtMTI1MicsCiAgICAnaXNvODg1OS0xJzogICAgICAgICAgICd3aW5kb3dzLTEyNTInLAogICAgJ2lzbzg4NTkxJzogICAgICAgICAgICAnd2luZG93cy0xMjUyJywKICAgICdpc29fODg1OS0xJzogICAgICAgICAgJ3dpbmRvd3MtMTI1MicsCiAgICAnaXNvXzg4NTktMToxOTg3JzogICAgICd3aW5kb3dzLTEyNTInLAogICAgJ2wxJzogICAgICAgICAgICAgICAgICAnd2luZG93cy0xMjUyJywKICAgICdsYXRpbjEnOiAgICAgICAgICAgICAgJ3dpbmRvd3MtMTI1MicsCiAgICAndXMtYXNjaWknOiAgICAgICAgICAgICd3aW5kb3dzLTEyNTInLAogICAgJ3dpbmRvd3MtMTI1Mic6ICAgICAgICAnd2luZG93cy0xMjUyJywKICAgICd4LWNwMTI1Mic6ICAgICAgICAgICAgJ3dpbmRvd3MtMTI1MicsCiAgICAnY3AxMjUzJzogICAgICAgICAgICAgICd3aW5kb3dzLTEyNTMnLAogICAgJ3dpbmRvd3MtMTI1Myc6ICAgICAgICAnd2luZG93cy0xMjUzJywKICAgICd4LWNwMTI1Myc6ICAgICAgICAgICAgJ3dpbmRvd3MtMTI1MycsCiAgICAnY3AxMjU0JzogICAgICAgICAgICAgICd3aW5kb3dzLTEyNTQnLAogICAgJ2NzaXNvbGF0aW41JzogICAgICAgICAnd2luZG93cy0xMjU0JywKICAgICdpc28tODg1OS05JzogICAgICAgICAgJ3dpbmRvd3MtMTI1NCcsCiAgICAnaXNvLWlyLTE0OCc6ICAgICAgICAgICd3aW5kb3dzLTEyNTQnLAogICAgJ2lzbzg4NTktOSc6ICAgICAgICAgICAnd2luZG93cy0xMjU0JywKICAgICdpc284ODU5OSc6ICAgICAgICAgICAgJ3dpbmRvd3MtMTI1NCcsCiAgICAnaXNvXzg4NTktOSc6ICAgICAgICAgICd3aW5kb3dzLTEyNTQnLAogICAgJ2lzb184ODU5LTk6MTk4OSc6ICAgICAnd2luZG93cy0xMjU0JywKICAgICdsNSc6ICAgICAgICAgICAgICAgICAgJ3dpbmRvd3MtMTI1NCcsCiAgICAnbGF0aW41JzogICAgICAgICAgICAgICd3aW5kb3dzLTEyNTQnLAogICAgJ3dpbmRvd3MtMTI1NCc6ICAgICAgICAnd2luZG93cy0xMjU0JywKICAgICd4LWNwMTI1NCc6ICAgICAgICAgICAgJ3dpbmRvd3MtMTI1NCcsCiAgICAnY3AxMjU1JzogICAgICAgICAgICAgICd3aW5kb3dzLTEyNTUnLAogICAgJ3dpbmRvd3MtMTI1NSc6ICAgICAgICAnd2luZG93cy0xMjU1JywKICAgICd4LWNwMTI1NSc6ICAgICAgICAgICAgJ3dpbmRvd3MtMTI1NScsCiAgICAnY3AxMjU2JzogICAgICAgICAgICAgICd3aW5kb3dzLTEyNTYnLAogICAgJ3dpbmRvd3MtMTI1Nic6ICAgICAgICAnd2luZG93cy0xMjU2JywKICAgICd4LWNwMTI1Nic6ICAgICAgICAgICAgJ3dpbmRvd3MtMTI1NicsCiAgICAnY3AxMjU3JzogICAgICAgICAgICAgICd3aW5kb3dzLTEyNTcnLAogICAgJ3dpbmRvd3MtMTI1Nyc6ICAgICAgICAnd2luZG93cy0xMjU3JywKICAgICd4LWNwMTI1Nyc6ICAgICAgICAgICAgJ3dpbmRvd3MtMTI1NycsCiAgICAnY3AxMjU4JzogICAgICAgICAgICAgICd3aW5kb3dzLTEyNTgnLAogICAgJ3dpbmRvd3MtMTI1OCc6ICAgICAgICAnd2luZG93cy0xMjU4JywKICAgICd4LWNwMTI1OCc6ICAgICAgICAgICAgJ3dpbmRvd3MtMTI1OCcsCiAgICAneC1tYWMtY3lyaWxsaWMnOiAgICAgICd4LW1hYy1jeXJpbGxpYycsCiAgICAneC1tYWMtdWtyYWluaWFuJzogICAgICd4LW1hYy1jeXJpbGxpYycsCiAgICAnY2hpbmVzZSc6ICAgICAgICAgICAgICdnYmsnLAogICAgJ2NzZ2IyMzEyJzogICAgICAgICAgICAnZ2JrJywKICAgICdjc2lzbzU4Z2IyMzEyODAnOiAgICAgJ2diaycsCiAgICAnZ2IyMzEyJzogICAgICAgICAgICAgICdnYmsnLAogICAgJ2diXzIzMTInOiAgICAgICAgICAgICAnZ2JrJywKICAgICdnYl8yMzEyLTgwJzogICAgICAgICAgJ2diaycsCiAgICAnZ2JrJzogICAgICAgICAgICAgICAgICdnYmsnLAogICAgJ2lzby1pci01OCc6ICAgICAgICAgICAnZ2JrJywKICAgICd4LWdiayc6ICAgICAgICAgICAgICAgJ2diaycsCiAgICAnZ2IxODAzMCc6ICAgICAgICAgICAgICdnYjE4MDMwJywKICAgICdoei1nYi0yMzEyJzogICAgICAgICAgJ2h6LWdiLTIzMTInLAogICAgJ2JpZzUnOiAgICAgICAgICAgICAgICAnYmlnNScsCiAgICAnYmlnNS1oa3Njcyc6ICAgICAgICAgICdiaWc1JywKICAgICdjbi1iaWc1JzogICAgICAgICAgICAgJ2JpZzUnLAogICAgJ2NzYmlnNSc6ICAgICAgICAgICAgICAnYmlnNScsCiAgICAneC14LWJpZzUnOiAgICAgICAgICAgICdiaWc1JywKICAgICdjc2V1Y3BrZGZtdGphcGFuZXNlJzogJ2V1Yy1qcCcsCiAgICAnZXVjLWpwJzogICAgICAgICAgICAgICdldWMtanAnLAogICAgJ3gtZXVjLWpwJzogICAgICAgICAgICAnZXVjLWpwJywKICAgICdjc2lzbzIwMjJqcCc6ICAgICAgICAgJ2lzby0yMDIyLWpwJywKICAgICdpc28tMjAyMi1qcCc6ICAgICAgICAgJ2lzby0yMDIyLWpwJywKICAgICdjc3NoaWZ0amlzJzogICAgICAgICAgJ3NoaWZ0X2ppcycsCiAgICAnbXNfa2FuamknOiAgICAgICAgICAgICdzaGlmdF9qaXMnLAogICAgJ3NoaWZ0LWppcyc6ICAgICAgICAgICAnc2hpZnRfamlzJywKICAgICdzaGlmdF9qaXMnOiAgICAgICAgICAgJ3NoaWZ0X2ppcycsCiAgICAnc2ppcyc6ICAgICAgICAgICAgICAgICdzaGlmdF9qaXMnLAogICAgJ3dpbmRvd3MtMzFqJzogICAgICAgICAnc2hpZnRfamlzJywKICAgICd4LXNqaXMnOiAgICAgICAgICAgICAgJ3NoaWZ0X2ppcycsCiAgICAnY3NldWNrcic6ICAgICAgICAgICAgICdldWMta3InLAogICAgJ2Nza3NjNTYwMTE5ODcnOiAgICAgICAnZXVjLWtyJywKICAgICdldWMta3InOiAgICAgICAgICAgICAgJ2V1Yy1rcicsCiAgICAnaXNvLWlyLTE0OSc6ICAgICAgICAgICdldWMta3InLAogICAgJ2tvcmVhbic6ICAgICAgICAgICAgICAnZXVjLWtyJywKICAgICdrc19jXzU2MDEtMTk4Nyc6ICAgICAgJ2V1Yy1rcicsCiAgICAna3NfY181NjAxLTE5ODknOiAgICAgICdldWMta3InLAogICAgJ2tzYzU2MDEnOiAgICAgICAgICAgICAnZXVjLWtyJywKICAgICdrc2NfNTYwMSc6ICAgICAgICAgICAgJ2V1Yy1rcicsCiAgICAnd2luZG93cy05NDknOiAgICAgICAgICdldWMta3InLAogICAgJ2NzaXNvMjAyMmtyJzogICAgICAgICAnaXNvLTIwMjIta3InLAogICAgJ2lzby0yMDIyLWtyJzogICAgICAgICAnaXNvLTIwMjIta3InLAogICAgJ3V0Zi0xNmJlJzogICAgICAgICAgICAndXRmLTE2YmUnLAogICAgJ3V0Zi0xNic6ICAgICAgICAgICAgICAndXRmLTE2bGUnLAogICAgJ3V0Zi0xNmxlJzogICAgICAgICAgICAndXRmLTE2bGUnLAogICAgJ3gtdXNlci1kZWZpbmVkJzogICAgICAneC11c2VyLWRlZmluZWQnLAp9ClBLAwQUAAAAAAAAACEAUH8xHxkFAAAZBQAAQQAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3Ivd2ViZW5jb2RpbmdzL21rbGFiZWxzLnB5IiIiCgogICAgd2ViZW5jb2RpbmdzLm1rbGFiZWxzCiAgICB+fn5+fn5+fn5+fn5+fn5+fn5+fn4KCiAgICBSZWdlbmFyYXRlIHRoZSB3ZWJlbmNvZGluZ3MubGFiZWxzIG1vZHVsZS4KCiAgICA6Y29weXJpZ2h0OiBDb3B5cmlnaHQgMjAxMiBieSBTaW1vbiBTYXBpbgogICAgOmxpY2Vuc2U6IEJTRCwgc2VlIExJQ0VOU0UgZm9yIGRldGFpbHMuCgoiIiIKCmltcG9ydCBqc29uCnRyeToKICAgIGZyb20gdXJsbGliIGltcG9ydCB1cmxvcGVuCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGZyb20gdXJsbGliLnJlcXVlc3QgaW1wb3J0IHVybG9wZW4KCgpkZWYgYXNzZXJ0X2xvd2VyKHN0cmluZyk6CiAgICBhc3NlcnQgc3RyaW5nID09IHN0cmluZy5sb3dlcigpCiAgICByZXR1cm4gc3RyaW5nCgoKZGVmIGdlbmVyYXRlKHVybCk6CiAgICBwYXJ0cyA9IFsnJydcCiIiIgoKICAgIHdlYmVuY29kaW5ncy5sYWJlbHMKICAgIH5+fn5+fn5+fn5+fn5+fn5+fn4KCiAgICBNYXAgZW5jb2RpbmcgbGFiZWxzIHRvIHRoZWlyIG5hbWUuCgogICAgOmNvcHlyaWdodDogQ29weXJpZ2h0IDIwMTIgYnkgU2ltb24gU2FwaW4KICAgIDpsaWNlbnNlOiBCU0QsIHNlZSBMSUNFTlNFIGZvciBkZXRhaWxzLgoKIiIiCgojIFhYWCBEbyBub3QgZWRpdCEKIyBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgbWtsYWJlbHMucHkKCkxBQkVMUyA9IHsKJycnXQogICAgbGFiZWxzID0gWwogICAgICAgIChyZXByKGFzc2VydF9sb3dlcihsYWJlbCkpLmxzdHJpcCgndScpLAogICAgICAgICByZXByKGVuY29kaW5nWyduYW1lJ10pLmxzdHJpcCgndScpKQogICAgICAgIGZvciBjYXRlZ29yeSBpbiBqc29uLmxvYWRzKHVybG9wZW4odXJsKS5yZWFkKCkuZGVjb2RlKCdhc2NpaScpKQogICAgICAgIGZvciBlbmNvZGluZyBpbiBjYXRlZ29yeVsnZW5jb2RpbmdzJ10KICAgICAgICBmb3IgbGFiZWwgaW4gZW5jb2RpbmdbJ2xhYmVscyddXQogICAgbWF4X2xlbiA9IG1heChsZW4obGFiZWwpIGZvciBsYWJlbCwgbmFtZSBpbiBsYWJlbHMpCiAgICBwYXJ0cy5leHRlbmQoCiAgICAgICAgJyAgICAlczolcyAlcyxcbicgJSAobGFiZWwsICcgJyAqIChtYXhfbGVuIC0gbGVuKGxhYmVsKSksIG5hbWUpCiAgICAgICAgZm9yIGxhYmVsLCBuYW1lIGluIGxhYmVscykKICAgIHBhcnRzLmFwcGVuZCgnfScpCiAgICByZXR1cm4gJycuam9pbihwYXJ0cykKCgppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgcHJpbnQoZ2VuZXJhdGUoJ2h0dHA6Ly9lbmNvZGluZy5zcGVjLndoYXR3Zy5vcmcvZW5jb2RpbmdzLmpzb24nKSkKUEsDBBQAAAAAAAAAIQAWmz4dohkAAKIZAAA+AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci93ZWJlbmNvZGluZ3MvdGVzdHMucHkjIGNvZGluZzogdXRmOAoiIiIKCiAgICB3ZWJlbmNvZGluZ3MudGVzdHMKICAgIH5+fn5+fn5+fn5+fn5+fn5+fgoKICAgIEEgYmFzaWMgdGVzdCBzdWl0ZSBmb3IgRW5jb2RpbmcuCgogICAgOmNvcHlyaWdodDogQ29weXJpZ2h0IDIwMTIgYnkgU2ltb24gU2FwaW4KICAgIDpsaWNlbnNlOiBCU0QsIHNlZSBMSUNFTlNFIGZvciBkZXRhaWxzLgoKIiIiCgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHVuaWNvZGVfbGl0ZXJhbHMKCmZyb20gLiBpbXBvcnQgKGxvb2t1cCwgTEFCRUxTLCBkZWNvZGUsIGVuY29kZSwgaXRlcl9kZWNvZGUsIGl0ZXJfZW5jb2RlLAogICAgICAgICAgICAgICBJbmNyZW1lbnRhbERlY29kZXIsIEluY3JlbWVudGFsRW5jb2RlciwgVVRGOCkKCgpkZWYgYXNzZXJ0X3JhaXNlcyhleGNlcHRpb24sIGZ1bmN0aW9uLCAqYXJncywgKiprd2FyZ3MpOgogICAgdHJ5OgogICAgICAgIGZ1bmN0aW9uKCphcmdzLCAqKmt3YXJncykKICAgIGV4Y2VwdCBleGNlcHRpb246CiAgICAgICAgcmV0dXJuCiAgICBlbHNlOiAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoJ0RpZCBub3QgcmFpc2UgJXMuJyAlIGV4Y2VwdGlvbikKCgpkZWYgdGVzdF9sYWJlbHMoKToKICAgIGFzc2VydCBsb29rdXAoJ3V0Zi04JykubmFtZSA9PSAndXRmLTgnCiAgICBhc3NlcnQgbG9va3VwKCdVdGYtOCcpLm5hbWUgPT0gJ3V0Zi04JwogICAgYXNzZXJ0IGxvb2t1cCgnVVRGLTgnKS5uYW1lID09ICd1dGYtOCcKICAgIGFzc2VydCBsb29rdXAoJ3V0ZjgnKS5uYW1lID09ICd1dGYtOCcKICAgIGFzc2VydCBsb29rdXAoJ3V0ZjgnKS5uYW1lID09ICd1dGYtOCcKICAgIGFzc2VydCBsb29rdXAoJ3V0ZjggJykubmFtZSA9PSAndXRmLTgnCiAgICBhc3NlcnQgbG9va3VwKCcgXHJcbnV0ZjhcdCcpLm5hbWUgPT0gJ3V0Zi04JwogICAgYXNzZXJ0IGxvb2t1cCgndTgnKSBpcyBOb25lICAjIFB5dGhvbiBsYWJlbC4KICAgIGFzc2VydCBsb29rdXAoJ3V0Zi04wqAnKSBpcyBOb25lICAjIE5vbi1BU0NJSSB3aGl0ZSBzcGFjZS4KCiAgICBhc3NlcnQgbG9va3VwKCdVUy1BU0NJSScpLm5hbWUgPT0gJ3dpbmRvd3MtMTI1MicKICAgIGFzc2VydCBsb29rdXAoJ2lzby04ODU5LTEnKS5uYW1lID09ICd3aW5kb3dzLTEyNTInCiAgICBhc3NlcnQgbG9va3VwKCdsYXRpbjEnKS5uYW1lID09ICd3aW5kb3dzLTEyNTInCiAgICBhc3NlcnQgbG9va3VwKCdMQVRJTjEnKS5uYW1lID09ICd3aW5kb3dzLTEyNTInCiAgICBhc3NlcnQgbG9va3VwKCdsYXRpbi0xJykgaXMgTm9uZQogICAgYXNzZXJ0IGxvb2t1cCgnTEFUxLBOMScpIGlzIE5vbmUgICMgQVNDSUktb25seSBjYXNlIGluc2Vuc2l0aXZpdHkuCgoKZGVmIHRlc3RfYWxsX2xhYmVscygpOgogICAgZm9yIGxhYmVsIGluIExBQkVMUzoKICAgICAgICBhc3NlcnQgZGVjb2RlKGInJywgbGFiZWwpID09ICgnJywgbG9va3VwKGxhYmVsKSkKICAgICAgICBhc3NlcnQgZW5jb2RlKCcnLCBsYWJlbCkgPT0gYicnCiAgICAgICAgZm9yIHJlcGVhdCBpbiBbMCwgMSwgMTJdOgogICAgICAgICAgICBvdXRwdXQsIF8gPSBpdGVyX2RlY29kZShbYicnXSAqIHJlcGVhdCwgbGFiZWwpCiAgICAgICAgICAgIGFzc2VydCBsaXN0KG91dHB1dCkgPT0gW10KICAgICAgICAgICAgYXNzZXJ0IGxpc3QoaXRlcl9lbmNvZGUoWycnXSAqIHJlcGVhdCwgbGFiZWwpKSA9PSBbXQogICAgICAgIGRlY29kZXIgPSBJbmNyZW1lbnRhbERlY29kZXIobGFiZWwpCiAgICAgICAgYXNzZXJ0IGRlY29kZXIuZGVjb2RlKGInJykgPT0gJycKICAgICAgICBhc3NlcnQgZGVjb2Rlci5kZWNvZGUoYicnLCBmaW5hbD1UcnVlKSA9PSAnJwogICAgICAgIGVuY29kZXIgPSBJbmNyZW1lbnRhbEVuY29kZXIobGFiZWwpCiAgICAgICAgYXNzZXJ0IGVuY29kZXIuZW5jb2RlKCcnKSA9PSBiJycKICAgICAgICBhc3NlcnQgZW5jb2Rlci5lbmNvZGUoJycsIGZpbmFsPVRydWUpID09IGInJwogICAgIyBBbGwgZW5jb2RpbmcgbmFtZXMgYXJlIHZhbGlkIGxhYmVscyB0b286CiAgICBmb3IgbmFtZSBpbiBzZXQoTEFCRUxTLnZhbHVlcygpKToKICAgICAgICBhc3NlcnQgbG9va3VwKG5hbWUpLm5hbWUgPT0gbmFtZQoKCmRlZiB0ZXN0X2ludmFsaWRfbGFiZWwoKToKICAgIGFzc2VydF9yYWlzZXMoTG9va3VwRXJyb3IsIGRlY29kZSwgYidceEVGXHhCQlx4QkZceGMzXHhhOScsICdpbnZhbGlkJykKICAgIGFzc2VydF9yYWlzZXMoTG9va3VwRXJyb3IsIGVuY29kZSwgJ8OpJywgJ2ludmFsaWQnKQogICAgYXNzZXJ0X3JhaXNlcyhMb29rdXBFcnJvciwgaXRlcl9kZWNvZGUsIFtdLCAnaW52YWxpZCcpCiAgICBhc3NlcnRfcmFpc2VzKExvb2t1cEVycm9yLCBpdGVyX2VuY29kZSwgW10sICdpbnZhbGlkJykKICAgIGFzc2VydF9yYWlzZXMoTG9va3VwRXJyb3IsIEluY3JlbWVudGFsRGVjb2RlciwgJ2ludmFsaWQnKQogICAgYXNzZXJ0X3JhaXNlcyhMb29rdXBFcnJvciwgSW5jcmVtZW50YWxFbmNvZGVyLCAnaW52YWxpZCcpCgoKZGVmIHRlc3RfZGVjb2RlKCk6CiAgICBhc3NlcnQgZGVjb2RlKGInXHg4MCcsICdsYXRpbjEnKSA9PSAoJ+KCrCcsIGxvb2t1cCgnbGF0aW4xJykpCiAgICBhc3NlcnQgZGVjb2RlKGInXHg4MCcsIGxvb2t1cCgnbGF0aW4xJykpID09ICgn4oKsJywgbG9va3VwKCdsYXRpbjEnKSkKICAgIGFzc2VydCBkZWNvZGUoYidceGMzXHhhOScsICd1dGY4JykgPT0gKCfDqScsIGxvb2t1cCgndXRmOCcpKQogICAgYXNzZXJ0IGRlY29kZShiJ1x4YzNceGE5JywgVVRGOCkgPT0gKCfDqScsIGxvb2t1cCgndXRmOCcpKQogICAgYXNzZXJ0IGRlY29kZShiJ1x4YzNceGE5JywgJ2FzY2lpJykgPT0gKCfDg8KpJywgbG9va3VwKCdhc2NpaScpKQogICAgYXNzZXJ0IGRlY29kZShiJ1x4RUZceEJCXHhCRlx4YzNceGE5JywgJ2FzY2lpJykgPT0gKCfDqScsIGxvb2t1cCgndXRmOCcpKSAgIyBVVEYtOCB3aXRoIEJPTQoKICAgIGFzc2VydCBkZWNvZGUoYidceEZFXHhGRlx4MDBceGU5JywgJ2FzY2lpJykgPT0gKCfDqScsIGxvb2t1cCgndXRmLTE2YmUnKSkgICMgVVRGLTE2LUJFIHdpdGggQk9NCiAgICBhc3NlcnQgZGVjb2RlKGInXHhGRlx4RkVceGU5XHgwMCcsICdhc2NpaScpID09ICgnw6knLCBsb29rdXAoJ3V0Zi0xNmxlJykpICAjIFVURi0xNi1MRSB3aXRoIEJPTQogICAgYXNzZXJ0IGRlY29kZShiJ1x4RkVceEZGXHhlOVx4MDAnLCAnYXNjaWknKSA9PSAoJ1x1ZTkwMCcsIGxvb2t1cCgndXRmLTE2YmUnKSkKICAgIGFzc2VydCBkZWNvZGUoYidceEZGXHhGRVx4MDBceGU5JywgJ2FzY2lpJykgPT0gKCdcdWU5MDAnLCBsb29rdXAoJ3V0Zi0xNmxlJykpCgogICAgYXNzZXJ0IGRlY29kZShiJ1x4MDBceGU5JywgJ1VURi0xNkJFJykgPT0gKCfDqScsIGxvb2t1cCgndXRmLTE2YmUnKSkKICAgIGFzc2VydCBkZWNvZGUoYidceGU5XHgwMCcsICdVVEYtMTZMRScpID09ICgnw6knLCBsb29rdXAoJ3V0Zi0xNmxlJykpCiAgICBhc3NlcnQgZGVjb2RlKGInXHhlOVx4MDAnLCAnVVRGLTE2JykgPT0gKCfDqScsIGxvb2t1cCgndXRmLTE2bGUnKSkKCiAgICBhc3NlcnQgZGVjb2RlKGInXHhlOVx4MDAnLCAnVVRGLTE2QkUnKSA9PSAoJ1x1ZTkwMCcsIGxvb2t1cCgndXRmLTE2YmUnKSkKICAgIGFzc2VydCBkZWNvZGUoYidceDAwXHhlOScsICdVVEYtMTZMRScpID09ICgnXHVlOTAwJywgbG9va3VwKCd1dGYtMTZsZScpKQogICAgYXNzZXJ0IGRlY29kZShiJ1x4MDBceGU5JywgJ1VURi0xNicpID09ICgnXHVlOTAwJywgbG9va3VwKCd1dGYtMTZsZScpKQoKCmRlZiB0ZXN0X2VuY29kZSgpOgogICAgYXNzZXJ0IGVuY29kZSgnw6knLCAnbGF0aW4xJykgPT0gYidceGU5JwogICAgYXNzZXJ0IGVuY29kZSgnw6knLCAndXRmOCcpID09IGInXHhjM1x4YTknCiAgICBhc3NlcnQgZW5jb2RlKCfDqScsICd1dGY4JykgPT0gYidceGMzXHhhOScKICAgIGFzc2VydCBlbmNvZGUoJ8OpJywgJ3V0Zi0xNicpID09IGInXHhlOVx4MDAnCiAgICBhc3NlcnQgZW5jb2RlKCfDqScsICd1dGYtMTZsZScpID09IGInXHhlOVx4MDAnCiAgICBhc3NlcnQgZW5jb2RlKCfDqScsICd1dGYtMTZiZScpID09IGInXHgwMFx4ZTknCgoKZGVmIHRlc3RfaXRlcl9kZWNvZGUoKToKICAgIGRlZiBpdGVyX2RlY29kZV90b19zdHJpbmcoaW5wdXQsIGZhbGxiYWNrX2VuY29kaW5nKToKICAgICAgICBvdXRwdXQsIF9lbmNvZGluZyA9IGl0ZXJfZGVjb2RlKGlucHV0LCBmYWxsYmFja19lbmNvZGluZykKICAgICAgICByZXR1cm4gJycuam9pbihvdXRwdXQpCiAgICBhc3NlcnQgaXRlcl9kZWNvZGVfdG9fc3RyaW5nKFtdLCAnbGF0aW4xJykgPT0gJycKICAgIGFzc2VydCBpdGVyX2RlY29kZV90b19zdHJpbmcoW2InJ10sICdsYXRpbjEnKSA9PSAnJwogICAgYXNzZXJ0IGl0ZXJfZGVjb2RlX3RvX3N0cmluZyhbYidceGU5J10sICdsYXRpbjEnKSA9PSAnw6knCiAgICBhc3NlcnQgaXRlcl9kZWNvZGVfdG9fc3RyaW5nKFtiJ2hlbGxvJ10sICdsYXRpbjEnKSA9PSAnaGVsbG8nCiAgICBhc3NlcnQgaXRlcl9kZWNvZGVfdG9fc3RyaW5nKFtiJ2hlJywgYidsbG8nXSwgJ2xhdGluMScpID09ICdoZWxsbycKICAgIGFzc2VydCBpdGVyX2RlY29kZV90b19zdHJpbmcoW2InaGVsbCcsIGInbyddLCAnbGF0aW4xJykgPT0gJ2hlbGxvJwogICAgYXNzZXJ0IGl0ZXJfZGVjb2RlX3RvX3N0cmluZyhbYidceGMzXHhhOSddLCAnbGF0aW4xJykgPT0gJ8ODwqknCiAgICBhc3NlcnQgaXRlcl9kZWNvZGVfdG9fc3RyaW5nKFtiJ1x4RUZceEJCXHhCRlx4YzNceGE5J10sICdsYXRpbjEnKSA9PSAnw6knCiAgICBhc3NlcnQgaXRlcl9kZWNvZGVfdG9fc3RyaW5nKFsKICAgICAgICBiJ1x4RUZceEJCXHhCRicsIGInXHhjMycsIGInXHhhOSddLCAnbGF0aW4xJykgPT0gJ8OpJwogICAgYXNzZXJ0IGl0ZXJfZGVjb2RlX3RvX3N0cmluZyhbCiAgICAgICAgYidceEVGXHhCQlx4QkYnLCBiJ2EnLCBiJ1x4YzMnXSwgJ2xhdGluMScpID09ICdhXHVGRkZEJwogICAgYXNzZXJ0IGl0ZXJfZGVjb2RlX3RvX3N0cmluZyhbCiAgICAgICAgYicnLCBiJ1x4RUYnLCBiJycsIGInJywgYidceEJCXHhCRlx4YzMnLCBiJ1x4YTknXSwgJ2xhdGluMScpID09ICfDqScKICAgIGFzc2VydCBpdGVyX2RlY29kZV90b19zdHJpbmcoW2InXHhFRlx4QkJceEJGJ10sICdsYXRpbjEnKSA9PSAnJwogICAgYXNzZXJ0IGl0ZXJfZGVjb2RlX3RvX3N0cmluZyhbYidceEVGXHhCQiddLCAnbGF0aW4xJykgPT0gJ8OvwrsnCiAgICBhc3NlcnQgaXRlcl9kZWNvZGVfdG9fc3RyaW5nKFtiJ1x4RkVceEZGXHgwMFx4ZTknXSwgJ2xhdGluMScpID09ICfDqScKICAgIGFzc2VydCBpdGVyX2RlY29kZV90b19zdHJpbmcoW2InXHhGRlx4RkVceGU5XHgwMCddLCAnbGF0aW4xJykgPT0gJ8OpJwogICAgYXNzZXJ0IGl0ZXJfZGVjb2RlX3RvX3N0cmluZyhbCiAgICAgICAgYicnLCBiJ1x4RkYnLCBiJycsIGInJywgYidceEZFXHhlOScsIGInXHgwMCddLCAnbGF0aW4xJykgPT0gJ8OpJwogICAgYXNzZXJ0IGl0ZXJfZGVjb2RlX3RvX3N0cmluZyhbCiAgICAgICAgYicnLCBiJ2hceGU5JywgYidsbG8nXSwgJ3gtdXNlci1kZWZpbmVkJykgPT0gJ2hcdUY3RTlsbG8nCgoKZGVmIHRlc3RfaXRlcl9lbmNvZGUoKToKICAgIGFzc2VydCBiJycuam9pbihpdGVyX2VuY29kZShbXSwgJ2xhdGluMScpKSA9PSBiJycKICAgIGFzc2VydCBiJycuam9pbihpdGVyX2VuY29kZShbJyddLCAnbGF0aW4xJykpID09IGInJwogICAgYXNzZXJ0IGInJy5qb2luKGl0ZXJfZW5jb2RlKFsnw6knXSwgJ2xhdGluMScpKSA9PSBiJ1x4ZTknCiAgICBhc3NlcnQgYicnLmpvaW4oaXRlcl9lbmNvZGUoWycnLCAnw6knLCAnJywgJyddLCAnbGF0aW4xJykpID09IGInXHhlOScKICAgIGFzc2VydCBiJycuam9pbihpdGVyX2VuY29kZShbJycsICfDqScsICcnLCAnJ10sICd1dGYtMTYnKSkgPT0gYidceGU5XHgwMCcKICAgIGFzc2VydCBiJycuam9pbihpdGVyX2VuY29kZShbJycsICfDqScsICcnLCAnJ10sICd1dGYtMTZsZScpKSA9PSBiJ1x4ZTlceDAwJwogICAgYXNzZXJ0IGInJy5qb2luKGl0ZXJfZW5jb2RlKFsnJywgJ8OpJywgJycsICcnXSwgJ3V0Zi0xNmJlJykpID09IGInXHgwMFx4ZTknCiAgICBhc3NlcnQgYicnLmpvaW4oaXRlcl9lbmNvZGUoWwogICAgICAgICcnLCAnaFx1RjdFOScsICcnLCAnbGxvJ10sICd4LXVzZXItZGVmaW5lZCcpKSA9PSBiJ2hceGU5bGxvJwoKCmRlZiB0ZXN0X3hfdXNlcl9kZWZpbmVkKCk6CiAgICBlbmNvZGVkID0gYicyLFx4MGNceDBiXHgxYU9ceGQ5I1x4Y2JceDBmXHhjOVx4YmJ0XHhjZlx4YThceGNhJwogICAgZGVjb2RlZCA9ICcyLFx4MGNceDBiXHgxYU9cdWY3ZDkjXHVmN2NiXHgwZlx1ZjdjOVx1ZjdiYnRcdWY3Y2ZcdWY3YThcdWY3Y2EnCiAgICBlbmNvZGVkID0gYidhYScKICAgIGRlY29kZWQgPSAnYWEnCiAgICBhc3NlcnQgZGVjb2RlKGVuY29kZWQsICd4LXVzZXItZGVmaW5lZCcpID09IChkZWNvZGVkLCBsb29rdXAoJ3gtdXNlci1kZWZpbmVkJykpCiAgICBhc3NlcnQgZW5jb2RlKGRlY29kZWQsICd4LXVzZXItZGVmaW5lZCcpID09IGVuY29kZWQKUEsDBBQAAAAAAAAAIQBIb0W+0hAAANIQAABHAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci93ZWJlbmNvZGluZ3MveF91c2VyX2RlZmluZWQucHkjIGNvZGluZzogdXRmOAoiIiIKCiAgICB3ZWJlbmNvZGluZ3MueF91c2VyX2RlZmluZWQKICAgIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgoKICAgIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSB4LXVzZXItZGVmaW5lZCBlbmNvZGluZy4KCiAgICA6Y29weXJpZ2h0OiBDb3B5cmlnaHQgMjAxMiBieSBTaW1vbiBTYXBpbgogICAgOmxpY2Vuc2U6IEJTRCwgc2VlIExJQ0VOU0UgZm9yIGRldGFpbHMuCgoiIiIKCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgdW5pY29kZV9saXRlcmFscwoKaW1wb3J0IGNvZGVjcwoKCiMjIyBDb2RlYyBBUElzCgpjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgoKICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGVycm9ycz0nc3RyaWN0Jyk6CiAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCwgZXJyb3JzLCBlbmNvZGluZ190YWJsZSkKCiAgICBkZWYgZGVjb2RlKHNlbGYsIGlucHV0LCBlcnJvcnM9J3N0cmljdCcpOgogICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsIGVycm9ycywgZGVjb2RpbmdfdGFibGUpCgoKY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgogICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgogICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsIHNlbGYuZXJyb3JzLCBlbmNvZGluZ190YWJsZSlbMF0KCgpjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CiAgICBkZWYgZGVjb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CiAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCwgc2VsZi5lcnJvcnMsIGRlY29kaW5nX3RhYmxlKVswXQoKCmNsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgY29kZWNzLlN0cmVhbVdyaXRlcik6CiAgICBwYXNzCgoKY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLCBjb2RlY3MuU3RyZWFtUmVhZGVyKToKICAgIHBhc3MKCgojIyMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKCmNvZGVjX2luZm8gPSBjb2RlY3MuQ29kZWNJbmZvKAogICAgbmFtZT0neC11c2VyLWRlZmluZWQnLAogICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAogICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAogICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCiAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAogICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKQoKCiMjIyBEZWNvZGluZyBUYWJsZQoKIyBQeXRob24gMzoKIyBmb3IgYyBpbiByYW5nZSgyNTYpOiBwcmludCgnICAgICVyJyAlIGNocihjIGlmIGMgPCAxMjggZWxzZSBjICsgMHhGNzAwKSkKZGVjb2RpbmdfdGFibGUgPSAoCiAgICAnXHgwMCcKICAgICdceDAxJwogICAgJ1x4MDInCiAgICAnXHgwMycKICAgICdceDA0JwogICAgJ1x4MDUnCiAgICAnXHgwNicKICAgICdceDA3JwogICAgJ1x4MDgnCiAgICAnXHQnCiAgICAnXG4nCiAgICAnXHgwYicKICAgICdceDBjJwogICAgJ1xyJwogICAgJ1x4MGUnCiAgICAnXHgwZicKICAgICdceDEwJwogICAgJ1x4MTEnCiAgICAnXHgxMicKICAgICdceDEzJwogICAgJ1x4MTQnCiAgICAnXHgxNScKICAgICdceDE2JwogICAgJ1x4MTcnCiAgICAnXHgxOCcKICAgICdceDE5JwogICAgJ1x4MWEnCiAgICAnXHgxYicKICAgICdceDFjJwogICAgJ1x4MWQnCiAgICAnXHgxZScKICAgICdceDFmJwogICAgJyAnCiAgICAnIScKICAgICciJwogICAgJyMnCiAgICAnJCcKICAgICclJwogICAgJyYnCiAgICAiJyIKICAgICcoJwogICAgJyknCiAgICAnKicKICAgICcrJwogICAgJywnCiAgICAnLScKICAgICcuJwogICAgJy8nCiAgICAnMCcKICAgICcxJwogICAgJzInCiAgICAnMycKICAgICc0JwogICAgJzUnCiAgICAnNicKICAgICc3JwogICAgJzgnCiAgICAnOScKICAgICc6JwogICAgJzsnCiAgICAnPCcKICAgICc9JwogICAgJz4nCiAgICAnPycKICAgICdAJwogICAgJ0EnCiAgICAnQicKICAgICdDJwogICAgJ0QnCiAgICAnRScKICAgICdGJwogICAgJ0cnCiAgICAnSCcKICAgICdJJwogICAgJ0onCiAgICAnSycKICAgICdMJwogICAgJ00nCiAgICAnTicKICAgICdPJwogICAgJ1AnCiAgICAnUScKICAgICdSJwogICAgJ1MnCiAgICAnVCcKICAgICdVJwogICAgJ1YnCiAgICAnVycKICAgICdYJwogICAgJ1knCiAgICAnWicKICAgICdbJwogICAgJ1xcJwogICAgJ10nCiAgICAnXicKICAgICdfJwogICAgJ2AnCiAgICAnYScKICAgICdiJwogICAgJ2MnCiAgICAnZCcKICAgICdlJwogICAgJ2YnCiAgICAnZycKICAgICdoJwogICAgJ2knCiAgICAnaicKICAgICdrJwogICAgJ2wnCiAgICAnbScKICAgICduJwogICAgJ28nCiAgICAncCcKICAgICdxJwogICAgJ3InCiAgICAncycKICAgICd0JwogICAgJ3UnCiAgICAndicKICAgICd3JwogICAgJ3gnCiAgICAneScKICAgICd6JwogICAgJ3snCiAgICAnfCcKICAgICd9JwogICAgJ34nCiAgICAnXHg3ZicKICAgICdcdWY3ODAnCiAgICAnXHVmNzgxJwogICAgJ1x1Zjc4MicKICAgICdcdWY3ODMnCiAgICAnXHVmNzg0JwogICAgJ1x1Zjc4NScKICAgICdcdWY3ODYnCiAgICAnXHVmNzg3JwogICAgJ1x1Zjc4OCcKICAgICdcdWY3ODknCiAgICAnXHVmNzhhJwogICAgJ1x1Zjc4YicKICAgICdcdWY3OGMnCiAgICAnXHVmNzhkJwogICAgJ1x1Zjc4ZScKICAgICdcdWY3OGYnCiAgICAnXHVmNzkwJwogICAgJ1x1Zjc5MScKICAgICdcdWY3OTInCiAgICAnXHVmNzkzJwogICAgJ1x1Zjc5NCcKICAgICdcdWY3OTUnCiAgICAnXHVmNzk2JwogICAgJ1x1Zjc5NycKICAgICdcdWY3OTgnCiAgICAnXHVmNzk5JwogICAgJ1x1Zjc5YScKICAgICdcdWY3OWInCiAgICAnXHVmNzljJwogICAgJ1x1Zjc5ZCcKICAgICdcdWY3OWUnCiAgICAnXHVmNzlmJwogICAgJ1x1ZjdhMCcKICAgICdcdWY3YTEnCiAgICAnXHVmN2EyJwogICAgJ1x1ZjdhMycKICAgICdcdWY3YTQnCiAgICAnXHVmN2E1JwogICAgJ1x1ZjdhNicKICAgICdcdWY3YTcnCiAgICAnXHVmN2E4JwogICAgJ1x1ZjdhOScKICAgICdcdWY3YWEnCiAgICAnXHVmN2FiJwogICAgJ1x1ZjdhYycKICAgICdcdWY3YWQnCiAgICAnXHVmN2FlJwogICAgJ1x1ZjdhZicKICAgICdcdWY3YjAnCiAgICAnXHVmN2IxJwogICAgJ1x1ZjdiMicKICAgICdcdWY3YjMnCiAgICAnXHVmN2I0JwogICAgJ1x1ZjdiNScKICAgICdcdWY3YjYnCiAgICAnXHVmN2I3JwogICAgJ1x1ZjdiOCcKICAgICdcdWY3YjknCiAgICAnXHVmN2JhJwogICAgJ1x1ZjdiYicKICAgICdcdWY3YmMnCiAgICAnXHVmN2JkJwogICAgJ1x1ZjdiZScKICAgICdcdWY3YmYnCiAgICAnXHVmN2MwJwogICAgJ1x1ZjdjMScKICAgICdcdWY3YzInCiAgICAnXHVmN2MzJwogICAgJ1x1ZjdjNCcKICAgICdcdWY3YzUnCiAgICAnXHVmN2M2JwogICAgJ1x1ZjdjNycKICAgICdcdWY3YzgnCiAgICAnXHVmN2M5JwogICAgJ1x1ZjdjYScKICAgICdcdWY3Y2InCiAgICAnXHVmN2NjJwogICAgJ1x1ZjdjZCcKICAgICdcdWY3Y2UnCiAgICAnXHVmN2NmJwogICAgJ1x1ZjdkMCcKICAgICdcdWY3ZDEnCiAgICAnXHVmN2QyJwogICAgJ1x1ZjdkMycKICAgICdcdWY3ZDQnCiAgICAnXHVmN2Q1JwogICAgJ1x1ZjdkNicKICAgICdcdWY3ZDcnCiAgICAnXHVmN2Q4JwogICAgJ1x1ZjdkOScKICAgICdcdWY3ZGEnCiAgICAnXHVmN2RiJwogICAgJ1x1ZjdkYycKICAgICdcdWY3ZGQnCiAgICAnXHVmN2RlJwogICAgJ1x1ZjdkZicKICAgICdcdWY3ZTAnCiAgICAnXHVmN2UxJwogICAgJ1x1ZjdlMicKICAgICdcdWY3ZTMnCiAgICAnXHVmN2U0JwogICAgJ1x1ZjdlNScKICAgICdcdWY3ZTYnCiAgICAnXHVmN2U3JwogICAgJ1x1ZjdlOCcKICAgICdcdWY3ZTknCiAgICAnXHVmN2VhJwogICAgJ1x1ZjdlYicKICAgICdcdWY3ZWMnCiAgICAnXHVmN2VkJwogICAgJ1x1ZjdlZScKICAgICdcdWY3ZWYnCiAgICAnXHVmN2YwJwogICAgJ1x1ZjdmMScKICAgICdcdWY3ZjInCiAgICAnXHVmN2YzJwogICAgJ1x1ZjdmNCcKICAgICdcdWY3ZjUnCiAgICAnXHVmN2Y2JwogICAgJ1x1ZjdmNycKICAgICdcdWY3ZjgnCiAgICAnXHVmN2Y5JwogICAgJ1x1ZjdmYScKICAgICdcdWY3ZmInCiAgICAnXHVmN2ZjJwogICAgJ1x1ZjdmZCcKICAgICdcdWY3ZmUnCiAgICAnXHVmN2ZmJwopCgojIyMgRW5jb2RpbmcgdGFibGUKZW5jb2RpbmdfdGFibGUgPSBjb2RlY3MuY2hhcm1hcF9idWlsZChkZWNvZGluZ190YWJsZSkKUEsDBBQAAAAAAAAAIQCCGIv1hi4AAIYuAAAvAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvYmFzZWNvbW1hbmQucHkiIiJCYXNlIENvbW1hbmQgY2xhc3MsIGFuZCByZWxhdGVkIHJvdXRpbmVzIiIiCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgbG9nZ2luZwppbXBvcnQgb3MKaW1wb3J0IHN5cwppbXBvcnQgb3B0cGFyc2UKaW1wb3J0IHdhcm5pbmdzCgpmcm9tIHBpcCBpbXBvcnQgY21kb3B0aW9ucwpmcm9tIHBpcC5pbmRleCBpbXBvcnQgUGFja2FnZUZpbmRlcgpmcm9tIHBpcC5sb2NhdGlvbnMgaW1wb3J0IHJ1bm5pbmdfdW5kZXJfdmlydHVhbGVudgpmcm9tIHBpcC5kb3dubG9hZCBpbXBvcnQgUGlwU2Vzc2lvbgpmcm9tIHBpcC5leGNlcHRpb25zIGltcG9ydCAoQmFkQ29tbWFuZCwgSW5zdGFsbGF0aW9uRXJyb3IsIFVuaW5zdGFsbGF0aW9uRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kRXJyb3IsIFByZXZpb3VzQnVpbGREaXJFcnJvcikKCmZyb20gcGlwLmNvbXBhdCBpbXBvcnQgbG9nZ2luZ19kaWN0Q29uZmlnCmZyb20gcGlwLmJhc2VwYXJzZXIgaW1wb3J0IENvbmZpZ09wdGlvblBhcnNlciwgVXBkYXRpbmdEZWZhdWx0c0hlbHBGb3JtYXR0ZXIKZnJvbSBwaXAucmVxIGltcG9ydCBJbnN0YWxsUmVxdWlyZW1lbnQsIHBhcnNlX3JlcXVpcmVtZW50cwpmcm9tIHBpcC5zdGF0dXNfY29kZXMgaW1wb3J0ICgKICAgIFNVQ0NFU1MsIEVSUk9SLCBVTktOT1dOX0VSUk9SLCBWSVJUVUFMRU5WX05PVF9GT1VORCwKICAgIFBSRVZJT1VTX0JVSUxEX0RJUl9FUlJPUiwKKQpmcm9tIHBpcC51dGlscyBpbXBvcnQgZGVwcmVjYXRpb24sIGdldF9wcm9nLCBub3JtYWxpemVfcGF0aApmcm9tIHBpcC51dGlscy5sb2dnaW5nIGltcG9ydCBJbmRlbnRpbmdGb3JtYXR0ZXIKZnJvbSBwaXAudXRpbHMub3V0ZGF0ZWQgaW1wb3J0IHBpcF92ZXJzaW9uX2NoZWNrCgoKX19hbGxfXyA9IFsnQ29tbWFuZCddCgoKbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgoKY2xhc3MgQ29tbWFuZChvYmplY3QpOgogICAgbmFtZSA9IE5vbmUKICAgIHVzYWdlID0gTm9uZQogICAgaGlkZGVuID0gRmFsc2UKICAgIGxvZ19zdHJlYW1zID0gKCJleHQ6Ly9zeXMuc3Rkb3V0IiwgImV4dDovL3N5cy5zdGRlcnIiKQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpc29sYXRlZD1GYWxzZSk6CiAgICAgICAgcGFyc2VyX2t3ID0gewogICAgICAgICAgICAndXNhZ2UnOiBzZWxmLnVzYWdlLAogICAgICAgICAgICAncHJvZyc6ICclcyAlcycgJSAoZ2V0X3Byb2coKSwgc2VsZi5uYW1lKSwKICAgICAgICAgICAgJ2Zvcm1hdHRlcic6IFVwZGF0aW5nRGVmYXVsdHNIZWxwRm9ybWF0dGVyKCksCiAgICAgICAgICAgICdhZGRfaGVscF9vcHRpb24nOiBGYWxzZSwKICAgICAgICAgICAgJ25hbWUnOiBzZWxmLm5hbWUsCiAgICAgICAgICAgICdkZXNjcmlwdGlvbic6IHNlbGYuX19kb2NfXywKICAgICAgICAgICAgJ2lzb2xhdGVkJzogaXNvbGF0ZWQsCiAgICAgICAgfQoKICAgICAgICBzZWxmLnBhcnNlciA9IENvbmZpZ09wdGlvblBhcnNlcigqKnBhcnNlcl9rdykKCiAgICAgICAgIyBDb21tYW5kcyBzaG91bGQgYWRkIG9wdGlvbnMgdG8gdGhpcyBvcHRpb24gZ3JvdXAKICAgICAgICBvcHRncm91cF9uYW1lID0gJyVzIE9wdGlvbnMnICUgc2VsZi5uYW1lLmNhcGl0YWxpemUoKQogICAgICAgIHNlbGYuY21kX29wdHMgPSBvcHRwYXJzZS5PcHRpb25Hcm91cChzZWxmLnBhcnNlciwgb3B0Z3JvdXBfbmFtZSkKCiAgICAgICAgIyBBZGQgdGhlIGdlbmVyYWwgb3B0aW9ucwogICAgICAgIGdlbl9vcHRzID0gY21kb3B0aW9ucy5tYWtlX29wdGlvbl9ncm91cCgKICAgICAgICAgICAgY21kb3B0aW9ucy5nZW5lcmFsX2dyb3VwLAogICAgICAgICAgICBzZWxmLnBhcnNlciwKICAgICAgICApCiAgICAgICAgc2VsZi5wYXJzZXIuYWRkX29wdGlvbl9ncm91cChnZW5fb3B0cykKCiAgICBkZWYgX2J1aWxkX3Nlc3Npb24oc2VsZiwgb3B0aW9ucywgcmV0cmllcz1Ob25lLCB0aW1lb3V0PU5vbmUpOgogICAgICAgIHNlc3Npb24gPSBQaXBTZXNzaW9uKAogICAgICAgICAgICBjYWNoZT0oCiAgICAgICAgICAgICAgICBub3JtYWxpemVfcGF0aChvcy5wYXRoLmpvaW4ob3B0aW9ucy5jYWNoZV9kaXIsICJodHRwIikpCiAgICAgICAgICAgICAgICBpZiBvcHRpb25zLmNhY2hlX2RpciBlbHNlIE5vbmUKICAgICAgICAgICAgKSwKICAgICAgICAgICAgcmV0cmllcz1yZXRyaWVzIGlmIHJldHJpZXMgaXMgbm90IE5vbmUgZWxzZSBvcHRpb25zLnJldHJpZXMsCiAgICAgICAgICAgIGluc2VjdXJlX2hvc3RzPW9wdGlvbnMudHJ1c3RlZF9ob3N0cywKICAgICAgICApCgogICAgICAgICMgSGFuZGxlIGN1c3RvbSBjYS1idW5kbGVzIGZyb20gdGhlIHVzZXIKICAgICAgICBpZiBvcHRpb25zLmNlcnQ6CiAgICAgICAgICAgIHNlc3Npb24udmVyaWZ5ID0gb3B0aW9ucy5jZXJ0CgogICAgICAgICMgSGFuZGxlIFNTTCBjbGllbnQgY2VydGlmaWNhdGUKICAgICAgICBpZiBvcHRpb25zLmNsaWVudF9jZXJ0OgogICAgICAgICAgICBzZXNzaW9uLmNlcnQgPSBvcHRpb25zLmNsaWVudF9jZXJ0CgogICAgICAgICMgSGFuZGxlIHRpbWVvdXRzCiAgICAgICAgaWYgb3B0aW9ucy50aW1lb3V0IG9yIHRpbWVvdXQ6CiAgICAgICAgICAgIHNlc3Npb24udGltZW91dCA9ICgKICAgICAgICAgICAgICAgIHRpbWVvdXQgaWYgdGltZW91dCBpcyBub3QgTm9uZSBlbHNlIG9wdGlvbnMudGltZW91dAogICAgICAgICAgICApCgogICAgICAgICMgSGFuZGxlIGNvbmZpZ3VyZWQgcHJveGllcwogICAgICAgIGlmIG9wdGlvbnMucHJveHk6CiAgICAgICAgICAgIHNlc3Npb24ucHJveGllcyA9IHsKICAgICAgICAgICAgICAgICJodHRwIjogb3B0aW9ucy5wcm94eSwKICAgICAgICAgICAgICAgICJodHRwcyI6IG9wdGlvbnMucHJveHksCiAgICAgICAgICAgIH0KCiAgICAgICAgIyBEZXRlcm1pbmUgaWYgd2UgY2FuIHByb21wdCB0aGUgdXNlciBmb3IgYXV0aGVudGljYXRpb24gb3Igbm90CiAgICAgICAgc2Vzc2lvbi5hdXRoLnByb21wdGluZyA9IG5vdCBvcHRpb25zLm5vX2lucHV0CgogICAgICAgIHJldHVybiBzZXNzaW9uCgogICAgZGVmIHBhcnNlX2FyZ3Moc2VsZiwgYXJncyk6CiAgICAgICAgIyBmYWN0b3JlZCBvdXQgZm9yIHRlc3RhYmlsaXR5CiAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VyLnBhcnNlX2FyZ3MoYXJncykKCiAgICBkZWYgbWFpbihzZWxmLCBhcmdzKToKICAgICAgICBvcHRpb25zLCBhcmdzID0gc2VsZi5wYXJzZV9hcmdzKGFyZ3MpCgogICAgICAgIGlmIG9wdGlvbnMucXVpZXQ6CiAgICAgICAgICAgIGlmIG9wdGlvbnMucXVpZXQgPT0gMToKICAgICAgICAgICAgICAgIGxldmVsID0gIldBUk5JTkciCiAgICAgICAgICAgIGlmIG9wdGlvbnMucXVpZXQgPT0gMjoKICAgICAgICAgICAgICAgIGxldmVsID0gIkVSUk9SIgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgbGV2ZWwgPSAiQ1JJVElDQUwiCiAgICAgICAgZWxpZiBvcHRpb25zLnZlcmJvc2U6CiAgICAgICAgICAgIGxldmVsID0gIkRFQlVHIgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGxldmVsID0gIklORk8iCgogICAgICAgICMgVGhlIHJvb3QgbG9nZ2VyIHNob3VsZCBtYXRjaCB0aGUgImNvbnNvbGUiIGxldmVsICp1bmxlc3MqIHdlCiAgICAgICAgIyBzcGVjaWZpZWQgIi0tbG9nIiB0byBzZW5kIGRlYnVnIGxvZ3MgdG8gYSBmaWxlLgogICAgICAgIHJvb3RfbGV2ZWwgPSBsZXZlbAogICAgICAgIGlmIG9wdGlvbnMubG9nOgogICAgICAgICAgICByb290X2xldmVsID0gIkRFQlVHIgoKICAgICAgICBsb2dnaW5nX2RpY3RDb25maWcoewogICAgICAgICAgICAidmVyc2lvbiI6IDEsCiAgICAgICAgICAgICJkaXNhYmxlX2V4aXN0aW5nX2xvZ2dlcnMiOiBGYWxzZSwKICAgICAgICAgICAgImZpbHRlcnMiOiB7CiAgICAgICAgICAgICAgICAiZXhjbHVkZV93YXJuaW5ncyI6IHsKICAgICAgICAgICAgICAgICAgICAiKCkiOiAicGlwLnV0aWxzLmxvZ2dpbmcuTWF4TGV2ZWxGaWx0ZXIiLAogICAgICAgICAgICAgICAgICAgICJsZXZlbCI6IGxvZ2dpbmcuV0FSTklORywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJmb3JtYXR0ZXJzIjogewogICAgICAgICAgICAgICAgImluZGVudCI6IHsKICAgICAgICAgICAgICAgICAgICAiKCkiOiBJbmRlbnRpbmdGb3JtYXR0ZXIsCiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6ICIlKG1lc3NhZ2UpcyIsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICAiaGFuZGxlcnMiOiB7CiAgICAgICAgICAgICAgICAiY29uc29sZSI6IHsKICAgICAgICAgICAgICAgICAgICAibGV2ZWwiOiBsZXZlbCwKICAgICAgICAgICAgICAgICAgICAiY2xhc3MiOiAicGlwLnV0aWxzLmxvZ2dpbmcuQ29sb3JpemVkU3RyZWFtSGFuZGxlciIsCiAgICAgICAgICAgICAgICAgICAgInN0cmVhbSI6IHNlbGYubG9nX3N0cmVhbXNbMF0sCiAgICAgICAgICAgICAgICAgICAgImZpbHRlcnMiOiBbImV4Y2x1ZGVfd2FybmluZ3MiXSwKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0dGVyIjogImluZGVudCIsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImNvbnNvbGVfZXJyb3JzIjogewogICAgICAgICAgICAgICAgICAgICJsZXZlbCI6ICJXQVJOSU5HIiwKICAgICAgICAgICAgICAgICAgICAiY2xhc3MiOiAicGlwLnV0aWxzLmxvZ2dpbmcuQ29sb3JpemVkU3RyZWFtSGFuZGxlciIsCiAgICAgICAgICAgICAgICAgICAgInN0cmVhbSI6IHNlbGYubG9nX3N0cmVhbXNbMV0sCiAgICAgICAgICAgICAgICAgICAgImZvcm1hdHRlciI6ICJpbmRlbnQiLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJ1c2VyX2xvZyI6IHsKICAgICAgICAgICAgICAgICAgICAibGV2ZWwiOiAiREVCVUciLAogICAgICAgICAgICAgICAgICAgICJjbGFzcyI6ICJwaXAudXRpbHMubG9nZ2luZy5CZXR0ZXJSb3RhdGluZ0ZpbGVIYW5kbGVyIiwKICAgICAgICAgICAgICAgICAgICAiZmlsZW5hbWUiOiBvcHRpb25zLmxvZyBvciAiL2Rldi9udWxsIiwKICAgICAgICAgICAgICAgICAgICAiZGVsYXkiOiBUcnVlLAogICAgICAgICAgICAgICAgICAgICJmb3JtYXR0ZXIiOiAiaW5kZW50IiwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJyb290IjogewogICAgICAgICAgICAgICAgImxldmVsIjogcm9vdF9sZXZlbCwKICAgICAgICAgICAgICAgICJoYW5kbGVycyI6IGxpc3QoZmlsdGVyKE5vbmUsIFsKICAgICAgICAgICAgICAgICAgICAiY29uc29sZSIsCiAgICAgICAgICAgICAgICAgICAgImNvbnNvbGVfZXJyb3JzIiwKICAgICAgICAgICAgICAgICAgICAidXNlcl9sb2ciIGlmIG9wdGlvbnMubG9nIGVsc2UgTm9uZSwKICAgICAgICAgICAgICAgIF0pKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgIyBEaXNhYmxlIGFueSBsb2dnaW5nIGJlc2lkZXMgV0FSTklORyB1bmxlc3Mgd2UgaGF2ZSBERUJVRyBsZXZlbAogICAgICAgICAgICAjIGxvZ2dpbmcgZW5hYmxlZC4gVGhlc2UgdXNlIGJvdGggcGlwLl92ZW5kb3IgYW5kIHRoZSBiYXJlIG5hbWVzCiAgICAgICAgICAgICMgZm9yIHRoZSBjYXNlIHdoZXJlIHNvbWVvbmUgdW5idW5kbGVzIG91ciBsaWJyYXJpZXMuCiAgICAgICAgICAgICJsb2dnZXJzIjogZGljdCgKICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICBuYW1lLAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImxldmVsIjogKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIldBUk5JTkciCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBsZXZlbCBpbiBbIklORk8iLCAiRVJST1IiXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSAiREVCVUciCiAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGZvciBuYW1lIGluIFsicGlwLl92ZW5kb3IiLCAiZGlzdGxpYiIsICJyZXF1ZXN0cyIsICJ1cmxsaWIzIl0KICAgICAgICAgICAgKSwKICAgICAgICB9KQoKICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzoyXSA9PSAoMiwgNik6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCiAgICAgICAgICAgICAgICAiUHl0aG9uIDIuNiBpcyBubyBsb25nZXIgc3VwcG9ydGVkIGJ5IHRoZSBQeXRob24gY29yZSB0ZWFtLCAiCiAgICAgICAgICAgICAgICAicGxlYXNlIHVwZ3JhZGUgeW91ciBQeXRob24uIEEgZnV0dXJlIHZlcnNpb24gb2YgcGlwIHdpbGwgIgogICAgICAgICAgICAgICAgImRyb3Agc3VwcG9ydCBmb3IgUHl0aG9uIDIuNiIsCiAgICAgICAgICAgICAgICBkZXByZWNhdGlvbi5QeXRob24yNkRlcHJlY2F0aW9uV2FybmluZwogICAgICAgICAgICApCgogICAgICAgICMgVE9ETzogdHJ5IHRvIGdldCB0aGVzZSBwYXNzaW5nIGRvd24gZnJvbSB0aGUgY29tbWFuZD8KICAgICAgICAjICAgICAgd2l0aG91dCByZXNvcnRpbmcgdG8gb3MuZW52aXJvbiB0byBob2xkIHRoZXNlLgoKICAgICAgICBpZiBvcHRpb25zLm5vX2lucHV0OgogICAgICAgICAgICBvcy5lbnZpcm9uWydQSVBfTk9fSU5QVVQnXSA9ICcxJwoKICAgICAgICBpZiBvcHRpb25zLmV4aXN0c19hY3Rpb246CiAgICAgICAgICAgIG9zLmVudmlyb25bJ1BJUF9FWElTVFNfQUNUSU9OJ10gPSAnICcuam9pbihvcHRpb25zLmV4aXN0c19hY3Rpb24pCgogICAgICAgIGlmIG9wdGlvbnMucmVxdWlyZV92ZW52OgogICAgICAgICAgICAjIElmIGEgdmVudiBpcyByZXF1aXJlZCBjaGVjayBpZiBpdCBjYW4gcmVhbGx5IGJlIGZvdW5kCiAgICAgICAgICAgIGlmIG5vdCBydW5uaW5nX3VuZGVyX3ZpcnR1YWxlbnYoKToKICAgICAgICAgICAgICAgIGxvZ2dlci5jcml0aWNhbCgKICAgICAgICAgICAgICAgICAgICAnQ291bGQgbm90IGZpbmQgYW4gYWN0aXZhdGVkIHZpcnR1YWxlbnYgKHJlcXVpcmVkKS4nCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBzeXMuZXhpdChWSVJUVUFMRU5WX05PVF9GT1VORCkKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzdGF0dXMgPSBzZWxmLnJ1bihvcHRpb25zLCBhcmdzKQogICAgICAgICAgICAjIEZJWE1FOiBhbGwgY29tbWFuZHMgc2hvdWxkIHJldHVybiBhbiBleGl0IHN0YXR1cwogICAgICAgICAgICAjIGFuZCB3aGVuIGl0IGlzIGRvbmUsIGlzaW5zdGFuY2UgaXMgbm90IG5lZWRlZCBhbnltb3JlCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc3RhdHVzLCBpbnQpOgogICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1cwogICAgICAgIGV4Y2VwdCBQcmV2aW91c0J1aWxkRGlyRXJyb3IgYXMgZXhjOgogICAgICAgICAgICBsb2dnZXIuY3JpdGljYWwoc3RyKGV4YykpCiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnRXhjZXB0aW9uIGluZm9ybWF0aW9uOicsIGV4Y19pbmZvPVRydWUpCgogICAgICAgICAgICByZXR1cm4gUFJFVklPVVNfQlVJTERfRElSX0VSUk9SCiAgICAgICAgZXhjZXB0IChJbnN0YWxsYXRpb25FcnJvciwgVW5pbnN0YWxsYXRpb25FcnJvciwgQmFkQ29tbWFuZCkgYXMgZXhjOgogICAgICAgICAgICBsb2dnZXIuY3JpdGljYWwoc3RyKGV4YykpCiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnRXhjZXB0aW9uIGluZm9ybWF0aW9uOicsIGV4Y19pbmZvPVRydWUpCgogICAgICAgICAgICByZXR1cm4gRVJST1IKICAgICAgICBleGNlcHQgQ29tbWFuZEVycm9yIGFzIGV4YzoKICAgICAgICAgICAgbG9nZ2VyLmNyaXRpY2FsKCdFUlJPUjogJXMnLCBleGMpCiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnRXhjZXB0aW9uIGluZm9ybWF0aW9uOicsIGV4Y19pbmZvPVRydWUpCgogICAgICAgICAgICByZXR1cm4gRVJST1IKICAgICAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6CiAgICAgICAgICAgIGxvZ2dlci5jcml0aWNhbCgnT3BlcmF0aW9uIGNhbmNlbGxlZCBieSB1c2VyJykKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdFeGNlcHRpb24gaW5mb3JtYXRpb246JywgZXhjX2luZm89VHJ1ZSkKCiAgICAgICAgICAgIHJldHVybiBFUlJPUgogICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgbG9nZ2VyLmNyaXRpY2FsKCdFeGNlcHRpb246JywgZXhjX2luZm89VHJ1ZSkKCiAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgIyBDaGVjayBpZiB3ZSdyZSB1c2luZyB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgcGlwIGF2YWlsYWJsZQogICAgICAgICAgICBpZiAobm90IG9wdGlvbnMuZGlzYWJsZV9waXBfdmVyc2lvbl9jaGVjayBhbmQgbm90CiAgICAgICAgICAgICAgICAgICAgZ2V0YXR0cihvcHRpb25zLCAibm9faW5kZXgiLCBGYWxzZSkpOgogICAgICAgICAgICAgICAgd2l0aCBzZWxmLl9idWlsZF9zZXNzaW9uKAogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICByZXRyaWVzPTAsCiAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ9bWluKDUsIG9wdGlvbnMudGltZW91dCkpIGFzIHNlc3Npb246CiAgICAgICAgICAgICAgICAgICAgcGlwX3ZlcnNpb25fY2hlY2soc2Vzc2lvbikKCiAgICAgICAgcmV0dXJuIFNVQ0NFU1MKCgpjbGFzcyBSZXF1aXJlbWVudENvbW1hbmQoQ29tbWFuZCk6CgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIHBvcHVsYXRlX3JlcXVpcmVtZW50X3NldChyZXF1aXJlbWVudF9zZXQsIGFyZ3MsIG9wdGlvbnMsIGZpbmRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbiwgbmFtZSwgd2hlZWxfY2FjaGUpOgogICAgICAgICIiIgogICAgICAgIE1hcnNoYWwgY21kIGxpbmUgYXJncyBpbnRvIGEgcmVxdWlyZW1lbnQgc2V0LgogICAgICAgICIiIgogICAgICAgIGZvciBmaWxlbmFtZSBpbiBvcHRpb25zLmNvbnN0cmFpbnRzOgogICAgICAgICAgICBmb3IgcmVxIGluIHBhcnNlX3JlcXVpcmVtZW50cygKICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSwKICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW50PVRydWUsIGZpbmRlcj1maW5kZXIsIG9wdGlvbnM9b3B0aW9ucywKICAgICAgICAgICAgICAgICAgICBzZXNzaW9uPXNlc3Npb24sIHdoZWVsX2NhY2hlPXdoZWVsX2NhY2hlKToKICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50X3NldC5hZGRfcmVxdWlyZW1lbnQocmVxKQoKICAgICAgICBmb3IgcmVxIGluIGFyZ3M6CiAgICAgICAgICAgIHJlcXVpcmVtZW50X3NldC5hZGRfcmVxdWlyZW1lbnQoCiAgICAgICAgICAgICAgICBJbnN0YWxsUmVxdWlyZW1lbnQuZnJvbV9saW5lKAogICAgICAgICAgICAgICAgICAgIHJlcSwgTm9uZSwgaXNvbGF0ZWQ9b3B0aW9ucy5pc29sYXRlZF9tb2RlLAogICAgICAgICAgICAgICAgICAgIHdoZWVsX2NhY2hlPXdoZWVsX2NhY2hlCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICkKCiAgICAgICAgZm9yIHJlcSBpbiBvcHRpb25zLmVkaXRhYmxlczoKICAgICAgICAgICAgcmVxdWlyZW1lbnRfc2V0LmFkZF9yZXF1aXJlbWVudCgKICAgICAgICAgICAgICAgIEluc3RhbGxSZXF1aXJlbWVudC5mcm9tX2VkaXRhYmxlKAogICAgICAgICAgICAgICAgICAgIHJlcSwKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0X3Zjcz1vcHRpb25zLmRlZmF1bHRfdmNzLAogICAgICAgICAgICAgICAgICAgIGlzb2xhdGVkPW9wdGlvbnMuaXNvbGF0ZWRfbW9kZSwKICAgICAgICAgICAgICAgICAgICB3aGVlbF9jYWNoZT13aGVlbF9jYWNoZQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICApCgogICAgICAgIGZvdW5kX3JlcV9pbl9maWxlID0gRmFsc2UKICAgICAgICBmb3IgZmlsZW5hbWUgaW4gb3B0aW9ucy5yZXF1aXJlbWVudHM6CiAgICAgICAgICAgIGZvciByZXEgaW4gcGFyc2VfcmVxdWlyZW1lbnRzKAogICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lLAogICAgICAgICAgICAgICAgICAgIGZpbmRlcj1maW5kZXIsIG9wdGlvbnM9b3B0aW9ucywgc2Vzc2lvbj1zZXNzaW9uLAogICAgICAgICAgICAgICAgICAgIHdoZWVsX2NhY2hlPXdoZWVsX2NhY2hlKToKICAgICAgICAgICAgICAgIGZvdW5kX3JlcV9pbl9maWxlID0gVHJ1ZQogICAgICAgICAgICAgICAgcmVxdWlyZW1lbnRfc2V0LmFkZF9yZXF1aXJlbWVudChyZXEpCiAgICAgICAgIyBJZiAtLXJlcXVpcmUtaGFzaGVzIHdhcyBhIGxpbmUgaW4gYSByZXF1aXJlbWVudHMgZmlsZSwgdGVsbAogICAgICAgICMgUmVxdWlyZW1lbnRTZXQgYWJvdXQgaXQ6CiAgICAgICAgcmVxdWlyZW1lbnRfc2V0LnJlcXVpcmVfaGFzaGVzID0gb3B0aW9ucy5yZXF1aXJlX2hhc2hlcwoKICAgICAgICBpZiBub3QgKGFyZ3Mgb3Igb3B0aW9ucy5lZGl0YWJsZXMgb3IgZm91bmRfcmVxX2luX2ZpbGUpOgogICAgICAgICAgICBvcHRzID0geyduYW1lJzogbmFtZX0KICAgICAgICAgICAgaWYgb3B0aW9ucy5maW5kX2xpbmtzOgogICAgICAgICAgICAgICAgbXNnID0gKCdZb3UgbXVzdCBnaXZlIGF0IGxlYXN0IG9uZSByZXF1aXJlbWVudCB0byAnCiAgICAgICAgICAgICAgICAgICAgICAgJyUobmFtZSlzIChtYXliZSB5b3UgbWVhbnQgInBpcCAlKG5hbWUpcyAnCiAgICAgICAgICAgICAgICAgICAgICAgJyUobGlua3MpcyI/KScgJQogICAgICAgICAgICAgICAgICAgICAgIGRpY3Qob3B0cywgbGlua3M9JyAnLmpvaW4ob3B0aW9ucy5maW5kX2xpbmtzKSkpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBtc2cgPSAoJ1lvdSBtdXN0IGdpdmUgYXQgbGVhc3Qgb25lIHJlcXVpcmVtZW50ICcKICAgICAgICAgICAgICAgICAgICAgICAndG8gJShuYW1lKXMgKHNlZSAicGlwIGhlbHAgJShuYW1lKXMiKScgJSBvcHRzKQogICAgICAgICAgICBsb2dnZXIud2FybmluZyhtc2cpCgogICAgZGVmIF9idWlsZF9wYWNrYWdlX2ZpbmRlcihzZWxmLCBvcHRpb25zLCBzZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF0Zm9ybT1Ob25lLCBweXRob25fdmVyc2lvbnM9Tm9uZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJpPU5vbmUsIGltcGxlbWVudGF0aW9uPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIENyZWF0ZSBhIHBhY2thZ2UgZmluZGVyIGFwcHJvcHJpYXRlIHRvIHRoaXMgcmVxdWlyZW1lbnQgY29tbWFuZC4KICAgICAgICAiIiIKICAgICAgICBpbmRleF91cmxzID0gW29wdGlvbnMuaW5kZXhfdXJsXSArIG9wdGlvbnMuZXh0cmFfaW5kZXhfdXJscwogICAgICAgIGlmIG9wdGlvbnMubm9faW5kZXg6CiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnSWdub3JpbmcgaW5kZXhlczogJXMnLCAnLCcuam9pbihpbmRleF91cmxzKSkKICAgICAgICAgICAgaW5kZXhfdXJscyA9IFtdCgogICAgICAgIHJldHVybiBQYWNrYWdlRmluZGVyKAogICAgICAgICAgICBmaW5kX2xpbmtzPW9wdGlvbnMuZmluZF9saW5rcywKICAgICAgICAgICAgZm9ybWF0X2NvbnRyb2w9b3B0aW9ucy5mb3JtYXRfY29udHJvbCwKICAgICAgICAgICAgaW5kZXhfdXJscz1pbmRleF91cmxzLAogICAgICAgICAgICB0cnVzdGVkX2hvc3RzPW9wdGlvbnMudHJ1c3RlZF9ob3N0cywKICAgICAgICAgICAgYWxsb3dfYWxsX3ByZXJlbGVhc2VzPW9wdGlvbnMucHJlLAogICAgICAgICAgICBwcm9jZXNzX2RlcGVuZGVuY3lfbGlua3M9b3B0aW9ucy5wcm9jZXNzX2RlcGVuZGVuY3lfbGlua3MsCiAgICAgICAgICAgIHNlc3Npb249c2Vzc2lvbiwKICAgICAgICAgICAgcGxhdGZvcm09cGxhdGZvcm0sCiAgICAgICAgICAgIHZlcnNpb25zPXB5dGhvbl92ZXJzaW9ucywKICAgICAgICAgICAgYWJpPWFiaSwKICAgICAgICAgICAgaW1wbGVtZW50YXRpb249aW1wbGVtZW50YXRpb24sCiAgICAgICAgKQpQSwMEFAAAAAAAAAAhAKur/jvhKAAA4SgAAC4AAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9iYXNlcGFyc2VyLnB5IiIiQmFzZSBvcHRpb24gcGFyc2VyIHNldHVwIiIiCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgc3lzCmltcG9ydCBvcHRwYXJzZQppbXBvcnQgb3MKaW1wb3J0IHJlCmltcG9ydCB0ZXh0d3JhcApmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBzdHJ0b2Jvb2wKCmZyb20gcGlwLl92ZW5kb3Iuc2l4IGltcG9ydCBzdHJpbmdfdHlwZXMKZnJvbSBwaXAuX3ZlbmRvci5zaXgubW92ZXMgaW1wb3J0IGNvbmZpZ3BhcnNlcgpmcm9tIHBpcC5sb2NhdGlvbnMgaW1wb3J0ICgKICAgIGxlZ2FjeV9jb25maWdfZmlsZSwgY29uZmlnX2Jhc2VuYW1lLCBydW5uaW5nX3VuZGVyX3ZpcnR1YWxlbnYsCiAgICBzaXRlX2NvbmZpZ19maWxlcwopCmZyb20gcGlwLnV0aWxzIGltcG9ydCBhcHBkaXJzLCBnZXRfdGVybWluYWxfc2l6ZQoKCl9lbnZpcm9uX3ByZWZpeF9yZSA9IHJlLmNvbXBpbGUociJeUElQXyIsIHJlLkkpCgoKY2xhc3MgUHJldHR5SGVscEZvcm1hdHRlcihvcHRwYXJzZS5JbmRlbnRlZEhlbHBGb3JtYXR0ZXIpOgogICAgIiIiQSBwcmV0dGllci9sZXNzIHZlcmJvc2UgaGVscCBmb3JtYXR0ZXIgZm9yIG9wdHBhcnNlLiIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgICMgaGVscCBwb3NpdGlvbiBtdXN0IGJlIGFsaWduZWQgd2l0aCBfX2luaXRfXy5wYXJzZW9wdHMuZGVzY3JpcHRpb24KICAgICAgICBrd2FyZ3NbJ21heF9oZWxwX3Bvc2l0aW9uJ10gPSAzMAogICAgICAgIGt3YXJnc1snaW5kZW50X2luY3JlbWVudCddID0gMQogICAgICAgIGt3YXJnc1snd2lkdGgnXSA9IGdldF90ZXJtaW5hbF9zaXplKClbMF0gLSAyCiAgICAgICAgb3B0cGFyc2UuSW5kZW50ZWRIZWxwRm9ybWF0dGVyLl9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncykKCiAgICBkZWYgZm9ybWF0X29wdGlvbl9zdHJpbmdzKHNlbGYsIG9wdGlvbik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2Zvcm1hdF9vcHRpb25fc3RyaW5ncyhvcHRpb24sICcgPCVzPicsICcsICcpCgogICAgZGVmIF9mb3JtYXRfb3B0aW9uX3N0cmluZ3Moc2VsZiwgb3B0aW9uLCBtdmFyZm10PScgPCVzPicsIG9wdHNlcD0nLCAnKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBvcHRpb24gc3RyaW5ncyBhbmQgbWV0YXZhcnMuCgogICAgICAgIDpwYXJhbSBvcHRpb246ICB0dXBsZSBvZiAoc2hvcnQgb3B0LCBsb25nIG9wdCksIGUuZzogKCctZicsICctLWZvcm1hdCcpCiAgICAgICAgOnBhcmFtIG12YXJmbXQ6IG1ldGF2YXIgZm9ybWF0IHN0cmluZyAtIGV2YWx1YXRlZCBhcyBtdmFyZm10ICUgbWV0YXZhcgogICAgICAgIDpwYXJhbSBvcHRzZXA6ICBzZXBhcmF0b3IKICAgICAgICAiIiIKICAgICAgICBvcHRzID0gW10KCiAgICAgICAgaWYgb3B0aW9uLl9zaG9ydF9vcHRzOgogICAgICAgICAgICBvcHRzLmFwcGVuZChvcHRpb24uX3Nob3J0X29wdHNbMF0pCiAgICAgICAgaWYgb3B0aW9uLl9sb25nX29wdHM6CiAgICAgICAgICAgIG9wdHMuYXBwZW5kKG9wdGlvbi5fbG9uZ19vcHRzWzBdKQogICAgICAgIGlmIGxlbihvcHRzKSA+IDE6CiAgICAgICAgICAgIG9wdHMuaW5zZXJ0KDEsIG9wdHNlcCkKCiAgICAgICAgaWYgb3B0aW9uLnRha2VzX3ZhbHVlKCk6CiAgICAgICAgICAgIG1ldGF2YXIgPSBvcHRpb24ubWV0YXZhciBvciBvcHRpb24uZGVzdC5sb3dlcigpCiAgICAgICAgICAgIG9wdHMuYXBwZW5kKG12YXJmbXQgJSBtZXRhdmFyLmxvd2VyKCkpCgogICAgICAgIHJldHVybiAnJy5qb2luKG9wdHMpCgogICAgZGVmIGZvcm1hdF9oZWFkaW5nKHNlbGYsIGhlYWRpbmcpOgogICAgICAgIGlmIGhlYWRpbmcgPT0gJ09wdGlvbnMnOgogICAgICAgICAgICByZXR1cm4gJycKICAgICAgICByZXR1cm4gaGVhZGluZyArICc6XG4nCgogICAgZGVmIGZvcm1hdF91c2FnZShzZWxmLCB1c2FnZSk6CiAgICAgICAgIiIiCiAgICAgICAgRW5zdXJlIHRoZXJlIGlzIG9ubHkgb25lIG5ld2xpbmUgYmV0d2VlbiB1c2FnZSBhbmQgdGhlIGZpcnN0IGhlYWRpbmcKICAgICAgICBpZiB0aGVyZSBpcyBubyBkZXNjcmlwdGlvbi4KICAgICAgICAiIiIKICAgICAgICBtc2cgPSAnXG5Vc2FnZTogJXNcbicgJSBzZWxmLmluZGVudF9saW5lcyh0ZXh0d3JhcC5kZWRlbnQodXNhZ2UpLCAiICAiKQogICAgICAgIHJldHVybiBtc2cKCiAgICBkZWYgZm9ybWF0X2Rlc2NyaXB0aW9uKHNlbGYsIGRlc2NyaXB0aW9uKToKICAgICAgICAjIGxlYXZlIGZ1bGwgY29udHJvbCBvdmVyIGRlc2NyaXB0aW9uIHRvIHVzCiAgICAgICAgaWYgZGVzY3JpcHRpb246CiAgICAgICAgICAgIGlmIGhhc2F0dHIoc2VsZi5wYXJzZXIsICdtYWluJyk6CiAgICAgICAgICAgICAgICBsYWJlbCA9ICdDb21tYW5kcycKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGxhYmVsID0gJ0Rlc2NyaXB0aW9uJwogICAgICAgICAgICAjIHNvbWUgZG9jIHN0cmluZ3MgaGF2ZSBpbml0aWFsIG5ld2xpbmVzLCBzb21lIGRvbid0CiAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24ubHN0cmlwKCdcbicpCiAgICAgICAgICAgICMgc29tZSBkb2Mgc3RyaW5ncyBoYXZlIGZpbmFsIG5ld2xpbmVzIGFuZCBzcGFjZXMsIHNvbWUgZG9uJ3QKICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbi5yc3RyaXAoKQogICAgICAgICAgICAjIGRlZGVudCwgdGhlbiByZWluZGVudAogICAgICAgICAgICBkZXNjcmlwdGlvbiA9IHNlbGYuaW5kZW50X2xpbmVzKHRleHR3cmFwLmRlZGVudChkZXNjcmlwdGlvbiksICIgICIpCiAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gJyVzOlxuJXNcbicgJSAobGFiZWwsIGRlc2NyaXB0aW9uKQogICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRpb24KICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gJycKCiAgICBkZWYgZm9ybWF0X2VwaWxvZyhzZWxmLCBlcGlsb2cpOgogICAgICAgICMgbGVhdmUgZnVsbCBjb250cm9sIG92ZXIgZXBpbG9nIHRvIHVzCiAgICAgICAgaWYgZXBpbG9nOgogICAgICAgICAgICByZXR1cm4gZXBpbG9nCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuICcnCgogICAgZGVmIGluZGVudF9saW5lcyhzZWxmLCB0ZXh0LCBpbmRlbnQpOgogICAgICAgIG5ld19saW5lcyA9IFtpbmRlbnQgKyBsaW5lIGZvciBsaW5lIGluIHRleHQuc3BsaXQoJ1xuJyldCiAgICAgICAgcmV0dXJuICJcbiIuam9pbihuZXdfbGluZXMpCgoKY2xhc3MgVXBkYXRpbmdEZWZhdWx0c0hlbHBGb3JtYXR0ZXIoUHJldHR5SGVscEZvcm1hdHRlcik6CiAgICAiIiJDdXN0b20gaGVscCBmb3JtYXR0ZXIgZm9yIHVzZSBpbiBDb25maWdPcHRpb25QYXJzZXIuCgogICAgVGhpcyBpcyB1cGRhdGVzIHRoZSBkZWZhdWx0cyBiZWZvcmUgZXhwYW5kaW5nIHRoZW0sIGFsbG93aW5nCiAgICB0aGVtIHRvIHNob3cgdXAgY29ycmVjdGx5IGluIHRoZSBoZWxwIGxpc3RpbmcuCiAgICAiIiIKCiAgICBkZWYgZXhwYW5kX2RlZmF1bHQoc2VsZiwgb3B0aW9uKToKICAgICAgICBpZiBzZWxmLnBhcnNlciBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5wYXJzZXIuX3VwZGF0ZV9kZWZhdWx0cyhzZWxmLnBhcnNlci5kZWZhdWx0cykKICAgICAgICByZXR1cm4gb3B0cGFyc2UuSW5kZW50ZWRIZWxwRm9ybWF0dGVyLmV4cGFuZF9kZWZhdWx0KHNlbGYsIG9wdGlvbikKCgpjbGFzcyBDdXN0b21PcHRpb25QYXJzZXIob3B0cGFyc2UuT3B0aW9uUGFyc2VyKToKCiAgICBkZWYgaW5zZXJ0X29wdGlvbl9ncm91cChzZWxmLCBpZHgsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgIiIiSW5zZXJ0IGFuIE9wdGlvbkdyb3VwIGF0IGEgZ2l2ZW4gcG9zaXRpb24uIiIiCiAgICAgICAgZ3JvdXAgPSBzZWxmLmFkZF9vcHRpb25fZ3JvdXAoKmFyZ3MsICoqa3dhcmdzKQoKICAgICAgICBzZWxmLm9wdGlvbl9ncm91cHMucG9wKCkKICAgICAgICBzZWxmLm9wdGlvbl9ncm91cHMuaW5zZXJ0KGlkeCwgZ3JvdXApCgogICAgICAgIHJldHVybiBncm91cAoKICAgIEBwcm9wZXJ0eQogICAgZGVmIG9wdGlvbl9saXN0X2FsbChzZWxmKToKICAgICAgICAiIiJHZXQgYSBsaXN0IG9mIGFsbCBvcHRpb25zLCBpbmNsdWRpbmcgdGhvc2UgaW4gb3B0aW9uIGdyb3Vwcy4iIiIKICAgICAgICByZXMgPSBzZWxmLm9wdGlvbl9saXN0WzpdCiAgICAgICAgZm9yIGkgaW4gc2VsZi5vcHRpb25fZ3JvdXBzOgogICAgICAgICAgICByZXMuZXh0ZW5kKGkub3B0aW9uX2xpc3QpCgogICAgICAgIHJldHVybiByZXMKCgpjbGFzcyBDb25maWdPcHRpb25QYXJzZXIoQ3VzdG9tT3B0aW9uUGFyc2VyKToKICAgICIiIkN1c3RvbSBvcHRpb24gcGFyc2VyIHdoaWNoIHVwZGF0ZXMgaXRzIGRlZmF1bHRzIGJ5IGNoZWNraW5nIHRoZQogICAgY29uZmlndXJhdGlvbiBmaWxlcyBhbmQgZW52aXJvbm1lbnRhbCB2YXJpYWJsZXMiIiIKCiAgICBpc29sYXRlZCA9IEZhbHNlCgogICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgc2VsZi5jb25maWcgPSBjb25maWdwYXJzZXIuUmF3Q29uZmlnUGFyc2VyKCkKICAgICAgICBzZWxmLm5hbWUgPSBrd2FyZ3MucG9wKCduYW1lJykKICAgICAgICBzZWxmLmlzb2xhdGVkID0ga3dhcmdzLnBvcCgiaXNvbGF0ZWQiLCBGYWxzZSkKICAgICAgICBzZWxmLmZpbGVzID0gc2VsZi5nZXRfY29uZmlnX2ZpbGVzKCkKICAgICAgICBpZiBzZWxmLmZpbGVzOgogICAgICAgICAgICBzZWxmLmNvbmZpZy5yZWFkKHNlbGYuZmlsZXMpCiAgICAgICAgYXNzZXJ0IHNlbGYubmFtZQogICAgICAgIG9wdHBhcnNlLk9wdGlvblBhcnNlci5fX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpCgogICAgZGVmIGdldF9jb25maWdfZmlsZXMoc2VsZik6CiAgICAgICAgIyB0aGUgZmlsZXMgcmV0dXJuZWQgYnkgdGhpcyBtZXRob2Qgd2lsbCBiZSBwYXJzZWQgaW4gb3JkZXIgd2l0aCB0aGUKICAgICAgICAjIGZpcnN0IGZpbGVzIGxpc3RlZCBiZWluZyBvdmVycmlkZGVuIGJ5IGxhdGVyIGZpbGVzIGluIHN0YW5kYXJkCiAgICAgICAgIyBDb25maWdQYXJzZXIgZmFzaGlvbgogICAgICAgIGNvbmZpZ19maWxlID0gb3MuZW52aXJvbi5nZXQoJ1BJUF9DT05GSUdfRklMRScsIEZhbHNlKQogICAgICAgIGlmIGNvbmZpZ19maWxlID09IG9zLmRldm51bGw6CiAgICAgICAgICAgIHJldHVybiBbXQoKICAgICAgICAjIGF0IHRoZSBiYXNlIHdlIGhhdmUgYW55IHNpdGUtd2lkZSBjb25maWd1cmF0aW9uCiAgICAgICAgZmlsZXMgPSBsaXN0KHNpdGVfY29uZmlnX2ZpbGVzKQoKICAgICAgICAjIHBlci11c2VyIGNvbmZpZ3VyYXRpb24gbmV4dAogICAgICAgIGlmIG5vdCBzZWxmLmlzb2xhdGVkOgogICAgICAgICAgICBpZiBjb25maWdfZmlsZSBhbmQgb3MucGF0aC5leGlzdHMoY29uZmlnX2ZpbGUpOgogICAgICAgICAgICAgICAgZmlsZXMuYXBwZW5kKGNvbmZpZ19maWxlKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBUaGlzIGlzIHRoZSBsZWdhY3kgY29uZmlnIGZpbGUsIHdlIGNvbnNpZGVyIGl0IHRvIGJlIGEgbG93ZXIKICAgICAgICAgICAgICAgICMgcHJpb3JpdHkgdGhhbiB0aGUgbmV3IGZpbGUgbG9jYXRpb24uCiAgICAgICAgICAgICAgICBmaWxlcy5hcHBlbmQobGVnYWN5X2NvbmZpZ19maWxlKQoKICAgICAgICAgICAgICAgICMgVGhpcyBpcyB0aGUgbmV3IGNvbmZpZyBmaWxlLCB3ZSBjb25zaWRlciBpdCB0byBiZSBhIGhpZ2hlcgogICAgICAgICAgICAgICAgIyBwcmlvcml0eSB0aGFuIHRoZSBsZWdhY3kgZmlsZS4KICAgICAgICAgICAgICAgIGZpbGVzLmFwcGVuZCgKICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oCiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGRpcnMudXNlcl9jb25maWdfZGlyKCJwaXAiKSwKICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnX2Jhc2VuYW1lLAogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICkKCiAgICAgICAgIyBmaW5hbGx5IHZpcnR1YWxlbnYgY29uZmlndXJhdGlvbiBmaXJzdCB0cnVtcGluZyBvdGhlcnMKICAgICAgICBpZiBydW5uaW5nX3VuZGVyX3ZpcnR1YWxlbnYoKToKICAgICAgICAgICAgdmVudl9jb25maWdfZmlsZSA9IG9zLnBhdGguam9pbigKICAgICAgICAgICAgICAgIHN5cy5wcmVmaXgsCiAgICAgICAgICAgICAgICBjb25maWdfYmFzZW5hbWUsCiAgICAgICAgICAgICkKICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHModmVudl9jb25maWdfZmlsZSk6CiAgICAgICAgICAgICAgICBmaWxlcy5hcHBlbmQodmVudl9jb25maWdfZmlsZSkKCiAgICAgICAgcmV0dXJuIGZpbGVzCgogICAgZGVmIGNoZWNrX2RlZmF1bHQoc2VsZiwgb3B0aW9uLCBrZXksIHZhbCk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gb3B0aW9uLmNoZWNrX3ZhbHVlKGtleSwgdmFsKQogICAgICAgIGV4Y2VwdCBvcHRwYXJzZS5PcHRpb25WYWx1ZUVycm9yIGFzIGV4YzoKICAgICAgICAgICAgcHJpbnQoIkFuIGVycm9yIG9jY3VycmVkIGR1cmluZyBjb25maWd1cmF0aW9uOiAlcyIgJSBleGMpCiAgICAgICAgICAgIHN5cy5leGl0KDMpCgogICAgZGVmIF91cGRhdGVfZGVmYXVsdHMoc2VsZiwgZGVmYXVsdHMpOgogICAgICAgICIiIlVwZGF0ZXMgdGhlIGdpdmVuIGRlZmF1bHRzIHdpdGggdmFsdWVzIGZyb20gdGhlIGNvbmZpZyBmaWxlcyBhbmQKICAgICAgICB0aGUgZW52aXJvbi4gRG9lcyBhIGxpdHRsZSBzcGVjaWFsIGhhbmRsaW5nIGZvciBjZXJ0YWluIHR5cGVzIG9mCiAgICAgICAgb3B0aW9ucyAobGlzdHMpLiIiIgogICAgICAgICMgVGhlbiBnbyBhbmQgbG9vayBmb3IgdGhlIG90aGVyIHNvdXJjZXMgb2YgY29uZmlndXJhdGlvbjoKICAgICAgICBjb25maWcgPSB7fQogICAgICAgICMgMS4gY29uZmlnIGZpbGVzCiAgICAgICAgZm9yIHNlY3Rpb24gaW4gKCdnbG9iYWwnLCBzZWxmLm5hbWUpOgogICAgICAgICAgICBjb25maWcudXBkYXRlKAogICAgICAgICAgICAgICAgc2VsZi5ub3JtYWxpemVfa2V5cyhzZWxmLmdldF9jb25maWdfc2VjdGlvbihzZWN0aW9uKSkKICAgICAgICAgICAgKQogICAgICAgICMgMi4gZW52aXJvbm1lbnRhbCB2YXJpYWJsZXMKICAgICAgICBpZiBub3Qgc2VsZi5pc29sYXRlZDoKICAgICAgICAgICAgY29uZmlnLnVwZGF0ZShzZWxmLm5vcm1hbGl6ZV9rZXlzKHNlbGYuZ2V0X2Vudmlyb25fdmFycygpKSkKICAgICAgICAjIEFjY3VtdWxhdGUgY29tcGxleCBkZWZhdWx0IHN0YXRlLgogICAgICAgIHNlbGYudmFsdWVzID0gb3B0cGFyc2UuVmFsdWVzKHNlbGYuZGVmYXVsdHMpCiAgICAgICAgbGF0ZV9ldmFsID0gc2V0KCkKICAgICAgICAjIFRoZW4gc2V0IHRoZSBvcHRpb25zIHdpdGggdGhvc2UgdmFsdWVzCiAgICAgICAgZm9yIGtleSwgdmFsIGluIGNvbmZpZy5pdGVtcygpOgogICAgICAgICAgICAjIGlnbm9yZSBlbXB0eSB2YWx1ZXMKICAgICAgICAgICAgaWYgbm90IHZhbDoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICBvcHRpb24gPSBzZWxmLmdldF9vcHRpb24oa2V5KQogICAgICAgICAgICAjIElnbm9yZSBvcHRpb25zIG5vdCBwcmVzZW50IGluIHRoaXMgcGFyc2VyLiBFLmcuIG5vbi1nbG9iYWxzIHB1dAogICAgICAgICAgICAjIGluIFtnbG9iYWxdIGJ5IHVzZXJzIHRoYXQgd2FudCB0aGVtIHRvIGFwcGx5IHRvIGFsbCBhcHBsaWNhYmxlCiAgICAgICAgICAgICMgY29tbWFuZHMuCiAgICAgICAgICAgIGlmIG9wdGlvbiBpcyBOb25lOgogICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgIGlmIG9wdGlvbi5hY3Rpb24gaW4gKCdzdG9yZV90cnVlJywgJ3N0b3JlX2ZhbHNlJywgJ2NvdW50Jyk6CiAgICAgICAgICAgICAgICB2YWwgPSBzdHJ0b2Jvb2wodmFsKQogICAgICAgICAgICBlbGlmIG9wdGlvbi5hY3Rpb24gPT0gJ2FwcGVuZCc6CiAgICAgICAgICAgICAgICB2YWwgPSB2YWwuc3BsaXQoKQogICAgICAgICAgICAgICAgdmFsID0gW3NlbGYuY2hlY2tfZGVmYXVsdChvcHRpb24sIGtleSwgdikgZm9yIHYgaW4gdmFsXQogICAgICAgICAgICBlbGlmIG9wdGlvbi5hY3Rpb24gPT0gJ2NhbGxiYWNrJzoKICAgICAgICAgICAgICAgIGxhdGVfZXZhbC5hZGQob3B0aW9uLmRlc3QpCiAgICAgICAgICAgICAgICBvcHRfc3RyID0gb3B0aW9uLmdldF9vcHRfc3RyaW5nKCkKICAgICAgICAgICAgICAgIHZhbCA9IG9wdGlvbi5jb252ZXJ0X3ZhbHVlKG9wdF9zdHIsIHZhbCkKICAgICAgICAgICAgICAgICMgRnJvbSB0YWtlX2FjdGlvbgogICAgICAgICAgICAgICAgYXJncyA9IG9wdGlvbi5jYWxsYmFja19hcmdzIG9yICgpCiAgICAgICAgICAgICAgICBrd2FyZ3MgPSBvcHRpb24uY2FsbGJhY2tfa3dhcmdzIG9yIHt9CiAgICAgICAgICAgICAgICBvcHRpb24uY2FsbGJhY2sob3B0aW9uLCBvcHRfc3RyLCB2YWwsIHNlbGYsICphcmdzLCAqKmt3YXJncykKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHZhbCA9IHNlbGYuY2hlY2tfZGVmYXVsdChvcHRpb24sIGtleSwgdmFsKQoKICAgICAgICAgICAgZGVmYXVsdHNbb3B0aW9uLmRlc3RdID0gdmFsCgogICAgICAgIGZvciBrZXkgaW4gbGF0ZV9ldmFsOgogICAgICAgICAgICBkZWZhdWx0c1trZXldID0gZ2V0YXR0cihzZWxmLnZhbHVlcywga2V5KQogICAgICAgIHNlbGYudmFsdWVzID0gTm9uZQogICAgICAgIHJldHVybiBkZWZhdWx0cwoKICAgIGRlZiBub3JtYWxpemVfa2V5cyhzZWxmLCBpdGVtcyk6CiAgICAgICAgIiIiUmV0dXJuIGEgY29uZmlnIGRpY3Rpb25hcnkgd2l0aCBub3JtYWxpemVkIGtleXMgcmVnYXJkbGVzcyBvZgogICAgICAgIHdoZXRoZXIgdGhlIGtleXMgd2VyZSBzcGVjaWZpZWQgaW4gZW52aXJvbm1lbnQgdmFyaWFibGVzIG9yIGluIGNvbmZpZwogICAgICAgIGZpbGVzIiIiCiAgICAgICAgbm9ybWFsaXplZCA9IHt9CiAgICAgICAgZm9yIGtleSwgdmFsIGluIGl0ZW1zOgogICAgICAgICAgICBrZXkgPSBrZXkucmVwbGFjZSgnXycsICctJykKICAgICAgICAgICAgaWYgbm90IGtleS5zdGFydHN3aXRoKCctLScpOgogICAgICAgICAgICAgICAga2V5ID0gJy0tJXMnICUga2V5ICAjIG9ubHkgcHJlZmVyIGxvbmcgb3B0cwogICAgICAgICAgICBub3JtYWxpemVkW2tleV0gPSB2YWwKICAgICAgICByZXR1cm4gbm9ybWFsaXplZAoKICAgIGRlZiBnZXRfY29uZmlnX3NlY3Rpb24oc2VsZiwgbmFtZSk6CiAgICAgICAgIiIiR2V0IGEgc2VjdGlvbiBvZiBhIGNvbmZpZ3VyYXRpb24iIiIKICAgICAgICBpZiBzZWxmLmNvbmZpZy5oYXNfc2VjdGlvbihuYW1lKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuY29uZmlnLml0ZW1zKG5hbWUpCiAgICAgICAgcmV0dXJuIFtdCgogICAgZGVmIGdldF9lbnZpcm9uX3ZhcnMoc2VsZik6CiAgICAgICAgIiIiUmV0dXJucyBhIGdlbmVyYXRvciB3aXRoIGFsbCBlbnZpcm9ubWVudGFsIHZhcnMgd2l0aCBwcmVmaXggUElQXyIiIgogICAgICAgIGZvciBrZXksIHZhbCBpbiBvcy5lbnZpcm9uLml0ZW1zKCk6CiAgICAgICAgICAgIGlmIF9lbnZpcm9uX3ByZWZpeF9yZS5zZWFyY2goa2V5KToKICAgICAgICAgICAgICAgIHlpZWxkIChfZW52aXJvbl9wcmVmaXhfcmUuc3ViKCIiLCBrZXkpLmxvd2VyKCksIHZhbCkKCiAgICBkZWYgZ2V0X2RlZmF1bHRfdmFsdWVzKHNlbGYpOgogICAgICAgICIiIk92ZXJyaWRpbmcgdG8gbWFrZSB1cGRhdGluZyB0aGUgZGVmYXVsdHMgYWZ0ZXIgaW5zdGFudGlhdGlvbiBvZgogICAgICAgIHRoZSBvcHRpb24gcGFyc2VyIHBvc3NpYmxlLCBfdXBkYXRlX2RlZmF1bHRzKCkgZG9lcyB0aGUgZGlydHkgd29yay4iIiIKICAgICAgICBpZiBub3Qgc2VsZi5wcm9jZXNzX2RlZmF1bHRfdmFsdWVzOgogICAgICAgICAgICAjIE9sZCwgcHJlLU9wdGlrIDEuNSBiZWhhdmlvdXIuCiAgICAgICAgICAgIHJldHVybiBvcHRwYXJzZS5WYWx1ZXMoc2VsZi5kZWZhdWx0cykKCiAgICAgICAgZGVmYXVsdHMgPSBzZWxmLl91cGRhdGVfZGVmYXVsdHMoc2VsZi5kZWZhdWx0cy5jb3B5KCkpICAjIG91cnMKICAgICAgICBmb3Igb3B0aW9uIGluIHNlbGYuX2dldF9hbGxfb3B0aW9ucygpOgogICAgICAgICAgICBkZWZhdWx0ID0gZGVmYXVsdHMuZ2V0KG9wdGlvbi5kZXN0KQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGRlZmF1bHQsIHN0cmluZ190eXBlcyk6CiAgICAgICAgICAgICAgICBvcHRfc3RyID0gb3B0aW9uLmdldF9vcHRfc3RyaW5nKCkKICAgICAgICAgICAgICAgIGRlZmF1bHRzW29wdGlvbi5kZXN0XSA9IG9wdGlvbi5jaGVja192YWx1ZShvcHRfc3RyLCBkZWZhdWx0KQogICAgICAgIHJldHVybiBvcHRwYXJzZS5WYWx1ZXMoZGVmYXVsdHMpCgogICAgZGVmIGVycm9yKHNlbGYsIG1zZyk6CiAgICAgICAgc2VsZi5wcmludF91c2FnZShzeXMuc3RkZXJyKQogICAgICAgIHNlbGYuZXhpdCgyLCAiJXNcbiIgJSBtc2cpClBLAwQUAAAAAAAAACEAS5kyIVpAAABaQAAALgAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL2NtZG9wdGlvbnMucHkiIiIKc2hhcmVkIG9wdGlvbnMgYW5kIGdyb3VwcwoKVGhlIHByaW5jaXBsZSBoZXJlIGlzIHRvIGRlZmluZSBvcHRpb25zIG9uY2UsIGJ1dCAqbm90KiBpbnN0YW50aWF0ZSB0aGVtCmdsb2JhbGx5LiBPbmUgcmVhc29uIGJlaW5nIHRoYXQgb3B0aW9ucyB3aXRoIGFjdGlvbj0nYXBwZW5kJyBjYW4gY2Fycnkgc3RhdGUKYmV0d2VlbiBwYXJzZXMuIHBpcCBwYXJzZXMgZ2VuZXJhbCBvcHRpb25zIHR3aWNlIGludGVybmFsbHksIGFuZCBzaG91bGRuJ3QKcGFzcyBvbiBzdGF0ZS4gVG8gYmUgY29uc2lzdGVudCwgYWxsIG9wdGlvbnMgd2lsbCBmb2xsb3cgdGhpcyBkZXNpZ24uCgoiIiIKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmZyb20gZnVuY3Rvb2xzIGltcG9ydCBwYXJ0aWFsCmZyb20gb3B0cGFyc2UgaW1wb3J0IE9wdGlvbkdyb3VwLCBTVVBQUkVTU19IRUxQLCBPcHRpb24KaW1wb3J0IHdhcm5pbmdzCgpmcm9tIHBpcC5pbmRleCBpbXBvcnQgKAogICAgRm9ybWF0Q29udHJvbCwgZm10X2N0bF9oYW5kbGVfbXV0dWFsX2V4Y2x1ZGUsIGZtdF9jdGxfbm9fYmluYXJ5LAogICAgZm10X2N0bF9ub191c2Vfd2hlZWwpCmZyb20gcGlwLm1vZGVscyBpbXBvcnQgUHlQSQpmcm9tIHBpcC5sb2NhdGlvbnMgaW1wb3J0IFVTRVJfQ0FDSEVfRElSLCBzcmNfcHJlZml4CmZyb20gcGlwLnV0aWxzLmhhc2hlcyBpbXBvcnQgU1RST05HX0hBU0hFUwoKCmRlZiBtYWtlX29wdGlvbl9ncm91cChncm91cCwgcGFyc2VyKToKICAgICIiIgogICAgUmV0dXJuIGFuIE9wdGlvbkdyb3VwIG9iamVjdAogICAgZ3JvdXAgIC0tIGFzc3VtZWQgdG8gYmUgZGljdCB3aXRoICduYW1lJyBhbmQgJ29wdGlvbnMnIGtleXMKICAgIHBhcnNlciAtLSBhbiBvcHRwYXJzZSBQYXJzZXIKICAgICIiIgogICAgb3B0aW9uX2dyb3VwID0gT3B0aW9uR3JvdXAocGFyc2VyLCBncm91cFsnbmFtZSddKQogICAgZm9yIG9wdGlvbiBpbiBncm91cFsnb3B0aW9ucyddOgogICAgICAgIG9wdGlvbl9ncm91cC5hZGRfb3B0aW9uKG9wdGlvbigpKQogICAgcmV0dXJuIG9wdGlvbl9ncm91cAoKCmRlZiByZXNvbHZlX3doZWVsX25vX3VzZV9iaW5hcnkob3B0aW9ucyk6CiAgICBpZiBub3Qgb3B0aW9ucy51c2Vfd2hlZWw6CiAgICAgICAgY29udHJvbCA9IG9wdGlvbnMuZm9ybWF0X2NvbnRyb2wKICAgICAgICBmbXRfY3RsX25vX3VzZV93aGVlbChjb250cm9sKQoKCmRlZiBjaGVja19pbnN0YWxsX2J1aWxkX2dsb2JhbChvcHRpb25zLCBjaGVja19vcHRpb25zPU5vbmUpOgogICAgIiIiRGlzYWJsZSB3aGVlbHMgaWYgcGVyLXNldHVwLnB5IGNhbGwgb3B0aW9ucyBhcmUgc2V0LgoKICAgIDpwYXJhbSBvcHRpb25zOiBUaGUgT3B0aW9uUGFyc2VyIG9wdGlvbnMgdG8gdXBkYXRlLgogICAgOnBhcmFtIGNoZWNrX29wdGlvbnM6IFRoZSBvcHRpb25zIHRvIGNoZWNrLCBpZiBub3Qgc3VwcGxpZWQgZGVmYXVsdHMgdG8KICAgICAgICBvcHRpb25zLgogICAgIiIiCiAgICBpZiBjaGVja19vcHRpb25zIGlzIE5vbmU6CiAgICAgICAgY2hlY2tfb3B0aW9ucyA9IG9wdGlvbnMKCiAgICBkZWYgZ2V0bmFtZShuKToKICAgICAgICByZXR1cm4gZ2V0YXR0cihjaGVja19vcHRpb25zLCBuLCBOb25lKQogICAgbmFtZXMgPSBbImJ1aWxkX29wdGlvbnMiLCAiZ2xvYmFsX29wdGlvbnMiLCAiaW5zdGFsbF9vcHRpb25zIl0KICAgIGlmIGFueShtYXAoZ2V0bmFtZSwgbmFtZXMpKToKICAgICAgICBjb250cm9sID0gb3B0aW9ucy5mb3JtYXRfY29udHJvbAogICAgICAgIGZtdF9jdGxfbm9fYmluYXJ5KGNvbnRyb2wpCiAgICAgICAgd2FybmluZ3Mud2FybigKICAgICAgICAgICAgJ0Rpc2FibGluZyBhbGwgdXNlIG9mIHdoZWVscyBkdWUgdG8gdGhlIHVzZSBvZiAtLWJ1aWxkLW9wdGlvbnMgJwogICAgICAgICAgICAnLyAtLWdsb2JhbC1vcHRpb25zIC8gLS1pbnN0YWxsLW9wdGlvbnMuJywgc3RhY2tsZXZlbD0yKQoKCiMjIyMjIyMjIyMjCiMgb3B0aW9ucyAjCiMjIyMjIyMjIyMjCgpoZWxwXyA9IHBhcnRpYWwoCiAgICBPcHRpb24sCiAgICAnLWgnLCAnLS1oZWxwJywKICAgIGRlc3Q9J2hlbHAnLAogICAgYWN0aW9uPSdoZWxwJywKICAgIGhlbHA9J1Nob3cgaGVscC4nKQoKaXNvbGF0ZWRfbW9kZSA9IHBhcnRpYWwoCiAgICBPcHRpb24sCiAgICAiLS1pc29sYXRlZCIsCiAgICBkZXN0PSJpc29sYXRlZF9tb2RlIiwKICAgIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsCiAgICBkZWZhdWx0PUZhbHNlLAogICAgaGVscD0oCiAgICAgICAgIlJ1biBwaXAgaW4gYW4gaXNvbGF0ZWQgbW9kZSwgaWdub3JpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFuZCB1c2VyICIKICAgICAgICAiY29uZmlndXJhdGlvbi4iCiAgICApLAopCgpyZXF1aXJlX3ZpcnR1YWxlbnYgPSBwYXJ0aWFsKAogICAgT3B0aW9uLAogICAgIyBSdW4gb25seSBpZiBpbnNpZGUgYSB2aXJ0dWFsZW52LCBiYWlsIGlmIG5vdC4KICAgICctLXJlcXVpcmUtdmlydHVhbGVudicsICctLXJlcXVpcmUtdmVudicsCiAgICBkZXN0PSdyZXF1aXJlX3ZlbnYnLAogICAgYWN0aW9uPSdzdG9yZV90cnVlJywKICAgIGRlZmF1bHQ9RmFsc2UsCiAgICBoZWxwPVNVUFBSRVNTX0hFTFApCgp2ZXJib3NlID0gcGFydGlhbCgKICAgIE9wdGlvbiwKICAgICctdicsICctLXZlcmJvc2UnLAogICAgZGVzdD0ndmVyYm9zZScsCiAgICBhY3Rpb249J2NvdW50JywKICAgIGRlZmF1bHQ9MCwKICAgIGhlbHA9J0dpdmUgbW9yZSBvdXRwdXQuIE9wdGlvbiBpcyBhZGRpdGl2ZSwgYW5kIGNhbiBiZSB1c2VkIHVwIHRvIDMgdGltZXMuJwopCgp2ZXJzaW9uID0gcGFydGlhbCgKICAgIE9wdGlvbiwKICAgICctVicsICctLXZlcnNpb24nLAogICAgZGVzdD0ndmVyc2lvbicsCiAgICBhY3Rpb249J3N0b3JlX3RydWUnLAogICAgaGVscD0nU2hvdyB2ZXJzaW9uIGFuZCBleGl0LicpCgpxdWlldCA9IHBhcnRpYWwoCiAgICBPcHRpb24sCiAgICAnLXEnLCAnLS1xdWlldCcsCiAgICBkZXN0PSdxdWlldCcsCiAgICBhY3Rpb249J2NvdW50JywKICAgIGRlZmF1bHQ9MCwKICAgIGhlbHA9KCdHaXZlIGxlc3Mgb3V0cHV0LiBPcHRpb24gaXMgYWRkaXRpdmUsIGFuZCBjYW4gYmUgdXNlZCB1cCB0byAzJwogICAgICAgICAgJyB0aW1lcyAoY29ycmVzcG9uZGluZyB0byBXQVJOSU5HLCBFUlJPUiwgYW5kIENSSVRJQ0FMIGxvZ2dpbmcnCiAgICAgICAgICAnIGxldmVscykuJykKKQoKbG9nID0gcGFydGlhbCgKICAgIE9wdGlvbiwKICAgICItLWxvZyIsICItLWxvZy1maWxlIiwgIi0tbG9jYWwtbG9nIiwKICAgIGRlc3Q9ImxvZyIsCiAgICBtZXRhdmFyPSJwYXRoIiwKICAgIGhlbHA9IlBhdGggdG8gYSB2ZXJib3NlIGFwcGVuZGluZyBsb2cuIgopCgpub19pbnB1dCA9IHBhcnRpYWwoCiAgICBPcHRpb24sCiAgICAjIERvbid0IGFzayBmb3IgaW5wdXQKICAgICctLW5vLWlucHV0JywKICAgIGRlc3Q9J25vX2lucHV0JywKICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCiAgICBkZWZhdWx0PUZhbHNlLAogICAgaGVscD1TVVBQUkVTU19IRUxQKQoKcHJveHkgPSBwYXJ0aWFsKAogICAgT3B0aW9uLAogICAgJy0tcHJveHknLAogICAgZGVzdD0ncHJveHknLAogICAgdHlwZT0nc3RyJywKICAgIGRlZmF1bHQ9JycsCiAgICBoZWxwPSJTcGVjaWZ5IGEgcHJveHkgaW4gdGhlIGZvcm0gW3VzZXI6cGFzc3dkQF1wcm94eS5zZXJ2ZXI6cG9ydC4iKQoKcmV0cmllcyA9IHBhcnRpYWwoCiAgICBPcHRpb24sCiAgICAnLS1yZXRyaWVzJywKICAgIGRlc3Q9J3JldHJpZXMnLAogICAgdHlwZT0naW50JywKICAgIGRlZmF1bHQ9NSwKICAgIGhlbHA9Ik1heGltdW0gbnVtYmVyIG9mIHJldHJpZXMgZWFjaCBjb25uZWN0aW9uIHNob3VsZCBhdHRlbXB0ICIKICAgICAgICAgIihkZWZhdWx0ICVkZWZhdWx0IHRpbWVzKS4iKQoKdGltZW91dCA9IHBhcnRpYWwoCiAgICBPcHRpb24sCiAgICAnLS10aW1lb3V0JywgJy0tZGVmYXVsdC10aW1lb3V0JywKICAgIG1ldGF2YXI9J3NlYycsCiAgICBkZXN0PSd0aW1lb3V0JywKICAgIHR5cGU9J2Zsb2F0JywKICAgIGRlZmF1bHQ9MTUsCiAgICBoZWxwPSdTZXQgdGhlIHNvY2tldCB0aW1lb3V0IChkZWZhdWx0ICVkZWZhdWx0IHNlY29uZHMpLicpCgpkZWZhdWx0X3ZjcyA9IHBhcnRpYWwoCiAgICBPcHRpb24sCiAgICAjIFRoZSBkZWZhdWx0IHZlcnNpb24gY29udHJvbCBzeXN0ZW0gZm9yIGVkaXRhYmxlcywgZS5nLiAnc3ZuJwogICAgJy0tZGVmYXVsdC12Y3MnLAogICAgZGVzdD0nZGVmYXVsdF92Y3MnLAogICAgdHlwZT0nc3RyJywKICAgIGRlZmF1bHQ9JycsCiAgICBoZWxwPVNVUFBSRVNTX0hFTFApCgpza2lwX3JlcXVpcmVtZW50c19yZWdleCA9IHBhcnRpYWwoCiAgICBPcHRpb24sCiAgICAjIEEgcmVnZXggdG8gYmUgdXNlZCB0byBza2lwIHJlcXVpcmVtZW50cwogICAgJy0tc2tpcC1yZXF1aXJlbWVudHMtcmVnZXgnLAogICAgZGVzdD0nc2tpcF9yZXF1aXJlbWVudHNfcmVnZXgnLAogICAgdHlwZT0nc3RyJywKICAgIGRlZmF1bHQ9JycsCiAgICBoZWxwPVNVUFBSRVNTX0hFTFApCgoKZGVmIGV4aXN0c19hY3Rpb24oKToKICAgIHJldHVybiBPcHRpb24oCiAgICAgICAgIyBPcHRpb24gd2hlbiBwYXRoIGFscmVhZHkgZXhpc3QKICAgICAgICAnLS1leGlzdHMtYWN0aW9uJywKICAgICAgICBkZXN0PSdleGlzdHNfYWN0aW9uJywKICAgICAgICB0eXBlPSdjaG9pY2UnLAogICAgICAgIGNob2ljZXM9WydzJywgJ2knLCAndycsICdiJywgJ2EnXSwKICAgICAgICBkZWZhdWx0PVtdLAogICAgICAgIGFjdGlvbj0nYXBwZW5kJywKICAgICAgICBtZXRhdmFyPSdhY3Rpb24nLAogICAgICAgIGhlbHA9IkRlZmF1bHQgYWN0aW9uIHdoZW4gYSBwYXRoIGFscmVhZHkgZXhpc3RzOiAiCiAgICAgICAgIihzKXdpdGNoLCAoaSlnbm9yZSwgKHcpaXBlLCAoYilhY2t1cCwgKGEpYm9ydC4iKQoKCmNlcnQgPSBwYXJ0aWFsKAogICAgT3B0aW9uLAogICAgJy0tY2VydCcsCiAgICBkZXN0PSdjZXJ0JywKICAgIHR5cGU9J3N0cicsCiAgICBtZXRhdmFyPSdwYXRoJywKICAgIGhlbHA9IlBhdGggdG8gYWx0ZXJuYXRlIENBIGJ1bmRsZS4iKQoKY2xpZW50X2NlcnQgPSBwYXJ0aWFsKAogICAgT3B0aW9uLAogICAgJy0tY2xpZW50LWNlcnQnLAogICAgZGVzdD0nY2xpZW50X2NlcnQnLAogICAgdHlwZT0nc3RyJywKICAgIGRlZmF1bHQ9Tm9uZSwKICAgIG1ldGF2YXI9J3BhdGgnLAogICAgaGVscD0iUGF0aCB0byBTU0wgY2xpZW50IGNlcnRpZmljYXRlLCBhIHNpbmdsZSBmaWxlIGNvbnRhaW5pbmcgdGhlICIKICAgICAgICAgInByaXZhdGUga2V5IGFuZCB0aGUgY2VydGlmaWNhdGUgaW4gUEVNIGZvcm1hdC4iKQoKaW5kZXhfdXJsID0gcGFydGlhbCgKICAgIE9wdGlvbiwKICAgICctaScsICctLWluZGV4LXVybCcsICctLXB5cGktdXJsJywKICAgIGRlc3Q9J2luZGV4X3VybCcsCiAgICBtZXRhdmFyPSdVUkwnLAogICAgZGVmYXVsdD1QeVBJLnNpbXBsZV91cmwsCiAgICBoZWxwPSJCYXNlIFVSTCBvZiBQeXRob24gUGFja2FnZSBJbmRleCAoZGVmYXVsdCAlZGVmYXVsdCkuICIKICAgICAgICAgIlRoaXMgc2hvdWxkIHBvaW50IHRvIGEgcmVwb3NpdG9yeSBjb21wbGlhbnQgd2l0aCBQRVAgNTAzICIKICAgICAgICAgIih0aGUgc2ltcGxlIHJlcG9zaXRvcnkgQVBJKSBvciBhIGxvY2FsIGRpcmVjdG9yeSBsYWlkIG91dCAiCiAgICAgICAgICJpbiB0aGUgc2FtZSBmb3JtYXQuIikKCgpkZWYgZXh0cmFfaW5kZXhfdXJsKCk6CiAgICByZXR1cm4gT3B0aW9uKAogICAgICAgICctLWV4dHJhLWluZGV4LXVybCcsCiAgICAgICAgZGVzdD0nZXh0cmFfaW5kZXhfdXJscycsCiAgICAgICAgbWV0YXZhcj0nVVJMJywKICAgICAgICBhY3Rpb249J2FwcGVuZCcsCiAgICAgICAgZGVmYXVsdD1bXSwKICAgICAgICBoZWxwPSJFeHRyYSBVUkxzIG9mIHBhY2thZ2UgaW5kZXhlcyB0byB1c2UgaW4gYWRkaXRpb24gdG8gIgogICAgICAgICAgICAgIi0taW5kZXgtdXJsLiBTaG91bGQgZm9sbG93IHRoZSBzYW1lIHJ1bGVzIGFzICIKICAgICAgICAgICAgICItLWluZGV4LXVybC4iCiAgICApCgoKbm9faW5kZXggPSBwYXJ0aWFsKAogICAgT3B0aW9uLAogICAgJy0tbm8taW5kZXgnLAogICAgZGVzdD0nbm9faW5kZXgnLAogICAgYWN0aW9uPSdzdG9yZV90cnVlJywKICAgIGRlZmF1bHQ9RmFsc2UsCiAgICBoZWxwPSdJZ25vcmUgcGFja2FnZSBpbmRleCAob25seSBsb29raW5nIGF0IC0tZmluZC1saW5rcyBVUkxzIGluc3RlYWQpLicpCgoKZGVmIGZpbmRfbGlua3MoKToKICAgIHJldHVybiBPcHRpb24oCiAgICAgICAgJy1mJywgJy0tZmluZC1saW5rcycsCiAgICAgICAgZGVzdD0nZmluZF9saW5rcycsCiAgICAgICAgYWN0aW9uPSdhcHBlbmQnLAogICAgICAgIGRlZmF1bHQ9W10sCiAgICAgICAgbWV0YXZhcj0ndXJsJywKICAgICAgICBoZWxwPSJJZiBhIHVybCBvciBwYXRoIHRvIGFuIGh0bWwgZmlsZSwgdGhlbiBwYXJzZSBmb3IgbGlua3MgdG8gIgogICAgICAgICAgICAgImFyY2hpdmVzLiBJZiBhIGxvY2FsIHBhdGggb3IgZmlsZTovLyB1cmwgdGhhdCdzIGEgZGlyZWN0b3J5LCAiCiAgICAgICAgICAgICAidGhlbiBsb29rIGZvciBhcmNoaXZlcyBpbiB0aGUgZGlyZWN0b3J5IGxpc3RpbmcuIikKCgpkZWYgYWxsb3dfZXh0ZXJuYWwoKToKICAgIHJldHVybiBPcHRpb24oCiAgICAgICAgIi0tYWxsb3ctZXh0ZXJuYWwiLAogICAgICAgIGRlc3Q9ImFsbG93X2V4dGVybmFsIiwKICAgICAgICBhY3Rpb249ImFwcGVuZCIsCiAgICAgICAgZGVmYXVsdD1bXSwKICAgICAgICBtZXRhdmFyPSJQQUNLQUdFIiwKICAgICAgICBoZWxwPVNVUFBSRVNTX0hFTFAsCiAgICApCgoKYWxsb3dfYWxsX2V4dGVybmFsID0gcGFydGlhbCgKICAgIE9wdGlvbiwKICAgICItLWFsbG93LWFsbC1leHRlcm5hbCIsCiAgICBkZXN0PSJhbGxvd19hbGxfZXh0ZXJuYWwiLAogICAgYWN0aW9uPSJzdG9yZV90cnVlIiwKICAgIGRlZmF1bHQ9RmFsc2UsCiAgICBoZWxwPVNVUFBSRVNTX0hFTFAsCikKCgpkZWYgdHJ1c3RlZF9ob3N0KCk6CiAgICByZXR1cm4gT3B0aW9uKAogICAgICAgICItLXRydXN0ZWQtaG9zdCIsCiAgICAgICAgZGVzdD0idHJ1c3RlZF9ob3N0cyIsCiAgICAgICAgYWN0aW9uPSJhcHBlbmQiLAogICAgICAgIG1ldGF2YXI9IkhPU1ROQU1FIiwKICAgICAgICBkZWZhdWx0PVtdLAogICAgICAgIGhlbHA9Ik1hcmsgdGhpcyBob3N0IGFzIHRydXN0ZWQsIGV2ZW4gdGhvdWdoIGl0IGRvZXMgbm90IGhhdmUgdmFsaWQgIgogICAgICAgICAgICAgIm9yIGFueSBIVFRQUy4iLAogICAgKQoKCiMgUmVtb3ZlIGFmdGVyIDcuMApub19hbGxvd19leHRlcm5hbCA9IHBhcnRpYWwoCiAgICBPcHRpb24sCiAgICAiLS1uby1hbGxvdy1leHRlcm5hbCIsCiAgICBkZXN0PSJhbGxvd19hbGxfZXh0ZXJuYWwiLAogICAgYWN0aW9uPSJzdG9yZV9mYWxzZSIsCiAgICBkZWZhdWx0PUZhbHNlLAogICAgaGVscD1TVVBQUkVTU19IRUxQLAopCgoKIyBSZW1vdmUgLS1hbGxvdy1pbnNlY3VyZSBhZnRlciA3LjAKZGVmIGFsbG93X3Vuc2FmZSgpOgogICAgcmV0dXJuIE9wdGlvbigKICAgICAgICAiLS1hbGxvdy11bnZlcmlmaWVkIiwgIi0tYWxsb3ctaW5zZWN1cmUiLAogICAgICAgIGRlc3Q9ImFsbG93X3VudmVyaWZpZWQiLAogICAgICAgIGFjdGlvbj0iYXBwZW5kIiwKICAgICAgICBkZWZhdWx0PVtdLAogICAgICAgIG1ldGF2YXI9IlBBQ0tBR0UiLAogICAgICAgIGhlbHA9U1VQUFJFU1NfSEVMUCwKICAgICkKCiMgUmVtb3ZlIGFmdGVyIDcuMApub19hbGxvd191bnNhZmUgPSBwYXJ0aWFsKAogICAgT3B0aW9uLAogICAgIi0tbm8tYWxsb3ctaW5zZWN1cmUiLAogICAgZGVzdD0iYWxsb3dfYWxsX2luc2VjdXJlIiwKICAgIGFjdGlvbj0ic3RvcmVfZmFsc2UiLAogICAgZGVmYXVsdD1GYWxzZSwKICAgIGhlbHA9U1VQUFJFU1NfSEVMUAopCgojIFJlbW92ZSBhZnRlciAxLjUKcHJvY2Vzc19kZXBlbmRlbmN5X2xpbmtzID0gcGFydGlhbCgKICAgIE9wdGlvbiwKICAgICItLXByb2Nlc3MtZGVwZW5kZW5jeS1saW5rcyIsCiAgICBkZXN0PSJwcm9jZXNzX2RlcGVuZGVuY3lfbGlua3MiLAogICAgYWN0aW9uPSJzdG9yZV90cnVlIiwKICAgIGRlZmF1bHQ9RmFsc2UsCiAgICBoZWxwPSJFbmFibGUgdGhlIHByb2Nlc3Npbmcgb2YgZGVwZW5kZW5jeSBsaW5rcy4iLAopCgoKZGVmIGNvbnN0cmFpbnRzKCk6CiAgICByZXR1cm4gT3B0aW9uKAogICAgICAgICctYycsICctLWNvbnN0cmFpbnQnLAogICAgICAgIGRlc3Q9J2NvbnN0cmFpbnRzJywKICAgICAgICBhY3Rpb249J2FwcGVuZCcsCiAgICAgICAgZGVmYXVsdD1bXSwKICAgICAgICBtZXRhdmFyPSdmaWxlJywKICAgICAgICBoZWxwPSdDb25zdHJhaW4gdmVyc2lvbnMgdXNpbmcgdGhlIGdpdmVuIGNvbnN0cmFpbnRzIGZpbGUuICcKICAgICAgICAnVGhpcyBvcHRpb24gY2FuIGJlIHVzZWQgbXVsdGlwbGUgdGltZXMuJykKCgpkZWYgcmVxdWlyZW1lbnRzKCk6CiAgICByZXR1cm4gT3B0aW9uKAogICAgICAgICctcicsICctLXJlcXVpcmVtZW50JywKICAgICAgICBkZXN0PSdyZXF1aXJlbWVudHMnLAogICAgICAgIGFjdGlvbj0nYXBwZW5kJywKICAgICAgICBkZWZhdWx0PVtdLAogICAgICAgIG1ldGF2YXI9J2ZpbGUnLAogICAgICAgIGhlbHA9J0luc3RhbGwgZnJvbSB0aGUgZ2l2ZW4gcmVxdWlyZW1lbnRzIGZpbGUuICcKICAgICAgICAnVGhpcyBvcHRpb24gY2FuIGJlIHVzZWQgbXVsdGlwbGUgdGltZXMuJykKCgpkZWYgZWRpdGFibGUoKToKICAgIHJldHVybiBPcHRpb24oCiAgICAgICAgJy1lJywgJy0tZWRpdGFibGUnLAogICAgICAgIGRlc3Q9J2VkaXRhYmxlcycsCiAgICAgICAgYWN0aW9uPSdhcHBlbmQnLAogICAgICAgIGRlZmF1bHQ9W10sCiAgICAgICAgbWV0YXZhcj0ncGF0aC91cmwnLAogICAgICAgIGhlbHA9KCdJbnN0YWxsIGEgcHJvamVjdCBpbiBlZGl0YWJsZSBtb2RlIChpLmUuIHNldHVwdG9vbHMgJwogICAgICAgICAgICAgICciZGV2ZWxvcCBtb2RlIikgZnJvbSBhIGxvY2FsIHByb2plY3QgcGF0aCBvciBhIFZDUyB1cmwuJyksCiAgICApCgpzcmMgPSBwYXJ0aWFsKAogICAgT3B0aW9uLAogICAgJy0tc3JjJywgJy0tc291cmNlJywgJy0tc291cmNlLWRpcicsICctLXNvdXJjZS1kaXJlY3RvcnknLAogICAgZGVzdD0nc3JjX2RpcicsCiAgICBtZXRhdmFyPSdkaXInLAogICAgZGVmYXVsdD1zcmNfcHJlZml4LAogICAgaGVscD0nRGlyZWN0b3J5IHRvIGNoZWNrIG91dCBlZGl0YWJsZSBwcm9qZWN0cyBpbnRvLiAnCiAgICAnVGhlIGRlZmF1bHQgaW4gYSB2aXJ0dWFsZW52IGlzICI8dmVudiBwYXRoPi9zcmMiLiAnCiAgICAnVGhlIGRlZmF1bHQgZm9yIGdsb2JhbCBpbnN0YWxscyBpcyAiPGN1cnJlbnQgZGlyPi9zcmMiLicKKQoKIyBYWFg6IGRlcHJlY2F0ZWQsIHJlbW92ZSBpbiA5LjAKdXNlX3doZWVsID0gcGFydGlhbCgKICAgIE9wdGlvbiwKICAgICctLXVzZS13aGVlbCcsCiAgICBkZXN0PSd1c2Vfd2hlZWwnLAogICAgYWN0aW9uPSdzdG9yZV90cnVlJywKICAgIGRlZmF1bHQ9VHJ1ZSwKICAgIGhlbHA9U1VQUFJFU1NfSEVMUCwKKQoKIyBYWFg6IGRlcHJlY2F0ZWQsIHJlbW92ZSBpbiA5LjAKbm9fdXNlX3doZWVsID0gcGFydGlhbCgKICAgIE9wdGlvbiwKICAgICctLW5vLXVzZS13aGVlbCcsCiAgICBkZXN0PSd1c2Vfd2hlZWwnLAogICAgYWN0aW9uPSdzdG9yZV9mYWxzZScsCiAgICBkZWZhdWx0PVRydWUsCiAgICBoZWxwPSgnRG8gbm90IEZpbmQgYW5kIHByZWZlciB3aGVlbCBhcmNoaXZlcyB3aGVuIHNlYXJjaGluZyBpbmRleGVzIGFuZCAnCiAgICAgICAgICAnZmluZC1saW5rcyBsb2NhdGlvbnMuIERFUFJFQ0FURUQgaW4gZmF2b3VyIG9mIC0tbm8tYmluYXJ5LicpLAopCgoKZGVmIF9nZXRfZm9ybWF0X2NvbnRyb2wodmFsdWVzLCBvcHRpb24pOgogICAgIiIiR2V0IGEgZm9ybWF0X2NvbnRyb2wgb2JqZWN0LiIiIgogICAgcmV0dXJuIGdldGF0dHIodmFsdWVzLCBvcHRpb24uZGVzdCkKCgpkZWYgX2hhbmRsZV9ub19iaW5hcnkob3B0aW9uLCBvcHRfc3RyLCB2YWx1ZSwgcGFyc2VyKToKICAgIGV4aXN0aW5nID0gZ2V0YXR0cihwYXJzZXIudmFsdWVzLCBvcHRpb24uZGVzdCkKICAgIGZtdF9jdGxfaGFuZGxlX211dHVhbF9leGNsdWRlKAogICAgICAgIHZhbHVlLCBleGlzdGluZy5ub19iaW5hcnksIGV4aXN0aW5nLm9ubHlfYmluYXJ5KQoKCmRlZiBfaGFuZGxlX29ubHlfYmluYXJ5KG9wdGlvbiwgb3B0X3N0ciwgdmFsdWUsIHBhcnNlcik6CiAgICBleGlzdGluZyA9IGdldGF0dHIocGFyc2VyLnZhbHVlcywgb3B0aW9uLmRlc3QpCiAgICBmbXRfY3RsX2hhbmRsZV9tdXR1YWxfZXhjbHVkZSgKICAgICAgICB2YWx1ZSwgZXhpc3Rpbmcub25seV9iaW5hcnksIGV4aXN0aW5nLm5vX2JpbmFyeSkKCgpkZWYgbm9fYmluYXJ5KCk6CiAgICByZXR1cm4gT3B0aW9uKAogICAgICAgICItLW5vLWJpbmFyeSIsIGRlc3Q9ImZvcm1hdF9jb250cm9sIiwgYWN0aW9uPSJjYWxsYmFjayIsCiAgICAgICAgY2FsbGJhY2s9X2hhbmRsZV9ub19iaW5hcnksIHR5cGU9InN0ciIsCiAgICAgICAgZGVmYXVsdD1Gb3JtYXRDb250cm9sKHNldCgpLCBzZXQoKSksCiAgICAgICAgaGVscD0iRG8gbm90IHVzZSBiaW5hcnkgcGFja2FnZXMuIENhbiBiZSBzdXBwbGllZCBtdWx0aXBsZSB0aW1lcywgYW5kICIKICAgICAgICAgICAgICJlYWNoIHRpbWUgYWRkcyB0byB0aGUgZXhpc3RpbmcgdmFsdWUuIEFjY2VwdHMgZWl0aGVyIDphbGw6IHRvICIKICAgICAgICAgICAgICJkaXNhYmxlIGFsbCBiaW5hcnkgcGFja2FnZXMsIDpub25lOiB0byBlbXB0eSB0aGUgc2V0LCBvciBvbmUgb3IgIgogICAgICAgICAgICAgIm1vcmUgcGFja2FnZSBuYW1lcyB3aXRoIGNvbW1hcyBiZXR3ZWVuIHRoZW0uIE5vdGUgdGhhdCBzb21lICIKICAgICAgICAgICAgICJwYWNrYWdlcyBhcmUgdHJpY2t5IHRvIGNvbXBpbGUgYW5kIG1heSBmYWlsIHRvIGluc3RhbGwgd2hlbiAiCiAgICAgICAgICAgICAidGhpcyBvcHRpb24gaXMgdXNlZCBvbiB0aGVtLiIpCgoKZGVmIG9ubHlfYmluYXJ5KCk6CiAgICByZXR1cm4gT3B0aW9uKAogICAgICAgICItLW9ubHktYmluYXJ5IiwgZGVzdD0iZm9ybWF0X2NvbnRyb2wiLCBhY3Rpb249ImNhbGxiYWNrIiwKICAgICAgICBjYWxsYmFjaz1faGFuZGxlX29ubHlfYmluYXJ5LCB0eXBlPSJzdHIiLAogICAgICAgIGRlZmF1bHQ9Rm9ybWF0Q29udHJvbChzZXQoKSwgc2V0KCkpLAogICAgICAgIGhlbHA9IkRvIG5vdCB1c2Ugc291cmNlIHBhY2thZ2VzLiBDYW4gYmUgc3VwcGxpZWQgbXVsdGlwbGUgdGltZXMsIGFuZCAiCiAgICAgICAgICAgICAiZWFjaCB0aW1lIGFkZHMgdG8gdGhlIGV4aXN0aW5nIHZhbHVlLiBBY2NlcHRzIGVpdGhlciA6YWxsOiB0byAiCiAgICAgICAgICAgICAiZGlzYWJsZSBhbGwgc291cmNlIHBhY2thZ2VzLCA6bm9uZTogdG8gZW1wdHkgdGhlIHNldCwgb3Igb25lIG9yICIKICAgICAgICAgICAgICJtb3JlIHBhY2thZ2UgbmFtZXMgd2l0aCBjb21tYXMgYmV0d2VlbiB0aGVtLiBQYWNrYWdlcyB3aXRob3V0ICIKICAgICAgICAgICAgICJiaW5hcnkgZGlzdHJpYnV0aW9ucyB3aWxsIGZhaWwgdG8gaW5zdGFsbCB3aGVuIHRoaXMgb3B0aW9uIGlzICIKICAgICAgICAgICAgICJ1c2VkIG9uIHRoZW0uIikKCgpjYWNoZV9kaXIgPSBwYXJ0aWFsKAogICAgT3B0aW9uLAogICAgIi0tY2FjaGUtZGlyIiwKICAgIGRlc3Q9ImNhY2hlX2RpciIsCiAgICBkZWZhdWx0PVVTRVJfQ0FDSEVfRElSLAogICAgbWV0YXZhcj0iZGlyIiwKICAgIGhlbHA9IlN0b3JlIHRoZSBjYWNoZSBkYXRhIGluIDxkaXI+LiIKKQoKbm9fY2FjaGUgPSBwYXJ0aWFsKAogICAgT3B0aW9uLAogICAgIi0tbm8tY2FjaGUtZGlyIiwKICAgIGRlc3Q9ImNhY2hlX2RpciIsCiAgICBhY3Rpb249InN0b3JlX2ZhbHNlIiwKICAgIGhlbHA9IkRpc2FibGUgdGhlIGNhY2hlLiIsCikKCm5vX2RlcHMgPSBwYXJ0aWFsKAogICAgT3B0aW9uLAogICAgJy0tbm8tZGVwcycsICctLW5vLWRlcGVuZGVuY2llcycsCiAgICBkZXN0PSdpZ25vcmVfZGVwZW5kZW5jaWVzJywKICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCiAgICBkZWZhdWx0PUZhbHNlLAogICAgaGVscD0iRG9uJ3QgaW5zdGFsbCBwYWNrYWdlIGRlcGVuZGVuY2llcy4iKQoKYnVpbGRfZGlyID0gcGFydGlhbCgKICAgIE9wdGlvbiwKICAgICctYicsICctLWJ1aWxkJywgJy0tYnVpbGQtZGlyJywgJy0tYnVpbGQtZGlyZWN0b3J5JywKICAgIGRlc3Q9J2J1aWxkX2RpcicsCiAgICBtZXRhdmFyPSdkaXInLAogICAgaGVscD0nRGlyZWN0b3J5IHRvIHVucGFjayBwYWNrYWdlcyBpbnRvIGFuZCBidWlsZCBpbi4nCikKCmlnbm9yZV9yZXF1aXJlc19weXRob24gPSBwYXJ0aWFsKAogICAgT3B0aW9uLAogICAgJy0taWdub3JlLXJlcXVpcmVzLXB5dGhvbicsCiAgICBkZXN0PSdpZ25vcmVfcmVxdWlyZXNfcHl0aG9uJywKICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCiAgICBoZWxwPSdJZ25vcmUgdGhlIFJlcXVpcmVzLVB5dGhvbiBpbmZvcm1hdGlvbi4nKQoKaW5zdGFsbF9vcHRpb25zID0gcGFydGlhbCgKICAgIE9wdGlvbiwKICAgICctLWluc3RhbGwtb3B0aW9uJywKICAgIGRlc3Q9J2luc3RhbGxfb3B0aW9ucycsCiAgICBhY3Rpb249J2FwcGVuZCcsCiAgICBtZXRhdmFyPSdvcHRpb25zJywKICAgIGhlbHA9IkV4dHJhIGFyZ3VtZW50cyB0byBiZSBzdXBwbGllZCB0byB0aGUgc2V0dXAucHkgaW5zdGFsbCAiCiAgICAgICAgICJjb21tYW5kICh1c2UgbGlrZSAtLWluc3RhbGwtb3B0aW9uPVwiLS1pbnN0YWxsLXNjcmlwdHM9L3Vzci9sb2NhbC8iCiAgICAgICAgICJiaW5cIikuIFVzZSBtdWx0aXBsZSAtLWluc3RhbGwtb3B0aW9uIG9wdGlvbnMgdG8gcGFzcyBtdWx0aXBsZSAiCiAgICAgICAgICJvcHRpb25zIHRvIHNldHVwLnB5IGluc3RhbGwuIElmIHlvdSBhcmUgdXNpbmcgYW4gb3B0aW9uIHdpdGggYSAiCiAgICAgICAgICJkaXJlY3RvcnkgcGF0aCwgYmUgc3VyZSB0byB1c2UgYWJzb2x1dGUgcGF0aC4iKQoKZ2xvYmFsX29wdGlvbnMgPSBwYXJ0aWFsKAogICAgT3B0aW9uLAogICAgJy0tZ2xvYmFsLW9wdGlvbicsCiAgICBkZXN0PSdnbG9iYWxfb3B0aW9ucycsCiAgICBhY3Rpb249J2FwcGVuZCcsCiAgICBtZXRhdmFyPSdvcHRpb25zJywKICAgIGhlbHA9IkV4dHJhIGdsb2JhbCBvcHRpb25zIHRvIGJlIHN1cHBsaWVkIHRvIHRoZSBzZXR1cC5weSAiCiAgICAgICAgICJjYWxsIGJlZm9yZSB0aGUgaW5zdGFsbCBjb21tYW5kLiIpCgpub19jbGVhbiA9IHBhcnRpYWwoCiAgICBPcHRpb24sCiAgICAnLS1uby1jbGVhbicsCiAgICBhY3Rpb249J3N0b3JlX3RydWUnLAogICAgZGVmYXVsdD1GYWxzZSwKICAgIGhlbHA9IkRvbid0IGNsZWFuIHVwIGJ1aWxkIGRpcmVjdG9yaWVzLiIpCgpwcmUgPSBwYXJ0aWFsKAogICAgT3B0aW9uLAogICAgJy0tcHJlJywKICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCiAgICBkZWZhdWx0PUZhbHNlLAogICAgaGVscD0iSW5jbHVkZSBwcmUtcmVsZWFzZSBhbmQgZGV2ZWxvcG1lbnQgdmVyc2lvbnMuIEJ5IGRlZmF1bHQsICIKICAgICAgICAgInBpcCBvbmx5IGZpbmRzIHN0YWJsZSB2ZXJzaW9ucy4iKQoKZGlzYWJsZV9waXBfdmVyc2lvbl9jaGVjayA9IHBhcnRpYWwoCiAgICBPcHRpb24sCiAgICAiLS1kaXNhYmxlLXBpcC12ZXJzaW9uLWNoZWNrIiwKICAgIGRlc3Q9ImRpc2FibGVfcGlwX3ZlcnNpb25fY2hlY2siLAogICAgYWN0aW9uPSJzdG9yZV90cnVlIiwKICAgIGRlZmF1bHQ9RmFsc2UsCiAgICBoZWxwPSJEb24ndCBwZXJpb2RpY2FsbHkgY2hlY2sgUHlQSSB0byBkZXRlcm1pbmUgd2hldGhlciBhIG5ldyB2ZXJzaW9uICIKICAgICAgICAgIm9mIHBpcCBpcyBhdmFpbGFibGUgZm9yIGRvd25sb2FkLiBJbXBsaWVkIHdpdGggLS1uby1pbmRleC4iKQoKIyBEZXByZWNhdGVkLCBSZW1vdmUgbGF0ZXIKYWx3YXlzX3VuemlwID0gcGFydGlhbCgKICAgIE9wdGlvbiwKICAgICctWicsICctLWFsd2F5cy11bnppcCcsCiAgICBkZXN0PSdhbHdheXNfdW56aXAnLAogICAgYWN0aW9uPSdzdG9yZV90cnVlJywKICAgIGhlbHA9U1VQUFJFU1NfSEVMUCwKKQoKCmRlZiBfbWVyZ2VfaGFzaChvcHRpb24sIG9wdF9zdHIsIHZhbHVlLCBwYXJzZXIpOgogICAgIiIiR2l2ZW4gYSB2YWx1ZSBzcGVsbGVkICJhbGdvOmRpZ2VzdCIsIGFwcGVuZCB0aGUgZGlnZXN0IHRvIGEgbGlzdAogICAgcG9pbnRlZCB0byBpbiBhIGRpY3QgYnkgdGhlIGFsZ28gbmFtZS4iIiIKICAgIGlmIG5vdCBwYXJzZXIudmFsdWVzLmhhc2hlczoKICAgICAgICBwYXJzZXIudmFsdWVzLmhhc2hlcyA9IHt9CiAgICB0cnk6CiAgICAgICAgYWxnbywgZGlnZXN0ID0gdmFsdWUuc3BsaXQoJzonLCAxKQogICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgcGFyc2VyLmVycm9yKCdBcmd1bWVudHMgdG8gJXMgbXVzdCBiZSBhIGhhc2ggbmFtZSAnCiAgICAgICAgICAgICAgICAgICAgICdmb2xsb3dlZCBieSBhIHZhbHVlLCBsaWtlIC0taGFzaD1zaGEyNTY6YWJjZGUuLi4nICUKICAgICAgICAgICAgICAgICAgICAgb3B0X3N0cikKICAgIGlmIGFsZ28gbm90IGluIFNUUk9OR19IQVNIRVM6CiAgICAgICAgcGFyc2VyLmVycm9yKCdBbGxvd2VkIGhhc2ggYWxnb3JpdGhtcyBmb3IgJXMgYXJlICVzLicgJQogICAgICAgICAgICAgICAgICAgICAob3B0X3N0ciwgJywgJy5qb2luKFNUUk9OR19IQVNIRVMpKSkKICAgIHBhcnNlci52YWx1ZXMuaGFzaGVzLnNldGRlZmF1bHQoYWxnbywgW10pLmFwcGVuZChkaWdlc3QpCgoKaGFzaCA9IHBhcnRpYWwoCiAgICBPcHRpb24sCiAgICAnLS1oYXNoJywKICAgICMgSGFzaCB2YWx1ZXMgZXZlbnR1YWxseSBlbmQgdXAgaW4gSW5zdGFsbFJlcXVpcmVtZW50Lmhhc2hlcyBkdWUgdG8KICAgICMgX19kaWN0X18gY29weWluZyBpbiBwcm9jZXNzX2xpbmUoKS4KICAgIGRlc3Q9J2hhc2hlcycsCiAgICBhY3Rpb249J2NhbGxiYWNrJywKICAgIGNhbGxiYWNrPV9tZXJnZV9oYXNoLAogICAgdHlwZT0nc3RyaW5nJywKICAgIGhlbHA9IlZlcmlmeSB0aGF0IHRoZSBwYWNrYWdlJ3MgYXJjaGl2ZSBtYXRjaGVzIHRoaXMgIgogICAgICAgICAnaGFzaCBiZWZvcmUgaW5zdGFsbGluZy4gRXhhbXBsZTogLS1oYXNoPXNoYTI1NjphYmNkZWYuLi4nKQoKCnJlcXVpcmVfaGFzaGVzID0gcGFydGlhbCgKICAgIE9wdGlvbiwKICAgICctLXJlcXVpcmUtaGFzaGVzJywKICAgIGRlc3Q9J3JlcXVpcmVfaGFzaGVzJywKICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCiAgICBkZWZhdWx0PUZhbHNlLAogICAgaGVscD0nUmVxdWlyZSBhIGhhc2ggdG8gY2hlY2sgZWFjaCByZXF1aXJlbWVudCBhZ2FpbnN0LCBmb3IgJwogICAgICAgICAncmVwZWF0YWJsZSBpbnN0YWxscy4gVGhpcyBvcHRpb24gaXMgaW1wbGllZCB3aGVuIGFueSBwYWNrYWdlIGluIGEgJwogICAgICAgICAncmVxdWlyZW1lbnRzIGZpbGUgaGFzIGEgLS1oYXNoIG9wdGlvbi4nKQoKCiMjIyMjIyMjIyMKIyBncm91cHMgIwojIyMjIyMjIyMjCgpnZW5lcmFsX2dyb3VwID0gewogICAgJ25hbWUnOiAnR2VuZXJhbCBPcHRpb25zJywKICAgICdvcHRpb25zJzogWwogICAgICAgIGhlbHBfLAogICAgICAgIGlzb2xhdGVkX21vZGUsCiAgICAgICAgcmVxdWlyZV92aXJ0dWFsZW52LAogICAgICAgIHZlcmJvc2UsCiAgICAgICAgdmVyc2lvbiwKICAgICAgICBxdWlldCwKICAgICAgICBsb2csCiAgICAgICAgbm9faW5wdXQsCiAgICAgICAgcHJveHksCiAgICAgICAgcmV0cmllcywKICAgICAgICB0aW1lb3V0LAogICAgICAgIGRlZmF1bHRfdmNzLAogICAgICAgIHNraXBfcmVxdWlyZW1lbnRzX3JlZ2V4LAogICAgICAgIGV4aXN0c19hY3Rpb24sCiAgICAgICAgdHJ1c3RlZF9ob3N0LAogICAgICAgIGNlcnQsCiAgICAgICAgY2xpZW50X2NlcnQsCiAgICAgICAgY2FjaGVfZGlyLAogICAgICAgIG5vX2NhY2hlLAogICAgICAgIGRpc2FibGVfcGlwX3ZlcnNpb25fY2hlY2ssCiAgICBdCn0KCm5vbl9kZXByZWNhdGVkX2luZGV4X2dyb3VwID0gewogICAgJ25hbWUnOiAnUGFja2FnZSBJbmRleCBPcHRpb25zJywKICAgICdvcHRpb25zJzogWwogICAgICAgIGluZGV4X3VybCwKICAgICAgICBleHRyYV9pbmRleF91cmwsCiAgICAgICAgbm9faW5kZXgsCiAgICAgICAgZmluZF9saW5rcywKICAgICAgICBwcm9jZXNzX2RlcGVuZGVuY3lfbGlua3MsCiAgICBdCn0KCmluZGV4X2dyb3VwID0gewogICAgJ25hbWUnOiAnUGFja2FnZSBJbmRleCBPcHRpb25zIChpbmNsdWRpbmcgZGVwcmVjYXRlZCBvcHRpb25zKScsCiAgICAnb3B0aW9ucyc6IG5vbl9kZXByZWNhdGVkX2luZGV4X2dyb3VwWydvcHRpb25zJ10gKyBbCiAgICAgICAgYWxsb3dfZXh0ZXJuYWwsCiAgICAgICAgYWxsb3dfYWxsX2V4dGVybmFsLAogICAgICAgIG5vX2FsbG93X2V4dGVybmFsLAogICAgICAgIGFsbG93X3Vuc2FmZSwKICAgICAgICBub19hbGxvd191bnNhZmUsCiAgICBdCn0KUEsDBBQAAAAAAAAAIQCQDYdDxAgAAMQIAAA1AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvY29tbWFuZHMvX19pbml0X18ucHkiIiIKUGFja2FnZSBjb250YWluaW5nIGFsbCBwaXAgY29tbWFuZHMKIiIiCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0Cgpmcm9tIHBpcC5jb21tYW5kcy5jb21wbGV0aW9uIGltcG9ydCBDb21wbGV0aW9uQ29tbWFuZApmcm9tIHBpcC5jb21tYW5kcy5kb3dubG9hZCBpbXBvcnQgRG93bmxvYWRDb21tYW5kCmZyb20gcGlwLmNvbW1hbmRzLmZyZWV6ZSBpbXBvcnQgRnJlZXplQ29tbWFuZApmcm9tIHBpcC5jb21tYW5kcy5oYXNoIGltcG9ydCBIYXNoQ29tbWFuZApmcm9tIHBpcC5jb21tYW5kcy5oZWxwIGltcG9ydCBIZWxwQ29tbWFuZApmcm9tIHBpcC5jb21tYW5kcy5saXN0IGltcG9ydCBMaXN0Q29tbWFuZApmcm9tIHBpcC5jb21tYW5kcy5jaGVjayBpbXBvcnQgQ2hlY2tDb21tYW5kCmZyb20gcGlwLmNvbW1hbmRzLnNlYXJjaCBpbXBvcnQgU2VhcmNoQ29tbWFuZApmcm9tIHBpcC5jb21tYW5kcy5zaG93IGltcG9ydCBTaG93Q29tbWFuZApmcm9tIHBpcC5jb21tYW5kcy5pbnN0YWxsIGltcG9ydCBJbnN0YWxsQ29tbWFuZApmcm9tIHBpcC5jb21tYW5kcy51bmluc3RhbGwgaW1wb3J0IFVuaW5zdGFsbENvbW1hbmQKZnJvbSBwaXAuY29tbWFuZHMud2hlZWwgaW1wb3J0IFdoZWVsQ29tbWFuZAoKCmNvbW1hbmRzX2RpY3QgPSB7CiAgICBDb21wbGV0aW9uQ29tbWFuZC5uYW1lOiBDb21wbGV0aW9uQ29tbWFuZCwKICAgIEZyZWV6ZUNvbW1hbmQubmFtZTogRnJlZXplQ29tbWFuZCwKICAgIEhhc2hDb21tYW5kLm5hbWU6IEhhc2hDb21tYW5kLAogICAgSGVscENvbW1hbmQubmFtZTogSGVscENvbW1hbmQsCiAgICBTZWFyY2hDb21tYW5kLm5hbWU6IFNlYXJjaENvbW1hbmQsCiAgICBTaG93Q29tbWFuZC5uYW1lOiBTaG93Q29tbWFuZCwKICAgIEluc3RhbGxDb21tYW5kLm5hbWU6IEluc3RhbGxDb21tYW5kLAogICAgVW5pbnN0YWxsQ29tbWFuZC5uYW1lOiBVbmluc3RhbGxDb21tYW5kLAogICAgRG93bmxvYWRDb21tYW5kLm5hbWU6IERvd25sb2FkQ29tbWFuZCwKICAgIExpc3RDb21tYW5kLm5hbWU6IExpc3RDb21tYW5kLAogICAgQ2hlY2tDb21tYW5kLm5hbWU6IENoZWNrQ29tbWFuZCwKICAgIFdoZWVsQ29tbWFuZC5uYW1lOiBXaGVlbENvbW1hbmQsCn0KCgpjb21tYW5kc19vcmRlciA9IFsKICAgIEluc3RhbGxDb21tYW5kLAogICAgRG93bmxvYWRDb21tYW5kLAogICAgVW5pbnN0YWxsQ29tbWFuZCwKICAgIEZyZWV6ZUNvbW1hbmQsCiAgICBMaXN0Q29tbWFuZCwKICAgIFNob3dDb21tYW5kLAogICAgQ2hlY2tDb21tYW5kLAogICAgU2VhcmNoQ29tbWFuZCwKICAgIFdoZWVsQ29tbWFuZCwKICAgIEhhc2hDb21tYW5kLAogICAgQ29tcGxldGlvbkNvbW1hbmQsCiAgICBIZWxwQ29tbWFuZCwKXQoKCmRlZiBnZXRfc3VtbWFyaWVzKG9yZGVyZWQ9VHJ1ZSk6CiAgICAiIiJZaWVsZHMgc29ydGVkIChjb21tYW5kIG5hbWUsIGNvbW1hbmQgc3VtbWFyeSkgdHVwbGVzLiIiIgoKICAgIGlmIG9yZGVyZWQ6CiAgICAgICAgY21kaXRlbXMgPSBfc29ydF9jb21tYW5kcyhjb21tYW5kc19kaWN0LCBjb21tYW5kc19vcmRlcikKICAgIGVsc2U6CiAgICAgICAgY21kaXRlbXMgPSBjb21tYW5kc19kaWN0Lml0ZW1zKCkKCiAgICBmb3IgbmFtZSwgY29tbWFuZF9jbGFzcyBpbiBjbWRpdGVtczoKICAgICAgICB5aWVsZCAobmFtZSwgY29tbWFuZF9jbGFzcy5zdW1tYXJ5KQoKCmRlZiBnZXRfc2ltaWxhcl9jb21tYW5kcyhuYW1lKToKICAgICIiIkNvbW1hbmQgbmFtZSBhdXRvLWNvcnJlY3QuIiIiCiAgICBmcm9tIGRpZmZsaWIgaW1wb3J0IGdldF9jbG9zZV9tYXRjaGVzCgogICAgbmFtZSA9IG5hbWUubG93ZXIoKQoKICAgIGNsb3NlX2NvbW1hbmRzID0gZ2V0X2Nsb3NlX21hdGNoZXMobmFtZSwgY29tbWFuZHNfZGljdC5rZXlzKCkpCgogICAgaWYgY2xvc2VfY29tbWFuZHM6CiAgICAgICAgcmV0dXJuIGNsb3NlX2NvbW1hbmRzWzBdCiAgICBlbHNlOgogICAgICAgIHJldHVybiBGYWxzZQoKCmRlZiBfc29ydF9jb21tYW5kcyhjbWRkaWN0LCBvcmRlcik6CiAgICBkZWYga2V5Zm4oa2V5KToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBvcmRlci5pbmRleChrZXlbMV0pCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICMgdW5vcmRlcmVkIGl0ZW1zIHNob3VsZCBjb21lIGxhc3QKICAgICAgICAgICAgcmV0dXJuIDB4ZmYKCiAgICByZXR1cm4gc29ydGVkKGNtZGRpY3QuaXRlbXMoKSwga2V5PWtleWZuKQpQSwMEFAAAAAAAAAAhAB1hO19mBQAAZgUAADIAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9jb21tYW5kcy9jaGVjay5weWltcG9ydCBsb2dnaW5nCgpmcm9tIHBpcC5iYXNlY29tbWFuZCBpbXBvcnQgQ29tbWFuZApmcm9tIHBpcC5vcGVyYXRpb25zLmNoZWNrIGltcG9ydCBjaGVja19yZXF1aXJlbWVudHMKZnJvbSBwaXAudXRpbHMgaW1wb3J0IGdldF9pbnN0YWxsZWRfZGlzdHJpYnV0aW9ucwoKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKCmNsYXNzIENoZWNrQ29tbWFuZChDb21tYW5kKToKICAgICIiIlZlcmlmeSBpbnN0YWxsZWQgcGFja2FnZXMgaGF2ZSBjb21wYXRpYmxlIGRlcGVuZGVuY2llcy4iIiIKICAgIG5hbWUgPSAnY2hlY2snCiAgICB1c2FnZSA9ICIiIgogICAgICAlcHJvZyBbb3B0aW9uc10iIiIKICAgIHN1bW1hcnkgPSAnVmVyaWZ5IGluc3RhbGxlZCBwYWNrYWdlcyBoYXZlIGNvbXBhdGlibGUgZGVwZW5kZW5jaWVzLicKCiAgICBkZWYgcnVuKHNlbGYsIG9wdGlvbnMsIGFyZ3MpOgogICAgICAgIGRpc3RzID0gZ2V0X2luc3RhbGxlZF9kaXN0cmlidXRpb25zKGxvY2FsX29ubHk9RmFsc2UsIHNraXA9KCkpCiAgICAgICAgbWlzc2luZ19yZXFzX2RpY3QsIGluY29tcGF0aWJsZV9yZXFzX2RpY3QgPSBjaGVja19yZXF1aXJlbWVudHMoZGlzdHMpCgogICAgICAgIGZvciBkaXN0IGluIGRpc3RzOgogICAgICAgICAgICBrZXkgPSAnJXM9PSVzJyAlIChkaXN0LnByb2plY3RfbmFtZSwgZGlzdC52ZXJzaW9uKQoKICAgICAgICAgICAgZm9yIHJlcXVpcmVtZW50IGluIG1pc3NpbmdfcmVxc19kaWN0LmdldChrZXksIFtdKToKICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKAogICAgICAgICAgICAgICAgICAgICIlcyAlcyByZXF1aXJlcyAlcywgd2hpY2ggaXMgbm90IGluc3RhbGxlZC4iLAogICAgICAgICAgICAgICAgICAgIGRpc3QucHJvamVjdF9uYW1lLCBkaXN0LnZlcnNpb24sIHJlcXVpcmVtZW50LnByb2plY3RfbmFtZSkKCiAgICAgICAgICAgIGZvciByZXF1aXJlbWVudCwgYWN0dWFsIGluIGluY29tcGF0aWJsZV9yZXFzX2RpY3QuZ2V0KGtleSwgW10pOgogICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oCiAgICAgICAgICAgICAgICAgICAgIiVzICVzIGhhcyByZXF1aXJlbWVudCAlcywgYnV0IHlvdSBoYXZlICVzICVzLiIsCiAgICAgICAgICAgICAgICAgICAgZGlzdC5wcm9qZWN0X25hbWUsIGRpc3QudmVyc2lvbiwgcmVxdWlyZW1lbnQsCiAgICAgICAgICAgICAgICAgICAgYWN0dWFsLnByb2plY3RfbmFtZSwgYWN0dWFsLnZlcnNpb24pCgogICAgICAgIGlmIG1pc3NpbmdfcmVxc19kaWN0IG9yIGluY29tcGF0aWJsZV9yZXFzX2RpY3Q6CiAgICAgICAgICAgIHJldHVybiAxCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbG9nZ2VyLmluZm8oIk5vIGJyb2tlbiByZXF1aXJlbWVudHMgZm91bmQuIikKUEsDBBQAAAAAAAAAIQAwwcyzlQkAAJUJAAA3AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvY29tbWFuZHMvY29tcGxldGlvbi5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgc3lzCmZyb20gcGlwLmJhc2Vjb21tYW5kIGltcG9ydCBDb21tYW5kCgpCQVNFX0NPTVBMRVRJT04gPSAiIiIKIyBwaXAgJShzaGVsbClzIGNvbXBsZXRpb24gc3RhcnQlKHNjcmlwdClzIyBwaXAgJShzaGVsbClzIGNvbXBsZXRpb24gZW5kCiIiIgoKQ09NUExFVElPTl9TQ1JJUFRTID0gewogICAgJ2Jhc2gnOiAiIiIKX3BpcF9jb21wbGV0aW9uKCkKewogICAgQ09NUFJFUExZPSggJCggQ09NUF9XT1JEUz0iJHtDT01QX1dPUkRTWypdfSIgXFwKICAgICAgICAgICAgICAgICAgIENPTVBfQ1dPUkQ9JENPTVBfQ1dPUkQgXFwKICAgICAgICAgICAgICAgICAgIFBJUF9BVVRPX0NPTVBMRVRFPTEgJDEgKSApCn0KY29tcGxldGUgLW8gZGVmYXVsdCAtRiBfcGlwX2NvbXBsZXRpb24gcGlwCiIiIiwgJ3pzaCc6ICIiIgpmdW5jdGlvbiBfcGlwX2NvbXBsZXRpb24gewogIGxvY2FsIHdvcmRzIGN3b3JkCiAgcmVhZCAtQWMgd29yZHMKICByZWFkIC1jbiBjd29yZAogIHJlcGx5PSggJCggQ09NUF9XT1JEUz0iJHdvcmRzWypdIiBcXAogICAgICAgICAgICAgQ09NUF9DV09SRD0kKCggY3dvcmQtMSApKSBcXAogICAgICAgICAgICAgUElQX0FVVE9fQ09NUExFVEU9MSAkd29yZHNbMV0gKSApCn0KY29tcGN0bCAtSyBfcGlwX2NvbXBsZXRpb24gcGlwCiIiIiwgJ2Zpc2gnOiAiIiIKZnVuY3Rpb24gX19maXNoX2NvbXBsZXRlX3BpcAogICAgc2V0IC1seCBDT01QX1dPUkRTIChjb21tYW5kbGluZSAtbykgIiIKICAgIHNldCAtbHggQ09NUF9DV09SRCAobWF0aCAoY29udGFpbnMgLWkgLS0gKGNvbW1hbmRsaW5lIC10KSAkQ09NUF9XT1JEUyktMSkKICAgIHNldCAtbHggUElQX0FVVE9fQ09NUExFVEUgMQogICAgc3RyaW5nIHNwbGl0IFwgIC0tIChldmFsICRDT01QX1dPUkRTWzFdKQplbmQKY29tcGxldGUgLWZhICIoX19maXNoX2NvbXBsZXRlX3BpcCkiIC1jIHBpcAoiIiJ9CgoKY2xhc3MgQ29tcGxldGlvbkNvbW1hbmQoQ29tbWFuZCk6CiAgICAiIiJBIGhlbHBlciBjb21tYW5kIHRvIGJlIHVzZWQgZm9yIGNvbW1hbmQgY29tcGxldGlvbi4iIiIKICAgIG5hbWUgPSAnY29tcGxldGlvbicKICAgIHN1bW1hcnkgPSAnQSBoZWxwZXIgY29tbWFuZCB1c2VkIGZvciBjb21tYW5kIGNvbXBsZXRpb24uJwoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprdyk6CiAgICAgICAgc3VwZXIoQ29tcGxldGlvbkNvbW1hbmQsIHNlbGYpLl9faW5pdF9fKCphcmdzLCAqKmt3KQoKICAgICAgICBjbWRfb3B0cyA9IHNlbGYuY21kX29wdHMKCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgJy0tYmFzaCcsICctYicsCiAgICAgICAgICAgIGFjdGlvbj0nc3RvcmVfY29uc3QnLAogICAgICAgICAgICBjb25zdD0nYmFzaCcsCiAgICAgICAgICAgIGRlc3Q9J3NoZWxsJywKICAgICAgICAgICAgaGVscD0nRW1pdCBjb21wbGV0aW9uIGNvZGUgZm9yIGJhc2gnKQogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oCiAgICAgICAgICAgICctLXpzaCcsICcteicsCiAgICAgICAgICAgIGFjdGlvbj0nc3RvcmVfY29uc3QnLAogICAgICAgICAgICBjb25zdD0nenNoJywKICAgICAgICAgICAgZGVzdD0nc2hlbGwnLAogICAgICAgICAgICBoZWxwPSdFbWl0IGNvbXBsZXRpb24gY29kZSBmb3IgenNoJykKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAnLS1maXNoJywgJy1mJywKICAgICAgICAgICAgYWN0aW9uPSdzdG9yZV9jb25zdCcsCiAgICAgICAgICAgIGNvbnN0PSdmaXNoJywKICAgICAgICAgICAgZGVzdD0nc2hlbGwnLAogICAgICAgICAgICBoZWxwPSdFbWl0IGNvbXBsZXRpb24gY29kZSBmb3IgZmlzaCcpCgogICAgICAgIHNlbGYucGFyc2VyLmluc2VydF9vcHRpb25fZ3JvdXAoMCwgY21kX29wdHMpCgogICAgZGVmIHJ1bihzZWxmLCBvcHRpb25zLCBhcmdzKToKICAgICAgICAiIiJQcmludHMgdGhlIGNvbXBsZXRpb24gY29kZSBvZiB0aGUgZ2l2ZW4gc2hlbGwiIiIKICAgICAgICBzaGVsbHMgPSBDT01QTEVUSU9OX1NDUklQVFMua2V5cygpCiAgICAgICAgc2hlbGxfb3B0aW9ucyA9IFsnLS0nICsgc2hlbGwgZm9yIHNoZWxsIGluIHNvcnRlZChzaGVsbHMpXQogICAgICAgIGlmIG9wdGlvbnMuc2hlbGwgaW4gc2hlbGxzOgogICAgICAgICAgICBzY3JpcHQgPSBDT01QTEVUSU9OX1NDUklQVFMuZ2V0KG9wdGlvbnMuc2hlbGwsICcnKQogICAgICAgICAgICBwcmludChCQVNFX0NPTVBMRVRJT04gJSB7J3NjcmlwdCc6IHNjcmlwdCwgJ3NoZWxsJzogb3B0aW9ucy5zaGVsbH0pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgKICAgICAgICAgICAgICAgICdFUlJPUjogWW91IG11c3QgcGFzcyAlc1xuJyAlICcgb3IgJy5qb2luKHNoZWxsX29wdGlvbnMpCiAgICAgICAgICAgICkKUEsDBBQAAAAAAAAAIQDZHpmmgh4AAIIeAAA1AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvY29tbWFuZHMvZG93bmxvYWQucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IG9zCgpmcm9tIHBpcC5leGNlcHRpb25zIGltcG9ydCBDb21tYW5kRXJyb3IKZnJvbSBwaXAuaW5kZXggaW1wb3J0IEZvcm1hdENvbnRyb2wKZnJvbSBwaXAucmVxIGltcG9ydCBSZXF1aXJlbWVudFNldApmcm9tIHBpcC5iYXNlY29tbWFuZCBpbXBvcnQgUmVxdWlyZW1lbnRDb21tYW5kCmZyb20gcGlwIGltcG9ydCBjbWRvcHRpb25zCmZyb20gcGlwLnV0aWxzIGltcG9ydCBlbnN1cmVfZGlyLCBub3JtYWxpemVfcGF0aApmcm9tIHBpcC51dGlscy5idWlsZCBpbXBvcnQgQnVpbGREaXJlY3RvcnkKZnJvbSBwaXAudXRpbHMuZmlsZXN5c3RlbSBpbXBvcnQgY2hlY2tfcGF0aF9vd25lcgoKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKCmNsYXNzIERvd25sb2FkQ29tbWFuZChSZXF1aXJlbWVudENvbW1hbmQpOgogICAgIiIiCiAgICBEb3dubG9hZCBwYWNrYWdlcyBmcm9tOgoKICAgIC0gUHlQSSAoYW5kIG90aGVyIGluZGV4ZXMpIHVzaW5nIHJlcXVpcmVtZW50IHNwZWNpZmllcnMuCiAgICAtIFZDUyBwcm9qZWN0IHVybHMuCiAgICAtIExvY2FsIHByb2plY3QgZGlyZWN0b3JpZXMuCiAgICAtIExvY2FsIG9yIHJlbW90ZSBzb3VyY2UgYXJjaGl2ZXMuCgogICAgcGlwIGFsc28gc3VwcG9ydHMgZG93bmxvYWRpbmcgZnJvbSAicmVxdWlyZW1lbnRzIGZpbGVzIiwgd2hpY2ggcHJvdmlkZQogICAgYW4gZWFzeSB3YXkgdG8gc3BlY2lmeSBhIHdob2xlIGVudmlyb25tZW50IHRvIGJlIGRvd25sb2FkZWQuCiAgICAiIiIKICAgIG5hbWUgPSAnZG93bmxvYWQnCgogICAgdXNhZ2UgPSAiIiIKICAgICAgJXByb2cgW29wdGlvbnNdIDxyZXF1aXJlbWVudCBzcGVjaWZpZXI+IFtwYWNrYWdlLWluZGV4LW9wdGlvbnNdIC4uLgogICAgICAlcHJvZyBbb3B0aW9uc10gLXIgPHJlcXVpcmVtZW50cyBmaWxlPiBbcGFja2FnZS1pbmRleC1vcHRpb25zXSAuLi4KICAgICAgJXByb2cgW29wdGlvbnNdIFstZV0gPHZjcyBwcm9qZWN0IHVybD4gLi4uCiAgICAgICVwcm9nIFtvcHRpb25zXSBbLWVdIDxsb2NhbCBwcm9qZWN0IHBhdGg+IC4uLgogICAgICAlcHJvZyBbb3B0aW9uc10gPGFyY2hpdmUgdXJsL3BhdGg+IC4uLiIiIgoKICAgIHN1bW1hcnkgPSAnRG93bmxvYWQgcGFja2FnZXMuJwoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprdyk6CiAgICAgICAgc3VwZXIoRG93bmxvYWRDb21tYW5kLCBzZWxmKS5fX2luaXRfXygqYXJncywgKiprdykKCiAgICAgICAgY21kX29wdHMgPSBzZWxmLmNtZF9vcHRzCgogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy5jb25zdHJhaW50cygpKQogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy5lZGl0YWJsZSgpKQogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy5yZXF1aXJlbWVudHMoKSkKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKGNtZG9wdGlvbnMuYnVpbGRfZGlyKCkpCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbihjbWRvcHRpb25zLm5vX2RlcHMoKSkKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKGNtZG9wdGlvbnMuZ2xvYmFsX29wdGlvbnMoKSkKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKGNtZG9wdGlvbnMubm9fYmluYXJ5KCkpCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbihjbWRvcHRpb25zLm9ubHlfYmluYXJ5KCkpCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbihjbWRvcHRpb25zLnNyYygpKQogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy5wcmUoKSkKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKGNtZG9wdGlvbnMubm9fY2xlYW4oKSkKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKGNtZG9wdGlvbnMucmVxdWlyZV9oYXNoZXMoKSkKCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgJy1kJywgJy0tZGVzdCcsICctLWRlc3RpbmF0aW9uLWRpcicsICctLWRlc3RpbmF0aW9uLWRpcmVjdG9yeScsCiAgICAgICAgICAgIGRlc3Q9J2Rvd25sb2FkX2RpcicsCiAgICAgICAgICAgIG1ldGF2YXI9J2RpcicsCiAgICAgICAgICAgIGRlZmF1bHQ9b3MuY3VyZGlyLAogICAgICAgICAgICBoZWxwPSgiRG93bmxvYWQgcGFja2FnZXMgaW50byA8ZGlyPi4iKSwKICAgICAgICApCgogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oCiAgICAgICAgICAgICctLXBsYXRmb3JtJywKICAgICAgICAgICAgZGVzdD0ncGxhdGZvcm0nLAogICAgICAgICAgICBtZXRhdmFyPSdwbGF0Zm9ybScsCiAgICAgICAgICAgIGRlZmF1bHQ9Tm9uZSwKICAgICAgICAgICAgaGVscD0oIk9ubHkgZG93bmxvYWQgd2hlZWxzIGNvbXBhdGlibGUgd2l0aCA8cGxhdGZvcm0+LiAiCiAgICAgICAgICAgICAgICAgICJEZWZhdWx0cyB0byB0aGUgcGxhdGZvcm0gb2YgdGhlIHJ1bm5pbmcgc3lzdGVtLiIpLAogICAgICAgICkKCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgJy0tcHl0aG9uLXZlcnNpb24nLAogICAgICAgICAgICBkZXN0PSdweXRob25fdmVyc2lvbicsCiAgICAgICAgICAgIG1ldGF2YXI9J3B5dGhvbl92ZXJzaW9uJywKICAgICAgICAgICAgZGVmYXVsdD1Ob25lLAogICAgICAgICAgICBoZWxwPSgiT25seSBkb3dubG9hZCB3aGVlbHMgY29tcGF0aWJsZSB3aXRoIFB5dGhvbiAiCiAgICAgICAgICAgICAgICAgICJpbnRlcnByZXRlciB2ZXJzaW9uIDx2ZXJzaW9uPi4gSWYgbm90IHNwZWNpZmllZCwgdGhlbiB0aGUgIgogICAgICAgICAgICAgICAgICAiY3VycmVudCBzeXN0ZW0gaW50ZXJwcmV0ZXIgbWlub3IgdmVyc2lvbiBpcyB1c2VkLiBBIG1ham9yICIKICAgICAgICAgICAgICAgICAgInZlcnNpb24gKGUuZy4gJzInKSBjYW4gYmUgc3BlY2lmaWVkIHRvIG1hdGNoIGFsbCAiCiAgICAgICAgICAgICAgICAgICJtaW5vciByZXZzIG9mIHRoYXQgbWFqb3IgdmVyc2lvbi4gIEEgbWlub3IgdmVyc2lvbiAiCiAgICAgICAgICAgICAgICAgICIoZS5nLiAnMzQnKSBjYW4gYWxzbyBiZSBzcGVjaWZpZWQuIiksCiAgICAgICAgKQoKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAnLS1pbXBsZW1lbnRhdGlvbicsCiAgICAgICAgICAgIGRlc3Q9J2ltcGxlbWVudGF0aW9uJywKICAgICAgICAgICAgbWV0YXZhcj0naW1wbGVtZW50YXRpb24nLAogICAgICAgICAgICBkZWZhdWx0PU5vbmUsCiAgICAgICAgICAgIGhlbHA9KCJPbmx5IGRvd25sb2FkIHdoZWVscyBjb21wYXRpYmxlIHdpdGggUHl0aG9uICIKICAgICAgICAgICAgICAgICAgImltcGxlbWVudGF0aW9uIDxpbXBsZW1lbnRhdGlvbj4sIGUuZy4gJ3BwJywgJ2p5JywgJ2NwJywgIgogICAgICAgICAgICAgICAgICAiIG9yICdpcCcuIElmIG5vdCBzcGVjaWZpZWQsIHRoZW4gdGhlIGN1cnJlbnQgIgogICAgICAgICAgICAgICAgICAiaW50ZXJwcmV0ZXIgaW1wbGVtZW50YXRpb24gaXMgdXNlZC4gIFVzZSAncHknIHRvIGZvcmNlICIKICAgICAgICAgICAgICAgICAgImltcGxlbWVudGF0aW9uLWFnbm9zdGljIHdoZWVscy4iKSwKICAgICAgICApCgogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oCiAgICAgICAgICAgICctLWFiaScsCiAgICAgICAgICAgIGRlc3Q9J2FiaScsCiAgICAgICAgICAgIG1ldGF2YXI9J2FiaScsCiAgICAgICAgICAgIGRlZmF1bHQ9Tm9uZSwKICAgICAgICAgICAgaGVscD0oIk9ubHkgZG93bmxvYWQgd2hlZWxzIGNvbXBhdGlibGUgd2l0aCBQeXRob24gIgogICAgICAgICAgICAgICAgICAiYWJpIDxhYmk+LCBlLmcuICdweXB5XzQxJy4gIElmIG5vdCBzcGVjaWZpZWQsIHRoZW4gdGhlICIKICAgICAgICAgICAgICAgICAgImN1cnJlbnQgaW50ZXJwcmV0ZXIgYWJpIHRhZyBpcyB1c2VkLiAgR2VuZXJhbGx5ICIKICAgICAgICAgICAgICAgICAgInlvdSB3aWxsIG5lZWQgdG8gc3BlY2lmeSAtLWltcGxlbWVudGF0aW9uLCAiCiAgICAgICAgICAgICAgICAgICItLXBsYXRmb3JtLCBhbmQgLS1weXRob24tdmVyc2lvbiB3aGVuIHVzaW5nICIKICAgICAgICAgICAgICAgICAgInRoaXMgb3B0aW9uLiIpLAogICAgICAgICkKCiAgICAgICAgaW5kZXhfb3B0cyA9IGNtZG9wdGlvbnMubWFrZV9vcHRpb25fZ3JvdXAoCiAgICAgICAgICAgIGNtZG9wdGlvbnMubm9uX2RlcHJlY2F0ZWRfaW5kZXhfZ3JvdXAsCiAgICAgICAgICAgIHNlbGYucGFyc2VyLAogICAgICAgICkKCiAgICAgICAgc2VsZi5wYXJzZXIuaW5zZXJ0X29wdGlvbl9ncm91cCgwLCBpbmRleF9vcHRzKQogICAgICAgIHNlbGYucGFyc2VyLmluc2VydF9vcHRpb25fZ3JvdXAoMCwgY21kX29wdHMpCgogICAgZGVmIHJ1bihzZWxmLCBvcHRpb25zLCBhcmdzKToKICAgICAgICBvcHRpb25zLmlnbm9yZV9pbnN0YWxsZWQgPSBUcnVlCgogICAgICAgIGlmIG9wdGlvbnMucHl0aG9uX3ZlcnNpb246CiAgICAgICAgICAgIHB5dGhvbl92ZXJzaW9ucyA9IFtvcHRpb25zLnB5dGhvbl92ZXJzaW9uXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHB5dGhvbl92ZXJzaW9ucyA9IE5vbmUKCiAgICAgICAgZGlzdF9yZXN0cmljdGlvbl9zZXQgPSBhbnkoWwogICAgICAgICAgICBvcHRpb25zLnB5dGhvbl92ZXJzaW9uLAogICAgICAgICAgICBvcHRpb25zLnBsYXRmb3JtLAogICAgICAgICAgICBvcHRpb25zLmFiaSwKICAgICAgICAgICAgb3B0aW9ucy5pbXBsZW1lbnRhdGlvbiwKICAgICAgICBdKQogICAgICAgIGJpbmFyeV9vbmx5ID0gRm9ybWF0Q29udHJvbChzZXQoKSwgc2V0KFsnOmFsbDonXSkpCiAgICAgICAgaWYgZGlzdF9yZXN0cmljdGlvbl9zZXQgYW5kIG9wdGlvbnMuZm9ybWF0X2NvbnRyb2wgIT0gYmluYXJ5X29ubHk6CiAgICAgICAgICAgIHJhaXNlIENvbW1hbmRFcnJvcigKICAgICAgICAgICAgICAgICItLW9ubHktYmluYXJ5PTphbGw6IG11c3QgYmUgc2V0IGFuZCAtLW5vLWJpbmFyeSBtdXN0IG5vdCAiCiAgICAgICAgICAgICAgICAiYmUgc2V0IChvciBtdXN0IGJlIHNldCB0byA6bm9uZTopIHdoZW4gcmVzdHJpY3RpbmcgcGxhdGZvcm0gIgogICAgICAgICAgICAgICAgImFuZCBpbnRlcnByZXRlciBjb25zdHJhaW50cyB1c2luZyAtLXB5dGhvbi12ZXJzaW9uLCAiCiAgICAgICAgICAgICAgICAiLS1wbGF0Zm9ybSwgLS1hYmksIG9yIC0taW1wbGVtZW50YXRpb24uIgogICAgICAgICAgICApCgogICAgICAgIG9wdGlvbnMuc3JjX2RpciA9IG9zLnBhdGguYWJzcGF0aChvcHRpb25zLnNyY19kaXIpCiAgICAgICAgb3B0aW9ucy5kb3dubG9hZF9kaXIgPSBub3JtYWxpemVfcGF0aChvcHRpb25zLmRvd25sb2FkX2RpcikKCiAgICAgICAgZW5zdXJlX2RpcihvcHRpb25zLmRvd25sb2FkX2RpcikKCiAgICAgICAgd2l0aCBzZWxmLl9idWlsZF9zZXNzaW9uKG9wdGlvbnMpIGFzIHNlc3Npb246CiAgICAgICAgICAgIGZpbmRlciA9IHNlbGYuX2J1aWxkX3BhY2thZ2VfZmluZGVyKAogICAgICAgICAgICAgICAgb3B0aW9ucz1vcHRpb25zLAogICAgICAgICAgICAgICAgc2Vzc2lvbj1zZXNzaW9uLAogICAgICAgICAgICAgICAgcGxhdGZvcm09b3B0aW9ucy5wbGF0Zm9ybSwKICAgICAgICAgICAgICAgIHB5dGhvbl92ZXJzaW9ucz1weXRob25fdmVyc2lvbnMsCiAgICAgICAgICAgICAgICBhYmk9b3B0aW9ucy5hYmksCiAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbj1vcHRpb25zLmltcGxlbWVudGF0aW9uLAogICAgICAgICAgICApCiAgICAgICAgICAgIGJ1aWxkX2RlbGV0ZSA9IChub3QgKG9wdGlvbnMubm9fY2xlYW4gb3Igb3B0aW9ucy5idWlsZF9kaXIpKQogICAgICAgICAgICBpZiBvcHRpb25zLmNhY2hlX2RpciBhbmQgbm90IGNoZWNrX3BhdGhfb3duZXIob3B0aW9ucy5jYWNoZV9kaXIpOgogICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICAgICAgICAgIlRoZSBkaXJlY3RvcnkgJyVzJyBvciBpdHMgcGFyZW50IGRpcmVjdG9yeSBpcyBub3Qgb3duZWQgIgogICAgICAgICAgICAgICAgICAgICJieSB0aGUgY3VycmVudCB1c2VyIGFuZCBjYWNoaW5nIHdoZWVscyBoYXMgYmVlbiAiCiAgICAgICAgICAgICAgICAgICAgImRpc2FibGVkLiBjaGVjayB0aGUgcGVybWlzc2lvbnMgYW5kIG93bmVyIG9mIHRoYXQgIgogICAgICAgICAgICAgICAgICAgICJkaXJlY3RvcnkuIElmIGV4ZWN1dGluZyBwaXAgd2l0aCBzdWRvLCB5b3UgbWF5IHdhbnQgIgogICAgICAgICAgICAgICAgICAgICJzdWRvJ3MgLUggZmxhZy4iLAogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuY2FjaGVfZGlyLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgb3B0aW9ucy5jYWNoZV9kaXIgPSBOb25lCgogICAgICAgICAgICB3aXRoIEJ1aWxkRGlyZWN0b3J5KG9wdGlvbnMuYnVpbGRfZGlyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZT1idWlsZF9kZWxldGUpIGFzIGJ1aWxkX2RpcjoKCiAgICAgICAgICAgICAgICByZXF1aXJlbWVudF9zZXQgPSBSZXF1aXJlbWVudFNldCgKICAgICAgICAgICAgICAgICAgICBidWlsZF9kaXI9YnVpbGRfZGlyLAogICAgICAgICAgICAgICAgICAgIHNyY19kaXI9b3B0aW9ucy5zcmNfZGlyLAogICAgICAgICAgICAgICAgICAgIGRvd25sb2FkX2Rpcj1vcHRpb25zLmRvd25sb2FkX2RpciwKICAgICAgICAgICAgICAgICAgICBpZ25vcmVfaW5zdGFsbGVkPVRydWUsCiAgICAgICAgICAgICAgICAgICAgaWdub3JlX2RlcGVuZGVuY2llcz1vcHRpb25zLmlnbm9yZV9kZXBlbmRlbmNpZXMsCiAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbj1zZXNzaW9uLAogICAgICAgICAgICAgICAgICAgIGlzb2xhdGVkPW9wdGlvbnMuaXNvbGF0ZWRfbW9kZSwKICAgICAgICAgICAgICAgICAgICByZXF1aXJlX2hhc2hlcz1vcHRpb25zLnJlcXVpcmVfaGFzaGVzCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBzZWxmLnBvcHVsYXRlX3JlcXVpcmVtZW50X3NldCgKICAgICAgICAgICAgICAgICAgICByZXF1aXJlbWVudF9zZXQsCiAgICAgICAgICAgICAgICAgICAgYXJncywKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLAogICAgICAgICAgICAgICAgICAgIGZpbmRlciwKICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLAogICAgICAgICAgICAgICAgICAgIHNlbGYubmFtZSwKICAgICAgICAgICAgICAgICAgICBOb25lCiAgICAgICAgICAgICAgICApCgogICAgICAgICAgICAgICAgaWYgbm90IHJlcXVpcmVtZW50X3NldC5oYXNfcmVxdWlyZW1lbnRzOgogICAgICAgICAgICAgICAgICAgIHJldHVybgoKICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50X3NldC5wcmVwYXJlX2ZpbGVzKGZpbmRlcikKCiAgICAgICAgICAgICAgICBkb3dubG9hZGVkID0gJyAnLmpvaW4oWwogICAgICAgICAgICAgICAgICAgIHJlcS5uYW1lIGZvciByZXEgaW4gcmVxdWlyZW1lbnRfc2V0LnN1Y2Nlc3NmdWxseV9kb3dubG9hZGVkCiAgICAgICAgICAgICAgICBdKQogICAgICAgICAgICAgICAgaWYgZG93bmxvYWRlZDoKICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygKICAgICAgICAgICAgICAgICAgICAgICAgJ1N1Y2Nlc3NmdWxseSBkb3dubG9hZGVkICVzJywgZG93bmxvYWRlZAogICAgICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgICAgICAjIENsZWFuIHVwCiAgICAgICAgICAgICAgICBpZiBub3Qgb3B0aW9ucy5ub19jbGVhbjoKICAgICAgICAgICAgICAgICAgICByZXF1aXJlbWVudF9zZXQuY2xlYW51cF9maWxlcygpCgogICAgICAgIHJldHVybiByZXF1aXJlbWVudF9zZXQKUEsDBBQAAAAAAAAAIQDD9vNgEwsAABMLAAAzAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvY29tbWFuZHMvZnJlZXplLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBzeXMKCmltcG9ydCBwaXAKZnJvbSBwaXAuY29tcGF0IGltcG9ydCBzdGRsaWJfcGtncwpmcm9tIHBpcC5iYXNlY29tbWFuZCBpbXBvcnQgQ29tbWFuZApmcm9tIHBpcC5vcGVyYXRpb25zLmZyZWV6ZSBpbXBvcnQgZnJlZXplCmZyb20gcGlwLndoZWVsIGltcG9ydCBXaGVlbENhY2hlCgoKREVWX1BLR1MgPSAoJ3BpcCcsICdzZXR1cHRvb2xzJywgJ2Rpc3RyaWJ1dGUnLCAnd2hlZWwnKQoKCmNsYXNzIEZyZWV6ZUNvbW1hbmQoQ29tbWFuZCk6CiAgICAiIiIKICAgIE91dHB1dCBpbnN0YWxsZWQgcGFja2FnZXMgaW4gcmVxdWlyZW1lbnRzIGZvcm1hdC4KCiAgICBwYWNrYWdlcyBhcmUgbGlzdGVkIGluIGEgY2FzZS1pbnNlbnNpdGl2ZSBzb3J0ZWQgb3JkZXIuCiAgICAiIiIKICAgIG5hbWUgPSAnZnJlZXplJwogICAgdXNhZ2UgPSAiIiIKICAgICAgJXByb2cgW29wdGlvbnNdIiIiCiAgICBzdW1tYXJ5ID0gJ091dHB1dCBpbnN0YWxsZWQgcGFja2FnZXMgaW4gcmVxdWlyZW1lbnRzIGZvcm1hdC4nCiAgICBsb2dfc3RyZWFtcyA9ICgiZXh0Oi8vc3lzLnN0ZGVyciIsICJleHQ6Ly9zeXMuc3RkZXJyIikKCiAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3cpOgogICAgICAgIHN1cGVyKEZyZWV6ZUNvbW1hbmQsIHNlbGYpLl9faW5pdF9fKCphcmdzLCAqKmt3KQoKICAgICAgICBzZWxmLmNtZF9vcHRzLmFkZF9vcHRpb24oCiAgICAgICAgICAgICctcicsICctLXJlcXVpcmVtZW50JywKICAgICAgICAgICAgZGVzdD0ncmVxdWlyZW1lbnRzJywKICAgICAgICAgICAgYWN0aW9uPSdhcHBlbmQnLAogICAgICAgICAgICBkZWZhdWx0PVtdLAogICAgICAgICAgICBtZXRhdmFyPSdmaWxlJywKICAgICAgICAgICAgaGVscD0iVXNlIHRoZSBvcmRlciBpbiB0aGUgZ2l2ZW4gcmVxdWlyZW1lbnRzIGZpbGUgYW5kIGl0cyAiCiAgICAgICAgICAgICAgICAgImNvbW1lbnRzIHdoZW4gZ2VuZXJhdGluZyBvdXRwdXQuIFRoaXMgb3B0aW9uIGNhbiBiZSAiCiAgICAgICAgICAgICAgICAgInVzZWQgbXVsdGlwbGUgdGltZXMuIikKICAgICAgICBzZWxmLmNtZF9vcHRzLmFkZF9vcHRpb24oCiAgICAgICAgICAgICctZicsICctLWZpbmQtbGlua3MnLAogICAgICAgICAgICBkZXN0PSdmaW5kX2xpbmtzJywKICAgICAgICAgICAgYWN0aW9uPSdhcHBlbmQnLAogICAgICAgICAgICBkZWZhdWx0PVtdLAogICAgICAgICAgICBtZXRhdmFyPSdVUkwnLAogICAgICAgICAgICBoZWxwPSdVUkwgZm9yIGZpbmRpbmcgcGFja2FnZXMsIHdoaWNoIHdpbGwgYmUgYWRkZWQgdG8gdGhlICcKICAgICAgICAgICAgICAgICAnb3V0cHV0LicpCiAgICAgICAgc2VsZi5jbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAnLWwnLCAnLS1sb2NhbCcsCiAgICAgICAgICAgIGRlc3Q9J2xvY2FsJywKICAgICAgICAgICAgYWN0aW9uPSdzdG9yZV90cnVlJywKICAgICAgICAgICAgZGVmYXVsdD1GYWxzZSwKICAgICAgICAgICAgaGVscD0nSWYgaW4gYSB2aXJ0dWFsZW52IHRoYXQgaGFzIGdsb2JhbCBhY2Nlc3MsIGRvIG5vdCBvdXRwdXQgJwogICAgICAgICAgICAgICAgICdnbG9iYWxseS1pbnN0YWxsZWQgcGFja2FnZXMuJykKICAgICAgICBzZWxmLmNtZF9vcHRzLmFkZF9vcHRpb24oCiAgICAgICAgICAgICctLXVzZXInLAogICAgICAgICAgICBkZXN0PSd1c2VyJywKICAgICAgICAgICAgYWN0aW9uPSdzdG9yZV90cnVlJywKICAgICAgICAgICAgZGVmYXVsdD1GYWxzZSwKICAgICAgICAgICAgaGVscD0nT25seSBvdXRwdXQgcGFja2FnZXMgaW5zdGFsbGVkIGluIHVzZXItc2l0ZS4nKQogICAgICAgIHNlbGYuY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgJy0tYWxsJywKICAgICAgICAgICAgZGVzdD0nZnJlZXplX2FsbCcsCiAgICAgICAgICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCiAgICAgICAgICAgIGhlbHA9J0RvIG5vdCBza2lwIHRoZXNlIHBhY2thZ2VzIGluIHRoZSBvdXRwdXQ6JwogICAgICAgICAgICAgICAgICcgJXMnICUgJywgJy5qb2luKERFVl9QS0dTKSkKCiAgICAgICAgc2VsZi5wYXJzZXIuaW5zZXJ0X29wdGlvbl9ncm91cCgwLCBzZWxmLmNtZF9vcHRzKQoKICAgIGRlZiBydW4oc2VsZiwgb3B0aW9ucywgYXJncyk6CiAgICAgICAgZm9ybWF0X2NvbnRyb2wgPSBwaXAuaW5kZXguRm9ybWF0Q29udHJvbChzZXQoKSwgc2V0KCkpCiAgICAgICAgd2hlZWxfY2FjaGUgPSBXaGVlbENhY2hlKG9wdGlvbnMuY2FjaGVfZGlyLCBmb3JtYXRfY29udHJvbCkKICAgICAgICBza2lwID0gc2V0KHN0ZGxpYl9wa2dzKQogICAgICAgIGlmIG5vdCBvcHRpb25zLmZyZWV6ZV9hbGw6CiAgICAgICAgICAgIHNraXAudXBkYXRlKERFVl9QS0dTKQoKICAgICAgICBmcmVlemVfa3dhcmdzID0gZGljdCgKICAgICAgICAgICAgcmVxdWlyZW1lbnQ9b3B0aW9ucy5yZXF1aXJlbWVudHMsCiAgICAgICAgICAgIGZpbmRfbGlua3M9b3B0aW9ucy5maW5kX2xpbmtzLAogICAgICAgICAgICBsb2NhbF9vbmx5PW9wdGlvbnMubG9jYWwsCiAgICAgICAgICAgIHVzZXJfb25seT1vcHRpb25zLnVzZXIsCiAgICAgICAgICAgIHNraXBfcmVnZXg9b3B0aW9ucy5za2lwX3JlcXVpcmVtZW50c19yZWdleCwKICAgICAgICAgICAgaXNvbGF0ZWQ9b3B0aW9ucy5pc29sYXRlZF9tb2RlLAogICAgICAgICAgICB3aGVlbF9jYWNoZT13aGVlbF9jYWNoZSwKICAgICAgICAgICAgc2tpcD1za2lwKQoKICAgICAgICBmb3IgbGluZSBpbiBmcmVlemUoKipmcmVlemVfa3dhcmdzKToKICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZShsaW5lICsgJ1xuJykKUEsDBBQAAAAAAAAAIQD4ieykPQYAAD0GAAAxAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvY29tbWFuZHMvaGFzaC5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgaGFzaGxpYgppbXBvcnQgbG9nZ2luZwppbXBvcnQgc3lzCgpmcm9tIHBpcC5iYXNlY29tbWFuZCBpbXBvcnQgQ29tbWFuZApmcm9tIHBpcC5zdGF0dXNfY29kZXMgaW1wb3J0IEVSUk9SCmZyb20gcGlwLnV0aWxzIGltcG9ydCByZWFkX2NodW5rcwpmcm9tIHBpcC51dGlscy5oYXNoZXMgaW1wb3J0IEZBVk9SSVRFX0hBU0gsIFNUUk9OR19IQVNIRVMKCgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCgpjbGFzcyBIYXNoQ29tbWFuZChDb21tYW5kKToKICAgICIiIgogICAgQ29tcHV0ZSBhIGhhc2ggb2YgYSBsb2NhbCBwYWNrYWdlIGFyY2hpdmUuCgogICAgVGhlc2UgY2FuIGJlIHVzZWQgd2l0aCAtLWhhc2ggaW4gYSByZXF1aXJlbWVudHMgZmlsZSB0byBkbyByZXBlYXRhYmxlCiAgICBpbnN0YWxscy4KCiAgICAiIiIKICAgIG5hbWUgPSAnaGFzaCcKICAgIHVzYWdlID0gJyVwcm9nIFtvcHRpb25zXSA8ZmlsZT4gLi4uJwogICAgc3VtbWFyeSA9ICdDb21wdXRlIGhhc2hlcyBvZiBwYWNrYWdlIGFyY2hpdmVzLicKCiAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3cpOgogICAgICAgIHN1cGVyKEhhc2hDb21tYW5kLCBzZWxmKS5fX2luaXRfXygqYXJncywgKiprdykKICAgICAgICBzZWxmLmNtZF9vcHRzLmFkZF9vcHRpb24oCiAgICAgICAgICAgICctYScsICctLWFsZ29yaXRobScsCiAgICAgICAgICAgIGRlc3Q9J2FsZ29yaXRobScsCiAgICAgICAgICAgIGNob2ljZXM9U1RST05HX0hBU0hFUywKICAgICAgICAgICAgYWN0aW9uPSdzdG9yZScsCiAgICAgICAgICAgIGRlZmF1bHQ9RkFWT1JJVEVfSEFTSCwKICAgICAgICAgICAgaGVscD0nVGhlIGhhc2ggYWxnb3JpdGhtIHRvIHVzZTogb25lIG9mICVzJyAlCiAgICAgICAgICAgICAgICAgJywgJy5qb2luKFNUUk9OR19IQVNIRVMpKQogICAgICAgIHNlbGYucGFyc2VyLmluc2VydF9vcHRpb25fZ3JvdXAoMCwgc2VsZi5jbWRfb3B0cykKCiAgICBkZWYgcnVuKHNlbGYsIG9wdGlvbnMsIGFyZ3MpOgogICAgICAgIGlmIG5vdCBhcmdzOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wcmludF91c2FnZShzeXMuc3RkZXJyKQogICAgICAgICAgICByZXR1cm4gRVJST1IKCiAgICAgICAgYWxnb3JpdGhtID0gb3B0aW9ucy5hbGdvcml0aG0KICAgICAgICBmb3IgcGF0aCBpbiBhcmdzOgogICAgICAgICAgICBsb2dnZXIuaW5mbygnJXM6XG4tLWhhc2g9JXM6JXMnLAogICAgICAgICAgICAgICAgICAgICAgICBwYXRoLCBhbGdvcml0aG0sIF9oYXNoX29mX2ZpbGUocGF0aCwgYWxnb3JpdGhtKSkKCgpkZWYgX2hhc2hfb2ZfZmlsZShwYXRoLCBhbGdvcml0aG0pOgogICAgIiIiUmV0dXJuIHRoZSBoYXNoIGRpZ2VzdCBvZiBhIGZpbGUuIiIiCiAgICB3aXRoIG9wZW4ocGF0aCwgJ3JiJykgYXMgYXJjaGl2ZToKICAgICAgICBoYXNoID0gaGFzaGxpYi5uZXcoYWxnb3JpdGhtKQogICAgICAgIGZvciBjaHVuayBpbiByZWFkX2NodW5rcyhhcmNoaXZlKToKICAgICAgICAgICAgaGFzaC51cGRhdGUoY2h1bmspCiAgICByZXR1cm4gaGFzaC5oZXhkaWdlc3QoKQpQSwMEFAAAAAAAAAAhAB4W0J3WAwAA1gMAADEAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9jb21tYW5kcy9oZWxwLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmZyb20gcGlwLmJhc2Vjb21tYW5kIGltcG9ydCBDb21tYW5kLCBTVUNDRVNTCmZyb20gcGlwLmV4Y2VwdGlvbnMgaW1wb3J0IENvbW1hbmRFcnJvcgoKCmNsYXNzIEhlbHBDb21tYW5kKENvbW1hbmQpOgogICAgIiIiU2hvdyBoZWxwIGZvciBjb21tYW5kcyIiIgogICAgbmFtZSA9ICdoZWxwJwogICAgdXNhZ2UgPSAiIiIKICAgICAgJXByb2cgPGNvbW1hbmQ+IiIiCiAgICBzdW1tYXJ5ID0gJ1Nob3cgaGVscCBmb3IgY29tbWFuZHMuJwoKICAgIGRlZiBydW4oc2VsZiwgb3B0aW9ucywgYXJncyk6CiAgICAgICAgZnJvbSBwaXAuY29tbWFuZHMgaW1wb3J0IGNvbW1hbmRzX2RpY3QsIGdldF9zaW1pbGFyX2NvbW1hbmRzCgogICAgICAgIHRyeToKICAgICAgICAgICAgIyAncGlwIGhlbHAnIHdpdGggbm8gYXJncyBpcyBoYW5kbGVkIGJ5IHBpcC5fX2luaXRfXy5wYXJzZW9wdCgpCiAgICAgICAgICAgIGNtZF9uYW1lID0gYXJnc1swXSAgIyB0aGUgY29tbWFuZCB3ZSBuZWVkIGhlbHAgZm9yCiAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CiAgICAgICAgICAgIHJldHVybiBTVUNDRVNTCgogICAgICAgIGlmIGNtZF9uYW1lIG5vdCBpbiBjb21tYW5kc19kaWN0OgogICAgICAgICAgICBndWVzcyA9IGdldF9zaW1pbGFyX2NvbW1hbmRzKGNtZF9uYW1lKQoKICAgICAgICAgICAgbXNnID0gWyd1bmtub3duIGNvbW1hbmQgIiVzIicgJSBjbWRfbmFtZV0KICAgICAgICAgICAgaWYgZ3Vlc3M6CiAgICAgICAgICAgICAgICBtc2cuYXBwZW5kKCdtYXliZSB5b3UgbWVhbnQgIiVzIicgJSBndWVzcykKCiAgICAgICAgICAgIHJhaXNlIENvbW1hbmRFcnJvcignIC0gJy5qb2luKG1zZykpCgogICAgICAgIGNvbW1hbmQgPSBjb21tYW5kc19kaWN0W2NtZF9uYW1lXSgpCiAgICAgICAgY29tbWFuZC5wYXJzZXIucHJpbnRfaGVscCgpCgogICAgICAgIHJldHVybiBTVUNDRVNTClBLAwQUAAAAAAAAACEASyWGFgREAAAERAAANAAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL2NvbW1hbmRzL2luc3RhbGwucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IG9wZXJhdG9yCmltcG9ydCBvcwppbXBvcnQgdGVtcGZpbGUKaW1wb3J0IHNodXRpbAppbXBvcnQgd2FybmluZ3MKdHJ5OgogICAgaW1wb3J0IHdoZWVsCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIHdoZWVsID0gTm9uZQoKZnJvbSBwaXAucmVxIGltcG9ydCBSZXF1aXJlbWVudFNldApmcm9tIHBpcC5iYXNlY29tbWFuZCBpbXBvcnQgUmVxdWlyZW1lbnRDb21tYW5kCmZyb20gcGlwLmxvY2F0aW9ucyBpbXBvcnQgdmlydHVhbGVudl9ub19nbG9iYWwsIGRpc3R1dGlsc19zY2hlbWUKZnJvbSBwaXAuZXhjZXB0aW9ucyBpbXBvcnQgKAogICAgSW5zdGFsbGF0aW9uRXJyb3IsIENvbW1hbmRFcnJvciwgUHJldmlvdXNCdWlsZERpckVycm9yLAopCmZyb20gcGlwIGltcG9ydCBjbWRvcHRpb25zCmZyb20gcGlwLnV0aWxzIGltcG9ydCBlbnN1cmVfZGlyLCBnZXRfaW5zdGFsbGVkX3ZlcnNpb24KZnJvbSBwaXAudXRpbHMuYnVpbGQgaW1wb3J0IEJ1aWxkRGlyZWN0b3J5CmZyb20gcGlwLnV0aWxzLmRlcHJlY2F0aW9uIGltcG9ydCBSZW1vdmVkSW5QaXAxMFdhcm5pbmcKZnJvbSBwaXAudXRpbHMuZmlsZXN5c3RlbSBpbXBvcnQgY2hlY2tfcGF0aF9vd25lcgpmcm9tIHBpcC53aGVlbCBpbXBvcnQgV2hlZWxDYWNoZSwgV2hlZWxCdWlsZGVyCgoKbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgoKY2xhc3MgSW5zdGFsbENvbW1hbmQoUmVxdWlyZW1lbnRDb21tYW5kKToKICAgICIiIgogICAgSW5zdGFsbCBwYWNrYWdlcyBmcm9tOgoKICAgIC0gUHlQSSAoYW5kIG90aGVyIGluZGV4ZXMpIHVzaW5nIHJlcXVpcmVtZW50IHNwZWNpZmllcnMuCiAgICAtIFZDUyBwcm9qZWN0IHVybHMuCiAgICAtIExvY2FsIHByb2plY3QgZGlyZWN0b3JpZXMuCiAgICAtIExvY2FsIG9yIHJlbW90ZSBzb3VyY2UgYXJjaGl2ZXMuCgogICAgcGlwIGFsc28gc3VwcG9ydHMgaW5zdGFsbGluZyBmcm9tICJyZXF1aXJlbWVudHMgZmlsZXMiLCB3aGljaCBwcm92aWRlCiAgICBhbiBlYXN5IHdheSB0byBzcGVjaWZ5IGEgd2hvbGUgZW52aXJvbm1lbnQgdG8gYmUgaW5zdGFsbGVkLgogICAgIiIiCiAgICBuYW1lID0gJ2luc3RhbGwnCgogICAgdXNhZ2UgPSAiIiIKICAgICAgJXByb2cgW29wdGlvbnNdIDxyZXF1aXJlbWVudCBzcGVjaWZpZXI+IFtwYWNrYWdlLWluZGV4LW9wdGlvbnNdIC4uLgogICAgICAlcHJvZyBbb3B0aW9uc10gLXIgPHJlcXVpcmVtZW50cyBmaWxlPiBbcGFja2FnZS1pbmRleC1vcHRpb25zXSAuLi4KICAgICAgJXByb2cgW29wdGlvbnNdIFstZV0gPHZjcyBwcm9qZWN0IHVybD4gLi4uCiAgICAgICVwcm9nIFtvcHRpb25zXSBbLWVdIDxsb2NhbCBwcm9qZWN0IHBhdGg+IC4uLgogICAgICAlcHJvZyBbb3B0aW9uc10gPGFyY2hpdmUgdXJsL3BhdGg+IC4uLiIiIgoKICAgIHN1bW1hcnkgPSAnSW5zdGFsbCBwYWNrYWdlcy4nCgogICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3KToKICAgICAgICBzdXBlcihJbnN0YWxsQ29tbWFuZCwgc2VsZikuX19pbml0X18oKmFyZ3MsICoqa3cpCgogICAgICAgIGNtZF9vcHRzID0gc2VsZi5jbWRfb3B0cwoKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKGNtZG9wdGlvbnMuY29uc3RyYWludHMoKSkKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKGNtZG9wdGlvbnMuZWRpdGFibGUoKSkKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKGNtZG9wdGlvbnMucmVxdWlyZW1lbnRzKCkpCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbihjbWRvcHRpb25zLmJ1aWxkX2RpcigpKQoKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAnLXQnLCAnLS10YXJnZXQnLAogICAgICAgICAgICBkZXN0PSd0YXJnZXRfZGlyJywKICAgICAgICAgICAgbWV0YXZhcj0nZGlyJywKICAgICAgICAgICAgZGVmYXVsdD1Ob25lLAogICAgICAgICAgICBoZWxwPSdJbnN0YWxsIHBhY2thZ2VzIGludG8gPGRpcj4uICcKICAgICAgICAgICAgICAgICAnQnkgZGVmYXVsdCB0aGlzIHdpbGwgbm90IHJlcGxhY2UgZXhpc3RpbmcgZmlsZXMvZm9sZGVycyBpbiAnCiAgICAgICAgICAgICAgICAgJzxkaXI+LiBVc2UgLS11cGdyYWRlIHRvIHJlcGxhY2UgZXhpc3RpbmcgcGFja2FnZXMgaW4gPGRpcj4gJwogICAgICAgICAgICAgICAgICd3aXRoIG5ldyB2ZXJzaW9ucy4nCiAgICAgICAgKQoKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAnLWQnLCAnLS1kb3dubG9hZCcsICctLWRvd25sb2FkLWRpcicsICctLWRvd25sb2FkLWRpcmVjdG9yeScsCiAgICAgICAgICAgIGRlc3Q9J2Rvd25sb2FkX2RpcicsCiAgICAgICAgICAgIG1ldGF2YXI9J2RpcicsCiAgICAgICAgICAgIGRlZmF1bHQ9Tm9uZSwKICAgICAgICAgICAgaGVscD0oIkRvd25sb2FkIHBhY2thZ2VzIGludG8gPGRpcj4gaW5zdGVhZCBvZiBpbnN0YWxsaW5nIHRoZW0sICIKICAgICAgICAgICAgICAgICAgInJlZ2FyZGxlc3Mgb2Ygd2hhdCdzIGFscmVhZHkgaW5zdGFsbGVkLiIpLAogICAgICAgICkKCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbihjbWRvcHRpb25zLnNyYygpKQoKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAnLVUnLCAnLS11cGdyYWRlJywKICAgICAgICAgICAgZGVzdD0ndXBncmFkZScsCiAgICAgICAgICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCiAgICAgICAgICAgIGhlbHA9J1VwZ3JhZGUgYWxsIHNwZWNpZmllZCBwYWNrYWdlcyB0byB0aGUgbmV3ZXN0IGF2YWlsYWJsZSAnCiAgICAgICAgICAgICAgICAgJ3ZlcnNpb24uIFRoZSBoYW5kbGluZyBvZiBkZXBlbmRlbmNpZXMgZGVwZW5kcyBvbiB0aGUgJwogICAgICAgICAgICAgICAgICd1cGdyYWRlLXN0cmF0ZWd5IHVzZWQuJwogICAgICAgICkKCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgJy0tdXBncmFkZS1zdHJhdGVneScsCiAgICAgICAgICAgIGRlc3Q9J3VwZ3JhZGVfc3RyYXRlZ3knLAogICAgICAgICAgICBkZWZhdWx0PSdlYWdlcicsCiAgICAgICAgICAgIGNob2ljZXM9Wydvbmx5LWlmLW5lZWRlZCcsICdlYWdlciddLAogICAgICAgICAgICBoZWxwPSdEZXRlcm1pbmVzIGhvdyBkZXBlbmRlbmN5IHVwZ3JhZGluZyBzaG91bGQgYmUgaGFuZGxlZC4gJwogICAgICAgICAgICAgICAgICciZWFnZXIiIC0gZGVwZW5kZW5jaWVzIGFyZSB1cGdyYWRlZCByZWdhcmRsZXNzIG9mICcKICAgICAgICAgICAgICAgICAnd2hldGhlciB0aGUgY3VycmVudGx5IGluc3RhbGxlZCB2ZXJzaW9uIHNhdGlzZmllcyB0aGUgJwogICAgICAgICAgICAgICAgICdyZXF1aXJlbWVudHMgb2YgdGhlIHVwZ3JhZGVkIHBhY2thZ2UocykuICcKICAgICAgICAgICAgICAgICAnIm9ubHktaWYtbmVlZGVkIiAtICBhcmUgdXBncmFkZWQgb25seSB3aGVuIHRoZXkgZG8gbm90ICcKICAgICAgICAgICAgICAgICAnc2F0aXNmeSB0aGUgcmVxdWlyZW1lbnRzIG9mIHRoZSB1cGdyYWRlZCBwYWNrYWdlKHMpLicKICAgICAgICApCgogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oCiAgICAgICAgICAgICctLWZvcmNlLXJlaW5zdGFsbCcsCiAgICAgICAgICAgIGRlc3Q9J2ZvcmNlX3JlaW5zdGFsbCcsCiAgICAgICAgICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCiAgICAgICAgICAgIGhlbHA9J1doZW4gdXBncmFkaW5nLCByZWluc3RhbGwgYWxsIHBhY2thZ2VzIGV2ZW4gaWYgdGhleSBhcmUgJwogICAgICAgICAgICAgICAgICdhbHJlYWR5IHVwLXRvLWRhdGUuJykKCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgJy1JJywgJy0taWdub3JlLWluc3RhbGxlZCcsCiAgICAgICAgICAgIGRlc3Q9J2lnbm9yZV9pbnN0YWxsZWQnLAogICAgICAgICAgICBhY3Rpb249J3N0b3JlX3RydWUnLAogICAgICAgICAgICBoZWxwPSdJZ25vcmUgdGhlIGluc3RhbGxlZCBwYWNrYWdlcyAocmVpbnN0YWxsaW5nIGluc3RlYWQpLicpCgogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy5pZ25vcmVfcmVxdWlyZXNfcHl0aG9uKCkpCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbihjbWRvcHRpb25zLm5vX2RlcHMoKSkKCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbihjbWRvcHRpb25zLmluc3RhbGxfb3B0aW9ucygpKQogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy5nbG9iYWxfb3B0aW9ucygpKQoKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAnLS11c2VyJywKICAgICAgICAgICAgZGVzdD0ndXNlX3VzZXJfc2l0ZScsCiAgICAgICAgICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCiAgICAgICAgICAgIGhlbHA9Ikluc3RhbGwgdG8gdGhlIFB5dGhvbiB1c2VyIGluc3RhbGwgZGlyZWN0b3J5IGZvciB5b3VyICIKICAgICAgICAgICAgICAgICAicGxhdGZvcm0uIFR5cGljYWxseSB+Ly5sb2NhbC8sIG9yICVBUFBEQVRBJVxQeXRob24gb24gIgogICAgICAgICAgICAgICAgICJXaW5kb3dzLiAoU2VlIHRoZSBQeXRob24gZG9jdW1lbnRhdGlvbiBmb3Igc2l0ZS5VU0VSX0JBU0UgIgogICAgICAgICAgICAgICAgICJmb3IgZnVsbCBkZXRhaWxzLikiKQoKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAnLS1lZ2cnLAogICAgICAgICAgICBkZXN0PSdhc19lZ2cnLAogICAgICAgICAgICBhY3Rpb249J3N0b3JlX3RydWUnLAogICAgICAgICAgICBoZWxwPSJJbnN0YWxsIHBhY2thZ2VzIGFzIGVnZ3MsIG5vdCAnZmxhdCcsIGxpa2UgcGlwIG5vcm1hbGx5ICIKICAgICAgICAgICAgICAgICAiZG9lcy4gVGhpcyBvcHRpb24gaXMgbm90IGFib3V0IGluc3RhbGxpbmcgKmZyb20qIGVnZ3MuICIKICAgICAgICAgICAgICAgICAiKFdBUk5JTkc6IEJlY2F1c2UgdGhpcyBvcHRpb24gb3ZlcnJpZGVzIHBpcCdzIG5vcm1hbCBpbnN0YWxsIgogICAgICAgICAgICAgICAgICIgbG9naWMsIHJlcXVpcmVtZW50cyBmaWxlcyBtYXkgbm90IGJlaGF2ZSBhcyBleHBlY3RlZC4pIikKCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgJy0tcm9vdCcsCiAgICAgICAgICAgIGRlc3Q9J3Jvb3RfcGF0aCcsCiAgICAgICAgICAgIG1ldGF2YXI9J2RpcicsCiAgICAgICAgICAgIGRlZmF1bHQ9Tm9uZSwKICAgICAgICAgICAgaGVscD0iSW5zdGFsbCBldmVyeXRoaW5nIHJlbGF0aXZlIHRvIHRoaXMgYWx0ZXJuYXRlIHJvb3QgIgogICAgICAgICAgICAgICAgICJkaXJlY3RvcnkuIikKCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgJy0tcHJlZml4JywKICAgICAgICAgICAgZGVzdD0ncHJlZml4X3BhdGgnLAogICAgICAgICAgICBtZXRhdmFyPSdkaXInLAogICAgICAgICAgICBkZWZhdWx0PU5vbmUsCiAgICAgICAgICAgIGhlbHA9Ikluc3RhbGxhdGlvbiBwcmVmaXggd2hlcmUgbGliLCBiaW4gYW5kIG90aGVyIHRvcC1sZXZlbCAiCiAgICAgICAgICAgICAgICAgImZvbGRlcnMgYXJlIHBsYWNlZCIpCgogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oCiAgICAgICAgICAgICItLWNvbXBpbGUiLAogICAgICAgICAgICBhY3Rpb249InN0b3JlX3RydWUiLAogICAgICAgICAgICBkZXN0PSJjb21waWxlIiwKICAgICAgICAgICAgZGVmYXVsdD1UcnVlLAogICAgICAgICAgICBoZWxwPSJDb21waWxlIHB5IGZpbGVzIHRvIHB5YyIsCiAgICAgICAgKQoKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAiLS1uby1jb21waWxlIiwKICAgICAgICAgICAgYWN0aW9uPSJzdG9yZV9mYWxzZSIsCiAgICAgICAgICAgIGRlc3Q9ImNvbXBpbGUiLAogICAgICAgICAgICBoZWxwPSJEbyBub3QgY29tcGlsZSBweSBmaWxlcyB0byBweWMiLAogICAgICAgICkKCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbihjbWRvcHRpb25zLnVzZV93aGVlbCgpKQogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy5ub191c2Vfd2hlZWwoKSkKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKGNtZG9wdGlvbnMubm9fYmluYXJ5KCkpCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbihjbWRvcHRpb25zLm9ubHlfYmluYXJ5KCkpCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbihjbWRvcHRpb25zLnByZSgpKQogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy5ub19jbGVhbigpKQogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy5yZXF1aXJlX2hhc2hlcygpKQoKICAgICAgICBpbmRleF9vcHRzID0gY21kb3B0aW9ucy5tYWtlX29wdGlvbl9ncm91cCgKICAgICAgICAgICAgY21kb3B0aW9ucy5pbmRleF9ncm91cCwKICAgICAgICAgICAgc2VsZi5wYXJzZXIsCiAgICAgICAgKQoKICAgICAgICBzZWxmLnBhcnNlci5pbnNlcnRfb3B0aW9uX2dyb3VwKDAsIGluZGV4X29wdHMpCiAgICAgICAgc2VsZi5wYXJzZXIuaW5zZXJ0X29wdGlvbl9ncm91cCgwLCBjbWRfb3B0cykKCiAgICBkZWYgcnVuKHNlbGYsIG9wdGlvbnMsIGFyZ3MpOgogICAgICAgIGNtZG9wdGlvbnMucmVzb2x2ZV93aGVlbF9ub191c2VfYmluYXJ5KG9wdGlvbnMpCiAgICAgICAgY21kb3B0aW9ucy5jaGVja19pbnN0YWxsX2J1aWxkX2dsb2JhbChvcHRpb25zKQoKICAgICAgICBpZiBvcHRpb25zLmFzX2VnZzoKICAgICAgICAgICAgd2FybmluZ3Mud2FybigKICAgICAgICAgICAgICAgICItLWVnZyBoYXMgYmVlbiBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4gIgogICAgICAgICAgICAgICAgIlRoaXMgZmxhZyBpcyBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCBsYXJnZSBwYXJ0cyBvZiBwaXAsIGFuZCAiCiAgICAgICAgICAgICAgICAiYWN0dWFsbHkgdXNpbmcgaXQgaW52YWxpZGF0ZXMgcGlwJ3MgYWJpbGl0eSB0byBtYW5hZ2UgdGhlICIKICAgICAgICAgICAgICAgICJpbnN0YWxsYXRpb24gcHJvY2Vzcy4iLAogICAgICAgICAgICAgICAgUmVtb3ZlZEluUGlwMTBXYXJuaW5nLAogICAgICAgICAgICApCgogICAgICAgIGlmIG9wdGlvbnMuYWxsb3dfZXh0ZXJuYWw6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCiAgICAgICAgICAgICAgICAiLS1hbGxvdy1leHRlcm5hbCBoYXMgYmVlbiBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gIgogICAgICAgICAgICAgICAgInRoZSBmdXR1cmUuIER1ZSB0byBjaGFuZ2VzIGluIHRoZSByZXBvc2l0b3J5IHByb3RvY29sLCBpdCBubyAiCiAgICAgICAgICAgICAgICAibG9uZ2VyIGhhcyBhbnkgZWZmZWN0LiIsCiAgICAgICAgICAgICAgICBSZW1vdmVkSW5QaXAxMFdhcm5pbmcsCiAgICAgICAgICAgICkKCiAgICAgICAgaWYgb3B0aW9ucy5hbGxvd19hbGxfZXh0ZXJuYWw6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCiAgICAgICAgICAgICAgICAiLS1hbGxvdy1hbGwtZXh0ZXJuYWwgaGFzIGJlZW4gZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkICIKICAgICAgICAgICAgICAgICJpbiB0aGUgZnV0dXJlLiBEdWUgdG8gY2hhbmdlcyBpbiB0aGUgcmVwb3NpdG9yeSBwcm90b2NvbCwgaXQgIgogICAgICAgICAgICAgICAgIm5vIGxvbmdlciBoYXMgYW55IGVmZmVjdC4iLAogICAgICAgICAgICAgICAgUmVtb3ZlZEluUGlwMTBXYXJuaW5nLAogICAgICAgICAgICApCgogICAgICAgIGlmIG9wdGlvbnMuYWxsb3dfdW52ZXJpZmllZDoKICAgICAgICAgICAgd2FybmluZ3Mud2FybigKICAgICAgICAgICAgICAgICItLWFsbG93LXVudmVyaWZpZWQgaGFzIGJlZW4gZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkICIKICAgICAgICAgICAgICAgICJpbiB0aGUgZnV0dXJlLiBEdWUgdG8gY2hhbmdlcyBpbiB0aGUgcmVwb3NpdG9yeSBwcm90b2NvbCwgaXQgIgogICAgICAgICAgICAgICAgIm5vIGxvbmdlciBoYXMgYW55IGVmZmVjdC4iLAogICAgICAgICAgICAgICAgUmVtb3ZlZEluUGlwMTBXYXJuaW5nLAogICAgICAgICAgICApCgogICAgICAgIGlmIG9wdGlvbnMuZG93bmxvYWRfZGlyOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKAogICAgICAgICAgICAgICAgInBpcCBpbnN0YWxsIC0tZG93bmxvYWQgaGFzIGJlZW4gZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSAiCiAgICAgICAgICAgICAgICAicmVtb3ZlZCBpbiB0aGUgZnV0dXJlLiBQaXAgbm93IGhhcyBhIGRvd25sb2FkIGNvbW1hbmQgdGhhdCAiCiAgICAgICAgICAgICAgICAic2hvdWxkIGJlIHVzZWQgaW5zdGVhZC4iLAogICAgICAgICAgICAgICAgUmVtb3ZlZEluUGlwMTBXYXJuaW5nLAogICAgICAgICAgICApCiAgICAgICAgICAgIG9wdGlvbnMuaWdub3JlX2luc3RhbGxlZCA9IFRydWUKCiAgICAgICAgaWYgb3B0aW9ucy5idWlsZF9kaXI6CiAgICAgICAgICAgIG9wdGlvbnMuYnVpbGRfZGlyID0gb3MucGF0aC5hYnNwYXRoKG9wdGlvbnMuYnVpbGRfZGlyKQoKICAgICAgICBvcHRpb25zLnNyY19kaXIgPSBvcy5wYXRoLmFic3BhdGgob3B0aW9ucy5zcmNfZGlyKQogICAgICAgIGluc3RhbGxfb3B0aW9ucyA9IG9wdGlvbnMuaW5zdGFsbF9vcHRpb25zIG9yIFtdCiAgICAgICAgaWYgb3B0aW9ucy51c2VfdXNlcl9zaXRlOgogICAgICAgICAgICBpZiBvcHRpb25zLnByZWZpeF9wYXRoOgogICAgICAgICAgICAgICAgcmFpc2UgQ29tbWFuZEVycm9yKAogICAgICAgICAgICAgICAgICAgICJDYW4gbm90IGNvbWJpbmUgJy0tdXNlcicgYW5kICctLXByZWZpeCcgYXMgdGhleSBpbXBseSAiCiAgICAgICAgICAgICAgICAgICAgImRpZmZlcmVudCBpbnN0YWxsYXRpb24gbG9jYXRpb25zIgogICAgICAgICAgICAgICAgKQogICAgICAgICAgICBpZiB2aXJ0dWFsZW52X25vX2dsb2JhbCgpOgogICAgICAgICAgICAgICAgcmFpc2UgSW5zdGFsbGF0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgIkNhbiBub3QgcGVyZm9ybSBhICctLXVzZXInIGluc3RhbGwuIFVzZXIgc2l0ZS1wYWNrYWdlcyAiCiAgICAgICAgICAgICAgICAgICAgImFyZSBub3QgdmlzaWJsZSBpbiB0aGlzIHZpcnR1YWxlbnYuIgogICAgICAgICAgICAgICAgKQogICAgICAgICAgICBpbnN0YWxsX29wdGlvbnMuYXBwZW5kKCctLXVzZXInKQogICAgICAgICAgICBpbnN0YWxsX29wdGlvbnMuYXBwZW5kKCctLXByZWZpeD0nKQoKICAgICAgICB0ZW1wX3RhcmdldF9kaXIgPSBOb25lCiAgICAgICAgaWYgb3B0aW9ucy50YXJnZXRfZGlyOgogICAgICAgICAgICBvcHRpb25zLmlnbm9yZV9pbnN0YWxsZWQgPSBUcnVlCiAgICAgICAgICAgIHRlbXBfdGFyZ2V0X2RpciA9IHRlbXBmaWxlLm1rZHRlbXAoKQogICAgICAgICAgICBvcHRpb25zLnRhcmdldF9kaXIgPSBvcy5wYXRoLmFic3BhdGgob3B0aW9ucy50YXJnZXRfZGlyKQogICAgICAgICAgICBpZiAob3MucGF0aC5leGlzdHMob3B0aW9ucy50YXJnZXRfZGlyKSBhbmQgbm90CiAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5pc2RpcihvcHRpb25zLnRhcmdldF9kaXIpKToKICAgICAgICAgICAgICAgIHJhaXNlIENvbW1hbmRFcnJvcigKICAgICAgICAgICAgICAgICAgICAiVGFyZ2V0IHBhdGggZXhpc3RzIGJ1dCBpcyBub3QgYSBkaXJlY3RvcnksIHdpbGwgbm90ICIKICAgICAgICAgICAgICAgICAgICAiY29udGludWUuIgogICAgICAgICAgICAgICAgKQogICAgICAgICAgICBpbnN0YWxsX29wdGlvbnMuYXBwZW5kKCctLWhvbWU9JyArIHRlbXBfdGFyZ2V0X2RpcikKCiAgICAgICAgZ2xvYmFsX29wdGlvbnMgPSBvcHRpb25zLmdsb2JhbF9vcHRpb25zIG9yIFtdCgogICAgICAgIHdpdGggc2VsZi5fYnVpbGRfc2Vzc2lvbihvcHRpb25zKSBhcyBzZXNzaW9uOgoKICAgICAgICAgICAgZmluZGVyID0gc2VsZi5fYnVpbGRfcGFja2FnZV9maW5kZXIob3B0aW9ucywgc2Vzc2lvbikKICAgICAgICAgICAgYnVpbGRfZGVsZXRlID0gKG5vdCAob3B0aW9ucy5ub19jbGVhbiBvciBvcHRpb25zLmJ1aWxkX2RpcikpCiAgICAgICAgICAgIHdoZWVsX2NhY2hlID0gV2hlZWxDYWNoZShvcHRpb25zLmNhY2hlX2Rpciwgb3B0aW9ucy5mb3JtYXRfY29udHJvbCkKICAgICAgICAgICAgaWYgb3B0aW9ucy5jYWNoZV9kaXIgYW5kIG5vdCBjaGVja19wYXRoX293bmVyKG9wdGlvbnMuY2FjaGVfZGlyKToKICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgICAgICJUaGUgZGlyZWN0b3J5ICclcycgb3IgaXRzIHBhcmVudCBkaXJlY3RvcnkgaXMgbm90IG93bmVkICIKICAgICAgICAgICAgICAgICAgICAiYnkgdGhlIGN1cnJlbnQgdXNlciBhbmQgY2FjaGluZyB3aGVlbHMgaGFzIGJlZW4gIgogICAgICAgICAgICAgICAgICAgICJkaXNhYmxlZC4gY2hlY2sgdGhlIHBlcm1pc3Npb25zIGFuZCBvd25lciBvZiB0aGF0ICIKICAgICAgICAgICAgICAgICAgICAiZGlyZWN0b3J5LiBJZiBleGVjdXRpbmcgcGlwIHdpdGggc3VkbywgeW91IG1heSB3YW50ICIKICAgICAgICAgICAgICAgICAgICAic3VkbydzIC1IIGZsYWcuIiwKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmNhY2hlX2RpciwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIG9wdGlvbnMuY2FjaGVfZGlyID0gTm9uZQoKICAgICAgICAgICAgd2l0aCBCdWlsZERpcmVjdG9yeShvcHRpb25zLmJ1aWxkX2RpciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGU9YnVpbGRfZGVsZXRlKSBhcyBidWlsZF9kaXI6CiAgICAgICAgICAgICAgICByZXF1aXJlbWVudF9zZXQgPSBSZXF1aXJlbWVudFNldCgKICAgICAgICAgICAgICAgICAgICBidWlsZF9kaXI9YnVpbGRfZGlyLAogICAgICAgICAgICAgICAgICAgIHNyY19kaXI9b3B0aW9ucy5zcmNfZGlyLAogICAgICAgICAgICAgICAgICAgIGRvd25sb2FkX2Rpcj1vcHRpb25zLmRvd25sb2FkX2RpciwKICAgICAgICAgICAgICAgICAgICB1cGdyYWRlPW9wdGlvbnMudXBncmFkZSwKICAgICAgICAgICAgICAgICAgICB1cGdyYWRlX3N0cmF0ZWd5PW9wdGlvbnMudXBncmFkZV9zdHJhdGVneSwKICAgICAgICAgICAgICAgICAgICBhc19lZ2c9b3B0aW9ucy5hc19lZ2csCiAgICAgICAgICAgICAgICAgICAgaWdub3JlX2luc3RhbGxlZD1vcHRpb25zLmlnbm9yZV9pbnN0YWxsZWQsCiAgICAgICAgICAgICAgICAgICAgaWdub3JlX2RlcGVuZGVuY2llcz1vcHRpb25zLmlnbm9yZV9kZXBlbmRlbmNpZXMsCiAgICAgICAgICAgICAgICAgICAgaWdub3JlX3JlcXVpcmVzX3B5dGhvbj1vcHRpb25zLmlnbm9yZV9yZXF1aXJlc19weXRob24sCiAgICAgICAgICAgICAgICAgICAgZm9yY2VfcmVpbnN0YWxsPW9wdGlvbnMuZm9yY2VfcmVpbnN0YWxsLAogICAgICAgICAgICAgICAgICAgIHVzZV91c2VyX3NpdGU9b3B0aW9ucy51c2VfdXNlcl9zaXRlLAogICAgICAgICAgICAgICAgICAgIHRhcmdldF9kaXI9dGVtcF90YXJnZXRfZGlyLAogICAgICAgICAgICAgICAgICAgIHNlc3Npb249c2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICBweWNvbXBpbGU9b3B0aW9ucy5jb21waWxlLAogICAgICAgICAgICAgICAgICAgIGlzb2xhdGVkPW9wdGlvbnMuaXNvbGF0ZWRfbW9kZSwKICAgICAgICAgICAgICAgICAgICB3aGVlbF9jYWNoZT13aGVlbF9jYWNoZSwKICAgICAgICAgICAgICAgICAgICByZXF1aXJlX2hhc2hlcz1vcHRpb25zLnJlcXVpcmVfaGFzaGVzLAogICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgICAgIHNlbGYucG9wdWxhdGVfcmVxdWlyZW1lbnRfc2V0KAogICAgICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50X3NldCwgYXJncywgb3B0aW9ucywgZmluZGVyLCBzZXNzaW9uLCBzZWxmLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgd2hlZWxfY2FjaGUKICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgICAgICBpZiBub3QgcmVxdWlyZW1lbnRfc2V0Lmhhc19yZXF1aXJlbWVudHM6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmRvd25sb2FkX2RpciBvciBub3Qgd2hlZWwgb3Igbm90CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmNhY2hlX2Rpcik6CiAgICAgICAgICAgICAgICAgICAgICAgICMgb24gLWQgZG9uJ3QgZG8gY29tcGxleCB0aGluZ3MgbGlrZSBidWlsZGluZwogICAgICAgICAgICAgICAgICAgICAgICAjIHdoZWVscywgYW5kIGRvbid0IHRyeSB0byBidWlsZCB3aGVlbHMgd2hlbiB3aGVlbCBpcwogICAgICAgICAgICAgICAgICAgICAgICAjIG5vdCBpbnN0YWxsZWQuCiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50X3NldC5wcmVwYXJlX2ZpbGVzKGZpbmRlcikKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAjIGJ1aWxkIHdoZWVscyBiZWZvcmUgaW5zdGFsbC4KICAgICAgICAgICAgICAgICAgICAgICAgd2IgPSBXaGVlbEJ1aWxkZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlbWVudF9zZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5kZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZF9vcHRpb25zPVtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsX29wdGlvbnM9W10sCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgIyBJZ25vcmUgdGhlIHJlc3VsdDogYSBmYWlsZWQgd2hlZWwgd2lsbCBiZQogICAgICAgICAgICAgICAgICAgICAgICAjIGluc3RhbGxlZCBmcm9tIHRoZSBzZGlzdC92Y3Mgd2hhdGV2ZXIuCiAgICAgICAgICAgICAgICAgICAgICAgIHdiLmJ1aWxkKGF1dG9idWlsZGluZz1UcnVlKQoKICAgICAgICAgICAgICAgICAgICBpZiBub3Qgb3B0aW9ucy5kb3dubG9hZF9kaXI6CiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50X3NldC5pbnN0YWxsKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFsbF9vcHRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsX29wdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290PW9wdGlvbnMucm9vdF9wYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4PW9wdGlvbnMucHJlZml4X3BhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgICAgICAgICAgICAgIHBvc3NpYmxlX2xpYl9sb2NhdGlvbnMgPSBnZXRfbGliX2xvY2F0aW9uX2d1ZXNzZXMoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyPW9wdGlvbnMudXNlX3VzZXJfc2l0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvbWU9dGVtcF90YXJnZXRfZGlyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdD1vcHRpb25zLnJvb3RfcGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeD1vcHRpb25zLnByZWZpeF9wYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNvbGF0ZWQ9b3B0aW9ucy5pc29sYXRlZF9tb2RlLAogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXMgPSBzb3J0ZWQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlbWVudF9zZXQuc3VjY2Vzc2Z1bGx5X2luc3RhbGxlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleT1vcGVyYXRvci5hdHRyZ2V0dGVyKCduYW1lJykpCiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zID0gW10KICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHJlcSBpbiByZXFzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSA9IHJlcS5uYW1lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFsbGVkX3ZlcnNpb24gPSBnZXRfaW5zdGFsbGVkX3ZlcnNpb24oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcS5uYW1lLCBwb3NzaWJsZV9saWJfbG9jYXRpb25zCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGluc3RhbGxlZF92ZXJzaW9uOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtICs9ICctJyArIGluc3RhbGxlZF92ZXJzaW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zLmFwcGVuZChpdGVtKQogICAgICAgICAgICAgICAgICAgICAgICBpbnN0YWxsZWQgPSAnICcuam9pbihpdGVtcykKICAgICAgICAgICAgICAgICAgICAgICAgaWYgaW5zdGFsbGVkOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ1N1Y2Nlc3NmdWxseSBpbnN0YWxsZWQgJXMnLCBpbnN0YWxsZWQpCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRlZCA9ICcgJy5qb2luKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcS5uYW1lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgcmVxIGluIHJlcXVpcmVtZW50X3NldC5zdWNjZXNzZnVsbHlfZG93bmxvYWRlZAogICAgICAgICAgICAgICAgICAgICAgICBdKQogICAgICAgICAgICAgICAgICAgICAgICBpZiBkb3dubG9hZGVkOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1N1Y2Nlc3NmdWxseSBkb3dubG9hZGVkICVzJywgZG93bmxvYWRlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgZXhjZXB0IFByZXZpb3VzQnVpbGREaXJFcnJvcjoKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLm5vX2NsZWFuID0gVHJ1ZQogICAgICAgICAgICAgICAgICAgIHJhaXNlCiAgICAgICAgICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgICAgICAgICMgQ2xlYW4gdXAKICAgICAgICAgICAgICAgICAgICBpZiBub3Qgb3B0aW9ucy5ub19jbGVhbjoKICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZW1lbnRfc2V0LmNsZWFudXBfZmlsZXMoKQoKICAgICAgICBpZiBvcHRpb25zLnRhcmdldF9kaXI6CiAgICAgICAgICAgIGVuc3VyZV9kaXIob3B0aW9ucy50YXJnZXRfZGlyKQoKICAgICAgICAgICAgIyBDaGVja2luZyBib3RoIHB1cmVsaWIgYW5kIHBsYXRsaWIgZGlyZWN0b3JpZXMgZm9yIGluc3RhbGxlZAogICAgICAgICAgICAjIHBhY2thZ2VzIHRvIGJlIG1vdmVkIHRvIHRhcmdldCBkaXJlY3RvcnkKICAgICAgICAgICAgbGliX2Rpcl9saXN0ID0gW10KCiAgICAgICAgICAgIHB1cmVsaWJfZGlyID0gZGlzdHV0aWxzX3NjaGVtZSgnJywgaG9tZT10ZW1wX3RhcmdldF9kaXIpWydwdXJlbGliJ10KICAgICAgICAgICAgcGxhdGxpYl9kaXIgPSBkaXN0dXRpbHNfc2NoZW1lKCcnLCBob21lPXRlbXBfdGFyZ2V0X2RpcilbJ3BsYXRsaWInXQoKICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMocHVyZWxpYl9kaXIpOgogICAgICAgICAgICAgICAgbGliX2Rpcl9saXN0LmFwcGVuZChwdXJlbGliX2RpcikKICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMocGxhdGxpYl9kaXIpIGFuZCBwbGF0bGliX2RpciAhPSBwdXJlbGliX2RpcjoKICAgICAgICAgICAgICAgIGxpYl9kaXJfbGlzdC5hcHBlbmQocGxhdGxpYl9kaXIpCgogICAgICAgICAgICBmb3IgbGliX2RpciBpbiBsaWJfZGlyX2xpc3Q6CiAgICAgICAgICAgICAgICBmb3IgaXRlbSBpbiBvcy5saXN0ZGlyKGxpYl9kaXIpOgogICAgICAgICAgICAgICAgICAgIHRhcmdldF9pdGVtX2RpciA9IG9zLnBhdGguam9pbihvcHRpb25zLnRhcmdldF9kaXIsIGl0ZW0pCiAgICAgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHModGFyZ2V0X2l0ZW1fZGlyKToKICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IG9wdGlvbnMudXBncmFkZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUYXJnZXQgZGlyZWN0b3J5ICVzIGFscmVhZHkgZXhpc3RzLiBTcGVjaWZ5ICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLS11cGdyYWRlIHRvIGZvcmNlIHJlcGxhY2VtZW50LicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X2l0ZW1fZGlyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzbGluayh0YXJnZXRfaXRlbV9kaXIpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RhcmdldCBkaXJlY3RvcnkgJXMgYWxyZWFkeSBleGlzdHMgYW5kIGlzICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYSBsaW5rLiBQaXAgd2lsbCBub3QgYXV0b21hdGljYWxseSByZXBsYWNlICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGlua3MsIHBsZWFzZSByZW1vdmUgaWYgcmVwbGFjZW1lbnQgaXMgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkZXNpcmVkLicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X2l0ZW1fZGlyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKHRhcmdldF9pdGVtX2Rpcik6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaHV0aWwucm10cmVlKHRhcmdldF9pdGVtX2RpcikKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnJlbW92ZSh0YXJnZXRfaXRlbV9kaXIpCgogICAgICAgICAgICAgICAgICAgIHNodXRpbC5tb3ZlKAogICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4obGliX2RpciwgaXRlbSksCiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9pdGVtX2RpcgogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgc2h1dGlsLnJtdHJlZSh0ZW1wX3RhcmdldF9kaXIpCiAgICAgICAgcmV0dXJuIHJlcXVpcmVtZW50X3NldAoKCmRlZiBnZXRfbGliX2xvY2F0aW9uX2d1ZXNzZXMoKmFyZ3MsICoqa3dhcmdzKToKICAgIHNjaGVtZSA9IGRpc3R1dGlsc19zY2hlbWUoJycsICphcmdzLCAqKmt3YXJncykKICAgIHJldHVybiBbc2NoZW1lWydwdXJlbGliJ10sIHNjaGVtZVsncGxhdGxpYiddXQpQSwMEFAAAAAAAAAAhAA9LxzhpLAAAaSwAADEAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9jb21tYW5kcy9saXN0LnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBqc29uCmltcG9ydCBsb2dnaW5nCmltcG9ydCB3YXJuaW5ncwp0cnk6CiAgICBmcm9tIGl0ZXJ0b29scyBpbXBvcnQgemlwX2xvbmdlc3QKZXhjZXB0IEltcG9ydEVycm9yOgogICAgZnJvbSBpdGVydG9vbHMgaW1wb3J0IGl6aXBfbG9uZ2VzdCBhcyB6aXBfbG9uZ2VzdAoKZnJvbSBwaXAuX3ZlbmRvciBpbXBvcnQgc2l4Cgpmcm9tIHBpcC5iYXNlY29tbWFuZCBpbXBvcnQgQ29tbWFuZApmcm9tIHBpcC5leGNlcHRpb25zIGltcG9ydCBDb21tYW5kRXJyb3IKZnJvbSBwaXAuaW5kZXggaW1wb3J0IFBhY2thZ2VGaW5kZXIKZnJvbSBwaXAudXRpbHMgaW1wb3J0ICgKICAgIGdldF9pbnN0YWxsZWRfZGlzdHJpYnV0aW9ucywgZGlzdF9pc19lZGl0YWJsZSkKZnJvbSBwaXAudXRpbHMuZGVwcmVjYXRpb24gaW1wb3J0IFJlbW92ZWRJblBpcDEwV2FybmluZwpmcm9tIHBpcC5jbWRvcHRpb25zIGltcG9ydCBtYWtlX29wdGlvbl9ncm91cCwgaW5kZXhfZ3JvdXAKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKCmNsYXNzIExpc3RDb21tYW5kKENvbW1hbmQpOgogICAgIiIiCiAgICBMaXN0IGluc3RhbGxlZCBwYWNrYWdlcywgaW5jbHVkaW5nIGVkaXRhYmxlcy4KCiAgICBQYWNrYWdlcyBhcmUgbGlzdGVkIGluIGEgY2FzZS1pbnNlbnNpdGl2ZSBzb3J0ZWQgb3JkZXIuCiAgICAiIiIKICAgIG5hbWUgPSAnbGlzdCcKICAgIHVzYWdlID0gIiIiCiAgICAgICVwcm9nIFtvcHRpb25zXSIiIgogICAgc3VtbWFyeSA9ICdMaXN0IGluc3RhbGxlZCBwYWNrYWdlcy4nCgogICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3KToKICAgICAgICBzdXBlcihMaXN0Q29tbWFuZCwgc2VsZikuX19pbml0X18oKmFyZ3MsICoqa3cpCgogICAgICAgIGNtZF9vcHRzID0gc2VsZi5jbWRfb3B0cwoKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAnLW8nLCAnLS1vdXRkYXRlZCcsCiAgICAgICAgICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCiAgICAgICAgICAgIGRlZmF1bHQ9RmFsc2UsCiAgICAgICAgICAgIGhlbHA9J0xpc3Qgb3V0ZGF0ZWQgcGFja2FnZXMnKQogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oCiAgICAgICAgICAgICctdScsICctLXVwdG9kYXRlJywKICAgICAgICAgICAgYWN0aW9uPSdzdG9yZV90cnVlJywKICAgICAgICAgICAgZGVmYXVsdD1GYWxzZSwKICAgICAgICAgICAgaGVscD0nTGlzdCB1cHRvZGF0ZSBwYWNrYWdlcycpCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgJy1lJywgJy0tZWRpdGFibGUnLAogICAgICAgICAgICBhY3Rpb249J3N0b3JlX3RydWUnLAogICAgICAgICAgICBkZWZhdWx0PUZhbHNlLAogICAgICAgICAgICBoZWxwPSdMaXN0IGVkaXRhYmxlIHByb2plY3RzLicpCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgJy1sJywgJy0tbG9jYWwnLAogICAgICAgICAgICBhY3Rpb249J3N0b3JlX3RydWUnLAogICAgICAgICAgICBkZWZhdWx0PUZhbHNlLAogICAgICAgICAgICBoZWxwPSgnSWYgaW4gYSB2aXJ0dWFsZW52IHRoYXQgaGFzIGdsb2JhbCBhY2Nlc3MsIGRvIG5vdCBsaXN0ICcKICAgICAgICAgICAgICAgICAgJ2dsb2JhbGx5LWluc3RhbGxlZCBwYWNrYWdlcy4nKSwKICAgICAgICApCiAgICAgICAgc2VsZi5jbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAnLS11c2VyJywKICAgICAgICAgICAgZGVzdD0ndXNlcicsCiAgICAgICAgICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCiAgICAgICAgICAgIGRlZmF1bHQ9RmFsc2UsCiAgICAgICAgICAgIGhlbHA9J09ubHkgb3V0cHV0IHBhY2thZ2VzIGluc3RhbGxlZCBpbiB1c2VyLXNpdGUuJykKCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgJy0tcHJlJywKICAgICAgICAgICAgYWN0aW9uPSdzdG9yZV90cnVlJywKICAgICAgICAgICAgZGVmYXVsdD1GYWxzZSwKICAgICAgICAgICAgaGVscD0oIkluY2x1ZGUgcHJlLXJlbGVhc2UgYW5kIGRldmVsb3BtZW50IHZlcnNpb25zLiBCeSBkZWZhdWx0LCAiCiAgICAgICAgICAgICAgICAgICJwaXAgb25seSBmaW5kcyBzdGFibGUgdmVyc2lvbnMuIiksCiAgICAgICAgKQoKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAnLS1mb3JtYXQnLAogICAgICAgICAgICBhY3Rpb249J3N0b3JlJywKICAgICAgICAgICAgZGVzdD0nbGlzdF9mb3JtYXQnLAogICAgICAgICAgICBjaG9pY2VzPSgnbGVnYWN5JywgJ2NvbHVtbnMnLCAnZnJlZXplJywgJ2pzb24nKSwKICAgICAgICAgICAgaGVscD0iU2VsZWN0IHRoZSBvdXRwdXQgZm9ybWF0IGFtb25nOiBsZWdhY3kgKGRlZmF1bHQpLCBjb2x1bW5zLCAiCiAgICAgICAgICAgICAgICAgImZyZWV6ZSBvciBqc29uLiIsCiAgICAgICAgKQoKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAnLS1ub3QtcmVxdWlyZWQnLAogICAgICAgICAgICBhY3Rpb249J3N0b3JlX3RydWUnLAogICAgICAgICAgICBkZXN0PSdub3RfcmVxdWlyZWQnLAogICAgICAgICAgICBoZWxwPSJMaXN0IHBhY2thZ2VzIHRoYXQgYXJlIG5vdCBkZXBlbmRlbmNpZXMgb2YgIgogICAgICAgICAgICAgICAgICJpbnN0YWxsZWQgcGFja2FnZXMuIiwKICAgICAgICApCgogICAgICAgIGluZGV4X29wdHMgPSBtYWtlX29wdGlvbl9ncm91cChpbmRleF9ncm91cCwgc2VsZi5wYXJzZXIpCgogICAgICAgIHNlbGYucGFyc2VyLmluc2VydF9vcHRpb25fZ3JvdXAoMCwgaW5kZXhfb3B0cykKICAgICAgICBzZWxmLnBhcnNlci5pbnNlcnRfb3B0aW9uX2dyb3VwKDAsIGNtZF9vcHRzKQoKICAgIGRlZiBfYnVpbGRfcGFja2FnZV9maW5kZXIoc2VsZiwgb3B0aW9ucywgaW5kZXhfdXJscywgc2Vzc2lvbik6CiAgICAgICAgIiIiCiAgICAgICAgQ3JlYXRlIGEgcGFja2FnZSBmaW5kZXIgYXBwcm9wcmlhdGUgdG8gdGhpcyBsaXN0IGNvbW1hbmQuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIFBhY2thZ2VGaW5kZXIoCiAgICAgICAgICAgIGZpbmRfbGlua3M9b3B0aW9ucy5maW5kX2xpbmtzLAogICAgICAgICAgICBpbmRleF91cmxzPWluZGV4X3VybHMsCiAgICAgICAgICAgIGFsbG93X2FsbF9wcmVyZWxlYXNlcz1vcHRpb25zLnByZSwKICAgICAgICAgICAgdHJ1c3RlZF9ob3N0cz1vcHRpb25zLnRydXN0ZWRfaG9zdHMsCiAgICAgICAgICAgIHByb2Nlc3NfZGVwZW5kZW5jeV9saW5rcz1vcHRpb25zLnByb2Nlc3NfZGVwZW5kZW5jeV9saW5rcywKICAgICAgICAgICAgc2Vzc2lvbj1zZXNzaW9uLAogICAgICAgICkKCiAgICBkZWYgcnVuKHNlbGYsIG9wdGlvbnMsIGFyZ3MpOgogICAgICAgIGlmIG9wdGlvbnMuYWxsb3dfZXh0ZXJuYWw6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCiAgICAgICAgICAgICAgICAiLS1hbGxvdy1leHRlcm5hbCBoYXMgYmVlbiBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gIgogICAgICAgICAgICAgICAgInRoZSBmdXR1cmUuIER1ZSB0byBjaGFuZ2VzIGluIHRoZSByZXBvc2l0b3J5IHByb3RvY29sLCBpdCBubyAiCiAgICAgICAgICAgICAgICAibG9uZ2VyIGhhcyBhbnkgZWZmZWN0LiIsCiAgICAgICAgICAgICAgICBSZW1vdmVkSW5QaXAxMFdhcm5pbmcsCiAgICAgICAgICAgICkKCiAgICAgICAgaWYgb3B0aW9ucy5hbGxvd19hbGxfZXh0ZXJuYWw6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCiAgICAgICAgICAgICAgICAiLS1hbGxvdy1hbGwtZXh0ZXJuYWwgaGFzIGJlZW4gZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkICIKICAgICAgICAgICAgICAgICJpbiB0aGUgZnV0dXJlLiBEdWUgdG8gY2hhbmdlcyBpbiB0aGUgcmVwb3NpdG9yeSBwcm90b2NvbCwgaXQgIgogICAgICAgICAgICAgICAgIm5vIGxvbmdlciBoYXMgYW55IGVmZmVjdC4iLAogICAgICAgICAgICAgICAgUmVtb3ZlZEluUGlwMTBXYXJuaW5nLAogICAgICAgICAgICApCgogICAgICAgIGlmIG9wdGlvbnMuYWxsb3dfdW52ZXJpZmllZDoKICAgICAgICAgICAgd2FybmluZ3Mud2FybigKICAgICAgICAgICAgICAgICItLWFsbG93LXVudmVyaWZpZWQgaGFzIGJlZW4gZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkICIKICAgICAgICAgICAgICAgICJpbiB0aGUgZnV0dXJlLiBEdWUgdG8gY2hhbmdlcyBpbiB0aGUgcmVwb3NpdG9yeSBwcm90b2NvbCwgaXQgIgogICAgICAgICAgICAgICAgIm5vIGxvbmdlciBoYXMgYW55IGVmZmVjdC4iLAogICAgICAgICAgICAgICAgUmVtb3ZlZEluUGlwMTBXYXJuaW5nLAogICAgICAgICAgICApCgogICAgICAgIGlmIG9wdGlvbnMubGlzdF9mb3JtYXQgaXMgTm9uZToKICAgICAgICAgICAgd2FybmluZ3Mud2FybigKICAgICAgICAgICAgICAgICJUaGUgZGVmYXVsdCBmb3JtYXQgd2lsbCBzd2l0Y2ggdG8gY29sdW1ucyBpbiB0aGUgZnV0dXJlLiAiCiAgICAgICAgICAgICAgICAiWW91IGNhbiB1c2UgLS1mb3JtYXQ9KGxlZ2FjeXxjb2x1bW5zKSAob3IgZGVmaW5lIGEgIgogICAgICAgICAgICAgICAgImZvcm1hdD0obGVnYWN5fGNvbHVtbnMpIGluIHlvdXIgcGlwLmNvbmYgdW5kZXIgdGhlIFtsaXN0XSAiCiAgICAgICAgICAgICAgICAic2VjdGlvbikgdG8gZGlzYWJsZSB0aGlzIHdhcm5pbmcuIiwKICAgICAgICAgICAgICAgIFJlbW92ZWRJblBpcDEwV2FybmluZywKICAgICAgICAgICAgKQoKICAgICAgICBpZiBvcHRpb25zLm91dGRhdGVkIGFuZCBvcHRpb25zLnVwdG9kYXRlOgogICAgICAgICAgICByYWlzZSBDb21tYW5kRXJyb3IoCiAgICAgICAgICAgICAgICAiT3B0aW9ucyAtLW91dGRhdGVkIGFuZCAtLXVwdG9kYXRlIGNhbm5vdCBiZSBjb21iaW5lZC4iKQoKICAgICAgICBwYWNrYWdlcyA9IGdldF9pbnN0YWxsZWRfZGlzdHJpYnV0aW9ucygKICAgICAgICAgICAgbG9jYWxfb25seT1vcHRpb25zLmxvY2FsLAogICAgICAgICAgICB1c2VyX29ubHk9b3B0aW9ucy51c2VyLAogICAgICAgICAgICBlZGl0YWJsZXNfb25seT1vcHRpb25zLmVkaXRhYmxlLAogICAgICAgICkKCiAgICAgICAgaWYgb3B0aW9ucy5vdXRkYXRlZDoKICAgICAgICAgICAgcGFja2FnZXMgPSBzZWxmLmdldF9vdXRkYXRlZChwYWNrYWdlcywgb3B0aW9ucykKICAgICAgICBlbGlmIG9wdGlvbnMudXB0b2RhdGU6CiAgICAgICAgICAgIHBhY2thZ2VzID0gc2VsZi5nZXRfdXB0b2RhdGUocGFja2FnZXMsIG9wdGlvbnMpCgogICAgICAgIGlmIG9wdGlvbnMubm90X3JlcXVpcmVkOgogICAgICAgICAgICBwYWNrYWdlcyA9IHNlbGYuZ2V0X25vdF9yZXF1aXJlZChwYWNrYWdlcywgb3B0aW9ucykKCiAgICAgICAgc2VsZi5vdXRwdXRfcGFja2FnZV9saXN0aW5nKHBhY2thZ2VzLCBvcHRpb25zKQoKICAgIGRlZiBnZXRfb3V0ZGF0ZWQoc2VsZiwgcGFja2FnZXMsIG9wdGlvbnMpOgogICAgICAgIHJldHVybiBbCiAgICAgICAgICAgIGRpc3QgZm9yIGRpc3QgaW4gc2VsZi5pdGVyX3BhY2thZ2VzX2xhdGVzdF9pbmZvcyhwYWNrYWdlcywgb3B0aW9ucykKICAgICAgICAgICAgaWYgZGlzdC5sYXRlc3RfdmVyc2lvbiA+IGRpc3QucGFyc2VkX3ZlcnNpb24KICAgICAgICBdCgogICAgZGVmIGdldF91cHRvZGF0ZShzZWxmLCBwYWNrYWdlcywgb3B0aW9ucyk6CiAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgZGlzdCBmb3IgZGlzdCBpbiBzZWxmLml0ZXJfcGFja2FnZXNfbGF0ZXN0X2luZm9zKHBhY2thZ2VzLCBvcHRpb25zKQogICAgICAgICAgICBpZiBkaXN0LmxhdGVzdF92ZXJzaW9uID09IGRpc3QucGFyc2VkX3ZlcnNpb24KICAgICAgICBdCgogICAgZGVmIGdldF9ub3RfcmVxdWlyZWQoc2VsZiwgcGFja2FnZXMsIG9wdGlvbnMpOgogICAgICAgIGRlcF9rZXlzID0gc2V0KCkKICAgICAgICBmb3IgZGlzdCBpbiBwYWNrYWdlczoKICAgICAgICAgICAgZGVwX2tleXMudXBkYXRlKHJlcXVpcmVtZW50LmtleSBmb3IgcmVxdWlyZW1lbnQgaW4gZGlzdC5yZXF1aXJlcygpKQogICAgICAgIHJldHVybiBzZXQocGtnIGZvciBwa2cgaW4gcGFja2FnZXMgaWYgcGtnLmtleSBub3QgaW4gZGVwX2tleXMpCgogICAgZGVmIGl0ZXJfcGFja2FnZXNfbGF0ZXN0X2luZm9zKHNlbGYsIHBhY2thZ2VzLCBvcHRpb25zKToKICAgICAgICBpbmRleF91cmxzID0gW29wdGlvbnMuaW5kZXhfdXJsXSArIG9wdGlvbnMuZXh0cmFfaW5kZXhfdXJscwogICAgICAgIGlmIG9wdGlvbnMubm9faW5kZXg6CiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnSWdub3JpbmcgaW5kZXhlczogJXMnLCAnLCcuam9pbihpbmRleF91cmxzKSkKICAgICAgICAgICAgaW5kZXhfdXJscyA9IFtdCgogICAgICAgIGRlcGVuZGVuY3lfbGlua3MgPSBbXQogICAgICAgIGZvciBkaXN0IGluIHBhY2thZ2VzOgogICAgICAgICAgICBpZiBkaXN0Lmhhc19tZXRhZGF0YSgnZGVwZW5kZW5jeV9saW5rcy50eHQnKToKICAgICAgICAgICAgICAgIGRlcGVuZGVuY3lfbGlua3MuZXh0ZW5kKAogICAgICAgICAgICAgICAgICAgIGRpc3QuZ2V0X21ldGFkYXRhX2xpbmVzKCdkZXBlbmRlbmN5X2xpbmtzLnR4dCcpLAogICAgICAgICAgICAgICAgKQoKICAgICAgICB3aXRoIHNlbGYuX2J1aWxkX3Nlc3Npb24ob3B0aW9ucykgYXMgc2Vzc2lvbjoKICAgICAgICAgICAgZmluZGVyID0gc2VsZi5fYnVpbGRfcGFja2FnZV9maW5kZXIob3B0aW9ucywgaW5kZXhfdXJscywgc2Vzc2lvbikKICAgICAgICAgICAgZmluZGVyLmFkZF9kZXBlbmRlbmN5X2xpbmtzKGRlcGVuZGVuY3lfbGlua3MpCgogICAgICAgICAgICBmb3IgZGlzdCBpbiBwYWNrYWdlczoKICAgICAgICAgICAgICAgIHR5cCA9ICd1bmtub3duJwogICAgICAgICAgICAgICAgYWxsX2NhbmRpZGF0ZXMgPSBmaW5kZXIuZmluZF9hbGxfY2FuZGlkYXRlcyhkaXN0LmtleSkKICAgICAgICAgICAgICAgIGlmIG5vdCBvcHRpb25zLnByZToKICAgICAgICAgICAgICAgICAgICAjIFJlbW92ZSBwcmVyZWxlYXNlcwogICAgICAgICAgICAgICAgICAgIGFsbF9jYW5kaWRhdGVzID0gW2NhbmRpZGF0ZSBmb3IgY2FuZGlkYXRlIGluIGFsbF9jYW5kaWRhdGVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IGNhbmRpZGF0ZS52ZXJzaW9uLmlzX3ByZXJlbGVhc2VdCgogICAgICAgICAgICAgICAgaWYgbm90IGFsbF9jYW5kaWRhdGVzOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBiZXN0X2NhbmRpZGF0ZSA9IG1heChhbGxfY2FuZGlkYXRlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleT1maW5kZXIuX2NhbmRpZGF0ZV9zb3J0X2tleSkKICAgICAgICAgICAgICAgIHJlbW90ZV92ZXJzaW9uID0gYmVzdF9jYW5kaWRhdGUudmVyc2lvbgogICAgICAgICAgICAgICAgaWYgYmVzdF9jYW5kaWRhdGUubG9jYXRpb24uaXNfd2hlZWw6CiAgICAgICAgICAgICAgICAgICAgdHlwID0gJ3doZWVsJwogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICB0eXAgPSAnc2Rpc3QnCiAgICAgICAgICAgICAgICAjIFRoaXMgaXMgZGlydHkgYnV0IG1ha2VzIHRoZSByZXN0IG9mIHRoZSBjb2RlIG11Y2ggY2xlYW5lcgogICAgICAgICAgICAgICAgZGlzdC5sYXRlc3RfdmVyc2lvbiA9IHJlbW90ZV92ZXJzaW9uCiAgICAgICAgICAgICAgICBkaXN0LmxhdGVzdF9maWxldHlwZSA9IHR5cAogICAgICAgICAgICAgICAgeWllbGQgZGlzdAoKICAgIGRlZiBvdXRwdXRfbGVnYWN5KHNlbGYsIGRpc3QpOgogICAgICAgIGlmIGRpc3RfaXNfZWRpdGFibGUoZGlzdCk6CiAgICAgICAgICAgIHJldHVybiAnJXMgKCVzLCAlcyknICUgKAogICAgICAgICAgICAgICAgZGlzdC5wcm9qZWN0X25hbWUsCiAgICAgICAgICAgICAgICBkaXN0LnZlcnNpb24sCiAgICAgICAgICAgICAgICBkaXN0LmxvY2F0aW9uLAogICAgICAgICAgICApCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuICclcyAoJXMpJyAlIChkaXN0LnByb2plY3RfbmFtZSwgZGlzdC52ZXJzaW9uKQoKICAgIGRlZiBvdXRwdXRfbGVnYWN5X2xhdGVzdChzZWxmLCBkaXN0KToKICAgICAgICByZXR1cm4gJyVzIC0gTGF0ZXN0OiAlcyBbJXNdJyAlICgKICAgICAgICAgICAgc2VsZi5vdXRwdXRfbGVnYWN5KGRpc3QpLAogICAgICAgICAgICBkaXN0LmxhdGVzdF92ZXJzaW9uLAogICAgICAgICAgICBkaXN0LmxhdGVzdF9maWxldHlwZSwKICAgICAgICApCgogICAgZGVmIG91dHB1dF9wYWNrYWdlX2xpc3Rpbmcoc2VsZiwgcGFja2FnZXMsIG9wdGlvbnMpOgogICAgICAgIHBhY2thZ2VzID0gc29ydGVkKAogICAgICAgICAgICBwYWNrYWdlcywKICAgICAgICAgICAga2V5PWxhbWJkYSBkaXN0OiBkaXN0LnByb2plY3RfbmFtZS5sb3dlcigpLAogICAgICAgICkKICAgICAgICBpZiBvcHRpb25zLmxpc3RfZm9ybWF0ID09ICdjb2x1bW5zJyBhbmQgcGFja2FnZXM6CiAgICAgICAgICAgIGRhdGEsIGhlYWRlciA9IGZvcm1hdF9mb3JfY29sdW1ucyhwYWNrYWdlcywgb3B0aW9ucykKICAgICAgICAgICAgc2VsZi5vdXRwdXRfcGFja2FnZV9saXN0aW5nX2NvbHVtbnMoZGF0YSwgaGVhZGVyKQogICAgICAgIGVsaWYgb3B0aW9ucy5saXN0X2Zvcm1hdCA9PSAnZnJlZXplJzoKICAgICAgICAgICAgZm9yIGRpc3QgaW4gcGFja2FnZXM6CiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygiJXM9PSVzIiwgZGlzdC5wcm9qZWN0X25hbWUsIGRpc3QudmVyc2lvbikKICAgICAgICBlbGlmIG9wdGlvbnMubGlzdF9mb3JtYXQgPT0gJ2pzb24nOgogICAgICAgICAgICBsb2dnZXIuaW5mbyhmb3JtYXRfZm9yX2pzb24ocGFja2FnZXMsIG9wdGlvbnMpKQogICAgICAgIGVsc2U6ICAjIGxlZ2FjeQogICAgICAgICAgICBmb3IgZGlzdCBpbiBwYWNrYWdlczoKICAgICAgICAgICAgICAgIGlmIG9wdGlvbnMub3V0ZGF0ZWQ6CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oc2VsZi5vdXRwdXRfbGVnYWN5X2xhdGVzdChkaXN0KSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oc2VsZi5vdXRwdXRfbGVnYWN5KGRpc3QpKQoKICAgIGRlZiBvdXRwdXRfcGFja2FnZV9saXN0aW5nX2NvbHVtbnMoc2VsZiwgZGF0YSwgaGVhZGVyKToKICAgICAgICAjIGluc2VydCB0aGUgaGVhZGVyIGZpcnN0OiB3ZSBuZWVkIHRvIGtub3cgdGhlIHNpemUgb2YgY29sdW1uIG5hbWVzCiAgICAgICAgaWYgbGVuKGRhdGEpID4gMDoKICAgICAgICAgICAgZGF0YS5pbnNlcnQoMCwgaGVhZGVyKQoKICAgICAgICBwa2dfc3RyaW5ncywgc2l6ZXMgPSB0YWJ1bGF0ZShkYXRhKQoKICAgICAgICAjIENyZWF0ZSBhbmQgYWRkIGEgc2VwYXJhdG9yLgogICAgICAgIGlmIGxlbihkYXRhKSA+IDA6CiAgICAgICAgICAgIHBrZ19zdHJpbmdzLmluc2VydCgxLCAiICIuam9pbihtYXAobGFtYmRhIHg6ICctJyAqIHgsIHNpemVzKSkpCgogICAgICAgIGZvciB2YWwgaW4gcGtnX3N0cmluZ3M6CiAgICAgICAgICAgIGxvZ2dlci5pbmZvKHZhbCkKCgpkZWYgdGFidWxhdGUodmFscyk6CiAgICAjIEZyb20gcGZtb29yZSBvbiBHaXRIdWI6CiAgICAjIGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3BpcC9pc3N1ZXMvMzY1MSNpc3N1ZWNvbW1lbnQtMjE2OTMyNTY0CiAgICBhc3NlcnQgbGVuKHZhbHMpID4gMAoKICAgIHNpemVzID0gWzBdICogbWF4KGxlbih4KSBmb3IgeCBpbiB2YWxzKQogICAgZm9yIHJvdyBpbiB2YWxzOgogICAgICAgIHNpemVzID0gW21heChzLCBsZW4oc3RyKGMpKSkgZm9yIHMsIGMgaW4gemlwX2xvbmdlc3Qoc2l6ZXMsIHJvdyldCgogICAgcmVzdWx0ID0gW10KICAgIGZvciByb3cgaW4gdmFsczoKICAgICAgICBkaXNwbGF5ID0gIiAiLmpvaW4oW3N0cihjKS5sanVzdChzKSBpZiBjIGlzIG5vdCBOb25lIGVsc2UgJycKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBzLCBjIGluIHppcF9sb25nZXN0KHNpemVzLCByb3cpXSkKICAgICAgICByZXN1bHQuYXBwZW5kKGRpc3BsYXkpCgogICAgcmV0dXJuIHJlc3VsdCwgc2l6ZXMKCgpkZWYgZm9ybWF0X2Zvcl9jb2x1bW5zKHBrZ3MsIG9wdGlvbnMpOgogICAgIiIiCiAgICBDb252ZXJ0IHRoZSBwYWNrYWdlIGRhdGEgaW50byBzb21ldGhpbmcgdXNhYmxlCiAgICBieSBvdXRwdXRfcGFja2FnZV9saXN0aW5nX2NvbHVtbnMuCiAgICAiIiIKICAgIHJ1bm5pbmdfb3V0ZGF0ZWQgPSBvcHRpb25zLm91dGRhdGVkCiAgICAjIEFkanVzdCB0aGUgaGVhZGVyIGZvciB0aGUgYHBpcCBsaXN0IC0tb3V0ZGF0ZWRgIGNhc2UuCiAgICBpZiBydW5uaW5nX291dGRhdGVkOgogICAgICAgIGhlYWRlciA9IFsiUGFja2FnZSIsICJWZXJzaW9uIiwgIkxhdGVzdCIsICJUeXBlIl0KICAgIGVsc2U6CiAgICAgICAgaGVhZGVyID0gWyJQYWNrYWdlIiwgIlZlcnNpb24iXQoKICAgIGRhdGEgPSBbXQogICAgaWYgYW55KGRpc3RfaXNfZWRpdGFibGUoeCkgZm9yIHggaW4gcGtncyk6CiAgICAgICAgaGVhZGVyLmFwcGVuZCgiTG9jYXRpb24iKQoKICAgIGZvciBwcm9qIGluIHBrZ3M6CiAgICAgICAgIyBpZiB3ZSdyZSB3b3JraW5nIG9uIHRoZSAnb3V0ZGF0ZWQnIGxpc3QsIHNlcGFyYXRlIG91dCB0aGUKICAgICAgICAjIGxhdGVzdF92ZXJzaW9uIGFuZCB0eXBlCiAgICAgICAgcm93ID0gW3Byb2oucHJvamVjdF9uYW1lLCBwcm9qLnZlcnNpb25dCgogICAgICAgIGlmIHJ1bm5pbmdfb3V0ZGF0ZWQ6CiAgICAgICAgICAgIHJvdy5hcHBlbmQocHJvai5sYXRlc3RfdmVyc2lvbikKICAgICAgICAgICAgcm93LmFwcGVuZChwcm9qLmxhdGVzdF9maWxldHlwZSkKCiAgICAgICAgaWYgZGlzdF9pc19lZGl0YWJsZShwcm9qKToKICAgICAgICAgICAgcm93LmFwcGVuZChwcm9qLmxvY2F0aW9uKQoKICAgICAgICBkYXRhLmFwcGVuZChyb3cpCgogICAgcmV0dXJuIGRhdGEsIGhlYWRlcgoKCmRlZiBmb3JtYXRfZm9yX2pzb24ocGFja2FnZXMsIG9wdGlvbnMpOgogICAgZGF0YSA9IFtdCiAgICBmb3IgZGlzdCBpbiBwYWNrYWdlczoKICAgICAgICBpbmZvID0gewogICAgICAgICAgICAnbmFtZSc6IGRpc3QucHJvamVjdF9uYW1lLAogICAgICAgICAgICAndmVyc2lvbic6IHNpeC50ZXh0X3R5cGUoZGlzdC52ZXJzaW9uKSwKICAgICAgICB9CiAgICAgICAgaWYgb3B0aW9ucy5vdXRkYXRlZDoKICAgICAgICAgICAgaW5mb1snbGF0ZXN0X3ZlcnNpb24nXSA9IHNpeC50ZXh0X3R5cGUoZGlzdC5sYXRlc3RfdmVyc2lvbikKICAgICAgICAgICAgaW5mb1snbGF0ZXN0X2ZpbGV0eXBlJ10gPSBkaXN0LmxhdGVzdF9maWxldHlwZQogICAgICAgIGRhdGEuYXBwZW5kKGluZm8pCiAgICByZXR1cm4ganNvbi5kdW1wcyhkYXRhKQpQSwMEFAAAAAAAAAAhAK5ChNyWEQAAlhEAADMAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9jb21tYW5kcy9zZWFyY2gucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IHN5cwppbXBvcnQgdGV4dHdyYXAKCmZyb20gcGlwLmJhc2Vjb21tYW5kIGltcG9ydCBDb21tYW5kLCBTVUNDRVNTCmZyb20gcGlwLmNvbXBhdCBpbXBvcnQgT3JkZXJlZERpY3QKZnJvbSBwaXAuZG93bmxvYWQgaW1wb3J0IFBpcFhtbHJwY1RyYW5zcG9ydApmcm9tIHBpcC5tb2RlbHMgaW1wb3J0IFB5UEkKZnJvbSBwaXAudXRpbHMgaW1wb3J0IGdldF90ZXJtaW5hbF9zaXplCmZyb20gcGlwLnV0aWxzLmxvZ2dpbmcgaW1wb3J0IGluZGVudF9sb2cKZnJvbSBwaXAuZXhjZXB0aW9ucyBpbXBvcnQgQ29tbWFuZEVycm9yCmZyb20gcGlwLnN0YXR1c19jb2RlcyBpbXBvcnQgTk9fTUFUQ0hFU19GT1VORApmcm9tIHBpcC5fdmVuZG9yLnBhY2thZ2luZy52ZXJzaW9uIGltcG9ydCBwYXJzZSBhcyBwYXJzZV92ZXJzaW9uCmZyb20gcGlwLl92ZW5kb3IgaW1wb3J0IHBrZ19yZXNvdXJjZXMKZnJvbSBwaXAuX3ZlbmRvci5zaXgubW92ZXMgaW1wb3J0IHhtbHJwY19jbGllbnQKCgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCgpjbGFzcyBTZWFyY2hDb21tYW5kKENvbW1hbmQpOgogICAgIiIiU2VhcmNoIGZvciBQeVBJIHBhY2thZ2VzIHdob3NlIG5hbWUgb3Igc3VtbWFyeSBjb250YWlucyA8cXVlcnk+LiIiIgogICAgbmFtZSA9ICdzZWFyY2gnCiAgICB1c2FnZSA9ICIiIgogICAgICAlcHJvZyBbb3B0aW9uc10gPHF1ZXJ5PiIiIgogICAgc3VtbWFyeSA9ICdTZWFyY2ggUHlQSSBmb3IgcGFja2FnZXMuJwoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprdyk6CiAgICAgICAgc3VwZXIoU2VhcmNoQ29tbWFuZCwgc2VsZikuX19pbml0X18oKmFyZ3MsICoqa3cpCiAgICAgICAgc2VsZi5jbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAnLWknLCAnLS1pbmRleCcsCiAgICAgICAgICAgIGRlc3Q9J2luZGV4JywKICAgICAgICAgICAgbWV0YXZhcj0nVVJMJywKICAgICAgICAgICAgZGVmYXVsdD1QeVBJLnB5cGlfdXJsLAogICAgICAgICAgICBoZWxwPSdCYXNlIFVSTCBvZiBQeXRob24gUGFja2FnZSBJbmRleCAoZGVmYXVsdCAlZGVmYXVsdCknKQoKICAgICAgICBzZWxmLnBhcnNlci5pbnNlcnRfb3B0aW9uX2dyb3VwKDAsIHNlbGYuY21kX29wdHMpCgogICAgZGVmIHJ1bihzZWxmLCBvcHRpb25zLCBhcmdzKToKICAgICAgICBpZiBub3QgYXJnczoKICAgICAgICAgICAgcmFpc2UgQ29tbWFuZEVycm9yKCdNaXNzaW5nIHJlcXVpcmVkIGFyZ3VtZW50IChzZWFyY2ggcXVlcnkpLicpCiAgICAgICAgcXVlcnkgPSBhcmdzCiAgICAgICAgcHlwaV9oaXRzID0gc2VsZi5zZWFyY2gocXVlcnksIG9wdGlvbnMpCiAgICAgICAgaGl0cyA9IHRyYW5zZm9ybV9oaXRzKHB5cGlfaGl0cykKCiAgICAgICAgdGVybWluYWxfd2lkdGggPSBOb25lCiAgICAgICAgaWYgc3lzLnN0ZG91dC5pc2F0dHkoKToKICAgICAgICAgICAgdGVybWluYWxfd2lkdGggPSBnZXRfdGVybWluYWxfc2l6ZSgpWzBdCgogICAgICAgIHByaW50X3Jlc3VsdHMoaGl0cywgdGVybWluYWxfd2lkdGg9dGVybWluYWxfd2lkdGgpCiAgICAgICAgaWYgcHlwaV9oaXRzOgogICAgICAgICAgICByZXR1cm4gU1VDQ0VTUwogICAgICAgIHJldHVybiBOT19NQVRDSEVTX0ZPVU5ECgogICAgZGVmIHNlYXJjaChzZWxmLCBxdWVyeSwgb3B0aW9ucyk6CiAgICAgICAgaW5kZXhfdXJsID0gb3B0aW9ucy5pbmRleAogICAgICAgIHdpdGggc2VsZi5fYnVpbGRfc2Vzc2lvbihvcHRpb25zKSBhcyBzZXNzaW9uOgogICAgICAgICAgICB0cmFuc3BvcnQgPSBQaXBYbWxycGNUcmFuc3BvcnQoaW5kZXhfdXJsLCBzZXNzaW9uKQogICAgICAgICAgICBweXBpID0geG1scnBjX2NsaWVudC5TZXJ2ZXJQcm94eShpbmRleF91cmwsIHRyYW5zcG9ydCkKICAgICAgICAgICAgaGl0cyA9IHB5cGkuc2VhcmNoKHsnbmFtZSc6IHF1ZXJ5LCAnc3VtbWFyeSc6IHF1ZXJ5fSwgJ29yJykKICAgICAgICAgICAgcmV0dXJuIGhpdHMKCgpkZWYgdHJhbnNmb3JtX2hpdHMoaGl0cyk6CiAgICAiIiIKICAgIFRoZSBsaXN0IGZyb20gcHlwaSBpcyByZWFsbHkgYSBsaXN0IG9mIHZlcnNpb25zLiBXZSB3YW50IGEgbGlzdCBvZgogICAgcGFja2FnZXMgd2l0aCB0aGUgbGlzdCBvZiB2ZXJzaW9ucyBzdG9yZWQgaW5saW5lLiBUaGlzIGNvbnZlcnRzIHRoZQogICAgbGlzdCBmcm9tIHB5cGkgaW50byBvbmUgd2UgY2FuIHVzZS4KICAgICIiIgogICAgcGFja2FnZXMgPSBPcmRlcmVkRGljdCgpCiAgICBmb3IgaGl0IGluIGhpdHM6CiAgICAgICAgbmFtZSA9IGhpdFsnbmFtZSddCiAgICAgICAgc3VtbWFyeSA9IGhpdFsnc3VtbWFyeSddCiAgICAgICAgdmVyc2lvbiA9IGhpdFsndmVyc2lvbiddCgogICAgICAgIGlmIG5hbWUgbm90IGluIHBhY2thZ2VzLmtleXMoKToKICAgICAgICAgICAgcGFja2FnZXNbbmFtZV0gPSB7CiAgICAgICAgICAgICAgICAnbmFtZSc6IG5hbWUsCiAgICAgICAgICAgICAgICAnc3VtbWFyeSc6IHN1bW1hcnksCiAgICAgICAgICAgICAgICAndmVyc2lvbnMnOiBbdmVyc2lvbl0sCiAgICAgICAgICAgIH0KICAgICAgICBlbHNlOgogICAgICAgICAgICBwYWNrYWdlc1tuYW1lXVsndmVyc2lvbnMnXS5hcHBlbmQodmVyc2lvbikKCiAgICAgICAgICAgICMgaWYgdGhpcyBpcyB0aGUgaGlnaGVzdCB2ZXJzaW9uLCByZXBsYWNlIHN1bW1hcnkgYW5kIHNjb3JlCiAgICAgICAgICAgIGlmIHZlcnNpb24gPT0gaGlnaGVzdF92ZXJzaW9uKHBhY2thZ2VzW25hbWVdWyd2ZXJzaW9ucyddKToKICAgICAgICAgICAgICAgIHBhY2thZ2VzW25hbWVdWydzdW1tYXJ5J10gPSBzdW1tYXJ5CgogICAgcmV0dXJuIGxpc3QocGFja2FnZXMudmFsdWVzKCkpCgoKZGVmIHByaW50X3Jlc3VsdHMoaGl0cywgbmFtZV9jb2x1bW5fd2lkdGg9Tm9uZSwgdGVybWluYWxfd2lkdGg9Tm9uZSk6CiAgICBpZiBub3QgaGl0czoKICAgICAgICByZXR1cm4KICAgIGlmIG5hbWVfY29sdW1uX3dpZHRoIGlzIE5vbmU6CiAgICAgICAgbmFtZV9jb2x1bW5fd2lkdGggPSBtYXgoWwogICAgICAgICAgICBsZW4oaGl0WyduYW1lJ10pICsgbGVuKGhpdC5nZXQoJ3ZlcnNpb25zJywgWyctJ10pWy0xXSkKICAgICAgICAgICAgZm9yIGhpdCBpbiBoaXRzCiAgICAgICAgXSkgKyA0CgogICAgaW5zdGFsbGVkX3BhY2thZ2VzID0gW3AucHJvamVjdF9uYW1lIGZvciBwIGluIHBrZ19yZXNvdXJjZXMud29ya2luZ19zZXRdCiAgICBmb3IgaGl0IGluIGhpdHM6CiAgICAgICAgbmFtZSA9IGhpdFsnbmFtZSddCiAgICAgICAgc3VtbWFyeSA9IGhpdFsnc3VtbWFyeSddIG9yICcnCiAgICAgICAgdmVyc2lvbiA9IGhpdC5nZXQoJ3ZlcnNpb25zJywgWyctJ10pWy0xXQogICAgICAgIGlmIHRlcm1pbmFsX3dpZHRoIGlzIG5vdCBOb25lOgogICAgICAgICAgICB0YXJnZXRfd2lkdGggPSB0ZXJtaW5hbF93aWR0aCAtIG5hbWVfY29sdW1uX3dpZHRoIC0gNQogICAgICAgICAgICBpZiB0YXJnZXRfd2lkdGggPiAxMDoKICAgICAgICAgICAgICAgICMgd3JhcCBhbmQgaW5kZW50IHN1bW1hcnkgdG8gZml0IHRlcm1pbmFsCiAgICAgICAgICAgICAgICBzdW1tYXJ5ID0gdGV4dHdyYXAud3JhcChzdW1tYXJ5LCB0YXJnZXRfd2lkdGgpCiAgICAgICAgICAgICAgICBzdW1tYXJ5ID0gKCdcbicgKyAnICcgKiAobmFtZV9jb2x1bW5fd2lkdGggKyAzKSkuam9pbihzdW1tYXJ5KQoKICAgICAgICBsaW5lID0gJyUtKnMgLSAlcycgJSAobmFtZV9jb2x1bW5fd2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICclcyAoJXMpJyAlIChuYW1lLCB2ZXJzaW9uKSwgc3VtbWFyeSkKICAgICAgICB0cnk6CiAgICAgICAgICAgIGxvZ2dlci5pbmZvKGxpbmUpCiAgICAgICAgICAgIGlmIG5hbWUgaW4gaW5zdGFsbGVkX3BhY2thZ2VzOgogICAgICAgICAgICAgICAgZGlzdCA9IHBrZ19yZXNvdXJjZXMuZ2V0X2Rpc3RyaWJ1dGlvbihuYW1lKQogICAgICAgICAgICAgICAgd2l0aCBpbmRlbnRfbG9nKCk6CiAgICAgICAgICAgICAgICAgICAgbGF0ZXN0ID0gaGlnaGVzdF92ZXJzaW9uKGhpdFsndmVyc2lvbnMnXSkKICAgICAgICAgICAgICAgICAgICBpZiBkaXN0LnZlcnNpb24gPT0gbGF0ZXN0OgogICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygnSU5TVEFMTEVEOiAlcyAobGF0ZXN0KScsIGRpc3QudmVyc2lvbikKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygnSU5TVEFMTEVEOiAlcycsIGRpc3QudmVyc2lvbikKICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ0xBVEVTVDogICAgJXMnLCBsYXRlc3QpCiAgICAgICAgZXhjZXB0IFVuaWNvZGVFbmNvZGVFcnJvcjoKICAgICAgICAgICAgcGFzcwoKCmRlZiBoaWdoZXN0X3ZlcnNpb24odmVyc2lvbnMpOgogICAgcmV0dXJuIG1heCh2ZXJzaW9ucywga2V5PXBhcnNlX3ZlcnNpb24pClBLAwQUAAAAAAAAACEADFMfJAMXAAADFwAAMQAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL2NvbW1hbmRzL3Nob3cucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKZnJvbSBlbWFpbC5wYXJzZXIgaW1wb3J0IEZlZWRQYXJzZXIKaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IG9zCgpmcm9tIHBpcC5iYXNlY29tbWFuZCBpbXBvcnQgQ29tbWFuZApmcm9tIHBpcC5zdGF0dXNfY29kZXMgaW1wb3J0IFNVQ0NFU1MsIEVSUk9SCmZyb20gcGlwLl92ZW5kb3IgaW1wb3J0IHBrZ19yZXNvdXJjZXMKZnJvbSBwaXAuX3ZlbmRvci5wYWNrYWdpbmcudXRpbHMgaW1wb3J0IGNhbm9uaWNhbGl6ZV9uYW1lCgoKbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgoKY2xhc3MgU2hvd0NvbW1hbmQoQ29tbWFuZCk6CiAgICAiIiJTaG93IGluZm9ybWF0aW9uIGFib3V0IG9uZSBvciBtb3JlIGluc3RhbGxlZCBwYWNrYWdlcy4iIiIKICAgIG5hbWUgPSAnc2hvdycKICAgIHVzYWdlID0gIiIiCiAgICAgICVwcm9nIFtvcHRpb25zXSA8cGFja2FnZT4gLi4uIiIiCiAgICBzdW1tYXJ5ID0gJ1Nob3cgaW5mb3JtYXRpb24gYWJvdXQgaW5zdGFsbGVkIHBhY2thZ2VzLicKCiAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3cpOgogICAgICAgIHN1cGVyKFNob3dDb21tYW5kLCBzZWxmKS5fX2luaXRfXygqYXJncywgKiprdykKICAgICAgICBzZWxmLmNtZF9vcHRzLmFkZF9vcHRpb24oCiAgICAgICAgICAgICctZicsICctLWZpbGVzJywKICAgICAgICAgICAgZGVzdD0nZmlsZXMnLAogICAgICAgICAgICBhY3Rpb249J3N0b3JlX3RydWUnLAogICAgICAgICAgICBkZWZhdWx0PUZhbHNlLAogICAgICAgICAgICBoZWxwPSdTaG93IHRoZSBmdWxsIGxpc3Qgb2YgaW5zdGFsbGVkIGZpbGVzIGZvciBlYWNoIHBhY2thZ2UuJykKCiAgICAgICAgc2VsZi5wYXJzZXIuaW5zZXJ0X29wdGlvbl9ncm91cCgwLCBzZWxmLmNtZF9vcHRzKQoKICAgIGRlZiBydW4oc2VsZiwgb3B0aW9ucywgYXJncyk6CiAgICAgICAgaWYgbm90IGFyZ3M6CiAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdFUlJPUjogUGxlYXNlIHByb3ZpZGUgYSBwYWNrYWdlIG5hbWUgb3IgbmFtZXMuJykKICAgICAgICAgICAgcmV0dXJuIEVSUk9SCiAgICAgICAgcXVlcnkgPSBhcmdzCgogICAgICAgIHJlc3VsdHMgPSBzZWFyY2hfcGFja2FnZXNfaW5mbyhxdWVyeSkKICAgICAgICBpZiBub3QgcHJpbnRfcmVzdWx0cygKICAgICAgICAgICAgICAgIHJlc3VsdHMsIGxpc3RfZmlsZXM9b3B0aW9ucy5maWxlcywgdmVyYm9zZT1vcHRpb25zLnZlcmJvc2UpOgogICAgICAgICAgICByZXR1cm4gRVJST1IKICAgICAgICByZXR1cm4gU1VDQ0VTUwoKCmRlZiBzZWFyY2hfcGFja2FnZXNfaW5mbyhxdWVyeSk6CiAgICAiIiIKICAgIEdhdGhlciBkZXRhaWxzIGZyb20gaW5zdGFsbGVkIGRpc3RyaWJ1dGlvbnMuIFByaW50IGRpc3RyaWJ1dGlvbiBuYW1lLAogICAgdmVyc2lvbiwgbG9jYXRpb24sIGFuZCBpbnN0YWxsZWQgZmlsZXMuIEluc3RhbGxlZCBmaWxlcyByZXF1aXJlcyBhCiAgICBwaXAgZ2VuZXJhdGVkICdpbnN0YWxsZWQtZmlsZXMudHh0JyBpbiB0aGUgZGlzdHJpYnV0aW9ucyAnLmVnZy1pbmZvJwogICAgZGlyZWN0b3J5LgogICAgIiIiCiAgICBpbnN0YWxsZWQgPSB7fQogICAgZm9yIHAgaW4gcGtnX3Jlc291cmNlcy53b3JraW5nX3NldDoKICAgICAgICBpbnN0YWxsZWRbY2Fub25pY2FsaXplX25hbWUocC5wcm9qZWN0X25hbWUpXSA9IHAKCiAgICBxdWVyeV9uYW1lcyA9IFtjYW5vbmljYWxpemVfbmFtZShuYW1lKSBmb3IgbmFtZSBpbiBxdWVyeV0KCiAgICBmb3IgZGlzdCBpbiBbaW5zdGFsbGVkW3BrZ10gZm9yIHBrZyBpbiBxdWVyeV9uYW1lcyBpZiBwa2cgaW4gaW5zdGFsbGVkXToKICAgICAgICBwYWNrYWdlID0gewogICAgICAgICAgICAnbmFtZSc6IGRpc3QucHJvamVjdF9uYW1lLAogICAgICAgICAgICAndmVyc2lvbic6IGRpc3QudmVyc2lvbiwKICAgICAgICAgICAgJ2xvY2F0aW9uJzogZGlzdC5sb2NhdGlvbiwKICAgICAgICAgICAgJ3JlcXVpcmVzJzogW2RlcC5wcm9qZWN0X25hbWUgZm9yIGRlcCBpbiBkaXN0LnJlcXVpcmVzKCldLAogICAgICAgIH0KICAgICAgICBmaWxlX2xpc3QgPSBOb25lCiAgICAgICAgbWV0YWRhdGEgPSBOb25lCiAgICAgICAgaWYgaXNpbnN0YW5jZShkaXN0LCBwa2dfcmVzb3VyY2VzLkRpc3RJbmZvRGlzdHJpYnV0aW9uKToKICAgICAgICAgICAgIyBSRUNPUkRzIHNob3VsZCBiZSBwYXJ0IG9mIC5kaXN0LWluZm8gbWV0YWRhdGFzCiAgICAgICAgICAgIGlmIGRpc3QuaGFzX21ldGFkYXRhKCdSRUNPUkQnKToKICAgICAgICAgICAgICAgIGxpbmVzID0gZGlzdC5nZXRfbWV0YWRhdGFfbGluZXMoJ1JFQ09SRCcpCiAgICAgICAgICAgICAgICBwYXRocyA9IFtsLnNwbGl0KCcsJylbMF0gZm9yIGwgaW4gbGluZXNdCiAgICAgICAgICAgICAgICBwYXRocyA9IFtvcy5wYXRoLmpvaW4oZGlzdC5sb2NhdGlvbiwgcCkgZm9yIHAgaW4gcGF0aHNdCiAgICAgICAgICAgICAgICBmaWxlX2xpc3QgPSBbb3MucGF0aC5yZWxwYXRoKHAsIGRpc3QubG9jYXRpb24pIGZvciBwIGluIHBhdGhzXQoKICAgICAgICAgICAgaWYgZGlzdC5oYXNfbWV0YWRhdGEoJ01FVEFEQVRBJyk6CiAgICAgICAgICAgICAgICBtZXRhZGF0YSA9IGRpc3QuZ2V0X21ldGFkYXRhKCdNRVRBREFUQScpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBPdGhlcndpc2UgdXNlIHBpcCdzIGxvZyBmb3IgLmVnZy1pbmZvJ3MKICAgICAgICAgICAgaWYgZGlzdC5oYXNfbWV0YWRhdGEoJ2luc3RhbGxlZC1maWxlcy50eHQnKToKICAgICAgICAgICAgICAgIHBhdGhzID0gZGlzdC5nZXRfbWV0YWRhdGFfbGluZXMoJ2luc3RhbGxlZC1maWxlcy50eHQnKQogICAgICAgICAgICAgICAgcGF0aHMgPSBbb3MucGF0aC5qb2luKGRpc3QuZWdnX2luZm8sIHApIGZvciBwIGluIHBhdGhzXQogICAgICAgICAgICAgICAgZmlsZV9saXN0ID0gW29zLnBhdGgucmVscGF0aChwLCBkaXN0LmxvY2F0aW9uKSBmb3IgcCBpbiBwYXRoc10KCiAgICAgICAgICAgIGlmIGRpc3QuaGFzX21ldGFkYXRhKCdQS0ctSU5GTycpOgogICAgICAgICAgICAgICAgbWV0YWRhdGEgPSBkaXN0LmdldF9tZXRhZGF0YSgnUEtHLUlORk8nKQoKICAgICAgICBpZiBkaXN0Lmhhc19tZXRhZGF0YSgnZW50cnlfcG9pbnRzLnR4dCcpOgogICAgICAgICAgICBlbnRyeV9wb2ludHMgPSBkaXN0LmdldF9tZXRhZGF0YV9saW5lcygnZW50cnlfcG9pbnRzLnR4dCcpCiAgICAgICAgICAgIHBhY2thZ2VbJ2VudHJ5X3BvaW50cyddID0gZW50cnlfcG9pbnRzCgogICAgICAgIGlmIGRpc3QuaGFzX21ldGFkYXRhKCdJTlNUQUxMRVInKToKICAgICAgICAgICAgZm9yIGxpbmUgaW4gZGlzdC5nZXRfbWV0YWRhdGFfbGluZXMoJ0lOU1RBTExFUicpOgogICAgICAgICAgICAgICAgaWYgbGluZS5zdHJpcCgpOgogICAgICAgICAgICAgICAgICAgIHBhY2thZ2VbJ2luc3RhbGxlciddID0gbGluZS5zdHJpcCgpCiAgICAgICAgICAgICAgICAgICAgYnJlYWsKCiAgICAgICAgIyBAdG9kbzogU2hvdWxkIHBrZ19yZXNvdXJjZXMuRGlzdHJpYnV0aW9uIGhhdmUgYQogICAgICAgICMgYGdldF9wa2dfaW5mb2AgbWV0aG9kPwogICAgICAgIGZlZWRfcGFyc2VyID0gRmVlZFBhcnNlcigpCiAgICAgICAgZmVlZF9wYXJzZXIuZmVlZChtZXRhZGF0YSkKICAgICAgICBwa2dfaW5mb19kaWN0ID0gZmVlZF9wYXJzZXIuY2xvc2UoKQogICAgICAgIGZvciBrZXkgaW4gKCdtZXRhZGF0YS12ZXJzaW9uJywgJ3N1bW1hcnknLAogICAgICAgICAgICAgICAgICAgICdob21lLXBhZ2UnLCAnYXV0aG9yJywgJ2F1dGhvci1lbWFpbCcsICdsaWNlbnNlJyk6CiAgICAgICAgICAgIHBhY2thZ2Vba2V5XSA9IHBrZ19pbmZvX2RpY3QuZ2V0KGtleSkKCiAgICAgICAgIyBJdCBsb29rcyBsaWtlIEZlZWRQYXJzZXIgY2Fubm90IGRlYWwgd2l0aCByZXBlYXRlZCBoZWFkZXJzCiAgICAgICAgY2xhc3NpZmllcnMgPSBbXQogICAgICAgIGZvciBsaW5lIGluIG1ldGFkYXRhLnNwbGl0bGluZXMoKToKICAgICAgICAgICAgaWYgbGluZS5zdGFydHN3aXRoKCdDbGFzc2lmaWVyOiAnKToKICAgICAgICAgICAgICAgIGNsYXNzaWZpZXJzLmFwcGVuZChsaW5lW2xlbignQ2xhc3NpZmllcjogJyk6XSkKICAgICAgICBwYWNrYWdlWydjbGFzc2lmaWVycyddID0gY2xhc3NpZmllcnMKCiAgICAgICAgaWYgZmlsZV9saXN0OgogICAgICAgICAgICBwYWNrYWdlWydmaWxlcyddID0gc29ydGVkKGZpbGVfbGlzdCkKICAgICAgICB5aWVsZCBwYWNrYWdlCgoKZGVmIHByaW50X3Jlc3VsdHMoZGlzdHJpYnV0aW9ucywgbGlzdF9maWxlcz1GYWxzZSwgdmVyYm9zZT1GYWxzZSk6CiAgICAiIiIKICAgIFByaW50IHRoZSBpbmZvcm1hdGlvbnMgZnJvbSBpbnN0YWxsZWQgZGlzdHJpYnV0aW9ucyBmb3VuZC4KICAgICIiIgogICAgcmVzdWx0c19wcmludGVkID0gRmFsc2UKICAgIGZvciBpLCBkaXN0IGluIGVudW1lcmF0ZShkaXN0cmlidXRpb25zKToKICAgICAgICByZXN1bHRzX3ByaW50ZWQgPSBUcnVlCiAgICAgICAgaWYgaSA+IDA6CiAgICAgICAgICAgIGxvZ2dlci5pbmZvKCItLS0iKQogICAgICAgIGxvZ2dlci5pbmZvKCJOYW1lOiAlcyIsIGRpc3QuZ2V0KCduYW1lJywgJycpKQogICAgICAgIGxvZ2dlci5pbmZvKCJWZXJzaW9uOiAlcyIsIGRpc3QuZ2V0KCd2ZXJzaW9uJywgJycpKQogICAgICAgIGxvZ2dlci5pbmZvKCJTdW1tYXJ5OiAlcyIsIGRpc3QuZ2V0KCdzdW1tYXJ5JywgJycpKQogICAgICAgIGxvZ2dlci5pbmZvKCJIb21lLXBhZ2U6ICVzIiwgZGlzdC5nZXQoJ2hvbWUtcGFnZScsICcnKSkKICAgICAgICBsb2dnZXIuaW5mbygiQXV0aG9yOiAlcyIsIGRpc3QuZ2V0KCdhdXRob3InLCAnJykpCiAgICAgICAgbG9nZ2VyLmluZm8oIkF1dGhvci1lbWFpbDogJXMiLCBkaXN0LmdldCgnYXV0aG9yLWVtYWlsJywgJycpKQogICAgICAgIGxvZ2dlci5pbmZvKCJMaWNlbnNlOiAlcyIsIGRpc3QuZ2V0KCdsaWNlbnNlJywgJycpKQogICAgICAgIGxvZ2dlci5pbmZvKCJMb2NhdGlvbjogJXMiLCBkaXN0LmdldCgnbG9jYXRpb24nLCAnJykpCiAgICAgICAgbG9nZ2VyLmluZm8oIlJlcXVpcmVzOiAlcyIsICcsICcuam9pbihkaXN0LmdldCgncmVxdWlyZXMnLCBbXSkpKQogICAgICAgIGlmIHZlcmJvc2U6CiAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJNZXRhZGF0YS1WZXJzaW9uOiAlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3QuZ2V0KCdtZXRhZGF0YS12ZXJzaW9uJywgJycpKQogICAgICAgICAgICBsb2dnZXIuaW5mbygiSW5zdGFsbGVyOiAlcyIsIGRpc3QuZ2V0KCdpbnN0YWxsZXInLCAnJykpCiAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJDbGFzc2lmaWVyczoiKQogICAgICAgICAgICBmb3IgY2xhc3NpZmllciBpbiBkaXN0LmdldCgnY2xhc3NpZmllcnMnLCBbXSk6CiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygiICAlcyIsIGNsYXNzaWZpZXIpCiAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJFbnRyeS1wb2ludHM6IikKICAgICAgICAgICAgZm9yIGVudHJ5IGluIGRpc3QuZ2V0KCdlbnRyeV9wb2ludHMnLCBbXSk6CiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygiICAlcyIsIGVudHJ5LnN0cmlwKCkpCiAgICAgICAgaWYgbGlzdF9maWxlczoKICAgICAgICAgICAgbG9nZ2VyLmluZm8oIkZpbGVzOiIpCiAgICAgICAgICAgIGZvciBsaW5lIGluIGRpc3QuZ2V0KCdmaWxlcycsIFtdKToKICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCIgICVzIiwgbGluZS5zdHJpcCgpKQogICAgICAgICAgICBpZiAiZmlsZXMiIG5vdCBpbiBkaXN0OgogICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oIkNhbm5vdCBsb2NhdGUgaW5zdGFsbGVkLWZpbGVzLnR4dCIpCiAgICByZXR1cm4gcmVzdWx0c19wcmludGVkClBLAwQUAAAAAAAAACEAq4kZP0QLAABECwAANgAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL2NvbW1hbmRzL3VuaW5zdGFsbC5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgcGlwCmZyb20gcGlwLndoZWVsIGltcG9ydCBXaGVlbENhY2hlCmZyb20gcGlwLnJlcSBpbXBvcnQgSW5zdGFsbFJlcXVpcmVtZW50LCBSZXF1aXJlbWVudFNldCwgcGFyc2VfcmVxdWlyZW1lbnRzCmZyb20gcGlwLmJhc2Vjb21tYW5kIGltcG9ydCBDb21tYW5kCmZyb20gcGlwLmV4Y2VwdGlvbnMgaW1wb3J0IEluc3RhbGxhdGlvbkVycm9yCgoKY2xhc3MgVW5pbnN0YWxsQ29tbWFuZChDb21tYW5kKToKICAgICIiIgogICAgVW5pbnN0YWxsIHBhY2thZ2VzLgoKICAgIHBpcCBpcyBhYmxlIHRvIHVuaW5zdGFsbCBtb3N0IGluc3RhbGxlZCBwYWNrYWdlcy4gS25vd24gZXhjZXB0aW9ucyBhcmU6CgogICAgLSBQdXJlIGRpc3R1dGlscyBwYWNrYWdlcyBpbnN0YWxsZWQgd2l0aCBgYHB5dGhvbiBzZXR1cC5weSBpbnN0YWxsYGAsIHdoaWNoCiAgICAgIGxlYXZlIGJlaGluZCBubyBtZXRhZGF0YSB0byBkZXRlcm1pbmUgd2hhdCBmaWxlcyB3ZXJlIGluc3RhbGxlZC4KICAgIC0gU2NyaXB0IHdyYXBwZXJzIGluc3RhbGxlZCBieSBgYHB5dGhvbiBzZXR1cC5weSBkZXZlbG9wYGAuCiAgICAiIiIKICAgIG5hbWUgPSAndW5pbnN0YWxsJwogICAgdXNhZ2UgPSAiIiIKICAgICAgJXByb2cgW29wdGlvbnNdIDxwYWNrYWdlPiAuLi4KICAgICAgJXByb2cgW29wdGlvbnNdIC1yIDxyZXF1aXJlbWVudHMgZmlsZT4gLi4uIiIiCiAgICBzdW1tYXJ5ID0gJ1VuaW5zdGFsbCBwYWNrYWdlcy4nCgogICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3KToKICAgICAgICBzdXBlcihVbmluc3RhbGxDb21tYW5kLCBzZWxmKS5fX2luaXRfXygqYXJncywgKiprdykKICAgICAgICBzZWxmLmNtZF9vcHRzLmFkZF9vcHRpb24oCiAgICAgICAgICAgICctcicsICctLXJlcXVpcmVtZW50JywKICAgICAgICAgICAgZGVzdD0ncmVxdWlyZW1lbnRzJywKICAgICAgICAgICAgYWN0aW9uPSdhcHBlbmQnLAogICAgICAgICAgICBkZWZhdWx0PVtdLAogICAgICAgICAgICBtZXRhdmFyPSdmaWxlJywKICAgICAgICAgICAgaGVscD0nVW5pbnN0YWxsIGFsbCB0aGUgcGFja2FnZXMgbGlzdGVkIGluIHRoZSBnaXZlbiByZXF1aXJlbWVudHMgJwogICAgICAgICAgICAgICAgICdmaWxlLiAgVGhpcyBvcHRpb24gY2FuIGJlIHVzZWQgbXVsdGlwbGUgdGltZXMuJywKICAgICAgICApCiAgICAgICAgc2VsZi5jbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAnLXknLCAnLS15ZXMnLAogICAgICAgICAgICBkZXN0PSd5ZXMnLAogICAgICAgICAgICBhY3Rpb249J3N0b3JlX3RydWUnLAogICAgICAgICAgICBoZWxwPSJEb24ndCBhc2sgZm9yIGNvbmZpcm1hdGlvbiBvZiB1bmluc3RhbGwgZGVsZXRpb25zLiIpCgogICAgICAgIHNlbGYucGFyc2VyLmluc2VydF9vcHRpb25fZ3JvdXAoMCwgc2VsZi5jbWRfb3B0cykKCiAgICBkZWYgcnVuKHNlbGYsIG9wdGlvbnMsIGFyZ3MpOgogICAgICAgIHdpdGggc2VsZi5fYnVpbGRfc2Vzc2lvbihvcHRpb25zKSBhcyBzZXNzaW9uOgogICAgICAgICAgICBmb3JtYXRfY29udHJvbCA9IHBpcC5pbmRleC5Gb3JtYXRDb250cm9sKHNldCgpLCBzZXQoKSkKICAgICAgICAgICAgd2hlZWxfY2FjaGUgPSBXaGVlbENhY2hlKG9wdGlvbnMuY2FjaGVfZGlyLCBmb3JtYXRfY29udHJvbCkKICAgICAgICAgICAgcmVxdWlyZW1lbnRfc2V0ID0gUmVxdWlyZW1lbnRTZXQoCiAgICAgICAgICAgICAgICBidWlsZF9kaXI9Tm9uZSwKICAgICAgICAgICAgICAgIHNyY19kaXI9Tm9uZSwKICAgICAgICAgICAgICAgIGRvd25sb2FkX2Rpcj1Ob25lLAogICAgICAgICAgICAgICAgaXNvbGF0ZWQ9b3B0aW9ucy5pc29sYXRlZF9tb2RlLAogICAgICAgICAgICAgICAgc2Vzc2lvbj1zZXNzaW9uLAogICAgICAgICAgICAgICAgd2hlZWxfY2FjaGU9d2hlZWxfY2FjaGUsCiAgICAgICAgICAgICkKICAgICAgICAgICAgZm9yIG5hbWUgaW4gYXJnczoKICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50X3NldC5hZGRfcmVxdWlyZW1lbnQoCiAgICAgICAgICAgICAgICAgICAgSW5zdGFsbFJlcXVpcmVtZW50LmZyb21fbGluZSgKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgaXNvbGF0ZWQ9b3B0aW9ucy5pc29sYXRlZF9tb2RlLAogICAgICAgICAgICAgICAgICAgICAgICB3aGVlbF9jYWNoZT13aGVlbF9jYWNoZQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgZm9yIGZpbGVuYW1lIGluIG9wdGlvbnMucmVxdWlyZW1lbnRzOgogICAgICAgICAgICAgICAgZm9yIHJlcSBpbiBwYXJzZV9yZXF1aXJlbWVudHMoCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zPW9wdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb249c2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgd2hlZWxfY2FjaGU9d2hlZWxfY2FjaGUpOgogICAgICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50X3NldC5hZGRfcmVxdWlyZW1lbnQocmVxKQogICAgICAgICAgICBpZiBub3QgcmVxdWlyZW1lbnRfc2V0Lmhhc19yZXF1aXJlbWVudHM6CiAgICAgICAgICAgICAgICByYWlzZSBJbnN0YWxsYXRpb25FcnJvcigKICAgICAgICAgICAgICAgICAgICAnWW91IG11c3QgZ2l2ZSBhdCBsZWFzdCBvbmUgcmVxdWlyZW1lbnQgdG8gJShuYW1lKXMgKHNlZSAnCiAgICAgICAgICAgICAgICAgICAgJyJwaXAgaGVscCAlKG5hbWUpcyIpJyAlIGRpY3QobmFtZT1zZWxmLm5hbWUpCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHJlcXVpcmVtZW50X3NldC51bmluc3RhbGwoYXV0b19jb25maXJtPW9wdGlvbnMueWVzKQpQSwMEFAAAAAAAAAAhAJc3c+YxHgAAMR4AADIAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9jb21tYW5kcy93aGVlbC5weSMgLSotIGNvZGluZzogdXRmLTggLSotCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgbG9nZ2luZwppbXBvcnQgb3MKaW1wb3J0IHdhcm5pbmdzCgpmcm9tIHBpcC5iYXNlY29tbWFuZCBpbXBvcnQgUmVxdWlyZW1lbnRDb21tYW5kCmZyb20gcGlwLmV4Y2VwdGlvbnMgaW1wb3J0IENvbW1hbmRFcnJvciwgUHJldmlvdXNCdWlsZERpckVycm9yCmZyb20gcGlwLnJlcSBpbXBvcnQgUmVxdWlyZW1lbnRTZXQKZnJvbSBwaXAudXRpbHMgaW1wb3J0IGltcG9ydF9vcl9yYWlzZQpmcm9tIHBpcC51dGlscy5idWlsZCBpbXBvcnQgQnVpbGREaXJlY3RvcnkKZnJvbSBwaXAudXRpbHMuZGVwcmVjYXRpb24gaW1wb3J0IFJlbW92ZWRJblBpcDEwV2FybmluZwpmcm9tIHBpcC53aGVlbCBpbXBvcnQgV2hlZWxDYWNoZSwgV2hlZWxCdWlsZGVyCmZyb20gcGlwIGltcG9ydCBjbWRvcHRpb25zCgoKbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgoKY2xhc3MgV2hlZWxDb21tYW5kKFJlcXVpcmVtZW50Q29tbWFuZCk6CiAgICAiIiIKICAgIEJ1aWxkIFdoZWVsIGFyY2hpdmVzIGZvciB5b3VyIHJlcXVpcmVtZW50cyBhbmQgZGVwZW5kZW5jaWVzLgoKICAgIFdoZWVsIGlzIGEgYnVpbHQtcGFja2FnZSBmb3JtYXQsIGFuZCBvZmZlcnMgdGhlIGFkdmFudGFnZSBvZiBub3QKICAgIHJlY29tcGlsaW5nIHlvdXIgc29mdHdhcmUgZHVyaW5nIGV2ZXJ5IGluc3RhbGwuIEZvciBtb3JlIGRldGFpbHMsIHNlZSB0aGUKICAgIHdoZWVsIGRvY3M6IGh0dHBzOi8vd2hlZWwucmVhZHRoZWRvY3MuaW8vZW4vbGF0ZXN0LwoKICAgIFJlcXVpcmVtZW50czogc2V0dXB0b29scz49MC44LCBhbmQgd2hlZWwuCgogICAgJ3BpcCB3aGVlbCcgdXNlcyB0aGUgYmRpc3Rfd2hlZWwgc2V0dXB0b29scyBleHRlbnNpb24gZnJvbSB0aGUgd2hlZWwKICAgIHBhY2thZ2UgdG8gYnVpbGQgaW5kaXZpZHVhbCB3aGVlbHMuCgogICAgIiIiCgogICAgbmFtZSA9ICd3aGVlbCcKICAgIHVzYWdlID0gIiIiCiAgICAgICVwcm9nIFtvcHRpb25zXSA8cmVxdWlyZW1lbnQgc3BlY2lmaWVyPiAuLi4KICAgICAgJXByb2cgW29wdGlvbnNdIC1yIDxyZXF1aXJlbWVudHMgZmlsZT4gLi4uCiAgICAgICVwcm9nIFtvcHRpb25zXSBbLWVdIDx2Y3MgcHJvamVjdCB1cmw+IC4uLgogICAgICAlcHJvZyBbb3B0aW9uc10gWy1lXSA8bG9jYWwgcHJvamVjdCBwYXRoPiAuLi4KICAgICAgJXByb2cgW29wdGlvbnNdIDxhcmNoaXZlIHVybC9wYXRoPiAuLi4iIiIKCiAgICBzdW1tYXJ5ID0gJ0J1aWxkIHdoZWVscyBmcm9tIHlvdXIgcmVxdWlyZW1lbnRzLicKCiAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3cpOgogICAgICAgIHN1cGVyKFdoZWVsQ29tbWFuZCwgc2VsZikuX19pbml0X18oKmFyZ3MsICoqa3cpCgogICAgICAgIGNtZF9vcHRzID0gc2VsZi5jbWRfb3B0cwoKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAnLXcnLCAnLS13aGVlbC1kaXInLAogICAgICAgICAgICBkZXN0PSd3aGVlbF9kaXInLAogICAgICAgICAgICBtZXRhdmFyPSdkaXInLAogICAgICAgICAgICBkZWZhdWx0PW9zLmN1cmRpciwKICAgICAgICAgICAgaGVscD0oIkJ1aWxkIHdoZWVscyBpbnRvIDxkaXI+LCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgIgogICAgICAgICAgICAgICAgICAiY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4iKSwKICAgICAgICApCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbihjbWRvcHRpb25zLnVzZV93aGVlbCgpKQogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy5ub191c2Vfd2hlZWwoKSkKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKGNtZG9wdGlvbnMubm9fYmluYXJ5KCkpCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbihjbWRvcHRpb25zLm9ubHlfYmluYXJ5KCkpCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgJy0tYnVpbGQtb3B0aW9uJywKICAgICAgICAgICAgZGVzdD0nYnVpbGRfb3B0aW9ucycsCiAgICAgICAgICAgIG1ldGF2YXI9J29wdGlvbnMnLAogICAgICAgICAgICBhY3Rpb249J2FwcGVuZCcsCiAgICAgICAgICAgIGhlbHA9IkV4dHJhIGFyZ3VtZW50cyB0byBiZSBzdXBwbGllZCB0byAnc2V0dXAucHkgYmRpc3Rfd2hlZWwnLiIpCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbihjbWRvcHRpb25zLmNvbnN0cmFpbnRzKCkpCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbihjbWRvcHRpb25zLmVkaXRhYmxlKCkpCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbihjbWRvcHRpb25zLnJlcXVpcmVtZW50cygpKQogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy5zcmMoKSkKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKGNtZG9wdGlvbnMuaWdub3JlX3JlcXVpcmVzX3B5dGhvbigpKQogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy5ub19kZXBzKCkpCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbihjbWRvcHRpb25zLmJ1aWxkX2RpcigpKQoKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAnLS1nbG9iYWwtb3B0aW9uJywKICAgICAgICAgICAgZGVzdD0nZ2xvYmFsX29wdGlvbnMnLAogICAgICAgICAgICBhY3Rpb249J2FwcGVuZCcsCiAgICAgICAgICAgIG1ldGF2YXI9J29wdGlvbnMnLAogICAgICAgICAgICBoZWxwPSJFeHRyYSBnbG9iYWwgb3B0aW9ucyB0byBiZSBzdXBwbGllZCB0byB0aGUgc2V0dXAucHkgIgogICAgICAgICAgICAiY2FsbCBiZWZvcmUgdGhlICdiZGlzdF93aGVlbCcgY29tbWFuZC4iKQoKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAnLS1wcmUnLAogICAgICAgICAgICBhY3Rpb249J3N0b3JlX3RydWUnLAogICAgICAgICAgICBkZWZhdWx0PUZhbHNlLAogICAgICAgICAgICBoZWxwPSgiSW5jbHVkZSBwcmUtcmVsZWFzZSBhbmQgZGV2ZWxvcG1lbnQgdmVyc2lvbnMuIEJ5IGRlZmF1bHQsICIKICAgICAgICAgICAgICAgICAgInBpcCBvbmx5IGZpbmRzIHN0YWJsZSB2ZXJzaW9ucy4iKSwKICAgICAgICApCgogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy5ub19jbGVhbigpKQogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy5yZXF1aXJlX2hhc2hlcygpKQoKICAgICAgICBpbmRleF9vcHRzID0gY21kb3B0aW9ucy5tYWtlX29wdGlvbl9ncm91cCgKICAgICAgICAgICAgY21kb3B0aW9ucy5pbmRleF9ncm91cCwKICAgICAgICAgICAgc2VsZi5wYXJzZXIsCiAgICAgICAgKQoKICAgICAgICBzZWxmLnBhcnNlci5pbnNlcnRfb3B0aW9uX2dyb3VwKDAsIGluZGV4X29wdHMpCiAgICAgICAgc2VsZi5wYXJzZXIuaW5zZXJ0X29wdGlvbl9ncm91cCgwLCBjbWRfb3B0cykKCiAgICBkZWYgY2hlY2tfcmVxdWlyZWRfcGFja2FnZXMoc2VsZik6CiAgICAgICAgaW1wb3J0X29yX3JhaXNlKAogICAgICAgICAgICAnd2hlZWwuYmRpc3Rfd2hlZWwnLAogICAgICAgICAgICBDb21tYW5kRXJyb3IsCiAgICAgICAgICAgICIncGlwIHdoZWVsJyByZXF1aXJlcyB0aGUgJ3doZWVsJyBwYWNrYWdlLiBUbyBmaXggdGhpcywgcnVuOiAiCiAgICAgICAgICAgICJwaXAgaW5zdGFsbCB3aGVlbCIKICAgICAgICApCiAgICAgICAgcGtnX3Jlc291cmNlcyA9IGltcG9ydF9vcl9yYWlzZSgKICAgICAgICAgICAgJ3BrZ19yZXNvdXJjZXMnLAogICAgICAgICAgICBDb21tYW5kRXJyb3IsCiAgICAgICAgICAgICIncGlwIHdoZWVsJyByZXF1aXJlcyBzZXR1cHRvb2xzID49IDAuOCBmb3IgZGlzdC1pbmZvIHN1cHBvcnQuIgogICAgICAgICAgICAiIFRvIGZpeCB0aGlzLCBydW46IHBpcCBpbnN0YWxsIC0tdXBncmFkZSBzZXR1cHRvb2xzIgogICAgICAgICkKICAgICAgICBpZiBub3QgaGFzYXR0cihwa2dfcmVzb3VyY2VzLCAnRGlzdEluZm9EaXN0cmlidXRpb24nKToKICAgICAgICAgICAgcmFpc2UgQ29tbWFuZEVycm9yKAogICAgICAgICAgICAgICAgIidwaXAgd2hlZWwnIHJlcXVpcmVzIHNldHVwdG9vbHMgPj0gMC44IGZvciBkaXN0LWluZm8gIgogICAgICAgICAgICAgICAgInN1cHBvcnQuIFRvIGZpeCB0aGlzLCBydW46IHBpcCBpbnN0YWxsIC0tdXBncmFkZSAiCiAgICAgICAgICAgICAgICAic2V0dXB0b29scyIKICAgICAgICAgICAgKQoKICAgIGRlZiBydW4oc2VsZiwgb3B0aW9ucywgYXJncyk6CiAgICAgICAgc2VsZi5jaGVja19yZXF1aXJlZF9wYWNrYWdlcygpCiAgICAgICAgY21kb3B0aW9ucy5yZXNvbHZlX3doZWVsX25vX3VzZV9iaW5hcnkob3B0aW9ucykKICAgICAgICBjbWRvcHRpb25zLmNoZWNrX2luc3RhbGxfYnVpbGRfZ2xvYmFsKG9wdGlvbnMpCgogICAgICAgIGlmIG9wdGlvbnMuYWxsb3dfZXh0ZXJuYWw6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCiAgICAgICAgICAgICAgICAiLS1hbGxvdy1leHRlcm5hbCBoYXMgYmVlbiBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gIgogICAgICAgICAgICAgICAgInRoZSBmdXR1cmUuIER1ZSB0byBjaGFuZ2VzIGluIHRoZSByZXBvc2l0b3J5IHByb3RvY29sLCBpdCBubyAiCiAgICAgICAgICAgICAgICAibG9uZ2VyIGhhcyBhbnkgZWZmZWN0LiIsCiAgICAgICAgICAgICAgICBSZW1vdmVkSW5QaXAxMFdhcm5pbmcsCiAgICAgICAgICAgICkKCiAgICAgICAgaWYgb3B0aW9ucy5hbGxvd19hbGxfZXh0ZXJuYWw6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCiAgICAgICAgICAgICAgICAiLS1hbGxvdy1hbGwtZXh0ZXJuYWwgaGFzIGJlZW4gZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkICIKICAgICAgICAgICAgICAgICJpbiB0aGUgZnV0dXJlLiBEdWUgdG8gY2hhbmdlcyBpbiB0aGUgcmVwb3NpdG9yeSBwcm90b2NvbCwgaXQgIgogICAgICAgICAgICAgICAgIm5vIGxvbmdlciBoYXMgYW55IGVmZmVjdC4iLAogICAgICAgICAgICAgICAgUmVtb3ZlZEluUGlwMTBXYXJuaW5nLAogICAgICAgICAgICApCgogICAgICAgIGlmIG9wdGlvbnMuYWxsb3dfdW52ZXJpZmllZDoKICAgICAgICAgICAgd2FybmluZ3Mud2FybigKICAgICAgICAgICAgICAgICItLWFsbG93LXVudmVyaWZpZWQgaGFzIGJlZW4gZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkICIKICAgICAgICAgICAgICAgICJpbiB0aGUgZnV0dXJlLiBEdWUgdG8gY2hhbmdlcyBpbiB0aGUgcmVwb3NpdG9yeSBwcm90b2NvbCwgaXQgIgogICAgICAgICAgICAgICAgIm5vIGxvbmdlciBoYXMgYW55IGVmZmVjdC4iLAogICAgICAgICAgICAgICAgUmVtb3ZlZEluUGlwMTBXYXJuaW5nLAogICAgICAgICAgICApCgogICAgICAgIGluZGV4X3VybHMgPSBbb3B0aW9ucy5pbmRleF91cmxdICsgb3B0aW9ucy5leHRyYV9pbmRleF91cmxzCiAgICAgICAgaWYgb3B0aW9ucy5ub19pbmRleDoKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdJZ25vcmluZyBpbmRleGVzOiAlcycsICcsJy5qb2luKGluZGV4X3VybHMpKQogICAgICAgICAgICBpbmRleF91cmxzID0gW10KCiAgICAgICAgaWYgb3B0aW9ucy5idWlsZF9kaXI6CiAgICAgICAgICAgIG9wdGlvbnMuYnVpbGRfZGlyID0gb3MucGF0aC5hYnNwYXRoKG9wdGlvbnMuYnVpbGRfZGlyKQoKICAgICAgICBvcHRpb25zLnNyY19kaXIgPSBvcy5wYXRoLmFic3BhdGgob3B0aW9ucy5zcmNfZGlyKQoKICAgICAgICB3aXRoIHNlbGYuX2J1aWxkX3Nlc3Npb24ob3B0aW9ucykgYXMgc2Vzc2lvbjoKICAgICAgICAgICAgZmluZGVyID0gc2VsZi5fYnVpbGRfcGFja2FnZV9maW5kZXIob3B0aW9ucywgc2Vzc2lvbikKICAgICAgICAgICAgYnVpbGRfZGVsZXRlID0gKG5vdCAob3B0aW9ucy5ub19jbGVhbiBvciBvcHRpb25zLmJ1aWxkX2RpcikpCiAgICAgICAgICAgIHdoZWVsX2NhY2hlID0gV2hlZWxDYWNoZShvcHRpb25zLmNhY2hlX2Rpciwgb3B0aW9ucy5mb3JtYXRfY29udHJvbCkKICAgICAgICAgICAgd2l0aCBCdWlsZERpcmVjdG9yeShvcHRpb25zLmJ1aWxkX2RpciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGU9YnVpbGRfZGVsZXRlKSBhcyBidWlsZF9kaXI6CiAgICAgICAgICAgICAgICByZXF1aXJlbWVudF9zZXQgPSBSZXF1aXJlbWVudFNldCgKICAgICAgICAgICAgICAgICAgICBidWlsZF9kaXI9YnVpbGRfZGlyLAogICAgICAgICAgICAgICAgICAgIHNyY19kaXI9b3B0aW9ucy5zcmNfZGlyLAogICAgICAgICAgICAgICAgICAgIGRvd25sb2FkX2Rpcj1Ob25lLAogICAgICAgICAgICAgICAgICAgIGlnbm9yZV9kZXBlbmRlbmNpZXM9b3B0aW9ucy5pZ25vcmVfZGVwZW5kZW5jaWVzLAogICAgICAgICAgICAgICAgICAgIGlnbm9yZV9pbnN0YWxsZWQ9VHJ1ZSwKICAgICAgICAgICAgICAgICAgICBpZ25vcmVfcmVxdWlyZXNfcHl0aG9uPW9wdGlvbnMuaWdub3JlX3JlcXVpcmVzX3B5dGhvbiwKICAgICAgICAgICAgICAgICAgICBpc29sYXRlZD1vcHRpb25zLmlzb2xhdGVkX21vZGUsCiAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbj1zZXNzaW9uLAogICAgICAgICAgICAgICAgICAgIHdoZWVsX2NhY2hlPXdoZWVsX2NhY2hlLAogICAgICAgICAgICAgICAgICAgIHdoZWVsX2Rvd25sb2FkX2Rpcj1vcHRpb25zLndoZWVsX2RpciwKICAgICAgICAgICAgICAgICAgICByZXF1aXJlX2hhc2hlcz1vcHRpb25zLnJlcXVpcmVfaGFzaGVzCiAgICAgICAgICAgICAgICApCgogICAgICAgICAgICAgICAgc2VsZi5wb3B1bGF0ZV9yZXF1aXJlbWVudF9zZXQoCiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZW1lbnRfc2V0LCBhcmdzLCBvcHRpb25zLCBmaW5kZXIsIHNlc3Npb24sIHNlbGYubmFtZSwKICAgICAgICAgICAgICAgICAgICB3aGVlbF9jYWNoZQogICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgICAgIGlmIG5vdCByZXF1aXJlbWVudF9zZXQuaGFzX3JlcXVpcmVtZW50czoKICAgICAgICAgICAgICAgICAgICByZXR1cm4KCiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgIyBidWlsZCB3aGVlbHMKICAgICAgICAgICAgICAgICAgICB3YiA9IFdoZWVsQnVpbGRlcigKICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZW1lbnRfc2V0LAogICAgICAgICAgICAgICAgICAgICAgICBmaW5kZXIsCiAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkX29wdGlvbnM9b3B0aW9ucy5idWlsZF9vcHRpb25zIG9yIFtdLAogICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxfb3B0aW9ucz1vcHRpb25zLmdsb2JhbF9vcHRpb25zIG9yIFtdLAogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICBpZiBub3Qgd2IuYnVpbGQoKToKICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgQ29tbWFuZEVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBidWlsZCBvbmUgb3IgbW9yZSB3aGVlbHMiCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGV4Y2VwdCBQcmV2aW91c0J1aWxkRGlyRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5ub19jbGVhbiA9IFRydWUKICAgICAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgICAgICAgICBpZiBub3Qgb3B0aW9ucy5ub19jbGVhbjoKICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZW1lbnRfc2V0LmNsZWFudXBfZmlsZXMoKQpQSwMEFAAAAAAAAAAhAJknqXFAEgAAQBIAADMAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9jb21wYXQvX19pbml0X18ucHkiIiJTdHVmZiB0aGF0IGRpZmZlcnMgaW4gZGlmZmVyZW50IFB5dGhvbiB2ZXJzaW9ucyBhbmQgcGxhdGZvcm0KZGlzdHJpYnV0aW9ucy4iIiIKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uCgppbXBvcnQgb3MKaW1wb3J0IHN5cwoKZnJvbSBwaXAuX3ZlbmRvci5zaXggaW1wb3J0IHRleHRfdHlwZQoKdHJ5OgogICAgZnJvbSBsb2dnaW5nLmNvbmZpZyBpbXBvcnQgZGljdENvbmZpZyBhcyBsb2dnaW5nX2RpY3RDb25maWcKZXhjZXB0IEltcG9ydEVycm9yOgogICAgZnJvbSBwaXAuY29tcGF0LmRpY3Rjb25maWcgaW1wb3J0IGRpY3RDb25maWcgYXMgbG9nZ2luZ19kaWN0Q29uZmlnCgp0cnk6CiAgICBmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBPcmRlcmVkRGljdApleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBmcm9tIHBpcC5fdmVuZG9yLm9yZGVyZWRkaWN0IGltcG9ydCBPcmRlcmVkRGljdAoKdHJ5OgogICAgaW1wb3J0IGlwYWRkcmVzcwpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICB0cnk6CiAgICAgICAgZnJvbSBwaXAuX3ZlbmRvciBpbXBvcnQgaXBhZGRyZXNzCiAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgaW1wb3J0IGlwYWRkciBhcyBpcGFkZHJlc3MKICAgICAgICBpcGFkZHJlc3MuaXBfYWRkcmVzcyA9IGlwYWRkcmVzcy5JUEFkZHJlc3MKICAgICAgICBpcGFkZHJlc3MuaXBfbmV0d29yayA9IGlwYWRkcmVzcy5JUE5ldHdvcmsKCgp0cnk6CiAgICBpbXBvcnQgc3lzY29uZmlnCgogICAgZGVmIGdldF9zdGRsaWIoKToKICAgICAgICBwYXRocyA9IFsKICAgICAgICAgICAgc3lzY29uZmlnLmdldF9wYXRoKCJzdGRsaWIiKSwKICAgICAgICAgICAgc3lzY29uZmlnLmdldF9wYXRoKCJwbGF0c3RkbGliIiksCiAgICAgICAgXQogICAgICAgIHJldHVybiBzZXQoZmlsdGVyKGJvb2wsIHBhdGhzKSkKZXhjZXB0IEltcG9ydEVycm9yOgogICAgZnJvbSBkaXN0dXRpbHMgaW1wb3J0IHN5c2NvbmZpZwoKICAgIGRlZiBnZXRfc3RkbGliKCk6CiAgICAgICAgcGF0aHMgPSBbCiAgICAgICAgICAgIHN5c2NvbmZpZy5nZXRfcHl0aG9uX2xpYihzdGFuZGFyZF9saWI9VHJ1ZSksCiAgICAgICAgICAgIHN5c2NvbmZpZy5nZXRfcHl0aG9uX2xpYihzdGFuZGFyZF9saWI9VHJ1ZSwgcGxhdF9zcGVjaWZpYz1UcnVlKSwKICAgICAgICBdCiAgICAgICAgcmV0dXJuIHNldChmaWx0ZXIoYm9vbCwgcGF0aHMpKQoKCl9fYWxsX18gPSBbCiAgICAibG9nZ2luZ19kaWN0Q29uZmlnIiwgImlwYWRkcmVzcyIsICJ1c2VzX3B5Y2FjaGUiLCAiY29uc29sZV90b19zdHIiLAogICAgIm5hdGl2ZV9zdHIiLCAiZ2V0X3BhdGhfdWlkIiwgInN0ZGxpYl9wa2dzIiwgIldJTkRPV1MiLCAic2FtZWZpbGUiLAogICAgIk9yZGVyZWREaWN0IiwKXQoKCmlmIHN5cy52ZXJzaW9uX2luZm8gPj0gKDMsIDQpOgogICAgdXNlc19weWNhY2hlID0gVHJ1ZQogICAgZnJvbSBpbXBvcnRsaWIudXRpbCBpbXBvcnQgY2FjaGVfZnJvbV9zb3VyY2UKZWxzZToKICAgIGltcG9ydCBpbXAKICAgIHVzZXNfcHljYWNoZSA9IGhhc2F0dHIoaW1wLCAnY2FjaGVfZnJvbV9zb3VyY2UnKQogICAgaWYgdXNlc19weWNhY2hlOgogICAgICAgIGNhY2hlX2Zyb21fc291cmNlID0gaW1wLmNhY2hlX2Zyb21fc291cmNlCiAgICBlbHNlOgogICAgICAgIGNhY2hlX2Zyb21fc291cmNlID0gTm9uZQoKCmlmIHN5cy52ZXJzaW9uX2luZm8gPj0gKDMsKToKICAgIGRlZiBjb25zb2xlX3RvX3N0cihzKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzLmRlY29kZShzeXMuX19zdGRvdXRfXy5lbmNvZGluZykKICAgICAgICBleGNlcHQgVW5pY29kZURlY29kZUVycm9yOgogICAgICAgICAgICByZXR1cm4gcy5kZWNvZGUoJ3V0Zl84JykKCiAgICBkZWYgbmF0aXZlX3N0cihzLCByZXBsYWNlPUZhbHNlKToKICAgICAgICBpZiBpc2luc3RhbmNlKHMsIGJ5dGVzKToKICAgICAgICAgICAgcmV0dXJuIHMuZGVjb2RlKCd1dGYtOCcsICdyZXBsYWNlJyBpZiByZXBsYWNlIGVsc2UgJ3N0cmljdCcpCiAgICAgICAgcmV0dXJuIHMKCmVsc2U6CiAgICBkZWYgY29uc29sZV90b19zdHIocyk6CiAgICAgICAgcmV0dXJuIHMKCiAgICBkZWYgbmF0aXZlX3N0cihzLCByZXBsYWNlPUZhbHNlKToKICAgICAgICAjIFJlcGxhY2UgaXMgaWdub3JlZCAtLSB1bmljb2RlIHRvIFVURi04IGNhbid0IGZhaWwKICAgICAgICBpZiBpc2luc3RhbmNlKHMsIHRleHRfdHlwZSk6CiAgICAgICAgICAgIHJldHVybiBzLmVuY29kZSgndXRmLTgnKQogICAgICAgIHJldHVybiBzCgoKZGVmIHRvdGFsX3NlY29uZHModGQpOgogICAgaWYgaGFzYXR0cih0ZCwgInRvdGFsX3NlY29uZHMiKToKICAgICAgICByZXR1cm4gdGQudG90YWxfc2Vjb25kcygpCiAgICBlbHNlOgogICAgICAgIHZhbCA9IHRkLm1pY3Jvc2Vjb25kcyArICh0ZC5zZWNvbmRzICsgdGQuZGF5cyAqIDI0ICogMzYwMCkgKiAxMCAqKiA2CiAgICAgICAgcmV0dXJuIHZhbCAvIDEwICoqIDYKCgpkZWYgZ2V0X3BhdGhfdWlkKHBhdGgpOgogICAgIiIiCiAgICBSZXR1cm4gcGF0aCdzIHVpZC4KCiAgICBEb2VzIG5vdCBmb2xsb3cgc3ltbGlua3M6CiAgICAgICAgaHR0cHM6Ly9naXRodWIuY29tL3B5cGEvcGlwL3B1bGwvOTM1I2Rpc2N1c3Npb25fcjUzMDcwMDMKCiAgICBQbGFjZWQgdGhpcyBmdW5jdGlvbiBpbiBjb21wYXQgZHVlIHRvIGRpZmZlcmVuY2VzIG9uIEFJWCBhbmQKICAgIEp5dGhvbiwgdGhhdCBzaG91bGQgZXZlbnR1YWxseSBnbyBhd2F5LgoKICAgIDpyYWlzZXMgT1NFcnJvcjogV2hlbiBwYXRoIGlzIGEgc3ltbGluayBvciBjYW4ndCBiZSByZWFkLgogICAgIiIiCiAgICBpZiBoYXNhdHRyKG9zLCAnT19OT0ZPTExPVycpOgogICAgICAgIGZkID0gb3Mub3BlbihwYXRoLCBvcy5PX1JET05MWSB8IG9zLk9fTk9GT0xMT1cpCiAgICAgICAgZmlsZV91aWQgPSBvcy5mc3RhdChmZCkuc3RfdWlkCiAgICAgICAgb3MuY2xvc2UoZmQpCiAgICBlbHNlOiAgIyBBSVggYW5kIEp5dGhvbgogICAgICAgICMgV0FSTklORzogdGltZSBvZiBjaGVjayB2dWxuZXJhYmlsaXR5LCBidXQgYmVzdCB3ZSBjYW4gZG8gdy9vIE5PRk9MTE9XCiAgICAgICAgaWYgbm90IG9zLnBhdGguaXNsaW5rKHBhdGgpOgogICAgICAgICAgICAjIG9sZGVyIHZlcnNpb25zIG9mIEp5dGhvbiBkb24ndCBoYXZlIGBvcy5mc3RhdGAKICAgICAgICAgICAgZmlsZV91aWQgPSBvcy5zdGF0KHBhdGgpLnN0X3VpZAogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgcmFpc2UgT1NFcnJvciBmb3IgcGFyaXR5IHdpdGggb3MuT19OT0ZPTExPVyBhYm92ZQogICAgICAgICAgICByYWlzZSBPU0Vycm9yKAogICAgICAgICAgICAgICAgIiVzIGlzIGEgc3ltbGluazsgV2lsbCBub3QgcmV0dXJuIHVpZCBmb3Igc3ltbGlua3MiICUgcGF0aAogICAgICAgICAgICApCiAgICByZXR1cm4gZmlsZV91aWQKCgpkZWYgZXhwYW5kdXNlcihwYXRoKToKICAgICIiIgogICAgRXhwYW5kIH4gYW5kIH51c2VyIGNvbnN0cnVjdGlvbnMuCgogICAgSW5jbHVkZXMgYSB3b3JrYXJvdW5kIGZvciBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMTQ3NjgKICAgICIiIgogICAgZXhwYW5kZWQgPSBvcy5wYXRoLmV4cGFuZHVzZXIocGF0aCkKICAgIGlmIHBhdGguc3RhcnRzd2l0aCgnfi8nKSBhbmQgZXhwYW5kZWQuc3RhcnRzd2l0aCgnLy8nKToKICAgICAgICBleHBhbmRlZCA9IGV4cGFuZGVkWzE6XQogICAgcmV0dXJuIGV4cGFuZGVkCgoKIyBwYWNrYWdlcyBpbiB0aGUgc3RkbGliIHRoYXQgbWF5IGhhdmUgaW5zdGFsbGF0aW9uIG1ldGFkYXRhLCBidXQgc2hvdWxkIG5vdCBiZQojIGNvbnNpZGVyZWQgJ2luc3RhbGxlZCcuICB0aGlzIHRoZW9yZXRpY2FsbHkgY291bGQgYmUgZGV0ZXJtaW5lZCBiYXNlZCBvbgojIGRpc3QubG9jYXRpb24gKHB5Mjc6YHN5c2NvbmZpZy5nZXRfcGF0aHMoKVsnc3RkbGliJ11gLAojIHB5MjY6c3lzY29uZmlnLmdldF9jb25maWdfdmFycygnTElCREVTVCcpKSwgYnV0IGZlYXIgcGxhdGZvcm0gdmFyaWF0aW9uIG1heQojIG1ha2UgdGhpcyBpbmVmZmVjdGl2ZSwgc28gaGFyZC1jb2RpbmcKc3RkbGliX3BrZ3MgPSAoJ3B5dGhvbicsICd3c2dpcmVmJykKaWYgc3lzLnZlcnNpb25faW5mbyA+PSAoMiwgNyk6CiAgICBzdGRsaWJfcGtncyArPSAoJ2FyZ3BhcnNlJywpCgoKIyB3aW5kb3dzIGRldGVjdGlvbiwgY292ZXJzIGNweXRob24gYW5kIGlyb25weXRob24KV0lORE9XUyA9IChzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgid2luIikgb3IKICAgICAgICAgICAoc3lzLnBsYXRmb3JtID09ICdjbGknIGFuZCBvcy5uYW1lID09ICdudCcpKQoKCmRlZiBzYW1lZmlsZShmaWxlMSwgZmlsZTIpOgogICAgIiIiUHJvdmlkZSBhbiBhbHRlcm5hdGl2ZSBmb3Igb3MucGF0aC5zYW1lZmlsZSBvbiBXaW5kb3dzL1B5dGhvbjIiIiIKICAgIGlmIGhhc2F0dHIob3MucGF0aCwgJ3NhbWVmaWxlJyk6CiAgICAgICAgcmV0dXJuIG9zLnBhdGguc2FtZWZpbGUoZmlsZTEsIGZpbGUyKQogICAgZWxzZToKICAgICAgICBwYXRoMSA9IG9zLnBhdGgubm9ybWNhc2Uob3MucGF0aC5hYnNwYXRoKGZpbGUxKSkKICAgICAgICBwYXRoMiA9IG9zLnBhdGgubm9ybWNhc2Uob3MucGF0aC5hYnNwYXRoKGZpbGUyKSkKICAgICAgICByZXR1cm4gcGF0aDEgPT0gcGF0aDIKUEsDBBQAAAAAAAAAIQCCoqWXOFoAADhaAAA1AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvY29tcGF0L2RpY3Rjb25maWcucHkjIFRoaXMgaXMgYSBjb3B5IG9mIHRoZSBQeXRob24gbG9nZ2luZy5jb25maWcuZGljdGNvbmZpZyBtb2R1bGUsCiMgcmVwcm9kdWNlZCB3aXRoIHBlcm1pc3Npb24uIEl0IGlzIHByb3ZpZGVkIGhlcmUgZm9yIGJhY2t3YXJkcwojIGNvbXBhdGliaWxpdHkgZm9yIFB5dGhvbiB2ZXJzaW9ucyBwcmlvciB0byAyLjcuCiMKIyBDb3B5cmlnaHQgMjAwOS0yMDEwIGJ5IFZpbmF5IFNhamlwLiBBbGwgUmlnaHRzIFJlc2VydmVkLgojCiMgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCiMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLAojIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKIyBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KIyBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIFZpbmF5IFNhamlwCiMgbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uCiMgb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4KIyBWSU5BWSBTQUpJUCBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HCiMgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMCiMgVklOQVkgU0FKSVAgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SCiMgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSCiMgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQKIyBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IGxvZ2dpbmcuaGFuZGxlcnMKaW1wb3J0IHJlCmltcG9ydCBzeXMKaW1wb3J0IHR5cGVzCgpmcm9tIHBpcC5fdmVuZG9yIGltcG9ydCBzaXgKCiMgZmxha2U4OiBub3FhCgpJREVOVElGSUVSID0gcmUuY29tcGlsZSgnXlthLXpfXVthLXowLTlfXSokJywgcmUuSSkKCgpkZWYgdmFsaWRfaWRlbnQocyk6CiAgICBtID0gSURFTlRJRklFUi5tYXRjaChzKQogICAgaWYgbm90IG06CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignTm90IGEgdmFsaWQgUHl0aG9uIGlkZW50aWZpZXI6ICVyJyAlIHMpCiAgICByZXR1cm4gVHJ1ZQoKIwojIFRoaXMgZnVuY3Rpb24gaXMgZGVmaW5lZCBpbiBsb2dnaW5nIG9ubHkgaW4gcmVjZW50IHZlcnNpb25zIG9mIFB5dGhvbgojCnRyeToKICAgIGZyb20gbG9nZ2luZyBpbXBvcnQgX2NoZWNrTGV2ZWwKZXhjZXB0IEltcG9ydEVycm9yOgogICAgZGVmIF9jaGVja0xldmVsKGxldmVsKToKICAgICAgICBpZiBpc2luc3RhbmNlKGxldmVsLCBpbnQpOgogICAgICAgICAgICBydiA9IGxldmVsCiAgICAgICAgZWxpZiBzdHIobGV2ZWwpID09IGxldmVsOgogICAgICAgICAgICBpZiBsZXZlbCBub3QgaW4gbG9nZ2luZy5fbGV2ZWxOYW1lczoKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1Vua25vd24gbGV2ZWw6ICVyJyAlIGxldmVsKQogICAgICAgICAgICBydiA9IGxvZ2dpbmcuX2xldmVsTmFtZXNbbGV2ZWxdCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdMZXZlbCBub3QgYW4gaW50ZWdlciBvciBhICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWxpZCBzdHJpbmc6ICVyJyAlIGxldmVsKQogICAgICAgIHJldHVybiBydgoKIyBUaGUgQ29udmVydGluZ1hYWCBjbGFzc2VzIGFyZSB3cmFwcGVycyBhcm91bmQgc3RhbmRhcmQgUHl0aG9uIGNvbnRhaW5lcnMsCiMgYW5kIHRoZXkgc2VydmUgdG8gY29udmVydCBhbnkgc3VpdGFibGUgdmFsdWVzIGluIHRoZSBjb250YWluZXIuIFRoZQojIGNvbnZlcnNpb24gY29udmVydHMgYmFzZSBkaWN0cywgbGlzdHMgYW5kIHR1cGxlcyB0byB0aGVpciB3cmFwcGVkCiMgZXF1aXZhbGVudHMsIHdoZXJlYXMgc3RyaW5ncyB3aGljaCBtYXRjaCBhIGNvbnZlcnNpb24gZm9ybWF0IGFyZSBjb252ZXJ0ZWQKIyBhcHByb3ByaWF0ZWx5LgojCiMgRWFjaCB3cmFwcGVyIHNob3VsZCBoYXZlIGEgY29uZmlndXJhdG9yIGF0dHJpYnV0ZSBob2xkaW5nIHRoZSBhY3R1YWwKIyBjb25maWd1cmF0b3IgdG8gdXNlIGZvciBjb252ZXJzaW9uLgoKCmNsYXNzIENvbnZlcnRpbmdEaWN0KGRpY3QpOgogICAgIiIiQSBjb252ZXJ0aW5nIGRpY3Rpb25hcnkgd3JhcHBlci4iIiIKCiAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKICAgICAgICB2YWx1ZSA9IGRpY3QuX19nZXRpdGVtX18oc2VsZiwga2V5KQogICAgICAgIHJlc3VsdCA9IHNlbGYuY29uZmlndXJhdG9yLmNvbnZlcnQodmFsdWUpCiAgICAgICAgIyBJZiB0aGUgY29udmVydGVkIHZhbHVlIGlzIGRpZmZlcmVudCwgc2F2ZSBmb3IgbmV4dCB0aW1lCiAgICAgICAgaWYgdmFsdWUgaXMgbm90IHJlc3VsdDoKICAgICAgICAgICAgc2VsZltrZXldID0gcmVzdWx0CiAgICAgICAgICAgIGlmIHR5cGUocmVzdWx0KSBpbiAoQ29udmVydGluZ0RpY3QsIENvbnZlcnRpbmdMaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnZlcnRpbmdUdXBsZSk6CiAgICAgICAgICAgICAgICByZXN1bHQucGFyZW50ID0gc2VsZgogICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IGtleQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgZ2V0KHNlbGYsIGtleSwgZGVmYXVsdD1Ob25lKToKICAgICAgICB2YWx1ZSA9IGRpY3QuZ2V0KHNlbGYsIGtleSwgZGVmYXVsdCkKICAgICAgICByZXN1bHQgPSBzZWxmLmNvbmZpZ3VyYXRvci5jb252ZXJ0KHZhbHVlKQogICAgICAgICMgSWYgdGhlIGNvbnZlcnRlZCB2YWx1ZSBpcyBkaWZmZXJlbnQsIHNhdmUgZm9yIG5leHQgdGltZQogICAgICAgIGlmIHZhbHVlIGlzIG5vdCByZXN1bHQ6CiAgICAgICAgICAgIHNlbGZba2V5XSA9IHJlc3VsdAogICAgICAgICAgICBpZiB0eXBlKHJlc3VsdCkgaW4gKENvbnZlcnRpbmdEaWN0LCBDb252ZXJ0aW5nTGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb252ZXJ0aW5nVHVwbGUpOgogICAgICAgICAgICAgICAgcmVzdWx0LnBhcmVudCA9IHNlbGYKICAgICAgICAgICAgICAgIHJlc3VsdC5rZXkgPSBrZXkKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIHBvcChzZWxmLCBrZXksIGRlZmF1bHQ9Tm9uZSk6CiAgICAgICAgdmFsdWUgPSBkaWN0LnBvcChzZWxmLCBrZXksIGRlZmF1bHQpCiAgICAgICAgcmVzdWx0ID0gc2VsZi5jb25maWd1cmF0b3IuY29udmVydCh2YWx1ZSkKICAgICAgICBpZiB2YWx1ZSBpcyBub3QgcmVzdWx0OgogICAgICAgICAgICBpZiB0eXBlKHJlc3VsdCkgaW4gKENvbnZlcnRpbmdEaWN0LCBDb252ZXJ0aW5nTGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb252ZXJ0aW5nVHVwbGUpOgogICAgICAgICAgICAgICAgcmVzdWx0LnBhcmVudCA9IHNlbGYKICAgICAgICAgICAgICAgIHJlc3VsdC5rZXkgPSBrZXkKICAgICAgICByZXR1cm4gcmVzdWx0CgoKY2xhc3MgQ29udmVydGluZ0xpc3QobGlzdCk6CiAgICAiIiJBIGNvbnZlcnRpbmcgbGlzdCB3cmFwcGVyLiIiIgogICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CiAgICAgICAgdmFsdWUgPSBsaXN0Ll9fZ2V0aXRlbV9fKHNlbGYsIGtleSkKICAgICAgICByZXN1bHQgPSBzZWxmLmNvbmZpZ3VyYXRvci5jb252ZXJ0KHZhbHVlKQogICAgICAgICMgSWYgdGhlIGNvbnZlcnRlZCB2YWx1ZSBpcyBkaWZmZXJlbnQsIHNhdmUgZm9yIG5leHQgdGltZQogICAgICAgIGlmIHZhbHVlIGlzIG5vdCByZXN1bHQ6CiAgICAgICAgICAgIHNlbGZba2V5XSA9IHJlc3VsdAogICAgICAgICAgICBpZiB0eXBlKHJlc3VsdCkgaW4gKENvbnZlcnRpbmdEaWN0LCBDb252ZXJ0aW5nTGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb252ZXJ0aW5nVHVwbGUpOgogICAgICAgICAgICAgICAgcmVzdWx0LnBhcmVudCA9IHNlbGYKICAgICAgICAgICAgICAgIHJlc3VsdC5rZXkgPSBrZXkKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIHBvcChzZWxmLCBpZHg9LTEpOgogICAgICAgIHZhbHVlID0gbGlzdC5wb3Aoc2VsZiwgaWR4KQogICAgICAgIHJlc3VsdCA9IHNlbGYuY29uZmlndXJhdG9yLmNvbnZlcnQodmFsdWUpCiAgICAgICAgaWYgdmFsdWUgaXMgbm90IHJlc3VsdDoKICAgICAgICAgICAgaWYgdHlwZShyZXN1bHQpIGluIChDb252ZXJ0aW5nRGljdCwgQ29udmVydGluZ0xpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udmVydGluZ1R1cGxlKToKICAgICAgICAgICAgICAgIHJlc3VsdC5wYXJlbnQgPSBzZWxmCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKCmNsYXNzIENvbnZlcnRpbmdUdXBsZSh0dXBsZSk6CiAgICAiIiJBIGNvbnZlcnRpbmcgdHVwbGUgd3JhcHBlci4iIiIKICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgogICAgICAgIHZhbHVlID0gdHVwbGUuX19nZXRpdGVtX18oc2VsZiwga2V5KQogICAgICAgIHJlc3VsdCA9IHNlbGYuY29uZmlndXJhdG9yLmNvbnZlcnQodmFsdWUpCiAgICAgICAgaWYgdmFsdWUgaXMgbm90IHJlc3VsdDoKICAgICAgICAgICAgaWYgdHlwZShyZXN1bHQpIGluIChDb252ZXJ0aW5nRGljdCwgQ29udmVydGluZ0xpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udmVydGluZ1R1cGxlKToKICAgICAgICAgICAgICAgIHJlc3VsdC5wYXJlbnQgPSBzZWxmCiAgICAgICAgICAgICAgICByZXN1bHQua2V5ID0ga2V5CiAgICAgICAgcmV0dXJuIHJlc3VsdAoKCmNsYXNzIEJhc2VDb25maWd1cmF0b3Iob2JqZWN0KToKICAgICIiIgogICAgVGhlIGNvbmZpZ3VyYXRvciBiYXNlIGNsYXNzIHdoaWNoIGRlZmluZXMgc29tZSB1c2VmdWwgZGVmYXVsdHMuCiAgICAiIiIKCiAgICBDT05WRVJUX1BBVFRFUk4gPSByZS5jb21waWxlKHInXig/UDxwcmVmaXg+W2Etel0rKTovLyg/UDxzdWZmaXg+LiopJCcpCgogICAgV09SRF9QQVRURVJOID0gcmUuY29tcGlsZShyJ15ccyooXHcrKVxzKicpCiAgICBET1RfUEFUVEVSTiA9IHJlLmNvbXBpbGUocideXC5ccyooXHcrKVxzKicpCiAgICBJTkRFWF9QQVRURVJOID0gcmUuY29tcGlsZShyJ15cW1xzKihcdyspXHMqXF1ccyonKQogICAgRElHSVRfUEFUVEVSTiA9IHJlLmNvbXBpbGUocideXGQrJCcpCgogICAgdmFsdWVfY29udmVydGVycyA9IHsKICAgICAgICAnZXh0JyA6ICdleHRfY29udmVydCcsCiAgICAgICAgJ2NmZycgOiAnY2ZnX2NvbnZlcnQnLAogICAgfQoKICAgICMgV2UgbWlnaHQgd2FudCB0byB1c2UgYSBkaWZmZXJlbnQgb25lLCBlLmcuIGltcG9ydGxpYgogICAgaW1wb3J0ZXIgPSBfX2ltcG9ydF9fCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbmZpZyk6CiAgICAgICAgc2VsZi5jb25maWcgPSBDb252ZXJ0aW5nRGljdChjb25maWcpCiAgICAgICAgc2VsZi5jb25maWcuY29uZmlndXJhdG9yID0gc2VsZgoKICAgIGRlZiByZXNvbHZlKHNlbGYsIHMpOgogICAgICAgICIiIgogICAgICAgIFJlc29sdmUgc3RyaW5ncyB0byBvYmplY3RzIHVzaW5nIHN0YW5kYXJkIGltcG9ydCBhbmQgYXR0cmlidXRlCiAgICAgICAgc3ludGF4LgogICAgICAgICIiIgogICAgICAgIG5hbWUgPSBzLnNwbGl0KCcuJykKICAgICAgICB1c2VkID0gbmFtZS5wb3AoMCkKICAgICAgICB0cnk6CiAgICAgICAgICAgIGZvdW5kID0gc2VsZi5pbXBvcnRlcih1c2VkKQogICAgICAgICAgICBmb3IgZnJhZyBpbiBuYW1lOgogICAgICAgICAgICAgICAgdXNlZCArPSAnLicgKyBmcmFnCiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBnZXRhdHRyKGZvdW5kLCBmcmFnKQogICAgICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICAgICAgICAgIHNlbGYuaW1wb3J0ZXIodXNlZCkKICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IGdldGF0dHIoZm91bmQsIGZyYWcpCiAgICAgICAgICAgIHJldHVybiBmb3VuZAogICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICAgICAgZSwgdGIgPSBzeXMuZXhjX2luZm8oKVsxOl0KICAgICAgICAgICAgdiA9IFZhbHVlRXJyb3IoJ0Nhbm5vdCByZXNvbHZlICVyOiAlcycgJSAocywgZSkpCiAgICAgICAgICAgIHYuX19jYXVzZV9fLCB2Ll9fdHJhY2ViYWNrX18gPSBlLCB0YgogICAgICAgICAgICByYWlzZSB2CgogICAgZGVmIGV4dF9jb252ZXJ0KHNlbGYsIHZhbHVlKToKICAgICAgICAiIiJEZWZhdWx0IGNvbnZlcnRlciBmb3IgdGhlIGV4dDovLyBwcm90b2NvbC4iIiIKICAgICAgICByZXR1cm4gc2VsZi5yZXNvbHZlKHZhbHVlKQoKICAgIGRlZiBjZmdfY29udmVydChzZWxmLCB2YWx1ZSk6CiAgICAgICAgIiIiRGVmYXVsdCBjb252ZXJ0ZXIgZm9yIHRoZSBjZmc6Ly8gcHJvdG9jb2wuIiIiCiAgICAgICAgcmVzdCA9IHZhbHVlCiAgICAgICAgbSA9IHNlbGYuV09SRF9QQVRURVJOLm1hdGNoKHJlc3QpCiAgICAgICAgaWYgbSBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJVbmFibGUgdG8gY29udmVydCAlciIgJSB2YWx1ZSkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXN0ID0gcmVzdFttLmVuZCgpOl0KICAgICAgICAgICAgZCA9IHNlbGYuY29uZmlnW20uZ3JvdXBzKClbMF1dCiAgICAgICAgICAgICMgcHJpbnQgZCwgcmVzdAogICAgICAgICAgICB3aGlsZSByZXN0OgogICAgICAgICAgICAgICAgbSA9IHNlbGYuRE9UX1BBVFRFUk4ubWF0Y2gocmVzdCkKICAgICAgICAgICAgICAgIGlmIG06CiAgICAgICAgICAgICAgICAgICAgZCA9IGRbbS5ncm91cHMoKVswXV0KICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgbSA9IHNlbGYuSU5ERVhfUEFUVEVSTi5tYXRjaChyZXN0KQogICAgICAgICAgICAgICAgICAgIGlmIG06CiAgICAgICAgICAgICAgICAgICAgICAgIGlkeCA9IG0uZ3JvdXBzKClbMF0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuRElHSVRfUEFUVEVSTi5tYXRjaChpZHgpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZCA9IGRbaWR4XQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBpbnQoaWR4KSAgIyB0cnkgYXMgbnVtYmVyIGZpcnN0IChtb3N0IGxpa2VseSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkID0gZFtuXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkID0gZFtpZHhdCiAgICAgICAgICAgICAgICBpZiBtOgogICAgICAgICAgICAgICAgICAgIHJlc3QgPSByZXN0W20uZW5kKCk6XQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdVbmFibGUgdG8gY29udmVydCAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJXIgYXQgJXInICUgKHZhbHVlLCByZXN0KSkKICAgICAgICAjIHJlc3Qgc2hvdWxkIGJlIGVtcHR5CiAgICAgICAgcmV0dXJuIGQKCiAgICBkZWYgY29udmVydChzZWxmLCB2YWx1ZSk6CiAgICAgICAgIiIiCiAgICAgICAgQ29udmVydCB2YWx1ZXMgdG8gYW4gYXBwcm9wcmlhdGUgdHlwZS4gZGljdHMsIGxpc3RzIGFuZCB0dXBsZXMgYXJlCiAgICAgICAgcmVwbGFjZWQgYnkgdGhlaXIgY29udmVydGluZyBhbHRlcm5hdGl2ZXMuIFN0cmluZ3MgYXJlIGNoZWNrZWQgdG8KICAgICAgICBzZWUgaWYgdGhleSBoYXZlIGEgY29udmVyc2lvbiBmb3JtYXQgYW5kIGFyZSBjb252ZXJ0ZWQgaWYgdGhleSBkby4KICAgICAgICAiIiIKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh2YWx1ZSwgQ29udmVydGluZ0RpY3QpIGFuZCBpc2luc3RhbmNlKHZhbHVlLCBkaWN0KToKICAgICAgICAgICAgdmFsdWUgPSBDb252ZXJ0aW5nRGljdCh2YWx1ZSkKICAgICAgICAgICAgdmFsdWUuY29uZmlndXJhdG9yID0gc2VsZgogICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2UodmFsdWUsIENvbnZlcnRpbmdMaXN0KSBhbmQgaXNpbnN0YW5jZSh2YWx1ZSwgbGlzdCk6CiAgICAgICAgICAgIHZhbHVlID0gQ29udmVydGluZ0xpc3QodmFsdWUpCiAgICAgICAgICAgIHZhbHVlLmNvbmZpZ3VyYXRvciA9IHNlbGYKICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKHZhbHVlLCBDb252ZXJ0aW5nVHVwbGUpIGFuZFwKICAgICAgICAgICAgICAgICBpc2luc3RhbmNlKHZhbHVlLCB0dXBsZSk6CiAgICAgICAgICAgIHZhbHVlID0gQ29udmVydGluZ1R1cGxlKHZhbHVlKQogICAgICAgICAgICB2YWx1ZS5jb25maWd1cmF0b3IgPSBzZWxmCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKHZhbHVlLCBzaXguc3RyaW5nX3R5cGVzKTogICMgc3RyIGZvciBweTNrCiAgICAgICAgICAgIG0gPSBzZWxmLkNPTlZFUlRfUEFUVEVSTi5tYXRjaCh2YWx1ZSkKICAgICAgICAgICAgaWYgbToKICAgICAgICAgICAgICAgIGQgPSBtLmdyb3VwZGljdCgpCiAgICAgICAgICAgICAgICBwcmVmaXggPSBkWydwcmVmaXgnXQogICAgICAgICAgICAgICAgY29udmVydGVyID0gc2VsZi52YWx1ZV9jb252ZXJ0ZXJzLmdldChwcmVmaXgsIE5vbmUpCiAgICAgICAgICAgICAgICBpZiBjb252ZXJ0ZXI6CiAgICAgICAgICAgICAgICAgICAgc3VmZml4ID0gZFsnc3VmZml4J10KICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZXIgPSBnZXRhdHRyKHNlbGYsIGNvbnZlcnRlcikKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGNvbnZlcnRlcihzdWZmaXgpCiAgICAgICAgcmV0dXJuIHZhbHVlCgogICAgZGVmIGNvbmZpZ3VyZV9jdXN0b20oc2VsZiwgY29uZmlnKToKICAgICAgICAiIiJDb25maWd1cmUgYW4gb2JqZWN0IHdpdGggYSB1c2VyLXN1cHBsaWVkIGZhY3RvcnkuIiIiCiAgICAgICAgYyA9IGNvbmZpZy5wb3AoJygpJykKICAgICAgICBpZiBub3QgaGFzYXR0cihjLCAnX19jYWxsX18nKSBhbmQgaGFzYXR0cih0eXBlcywgJ0NsYXNzVHlwZScpIGFuZCB0eXBlKGMpICE9IHR5cGVzLkNsYXNzVHlwZToKICAgICAgICAgICAgYyA9IHNlbGYucmVzb2x2ZShjKQogICAgICAgIHByb3BzID0gY29uZmlnLnBvcCgnLicsIE5vbmUpCiAgICAgICAgIyBDaGVjayBmb3IgdmFsaWQgaWRlbnRpZmllcnMKICAgICAgICBrd2FyZ3MgPSBkaWN0KChrLCBjb25maWdba10pIGZvciBrIGluIGNvbmZpZyBpZiB2YWxpZF9pZGVudChrKSkKICAgICAgICByZXN1bHQgPSBjKCoqa3dhcmdzKQogICAgICAgIGlmIHByb3BzOgogICAgICAgICAgICBmb3IgbmFtZSwgdmFsdWUgaW4gcHJvcHMuaXRlbXMoKToKICAgICAgICAgICAgICAgIHNldGF0dHIocmVzdWx0LCBuYW1lLCB2YWx1ZSkKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIGFzX3R1cGxlKHNlbGYsIHZhbHVlKToKICAgICAgICAiIiJVdGlsaXR5IGZ1bmN0aW9uIHdoaWNoIGNvbnZlcnRzIGxpc3RzIHRvIHR1cGxlcy4iIiIKICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBsaXN0KToKICAgICAgICAgICAgdmFsdWUgPSB0dXBsZSh2YWx1ZSkKICAgICAgICByZXR1cm4gdmFsdWUKCgpjbGFzcyBEaWN0Q29uZmlndXJhdG9yKEJhc2VDb25maWd1cmF0b3IpOgogICAgIiIiCiAgICBDb25maWd1cmUgbG9nZ2luZyB1c2luZyBhIGRpY3Rpb25hcnktbGlrZSBvYmplY3QgdG8gZGVzY3JpYmUgdGhlCiAgICBjb25maWd1cmF0aW9uLgogICAgIiIiCgogICAgZGVmIGNvbmZpZ3VyZShzZWxmKToKICAgICAgICAiIiJEbyB0aGUgY29uZmlndXJhdGlvbi4iIiIKCiAgICAgICAgY29uZmlnID0gc2VsZi5jb25maWcKICAgICAgICBpZiAndmVyc2lvbicgbm90IGluIGNvbmZpZzoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiZGljdGlvbmFyeSBkb2Vzbid0IHNwZWNpZnkgYSB2ZXJzaW9uIikKICAgICAgICBpZiBjb25maWdbJ3ZlcnNpb24nXSAhPSAxOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJVbnN1cHBvcnRlZCB2ZXJzaW9uOiAlcyIgJSBjb25maWdbJ3ZlcnNpb24nXSkKICAgICAgICBpbmNyZW1lbnRhbCA9IGNvbmZpZy5wb3AoJ2luY3JlbWVudGFsJywgRmFsc2UpCiAgICAgICAgRU1QVFlfRElDVCA9IHt9CiAgICAgICAgbG9nZ2luZy5fYWNxdWlyZUxvY2soKQogICAgICAgIHRyeToKICAgICAgICAgICAgaWYgaW5jcmVtZW50YWw6CiAgICAgICAgICAgICAgICBoYW5kbGVycyA9IGNvbmZpZy5nZXQoJ2hhbmRsZXJzJywgRU1QVFlfRElDVCkKICAgICAgICAgICAgICAgICMgaW5jcmVtZW50YWwgaGFuZGxlciBjb25maWcgb25seSBpZiBoYW5kbGVyIG5hbWUKICAgICAgICAgICAgICAgICMgdGllcyBpbiB0byBsb2dnaW5nLl9oYW5kbGVycyAoUHl0aG9uIDIuNykKICAgICAgICAgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bOjJdID09ICgyLCA3KToKICAgICAgICAgICAgICAgICAgICBmb3IgbmFtZSBpbiBoYW5kbGVyczoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgbmFtZSBub3QgaW4gbG9nZ2luZy5faGFuZGxlcnM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdObyBoYW5kbGVyIGZvdW5kIHdpdGggJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSAlcicgICUgbmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyID0gbG9nZ2luZy5faGFuZGxlcnNbbmFtZV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyX2NvbmZpZyA9IGhhbmRsZXJzW25hbWVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSBoYW5kbGVyX2NvbmZpZy5nZXQoJ2xldmVsJywgTm9uZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBsZXZlbDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlci5zZXRMZXZlbChfY2hlY2tMZXZlbChsZXZlbCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgU3RhbmRhcmRFcnJvciBhcyBlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1VuYWJsZSB0byBjb25maWd1cmUgaGFuZGxlciAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJXI6ICVzJyAlIChuYW1lLCBlKSkKICAgICAgICAgICAgICAgIGxvZ2dlcnMgPSBjb25maWcuZ2V0KCdsb2dnZXJzJywgRU1QVFlfRElDVCkKICAgICAgICAgICAgICAgIGZvciBuYW1lIGluIGxvZ2dlcnM6CiAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbmZpZ3VyZV9sb2dnZXIobmFtZSwgbG9nZ2Vyc1tuYW1lXSwgVHJ1ZSkKICAgICAgICAgICAgICAgICAgICBleGNlcHQgU3RhbmRhcmRFcnJvciBhcyBlOgogICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdVbmFibGUgdG8gY29uZmlndXJlIGxvZ2dlciAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyVyOiAlcycgJSAobmFtZSwgZSkpCiAgICAgICAgICAgICAgICByb290ID0gY29uZmlnLmdldCgncm9vdCcsIE5vbmUpCiAgICAgICAgICAgICAgICBpZiByb290OgogICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb25maWd1cmVfcm9vdChyb290LCBUcnVlKQogICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBTdGFuZGFyZEVycm9yIGFzIGU6CiAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1VuYWJsZSB0byBjb25maWd1cmUgcm9vdCAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xvZ2dlcjogJXMnICUgZSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGRpc2FibGVfZXhpc3RpbmcgPSBjb25maWcucG9wKCdkaXNhYmxlX2V4aXN0aW5nX2xvZ2dlcnMnLCBUcnVlKQoKICAgICAgICAgICAgICAgIGxvZ2dpbmcuX2hhbmRsZXJzLmNsZWFyKCkKICAgICAgICAgICAgICAgIGRlbCBsb2dnaW5nLl9oYW5kbGVyTGlzdFs6XQoKICAgICAgICAgICAgICAgICMgRG8gZm9ybWF0dGVycyBmaXJzdCAtIHRoZXkgZG9uJ3QgcmVmZXIgdG8gYW55dGhpbmcgZWxzZQogICAgICAgICAgICAgICAgZm9ybWF0dGVycyA9IGNvbmZpZy5nZXQoJ2Zvcm1hdHRlcnMnLCBFTVBUWV9ESUNUKQogICAgICAgICAgICAgICAgZm9yIG5hbWUgaW4gZm9ybWF0dGVyczoKICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlcnNbbmFtZV0gPSBzZWxmLmNvbmZpZ3VyZV9mb3JtYXR0ZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlcnNbbmFtZV0pCiAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFN0YW5kYXJkRXJyb3IgYXMgZToKICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignVW5hYmxlIHRvIGNvbmZpZ3VyZSAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Zvcm1hdHRlciAlcjogJXMnICUgKG5hbWUsIGUpKQogICAgICAgICAgICAgICAgIyBOZXh0LCBkbyBmaWx0ZXJzIC0gdGhleSBkb24ndCByZWZlciB0byBhbnl0aGluZyBlbHNlLCBlaXRoZXIKICAgICAgICAgICAgICAgIGZpbHRlcnMgPSBjb25maWcuZ2V0KCdmaWx0ZXJzJywgRU1QVFlfRElDVCkKICAgICAgICAgICAgICAgIGZvciBuYW1lIGluIGZpbHRlcnM6CiAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJzW25hbWVdID0gc2VsZi5jb25maWd1cmVfZmlsdGVyKGZpbHRlcnNbbmFtZV0pCiAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFN0YW5kYXJkRXJyb3IgYXMgZToKICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignVW5hYmxlIHRvIGNvbmZpZ3VyZSAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZpbHRlciAlcjogJXMnICUgKG5hbWUsIGUpKQoKICAgICAgICAgICAgICAgICMgTmV4dCwgZG8gaGFuZGxlcnMgLSB0aGV5IHJlZmVyIHRvIGZvcm1hdHRlcnMgYW5kIGZpbHRlcnMKICAgICAgICAgICAgICAgICMgQXMgaGFuZGxlcnMgY2FuIHJlZmVyIHRvIG90aGVyIGhhbmRsZXJzLCBzb3J0IHRoZSBrZXlzCiAgICAgICAgICAgICAgICAjIHRvIGFsbG93IGEgZGV0ZXJtaW5pc3RpYyBvcmRlciBvZiBjb25maWd1cmF0aW9uCiAgICAgICAgICAgICAgICBoYW5kbGVycyA9IGNvbmZpZy5nZXQoJ2hhbmRsZXJzJywgRU1QVFlfRElDVCkKICAgICAgICAgICAgICAgIGZvciBuYW1lIGluIHNvcnRlZChoYW5kbGVycyk6CiAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyID0gc2VsZi5jb25maWd1cmVfaGFuZGxlcihoYW5kbGVyc1tuYW1lXSkKICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlci5uYW1lID0gbmFtZQogICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyc1tuYW1lXSA9IGhhbmRsZXIKICAgICAgICAgICAgICAgICAgICBleGNlcHQgU3RhbmRhcmRFcnJvciBhcyBlOgogICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdVbmFibGUgdG8gY29uZmlndXJlIGhhbmRsZXIgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICclcjogJXMnICUgKG5hbWUsIGUpKQogICAgICAgICAgICAgICAgIyBOZXh0LCBkbyBsb2dnZXJzIC0gdGhleSByZWZlciB0byBoYW5kbGVycyBhbmQgZmlsdGVycwoKICAgICAgICAgICAgICAgICMgd2UgZG9uJ3Qgd2FudCB0byBsb3NlIHRoZSBleGlzdGluZyBsb2dnZXJzLAogICAgICAgICAgICAgICAgIyBzaW5jZSBvdGhlciB0aHJlYWRzIG1heSBoYXZlIHBvaW50ZXJzIHRvIHRoZW0uCiAgICAgICAgICAgICAgICAjIGV4aXN0aW5nIGlzIHNldCB0byBjb250YWluIGFsbCBleGlzdGluZyBsb2dnZXJzLAogICAgICAgICAgICAgICAgIyBhbmQgYXMgd2UgZ28gdGhyb3VnaCB0aGUgbmV3IGNvbmZpZ3VyYXRpb24gd2UKICAgICAgICAgICAgICAgICMgcmVtb3ZlIGFueSB3aGljaCBhcmUgY29uZmlndXJlZC4gQXQgdGhlIGVuZCwKICAgICAgICAgICAgICAgICMgd2hhdCdzIGxlZnQgaW4gZXhpc3RpbmcgaXMgdGhlIHNldCBvZiBsb2dnZXJzCiAgICAgICAgICAgICAgICAjIHdoaWNoIHdlcmUgaW4gdGhlIHByZXZpb3VzIGNvbmZpZ3VyYXRpb24gYnV0CiAgICAgICAgICAgICAgICAjIHdoaWNoIGFyZSBub3QgaW4gdGhlIG5ldyBjb25maWd1cmF0aW9uLgogICAgICAgICAgICAgICAgcm9vdCA9IGxvZ2dpbmcucm9vdAogICAgICAgICAgICAgICAgZXhpc3RpbmcgPSBsaXN0KHJvb3QubWFuYWdlci5sb2dnZXJEaWN0KQogICAgICAgICAgICAgICAgIyBUaGUgbGlzdCBuZWVkcyB0byBiZSBzb3J0ZWQgc28gdGhhdCB3ZSBjYW4KICAgICAgICAgICAgICAgICMgYXZvaWQgZGlzYWJsaW5nIGNoaWxkIGxvZ2dlcnMgb2YgZXhwbGljaXRseQogICAgICAgICAgICAgICAgIyBuYW1lZCBsb2dnZXJzLiBXaXRoIGEgc29ydGVkIGxpc3QgaXQgaXMgZWFzaWVyCiAgICAgICAgICAgICAgICAjIHRvIGZpbmQgdGhlIGNoaWxkIGxvZ2dlcnMuCiAgICAgICAgICAgICAgICBleGlzdGluZy5zb3J0KCkKICAgICAgICAgICAgICAgICMgV2UnbGwga2VlcCB0aGUgbGlzdCBvZiBleGlzdGluZyBsb2dnZXJzCiAgICAgICAgICAgICAgICAjIHdoaWNoIGFyZSBjaGlsZHJlbiBvZiBuYW1lZCBsb2dnZXJzIGhlcmUuLi4KICAgICAgICAgICAgICAgIGNoaWxkX2xvZ2dlcnMgPSBbXQogICAgICAgICAgICAgICAgIyBub3cgc2V0IHVwIHRoZSBuZXcgb25lcy4uLgogICAgICAgICAgICAgICAgbG9nZ2VycyA9IGNvbmZpZy5nZXQoJ2xvZ2dlcnMnLCBFTVBUWV9ESUNUKQogICAgICAgICAgICAgICAgZm9yIG5hbWUgaW4gbG9nZ2VyczoKICAgICAgICAgICAgICAgICAgICBpZiBuYW1lIGluIGV4aXN0aW5nOgogICAgICAgICAgICAgICAgICAgICAgICBpID0gZXhpc3RpbmcuaW5kZXgobmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ZWQgPSBuYW1lICsgIi4iCiAgICAgICAgICAgICAgICAgICAgICAgIHBmbGVuID0gbGVuKHByZWZpeGVkKQogICAgICAgICAgICAgICAgICAgICAgICBudW1fZXhpc3RpbmcgPSBsZW4oZXhpc3RpbmcpCiAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBpICsgMSAgIyBsb29rIGF0IHRoZSBlbnRyeSBhZnRlciBuYW1lCiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChpIDwgbnVtX2V4aXN0aW5nKSBhbmRcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChleGlzdGluZ1tpXVs6cGZsZW5dID09IHByZWZpeGVkKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkX2xvZ2dlcnMuYXBwZW5kKGV4aXN0aW5nW2ldKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGkgKyAxCiAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLnJlbW92ZShuYW1lKQogICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb25maWd1cmVfbG9nZ2VyKG5hbWUsIGxvZ2dlcnNbbmFtZV0pCiAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFN0YW5kYXJkRXJyb3IgYXMgZToKICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignVW5hYmxlIHRvIGNvbmZpZ3VyZSBsb2dnZXIgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICclcjogJXMnICUgKG5hbWUsIGUpKQoKICAgICAgICAgICAgICAgICMgRGlzYWJsZSBhbnkgb2xkIGxvZ2dlcnMuIFRoZXJlJ3Mgbm8gcG9pbnQgZGVsZXRpbmcKICAgICAgICAgICAgICAgICMgdGhlbSBhcyBvdGhlciB0aHJlYWRzIG1heSBjb250aW51ZSB0byBob2xkIHJlZmVyZW5jZXMKICAgICAgICAgICAgICAgICMgYW5kIGJ5IGRpc2FibGluZyB0aGVtLCB5b3Ugc3RvcCB0aGVtIGRvaW5nIGFueSBsb2dnaW5nLgogICAgICAgICAgICAgICAgIyBIb3dldmVyLCBkb24ndCBkaXNhYmxlIGNoaWxkcmVuIG9mIG5hbWVkIGxvZ2dlcnMsIGFzIHRoYXQncwogICAgICAgICAgICAgICAgIyBwcm9iYWJseSBub3Qgd2hhdCB3YXMgaW50ZW5kZWQgYnkgdGhlIHVzZXIuCiAgICAgICAgICAgICAgICBmb3IgbG9nIGluIGV4aXN0aW5nOgogICAgICAgICAgICAgICAgICAgIGxvZ2dlciA9IHJvb3QubWFuYWdlci5sb2dnZXJEaWN0W2xvZ10KICAgICAgICAgICAgICAgICAgICBpZiBsb2cgaW4gY2hpbGRfbG9nZ2VyczoKICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmxldmVsID0gbG9nZ2luZy5OT1RTRVQKICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmhhbmRsZXJzID0gW10KICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnByb3BhZ2F0ZSA9IFRydWUKICAgICAgICAgICAgICAgICAgICBlbGlmIGRpc2FibGVfZXhpc3Rpbmc6CiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kaXNhYmxlZCA9IFRydWUKCiAgICAgICAgICAgICAgICAjIEFuZCBmaW5hbGx5LCBkbyB0aGUgcm9vdCBsb2dnZXIKICAgICAgICAgICAgICAgIHJvb3QgPSBjb25maWcuZ2V0KCdyb290JywgTm9uZSkKICAgICAgICAgICAgICAgIGlmIHJvb3Q6CiAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbmZpZ3VyZV9yb290KHJvb3QpCiAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFN0YW5kYXJkRXJyb3IgYXMgZToKICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignVW5hYmxlIHRvIGNvbmZpZ3VyZSByb290ICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbG9nZ2VyOiAlcycgJSBlKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIGxvZ2dpbmcuX3JlbGVhc2VMb2NrKCkKCiAgICBkZWYgY29uZmlndXJlX2Zvcm1hdHRlcihzZWxmLCBjb25maWcpOgogICAgICAgICIiIkNvbmZpZ3VyZSBhIGZvcm1hdHRlciBmcm9tIGEgZGljdGlvbmFyeS4iIiIKICAgICAgICBpZiAnKCknIGluIGNvbmZpZzoKICAgICAgICAgICAgZmFjdG9yeSA9IGNvbmZpZ1snKCknXSAgIyBmb3IgdXNlIGluIGV4Y2VwdGlvbiBoYW5kbGVyCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuY29uZmlndXJlX2N1c3RvbShjb25maWcpCiAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3IgYXMgdGU6CiAgICAgICAgICAgICAgICBpZiAiJ2Zvcm1hdCciIG5vdCBpbiBzdHIodGUpOgogICAgICAgICAgICAgICAgICAgIHJhaXNlCiAgICAgICAgICAgICAgICAjIE5hbWUgb2YgcGFyYW1ldGVyIGNoYW5nZWQgZnJvbSBmbXQgdG8gZm9ybWF0LgogICAgICAgICAgICAgICAgIyBSZXRyeSB3aXRoIG9sZCBuYW1lLgogICAgICAgICAgICAgICAgIyBUaGlzIGlzIHNvIHRoYXQgY29kZSBjYW4gYmUgdXNlZCB3aXRoIG9sZGVyIFB5dGhvbiB2ZXJzaW9ucwogICAgICAgICAgICAgICAgIyhlLmcuIGJ5IERqYW5nbykKICAgICAgICAgICAgICAgIGNvbmZpZ1snZm10J10gPSBjb25maWcucG9wKCdmb3JtYXQnKQogICAgICAgICAgICAgICAgY29uZmlnWycoKSddID0gZmFjdG9yeQogICAgICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5jb25maWd1cmVfY3VzdG9tKGNvbmZpZykKICAgICAgICBlbHNlOgogICAgICAgICAgICBmbXQgPSBjb25maWcuZ2V0KCdmb3JtYXQnLCBOb25lKQogICAgICAgICAgICBkZm10ID0gY29uZmlnLmdldCgnZGF0ZWZtdCcsIE5vbmUpCiAgICAgICAgICAgIHJlc3VsdCA9IGxvZ2dpbmcuRm9ybWF0dGVyKGZtdCwgZGZtdCkKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIGNvbmZpZ3VyZV9maWx0ZXIoc2VsZiwgY29uZmlnKToKICAgICAgICAiIiJDb25maWd1cmUgYSBmaWx0ZXIgZnJvbSBhIGRpY3Rpb25hcnkuIiIiCiAgICAgICAgaWYgJygpJyBpbiBjb25maWc6CiAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuY29uZmlndXJlX2N1c3RvbShjb25maWcpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbmFtZSA9IGNvbmZpZy5nZXQoJ25hbWUnLCAnJykKICAgICAgICAgICAgcmVzdWx0ID0gbG9nZ2luZy5GaWx0ZXIobmFtZSkKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIGFkZF9maWx0ZXJzKHNlbGYsIGZpbHRlcmVyLCBmaWx0ZXJzKToKICAgICAgICAiIiJBZGQgZmlsdGVycyB0byBhIGZpbHRlcmVyIGZyb20gYSBsaXN0IG9mIG5hbWVzLiIiIgogICAgICAgIGZvciBmIGluIGZpbHRlcnM6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGZpbHRlcmVyLmFkZEZpbHRlcihzZWxmLmNvbmZpZ1snZmlsdGVycyddW2ZdKQogICAgICAgICAgICBleGNlcHQgU3RhbmRhcmRFcnJvciBhcyBlOgogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignVW5hYmxlIHRvIGFkZCBmaWx0ZXIgJXI6ICVzJyAlIChmLCBlKSkKCiAgICBkZWYgY29uZmlndXJlX2hhbmRsZXIoc2VsZiwgY29uZmlnKToKICAgICAgICAiIiJDb25maWd1cmUgYSBoYW5kbGVyIGZyb20gYSBkaWN0aW9uYXJ5LiIiIgogICAgICAgIGZvcm1hdHRlciA9IGNvbmZpZy5wb3AoJ2Zvcm1hdHRlcicsIE5vbmUpCiAgICAgICAgaWYgZm9ybWF0dGVyOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBmb3JtYXR0ZXIgPSBzZWxmLmNvbmZpZ1snZm9ybWF0dGVycyddW2Zvcm1hdHRlcl0KICAgICAgICAgICAgZXhjZXB0IFN0YW5kYXJkRXJyb3IgYXMgZToKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1VuYWJsZSB0byBzZXQgZm9ybWF0dGVyICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyVyOiAlcycgJSAoZm9ybWF0dGVyLCBlKSkKICAgICAgICBsZXZlbCA9IGNvbmZpZy5wb3AoJ2xldmVsJywgTm9uZSkKICAgICAgICBmaWx0ZXJzID0gY29uZmlnLnBvcCgnZmlsdGVycycsIE5vbmUpCiAgICAgICAgaWYgJygpJyBpbiBjb25maWc6CiAgICAgICAgICAgIGMgPSBjb25maWcucG9wKCcoKScpCiAgICAgICAgICAgIGlmIG5vdCBoYXNhdHRyKGMsICdfX2NhbGxfXycpIGFuZCBoYXNhdHRyKHR5cGVzLCAnQ2xhc3NUeXBlJykgYW5kIHR5cGUoYykgIT0gdHlwZXMuQ2xhc3NUeXBlOgogICAgICAgICAgICAgICAgYyA9IHNlbGYucmVzb2x2ZShjKQogICAgICAgICAgICBmYWN0b3J5ID0gYwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGtsYXNzID0gc2VsZi5yZXNvbHZlKGNvbmZpZy5wb3AoJ2NsYXNzJykpCiAgICAgICAgICAgICMgU3BlY2lhbCBjYXNlIGZvciBoYW5kbGVyIHdoaWNoIHJlZmVycyB0byBhbm90aGVyIGhhbmRsZXIKICAgICAgICAgICAgaWYgaXNzdWJjbGFzcyhrbGFzcywgbG9nZ2luZy5oYW5kbGVycy5NZW1vcnlIYW5kbGVyKSBhbmRcCiAgICAgICAgICAgICAgICAndGFyZ2V0JyBpbiBjb25maWc6CiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgY29uZmlnWyd0YXJnZXQnXSA9IHNlbGYuY29uZmlnWydoYW5kbGVycyddW2NvbmZpZ1sndGFyZ2V0J11dCiAgICAgICAgICAgICAgICBleGNlcHQgU3RhbmRhcmRFcnJvciBhcyBlOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1VuYWJsZSB0byBzZXQgdGFyZ2V0IGhhbmRsZXIgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyVyOiAlcycgJSAoY29uZmlnWyd0YXJnZXQnXSwgZSkpCiAgICAgICAgICAgIGVsaWYgaXNzdWJjbGFzcyhrbGFzcywgbG9nZ2luZy5oYW5kbGVycy5TTVRQSGFuZGxlcikgYW5kXAogICAgICAgICAgICAgICAgJ21haWxob3N0JyBpbiBjb25maWc6CiAgICAgICAgICAgICAgICBjb25maWdbJ21haWxob3N0J10gPSBzZWxmLmFzX3R1cGxlKGNvbmZpZ1snbWFpbGhvc3QnXSkKICAgICAgICAgICAgZWxpZiBpc3N1YmNsYXNzKGtsYXNzLCBsb2dnaW5nLmhhbmRsZXJzLlN5c0xvZ0hhbmRsZXIpIGFuZFwKICAgICAgICAgICAgICAgICdhZGRyZXNzJyBpbiBjb25maWc6CiAgICAgICAgICAgICAgICBjb25maWdbJ2FkZHJlc3MnXSA9IHNlbGYuYXNfdHVwbGUoY29uZmlnWydhZGRyZXNzJ10pCiAgICAgICAgICAgIGZhY3RvcnkgPSBrbGFzcwogICAgICAgIGt3YXJncyA9IGRpY3QoKGssIGNvbmZpZ1trXSkgZm9yIGsgaW4gY29uZmlnIGlmIHZhbGlkX2lkZW50KGspKQogICAgICAgIHRyeToKICAgICAgICAgICAgcmVzdWx0ID0gZmFjdG9yeSgqKmt3YXJncykKICAgICAgICBleGNlcHQgVHlwZUVycm9yIGFzIHRlOgogICAgICAgICAgICBpZiAiJ3N0cmVhbSciIG5vdCBpbiBzdHIodGUpOgogICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICAgICAgIyBUaGUgYXJndW1lbnQgbmFtZSBjaGFuZ2VkIGZyb20gc3RybSB0byBzdHJlYW0KICAgICAgICAgICAgIyBSZXRyeSB3aXRoIG9sZCBuYW1lLgogICAgICAgICAgICAjIFRoaXMgaXMgc28gdGhhdCBjb2RlIGNhbiBiZSB1c2VkIHdpdGggb2xkZXIgUHl0aG9uIHZlcnNpb25zCiAgICAgICAgICAgICMoZS5nLiBieSBEamFuZ28pCiAgICAgICAgICAgIGt3YXJnc1snc3RybSddID0ga3dhcmdzLnBvcCgnc3RyZWFtJykKICAgICAgICAgICAgcmVzdWx0ID0gZmFjdG9yeSgqKmt3YXJncykKICAgICAgICBpZiBmb3JtYXR0ZXI6CiAgICAgICAgICAgIHJlc3VsdC5zZXRGb3JtYXR0ZXIoZm9ybWF0dGVyKQogICAgICAgIGlmIGxldmVsIGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXN1bHQuc2V0TGV2ZWwoX2NoZWNrTGV2ZWwobGV2ZWwpKQogICAgICAgIGlmIGZpbHRlcnM6CiAgICAgICAgICAgIHNlbGYuYWRkX2ZpbHRlcnMocmVzdWx0LCBmaWx0ZXJzKQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgYWRkX2hhbmRsZXJzKHNlbGYsIGxvZ2dlciwgaGFuZGxlcnMpOgogICAgICAgICIiIkFkZCBoYW5kbGVycyB0byBhIGxvZ2dlciBmcm9tIGEgbGlzdCBvZiBuYW1lcy4iIiIKICAgICAgICBmb3IgaCBpbiBoYW5kbGVyczoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgbG9nZ2VyLmFkZEhhbmRsZXIoc2VsZi5jb25maWdbJ2hhbmRsZXJzJ11baF0pCiAgICAgICAgICAgIGV4Y2VwdCBTdGFuZGFyZEVycm9yIGFzIGU6CiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdVbmFibGUgdG8gYWRkIGhhbmRsZXIgJXI6ICVzJyAlIChoLCBlKSkKCiAgICBkZWYgY29tbW9uX2xvZ2dlcl9jb25maWcoc2VsZiwgbG9nZ2VyLCBjb25maWcsIGluY3JlbWVudGFsPUZhbHNlKToKICAgICAgICAiIiIKICAgICAgICBQZXJmb3JtIGNvbmZpZ3VyYXRpb24gd2hpY2ggaXMgY29tbW9uIHRvIHJvb3QgYW5kIG5vbi1yb290IGxvZ2dlcnMuCiAgICAgICAgIiIiCiAgICAgICAgbGV2ZWwgPSBjb25maWcuZ2V0KCdsZXZlbCcsIE5vbmUpCiAgICAgICAgaWYgbGV2ZWwgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGxvZ2dlci5zZXRMZXZlbChfY2hlY2tMZXZlbChsZXZlbCkpCiAgICAgICAgaWYgbm90IGluY3JlbWVudGFsOgogICAgICAgICAgICAjIFJlbW92ZSBhbnkgZXhpc3RpbmcgaGFuZGxlcnMKICAgICAgICAgICAgZm9yIGggaW4gbG9nZ2VyLmhhbmRsZXJzWzpdOgogICAgICAgICAgICAgICAgbG9nZ2VyLnJlbW92ZUhhbmRsZXIoaCkKICAgICAgICAgICAgaGFuZGxlcnMgPSBjb25maWcuZ2V0KCdoYW5kbGVycycsIE5vbmUpCiAgICAgICAgICAgIGlmIGhhbmRsZXJzOgogICAgICAgICAgICAgICAgc2VsZi5hZGRfaGFuZGxlcnMobG9nZ2VyLCBoYW5kbGVycykKICAgICAgICAgICAgZmlsdGVycyA9IGNvbmZpZy5nZXQoJ2ZpbHRlcnMnLCBOb25lKQogICAgICAgICAgICBpZiBmaWx0ZXJzOgogICAgICAgICAgICAgICAgc2VsZi5hZGRfZmlsdGVycyhsb2dnZXIsIGZpbHRlcnMpCgogICAgZGVmIGNvbmZpZ3VyZV9sb2dnZXIoc2VsZiwgbmFtZSwgY29uZmlnLCBpbmNyZW1lbnRhbD1GYWxzZSk6CiAgICAgICAgIiIiQ29uZmlndXJlIGEgbm9uLXJvb3QgbG9nZ2VyIGZyb20gYSBkaWN0aW9uYXJ5LiIiIgogICAgICAgIGxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKG5hbWUpCiAgICAgICAgc2VsZi5jb21tb25fbG9nZ2VyX2NvbmZpZyhsb2dnZXIsIGNvbmZpZywgaW5jcmVtZW50YWwpCiAgICAgICAgcHJvcGFnYXRlID0gY29uZmlnLmdldCgncHJvcGFnYXRlJywgTm9uZSkKICAgICAgICBpZiBwcm9wYWdhdGUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGxvZ2dlci5wcm9wYWdhdGUgPSBwcm9wYWdhdGUKCiAgICBkZWYgY29uZmlndXJlX3Jvb3Qoc2VsZiwgY29uZmlnLCBpbmNyZW1lbnRhbD1GYWxzZSk6CiAgICAgICAgIiIiQ29uZmlndXJlIGEgcm9vdCBsb2dnZXIgZnJvbSBhIGRpY3Rpb25hcnkuIiIiCiAgICAgICAgcm9vdCA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCkKICAgICAgICBzZWxmLmNvbW1vbl9sb2dnZXJfY29uZmlnKHJvb3QsIGNvbmZpZywgaW5jcmVtZW50YWwpCgpkaWN0Q29uZmlnQ2xhc3MgPSBEaWN0Q29uZmlndXJhdG9yCgoKZGVmIGRpY3RDb25maWcoY29uZmlnKToKICAgICIiIkNvbmZpZ3VyZSBsb2dnaW5nIHVzaW5nIGEgZGljdGlvbmFyeS4iIiIKICAgIGRpY3RDb25maWdDbGFzcyhjb25maWcpLmNvbmZpZ3VyZSgpClBLAwQUAAAAAAAAACEA/T8pUZl9AACZfQAALAAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL2Rvd25sb2FkLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBjZ2kKaW1wb3J0IGVtYWlsLnV0aWxzCmltcG9ydCBnZXRwYXNzCmltcG9ydCBqc29uCmltcG9ydCBsb2dnaW5nCmltcG9ydCBtaW1ldHlwZXMKaW1wb3J0IG9zCmltcG9ydCBwbGF0Zm9ybQppbXBvcnQgcmUKaW1wb3J0IHNodXRpbAppbXBvcnQgc3lzCmltcG9ydCB0ZW1wZmlsZQoKdHJ5OgogICAgaW1wb3J0IHNzbCAgIyBub3FhCiAgICBIQVNfVExTID0gVHJ1ZQpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBIQVNfVExTID0gRmFsc2UKCmZyb20gcGlwLl92ZW5kb3Iuc2l4Lm1vdmVzLnVybGxpYiBpbXBvcnQgcGFyc2UgYXMgdXJsbGliX3BhcnNlCmZyb20gcGlwLl92ZW5kb3Iuc2l4Lm1vdmVzLnVybGxpYiBpbXBvcnQgcmVxdWVzdCBhcyB1cmxsaWJfcmVxdWVzdAoKaW1wb3J0IHBpcAoKZnJvbSBwaXAuZXhjZXB0aW9ucyBpbXBvcnQgSW5zdGFsbGF0aW9uRXJyb3IsIEhhc2hNaXNtYXRjaApmcm9tIHBpcC5tb2RlbHMgaW1wb3J0IFB5UEkKZnJvbSBwaXAudXRpbHMgaW1wb3J0IChzcGxpdGV4dCwgcm10cmVlLCBmb3JtYXRfc2l6ZSwgZGlzcGxheV9wYXRoLAogICAgICAgICAgICAgICAgICAgICAgIGJhY2t1cF9kaXIsIGFza19wYXRoX2V4aXN0cywgdW5wYWNrX2ZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgQVJDSElWRV9FWFRFTlNJT05TLCBjb25zdW1lLCBjYWxsX3N1YnByb2Nlc3MpCmZyb20gcGlwLnV0aWxzLmVuY29kaW5nIGltcG9ydCBhdXRvX2RlY29kZQpmcm9tIHBpcC51dGlscy5maWxlc3lzdGVtIGltcG9ydCBjaGVja19wYXRoX293bmVyCmZyb20gcGlwLnV0aWxzLmxvZ2dpbmcgaW1wb3J0IGluZGVudF9sb2cKZnJvbSBwaXAudXRpbHMuc2V0dXB0b29sc19idWlsZCBpbXBvcnQgU0VUVVBUT09MU19TSElNCmZyb20gcGlwLnV0aWxzLmdsaWJjIGltcG9ydCBsaWJjX3Zlcgpmcm9tIHBpcC51dGlscy51aSBpbXBvcnQgRG93bmxvYWRQcm9ncmVzc0JhciwgRG93bmxvYWRQcm9ncmVzc1NwaW5uZXIKZnJvbSBwaXAubG9jYXRpb25zIGltcG9ydCB3cml0ZV9kZWxldGVfbWFya2VyX2ZpbGUKZnJvbSBwaXAudmNzIGltcG9ydCB2Y3MKZnJvbSBwaXAuX3ZlbmRvciBpbXBvcnQgcmVxdWVzdHMsIHNpeApmcm9tIHBpcC5fdmVuZG9yLnJlcXVlc3RzLmFkYXB0ZXJzIGltcG9ydCBCYXNlQWRhcHRlciwgSFRUUEFkYXB0ZXIKZnJvbSBwaXAuX3ZlbmRvci5yZXF1ZXN0cy5hdXRoIGltcG9ydCBBdXRoQmFzZSwgSFRUUEJhc2ljQXV0aApmcm9tIHBpcC5fdmVuZG9yLnJlcXVlc3RzLm1vZGVscyBpbXBvcnQgQ09OVEVOVF9DSFVOS19TSVpFLCBSZXNwb25zZQpmcm9tIHBpcC5fdmVuZG9yLnJlcXVlc3RzLnV0aWxzIGltcG9ydCBnZXRfbmV0cmNfYXV0aApmcm9tIHBpcC5fdmVuZG9yLnJlcXVlc3RzLnN0cnVjdHVyZXMgaW1wb3J0IENhc2VJbnNlbnNpdGl2ZURpY3QKZnJvbSBwaXAuX3ZlbmRvciBpbXBvcnQgdXJsbGliMwpmcm9tIHBpcC5fdmVuZG9yLmNhY2hlY29udHJvbCBpbXBvcnQgQ2FjaGVDb250cm9sQWRhcHRlcgpmcm9tIHBpcC5fdmVuZG9yLmNhY2hlY29udHJvbC5jYWNoZXMgaW1wb3J0IEZpbGVDYWNoZQpmcm9tIHBpcC5fdmVuZG9yLmxvY2tmaWxlIGltcG9ydCBMb2NrRXJyb3IKZnJvbSBwaXAuX3ZlbmRvci5zaXgubW92ZXMgaW1wb3J0IHhtbHJwY19jbGllbnQKCgpfX2FsbF9fID0gWydnZXRfZmlsZV9jb250ZW50JywKICAgICAgICAgICAnaXNfdXJsJywgJ3VybF90b19wYXRoJywgJ3BhdGhfdG9fdXJsJywKICAgICAgICAgICAnaXNfYXJjaGl2ZV9maWxlJywgJ3VucGFja192Y3NfbGluaycsCiAgICAgICAgICAgJ3VucGFja19maWxlX3VybCcsICdpc192Y3NfdXJsJywgJ2lzX2ZpbGVfdXJsJywKICAgICAgICAgICAndW5wYWNrX2h0dHBfdXJsJywgJ3VucGFja191cmwnXQoKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKCmRlZiB1c2VyX2FnZW50KCk6CiAgICAiIiIKICAgIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHVzZXIgYWdlbnQuCiAgICAiIiIKICAgIGRhdGEgPSB7CiAgICAgICAgImluc3RhbGxlciI6IHsibmFtZSI6ICJwaXAiLCAidmVyc2lvbiI6IHBpcC5fX3ZlcnNpb25fX30sCiAgICAgICAgInB5dGhvbiI6IHBsYXRmb3JtLnB5dGhvbl92ZXJzaW9uKCksCiAgICAgICAgImltcGxlbWVudGF0aW9uIjogewogICAgICAgICAgICAibmFtZSI6IHBsYXRmb3JtLnB5dGhvbl9pbXBsZW1lbnRhdGlvbigpLAogICAgICAgIH0sCiAgICB9CgogICAgaWYgZGF0YVsiaW1wbGVtZW50YXRpb24iXVsibmFtZSJdID09ICdDUHl0aG9uJzoKICAgICAgICBkYXRhWyJpbXBsZW1lbnRhdGlvbiJdWyJ2ZXJzaW9uIl0gPSBwbGF0Zm9ybS5weXRob25fdmVyc2lvbigpCiAgICBlbGlmIGRhdGFbImltcGxlbWVudGF0aW9uIl1bIm5hbWUiXSA9PSAnUHlQeSc6CiAgICAgICAgaWYgc3lzLnB5cHlfdmVyc2lvbl9pbmZvLnJlbGVhc2VsZXZlbCA9PSAnZmluYWwnOgogICAgICAgICAgICBweXB5X3ZlcnNpb25faW5mbyA9IHN5cy5weXB5X3ZlcnNpb25faW5mb1s6M10KICAgICAgICBlbHNlOgogICAgICAgICAgICBweXB5X3ZlcnNpb25faW5mbyA9IHN5cy5weXB5X3ZlcnNpb25faW5mbwogICAgICAgIGRhdGFbImltcGxlbWVudGF0aW9uIl1bInZlcnNpb24iXSA9ICIuIi5qb2luKAogICAgICAgICAgICBbc3RyKHgpIGZvciB4IGluIHB5cHlfdmVyc2lvbl9pbmZvXQogICAgICAgICkKICAgIGVsaWYgZGF0YVsiaW1wbGVtZW50YXRpb24iXVsibmFtZSJdID09ICdKeXRob24nOgogICAgICAgICMgQ29tcGxldGUgR3Vlc3MKICAgICAgICBkYXRhWyJpbXBsZW1lbnRhdGlvbiJdWyJ2ZXJzaW9uIl0gPSBwbGF0Zm9ybS5weXRob25fdmVyc2lvbigpCiAgICBlbGlmIGRhdGFbImltcGxlbWVudGF0aW9uIl1bIm5hbWUiXSA9PSAnSXJvblB5dGhvbic6CiAgICAgICAgIyBDb21wbGV0ZSBHdWVzcwogICAgICAgIGRhdGFbImltcGxlbWVudGF0aW9uIl1bInZlcnNpb24iXSA9IHBsYXRmb3JtLnB5dGhvbl92ZXJzaW9uKCkKCiAgICBpZiBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgibGludXgiKToKICAgICAgICBmcm9tIHBpcC5fdmVuZG9yIGltcG9ydCBkaXN0cm8KICAgICAgICBkaXN0cm9faW5mb3MgPSBkaWN0KGZpbHRlcigKICAgICAgICAgICAgbGFtYmRhIHg6IHhbMV0sCiAgICAgICAgICAgIHppcChbIm5hbWUiLCAidmVyc2lvbiIsICJpZCJdLCBkaXN0cm8ubGludXhfZGlzdHJpYnV0aW9uKCkpLAogICAgICAgICkpCiAgICAgICAgbGliYyA9IGRpY3QoZmlsdGVyKAogICAgICAgICAgICBsYW1iZGEgeDogeFsxXSwKICAgICAgICAgICAgemlwKFsibGliIiwgInZlcnNpb24iXSwgbGliY192ZXIoKSksCiAgICAgICAgKSkKICAgICAgICBpZiBsaWJjOgogICAgICAgICAgICBkaXN0cm9faW5mb3NbImxpYmMiXSA9IGxpYmMKICAgICAgICBpZiBkaXN0cm9faW5mb3M6CiAgICAgICAgICAgIGRhdGFbImRpc3RybyJdID0gZGlzdHJvX2luZm9zCgogICAgaWYgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoImRhcndpbiIpIGFuZCBwbGF0Zm9ybS5tYWNfdmVyKClbMF06CiAgICAgICAgZGF0YVsiZGlzdHJvIl0gPSB7Im5hbWUiOiAibWFjT1MiLCAidmVyc2lvbiI6IHBsYXRmb3JtLm1hY192ZXIoKVswXX0KCiAgICBpZiBwbGF0Zm9ybS5zeXN0ZW0oKToKICAgICAgICBkYXRhLnNldGRlZmF1bHQoInN5c3RlbSIsIHt9KVsibmFtZSJdID0gcGxhdGZvcm0uc3lzdGVtKCkKCiAgICBpZiBwbGF0Zm9ybS5yZWxlYXNlKCk6CiAgICAgICAgZGF0YS5zZXRkZWZhdWx0KCJzeXN0ZW0iLCB7fSlbInJlbGVhc2UiXSA9IHBsYXRmb3JtLnJlbGVhc2UoKQoKICAgIGlmIHBsYXRmb3JtLm1hY2hpbmUoKToKICAgICAgICBkYXRhWyJjcHUiXSA9IHBsYXRmb3JtLm1hY2hpbmUoKQoKICAgICMgUHl0aG9uIDIuNiBkb2Vzbid0IGhhdmUgc3NsLk9QRU5TU0xfVkVSU0lPTi4KICAgIGlmIEhBU19UTFMgYW5kIHN5cy52ZXJzaW9uX2luZm9bOjJdID4gKDIsIDYpOgogICAgICAgIGRhdGFbIm9wZW5zc2xfdmVyc2lvbiJdID0gc3NsLk9QRU5TU0xfVkVSU0lPTgoKICAgIHJldHVybiAie2RhdGFbaW5zdGFsbGVyXVtuYW1lXX0ve2RhdGFbaW5zdGFsbGVyXVt2ZXJzaW9uXX0ge2pzb259Ii5mb3JtYXQoCiAgICAgICAgZGF0YT1kYXRhLAogICAgICAgIGpzb249anNvbi5kdW1wcyhkYXRhLCBzZXBhcmF0b3JzPSgiLCIsICI6IiksIHNvcnRfa2V5cz1UcnVlKSwKICAgICkKCgpjbGFzcyBNdWx0aURvbWFpbkJhc2ljQXV0aChBdXRoQmFzZSk6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHByb21wdGluZz1UcnVlKToKICAgICAgICBzZWxmLnByb21wdGluZyA9IHByb21wdGluZwogICAgICAgIHNlbGYucGFzc3dvcmRzID0ge30KCiAgICBkZWYgX19jYWxsX18oc2VsZiwgcmVxKToKICAgICAgICBwYXJzZWQgPSB1cmxsaWJfcGFyc2UudXJscGFyc2UocmVxLnVybCkKCiAgICAgICAgIyBHZXQgdGhlIG5ldGxvYyB3aXRob3V0IGFueSBlbWJlZGRlZCBjcmVkZW50aWFscwogICAgICAgIG5ldGxvYyA9IHBhcnNlZC5uZXRsb2MucnNwbGl0KCJAIiwgMSlbLTFdCgogICAgICAgICMgU2V0IHRoZSB1cmwgb2YgdGhlIHJlcXVlc3QgdG8gdGhlIHVybCB3aXRob3V0IGFueSBjcmVkZW50aWFscwogICAgICAgIHJlcS51cmwgPSB1cmxsaWJfcGFyc2UudXJsdW5wYXJzZShwYXJzZWRbOjFdICsgKG5ldGxvYywpICsgcGFyc2VkWzI6XSkKCiAgICAgICAgIyBVc2UgYW55IHN0b3JlZCBjcmVkZW50aWFscyB0aGF0IHdlIGhhdmUgZm9yIHRoaXMgbmV0bG9jCiAgICAgICAgdXNlcm5hbWUsIHBhc3N3b3JkID0gc2VsZi5wYXNzd29yZHMuZ2V0KG5ldGxvYywgKE5vbmUsIE5vbmUpKQoKICAgICAgICAjIEV4dHJhY3QgY3JlZGVudGlhbHMgZW1iZWRkZWQgaW4gdGhlIHVybCBpZiB3ZSBoYXZlIG5vbmUgc3RvcmVkCiAgICAgICAgaWYgdXNlcm5hbWUgaXMgTm9uZToKICAgICAgICAgICAgdXNlcm5hbWUsIHBhc3N3b3JkID0gc2VsZi5wYXJzZV9jcmVkZW50aWFscyhwYXJzZWQubmV0bG9jKQoKICAgICAgICAjIEdldCBjcmVkcyBmcm9tIG5ldHJjIGlmIHdlIHN0aWxsIGRvbid0IGhhdmUgdGhlbQogICAgICAgIGlmIHVzZXJuYW1lIGlzIE5vbmUgYW5kIHBhc3N3b3JkIGlzIE5vbmU6CiAgICAgICAgICAgIG5ldHJjX2F1dGggPSBnZXRfbmV0cmNfYXV0aChyZXEudXJsKQogICAgICAgICAgICB1c2VybmFtZSwgcGFzc3dvcmQgPSBuZXRyY19hdXRoIGlmIG5ldHJjX2F1dGggZWxzZSAoTm9uZSwgTm9uZSkKCiAgICAgICAgaWYgdXNlcm5hbWUgb3IgcGFzc3dvcmQ6CiAgICAgICAgICAgICMgU3RvcmUgdGhlIHVzZXJuYW1lIGFuZCBwYXNzd29yZAogICAgICAgICAgICBzZWxmLnBhc3N3b3Jkc1tuZXRsb2NdID0gKHVzZXJuYW1lLCBwYXNzd29yZCkKCiAgICAgICAgICAgICMgU2VuZCB0aGUgYmFzaWMgYXV0aCB3aXRoIHRoaXMgcmVxdWVzdAogICAgICAgICAgICByZXEgPSBIVFRQQmFzaWNBdXRoKHVzZXJuYW1lIG9yICIiLCBwYXNzd29yZCBvciAiIikocmVxKQoKICAgICAgICAjIEF0dGFjaCBhIGhvb2sgdG8gaGFuZGxlIDQwMSByZXNwb25zZXMKICAgICAgICByZXEucmVnaXN0ZXJfaG9vaygicmVzcG9uc2UiLCBzZWxmLmhhbmRsZV80MDEpCgogICAgICAgIHJldHVybiByZXEKCiAgICBkZWYgaGFuZGxlXzQwMShzZWxmLCByZXNwLCAqKmt3YXJncyk6CiAgICAgICAgIyBXZSBvbmx5IGNhcmUgYWJvdXQgNDAxIHJlc3BvbnNlcywgYW55dGhpbmcgZWxzZSB3ZSB3YW50IHRvIGp1c3QKICAgICAgICAjICAgcGFzcyB0aHJvdWdoIHRoZSBhY3R1YWwgcmVzcG9uc2UKICAgICAgICBpZiByZXNwLnN0YXR1c19jb2RlICE9IDQwMToKICAgICAgICAgICAgcmV0dXJuIHJlc3AKCiAgICAgICAgIyBXZSBhcmUgbm90IGFibGUgdG8gcHJvbXB0IHRoZSB1c2VyIHNvIHNpbXBseSByZXR1cm4gdGhlIHJlc3BvbnNlCiAgICAgICAgaWYgbm90IHNlbGYucHJvbXB0aW5nOgogICAgICAgICAgICByZXR1cm4gcmVzcAoKICAgICAgICBwYXJzZWQgPSB1cmxsaWJfcGFyc2UudXJscGFyc2UocmVzcC51cmwpCgogICAgICAgICMgUHJvbXB0IHRoZSB1c2VyIGZvciBhIG5ldyB1c2VybmFtZSBhbmQgcGFzc3dvcmQKICAgICAgICB1c2VybmFtZSA9IHNpeC5tb3Zlcy5pbnB1dCgiVXNlciBmb3IgJXM6ICIgJSBwYXJzZWQubmV0bG9jKQogICAgICAgIHBhc3N3b3JkID0gZ2V0cGFzcy5nZXRwYXNzKCJQYXNzd29yZDogIikKCiAgICAgICAgIyBTdG9yZSB0aGUgbmV3IHVzZXJuYW1lIGFuZCBwYXNzd29yZCB0byB1c2UgZm9yIGZ1dHVyZSByZXF1ZXN0cwogICAgICAgIGlmIHVzZXJuYW1lIG9yIHBhc3N3b3JkOgogICAgICAgICAgICBzZWxmLnBhc3N3b3Jkc1twYXJzZWQubmV0bG9jXSA9ICh1c2VybmFtZSwgcGFzc3dvcmQpCgogICAgICAgICMgQ29uc3VtZSBjb250ZW50IGFuZCByZWxlYXNlIHRoZSBvcmlnaW5hbCBjb25uZWN0aW9uIHRvIGFsbG93IG91ciBuZXcKICAgICAgICAjICAgcmVxdWVzdCB0byByZXVzZSB0aGUgc2FtZSBvbmUuCiAgICAgICAgcmVzcC5jb250ZW50CiAgICAgICAgcmVzcC5yYXcucmVsZWFzZV9jb25uKCkKCiAgICAgICAgIyBBZGQgb3VyIG5ldyB1c2VybmFtZSBhbmQgcGFzc3dvcmQgdG8gdGhlIHJlcXVlc3QKICAgICAgICByZXEgPSBIVFRQQmFzaWNBdXRoKHVzZXJuYW1lIG9yICIiLCBwYXNzd29yZCBvciAiIikocmVzcC5yZXF1ZXN0KQoKICAgICAgICAjIFNlbmQgb3VyIG5ldyByZXF1ZXN0CiAgICAgICAgbmV3X3Jlc3AgPSByZXNwLmNvbm5lY3Rpb24uc2VuZChyZXEsICoqa3dhcmdzKQogICAgICAgIG5ld19yZXNwLmhpc3RvcnkuYXBwZW5kKHJlc3ApCgogICAgICAgIHJldHVybiBuZXdfcmVzcAoKICAgIGRlZiBwYXJzZV9jcmVkZW50aWFscyhzZWxmLCBuZXRsb2MpOgogICAgICAgIGlmICJAIiBpbiBuZXRsb2M6CiAgICAgICAgICAgIHVzZXJpbmZvID0gbmV0bG9jLnJzcGxpdCgiQCIsIDEpWzBdCiAgICAgICAgICAgIGlmICI6IiBpbiB1c2VyaW5mbzoKICAgICAgICAgICAgICAgIHJldHVybiB1c2VyaW5mby5zcGxpdCgiOiIsIDEpCiAgICAgICAgICAgIHJldHVybiB1c2VyaW5mbywgTm9uZQogICAgICAgIHJldHVybiBOb25lLCBOb25lCgoKY2xhc3MgTG9jYWxGU0FkYXB0ZXIoQmFzZUFkYXB0ZXIpOgoKICAgIGRlZiBzZW5kKHNlbGYsIHJlcXVlc3QsIHN0cmVhbT1Ob25lLCB0aW1lb3V0PU5vbmUsIHZlcmlmeT1Ob25lLCBjZXJ0PU5vbmUsCiAgICAgICAgICAgICBwcm94aWVzPU5vbmUpOgogICAgICAgIHBhdGhuYW1lID0gdXJsX3RvX3BhdGgocmVxdWVzdC51cmwpCgogICAgICAgIHJlc3AgPSBSZXNwb25zZSgpCiAgICAgICAgcmVzcC5zdGF0dXNfY29kZSA9IDIwMAogICAgICAgIHJlc3AudXJsID0gcmVxdWVzdC51cmwKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzdGF0cyA9IG9zLnN0YXQocGF0aG5hbWUpCiAgICAgICAgZXhjZXB0IE9TRXJyb3IgYXMgZXhjOgogICAgICAgICAgICByZXNwLnN0YXR1c19jb2RlID0gNDA0CiAgICAgICAgICAgIHJlc3AucmF3ID0gZXhjCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbW9kaWZpZWQgPSBlbWFpbC51dGlscy5mb3JtYXRkYXRlKHN0YXRzLnN0X210aW1lLCB1c2VnbXQ9VHJ1ZSkKICAgICAgICAgICAgY29udGVudF90eXBlID0gbWltZXR5cGVzLmd1ZXNzX3R5cGUocGF0aG5hbWUpWzBdIG9yICJ0ZXh0L3BsYWluIgogICAgICAgICAgICByZXNwLmhlYWRlcnMgPSBDYXNlSW5zZW5zaXRpdmVEaWN0KHsKICAgICAgICAgICAgICAgICJDb250ZW50LVR5cGUiOiBjb250ZW50X3R5cGUsCiAgICAgICAgICAgICAgICAiQ29udGVudC1MZW5ndGgiOiBzdGF0cy5zdF9zaXplLAogICAgICAgICAgICAgICAgIkxhc3QtTW9kaWZpZWQiOiBtb2RpZmllZCwKICAgICAgICAgICAgfSkKCiAgICAgICAgICAgIHJlc3AucmF3ID0gb3BlbihwYXRobmFtZSwgInJiIikKICAgICAgICAgICAgcmVzcC5jbG9zZSA9IHJlc3AucmF3LmNsb3NlCgogICAgICAgIHJldHVybiByZXNwCgogICAgZGVmIGNsb3NlKHNlbGYpOgogICAgICAgIHBhc3MKCgpjbGFzcyBTYWZlRmlsZUNhY2hlKEZpbGVDYWNoZSk6CiAgICAiIiIKICAgIEEgZmlsZSBiYXNlZCBjYWNoZSB3aGljaCBpcyBzYWZlIHRvIHVzZSBldmVuIHdoZW4gdGhlIHRhcmdldCBkaXJlY3RvcnkgbWF5CiAgICBub3QgYmUgYWNjZXNzaWJsZSBvciB3cml0YWJsZS4KICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgIHN1cGVyKFNhZmVGaWxlQ2FjaGUsIHNlbGYpLl9faW5pdF9fKCphcmdzLCAqKmt3YXJncykKCiAgICAgICAgIyBDaGVjayB0byBlbnN1cmUgdGhhdCB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgb3VyIGNhY2hlIGRpcmVjdG9yeQogICAgICAgICMgaXMgb3duZWQgYnkgdGhlIHVzZXIgY3VycmVudCBleGVjdXRpbmcgcGlwLiBJZiBpdCBkb2VzIG5vdCBleGlzdAogICAgICAgICMgd2Ugd2lsbCBjaGVjayB0aGUgcGFyZW50IGRpcmVjdG9yeSB1bnRpbCB3ZSBmaW5kIG9uZSB0aGF0IGRvZXMgZXhpc3QuCiAgICAgICAgIyBJZiBpdCBpcyBub3Qgb3duZWQgYnkgdGhlIHVzZXIgZXhlY3V0aW5nIHBpcCB0aGVuIHdlIHdpbGwgZGlzYWJsZQogICAgICAgICMgdGhlIGNhY2hlIGFuZCBsb2cgYSB3YXJuaW5nLgogICAgICAgIGlmIG5vdCBjaGVja19wYXRoX293bmVyKHNlbGYuZGlyZWN0b3J5KToKICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICAgICAiVGhlIGRpcmVjdG9yeSAnJXMnIG9yIGl0cyBwYXJlbnQgZGlyZWN0b3J5IGlzIG5vdCBvd25lZCBieSAiCiAgICAgICAgICAgICAgICAidGhlIGN1cnJlbnQgdXNlciBhbmQgdGhlIGNhY2hlIGhhcyBiZWVuIGRpc2FibGVkLiBQbGVhc2UgIgogICAgICAgICAgICAgICAgImNoZWNrIHRoZSBwZXJtaXNzaW9ucyBhbmQgb3duZXIgb2YgdGhhdCBkaXJlY3RvcnkuIElmICIKICAgICAgICAgICAgICAgICJleGVjdXRpbmcgcGlwIHdpdGggc3VkbywgeW91IG1heSB3YW50IHN1ZG8ncyAtSCBmbGFnLiIsCiAgICAgICAgICAgICAgICBzZWxmLmRpcmVjdG9yeSwKICAgICAgICAgICAgKQoKICAgICAgICAgICAgIyBTZXQgb3VyIGRpcmVjdG9yeSB0byBOb25lIHRvIGRpc2FibGUgdGhlIENhY2hlCiAgICAgICAgICAgIHNlbGYuZGlyZWN0b3J5ID0gTm9uZQoKICAgIGRlZiBnZXQoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAjIElmIHdlIGRvbid0IGhhdmUgYSBkaXJlY3RvcnksIHRoZW4gdGhlIGNhY2hlIHNob3VsZCBiZSBhIG5vLW9wLgogICAgICAgIGlmIHNlbGYuZGlyZWN0b3J5IGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzdXBlcihTYWZlRmlsZUNhY2hlLCBzZWxmKS5nZXQoKmFyZ3MsICoqa3dhcmdzKQogICAgICAgIGV4Y2VwdCAoTG9ja0Vycm9yLCBPU0Vycm9yLCBJT0Vycm9yKToKICAgICAgICAgICAgIyBXZSBpbnRlbnRpb25hbGx5IHNpbGVuY2UgdGhpcyBlcnJvciwgaWYgd2UgY2FuJ3QgYWNjZXNzIHRoZSBjYWNoZQogICAgICAgICAgICAjIHRoZW4gd2UgY2FuIGp1c3Qgc2tpcCBjYWNoaW5nIGFuZCBwcm9jZXNzIHRoZSByZXF1ZXN0IGFzIGlmCiAgICAgICAgICAgICMgY2FjaGluZyB3YXNuJ3QgZW5hYmxlZC4KICAgICAgICAgICAgcGFzcwoKICAgIGRlZiBzZXQoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAjIElmIHdlIGRvbid0IGhhdmUgYSBkaXJlY3RvcnksIHRoZW4gdGhlIGNhY2hlIHNob3VsZCBiZSBhIG5vLW9wLgogICAgICAgIGlmIHNlbGYuZGlyZWN0b3J5IGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzdXBlcihTYWZlRmlsZUNhY2hlLCBzZWxmKS5zZXQoKmFyZ3MsICoqa3dhcmdzKQogICAgICAgIGV4Y2VwdCAoTG9ja0Vycm9yLCBPU0Vycm9yLCBJT0Vycm9yKToKICAgICAgICAgICAgIyBXZSBpbnRlbnRpb25hbGx5IHNpbGVuY2UgdGhpcyBlcnJvciwgaWYgd2UgY2FuJ3QgYWNjZXNzIHRoZSBjYWNoZQogICAgICAgICAgICAjIHRoZW4gd2UgY2FuIGp1c3Qgc2tpcCBjYWNoaW5nIGFuZCBwcm9jZXNzIHRoZSByZXF1ZXN0IGFzIGlmCiAgICAgICAgICAgICMgY2FjaGluZyB3YXNuJ3QgZW5hYmxlZC4KICAgICAgICAgICAgcGFzcwoKICAgIGRlZiBkZWxldGUoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAjIElmIHdlIGRvbid0IGhhdmUgYSBkaXJlY3RvcnksIHRoZW4gdGhlIGNhY2hlIHNob3VsZCBiZSBhIG5vLW9wLgogICAgICAgIGlmIHNlbGYuZGlyZWN0b3J5IGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzdXBlcihTYWZlRmlsZUNhY2hlLCBzZWxmKS5kZWxldGUoKmFyZ3MsICoqa3dhcmdzKQogICAgICAgIGV4Y2VwdCAoTG9ja0Vycm9yLCBPU0Vycm9yLCBJT0Vycm9yKToKICAgICAgICAgICAgIyBXZSBpbnRlbnRpb25hbGx5IHNpbGVuY2UgdGhpcyBlcnJvciwgaWYgd2UgY2FuJ3QgYWNjZXNzIHRoZSBjYWNoZQogICAgICAgICAgICAjIHRoZW4gd2UgY2FuIGp1c3Qgc2tpcCBjYWNoaW5nIGFuZCBwcm9jZXNzIHRoZSByZXF1ZXN0IGFzIGlmCiAgICAgICAgICAgICMgY2FjaGluZyB3YXNuJ3QgZW5hYmxlZC4KICAgICAgICAgICAgcGFzcwoKCmNsYXNzIEluc2VjdXJlSFRUUEFkYXB0ZXIoSFRUUEFkYXB0ZXIpOgoKICAgIGRlZiBjZXJ0X3ZlcmlmeShzZWxmLCBjb25uLCB1cmwsIHZlcmlmeSwgY2VydCk6CiAgICAgICAgY29ubi5jZXJ0X3JlcXMgPSAnQ0VSVF9OT05FJwogICAgICAgIGNvbm4uY2FfY2VydHMgPSBOb25lCgoKY2xhc3MgUGlwU2Vzc2lvbihyZXF1ZXN0cy5TZXNzaW9uKToKCiAgICB0aW1lb3V0ID0gTm9uZQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgIHJldHJpZXMgPSBrd2FyZ3MucG9wKCJyZXRyaWVzIiwgMCkKICAgICAgICBjYWNoZSA9IGt3YXJncy5wb3AoImNhY2hlIiwgTm9uZSkKICAgICAgICBpbnNlY3VyZV9ob3N0cyA9IGt3YXJncy5wb3AoImluc2VjdXJlX2hvc3RzIiwgW10pCgogICAgICAgIHN1cGVyKFBpcFNlc3Npb24sIHNlbGYpLl9faW5pdF9fKCphcmdzLCAqKmt3YXJncykKCiAgICAgICAgIyBBdHRhY2ggb3VyIFVzZXIgQWdlbnQgdG8gdGhlIHJlcXVlc3QKICAgICAgICBzZWxmLmhlYWRlcnNbIlVzZXItQWdlbnQiXSA9IHVzZXJfYWdlbnQoKQoKICAgICAgICAjIEF0dGFjaCBvdXIgQXV0aGVudGljYXRpb24gaGFuZGxlciB0byB0aGUgc2Vzc2lvbgogICAgICAgIHNlbGYuYXV0aCA9IE11bHRpRG9tYWluQmFzaWNBdXRoKCkKCiAgICAgICAgIyBDcmVhdGUgb3VyIHVybGxpYjMuUmV0cnkgaW5zdGFuY2Ugd2hpY2ggd2lsbCBhbGxvdyB1cyB0byBjdXN0b21pemUKICAgICAgICAjIGhvdyB3ZSBoYW5kbGUgcmV0cmllcy4KICAgICAgICByZXRyaWVzID0gdXJsbGliMy5SZXRyeSgKICAgICAgICAgICAgIyBTZXQgdGhlIHRvdGFsIG51bWJlciBvZiByZXRyaWVzIHRoYXQgYSBwYXJ0aWN1bGFyIHJlcXVlc3QgY2FuCiAgICAgICAgICAgICMgaGF2ZS4KICAgICAgICAgICAgdG90YWw9cmV0cmllcywKCiAgICAgICAgICAgICMgQSA1MDMgZXJyb3IgZnJvbSBQeVBJIHR5cGljYWxseSBtZWFucyB0aGF0IHRoZSBGYXN0bHkgLT4gT3JpZ2luCiAgICAgICAgICAgICMgY29ubmVjdGlvbiBnb3QgaW50ZXJydXB0ZWQgaW4gc29tZSB3YXkuIEEgNTAzIGVycm9yIGluIGdlbmVyYWwKICAgICAgICAgICAgIyBpcyB0eXBpY2FsbHkgY29uc2lkZXJlZCBhIHRyYW5zaWVudCBlcnJvciBzbyB3ZSdsbCBnbyBhaGVhZCBhbmQKICAgICAgICAgICAgIyByZXRyeSBpdC4KICAgICAgICAgICAgc3RhdHVzX2ZvcmNlbGlzdD1bNTAzXSwKCiAgICAgICAgICAgICMgQWRkIGEgc21hbGwgYW1vdW50IG9mIGJhY2sgb2ZmIGJldHdlZW4gZmFpbGVkIHJlcXVlc3RzIGluCiAgICAgICAgICAgICMgb3JkZXIgdG8gcHJldmVudCBoYW1tZXJpbmcgdGhlIHNlcnZpY2UuCiAgICAgICAgICAgIGJhY2tvZmZfZmFjdG9yPTAuMjUsCiAgICAgICAgKQoKICAgICAgICAjIFdlIHdhbnQgdG8gX29ubHlfIGNhY2hlIHJlc3BvbnNlcyBvbiBzZWN1cmVseSBmZXRjaGVkIG9yaWdpbnMuIFdlIGRvCiAgICAgICAgIyB0aGlzIGJlY2F1c2Ugd2UgY2FuJ3QgdmFsaWRhdGUgdGhlIHJlc3BvbnNlIG9mIGFuIGluc2VjdXJlbHkgZmV0Y2hlZAogICAgICAgICMgb3JpZ2luLCBhbmQgd2UgZG9uJ3Qgd2FudCBzb21lb25lIHRvIGJlIGFibGUgdG8gcG9pc29uIHRoZSBjYWNoZSBhbmQKICAgICAgICAjIHJlcXVpcmUgbWFudWFsIGV2aWN0aW9uIGZyb20gdGhlIGNhY2hlIHRvIGZpeCBpdC4KICAgICAgICBpZiBjYWNoZToKICAgICAgICAgICAgc2VjdXJlX2FkYXB0ZXIgPSBDYWNoZUNvbnRyb2xBZGFwdGVyKAogICAgICAgICAgICAgICAgY2FjaGU9U2FmZUZpbGVDYWNoZShjYWNoZSwgdXNlX2Rpcl9sb2NrPVRydWUpLAogICAgICAgICAgICAgICAgbWF4X3JldHJpZXM9cmV0cmllcywKICAgICAgICAgICAgKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlY3VyZV9hZGFwdGVyID0gSFRUUEFkYXB0ZXIobWF4X3JldHJpZXM9cmV0cmllcykKCiAgICAgICAgIyBPdXIgSW5zZWN1cmUgSFRUUEFkYXB0ZXIgZGlzYWJsZXMgSFRUUFMgdmFsaWRhdGlvbi4gSXQgZG9lcyBub3QKICAgICAgICAjIHN1cHBvcnQgY2FjaGluZyAoc2VlIGFib3ZlKSBzbyB3ZSdsbCB1c2UgaXQgZm9yIGFsbCBodHRwOi8vIFVSTHMgYXMKICAgICAgICAjIHdlbGwgYXMgYW55IGh0dHBzOi8vIGhvc3QgdGhhdCB3ZSd2ZSBtYXJrZWQgYXMgaWdub3JpbmcgVExTIGVycm9ycwogICAgICAgICMgZm9yLgogICAgICAgIGluc2VjdXJlX2FkYXB0ZXIgPSBJbnNlY3VyZUhUVFBBZGFwdGVyKG1heF9yZXRyaWVzPXJldHJpZXMpCgogICAgICAgIHNlbGYubW91bnQoImh0dHBzOi8vIiwgc2VjdXJlX2FkYXB0ZXIpCiAgICAgICAgc2VsZi5tb3VudCgiaHR0cDovLyIsIGluc2VjdXJlX2FkYXB0ZXIpCgogICAgICAgICMgRW5hYmxlIGZpbGU6Ly8gdXJscwogICAgICAgIHNlbGYubW91bnQoImZpbGU6Ly8iLCBMb2NhbEZTQWRhcHRlcigpKQoKICAgICAgICAjIFdlIHdhbnQgdG8gdXNlIGEgbm9uLXZhbGlkYXRpbmcgYWRhcHRlciBmb3IgYW55IHJlcXVlc3RzIHdoaWNoIGFyZQogICAgICAgICMgZGVlbWVkIGluc2VjdXJlLgogICAgICAgIGZvciBob3N0IGluIGluc2VjdXJlX2hvc3RzOgogICAgICAgICAgICBzZWxmLm1vdW50KCJodHRwczovL3swfS8iLmZvcm1hdChob3N0KSwgaW5zZWN1cmVfYWRhcHRlcikKCiAgICBkZWYgcmVxdWVzdChzZWxmLCBtZXRob2QsIHVybCwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAjIEFsbG93IHNldHRpbmcgYSBkZWZhdWx0IHRpbWVvdXQgb24gYSBzZXNzaW9uCiAgICAgICAga3dhcmdzLnNldGRlZmF1bHQoInRpbWVvdXQiLCBzZWxmLnRpbWVvdXQpCgogICAgICAgICMgRGlzcGF0Y2ggdGhlIGFjdHVhbCByZXF1ZXN0CiAgICAgICAgcmV0dXJuIHN1cGVyKFBpcFNlc3Npb24sIHNlbGYpLnJlcXVlc3QobWV0aG9kLCB1cmwsICphcmdzLCAqKmt3YXJncykKCgpkZWYgZ2V0X2ZpbGVfY29udGVudCh1cmwsIGNvbWVzX2Zyb209Tm9uZSwgc2Vzc2lvbj1Ob25lKToKICAgICIiIkdldHMgdGhlIGNvbnRlbnQgb2YgYSBmaWxlOyBpdCBtYXkgYmUgYSBmaWxlbmFtZSwgZmlsZTogVVJMLCBvcgogICAgaHR0cDogVVJMLiAgUmV0dXJucyAobG9jYXRpb24sIGNvbnRlbnQpLiAgQ29udGVudCBpcyB1bmljb2RlLiIiIgogICAgaWYgc2Vzc2lvbiBpcyBOb25lOgogICAgICAgIHJhaXNlIFR5cGVFcnJvcigKICAgICAgICAgICAgImdldF9maWxlX2NvbnRlbnQoKSBtaXNzaW5nIDEgcmVxdWlyZWQga2V5d29yZCBhcmd1bWVudDogJ3Nlc3Npb24nIgogICAgICAgICkKCiAgICBtYXRjaCA9IF9zY2hlbWVfcmUuc2VhcmNoKHVybCkKICAgIGlmIG1hdGNoOgogICAgICAgIHNjaGVtZSA9IG1hdGNoLmdyb3VwKDEpLmxvd2VyKCkKICAgICAgICBpZiAoc2NoZW1lID09ICdmaWxlJyBhbmQgY29tZXNfZnJvbSBhbmQKICAgICAgICAgICAgICAgIGNvbWVzX2Zyb20uc3RhcnRzd2l0aCgnaHR0cCcpKToKICAgICAgICAgICAgcmFpc2UgSW5zdGFsbGF0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAnUmVxdWlyZW1lbnRzIGZpbGUgJXMgcmVmZXJlbmNlcyBVUkwgJXMsIHdoaWNoIGlzIGxvY2FsJwogICAgICAgICAgICAgICAgJSAoY29tZXNfZnJvbSwgdXJsKSkKICAgICAgICBpZiBzY2hlbWUgPT0gJ2ZpbGUnOgogICAgICAgICAgICBwYXRoID0gdXJsLnNwbGl0KCc6JywgMSlbMV0KICAgICAgICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgnXFwnLCAnLycpCiAgICAgICAgICAgIG1hdGNoID0gX3VybF9zbGFzaF9kcml2ZV9yZS5tYXRjaChwYXRoKQogICAgICAgICAgICBpZiBtYXRjaDoKICAgICAgICAgICAgICAgIHBhdGggPSBtYXRjaC5ncm91cCgxKSArICc6JyArIHBhdGguc3BsaXQoJ3wnLCAxKVsxXQogICAgICAgICAgICBwYXRoID0gdXJsbGliX3BhcnNlLnVucXVvdGUocGF0aCkKICAgICAgICAgICAgaWYgcGF0aC5zdGFydHN3aXRoKCcvJyk6CiAgICAgICAgICAgICAgICBwYXRoID0gJy8nICsgcGF0aC5sc3RyaXAoJy8nKQogICAgICAgICAgICB1cmwgPSBwYXRoCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBGSVhNRTogY2F0Y2ggc29tZSBlcnJvcnMKICAgICAgICAgICAgcmVzcCA9IHNlc3Npb24uZ2V0KHVybCkKICAgICAgICAgICAgcmVzcC5yYWlzZV9mb3Jfc3RhdHVzKCkKICAgICAgICAgICAgcmV0dXJuIHJlc3AudXJsLCByZXNwLnRleHQKICAgIHRyeToKICAgICAgICB3aXRoIG9wZW4odXJsLCAncmInKSBhcyBmOgogICAgICAgICAgICBjb250ZW50ID0gYXV0b19kZWNvZGUoZi5yZWFkKCkpCiAgICBleGNlcHQgSU9FcnJvciBhcyBleGM6CiAgICAgICAgcmFpc2UgSW5zdGFsbGF0aW9uRXJyb3IoCiAgICAgICAgICAgICdDb3VsZCBub3Qgb3BlbiByZXF1aXJlbWVudHMgZmlsZTogJXMnICUgc3RyKGV4YykKICAgICAgICApCiAgICByZXR1cm4gdXJsLCBjb250ZW50CgoKX3NjaGVtZV9yZSA9IHJlLmNvbXBpbGUocideKGh0dHB8aHR0cHN8ZmlsZSk6JywgcmUuSSkKX3VybF9zbGFzaF9kcml2ZV9yZSA9IHJlLmNvbXBpbGUocicvKihbYS16XSlcfCcsIHJlLkkpCgoKZGVmIGlzX3VybChuYW1lKToKICAgICIiIlJldHVybnMgdHJ1ZSBpZiB0aGUgbmFtZSBsb29rcyBsaWtlIGEgVVJMIiIiCiAgICBpZiAnOicgbm90IGluIG5hbWU6CiAgICAgICAgcmV0dXJuIEZhbHNlCiAgICBzY2hlbWUgPSBuYW1lLnNwbGl0KCc6JywgMSlbMF0ubG93ZXIoKQogICAgcmV0dXJuIHNjaGVtZSBpbiBbJ2h0dHAnLCAnaHR0cHMnLCAnZmlsZScsICdmdHAnXSArIHZjcy5hbGxfc2NoZW1lcwoKCmRlZiB1cmxfdG9fcGF0aCh1cmwpOgogICAgIiIiCiAgICBDb252ZXJ0IGEgZmlsZTogVVJMIHRvIGEgcGF0aC4KICAgICIiIgogICAgYXNzZXJ0IHVybC5zdGFydHN3aXRoKCdmaWxlOicpLCAoCiAgICAgICAgIllvdSBjYW4gb25seSB0dXJuIGZpbGU6IHVybHMgaW50byBmaWxlbmFtZXMgKG5vdCAlcikiICUgdXJsKQoKICAgIF8sIG5ldGxvYywgcGF0aCwgXywgXyA9IHVybGxpYl9wYXJzZS51cmxzcGxpdCh1cmwpCgogICAgIyBpZiB3ZSBoYXZlIGEgVU5DIHBhdGgsIHByZXBlbmQgVU5DIHNoYXJlIG5vdGF0aW9uCiAgICBpZiBuZXRsb2M6CiAgICAgICAgbmV0bG9jID0gJ1xcXFwnICsgbmV0bG9jCgogICAgcGF0aCA9IHVybGxpYl9yZXF1ZXN0LnVybDJwYXRobmFtZShuZXRsb2MgKyBwYXRoKQogICAgcmV0dXJuIHBhdGgKCgpkZWYgcGF0aF90b191cmwocGF0aCk6CiAgICAiIiIKICAgIENvbnZlcnQgYSBwYXRoIHRvIGEgZmlsZTogVVJMLiAgVGhlIHBhdGggd2lsbCBiZSBtYWRlIGFic29sdXRlIGFuZCBoYXZlCiAgICBxdW90ZWQgcGF0aCBwYXJ0cy4KICAgICIiIgogICAgcGF0aCA9IG9zLnBhdGgubm9ybXBhdGgob3MucGF0aC5hYnNwYXRoKHBhdGgpKQogICAgdXJsID0gdXJsbGliX3BhcnNlLnVybGpvaW4oJ2ZpbGU6JywgdXJsbGliX3JlcXVlc3QucGF0aG5hbWUydXJsKHBhdGgpKQogICAgcmV0dXJuIHVybAoKCmRlZiBpc19hcmNoaXZlX2ZpbGUobmFtZSk6CiAgICAiIiJSZXR1cm4gVHJ1ZSBpZiBgbmFtZWAgaXMgYSBjb25zaWRlcmVkIGFzIGFuIGFyY2hpdmUgZmlsZS4iIiIKICAgIGV4dCA9IHNwbGl0ZXh0KG5hbWUpWzFdLmxvd2VyKCkKICAgIGlmIGV4dCBpbiBBUkNISVZFX0VYVEVOU0lPTlM6CiAgICAgICAgcmV0dXJuIFRydWUKICAgIHJldHVybiBGYWxzZQoKCmRlZiB1bnBhY2tfdmNzX2xpbmsobGluaywgbG9jYXRpb24pOgogICAgdmNzX2JhY2tlbmQgPSBfZ2V0X3VzZWRfdmNzX2JhY2tlbmQobGluaykKICAgIHZjc19iYWNrZW5kLnVucGFjayhsb2NhdGlvbikKCgpkZWYgX2dldF91c2VkX3Zjc19iYWNrZW5kKGxpbmspOgogICAgZm9yIGJhY2tlbmQgaW4gdmNzLmJhY2tlbmRzOgogICAgICAgIGlmIGxpbmsuc2NoZW1lIGluIGJhY2tlbmQuc2NoZW1lczoKICAgICAgICAgICAgdmNzX2JhY2tlbmQgPSBiYWNrZW5kKGxpbmsudXJsKQogICAgICAgICAgICByZXR1cm4gdmNzX2JhY2tlbmQKCgpkZWYgaXNfdmNzX3VybChsaW5rKToKICAgIHJldHVybiBib29sKF9nZXRfdXNlZF92Y3NfYmFja2VuZChsaW5rKSkKCgpkZWYgaXNfZmlsZV91cmwobGluayk6CiAgICByZXR1cm4gbGluay51cmwubG93ZXIoKS5zdGFydHN3aXRoKCdmaWxlOicpCgoKZGVmIGlzX2Rpcl91cmwobGluayk6CiAgICAiIiJSZXR1cm4gd2hldGhlciBhIGZpbGU6Ly8gTGluayBwb2ludHMgdG8gYSBkaXJlY3RvcnkuCgogICAgYGBsaW5rYGAgbXVzdCBub3QgaGF2ZSBhbnkgb3RoZXIgc2NoZW1lIGJ1dCBmaWxlOi8vLiBDYWxsIGlzX2ZpbGVfdXJsKCkKICAgIGZpcnN0LgoKICAgICIiIgogICAgbGlua19wYXRoID0gdXJsX3RvX3BhdGgobGluay51cmxfd2l0aG91dF9mcmFnbWVudCkKICAgIHJldHVybiBvcy5wYXRoLmlzZGlyKGxpbmtfcGF0aCkKCgpkZWYgX3Byb2dyZXNzX2luZGljYXRvcihpdGVyYWJsZSwgKmFyZ3MsICoqa3dhcmdzKToKICAgIHJldHVybiBpdGVyYWJsZQoKCmRlZiBfZG93bmxvYWRfdXJsKHJlc3AsIGxpbmssIGNvbnRlbnRfZmlsZSwgaGFzaGVzKToKICAgIHRyeToKICAgICAgICB0b3RhbF9sZW5ndGggPSBpbnQocmVzcC5oZWFkZXJzWydjb250ZW50LWxlbmd0aCddKQogICAgZXhjZXB0IChWYWx1ZUVycm9yLCBLZXlFcnJvciwgVHlwZUVycm9yKToKICAgICAgICB0b3RhbF9sZW5ndGggPSAwCgogICAgY2FjaGVkX3Jlc3AgPSBnZXRhdHRyKHJlc3AsICJmcm9tX2NhY2hlIiwgRmFsc2UpCgogICAgaWYgbG9nZ2VyLmdldEVmZmVjdGl2ZUxldmVsKCkgPiBsb2dnaW5nLklORk86CiAgICAgICAgc2hvd19wcm9ncmVzcyA9IEZhbHNlCiAgICBlbGlmIGNhY2hlZF9yZXNwOgogICAgICAgIHNob3dfcHJvZ3Jlc3MgPSBGYWxzZQogICAgZWxpZiB0b3RhbF9sZW5ndGggPiAoNDAgKiAxMDAwKToKICAgICAgICBzaG93X3Byb2dyZXNzID0gVHJ1ZQogICAgZWxpZiBub3QgdG90YWxfbGVuZ3RoOgogICAgICAgIHNob3dfcHJvZ3Jlc3MgPSBUcnVlCiAgICBlbHNlOgogICAgICAgIHNob3dfcHJvZ3Jlc3MgPSBGYWxzZQoKICAgIHNob3dfdXJsID0gbGluay5zaG93X3VybAoKICAgIGRlZiByZXNwX3JlYWQoY2h1bmtfc2l6ZSk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICAjIFNwZWNpYWwgY2FzZSBmb3IgdXJsbGliMy4KICAgICAgICAgICAgZm9yIGNodW5rIGluIHJlc3AucmF3LnN0cmVhbSgKICAgICAgICAgICAgICAgICAgICBjaHVua19zaXplLAogICAgICAgICAgICAgICAgICAgICMgV2UgdXNlIGRlY29kZV9jb250ZW50PUZhbHNlIGhlcmUgYmVjYXVzZSB3ZSBkb24ndAogICAgICAgICAgICAgICAgICAgICMgd2FudCB1cmxsaWIzIHRvIG1lc3Mgd2l0aCB0aGUgcmF3IGJ5dGVzIHdlIGdldAogICAgICAgICAgICAgICAgICAgICMgZnJvbSB0aGUgc2VydmVyLiBJZiB3ZSBkZWNvbXByZXNzIGluc2lkZSBvZgogICAgICAgICAgICAgICAgICAgICMgdXJsbGliMyB0aGVuIHdlIGNhbm5vdCB2ZXJpZnkgdGhlIGNoZWNrc3VtCiAgICAgICAgICAgICAgICAgICAgIyBiZWNhdXNlIHRoZSBjaGVja3N1bSB3aWxsIGJlIG9mIHRoZSBjb21wcmVzc2VkCiAgICAgICAgICAgICAgICAgICAgIyBmaWxlLiBUaGlzIGJyZWFrYWdlIHdpbGwgb25seSBvY2N1ciBpZiB0aGUKICAgICAgICAgICAgICAgICAgICAjIHNlcnZlciBhZGRzIGEgQ29udGVudC1FbmNvZGluZyBoZWFkZXIsIHdoaWNoCiAgICAgICAgICAgICAgICAgICAgIyBkZXBlbmRzIG9uIGhvdyB0aGUgc2VydmVyIHdhcyBjb25maWd1cmVkOgogICAgICAgICAgICAgICAgICAgICMgLSBTb21lIHNlcnZlcnMgd2lsbCBub3RpY2UgdGhhdCB0aGUgZmlsZSBpc24ndCBhCiAgICAgICAgICAgICAgICAgICAgIyAgIGNvbXByZXNzaWJsZSBmaWxlIGFuZCB3aWxsIGxlYXZlIHRoZSBmaWxlIGFsb25lCiAgICAgICAgICAgICAgICAgICAgIyAgIGFuZCB3aXRoIGFuIGVtcHR5IENvbnRlbnQtRW5jb2RpbmcKICAgICAgICAgICAgICAgICAgICAjIC0gU29tZSBzZXJ2ZXJzIHdpbGwgbm90aWNlIHRoYXQgdGhlIGZpbGUgaXMKICAgICAgICAgICAgICAgICAgICAjICAgYWxyZWFkeSBjb21wcmVzc2VkIGFuZCB3aWxsIGxlYXZlIHRoZSBmaWxlCiAgICAgICAgICAgICAgICAgICAgIyAgIGFsb25lIGFuZCB3aWxsIGFkZCBhIENvbnRlbnQtRW5jb2Rpbmc6IGd6aXAKICAgICAgICAgICAgICAgICAgICAjICAgaGVhZGVyCiAgICAgICAgICAgICAgICAgICAgIyAtIFNvbWUgc2VydmVycyB3b24ndCBub3RpY2UgYW55dGhpbmcgYXQgYWxsIGFuZAogICAgICAgICAgICAgICAgICAgICMgICB3aWxsIHRha2UgYSBmaWxlIHRoYXQncyBhbHJlYWR5IGJlZW4gY29tcHJlc3NlZAogICAgICAgICAgICAgICAgICAgICMgICBhbmQgY29tcHJlc3MgaXQgYWdhaW4gYW5kIHNldCB0aGUKICAgICAgICAgICAgICAgICAgICAjICAgQ29udGVudC1FbmNvZGluZzogZ3ppcCBoZWFkZXIKICAgICAgICAgICAgICAgICAgICAjCiAgICAgICAgICAgICAgICAgICAgIyBCeSBzZXR0aW5nIHRoaXMgbm90IHRvIGRlY29kZSBhdXRvbWF0aWNhbGx5IHdlCiAgICAgICAgICAgICAgICAgICAgIyBob3BlIHRvIGVsaW1pbmF0ZSBwcm9ibGVtcyB3aXRoIHRoZSBzZWNvbmQgY2FzZS4KICAgICAgICAgICAgICAgICAgICBkZWNvZGVfY29udGVudD1GYWxzZSk6CiAgICAgICAgICAgICAgICB5aWVsZCBjaHVuawogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgIyBTdGFuZGFyZCBmaWxlLWxpa2Ugb2JqZWN0LgogICAgICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICAgICAgY2h1bmsgPSByZXNwLnJhdy5yZWFkKGNodW5rX3NpemUpCiAgICAgICAgICAgICAgICBpZiBub3QgY2h1bms6CiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgIHlpZWxkIGNodW5rCgogICAgZGVmIHdyaXR0ZW5fY2h1bmtzKGNodW5rcyk6CiAgICAgICAgZm9yIGNodW5rIGluIGNodW5rczoKICAgICAgICAgICAgY29udGVudF9maWxlLndyaXRlKGNodW5rKQogICAgICAgICAgICB5aWVsZCBjaHVuawoKICAgIHByb2dyZXNzX2luZGljYXRvciA9IF9wcm9ncmVzc19pbmRpY2F0b3IKCiAgICBpZiBsaW5rLm5ldGxvYyA9PSBQeVBJLm5ldGxvYzoKICAgICAgICB1cmwgPSBzaG93X3VybAogICAgZWxzZToKICAgICAgICB1cmwgPSBsaW5rLnVybF93aXRob3V0X2ZyYWdtZW50CgogICAgaWYgc2hvd19wcm9ncmVzczogICMgV2UgZG9uJ3Qgc2hvdyBwcm9ncmVzcyBvbiBjYWNoZWQgcmVzcG9uc2VzCiAgICAgICAgaWYgdG90YWxfbGVuZ3RoOgogICAgICAgICAgICBsb2dnZXIuaW5mbygiRG93bmxvYWRpbmcgJXMgKCVzKSIsIHVybCwgZm9ybWF0X3NpemUodG90YWxfbGVuZ3RoKSkKICAgICAgICAgICAgcHJvZ3Jlc3NfaW5kaWNhdG9yID0gRG93bmxvYWRQcm9ncmVzc0JhcihtYXg9dG90YWxfbGVuZ3RoKS5pdGVyCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbG9nZ2VyLmluZm8oIkRvd25sb2FkaW5nICVzIiwgdXJsKQogICAgICAgICAgICBwcm9ncmVzc19pbmRpY2F0b3IgPSBEb3dubG9hZFByb2dyZXNzU3Bpbm5lcigpLml0ZXIKICAgIGVsaWYgY2FjaGVkX3Jlc3A6CiAgICAgICAgbG9nZ2VyLmluZm8oIlVzaW5nIGNhY2hlZCAlcyIsIHVybCkKICAgIGVsc2U6CiAgICAgICAgbG9nZ2VyLmluZm8oIkRvd25sb2FkaW5nICVzIiwgdXJsKQoKICAgIGxvZ2dlci5kZWJ1ZygnRG93bmxvYWRpbmcgZnJvbSBVUkwgJXMnLCBsaW5rKQoKICAgIGRvd25sb2FkZWRfY2h1bmtzID0gd3JpdHRlbl9jaHVua3MoCiAgICAgICAgcHJvZ3Jlc3NfaW5kaWNhdG9yKAogICAgICAgICAgICByZXNwX3JlYWQoQ09OVEVOVF9DSFVOS19TSVpFKSwKICAgICAgICAgICAgQ09OVEVOVF9DSFVOS19TSVpFCiAgICAgICAgKQogICAgKQogICAgaWYgaGFzaGVzOgogICAgICAgIGhhc2hlcy5jaGVja19hZ2FpbnN0X2NodW5rcyhkb3dubG9hZGVkX2NodW5rcykKICAgIGVsc2U6CiAgICAgICAgY29uc3VtZShkb3dubG9hZGVkX2NodW5rcykKCgpkZWYgX2NvcHlfZmlsZShmaWxlbmFtZSwgbG9jYXRpb24sIGxpbmspOgogICAgY29weSA9IFRydWUKICAgIGRvd25sb2FkX2xvY2F0aW9uID0gb3MucGF0aC5qb2luKGxvY2F0aW9uLCBsaW5rLmZpbGVuYW1lKQogICAgaWYgb3MucGF0aC5leGlzdHMoZG93bmxvYWRfbG9jYXRpb24pOgogICAgICAgIHJlc3BvbnNlID0gYXNrX3BhdGhfZXhpc3RzKAogICAgICAgICAgICAnVGhlIGZpbGUgJXMgZXhpc3RzLiAoaSlnbm9yZSwgKHcpaXBlLCAoYilhY2t1cCwgKGEpYWJvcnQnICUKICAgICAgICAgICAgZGlzcGxheV9wYXRoKGRvd25sb2FkX2xvY2F0aW9uKSwgKCdpJywgJ3cnLCAnYicsICdhJykpCiAgICAgICAgaWYgcmVzcG9uc2UgPT0gJ2knOgogICAgICAgICAgICBjb3B5ID0gRmFsc2UKICAgICAgICBlbGlmIHJlc3BvbnNlID09ICd3JzoKICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ0RlbGV0aW5nICVzJywgZGlzcGxheV9wYXRoKGRvd25sb2FkX2xvY2F0aW9uKSkKICAgICAgICAgICAgb3MucmVtb3ZlKGRvd25sb2FkX2xvY2F0aW9uKQogICAgICAgIGVsaWYgcmVzcG9uc2UgPT0gJ2InOgogICAgICAgICAgICBkZXN0X2ZpbGUgPSBiYWNrdXBfZGlyKGRvd25sb2FkX2xvY2F0aW9uKQogICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICdCYWNraW5nIHVwICVzIHRvICVzJywKICAgICAgICAgICAgICAgIGRpc3BsYXlfcGF0aChkb3dubG9hZF9sb2NhdGlvbiksCiAgICAgICAgICAgICAgICBkaXNwbGF5X3BhdGgoZGVzdF9maWxlKSwKICAgICAgICAgICAgKQogICAgICAgICAgICBzaHV0aWwubW92ZShkb3dubG9hZF9sb2NhdGlvbiwgZGVzdF9maWxlKQogICAgICAgIGVsaWYgcmVzcG9uc2UgPT0gJ2EnOgogICAgICAgICAgICBzeXMuZXhpdCgtMSkKICAgIGlmIGNvcHk6CiAgICAgICAgc2h1dGlsLmNvcHkoZmlsZW5hbWUsIGRvd25sb2FkX2xvY2F0aW9uKQogICAgICAgIGxvZ2dlci5pbmZvKCdTYXZlZCAlcycsIGRpc3BsYXlfcGF0aChkb3dubG9hZF9sb2NhdGlvbikpCgoKZGVmIHVucGFja19odHRwX3VybChsaW5rLCBsb2NhdGlvbiwgZG93bmxvYWRfZGlyPU5vbmUsCiAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbj1Ob25lLCBoYXNoZXM9Tm9uZSk6CiAgICBpZiBzZXNzaW9uIGlzIE5vbmU6CiAgICAgICAgcmFpc2UgVHlwZUVycm9yKAogICAgICAgICAgICAidW5wYWNrX2h0dHBfdXJsKCkgbWlzc2luZyAxIHJlcXVpcmVkIGtleXdvcmQgYXJndW1lbnQ6ICdzZXNzaW9uJyIKICAgICAgICApCgogICAgdGVtcF9kaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKCctdW5wYWNrJywgJ3BpcC0nKQoKICAgICMgSWYgYSBkb3dubG9hZCBkaXIgaXMgc3BlY2lmaWVkLCBpcyB0aGUgZmlsZSBhbHJlYWR5IGRvd25sb2FkZWQgdGhlcmU/CiAgICBhbHJlYWR5X2Rvd25sb2FkZWRfcGF0aCA9IE5vbmUKICAgIGlmIGRvd25sb2FkX2RpcjoKICAgICAgICBhbHJlYWR5X2Rvd25sb2FkZWRfcGF0aCA9IF9jaGVja19kb3dubG9hZF9kaXIobGluaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRfZGlyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoZXMpCgogICAgaWYgYWxyZWFkeV9kb3dubG9hZGVkX3BhdGg6CiAgICAgICAgZnJvbV9wYXRoID0gYWxyZWFkeV9kb3dubG9hZGVkX3BhdGgKICAgICAgICBjb250ZW50X3R5cGUgPSBtaW1ldHlwZXMuZ3Vlc3NfdHlwZShmcm9tX3BhdGgpWzBdCiAgICBlbHNlOgogICAgICAgICMgbGV0J3MgZG93bmxvYWQgdG8gYSB0bXAgZGlyCiAgICAgICAgZnJvbV9wYXRoLCBjb250ZW50X3R5cGUgPSBfZG93bmxvYWRfaHR0cF91cmwobGluaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBfZGlyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hlcykKCiAgICAjIHVucGFjayB0aGUgYXJjaGl2ZSB0byB0aGUgYnVpbGQgZGlyIGxvY2F0aW9uLiBldmVuIHdoZW4gb25seSBkb3dubG9hZGluZwogICAgIyBhcmNoaXZlcywgdGhleSBoYXZlIHRvIGJlIHVucGFja2VkIHRvIHBhcnNlIGRlcGVuZGVuY2llcwogICAgdW5wYWNrX2ZpbGUoZnJvbV9wYXRoLCBsb2NhdGlvbiwgY29udGVudF90eXBlLCBsaW5rKQoKICAgICMgYSBkb3dubG9hZCBkaXIgaXMgc3BlY2lmaWVkOyBsZXQncyBjb3B5IHRoZSBhcmNoaXZlIHRoZXJlCiAgICBpZiBkb3dubG9hZF9kaXIgYW5kIG5vdCBhbHJlYWR5X2Rvd25sb2FkZWRfcGF0aDoKICAgICAgICBfY29weV9maWxlKGZyb21fcGF0aCwgZG93bmxvYWRfZGlyLCBsaW5rKQoKICAgIGlmIG5vdCBhbHJlYWR5X2Rvd25sb2FkZWRfcGF0aDoKICAgICAgICBvcy51bmxpbmsoZnJvbV9wYXRoKQogICAgcm10cmVlKHRlbXBfZGlyKQoKCmRlZiB1bnBhY2tfZmlsZV91cmwobGluaywgbG9jYXRpb24sIGRvd25sb2FkX2Rpcj1Ob25lLCBoYXNoZXM9Tm9uZSk6CiAgICAiIiJVbnBhY2sgbGluayBpbnRvIGxvY2F0aW9uLgoKICAgIElmIGRvd25sb2FkX2RpciBpcyBwcm92aWRlZCBhbmQgbGluayBwb2ludHMgdG8gYSBmaWxlLCBtYWtlIGEgY29weQogICAgb2YgdGhlIGxpbmsgZmlsZSBpbnNpZGUgZG93bmxvYWRfZGlyLgogICAgIiIiCiAgICBsaW5rX3BhdGggPSB1cmxfdG9fcGF0aChsaW5rLnVybF93aXRob3V0X2ZyYWdtZW50KQoKICAgICMgSWYgaXQncyBhIHVybCB0byBhIGxvY2FsIGRpcmVjdG9yeQogICAgaWYgaXNfZGlyX3VybChsaW5rKToKICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGxvY2F0aW9uKToKICAgICAgICAgICAgcm10cmVlKGxvY2F0aW9uKQogICAgICAgIHNodXRpbC5jb3B5dHJlZShsaW5rX3BhdGgsIGxvY2F0aW9uLCBzeW1saW5rcz1UcnVlKQogICAgICAgIGlmIGRvd25sb2FkX2RpcjoKICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ0xpbmsgaXMgYSBkaXJlY3RvcnksIGlnbm9yaW5nIGRvd25sb2FkX2RpcicpCiAgICAgICAgcmV0dXJuCgogICAgIyBJZiAtLXJlcXVpcmUtaGFzaGVzIGlzIG9mZiwgYGhhc2hlc2AgaXMgZWl0aGVyIGVtcHR5LCB0aGUKICAgICMgbGluaydzIGVtYmVkZGVkIGhhc2gsIG9yIE1pc3NpbmdIYXNoZXM7IGl0IGlzIHJlcXVpcmVkIHRvCiAgICAjIG1hdGNoLiBJZiAtLXJlcXVpcmUtaGFzaGVzIGlzIG9uLCB3ZSBhcmUgc2F0aXNmaWVkIGJ5IGFueQogICAgIyBoYXNoIGluIGBoYXNoZXNgIG1hdGNoaW5nOiBhIFVSTC1iYXNlZCBvciBhbiBvcHRpb24tYmFzZWQKICAgICMgb25lOyBubyBpbnRlcm5ldC1zb3VyY2VkIGhhc2ggd2lsbCBiZSBpbiBgaGFzaGVzYC4KICAgIGlmIGhhc2hlczoKICAgICAgICBoYXNoZXMuY2hlY2tfYWdhaW5zdF9wYXRoKGxpbmtfcGF0aCkKCiAgICAjIElmIGEgZG93bmxvYWQgZGlyIGlzIHNwZWNpZmllZCwgaXMgdGhlIGZpbGUgYWxyZWFkeSB0aGVyZSBhbmQgdmFsaWQ/CiAgICBhbHJlYWR5X2Rvd25sb2FkZWRfcGF0aCA9IE5vbmUKICAgIGlmIGRvd25sb2FkX2RpcjoKICAgICAgICBhbHJlYWR5X2Rvd25sb2FkZWRfcGF0aCA9IF9jaGVja19kb3dubG9hZF9kaXIobGluaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRfZGlyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoZXMpCgogICAgaWYgYWxyZWFkeV9kb3dubG9hZGVkX3BhdGg6CiAgICAgICAgZnJvbV9wYXRoID0gYWxyZWFkeV9kb3dubG9hZGVkX3BhdGgKICAgIGVsc2U6CiAgICAgICAgZnJvbV9wYXRoID0gbGlua19wYXRoCgogICAgY29udGVudF90eXBlID0gbWltZXR5cGVzLmd1ZXNzX3R5cGUoZnJvbV9wYXRoKVswXQoKICAgICMgdW5wYWNrIHRoZSBhcmNoaXZlIHRvIHRoZSBidWlsZCBkaXIgbG9jYXRpb24uIGV2ZW4gd2hlbiBvbmx5IGRvd25sb2FkaW5nCiAgICAjIGFyY2hpdmVzLCB0aGV5IGhhdmUgdG8gYmUgdW5wYWNrZWQgdG8gcGFyc2UgZGVwZW5kZW5jaWVzCiAgICB1bnBhY2tfZmlsZShmcm9tX3BhdGgsIGxvY2F0aW9uLCBjb250ZW50X3R5cGUsIGxpbmspCgogICAgIyBhIGRvd25sb2FkIGRpciBpcyBzcGVjaWZpZWQgYW5kIG5vdCBhbHJlYWR5IGRvd25sb2FkZWQKICAgIGlmIGRvd25sb2FkX2RpciBhbmQgbm90IGFscmVhZHlfZG93bmxvYWRlZF9wYXRoOgogICAgICAgIF9jb3B5X2ZpbGUoZnJvbV9wYXRoLCBkb3dubG9hZF9kaXIsIGxpbmspCgoKZGVmIF9jb3B5X2Rpc3RfZnJvbV9kaXIobGlua19wYXRoLCBsb2NhdGlvbik6CiAgICAiIiJDb3B5IGRpc3RyaWJ1dGlvbiBmaWxlcyBpbiBgbGlua19wYXRoYCB0byBgbG9jYXRpb25gLgoKICAgIEludm9rZWQgd2hlbiB1c2VyIHJlcXVlc3RzIHRvIGluc3RhbGwgYSBsb2NhbCBkaXJlY3RvcnkuIEUuZy46CgogICAgICAgIHBpcCBpbnN0YWxsIC4KICAgICAgICBwaXAgaW5zdGFsbCB+L2Rldi9naXQtcmVwb3MvcHl0aG9uLXByb21wdC10b29sa2l0CgogICAgIiIiCgogICAgIyBOb3RlOiBUaGlzIGlzIGN1cnJlbnRseSBWRVJZIFNMT1cgaWYgeW91IGhhdmUgYSBsb3Qgb2YgZGF0YSBpbiB0aGUKICAgICMgZGlyZWN0b3J5LCBiZWNhdXNlIGl0IGNvcGllcyBldmVyeXRoaW5nIHdpdGggYHNodXRpbC5jb3B5dHJlZWAuCiAgICAjIFdoYXQgaXQgc2hvdWxkIHJlYWxseSBkbyBpcyBidWlsZCBhbiBzZGlzdCBhbmQgaW5zdGFsbCB0aGF0LgogICAgIyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3B5cGEvcGlwL2lzc3Vlcy8yMTk1CgogICAgaWYgb3MucGF0aC5pc2Rpcihsb2NhdGlvbik6CiAgICAgICAgcm10cmVlKGxvY2F0aW9uKQoKICAgICMgYnVpbGQgYW4gc2Rpc3QKICAgIHNldHVwX3B5ID0gJ3NldHVwLnB5JwogICAgc2Rpc3RfYXJncyA9IFtzeXMuZXhlY3V0YWJsZV0KICAgIHNkaXN0X2FyZ3MuYXBwZW5kKCctYycpCiAgICBzZGlzdF9hcmdzLmFwcGVuZChTRVRVUFRPT0xTX1NISU0gJSBzZXR1cF9weSkKICAgIHNkaXN0X2FyZ3MuYXBwZW5kKCdzZGlzdCcpCiAgICBzZGlzdF9hcmdzICs9IFsnLS1kaXN0LWRpcicsIGxvY2F0aW9uXQogICAgbG9nZ2VyLmluZm8oJ1J1bm5pbmcgc2V0dXAucHkgc2Rpc3QgZm9yICVzJywgbGlua19wYXRoKQoKICAgIHdpdGggaW5kZW50X2xvZygpOgogICAgICAgIGNhbGxfc3VicHJvY2VzcyhzZGlzdF9hcmdzLCBjd2Q9bGlua19wYXRoLCBzaG93X3N0ZG91dD1GYWxzZSkKCiAgICAjIHVucGFjayBzZGlzdCBpbnRvIGBsb2NhdGlvbmAKICAgIHNkaXN0ID0gb3MucGF0aC5qb2luKGxvY2F0aW9uLCBvcy5saXN0ZGlyKGxvY2F0aW9uKVswXSkKICAgIGxvZ2dlci5pbmZvKCdVbnBhY2tpbmcgc2Rpc3QgJXMgaW50byAlcycsIHNkaXN0LCBsb2NhdGlvbikKICAgIHVucGFja19maWxlKHNkaXN0LCBsb2NhdGlvbiwgY29udGVudF90eXBlPU5vbmUsIGxpbms9Tm9uZSkKCgpjbGFzcyBQaXBYbWxycGNUcmFuc3BvcnQoeG1scnBjX2NsaWVudC5UcmFuc3BvcnQpOgogICAgIiIiUHJvdmlkZSBhIGB4bWxycGNsaWIuVHJhbnNwb3J0YCBpbXBsZW1lbnRhdGlvbiB2aWEgYSBgUGlwU2Vzc2lvbmAKICAgIG9iamVjdC4KICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpbmRleF91cmwsIHNlc3Npb24sIHVzZV9kYXRldGltZT1GYWxzZSk6CiAgICAgICAgeG1scnBjX2NsaWVudC5UcmFuc3BvcnQuX19pbml0X18oc2VsZiwgdXNlX2RhdGV0aW1lKQogICAgICAgIGluZGV4X3BhcnRzID0gdXJsbGliX3BhcnNlLnVybHBhcnNlKGluZGV4X3VybCkKICAgICAgICBzZWxmLl9zY2hlbWUgPSBpbmRleF9wYXJ0cy5zY2hlbWUKICAgICAgICBzZWxmLl9zZXNzaW9uID0gc2Vzc2lvbgoKICAgIGRlZiByZXF1ZXN0KHNlbGYsIGhvc3QsIGhhbmRsZXIsIHJlcXVlc3RfYm9keSwgdmVyYm9zZT1GYWxzZSk6CiAgICAgICAgcGFydHMgPSAoc2VsZi5fc2NoZW1lLCBob3N0LCBoYW5kbGVyLCBOb25lLCBOb25lLCBOb25lKQogICAgICAgIHVybCA9IHVybGxpYl9wYXJzZS51cmx1bnBhcnNlKHBhcnRzKQogICAgICAgIHRyeToKICAgICAgICAgICAgaGVhZGVycyA9IHsnQ29udGVudC1UeXBlJzogJ3RleHQveG1sJ30KICAgICAgICAgICAgcmVzcG9uc2UgPSBzZWxmLl9zZXNzaW9uLnBvc3QodXJsLCBkYXRhPXJlcXVlc3RfYm9keSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycz1oZWFkZXJzLCBzdHJlYW09VHJ1ZSkKICAgICAgICAgICAgcmVzcG9uc2UucmFpc2VfZm9yX3N0YXR1cygpCiAgICAgICAgICAgIHNlbGYudmVyYm9zZSA9IHZlcmJvc2UKICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VfcmVzcG9uc2UocmVzcG9uc2UucmF3KQogICAgICAgIGV4Y2VwdCByZXF1ZXN0cy5IVFRQRXJyb3IgYXMgZXhjOgogICAgICAgICAgICBsb2dnZXIuY3JpdGljYWwoCiAgICAgICAgICAgICAgICAiSFRUUCBlcnJvciAlcyB3aGlsZSBnZXR0aW5nICVzIiwKICAgICAgICAgICAgICAgIGV4Yy5yZXNwb25zZS5zdGF0dXNfY29kZSwgdXJsLAogICAgICAgICAgICApCiAgICAgICAgICAgIHJhaXNlCgoKZGVmIHVucGFja191cmwobGluaywgbG9jYXRpb24sIGRvd25sb2FkX2Rpcj1Ob25lLAogICAgICAgICAgICAgICBvbmx5X2Rvd25sb2FkPUZhbHNlLCBzZXNzaW9uPU5vbmUsIGhhc2hlcz1Ob25lKToKICAgICIiIlVucGFjayBsaW5rLgogICAgICAgSWYgbGluayBpcyBhIFZDUyBsaW5rOgogICAgICAgICBpZiBvbmx5X2Rvd25sb2FkLCBleHBvcnQgaW50byBkb3dubG9hZF9kaXIgYW5kIGlnbm9yZSBsb2NhdGlvbgogICAgICAgICAgZWxzZSB1bnBhY2sgaW50byBsb2NhdGlvbgogICAgICAgZm9yIG90aGVyIHR5cGVzIG9mIGxpbms6CiAgICAgICAgIC0gdW5wYWNrIGludG8gbG9jYXRpb24KICAgICAgICAgLSBpZiBkb3dubG9hZF9kaXIsIGNvcHkgdGhlIGZpbGUgaW50byBkb3dubG9hZF9kaXIKICAgICAgICAgLSBpZiBvbmx5X2Rvd25sb2FkLCBtYXJrIGxvY2F0aW9uIGZvciBkZWxldGlvbgoKICAgIDpwYXJhbSBoYXNoZXM6IEEgSGFzaGVzIG9iamVjdCwgb25lIG9mIHdob3NlIGVtYmVkZGVkIGhhc2hlcyBtdXN0IG1hdGNoLAogICAgICAgIG9yIEhhc2hNaXNtYXRjaCB3aWxsIGJlIHJhaXNlZC4gSWYgdGhlIEhhc2hlcyBpcyBlbXB0eSwgbm8gbWF0Y2hlcyBhcmUKICAgICAgICByZXF1aXJlZCwgYW5kIHVuaGFzaGFibGUgdHlwZXMgb2YgcmVxdWlyZW1lbnRzIChsaWtlIFZDUyBvbmVzLCB3aGljaAogICAgICAgIHdvdWxkIG9yZGluYXJpbHkgcmFpc2UgSGFzaFVuc3VwcG9ydGVkKSBhcmUgYWxsb3dlZC4KICAgICIiIgogICAgIyBub24tZWRpdGFibGUgdmNzIHVybHMKICAgIGlmIGlzX3Zjc191cmwobGluayk6CiAgICAgICAgdW5wYWNrX3Zjc19saW5rKGxpbmssIGxvY2F0aW9uKQoKICAgICMgZmlsZSB1cmxzCiAgICBlbGlmIGlzX2ZpbGVfdXJsKGxpbmspOgogICAgICAgIHVucGFja19maWxlX3VybChsaW5rLCBsb2NhdGlvbiwgZG93bmxvYWRfZGlyLCBoYXNoZXM9aGFzaGVzKQoKICAgICMgaHR0cCB1cmxzCiAgICBlbHNlOgogICAgICAgIGlmIHNlc3Npb24gaXMgTm9uZToKICAgICAgICAgICAgc2Vzc2lvbiA9IFBpcFNlc3Npb24oKQoKICAgICAgICB1bnBhY2tfaHR0cF91cmwoCiAgICAgICAgICAgIGxpbmssCiAgICAgICAgICAgIGxvY2F0aW9uLAogICAgICAgICAgICBkb3dubG9hZF9kaXIsCiAgICAgICAgICAgIHNlc3Npb24sCiAgICAgICAgICAgIGhhc2hlcz1oYXNoZXMKICAgICAgICApCiAgICBpZiBvbmx5X2Rvd25sb2FkOgogICAgICAgIHdyaXRlX2RlbGV0ZV9tYXJrZXJfZmlsZShsb2NhdGlvbikKCgpkZWYgX2Rvd25sb2FkX2h0dHBfdXJsKGxpbmssIHNlc3Npb24sIHRlbXBfZGlyLCBoYXNoZXMpOgogICAgIiIiRG93bmxvYWQgbGluayB1cmwgaW50byB0ZW1wX2RpciB1c2luZyBwcm92aWRlZCBzZXNzaW9uIiIiCiAgICB0YXJnZXRfdXJsID0gbGluay51cmwuc3BsaXQoJyMnLCAxKVswXQogICAgdHJ5OgogICAgICAgIHJlc3AgPSBzZXNzaW9uLmdldCgKICAgICAgICAgICAgdGFyZ2V0X3VybCwKICAgICAgICAgICAgIyBXZSB1c2UgQWNjZXB0LUVuY29kaW5nOiBpZGVudGl0eSBoZXJlIGJlY2F1c2UgcmVxdWVzdHMKICAgICAgICAgICAgIyBkZWZhdWx0cyB0byBhY2NlcHRpbmcgY29tcHJlc3NlZCByZXNwb25zZXMuIFRoaXMgYnJlYWtzIGluCiAgICAgICAgICAgICMgYSB2YXJpZXR5IG9mIHdheXMgZGVwZW5kaW5nIG9uIGhvdyB0aGUgc2VydmVyIGlzIGNvbmZpZ3VyZWQuCiAgICAgICAgICAgICMgLSBTb21lIHNlcnZlcnMgd2lsbCBub3RpY2UgdGhhdCB0aGUgZmlsZSBpc24ndCBhIGNvbXByZXNzaWJsZQogICAgICAgICAgICAjICAgZmlsZSBhbmQgd2lsbCBsZWF2ZSB0aGUgZmlsZSBhbG9uZSBhbmQgd2l0aCBhbiBlbXB0eQogICAgICAgICAgICAjICAgQ29udGVudC1FbmNvZGluZwogICAgICAgICAgICAjIC0gU29tZSBzZXJ2ZXJzIHdpbGwgbm90aWNlIHRoYXQgdGhlIGZpbGUgaXMgYWxyZWFkeQogICAgICAgICAgICAjICAgY29tcHJlc3NlZCBhbmQgd2lsbCBsZWF2ZSB0aGUgZmlsZSBhbG9uZSBhbmQgd2lsbCBhZGQgYQogICAgICAgICAgICAjICAgQ29udGVudC1FbmNvZGluZzogZ3ppcCBoZWFkZXIKICAgICAgICAgICAgIyAtIFNvbWUgc2VydmVycyB3b24ndCBub3RpY2UgYW55dGhpbmcgYXQgYWxsIGFuZCB3aWxsIHRha2UKICAgICAgICAgICAgIyAgIGEgZmlsZSB0aGF0J3MgYWxyZWFkeSBiZWVuIGNvbXByZXNzZWQgYW5kIGNvbXByZXNzIGl0IGFnYWluCiAgICAgICAgICAgICMgICBhbmQgc2V0IHRoZSBDb250ZW50LUVuY29kaW5nOiBnemlwIGhlYWRlcgogICAgICAgICAgICAjIEJ5IHNldHRpbmcgdGhpcyB0byByZXF1ZXN0IG9ubHkgdGhlIGlkZW50aXR5IGVuY29kaW5nIFdlJ3JlCiAgICAgICAgICAgICMgaG9waW5nIHRvIGVsaW1pbmF0ZSB0aGUgdGhpcmQgY2FzZS4gSG9wZWZ1bGx5IHRoZXJlIGRvZXMgbm90CiAgICAgICAgICAgICMgZXhpc3QgYSBzZXJ2ZXIgd2hpY2ggd2hlbiBnaXZlbiBhIGZpbGUgd2lsbCBub3RpY2UgaXQgaXMKICAgICAgICAgICAgIyBhbHJlYWR5IGNvbXByZXNzZWQgYW5kIHRoYXQgeW91J3JlIG5vdCBhc2tpbmcgZm9yIGEKICAgICAgICAgICAgIyBjb21wcmVzc2VkIGZpbGUgYW5kIHdpbGwgdGhlbiBkZWNvbXByZXNzIGl0IGJlZm9yZSBzZW5kaW5nCiAgICAgICAgICAgICMgYmVjYXVzZSBpZiB0aGF0J3MgdGhlIGNhc2UgSSBkb24ndCB0aGluayBpdCdsbCBldmVyIGJlCiAgICAgICAgICAgICMgcG9zc2libGUgdG8gbWFrZSB0aGlzIHdvcmsuCiAgICAgICAgICAgIGhlYWRlcnM9eyJBY2NlcHQtRW5jb2RpbmciOiAiaWRlbnRpdHkifSwKICAgICAgICAgICAgc3RyZWFtPVRydWUsCiAgICAgICAgKQogICAgICAgIHJlc3AucmFpc2VfZm9yX3N0YXR1cygpCiAgICBleGNlcHQgcmVxdWVzdHMuSFRUUEVycm9yIGFzIGV4YzoKICAgICAgICBsb2dnZXIuY3JpdGljYWwoCiAgICAgICAgICAgICJIVFRQIGVycm9yICVzIHdoaWxlIGdldHRpbmcgJXMiLCBleGMucmVzcG9uc2Uuc3RhdHVzX2NvZGUsIGxpbmssCiAgICAgICAgKQogICAgICAgIHJhaXNlCgogICAgY29udGVudF90eXBlID0gcmVzcC5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJywgJycpCiAgICBmaWxlbmFtZSA9IGxpbmsuZmlsZW5hbWUgICMgZmFsbGJhY2sKICAgICMgSGF2ZSBhIGxvb2sgYXQgdGhlIENvbnRlbnQtRGlzcG9zaXRpb24gaGVhZGVyIGZvciBhIGJldHRlciBndWVzcwogICAgY29udGVudF9kaXNwb3NpdGlvbiA9IHJlc3AuaGVhZGVycy5nZXQoJ2NvbnRlbnQtZGlzcG9zaXRpb24nKQogICAgaWYgY29udGVudF9kaXNwb3NpdGlvbjoKICAgICAgICB0eXBlLCBwYXJhbXMgPSBjZ2kucGFyc2VfaGVhZGVyKGNvbnRlbnRfZGlzcG9zaXRpb24pCiAgICAgICAgIyBXZSB1c2UgYGBvcmBgIGhlcmUgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIHVzZSBhbiAiZW1wdHkiIHZhbHVlCiAgICAgICAgIyBmcm9tIHRoZSBmaWxlbmFtZSBwYXJhbS4KICAgICAgICBmaWxlbmFtZSA9IHBhcmFtcy5nZXQoJ2ZpbGVuYW1lJykgb3IgZmlsZW5hbWUKICAgIGV4dCA9IHNwbGl0ZXh0KGZpbGVuYW1lKVsxXQogICAgaWYgbm90IGV4dDoKICAgICAgICBleHQgPSBtaW1ldHlwZXMuZ3Vlc3NfZXh0ZW5zaW9uKGNvbnRlbnRfdHlwZSkKICAgICAgICBpZiBleHQ6CiAgICAgICAgICAgIGZpbGVuYW1lICs9IGV4dAogICAgaWYgbm90IGV4dCBhbmQgbGluay51cmwgIT0gcmVzcC51cmw6CiAgICAgICAgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChyZXNwLnVybClbMV0KICAgICAgICBpZiBleHQ6CiAgICAgICAgICAgIGZpbGVuYW1lICs9IGV4dAogICAgZmlsZV9wYXRoID0gb3MucGF0aC5qb2luKHRlbXBfZGlyLCBmaWxlbmFtZSkKICAgIHdpdGggb3BlbihmaWxlX3BhdGgsICd3YicpIGFzIGNvbnRlbnRfZmlsZToKICAgICAgICBfZG93bmxvYWRfdXJsKHJlc3AsIGxpbmssIGNvbnRlbnRfZmlsZSwgaGFzaGVzKQogICAgcmV0dXJuIGZpbGVfcGF0aCwgY29udGVudF90eXBlCgoKZGVmIF9jaGVja19kb3dubG9hZF9kaXIobGluaywgZG93bmxvYWRfZGlyLCBoYXNoZXMpOgogICAgIiIiIENoZWNrIGRvd25sb2FkX2RpciBmb3IgcHJldmlvdXNseSBkb3dubG9hZGVkIGZpbGUgd2l0aCBjb3JyZWN0IGhhc2gKICAgICAgICBJZiBhIGNvcnJlY3QgZmlsZSBpcyBmb3VuZCByZXR1cm4gaXRzIHBhdGggZWxzZSBOb25lCiAgICAiIiIKICAgIGRvd25sb2FkX3BhdGggPSBvcy5wYXRoLmpvaW4oZG93bmxvYWRfZGlyLCBsaW5rLmZpbGVuYW1lKQogICAgaWYgb3MucGF0aC5leGlzdHMoZG93bmxvYWRfcGF0aCk6CiAgICAgICAgIyBJZiBhbHJlYWR5IGRvd25sb2FkZWQsIGRvZXMgaXRzIGhhc2ggbWF0Y2g/CiAgICAgICAgbG9nZ2VyLmluZm8oJ0ZpbGUgd2FzIGFscmVhZHkgZG93bmxvYWRlZCAlcycsIGRvd25sb2FkX3BhdGgpCiAgICAgICAgaWYgaGFzaGVzOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBoYXNoZXMuY2hlY2tfYWdhaW5zdF9wYXRoKGRvd25sb2FkX3BhdGgpCiAgICAgICAgICAgIGV4Y2VwdCBIYXNoTWlzbWF0Y2g6CiAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICAgICAnUHJldmlvdXNseS1kb3dubG9hZGVkIGZpbGUgJXMgaGFzIGJhZCBoYXNoLiAnCiAgICAgICAgICAgICAgICAgICAgJ1JlLWRvd25sb2FkaW5nLicsCiAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRfcGF0aAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgb3MudW5saW5rKGRvd25sb2FkX3BhdGgpCiAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIHJldHVybiBkb3dubG9hZF9wYXRoCiAgICByZXR1cm4gTm9uZQpQSwMEFAAAAAAAAAAhAL56lpi5HwAAuR8AAC4AAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9leGNlcHRpb25zLnB5IiIiRXhjZXB0aW9ucyB1c2VkIHRocm91Z2hvdXQgcGFja2FnZSIiIgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKZnJvbSBpdGVydG9vbHMgaW1wb3J0IGNoYWluLCBncm91cGJ5LCByZXBlYXQKCmZyb20gcGlwLl92ZW5kb3Iuc2l4IGltcG9ydCBpdGVyaXRlbXMKCgpjbGFzcyBQaXBFcnJvcihFeGNlcHRpb24pOgogICAgIiIiQmFzZSBwaXAgZXhjZXB0aW9uIiIiCgoKY2xhc3MgSW5zdGFsbGF0aW9uRXJyb3IoUGlwRXJyb3IpOgogICAgIiIiR2VuZXJhbCBleGNlcHRpb24gZHVyaW5nIGluc3RhbGxhdGlvbiIiIgoKCmNsYXNzIFVuaW5zdGFsbGF0aW9uRXJyb3IoUGlwRXJyb3IpOgogICAgIiIiR2VuZXJhbCBleGNlcHRpb24gZHVyaW5nIHVuaW5zdGFsbGF0aW9uIiIiCgoKY2xhc3MgRGlzdHJpYnV0aW9uTm90Rm91bmQoSW5zdGFsbGF0aW9uRXJyb3IpOgogICAgIiIiUmFpc2VkIHdoZW4gYSBkaXN0cmlidXRpb24gY2Fubm90IGJlIGZvdW5kIHRvIHNhdGlzZnkgYSByZXF1aXJlbWVudCIiIgoKCmNsYXNzIFJlcXVpcmVtZW50c0ZpbGVQYXJzZUVycm9yKEluc3RhbGxhdGlvbkVycm9yKToKICAgICIiIlJhaXNlZCB3aGVuIGEgZ2VuZXJhbCBlcnJvciBvY2N1cnMgcGFyc2luZyBhIHJlcXVpcmVtZW50cyBmaWxlIGxpbmUuIiIiCgoKY2xhc3MgQmVzdFZlcnNpb25BbHJlYWR5SW5zdGFsbGVkKFBpcEVycm9yKToKICAgICIiIlJhaXNlZCB3aGVuIHRoZSBtb3N0IHVwLXRvLWRhdGUgdmVyc2lvbiBvZiBhIHBhY2thZ2UgaXMgYWxyZWFkeQogICAgaW5zdGFsbGVkLiIiIgoKCmNsYXNzIEJhZENvbW1hbmQoUGlwRXJyb3IpOgogICAgIiIiUmFpc2VkIHdoZW4gdmlydHVhbGVudiBvciBhIGNvbW1hbmQgaXMgbm90IGZvdW5kIiIiCgoKY2xhc3MgQ29tbWFuZEVycm9yKFBpcEVycm9yKToKICAgICIiIlJhaXNlZCB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIGNvbW1hbmQtbGluZSBhcmd1bWVudHMiIiIKCgpjbGFzcyBQcmV2aW91c0J1aWxkRGlyRXJyb3IoUGlwRXJyb3IpOgogICAgIiIiUmFpc2VkIHdoZW4gdGhlcmUncyBhIHByZXZpb3VzIGNvbmZsaWN0aW5nIGJ1aWxkIGRpcmVjdG9yeSIiIgoKCmNsYXNzIEludmFsaWRXaGVlbEZpbGVuYW1lKEluc3RhbGxhdGlvbkVycm9yKToKICAgICIiIkludmFsaWQgd2hlZWwgZmlsZW5hbWUuIiIiCgoKY2xhc3MgVW5zdXBwb3J0ZWRXaGVlbChJbnN0YWxsYXRpb25FcnJvcik6CiAgICAiIiJVbnN1cHBvcnRlZCB3aGVlbC4iIiIKCgpjbGFzcyBIYXNoRXJyb3JzKEluc3RhbGxhdGlvbkVycm9yKToKICAgICIiIk11bHRpcGxlIEhhc2hFcnJvciBpbnN0YW5jZXMgcm9sbGVkIGludG8gb25lIGZvciByZXBvcnRpbmciIiIKCiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc2VsZi5lcnJvcnMgPSBbXQoKICAgIGRlZiBhcHBlbmQoc2VsZiwgZXJyb3IpOgogICAgICAgIHNlbGYuZXJyb3JzLmFwcGVuZChlcnJvcikKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICBsaW5lcyA9IFtdCiAgICAgICAgc2VsZi5lcnJvcnMuc29ydChrZXk9bGFtYmRhIGU6IGUub3JkZXIpCiAgICAgICAgZm9yIGNscywgZXJyb3JzX29mX2NscyBpbiBncm91cGJ5KHNlbGYuZXJyb3JzLCBsYW1iZGEgZTogZS5fX2NsYXNzX18pOgogICAgICAgICAgICBsaW5lcy5hcHBlbmQoY2xzLmhlYWQpCiAgICAgICAgICAgIGxpbmVzLmV4dGVuZChlLmJvZHkoKSBmb3IgZSBpbiBlcnJvcnNfb2ZfY2xzKQogICAgICAgIGlmIGxpbmVzOgogICAgICAgICAgICByZXR1cm4gJ1xuJy5qb2luKGxpbmVzKQoKICAgIGRlZiBfX25vbnplcm9fXyhzZWxmKToKICAgICAgICByZXR1cm4gYm9vbChzZWxmLmVycm9ycykKCiAgICBkZWYgX19ib29sX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX19ub256ZXJvX18oKQoKCmNsYXNzIEhhc2hFcnJvcihJbnN0YWxsYXRpb25FcnJvcik6CiAgICAiIiIKICAgIEEgZmFpbHVyZSB0byB2ZXJpZnkgYSBwYWNrYWdlIGFnYWluc3Qga25vd24tZ29vZCBoYXNoZXMKCiAgICA6Y3ZhciBvcmRlcjogQW4gaW50IHNvcnRpbmcgaGFzaCBleGNlcHRpb24gY2xhc3NlcyBieSBkaWZmaWN1bHR5IG9mCiAgICAgICAgcmVjb3ZlcnkgKGxvd2VyIGJlaW5nIGhhcmRlciksIHNvIHRoZSB1c2VyIGRvZXNuJ3QgYm90aGVyIGZyZXR0aW5nCiAgICAgICAgYWJvdXQgdW5waW5uZWQgcGFja2FnZXMgd2hlbiBoZSBoYXMgZGVlcGVyIGlzc3VlcywgbGlrZSBWQ1MKICAgICAgICBkZXBlbmRlbmNpZXMsIHRvIGRlYWwgd2l0aC4gQWxzbyBrZWVwcyBlcnJvciByZXBvcnRzIGluIGEKICAgICAgICBkZXRlcm1pbmlzdGljIG9yZGVyLgogICAgOmN2YXIgaGVhZDogQSBzZWN0aW9uIGhlYWRpbmcgZm9yIGRpc3BsYXkgYWJvdmUgcG90ZW50aWFsbHkgbWFueQogICAgICAgIGV4Y2VwdGlvbnMgb2YgdGhpcyBraW5kCiAgICA6aXZhciByZXE6IFRoZSBJbnN0YWxsUmVxdWlyZW1lbnQgdGhhdCB0cmlnZ2VyZWQgdGhpcyBlcnJvci4gVGhpcyBpcwogICAgICAgIHBhc3RlZCBvbiBhZnRlciB0aGUgZXhjZXB0aW9uIGlzIGluc3RhbnRpYXRlZCwgYmVjYXVzZSBpdCdzIG5vdAogICAgICAgIHR5cGljYWxseSBhdmFpbGFibGUgZWFybGllci4KCiAgICAiIiIKICAgIHJlcSA9IE5vbmUKICAgIGhlYWQgPSAnJwoKICAgIGRlZiBib2R5KHNlbGYpOgogICAgICAgICIiIlJldHVybiBhIHN1bW1hcnkgb2YgbWUgZm9yIGRpc3BsYXkgdW5kZXIgdGhlIGhlYWRpbmcuCgogICAgICAgIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBzaW1wbHkgcHJpbnRzIGEgZGVzY3JpcHRpb24gb2YgdGhlCiAgICAgICAgdHJpZ2dlcmluZyByZXF1aXJlbWVudC4KCiAgICAgICAgOnBhcmFtIHJlcTogVGhlIEluc3RhbGxSZXF1aXJlbWVudCB0aGF0IHByb3Zva2VkIHRoaXMgZXJyb3IsIHdpdGgKICAgICAgICAgICAgcG9wdWxhdGVfbGluaygpIGhhdmluZyBhbHJlYWR5IGJlZW4gY2FsbGVkCgogICAgICAgICIiIgogICAgICAgIHJldHVybiAnICAgICVzJyAlIHNlbGYuX3JlcXVpcmVtZW50X25hbWUoKQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJldHVybiAnJXNcbiVzJyAlIChzZWxmLmhlYWQsIHNlbGYuYm9keSgpKQoKICAgIGRlZiBfcmVxdWlyZW1lbnRfbmFtZShzZWxmKToKICAgICAgICAiIiJSZXR1cm4gYSBkZXNjcmlwdGlvbiBvZiB0aGUgcmVxdWlyZW1lbnQgdGhhdCB0cmlnZ2VyZWQgbWUuCgogICAgICAgIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIGxvbmcgZGVzY3JpcHRpb24gb2YgdGhlIHJlcSwgd2l0aAogICAgICAgIGxpbmUgbnVtYmVycwoKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc3RyKHNlbGYucmVxKSBpZiBzZWxmLnJlcSBlbHNlICd1bmtub3duIHBhY2thZ2UnCgoKY2xhc3MgVmNzSGFzaFVuc3VwcG9ydGVkKEhhc2hFcnJvcik6CiAgICAiIiJBIGhhc2ggd2FzIHByb3ZpZGVkIGZvciBhIHZlcnNpb24tY29udHJvbC1zeXN0ZW0tYmFzZWQgcmVxdWlyZW1lbnQsIGJ1dAogICAgd2UgZG9uJ3QgaGF2ZSBhIG1ldGhvZCBmb3IgaGFzaGluZyB0aG9zZS4iIiIKCiAgICBvcmRlciA9IDAKICAgIGhlYWQgPSAoIkNhbid0IHZlcmlmeSBoYXNoZXMgZm9yIHRoZXNlIHJlcXVpcmVtZW50cyBiZWNhdXNlIHdlIGRvbid0ICIKICAgICAgICAgICAgImhhdmUgYSB3YXkgdG8gaGFzaCB2ZXJzaW9uIGNvbnRyb2wgcmVwb3NpdG9yaWVzOiIpCgoKY2xhc3MgRGlyZWN0b3J5VXJsSGFzaFVuc3VwcG9ydGVkKEhhc2hFcnJvcik6CiAgICAiIiJBIGhhc2ggd2FzIHByb3ZpZGVkIGZvciBhIHZlcnNpb24tY29udHJvbC1zeXN0ZW0tYmFzZWQgcmVxdWlyZW1lbnQsIGJ1dAogICAgd2UgZG9uJ3QgaGF2ZSBhIG1ldGhvZCBmb3IgaGFzaGluZyB0aG9zZS4iIiIKCiAgICBvcmRlciA9IDEKICAgIGhlYWQgPSAoIkNhbid0IHZlcmlmeSBoYXNoZXMgZm9yIHRoZXNlIGZpbGU6Ly8gcmVxdWlyZW1lbnRzIGJlY2F1c2UgdGhleSAiCiAgICAgICAgICAgICJwb2ludCB0byBkaXJlY3RvcmllczoiKQoKCmNsYXNzIEhhc2hNaXNzaW5nKEhhc2hFcnJvcik6CiAgICAiIiJBIGhhc2ggd2FzIG5lZWRlZCBmb3IgYSByZXF1aXJlbWVudCBidXQgaXMgYWJzZW50LiIiIgoKICAgIG9yZGVyID0gMgogICAgaGVhZCA9ICgnSGFzaGVzIGFyZSByZXF1aXJlZCBpbiAtLXJlcXVpcmUtaGFzaGVzIG1vZGUsIGJ1dCB0aGV5IGFyZSAnCiAgICAgICAgICAgICdtaXNzaW5nIGZyb20gc29tZSByZXF1aXJlbWVudHMuIEhlcmUgaXMgYSBsaXN0IG9mIHRob3NlICcKICAgICAgICAgICAgJ3JlcXVpcmVtZW50cyBhbG9uZyB3aXRoIHRoZSBoYXNoZXMgdGhlaXIgZG93bmxvYWRlZCBhcmNoaXZlcyAnCiAgICAgICAgICAgICdhY3R1YWxseSBoYWQuIEFkZCBsaW5lcyBsaWtlIHRoZXNlIHRvIHlvdXIgcmVxdWlyZW1lbnRzIGZpbGVzIHRvICcKICAgICAgICAgICAgJ3ByZXZlbnQgdGFtcGVyaW5nLiAoSWYgeW91IGRpZCBub3QgZW5hYmxlIC0tcmVxdWlyZS1oYXNoZXMgJwogICAgICAgICAgICAnbWFudWFsbHksIG5vdGUgdGhhdCBpdCB0dXJucyBvbiBhdXRvbWF0aWNhbGx5IHdoZW4gYW55IHBhY2thZ2UgJwogICAgICAgICAgICAnaGFzIGEgaGFzaC4pJykKCiAgICBkZWYgX19pbml0X18oc2VsZiwgZ290dGVuX2hhc2gpOgogICAgICAgICIiIgogICAgICAgIDpwYXJhbSBnb3R0ZW5faGFzaDogVGhlIGhhc2ggb2YgdGhlIChwb3NzaWJseSBtYWxpY2lvdXMpIGFyY2hpdmUgd2UKICAgICAgICAgICAganVzdCBkb3dubG9hZGVkCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5nb3R0ZW5faGFzaCA9IGdvdHRlbl9oYXNoCgogICAgZGVmIGJvZHkoc2VsZik6CiAgICAgICAgZnJvbSBwaXAudXRpbHMuaGFzaGVzIGltcG9ydCBGQVZPUklURV9IQVNIICAjIERvZGdlIGNpcmN1bGFyIGltcG9ydC4KCiAgICAgICAgcGFja2FnZSA9IE5vbmUKICAgICAgICBpZiBzZWxmLnJlcToKICAgICAgICAgICAgIyBJbiB0aGUgY2FzZSBvZiBVUkwtYmFzZWQgcmVxdWlyZW1lbnRzLCBkaXNwbGF5IHRoZSBvcmlnaW5hbCBVUkwKICAgICAgICAgICAgIyBzZWVuIGluIHRoZSByZXF1aXJlbWVudHMgZmlsZSByYXRoZXIgdGhhbiB0aGUgcGFja2FnZSBuYW1lLAogICAgICAgICAgICAjIHNvIHRoZSBvdXRwdXQgY2FuIGJlIGRpcmVjdGx5IGNvcGllZCBpbnRvIHRoZSByZXF1aXJlbWVudHMgZmlsZS4KICAgICAgICAgICAgcGFja2FnZSA9IChzZWxmLnJlcS5vcmlnaW5hbF9saW5rIGlmIHNlbGYucmVxLm9yaWdpbmFsX2xpbmsKICAgICAgICAgICAgICAgICAgICAgICAjIEluIGNhc2Ugc29tZW9uZSBmZWVkcyBzb21ldGhpbmcgZG93bnJpZ2h0IHN0dXBpZAogICAgICAgICAgICAgICAgICAgICAgICMgdG8gSW5zdGFsbFJlcXVpcmVtZW50J3MgY29uc3RydWN0b3IuCiAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBnZXRhdHRyKHNlbGYucmVxLCAncmVxJywgTm9uZSkpCiAgICAgICAgcmV0dXJuICcgICAgJXMgLS1oYXNoPSVzOiVzJyAlIChwYWNrYWdlIG9yICd1bmtub3duIHBhY2thZ2UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFWT1JJVEVfSEFTSCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ290dGVuX2hhc2gpCgoKY2xhc3MgSGFzaFVucGlubmVkKEhhc2hFcnJvcik6CiAgICAiIiJBIHJlcXVpcmVtZW50IGhhZCBhIGhhc2ggc3BlY2lmaWVkIGJ1dCB3YXMgbm90IHBpbm5lZCB0byBhIHNwZWNpZmljCiAgICB2ZXJzaW9uLiIiIgoKICAgIG9yZGVyID0gMwogICAgaGVhZCA9ICgnSW4gLS1yZXF1aXJlLWhhc2hlcyBtb2RlLCBhbGwgcmVxdWlyZW1lbnRzIG11c3QgaGF2ZSB0aGVpciAnCiAgICAgICAgICAgICd2ZXJzaW9ucyBwaW5uZWQgd2l0aCA9PS4gVGhlc2UgZG8gbm90OicpCgoKY2xhc3MgSGFzaE1pc21hdGNoKEhhc2hFcnJvcik6CiAgICAiIiIKICAgIERpc3RyaWJ1dGlvbiBmaWxlIGhhc2ggdmFsdWVzIGRvbid0IG1hdGNoLgoKICAgIDppdmFyIHBhY2thZ2VfbmFtZTogVGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UgdGhhdCB0cmlnZ2VyZWQgdGhlIGhhc2gKICAgICAgICBtaXNtYXRjaC4gRmVlbCBmcmVlIHRvIHdyaXRlIHRvIHRoaXMgYWZ0ZXIgdGhlIGV4Y2VwdGlvbiBpcyByYWlzZSB0bwogICAgICAgIGltcHJvdmUgaXRzIGVycm9yIG1lc3NhZ2UuCgogICAgIiIiCiAgICBvcmRlciA9IDQKICAgIGhlYWQgPSAoJ1RIRVNFIFBBQ0tBR0VTIERPIE5PVCBNQVRDSCBUSEUgSEFTSEVTIEZST00gVEhFIFJFUVVJUkVNRU5UUyAnCiAgICAgICAgICAgICdGSUxFLiBJZiB5b3UgaGF2ZSB1cGRhdGVkIHRoZSBwYWNrYWdlIHZlcnNpb25zLCBwbGVhc2UgdXBkYXRlICcKICAgICAgICAgICAgJ3RoZSBoYXNoZXMuIE90aGVyd2lzZSwgZXhhbWluZSB0aGUgcGFja2FnZSBjb250ZW50cyBjYXJlZnVsbHk7ICcKICAgICAgICAgICAgJ3NvbWVvbmUgbWF5IGhhdmUgdGFtcGVyZWQgd2l0aCB0aGVtLicpCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGFsbG93ZWQsIGdvdHMpOgogICAgICAgICIiIgogICAgICAgIDpwYXJhbSBhbGxvd2VkOiBBIGRpY3Qgb2YgYWxnb3JpdGhtIG5hbWVzIHBvaW50aW5nIHRvIGxpc3RzIG9mIGFsbG93ZWQKICAgICAgICAgICAgaGV4IGRpZ2VzdHMKICAgICAgICA6cGFyYW0gZ290czogQSBkaWN0IG9mIGFsZ29yaXRobSBuYW1lcyBwb2ludGluZyB0byBoYXNoZXMgd2UKICAgICAgICAgICAgYWN0dWFsbHkgZ290IGZyb20gdGhlIGZpbGVzIHVuZGVyIHN1c3BpY2lvbgogICAgICAgICIiIgogICAgICAgIHNlbGYuYWxsb3dlZCA9IGFsbG93ZWQKICAgICAgICBzZWxmLmdvdHMgPSBnb3RzCgogICAgZGVmIGJvZHkoc2VsZik6CiAgICAgICAgcmV0dXJuICcgICAgJXM6XG4lcycgJSAoc2VsZi5fcmVxdWlyZW1lbnRfbmFtZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2hhc2hfY29tcGFyaXNvbigpKQoKICAgIGRlZiBfaGFzaF9jb21wYXJpc29uKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBhIGNvbXBhcmlzb24gb2YgYWN0dWFsIGFuZCBleHBlY3RlZCBoYXNoIHZhbHVlcy4KCiAgICAgICAgRXhhbXBsZTo6CgogICAgICAgICAgICAgICBFeHBlY3RlZCBzaGEyNTYgYWJjZGVhYmNkZWFiY2RlYWJjZGVhYmNkZWFiY2RlYWJjZGVhYmNkZWFiY2RlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciAxMjM0NTEyMzQ1MTIzNDUxMjM0NTEyMzQ1MTIzNDUxMjM0NTEyMzQ1MTIzNDUKICAgICAgICAgICAgICAgICAgICBHb3QgICAgICAgIGJjZGVmYmNkZWZiY2RlZmJjZGVmYmNkZWZiY2RlZmJjZGVmYmNkZWZiY2RlZgoKICAgICAgICAiIiIKICAgICAgICBkZWYgaGFzaF90aGVuX29yKGhhc2hfbmFtZSk6CiAgICAgICAgICAgICMgRm9yIG5vdywgYWxsIHRoZSBkZWNlbnQgaGFzaGVzIGhhdmUgNi1jaGFyIG5hbWVzLCBzbyB3ZSBjYW4gZ2V0CiAgICAgICAgICAgICMgYXdheSB3aXRoIGhhcmQtY29kaW5nIHNwYWNlIGxpdGVyYWxzLgogICAgICAgICAgICByZXR1cm4gY2hhaW4oW2hhc2hfbmFtZV0sIHJlcGVhdCgnICAgIG9yJykpCgogICAgICAgIGxpbmVzID0gW10KICAgICAgICBmb3IgaGFzaF9uYW1lLCBleHBlY3RlZHMgaW4gaXRlcml0ZW1zKHNlbGYuYWxsb3dlZCk6CiAgICAgICAgICAgIHByZWZpeCA9IGhhc2hfdGhlbl9vcihoYXNoX25hbWUpCiAgICAgICAgICAgIGxpbmVzLmV4dGVuZCgoJyAgICAgICAgRXhwZWN0ZWQgJXMgJXMnICUgKG5leHQocHJlZml4KSwgZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgZSBpbiBleHBlY3RlZHMpCiAgICAgICAgICAgIGxpbmVzLmFwcGVuZCgnICAgICAgICAgICAgIEdvdCAgICAgICAgJXNcbicgJQogICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nb3RzW2hhc2hfbmFtZV0uaGV4ZGlnZXN0KCkpCiAgICAgICAgICAgIHByZWZpeCA9ICcgICAgb3InCiAgICAgICAgcmV0dXJuICdcbicuam9pbihsaW5lcykKCgpjbGFzcyBVbnN1cHBvcnRlZFB5dGhvblZlcnNpb24oSW5zdGFsbGF0aW9uRXJyb3IpOgogICAgIiIiVW5zdXBwb3J0ZWQgcHl0aG9uIHZlcnNpb24gYWNjb3JkaW5nIHRvIFJlcXVpcmVzLVB5dGhvbiBwYWNrYWdlCiAgICBtZXRhZGF0YS4iIiIKUEsDBBQAAAAAAAAAIQA2+CX/DpwAAA6cAAApAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvaW5kZXgucHkiIiJSb3V0aW5lcyByZWxhdGVkIHRvIFB5UEksIGluZGV4ZXMiIiIKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBsb2dnaW5nCmltcG9ydCBjZ2kKZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgbmFtZWR0dXBsZQppbXBvcnQgaXRlcnRvb2xzCmltcG9ydCBzeXMKaW1wb3J0IG9zCmltcG9ydCByZQppbXBvcnQgbWltZXR5cGVzCmltcG9ydCBwb3NpeHBhdGgKaW1wb3J0IHdhcm5pbmdzCgpmcm9tIHBpcC5fdmVuZG9yLnNpeC5tb3Zlcy51cmxsaWIgaW1wb3J0IHBhcnNlIGFzIHVybGxpYl9wYXJzZQpmcm9tIHBpcC5fdmVuZG9yLnNpeC5tb3Zlcy51cmxsaWIgaW1wb3J0IHJlcXVlc3QgYXMgdXJsbGliX3JlcXVlc3QKCmZyb20gcGlwLmNvbXBhdCBpbXBvcnQgaXBhZGRyZXNzCmZyb20gcGlwLnV0aWxzIGltcG9ydCAoCiAgICBjYWNoZWRfcHJvcGVydHksIHNwbGl0ZXh0LCBub3JtYWxpemVfcGF0aCwKICAgIEFSQ0hJVkVfRVhURU5TSU9OUywgU1VQUE9SVEVEX0VYVEVOU0lPTlMsCikKZnJvbSBwaXAudXRpbHMuZGVwcmVjYXRpb24gaW1wb3J0IFJlbW92ZWRJblBpcDEwV2FybmluZwpmcm9tIHBpcC51dGlscy5sb2dnaW5nIGltcG9ydCBpbmRlbnRfbG9nCmZyb20gcGlwLnV0aWxzLnBhY2thZ2luZyBpbXBvcnQgY2hlY2tfcmVxdWlyZXNfcHl0aG9uCmZyb20gcGlwLmV4Y2VwdGlvbnMgaW1wb3J0ICgKICAgIERpc3RyaWJ1dGlvbk5vdEZvdW5kLCBCZXN0VmVyc2lvbkFscmVhZHlJbnN0YWxsZWQsIEludmFsaWRXaGVlbEZpbGVuYW1lLAogICAgVW5zdXBwb3J0ZWRXaGVlbCwKKQpmcm9tIHBpcC5kb3dubG9hZCBpbXBvcnQgSEFTX1RMUywgaXNfdXJsLCBwYXRoX3RvX3VybCwgdXJsX3RvX3BhdGgKZnJvbSBwaXAud2hlZWwgaW1wb3J0IFdoZWVsLCB3aGVlbF9leHQKZnJvbSBwaXAucGVwNDI1dGFncyBpbXBvcnQgZ2V0X3N1cHBvcnRlZApmcm9tIHBpcC5fdmVuZG9yIGltcG9ydCBodG1sNWxpYiwgcmVxdWVzdHMsIHNpeApmcm9tIHBpcC5fdmVuZG9yLnBhY2thZ2luZy52ZXJzaW9uIGltcG9ydCBwYXJzZSBhcyBwYXJzZV92ZXJzaW9uCmZyb20gcGlwLl92ZW5kb3IucGFja2FnaW5nLnV0aWxzIGltcG9ydCBjYW5vbmljYWxpemVfbmFtZQpmcm9tIHBpcC5fdmVuZG9yLnBhY2thZ2luZyBpbXBvcnQgc3BlY2lmaWVycwpmcm9tIHBpcC5fdmVuZG9yLnJlcXVlc3RzLmV4Y2VwdGlvbnMgaW1wb3J0IFNTTEVycm9yCmZyb20gcGlwLl92ZW5kb3IuZGlzdGxpYi5jb21wYXQgaW1wb3J0IHVuZXNjYXBlCgoKX19hbGxfXyA9IFsnRm9ybWF0Q29udHJvbCcsICdmbXRfY3RsX2hhbmRsZV9tdXR1YWxfZXhjbHVkZScsICdQYWNrYWdlRmluZGVyJ10KCgpTRUNVUkVfT1JJR0lOUyA9IFsKICAgICMgcHJvdG9jb2wsIGhvc3RuYW1lLCBwb3J0CiAgICAjIFRha2VuIGZyb20gQ2hyb21lJ3MgbGlzdCBvZiBzZWN1cmUgb3JpZ2lucyAoU2VlOiBodHRwOi8vYml0Lmx5LzFxcnlTS0MpCiAgICAoImh0dHBzIiwgIioiLCAiKiIpLAogICAgKCIqIiwgImxvY2FsaG9zdCIsICIqIiksCiAgICAoIioiLCAiMTI3LjAuMC4wLzgiLCAiKiIpLAogICAgKCIqIiwgIjo6MS8xMjgiLCAiKiIpLAogICAgKCJmaWxlIiwgIioiLCBOb25lKSwKICAgICMgc3NoIGlzIGFsd2F5cyBzZWN1cmUuCiAgICAoInNzaCIsICIqIiwgIioiKSwKXQoKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKCmNsYXNzIEluc3RhbGxhdGlvbkNhbmRpZGF0ZShvYmplY3QpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwcm9qZWN0LCB2ZXJzaW9uLCBsb2NhdGlvbik6CiAgICAgICAgc2VsZi5wcm9qZWN0ID0gcHJvamVjdAogICAgICAgIHNlbGYudmVyc2lvbiA9IHBhcnNlX3ZlcnNpb24odmVyc2lvbikKICAgICAgICBzZWxmLmxvY2F0aW9uID0gbG9jYXRpb24KICAgICAgICBzZWxmLl9rZXkgPSAoc2VsZi5wcm9qZWN0LCBzZWxmLnZlcnNpb24sIHNlbGYubG9jYXRpb24pCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiPEluc3RhbGxhdGlvbkNhbmRpZGF0ZSh7MCFyfSwgezEhcn0sIHsyIXJ9KT4iLmZvcm1hdCgKICAgICAgICAgICAgc2VsZi5wcm9qZWN0LCBzZWxmLnZlcnNpb24sIHNlbGYubG9jYXRpb24sCiAgICAgICAgKQoKICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKICAgICAgICByZXR1cm4gaGFzaChzZWxmLl9rZXkpCgogICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2NvbXBhcmUob3RoZXIsIGxhbWJkYSBzLCBvOiBzIDwgbykKCiAgICBkZWYgX19sZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5fY29tcGFyZShvdGhlciwgbGFtYmRhIHMsIG86IHMgPD0gbykKCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5fY29tcGFyZShvdGhlciwgbGFtYmRhIHMsIG86IHMgPT0gbykKCiAgICBkZWYgX19nZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5fY29tcGFyZShvdGhlciwgbGFtYmRhIHMsIG86IHMgPj0gbykKCiAgICBkZWYgX19ndF9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5fY29tcGFyZShvdGhlciwgbGFtYmRhIHMsIG86IHMgPiBvKQoKICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmLl9jb21wYXJlKG90aGVyLCBsYW1iZGEgcywgbzogcyAhPSBvKQoKICAgIGRlZiBfY29tcGFyZShzZWxmLCBvdGhlciwgbWV0aG9kKToKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgSW5zdGFsbGF0aW9uQ2FuZGlkYXRlKToKICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCgogICAgICAgIHJldHVybiBtZXRob2Qoc2VsZi5fa2V5LCBvdGhlci5fa2V5KQoKCmNsYXNzIFBhY2thZ2VGaW5kZXIob2JqZWN0KToKICAgICIiIlRoaXMgZmluZHMgcGFja2FnZXMuCgogICAgVGhpcyBpcyBtZWFudCB0byBtYXRjaCBlYXN5X2luc3RhbGwncyB0ZWNobmlxdWUgZm9yIGxvb2tpbmcgZm9yCiAgICBwYWNrYWdlcywgYnkgcmVhZGluZyBwYWdlcyBhbmQgbG9va2luZyBmb3IgYXBwcm9wcmlhdGUgbGlua3MuCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgZmluZF9saW5rcywgaW5kZXhfdXJscywgYWxsb3dfYWxsX3ByZXJlbGVhc2VzPUZhbHNlLAogICAgICAgICAgICAgICAgIHRydXN0ZWRfaG9zdHM9Tm9uZSwgcHJvY2Vzc19kZXBlbmRlbmN5X2xpbmtzPUZhbHNlLAogICAgICAgICAgICAgICAgIHNlc3Npb249Tm9uZSwgZm9ybWF0X2NvbnRyb2w9Tm9uZSwgcGxhdGZvcm09Tm9uZSwKICAgICAgICAgICAgICAgICB2ZXJzaW9ucz1Ob25lLCBhYmk9Tm9uZSwgaW1wbGVtZW50YXRpb249Tm9uZSk6CiAgICAgICAgIiIiQ3JlYXRlIGEgUGFja2FnZUZpbmRlci4KCiAgICAgICAgOnBhcmFtIGZvcm1hdF9jb250cm9sOiBBIEZvcm1hdENvbnRyb2wgb2JqZWN0IG9yIE5vbmUuIFVzZWQgdG8gY29udHJvbAogICAgICAgICAgICB0aGUgc2VsZWN0aW9uIG9mIHNvdXJjZSBwYWNrYWdlcyAvIGJpbmFyeSBwYWNrYWdlcyB3aGVuIGNvbnN1bHRpbmcKICAgICAgICAgICAgdGhlIGluZGV4IGFuZCBsaW5rcy4KICAgICAgICA6cGFyYW0gcGxhdGZvcm06IEEgc3RyaW5nIG9yIE5vbmUuIElmIE5vbmUsIHNlYXJjaGVzIGZvciBwYWNrYWdlcwogICAgICAgICAgICB0aGF0IGFyZSBzdXBwb3J0ZWQgYnkgdGhlIGN1cnJlbnQgc3lzdGVtLiBPdGhlcndpc2UsIHdpbGwgZmluZAogICAgICAgICAgICBwYWNrYWdlcyB0aGF0IGNhbiBiZSBidWlsdCBvbiB0aGUgcGxhdGZvcm0gcGFzc2VkIGluLiBUaGVzZQogICAgICAgICAgICBwYWNrYWdlcyB3aWxsIG9ubHkgYmUgZG93bmxvYWRlZCBmb3IgZGlzdHJpYnV0aW9uOiB0aGV5IHdpbGwKICAgICAgICAgICAgbm90IGJlIGJ1aWx0IGxvY2FsbHkuCiAgICAgICAgOnBhcmFtIHZlcnNpb25zOiBBIGxpc3Qgb2Ygc3RyaW5ncyBvciBOb25lLiBUaGlzIGlzIHBhc3NlZCBkaXJlY3RseQogICAgICAgICAgICB0byBwZXA0MjV0YWdzLnB5IGluIHRoZSBnZXRfc3VwcG9ydGVkKCkgbWV0aG9kLgogICAgICAgIDpwYXJhbSBhYmk6IEEgc3RyaW5nIG9yIE5vbmUuIFRoaXMgaXMgcGFzc2VkIGRpcmVjdGx5CiAgICAgICAgICAgIHRvIHBlcDQyNXRhZ3MucHkgaW4gdGhlIGdldF9zdXBwb3J0ZWQoKSBtZXRob2QuCiAgICAgICAgOnBhcmFtIGltcGxlbWVudGF0aW9uOiBBIHN0cmluZyBvciBOb25lLiBUaGlzIGlzIHBhc3NlZCBkaXJlY3RseQogICAgICAgICAgICB0byBwZXA0MjV0YWdzLnB5IGluIHRoZSBnZXRfc3VwcG9ydGVkKCkgbWV0aG9kLgogICAgICAgICIiIgogICAgICAgIGlmIHNlc3Npb24gaXMgTm9uZToKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKAogICAgICAgICAgICAgICAgIlBhY2thZ2VGaW5kZXIoKSBtaXNzaW5nIDEgcmVxdWlyZWQga2V5d29yZCBhcmd1bWVudDogIgogICAgICAgICAgICAgICAgIidzZXNzaW9uJyIKICAgICAgICAgICAgKQoKICAgICAgICAjIEJ1aWxkIGZpbmRfbGlua3MuIElmIGFuIGFyZ3VtZW50IHN0YXJ0cyB3aXRoIH4sIGl0IG1heSBiZQogICAgICAgICMgYSBsb2NhbCBmaWxlIHJlbGF0aXZlIHRvIGEgaG9tZSBkaXJlY3RvcnkuIFNvIHRyeSBub3JtYWxpemluZwogICAgICAgICMgaXQgYW5kIGlmIGl0IGV4aXN0cywgdXNlIHRoZSBub3JtYWxpemVkIHZlcnNpb24uCiAgICAgICAgIyBUaGlzIGlzIGRlbGliZXJhdGVseSBjb25zZXJ2YXRpdmUgLSBpdCBtaWdodCBiZSBmaW5lIGp1c3QgdG8KICAgICAgICAjIGJsaW5kbHkgbm9ybWFsaXplIGFueXRoaW5nIHN0YXJ0aW5nIHdpdGggYSB+Li4uCiAgICAgICAgc2VsZi5maW5kX2xpbmtzID0gW10KICAgICAgICBmb3IgbGluayBpbiBmaW5kX2xpbmtzOgogICAgICAgICAgICBpZiBsaW5rLnN0YXJ0c3dpdGgoJ34nKToKICAgICAgICAgICAgICAgIG5ld19saW5rID0gbm9ybWFsaXplX3BhdGgobGluaykKICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKG5ld19saW5rKToKICAgICAgICAgICAgICAgICAgICBsaW5rID0gbmV3X2xpbmsKICAgICAgICAgICAgc2VsZi5maW5kX2xpbmtzLmFwcGVuZChsaW5rKQoKICAgICAgICBzZWxmLmluZGV4X3VybHMgPSBpbmRleF91cmxzCiAgICAgICAgc2VsZi5kZXBlbmRlbmN5X2xpbmtzID0gW10KCiAgICAgICAgIyBUaGVzZSBhcmUgYm9yaW5nIGxpbmtzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gbG9nZ2VkIHNvbWVob3c6CiAgICAgICAgc2VsZi5sb2dnZWRfbGlua3MgPSBzZXQoKQoKICAgICAgICBzZWxmLmZvcm1hdF9jb250cm9sID0gZm9ybWF0X2NvbnRyb2wgb3IgRm9ybWF0Q29udHJvbChzZXQoKSwgc2V0KCkpCgogICAgICAgICMgRG9tYWlucyB0aGF0IHdlIHdvbid0IGVtaXQgd2FybmluZ3MgZm9yIHdoZW4gbm90IHVzaW5nIEhUVFBTCiAgICAgICAgc2VsZi5zZWN1cmVfb3JpZ2lucyA9IFsKICAgICAgICAgICAgKCIqIiwgaG9zdCwgIioiKQogICAgICAgICAgICBmb3IgaG9zdCBpbiAodHJ1c3RlZF9ob3N0cyBpZiB0cnVzdGVkX2hvc3RzIGVsc2UgW10pCiAgICAgICAgXQoKICAgICAgICAjIERvIHdlIHdhbnQgdG8gYWxsb3cgX2FsbF8gcHJlLXJlbGVhc2VzPwogICAgICAgIHNlbGYuYWxsb3dfYWxsX3ByZXJlbGVhc2VzID0gYWxsb3dfYWxsX3ByZXJlbGVhc2VzCgogICAgICAgICMgRG8gd2UgcHJvY2VzcyBkZXBlbmRlbmN5IGxpbmtzPwogICAgICAgIHNlbGYucHJvY2Vzc19kZXBlbmRlbmN5X2xpbmtzID0gcHJvY2Vzc19kZXBlbmRlbmN5X2xpbmtzCgogICAgICAgICMgVGhlIFNlc3Npb24gd2UnbGwgdXNlIHRvIG1ha2UgcmVxdWVzdHMKICAgICAgICBzZWxmLnNlc3Npb24gPSBzZXNzaW9uCgogICAgICAgICMgVGhlIHZhbGlkIHRhZ3MgdG8gY2hlY2sgcG90ZW50aWFsIGZvdW5kIHdoZWVsIGNhbmRpZGF0ZXMgYWdhaW5zdAogICAgICAgIHNlbGYudmFsaWRfdGFncyA9IGdldF9zdXBwb3J0ZWQoCiAgICAgICAgICAgIHZlcnNpb25zPXZlcnNpb25zLAogICAgICAgICAgICBwbGF0Zm9ybT1wbGF0Zm9ybSwKICAgICAgICAgICAgYWJpPWFiaSwKICAgICAgICAgICAgaW1wbD1pbXBsZW1lbnRhdGlvbiwKICAgICAgICApCgogICAgICAgICMgSWYgd2UgZG9uJ3QgaGF2ZSBUTFMgZW5hYmxlZCwgdGhlbiBXQVJOIGlmIGFueXBsYWNlIHdlJ3JlIGxvb2tpbmcKICAgICAgICAjIHJlbGllcyBvbiBUTFMuCiAgICAgICAgaWYgbm90IEhBU19UTFM6CiAgICAgICAgICAgIGZvciBsaW5rIGluIGl0ZXJ0b29scy5jaGFpbihzZWxmLmluZGV4X3VybHMsIHNlbGYuZmluZF9saW5rcyk6CiAgICAgICAgICAgICAgICBwYXJzZWQgPSB1cmxsaWJfcGFyc2UudXJscGFyc2UobGluaykKICAgICAgICAgICAgICAgIGlmIHBhcnNlZC5zY2hlbWUgPT0gImh0dHBzIjoKICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICAgICAgICAgInBpcCBpcyBjb25maWd1cmVkIHdpdGggbG9jYXRpb25zIHRoYXQgcmVxdWlyZSAiCiAgICAgICAgICAgICAgICAgICAgICAgICJUTFMvU1NMLCBob3dldmVyIHRoZSBzc2wgbW9kdWxlIGluIFB5dGhvbiBpcyBub3QgIgogICAgICAgICAgICAgICAgICAgICAgICAiYXZhaWxhYmxlLiIKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgYnJlYWsKCiAgICBkZWYgYWRkX2RlcGVuZGVuY3lfbGlua3Moc2VsZiwgbGlua3MpOgogICAgICAgICMgIyBGSVhNRTogdGhpcyBzaG91bGRuJ3QgYmUgZ2xvYmFsIGxpc3QgdGhpcywgaXQgc2hvdWxkIG9ubHkKICAgICAgICAjICMgYXBwbHkgdG8gcmVxdWlyZW1lbnRzIG9mIHRoZSBwYWNrYWdlIHRoYXQgc3BlY2lmaWVzIHRoZQogICAgICAgICMgIyBkZXBlbmRlbmN5X2xpbmtzIHZhbHVlCiAgICAgICAgIyAjIEZJWE1FOiBhbHNvLCB3ZSBzaG91bGQgdHJhY2sgY29tZXNfZnJvbSAoaS5lLiwgdXNlIExpbmspCiAgICAgICAgaWYgc2VsZi5wcm9jZXNzX2RlcGVuZGVuY3lfbGlua3M6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCiAgICAgICAgICAgICAgICAiRGVwZW5kZW5jeSBMaW5rcyBwcm9jZXNzaW5nIGhhcyBiZWVuIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgIgogICAgICAgICAgICAgICAgInJlbW92ZWQgaW4gYSBmdXR1cmUgcmVsZWFzZS4iLAogICAgICAgICAgICAgICAgUmVtb3ZlZEluUGlwMTBXYXJuaW5nLAogICAgICAgICAgICApCiAgICAgICAgICAgIHNlbGYuZGVwZW5kZW5jeV9saW5rcy5leHRlbmQobGlua3MpCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9zb3J0X2xvY2F0aW9ucyhsb2NhdGlvbnMsIGV4cGFuZF9kaXI9RmFsc2UpOgogICAgICAgICIiIgogICAgICAgIFNvcnQgbG9jYXRpb25zIGludG8gImZpbGVzIiAoYXJjaGl2ZXMpIGFuZCAidXJscyIsIGFuZCByZXR1cm4KICAgICAgICBhIHBhaXIgb2YgbGlzdHMgKGZpbGVzLHVybHMpCiAgICAgICAgIiIiCiAgICAgICAgZmlsZXMgPSBbXQogICAgICAgIHVybHMgPSBbXQoKICAgICAgICAjIHB1dHMgdGhlIHVybCBmb3IgdGhlIGdpdmVuIGZpbGUgcGF0aCBpbnRvIHRoZSBhcHByb3ByaWF0ZSBsaXN0CiAgICAgICAgZGVmIHNvcnRfcGF0aChwYXRoKToKICAgICAgICAgICAgdXJsID0gcGF0aF90b191cmwocGF0aCkKICAgICAgICAgICAgaWYgbWltZXR5cGVzLmd1ZXNzX3R5cGUodXJsLCBzdHJpY3Q9RmFsc2UpWzBdID09ICd0ZXh0L2h0bWwnOgogICAgICAgICAgICAgICAgdXJscy5hcHBlbmQodXJsKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgZmlsZXMuYXBwZW5kKHVybCkKCiAgICAgICAgZm9yIHVybCBpbiBsb2NhdGlvbnM6CgogICAgICAgICAgICBpc19sb2NhbF9wYXRoID0gb3MucGF0aC5leGlzdHModXJsKQogICAgICAgICAgICBpc19maWxlX3VybCA9IHVybC5zdGFydHN3aXRoKCdmaWxlOicpCgogICAgICAgICAgICBpZiBpc19sb2NhbF9wYXRoIG9yIGlzX2ZpbGVfdXJsOgogICAgICAgICAgICAgICAgaWYgaXNfbG9jYWxfcGF0aDoKICAgICAgICAgICAgICAgICAgICBwYXRoID0gdXJsCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHBhdGggPSB1cmxfdG9fcGF0aCh1cmwpCiAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKHBhdGgpOgogICAgICAgICAgICAgICAgICAgIGlmIGV4cGFuZF9kaXI6CiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLnJlYWxwYXRoKHBhdGgpCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBpdGVtIGluIG9zLmxpc3RkaXIocGF0aCk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3J0X3BhdGgob3MucGF0aC5qb2luKHBhdGgsIGl0ZW0pKQogICAgICAgICAgICAgICAgICAgIGVsaWYgaXNfZmlsZV91cmw6CiAgICAgICAgICAgICAgICAgICAgICAgIHVybHMuYXBwZW5kKHVybCkKICAgICAgICAgICAgICAgIGVsaWYgb3MucGF0aC5pc2ZpbGUocGF0aCk6CiAgICAgICAgICAgICAgICAgICAgc29ydF9wYXRoKHBhdGgpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgICAgICAgICAiVXJsICclcycgaXMgaWdub3JlZDogaXQgaXMgbmVpdGhlciBhIGZpbGUgIgogICAgICAgICAgICAgICAgICAgICAgICAibm9yIGEgZGlyZWN0b3J5LiIsIHVybCkKICAgICAgICAgICAgZWxpZiBpc191cmwodXJsKToKICAgICAgICAgICAgICAgICMgT25seSBhZGQgdXJsIHdpdGggY2xlYXIgc2NoZW1lCiAgICAgICAgICAgICAgICB1cmxzLmFwcGVuZCh1cmwpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICAgICAiVXJsICclcycgaXMgaWdub3JlZC4gSXQgaXMgZWl0aGVyIGEgbm9uLWV4aXN0aW5nICIKICAgICAgICAgICAgICAgICAgICAicGF0aCBvciBsYWNrcyBhIHNwZWNpZmljIHNjaGVtZS4iLCB1cmwpCgogICAgICAgIHJldHVybiBmaWxlcywgdXJscwoKICAgIGRlZiBfY2FuZGlkYXRlX3NvcnRfa2V5KHNlbGYsIGNhbmRpZGF0ZSk6CiAgICAgICAgIiIiCiAgICAgICAgRnVuY3Rpb24gdXNlZCB0byBnZW5lcmF0ZSBsaW5rIHNvcnQga2V5IGZvciBsaW5rIHR1cGxlcy4KICAgICAgICBUaGUgZ3JlYXRlciB0aGUgcmV0dXJuIHZhbHVlLCB0aGUgbW9yZSBwcmVmZXJyZWQgaXQgaXMuCiAgICAgICAgSWYgbm90IGZpbmRpbmcgd2hlZWxzLCB0aGVuIHNvcnRlZCBieSB2ZXJzaW9uIG9ubHkuCiAgICAgICAgSWYgZmluZGluZyB3aGVlbHMsIHRoZW4gdGhlIHNvcnQgb3JkZXIgaXMgYnkgdmVyc2lvbiwgdGhlbjoKICAgICAgICAgIDEuIGV4aXN0aW5nIGluc3RhbGxzCiAgICAgICAgICAyLiB3aGVlbHMgb3JkZXJlZCB2aWEgV2hlZWwuc3VwcG9ydF9pbmRleF9taW4oc2VsZi52YWxpZF90YWdzKQogICAgICAgICAgMy4gc291cmNlIGFyY2hpdmVzCiAgICAgICAgTm90ZTogaXQgd2FzIGNvbnNpZGVyZWQgdG8gZW1iZWQgdGhpcyBsb2dpYyBpbnRvIHRoZSBMaW5rCiAgICAgICAgICAgICAgY29tcGFyaXNvbiBvcGVyYXRvcnMsIGJ1dCB0aGVuIGRpZmZlcmVudCBzZGlzdCBsaW5rcwogICAgICAgICAgICAgIHdpdGggdGhlIHNhbWUgdmVyc2lvbiwgd291bGQgaGF2ZSB0byBiZSBjb25zaWRlcmVkIGVxdWFsCiAgICAgICAgIiIiCiAgICAgICAgc3VwcG9ydF9udW0gPSBsZW4oc2VsZi52YWxpZF90YWdzKQogICAgICAgIGlmIGNhbmRpZGF0ZS5sb2NhdGlvbi5pc193aGVlbDoKICAgICAgICAgICAgIyBjYW4gcmFpc2UgSW52YWxpZFdoZWVsRmlsZW5hbWUKICAgICAgICAgICAgd2hlZWwgPSBXaGVlbChjYW5kaWRhdGUubG9jYXRpb24uZmlsZW5hbWUpCiAgICAgICAgICAgIGlmIG5vdCB3aGVlbC5zdXBwb3J0ZWQoc2VsZi52YWxpZF90YWdzKToKICAgICAgICAgICAgICAgIHJhaXNlIFVuc3VwcG9ydGVkV2hlZWwoCiAgICAgICAgICAgICAgICAgICAgIiVzIGlzIG5vdCBhIHN1cHBvcnRlZCB3aGVlbCBmb3IgdGhpcyBwbGF0Zm9ybS4gSXQgIgogICAgICAgICAgICAgICAgICAgICJjYW4ndCBiZSBzb3J0ZWQuIiAlIHdoZWVsLmZpbGVuYW1lCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHByaSA9IC0od2hlZWwuc3VwcG9ydF9pbmRleF9taW4oc2VsZi52YWxpZF90YWdzKSkKICAgICAgICBlbHNlOiAgIyBzZGlzdAogICAgICAgICAgICBwcmkgPSAtKHN1cHBvcnRfbnVtKQogICAgICAgIHJldHVybiAoY2FuZGlkYXRlLnZlcnNpb24sIHByaSkKCiAgICBkZWYgX3ZhbGlkYXRlX3NlY3VyZV9vcmlnaW4oc2VsZiwgbG9nZ2VyLCBsb2NhdGlvbik6CiAgICAgICAgIyBEZXRlcm1pbmUgaWYgdGhpcyB1cmwgdXNlZCBhIHNlY3VyZSB0cmFuc3BvcnQgbWVjaGFuaXNtCiAgICAgICAgcGFyc2VkID0gdXJsbGliX3BhcnNlLnVybHBhcnNlKHN0cihsb2NhdGlvbikpCiAgICAgICAgb3JpZ2luID0gKHBhcnNlZC5zY2hlbWUsIHBhcnNlZC5ob3N0bmFtZSwgcGFyc2VkLnBvcnQpCgogICAgICAgICMgVGhlIHByb3RvY29sIHRvIHVzZSB0byBzZWUgaWYgdGhlIHByb3RvY29sIG1hdGNoZXMuCiAgICAgICAgIyBEb24ndCBjb3VudCB0aGUgcmVwb3NpdG9yeSB0eXBlIGFzIHBhcnQgb2YgdGhlIHByb3RvY29sOiBpbgogICAgICAgICMgY2FzZXMgc3VjaCBhcyAiZ2l0K3NzaCIsIG9ubHkgdXNlICJzc2giLiAoSS5lLiwgT25seSB2ZXJpZnkgYWdhaW5zdAogICAgICAgICMgdGhlIGxhc3Qgc2NoZW1lLikKICAgICAgICBwcm90b2NvbCA9IG9yaWdpblswXS5yc3BsaXQoJysnLCAxKVstMV0KCiAgICAgICAgIyBEZXRlcm1pbmUgaWYgb3VyIG9yaWdpbiBpcyBhIHNlY3VyZSBvcmlnaW4gYnkgbG9va2luZyB0aHJvdWdoIG91cgogICAgICAgICMgaGFyZGNvZGVkIGxpc3Qgb2Ygc2VjdXJlIG9yaWdpbnMsIGFzIHdlbGwgYXMgYW55IGFkZGl0aW9uYWwgb25lcwogICAgICAgICMgY29uZmlndXJlZCBvbiB0aGlzIFBhY2thZ2VGaW5kZXIgaW5zdGFuY2UuCiAgICAgICAgZm9yIHNlY3VyZV9vcmlnaW4gaW4gKFNFQ1VSRV9PUklHSU5TICsgc2VsZi5zZWN1cmVfb3JpZ2lucyk6CiAgICAgICAgICAgIGlmIHByb3RvY29sICE9IHNlY3VyZV9vcmlnaW5bMF0gYW5kIHNlY3VyZV9vcmlnaW5bMF0gIT0gIioiOgogICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICMgV2UgbmVlZCB0byBkbyB0aGlzIGRlY29kZSBkYW5jZSB0byBlbnN1cmUgdGhhdCB3ZSBoYXZlIGEKICAgICAgICAgICAgICAgICMgdW5pY29kZSBvYmplY3QsIGV2ZW4gb24gUHl0aG9uIDIueC4KICAgICAgICAgICAgICAgIGFkZHIgPSBpcGFkZHJlc3MuaXBfYWRkcmVzcygKICAgICAgICAgICAgICAgICAgICBvcmlnaW5bMV0KICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgIGlzaW5zdGFuY2Uob3JpZ2luWzFdLCBzaXgudGV4dF90eXBlKSBvcgogICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5bMV0gaXMgTm9uZQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICBlbHNlIG9yaWdpblsxXS5kZWNvZGUoInV0ZjgiKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgbmV0d29yayA9IGlwYWRkcmVzcy5pcF9uZXR3b3JrKAogICAgICAgICAgICAgICAgICAgIHNlY3VyZV9vcmlnaW5bMV0KICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHNlY3VyZV9vcmlnaW5bMV0sIHNpeC50ZXh0X3R5cGUpCiAgICAgICAgICAgICAgICAgICAgZWxzZSBzZWN1cmVfb3JpZ2luWzFdLmRlY29kZSgidXRmOCIpCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgICAgIyBXZSBkb24ndCBoYXZlIGJvdGggYSB2YWxpZCBhZGRyZXNzIG9yIGEgdmFsaWQgbmV0d29yaywgc28KICAgICAgICAgICAgICAgICMgd2UnbGwgY2hlY2sgdGhpcyBvcmlnaW4gYWdhaW5zdCBob3N0bmFtZXMuCiAgICAgICAgICAgICAgICBpZiAob3JpZ2luWzFdIGFuZAogICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5bMV0ubG93ZXIoKSAhPSBzZWN1cmVfb3JpZ2luWzFdLmxvd2VyKCkgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgIHNlY3VyZV9vcmlnaW5bMV0gIT0gIioiKToKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBXZSBoYXZlIGEgdmFsaWQgYWRkcmVzcyBhbmQgbmV0d29yaywgc28gc2VlIGlmIHRoZSBhZGRyZXNzCiAgICAgICAgICAgICAgICAjIGlzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIG5ldHdvcmsuCiAgICAgICAgICAgICAgICBpZiBhZGRyIG5vdCBpbiBuZXR3b3JrOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgcG9ydCBwYXRjaGVzCiAgICAgICAgICAgIGlmIChvcmlnaW5bMl0gIT0gc2VjdXJlX29yaWdpblsyXSBhbmQKICAgICAgICAgICAgICAgICAgICBzZWN1cmVfb3JpZ2luWzJdICE9ICIqIiBhbmQKICAgICAgICAgICAgICAgICAgICBzZWN1cmVfb3JpZ2luWzJdIGlzIG5vdCBOb25lKToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICAjIElmIHdlJ3ZlIGdvdHRlbiBoZXJlLCB0aGVuIHRoaXMgb3JpZ2luIG1hdGNoZXMgdGhlIGN1cnJlbnQKICAgICAgICAgICAgIyBzZWN1cmUgb3JpZ2luIGFuZCB3ZSBzaG91bGQgcmV0dXJuIFRydWUKICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICAgICAgIyBJZiB3ZSd2ZSBnb3R0ZW4gdG8gdGhpcyBwb2ludCwgdGhlbiB0aGUgb3JpZ2luIGlzbid0IHNlY3VyZSBhbmQgd2UKICAgICAgICAjIHdpbGwgbm90IGFjY2VwdCBpdCBhcyBhIHZhbGlkIGxvY2F0aW9uIHRvIHNlYXJjaC4gV2Ugd2lsbCBob3dldmVyCiAgICAgICAgIyBsb2cgYSB3YXJuaW5nIHRoYXQgd2UgYXJlIGlnbm9yaW5nIGl0LgogICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAiVGhlIHJlcG9zaXRvcnkgbG9jYXRlZCBhdCAlcyBpcyBub3QgYSB0cnVzdGVkIG9yIHNlY3VyZSBob3N0IGFuZCAiCiAgICAgICAgICAgICJpcyBiZWluZyBpZ25vcmVkLiBJZiB0aGlzIHJlcG9zaXRvcnkgaXMgYXZhaWxhYmxlIHZpYSBIVFRQUyBpdCAiCiAgICAgICAgICAgICJpcyByZWNvbW1lbmRlZCB0byB1c2UgSFRUUFMgaW5zdGVhZCwgb3RoZXJ3aXNlIHlvdSBtYXkgc2lsZW5jZSAiCiAgICAgICAgICAgICJ0aGlzIHdhcm5pbmcgYW5kIGFsbG93IGl0IGFueXdheXMgd2l0aCAnLS10cnVzdGVkLWhvc3QgJXMnLiIsCiAgICAgICAgICAgIHBhcnNlZC5ob3N0bmFtZSwKICAgICAgICAgICAgcGFyc2VkLmhvc3RuYW1lLAogICAgICAgICkKCiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZGVmIF9nZXRfaW5kZXhfdXJsc19sb2NhdGlvbnMoc2VsZiwgcHJvamVjdF9uYW1lKToKICAgICAgICAiIiJSZXR1cm5zIHRoZSBsb2NhdGlvbnMgZm91bmQgdmlhIHNlbGYuaW5kZXhfdXJscwoKICAgICAgICBDaGVja3MgdGhlIHVybF9uYW1lIG9uIHRoZSBtYWluIChmaXJzdCBpbiB0aGUgbGlzdCkgaW5kZXggYW5kCiAgICAgICAgdXNlIHRoaXMgdXJsX25hbWUgdG8gcHJvZHVjZSBhbGwgbG9jYXRpb25zCiAgICAgICAgIiIiCgogICAgICAgIGRlZiBta3VybF9weXBpX3VybCh1cmwpOgogICAgICAgICAgICBsb2MgPSBwb3NpeHBhdGguam9pbigKICAgICAgICAgICAgICAgIHVybCwKICAgICAgICAgICAgICAgIHVybGxpYl9wYXJzZS5xdW90ZShjYW5vbmljYWxpemVfbmFtZShwcm9qZWN0X25hbWUpKSkKICAgICAgICAgICAgIyBGb3IgbWF4aW11bSBjb21wYXRpYmlsaXR5IHdpdGggZWFzeV9pbnN0YWxsLCBlbnN1cmUgdGhlIHBhdGgKICAgICAgICAgICAgIyBlbmRzIGluIGEgdHJhaWxpbmcgc2xhc2guICBBbHRob3VnaCB0aGlzIGlzbid0IGluIHRoZSBzcGVjCiAgICAgICAgICAgICMgKGFuZCBQeVBJIGNhbiBoYW5kbGUgaXQgd2l0aG91dCB0aGUgc2xhc2gpIHNvbWUgb3RoZXIgaW5kZXgKICAgICAgICAgICAgIyBpbXBsZW1lbnRhdGlvbnMgbWlnaHQgYnJlYWsgaWYgdGhleSByZWxpZWQgb24gZWFzeV9pbnN0YWxsJ3MKICAgICAgICAgICAgIyBiZWhhdmlvci4KICAgICAgICAgICAgaWYgbm90IGxvYy5lbmRzd2l0aCgnLycpOgogICAgICAgICAgICAgICAgbG9jID0gbG9jICsgJy8nCiAgICAgICAgICAgIHJldHVybiBsb2MKCiAgICAgICAgcmV0dXJuIFtta3VybF9weXBpX3VybCh1cmwpIGZvciB1cmwgaW4gc2VsZi5pbmRleF91cmxzXQoKICAgIGRlZiBmaW5kX2FsbF9jYW5kaWRhdGVzKHNlbGYsIHByb2plY3RfbmFtZSk6CiAgICAgICAgIiIiRmluZCBhbGwgYXZhaWxhYmxlIEluc3RhbGxhdGlvbkNhbmRpZGF0ZSBmb3IgcHJvamVjdF9uYW1lCgogICAgICAgIFRoaXMgY2hlY2tzIGluZGV4X3VybHMsIGZpbmRfbGlua3MgYW5kIGRlcGVuZGVuY3lfbGlua3MuCiAgICAgICAgQWxsIHZlcnNpb25zIGZvdW5kIGFyZSByZXR1cm5lZCBhcyBhbiBJbnN0YWxsYXRpb25DYW5kaWRhdGUgbGlzdC4KCiAgICAgICAgU2VlIF9saW5rX3BhY2thZ2VfdmVyc2lvbnMgZm9yIGRldGFpbHMgb24gd2hpY2ggZmlsZXMgYXJlIGFjY2VwdGVkCiAgICAgICAgIiIiCiAgICAgICAgaW5kZXhfbG9jYXRpb25zID0gc2VsZi5fZ2V0X2luZGV4X3VybHNfbG9jYXRpb25zKHByb2plY3RfbmFtZSkKICAgICAgICBpbmRleF9maWxlX2xvYywgaW5kZXhfdXJsX2xvYyA9IHNlbGYuX3NvcnRfbG9jYXRpb25zKGluZGV4X2xvY2F0aW9ucykKICAgICAgICBmbF9maWxlX2xvYywgZmxfdXJsX2xvYyA9IHNlbGYuX3NvcnRfbG9jYXRpb25zKAogICAgICAgICAgICBzZWxmLmZpbmRfbGlua3MsIGV4cGFuZF9kaXI9VHJ1ZSkKICAgICAgICBkZXBfZmlsZV9sb2MsIGRlcF91cmxfbG9jID0gc2VsZi5fc29ydF9sb2NhdGlvbnMoc2VsZi5kZXBlbmRlbmN5X2xpbmtzKQoKICAgICAgICBmaWxlX2xvY2F0aW9ucyA9ICgKICAgICAgICAgICAgTGluayh1cmwpIGZvciB1cmwgaW4gaXRlcnRvb2xzLmNoYWluKAogICAgICAgICAgICAgICAgaW5kZXhfZmlsZV9sb2MsIGZsX2ZpbGVfbG9jLCBkZXBfZmlsZV9sb2MpCiAgICAgICAgKQoKICAgICAgICAjIFdlIHRydXN0IGV2ZXJ5IHVybCB0aGF0IHRoZSB1c2VyIGhhcyBnaXZlbiB1cyB3aGV0aGVyIGl0IHdhcyBnaXZlbgogICAgICAgICMgICB2aWEgLS1pbmRleC11cmwgb3IgLS1maW5kLWxpbmtzCiAgICAgICAgIyBXZSBleHBsaWNpdGx5IGRvIG5vdCB0cnVzdCBsaW5rcyB0aGF0IGNhbWUgZnJvbSBkZXBlbmRlbmN5X2xpbmtzCiAgICAgICAgIyBXZSB3YW50IHRvIGZpbHRlciBvdXQgYW55IHRoaW5nIHdoaWNoIGRvZXMgbm90IGhhdmUgYSBzZWN1cmUgb3JpZ2luLgogICAgICAgIHVybF9sb2NhdGlvbnMgPSBbCiAgICAgICAgICAgIGxpbmsgZm9yIGxpbmsgaW4gaXRlcnRvb2xzLmNoYWluKAogICAgICAgICAgICAgICAgKExpbmsodXJsKSBmb3IgdXJsIGluIGluZGV4X3VybF9sb2MpLAogICAgICAgICAgICAgICAgKExpbmsodXJsKSBmb3IgdXJsIGluIGZsX3VybF9sb2MpLAogICAgICAgICAgICAgICAgKExpbmsodXJsKSBmb3IgdXJsIGluIGRlcF91cmxfbG9jKSwKICAgICAgICAgICAgKQogICAgICAgICAgICBpZiBzZWxmLl92YWxpZGF0ZV9zZWN1cmVfb3JpZ2luKGxvZ2dlciwgbGluaykKICAgICAgICBdCgogICAgICAgIGxvZ2dlci5kZWJ1ZygnJWQgbG9jYXRpb24ocykgdG8gc2VhcmNoIGZvciB2ZXJzaW9ucyBvZiAlczonLAogICAgICAgICAgICAgICAgICAgICBsZW4odXJsX2xvY2F0aW9ucyksIHByb2plY3RfbmFtZSkKCiAgICAgICAgZm9yIGxvY2F0aW9uIGluIHVybF9sb2NhdGlvbnM6CiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnKiAlcycsIGxvY2F0aW9uKQoKICAgICAgICBjYW5vbmljYWxfbmFtZSA9IGNhbm9uaWNhbGl6ZV9uYW1lKHByb2plY3RfbmFtZSkKICAgICAgICBmb3JtYXRzID0gZm10X2N0bF9mb3JtYXRzKHNlbGYuZm9ybWF0X2NvbnRyb2wsIGNhbm9uaWNhbF9uYW1lKQogICAgICAgIHNlYXJjaCA9IFNlYXJjaChwcm9qZWN0X25hbWUsIGNhbm9uaWNhbF9uYW1lLCBmb3JtYXRzKQogICAgICAgIGZpbmRfbGlua3NfdmVyc2lvbnMgPSBzZWxmLl9wYWNrYWdlX3ZlcnNpb25zKAogICAgICAgICAgICAjIFdlIHRydXN0IGV2ZXJ5IGRpcmVjdGx5IGxpbmtlZCBhcmNoaXZlIGluIGZpbmRfbGlua3MKICAgICAgICAgICAgKExpbmsodXJsLCAnLWYnKSBmb3IgdXJsIGluIHNlbGYuZmluZF9saW5rcyksCiAgICAgICAgICAgIHNlYXJjaAogICAgICAgICkKCiAgICAgICAgcGFnZV92ZXJzaW9ucyA9IFtdCiAgICAgICAgZm9yIHBhZ2UgaW4gc2VsZi5fZ2V0X3BhZ2VzKHVybF9sb2NhdGlvbnMsIHByb2plY3RfbmFtZSk6CiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnQW5hbHl6aW5nIGxpbmtzIGZyb20gcGFnZSAlcycsIHBhZ2UudXJsKQogICAgICAgICAgICB3aXRoIGluZGVudF9sb2coKToKICAgICAgICAgICAgICAgIHBhZ2VfdmVyc2lvbnMuZXh0ZW5kKAogICAgICAgICAgICAgICAgICAgIHNlbGYuX3BhY2thZ2VfdmVyc2lvbnMocGFnZS5saW5rcywgc2VhcmNoKQogICAgICAgICAgICAgICAgKQoKICAgICAgICBkZXBlbmRlbmN5X3ZlcnNpb25zID0gc2VsZi5fcGFja2FnZV92ZXJzaW9ucygKICAgICAgICAgICAgKExpbmsodXJsKSBmb3IgdXJsIGluIHNlbGYuZGVwZW5kZW5jeV9saW5rcyksIHNlYXJjaAogICAgICAgICkKICAgICAgICBpZiBkZXBlbmRlbmN5X3ZlcnNpb25zOgogICAgICAgICAgICBsb2dnZXIuZGVidWcoCiAgICAgICAgICAgICAgICAnZGVwZW5kZW5jeV9saW5rcyBmb3VuZDogJXMnLAogICAgICAgICAgICAgICAgJywgJy5qb2luKFsKICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uLmxvY2F0aW9uLnVybCBmb3IgdmVyc2lvbiBpbiBkZXBlbmRlbmN5X3ZlcnNpb25zCiAgICAgICAgICAgICAgICBdKQogICAgICAgICAgICApCgogICAgICAgIGZpbGVfdmVyc2lvbnMgPSBzZWxmLl9wYWNrYWdlX3ZlcnNpb25zKGZpbGVfbG9jYXRpb25zLCBzZWFyY2gpCiAgICAgICAgaWYgZmlsZV92ZXJzaW9uczoKICAgICAgICAgICAgZmlsZV92ZXJzaW9ucy5zb3J0KHJldmVyc2U9VHJ1ZSkKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKAogICAgICAgICAgICAgICAgJ0xvY2FsIGZpbGVzIGZvdW5kOiAlcycsCiAgICAgICAgICAgICAgICAnLCAnLmpvaW4oWwogICAgICAgICAgICAgICAgICAgIHVybF90b19wYXRoKGNhbmRpZGF0ZS5sb2NhdGlvbi51cmwpCiAgICAgICAgICAgICAgICAgICAgZm9yIGNhbmRpZGF0ZSBpbiBmaWxlX3ZlcnNpb25zCiAgICAgICAgICAgICAgICBdKQogICAgICAgICAgICApCgogICAgICAgICMgVGhpcyBpcyBhbiBpbnRlbnRpb25hbCBwcmlvcml0eSBvcmRlcmluZwogICAgICAgIHJldHVybiAoCiAgICAgICAgICAgIGZpbGVfdmVyc2lvbnMgKyBmaW5kX2xpbmtzX3ZlcnNpb25zICsgcGFnZV92ZXJzaW9ucyArCiAgICAgICAgICAgIGRlcGVuZGVuY3lfdmVyc2lvbnMKICAgICAgICApCgogICAgZGVmIGZpbmRfcmVxdWlyZW1lbnQoc2VsZiwgcmVxLCB1cGdyYWRlKToKICAgICAgICAiIiJUcnkgdG8gZmluZCBhIExpbmsgbWF0Y2hpbmcgcmVxCgogICAgICAgIEV4cGVjdHMgcmVxLCBhbiBJbnN0YWxsUmVxdWlyZW1lbnQgYW5kIHVwZ3JhZGUsIGEgYm9vbGVhbgogICAgICAgIFJldHVybnMgYSBMaW5rIGlmIGZvdW5kLAogICAgICAgIFJhaXNlcyBEaXN0cmlidXRpb25Ob3RGb3VuZCBvciBCZXN0VmVyc2lvbkFscmVhZHlJbnN0YWxsZWQgb3RoZXJ3aXNlCiAgICAgICAgIiIiCiAgICAgICAgYWxsX2NhbmRpZGF0ZXMgPSBzZWxmLmZpbmRfYWxsX2NhbmRpZGF0ZXMocmVxLm5hbWUpCgogICAgICAgICMgRmlsdGVyIG91dCBhbnl0aGluZyB3aGljaCBkb2Vzbid0IG1hdGNoIG91ciBzcGVjaWZpZXIKICAgICAgICBjb21wYXRpYmxlX3ZlcnNpb25zID0gc2V0KAogICAgICAgICAgICByZXEuc3BlY2lmaWVyLmZpbHRlcigKICAgICAgICAgICAgICAgICMgV2UgdHVybiB0aGUgdmVyc2lvbiBvYmplY3QgaW50byBhIHN0ciBoZXJlIGJlY2F1c2Ugb3RoZXJ3aXNlCiAgICAgICAgICAgICAgICAjIHdoZW4gd2UncmUgZGVidW5kbGVkIGJ1dCBzZXR1cHRvb2xzIGlzbid0LCBQeXRob24gd2lsbCBzZWUKICAgICAgICAgICAgICAgICMgcGFja2FnaW5nLnZlcnNpb24uVmVyc2lvbiBhbmQKICAgICAgICAgICAgICAgICMgcGtnX3Jlc291cmNlcy5fdmVuZG9yLnBhY2thZ2luZy52ZXJzaW9uLlZlcnNpb24gYXMgZGlmZmVyZW50CiAgICAgICAgICAgICAgICAjIHR5cGVzLiBUaGlzIHdheSB3ZSdsbCB1c2UgYSBzdHIgYXMgYSBjb21tb24gZGF0YSBpbnRlcmNoYW5nZQogICAgICAgICAgICAgICAgIyBmb3JtYXQuIElmIHdlIHN0b3AgdXNpbmcgdGhlIHBrZ19yZXNvdXJjZXMgcHJvdmlkZWQgc3BlY2lmaWVyCiAgICAgICAgICAgICAgICAjIGFuZCBzdGFydCB1c2luZyBvdXIgb3duLCB3ZSBjYW4gZHJvcCB0aGUgY2FzdCB0byBzdHIoKS4KICAgICAgICAgICAgICAgIFtzdHIoYy52ZXJzaW9uKSBmb3IgYyBpbiBhbGxfY2FuZGlkYXRlc10sCiAgICAgICAgICAgICAgICBwcmVyZWxlYXNlcz0oCiAgICAgICAgICAgICAgICAgICAgc2VsZi5hbGxvd19hbGxfcHJlcmVsZWFzZXMKICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmFsbG93X2FsbF9wcmVyZWxlYXNlcyBlbHNlIE5vbmUKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICkKICAgICAgICApCiAgICAgICAgYXBwbGljYWJsZV9jYW5kaWRhdGVzID0gWwogICAgICAgICAgICAjIEFnYWluLCBjb252ZXJ0aW5nIHRvIHN0ciB0byBkZWFsIHdpdGggZGVidW5kbGluZy4KICAgICAgICAgICAgYyBmb3IgYyBpbiBhbGxfY2FuZGlkYXRlcyBpZiBzdHIoYy52ZXJzaW9uKSBpbiBjb21wYXRpYmxlX3ZlcnNpb25zCiAgICAgICAgXQoKICAgICAgICBpZiBhcHBsaWNhYmxlX2NhbmRpZGF0ZXM6CiAgICAgICAgICAgIGJlc3RfY2FuZGlkYXRlID0gbWF4KGFwcGxpY2FibGVfY2FuZGlkYXRlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5PXNlbGYuX2NhbmRpZGF0ZV9zb3J0X2tleSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBiZXN0X2NhbmRpZGF0ZSA9IE5vbmUKCiAgICAgICAgaWYgcmVxLnNhdGlzZmllZF9ieSBpcyBub3QgTm9uZToKICAgICAgICAgICAgaW5zdGFsbGVkX3ZlcnNpb24gPSBwYXJzZV92ZXJzaW9uKHJlcS5zYXRpc2ZpZWRfYnkudmVyc2lvbikKICAgICAgICBlbHNlOgogICAgICAgICAgICBpbnN0YWxsZWRfdmVyc2lvbiA9IE5vbmUKCiAgICAgICAgaWYgaW5zdGFsbGVkX3ZlcnNpb24gaXMgTm9uZSBhbmQgYmVzdF9jYW5kaWRhdGUgaXMgTm9uZToKICAgICAgICAgICAgbG9nZ2VyLmNyaXRpY2FsKAogICAgICAgICAgICAgICAgJ0NvdWxkIG5vdCBmaW5kIGEgdmVyc2lvbiB0aGF0IHNhdGlzZmllcyB0aGUgcmVxdWlyZW1lbnQgJXMgJwogICAgICAgICAgICAgICAgJyhmcm9tIHZlcnNpb25zOiAlcyknLAogICAgICAgICAgICAgICAgcmVxLAogICAgICAgICAgICAgICAgJywgJy5qb2luKAogICAgICAgICAgICAgICAgICAgIHNvcnRlZCgKICAgICAgICAgICAgICAgICAgICAgICAgc2V0KHN0cihjLnZlcnNpb24pIGZvciBjIGluIGFsbF9jYW5kaWRhdGVzKSwKICAgICAgICAgICAgICAgICAgICAgICAga2V5PXBhcnNlX3ZlcnNpb24sCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICApCgogICAgICAgICAgICByYWlzZSBEaXN0cmlidXRpb25Ob3RGb3VuZCgKICAgICAgICAgICAgICAgICdObyBtYXRjaGluZyBkaXN0cmlidXRpb24gZm91bmQgZm9yICVzJyAlIHJlcQogICAgICAgICAgICApCgogICAgICAgIGJlc3RfaW5zdGFsbGVkID0gRmFsc2UKICAgICAgICBpZiBpbnN0YWxsZWRfdmVyc2lvbiBhbmQgKAogICAgICAgICAgICAgICAgYmVzdF9jYW5kaWRhdGUgaXMgTm9uZSBvcgogICAgICAgICAgICAgICAgYmVzdF9jYW5kaWRhdGUudmVyc2lvbiA8PSBpbnN0YWxsZWRfdmVyc2lvbik6CiAgICAgICAgICAgIGJlc3RfaW5zdGFsbGVkID0gVHJ1ZQoKICAgICAgICBpZiBub3QgdXBncmFkZSBhbmQgaW5zdGFsbGVkX3ZlcnNpb24gaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGlmIGJlc3RfaW5zdGFsbGVkOgogICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKAogICAgICAgICAgICAgICAgICAgICdFeGlzdGluZyBpbnN0YWxsZWQgdmVyc2lvbiAoJXMpIGlzIG1vc3QgdXAtdG8tZGF0ZSBhbmQgJwogICAgICAgICAgICAgICAgICAgICdzYXRpc2ZpZXMgcmVxdWlyZW1lbnQnLAogICAgICAgICAgICAgICAgICAgIGluc3RhbGxlZF92ZXJzaW9uLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKAogICAgICAgICAgICAgICAgICAgICdFeGlzdGluZyBpbnN0YWxsZWQgdmVyc2lvbiAoJXMpIHNhdGlzZmllcyByZXF1aXJlbWVudCAnCiAgICAgICAgICAgICAgICAgICAgJyhtb3N0IHVwLXRvLWRhdGUgdmVyc2lvbiBpcyAlcyknLAogICAgICAgICAgICAgICAgICAgIGluc3RhbGxlZF92ZXJzaW9uLAogICAgICAgICAgICAgICAgICAgIGJlc3RfY2FuZGlkYXRlLnZlcnNpb24sCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgICAgIGlmIGJlc3RfaW5zdGFsbGVkOgogICAgICAgICAgICAjIFdlIGhhdmUgYW4gZXhpc3RpbmcgdmVyc2lvbiwgYW5kIGl0cyB0aGUgYmVzdCB2ZXJzaW9uCiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygKICAgICAgICAgICAgICAgICdJbnN0YWxsZWQgdmVyc2lvbiAoJXMpIGlzIG1vc3QgdXAtdG8tZGF0ZSAocGFzdCB2ZXJzaW9uczogJwogICAgICAgICAgICAgICAgJyVzKScsCiAgICAgICAgICAgICAgICBpbnN0YWxsZWRfdmVyc2lvbiwKICAgICAgICAgICAgICAgICcsICcuam9pbihzb3J0ZWQoY29tcGF0aWJsZV92ZXJzaW9ucywga2V5PXBhcnNlX3ZlcnNpb24pKSBvcgogICAgICAgICAgICAgICAgIm5vbmUiLAogICAgICAgICAgICApCiAgICAgICAgICAgIHJhaXNlIEJlc3RWZXJzaW9uQWxyZWFkeUluc3RhbGxlZAoKICAgICAgICBsb2dnZXIuZGVidWcoCiAgICAgICAgICAgICdVc2luZyB2ZXJzaW9uICVzIChuZXdlc3Qgb2YgdmVyc2lvbnM6ICVzKScsCiAgICAgICAgICAgIGJlc3RfY2FuZGlkYXRlLnZlcnNpb24sCiAgICAgICAgICAgICcsICcuam9pbihzb3J0ZWQoY29tcGF0aWJsZV92ZXJzaW9ucywga2V5PXBhcnNlX3ZlcnNpb24pKQogICAgICAgICkKICAgICAgICByZXR1cm4gYmVzdF9jYW5kaWRhdGUubG9jYXRpb24KCiAgICBkZWYgX2dldF9wYWdlcyhzZWxmLCBsb2NhdGlvbnMsIHByb2plY3RfbmFtZSk6CiAgICAgICAgIiIiCiAgICAgICAgWWllbGRzIChwYWdlLCBwYWdlX3VybCkgZnJvbSB0aGUgZ2l2ZW4gbG9jYXRpb25zLCBza2lwcGluZwogICAgICAgIGxvY2F0aW9ucyB0aGF0IGhhdmUgZXJyb3JzLgogICAgICAgICIiIgogICAgICAgIHNlZW4gPSBzZXQoKQogICAgICAgIGZvciBsb2NhdGlvbiBpbiBsb2NhdGlvbnM6CiAgICAgICAgICAgIGlmIGxvY2F0aW9uIGluIHNlZW46CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBzZWVuLmFkZChsb2NhdGlvbikKCiAgICAgICAgICAgIHBhZ2UgPSBzZWxmLl9nZXRfcGFnZShsb2NhdGlvbikKICAgICAgICAgICAgaWYgcGFnZSBpcyBOb25lOgogICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgIHlpZWxkIHBhZ2UKCiAgICBfcHlfdmVyc2lvbl9yZSA9IHJlLmNvbXBpbGUocictcHkoWzEyM11cLj9bMC05XT8pJCcpCgogICAgZGVmIF9zb3J0X2xpbmtzKHNlbGYsIGxpbmtzKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm5zIGVsZW1lbnRzIG9mIGxpbmtzIGluIG9yZGVyLCBub24tZWdnIGxpbmtzIGZpcnN0LCBlZ2cgbGlua3MKICAgICAgICBzZWNvbmQsIHdoaWxlIGVsaW1pbmF0aW5nIGR1cGxpY2F0ZXMKICAgICAgICAiIiIKICAgICAgICBlZ2dzLCBub19lZ2dzID0gW10sIFtdCiAgICAgICAgc2VlbiA9IHNldCgpCiAgICAgICAgZm9yIGxpbmsgaW4gbGlua3M6CiAgICAgICAgICAgIGlmIGxpbmsgbm90IGluIHNlZW46CiAgICAgICAgICAgICAgICBzZWVuLmFkZChsaW5rKQogICAgICAgICAgICAgICAgaWYgbGluay5lZ2dfZnJhZ21lbnQ6CiAgICAgICAgICAgICAgICAgICAgZWdncy5hcHBlbmQobGluaykKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgbm9fZWdncy5hcHBlbmQobGluaykKICAgICAgICByZXR1cm4gbm9fZWdncyArIGVnZ3MKCiAgICBkZWYgX3BhY2thZ2VfdmVyc2lvbnMoc2VsZiwgbGlua3MsIHNlYXJjaCk6CiAgICAgICAgcmVzdWx0ID0gW10KICAgICAgICBmb3IgbGluayBpbiBzZWxmLl9zb3J0X2xpbmtzKGxpbmtzKToKICAgICAgICAgICAgdiA9IHNlbGYuX2xpbmtfcGFja2FnZV92ZXJzaW9ucyhsaW5rLCBzZWFyY2gpCiAgICAgICAgICAgIGlmIHYgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHYpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBfbG9nX3NraXBwZWRfbGluayhzZWxmLCBsaW5rLCByZWFzb24pOgogICAgICAgIGlmIGxpbmsgbm90IGluIHNlbGYubG9nZ2VkX2xpbmtzOgogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1NraXBwaW5nIGxpbmsgJXM7ICVzJywgbGluaywgcmVhc29uKQogICAgICAgICAgICBzZWxmLmxvZ2dlZF9saW5rcy5hZGQobGluaykKCiAgICBkZWYgX2xpbmtfcGFja2FnZV92ZXJzaW9ucyhzZWxmLCBsaW5rLCBzZWFyY2gpOgogICAgICAgICIiIlJldHVybiBhbiBJbnN0YWxsYXRpb25DYW5kaWRhdGUgb3IgTm9uZSIiIgogICAgICAgIHZlcnNpb24gPSBOb25lCiAgICAgICAgaWYgbGluay5lZ2dfZnJhZ21lbnQ6CiAgICAgICAgICAgIGVnZ19pbmZvID0gbGluay5lZ2dfZnJhZ21lbnQKICAgICAgICAgICAgZXh0ID0gbGluay5leHQKICAgICAgICBlbHNlOgogICAgICAgICAgICBlZ2dfaW5mbywgZXh0ID0gbGluay5zcGxpdGV4dCgpCiAgICAgICAgICAgIGlmIG5vdCBleHQ6CiAgICAgICAgICAgICAgICBzZWxmLl9sb2dfc2tpcHBlZF9saW5rKGxpbmssICdub3QgYSBmaWxlJykKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICBpZiBleHQgbm90IGluIFNVUFBPUlRFRF9FWFRFTlNJT05TOgogICAgICAgICAgICAgICAgc2VsZi5fbG9nX3NraXBwZWRfbGluaygKICAgICAgICAgICAgICAgICAgICBsaW5rLCAndW5zdXBwb3J0ZWQgYXJjaGl2ZSBmb3JtYXQ6ICVzJyAlIGV4dCkKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICBpZiAiYmluYXJ5IiBub3QgaW4gc2VhcmNoLmZvcm1hdHMgYW5kIGV4dCA9PSB3aGVlbF9leHQ6CiAgICAgICAgICAgICAgICBzZWxmLl9sb2dfc2tpcHBlZF9saW5rKAogICAgICAgICAgICAgICAgICAgIGxpbmssICdObyBiaW5hcmllcyBwZXJtaXR0ZWQgZm9yICVzJyAlIHNlYXJjaC5zdXBwbGllZCkKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICBpZiAibWFjb3N4MTAiIGluIGxpbmsucGF0aCBhbmQgZXh0ID09ICcuemlwJzoKICAgICAgICAgICAgICAgIHNlbGYuX2xvZ19za2lwcGVkX2xpbmsobGluaywgJ21hY29zeDEwIG9uZScpCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgaWYgZXh0ID09IHdoZWVsX2V4dDoKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICB3aGVlbCA9IFdoZWVsKGxpbmsuZmlsZW5hbWUpCiAgICAgICAgICAgICAgICBleGNlcHQgSW52YWxpZFdoZWVsRmlsZW5hbWU6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fbG9nX3NraXBwZWRfbGluayhsaW5rLCAnaW52YWxpZCB3aGVlbCBmaWxlbmFtZScpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICAgICBpZiBjYW5vbmljYWxpemVfbmFtZSh3aGVlbC5uYW1lKSAhPSBzZWFyY2guY2Fub25pY2FsOgogICAgICAgICAgICAgICAgICAgIHNlbGYuX2xvZ19za2lwcGVkX2xpbmsoCiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmssICd3cm9uZyBwcm9qZWN0IG5hbWUgKG5vdCAlcyknICUgc2VhcmNoLnN1cHBsaWVkKQogICAgICAgICAgICAgICAgICAgIHJldHVybgoKICAgICAgICAgICAgICAgIGlmIG5vdCB3aGVlbC5zdXBwb3J0ZWQoc2VsZi52YWxpZF90YWdzKToKICAgICAgICAgICAgICAgICAgICBzZWxmLl9sb2dfc2tpcHBlZF9saW5rKAogICAgICAgICAgICAgICAgICAgICAgICBsaW5rLCAnaXQgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGlzIFB5dGhvbicpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICAgICAgICAgdmVyc2lvbiA9IHdoZWVsLnZlcnNpb24KCiAgICAgICAgIyBUaGlzIHNob3VsZCBiZSB1cCBieSB0aGUgc2VhcmNoLm9rX2JpbmFyeSBjaGVjaywgYnV0IHNlZSBpc3N1ZSAyNzAwLgogICAgICAgIGlmICJzb3VyY2UiIG5vdCBpbiBzZWFyY2guZm9ybWF0cyBhbmQgZXh0ICE9IHdoZWVsX2V4dDoKICAgICAgICAgICAgc2VsZi5fbG9nX3NraXBwZWRfbGluaygKICAgICAgICAgICAgICAgIGxpbmssICdObyBzb3VyY2VzIHBlcm1pdHRlZCBmb3IgJXMnICUgc2VhcmNoLnN1cHBsaWVkKQogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgaWYgbm90IHZlcnNpb246CiAgICAgICAgICAgIHZlcnNpb24gPSBlZ2dfaW5mb19tYXRjaGVzKGVnZ19pbmZvLCBzZWFyY2guc3VwcGxpZWQsIGxpbmspCiAgICAgICAgaWYgdmVyc2lvbiBpcyBOb25lOgogICAgICAgICAgICBzZWxmLl9sb2dfc2tpcHBlZF9saW5rKAogICAgICAgICAgICAgICAgbGluaywgJ3dyb25nIHByb2plY3QgbmFtZSAobm90ICVzKScgJSBzZWFyY2guc3VwcGxpZWQpCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBtYXRjaCA9IHNlbGYuX3B5X3ZlcnNpb25fcmUuc2VhcmNoKHZlcnNpb24pCiAgICAgICAgaWYgbWF0Y2g6CiAgICAgICAgICAgIHZlcnNpb24gPSB2ZXJzaW9uWzptYXRjaC5zdGFydCgpXQogICAgICAgICAgICBweV92ZXJzaW9uID0gbWF0Y2guZ3JvdXAoMSkKICAgICAgICAgICAgaWYgcHlfdmVyc2lvbiAhPSBzeXMudmVyc2lvbls6M106CiAgICAgICAgICAgICAgICBzZWxmLl9sb2dfc2tpcHBlZF9saW5rKAogICAgICAgICAgICAgICAgICAgIGxpbmssICdQeXRob24gdmVyc2lvbiBpcyBpbmNvcnJlY3QnKQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzdXBwb3J0X3RoaXNfcHl0aG9uID0gY2hlY2tfcmVxdWlyZXNfcHl0aG9uKGxpbmsucmVxdWlyZXNfcHl0aG9uKQogICAgICAgIGV4Y2VwdCBzcGVjaWZpZXJzLkludmFsaWRTcGVjaWZpZXI6CiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygiUGFja2FnZSAlcyBoYXMgYW4gaW52YWxpZCBSZXF1aXJlcy1QeXRob24gZW50cnk6ICVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmsuZmlsZW5hbWUsIGxpbmsucmVxdWlyZXNfcHl0aG9uKQogICAgICAgICAgICBzdXBwb3J0X3RoaXNfcHl0aG9uID0gVHJ1ZQoKICAgICAgICBpZiBub3Qgc3VwcG9ydF90aGlzX3B5dGhvbjoKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJUaGUgcGFja2FnZSAlcyBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgcHl0aG9uIgogICAgICAgICAgICAgICAgICAgICAgICAgInZlcnNpb24gaW4gdXNlLiBBY2NlcHRhYmxlIHB5dGhvbiB2ZXJzaW9ucyBhcmU6JXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgbGluaywgbGluay5yZXF1aXJlc19weXRob24pCiAgICAgICAgICAgIHJldHVybgogICAgICAgIGxvZ2dlci5kZWJ1ZygnRm91bmQgbGluayAlcywgdmVyc2lvbjogJXMnLCBsaW5rLCB2ZXJzaW9uKQoKICAgICAgICByZXR1cm4gSW5zdGFsbGF0aW9uQ2FuZGlkYXRlKHNlYXJjaC5zdXBwbGllZCwgdmVyc2lvbiwgbGluaykKCiAgICBkZWYgX2dldF9wYWdlKHNlbGYsIGxpbmspOgogICAgICAgIHJldHVybiBIVE1MUGFnZS5nZXRfcGFnZShsaW5rLCBzZXNzaW9uPXNlbGYuc2Vzc2lvbikKCgpkZWYgZWdnX2luZm9fbWF0Y2hlcygKICAgICAgICBlZ2dfaW5mbywgc2VhcmNoX25hbWUsIGxpbmssCiAgICAgICAgX2VnZ19pbmZvX3JlPXJlLmNvbXBpbGUocicoW2EtejAtOV8uXSspLShbYS16MC05Xy4hKy1dKyknLCByZS5JKSk6CiAgICAiIiJQdWxsIHRoZSB2ZXJzaW9uIHBhcnQgb3V0IG9mIGEgc3RyaW5nLgoKICAgIDpwYXJhbSBlZ2dfaW5mbzogVGhlIHN0cmluZyB0byBwYXJzZS4gRS5nLiBmb28tMi4xCiAgICA6cGFyYW0gc2VhcmNoX25hbWU6IFRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRoaXMgYmVsb25ncyB0by4gTm9uZSB0bwogICAgICAgIGluZmVyIHRoZSBuYW1lLiBOb3RlIHRoYXQgdGhpcyBjYW5ub3QgdW5hbWJpZ3VvdXNseSBwYXJzZSBzdHJpbmdzCiAgICAgICAgbGlrZSBmb28tMi0yIHdoaWNoIG1pZ2h0IGJlIGZvbywgMi0yIG9yIGZvby0yLCAyLgogICAgOnBhcmFtIGxpbms6IFRoZSBsaW5rIHRoZSBzdHJpbmcgY2FtZSBmcm9tLCBmb3IgbG9nZ2luZyBvbiBmYWlsdXJlLgogICAgIiIiCiAgICBtYXRjaCA9IF9lZ2dfaW5mb19yZS5zZWFyY2goZWdnX2luZm8pCiAgICBpZiBub3QgbWF0Y2g6CiAgICAgICAgbG9nZ2VyLmRlYnVnKCdDb3VsZCBub3QgcGFyc2UgdmVyc2lvbiBmcm9tIGxpbms6ICVzJywgbGluaykKICAgICAgICByZXR1cm4gTm9uZQogICAgaWYgc2VhcmNoX25hbWUgaXMgTm9uZToKICAgICAgICBmdWxsX21hdGNoID0gbWF0Y2guZ3JvdXAoMCkKICAgICAgICByZXR1cm4gZnVsbF9tYXRjaFtmdWxsX21hdGNoLmluZGV4KCctJyk6XQogICAgbmFtZSA9IG1hdGNoLmdyb3VwKDApLmxvd2VyKCkKICAgICMgVG8gbWF0Y2ggdGhlICJzYWZlIiBuYW1lIHRoYXQgcGtnX3Jlc291cmNlcyBjcmVhdGVzOgogICAgbmFtZSA9IG5hbWUucmVwbGFjZSgnXycsICctJykKICAgICMgcHJvamVjdCBuYW1lIGFuZCB2ZXJzaW9uIG11c3QgYmUgc2VwYXJhdGVkIGJ5IGEgZGFzaAogICAgbG9va19mb3IgPSBzZWFyY2hfbmFtZS5sb3dlcigpICsgIi0iCiAgICBpZiBuYW1lLnN0YXJ0c3dpdGgobG9va19mb3IpOgogICAgICAgIHJldHVybiBtYXRjaC5ncm91cCgwKVtsZW4obG9va19mb3IpOl0KICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIE5vbmUKCgpjbGFzcyBIVE1MUGFnZShvYmplY3QpOgogICAgIiIiUmVwcmVzZW50cyBvbmUgcGFnZSwgYWxvbmcgd2l0aCBpdHMgVVJMIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbnRlbnQsIHVybCwgaGVhZGVycz1Ob25lKToKICAgICAgICAjIERldGVybWluZSBpZiB3ZSBoYXZlIGFueSBlbmNvZGluZyBpbmZvcm1hdGlvbiBpbiBvdXIgaGVhZGVycwogICAgICAgIGVuY29kaW5nID0gTm9uZQogICAgICAgIGlmIGhlYWRlcnMgYW5kICJDb250ZW50LVR5cGUiIGluIGhlYWRlcnM6CiAgICAgICAgICAgIGNvbnRlbnRfdHlwZSwgcGFyYW1zID0gY2dpLnBhcnNlX2hlYWRlcihoZWFkZXJzWyJDb250ZW50LVR5cGUiXSkKCiAgICAgICAgICAgIGlmICJjaGFyc2V0IiBpbiBwYXJhbXM6CiAgICAgICAgICAgICAgICBlbmNvZGluZyA9IHBhcmFtc1snY2hhcnNldCddCgogICAgICAgIHNlbGYuY29udGVudCA9IGNvbnRlbnQKICAgICAgICBzZWxmLnBhcnNlZCA9IGh0bWw1bGliLnBhcnNlKAogICAgICAgICAgICBzZWxmLmNvbnRlbnQsCiAgICAgICAgICAgIHRyYW5zcG9ydF9lbmNvZGluZz1lbmNvZGluZywKICAgICAgICAgICAgbmFtZXNwYWNlSFRNTEVsZW1lbnRzPUZhbHNlLAogICAgICAgICkKICAgICAgICBzZWxmLnVybCA9IHVybAogICAgICAgIHNlbGYuaGVhZGVycyA9IGhlYWRlcnMKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi51cmwKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBnZXRfcGFnZShjbHMsIGxpbmssIHNraXBfYXJjaGl2ZXM9VHJ1ZSwgc2Vzc2lvbj1Ob25lKToKICAgICAgICBpZiBzZXNzaW9uIGlzIE5vbmU6CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigKICAgICAgICAgICAgICAgICJnZXRfcGFnZSgpIG1pc3NpbmcgMSByZXF1aXJlZCBrZXl3b3JkIGFyZ3VtZW50OiAnc2Vzc2lvbiciCiAgICAgICAgICAgICkKCiAgICAgICAgdXJsID0gbGluay51cmwKICAgICAgICB1cmwgPSB1cmwuc3BsaXQoJyMnLCAxKVswXQoKICAgICAgICAjIENoZWNrIGZvciBWQ1Mgc2NoZW1lcyB0aGF0IGRvIG5vdCBzdXBwb3J0IGxvb2t1cCBhcyB3ZWIgcGFnZXMuCiAgICAgICAgZnJvbSBwaXAudmNzIGltcG9ydCBWY3NTdXBwb3J0CiAgICAgICAgZm9yIHNjaGVtZSBpbiBWY3NTdXBwb3J0LnNjaGVtZXM6CiAgICAgICAgICAgIGlmIHVybC5sb3dlcigpLnN0YXJ0c3dpdGgoc2NoZW1lKSBhbmQgdXJsW2xlbihzY2hlbWUpXSBpbiAnKzonOgogICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdDYW5ub3QgbG9vayBhdCAlcyBVUkwgJXMnLCBzY2hlbWUsIGxpbmspCiAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGlmIHNraXBfYXJjaGl2ZXM6CiAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IGxpbmsuZmlsZW5hbWUKICAgICAgICAgICAgICAgIGZvciBiYWRfZXh0IGluIEFSQ0hJVkVfRVhURU5TSU9OUzoKICAgICAgICAgICAgICAgICAgICBpZiBmaWxlbmFtZS5lbmRzd2l0aChiYWRfZXh0KToKICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudF90eXBlID0gY2xzLl9nZXRfY29udGVudF90eXBlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsLCBzZXNzaW9uPXNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgaWYgY29udGVudF90eXBlLmxvd2VyKCkuc3RhcnRzd2l0aCgndGV4dC9odG1sJyk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTa2lwcGluZyBwYWdlICVzIGJlY2F1c2Ugb2YgQ29udGVudC1UeXBlOiAlcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50X3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4KCiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnR2V0dGluZyBwYWdlICVzJywgdXJsKQoKICAgICAgICAgICAgIyBUYWNrIGluZGV4Lmh0bWwgb250byBmaWxlOi8vIFVSTHMgdGhhdCBwb2ludCB0byBkaXJlY3RvcmllcwogICAgICAgICAgICAoc2NoZW1lLCBuZXRsb2MsIHBhdGgsIHBhcmFtcywgcXVlcnksIGZyYWdtZW50KSA9IFwKICAgICAgICAgICAgICAgIHVybGxpYl9wYXJzZS51cmxwYXJzZSh1cmwpCiAgICAgICAgICAgIGlmIChzY2hlbWUgPT0gJ2ZpbGUnIGFuZAogICAgICAgICAgICAgICAgICAgIG9zLnBhdGguaXNkaXIodXJsbGliX3JlcXVlc3QudXJsMnBhdGhuYW1lKHBhdGgpKSk6CiAgICAgICAgICAgICAgICAjIGFkZCB0cmFpbGluZyBzbGFzaCBpZiBub3QgcHJlc2VudCBzbyB1cmxqb2luIGRvZXNuJ3QgdHJpbQogICAgICAgICAgICAgICAgIyBmaW5hbCBzZWdtZW50CiAgICAgICAgICAgICAgICBpZiBub3QgdXJsLmVuZHN3aXRoKCcvJyk6CiAgICAgICAgICAgICAgICAgICAgdXJsICs9ICcvJwogICAgICAgICAgICAgICAgdXJsID0gdXJsbGliX3BhcnNlLnVybGpvaW4odXJsLCAnaW5kZXguaHRtbCcpCiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJyBmaWxlOiBVUkwgaXMgZGlyZWN0b3J5LCBnZXR0aW5nICVzJywgdXJsKQoKICAgICAgICAgICAgcmVzcCA9IHNlc3Npb24uZ2V0KAogICAgICAgICAgICAgICAgdXJsLAogICAgICAgICAgICAgICAgaGVhZGVycz17CiAgICAgICAgICAgICAgICAgICAgIkFjY2VwdCI6ICJ0ZXh0L2h0bWwiLAogICAgICAgICAgICAgICAgICAgICJDYWNoZS1Db250cm9sIjogIm1heC1hZ2U9NjAwIiwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICkKICAgICAgICAgICAgcmVzcC5yYWlzZV9mb3Jfc3RhdHVzKCkKCiAgICAgICAgICAgICMgVGhlIGNoZWNrIGZvciBhcmNoaXZlcyBhYm92ZSBvbmx5IHdvcmtzIGlmIHRoZSB1cmwgZW5kcyB3aXRoCiAgICAgICAgICAgICMgc29tZXRoaW5nIHRoYXQgbG9va3MgbGlrZSBhbiBhcmNoaXZlLiBIb3dldmVyIHRoYXQgaXMgbm90IGEKICAgICAgICAgICAgIyByZXF1aXJlbWVudCBvZiBhbiB1cmwuIFVubGVzcyB3ZSBpc3N1ZSBhIEhFQUQgcmVxdWVzdCBvbiBldmVyeQogICAgICAgICAgICAjIHVybCB3ZSBjYW5ub3Qga25vdyBhaGVhZCBvZiB0aW1lIGZvciBzdXJlIGlmIHNvbWV0aGluZyBpcyBIVE1MCiAgICAgICAgICAgICMgb3Igbm90LiBIb3dldmVyIHdlIGNhbiBjaGVjayBhZnRlciB3ZSd2ZSBkb3dubG9hZGVkIGl0LgogICAgICAgICAgICBjb250ZW50X3R5cGUgPSByZXNwLmhlYWRlcnMuZ2V0KCdDb250ZW50LVR5cGUnLCAndW5rbm93bicpCiAgICAgICAgICAgIGlmIG5vdCBjb250ZW50X3R5cGUubG93ZXIoKS5zdGFydHN3aXRoKCJ0ZXh0L2h0bWwiKToKICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygKICAgICAgICAgICAgICAgICAgICAnU2tpcHBpbmcgcGFnZSAlcyBiZWNhdXNlIG9mIENvbnRlbnQtVHlwZTogJXMnLAogICAgICAgICAgICAgICAgICAgIGxpbmssCiAgICAgICAgICAgICAgICAgICAgY29udGVudF90eXBlLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICAgICBpbnN0ID0gY2xzKHJlc3AuY29udGVudCwgcmVzcC51cmwsIHJlc3AuaGVhZGVycykKICAgICAgICBleGNlcHQgcmVxdWVzdHMuSFRUUEVycm9yIGFzIGV4YzoKICAgICAgICAgICAgY2xzLl9oYW5kbGVfZmFpbChsaW5rLCBleGMsIHVybCkKICAgICAgICBleGNlcHQgU1NMRXJyb3IgYXMgZXhjOgogICAgICAgICAgICByZWFzb24gPSAoIlRoZXJlIHdhcyBhIHByb2JsZW0gY29uZmlybWluZyB0aGUgc3NsIGNlcnRpZmljYXRlOiAiCiAgICAgICAgICAgICAgICAgICAgICAiJXMiICUgZXhjKQogICAgICAgICAgICBjbHMuX2hhbmRsZV9mYWlsKGxpbmssIHJlYXNvbiwgdXJsLCBtZXRoPWxvZ2dlci5pbmZvKQogICAgICAgIGV4Y2VwdCByZXF1ZXN0cy5Db25uZWN0aW9uRXJyb3IgYXMgZXhjOgogICAgICAgICAgICBjbHMuX2hhbmRsZV9mYWlsKGxpbmssICJjb25uZWN0aW9uIGVycm9yOiAlcyIgJSBleGMsIHVybCkKICAgICAgICBleGNlcHQgcmVxdWVzdHMuVGltZW91dDoKICAgICAgICAgICAgY2xzLl9oYW5kbGVfZmFpbChsaW5rLCAidGltZWQgb3V0IiwgdXJsKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBpbnN0CgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9oYW5kbGVfZmFpbChsaW5rLCByZWFzb24sIHVybCwgbWV0aD1Ob25lKToKICAgICAgICBpZiBtZXRoIGlzIE5vbmU6CiAgICAgICAgICAgIG1ldGggPSBsb2dnZXIuZGVidWcKCiAgICAgICAgbWV0aCgiQ291bGQgbm90IGZldGNoIFVSTCAlczogJXMgLSBza2lwcGluZyIsIGxpbmssIHJlYXNvbikKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX2dldF9jb250ZW50X3R5cGUodXJsLCBzZXNzaW9uKToKICAgICAgICAiIiJHZXQgdGhlIENvbnRlbnQtVHlwZSBvZiB0aGUgZ2l2ZW4gdXJsLCB1c2luZyBhIEhFQUQgcmVxdWVzdCIiIgogICAgICAgIHNjaGVtZSwgbmV0bG9jLCBwYXRoLCBxdWVyeSwgZnJhZ21lbnQgPSB1cmxsaWJfcGFyc2UudXJsc3BsaXQodXJsKQogICAgICAgIGlmIHNjaGVtZSBub3QgaW4gKCdodHRwJywgJ2h0dHBzJyk6CiAgICAgICAgICAgICMgRklYTUU6IHNvbWUgd2FybmluZyBvciBzb21ldGhpbmc/CiAgICAgICAgICAgICMgYXNzZXJ0aW9uIGVycm9yPwogICAgICAgICAgICByZXR1cm4gJycKCiAgICAgICAgcmVzcCA9IHNlc3Npb24uaGVhZCh1cmwsIGFsbG93X3JlZGlyZWN0cz1UcnVlKQogICAgICAgIHJlc3AucmFpc2VfZm9yX3N0YXR1cygpCgogICAgICAgIHJldHVybiByZXNwLmhlYWRlcnMuZ2V0KCJDb250ZW50LVR5cGUiLCAiIikKCiAgICBAY2FjaGVkX3Byb3BlcnR5CiAgICBkZWYgYmFzZV91cmwoc2VsZik6CiAgICAgICAgYmFzZXMgPSBbCiAgICAgICAgICAgIHggZm9yIHggaW4gc2VsZi5wYXJzZWQuZmluZGFsbCgiLi8vYmFzZSIpCiAgICAgICAgICAgIGlmIHguZ2V0KCJocmVmIikgaXMgbm90IE5vbmUKICAgICAgICBdCiAgICAgICAgaWYgYmFzZXMgYW5kIGJhc2VzWzBdLmdldCgiaHJlZiIpOgogICAgICAgICAgICByZXR1cm4gYmFzZXNbMF0uZ2V0KCJocmVmIikKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gc2VsZi51cmwKCiAgICBAcHJvcGVydHkKICAgIGRlZiBsaW5rcyhzZWxmKToKICAgICAgICAiIiJZaWVsZHMgYWxsIGxpbmtzIGluIHRoZSBwYWdlIiIiCiAgICAgICAgZm9yIGFuY2hvciBpbiBzZWxmLnBhcnNlZC5maW5kYWxsKCIuLy9hIik6CiAgICAgICAgICAgIGlmIGFuY2hvci5nZXQoImhyZWYiKToKICAgICAgICAgICAgICAgIGhyZWYgPSBhbmNob3IuZ2V0KCJocmVmIikKICAgICAgICAgICAgICAgIHVybCA9IHNlbGYuY2xlYW5fbGluaygKICAgICAgICAgICAgICAgICAgICB1cmxsaWJfcGFyc2UudXJsam9pbihzZWxmLmJhc2VfdXJsLCBocmVmKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgcHlyZXF1aXJlID0gYW5jaG9yLmdldCgnZGF0YS1yZXF1aXJlcy1weXRob24nKQogICAgICAgICAgICAgICAgcHlyZXF1aXJlID0gdW5lc2NhcGUocHlyZXF1aXJlKSBpZiBweXJlcXVpcmUgZWxzZSBOb25lCiAgICAgICAgICAgICAgICB5aWVsZCBMaW5rKHVybCwgc2VsZiwgcmVxdWlyZXNfcHl0aG9uPXB5cmVxdWlyZSkKCiAgICBfY2xlYW5fcmUgPSByZS5jb21waWxlKHInW15hLXowLTkkJissLzo7PT9ALiMlX1xcfC1dJywgcmUuSSkKCiAgICBkZWYgY2xlYW5fbGluayhzZWxmLCB1cmwpOgogICAgICAgICIiIk1ha2VzIHN1cmUgYSBsaW5rIGlzIGZ1bGx5IGVuY29kZWQuICBUaGF0IGlzLCBpZiBhICcgJyBzaG93cyB1cCBpbgogICAgICAgIHRoZSBsaW5rLCBpdCB3aWxsIGJlIHJld3JpdHRlbiB0byAlMjAgKHdoaWxlIG5vdCBvdmVyLXF1b3RpbmcKICAgICAgICAlIG9yIG90aGVyIGNoYXJhY3RlcnMpLiIiIgogICAgICAgIHJldHVybiBzZWxmLl9jbGVhbl9yZS5zdWIoCiAgICAgICAgICAgIGxhbWJkYSBtYXRjaDogJyUlJTJ4JyAlIG9yZChtYXRjaC5ncm91cCgwKSksIHVybCkKCgpjbGFzcyBMaW5rKG9iamVjdCk6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHVybCwgY29tZXNfZnJvbT1Ob25lLCByZXF1aXJlc19weXRob249Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgT2JqZWN0IHJlcHJlc2VudGluZyBhIHBhcnNlZCBsaW5rIGZyb20gaHR0cHM6Ly9weXBpLnB5dGhvbi5vcmcvc2ltcGxlLyoKCiAgICAgICAgdXJsOgogICAgICAgICAgICB1cmwgb2YgdGhlIHJlc291cmNlIHBvaW50ZWQgdG8gKGhyZWYgb2YgdGhlIGxpbmspCiAgICAgICAgY29tZXNfZnJvbToKICAgICAgICAgICAgaW5zdGFuY2Ugb2YgSFRNTFBhZ2Ugd2hlcmUgdGhlIGxpbmsgd2FzIGZvdW5kLCBvciBzdHJpbmcuCiAgICAgICAgcmVxdWlyZXNfcHl0aG9uOgogICAgICAgICAgICBTdHJpbmcgY29udGFpbmluZyB0aGUgYFJlcXVpcmVzLVB5dGhvbmAgbWV0YWRhdGEgZmllbGQsIHNwZWNpZmllZAogICAgICAgICAgICBpbiBQRVAgMzQ1LiBUaGlzIG1heSBiZSBzcGVjaWZpZWQgYnkgYSBkYXRhLXJlcXVpcmVzLXB5dGhvbgogICAgICAgICAgICBhdHRyaWJ1dGUgaW4gdGhlIEhUTUwgbGluayB0YWcsIGFzIGRlc2NyaWJlZCBpbiBQRVAgNTAzLgogICAgICAgICIiIgoKICAgICAgICAjIHVybCBjYW4gYmUgYSBVTkMgd2luZG93cyBzaGFyZQogICAgICAgIGlmIHVybC5zdGFydHN3aXRoKCdcXFxcJyk6CiAgICAgICAgICAgIHVybCA9IHBhdGhfdG9fdXJsKHVybCkKCiAgICAgICAgc2VsZi51cmwgPSB1cmwKICAgICAgICBzZWxmLmNvbWVzX2Zyb20gPSBjb21lc19mcm9tCiAgICAgICAgc2VsZi5yZXF1aXJlc19weXRob24gPSByZXF1aXJlc19weXRob24gaWYgcmVxdWlyZXNfcHl0aG9uIGVsc2UgTm9uZQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIGlmIHNlbGYucmVxdWlyZXNfcHl0aG9uOgogICAgICAgICAgICBycCA9ICcgKHJlcXVpcmVzLXB5dGhvbjolcyknICUgc2VsZi5yZXF1aXJlc19weXRob24KICAgICAgICBlbHNlOgogICAgICAgICAgICBycCA9ICcnCiAgICAgICAgaWYgc2VsZi5jb21lc19mcm9tOgogICAgICAgICAgICByZXR1cm4gJyVzIChmcm9tICVzKSVzJyAlIChzZWxmLnVybCwgc2VsZi5jb21lc19mcm9tLCBycCkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gc3RyKHNlbGYudXJsKQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gJzxMaW5rICVzPicgJSBzZWxmCgogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIExpbmspOgogICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKICAgICAgICByZXR1cm4gc2VsZi51cmwgPT0gb3RoZXIudXJsCgogICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIExpbmspOgogICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKICAgICAgICByZXR1cm4gc2VsZi51cmwgIT0gb3RoZXIudXJsCgogICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIExpbmspOgogICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKICAgICAgICByZXR1cm4gc2VsZi51cmwgPCBvdGhlci51cmwKCiAgICBkZWYgX19sZV9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgTGluayk6CiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAogICAgICAgIHJldHVybiBzZWxmLnVybCA8PSBvdGhlci51cmwKCiAgICBkZWYgX19ndF9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgTGluayk6CiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAogICAgICAgIHJldHVybiBzZWxmLnVybCA+IG90aGVyLnVybAoKICAgIGRlZiBfX2dlX18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBMaW5rKToKICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCiAgICAgICAgcmV0dXJuIHNlbGYudXJsID49IG90aGVyLnVybAoKICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKICAgICAgICByZXR1cm4gaGFzaChzZWxmLnVybCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBmaWxlbmFtZShzZWxmKToKICAgICAgICBfLCBuZXRsb2MsIHBhdGgsIF8sIF8gPSB1cmxsaWJfcGFyc2UudXJsc3BsaXQoc2VsZi51cmwpCiAgICAgICAgbmFtZSA9IHBvc2l4cGF0aC5iYXNlbmFtZShwYXRoLnJzdHJpcCgnLycpKSBvciBuZXRsb2MKICAgICAgICBuYW1lID0gdXJsbGliX3BhcnNlLnVucXVvdGUobmFtZSkKICAgICAgICBhc3NlcnQgbmFtZSwgKCdVUkwgJXIgcHJvZHVjZWQgbm8gZmlsZW5hbWUnICUgc2VsZi51cmwpCiAgICAgICAgcmV0dXJuIG5hbWUKCiAgICBAcHJvcGVydHkKICAgIGRlZiBzY2hlbWUoc2VsZik6CiAgICAgICAgcmV0dXJuIHVybGxpYl9wYXJzZS51cmxzcGxpdChzZWxmLnVybClbMF0KCiAgICBAcHJvcGVydHkKICAgIGRlZiBuZXRsb2Moc2VsZik6CiAgICAgICAgcmV0dXJuIHVybGxpYl9wYXJzZS51cmxzcGxpdChzZWxmLnVybClbMV0KCiAgICBAcHJvcGVydHkKICAgIGRlZiBwYXRoKHNlbGYpOgogICAgICAgIHJldHVybiB1cmxsaWJfcGFyc2UudW5xdW90ZSh1cmxsaWJfcGFyc2UudXJsc3BsaXQoc2VsZi51cmwpWzJdKQoKICAgIGRlZiBzcGxpdGV4dChzZWxmKToKICAgICAgICByZXR1cm4gc3BsaXRleHQocG9zaXhwYXRoLmJhc2VuYW1lKHNlbGYucGF0aC5yc3RyaXAoJy8nKSkpCgogICAgQHByb3BlcnR5CiAgICBkZWYgZXh0KHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLnNwbGl0ZXh0KClbMV0KCiAgICBAcHJvcGVydHkKICAgIGRlZiB1cmxfd2l0aG91dF9mcmFnbWVudChzZWxmKToKICAgICAgICBzY2hlbWUsIG5ldGxvYywgcGF0aCwgcXVlcnksIGZyYWdtZW50ID0gdXJsbGliX3BhcnNlLnVybHNwbGl0KHNlbGYudXJsKQogICAgICAgIHJldHVybiB1cmxsaWJfcGFyc2UudXJsdW5zcGxpdCgoc2NoZW1lLCBuZXRsb2MsIHBhdGgsIHF1ZXJ5LCBOb25lKSkKCiAgICBfZWdnX2ZyYWdtZW50X3JlID0gcmUuY29tcGlsZShyJ1sjJl1lZ2c9KFteJl0qKScpCgogICAgQHByb3BlcnR5CiAgICBkZWYgZWdnX2ZyYWdtZW50KHNlbGYpOgogICAgICAgIG1hdGNoID0gc2VsZi5fZWdnX2ZyYWdtZW50X3JlLnNlYXJjaChzZWxmLnVybCkKICAgICAgICBpZiBub3QgbWF0Y2g6CiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgcmV0dXJuIG1hdGNoLmdyb3VwKDEpCgogICAgX3N1YmRpcmVjdG9yeV9mcmFnbWVudF9yZSA9IHJlLmNvbXBpbGUocidbIyZdc3ViZGlyZWN0b3J5PShbXiZdKiknKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHN1YmRpcmVjdG9yeV9mcmFnbWVudChzZWxmKToKICAgICAgICBtYXRjaCA9IHNlbGYuX3N1YmRpcmVjdG9yeV9mcmFnbWVudF9yZS5zZWFyY2goc2VsZi51cmwpCiAgICAgICAgaWYgbm90IG1hdGNoOgogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIHJldHVybiBtYXRjaC5ncm91cCgxKQoKICAgIF9oYXNoX3JlID0gcmUuY29tcGlsZSgKICAgICAgICByJyhzaGExfHNoYTIyNHxzaGEzODR8c2hhMjU2fHNoYTUxMnxtZDUpPShbYS1mMC05XSspJwogICAgKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGhhc2goc2VsZik6CiAgICAgICAgbWF0Y2ggPSBzZWxmLl9oYXNoX3JlLnNlYXJjaChzZWxmLnVybCkKICAgICAgICBpZiBtYXRjaDoKICAgICAgICAgICAgcmV0dXJuIG1hdGNoLmdyb3VwKDIpCiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBAcHJvcGVydHkKICAgIGRlZiBoYXNoX25hbWUoc2VsZik6CiAgICAgICAgbWF0Y2ggPSBzZWxmLl9oYXNoX3JlLnNlYXJjaChzZWxmLnVybCkKICAgICAgICBpZiBtYXRjaDoKICAgICAgICAgICAgcmV0dXJuIG1hdGNoLmdyb3VwKDEpCiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBAcHJvcGVydHkKICAgIGRlZiBzaG93X3VybChzZWxmKToKICAgICAgICByZXR1cm4gcG9zaXhwYXRoLmJhc2VuYW1lKHNlbGYudXJsLnNwbGl0KCcjJywgMSlbMF0uc3BsaXQoJz8nLCAxKVswXSkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc193aGVlbChzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5leHQgPT0gd2hlZWxfZXh0CgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfYXJ0aWZhY3Qoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgRGV0ZXJtaW5lcyBpZiB0aGlzIHBvaW50cyB0byBhbiBhY3R1YWwgYXJ0aWZhY3QgKGUuZy4gYSB0YXJiYWxsKSBvciBpZgogICAgICAgIGl0IHBvaW50cyB0byBhbiAiYWJzdHJhY3QiIHRoaW5nIGxpa2UgYSBwYXRoIG9yIGEgVkNTIGxvY2F0aW9uLgogICAgICAgICIiIgogICAgICAgIGZyb20gcGlwLnZjcyBpbXBvcnQgdmNzCgogICAgICAgIGlmIHNlbGYuc2NoZW1lIGluIHZjcy5hbGxfc2NoZW1lczoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgIHJldHVybiBUcnVlCgoKRm9ybWF0Q29udHJvbCA9IG5hbWVkdHVwbGUoJ0Zvcm1hdENvbnRyb2wnLCAnbm9fYmluYXJ5IG9ubHlfYmluYXJ5JykKIiIiVGhpcyBvYmplY3QgaGFzIHR3byBmaWVsZHMsIG5vX2JpbmFyeSBhbmQgb25seV9iaW5hcnkuCgpJZiBhIGZpZWxkIGlzIGZhbHN5LCBpdCBpc24ndCBzZXQuIElmIGl0IGlzIHsnOmFsbDonfSwgaXQgc2hvdWxkIG1hdGNoIGFsbApwYWNrYWdlcyBleGNlcHQgdGhvc2UgbGlzdGVkIGluIHRoZSBvdGhlciBmaWVsZC4gT25seSBvbmUgZmllbGQgY2FuIGJlIHNldAp0byB7JzphbGw6J30gYXQgYSB0aW1lLiBUaGUgcmVzdCBvZiB0aGUgdGltZSBleGFjdCBwYWNrYWdlIG5hbWUgbWF0Y2hlcwphcmUgbGlzdGVkLCB3aXRoIGFueSBnaXZlbiBwYWNrYWdlIG9ubHkgc2hvd2luZyB1cCBpbiBvbmUgZmllbGQgYXQgYSB0aW1lLgoiIiIKCgpkZWYgZm10X2N0bF9oYW5kbGVfbXV0dWFsX2V4Y2x1ZGUodmFsdWUsIHRhcmdldCwgb3RoZXIpOgogICAgbmV3ID0gdmFsdWUuc3BsaXQoJywnKQogICAgd2hpbGUgJzphbGw6JyBpbiBuZXc6CiAgICAgICAgb3RoZXIuY2xlYXIoKQogICAgICAgIHRhcmdldC5jbGVhcigpCiAgICAgICAgdGFyZ2V0LmFkZCgnOmFsbDonKQogICAgICAgIGRlbCBuZXdbOm5ldy5pbmRleCgnOmFsbDonKSArIDFdCiAgICAgICAgaWYgJzpub25lOicgbm90IGluIG5ldzoKICAgICAgICAgICAgIyBXaXRob3V0IGEgbm9uZSwgd2Ugd2FudCB0byBkaXNjYXJkIGV2ZXJ5dGhpbmcgYXMgOmFsbDogY292ZXJzIGl0CiAgICAgICAgICAgIHJldHVybgogICAgZm9yIG5hbWUgaW4gbmV3OgogICAgICAgIGlmIG5hbWUgPT0gJzpub25lOic6CiAgICAgICAgICAgIHRhcmdldC5jbGVhcigpCiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgbmFtZSA9IGNhbm9uaWNhbGl6ZV9uYW1lKG5hbWUpCiAgICAgICAgb3RoZXIuZGlzY2FyZChuYW1lKQogICAgICAgIHRhcmdldC5hZGQobmFtZSkKCgpkZWYgZm10X2N0bF9mb3JtYXRzKGZtdF9jdGwsIGNhbm9uaWNhbF9uYW1lKToKICAgIHJlc3VsdCA9IHNldChbImJpbmFyeSIsICJzb3VyY2UiXSkKICAgIGlmIGNhbm9uaWNhbF9uYW1lIGluIGZtdF9jdGwub25seV9iaW5hcnk6CiAgICAgICAgcmVzdWx0LmRpc2NhcmQoJ3NvdXJjZScpCiAgICBlbGlmIGNhbm9uaWNhbF9uYW1lIGluIGZtdF9jdGwubm9fYmluYXJ5OgogICAgICAgIHJlc3VsdC5kaXNjYXJkKCdiaW5hcnknKQogICAgZWxpZiAnOmFsbDonIGluIGZtdF9jdGwub25seV9iaW5hcnk6CiAgICAgICAgcmVzdWx0LmRpc2NhcmQoJ3NvdXJjZScpCiAgICBlbGlmICc6YWxsOicgaW4gZm10X2N0bC5ub19iaW5hcnk6CiAgICAgICAgcmVzdWx0LmRpc2NhcmQoJ2JpbmFyeScpCiAgICByZXR1cm4gZnJvemVuc2V0KHJlc3VsdCkKCgpkZWYgZm10X2N0bF9ub19iaW5hcnkoZm10X2N0bCk6CiAgICBmbXRfY3RsX2hhbmRsZV9tdXR1YWxfZXhjbHVkZSgKICAgICAgICAnOmFsbDonLCBmbXRfY3RsLm5vX2JpbmFyeSwgZm10X2N0bC5vbmx5X2JpbmFyeSkKCgpkZWYgZm10X2N0bF9ub191c2Vfd2hlZWwoZm10X2N0bCk6CiAgICBmbXRfY3RsX25vX2JpbmFyeShmbXRfY3RsKQogICAgd2FybmluZ3Mud2FybigKICAgICAgICAnLS1uby11c2Utd2hlZWwgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuICcKICAgICAgICAnIFBsZWFzZSB1c2UgLS1uby1iaW5hcnkgOmFsbDogaW5zdGVhZC4nLCBSZW1vdmVkSW5QaXAxMFdhcm5pbmcsCiAgICAgICAgc3RhY2tsZXZlbD0yKQoKClNlYXJjaCA9IG5hbWVkdHVwbGUoJ1NlYXJjaCcsICdzdXBwbGllZCBjYW5vbmljYWwgZm9ybWF0cycpCiIiIkNhcHR1cmUga2V5IGFzcGVjdHMgb2YgYSBzZWFyY2guCgo6YXR0cmlidXRlIHN1cHBsaWVkOiBUaGUgdXNlciBzdXBwbGllZCBwYWNrYWdlLgo6YXR0cmlidXRlIGNhbm9uaWNhbDogVGhlIGNhbm9uaWNhbCBwYWNrYWdlIG5hbWUuCjphdHRyaWJ1dGUgZm9ybWF0czogVGhlIGZvcm1hdHMgYWxsb3dlZCBmb3IgdGhpcyBwYWNrYWdlLiBTaG91bGQgYmUgYSBzZXQKICAgIHdpdGggJ2JpbmFyeScgb3IgJ3NvdXJjZScgb3IgYm90aCBpbiBpdC4KIiIiClBLAwQUAAAAAAAAACEAtw93mfoVAAD6FQAALQAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL2xvY2F0aW9ucy5weSIiIkxvY2F0aW9ucyB3aGVyZSB3ZSBsb29rIGZvciBjb25maWdzLCBpbnN0YWxsIHN0dWZmLCBldGMiIiIKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBvcwppbXBvcnQgb3MucGF0aAppbXBvcnQgc2l0ZQppbXBvcnQgc3lzCgpmcm9tIGRpc3R1dGlscyBpbXBvcnQgc3lzY29uZmlnCmZyb20gZGlzdHV0aWxzLmNvbW1hbmQuaW5zdGFsbCBpbXBvcnQgaW5zdGFsbCwgU0NIRU1FX0tFWVMgICMgbm9xYQoKZnJvbSBwaXAuY29tcGF0IGltcG9ydCBXSU5ET1dTLCBleHBhbmR1c2VyCmZyb20gcGlwLnV0aWxzIGltcG9ydCBhcHBkaXJzCgoKIyBBcHBsaWNhdGlvbiBEaXJlY3RvcmllcwpVU0VSX0NBQ0hFX0RJUiA9IGFwcGRpcnMudXNlcl9jYWNoZV9kaXIoInBpcCIpCgoKREVMRVRFX01BUktFUl9NRVNTQUdFID0gJycnXApUaGlzIGZpbGUgaXMgcGxhY2VkIGhlcmUgYnkgcGlwIHRvIGluZGljYXRlIHRoZSBzb3VyY2Ugd2FzIHB1dApoZXJlIGJ5IHBpcC4KCk9uY2UgdGhpcyBwYWNrYWdlIGlzIHN1Y2Nlc3NmdWxseSBpbnN0YWxsZWQgdGhpcyBzb3VyY2UgY29kZSB3aWxsIGJlCmRlbGV0ZWQgKHVubGVzcyB5b3UgcmVtb3ZlIHRoaXMgZmlsZSkuCicnJwpQSVBfREVMRVRFX01BUktFUl9GSUxFTkFNRSA9ICdwaXAtZGVsZXRlLXRoaXMtZGlyZWN0b3J5LnR4dCcKCgpkZWYgd3JpdGVfZGVsZXRlX21hcmtlcl9maWxlKGRpcmVjdG9yeSk6CiAgICAiIiIKICAgIFdyaXRlIHRoZSBwaXAgZGVsZXRlIG1hcmtlciBmaWxlIGludG8gdGhpcyBkaXJlY3RvcnkuCiAgICAiIiIKICAgIGZpbGVwYXRoID0gb3MucGF0aC5qb2luKGRpcmVjdG9yeSwgUElQX0RFTEVURV9NQVJLRVJfRklMRU5BTUUpCiAgICB3aXRoIG9wZW4oZmlsZXBhdGgsICd3JykgYXMgbWFya2VyX2ZwOgogICAgICAgIG1hcmtlcl9mcC53cml0ZShERUxFVEVfTUFSS0VSX01FU1NBR0UpCgoKZGVmIHJ1bm5pbmdfdW5kZXJfdmlydHVhbGVudigpOgogICAgIiIiCiAgICBSZXR1cm4gVHJ1ZSBpZiB3ZSdyZSBydW5uaW5nIGluc2lkZSBhIHZpcnR1YWxlbnYsIEZhbHNlIG90aGVyd2lzZS4KCiAgICAiIiIKICAgIGlmIGhhc2F0dHIoc3lzLCAncmVhbF9wcmVmaXgnKToKICAgICAgICByZXR1cm4gVHJ1ZQogICAgZWxpZiBzeXMucHJlZml4ICE9IGdldGF0dHIoc3lzLCAiYmFzZV9wcmVmaXgiLCBzeXMucHJlZml4KToKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIHJldHVybiBGYWxzZQoKCmRlZiB2aXJ0dWFsZW52X25vX2dsb2JhbCgpOgogICAgIiIiCiAgICBSZXR1cm4gVHJ1ZSBpZiBpbiBhIHZlbnYgYW5kIG5vIHN5c3RlbSBzaXRlIHBhY2thZ2VzLgogICAgIiIiCiAgICAjIHRoaXMgbWlycm9ycyB0aGUgbG9naWMgaW4gdmlydHVhbGVudi5weSBmb3IgbG9jYXRpbmcgdGhlCiAgICAjIG5vLWdsb2JhbC1zaXRlLXBhY2thZ2VzLnR4dCBmaWxlCiAgICBzaXRlX21vZF9kaXIgPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5hYnNwYXRoKHNpdGUuX19maWxlX18pKQogICAgbm9fZ2xvYmFsX2ZpbGUgPSBvcy5wYXRoLmpvaW4oc2l0ZV9tb2RfZGlyLCAnbm8tZ2xvYmFsLXNpdGUtcGFja2FnZXMudHh0JykKICAgIGlmIHJ1bm5pbmdfdW5kZXJfdmlydHVhbGVudigpIGFuZCBvcy5wYXRoLmlzZmlsZShub19nbG9iYWxfZmlsZSk6CiAgICAgICAgcmV0dXJuIFRydWUKCgppZiBydW5uaW5nX3VuZGVyX3ZpcnR1YWxlbnYoKToKICAgIHNyY19wcmVmaXggPSBvcy5wYXRoLmpvaW4oc3lzLnByZWZpeCwgJ3NyYycpCmVsc2U6CiAgICAjIEZJWE1FOiBrZWVwIHNyYyBpbiBjd2QgZm9yIG5vdyAoaXQgaXMgbm90IGEgdGVtcG9yYXJ5IGZvbGRlcikKICAgIHRyeToKICAgICAgICBzcmNfcHJlZml4ID0gb3MucGF0aC5qb2luKG9zLmdldGN3ZCgpLCAnc3JjJykKICAgIGV4Y2VwdCBPU0Vycm9yOgogICAgICAgICMgSW4gY2FzZSB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBoYXMgYmVlbiByZW5hbWVkIG9yIGRlbGV0ZWQKICAgICAgICBzeXMuZXhpdCgKICAgICAgICAgICAgIlRoZSBmb2xkZXIgeW91IGFyZSBleGVjdXRpbmcgcGlwIGZyb20gY2FuIG5vIGxvbmdlciBiZSBmb3VuZC4iCiAgICAgICAgKQoKIyB1bmRlciBtYWNPUyArIHZpcnR1YWxlbnYgc3lzLnByZWZpeCBpcyBub3QgcHJvcGVybHkgcmVzb2x2ZWQKIyBpdCBpcyBzb21ldGhpbmcgbGlrZSAvcGF0aC90by9weXRob24vYmluLy4uCiMgTm90ZTogdXNpbmcgcmVhbHBhdGggZHVlIHRvIHRtcCBkaXJzIG9uIE9TWCBiZWluZyBzeW1saW5rcwpzcmNfcHJlZml4ID0gb3MucGF0aC5hYnNwYXRoKHNyY19wcmVmaXgpCgojIEZJWE1FIGRvZXNuJ3QgYWNjb3VudCBmb3IgdmVudiBsaW5rZWQgdG8gZ2xvYmFsIHNpdGUtcGFja2FnZXMKCnNpdGVfcGFja2FnZXMgPSBzeXNjb25maWcuZ2V0X3B5dGhvbl9saWIoKQp1c2VyX3NpdGUgPSBzaXRlLlVTRVJfU0lURQp1c2VyX2RpciA9IGV4cGFuZHVzZXIoJ34nKQppZiBXSU5ET1dTOgogICAgYmluX3B5ID0gb3MucGF0aC5qb2luKHN5cy5wcmVmaXgsICdTY3JpcHRzJykKICAgIGJpbl91c2VyID0gb3MucGF0aC5qb2luKHVzZXJfc2l0ZSwgJ1NjcmlwdHMnKQogICAgIyBidWlsZG91dCB1c2VzICdiaW4nIG9uIFdpbmRvd3MgdG9vPwogICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGJpbl9weSk6CiAgICAgICAgYmluX3B5ID0gb3MucGF0aC5qb2luKHN5cy5wcmVmaXgsICdiaW4nKQogICAgICAgIGJpbl91c2VyID0gb3MucGF0aC5qb2luKHVzZXJfc2l0ZSwgJ2JpbicpCgogICAgY29uZmlnX2Jhc2VuYW1lID0gJ3BpcC5pbmknCgogICAgbGVnYWN5X3N0b3JhZ2VfZGlyID0gb3MucGF0aC5qb2luKHVzZXJfZGlyLCAncGlwJykKICAgIGxlZ2FjeV9jb25maWdfZmlsZSA9IG9zLnBhdGguam9pbigKICAgICAgICBsZWdhY3lfc3RvcmFnZV9kaXIsCiAgICAgICAgY29uZmlnX2Jhc2VuYW1lLAogICAgKQplbHNlOgogICAgYmluX3B5ID0gb3MucGF0aC5qb2luKHN5cy5wcmVmaXgsICdiaW4nKQogICAgYmluX3VzZXIgPSBvcy5wYXRoLmpvaW4odXNlcl9zaXRlLCAnYmluJykKCiAgICBjb25maWdfYmFzZW5hbWUgPSAncGlwLmNvbmYnCgogICAgbGVnYWN5X3N0b3JhZ2VfZGlyID0gb3MucGF0aC5qb2luKHVzZXJfZGlyLCAnLnBpcCcpCiAgICBsZWdhY3lfY29uZmlnX2ZpbGUgPSBvcy5wYXRoLmpvaW4oCiAgICAgICAgbGVnYWN5X3N0b3JhZ2VfZGlyLAogICAgICAgIGNvbmZpZ19iYXNlbmFtZSwKICAgICkKCiAgICAjIEZvcmNpbmcgdG8gdXNlIC91c3IvbG9jYWwvYmluIGZvciBzdGFuZGFyZCBtYWNPUyBmcmFtZXdvcmsgaW5zdGFsbHMKICAgICMgQWxzbyBsb2cgdG8gfi9MaWJyYXJ5L0xvZ3MvIGZvciB1c2Ugd2l0aCB0aGUgQ29uc29sZS5hcHAgbG9nIHZpZXdlcgogICAgaWYgc3lzLnBsYXRmb3JtWzo2XSA9PSAnZGFyd2luJyBhbmQgc3lzLnByZWZpeFs6MTZdID09ICcvU3lzdGVtL0xpYnJhcnkvJzoKICAgICAgICBiaW5fcHkgPSAnL3Vzci9sb2NhbC9iaW4nCgpzaXRlX2NvbmZpZ19maWxlcyA9IFsKICAgIG9zLnBhdGguam9pbihwYXRoLCBjb25maWdfYmFzZW5hbWUpCiAgICBmb3IgcGF0aCBpbiBhcHBkaXJzLnNpdGVfY29uZmlnX2RpcnMoJ3BpcCcpCl0KCgpkZWYgZGlzdHV0aWxzX3NjaGVtZShkaXN0X25hbWUsIHVzZXI9RmFsc2UsIGhvbWU9Tm9uZSwgcm9vdD1Ob25lLAogICAgICAgICAgICAgICAgICAgICBpc29sYXRlZD1GYWxzZSwgcHJlZml4PU5vbmUpOgogICAgIiIiCiAgICBSZXR1cm4gYSBkaXN0dXRpbHMgaW5zdGFsbCBzY2hlbWUKICAgICIiIgogICAgZnJvbSBkaXN0dXRpbHMuZGlzdCBpbXBvcnQgRGlzdHJpYnV0aW9uCgogICAgc2NoZW1lID0ge30KCiAgICBpZiBpc29sYXRlZDoKICAgICAgICBleHRyYV9kaXN0X2FyZ3MgPSB7InNjcmlwdF9hcmdzIjogWyItLW5vLXVzZXItY2ZnIl19CiAgICBlbHNlOgogICAgICAgIGV4dHJhX2Rpc3RfYXJncyA9IHt9CiAgICBkaXN0X2FyZ3MgPSB7J25hbWUnOiBkaXN0X25hbWV9CiAgICBkaXN0X2FyZ3MudXBkYXRlKGV4dHJhX2Rpc3RfYXJncykKCiAgICBkID0gRGlzdHJpYnV0aW9uKGRpc3RfYXJncykKICAgIGQucGFyc2VfY29uZmlnX2ZpbGVzKCkKICAgIGkgPSBkLmdldF9jb21tYW5kX29iaignaW5zdGFsbCcsIGNyZWF0ZT1UcnVlKQogICAgIyBOT1RFOiBzZXR0aW5nIHVzZXIgb3IgaG9tZSBoYXMgdGhlIHNpZGUtZWZmZWN0IG9mIGNyZWF0aW5nIHRoZSBob21lIGRpcgogICAgIyBvciB1c2VyIGJhc2UgZm9yIGluc3RhbGxhdGlvbnMgZHVyaW5nIGZpbmFsaXplX29wdGlvbnMoKQogICAgIyBpZGVhbGx5LCB3ZSdkIHByZWZlciBhIHNjaGVtZSBjbGFzcyB0aGF0IGhhcyBubyBzaWRlLWVmZmVjdHMuCiAgICBhc3NlcnQgbm90ICh1c2VyIGFuZCBwcmVmaXgpLCAidXNlcj17MH0gcHJlZml4PXsxfSIuZm9ybWF0KHVzZXIsIHByZWZpeCkKICAgIGkudXNlciA9IHVzZXIgb3IgaS51c2VyCiAgICBpZiB1c2VyOgogICAgICAgIGkucHJlZml4ID0gIiIKICAgIGkucHJlZml4ID0gcHJlZml4IG9yIGkucHJlZml4CiAgICBpLmhvbWUgPSBob21lIG9yIGkuaG9tZQogICAgaS5yb290ID0gcm9vdCBvciBpLnJvb3QKICAgIGkuZmluYWxpemVfb3B0aW9ucygpCiAgICBmb3Iga2V5IGluIFNDSEVNRV9LRVlTOgogICAgICAgIHNjaGVtZVtrZXldID0gZ2V0YXR0cihpLCAnaW5zdGFsbF8nICsga2V5KQoKICAgICMgaW5zdGFsbF9saWIgc3BlY2lmaWVkIGluIHNldHVwLmNmZyBzaG91bGQgaW5zdGFsbCAqZXZlcnl0aGluZyoKICAgICMgaW50byB0aGVyZSAoaS5lLiBpdCB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgYm90aCBwdXJlbGliIGFuZAogICAgIyBwbGF0bGliKS4gIE5vdGUsIGkuaW5zdGFsbF9saWIgaXMgKmFsd2F5cyogc2V0IGFmdGVyCiAgICAjIGZpbmFsaXplX29wdGlvbnMoKTsgd2Ugb25seSB3YW50IHRvIG92ZXJyaWRlIGhlcmUgaWYgdGhlIHVzZXIKICAgICMgaGFzIGV4cGxpY2l0bHkgcmVxdWVzdGVkIGl0IGhlbmNlIGdvaW5nIGJhY2sgdG8gdGhlIGNvbmZpZwogICAgaWYgJ2luc3RhbGxfbGliJyBpbiBkLmdldF9vcHRpb25fZGljdCgnaW5zdGFsbCcpOgogICAgICAgIHNjaGVtZS51cGRhdGUoZGljdChwdXJlbGliPWkuaW5zdGFsbF9saWIsIHBsYXRsaWI9aS5pbnN0YWxsX2xpYikpCgogICAgaWYgcnVubmluZ191bmRlcl92aXJ0dWFsZW52KCk6CiAgICAgICAgc2NoZW1lWydoZWFkZXJzJ10gPSBvcy5wYXRoLmpvaW4oCiAgICAgICAgICAgIHN5cy5wcmVmaXgsCiAgICAgICAgICAgICdpbmNsdWRlJywKICAgICAgICAgICAgJ3NpdGUnLAogICAgICAgICAgICAncHl0aG9uJyArIHN5cy52ZXJzaW9uWzozXSwKICAgICAgICAgICAgZGlzdF9uYW1lLAogICAgICAgICkKCiAgICAgICAgaWYgcm9vdCBpcyBub3QgTm9uZToKICAgICAgICAgICAgcGF0aF9ub19kcml2ZSA9IG9zLnBhdGguc3BsaXRkcml2ZSgKICAgICAgICAgICAgICAgIG9zLnBhdGguYWJzcGF0aChzY2hlbWVbImhlYWRlcnMiXSkpWzFdCiAgICAgICAgICAgIHNjaGVtZVsiaGVhZGVycyJdID0gb3MucGF0aC5qb2luKAogICAgICAgICAgICAgICAgcm9vdCwKICAgICAgICAgICAgICAgIHBhdGhfbm9fZHJpdmVbMTpdLAogICAgICAgICAgICApCgogICAgcmV0dXJuIHNjaGVtZQpQSwMEFAAAAAAAAAAhAKoaZ7xHAAAARwAAADMAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9tb2RlbHMvX19pbml0X18ucHlmcm9tIHBpcC5tb2RlbHMuaW5kZXggaW1wb3J0IEluZGV4LCBQeVBJCgoKX19hbGxfXyA9IFsiSW5kZXgiLCAiUHlQSSJdClBLAwQUAAAAAAAAACEAaE4ybecBAADnAQAAMAAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL21vZGVscy9pbmRleC5weWZyb20gcGlwLl92ZW5kb3Iuc2l4Lm1vdmVzLnVybGxpYiBpbXBvcnQgcGFyc2UgYXMgdXJsbGliX3BhcnNlCgoKY2xhc3MgSW5kZXgob2JqZWN0KToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB1cmwpOgogICAgICAgIHNlbGYudXJsID0gdXJsCiAgICAgICAgc2VsZi5uZXRsb2MgPSB1cmxsaWJfcGFyc2UudXJsc3BsaXQodXJsKS5uZXRsb2MKICAgICAgICBzZWxmLnNpbXBsZV91cmwgPSBzZWxmLnVybF90b19wYXRoKCdzaW1wbGUnKQogICAgICAgIHNlbGYucHlwaV91cmwgPSBzZWxmLnVybF90b19wYXRoKCdweXBpJykKICAgICAgICBzZWxmLnBpcF9qc29uX3VybCA9IHNlbGYudXJsX3RvX3BhdGgoJ3B5cGkvcGlwL2pzb24nKQoKICAgIGRlZiB1cmxfdG9fcGF0aChzZWxmLCBwYXRoKToKICAgICAgICByZXR1cm4gdXJsbGliX3BhcnNlLnVybGpvaW4oc2VsZi51cmwsIHBhdGgpCgoKUHlQSSA9IEluZGV4KCdodHRwczovL3B5cGkucHl0aG9uLm9yZy8nKQpQSwMEFAAAAAAAAAAhAAAAAAAAAAAAAAAAADcAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9vcGVyYXRpb25zL19faW5pdF9fLnB5UEsDBBQAAAAAAAAAIQDPZWKoNgYAADYGAAA0AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvb3BlcmF0aW9ucy9jaGVjay5weQoKZGVmIGNoZWNrX3JlcXVpcmVtZW50cyhpbnN0YWxsZWRfZGlzdHMpOgogICAgbWlzc2luZ19yZXFzX2RpY3QgPSB7fQogICAgaW5jb21wYXRpYmxlX3JlcXNfZGljdCA9IHt9CgogICAgZm9yIGRpc3QgaW4gaW5zdGFsbGVkX2Rpc3RzOgogICAgICAgIGtleSA9ICclcz09JXMnICUgKGRpc3QucHJvamVjdF9uYW1lLCBkaXN0LnZlcnNpb24pCgogICAgICAgIG1pc3NpbmdfcmVxcyA9IGxpc3QoZ2V0X21pc3NpbmdfcmVxcyhkaXN0LCBpbnN0YWxsZWRfZGlzdHMpKQogICAgICAgIGlmIG1pc3NpbmdfcmVxczoKICAgICAgICAgICAgbWlzc2luZ19yZXFzX2RpY3Rba2V5XSA9IG1pc3NpbmdfcmVxcwoKICAgICAgICBpbmNvbXBhdGlibGVfcmVxcyA9IGxpc3QoZ2V0X2luY29tcGF0aWJsZV9yZXFzKAogICAgICAgICAgICBkaXN0LCBpbnN0YWxsZWRfZGlzdHMpKQogICAgICAgIGlmIGluY29tcGF0aWJsZV9yZXFzOgogICAgICAgICAgICBpbmNvbXBhdGlibGVfcmVxc19kaWN0W2tleV0gPSBpbmNvbXBhdGlibGVfcmVxcwoKICAgIHJldHVybiAobWlzc2luZ19yZXFzX2RpY3QsIGluY29tcGF0aWJsZV9yZXFzX2RpY3QpCgoKZGVmIGdldF9taXNzaW5nX3JlcXMoZGlzdCwgaW5zdGFsbGVkX2Rpc3RzKToKICAgICIiIlJldHVybiBhbGwgb2YgdGhlIHJlcXVpcmVtZW50cyBvZiBgZGlzdGAgdGhhdCBhcmVuJ3QgcHJlc2VudCBpbgogICAgYGluc3RhbGxlZF9kaXN0c2AuCgogICAgIiIiCiAgICBpbnN0YWxsZWRfbmFtZXMgPSBzZXQoZC5wcm9qZWN0X25hbWUubG93ZXIoKSBmb3IgZCBpbiBpbnN0YWxsZWRfZGlzdHMpCiAgICBtaXNzaW5nX3JlcXVpcmVtZW50cyA9IHNldCgpCgogICAgZm9yIHJlcXVpcmVtZW50IGluIGRpc3QucmVxdWlyZXMoKToKICAgICAgICBpZiByZXF1aXJlbWVudC5wcm9qZWN0X25hbWUubG93ZXIoKSBub3QgaW4gaW5zdGFsbGVkX25hbWVzOgogICAgICAgICAgICBtaXNzaW5nX3JlcXVpcmVtZW50cy5hZGQocmVxdWlyZW1lbnQpCiAgICAgICAgICAgIHlpZWxkIHJlcXVpcmVtZW50CgoKZGVmIGdldF9pbmNvbXBhdGlibGVfcmVxcyhkaXN0LCBpbnN0YWxsZWRfZGlzdHMpOgogICAgIiIiUmV0dXJuIGFsbCBvZiB0aGUgcmVxdWlyZW1lbnRzIG9mIGBkaXN0YCB0aGF0IGFyZSBwcmVzZW50IGluCiAgICBgaW5zdGFsbGVkX2Rpc3RzYCwgYnV0IGhhdmUgaW5jb21wYXRpYmxlIHZlcnNpb25zLgoKICAgICIiIgogICAgaW5zdGFsbGVkX2Rpc3RzX2J5X25hbWUgPSB7fQogICAgZm9yIGluc3RhbGxlZF9kaXN0IGluIGluc3RhbGxlZF9kaXN0czoKICAgICAgICBpbnN0YWxsZWRfZGlzdHNfYnlfbmFtZVtpbnN0YWxsZWRfZGlzdC5wcm9qZWN0X25hbWVdID0gaW5zdGFsbGVkX2Rpc3QKCiAgICBmb3IgcmVxdWlyZW1lbnQgaW4gZGlzdC5yZXF1aXJlcygpOgogICAgICAgIHByZXNlbnRfZGlzdCA9IGluc3RhbGxlZF9kaXN0c19ieV9uYW1lLmdldChyZXF1aXJlbWVudC5wcm9qZWN0X25hbWUpCgogICAgICAgIGlmIHByZXNlbnRfZGlzdCBhbmQgcHJlc2VudF9kaXN0IG5vdCBpbiByZXF1aXJlbWVudDoKICAgICAgICAgICAgeWllbGQgKHJlcXVpcmVtZW50LCBwcmVzZW50X2Rpc3QpClBLAwQUAAAAAAAAACEA+SIzM0oUAABKFAAANQAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL29wZXJhdGlvbnMvZnJlZXplLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBsb2dnaW5nCmltcG9ydCByZQoKaW1wb3J0IHBpcApmcm9tIHBpcC5yZXEgaW1wb3J0IEluc3RhbGxSZXF1aXJlbWVudApmcm9tIHBpcC5yZXEucmVxX2ZpbGUgaW1wb3J0IENPTU1FTlRfUkUKZnJvbSBwaXAudXRpbHMgaW1wb3J0IGdldF9pbnN0YWxsZWRfZGlzdHJpYnV0aW9ucwpmcm9tIHBpcC5fdmVuZG9yIGltcG9ydCBwa2dfcmVzb3VyY2VzCmZyb20gcGlwLl92ZW5kb3IucGFja2FnaW5nLnV0aWxzIGltcG9ydCBjYW5vbmljYWxpemVfbmFtZQpmcm9tIHBpcC5fdmVuZG9yLnBrZ19yZXNvdXJjZXMgaW1wb3J0IFJlcXVpcmVtZW50UGFyc2VFcnJvcgoKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKCmRlZiBmcmVlemUoCiAgICAgICAgcmVxdWlyZW1lbnQ9Tm9uZSwKICAgICAgICBmaW5kX2xpbmtzPU5vbmUsIGxvY2FsX29ubHk9Tm9uZSwgdXNlcl9vbmx5PU5vbmUsIHNraXBfcmVnZXg9Tm9uZSwKICAgICAgICBkZWZhdWx0X3Zjcz1Ob25lLAogICAgICAgIGlzb2xhdGVkPUZhbHNlLAogICAgICAgIHdoZWVsX2NhY2hlPU5vbmUsCiAgICAgICAgc2tpcD0oKSk6CiAgICBmaW5kX2xpbmtzID0gZmluZF9saW5rcyBvciBbXQogICAgc2tpcF9tYXRjaCA9IE5vbmUKCiAgICBpZiBza2lwX3JlZ2V4OgogICAgICAgIHNraXBfbWF0Y2ggPSByZS5jb21waWxlKHNraXBfcmVnZXgpLnNlYXJjaAoKICAgIGRlcGVuZGVuY3lfbGlua3MgPSBbXQoKICAgIGZvciBkaXN0IGluIHBrZ19yZXNvdXJjZXMud29ya2luZ19zZXQ6CiAgICAgICAgaWYgZGlzdC5oYXNfbWV0YWRhdGEoJ2RlcGVuZGVuY3lfbGlua3MudHh0Jyk6CiAgICAgICAgICAgIGRlcGVuZGVuY3lfbGlua3MuZXh0ZW5kKAogICAgICAgICAgICAgICAgZGlzdC5nZXRfbWV0YWRhdGFfbGluZXMoJ2RlcGVuZGVuY3lfbGlua3MudHh0JykKICAgICAgICAgICAgKQogICAgZm9yIGxpbmsgaW4gZmluZF9saW5rczoKICAgICAgICBpZiAnI2VnZz0nIGluIGxpbms6CiAgICAgICAgICAgIGRlcGVuZGVuY3lfbGlua3MuYXBwZW5kKGxpbmspCiAgICBmb3IgbGluayBpbiBmaW5kX2xpbmtzOgogICAgICAgIHlpZWxkICctZiAlcycgJSBsaW5rCiAgICBpbnN0YWxsYXRpb25zID0ge30KICAgIGZvciBkaXN0IGluIGdldF9pbnN0YWxsZWRfZGlzdHJpYnV0aW9ucyhsb2NhbF9vbmx5PWxvY2FsX29ubHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcD0oKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyX29ubHk9dXNlcl9vbmx5KToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJlcSA9IHBpcC5Gcm96ZW5SZXF1aXJlbWVudC5mcm9tX2Rpc3QoCiAgICAgICAgICAgICAgICBkaXN0LAogICAgICAgICAgICAgICAgZGVwZW5kZW5jeV9saW5rcwogICAgICAgICAgICApCiAgICAgICAgZXhjZXB0IFJlcXVpcmVtZW50UGFyc2VFcnJvcjoKICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICAgICAiQ291bGQgbm90IHBhcnNlIHJlcXVpcmVtZW50OiAlcyIsCiAgICAgICAgICAgICAgICBkaXN0LnByb2plY3RfbmFtZQogICAgICAgICAgICApCiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgaW5zdGFsbGF0aW9uc1tyZXEubmFtZV0gPSByZXEKCiAgICBpZiByZXF1aXJlbWVudDoKICAgICAgICAjIHRoZSBvcHRpb25zIHRoYXQgZG9uJ3QgZ2V0IHR1cm5lZCBpbnRvIGFuIEluc3RhbGxSZXF1aXJlbWVudAogICAgICAgICMgc2hvdWxkIG9ubHkgYmUgZW1pdHRlZCBvbmNlLCBldmVuIGlmIHRoZSBzYW1lIG9wdGlvbiBpcyBpbiBtdWx0aXBsZQogICAgICAgICMgcmVxdWlyZW1lbnRzIGZpbGVzLCBzbyB3ZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2Ygd2hhdCBoYXMgYmVlbiBlbWl0dGVkCiAgICAgICAgIyBzbyB0aGF0IHdlIGRvbid0IGVtaXQgaXQgYWdhaW4gaWYgaXQncyBzZWVuIGFnYWluCiAgICAgICAgZW1pdHRlZF9vcHRpb25zID0gc2V0KCkKICAgICAgICBmb3IgcmVxX2ZpbGVfcGF0aCBpbiByZXF1aXJlbWVudDoKICAgICAgICAgICAgd2l0aCBvcGVuKHJlcV9maWxlX3BhdGgpIGFzIHJlcV9maWxlOgogICAgICAgICAgICAgICAgZm9yIGxpbmUgaW4gcmVxX2ZpbGU6CiAgICAgICAgICAgICAgICAgICAgaWYgKG5vdCBsaW5lLnN0cmlwKCkgb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUuc3RyaXAoKS5zdGFydHN3aXRoKCcjJykgb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChza2lwX21hdGNoIGFuZCBza2lwX21hdGNoKGxpbmUpKSBvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZS5zdGFydHN3aXRoKCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLXInLCAnLS1yZXF1aXJlbWVudCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy1aJywgJy0tYWx3YXlzLXVuemlwJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLWYnLCAnLS1maW5kLWxpbmtzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLWknLCAnLS1pbmRleC11cmwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICctLXByZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy0tdHJ1c3RlZC1ob3N0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLS1wcm9jZXNzLWRlcGVuZGVuY3ktbGlua3MnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICctLWV4dHJhLWluZGV4LXVybCcpKSk6CiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnJzdHJpcCgpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGxpbmUgbm90IGluIGVtaXR0ZWRfb3B0aW9uczoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXR0ZWRfb3B0aW9ucy5hZGQobGluZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIGxpbmUKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgICAgICAgICAgaWYgbGluZS5zdGFydHN3aXRoKCctZScpIG9yIGxpbmUuc3RhcnRzd2l0aCgnLS1lZGl0YWJsZScpOgogICAgICAgICAgICAgICAgICAgICAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoJy1lJyk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZVsyOl0uc3RyaXAoKQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmVbbGVuKCctLWVkaXRhYmxlJyk6XS5zdHJpcCgpLmxzdHJpcCgnPScpCiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVfcmVxID0gSW5zdGFsbFJlcXVpcmVtZW50LmZyb21fZWRpdGFibGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdF92Y3M9ZGVmYXVsdF92Y3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc29sYXRlZD1pc29sYXRlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZWVsX2NhY2hlPXdoZWVsX2NhY2hlLAogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgbGluZV9yZXEgPSBJbnN0YWxsUmVxdWlyZW1lbnQuZnJvbV9saW5lKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09NTUVOVF9SRS5zdWIoJycsIGxpbmUpLnN0cmlwKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc29sYXRlZD1pc29sYXRlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZWVsX2NhY2hlPXdoZWVsX2NhY2hlLAogICAgICAgICAgICAgICAgICAgICAgICApCgogICAgICAgICAgICAgICAgICAgIGlmIG5vdCBsaW5lX3JlcS5uYW1lOgogICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTa2lwcGluZyBsaW5lIGluIHJlcXVpcmVtZW50IGZpbGUgWyVzXSBiZWNhdXNlICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpdCdzIG5vdCBjbGVhciB3aGF0IGl0IHdvdWxkIGluc3RhbGw6ICVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcV9maWxlX3BhdGgsIGxpbmUuc3RyaXAoKSwKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIChhZGQgI2VnZz1QYWNrYWdlTmFtZSB0byB0aGUgVVJMIHRvIGF2b2lkIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIiB0aGlzIHdhcm5pbmcpIgogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgZWxpZiBsaW5lX3JlcS5uYW1lIG5vdCBpbiBpbnN0YWxsYXRpb25zOgogICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZXF1aXJlbWVudCBmaWxlIFslc10gY29udGFpbnMgJXMsIGJ1dCB0aGF0ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYWNrYWdlIGlzIG5vdCBpbnN0YWxsZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxX2ZpbGVfcGF0aCwgQ09NTUVOVF9SRS5zdWIoJycsIGxpbmUpLnN0cmlwKCksCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBzdHIoaW5zdGFsbGF0aW9uc1tsaW5lX3JlcS5uYW1lXSkucnN0cmlwKCkKICAgICAgICAgICAgICAgICAgICAgICAgZGVsIGluc3RhbGxhdGlvbnNbbGluZV9yZXEubmFtZV0KCiAgICAgICAgeWllbGQoCiAgICAgICAgICAgICcjIyBUaGUgZm9sbG93aW5nIHJlcXVpcmVtZW50cyB3ZXJlIGFkZGVkIGJ5ICcKICAgICAgICAgICAgJ3BpcCBmcmVlemU6JwogICAgICAgICkKICAgIGZvciBpbnN0YWxsYXRpb24gaW4gc29ydGVkKAogICAgICAgICAgICBpbnN0YWxsYXRpb25zLnZhbHVlcygpLCBrZXk9bGFtYmRhIHg6IHgubmFtZS5sb3dlcigpKToKICAgICAgICBpZiBjYW5vbmljYWxpemVfbmFtZShpbnN0YWxsYXRpb24ubmFtZSkgbm90IGluIHNraXA6CiAgICAgICAgICAgIHlpZWxkIHN0cihpbnN0YWxsYXRpb24pLnJzdHJpcCgpClBLAwQUAAAAAAAAACEA+iiEteQqAADkKgAALgAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL3BlcDQyNXRhZ3MucHkiIiJHZW5lcmF0ZSBhbmQgd29yayB3aXRoIFBFUCA0MjUgQ29tcGF0aWJpbGl0eSBUYWdzLiIiIgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IHJlCmltcG9ydCBzeXMKaW1wb3J0IHdhcm5pbmdzCmltcG9ydCBwbGF0Zm9ybQppbXBvcnQgbG9nZ2luZwoKdHJ5OgogICAgaW1wb3J0IHN5c2NvbmZpZwpleGNlcHQgSW1wb3J0RXJyb3I6ICAjIHByYWdtYSBub2NvdmVyCiAgICAjIFB5dGhvbiA8IDIuNwogICAgaW1wb3J0IGRpc3R1dGlscy5zeXNjb25maWcgYXMgc3lzY29uZmlnCmltcG9ydCBkaXN0dXRpbHMudXRpbAoKZnJvbSBwaXAuY29tcGF0IGltcG9ydCBPcmRlcmVkRGljdAppbXBvcnQgcGlwLnV0aWxzLmdsaWJjCgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCl9vc3hfYXJjaF9wYXQgPSByZS5jb21waWxlKHInKC4rKV8oXGQrKV8oXGQrKV8oLispJykKCgpkZWYgZ2V0X2NvbmZpZ192YXIodmFyKToKICAgIHRyeToKICAgICAgICByZXR1cm4gc3lzY29uZmlnLmdldF9jb25maWdfdmFyKHZhcikKICAgIGV4Y2VwdCBJT0Vycm9yIGFzIGU6ICAjIElzc3VlICMxMDc0CiAgICAgICAgd2FybmluZ3Mud2FybigiezB9Ii5mb3JtYXQoZSksIFJ1bnRpbWVXYXJuaW5nKQogICAgICAgIHJldHVybiBOb25lCgoKZGVmIGdldF9hYmJyX2ltcGwoKToKICAgICIiIlJldHVybiBhYmJyZXZpYXRlZCBpbXBsZW1lbnRhdGlvbiBuYW1lLiIiIgogICAgaWYgaGFzYXR0cihzeXMsICdweXB5X3ZlcnNpb25faW5mbycpOgogICAgICAgIHB5aW1wbCA9ICdwcCcKICAgIGVsaWYgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ2phdmEnKToKICAgICAgICBweWltcGwgPSAnanknCiAgICBlbGlmIHN5cy5wbGF0Zm9ybSA9PSAnY2xpJzoKICAgICAgICBweWltcGwgPSAnaXAnCiAgICBlbHNlOgogICAgICAgIHB5aW1wbCA9ICdjcCcKICAgIHJldHVybiBweWltcGwKCgpkZWYgZ2V0X2ltcGxfdmVyKCk6CiAgICAiIiJSZXR1cm4gaW1wbGVtZW50YXRpb24gdmVyc2lvbi4iIiIKICAgIGltcGxfdmVyID0gZ2V0X2NvbmZpZ192YXIoInB5X3ZlcnNpb25fbm9kb3QiKQogICAgaWYgbm90IGltcGxfdmVyIG9yIGdldF9hYmJyX2ltcGwoKSA9PSAncHAnOgogICAgICAgIGltcGxfdmVyID0gJycuam9pbihtYXAoc3RyLCBnZXRfaW1wbF92ZXJzaW9uX2luZm8oKSkpCiAgICByZXR1cm4gaW1wbF92ZXIKCgpkZWYgZ2V0X2ltcGxfdmVyc2lvbl9pbmZvKCk6CiAgICAiIiJSZXR1cm4gc3lzLnZlcnNpb25faW5mby1saWtlIHR1cGxlIGZvciB1c2UgaW4gZGVjcmVtZW50aW5nIHRoZSBtaW5vcgogICAgdmVyc2lvbi4iIiIKICAgIGlmIGdldF9hYmJyX2ltcGwoKSA9PSAncHAnOgogICAgICAgICMgYXMgcGVyIGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3BpcC9pc3N1ZXMvMjg4MgogICAgICAgIHJldHVybiAoc3lzLnZlcnNpb25faW5mb1swXSwgc3lzLnB5cHlfdmVyc2lvbl9pbmZvLm1ham9yLAogICAgICAgICAgICAgICAgc3lzLnB5cHlfdmVyc2lvbl9pbmZvLm1pbm9yKQogICAgZWxzZToKICAgICAgICByZXR1cm4gc3lzLnZlcnNpb25faW5mb1swXSwgc3lzLnZlcnNpb25faW5mb1sxXQoKCmRlZiBnZXRfaW1wbF90YWcoKToKICAgICIiIgogICAgUmV0dXJucyB0aGUgVGFnIGZvciB0aGlzIHNwZWNpZmljIGltcGxlbWVudGF0aW9uLgogICAgIiIiCiAgICByZXR1cm4gInswfXsxfSIuZm9ybWF0KGdldF9hYmJyX2ltcGwoKSwgZ2V0X2ltcGxfdmVyKCkpCgoKZGVmIGdldF9mbGFnKHZhciwgZmFsbGJhY2ssIGV4cGVjdGVkPVRydWUsIHdhcm49VHJ1ZSk6CiAgICAiIiJVc2UgYSBmYWxsYmFjayBtZXRob2QgZm9yIGRldGVybWluaW5nIFNPQUJJIGZsYWdzIGlmIHRoZSBuZWVkZWQgY29uZmlnCiAgICB2YXIgaXMgdW5zZXQgb3IgdW5hdmFpbGFibGUuIiIiCiAgICB2YWwgPSBnZXRfY29uZmlnX3Zhcih2YXIpCiAgICBpZiB2YWwgaXMgTm9uZToKICAgICAgICBpZiB3YXJuOgogICAgICAgICAgICBsb2dnZXIuZGVidWcoIkNvbmZpZyB2YXJpYWJsZSAnJXMnIGlzIHVuc2V0LCBQeXRob24gQUJJIHRhZyBtYXkgIgogICAgICAgICAgICAgICAgICAgICAgICAgImJlIGluY29ycmVjdCIsIHZhcikKICAgICAgICByZXR1cm4gZmFsbGJhY2soKQogICAgcmV0dXJuIHZhbCA9PSBleHBlY3RlZAoKCmRlZiBnZXRfYWJpX3RhZygpOgogICAgIiIiUmV0dXJuIHRoZSBBQkkgdGFnIGJhc2VkIG9uIFNPQUJJIChpZiBhdmFpbGFibGUpIG9yIGVtdWxhdGUgU09BQkkKICAgIChDUHl0aG9uIDIsIFB5UHkpLiIiIgogICAgc29hYmkgPSBnZXRfY29uZmlnX3ZhcignU09BQkknKQogICAgaW1wbCA9IGdldF9hYmJyX2ltcGwoKQogICAgaWYgbm90IHNvYWJpIGFuZCBpbXBsIGluICgnY3AnLCAncHAnKSBhbmQgaGFzYXR0cihzeXMsICdtYXh1bmljb2RlJyk6CiAgICAgICAgZCA9ICcnCiAgICAgICAgbSA9ICcnCiAgICAgICAgdSA9ICcnCiAgICAgICAgaWYgZ2V0X2ZsYWcoJ1B5X0RFQlVHJywKICAgICAgICAgICAgICAgICAgICBsYW1iZGE6IGhhc2F0dHIoc3lzLCAnZ2V0dG90YWxyZWZjb3VudCcpLAogICAgICAgICAgICAgICAgICAgIHdhcm49KGltcGwgPT0gJ2NwJykpOgogICAgICAgICAgICBkID0gJ2QnCiAgICAgICAgaWYgZ2V0X2ZsYWcoJ1dJVEhfUFlNQUxMT0MnLAogICAgICAgICAgICAgICAgICAgIGxhbWJkYTogaW1wbCA9PSAnY3AnLAogICAgICAgICAgICAgICAgICAgIHdhcm49KGltcGwgPT0gJ2NwJykpOgogICAgICAgICAgICBtID0gJ20nCiAgICAgICAgaWYgZ2V0X2ZsYWcoJ1B5X1VOSUNPREVfU0laRScsCiAgICAgICAgICAgICAgICAgICAgbGFtYmRhOiBzeXMubWF4dW5pY29kZSA9PSAweDEwZmZmZiwKICAgICAgICAgICAgICAgICAgICBleHBlY3RlZD00LAogICAgICAgICAgICAgICAgICAgIHdhcm49KGltcGwgPT0gJ2NwJyBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgICBzeXMudmVyc2lvbl9pbmZvIDwgKDMsIDMpKSkgXAogICAgICAgICAgICAgICAgYW5kIHN5cy52ZXJzaW9uX2luZm8gPCAoMywgMyk6CiAgICAgICAgICAgIHUgPSAndScKICAgICAgICBhYmkgPSAnJXMlcyVzJXMlcycgJSAoaW1wbCwgZ2V0X2ltcGxfdmVyKCksIGQsIG0sIHUpCiAgICBlbGlmIHNvYWJpIGFuZCBzb2FiaS5zdGFydHN3aXRoKCdjcHl0aG9uLScpOgogICAgICAgIGFiaSA9ICdjcCcgKyBzb2FiaS5zcGxpdCgnLScpWzFdCiAgICBlbGlmIHNvYWJpOgogICAgICAgIGFiaSA9IHNvYWJpLnJlcGxhY2UoJy4nLCAnXycpLnJlcGxhY2UoJy0nLCAnXycpCiAgICBlbHNlOgogICAgICAgIGFiaSA9IE5vbmUKICAgIHJldHVybiBhYmkKCgpkZWYgX2lzX3J1bm5pbmdfMzJiaXQoKToKICAgIHJldHVybiBzeXMubWF4c2l6ZSA9PSAyMTQ3NDgzNjQ3CgoKZGVmIGdldF9wbGF0Zm9ybSgpOgogICAgIiIiUmV0dXJuIG91ciBwbGF0Zm9ybSBuYW1lICd3aW4zMicsICdsaW51eF94ODZfNjQnIiIiCiAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ2Rhcndpbic6CiAgICAgICAgIyBkaXN0dXRpbHMudXRpbC5nZXRfcGxhdGZvcm0oKSByZXR1cm5zIHRoZSByZWxlYXNlIGJhc2VkIG9uIHRoZSB2YWx1ZQogICAgICAgICMgb2YgTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUIG9uIHdoaWNoIFB5dGhvbiB3YXMgYnVpbHQsIHdoaWNoIG1heQogICAgICAgICMgYmUgc2lnbmlmaWNhbnRseSBvbGRlciB0aGFuIHRoZSB1c2VyJ3MgY3VycmVudCBtYWNoaW5lLgogICAgICAgIHJlbGVhc2UsIF8sIG1hY2hpbmUgPSBwbGF0Zm9ybS5tYWNfdmVyKCkKICAgICAgICBzcGxpdF92ZXIgPSByZWxlYXNlLnNwbGl0KCcuJykKCiAgICAgICAgaWYgbWFjaGluZSA9PSAieDg2XzY0IiBhbmQgX2lzX3J1bm5pbmdfMzJiaXQoKToKICAgICAgICAgICAgbWFjaGluZSA9ICJpMzg2IgogICAgICAgIGVsaWYgbWFjaGluZSA9PSAicHBjNjQiIGFuZCBfaXNfcnVubmluZ18zMmJpdCgpOgogICAgICAgICAgICBtYWNoaW5lID0gInBwYyIKCiAgICAgICAgcmV0dXJuICdtYWNvc3hfezB9X3sxfV97Mn0nLmZvcm1hdChzcGxpdF92ZXJbMF0sIHNwbGl0X3ZlclsxXSwgbWFjaGluZSkKCiAgICAjIFhYWCByZW1vdmUgZGlzdHV0aWxzIGRlcGVuZGVuY3kKICAgIHJlc3VsdCA9IGRpc3R1dGlscy51dGlsLmdldF9wbGF0Zm9ybSgpLnJlcGxhY2UoJy4nLCAnXycpLnJlcGxhY2UoJy0nLCAnXycpCiAgICBpZiByZXN1bHQgPT0gImxpbnV4X3g4Nl82NCIgYW5kIF9pc19ydW5uaW5nXzMyYml0KCk6CiAgICAgICAgIyAzMiBiaXQgUHl0aG9uIHByb2dyYW0gKHJ1bm5pbmcgb24gYSA2NCBiaXQgTGludXgpOiBwaXAgc2hvdWxkIG9ubHkKICAgICAgICAjIGluc3RhbGwgYW5kIHJ1biAzMiBiaXQgY29tcGlsZWQgZXh0ZW5zaW9ucyBpbiB0aGF0IGNhc2UuCiAgICAgICAgcmVzdWx0ID0gImxpbnV4X2k2ODYiCgogICAgcmV0dXJuIHJlc3VsdAoKCmRlZiBpc19tYW55bGludXgxX2NvbXBhdGlibGUoKToKICAgICMgT25seSBMaW51eCwgYW5kIG9ubHkgeDg2LTY0IC8gaTY4NgogICAgaWYgZ2V0X3BsYXRmb3JtKCkgbm90IGluICgibGludXhfeDg2XzY0IiwgImxpbnV4X2k2ODYiKToKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAjIENoZWNrIGZvciBwcmVzZW5jZSBvZiBfbWFueWxpbnV4IG1vZHVsZQogICAgdHJ5OgogICAgICAgIGltcG9ydCBfbWFueWxpbnV4CiAgICAgICAgcmV0dXJuIGJvb2woX21hbnlsaW51eC5tYW55bGludXgxX2NvbXBhdGlibGUpCiAgICBleGNlcHQgKEltcG9ydEVycm9yLCBBdHRyaWJ1dGVFcnJvcik6CiAgICAgICAgIyBGYWxsIHRocm91Z2ggdG8gaGV1cmlzdGljIGNoZWNrIGJlbG93CiAgICAgICAgcGFzcwoKICAgICMgQ2hlY2sgZ2xpYmMgdmVyc2lvbi4gQ2VudE9TIDUgdXNlcyBnbGliYyAyLjUuCiAgICByZXR1cm4gcGlwLnV0aWxzLmdsaWJjLmhhdmVfY29tcGF0aWJsZV9nbGliYygyLCA1KQoKCmRlZiBnZXRfZGFyd2luX2FyY2hlcyhtYWpvciwgbWlub3IsIG1hY2hpbmUpOgogICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBzdXBwb3J0ZWQgYXJjaGVzIChpbmNsdWRpbmcgZ3JvdXAgYXJjaGVzKSBmb3IKICAgIHRoZSBnaXZlbiBtYWpvciwgbWlub3IgYW5kIG1hY2hpbmUgYXJjaGl0ZWN0dXJlIG9mIGFuIG1hY09TIG1hY2hpbmUuCiAgICAiIiIKICAgIGFyY2hlcyA9IFtdCgogICAgZGVmIF9zdXBwb3J0c19hcmNoKG1ham9yLCBtaW5vciwgYXJjaCk6CiAgICAgICAgIyBMb29raW5nIGF0IHRoZSBhcHBsaWNhdGlvbiBzdXBwb3J0IGZvciBtYWNPUyB2ZXJzaW9ucyBpbiB0aGUgY2hhcnQKICAgICAgICAjIHByb3ZpZGVkIGJ5IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL09TX1gjVmVyc2lvbnMgaXQgYXBwZWFycwogICAgICAgICMgb3VyIHRpbWVsaW5lIGxvb2tzIHJvdWdobHkgbGlrZToKICAgICAgICAjCiAgICAgICAgIyAxMC4wIC0gSW50cm9kdWNlcyBwcGMgc3VwcG9ydC4KICAgICAgICAjIDEwLjQgLSBJbnRyb2R1Y2VzIHBwYzY0LCBpMzg2LCBhbmQgeDg2XzY0IHN1cHBvcnQsIGhvd2V2ZXIgdGhlIHBwYzY0CiAgICAgICAgIyAgICAgICAgYW5kIHg4Nl82NCBzdXBwb3J0IGlzIENMSSBvbmx5LCBhbmQgY2Fubm90IGJlIHVzZWQgZm9yIEdVSQogICAgICAgICMgICAgICAgIGFwcGxpY2F0aW9ucy4KICAgICAgICAjIDEwLjUgLSBFeHRlbmRzIHBwYzY0IGFuZCB4ODZfNjQgc3VwcG9ydCB0byBjb3ZlciBHVUkgYXBwbGljYXRpb25zLgogICAgICAgICMgMTAuNiAtIERyb3BzIHN1cHBvcnQgZm9yIHBwYzY0CiAgICAgICAgIyAxMC43IC0gRHJvcHMgc3VwcG9ydCBmb3IgcHBjCiAgICAgICAgIwogICAgICAgICMgR2l2ZW4gdGhhdCB3ZSBkbyBub3Qga25vdyBpZiB3ZSdyZSBpbnN0YWxsaW5nIGEgQ0xJIG9yIGEgR1VJCiAgICAgICAgIyBhcHBsaWNhdGlvbiwgd2UgbXVzdCBiZSBjb25zZXJ2YXRpdmUgYW5kIGFzc3VtZSBpdCBtaWdodCBiZSBhIEdVSQogICAgICAgICMgYXBwbGljYXRpb24gYW5kIGJlaGF2ZSBhcyBpZiBwcGM2NCBhbmQgeDg2XzY0IHN1cHBvcnQgZGlkIG5vdCBvY2N1cgogICAgICAgICMgdW50aWwgMTAuNS4KICAgICAgICAjCiAgICAgICAgIyBOb3RlOiBUaGUgYWJvdmUgaW5mb3JtYXRpb24gaXMgdGFrZW4gZnJvbSB0aGUgIkFwcGxpY2F0aW9uIHN1cHBvcnQiCiAgICAgICAgIyAgICAgICBjb2x1bW4gaW4gdGhlIGNoYXJ0IG5vdCB0aGUgIlByb2Nlc3NvciBzdXBwb3J0IiBzaW5jZSBJIGJlbGlldmUKICAgICAgICAjICAgICAgIHRoYXQgd2UgY2FyZSBhYm91dCB3aGF0IGluc3RydWN0aW9uIHNldHMgYW4gYXBwbGljYXRpb24gY2FuIHVzZQogICAgICAgICMgICAgICAgbm90IHdoaWNoIHByb2Nlc3NvcnMgdGhlIE9TIHN1cHBvcnRzLgogICAgICAgIGlmIGFyY2ggPT0gJ3BwYyc6CiAgICAgICAgICAgIHJldHVybiAobWFqb3IsIG1pbm9yKSA8PSAoMTAsIDUpCiAgICAgICAgaWYgYXJjaCA9PSAncHBjNjQnOgogICAgICAgICAgICByZXR1cm4gKG1ham9yLCBtaW5vcikgPT0gKDEwLCA1KQogICAgICAgIGlmIGFyY2ggPT0gJ2kzODYnOgogICAgICAgICAgICByZXR1cm4gKG1ham9yLCBtaW5vcikgPj0gKDEwLCA0KQogICAgICAgIGlmIGFyY2ggPT0gJ3g4Nl82NCc6CiAgICAgICAgICAgIHJldHVybiAobWFqb3IsIG1pbm9yKSA+PSAoMTAsIDUpCiAgICAgICAgaWYgYXJjaCBpbiBncm91cHM6CiAgICAgICAgICAgIGZvciBnYXJjaCBpbiBncm91cHNbYXJjaF06CiAgICAgICAgICAgICAgICBpZiBfc3VwcG9ydHNfYXJjaChtYWpvciwgbWlub3IsIGdhcmNoKToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGdyb3VwcyA9IE9yZGVyZWREaWN0KFsKICAgICAgICAoImZhdCIsICgiaTM4NiIsICJwcGMiKSksCiAgICAgICAgKCJpbnRlbCIsICgieDg2XzY0IiwgImkzODYiKSksCiAgICAgICAgKCJmYXQ2NCIsICgieDg2XzY0IiwgInBwYzY0IikpLAogICAgICAgICgiZmF0MzIiLCAoIng4Nl82NCIsICJpMzg2IiwgInBwYyIpKSwKICAgIF0pCgogICAgaWYgX3N1cHBvcnRzX2FyY2gobWFqb3IsIG1pbm9yLCBtYWNoaW5lKToKICAgICAgICBhcmNoZXMuYXBwZW5kKG1hY2hpbmUpCgogICAgZm9yIGdhcmNoIGluIGdyb3VwczoKICAgICAgICBpZiBtYWNoaW5lIGluIGdyb3Vwc1tnYXJjaF0gYW5kIF9zdXBwb3J0c19hcmNoKG1ham9yLCBtaW5vciwgZ2FyY2gpOgogICAgICAgICAgICBhcmNoZXMuYXBwZW5kKGdhcmNoKQoKICAgIGFyY2hlcy5hcHBlbmQoJ3VuaXZlcnNhbCcpCgogICAgcmV0dXJuIGFyY2hlcwoKCmRlZiBnZXRfc3VwcG9ydGVkKHZlcnNpb25zPU5vbmUsIG5vYXJjaD1GYWxzZSwgcGxhdGZvcm09Tm9uZSwKICAgICAgICAgICAgICAgICAgaW1wbD1Ob25lLCBhYmk9Tm9uZSk6CiAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIHN1cHBvcnRlZCB0YWdzIGZvciBlYWNoIHZlcnNpb24gc3BlY2lmaWVkIGluCiAgICBgdmVyc2lvbnNgLgoKICAgIDpwYXJhbSB2ZXJzaW9uczogYSBsaXN0IG9mIHN0cmluZyB2ZXJzaW9ucywgb2YgdGhlIGZvcm0gWyIzMyIsICIzMiJdLAogICAgICAgIG9yIE5vbmUuIFRoZSBmaXJzdCB2ZXJzaW9uIHdpbGwgYmUgYXNzdW1lZCB0byBzdXBwb3J0IG91ciBBQkkuCiAgICA6cGFyYW0gcGxhdGZvcm06IHNwZWNpZnkgdGhlIGV4YWN0IHBsYXRmb3JtIHlvdSB3YW50IHZhbGlkCiAgICAgICAgdGFncyBmb3IsIG9yIE5vbmUuIElmIE5vbmUsIHVzZSB0aGUgbG9jYWwgc3lzdGVtIHBsYXRmb3JtLgogICAgOnBhcmFtIGltcGw6IHNwZWNpZnkgdGhlIGV4YWN0IGltcGxlbWVudGF0aW9uIHlvdSB3YW50IHZhbGlkCiAgICAgICAgdGFncyBmb3IsIG9yIE5vbmUuIElmIE5vbmUsIHVzZSB0aGUgbG9jYWwgaW50ZXJwcmV0ZXIgaW1wbC4KICAgIDpwYXJhbSBhYmk6IHNwZWNpZnkgdGhlIGV4YWN0IGFiaSB5b3Ugd2FudCB2YWxpZAogICAgICAgIHRhZ3MgZm9yLCBvciBOb25lLiBJZiBOb25lLCB1c2UgdGhlIGxvY2FsIGludGVycHJldGVyIGFiaS4KICAgICIiIgogICAgc3VwcG9ydGVkID0gW10KCiAgICAjIFZlcnNpb25zIG11c3QgYmUgZ2l2ZW4gd2l0aCByZXNwZWN0IHRvIHRoZSBwcmVmZXJlbmNlCiAgICBpZiB2ZXJzaW9ucyBpcyBOb25lOgogICAgICAgIHZlcnNpb25zID0gW10KICAgICAgICB2ZXJzaW9uX2luZm8gPSBnZXRfaW1wbF92ZXJzaW9uX2luZm8oKQogICAgICAgIG1ham9yID0gdmVyc2lvbl9pbmZvWzotMV0KICAgICAgICAjIFN1cHBvcnQgYWxsIHByZXZpb3VzIG1pbm9yIFB5dGhvbiB2ZXJzaW9ucy4KICAgICAgICBmb3IgbWlub3IgaW4gcmFuZ2UodmVyc2lvbl9pbmZvWy0xXSwgLTEsIC0xKToKICAgICAgICAgICAgdmVyc2lvbnMuYXBwZW5kKCcnLmpvaW4obWFwKHN0ciwgbWFqb3IgKyAobWlub3IsKSkpKQoKICAgIGltcGwgPSBpbXBsIG9yIGdldF9hYmJyX2ltcGwoKQoKICAgIGFiaXMgPSBbXQoKICAgIGFiaSA9IGFiaSBvciBnZXRfYWJpX3RhZygpCiAgICBpZiBhYmk6CiAgICAgICAgYWJpc1swOjBdID0gW2FiaV0KCiAgICBhYmkzcyA9IHNldCgpCiAgICBpbXBvcnQgaW1wCiAgICBmb3Igc3VmZml4IGluIGltcC5nZXRfc3VmZml4ZXMoKToKICAgICAgICBpZiBzdWZmaXhbMF0uc3RhcnRzd2l0aCgnLmFiaScpOgogICAgICAgICAgICBhYmkzcy5hZGQoc3VmZml4WzBdLnNwbGl0KCcuJywgMilbMV0pCgogICAgYWJpcy5leHRlbmQoc29ydGVkKGxpc3QoYWJpM3MpKSkKCiAgICBhYmlzLmFwcGVuZCgnbm9uZScpCgogICAgaWYgbm90IG5vYXJjaDoKICAgICAgICBhcmNoID0gcGxhdGZvcm0gb3IgZ2V0X3BsYXRmb3JtKCkKICAgICAgICBpZiBhcmNoLnN0YXJ0c3dpdGgoJ21hY29zeCcpOgogICAgICAgICAgICAjIHN1cHBvcnQgbWFjb3N4LTEwLjYtaW50ZWwgb24gbWFjb3N4LTEwLjkteDg2XzY0CiAgICAgICAgICAgIG1hdGNoID0gX29zeF9hcmNoX3BhdC5tYXRjaChhcmNoKQogICAgICAgICAgICBpZiBtYXRjaDoKICAgICAgICAgICAgICAgIG5hbWUsIG1ham9yLCBtaW5vciwgYWN0dWFsX2FyY2ggPSBtYXRjaC5ncm91cHMoKQogICAgICAgICAgICAgICAgdHBsID0gJ3swfV97MX1fJWlfJXMnLmZvcm1hdChuYW1lLCBtYWpvcikKICAgICAgICAgICAgICAgIGFyY2hlcyA9IFtdCiAgICAgICAgICAgICAgICBmb3IgbSBpbiByZXZlcnNlZChyYW5nZShpbnQobWlub3IpICsgMSkpOgogICAgICAgICAgICAgICAgICAgIGZvciBhIGluIGdldF9kYXJ3aW5fYXJjaGVzKGludChtYWpvciksIG0sIGFjdHVhbF9hcmNoKToKICAgICAgICAgICAgICAgICAgICAgICAgYXJjaGVzLmFwcGVuZCh0cGwgJSAobSwgYSkpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIGFyY2ggcGF0dGVybiBkaWRuJ3QgbWF0Y2ggKD8hKQogICAgICAgICAgICAgICAgYXJjaGVzID0gW2FyY2hdCiAgICAgICAgZWxpZiBwbGF0Zm9ybSBpcyBOb25lIGFuZCBpc19tYW55bGludXgxX2NvbXBhdGlibGUoKToKICAgICAgICAgICAgYXJjaGVzID0gW2FyY2gucmVwbGFjZSgnbGludXgnLCAnbWFueWxpbnV4MScpLCBhcmNoXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGFyY2hlcyA9IFthcmNoXQoKICAgICAgICAjIEN1cnJlbnQgdmVyc2lvbiwgY3VycmVudCBBUEkgKGJ1aWx0IHNwZWNpZmljYWxseSBmb3Igb3VyIFB5dGhvbik6CiAgICAgICAgZm9yIGFiaSBpbiBhYmlzOgogICAgICAgICAgICBmb3IgYXJjaCBpbiBhcmNoZXM6CiAgICAgICAgICAgICAgICBzdXBwb3J0ZWQuYXBwZW5kKCgnJXMlcycgJSAoaW1wbCwgdmVyc2lvbnNbMF0pLCBhYmksIGFyY2gpKQoKICAgICAgICAjIGFiaTMgbW9kdWxlcyBjb21wYXRpYmxlIHdpdGggb2xkZXIgdmVyc2lvbiBvZiBQeXRob24KICAgICAgICBmb3IgdmVyc2lvbiBpbiB2ZXJzaW9uc1sxOl06CiAgICAgICAgICAgICMgYWJpMyB3YXMgaW50cm9kdWNlZCBpbiBQeXRob24gMy4yCiAgICAgICAgICAgIGlmIHZlcnNpb24gaW4gKCczMScsICczMCcpOgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgZm9yIGFiaSBpbiBhYmkzczogICAjIGVtcHR5IHNldCBpZiBub3QgUHl0aG9uIDMKICAgICAgICAgICAgICAgIGZvciBhcmNoIGluIGFyY2hlczoKICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWQuYXBwZW5kKCgiJXMlcyIgJSAoaW1wbCwgdmVyc2lvbiksIGFiaSwgYXJjaCkpCgogICAgICAgICMgSGFzIGJpbmFyaWVzLCBkb2VzIG5vdCB1c2UgdGhlIFB5dGhvbiBBUEk6CiAgICAgICAgZm9yIGFyY2ggaW4gYXJjaGVzOgogICAgICAgICAgICBzdXBwb3J0ZWQuYXBwZW5kKCgncHklcycgJSAodmVyc2lvbnNbMF1bMF0pLCAnbm9uZScsIGFyY2gpKQoKICAgICMgTm8gYWJpIC8gYXJjaCwgYnV0IHJlcXVpcmVzIG91ciBpbXBsZW1lbnRhdGlvbjoKICAgIHN1cHBvcnRlZC5hcHBlbmQoKCclcyVzJyAlIChpbXBsLCB2ZXJzaW9uc1swXSksICdub25lJywgJ2FueScpKQogICAgIyBUYWdnZWQgc3BlY2lmaWNhbGx5IGFzIGJlaW5nIGNyb3NzLXZlcnNpb24gY29tcGF0aWJsZQogICAgIyAod2l0aCBqdXN0IHRoZSBtYWpvciB2ZXJzaW9uIHNwZWNpZmllZCkKICAgIHN1cHBvcnRlZC5hcHBlbmQoKCclcyVzJyAlIChpbXBsLCB2ZXJzaW9uc1swXVswXSksICdub25lJywgJ2FueScpKQoKICAgICMgTm8gYWJpIC8gYXJjaCwgZ2VuZXJpYyBQeXRob24KICAgIGZvciBpLCB2ZXJzaW9uIGluIGVudW1lcmF0ZSh2ZXJzaW9ucyk6CiAgICAgICAgc3VwcG9ydGVkLmFwcGVuZCgoJ3B5JXMnICUgKHZlcnNpb24sKSwgJ25vbmUnLCAnYW55JykpCiAgICAgICAgaWYgaSA9PSAwOgogICAgICAgICAgICBzdXBwb3J0ZWQuYXBwZW5kKCgncHklcycgJSAodmVyc2lvblswXSksICdub25lJywgJ2FueScpKQoKICAgIHJldHVybiBzdXBwb3J0ZWQKCnN1cHBvcnRlZF90YWdzID0gZ2V0X3N1cHBvcnRlZCgpCnN1cHBvcnRlZF90YWdzX25vYXJjaCA9IGdldF9zdXBwb3J0ZWQobm9hcmNoPVRydWUpCgppbXBsZW1lbnRhdGlvbl90YWcgPSBnZXRfaW1wbF90YWcoKQpQSwMEFAAAAAAAAAAhAFxp0hkUAQAAFAEAADAAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9yZXEvX19pbml0X18ucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKZnJvbSAucmVxX2luc3RhbGwgaW1wb3J0IEluc3RhbGxSZXF1aXJlbWVudApmcm9tIC5yZXFfc2V0IGltcG9ydCBSZXF1aXJlbWVudFNldCwgUmVxdWlyZW1lbnRzCmZyb20gLnJlcV9maWxlIGltcG9ydCBwYXJzZV9yZXF1aXJlbWVudHMKCl9fYWxsX18gPSBbCiAgICAiUmVxdWlyZW1lbnRTZXQiLCAiUmVxdWlyZW1lbnRzIiwgIkluc3RhbGxSZXF1aXJlbWVudCIsCiAgICAicGFyc2VfcmVxdWlyZW1lbnRzIiwKXQpQSwMEFAAAAAAAAAAhABzgjAqWLgAAli4AADAAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9yZXEvcmVxX2ZpbGUucHkiIiIKUmVxdWlyZW1lbnRzIGZpbGUgcGFyc2luZwoiIiIKCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgb3MKaW1wb3J0IHJlCmltcG9ydCBzaGxleAppbXBvcnQgc3lzCmltcG9ydCBvcHRwYXJzZQppbXBvcnQgd2FybmluZ3MKCmZyb20gcGlwLl92ZW5kb3Iuc2l4Lm1vdmVzLnVybGxpYiBpbXBvcnQgcGFyc2UgYXMgdXJsbGliX3BhcnNlCmZyb20gcGlwLl92ZW5kb3Iuc2l4Lm1vdmVzIGltcG9ydCBmaWx0ZXJmYWxzZQoKaW1wb3J0IHBpcApmcm9tIHBpcC5kb3dubG9hZCBpbXBvcnQgZ2V0X2ZpbGVfY29udGVudApmcm9tIHBpcC5yZXEucmVxX2luc3RhbGwgaW1wb3J0IEluc3RhbGxSZXF1aXJlbWVudApmcm9tIHBpcC5leGNlcHRpb25zIGltcG9ydCAoUmVxdWlyZW1lbnRzRmlsZVBhcnNlRXJyb3IpCmZyb20gcGlwLnV0aWxzLmRlcHJlY2F0aW9uIGltcG9ydCBSZW1vdmVkSW5QaXAxMFdhcm5pbmcKZnJvbSBwaXAgaW1wb3J0IGNtZG9wdGlvbnMKCl9fYWxsX18gPSBbJ3BhcnNlX3JlcXVpcmVtZW50cyddCgpTQ0hFTUVfUkUgPSByZS5jb21waWxlKHInXihodHRwfGh0dHBzfGZpbGUpOicsIHJlLkkpCkNPTU1FTlRfUkUgPSByZS5jb21waWxlKHInKF58XHMpKyMuKiQnKQoKU1VQUE9SVEVEX09QVElPTlMgPSBbCiAgICBjbWRvcHRpb25zLmNvbnN0cmFpbnRzLAogICAgY21kb3B0aW9ucy5lZGl0YWJsZSwKICAgIGNtZG9wdGlvbnMucmVxdWlyZW1lbnRzLAogICAgY21kb3B0aW9ucy5ub19pbmRleCwKICAgIGNtZG9wdGlvbnMuaW5kZXhfdXJsLAogICAgY21kb3B0aW9ucy5maW5kX2xpbmtzLAogICAgY21kb3B0aW9ucy5leHRyYV9pbmRleF91cmwsCiAgICBjbWRvcHRpb25zLmFsbG93X2V4dGVybmFsLAogICAgY21kb3B0aW9ucy5hbGxvd19hbGxfZXh0ZXJuYWwsCiAgICBjbWRvcHRpb25zLm5vX2FsbG93X2V4dGVybmFsLAogICAgY21kb3B0aW9ucy5hbGxvd191bnNhZmUsCiAgICBjbWRvcHRpb25zLm5vX2FsbG93X3Vuc2FmZSwKICAgIGNtZG9wdGlvbnMudXNlX3doZWVsLAogICAgY21kb3B0aW9ucy5ub191c2Vfd2hlZWwsCiAgICBjbWRvcHRpb25zLmFsd2F5c191bnppcCwKICAgIGNtZG9wdGlvbnMubm9fYmluYXJ5LAogICAgY21kb3B0aW9ucy5vbmx5X2JpbmFyeSwKICAgIGNtZG9wdGlvbnMucHJlLAogICAgY21kb3B0aW9ucy5wcm9jZXNzX2RlcGVuZGVuY3lfbGlua3MsCiAgICBjbWRvcHRpb25zLnRydXN0ZWRfaG9zdCwKICAgIGNtZG9wdGlvbnMucmVxdWlyZV9oYXNoZXMsCl0KCiMgb3B0aW9ucyB0byBiZSBwYXNzZWQgdG8gcmVxdWlyZW1lbnRzClNVUFBPUlRFRF9PUFRJT05TX1JFUSA9IFsKICAgIGNtZG9wdGlvbnMuaW5zdGFsbF9vcHRpb25zLAogICAgY21kb3B0aW9ucy5nbG9iYWxfb3B0aW9ucywKICAgIGNtZG9wdGlvbnMuaGFzaCwKXQoKIyB0aGUgJ2Rlc3QnIHN0cmluZyB2YWx1ZXMKU1VQUE9SVEVEX09QVElPTlNfUkVRX0RFU1QgPSBbbygpLmRlc3QgZm9yIG8gaW4gU1VQUE9SVEVEX09QVElPTlNfUkVRXQoKCmRlZiBwYXJzZV9yZXF1aXJlbWVudHMoZmlsZW5hbWUsIGZpbmRlcj1Ob25lLCBjb21lc19mcm9tPU5vbmUsIG9wdGlvbnM9Tm9uZSwKICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uPU5vbmUsIGNvbnN0cmFpbnQ9RmFsc2UsIHdoZWVsX2NhY2hlPU5vbmUpOgogICAgIiIiUGFyc2UgYSByZXF1aXJlbWVudHMgZmlsZSBhbmQgeWllbGQgSW5zdGFsbFJlcXVpcmVtZW50IGluc3RhbmNlcy4KCiAgICA6cGFyYW0gZmlsZW5hbWU6ICAgIFBhdGggb3IgdXJsIG9mIHJlcXVpcmVtZW50cyBmaWxlLgogICAgOnBhcmFtIGZpbmRlcjogICAgICBJbnN0YW5jZSBvZiBwaXAuaW5kZXguUGFja2FnZUZpbmRlci4KICAgIDpwYXJhbSBjb21lc19mcm9tOiAgT3JpZ2luIGRlc2NyaXB0aW9uIG9mIHJlcXVpcmVtZW50cy4KICAgIDpwYXJhbSBvcHRpb25zOiAgICAgY2xpIG9wdGlvbnMuCiAgICA6cGFyYW0gc2Vzc2lvbjogICAgIEluc3RhbmNlIG9mIHBpcC5kb3dubG9hZC5QaXBTZXNzaW9uLgogICAgOnBhcmFtIGNvbnN0cmFpbnQ6ICBJZiB0cnVlLCBwYXJzaW5nIGEgY29uc3RyYWludCBmaWxlIHJhdGhlciB0aGFuCiAgICAgICAgcmVxdWlyZW1lbnRzIGZpbGUuCiAgICA6cGFyYW0gd2hlZWxfY2FjaGU6IEluc3RhbmNlIG9mIHBpcC53aGVlbC5XaGVlbENhY2hlCiAgICAiIiIKICAgIGlmIHNlc3Npb24gaXMgTm9uZToKICAgICAgICByYWlzZSBUeXBlRXJyb3IoCiAgICAgICAgICAgICJwYXJzZV9yZXF1aXJlbWVudHMoKSBtaXNzaW5nIDEgcmVxdWlyZWQga2V5d29yZCBhcmd1bWVudDogIgogICAgICAgICAgICAiJ3Nlc3Npb24nIgogICAgICAgICkKCiAgICBfLCBjb250ZW50ID0gZ2V0X2ZpbGVfY29udGVudCgKICAgICAgICBmaWxlbmFtZSwgY29tZXNfZnJvbT1jb21lc19mcm9tLCBzZXNzaW9uPXNlc3Npb24KICAgICkKCiAgICBsaW5lc19lbnVtID0gcHJlcHJvY2Vzcyhjb250ZW50LCBvcHRpb25zKQoKICAgIGZvciBsaW5lX251bWJlciwgbGluZSBpbiBsaW5lc19lbnVtOgogICAgICAgIHJlcV9pdGVyID0gcHJvY2Vzc19saW5lKGxpbmUsIGZpbGVuYW1lLCBsaW5lX251bWJlciwgZmluZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbWVzX2Zyb20sIG9wdGlvbnMsIHNlc3Npb24sIHdoZWVsX2NhY2hlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnQ9Y29uc3RyYWludCkKICAgICAgICBmb3IgcmVxIGluIHJlcV9pdGVyOgogICAgICAgICAgICB5aWVsZCByZXEKCgpkZWYgcHJlcHJvY2Vzcyhjb250ZW50LCBvcHRpb25zKToKICAgICIiIlNwbGl0LCBmaWx0ZXIsIGFuZCBqb2luIGxpbmVzLCBhbmQgcmV0dXJuIGEgbGluZSBpdGVyYXRvcgoKICAgIDpwYXJhbSBjb250ZW50OiB0aGUgY29udGVudCBvZiB0aGUgcmVxdWlyZW1lbnRzIGZpbGUKICAgIDpwYXJhbSBvcHRpb25zOiBjbGkgb3B0aW9ucwogICAgIiIiCiAgICBsaW5lc19lbnVtID0gZW51bWVyYXRlKGNvbnRlbnQuc3BsaXRsaW5lcygpLCBzdGFydD0xKQogICAgbGluZXNfZW51bSA9IGpvaW5fbGluZXMobGluZXNfZW51bSkKICAgIGxpbmVzX2VudW0gPSBpZ25vcmVfY29tbWVudHMobGluZXNfZW51bSkKICAgIGxpbmVzX2VudW0gPSBza2lwX3JlZ2V4KGxpbmVzX2VudW0sIG9wdGlvbnMpCiAgICByZXR1cm4gbGluZXNfZW51bQoKCmRlZiBwcm9jZXNzX2xpbmUobGluZSwgZmlsZW5hbWUsIGxpbmVfbnVtYmVyLCBmaW5kZXI9Tm9uZSwgY29tZXNfZnJvbT1Ob25lLAogICAgICAgICAgICAgICAgIG9wdGlvbnM9Tm9uZSwgc2Vzc2lvbj1Ob25lLCB3aGVlbF9jYWNoZT1Ob25lLAogICAgICAgICAgICAgICAgIGNvbnN0cmFpbnQ9RmFsc2UpOgogICAgIiIiUHJvY2VzcyBhIHNpbmdsZSByZXF1aXJlbWVudHMgbGluZTsgVGhpcyBjYW4gcmVzdWx0IGluIGNyZWF0aW5nL3lpZWxkaW5nCiAgICByZXF1aXJlbWVudHMsIG9yIHVwZGF0aW5nIHRoZSBmaW5kZXIuCgogICAgRm9yIGxpbmVzIHRoYXQgY29udGFpbiByZXF1aXJlbWVudHMsIHRoZSBvbmx5IG9wdGlvbnMgdGhhdCBoYXZlIGFuIGVmZmVjdAogICAgYXJlIGZyb20gU1VQUE9SVEVEX09QVElPTlNfUkVRLCBhbmQgdGhleSBhcmUgc2NvcGVkIHRvIHRoZQogICAgcmVxdWlyZW1lbnQuIE90aGVyIG9wdGlvbnMgZnJvbSBTVVBQT1JURURfT1BUSU9OUyBtYXkgYmUgcHJlc2VudCwgYnV0IGFyZQogICAgaWdub3JlZC4KCiAgICBGb3IgbGluZXMgdGhhdCBkbyBub3QgY29udGFpbiByZXF1aXJlbWVudHMsIHRoZSBvbmx5IG9wdGlvbnMgdGhhdCBoYXZlIGFuCiAgICBlZmZlY3QgYXJlIGZyb20gU1VQUE9SVEVEX09QVElPTlMuIE9wdGlvbnMgZnJvbSBTVVBQT1JURURfT1BUSU9OU19SRVEgbWF5CiAgICBiZSBwcmVzZW50LCBidXQgYXJlIGlnbm9yZWQuIFRoZXNlIGxpbmVzIG1heSBjb250YWluIG11bHRpcGxlIG9wdGlvbnMKICAgIChhbHRob3VnaCBvdXIgZG9jcyBpbXBseSBvbmx5IG9uZSBpcyBzdXBwb3J0ZWQpLCBhbmQgYWxsIG91ciBwYXJzZWQgYW5kCiAgICBhZmZlY3QgdGhlIGZpbmRlci4KCiAgICA6cGFyYW0gY29uc3RyYWludDogSWYgVHJ1ZSwgcGFyc2luZyBhIGNvbnN0cmFpbnRzIGZpbGUuCiAgICA6cGFyYW0gb3B0aW9uczogT3B0aW9uUGFyc2VyIG9wdGlvbnMgdGhhdCB3ZSBtYXkgdXBkYXRlCiAgICAiIiIKICAgIHBhcnNlciA9IGJ1aWxkX3BhcnNlcigpCiAgICBkZWZhdWx0cyA9IHBhcnNlci5nZXRfZGVmYXVsdF92YWx1ZXMoKQogICAgZGVmYXVsdHMuaW5kZXhfdXJsID0gTm9uZQogICAgaWYgZmluZGVyOgogICAgICAgICMgYGZpbmRlci5mb3JtYXRfY29udHJvbGAgd2lsbCBiZSB1cGRhdGVkIGR1cmluZyBwYXJzaW5nCiAgICAgICAgZGVmYXVsdHMuZm9ybWF0X2NvbnRyb2wgPSBmaW5kZXIuZm9ybWF0X2NvbnRyb2wKICAgIGFyZ3Nfc3RyLCBvcHRpb25zX3N0ciA9IGJyZWFrX2FyZ3Nfb3B0aW9ucyhsaW5lKQogICAgaWYgc3lzLnZlcnNpb25faW5mbyA8ICgyLCA3LCAzKToKICAgICAgICAjIFByaW9yIHRvIDIuNy4zLCBzaGxleCBjYW5ub3QgZGVhbCB3aXRoIHVuaWNvZGUgZW50cmllcwogICAgICAgIG9wdGlvbnNfc3RyID0gb3B0aW9uc19zdHIuZW5jb2RlKCd1dGY4JykKICAgIG9wdHMsIF8gPSBwYXJzZXIucGFyc2VfYXJncyhzaGxleC5zcGxpdChvcHRpb25zX3N0ciksIGRlZmF1bHRzKQoKICAgICMgcHJlc2VydmUgZm9yIHRoZSBuZXN0ZWQgY29kZSBwYXRoCiAgICBsaW5lX2NvbWVzX2Zyb20gPSAnJXMgJXMgKGxpbmUgJXMpJyAlICgKICAgICAgICAnLWMnIGlmIGNvbnN0cmFpbnQgZWxzZSAnLXInLCBmaWxlbmFtZSwgbGluZV9udW1iZXIpCgogICAgIyB5aWVsZCBhIGxpbmUgcmVxdWlyZW1lbnQKICAgIGlmIGFyZ3Nfc3RyOgogICAgICAgIGlzb2xhdGVkID0gb3B0aW9ucy5pc29sYXRlZF9tb2RlIGlmIG9wdGlvbnMgZWxzZSBGYWxzZQogICAgICAgIGlmIG9wdGlvbnM6CiAgICAgICAgICAgIGNtZG9wdGlvbnMuY2hlY2tfaW5zdGFsbF9idWlsZF9nbG9iYWwob3B0aW9ucywgb3B0cykKICAgICAgICAjIGdldCB0aGUgb3B0aW9ucyB0aGF0IGFwcGx5IHRvIHJlcXVpcmVtZW50cwogICAgICAgIHJlcV9vcHRpb25zID0ge30KICAgICAgICBmb3IgZGVzdCBpbiBTVVBQT1JURURfT1BUSU9OU19SRVFfREVTVDoKICAgICAgICAgICAgaWYgZGVzdCBpbiBvcHRzLl9fZGljdF9fIGFuZCBvcHRzLl9fZGljdF9fW2Rlc3RdOgogICAgICAgICAgICAgICAgcmVxX29wdGlvbnNbZGVzdF0gPSBvcHRzLl9fZGljdF9fW2Rlc3RdCiAgICAgICAgeWllbGQgSW5zdGFsbFJlcXVpcmVtZW50LmZyb21fbGluZSgKICAgICAgICAgICAgYXJnc19zdHIsIGxpbmVfY29tZXNfZnJvbSwgY29uc3RyYWludD1jb25zdHJhaW50LAogICAgICAgICAgICBpc29sYXRlZD1pc29sYXRlZCwgb3B0aW9ucz1yZXFfb3B0aW9ucywgd2hlZWxfY2FjaGU9d2hlZWxfY2FjaGUKICAgICAgICApCgogICAgIyB5aWVsZCBhbiBlZGl0YWJsZSByZXF1aXJlbWVudAogICAgZWxpZiBvcHRzLmVkaXRhYmxlczoKICAgICAgICBpc29sYXRlZCA9IG9wdGlvbnMuaXNvbGF0ZWRfbW9kZSBpZiBvcHRpb25zIGVsc2UgRmFsc2UKICAgICAgICBkZWZhdWx0X3ZjcyA9IG9wdGlvbnMuZGVmYXVsdF92Y3MgaWYgb3B0aW9ucyBlbHNlIE5vbmUKICAgICAgICB5aWVsZCBJbnN0YWxsUmVxdWlyZW1lbnQuZnJvbV9lZGl0YWJsZSgKICAgICAgICAgICAgb3B0cy5lZGl0YWJsZXNbMF0sIGNvbWVzX2Zyb209bGluZV9jb21lc19mcm9tLAogICAgICAgICAgICBjb25zdHJhaW50PWNvbnN0cmFpbnQsIGRlZmF1bHRfdmNzPWRlZmF1bHRfdmNzLCBpc29sYXRlZD1pc29sYXRlZCwKICAgICAgICAgICAgd2hlZWxfY2FjaGU9d2hlZWxfY2FjaGUKICAgICAgICApCgogICAgIyBwYXJzZSBhIG5lc3RlZCByZXF1aXJlbWVudHMgZmlsZQogICAgZWxpZiBvcHRzLnJlcXVpcmVtZW50cyBvciBvcHRzLmNvbnN0cmFpbnRzOgogICAgICAgIGlmIG9wdHMucmVxdWlyZW1lbnRzOgogICAgICAgICAgICByZXFfcGF0aCA9IG9wdHMucmVxdWlyZW1lbnRzWzBdCiAgICAgICAgICAgIG5lc3RlZF9jb25zdHJhaW50ID0gRmFsc2UKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXFfcGF0aCA9IG9wdHMuY29uc3RyYWludHNbMF0KICAgICAgICAgICAgbmVzdGVkX2NvbnN0cmFpbnQgPSBUcnVlCiAgICAgICAgIyBvcmlnaW5hbCBmaWxlIGlzIG92ZXIgaHR0cAogICAgICAgIGlmIFNDSEVNRV9SRS5zZWFyY2goZmlsZW5hbWUpOgogICAgICAgICAgICAjIGRvIGEgdXJsIGpvaW4gc28gcmVsYXRpdmUgcGF0aHMgd29yawogICAgICAgICAgICByZXFfcGF0aCA9IHVybGxpYl9wYXJzZS51cmxqb2luKGZpbGVuYW1lLCByZXFfcGF0aCkKICAgICAgICAjIG9yaWdpbmFsIGZpbGUgYW5kIG5lc3RlZCBmaWxlIGFyZSBwYXRocwogICAgICAgIGVsaWYgbm90IFNDSEVNRV9SRS5zZWFyY2gocmVxX3BhdGgpOgogICAgICAgICAgICAjIGRvIGEgam9pbiBzbyByZWxhdGl2ZSBwYXRocyB3b3JrCiAgICAgICAgICAgIHJlcV9wYXRoID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShmaWxlbmFtZSksIHJlcV9wYXRoKQogICAgICAgICMgVE9ETzogV2h5IG5vdCB1c2UgYGNvbWVzX2Zyb209Jy1yIHt9IChsaW5lIHt9KSdgIGhlcmUgYXMgd2VsbD8KICAgICAgICBwYXJzZXIgPSBwYXJzZV9yZXF1aXJlbWVudHMoCiAgICAgICAgICAgIHJlcV9wYXRoLCBmaW5kZXIsIGNvbWVzX2Zyb20sIG9wdGlvbnMsIHNlc3Npb24sCiAgICAgICAgICAgIGNvbnN0cmFpbnQ9bmVzdGVkX2NvbnN0cmFpbnQsIHdoZWVsX2NhY2hlPXdoZWVsX2NhY2hlCiAgICAgICAgKQogICAgICAgIGZvciByZXEgaW4gcGFyc2VyOgogICAgICAgICAgICB5aWVsZCByZXEKCiAgICAjIHBlcmNvbGF0ZSBoYXNoLWNoZWNraW5nIG9wdGlvbiB1cHdhcmQKICAgIGVsaWYgb3B0cy5yZXF1aXJlX2hhc2hlczoKICAgICAgICBvcHRpb25zLnJlcXVpcmVfaGFzaGVzID0gb3B0cy5yZXF1aXJlX2hhc2hlcwoKICAgICMgc2V0IGZpbmRlciBvcHRpb25zCiAgICBlbGlmIGZpbmRlcjoKICAgICAgICBpZiBvcHRzLmFsbG93X2V4dGVybmFsOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKAogICAgICAgICAgICAgICAgIi0tYWxsb3ctZXh0ZXJuYWwgaGFzIGJlZW4gZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluICIKICAgICAgICAgICAgICAgICJ0aGUgZnV0dXJlLiBEdWUgdG8gY2hhbmdlcyBpbiB0aGUgcmVwb3NpdG9yeSBwcm90b2NvbCwgaXQgbm8gIgogICAgICAgICAgICAgICAgImxvbmdlciBoYXMgYW55IGVmZmVjdC4iLAogICAgICAgICAgICAgICAgUmVtb3ZlZEluUGlwMTBXYXJuaW5nLAogICAgICAgICAgICApCgogICAgICAgIGlmIG9wdHMuYWxsb3dfYWxsX2V4dGVybmFsOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKAogICAgICAgICAgICAgICAgIi0tYWxsb3ctYWxsLWV4dGVybmFsIGhhcyBiZWVuIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCAiCiAgICAgICAgICAgICAgICAiaW4gdGhlIGZ1dHVyZS4gRHVlIHRvIGNoYW5nZXMgaW4gdGhlIHJlcG9zaXRvcnkgcHJvdG9jb2wsIGl0ICIKICAgICAgICAgICAgICAgICJubyBsb25nZXIgaGFzIGFueSBlZmZlY3QuIiwKICAgICAgICAgICAgICAgIFJlbW92ZWRJblBpcDEwV2FybmluZywKICAgICAgICAgICAgKQoKICAgICAgICBpZiBvcHRzLmFsbG93X3VudmVyaWZpZWQ6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCiAgICAgICAgICAgICAgICAiLS1hbGxvdy11bnZlcmlmaWVkIGhhcyBiZWVuIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCAiCiAgICAgICAgICAgICAgICAiaW4gdGhlIGZ1dHVyZS4gRHVlIHRvIGNoYW5nZXMgaW4gdGhlIHJlcG9zaXRvcnkgcHJvdG9jb2wsIGl0ICIKICAgICAgICAgICAgICAgICJubyBsb25nZXIgaGFzIGFueSBlZmZlY3QuIiwKICAgICAgICAgICAgICAgIFJlbW92ZWRJblBpcDEwV2FybmluZywKICAgICAgICAgICAgKQoKICAgICAgICBpZiBvcHRzLmluZGV4X3VybDoKICAgICAgICAgICAgZmluZGVyLmluZGV4X3VybHMgPSBbb3B0cy5pbmRleF91cmxdCiAgICAgICAgaWYgb3B0cy51c2Vfd2hlZWwgaXMgRmFsc2U6CiAgICAgICAgICAgIGZpbmRlci51c2Vfd2hlZWwgPSBGYWxzZQogICAgICAgICAgICBwaXAuaW5kZXguZm10X2N0bF9ub191c2Vfd2hlZWwoZmluZGVyLmZvcm1hdF9jb250cm9sKQogICAgICAgIGlmIG9wdHMubm9faW5kZXggaXMgVHJ1ZToKICAgICAgICAgICAgZmluZGVyLmluZGV4X3VybHMgPSBbXQogICAgICAgIGlmIG9wdHMuZXh0cmFfaW5kZXhfdXJsczoKICAgICAgICAgICAgZmluZGVyLmluZGV4X3VybHMuZXh0ZW5kKG9wdHMuZXh0cmFfaW5kZXhfdXJscykKICAgICAgICBpZiBvcHRzLmZpbmRfbGlua3M6CiAgICAgICAgICAgICMgRklYTUU6IGl0IHdvdWxkIGJlIG5pY2UgdG8ga2VlcCB0cmFjayBvZiB0aGUgc291cmNlCiAgICAgICAgICAgICMgb2YgdGhlIGZpbmRfbGlua3M6IHN1cHBvcnQgYSBmaW5kLWxpbmtzIGxvY2FsIHBhdGgKICAgICAgICAgICAgIyByZWxhdGl2ZSB0byBhIHJlcXVpcmVtZW50cyBmaWxlLgogICAgICAgICAgICB2YWx1ZSA9IG9wdHMuZmluZF9saW5rc1swXQogICAgICAgICAgICByZXFfZGlyID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGguYWJzcGF0aChmaWxlbmFtZSkpCiAgICAgICAgICAgIHJlbGF0aXZlX3RvX3JlcXNfZmlsZSA9IG9zLnBhdGguam9pbihyZXFfZGlyLCB2YWx1ZSkKICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMocmVsYXRpdmVfdG9fcmVxc19maWxlKToKICAgICAgICAgICAgICAgIHZhbHVlID0gcmVsYXRpdmVfdG9fcmVxc19maWxlCiAgICAgICAgICAgIGZpbmRlci5maW5kX2xpbmtzLmFwcGVuZCh2YWx1ZSkKICAgICAgICBpZiBvcHRzLnByZToKICAgICAgICAgICAgZmluZGVyLmFsbG93X2FsbF9wcmVyZWxlYXNlcyA9IFRydWUKICAgICAgICBpZiBvcHRzLnByb2Nlc3NfZGVwZW5kZW5jeV9saW5rczoKICAgICAgICAgICAgZmluZGVyLnByb2Nlc3NfZGVwZW5kZW5jeV9saW5rcyA9IFRydWUKICAgICAgICBpZiBvcHRzLnRydXN0ZWRfaG9zdHM6CiAgICAgICAgICAgIGZpbmRlci5zZWN1cmVfb3JpZ2lucy5leHRlbmQoCiAgICAgICAgICAgICAgICAoIioiLCBob3N0LCAiKiIpIGZvciBob3N0IGluIG9wdHMudHJ1c3RlZF9ob3N0cykKCgpkZWYgYnJlYWtfYXJnc19vcHRpb25zKGxpbmUpOgogICAgIiIiQnJlYWsgdXAgdGhlIGxpbmUgaW50byBhbiBhcmdzIGFuZCBvcHRpb25zIHN0cmluZy4gIFdlIG9ubHkgd2FudCB0byBzaGxleAogICAgKGFuZCB0aGVuIG9wdHBhcnNlKSB0aGUgb3B0aW9ucywgbm90IHRoZSBhcmdzLiAgYXJncyBjYW4gY29udGFpbiBtYXJrZXJzCiAgICB3aGljaCBhcmUgY29ycnVwdGVkIGJ5IHNobGV4LgogICAgIiIiCiAgICB0b2tlbnMgPSBsaW5lLnNwbGl0KCcgJykKICAgIGFyZ3MgPSBbXQogICAgb3B0aW9ucyA9IHRva2Vuc1s6XQogICAgZm9yIHRva2VuIGluIHRva2VuczoKICAgICAgICBpZiB0b2tlbi5zdGFydHN3aXRoKCctJykgb3IgdG9rZW4uc3RhcnRzd2l0aCgnLS0nKToKICAgICAgICAgICAgYnJlYWsKICAgICAgICBlbHNlOgogICAgICAgICAgICBhcmdzLmFwcGVuZCh0b2tlbikKICAgICAgICAgICAgb3B0aW9ucy5wb3AoMCkKICAgIHJldHVybiAnICcuam9pbihhcmdzKSwgJyAnLmpvaW4ob3B0aW9ucykKCgpkZWYgYnVpbGRfcGFyc2VyKCk6CiAgICAiIiIKICAgIFJldHVybiBhIHBhcnNlciBmb3IgcGFyc2luZyByZXF1aXJlbWVudCBsaW5lcwogICAgIiIiCiAgICBwYXJzZXIgPSBvcHRwYXJzZS5PcHRpb25QYXJzZXIoYWRkX2hlbHBfb3B0aW9uPUZhbHNlKQoKICAgIG9wdGlvbl9mYWN0b3JpZXMgPSBTVVBQT1JURURfT1BUSU9OUyArIFNVUFBPUlRFRF9PUFRJT05TX1JFUQogICAgZm9yIG9wdGlvbl9mYWN0b3J5IGluIG9wdGlvbl9mYWN0b3JpZXM6CiAgICAgICAgb3B0aW9uID0gb3B0aW9uX2ZhY3RvcnkoKQogICAgICAgIHBhcnNlci5hZGRfb3B0aW9uKG9wdGlvbikKCiAgICAjIEJ5IGRlZmF1bHQgb3B0cGFyc2Ugc3lzLmV4aXRzIG9uIHBhcnNpbmcgZXJyb3JzLiBXZSB3YW50IHRvIHdyYXAKICAgICMgdGhhdCBpbiBvdXIgb3duIGV4Y2VwdGlvbi4KICAgIGRlZiBwYXJzZXJfZXhpdChzZWxmLCBtc2cpOgogICAgICAgIHJhaXNlIFJlcXVpcmVtZW50c0ZpbGVQYXJzZUVycm9yKG1zZykKICAgIHBhcnNlci5leGl0ID0gcGFyc2VyX2V4aXQKCiAgICByZXR1cm4gcGFyc2VyCgoKZGVmIGpvaW5fbGluZXMobGluZXNfZW51bSk6CiAgICAiIiJKb2lucyBhIGxpbmUgZW5kaW5nIGluICdcJyB3aXRoIHRoZSBwcmV2aW91cyBsaW5lIChleGNlcHQgd2hlbiBmb2xsb3dpbmcKICAgIGNvbW1lbnRzKS4gIFRoZSBqb2luZWQgbGluZSB0YWtlcyBvbiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGxpbmUuCiAgICAiIiIKICAgIHByaW1hcnlfbGluZV9udW1iZXIgPSBOb25lCiAgICBuZXdfbGluZSA9IFtdCiAgICBmb3IgbGluZV9udW1iZXIsIGxpbmUgaW4gbGluZXNfZW51bToKICAgICAgICBpZiBub3QgbGluZS5lbmRzd2l0aCgnXFwnKSBvciBDT01NRU5UX1JFLm1hdGNoKGxpbmUpOgogICAgICAgICAgICBpZiBDT01NRU5UX1JFLm1hdGNoKGxpbmUpOgogICAgICAgICAgICAgICAgIyB0aGlzIGVuc3VyZXMgY29tbWVudHMgYXJlIGFsd2F5cyBtYXRjaGVkIGxhdGVyCiAgICAgICAgICAgICAgICBsaW5lID0gJyAnICsgbGluZQogICAgICAgICAgICBpZiBuZXdfbGluZToKICAgICAgICAgICAgICAgIG5ld19saW5lLmFwcGVuZChsaW5lKQogICAgICAgICAgICAgICAgeWllbGQgcHJpbWFyeV9saW5lX251bWJlciwgJycuam9pbihuZXdfbGluZSkKICAgICAgICAgICAgICAgIG5ld19saW5lID0gW10KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHlpZWxkIGxpbmVfbnVtYmVyLCBsaW5lCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaWYgbm90IG5ld19saW5lOgogICAgICAgICAgICAgICAgcHJpbWFyeV9saW5lX251bWJlciA9IGxpbmVfbnVtYmVyCiAgICAgICAgICAgIG5ld19saW5lLmFwcGVuZChsaW5lLnN0cmlwKCdcXCcpKQoKICAgICMgbGFzdCBsaW5lIGNvbnRhaW5zIFwKICAgIGlmIG5ld19saW5lOgogICAgICAgIHlpZWxkIHByaW1hcnlfbGluZV9udW1iZXIsICcnLmpvaW4obmV3X2xpbmUpCgogICAgIyBUT0RPOiBoYW5kbGUgc3BhY2UgYWZ0ZXIgJ1wnLgoKCmRlZiBpZ25vcmVfY29tbWVudHMobGluZXNfZW51bSk6CiAgICAiIiIKICAgIFN0cmlwcyBjb21tZW50cyBhbmQgZmlsdGVyIGVtcHR5IGxpbmVzLgogICAgIiIiCiAgICBmb3IgbGluZV9udW1iZXIsIGxpbmUgaW4gbGluZXNfZW51bToKICAgICAgICBsaW5lID0gQ09NTUVOVF9SRS5zdWIoJycsIGxpbmUpCiAgICAgICAgbGluZSA9IGxpbmUuc3RyaXAoKQogICAgICAgIGlmIGxpbmU6CiAgICAgICAgICAgIHlpZWxkIGxpbmVfbnVtYmVyLCBsaW5lCgoKZGVmIHNraXBfcmVnZXgobGluZXNfZW51bSwgb3B0aW9ucyk6CiAgICAiIiIKICAgIFNraXAgbGluZXMgdGhhdCBtYXRjaCAnLS1za2lwLXJlcXVpcmVtZW50cy1yZWdleCcgcGF0dGVybgoKICAgIE5vdGU6IHRoZSByZWdleCBwYXR0ZXJuIGlzIG9ubHkgYnVpbHQgb25jZQogICAgIiIiCiAgICBza2lwX3JlZ2V4ID0gb3B0aW9ucy5za2lwX3JlcXVpcmVtZW50c19yZWdleCBpZiBvcHRpb25zIGVsc2UgTm9uZQogICAgaWYgc2tpcF9yZWdleDoKICAgICAgICBwYXR0ZXJuID0gcmUuY29tcGlsZShza2lwX3JlZ2V4KQogICAgICAgIGxpbmVzX2VudW0gPSBmaWx0ZXJmYWxzZSgKICAgICAgICAgICAgbGFtYmRhIGU6IHBhdHRlcm4uc2VhcmNoKGVbMV0pLAogICAgICAgICAgICBsaW5lc19lbnVtKQogICAgcmV0dXJuIGxpbmVzX2VudW0KUEsDBBQAAAAAAAAAIQCBbVXDl7UAAJe1AAAzAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvcmVxL3JlcV9pbnN0YWxsLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBsb2dnaW5nCmltcG9ydCBvcwppbXBvcnQgcmUKaW1wb3J0IHNodXRpbAppbXBvcnQgc3lzCmltcG9ydCB0ZW1wZmlsZQppbXBvcnQgdHJhY2ViYWNrCmltcG9ydCB3YXJuaW5ncwppbXBvcnQgemlwZmlsZQoKZnJvbSBkaXN0dXRpbHMgaW1wb3J0IHN5c2NvbmZpZwpmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBjaGFuZ2Vfcm9vdApmcm9tIGVtYWlsLnBhcnNlciBpbXBvcnQgRmVlZFBhcnNlcgoKZnJvbSBwaXAuX3ZlbmRvciBpbXBvcnQgcGtnX3Jlc291cmNlcywgc2l4CmZyb20gcGlwLl92ZW5kb3IucGFja2FnaW5nIGltcG9ydCBzcGVjaWZpZXJzCmZyb20gcGlwLl92ZW5kb3IucGFja2FnaW5nLm1hcmtlcnMgaW1wb3J0IE1hcmtlcgpmcm9tIHBpcC5fdmVuZG9yLnBhY2thZ2luZy5yZXF1aXJlbWVudHMgaW1wb3J0IEludmFsaWRSZXF1aXJlbWVudCwgUmVxdWlyZW1lbnQKZnJvbSBwaXAuX3ZlbmRvci5wYWNrYWdpbmcudXRpbHMgaW1wb3J0IGNhbm9uaWNhbGl6ZV9uYW1lCmZyb20gcGlwLl92ZW5kb3IucGFja2FnaW5nLnZlcnNpb24gaW1wb3J0IFZlcnNpb24sIHBhcnNlIGFzIHBhcnNlX3ZlcnNpb24KZnJvbSBwaXAuX3ZlbmRvci5zaXgubW92ZXMgaW1wb3J0IGNvbmZpZ3BhcnNlcgoKaW1wb3J0IHBpcC53aGVlbAoKZnJvbSBwaXAuY29tcGF0IGltcG9ydCBuYXRpdmVfc3RyLCBnZXRfc3RkbGliLCBXSU5ET1dTCmZyb20gcGlwLmRvd25sb2FkIGltcG9ydCBpc191cmwsIHVybF90b19wYXRoLCBwYXRoX3RvX3VybCwgaXNfYXJjaGl2ZV9maWxlCmZyb20gcGlwLmV4Y2VwdGlvbnMgaW1wb3J0ICgKICAgIEluc3RhbGxhdGlvbkVycm9yLCBVbmluc3RhbGxhdGlvbkVycm9yLAopCmZyb20gcGlwLmxvY2F0aW9ucyBpbXBvcnQgKAogICAgYmluX3B5LCBydW5uaW5nX3VuZGVyX3ZpcnR1YWxlbnYsIFBJUF9ERUxFVEVfTUFSS0VSX0ZJTEVOQU1FLCBiaW5fdXNlciwKKQpmcm9tIHBpcC51dGlscyBpbXBvcnQgKAogICAgZGlzcGxheV9wYXRoLCBybXRyZWUsIGFza19wYXRoX2V4aXN0cywgYmFja3VwX2RpciwgaXNfaW5zdGFsbGFibGVfZGlyLAogICAgZGlzdF9pbl91c2Vyc2l0ZSwgZGlzdF9pbl9zaXRlX3BhY2thZ2VzLCBlZ2dfbGlua19wYXRoLAogICAgY2FsbF9zdWJwcm9jZXNzLCByZWFkX3RleHRfZmlsZSwgRmFrZUZpbGUsIF9tYWtlX2J1aWxkX2RpciwgZW5zdXJlX2RpciwKICAgIGdldF9pbnN0YWxsZWRfdmVyc2lvbiwgbm9ybWFsaXplX3BhdGgsIGRpc3RfaXNfbG9jYWwsCikKCmZyb20gcGlwLnV0aWxzLmhhc2hlcyBpbXBvcnQgSGFzaGVzCmZyb20gcGlwLnV0aWxzLmRlcHJlY2F0aW9uIGltcG9ydCBSZW1vdmVkSW5QaXAxMFdhcm5pbmcKZnJvbSBwaXAudXRpbHMubG9nZ2luZyBpbXBvcnQgaW5kZW50X2xvZwpmcm9tIHBpcC51dGlscy5zZXR1cHRvb2xzX2J1aWxkIGltcG9ydCBTRVRVUFRPT0xTX1NISU0KZnJvbSBwaXAudXRpbHMudWkgaW1wb3J0IG9wZW5fc3Bpbm5lcgpmcm9tIHBpcC5yZXEucmVxX3VuaW5zdGFsbCBpbXBvcnQgVW5pbnN0YWxsUGF0aFNldApmcm9tIHBpcC52Y3MgaW1wb3J0IHZjcwpmcm9tIHBpcC53aGVlbCBpbXBvcnQgbW92ZV93aGVlbF9maWxlcywgV2hlZWwKCgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCm9wZXJhdG9ycyA9IHNwZWNpZmllcnMuU3BlY2lmaWVyLl9vcGVyYXRvcnMua2V5cygpCgoKZGVmIF9zdHJpcF9leHRyYXMocGF0aCk6CiAgICBtID0gcmUubWF0Y2gocideKC4rKShcW1teXF1dK1xdKSQnLCBwYXRoKQogICAgZXh0cmFzID0gTm9uZQogICAgaWYgbToKICAgICAgICBwYXRoX25vX2V4dHJhcyA9IG0uZ3JvdXAoMSkKICAgICAgICBleHRyYXMgPSBtLmdyb3VwKDIpCiAgICBlbHNlOgogICAgICAgIHBhdGhfbm9fZXh0cmFzID0gcGF0aAoKICAgIHJldHVybiBwYXRoX25vX2V4dHJhcywgZXh0cmFzCgoKZGVmIF9zYWZlX2V4dHJhcyhleHRyYXMpOgogICAgcmV0dXJuIHNldChwa2dfcmVzb3VyY2VzLnNhZmVfZXh0cmEoZXh0cmEpIGZvciBleHRyYSBpbiBleHRyYXMpCgoKY2xhc3MgSW5zdGFsbFJlcXVpcmVtZW50KG9iamVjdCk6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHJlcSwgY29tZXNfZnJvbSwgc291cmNlX2Rpcj1Ob25lLCBlZGl0YWJsZT1GYWxzZSwKICAgICAgICAgICAgICAgICBsaW5rPU5vbmUsIGFzX2VnZz1GYWxzZSwgdXBkYXRlPVRydWUsCiAgICAgICAgICAgICAgICAgcHljb21waWxlPVRydWUsIG1hcmtlcnM9Tm9uZSwgaXNvbGF0ZWQ9RmFsc2UsIG9wdGlvbnM9Tm9uZSwKICAgICAgICAgICAgICAgICB3aGVlbF9jYWNoZT1Ob25lLCBjb25zdHJhaW50PUZhbHNlKToKICAgICAgICBzZWxmLmV4dHJhcyA9ICgpCiAgICAgICAgaWYgaXNpbnN0YW5jZShyZXEsIHNpeC5zdHJpbmdfdHlwZXMpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICByZXEgPSBSZXF1aXJlbWVudChyZXEpCiAgICAgICAgICAgIGV4Y2VwdCBJbnZhbGlkUmVxdWlyZW1lbnQ6CiAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLnNlcCBpbiByZXE6CiAgICAgICAgICAgICAgICAgICAgYWRkX21zZyA9ICJJdCBsb29rcyBsaWtlIGEgcGF0aC4gRG9lcyBpdCBleGlzdCA/IgogICAgICAgICAgICAgICAgZWxpZiAnPScgaW4gcmVxIGFuZCBub3QgYW55KG9wIGluIHJlcSBmb3Igb3AgaW4gb3BlcmF0b3JzKToKICAgICAgICAgICAgICAgICAgICBhZGRfbXNnID0gIj0gaXMgbm90IGEgdmFsaWQgb3BlcmF0b3IuIERpZCB5b3UgbWVhbiA9PSA/IgogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBhZGRfbXNnID0gdHJhY2ViYWNrLmZvcm1hdF9leGMoKQogICAgICAgICAgICAgICAgcmFpc2UgSW5zdGFsbGF0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgcmVxdWlyZW1lbnQ6ICclcydcbiVzIiAlIChyZXEsIGFkZF9tc2cpKQogICAgICAgICAgICBzZWxmLmV4dHJhcyA9IF9zYWZlX2V4dHJhcyhyZXEuZXh0cmFzKQoKICAgICAgICBzZWxmLnJlcSA9IHJlcQogICAgICAgIHNlbGYuY29tZXNfZnJvbSA9IGNvbWVzX2Zyb20KICAgICAgICBzZWxmLmNvbnN0cmFpbnQgPSBjb25zdHJhaW50CiAgICAgICAgc2VsZi5zb3VyY2VfZGlyID0gc291cmNlX2RpcgogICAgICAgIHNlbGYuZWRpdGFibGUgPSBlZGl0YWJsZQoKICAgICAgICBzZWxmLl93aGVlbF9jYWNoZSA9IHdoZWVsX2NhY2hlCiAgICAgICAgc2VsZi5saW5rID0gc2VsZi5vcmlnaW5hbF9saW5rID0gbGluawogICAgICAgIHNlbGYuYXNfZWdnID0gYXNfZWdnCiAgICAgICAgaWYgbWFya2VycyBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5tYXJrZXJzID0gbWFya2VycwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYubWFya2VycyA9IHJlcSBhbmQgcmVxLm1hcmtlcgogICAgICAgIHNlbGYuX2VnZ19pbmZvX3BhdGggPSBOb25lCiAgICAgICAgIyBUaGlzIGhvbGRzIHRoZSBwa2dfcmVzb3VyY2VzLkRpc3RyaWJ1dGlvbiBvYmplY3QgaWYgdGhpcyByZXF1aXJlbWVudAogICAgICAgICMgaXMgYWxyZWFkeSBhdmFpbGFibGU6CiAgICAgICAgc2VsZi5zYXRpc2ZpZWRfYnkgPSBOb25lCiAgICAgICAgIyBUaGlzIGhvbGQgdGhlIHBrZ19yZXNvdXJjZXMuRGlzdHJpYnV0aW9uIG9iamVjdCBpZiB0aGlzIHJlcXVpcmVtZW50CiAgICAgICAgIyBjb25mbGljdHMgd2l0aCBhbm90aGVyIGluc3RhbGxlZCBkaXN0cmlidXRpb246CiAgICAgICAgc2VsZi5jb25mbGljdHNfd2l0aCA9IE5vbmUKICAgICAgICAjIFRlbXBvcmFyeSBidWlsZCBsb2NhdGlvbgogICAgICAgIHNlbGYuX3RlbXBfYnVpbGRfZGlyID0gTm9uZQogICAgICAgICMgVXNlZCB0byBzdG9yZSB0aGUgZ2xvYmFsIGRpcmVjdG9yeSB3aGVyZSB0aGUgX3RlbXBfYnVpbGRfZGlyIHNob3VsZAogICAgICAgICMgaGF2ZSBiZWVuIGNyZWF0ZWQuIENmIF9jb3JyZWN0X2J1aWxkX2xvY2F0aW9uIG1ldGhvZC4KICAgICAgICBzZWxmLl9pZGVhbF9idWlsZF9kaXIgPSBOb25lCiAgICAgICAgIyBUcnVlIGlmIHRoZSBlZGl0YWJsZSBzaG91bGQgYmUgdXBkYXRlZDoKICAgICAgICBzZWxmLnVwZGF0ZSA9IHVwZGF0ZQogICAgICAgICMgU2V0IHRvIFRydWUgYWZ0ZXIgc3VjY2Vzc2Z1bCBpbnN0YWxsYXRpb24KICAgICAgICBzZWxmLmluc3RhbGxfc3VjY2VlZGVkID0gTm9uZQogICAgICAgICMgVW5pbnN0YWxsUGF0aFNldCBvZiB1bmluc3RhbGxlZCBkaXN0cmlidXRpb24gKGZvciBwb3NzaWJsZSByb2xsYmFjaykKICAgICAgICBzZWxmLnVuaW5zdGFsbGVkID0gTm9uZQogICAgICAgICMgU2V0IFRydWUgaWYgYSBsZWdpdGltYXRlIGRvLW5vdGhpbmctb24tdW5pbnN0YWxsIGhhcyBoYXBwZW5lZCAtIGUuZy4KICAgICAgICAjIHN5c3RlbSBzaXRlIHBhY2thZ2VzLCBzdGRsaWIgcGFja2FnZXMuCiAgICAgICAgc2VsZi5ub3RoaW5nX3RvX3VuaW5zdGFsbCA9IEZhbHNlCiAgICAgICAgc2VsZi51c2VfdXNlcl9zaXRlID0gRmFsc2UKICAgICAgICBzZWxmLnRhcmdldF9kaXIgPSBOb25lCiAgICAgICAgc2VsZi5vcHRpb25zID0gb3B0aW9ucyBpZiBvcHRpb25zIGVsc2Uge30KICAgICAgICBzZWxmLnB5Y29tcGlsZSA9IHB5Y29tcGlsZQogICAgICAgICMgU2V0IHRvIFRydWUgYWZ0ZXIgc3VjY2Vzc2Z1bCBwcmVwYXJhdGlvbiBvZiB0aGlzIHJlcXVpcmVtZW50CiAgICAgICAgc2VsZi5wcmVwYXJlZCA9IEZhbHNlCgogICAgICAgIHNlbGYuaXNvbGF0ZWQgPSBpc29sYXRlZAoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGZyb21fZWRpdGFibGUoY2xzLCBlZGl0YWJsZV9yZXEsIGNvbWVzX2Zyb209Tm9uZSwgZGVmYXVsdF92Y3M9Tm9uZSwKICAgICAgICAgICAgICAgICAgICAgIGlzb2xhdGVkPUZhbHNlLCBvcHRpb25zPU5vbmUsIHdoZWVsX2NhY2hlPU5vbmUsCiAgICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW50PUZhbHNlKToKICAgICAgICBmcm9tIHBpcC5pbmRleCBpbXBvcnQgTGluawoKICAgICAgICBuYW1lLCB1cmwsIGV4dHJhc19vdmVycmlkZSA9IHBhcnNlX2VkaXRhYmxlKAogICAgICAgICAgICBlZGl0YWJsZV9yZXEsIGRlZmF1bHRfdmNzKQogICAgICAgIGlmIHVybC5zdGFydHN3aXRoKCdmaWxlOicpOgogICAgICAgICAgICBzb3VyY2VfZGlyID0gdXJsX3RvX3BhdGgodXJsKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNvdXJjZV9kaXIgPSBOb25lCgogICAgICAgIHJlcyA9IGNscyhuYW1lLCBjb21lc19mcm9tLCBzb3VyY2VfZGlyPXNvdXJjZV9kaXIsCiAgICAgICAgICAgICAgICAgIGVkaXRhYmxlPVRydWUsCiAgICAgICAgICAgICAgICAgIGxpbms9TGluayh1cmwpLAogICAgICAgICAgICAgICAgICBjb25zdHJhaW50PWNvbnN0cmFpbnQsCiAgICAgICAgICAgICAgICAgIGlzb2xhdGVkPWlzb2xhdGVkLAogICAgICAgICAgICAgICAgICBvcHRpb25zPW9wdGlvbnMgaWYgb3B0aW9ucyBlbHNlIHt9LAogICAgICAgICAgICAgICAgICB3aGVlbF9jYWNoZT13aGVlbF9jYWNoZSkKCiAgICAgICAgaWYgZXh0cmFzX292ZXJyaWRlIGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXMuZXh0cmFzID0gX3NhZmVfZXh0cmFzKGV4dHJhc19vdmVycmlkZSkKCiAgICAgICAgcmV0dXJuIHJlcwoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGZyb21fbGluZSgKICAgICAgICAgICAgY2xzLCBuYW1lLCBjb21lc19mcm9tPU5vbmUsIGlzb2xhdGVkPUZhbHNlLCBvcHRpb25zPU5vbmUsCiAgICAgICAgICAgIHdoZWVsX2NhY2hlPU5vbmUsIGNvbnN0cmFpbnQ9RmFsc2UpOgogICAgICAgICIiIkNyZWF0ZXMgYW4gSW5zdGFsbFJlcXVpcmVtZW50IGZyb20gYSBuYW1lLCB3aGljaCBtaWdodCBiZSBhCiAgICAgICAgcmVxdWlyZW1lbnQsIGRpcmVjdG9yeSBjb250YWluaW5nICdzZXR1cC5weScsIGZpbGVuYW1lLCBvciBVUkwuCiAgICAgICAgIiIiCiAgICAgICAgZnJvbSBwaXAuaW5kZXggaW1wb3J0IExpbmsKCiAgICAgICAgaWYgaXNfdXJsKG5hbWUpOgogICAgICAgICAgICBtYXJrZXJfc2VwID0gJzsgJwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG1hcmtlcl9zZXAgPSAnOycKICAgICAgICBpZiBtYXJrZXJfc2VwIGluIG5hbWU6CiAgICAgICAgICAgIG5hbWUsIG1hcmtlcnMgPSBuYW1lLnNwbGl0KG1hcmtlcl9zZXAsIDEpCiAgICAgICAgICAgIG1hcmtlcnMgPSBtYXJrZXJzLnN0cmlwKCkKICAgICAgICAgICAgaWYgbm90IG1hcmtlcnM6CiAgICAgICAgICAgICAgICBtYXJrZXJzID0gTm9uZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgbWFya2VycyA9IE1hcmtlcihtYXJrZXJzKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG1hcmtlcnMgPSBOb25lCiAgICAgICAgbmFtZSA9IG5hbWUuc3RyaXAoKQogICAgICAgIHJlcSA9IE5vbmUKICAgICAgICBwYXRoID0gb3MucGF0aC5ub3JtcGF0aChvcy5wYXRoLmFic3BhdGgobmFtZSkpCiAgICAgICAgbGluayA9IE5vbmUKICAgICAgICBleHRyYXMgPSBOb25lCgogICAgICAgIGlmIGlzX3VybChuYW1lKToKICAgICAgICAgICAgbGluayA9IExpbmsobmFtZSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBwLCBleHRyYXMgPSBfc3RyaXBfZXh0cmFzKHBhdGgpCiAgICAgICAgICAgIGlmIChvcy5wYXRoLmlzZGlyKHApIGFuZAogICAgICAgICAgICAgICAgICAgIChvcy5wYXRoLnNlcCBpbiBuYW1lIG9yIG5hbWUuc3RhcnRzd2l0aCgnLicpKSk6CgogICAgICAgICAgICAgICAgaWYgbm90IGlzX2luc3RhbGxhYmxlX2RpcihwKToKICAgICAgICAgICAgICAgICAgICByYWlzZSBJbnN0YWxsYXRpb25FcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgIkRpcmVjdG9yeSAlciBpcyBub3QgaW5zdGFsbGFibGUuIEZpbGUgJ3NldHVwLnB5JyAiCiAgICAgICAgICAgICAgICAgICAgICAgICJub3QgZm91bmQuIiAlIG5hbWUKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBsaW5rID0gTGluayhwYXRoX3RvX3VybChwKSkKICAgICAgICAgICAgZWxpZiBpc19hcmNoaXZlX2ZpbGUocCk6CiAgICAgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2ZpbGUocCk6CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICAgICAgICAgICAgICdSZXF1aXJlbWVudCAlciBsb29rcyBsaWtlIGEgZmlsZW5hbWUsIGJ1dCB0aGUgJwogICAgICAgICAgICAgICAgICAgICAgICAnZmlsZSBkb2VzIG5vdCBleGlzdCcsCiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBsaW5rID0gTGluayhwYXRoX3RvX3VybChwKSkKCiAgICAgICAgIyBpdCdzIGEgbG9jYWwgZmlsZSwgZGlyLCBvciB1cmwKICAgICAgICBpZiBsaW5rOgogICAgICAgICAgICAjIEhhbmRsZSByZWxhdGl2ZSBmaWxlIFVSTHMKICAgICAgICAgICAgaWYgbGluay5zY2hlbWUgPT0gJ2ZpbGUnIGFuZCByZS5zZWFyY2gocidcLlwuLycsIGxpbmsudXJsKToKICAgICAgICAgICAgICAgIGxpbmsgPSBMaW5rKAogICAgICAgICAgICAgICAgICAgIHBhdGhfdG9fdXJsKG9zLnBhdGgubm9ybXBhdGgob3MucGF0aC5hYnNwYXRoKGxpbmsucGF0aCkpKSkKICAgICAgICAgICAgIyB3aGVlbCBmaWxlCiAgICAgICAgICAgIGlmIGxpbmsuaXNfd2hlZWw6CiAgICAgICAgICAgICAgICB3aGVlbCA9IFdoZWVsKGxpbmsuZmlsZW5hbWUpICAjIGNhbiByYWlzZSBJbnZhbGlkV2hlZWxGaWxlbmFtZQogICAgICAgICAgICAgICAgcmVxID0gIiVzPT0lcyIgJSAod2hlZWwubmFtZSwgd2hlZWwudmVyc2lvbikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgc2V0IHRoZSByZXEgdG8gdGhlIGVnZyBmcmFnbWVudC4gIHdoZW4gaXQncyBub3QgdGhlcmUsIHRoaXMKICAgICAgICAgICAgICAgICMgd2lsbCBiZWNvbWUgYW4gJ3VubmFtZWQnIHJlcXVpcmVtZW50CiAgICAgICAgICAgICAgICByZXEgPSBsaW5rLmVnZ19mcmFnbWVudAoKICAgICAgICAjIGEgcmVxdWlyZW1lbnQgc3BlY2lmaWVyCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmVxID0gbmFtZQoKICAgICAgICBvcHRpb25zID0gb3B0aW9ucyBpZiBvcHRpb25zIGVsc2Uge30KICAgICAgICByZXMgPSBjbHMocmVxLCBjb21lc19mcm9tLCBsaW5rPWxpbmssIG1hcmtlcnM9bWFya2VycywKICAgICAgICAgICAgICAgICAgaXNvbGF0ZWQ9aXNvbGF0ZWQsIG9wdGlvbnM9b3B0aW9ucywKICAgICAgICAgICAgICAgICAgd2hlZWxfY2FjaGU9d2hlZWxfY2FjaGUsIGNvbnN0cmFpbnQ9Y29uc3RyYWludCkKCiAgICAgICAgaWYgZXh0cmFzOgogICAgICAgICAgICByZXMuZXh0cmFzID0gX3NhZmVfZXh0cmFzKAogICAgICAgICAgICAgICAgUmVxdWlyZW1lbnQoJ3BsYWNlaG9sZGVyJyArIGV4dHJhcykuZXh0cmFzKQoKICAgICAgICByZXR1cm4gcmVzCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgaWYgc2VsZi5yZXE6CiAgICAgICAgICAgIHMgPSBzdHIoc2VsZi5yZXEpCiAgICAgICAgICAgIGlmIHNlbGYubGluazoKICAgICAgICAgICAgICAgIHMgKz0gJyBmcm9tICVzJyAlIHNlbGYubGluay51cmwKICAgICAgICBlbHNlOgogICAgICAgICAgICBzID0gc2VsZi5saW5rLnVybCBpZiBzZWxmLmxpbmsgZWxzZSBOb25lCiAgICAgICAgaWYgc2VsZi5zYXRpc2ZpZWRfYnkgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHMgKz0gJyBpbiAlcycgJSBkaXNwbGF5X3BhdGgoc2VsZi5zYXRpc2ZpZWRfYnkubG9jYXRpb24pCiAgICAgICAgaWYgc2VsZi5jb21lc19mcm9tOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYuY29tZXNfZnJvbSwgc2l4LnN0cmluZ190eXBlcyk6CiAgICAgICAgICAgICAgICBjb21lc19mcm9tID0gc2VsZi5jb21lc19mcm9tCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBjb21lc19mcm9tID0gc2VsZi5jb21lc19mcm9tLmZyb21fcGF0aCgpCiAgICAgICAgICAgIGlmIGNvbWVzX2Zyb206CiAgICAgICAgICAgICAgICBzICs9ICcgKGZyb20gJXMpJyAlIGNvbWVzX2Zyb20KICAgICAgICByZXR1cm4gcwoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gJzwlcyBvYmplY3Q6ICVzIGVkaXRhYmxlPSVyPicgJSAoCiAgICAgICAgICAgIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzdHIoc2VsZiksIHNlbGYuZWRpdGFibGUpCgogICAgZGVmIHBvcHVsYXRlX2xpbmsoc2VsZiwgZmluZGVyLCB1cGdyYWRlLCByZXF1aXJlX2hhc2hlcyk6CiAgICAgICAgIiIiRW5zdXJlIHRoYXQgaWYgYSBsaW5rIGNhbiBiZSBmb3VuZCBmb3IgdGhpcywgdGhhdCBpdCBpcyBmb3VuZC4KCiAgICAgICAgTm90ZSB0aGF0IHNlbGYubGluayBtYXkgc3RpbGwgYmUgTm9uZSAtIGlmIFVwZ3JhZGUgaXMgRmFsc2UgYW5kIHRoZQogICAgICAgIHJlcXVpcmVtZW50IGlzIGFscmVhZHkgaW5zdGFsbGVkLgoKICAgICAgICBJZiByZXF1aXJlX2hhc2hlcyBpcyBUcnVlLCBkb24ndCB1c2UgdGhlIHdoZWVsIGNhY2hlLCBiZWNhdXNlIGNhY2hlZAogICAgICAgIHdoZWVscywgYWx3YXlzIGJ1aWx0IGxvY2FsbHksIGhhdmUgZGlmZmVyZW50IGhhc2hlcyB0aGFuIHRoZSBmaWxlcwogICAgICAgIGRvd25sb2FkZWQgZnJvbSB0aGUgaW5kZXggc2VydmVyIGFuZCB0aHVzIHRocm93IGZhbHNlIGhhc2ggbWlzbWF0Y2hlcy4KICAgICAgICBGdXJ0aGVybW9yZSwgY2FjaGVkIHdoZWVscyBhdCBwcmVzZW50IGhhdmUgdW5kZXRlcm1pbmlzdGljIGNvbnRlbnRzIGR1ZQogICAgICAgIHRvIGZpbGUgbW9kaWZpY2F0aW9uIHRpbWVzLgogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYubGluayBpcyBOb25lOgogICAgICAgICAgICBzZWxmLmxpbmsgPSBmaW5kZXIuZmluZF9yZXF1aXJlbWVudChzZWxmLCB1cGdyYWRlKQogICAgICAgIGlmIHNlbGYuX3doZWVsX2NhY2hlIGlzIG5vdCBOb25lIGFuZCBub3QgcmVxdWlyZV9oYXNoZXM6CiAgICAgICAgICAgIG9sZF9saW5rID0gc2VsZi5saW5rCiAgICAgICAgICAgIHNlbGYubGluayA9IHNlbGYuX3doZWVsX2NhY2hlLmNhY2hlZF93aGVlbChzZWxmLmxpbmssIHNlbGYubmFtZSkKICAgICAgICAgICAgaWYgb2xkX2xpbmsgIT0gc2VsZi5saW5rOgogICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdVc2luZyBjYWNoZWQgd2hlZWwgbGluazogJXMnLCBzZWxmLmxpbmspCgogICAgQHByb3BlcnR5CiAgICBkZWYgc3BlY2lmaWVyKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLnJlcS5zcGVjaWZpZXIKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc19waW5uZWQoc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIHdoZXRoZXIgSSBhbSBwaW5uZWQgdG8gYW4gZXhhY3QgdmVyc2lvbi4KCiAgICAgICAgRm9yIGV4YW1wbGUsIHNvbWUtcGFja2FnZT09MS4yIGlzIHBpbm5lZDsgc29tZS1wYWNrYWdlPjEuMiBpcyBub3QuCiAgICAgICAgIiIiCiAgICAgICAgc3BlY2lmaWVycyA9IHNlbGYuc3BlY2lmaWVyCiAgICAgICAgcmV0dXJuIChsZW4oc3BlY2lmaWVycykgPT0gMSBhbmQKICAgICAgICAgICAgICAgIG5leHQoaXRlcihzcGVjaWZpZXJzKSkub3BlcmF0b3IgaW4gKCc9PScsICc9PT0nKSkKCiAgICBkZWYgZnJvbV9wYXRoKHNlbGYpOgogICAgICAgIGlmIHNlbGYucmVxIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgcyA9IHN0cihzZWxmLnJlcSkKICAgICAgICBpZiBzZWxmLmNvbWVzX2Zyb206CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5jb21lc19mcm9tLCBzaXguc3RyaW5nX3R5cGVzKToKICAgICAgICAgICAgICAgIGNvbWVzX2Zyb20gPSBzZWxmLmNvbWVzX2Zyb20KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGNvbWVzX2Zyb20gPSBzZWxmLmNvbWVzX2Zyb20uZnJvbV9wYXRoKCkKICAgICAgICAgICAgaWYgY29tZXNfZnJvbToKICAgICAgICAgICAgICAgIHMgKz0gJy0+JyArIGNvbWVzX2Zyb20KICAgICAgICByZXR1cm4gcwoKICAgIGRlZiBidWlsZF9sb2NhdGlvbihzZWxmLCBidWlsZF9kaXIpOgogICAgICAgIGlmIHNlbGYuX3RlbXBfYnVpbGRfZGlyIGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fdGVtcF9idWlsZF9kaXIKICAgICAgICBpZiBzZWxmLnJlcSBpcyBOb25lOgogICAgICAgICAgICAjIGZvciByZXF1aXJlbWVudCB2aWEgYSBwYXRoIHRvIGEgZGlyZWN0b3J5OiB0aGUgbmFtZSBvZiB0aGUKICAgICAgICAgICAgIyBwYWNrYWdlIGlzIG5vdCBhdmFpbGFibGUgeWV0IHNvIHdlIGNyZWF0ZSBhIHRlbXAgZGlyZWN0b3J5CiAgICAgICAgICAgICMgT25jZSBydW5fZWdnX2luZm8gd2lsbCBoYXZlIHJ1biwgd2UnbGwgYmUgYWJsZQogICAgICAgICAgICAjIHRvIGZpeCBpdCB2aWEgX2NvcnJlY3RfYnVpbGRfbG9jYXRpb24KICAgICAgICAgICAgIyBTb21lIHN5c3RlbXMgaGF2ZSAvdG1wIGFzIGEgc3ltbGluayB3aGljaCBjb25mdXNlcyBjdXN0b20KICAgICAgICAgICAgIyBidWlsZHMgKHN1Y2ggYXMgbnVtcHkpLiBUaHVzLCB3ZSBlbnN1cmUgdGhhdCB0aGUgcmVhbCBwYXRoCiAgICAgICAgICAgICMgaXMgcmV0dXJuZWQuCiAgICAgICAgICAgIHNlbGYuX3RlbXBfYnVpbGRfZGlyID0gb3MucGF0aC5yZWFscGF0aCgKICAgICAgICAgICAgICAgIHRlbXBmaWxlLm1rZHRlbXAoJy1idWlsZCcsICdwaXAtJykKICAgICAgICAgICAgKQogICAgICAgICAgICBzZWxmLl9pZGVhbF9idWlsZF9kaXIgPSBidWlsZF9kaXIKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RlbXBfYnVpbGRfZGlyCiAgICAgICAgaWYgc2VsZi5lZGl0YWJsZToKICAgICAgICAgICAgbmFtZSA9IHNlbGYubmFtZS5sb3dlcigpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbmFtZSA9IHNlbGYubmFtZQogICAgICAgICMgRklYTUU6IElzIHRoZXJlIGEgYmV0dGVyIHBsYWNlIHRvIGNyZWF0ZSB0aGUgYnVpbGRfZGlyPyAoaGcgYW5kIGJ6cgogICAgICAgICMgbmVlZCB0aGlzKQogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhidWlsZF9kaXIpOgogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0NyZWF0aW5nIGRpcmVjdG9yeSAlcycsIGJ1aWxkX2RpcikKICAgICAgICAgICAgX21ha2VfYnVpbGRfZGlyKGJ1aWxkX2RpcikKICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKGJ1aWxkX2RpciwgbmFtZSkKCiAgICBkZWYgX2NvcnJlY3RfYnVpbGRfbG9jYXRpb24oc2VsZik6CiAgICAgICAgIiIiTW92ZSBzZWxmLl90ZW1wX2J1aWxkX2RpciB0byBzZWxmLl9pZGVhbF9idWlsZF9kaXIvc2VsZi5yZXEubmFtZQoKICAgICAgICBGb3Igc29tZSByZXF1aXJlbWVudHMgKGUuZy4gYSBwYXRoIHRvIGEgZGlyZWN0b3J5KSwgdGhlIG5hbWUgb2YgdGhlCiAgICAgICAgcGFja2FnZSBpcyBub3QgYXZhaWxhYmxlIHVudGlsIHdlIHJ1biBlZ2dfaW5mbywgc28gdGhlIGJ1aWxkX2xvY2F0aW9uCiAgICAgICAgd2lsbCByZXR1cm4gYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGFuZCBzdG9yZSB0aGUgX2lkZWFsX2J1aWxkX2Rpci4KCiAgICAgICAgVGhpcyBpcyBvbmx5IGNhbGxlZCBieSBzZWxmLmVnZ19pbmZvX3BhdGggdG8gZml4IHRoZSB0ZW1wb3JhcnkgYnVpbGQKICAgICAgICBkaXJlY3RvcnkuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5zb3VyY2VfZGlyIGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBhc3NlcnQgc2VsZi5yZXEgaXMgbm90IE5vbmUKICAgICAgICBhc3NlcnQgc2VsZi5fdGVtcF9idWlsZF9kaXIKICAgICAgICBhc3NlcnQgc2VsZi5faWRlYWxfYnVpbGRfZGlyCiAgICAgICAgb2xkX2xvY2F0aW9uID0gc2VsZi5fdGVtcF9idWlsZF9kaXIKICAgICAgICBzZWxmLl90ZW1wX2J1aWxkX2RpciA9IE5vbmUKICAgICAgICBuZXdfbG9jYXRpb24gPSBzZWxmLmJ1aWxkX2xvY2F0aW9uKHNlbGYuX2lkZWFsX2J1aWxkX2RpcikKICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhuZXdfbG9jYXRpb24pOgogICAgICAgICAgICByYWlzZSBJbnN0YWxsYXRpb25FcnJvcigKICAgICAgICAgICAgICAgICdBIHBhY2thZ2UgYWxyZWFkeSBleGlzdHMgaW4gJXM7IHBsZWFzZSByZW1vdmUgaXQgdG8gY29udGludWUnCiAgICAgICAgICAgICAgICAlIGRpc3BsYXlfcGF0aChuZXdfbG9jYXRpb24pKQogICAgICAgIGxvZ2dlci5kZWJ1ZygKICAgICAgICAgICAgJ01vdmluZyBwYWNrYWdlICVzIGZyb20gJXMgdG8gbmV3IGxvY2F0aW9uICVzJywKICAgICAgICAgICAgc2VsZiwgZGlzcGxheV9wYXRoKG9sZF9sb2NhdGlvbiksIGRpc3BsYXlfcGF0aChuZXdfbG9jYXRpb24pLAogICAgICAgICkKICAgICAgICBzaHV0aWwubW92ZShvbGRfbG9jYXRpb24sIG5ld19sb2NhdGlvbikKICAgICAgICBzZWxmLl90ZW1wX2J1aWxkX2RpciA9IG5ld19sb2NhdGlvbgogICAgICAgIHNlbGYuX2lkZWFsX2J1aWxkX2RpciA9IE5vbmUKICAgICAgICBzZWxmLnNvdXJjZV9kaXIgPSBuZXdfbG9jYXRpb24KICAgICAgICBzZWxmLl9lZ2dfaW5mb19wYXRoID0gTm9uZQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIG5hbWUoc2VsZik6CiAgICAgICAgaWYgc2VsZi5yZXEgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICByZXR1cm4gbmF0aXZlX3N0cihwa2dfcmVzb3VyY2VzLnNhZmVfbmFtZShzZWxmLnJlcS5uYW1lKSkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBzZXR1cF9weV9kaXIoc2VsZik6CiAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbigKICAgICAgICAgICAgc2VsZi5zb3VyY2VfZGlyLAogICAgICAgICAgICBzZWxmLmxpbmsgYW5kIHNlbGYubGluay5zdWJkaXJlY3RvcnlfZnJhZ21lbnQgb3IgJycpCgogICAgQHByb3BlcnR5CiAgICBkZWYgc2V0dXBfcHkoc2VsZik6CiAgICAgICAgYXNzZXJ0IHNlbGYuc291cmNlX2RpciwgIk5vIHNvdXJjZSBkaXIgZm9yICVzIiAlIHNlbGYKICAgICAgICB0cnk6CiAgICAgICAgICAgIGltcG9ydCBzZXR1cHRvb2xzICAjIG5vcWEKICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgICAgIGlmIGdldF9pbnN0YWxsZWRfdmVyc2lvbignc2V0dXB0b29scycpIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBhZGRfbXNnID0gIlBsZWFzZSBpbnN0YWxsIHNldHVwdG9vbHMuIgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgYWRkX21zZyA9IHRyYWNlYmFjay5mb3JtYXRfZXhjKCkKICAgICAgICAgICAgIyBTZXR1cHRvb2xzIGlzIG5vdCBhdmFpbGFibGUKICAgICAgICAgICAgcmFpc2UgSW5zdGFsbGF0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAiQ291bGQgbm90IGltcG9ydCBzZXR1cHRvb2xzIHdoaWNoIGlzIHJlcXVpcmVkIHRvICIKICAgICAgICAgICAgICAgICJpbnN0YWxsIGZyb20gYSBzb3VyY2UgZGlzdHJpYnV0aW9uLlxuJXMiICUgYWRkX21zZwogICAgICAgICAgICApCgogICAgICAgIHNldHVwX3B5ID0gb3MucGF0aC5qb2luKHNlbGYuc2V0dXBfcHlfZGlyLCAnc2V0dXAucHknKQoKICAgICAgICAjIFB5dGhvbjIgX19maWxlX18gc2hvdWxkIG5vdCBiZSB1bmljb2RlCiAgICAgICAgaWYgc2l4LlBZMiBhbmQgaXNpbnN0YW5jZShzZXR1cF9weSwgc2l4LnRleHRfdHlwZSk6CiAgICAgICAgICAgIHNldHVwX3B5ID0gc2V0dXBfcHkuZW5jb2RlKHN5cy5nZXRmaWxlc3lzdGVtZW5jb2RpbmcoKSkKCiAgICAgICAgcmV0dXJuIHNldHVwX3B5CgogICAgZGVmIHJ1bl9lZ2dfaW5mbyhzZWxmKToKICAgICAgICBhc3NlcnQgc2VsZi5zb3VyY2VfZGlyCiAgICAgICAgaWYgc2VsZi5uYW1lOgogICAgICAgICAgICBsb2dnZXIuZGVidWcoCiAgICAgICAgICAgICAgICAnUnVubmluZyBzZXR1cC5weSAocGF0aDolcykgZWdnX2luZm8gZm9yIHBhY2thZ2UgJXMnLAogICAgICAgICAgICAgICAgc2VsZi5zZXR1cF9weSwgc2VsZi5uYW1lLAogICAgICAgICAgICApCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKAogICAgICAgICAgICAgICAgJ1J1bm5pbmcgc2V0dXAucHkgKHBhdGg6JXMpIGVnZ19pbmZvIGZvciBwYWNrYWdlIGZyb20gJXMnLAogICAgICAgICAgICAgICAgc2VsZi5zZXR1cF9weSwgc2VsZi5saW5rLAogICAgICAgICAgICApCgogICAgICAgIHdpdGggaW5kZW50X2xvZygpOgogICAgICAgICAgICBzY3JpcHQgPSBTRVRVUFRPT0xTX1NISU0gJSBzZWxmLnNldHVwX3B5CiAgICAgICAgICAgIGJhc2VfY21kID0gW3N5cy5leGVjdXRhYmxlLCAnLWMnLCBzY3JpcHRdCiAgICAgICAgICAgIGlmIHNlbGYuaXNvbGF0ZWQ6CiAgICAgICAgICAgICAgICBiYXNlX2NtZCArPSBbIi0tbm8tdXNlci1jZmciXQogICAgICAgICAgICBlZ2dfaW5mb19jbWQgPSBiYXNlX2NtZCArIFsnZWdnX2luZm8nXQogICAgICAgICAgICAjIFdlIGNhbid0IHB1dCB0aGUgLmVnZy1pbmZvIGZpbGVzIGF0IHRoZSByb290LCBiZWNhdXNlIHRoZW4gdGhlCiAgICAgICAgICAgICMgc291cmNlIGNvZGUgd2lsbCBiZSBtaXN0YWtlbiBmb3IgYW4gaW5zdGFsbGVkIGVnZywgY2F1c2luZwogICAgICAgICAgICAjIHByb2JsZW1zCiAgICAgICAgICAgIGlmIHNlbGYuZWRpdGFibGU6CiAgICAgICAgICAgICAgICBlZ2dfYmFzZV9vcHRpb24gPSBbXQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgZWdnX2luZm9fZGlyID0gb3MucGF0aC5qb2luKHNlbGYuc2V0dXBfcHlfZGlyLCAncGlwLWVnZy1pbmZvJykKICAgICAgICAgICAgICAgIGVuc3VyZV9kaXIoZWdnX2luZm9fZGlyKQogICAgICAgICAgICAgICAgZWdnX2Jhc2Vfb3B0aW9uID0gWyctLWVnZy1iYXNlJywgJ3BpcC1lZ2ctaW5mbyddCiAgICAgICAgICAgIGNhbGxfc3VicHJvY2VzcygKICAgICAgICAgICAgICAgIGVnZ19pbmZvX2NtZCArIGVnZ19iYXNlX29wdGlvbiwKICAgICAgICAgICAgICAgIGN3ZD1zZWxmLnNldHVwX3B5X2RpciwKICAgICAgICAgICAgICAgIHNob3dfc3Rkb3V0PUZhbHNlLAogICAgICAgICAgICAgICAgY29tbWFuZF9kZXNjPSdweXRob24gc2V0dXAucHkgZWdnX2luZm8nKQoKICAgICAgICBpZiBub3Qgc2VsZi5yZXE6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UocGFyc2VfdmVyc2lvbihzZWxmLnBrZ19pbmZvKClbIlZlcnNpb24iXSksIFZlcnNpb24pOgogICAgICAgICAgICAgICAgb3AgPSAiPT0iCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBvcCA9ICI9PT0iCiAgICAgICAgICAgIHNlbGYucmVxID0gUmVxdWlyZW1lbnQoCiAgICAgICAgICAgICAgICAiIi5qb2luKFsKICAgICAgICAgICAgICAgICAgICBzZWxmLnBrZ19pbmZvKClbIk5hbWUiXSwKICAgICAgICAgICAgICAgICAgICBvcCwKICAgICAgICAgICAgICAgICAgICBzZWxmLnBrZ19pbmZvKClbIlZlcnNpb24iXSwKICAgICAgICAgICAgICAgIF0pCiAgICAgICAgICAgICkKICAgICAgICAgICAgc2VsZi5fY29ycmVjdF9idWlsZF9sb2NhdGlvbigpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbWV0YWRhdGFfbmFtZSA9IGNhbm9uaWNhbGl6ZV9uYW1lKHNlbGYucGtnX2luZm8oKVsiTmFtZSJdKQogICAgICAgICAgICBpZiBjYW5vbmljYWxpemVfbmFtZShzZWxmLnJlcS5uYW1lKSAhPSBtZXRhZGF0YV9uYW1lOgogICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICAgICAgICAgJ1J1bm5pbmcgc2V0dXAucHkgKHBhdGg6JXMpIGVnZ19pbmZvIGZvciBwYWNrYWdlICVzICcKICAgICAgICAgICAgICAgICAgICAncHJvZHVjZWQgbWV0YWRhdGEgZm9yIHByb2plY3QgbmFtZSAlcy4gRml4IHlvdXIgJwogICAgICAgICAgICAgICAgICAgICcjZWdnPSVzIGZyYWdtZW50cy4nLAogICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0dXBfcHksIHNlbGYubmFtZSwgbWV0YWRhdGFfbmFtZSwgc2VsZi5uYW1lCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBzZWxmLnJlcSA9IFJlcXVpcmVtZW50KG1ldGFkYXRhX25hbWUpCgogICAgZGVmIGVnZ19pbmZvX2RhdGEoc2VsZiwgZmlsZW5hbWUpOgogICAgICAgIGlmIHNlbGYuc2F0aXNmaWVkX2J5IGlzIG5vdCBOb25lOgogICAgICAgICAgICBpZiBub3Qgc2VsZi5zYXRpc2ZpZWRfYnkuaGFzX21ldGFkYXRhKGZpbGVuYW1lKToKICAgICAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgICAgIHJldHVybiBzZWxmLnNhdGlzZmllZF9ieS5nZXRfbWV0YWRhdGEoZmlsZW5hbWUpCiAgICAgICAgYXNzZXJ0IHNlbGYuc291cmNlX2RpcgogICAgICAgIGZpbGVuYW1lID0gc2VsZi5lZ2dfaW5mb19wYXRoKGZpbGVuYW1lKQogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhmaWxlbmFtZSk6CiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgZGF0YSA9IHJlYWRfdGV4dF9maWxlKGZpbGVuYW1lKQogICAgICAgIHJldHVybiBkYXRhCgogICAgZGVmIGVnZ19pbmZvX3BhdGgoc2VsZiwgZmlsZW5hbWUpOgogICAgICAgIGlmIHNlbGYuX2VnZ19pbmZvX3BhdGggaXMgTm9uZToKICAgICAgICAgICAgaWYgc2VsZi5lZGl0YWJsZToKICAgICAgICAgICAgICAgIGJhc2UgPSBzZWxmLnNvdXJjZV9kaXIKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGJhc2UgPSBvcy5wYXRoLmpvaW4oc2VsZi5zZXR1cF9weV9kaXIsICdwaXAtZWdnLWluZm8nKQogICAgICAgICAgICBmaWxlbmFtZXMgPSBvcy5saXN0ZGlyKGJhc2UpCiAgICAgICAgICAgIGlmIHNlbGYuZWRpdGFibGU6CiAgICAgICAgICAgICAgICBmaWxlbmFtZXMgPSBbXQogICAgICAgICAgICAgICAgZm9yIHJvb3QsIGRpcnMsIGZpbGVzIGluIG9zLndhbGsoYmFzZSk6CiAgICAgICAgICAgICAgICAgICAgZm9yIGRpciBpbiB2Y3MuZGlybmFtZXM6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGRpciBpbiBkaXJzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlycy5yZW1vdmUoZGlyKQogICAgICAgICAgICAgICAgICAgICMgSXRlcmF0ZSBvdmVyIGEgY29weSBvZiBgYGRpcnNgYCwgc2luY2UgbXV0YXRpbmcKICAgICAgICAgICAgICAgICAgICAjIGEgbGlzdCB3aGlsZSBpdGVyYXRpbmcgb3ZlciBpdCBjYW4gY2F1c2UgdHJvdWJsZS4KICAgICAgICAgICAgICAgICAgICAjIChTZWUgaHR0cHM6Ly9naXRodWIuY29tL3B5cGEvcGlwL3B1bGwvNDYyLikKICAgICAgICAgICAgICAgICAgICBmb3IgZGlyIGluIGxpc3QoZGlycyk6CiAgICAgICAgICAgICAgICAgICAgICAgICMgRG9uJ3Qgc2VhcmNoIGluIGFueXRoaW5nIHRoYXQgbG9va3MgbGlrZSBhIHZpcnR1YWxlbnYKICAgICAgICAgICAgICAgICAgICAgICAgIyBlbnZpcm9ubWVudAogICAgICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5sZXhpc3RzKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4ocm9vdCwgZGlyLCAnYmluJywgJ3B5dGhvbicpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSBvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguZXhpc3RzKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290LCBkaXIsICdTY3JpcHRzJywgJ1B5dGhvbi5leGUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcnMucmVtb3ZlKGRpcikKICAgICAgICAgICAgICAgICAgICAgICAgIyBBbHNvIGRvbid0IHNlYXJjaCB0aHJvdWdoIHRlc3RzCiAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgZGlyID09ICd0ZXN0JyBvciBkaXIgPT0gJ3Rlc3RzJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcnMucmVtb3ZlKGRpcikKICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZXMuZXh0ZW5kKFtvcy5wYXRoLmpvaW4ocm9vdCwgZGlyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGRpciBpbiBkaXJzXSkKICAgICAgICAgICAgICAgIGZpbGVuYW1lcyA9IFtmIGZvciBmIGluIGZpbGVuYW1lcyBpZiBmLmVuZHN3aXRoKCcuZWdnLWluZm8nKV0KCiAgICAgICAgICAgIGlmIG5vdCBmaWxlbmFtZXM6CiAgICAgICAgICAgICAgICByYWlzZSBJbnN0YWxsYXRpb25FcnJvcigKICAgICAgICAgICAgICAgICAgICAnTm8gZmlsZXMvZGlyZWN0b3JpZXMgaW4gJXMgKGZyb20gJXMpJyAlIChiYXNlLCBmaWxlbmFtZSkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgYXNzZXJ0IGZpbGVuYW1lcywgXAogICAgICAgICAgICAgICAgIk5vIGZpbGVzL2RpcmVjdG9yaWVzIGluICVzIChmcm9tICVzKSIgJSAoYmFzZSwgZmlsZW5hbWUpCgogICAgICAgICAgICAjIGlmIHdlIGhhdmUgbW9yZSB0aGFuIG9uZSBtYXRjaCwgd2UgcGljayB0aGUgdG9wbGV2ZWwgb25lLiAgVGhpcwogICAgICAgICAgICAjIGNhbiBlYXNpbHkgYmUgdGhlIGNhc2UgaWYgdGhlcmUgaXMgYSBkaXN0IGZvbGRlciB3aGljaCBjb250YWlucwogICAgICAgICAgICAjIGFuIGV4dHJhY3RlZCB0YXJiYWxsIGZvciB0ZXN0aW5nIHB1cnBvc2VzLgogICAgICAgICAgICBpZiBsZW4oZmlsZW5hbWVzKSA+IDE6CiAgICAgICAgICAgICAgICBmaWxlbmFtZXMuc29ydCgKICAgICAgICAgICAgICAgICAgICBrZXk9bGFtYmRhIHg6IHguY291bnQob3MucGF0aC5zZXApICsKICAgICAgICAgICAgICAgICAgICAob3MucGF0aC5hbHRzZXAgYW5kIHguY291bnQob3MucGF0aC5hbHRzZXApIG9yIDApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHNlbGYuX2VnZ19pbmZvX3BhdGggPSBvcy5wYXRoLmpvaW4oYmFzZSwgZmlsZW5hbWVzWzBdKQogICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4oc2VsZi5fZWdnX2luZm9fcGF0aCwgZmlsZW5hbWUpCgogICAgZGVmIHBrZ19pbmZvKHNlbGYpOgogICAgICAgIHAgPSBGZWVkUGFyc2VyKCkKICAgICAgICBkYXRhID0gc2VsZi5lZ2dfaW5mb19kYXRhKCdQS0ctSU5GTycpCiAgICAgICAgaWYgbm90IGRhdGE6CiAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgJ05vIFBLRy1JTkZPIGZpbGUgZm91bmQgaW4gJXMnLAogICAgICAgICAgICAgICAgZGlzcGxheV9wYXRoKHNlbGYuZWdnX2luZm9fcGF0aCgnUEtHLUlORk8nKSksCiAgICAgICAgICAgICkKICAgICAgICBwLmZlZWQoZGF0YSBvciAnJykKICAgICAgICByZXR1cm4gcC5jbG9zZSgpCgogICAgX3JlcXVpcmVtZW50c19zZWN0aW9uX3JlID0gcmUuY29tcGlsZShyJ1xbKC4qPylcXScpCgogICAgQHByb3BlcnR5CiAgICBkZWYgaW5zdGFsbGVkX3ZlcnNpb24oc2VsZik6CiAgICAgICAgcmV0dXJuIGdldF9pbnN0YWxsZWRfdmVyc2lvbihzZWxmLm5hbWUpCgogICAgZGVmIGFzc2VydF9zb3VyY2VfbWF0Y2hlc192ZXJzaW9uKHNlbGYpOgogICAgICAgIGFzc2VydCBzZWxmLnNvdXJjZV9kaXIKICAgICAgICB2ZXJzaW9uID0gc2VsZi5wa2dfaW5mbygpWyd2ZXJzaW9uJ10KICAgICAgICBpZiBzZWxmLnJlcS5zcGVjaWZpZXIgYW5kIHZlcnNpb24gbm90IGluIHNlbGYucmVxLnNwZWNpZmllcjoKICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICAgICAnUmVxdWVzdGVkICVzLCBidXQgaW5zdGFsbGluZyB2ZXJzaW9uICVzJywKICAgICAgICAgICAgICAgIHNlbGYsCiAgICAgICAgICAgICAgICBzZWxmLmluc3RhbGxlZF92ZXJzaW9uLAogICAgICAgICAgICApCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKAogICAgICAgICAgICAgICAgJ1NvdXJjZSBpbiAlcyBoYXMgdmVyc2lvbiAlcywgd2hpY2ggc2F0aXNmaWVzIHJlcXVpcmVtZW50ICVzJywKICAgICAgICAgICAgICAgIGRpc3BsYXlfcGF0aChzZWxmLnNvdXJjZV9kaXIpLAogICAgICAgICAgICAgICAgdmVyc2lvbiwKICAgICAgICAgICAgICAgIHNlbGYsCiAgICAgICAgICAgICkKCiAgICBkZWYgdXBkYXRlX2VkaXRhYmxlKHNlbGYsIG9idGFpbj1UcnVlKToKICAgICAgICBpZiBub3Qgc2VsZi5saW5rOgogICAgICAgICAgICBsb2dnZXIuZGVidWcoCiAgICAgICAgICAgICAgICAiQ2Fubm90IHVwZGF0ZSByZXBvc2l0b3J5IGF0ICVzOyByZXBvc2l0b3J5IGxvY2F0aW9uIGlzICIKICAgICAgICAgICAgICAgICJ1bmtub3duIiwKICAgICAgICAgICAgICAgIHNlbGYuc291cmNlX2RpciwKICAgICAgICAgICAgKQogICAgICAgICAgICByZXR1cm4KICAgICAgICBhc3NlcnQgc2VsZi5lZGl0YWJsZQogICAgICAgIGFzc2VydCBzZWxmLnNvdXJjZV9kaXIKICAgICAgICBpZiBzZWxmLmxpbmsuc2NoZW1lID09ICdmaWxlJzoKICAgICAgICAgICAgIyBTdGF0aWMgcGF0aHMgZG9uJ3QgZ2V0IHVwZGF0ZWQKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgYXNzZXJ0ICcrJyBpbiBzZWxmLmxpbmsudXJsLCAiYmFkIHVybDogJXIiICUgc2VsZi5saW5rLnVybAogICAgICAgIGlmIG5vdCBzZWxmLnVwZGF0ZToKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgdmNfdHlwZSwgdXJsID0gc2VsZi5saW5rLnVybC5zcGxpdCgnKycsIDEpCiAgICAgICAgYmFja2VuZCA9IHZjcy5nZXRfYmFja2VuZCh2Y190eXBlKQogICAgICAgIGlmIGJhY2tlbmQ6CiAgICAgICAgICAgIHZjc19iYWNrZW5kID0gYmFja2VuZChzZWxmLmxpbmsudXJsKQogICAgICAgICAgICBpZiBvYnRhaW46CiAgICAgICAgICAgICAgICB2Y3NfYmFja2VuZC5vYnRhaW4oc2VsZi5zb3VyY2VfZGlyKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgdmNzX2JhY2tlbmQuZXhwb3J0KHNlbGYuc291cmNlX2RpcikKICAgICAgICBlbHNlOgogICAgICAgICAgICBhc3NlcnQgMCwgKAogICAgICAgICAgICAgICAgJ1VuZXhwZWN0ZWQgdmVyc2lvbiBjb250cm9sIHR5cGUgKGluICVzKTogJXMnCiAgICAgICAgICAgICAgICAlIChzZWxmLmxpbmssIHZjX3R5cGUpKQoKICAgIGRlZiB1bmluc3RhbGwoc2VsZiwgYXV0b19jb25maXJtPUZhbHNlKToKICAgICAgICAiIiIKICAgICAgICBVbmluc3RhbGwgdGhlIGRpc3RyaWJ1dGlvbiBjdXJyZW50bHkgc2F0aXNmeWluZyB0aGlzIHJlcXVpcmVtZW50LgoKICAgICAgICBQcm9tcHRzIGJlZm9yZSByZW1vdmluZyBvciBtb2RpZnlpbmcgZmlsZXMgdW5sZXNzCiAgICAgICAgYGBhdXRvX2NvbmZpcm1gYCBpcyBUcnVlLgoKICAgICAgICBSZWZ1c2VzIHRvIGRlbGV0ZSBvciBtb2RpZnkgZmlsZXMgb3V0c2lkZSBvZiBgYHN5cy5wcmVmaXhgYCAtCiAgICAgICAgdGh1cyB1bmluc3RhbGxhdGlvbiB3aXRoaW4gYSB2aXJ0dWFsIGVudmlyb25tZW50IGNhbiBvbmx5CiAgICAgICAgbW9kaWZ5IHRoYXQgdmlydHVhbCBlbnZpcm9ubWVudCwgZXZlbiBpZiB0aGUgdmlydHVhbGVudiBpcwogICAgICAgIGxpbmtlZCB0byBnbG9iYWwgc2l0ZS1wYWNrYWdlcy4KCiAgICAgICAgIiIiCiAgICAgICAgaWYgbm90IHNlbGYuY2hlY2tfaWZfZXhpc3RzKCk6CiAgICAgICAgICAgIHJhaXNlIFVuaW5zdGFsbGF0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAiQ2Fubm90IHVuaW5zdGFsbCByZXF1aXJlbWVudCAlcywgbm90IGluc3RhbGxlZCIgJSAoc2VsZi5uYW1lLCkKICAgICAgICAgICAgKQogICAgICAgIGRpc3QgPSBzZWxmLnNhdGlzZmllZF9ieSBvciBzZWxmLmNvbmZsaWN0c193aXRoCgogICAgICAgIGRpc3RfcGF0aCA9IG5vcm1hbGl6ZV9wYXRoKGRpc3QubG9jYXRpb24pCiAgICAgICAgaWYgbm90IGRpc3RfaXNfbG9jYWwoZGlzdCk6CiAgICAgICAgICAgIGxvZ2dlci5pbmZvKAogICAgICAgICAgICAgICAgIk5vdCB1bmluc3RhbGxpbmcgJXMgYXQgJXMsIG91dHNpZGUgZW52aXJvbm1lbnQgJXMiLAogICAgICAgICAgICAgICAgZGlzdC5rZXksCiAgICAgICAgICAgICAgICBkaXN0X3BhdGgsCiAgICAgICAgICAgICAgICBzeXMucHJlZml4LAogICAgICAgICAgICApCiAgICAgICAgICAgIHNlbGYubm90aGluZ190b191bmluc3RhbGwgPSBUcnVlCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBpZiBkaXN0X3BhdGggaW4gZ2V0X3N0ZGxpYigpOgogICAgICAgICAgICBsb2dnZXIuaW5mbygKICAgICAgICAgICAgICAgICJOb3QgdW5pbnN0YWxsaW5nICVzIGF0ICVzLCBhcyBpdCBpcyBpbiB0aGUgc3RhbmRhcmQgbGlicmFyeS4iLAogICAgICAgICAgICAgICAgZGlzdC5rZXksCiAgICAgICAgICAgICAgICBkaXN0X3BhdGgsCiAgICAgICAgICAgICkKICAgICAgICAgICAgc2VsZi5ub3RoaW5nX3RvX3VuaW5zdGFsbCA9IFRydWUKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIHBhdGhzX3RvX3JlbW92ZSA9IFVuaW5zdGFsbFBhdGhTZXQoZGlzdCkKICAgICAgICBkZXZlbG9wX2VnZ19saW5rID0gZWdnX2xpbmtfcGF0aChkaXN0KQogICAgICAgIGRldmVsb3BfZWdnX2xpbmtfZWdnX2luZm8gPSAnezB9LmVnZy1pbmZvJy5mb3JtYXQoCiAgICAgICAgICAgIHBrZ19yZXNvdXJjZXMudG9fZmlsZW5hbWUoZGlzdC5wcm9qZWN0X25hbWUpKQogICAgICAgIGVnZ19pbmZvX2V4aXN0cyA9IGRpc3QuZWdnX2luZm8gYW5kIG9zLnBhdGguZXhpc3RzKGRpc3QuZWdnX2luZm8pCiAgICAgICAgIyBTcGVjaWFsIGNhc2UgZm9yIGRpc3R1dGlscyBpbnN0YWxsZWQgcGFja2FnZQogICAgICAgIGRpc3R1dGlsc19lZ2dfaW5mbyA9IGdldGF0dHIoZGlzdC5fcHJvdmlkZXIsICdwYXRoJywgTm9uZSkKCiAgICAgICAgIyBVbmluc3RhbGwgY2FzZXMgb3JkZXIgZG8gbWF0dGVyIGFzIGluIHRoZSBjYXNlIG9mIDIgaW5zdGFsbHMgb2YgdGhlCiAgICAgICAgIyBzYW1lIHBhY2thZ2UsIHBpcCBuZWVkcyB0byB1bmluc3RhbGwgdGhlIGN1cnJlbnRseSBkZXRlY3RlZCB2ZXJzaW9uCiAgICAgICAgaWYgKGVnZ19pbmZvX2V4aXN0cyBhbmQgZGlzdC5lZ2dfaW5mby5lbmRzd2l0aCgnLmVnZy1pbmZvJykgYW5kCiAgICAgICAgICAgICAgICBub3QgZGlzdC5lZ2dfaW5mby5lbmRzd2l0aChkZXZlbG9wX2VnZ19saW5rX2VnZ19pbmZvKSk6CiAgICAgICAgICAgICMgaWYgZGlzdC5lZ2dfaW5mby5lbmRzd2l0aChkZXZlbG9wX2VnZ19saW5rX2VnZ19pbmZvKSwgd2UKICAgICAgICAgICAgIyBhcmUgaW4gZmFjdCBpbiB0aGUgZGV2ZWxvcF9lZ2dfbGluayBjYXNlCiAgICAgICAgICAgIHBhdGhzX3RvX3JlbW92ZS5hZGQoZGlzdC5lZ2dfaW5mbykKICAgICAgICAgICAgaWYgZGlzdC5oYXNfbWV0YWRhdGEoJ2luc3RhbGxlZC1maWxlcy50eHQnKToKICAgICAgICAgICAgICAgIGZvciBpbnN0YWxsZWRfZmlsZSBpbiBkaXN0LmdldF9tZXRhZGF0YSgKICAgICAgICAgICAgICAgICAgICAgICAgJ2luc3RhbGxlZC1maWxlcy50eHQnKS5zcGxpdGxpbmVzKCk6CiAgICAgICAgICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGgubm9ybXBhdGgoCiAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihkaXN0LmVnZ19pbmZvLCBpbnN0YWxsZWRfZmlsZSkKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgcGF0aHNfdG9fcmVtb3ZlLmFkZChwYXRoKQogICAgICAgICAgICAjIEZJWE1FOiBuZWVkIGEgdGVzdCBmb3IgdGhpcyBlbGlmIGJsb2NrCiAgICAgICAgICAgICMgb2NjdXJzIHdpdGggLS1zaW5nbGUtdmVyc2lvbi1leHRlcm5hbGx5LW1hbmFnZWQvLS1yZWNvcmQgb3V0c2lkZQogICAgICAgICAgICAjIG9mIHBpcAogICAgICAgICAgICBlbGlmIGRpc3QuaGFzX21ldGFkYXRhKCd0b3BfbGV2ZWwudHh0Jyk6CiAgICAgICAgICAgICAgICBpZiBkaXN0Lmhhc19tZXRhZGF0YSgnbmFtZXNwYWNlX3BhY2thZ2VzLnR4dCcpOgogICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZXMgPSBkaXN0LmdldF9tZXRhZGF0YSgnbmFtZXNwYWNlX3BhY2thZ2VzLnR4dCcpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZXMgPSBbXQogICAgICAgICAgICAgICAgZm9yIHRvcF9sZXZlbF9wa2cgaW4gWwogICAgICAgICAgICAgICAgICAgICAgICBwIGZvciBwCiAgICAgICAgICAgICAgICAgICAgICAgIGluIGRpc3QuZ2V0X21ldGFkYXRhKCd0b3BfbGV2ZWwudHh0Jykuc3BsaXRsaW5lcygpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHAgYW5kIHAgbm90IGluIG5hbWVzcGFjZXNdOgogICAgICAgICAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oZGlzdC5sb2NhdGlvbiwgdG9wX2xldmVsX3BrZykKICAgICAgICAgICAgICAgICAgICBwYXRoc190b19yZW1vdmUuYWRkKHBhdGgpCiAgICAgICAgICAgICAgICAgICAgcGF0aHNfdG9fcmVtb3ZlLmFkZChwYXRoICsgJy5weScpCiAgICAgICAgICAgICAgICAgICAgcGF0aHNfdG9fcmVtb3ZlLmFkZChwYXRoICsgJy5weWMnKQogICAgICAgICAgICAgICAgICAgIHBhdGhzX3RvX3JlbW92ZS5hZGQocGF0aCArICcucHlvJykKCiAgICAgICAgZWxpZiBkaXN0dXRpbHNfZWdnX2luZm86CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCiAgICAgICAgICAgICAgICAiVW5pbnN0YWxsaW5nIGEgZGlzdHV0aWxzIGluc3RhbGxlZCBwcm9qZWN0ICh7MH0pIGhhcyBiZWVuICIKICAgICAgICAgICAgICAgICJkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbi4gVGhpcyBpcyAiCiAgICAgICAgICAgICAgICAiZHVlIHRvIHRoZSBmYWN0IHRoYXQgdW5pbnN0YWxsaW5nIGEgZGlzdHV0aWxzIHByb2plY3Qgd2lsbCAiCiAgICAgICAgICAgICAgICAib25seSBwYXJ0aWFsbHkgdW5pbnN0YWxsIHRoZSBwcm9qZWN0LiIuZm9ybWF0KHNlbGYubmFtZSksCiAgICAgICAgICAgICAgICBSZW1vdmVkSW5QaXAxMFdhcm5pbmcsCiAgICAgICAgICAgICkKICAgICAgICAgICAgcGF0aHNfdG9fcmVtb3ZlLmFkZChkaXN0dXRpbHNfZWdnX2luZm8pCgogICAgICAgIGVsaWYgZGlzdC5sb2NhdGlvbi5lbmRzd2l0aCgnLmVnZycpOgogICAgICAgICAgICAjIHBhY2thZ2UgaW5zdGFsbGVkIGJ5IGVhc3lfaW5zdGFsbAogICAgICAgICAgICAjIFdlIGNhbm5vdCBtYXRjaCBvbiBkaXN0LmVnZ19uYW1lIGJlY2F1c2UgaXQgY2FuIHNsaWdodGx5IHZhcnkKICAgICAgICAgICAgIyBpLmUuIHNldHVwdG9vbHMtMC42YzExLXB5Mi42LmVnZyB2cyBzZXR1cHRvb2xzLTAuNnJjMTEtcHkyLjYuZWdnCiAgICAgICAgICAgIHBhdGhzX3RvX3JlbW92ZS5hZGQoZGlzdC5sb2NhdGlvbikKICAgICAgICAgICAgZWFzeV9pbnN0YWxsX2VnZyA9IG9zLnBhdGguc3BsaXQoZGlzdC5sb2NhdGlvbilbMV0KICAgICAgICAgICAgZWFzeV9pbnN0YWxsX3B0aCA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoZGlzdC5sb2NhdGlvbiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Vhc3ktaW5zdGFsbC5wdGgnKQogICAgICAgICAgICBwYXRoc190b19yZW1vdmUuYWRkX3B0aChlYXN5X2luc3RhbGxfcHRoLCAnLi8nICsgZWFzeV9pbnN0YWxsX2VnZykKCiAgICAgICAgZWxpZiBlZ2dfaW5mb19leGlzdHMgYW5kIGRpc3QuZWdnX2luZm8uZW5kc3dpdGgoJy5kaXN0LWluZm8nKToKICAgICAgICAgICAgZm9yIHBhdGggaW4gcGlwLndoZWVsLnVuaW5zdGFsbGF0aW9uX3BhdGhzKGRpc3QpOgogICAgICAgICAgICAgICAgcGF0aHNfdG9fcmVtb3ZlLmFkZChwYXRoKQoKICAgICAgICBlbGlmIGRldmVsb3BfZWdnX2xpbms6CiAgICAgICAgICAgICMgZGV2ZWxvcCBlZ2cKICAgICAgICAgICAgd2l0aCBvcGVuKGRldmVsb3BfZWdnX2xpbmssICdyJykgYXMgZmg6CiAgICAgICAgICAgICAgICBsaW5rX3BvaW50ZXIgPSBvcy5wYXRoLm5vcm1jYXNlKGZoLnJlYWRsaW5lKCkuc3RyaXAoKSkKICAgICAgICAgICAgYXNzZXJ0IChsaW5rX3BvaW50ZXIgPT0gZGlzdC5sb2NhdGlvbiksICgKICAgICAgICAgICAgICAgICdFZ2ctbGluayAlcyBkb2VzIG5vdCBtYXRjaCBpbnN0YWxsZWQgbG9jYXRpb24gb2YgJXMgJwogICAgICAgICAgICAgICAgJyhhdCAlcyknICUgKGxpbmtfcG9pbnRlciwgc2VsZi5uYW1lLCBkaXN0LmxvY2F0aW9uKQogICAgICAgICAgICApCiAgICAgICAgICAgIHBhdGhzX3RvX3JlbW92ZS5hZGQoZGV2ZWxvcF9lZ2dfbGluaykKICAgICAgICAgICAgZWFzeV9pbnN0YWxsX3B0aCA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoZGV2ZWxvcF9lZ2dfbGluayksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Vhc3ktaW5zdGFsbC5wdGgnKQogICAgICAgICAgICBwYXRoc190b19yZW1vdmUuYWRkX3B0aChlYXN5X2luc3RhbGxfcHRoLCBkaXN0LmxvY2F0aW9uKQoKICAgICAgICBlbHNlOgogICAgICAgICAgICBsb2dnZXIuZGVidWcoCiAgICAgICAgICAgICAgICAnTm90IHN1cmUgaG93IHRvIHVuaW5zdGFsbDogJXMgLSBDaGVjazogJXMnLAogICAgICAgICAgICAgICAgZGlzdCwgZGlzdC5sb2NhdGlvbikKCiAgICAgICAgIyBmaW5kIGRpc3R1dGlscyBzY3JpcHRzPSBzY3JpcHRzCiAgICAgICAgaWYgZGlzdC5oYXNfbWV0YWRhdGEoJ3NjcmlwdHMnKSBhbmQgZGlzdC5tZXRhZGF0YV9pc2Rpcignc2NyaXB0cycpOgogICAgICAgICAgICBmb3Igc2NyaXB0IGluIGRpc3QubWV0YWRhdGFfbGlzdGRpcignc2NyaXB0cycpOgogICAgICAgICAgICAgICAgaWYgZGlzdF9pbl91c2Vyc2l0ZShkaXN0KToKICAgICAgICAgICAgICAgICAgICBiaW5fZGlyID0gYmluX3VzZXIKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgYmluX2RpciA9IGJpbl9weQogICAgICAgICAgICAgICAgcGF0aHNfdG9fcmVtb3ZlLmFkZChvcy5wYXRoLmpvaW4oYmluX2Rpciwgc2NyaXB0KSkKICAgICAgICAgICAgICAgIGlmIFdJTkRPV1M6CiAgICAgICAgICAgICAgICAgICAgcGF0aHNfdG9fcmVtb3ZlLmFkZChvcy5wYXRoLmpvaW4oYmluX2Rpciwgc2NyaXB0KSArICcuYmF0JykKCiAgICAgICAgIyBmaW5kIGNvbnNvbGVfc2NyaXB0cwogICAgICAgIGlmIGRpc3QuaGFzX21ldGFkYXRhKCdlbnRyeV9wb2ludHMudHh0Jyk6CiAgICAgICAgICAgIGlmIHNpeC5QWTI6CiAgICAgICAgICAgICAgICBvcHRpb25zID0ge30KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIG9wdGlvbnMgPSB7ImRlbGltaXRlcnMiOiAoJz0nLCApfQogICAgICAgICAgICBjb25maWcgPSBjb25maWdwYXJzZXIuU2FmZUNvbmZpZ1BhcnNlcigqKm9wdGlvbnMpCiAgICAgICAgICAgIGNvbmZpZy5yZWFkZnAoCiAgICAgICAgICAgICAgICBGYWtlRmlsZShkaXN0LmdldF9tZXRhZGF0YV9saW5lcygnZW50cnlfcG9pbnRzLnR4dCcpKQogICAgICAgICAgICApCiAgICAgICAgICAgIGlmIGNvbmZpZy5oYXNfc2VjdGlvbignY29uc29sZV9zY3JpcHRzJyk6CiAgICAgICAgICAgICAgICBmb3IgbmFtZSwgdmFsdWUgaW4gY29uZmlnLml0ZW1zKCdjb25zb2xlX3NjcmlwdHMnKToKICAgICAgICAgICAgICAgICAgICBpZiBkaXN0X2luX3VzZXJzaXRlKGRpc3QpOgogICAgICAgICAgICAgICAgICAgICAgICBiaW5fZGlyID0gYmluX3VzZXIKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBiaW5fZGlyID0gYmluX3B5CiAgICAgICAgICAgICAgICAgICAgcGF0aHNfdG9fcmVtb3ZlLmFkZChvcy5wYXRoLmpvaW4oYmluX2RpciwgbmFtZSkpCiAgICAgICAgICAgICAgICAgICAgaWYgV0lORE9XUzoKICAgICAgICAgICAgICAgICAgICAgICAgcGF0aHNfdG9fcmVtb3ZlLmFkZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihiaW5fZGlyLCBuYW1lKSArICcuZXhlJwogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhzX3RvX3JlbW92ZS5hZGQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oYmluX2RpciwgbmFtZSkgKyAnLmV4ZS5tYW5pZmVzdCcKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICBwYXRoc190b19yZW1vdmUuYWRkKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKGJpbl9kaXIsIG5hbWUpICsgJy1zY3JpcHQucHknCiAgICAgICAgICAgICAgICAgICAgICAgICkKCiAgICAgICAgcGF0aHNfdG9fcmVtb3ZlLnJlbW92ZShhdXRvX2NvbmZpcm0pCiAgICAgICAgc2VsZi51bmluc3RhbGxlZCA9IHBhdGhzX3RvX3JlbW92ZQoKICAgIGRlZiByb2xsYmFja191bmluc3RhbGwoc2VsZik6CiAgICAgICAgaWYgc2VsZi51bmluc3RhbGxlZDoKICAgICAgICAgICAgc2VsZi51bmluc3RhbGxlZC5yb2xsYmFjaygpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbG9nZ2VyLmVycm9yKAogICAgICAgICAgICAgICAgIkNhbid0IHJvbGxiYWNrICVzLCBub3RoaW5nIHVuaW5zdGFsbGVkLiIsIHNlbGYubmFtZSwKICAgICAgICAgICAgKQoKICAgIGRlZiBjb21taXRfdW5pbnN0YWxsKHNlbGYpOgogICAgICAgIGlmIHNlbGYudW5pbnN0YWxsZWQ6CiAgICAgICAgICAgIHNlbGYudW5pbnN0YWxsZWQuY29tbWl0KCkKICAgICAgICBlbGlmIG5vdCBzZWxmLm5vdGhpbmdfdG9fdW5pbnN0YWxsOgogICAgICAgICAgICBsb2dnZXIuZXJyb3IoCiAgICAgICAgICAgICAgICAiQ2FuJ3QgY29tbWl0ICVzLCBub3RoaW5nIHVuaW5zdGFsbGVkLiIsIHNlbGYubmFtZSwKICAgICAgICAgICAgKQoKICAgIGRlZiBhcmNoaXZlKHNlbGYsIGJ1aWxkX2Rpcik6CiAgICAgICAgYXNzZXJ0IHNlbGYuc291cmNlX2RpcgogICAgICAgIGNyZWF0ZV9hcmNoaXZlID0gVHJ1ZQogICAgICAgIGFyY2hpdmVfbmFtZSA9ICclcy0lcy56aXAnICUgKHNlbGYubmFtZSwgc2VsZi5wa2dfaW5mbygpWyJ2ZXJzaW9uIl0pCiAgICAgICAgYXJjaGl2ZV9wYXRoID0gb3MucGF0aC5qb2luKGJ1aWxkX2RpciwgYXJjaGl2ZV9uYW1lKQogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGFyY2hpdmVfcGF0aCk6CiAgICAgICAgICAgIHJlc3BvbnNlID0gYXNrX3BhdGhfZXhpc3RzKAogICAgICAgICAgICAgICAgJ1RoZSBmaWxlICVzIGV4aXN0cy4gKGkpZ25vcmUsICh3KWlwZSwgKGIpYWNrdXAsIChhKWJvcnQgJyAlCiAgICAgICAgICAgICAgICBkaXNwbGF5X3BhdGgoYXJjaGl2ZV9wYXRoKSwgKCdpJywgJ3cnLCAnYicsICdhJykpCiAgICAgICAgICAgIGlmIHJlc3BvbnNlID09ICdpJzoKICAgICAgICAgICAgICAgIGNyZWF0ZV9hcmNoaXZlID0gRmFsc2UKICAgICAgICAgICAgZWxpZiByZXNwb25zZSA9PSAndyc6CiAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygnRGVsZXRpbmcgJXMnLCBkaXNwbGF5X3BhdGgoYXJjaGl2ZV9wYXRoKSkKICAgICAgICAgICAgICAgIG9zLnJlbW92ZShhcmNoaXZlX3BhdGgpCiAgICAgICAgICAgIGVsaWYgcmVzcG9uc2UgPT0gJ2InOgogICAgICAgICAgICAgICAgZGVzdF9maWxlID0gYmFja3VwX2RpcihhcmNoaXZlX3BhdGgpCiAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICAgICAnQmFja2luZyB1cCAlcyB0byAlcycsCiAgICAgICAgICAgICAgICAgICAgZGlzcGxheV9wYXRoKGFyY2hpdmVfcGF0aCksCiAgICAgICAgICAgICAgICAgICAgZGlzcGxheV9wYXRoKGRlc3RfZmlsZSksCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBzaHV0aWwubW92ZShhcmNoaXZlX3BhdGgsIGRlc3RfZmlsZSkKICAgICAgICAgICAgZWxpZiByZXNwb25zZSA9PSAnYSc6CiAgICAgICAgICAgICAgICBzeXMuZXhpdCgtMSkKICAgICAgICBpZiBjcmVhdGVfYXJjaGl2ZToKICAgICAgICAgICAgemlwID0gemlwZmlsZS5aaXBGaWxlKAogICAgICAgICAgICAgICAgYXJjaGl2ZV9wYXRoLCAndycsIHppcGZpbGUuWklQX0RFRkxBVEVELAogICAgICAgICAgICAgICAgYWxsb3daaXA2ND1UcnVlCiAgICAgICAgICAgICkKICAgICAgICAgICAgZGlyID0gb3MucGF0aC5ub3JtY2FzZShvcy5wYXRoLmFic3BhdGgoc2VsZi5zZXR1cF9weV9kaXIpKQogICAgICAgICAgICBmb3IgZGlycGF0aCwgZGlybmFtZXMsIGZpbGVuYW1lcyBpbiBvcy53YWxrKGRpcik6CiAgICAgICAgICAgICAgICBpZiAncGlwLWVnZy1pbmZvJyBpbiBkaXJuYW1lczoKICAgICAgICAgICAgICAgICAgICBkaXJuYW1lcy5yZW1vdmUoJ3BpcC1lZ2ctaW5mbycpCiAgICAgICAgICAgICAgICBmb3IgZGlybmFtZSBpbiBkaXJuYW1lczoKICAgICAgICAgICAgICAgICAgICBkaXJuYW1lID0gb3MucGF0aC5qb2luKGRpcnBhdGgsIGRpcm5hbWUpCiAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHNlbGYuX2NsZWFuX3ppcF9uYW1lKGRpcm5hbWUsIGRpcikKICAgICAgICAgICAgICAgICAgICB6aXBkaXIgPSB6aXBmaWxlLlppcEluZm8oc2VsZi5uYW1lICsgJy8nICsgbmFtZSArICcvJykKICAgICAgICAgICAgICAgICAgICB6aXBkaXIuZXh0ZXJuYWxfYXR0ciA9IDB4MUVEIDw8IDE2ICAjIDBvNzU1CiAgICAgICAgICAgICAgICAgICAgemlwLndyaXRlc3RyKHppcGRpciwgJycpCiAgICAgICAgICAgICAgICBmb3IgZmlsZW5hbWUgaW4gZmlsZW5hbWVzOgogICAgICAgICAgICAgICAgICAgIGlmIGZpbGVuYW1lID09IFBJUF9ERUxFVEVfTUFSS0VSX0ZJTEVOQU1FOgogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gb3MucGF0aC5qb2luKGRpcnBhdGgsIGZpbGVuYW1lKQogICAgICAgICAgICAgICAgICAgIG5hbWUgPSBzZWxmLl9jbGVhbl96aXBfbmFtZShmaWxlbmFtZSwgZGlyKQogICAgICAgICAgICAgICAgICAgIHppcC53cml0ZShmaWxlbmFtZSwgc2VsZi5uYW1lICsgJy8nICsgbmFtZSkKICAgICAgICAgICAgemlwLmNsb3NlKCkKICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ1NhdmVkICVzJywgZGlzcGxheV9wYXRoKGFyY2hpdmVfcGF0aCkpCgogICAgZGVmIF9jbGVhbl96aXBfbmFtZShzZWxmLCBuYW1lLCBwcmVmaXgpOgogICAgICAgIGFzc2VydCBuYW1lLnN0YXJ0c3dpdGgocHJlZml4ICsgb3MucGF0aC5zZXApLCAoCiAgICAgICAgICAgICJuYW1lICVyIGRvZXNuJ3Qgc3RhcnQgd2l0aCBwcmVmaXggJXIiICUgKG5hbWUsIHByZWZpeCkKICAgICAgICApCiAgICAgICAgbmFtZSA9IG5hbWVbbGVuKHByZWZpeCkgKyAxOl0KICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKG9zLnBhdGguc2VwLCAnLycpCiAgICAgICAgcmV0dXJuIG5hbWUKCiAgICBkZWYgbWF0Y2hfbWFya2VycyhzZWxmLCBleHRyYXNfcmVxdWVzdGVkPU5vbmUpOgogICAgICAgIGlmIG5vdCBleHRyYXNfcmVxdWVzdGVkOgogICAgICAgICAgICAjIFByb3ZpZGUgYW4gZXh0cmEgdG8gc2FmZWx5IGV2YWx1YXRlIHRoZSBtYXJrZXJzCiAgICAgICAgICAgICMgd2l0aG91dCBtYXRjaGluZyBhbnkgZXh0cmEKICAgICAgICAgICAgZXh0cmFzX3JlcXVlc3RlZCA9ICgnJywpCiAgICAgICAgaWYgc2VsZi5tYXJrZXJzIGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4gYW55KAogICAgICAgICAgICAgICAgc2VsZi5tYXJrZXJzLmV2YWx1YXRlKHsnZXh0cmEnOiBleHRyYX0pCiAgICAgICAgICAgICAgICBmb3IgZXh0cmEgaW4gZXh0cmFzX3JlcXVlc3RlZCkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBpbnN0YWxsKHNlbGYsIGluc3RhbGxfb3B0aW9ucywgZ2xvYmFsX29wdGlvbnM9W10sIHJvb3Q9Tm9uZSwKICAgICAgICAgICAgICAgIHByZWZpeD1Ob25lKToKICAgICAgICBpZiBzZWxmLmVkaXRhYmxlOgogICAgICAgICAgICBzZWxmLmluc3RhbGxfZWRpdGFibGUoCiAgICAgICAgICAgICAgICBpbnN0YWxsX29wdGlvbnMsIGdsb2JhbF9vcHRpb25zLCBwcmVmaXg9cHJlZml4KQogICAgICAgICAgICByZXR1cm4KICAgICAgICBpZiBzZWxmLmlzX3doZWVsOgogICAgICAgICAgICB2ZXJzaW9uID0gcGlwLndoZWVsLndoZWVsX3ZlcnNpb24oc2VsZi5zb3VyY2VfZGlyKQogICAgICAgICAgICBwaXAud2hlZWwuY2hlY2tfY29tcGF0aWJpbGl0eSh2ZXJzaW9uLCBzZWxmLm5hbWUpCgogICAgICAgICAgICBzZWxmLm1vdmVfd2hlZWxfZmlsZXMoc2VsZi5zb3VyY2VfZGlyLCByb290PXJvb3QsIHByZWZpeD1wcmVmaXgpCiAgICAgICAgICAgIHNlbGYuaW5zdGFsbF9zdWNjZWVkZWQgPSBUcnVlCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICAjIEV4dGVuZCB0aGUgbGlzdCBvZiBnbG9iYWwgYW5kIGluc3RhbGwgb3B0aW9ucyBwYXNzZWQgb24gdG8KICAgICAgICAjIHRoZSBzZXR1cC5weSBjYWxsIHdpdGggdGhlIG9uZXMgZnJvbSB0aGUgcmVxdWlyZW1lbnRzIGZpbGUuCiAgICAgICAgIyBPcHRpb25zIHNwZWNpZmllZCBpbiByZXF1aXJlbWVudHMgZmlsZSBvdmVycmlkZSB0aG9zZQogICAgICAgICMgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUsIHNpbmNlIHRoZSBsYXN0IG9wdGlvbiBnaXZlbgogICAgICAgICMgdG8gc2V0dXAucHkgaXMgdGhlIG9uZSB0aGF0IGlzIHVzZWQuCiAgICAgICAgZ2xvYmFsX29wdGlvbnMgKz0gc2VsZi5vcHRpb25zLmdldCgnZ2xvYmFsX29wdGlvbnMnLCBbXSkKICAgICAgICBpbnN0YWxsX29wdGlvbnMgKz0gc2VsZi5vcHRpb25zLmdldCgnaW5zdGFsbF9vcHRpb25zJywgW10pCgogICAgICAgIGlmIHNlbGYuaXNvbGF0ZWQ6CiAgICAgICAgICAgIGdsb2JhbF9vcHRpb25zID0gbGlzdChnbG9iYWxfb3B0aW9ucykgKyBbIi0tbm8tdXNlci1jZmciXQoKICAgICAgICB0ZW1wX2xvY2F0aW9uID0gdGVtcGZpbGUubWtkdGVtcCgnLXJlY29yZCcsICdwaXAtJykKICAgICAgICByZWNvcmRfZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4odGVtcF9sb2NhdGlvbiwgJ2luc3RhbGwtcmVjb3JkLnR4dCcpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBpbnN0YWxsX2FyZ3MgPSBzZWxmLmdldF9pbnN0YWxsX2FyZ3MoCiAgICAgICAgICAgICAgICBnbG9iYWxfb3B0aW9ucywgcmVjb3JkX2ZpbGVuYW1lLCByb290LCBwcmVmaXgpCiAgICAgICAgICAgIG1zZyA9ICdSdW5uaW5nIHNldHVwLnB5IGluc3RhbGwgZm9yICVzJyAlIChzZWxmLm5hbWUsKQogICAgICAgICAgICB3aXRoIG9wZW5fc3Bpbm5lcihtc2cpIGFzIHNwaW5uZXI6CiAgICAgICAgICAgICAgICB3aXRoIGluZGVudF9sb2coKToKICAgICAgICAgICAgICAgICAgICBjYWxsX3N1YnByb2Nlc3MoCiAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbGxfYXJncyArIGluc3RhbGxfb3B0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgY3dkPXNlbGYuc2V0dXBfcHlfZGlyLAogICAgICAgICAgICAgICAgICAgICAgICBzaG93X3N0ZG91dD1GYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgc3Bpbm5lcj1zcGlubmVyLAogICAgICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhyZWNvcmRfZmlsZW5hbWUpOgogICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdSZWNvcmQgZmlsZSAlcyBub3QgZm91bmQnLCByZWNvcmRfZmlsZW5hbWUpCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgc2VsZi5pbnN0YWxsX3N1Y2NlZWRlZCA9IFRydWUKICAgICAgICAgICAgaWYgc2VsZi5hc19lZ2c6CiAgICAgICAgICAgICAgICAjIHRoZXJlJ3Mgbm8gLS1hbHdheXMtdW56aXAgb3B0aW9uIHdlIGNhbiBwYXNzIHRvIGluc3RhbGwKICAgICAgICAgICAgICAgICMgY29tbWFuZCBzbyB3ZSB1bmFibGUgdG8gc2F2ZSB0aGUgaW5zdGFsbGVkLWZpbGVzLnR4dAogICAgICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICAgICBkZWYgcHJlcGVuZF9yb290KHBhdGgpOgogICAgICAgICAgICAgICAgaWYgcm9vdCBpcyBOb25lIG9yIG5vdCBvcy5wYXRoLmlzYWJzKHBhdGgpOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXRoCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBjaGFuZ2Vfcm9vdChyb290LCBwYXRoKQoKICAgICAgICAgICAgd2l0aCBvcGVuKHJlY29yZF9maWxlbmFtZSkgYXMgZjoKICAgICAgICAgICAgICAgIGZvciBsaW5lIGluIGY6CiAgICAgICAgICAgICAgICAgICAgZGlyZWN0b3J5ID0gb3MucGF0aC5kaXJuYW1lKGxpbmUpCiAgICAgICAgICAgICAgICAgICAgaWYgZGlyZWN0b3J5LmVuZHN3aXRoKCcuZWdnLWluZm8nKToKICAgICAgICAgICAgICAgICAgICAgICAgZWdnX2luZm9fZGlyID0gcHJlcGVuZF9yb290KGRpcmVjdG9yeSkKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICAgICAgICAgICAgICdDb3VsZCBub3QgZmluZCAuZWdnLWluZm8gZGlyZWN0b3J5IGluIGluc3RhbGwgcmVjb3JkJwogICAgICAgICAgICAgICAgICAgICAgICAnIGZvciAlcycsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYsCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICMgRklYTUU6IHB1dCB0aGUgcmVjb3JkIHNvbWV3aGVyZQogICAgICAgICAgICAgICAgICAgICMgRklYTUU6IHNob3VsZCB0aGlzIGJlIGFuIGVycm9yPwogICAgICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICBuZXdfbGluZXMgPSBbXQogICAgICAgICAgICB3aXRoIG9wZW4ocmVjb3JkX2ZpbGVuYW1lKSBhcyBmOgogICAgICAgICAgICAgICAgZm9yIGxpbmUgaW4gZjoKICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IGxpbmUuc3RyaXAoKQogICAgICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZmlsZW5hbWUpOgogICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSArPSBvcy5wYXRoLnNlcAogICAgICAgICAgICAgICAgICAgIG5ld19saW5lcy5hcHBlbmQoCiAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGgucmVscGF0aCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXBlbmRfcm9vdChmaWxlbmFtZSksIGVnZ19pbmZvX2RpcikKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIGluc3RfZmlsZXNfcGF0aCA9IG9zLnBhdGguam9pbihlZ2dfaW5mb19kaXIsICdpbnN0YWxsZWQtZmlsZXMudHh0JykKICAgICAgICAgICAgd2l0aCBvcGVuKGluc3RfZmlsZXNfcGF0aCwgJ3cnKSBhcyBmOgogICAgICAgICAgICAgICAgZi53cml0ZSgnXG4nLmpvaW4obmV3X2xpbmVzKSArICdcbicpCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMocmVjb3JkX2ZpbGVuYW1lKToKICAgICAgICAgICAgICAgIG9zLnJlbW92ZShyZWNvcmRfZmlsZW5hbWUpCiAgICAgICAgICAgIHJtdHJlZSh0ZW1wX2xvY2F0aW9uKQoKICAgIGRlZiBlbnN1cmVfaGFzX3NvdXJjZV9kaXIoc2VsZiwgcGFyZW50X2Rpcik6CiAgICAgICAgIiIiRW5zdXJlIHRoYXQgYSBzb3VyY2VfZGlyIGlzIHNldC4KCiAgICAgICAgVGhpcyB3aWxsIGNyZWF0ZSBhIHRlbXBvcmFyeSBidWlsZCBkaXIgaWYgdGhlIG5hbWUgb2YgdGhlIHJlcXVpcmVtZW50CiAgICAgICAgaXNuJ3Qga25vd24geWV0LgoKICAgICAgICA6cGFyYW0gcGFyZW50X2RpcjogVGhlIGlkZWFsIHBpcCBwYXJlbnRfZGlyIGZvciB0aGUgc291cmNlX2Rpci4KICAgICAgICAgICAgR2VuZXJhbGx5IHNyY19kaXIgZm9yIGVkaXRhYmxlcyBhbmQgYnVpbGRfZGlyIGZvciBzZGlzdHMuCiAgICAgICAgOnJldHVybjogc2VsZi5zb3VyY2VfZGlyCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5zb3VyY2VfZGlyIGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYuc291cmNlX2RpciA9IHNlbGYuYnVpbGRfbG9jYXRpb24ocGFyZW50X2RpcikKICAgICAgICByZXR1cm4gc2VsZi5zb3VyY2VfZGlyCgogICAgZGVmIGdldF9pbnN0YWxsX2FyZ3Moc2VsZiwgZ2xvYmFsX29wdGlvbnMsIHJlY29yZF9maWxlbmFtZSwgcm9vdCwgcHJlZml4KToKICAgICAgICBpbnN0YWxsX2FyZ3MgPSBbc3lzLmV4ZWN1dGFibGUsICItdSJdCiAgICAgICAgaW5zdGFsbF9hcmdzLmFwcGVuZCgnLWMnKQogICAgICAgIGluc3RhbGxfYXJncy5hcHBlbmQoU0VUVVBUT09MU19TSElNICUgc2VsZi5zZXR1cF9weSkKICAgICAgICBpbnN0YWxsX2FyZ3MgKz0gbGlzdChnbG9iYWxfb3B0aW9ucykgKyBcCiAgICAgICAgICAgIFsnaW5zdGFsbCcsICctLXJlY29yZCcsIHJlY29yZF9maWxlbmFtZV0KCiAgICAgICAgaWYgbm90IHNlbGYuYXNfZWdnOgogICAgICAgICAgICBpbnN0YWxsX2FyZ3MgKz0gWyctLXNpbmdsZS12ZXJzaW9uLWV4dGVybmFsbHktbWFuYWdlZCddCgogICAgICAgIGlmIHJvb3QgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGluc3RhbGxfYXJncyArPSBbJy0tcm9vdCcsIHJvb3RdCiAgICAgICAgaWYgcHJlZml4IGlzIG5vdCBOb25lOgogICAgICAgICAgICBpbnN0YWxsX2FyZ3MgKz0gWyctLXByZWZpeCcsIHByZWZpeF0KCiAgICAgICAgaWYgc2VsZi5weWNvbXBpbGU6CiAgICAgICAgICAgIGluc3RhbGxfYXJncyArPSBbIi0tY29tcGlsZSJdCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaW5zdGFsbF9hcmdzICs9IFsiLS1uby1jb21waWxlIl0KCiAgICAgICAgaWYgcnVubmluZ191bmRlcl92aXJ0dWFsZW52KCk6CiAgICAgICAgICAgIHB5X3Zlcl9zdHIgPSAncHl0aG9uJyArIHN5c2NvbmZpZy5nZXRfcHl0aG9uX3ZlcnNpb24oKQogICAgICAgICAgICBpbnN0YWxsX2FyZ3MgKz0gWyctLWluc3RhbGwtaGVhZGVycycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKHN5cy5wcmVmaXgsICdpbmNsdWRlJywgJ3NpdGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBweV92ZXJfc3RyLCBzZWxmLm5hbWUpXQoKICAgICAgICByZXR1cm4gaW5zdGFsbF9hcmdzCgogICAgZGVmIHJlbW92ZV90ZW1wb3Jhcnlfc291cmNlKHNlbGYpOgogICAgICAgICIiIlJlbW92ZSB0aGUgc291cmNlIGZpbGVzIGZyb20gdGhpcyByZXF1aXJlbWVudCwgaWYgdGhleSBhcmUgbWFya2VkCiAgICAgICAgZm9yIGRlbGV0aW9uIiIiCiAgICAgICAgaWYgc2VsZi5zb3VyY2VfZGlyIGFuZCBvcy5wYXRoLmV4aXN0cygKICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihzZWxmLnNvdXJjZV9kaXIsIFBJUF9ERUxFVEVfTUFSS0VSX0ZJTEVOQU1FKSk6CiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnUmVtb3Zpbmcgc291cmNlIGluICVzJywgc2VsZi5zb3VyY2VfZGlyKQogICAgICAgICAgICBybXRyZWUoc2VsZi5zb3VyY2VfZGlyKQogICAgICAgIHNlbGYuc291cmNlX2RpciA9IE5vbmUKICAgICAgICBpZiBzZWxmLl90ZW1wX2J1aWxkX2RpciBhbmQgb3MucGF0aC5leGlzdHMoc2VsZi5fdGVtcF9idWlsZF9kaXIpOgogICAgICAgICAgICBybXRyZWUoc2VsZi5fdGVtcF9idWlsZF9kaXIpCiAgICAgICAgc2VsZi5fdGVtcF9idWlsZF9kaXIgPSBOb25lCgogICAgZGVmIGluc3RhbGxfZWRpdGFibGUoc2VsZiwgaW5zdGFsbF9vcHRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsX29wdGlvbnM9KCksIHByZWZpeD1Ob25lKToKICAgICAgICBsb2dnZXIuaW5mbygnUnVubmluZyBzZXR1cC5weSBkZXZlbG9wIGZvciAlcycsIHNlbGYubmFtZSkKCiAgICAgICAgaWYgc2VsZi5pc29sYXRlZDoKICAgICAgICAgICAgZ2xvYmFsX29wdGlvbnMgPSBsaXN0KGdsb2JhbF9vcHRpb25zKSArIFsiLS1uby11c2VyLWNmZyJdCgogICAgICAgIGlmIHByZWZpeDoKICAgICAgICAgICAgcHJlZml4X3BhcmFtID0gWyctLXByZWZpeD17MH0nLmZvcm1hdChwcmVmaXgpXQogICAgICAgICAgICBpbnN0YWxsX29wdGlvbnMgPSBsaXN0KGluc3RhbGxfb3B0aW9ucykgKyBwcmVmaXhfcGFyYW0KCiAgICAgICAgd2l0aCBpbmRlbnRfbG9nKCk6CiAgICAgICAgICAgICMgRklYTUU6IHNob3VsZCB3ZSBkbyAtLWluc3RhbGwtaGVhZGVycyBoZXJlIHRvbz8KICAgICAgICAgICAgY2FsbF9zdWJwcm9jZXNzKAogICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgIHN5cy5leGVjdXRhYmxlLAogICAgICAgICAgICAgICAgICAgICctYycsCiAgICAgICAgICAgICAgICAgICAgU0VUVVBUT09MU19TSElNICUgc2VsZi5zZXR1cF9weQogICAgICAgICAgICAgICAgXSArCiAgICAgICAgICAgICAgICBsaXN0KGdsb2JhbF9vcHRpb25zKSArCiAgICAgICAgICAgICAgICBbJ2RldmVsb3AnLCAnLS1uby1kZXBzJ10gKwogICAgICAgICAgICAgICAgbGlzdChpbnN0YWxsX29wdGlvbnMpLAoKICAgICAgICAgICAgICAgIGN3ZD1zZWxmLnNldHVwX3B5X2RpciwKICAgICAgICAgICAgICAgIHNob3dfc3Rkb3V0PUZhbHNlKQoKICAgICAgICBzZWxmLmluc3RhbGxfc3VjY2VlZGVkID0gVHJ1ZQoKICAgIGRlZiBjaGVja19pZl9leGlzdHMoc2VsZik6CiAgICAgICAgIiIiRmluZCBhbiBpbnN0YWxsZWQgZGlzdHJpYnV0aW9uIHRoYXQgc2F0aXNmaWVzIG9yIGNvbmZsaWN0cwogICAgICAgIHdpdGggdGhpcyByZXF1aXJlbWVudCwgYW5kIHNldCBzZWxmLnNhdGlzZmllZF9ieSBvcgogICAgICAgIHNlbGYuY29uZmxpY3RzX3dpdGggYXBwcm9wcmlhdGVseS4KICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLnJlcSBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICB0cnk6CiAgICAgICAgICAgICMgZ2V0X2Rpc3RyaWJ1dGlvbigpIHdpbGwgcmVzb2x2ZSB0aGUgZW50aXJlIGxpc3Qgb2YgcmVxdWlyZW1lbnRzCiAgICAgICAgICAgICMgYW55d2F5LCBhbmQgd2UndmUgYWxyZWFkeSBkZXRlcm1pbmVkIHRoYXQgd2UgbmVlZCB0aGUgcmVxdWlyZW1lbnQKICAgICAgICAgICAgIyBpbiBxdWVzdGlvbiwgc28gc3RyaXAgdGhlIG1hcmtlciBzbyB0aGF0IHdlIGRvbid0IHRyeSB0bwogICAgICAgICAgICAjIGV2YWx1YXRlIGl0LgogICAgICAgICAgICBub19tYXJrZXIgPSBSZXF1aXJlbWVudChzdHIoc2VsZi5yZXEpKQogICAgICAgICAgICBub19tYXJrZXIubWFya2VyID0gTm9uZQogICAgICAgICAgICBzZWxmLnNhdGlzZmllZF9ieSA9IHBrZ19yZXNvdXJjZXMuZ2V0X2Rpc3RyaWJ1dGlvbihzdHIobm9fbWFya2VyKSkKICAgICAgICAgICAgaWYgc2VsZi5lZGl0YWJsZSBhbmQgc2VsZi5zYXRpc2ZpZWRfYnk6CiAgICAgICAgICAgICAgICBzZWxmLmNvbmZsaWN0c193aXRoID0gc2VsZi5zYXRpc2ZpZWRfYnkKICAgICAgICAgICAgICAgICMgd2hlbiBpbnN0YWxsaW5nIGVkaXRhYmxlcywgbm90aGluZyBwcmUtZXhpc3Rpbmcgc2hvdWxkIGV2ZXIKICAgICAgICAgICAgICAgICMgc2F0aXNmeQogICAgICAgICAgICAgICAgc2VsZi5zYXRpc2ZpZWRfYnkgPSBOb25lCiAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIGV4Y2VwdCBwa2dfcmVzb3VyY2VzLkRpc3RyaWJ1dGlvbk5vdEZvdW5kOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICBleGNlcHQgcGtnX3Jlc291cmNlcy5WZXJzaW9uQ29uZmxpY3Q6CiAgICAgICAgICAgIGV4aXN0aW5nX2Rpc3QgPSBwa2dfcmVzb3VyY2VzLmdldF9kaXN0cmlidXRpb24oCiAgICAgICAgICAgICAgICBzZWxmLnJlcS5uYW1lCiAgICAgICAgICAgICkKICAgICAgICAgICAgaWYgc2VsZi51c2VfdXNlcl9zaXRlOgogICAgICAgICAgICAgICAgaWYgZGlzdF9pbl91c2Vyc2l0ZShleGlzdGluZ19kaXN0KToKICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbmZsaWN0c193aXRoID0gZXhpc3RpbmdfZGlzdAogICAgICAgICAgICAgICAgZWxpZiAocnVubmluZ191bmRlcl92aXJ0dWFsZW52KCkgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RfaW5fc2l0ZV9wYWNrYWdlcyhleGlzdGluZ19kaXN0KSk6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgSW5zdGFsbGF0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgICJXaWxsIG5vdCBpbnN0YWxsIHRvIHRoZSB1c2VyIHNpdGUgYmVjYXVzZSBpdCB3aWxsICIKICAgICAgICAgICAgICAgICAgICAgICAgImxhY2sgc3lzLnBhdGggcHJlY2VkZW5jZSB0byAlcyBpbiAlcyIgJQogICAgICAgICAgICAgICAgICAgICAgICAoZXhpc3RpbmdfZGlzdC5wcm9qZWN0X25hbWUsIGV4aXN0aW5nX2Rpc3QubG9jYXRpb24pCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi5jb25mbGljdHNfd2l0aCA9IGV4aXN0aW5nX2Rpc3QKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX3doZWVsKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLmxpbmsgYW5kIHNlbGYubGluay5pc193aGVlbAoKICAgIGRlZiBtb3ZlX3doZWVsX2ZpbGVzKHNlbGYsIHdoZWVsZGlyLCByb290PU5vbmUsIHByZWZpeD1Ob25lKToKICAgICAgICBtb3ZlX3doZWVsX2ZpbGVzKAogICAgICAgICAgICBzZWxmLm5hbWUsIHNlbGYucmVxLCB3aGVlbGRpciwKICAgICAgICAgICAgdXNlcj1zZWxmLnVzZV91c2VyX3NpdGUsCiAgICAgICAgICAgIGhvbWU9c2VsZi50YXJnZXRfZGlyLAogICAgICAgICAgICByb290PXJvb3QsCiAgICAgICAgICAgIHByZWZpeD1wcmVmaXgsCiAgICAgICAgICAgIHB5Y29tcGlsZT1zZWxmLnB5Y29tcGlsZSwKICAgICAgICAgICAgaXNvbGF0ZWQ9c2VsZi5pc29sYXRlZCwKICAgICAgICApCgogICAgZGVmIGdldF9kaXN0KHNlbGYpOgogICAgICAgICIiIlJldHVybiBhIHBrZ19yZXNvdXJjZXMuRGlzdHJpYnV0aW9uIGJ1aWx0IGZyb20gc2VsZi5lZ2dfaW5mb19wYXRoIiIiCiAgICAgICAgZWdnX2luZm8gPSBzZWxmLmVnZ19pbmZvX3BhdGgoJycpLnJzdHJpcCgnLycpCiAgICAgICAgYmFzZV9kaXIgPSBvcy5wYXRoLmRpcm5hbWUoZWdnX2luZm8pCiAgICAgICAgbWV0YWRhdGEgPSBwa2dfcmVzb3VyY2VzLlBhdGhNZXRhZGF0YShiYXNlX2RpciwgZWdnX2luZm8pCiAgICAgICAgZGlzdF9uYW1lID0gb3MucGF0aC5zcGxpdGV4dChvcy5wYXRoLmJhc2VuYW1lKGVnZ19pbmZvKSlbMF0KICAgICAgICByZXR1cm4gcGtnX3Jlc291cmNlcy5EaXN0cmlidXRpb24oCiAgICAgICAgICAgIG9zLnBhdGguZGlybmFtZShlZ2dfaW5mbyksCiAgICAgICAgICAgIHByb2plY3RfbmFtZT1kaXN0X25hbWUsCiAgICAgICAgICAgIG1ldGFkYXRhPW1ldGFkYXRhKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGhhc19oYXNoX29wdGlvbnMoc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIHdoZXRoZXIgYW55IGtub3duLWdvb2QgaGFzaGVzIGFyZSBzcGVjaWZpZWQgYXMgb3B0aW9ucy4KCiAgICAgICAgVGhlc2UgYWN0aXZhdGUgLS1yZXF1aXJlLWhhc2hlcyBtb2RlOyBoYXNoZXMgc3BlY2lmaWVkIGFzIHBhcnQgb2YgYQogICAgICAgIFVSTCBkbyBub3QuCgogICAgICAgICIiIgogICAgICAgIHJldHVybiBib29sKHNlbGYub3B0aW9ucy5nZXQoJ2hhc2hlcycsIHt9KSkKCiAgICBkZWYgaGFzaGVzKHNlbGYsIHRydXN0X2ludGVybmV0PVRydWUpOgogICAgICAgICIiIlJldHVybiBhIGhhc2gtY29tcGFyZXIgdGhhdCBjb25zaWRlcnMgbXkgb3B0aW9uLSBhbmQgVVJMLWJhc2VkCiAgICAgICAgaGFzaGVzIHRvIGJlIGtub3duLWdvb2QuCgogICAgICAgIEhhc2hlcyBpbiBVUkxzLS1vbmVzIGVtYmVkZGVkIGluIHRoZSByZXF1aXJlbWVudHMgZmlsZSwgbm90IG9uZXMKICAgICAgICBkb3dubG9hZGVkIGZyb20gYW4gaW5kZXggc2VydmVyLS1hcmUgYWxtb3N0IHBlZXJzIHdpdGggb25lcyBmcm9tCiAgICAgICAgZmxhZ3MuIFRoZXkgc2F0aXNmeSAtLXJlcXVpcmUtaGFzaGVzICh3aGV0aGVyIGl0IHdhcyBpbXBsaWNpdGx5IG9yCiAgICAgICAgZXhwbGljaXRseSBhY3RpdmF0ZWQpIGJ1dCBkbyBub3QgYWN0aXZhdGUgaXQuIG1kNSBhbmQgc2hhMjI0IGFyZSBub3QKICAgICAgICBhbGxvd2VkIGluIGZsYWdzLCB3aGljaCBzaG91bGQgbnVkZ2UgcGVvcGxlIHRvd2FyZCBnb29kIGFsZ29zLiBXZQogICAgICAgIGFsd2F5cyBPUiBhbGwgaGFzaGVzIHRvZ2V0aGVyLCBldmVuIG9uZXMgZnJvbSBVUkxzLgoKICAgICAgICA6cGFyYW0gdHJ1c3RfaW50ZXJuZXQ6IFdoZXRoZXIgdG8gdHJ1c3QgVVJMLWJhc2VkICgjbWQ1PS4uLikgaGFzaGVzCiAgICAgICAgICAgIGRvd25sb2FkZWQgZnJvbSB0aGUgaW50ZXJuZXQsIGFzIGJ5IHBvcHVsYXRlX2xpbmsoKQoKICAgICAgICAiIiIKICAgICAgICBnb29kX2hhc2hlcyA9IHNlbGYub3B0aW9ucy5nZXQoJ2hhc2hlcycsIHt9KS5jb3B5KCkKICAgICAgICBsaW5rID0gc2VsZi5saW5rIGlmIHRydXN0X2ludGVybmV0IGVsc2Ugc2VsZi5vcmlnaW5hbF9saW5rCiAgICAgICAgaWYgbGluayBhbmQgbGluay5oYXNoOgogICAgICAgICAgICBnb29kX2hhc2hlcy5zZXRkZWZhdWx0KGxpbmsuaGFzaF9uYW1lLCBbXSkuYXBwZW5kKGxpbmsuaGFzaCkKICAgICAgICByZXR1cm4gSGFzaGVzKGdvb2RfaGFzaGVzKQoKCmRlZiBfc3RyaXBfcG9zdGZpeChyZXEpOgogICAgIiIiCiAgICAgICAgU3RyaXAgcmVxIHBvc3RmaXggKCAtZGV2LCAwLjIsIGV0YyApCiAgICAiIiIKICAgICMgRklYTUU6IHVzZSBwYWNrYWdlX3RvX3JlcXVpcmVtZW50PwogICAgbWF0Y2ggPSByZS5zZWFyY2gocideKC4qPykoPzotZGV2fC1cZC4qKSQnLCByZXEpCiAgICBpZiBtYXRjaDoKICAgICAgICAjIFN0cmlwIG9mZiAtZGV2LCAtMC4yLCBldGMuCiAgICAgICAgcmVxID0gbWF0Y2guZ3JvdXAoMSkKICAgIHJldHVybiByZXEKCgpkZWYgcGFyc2VfZWRpdGFibGUoZWRpdGFibGVfcmVxLCBkZWZhdWx0X3Zjcz1Ob25lKToKICAgICIiIlBhcnNlcyBhbiBlZGl0YWJsZSByZXF1aXJlbWVudCBpbnRvOgogICAgICAgIC0gYSByZXF1aXJlbWVudCBuYW1lCiAgICAgICAgLSBhbiBVUkwKICAgICAgICAtIGV4dHJhcwogICAgICAgIC0gZWRpdGFibGUgb3B0aW9ucwogICAgQWNjZXB0ZWQgcmVxdWlyZW1lbnRzOgogICAgICAgIHN2bitodHRwOi8vYmxhaGJsYWhAcmV2I2VnZz1Gb29iYXJbYmF6XSZzdWJkaXJlY3Rvcnk9dmVyc2lvbl9zdWJkaXIKICAgICAgICAuW3NvbWVfZXh0cmFdCiAgICAiIiIKCiAgICBmcm9tIHBpcC5pbmRleCBpbXBvcnQgTGluawoKICAgIHVybCA9IGVkaXRhYmxlX3JlcQogICAgZXh0cmFzID0gTm9uZQoKICAgICMgSWYgYSBmaWxlIHBhdGggaXMgc3BlY2lmaWVkIHdpdGggZXh0cmFzLCBzdHJpcCBvZmYgdGhlIGV4dHJhcy4KICAgIG0gPSByZS5tYXRjaChyJ14oLispKFxbW15cXV0rXF0pJCcsIHVybCkKICAgIGlmIG06CiAgICAgICAgdXJsX25vX2V4dHJhcyA9IG0uZ3JvdXAoMSkKICAgICAgICBleHRyYXMgPSBtLmdyb3VwKDIpCiAgICBlbHNlOgogICAgICAgIHVybF9ub19leHRyYXMgPSB1cmwKCiAgICBpZiBvcy5wYXRoLmlzZGlyKHVybF9ub19leHRyYXMpOgogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhvcy5wYXRoLmpvaW4odXJsX25vX2V4dHJhcywgJ3NldHVwLnB5JykpOgogICAgICAgICAgICByYWlzZSBJbnN0YWxsYXRpb25FcnJvcigKICAgICAgICAgICAgICAgICJEaXJlY3RvcnkgJXIgaXMgbm90IGluc3RhbGxhYmxlLiBGaWxlICdzZXR1cC5weScgbm90IGZvdW5kLiIgJQogICAgICAgICAgICAgICAgdXJsX25vX2V4dHJhcwogICAgICAgICAgICApCiAgICAgICAgIyBUcmVhdGluZyBpdCBhcyBjb2RlIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBjaGVja2VkIG91dAogICAgICAgIHVybF9ub19leHRyYXMgPSBwYXRoX3RvX3VybCh1cmxfbm9fZXh0cmFzKQoKICAgIGlmIHVybF9ub19leHRyYXMubG93ZXIoKS5zdGFydHN3aXRoKCdmaWxlOicpOgogICAgICAgIHBhY2thZ2VfbmFtZSA9IExpbmsodXJsX25vX2V4dHJhcykuZWdnX2ZyYWdtZW50CiAgICAgICAgaWYgZXh0cmFzOgogICAgICAgICAgICByZXR1cm4gKAogICAgICAgICAgICAgICAgcGFja2FnZV9uYW1lLAogICAgICAgICAgICAgICAgdXJsX25vX2V4dHJhcywKICAgICAgICAgICAgICAgIFJlcXVpcmVtZW50KCJwbGFjZWhvbGRlciIgKyBleHRyYXMubG93ZXIoKSkuZXh0cmFzLAogICAgICAgICAgICApCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHBhY2thZ2VfbmFtZSwgdXJsX25vX2V4dHJhcywgTm9uZQoKICAgIGZvciB2ZXJzaW9uX2NvbnRyb2wgaW4gdmNzOgogICAgICAgIGlmIHVybC5sb3dlcigpLnN0YXJ0c3dpdGgoJyVzOicgJSB2ZXJzaW9uX2NvbnRyb2wpOgogICAgICAgICAgICB1cmwgPSAnJXMrJXMnICUgKHZlcnNpb25fY29udHJvbCwgdXJsKQogICAgICAgICAgICBicmVhawoKICAgIGlmICcrJyBub3QgaW4gdXJsOgogICAgICAgIGlmIGRlZmF1bHRfdmNzOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKAogICAgICAgICAgICAgICAgIi0tZGVmYXVsdC12Y3MgaGFzIGJlZW4gZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluICIKICAgICAgICAgICAgICAgICJ0aGUgZnV0dXJlLiIsCiAgICAgICAgICAgICAgICBSZW1vdmVkSW5QaXAxMFdhcm5pbmcsCiAgICAgICAgICAgICkKICAgICAgICAgICAgdXJsID0gZGVmYXVsdF92Y3MgKyAnKycgKyB1cmwKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBJbnN0YWxsYXRpb25FcnJvcigKICAgICAgICAgICAgICAgICclcyBzaG91bGQgZWl0aGVyIGJlIGEgcGF0aCB0byBhIGxvY2FsIHByb2plY3Qgb3IgYSBWQ1MgdXJsICcKICAgICAgICAgICAgICAgICdiZWdpbm5pbmcgd2l0aCBzdm4rLCBnaXQrLCBoZyssIG9yIGJ6cisnICUKICAgICAgICAgICAgICAgIGVkaXRhYmxlX3JlcQogICAgICAgICAgICApCgogICAgdmNfdHlwZSA9IHVybC5zcGxpdCgnKycsIDEpWzBdLmxvd2VyKCkKCiAgICBpZiBub3QgdmNzLmdldF9iYWNrZW5kKHZjX3R5cGUpOgogICAgICAgIGVycm9yX21lc3NhZ2UgPSAnRm9yIC0tZWRpdGFibGU9JXMgb25seSAnICUgZWRpdGFibGVfcmVxICsgXAogICAgICAgICAgICAnLCAnLmpvaW4oW2JhY2tlbmQubmFtZSArICcrVVJMJyBmb3IgYmFja2VuZCBpbiB2Y3MuYmFja2VuZHNdKSArIFwKICAgICAgICAgICAgJyBpcyBjdXJyZW50bHkgc3VwcG9ydGVkJwogICAgICAgIHJhaXNlIEluc3RhbGxhdGlvbkVycm9yKGVycm9yX21lc3NhZ2UpCgogICAgcGFja2FnZV9uYW1lID0gTGluayh1cmwpLmVnZ19mcmFnbWVudAogICAgaWYgbm90IHBhY2thZ2VfbmFtZToKICAgICAgICByYWlzZSBJbnN0YWxsYXRpb25FcnJvcigKICAgICAgICAgICAgIkNvdWxkIG5vdCBkZXRlY3QgcmVxdWlyZW1lbnQgbmFtZSwgcGxlYXNlIHNwZWNpZnkgb25lIHdpdGggI2VnZz0iCiAgICAgICAgKQogICAgaWYgbm90IHBhY2thZ2VfbmFtZToKICAgICAgICByYWlzZSBJbnN0YWxsYXRpb25FcnJvcigKICAgICAgICAgICAgJy0tZWRpdGFibGU9JXMgaXMgbm90IHRoZSByaWdodCBmb3JtYXQ7IGl0IG11c3QgaGF2ZSAnCiAgICAgICAgICAgICcjZWdnPVBhY2thZ2UnICUgZWRpdGFibGVfcmVxCiAgICAgICAgKQogICAgcmV0dXJuIF9zdHJpcF9wb3N0Zml4KHBhY2thZ2VfbmFtZSksIHVybCwgTm9uZQpQSwMEFAAAAAAAAAAhABLdknaehgAAnoYAAC8AAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9yZXEvcmVxX3NldC5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0Cgpmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBkZWZhdWx0ZGljdApmcm9tIGl0ZXJ0b29scyBpbXBvcnQgY2hhaW4KaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IG9zCgpmcm9tIHBpcC5fdmVuZG9yIGltcG9ydCBwa2dfcmVzb3VyY2VzCmZyb20gcGlwLl92ZW5kb3IgaW1wb3J0IHJlcXVlc3RzCgpmcm9tIHBpcC5jb21wYXQgaW1wb3J0IGV4cGFuZHVzZXIKZnJvbSBwaXAuZG93bmxvYWQgaW1wb3J0IChpc19maWxlX3VybCwgaXNfZGlyX3VybCwgaXNfdmNzX3VybCwgdXJsX3RvX3BhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdW5wYWNrX3VybCkKZnJvbSBwaXAuZXhjZXB0aW9ucyBpbXBvcnQgKEluc3RhbGxhdGlvbkVycm9yLCBCZXN0VmVyc2lvbkFscmVhZHlJbnN0YWxsZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXN0cmlidXRpb25Ob3RGb3VuZCwgUHJldmlvdXNCdWlsZERpckVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFzaEVycm9yLCBIYXNoRXJyb3JzLCBIYXNoVW5waW5uZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXJlY3RvcnlVcmxIYXNoVW5zdXBwb3J0ZWQsIFZjc0hhc2hVbnN1cHBvcnRlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuc3VwcG9ydGVkUHl0aG9uVmVyc2lvbikKZnJvbSBwaXAucmVxLnJlcV9pbnN0YWxsIGltcG9ydCBJbnN0YWxsUmVxdWlyZW1lbnQKZnJvbSBwaXAudXRpbHMgaW1wb3J0ICgKICAgIGRpc3BsYXlfcGF0aCwgZGlzdF9pbl91c2Vyc2l0ZSwgZW5zdXJlX2Rpciwgbm9ybWFsaXplX3BhdGgpCmZyb20gcGlwLnV0aWxzLmhhc2hlcyBpbXBvcnQgTWlzc2luZ0hhc2hlcwpmcm9tIHBpcC51dGlscy5sb2dnaW5nIGltcG9ydCBpbmRlbnRfbG9nCmZyb20gcGlwLnV0aWxzLnBhY2thZ2luZyBpbXBvcnQgY2hlY2tfZGlzdF9yZXF1aXJlc19weXRob24KZnJvbSBwaXAudmNzIGltcG9ydCB2Y3MKZnJvbSBwaXAud2hlZWwgaW1wb3J0IFdoZWVsCgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCgpjbGFzcyBSZXF1aXJlbWVudHMob2JqZWN0KToKCiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc2VsZi5fa2V5cyA9IFtdCiAgICAgICAgc2VsZi5fZGljdCA9IHt9CgogICAgZGVmIGtleXMoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2tleXMKCiAgICBkZWYgdmFsdWVzKHNlbGYpOgogICAgICAgIHJldHVybiBbc2VsZi5fZGljdFtrZXldIGZvciBrZXkgaW4gc2VsZi5fa2V5c10KCiAgICBkZWYgX19jb250YWluc19fKHNlbGYsIGl0ZW0pOgogICAgICAgIHJldHVybiBpdGVtIGluIHNlbGYuX2tleXMKCiAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwga2V5LCB2YWx1ZSk6CiAgICAgICAgaWYga2V5IG5vdCBpbiBzZWxmLl9rZXlzOgogICAgICAgICAgICBzZWxmLl9rZXlzLmFwcGVuZChrZXkpCiAgICAgICAgc2VsZi5fZGljdFtrZXldID0gdmFsdWUKCiAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKICAgICAgICByZXR1cm4gc2VsZi5fZGljdFtrZXldCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHZhbHVlcyA9IFsnJXM6ICVzJyAlIChyZXByKGspLCByZXByKHNlbGZba10pKSBmb3IgayBpbiBzZWxmLmtleXMoKV0KICAgICAgICByZXR1cm4gJ1JlcXVpcmVtZW50cyh7JXN9KScgJSAnLCAnLmpvaW4odmFsdWVzKQoKCmNsYXNzIERpc3RBYnN0cmFjdGlvbihvYmplY3QpOgogICAgIiIiQWJzdHJhY3RzIG91dCB0aGUgd2hlZWwgdnMgbm9uLXdoZWVsIHByZXBhcmVfZmlsZXMgbG9naWMuCgogICAgVGhlIHJlcXVpcmVtZW50cyBmb3IgYW55dGhpbmcgaW5zdGFsbGFibGUgYXJlIGFzIGZvbGxvd3M6CiAgICAgLSB3ZSBtdXN0IGJlIGFibGUgdG8gZGV0ZXJtaW5lIHRoZSByZXF1aXJlbWVudCBuYW1lCiAgICAgICAob3Igd2UgY2FuJ3QgY29ycmVjdGx5IGhhbmRsZSB0aGUgbm9uLXVwZ3JhZGUgY2FzZSkuCiAgICAgLSB3ZSBtdXN0IGJlIGFibGUgdG8gZ2VuZXJhdGUgYSBsaXN0IG9mIHJ1bi10aW1lIGRlcGVuZGVuY2llcwogICAgICAgd2l0aG91dCBpbnN0YWxsaW5nIGFueSBhZGRpdGlvbmFsIHBhY2thZ2VzIChvciB3ZSB3b3VsZAogICAgICAgaGF2ZSB0byBlaXRoZXIgYnVybiB0aW1lIGJ5IGRvaW5nIHRlbXBvcmFyeSBpc29sYXRlZCBpbnN0YWxscwogICAgICAgb3IgYWx0ZXJuYXRpdmVseSB2aW9sYXRlIHBpcHMgJ2Rvbid0IHN0YXJ0IGluc3RhbGxpbmcgdW5sZXNzCiAgICAgICBhbGwgcmVxdWlyZW1lbnRzIGFyZSBhdmFpbGFibGUnIHJ1bGUgLSBuZWl0aGVyIG9mIHdoaWNoIGFyZQogICAgICAgZGVzaXJhYmxlKS4KICAgICAtIGZvciBwYWNrYWdlcyB3aXRoIHNldHVwIHJlcXVpcmVtZW50cywgd2UgbXVzdCBhbHNvIGJlIGFibGUKICAgICAgIHRvIGRldGVybWluZSB0aGVpciByZXF1aXJlbWVudHMgd2l0aG91dCBpbnN0YWxsaW5nIGFkZGl0aW9uYWwKICAgICAgIHBhY2thZ2VzIChmb3IgdGhlIHNhbWUgcmVhc29uIGFzIHJ1bi10aW1lIGRlcGVuZGVuY2llcykKICAgICAtIHdlIG11c3QgYmUgYWJsZSB0byBjcmVhdGUgYSBEaXN0cmlidXRpb24gb2JqZWN0IGV4cG9zaW5nIHRoZQogICAgICAgYWJvdmUgbWV0YWRhdGEuCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgcmVxX3RvX2luc3RhbGwpOgogICAgICAgIHNlbGYucmVxX3RvX2luc3RhbGwgPSByZXFfdG9faW5zdGFsbAoKICAgIGRlZiBkaXN0KHNlbGYsIGZpbmRlcik6CiAgICAgICAgIiIiUmV0dXJuIGEgc2V0dXB0b29scyBEaXN0IG9iamVjdC4iIiIKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKHNlbGYuZGlzdCkKCiAgICBkZWYgcHJlcF9mb3JfZGlzdChzZWxmKToKICAgICAgICAiIiJFbnN1cmUgdGhhdCB3ZSBjYW4gZ2V0IGEgRGlzdCBmb3IgdGhpcyByZXF1aXJlbWVudC4iIiIKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKHNlbGYuZGlzdCkKCgpkZWYgbWFrZV9hYnN0cmFjdF9kaXN0KHJlcV90b19pbnN0YWxsKToKICAgICIiIkZhY3RvcnkgdG8gbWFrZSBhbiBhYnN0cmFjdCBkaXN0IG9iamVjdC4KCiAgICBQcmVjb25kaXRpb25zOiBFaXRoZXIgYW4gZWRpdGFibGUgcmVxIHdpdGggYSBzb3VyY2VfZGlyLCBvciBzYXRpc2ZpZWRfYnkgb3IKICAgIGEgd2hlZWwgbGluaywgb3IgYSBub24tZWRpdGFibGUgcmVxIHdpdGggYSBzb3VyY2VfZGlyLgoKICAgIDpyZXR1cm46IEEgY29uY3JldGUgRGlzdEFic3RyYWN0aW9uLgogICAgIiIiCiAgICBpZiByZXFfdG9faW5zdGFsbC5lZGl0YWJsZToKICAgICAgICByZXR1cm4gSXNTRGlzdChyZXFfdG9faW5zdGFsbCkKICAgIGVsaWYgcmVxX3RvX2luc3RhbGwubGluayBhbmQgcmVxX3RvX2luc3RhbGwubGluay5pc193aGVlbDoKICAgICAgICByZXR1cm4gSXNXaGVlbChyZXFfdG9faW5zdGFsbCkKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIElzU0Rpc3QocmVxX3RvX2luc3RhbGwpCgoKY2xhc3MgSXNXaGVlbChEaXN0QWJzdHJhY3Rpb24pOgoKICAgIGRlZiBkaXN0KHNlbGYsIGZpbmRlcik6CiAgICAgICAgcmV0dXJuIGxpc3QocGtnX3Jlc291cmNlcy5maW5kX2Rpc3RyaWJ1dGlvbnMoCiAgICAgICAgICAgIHNlbGYucmVxX3RvX2luc3RhbGwuc291cmNlX2RpcikpWzBdCgogICAgZGVmIHByZXBfZm9yX2Rpc3Qoc2VsZik6CiAgICAgICAgIyBGSVhNRTpodHRwczovL2dpdGh1Yi5jb20vcHlwYS9waXAvaXNzdWVzLzExMTIKICAgICAgICBwYXNzCgoKY2xhc3MgSXNTRGlzdChEaXN0QWJzdHJhY3Rpb24pOgoKICAgIGRlZiBkaXN0KHNlbGYsIGZpbmRlcik6CiAgICAgICAgZGlzdCA9IHNlbGYucmVxX3RvX2luc3RhbGwuZ2V0X2Rpc3QoKQogICAgICAgICMgRklYTUU6IHNob3VsZG4ndCBiZSBnbG9iYWxseSBhZGRlZDoKICAgICAgICBpZiBkaXN0Lmhhc19tZXRhZGF0YSgnZGVwZW5kZW5jeV9saW5rcy50eHQnKToKICAgICAgICAgICAgZmluZGVyLmFkZF9kZXBlbmRlbmN5X2xpbmtzKAogICAgICAgICAgICAgICAgZGlzdC5nZXRfbWV0YWRhdGFfbGluZXMoJ2RlcGVuZGVuY3lfbGlua3MudHh0JykKICAgICAgICAgICAgKQogICAgICAgIHJldHVybiBkaXN0CgogICAgZGVmIHByZXBfZm9yX2Rpc3Qoc2VsZik6CiAgICAgICAgc2VsZi5yZXFfdG9faW5zdGFsbC5ydW5fZWdnX2luZm8oKQogICAgICAgIHNlbGYucmVxX3RvX2luc3RhbGwuYXNzZXJ0X3NvdXJjZV9tYXRjaGVzX3ZlcnNpb24oKQoKCmNsYXNzIEluc3RhbGxlZChEaXN0QWJzdHJhY3Rpb24pOgoKICAgIGRlZiBkaXN0KHNlbGYsIGZpbmRlcik6CiAgICAgICAgcmV0dXJuIHNlbGYucmVxX3RvX2luc3RhbGwuc2F0aXNmaWVkX2J5CgogICAgZGVmIHByZXBfZm9yX2Rpc3Qoc2VsZik6CiAgICAgICAgcGFzcwoKCmNsYXNzIFJlcXVpcmVtZW50U2V0KG9iamVjdCk6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGJ1aWxkX2Rpciwgc3JjX2RpciwgZG93bmxvYWRfZGlyLCB1cGdyYWRlPUZhbHNlLAogICAgICAgICAgICAgICAgIHVwZ3JhZGVfc3RyYXRlZ3k9Tm9uZSwgaWdub3JlX2luc3RhbGxlZD1GYWxzZSwgYXNfZWdnPUZhbHNlLAogICAgICAgICAgICAgICAgIHRhcmdldF9kaXI9Tm9uZSwgaWdub3JlX2RlcGVuZGVuY2llcz1GYWxzZSwKICAgICAgICAgICAgICAgICBmb3JjZV9yZWluc3RhbGw9RmFsc2UsIHVzZV91c2VyX3NpdGU9RmFsc2UsIHNlc3Npb249Tm9uZSwKICAgICAgICAgICAgICAgICBweWNvbXBpbGU9VHJ1ZSwgaXNvbGF0ZWQ9RmFsc2UsIHdoZWVsX2Rvd25sb2FkX2Rpcj1Ob25lLAogICAgICAgICAgICAgICAgIHdoZWVsX2NhY2hlPU5vbmUsIHJlcXVpcmVfaGFzaGVzPUZhbHNlLAogICAgICAgICAgICAgICAgIGlnbm9yZV9yZXF1aXJlc19weXRob249RmFsc2UpOgogICAgICAgICIiIkNyZWF0ZSBhIFJlcXVpcmVtZW50U2V0LgoKICAgICAgICA6cGFyYW0gd2hlZWxfZG93bmxvYWRfZGlyOiBXaGVyZSBzdGlsbC1wYWNrZWQgLndobCBmaWxlcyBzaG91bGQgYmUKICAgICAgICAgICAgd3JpdHRlbiB0by4gSWYgTm9uZSB0aGV5IGFyZSB3cml0dGVuIHRvIHRoZSBkb3dubG9hZF9kaXIgcGFyYW1ldGVyLgogICAgICAgICAgICBTZXBhcmF0ZSB0byBkb3dubG9hZF9kaXIgdG8gcGVybWl0IG9ubHkga2VlcGluZyB3aGVlbCBhcmNoaXZlcyBmb3IKICAgICAgICAgICAgcGlwIHdoZWVsLgogICAgICAgIDpwYXJhbSBkb3dubG9hZF9kaXI6IFdoZXJlIHN0aWxsIHBhY2tlZCBhcmNoaXZlcyBzaG91bGQgYmUgd3JpdHRlbiB0by4KICAgICAgICAgICAgSWYgTm9uZSB0aGV5IGFyZSBub3Qgc2F2ZWQsIGFuZCBhcmUgZGVsZXRlZCBpbW1lZGlhdGVseSBhZnRlcgogICAgICAgICAgICB1bnBhY2tpbmcuCiAgICAgICAgOnBhcmFtIHdoZWVsX2NhY2hlOiBUaGUgcGlwIHdoZWVsIGNhY2hlLCBmb3IgcGFzc2luZyB0bwogICAgICAgICAgICBJbnN0YWxsUmVxdWlyZW1lbnQuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2Vzc2lvbiBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoCiAgICAgICAgICAgICAgICAiUmVxdWlyZW1lbnRTZXQoKSBtaXNzaW5nIDEgcmVxdWlyZWQga2V5d29yZCBhcmd1bWVudDogIgogICAgICAgICAgICAgICAgIidzZXNzaW9uJyIKICAgICAgICAgICAgKQoKICAgICAgICBzZWxmLmJ1aWxkX2RpciA9IGJ1aWxkX2RpcgogICAgICAgIHNlbGYuc3JjX2RpciA9IHNyY19kaXIKICAgICAgICAjIFhYWDogZG93bmxvYWRfZGlyIGFuZCB3aGVlbF9kb3dubG9hZF9kaXIgb3ZlcmxhcCBzZW1hbnRpY2FsbHkgYW5kIG1heQogICAgICAgICMgYmUgY29tYmluZWQgaWYgd2UncmUgd2lsbGluZyB0byBoYXZlIG5vbi13aGVlbCBhcmNoaXZlcyBwcmVzZW50IGluCiAgICAgICAgIyB0aGUgd2hlZWxob3VzZSBvdXRwdXQgYnkgJ3BpcCB3aGVlbCcuCiAgICAgICAgc2VsZi5kb3dubG9hZF9kaXIgPSBkb3dubG9hZF9kaXIKICAgICAgICBzZWxmLnVwZ3JhZGUgPSB1cGdyYWRlCiAgICAgICAgc2VsZi51cGdyYWRlX3N0cmF0ZWd5ID0gdXBncmFkZV9zdHJhdGVneQogICAgICAgIHNlbGYuaWdub3JlX2luc3RhbGxlZCA9IGlnbm9yZV9pbnN0YWxsZWQKICAgICAgICBzZWxmLmZvcmNlX3JlaW5zdGFsbCA9IGZvcmNlX3JlaW5zdGFsbAogICAgICAgIHNlbGYucmVxdWlyZW1lbnRzID0gUmVxdWlyZW1lbnRzKCkKICAgICAgICAjIE1hcHBpbmcgb2YgYWxpYXM6IHJlYWxfbmFtZQogICAgICAgIHNlbGYucmVxdWlyZW1lbnRfYWxpYXNlcyA9IHt9CiAgICAgICAgc2VsZi51bm5hbWVkX3JlcXVpcmVtZW50cyA9IFtdCiAgICAgICAgc2VsZi5pZ25vcmVfZGVwZW5kZW5jaWVzID0gaWdub3JlX2RlcGVuZGVuY2llcwogICAgICAgIHNlbGYuaWdub3JlX3JlcXVpcmVzX3B5dGhvbiA9IGlnbm9yZV9yZXF1aXJlc19weXRob24KICAgICAgICBzZWxmLnN1Y2Nlc3NmdWxseV9kb3dubG9hZGVkID0gW10KICAgICAgICBzZWxmLnN1Y2Nlc3NmdWxseV9pbnN0YWxsZWQgPSBbXQogICAgICAgIHNlbGYucmVxc190b19jbGVhbnVwID0gW10KICAgICAgICBzZWxmLmFzX2VnZyA9IGFzX2VnZwogICAgICAgIHNlbGYudXNlX3VzZXJfc2l0ZSA9IHVzZV91c2VyX3NpdGUKICAgICAgICBzZWxmLnRhcmdldF9kaXIgPSB0YXJnZXRfZGlyICAjIHNldCBmcm9tIC0tdGFyZ2V0IG9wdGlvbgogICAgICAgIHNlbGYuc2Vzc2lvbiA9IHNlc3Npb24KICAgICAgICBzZWxmLnB5Y29tcGlsZSA9IHB5Y29tcGlsZQogICAgICAgIHNlbGYuaXNvbGF0ZWQgPSBpc29sYXRlZAogICAgICAgIGlmIHdoZWVsX2Rvd25sb2FkX2RpcjoKICAgICAgICAgICAgd2hlZWxfZG93bmxvYWRfZGlyID0gbm9ybWFsaXplX3BhdGgod2hlZWxfZG93bmxvYWRfZGlyKQogICAgICAgIHNlbGYud2hlZWxfZG93bmxvYWRfZGlyID0gd2hlZWxfZG93bmxvYWRfZGlyCiAgICAgICAgc2VsZi5fd2hlZWxfY2FjaGUgPSB3aGVlbF9jYWNoZQogICAgICAgIHNlbGYucmVxdWlyZV9oYXNoZXMgPSByZXF1aXJlX2hhc2hlcwogICAgICAgICMgTWFwcyBmcm9tIGluc3RhbGxfcmVxIC0+IGRlcGVuZGVuY2llc19vZl9pbnN0YWxsX3JlcQogICAgICAgIHNlbGYuX2RlcGVuZGVuY2llcyA9IGRlZmF1bHRkaWN0KGxpc3QpCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmVxcyA9IFtyZXEgZm9yIHJlcSBpbiBzZWxmLnJlcXVpcmVtZW50cy52YWx1ZXMoKQogICAgICAgICAgICAgICAgaWYgbm90IHJlcS5jb21lc19mcm9tXQogICAgICAgIHJlcXMuc29ydChrZXk9bGFtYmRhIHJlcTogcmVxLm5hbWUubG93ZXIoKSkKICAgICAgICByZXR1cm4gJyAnLmpvaW4oW3N0cihyZXEucmVxKSBmb3IgcmVxIGluIHJlcXNdKQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXFzID0gW3JlcSBmb3IgcmVxIGluIHNlbGYucmVxdWlyZW1lbnRzLnZhbHVlcygpXQogICAgICAgIHJlcXMuc29ydChrZXk9bGFtYmRhIHJlcTogcmVxLm5hbWUubG93ZXIoKSkKICAgICAgICByZXFzX3N0ciA9ICcsICcuam9pbihbc3RyKHJlcS5yZXEpIGZvciByZXEgaW4gcmVxc10pCiAgICAgICAgcmV0dXJuICgnPCVzIG9iamVjdDsgJWQgcmVxdWlyZW1lbnQocyk6ICVzPicKICAgICAgICAgICAgICAgICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBsZW4ocmVxcyksIHJlcXNfc3RyKSkKCiAgICBkZWYgYWRkX3JlcXVpcmVtZW50KHNlbGYsIGluc3RhbGxfcmVxLCBwYXJlbnRfcmVxX25hbWU9Tm9uZSwKICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFzX3JlcXVlc3RlZD1Ob25lKToKICAgICAgICAiIiJBZGQgaW5zdGFsbF9yZXEgYXMgYSByZXF1aXJlbWVudCB0byBpbnN0YWxsLgoKICAgICAgICA6cGFyYW0gcGFyZW50X3JlcV9uYW1lOiBUaGUgbmFtZSBvZiB0aGUgcmVxdWlyZW1lbnQgdGhhdCBuZWVkZWQgdGhpcwogICAgICAgICAgICBhZGRlZC4gVGhlIG5hbWUgaXMgdXNlZCBiZWNhdXNlIHdoZW4gbXVsdGlwbGUgdW5uYW1lZCByZXF1aXJlbWVudHMKICAgICAgICAgICAgcmVzb2x2ZSB0byB0aGUgc2FtZSBuYW1lLCB3ZSBjb3VsZCBvdGhlcndpc2UgZW5kIHVwIHdpdGggZGVwZW5kZW5jeQogICAgICAgICAgICBsaW5rcyB0aGF0IHBvaW50IG91dHNpZGUgdGhlIFJlcXVpcmVtZW50cyBzZXQuIHBhcmVudF9yZXEgbXVzdAogICAgICAgICAgICBhbHJlYWR5IGJlIGFkZGVkLiBOb3RlIHRoYXQgTm9uZSBpbXBsaWVzIHRoYXQgdGhpcyBpcyBhIHVzZXIKICAgICAgICAgICAgc3VwcGxpZWQgcmVxdWlyZW1lbnQsIHZzIGFuIGluZmVycmVkIG9uZS4KICAgICAgICA6cGFyYW0gZXh0cmFzX3JlcXVlc3RlZDogYW4gaXRlcmFibGUgb2YgZXh0cmFzIHVzZWQgdG8gZXZhbHVhdGUgdGhlCiAgICAgICAgICAgIGVudmlyb25lbWVudCBtYXJrZXJzLgogICAgICAgIDpyZXR1cm46IEFkZGl0aW9uYWwgcmVxdWlyZW1lbnRzIHRvIHNjYW4uIFRoYXQgaXMgZWl0aGVyIFtdIGlmCiAgICAgICAgICAgIHRoZSByZXF1aXJlbWVudCBpcyBub3QgYXBwbGljYWJsZSwgb3IgW2luc3RhbGxfcmVxXSBpZiB0aGUKICAgICAgICAgICAgcmVxdWlyZW1lbnQgaXMgYXBwbGljYWJsZSBhbmQgaGFzIGp1c3QgYmVlbiBhZGRlZC4KICAgICAgICAiIiIKICAgICAgICBuYW1lID0gaW5zdGFsbF9yZXEubmFtZQogICAgICAgIGlmIG5vdCBpbnN0YWxsX3JlcS5tYXRjaF9tYXJrZXJzKGV4dHJhc19yZXF1ZXN0ZWQpOgogICAgICAgICAgICBsb2dnZXIud2FybmluZygiSWdub3JpbmcgJXM6IG1hcmtlcnMgJyVzJyBkb24ndCBtYXRjaCB5b3VyICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgImVudmlyb25tZW50IiwgaW5zdGFsbF9yZXEubmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFsbF9yZXEubWFya2VycykKICAgICAgICAgICAgcmV0dXJuIFtdCgogICAgICAgICMgVGhpcyBjaGVjayBoYXMgdG8gY29tZSBhZnRlciB3ZSBmaWx0ZXIgcmVxdWlyZW1lbnRzIHdpdGggdGhlCiAgICAgICAgIyBlbnZpcm9ubWVudCBtYXJrZXJzLgogICAgICAgIGlmIGluc3RhbGxfcmVxLmxpbmsgYW5kIGluc3RhbGxfcmVxLmxpbmsuaXNfd2hlZWw6CiAgICAgICAgICAgIHdoZWVsID0gV2hlZWwoaW5zdGFsbF9yZXEubGluay5maWxlbmFtZSkKICAgICAgICAgICAgaWYgbm90IHdoZWVsLnN1cHBvcnRlZCgpOgogICAgICAgICAgICAgICAgcmFpc2UgSW5zdGFsbGF0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgIiVzIGlzIG5vdCBhIHN1cHBvcnRlZCB3aGVlbCBvbiB0aGlzIHBsYXRmb3JtLiIgJQogICAgICAgICAgICAgICAgICAgIHdoZWVsLmZpbGVuYW1lCiAgICAgICAgICAgICAgICApCgogICAgICAgIGluc3RhbGxfcmVxLmFzX2VnZyA9IHNlbGYuYXNfZWdnCiAgICAgICAgaW5zdGFsbF9yZXEudXNlX3VzZXJfc2l0ZSA9IHNlbGYudXNlX3VzZXJfc2l0ZQogICAgICAgIGluc3RhbGxfcmVxLnRhcmdldF9kaXIgPSBzZWxmLnRhcmdldF9kaXIKICAgICAgICBpbnN0YWxsX3JlcS5weWNvbXBpbGUgPSBzZWxmLnB5Y29tcGlsZQogICAgICAgIGluc3RhbGxfcmVxLmlzX2RpcmVjdCA9IChwYXJlbnRfcmVxX25hbWUgaXMgTm9uZSkKCiAgICAgICAgaWYgbm90IG5hbWU6CiAgICAgICAgICAgICMgdXJsIG9yIHBhdGggcmVxdWlyZW1lbnQgdy9vIGFuIGVnZyBmcmFnbWVudAogICAgICAgICAgICBzZWxmLnVubmFtZWRfcmVxdWlyZW1lbnRzLmFwcGVuZChpbnN0YWxsX3JlcSkKICAgICAgICAgICAgcmV0dXJuIFtpbnN0YWxsX3JlcV0KICAgICAgICBlbHNlOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBleGlzdGluZ19yZXEgPSBzZWxmLmdldF9yZXF1aXJlbWVudChuYW1lKQogICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgICAgICBleGlzdGluZ19yZXEgPSBOb25lCiAgICAgICAgICAgIGlmIChwYXJlbnRfcmVxX25hbWUgaXMgTm9uZSBhbmQgZXhpc3RpbmdfcmVxIGFuZCBub3QKICAgICAgICAgICAgICAgICAgICBleGlzdGluZ19yZXEuY29uc3RyYWludCBhbmQKICAgICAgICAgICAgICAgICAgICBleGlzdGluZ19yZXEuZXh0cmFzID09IGluc3RhbGxfcmVxLmV4dHJhcyBhbmQgbm90CiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdfcmVxLnJlcS5zcGVjaWZpZXIgPT0gaW5zdGFsbF9yZXEucmVxLnNwZWNpZmllcik6CiAgICAgICAgICAgICAgICByYWlzZSBJbnN0YWxsYXRpb25FcnJvcigKICAgICAgICAgICAgICAgICAgICAnRG91YmxlIHJlcXVpcmVtZW50IGdpdmVuOiAlcyAoYWxyZWFkeSBpbiAlcywgbmFtZT0lciknCiAgICAgICAgICAgICAgICAgICAgJSAoaW5zdGFsbF9yZXEsIGV4aXN0aW5nX3JlcSwgbmFtZSkpCiAgICAgICAgICAgIGlmIG5vdCBleGlzdGluZ19yZXE6CiAgICAgICAgICAgICAgICAjIEFkZCByZXF1aXJlbWVudAogICAgICAgICAgICAgICAgc2VsZi5yZXF1aXJlbWVudHNbbmFtZV0gPSBpbnN0YWxsX3JlcQogICAgICAgICAgICAgICAgIyBGSVhNRTogd2hhdCBhYm91dCBvdGhlciBub3JtYWxpemF0aW9ucz8gIEUuZy4sIF8gdnMuIC0/CiAgICAgICAgICAgICAgICBpZiBuYW1lLmxvd2VyKCkgIT0gbmFtZToKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlcXVpcmVtZW50X2FsaWFzZXNbbmFtZS5sb3dlcigpXSA9IG5hbWUKICAgICAgICAgICAgICAgIHJlc3VsdCA9IFtpbnN0YWxsX3JlcV0KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgQXNzdW1lIHRoZXJlJ3Mgbm8gbmVlZCB0byBzY2FuLCBhbmQgdGhhdCB3ZSd2ZSBhbHJlYWR5CiAgICAgICAgICAgICAgICAjIGVuY291bnRlcmVkIHRoaXMgZm9yIHNjYW5uaW5nLgogICAgICAgICAgICAgICAgcmVzdWx0ID0gW10KICAgICAgICAgICAgICAgIGlmIG5vdCBpbnN0YWxsX3JlcS5jb25zdHJhaW50IGFuZCBleGlzdGluZ19yZXEuY29uc3RyYWludDoKICAgICAgICAgICAgICAgICAgICBpZiAoaW5zdGFsbF9yZXEubGluayBhbmQgbm90IChleGlzdGluZ19yZXEubGluayBhbmQKICAgICAgICAgICAgICAgICAgICAgICBpbnN0YWxsX3JlcS5saW5rLnBhdGggPT0gZXhpc3RpbmdfcmVxLmxpbmsucGF0aCkpOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlcXNfdG9fY2xlYW51cC5hcHBlbmQoaW5zdGFsbF9yZXEpCiAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIEluc3RhbGxhdGlvbkVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBzYXRpc2Z5IGNvbnN0cmFpbnRzIGZvciAnJXMnOiAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5zdGFsbGF0aW9uIGZyb20gcGF0aCBvciB1cmwgY2Fubm90IGJlICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb25zdHJhaW5lZCB0byBhIHZlcnNpb24iICUgbmFtZSkKICAgICAgICAgICAgICAgICAgICAjIElmIHdlJ3JlIG5vdyBpbnN0YWxsaW5nIGEgY29uc3RyYWludCwgbWFyayB0aGUgZXhpc3RpbmcKICAgICAgICAgICAgICAgICAgICAjIG9iamVjdCBmb3IgcmVhbCBpbnN0YWxsYXRpb24uCiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdfcmVxLmNvbnN0cmFpbnQgPSBGYWxzZQogICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nX3JlcS5leHRyYXMgPSB0dXBsZSgKICAgICAgICAgICAgICAgICAgICAgICAgc29ydGVkKHNldChleGlzdGluZ19yZXEuZXh0cmFzKS51bmlvbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldChpbnN0YWxsX3JlcS5leHRyYXMpKSkpCiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJTZXR0aW5nICVzIGV4dHJhcyB0bzogJXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ19yZXEsIGV4aXN0aW5nX3JlcS5leHRyYXMpCiAgICAgICAgICAgICAgICAgICAgIyBBbmQgbm93IHdlIG5lZWQgdG8gc2NhbiB0aGlzLgogICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFtleGlzdGluZ19yZXFdCiAgICAgICAgICAgICAgICAjIENhbm9uaWNhbGlzZSB0byB0aGUgYWxyZWFkeS1hZGRlZCBvYmplY3QgZm9yIHRoZSBiYWNrcmVmCiAgICAgICAgICAgICAgICAjIGNoZWNrIGJlbG93LgogICAgICAgICAgICAgICAgaW5zdGFsbF9yZXEgPSBleGlzdGluZ19yZXEKICAgICAgICAgICAgaWYgcGFyZW50X3JlcV9uYW1lOgogICAgICAgICAgICAgICAgcGFyZW50X3JlcSA9IHNlbGYuZ2V0X3JlcXVpcmVtZW50KHBhcmVudF9yZXFfbmFtZSkKICAgICAgICAgICAgICAgIHNlbGYuX2RlcGVuZGVuY2llc1twYXJlbnRfcmVxXS5hcHBlbmQoaW5zdGFsbF9yZXEpCiAgICAgICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgaGFzX3JlcXVpcmVtZW50KHNlbGYsIHByb2plY3RfbmFtZSk6CiAgICAgICAgbmFtZSA9IHByb2plY3RfbmFtZS5sb3dlcigpCiAgICAgICAgaWYgKG5hbWUgaW4gc2VsZi5yZXF1aXJlbWVudHMgYW5kCiAgICAgICAgICAgbm90IHNlbGYucmVxdWlyZW1lbnRzW25hbWVdLmNvbnN0cmFpbnQgb3IKICAgICAgICAgICBuYW1lIGluIHNlbGYucmVxdWlyZW1lbnRfYWxpYXNlcyBhbmQKICAgICAgICAgICBub3Qgc2VsZi5yZXF1aXJlbWVudHNbc2VsZi5yZXF1aXJlbWVudF9hbGlhc2VzW25hbWVdXS5jb25zdHJhaW50KToKICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBAcHJvcGVydHkKICAgIGRlZiBoYXNfcmVxdWlyZW1lbnRzKHNlbGYpOgogICAgICAgIHJldHVybiBsaXN0KHJlcSBmb3IgcmVxIGluIHNlbGYucmVxdWlyZW1lbnRzLnZhbHVlcygpIGlmIG5vdAogICAgICAgICAgICAgICAgICAgIHJlcS5jb25zdHJhaW50KSBvciBzZWxmLnVubmFtZWRfcmVxdWlyZW1lbnRzCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfZG93bmxvYWQoc2VsZik6CiAgICAgICAgaWYgc2VsZi5kb3dubG9hZF9kaXI6CiAgICAgICAgICAgIHNlbGYuZG93bmxvYWRfZGlyID0gZXhwYW5kdXNlcihzZWxmLmRvd25sb2FkX2RpcikKICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoc2VsZi5kb3dubG9hZF9kaXIpOgogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGxvZ2dlci5jcml0aWNhbCgnQ291bGQgbm90IGZpbmQgZG93bmxvYWQgZGlyZWN0b3J5JykKICAgICAgICAgICAgICAgIHJhaXNlIEluc3RhbGxhdGlvbkVycm9yKAogICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgZmluZCBvciBhY2Nlc3MgZG93bmxvYWQgZGlyZWN0b3J5ICclcyciCiAgICAgICAgICAgICAgICAgICAgJSBkaXNwbGF5X3BhdGgoc2VsZi5kb3dubG9hZF9kaXIpKQogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGRlZiBnZXRfcmVxdWlyZW1lbnQoc2VsZiwgcHJvamVjdF9uYW1lKToKICAgICAgICBmb3IgbmFtZSBpbiBwcm9qZWN0X25hbWUsIHByb2plY3RfbmFtZS5sb3dlcigpOgogICAgICAgICAgICBpZiBuYW1lIGluIHNlbGYucmVxdWlyZW1lbnRzOgogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYucmVxdWlyZW1lbnRzW25hbWVdCiAgICAgICAgICAgIGlmIG5hbWUgaW4gc2VsZi5yZXF1aXJlbWVudF9hbGlhc2VzOgogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYucmVxdWlyZW1lbnRzW3NlbGYucmVxdWlyZW1lbnRfYWxpYXNlc1tuYW1lXV0KICAgICAgICByYWlzZSBLZXlFcnJvcigiTm8gcHJvamVjdCB3aXRoIHRoZSBuYW1lICVyIiAlIHByb2plY3RfbmFtZSkKCiAgICBkZWYgdW5pbnN0YWxsKHNlbGYsIGF1dG9fY29uZmlybT1GYWxzZSk6CiAgICAgICAgZm9yIHJlcSBpbiBzZWxmLnJlcXVpcmVtZW50cy52YWx1ZXMoKToKICAgICAgICAgICAgaWYgcmVxLmNvbnN0cmFpbnQ6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICByZXEudW5pbnN0YWxsKGF1dG9fY29uZmlybT1hdXRvX2NvbmZpcm0pCiAgICAgICAgICAgIHJlcS5jb21taXRfdW5pbnN0YWxsKCkKCiAgICBkZWYgcHJlcGFyZV9maWxlcyhzZWxmLCBmaW5kZXIpOgogICAgICAgICIiIgogICAgICAgIFByZXBhcmUgcHJvY2Vzcy4gQ3JlYXRlIHRlbXAgZGlyZWN0b3JpZXMsIGRvd25sb2FkIGFuZC9vciB1bnBhY2sgZmlsZXMuCiAgICAgICAgIiIiCiAgICAgICAgIyBtYWtlIHRoZSB3aGVlbGhvdXNlCiAgICAgICAgaWYgc2VsZi53aGVlbF9kb3dubG9hZF9kaXI6CiAgICAgICAgICAgIGVuc3VyZV9kaXIoc2VsZi53aGVlbF9kb3dubG9hZF9kaXIpCgogICAgICAgICMgSWYgYW55IHRvcC1sZXZlbCByZXF1aXJlbWVudCBoYXMgYSBoYXNoIHNwZWNpZmllZCwgZW50ZXIKICAgICAgICAjIGhhc2gtY2hlY2tpbmcgbW9kZSwgd2hpY2ggcmVxdWlyZXMgaGFzaGVzIGZyb20gYWxsLgogICAgICAgIHJvb3RfcmVxcyA9IHNlbGYudW5uYW1lZF9yZXF1aXJlbWVudHMgKyBzZWxmLnJlcXVpcmVtZW50cy52YWx1ZXMoKQogICAgICAgIHJlcXVpcmVfaGFzaGVzID0gKHNlbGYucmVxdWlyZV9oYXNoZXMgb3IKICAgICAgICAgICAgICAgICAgICAgICAgICBhbnkocmVxLmhhc19oYXNoX29wdGlvbnMgZm9yIHJlcSBpbiByb290X3JlcXMpKQogICAgICAgIGlmIHJlcXVpcmVfaGFzaGVzIGFuZCBzZWxmLmFzX2VnZzoKICAgICAgICAgICAgcmFpc2UgSW5zdGFsbGF0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAnLS1lZ2cgaXMgbm90IGFsbG93ZWQgd2l0aCAtLXJlcXVpcmUtaGFzaGVzIG1vZGUsIHNpbmNlIGl0ICcKICAgICAgICAgICAgICAgICdkZWxlZ2F0ZXMgZGVwZW5kZW5jeSByZXNvbHV0aW9uIHRvIHNldHVwdG9vbHMgYW5kIGNvdWxkIHRodXMgJwogICAgICAgICAgICAgICAgJ3Jlc3VsdCBpbiBpbnN0YWxsYXRpb24gb2YgdW5oYXNoZWQgcGFja2FnZXMuJykKCiAgICAgICAgIyBBY3R1YWxseSBwcmVwYXJlIHRoZSBmaWxlcywgYW5kIGNvbGxlY3QgYW55IGV4Y2VwdGlvbnMuIE1vc3QgaGFzaAogICAgICAgICMgZXhjZXB0aW9ucyBjYW5ub3QgYmUgY2hlY2tlZCBhaGVhZCBvZiB0aW1lLCBiZWNhdXNlCiAgICAgICAgIyByZXEucG9wdWxhdGVfbGluaygpIG5lZWRzIHRvIGJlIGNhbGxlZCBiZWZvcmUgd2UgY2FuIG1ha2UgZGVjaXNpb25zCiAgICAgICAgIyBiYXNlZCBvbiBsaW5rIHR5cGUuCiAgICAgICAgZGlzY292ZXJlZF9yZXFzID0gW10KICAgICAgICBoYXNoX2Vycm9ycyA9IEhhc2hFcnJvcnMoKQogICAgICAgIGZvciByZXEgaW4gY2hhaW4ocm9vdF9yZXFzLCBkaXNjb3ZlcmVkX3JlcXMpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBkaXNjb3ZlcmVkX3JlcXMuZXh0ZW5kKHNlbGYuX3ByZXBhcmVfZmlsZSgKICAgICAgICAgICAgICAgICAgICBmaW5kZXIsCiAgICAgICAgICAgICAgICAgICAgcmVxLAogICAgICAgICAgICAgICAgICAgIHJlcXVpcmVfaGFzaGVzPXJlcXVpcmVfaGFzaGVzLAogICAgICAgICAgICAgICAgICAgIGlnbm9yZV9kZXBlbmRlbmNpZXM9c2VsZi5pZ25vcmVfZGVwZW5kZW5jaWVzKSkKICAgICAgICAgICAgZXhjZXB0IEhhc2hFcnJvciBhcyBleGM6CiAgICAgICAgICAgICAgICBleGMucmVxID0gcmVxCiAgICAgICAgICAgICAgICBoYXNoX2Vycm9ycy5hcHBlbmQoZXhjKQoKICAgICAgICBpZiBoYXNoX2Vycm9yczoKICAgICAgICAgICAgcmFpc2UgaGFzaF9lcnJvcnMKCiAgICBkZWYgX2lzX3VwZ3JhZGVfYWxsb3dlZChzZWxmLCByZXEpOgogICAgICAgIHJldHVybiBzZWxmLnVwZ3JhZGUgYW5kICgKICAgICAgICAgICAgc2VsZi51cGdyYWRlX3N0cmF0ZWd5ID09ICJlYWdlciIgb3IgKAogICAgICAgICAgICAgICAgc2VsZi51cGdyYWRlX3N0cmF0ZWd5ID09ICJvbmx5LWlmLW5lZWRlZCIgYW5kIHJlcS5pc19kaXJlY3QKICAgICAgICAgICAgKQogICAgICAgICkKCiAgICBkZWYgX2NoZWNrX3NraXBfaW5zdGFsbGVkKHNlbGYsIHJlcV90b19pbnN0YWxsLCBmaW5kZXIpOgogICAgICAgICIiIkNoZWNrIGlmIHJlcV90b19pbnN0YWxsIHNob3VsZCBiZSBza2lwcGVkLgoKICAgICAgICBUaGlzIHdpbGwgY2hlY2sgaWYgdGhlIHJlcSBpcyBpbnN0YWxsZWQsIGFuZCB3aGV0aGVyIHdlIHNob3VsZCB1cGdyYWRlCiAgICAgICAgb3IgcmVpbnN0YWxsIGl0LCB0YWtpbmcgaW50byBhY2NvdW50IGFsbCB0aGUgcmVsZXZhbnQgdXNlciBvcHRpb25zLgoKICAgICAgICBBZnRlciBjYWxsaW5nIHRoaXMgcmVxX3RvX2luc3RhbGwgd2lsbCBvbmx5IGhhdmUgc2F0aXNmaWVkX2J5IHNldCB0bwogICAgICAgIE5vbmUgaWYgdGhlIHJlcV90b19pbnN0YWxsIGlzIHRvIGJlIHVwZ3JhZGVkL3JlaW5zdGFsbGVkIGV0Yy4gQW55CiAgICAgICAgb3RoZXIgdmFsdWUgd2lsbCBiZSBhIGRpc3QgcmVjb3JkaW5nIHRoZSBjdXJyZW50IHRoaW5nIGluc3RhbGxlZCB0aGF0CiAgICAgICAgc2F0aXNmaWVzIHRoZSByZXF1aXJlbWVudC4KCiAgICAgICAgTm90ZSB0aGF0IGZvciB2Y3MgdXJscyBhbmQgdGhlIGxpa2Ugd2UgY2FuJ3QgYXNzZXNzIHNraXBwaW5nIGluIHRoaXMKICAgICAgICByb3V0aW5lIC0gd2Ugc2ltcGx5IGlkZW50aWZ5IHRoYXQgd2UgbmVlZCB0byBwdWxsIHRoZSB0aGluZyBkb3duLAogICAgICAgIHRoZW4gbGF0ZXIgb24gaXQgaXMgcHVsbGVkIGRvd24gYW5kIGludHJvc3BlY3RlZCB0byBhc3Nlc3MgdXBncmFkZS8KICAgICAgICByZWluc3RhbGxzIGV0Yy4KCiAgICAgICAgOnJldHVybjogQSB0ZXh0IHJlYXNvbiBmb3Igd2h5IGl0IHdhcyBza2lwcGVkLCBvciBOb25lLgogICAgICAgICIiIgogICAgICAgICMgQ2hlY2sgd2hldGhlciB0byB1cGdyYWRlL3JlaW5zdGFsbCB0aGlzIHJlcSBvciBub3QuCiAgICAgICAgcmVxX3RvX2luc3RhbGwuY2hlY2tfaWZfZXhpc3RzKCkKICAgICAgICBpZiByZXFfdG9faW5zdGFsbC5zYXRpc2ZpZWRfYnk6CiAgICAgICAgICAgIHVwZ3JhZGVfYWxsb3dlZCA9IHNlbGYuX2lzX3VwZ3JhZGVfYWxsb3dlZChyZXFfdG9faW5zdGFsbCkKCiAgICAgICAgICAgICMgSXMgdGhlIGJlc3QgdmVyc2lvbiBpcyBpbnN0YWxsZWQuCiAgICAgICAgICAgIGJlc3RfaW5zdGFsbGVkID0gRmFsc2UKCiAgICAgICAgICAgIGlmIHVwZ3JhZGVfYWxsb3dlZDoKICAgICAgICAgICAgICAgICMgRm9yIGxpbmsgYmFzZWQgcmVxdWlyZW1lbnRzIHdlIGhhdmUgdG8gcHVsbCB0aGUKICAgICAgICAgICAgICAgICMgdHJlZSBkb3duIGFuZCBpbnNwZWN0IHRvIGFzc2VzcyB0aGUgdmVyc2lvbiAjLCBzbwogICAgICAgICAgICAgICAgIyBpdHMgaGFuZGxlZCB3YXkgZG93bi4KICAgICAgICAgICAgICAgIGlmIG5vdCAoc2VsZi5mb3JjZV9yZWluc3RhbGwgb3IgcmVxX3RvX2luc3RhbGwubGluayk6CiAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICBmaW5kZXIuZmluZF9yZXF1aXJlbWVudCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcV90b19pbnN0YWxsLCB1cGdyYWRlX2FsbG93ZWQpCiAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEJlc3RWZXJzaW9uQWxyZWFkeUluc3RhbGxlZDoKICAgICAgICAgICAgICAgICAgICAgICAgYmVzdF9pbnN0YWxsZWQgPSBUcnVlCiAgICAgICAgICAgICAgICAgICAgZXhjZXB0IERpc3RyaWJ1dGlvbk5vdEZvdW5kOgogICAgICAgICAgICAgICAgICAgICAgICAjIE5vIGRpc3RyaWJ1dGlvbiBmb3VuZCwgc28gd2Ugc3F1YXNoIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAjIGVycm9yIC0gaXQgd2lsbCBiZSByYWlzZWQgbGF0ZXIgd2hlbiB3ZQogICAgICAgICAgICAgICAgICAgICAgICAjIHJlLXRyeSBsYXRlciB0byBkbyB0aGUgaW5zdGFsbC4KICAgICAgICAgICAgICAgICAgICAgICAgIyBXaHkgZG9uJ3Qgd2UganVzdCByYWlzZSBoZXJlPwogICAgICAgICAgICAgICAgICAgICAgICBwYXNzCgogICAgICAgICAgICAgICAgaWYgbm90IGJlc3RfaW5zdGFsbGVkOgogICAgICAgICAgICAgICAgICAgICMgZG9uJ3QgdW5pbnN0YWxsIGNvbmZsaWN0IGlmIHVzZXIgaW5zdGFsbCBhbmQKICAgICAgICAgICAgICAgICAgICAjIGNvbmZsaWN0IGlzIG5vdCB1c2VyIGluc3RhbGwKICAgICAgICAgICAgICAgICAgICBpZiBub3QgKHNlbGYudXNlX3VzZXJfc2l0ZSBhbmQgbm90CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0X2luX3VzZXJzaXRlKHJlcV90b19pbnN0YWxsLnNhdGlzZmllZF9ieSkpOgogICAgICAgICAgICAgICAgICAgICAgICByZXFfdG9faW5zdGFsbC5jb25mbGljdHNfd2l0aCA9IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcV90b19pbnN0YWxsLnNhdGlzZmllZF9ieQogICAgICAgICAgICAgICAgICAgIHJlcV90b19pbnN0YWxsLnNhdGlzZmllZF9ieSA9IE5vbmUKCiAgICAgICAgICAgICMgRmlndXJlIG91dCBhIG5pY2UgbWVzc2FnZSB0byBzYXkgd2h5IHdlJ3JlIHNraXBwaW5nIHRoaXMuCiAgICAgICAgICAgIGlmIGJlc3RfaW5zdGFsbGVkOgogICAgICAgICAgICAgICAgc2tpcF9yZWFzb24gPSAnYWxyZWFkeSB1cC10by1kYXRlJwogICAgICAgICAgICBlbGlmIHNlbGYudXBncmFkZV9zdHJhdGVneSA9PSAib25seS1pZi1uZWVkZWQiOgogICAgICAgICAgICAgICAgc2tpcF9yZWFzb24gPSAnbm90IHVwZ3JhZGVkIGFzIG5vdCBkaXJlY3RseSByZXF1aXJlZCcKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNraXBfcmVhc29uID0gJ2FscmVhZHkgc2F0aXNmaWVkJwoKICAgICAgICAgICAgcmV0dXJuIHNraXBfcmVhc29uCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBkZWYgX3ByZXBhcmVfZmlsZShzZWxmLAogICAgICAgICAgICAgICAgICAgICAgZmluZGVyLAogICAgICAgICAgICAgICAgICAgICAgcmVxX3RvX2luc3RhbGwsCiAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlX2hhc2hlcz1GYWxzZSwKICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZV9kZXBlbmRlbmNpZXM9RmFsc2UpOgogICAgICAgICIiIlByZXBhcmUgYSBzaW5nbGUgcmVxdWlyZW1lbnRzIGZpbGUuCgogICAgICAgIDpyZXR1cm46IEEgbGlzdCBvZiBhZGRpdGlvbmFsIEluc3RhbGxSZXF1aXJlbWVudHMgdG8gYWxzbyBpbnN0YWxsLgogICAgICAgICIiIgogICAgICAgICMgVGVsbCB1c2VyIHdoYXQgd2UgYXJlIGRvaW5nIGZvciB0aGlzIHJlcXVpcmVtZW50OgogICAgICAgICMgb2J0YWluIChlZGl0YWJsZSksIHNraXBwaW5nLCBwcm9jZXNzaW5nIChsb2NhbCB1cmwpLCBjb2xsZWN0aW5nCiAgICAgICAgIyAocmVtb3RlIHVybCBvciBwYWNrYWdlIG5hbWUpCiAgICAgICAgaWYgcmVxX3RvX2luc3RhbGwuY29uc3RyYWludCBvciByZXFfdG9faW5zdGFsbC5wcmVwYXJlZDoKICAgICAgICAgICAgcmV0dXJuIFtdCgogICAgICAgIHJlcV90b19pbnN0YWxsLnByZXBhcmVkID0gVHJ1ZQoKICAgICAgICAjICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIwogICAgICAgICMgIyBwcmludCBsb2cgbWVzc2FnZXMgIyAjCiAgICAgICAgIyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICMKICAgICAgICBpZiByZXFfdG9faW5zdGFsbC5lZGl0YWJsZToKICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ09idGFpbmluZyAlcycsIHJlcV90b19pbnN0YWxsKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgc2F0aXNmaWVkX2J5IGlzIG9ubHkgZXZhbHVhdGVkIGJ5IGNhbGxpbmcgX2NoZWNrX3NraXBfaW5zdGFsbGVkLAogICAgICAgICAgICAjIHNvIGl0IG11c3QgYmUgTm9uZSBoZXJlLgogICAgICAgICAgICBhc3NlcnQgcmVxX3RvX2luc3RhbGwuc2F0aXNmaWVkX2J5IGlzIE5vbmUKICAgICAgICAgICAgaWYgbm90IHNlbGYuaWdub3JlX2luc3RhbGxlZDoKICAgICAgICAgICAgICAgIHNraXBfcmVhc29uID0gc2VsZi5fY2hlY2tfc2tpcF9pbnN0YWxsZWQoCiAgICAgICAgICAgICAgICAgICAgcmVxX3RvX2luc3RhbGwsIGZpbmRlcikKCiAgICAgICAgICAgIGlmIHJlcV90b19pbnN0YWxsLnNhdGlzZmllZF9ieToKICAgICAgICAgICAgICAgIGFzc2VydCBza2lwX3JlYXNvbiBpcyBub3QgTm9uZSwgKAogICAgICAgICAgICAgICAgICAgICdfY2hlY2tfc2tpcF9pbnN0YWxsZWQgcmV0dXJuZWQgTm9uZSBidXQgJwogICAgICAgICAgICAgICAgICAgICdyZXFfdG9faW5zdGFsbC5zYXRpc2ZpZWRfYnkgaXMgc2V0IHRvICVyJwogICAgICAgICAgICAgICAgICAgICUgKHJlcV90b19pbnN0YWxsLnNhdGlzZmllZF9ieSwpKQogICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oCiAgICAgICAgICAgICAgICAgICAgJ1JlcXVpcmVtZW50ICVzOiAlcycsIHNraXBfcmVhc29uLAogICAgICAgICAgICAgICAgICAgIHJlcV90b19pbnN0YWxsKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgaWYgKHJlcV90b19pbnN0YWxsLmxpbmsgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgIHJlcV90b19pbnN0YWxsLmxpbmsuc2NoZW1lID09ICdmaWxlJyk6CiAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHVybF90b19wYXRoKHJlcV90b19pbnN0YWxsLmxpbmsudXJsKQogICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdQcm9jZXNzaW5nICVzJywgZGlzcGxheV9wYXRoKHBhdGgpKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygnQ29sbGVjdGluZyAlcycsIHJlcV90b19pbnN0YWxsKQoKICAgICAgICB3aXRoIGluZGVudF9sb2coKToKICAgICAgICAgICAgIyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAjCiAgICAgICAgICAgICMgIyB2Y3MgdXBkYXRlIG9yIHVucGFjayBhcmNoaXZlICMgIwogICAgICAgICAgICAjICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICMKICAgICAgICAgICAgaWYgcmVxX3RvX2luc3RhbGwuZWRpdGFibGU6CiAgICAgICAgICAgICAgICBpZiByZXF1aXJlX2hhc2hlczoKICAgICAgICAgICAgICAgICAgICByYWlzZSBJbnN0YWxsYXRpb25FcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgJ1RoZSBlZGl0YWJsZSByZXF1aXJlbWVudCAlcyBjYW5ub3QgYmUgaW5zdGFsbGVkIHdoZW4gJwogICAgICAgICAgICAgICAgICAgICAgICAncmVxdWlyaW5nIGhhc2hlcywgYmVjYXVzZSB0aGVyZSBpcyBubyBzaW5nbGUgZmlsZSB0byAnCiAgICAgICAgICAgICAgICAgICAgICAgICdoYXNoLicgJSByZXFfdG9faW5zdGFsbCkKICAgICAgICAgICAgICAgIHJlcV90b19pbnN0YWxsLmVuc3VyZV9oYXNfc291cmNlX2RpcihzZWxmLnNyY19kaXIpCiAgICAgICAgICAgICAgICByZXFfdG9faW5zdGFsbC51cGRhdGVfZWRpdGFibGUobm90IHNlbGYuaXNfZG93bmxvYWQpCiAgICAgICAgICAgICAgICBhYnN0cmFjdF9kaXN0ID0gbWFrZV9hYnN0cmFjdF9kaXN0KHJlcV90b19pbnN0YWxsKQogICAgICAgICAgICAgICAgYWJzdHJhY3RfZGlzdC5wcmVwX2Zvcl9kaXN0KCkKICAgICAgICAgICAgICAgIGlmIHNlbGYuaXNfZG93bmxvYWQ6CiAgICAgICAgICAgICAgICAgICAgcmVxX3RvX2luc3RhbGwuYXJjaGl2ZShzZWxmLmRvd25sb2FkX2RpcikKICAgICAgICAgICAgICAgIHJlcV90b19pbnN0YWxsLmNoZWNrX2lmX2V4aXN0cygpCiAgICAgICAgICAgIGVsaWYgcmVxX3RvX2luc3RhbGwuc2F0aXNmaWVkX2J5OgogICAgICAgICAgICAgICAgaWYgcmVxdWlyZV9oYXNoZXM6CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKAogICAgICAgICAgICAgICAgICAgICAgICAnU2luY2UgaXQgaXMgYWxyZWFkeSBpbnN0YWxsZWQsIHdlIGFyZSB0cnVzdGluZyB0aGlzICcKICAgICAgICAgICAgICAgICAgICAgICAgJ3BhY2thZ2Ugd2l0aG91dCBjaGVja2luZyBpdHMgaGFzaC4gVG8gZW5zdXJlIGEgJwogICAgICAgICAgICAgICAgICAgICAgICAnY29tcGxldGVseSByZXBlYXRhYmxlIGVudmlyb25tZW50LCBpbnN0YWxsIGludG8gYW4gJwogICAgICAgICAgICAgICAgICAgICAgICAnZW1wdHkgdmlydHVhbGVudi4nKQogICAgICAgICAgICAgICAgYWJzdHJhY3RfZGlzdCA9IEluc3RhbGxlZChyZXFfdG9faW5zdGFsbCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgQEAgaWYgZmlsZXN5c3RlbSBwYWNrYWdlcyBhcmUgbm90IG1hcmtlZAogICAgICAgICAgICAgICAgIyBlZGl0YWJsZSBpbiBhIHJlcSwgYSBub24gZGV0ZXJtaW5pc3RpYyBlcnJvcgogICAgICAgICAgICAgICAgIyBvY2N1cnMgd2hlbiB0aGUgc2NyaXB0IGF0dGVtcHRzIHRvIHVucGFjayB0aGUKICAgICAgICAgICAgICAgICMgYnVpbGQgZGlyZWN0b3J5CiAgICAgICAgICAgICAgICByZXFfdG9faW5zdGFsbC5lbnN1cmVfaGFzX3NvdXJjZV9kaXIoc2VsZi5idWlsZF9kaXIpCiAgICAgICAgICAgICAgICAjIElmIGEgY2hlY2tvdXQgZXhpc3RzLCBpdCdzIHVud2lzZSB0byBrZWVwIGdvaW5nLiAgdmVyc2lvbgogICAgICAgICAgICAgICAgIyBpbmNvbnNpc3RlbmNpZXMgYXJlIGxvZ2dlZCBsYXRlciwgYnV0IGRvIG5vdCBmYWlsIHRoZQogICAgICAgICAgICAgICAgIyBpbnN0YWxsYXRpb24uCiAgICAgICAgICAgICAgICAjIEZJWE1FOiB0aGlzIHdvbid0IHVwZ3JhZGUgd2hlbiB0aGVyZSdzIGFuIGV4aXN0aW5nCiAgICAgICAgICAgICAgICAjIHBhY2thZ2UgdW5wYWNrZWQgaW4gYHJlcV90b19pbnN0YWxsLnNvdXJjZV9kaXJgCiAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cygKICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKHJlcV90b19pbnN0YWxsLnNvdXJjZV9kaXIsICdzZXR1cC5weScpKToKICAgICAgICAgICAgICAgICAgICByYWlzZSBQcmV2aW91c0J1aWxkRGlyRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgICJwaXAgY2FuJ3QgcHJvY2VlZCB3aXRoIHJlcXVpcmVtZW50cyAnJXMnIGR1ZSB0byBhIgogICAgICAgICAgICAgICAgICAgICAgICAiIHByZS1leGlzdGluZyBidWlsZCBkaXJlY3RvcnkgKCVzKS4gVGhpcyBpcyAiCiAgICAgICAgICAgICAgICAgICAgICAgICJsaWtlbHkgZHVlIHRvIGEgcHJldmlvdXMgaW5zdGFsbGF0aW9uIHRoYXQgZmFpbGVkIgogICAgICAgICAgICAgICAgICAgICAgICAiLiBwaXAgaXMgYmVpbmcgcmVzcG9uc2libGUgYW5kIG5vdCBhc3N1bWluZyBpdCAiCiAgICAgICAgICAgICAgICAgICAgICAgICJjYW4gZGVsZXRlIHRoaXMuIFBsZWFzZSBkZWxldGUgaXQgYW5kIHRyeSBhZ2Fpbi4iCiAgICAgICAgICAgICAgICAgICAgICAgICUgKHJlcV90b19pbnN0YWxsLCByZXFfdG9faW5zdGFsbC5zb3VyY2VfZGlyKQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHJlcV90b19pbnN0YWxsLnBvcHVsYXRlX2xpbmsoCiAgICAgICAgICAgICAgICAgICAgZmluZGVyLAogICAgICAgICAgICAgICAgICAgIHNlbGYuX2lzX3VwZ3JhZGVfYWxsb3dlZChyZXFfdG9faW5zdGFsbCksCiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZV9oYXNoZXMKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICMgV2UgY2FuJ3QgaGl0IHRoaXMgc3BvdCBhbmQgaGF2ZSBwb3B1bGF0ZV9saW5rIHJldHVybiBOb25lLgogICAgICAgICAgICAgICAgIyByZXFfdG9faW5zdGFsbC5zYXRpc2ZpZWRfYnkgaXMgTm9uZSBoZXJlIChiZWNhdXNlIHdlJ3JlCiAgICAgICAgICAgICAgICAjIGd1YXJkZWQpIGFuZCB1cGdyYWRlIGhhcyBubyBpbXBhY3QgZXhjZXB0IHdoZW4gc2F0aXNmaWVkX2J5CiAgICAgICAgICAgICAgICAjIGlzIG5vdCBOb25lLgogICAgICAgICAgICAgICAgIyBUaGVuIGluc2lkZSBmaW5kX3JlcXVpcmVtZW50IGV4aXN0aW5nX2FwcGxpY2FibGUgLT4gRmFsc2UKICAgICAgICAgICAgICAgICMgSWYgbm8gbmV3IHZlcnNpb25zIGFyZSBmb3VuZCwgRGlzdHJpYnV0aW9uTm90Rm91bmQgaXMgcmFpc2VkLAogICAgICAgICAgICAgICAgIyBvdGhlcndpc2UgYSByZXN1bHQgaXMgZ3VhcmFudGVlZC4KICAgICAgICAgICAgICAgIGFzc2VydCByZXFfdG9faW5zdGFsbC5saW5rCiAgICAgICAgICAgICAgICBsaW5rID0gcmVxX3RvX2luc3RhbGwubGluawoKICAgICAgICAgICAgICAgICMgTm93IHRoYXQgd2UgaGF2ZSB0aGUgcmVhbCBsaW5rLCB3ZSBjYW4gdGVsbCB3aGF0IGtpbmQgb2YKICAgICAgICAgICAgICAgICMgcmVxdWlyZW1lbnRzIHdlIGhhdmUgYW5kIHJhaXNlIHNvbWUgbW9yZSBpbmZvcm1hdGl2ZSBlcnJvcnMKICAgICAgICAgICAgICAgICMgdGhhbiBvdGhlcndpc2UuIChGb3IgZXhhbXBsZSwgd2UgY2FuIHJhaXNlIFZjc0hhc2hVbnN1cHBvcnRlZAogICAgICAgICAgICAgICAgIyBmb3IgYSBWQ1MgVVJMIHJhdGhlciB0aGFuIEhhc2hNaXNzaW5nLikKICAgICAgICAgICAgICAgIGlmIHJlcXVpcmVfaGFzaGVzOgogICAgICAgICAgICAgICAgICAgICMgV2UgY291bGQgY2hlY2sgdGhlc2UgZmlyc3QgMiBjb25kaXRpb25zIGluc2lkZQogICAgICAgICAgICAgICAgICAgICMgdW5wYWNrX3VybCBhbmQgc2F2ZSByZXBldGl0aW9uIG9mIGNvbmRpdGlvbnMsIGJ1dCB0aGVuCiAgICAgICAgICAgICAgICAgICAgIyB3ZSB3b3VsZCByZXBvcnQgbGVzcy11c2VmdWwgZXJyb3IgbWVzc2FnZXMgZm9yCiAgICAgICAgICAgICAgICAgICAgIyB1bmhhc2hhYmxlIHJlcXVpcmVtZW50cywgY29tcGxhaW5pbmcgdGhhdCB0aGVyZSdzIG5vCiAgICAgICAgICAgICAgICAgICAgIyBoYXNoIHByb3ZpZGVkLgogICAgICAgICAgICAgICAgICAgIGlmIGlzX3Zjc191cmwobGluayk6CiAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZjc0hhc2hVbnN1cHBvcnRlZCgpCiAgICAgICAgICAgICAgICAgICAgZWxpZiBpc19maWxlX3VybChsaW5rKSBhbmQgaXNfZGlyX3VybChsaW5rKToKICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgRGlyZWN0b3J5VXJsSGFzaFVuc3VwcG9ydGVkKCkKICAgICAgICAgICAgICAgICAgICBpZiAobm90IHJlcV90b19pbnN0YWxsLm9yaWdpbmFsX2xpbmsgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgcmVxX3RvX2luc3RhbGwuaXNfcGlubmVkKToKICAgICAgICAgICAgICAgICAgICAgICAgIyBVbnBpbm5lZCBwYWNrYWdlcyBhcmUgYXNraW5nIGZvciB0cm91YmxlIHdoZW4gYSBuZXcKICAgICAgICAgICAgICAgICAgICAgICAgIyB2ZXJzaW9uIGlzIHVwbG9hZGVkLiBUaGlzIGlzbid0IGEgc2VjdXJpdHkgY2hlY2ssIGJ1dAogICAgICAgICAgICAgICAgICAgICAgICAjIGl0IHNhdmVzIHVzZXJzIGEgc3VycHJpc2luZyBoYXNoIG1pc21hdGNoIGluIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAjIGZ1dHVyZS4KICAgICAgICAgICAgICAgICAgICAgICAgIwogICAgICAgICAgICAgICAgICAgICAgICAjIGZpbGU6Ly8vIFVSTHMgYXJlbid0IHBpbm5hYmxlLCBzbyBkb24ndCBjb21wbGFpbgogICAgICAgICAgICAgICAgICAgICAgICAjIGFib3V0IHRoZW0gbm90IGJlaW5nIHBpbm5lZC4KICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgSGFzaFVucGlubmVkKCkKICAgICAgICAgICAgICAgIGhhc2hlcyA9IHJlcV90b19pbnN0YWxsLmhhc2hlcygKICAgICAgICAgICAgICAgICAgICB0cnVzdF9pbnRlcm5ldD1ub3QgcmVxdWlyZV9oYXNoZXMpCiAgICAgICAgICAgICAgICBpZiByZXF1aXJlX2hhc2hlcyBhbmQgbm90IGhhc2hlczoKICAgICAgICAgICAgICAgICAgICAjIEtub3duLWdvb2QgaGFzaGVzIGFyZSBtaXNzaW5nIGZvciB0aGlzIHJlcXVpcmVtZW50LCBzbwogICAgICAgICAgICAgICAgICAgICMgc2hpbSBpdCB3aXRoIGEgZmFjYWRlIG9iamVjdCB0aGF0IHdpbGwgcHJvdm9rZSBoYXNoCiAgICAgICAgICAgICAgICAgICAgIyBjb21wdXRhdGlvbiBhbmQgdGhlbiByYWlzZSBhIEhhc2hNaXNzaW5nIGV4Y2VwdGlvbgogICAgICAgICAgICAgICAgICAgICMgc2hvd2luZyB0aGUgdXNlciB3aGF0IHRoZSBoYXNoIHNob3VsZCBiZS4KICAgICAgICAgICAgICAgICAgICBoYXNoZXMgPSBNaXNzaW5nSGFzaGVzKCkKCiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRfZGlyID0gc2VsZi5kb3dubG9hZF9kaXIKICAgICAgICAgICAgICAgICAgICAjIFdlIGFsd2F5cyBkZWxldGUgdW5wYWNrZWQgc2Rpc3RzIGFmdGVyIHBpcCByYW4uCiAgICAgICAgICAgICAgICAgICAgYXV0b2RlbGV0ZV91bnBhY2tlZCA9IFRydWUKICAgICAgICAgICAgICAgICAgICBpZiByZXFfdG9faW5zdGFsbC5saW5rLmlzX3doZWVsIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBzZWxmLndoZWVsX2Rvd25sb2FkX2RpcjoKICAgICAgICAgICAgICAgICAgICAgICAgIyB3aGVuIGRvaW5nICdwaXAgd2hlZWxgIHdlIGRvd25sb2FkIHdoZWVscyB0byBhCiAgICAgICAgICAgICAgICAgICAgICAgICMgZGVkaWNhdGVkIGRpci4KICAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRfZGlyID0gc2VsZi53aGVlbF9kb3dubG9hZF9kaXIKICAgICAgICAgICAgICAgICAgICBpZiByZXFfdG9faW5zdGFsbC5saW5rLmlzX3doZWVsOgogICAgICAgICAgICAgICAgICAgICAgICBpZiBkb3dubG9hZF9kaXI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFdoZW4gZG93bmxvYWRpbmcsIHdlIG9ubHkgdW5wYWNrIHdoZWVscyB0byBnZXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbWV0YWRhdGEuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvZGVsZXRlX3VucGFja2VkID0gVHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBXaGVuIGluc3RhbGxpbmcgYSB3aGVlbCwgd2UgdXNlIHRoZSB1bnBhY2tlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB3aGVlbC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9kZWxldGVfdW5wYWNrZWQgPSBGYWxzZQogICAgICAgICAgICAgICAgICAgIHVucGFja191cmwoCiAgICAgICAgICAgICAgICAgICAgICAgIHJlcV90b19pbnN0YWxsLmxpbmssIHJlcV90b19pbnN0YWxsLnNvdXJjZV9kaXIsCiAgICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkX2RpciwgYXV0b2RlbGV0ZV91bnBhY2tlZCwKICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbj1zZWxmLnNlc3Npb24sIGhhc2hlcz1oYXNoZXMpCiAgICAgICAgICAgICAgICBleGNlcHQgcmVxdWVzdHMuSFRUUEVycm9yIGFzIGV4YzoKICAgICAgICAgICAgICAgICAgICBsb2dnZXIuY3JpdGljYWwoCiAgICAgICAgICAgICAgICAgICAgICAgICdDb3VsZCBub3QgaW5zdGFsbCByZXF1aXJlbWVudCAlcyBiZWNhdXNlICcKICAgICAgICAgICAgICAgICAgICAgICAgJ29mIGVycm9yICVzJywKICAgICAgICAgICAgICAgICAgICAgICAgcmVxX3RvX2luc3RhbGwsCiAgICAgICAgICAgICAgICAgICAgICAgIGV4YywKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgcmFpc2UgSW5zdGFsbGF0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgICdDb3VsZCBub3QgaW5zdGFsbCByZXF1aXJlbWVudCAlcyBiZWNhdXNlICcKICAgICAgICAgICAgICAgICAgICAgICAgJ29mIEhUVFAgZXJyb3IgJXMgZm9yIFVSTCAlcycgJQogICAgICAgICAgICAgICAgICAgICAgICAocmVxX3RvX2luc3RhbGwsIGV4YywgcmVxX3RvX2luc3RhbGwubGluaykKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBhYnN0cmFjdF9kaXN0ID0gbWFrZV9hYnN0cmFjdF9kaXN0KHJlcV90b19pbnN0YWxsKQogICAgICAgICAgICAgICAgYWJzdHJhY3RfZGlzdC5wcmVwX2Zvcl9kaXN0KCkKICAgICAgICAgICAgICAgIGlmIHNlbGYuaXNfZG93bmxvYWQ6CiAgICAgICAgICAgICAgICAgICAgIyBNYWtlIGEgLnppcCBvZiB0aGUgc291cmNlX2RpciB3ZSBhbHJlYWR5IGNyZWF0ZWQuCiAgICAgICAgICAgICAgICAgICAgaWYgcmVxX3RvX2luc3RhbGwubGluay5zY2hlbWUgaW4gdmNzLmFsbF9zY2hlbWVzOgogICAgICAgICAgICAgICAgICAgICAgICByZXFfdG9faW5zdGFsbC5hcmNoaXZlKHNlbGYuZG93bmxvYWRfZGlyKQogICAgICAgICAgICAgICAgIyByZXFfdG9faW5zdGFsbC5yZXEgaXMgb25seSBhdmFpbCBhZnRlciB1bnBhY2sgZm9yIFVSTAogICAgICAgICAgICAgICAgIyBwa2dzIHJlcGVhdCBjaGVja19pZl9leGlzdHMgdG8gdW5pbnN0YWxsLW9uLXVwZ3JhZGUKICAgICAgICAgICAgICAgICMgKCMxNCkKICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLmlnbm9yZV9pbnN0YWxsZWQ6CiAgICAgICAgICAgICAgICAgICAgcmVxX3RvX2luc3RhbGwuY2hlY2tfaWZfZXhpc3RzKCkKICAgICAgICAgICAgICAgIGlmIHJlcV90b19pbnN0YWxsLnNhdGlzZmllZF9ieToKICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLnVwZ3JhZGUgb3Igc2VsZi5pZ25vcmVfaW5zdGFsbGVkOgogICAgICAgICAgICAgICAgICAgICAgICAjIGRvbid0IHVuaW5zdGFsbCBjb25mbGljdCBpZiB1c2VyIGluc3RhbGwgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICMgY29uZmxpY3QgaXMgbm90IHVzZXIgaW5zdGFsbAogICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgKHNlbGYudXNlX3VzZXJfc2l0ZSBhbmQgbm90CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdF9pbl91c2Vyc2l0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxX3RvX2luc3RhbGwuc2F0aXNmaWVkX2J5KSk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXFfdG9faW5zdGFsbC5jb25mbGljdHNfd2l0aCA9IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXFfdG9faW5zdGFsbC5zYXRpc2ZpZWRfYnkKICAgICAgICAgICAgICAgICAgICAgICAgcmVxX3RvX2luc3RhbGwuc2F0aXNmaWVkX2J5ID0gTm9uZQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1JlcXVpcmVtZW50IGFscmVhZHkgc2F0aXNmaWVkICh1c2UgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJy0tdXBncmFkZSB0byB1cGdyYWRlKTogJXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxX3RvX2luc3RhbGwsCiAgICAgICAgICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgICMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAjCiAgICAgICAgICAgICMgIyBwYXJzZSBkZXBlbmRlbmNpZXMgIyAjCiAgICAgICAgICAgICMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAjCiAgICAgICAgICAgIGRpc3QgPSBhYnN0cmFjdF9kaXN0LmRpc3QoZmluZGVyKQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBjaGVja19kaXN0X3JlcXVpcmVzX3B5dGhvbihkaXN0KQogICAgICAgICAgICBleGNlcHQgVW5zdXBwb3J0ZWRQeXRob25WZXJzaW9uIGFzIGU6CiAgICAgICAgICAgICAgICBpZiBzZWxmLmlnbm9yZV9yZXF1aXJlc19weXRob246CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoZS5hcmdzWzBdKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICByZXFfdG9faW5zdGFsbC5yZW1vdmVfdGVtcG9yYXJ5X3NvdXJjZSgpCiAgICAgICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICAgICAgbW9yZV9yZXFzID0gW10KCiAgICAgICAgICAgIGRlZiBhZGRfcmVxKHN1YnJlcSwgZXh0cmFzX3JlcXVlc3RlZCk6CiAgICAgICAgICAgICAgICBzdWJfaW5zdGFsbF9yZXEgPSBJbnN0YWxsUmVxdWlyZW1lbnQoCiAgICAgICAgICAgICAgICAgICAgc3RyKHN1YnJlcSksCiAgICAgICAgICAgICAgICAgICAgcmVxX3RvX2luc3RhbGwsCiAgICAgICAgICAgICAgICAgICAgaXNvbGF0ZWQ9c2VsZi5pc29sYXRlZCwKICAgICAgICAgICAgICAgICAgICB3aGVlbF9jYWNoZT1zZWxmLl93aGVlbF9jYWNoZSwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIG1vcmVfcmVxcy5leHRlbmQoc2VsZi5hZGRfcmVxdWlyZW1lbnQoCiAgICAgICAgICAgICAgICAgICAgc3ViX2luc3RhbGxfcmVxLCByZXFfdG9faW5zdGFsbC5uYW1lLAogICAgICAgICAgICAgICAgICAgIGV4dHJhc19yZXF1ZXN0ZWQ9ZXh0cmFzX3JlcXVlc3RlZCkpCgogICAgICAgICAgICAjIFdlIGFkZCByZXFfdG9faW5zdGFsbCBiZWZvcmUgaXRzIGRlcGVuZGVuY2llcywgc28gdGhhdCB3ZQogICAgICAgICAgICAjIGNhbiByZWZlciB0byBpdCB3aGVuIGFkZGluZyBkZXBlbmRlbmNpZXMuCiAgICAgICAgICAgIGlmIG5vdCBzZWxmLmhhc19yZXF1aXJlbWVudChyZXFfdG9faW5zdGFsbC5uYW1lKToKICAgICAgICAgICAgICAgICMgJ3VubmFtZWQnIHJlcXVpcmVtZW50cyB3aWxsIGdldCBhZGRlZCBoZXJlCiAgICAgICAgICAgICAgICBzZWxmLmFkZF9yZXF1aXJlbWVudChyZXFfdG9faW5zdGFsbCwgTm9uZSkKCiAgICAgICAgICAgIGlmIG5vdCBpZ25vcmVfZGVwZW5kZW5jaWVzOgogICAgICAgICAgICAgICAgaWYgKHJlcV90b19pbnN0YWxsLmV4dHJhcyk6CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKAogICAgICAgICAgICAgICAgICAgICAgICAiSW5zdGFsbGluZyBleHRyYSByZXF1aXJlbWVudHM6ICVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgJywnLmpvaW4ocmVxX3RvX2luc3RhbGwuZXh0cmFzKSwKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBtaXNzaW5nX3JlcXVlc3RlZCA9IHNvcnRlZCgKICAgICAgICAgICAgICAgICAgICBzZXQocmVxX3RvX2luc3RhbGwuZXh0cmFzKSAtIHNldChkaXN0LmV4dHJhcykKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGZvciBtaXNzaW5nIGluIG1pc3NpbmdfcmVxdWVzdGVkOgogICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgICAgICAgICAnJXMgZG9lcyBub3QgcHJvdmlkZSB0aGUgZXh0cmEgXCclc1wnJywKICAgICAgICAgICAgICAgICAgICAgICAgZGlzdCwgbWlzc2luZwogICAgICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgICAgICBhdmFpbGFibGVfcmVxdWVzdGVkID0gc29ydGVkKAogICAgICAgICAgICAgICAgICAgIHNldChkaXN0LmV4dHJhcykgJiBzZXQocmVxX3RvX2luc3RhbGwuZXh0cmFzKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgZm9yIHN1YnJlcSBpbiBkaXN0LnJlcXVpcmVzKGF2YWlsYWJsZV9yZXF1ZXN0ZWQpOgogICAgICAgICAgICAgICAgICAgIGFkZF9yZXEoc3VicmVxLCBleHRyYXNfcmVxdWVzdGVkPWF2YWlsYWJsZV9yZXF1ZXN0ZWQpCgogICAgICAgICAgICAjIGNsZWFudXAgdG1wIHNyYwogICAgICAgICAgICBzZWxmLnJlcXNfdG9fY2xlYW51cC5hcHBlbmQocmVxX3RvX2luc3RhbGwpCgogICAgICAgICAgICBpZiBub3QgcmVxX3RvX2luc3RhbGwuZWRpdGFibGUgYW5kIG5vdCByZXFfdG9faW5zdGFsbC5zYXRpc2ZpZWRfYnk6CiAgICAgICAgICAgICAgICAjIFhYWDogLS1uby1pbnN0YWxsIGxlYWRzIHRoaXMgdG8gcmVwb3J0ICdTdWNjZXNzZnVsbHkKICAgICAgICAgICAgICAgICMgZG93bmxvYWRlZCcgZm9yIG9ubHkgbm9uLWVkaXRhYmxlIHJlcXMsIGV2ZW4gdGhvdWdoIHdlIHRvb2sKICAgICAgICAgICAgICAgICMgYWN0aW9uIG9uIHRoZW0uCiAgICAgICAgICAgICAgICBzZWxmLnN1Y2Nlc3NmdWxseV9kb3dubG9hZGVkLmFwcGVuZChyZXFfdG9faW5zdGFsbCkKCiAgICAgICAgcmV0dXJuIG1vcmVfcmVxcwoKICAgIGRlZiBjbGVhbnVwX2ZpbGVzKHNlbGYpOgogICAgICAgICIiIkNsZWFuIHVwIGZpbGVzLCByZW1vdmUgYnVpbGRzLiIiIgogICAgICAgIGxvZ2dlci5kZWJ1ZygnQ2xlYW5pbmcgdXAuLi4nKQogICAgICAgIHdpdGggaW5kZW50X2xvZygpOgogICAgICAgICAgICBmb3IgcmVxIGluIHNlbGYucmVxc190b19jbGVhbnVwOgogICAgICAgICAgICAgICAgcmVxLnJlbW92ZV90ZW1wb3Jhcnlfc291cmNlKCkKCiAgICBkZWYgX3RvX2luc3RhbGwoc2VsZik6CiAgICAgICAgIiIiQ3JlYXRlIHRoZSBpbnN0YWxsYXRpb24gb3JkZXIuCgogICAgICAgIFRoZSBpbnN0YWxsYXRpb24gb3JkZXIgaXMgdG9wb2xvZ2ljYWwgLSByZXF1aXJlbWVudHMgYXJlIGluc3RhbGxlZAogICAgICAgIGJlZm9yZSB0aGUgcmVxdWlyaW5nIHRoaW5nLiBXZSBicmVhayBjeWNsZXMgYXQgYW4gYXJiaXRyYXJ5IHBvaW50LAogICAgICAgIGFuZCBtYWtlIG5vIG90aGVyIGd1YXJhbnRlZXMuCiAgICAgICAgIiIiCiAgICAgICAgIyBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggd2UgbWF5IGNoYW5nZSBhdCBhbnkgcG9pbnQKICAgICAgICAjIGluc3RhbGxzIHRoZSB1c2VyIHNwZWNpZmllZCB0aGluZ3MgaW4gdGhlIG9yZGVyIGdpdmVuLCBleGNlcHQgd2hlbgogICAgICAgICMgZGVwZW5kZW5jaWVzIG11c3QgY29tZSBlYXJsaWVyIHRvIGFjaGlldmUgdG9wb2xvZ2ljYWwgb3JkZXIuCiAgICAgICAgb3JkZXIgPSBbXQogICAgICAgIG9yZGVyZWRfcmVxcyA9IHNldCgpCgogICAgICAgIGRlZiBzY2hlZHVsZShyZXEpOgogICAgICAgICAgICBpZiByZXEuc2F0aXNmaWVkX2J5IG9yIHJlcSBpbiBvcmRlcmVkX3JlcXM6CiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgaWYgcmVxLmNvbnN0cmFpbnQ6CiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgb3JkZXJlZF9yZXFzLmFkZChyZXEpCiAgICAgICAgICAgIGZvciBkZXAgaW4gc2VsZi5fZGVwZW5kZW5jaWVzW3JlcV06CiAgICAgICAgICAgICAgICBzY2hlZHVsZShkZXApCiAgICAgICAgICAgIG9yZGVyLmFwcGVuZChyZXEpCiAgICAgICAgZm9yIGluc3RhbGxfcmVxIGluIHNlbGYucmVxdWlyZW1lbnRzLnZhbHVlcygpOgogICAgICAgICAgICBzY2hlZHVsZShpbnN0YWxsX3JlcSkKICAgICAgICByZXR1cm4gb3JkZXIKCiAgICBkZWYgaW5zdGFsbChzZWxmLCBpbnN0YWxsX29wdGlvbnMsIGdsb2JhbF9vcHRpb25zPSgpLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgICIiIgogICAgICAgIEluc3RhbGwgZXZlcnl0aGluZyBpbiB0aGlzIHNldCAoYWZ0ZXIgaGF2aW5nIGRvd25sb2FkZWQgYW5kIHVucGFja2VkCiAgICAgICAgdGhlIHBhY2thZ2VzKQogICAgICAgICIiIgogICAgICAgIHRvX2luc3RhbGwgPSBzZWxmLl90b19pbnN0YWxsKCkKCiAgICAgICAgaWYgdG9faW5zdGFsbDoKICAgICAgICAgICAgbG9nZ2VyLmluZm8oCiAgICAgICAgICAgICAgICAnSW5zdGFsbGluZyBjb2xsZWN0ZWQgcGFja2FnZXM6ICVzJywKICAgICAgICAgICAgICAgICcsICcuam9pbihbcmVxLm5hbWUgZm9yIHJlcSBpbiB0b19pbnN0YWxsXSksCiAgICAgICAgICAgICkKCiAgICAgICAgd2l0aCBpbmRlbnRfbG9nKCk6CiAgICAgICAgICAgIGZvciByZXF1aXJlbWVudCBpbiB0b19pbnN0YWxsOgogICAgICAgICAgICAgICAgaWYgcmVxdWlyZW1lbnQuY29uZmxpY3RzX3dpdGg6CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oCiAgICAgICAgICAgICAgICAgICAgICAgICdGb3VuZCBleGlzdGluZyBpbnN0YWxsYXRpb246ICVzJywKICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZW1lbnQuY29uZmxpY3RzX3dpdGgsCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHdpdGggaW5kZW50X2xvZygpOgogICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlbWVudC51bmluc3RhbGwoYXV0b19jb25maXJtPVRydWUpCiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZW1lbnQuaW5zdGFsbCgKICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFsbF9vcHRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxfb3B0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgKmFyZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICoqa3dhcmdzCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgZXhjZXB0OgogICAgICAgICAgICAgICAgICAgICMgaWYgaW5zdGFsbCBkaWQgbm90IHN1Y2NlZWQsIHJvbGxiYWNrIHByZXZpb3VzIHVuaW5zdGFsbAogICAgICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlbWVudC5jb25mbGljdHNfd2l0aCBhbmQgbm90CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlbWVudC5pbnN0YWxsX3N1Y2NlZWRlZCk6CiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50LnJvbGxiYWNrX3VuaW5zdGFsbCgpCiAgICAgICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmVtZW50LmNvbmZsaWN0c193aXRoIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZW1lbnQuaW5zdGFsbF9zdWNjZWVkZWQpOgogICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlbWVudC5jb21taXRfdW5pbnN0YWxsKCkKICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50LnJlbW92ZV90ZW1wb3Jhcnlfc291cmNlKCkKCiAgICAgICAgc2VsZi5zdWNjZXNzZnVsbHlfaW5zdGFsbGVkID0gdG9faW5zdGFsbApQSwMEFAAAAAAAAAAhAAVGxHDxGgAA8RoAADUAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9yZXEvcmVxX3VuaW5zdGFsbC5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgbG9nZ2luZwppbXBvcnQgb3MKaW1wb3J0IHRlbXBmaWxlCgpmcm9tIHBpcC5jb21wYXQgaW1wb3J0IHVzZXNfcHljYWNoZSwgV0lORE9XUywgY2FjaGVfZnJvbV9zb3VyY2UKZnJvbSBwaXAuZXhjZXB0aW9ucyBpbXBvcnQgVW5pbnN0YWxsYXRpb25FcnJvcgpmcm9tIHBpcC51dGlscyBpbXBvcnQgcm10cmVlLCBhc2ssIGlzX2xvY2FsLCByZW5hbWVzLCBub3JtYWxpemVfcGF0aApmcm9tIHBpcC51dGlscy5sb2dnaW5nIGltcG9ydCBpbmRlbnRfbG9nCgoKbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgoKY2xhc3MgVW5pbnN0YWxsUGF0aFNldChvYmplY3QpOgogICAgIiIiQSBzZXQgb2YgZmlsZSBwYXRocyB0byBiZSByZW1vdmVkIGluIHRoZSB1bmluc3RhbGxhdGlvbiBvZiBhCiAgICByZXF1aXJlbWVudC4iIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkaXN0KToKICAgICAgICBzZWxmLnBhdGhzID0gc2V0KCkKICAgICAgICBzZWxmLl9yZWZ1c2UgPSBzZXQoKQogICAgICAgIHNlbGYucHRoID0ge30KICAgICAgICBzZWxmLmRpc3QgPSBkaXN0CiAgICAgICAgc2VsZi5zYXZlX2RpciA9IE5vbmUKICAgICAgICBzZWxmLl9tb3ZlZF9wYXRocyA9IFtdCgogICAgZGVmIF9wZXJtaXR0ZWQoc2VsZiwgcGF0aCk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIFRydWUgaWYgdGhlIGdpdmVuIHBhdGggaXMgb25lIHdlIGFyZSBwZXJtaXR0ZWQgdG8KICAgICAgICByZW1vdmUvbW9kaWZ5LCBGYWxzZSBvdGhlcndpc2UuCgogICAgICAgICIiIgogICAgICAgIHJldHVybiBpc19sb2NhbChwYXRoKQoKICAgIGRlZiBhZGQoc2VsZiwgcGF0aCk6CiAgICAgICAgaGVhZCwgdGFpbCA9IG9zLnBhdGguc3BsaXQocGF0aCkKCiAgICAgICAgIyB3ZSBub3JtYWxpemUgdGhlIGhlYWQgdG8gcmVzb2x2ZSBwYXJlbnQgZGlyZWN0b3J5IHN5bWxpbmtzLCBidXQgbm90CiAgICAgICAgIyB0aGUgdGFpbCwgc2luY2Ugd2Ugb25seSB3YW50IHRvIHVuaW5zdGFsbCBzeW1saW5rcywgbm90IHRoZWlyIHRhcmdldHMKICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKG5vcm1hbGl6ZV9wYXRoKGhlYWQpLCBvcy5wYXRoLm5vcm1jYXNlKHRhaWwpKQoKICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMocGF0aCk6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIGlmIHNlbGYuX3Blcm1pdHRlZChwYXRoKToKICAgICAgICAgICAgc2VsZi5wYXRocy5hZGQocGF0aCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLl9yZWZ1c2UuYWRkKHBhdGgpCgogICAgICAgICMgX19weWNhY2hlX18gZmlsZXMgY2FuIHNob3cgdXAgYWZ0ZXIgJ2luc3RhbGxlZC1maWxlcy50eHQnIGlzIGNyZWF0ZWQsCiAgICAgICAgIyBkdWUgdG8gaW1wb3J0cwogICAgICAgIGlmIG9zLnBhdGguc3BsaXRleHQocGF0aClbMV0gPT0gJy5weScgYW5kIHVzZXNfcHljYWNoZToKICAgICAgICAgICAgc2VsZi5hZGQoY2FjaGVfZnJvbV9zb3VyY2UocGF0aCkpCgogICAgZGVmIGFkZF9wdGgoc2VsZiwgcHRoX2ZpbGUsIGVudHJ5KToKICAgICAgICBwdGhfZmlsZSA9IG5vcm1hbGl6ZV9wYXRoKHB0aF9maWxlKQogICAgICAgIGlmIHNlbGYuX3Blcm1pdHRlZChwdGhfZmlsZSk6CiAgICAgICAgICAgIGlmIHB0aF9maWxlIG5vdCBpbiBzZWxmLnB0aDoKICAgICAgICAgICAgICAgIHNlbGYucHRoW3B0aF9maWxlXSA9IFVuaW5zdGFsbFB0aEVudHJpZXMocHRoX2ZpbGUpCiAgICAgICAgICAgIHNlbGYucHRoW3B0aF9maWxlXS5hZGQoZW50cnkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5fcmVmdXNlLmFkZChwdGhfZmlsZSkKCiAgICBkZWYgY29tcGFjdChzZWxmLCBwYXRocyk6CiAgICAgICAgIiIiQ29tcGFjdCBhIHBhdGggc2V0IHRvIGNvbnRhaW4gdGhlIG1pbmltYWwgbnVtYmVyIG9mIHBhdGhzCiAgICAgICAgbmVjZXNzYXJ5IHRvIGNvbnRhaW4gYWxsIHBhdGhzIGluIHRoZSBzZXQuIElmIC9hL3BhdGgvIGFuZAogICAgICAgIC9hL3BhdGgvdG8vYS9maWxlLnR4dCBhcmUgYm90aCBpbiB0aGUgc2V0LCBsZWF2ZSBvbmx5IHRoZQogICAgICAgIHNob3J0ZXIgcGF0aC4iIiIKICAgICAgICBzaG9ydF9wYXRocyA9IHNldCgpCiAgICAgICAgZm9yIHBhdGggaW4gc29ydGVkKHBhdGhzLCBrZXk9bGVuKToKICAgICAgICAgICAgaWYgbm90IGFueShbCiAgICAgICAgICAgICAgICAgICAgKHBhdGguc3RhcnRzd2l0aChzaG9ydHBhdGgpIGFuZAogICAgICAgICAgICAgICAgICAgICBwYXRoW2xlbihzaG9ydHBhdGgucnN0cmlwKG9zLnBhdGguc2VwKSldID09IG9zLnBhdGguc2VwKQogICAgICAgICAgICAgICAgICAgIGZvciBzaG9ydHBhdGggaW4gc2hvcnRfcGF0aHNdKToKICAgICAgICAgICAgICAgIHNob3J0X3BhdGhzLmFkZChwYXRoKQogICAgICAgIHJldHVybiBzaG9ydF9wYXRocwoKICAgIGRlZiBfc3Rhc2goc2VsZiwgcGF0aCk6CiAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbigKICAgICAgICAgICAgc2VsZi5zYXZlX2Rpciwgb3MucGF0aC5zcGxpdGRyaXZlKHBhdGgpWzFdLmxzdHJpcChvcy5wYXRoLnNlcCkpCgogICAgZGVmIHJlbW92ZShzZWxmLCBhdXRvX2NvbmZpcm09RmFsc2UpOgogICAgICAgICIiIlJlbW92ZSBwYXRocyBpbiBgYHNlbGYucGF0aHNgYCB3aXRoIGNvbmZpcm1hdGlvbiAodW5sZXNzCiAgICAgICAgYGBhdXRvX2NvbmZpcm1gYCBpcyBUcnVlKS4iIiIKICAgICAgICBpZiBub3Qgc2VsZi5wYXRoczoKICAgICAgICAgICAgbG9nZ2VyLmluZm8oCiAgICAgICAgICAgICAgICAiQ2FuJ3QgdW5pbnN0YWxsICclcycuIE5vIGZpbGVzIHdlcmUgZm91bmQgdG8gdW5pbnN0YWxsLiIsCiAgICAgICAgICAgICAgICBzZWxmLmRpc3QucHJvamVjdF9uYW1lLAogICAgICAgICAgICApCiAgICAgICAgICAgIHJldHVybgogICAgICAgIGxvZ2dlci5pbmZvKAogICAgICAgICAgICAnVW5pbnN0YWxsaW5nICVzLSVzOicsCiAgICAgICAgICAgIHNlbGYuZGlzdC5wcm9qZWN0X25hbWUsIHNlbGYuZGlzdC52ZXJzaW9uCiAgICAgICAgKQoKICAgICAgICB3aXRoIGluZGVudF9sb2coKToKICAgICAgICAgICAgcGF0aHMgPSBzb3J0ZWQoc2VsZi5jb21wYWN0KHNlbGYucGF0aHMpKQoKICAgICAgICAgICAgaWYgYXV0b19jb25maXJtOgogICAgICAgICAgICAgICAgcmVzcG9uc2UgPSAneScKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGZvciBwYXRoIGluIHBhdGhzOgogICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKHBhdGgpCiAgICAgICAgICAgICAgICByZXNwb25zZSA9IGFzaygnUHJvY2VlZCAoeS9uKT8gJywgKCd5JywgJ24nKSkKICAgICAgICAgICAgaWYgc2VsZi5fcmVmdXNlOgogICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ05vdCByZW1vdmluZyBvciBtb2RpZnlpbmcgKG91dHNpZGUgb2YgcHJlZml4KTonKQogICAgICAgICAgICAgICAgZm9yIHBhdGggaW4gc2VsZi5jb21wYWN0KHNlbGYuX3JlZnVzZSk6CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8ocGF0aCkKICAgICAgICAgICAgaWYgcmVzcG9uc2UgPT0gJ3knOgogICAgICAgICAgICAgICAgc2VsZi5zYXZlX2RpciA9IHRlbXBmaWxlLm1rZHRlbXAoc3VmZml4PSctdW5pbnN0YWxsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeD0ncGlwLScpCiAgICAgICAgICAgICAgICBmb3IgcGF0aCBpbiBwYXRoczoKICAgICAgICAgICAgICAgICAgICBuZXdfcGF0aCA9IHNlbGYuX3N0YXNoKHBhdGgpCiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdSZW1vdmluZyBmaWxlIG9yIGRpcmVjdG9yeSAlcycsIHBhdGgpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5fbW92ZWRfcGF0aHMuYXBwZW5kKHBhdGgpCiAgICAgICAgICAgICAgICAgICAgcmVuYW1lcyhwYXRoLCBuZXdfcGF0aCkKICAgICAgICAgICAgICAgIGZvciBwdGggaW4gc2VsZi5wdGgudmFsdWVzKCk6CiAgICAgICAgICAgICAgICAgICAgcHRoLnJlbW92ZSgpCiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygKICAgICAgICAgICAgICAgICAgICAnU3VjY2Vzc2Z1bGx5IHVuaW5zdGFsbGVkICVzLSVzJywKICAgICAgICAgICAgICAgICAgICBzZWxmLmRpc3QucHJvamVjdF9uYW1lLCBzZWxmLmRpc3QudmVyc2lvbgogICAgICAgICAgICAgICAgKQoKICAgIGRlZiByb2xsYmFjayhzZWxmKToKICAgICAgICAiIiJSb2xsYmFjayB0aGUgY2hhbmdlcyBwcmV2aW91c2x5IG1hZGUgYnkgcmVtb3ZlKCkuIiIiCiAgICAgICAgaWYgc2VsZi5zYXZlX2RpciBpcyBOb25lOgogICAgICAgICAgICBsb2dnZXIuZXJyb3IoCiAgICAgICAgICAgICAgICAiQ2FuJ3Qgcm9sbCBiYWNrICVzOyB3YXMgbm90IHVuaW5zdGFsbGVkIiwKICAgICAgICAgICAgICAgIHNlbGYuZGlzdC5wcm9qZWN0X25hbWUsCiAgICAgICAgICAgICkKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgbG9nZ2VyLmluZm8oJ1JvbGxpbmcgYmFjayB1bmluc3RhbGwgb2YgJXMnLCBzZWxmLmRpc3QucHJvamVjdF9uYW1lKQogICAgICAgIGZvciBwYXRoIGluIHNlbGYuX21vdmVkX3BhdGhzOgogICAgICAgICAgICB0bXBfcGF0aCA9IHNlbGYuX3N0YXNoKHBhdGgpCiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnUmVwbGFjaW5nICVzJywgcGF0aCkKICAgICAgICAgICAgcmVuYW1lcyh0bXBfcGF0aCwgcGF0aCkKICAgICAgICBmb3IgcHRoIGluIHNlbGYucHRoLnZhbHVlcygpOgogICAgICAgICAgICBwdGgucm9sbGJhY2soKQoKICAgIGRlZiBjb21taXQoc2VsZik6CiAgICAgICAgIiIiUmVtb3ZlIHRlbXBvcmFyeSBzYXZlIGRpcjogcm9sbGJhY2sgd2lsbCBubyBsb25nZXIgYmUgcG9zc2libGUuIiIiCiAgICAgICAgaWYgc2VsZi5zYXZlX2RpciBpcyBub3QgTm9uZToKICAgICAgICAgICAgcm10cmVlKHNlbGYuc2F2ZV9kaXIpCiAgICAgICAgICAgIHNlbGYuc2F2ZV9kaXIgPSBOb25lCiAgICAgICAgICAgIHNlbGYuX21vdmVkX3BhdGhzID0gW10KCgpjbGFzcyBVbmluc3RhbGxQdGhFbnRyaWVzKG9iamVjdCk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgcHRoX2ZpbGUpOgogICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZmlsZShwdGhfZmlsZSk6CiAgICAgICAgICAgIHJhaXNlIFVuaW5zdGFsbGF0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAiQ2Fubm90IHJlbW92ZSBlbnRyaWVzIGZyb20gbm9uZXhpc3RlbnQgZmlsZSAlcyIgJSBwdGhfZmlsZQogICAgICAgICAgICApCiAgICAgICAgc2VsZi5maWxlID0gcHRoX2ZpbGUKICAgICAgICBzZWxmLmVudHJpZXMgPSBzZXQoKQogICAgICAgIHNlbGYuX3NhdmVkX2xpbmVzID0gTm9uZQoKICAgIGRlZiBhZGQoc2VsZiwgZW50cnkpOgogICAgICAgIGVudHJ5ID0gb3MucGF0aC5ub3JtY2FzZShlbnRyeSkKICAgICAgICAjIE9uIFdpbmRvd3MsIG9zLnBhdGgubm9ybWNhc2UgY29udmVydHMgdGhlIGVudHJ5IHRvIHVzZQogICAgICAgICMgYmFja3NsYXNoZXMuICBUaGlzIGlzIGNvcnJlY3QgZm9yIGVudHJpZXMgdGhhdCBkZXNjcmliZSBhYnNvbHV0ZQogICAgICAgICMgcGF0aHMgb3V0c2lkZSBvZiBzaXRlLXBhY2thZ2VzLCBidXQgYWxsIHRoZSBvdGhlcnMgdXNlIGZvcndhcmQKICAgICAgICAjIHNsYXNoZXMuCiAgICAgICAgaWYgV0lORE9XUyBhbmQgbm90IG9zLnBhdGguc3BsaXRkcml2ZShlbnRyeSlbMF06CiAgICAgICAgICAgIGVudHJ5ID0gZW50cnkucmVwbGFjZSgnXFwnLCAnLycpCiAgICAgICAgc2VsZi5lbnRyaWVzLmFkZChlbnRyeSkKCiAgICBkZWYgcmVtb3ZlKHNlbGYpOgogICAgICAgIGxvZ2dlci5kZWJ1ZygnUmVtb3ZpbmcgcHRoIGVudHJpZXMgZnJvbSAlczonLCBzZWxmLmZpbGUpCiAgICAgICAgd2l0aCBvcGVuKHNlbGYuZmlsZSwgJ3JiJykgYXMgZmg6CiAgICAgICAgICAgICMgd2luZG93cyB1c2VzICdcclxuJyB3aXRoIHB5M2ssIGJ1dCB1c2VzICdcbicgd2l0aCBweTIueAogICAgICAgICAgICBsaW5lcyA9IGZoLnJlYWRsaW5lcygpCiAgICAgICAgICAgIHNlbGYuX3NhdmVkX2xpbmVzID0gbGluZXMKICAgICAgICBpZiBhbnkoYidcclxuJyBpbiBsaW5lIGZvciBsaW5lIGluIGxpbmVzKToKICAgICAgICAgICAgZW5kbGluZSA9ICdcclxuJwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGVuZGxpbmUgPSAnXG4nCiAgICAgICAgZm9yIGVudHJ5IGluIHNlbGYuZW50cmllczoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdSZW1vdmluZyBlbnRyeTogJXMnLCBlbnRyeSkKICAgICAgICAgICAgICAgIGxpbmVzLnJlbW92ZSgoZW50cnkgKyBlbmRsaW5lKS5lbmNvZGUoInV0Zi04IikpCiAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgICAgcGFzcwogICAgICAgIHdpdGggb3BlbihzZWxmLmZpbGUsICd3YicpIGFzIGZoOgogICAgICAgICAgICBmaC53cml0ZWxpbmVzKGxpbmVzKQoKICAgIGRlZiByb2xsYmFjayhzZWxmKToKICAgICAgICBpZiBzZWxmLl9zYXZlZF9saW5lcyBpcyBOb25lOgogICAgICAgICAgICBsb2dnZXIuZXJyb3IoCiAgICAgICAgICAgICAgICAnQ2Fubm90IHJvbGwgYmFjayBjaGFuZ2VzIHRvICVzLCBub25lIHdlcmUgbWFkZScsIHNlbGYuZmlsZQogICAgICAgICAgICApCiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIGxvZ2dlci5kZWJ1ZygnUm9sbGluZyAlcyBiYWNrIHRvIHByZXZpb3VzIHN0YXRlJywgc2VsZi5maWxlKQogICAgICAgIHdpdGggb3BlbihzZWxmLmZpbGUsICd3YicpIGFzIGZoOgogICAgICAgICAgICBmaC53cml0ZWxpbmVzKHNlbGYuX3NhdmVkX2xpbmVzKQogICAgICAgIHJldHVybiBUcnVlClBLAwQUAAAAAAAAACEA26x39pwAAACcAAAAMAAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL3N0YXR1c19jb2Rlcy5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgpTVUNDRVNTID0gMApFUlJPUiA9IDEKVU5LTk9XTl9FUlJPUiA9IDIKVklSVFVBTEVOVl9OT1RfRk9VTkQgPSAzClBSRVZJT1VTX0JVSUxEX0RJUl9FUlJPUiA9IDQKTk9fTUFUQ0hFU19GT1VORCA9IDIzClBLAwQUAAAAAAAAACEA4Fq0vjNqAAAzagAAMgAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL3V0aWxzL19faW5pdF9fLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmZyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlcXVlCmltcG9ydCBjb250ZXh0bGliCmltcG9ydCBlcnJubwppbXBvcnQgaW8KaW1wb3J0IGxvY2FsZQojIHdlIGhhdmUgYSBzdWJtb2R1bGUgbmFtZWQgJ2xvZ2dpbmcnIHdoaWNoIHdvdWxkIHNoYWRvdyB0aGlzIGlmIHdlIHVzZWQgdGhlCiMgcmVndWxhciBuYW1lOgppbXBvcnQgbG9nZ2luZyBhcyBzdGRfbG9nZ2luZwppbXBvcnQgcmUKaW1wb3J0IG9zCmltcG9ydCBwb3NpeHBhdGgKaW1wb3J0IHNodXRpbAppbXBvcnQgc3RhdAppbXBvcnQgc3VicHJvY2VzcwppbXBvcnQgc3lzCmltcG9ydCB0YXJmaWxlCmltcG9ydCB6aXBmaWxlCgpmcm9tIHBpcC5leGNlcHRpb25zIGltcG9ydCBJbnN0YWxsYXRpb25FcnJvcgpmcm9tIHBpcC5jb21wYXQgaW1wb3J0IGNvbnNvbGVfdG9fc3RyLCBleHBhbmR1c2VyLCBzdGRsaWJfcGtncwpmcm9tIHBpcC5sb2NhdGlvbnMgaW1wb3J0ICgKICAgIHNpdGVfcGFja2FnZXMsIHVzZXJfc2l0ZSwgcnVubmluZ191bmRlcl92aXJ0dWFsZW52LCB2aXJ0dWFsZW52X25vX2dsb2JhbCwKICAgIHdyaXRlX2RlbGV0ZV9tYXJrZXJfZmlsZSwKKQpmcm9tIHBpcC5fdmVuZG9yIGltcG9ydCBwa2dfcmVzb3VyY2VzCmZyb20gcGlwLl92ZW5kb3Iuc2l4Lm1vdmVzIGltcG9ydCBpbnB1dApmcm9tIHBpcC5fdmVuZG9yLnNpeCBpbXBvcnQgUFkyCmZyb20gcGlwLl92ZW5kb3IucmV0cnlpbmcgaW1wb3J0IHJldHJ5CgppZiBQWTI6CiAgICBmcm9tIGlvIGltcG9ydCBCeXRlc0lPIGFzIFN0cmluZ0lPCmVsc2U6CiAgICBmcm9tIGlvIGltcG9ydCBTdHJpbmdJTwoKX19hbGxfXyA9IFsncm10cmVlJywgJ2Rpc3BsYXlfcGF0aCcsICdiYWNrdXBfZGlyJywKICAgICAgICAgICAnYXNrJywgJ3NwbGl0ZXh0JywKICAgICAgICAgICAnZm9ybWF0X3NpemUnLCAnaXNfaW5zdGFsbGFibGVfZGlyJywKICAgICAgICAgICAnaXNfc3ZuX3BhZ2UnLCAnZmlsZV9jb250ZW50cycsCiAgICAgICAgICAgJ3NwbGl0X2xlYWRpbmdfZGlyJywgJ2hhc19sZWFkaW5nX2RpcicsCiAgICAgICAgICAgJ25vcm1hbGl6ZV9wYXRoJywKICAgICAgICAgICAncmVuYW1lcycsICdnZXRfdGVybWluYWxfc2l6ZScsICdnZXRfcHJvZycsCiAgICAgICAgICAgJ3VuemlwX2ZpbGUnLCAndW50YXJfZmlsZScsICd1bnBhY2tfZmlsZScsICdjYWxsX3N1YnByb2Nlc3MnLAogICAgICAgICAgICdjYXB0dXJlZF9zdGRvdXQnLCAnZW5zdXJlX2RpcicsCiAgICAgICAgICAgJ0FSQ0hJVkVfRVhURU5TSU9OUycsICdTVVBQT1JURURfRVhURU5TSU9OUycsCiAgICAgICAgICAgJ2dldF9pbnN0YWxsZWRfdmVyc2lvbiddCgoKbG9nZ2VyID0gc3RkX2xvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKQloyX0VYVEVOU0lPTlMgPSAoJy50YXIuYnoyJywgJy50YnonKQpYWl9FWFRFTlNJT05TID0gKCcudGFyLnh6JywgJy50eHonLCAnLnRseicsICcudGFyLmx6JywgJy50YXIubHptYScpClpJUF9FWFRFTlNJT05TID0gKCcuemlwJywgJy53aGwnKQpUQVJfRVhURU5TSU9OUyA9ICgnLnRhci5neicsICcudGd6JywgJy50YXInKQpBUkNISVZFX0VYVEVOU0lPTlMgPSAoCiAgICBaSVBfRVhURU5TSU9OUyArIEJaMl9FWFRFTlNJT05TICsgVEFSX0VYVEVOU0lPTlMgKyBYWl9FWFRFTlNJT05TKQpTVVBQT1JURURfRVhURU5TSU9OUyA9IFpJUF9FWFRFTlNJT05TICsgVEFSX0VYVEVOU0lPTlMKdHJ5OgogICAgaW1wb3J0IGJ6MiAgIyBub3FhCiAgICBTVVBQT1JURURfRVhURU5TSU9OUyArPSBCWjJfRVhURU5TSU9OUwpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBsb2dnZXIuZGVidWcoJ2J6MiBtb2R1bGUgaXMgbm90IGF2YWlsYWJsZScpCgp0cnk6CiAgICAjIE9ubHkgZm9yIFB5dGhvbiAzLjMrCiAgICBpbXBvcnQgbHptYSAgIyBub3FhCiAgICBTVVBQT1JURURfRVhURU5TSU9OUyArPSBYWl9FWFRFTlNJT05TCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGxvZ2dlci5kZWJ1ZygnbHptYSBtb2R1bGUgaXMgbm90IGF2YWlsYWJsZScpCgoKZGVmIGltcG9ydF9vcl9yYWlzZShwa2dfb3JfbW9kdWxlX3N0cmluZywgRXhjZXB0aW9uVHlwZSwgKmFyZ3MsICoqa3dhcmdzKToKICAgIHRyeToKICAgICAgICByZXR1cm4gX19pbXBvcnRfXyhwa2dfb3JfbW9kdWxlX3N0cmluZykKICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICByYWlzZSBFeGNlcHRpb25UeXBlKCphcmdzLCAqKmt3YXJncykKCgpkZWYgZW5zdXJlX2RpcihwYXRoKToKICAgICIiIm9zLnBhdGgubWFrZWRpcnMgd2l0aG91dCBFRVhJU1QuIiIiCiAgICB0cnk6CiAgICAgICAgb3MubWFrZWRpcnMocGF0aCkKICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGU6CiAgICAgICAgaWYgZS5lcnJubyAhPSBlcnJuby5FRVhJU1Q6CiAgICAgICAgICAgIHJhaXNlCgoKZGVmIGdldF9wcm9nKCk6CiAgICB0cnk6CiAgICAgICAgaWYgb3MucGF0aC5iYXNlbmFtZShzeXMuYXJndlswXSkgaW4gKCdfX21haW5fXy5weScsICctYycpOgogICAgICAgICAgICByZXR1cm4gIiVzIC1tIHBpcCIgJSBzeXMuZXhlY3V0YWJsZQogICAgZXhjZXB0IChBdHRyaWJ1dGVFcnJvciwgVHlwZUVycm9yLCBJbmRleEVycm9yKToKICAgICAgICBwYXNzCiAgICByZXR1cm4gJ3BpcCcKCgojIFJldHJ5IGV2ZXJ5IGhhbGYgc2Vjb25kIGZvciB1cCB0byAzIHNlY29uZHMKQHJldHJ5KHN0b3BfbWF4X2RlbGF5PTMwMDAsIHdhaXRfZml4ZWQ9NTAwKQpkZWYgcm10cmVlKGRpciwgaWdub3JlX2Vycm9ycz1GYWxzZSk6CiAgICBzaHV0aWwucm10cmVlKGRpciwgaWdub3JlX2Vycm9ycz1pZ25vcmVfZXJyb3JzLAogICAgICAgICAgICAgICAgICBvbmVycm9yPXJtdHJlZV9lcnJvcmhhbmRsZXIpCgoKZGVmIHJtdHJlZV9lcnJvcmhhbmRsZXIoZnVuYywgcGF0aCwgZXhjX2luZm8pOgogICAgIiIiT24gV2luZG93cywgdGhlIGZpbGVzIGluIC5zdm4gYXJlIHJlYWQtb25seSwgc28gd2hlbiBybXRyZWUoKSB0cmllcyB0bwogICAgcmVtb3ZlIHRoZW0sIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uICBXZSBjYXRjaCB0aGF0IGhlcmUsIHJlbW92ZSB0aGUKICAgIHJlYWQtb25seSBhdHRyaWJ1dGUsIGFuZCBob3BlZnVsbHkgY29udGludWUgd2l0aG91dCBwcm9ibGVtcy4iIiIKICAgICMgaWYgZmlsZSB0eXBlIGN1cnJlbnRseSByZWFkIG9ubHkKICAgIGlmIG9zLnN0YXQocGF0aCkuc3RfbW9kZSAmIHN0YXQuU19JUkVBRDoKICAgICAgICAjIGNvbnZlcnQgdG8gcmVhZC93cml0ZQogICAgICAgIG9zLmNobW9kKHBhdGgsIHN0YXQuU19JV1JJVEUpCiAgICAgICAgIyB1c2UgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uIHRvIHJlcGVhdCB0aGUgb3BlcmF0aW9uCiAgICAgICAgZnVuYyhwYXRoKQogICAgICAgIHJldHVybgogICAgZWxzZToKICAgICAgICByYWlzZQoKCmRlZiBkaXNwbGF5X3BhdGgocGF0aCk6CiAgICAiIiJHaXZlcyB0aGUgZGlzcGxheSB2YWx1ZSBmb3IgYSBnaXZlbiBwYXRoLCBtYWtpbmcgaXQgcmVsYXRpdmUgdG8gY3dkCiAgICBpZiBwb3NzaWJsZS4iIiIKICAgIHBhdGggPSBvcy5wYXRoLm5vcm1jYXNlKG9zLnBhdGguYWJzcGF0aChwYXRoKSkKICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMjoKICAgICAgICBwYXRoID0gcGF0aC5kZWNvZGUoc3lzLmdldGZpbGVzeXN0ZW1lbmNvZGluZygpLCAncmVwbGFjZScpCiAgICAgICAgcGF0aCA9IHBhdGguZW5jb2RlKHN5cy5nZXRkZWZhdWx0ZW5jb2RpbmcoKSwgJ3JlcGxhY2UnKQogICAgaWYgcGF0aC5zdGFydHN3aXRoKG9zLmdldGN3ZCgpICsgb3MucGF0aC5zZXApOgogICAgICAgIHBhdGggPSAnLicgKyBwYXRoW2xlbihvcy5nZXRjd2QoKSk6XQogICAgcmV0dXJuIHBhdGgKCgpkZWYgYmFja3VwX2RpcihkaXIsIGV4dD0nLmJhaycpOgogICAgIiIiRmlndXJlIG91dCB0aGUgbmFtZSBvZiBhIGRpcmVjdG9yeSB0byBiYWNrIHVwIHRoZSBnaXZlbiBkaXIgdG8KICAgIChhZGRpbmcgLmJhaywgLmJhazIsIGV0YykiIiIKICAgIG4gPSAxCiAgICBleHRlbnNpb24gPSBleHQKICAgIHdoaWxlIG9zLnBhdGguZXhpc3RzKGRpciArIGV4dGVuc2lvbik6CiAgICAgICAgbiArPSAxCiAgICAgICAgZXh0ZW5zaW9uID0gZXh0ICsgc3RyKG4pCiAgICByZXR1cm4gZGlyICsgZXh0ZW5zaW9uCgoKZGVmIGFza19wYXRoX2V4aXN0cyhtZXNzYWdlLCBvcHRpb25zKToKICAgIGZvciBhY3Rpb24gaW4gb3MuZW52aXJvbi5nZXQoJ1BJUF9FWElTVFNfQUNUSU9OJywgJycpLnNwbGl0KCk6CiAgICAgICAgaWYgYWN0aW9uIGluIG9wdGlvbnM6CiAgICAgICAgICAgIHJldHVybiBhY3Rpb24KICAgIHJldHVybiBhc2sobWVzc2FnZSwgb3B0aW9ucykKCgpkZWYgYXNrKG1lc3NhZ2UsIG9wdGlvbnMpOgogICAgIiIiQXNrIHRoZSBtZXNzYWdlIGludGVyYWN0aXZlbHksIHdpdGggdGhlIGdpdmVuIHBvc3NpYmxlIHJlc3BvbnNlcyIiIgogICAgd2hpbGUgMToKICAgICAgICBpZiBvcy5lbnZpcm9uLmdldCgnUElQX05PX0lOUFVUJyk6CiAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICdObyBpbnB1dCB3YXMgZXhwZWN0ZWQgKCRQSVBfTk9fSU5QVVQgc2V0KTsgcXVlc3Rpb246ICVzJyAlCiAgICAgICAgICAgICAgICBtZXNzYWdlCiAgICAgICAgICAgICkKICAgICAgICByZXNwb25zZSA9IGlucHV0KG1lc3NhZ2UpCiAgICAgICAgcmVzcG9uc2UgPSByZXNwb25zZS5zdHJpcCgpLmxvd2VyKCkKICAgICAgICBpZiByZXNwb25zZSBub3QgaW4gb3B0aW9uczoKICAgICAgICAgICAgcHJpbnQoCiAgICAgICAgICAgICAgICAnWW91ciByZXNwb25zZSAoJXIpIHdhcyBub3Qgb25lIG9mIHRoZSBleHBlY3RlZCByZXNwb25zZXM6ICcKICAgICAgICAgICAgICAgICclcycgJSAocmVzcG9uc2UsICcsICcuam9pbihvcHRpb25zKSkKICAgICAgICAgICAgKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiByZXNwb25zZQoKCmRlZiBmb3JtYXRfc2l6ZShieXRlcyk6CiAgICBpZiBieXRlcyA+IDEwMDAgKiAxMDAwOgogICAgICAgIHJldHVybiAnJS4xZk1CJyAlIChieXRlcyAvIDEwMDAuMCAvIDEwMDApCiAgICBlbGlmIGJ5dGVzID4gMTAgKiAxMDAwOgogICAgICAgIHJldHVybiAnJWlrQicgJSAoYnl0ZXMgLyAxMDAwKQogICAgZWxpZiBieXRlcyA+IDEwMDA6CiAgICAgICAgcmV0dXJuICclLjFma0InICUgKGJ5dGVzIC8gMTAwMC4wKQogICAgZWxzZToKICAgICAgICByZXR1cm4gJyVpYnl0ZXMnICUgYnl0ZXMKCgpkZWYgaXNfaW5zdGFsbGFibGVfZGlyKHBhdGgpOgogICAgIiIiUmV0dXJuIFRydWUgaWYgYHBhdGhgIGlzIGEgZGlyZWN0b3J5IGNvbnRhaW5pbmcgYSBzZXR1cC5weSBmaWxlLiIiIgogICAgaWYgbm90IG9zLnBhdGguaXNkaXIocGF0aCk6CiAgICAgICAgcmV0dXJuIEZhbHNlCiAgICBzZXR1cF9weSA9IG9zLnBhdGguam9pbihwYXRoLCAnc2V0dXAucHknKQogICAgaWYgb3MucGF0aC5pc2ZpbGUoc2V0dXBfcHkpOgogICAgICAgIHJldHVybiBUcnVlCiAgICByZXR1cm4gRmFsc2UKCgpkZWYgaXNfc3ZuX3BhZ2UoaHRtbCk6CiAgICAiIiIKICAgIFJldHVybnMgdHJ1ZSBpZiB0aGUgcGFnZSBhcHBlYXJzIHRvIGJlIHRoZSBpbmRleCBwYWdlIG9mIGFuIHN2biByZXBvc2l0b3J5CiAgICAiIiIKICAgIHJldHVybiAocmUuc2VhcmNoKHInPHRpdGxlPltePF0qUmV2aXNpb24gXGQrOicsIGh0bWwpIGFuZAogICAgICAgICAgICByZS5zZWFyY2gocidQb3dlcmVkIGJ5ICg/OjxhW14+XSo/Pik/U3VidmVyc2lvbicsIGh0bWwsIHJlLkkpKQoKCmRlZiBmaWxlX2NvbnRlbnRzKGZpbGVuYW1lKToKICAgIHdpdGggb3BlbihmaWxlbmFtZSwgJ3JiJykgYXMgZnA6CiAgICAgICAgcmV0dXJuIGZwLnJlYWQoKS5kZWNvZGUoJ3V0Zi04JykKCgpkZWYgcmVhZF9jaHVua3MoZmlsZSwgc2l6ZT1pby5ERUZBVUxUX0JVRkZFUl9TSVpFKToKICAgICIiIllpZWxkIHBpZWNlcyBvZiBkYXRhIGZyb20gYSBmaWxlLWxpa2Ugb2JqZWN0IHVudGlsIEVPRi4iIiIKICAgIHdoaWxlIFRydWU6CiAgICAgICAgY2h1bmsgPSBmaWxlLnJlYWQoc2l6ZSkKICAgICAgICBpZiBub3QgY2h1bms6CiAgICAgICAgICAgIGJyZWFrCiAgICAgICAgeWllbGQgY2h1bmsKCgpkZWYgc3BsaXRfbGVhZGluZ19kaXIocGF0aCk6CiAgICBwYXRoID0gcGF0aC5sc3RyaXAoJy8nKS5sc3RyaXAoJ1xcJykKICAgIGlmICcvJyBpbiBwYXRoIGFuZCAoKCdcXCcgaW4gcGF0aCBhbmQgcGF0aC5maW5kKCcvJykgPCBwYXRoLmZpbmQoJ1xcJykpIG9yCiAgICAgICAgICAgICAgICAgICAgICAgICdcXCcgbm90IGluIHBhdGgpOgogICAgICAgIHJldHVybiBwYXRoLnNwbGl0KCcvJywgMSkKICAgIGVsaWYgJ1xcJyBpbiBwYXRoOgogICAgICAgIHJldHVybiBwYXRoLnNwbGl0KCdcXCcsIDEpCiAgICBlbHNlOgogICAgICAgIHJldHVybiBwYXRoLCAnJwoKCmRlZiBoYXNfbGVhZGluZ19kaXIocGF0aHMpOgogICAgIiIiUmV0dXJucyB0cnVlIGlmIGFsbCB0aGUgcGF0aHMgaGF2ZSB0aGUgc2FtZSBsZWFkaW5nIHBhdGggbmFtZQogICAgKGkuZS4sIGV2ZXJ5dGhpbmcgaXMgaW4gb25lIHN1YmRpcmVjdG9yeSBpbiBhbiBhcmNoaXZlKSIiIgogICAgY29tbW9uX3ByZWZpeCA9IE5vbmUKICAgIGZvciBwYXRoIGluIHBhdGhzOgogICAgICAgIHByZWZpeCwgcmVzdCA9IHNwbGl0X2xlYWRpbmdfZGlyKHBhdGgpCiAgICAgICAgaWYgbm90IHByZWZpeDoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgZWxpZiBjb21tb25fcHJlZml4IGlzIE5vbmU6CiAgICAgICAgICAgIGNvbW1vbl9wcmVmaXggPSBwcmVmaXgKICAgICAgICBlbGlmIHByZWZpeCAhPSBjb21tb25fcHJlZml4OgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgIHJldHVybiBUcnVlCgoKZGVmIG5vcm1hbGl6ZV9wYXRoKHBhdGgsIHJlc29sdmVfc3ltbGlua3M9VHJ1ZSk6CiAgICAiIiIKICAgIENvbnZlcnQgYSBwYXRoIHRvIGl0cyBjYW5vbmljYWwsIGNhc2Utbm9ybWFsaXplZCwgYWJzb2x1dGUgdmVyc2lvbi4KCiAgICAiIiIKICAgIHBhdGggPSBleHBhbmR1c2VyKHBhdGgpCiAgICBpZiByZXNvbHZlX3N5bWxpbmtzOgogICAgICAgIHBhdGggPSBvcy5wYXRoLnJlYWxwYXRoKHBhdGgpCiAgICBlbHNlOgogICAgICAgIHBhdGggPSBvcy5wYXRoLmFic3BhdGgocGF0aCkKICAgIHJldHVybiBvcy5wYXRoLm5vcm1jYXNlKHBhdGgpCgoKZGVmIHNwbGl0ZXh0KHBhdGgpOgogICAgIiIiTGlrZSBvcy5wYXRoLnNwbGl0ZXh0LCBidXQgdGFrZSBvZmYgLnRhciB0b28iIiIKICAgIGJhc2UsIGV4dCA9IHBvc2l4cGF0aC5zcGxpdGV4dChwYXRoKQogICAgaWYgYmFzZS5sb3dlcigpLmVuZHN3aXRoKCcudGFyJyk6CiAgICAgICAgZXh0ID0gYmFzZVstNDpdICsgZXh0CiAgICAgICAgYmFzZSA9IGJhc2VbOi00XQogICAgcmV0dXJuIGJhc2UsIGV4dAoKCmRlZiByZW5hbWVzKG9sZCwgbmV3KToKICAgICIiIkxpa2Ugb3MucmVuYW1lcygpLCBidXQgaGFuZGxlcyByZW5hbWluZyBhY3Jvc3MgZGV2aWNlcy4iIiIKICAgICMgSW1wbGVtZW50YXRpb24gYm9ycm93ZWQgZnJvbSBvcy5yZW5hbWVzKCkuCiAgICBoZWFkLCB0YWlsID0gb3MucGF0aC5zcGxpdChuZXcpCiAgICBpZiBoZWFkIGFuZCB0YWlsIGFuZCBub3Qgb3MucGF0aC5leGlzdHMoaGVhZCk6CiAgICAgICAgb3MubWFrZWRpcnMoaGVhZCkKCiAgICBzaHV0aWwubW92ZShvbGQsIG5ldykKCiAgICBoZWFkLCB0YWlsID0gb3MucGF0aC5zcGxpdChvbGQpCiAgICBpZiBoZWFkIGFuZCB0YWlsOgogICAgICAgIHRyeToKICAgICAgICAgICAgb3MucmVtb3ZlZGlycyhoZWFkKQogICAgICAgIGV4Y2VwdCBPU0Vycm9yOgogICAgICAgICAgICBwYXNzCgoKZGVmIGlzX2xvY2FsKHBhdGgpOgogICAgIiIiCiAgICBSZXR1cm4gVHJ1ZSBpZiBwYXRoIGlzIHdpdGhpbiBzeXMucHJlZml4LCBpZiB3ZSdyZSBydW5uaW5nIGluIGEgdmlydHVhbGVudi4KCiAgICBJZiB3ZSdyZSBub3QgaW4gYSB2aXJ0dWFsZW52LCBhbGwgcGF0aHMgYXJlIGNvbnNpZGVyZWQgImxvY2FsLiIKCiAgICAiIiIKICAgIGlmIG5vdCBydW5uaW5nX3VuZGVyX3ZpcnR1YWxlbnYoKToKICAgICAgICByZXR1cm4gVHJ1ZQogICAgcmV0dXJuIG5vcm1hbGl6ZV9wYXRoKHBhdGgpLnN0YXJ0c3dpdGgobm9ybWFsaXplX3BhdGgoc3lzLnByZWZpeCkpCgoKZGVmIGRpc3RfaXNfbG9jYWwoZGlzdCk6CiAgICAiIiIKICAgIFJldHVybiBUcnVlIGlmIGdpdmVuIERpc3RyaWJ1dGlvbiBvYmplY3QgaXMgaW5zdGFsbGVkIGxvY2FsbHkKICAgIChpLmUuIHdpdGhpbiBjdXJyZW50IHZpcnR1YWxlbnYpLgoKICAgIEFsd2F5cyBUcnVlIGlmIHdlJ3JlIG5vdCBpbiBhIHZpcnR1YWxlbnYuCgogICAgIiIiCiAgICByZXR1cm4gaXNfbG9jYWwoZGlzdF9sb2NhdGlvbihkaXN0KSkKCgpkZWYgZGlzdF9pbl91c2Vyc2l0ZShkaXN0KToKICAgICIiIgogICAgUmV0dXJuIFRydWUgaWYgZ2l2ZW4gRGlzdHJpYnV0aW9uIGlzIGluc3RhbGxlZCBpbiB1c2VyIHNpdGUuCiAgICAiIiIKICAgIG5vcm1fcGF0aCA9IG5vcm1hbGl6ZV9wYXRoKGRpc3RfbG9jYXRpb24oZGlzdCkpCiAgICByZXR1cm4gbm9ybV9wYXRoLnN0YXJ0c3dpdGgobm9ybWFsaXplX3BhdGgodXNlcl9zaXRlKSkKCgpkZWYgZGlzdF9pbl9zaXRlX3BhY2thZ2VzKGRpc3QpOgogICAgIiIiCiAgICBSZXR1cm4gVHJ1ZSBpZiBnaXZlbiBEaXN0cmlidXRpb24gaXMgaW5zdGFsbGVkIGluCiAgICBkaXN0dXRpbHMuc3lzY29uZmlnLmdldF9weXRob25fbGliKCkuCiAgICAiIiIKICAgIHJldHVybiBub3JtYWxpemVfcGF0aCgKICAgICAgICBkaXN0X2xvY2F0aW9uKGRpc3QpCiAgICApLnN0YXJ0c3dpdGgobm9ybWFsaXplX3BhdGgoc2l0ZV9wYWNrYWdlcykpCgoKZGVmIGRpc3RfaXNfZWRpdGFibGUoZGlzdCk6CiAgICAiIiJJcyBkaXN0cmlidXRpb24gYW4gZWRpdGFibGUgaW5zdGFsbD8iIiIKICAgIGZvciBwYXRoX2l0ZW0gaW4gc3lzLnBhdGg6CiAgICAgICAgZWdnX2xpbmsgPSBvcy5wYXRoLmpvaW4ocGF0aF9pdGVtLCBkaXN0LnByb2plY3RfbmFtZSArICcuZWdnLWxpbmsnKQogICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKGVnZ19saW5rKToKICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgIHJldHVybiBGYWxzZQoKCmRlZiBnZXRfaW5zdGFsbGVkX2Rpc3RyaWJ1dGlvbnMobG9jYWxfb25seT1UcnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXA9c3RkbGliX3BrZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZV9lZGl0YWJsZXM9VHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGl0YWJsZXNfb25seT1GYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyX29ubHk9RmFsc2UpOgogICAgIiIiCiAgICBSZXR1cm4gYSBsaXN0IG9mIGluc3RhbGxlZCBEaXN0cmlidXRpb24gb2JqZWN0cy4KCiAgICBJZiBgYGxvY2FsX29ubHlgYCBpcyBUcnVlIChkZWZhdWx0KSwgb25seSByZXR1cm4gaW5zdGFsbGF0aW9ucwogICAgbG9jYWwgdG8gdGhlIGN1cnJlbnQgdmlydHVhbGVudiwgaWYgaW4gYSB2aXJ0dWFsZW52LgoKICAgIGBgc2tpcGBgIGFyZ3VtZW50IGlzIGFuIGl0ZXJhYmxlIG9mIGxvd2VyLWNhc2UgcHJvamVjdCBuYW1lcyB0bwogICAgaWdub3JlOyBkZWZhdWx0cyB0byBzdGRsaWJfcGtncwoKICAgIElmIGBgZWRpdGFibGVzYGAgaXMgRmFsc2UsIGRvbid0IHJlcG9ydCBlZGl0YWJsZXMuCgogICAgSWYgYGBlZGl0YWJsZXNfb25seWBgIGlzIFRydWUgLCBvbmx5IHJlcG9ydCBlZGl0YWJsZXMuCgogICAgSWYgYGB1c2VyX29ubHlgYCBpcyBUcnVlICwgb25seSByZXBvcnQgaW5zdGFsbGF0aW9ucyBpbiB0aGUgdXNlcgogICAgc2l0ZSBkaXJlY3RvcnkuCgogICAgIiIiCiAgICBpZiBsb2NhbF9vbmx5OgogICAgICAgIGxvY2FsX3Rlc3QgPSBkaXN0X2lzX2xvY2FsCiAgICBlbHNlOgogICAgICAgIGRlZiBsb2NhbF90ZXN0KGQpOgogICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGlmIGluY2x1ZGVfZWRpdGFibGVzOgogICAgICAgIGRlZiBlZGl0YWJsZV90ZXN0KGQpOgogICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgZWxzZToKICAgICAgICBkZWYgZWRpdGFibGVfdGVzdChkKToKICAgICAgICAgICAgcmV0dXJuIG5vdCBkaXN0X2lzX2VkaXRhYmxlKGQpCgogICAgaWYgZWRpdGFibGVzX29ubHk6CiAgICAgICAgZGVmIGVkaXRhYmxlc19vbmx5X3Rlc3QoZCk6CiAgICAgICAgICAgIHJldHVybiBkaXN0X2lzX2VkaXRhYmxlKGQpCiAgICBlbHNlOgogICAgICAgIGRlZiBlZGl0YWJsZXNfb25seV90ZXN0KGQpOgogICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGlmIHVzZXJfb25seToKICAgICAgICB1c2VyX3Rlc3QgPSBkaXN0X2luX3VzZXJzaXRlCiAgICBlbHNlOgogICAgICAgIGRlZiB1c2VyX3Rlc3QoZCk6CiAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgcmV0dXJuIFtkIGZvciBkIGluIHBrZ19yZXNvdXJjZXMud29ya2luZ19zZXQKICAgICAgICAgICAgaWYgbG9jYWxfdGVzdChkKSBhbmQKICAgICAgICAgICAgZC5rZXkgbm90IGluIHNraXAgYW5kCiAgICAgICAgICAgIGVkaXRhYmxlX3Rlc3QoZCkgYW5kCiAgICAgICAgICAgIGVkaXRhYmxlc19vbmx5X3Rlc3QoZCkgYW5kCiAgICAgICAgICAgIHVzZXJfdGVzdChkKQogICAgICAgICAgICBdCgoKZGVmIGVnZ19saW5rX3BhdGgoZGlzdCk6CiAgICAiIiIKICAgIFJldHVybiB0aGUgcGF0aCBmb3IgdGhlIC5lZ2ctbGluayBmaWxlIGlmIGl0IGV4aXN0cywgb3RoZXJ3aXNlLCBOb25lLgoKICAgIFRoZXJlJ3MgMyBzY2VuYXJpb3M6CiAgICAxKSBub3QgaW4gYSB2aXJ0dWFsZW52CiAgICAgICB0cnkgdG8gZmluZCBpbiBzaXRlLlVTRVJfU0lURSwgdGhlbiBzaXRlX3BhY2thZ2VzCiAgICAyKSBpbiBhIG5vLWdsb2JhbCB2aXJ0dWFsZW52CiAgICAgICB0cnkgdG8gZmluZCBpbiBzaXRlX3BhY2thZ2VzCiAgICAzKSBpbiBhIHllcy1nbG9iYWwgdmlydHVhbGVudgogICAgICAgdHJ5IHRvIGZpbmQgaW4gc2l0ZV9wYWNrYWdlcywgdGhlbiBzaXRlLlVTRVJfU0lURQogICAgICAgKGRvbid0IGxvb2sgaW4gZ2xvYmFsIGxvY2F0aW9uKQoKICAgIEZvciAjMSBhbmQgIzMsIHRoZXJlIGNvdWxkIGJlIG9kZCBjYXNlcywgd2hlcmUgdGhlcmUncyBhbiBlZ2ctbGluayBpbiAyCiAgICBsb2NhdGlvbnMuCgogICAgVGhpcyBtZXRob2Qgd2lsbCBqdXN0IHJldHVybiB0aGUgZmlyc3Qgb25lIGZvdW5kLgogICAgIiIiCiAgICBzaXRlcyA9IFtdCiAgICBpZiBydW5uaW5nX3VuZGVyX3ZpcnR1YWxlbnYoKToKICAgICAgICBpZiB2aXJ0dWFsZW52X25vX2dsb2JhbCgpOgogICAgICAgICAgICBzaXRlcy5hcHBlbmQoc2l0ZV9wYWNrYWdlcykKICAgICAgICBlbHNlOgogICAgICAgICAgICBzaXRlcy5hcHBlbmQoc2l0ZV9wYWNrYWdlcykKICAgICAgICAgICAgaWYgdXNlcl9zaXRlOgogICAgICAgICAgICAgICAgc2l0ZXMuYXBwZW5kKHVzZXJfc2l0ZSkKICAgIGVsc2U6CiAgICAgICAgaWYgdXNlcl9zaXRlOgogICAgICAgICAgICBzaXRlcy5hcHBlbmQodXNlcl9zaXRlKQogICAgICAgIHNpdGVzLmFwcGVuZChzaXRlX3BhY2thZ2VzKQoKICAgIGZvciBzaXRlIGluIHNpdGVzOgogICAgICAgIGVnZ2xpbmsgPSBvcy5wYXRoLmpvaW4oc2l0ZSwgZGlzdC5wcm9qZWN0X25hbWUpICsgJy5lZ2ctbGluaycKICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShlZ2dsaW5rKToKICAgICAgICAgICAgcmV0dXJuIGVnZ2xpbmsKCgpkZWYgZGlzdF9sb2NhdGlvbihkaXN0KToKICAgICIiIgogICAgR2V0IHRoZSBzaXRlLXBhY2thZ2VzIGxvY2F0aW9uIG9mIHRoaXMgZGlzdHJpYnV0aW9uLiBHZW5lcmFsbHkKICAgIHRoaXMgaXMgZGlzdC5sb2NhdGlvbiwgZXhjZXB0IGluIHRoZSBjYXNlIG9mIGRldmVsb3AtaW5zdGFsbGVkCiAgICBwYWNrYWdlcywgd2hlcmUgZGlzdC5sb2NhdGlvbiBpcyB0aGUgc291cmNlIGNvZGUgbG9jYXRpb24sIGFuZCB3ZQogICAgd2FudCB0byBrbm93IHdoZXJlIHRoZSBlZ2ctbGluayBmaWxlIGlzLgoKICAgICIiIgogICAgZWdnX2xpbmsgPSBlZ2dfbGlua19wYXRoKGRpc3QpCiAgICBpZiBlZ2dfbGluazoKICAgICAgICByZXR1cm4gZWdnX2xpbmsKICAgIHJldHVybiBkaXN0LmxvY2F0aW9uCgoKZGVmIGdldF90ZXJtaW5hbF9zaXplKCk6CiAgICAiIiJSZXR1cm5zIGEgdHVwbGUgKHgsIHkpIHJlcHJlc2VudGluZyB0aGUgd2lkdGgoeCkgYW5kIHRoZSBoZWlnaHQoeCkKICAgIGluIGNoYXJhY3RlcnMgb2YgdGhlIHRlcm1pbmFsIHdpbmRvdy4iIiIKICAgIGRlZiBpb2N0bF9HV0lOU1ooZmQpOgogICAgICAgIHRyeToKICAgICAgICAgICAgaW1wb3J0IGZjbnRsCiAgICAgICAgICAgIGltcG9ydCB0ZXJtaW9zCiAgICAgICAgICAgIGltcG9ydCBzdHJ1Y3QKICAgICAgICAgICAgY3IgPSBzdHJ1Y3QudW5wYWNrKAogICAgICAgICAgICAgICAgJ2hoJywKICAgICAgICAgICAgICAgIGZjbnRsLmlvY3RsKGZkLCB0ZXJtaW9zLlRJT0NHV0lOU1osICcxMjM0JykKICAgICAgICAgICAgKQogICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICBpZiBjciA9PSAoMCwgMCk6CiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgcmV0dXJuIGNyCiAgICBjciA9IGlvY3RsX0dXSU5TWigwKSBvciBpb2N0bF9HV0lOU1ooMSkgb3IgaW9jdGxfR1dJTlNaKDIpCiAgICBpZiBub3QgY3I6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBmZCA9IG9zLm9wZW4ob3MuY3Rlcm1pZCgpLCBvcy5PX1JET05MWSkKICAgICAgICAgICAgY3IgPSBpb2N0bF9HV0lOU1ooZmQpCiAgICAgICAgICAgIG9zLmNsb3NlKGZkKQogICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgcGFzcwogICAgaWYgbm90IGNyOgogICAgICAgIGNyID0gKG9zLmVudmlyb24uZ2V0KCdMSU5FUycsIDI1KSwgb3MuZW52aXJvbi5nZXQoJ0NPTFVNTlMnLCA4MCkpCiAgICByZXR1cm4gaW50KGNyWzFdKSwgaW50KGNyWzBdKQoKCmRlZiBjdXJyZW50X3VtYXNrKCk6CiAgICAiIiJHZXQgdGhlIGN1cnJlbnQgdW1hc2sgd2hpY2ggaW52b2x2ZXMgaGF2aW5nIHRvIHNldCBpdCB0ZW1wb3JhcmlseS4iIiIKICAgIG1hc2sgPSBvcy51bWFzaygwKQogICAgb3MudW1hc2sobWFzaykKICAgIHJldHVybiBtYXNrCgoKZGVmIHVuemlwX2ZpbGUoZmlsZW5hbWUsIGxvY2F0aW9uLCBmbGF0dGVuPVRydWUpOgogICAgIiIiCiAgICBVbnppcCB0aGUgZmlsZSAod2l0aCBwYXRoIGBmaWxlbmFtZWApIHRvIHRoZSBkZXN0aW5hdGlvbiBgbG9jYXRpb25gLiAgQWxsCiAgICBmaWxlcyBhcmUgd3JpdHRlbiBiYXNlZCBvbiBzeXN0ZW0gZGVmYXVsdHMgYW5kIHVtYXNrIChpLmUuIHBlcm1pc3Npb25zIGFyZQogICAgbm90IHByZXNlcnZlZCksIGV4Y2VwdCB0aGF0IHJlZ3VsYXIgZmlsZSBtZW1iZXJzIHdpdGggYW55IGV4ZWN1dGUKICAgIHBlcm1pc3Npb25zICh1c2VyLCBncm91cCwgb3Igd29ybGQpIGhhdmUgImNobW9kICt4IiBhcHBsaWVkIGFmdGVyIGJlaW5nCiAgICB3cml0dGVuLiBOb3RlIHRoYXQgZm9yIHdpbmRvd3MsIGFueSBleGVjdXRlIGNoYW5nZXMgdXNpbmcgb3MuY2htb2QgYXJlCiAgICBuby1vcHMgcGVyIHRoZSBweXRob24gZG9jcy4KICAgICIiIgogICAgZW5zdXJlX2Rpcihsb2NhdGlvbikKICAgIHppcGZwID0gb3BlbihmaWxlbmFtZSwgJ3JiJykKICAgIHRyeToKICAgICAgICB6aXAgPSB6aXBmaWxlLlppcEZpbGUoemlwZnAsIGFsbG93WmlwNjQ9VHJ1ZSkKICAgICAgICBsZWFkaW5nID0gaGFzX2xlYWRpbmdfZGlyKHppcC5uYW1lbGlzdCgpKSBhbmQgZmxhdHRlbgogICAgICAgIGZvciBpbmZvIGluIHppcC5pbmZvbGlzdCgpOgogICAgICAgICAgICBuYW1lID0gaW5mby5maWxlbmFtZQogICAgICAgICAgICBkYXRhID0gemlwLnJlYWQobmFtZSkKICAgICAgICAgICAgZm4gPSBuYW1lCiAgICAgICAgICAgIGlmIGxlYWRpbmc6CiAgICAgICAgICAgICAgICBmbiA9IHNwbGl0X2xlYWRpbmdfZGlyKG5hbWUpWzFdCiAgICAgICAgICAgIGZuID0gb3MucGF0aC5qb2luKGxvY2F0aW9uLCBmbikKICAgICAgICAgICAgZGlyID0gb3MucGF0aC5kaXJuYW1lKGZuKQogICAgICAgICAgICBpZiBmbi5lbmRzd2l0aCgnLycpIG9yIGZuLmVuZHN3aXRoKCdcXCcpOgogICAgICAgICAgICAgICAgIyBBIGRpcmVjdG9yeQogICAgICAgICAgICAgICAgZW5zdXJlX2RpcihmbikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGVuc3VyZV9kaXIoZGlyKQogICAgICAgICAgICAgICAgZnAgPSBvcGVuKGZuLCAnd2InKQogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIGZwLndyaXRlKGRhdGEpCiAgICAgICAgICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgICAgICAgIGZwLmNsb3NlKCkKICAgICAgICAgICAgICAgICAgICBtb2RlID0gaW5mby5leHRlcm5hbF9hdHRyID4+IDE2CiAgICAgICAgICAgICAgICAgICAgIyBpZiBtb2RlIGFuZCByZWd1bGFyIGZpbGUgYW5kIGFueSBleGVjdXRlIHBlcm1pc3Npb25zIGZvcgogICAgICAgICAgICAgICAgICAgICMgdXNlci9ncm91cC93b3JsZD8KICAgICAgICAgICAgICAgICAgICBpZiBtb2RlIGFuZCBzdGF0LlNfSVNSRUcobW9kZSkgYW5kIG1vZGUgJiAwbzExMToKICAgICAgICAgICAgICAgICAgICAgICAgIyBtYWtlIGRlc3QgZmlsZSBoYXZlIGV4ZWN1dGUgZm9yIHVzZXIvZ3JvdXAvd29ybGQKICAgICAgICAgICAgICAgICAgICAgICAgIyAoY2htb2QgK3gpIG5vLW9wIG9uIHdpbmRvd3MgcGVyIHB5dGhvbiBkb2NzCiAgICAgICAgICAgICAgICAgICAgICAgIG9zLmNobW9kKGZuLCAoMG83NzcgLSBjdXJyZW50X3VtYXNrKCkgfCAwbzExMSkpCiAgICBmaW5hbGx5OgogICAgICAgIHppcGZwLmNsb3NlKCkKCgpkZWYgdW50YXJfZmlsZShmaWxlbmFtZSwgbG9jYXRpb24pOgogICAgIiIiCiAgICBVbnRhciB0aGUgZmlsZSAod2l0aCBwYXRoIGBmaWxlbmFtZWApIHRvIHRoZSBkZXN0aW5hdGlvbiBgbG9jYXRpb25gLgogICAgQWxsIGZpbGVzIGFyZSB3cml0dGVuIGJhc2VkIG9uIHN5c3RlbSBkZWZhdWx0cyBhbmQgdW1hc2sgKGkuZS4gcGVybWlzc2lvbnMKICAgIGFyZSBub3QgcHJlc2VydmVkKSwgZXhjZXB0IHRoYXQgcmVndWxhciBmaWxlIG1lbWJlcnMgd2l0aCBhbnkgZXhlY3V0ZQogICAgcGVybWlzc2lvbnMgKHVzZXIsIGdyb3VwLCBvciB3b3JsZCkgaGF2ZSAiY2htb2QgK3giIGFwcGxpZWQgYWZ0ZXIgYmVpbmcKICAgIHdyaXR0ZW4uICBOb3RlIHRoYXQgZm9yIHdpbmRvd3MsIGFueSBleGVjdXRlIGNoYW5nZXMgdXNpbmcgb3MuY2htb2QgYXJlCiAgICBuby1vcHMgcGVyIHRoZSBweXRob24gZG9jcy4KICAgICIiIgogICAgZW5zdXJlX2Rpcihsb2NhdGlvbikKICAgIGlmIGZpbGVuYW1lLmxvd2VyKCkuZW5kc3dpdGgoJy5neicpIG9yIGZpbGVuYW1lLmxvd2VyKCkuZW5kc3dpdGgoJy50Z3onKToKICAgICAgICBtb2RlID0gJ3I6Z3onCiAgICBlbGlmIGZpbGVuYW1lLmxvd2VyKCkuZW5kc3dpdGgoQloyX0VYVEVOU0lPTlMpOgogICAgICAgIG1vZGUgPSAncjpiejInCiAgICBlbGlmIGZpbGVuYW1lLmxvd2VyKCkuZW5kc3dpdGgoWFpfRVhURU5TSU9OUyk6CiAgICAgICAgbW9kZSA9ICdyOnh6JwogICAgZWxpZiBmaWxlbmFtZS5sb3dlcigpLmVuZHN3aXRoKCcudGFyJyk6CiAgICAgICAgbW9kZSA9ICdyJwogICAgZWxzZToKICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgJ0Nhbm5vdCBkZXRlcm1pbmUgY29tcHJlc3Npb24gdHlwZSBmb3IgZmlsZSAlcycsIGZpbGVuYW1lLAogICAgICAgICkKICAgICAgICBtb2RlID0gJ3I6KicKICAgIHRhciA9IHRhcmZpbGUub3BlbihmaWxlbmFtZSwgbW9kZSkKICAgIHRyeToKICAgICAgICAjIG5vdGU6IHB5dGhvbjw9Mi41IGRvZXNuJ3Qgc2VlbSB0byBrbm93IGFib3V0IHBheCBoZWFkZXJzLCBmaWx0ZXIgdGhlbQogICAgICAgIGxlYWRpbmcgPSBoYXNfbGVhZGluZ19kaXIoWwogICAgICAgICAgICBtZW1iZXIubmFtZSBmb3IgbWVtYmVyIGluIHRhci5nZXRtZW1iZXJzKCkKICAgICAgICAgICAgaWYgbWVtYmVyLm5hbWUgIT0gJ3BheF9nbG9iYWxfaGVhZGVyJwogICAgICAgIF0pCiAgICAgICAgZm9yIG1lbWJlciBpbiB0YXIuZ2V0bWVtYmVycygpOgogICAgICAgICAgICBmbiA9IG1lbWJlci5uYW1lCiAgICAgICAgICAgIGlmIGZuID09ICdwYXhfZ2xvYmFsX2hlYWRlcic6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBpZiBsZWFkaW5nOgogICAgICAgICAgICAgICAgZm4gPSBzcGxpdF9sZWFkaW5nX2RpcihmbilbMV0KICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihsb2NhdGlvbiwgZm4pCiAgICAgICAgICAgIGlmIG1lbWJlci5pc2RpcigpOgogICAgICAgICAgICAgICAgZW5zdXJlX2RpcihwYXRoKQogICAgICAgICAgICBlbGlmIG1lbWJlci5pc3N5bSgpOgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIHRhci5fZXh0cmFjdF9tZW1iZXIobWVtYmVyLCBwYXRoKQogICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBleGM6CiAgICAgICAgICAgICAgICAgICAgIyBTb21lIGNvcnJ1cHQgdGFyIGZpbGVzIHNlZW0gdG8gcHJvZHVjZSB0aGlzCiAgICAgICAgICAgICAgICAgICAgIyAoc3BlY2lmaWNhbGx5IGJhZCBzeW1saW5rcykKICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICAgICAgICAgJ0luIHRoZSB0YXIgZmlsZSAlcyB0aGUgbWVtYmVyICVzIGlzIGludmFsaWQ6ICVzJywKICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUsIG1lbWJlci5uYW1lLCBleGMsCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgZnAgPSB0YXIuZXh0cmFjdGZpbGUobWVtYmVyKQogICAgICAgICAgICAgICAgZXhjZXB0IChLZXlFcnJvciwgQXR0cmlidXRlRXJyb3IpIGFzIGV4YzoKICAgICAgICAgICAgICAgICAgICAjIFNvbWUgY29ycnVwdCB0YXIgZmlsZXMgc2VlbSB0byBwcm9kdWNlIHRoaXMKICAgICAgICAgICAgICAgICAgICAjIChzcGVjaWZpY2FsbHkgYmFkIHN5bWxpbmtzKQogICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgICAgICAgICAnSW4gdGhlIHRhciBmaWxlICVzIHRoZSBtZW1iZXIgJXMgaXMgaW52YWxpZDogJXMnLAogICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSwgbWVtYmVyLm5hbWUsIGV4YywKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIGVuc3VyZV9kaXIob3MucGF0aC5kaXJuYW1lKHBhdGgpKQogICAgICAgICAgICAgICAgd2l0aCBvcGVuKHBhdGgsICd3YicpIGFzIGRlc3RmcDoKICAgICAgICAgICAgICAgICAgICBzaHV0aWwuY29weWZpbGVvYmooZnAsIGRlc3RmcCkKICAgICAgICAgICAgICAgIGZwLmNsb3NlKCkKICAgICAgICAgICAgICAgICMgVXBkYXRlIHRoZSB0aW1lc3RhbXAgKHVzZWZ1bCBmb3IgY3l0aG9uIGNvbXBpbGVkIGZpbGVzKQogICAgICAgICAgICAgICAgdGFyLnV0aW1lKG1lbWJlciwgcGF0aCkKICAgICAgICAgICAgICAgICMgbWVtYmVyIGhhdmUgYW55IGV4ZWN1dGUgcGVybWlzc2lvbnMgZm9yIHVzZXIvZ3JvdXAvd29ybGQ/CiAgICAgICAgICAgICAgICBpZiBtZW1iZXIubW9kZSAmIDBvMTExOgogICAgICAgICAgICAgICAgICAgICMgbWFrZSBkZXN0IGZpbGUgaGF2ZSBleGVjdXRlIGZvciB1c2VyL2dyb3VwL3dvcmxkCiAgICAgICAgICAgICAgICAgICAgIyBuby1vcCBvbiB3aW5kb3dzIHBlciBweXRob24gZG9jcwogICAgICAgICAgICAgICAgICAgIG9zLmNobW9kKHBhdGgsICgwbzc3NyAtIGN1cnJlbnRfdW1hc2soKSB8IDBvMTExKSkKICAgIGZpbmFsbHk6CiAgICAgICAgdGFyLmNsb3NlKCkKCgpkZWYgdW5wYWNrX2ZpbGUoZmlsZW5hbWUsIGxvY2F0aW9uLCBjb250ZW50X3R5cGUsIGxpbmspOgogICAgZmlsZW5hbWUgPSBvcy5wYXRoLnJlYWxwYXRoKGZpbGVuYW1lKQogICAgaWYgKGNvbnRlbnRfdHlwZSA9PSAnYXBwbGljYXRpb24vemlwJyBvcgogICAgICAgICAgICBmaWxlbmFtZS5sb3dlcigpLmVuZHN3aXRoKFpJUF9FWFRFTlNJT05TKSBvcgogICAgICAgICAgICB6aXBmaWxlLmlzX3ppcGZpbGUoZmlsZW5hbWUpKToKICAgICAgICB1bnppcF9maWxlKAogICAgICAgICAgICBmaWxlbmFtZSwKICAgICAgICAgICAgbG9jYXRpb24sCiAgICAgICAgICAgIGZsYXR0ZW49bm90IGZpbGVuYW1lLmVuZHN3aXRoKCcud2hsJykKICAgICAgICApCiAgICBlbGlmIChjb250ZW50X3R5cGUgPT0gJ2FwcGxpY2F0aW9uL3gtZ3ppcCcgb3IKICAgICAgICAgICAgdGFyZmlsZS5pc190YXJmaWxlKGZpbGVuYW1lKSBvcgogICAgICAgICAgICBmaWxlbmFtZS5sb3dlcigpLmVuZHN3aXRoKAogICAgICAgICAgICAgICAgVEFSX0VYVEVOU0lPTlMgKyBCWjJfRVhURU5TSU9OUyArIFhaX0VYVEVOU0lPTlMpKToKICAgICAgICB1bnRhcl9maWxlKGZpbGVuYW1lLCBsb2NhdGlvbikKICAgIGVsaWYgKGNvbnRlbnRfdHlwZSBhbmQgY29udGVudF90eXBlLnN0YXJ0c3dpdGgoJ3RleHQvaHRtbCcpIGFuZAogICAgICAgICAgICBpc19zdm5fcGFnZShmaWxlX2NvbnRlbnRzKGZpbGVuYW1lKSkpOgogICAgICAgICMgV2UgZG9uJ3QgcmVhbGx5IGNhcmUgYWJvdXQgdGhpcwogICAgICAgIGZyb20gcGlwLnZjcy5zdWJ2ZXJzaW9uIGltcG9ydCBTdWJ2ZXJzaW9uCiAgICAgICAgU3VidmVyc2lvbignc3ZuKycgKyBsaW5rLnVybCkudW5wYWNrKGxvY2F0aW9uKQogICAgZWxzZToKICAgICAgICAjIEZJWE1FOiBoYW5kbGU/CiAgICAgICAgIyBGSVhNRTogbWFnaWMgc2lnbmF0dXJlcz8KICAgICAgICBsb2dnZXIuY3JpdGljYWwoCiAgICAgICAgICAgICdDYW5ub3QgdW5wYWNrIGZpbGUgJXMgKGRvd25sb2FkZWQgZnJvbSAlcywgY29udGVudC10eXBlOiAlcyk7ICcKICAgICAgICAgICAgJ2Nhbm5vdCBkZXRlY3QgYXJjaGl2ZSBmb3JtYXQnLAogICAgICAgICAgICBmaWxlbmFtZSwgbG9jYXRpb24sIGNvbnRlbnRfdHlwZSwKICAgICAgICApCiAgICAgICAgcmFpc2UgSW5zdGFsbGF0aW9uRXJyb3IoCiAgICAgICAgICAgICdDYW5ub3QgZGV0ZXJtaW5lIGFyY2hpdmUgZm9ybWF0IG9mICVzJyAlIGxvY2F0aW9uCiAgICAgICAgKQoKCmRlZiBjYWxsX3N1YnByb2Nlc3MoY21kLCBzaG93X3N0ZG91dD1UcnVlLCBjd2Q9Tm9uZSwKICAgICAgICAgICAgICAgICAgICBvbl9yZXR1cm5jb2RlPSdyYWlzZScsCiAgICAgICAgICAgICAgICAgICAgY29tbWFuZF9kZXNjPU5vbmUsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFfZW52aXJvbj1Ob25lLCBzcGlubmVyPU5vbmUpOgogICAgIyBUaGlzIGZ1bmN0aW9uJ3MgaGFuZGxpbmcgb2Ygc3VicHJvY2VzcyBvdXRwdXQgaXMgY29uZnVzaW5nIGFuZCBJCiAgICAjIHByZXZpb3VzbHkgYnJva2UgaXQgdGVycmlibHksIHNvIGFzIHBlbmFuY2UgSSB3aWxsIHdyaXRlIGEgbG9uZyBjb21tZW50CiAgICAjIGV4cGxhaW5pbmcgdGhpbmdzLgogICAgIwogICAgIyBUaGUgb2J2aW91cyB0aGluZyB0aGF0IGFmZmVjdHMgb3V0cHV0IGlzIHRoZSBzaG93X3N0ZG91dD0KICAgICMga3dhcmcuIHNob3dfc3Rkb3V0PVRydWUgbWVhbnMsIGxldCB0aGUgc3VicHJvY2VzcyB3cml0ZSBkaXJlY3RseSB0byBvdXIKICAgICMgc3Rkb3V0LiBFdmVuIHRob3VnaCBpdCBpcyBub21pbmFsbHkgdGhlIGRlZmF1bHQsIGl0IGlzIGFsbW9zdCBuZXZlciB1c2VkCiAgICAjIGluc2lkZSBwaXAgKGFuZCBzaG91bGQgbm90IGJlIHVzZWQgaW4gbmV3IGNvZGUgd2l0aG91dCBhIHZlcnkgZ29vZAogICAgIyByZWFzb24pOyBhcyBvZiAyMDE2LTAyLTIyIGl0IGlzIG9ubHkgdXNlZCBpbiBhIGZldyBwbGFjZXMgaW5zaWRlIHRoZSBWQ1MKICAgICMgd3JhcHBlciBjb2RlLiBJZGVhbGx5IHdlIHNob3VsZCBnZXQgcmlkIG9mIGl0IGVudGlyZWx5LCBiZWNhdXNlIGl0CiAgICAjIGNyZWF0ZXMgYSBsb3Qgb2YgY29tcGxleGl0eSBoZXJlIGZvciBhIHJhcmVseSB1c2VkIGZlYXR1cmUuCiAgICAjCiAgICAjIE1vc3QgcGxhY2VzIGluIHBpcCBzZXQgc2hvd19zdGRvdXQ9RmFsc2UuIFdoYXQgdGhpcyBtZWFucyBpczoKICAgICMgLSBXZSBjb25uZWN0IHRoZSBjaGlsZCBzdGRvdXQgdG8gYSBwaXBlLCB3aGljaCB3ZSByZWFkLgogICAgIyAtIEJ5IGRlZmF1bHQsIHdlIGhpZGUgdGhlIG91dHB1dCBidXQgc2hvdyBhIHNwaW5uZXIgLS0gdW5sZXNzIHRoZQogICAgIyAgIHN1YnByb2Nlc3MgZXhpdHMgd2l0aCBhbiBlcnJvciwgaW4gd2hpY2ggY2FzZSB3ZSBzaG93IHRoZSBvdXRwdXQuCiAgICAjIC0gSWYgdGhlIC0tdmVyYm9zZSBvcHRpb24gd2FzIHBhc3NlZCAoPSBsb2dsZXZlbCBpcyBERUJVRyksIHRoZW4gd2Ugc2hvdwogICAgIyAgIHRoZSBvdXRwdXQgdW5jb25kaXRpb25hbGx5LiAoQnV0IGluIHRoaXMgY2FzZSB3ZSBkb24ndCB3YW50IHRvIHNob3cKICAgICMgICB0aGUgb3V0cHV0IGEgc2Vjb25kIHRpbWUgaWYgaXQgdHVybnMgb3V0IHRoYXQgdGhlcmUgd2FzIGFuIGVycm9yLikKICAgICMKICAgICMgc3RkZXJyIGlzIGFsd2F5cyBtZXJnZWQgd2l0aCBzdGRvdXQgKGV2ZW4gaWYgc2hvd19zdGRvdXQ9VHJ1ZSkuCiAgICBpZiBzaG93X3N0ZG91dDoKICAgICAgICBzdGRvdXQgPSBOb25lCiAgICBlbHNlOgogICAgICAgIHN0ZG91dCA9IHN1YnByb2Nlc3MuUElQRQogICAgaWYgY29tbWFuZF9kZXNjIGlzIE5vbmU6CiAgICAgICAgY21kX3BhcnRzID0gW10KICAgICAgICBmb3IgcGFydCBpbiBjbWQ6CiAgICAgICAgICAgIGlmICcgJyBpbiBwYXJ0IG9yICdcbicgaW4gcGFydCBvciAnIicgaW4gcGFydCBvciAiJyIgaW4gcGFydDoKICAgICAgICAgICAgICAgIHBhcnQgPSAnIiVzIicgJSBwYXJ0LnJlcGxhY2UoJyInLCAnXFwiJykKICAgICAgICAgICAgY21kX3BhcnRzLmFwcGVuZChwYXJ0KQogICAgICAgIGNvbW1hbmRfZGVzYyA9ICcgJy5qb2luKGNtZF9wYXJ0cykKICAgIGxvZ2dlci5kZWJ1ZygiUnVubmluZyBjb21tYW5kICVzIiwgY29tbWFuZF9kZXNjKQogICAgZW52ID0gb3MuZW52aXJvbi5jb3B5KCkKICAgIGlmIGV4dHJhX2Vudmlyb246CiAgICAgICAgZW52LnVwZGF0ZShleHRyYV9lbnZpcm9uKQogICAgdHJ5OgogICAgICAgIHByb2MgPSBzdWJwcm9jZXNzLlBvcGVuKAogICAgICAgICAgICBjbWQsIHN0ZGVycj1zdWJwcm9jZXNzLlNURE9VVCwgc3RkaW49Tm9uZSwgc3Rkb3V0PXN0ZG91dCwKICAgICAgICAgICAgY3dkPWN3ZCwgZW52PWVudikKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXhjOgogICAgICAgIGxvZ2dlci5jcml0aWNhbCgKICAgICAgICAgICAgIkVycm9yICVzIHdoaWxlIGV4ZWN1dGluZyBjb21tYW5kICVzIiwgZXhjLCBjb21tYW5kX2Rlc2MsCiAgICAgICAgKQogICAgICAgIHJhaXNlCiAgICBpZiBzdGRvdXQgaXMgbm90IE5vbmU6CiAgICAgICAgYWxsX291dHB1dCA9IFtdCiAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgbGluZSA9IGNvbnNvbGVfdG9fc3RyKHByb2Muc3Rkb3V0LnJlYWRsaW5lKCkpCiAgICAgICAgICAgIGlmIG5vdCBsaW5lOgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgbGluZSA9IGxpbmUucnN0cmlwKCkKICAgICAgICAgICAgYWxsX291dHB1dC5hcHBlbmQobGluZSArICdcbicpCiAgICAgICAgICAgIGlmIGxvZ2dlci5nZXRFZmZlY3RpdmVMZXZlbCgpIDw9IHN0ZF9sb2dnaW5nLkRFQlVHOgogICAgICAgICAgICAgICAgIyBTaG93IHRoZSBsaW5lIGltbWVkaWF0ZWx5CiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcobGluZSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgVXBkYXRlIHRoZSBzcGlubmVyCiAgICAgICAgICAgICAgICBpZiBzcGlubmVyIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgIHNwaW5uZXIuc3BpbigpCiAgICBwcm9jLndhaXQoKQogICAgaWYgc3Bpbm5lciBpcyBub3QgTm9uZToKICAgICAgICBpZiBwcm9jLnJldHVybmNvZGU6CiAgICAgICAgICAgIHNwaW5uZXIuZmluaXNoKCJlcnJvciIpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc3Bpbm5lci5maW5pc2goImRvbmUiKQogICAgaWYgcHJvYy5yZXR1cm5jb2RlOgogICAgICAgIGlmIG9uX3JldHVybmNvZGUgPT0gJ3JhaXNlJzoKICAgICAgICAgICAgaWYgKGxvZ2dlci5nZXRFZmZlY3RpdmVMZXZlbCgpID4gc3RkX2xvZ2dpbmcuREVCVUcgYW5kCiAgICAgICAgICAgICAgICAgICAgbm90IHNob3dfc3Rkb3V0KToKICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKAogICAgICAgICAgICAgICAgICAgICdDb21wbGV0ZSBvdXRwdXQgZnJvbSBjb21tYW5kICVzOicsIGNvbW1hbmRfZGVzYywKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKAogICAgICAgICAgICAgICAgICAgICcnLmpvaW4oYWxsX291dHB1dCkgKwogICAgICAgICAgICAgICAgICAgICdcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHJhaXNlIEluc3RhbGxhdGlvbkVycm9yKAogICAgICAgICAgICAgICAgJ0NvbW1hbmQgIiVzIiBmYWlsZWQgd2l0aCBlcnJvciBjb2RlICVzIGluICVzJwogICAgICAgICAgICAgICAgJSAoY29tbWFuZF9kZXNjLCBwcm9jLnJldHVybmNvZGUsIGN3ZCkpCiAgICAgICAgZWxpZiBvbl9yZXR1cm5jb2RlID09ICd3YXJuJzoKICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICAgICAnQ29tbWFuZCAiJXMiIGhhZCBlcnJvciBjb2RlICVzIGluICVzJywKICAgICAgICAgICAgICAgIGNvbW1hbmRfZGVzYywgcHJvYy5yZXR1cm5jb2RlLCBjd2QsCiAgICAgICAgICAgICkKICAgICAgICBlbGlmIG9uX3JldHVybmNvZGUgPT0gJ2lnbm9yZSc6CiAgICAgICAgICAgIHBhc3MKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdJbnZhbGlkIHZhbHVlOiBvbl9yZXR1cm5jb2RlPSVzJyAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwcihvbl9yZXR1cm5jb2RlKSkKICAgIGlmIG5vdCBzaG93X3N0ZG91dDoKICAgICAgICByZXR1cm4gJycuam9pbihhbGxfb3V0cHV0KQoKCmRlZiByZWFkX3RleHRfZmlsZShmaWxlbmFtZSk6CiAgICAiIiJSZXR1cm4gdGhlIGNvbnRlbnRzIG9mICpmaWxlbmFtZSouCgogICAgVHJ5IHRvIGRlY29kZSB0aGUgZmlsZSBjb250ZW50cyB3aXRoIHV0Zi04LCB0aGUgcHJlZmVycmVkIHN5c3RlbSBlbmNvZGluZwogICAgKGUuZy4sIGNwMTI1MiBvbiBzb21lIFdpbmRvd3MgbWFjaGluZXMpLCBhbmQgbGF0aW4xLCBpbiB0aGF0IG9yZGVyLgogICAgRGVjb2RpbmcgYSBieXRlIHN0cmluZyB3aXRoIGxhdGluMSB3aWxsIG5ldmVyIHJhaXNlIGFuIGVycm9yLiBJbiB0aGUgd29yc3QKICAgIGNhc2UsIHRoZSByZXR1cm5lZCBzdHJpbmcgd2lsbCBjb250YWluIHNvbWUgZ2FyYmFnZSBjaGFyYWN0ZXJzLgoKICAgICIiIgogICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAncmInKSBhcyBmcDoKICAgICAgICBkYXRhID0gZnAucmVhZCgpCgogICAgZW5jb2RpbmdzID0gWyd1dGYtOCcsIGxvY2FsZS5nZXRwcmVmZXJyZWRlbmNvZGluZyhGYWxzZSksICdsYXRpbjEnXQogICAgZm9yIGVuYyBpbiBlbmNvZGluZ3M6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBkYXRhID0gZGF0YS5kZWNvZGUoZW5jKQogICAgICAgIGV4Y2VwdCBVbmljb2RlRGVjb2RlRXJyb3I6CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgYnJlYWsKCiAgICBhc3NlcnQgdHlwZShkYXRhKSAhPSBieXRlcyAgIyBMYXRpbjEgc2hvdWxkIGhhdmUgd29ya2VkLgogICAgcmV0dXJuIGRhdGEKCgpkZWYgX21ha2VfYnVpbGRfZGlyKGJ1aWxkX2Rpcik6CiAgICBvcy5tYWtlZGlycyhidWlsZF9kaXIpCiAgICB3cml0ZV9kZWxldGVfbWFya2VyX2ZpbGUoYnVpbGRfZGlyKQoKCmNsYXNzIEZha2VGaWxlKG9iamVjdCk6CiAgICAiIiJXcmFwIGEgbGlzdCBvZiBsaW5lcyBpbiBhbiBvYmplY3Qgd2l0aCByZWFkbGluZSgpIHRvIG1ha2UKICAgIENvbmZpZ1BhcnNlciBoYXBweS4iIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsaW5lcyk6CiAgICAgICAgc2VsZi5fZ2VuID0gKGwgZm9yIGwgaW4gbGluZXMpCgogICAgZGVmIHJlYWRsaW5lKHNlbGYpOgogICAgICAgIHRyeToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcmV0dXJuIG5leHQoc2VsZi5fZ2VuKQogICAgICAgICAgICBleGNlcHQgTmFtZUVycm9yOgogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2dlbi5uZXh0KCkKICAgICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKICAgICAgICAgICAgcmV0dXJuICcnCgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9nZW4KCgpjbGFzcyBTdHJlYW1XcmFwcGVyKFN0cmluZ0lPKToKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBmcm9tX3N0cmVhbShjbHMsIG9yaWdfc3RyZWFtKToKICAgICAgICBjbHMub3JpZ19zdHJlYW0gPSBvcmlnX3N0cmVhbQogICAgICAgIHJldHVybiBjbHMoKQoKICAgICMgY29tcGlsZWFsbC5jb21waWxlX2RpcigpIG5lZWRzIHN0ZG91dC5lbmNvZGluZyB0byBwcmludCB0byBzdGRvdXQKICAgIEBwcm9wZXJ0eQogICAgZGVmIGVuY29kaW5nKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLm9yaWdfc3RyZWFtLmVuY29kaW5nCgoKQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKZGVmIGNhcHR1cmVkX291dHB1dChzdHJlYW1fbmFtZSk6CiAgICAiIiJSZXR1cm4gYSBjb250ZXh0IG1hbmFnZXIgdXNlZCBieSBjYXB0dXJlZF9zdGRvdXQvc3RkaW4vc3RkZXJyCiAgICB0aGF0IHRlbXBvcmFyaWx5IHJlcGxhY2VzIHRoZSBzeXMgc3RyZWFtICpzdHJlYW1fbmFtZSogd2l0aCBhIFN0cmluZ0lPLgoKICAgIFRha2VuIGZyb20gTGliL3N1cHBvcnQvX19pbml0X18ucHkgaW4gdGhlIENQeXRob24gcmVwby4KICAgICIiIgogICAgb3JpZ19zdGRvdXQgPSBnZXRhdHRyKHN5cywgc3RyZWFtX25hbWUpCiAgICBzZXRhdHRyKHN5cywgc3RyZWFtX25hbWUsIFN0cmVhbVdyYXBwZXIuZnJvbV9zdHJlYW0ob3JpZ19zdGRvdXQpKQogICAgdHJ5OgogICAgICAgIHlpZWxkIGdldGF0dHIoc3lzLCBzdHJlYW1fbmFtZSkKICAgIGZpbmFsbHk6CiAgICAgICAgc2V0YXR0cihzeXMsIHN0cmVhbV9uYW1lLCBvcmlnX3N0ZG91dCkKCgpkZWYgY2FwdHVyZWRfc3Rkb3V0KCk6CiAgICAiIiJDYXB0dXJlIHRoZSBvdXRwdXQgb2Ygc3lzLnN0ZG91dDoKCiAgICAgICB3aXRoIGNhcHR1cmVkX3N0ZG91dCgpIGFzIHN0ZG91dDoKICAgICAgICAgICBwcmludCgnaGVsbG8nKQogICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGRvdXQuZ2V0dmFsdWUoKSwgJ2hlbGxvXG4nKQoKICAgIFRha2VuIGZyb20gTGliL3N1cHBvcnQvX19pbml0X18ucHkgaW4gdGhlIENQeXRob24gcmVwby4KICAgICIiIgogICAgcmV0dXJuIGNhcHR1cmVkX291dHB1dCgnc3Rkb3V0JykKCgpjbGFzcyBjYWNoZWRfcHJvcGVydHkob2JqZWN0KToKICAgICIiIkEgcHJvcGVydHkgdGhhdCBpcyBvbmx5IGNvbXB1dGVkIG9uY2UgcGVyIGluc3RhbmNlIGFuZCB0aGVuIHJlcGxhY2VzCiAgICAgICBpdHNlbGYgd2l0aCBhbiBvcmRpbmFyeSBhdHRyaWJ1dGUuIERlbGV0aW5nIHRoZSBhdHRyaWJ1dGUgcmVzZXRzIHRoZQogICAgICAgcHJvcGVydHkuCgogICAgICAgU291cmNlOiBodHRwczovL2dpdGh1Yi5jb20vYm90dGxlcHkvYm90dGxlL2Jsb2IvMC4xMS41L2JvdHRsZS5weSNMMTc1CiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgZnVuYyk6CiAgICAgICAgc2VsZi5fX2RvY19fID0gZ2V0YXR0cihmdW5jLCAnX19kb2NfXycpCiAgICAgICAgc2VsZi5mdW5jID0gZnVuYwoKICAgIGRlZiBfX2dldF9fKHNlbGYsIG9iaiwgY2xzKToKICAgICAgICBpZiBvYmogaXMgTm9uZToKICAgICAgICAgICAgIyBXZSdyZSBiZWluZyBhY2Nlc3NlZCBmcm9tIHRoZSBjbGFzcyBpdHNlbGYsIG5vdCBmcm9tIGFuIG9iamVjdAogICAgICAgICAgICByZXR1cm4gc2VsZgogICAgICAgIHZhbHVlID0gb2JqLl9fZGljdF9fW3NlbGYuZnVuYy5fX25hbWVfX10gPSBzZWxmLmZ1bmMob2JqKQogICAgICAgIHJldHVybiB2YWx1ZQoKCmRlZiBnZXRfaW5zdGFsbGVkX3ZlcnNpb24oZGlzdF9uYW1lLCBsb29rdXBfZGlycz1Ob25lKToKICAgICIiIkdldCB0aGUgaW5zdGFsbGVkIHZlcnNpb24gb2YgZGlzdF9uYW1lIGF2b2lkaW5nIHBrZ19yZXNvdXJjZXMgY2FjaGUiIiIKICAgICMgQ3JlYXRlIGEgcmVxdWlyZW1lbnQgdGhhdCB3ZSdsbCBsb29rIGZvciBpbnNpZGUgb2Ygc2V0dXB0b29scy4KICAgIHJlcSA9IHBrZ19yZXNvdXJjZXMuUmVxdWlyZW1lbnQucGFyc2UoZGlzdF9uYW1lKQoKICAgICMgV2Ugd2FudCB0byBhdm9pZCBoYXZpbmcgdGhpcyBjYWNoZWQsIHNvIHdlIG5lZWQgdG8gY29uc3RydWN0IGEgbmV3CiAgICAjIHdvcmtpbmcgc2V0IGVhY2ggdGltZS4KICAgIGlmIGxvb2t1cF9kaXJzIGlzIE5vbmU6CiAgICAgICAgd29ya2luZ19zZXQgPSBwa2dfcmVzb3VyY2VzLldvcmtpbmdTZXQoKQogICAgZWxzZToKICAgICAgICB3b3JraW5nX3NldCA9IHBrZ19yZXNvdXJjZXMuV29ya2luZ1NldChsb29rdXBfZGlycykKCiAgICAjIEdldCB0aGUgaW5zdGFsbGVkIGRpc3RyaWJ1dGlvbiBmcm9tIG91ciB3b3JraW5nIHNldAogICAgZGlzdCA9IHdvcmtpbmdfc2V0LmZpbmQocmVxKQoKICAgICMgQ2hlY2sgdG8gc2VlIGlmIHdlIGdvdCBhbiBpbnN0YWxsZWQgZGlzdHJpYnV0aW9uIG9yIG5vdCwgaWYgd2UgZGlkCiAgICAjIHdlIHdhbnQgdG8gcmV0dXJuIGl0J3MgdmVyc2lvbi4KICAgIHJldHVybiBkaXN0LnZlcnNpb24gaWYgZGlzdCBlbHNlIE5vbmUKCgpkZWYgY29uc3VtZShpdGVyYXRvcik6CiAgICAiIiJDb25zdW1lIGFuIGl0ZXJhYmxlIGF0IEMgc3BlZWQuIiIiCiAgICBkZXF1ZShpdGVyYXRvciwgbWF4bGVuPTApClBLAwQUAAAAAAAAACEANQreO2siAABrIgAAMQAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL3V0aWxzL2FwcGRpcnMucHkiIiIKVGhpcyBjb2RlIHdhcyB0YWtlbiBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9BY3RpdmVTdGF0ZS9hcHBkaXJzIGFuZCBtb2RpZmllZAp0byBzdWl0IG91ciBwdXJwb3Nlcy4KIiIiCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgb3MKaW1wb3J0IHN5cwoKZnJvbSBwaXAuY29tcGF0IGltcG9ydCBXSU5ET1dTLCBleHBhbmR1c2VyCmZyb20gcGlwLl92ZW5kb3Iuc2l4IGltcG9ydCBQWTIsIHRleHRfdHlwZQoKCmRlZiB1c2VyX2NhY2hlX2RpcihhcHBuYW1lKToKICAgIHIiIiIKICAgIFJldHVybiBmdWxsIHBhdGggdG8gdGhlIHVzZXItc3BlY2lmaWMgY2FjaGUgZGlyIGZvciB0aGlzIGFwcGxpY2F0aW9uLgoKICAgICAgICAiYXBwbmFtZSIgaXMgdGhlIG5hbWUgb2YgYXBwbGljYXRpb24uCgogICAgVHlwaWNhbCB1c2VyIGNhY2hlIGRpcmVjdG9yaWVzIGFyZToKICAgICAgICBtYWNPUzogICAgICB+L0xpYnJhcnkvQ2FjaGVzLzxBcHBOYW1lPgogICAgICAgIFVuaXg6ICAgICAgIH4vLmNhY2hlLzxBcHBOYW1lPiAoWERHIGRlZmF1bHQpCiAgICAgICAgV2luZG93czogICAgQzpcVXNlcnNcPHVzZXJuYW1lPlxBcHBEYXRhXExvY2FsXDxBcHBOYW1lPlxDYWNoZQoKICAgIE9uIFdpbmRvd3MgdGhlIG9ubHkgc3VnZ2VzdGlvbiBpbiB0aGUgTVNETiBkb2NzIGlzIHRoYXQgbG9jYWwgc2V0dGluZ3MgZ28KICAgIGluIHRoZSBgQ1NJRExfTE9DQUxfQVBQREFUQWAgZGlyZWN0b3J5LiBUaGlzIGlzIGlkZW50aWNhbCB0byB0aGUKICAgIG5vbi1yb2FtaW5nIGFwcCBkYXRhIGRpciAodGhlIGRlZmF1bHQgcmV0dXJuZWQgYnkgYHVzZXJfZGF0YV9kaXJgKS4gQXBwcwogICAgdHlwaWNhbGx5IHB1dCBjYWNoZSBkYXRhIHNvbWV3aGVyZSAqdW5kZXIqIHRoZSBnaXZlbiBkaXIgaGVyZS4gU29tZQogICAgZXhhbXBsZXM6CiAgICAgICAgLi4uXE1vemlsbGFcRmlyZWZveFxQcm9maWxlc1w8UHJvZmlsZU5hbWU+XENhY2hlCiAgICAgICAgLi4uXEFjbWVcU3VwZXJBcHBcQ2FjaGVcMS4wCgogICAgT1BJTklPTjogVGhpcyBmdW5jdGlvbiBhcHBlbmRzICJDYWNoZSIgdG8gdGhlIGBDU0lETF9MT0NBTF9BUFBEQVRBYCB2YWx1ZS4KICAgICIiIgogICAgaWYgV0lORE9XUzoKICAgICAgICAjIEdldCB0aGUgYmFzZSBwYXRoCiAgICAgICAgcGF0aCA9IG9zLnBhdGgubm9ybXBhdGgoX2dldF93aW5fZm9sZGVyKCJDU0lETF9MT0NBTF9BUFBEQVRBIikpCgogICAgICAgICMgV2hlbiB1c2luZyBQeXRob24gMiwgcmV0dXJuIHBhdGhzIGFzIGJ5dGVzIG9uIFdpbmRvd3MgbGlrZSB3ZSBkbyBvbgogICAgICAgICMgb3RoZXIgb3BlcmF0aW5nIHN5c3RlbXMuIFNlZSBoZWxwZXIgZnVuY3Rpb24gZG9jcyBmb3IgbW9yZSBkZXRhaWxzLgogICAgICAgIGlmIFBZMiBhbmQgaXNpbnN0YW5jZShwYXRoLCB0ZXh0X3R5cGUpOgogICAgICAgICAgICBwYXRoID0gX3dpbl9wYXRoX3RvX2J5dGVzKHBhdGgpCgogICAgICAgICMgQWRkIG91ciBhcHAgbmFtZSBhbmQgQ2FjaGUgZGlyZWN0b3J5IHRvIGl0CiAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCBhcHBuYW1lLCAiQ2FjaGUiKQogICAgZWxpZiBzeXMucGxhdGZvcm0gPT0gImRhcndpbiI6CiAgICAgICAgIyBHZXQgdGhlIGJhc2UgcGF0aAogICAgICAgIHBhdGggPSBleHBhbmR1c2VyKCJ+L0xpYnJhcnkvQ2FjaGVzIikKCiAgICAgICAgIyBBZGQgb3VyIGFwcCBuYW1lIHRvIGl0CiAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCBhcHBuYW1lKQogICAgZWxzZToKICAgICAgICAjIEdldCB0aGUgYmFzZSBwYXRoCiAgICAgICAgcGF0aCA9IG9zLmdldGVudigiWERHX0NBQ0hFX0hPTUUiLCBleHBhbmR1c2VyKCJ+Ly5jYWNoZSIpKQoKICAgICAgICAjIEFkZCBvdXIgYXBwIG5hbWUgdG8gaXQKICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIGFwcG5hbWUpCgogICAgcmV0dXJuIHBhdGgKCgpkZWYgdXNlcl9kYXRhX2RpcihhcHBuYW1lLCByb2FtaW5nPUZhbHNlKToKICAgICIiIgogICAgUmV0dXJuIGZ1bGwgcGF0aCB0byB0aGUgdXNlci1zcGVjaWZpYyBkYXRhIGRpciBmb3IgdGhpcyBhcHBsaWNhdGlvbi4KCiAgICAgICAgImFwcG5hbWUiIGlzIHRoZSBuYW1lIG9mIGFwcGxpY2F0aW9uLgogICAgICAgICAgICBJZiBOb25lLCBqdXN0IHRoZSBzeXN0ZW0gZGlyZWN0b3J5IGlzIHJldHVybmVkLgogICAgICAgICJyb2FtaW5nIiAoYm9vbGVhbiwgZGVmYXVsdCBGYWxzZSkgY2FuIGJlIHNldCBUcnVlIHRvIHVzZSB0aGUgV2luZG93cwogICAgICAgICAgICByb2FtaW5nIGFwcGRhdGEgZGlyZWN0b3J5LiBUaGF0IG1lYW5zIHRoYXQgZm9yIHVzZXJzIG9uIGEgV2luZG93cwogICAgICAgICAgICBuZXR3b3JrIHNldHVwIGZvciByb2FtaW5nIHByb2ZpbGVzLCB0aGlzIHVzZXIgZGF0YSB3aWxsIGJlCiAgICAgICAgICAgIHN5bmMnZCBvbiBsb2dpbi4gU2VlCiAgICAgICAgICAgIDxodHRwOi8vdGVjaG5ldC5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvY2M3NjY0ODkoV1MuMTApLmFzcHg+CiAgICAgICAgICAgIGZvciBhIGRpc2N1c3Npb24gb2YgaXNzdWVzLgoKICAgIFR5cGljYWwgdXNlciBkYXRhIGRpcmVjdG9yaWVzIGFyZToKICAgICAgICBtYWNPUzogICAgICAgICAgICAgICAgICB+L0xpYnJhcnkvQXBwbGljYXRpb24gU3VwcG9ydC88QXBwTmFtZT4KICAgICAgICBVbml4OiAgICAgICAgICAgICAgICAgICB+Ly5sb2NhbC9zaGFyZS88QXBwTmFtZT4gICAgIyBvciBpbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRYREdfREFUQV9IT01FLCBpZiBkZWZpbmVkCiAgICAgICAgV2luIFhQIChub3Qgcm9hbWluZyk6ICAgQzpcRG9jdW1lbnRzIGFuZCBTZXR0aW5nc1w8dXNlcm5hbWU+XCAuLi4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BcHBsaWNhdGlvbiBEYXRhXDxBcHBOYW1lPgogICAgICAgIFdpbiBYUCAocm9hbWluZyk6ICAgICAgIEM6XERvY3VtZW50cyBhbmQgU2V0dGluZ3NcPHVzZXJuYW1lPlxMb2NhbCAuLi4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5TZXR0aW5nc1xBcHBsaWNhdGlvbiBEYXRhXDxBcHBOYW1lPgogICAgICAgIFdpbiA3ICAobm90IHJvYW1pbmcpOiAgIEM6XFxVc2Vyc1w8dXNlcm5hbWU+XEFwcERhdGFcTG9jYWxcPEFwcE5hbWU+CiAgICAgICAgV2luIDcgIChyb2FtaW5nKTogICAgICAgQzpcXFVzZXJzXDx1c2VybmFtZT5cQXBwRGF0YVxSb2FtaW5nXDxBcHBOYW1lPgoKICAgIEZvciBVbml4LCB3ZSBmb2xsb3cgdGhlIFhERyBzcGVjIGFuZCBzdXBwb3J0ICRYREdfREFUQV9IT01FLgogICAgVGhhdCBtZWFucywgYnkgZGVmYXVsdCAifi8ubG9jYWwvc2hhcmUvPEFwcE5hbWU+Ii4KICAgICIiIgogICAgaWYgV0lORE9XUzoKICAgICAgICBjb25zdCA9IHJvYW1pbmcgYW5kICJDU0lETF9BUFBEQVRBIiBvciAiQ1NJRExfTE9DQUxfQVBQREFUQSIKICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKG9zLnBhdGgubm9ybXBhdGgoX2dldF93aW5fZm9sZGVyKGNvbnN0KSksIGFwcG5hbWUpCiAgICBlbGlmIHN5cy5wbGF0Zm9ybSA9PSAiZGFyd2luIjoKICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKAogICAgICAgICAgICBleHBhbmR1c2VyKCd+L0xpYnJhcnkvQXBwbGljYXRpb24gU3VwcG9ydC8nKSwKICAgICAgICAgICAgYXBwbmFtZSwKICAgICAgICApCiAgICBlbHNlOgogICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oCiAgICAgICAgICAgIG9zLmdldGVudignWERHX0RBVEFfSE9NRScsIGV4cGFuZHVzZXIoIn4vLmxvY2FsL3NoYXJlIikpLAogICAgICAgICAgICBhcHBuYW1lLAogICAgICAgICkKCiAgICByZXR1cm4gcGF0aAoKCmRlZiB1c2VyX2NvbmZpZ19kaXIoYXBwbmFtZSwgcm9hbWluZz1UcnVlKToKICAgICIiIlJldHVybiBmdWxsIHBhdGggdG8gdGhlIHVzZXItc3BlY2lmaWMgY29uZmlnIGRpciBmb3IgdGhpcyBhcHBsaWNhdGlvbi4KCiAgICAgICAgImFwcG5hbWUiIGlzIHRoZSBuYW1lIG9mIGFwcGxpY2F0aW9uLgogICAgICAgICAgICBJZiBOb25lLCBqdXN0IHRoZSBzeXN0ZW0gZGlyZWN0b3J5IGlzIHJldHVybmVkLgogICAgICAgICJyb2FtaW5nIiAoYm9vbGVhbiwgZGVmYXVsdCBUcnVlKSBjYW4gYmUgc2V0IEZhbHNlIHRvIG5vdCB1c2UgdGhlCiAgICAgICAgICAgIFdpbmRvd3Mgcm9hbWluZyBhcHBkYXRhIGRpcmVjdG9yeS4gVGhhdCBtZWFucyB0aGF0IGZvciB1c2VycyBvbiBhCiAgICAgICAgICAgIFdpbmRvd3MgbmV0d29yayBzZXR1cCBmb3Igcm9hbWluZyBwcm9maWxlcywgdGhpcyB1c2VyIGRhdGEgd2lsbCBiZQogICAgICAgICAgICBzeW5jJ2Qgb24gbG9naW4uIFNlZQogICAgICAgICAgICA8aHR0cDovL3RlY2huZXQubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2NjNzY2NDg5KFdTLjEwKS5hc3B4PgogICAgICAgICAgICBmb3IgYSBkaXNjdXNzaW9uIG9mIGlzc3Vlcy4KCiAgICBUeXBpY2FsIHVzZXIgZGF0YSBkaXJlY3RvcmllcyBhcmU6CiAgICAgICAgbWFjT1M6ICAgICAgICAgICAgICAgICAgc2FtZSBhcyB1c2VyX2RhdGFfZGlyCiAgICAgICAgVW5peDogICAgICAgICAgICAgICAgICAgfi8uY29uZmlnLzxBcHBOYW1lPgogICAgICAgIFdpbiAqOiAgICAgICAgICAgICAgICAgIHNhbWUgYXMgdXNlcl9kYXRhX2RpcgoKICAgIEZvciBVbml4LCB3ZSBmb2xsb3cgdGhlIFhERyBzcGVjIGFuZCBzdXBwb3J0ICRYREdfQ09ORklHX0hPTUUuCiAgICBUaGF0IG1lYW5zLCBieSBkZWZhdWx0ICJ+Ly5jb25maWcvPEFwcE5hbWU+Ii4KICAgICIiIgogICAgaWYgV0lORE9XUzoKICAgICAgICBwYXRoID0gdXNlcl9kYXRhX2RpcihhcHBuYW1lLCByb2FtaW5nPXJvYW1pbmcpCiAgICBlbGlmIHN5cy5wbGF0Zm9ybSA9PSAiZGFyd2luIjoKICAgICAgICBwYXRoID0gdXNlcl9kYXRhX2RpcihhcHBuYW1lKQogICAgZWxzZToKICAgICAgICBwYXRoID0gb3MuZ2V0ZW52KCdYREdfQ09ORklHX0hPTUUnLCBleHBhbmR1c2VyKCJ+Ly5jb25maWciKSkKICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIGFwcG5hbWUpCgogICAgcmV0dXJuIHBhdGgKCgojIGZvciB0aGUgZGlzY3Vzc2lvbiByZWdhcmRpbmcgc2l0ZV9jb25maWdfZGlycyBsb2NhdGlvbnMKIyBzZWUgPGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3BpcC9pc3N1ZXMvMTczMz4KZGVmIHNpdGVfY29uZmlnX2RpcnMoYXBwbmFtZSk6CiAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIHBvdGVudGlhbCB1c2VyLXNoYXJlZCBjb25maWcgZGlycyBmb3IgdGhpcyBhcHBsaWNhdGlvbi4KCiAgICAgICAgImFwcG5hbWUiIGlzIHRoZSBuYW1lIG9mIGFwcGxpY2F0aW9uLgoKICAgIFR5cGljYWwgdXNlciBjb25maWcgZGlyZWN0b3JpZXMgYXJlOgogICAgICAgIG1hY09TOiAgICAgIC9MaWJyYXJ5L0FwcGxpY2F0aW9uIFN1cHBvcnQvPEFwcE5hbWU+LwogICAgICAgIFVuaXg6ICAgICAgIC9ldGMgb3IgJFhER19DT05GSUdfRElSU1tpXS88QXBwTmFtZT4vIGZvciBlYWNoIHZhbHVlIGluCiAgICAgICAgICAgICAgICAgICAgJFhER19DT05GSUdfRElSUwogICAgICAgIFdpbiBYUDogICAgIEM6XERvY3VtZW50cyBhbmQgU2V0dGluZ3NcQWxsIFVzZXJzXEFwcGxpY2F0aW9uIC4uLgogICAgICAgICAgICAgICAgICAgIC4uLkRhdGFcPEFwcE5hbWU+XAogICAgICAgIFZpc3RhOiAgICAgIChGYWlsISAiQzpcUHJvZ3JhbURhdGEiIGlzIGEgaGlkZGVuICpzeXN0ZW0qIGRpcmVjdG9yeQogICAgICAgICAgICAgICAgICAgIG9uIFZpc3RhLikKICAgICAgICBXaW4gNzogICAgICBIaWRkZW4sIGJ1dCB3cml0ZWFibGUgb24gV2luIDc6CiAgICAgICAgICAgICAgICAgICAgQzpcUHJvZ3JhbURhdGFcPEFwcE5hbWU+XAogICAgIiIiCiAgICBpZiBXSU5ET1dTOgogICAgICAgIHBhdGggPSBvcy5wYXRoLm5vcm1wYXRoKF9nZXRfd2luX2ZvbGRlcigiQ1NJRExfQ09NTU9OX0FQUERBVEEiKSkKICAgICAgICBwYXRobGlzdCA9IFtvcy5wYXRoLmpvaW4ocGF0aCwgYXBwbmFtZSldCiAgICBlbGlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJzoKICAgICAgICBwYXRobGlzdCA9IFtvcy5wYXRoLmpvaW4oJy9MaWJyYXJ5L0FwcGxpY2F0aW9uIFN1cHBvcnQnLCBhcHBuYW1lKV0KICAgIGVsc2U6CiAgICAgICAgIyB0cnkgbG9va2luZyBpbiAkWERHX0NPTkZJR19ESVJTCiAgICAgICAgeGRnX2NvbmZpZ19kaXJzID0gb3MuZ2V0ZW52KCdYREdfQ09ORklHX0RJUlMnLCAnL2V0Yy94ZGcnKQogICAgICAgIGlmIHhkZ19jb25maWdfZGlyczoKICAgICAgICAgICAgcGF0aGxpc3QgPSBbCiAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oZXhwYW5kdXNlcih4KSwgYXBwbmFtZSkKICAgICAgICAgICAgICAgIGZvciB4IGluIHhkZ19jb25maWdfZGlycy5zcGxpdChvcy5wYXRoc2VwKQogICAgICAgICAgICBdCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcGF0aGxpc3QgPSBbXQoKICAgICAgICAjIGFsd2F5cyBsb29rIGluIC9ldGMgZGlyZWN0bHkgYXMgd2VsbAogICAgICAgIHBhdGhsaXN0LmFwcGVuZCgnL2V0YycpCgogICAgcmV0dXJuIHBhdGhsaXN0CgoKIyAtLSBXaW5kb3dzIHN1cHBvcnQgZnVuY3Rpb25zIC0tCgpkZWYgX2dldF93aW5fZm9sZGVyX2Zyb21fcmVnaXN0cnkoY3NpZGxfbmFtZSk6CiAgICAiIiIKICAgIFRoaXMgaXMgYSBmYWxsYmFjayB0ZWNobmlxdWUgYXQgYmVzdC4gSSdtIG5vdCBzdXJlIGlmIHVzaW5nIHRoZQogICAgcmVnaXN0cnkgZm9yIHRoaXMgZ3VhcmFudGVlcyB1cyB0aGUgY29ycmVjdCBhbnN3ZXIgZm9yIGFsbCBDU0lETF8qCiAgICBuYW1lcy4KICAgICIiIgogICAgaW1wb3J0IF93aW5yZWcKCiAgICBzaGVsbF9mb2xkZXJfbmFtZSA9IHsKICAgICAgICAiQ1NJRExfQVBQREFUQSI6ICJBcHBEYXRhIiwKICAgICAgICAiQ1NJRExfQ09NTU9OX0FQUERBVEEiOiAiQ29tbW9uIEFwcERhdGEiLAogICAgICAgICJDU0lETF9MT0NBTF9BUFBEQVRBIjogIkxvY2FsIEFwcERhdGEiLAogICAgfVtjc2lkbF9uYW1lXQoKICAgIGtleSA9IF93aW5yZWcuT3BlbktleSgKICAgICAgICBfd2lucmVnLkhLRVlfQ1VSUkVOVF9VU0VSLAogICAgICAgIHIiU29mdHdhcmVcTWljcm9zb2Z0XFdpbmRvd3NcQ3VycmVudFZlcnNpb25cRXhwbG9yZXJcU2hlbGwgRm9sZGVycyIKICAgICkKICAgIGRpcmVjdG9yeSwgX3R5cGUgPSBfd2lucmVnLlF1ZXJ5VmFsdWVFeChrZXksIHNoZWxsX2ZvbGRlcl9uYW1lKQogICAgcmV0dXJuIGRpcmVjdG9yeQoKCmRlZiBfZ2V0X3dpbl9mb2xkZXJfd2l0aF9jdHlwZXMoY3NpZGxfbmFtZSk6CiAgICBjc2lkbF9jb25zdCA9IHsKICAgICAgICAiQ1NJRExfQVBQREFUQSI6IDI2LAogICAgICAgICJDU0lETF9DT01NT05fQVBQREFUQSI6IDM1LAogICAgICAgICJDU0lETF9MT0NBTF9BUFBEQVRBIjogMjgsCiAgICB9W2NzaWRsX25hbWVdCgogICAgYnVmID0gY3R5cGVzLmNyZWF0ZV91bmljb2RlX2J1ZmZlcigxMDI0KQogICAgY3R5cGVzLndpbmRsbC5zaGVsbDMyLlNIR2V0Rm9sZGVyUGF0aFcoTm9uZSwgY3NpZGxfY29uc3QsIE5vbmUsIDAsIGJ1ZikKCiAgICAjIERvd25ncmFkZSB0byBzaG9ydCBwYXRoIG5hbWUgaWYgaGF2ZSBoaWdoYml0IGNoYXJzLiBTZWUKICAgICMgPGh0dHA6Ly9idWdzLmFjdGl2ZXN0YXRlLmNvbS9zaG93X2J1Zy5jZ2k/aWQ9ODUwOTk+LgogICAgaGFzX2hpZ2hfY2hhciA9IEZhbHNlCiAgICBmb3IgYyBpbiBidWY6CiAgICAgICAgaWYgb3JkKGMpID4gMjU1OgogICAgICAgICAgICBoYXNfaGlnaF9jaGFyID0gVHJ1ZQogICAgICAgICAgICBicmVhawogICAgaWYgaGFzX2hpZ2hfY2hhcjoKICAgICAgICBidWYyID0gY3R5cGVzLmNyZWF0ZV91bmljb2RlX2J1ZmZlcigxMDI0KQogICAgICAgIGlmIGN0eXBlcy53aW5kbGwua2VybmVsMzIuR2V0U2hvcnRQYXRoTmFtZVcoYnVmLnZhbHVlLCBidWYyLCAxMDI0KToKICAgICAgICAgICAgYnVmID0gYnVmMgoKICAgIHJldHVybiBidWYudmFsdWUKCmlmIFdJTkRPV1M6CiAgICB0cnk6CiAgICAgICAgaW1wb3J0IGN0eXBlcwogICAgICAgIF9nZXRfd2luX2ZvbGRlciA9IF9nZXRfd2luX2ZvbGRlcl93aXRoX2N0eXBlcwogICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgIF9nZXRfd2luX2ZvbGRlciA9IF9nZXRfd2luX2ZvbGRlcl9mcm9tX3JlZ2lzdHJ5CgoKZGVmIF93aW5fcGF0aF90b19ieXRlcyhwYXRoKToKICAgICIiIkVuY29kZSBXaW5kb3dzIHBhdGhzIHRvIGJ5dGVzLiBPbmx5IHVzZWQgb24gUHl0aG9uIDIuCgogICAgTW90aXZhdGlvbiBpcyB0byBiZSBjb25zaXN0ZW50IHdpdGggb3RoZXIgb3BlcmF0aW5nIHN5c3RlbXMgd2hlcmUgcGF0aHMKICAgIGFyZSBhbHNvIHJldHVybmVkIGFzIGJ5dGVzLiBUaGlzIGF2b2lkcyBwcm9ibGVtcyBtaXhpbmcgYnl0ZXMgYW5kIFVuaWNvZGUKICAgIGVsc2V3aGVyZSBpbiB0aGUgY29kZWJhc2UuIEZvciBtb3JlIGRldGFpbHMgYW5kIGRpc2N1c3Npb24gc2VlCiAgICA8aHR0cHM6Ly9naXRodWIuY29tL3B5cGEvcGlwL2lzc3Vlcy8zNDYzPi4KCiAgICBJZiBlbmNvZGluZyB1c2luZyBBU0NJSSBhbmQgTUJDUyBmYWlscywgcmV0dXJuIHRoZSBvcmlnaW5hbCBVbmljb2RlIHBhdGguCiAgICAiIiIKICAgIGZvciBlbmNvZGluZyBpbiAoJ0FTQ0lJJywgJ01CQ1MnKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBwYXRoLmVuY29kZShlbmNvZGluZykKICAgICAgICBleGNlcHQgKFVuaWNvZGVFbmNvZGVFcnJvciwgTG9va3VwRXJyb3IpOgogICAgICAgICAgICBwYXNzCiAgICByZXR1cm4gcGF0aApQSwMEFAAAAAAAAAAhAM0MTS4gBQAAIAUAAC8AAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC91dGlscy9idWlsZC5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgb3MucGF0aAppbXBvcnQgdGVtcGZpbGUKCmZyb20gcGlwLnV0aWxzIGltcG9ydCBybXRyZWUKCgpjbGFzcyBCdWlsZERpcmVjdG9yeShvYmplY3QpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lPU5vbmUsIGRlbGV0ZT1Ob25lKToKICAgICAgICAjIElmIHdlIHdlcmUgbm90IGdpdmVuIGFuIGV4cGxpY2l0IGRpcmVjdG9yeSwgYW5kIHdlIHdlcmUgbm90IGdpdmVuIGFuCiAgICAgICAgIyBleHBsaWNpdCBkZWxldGUgb3B0aW9uLCB0aGVuIHdlJ2xsIGRlZmF1bHQgdG8gZGVsZXRpbmcuCiAgICAgICAgaWYgbmFtZSBpcyBOb25lIGFuZCBkZWxldGUgaXMgTm9uZToKICAgICAgICAgICAgZGVsZXRlID0gVHJ1ZQoKICAgICAgICBpZiBuYW1lIGlzIE5vbmU6CiAgICAgICAgICAgICMgV2UgcmVhbHBhdGggaGVyZSBiZWNhdXNlIHNvbWUgc3lzdGVtcyBoYXZlIHRoZWlyIGRlZmF1bHQgdG1wZGlyCiAgICAgICAgICAgICMgc3ltbGlua2VkIHRvIGFub3RoZXIgZGlyZWN0b3J5LiAgVGhpcyB0ZW5kcyB0byBjb25mdXNlIGJ1aWxkCiAgICAgICAgICAgICMgc2NyaXB0cywgc28gd2UgY2Fub25pY2FsaXplIHRoZSBwYXRoIGJ5IHRyYXZlcnNpbmcgcG90ZW50aWFsCiAgICAgICAgICAgICMgc3ltbGlua3MgaGVyZS4KICAgICAgICAgICAgbmFtZSA9IG9zLnBhdGgucmVhbHBhdGgodGVtcGZpbGUubWtkdGVtcChwcmVmaXg9InBpcC1idWlsZC0iKSkKICAgICAgICAgICAgIyBJZiB3ZSB3ZXJlIG5vdCBnaXZlbiBhbiBleHBsaWNpdCBkaXJlY3RvcnksIGFuZCB3ZSB3ZXJlIG5vdCBnaXZlbgogICAgICAgICAgICAjIGFuIGV4cGxpY2l0IGRlbGV0ZSBvcHRpb24sIHRoZW4gd2UnbGwgZGVmYXVsdCB0byBkZWxldGluZy4KICAgICAgICAgICAgaWYgZGVsZXRlIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBkZWxldGUgPSBUcnVlCgogICAgICAgIHNlbGYubmFtZSA9IG5hbWUKICAgICAgICBzZWxmLmRlbGV0ZSA9IGRlbGV0ZQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIjx7fSB7IXJ9PiIuZm9ybWF0KHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzZWxmLm5hbWUpCgogICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5uYW1lCgogICAgZGVmIF9fZXhpdF9fKHNlbGYsIGV4YywgdmFsdWUsIHRiKToKICAgICAgICBzZWxmLmNsZWFudXAoKQoKICAgIGRlZiBjbGVhbnVwKHNlbGYpOgogICAgICAgIGlmIHNlbGYuZGVsZXRlOgogICAgICAgICAgICBybXRyZWUoc2VsZi5uYW1lKQpQSwMEFAAAAAAAAAAhAHEeaiS4CAAAuAgAADUAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC91dGlscy9kZXByZWNhdGlvbi5weSIiIgpBIG1vZHVsZSB0aGF0IGltcGxlbWVudHMgdG9vbGluZyB0byBlbmFibGUgZWFzeSB3YXJuaW5ncyBhYm91dCBkZXByZWNhdGlvbnMuCiIiIgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IHdhcm5pbmdzCgoKY2xhc3MgUGlwRGVwcmVjYXRpb25XYXJuaW5nKFdhcm5pbmcpOgogICAgcGFzcwoKCmNsYXNzIFBlbmRpbmcob2JqZWN0KToKICAgIHBhc3MKCgpjbGFzcyBSZW1vdmVkSW5QaXAxMFdhcm5pbmcoUGlwRGVwcmVjYXRpb25XYXJuaW5nKToKICAgIHBhc3MKCgpjbGFzcyBSZW1vdmVkSW5QaXAxMVdhcm5pbmcoUGlwRGVwcmVjYXRpb25XYXJuaW5nLCBQZW5kaW5nKToKICAgIHBhc3MKCgpjbGFzcyBQeXRob24yNkRlcHJlY2F0aW9uV2FybmluZyhQaXBEZXByZWNhdGlvbldhcm5pbmcpOgogICAgcGFzcwoKCiMgV2FybmluZ3MgPC0+IExvZ2dpbmcgSW50ZWdyYXRpb24KCgpfd2FybmluZ3Nfc2hvd3dhcm5pbmcgPSBOb25lCgoKZGVmIF9zaG93d2FybmluZyhtZXNzYWdlLCBjYXRlZ29yeSwgZmlsZW5hbWUsIGxpbmVubywgZmlsZT1Ob25lLCBsaW5lPU5vbmUpOgogICAgaWYgZmlsZSBpcyBub3QgTm9uZToKICAgICAgICBpZiBfd2FybmluZ3Nfc2hvd3dhcm5pbmcgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIF93YXJuaW5nc19zaG93d2FybmluZygKICAgICAgICAgICAgICAgIG1lc3NhZ2UsIGNhdGVnb3J5LCBmaWxlbmFtZSwgbGluZW5vLCBmaWxlLCBsaW5lLAogICAgICAgICAgICApCiAgICBlbHNlOgogICAgICAgIGlmIGlzc3ViY2xhc3MoY2F0ZWdvcnksIFBpcERlcHJlY2F0aW9uV2FybmluZyk6CiAgICAgICAgICAgICMgV2UgdXNlIGEgc3BlY2lhbGx5IG5hbWVkIGxvZ2dlciB3aGljaCB3aWxsIGhhbmRsZSBhbGwgb2YgdGhlCiAgICAgICAgICAgICMgZGVwcmVjYXRpb24gbWVzc2FnZXMgZm9yIHBpcC4KICAgICAgICAgICAgbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoInBpcC5kZXByZWNhdGlvbnMiKQoKICAgICAgICAgICAgIyBUaGlzIGlzIHB1cnBvc2VseSB1c2luZyB0aGUgJSBmb3JtYXR0ZXIgaGVyZSBpbnN0ZWFkIG9mIGxldHRpbmcKICAgICAgICAgICAgIyB0aGUgbG9nZ2luZyBtb2R1bGUgaGFuZGxlIHRoZSBpbnRlcnBvbGF0aW9uLiBUaGlzIGlzIGJlY2F1c2Ugd2UKICAgICAgICAgICAgIyB3YW50IGl0IHRvIGFwcGVhciBhcyBpZiBzb21lb25lIHR5cGVkIHRoaXMgZW50aXJlIG1lc3NhZ2Ugb3V0LgogICAgICAgICAgICBsb2dfbWVzc2FnZSA9ICJERVBSRUNBVElPTjogJXMiICUgbWVzc2FnZQoKICAgICAgICAgICAgIyBQaXBEZXByZWNhdGlvbldhcm5pbmdzIHRoYXQgYXJlIFBlbmRpbmcgc3RpbGwgaGF2ZSBhdCBsZWFzdCAyCiAgICAgICAgICAgICMgdmVyc2lvbnMgdG8gZ28gdW50aWwgdGhleSBhcmUgcmVtb3ZlZCBzbyB0aGV5IGNhbiBqdXN0IGJlCiAgICAgICAgICAgICMgd2FybmluZ3MuICBPdGhlcndpc2UsIHRoZXkgd2lsbCBiZSByZW1vdmVkIGluIHRoZSB2ZXJ5IG5leHQKICAgICAgICAgICAgIyB2ZXJzaW9uIG9mIHBpcC4gV2Ugd2FudCB0aGVzZSB0byBiZSBtb3JlIG9idmlvdXMgc28gd2UgdXNlIHRoZQogICAgICAgICAgICAjIEVSUk9SIGxvZ2dpbmcgbGV2ZWwuCiAgICAgICAgICAgIGlmIGlzc3ViY2xhc3MoY2F0ZWdvcnksIFBlbmRpbmcpOgogICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcobG9nX21lc3NhZ2UpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IobG9nX21lc3NhZ2UpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgX3dhcm5pbmdzX3Nob3d3YXJuaW5nKAogICAgICAgICAgICAgICAgbWVzc2FnZSwgY2F0ZWdvcnksIGZpbGVuYW1lLCBsaW5lbm8sIGZpbGUsIGxpbmUsCiAgICAgICAgICAgICkKCgpkZWYgaW5zdGFsbF93YXJuaW5nX2xvZ2dlcigpOgogICAgIyBFbmFibGUgb3VyIERlcHJlY2F0aW9uIFdhcm5pbmdzCiAgICB3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoImRlZmF1bHQiLCBQaXBEZXByZWNhdGlvbldhcm5pbmcsIGFwcGVuZD1UcnVlKQoKICAgIGdsb2JhbCBfd2FybmluZ3Nfc2hvd3dhcm5pbmcKCiAgICBpZiBfd2FybmluZ3Nfc2hvd3dhcm5pbmcgaXMgTm9uZToKICAgICAgICBfd2FybmluZ3Nfc2hvd3dhcm5pbmcgPSB3YXJuaW5ncy5zaG93d2FybmluZwogICAgICAgIHdhcm5pbmdzLnNob3d3YXJuaW5nID0gX3Nob3d3YXJuaW5nClBLAwQUAAAAAAAAACEAvVo/sMsDAADLAwAAMgAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL3V0aWxzL2VuY29kaW5nLnB5aW1wb3J0IGNvZGVjcwppbXBvcnQgbG9jYWxlCmltcG9ydCByZQoKCkJPTVMgPSBbCiAgICAoY29kZWNzLkJPTV9VVEY4LCAndXRmOCcpLAogICAgKGNvZGVjcy5CT01fVVRGMTYsICd1dGYxNicpLAogICAgKGNvZGVjcy5CT01fVVRGMTZfQkUsICd1dGYxNi1iZScpLAogICAgKGNvZGVjcy5CT01fVVRGMTZfTEUsICd1dGYxNi1sZScpLAogICAgKGNvZGVjcy5CT01fVVRGMzIsICd1dGYzMicpLAogICAgKGNvZGVjcy5CT01fVVRGMzJfQkUsICd1dGYzMi1iZScpLAogICAgKGNvZGVjcy5CT01fVVRGMzJfTEUsICd1dGYzMi1sZScpLApdCgpFTkNPRElOR19SRSA9IHJlLmNvbXBpbGUoYidjb2RpbmdbOj1dXHMqKFstXHcuXSspJykKCgpkZWYgYXV0b19kZWNvZGUoZGF0YSk6CiAgICAiIiJDaGVjayBhIGJ5dGVzIHN0cmluZyBmb3IgYSBCT00gdG8gY29ycmVjdGx5IGRldGVjdCB0aGUgZW5jb2RpbmcKCiAgICBGYWxsYmFjayB0byBsb2NhbGUuZ2V0cHJlZmVycmVkZW5jb2RpbmcoRmFsc2UpIGxpa2Ugb3BlbigpIG9uIFB5dGhvbjMiIiIKICAgIGZvciBib20sIGVuY29kaW5nIGluIEJPTVM6CiAgICAgICAgaWYgZGF0YS5zdGFydHN3aXRoKGJvbSk6CiAgICAgICAgICAgIHJldHVybiBkYXRhW2xlbihib20pOl0uZGVjb2RlKGVuY29kaW5nKQogICAgIyBMZXRzIGNoZWNrIHRoZSBmaXJzdCB0d28gbGluZXMgYXMgaW4gUEVQMjYzCiAgICBmb3IgbGluZSBpbiBkYXRhLnNwbGl0KGInXG4nKVs6Ml06CiAgICAgICAgaWYgbGluZVswOjFdID09IGInIycgYW5kIEVOQ09ESU5HX1JFLnNlYXJjaChsaW5lKToKICAgICAgICAgICAgZW5jb2RpbmcgPSBFTkNPRElOR19SRS5zZWFyY2gobGluZSkuZ3JvdXBzKClbMF0uZGVjb2RlKCdhc2NpaScpCiAgICAgICAgICAgIHJldHVybiBkYXRhLmRlY29kZShlbmNvZGluZykKICAgIHJldHVybiBkYXRhLmRlY29kZShsb2NhbGUuZ2V0cHJlZmVycmVkZW5jb2RpbmcoRmFsc2UpKQpQSwMEFAAAAAAAAAAhAPJD7cCDAwAAgwMAADQAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC91dGlscy9maWxlc3lzdGVtLnB5aW1wb3J0IG9zCmltcG9ydCBvcy5wYXRoCgpmcm9tIHBpcC5jb21wYXQgaW1wb3J0IGdldF9wYXRoX3VpZAoKCmRlZiBjaGVja19wYXRoX293bmVyKHBhdGgpOgogICAgIyBJZiB3ZSBkb24ndCBoYXZlIGEgd2F5IHRvIGNoZWNrIHRoZSBlZmZlY3RpdmUgdWlkIG9mIHRoaXMgcHJvY2VzcywgdGhlbgogICAgIyB3ZSdsbCBqdXN0IGFzc3VtZSB0aGF0IHdlIG93biB0aGUgZGlyZWN0b3J5LgogICAgaWYgbm90IGhhc2F0dHIob3MsICJnZXRldWlkIik6CiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBwcmV2aW91cyA9IE5vbmUKICAgIHdoaWxlIHBhdGggIT0gcHJldmlvdXM6CiAgICAgICAgaWYgb3MucGF0aC5sZXhpc3RzKHBhdGgpOgogICAgICAgICAgICAjIENoZWNrIGlmIHBhdGggaXMgd3JpdGFibGUgYnkgY3VycmVudCB1c2VyLgogICAgICAgICAgICBpZiBvcy5nZXRldWlkKCkgPT0gMDoKICAgICAgICAgICAgICAgICMgU3BlY2lhbCBoYW5kbGluZyBmb3Igcm9vdCB1c2VyIGluIG9yZGVyIHRvIGhhbmRsZSBwcm9wZXJseQogICAgICAgICAgICAgICAgIyBjYXNlcyB3aGVyZSB1c2VycyB1c2Ugc3VkbyB3aXRob3V0IC1IIGZsYWcuCiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgcGF0aF91aWQgPSBnZXRfcGF0aF91aWQocGF0aCkKICAgICAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgICAgICAgICAgcmV0dXJuIHBhdGhfdWlkID09IDAKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJldHVybiBvcy5hY2Nlc3MocGF0aCwgb3MuV19PSykKICAgICAgICBlbHNlOgogICAgICAgICAgICBwcmV2aW91cywgcGF0aCA9IHBhdGgsIG9zLnBhdGguZGlybmFtZShwYXRoKQpQSwMEFAAAAAAAAAAhACA3BXR7CwAAewsAAC8AAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC91dGlscy9nbGliYy5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgcmUKaW1wb3J0IGN0eXBlcwppbXBvcnQgcGxhdGZvcm0KaW1wb3J0IHdhcm5pbmdzCgoKZGVmIGdsaWJjX3ZlcnNpb25fc3RyaW5nKCk6CiAgICAiUmV0dXJucyBnbGliYyB2ZXJzaW9uIHN0cmluZywgb3IgTm9uZSBpZiBub3QgdXNpbmcgZ2xpYmMuIgoKICAgICMgY3R5cGVzLkNETEwoTm9uZSkgaW50ZXJuYWxseSBjYWxscyBkbG9wZW4oTlVMTCksIGFuZCBhcyB0aGUgZGxvcGVuCiAgICAjIG1hbnBhZ2Ugc2F5cywgIklmIGZpbGVuYW1lIGlzIE5VTEwsIHRoZW4gdGhlIHJldHVybmVkIGhhbmRsZSBpcyBmb3IgdGhlCiAgICAjIG1haW4gcHJvZ3JhbSIuIFRoaXMgd2F5IHdlIGNhbiBsZXQgdGhlIGxpbmtlciBkbyB0aGUgd29yayB0byBmaWd1cmUgb3V0CiAgICAjIHdoaWNoIGxpYmMgb3VyIHByb2Nlc3MgaXMgYWN0dWFsbHkgdXNpbmcuCiAgICBwcm9jZXNzX25hbWVzcGFjZSA9IGN0eXBlcy5DRExMKE5vbmUpCiAgICB0cnk6CiAgICAgICAgZ251X2dldF9saWJjX3ZlcnNpb24gPSBwcm9jZXNzX25hbWVzcGFjZS5nbnVfZ2V0X2xpYmNfdmVyc2lvbgogICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICMgU3ltYm9sIGRvZXNuJ3QgZXhpc3QgLT4gdGhlcmVmb3JlLCB3ZSBhcmUgbm90IGxpbmtlZCB0bwogICAgICAgICMgZ2xpYmMuCiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAjIENhbGwgZ251X2dldF9saWJjX3ZlcnNpb24sIHdoaWNoIHJldHVybnMgYSBzdHJpbmcgbGlrZSAiMi41IgogICAgZ251X2dldF9saWJjX3ZlcnNpb24ucmVzdHlwZSA9IGN0eXBlcy5jX2NoYXJfcAogICAgdmVyc2lvbl9zdHIgPSBnbnVfZ2V0X2xpYmNfdmVyc2lvbigpCiAgICAjIHB5MiAvIHB5MyBjb21wYXRpYmlsaXR5OgogICAgaWYgbm90IGlzaW5zdGFuY2UodmVyc2lvbl9zdHIsIHN0cik6CiAgICAgICAgdmVyc2lvbl9zdHIgPSB2ZXJzaW9uX3N0ci5kZWNvZGUoImFzY2lpIikKCiAgICByZXR1cm4gdmVyc2lvbl9zdHIKCgojIFNlcGFyYXRlZCBvdXQgZnJvbSBoYXZlX2NvbXBhdGlibGVfZ2xpYmMgZm9yIGVhc2llciB1bml0IHRlc3RpbmcKZGVmIGNoZWNrX2dsaWJjX3ZlcnNpb24odmVyc2lvbl9zdHIsIHJlcXVpcmVkX21ham9yLCBtaW5pbXVtX21pbm9yKToKICAgICMgUGFyc2Ugc3RyaW5nIGFuZCBjaGVjayBhZ2FpbnN0IHJlcXVlc3RlZCB2ZXJzaW9uLgogICAgIwogICAgIyBXZSB1c2UgYSByZWdleHAgaW5zdGVhZCBvZiBzdHIuc3BsaXQgYmVjYXVzZSB3ZSB3YW50IHRvIGRpc2NhcmQgYW55CiAgICAjIHJhbmRvbSBqdW5rIHRoYXQgbWlnaHQgY29tZSBhZnRlciB0aGUgbWlub3IgdmVyc2lvbiAtLSB0aGlzIG1pZ2h0IGhhcHBlbgogICAgIyBpbiBwYXRjaGVkL2ZvcmtlZCB2ZXJzaW9ucyBvZiBnbGliYyAoZS5nLiBMaW5hcm8ncyB2ZXJzaW9uIG9mIGdsaWJjCiAgICAjIHVzZXMgdmVyc2lvbiBzdHJpbmdzIGxpa2UgIjIuMjAtMjAxNC4xMSIpLiBTZWUgZ2gtMzU4OC4KICAgIG0gPSByZS5tYXRjaChyIig/UDxtYWpvcj5bMC05XSspXC4oP1A8bWlub3I+WzAtOV0rKSIsIHZlcnNpb25fc3RyKQogICAgaWYgbm90IG06CiAgICAgICAgd2FybmluZ3Mud2FybigiRXhwZWN0ZWQgZ2xpYmMgdmVyc2lvbiB3aXRoIDIgY29tcG9uZW50cyBtYWpvci5taW5vciwiCiAgICAgICAgICAgICAgICAgICAgICAiIGdvdDogJXMiICUgdmVyc2lvbl9zdHIsIFJ1bnRpbWVXYXJuaW5nKQogICAgICAgIHJldHVybiBGYWxzZQogICAgcmV0dXJuIChpbnQobS5ncm91cCgibWFqb3IiKSkgPT0gcmVxdWlyZWRfbWFqb3IgYW5kCiAgICAgICAgICAgIGludChtLmdyb3VwKCJtaW5vciIpKSA+PSBtaW5pbXVtX21pbm9yKQoKCmRlZiBoYXZlX2NvbXBhdGlibGVfZ2xpYmMocmVxdWlyZWRfbWFqb3IsIG1pbmltdW1fbWlub3IpOgogICAgdmVyc2lvbl9zdHIgPSBnbGliY192ZXJzaW9uX3N0cmluZygpCiAgICBpZiB2ZXJzaW9uX3N0ciBpcyBOb25lOgogICAgICAgIHJldHVybiBGYWxzZQogICAgcmV0dXJuIGNoZWNrX2dsaWJjX3ZlcnNpb24odmVyc2lvbl9zdHIsIHJlcXVpcmVkX21ham9yLCBtaW5pbXVtX21pbm9yKQoKCiMgcGxhdGZvcm0ubGliY192ZXIgcmVndWxhcmx5IHJldHVybnMgY29tcGxldGVseSBub25zZW5zaWNhbCBnbGliYwojIHZlcnNpb25zLiBFLmcuIG9uIG15IGNvbXB1dGVyLCBwbGF0Zm9ybSBzYXlzOgojCiMgICB+JCBweXRob24yLjcgLWMgJ2ltcG9ydCBwbGF0Zm9ybTsgcHJpbnQocGxhdGZvcm0ubGliY192ZXIoKSknCiMgICAoJ2dsaWJjJywgJzIuNycpCiMgICB+JCBweXRob24zLjUgLWMgJ2ltcG9ydCBwbGF0Zm9ybTsgcHJpbnQocGxhdGZvcm0ubGliY192ZXIoKSknCiMgICAoJ2dsaWJjJywgJzIuOScpCiMKIyBCdXQgdGhlIHRydXRoIGlzOgojCiMgICB+JCBsZGQgLS12ZXJzaW9uCiMgICBsZGQgKERlYmlhbiBHTElCQyAyLjIyLTExKSAyLjIyCiMKIyBUaGlzIGlzIHVuZm9ydHVuYXRlLCBiZWNhdXNlIGl0IG1lYW5zIHRoYXQgdGhlIGxpbmVoYXVsIGRhdGEgb24gbGliYwojIHZlcnNpb25zIHRoYXQgd2FzIGdlbmVyYXRlZCBieSBwaXAgOC4xLjIgYW5kIGVhcmxpZXIgaXMgdXNlbGVzcyBhbmQKIyBtaXNsZWFkaW5nLiBTb2x1dGlvbjogaW5zdGVhZCBvZiB1c2luZyBwbGF0Zm9ybSwgdXNlIG91ciBjb2RlIHRoYXQgYWN0dWFsbHkKIyB3b3Jrcy4KZGVmIGxpYmNfdmVyKCk6CiAgICBnbGliY192ZXJzaW9uID0gZ2xpYmNfdmVyc2lvbl9zdHJpbmcoKQogICAgaWYgZ2xpYmNfdmVyc2lvbiBpcyBOb25lOgogICAgICAgICMgRm9yIG5vbi1nbGliYyBwbGF0Zm9ybXMsIGZhbGwgYmFjayBvbiBwbGF0Zm9ybS5saWJjX3ZlcgogICAgICAgIHJldHVybiBwbGF0Zm9ybS5saWJjX3ZlcigpCiAgICBlbHNlOgogICAgICAgIHJldHVybiAoImdsaWJjIiwgZ2xpYmNfdmVyc2lvbikKUEsDBBQAAAAAAAAAIQCpNOkEMgsAADILAAAwAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvdXRpbHMvaGFzaGVzLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBoYXNobGliCgpmcm9tIHBpcC5leGNlcHRpb25zIGltcG9ydCBIYXNoTWlzbWF0Y2gsIEhhc2hNaXNzaW5nLCBJbnN0YWxsYXRpb25FcnJvcgpmcm9tIHBpcC51dGlscyBpbXBvcnQgcmVhZF9jaHVua3MKZnJvbSBwaXAuX3ZlbmRvci5zaXggaW1wb3J0IGl0ZXJpdGVtcywgaXRlcmtleXMsIGl0ZXJ2YWx1ZXMKCgojIFRoZSByZWNvbW1lbmRlZCBoYXNoIGFsZ28gb2YgdGhlIG1vbWVudC4gQ2hhbmdlIHRoaXMgd2hlbmV2ZXIgdGhlIHN0YXRlIG9mCiMgdGhlIGFydCBjaGFuZ2VzOyBpdCB3b24ndCBodXJ0IGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCkZBVk9SSVRFX0hBU0ggPSAnc2hhMjU2JwoKCiMgTmFtZXMgb2YgaGFzaGxpYiBhbGdvcml0aG1zIGFsbG93ZWQgYnkgdGhlIC0taGFzaCBvcHRpb24gYW5kIGBgcGlwIGhhc2hgYAojIEN1cnJlbnRseSwgdGhvc2UgYXJlIHRoZSBvbmVzIGF0IGxlYXN0IGFzIGNvbGxpc2lvbi1yZXNpc3RhbnQgYXMgc2hhMjU2LgpTVFJPTkdfSEFTSEVTID0gWydzaGEyNTYnLCAnc2hhMzg0JywgJ3NoYTUxMiddCgoKY2xhc3MgSGFzaGVzKG9iamVjdCk6CiAgICAiIiJBIHdyYXBwZXIgdGhhdCBidWlsZHMgbXVsdGlwbGUgaGFzaGVzIGF0IG9uY2UgYW5kIGNoZWNrcyB0aGVtIGFnYWluc3QKICAgIGtub3duLWdvb2QgdmFsdWVzCgogICAgIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgaGFzaGVzPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIDpwYXJhbSBoYXNoZXM6IEEgZGljdCBvZiBhbGdvcml0aG0gbmFtZXMgcG9pbnRpbmcgdG8gbGlzdHMgb2YgYWxsb3dlZAogICAgICAgICAgICBoZXggZGlnZXN0cwogICAgICAgICIiIgogICAgICAgIHNlbGYuX2FsbG93ZWQgPSB7fSBpZiBoYXNoZXMgaXMgTm9uZSBlbHNlIGhhc2hlcwoKICAgIGRlZiBjaGVja19hZ2FpbnN0X2NodW5rcyhzZWxmLCBjaHVua3MpOgogICAgICAgICIiIkNoZWNrIGdvb2QgaGFzaGVzIGFnYWluc3Qgb25lcyBidWlsdCBmcm9tIGl0ZXJhYmxlIG9mIGNodW5rcyBvZgogICAgICAgIGRhdGEuCgogICAgICAgIFJhaXNlIEhhc2hNaXNtYXRjaCBpZiBub25lIG1hdGNoLgoKICAgICAgICAiIiIKICAgICAgICBnb3RzID0ge30KICAgICAgICBmb3IgaGFzaF9uYW1lIGluIGl0ZXJrZXlzKHNlbGYuX2FsbG93ZWQpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBnb3RzW2hhc2hfbmFtZV0gPSBoYXNobGliLm5ldyhoYXNoX25hbWUpCiAgICAgICAgICAgIGV4Y2VwdCAoVmFsdWVFcnJvciwgVHlwZUVycm9yKToKICAgICAgICAgICAgICAgIHJhaXNlIEluc3RhbGxhdGlvbkVycm9yKCdVbmtub3duIGhhc2ggbmFtZTogJXMnICUgaGFzaF9uYW1lKQoKICAgICAgICBmb3IgY2h1bmsgaW4gY2h1bmtzOgogICAgICAgICAgICBmb3IgaGFzaCBpbiBpdGVydmFsdWVzKGdvdHMpOgogICAgICAgICAgICAgICAgaGFzaC51cGRhdGUoY2h1bmspCgogICAgICAgIGZvciBoYXNoX25hbWUsIGdvdCBpbiBpdGVyaXRlbXMoZ290cyk6CiAgICAgICAgICAgIGlmIGdvdC5oZXhkaWdlc3QoKSBpbiBzZWxmLl9hbGxvd2VkW2hhc2hfbmFtZV06CiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICBzZWxmLl9yYWlzZShnb3RzKQoKICAgIGRlZiBfcmFpc2Uoc2VsZiwgZ290cyk6CiAgICAgICAgcmFpc2UgSGFzaE1pc21hdGNoKHNlbGYuX2FsbG93ZWQsIGdvdHMpCgogICAgZGVmIGNoZWNrX2FnYWluc3RfZmlsZShzZWxmLCBmaWxlKToKICAgICAgICAiIiJDaGVjayBnb29kIGhhc2hlcyBhZ2FpbnN0IGEgZmlsZS1saWtlIG9iamVjdAoKICAgICAgICBSYWlzZSBIYXNoTWlzbWF0Y2ggaWYgbm9uZSBtYXRjaC4KCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuY2hlY2tfYWdhaW5zdF9jaHVua3MocmVhZF9jaHVua3MoZmlsZSkpCgogICAgZGVmIGNoZWNrX2FnYWluc3RfcGF0aChzZWxmLCBwYXRoKToKICAgICAgICB3aXRoIG9wZW4ocGF0aCwgJ3JiJykgYXMgZmlsZToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2hlY2tfYWdhaW5zdF9maWxlKGZpbGUpCgogICAgZGVmIF9fbm9uemVyb19fKHNlbGYpOgogICAgICAgICIiIlJldHVybiB3aGV0aGVyIEkga25vdyBhbnkga25vd24tZ29vZCBoYXNoZXMuIiIiCiAgICAgICAgcmV0dXJuIGJvb2woc2VsZi5fYWxsb3dlZCkKCiAgICBkZWYgX19ib29sX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX19ub256ZXJvX18oKQoKCmNsYXNzIE1pc3NpbmdIYXNoZXMoSGFzaGVzKToKICAgICIiIkEgd29ya2FsaWtlIGZvciBIYXNoZXMgdXNlZCB3aGVuIHdlJ3JlIG1pc3NpbmcgYSBoYXNoIGZvciBhIHJlcXVpcmVtZW50CgogICAgSXQgY29tcHV0ZXMgdGhlIGFjdHVhbCBoYXNoIG9mIHRoZSByZXF1aXJlbWVudCBhbmQgcmFpc2VzIGEgSGFzaE1pc3NpbmcKICAgIGV4Y2VwdGlvbiBzaG93aW5nIGl0IHRvIHRoZSB1c2VyLgoKICAgICIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgICIiIkRvbid0IG9mZmVyIHRoZSBgYGhhc2hlc2BgIGt3YXJnLiIiIgogICAgICAgICMgUGFzcyBvdXIgZmF2b3JpdGUgaGFzaCBpbiB0byBnZW5lcmF0ZSBhICJnb3R0ZW4gaGFzaCIuIFdpdGggdGhlCiAgICAgICAgIyBlbXB0eSBsaXN0LCBpdCB3aWxsIG5ldmVyIG1hdGNoLCBzbyBhbiBlcnJvciB3aWxsIGFsd2F5cyByYWlzZS4KICAgICAgICBzdXBlcihNaXNzaW5nSGFzaGVzLCBzZWxmKS5fX2luaXRfXyhoYXNoZXM9e0ZBVk9SSVRFX0hBU0g6IFtdfSkKCiAgICBkZWYgX3JhaXNlKHNlbGYsIGdvdHMpOgogICAgICAgIHJhaXNlIEhhc2hNaXNzaW5nKGdvdHNbRkFWT1JJVEVfSEFTSF0uaGV4ZGlnZXN0KCkpClBLAwQUAAAAAAAAACEAZybXeP8MAAD/DAAAMQAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL3V0aWxzL2xvZ2dpbmcucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IGNvbnRleHRsaWIKaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IGxvZ2dpbmcuaGFuZGxlcnMKaW1wb3J0IG9zCgp0cnk6CiAgICBpbXBvcnQgdGhyZWFkaW5nCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGltcG9ydCBkdW1teV90aHJlYWRpbmcgYXMgdGhyZWFkaW5nCgpmcm9tIHBpcC5jb21wYXQgaW1wb3J0IFdJTkRPV1MKZnJvbSBwaXAudXRpbHMgaW1wb3J0IGVuc3VyZV9kaXIKCnRyeToKICAgIGZyb20gcGlwLl92ZW5kb3IgaW1wb3J0IGNvbG9yYW1hCiMgTG90cyBvZiBkaWZmZXJlbnQgZXJyb3JzIGNhbiBjb21lIGZyb20gdGhpcywgaW5jbHVkaW5nIFN5c3RlbUVycm9yIGFuZAojIEltcG9ydEVycm9yLgpleGNlcHQgRXhjZXB0aW9uOgogICAgY29sb3JhbWEgPSBOb25lCgoKX2xvZ19zdGF0ZSA9IHRocmVhZGluZy5sb2NhbCgpCl9sb2dfc3RhdGUuaW5kZW50YXRpb24gPSAwCgoKQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKZGVmIGluZGVudF9sb2cobnVtPTIpOgogICAgIiIiCiAgICBBIGNvbnRleHQgbWFuYWdlciB3aGljaCB3aWxsIGNhdXNlIHRoZSBsb2cgb3V0cHV0IHRvIGJlIGluZGVudGVkIGZvciBhbnkKICAgIGxvZyBtZXNzYWdlcyBlbWl0dGVkIGluc2lkZSBpdC4KICAgICIiIgogICAgX2xvZ19zdGF0ZS5pbmRlbnRhdGlvbiArPSBudW0KICAgIHRyeToKICAgICAgICB5aWVsZAogICAgZmluYWxseToKICAgICAgICBfbG9nX3N0YXRlLmluZGVudGF0aW9uIC09IG51bQoKCmRlZiBnZXRfaW5kZW50YXRpb24oKToKICAgIHJldHVybiBnZXRhdHRyKF9sb2dfc3RhdGUsICdpbmRlbnRhdGlvbicsIDApCgoKY2xhc3MgSW5kZW50aW5nRm9ybWF0dGVyKGxvZ2dpbmcuRm9ybWF0dGVyKToKCiAgICBkZWYgZm9ybWF0KHNlbGYsIHJlY29yZCk6CiAgICAgICAgIiIiCiAgICAgICAgQ2FsbHMgdGhlIHN0YW5kYXJkIGZvcm1hdHRlciwgYnV0IHdpbGwgaW5kZW50IGFsbCBvZiB0aGUgbG9nIG1lc3NhZ2VzCiAgICAgICAgYnkgb3VyIGN1cnJlbnQgaW5kZW50YXRpb24gbGV2ZWwuCiAgICAgICAgIiIiCiAgICAgICAgZm9ybWF0dGVkID0gbG9nZ2luZy5Gb3JtYXR0ZXIuZm9ybWF0KHNlbGYsIHJlY29yZCkKICAgICAgICBmb3JtYXR0ZWQgPSAiIi5qb2luKFsKICAgICAgICAgICAgKCIgIiAqIGdldF9pbmRlbnRhdGlvbigpKSArIGxpbmUKICAgICAgICAgICAgZm9yIGxpbmUgaW4gZm9ybWF0dGVkLnNwbGl0bGluZXMoVHJ1ZSkKICAgICAgICBdKQogICAgICAgIHJldHVybiBmb3JtYXR0ZWQKCgpkZWYgX2NvbG9yX3dyYXAoKmNvbG9ycyk6CiAgICBkZWYgd3JhcHBlZChpbnApOgogICAgICAgIHJldHVybiAiIi5qb2luKGxpc3QoY29sb3JzKSArIFtpbnAsIGNvbG9yYW1hLlN0eWxlLlJFU0VUX0FMTF0pCiAgICByZXR1cm4gd3JhcHBlZAoKCmNsYXNzIENvbG9yaXplZFN0cmVhbUhhbmRsZXIobG9nZ2luZy5TdHJlYW1IYW5kbGVyKToKCiAgICAjIERvbid0IGJ1aWxkIHVwIGEgbGlzdCBvZiBjb2xvcnMgaWYgd2UgZG9uJ3QgaGF2ZSBjb2xvcmFtYQogICAgaWYgY29sb3JhbWE6CiAgICAgICAgQ09MT1JTID0gWwogICAgICAgICAgICAjIFRoaXMgbmVlZHMgdG8gYmUgaW4gb3JkZXIgZnJvbSBoaWdoZXN0IGxvZ2dpbmcgbGV2ZWwgdG8gbG93ZXN0LgogICAgICAgICAgICAobG9nZ2luZy5FUlJPUiwgX2NvbG9yX3dyYXAoY29sb3JhbWEuRm9yZS5SRUQpKSwKICAgICAgICAgICAgKGxvZ2dpbmcuV0FSTklORywgX2NvbG9yX3dyYXAoY29sb3JhbWEuRm9yZS5ZRUxMT1cpKSwKICAgICAgICBdCiAgICBlbHNlOgogICAgICAgIENPTE9SUyA9IFtdCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbT1Ob25lKToKICAgICAgICBsb2dnaW5nLlN0cmVhbUhhbmRsZXIuX19pbml0X18oc2VsZiwgc3RyZWFtKQoKICAgICAgICBpZiBXSU5ET1dTIGFuZCBjb2xvcmFtYToKICAgICAgICAgICAgc2VsZi5zdHJlYW0gPSBjb2xvcmFtYS5BbnNpVG9XaW4zMihzZWxmLnN0cmVhbSkKCiAgICBkZWYgc2hvdWxkX2NvbG9yKHNlbGYpOgogICAgICAgICMgRG9uJ3QgY29sb3JpemUgdGhpbmdzIGlmIHdlIGRvIG5vdCBoYXZlIGNvbG9yYW1hCiAgICAgICAgaWYgbm90IGNvbG9yYW1hOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgcmVhbF9zdHJlYW0gPSAoCiAgICAgICAgICAgIHNlbGYuc3RyZWFtIGlmIG5vdCBpc2luc3RhbmNlKHNlbGYuc3RyZWFtLCBjb2xvcmFtYS5BbnNpVG9XaW4zMikKICAgICAgICAgICAgZWxzZSBzZWxmLnN0cmVhbS53cmFwcGVkCiAgICAgICAgKQoKICAgICAgICAjIElmIHRoZSBzdHJlYW0gaXMgYSB0dHkgd2Ugc2hvdWxkIGNvbG9yIGl0CiAgICAgICAgaWYgaGFzYXR0cihyZWFsX3N0cmVhbSwgImlzYXR0eSIpIGFuZCByZWFsX3N0cmVhbS5pc2F0dHkoKToKICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICAgICAgIyBJZiB3ZSBoYXZlIGFuIEFTTkkgdGVybSB3ZSBzaG91bGQgY29sb3IgaXQKICAgICAgICBpZiBvcy5lbnZpcm9uLmdldCgiVEVSTSIpID09ICJBTlNJIjoKICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICAgICAgIyBJZiBhbnl0aGluZyBlbHNlIHdlIHNob3VsZCBub3QgY29sb3IgaXQKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgZm9ybWF0KHNlbGYsIHJlY29yZCk6CiAgICAgICAgbXNnID0gbG9nZ2luZy5TdHJlYW1IYW5kbGVyLmZvcm1hdChzZWxmLCByZWNvcmQpCgogICAgICAgIGlmIHNlbGYuc2hvdWxkX2NvbG9yKCk6CiAgICAgICAgICAgIGZvciBsZXZlbCwgY29sb3IgaW4gc2VsZi5DT0xPUlM6CiAgICAgICAgICAgICAgICBpZiByZWNvcmQubGV2ZWxubyA+PSBsZXZlbDoKICAgICAgICAgICAgICAgICAgICBtc2cgPSBjb2xvcihtc2cpCiAgICAgICAgICAgICAgICAgICAgYnJlYWsKCiAgICAgICAgcmV0dXJuIG1zZwoKCmNsYXNzIEJldHRlclJvdGF0aW5nRmlsZUhhbmRsZXIobG9nZ2luZy5oYW5kbGVycy5Sb3RhdGluZ0ZpbGVIYW5kbGVyKToKCiAgICBkZWYgX29wZW4oc2VsZik6CiAgICAgICAgZW5zdXJlX2Rpcihvcy5wYXRoLmRpcm5hbWUoc2VsZi5iYXNlRmlsZW5hbWUpKQogICAgICAgIHJldHVybiBsb2dnaW5nLmhhbmRsZXJzLlJvdGF0aW5nRmlsZUhhbmRsZXIuX29wZW4oc2VsZikKCgpjbGFzcyBNYXhMZXZlbEZpbHRlcihsb2dnaW5nLkZpbHRlcik6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGxldmVsKToKICAgICAgICBzZWxmLmxldmVsID0gbGV2ZWwKCiAgICBkZWYgZmlsdGVyKHNlbGYsIHJlY29yZCk6CiAgICAgICAgcmV0dXJuIHJlY29yZC5sZXZlbG5vIDwgc2VsZi5sZXZlbApQSwMEFAAAAAAAAAAhAEhU2OpPFQAATxUAADIAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC91dGlscy9vdXRkYXRlZC5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgZGF0ZXRpbWUKaW1wb3J0IGpzb24KaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IG9zLnBhdGgKaW1wb3J0IHN5cwoKZnJvbSBwaXAuX3ZlbmRvciBpbXBvcnQgbG9ja2ZpbGUKZnJvbSBwaXAuX3ZlbmRvci5wYWNrYWdpbmcgaW1wb3J0IHZlcnNpb24gYXMgcGFja2FnaW5nX3ZlcnNpb24KCmZyb20gcGlwLmNvbXBhdCBpbXBvcnQgdG90YWxfc2Vjb25kcywgV0lORE9XUwpmcm9tIHBpcC5tb2RlbHMgaW1wb3J0IFB5UEkKZnJvbSBwaXAubG9jYXRpb25zIGltcG9ydCBVU0VSX0NBQ0hFX0RJUiwgcnVubmluZ191bmRlcl92aXJ0dWFsZW52CmZyb20gcGlwLnV0aWxzIGltcG9ydCBlbnN1cmVfZGlyLCBnZXRfaW5zdGFsbGVkX3ZlcnNpb24KZnJvbSBwaXAudXRpbHMuZmlsZXN5c3RlbSBpbXBvcnQgY2hlY2tfcGF0aF9vd25lcgoKClNFTEZDSEVDS19EQVRFX0ZNVCA9ICIlWS0lbS0lZFQlSDolTTolU1oiCgoKbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgoKY2xhc3MgVmlydHVhbGVudlNlbGZDaGVja1N0YXRlKG9iamVjdCk6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc2VsZi5zdGF0ZWZpbGVfcGF0aCA9IG9zLnBhdGguam9pbihzeXMucHJlZml4LCAicGlwLXNlbGZjaGVjay5qc29uIikKCiAgICAgICAgIyBMb2FkIHRoZSBleGlzdGluZyBzdGF0ZQogICAgICAgIHRyeToKICAgICAgICAgICAgd2l0aCBvcGVuKHNlbGYuc3RhdGVmaWxlX3BhdGgpIGFzIHN0YXRlZmlsZToKICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBqc29uLmxvYWQoc3RhdGVmaWxlKQogICAgICAgIGV4Y2VwdCAoSU9FcnJvciwgVmFsdWVFcnJvcik6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSB7fQoKICAgIGRlZiBzYXZlKHNlbGYsIHB5cGlfdmVyc2lvbiwgY3VycmVudF90aW1lKToKICAgICAgICAjIEF0dGVtcHQgdG8gd3JpdGUgb3V0IG91ciB2ZXJzaW9uIGNoZWNrIGZpbGUKICAgICAgICB3aXRoIG9wZW4oc2VsZi5zdGF0ZWZpbGVfcGF0aCwgInciKSBhcyBzdGF0ZWZpbGU6CiAgICAgICAgICAgIGpzb24uZHVtcCgKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAibGFzdF9jaGVjayI6IGN1cnJlbnRfdGltZS5zdHJmdGltZShTRUxGQ0hFQ0tfREFURV9GTVQpLAogICAgICAgICAgICAgICAgICAgICJweXBpX3ZlcnNpb24iOiBweXBpX3ZlcnNpb24sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgc3RhdGVmaWxlLAogICAgICAgICAgICAgICAgc29ydF9rZXlzPVRydWUsCiAgICAgICAgICAgICAgICBzZXBhcmF0b3JzPSgiLCIsICI6IikKICAgICAgICAgICAgKQoKCmNsYXNzIEdsb2JhbFNlbGZDaGVja1N0YXRlKG9iamVjdCk6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc2VsZi5zdGF0ZWZpbGVfcGF0aCA9IG9zLnBhdGguam9pbihVU0VSX0NBQ0hFX0RJUiwgInNlbGZjaGVjay5qc29uIikKCiAgICAgICAgIyBMb2FkIHRoZSBleGlzdGluZyBzdGF0ZQogICAgICAgIHRyeToKICAgICAgICAgICAgd2l0aCBvcGVuKHNlbGYuc3RhdGVmaWxlX3BhdGgpIGFzIHN0YXRlZmlsZToKICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBqc29uLmxvYWQoc3RhdGVmaWxlKVtzeXMucHJlZml4XQogICAgICAgIGV4Y2VwdCAoSU9FcnJvciwgVmFsdWVFcnJvciwgS2V5RXJyb3IpOgogICAgICAgICAgICBzZWxmLnN0YXRlID0ge30KCiAgICBkZWYgc2F2ZShzZWxmLCBweXBpX3ZlcnNpb24sIGN1cnJlbnRfdGltZSk6CiAgICAgICAgIyBDaGVjayB0byBtYWtlIHN1cmUgdGhhdCB3ZSBvd24gdGhlIGRpcmVjdG9yeQogICAgICAgIGlmIG5vdCBjaGVja19wYXRoX293bmVyKG9zLnBhdGguZGlybmFtZShzZWxmLnN0YXRlZmlsZV9wYXRoKSk6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICAjIE5vdyB0aGF0IHdlJ3ZlIGVuc3VyZWQgdGhlIGRpcmVjdG9yeSBpcyBvd25lZCBieSB0aGlzIHVzZXIsIHdlJ2xsIGdvCiAgICAgICAgIyBhaGVhZCBhbmQgbWFrZSBzdXJlIHRoYXQgYWxsIG91ciBkaXJlY3RvcmllcyBhcmUgY3JlYXRlZC4KICAgICAgICBlbnN1cmVfZGlyKG9zLnBhdGguZGlybmFtZShzZWxmLnN0YXRlZmlsZV9wYXRoKSkKCiAgICAgICAgIyBBdHRlbXB0IHRvIHdyaXRlIG91dCBvdXIgdmVyc2lvbiBjaGVjayBmaWxlCiAgICAgICAgd2l0aCBsb2NrZmlsZS5Mb2NrRmlsZShzZWxmLnN0YXRlZmlsZV9wYXRoKToKICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoc2VsZi5zdGF0ZWZpbGVfcGF0aCk6CiAgICAgICAgICAgICAgICB3aXRoIG9wZW4oc2VsZi5zdGF0ZWZpbGVfcGF0aCkgYXMgc3RhdGVmaWxlOgogICAgICAgICAgICAgICAgICAgIHN0YXRlID0ganNvbi5sb2FkKHN0YXRlZmlsZSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHN0YXRlID0ge30KCiAgICAgICAgICAgIHN0YXRlW3N5cy5wcmVmaXhdID0gewogICAgICAgICAgICAgICAgImxhc3RfY2hlY2siOiBjdXJyZW50X3RpbWUuc3RyZnRpbWUoU0VMRkNIRUNLX0RBVEVfRk1UKSwKICAgICAgICAgICAgICAgICJweXBpX3ZlcnNpb24iOiBweXBpX3ZlcnNpb24sCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHdpdGggb3BlbihzZWxmLnN0YXRlZmlsZV9wYXRoLCAidyIpIGFzIHN0YXRlZmlsZToKICAgICAgICAgICAgICAgIGpzb24uZHVtcChzdGF0ZSwgc3RhdGVmaWxlLCBzb3J0X2tleXM9VHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBzZXBhcmF0b3JzPSgiLCIsICI6IikpCgoKZGVmIGxvYWRfc2VsZmNoZWNrX3N0YXRlZmlsZSgpOgogICAgaWYgcnVubmluZ191bmRlcl92aXJ0dWFsZW52KCk6CiAgICAgICAgcmV0dXJuIFZpcnR1YWxlbnZTZWxmQ2hlY2tTdGF0ZSgpCiAgICBlbHNlOgogICAgICAgIHJldHVybiBHbG9iYWxTZWxmQ2hlY2tTdGF0ZSgpCgoKZGVmIHBpcF92ZXJzaW9uX2NoZWNrKHNlc3Npb24pOgogICAgIiIiQ2hlY2sgZm9yIGFuIHVwZGF0ZSBmb3IgcGlwLgoKICAgIExpbWl0IHRoZSBmcmVxdWVuY3kgb2YgY2hlY2tzIHRvIG9uY2UgcGVyIHdlZWsuIFN0YXRlIGlzIHN0b3JlZCBlaXRoZXIgaW4KICAgIHRoZSBhY3RpdmUgdmlydHVhbGVudiBvciBpbiB0aGUgdXNlcidzIFVTRVJfQ0FDSEVfRElSIGtleWVkIG9mZiB0aGUgcHJlZml4CiAgICBvZiB0aGUgcGlwIHNjcmlwdCBwYXRoLgogICAgIiIiCiAgICBpbnN0YWxsZWRfdmVyc2lvbiA9IGdldF9pbnN0YWxsZWRfdmVyc2lvbigicGlwIikKICAgIGlmIGluc3RhbGxlZF92ZXJzaW9uIGlzIE5vbmU6CiAgICAgICAgcmV0dXJuCgogICAgcGlwX3ZlcnNpb24gPSBwYWNrYWdpbmdfdmVyc2lvbi5wYXJzZShpbnN0YWxsZWRfdmVyc2lvbikKICAgIHB5cGlfdmVyc2lvbiA9IE5vbmUKCiAgICB0cnk6CiAgICAgICAgc3RhdGUgPSBsb2FkX3NlbGZjaGVja19zdGF0ZWZpbGUoKQoKICAgICAgICBjdXJyZW50X3RpbWUgPSBkYXRldGltZS5kYXRldGltZS51dGNub3coKQogICAgICAgICMgRGV0ZXJtaW5lIGlmIHdlIG5lZWQgdG8gcmVmcmVzaCB0aGUgc3RhdGUKICAgICAgICBpZiAibGFzdF9jaGVjayIgaW4gc3RhdGUuc3RhdGUgYW5kICJweXBpX3ZlcnNpb24iIGluIHN0YXRlLnN0YXRlOgogICAgICAgICAgICBsYXN0X2NoZWNrID0gZGF0ZXRpbWUuZGF0ZXRpbWUuc3RycHRpbWUoCiAgICAgICAgICAgICAgICBzdGF0ZS5zdGF0ZVsibGFzdF9jaGVjayJdLAogICAgICAgICAgICAgICAgU0VMRkNIRUNLX0RBVEVfRk1UCiAgICAgICAgICAgICkKICAgICAgICAgICAgaWYgdG90YWxfc2Vjb25kcyhjdXJyZW50X3RpbWUgLSBsYXN0X2NoZWNrKSA8IDcgKiAyNCAqIDYwICogNjA6CiAgICAgICAgICAgICAgICBweXBpX3ZlcnNpb24gPSBzdGF0ZS5zdGF0ZVsicHlwaV92ZXJzaW9uIl0KCiAgICAgICAgIyBSZWZyZXNoIHRoZSB2ZXJzaW9uIGlmIHdlIG5lZWQgdG8gb3IganVzdCBzZWUgaWYgd2UgbmVlZCB0byB3YXJuCiAgICAgICAgaWYgcHlwaV92ZXJzaW9uIGlzIE5vbmU6CiAgICAgICAgICAgIHJlc3AgPSBzZXNzaW9uLmdldCgKICAgICAgICAgICAgICAgIFB5UEkucGlwX2pzb25fdXJsLAogICAgICAgICAgICAgICAgaGVhZGVycz17IkFjY2VwdCI6ICJhcHBsaWNhdGlvbi9qc29uIn0sCiAgICAgICAgICAgICkKICAgICAgICAgICAgcmVzcC5yYWlzZV9mb3Jfc3RhdHVzKCkKICAgICAgICAgICAgcHlwaV92ZXJzaW9uID0gWwogICAgICAgICAgICAgICAgdiBmb3IgdiBpbiBzb3J0ZWQoCiAgICAgICAgICAgICAgICAgICAgbGlzdChyZXNwLmpzb24oKVsicmVsZWFzZXMiXSksCiAgICAgICAgICAgICAgICAgICAga2V5PXBhY2thZ2luZ192ZXJzaW9uLnBhcnNlLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgaWYgbm90IHBhY2thZ2luZ192ZXJzaW9uLnBhcnNlKHYpLmlzX3ByZXJlbGVhc2UKICAgICAgICAgICAgXVstMV0KCiAgICAgICAgICAgICMgc2F2ZSB0aGF0IHdlJ3ZlIHBlcmZvcm1lZCBhIGNoZWNrCiAgICAgICAgICAgIHN0YXRlLnNhdmUocHlwaV92ZXJzaW9uLCBjdXJyZW50X3RpbWUpCgogICAgICAgIHJlbW90ZV92ZXJzaW9uID0gcGFja2FnaW5nX3ZlcnNpb24ucGFyc2UocHlwaV92ZXJzaW9uKQoKICAgICAgICAjIERldGVybWluZSBpZiBvdXIgcHlwaV92ZXJzaW9uIGlzIG9sZGVyCiAgICAgICAgaWYgKHBpcF92ZXJzaW9uIDwgcmVtb3RlX3ZlcnNpb24gYW5kCiAgICAgICAgICAgICAgICBwaXBfdmVyc2lvbi5iYXNlX3ZlcnNpb24gIT0gcmVtb3RlX3ZlcnNpb24uYmFzZV92ZXJzaW9uKToKICAgICAgICAgICAgIyBBZHZpc2UgInB5dGhvbiAtbSBwaXAiIG9uIFdpbmRvd3MgdG8gYXZvaWQgaXNzdWVzCiAgICAgICAgICAgICMgd2l0aCBvdmVyd3JpdGluZyBwaXAuZXhlLgogICAgICAgICAgICBpZiBXSU5ET1dTOgogICAgICAgICAgICAgICAgcGlwX2NtZCA9ICJweXRob24gLW0gcGlwIgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcGlwX2NtZCA9ICJwaXAiCiAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgIllvdSBhcmUgdXNpbmcgcGlwIHZlcnNpb24gJXMsIGhvd2V2ZXIgdmVyc2lvbiAlcyBpcyAiCiAgICAgICAgICAgICAgICAiYXZhaWxhYmxlLlxuWW91IHNob3VsZCBjb25zaWRlciB1cGdyYWRpbmcgdmlhIHRoZSAiCiAgICAgICAgICAgICAgICAiJyVzIGluc3RhbGwgLS11cGdyYWRlIHBpcCcgY29tbWFuZC4iLAogICAgICAgICAgICAgICAgcGlwX3ZlcnNpb24sIHB5cGlfdmVyc2lvbiwgcGlwX2NtZAogICAgICAgICAgICApCgogICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICBsb2dnZXIuZGVidWcoCiAgICAgICAgICAgICJUaGVyZSB3YXMgYW4gZXJyb3IgY2hlY2tpbmcgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHBpcCIsCiAgICAgICAgICAgIGV4Y19pbmZvPVRydWUsCiAgICAgICAgKQpQSwMEFAAAAAAAAAAhAA3mkrggCAAAIAgAADMAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC91dGlscy9wYWNrYWdpbmcucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKZnJvbSBlbWFpbC5wYXJzZXIgaW1wb3J0IEZlZWRQYXJzZXIKCmltcG9ydCBsb2dnaW5nCmltcG9ydCBzeXMKCmZyb20gcGlwLl92ZW5kb3IucGFja2FnaW5nIGltcG9ydCBzcGVjaWZpZXJzCmZyb20gcGlwLl92ZW5kb3IucGFja2FnaW5nIGltcG9ydCB2ZXJzaW9uCmZyb20gcGlwLl92ZW5kb3IgaW1wb3J0IHBrZ19yZXNvdXJjZXMKCmZyb20gcGlwIGltcG9ydCBleGNlcHRpb25zCgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCgpkZWYgY2hlY2tfcmVxdWlyZXNfcHl0aG9uKHJlcXVpcmVzX3B5dGhvbik6CiAgICAiIiIKICAgIENoZWNrIGlmIHRoZSBweXRob24gdmVyc2lvbiBpbiB1c2UgbWF0Y2ggdGhlIGByZXF1aXJlc19weXRob25gIHNwZWNpZmllci4KCiAgICBSZXR1cm5zIGBUcnVlYCBpZiB0aGUgdmVyc2lvbiBvZiBweXRob24gaW4gdXNlIG1hdGNoZXMgdGhlIHJlcXVpcmVtZW50LgogICAgUmV0dXJucyBgRmFsc2VgIGlmIHRoZSB2ZXJzaW9uIG9mIHB5dGhvbiBpbiB1c2UgZG9lcyBub3QgbWF0Y2hlcyB0aGUKICAgIHJlcXVpcmVtZW50LgoKICAgIFJhaXNlcyBhbiBJbnZhbGlkU3BlY2lmaWVyIGlmIGByZXF1aXJlc19weXRob25gIGhhdmUgYW4gaW52YWxpZCBmb3JtYXQuCiAgICAiIiIKICAgIGlmIHJlcXVpcmVzX3B5dGhvbiBpcyBOb25lOgogICAgICAgICMgVGhlIHBhY2thZ2UgcHJvdmlkZXMgbm8gaW5mb3JtYXRpb24KICAgICAgICByZXR1cm4gVHJ1ZQogICAgcmVxdWlyZXNfcHl0aG9uX3NwZWNpZmllciA9IHNwZWNpZmllcnMuU3BlY2lmaWVyU2V0KHJlcXVpcmVzX3B5dGhvbikKCiAgICAjIFdlIG9ubHkgdXNlIG1ham9yLm1pbm9yLm1pY3JvCiAgICBweXRob25fdmVyc2lvbiA9IHZlcnNpb24ucGFyc2UoJy4nLmpvaW4obWFwKHN0ciwgc3lzLnZlcnNpb25faW5mb1s6M10pKSkKICAgIHJldHVybiBweXRob25fdmVyc2lvbiBpbiByZXF1aXJlc19weXRob25fc3BlY2lmaWVyCgoKZGVmIGdldF9tZXRhZGF0YShkaXN0KToKICAgIGlmIChpc2luc3RhbmNlKGRpc3QsIHBrZ19yZXNvdXJjZXMuRGlzdEluZm9EaXN0cmlidXRpb24pIGFuZAogICAgICAgICAgICBkaXN0Lmhhc19tZXRhZGF0YSgnTUVUQURBVEEnKSk6CiAgICAgICAgcmV0dXJuIGRpc3QuZ2V0X21ldGFkYXRhKCdNRVRBREFUQScpCiAgICBlbGlmIGRpc3QuaGFzX21ldGFkYXRhKCdQS0ctSU5GTycpOgogICAgICAgIHJldHVybiBkaXN0LmdldF9tZXRhZGF0YSgnUEtHLUlORk8nKQoKCmRlZiBjaGVja19kaXN0X3JlcXVpcmVzX3B5dGhvbihkaXN0KToKICAgIG1ldGFkYXRhID0gZ2V0X21ldGFkYXRhKGRpc3QpCiAgICBmZWVkX3BhcnNlciA9IEZlZWRQYXJzZXIoKQogICAgZmVlZF9wYXJzZXIuZmVlZChtZXRhZGF0YSkKICAgIHBrZ19pbmZvX2RpY3QgPSBmZWVkX3BhcnNlci5jbG9zZSgpCiAgICByZXF1aXJlc19weXRob24gPSBwa2dfaW5mb19kaWN0LmdldCgnUmVxdWlyZXMtUHl0aG9uJykKICAgIHRyeToKICAgICAgICBpZiBub3QgY2hlY2tfcmVxdWlyZXNfcHl0aG9uKHJlcXVpcmVzX3B5dGhvbik6CiAgICAgICAgICAgIHJhaXNlIGV4Y2VwdGlvbnMuVW5zdXBwb3J0ZWRQeXRob25WZXJzaW9uKAogICAgICAgICAgICAgICAgIiVzIHJlcXVpcmVzIFB5dGhvbiAnJXMnIGJ1dCB0aGUgcnVubmluZyBQeXRob24gaXMgJXMiICUgKAogICAgICAgICAgICAgICAgICAgIGRpc3QucHJvamVjdF9uYW1lLAogICAgICAgICAgICAgICAgICAgIHJlcXVpcmVzX3B5dGhvbiwKICAgICAgICAgICAgICAgICAgICAnLicuam9pbihtYXAoc3RyLCBzeXMudmVyc2lvbl9pbmZvWzozXSkpLCkKICAgICAgICAgICAgKQogICAgZXhjZXB0IHNwZWNpZmllcnMuSW52YWxpZFNwZWNpZmllciBhcyBlOgogICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAiUGFja2FnZSAlcyBoYXMgYW4gaW52YWxpZCBSZXF1aXJlcy1QeXRob24gZW50cnkgJXMgLSAlcyIgJSAoCiAgICAgICAgICAgICAgICBkaXN0LnByb2plY3RfbmFtZSwgcmVxdWlyZXNfcHl0aG9uLCBlKSkKICAgICAgICByZXR1cm4KUEsDBBQAAAAAAAAAIQAWovJKFgEAABYBAAA6AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvdXRpbHMvc2V0dXB0b29sc19idWlsZC5weSMgU2hpbSB0byB3cmFwIHNldHVwLnB5IGludm9jYXRpb24gd2l0aCBzZXR1cHRvb2xzClNFVFVQVE9PTFNfU0hJTSA9ICgKICAgICJpbXBvcnQgc2V0dXB0b29scywgdG9rZW5pemU7X19maWxlX189JXI7IgogICAgImY9Z2V0YXR0cih0b2tlbml6ZSwgJ29wZW4nLCBvcGVuKShfX2ZpbGVfXyk7IgogICAgImNvZGU9Zi5yZWFkKCkucmVwbGFjZSgnXFxyXFxuJywgJ1xcbicpOyIKICAgICJmLmNsb3NlKCk7IgogICAgImV4ZWMoY29tcGlsZShjb2RlLCBfX2ZpbGVfXywgJ2V4ZWMnKSkiCikKUEsDBBQAAAAAAAAAIQDl4pCVTS0AAE0tAAAsAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvdXRpbHMvdWkucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydApmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGRpdmlzaW9uCgppbXBvcnQgaXRlcnRvb2xzCmltcG9ydCBzeXMKZnJvbSBzaWduYWwgaW1wb3J0IHNpZ25hbCwgU0lHSU5ULCBkZWZhdWx0X2ludF9oYW5kbGVyCmltcG9ydCB0aW1lCmltcG9ydCBjb250ZXh0bGliCmltcG9ydCBsb2dnaW5nCgpmcm9tIHBpcC5jb21wYXQgaW1wb3J0IFdJTkRPV1MKZnJvbSBwaXAudXRpbHMgaW1wb3J0IGZvcm1hdF9zaXplCmZyb20gcGlwLnV0aWxzLmxvZ2dpbmcgaW1wb3J0IGdldF9pbmRlbnRhdGlvbgpmcm9tIHBpcC5fdmVuZG9yIGltcG9ydCBzaXgKZnJvbSBwaXAuX3ZlbmRvci5wcm9ncmVzcy5iYXIgaW1wb3J0IEJhciwgSW5jcmVtZW50YWxCYXIKZnJvbSBwaXAuX3ZlbmRvci5wcm9ncmVzcy5oZWxwZXJzIGltcG9ydCAoV3JpdGVsbk1peGluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBISURFX0NVUlNPUiwgU0hPV19DVVJTT1IpCmZyb20gcGlwLl92ZW5kb3IucHJvZ3Jlc3Muc3Bpbm5lciBpbXBvcnQgU3Bpbm5lcgoKdHJ5OgogICAgZnJvbSBwaXAuX3ZlbmRvciBpbXBvcnQgY29sb3JhbWEKIyBMb3RzIG9mIGRpZmZlcmVudCBlcnJvcnMgY2FuIGNvbWUgZnJvbSB0aGlzLCBpbmNsdWRpbmcgU3lzdGVtRXJyb3IgYW5kCiMgSW1wb3J0RXJyb3IuCmV4Y2VwdCBFeGNlcHRpb246CiAgICBjb2xvcmFtYSA9IE5vbmUKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKCmRlZiBfc2VsZWN0X3Byb2dyZXNzX2NsYXNzKHByZWZlcnJlZCwgZmFsbGJhY2spOgogICAgZW5jb2RpbmcgPSBnZXRhdHRyKHByZWZlcnJlZC5maWxlLCAiZW5jb2RpbmciLCBOb25lKQoKICAgICMgSWYgd2UgZG9uJ3Qga25vdyB3aGF0IGVuY29kaW5nIHRoaXMgZmlsZSBpcyBpbiwgdGhlbiB3ZSdsbCBqdXN0IGFzc3VtZQogICAgIyB0aGF0IGl0IGRvZXNuJ3Qgc3VwcG9ydCB1bmljb2RlIGFuZCB1c2UgdGhlIEFTQ0lJIGJhci4KICAgIGlmIG5vdCBlbmNvZGluZzoKICAgICAgICByZXR1cm4gZmFsbGJhY2sKCiAgICAjIENvbGxlY3QgYWxsIG9mIHRoZSBwb3NzaWJsZSBjaGFyYWN0ZXJzIHdlIHdhbnQgdG8gdXNlIHdpdGggdGhlIHByZWZlcnJlZAogICAgIyBiYXIuCiAgICBjaGFyYWN0ZXJzID0gWwogICAgICAgIGdldGF0dHIocHJlZmVycmVkLCAiZW1wdHlfZmlsbCIsIHNpeC50ZXh0X3R5cGUoKSksCiAgICAgICAgZ2V0YXR0cihwcmVmZXJyZWQsICJmaWxsIiwgc2l4LnRleHRfdHlwZSgpKSwKICAgIF0KICAgIGNoYXJhY3RlcnMgKz0gbGlzdChnZXRhdHRyKHByZWZlcnJlZCwgInBoYXNlcyIsIFtdKSkKCiAgICAjIFRyeSB0byBkZWNvZGUgdGhlIGNoYXJhY3RlcnMgd2UncmUgdXNpbmcgZm9yIHRoZSBiYXIgdXNpbmcgdGhlIGVuY29kaW5nCiAgICAjIG9mIHRoZSBnaXZlbiBmaWxlLCBpZiB0aGlzIHdvcmtzIHRoZW4gd2UnbGwgYXNzdW1lIHRoYXQgd2UgY2FuIHVzZSB0aGUKICAgICMgZmFuY2llciBiYXIgYW5kIGlmIG5vdCB3ZSdsbCBmYWxsIGJhY2sgdG8gdGhlIHBsYWludGV4dCBiYXIuCiAgICB0cnk6CiAgICAgICAgc2l4LnRleHRfdHlwZSgpLmpvaW4oY2hhcmFjdGVycykuZW5jb2RlKGVuY29kaW5nKQogICAgZXhjZXB0IFVuaWNvZGVFbmNvZGVFcnJvcjoKICAgICAgICByZXR1cm4gZmFsbGJhY2sKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIHByZWZlcnJlZAoKCl9CYXNlQmFyID0gX3NlbGVjdF9wcm9ncmVzc19jbGFzcyhJbmNyZW1lbnRhbEJhciwgQmFyKQoKCmNsYXNzIEludGVycnVwdGlibGVNaXhpbihvYmplY3QpOgogICAgIiIiCiAgICBIZWxwZXIgdG8gZW5zdXJlIHRoYXQgc2VsZi5maW5pc2goKSBnZXRzIGNhbGxlZCBvbiBrZXlib2FyZCBpbnRlcnJ1cHQuCgogICAgVGhpcyBhbGxvd3MgZG93bmxvYWRzIHRvIGJlIGludGVycnVwdGVkIHdpdGhvdXQgbGVhdmluZyB0ZW1wb3Jhcnkgc3RhdGUKICAgIChsaWtlIGhpZGRlbiBjdXJzb3JzKSBiZWhpbmQuCgogICAgVGhpcyBjbGFzcyBpcyBzaW1pbGFyIHRvIHRoZSBwcm9ncmVzcyBsaWJyYXJ5J3MgZXhpc3RpbmcgU2lnSW50TWl4aW4KICAgIGhlbHBlciwgYnV0IGFzIG9mIHZlcnNpb24gMS4yLCB0aGF0IGhlbHBlciBoYXMgdGhlIGZvbGxvd2luZyBwcm9ibGVtczoKCiAgICAxLiBJdCBjYWxscyBzeXMuZXhpdCgpLgogICAgMi4gSXQgZGlzY2FyZHMgdGhlIGV4aXN0aW5nIFNJR0lOVCBoYW5kbGVyIGNvbXBsZXRlbHkuCiAgICAzLiBJdCBsZWF2ZXMgaXRzIG93biBoYW5kbGVyIGluIHBsYWNlIGV2ZW4gYWZ0ZXIgYW4gdW5pbnRlcnJ1cHRlZCBmaW5pc2gsCiAgICAgICB3aGljaCB3aWxsIGhhdmUgdW5leHBlY3RlZCBkZWxheWVkIGVmZmVjdHMgaWYgdGhlIHVzZXIgdHJpZ2dlcnMgYW4KICAgICAgIHVucmVsYXRlZCBrZXlib2FyZCBpbnRlcnJ1cHQgc29tZSB0aW1lIGFmdGVyIGEgcHJvZ3Jlc3MtZGlzcGxheWluZwogICAgICAgZG93bmxvYWQgaGFzIGFscmVhZHkgY29tcGxldGVkLCBmb3IgZXhhbXBsZS4KICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgICIiIgogICAgICAgIFNhdmUgdGhlIG9yaWdpbmFsIFNJR0lOVCBoYW5kbGVyIGZvciBsYXRlci4KICAgICAgICAiIiIKICAgICAgICBzdXBlcihJbnRlcnJ1cHRpYmxlTWl4aW4sIHNlbGYpLl9faW5pdF9fKCphcmdzLCAqKmt3YXJncykKCiAgICAgICAgc2VsZi5vcmlnaW5hbF9oYW5kbGVyID0gc2lnbmFsKFNJR0lOVCwgc2VsZi5oYW5kbGVfc2lnaW50KQoKICAgICAgICAjIElmIHNpZ25hbCgpIHJldHVybnMgTm9uZSwgdGhlIHByZXZpb3VzIGhhbmRsZXIgd2FzIG5vdCBpbnN0YWxsZWQgZnJvbQogICAgICAgICMgUHl0aG9uLCBhbmQgd2UgY2Fubm90IHJlc3RvcmUgaXQuIFRoaXMgcHJvYmFibHkgc2hvdWxkIG5vdCBoYXBwZW4sCiAgICAgICAgIyBidXQgaWYgaXQgZG9lcywgd2UgbXVzdCByZXN0b3JlIHNvbWV0aGluZyBzZW5zaWJsZSBpbnN0ZWFkLCBhdCBsZWFzdC4KICAgICAgICAjIFRoZSBsZWFzdCBiYWQgb3B0aW9uIHNob3VsZCBiZSBQeXRob24ncyBkZWZhdWx0IFNJR0lOVCBoYW5kbGVyLCB3aGljaAogICAgICAgICMganVzdCByYWlzZXMgS2V5Ym9hcmRJbnRlcnJ1cHQuCiAgICAgICAgaWYgc2VsZi5vcmlnaW5hbF9oYW5kbGVyIGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYub3JpZ2luYWxfaGFuZGxlciA9IGRlZmF1bHRfaW50X2hhbmRsZXIKCiAgICBkZWYgZmluaXNoKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJlc3RvcmUgdGhlIG9yaWdpbmFsIFNJR0lOVCBoYW5kbGVyIGFmdGVyIGZpbmlzaGluZy4KCiAgICAgICAgVGhpcyBzaG91bGQgaGFwcGVuIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgcHJvZ3Jlc3MgZGlzcGxheSBmaW5pc2hlcwogICAgICAgIG5vcm1hbGx5LCBvciBnZXRzIGludGVycnVwdGVkLgogICAgICAgICIiIgogICAgICAgIHN1cGVyKEludGVycnVwdGlibGVNaXhpbiwgc2VsZikuZmluaXNoKCkKICAgICAgICBzaWduYWwoU0lHSU5ULCBzZWxmLm9yaWdpbmFsX2hhbmRsZXIpCgogICAgZGVmIGhhbmRsZV9zaWdpbnQoc2VsZiwgc2lnbnVtLCBmcmFtZSk6CiAgICAgICAgIiIiCiAgICAgICAgQ2FsbCBzZWxmLmZpbmlzaCgpIGJlZm9yZSBkZWxlZ2F0aW5nIHRvIHRoZSBvcmlnaW5hbCBTSUdJTlQgaGFuZGxlci4KCiAgICAgICAgVGhpcyBoYW5kbGVyIHNob3VsZCBvbmx5IGJlIGluIHBsYWNlIHdoaWxlIHRoZSBwcm9ncmVzcyBkaXNwbGF5IGlzCiAgICAgICAgYWN0aXZlLgogICAgICAgICIiIgogICAgICAgIHNlbGYuZmluaXNoKCkKICAgICAgICBzZWxmLm9yaWdpbmFsX2hhbmRsZXIoc2lnbnVtLCBmcmFtZSkKCgpjbGFzcyBEb3dubG9hZFByb2dyZXNzTWl4aW4ob2JqZWN0KToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICBzdXBlcihEb3dubG9hZFByb2dyZXNzTWl4aW4sIHNlbGYpLl9faW5pdF9fKCphcmdzLCAqKmt3YXJncykKICAgICAgICBzZWxmLm1lc3NhZ2UgPSAoIiAiICogKGdldF9pbmRlbnRhdGlvbigpICsgMikpICsgc2VsZi5tZXNzYWdlCgogICAgQHByb3BlcnR5CiAgICBkZWYgZG93bmxvYWRlZChzZWxmKToKICAgICAgICByZXR1cm4gZm9ybWF0X3NpemUoc2VsZi5pbmRleCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBkb3dubG9hZF9zcGVlZChzZWxmKToKICAgICAgICAjIEF2b2lkIHplcm8gZGl2aXNpb24gZXJyb3JzLi4uCiAgICAgICAgaWYgc2VsZi5hdmcgPT0gMC4wOgogICAgICAgICAgICByZXR1cm4gIi4uLiIKICAgICAgICByZXR1cm4gZm9ybWF0X3NpemUoMSAvIHNlbGYuYXZnKSArICIvcyIKCiAgICBAcHJvcGVydHkKICAgIGRlZiBwcmV0dHlfZXRhKHNlbGYpOgogICAgICAgIGlmIHNlbGYuZXRhOgogICAgICAgICAgICByZXR1cm4gImV0YSAlcyIgJSBzZWxmLmV0YV90ZAogICAgICAgIHJldHVybiAiIgoKICAgIGRlZiBpdGVyKHNlbGYsIGl0LCBuPTEpOgogICAgICAgIGZvciB4IGluIGl0OgogICAgICAgICAgICB5aWVsZCB4CiAgICAgICAgICAgIHNlbGYubmV4dChuKQogICAgICAgIHNlbGYuZmluaXNoKCkKCgpjbGFzcyBXaW5kb3dzTWl4aW4ob2JqZWN0KToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAjIFRoZSBXaW5kb3dzIHRlcm1pbmFsIGRvZXMgbm90IHN1cHBvcnQgdGhlIGhpZGUvc2hvdyBjdXJzb3IgQU5TSSBjb2RlcwogICAgICAgICMgZXZlbiB3aXRoIGNvbG9yYW1hLiBTbyB3ZSdsbCBlbnN1cmUgdGhhdCBoaWRlX2N1cnNvciBpcyBGYWxzZSBvbgogICAgICAgICMgV2luZG93cy4KICAgICAgICAjIFRoaXMgY2FsbCBuZWRzIHRvIGdvIGJlZm9yZSB0aGUgc3VwZXIoKSBjYWxsLCBzbyB0aGF0IGhpZGVfY3Vyc29yCiAgICAgICAgIyBpcyBzZXQgaW4gdGltZS4gVGhlIGJhc2UgcHJvZ3Jlc3MgYmFyIGNsYXNzIHdyaXRlcyB0aGUgImhpZGUgY3Vyc29yIgogICAgICAgICMgY29kZSB0byB0aGUgdGVybWluYWwgaW4gaXRzIGluaXQsIHNvIGlmIHdlIGRvbid0IHNldCB0aGlzIHNvb24KICAgICAgICAjIGVub3VnaCwgd2UgZ2V0IGEgImhpZGUiIHdpdGggbm8gY29ycmVzcG9uZGluZyAic2hvdyIuLi4KICAgICAgICBpZiBXSU5ET1dTIGFuZCBzZWxmLmhpZGVfY3Vyc29yOgogICAgICAgICAgICBzZWxmLmhpZGVfY3Vyc29yID0gRmFsc2UKCiAgICAgICAgc3VwZXIoV2luZG93c01peGluLCBzZWxmKS5fX2luaXRfXygqYXJncywgKiprd2FyZ3MpCgogICAgICAgICMgQ2hlY2sgaWYgd2UgYXJlIHJ1bm5pbmcgb24gV2luZG93cyBhbmQgd2UgaGF2ZSB0aGUgY29sb3JhbWEgbW9kdWxlLAogICAgICAgICMgaWYgd2UgZG8gdGhlbiB3cmFwIG91ciBmaWxlIHdpdGggaXQuCiAgICAgICAgaWYgV0lORE9XUyBhbmQgY29sb3JhbWE6CiAgICAgICAgICAgIHNlbGYuZmlsZSA9IGNvbG9yYW1hLkFuc2lUb1dpbjMyKHNlbGYuZmlsZSkKICAgICAgICAgICAgIyBUaGUgcHJvZ3Jlc3MgY29kZSBleHBlY3RzIHRvIGJlIGFibGUgdG8gY2FsbCBzZWxmLmZpbGUuaXNhdHR5KCkKICAgICAgICAgICAgIyBidXQgdGhlIGNvbG9yYW1hLkFuc2lUb1dpbjMyKCkgb2JqZWN0IGRvZXNuJ3QgaGF2ZSB0aGF0LCBzbyB3ZSdsbAogICAgICAgICAgICAjIGFkZCBpdC4KICAgICAgICAgICAgc2VsZi5maWxlLmlzYXR0eSA9IGxhbWJkYTogc2VsZi5maWxlLndyYXBwZWQuaXNhdHR5KCkKICAgICAgICAgICAgIyBUaGUgcHJvZ3Jlc3MgY29kZSBleHBlY3RzIHRvIGJlIGFibGUgdG8gY2FsbCBzZWxmLmZpbGUuZmx1c2goKQogICAgICAgICAgICAjIGJ1dCB0aGUgY29sb3JhbWEuQW5zaVRvV2luMzIoKSBvYmplY3QgZG9lc24ndCBoYXZlIHRoYXQsIHNvIHdlJ2xsCiAgICAgICAgICAgICMgYWRkIGl0LgogICAgICAgICAgICBzZWxmLmZpbGUuZmx1c2ggPSBsYW1iZGE6IHNlbGYuZmlsZS53cmFwcGVkLmZsdXNoKCkKCgpjbGFzcyBEb3dubG9hZFByb2dyZXNzQmFyKFdpbmRvd3NNaXhpbiwgSW50ZXJydXB0aWJsZU1peGluLAogICAgICAgICAgICAgICAgICAgICAgICAgIERvd25sb2FkUHJvZ3Jlc3NNaXhpbiwgX0Jhc2VCYXIpOgoKICAgIGZpbGUgPSBzeXMuc3Rkb3V0CiAgICBtZXNzYWdlID0gIiUocGVyY2VudClkJSUiCiAgICBzdWZmaXggPSAiJShkb3dubG9hZGVkKXMgJShkb3dubG9hZF9zcGVlZClzICUocHJldHR5X2V0YSlzIgoKCmNsYXNzIERvd25sb2FkUHJvZ3Jlc3NTcGlubmVyKFdpbmRvd3NNaXhpbiwgSW50ZXJydXB0aWJsZU1peGluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb3dubG9hZFByb2dyZXNzTWl4aW4sIFdyaXRlbG5NaXhpbiwgU3Bpbm5lcik6CgogICAgZmlsZSA9IHN5cy5zdGRvdXQKICAgIHN1ZmZpeCA9ICIlKGRvd25sb2FkZWQpcyAlKGRvd25sb2FkX3NwZWVkKXMiCgogICAgZGVmIG5leHRfcGhhc2Uoc2VsZik6CiAgICAgICAgaWYgbm90IGhhc2F0dHIoc2VsZiwgIl9waGFzZXIiKToKICAgICAgICAgICAgc2VsZi5fcGhhc2VyID0gaXRlcnRvb2xzLmN5Y2xlKHNlbGYucGhhc2VzKQogICAgICAgIHJldHVybiBuZXh0KHNlbGYuX3BoYXNlcikKCiAgICBkZWYgdXBkYXRlKHNlbGYpOgogICAgICAgIG1lc3NhZ2UgPSBzZWxmLm1lc3NhZ2UgJSBzZWxmCiAgICAgICAgcGhhc2UgPSBzZWxmLm5leHRfcGhhc2UoKQogICAgICAgIHN1ZmZpeCA9IHNlbGYuc3VmZml4ICUgc2VsZgogICAgICAgIGxpbmUgPSAnJy5qb2luKFsKICAgICAgICAgICAgbWVzc2FnZSwKICAgICAgICAgICAgIiAiIGlmIG1lc3NhZ2UgZWxzZSAiIiwKICAgICAgICAgICAgcGhhc2UsCiAgICAgICAgICAgICIgIiBpZiBzdWZmaXggZWxzZSAiIiwKICAgICAgICAgICAgc3VmZml4LAogICAgICAgIF0pCgogICAgICAgIHNlbGYud3JpdGVsbihsaW5lKQoKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBHZW5lcmljICJzb21ldGhpbmcgaXMgaGFwcGVuaW5nIiBzcGlubmVycwojCiMgV2UgZG9uJ3QgZXZlbiB0cnkgdXNpbmcgcHJvZ3Jlc3Muc3Bpbm5lci5TcGlubmVyIGhlcmUgYmVjYXVzZSBpdCdzIGFjdHVhbGx5CiMgc2ltcGxlciB0byByZWltcGxlbWVudCBmcm9tIHNjcmF0Y2ggdGhhbiB0byBjb2VyY2UgdGhlaXIgY29kZSBpbnRvIGRvaW5nCiMgd2hhdCB3ZSBuZWVkLgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgpkZWYgaGlkZGVuX2N1cnNvcihmaWxlKToKICAgICMgVGhlIFdpbmRvd3MgdGVybWluYWwgZG9lcyBub3Qgc3VwcG9ydCB0aGUgaGlkZS9zaG93IGN1cnNvciBBTlNJIGNvZGVzLAogICAgIyBldmVuIHZpYSBjb2xvcmFtYS4gU28gZG9uJ3QgZXZlbiB0cnkuCiAgICBpZiBXSU5ET1dTOgogICAgICAgIHlpZWxkCiAgICAjIFdlIGRvbid0IHdhbnQgdG8gY2x1dHRlciB0aGUgb3V0cHV0IHdpdGggY29udHJvbCBjaGFyYWN0ZXJzIGlmIHdlJ3JlCiAgICAjIHdyaXRpbmcgdG8gYSBmaWxlLCBvciBpZiB0aGUgdXNlciBpcyBydW5uaW5nIHdpdGggLS1xdWlldC4KICAgICMgU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3BpcC9pc3N1ZXMvMzQxOAogICAgZWxpZiBub3QgZmlsZS5pc2F0dHkoKSBvciBsb2dnZXIuZ2V0RWZmZWN0aXZlTGV2ZWwoKSA+IGxvZ2dpbmcuSU5GTzoKICAgICAgICB5aWVsZAogICAgZWxzZToKICAgICAgICBmaWxlLndyaXRlKEhJREVfQ1VSU09SKQogICAgICAgIHRyeToKICAgICAgICAgICAgeWllbGQKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBmaWxlLndyaXRlKFNIT1dfQ1VSU09SKQoKCmNsYXNzIFJhdGVMaW1pdGVyKG9iamVjdCk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgbWluX3VwZGF0ZV9pbnRlcnZhbF9zZWNvbmRzKToKICAgICAgICBzZWxmLl9taW5fdXBkYXRlX2ludGVydmFsX3NlY29uZHMgPSBtaW5fdXBkYXRlX2ludGVydmFsX3NlY29uZHMKICAgICAgICBzZWxmLl9sYXN0X3VwZGF0ZSA9IDAKCiAgICBkZWYgcmVhZHkoc2VsZik6CiAgICAgICAgbm93ID0gdGltZS50aW1lKCkKICAgICAgICBkZWx0YSA9IG5vdyAtIHNlbGYuX2xhc3RfdXBkYXRlCiAgICAgICAgcmV0dXJuIGRlbHRhID49IHNlbGYuX21pbl91cGRhdGVfaW50ZXJ2YWxfc2Vjb25kcwoKICAgIGRlZiByZXNldChzZWxmKToKICAgICAgICBzZWxmLl9sYXN0X3VwZGF0ZSA9IHRpbWUudGltZSgpCgoKY2xhc3MgSW50ZXJhY3RpdmVTcGlubmVyKG9iamVjdCk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgbWVzc2FnZSwgZmlsZT1Ob25lLCBzcGluX2NoYXJzPSItXFx8LyIsCiAgICAgICAgICAgICAgICAgIyBFbXBpcmljYWxseSwgOCB1cGRhdGVzL3NlY29uZCBsb29rcyBuaWNlCiAgICAgICAgICAgICAgICAgbWluX3VwZGF0ZV9pbnRlcnZhbF9zZWNvbmRzPTAuMTI1KToKICAgICAgICBzZWxmLl9tZXNzYWdlID0gbWVzc2FnZQogICAgICAgIGlmIGZpbGUgaXMgTm9uZToKICAgICAgICAgICAgZmlsZSA9IHN5cy5zdGRvdXQKICAgICAgICBzZWxmLl9maWxlID0gZmlsZQogICAgICAgIHNlbGYuX3JhdGVfbGltaXRlciA9IFJhdGVMaW1pdGVyKG1pbl91cGRhdGVfaW50ZXJ2YWxfc2Vjb25kcykKICAgICAgICBzZWxmLl9maW5pc2hlZCA9IEZhbHNlCgogICAgICAgIHNlbGYuX3NwaW5fY3ljbGUgPSBpdGVydG9vbHMuY3ljbGUoc3Bpbl9jaGFycykKCiAgICAgICAgc2VsZi5fZmlsZS53cml0ZSgiICIgKiBnZXRfaW5kZW50YXRpb24oKSArIHNlbGYuX21lc3NhZ2UgKyAiIC4uLiAiKQogICAgICAgIHNlbGYuX3dpZHRoID0gMAoKICAgIGRlZiBfd3JpdGUoc2VsZiwgc3RhdHVzKToKICAgICAgICBhc3NlcnQgbm90IHNlbGYuX2ZpbmlzaGVkCiAgICAgICAgIyBFcmFzZSB3aGF0IHdlIHdyb3RlIGJlZm9yZSBieSBiYWNrc3BhY2luZyB0byB0aGUgYmVnaW5uaW5nLCB3cml0aW5nCiAgICAgICAgIyBzcGFjZXMgdG8gb3ZlcndyaXRlIHRoZSBvbGQgdGV4dCwgYW5kIHRoZW4gYmFja3NwYWNpbmcgYWdhaW4KICAgICAgICBiYWNrdXAgPSAiXGIiICogc2VsZi5fd2lkdGgKICAgICAgICBzZWxmLl9maWxlLndyaXRlKGJhY2t1cCArICIgIiAqIHNlbGYuX3dpZHRoICsgYmFja3VwKQogICAgICAgICMgTm93IHdlIGhhdmUgYSBibGFuayBzbGF0ZSB0byBhZGQgb3VyIHN0YXR1cwogICAgICAgIHNlbGYuX2ZpbGUud3JpdGUoc3RhdHVzKQogICAgICAgIHNlbGYuX3dpZHRoID0gbGVuKHN0YXR1cykKICAgICAgICBzZWxmLl9maWxlLmZsdXNoKCkKICAgICAgICBzZWxmLl9yYXRlX2xpbWl0ZXIucmVzZXQoKQoKICAgIGRlZiBzcGluKHNlbGYpOgogICAgICAgIGlmIHNlbGYuX2ZpbmlzaGVkOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBpZiBub3Qgc2VsZi5fcmF0ZV9saW1pdGVyLnJlYWR5KCk6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIHNlbGYuX3dyaXRlKG5leHQoc2VsZi5fc3Bpbl9jeWNsZSkpCgogICAgZGVmIGZpbmlzaChzZWxmLCBmaW5hbF9zdGF0dXMpOgogICAgICAgIGlmIHNlbGYuX2ZpbmlzaGVkOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBzZWxmLl93cml0ZShmaW5hbF9zdGF0dXMpCiAgICAgICAgc2VsZi5fZmlsZS53cml0ZSgiXG4iKQogICAgICAgIHNlbGYuX2ZpbGUuZmx1c2goKQogICAgICAgIHNlbGYuX2ZpbmlzaGVkID0gVHJ1ZQoKCiMgVXNlZCBmb3IgZHVtYiB0ZXJtaW5hbHMsIG5vbi1pbnRlcmFjdGl2ZSBpbnN0YWxscyAobm8gdHR5KSwgZXRjLgojIFdlIHN0aWxsIHByaW50IHVwZGF0ZXMgb2NjYXNpb25hbGx5IChvbmNlIGV2ZXJ5IDYwIHNlY29uZHMgYnkgZGVmYXVsdCkgdG8KIyBhY3QgYXMgYSBrZWVwLWFsaXZlIGZvciBzeXN0ZW1zIGxpa2UgVHJhdmlzLUNJIHRoYXQgdGFrZSBsYWNrLW9mLW91dHB1dCBhcwojIGFuIGluZGljYXRpb24gdGhhdCBhIHRhc2sgaGFzIGZyb3plbi4KY2xhc3MgTm9uSW50ZXJhY3RpdmVTcGlubmVyKG9iamVjdCk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgbWVzc2FnZSwgbWluX3VwZGF0ZV9pbnRlcnZhbF9zZWNvbmRzPTYwKToKICAgICAgICBzZWxmLl9tZXNzYWdlID0gbWVzc2FnZQogICAgICAgIHNlbGYuX2ZpbmlzaGVkID0gRmFsc2UKICAgICAgICBzZWxmLl9yYXRlX2xpbWl0ZXIgPSBSYXRlTGltaXRlcihtaW5fdXBkYXRlX2ludGVydmFsX3NlY29uZHMpCiAgICAgICAgc2VsZi5fdXBkYXRlKCJzdGFydGVkIikKCiAgICBkZWYgX3VwZGF0ZShzZWxmLCBzdGF0dXMpOgogICAgICAgIGFzc2VydCBub3Qgc2VsZi5fZmluaXNoZWQKICAgICAgICBzZWxmLl9yYXRlX2xpbWl0ZXIucmVzZXQoKQogICAgICAgIGxvZ2dlci5pbmZvKCIlczogJXMiLCBzZWxmLl9tZXNzYWdlLCBzdGF0dXMpCgogICAgZGVmIHNwaW4oc2VsZik6CiAgICAgICAgaWYgc2VsZi5fZmluaXNoZWQ6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIGlmIG5vdCBzZWxmLl9yYXRlX2xpbWl0ZXIucmVhZHkoKToKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgc2VsZi5fdXBkYXRlKCJzdGlsbCBydW5uaW5nLi4uIikKCiAgICBkZWYgZmluaXNoKHNlbGYsIGZpbmFsX3N0YXR1cyk6CiAgICAgICAgaWYgc2VsZi5fZmluaXNoZWQ6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIHNlbGYuX3VwZGF0ZSgiZmluaXNoZWQgd2l0aCBzdGF0dXMgJyVzJyIgJSAoZmluYWxfc3RhdHVzLCkpCiAgICAgICAgc2VsZi5fZmluaXNoZWQgPSBUcnVlCgoKQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKZGVmIG9wZW5fc3Bpbm5lcihtZXNzYWdlKToKICAgICMgSW50ZXJhY3RpdmUgc3Bpbm5lciBnb2VzIGRpcmVjdGx5IHRvIHN5cy5zdGRvdXQgcmF0aGVyIHRoYW4gYmVpbmcgcm91dGVkCiAgICAjIHRocm91Z2ggdGhlIGxvZ2dpbmcgc3lzdGVtLCBidXQgaXQgYWN0cyBsaWtlIGl0IGhhcyBsZXZlbCBJTkZPLAogICAgIyBpLmUuIGl0J3Mgb25seSBkaXNwbGF5ZWQgaWYgd2UncmUgYXQgbGV2ZWwgSU5GTyBvciBiZXR0ZXIuCiAgICAjIE5vbi1pbnRlcmFjdGl2ZSBzcGlubmVyIGdvZXMgdGhyb3VnaCB0aGUgbG9nZ2luZyBzeXN0ZW0sIHNvIGl0IGlzIGFsd2F5cwogICAgIyBpbiBzeW5jIHdpdGggbG9nZ2luZyBjb25maWd1cmF0aW9uLgogICAgaWYgc3lzLnN0ZG91dC5pc2F0dHkoKSBhbmQgbG9nZ2VyLmdldEVmZmVjdGl2ZUxldmVsKCkgPD0gbG9nZ2luZy5JTkZPOgogICAgICAgIHNwaW5uZXIgPSBJbnRlcmFjdGl2ZVNwaW5uZXIobWVzc2FnZSkKICAgIGVsc2U6CiAgICAgICAgc3Bpbm5lciA9IE5vbkludGVyYWN0aXZlU3Bpbm5lcihtZXNzYWdlKQogICAgdHJ5OgogICAgICAgIHdpdGggaGlkZGVuX2N1cnNvcihzeXMuc3Rkb3V0KToKICAgICAgICAgICAgeWllbGQgc3Bpbm5lcgogICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgogICAgICAgIHNwaW5uZXIuZmluaXNoKCJjYW5jZWxlZCIpCiAgICAgICAgcmFpc2UKICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgc3Bpbm5lci5maW5pc2goImVycm9yIikKICAgICAgICByYWlzZQogICAgZWxzZToKICAgICAgICBzcGlubmVyLmZpbmlzaCgiZG9uZSIpClBLAwQUAAAAAAAAACEAyFbFS1YwAABWMAAAMAAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL3Zjcy9fX2luaXRfXy5weSIiIkhhbmRsZXMgYWxsIFZDUyAodmVyc2lvbiBjb250cm9sKSBzdXBwb3J0IiIiCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgZXJybm8KaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IG9zCmltcG9ydCBzaHV0aWwKaW1wb3J0IHN5cwoKZnJvbSBwaXAuX3ZlbmRvci5zaXgubW92ZXMudXJsbGliIGltcG9ydCBwYXJzZSBhcyB1cmxsaWJfcGFyc2UKCmZyb20gcGlwLmV4Y2VwdGlvbnMgaW1wb3J0IEJhZENvbW1hbmQKZnJvbSBwaXAudXRpbHMgaW1wb3J0IChkaXNwbGF5X3BhdGgsIGJhY2t1cF9kaXIsIGNhbGxfc3VicHJvY2VzcywKICAgICAgICAgICAgICAgICAgICAgICBybXRyZWUsIGFza19wYXRoX2V4aXN0cykKCgpfX2FsbF9fID0gWyd2Y3MnLCAnZ2V0X3NyY19yZXF1aXJlbWVudCddCgoKbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgoKY2xhc3MgVmNzU3VwcG9ydChvYmplY3QpOgogICAgX3JlZ2lzdHJ5ID0ge30KICAgIHNjaGVtZXMgPSBbJ3NzaCcsICdnaXQnLCAnaGcnLCAnYnpyJywgJ3NmdHAnLCAnc3ZuJ10KCiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgIyBSZWdpc3RlciBtb3JlIHNjaGVtZXMgd2l0aCB1cmxwYXJzZSBmb3IgdmFyaW91cyB2ZXJzaW9uIGNvbnRyb2wKICAgICAgICAjIHN5c3RlbXMKICAgICAgICB1cmxsaWJfcGFyc2UudXNlc19uZXRsb2MuZXh0ZW5kKHNlbGYuc2NoZW1lcykKICAgICAgICAjIFB5dGhvbiA+PSAyLjcuNCwgMy4zIGRvZXNuJ3QgaGF2ZSB1c2VzX2ZyYWdtZW50CiAgICAgICAgaWYgZ2V0YXR0cih1cmxsaWJfcGFyc2UsICd1c2VzX2ZyYWdtZW50JywgTm9uZSk6CiAgICAgICAgICAgIHVybGxpYl9wYXJzZS51c2VzX2ZyYWdtZW50LmV4dGVuZChzZWxmLnNjaGVtZXMpCiAgICAgICAgc3VwZXIoVmNzU3VwcG9ydCwgc2VsZikuX19pbml0X18oKQoKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fcmVnaXN0cnkuX19pdGVyX18oKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGJhY2tlbmRzKHNlbGYpOgogICAgICAgIHJldHVybiBsaXN0KHNlbGYuX3JlZ2lzdHJ5LnZhbHVlcygpKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGRpcm5hbWVzKHNlbGYpOgogICAgICAgIHJldHVybiBbYmFja2VuZC5kaXJuYW1lIGZvciBiYWNrZW5kIGluIHNlbGYuYmFja2VuZHNdCgogICAgQHByb3BlcnR5CiAgICBkZWYgYWxsX3NjaGVtZXMoc2VsZik6CiAgICAgICAgc2NoZW1lcyA9IFtdCiAgICAgICAgZm9yIGJhY2tlbmQgaW4gc2VsZi5iYWNrZW5kczoKICAgICAgICAgICAgc2NoZW1lcy5leHRlbmQoYmFja2VuZC5zY2hlbWVzKQogICAgICAgIHJldHVybiBzY2hlbWVzCgogICAgZGVmIHJlZ2lzdGVyKHNlbGYsIGNscyk6CiAgICAgICAgaWYgbm90IGhhc2F0dHIoY2xzLCAnbmFtZScpOgogICAgICAgICAgICBsb2dnZXIud2FybmluZygnQ2Fubm90IHJlZ2lzdGVyIFZDUyAlcycsIGNscy5fX25hbWVfXykKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgaWYgY2xzLm5hbWUgbm90IGluIHNlbGYuX3JlZ2lzdHJ5OgogICAgICAgICAgICBzZWxmLl9yZWdpc3RyeVtjbHMubmFtZV0gPSBjbHMKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdSZWdpc3RlcmVkIFZDUyBiYWNrZW5kOiAlcycsIGNscy5uYW1lKQoKICAgIGRlZiB1bnJlZ2lzdGVyKHNlbGYsIGNscz1Ob25lLCBuYW1lPU5vbmUpOgogICAgICAgIGlmIG5hbWUgaW4gc2VsZi5fcmVnaXN0cnk6CiAgICAgICAgICAgIGRlbCBzZWxmLl9yZWdpc3RyeVtuYW1lXQogICAgICAgIGVsaWYgY2xzIGluIHNlbGYuX3JlZ2lzdHJ5LnZhbHVlcygpOgogICAgICAgICAgICBkZWwgc2VsZi5fcmVnaXN0cnlbY2xzLm5hbWVdCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ0Nhbm5vdCB1bnJlZ2lzdGVyIGJlY2F1c2Ugbm8gY2xhc3Mgb3IgbmFtZSBnaXZlbicpCgogICAgZGVmIGdldF9iYWNrZW5kX25hbWUoc2VsZiwgbG9jYXRpb24pOgogICAgICAgICIiIgogICAgICAgIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgdmVyc2lvbiBjb250cm9sIGJhY2tlbmQgaWYgZm91bmQgYXQgZ2l2ZW4KICAgICAgICBsb2NhdGlvbiwgZS5nLiB2Y3MuZ2V0X2JhY2tlbmRfbmFtZSgnL3BhdGgvdG8vdmNzL2NoZWNrb3V0JykKICAgICAgICAiIiIKICAgICAgICBmb3IgdmNfdHlwZSBpbiBzZWxmLl9yZWdpc3RyeS52YWx1ZXMoKToKICAgICAgICAgICAgaWYgdmNfdHlwZS5jb250cm9sc19sb2NhdGlvbihsb2NhdGlvbik6CiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0RldGVybWluZSB0aGF0ICVzIHVzZXMgVkNTOiAlcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24sIHZjX3R5cGUubmFtZSkKICAgICAgICAgICAgICAgIHJldHVybiB2Y190eXBlLm5hbWUKICAgICAgICByZXR1cm4gTm9uZQoKICAgIGRlZiBnZXRfYmFja2VuZChzZWxmLCBuYW1lKToKICAgICAgICBuYW1lID0gbmFtZS5sb3dlcigpCiAgICAgICAgaWYgbmFtZSBpbiBzZWxmLl9yZWdpc3RyeToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3JlZ2lzdHJ5W25hbWVdCgogICAgZGVmIGdldF9iYWNrZW5kX2Zyb21fbG9jYXRpb24oc2VsZiwgbG9jYXRpb24pOgogICAgICAgIHZjX3R5cGUgPSBzZWxmLmdldF9iYWNrZW5kX25hbWUobG9jYXRpb24pCiAgICAgICAgaWYgdmNfdHlwZToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuZ2V0X2JhY2tlbmQodmNfdHlwZSkKICAgICAgICByZXR1cm4gTm9uZQoKCnZjcyA9IFZjc1N1cHBvcnQoKQoKCmNsYXNzIFZlcnNpb25Db250cm9sKG9iamVjdCk6CiAgICBuYW1lID0gJycKICAgIGRpcm5hbWUgPSAnJwogICAgIyBMaXN0IG9mIHN1cHBvcnRlZCBzY2hlbWVzIGZvciB0aGlzIFZlcnNpb24gQ29udHJvbAogICAgc2NoZW1lcyA9ICgpCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHVybD1Ob25lLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgIHNlbGYudXJsID0gdXJsCiAgICAgICAgc3VwZXIoVmVyc2lvbkNvbnRyb2wsIHNlbGYpLl9faW5pdF9fKCphcmdzLCAqKmt3YXJncykKCiAgICBkZWYgX2lzX2xvY2FsX3JlcG9zaXRvcnkoc2VsZiwgcmVwbyk6CiAgICAgICAgIiIiCiAgICAgICAgICAgcG9zaXggYWJzb2x1dGUgcGF0aHMgc3RhcnQgd2l0aCBvcy5wYXRoLnNlcCwKICAgICAgICAgICB3aW4zMiBvbmVzIHN0YXJ0IHdpdGggZHJpdmUgKGxpa2UgYzpcXGZvbGRlcikKICAgICAgICAiIiIKICAgICAgICBkcml2ZSwgdGFpbCA9IG9zLnBhdGguc3BsaXRkcml2ZShyZXBvKQogICAgICAgIHJldHVybiByZXBvLnN0YXJ0c3dpdGgob3MucGF0aC5zZXApIG9yIGRyaXZlCgogICAgIyBTZWUgaXNzdWUgIzEwODMgZm9yIHdoeSB0aGlzIG1ldGhvZCB3YXMgaW50cm9kdWNlZDoKICAgICMgaHR0cHM6Ly9naXRodWIuY29tL3B5cGEvcGlwL2lzc3Vlcy8xMDgzCiAgICBkZWYgdHJhbnNsYXRlX2VnZ19zdXJuYW1lKHNlbGYsIHN1cm5hbWUpOgogICAgICAgICMgRm9yIGV4YW1wbGUsIERqYW5nbyBoYXMgYnJhbmNoZXMgb2YgdGhlIGZvcm0gInN0YWJsZS8xLjcueCIuCiAgICAgICAgcmV0dXJuIHN1cm5hbWUucmVwbGFjZSgnLycsICdfJykKCiAgICBkZWYgZXhwb3J0KHNlbGYsIGxvY2F0aW9uKToKICAgICAgICAiIiIKICAgICAgICBFeHBvcnQgdGhlIHJlcG9zaXRvcnkgYXQgdGhlIHVybCB0byB0aGUgZGVzdGluYXRpb24gbG9jYXRpb24KICAgICAgICBpLmUuIG9ubHkgZG93bmxvYWQgdGhlIGZpbGVzLCB3aXRob3V0IHZjcyBpbmZvcm1hdGlvbnMKICAgICAgICAiIiIKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCgogICAgZGVmIGdldF91cmxfcmV2KHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJldHVybnMgdGhlIGNvcnJlY3QgcmVwb3NpdG9yeSBVUkwgYW5kIHJldmlzaW9uIGJ5IHBhcnNpbmcgdGhlIGdpdmVuCiAgICAgICAgcmVwb3NpdG9yeSBVUkwKICAgICAgICAiIiIKICAgICAgICBlcnJvcl9tZXNzYWdlID0gKAogICAgICAgICAgICAiU29ycnksICclcycgaXMgYSBtYWxmb3JtZWQgVkNTIHVybC4gIgogICAgICAgICAgICAiVGhlIGZvcm1hdCBpcyA8dmNzPis8cHJvdG9jb2w+Oi8vPHVybD4sICIKICAgICAgICAgICAgImUuZy4gc3ZuK2h0dHA6Ly9teXJlcG8vc3ZuL015QXBwI2VnZz1NeUFwcCIKICAgICAgICApCiAgICAgICAgYXNzZXJ0ICcrJyBpbiBzZWxmLnVybCwgZXJyb3JfbWVzc2FnZSAlIHNlbGYudXJsCiAgICAgICAgdXJsID0gc2VsZi51cmwuc3BsaXQoJysnLCAxKVsxXQogICAgICAgIHNjaGVtZSwgbmV0bG9jLCBwYXRoLCBxdWVyeSwgZnJhZyA9IHVybGxpYl9wYXJzZS51cmxzcGxpdCh1cmwpCiAgICAgICAgcmV2ID0gTm9uZQogICAgICAgIGlmICdAJyBpbiBwYXRoOgogICAgICAgICAgICBwYXRoLCByZXYgPSBwYXRoLnJzcGxpdCgnQCcsIDEpCiAgICAgICAgdXJsID0gdXJsbGliX3BhcnNlLnVybHVuc3BsaXQoKHNjaGVtZSwgbmV0bG9jLCBwYXRoLCBxdWVyeSwgJycpKQogICAgICAgIHJldHVybiB1cmwsIHJldgoKICAgIGRlZiBnZXRfaW5mbyhzZWxmLCBsb2NhdGlvbik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJucyAodXJsLCByZXZpc2lvbiksIHdoZXJlIGJvdGggYXJlIHN0cmluZ3MKICAgICAgICAiIiIKICAgICAgICBhc3NlcnQgbm90IGxvY2F0aW9uLnJzdHJpcCgnLycpLmVuZHN3aXRoKHNlbGYuZGlybmFtZSksIFwKICAgICAgICAgICAgJ0JhZCBkaXJlY3Rvcnk6ICVzJyAlIGxvY2F0aW9uCiAgICAgICAgcmV0dXJuIHNlbGYuZ2V0X3VybChsb2NhdGlvbiksIHNlbGYuZ2V0X3JldmlzaW9uKGxvY2F0aW9uKQoKICAgIGRlZiBub3JtYWxpemVfdXJsKHNlbGYsIHVybCk6CiAgICAgICAgIiIiCiAgICAgICAgTm9ybWFsaXplIGEgVVJMIGZvciBjb21wYXJpc29uIGJ5IHVucXVvdGluZyBpdCBhbmQgcmVtb3ZpbmcgYW55CiAgICAgICAgdHJhaWxpbmcgc2xhc2guCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHVybGxpYl9wYXJzZS51bnF1b3RlKHVybCkucnN0cmlwKCcvJykKCiAgICBkZWYgY29tcGFyZV91cmxzKHNlbGYsIHVybDEsIHVybDIpOgogICAgICAgICIiIgogICAgICAgIENvbXBhcmUgdHdvIHJlcG8gVVJMcyBmb3IgaWRlbnRpdHksIGlnbm9yaW5nIGluY2lkZW50YWwgZGlmZmVyZW5jZXMuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIChzZWxmLm5vcm1hbGl6ZV91cmwodXJsMSkgPT0gc2VsZi5ub3JtYWxpemVfdXJsKHVybDIpKQoKICAgIGRlZiBvYnRhaW4oc2VsZiwgZGVzdCk6CiAgICAgICAgIiIiCiAgICAgICAgQ2FsbGVkIHdoZW4gaW5zdGFsbGluZyBvciB1cGRhdGluZyBhbiBlZGl0YWJsZSBwYWNrYWdlLCB0YWtlcyB0aGUKICAgICAgICBzb3VyY2UgcGF0aCBvZiB0aGUgY2hlY2tvdXQuCiAgICAgICAgIiIiCiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgoKICAgIGRlZiBzd2l0Y2goc2VsZiwgZGVzdCwgdXJsLCByZXZfb3B0aW9ucyk6CiAgICAgICAgIiIiCiAgICAgICAgU3dpdGNoIHRoZSByZXBvIGF0IGBgZGVzdGBgIHRvIHBvaW50IHRvIGBgVVJMYGAuCiAgICAgICAgIiIiCiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgoKICAgIGRlZiB1cGRhdGUoc2VsZiwgZGVzdCwgcmV2X29wdGlvbnMpOgogICAgICAgICIiIgogICAgICAgIFVwZGF0ZSBhbiBhbHJlYWR5LWV4aXN0aW5nIHJlcG8gdG8gdGhlIGdpdmVuIGBgcmV2X29wdGlvbnNgYC4KICAgICAgICAiIiIKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCgogICAgZGVmIGNoZWNrX3ZlcnNpb24oc2VsZiwgZGVzdCwgcmV2X29wdGlvbnMpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBUcnVlIGlmIHRoZSB2ZXJzaW9uIGlzIGlkZW50aWNhbCB0byB3aGF0IGV4aXN0cyBhbmQKICAgICAgICBkb2Vzbid0IG5lZWQgdG8gYmUgdXBkYXRlZC4KICAgICAgICAiIiIKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCgogICAgZGVmIGNoZWNrX2Rlc3RpbmF0aW9uKHNlbGYsIGRlc3QsIHVybCwgcmV2X29wdGlvbnMsIHJldl9kaXNwbGF5KToKICAgICAgICAiIiIKICAgICAgICBQcmVwYXJlIGEgbG9jYXRpb24gdG8gcmVjZWl2ZSBhIGNoZWNrb3V0L2Nsb25lLgoKICAgICAgICBSZXR1cm4gVHJ1ZSBpZiB0aGUgbG9jYXRpb24gaXMgcmVhZHkgZm9yIChhbmQgcmVxdWlyZXMpIGEKICAgICAgICBjaGVja291dC9jbG9uZSwgRmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICIiIgogICAgICAgIGNoZWNrb3V0ID0gVHJ1ZQogICAgICAgIHByb21wdCA9IEZhbHNlCiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoZGVzdCk6CiAgICAgICAgICAgIGNoZWNrb3V0ID0gRmFsc2UKICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKGRlc3QsIHNlbGYuZGlybmFtZSkpOgogICAgICAgICAgICAgICAgZXhpc3RpbmdfdXJsID0gc2VsZi5nZXRfdXJsKGRlc3QpCiAgICAgICAgICAgICAgICBpZiBzZWxmLmNvbXBhcmVfdXJscyhleGlzdGluZ191cmwsIHVybCk6CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKAogICAgICAgICAgICAgICAgICAgICAgICAnJXMgaW4gJXMgZXhpc3RzLCBhbmQgaGFzIGNvcnJlY3QgVVJMICglcyknLAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlcG9fbmFtZS50aXRsZSgpLAogICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5X3BhdGgoZGVzdCksCiAgICAgICAgICAgICAgICAgICAgICAgIHVybCwKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuY2hlY2tfdmVyc2lvbihkZXN0LCByZXZfb3B0aW9ucyk6CiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1VwZGF0aW5nICVzICVzJXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheV9wYXRoKGRlc3QpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXBvX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXZfZGlzcGxheSwKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnVwZGF0ZShkZXN0LCByZXZfb3B0aW9ucykKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTa2lwcGluZyBiZWNhdXNlIGFscmVhZHkgdXAtdG8tZGF0ZS4nKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICAgICAgICAgJyVzICVzIGluICVzIGV4aXN0cyB3aXRoIFVSTCAlcycsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXBvX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlfcGF0aChkZXN0KSwKICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdfdXJsLAogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICBwcm9tcHQgPSAoJyhzKXdpdGNoLCAoaSlnbm9yZSwgKHcpaXBlLCAoYilhY2t1cCAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ3MnLCAnaScsICd3JywgJ2InKSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgICAgICdEaXJlY3RvcnkgJXMgYWxyZWFkeSBleGlzdHMsIGFuZCBpcyBub3QgYSAlcyAlcy4nLAogICAgICAgICAgICAgICAgICAgIGRlc3QsCiAgICAgICAgICAgICAgICAgICAgc2VsZi5uYW1lLAogICAgICAgICAgICAgICAgICAgIHNlbGYucmVwb19uYW1lLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgcHJvbXB0ID0gKCcoaSlnbm9yZSwgKHcpaXBlLCAoYilhY2t1cCAnLCAoJ2knLCAndycsICdiJykpCiAgICAgICAgaWYgcHJvbXB0OgogICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICdUaGUgcGxhbiBpcyB0byBpbnN0YWxsIHRoZSAlcyByZXBvc2l0b3J5ICVzJywKICAgICAgICAgICAgICAgIHNlbGYubmFtZSwKICAgICAgICAgICAgICAgIHVybCwKICAgICAgICAgICAgKQogICAgICAgICAgICByZXNwb25zZSA9IGFza19wYXRoX2V4aXN0cygnV2hhdCB0byBkbz8gICVzJyAlIHByb21wdFswXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbXB0WzFdKQoKICAgICAgICAgICAgaWYgcmVzcG9uc2UgPT0gJ3MnOgogICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oCiAgICAgICAgICAgICAgICAgICAgJ1N3aXRjaGluZyAlcyAlcyB0byAlcyVzJywKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlcG9fbmFtZSwKICAgICAgICAgICAgICAgICAgICBkaXNwbGF5X3BhdGgoZGVzdCksCiAgICAgICAgICAgICAgICAgICAgdXJsLAogICAgICAgICAgICAgICAgICAgIHJldl9kaXNwbGF5LAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgc2VsZi5zd2l0Y2goZGVzdCwgdXJsLCByZXZfb3B0aW9ucykKICAgICAgICAgICAgZWxpZiByZXNwb25zZSA9PSAnaSc6CiAgICAgICAgICAgICAgICAjIGRvIG5vdGhpbmcKICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgZWxpZiByZXNwb25zZSA9PSAndyc6CiAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygnRGVsZXRpbmcgJXMnLCBkaXNwbGF5X3BhdGgoZGVzdCkpCiAgICAgICAgICAgICAgICBybXRyZWUoZGVzdCkKICAgICAgICAgICAgICAgIGNoZWNrb3V0ID0gVHJ1ZQogICAgICAgICAgICBlbGlmIHJlc3BvbnNlID09ICdiJzoKICAgICAgICAgICAgICAgIGRlc3RfZGlyID0gYmFja3VwX2RpcihkZXN0KQogICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICAgICAgICAgJ0JhY2tpbmcgdXAgJXMgdG8gJXMnLCBkaXNwbGF5X3BhdGgoZGVzdCksIGRlc3RfZGlyLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgc2h1dGlsLm1vdmUoZGVzdCwgZGVzdF9kaXIpCiAgICAgICAgICAgICAgICBjaGVja291dCA9IFRydWUKICAgICAgICAgICAgZWxpZiByZXNwb25zZSA9PSAnYSc6CiAgICAgICAgICAgICAgICBzeXMuZXhpdCgtMSkKICAgICAgICByZXR1cm4gY2hlY2tvdXQKCiAgICBkZWYgdW5wYWNrKHNlbGYsIGxvY2F0aW9uKToKICAgICAgICAiIiIKICAgICAgICBDbGVhbiB1cCBjdXJyZW50IGxvY2F0aW9uIGFuZCBkb3dubG9hZCB0aGUgdXJsIHJlcG9zaXRvcnkKICAgICAgICAoYW5kIHZjcyBpbmZvcykgaW50byBsb2NhdGlvbgogICAgICAgICIiIgogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGxvY2F0aW9uKToKICAgICAgICAgICAgcm10cmVlKGxvY2F0aW9uKQogICAgICAgIHNlbGYub2J0YWluKGxvY2F0aW9uKQoKICAgIGRlZiBnZXRfc3JjX3JlcXVpcmVtZW50KHNlbGYsIGRpc3QsIGxvY2F0aW9uKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSByZXF1aXJlbWVudCBuZWVkZWQgdG8KICAgICAgICByZWRvd25sb2FkIHRoZSBmaWxlcyBjdXJyZW50bHkgcHJlc2VudCBpbiBsb2NhdGlvbiwgc29tZXRoaW5nCiAgICAgICAgbGlrZToKICAgICAgICAgIHtyZXBvc2l0b3J5X3VybH1Ae3JldmlzaW9ufSNlZ2c9e3Byb2plY3RfbmFtZX0te3ZlcnNpb25faWRlbnRpZmllcn0KICAgICAgICAiIiIKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCgogICAgZGVmIGdldF91cmwoc2VsZiwgbG9jYXRpb24pOgogICAgICAgICIiIgogICAgICAgIFJldHVybiB0aGUgdXJsIHVzZWQgYXQgbG9jYXRpb24KICAgICAgICBVc2VkIGluIGdldF9pbmZvIG9yIGNoZWNrX2Rlc3RpbmF0aW9uCiAgICAgICAgIiIiCiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgoKICAgIGRlZiBnZXRfcmV2aXNpb24oc2VsZiwgbG9jYXRpb24pOgogICAgICAgICIiIgogICAgICAgIFJldHVybiB0aGUgY3VycmVudCByZXZpc2lvbiBvZiB0aGUgZmlsZXMgYXQgbG9jYXRpb24KICAgICAgICBVc2VkIGluIGdldF9pbmZvCiAgICAgICAgIiIiCiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgoKICAgIGRlZiBydW5fY29tbWFuZChzZWxmLCBjbWQsIHNob3dfc3Rkb3V0PVRydWUsIGN3ZD1Ob25lLAogICAgICAgICAgICAgICAgICAgIG9uX3JldHVybmNvZGU9J3JhaXNlJywKICAgICAgICAgICAgICAgICAgICBjb21tYW5kX2Rlc2M9Tm9uZSwKICAgICAgICAgICAgICAgICAgICBleHRyYV9lbnZpcm9uPU5vbmUsIHNwaW5uZXI9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgUnVuIGEgVkNTIHN1YmNvbW1hbmQKICAgICAgICBUaGlzIGlzIHNpbXBseSBhIHdyYXBwZXIgYXJvdW5kIGNhbGxfc3VicHJvY2VzcyB0aGF0IGFkZHMgdGhlIFZDUwogICAgICAgIGNvbW1hbmQgbmFtZSwgYW5kIGNoZWNrcyB0aGF0IHRoZSBWQ1MgaXMgYXZhaWxhYmxlCiAgICAgICAgIiIiCiAgICAgICAgY21kID0gW3NlbGYubmFtZV0gKyBjbWQKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBjYWxsX3N1YnByb2Nlc3MoY21kLCBzaG93X3N0ZG91dCwgY3dkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uX3JldHVybmNvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZF9kZXNjLCBleHRyYV9lbnZpcm9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwaW5uZXIpCiAgICAgICAgZXhjZXB0IE9TRXJyb3IgYXMgZToKICAgICAgICAgICAgIyBlcnJuby5FTk9FTlQgPSBubyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5CiAgICAgICAgICAgICMgSW4gb3RoZXIgd29yZHMsIHRoZSBWQ1MgZXhlY3V0YWJsZSBpc24ndCBhdmFpbGFibGUKICAgICAgICAgICAgaWYgZS5lcnJubyA9PSBlcnJuby5FTk9FTlQ6CiAgICAgICAgICAgICAgICByYWlzZSBCYWRDb21tYW5kKCdDYW5ub3QgZmluZCBjb21tYW5kICVyJyAlIHNlbGYubmFtZSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJhaXNlICAjIHJlLXJhaXNlIGV4Y2VwdGlvbiBpZiBhIGRpZmZlcmVudCBlcnJvciBvY2N1cnJlZAoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGNvbnRyb2xzX2xvY2F0aW9uKGNscywgbG9jYXRpb24pOgogICAgICAgICIiIgogICAgICAgIENoZWNrIGlmIGEgbG9jYXRpb24gaXMgY29udHJvbGxlZCBieSB0aGUgdmNzLgogICAgICAgIEl0IGlzIG1lYW50IHRvIGJlIG92ZXJyaWRkZW4gdG8gaW1wbGVtZW50IHNtYXJ0ZXIgZGV0ZWN0aW9uCiAgICAgICAgbWVjaGFuaXNtcyBmb3Igc3BlY2lmaWMgdmNzLgogICAgICAgICIiIgogICAgICAgIGxvZ2dlci5kZWJ1ZygnQ2hlY2tpbmcgaW4gJXMgZm9yICVzICglcykuLi4nLAogICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiwgY2xzLmRpcm5hbWUsIGNscy5uYW1lKQogICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4obG9jYXRpb24sIGNscy5kaXJuYW1lKQogICAgICAgIHJldHVybiBvcy5wYXRoLmV4aXN0cyhwYXRoKQoKCmRlZiBnZXRfc3JjX3JlcXVpcmVtZW50KGRpc3QsIGxvY2F0aW9uKToKICAgIHZlcnNpb25fY29udHJvbCA9IHZjcy5nZXRfYmFja2VuZF9mcm9tX2xvY2F0aW9uKGxvY2F0aW9uKQogICAgaWYgdmVyc2lvbl9jb250cm9sOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHZlcnNpb25fY29udHJvbCgpLmdldF9zcmNfcmVxdWlyZW1lbnQoZGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24pCiAgICAgICAgZXhjZXB0IEJhZENvbW1hbmQ6CiAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgJ2Nhbm5vdCBkZXRlcm1pbmUgdmVyc2lvbiBvZiBlZGl0YWJsZSBzb3VyY2UgaW4gJXMgJwogICAgICAgICAgICAgICAgJyglcyBjb21tYW5kIG5vdCBmb3VuZCBpbiBwYXRoKScsCiAgICAgICAgICAgICAgICBsb2NhdGlvbiwKICAgICAgICAgICAgICAgIHZlcnNpb25fY29udHJvbC5uYW1lLAogICAgICAgICAgICApCiAgICAgICAgICAgIHJldHVybiBkaXN0LmFzX3JlcXVpcmVtZW50KCkKICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICdjYW5ub3QgZGV0ZXJtaW5lIHZlcnNpb24gb2YgZWRpdGFibGUgc291cmNlIGluICVzIChpcyBub3QgU1ZOICcKICAgICAgICAnY2hlY2tvdXQsIEdpdCBjbG9uZSwgTWVyY3VyaWFsIGNsb25lIG9yIEJhemFhciBicmFuY2gpJywKICAgICAgICBsb2NhdGlvbiwKICAgICkKICAgIHJldHVybiBkaXN0LmFzX3JlcXVpcmVtZW50KCkKUEsDBBQAAAAAAAAAIQD7wMzF2w4AANsOAAAuAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvdmNzL2JhemFhci5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgbG9nZ2luZwppbXBvcnQgb3MKaW1wb3J0IHRlbXBmaWxlCgojIFRPRE86IEdldCB0aGlzIGludG8gc2l4Lm1vdmVzLnVybGxpYi5wYXJzZQp0cnk6CiAgICBmcm9tIHVybGxpYiBpbXBvcnQgcGFyc2UgYXMgdXJsbGliX3BhcnNlCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGltcG9ydCB1cmxwYXJzZSBhcyB1cmxsaWJfcGFyc2UKCmZyb20gcGlwLnV0aWxzIGltcG9ydCBybXRyZWUsIGRpc3BsYXlfcGF0aApmcm9tIHBpcC52Y3MgaW1wb3J0IHZjcywgVmVyc2lvbkNvbnRyb2wKZnJvbSBwaXAuZG93bmxvYWQgaW1wb3J0IHBhdGhfdG9fdXJsCgoKbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgoKY2xhc3MgQmF6YWFyKFZlcnNpb25Db250cm9sKToKICAgIG5hbWUgPSAnYnpyJwogICAgZGlybmFtZSA9ICcuYnpyJwogICAgcmVwb19uYW1lID0gJ2JyYW5jaCcKICAgIHNjaGVtZXMgPSAoCiAgICAgICAgJ2J6cicsICdienIraHR0cCcsICdienIraHR0cHMnLCAnYnpyK3NzaCcsICdienIrc2Z0cCcsICdienIrZnRwJywKICAgICAgICAnYnpyK2xwJywKICAgICkKCiAgICBkZWYgX19pbml0X18oc2VsZiwgdXJsPU5vbmUsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgc3VwZXIoQmF6YWFyLCBzZWxmKS5fX2luaXRfXyh1cmwsICphcmdzLCAqKmt3YXJncykKICAgICAgICAjIFB5dGhvbiA+PSAyLjcuNCwgMy4zIGRvZXNuJ3QgaGF2ZSB1c2VzX2ZyYWdtZW50IG9yIG5vbl9oaWVyYXJjaGljYWwKICAgICAgICAjIFJlZ2lzdGVyIGxwIGJ1dCBkbyBub3QgZXhwb3NlIGFzIGEgc2NoZW1lIHRvIHN1cHBvcnQgYnpyK2xwLgogICAgICAgIGlmIGdldGF0dHIodXJsbGliX3BhcnNlLCAndXNlc19mcmFnbWVudCcsIE5vbmUpOgogICAgICAgICAgICB1cmxsaWJfcGFyc2UudXNlc19mcmFnbWVudC5leHRlbmQoWydscCddKQogICAgICAgICAgICB1cmxsaWJfcGFyc2Uubm9uX2hpZXJhcmNoaWNhbC5leHRlbmQoWydscCddKQoKICAgIGRlZiBleHBvcnQoc2VsZiwgbG9jYXRpb24pOgogICAgICAgICIiIgogICAgICAgIEV4cG9ydCB0aGUgQmF6YWFyIHJlcG9zaXRvcnkgYXQgdGhlIHVybCB0byB0aGUgZGVzdGluYXRpb24gbG9jYXRpb24KICAgICAgICAiIiIKICAgICAgICB0ZW1wX2RpciA9IHRlbXBmaWxlLm1rZHRlbXAoJy1leHBvcnQnLCAncGlwLScpCiAgICAgICAgc2VsZi51bnBhY2sodGVtcF9kaXIpCiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMobG9jYXRpb24pOgogICAgICAgICAgICAjIFJlbW92ZSB0aGUgbG9jYXRpb24gdG8gbWFrZSBzdXJlIEJhemFhciBjYW4gZXhwb3J0IGl0IGNvcnJlY3RseQogICAgICAgICAgICBybXRyZWUobG9jYXRpb24pCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKFsnZXhwb3J0JywgbG9jYXRpb25dLCBjd2Q9dGVtcF9kaXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd19zdGRvdXQ9RmFsc2UpCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgcm10cmVlKHRlbXBfZGlyKQoKICAgIGRlZiBzd2l0Y2goc2VsZiwgZGVzdCwgdXJsLCByZXZfb3B0aW9ucyk6CiAgICAgICAgc2VsZi5ydW5fY29tbWFuZChbJ3N3aXRjaCcsIHVybF0sIGN3ZD1kZXN0KQoKICAgIGRlZiB1cGRhdGUoc2VsZiwgZGVzdCwgcmV2X29wdGlvbnMpOgogICAgICAgIHNlbGYucnVuX2NvbW1hbmQoWydwdWxsJywgJy1xJ10gKyByZXZfb3B0aW9ucywgY3dkPWRlc3QpCgogICAgZGVmIG9idGFpbihzZWxmLCBkZXN0KToKICAgICAgICB1cmwsIHJldiA9IHNlbGYuZ2V0X3VybF9yZXYoKQogICAgICAgIGlmIHJldjoKICAgICAgICAgICAgcmV2X29wdGlvbnMgPSBbJy1yJywgcmV2XQogICAgICAgICAgICByZXZfZGlzcGxheSA9ICcgKHRvIHJldmlzaW9uICVzKScgJSByZXYKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXZfb3B0aW9ucyA9IFtdCiAgICAgICAgICAgIHJldl9kaXNwbGF5ID0gJycKICAgICAgICBpZiBzZWxmLmNoZWNrX2Rlc3RpbmF0aW9uKGRlc3QsIHVybCwgcmV2X29wdGlvbnMsIHJldl9kaXNwbGF5KToKICAgICAgICAgICAgbG9nZ2VyLmluZm8oCiAgICAgICAgICAgICAgICAnQ2hlY2tpbmcgb3V0ICVzJXMgdG8gJXMnLAogICAgICAgICAgICAgICAgdXJsLAogICAgICAgICAgICAgICAgcmV2X2Rpc3BsYXksCiAgICAgICAgICAgICAgICBkaXNwbGF5X3BhdGgoZGVzdCksCiAgICAgICAgICAgICkKICAgICAgICAgICAgc2VsZi5ydW5fY29tbWFuZChbJ2JyYW5jaCcsICctcSddICsgcmV2X29wdGlvbnMgKyBbdXJsLCBkZXN0XSkKCiAgICBkZWYgZ2V0X3VybF9yZXYoc2VsZik6CiAgICAgICAgIyBob3RmaXggdGhlIFVSTCBzY2hlbWUgYWZ0ZXIgcmVtb3ZpbmcgYnpyKyBmcm9tIGJ6citzc2g6Ly8gcmVhZGQgaXQKICAgICAgICB1cmwsIHJldiA9IHN1cGVyKEJhemFhciwgc2VsZikuZ2V0X3VybF9yZXYoKQogICAgICAgIGlmIHVybC5zdGFydHN3aXRoKCdzc2g6Ly8nKToKICAgICAgICAgICAgdXJsID0gJ2J6cisnICsgdXJsCiAgICAgICAgcmV0dXJuIHVybCwgcmV2CgogICAgZGVmIGdldF91cmwoc2VsZiwgbG9jYXRpb24pOgogICAgICAgIHVybHMgPSBzZWxmLnJ1bl9jb21tYW5kKFsnaW5mbyddLCBzaG93X3N0ZG91dD1GYWxzZSwgY3dkPWxvY2F0aW9uKQogICAgICAgIGZvciBsaW5lIGluIHVybHMuc3BsaXRsaW5lcygpOgogICAgICAgICAgICBsaW5lID0gbGluZS5zdHJpcCgpCiAgICAgICAgICAgIGZvciB4IGluICgnY2hlY2tvdXQgb2YgYnJhbmNoOiAnLAogICAgICAgICAgICAgICAgICAgICAgJ3BhcmVudCBicmFuY2g6ICcpOgogICAgICAgICAgICAgICAgaWYgbGluZS5zdGFydHN3aXRoKHgpOgogICAgICAgICAgICAgICAgICAgIHJlcG8gPSBsaW5lLnNwbGl0KHgpWzFdCiAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5faXNfbG9jYWxfcmVwb3NpdG9yeShyZXBvKToKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhdGhfdG9fdXJsKHJlcG8pCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcG8KICAgICAgICByZXR1cm4gTm9uZQoKICAgIGRlZiBnZXRfcmV2aXNpb24oc2VsZiwgbG9jYXRpb24pOgogICAgICAgIHJldmlzaW9uID0gc2VsZi5ydW5fY29tbWFuZCgKICAgICAgICAgICAgWydyZXZubyddLCBzaG93X3N0ZG91dD1GYWxzZSwgY3dkPWxvY2F0aW9uKQogICAgICAgIHJldHVybiByZXZpc2lvbi5zcGxpdGxpbmVzKClbLTFdCgogICAgZGVmIGdldF9zcmNfcmVxdWlyZW1lbnQoc2VsZiwgZGlzdCwgbG9jYXRpb24pOgogICAgICAgIHJlcG8gPSBzZWxmLmdldF91cmwobG9jYXRpb24pCiAgICAgICAgaWYgbm90IHJlcG86CiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgaWYgbm90IHJlcG8ubG93ZXIoKS5zdGFydHN3aXRoKCdienI6Jyk6CiAgICAgICAgICAgIHJlcG8gPSAnYnpyKycgKyByZXBvCiAgICAgICAgZWdnX3Byb2plY3RfbmFtZSA9IGRpc3QuZWdnX25hbWUoKS5zcGxpdCgnLScsIDEpWzBdCiAgICAgICAgY3VycmVudF9yZXYgPSBzZWxmLmdldF9yZXZpc2lvbihsb2NhdGlvbikKICAgICAgICByZXR1cm4gJyVzQCVzI2VnZz0lcycgJSAocmVwbywgY3VycmVudF9yZXYsIGVnZ19wcm9qZWN0X25hbWUpCgogICAgZGVmIGNoZWNrX3ZlcnNpb24oc2VsZiwgZGVzdCwgcmV2X29wdGlvbnMpOgogICAgICAgICIiIkFsd2F5cyBhc3N1bWUgdGhlIHZlcnNpb25zIGRvbid0IG1hdGNoIiIiCiAgICAgICAgcmV0dXJuIEZhbHNlCgoKdmNzLnJlZ2lzdGVyKEJhemFhcikKUEsDBBQAAAAAAAAAIQAovt4wvSsAAL0rAAArAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvdmNzL2dpdC5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgbG9nZ2luZwppbXBvcnQgdGVtcGZpbGUKaW1wb3J0IG9zLnBhdGgKCmZyb20gcGlwLmNvbXBhdCBpbXBvcnQgc2FtZWZpbGUKZnJvbSBwaXAuZXhjZXB0aW9ucyBpbXBvcnQgQmFkQ29tbWFuZApmcm9tIHBpcC5fdmVuZG9yLnNpeC5tb3Zlcy51cmxsaWIgaW1wb3J0IHBhcnNlIGFzIHVybGxpYl9wYXJzZQpmcm9tIHBpcC5fdmVuZG9yLnNpeC5tb3Zlcy51cmxsaWIgaW1wb3J0IHJlcXVlc3QgYXMgdXJsbGliX3JlcXVlc3QKZnJvbSBwaXAuX3ZlbmRvci5wYWNrYWdpbmcudmVyc2lvbiBpbXBvcnQgcGFyc2UgYXMgcGFyc2VfdmVyc2lvbgoKZnJvbSBwaXAudXRpbHMgaW1wb3J0IGRpc3BsYXlfcGF0aCwgcm10cmVlCmZyb20gcGlwLnZjcyBpbXBvcnQgdmNzLCBWZXJzaW9uQ29udHJvbAoKCnVybHNwbGl0ID0gdXJsbGliX3BhcnNlLnVybHNwbGl0CnVybHVuc3BsaXQgPSB1cmxsaWJfcGFyc2UudXJsdW5zcGxpdAoKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKCmNsYXNzIEdpdChWZXJzaW9uQ29udHJvbCk6CiAgICBuYW1lID0gJ2dpdCcKICAgIGRpcm5hbWUgPSAnLmdpdCcKICAgIHJlcG9fbmFtZSA9ICdjbG9uZScKICAgIHNjaGVtZXMgPSAoCiAgICAgICAgJ2dpdCcsICdnaXQraHR0cCcsICdnaXQraHR0cHMnLCAnZ2l0K3NzaCcsICdnaXQrZ2l0JywgJ2dpdCtmaWxlJywKICAgICkKCiAgICBkZWYgX19pbml0X18oc2VsZiwgdXJsPU5vbmUsICphcmdzLCAqKmt3YXJncyk6CgogICAgICAgICMgV29ya3MgYXJvdW5kIGFuIGFwcGFyZW50IEdpdCBidWcKICAgICAgICAjIChzZWUgaHR0cDovL2FydGljbGUuZ21hbmUub3JnL2dtYW5lLmNvbXAudmVyc2lvbi1jb250cm9sLmdpdC8xNDY1MDApCiAgICAgICAgaWYgdXJsOgogICAgICAgICAgICBzY2hlbWUsIG5ldGxvYywgcGF0aCwgcXVlcnksIGZyYWdtZW50ID0gdXJsc3BsaXQodXJsKQogICAgICAgICAgICBpZiBzY2hlbWUuZW5kc3dpdGgoJ2ZpbGUnKToKICAgICAgICAgICAgICAgIGluaXRpYWxfc2xhc2hlcyA9IHBhdGhbOi1sZW4ocGF0aC5sc3RyaXAoJy8nKSldCiAgICAgICAgICAgICAgICBuZXdwYXRoID0gKAogICAgICAgICAgICAgICAgICAgIGluaXRpYWxfc2xhc2hlcyArCiAgICAgICAgICAgICAgICAgICAgdXJsbGliX3JlcXVlc3QudXJsMnBhdGhuYW1lKHBhdGgpCiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoJ1xcJywgJy8nKS5sc3RyaXAoJy8nKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgdXJsID0gdXJsdW5zcGxpdCgoc2NoZW1lLCBuZXRsb2MsIG5ld3BhdGgsIHF1ZXJ5LCBmcmFnbWVudCkpCiAgICAgICAgICAgICAgICBhZnRlcl9wbHVzID0gc2NoZW1lLmZpbmQoJysnKSArIDEKICAgICAgICAgICAgICAgIHVybCA9IHNjaGVtZVs6YWZ0ZXJfcGx1c10gKyB1cmx1bnNwbGl0KAogICAgICAgICAgICAgICAgICAgIChzY2hlbWVbYWZ0ZXJfcGx1czpdLCBuZXRsb2MsIG5ld3BhdGgsIHF1ZXJ5LCBmcmFnbWVudCksCiAgICAgICAgICAgICAgICApCgogICAgICAgIHN1cGVyKEdpdCwgc2VsZikuX19pbml0X18odXJsLCAqYXJncywgKiprd2FyZ3MpCgogICAgZGVmIGdldF9naXRfdmVyc2lvbihzZWxmKToKICAgICAgICBWRVJTSU9OX1BGWCA9ICdnaXQgdmVyc2lvbiAnCiAgICAgICAgdmVyc2lvbiA9IHNlbGYucnVuX2NvbW1hbmQoWyd2ZXJzaW9uJ10sIHNob3dfc3Rkb3V0PUZhbHNlKQogICAgICAgIGlmIHZlcnNpb24uc3RhcnRzd2l0aChWRVJTSU9OX1BGWCk6CiAgICAgICAgICAgIHZlcnNpb24gPSB2ZXJzaW9uW2xlbihWRVJTSU9OX1BGWCk6XQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHZlcnNpb24gPSAnJwogICAgICAgICMgZ2V0IGZpcnN0IDMgcG9zaXRpb25zIG9mIHRoZSBnaXQgdmVyc2lvbiBiZWNhc3VlCiAgICAgICAgIyBvbiB3aW5kb3dzIGl0IGlzIHgueS56LndpbmRvd3MudCwgYW5kIHRoaXMgcGFyc2VzIGFzCiAgICAgICAgIyBMZWdhY3lWZXJzaW9uIHdoaWNoIGFsd2F5cyBzbWFsbGVyIHRoYW4gYSBWZXJzaW9uLgogICAgICAgIHZlcnNpb24gPSAnLicuam9pbih2ZXJzaW9uLnNwbGl0KCcuJylbOjNdKQogICAgICAgIHJldHVybiBwYXJzZV92ZXJzaW9uKHZlcnNpb24pCgogICAgZGVmIGV4cG9ydChzZWxmLCBsb2NhdGlvbik6CiAgICAgICAgIiIiRXhwb3J0IHRoZSBHaXQgcmVwb3NpdG9yeSBhdCB0aGUgdXJsIHRvIHRoZSBkZXN0aW5hdGlvbiBsb2NhdGlvbiIiIgogICAgICAgIHRlbXBfZGlyID0gdGVtcGZpbGUubWtkdGVtcCgnLWV4cG9ydCcsICdwaXAtJykKICAgICAgICBzZWxmLnVucGFjayh0ZW1wX2RpcikKICAgICAgICB0cnk6CiAgICAgICAgICAgIGlmIG5vdCBsb2NhdGlvbi5lbmRzd2l0aCgnLycpOgogICAgICAgICAgICAgICAgbG9jYXRpb24gPSBsb2NhdGlvbiArICcvJwogICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKAogICAgICAgICAgICAgICAgWydjaGVja291dC1pbmRleCcsICctYScsICctZicsICctLXByZWZpeCcsIGxvY2F0aW9uXSwKICAgICAgICAgICAgICAgIHNob3dfc3Rkb3V0PUZhbHNlLCBjd2Q9dGVtcF9kaXIpCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgcm10cmVlKHRlbXBfZGlyKQoKICAgIGRlZiBjaGVja19yZXZfb3B0aW9ucyhzZWxmLCByZXYsIGRlc3QsIHJldl9vcHRpb25zKToKICAgICAgICAiIiJDaGVjayB0aGUgcmV2aXNpb24gb3B0aW9ucyBiZWZvcmUgY2hlY2tvdXQgdG8gY29tcGVuc2F0ZSB0aGF0IHRhZ3MKICAgICAgICBhbmQgYnJhbmNoZXMgbWF5IG5lZWQgb3JpZ2luLyBhcyBhIHByZWZpeC4KICAgICAgICBSZXR1cm5zIHRoZSBTSEExIG9mIHRoZSBicmFuY2ggb3IgdGFnIGlmIGZvdW5kLgogICAgICAgICIiIgogICAgICAgIHJldmlzaW9ucyA9IHNlbGYuZ2V0X3Nob3J0X3JlZnMoZGVzdCkKCiAgICAgICAgb3JpZ2luX3JldiA9ICdvcmlnaW4vJXMnICUgcmV2CiAgICAgICAgaWYgb3JpZ2luX3JldiBpbiByZXZpc2lvbnM6CiAgICAgICAgICAgICMgcmVtb3RlIGJyYW5jaAogICAgICAgICAgICByZXR1cm4gW3JldmlzaW9uc1tvcmlnaW5fcmV2XV0KICAgICAgICBlbGlmIHJldiBpbiByZXZpc2lvbnM6CiAgICAgICAgICAgICMgYSBsb2NhbCB0YWcgb3IgYnJhbmNoIG5hbWUKICAgICAgICAgICAgcmV0dXJuIFtyZXZpc2lvbnNbcmV2XV0KICAgICAgICBlbHNlOgogICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICJDb3VsZCBub3QgZmluZCBhIHRhZyBvciBicmFuY2ggJyVzJywgYXNzdW1pbmcgY29tbWl0LiIsIHJldiwKICAgICAgICAgICAgKQogICAgICAgICAgICByZXR1cm4gcmV2X29wdGlvbnMKCiAgICBkZWYgY2hlY2tfdmVyc2lvbihzZWxmLCBkZXN0LCByZXZfb3B0aW9ucyk6CiAgICAgICAgIiIiCiAgICAgICAgQ29tcGFyZSB0aGUgY3VycmVudCBzaGEgdG8gdGhlIHJlZi4gcmVmIG1heSBiZSBhIGJyYW5jaCBvciB0YWcgbmFtZSwKICAgICAgICBidXQgY3VycmVudCByZXYgd2lsbCBhbHdheXMgcG9pbnQgdG8gYSBzaGEuIFRoaXMgbWVhbnMgdGhhdCBhIGJyYW5jaAogICAgICAgIG9yIHRhZyB3aWxsIG5ldmVyIGNvbXBhcmUgYXMgVHJ1ZS4gU28gdGhpcyB1bHRpbWF0ZWx5IG9ubHkgbWF0Y2hlcwogICAgICAgIGFnYWluc3QgZXhhY3Qgc2hhcy4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZi5nZXRfcmV2aXNpb24oZGVzdCkuc3RhcnRzd2l0aChyZXZfb3B0aW9uc1swXSkKCiAgICBkZWYgc3dpdGNoKHNlbGYsIGRlc3QsIHVybCwgcmV2X29wdGlvbnMpOgogICAgICAgIHNlbGYucnVuX2NvbW1hbmQoWydjb25maWcnLCAncmVtb3RlLm9yaWdpbi51cmwnLCB1cmxdLCBjd2Q9ZGVzdCkKICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKFsnY2hlY2tvdXQnLCAnLXEnXSArIHJldl9vcHRpb25zLCBjd2Q9ZGVzdCkKCiAgICAgICAgc2VsZi51cGRhdGVfc3VibW9kdWxlcyhkZXN0KQoKICAgIGRlZiB1cGRhdGUoc2VsZiwgZGVzdCwgcmV2X29wdGlvbnMpOgogICAgICAgICMgRmlyc3QgZmV0Y2ggY2hhbmdlcyBmcm9tIHRoZSBkZWZhdWx0IHJlbW90ZQogICAgICAgIGlmIHNlbGYuZ2V0X2dpdF92ZXJzaW9uKCkgPj0gcGFyc2VfdmVyc2lvbignMS45LjAnKToKICAgICAgICAgICAgIyBmZXRjaCB0YWdzIGluIGFkZGl0aW9uIHRvIGV2ZXJ5dGhpbmcgZWxzZQogICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKFsnZmV0Y2gnLCAnLXEnLCAnLS10YWdzJ10sIGN3ZD1kZXN0KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoWydmZXRjaCcsICctcSddLCBjd2Q9ZGVzdCkKICAgICAgICAjIFRoZW4gcmVzZXQgdG8gd2FudGVkIHJldmlzaW9uIChtYXliZSBldmVuIG9yaWdpbi9tYXN0ZXIpCiAgICAgICAgaWYgcmV2X29wdGlvbnM6CiAgICAgICAgICAgIHJldl9vcHRpb25zID0gc2VsZi5jaGVja19yZXZfb3B0aW9ucygKICAgICAgICAgICAgICAgIHJldl9vcHRpb25zWzBdLCBkZXN0LCByZXZfb3B0aW9ucywKICAgICAgICAgICAgKQogICAgICAgIHNlbGYucnVuX2NvbW1hbmQoWydyZXNldCcsICctLWhhcmQnLCAnLXEnXSArIHJldl9vcHRpb25zLCBjd2Q9ZGVzdCkKICAgICAgICAjOiB1cGRhdGUgc3VibW9kdWxlcwogICAgICAgIHNlbGYudXBkYXRlX3N1Ym1vZHVsZXMoZGVzdCkKCiAgICBkZWYgb2J0YWluKHNlbGYsIGRlc3QpOgogICAgICAgIHVybCwgcmV2ID0gc2VsZi5nZXRfdXJsX3JldigpCiAgICAgICAgaWYgcmV2OgogICAgICAgICAgICByZXZfb3B0aW9ucyA9IFtyZXZdCiAgICAgICAgICAgIHJldl9kaXNwbGF5ID0gJyAodG8gJXMpJyAlIHJldgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldl9vcHRpb25zID0gWydvcmlnaW4vbWFzdGVyJ10KICAgICAgICAgICAgcmV2X2Rpc3BsYXkgPSAnJwogICAgICAgIGlmIHNlbGYuY2hlY2tfZGVzdGluYXRpb24oZGVzdCwgdXJsLCByZXZfb3B0aW9ucywgcmV2X2Rpc3BsYXkpOgogICAgICAgICAgICBsb2dnZXIuaW5mbygKICAgICAgICAgICAgICAgICdDbG9uaW5nICVzJXMgdG8gJXMnLCB1cmwsIHJldl9kaXNwbGF5LCBkaXNwbGF5X3BhdGgoZGVzdCksCiAgICAgICAgICAgICkKICAgICAgICAgICAgc2VsZi5ydW5fY29tbWFuZChbJ2Nsb25lJywgJy1xJywgdXJsLCBkZXN0XSkKCiAgICAgICAgICAgIGlmIHJldjoKICAgICAgICAgICAgICAgIHJldl9vcHRpb25zID0gc2VsZi5jaGVja19yZXZfb3B0aW9ucyhyZXYsIGRlc3QsIHJldl9vcHRpb25zKQogICAgICAgICAgICAgICAgIyBPbmx5IGRvIGEgY2hlY2tvdXQgaWYgcmV2X29wdGlvbnMgZGlmZmVycyBmcm9tIEhFQUQKICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLmNoZWNrX3ZlcnNpb24oZGVzdCwgcmV2X29wdGlvbnMpOgogICAgICAgICAgICAgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoCiAgICAgICAgICAgICAgICAgICAgICAgIFsnY2hlY2tvdXQnLCAnLXEnXSArIHJldl9vcHRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICBjd2Q9ZGVzdCwKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICM6IHJlcG8gbWF5IGNvbnRhaW4gc3VibW9kdWxlcwogICAgICAgICAgICBzZWxmLnVwZGF0ZV9zdWJtb2R1bGVzKGRlc3QpCgogICAgZGVmIGdldF91cmwoc2VsZiwgbG9jYXRpb24pOgogICAgICAgICIiIlJldHVybiBVUkwgb2YgdGhlIGZpcnN0IHJlbW90ZSBlbmNvdW50ZXJlZC4iIiIKICAgICAgICByZW1vdGVzID0gc2VsZi5ydW5fY29tbWFuZCgKICAgICAgICAgICAgWydjb25maWcnLCAnLS1nZXQtcmVnZXhwJywgJ3JlbW90ZVwuLipcLnVybCddLAogICAgICAgICAgICBzaG93X3N0ZG91dD1GYWxzZSwgY3dkPWxvY2F0aW9uKQogICAgICAgIHJlbW90ZXMgPSByZW1vdGVzLnNwbGl0bGluZXMoKQogICAgICAgIGZvdW5kX3JlbW90ZSA9IHJlbW90ZXNbMF0KICAgICAgICBmb3IgcmVtb3RlIGluIHJlbW90ZXM6CiAgICAgICAgICAgIGlmIHJlbW90ZS5zdGFydHN3aXRoKCdyZW1vdGUub3JpZ2luLnVybCAnKToKICAgICAgICAgICAgICAgIGZvdW5kX3JlbW90ZSA9IHJlbW90ZQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICB1cmwgPSBmb3VuZF9yZW1vdGUuc3BsaXQoJyAnKVsxXQogICAgICAgIHJldHVybiB1cmwuc3RyaXAoKQoKICAgIGRlZiBnZXRfcmV2aXNpb24oc2VsZiwgbG9jYXRpb24pOgogICAgICAgIGN1cnJlbnRfcmV2ID0gc2VsZi5ydW5fY29tbWFuZCgKICAgICAgICAgICAgWydyZXYtcGFyc2UnLCAnSEVBRCddLCBzaG93X3N0ZG91dD1GYWxzZSwgY3dkPWxvY2F0aW9uKQogICAgICAgIHJldHVybiBjdXJyZW50X3Jldi5zdHJpcCgpCgogICAgZGVmIGdldF9mdWxsX3JlZnMoc2VsZiwgbG9jYXRpb24pOgogICAgICAgICIiIllpZWxkcyB0dXBsZXMgb2YgKGNvbW1pdCwgcmVmKSBmb3IgYnJhbmNoZXMgYW5kIHRhZ3MiIiIKICAgICAgICBvdXRwdXQgPSBzZWxmLnJ1bl9jb21tYW5kKFsnc2hvdy1yZWYnXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dfc3Rkb3V0PUZhbHNlLCBjd2Q9bG9jYXRpb24pCiAgICAgICAgZm9yIGxpbmUgaW4gb3V0cHV0LnN0cmlwKCkuc3BsaXRsaW5lcygpOgogICAgICAgICAgICBjb21taXQsIHJlZiA9IGxpbmUuc3BsaXQoJyAnLCAxKQogICAgICAgICAgICB5aWVsZCBjb21taXQuc3RyaXAoKSwgcmVmLnN0cmlwKCkKCiAgICBkZWYgaXNfcmVmX3JlbW90ZShzZWxmLCByZWYpOgogICAgICAgIHJldHVybiByZWYuc3RhcnRzd2l0aCgncmVmcy9yZW1vdGVzLycpCgogICAgZGVmIGlzX3JlZl9icmFuY2goc2VsZiwgcmVmKToKICAgICAgICByZXR1cm4gcmVmLnN0YXJ0c3dpdGgoJ3JlZnMvaGVhZHMvJykKCiAgICBkZWYgaXNfcmVmX3RhZyhzZWxmLCByZWYpOgogICAgICAgIHJldHVybiByZWYuc3RhcnRzd2l0aCgncmVmcy90YWdzLycpCgogICAgZGVmIGlzX3JlZl9jb21taXQoc2VsZiwgcmVmKToKICAgICAgICAiIiJBIHJlZiBpcyBhIGNvbW1pdCBzaGEgaWYgaXQgaXMgbm90IGFueXRoaW5nIGVsc2UiIiIKICAgICAgICByZXR1cm4gbm90IGFueSgoCiAgICAgICAgICAgIHNlbGYuaXNfcmVmX3JlbW90ZShyZWYpLAogICAgICAgICAgICBzZWxmLmlzX3JlZl9icmFuY2gocmVmKSwKICAgICAgICAgICAgc2VsZi5pc19yZWZfdGFnKHJlZiksCiAgICAgICAgKSkKCiAgICAjIFNob3VsZCBkZXByZWNhdGUgYGdldF9yZWZzYCBzaW5jZSBpdCdzIGFtYmlndW91cwogICAgZGVmIGdldF9yZWZzKHNlbGYsIGxvY2F0aW9uKToKICAgICAgICByZXR1cm4gc2VsZi5nZXRfc2hvcnRfcmVmcyhsb2NhdGlvbikKCiAgICBkZWYgZ2V0X3Nob3J0X3JlZnMoc2VsZiwgbG9jYXRpb24pOgogICAgICAgICIiIlJldHVybiBtYXAgb2YgbmFtZWQgcmVmcyAoYnJhbmNoZXMgb3IgdGFncykgdG8gY29tbWl0IGhhc2hlcy4iIiIKICAgICAgICBydiA9IHt9CiAgICAgICAgZm9yIGNvbW1pdCwgcmVmIGluIHNlbGYuZ2V0X2Z1bGxfcmVmcyhsb2NhdGlvbik6CiAgICAgICAgICAgIHJlZl9uYW1lID0gTm9uZQogICAgICAgICAgICBpZiBzZWxmLmlzX3JlZl9yZW1vdGUocmVmKToKICAgICAgICAgICAgICAgIHJlZl9uYW1lID0gcmVmW2xlbigncmVmcy9yZW1vdGVzLycpOl0KICAgICAgICAgICAgZWxpZiBzZWxmLmlzX3JlZl9icmFuY2gocmVmKToKICAgICAgICAgICAgICAgIHJlZl9uYW1lID0gcmVmW2xlbigncmVmcy9oZWFkcy8nKTpdCiAgICAgICAgICAgIGVsaWYgc2VsZi5pc19yZWZfdGFnKHJlZik6CiAgICAgICAgICAgICAgICByZWZfbmFtZSA9IHJlZltsZW4oJ3JlZnMvdGFncy8nKTpdCiAgICAgICAgICAgIGlmIHJlZl9uYW1lIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgcnZbcmVmX25hbWVdID0gY29tbWl0CiAgICAgICAgcmV0dXJuIHJ2CgogICAgZGVmIF9nZXRfc3ViZGlyZWN0b3J5KHNlbGYsIGxvY2F0aW9uKToKICAgICAgICAiIiJSZXR1cm4gdGhlIHJlbGF0aXZlIHBhdGggb2Ygc2V0dXAucHkgdG8gdGhlIGdpdCByZXBvIHJvb3QuIiIiCiAgICAgICAgIyBmaW5kIHRoZSByZXBvIHJvb3QKICAgICAgICBnaXRfZGlyID0gc2VsZi5ydW5fY29tbWFuZChbJ3Jldi1wYXJzZScsICctLWdpdC1kaXInXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93X3N0ZG91dD1GYWxzZSwgY3dkPWxvY2F0aW9uKS5zdHJpcCgpCiAgICAgICAgaWYgbm90IG9zLnBhdGguaXNhYnMoZ2l0X2Rpcik6CiAgICAgICAgICAgIGdpdF9kaXIgPSBvcy5wYXRoLmpvaW4obG9jYXRpb24sIGdpdF9kaXIpCiAgICAgICAgcm9vdF9kaXIgPSBvcy5wYXRoLmpvaW4oZ2l0X2RpciwgJy4uJykKICAgICAgICAjIGZpbmQgc2V0dXAucHkKICAgICAgICBvcmlnX2xvY2F0aW9uID0gbG9jYXRpb24KICAgICAgICB3aGlsZSBub3Qgb3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKGxvY2F0aW9uLCAnc2V0dXAucHknKSk6CiAgICAgICAgICAgIGxhc3RfbG9jYXRpb24gPSBsb2NhdGlvbgogICAgICAgICAgICBsb2NhdGlvbiA9IG9zLnBhdGguZGlybmFtZShsb2NhdGlvbikKICAgICAgICAgICAgaWYgbG9jYXRpb24gPT0gbGFzdF9sb2NhdGlvbjoKICAgICAgICAgICAgICAgICMgV2UndmUgdHJhdmVyc2VkIHVwIHRvIHRoZSByb290IG9mIHRoZSBmaWxlc3lzdGVtIHdpdGhvdXQKICAgICAgICAgICAgICAgICMgZmluZGluZyBzZXR1cC5weQogICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBmaW5kIHNldHVwLnB5IGZvciBkaXJlY3RvcnkgJXMgKHRyaWVkIGFsbCAiCiAgICAgICAgICAgICAgICAgICAgInBhcmVudCBkaXJlY3RvcmllcykiLAogICAgICAgICAgICAgICAgICAgIG9yaWdfbG9jYXRpb24sCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgICMgcmVsYXRpdmUgcGF0aCBvZiBzZXR1cC5weSB0byByZXBvIHJvb3QKICAgICAgICBpZiBzYW1lZmlsZShyb290X2RpciwgbG9jYXRpb24pOgogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIHJldHVybiBvcy5wYXRoLnJlbHBhdGgobG9jYXRpb24sIHJvb3RfZGlyKQoKICAgIGRlZiBnZXRfc3JjX3JlcXVpcmVtZW50KHNlbGYsIGRpc3QsIGxvY2F0aW9uKToKICAgICAgICByZXBvID0gc2VsZi5nZXRfdXJsKGxvY2F0aW9uKQogICAgICAgIGlmIG5vdCByZXBvLmxvd2VyKCkuc3RhcnRzd2l0aCgnZ2l0OicpOgogICAgICAgICAgICByZXBvID0gJ2dpdCsnICsgcmVwbwogICAgICAgIGVnZ19wcm9qZWN0X25hbWUgPSBkaXN0LmVnZ19uYW1lKCkuc3BsaXQoJy0nLCAxKVswXQogICAgICAgIGlmIG5vdCByZXBvOgogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIGN1cnJlbnRfcmV2ID0gc2VsZi5nZXRfcmV2aXNpb24obG9jYXRpb24pCiAgICAgICAgcmVxID0gJyVzQCVzI2VnZz0lcycgJSAocmVwbywgY3VycmVudF9yZXYsIGVnZ19wcm9qZWN0X25hbWUpCiAgICAgICAgc3ViZGlyZWN0b3J5ID0gc2VsZi5fZ2V0X3N1YmRpcmVjdG9yeShsb2NhdGlvbikKICAgICAgICBpZiBzdWJkaXJlY3Rvcnk6CiAgICAgICAgICAgIHJlcSArPSAnJnN1YmRpcmVjdG9yeT0nICsgc3ViZGlyZWN0b3J5CiAgICAgICAgcmV0dXJuIHJlcQoKICAgIGRlZiBnZXRfdXJsX3JldihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBQcmVmaXhlcyBzdHViIFVSTHMgbGlrZSAndXNlckBob3N0bmFtZTp1c2VyL3JlcG8uZ2l0JyB3aXRoICdzc2g6Ly8nLgogICAgICAgIFRoYXQncyByZXF1aXJlZCBiZWNhdXNlIGFsdGhvdWdoIHRoZXkgdXNlIFNTSCB0aGV5IHNvbWV0aW1lcyBkb2Vzbid0CiAgICAgICAgd29yayB3aXRoIGEgc3NoOi8vIHNjaGVtZSAoZS5nLiBHaXRodWIpLiBCdXQgd2UgbmVlZCBhIHNjaGVtZSBmb3IKICAgICAgICBwYXJzaW5nLiBIZW5jZSB3ZSByZW1vdmUgaXQgYWdhaW4gYWZ0ZXJ3YXJkcyBhbmQgcmV0dXJuIGl0IGFzIGEgc3R1Yi4KICAgICAgICAiIiIKICAgICAgICBpZiAnOi8vJyBub3QgaW4gc2VsZi51cmw6CiAgICAgICAgICAgIGFzc2VydCAnZmlsZTonIG5vdCBpbiBzZWxmLnVybAogICAgICAgICAgICBzZWxmLnVybCA9IHNlbGYudXJsLnJlcGxhY2UoJ2dpdCsnLCAnZ2l0K3NzaDovLycpCiAgICAgICAgICAgIHVybCwgcmV2ID0gc3VwZXIoR2l0LCBzZWxmKS5nZXRfdXJsX3JldigpCiAgICAgICAgICAgIHVybCA9IHVybC5yZXBsYWNlKCdzc2g6Ly8nLCAnJykKICAgICAgICBlbHNlOgogICAgICAgICAgICB1cmwsIHJldiA9IHN1cGVyKEdpdCwgc2VsZikuZ2V0X3VybF9yZXYoKQoKICAgICAgICByZXR1cm4gdXJsLCByZXYKCiAgICBkZWYgdXBkYXRlX3N1Ym1vZHVsZXMoc2VsZiwgbG9jYXRpb24pOgogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhvcy5wYXRoLmpvaW4obG9jYXRpb24sICcuZ2l0bW9kdWxlcycpKToKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgKICAgICAgICAgICAgWydzdWJtb2R1bGUnLCAndXBkYXRlJywgJy0taW5pdCcsICctLXJlY3Vyc2l2ZScsICctcSddLAogICAgICAgICAgICBjd2Q9bG9jYXRpb24sCiAgICAgICAgKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGNvbnRyb2xzX2xvY2F0aW9uKGNscywgbG9jYXRpb24pOgogICAgICAgIGlmIHN1cGVyKEdpdCwgY2xzKS5jb250cm9sc19sb2NhdGlvbihsb2NhdGlvbik6CiAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgdHJ5OgogICAgICAgICAgICByID0gY2xzKCkucnVuX2NvbW1hbmQoWydyZXYtcGFyc2UnXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN3ZD1sb2NhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dfc3Rkb3V0PUZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25fcmV0dXJuY29kZT0naWdub3JlJykKICAgICAgICAgICAgcmV0dXJuIG5vdCByCiAgICAgICAgZXhjZXB0IEJhZENvbW1hbmQ6CiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygiY291bGQgbm90IGRldGVybWluZSBpZiAlcyBpcyB1bmRlciBnaXQgY29udHJvbCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAiYmVjYXVzZSBnaXQgaXMgbm90IGF2YWlsYWJsZSIsIGxvY2F0aW9uKQogICAgICAgICAgICByZXR1cm4gRmFsc2UKCgp2Y3MucmVnaXN0ZXIoR2l0KQpQSwMEFAAAAAAAAAAhAHliah2QDQAAkA0AADEAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC92Y3MvbWVyY3VyaWFsLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBsb2dnaW5nCmltcG9ydCBvcwppbXBvcnQgdGVtcGZpbGUKCmZyb20gcGlwLnV0aWxzIGltcG9ydCBkaXNwbGF5X3BhdGgsIHJtdHJlZQpmcm9tIHBpcC52Y3MgaW1wb3J0IHZjcywgVmVyc2lvbkNvbnRyb2wKZnJvbSBwaXAuZG93bmxvYWQgaW1wb3J0IHBhdGhfdG9fdXJsCmZyb20gcGlwLl92ZW5kb3Iuc2l4Lm1vdmVzIGltcG9ydCBjb25maWdwYXJzZXIKCgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCgpjbGFzcyBNZXJjdXJpYWwoVmVyc2lvbkNvbnRyb2wpOgogICAgbmFtZSA9ICdoZycKICAgIGRpcm5hbWUgPSAnLmhnJwogICAgcmVwb19uYW1lID0gJ2Nsb25lJwogICAgc2NoZW1lcyA9ICgnaGcnLCAnaGcraHR0cCcsICdoZytodHRwcycsICdoZytzc2gnLCAnaGcrc3RhdGljLWh0dHAnKQoKICAgIGRlZiBleHBvcnQoc2VsZiwgbG9jYXRpb24pOgogICAgICAgICIiIkV4cG9ydCB0aGUgSGcgcmVwb3NpdG9yeSBhdCB0aGUgdXJsIHRvIHRoZSBkZXN0aW5hdGlvbiBsb2NhdGlvbiIiIgogICAgICAgIHRlbXBfZGlyID0gdGVtcGZpbGUubWtkdGVtcCgnLWV4cG9ydCcsICdwaXAtJykKICAgICAgICBzZWxmLnVucGFjayh0ZW1wX2RpcikKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoCiAgICAgICAgICAgICAgICBbJ2FyY2hpdmUnLCBsb2NhdGlvbl0sIHNob3dfc3Rkb3V0PUZhbHNlLCBjd2Q9dGVtcF9kaXIpCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgcm10cmVlKHRlbXBfZGlyKQoKICAgIGRlZiBzd2l0Y2goc2VsZiwgZGVzdCwgdXJsLCByZXZfb3B0aW9ucyk6CiAgICAgICAgcmVwb19jb25maWcgPSBvcy5wYXRoLmpvaW4oZGVzdCwgc2VsZi5kaXJuYW1lLCAnaGdyYycpCiAgICAgICAgY29uZmlnID0gY29uZmlncGFyc2VyLlNhZmVDb25maWdQYXJzZXIoKQogICAgICAgIHRyeToKICAgICAgICAgICAgY29uZmlnLnJlYWQocmVwb19jb25maWcpCiAgICAgICAgICAgIGNvbmZpZy5zZXQoJ3BhdGhzJywgJ2RlZmF1bHQnLCB1cmwpCiAgICAgICAgICAgIHdpdGggb3BlbihyZXBvX2NvbmZpZywgJ3cnKSBhcyBjb25maWdfZmlsZToKICAgICAgICAgICAgICAgIGNvbmZpZy53cml0ZShjb25maWdfZmlsZSkKICAgICAgICBleGNlcHQgKE9TRXJyb3IsIGNvbmZpZ3BhcnNlci5Ob1NlY3Rpb25FcnJvcikgYXMgZXhjOgogICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICdDb3VsZCBub3Qgc3dpdGNoIE1lcmN1cmlhbCByZXBvc2l0b3J5IHRvICVzOiAlcycsIHVybCwgZXhjLAogICAgICAgICAgICApCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5ydW5fY29tbWFuZChbJ3VwZGF0ZScsICctcSddICsgcmV2X29wdGlvbnMsIGN3ZD1kZXN0KQoKICAgIGRlZiB1cGRhdGUoc2VsZiwgZGVzdCwgcmV2X29wdGlvbnMpOgogICAgICAgIHNlbGYucnVuX2NvbW1hbmQoWydwdWxsJywgJy1xJ10sIGN3ZD1kZXN0KQogICAgICAgIHNlbGYucnVuX2NvbW1hbmQoWyd1cGRhdGUnLCAnLXEnXSArIHJldl9vcHRpb25zLCBjd2Q9ZGVzdCkKCiAgICBkZWYgb2J0YWluKHNlbGYsIGRlc3QpOgogICAgICAgIHVybCwgcmV2ID0gc2VsZi5nZXRfdXJsX3JldigpCiAgICAgICAgaWYgcmV2OgogICAgICAgICAgICByZXZfb3B0aW9ucyA9IFtyZXZdCiAgICAgICAgICAgIHJldl9kaXNwbGF5ID0gJyAodG8gcmV2aXNpb24gJXMpJyAlIHJldgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldl9vcHRpb25zID0gW10KICAgICAgICAgICAgcmV2X2Rpc3BsYXkgPSAnJwogICAgICAgIGlmIHNlbGYuY2hlY2tfZGVzdGluYXRpb24oZGVzdCwgdXJsLCByZXZfb3B0aW9ucywgcmV2X2Rpc3BsYXkpOgogICAgICAgICAgICBsb2dnZXIuaW5mbygKICAgICAgICAgICAgICAgICdDbG9uaW5nIGhnICVzJXMgdG8gJXMnLAogICAgICAgICAgICAgICAgdXJsLAogICAgICAgICAgICAgICAgcmV2X2Rpc3BsYXksCiAgICAgICAgICAgICAgICBkaXNwbGF5X3BhdGgoZGVzdCksCiAgICAgICAgICAgICkKICAgICAgICAgICAgc2VsZi5ydW5fY29tbWFuZChbJ2Nsb25lJywgJy0tbm91cGRhdGUnLCAnLXEnLCB1cmwsIGRlc3RdKQogICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKFsndXBkYXRlJywgJy1xJ10gKyByZXZfb3B0aW9ucywgY3dkPWRlc3QpCgogICAgZGVmIGdldF91cmwoc2VsZiwgbG9jYXRpb24pOgogICAgICAgIHVybCA9IHNlbGYucnVuX2NvbW1hbmQoCiAgICAgICAgICAgIFsnc2hvd2NvbmZpZycsICdwYXRocy5kZWZhdWx0J10sCiAgICAgICAgICAgIHNob3dfc3Rkb3V0PUZhbHNlLCBjd2Q9bG9jYXRpb24pLnN0cmlwKCkKICAgICAgICBpZiBzZWxmLl9pc19sb2NhbF9yZXBvc2l0b3J5KHVybCk6CiAgICAgICAgICAgIHVybCA9IHBhdGhfdG9fdXJsKHVybCkKICAgICAgICByZXR1cm4gdXJsLnN0cmlwKCkKCiAgICBkZWYgZ2V0X3JldmlzaW9uKHNlbGYsIGxvY2F0aW9uKToKICAgICAgICBjdXJyZW50X3JldmlzaW9uID0gc2VsZi5ydW5fY29tbWFuZCgKICAgICAgICAgICAgWydwYXJlbnRzJywgJy0tdGVtcGxhdGU9e3Jldn0nXSwKICAgICAgICAgICAgc2hvd19zdGRvdXQ9RmFsc2UsIGN3ZD1sb2NhdGlvbikuc3RyaXAoKQogICAgICAgIHJldHVybiBjdXJyZW50X3JldmlzaW9uCgogICAgZGVmIGdldF9yZXZpc2lvbl9oYXNoKHNlbGYsIGxvY2F0aW9uKToKICAgICAgICBjdXJyZW50X3Jldl9oYXNoID0gc2VsZi5ydW5fY29tbWFuZCgKICAgICAgICAgICAgWydwYXJlbnRzJywgJy0tdGVtcGxhdGU9e25vZGV9J10sCiAgICAgICAgICAgIHNob3dfc3Rkb3V0PUZhbHNlLCBjd2Q9bG9jYXRpb24pLnN0cmlwKCkKICAgICAgICByZXR1cm4gY3VycmVudF9yZXZfaGFzaAoKICAgIGRlZiBnZXRfc3JjX3JlcXVpcmVtZW50KHNlbGYsIGRpc3QsIGxvY2F0aW9uKToKICAgICAgICByZXBvID0gc2VsZi5nZXRfdXJsKGxvY2F0aW9uKQogICAgICAgIGlmIG5vdCByZXBvLmxvd2VyKCkuc3RhcnRzd2l0aCgnaGc6Jyk6CiAgICAgICAgICAgIHJlcG8gPSAnaGcrJyArIHJlcG8KICAgICAgICBlZ2dfcHJvamVjdF9uYW1lID0gZGlzdC5lZ2dfbmFtZSgpLnNwbGl0KCctJywgMSlbMF0KICAgICAgICBpZiBub3QgcmVwbzoKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICBjdXJyZW50X3Jldl9oYXNoID0gc2VsZi5nZXRfcmV2aXNpb25faGFzaChsb2NhdGlvbikKICAgICAgICByZXR1cm4gJyVzQCVzI2VnZz0lcycgJSAocmVwbywgY3VycmVudF9yZXZfaGFzaCwgZWdnX3Byb2plY3RfbmFtZSkKCiAgICBkZWYgY2hlY2tfdmVyc2lvbihzZWxmLCBkZXN0LCByZXZfb3B0aW9ucyk6CiAgICAgICAgIiIiQWx3YXlzIGFzc3VtZSB0aGUgdmVyc2lvbnMgZG9uJ3QgbWF0Y2giIiIKICAgICAgICByZXR1cm4gRmFsc2UKCnZjcy5yZWdpc3RlcihNZXJjdXJpYWwpClBLAwQUAAAAAAAAACEAbjSVQYYkAACGJAAAMgAAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL3Zjcy9zdWJ2ZXJzaW9uLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBsb2dnaW5nCmltcG9ydCBvcwppbXBvcnQgcmUKCmZyb20gcGlwLl92ZW5kb3Iuc2l4Lm1vdmVzLnVybGxpYiBpbXBvcnQgcGFyc2UgYXMgdXJsbGliX3BhcnNlCgpmcm9tIHBpcC5pbmRleCBpbXBvcnQgTGluawpmcm9tIHBpcC51dGlscyBpbXBvcnQgcm10cmVlLCBkaXNwbGF5X3BhdGgKZnJvbSBwaXAudXRpbHMubG9nZ2luZyBpbXBvcnQgaW5kZW50X2xvZwpmcm9tIHBpcC52Y3MgaW1wb3J0IHZjcywgVmVyc2lvbkNvbnRyb2wKCl9zdm5feG1sX3VybF9yZSA9IHJlLmNvbXBpbGUoJ3VybD0iKFteIl0rKSInKQpfc3ZuX3Jldl9yZSA9IHJlLmNvbXBpbGUoJ2NvbW1pdHRlZC1yZXY9IihcZCspIicpCl9zdm5fdXJsX3JlID0gcmUuY29tcGlsZShyJ1VSTDogKC4rKScpCl9zdm5fcmV2aXNpb25fcmUgPSByZS5jb21waWxlKHInUmV2aXNpb246ICguKyknKQpfc3ZuX2luZm9feG1sX3Jldl9yZSA9IHJlLmNvbXBpbGUocidccypyZXZpc2lvbj0iKFxkKykiJykKX3N2bl9pbmZvX3htbF91cmxfcmUgPSByZS5jb21waWxlKHInPHVybD4oLiopPC91cmw+JykKCgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCgpjbGFzcyBTdWJ2ZXJzaW9uKFZlcnNpb25Db250cm9sKToKICAgIG5hbWUgPSAnc3ZuJwogICAgZGlybmFtZSA9ICcuc3ZuJwogICAgcmVwb19uYW1lID0gJ2NoZWNrb3V0JwogICAgc2NoZW1lcyA9ICgnc3ZuJywgJ3N2bitzc2gnLCAnc3ZuK2h0dHAnLCAnc3ZuK2h0dHBzJywgJ3N2bitzdm4nKQoKICAgIGRlZiBnZXRfaW5mbyhzZWxmLCBsb2NhdGlvbik6CiAgICAgICAgIiIiUmV0dXJucyAodXJsLCByZXZpc2lvbiksIHdoZXJlIGJvdGggYXJlIHN0cmluZ3MiIiIKICAgICAgICBhc3NlcnQgbm90IGxvY2F0aW9uLnJzdHJpcCgnLycpLmVuZHN3aXRoKHNlbGYuZGlybmFtZSksIFwKICAgICAgICAgICAgJ0JhZCBkaXJlY3Rvcnk6ICVzJyAlIGxvY2F0aW9uCiAgICAgICAgb3V0cHV0ID0gc2VsZi5ydW5fY29tbWFuZCgKICAgICAgICAgICAgWydpbmZvJywgbG9jYXRpb25dLAogICAgICAgICAgICBzaG93X3N0ZG91dD1GYWxzZSwKICAgICAgICAgICAgZXh0cmFfZW52aXJvbj17J0xBTkcnOiAnQyd9LAogICAgICAgICkKICAgICAgICBtYXRjaCA9IF9zdm5fdXJsX3JlLnNlYXJjaChvdXRwdXQpCiAgICAgICAgaWYgbm90IG1hdGNoOgogICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICdDYW5ub3QgZGV0ZXJtaW5lIFVSTCBvZiBzdm4gY2hlY2tvdXQgJXMnLAogICAgICAgICAgICAgICAgZGlzcGxheV9wYXRoKGxvY2F0aW9uKSwKICAgICAgICAgICAgKQogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ091dHB1dCB0aGF0IGNhbm5vdCBiZSBwYXJzZWQ6IFxuJXMnLCBvdXRwdXQpCiAgICAgICAgICAgIHJldHVybiBOb25lLCBOb25lCiAgICAgICAgdXJsID0gbWF0Y2guZ3JvdXAoMSkuc3RyaXAoKQogICAgICAgIG1hdGNoID0gX3N2bl9yZXZpc2lvbl9yZS5zZWFyY2gob3V0cHV0KQogICAgICAgIGlmIG5vdCBtYXRjaDoKICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICAgICAnQ2Fubm90IGRldGVybWluZSByZXZpc2lvbiBvZiBzdm4gY2hlY2tvdXQgJXMnLAogICAgICAgICAgICAgICAgZGlzcGxheV9wYXRoKGxvY2F0aW9uKSwKICAgICAgICAgICAgKQogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ091dHB1dCB0aGF0IGNhbm5vdCBiZSBwYXJzZWQ6IFxuJXMnLCBvdXRwdXQpCiAgICAgICAgICAgIHJldHVybiB1cmwsIE5vbmUKICAgICAgICByZXR1cm4gdXJsLCBtYXRjaC5ncm91cCgxKQoKICAgIGRlZiBleHBvcnQoc2VsZiwgbG9jYXRpb24pOgogICAgICAgICIiIkV4cG9ydCB0aGUgc3ZuIHJlcG9zaXRvcnkgYXQgdGhlIHVybCB0byB0aGUgZGVzdGluYXRpb24gbG9jYXRpb24iIiIKICAgICAgICB1cmwsIHJldiA9IHNlbGYuZ2V0X3VybF9yZXYoKQogICAgICAgIHJldl9vcHRpb25zID0gZ2V0X3Jldl9vcHRpb25zKHVybCwgcmV2KQogICAgICAgIHVybCA9IHNlbGYucmVtb3ZlX2F1dGhfZnJvbV91cmwodXJsKQogICAgICAgIGxvZ2dlci5pbmZvKCdFeHBvcnRpbmcgc3ZuIHJlcG9zaXRvcnkgJXMgdG8gJXMnLCB1cmwsIGxvY2F0aW9uKQogICAgICAgIHdpdGggaW5kZW50X2xvZygpOgogICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhsb2NhdGlvbik6CiAgICAgICAgICAgICAgICAjIFN1YnZlcnNpb24gZG9lc24ndCBsaWtlIHRvIGNoZWNrIG91dCBvdmVyIGFuIGV4aXN0aW5nCiAgICAgICAgICAgICAgICAjIGRpcmVjdG9yeSAtLWZvcmNlIGZpeGVzIHRoaXMsIGJ1dCB3YXMgb25seSBhZGRlZCBpbiBzdm4gMS41CiAgICAgICAgICAgICAgICBybXRyZWUobG9jYXRpb24pCiAgICAgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoCiAgICAgICAgICAgICAgICBbJ2V4cG9ydCddICsgcmV2X29wdGlvbnMgKyBbdXJsLCBsb2NhdGlvbl0sCiAgICAgICAgICAgICAgICBzaG93X3N0ZG91dD1GYWxzZSkKCiAgICBkZWYgc3dpdGNoKHNlbGYsIGRlc3QsIHVybCwgcmV2X29wdGlvbnMpOgogICAgICAgIHNlbGYucnVuX2NvbW1hbmQoWydzd2l0Y2gnXSArIHJldl9vcHRpb25zICsgW3VybCwgZGVzdF0pCgogICAgZGVmIHVwZGF0ZShzZWxmLCBkZXN0LCByZXZfb3B0aW9ucyk6CiAgICAgICAgc2VsZi5ydW5fY29tbWFuZChbJ3VwZGF0ZSddICsgcmV2X29wdGlvbnMgKyBbZGVzdF0pCgogICAgZGVmIG9idGFpbihzZWxmLCBkZXN0KToKICAgICAgICB1cmwsIHJldiA9IHNlbGYuZ2V0X3VybF9yZXYoKQogICAgICAgIHJldl9vcHRpb25zID0gZ2V0X3Jldl9vcHRpb25zKHVybCwgcmV2KQogICAgICAgIHVybCA9IHNlbGYucmVtb3ZlX2F1dGhfZnJvbV91cmwodXJsKQogICAgICAgIGlmIHJldjoKICAgICAgICAgICAgcmV2X2Rpc3BsYXkgPSAnICh0byByZXZpc2lvbiAlcyknICUgcmV2CiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV2X2Rpc3BsYXkgPSAnJwogICAgICAgIGlmIHNlbGYuY2hlY2tfZGVzdGluYXRpb24oZGVzdCwgdXJsLCByZXZfb3B0aW9ucywgcmV2X2Rpc3BsYXkpOgogICAgICAgICAgICBsb2dnZXIuaW5mbygKICAgICAgICAgICAgICAgICdDaGVja2luZyBvdXQgJXMlcyB0byAlcycsCiAgICAgICAgICAgICAgICB1cmwsCiAgICAgICAgICAgICAgICByZXZfZGlzcGxheSwKICAgICAgICAgICAgICAgIGRpc3BsYXlfcGF0aChkZXN0KSwKICAgICAgICAgICAgKQogICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKFsnY2hlY2tvdXQnLCAnLXEnXSArIHJldl9vcHRpb25zICsgW3VybCwgZGVzdF0pCgogICAgZGVmIGdldF9sb2NhdGlvbihzZWxmLCBkaXN0LCBkZXBlbmRlbmN5X2xpbmtzKToKICAgICAgICBmb3IgdXJsIGluIGRlcGVuZGVuY3lfbGlua3M6CiAgICAgICAgICAgIGVnZ19mcmFnbWVudCA9IExpbmsodXJsKS5lZ2dfZnJhZ21lbnQKICAgICAgICAgICAgaWYgbm90IGVnZ19mcmFnbWVudDoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlmICctJyBpbiBlZ2dfZnJhZ21lbnQ6CiAgICAgICAgICAgICAgICAjIEZJWE1FOiB3aWxsIHRoaXMgd29yayB3aGVuIGEgcGFja2FnZSBoYXMgLSBpbiB0aGUgbmFtZT8KICAgICAgICAgICAgICAgIGtleSA9ICctJy5qb2luKGVnZ19mcmFnbWVudC5zcGxpdCgnLScpWzotMV0pLmxvd2VyKCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGtleSA9IGVnZ19mcmFnbWVudAogICAgICAgICAgICBpZiBrZXkgPT0gZGlzdC5rZXk6CiAgICAgICAgICAgICAgICByZXR1cm4gdXJsLnNwbGl0KCcjJywgMSlbMF0KICAgICAgICByZXR1cm4gTm9uZQoKICAgIGRlZiBnZXRfcmV2aXNpb24oc2VsZiwgbG9jYXRpb24pOgogICAgICAgICIiIgogICAgICAgIFJldHVybiB0aGUgbWF4aW11bSByZXZpc2lvbiBmb3IgYWxsIGZpbGVzIHVuZGVyIGEgZ2l2ZW4gbG9jYXRpb24KICAgICAgICAiIiIKICAgICAgICAjIE5vdGU6IHRha2VuIGZyb20gc2V0dXB0b29scy5jb21tYW5kLmVnZ19pbmZvCiAgICAgICAgcmV2aXNpb24gPSAwCgogICAgICAgIGZvciBiYXNlLCBkaXJzLCBmaWxlcyBpbiBvcy53YWxrKGxvY2F0aW9uKToKICAgICAgICAgICAgaWYgc2VsZi5kaXJuYW1lIG5vdCBpbiBkaXJzOgogICAgICAgICAgICAgICAgZGlyc1s6XSA9IFtdCiAgICAgICAgICAgICAgICBjb250aW51ZSAgICAjIG5vIHNlbnNlIHdhbGtpbmcgdW5jb250cm9sbGVkIHN1YmRpcnMKICAgICAgICAgICAgZGlycy5yZW1vdmUoc2VsZi5kaXJuYW1lKQogICAgICAgICAgICBlbnRyaWVzX2ZuID0gb3MucGF0aC5qb2luKGJhc2UsIHNlbGYuZGlybmFtZSwgJ2VudHJpZXMnKQogICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoZW50cmllc19mbik6CiAgICAgICAgICAgICAgICAjIEZJWE1FOiBzaG91bGQgd2Ugd2Fybj8KICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICBkaXJ1cmwsIGxvY2FscmV2ID0gc2VsZi5fZ2V0X3N2bl91cmxfcmV2KGJhc2UpCgogICAgICAgICAgICBpZiBiYXNlID09IGxvY2F0aW9uOgogICAgICAgICAgICAgICAgYmFzZV91cmwgPSBkaXJ1cmwgKyAnLycgICAjIHNhdmUgdGhlIHJvb3QgdXJsCiAgICAgICAgICAgIGVsaWYgbm90IGRpcnVybCBvciBub3QgZGlydXJsLnN0YXJ0c3dpdGgoYmFzZV91cmwpOgogICAgICAgICAgICAgICAgZGlyc1s6XSA9IFtdCiAgICAgICAgICAgICAgICBjb250aW51ZSAgICAjIG5vdCBwYXJ0IG9mIHRoZSBzYW1lIHN2biB0cmVlLCBza2lwIGl0CiAgICAgICAgICAgIHJldmlzaW9uID0gbWF4KHJldmlzaW9uLCBsb2NhbHJldikKICAgICAgICByZXR1cm4gcmV2aXNpb24KCiAgICBkZWYgZ2V0X3VybF9yZXYoc2VsZik6CiAgICAgICAgIyBob3RmaXggdGhlIFVSTCBzY2hlbWUgYWZ0ZXIgcmVtb3Zpbmcgc3ZuKyBmcm9tIHN2bitzc2g6Ly8gcmVhZGQgaXQKICAgICAgICB1cmwsIHJldiA9IHN1cGVyKFN1YnZlcnNpb24sIHNlbGYpLmdldF91cmxfcmV2KCkKICAgICAgICBpZiB1cmwuc3RhcnRzd2l0aCgnc3NoOi8vJyk6CiAgICAgICAgICAgIHVybCA9ICdzdm4rJyArIHVybAogICAgICAgIHJldHVybiB1cmwsIHJldgoKICAgIGRlZiBnZXRfdXJsKHNlbGYsIGxvY2F0aW9uKToKICAgICAgICAjIEluIGNhc2VzIHdoZXJlIHRoZSBzb3VyY2UgaXMgaW4gYSBzdWJkaXJlY3RvcnksIG5vdCBhbG9uZ3NpZGUKICAgICAgICAjIHNldHVwLnB5IHdlIGhhdmUgdG8gbG9vayB1cCBpbiB0aGUgbG9jYXRpb24gdW50aWwgd2UgZmluZCBhIHJlYWwKICAgICAgICAjIHNldHVwLnB5CiAgICAgICAgb3JpZ19sb2NhdGlvbiA9IGxvY2F0aW9uCiAgICAgICAgd2hpbGUgbm90IG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihsb2NhdGlvbiwgJ3NldHVwLnB5JykpOgogICAgICAgICAgICBsYXN0X2xvY2F0aW9uID0gbG9jYXRpb24KICAgICAgICAgICAgbG9jYXRpb24gPSBvcy5wYXRoLmRpcm5hbWUobG9jYXRpb24pCiAgICAgICAgICAgIGlmIGxvY2F0aW9uID09IGxhc3RfbG9jYXRpb246CiAgICAgICAgICAgICAgICAjIFdlJ3ZlIHRyYXZlcnNlZCB1cCB0byB0aGUgcm9vdCBvZiB0aGUgZmlsZXN5c3RlbSB3aXRob3V0CiAgICAgICAgICAgICAgICAjIGZpbmRpbmcgc2V0dXAucHkKICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgZmluZCBzZXR1cC5weSBmb3IgZGlyZWN0b3J5ICVzICh0cmllZCBhbGwgIgogICAgICAgICAgICAgICAgICAgICJwYXJlbnQgZGlyZWN0b3JpZXMpIiwKICAgICAgICAgICAgICAgICAgICBvcmlnX2xvY2F0aW9uLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgcmV0dXJuIHNlbGYuX2dldF9zdm5fdXJsX3Jldihsb2NhdGlvbilbMF0KCiAgICBkZWYgX2dldF9zdm5fdXJsX3JldihzZWxmLCBsb2NhdGlvbik6CiAgICAgICAgZnJvbSBwaXAuZXhjZXB0aW9ucyBpbXBvcnQgSW5zdGFsbGF0aW9uRXJyb3IKCiAgICAgICAgZW50cmllc19wYXRoID0gb3MucGF0aC5qb2luKGxvY2F0aW9uLCBzZWxmLmRpcm5hbWUsICdlbnRyaWVzJykKICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhlbnRyaWVzX3BhdGgpOgogICAgICAgICAgICB3aXRoIG9wZW4oZW50cmllc19wYXRoKSBhcyBmOgogICAgICAgICAgICAgICAgZGF0YSA9IGYucmVhZCgpCiAgICAgICAgZWxzZTogICMgc3VidmVyc2lvbiA+PSAxLjcgZG9lcyBub3QgaGF2ZSB0aGUgJ2VudHJpZXMnIGZpbGUKICAgICAgICAgICAgZGF0YSA9ICcnCgogICAgICAgIGlmIChkYXRhLnN0YXJ0c3dpdGgoJzgnKSBvcgogICAgICAgICAgICAgICAgZGF0YS5zdGFydHN3aXRoKCc5Jykgb3IKICAgICAgICAgICAgICAgIGRhdGEuc3RhcnRzd2l0aCgnMTAnKSk6CiAgICAgICAgICAgIGRhdGEgPSBsaXN0KG1hcChzdHIuc3BsaXRsaW5lcywgZGF0YS5zcGxpdCgnXG5ceDBjXG4nKSkpCiAgICAgICAgICAgIGRlbCBkYXRhWzBdWzBdICAjIGdldCByaWQgb2YgdGhlICc4JwogICAgICAgICAgICB1cmwgPSBkYXRhWzBdWzNdCiAgICAgICAgICAgIHJldnMgPSBbaW50KGRbOV0pIGZvciBkIGluIGRhdGEgaWYgbGVuKGQpID4gOSBhbmQgZFs5XV0gKyBbMF0KICAgICAgICBlbGlmIGRhdGEuc3RhcnRzd2l0aCgnPD94bWwnKToKICAgICAgICAgICAgbWF0Y2ggPSBfc3ZuX3htbF91cmxfcmUuc2VhcmNoKGRhdGEpCiAgICAgICAgICAgIGlmIG5vdCBtYXRjaDoKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ0JhZGx5IGZvcm1hdHRlZCBkYXRhOiAlcicgJSBkYXRhKQogICAgICAgICAgICB1cmwgPSBtYXRjaC5ncm91cCgxKSAgICAjIGdldCByZXBvc2l0b3J5IFVSTAogICAgICAgICAgICByZXZzID0gW2ludChtLmdyb3VwKDEpKSBmb3IgbSBpbiBfc3ZuX3Jldl9yZS5maW5kaXRlcihkYXRhKV0gKyBbMF0KICAgICAgICBlbHNlOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAjIHN1YnZlcnNpb24gPj0gMS43CiAgICAgICAgICAgICAgICB4bWwgPSBzZWxmLnJ1bl9jb21tYW5kKAogICAgICAgICAgICAgICAgICAgIFsnaW5mbycsICctLXhtbCcsIGxvY2F0aW9uXSwKICAgICAgICAgICAgICAgICAgICBzaG93X3N0ZG91dD1GYWxzZSwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHVybCA9IF9zdm5faW5mb194bWxfdXJsX3JlLnNlYXJjaCh4bWwpLmdyb3VwKDEpCiAgICAgICAgICAgICAgICByZXZzID0gWwogICAgICAgICAgICAgICAgICAgIGludChtLmdyb3VwKDEpKSBmb3IgbSBpbiBfc3ZuX2luZm9feG1sX3Jldl9yZS5maW5kaXRlcih4bWwpCiAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgIGV4Y2VwdCBJbnN0YWxsYXRpb25FcnJvcjoKICAgICAgICAgICAgICAgIHVybCwgcmV2cyA9IE5vbmUsIFtdCgogICAgICAgIGlmIHJldnM6CiAgICAgICAgICAgIHJldiA9IG1heChyZXZzKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldiA9IDAKCiAgICAgICAgcmV0dXJuIHVybCwgcmV2CgogICAgZGVmIGdldF9zcmNfcmVxdWlyZW1lbnQoc2VsZiwgZGlzdCwgbG9jYXRpb24pOgogICAgICAgIHJlcG8gPSBzZWxmLmdldF91cmwobG9jYXRpb24pCiAgICAgICAgaWYgcmVwbyBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgICMgRklYTUU6IHdoeSBub3QgcHJvamVjdCBuYW1lPwogICAgICAgIGVnZ19wcm9qZWN0X25hbWUgPSBkaXN0LmVnZ19uYW1lKCkuc3BsaXQoJy0nLCAxKVswXQogICAgICAgIHJldiA9IHNlbGYuZ2V0X3JldmlzaW9uKGxvY2F0aW9uKQogICAgICAgIHJldHVybiAnc3ZuKyVzQCVzI2VnZz0lcycgJSAocmVwbywgcmV2LCBlZ2dfcHJvamVjdF9uYW1lKQoKICAgIGRlZiBjaGVja192ZXJzaW9uKHNlbGYsIGRlc3QsIHJldl9vcHRpb25zKToKICAgICAgICAiIiJBbHdheXMgYXNzdW1lIHRoZSB2ZXJzaW9ucyBkb24ndCBtYXRjaCIiIgogICAgICAgIHJldHVybiBGYWxzZQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiByZW1vdmVfYXV0aF9mcm9tX3VybCh1cmwpOgogICAgICAgICMgUmV0dXJuIGEgY29weSBvZiB1cmwgd2l0aCAndXNlcm5hbWU6cGFzc3dvcmRAJyByZW1vdmVkLgogICAgICAgICMgdXNlcm5hbWUvcGFzcyBwYXJhbXMgYXJlIHBhc3NlZCB0byBzdWJ2ZXJzaW9uIHRocm91Z2ggZmxhZ3MKICAgICAgICAjIGFuZCBhcmUgbm90IHJlY29nbml6ZWQgaW4gdGhlIHVybC4KCiAgICAgICAgIyBwYXJzZWQgdXJsCiAgICAgICAgcHVybCA9IHVybGxpYl9wYXJzZS51cmxzcGxpdCh1cmwpCiAgICAgICAgc3RyaXBwZWRfbmV0bG9jID0gXAogICAgICAgICAgICBwdXJsLm5ldGxvYy5zcGxpdCgnQCcpWy0xXQoKICAgICAgICAjIHN0cmlwcGVkIHVybAogICAgICAgIHVybF9waWVjZXMgPSAoCiAgICAgICAgICAgIHB1cmwuc2NoZW1lLCBzdHJpcHBlZF9uZXRsb2MsIHB1cmwucGF0aCwgcHVybC5xdWVyeSwgcHVybC5mcmFnbWVudAogICAgICAgICkKICAgICAgICBzdXJsID0gdXJsbGliX3BhcnNlLnVybHVuc3BsaXQodXJsX3BpZWNlcykKICAgICAgICByZXR1cm4gc3VybAoKCmRlZiBnZXRfcmV2X29wdGlvbnModXJsLCByZXYpOgogICAgaWYgcmV2OgogICAgICAgIHJldl9vcHRpb25zID0gWyctcicsIHJldl0KICAgIGVsc2U6CiAgICAgICAgcmV2X29wdGlvbnMgPSBbXQoKICAgIHIgPSB1cmxsaWJfcGFyc2UudXJsc3BsaXQodXJsKQogICAgaWYgaGFzYXR0cihyLCAndXNlcm5hbWUnKToKICAgICAgICAjID49IFB5dGhvbi0yLjUKICAgICAgICB1c2VybmFtZSwgcGFzc3dvcmQgPSByLnVzZXJuYW1lLCByLnBhc3N3b3JkCiAgICBlbHNlOgogICAgICAgIG5ldGxvYyA9IHJbMV0KICAgICAgICBpZiAnQCcgaW4gbmV0bG9jOgogICAgICAgICAgICBhdXRoID0gbmV0bG9jLnNwbGl0KCdAJylbMF0KICAgICAgICAgICAgaWYgJzonIGluIGF1dGg6CiAgICAgICAgICAgICAgICB1c2VybmFtZSwgcGFzc3dvcmQgPSBhdXRoLnNwbGl0KCc6JywgMSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHVzZXJuYW1lLCBwYXNzd29yZCA9IGF1dGgsIE5vbmUKICAgICAgICBlbHNlOgogICAgICAgICAgICB1c2VybmFtZSwgcGFzc3dvcmQgPSBOb25lLCBOb25lCgogICAgaWYgdXNlcm5hbWU6CiAgICAgICAgcmV2X29wdGlvbnMgKz0gWyctLXVzZXJuYW1lJywgdXNlcm5hbWVdCiAgICBpZiBwYXNzd29yZDoKICAgICAgICByZXZfb3B0aW9ucyArPSBbJy0tcGFzc3dvcmQnLCBwYXNzd29yZF0KICAgIHJldHVybiByZXZfb3B0aW9ucwoKCnZjcy5yZWdpc3RlcihTdWJ2ZXJzaW9uKQpQSwMEFAAAAAAAAAAhAH2ZIDsKfQAACn0AACkAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC93aGVlbC5weSIiIgpTdXBwb3J0IGZvciBpbnN0YWxsaW5nIGFuZCBidWlsZGluZyB0aGUgIndoZWVsIiBiaW5hcnkgcGFja2FnZSBmb3JtYXQuCiIiIgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IGNvbXBpbGVhbGwKaW1wb3J0IGNzdgppbXBvcnQgZXJybm8KaW1wb3J0IGZ1bmN0b29scwppbXBvcnQgaGFzaGxpYgppbXBvcnQgbG9nZ2luZwppbXBvcnQgb3MKaW1wb3J0IG9zLnBhdGgKaW1wb3J0IHJlCmltcG9ydCBzaHV0aWwKaW1wb3J0IHN0YXQKaW1wb3J0IHN5cwppbXBvcnQgdGVtcGZpbGUKaW1wb3J0IHdhcm5pbmdzCgpmcm9tIGJhc2U2NCBpbXBvcnQgdXJsc2FmZV9iNjRlbmNvZGUKZnJvbSBlbWFpbC5wYXJzZXIgaW1wb3J0IFBhcnNlcgoKZnJvbSBwaXAuX3ZlbmRvci5zaXggaW1wb3J0IFN0cmluZ0lPCgppbXBvcnQgcGlwCmZyb20gcGlwLmNvbXBhdCBpbXBvcnQgZXhwYW5kdXNlcgpmcm9tIHBpcC5kb3dubG9hZCBpbXBvcnQgcGF0aF90b191cmwsIHVucGFja191cmwKZnJvbSBwaXAuZXhjZXB0aW9ucyBpbXBvcnQgKAogICAgSW5zdGFsbGF0aW9uRXJyb3IsIEludmFsaWRXaGVlbEZpbGVuYW1lLCBVbnN1cHBvcnRlZFdoZWVsKQpmcm9tIHBpcC5sb2NhdGlvbnMgaW1wb3J0IGRpc3R1dGlsc19zY2hlbWUsIFBJUF9ERUxFVEVfTUFSS0VSX0ZJTEVOQU1FCmZyb20gcGlwIGltcG9ydCBwZXA0MjV0YWdzCmZyb20gcGlwLnV0aWxzIGltcG9ydCAoCiAgICBjYWxsX3N1YnByb2Nlc3MsIGVuc3VyZV9kaXIsIGNhcHR1cmVkX3N0ZG91dCwgcm10cmVlLCByZWFkX2NodW5rcywKKQpmcm9tIHBpcC51dGlscy51aSBpbXBvcnQgb3Blbl9zcGlubmVyCmZyb20gcGlwLnV0aWxzLmxvZ2dpbmcgaW1wb3J0IGluZGVudF9sb2cKZnJvbSBwaXAudXRpbHMuc2V0dXB0b29sc19idWlsZCBpbXBvcnQgU0VUVVBUT09MU19TSElNCmZyb20gcGlwLl92ZW5kb3IuZGlzdGxpYi5zY3JpcHRzIGltcG9ydCBTY3JpcHRNYWtlcgpmcm9tIHBpcC5fdmVuZG9yIGltcG9ydCBwa2dfcmVzb3VyY2VzCmZyb20gcGlwLl92ZW5kb3IucGFja2FnaW5nLnV0aWxzIGltcG9ydCBjYW5vbmljYWxpemVfbmFtZQpmcm9tIHBpcC5fdmVuZG9yLnNpeC5tb3ZlcyBpbXBvcnQgY29uZmlncGFyc2VyCgoKd2hlZWxfZXh0ID0gJy53aGwnCgpWRVJTSU9OX0NPTVBBVElCTEUgPSAoMSwgMCkKCgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCgpjbGFzcyBXaGVlbENhY2hlKG9iamVjdCk6CiAgICAiIiJBIGNhY2hlIG9mIHdoZWVscyBmb3IgZnV0dXJlIGluc3RhbGxzLiIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjYWNoZV9kaXIsIGZvcm1hdF9jb250cm9sKToKICAgICAgICAiIiJDcmVhdGUgYSB3aGVlbCBjYWNoZS4KCiAgICAgICAgOnBhcmFtIGNhY2hlX2RpcjogVGhlIHJvb3Qgb2YgdGhlIGNhY2hlLgogICAgICAgIDpwYXJhbSBmb3JtYXRfY29udHJvbDogQSBwaXAuaW5kZXguRm9ybWF0Q29udHJvbCBvYmplY3QgdG8gbGltaXQKICAgICAgICAgICAgYmluYXJpZXMgYmVpbmcgcmVhZCBmcm9tIHRoZSBjYWNoZS4KICAgICAgICAiIiIKICAgICAgICBzZWxmLl9jYWNoZV9kaXIgPSBleHBhbmR1c2VyKGNhY2hlX2RpcikgaWYgY2FjaGVfZGlyIGVsc2UgTm9uZQogICAgICAgIHNlbGYuX2Zvcm1hdF9jb250cm9sID0gZm9ybWF0X2NvbnRyb2wKCiAgICBkZWYgY2FjaGVkX3doZWVsKHNlbGYsIGxpbmssIHBhY2thZ2VfbmFtZSk6CiAgICAgICAgcmV0dXJuIGNhY2hlZF93aGVlbCgKICAgICAgICAgICAgc2VsZi5fY2FjaGVfZGlyLCBsaW5rLCBzZWxmLl9mb3JtYXRfY29udHJvbCwgcGFja2FnZV9uYW1lKQoKCmRlZiBfY2FjaGVfZm9yX2xpbmsoY2FjaGVfZGlyLCBsaW5rKToKICAgICIiIgogICAgUmV0dXJuIGEgZGlyZWN0b3J5IHRvIHN0b3JlIGNhY2hlZCB3aGVlbHMgaW4gZm9yIGxpbmsuCgogICAgQmVjYXVzZSB0aGVyZSBhcmUgTSB3aGVlbHMgZm9yIGFueSBvbmUgc2Rpc3QsIHdlIHByb3ZpZGUgYSBkaXJlY3RvcnkKICAgIHRvIGNhY2hlIHRoZW0gaW4sIGFuZCB0aGVuIGNvbnN1bHQgdGhhdCBkaXJlY3Rvcnkgd2hlbiBsb29raW5nIHVwCiAgICBjYWNoZSBoaXRzLgoKICAgIFdlIG9ubHkgaW5zZXJ0IHRoaW5ncyBpbnRvIHRoZSBjYWNoZSBpZiB0aGV5IGhhdmUgcGxhdXNpYmxlIHZlcnNpb24KICAgIG51bWJlcnMsIHNvIHRoYXQgd2UgZG9uJ3QgY29udGFtaW5hdGUgdGhlIGNhY2hlIHdpdGggdGhpbmdzIHRoYXQgd2VyZSBub3QKICAgIHVuaXF1ZS4gRS5nLiAuL3BhY2thZ2UgbWlnaHQgaGF2ZSBkb3plbnMgb2YgaW5zdGFsbHMgZG9uZSBmb3IgaXQgYW5kIGJ1aWxkCiAgICBhIHZlcnNpb24gb2YgMC4wLi4uYW5kIGlmIHdlIGJ1aWx0IGFuZCBjYWNoZWQgYSB3aGVlbCwgd2UnZCBlbmQgdXAgdXNpbmcKICAgIHRoZSBzYW1lIHdoZWVsIGV2ZW4gaWYgdGhlIHNvdXJjZSBoYXMgYmVlbiBlZGl0ZWQuCgogICAgOnBhcmFtIGNhY2hlX2RpcjogVGhlIGNhY2hlX2RpciBiZWluZyB1c2VkIGJ5IHBpcC4KICAgIDpwYXJhbSBsaW5rOiBUaGUgbGluayBvZiB0aGUgc2Rpc3QgZm9yIHdoaWNoIHRoaXMgd2lsbCBjYWNoZSB3aGVlbHMuCiAgICAiIiIKCiAgICAjIFdlIHdhbnQgdG8gZ2VuZXJhdGUgYW4gdXJsIHRvIHVzZSBhcyBvdXIgY2FjaGUga2V5LCB3ZSBkb24ndCB3YW50IHRvIGp1c3QKICAgICMgcmUtdXNlIHRoZSBVUkwgYmVjYXVzZSBpdCBtaWdodCBoYXZlIG90aGVyIGl0ZW1zIGluIHRoZSBmcmFnbWVudCBhbmQgd2UKICAgICMgZG9uJ3QgY2FyZSBhYm91dCB0aG9zZS4KICAgIGtleV9wYXJ0cyA9IFtsaW5rLnVybF93aXRob3V0X2ZyYWdtZW50XQogICAgaWYgbGluay5oYXNoX25hbWUgaXMgbm90IE5vbmUgYW5kIGxpbmsuaGFzaCBpcyBub3QgTm9uZToKICAgICAgICBrZXlfcGFydHMuYXBwZW5kKCI9Ii5qb2luKFtsaW5rLmhhc2hfbmFtZSwgbGluay5oYXNoXSkpCiAgICBrZXlfdXJsID0gIiMiLmpvaW4oa2V5X3BhcnRzKQoKICAgICMgRW5jb2RlIG91ciBrZXkgdXJsIHdpdGggc2hhMjI0LCB3ZSdsbCB1c2UgdGhpcyBiZWNhdXNlIGl0IGhhcyBzaW1pbGFyCiAgICAjIHNlY3VyaXR5IHByb3BlcnRpZXMgdG8gc2hhMjU2LCBidXQgd2l0aCBhIHNob3J0ZXIgdG90YWwgb3V0cHV0IChhbmQgdGh1cwogICAgIyBsZXNzIHNlY3VyZSkuIEhvd2V2ZXIgdGhlIGRpZmZlcmVuY2VzIGRvbid0IG1ha2UgYSBsb3Qgb2YgZGlmZmVyZW5jZSBmb3IKICAgICMgb3VyIHVzZSBjYXNlIGhlcmUuCiAgICBoYXNoZWQgPSBoYXNobGliLnNoYTIyNChrZXlfdXJsLmVuY29kZSgpKS5oZXhkaWdlc3QoKQoKICAgICMgV2Ugd2FudCB0byBuZXN0IHRoZSBkaXJlY3RvcmllcyBzb21lIHRvIHByZXZlbnQgaGF2aW5nIGEgdG9uIG9mIHRvcCBsZXZlbAogICAgIyBkaXJlY3RvcmllcyB3aGVyZSB3ZSBtaWdodCBydW4gb3V0IG9mIHN1YiBkaXJlY3RvcmllcyBvbiBzb21lIEZTLgogICAgcGFydHMgPSBbaGFzaGVkWzoyXSwgaGFzaGVkWzI6NF0sIGhhc2hlZFs0OjZdLCBoYXNoZWRbNjpdXQoKICAgICMgSW5zaWRlIG9mIHRoZSBiYXNlIGxvY2F0aW9uIGZvciBjYWNoZWQgd2hlZWxzLCBleHBhbmQgb3VyIHBhcnRzIGFuZCBqb2luCiAgICAjIHRoZW0gYWxsIHRvZ2V0aGVyLgogICAgcmV0dXJuIG9zLnBhdGguam9pbihjYWNoZV9kaXIsICJ3aGVlbHMiLCAqcGFydHMpCgoKZGVmIGNhY2hlZF93aGVlbChjYWNoZV9kaXIsIGxpbmssIGZvcm1hdF9jb250cm9sLCBwYWNrYWdlX25hbWUpOgogICAgaWYgbm90IGNhY2hlX2RpcjoKICAgICAgICByZXR1cm4gbGluawogICAgaWYgbm90IGxpbms6CiAgICAgICAgcmV0dXJuIGxpbmsKICAgIGlmIGxpbmsuaXNfd2hlZWw6CiAgICAgICAgcmV0dXJuIGxpbmsKICAgIGlmIG5vdCBsaW5rLmlzX2FydGlmYWN0OgogICAgICAgIHJldHVybiBsaW5rCiAgICBpZiBub3QgcGFja2FnZV9uYW1lOgogICAgICAgIHJldHVybiBsaW5rCiAgICBjYW5vbmljYWxfbmFtZSA9IGNhbm9uaWNhbGl6ZV9uYW1lKHBhY2thZ2VfbmFtZSkKICAgIGZvcm1hdHMgPSBwaXAuaW5kZXguZm10X2N0bF9mb3JtYXRzKGZvcm1hdF9jb250cm9sLCBjYW5vbmljYWxfbmFtZSkKICAgIGlmICJiaW5hcnkiIG5vdCBpbiBmb3JtYXRzOgogICAgICAgIHJldHVybiBsaW5rCiAgICByb290ID0gX2NhY2hlX2Zvcl9saW5rKGNhY2hlX2RpciwgbGluaykKICAgIHRyeToKICAgICAgICB3aGVlbF9uYW1lcyA9IG9zLmxpc3RkaXIocm9vdCkKICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGU6CiAgICAgICAgaWYgZS5lcnJubyBpbiAoZXJybm8uRU5PRU5ULCBlcnJuby5FTk9URElSKToKICAgICAgICAgICAgcmV0dXJuIGxpbmsKICAgICAgICByYWlzZQogICAgY2FuZGlkYXRlcyA9IFtdCiAgICBmb3Igd2hlZWxfbmFtZSBpbiB3aGVlbF9uYW1lczoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHdoZWVsID0gV2hlZWwod2hlZWxfbmFtZSkKICAgICAgICBleGNlcHQgSW52YWxpZFdoZWVsRmlsZW5hbWU6CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgaWYgbm90IHdoZWVsLnN1cHBvcnRlZCgpOgogICAgICAgICAgICAjIEJ1aWx0IGZvciBhIGRpZmZlcmVudCBweXRob24vYXJjaC9ldGMKICAgICAgICAgICAgY29udGludWUKICAgICAgICBjYW5kaWRhdGVzLmFwcGVuZCgod2hlZWwuc3VwcG9ydF9pbmRleF9taW4oKSwgd2hlZWxfbmFtZSkpCiAgICBpZiBub3QgY2FuZGlkYXRlczoKICAgICAgICByZXR1cm4gbGluawogICAgY2FuZGlkYXRlcy5zb3J0KCkKICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocm9vdCwgY2FuZGlkYXRlc1swXVsxXSkKICAgIHJldHVybiBwaXAuaW5kZXguTGluayhwYXRoX3RvX3VybChwYXRoKSkKCgpkZWYgcmVoYXNoKHBhdGgsIGFsZ289J3NoYTI1NicsIGJsb2Nrc2l6ZT0xIDw8IDIwKToKICAgICIiIlJldHVybiAoaGFzaCwgbGVuZ3RoKSBmb3IgcGF0aCB1c2luZyBoYXNobGliLm5ldyhhbGdvKSIiIgogICAgaCA9IGhhc2hsaWIubmV3KGFsZ28pCiAgICBsZW5ndGggPSAwCiAgICB3aXRoIG9wZW4ocGF0aCwgJ3JiJykgYXMgZjoKICAgICAgICBmb3IgYmxvY2sgaW4gcmVhZF9jaHVua3MoZiwgc2l6ZT1ibG9ja3NpemUpOgogICAgICAgICAgICBsZW5ndGggKz0gbGVuKGJsb2NrKQogICAgICAgICAgICBoLnVwZGF0ZShibG9jaykKICAgIGRpZ2VzdCA9ICdzaGEyNTY9JyArIHVybHNhZmVfYjY0ZW5jb2RlKAogICAgICAgIGguZGlnZXN0KCkKICAgICkuZGVjb2RlKCdsYXRpbjEnKS5yc3RyaXAoJz0nKQogICAgcmV0dXJuIChkaWdlc3QsIGxlbmd0aCkKCgpkZWYgb3Blbl9mb3JfY3N2KG5hbWUsIG1vZGUpOgogICAgaWYgc3lzLnZlcnNpb25faW5mb1swXSA8IDM6CiAgICAgICAgbmwgPSB7fQogICAgICAgIGJpbiA9ICdiJwogICAgZWxzZToKICAgICAgICBubCA9IHsnbmV3bGluZSc6ICcnfQogICAgICAgIGJpbiA9ICcnCiAgICByZXR1cm4gb3BlbihuYW1lLCBtb2RlICsgYmluLCAqKm5sKQoKCmRlZiBmaXhfc2NyaXB0KHBhdGgpOgogICAgIiIiUmVwbGFjZSAjIXB5dGhvbiB3aXRoICMhL3BhdGgvdG8vcHl0aG9uCiAgICBSZXR1cm4gVHJ1ZSBpZiBmaWxlIHdhcyBjaGFuZ2VkLiIiIgogICAgIyBYWFggUkVDT1JEIGhhc2hlcyB3aWxsIG5lZWQgdG8gYmUgdXBkYXRlZAogICAgaWYgb3MucGF0aC5pc2ZpbGUocGF0aCk6CiAgICAgICAgd2l0aCBvcGVuKHBhdGgsICdyYicpIGFzIHNjcmlwdDoKICAgICAgICAgICAgZmlyc3RsaW5lID0gc2NyaXB0LnJlYWRsaW5lKCkKICAgICAgICAgICAgaWYgbm90IGZpcnN0bGluZS5zdGFydHN3aXRoKGInIyFweXRob24nKToKICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgICAgICBleGVuYW1lID0gc3lzLmV4ZWN1dGFibGUuZW5jb2RlKHN5cy5nZXRmaWxlc3lzdGVtZW5jb2RpbmcoKSkKICAgICAgICAgICAgZmlyc3RsaW5lID0gYicjIScgKyBleGVuYW1lICsgb3MubGluZXNlcC5lbmNvZGUoImFzY2lpIikKICAgICAgICAgICAgcmVzdCA9IHNjcmlwdC5yZWFkKCkKICAgICAgICB3aXRoIG9wZW4ocGF0aCwgJ3diJykgYXMgc2NyaXB0OgogICAgICAgICAgICBzY3JpcHQud3JpdGUoZmlyc3RsaW5lKQogICAgICAgICAgICBzY3JpcHQud3JpdGUocmVzdCkKICAgICAgICByZXR1cm4gVHJ1ZQoKZGlzdF9pbmZvX3JlID0gcmUuY29tcGlsZShyIiIiXig/UDxuYW1ldmVyPig/UDxuYW1lPi4rPykoLSg/UDx2ZXI+XGQuKz8pKT8pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXC5kaXN0LWluZm8kIiIiLCByZS5WRVJCT1NFKQoKCmRlZiByb290X2lzX3B1cmVsaWIobmFtZSwgd2hlZWxkaXIpOgogICAgIiIiCiAgICBSZXR1cm4gVHJ1ZSBpZiB0aGUgZXh0cmFjdGVkIHdoZWVsIGluIHdoZWVsZGlyIHNob3VsZCBnbyBpbnRvIHB1cmVsaWIuCiAgICAiIiIKICAgIG5hbWVfZm9sZGVkID0gbmFtZS5yZXBsYWNlKCItIiwgIl8iKQogICAgZm9yIGl0ZW0gaW4gb3MubGlzdGRpcih3aGVlbGRpcik6CiAgICAgICAgbWF0Y2ggPSBkaXN0X2luZm9fcmUubWF0Y2goaXRlbSkKICAgICAgICBpZiBtYXRjaCBhbmQgbWF0Y2guZ3JvdXAoJ25hbWUnKSA9PSBuYW1lX2ZvbGRlZDoKICAgICAgICAgICAgd2l0aCBvcGVuKG9zLnBhdGguam9pbih3aGVlbGRpciwgaXRlbSwgJ1dIRUVMJykpIGFzIHdoZWVsOgogICAgICAgICAgICAgICAgZm9yIGxpbmUgaW4gd2hlZWw6CiAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUubG93ZXIoKS5yc3RyaXAoKQogICAgICAgICAgICAgICAgICAgIGlmIGxpbmUgPT0gInJvb3QtaXMtcHVyZWxpYjogdHJ1ZSI6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICByZXR1cm4gRmFsc2UKCgpkZWYgZ2V0X2VudHJ5cG9pbnRzKGZpbGVuYW1lKToKICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhmaWxlbmFtZSk6CiAgICAgICAgcmV0dXJuIHt9LCB7fQoKICAgICMgVGhpcyBpcyBkb25lIGJlY2F1c2UgeW91IGNhbiBwYXNzIGEgc3RyaW5nIHRvIGVudHJ5X3BvaW50cyB3cmFwcGVycyB3aGljaAogICAgIyBtZWFucyB0aGF0IHRoZXkgbWF5IG9yIG1heSBub3QgYmUgdmFsaWQgSU5JIGZpbGVzLiBUaGUgYXR0ZW1wdCBoZXJlIGlzIHRvCiAgICAjIHN0cmlwIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UgaW4gb3JkZXIgdG8gbWFrZSB0aGVtIHZhbGlkIElOSQogICAgIyBmaWxlcy4KICAgIHdpdGggb3BlbihmaWxlbmFtZSkgYXMgZnA6CiAgICAgICAgZGF0YSA9IFN0cmluZ0lPKCkKICAgICAgICBmb3IgbGluZSBpbiBmcDoKICAgICAgICAgICAgZGF0YS53cml0ZShsaW5lLnN0cmlwKCkpCiAgICAgICAgICAgIGRhdGEud3JpdGUoIlxuIikKICAgICAgICBkYXRhLnNlZWsoMCkKCiAgICBjcCA9IGNvbmZpZ3BhcnNlci5SYXdDb25maWdQYXJzZXIoKQogICAgY3Aub3B0aW9ueGZvcm0gPSBsYW1iZGEgb3B0aW9uOiBvcHRpb24KICAgIGNwLnJlYWRmcChkYXRhKQoKICAgIGNvbnNvbGUgPSB7fQogICAgZ3VpID0ge30KICAgIGlmIGNwLmhhc19zZWN0aW9uKCdjb25zb2xlX3NjcmlwdHMnKToKICAgICAgICBjb25zb2xlID0gZGljdChjcC5pdGVtcygnY29uc29sZV9zY3JpcHRzJykpCiAgICBpZiBjcC5oYXNfc2VjdGlvbignZ3VpX3NjcmlwdHMnKToKICAgICAgICBndWkgPSBkaWN0KGNwLml0ZW1zKCdndWlfc2NyaXB0cycpKQogICAgcmV0dXJuIGNvbnNvbGUsIGd1aQoKCmRlZiBtb3ZlX3doZWVsX2ZpbGVzKG5hbWUsIHJlcSwgd2hlZWxkaXIsIHVzZXI9RmFsc2UsIGhvbWU9Tm9uZSwgcm9vdD1Ob25lLAogICAgICAgICAgICAgICAgICAgICBweWNvbXBpbGU9VHJ1ZSwgc2NoZW1lPU5vbmUsIGlzb2xhdGVkPUZhbHNlLCBwcmVmaXg9Tm9uZSk6CiAgICAiIiJJbnN0YWxsIGEgd2hlZWwiIiIKCiAgICBpZiBub3Qgc2NoZW1lOgogICAgICAgIHNjaGVtZSA9IGRpc3R1dGlsc19zY2hlbWUoCiAgICAgICAgICAgIG5hbWUsIHVzZXI9dXNlciwgaG9tZT1ob21lLCByb290PXJvb3QsIGlzb2xhdGVkPWlzb2xhdGVkLAogICAgICAgICAgICBwcmVmaXg9cHJlZml4LAogICAgICAgICkKCiAgICBpZiByb290X2lzX3B1cmVsaWIobmFtZSwgd2hlZWxkaXIpOgogICAgICAgIGxpYl9kaXIgPSBzY2hlbWVbJ3B1cmVsaWInXQogICAgZWxzZToKICAgICAgICBsaWJfZGlyID0gc2NoZW1lWydwbGF0bGliJ10KCiAgICBpbmZvX2RpciA9IFtdCiAgICBkYXRhX2RpcnMgPSBbXQogICAgc291cmNlID0gd2hlZWxkaXIucnN0cmlwKG9zLnBhdGguc2VwKSArIG9zLnBhdGguc2VwCgogICAgIyBSZWNvcmQgZGV0YWlscyBvZiB0aGUgZmlsZXMgbW92ZWQKICAgICMgICBpbnN0YWxsZWQgPSBmaWxlcyBjb3BpZWQgZnJvbSB0aGUgd2hlZWwgdG8gdGhlIGRlc3RpbmF0aW9uCiAgICAjICAgY2hhbmdlZCA9IGZpbGVzIGNoYW5nZWQgd2hpbGUgaW5zdGFsbGluZyAoc2NyaXB0cyAjISBsaW5lIHR5cGljYWxseSkKICAgICMgICBnZW5lcmF0ZWQgPSBmaWxlcyBuZXdseSBnZW5lcmF0ZWQgZHVyaW5nIHRoZSBpbnN0YWxsIChzY3JpcHQgd3JhcHBlcnMpCiAgICBpbnN0YWxsZWQgPSB7fQogICAgY2hhbmdlZCA9IHNldCgpCiAgICBnZW5lcmF0ZWQgPSBbXQoKICAgICMgQ29tcGlsZSBhbGwgb2YgdGhlIHB5YyBmaWxlcyB0aGF0IHdlJ3JlIGdvaW5nIHRvIGJlIGluc3RhbGxpbmcKICAgIGlmIHB5Y29tcGlsZToKICAgICAgICB3aXRoIGNhcHR1cmVkX3N0ZG91dCgpIGFzIHN0ZG91dDoKICAgICAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgogICAgICAgICAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoJ2lnbm9yZScpCiAgICAgICAgICAgICAgICBjb21waWxlYWxsLmNvbXBpbGVfZGlyKHNvdXJjZSwgZm9yY2U9VHJ1ZSwgcXVpZXQ9VHJ1ZSkKICAgICAgICBsb2dnZXIuZGVidWcoc3Rkb3V0LmdldHZhbHVlKCkpCgogICAgZGVmIG5vcm1wYXRoKHNyYywgcCk6CiAgICAgICAgcmV0dXJuIG9zLnBhdGgucmVscGF0aChzcmMsIHApLnJlcGxhY2Uob3MucGF0aC5zZXAsICcvJykKCiAgICBkZWYgcmVjb3JkX2luc3RhbGxlZChzcmNmaWxlLCBkZXN0ZmlsZSwgbW9kaWZpZWQ9RmFsc2UpOgogICAgICAgICIiIk1hcCBhcmNoaXZlIFJFQ09SRCBwYXRocyB0byBpbnN0YWxsYXRpb24gUkVDT1JEIHBhdGhzLiIiIgogICAgICAgIG9sZHBhdGggPSBub3JtcGF0aChzcmNmaWxlLCB3aGVlbGRpcikKICAgICAgICBuZXdwYXRoID0gbm9ybXBhdGgoZGVzdGZpbGUsIGxpYl9kaXIpCiAgICAgICAgaW5zdGFsbGVkW29sZHBhdGhdID0gbmV3cGF0aAogICAgICAgIGlmIG1vZGlmaWVkOgogICAgICAgICAgICBjaGFuZ2VkLmFkZChkZXN0ZmlsZSkKCiAgICBkZWYgY2xvYmJlcihzb3VyY2UsIGRlc3QsIGlzX2Jhc2UsIGZpeGVyPU5vbmUsIGZpbHRlcj1Ob25lKToKICAgICAgICBlbnN1cmVfZGlyKGRlc3QpICAjIGNvbW1vbiBmb3IgdGhlICdpbmNsdWRlJyBwYXRoCgogICAgICAgIGZvciBkaXIsIHN1YmRpcnMsIGZpbGVzIGluIG9zLndhbGsoc291cmNlKToKICAgICAgICAgICAgYmFzZWRpciA9IGRpcltsZW4oc291cmNlKTpdLmxzdHJpcChvcy5wYXRoLnNlcCkKICAgICAgICAgICAgZGVzdGRpciA9IG9zLnBhdGguam9pbihkZXN0LCBiYXNlZGlyKQogICAgICAgICAgICBpZiBpc19iYXNlIGFuZCBiYXNlZGlyLnNwbGl0KG9zLnBhdGguc2VwLCAxKVswXS5lbmRzd2l0aCgnLmRhdGEnKToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGZvciBzIGluIHN1YmRpcnM6CiAgICAgICAgICAgICAgICBkZXN0c3ViZGlyID0gb3MucGF0aC5qb2luKGRlc3QsIGJhc2VkaXIsIHMpCiAgICAgICAgICAgICAgICBpZiBpc19iYXNlIGFuZCBiYXNlZGlyID09ICcnIGFuZCBkZXN0c3ViZGlyLmVuZHN3aXRoKCcuZGF0YScpOgogICAgICAgICAgICAgICAgICAgIGRhdGFfZGlycy5hcHBlbmQocykKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgZWxpZiAoaXNfYmFzZSBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgcy5lbmRzd2l0aCgnLmRpc3QtaW5mbycpIGFuZAogICAgICAgICAgICAgICAgICAgICAgICBjYW5vbmljYWxpemVfbmFtZShzKS5zdGFydHN3aXRoKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Fub25pY2FsaXplX25hbWUocmVxLm5hbWUpKSk6CiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IG5vdCBpbmZvX2RpciwgKCdNdWx0aXBsZSAuZGlzdC1pbmZvIGRpcmVjdG9yaWVzOiAnICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdHN1YmRpciArICcsICcgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLCAnLmpvaW4oaW5mb19kaXIpKQogICAgICAgICAgICAgICAgICAgIGluZm9fZGlyLmFwcGVuZChkZXN0c3ViZGlyKQogICAgICAgICAgICBmb3IgZiBpbiBmaWxlczoKICAgICAgICAgICAgICAgICMgU2tpcCB1bndhbnRlZCBmaWxlcwogICAgICAgICAgICAgICAgaWYgZmlsdGVyIGFuZCBmaWx0ZXIoZik6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIHNyY2ZpbGUgPSBvcy5wYXRoLmpvaW4oZGlyLCBmKQogICAgICAgICAgICAgICAgZGVzdGZpbGUgPSBvcy5wYXRoLmpvaW4oZGVzdCwgYmFzZWRpciwgZikKICAgICAgICAgICAgICAgICMgZGlyZWN0b3J5IGNyZWF0aW9uIGlzIGxhenkgYW5kIGFmdGVyIHRoZSBmaWxlIGZpbHRlcmluZyBhYm92ZQogICAgICAgICAgICAgICAgIyB0byBlbnN1cmUgd2UgZG9uJ3QgaW5zdGFsbCBlbXB0eSBkaXJzOyBlbXB0eSBkaXJzIGNhbid0IGJlCiAgICAgICAgICAgICAgICAjIHVuaW5zdGFsbGVkLgogICAgICAgICAgICAgICAgZW5zdXJlX2RpcihkZXN0ZGlyKQoKICAgICAgICAgICAgICAgICMgV2UgdXNlIGNvcHlmaWxlIChub3QgbW92ZSwgY29weSwgb3IgY29weTIpIHRvIGJlIGV4dHJhIHN1cmUKICAgICAgICAgICAgICAgICMgdGhhdCB3ZSBhcmUgbm90IG1vdmluZyBkaXJlY3RvcmllcyBvdmVyIChjb3B5ZmlsZSBmYWlscyBmb3IKICAgICAgICAgICAgICAgICMgZGlyZWN0b3JpZXMpIGFzIHdlbGwgYXMgdG8gZW5zdXJlIHRoYXQgd2UgYXJlIG5vdCBjb3B5aW5nCiAgICAgICAgICAgICAgICAjIG92ZXIgYW55IG1ldGFkYXRhIGJlY2F1c2Ugd2Ugd2FudCBtb3JlIGNvbnRyb2wgb3ZlciB3aGF0CiAgICAgICAgICAgICAgICAjIG1ldGFkYXRhIHdlIGFjdHVhbGx5IGNvcHkgb3Zlci4KICAgICAgICAgICAgICAgIHNodXRpbC5jb3B5ZmlsZShzcmNmaWxlLCBkZXN0ZmlsZSkKCiAgICAgICAgICAgICAgICAjIENvcHkgb3ZlciB0aGUgbWV0YWRhdGEgZm9yIHRoZSBmaWxlLCBjdXJyZW50bHkgdGhpcyBvbmx5CiAgICAgICAgICAgICAgICAjIGluY2x1ZGVzIHRoZSBhdGltZSBhbmQgbXRpbWUuCiAgICAgICAgICAgICAgICBzdCA9IG9zLnN0YXQoc3JjZmlsZSkKICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIob3MsICJ1dGltZSIpOgogICAgICAgICAgICAgICAgICAgIG9zLnV0aW1lKGRlc3RmaWxlLCAoc3Quc3RfYXRpbWUsIHN0LnN0X210aW1lKSkKCiAgICAgICAgICAgICAgICAjIElmIG91ciBmaWxlIGlzIGV4ZWN1dGFibGUsIHRoZW4gbWFrZSBvdXIgZGVzdGluYXRpb24gZmlsZQogICAgICAgICAgICAgICAgIyBleGVjdXRhYmxlLgogICAgICAgICAgICAgICAgaWYgb3MuYWNjZXNzKHNyY2ZpbGUsIG9zLlhfT0spOgogICAgICAgICAgICAgICAgICAgIHN0ID0gb3Muc3RhdChzcmNmaWxlKQogICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb25zID0gKAogICAgICAgICAgICAgICAgICAgICAgICBzdC5zdF9tb2RlIHwgc3RhdC5TX0lYVVNSIHwgc3RhdC5TX0lYR1JQIHwgc3RhdC5TX0lYT1RICiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIG9zLmNobW9kKGRlc3RmaWxlLCBwZXJtaXNzaW9ucykKCiAgICAgICAgICAgICAgICBjaGFuZ2VkID0gRmFsc2UKICAgICAgICAgICAgICAgIGlmIGZpeGVyOgogICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgPSBmaXhlcihkZXN0ZmlsZSkKICAgICAgICAgICAgICAgIHJlY29yZF9pbnN0YWxsZWQoc3JjZmlsZSwgZGVzdGZpbGUsIGNoYW5nZWQpCgogICAgY2xvYmJlcihzb3VyY2UsIGxpYl9kaXIsIFRydWUpCgogICAgYXNzZXJ0IGluZm9fZGlyLCAiJXMgLmRpc3QtaW5mbyBkaXJlY3Rvcnkgbm90IGZvdW5kIiAlIHJlcQoKICAgICMgR2V0IHRoZSBkZWZpbmVkIGVudHJ5IHBvaW50cwogICAgZXBfZmlsZSA9IG9zLnBhdGguam9pbihpbmZvX2RpclswXSwgJ2VudHJ5X3BvaW50cy50eHQnKQogICAgY29uc29sZSwgZ3VpID0gZ2V0X2VudHJ5cG9pbnRzKGVwX2ZpbGUpCgogICAgZGVmIGlzX2VudHJ5cG9pbnRfd3JhcHBlcihuYW1lKToKICAgICAgICAjIEVQLCBFUC5leGUgYW5kIEVQLXNjcmlwdC5weSBhcmUgc2NyaXB0cyBnZW5lcmF0ZWQgZm9yCiAgICAgICAgIyBlbnRyeSBwb2ludCBFUCBieSBzZXR1cHRvb2xzCiAgICAgICAgaWYgbmFtZS5sb3dlcigpLmVuZHN3aXRoKCcuZXhlJyk6CiAgICAgICAgICAgIG1hdGNobmFtZSA9IG5hbWVbOi00XQogICAgICAgIGVsaWYgbmFtZS5sb3dlcigpLmVuZHN3aXRoKCctc2NyaXB0LnB5Jyk6CiAgICAgICAgICAgIG1hdGNobmFtZSA9IG5hbWVbOi0xMF0KICAgICAgICBlbGlmIG5hbWUubG93ZXIoKS5lbmRzd2l0aCgiLnB5YSIpOgogICAgICAgICAgICBtYXRjaG5hbWUgPSBuYW1lWzotNF0KICAgICAgICBlbHNlOgogICAgICAgICAgICBtYXRjaG5hbWUgPSBuYW1lCiAgICAgICAgIyBJZ25vcmUgc2V0dXB0b29scy1nZW5lcmF0ZWQgc2NyaXB0cwogICAgICAgIHJldHVybiAobWF0Y2huYW1lIGluIGNvbnNvbGUgb3IgbWF0Y2huYW1lIGluIGd1aSkKCiAgICBmb3IgZGF0YWRpciBpbiBkYXRhX2RpcnM6CiAgICAgICAgZml4ZXIgPSBOb25lCiAgICAgICAgZmlsdGVyID0gTm9uZQogICAgICAgIGZvciBzdWJkaXIgaW4gb3MubGlzdGRpcihvcy5wYXRoLmpvaW4od2hlZWxkaXIsIGRhdGFkaXIpKToKICAgICAgICAgICAgZml4ZXIgPSBOb25lCiAgICAgICAgICAgIGlmIHN1YmRpciA9PSAnc2NyaXB0cyc6CiAgICAgICAgICAgICAgICBmaXhlciA9IGZpeF9zY3JpcHQKICAgICAgICAgICAgICAgIGZpbHRlciA9IGlzX2VudHJ5cG9pbnRfd3JhcHBlcgogICAgICAgICAgICBzb3VyY2UgPSBvcy5wYXRoLmpvaW4od2hlZWxkaXIsIGRhdGFkaXIsIHN1YmRpcikKICAgICAgICAgICAgZGVzdCA9IHNjaGVtZVtzdWJkaXJdCiAgICAgICAgICAgIGNsb2JiZXIoc291cmNlLCBkZXN0LCBGYWxzZSwgZml4ZXI9Zml4ZXIsIGZpbHRlcj1maWx0ZXIpCgogICAgbWFrZXIgPSBTY3JpcHRNYWtlcihOb25lLCBzY2hlbWVbJ3NjcmlwdHMnXSkKCiAgICAjIEVuc3VyZSBvbGQgc2NyaXB0cyBhcmUgb3ZlcndyaXR0ZW4uCiAgICAjIFNlZSBodHRwczovL2dpdGh1Yi5jb20vcHlwYS9waXAvaXNzdWVzLzE4MDAKICAgIG1ha2VyLmNsb2JiZXIgPSBUcnVlCgogICAgIyBFbnN1cmUgd2UgZG9uJ3QgZ2VuZXJhdGUgYW55IHZhcmlhbnRzIGZvciBzY3JpcHRzIGJlY2F1c2UgdGhpcyBpcyBhbG1vc3QKICAgICMgbmV2ZXIgd2hhdCBzb21lYm9keSB3YW50cy4KICAgICMgU2VlIGh0dHBzOi8vYml0YnVja2V0Lm9yZy9weXBhL2Rpc3RsaWIvaXNzdWUvMzUvCiAgICBtYWtlci52YXJpYW50cyA9IHNldCgoJycsICkpCgogICAgIyBUaGlzIGlzIHJlcXVpcmVkIGJlY2F1c2Ugb3RoZXJ3aXNlIGRpc3RsaWIgY3JlYXRlcyBzY3JpcHRzIHRoYXQgYXJlIG5vdAogICAgIyBleGVjdXRhYmxlLgogICAgIyBTZWUgaHR0cHM6Ly9iaXRidWNrZXQub3JnL3B5cGEvZGlzdGxpYi9pc3N1ZS8zMi8KICAgIG1ha2VyLnNldF9tb2RlID0gVHJ1ZQoKICAgICMgU2ltcGxpZnkgdGhlIHNjcmlwdCBhbmQgZml4IHRoZSBmYWN0IHRoYXQgdGhlIGRlZmF1bHQgc2NyaXB0IHN3YWxsb3dzCiAgICAjIGV2ZXJ5IHNpbmdsZSBzdGFjayB0cmFjZS4KICAgICMgU2VlIGh0dHBzOi8vYml0YnVja2V0Lm9yZy9weXBhL2Rpc3RsaWIvaXNzdWUvMzQvCiAgICAjIFNlZSBodHRwczovL2JpdGJ1Y2tldC5vcmcvcHlwYS9kaXN0bGliL2lzc3VlLzMzLwogICAgZGVmIF9nZXRfc2NyaXB0X3RleHQoZW50cnkpOgogICAgICAgIGlmIGVudHJ5LnN1ZmZpeCBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBJbnN0YWxsYXRpb25FcnJvcigKICAgICAgICAgICAgICAgICJJbnZhbGlkIHNjcmlwdCBlbnRyeSBwb2ludDogJXMgZm9yIHJlcTogJXMgLSBBIGNhbGxhYmxlICIKICAgICAgICAgICAgICAgICJzdWZmaXggaXMgcmVxdWlyZWQuIENmIGh0dHBzOi8vcGFja2FnaW5nLnB5dGhvbi5vcmcvZW4vIgogICAgICAgICAgICAgICAgImxhdGVzdC9kaXN0cmlidXRpbmcuaHRtbCNjb25zb2xlLXNjcmlwdHMgZm9yIG1vcmUgIgogICAgICAgICAgICAgICAgImluZm9ybWF0aW9uLiIgJSAoZW50cnksIHJlcSkKICAgICAgICAgICAgKQogICAgICAgIHJldHVybiBtYWtlci5zY3JpcHRfdGVtcGxhdGUgJSB7CiAgICAgICAgICAgICJtb2R1bGUiOiBlbnRyeS5wcmVmaXgsCiAgICAgICAgICAgICJpbXBvcnRfbmFtZSI6IGVudHJ5LnN1ZmZpeC5zcGxpdCgiLiIpWzBdLAogICAgICAgICAgICAiZnVuYyI6IGVudHJ5LnN1ZmZpeCwKICAgICAgICB9CgogICAgbWFrZXIuX2dldF9zY3JpcHRfdGV4dCA9IF9nZXRfc2NyaXB0X3RleHQKICAgIG1ha2VyLnNjcmlwdF90ZW1wbGF0ZSA9ICIiIiMgLSotIGNvZGluZzogdXRmLTggLSotCmltcG9ydCByZQppbXBvcnQgc3lzCgpmcm9tICUobW9kdWxlKXMgaW1wb3J0ICUoaW1wb3J0X25hbWUpcwoKaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgIHN5cy5hcmd2WzBdID0gcmUuc3ViKHInKC1zY3JpcHRcLnB5dz98XC5leGUpPyQnLCAnJywgc3lzLmFyZ3ZbMF0pCiAgICBzeXMuZXhpdCglKGZ1bmMpcygpKQoiIiIKCiAgICAjIFNwZWNpYWwgY2FzZSBwaXAgYW5kIHNldHVwdG9vbHMgdG8gZ2VuZXJhdGUgdmVyc2lvbmVkIHdyYXBwZXJzCiAgICAjCiAgICAjIFRoZSBpc3N1ZSBpcyB0aGF0IHNvbWUgcHJvamVjdHMgKHNwZWNpZmljYWxseSwgcGlwIGFuZCBzZXR1cHRvb2xzKSB1c2UKICAgICMgY29kZSBpbiBzZXR1cC5weSB0byBjcmVhdGUgInZlcnNpb25lZCIgZW50cnkgcG9pbnRzIC0gcGlwMi43IG9uIFB5dGhvbgogICAgIyAyLjcsIHBpcDMuMyBvbiBQeXRob24gMy4zLCBldGMuIEJ1dCB0aGVzZSBlbnRyeSBwb2ludHMgYXJlIGJha2VkIGludG8KICAgICMgdGhlIHdoZWVsIG1ldGFkYXRhIGF0IGJ1aWxkIHRpbWUsIGFuZCBzbyBpZiB0aGUgd2hlZWwgaXMgaW5zdGFsbGVkIHdpdGgKICAgICMgYSAqZGlmZmVyZW50KiB2ZXJzaW9uIG9mIFB5dGhvbiB0aGUgZW50cnkgcG9pbnRzIHdpbGwgYmUgd3JvbmcuIFRoZQogICAgIyBjb3JyZWN0IGZpeCBmb3IgdGhpcyBpcyB0byBlbmhhbmNlIHRoZSBtZXRhZGF0YSB0byBiZSBhYmxlIHRvIGRlc2NyaWJlCiAgICAjIHN1Y2ggdmVyc2lvbmVkIGVudHJ5IHBvaW50cywgYnV0IHRoYXQgd29uJ3QgaGFwcGVuIHRpbGwgTWV0YWRhdGEgMi4wIGlzCiAgICAjIGF2YWlsYWJsZS4KICAgICMgSW4gdGhlIG1lYW50aW1lLCBwcm9qZWN0cyB1c2luZyB2ZXJzaW9uZWQgZW50cnkgcG9pbnRzIHdpbGwgZWl0aGVyIGhhdmUKICAgICMgaW5jb3JyZWN0IHZlcnNpb25lZCBlbnRyeSBwb2ludHMsIG9yIHRoZXkgd2lsbCBub3QgYmUgYWJsZSB0byBkaXN0cmlidXRlCiAgICAjICJ1bml2ZXJzYWwiIHdoZWVscyAoaS5lLiwgdGhleSB3aWxsIG5lZWQgYSB3aGVlbCBwZXIgUHl0aG9uIHZlcnNpb24pLgogICAgIwogICAgIyBCZWNhdXNlIHNldHVwdG9vbHMgYW5kIHBpcCBhcmUgYnVuZGxlZCB3aXRoIF9lbnN1cmVwaXAgYW5kIHZpcnR1YWxlbnYsCiAgICAjIHdlIG5lZWQgdG8gdXNlIHVuaXZlcnNhbCB3aGVlbHMuIFNvLCBhcyBhIHN0b3BnYXAgdW50aWwgTWV0YWRhdGEgMi4wLCB3ZQogICAgIyBvdmVycmlkZSB0aGUgdmVyc2lvbmVkIGVudHJ5IHBvaW50cyBpbiB0aGUgd2hlZWwgYW5kIGdlbmVyYXRlIHRoZQogICAgIyBjb3JyZWN0IG9uZXMuIFRoaXMgY29kZSBpcyBwdXJlbHkgYSBzaG9ydC10ZXJtIG1lYXN1cmUgdW50aWwgTWV0YWRhdGEgMi4wCiAgICAjIGlzIGF2YWlsYWJsZS4KICAgICMKICAgICMgVG8gYWRkIHRoZSBsZXZlbCBvZiBoYWNrIGluIHRoaXMgc2VjdGlvbiBvZiBjb2RlLCBpbiBvcmRlciB0byBzdXBwb3J0CiAgICAjIGVuc3VyZXBpcCB0aGlzIGNvZGUgd2lsbCBsb29rIGZvciBhbiBgYEVOU1VSRVBJUF9PUFRJT05TYGAgZW52aXJvbm1lbnQKICAgICMgdmFyaWFibGUgd2hpY2ggd2lsbCBjb250cm9sIHdoaWNoIHZlcnNpb24gc2NyaXB0cyBnZXQgaW5zdGFsbGVkLgogICAgIwogICAgIyBFTlNVUkVQSVBfT1BUSU9OUz1hbHRpbnN0YWxsCiAgICAjICAgLSBPbmx5IHBpcFguWSBhbmQgZWFzeV9pbnN0YWxsLVguWSB3aWxsIGJlIGdlbmVyYXRlZCBhbmQgaW5zdGFsbGVkCiAgICAjIEVOU1VSRVBJUF9PUFRJT05TPWluc3RhbGwKICAgICMgICAtIHBpcFguWSwgcGlwWCwgZWFzeV9pbnN0YWxsLVguWSB3aWxsIGJlIGdlbmVyYXRlZCBhbmQgaW5zdGFsbGVkLiBOb3RlCiAgICAjICAgICB0aGF0IHRoaXMgb3B0aW9uIGlzIHRlY2huaWNhbGx5IGlmIEVOU1VSRVBJUF9PUFRJT05TIGlzIHNldCBhbmQgaXMKICAgICMgICAgIG5vdCBhbHRpbnN0YWxsCiAgICAjIERFRkFVTFQKICAgICMgICAtIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIGluc3RhbGwgcGlwLCBwaXBYLCBwaXBYLlksIGVhc3lfaW5zdGFsbAogICAgIyAgICAgYW5kIGVhc3lfaW5zdGFsbC1YLlkuCiAgICBwaXBfc2NyaXB0ID0gY29uc29sZS5wb3AoJ3BpcCcsIE5vbmUpCiAgICBpZiBwaXBfc2NyaXB0OgogICAgICAgIGlmICJFTlNVUkVQSVBfT1BUSU9OUyIgbm90IGluIG9zLmVudmlyb246CiAgICAgICAgICAgIHNwZWMgPSAncGlwID0gJyArIHBpcF9zY3JpcHQKICAgICAgICAgICAgZ2VuZXJhdGVkLmV4dGVuZChtYWtlci5tYWtlKHNwZWMpKQoKICAgICAgICBpZiBvcy5lbnZpcm9uLmdldCgiRU5TVVJFUElQX09QVElPTlMiLCAiIikgIT0gImFsdGluc3RhbGwiOgogICAgICAgICAgICBzcGVjID0gJ3BpcCVzID0gJXMnICUgKHN5cy52ZXJzaW9uWzoxXSwgcGlwX3NjcmlwdCkKICAgICAgICAgICAgZ2VuZXJhdGVkLmV4dGVuZChtYWtlci5tYWtlKHNwZWMpKQoKICAgICAgICBzcGVjID0gJ3BpcCVzID0gJXMnICUgKHN5cy52ZXJzaW9uWzozXSwgcGlwX3NjcmlwdCkKICAgICAgICBnZW5lcmF0ZWQuZXh0ZW5kKG1ha2VyLm1ha2Uoc3BlYykpCiAgICAgICAgIyBEZWxldGUgYW55IG90aGVyIHZlcnNpb25lZCBwaXAgZW50cnkgcG9pbnRzCiAgICAgICAgcGlwX2VwID0gW2sgZm9yIGsgaW4gY29uc29sZSBpZiByZS5tYXRjaChyJ3BpcChcZChcLlxkKT8pPyQnLCBrKV0KICAgICAgICBmb3IgayBpbiBwaXBfZXA6CiAgICAgICAgICAgIGRlbCBjb25zb2xlW2tdCiAgICBlYXN5X2luc3RhbGxfc2NyaXB0ID0gY29uc29sZS5wb3AoJ2Vhc3lfaW5zdGFsbCcsIE5vbmUpCiAgICBpZiBlYXN5X2luc3RhbGxfc2NyaXB0OgogICAgICAgIGlmICJFTlNVUkVQSVBfT1BUSU9OUyIgbm90IGluIG9zLmVudmlyb246CiAgICAgICAgICAgIHNwZWMgPSAnZWFzeV9pbnN0YWxsID0gJyArIGVhc3lfaW5zdGFsbF9zY3JpcHQKICAgICAgICAgICAgZ2VuZXJhdGVkLmV4dGVuZChtYWtlci5tYWtlKHNwZWMpKQoKICAgICAgICBzcGVjID0gJ2Vhc3lfaW5zdGFsbC0lcyA9ICVzJyAlIChzeXMudmVyc2lvbls6M10sIGVhc3lfaW5zdGFsbF9zY3JpcHQpCiAgICAgICAgZ2VuZXJhdGVkLmV4dGVuZChtYWtlci5tYWtlKHNwZWMpKQogICAgICAgICMgRGVsZXRlIGFueSBvdGhlciB2ZXJzaW9uZWQgZWFzeV9pbnN0YWxsIGVudHJ5IHBvaW50cwogICAgICAgIGVhc3lfaW5zdGFsbF9lcCA9IFsKICAgICAgICAgICAgayBmb3IgayBpbiBjb25zb2xlIGlmIHJlLm1hdGNoKHInZWFzeV9pbnN0YWxsKC1cZFwuXGQpPyQnLCBrKQogICAgICAgIF0KICAgICAgICBmb3IgayBpbiBlYXN5X2luc3RhbGxfZXA6CiAgICAgICAgICAgIGRlbCBjb25zb2xlW2tdCgogICAgIyBHZW5lcmF0ZSB0aGUgY29uc29sZSBhbmQgR1VJIGVudHJ5IHBvaW50cyBzcGVjaWZpZWQgaW4gdGhlIHdoZWVsCiAgICBpZiBsZW4oY29uc29sZSkgPiAwOgogICAgICAgIGdlbmVyYXRlZC5leHRlbmQoCiAgICAgICAgICAgIG1ha2VyLm1ha2VfbXVsdGlwbGUoWyclcyA9ICVzJyAlIGt2IGZvciBrdiBpbiBjb25zb2xlLml0ZW1zKCldKQogICAgICAgICkKICAgIGlmIGxlbihndWkpID4gMDoKICAgICAgICBnZW5lcmF0ZWQuZXh0ZW5kKAogICAgICAgICAgICBtYWtlci5tYWtlX211bHRpcGxlKAogICAgICAgICAgICAgICAgWyclcyA9ICVzJyAlIGt2IGZvciBrdiBpbiBndWkuaXRlbXMoKV0sCiAgICAgICAgICAgICAgICB7J2d1aSc6IFRydWV9CiAgICAgICAgICAgICkKICAgICAgICApCgogICAgIyBSZWNvcmQgcGlwIGFzIHRoZSBpbnN0YWxsZXIKICAgIGluc3RhbGxlciA9IG9zLnBhdGguam9pbihpbmZvX2RpclswXSwgJ0lOU1RBTExFUicpCiAgICB0ZW1wX2luc3RhbGxlciA9IG9zLnBhdGguam9pbihpbmZvX2RpclswXSwgJ0lOU1RBTExFUi5waXAnKQogICAgd2l0aCBvcGVuKHRlbXBfaW5zdGFsbGVyLCAnd2InKSBhcyBpbnN0YWxsZXJfZmlsZToKICAgICAgICBpbnN0YWxsZXJfZmlsZS53cml0ZShiJ3BpcFxuJykKICAgIHNodXRpbC5tb3ZlKHRlbXBfaW5zdGFsbGVyLCBpbnN0YWxsZXIpCiAgICBnZW5lcmF0ZWQuYXBwZW5kKGluc3RhbGxlcikKCiAgICAjIFJlY29yZCBkZXRhaWxzIG9mIGFsbCBmaWxlcyBpbnN0YWxsZWQKICAgIHJlY29yZCA9IG9zLnBhdGguam9pbihpbmZvX2RpclswXSwgJ1JFQ09SRCcpCiAgICB0ZW1wX3JlY29yZCA9IG9zLnBhdGguam9pbihpbmZvX2RpclswXSwgJ1JFQ09SRC5waXAnKQogICAgd2l0aCBvcGVuX2Zvcl9jc3YocmVjb3JkLCAncicpIGFzIHJlY29yZF9pbjoKICAgICAgICB3aXRoIG9wZW5fZm9yX2Nzdih0ZW1wX3JlY29yZCwgJ3crJykgYXMgcmVjb3JkX291dDoKICAgICAgICAgICAgcmVhZGVyID0gY3N2LnJlYWRlcihyZWNvcmRfaW4pCiAgICAgICAgICAgIHdyaXRlciA9IGNzdi53cml0ZXIocmVjb3JkX291dCkKICAgICAgICAgICAgZm9yIHJvdyBpbiByZWFkZXI6CiAgICAgICAgICAgICAgICByb3dbMF0gPSBpbnN0YWxsZWQucG9wKHJvd1swXSwgcm93WzBdKQogICAgICAgICAgICAgICAgaWYgcm93WzBdIGluIGNoYW5nZWQ6CiAgICAgICAgICAgICAgICAgICAgcm93WzFdLCByb3dbMl0gPSByZWhhc2gocm93WzBdKQogICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlcm93KHJvdykKICAgICAgICAgICAgZm9yIGYgaW4gZ2VuZXJhdGVkOgogICAgICAgICAgICAgICAgaCwgbCA9IHJlaGFzaChmKQogICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlcm93KChub3JtcGF0aChmLCBsaWJfZGlyKSwgaCwgbCkpCiAgICAgICAgICAgIGZvciBmIGluIGluc3RhbGxlZDoKICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZXJvdygoaW5zdGFsbGVkW2ZdLCAnJywgJycpKQogICAgc2h1dGlsLm1vdmUodGVtcF9yZWNvcmQsIHJlY29yZCkKCgpkZWYgX3VuaXF1ZShmbik6CiAgICBAZnVuY3Rvb2xzLndyYXBzKGZuKQogICAgZGVmIHVuaXF1ZSgqYXJncywgKiprdyk6CiAgICAgICAgc2VlbiA9IHNldCgpCiAgICAgICAgZm9yIGl0ZW0gaW4gZm4oKmFyZ3MsICoqa3cpOgogICAgICAgICAgICBpZiBpdGVtIG5vdCBpbiBzZWVuOgogICAgICAgICAgICAgICAgc2Vlbi5hZGQoaXRlbSkKICAgICAgICAgICAgICAgIHlpZWxkIGl0ZW0KICAgIHJldHVybiB1bmlxdWUKCgojIFRPRE86IHRoaXMgZ29lcyBzb21ld2hlcmUgYmVzaWRlcyB0aGUgd2hlZWwgbW9kdWxlCkBfdW5pcXVlCmRlZiB1bmluc3RhbGxhdGlvbl9wYXRocyhkaXN0KToKICAgICIiIgogICAgWWllbGQgYWxsIHRoZSB1bmluc3RhbGxhdGlvbiBwYXRocyBmb3IgZGlzdCBiYXNlZCBvbiBSRUNPUkQtd2l0aG91dC0ucHljCgogICAgWWllbGQgcGF0aHMgdG8gYWxsIHRoZSBmaWxlcyBpbiBSRUNPUkQuIEZvciBlYWNoIC5weSBmaWxlIGluIFJFQ09SRCwgYWRkCiAgICB0aGUgLnB5YyBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCgogICAgVW5pbnN0YWxsUGF0aFNldC5hZGQoKSB0YWtlcyBjYXJlIG9mIHRoZSBfX3B5Y2FjaGVfXyAucHljLgogICAgIiIiCiAgICBmcm9tIHBpcC51dGlscyBpbXBvcnQgRmFrZUZpbGUgICMgY2lyY3VsYXIgaW1wb3J0CiAgICByID0gY3N2LnJlYWRlcihGYWtlRmlsZShkaXN0LmdldF9tZXRhZGF0YV9saW5lcygnUkVDT1JEJykpKQogICAgZm9yIHJvdyBpbiByOgogICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oZGlzdC5sb2NhdGlvbiwgcm93WzBdKQogICAgICAgIHlpZWxkIHBhdGgKICAgICAgICBpZiBwYXRoLmVuZHN3aXRoKCcucHknKToKICAgICAgICAgICAgZG4sIGZuID0gb3MucGF0aC5zcGxpdChwYXRoKQogICAgICAgICAgICBiYXNlID0gZm5bOi0zXQogICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKGRuLCBiYXNlICsgJy5weWMnKQogICAgICAgICAgICB5aWVsZCBwYXRoCgoKZGVmIHdoZWVsX3ZlcnNpb24oc291cmNlX2Rpcik6CiAgICAiIiIKICAgIFJldHVybiB0aGUgV2hlZWwtVmVyc2lvbiBvZiBhbiBleHRyYWN0ZWQgd2hlZWwsIGlmIHBvc3NpYmxlLgoKICAgIE90aGVyd2lzZSwgcmV0dXJuIEZhbHNlIGlmIHdlIGNvdWxkbid0IHBhcnNlIC8gZXh0cmFjdCBpdC4KICAgICIiIgogICAgdHJ5OgogICAgICAgIGRpc3QgPSBbZCBmb3IgZCBpbiBwa2dfcmVzb3VyY2VzLmZpbmRfb25fcGF0aChOb25lLCBzb3VyY2VfZGlyKV1bMF0KCiAgICAgICAgd2hlZWxfZGF0YSA9IGRpc3QuZ2V0X21ldGFkYXRhKCdXSEVFTCcpCiAgICAgICAgd2hlZWxfZGF0YSA9IFBhcnNlcigpLnBhcnNlc3RyKHdoZWVsX2RhdGEpCgogICAgICAgIHZlcnNpb24gPSB3aGVlbF9kYXRhWydXaGVlbC1WZXJzaW9uJ10uc3RyaXAoKQogICAgICAgIHZlcnNpb24gPSB0dXBsZShtYXAoaW50LCB2ZXJzaW9uLnNwbGl0KCcuJykpKQogICAgICAgIHJldHVybiB2ZXJzaW9uCiAgICBleGNlcHQ6CiAgICAgICAgcmV0dXJuIEZhbHNlCgoKZGVmIGNoZWNrX2NvbXBhdGliaWxpdHkodmVyc2lvbiwgbmFtZSk6CiAgICAiIiIKICAgIFJhaXNlcyBlcnJvcnMgb3Igd2FybnMgaWYgY2FsbGVkIHdpdGggYW4gaW5jb21wYXRpYmxlIFdoZWVsLVZlcnNpb24uCgogICAgUGlwIHNob3VsZCByZWZ1c2UgdG8gaW5zdGFsbCBhIFdoZWVsLVZlcnNpb24gdGhhdCdzIGEgbWFqb3Igc2VyaWVzCiAgICBhaGVhZCBvZiB3aGF0IGl0J3MgY29tcGF0aWJsZSB3aXRoIChlLmcgMi4wID4gMS4xKTsgYW5kIHdhcm4gd2hlbgogICAgaW5zdGFsbGluZyBhIHZlcnNpb24gb25seSBtaW5vciB2ZXJzaW9uIGFoZWFkIChlLmcgMS4yID4gMS4xKS4KCiAgICB2ZXJzaW9uOiBhIDItdHVwbGUgcmVwcmVzZW50aW5nIGEgV2hlZWwtVmVyc2lvbiAoTWFqb3IsIE1pbm9yKQogICAgbmFtZTogbmFtZSBvZiB3aGVlbCBvciBwYWNrYWdlIHRvIHJhaXNlIGV4Y2VwdGlvbiBhYm91dAoKICAgIDpyYWlzZXMgVW5zdXBwb3J0ZWRXaGVlbDogd2hlbiBhbiBpbmNvbXBhdGlibGUgV2hlZWwtVmVyc2lvbiBpcyBnaXZlbgogICAgIiIiCiAgICBpZiBub3QgdmVyc2lvbjoKICAgICAgICByYWlzZSBVbnN1cHBvcnRlZFdoZWVsKAogICAgICAgICAgICAiJXMgaXMgaW4gYW4gdW5zdXBwb3J0ZWQgb3IgaW52YWxpZCB3aGVlbCIgJSBuYW1lCiAgICAgICAgKQogICAgaWYgdmVyc2lvblswXSA+IFZFUlNJT05fQ09NUEFUSUJMRVswXToKICAgICAgICByYWlzZSBVbnN1cHBvcnRlZFdoZWVsKAogICAgICAgICAgICAiJXMncyBXaGVlbC1WZXJzaW9uICglcykgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGlzIHZlcnNpb24gIgogICAgICAgICAgICAib2YgcGlwIiAlIChuYW1lLCAnLicuam9pbihtYXAoc3RyLCB2ZXJzaW9uKSkpCiAgICAgICAgKQogICAgZWxpZiB2ZXJzaW9uID4gVkVSU0lPTl9DT01QQVRJQkxFOgogICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAnSW5zdGFsbGluZyBmcm9tIGEgbmV3ZXIgV2hlZWwtVmVyc2lvbiAoJXMpJywKICAgICAgICAgICAgJy4nLmpvaW4obWFwKHN0ciwgdmVyc2lvbikpLAogICAgICAgICkKCgpjbGFzcyBXaGVlbChvYmplY3QpOgogICAgIiIiQSB3aGVlbCBmaWxlIiIiCgogICAgIyBUT0RPOiBtYXliZSBtb3ZlIHRoZSBpbnN0YWxsIGNvZGUgaW50byB0aGlzIGNsYXNzCgogICAgd2hlZWxfZmlsZV9yZSA9IHJlLmNvbXBpbGUoCiAgICAgICAgciIiIl4oP1A8bmFtZXZlcj4oP1A8bmFtZT4uKz8pLSg/UDx2ZXI+XGQuKj8pKQogICAgICAgICgoLSg/UDxidWlsZD5cZC4qPykpPy0oP1A8cHl2ZXI+Lis/KS0oP1A8YWJpPi4rPyktKD9QPHBsYXQ+Lis/KQogICAgICAgIFwud2hsfFwuZGlzdC1pbmZvKSQiIiIsCiAgICAgICAgcmUuVkVSQk9TRQogICAgKQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlbmFtZSk6CiAgICAgICAgIiIiCiAgICAgICAgOnJhaXNlcyBJbnZhbGlkV2hlZWxGaWxlbmFtZTogd2hlbiB0aGUgZmlsZW5hbWUgaXMgaW52YWxpZCBmb3IgYSB3aGVlbAogICAgICAgICIiIgogICAgICAgIHdoZWVsX2luZm8gPSBzZWxmLndoZWVsX2ZpbGVfcmUubWF0Y2goZmlsZW5hbWUpCiAgICAgICAgaWYgbm90IHdoZWVsX2luZm86CiAgICAgICAgICAgIHJhaXNlIEludmFsaWRXaGVlbEZpbGVuYW1lKAogICAgICAgICAgICAgICAgIiVzIGlzIG5vdCBhIHZhbGlkIHdoZWVsIGZpbGVuYW1lLiIgJSBmaWxlbmFtZQogICAgICAgICAgICApCiAgICAgICAgc2VsZi5maWxlbmFtZSA9IGZpbGVuYW1lCiAgICAgICAgc2VsZi5uYW1lID0gd2hlZWxfaW5mby5ncm91cCgnbmFtZScpLnJlcGxhY2UoJ18nLCAnLScpCiAgICAgICAgIyB3ZSdsbCBhc3N1bWUgIl8iIG1lYW5zICItIiBkdWUgdG8gd2hlZWwgbmFtaW5nIHNjaGVtZQogICAgICAgICMgKGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3BpcC9pc3N1ZXMvMTE1MCkKICAgICAgICBzZWxmLnZlcnNpb24gPSB3aGVlbF9pbmZvLmdyb3VwKCd2ZXInKS5yZXBsYWNlKCdfJywgJy0nKQogICAgICAgIHNlbGYucHl2ZXJzaW9ucyA9IHdoZWVsX2luZm8uZ3JvdXAoJ3B5dmVyJykuc3BsaXQoJy4nKQogICAgICAgIHNlbGYuYWJpcyA9IHdoZWVsX2luZm8uZ3JvdXAoJ2FiaScpLnNwbGl0KCcuJykKICAgICAgICBzZWxmLnBsYXRzID0gd2hlZWxfaW5mby5ncm91cCgncGxhdCcpLnNwbGl0KCcuJykKCiAgICAgICAgIyBBbGwgdGhlIHRhZyBjb21iaW5hdGlvbnMgZnJvbSB0aGlzIGZpbGUKICAgICAgICBzZWxmLmZpbGVfdGFncyA9IHNldCgKICAgICAgICAgICAgKHgsIHksIHopIGZvciB4IGluIHNlbGYucHl2ZXJzaW9ucwogICAgICAgICAgICBmb3IgeSBpbiBzZWxmLmFiaXMgZm9yIHogaW4gc2VsZi5wbGF0cwogICAgICAgICkKCiAgICBkZWYgc3VwcG9ydF9pbmRleF9taW4oc2VsZiwgdGFncz1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gdGhlIGxvd2VzdCBpbmRleCB0aGF0IG9uZSBvZiB0aGUgd2hlZWwncyBmaWxlX3RhZyBjb21iaW5hdGlvbnMKICAgICAgICBhY2hpZXZlcyBpbiB0aGUgc3VwcG9ydGVkX3RhZ3MgbGlzdCBlLmcuIGlmIHRoZXJlIGFyZSA4IHN1cHBvcnRlZCB0YWdzLAogICAgICAgIGFuZCBvbmUgb2YgdGhlIGZpbGUgdGFncyBpcyBmaXJzdCBpbiB0aGUgbGlzdCwgdGhlbiByZXR1cm4gMC4gIFJldHVybnMKICAgICAgICBOb25lIGlzIHRoZSB3aGVlbCBpcyBub3Qgc3VwcG9ydGVkLgogICAgICAgICIiIgogICAgICAgIGlmIHRhZ3MgaXMgTm9uZTogICMgZm9yIG1vY2sKICAgICAgICAgICAgdGFncyA9IHBlcDQyNXRhZ3Muc3VwcG9ydGVkX3RhZ3MKICAgICAgICBpbmRleGVzID0gW3RhZ3MuaW5kZXgoYykgZm9yIGMgaW4gc2VsZi5maWxlX3RhZ3MgaWYgYyBpbiB0YWdzXQogICAgICAgIHJldHVybiBtaW4oaW5kZXhlcykgaWYgaW5kZXhlcyBlbHNlIE5vbmUKCiAgICBkZWYgc3VwcG9ydGVkKHNlbGYsIHRhZ3M9Tm9uZSk6CiAgICAgICAgIiIiSXMgdGhpcyB3aGVlbCBzdXBwb3J0ZWQgb24gdGhpcyBzeXN0ZW0/IiIiCiAgICAgICAgaWYgdGFncyBpcyBOb25lOiAgIyBmb3IgbW9jawogICAgICAgICAgICB0YWdzID0gcGVwNDI1dGFncy5zdXBwb3J0ZWRfdGFncwogICAgICAgIHJldHVybiBib29sKHNldCh0YWdzKS5pbnRlcnNlY3Rpb24oc2VsZi5maWxlX3RhZ3MpKQoKCmNsYXNzIFdoZWVsQnVpbGRlcihvYmplY3QpOgogICAgIiIiQnVpbGQgd2hlZWxzIGZyb20gYSBSZXF1aXJlbWVudFNldC4iIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgcmVxdWlyZW1lbnRfc2V0LCBmaW5kZXIsIGJ1aWxkX29wdGlvbnM9Tm9uZSwKICAgICAgICAgICAgICAgICBnbG9iYWxfb3B0aW9ucz1Ob25lKToKICAgICAgICBzZWxmLnJlcXVpcmVtZW50X3NldCA9IHJlcXVpcmVtZW50X3NldAogICAgICAgIHNlbGYuZmluZGVyID0gZmluZGVyCiAgICAgICAgc2VsZi5fY2FjaGVfcm9vdCA9IHJlcXVpcmVtZW50X3NldC5fd2hlZWxfY2FjaGUuX2NhY2hlX2RpcgogICAgICAgIHNlbGYuX3doZWVsX2RpciA9IHJlcXVpcmVtZW50X3NldC53aGVlbF9kb3dubG9hZF9kaXIKICAgICAgICBzZWxmLmJ1aWxkX29wdGlvbnMgPSBidWlsZF9vcHRpb25zIG9yIFtdCiAgICAgICAgc2VsZi5nbG9iYWxfb3B0aW9ucyA9IGdsb2JhbF9vcHRpb25zIG9yIFtdCgogICAgZGVmIF9idWlsZF9vbmUoc2VsZiwgcmVxLCBvdXRwdXRfZGlyLCBweXRob25fdGFnPU5vbmUpOgogICAgICAgICIiIkJ1aWxkIG9uZSB3aGVlbC4KCiAgICAgICAgOnJldHVybjogVGhlIGZpbGVuYW1lIG9mIHRoZSBidWlsdCB3aGVlbCwgb3IgTm9uZSBpZiB0aGUgYnVpbGQgZmFpbGVkLgogICAgICAgICIiIgogICAgICAgIHRlbXBkID0gdGVtcGZpbGUubWtkdGVtcCgncGlwLXdoZWVsLScpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBpZiBzZWxmLl9fYnVpbGRfb25lKHJlcSwgdGVtcGQsIHB5dGhvbl90YWc9cHl0aG9uX3RhZyk6CiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgd2hlZWxfbmFtZSA9IG9zLmxpc3RkaXIodGVtcGQpWzBdCiAgICAgICAgICAgICAgICAgICAgd2hlZWxfcGF0aCA9IG9zLnBhdGguam9pbihvdXRwdXRfZGlyLCB3aGVlbF9uYW1lKQogICAgICAgICAgICAgICAgICAgIHNodXRpbC5tb3ZlKG9zLnBhdGguam9pbih0ZW1wZCwgd2hlZWxfbmFtZSksIHdoZWVsX3BhdGgpCiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ1N0b3JlZCBpbiBkaXJlY3Rvcnk6ICVzJywgb3V0cHV0X2RpcikKICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2hlZWxfcGF0aAogICAgICAgICAgICAgICAgZXhjZXB0OgogICAgICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgIyBJZ25vcmUgcmV0dXJuLCB3ZSBjYW4ndCBkbyBhbnl0aGluZyBlbHNlIHVzZWZ1bC4KICAgICAgICAgICAgc2VsZi5fY2xlYW5fb25lKHJlcSkKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBybXRyZWUodGVtcGQpCgogICAgZGVmIF9iYXNlX3NldHVwX2FyZ3Moc2VsZiwgcmVxKToKICAgICAgICByZXR1cm4gWwogICAgICAgICAgICBzeXMuZXhlY3V0YWJsZSwgIi11IiwgJy1jJywKICAgICAgICAgICAgU0VUVVBUT09MU19TSElNICUgcmVxLnNldHVwX3B5CiAgICAgICAgXSArIGxpc3Qoc2VsZi5nbG9iYWxfb3B0aW9ucykKCiAgICBkZWYgX19idWlsZF9vbmUoc2VsZiwgcmVxLCB0ZW1wZCwgcHl0aG9uX3RhZz1Ob25lKToKICAgICAgICBiYXNlX2FyZ3MgPSBzZWxmLl9iYXNlX3NldHVwX2FyZ3MocmVxKQoKICAgICAgICBzcGluX21lc3NhZ2UgPSAnUnVubmluZyBzZXR1cC5weSBiZGlzdF93aGVlbCBmb3IgJXMnICUgKHJlcS5uYW1lLCkKICAgICAgICB3aXRoIG9wZW5fc3Bpbm5lcihzcGluX21lc3NhZ2UpIGFzIHNwaW5uZXI6CiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnRGVzdGluYXRpb24gZGlyZWN0b3J5OiAlcycsIHRlbXBkKQogICAgICAgICAgICB3aGVlbF9hcmdzID0gYmFzZV9hcmdzICsgWydiZGlzdF93aGVlbCcsICctZCcsIHRlbXBkXSBcCiAgICAgICAgICAgICAgICArIHNlbGYuYnVpbGRfb3B0aW9ucwoKICAgICAgICAgICAgaWYgcHl0aG9uX3RhZyBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIHdoZWVsX2FyZ3MgKz0gWyItLXB5dGhvbi10YWciLCBweXRob25fdGFnXQoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgY2FsbF9zdWJwcm9jZXNzKHdoZWVsX2FyZ3MsIGN3ZD1yZXEuc2V0dXBfcHlfZGlyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dfc3Rkb3V0PUZhbHNlLCBzcGlubmVyPXNwaW5uZXIpCiAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgICAgICBzcGlubmVyLmZpbmlzaCgiZXJyb3IiKQogICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdGYWlsZWQgYnVpbGRpbmcgd2hlZWwgZm9yICVzJywgcmVxLm5hbWUpCiAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgX2NsZWFuX29uZShzZWxmLCByZXEpOgogICAgICAgIGJhc2VfYXJncyA9IHNlbGYuX2Jhc2Vfc2V0dXBfYXJncyhyZXEpCgogICAgICAgIGxvZ2dlci5pbmZvKCdSdW5uaW5nIHNldHVwLnB5IGNsZWFuIGZvciAlcycsIHJlcS5uYW1lKQogICAgICAgIGNsZWFuX2FyZ3MgPSBiYXNlX2FyZ3MgKyBbJ2NsZWFuJywgJy0tYWxsJ10KICAgICAgICB0cnk6CiAgICAgICAgICAgIGNhbGxfc3VicHJvY2VzcyhjbGVhbl9hcmdzLCBjd2Q9cmVxLnNvdXJjZV9kaXIsIHNob3dfc3Rkb3V0PUZhbHNlKQogICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdGYWlsZWQgY2xlYW5pbmcgYnVpbGQgZGlyIGZvciAlcycsIHJlcS5uYW1lKQogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgYnVpbGQoc2VsZiwgYXV0b2J1aWxkaW5nPUZhbHNlKToKICAgICAgICAiIiJCdWlsZCB3aGVlbHMuCgogICAgICAgIDpwYXJhbSB1bnBhY2s6IElmIFRydWUsIHJlcGxhY2UgdGhlIHNkaXN0IHdlIGJ1aWx0IGZyb20gd2l0aCB0aGUKICAgICAgICAgICAgbmV3bHkgYnVpbHQgd2hlZWwsIGluIHByZXBhcmF0aW9uIGZvciBpbnN0YWxsYXRpb24uCiAgICAgICAgOnJldHVybjogVHJ1ZSBpZiBhbGwgdGhlIHdoZWVscyBidWlsdCBjb3JyZWN0bHkuCiAgICAgICAgIiIiCiAgICAgICAgYXNzZXJ0IHNlbGYuX3doZWVsX2RpciBvciAoYXV0b2J1aWxkaW5nIGFuZCBzZWxmLl9jYWNoZV9yb290KQogICAgICAgICMgdW5wYWNrIHNkaXN0cyBhbmQgY29uc3RydWN0cyByZXEgc2V0CiAgICAgICAgc2VsZi5yZXF1aXJlbWVudF9zZXQucHJlcGFyZV9maWxlcyhzZWxmLmZpbmRlcikKCiAgICAgICAgcmVxc2V0ID0gc2VsZi5yZXF1aXJlbWVudF9zZXQucmVxdWlyZW1lbnRzLnZhbHVlcygpCgogICAgICAgIGJ1aWxkc2V0ID0gW10KICAgICAgICBmb3IgcmVxIGluIHJlcXNldDoKICAgICAgICAgICAgaWYgcmVxLmNvbnN0cmFpbnQ6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBpZiByZXEuaXNfd2hlZWw6CiAgICAgICAgICAgICAgICBpZiBub3QgYXV0b2J1aWxkaW5nOgogICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKAogICAgICAgICAgICAgICAgICAgICAgICAnU2tpcHBpbmcgJXMsIGR1ZSB0byBhbHJlYWR5IGJlaW5nIHdoZWVsLicsIHJlcS5uYW1lKQogICAgICAgICAgICBlbGlmIGF1dG9idWlsZGluZyBhbmQgcmVxLmVkaXRhYmxlOgogICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICBlbGlmIGF1dG9idWlsZGluZyBhbmQgcmVxLmxpbmsgYW5kIG5vdCByZXEubGluay5pc19hcnRpZmFjdDoKICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgZWxpZiBhdXRvYnVpbGRpbmcgYW5kIG5vdCByZXEuc291cmNlX2RpcjoKICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGlmIGF1dG9idWlsZGluZzoKICAgICAgICAgICAgICAgICAgICBsaW5rID0gcmVxLmxpbmsKICAgICAgICAgICAgICAgICAgICBiYXNlLCBleHQgPSBsaW5rLnNwbGl0ZXh0KCkKICAgICAgICAgICAgICAgICAgICBpZiBwaXAuaW5kZXguZWdnX2luZm9fbWF0Y2hlcyhiYXNlLCBOb25lLCBsaW5rKSBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgICAgICAjIERvZXNuJ3QgbG9vayBsaWtlIGEgcGFja2FnZSAtIGRvbid0IGF1dG9idWlsZCBhIHdoZWVsCiAgICAgICAgICAgICAgICAgICAgICAgICMgYmVjYXVzZSB3ZSdsbCBoYXZlIG5vIHdheSB0byBsb29rdXAgdGhlIHJlc3VsdCBzYW5lbHkKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgICAgICBpZiAiYmluYXJ5IiBub3QgaW4gcGlwLmluZGV4LmZtdF9jdGxfZm9ybWF0cygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmluZGVyLmZvcm1hdF9jb250cm9sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Fub25pY2FsaXplX25hbWUocmVxLm5hbWUpKToKICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2tpcHBpbmcgYmRpc3Rfd2hlZWwgZm9yICVzLCBkdWUgdG8gYmluYXJpZXMgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgImJlaW5nIGRpc2FibGVkIGZvciBpdC4iLCByZXEubmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIGJ1aWxkc2V0LmFwcGVuZChyZXEpCgogICAgICAgIGlmIG5vdCBidWlsZHNldDoKICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICAgICAgIyBCdWlsZCB0aGUgd2hlZWxzLgogICAgICAgIGxvZ2dlci5pbmZvKAogICAgICAgICAgICAnQnVpbGRpbmcgd2hlZWxzIGZvciBjb2xsZWN0ZWQgcGFja2FnZXM6ICVzJywKICAgICAgICAgICAgJywgJy5qb2luKFtyZXEubmFtZSBmb3IgcmVxIGluIGJ1aWxkc2V0XSksCiAgICAgICAgKQogICAgICAgIHdpdGggaW5kZW50X2xvZygpOgogICAgICAgICAgICBidWlsZF9zdWNjZXNzLCBidWlsZF9mYWlsdXJlID0gW10sIFtdCiAgICAgICAgICAgIGZvciByZXEgaW4gYnVpbGRzZXQ6CiAgICAgICAgICAgICAgICBweXRob25fdGFnID0gTm9uZQogICAgICAgICAgICAgICAgaWYgYXV0b2J1aWxkaW5nOgogICAgICAgICAgICAgICAgICAgIHB5dGhvbl90YWcgPSBwZXA0MjV0YWdzLmltcGxlbWVudGF0aW9uX3RhZwogICAgICAgICAgICAgICAgICAgIG91dHB1dF9kaXIgPSBfY2FjaGVfZm9yX2xpbmsoc2VsZi5fY2FjaGVfcm9vdCwgcmVxLmxpbmspCiAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICBlbnN1cmVfZGlyKG91dHB1dF9kaXIpCiAgICAgICAgICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3IgYXMgZToKICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoIkJ1aWxkaW5nIHdoZWVsIGZvciAlcyBmYWlsZWQ6ICVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxLm5hbWUsIGUpCiAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkX2ZhaWx1cmUuYXBwZW5kKHJlcSkKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2RpciA9IHNlbGYuX3doZWVsX2RpcgogICAgICAgICAgICAgICAgd2hlZWxfZmlsZSA9IHNlbGYuX2J1aWxkX29uZSgKICAgICAgICAgICAgICAgICAgICByZXEsIG91dHB1dF9kaXIsCiAgICAgICAgICAgICAgICAgICAgcHl0aG9uX3RhZz1weXRob25fdGFnLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgaWYgd2hlZWxfZmlsZToKICAgICAgICAgICAgICAgICAgICBidWlsZF9zdWNjZXNzLmFwcGVuZChyZXEpCiAgICAgICAgICAgICAgICAgICAgaWYgYXV0b2J1aWxkaW5nOgogICAgICAgICAgICAgICAgICAgICAgICAjIFhYWDogVGhpcyBpcyBtaWxkbHkgZHVwbGljYXRpdmUgd2l0aCBwcmVwYXJlX2ZpbGVzLAogICAgICAgICAgICAgICAgICAgICAgICAjIGJ1dCBub3QgY2xvc2UgZW5vdWdoIHRvIHB1bGwgb3V0IHRvIGEgc2luZ2xlIGNvbW1vbgogICAgICAgICAgICAgICAgICAgICAgICAjIG1ldGhvZC4KICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGUgY29kZSBiZWxvdyBhc3N1bWVzIHRlbXBvcmFyeSBzb3VyY2UgZGlycyAtCiAgICAgICAgICAgICAgICAgICAgICAgICMgcHJldmVudCBpdCBkb2luZyBiYWQgdGhpbmdzLgogICAgICAgICAgICAgICAgICAgICAgICBpZiByZXEuc291cmNlX2RpciBhbmQgbm90IG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXEuc291cmNlX2RpciwgUElQX0RFTEVURV9NQVJLRVJfRklMRU5BTUUpKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYWQgc291cmNlIGRpciAtIG1pc3NpbmcgbWFya2VyIikKICAgICAgICAgICAgICAgICAgICAgICAgIyBEZWxldGUgdGhlIHNvdXJjZSB3ZSBidWlsdCB0aGUgd2hlZWwgZnJvbQogICAgICAgICAgICAgICAgICAgICAgICByZXEucmVtb3ZlX3RlbXBvcmFyeV9zb3VyY2UoKQogICAgICAgICAgICAgICAgICAgICAgICAjIHNldCB0aGUgYnVpbGQgZGlyZWN0b3J5IGFnYWluIC0gbmFtZSBpcyBrbm93biBmcm9tCiAgICAgICAgICAgICAgICAgICAgICAgICMgdGhlIHdvcmsgcHJlcGFyZV9maWxlcyBkaWQuCiAgICAgICAgICAgICAgICAgICAgICAgIHJlcS5zb3VyY2VfZGlyID0gcmVxLmJ1aWxkX2xvY2F0aW9uKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXF1aXJlbWVudF9zZXQuYnVpbGRfZGlyKQogICAgICAgICAgICAgICAgICAgICAgICAjIFVwZGF0ZSB0aGUgbGluayBmb3IgdGhpcy4KICAgICAgICAgICAgICAgICAgICAgICAgcmVxLmxpbmsgPSBwaXAuaW5kZXguTGluaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhfdG9fdXJsKHdoZWVsX2ZpbGUpKQogICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQgcmVxLmxpbmsuaXNfd2hlZWwKICAgICAgICAgICAgICAgICAgICAgICAgIyBleHRyYWN0IHRoZSB3aGVlbCBpbnRvIHRoZSBkaXIKICAgICAgICAgICAgICAgICAgICAgICAgdW5wYWNrX3VybCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcS5saW5rLCByZXEuc291cmNlX2RpciwgTm9uZSwgRmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uPXNlbGYucmVxdWlyZW1lbnRfc2V0LnNlc3Npb24pCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGJ1aWxkX2ZhaWx1cmUuYXBwZW5kKHJlcSkKCiAgICAgICAgIyBub3RpZnkgc3VjY2Vzcy9mYWlsdXJlCiAgICAgICAgaWYgYnVpbGRfc3VjY2VzczoKICAgICAgICAgICAgbG9nZ2VyLmluZm8oCiAgICAgICAgICAgICAgICAnU3VjY2Vzc2Z1bGx5IGJ1aWx0ICVzJywKICAgICAgICAgICAgICAgICcgJy5qb2luKFtyZXEubmFtZSBmb3IgcmVxIGluIGJ1aWxkX3N1Y2Nlc3NdKSwKICAgICAgICAgICAgKQogICAgICAgIGlmIGJ1aWxkX2ZhaWx1cmU6CiAgICAgICAgICAgIGxvZ2dlci5pbmZvKAogICAgICAgICAgICAgICAgJ0ZhaWxlZCB0byBidWlsZCAlcycsCiAgICAgICAgICAgICAgICAnICcuam9pbihbcmVxLm5hbWUgZm9yIHJlcSBpbiBidWlsZF9mYWlsdXJlXSksCiAgICAgICAgICAgICkKICAgICAgICAjIFJldHVybiBUcnVlIGlmIGFsbCBidWlsZHMgd2VyZSBzdWNjZXNzZnVsCiAgICAgICAgcmV0dXJuIGxlbihidWlsZF9mYWlsdXJlKSA9PSAwClBLAwQUAAAAAAAAACEAAAAAAAAAAAAAAAAAMAAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9fX2luaXRfXy5weVBLAwQUAAAAAAAAACEAXE+6RX4AAAB+AAAANAAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9lYXN5X2luc3RhbGwucHkiIiJSdW4gdGhlIEVhc3lJbnN0YWxsIGNvbW1hbmQiIiIKCmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICBmcm9tIHNldHVwdG9vbHMuY29tbWFuZC5lYXN5X2luc3RhbGwgaW1wb3J0IG1haW4KICAgIG1haW4oKQpQSwMEFAAAAAAAAAAhABxssk89pwEAPacBAD4AAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvcGtnX3Jlc291cmNlcy9fX2luaXRfXy5weSMgY29kaW5nOiB1dGYtOAoiIiIKUGFja2FnZSByZXNvdXJjZSBBUEkKLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkEgcmVzb3VyY2UgaXMgYSBsb2dpY2FsIGZpbGUgY29udGFpbmVkIHdpdGhpbiBhIHBhY2thZ2UsIG9yIGEgbG9naWNhbApzdWJkaXJlY3RvcnkgdGhlcmVvZi4gIFRoZSBwYWNrYWdlIHJlc291cmNlIEFQSSBleHBlY3RzIHJlc291cmNlIG5hbWVzCnRvIGhhdmUgdGhlaXIgcGF0aCBwYXJ0cyBzZXBhcmF0ZWQgd2l0aCBgYC9gYCwgKm5vdCogd2hhdGV2ZXIgdGhlIGxvY2FsCnBhdGggc2VwYXJhdG9yIGlzLiAgRG8gbm90IHVzZSBvcy5wYXRoIG9wZXJhdGlvbnMgdG8gbWFuaXB1bGF0ZSByZXNvdXJjZQpuYW1lcyBiZWluZyBwYXNzZWQgaW50byB0aGUgQVBJLgoKVGhlIHBhY2thZ2UgcmVzb3VyY2UgQVBJIGlzIGRlc2lnbmVkIHRvIHdvcmsgd2l0aCBub3JtYWwgZmlsZXN5c3RlbSBwYWNrYWdlcywKLmVnZyBmaWxlcywgYW5kIHVucGFja2VkIC5lZ2cgZmlsZXMuICBJdCBjYW4gYWxzbyB3b3JrIGluIGEgbGltaXRlZCB3YXkgd2l0aAouemlwIGZpbGVzIGFuZCB3aXRoIGN1c3RvbSBQRVAgMzAyIGxvYWRlcnMgdGhhdCBzdXBwb3J0IHRoZSBgYGdldF9kYXRhKClgYAptZXRob2QuCiIiIgoKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBzeXMKaW1wb3J0IG9zCmltcG9ydCBpbwppbXBvcnQgdGltZQppbXBvcnQgcmUKaW1wb3J0IHR5cGVzCmltcG9ydCB6aXBmaWxlCmltcG9ydCB6aXBpbXBvcnQKaW1wb3J0IHdhcm5pbmdzCmltcG9ydCBzdGF0CmltcG9ydCBmdW5jdG9vbHMKaW1wb3J0IHBrZ3V0aWwKaW1wb3J0IG9wZXJhdG9yCmltcG9ydCBwbGF0Zm9ybQppbXBvcnQgY29sbGVjdGlvbnMKaW1wb3J0IHBsaXN0bGliCmltcG9ydCBlbWFpbC5wYXJzZXIKaW1wb3J0IGVycm5vCmltcG9ydCB0ZW1wZmlsZQppbXBvcnQgdGV4dHdyYXAKaW1wb3J0IGl0ZXJ0b29scwppbXBvcnQgaW5zcGVjdAppbXBvcnQgbnRwYXRoCmltcG9ydCBwb3NpeHBhdGgKZnJvbSBwa2d1dGlsIGltcG9ydCBnZXRfaW1wb3J0ZXIKCnRyeToKICAgIGltcG9ydCBfaW1wCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICMgUHl0aG9uIDMuMiBjb21wYXRpYmlsaXR5CiAgICBpbXBvcnQgaW1wIGFzIF9pbXAKCnRyeToKICAgIEZpbGVFeGlzdHNFcnJvcgpleGNlcHQgTmFtZUVycm9yOgogICAgRmlsZUV4aXN0c0Vycm9yID0gT1NFcnJvcgoKZnJvbSBwa2dfcmVzb3VyY2VzLmV4dGVybiBpbXBvcnQgc2l4CmZyb20gcGtnX3Jlc291cmNlcy5leHRlcm4uc2l4Lm1vdmVzIGltcG9ydCB1cmxsaWIsIG1hcCwgZmlsdGVyCgojIGNhcHR1cmUgdGhlc2UgdG8gYnlwYXNzIHNhbmRib3hpbmcKZnJvbSBvcyBpbXBvcnQgdXRpbWUKdHJ5OgogICAgZnJvbSBvcyBpbXBvcnQgbWtkaXIsIHJlbmFtZSwgdW5saW5rCiAgICBXUklURV9TVVBQT1JUID0gVHJ1ZQpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAjIG5vIHdyaXRlIHN1cHBvcnQsIHByb2JhYmx5IHVuZGVyIEdBRQogICAgV1JJVEVfU1VQUE9SVCA9IEZhbHNlCgpmcm9tIG9zIGltcG9ydCBvcGVuIGFzIG9zX29wZW4KZnJvbSBvcy5wYXRoIGltcG9ydCBpc2Rpciwgc3BsaXQKCnRyeToKICAgIGltcG9ydCBpbXBvcnRsaWIubWFjaGluZXJ5IGFzIGltcG9ydGxpYl9tYWNoaW5lcnkKICAgICMgYWNjZXNzIGF0dHJpYnV0ZSB0byBmb3JjZSBpbXBvcnQgdW5kZXIgZGVsYXllZCBpbXBvcnQgbWVjaGFuaXNtcy4KICAgIGltcG9ydGxpYl9tYWNoaW5lcnkuX19uYW1lX18KZXhjZXB0IEltcG9ydEVycm9yOgogICAgaW1wb3J0bGliX21hY2hpbmVyeSA9IE5vbmUKCmZyb20gLiBpbXBvcnQgcHkzMWNvbXBhdApmcm9tIHBrZ19yZXNvdXJjZXMuZXh0ZXJuIGltcG9ydCBhcHBkaXJzCmZyb20gcGtnX3Jlc291cmNlcy5leHRlcm4gaW1wb3J0IHBhY2thZ2luZwpfX2ltcG9ydF9fKCdwa2dfcmVzb3VyY2VzLmV4dGVybi5wYWNrYWdpbmcudmVyc2lvbicpCl9faW1wb3J0X18oJ3BrZ19yZXNvdXJjZXMuZXh0ZXJuLnBhY2thZ2luZy5zcGVjaWZpZXJzJykKX19pbXBvcnRfXygncGtnX3Jlc291cmNlcy5leHRlcm4ucGFja2FnaW5nLnJlcXVpcmVtZW50cycpCl9faW1wb3J0X18oJ3BrZ19yZXNvdXJjZXMuZXh0ZXJuLnBhY2thZ2luZy5tYXJrZXJzJykKCgpfX21ldGFjbGFzc19fID0gdHlwZQoKCmlmICgzLCAwKSA8IHN5cy52ZXJzaW9uX2luZm8gPCAoMywgNSk6CiAgICByYWlzZSBSdW50aW1lRXJyb3IoIlB5dGhvbiAzLjUgb3IgbGF0ZXIgaXMgcmVxdWlyZWQiKQoKaWYgc2l4LlBZMjoKICAgICMgVGhvc2UgYnVpbHRpbiBleGNlcHRpb25zIGFyZSBvbmx5IGRlZmluZWQgaW4gUHl0aG9uIDMKICAgIFBlcm1pc3Npb25FcnJvciA9IE5vbmUKICAgIE5vdEFEaXJlY3RvcnlFcnJvciA9IE5vbmUKCiMgZGVjbGFyZSBzb21lIGdsb2JhbHMgdGhhdCB3aWxsIGJlIGRlZmluZWQgbGF0ZXIgdG8KIyBzYXRpc2Z5IHRoZSBsaW50ZXJzLgpyZXF1aXJlID0gTm9uZQp3b3JraW5nX3NldCA9IE5vbmUKYWRkX2FjdGl2YXRpb25fbGlzdGVuZXIgPSBOb25lCnJlc291cmNlc19zdHJlYW0gPSBOb25lCmNsZWFudXBfcmVzb3VyY2VzID0gTm9uZQpyZXNvdXJjZV9kaXIgPSBOb25lCnJlc291cmNlX3N0cmVhbSA9IE5vbmUKc2V0X2V4dHJhY3Rpb25fcGF0aCA9IE5vbmUKcmVzb3VyY2VfaXNkaXIgPSBOb25lCnJlc291cmNlX3N0cmluZyA9IE5vbmUKaXRlcl9lbnRyeV9wb2ludHMgPSBOb25lCnJlc291cmNlX2xpc3RkaXIgPSBOb25lCnJlc291cmNlX2ZpbGVuYW1lID0gTm9uZQpyZXNvdXJjZV9leGlzdHMgPSBOb25lCl9kaXN0cmlidXRpb25fZmluZGVycyA9IE5vbmUKX25hbWVzcGFjZV9oYW5kbGVycyA9IE5vbmUKX25hbWVzcGFjZV9wYWNrYWdlcyA9IE5vbmUKCgpjbGFzcyBQRVA0NDBXYXJuaW5nKFJ1bnRpbWVXYXJuaW5nKToKICAgICIiIgogICAgVXNlZCB3aGVuIHRoZXJlIGlzIGFuIGlzc3VlIHdpdGggYSB2ZXJzaW9uIG9yIHNwZWNpZmllciBub3QgY29tcGx5aW5nIHdpdGgKICAgIFBFUCA0NDAuCiAgICAiIiIKCgpkZWYgcGFyc2VfdmVyc2lvbih2KToKICAgIHRyeToKICAgICAgICByZXR1cm4gcGFja2FnaW5nLnZlcnNpb24uVmVyc2lvbih2KQogICAgZXhjZXB0IHBhY2thZ2luZy52ZXJzaW9uLkludmFsaWRWZXJzaW9uOgogICAgICAgIHJldHVybiBwYWNrYWdpbmcudmVyc2lvbi5MZWdhY3lWZXJzaW9uKHYpCgoKX3N0YXRlX3ZhcnMgPSB7fQoKCmRlZiBfZGVjbGFyZV9zdGF0ZSh2YXJ0eXBlLCAqKmt3KToKICAgIGdsb2JhbHMoKS51cGRhdGUoa3cpCiAgICBfc3RhdGVfdmFycy51cGRhdGUoZGljdC5mcm9ta2V5cyhrdywgdmFydHlwZSkpCgoKZGVmIF9fZ2V0c3RhdGVfXygpOgogICAgc3RhdGUgPSB7fQogICAgZyA9IGdsb2JhbHMoKQogICAgZm9yIGssIHYgaW4gX3N0YXRlX3ZhcnMuaXRlbXMoKToKICAgICAgICBzdGF0ZVtrXSA9IGdbJ19zZ2V0XycgKyB2XShnW2tdKQogICAgcmV0dXJuIHN0YXRlCgoKZGVmIF9fc2V0c3RhdGVfXyhzdGF0ZSk6CiAgICBnID0gZ2xvYmFscygpCiAgICBmb3IgaywgdiBpbiBzdGF0ZS5pdGVtcygpOgogICAgICAgIGdbJ19zc2V0XycgKyBfc3RhdGVfdmFyc1trXV0oaywgZ1trXSwgdikKICAgIHJldHVybiBzdGF0ZQoKCmRlZiBfc2dldF9kaWN0KHZhbCk6CiAgICByZXR1cm4gdmFsLmNvcHkoKQoKCmRlZiBfc3NldF9kaWN0KGtleSwgb2IsIHN0YXRlKToKICAgIG9iLmNsZWFyKCkKICAgIG9iLnVwZGF0ZShzdGF0ZSkKCgpkZWYgX3NnZXRfb2JqZWN0KHZhbCk6CiAgICByZXR1cm4gdmFsLl9fZ2V0c3RhdGVfXygpCgoKZGVmIF9zc2V0X29iamVjdChrZXksIG9iLCBzdGF0ZSk6CiAgICBvYi5fX3NldHN0YXRlX18oc3RhdGUpCgoKX3NnZXRfbm9uZSA9IF9zc2V0X25vbmUgPSBsYW1iZGEgKmFyZ3M6IE5vbmUKCgpkZWYgZ2V0X3N1cHBvcnRlZF9wbGF0Zm9ybSgpOgogICAgIiIiUmV0dXJuIHRoaXMgcGxhdGZvcm0ncyBtYXhpbXVtIGNvbXBhdGlibGUgdmVyc2lvbi4KCiAgICBkaXN0dXRpbHMudXRpbC5nZXRfcGxhdGZvcm0oKSBub3JtYWxseSByZXBvcnRzIHRoZSBtaW5pbXVtIHZlcnNpb24KICAgIG9mIE1hYyBPUyBYIHRoYXQgd291bGQgYmUgcmVxdWlyZWQgdG8gKnVzZSogZXh0ZW5zaW9ucyBwcm9kdWNlZCBieQogICAgZGlzdHV0aWxzLiAgQnV0IHdoYXQgd2Ugd2FudCB3aGVuIGNoZWNraW5nIGNvbXBhdGliaWxpdHkgaXMgdG8ga25vdyB0aGUKICAgIHZlcnNpb24gb2YgTWFjIE9TIFggdGhhdCB3ZSBhcmUgKnJ1bm5pbmcqLiAgVG8gYWxsb3cgdXNhZ2Ugb2YgcGFja2FnZXMgdGhhdAogICAgZXhwbGljaXRseSByZXF1aXJlIGEgbmV3ZXIgdmVyc2lvbiBvZiBNYWMgT1MgWCwgd2UgbXVzdCBhbHNvIGtub3cgdGhlCiAgICBjdXJyZW50IHZlcnNpb24gb2YgdGhlIE9TLgoKICAgIElmIHRoaXMgY29uZGl0aW9uIG9jY3VycyBmb3IgYW55IG90aGVyIHBsYXRmb3JtIHdpdGggYSB2ZXJzaW9uIGluIGl0cwogICAgcGxhdGZvcm0gc3RyaW5ncywgdGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgZXh0ZW5kZWQgYWNjb3JkaW5nbHkuCiAgICAiIiIKICAgIHBsYXQgPSBnZXRfYnVpbGRfcGxhdGZvcm0oKQogICAgbSA9IG1hY29zVmVyc2lvblN0cmluZy5tYXRjaChwbGF0KQogICAgaWYgbSBpcyBub3QgTm9uZSBhbmQgc3lzLnBsYXRmb3JtID09ICJkYXJ3aW4iOgogICAgICAgIHRyeToKICAgICAgICAgICAgcGxhdCA9ICdtYWNvc3gtJXMtJXMnICUgKCcuJy5qb2luKF9tYWNvc3hfdmVycygpWzoyXSksIG0uZ3JvdXAoMykpCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICMgbm90IE1hYyBPUyBYCiAgICAgICAgICAgIHBhc3MKICAgIHJldHVybiBwbGF0CgoKX19hbGxfXyA9IFsKICAgICMgQmFzaWMgcmVzb3VyY2UgYWNjZXNzIGFuZCBkaXN0cmlidXRpb24vZW50cnkgcG9pbnQgZGlzY292ZXJ5CiAgICAncmVxdWlyZScsICdydW5fc2NyaXB0JywgJ2dldF9wcm92aWRlcicsICdnZXRfZGlzdHJpYnV0aW9uJywKICAgICdsb2FkX2VudHJ5X3BvaW50JywgJ2dldF9lbnRyeV9tYXAnLCAnZ2V0X2VudHJ5X2luZm8nLAogICAgJ2l0ZXJfZW50cnlfcG9pbnRzJywKICAgICdyZXNvdXJjZV9zdHJpbmcnLCAncmVzb3VyY2Vfc3RyZWFtJywgJ3Jlc291cmNlX2ZpbGVuYW1lJywKICAgICdyZXNvdXJjZV9saXN0ZGlyJywgJ3Jlc291cmNlX2V4aXN0cycsICdyZXNvdXJjZV9pc2RpcicsCgogICAgIyBFbnZpcm9ubWVudGFsIGNvbnRyb2wKICAgICdkZWNsYXJlX25hbWVzcGFjZScsICd3b3JraW5nX3NldCcsICdhZGRfYWN0aXZhdGlvbl9saXN0ZW5lcicsCiAgICAnZmluZF9kaXN0cmlidXRpb25zJywgJ3NldF9leHRyYWN0aW9uX3BhdGgnLCAnY2xlYW51cF9yZXNvdXJjZXMnLAogICAgJ2dldF9kZWZhdWx0X2NhY2hlJywKCiAgICAjIFByaW1hcnkgaW1wbGVtZW50YXRpb24gY2xhc3NlcwogICAgJ0Vudmlyb25tZW50JywgJ1dvcmtpbmdTZXQnLCAnUmVzb3VyY2VNYW5hZ2VyJywKICAgICdEaXN0cmlidXRpb24nLCAnUmVxdWlyZW1lbnQnLCAnRW50cnlQb2ludCcsCgogICAgIyBFeGNlcHRpb25zCiAgICAnUmVzb2x1dGlvbkVycm9yJywgJ1ZlcnNpb25Db25mbGljdCcsICdEaXN0cmlidXRpb25Ob3RGb3VuZCcsCiAgICAnVW5rbm93bkV4dHJhJywgJ0V4dHJhY3Rpb25FcnJvcicsCgogICAgIyBXYXJuaW5ncwogICAgJ1BFUDQ0MFdhcm5pbmcnLAoKICAgICMgUGFyc2luZyBmdW5jdGlvbnMgYW5kIHN0cmluZyB1dGlsaXRpZXMKICAgICdwYXJzZV9yZXF1aXJlbWVudHMnLCAncGFyc2VfdmVyc2lvbicsICdzYWZlX25hbWUnLCAnc2FmZV92ZXJzaW9uJywKICAgICdnZXRfcGxhdGZvcm0nLCAnY29tcGF0aWJsZV9wbGF0Zm9ybXMnLCAneWllbGRfbGluZXMnLCAnc3BsaXRfc2VjdGlvbnMnLAogICAgJ3NhZmVfZXh0cmEnLCAndG9fZmlsZW5hbWUnLCAnaW52YWxpZF9tYXJrZXInLCAnZXZhbHVhdGVfbWFya2VyJywKCiAgICAjIGZpbGVzeXN0ZW0gdXRpbGl0aWVzCiAgICAnZW5zdXJlX2RpcmVjdG9yeScsICdub3JtYWxpemVfcGF0aCcsCgogICAgIyBEaXN0cmlidXRpb24gInByZWNlZGVuY2UiIGNvbnN0YW50cwogICAgJ0VHR19ESVNUJywgJ0JJTkFSWV9ESVNUJywgJ1NPVVJDRV9ESVNUJywgJ0NIRUNLT1VUX0RJU1QnLCAnREVWRUxPUF9ESVNUJywKCiAgICAjICJQcm92aWRlciIgaW50ZXJmYWNlcywgaW1wbGVtZW50YXRpb25zLCBhbmQgcmVnaXN0cmF0aW9uL2xvb2t1cCBBUElzCiAgICAnSU1ldGFkYXRhUHJvdmlkZXInLCAnSVJlc291cmNlUHJvdmlkZXInLCAnRmlsZU1ldGFkYXRhJywKICAgICdQYXRoTWV0YWRhdGEnLCAnRWdnTWV0YWRhdGEnLCAnRW1wdHlQcm92aWRlcicsICdlbXB0eV9wcm92aWRlcicsCiAgICAnTnVsbFByb3ZpZGVyJywgJ0VnZ1Byb3ZpZGVyJywgJ0RlZmF1bHRQcm92aWRlcicsICdaaXBQcm92aWRlcicsCiAgICAncmVnaXN0ZXJfZmluZGVyJywgJ3JlZ2lzdGVyX25hbWVzcGFjZV9oYW5kbGVyJywgJ3JlZ2lzdGVyX2xvYWRlcl90eXBlJywKICAgICdmaXh1cF9uYW1lc3BhY2VfcGFja2FnZXMnLCAnZ2V0X2ltcG9ydGVyJywKCiAgICAjIFdhcm5pbmdzCiAgICAnUGtnUmVzb3VyY2VzRGVwcmVjYXRpb25XYXJuaW5nJywKCiAgICAjIERlcHJlY2F0ZWQvYmFja3dhcmQgY29tcGF0aWJpbGl0eSBvbmx5CiAgICAncnVuX21haW4nLCAnQXZhaWxhYmxlRGlzdHJpYnV0aW9ucycsCl0KCgpjbGFzcyBSZXNvbHV0aW9uRXJyb3IoRXhjZXB0aW9uKToKICAgICIiIkFic3RyYWN0IGJhc2UgZm9yIGRlcGVuZGVuY3kgcmVzb2x1dGlvbiBlcnJvcnMiIiIKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fICsgcmVwcihzZWxmLmFyZ3MpCgoKY2xhc3MgVmVyc2lvbkNvbmZsaWN0KFJlc29sdXRpb25FcnJvcik6CiAgICAiIiIKICAgIEFuIGFscmVhZHktaW5zdGFsbGVkIHZlcnNpb24gY29uZmxpY3RzIHdpdGggdGhlIHJlcXVlc3RlZCB2ZXJzaW9uLgoKICAgIFNob3VsZCBiZSBpbml0aWFsaXplZCB3aXRoIHRoZSBpbnN0YWxsZWQgRGlzdHJpYnV0aW9uIGFuZCB0aGUgcmVxdWVzdGVkCiAgICBSZXF1aXJlbWVudC4KICAgICIiIgoKICAgIF90ZW1wbGF0ZSA9ICJ7c2VsZi5kaXN0fSBpcyBpbnN0YWxsZWQgYnV0IHtzZWxmLnJlcX0gaXMgcmVxdWlyZWQiCgogICAgQHByb3BlcnR5CiAgICBkZWYgZGlzdChzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5hcmdzWzBdCgogICAgQHByb3BlcnR5CiAgICBkZWYgcmVxKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLmFyZ3NbMV0KCiAgICBkZWYgcmVwb3J0KHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl90ZW1wbGF0ZS5mb3JtYXQoKipsb2NhbHMoKSkKCiAgICBkZWYgd2l0aF9jb250ZXh0KHNlbGYsIHJlcXVpcmVkX2J5KToKICAgICAgICAiIiIKICAgICAgICBJZiByZXF1aXJlZF9ieSBpcyBub24tZW1wdHksIHJldHVybiBhIHZlcnNpb24gb2Ygc2VsZiB0aGF0IGlzIGEKICAgICAgICBDb250ZXh0dWFsVmVyc2lvbkNvbmZsaWN0LgogICAgICAgICIiIgogICAgICAgIGlmIG5vdCByZXF1aXJlZF9ieToKICAgICAgICAgICAgcmV0dXJuIHNlbGYKICAgICAgICBhcmdzID0gc2VsZi5hcmdzICsgKHJlcXVpcmVkX2J5LCkKICAgICAgICByZXR1cm4gQ29udGV4dHVhbFZlcnNpb25Db25mbGljdCgqYXJncykKCgpjbGFzcyBDb250ZXh0dWFsVmVyc2lvbkNvbmZsaWN0KFZlcnNpb25Db25mbGljdCk6CiAgICAiIiIKICAgIEEgVmVyc2lvbkNvbmZsaWN0IHRoYXQgYWNjZXB0cyBhIHRoaXJkIHBhcmFtZXRlciwgdGhlIHNldCBvZiB0aGUKICAgIHJlcXVpcmVtZW50cyB0aGF0IHJlcXVpcmVkIHRoZSBpbnN0YWxsZWQgRGlzdHJpYnV0aW9uLgogICAgIiIiCgogICAgX3RlbXBsYXRlID0gVmVyc2lvbkNvbmZsaWN0Ll90ZW1wbGF0ZSArICcgYnkge3NlbGYucmVxdWlyZWRfYnl9JwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHJlcXVpcmVkX2J5KHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLmFyZ3NbMl0KCgpjbGFzcyBEaXN0cmlidXRpb25Ob3RGb3VuZChSZXNvbHV0aW9uRXJyb3IpOgogICAgIiIiQSByZXF1ZXN0ZWQgZGlzdHJpYnV0aW9uIHdhcyBub3QgZm91bmQiIiIKCiAgICBfdGVtcGxhdGUgPSAoIlRoZSAne3NlbGYucmVxfScgZGlzdHJpYnV0aW9uIHdhcyBub3QgZm91bmQgIgogICAgICAgICAgICAgICAgICJhbmQgaXMgcmVxdWlyZWQgYnkge3NlbGYucmVxdWlyZXJzX3N0cn0iKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHJlcShzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5hcmdzWzBdCgogICAgQHByb3BlcnR5CiAgICBkZWYgcmVxdWlyZXJzKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLmFyZ3NbMV0KCiAgICBAcHJvcGVydHkKICAgIGRlZiByZXF1aXJlcnNfc3RyKHNlbGYpOgogICAgICAgIGlmIG5vdCBzZWxmLnJlcXVpcmVyczoKICAgICAgICAgICAgcmV0dXJuICd0aGUgYXBwbGljYXRpb24nCiAgICAgICAgcmV0dXJuICcsICcuam9pbihzZWxmLnJlcXVpcmVycykKCiAgICBkZWYgcmVwb3J0KHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl90ZW1wbGF0ZS5mb3JtYXQoKipsb2NhbHMoKSkKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5yZXBvcnQoKQoKCmNsYXNzIFVua25vd25FeHRyYShSZXNvbHV0aW9uRXJyb3IpOgogICAgIiIiRGlzdHJpYnV0aW9uIGRvZXNuJ3QgaGF2ZSBhbiAiZXh0cmEgZmVhdHVyZSIgb2YgdGhlIGdpdmVuIG5hbWUiIiIKCgpfcHJvdmlkZXJfZmFjdG9yaWVzID0ge30KClBZX01BSk9SID0gJ3t9Lnt9Jy5mb3JtYXQoKnN5cy52ZXJzaW9uX2luZm8pCkVHR19ESVNUID0gMwpCSU5BUllfRElTVCA9IDIKU09VUkNFX0RJU1QgPSAxCkNIRUNLT1VUX0RJU1QgPSAwCkRFVkVMT1BfRElTVCA9IC0xCgoKZGVmIHJlZ2lzdGVyX2xvYWRlcl90eXBlKGxvYWRlcl90eXBlLCBwcm92aWRlcl9mYWN0b3J5KToKICAgICIiIlJlZ2lzdGVyIGBwcm92aWRlcl9mYWN0b3J5YCB0byBtYWtlIHByb3ZpZGVycyBmb3IgYGxvYWRlcl90eXBlYAoKICAgIGBsb2FkZXJfdHlwZWAgaXMgdGhlIHR5cGUgb3IgY2xhc3Mgb2YgYSBQRVAgMzAyIGBgbW9kdWxlLl9fbG9hZGVyX19gYCwKICAgIGFuZCBgcHJvdmlkZXJfZmFjdG9yeWAgaXMgYSBmdW5jdGlvbiB0aGF0LCBwYXNzZWQgYSAqbW9kdWxlKiBvYmplY3QsCiAgICByZXR1cm5zIGFuIGBgSVJlc291cmNlUHJvdmlkZXJgYCBmb3IgdGhhdCBtb2R1bGUuCiAgICAiIiIKICAgIF9wcm92aWRlcl9mYWN0b3JpZXNbbG9hZGVyX3R5cGVdID0gcHJvdmlkZXJfZmFjdG9yeQoKCmRlZiBnZXRfcHJvdmlkZXIobW9kdWxlT3JSZXEpOgogICAgIiIiUmV0dXJuIGFuIElSZXNvdXJjZVByb3ZpZGVyIGZvciB0aGUgbmFtZWQgbW9kdWxlIG9yIHJlcXVpcmVtZW50IiIiCiAgICBpZiBpc2luc3RhbmNlKG1vZHVsZU9yUmVxLCBSZXF1aXJlbWVudCk6CiAgICAgICAgcmV0dXJuIHdvcmtpbmdfc2V0LmZpbmQobW9kdWxlT3JSZXEpIG9yIHJlcXVpcmUoc3RyKG1vZHVsZU9yUmVxKSlbMF0KICAgIHRyeToKICAgICAgICBtb2R1bGUgPSBzeXMubW9kdWxlc1ttb2R1bGVPclJlcV0KICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICBfX2ltcG9ydF9fKG1vZHVsZU9yUmVxKQogICAgICAgIG1vZHVsZSA9IHN5cy5tb2R1bGVzW21vZHVsZU9yUmVxXQogICAgbG9hZGVyID0gZ2V0YXR0cihtb2R1bGUsICdfX2xvYWRlcl9fJywgTm9uZSkKICAgIHJldHVybiBfZmluZF9hZGFwdGVyKF9wcm92aWRlcl9mYWN0b3JpZXMsIGxvYWRlcikobW9kdWxlKQoKCmRlZiBfbWFjb3N4X3ZlcnMoX2NhY2hlPVtdKToKICAgIGlmIG5vdCBfY2FjaGU6CiAgICAgICAgdmVyc2lvbiA9IHBsYXRmb3JtLm1hY192ZXIoKVswXQogICAgICAgICMgZmFsbGJhY2sgZm9yIE1hY1BvcnRzCiAgICAgICAgaWYgdmVyc2lvbiA9PSAnJzoKICAgICAgICAgICAgcGxpc3QgPSAnL1N5c3RlbS9MaWJyYXJ5L0NvcmVTZXJ2aWNlcy9TeXN0ZW1WZXJzaW9uLnBsaXN0JwogICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhwbGlzdCk6CiAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKHBsaXN0bGliLCAncmVhZFBsaXN0Jyk6CiAgICAgICAgICAgICAgICAgICAgcGxpc3RfY29udGVudCA9IHBsaXN0bGliLnJlYWRQbGlzdChwbGlzdCkKICAgICAgICAgICAgICAgICAgICBpZiAnUHJvZHVjdFZlcnNpb24nIGluIHBsaXN0X2NvbnRlbnQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb24gPSBwbGlzdF9jb250ZW50WydQcm9kdWN0VmVyc2lvbiddCgogICAgICAgIF9jYWNoZS5hcHBlbmQodmVyc2lvbi5zcGxpdCgnLicpKQogICAgcmV0dXJuIF9jYWNoZVswXQoKCmRlZiBfbWFjb3N4X2FyY2gobWFjaGluZSk6CiAgICByZXR1cm4geydQb3dlclBDJzogJ3BwYycsICdQb3dlcl9NYWNpbnRvc2gnOiAncHBjJ30uZ2V0KG1hY2hpbmUsIG1hY2hpbmUpCgoKZGVmIGdldF9idWlsZF9wbGF0Zm9ybSgpOgogICAgIiIiUmV0dXJuIHRoaXMgcGxhdGZvcm0ncyBzdHJpbmcgZm9yIHBsYXRmb3JtLXNwZWNpZmljIGRpc3RyaWJ1dGlvbnMKCiAgICBYWFggQ3VycmVudGx5IHRoaXMgaXMgdGhlIHNhbWUgYXMgYGBkaXN0dXRpbHMudXRpbC5nZXRfcGxhdGZvcm0oKWBgLCBidXQgaXQKICAgIG5lZWRzIHNvbWUgaGFja3MgZm9yIExpbnV4IGFuZCBNYWMgT1MgWC4KICAgICIiIgogICAgZnJvbSBzeXNjb25maWcgaW1wb3J0IGdldF9wbGF0Zm9ybQoKICAgIHBsYXQgPSBnZXRfcGxhdGZvcm0oKQogICAgaWYgc3lzLnBsYXRmb3JtID09ICJkYXJ3aW4iIGFuZCBub3QgcGxhdC5zdGFydHN3aXRoKCdtYWNvc3gtJyk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICB2ZXJzaW9uID0gX21hY29zeF92ZXJzKCkKICAgICAgICAgICAgbWFjaGluZSA9IG9zLnVuYW1lKClbNF0ucmVwbGFjZSgiICIsICJfIikKICAgICAgICAgICAgcmV0dXJuICJtYWNvc3gtJWQuJWQtJXMiICUgKAogICAgICAgICAgICAgICAgaW50KHZlcnNpb25bMF0pLCBpbnQodmVyc2lvblsxXSksCiAgICAgICAgICAgICAgICBfbWFjb3N4X2FyY2gobWFjaGluZSksCiAgICAgICAgICAgICkKICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgIyBpZiBzb21lb25lIGlzIHJ1bm5pbmcgYSBub24tTWFjIGRhcndpbiBzeXN0ZW0sIHRoaXMgd2lsbCBmYWxsCiAgICAgICAgICAgICMgdGhyb3VnaCB0byB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgogICAgICAgICAgICBwYXNzCiAgICByZXR1cm4gcGxhdAoKCm1hY29zVmVyc2lvblN0cmluZyA9IHJlLmNvbXBpbGUociJtYWNvc3gtKFxkKylcLihcZCspLSguKikiKQpkYXJ3aW5WZXJzaW9uU3RyaW5nID0gcmUuY29tcGlsZShyImRhcndpbi0oXGQrKVwuKFxkKylcLihcZCspLSguKikiKQojIFhYWCBiYWNrd2FyZCBjb21wYXQKZ2V0X3BsYXRmb3JtID0gZ2V0X2J1aWxkX3BsYXRmb3JtCgoKZGVmIGNvbXBhdGlibGVfcGxhdGZvcm1zKHByb3ZpZGVkLCByZXF1aXJlZCk6CiAgICAiIiJDYW4gY29kZSBmb3IgdGhlIGBwcm92aWRlZGAgcGxhdGZvcm0gcnVuIG9uIHRoZSBgcmVxdWlyZWRgIHBsYXRmb3JtPwoKICAgIFJldHVybnMgdHJ1ZSBpZiBlaXRoZXIgcGxhdGZvcm0gaXMgYGBOb25lYGAsIG9yIHRoZSBwbGF0Zm9ybXMgYXJlIGVxdWFsLgoKICAgIFhYWCBOZWVkcyBjb21wYXRpYmlsaXR5IGNoZWNrcyBmb3IgTGludXggYW5kIG90aGVyIHVuaXh5IE9TZXMuCiAgICAiIiIKICAgIGlmIHByb3ZpZGVkIGlzIE5vbmUgb3IgcmVxdWlyZWQgaXMgTm9uZSBvciBwcm92aWRlZCA9PSByZXF1aXJlZDoKICAgICAgICAjIGVhc3kgY2FzZQogICAgICAgIHJldHVybiBUcnVlCgogICAgIyBNYWMgT1MgWCBzcGVjaWFsIGNhc2VzCiAgICByZXFNYWMgPSBtYWNvc1ZlcnNpb25TdHJpbmcubWF0Y2gocmVxdWlyZWQpCiAgICBpZiByZXFNYWM6CiAgICAgICAgcHJvdk1hYyA9IG1hY29zVmVyc2lvblN0cmluZy5tYXRjaChwcm92aWRlZCkKCiAgICAgICAgIyBpcyB0aGlzIGEgTWFjIHBhY2thZ2U/CiAgICAgICAgaWYgbm90IHByb3ZNYWM6CiAgICAgICAgICAgICMgdGhpcyBpcyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBmb3IgcGFja2FnZXMgYnVpbHQgYmVmb3JlCiAgICAgICAgICAgICMgc2V0dXB0b29scyAwLjYuIEFsbCBwYWNrYWdlcyBidWlsdCBhZnRlciB0aGlzIHBvaW50IHdpbGwKICAgICAgICAgICAgIyB1c2UgdGhlIG5ldyBtYWNvc3ggZGVzaWduYXRpb24uCiAgICAgICAgICAgIHByb3ZEYXJ3aW4gPSBkYXJ3aW5WZXJzaW9uU3RyaW5nLm1hdGNoKHByb3ZpZGVkKQogICAgICAgICAgICBpZiBwcm92RGFyd2luOgogICAgICAgICAgICAgICAgZHZlcnNpb24gPSBpbnQocHJvdkRhcndpbi5ncm91cCgxKSkKICAgICAgICAgICAgICAgIG1hY29zdmVyc2lvbiA9ICIlcy4lcyIgJSAocmVxTWFjLmdyb3VwKDEpLCByZXFNYWMuZ3JvdXAoMikpCiAgICAgICAgICAgICAgICBpZiBkdmVyc2lvbiA9PSA3IGFuZCBtYWNvc3ZlcnNpb24gPj0gIjEwLjMiIG9yIFwKICAgICAgICAgICAgICAgICAgICAgICAgZHZlcnNpb24gPT0gOCBhbmQgbWFjb3N2ZXJzaW9uID49ICIxMC40IjoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgICAgICAjIGVnZyBpc24ndCBtYWNvc3ggb3IgbGVnYWN5IGRhcndpbgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgIyBhcmUgdGhleSB0aGUgc2FtZSBtYWpvciB2ZXJzaW9uIGFuZCBtYWNoaW5lIHR5cGU/CiAgICAgICAgaWYgcHJvdk1hYy5ncm91cCgxKSAhPSByZXFNYWMuZ3JvdXAoMSkgb3IgXAogICAgICAgICAgICAgICAgcHJvdk1hYy5ncm91cCgzKSAhPSByZXFNYWMuZ3JvdXAoMyk6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICAjIGlzIHRoZSByZXF1aXJlZCBPUyBtYWpvciB1cGRhdGUgPj0gdGhlIHByb3ZpZGVkIG9uZT8KICAgICAgICBpZiBpbnQocHJvdk1hYy5ncm91cCgyKSkgPiBpbnQocmVxTWFjLmdyb3VwKDIpKToKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgIHJldHVybiBUcnVlCgogICAgIyBYWFggTGludXggYW5kIG90aGVyIHBsYXRmb3Jtcycgc3BlY2lhbCBjYXNlcyBzaG91bGQgZ28gaGVyZQogICAgcmV0dXJuIEZhbHNlCgoKZGVmIHJ1bl9zY3JpcHQoZGlzdF9zcGVjLCBzY3JpcHRfbmFtZSk6CiAgICAiIiJMb2NhdGUgZGlzdHJpYnV0aW9uIGBkaXN0X3NwZWNgIGFuZCBydW4gaXRzIGBzY3JpcHRfbmFtZWAgc2NyaXB0IiIiCiAgICBucyA9IHN5cy5fZ2V0ZnJhbWUoMSkuZl9nbG9iYWxzCiAgICBuYW1lID0gbnNbJ19fbmFtZV9fJ10KICAgIG5zLmNsZWFyKCkKICAgIG5zWydfX25hbWVfXyddID0gbmFtZQogICAgcmVxdWlyZShkaXN0X3NwZWMpWzBdLnJ1bl9zY3JpcHQoc2NyaXB0X25hbWUsIG5zKQoKCiMgYmFja3dhcmQgY29tcGF0aWJpbGl0eQpydW5fbWFpbiA9IHJ1bl9zY3JpcHQKCgpkZWYgZ2V0X2Rpc3RyaWJ1dGlvbihkaXN0KToKICAgICIiIlJldHVybiBhIGN1cnJlbnQgZGlzdHJpYnV0aW9uIG9iamVjdCBmb3IgYSBSZXF1aXJlbWVudCBvciBzdHJpbmciIiIKICAgIGlmIGlzaW5zdGFuY2UoZGlzdCwgc2l4LnN0cmluZ190eXBlcyk6CiAgICAgICAgZGlzdCA9IFJlcXVpcmVtZW50LnBhcnNlKGRpc3QpCiAgICBpZiBpc2luc3RhbmNlKGRpc3QsIFJlcXVpcmVtZW50KToKICAgICAgICBkaXN0ID0gZ2V0X3Byb3ZpZGVyKGRpc3QpCiAgICBpZiBub3QgaXNpbnN0YW5jZShkaXN0LCBEaXN0cmlidXRpb24pOgogICAgICAgIHJhaXNlIFR5cGVFcnJvcigiRXhwZWN0ZWQgc3RyaW5nLCBSZXF1aXJlbWVudCwgb3IgRGlzdHJpYnV0aW9uIiwgZGlzdCkKICAgIHJldHVybiBkaXN0CgoKZGVmIGxvYWRfZW50cnlfcG9pbnQoZGlzdCwgZ3JvdXAsIG5hbWUpOgogICAgIiIiUmV0dXJuIGBuYW1lYCBlbnRyeSBwb2ludCBvZiBgZ3JvdXBgIGZvciBgZGlzdGAgb3IgcmFpc2UgSW1wb3J0RXJyb3IiIiIKICAgIHJldHVybiBnZXRfZGlzdHJpYnV0aW9uKGRpc3QpLmxvYWRfZW50cnlfcG9pbnQoZ3JvdXAsIG5hbWUpCgoKZGVmIGdldF9lbnRyeV9tYXAoZGlzdCwgZ3JvdXA9Tm9uZSk6CiAgICAiIiJSZXR1cm4gdGhlIGVudHJ5IHBvaW50IG1hcCBmb3IgYGdyb3VwYCwgb3IgdGhlIGZ1bGwgZW50cnkgbWFwIiIiCiAgICByZXR1cm4gZ2V0X2Rpc3RyaWJ1dGlvbihkaXN0KS5nZXRfZW50cnlfbWFwKGdyb3VwKQoKCmRlZiBnZXRfZW50cnlfaW5mbyhkaXN0LCBncm91cCwgbmFtZSk6CiAgICAiIiJSZXR1cm4gdGhlIEVudHJ5UG9pbnQgb2JqZWN0IGZvciBgZ3JvdXBgK2BuYW1lYCwgb3IgYGBOb25lYGAiIiIKICAgIHJldHVybiBnZXRfZGlzdHJpYnV0aW9uKGRpc3QpLmdldF9lbnRyeV9pbmZvKGdyb3VwLCBuYW1lKQoKCmNsYXNzIElNZXRhZGF0YVByb3ZpZGVyOgogICAgZGVmIGhhc19tZXRhZGF0YShuYW1lKToKICAgICAgICAiIiJEb2VzIHRoZSBwYWNrYWdlJ3MgZGlzdHJpYnV0aW9uIGNvbnRhaW4gdGhlIG5hbWVkIG1ldGFkYXRhPyIiIgoKICAgIGRlZiBnZXRfbWV0YWRhdGEobmFtZSk6CiAgICAgICAgIiIiVGhlIG5hbWVkIG1ldGFkYXRhIHJlc291cmNlIGFzIGEgc3RyaW5nIiIiCgogICAgZGVmIGdldF9tZXRhZGF0YV9saW5lcyhuYW1lKToKICAgICAgICAiIiJZaWVsZCBuYW1lZCBtZXRhZGF0YSByZXNvdXJjZSBhcyBsaXN0IG9mIG5vbi1ibGFuayBub24tY29tbWVudCBsaW5lcwoKICAgICAgIExlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UgaXMgc3RyaXBwZWQgZnJvbSBlYWNoIGxpbmUsIGFuZCBsaW5lcwogICAgICAgd2l0aCBgYCNgYCBhcyB0aGUgZmlyc3Qgbm9uLWJsYW5rIGNoYXJhY3RlciBhcmUgb21pdHRlZC4iIiIKCiAgICBkZWYgbWV0YWRhdGFfaXNkaXIobmFtZSk6CiAgICAgICAgIiIiSXMgdGhlIG5hbWVkIG1ldGFkYXRhIGEgZGlyZWN0b3J5PyAgKGxpa2UgYGBvcy5wYXRoLmlzZGlyKClgYCkiIiIKCiAgICBkZWYgbWV0YWRhdGFfbGlzdGRpcihuYW1lKToKICAgICAgICAiIiJMaXN0IG9mIG1ldGFkYXRhIG5hbWVzIGluIHRoZSBkaXJlY3RvcnkgKGxpa2UgYGBvcy5saXN0ZGlyKClgYCkiIiIKCiAgICBkZWYgcnVuX3NjcmlwdChzY3JpcHRfbmFtZSwgbmFtZXNwYWNlKToKICAgICAgICAiIiJFeGVjdXRlIHRoZSBuYW1lZCBzY3JpcHQgaW4gdGhlIHN1cHBsaWVkIG5hbWVzcGFjZSBkaWN0aW9uYXJ5IiIiCgoKY2xhc3MgSVJlc291cmNlUHJvdmlkZXIoSU1ldGFkYXRhUHJvdmlkZXIpOgogICAgIiIiQW4gb2JqZWN0IHRoYXQgcHJvdmlkZXMgYWNjZXNzIHRvIHBhY2thZ2UgcmVzb3VyY2VzIiIiCgogICAgZGVmIGdldF9yZXNvdXJjZV9maWxlbmFtZShtYW5hZ2VyLCByZXNvdXJjZV9uYW1lKToKICAgICAgICAiIiJSZXR1cm4gYSB0cnVlIGZpbGVzeXN0ZW0gcGF0aCBmb3IgYHJlc291cmNlX25hbWVgCgogICAgICAgIGBtYW5hZ2VyYCBtdXN0IGJlIGFuIGBgSVJlc291cmNlTWFuYWdlcmBgIiIiCgogICAgZGVmIGdldF9yZXNvdXJjZV9zdHJlYW0obWFuYWdlciwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgIiIiUmV0dXJuIGEgcmVhZGFibGUgZmlsZS1saWtlIG9iamVjdCBmb3IgYHJlc291cmNlX25hbWVgCgogICAgICAgIGBtYW5hZ2VyYCBtdXN0IGJlIGFuIGBgSVJlc291cmNlTWFuYWdlcmBgIiIiCgogICAgZGVmIGdldF9yZXNvdXJjZV9zdHJpbmcobWFuYWdlciwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgIiIiUmV0dXJuIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGNvbnRlbnRzIG9mIGByZXNvdXJjZV9uYW1lYAoKICAgICAgICBgbWFuYWdlcmAgbXVzdCBiZSBhbiBgYElSZXNvdXJjZU1hbmFnZXJgYCIiIgoKICAgIGRlZiBoYXNfcmVzb3VyY2UocmVzb3VyY2VfbmFtZSk6CiAgICAgICAgIiIiRG9lcyB0aGUgcGFja2FnZSBjb250YWluIHRoZSBuYW1lZCByZXNvdXJjZT8iIiIKCiAgICBkZWYgcmVzb3VyY2VfaXNkaXIocmVzb3VyY2VfbmFtZSk6CiAgICAgICAgIiIiSXMgdGhlIG5hbWVkIHJlc291cmNlIGEgZGlyZWN0b3J5PyAgKGxpa2UgYGBvcy5wYXRoLmlzZGlyKClgYCkiIiIKCiAgICBkZWYgcmVzb3VyY2VfbGlzdGRpcihyZXNvdXJjZV9uYW1lKToKICAgICAgICAiIiJMaXN0IG9mIHJlc291cmNlIG5hbWVzIGluIHRoZSBkaXJlY3RvcnkgKGxpa2UgYGBvcy5saXN0ZGlyKClgYCkiIiIKCgpjbGFzcyBXb3JraW5nU2V0OgogICAgIiIiQSBjb2xsZWN0aW9uIG9mIGFjdGl2ZSBkaXN0cmlidXRpb25zIG9uIHN5cy5wYXRoIChvciBhIHNpbWlsYXIgbGlzdCkiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgZW50cmllcz1Ob25lKToKICAgICAgICAiIiJDcmVhdGUgd29ya2luZyBzZXQgZnJvbSBsaXN0IG9mIHBhdGggZW50cmllcyAoZGVmYXVsdD1zeXMucGF0aCkiIiIKICAgICAgICBzZWxmLmVudHJpZXMgPSBbXQogICAgICAgIHNlbGYuZW50cnlfa2V5cyA9IHt9CiAgICAgICAgc2VsZi5ieV9rZXkgPSB7fQogICAgICAgIHNlbGYuY2FsbGJhY2tzID0gW10KCiAgICAgICAgaWYgZW50cmllcyBpcyBOb25lOgogICAgICAgICAgICBlbnRyaWVzID0gc3lzLnBhdGgKCiAgICAgICAgZm9yIGVudHJ5IGluIGVudHJpZXM6CiAgICAgICAgICAgIHNlbGYuYWRkX2VudHJ5KGVudHJ5KQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9idWlsZF9tYXN0ZXIoY2xzKToKICAgICAgICAiIiIKICAgICAgICBQcmVwYXJlIHRoZSBtYXN0ZXIgd29ya2luZyBzZXQuCiAgICAgICAgIiIiCiAgICAgICAgd3MgPSBjbHMoKQogICAgICAgIHRyeToKICAgICAgICAgICAgZnJvbSBfX21haW5fXyBpbXBvcnQgX19yZXF1aXJlc19fCiAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgICAgICAjIFRoZSBtYWluIHByb2dyYW0gZG9lcyBub3QgbGlzdCBhbnkgcmVxdWlyZW1lbnRzCiAgICAgICAgICAgIHJldHVybiB3cwoKICAgICAgICAjIGVuc3VyZSB0aGUgcmVxdWlyZW1lbnRzIGFyZSBtZXQKICAgICAgICB0cnk6CiAgICAgICAgICAgIHdzLnJlcXVpcmUoX19yZXF1aXJlc19fKQogICAgICAgIGV4Y2VwdCBWZXJzaW9uQ29uZmxpY3Q6CiAgICAgICAgICAgIHJldHVybiBjbHMuX2J1aWxkX2Zyb21fcmVxdWlyZW1lbnRzKF9fcmVxdWlyZXNfXykKCiAgICAgICAgcmV0dXJuIHdzCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX2J1aWxkX2Zyb21fcmVxdWlyZW1lbnRzKGNscywgcmVxX3NwZWMpOgogICAgICAgICIiIgogICAgICAgIEJ1aWxkIGEgd29ya2luZyBzZXQgZnJvbSBhIHJlcXVpcmVtZW50IHNwZWMuIFJld3JpdGVzIHN5cy5wYXRoLgogICAgICAgICIiIgogICAgICAgICMgdHJ5IGl0IHdpdGhvdXQgZGVmYXVsdHMgYWxyZWFkeSBvbiBzeXMucGF0aAogICAgICAgICMgYnkgc3RhcnRpbmcgd2l0aCBhbiBlbXB0eSBwYXRoCiAgICAgICAgd3MgPSBjbHMoW10pCiAgICAgICAgcmVxcyA9IHBhcnNlX3JlcXVpcmVtZW50cyhyZXFfc3BlYykKICAgICAgICBkaXN0cyA9IHdzLnJlc29sdmUocmVxcywgRW52aXJvbm1lbnQoKSkKICAgICAgICBmb3IgZGlzdCBpbiBkaXN0czoKICAgICAgICAgICAgd3MuYWRkKGRpc3QpCgogICAgICAgICMgYWRkIGFueSBtaXNzaW5nIGVudHJpZXMgZnJvbSBzeXMucGF0aAogICAgICAgIGZvciBlbnRyeSBpbiBzeXMucGF0aDoKICAgICAgICAgICAgaWYgZW50cnkgbm90IGluIHdzLmVudHJpZXM6CiAgICAgICAgICAgICAgICB3cy5hZGRfZW50cnkoZW50cnkpCgogICAgICAgICMgdGhlbiBjb3B5IGJhY2sgdG8gc3lzLnBhdGgKICAgICAgICBzeXMucGF0aFs6XSA9IHdzLmVudHJpZXMKICAgICAgICByZXR1cm4gd3MKCiAgICBkZWYgYWRkX2VudHJ5KHNlbGYsIGVudHJ5KToKICAgICAgICAiIiJBZGQgYSBwYXRoIGl0ZW0gdG8gYGAuZW50cmllc2BgLCBmaW5kaW5nIGFueSBkaXN0cmlidXRpb25zIG9uIGl0CgogICAgICAgIGBgZmluZF9kaXN0cmlidXRpb25zKGVudHJ5LCBUcnVlKWBgIGlzIHVzZWQgdG8gZmluZCBkaXN0cmlidXRpb25zCiAgICAgICAgY29ycmVzcG9uZGluZyB0byB0aGUgcGF0aCBlbnRyeSwgYW5kIHRoZXkgYXJlIGFkZGVkLiAgYGVudHJ5YCBpcwogICAgICAgIGFsd2F5cyBhcHBlbmRlZCB0byBgYC5lbnRyaWVzYGAsIGV2ZW4gaWYgaXQgaXMgYWxyZWFkeSBwcmVzZW50LgogICAgICAgIChUaGlzIGlzIGJlY2F1c2UgYGBzeXMucGF0aGBgIGNhbiBjb250YWluIHRoZSBzYW1lIHZhbHVlIG1vcmUgdGhhbgogICAgICAgIG9uY2UsIGFuZCB0aGUgYGAuZW50cmllc2BgIG9mIHRoZSBgYHN5cy5wYXRoYGAgV29ya2luZ1NldCBzaG91bGQgYWx3YXlzCiAgICAgICAgZXF1YWwgYGBzeXMucGF0aGBgLikKICAgICAgICAiIiIKICAgICAgICBzZWxmLmVudHJ5X2tleXMuc2V0ZGVmYXVsdChlbnRyeSwgW10pCiAgICAgICAgc2VsZi5lbnRyaWVzLmFwcGVuZChlbnRyeSkKICAgICAgICBmb3IgZGlzdCBpbiBmaW5kX2Rpc3RyaWJ1dGlvbnMoZW50cnksIFRydWUpOgogICAgICAgICAgICBzZWxmLmFkZChkaXN0LCBlbnRyeSwgRmFsc2UpCgogICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBkaXN0KToKICAgICAgICAiIiJUcnVlIGlmIGBkaXN0YCBpcyB0aGUgYWN0aXZlIGRpc3RyaWJ1dGlvbiBmb3IgaXRzIHByb2plY3QiIiIKICAgICAgICByZXR1cm4gc2VsZi5ieV9rZXkuZ2V0KGRpc3Qua2V5KSA9PSBkaXN0CgogICAgZGVmIGZpbmQoc2VsZiwgcmVxKToKICAgICAgICAiIiJGaW5kIGEgZGlzdHJpYnV0aW9uIG1hdGNoaW5nIHJlcXVpcmVtZW50IGByZXFgCgogICAgICAgIElmIHRoZXJlIGlzIGFuIGFjdGl2ZSBkaXN0cmlidXRpb24gZm9yIHRoZSByZXF1ZXN0ZWQgcHJvamVjdCwgdGhpcwogICAgICAgIHJldHVybnMgaXQgYXMgbG9uZyBhcyBpdCBtZWV0cyB0aGUgdmVyc2lvbiByZXF1aXJlbWVudCBzcGVjaWZpZWQgYnkKICAgICAgICBgcmVxYC4gIEJ1dCwgaWYgdGhlcmUgaXMgYW4gYWN0aXZlIGRpc3RyaWJ1dGlvbiBmb3IgdGhlIHByb2plY3QgYW5kIGl0CiAgICAgICAgZG9lcyAqbm90KiBtZWV0IHRoZSBgcmVxYCByZXF1aXJlbWVudCwgYGBWZXJzaW9uQ29uZmxpY3RgYCBpcyByYWlzZWQuCiAgICAgICAgSWYgdGhlcmUgaXMgbm8gYWN0aXZlIGRpc3RyaWJ1dGlvbiBmb3IgdGhlIHJlcXVlc3RlZCBwcm9qZWN0LCBgYE5vbmVgYAogICAgICAgIGlzIHJldHVybmVkLgogICAgICAgICIiIgogICAgICAgIGRpc3QgPSBzZWxmLmJ5X2tleS5nZXQocmVxLmtleSkKICAgICAgICBpZiBkaXN0IGlzIG5vdCBOb25lIGFuZCBkaXN0IG5vdCBpbiByZXE6CiAgICAgICAgICAgICMgWFhYIGFkZCBtb3JlIGluZm8KICAgICAgICAgICAgcmFpc2UgVmVyc2lvbkNvbmZsaWN0KGRpc3QsIHJlcSkKICAgICAgICByZXR1cm4gZGlzdAoKICAgIGRlZiBpdGVyX2VudHJ5X3BvaW50cyhzZWxmLCBncm91cCwgbmFtZT1Ob25lKToKICAgICAgICAiIiJZaWVsZCBlbnRyeSBwb2ludCBvYmplY3RzIGZyb20gYGdyb3VwYCBtYXRjaGluZyBgbmFtZWAKCiAgICAgICAgSWYgYG5hbWVgIGlzIE5vbmUsIHlpZWxkcyBhbGwgZW50cnkgcG9pbnRzIGluIGBncm91cGAgZnJvbSBhbGwKICAgICAgICBkaXN0cmlidXRpb25zIGluIHRoZSB3b3JraW5nIHNldCwgb3RoZXJ3aXNlIG9ubHkgb25lcyBtYXRjaGluZwogICAgICAgIGJvdGggYGdyb3VwYCBhbmQgYG5hbWVgIGFyZSB5aWVsZGVkIChpbiBkaXN0cmlidXRpb24gb3JkZXIpLgogICAgICAgICIiIgogICAgICAgIHJldHVybiAoCiAgICAgICAgICAgIGVudHJ5CiAgICAgICAgICAgIGZvciBkaXN0IGluIHNlbGYKICAgICAgICAgICAgZm9yIGVudHJ5IGluIGRpc3QuZ2V0X2VudHJ5X21hcChncm91cCkudmFsdWVzKCkKICAgICAgICAgICAgaWYgbmFtZSBpcyBOb25lIG9yIG5hbWUgPT0gZW50cnkubmFtZQogICAgICAgICkKCiAgICBkZWYgcnVuX3NjcmlwdChzZWxmLCByZXF1aXJlcywgc2NyaXB0X25hbWUpOgogICAgICAgICIiIkxvY2F0ZSBkaXN0cmlidXRpb24gZm9yIGByZXF1aXJlc2AgYW5kIHJ1biBgc2NyaXB0X25hbWVgIHNjcmlwdCIiIgogICAgICAgIG5zID0gc3lzLl9nZXRmcmFtZSgxKS5mX2dsb2JhbHMKICAgICAgICBuYW1lID0gbnNbJ19fbmFtZV9fJ10KICAgICAgICBucy5jbGVhcigpCiAgICAgICAgbnNbJ19fbmFtZV9fJ10gPSBuYW1lCiAgICAgICAgc2VsZi5yZXF1aXJlKHJlcXVpcmVzKVswXS5ydW5fc2NyaXB0KHNjcmlwdF9uYW1lLCBucykKCiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgIiIiWWllbGQgZGlzdHJpYnV0aW9ucyBmb3Igbm9uLWR1cGxpY2F0ZSBwcm9qZWN0cyBpbiB0aGUgd29ya2luZyBzZXQKCiAgICAgICAgVGhlIHlpZWxkIG9yZGVyIGlzIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgaXRlbXMnIHBhdGggZW50cmllcyB3ZXJlCiAgICAgICAgYWRkZWQgdG8gdGhlIHdvcmtpbmcgc2V0LgogICAgICAgICIiIgogICAgICAgIHNlZW4gPSB7fQogICAgICAgIGZvciBpdGVtIGluIHNlbGYuZW50cmllczoKICAgICAgICAgICAgaWYgaXRlbSBub3QgaW4gc2VsZi5lbnRyeV9rZXlzOgogICAgICAgICAgICAgICAgIyB3b3JrYXJvdW5kIGEgY2FjaGUgaXNzdWUKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICBmb3Iga2V5IGluIHNlbGYuZW50cnlfa2V5c1tpdGVtXToKICAgICAgICAgICAgICAgIGlmIGtleSBub3QgaW4gc2VlbjoKICAgICAgICAgICAgICAgICAgICBzZWVuW2tleV0gPSAxCiAgICAgICAgICAgICAgICAgICAgeWllbGQgc2VsZi5ieV9rZXlba2V5XQoKICAgIGRlZiBhZGQoc2VsZiwgZGlzdCwgZW50cnk9Tm9uZSwgaW5zZXJ0PVRydWUsIHJlcGxhY2U9RmFsc2UpOgogICAgICAgICIiIkFkZCBgZGlzdGAgdG8gd29ya2luZyBzZXQsIGFzc29jaWF0ZWQgd2l0aCBgZW50cnlgCgogICAgICAgIElmIGBlbnRyeWAgaXMgdW5zcGVjaWZpZWQsIGl0IGRlZmF1bHRzIHRvIHRoZSBgYC5sb2NhdGlvbmBgIG9mIGBkaXN0YC4KICAgICAgICBPbiBleGl0IGZyb20gdGhpcyByb3V0aW5lLCBgZW50cnlgIGlzIGFkZGVkIHRvIHRoZSBlbmQgb2YgdGhlIHdvcmtpbmcKICAgICAgICBzZXQncyBgYC5lbnRyaWVzYGAgKGlmIGl0IHdhc24ndCBhbHJlYWR5IHByZXNlbnQpLgoKICAgICAgICBgZGlzdGAgaXMgb25seSBhZGRlZCB0byB0aGUgd29ya2luZyBzZXQgaWYgaXQncyBmb3IgYSBwcm9qZWN0IHRoYXQKICAgICAgICBkb2Vzbid0IGFscmVhZHkgaGF2ZSBhIGRpc3RyaWJ1dGlvbiBpbiB0aGUgc2V0LCB1bmxlc3MgYHJlcGxhY2U9VHJ1ZWAuCiAgICAgICAgSWYgaXQncyBhZGRlZCwgYW55IGNhbGxiYWNrcyByZWdpc3RlcmVkIHdpdGggdGhlIGBgc3Vic2NyaWJlKClgYCBtZXRob2QKICAgICAgICB3aWxsIGJlIGNhbGxlZC4KICAgICAgICAiIiIKICAgICAgICBpZiBpbnNlcnQ6CiAgICAgICAgICAgIGRpc3QuaW5zZXJ0X29uKHNlbGYuZW50cmllcywgZW50cnksIHJlcGxhY2U9cmVwbGFjZSkKCiAgICAgICAgaWYgZW50cnkgaXMgTm9uZToKICAgICAgICAgICAgZW50cnkgPSBkaXN0LmxvY2F0aW9uCiAgICAgICAga2V5cyA9IHNlbGYuZW50cnlfa2V5cy5zZXRkZWZhdWx0KGVudHJ5LCBbXSkKICAgICAgICBrZXlzMiA9IHNlbGYuZW50cnlfa2V5cy5zZXRkZWZhdWx0KGRpc3QubG9jYXRpb24sIFtdKQogICAgICAgIGlmIG5vdCByZXBsYWNlIGFuZCBkaXN0LmtleSBpbiBzZWxmLmJ5X2tleToKICAgICAgICAgICAgIyBpZ25vcmUgaGlkZGVuIGRpc3Ryb3MKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIHNlbGYuYnlfa2V5W2Rpc3Qua2V5XSA9IGRpc3QKICAgICAgICBpZiBkaXN0LmtleSBub3QgaW4ga2V5czoKICAgICAgICAgICAga2V5cy5hcHBlbmQoZGlzdC5rZXkpCiAgICAgICAgaWYgZGlzdC5rZXkgbm90IGluIGtleXMyOgogICAgICAgICAgICBrZXlzMi5hcHBlbmQoZGlzdC5rZXkpCiAgICAgICAgc2VsZi5fYWRkZWRfbmV3KGRpc3QpCgogICAgZGVmIHJlc29sdmUoc2VsZiwgcmVxdWlyZW1lbnRzLCBlbnY9Tm9uZSwgaW5zdGFsbGVyPU5vbmUsCiAgICAgICAgICAgICAgICByZXBsYWNlX2NvbmZsaWN0aW5nPUZhbHNlLCBleHRyYXM9Tm9uZSk6CiAgICAgICAgIiIiTGlzdCBhbGwgZGlzdHJpYnV0aW9ucyBuZWVkZWQgdG8gKHJlY3Vyc2l2ZWx5KSBtZWV0IGByZXF1aXJlbWVudHNgCgogICAgICAgIGByZXF1aXJlbWVudHNgIG11c3QgYmUgYSBzZXF1ZW5jZSBvZiBgYFJlcXVpcmVtZW50YGAgb2JqZWN0cy4gIGBlbnZgLAogICAgICAgIGlmIHN1cHBsaWVkLCBzaG91bGQgYmUgYW4gYGBFbnZpcm9ubWVudGBgIGluc3RhbmNlLiAgSWYKICAgICAgICBub3Qgc3VwcGxpZWQsIGl0IGRlZmF1bHRzIHRvIGFsbCBkaXN0cmlidXRpb25zIGF2YWlsYWJsZSB3aXRoaW4gYW55CiAgICAgICAgZW50cnkgb3IgZGlzdHJpYnV0aW9uIGluIHRoZSB3b3JraW5nIHNldC4gIGBpbnN0YWxsZXJgLCBpZiBzdXBwbGllZCwKICAgICAgICB3aWxsIGJlIGludm9rZWQgd2l0aCBlYWNoIHJlcXVpcmVtZW50IHRoYXQgY2Fubm90IGJlIG1ldCBieSBhbgogICAgICAgIGFscmVhZHktaW5zdGFsbGVkIGRpc3RyaWJ1dGlvbjsgaXQgc2hvdWxkIHJldHVybiBhIGBgRGlzdHJpYnV0aW9uYGAgb3IKICAgICAgICBgYE5vbmVgYC4KCiAgICAgICAgVW5sZXNzIGByZXBsYWNlX2NvbmZsaWN0aW5nPVRydWVgLCByYWlzZXMgYSBWZXJzaW9uQ29uZmxpY3QgZXhjZXB0aW9uCiAgICAgICAgaWYKICAgICAgICBhbnkgcmVxdWlyZW1lbnRzIGFyZSBmb3VuZCBvbiB0aGUgcGF0aCB0aGF0IGhhdmUgdGhlIGNvcnJlY3QgbmFtZSBidXQKICAgICAgICB0aGUgd3JvbmcgdmVyc2lvbi4gIE90aGVyd2lzZSwgaWYgYW4gYGluc3RhbGxlcmAgaXMgc3VwcGxpZWQgaXQgd2lsbCBiZQogICAgICAgIGludm9rZWQgdG8gb2J0YWluIHRoZSBjb3JyZWN0IHZlcnNpb24gb2YgdGhlIHJlcXVpcmVtZW50IGFuZCBhY3RpdmF0ZQogICAgICAgIGl0LgoKICAgICAgICBgZXh0cmFzYCBpcyBhIGxpc3Qgb2YgdGhlIGV4dHJhcyB0byBiZSB1c2VkIHdpdGggdGhlc2UgcmVxdWlyZW1lbnRzLgogICAgICAgIFRoaXMgaXMgaW1wb3J0YW50IGJlY2F1c2UgZXh0cmEgcmVxdWlyZW1lbnRzIG1heSBsb29rIGxpa2UgYG15X3JlcTsKICAgICAgICBleHRyYSA9ICJteV9leHRyYSJgLCB3aGljaCB3b3VsZCBvdGhlcndpc2UgYmUgaW50ZXJwcmV0ZWQgYXMgYSBwdXJlbHkKICAgICAgICBvcHRpb25hbCByZXF1aXJlbWVudC4gIEluc3RlYWQsIHdlIHdhbnQgdG8gYmUgYWJsZSB0byBhc3NlcnQgdGhhdCB0aGVzZQogICAgICAgIHJlcXVpcmVtZW50cyBhcmUgdHJ1bHkgcmVxdWlyZWQuCiAgICAgICAgIiIiCgogICAgICAgICMgc2V0IHVwIHRoZSBzdGFjawogICAgICAgIHJlcXVpcmVtZW50cyA9IGxpc3QocmVxdWlyZW1lbnRzKVs6Oi0xXQogICAgICAgICMgc2V0IG9mIHByb2Nlc3NlZCByZXF1aXJlbWVudHMKICAgICAgICBwcm9jZXNzZWQgPSB7fQogICAgICAgICMga2V5IC0+IGRpc3QKICAgICAgICBiZXN0ID0ge30KICAgICAgICB0b19hY3RpdmF0ZSA9IFtdCgogICAgICAgIHJlcV9leHRyYXMgPSBfUmVxRXh0cmFzKCkKCiAgICAgICAgIyBNYXBwaW5nIG9mIHJlcXVpcmVtZW50IHRvIHNldCBvZiBkaXN0cmlidXRpb25zIHRoYXQgcmVxdWlyZWQgaXQ7CiAgICAgICAgIyB1c2VmdWwgZm9yIHJlcG9ydGluZyBpbmZvIGFib3V0IGNvbmZsaWN0cy4KICAgICAgICByZXF1aXJlZF9ieSA9IGNvbGxlY3Rpb25zLmRlZmF1bHRkaWN0KHNldCkKCiAgICAgICAgd2hpbGUgcmVxdWlyZW1lbnRzOgogICAgICAgICAgICAjIHByb2Nlc3MgZGVwZW5kZW5jaWVzIGJyZWFkdGgtZmlyc3QKICAgICAgICAgICAgcmVxID0gcmVxdWlyZW1lbnRzLnBvcCgwKQogICAgICAgICAgICBpZiByZXEgaW4gcHJvY2Vzc2VkOgogICAgICAgICAgICAgICAgIyBJZ25vcmUgY3ljbGljIG9yIHJlZHVuZGFudCBkZXBlbmRlbmNpZXMKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICBpZiBub3QgcmVxX2V4dHJhcy5tYXJrZXJzX3Bhc3MocmVxLCBleHRyYXMpOgogICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgIGRpc3QgPSBiZXN0LmdldChyZXEua2V5KQogICAgICAgICAgICBpZiBkaXN0IGlzIE5vbmU6CiAgICAgICAgICAgICAgICAjIEZpbmQgdGhlIGJlc3QgZGlzdHJpYnV0aW9uIGFuZCBhZGQgaXQgdG8gdGhlIG1hcAogICAgICAgICAgICAgICAgZGlzdCA9IHNlbGYuYnlfa2V5LmdldChyZXEua2V5KQogICAgICAgICAgICAgICAgaWYgZGlzdCBpcyBOb25lIG9yIChkaXN0IG5vdCBpbiByZXEgYW5kIHJlcGxhY2VfY29uZmxpY3RpbmcpOgogICAgICAgICAgICAgICAgICAgIHdzID0gc2VsZgogICAgICAgICAgICAgICAgICAgIGlmIGVudiBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgICAgICBpZiBkaXN0IGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYgPSBFbnZpcm9ubWVudChzZWxmLmVudHJpZXMpCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFVzZSBhbiBlbXB0eSBlbnZpcm9ubWVudCBhbmQgd29ya2luZ3NldCB0byBhdm9pZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhbnkgZnVydGhlciBjb25mbGljdHMgd2l0aCB0aGUgY29uZmxpY3RpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZGlzdHJpYnV0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYgPSBFbnZpcm9ubWVudChbXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzID0gV29ya2luZ1NldChbXSkKICAgICAgICAgICAgICAgICAgICBkaXN0ID0gYmVzdFtyZXEua2V5XSA9IGVudi5iZXN0X21hdGNoKAogICAgICAgICAgICAgICAgICAgICAgICByZXEsIHdzLCBpbnN0YWxsZXIsCiAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VfY29uZmxpY3Rpbmc9cmVwbGFjZV9jb25mbGljdGluZwogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICBpZiBkaXN0IGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVycyA9IHJlcXVpcmVkX2J5LmdldChyZXEsIE5vbmUpCiAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIERpc3RyaWJ1dGlvbk5vdEZvdW5kKHJlcSwgcmVxdWlyZXJzKQogICAgICAgICAgICAgICAgdG9fYWN0aXZhdGUuYXBwZW5kKGRpc3QpCiAgICAgICAgICAgIGlmIGRpc3Qgbm90IGluIHJlcToKICAgICAgICAgICAgICAgICMgT29wcywgdGhlICJiZXN0IiBzbyBmYXIgY29uZmxpY3RzIHdpdGggYSBkZXBlbmRlbmN5CiAgICAgICAgICAgICAgICBkZXBlbmRlbnRfcmVxID0gcmVxdWlyZWRfYnlbcmVxXQogICAgICAgICAgICAgICAgcmFpc2UgVmVyc2lvbkNvbmZsaWN0KGRpc3QsIHJlcSkud2l0aF9jb250ZXh0KGRlcGVuZGVudF9yZXEpCgogICAgICAgICAgICAjIHB1c2ggdGhlIG5ldyByZXF1aXJlbWVudHMgb250byB0aGUgc3RhY2sKICAgICAgICAgICAgbmV3X3JlcXVpcmVtZW50cyA9IGRpc3QucmVxdWlyZXMocmVxLmV4dHJhcylbOjotMV0KICAgICAgICAgICAgcmVxdWlyZW1lbnRzLmV4dGVuZChuZXdfcmVxdWlyZW1lbnRzKQoKICAgICAgICAgICAgIyBSZWdpc3RlciB0aGUgbmV3IHJlcXVpcmVtZW50cyBuZWVkZWQgYnkgcmVxCiAgICAgICAgICAgIGZvciBuZXdfcmVxdWlyZW1lbnQgaW4gbmV3X3JlcXVpcmVtZW50czoKICAgICAgICAgICAgICAgIHJlcXVpcmVkX2J5W25ld19yZXF1aXJlbWVudF0uYWRkKHJlcS5wcm9qZWN0X25hbWUpCiAgICAgICAgICAgICAgICByZXFfZXh0cmFzW25ld19yZXF1aXJlbWVudF0gPSByZXEuZXh0cmFzCgogICAgICAgICAgICBwcm9jZXNzZWRbcmVxXSA9IFRydWUKCiAgICAgICAgIyByZXR1cm4gbGlzdCBvZiBkaXN0cm9zIHRvIGFjdGl2YXRlCiAgICAgICAgcmV0dXJuIHRvX2FjdGl2YXRlCgogICAgZGVmIGZpbmRfcGx1Z2lucygKICAgICAgICAgICAgc2VsZiwgcGx1Z2luX2VudiwgZnVsbF9lbnY9Tm9uZSwgaW5zdGFsbGVyPU5vbmUsIGZhbGxiYWNrPVRydWUpOgogICAgICAgICIiIkZpbmQgYWxsIGFjdGl2YXRhYmxlIGRpc3RyaWJ1dGlvbnMgaW4gYHBsdWdpbl9lbnZgCgogICAgICAgIEV4YW1wbGUgdXNhZ2U6OgoKICAgICAgICAgICAgZGlzdHJpYnV0aW9ucywgZXJyb3JzID0gd29ya2luZ19zZXQuZmluZF9wbHVnaW5zKAogICAgICAgICAgICAgICAgRW52aXJvbm1lbnQocGx1Z2luX2Rpcmxpc3QpCiAgICAgICAgICAgICkKICAgICAgICAgICAgIyBhZGQgcGx1Z2lucytsaWJzIHRvIHN5cy5wYXRoCiAgICAgICAgICAgIG1hcCh3b3JraW5nX3NldC5hZGQsIGRpc3RyaWJ1dGlvbnMpCiAgICAgICAgICAgICMgZGlzcGxheSBlcnJvcnMKICAgICAgICAgICAgcHJpbnQoJ0NvdWxkIG5vdCBsb2FkJywgZXJyb3JzKQoKICAgICAgICBUaGUgYHBsdWdpbl9lbnZgIHNob3VsZCBiZSBhbiBgYEVudmlyb25tZW50YGAgaW5zdGFuY2UgdGhhdCBjb250YWlucwogICAgICAgIG9ubHkgZGlzdHJpYnV0aW9ucyB0aGF0IGFyZSBpbiB0aGUgcHJvamVjdCdzICJwbHVnaW4gZGlyZWN0b3J5IiBvcgogICAgICAgIGRpcmVjdG9yaWVzLiBUaGUgYGZ1bGxfZW52YCwgaWYgc3VwcGxpZWQsIHNob3VsZCBiZSBhbiBgYEVudmlyb25tZW50YGAKICAgICAgICBjb250YWlucyBhbGwgY3VycmVudGx5LWF2YWlsYWJsZSBkaXN0cmlidXRpb25zLiAgSWYgYGZ1bGxfZW52YCBpcyBub3QKICAgICAgICBzdXBwbGllZCwgb25lIGlzIGNyZWF0ZWQgYXV0b21hdGljYWxseSBmcm9tIHRoZSBgYFdvcmtpbmdTZXRgYCB0aGlzCiAgICAgICAgbWV0aG9kIGlzIGNhbGxlZCBvbiwgd2hpY2ggd2lsbCB0eXBpY2FsbHkgbWVhbiB0aGF0IGV2ZXJ5IGRpcmVjdG9yeSBvbgogICAgICAgIGBgc3lzLnBhdGhgYCB3aWxsIGJlIHNjYW5uZWQgZm9yIGRpc3RyaWJ1dGlvbnMuCgogICAgICAgIGBpbnN0YWxsZXJgIGlzIGEgc3RhbmRhcmQgaW5zdGFsbGVyIGNhbGxiYWNrIGFzIHVzZWQgYnkgdGhlCiAgICAgICAgYGByZXNvbHZlKClgYCBtZXRob2QuIFRoZSBgZmFsbGJhY2tgIGZsYWcgaW5kaWNhdGVzIHdoZXRoZXIgd2Ugc2hvdWxkCiAgICAgICAgYXR0ZW1wdCB0byByZXNvbHZlIG9sZGVyIHZlcnNpb25zIG9mIGEgcGx1Z2luIGlmIHRoZSBuZXdlc3QgdmVyc2lvbgogICAgICAgIGNhbm5vdCBiZSByZXNvbHZlZC4KCiAgICAgICAgVGhpcyBtZXRob2QgcmV0dXJucyBhIDItdHVwbGU6IChgZGlzdHJpYnV0aW9uc2AsIGBlcnJvcl9pbmZvYCksIHdoZXJlCiAgICAgICAgYGRpc3RyaWJ1dGlvbnNgIGlzIGEgbGlzdCBvZiB0aGUgZGlzdHJpYnV0aW9ucyBmb3VuZCBpbiBgcGx1Z2luX2VudmAKICAgICAgICB0aGF0IHdlcmUgbG9hZGFibGUsIGFsb25nIHdpdGggYW55IG90aGVyIGRpc3RyaWJ1dGlvbnMgdGhhdCBhcmUgbmVlZGVkCiAgICAgICAgdG8gcmVzb2x2ZSB0aGVpciBkZXBlbmRlbmNpZXMuICBgZXJyb3JfaW5mb2AgaXMgYSBkaWN0aW9uYXJ5IG1hcHBpbmcKICAgICAgICB1bmxvYWRhYmxlIHBsdWdpbiBkaXN0cmlidXRpb25zIHRvIGFuIGV4Y2VwdGlvbiBpbnN0YW5jZSBkZXNjcmliaW5nIHRoZQogICAgICAgIGVycm9yIHRoYXQgb2NjdXJyZWQuIFVzdWFsbHkgdGhpcyB3aWxsIGJlIGEgYGBEaXN0cmlidXRpb25Ob3RGb3VuZGBgIG9yCiAgICAgICAgYGBWZXJzaW9uQ29uZmxpY3RgYCBpbnN0YW5jZS4KICAgICAgICAiIiIKCiAgICAgICAgcGx1Z2luX3Byb2plY3RzID0gbGlzdChwbHVnaW5fZW52KQogICAgICAgICMgc2NhbiBwcm9qZWN0IG5hbWVzIGluIGFscGhhYmV0aWMgb3JkZXIKICAgICAgICBwbHVnaW5fcHJvamVjdHMuc29ydCgpCgogICAgICAgIGVycm9yX2luZm8gPSB7fQogICAgICAgIGRpc3RyaWJ1dGlvbnMgPSB7fQoKICAgICAgICBpZiBmdWxsX2VudiBpcyBOb25lOgogICAgICAgICAgICBlbnYgPSBFbnZpcm9ubWVudChzZWxmLmVudHJpZXMpCiAgICAgICAgICAgIGVudiArPSBwbHVnaW5fZW52CiAgICAgICAgZWxzZToKICAgICAgICAgICAgZW52ID0gZnVsbF9lbnYgKyBwbHVnaW5fZW52CgogICAgICAgIHNoYWRvd19zZXQgPSBzZWxmLl9fY2xhc3NfXyhbXSkKICAgICAgICAjIHB1dCBhbGwgb3VyIGVudHJpZXMgaW4gc2hhZG93X3NldAogICAgICAgIGxpc3QobWFwKHNoYWRvd19zZXQuYWRkLCBzZWxmKSkKCiAgICAgICAgZm9yIHByb2plY3RfbmFtZSBpbiBwbHVnaW5fcHJvamVjdHM6CgogICAgICAgICAgICBmb3IgZGlzdCBpbiBwbHVnaW5fZW52W3Byb2plY3RfbmFtZV06CgogICAgICAgICAgICAgICAgcmVxID0gW2Rpc3QuYXNfcmVxdWlyZW1lbnQoKV0KCiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWVzID0gc2hhZG93X3NldC5yZXNvbHZlKHJlcSwgZW52LCBpbnN0YWxsZXIpCgogICAgICAgICAgICAgICAgZXhjZXB0IFJlc29sdXRpb25FcnJvciBhcyB2OgogICAgICAgICAgICAgICAgICAgICMgc2F2ZSBlcnJvciBpbmZvCiAgICAgICAgICAgICAgICAgICAgZXJyb3JfaW5mb1tkaXN0XSA9IHYKICAgICAgICAgICAgICAgICAgICBpZiBmYWxsYmFjazoKICAgICAgICAgICAgICAgICAgICAgICAgIyB0cnkgdGhlIG5leHQgb2xkZXIgdmVyc2lvbiBvZiBwcm9qZWN0CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgIyBnaXZlIHVwIG9uIHRoaXMgcHJvamVjdCwga2VlcCBnb2luZwogICAgICAgICAgICAgICAgICAgICAgICBicmVhawoKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgbGlzdChtYXAoc2hhZG93X3NldC5hZGQsIHJlc29sdmVlcykpCiAgICAgICAgICAgICAgICAgICAgZGlzdHJpYnV0aW9ucy51cGRhdGUoZGljdC5mcm9ta2V5cyhyZXNvbHZlZXMpKQoKICAgICAgICAgICAgICAgICAgICAjIHN1Y2Nlc3MsIG5vIG5lZWQgdG8gdHJ5IGFueSBtb3JlIHZlcnNpb25zIG9mIHRoaXMgcHJvamVjdAogICAgICAgICAgICAgICAgICAgIGJyZWFrCgogICAgICAgIGRpc3RyaWJ1dGlvbnMgPSBsaXN0KGRpc3RyaWJ1dGlvbnMpCiAgICAgICAgZGlzdHJpYnV0aW9ucy5zb3J0KCkKCiAgICAgICAgcmV0dXJuIGRpc3RyaWJ1dGlvbnMsIGVycm9yX2luZm8KCiAgICBkZWYgcmVxdWlyZShzZWxmLCAqcmVxdWlyZW1lbnRzKToKICAgICAgICAiIiJFbnN1cmUgdGhhdCBkaXN0cmlidXRpb25zIG1hdGNoaW5nIGByZXF1aXJlbWVudHNgIGFyZSBhY3RpdmF0ZWQKCiAgICAgICAgYHJlcXVpcmVtZW50c2AgbXVzdCBiZSBhIHN0cmluZyBvciBhIChwb3NzaWJseS1uZXN0ZWQpIHNlcXVlbmNlCiAgICAgICAgdGhlcmVvZiwgc3BlY2lmeWluZyB0aGUgZGlzdHJpYnV0aW9ucyBhbmQgdmVyc2lvbnMgcmVxdWlyZWQuICBUaGUKICAgICAgICByZXR1cm4gdmFsdWUgaXMgYSBzZXF1ZW5jZSBvZiB0aGUgZGlzdHJpYnV0aW9ucyB0aGF0IG5lZWRlZCB0byBiZQogICAgICAgIGFjdGl2YXRlZCB0byBmdWxmaWxsIHRoZSByZXF1aXJlbWVudHM7IGFsbCByZWxldmFudCBkaXN0cmlidXRpb25zIGFyZQogICAgICAgIGluY2x1ZGVkLCBldmVuIGlmIHRoZXkgd2VyZSBhbHJlYWR5IGFjdGl2YXRlZCBpbiB0aGlzIHdvcmtpbmcgc2V0LgogICAgICAgICIiIgogICAgICAgIG5lZWRlZCA9IHNlbGYucmVzb2x2ZShwYXJzZV9yZXF1aXJlbWVudHMocmVxdWlyZW1lbnRzKSkKCiAgICAgICAgZm9yIGRpc3QgaW4gbmVlZGVkOgogICAgICAgICAgICBzZWxmLmFkZChkaXN0KQoKICAgICAgICByZXR1cm4gbmVlZGVkCgogICAgZGVmIHN1YnNjcmliZShzZWxmLCBjYWxsYmFjaywgZXhpc3Rpbmc9VHJ1ZSk6CiAgICAgICAgIiIiSW52b2tlIGBjYWxsYmFja2AgZm9yIGFsbCBkaXN0cmlidXRpb25zCgogICAgICAgIElmIGBleGlzdGluZz1UcnVlYCAoZGVmYXVsdCksCiAgICAgICAgY2FsbCBvbiBhbGwgZXhpc3Rpbmcgb25lcywgYXMgd2VsbC4KICAgICAgICAiIiIKICAgICAgICBpZiBjYWxsYmFjayBpbiBzZWxmLmNhbGxiYWNrczoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgc2VsZi5jYWxsYmFja3MuYXBwZW5kKGNhbGxiYWNrKQogICAgICAgIGlmIG5vdCBleGlzdGluZzoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgZm9yIGRpc3QgaW4gc2VsZjoKICAgICAgICAgICAgY2FsbGJhY2soZGlzdCkKCiAgICBkZWYgX2FkZGVkX25ldyhzZWxmLCBkaXN0KToKICAgICAgICBmb3IgY2FsbGJhY2sgaW4gc2VsZi5jYWxsYmFja3M6CiAgICAgICAgICAgIGNhbGxiYWNrKGRpc3QpCgogICAgZGVmIF9fZ2V0c3RhdGVfXyhzZWxmKToKICAgICAgICByZXR1cm4gKAogICAgICAgICAgICBzZWxmLmVudHJpZXNbOl0sIHNlbGYuZW50cnlfa2V5cy5jb3B5KCksIHNlbGYuYnlfa2V5LmNvcHkoKSwKICAgICAgICAgICAgc2VsZi5jYWxsYmFja3NbOl0KICAgICAgICApCgogICAgZGVmIF9fc2V0c3RhdGVfXyhzZWxmLCBlX2tfYl9jKToKICAgICAgICBlbnRyaWVzLCBrZXlzLCBieV9rZXksIGNhbGxiYWNrcyA9IGVfa19iX2MKICAgICAgICBzZWxmLmVudHJpZXMgPSBlbnRyaWVzWzpdCiAgICAgICAgc2VsZi5lbnRyeV9rZXlzID0ga2V5cy5jb3B5KCkKICAgICAgICBzZWxmLmJ5X2tleSA9IGJ5X2tleS5jb3B5KCkKICAgICAgICBzZWxmLmNhbGxiYWNrcyA9IGNhbGxiYWNrc1s6XQoKCmNsYXNzIF9SZXFFeHRyYXMoZGljdCk6CiAgICAiIiIKICAgIE1hcCBlYWNoIHJlcXVpcmVtZW50IHRvIHRoZSBleHRyYXMgdGhhdCBkZW1hbmRlZCBpdC4KICAgICIiIgoKICAgIGRlZiBtYXJrZXJzX3Bhc3Moc2VsZiwgcmVxLCBleHRyYXM9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgRXZhbHVhdGUgbWFya2VycyBmb3IgcmVxIGFnYWluc3QgZWFjaCBleHRyYSB0aGF0CiAgICAgICAgZGVtYW5kZWQgaXQuCgogICAgICAgIFJldHVybiBGYWxzZSBpZiB0aGUgcmVxIGhhcyBhIG1hcmtlciBhbmQgZmFpbHMKICAgICAgICBldmFsdWF0aW9uLiBPdGhlcndpc2UsIHJldHVybiBUcnVlLgogICAgICAgICIiIgogICAgICAgIGV4dHJhX2V2YWxzID0gKAogICAgICAgICAgICByZXEubWFya2VyLmV2YWx1YXRlKHsnZXh0cmEnOiBleHRyYX0pCiAgICAgICAgICAgIGZvciBleHRyYSBpbiBzZWxmLmdldChyZXEsICgpKSArIChleHRyYXMgb3IgKE5vbmUsKSkKICAgICAgICApCiAgICAgICAgcmV0dXJuIG5vdCByZXEubWFya2VyIG9yIGFueShleHRyYV9ldmFscykKCgpjbGFzcyBFbnZpcm9ubWVudDoKICAgICIiIlNlYXJjaGFibGUgc25hcHNob3Qgb2YgZGlzdHJpYnV0aW9ucyBvbiBhIHNlYXJjaCBwYXRoIiIiCgogICAgZGVmIF9faW5pdF9fKAogICAgICAgICAgICBzZWxmLCBzZWFyY2hfcGF0aD1Ob25lLCBwbGF0Zm9ybT1nZXRfc3VwcG9ydGVkX3BsYXRmb3JtKCksCiAgICAgICAgICAgIHB5dGhvbj1QWV9NQUpPUik6CiAgICAgICAgIiIiU25hcHNob3QgZGlzdHJpYnV0aW9ucyBhdmFpbGFibGUgb24gYSBzZWFyY2ggcGF0aAoKICAgICAgICBBbnkgZGlzdHJpYnV0aW9ucyBmb3VuZCBvbiBgc2VhcmNoX3BhdGhgIGFyZSBhZGRlZCB0byB0aGUgZW52aXJvbm1lbnQuCiAgICAgICAgYHNlYXJjaF9wYXRoYCBzaG91bGQgYmUgYSBzZXF1ZW5jZSBvZiBgYHN5cy5wYXRoYGAgaXRlbXMuICBJZiBub3QKICAgICAgICBzdXBwbGllZCwgYGBzeXMucGF0aGBgIGlzIHVzZWQuCgogICAgICAgIGBwbGF0Zm9ybWAgaXMgYW4gb3B0aW9uYWwgc3RyaW5nIHNwZWNpZnlpbmcgdGhlIG5hbWUgb2YgdGhlIHBsYXRmb3JtCiAgICAgICAgdGhhdCBwbGF0Zm9ybS1zcGVjaWZpYyBkaXN0cmlidXRpb25zIG11c3QgYmUgY29tcGF0aWJsZSB3aXRoLiAgSWYKICAgICAgICB1bnNwZWNpZmllZCwgaXQgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgcGxhdGZvcm0uICBgcHl0aG9uYCBpcyBhbgogICAgICAgIG9wdGlvbmFsIHN0cmluZyBuYW1pbmcgdGhlIGRlc2lyZWQgdmVyc2lvbiBvZiBQeXRob24gKGUuZy4gYGAnMy42J2BgKTsKICAgICAgICBpdCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCB2ZXJzaW9uLgoKICAgICAgICBZb3UgbWF5IGV4cGxpY2l0bHkgc2V0IGBwbGF0Zm9ybWAgKGFuZC9vciBgcHl0aG9uYCkgdG8gYGBOb25lYGAgaWYgeW91CiAgICAgICAgd2lzaCB0byBtYXAgKmFsbCogZGlzdHJpYnV0aW9ucywgbm90IGp1c3QgdGhvc2UgY29tcGF0aWJsZSB3aXRoIHRoZQogICAgICAgIHJ1bm5pbmcgcGxhdGZvcm0gb3IgUHl0aG9uIHZlcnNpb24uCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5fZGlzdG1hcCA9IHt9CiAgICAgICAgc2VsZi5wbGF0Zm9ybSA9IHBsYXRmb3JtCiAgICAgICAgc2VsZi5weXRob24gPSBweXRob24KICAgICAgICBzZWxmLnNjYW4oc2VhcmNoX3BhdGgpCgogICAgZGVmIGNhbl9hZGQoc2VsZiwgZGlzdCk6CiAgICAgICAgIiIiSXMgZGlzdHJpYnV0aW9uIGBkaXN0YCBhY2NlcHRhYmxlIGZvciB0aGlzIGVudmlyb25tZW50PwoKICAgICAgICBUaGUgZGlzdHJpYnV0aW9uIG11c3QgbWF0Y2ggdGhlIHBsYXRmb3JtIGFuZCBweXRob24gdmVyc2lvbgogICAgICAgIHJlcXVpcmVtZW50cyBzcGVjaWZpZWQgd2hlbiB0aGlzIGVudmlyb25tZW50IHdhcyBjcmVhdGVkLCBvciBGYWxzZQogICAgICAgIGlzIHJldHVybmVkLgogICAgICAgICIiIgogICAgICAgIHB5X2NvbXBhdCA9ICgKICAgICAgICAgICAgc2VsZi5weXRob24gaXMgTm9uZQogICAgICAgICAgICBvciBkaXN0LnB5X3ZlcnNpb24gaXMgTm9uZQogICAgICAgICAgICBvciBkaXN0LnB5X3ZlcnNpb24gPT0gc2VsZi5weXRob24KICAgICAgICApCiAgICAgICAgcmV0dXJuIHB5X2NvbXBhdCBhbmQgY29tcGF0aWJsZV9wbGF0Zm9ybXMoZGlzdC5wbGF0Zm9ybSwgc2VsZi5wbGF0Zm9ybSkKCiAgICBkZWYgcmVtb3ZlKHNlbGYsIGRpc3QpOgogICAgICAgICIiIlJlbW92ZSBgZGlzdGAgZnJvbSB0aGUgZW52aXJvbm1lbnQiIiIKICAgICAgICBzZWxmLl9kaXN0bWFwW2Rpc3Qua2V5XS5yZW1vdmUoZGlzdCkKCiAgICBkZWYgc2NhbihzZWxmLCBzZWFyY2hfcGF0aD1Ob25lKToKICAgICAgICAiIiJTY2FuIGBzZWFyY2hfcGF0aGAgZm9yIGRpc3RyaWJ1dGlvbnMgdXNhYmxlIGluIHRoaXMgZW52aXJvbm1lbnQKCiAgICAgICAgQW55IGRpc3RyaWJ1dGlvbnMgZm91bmQgYXJlIGFkZGVkIHRvIHRoZSBlbnZpcm9ubWVudC4KICAgICAgICBgc2VhcmNoX3BhdGhgIHNob3VsZCBiZSBhIHNlcXVlbmNlIG9mIGBgc3lzLnBhdGhgYCBpdGVtcy4gIElmIG5vdAogICAgICAgIHN1cHBsaWVkLCBgYHN5cy5wYXRoYGAgaXMgdXNlZC4gIE9ubHkgZGlzdHJpYnV0aW9ucyBjb25mb3JtaW5nIHRvCiAgICAgICAgdGhlIHBsYXRmb3JtL3B5dGhvbiB2ZXJzaW9uIGRlZmluZWQgYXQgaW5pdGlhbGl6YXRpb24gYXJlIGFkZGVkLgogICAgICAgICIiIgogICAgICAgIGlmIHNlYXJjaF9wYXRoIGlzIE5vbmU6CiAgICAgICAgICAgIHNlYXJjaF9wYXRoID0gc3lzLnBhdGgKCiAgICAgICAgZm9yIGl0ZW0gaW4gc2VhcmNoX3BhdGg6CiAgICAgICAgICAgIGZvciBkaXN0IGluIGZpbmRfZGlzdHJpYnV0aW9ucyhpdGVtKToKICAgICAgICAgICAgICAgIHNlbGYuYWRkKGRpc3QpCgogICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIHByb2plY3RfbmFtZSk6CiAgICAgICAgIiIiUmV0dXJuIGEgbmV3ZXN0LXRvLW9sZGVzdCBsaXN0IG9mIGRpc3RyaWJ1dGlvbnMgZm9yIGBwcm9qZWN0X25hbWVgCgogICAgICAgIFVzZXMgY2FzZS1pbnNlbnNpdGl2ZSBgcHJvamVjdF9uYW1lYCBjb21wYXJpc29uLCBhc3N1bWluZyBhbGwgdGhlCiAgICAgICAgcHJvamVjdCdzIGRpc3RyaWJ1dGlvbnMgdXNlIHRoZWlyIHByb2plY3QncyBuYW1lIGNvbnZlcnRlZCB0byBhbGwKICAgICAgICBsb3dlcmNhc2UgYXMgdGhlaXIga2V5LgoKICAgICAgICAiIiIKICAgICAgICBkaXN0cmlidXRpb25fa2V5ID0gcHJvamVjdF9uYW1lLmxvd2VyKCkKICAgICAgICByZXR1cm4gc2VsZi5fZGlzdG1hcC5nZXQoZGlzdHJpYnV0aW9uX2tleSwgW10pCgogICAgZGVmIGFkZChzZWxmLCBkaXN0KToKICAgICAgICAiIiJBZGQgYGRpc3RgIGlmIHdlIGBgY2FuX2FkZCgpYGAgaXQgYW5kIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFkZGVkCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5jYW5fYWRkKGRpc3QpIGFuZCBkaXN0Lmhhc192ZXJzaW9uKCk6CiAgICAgICAgICAgIGRpc3RzID0gc2VsZi5fZGlzdG1hcC5zZXRkZWZhdWx0KGRpc3Qua2V5LCBbXSkKICAgICAgICAgICAgaWYgZGlzdCBub3QgaW4gZGlzdHM6CiAgICAgICAgICAgICAgICBkaXN0cy5hcHBlbmQoZGlzdCkKICAgICAgICAgICAgICAgIGRpc3RzLnNvcnQoa2V5PW9wZXJhdG9yLmF0dHJnZXR0ZXIoJ2hhc2hjbXAnKSwgcmV2ZXJzZT1UcnVlKQoKICAgIGRlZiBiZXN0X21hdGNoKAogICAgICAgICAgICBzZWxmLCByZXEsIHdvcmtpbmdfc2V0LCBpbnN0YWxsZXI9Tm9uZSwgcmVwbGFjZV9jb25mbGljdGluZz1GYWxzZSk6CiAgICAgICAgIiIiRmluZCBkaXN0cmlidXRpb24gYmVzdCBtYXRjaGluZyBgcmVxYCBhbmQgdXNhYmxlIG9uIGB3b3JraW5nX3NldGAKCiAgICAgICAgVGhpcyBjYWxscyB0aGUgYGBmaW5kKHJlcSlgYCBtZXRob2Qgb2YgdGhlIGB3b3JraW5nX3NldGAgdG8gc2VlIGlmIGEKICAgICAgICBzdWl0YWJsZSBkaXN0cmlidXRpb24gaXMgYWxyZWFkeSBhY3RpdmUuICAoVGhpcyBtYXkgcmFpc2UKICAgICAgICBgYFZlcnNpb25Db25mbGljdGBgIGlmIGFuIHVuc3VpdGFibGUgdmVyc2lvbiBvZiB0aGUgcHJvamVjdCBpcyBhbHJlYWR5CiAgICAgICAgYWN0aXZlIGluIHRoZSBzcGVjaWZpZWQgYHdvcmtpbmdfc2V0YC4pICBJZiBhIHN1aXRhYmxlIGRpc3RyaWJ1dGlvbgogICAgICAgIGlzbid0IGFjdGl2ZSwgdGhpcyBtZXRob2QgcmV0dXJucyB0aGUgbmV3ZXN0IGRpc3RyaWJ1dGlvbiBpbiB0aGUKICAgICAgICBlbnZpcm9ubWVudCB0aGF0IG1lZXRzIHRoZSBgYFJlcXVpcmVtZW50YGAgaW4gYHJlcWAuICBJZiBubyBzdWl0YWJsZQogICAgICAgIGRpc3RyaWJ1dGlvbiBpcyBmb3VuZCwgYW5kIGBpbnN0YWxsZXJgIGlzIHN1cHBsaWVkLCB0aGVuIHRoZSByZXN1bHQgb2YKICAgICAgICBjYWxsaW5nIHRoZSBlbnZpcm9ubWVudCdzIGBgb2J0YWluKHJlcSwgaW5zdGFsbGVyKWBgIG1ldGhvZCB3aWxsIGJlCiAgICAgICAgcmV0dXJuZWQuCiAgICAgICAgIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICBkaXN0ID0gd29ya2luZ19zZXQuZmluZChyZXEpCiAgICAgICAgZXhjZXB0IFZlcnNpb25Db25mbGljdDoKICAgICAgICAgICAgaWYgbm90IHJlcGxhY2VfY29uZmxpY3Rpbmc6CiAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICAgICBkaXN0ID0gTm9uZQogICAgICAgIGlmIGRpc3QgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJldHVybiBkaXN0CiAgICAgICAgZm9yIGRpc3QgaW4gc2VsZltyZXEua2V5XToKICAgICAgICAgICAgaWYgZGlzdCBpbiByZXE6CiAgICAgICAgICAgICAgICByZXR1cm4gZGlzdAogICAgICAgICMgdHJ5IHRvIGRvd25sb2FkL2luc3RhbGwKICAgICAgICByZXR1cm4gc2VsZi5vYnRhaW4ocmVxLCBpbnN0YWxsZXIpCgogICAgZGVmIG9idGFpbihzZWxmLCByZXF1aXJlbWVudCwgaW5zdGFsbGVyPU5vbmUpOgogICAgICAgICIiIk9idGFpbiBhIGRpc3RyaWJ1dGlvbiBtYXRjaGluZyBgcmVxdWlyZW1lbnRgIChlLmcuIHZpYSBkb3dubG9hZCkKCiAgICAgICAgT2J0YWluIGEgZGlzdHJvIHRoYXQgbWF0Y2hlcyByZXF1aXJlbWVudCAoZS5nLiB2aWEgZG93bmxvYWQpLiAgSW4gdGhlCiAgICAgICAgYmFzZSBgYEVudmlyb25tZW50YGAgY2xhc3MsIHRoaXMgcm91dGluZSBqdXN0IHJldHVybnMKICAgICAgICBgYGluc3RhbGxlcihyZXF1aXJlbWVudClgYCwgdW5sZXNzIGBpbnN0YWxsZXJgIGlzIE5vbmUsIGluIHdoaWNoIGNhc2UKICAgICAgICBOb25lIGlzIHJldHVybmVkIGluc3RlYWQuICBUaGlzIG1ldGhvZCBpcyBhIGhvb2sgdGhhdCBhbGxvd3Mgc3ViY2xhc3NlcwogICAgICAgIHRvIGF0dGVtcHQgb3RoZXIgd2F5cyBvZiBvYnRhaW5pbmcgYSBkaXN0cmlidXRpb24gYmVmb3JlIGZhbGxpbmcgYmFjawogICAgICAgIHRvIHRoZSBgaW5zdGFsbGVyYCBhcmd1bWVudC4iIiIKICAgICAgICBpZiBpbnN0YWxsZXIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJldHVybiBpbnN0YWxsZXIocmVxdWlyZW1lbnQpCgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgICIiIllpZWxkIHRoZSB1bmlxdWUgcHJvamVjdCBuYW1lcyBvZiB0aGUgYXZhaWxhYmxlIGRpc3RyaWJ1dGlvbnMiIiIKICAgICAgICBmb3Iga2V5IGluIHNlbGYuX2Rpc3RtYXAua2V5cygpOgogICAgICAgICAgICBpZiBzZWxmW2tleV06CiAgICAgICAgICAgICAgICB5aWVsZCBrZXkKCiAgICBkZWYgX19pYWRkX18oc2VsZiwgb3RoZXIpOgogICAgICAgICIiIkluLXBsYWNlIGFkZGl0aW9uIG9mIGEgZGlzdHJpYnV0aW9uIG9yIGVudmlyb25tZW50IiIiCiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgRGlzdHJpYnV0aW9uKToKICAgICAgICAgICAgc2VsZi5hZGQob3RoZXIpCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKG90aGVyLCBFbnZpcm9ubWVudCk6CiAgICAgICAgICAgIGZvciBwcm9qZWN0IGluIG90aGVyOgogICAgICAgICAgICAgICAgZm9yIGRpc3QgaW4gb3RoZXJbcHJvamVjdF06CiAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGQoZGlzdCkKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIkNhbid0IGFkZCAlciB0byBlbnZpcm9ubWVudCIgJSAob3RoZXIsKSkKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBfX2FkZF9fKHNlbGYsIG90aGVyKToKICAgICAgICAiIiJBZGQgYW4gZW52aXJvbm1lbnQgb3IgZGlzdHJpYnV0aW9uIHRvIGFuIGVudmlyb25tZW50IiIiCiAgICAgICAgbmV3ID0gc2VsZi5fX2NsYXNzX18oW10sIHBsYXRmb3JtPU5vbmUsIHB5dGhvbj1Ob25lKQogICAgICAgIGZvciBlbnYgaW4gc2VsZiwgb3RoZXI6CiAgICAgICAgICAgIG5ldyArPSBlbnYKICAgICAgICByZXR1cm4gbmV3CgoKIyBYWFggYmFja3dhcmQgY29tcGF0aWJpbGl0eQpBdmFpbGFibGVEaXN0cmlidXRpb25zID0gRW52aXJvbm1lbnQKCgpjbGFzcyBFeHRyYWN0aW9uRXJyb3IoUnVudGltZUVycm9yKToKICAgICIiIkFuIGVycm9yIG9jY3VycmVkIGV4dHJhY3RpbmcgYSByZXNvdXJjZQoKICAgIFRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgYXZhaWxhYmxlIGZyb20gaW5zdGFuY2VzIG9mIHRoaXMgZXhjZXB0aW9uOgoKICAgIG1hbmFnZXIKICAgICAgICBUaGUgcmVzb3VyY2UgbWFuYWdlciB0aGF0IHJhaXNlZCB0aGlzIGV4Y2VwdGlvbgoKICAgIGNhY2hlX3BhdGgKICAgICAgICBUaGUgYmFzZSBkaXJlY3RvcnkgZm9yIHJlc291cmNlIGV4dHJhY3Rpb24KCiAgICBvcmlnaW5hbF9lcnJvcgogICAgICAgIFRoZSBleGNlcHRpb24gaW5zdGFuY2UgdGhhdCBjYXVzZWQgZXh0cmFjdGlvbiB0byBmYWlsCiAgICAiIiIKCgpjbGFzcyBSZXNvdXJjZU1hbmFnZXI6CiAgICAiIiJNYW5hZ2UgcmVzb3VyY2UgZXh0cmFjdGlvbiBhbmQgcGFja2FnZXMiIiIKICAgIGV4dHJhY3Rpb25fcGF0aCA9IE5vbmUKCiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc2VsZi5jYWNoZWRfZmlsZXMgPSB7fQoKICAgIGRlZiByZXNvdXJjZV9leGlzdHMoc2VsZiwgcGFja2FnZV9vcl9yZXF1aXJlbWVudCwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgIiIiRG9lcyB0aGUgbmFtZWQgcmVzb3VyY2UgZXhpc3Q/IiIiCiAgICAgICAgcmV0dXJuIGdldF9wcm92aWRlcihwYWNrYWdlX29yX3JlcXVpcmVtZW50KS5oYXNfcmVzb3VyY2UocmVzb3VyY2VfbmFtZSkKCiAgICBkZWYgcmVzb3VyY2VfaXNkaXIoc2VsZiwgcGFja2FnZV9vcl9yZXF1aXJlbWVudCwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgIiIiSXMgdGhlIG5hbWVkIHJlc291cmNlIGFuIGV4aXN0aW5nIGRpcmVjdG9yeT8iIiIKICAgICAgICByZXR1cm4gZ2V0X3Byb3ZpZGVyKHBhY2thZ2Vfb3JfcmVxdWlyZW1lbnQpLnJlc291cmNlX2lzZGlyKAogICAgICAgICAgICByZXNvdXJjZV9uYW1lCiAgICAgICAgKQoKICAgIGRlZiByZXNvdXJjZV9maWxlbmFtZShzZWxmLCBwYWNrYWdlX29yX3JlcXVpcmVtZW50LCByZXNvdXJjZV9uYW1lKToKICAgICAgICAiIiJSZXR1cm4gYSB0cnVlIGZpbGVzeXN0ZW0gcGF0aCBmb3Igc3BlY2lmaWVkIHJlc291cmNlIiIiCiAgICAgICAgcmV0dXJuIGdldF9wcm92aWRlcihwYWNrYWdlX29yX3JlcXVpcmVtZW50KS5nZXRfcmVzb3VyY2VfZmlsZW5hbWUoCiAgICAgICAgICAgIHNlbGYsIHJlc291cmNlX25hbWUKICAgICAgICApCgogICAgZGVmIHJlc291cmNlX3N0cmVhbShzZWxmLCBwYWNrYWdlX29yX3JlcXVpcmVtZW50LCByZXNvdXJjZV9uYW1lKToKICAgICAgICAiIiJSZXR1cm4gYSByZWFkYWJsZSBmaWxlLWxpa2Ugb2JqZWN0IGZvciBzcGVjaWZpZWQgcmVzb3VyY2UiIiIKICAgICAgICByZXR1cm4gZ2V0X3Byb3ZpZGVyKHBhY2thZ2Vfb3JfcmVxdWlyZW1lbnQpLmdldF9yZXNvdXJjZV9zdHJlYW0oCiAgICAgICAgICAgIHNlbGYsIHJlc291cmNlX25hbWUKICAgICAgICApCgogICAgZGVmIHJlc291cmNlX3N0cmluZyhzZWxmLCBwYWNrYWdlX29yX3JlcXVpcmVtZW50LCByZXNvdXJjZV9uYW1lKToKICAgICAgICAiIiJSZXR1cm4gc3BlY2lmaWVkIHJlc291cmNlIGFzIGEgc3RyaW5nIiIiCiAgICAgICAgcmV0dXJuIGdldF9wcm92aWRlcihwYWNrYWdlX29yX3JlcXVpcmVtZW50KS5nZXRfcmVzb3VyY2Vfc3RyaW5nKAogICAgICAgICAgICBzZWxmLCByZXNvdXJjZV9uYW1lCiAgICAgICAgKQoKICAgIGRlZiByZXNvdXJjZV9saXN0ZGlyKHNlbGYsIHBhY2thZ2Vfb3JfcmVxdWlyZW1lbnQsIHJlc291cmNlX25hbWUpOgogICAgICAgICIiIkxpc3QgdGhlIGNvbnRlbnRzIG9mIHRoZSBuYW1lZCByZXNvdXJjZSBkaXJlY3RvcnkiIiIKICAgICAgICByZXR1cm4gZ2V0X3Byb3ZpZGVyKHBhY2thZ2Vfb3JfcmVxdWlyZW1lbnQpLnJlc291cmNlX2xpc3RkaXIoCiAgICAgICAgICAgIHJlc291cmNlX25hbWUKICAgICAgICApCgogICAgZGVmIGV4dHJhY3Rpb25fZXJyb3Ioc2VsZik6CiAgICAgICAgIiIiR2l2ZSBhbiBlcnJvciBtZXNzYWdlIGZvciBwcm9ibGVtcyBleHRyYWN0aW5nIGZpbGUocykiIiIKCiAgICAgICAgb2xkX2V4YyA9IHN5cy5leGNfaW5mbygpWzFdCiAgICAgICAgY2FjaGVfcGF0aCA9IHNlbGYuZXh0cmFjdGlvbl9wYXRoIG9yIGdldF9kZWZhdWx0X2NhY2hlKCkKCiAgICAgICAgdG1wbCA9IHRleHR3cmFwLmRlZGVudCgiIiIKICAgICAgICAgICAgQ2FuJ3QgZXh0cmFjdCBmaWxlKHMpIHRvIGVnZyBjYWNoZQoKICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBlcnJvciBvY2N1cnJlZCB3aGlsZSB0cnlpbmcgdG8gZXh0cmFjdCBmaWxlKHMpCiAgICAgICAgICAgIHRvIHRoZSBQeXRob24gZWdnIGNhY2hlOgoKICAgICAgICAgICAgICB7b2xkX2V4Y30KCiAgICAgICAgICAgIFRoZSBQeXRob24gZWdnIGNhY2hlIGRpcmVjdG9yeSBpcyBjdXJyZW50bHkgc2V0IHRvOgoKICAgICAgICAgICAgICB7Y2FjaGVfcGF0aH0KCiAgICAgICAgICAgIFBlcmhhcHMgeW91ciBhY2NvdW50IGRvZXMgbm90IGhhdmUgd3JpdGUgYWNjZXNzIHRvIHRoaXMgZGlyZWN0b3J5PwogICAgICAgICAgICBZb3UgY2FuIGNoYW5nZSB0aGUgY2FjaGUgZGlyZWN0b3J5IGJ5IHNldHRpbmcgdGhlIFBZVEhPTl9FR0dfQ0FDSEUKICAgICAgICAgICAgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gcG9pbnQgdG8gYW4gYWNjZXNzaWJsZSBkaXJlY3RvcnkuCiAgICAgICAgICAgICIiIikubHN0cmlwKCkKICAgICAgICBlcnIgPSBFeHRyYWN0aW9uRXJyb3IodG1wbC5mb3JtYXQoKipsb2NhbHMoKSkpCiAgICAgICAgZXJyLm1hbmFnZXIgPSBzZWxmCiAgICAgICAgZXJyLmNhY2hlX3BhdGggPSBjYWNoZV9wYXRoCiAgICAgICAgZXJyLm9yaWdpbmFsX2Vycm9yID0gb2xkX2V4YwogICAgICAgIHJhaXNlIGVycgoKICAgIGRlZiBnZXRfY2FjaGVfcGF0aChzZWxmLCBhcmNoaXZlX25hbWUsIG5hbWVzPSgpKToKICAgICAgICAiIiJSZXR1cm4gYWJzb2x1dGUgbG9jYXRpb24gaW4gY2FjaGUgZm9yIGBhcmNoaXZlX25hbWVgIGFuZCBgbmFtZXNgCgogICAgICAgIFRoZSBwYXJlbnQgZGlyZWN0b3J5IG9mIHRoZSByZXN1bHRpbmcgcGF0aCB3aWxsIGJlIGNyZWF0ZWQgaWYgaXQgZG9lcwogICAgICAgIG5vdCBhbHJlYWR5IGV4aXN0LiAgYGFyY2hpdmVfbmFtZWAgc2hvdWxkIGJlIHRoZSBiYXNlIGZpbGVuYW1lIG9mIHRoZQogICAgICAgIGVuY2xvc2luZyBlZ2cgKHdoaWNoIG1heSBub3QgYmUgdGhlIG5hbWUgb2YgdGhlIGVuY2xvc2luZyB6aXBmaWxlISksCiAgICAgICAgaW5jbHVkaW5nIGl0cyAiLmVnZyIgZXh0ZW5zaW9uLiAgYG5hbWVzYCwgaWYgcHJvdmlkZWQsIHNob3VsZCBiZSBhCiAgICAgICAgc2VxdWVuY2Ugb2YgcGF0aCBuYW1lIHBhcnRzICJ1bmRlciIgdGhlIGVnZydzIGV4dHJhY3Rpb24gbG9jYXRpb24uCgogICAgICAgIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBieSByZXNvdXJjZSBwcm92aWRlcnMgdGhhdCBuZWVkIHRvCiAgICAgICAgb2J0YWluIGFuIGV4dHJhY3Rpb24gbG9jYXRpb24sIGFuZCBvbmx5IGZvciBuYW1lcyB0aGV5IGludGVuZCB0bwogICAgICAgIGV4dHJhY3QsIGFzIGl0IHRyYWNrcyB0aGUgZ2VuZXJhdGVkIG5hbWVzIGZvciBwb3NzaWJsZSBjbGVhbnVwIGxhdGVyLgogICAgICAgICIiIgogICAgICAgIGV4dHJhY3RfcGF0aCA9IHNlbGYuZXh0cmFjdGlvbl9wYXRoIG9yIGdldF9kZWZhdWx0X2NhY2hlKCkKICAgICAgICB0YXJnZXRfcGF0aCA9IG9zLnBhdGguam9pbihleHRyYWN0X3BhdGgsIGFyY2hpdmVfbmFtZSArICctdG1wJywgKm5hbWVzKQogICAgICAgIHRyeToKICAgICAgICAgICAgX2J5cGFzc19lbnN1cmVfZGlyZWN0b3J5KHRhcmdldF9wYXRoKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIHNlbGYuZXh0cmFjdGlvbl9lcnJvcigpCgogICAgICAgIHNlbGYuX3dhcm5fdW5zYWZlX2V4dHJhY3Rpb25fcGF0aChleHRyYWN0X3BhdGgpCgogICAgICAgIHNlbGYuY2FjaGVkX2ZpbGVzW3RhcmdldF9wYXRoXSA9IDEKICAgICAgICByZXR1cm4gdGFyZ2V0X3BhdGgKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX3dhcm5fdW5zYWZlX2V4dHJhY3Rpb25fcGF0aChwYXRoKToKICAgICAgICAiIiIKICAgICAgICBJZiB0aGUgZGVmYXVsdCBleHRyYWN0aW9uIHBhdGggaXMgb3ZlcnJpZGRlbiBhbmQgc2V0IHRvIGFuIGluc2VjdXJlCiAgICAgICAgbG9jYXRpb24sIHN1Y2ggYXMgL3RtcCwgaXQgb3BlbnMgdXAgYW4gb3Bwb3J0dW5pdHkgZm9yIGFuIGF0dGFja2VyIHRvCiAgICAgICAgcmVwbGFjZSBhbiBleHRyYWN0ZWQgZmlsZSB3aXRoIGFuIHVuYXV0aG9yaXplZCBwYXlsb2FkLiBXYXJuIHRoZSB1c2VyCiAgICAgICAgaWYgYSBrbm93biBpbnNlY3VyZSBsb2NhdGlvbiBpcyB1c2VkLgoKICAgICAgICBTZWUgRGlzdHJpYnV0ZSAjMzc1IGZvciBtb3JlIGRldGFpbHMuCiAgICAgICAgIiIiCiAgICAgICAgaWYgb3MubmFtZSA9PSAnbnQnIGFuZCBub3QgcGF0aC5zdGFydHN3aXRoKG9zLmVudmlyb25bJ3dpbmRpciddKToKICAgICAgICAgICAgIyBPbiBXaW5kb3dzLCBwZXJtaXNzaW9ucyBhcmUgZ2VuZXJhbGx5IHJlc3RyaWN0aXZlIGJ5IGRlZmF1bHQKICAgICAgICAgICAgIyAgYW5kIHRlbXAgZGlyZWN0b3JpZXMgYXJlIG5vdCB3cml0YWJsZSBieSBvdGhlciB1c2Vycywgc28KICAgICAgICAgICAgIyAgYnlwYXNzIHRoZSB3YXJuaW5nLgogICAgICAgICAgICByZXR1cm4KICAgICAgICBtb2RlID0gb3Muc3RhdChwYXRoKS5zdF9tb2RlCiAgICAgICAgaWYgbW9kZSAmIHN0YXQuU19JV09USCBvciBtb2RlICYgc3RhdC5TX0lXR1JQOgogICAgICAgICAgICBtc2cgPSAoCiAgICAgICAgICAgICAgICAiJXMgaXMgd3JpdGFibGUgYnkgZ3JvdXAvb3RoZXJzIGFuZCB2dWxuZXJhYmxlIHRvIGF0dGFjayAiCiAgICAgICAgICAgICAgICAid2hlbiAiCiAgICAgICAgICAgICAgICAidXNlZCB3aXRoIGdldF9yZXNvdXJjZV9maWxlbmFtZS4gQ29uc2lkZXIgYSBtb3JlIHNlY3VyZSAiCiAgICAgICAgICAgICAgICAibG9jYXRpb24gKHNldCB3aXRoIC5zZXRfZXh0cmFjdGlvbl9wYXRoIG9yIHRoZSAiCiAgICAgICAgICAgICAgICAiUFlUSE9OX0VHR19DQUNIRSBlbnZpcm9ubWVudCB2YXJpYWJsZSkuIiAlIHBhdGgKICAgICAgICAgICAgKQogICAgICAgICAgICB3YXJuaW5ncy53YXJuKG1zZywgVXNlcldhcm5pbmcpCgogICAgZGVmIHBvc3Rwcm9jZXNzKHNlbGYsIHRlbXBuYW1lLCBmaWxlbmFtZSk6CiAgICAgICAgIiIiUGVyZm9ybSBhbnkgcGxhdGZvcm0tc3BlY2lmaWMgcG9zdHByb2Nlc3Npbmcgb2YgYHRlbXBuYW1lYAoKICAgICAgICBUaGlzIGlzIHdoZXJlIE1hYyBoZWFkZXIgcmV3cml0ZXMgc2hvdWxkIGJlIGRvbmU7IG90aGVyIHBsYXRmb3JtcyBkb24ndAogICAgICAgIGhhdmUgYW55dGhpbmcgc3BlY2lhbCB0aGV5IHNob3VsZCBkby4KCiAgICAgICAgUmVzb3VyY2UgcHJvdmlkZXJzIHNob3VsZCBjYWxsIHRoaXMgbWV0aG9kIE9OTFkgYWZ0ZXIgc3VjY2Vzc2Z1bGx5CiAgICAgICAgZXh0cmFjdGluZyBhIGNvbXByZXNzZWQgcmVzb3VyY2UuICBUaGV5IG11c3QgTk9UIGNhbGwgaXQgb24gcmVzb3VyY2VzCiAgICAgICAgdGhhdCBhcmUgYWxyZWFkeSBpbiB0aGUgZmlsZXN5c3RlbS4KCiAgICAgICAgYHRlbXBuYW1lYCBpcyB0aGUgY3VycmVudCAodGVtcG9yYXJ5KSBuYW1lIG9mIHRoZSBmaWxlLCBhbmQgYGZpbGVuYW1lYAogICAgICAgIGlzIHRoZSBuYW1lIGl0IHdpbGwgYmUgcmVuYW1lZCB0byBieSB0aGUgY2FsbGVyIGFmdGVyIHRoaXMgcm91dGluZQogICAgICAgIHJldHVybnMuCiAgICAgICAgIiIiCgogICAgICAgIGlmIG9zLm5hbWUgPT0gJ3Bvc2l4JzoKICAgICAgICAgICAgIyBNYWtlIHRoZSByZXNvdXJjZSBleGVjdXRhYmxlCiAgICAgICAgICAgIG1vZGUgPSAoKG9zLnN0YXQodGVtcG5hbWUpLnN0X21vZGUpIHwgMG81NTUpICYgMG83Nzc3CiAgICAgICAgICAgIG9zLmNobW9kKHRlbXBuYW1lLCBtb2RlKQoKICAgIGRlZiBzZXRfZXh0cmFjdGlvbl9wYXRoKHNlbGYsIHBhdGgpOgogICAgICAgICIiIlNldCB0aGUgYmFzZSBwYXRoIHdoZXJlIHJlc291cmNlcyB3aWxsIGJlIGV4dHJhY3RlZCB0bywgaWYgbmVlZGVkLgoKICAgICAgICBJZiB5b3UgZG8gbm90IGNhbGwgdGhpcyByb3V0aW5lIGJlZm9yZSBhbnkgZXh0cmFjdGlvbnMgdGFrZSBwbGFjZSwgdGhlCiAgICAgICAgcGF0aCBkZWZhdWx0cyB0byB0aGUgcmV0dXJuIHZhbHVlIG9mIGBgZ2V0X2RlZmF1bHRfY2FjaGUoKWBgLiAgKFdoaWNoCiAgICAgICAgaXMgYmFzZWQgb24gdGhlIGBgUFlUSE9OX0VHR19DQUNIRWBgIGVudmlyb25tZW50IHZhcmlhYmxlLCB3aXRoIHZhcmlvdXMKICAgICAgICBwbGF0Zm9ybS1zcGVjaWZpYyBmYWxsYmFja3MuICBTZWUgdGhhdCByb3V0aW5lJ3MgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZQogICAgICAgIGRldGFpbHMuKQoKICAgICAgICBSZXNvdXJjZXMgYXJlIGV4dHJhY3RlZCB0byBzdWJkaXJlY3RvcmllcyBvZiB0aGlzIHBhdGggYmFzZWQgdXBvbgogICAgICAgIGluZm9ybWF0aW9uIGdpdmVuIGJ5IHRoZSBgYElSZXNvdXJjZVByb3ZpZGVyYGAuICBZb3UgbWF5IHNldCB0aGlzIHRvIGEKICAgICAgICB0ZW1wb3JhcnkgZGlyZWN0b3J5LCBidXQgdGhlbiB5b3UgbXVzdCBjYWxsIGBgY2xlYW51cF9yZXNvdXJjZXMoKWBgIHRvCiAgICAgICAgZGVsZXRlIHRoZSBleHRyYWN0ZWQgZmlsZXMgd2hlbiBkb25lLiAgVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQKICAgICAgICBgYGNsZWFudXBfcmVzb3VyY2VzKClgYCB3aWxsIGJlIGFibGUgdG8gcmVtb3ZlIGFsbCBleHRyYWN0ZWQgZmlsZXMuCgogICAgICAgIChOb3RlOiB5b3UgbWF5IG5vdCBjaGFuZ2UgdGhlIGV4dHJhY3Rpb24gcGF0aCBmb3IgYSBnaXZlbiByZXNvdXJjZQogICAgICAgIG1hbmFnZXIgb25jZSByZXNvdXJjZXMgaGF2ZSBiZWVuIGV4dHJhY3RlZCwgdW5sZXNzIHlvdSBmaXJzdCBjYWxsCiAgICAgICAgYGBjbGVhbnVwX3Jlc291cmNlcygpYGAuKQogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYuY2FjaGVkX2ZpbGVzOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAogICAgICAgICAgICAgICAgIkNhbid0IGNoYW5nZSBleHRyYWN0aW9uIHBhdGgsIGZpbGVzIGFscmVhZHkgZXh0cmFjdGVkIgogICAgICAgICAgICApCgogICAgICAgIHNlbGYuZXh0cmFjdGlvbl9wYXRoID0gcGF0aAoKICAgIGRlZiBjbGVhbnVwX3Jlc291cmNlcyhzZWxmLCBmb3JjZT1GYWxzZSk6CiAgICAgICAgIiIiCiAgICAgICAgRGVsZXRlIGFsbCBleHRyYWN0ZWQgcmVzb3VyY2UgZmlsZXMgYW5kIGRpcmVjdG9yaWVzLCByZXR1cm5pbmcgYSBsaXN0CiAgICAgICAgb2YgdGhlIGZpbGUgYW5kIGRpcmVjdG9yeSBuYW1lcyB0aGF0IGNvdWxkIG5vdCBiZSBzdWNjZXNzZnVsbHkgcmVtb3ZlZC4KICAgICAgICBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGhhdmUgYW55IGNvbmN1cnJlbmN5IHByb3RlY3Rpb24sIHNvIGl0IHNob3VsZAogICAgICAgIGdlbmVyYWxseSBvbmx5IGJlIGNhbGxlZCB3aGVuIHRoZSBleHRyYWN0aW9uIHBhdGggaXMgYSB0ZW1wb3JhcnkKICAgICAgICBkaXJlY3RvcnkgZXhjbHVzaXZlIHRvIGEgc2luZ2xlIHByb2Nlc3MuICBUaGlzIG1ldGhvZCBpcyBub3QKICAgICAgICBhdXRvbWF0aWNhbGx5IGNhbGxlZDsgeW91IG11c3QgY2FsbCBpdCBleHBsaWNpdGx5IG9yIHJlZ2lzdGVyIGl0IGFzIGFuCiAgICAgICAgYGBhdGV4aXRgYCBmdW5jdGlvbiBpZiB5b3Ugd2lzaCB0byBlbnN1cmUgY2xlYW51cCBvZiBhIHRlbXBvcmFyeQogICAgICAgIGRpcmVjdG9yeSB1c2VkIGZvciBleHRyYWN0aW9ucy4KICAgICAgICAiIiIKICAgICAgICAjIFhYWAoKCmRlZiBnZXRfZGVmYXVsdF9jYWNoZSgpOgogICAgIiIiCiAgICBSZXR1cm4gdGhlIGBgUFlUSE9OX0VHR19DQUNIRWBgIGVudmlyb25tZW50IHZhcmlhYmxlCiAgICBvciBhIHBsYXRmb3JtLXJlbGV2YW50IHVzZXIgY2FjaGUgZGlyIGZvciBhbiBhcHAKICAgIG5hbWVkICJQeXRob24tRWdncyIuCiAgICAiIiIKICAgIHJldHVybiAoCiAgICAgICAgb3MuZW52aXJvbi5nZXQoJ1BZVEhPTl9FR0dfQ0FDSEUnKQogICAgICAgIG9yIGFwcGRpcnMudXNlcl9jYWNoZV9kaXIoYXBwbmFtZT0nUHl0aG9uLUVnZ3MnKQogICAgKQoKCmRlZiBzYWZlX25hbWUobmFtZSk6CiAgICAiIiJDb252ZXJ0IGFuIGFyYml0cmFyeSBzdHJpbmcgdG8gYSBzdGFuZGFyZCBkaXN0cmlidXRpb24gbmFtZQoKICAgIEFueSBydW5zIG9mIG5vbi1hbHBoYW51bWVyaWMvLiBjaGFyYWN0ZXJzIGFyZSByZXBsYWNlZCB3aXRoIGEgc2luZ2xlICctJy4KICAgICIiIgogICAgcmV0dXJuIHJlLnN1YignW15BLVphLXowLTkuXSsnLCAnLScsIG5hbWUpCgoKZGVmIHNhZmVfdmVyc2lvbih2ZXJzaW9uKToKICAgICIiIgogICAgQ29udmVydCBhbiBhcmJpdHJhcnkgc3RyaW5nIHRvIGEgc3RhbmRhcmQgdmVyc2lvbiBzdHJpbmcKICAgICIiIgogICAgdHJ5OgogICAgICAgICMgbm9ybWFsaXplIHRoZSB2ZXJzaW9uCiAgICAgICAgcmV0dXJuIHN0cihwYWNrYWdpbmcudmVyc2lvbi5WZXJzaW9uKHZlcnNpb24pKQogICAgZXhjZXB0IHBhY2thZ2luZy52ZXJzaW9uLkludmFsaWRWZXJzaW9uOgogICAgICAgIHZlcnNpb24gPSB2ZXJzaW9uLnJlcGxhY2UoJyAnLCAnLicpCiAgICAgICAgcmV0dXJuIHJlLnN1YignW15BLVphLXowLTkuXSsnLCAnLScsIHZlcnNpb24pCgoKZGVmIHNhZmVfZXh0cmEoZXh0cmEpOgogICAgIiIiQ29udmVydCBhbiBhcmJpdHJhcnkgc3RyaW5nIHRvIGEgc3RhbmRhcmQgJ2V4dHJhJyBuYW1lCgogICAgQW55IHJ1bnMgb2Ygbm9uLWFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIGFyZSByZXBsYWNlZCB3aXRoIGEgc2luZ2xlICdfJywKICAgIGFuZCB0aGUgcmVzdWx0IGlzIGFsd2F5cyBsb3dlcmNhc2VkLgogICAgIiIiCiAgICByZXR1cm4gcmUuc3ViKCdbXkEtWmEtejAtOS4tXSsnLCAnXycsIGV4dHJhKS5sb3dlcigpCgoKZGVmIHRvX2ZpbGVuYW1lKG5hbWUpOgogICAgIiIiQ29udmVydCBhIHByb2plY3Qgb3IgdmVyc2lvbiBuYW1lIHRvIGl0cyBmaWxlbmFtZS1lc2NhcGVkIGZvcm0KCiAgICBBbnkgJy0nIGNoYXJhY3RlcnMgYXJlIGN1cnJlbnRseSByZXBsYWNlZCB3aXRoICdfJy4KICAgICIiIgogICAgcmV0dXJuIG5hbWUucmVwbGFjZSgnLScsICdfJykKCgpkZWYgaW52YWxpZF9tYXJrZXIodGV4dCk6CiAgICAiIiIKICAgIFZhbGlkYXRlIHRleHQgYXMgYSBQRVAgNTA4IGVudmlyb25tZW50IG1hcmtlcjsgcmV0dXJuIGFuIGV4Y2VwdGlvbgogICAgaWYgaW52YWxpZCBvciBGYWxzZSBvdGhlcndpc2UuCiAgICAiIiIKICAgIHRyeToKICAgICAgICBldmFsdWF0ZV9tYXJrZXIodGV4dCkKICAgIGV4Y2VwdCBTeW50YXhFcnJvciBhcyBlOgogICAgICAgIGUuZmlsZW5hbWUgPSBOb25lCiAgICAgICAgZS5saW5lbm8gPSBOb25lCiAgICAgICAgcmV0dXJuIGUKICAgIHJldHVybiBGYWxzZQoKCmRlZiBldmFsdWF0ZV9tYXJrZXIodGV4dCwgZXh0cmE9Tm9uZSk6CiAgICAiIiIKICAgIEV2YWx1YXRlIGEgUEVQIDUwOCBlbnZpcm9ubWVudCBtYXJrZXIuCiAgICBSZXR1cm4gYSBib29sZWFuIGluZGljYXRpbmcgdGhlIG1hcmtlciByZXN1bHQgaW4gdGhpcyBlbnZpcm9ubWVudC4KICAgIFJhaXNlIFN5bnRheEVycm9yIGlmIG1hcmtlciBpcyBpbnZhbGlkLgoKICAgIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcyB0aGUgJ3B5cGFyc2luZycgbW9kdWxlLgogICAgIiIiCiAgICB0cnk6CiAgICAgICAgbWFya2VyID0gcGFja2FnaW5nLm1hcmtlcnMuTWFya2VyKHRleHQpCiAgICAgICAgcmV0dXJuIG1hcmtlci5ldmFsdWF0ZSgpCiAgICBleGNlcHQgcGFja2FnaW5nLm1hcmtlcnMuSW52YWxpZE1hcmtlciBhcyBlOgogICAgICAgIHJhaXNlIFN5bnRheEVycm9yKGUpCgoKY2xhc3MgTnVsbFByb3ZpZGVyOgogICAgIiIiVHJ5IHRvIGltcGxlbWVudCByZXNvdXJjZXMgYW5kIG1ldGFkYXRhIGZvciBhcmJpdHJhcnkgUEVQIDMwMiBsb2FkZXJzIiIiCgogICAgZWdnX25hbWUgPSBOb25lCiAgICBlZ2dfaW5mbyA9IE5vbmUKICAgIGxvYWRlciA9IE5vbmUKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbW9kdWxlKToKICAgICAgICBzZWxmLmxvYWRlciA9IGdldGF0dHIobW9kdWxlLCAnX19sb2FkZXJfXycsIE5vbmUpCiAgICAgICAgc2VsZi5tb2R1bGVfcGF0aCA9IG9zLnBhdGguZGlybmFtZShnZXRhdHRyKG1vZHVsZSwgJ19fZmlsZV9fJywgJycpKQoKICAgIGRlZiBnZXRfcmVzb3VyY2VfZmlsZW5hbWUoc2VsZiwgbWFuYWdlciwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgcmV0dXJuIHNlbGYuX2ZuKHNlbGYubW9kdWxlX3BhdGgsIHJlc291cmNlX25hbWUpCgogICAgZGVmIGdldF9yZXNvdXJjZV9zdHJlYW0oc2VsZiwgbWFuYWdlciwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgcmV0dXJuIGlvLkJ5dGVzSU8oc2VsZi5nZXRfcmVzb3VyY2Vfc3RyaW5nKG1hbmFnZXIsIHJlc291cmNlX25hbWUpKQoKICAgIGRlZiBnZXRfcmVzb3VyY2Vfc3RyaW5nKHNlbGYsIG1hbmFnZXIsIHJlc291cmNlX25hbWUpOgogICAgICAgIHJldHVybiBzZWxmLl9nZXQoc2VsZi5fZm4oc2VsZi5tb2R1bGVfcGF0aCwgcmVzb3VyY2VfbmFtZSkpCgogICAgZGVmIGhhc19yZXNvdXJjZShzZWxmLCByZXNvdXJjZV9uYW1lKToKICAgICAgICByZXR1cm4gc2VsZi5faGFzKHNlbGYuX2ZuKHNlbGYubW9kdWxlX3BhdGgsIHJlc291cmNlX25hbWUpKQoKICAgIGRlZiBfZ2V0X21ldGFkYXRhX3BhdGgoc2VsZiwgbmFtZSk6CiAgICAgICAgcmV0dXJuIHNlbGYuX2ZuKHNlbGYuZWdnX2luZm8sIG5hbWUpCgogICAgZGVmIGhhc19tZXRhZGF0YShzZWxmLCBuYW1lKToKICAgICAgICBpZiBub3Qgc2VsZi5lZ2dfaW5mbzoKICAgICAgICAgICAgcmV0dXJuIHNlbGYuZWdnX2luZm8KCiAgICAgICAgcGF0aCA9IHNlbGYuX2dldF9tZXRhZGF0YV9wYXRoKG5hbWUpCiAgICAgICAgcmV0dXJuIHNlbGYuX2hhcyhwYXRoKQoKICAgIGRlZiBnZXRfbWV0YWRhdGEoc2VsZiwgbmFtZSk6CiAgICAgICAgaWYgbm90IHNlbGYuZWdnX2luZm86CiAgICAgICAgICAgIHJldHVybiAiIgogICAgICAgIHBhdGggPSBzZWxmLl9nZXRfbWV0YWRhdGFfcGF0aChuYW1lKQogICAgICAgIHZhbHVlID0gc2VsZi5fZ2V0KHBhdGgpCiAgICAgICAgaWYgc2l4LlBZMjoKICAgICAgICAgICAgcmV0dXJuIHZhbHVlCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gdmFsdWUuZGVjb2RlKCd1dGYtOCcpCiAgICAgICAgZXhjZXB0IFVuaWNvZGVEZWNvZGVFcnJvciBhcyBleGM6CiAgICAgICAgICAgICMgSW5jbHVkZSB0aGUgcGF0aCBpbiB0aGUgZXJyb3IgbWVzc2FnZSB0byBzaW1wbGlmeQogICAgICAgICAgICAjIHRyb3VibGVzaG9vdGluZywgYW5kIHdpdGhvdXQgY2hhbmdpbmcgdGhlIGV4Y2VwdGlvbiB0eXBlLgogICAgICAgICAgICBleGMucmVhc29uICs9ICcgaW4ge30gZmlsZSBhdCBwYXRoOiB7fScuZm9ybWF0KG5hbWUsIHBhdGgpCiAgICAgICAgICAgIHJhaXNlCgogICAgZGVmIGdldF9tZXRhZGF0YV9saW5lcyhzZWxmLCBuYW1lKToKICAgICAgICByZXR1cm4geWllbGRfbGluZXMoc2VsZi5nZXRfbWV0YWRhdGEobmFtZSkpCgogICAgZGVmIHJlc291cmNlX2lzZGlyKHNlbGYsIHJlc291cmNlX25hbWUpOgogICAgICAgIHJldHVybiBzZWxmLl9pc2RpcihzZWxmLl9mbihzZWxmLm1vZHVsZV9wYXRoLCByZXNvdXJjZV9uYW1lKSkKCiAgICBkZWYgbWV0YWRhdGFfaXNkaXIoc2VsZiwgbmFtZSk6CiAgICAgICAgcmV0dXJuIHNlbGYuZWdnX2luZm8gYW5kIHNlbGYuX2lzZGlyKHNlbGYuX2ZuKHNlbGYuZWdnX2luZm8sIG5hbWUpKQoKICAgIGRlZiByZXNvdXJjZV9saXN0ZGlyKHNlbGYsIHJlc291cmNlX25hbWUpOgogICAgICAgIHJldHVybiBzZWxmLl9saXN0ZGlyKHNlbGYuX2ZuKHNlbGYubW9kdWxlX3BhdGgsIHJlc291cmNlX25hbWUpKQoKICAgIGRlZiBtZXRhZGF0YV9saXN0ZGlyKHNlbGYsIG5hbWUpOgogICAgICAgIGlmIHNlbGYuZWdnX2luZm86CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9saXN0ZGlyKHNlbGYuX2ZuKHNlbGYuZWdnX2luZm8sIG5hbWUpKQogICAgICAgIHJldHVybiBbXQoKICAgIGRlZiBydW5fc2NyaXB0KHNlbGYsIHNjcmlwdF9uYW1lLCBuYW1lc3BhY2UpOgogICAgICAgIHNjcmlwdCA9ICdzY3JpcHRzLycgKyBzY3JpcHRfbmFtZQogICAgICAgIGlmIG5vdCBzZWxmLmhhc19tZXRhZGF0YShzY3JpcHQpOgogICAgICAgICAgICByYWlzZSBSZXNvbHV0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAiU2NyaXB0IHtzY3JpcHQhcn0gbm90IGZvdW5kIGluIG1ldGFkYXRhIGF0IHtzZWxmLmVnZ19pbmZvIXJ9IgogICAgICAgICAgICAgICAgLmZvcm1hdCgqKmxvY2FscygpKSwKICAgICAgICAgICAgKQogICAgICAgIHNjcmlwdF90ZXh0ID0gc2VsZi5nZXRfbWV0YWRhdGEoc2NyaXB0KS5yZXBsYWNlKCdcclxuJywgJ1xuJykKICAgICAgICBzY3JpcHRfdGV4dCA9IHNjcmlwdF90ZXh0LnJlcGxhY2UoJ1xyJywgJ1xuJykKICAgICAgICBzY3JpcHRfZmlsZW5hbWUgPSBzZWxmLl9mbihzZWxmLmVnZ19pbmZvLCBzY3JpcHQpCiAgICAgICAgbmFtZXNwYWNlWydfX2ZpbGVfXyddID0gc2NyaXB0X2ZpbGVuYW1lCiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoc2NyaXB0X2ZpbGVuYW1lKToKICAgICAgICAgICAgc291cmNlID0gb3BlbihzY3JpcHRfZmlsZW5hbWUpLnJlYWQoKQogICAgICAgICAgICBjb2RlID0gY29tcGlsZShzb3VyY2UsIHNjcmlwdF9maWxlbmFtZSwgJ2V4ZWMnKQogICAgICAgICAgICBleGVjKGNvZGUsIG5hbWVzcGFjZSwgbmFtZXNwYWNlKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGZyb20gbGluZWNhY2hlIGltcG9ydCBjYWNoZQogICAgICAgICAgICBjYWNoZVtzY3JpcHRfZmlsZW5hbWVdID0gKAogICAgICAgICAgICAgICAgbGVuKHNjcmlwdF90ZXh0KSwgMCwgc2NyaXB0X3RleHQuc3BsaXQoJ1xuJyksIHNjcmlwdF9maWxlbmFtZQogICAgICAgICAgICApCiAgICAgICAgICAgIHNjcmlwdF9jb2RlID0gY29tcGlsZShzY3JpcHRfdGV4dCwgc2NyaXB0X2ZpbGVuYW1lLCAnZXhlYycpCiAgICAgICAgICAgIGV4ZWMoc2NyaXB0X2NvZGUsIG5hbWVzcGFjZSwgbmFtZXNwYWNlKQoKICAgIGRlZiBfaGFzKHNlbGYsIHBhdGgpOgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoCiAgICAgICAgICAgICJDYW4ndCBwZXJmb3JtIHRoaXMgb3BlcmF0aW9uIGZvciB1bnJlZ2lzdGVyZWQgbG9hZGVyIHR5cGUiCiAgICAgICAgKQoKICAgIGRlZiBfaXNkaXIoc2VsZiwgcGF0aCk6CiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigKICAgICAgICAgICAgIkNhbid0IHBlcmZvcm0gdGhpcyBvcGVyYXRpb24gZm9yIHVucmVnaXN0ZXJlZCBsb2FkZXIgdHlwZSIKICAgICAgICApCgogICAgZGVmIF9saXN0ZGlyKHNlbGYsIHBhdGgpOgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoCiAgICAgICAgICAgICJDYW4ndCBwZXJmb3JtIHRoaXMgb3BlcmF0aW9uIGZvciB1bnJlZ2lzdGVyZWQgbG9hZGVyIHR5cGUiCiAgICAgICAgKQoKICAgIGRlZiBfZm4oc2VsZiwgYmFzZSwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgc2VsZi5fdmFsaWRhdGVfcmVzb3VyY2VfcGF0aChyZXNvdXJjZV9uYW1lKQogICAgICAgIGlmIHJlc291cmNlX25hbWU6CiAgICAgICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4oYmFzZSwgKnJlc291cmNlX25hbWUuc3BsaXQoJy8nKSkKICAgICAgICByZXR1cm4gYmFzZQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfdmFsaWRhdGVfcmVzb3VyY2VfcGF0aChwYXRoKToKICAgICAgICAiIiIKICAgICAgICBWYWxpZGF0ZSB0aGUgcmVzb3VyY2UgcGF0aHMgYWNjb3JkaW5nIHRvIHRoZSBkb2NzLgogICAgICAgIGh0dHBzOi8vc2V0dXB0b29scy5yZWFkdGhlZG9jcy5pby9lbi9sYXRlc3QvcGtnX3Jlc291cmNlcy5odG1sI2Jhc2ljLXJlc291cmNlLWFjY2VzcwoKICAgICAgICA+Pj4gd2FybmVkID0gZ2V0Zml4dHVyZSgncmVjd2FybicpCiAgICAgICAgPj4+IHdhcm5pbmdzLnNpbXBsZWZpbHRlcignYWx3YXlzJykKICAgICAgICA+Pj4gdnJwID0gTnVsbFByb3ZpZGVyLl92YWxpZGF0ZV9yZXNvdXJjZV9wYXRoCiAgICAgICAgPj4+IHZycCgnZm9vL2Jhci50eHQnKQogICAgICAgID4+PiBib29sKHdhcm5lZCkKICAgICAgICBGYWxzZQogICAgICAgID4+PiB2cnAoJy4uL2Zvby9iYXIudHh0JykKICAgICAgICA+Pj4gYm9vbCh3YXJuZWQpCiAgICAgICAgVHJ1ZQogICAgICAgID4+PiB3YXJuZWQuY2xlYXIoKQogICAgICAgID4+PiB2cnAoJy9mb28vYmFyLnR4dCcpCiAgICAgICAgPj4+IGJvb2wod2FybmVkKQogICAgICAgIFRydWUKICAgICAgICA+Pj4gdnJwKCdmb28vLi4vLi4vYmFyLnR4dCcpCiAgICAgICAgPj4+IGJvb2wod2FybmVkKQogICAgICAgIFRydWUKICAgICAgICA+Pj4gd2FybmVkLmNsZWFyKCkKICAgICAgICA+Pj4gdnJwKCdmb28vZi4uL2Jhci50eHQnKQogICAgICAgID4+PiBib29sKHdhcm5lZCkKICAgICAgICBGYWxzZQoKICAgICAgICBXaW5kb3dzIHBhdGggc2VwYXJhdG9ycyBhcmUgc3RyYWlnaHQtdXAgZGlzYWxsb3dlZC4KICAgICAgICA+Pj4gdnJwKHInXFxmb28vYmFyLnR4dCcpCiAgICAgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogICAgICAgIC4uLgogICAgICAgIFZhbHVlRXJyb3I6IFVzZSBvZiAuLiBvciBhYnNvbHV0ZSBwYXRoIGluIGEgcmVzb3VyY2UgcGF0aCBcCmlzIG5vdCBhbGxvd2VkLgoKICAgICAgICA+Pj4gdnJwKHInQzpcXGZvby9iYXIudHh0JykKICAgICAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiAgICAgICAgLi4uCiAgICAgICAgVmFsdWVFcnJvcjogVXNlIG9mIC4uIG9yIGFic29sdXRlIHBhdGggaW4gYSByZXNvdXJjZSBwYXRoIFwKaXMgbm90IGFsbG93ZWQuCgogICAgICAgIEJsYW5rIHZhbHVlcyBhcmUgYWxsb3dlZAoKICAgICAgICA+Pj4gdnJwKCcnKQogICAgICAgID4+PiBib29sKHdhcm5lZCkKICAgICAgICBGYWxzZQoKICAgICAgICBOb24tc3RyaW5nIHZhbHVlcyBhcmUgbm90LgoKICAgICAgICA+Pj4gdnJwKE5vbmUpCiAgICAgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogICAgICAgIC4uLgogICAgICAgIEF0dHJpYnV0ZUVycm9yOiAuLi4KICAgICAgICAiIiIKICAgICAgICBpbnZhbGlkID0gKAogICAgICAgICAgICBvcy5wYXRoLnBhcmRpciBpbiBwYXRoLnNwbGl0KHBvc2l4cGF0aC5zZXApIG9yCiAgICAgICAgICAgIHBvc2l4cGF0aC5pc2FicyhwYXRoKSBvcgogICAgICAgICAgICBudHBhdGguaXNhYnMocGF0aCkKICAgICAgICApCiAgICAgICAgaWYgbm90IGludmFsaWQ6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBtc2cgPSAiVXNlIG9mIC4uIG9yIGFic29sdXRlIHBhdGggaW4gYSByZXNvdXJjZSBwYXRoIGlzIG5vdCBhbGxvd2VkLiIKCiAgICAgICAgIyBBZ2dyZXNzaXZlbHkgZGlzYWxsb3cgV2luZG93cyBhYnNvbHV0ZSBwYXRocwogICAgICAgIGlmIG50cGF0aC5pc2FicyhwYXRoKSBhbmQgbm90IHBvc2l4cGF0aC5pc2FicyhwYXRoKToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihtc2cpCgogICAgICAgICMgZm9yIGNvbXBhdGliaWxpdHksIHdhcm47IGluIGZ1dHVyZQogICAgICAgICMgcmFpc2UgVmFsdWVFcnJvcihtc2cpCiAgICAgICAgd2FybmluZ3Mud2FybigKICAgICAgICAgICAgbXNnWzotMV0gKyAiIGFuZCB3aWxsIHJhaXNlIGV4Y2VwdGlvbnMgaW4gYSBmdXR1cmUgcmVsZWFzZS4iLAogICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsCiAgICAgICAgICAgIHN0YWNrbGV2ZWw9NCwKICAgICAgICApCgogICAgZGVmIF9nZXQoc2VsZiwgcGF0aCk6CiAgICAgICAgaWYgaGFzYXR0cihzZWxmLmxvYWRlciwgJ2dldF9kYXRhJyk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmxvYWRlci5nZXRfZGF0YShwYXRoKQogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoCiAgICAgICAgICAgICJDYW4ndCBwZXJmb3JtIHRoaXMgb3BlcmF0aW9uIGZvciBsb2FkZXJzIHdpdGhvdXQgJ2dldF9kYXRhKCknIgogICAgICAgICkKCgpyZWdpc3Rlcl9sb2FkZXJfdHlwZShvYmplY3QsIE51bGxQcm92aWRlcikKCgpjbGFzcyBFZ2dQcm92aWRlcihOdWxsUHJvdmlkZXIpOgogICAgIiIiUHJvdmlkZXIgYmFzZWQgb24gYSB2aXJ0dWFsIGZpbGVzeXN0ZW0iIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbW9kdWxlKToKICAgICAgICBOdWxsUHJvdmlkZXIuX19pbml0X18oc2VsZiwgbW9kdWxlKQogICAgICAgIHNlbGYuX3NldHVwX3ByZWZpeCgpCgogICAgZGVmIF9zZXR1cF9wcmVmaXgoc2VsZik6CiAgICAgICAgIyB3ZSBhc3N1bWUgaGVyZSB0aGF0IG91ciBtZXRhZGF0YSBtYXkgYmUgbmVzdGVkIGluc2lkZSBhICJiYXNrZXQiCiAgICAgICAgIyBvZiBtdWx0aXBsZSBlZ2dzOyB0aGF0J3Mgd2h5IHdlIHVzZSBtb2R1bGVfcGF0aCBpbnN0ZWFkIG9mIC5hcmNoaXZlCiAgICAgICAgcGF0aCA9IHNlbGYubW9kdWxlX3BhdGgKICAgICAgICBvbGQgPSBOb25lCiAgICAgICAgd2hpbGUgcGF0aCAhPSBvbGQ6CiAgICAgICAgICAgIGlmIF9pc19lZ2dfcGF0aChwYXRoKToKICAgICAgICAgICAgICAgIHNlbGYuZWdnX25hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKHBhdGgpCiAgICAgICAgICAgICAgICBzZWxmLmVnZ19pbmZvID0gb3MucGF0aC5qb2luKHBhdGgsICdFR0ctSU5GTycpCiAgICAgICAgICAgICAgICBzZWxmLmVnZ19yb290ID0gcGF0aAogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgb2xkID0gcGF0aAogICAgICAgICAgICBwYXRoLCBiYXNlID0gb3MucGF0aC5zcGxpdChwYXRoKQoKCmNsYXNzIERlZmF1bHRQcm92aWRlcihFZ2dQcm92aWRlcik6CiAgICAiIiJQcm92aWRlcyBhY2Nlc3MgdG8gcGFja2FnZSByZXNvdXJjZXMgaW4gdGhlIGZpbGVzeXN0ZW0iIiIKCiAgICBkZWYgX2hhcyhzZWxmLCBwYXRoKToKICAgICAgICByZXR1cm4gb3MucGF0aC5leGlzdHMocGF0aCkKCiAgICBkZWYgX2lzZGlyKHNlbGYsIHBhdGgpOgogICAgICAgIHJldHVybiBvcy5wYXRoLmlzZGlyKHBhdGgpCgogICAgZGVmIF9saXN0ZGlyKHNlbGYsIHBhdGgpOgogICAgICAgIHJldHVybiBvcy5saXN0ZGlyKHBhdGgpCgogICAgZGVmIGdldF9yZXNvdXJjZV9zdHJlYW0oc2VsZiwgbWFuYWdlciwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgcmV0dXJuIG9wZW4oc2VsZi5fZm4oc2VsZi5tb2R1bGVfcGF0aCwgcmVzb3VyY2VfbmFtZSksICdyYicpCgogICAgZGVmIF9nZXQoc2VsZiwgcGF0aCk6CiAgICAgICAgd2l0aCBvcGVuKHBhdGgsICdyYicpIGFzIHN0cmVhbToKICAgICAgICAgICAgcmV0dXJuIHN0cmVhbS5yZWFkKCkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfcmVnaXN0ZXIoY2xzKToKICAgICAgICBsb2FkZXJfbmFtZXMgPSAnU291cmNlRmlsZUxvYWRlcicsICdTb3VyY2VsZXNzRmlsZUxvYWRlcicsCiAgICAgICAgZm9yIG5hbWUgaW4gbG9hZGVyX25hbWVzOgogICAgICAgICAgICBsb2FkZXJfY2xzID0gZ2V0YXR0cihpbXBvcnRsaWJfbWFjaGluZXJ5LCBuYW1lLCB0eXBlKE5vbmUpKQogICAgICAgICAgICByZWdpc3Rlcl9sb2FkZXJfdHlwZShsb2FkZXJfY2xzLCBjbHMpCgoKRGVmYXVsdFByb3ZpZGVyLl9yZWdpc3RlcigpCgoKY2xhc3MgRW1wdHlQcm92aWRlcihOdWxsUHJvdmlkZXIpOgogICAgIiIiUHJvdmlkZXIgdGhhdCByZXR1cm5zIG5vdGhpbmcgZm9yIGFsbCByZXF1ZXN0cyIiIgoKICAgIG1vZHVsZV9wYXRoID0gTm9uZQoKICAgIF9pc2RpciA9IF9oYXMgPSBsYW1iZGEgc2VsZiwgcGF0aDogRmFsc2UKCiAgICBkZWYgX2dldChzZWxmLCBwYXRoKToKICAgICAgICByZXR1cm4gJycKCiAgICBkZWYgX2xpc3RkaXIoc2VsZiwgcGF0aCk6CiAgICAgICAgcmV0dXJuIFtdCgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHBhc3MKCgplbXB0eV9wcm92aWRlciA9IEVtcHR5UHJvdmlkZXIoKQoKCmNsYXNzIFppcE1hbmlmZXN0cyhkaWN0KToKICAgICIiIgogICAgemlwIG1hbmlmZXN0IGJ1aWxkZXIKICAgICIiIgoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGJ1aWxkKGNscywgcGF0aCk6CiAgICAgICAgIiIiCiAgICAgICAgQnVpbGQgYSBkaWN0aW9uYXJ5IHNpbWlsYXIgdG8gdGhlIHppcGltcG9ydCBkaXJlY3RvcnkKICAgICAgICBjYWNoZXMsIGV4Y2VwdCBpbnN0ZWFkIG9mIHR1cGxlcywgc3RvcmUgWmlwSW5mbyBvYmplY3RzLgoKICAgICAgICBVc2UgYSBwbGF0Zm9ybS1zcGVjaWZpYyBwYXRoIHNlcGFyYXRvciAob3Muc2VwKSBmb3IgdGhlIHBhdGgga2V5cwogICAgICAgIGZvciBjb21wYXRpYmlsaXR5IHdpdGggcHlweSBvbiBXaW5kb3dzLgogICAgICAgICIiIgogICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKHBhdGgpIGFzIHpmaWxlOgogICAgICAgICAgICBpdGVtcyA9ICgKICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICBuYW1lLnJlcGxhY2UoJy8nLCBvcy5zZXApLAogICAgICAgICAgICAgICAgICAgIHpmaWxlLmdldGluZm8obmFtZSksCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBmb3IgbmFtZSBpbiB6ZmlsZS5uYW1lbGlzdCgpCiAgICAgICAgICAgICkKICAgICAgICAgICAgcmV0dXJuIGRpY3QoaXRlbXMpCgogICAgbG9hZCA9IGJ1aWxkCgoKY2xhc3MgTWVtb2l6ZWRaaXBNYW5pZmVzdHMoWmlwTWFuaWZlc3RzKToKICAgICIiIgogICAgTWVtb2l6ZWQgemlwZmlsZSBtYW5pZmVzdHMuCiAgICAiIiIKICAgIG1hbmlmZXN0X21vZCA9IGNvbGxlY3Rpb25zLm5hbWVkdHVwbGUoJ21hbmlmZXN0X21vZCcsICdtYW5pZmVzdCBtdGltZScpCgogICAgZGVmIGxvYWQoc2VsZiwgcGF0aCk6CiAgICAgICAgIiIiCiAgICAgICAgTG9hZCBhIG1hbmlmZXN0IGF0IHBhdGggb3IgcmV0dXJuIGEgc3VpdGFibGUgbWFuaWZlc3QgYWxyZWFkeSBsb2FkZWQuCiAgICAgICAgIiIiCiAgICAgICAgcGF0aCA9IG9zLnBhdGgubm9ybXBhdGgocGF0aCkKICAgICAgICBtdGltZSA9IG9zLnN0YXQocGF0aCkuc3RfbXRpbWUKCiAgICAgICAgaWYgcGF0aCBub3QgaW4gc2VsZiBvciBzZWxmW3BhdGhdLm10aW1lICE9IG10aW1lOgogICAgICAgICAgICBtYW5pZmVzdCA9IHNlbGYuYnVpbGQocGF0aCkKICAgICAgICAgICAgc2VsZltwYXRoXSA9IHNlbGYubWFuaWZlc3RfbW9kKG1hbmlmZXN0LCBtdGltZSkKCiAgICAgICAgcmV0dXJuIHNlbGZbcGF0aF0ubWFuaWZlc3QKCgpjbGFzcyBaaXBQcm92aWRlcihFZ2dQcm92aWRlcik6CiAgICAiIiJSZXNvdXJjZSBzdXBwb3J0IGZvciB6aXBzIGFuZCBlZ2dzIiIiCgogICAgZWFnZXJzID0gTm9uZQogICAgX3ppcF9tYW5pZmVzdHMgPSBNZW1vaXplZFppcE1hbmlmZXN0cygpCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG1vZHVsZSk6CiAgICAgICAgRWdnUHJvdmlkZXIuX19pbml0X18oc2VsZiwgbW9kdWxlKQogICAgICAgIHNlbGYuemlwX3ByZSA9IHNlbGYubG9hZGVyLmFyY2hpdmUgKyBvcy5zZXAKCiAgICBkZWYgX3ppcGluZm9fbmFtZShzZWxmLCBmc3BhdGgpOgogICAgICAgICMgQ29udmVydCBhIHZpcnR1YWwgZmlsZW5hbWUgKGZ1bGwgcGF0aCB0byBmaWxlKSBpbnRvIGEgemlwZmlsZSBzdWJwYXRoCiAgICAgICAgIyB1c2FibGUgd2l0aCB0aGUgemlwaW1wb3J0IGRpcmVjdG9yeSBjYWNoZSBmb3Igb3VyIHRhcmdldCBhcmNoaXZlCiAgICAgICAgZnNwYXRoID0gZnNwYXRoLnJzdHJpcChvcy5zZXApCiAgICAgICAgaWYgZnNwYXRoID09IHNlbGYubG9hZGVyLmFyY2hpdmU6CiAgICAgICAgICAgIHJldHVybiAnJwogICAgICAgIGlmIGZzcGF0aC5zdGFydHN3aXRoKHNlbGYuemlwX3ByZSk6CiAgICAgICAgICAgIHJldHVybiBmc3BhdGhbbGVuKHNlbGYuemlwX3ByZSk6XQogICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKAogICAgICAgICAgICAiJXMgaXMgbm90IGEgc3VicGF0aCBvZiAlcyIgJSAoZnNwYXRoLCBzZWxmLnppcF9wcmUpCiAgICAgICAgKQoKICAgIGRlZiBfcGFydHMoc2VsZiwgemlwX3BhdGgpOgogICAgICAgICMgQ29udmVydCBhIHppcGZpbGUgc3VicGF0aCBpbnRvIGFuIGVnZy1yZWxhdGl2ZSBwYXRoIHBhcnQgbGlzdC4KICAgICAgICAjIHBzZXVkby1mcyBwYXRoCiAgICAgICAgZnNwYXRoID0gc2VsZi56aXBfcHJlICsgemlwX3BhdGgKICAgICAgICBpZiBmc3BhdGguc3RhcnRzd2l0aChzZWxmLmVnZ19yb290ICsgb3Muc2VwKToKICAgICAgICAgICAgcmV0dXJuIGZzcGF0aFtsZW4oc2VsZi5lZ2dfcm9vdCkgKyAxOl0uc3BsaXQob3Muc2VwKQogICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKAogICAgICAgICAgICAiJXMgaXMgbm90IGEgc3VicGF0aCBvZiAlcyIgJSAoZnNwYXRoLCBzZWxmLmVnZ19yb290KQogICAgICAgICkKCiAgICBAcHJvcGVydHkKICAgIGRlZiB6aXBpbmZvKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl96aXBfbWFuaWZlc3RzLmxvYWQoc2VsZi5sb2FkZXIuYXJjaGl2ZSkKCiAgICBkZWYgZ2V0X3Jlc291cmNlX2ZpbGVuYW1lKHNlbGYsIG1hbmFnZXIsIHJlc291cmNlX25hbWUpOgogICAgICAgIGlmIG5vdCBzZWxmLmVnZ19uYW1lOgogICAgICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKAogICAgICAgICAgICAgICAgInJlc291cmNlX2ZpbGVuYW1lKCkgb25seSBzdXBwb3J0ZWQgZm9yIC5lZ2csIG5vdCAuemlwIgogICAgICAgICAgICApCiAgICAgICAgIyBubyBuZWVkIHRvIGxvY2sgZm9yIGV4dHJhY3Rpb24sIHNpbmNlIHdlIHVzZSB0ZW1wIG5hbWVzCiAgICAgICAgemlwX3BhdGggPSBzZWxmLl9yZXNvdXJjZV90b196aXAocmVzb3VyY2VfbmFtZSkKICAgICAgICBlYWdlcnMgPSBzZWxmLl9nZXRfZWFnZXJfcmVzb3VyY2VzKCkKICAgICAgICBpZiAnLycuam9pbihzZWxmLl9wYXJ0cyh6aXBfcGF0aCkpIGluIGVhZ2VyczoKICAgICAgICAgICAgZm9yIG5hbWUgaW4gZWFnZXJzOgogICAgICAgICAgICAgICAgc2VsZi5fZXh0cmFjdF9yZXNvdXJjZShtYW5hZ2VyLCBzZWxmLl9lYWdlcl90b196aXAobmFtZSkpCiAgICAgICAgcmV0dXJuIHNlbGYuX2V4dHJhY3RfcmVzb3VyY2UobWFuYWdlciwgemlwX3BhdGgpCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9nZXRfZGF0ZV9hbmRfc2l6ZSh6aXBfc3RhdCk6CiAgICAgICAgc2l6ZSA9IHppcF9zdGF0LmZpbGVfc2l6ZQogICAgICAgICMgeW1kaG1zK3dkYXksIHlkYXksIGRzdAogICAgICAgIGRhdGVfdGltZSA9IHppcF9zdGF0LmRhdGVfdGltZSArICgwLCAwLCAtMSkKICAgICAgICAjIDE5ODAgb2Zmc2V0IGFscmVhZHkgZG9uZQogICAgICAgIHRpbWVzdGFtcCA9IHRpbWUubWt0aW1lKGRhdGVfdGltZSkKICAgICAgICByZXR1cm4gdGltZXN0YW1wLCBzaXplCgogICAgZGVmIF9leHRyYWN0X3Jlc291cmNlKHNlbGYsIG1hbmFnZXIsIHppcF9wYXRoKToKCiAgICAgICAgaWYgemlwX3BhdGggaW4gc2VsZi5faW5kZXgoKToKICAgICAgICAgICAgZm9yIG5hbWUgaW4gc2VsZi5faW5kZXgoKVt6aXBfcGF0aF06CiAgICAgICAgICAgICAgICBsYXN0ID0gc2VsZi5fZXh0cmFjdF9yZXNvdXJjZSgKICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyLCBvcy5wYXRoLmpvaW4oemlwX3BhdGgsIG5hbWUpCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICMgcmV0dXJuIHRoZSBleHRyYWN0ZWQgZGlyZWN0b3J5IG5hbWUKICAgICAgICAgICAgcmV0dXJuIG9zLnBhdGguZGlybmFtZShsYXN0KQoKICAgICAgICB0aW1lc3RhbXAsIHNpemUgPSBzZWxmLl9nZXRfZGF0ZV9hbmRfc2l6ZShzZWxmLnppcGluZm9bemlwX3BhdGhdKQoKICAgICAgICBpZiBub3QgV1JJVEVfU1VQUE9SVDoKICAgICAgICAgICAgcmFpc2UgSU9FcnJvcignIm9zLnJlbmFtZSIgYW5kICJvcy51bmxpbmsiIGFyZSBub3Qgc3VwcG9ydGVkICcKICAgICAgICAgICAgICAgICAgICAgICAgICAnb24gdGhpcyBwbGF0Zm9ybScpCiAgICAgICAgdHJ5OgoKICAgICAgICAgICAgcmVhbF9wYXRoID0gbWFuYWdlci5nZXRfY2FjaGVfcGF0aCgKICAgICAgICAgICAgICAgIHNlbGYuZWdnX25hbWUsIHNlbGYuX3BhcnRzKHppcF9wYXRoKQogICAgICAgICAgICApCgogICAgICAgICAgICBpZiBzZWxmLl9pc19jdXJyZW50KHJlYWxfcGF0aCwgemlwX3BhdGgpOgogICAgICAgICAgICAgICAgcmV0dXJuIHJlYWxfcGF0aAoKICAgICAgICAgICAgb3V0ZiwgdG1wbmFtID0gX21rc3RlbXAoCiAgICAgICAgICAgICAgICAiLiRleHRyYWN0IiwKICAgICAgICAgICAgICAgIGRpcj1vcy5wYXRoLmRpcm5hbWUocmVhbF9wYXRoKSwKICAgICAgICAgICAgKQogICAgICAgICAgICBvcy53cml0ZShvdXRmLCBzZWxmLmxvYWRlci5nZXRfZGF0YSh6aXBfcGF0aCkpCiAgICAgICAgICAgIG9zLmNsb3NlKG91dGYpCiAgICAgICAgICAgIHV0aW1lKHRtcG5hbSwgKHRpbWVzdGFtcCwgdGltZXN0YW1wKSkKICAgICAgICAgICAgbWFuYWdlci5wb3N0cHJvY2Vzcyh0bXBuYW0sIHJlYWxfcGF0aCkKCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHJlbmFtZSh0bXBuYW0sIHJlYWxfcGF0aCkKCiAgICAgICAgICAgIGV4Y2VwdCBvcy5lcnJvcjoKICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKHJlYWxfcGF0aCk6CiAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5faXNfY3VycmVudChyZWFsX3BhdGgsIHppcF9wYXRoKToKICAgICAgICAgICAgICAgICAgICAgICAgIyB0aGUgZmlsZSBiZWNhbWUgY3VycmVudCBzaW5jZSBpdCB3YXMgY2hlY2tlZCBhYm92ZSwKICAgICAgICAgICAgICAgICAgICAgICAgIyAgc28gcHJvY2VlZC4KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWxfcGF0aAogICAgICAgICAgICAgICAgICAgICMgV2luZG93cywgZGVsIG9sZCBmaWxlIGFuZCByZXRyeQogICAgICAgICAgICAgICAgICAgIGVsaWYgb3MubmFtZSA9PSAnbnQnOgogICAgICAgICAgICAgICAgICAgICAgICB1bmxpbmsocmVhbF9wYXRoKQogICAgICAgICAgICAgICAgICAgICAgICByZW5hbWUodG1wbmFtLCByZWFsX3BhdGgpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWFsX3BhdGgKICAgICAgICAgICAgICAgIHJhaXNlCgogICAgICAgIGV4Y2VwdCBvcy5lcnJvcjoKICAgICAgICAgICAgIyByZXBvcnQgYSB1c2VyLWZyaWVuZGx5IGVycm9yCiAgICAgICAgICAgIG1hbmFnZXIuZXh0cmFjdGlvbl9lcnJvcigpCgogICAgICAgIHJldHVybiByZWFsX3BhdGgKCiAgICBkZWYgX2lzX2N1cnJlbnQoc2VsZiwgZmlsZV9wYXRoLCB6aXBfcGF0aCk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIFRydWUgaWYgdGhlIGZpbGVfcGF0aCBpcyBjdXJyZW50IGZvciB0aGlzIHppcF9wYXRoCiAgICAgICAgIiIiCiAgICAgICAgdGltZXN0YW1wLCBzaXplID0gc2VsZi5fZ2V0X2RhdGVfYW5kX3NpemUoc2VsZi56aXBpbmZvW3ppcF9wYXRoXSkKICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2ZpbGUoZmlsZV9wYXRoKToKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgc3RhdCA9IG9zLnN0YXQoZmlsZV9wYXRoKQogICAgICAgIGlmIHN0YXQuc3Rfc2l6ZSAhPSBzaXplIG9yIHN0YXQuc3RfbXRpbWUgIT0gdGltZXN0YW1wOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAjIGNoZWNrIHRoYXQgdGhlIGNvbnRlbnRzIG1hdGNoCiAgICAgICAgemlwX2NvbnRlbnRzID0gc2VsZi5sb2FkZXIuZ2V0X2RhdGEoemlwX3BhdGgpCiAgICAgICAgd2l0aCBvcGVuKGZpbGVfcGF0aCwgJ3JiJykgYXMgZjoKICAgICAgICAgICAgZmlsZV9jb250ZW50cyA9IGYucmVhZCgpCiAgICAgICAgcmV0dXJuIHppcF9jb250ZW50cyA9PSBmaWxlX2NvbnRlbnRzCgogICAgZGVmIF9nZXRfZWFnZXJfcmVzb3VyY2VzKHNlbGYpOgogICAgICAgIGlmIHNlbGYuZWFnZXJzIGlzIE5vbmU6CiAgICAgICAgICAgIGVhZ2VycyA9IFtdCiAgICAgICAgICAgIGZvciBuYW1lIGluICgnbmF0aXZlX2xpYnMudHh0JywgJ2VhZ2VyX3Jlc291cmNlcy50eHQnKToKICAgICAgICAgICAgICAgIGlmIHNlbGYuaGFzX21ldGFkYXRhKG5hbWUpOgogICAgICAgICAgICAgICAgICAgIGVhZ2Vycy5leHRlbmQoc2VsZi5nZXRfbWV0YWRhdGFfbGluZXMobmFtZSkpCiAgICAgICAgICAgIHNlbGYuZWFnZXJzID0gZWFnZXJzCiAgICAgICAgcmV0dXJuIHNlbGYuZWFnZXJzCgogICAgZGVmIF9pbmRleChzZWxmKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9kaXJpbmRleAogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgaW5kID0ge30KICAgICAgICAgICAgZm9yIHBhdGggaW4gc2VsZi56aXBpbmZvOgogICAgICAgICAgICAgICAgcGFydHMgPSBwYXRoLnNwbGl0KG9zLnNlcCkKICAgICAgICAgICAgICAgIHdoaWxlIHBhcnRzOgogICAgICAgICAgICAgICAgICAgIHBhcmVudCA9IG9zLnNlcC5qb2luKHBhcnRzWzotMV0pCiAgICAgICAgICAgICAgICAgICAgaWYgcGFyZW50IGluIGluZDoKICAgICAgICAgICAgICAgICAgICAgICAgaW5kW3BhcmVudF0uYXBwZW5kKHBhcnRzWy0xXSkKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBpbmRbcGFyZW50XSA9IFtwYXJ0cy5wb3AoKV0KICAgICAgICAgICAgc2VsZi5fZGlyaW5kZXggPSBpbmQKICAgICAgICAgICAgcmV0dXJuIGluZAoKICAgIGRlZiBfaGFzKHNlbGYsIGZzcGF0aCk6CiAgICAgICAgemlwX3BhdGggPSBzZWxmLl96aXBpbmZvX25hbWUoZnNwYXRoKQogICAgICAgIHJldHVybiB6aXBfcGF0aCBpbiBzZWxmLnppcGluZm8gb3IgemlwX3BhdGggaW4gc2VsZi5faW5kZXgoKQoKICAgIGRlZiBfaXNkaXIoc2VsZiwgZnNwYXRoKToKICAgICAgICByZXR1cm4gc2VsZi5femlwaW5mb19uYW1lKGZzcGF0aCkgaW4gc2VsZi5faW5kZXgoKQoKICAgIGRlZiBfbGlzdGRpcihzZWxmLCBmc3BhdGgpOgogICAgICAgIHJldHVybiBsaXN0KHNlbGYuX2luZGV4KCkuZ2V0KHNlbGYuX3ppcGluZm9fbmFtZShmc3BhdGgpLCAoKSkpCgogICAgZGVmIF9lYWdlcl90b196aXAoc2VsZiwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgcmV0dXJuIHNlbGYuX3ppcGluZm9fbmFtZShzZWxmLl9mbihzZWxmLmVnZ19yb290LCByZXNvdXJjZV9uYW1lKSkKCiAgICBkZWYgX3Jlc291cmNlX3RvX3ppcChzZWxmLCByZXNvdXJjZV9uYW1lKToKICAgICAgICByZXR1cm4gc2VsZi5femlwaW5mb19uYW1lKHNlbGYuX2ZuKHNlbGYubW9kdWxlX3BhdGgsIHJlc291cmNlX25hbWUpKQoKCnJlZ2lzdGVyX2xvYWRlcl90eXBlKHppcGltcG9ydC56aXBpbXBvcnRlciwgWmlwUHJvdmlkZXIpCgoKY2xhc3MgRmlsZU1ldGFkYXRhKEVtcHR5UHJvdmlkZXIpOgogICAgIiIiTWV0YWRhdGEgaGFuZGxlciBmb3Igc3RhbmRhbG9uZSBQS0ctSU5GTyBmaWxlcwoKICAgIFVzYWdlOjoKCiAgICAgICAgbWV0YWRhdGEgPSBGaWxlTWV0YWRhdGEoIi9wYXRoL3RvL1BLRy1JTkZPIikKCiAgICBUaGlzIHByb3ZpZGVyIHJlamVjdHMgYWxsIGRhdGEgYW5kIG1ldGFkYXRhIHJlcXVlc3RzIGV4Y2VwdCBmb3IgUEtHLUlORk8sCiAgICB3aGljaCBpcyB0cmVhdGVkIGFzIGV4aXN0aW5nLCBhbmQgd2lsbCBiZSB0aGUgY29udGVudHMgb2YgdGhlIGZpbGUgYXQKICAgIHRoZSBwcm92aWRlZCBsb2NhdGlvbi4KICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXRoKToKICAgICAgICBzZWxmLnBhdGggPSBwYXRoCgogICAgZGVmIF9nZXRfbWV0YWRhdGFfcGF0aChzZWxmLCBuYW1lKToKICAgICAgICByZXR1cm4gc2VsZi5wYXRoCgogICAgZGVmIGhhc19tZXRhZGF0YShzZWxmLCBuYW1lKToKICAgICAgICByZXR1cm4gbmFtZSA9PSAnUEtHLUlORk8nIGFuZCBvcy5wYXRoLmlzZmlsZShzZWxmLnBhdGgpCgogICAgZGVmIGdldF9tZXRhZGF0YShzZWxmLCBuYW1lKToKICAgICAgICBpZiBuYW1lICE9ICdQS0ctSU5GTyc6CiAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKCJObyBtZXRhZGF0YSBleGNlcHQgUEtHLUlORk8gaXMgYXZhaWxhYmxlIikKCiAgICAgICAgd2l0aCBpby5vcGVuKHNlbGYucGF0aCwgZW5jb2Rpbmc9J3V0Zi04JywgZXJyb3JzPSJyZXBsYWNlIikgYXMgZjoKICAgICAgICAgICAgbWV0YWRhdGEgPSBmLnJlYWQoKQogICAgICAgIHNlbGYuX3dhcm5fb25fcmVwbGFjZW1lbnQobWV0YWRhdGEpCiAgICAgICAgcmV0dXJuIG1ldGFkYXRhCgogICAgZGVmIF93YXJuX29uX3JlcGxhY2VtZW50KHNlbGYsIG1ldGFkYXRhKToKICAgICAgICAjIFB5dGhvbiAyLjcgY29tcGF0IGZvcjogcmVwbGFjZW1lbnRfY2hhciA9ICfvv70nCiAgICAgICAgcmVwbGFjZW1lbnRfY2hhciA9IGInXHhlZlx4YmZceGJkJy5kZWNvZGUoJ3V0Zi04JykKICAgICAgICBpZiByZXBsYWNlbWVudF9jaGFyIGluIG1ldGFkYXRhOgogICAgICAgICAgICB0bXBsID0gIntzZWxmLnBhdGh9IGNvdWxkIG5vdCBiZSBwcm9wZXJseSBkZWNvZGVkIGluIFVURi04IgogICAgICAgICAgICBtc2cgPSB0bXBsLmZvcm1hdCgqKmxvY2FscygpKQogICAgICAgICAgICB3YXJuaW5ncy53YXJuKG1zZykKCiAgICBkZWYgZ2V0X21ldGFkYXRhX2xpbmVzKHNlbGYsIG5hbWUpOgogICAgICAgIHJldHVybiB5aWVsZF9saW5lcyhzZWxmLmdldF9tZXRhZGF0YShuYW1lKSkKCgpjbGFzcyBQYXRoTWV0YWRhdGEoRGVmYXVsdFByb3ZpZGVyKToKICAgICIiIk1ldGFkYXRhIHByb3ZpZGVyIGZvciBlZ2cgZGlyZWN0b3JpZXMKCiAgICBVc2FnZTo6CgogICAgICAgICMgRGV2ZWxvcG1lbnQgZWdnczoKCiAgICAgICAgZWdnX2luZm8gPSAiL3BhdGgvdG8vUGFja2FnZU5hbWUuZWdnLWluZm8iCiAgICAgICAgYmFzZV9kaXIgPSBvcy5wYXRoLmRpcm5hbWUoZWdnX2luZm8pCiAgICAgICAgbWV0YWRhdGEgPSBQYXRoTWV0YWRhdGEoYmFzZV9kaXIsIGVnZ19pbmZvKQogICAgICAgIGRpc3RfbmFtZSA9IG9zLnBhdGguc3BsaXRleHQob3MucGF0aC5iYXNlbmFtZShlZ2dfaW5mbykpWzBdCiAgICAgICAgZGlzdCA9IERpc3RyaWJ1dGlvbihiYXNlZGlyLCBwcm9qZWN0X25hbWU9ZGlzdF9uYW1lLCBtZXRhZGF0YT1tZXRhZGF0YSkKCiAgICAgICAgIyBVbnBhY2tlZCBlZ2cgZGlyZWN0b3JpZXM6CgogICAgICAgIGVnZ19wYXRoID0gIi9wYXRoL3RvL1BhY2thZ2VOYW1lLXZlci1weXZlci1ldGMuZWdnIgogICAgICAgIG1ldGFkYXRhID0gUGF0aE1ldGFkYXRhKGVnZ19wYXRoLCBvcy5wYXRoLmpvaW4oZWdnX3BhdGgsJ0VHRy1JTkZPJykpCiAgICAgICAgZGlzdCA9IERpc3RyaWJ1dGlvbi5mcm9tX2ZpbGVuYW1lKGVnZ19wYXRoLCBtZXRhZGF0YT1tZXRhZGF0YSkKICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXRoLCBlZ2dfaW5mbyk6CiAgICAgICAgc2VsZi5tb2R1bGVfcGF0aCA9IHBhdGgKICAgICAgICBzZWxmLmVnZ19pbmZvID0gZWdnX2luZm8KCgpjbGFzcyBFZ2dNZXRhZGF0YShaaXBQcm92aWRlcik6CiAgICAiIiJNZXRhZGF0YSBwcm92aWRlciBmb3IgLmVnZyBmaWxlcyIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpbXBvcnRlcik6CiAgICAgICAgIiIiQ3JlYXRlIGEgbWV0YWRhdGEgcHJvdmlkZXIgZnJvbSBhIHppcGltcG9ydGVyIiIiCgogICAgICAgIHNlbGYuemlwX3ByZSA9IGltcG9ydGVyLmFyY2hpdmUgKyBvcy5zZXAKICAgICAgICBzZWxmLmxvYWRlciA9IGltcG9ydGVyCiAgICAgICAgaWYgaW1wb3J0ZXIucHJlZml4OgogICAgICAgICAgICBzZWxmLm1vZHVsZV9wYXRoID0gb3MucGF0aC5qb2luKGltcG9ydGVyLmFyY2hpdmUsIGltcG9ydGVyLnByZWZpeCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLm1vZHVsZV9wYXRoID0gaW1wb3J0ZXIuYXJjaGl2ZQogICAgICAgIHNlbGYuX3NldHVwX3ByZWZpeCgpCgoKX2RlY2xhcmVfc3RhdGUoJ2RpY3QnLCBfZGlzdHJpYnV0aW9uX2ZpbmRlcnM9e30pCgoKZGVmIHJlZ2lzdGVyX2ZpbmRlcihpbXBvcnRlcl90eXBlLCBkaXN0cmlidXRpb25fZmluZGVyKToKICAgICIiIlJlZ2lzdGVyIGBkaXN0cmlidXRpb25fZmluZGVyYCB0byBmaW5kIGRpc3RyaWJ1dGlvbnMgaW4gc3lzLnBhdGggaXRlbXMKCiAgICBgaW1wb3J0ZXJfdHlwZWAgaXMgdGhlIHR5cGUgb3IgY2xhc3Mgb2YgYSBQRVAgMzAyICJJbXBvcnRlciIgKHN5cy5wYXRoIGl0ZW0KICAgIGhhbmRsZXIpLCBhbmQgYGRpc3RyaWJ1dGlvbl9maW5kZXJgIGlzIGEgY2FsbGFibGUgdGhhdCwgcGFzc2VkIGEgcGF0aAogICAgaXRlbSBhbmQgdGhlIGltcG9ydGVyIGluc3RhbmNlLCB5aWVsZHMgYGBEaXN0cmlidXRpb25gYCBpbnN0YW5jZXMgZm91bmQgb24KICAgIHRoYXQgcGF0aCBpdGVtLiAgU2VlIGBgcGtnX3Jlc291cmNlcy5maW5kX29uX3BhdGhgYCBmb3IgYW4gZXhhbXBsZS4iIiIKICAgIF9kaXN0cmlidXRpb25fZmluZGVyc1tpbXBvcnRlcl90eXBlXSA9IGRpc3RyaWJ1dGlvbl9maW5kZXIKCgpkZWYgZmluZF9kaXN0cmlidXRpb25zKHBhdGhfaXRlbSwgb25seT1GYWxzZSk6CiAgICAiIiJZaWVsZCBkaXN0cmlidXRpb25zIGFjY2Vzc2libGUgdmlhIGBwYXRoX2l0ZW1gIiIiCiAgICBpbXBvcnRlciA9IGdldF9pbXBvcnRlcihwYXRoX2l0ZW0pCiAgICBmaW5kZXIgPSBfZmluZF9hZGFwdGVyKF9kaXN0cmlidXRpb25fZmluZGVycywgaW1wb3J0ZXIpCiAgICByZXR1cm4gZmluZGVyKGltcG9ydGVyLCBwYXRoX2l0ZW0sIG9ubHkpCgoKZGVmIGZpbmRfZWdnc19pbl96aXAoaW1wb3J0ZXIsIHBhdGhfaXRlbSwgb25seT1GYWxzZSk6CiAgICAiIiIKICAgIEZpbmQgZWdncyBpbiB6aXAgZmlsZXM7IHBvc3NpYmx5IG11bHRpcGxlIG5lc3RlZCBlZ2dzLgogICAgIiIiCiAgICBpZiBpbXBvcnRlci5hcmNoaXZlLmVuZHN3aXRoKCcud2hsJyk6CiAgICAgICAgIyB3aGVlbHMgYXJlIG5vdCBzdXBwb3J0ZWQgd2l0aCB0aGlzIGZpbmRlcgogICAgICAgICMgdGhleSBkb24ndCBoYXZlIFBLRy1JTkZPIG1ldGFkYXRhLCBhbmQgd29uJ3QgZXZlciBjb250YWluIGVnZ3MKICAgICAgICByZXR1cm4KICAgIG1ldGFkYXRhID0gRWdnTWV0YWRhdGEoaW1wb3J0ZXIpCiAgICBpZiBtZXRhZGF0YS5oYXNfbWV0YWRhdGEoJ1BLRy1JTkZPJyk6CiAgICAgICAgeWllbGQgRGlzdHJpYnV0aW9uLmZyb21fZmlsZW5hbWUocGF0aF9pdGVtLCBtZXRhZGF0YT1tZXRhZGF0YSkKICAgIGlmIG9ubHk6CiAgICAgICAgIyBkb24ndCB5aWVsZCBuZXN0ZWQgZGlzdHJvcwogICAgICAgIHJldHVybgogICAgZm9yIHN1Yml0ZW0gaW4gbWV0YWRhdGEucmVzb3VyY2VfbGlzdGRpcignJyk6CiAgICAgICAgaWYgX2lzX2VnZ19wYXRoKHN1Yml0ZW0pOgogICAgICAgICAgICBzdWJwYXRoID0gb3MucGF0aC5qb2luKHBhdGhfaXRlbSwgc3ViaXRlbSkKICAgICAgICAgICAgZGlzdHMgPSBmaW5kX2VnZ3NfaW5femlwKHppcGltcG9ydC56aXBpbXBvcnRlcihzdWJwYXRoKSwgc3VicGF0aCkKICAgICAgICAgICAgZm9yIGRpc3QgaW4gZGlzdHM6CiAgICAgICAgICAgICAgICB5aWVsZCBkaXN0CiAgICAgICAgZWxpZiBzdWJpdGVtLmxvd2VyKCkuZW5kc3dpdGgoJy5kaXN0LWluZm8nKToKICAgICAgICAgICAgc3VicGF0aCA9IG9zLnBhdGguam9pbihwYXRoX2l0ZW0sIHN1Yml0ZW0pCiAgICAgICAgICAgIHN1Ym1ldGEgPSBFZ2dNZXRhZGF0YSh6aXBpbXBvcnQuemlwaW1wb3J0ZXIoc3VicGF0aCkpCiAgICAgICAgICAgIHN1Ym1ldGEuZWdnX2luZm8gPSBzdWJwYXRoCiAgICAgICAgICAgIHlpZWxkIERpc3RyaWJ1dGlvbi5mcm9tX2xvY2F0aW9uKHBhdGhfaXRlbSwgc3ViaXRlbSwgc3VibWV0YSkKCgpyZWdpc3Rlcl9maW5kZXIoemlwaW1wb3J0LnppcGltcG9ydGVyLCBmaW5kX2VnZ3NfaW5femlwKQoKCmRlZiBmaW5kX25vdGhpbmcoaW1wb3J0ZXIsIHBhdGhfaXRlbSwgb25seT1GYWxzZSk6CiAgICByZXR1cm4gKCkKCgpyZWdpc3Rlcl9maW5kZXIob2JqZWN0LCBmaW5kX25vdGhpbmcpCgoKZGVmIF9ieV92ZXJzaW9uX2Rlc2NlbmRpbmcobmFtZXMpOgogICAgIiIiCiAgICBHaXZlbiBhIGxpc3Qgb2YgZmlsZW5hbWVzLCByZXR1cm4gdGhlbSBpbiBkZXNjZW5kaW5nIG9yZGVyCiAgICBieSB2ZXJzaW9uIG51bWJlci4KCiAgICA+Pj4gbmFtZXMgPSAnYmFyJywgJ2ZvbycsICdQeXRob24tMi43LjEwLmVnZycsICdQeXRob24tMi43LjIuZWdnJwogICAgPj4+IF9ieV92ZXJzaW9uX2Rlc2NlbmRpbmcobmFtZXMpCiAgICBbJ1B5dGhvbi0yLjcuMTAuZWdnJywgJ1B5dGhvbi0yLjcuMi5lZ2cnLCAnZm9vJywgJ2JhciddCiAgICA+Pj4gbmFtZXMgPSAnU2V0dXB0b29scy0xLjIuM2IxLmVnZycsICdTZXR1cHRvb2xzLTEuMi4zLmVnZycKICAgID4+PiBfYnlfdmVyc2lvbl9kZXNjZW5kaW5nKG5hbWVzKQogICAgWydTZXR1cHRvb2xzLTEuMi4zLmVnZycsICdTZXR1cHRvb2xzLTEuMi4zYjEuZWdnJ10KICAgID4+PiBuYW1lcyA9ICdTZXR1cHRvb2xzLTEuMi4zYjEuZWdnJywgJ1NldHVwdG9vbHMtMS4yLjMucG9zdDEuZWdnJwogICAgPj4+IF9ieV92ZXJzaW9uX2Rlc2NlbmRpbmcobmFtZXMpCiAgICBbJ1NldHVwdG9vbHMtMS4yLjMucG9zdDEuZWdnJywgJ1NldHVwdG9vbHMtMS4yLjNiMS5lZ2cnXQogICAgIiIiCiAgICBkZWYgX2J5X3ZlcnNpb24obmFtZSk6CiAgICAgICAgIiIiCiAgICAgICAgUGFyc2UgZWFjaCBjb21wb25lbnQgb2YgdGhlIGZpbGVuYW1lCiAgICAgICAgIiIiCiAgICAgICAgbmFtZSwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChuYW1lKQogICAgICAgIHBhcnRzID0gaXRlcnRvb2xzLmNoYWluKG5hbWUuc3BsaXQoJy0nKSwgW2V4dF0pCiAgICAgICAgcmV0dXJuIFtwYWNrYWdpbmcudmVyc2lvbi5wYXJzZShwYXJ0KSBmb3IgcGFydCBpbiBwYXJ0c10KCiAgICByZXR1cm4gc29ydGVkKG5hbWVzLCBrZXk9X2J5X3ZlcnNpb24sIHJldmVyc2U9VHJ1ZSkKCgpkZWYgZmluZF9vbl9wYXRoKGltcG9ydGVyLCBwYXRoX2l0ZW0sIG9ubHk9RmFsc2UpOgogICAgIiIiWWllbGQgZGlzdHJpYnV0aW9ucyBhY2Nlc3NpYmxlIG9uIGEgc3lzLnBhdGggZGlyZWN0b3J5IiIiCiAgICBwYXRoX2l0ZW0gPSBfbm9ybWFsaXplX2NhY2hlZChwYXRoX2l0ZW0pCgogICAgaWYgX2lzX3VucGFja2VkX2VnZyhwYXRoX2l0ZW0pOgogICAgICAgIHlpZWxkIERpc3RyaWJ1dGlvbi5mcm9tX2ZpbGVuYW1lKAogICAgICAgICAgICBwYXRoX2l0ZW0sIG1ldGFkYXRhPVBhdGhNZXRhZGF0YSgKICAgICAgICAgICAgICAgIHBhdGhfaXRlbSwgb3MucGF0aC5qb2luKHBhdGhfaXRlbSwgJ0VHRy1JTkZPJykKICAgICAgICAgICAgKQogICAgICAgICkKICAgICAgICByZXR1cm4KCiAgICBlbnRyaWVzID0gc2FmZV9saXN0ZGlyKHBhdGhfaXRlbSkKCiAgICAjIGZvciBwZXJmb3JtYW5jZSwgYmVmb3JlIHNvcnRpbmcgYnkgdmVyc2lvbiwKICAgICMgc2NyZWVuIGVudHJpZXMgZm9yIG9ubHkgdGhvc2UgdGhhdCB3aWxsIHlpZWxkCiAgICAjIGRpc3RyaWJ1dGlvbnMKICAgIGZpbHRlcmVkID0gKAogICAgICAgIGVudHJ5CiAgICAgICAgZm9yIGVudHJ5IGluIGVudHJpZXMKICAgICAgICBpZiBkaXN0X2ZhY3RvcnkocGF0aF9pdGVtLCBlbnRyeSwgb25seSkKICAgICkKCiAgICAjIHNjYW4gZm9yIC5lZ2cgYW5kIC5lZ2ctaW5mbyBpbiBkaXJlY3RvcnkKICAgIHBhdGhfaXRlbV9lbnRyaWVzID0gX2J5X3ZlcnNpb25fZGVzY2VuZGluZyhmaWx0ZXJlZCkKICAgIGZvciBlbnRyeSBpbiBwYXRoX2l0ZW1fZW50cmllczoKICAgICAgICBmdWxscGF0aCA9IG9zLnBhdGguam9pbihwYXRoX2l0ZW0sIGVudHJ5KQogICAgICAgIGZhY3RvcnkgPSBkaXN0X2ZhY3RvcnkocGF0aF9pdGVtLCBlbnRyeSwgb25seSkKICAgICAgICBmb3IgZGlzdCBpbiBmYWN0b3J5KGZ1bGxwYXRoKToKICAgICAgICAgICAgeWllbGQgZGlzdAoKCmRlZiBkaXN0X2ZhY3RvcnkocGF0aF9pdGVtLCBlbnRyeSwgb25seSk6CiAgICAiIiIKICAgIFJldHVybiBhIGRpc3RfZmFjdG9yeSBmb3IgYSBwYXRoX2l0ZW0gYW5kIGVudHJ5CiAgICAiIiIKICAgIGxvd2VyID0gZW50cnkubG93ZXIoKQogICAgaXNfbWV0YSA9IGFueShtYXAobG93ZXIuZW5kc3dpdGgsICgnLmVnZy1pbmZvJywgJy5kaXN0LWluZm8nKSkpCiAgICByZXR1cm4gKAogICAgICAgIGRpc3RyaWJ1dGlvbnNfZnJvbV9tZXRhZGF0YQogICAgICAgIGlmIGlzX21ldGEgZWxzZQogICAgICAgIGZpbmRfZGlzdHJpYnV0aW9ucwogICAgICAgIGlmIG5vdCBvbmx5IGFuZCBfaXNfZWdnX3BhdGgoZW50cnkpIGVsc2UKICAgICAgICByZXNvbHZlX2VnZ19saW5rCiAgICAgICAgaWYgbm90IG9ubHkgYW5kIGxvd2VyLmVuZHN3aXRoKCcuZWdnLWxpbmsnKSBlbHNlCiAgICAgICAgTm9EaXN0cygpCiAgICApCgoKY2xhc3MgTm9EaXN0czoKICAgICIiIgogICAgPj4+IGJvb2woTm9EaXN0cygpKQogICAgRmFsc2UKCiAgICA+Pj4gbGlzdChOb0Rpc3RzKCkoJ2FueXRoaW5nJykpCiAgICBbXQogICAgIiIiCiAgICBkZWYgX19ib29sX18oc2VsZik6CiAgICAgICAgcmV0dXJuIEZhbHNlCiAgICBpZiBzaXguUFkyOgogICAgICAgIF9fbm9uemVyb19fID0gX19ib29sX18KCiAgICBkZWYgX19jYWxsX18oc2VsZiwgZnVsbHBhdGgpOgogICAgICAgIHJldHVybiBpdGVyKCgpKQoKCmRlZiBzYWZlX2xpc3RkaXIocGF0aCk6CiAgICAiIiIKICAgIEF0dGVtcHQgdG8gbGlzdCBjb250ZW50cyBvZiBwYXRoLCBidXQgc3VwcHJlc3Mgc29tZSBleGNlcHRpb25zLgogICAgIiIiCiAgICB0cnk6CiAgICAgICAgcmV0dXJuIG9zLmxpc3RkaXIocGF0aCkKICAgIGV4Y2VwdCAoUGVybWlzc2lvbkVycm9yLCBOb3RBRGlyZWN0b3J5RXJyb3IpOgogICAgICAgIHBhc3MKICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGU6CiAgICAgICAgIyBJZ25vcmUgdGhlIGRpcmVjdG9yeSBpZiBkb2VzIG5vdCBleGlzdCwgbm90IGEgZGlyZWN0b3J5IG9yCiAgICAgICAgIyBwZXJtaXNzaW9uIGRlbmllZAogICAgICAgIGlnbm9yYWJsZSA9ICgKICAgICAgICAgICAgZS5lcnJubyBpbiAoZXJybm8uRU5PVERJUiwgZXJybm8uRUFDQ0VTLCBlcnJuby5FTk9FTlQpCiAgICAgICAgICAgICMgUHl0aG9uIDIgb24gV2luZG93cyBuZWVkcyB0byBiZSBoYW5kbGVkIHRoaXMgd2F5IDooCiAgICAgICAgICAgIG9yIGdldGF0dHIoZSwgIndpbmVycm9yIiwgTm9uZSkgPT0gMjY3CiAgICAgICAgKQogICAgICAgIGlmIG5vdCBpZ25vcmFibGU6CiAgICAgICAgICAgIHJhaXNlCiAgICByZXR1cm4gKCkKCgpkZWYgZGlzdHJpYnV0aW9uc19mcm9tX21ldGFkYXRhKHBhdGgpOgogICAgcm9vdCA9IG9zLnBhdGguZGlybmFtZShwYXRoKQogICAgaWYgb3MucGF0aC5pc2RpcihwYXRoKToKICAgICAgICBpZiBsZW4ob3MubGlzdGRpcihwYXRoKSkgPT0gMDoKICAgICAgICAgICAgIyBlbXB0eSBtZXRhZGF0YSBkaXI7IHNraXAKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgbWV0YWRhdGEgPSBQYXRoTWV0YWRhdGEocm9vdCwgcGF0aCkKICAgIGVsc2U6CiAgICAgICAgbWV0YWRhdGEgPSBGaWxlTWV0YWRhdGEocGF0aCkKICAgIGVudHJ5ID0gb3MucGF0aC5iYXNlbmFtZShwYXRoKQogICAgeWllbGQgRGlzdHJpYnV0aW9uLmZyb21fbG9jYXRpb24oCiAgICAgICAgcm9vdCwgZW50cnksIG1ldGFkYXRhLCBwcmVjZWRlbmNlPURFVkVMT1BfRElTVCwKICAgICkKCgpkZWYgbm9uX2VtcHR5X2xpbmVzKHBhdGgpOgogICAgIiIiCiAgICBZaWVsZCBub24tZW1wdHkgbGluZXMgZnJvbSBmaWxlIGF0IHBhdGgKICAgICIiIgogICAgd2l0aCBvcGVuKHBhdGgpIGFzIGY6CiAgICAgICAgZm9yIGxpbmUgaW4gZjoKICAgICAgICAgICAgbGluZSA9IGxpbmUuc3RyaXAoKQogICAgICAgICAgICBpZiBsaW5lOgogICAgICAgICAgICAgICAgeWllbGQgbGluZQoKCmRlZiByZXNvbHZlX2VnZ19saW5rKHBhdGgpOgogICAgIiIiCiAgICBHaXZlbiBhIHBhdGggdG8gYW4gLmVnZy1saW5rLCByZXNvbHZlIGRpc3RyaWJ1dGlvbnMKICAgIHByZXNlbnQgaW4gdGhlIHJlZmVyZW5jZWQgcGF0aC4KICAgICIiIgogICAgcmVmZXJlbmNlZF9wYXRocyA9IG5vbl9lbXB0eV9saW5lcyhwYXRoKQogICAgcmVzb2x2ZWRfcGF0aHMgPSAoCiAgICAgICAgb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShwYXRoKSwgcmVmKQogICAgICAgIGZvciByZWYgaW4gcmVmZXJlbmNlZF9wYXRocwogICAgKQogICAgZGlzdF9ncm91cHMgPSBtYXAoZmluZF9kaXN0cmlidXRpb25zLCByZXNvbHZlZF9wYXRocykKICAgIHJldHVybiBuZXh0KGRpc3RfZ3JvdXBzLCAoKSkKCgpyZWdpc3Rlcl9maW5kZXIocGtndXRpbC5JbXBJbXBvcnRlciwgZmluZF9vbl9wYXRoKQoKaWYgaGFzYXR0cihpbXBvcnRsaWJfbWFjaGluZXJ5LCAnRmlsZUZpbmRlcicpOgogICAgcmVnaXN0ZXJfZmluZGVyKGltcG9ydGxpYl9tYWNoaW5lcnkuRmlsZUZpbmRlciwgZmluZF9vbl9wYXRoKQoKX2RlY2xhcmVfc3RhdGUoJ2RpY3QnLCBfbmFtZXNwYWNlX2hhbmRsZXJzPXt9KQpfZGVjbGFyZV9zdGF0ZSgnZGljdCcsIF9uYW1lc3BhY2VfcGFja2FnZXM9e30pCgoKZGVmIHJlZ2lzdGVyX25hbWVzcGFjZV9oYW5kbGVyKGltcG9ydGVyX3R5cGUsIG5hbWVzcGFjZV9oYW5kbGVyKToKICAgICIiIlJlZ2lzdGVyIGBuYW1lc3BhY2VfaGFuZGxlcmAgdG8gZGVjbGFyZSBuYW1lc3BhY2UgcGFja2FnZXMKCiAgICBgaW1wb3J0ZXJfdHlwZWAgaXMgdGhlIHR5cGUgb3IgY2xhc3Mgb2YgYSBQRVAgMzAyICJJbXBvcnRlciIgKHN5cy5wYXRoIGl0ZW0KICAgIGhhbmRsZXIpLCBhbmQgYG5hbWVzcGFjZV9oYW5kbGVyYCBpcyBhIGNhbGxhYmxlIGxpa2UgdGhpczo6CgogICAgICAgIGRlZiBuYW1lc3BhY2VfaGFuZGxlcihpbXBvcnRlciwgcGF0aF9lbnRyeSwgbW9kdWxlTmFtZSwgbW9kdWxlKToKICAgICAgICAgICAgIyByZXR1cm4gYSBwYXRoX2VudHJ5IHRvIHVzZSBmb3IgY2hpbGQgcGFja2FnZXMKCiAgICBOYW1lc3BhY2UgaGFuZGxlcnMgYXJlIG9ubHkgY2FsbGVkIGlmIHRoZSBpbXBvcnRlciBvYmplY3QgaGFzIGFscmVhZHkKICAgIGFncmVlZCB0aGF0IGl0IGNhbiBoYW5kbGUgdGhlIHJlbGV2YW50IHBhdGggaXRlbSwgYW5kIHRoZXkgc2hvdWxkIG9ubHkKICAgIHJldHVybiBhIHN1YnBhdGggaWYgdGhlIG1vZHVsZSBfX3BhdGhfXyBkb2VzIG5vdCBhbHJlYWR5IGNvbnRhaW4gYW4KICAgIGVxdWl2YWxlbnQgc3VicGF0aC4gIEZvciBhbiBleGFtcGxlIG5hbWVzcGFjZSBoYW5kbGVyLCBzZWUKICAgIGBgcGtnX3Jlc291cmNlcy5maWxlX25zX2hhbmRsZXJgYC4KICAgICIiIgogICAgX25hbWVzcGFjZV9oYW5kbGVyc1tpbXBvcnRlcl90eXBlXSA9IG5hbWVzcGFjZV9oYW5kbGVyCgoKZGVmIF9oYW5kbGVfbnMocGFja2FnZU5hbWUsIHBhdGhfaXRlbSk6CiAgICAiIiJFbnN1cmUgdGhhdCBuYW1lZCBwYWNrYWdlIGluY2x1ZGVzIGEgc3VicGF0aCBvZiBwYXRoX2l0ZW0gKGlmIG5lZWRlZCkiIiIKCiAgICBpbXBvcnRlciA9IGdldF9pbXBvcnRlcihwYXRoX2l0ZW0pCiAgICBpZiBpbXBvcnRlciBpcyBOb25lOgogICAgICAgIHJldHVybiBOb25lCgogICAgIyBjYXB0dXJlIHdhcm5pbmdzIGR1ZSB0byAjMTExMQogICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgogICAgICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcigiaWdub3JlIikKICAgICAgICBsb2FkZXIgPSBpbXBvcnRlci5maW5kX21vZHVsZShwYWNrYWdlTmFtZSkKCiAgICBpZiBsb2FkZXIgaXMgTm9uZToKICAgICAgICByZXR1cm4gTm9uZQogICAgbW9kdWxlID0gc3lzLm1vZHVsZXMuZ2V0KHBhY2thZ2VOYW1lKQogICAgaWYgbW9kdWxlIGlzIE5vbmU6CiAgICAgICAgbW9kdWxlID0gc3lzLm1vZHVsZXNbcGFja2FnZU5hbWVdID0gdHlwZXMuTW9kdWxlVHlwZShwYWNrYWdlTmFtZSkKICAgICAgICBtb2R1bGUuX19wYXRoX18gPSBbXQogICAgICAgIF9zZXRfcGFyZW50X25zKHBhY2thZ2VOYW1lKQogICAgZWxpZiBub3QgaGFzYXR0cihtb2R1bGUsICdfX3BhdGhfXycpOgogICAgICAgIHJhaXNlIFR5cGVFcnJvcigiTm90IGEgcGFja2FnZToiLCBwYWNrYWdlTmFtZSkKICAgIGhhbmRsZXIgPSBfZmluZF9hZGFwdGVyKF9uYW1lc3BhY2VfaGFuZGxlcnMsIGltcG9ydGVyKQogICAgc3VicGF0aCA9IGhhbmRsZXIoaW1wb3J0ZXIsIHBhdGhfaXRlbSwgcGFja2FnZU5hbWUsIG1vZHVsZSkKICAgIGlmIHN1YnBhdGggaXMgbm90IE5vbmU6CiAgICAgICAgcGF0aCA9IG1vZHVsZS5fX3BhdGhfXwogICAgICAgIHBhdGguYXBwZW5kKHN1YnBhdGgpCiAgICAgICAgbG9hZGVyLmxvYWRfbW9kdWxlKHBhY2thZ2VOYW1lKQogICAgICAgIF9yZWJ1aWxkX21vZF9wYXRoKHBhdGgsIHBhY2thZ2VOYW1lLCBtb2R1bGUpCiAgICByZXR1cm4gc3VicGF0aAoKCmRlZiBfcmVidWlsZF9tb2RfcGF0aChvcmlnX3BhdGgsIHBhY2thZ2VfbmFtZSwgbW9kdWxlKToKICAgICIiIgogICAgUmVidWlsZCBtb2R1bGUuX19wYXRoX18gZW5zdXJpbmcgdGhhdCBhbGwgZW50cmllcyBhcmUgb3JkZXJlZAogICAgY29ycmVzcG9uZGluZyB0byB0aGVpciBzeXMucGF0aCBvcmRlcgogICAgIiIiCiAgICBzeXNfcGF0aCA9IFtfbm9ybWFsaXplX2NhY2hlZChwKSBmb3IgcCBpbiBzeXMucGF0aF0KCiAgICBkZWYgc2FmZV9zeXNfcGF0aF9pbmRleChlbnRyeSk6CiAgICAgICAgIiIiCiAgICAgICAgV29ya2Fyb3VuZCBmb3IgIzUyMCBhbmQgIzUxMy4KICAgICAgICAiIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzeXNfcGF0aC5pbmRleChlbnRyeSkKICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgcmV0dXJuIGZsb2F0KCdpbmYnKQoKICAgIGRlZiBwb3NpdGlvbl9pbl9zeXNfcGF0aChwYXRoKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gdGhlIG9yZGluYWwgb2YgdGhlIHBhdGggYmFzZWQgb24gaXRzIHBvc2l0aW9uIGluIHN5cy5wYXRoCiAgICAgICAgIiIiCiAgICAgICAgcGF0aF9wYXJ0cyA9IHBhdGguc3BsaXQob3Muc2VwKQogICAgICAgIG1vZHVsZV9wYXJ0cyA9IHBhY2thZ2VfbmFtZS5jb3VudCgnLicpICsgMQogICAgICAgIHBhcnRzID0gcGF0aF9wYXJ0c1s6LW1vZHVsZV9wYXJ0c10KICAgICAgICByZXR1cm4gc2FmZV9zeXNfcGF0aF9pbmRleChfbm9ybWFsaXplX2NhY2hlZChvcy5zZXAuam9pbihwYXJ0cykpKQoKICAgIG5ld19wYXRoID0gc29ydGVkKG9yaWdfcGF0aCwga2V5PXBvc2l0aW9uX2luX3N5c19wYXRoKQogICAgbmV3X3BhdGggPSBbX25vcm1hbGl6ZV9jYWNoZWQocCkgZm9yIHAgaW4gbmV3X3BhdGhdCgogICAgaWYgaXNpbnN0YW5jZShtb2R1bGUuX19wYXRoX18sIGxpc3QpOgogICAgICAgIG1vZHVsZS5fX3BhdGhfX1s6XSA9IG5ld19wYXRoCiAgICBlbHNlOgogICAgICAgIG1vZHVsZS5fX3BhdGhfXyA9IG5ld19wYXRoCgoKZGVmIGRlY2xhcmVfbmFtZXNwYWNlKHBhY2thZ2VOYW1lKToKICAgICIiIkRlY2xhcmUgdGhhdCBwYWNrYWdlICdwYWNrYWdlTmFtZScgaXMgYSBuYW1lc3BhY2UgcGFja2FnZSIiIgoKICAgIF9pbXAuYWNxdWlyZV9sb2NrKCkKICAgIHRyeToKICAgICAgICBpZiBwYWNrYWdlTmFtZSBpbiBfbmFtZXNwYWNlX3BhY2thZ2VzOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgcGF0aCA9IHN5cy5wYXRoCiAgICAgICAgcGFyZW50LCBfLCBfID0gcGFja2FnZU5hbWUucnBhcnRpdGlvbignLicpCgogICAgICAgIGlmIHBhcmVudDoKICAgICAgICAgICAgZGVjbGFyZV9uYW1lc3BhY2UocGFyZW50KQogICAgICAgICAgICBpZiBwYXJlbnQgbm90IGluIF9uYW1lc3BhY2VfcGFja2FnZXM6CiAgICAgICAgICAgICAgICBfX2ltcG9ydF9fKHBhcmVudCkKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcGF0aCA9IHN5cy5tb2R1bGVzW3BhcmVudF0uX19wYXRoX18KICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJOb3QgYSBwYWNrYWdlOiIsIHBhcmVudCkKCiAgICAgICAgIyBUcmFjayB3aGF0IHBhY2thZ2VzIGFyZSBuYW1lc3BhY2VzLCBzbyB3aGVuIG5ldyBwYXRoIGl0ZW1zIGFyZSBhZGRlZCwKICAgICAgICAjIHRoZXkgY2FuIGJlIHVwZGF0ZWQKICAgICAgICBfbmFtZXNwYWNlX3BhY2thZ2VzLnNldGRlZmF1bHQocGFyZW50IG9yIE5vbmUsIFtdKS5hcHBlbmQocGFja2FnZU5hbWUpCiAgICAgICAgX25hbWVzcGFjZV9wYWNrYWdlcy5zZXRkZWZhdWx0KHBhY2thZ2VOYW1lLCBbXSkKCiAgICAgICAgZm9yIHBhdGhfaXRlbSBpbiBwYXRoOgogICAgICAgICAgICAjIEVuc3VyZSBhbGwgdGhlIHBhcmVudCdzIHBhdGggaXRlbXMgYXJlIHJlZmxlY3RlZCBpbiB0aGUgY2hpbGQsCiAgICAgICAgICAgICMgaWYgdGhleSBhcHBseQogICAgICAgICAgICBfaGFuZGxlX25zKHBhY2thZ2VOYW1lLCBwYXRoX2l0ZW0pCgogICAgZmluYWxseToKICAgICAgICBfaW1wLnJlbGVhc2VfbG9jaygpCgoKZGVmIGZpeHVwX25hbWVzcGFjZV9wYWNrYWdlcyhwYXRoX2l0ZW0sIHBhcmVudD1Ob25lKToKICAgICIiIkVuc3VyZSB0aGF0IHByZXZpb3VzbHktZGVjbGFyZWQgbmFtZXNwYWNlIHBhY2thZ2VzIGluY2x1ZGUgcGF0aF9pdGVtIiIiCiAgICBfaW1wLmFjcXVpcmVfbG9jaygpCiAgICB0cnk6CiAgICAgICAgZm9yIHBhY2thZ2UgaW4gX25hbWVzcGFjZV9wYWNrYWdlcy5nZXQocGFyZW50LCAoKSk6CiAgICAgICAgICAgIHN1YnBhdGggPSBfaGFuZGxlX25zKHBhY2thZ2UsIHBhdGhfaXRlbSkKICAgICAgICAgICAgaWYgc3VicGF0aDoKICAgICAgICAgICAgICAgIGZpeHVwX25hbWVzcGFjZV9wYWNrYWdlcyhzdWJwYXRoLCBwYWNrYWdlKQogICAgZmluYWxseToKICAgICAgICBfaW1wLnJlbGVhc2VfbG9jaygpCgoKZGVmIGZpbGVfbnNfaGFuZGxlcihpbXBvcnRlciwgcGF0aF9pdGVtLCBwYWNrYWdlTmFtZSwgbW9kdWxlKToKICAgICIiIkNvbXB1dGUgYW4gbnMtcGFja2FnZSBzdWJwYXRoIGZvciBhIGZpbGVzeXN0ZW0gb3IgemlwZmlsZSBpbXBvcnRlciIiIgoKICAgIHN1YnBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aF9pdGVtLCBwYWNrYWdlTmFtZS5zcGxpdCgnLicpWy0xXSkKICAgIG5vcm1hbGl6ZWQgPSBfbm9ybWFsaXplX2NhY2hlZChzdWJwYXRoKQogICAgZm9yIGl0ZW0gaW4gbW9kdWxlLl9fcGF0aF9fOgogICAgICAgIGlmIF9ub3JtYWxpemVfY2FjaGVkKGl0ZW0pID09IG5vcm1hbGl6ZWQ6CiAgICAgICAgICAgIGJyZWFrCiAgICBlbHNlOgogICAgICAgICMgT25seSByZXR1cm4gdGhlIHBhdGggaWYgaXQncyBub3QgYWxyZWFkeSB0aGVyZQogICAgICAgIHJldHVybiBzdWJwYXRoCgoKcmVnaXN0ZXJfbmFtZXNwYWNlX2hhbmRsZXIocGtndXRpbC5JbXBJbXBvcnRlciwgZmlsZV9uc19oYW5kbGVyKQpyZWdpc3Rlcl9uYW1lc3BhY2VfaGFuZGxlcih6aXBpbXBvcnQuemlwaW1wb3J0ZXIsIGZpbGVfbnNfaGFuZGxlcikKCmlmIGhhc2F0dHIoaW1wb3J0bGliX21hY2hpbmVyeSwgJ0ZpbGVGaW5kZXInKToKICAgIHJlZ2lzdGVyX25hbWVzcGFjZV9oYW5kbGVyKGltcG9ydGxpYl9tYWNoaW5lcnkuRmlsZUZpbmRlciwgZmlsZV9uc19oYW5kbGVyKQoKCmRlZiBudWxsX25zX2hhbmRsZXIoaW1wb3J0ZXIsIHBhdGhfaXRlbSwgcGFja2FnZU5hbWUsIG1vZHVsZSk6CiAgICByZXR1cm4gTm9uZQoKCnJlZ2lzdGVyX25hbWVzcGFjZV9oYW5kbGVyKG9iamVjdCwgbnVsbF9uc19oYW5kbGVyKQoKCmRlZiBub3JtYWxpemVfcGF0aChmaWxlbmFtZSk6CiAgICAiIiJOb3JtYWxpemUgYSBmaWxlL2RpciBuYW1lIGZvciBjb21wYXJpc29uIHB1cnBvc2VzIiIiCiAgICByZXR1cm4gb3MucGF0aC5ub3JtY2FzZShvcy5wYXRoLnJlYWxwYXRoKG9zLnBhdGgubm9ybXBhdGgoX2N5Z3dpbl9wYXRjaChmaWxlbmFtZSkpKSkKCgpkZWYgX2N5Z3dpbl9wYXRjaChmaWxlbmFtZSk6ICAjIHByYWdtYTogbm9jb3ZlcgogICAgIiIiCiAgICBDb250cmFyeSB0byBQT1NJWCAyMDA4LCBvbiBDeWd3aW4sIGdldGN3ZCAoMykgY29udGFpbnMKICAgIHN5bWxpbmsgY29tcG9uZW50cy4gVXNpbmcKICAgIG9zLnBhdGguYWJzcGF0aCgpIHdvcmtzIGFyb3VuZCB0aGlzIGxpbWl0YXRpb24uIEEgZml4IGluIG9zLmdldGN3ZCgpCiAgICB3b3VsZCBwcm9iYWJseSBiZXR0ZXIsIGluIEN5Z3dpbiBldmVuIG1vcmUgc28sIGV4Y2VwdAogICAgdGhhdCB0aGlzIHNlZW1zIHRvIGJlIGJ5IGRlc2lnbi4uLgogICAgIiIiCiAgICByZXR1cm4gb3MucGF0aC5hYnNwYXRoKGZpbGVuYW1lKSBpZiBzeXMucGxhdGZvcm0gPT0gJ2N5Z3dpbicgZWxzZSBmaWxlbmFtZQoKCmRlZiBfbm9ybWFsaXplX2NhY2hlZChmaWxlbmFtZSwgX2NhY2hlPXt9KToKICAgIHRyeToKICAgICAgICByZXR1cm4gX2NhY2hlW2ZpbGVuYW1lXQogICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgIF9jYWNoZVtmaWxlbmFtZV0gPSByZXN1bHQgPSBub3JtYWxpemVfcGF0aChmaWxlbmFtZSkKICAgICAgICByZXR1cm4gcmVzdWx0CgoKZGVmIF9pc19lZ2dfcGF0aChwYXRoKToKICAgICIiIgogICAgRGV0ZXJtaW5lIGlmIGdpdmVuIHBhdGggYXBwZWFycyB0byBiZSBhbiBlZ2cuCiAgICAiIiIKICAgIHJldHVybiBwYXRoLmxvd2VyKCkuZW5kc3dpdGgoJy5lZ2cnKQoKCmRlZiBfaXNfdW5wYWNrZWRfZWdnKHBhdGgpOgogICAgIiIiCiAgICBEZXRlcm1pbmUgaWYgZ2l2ZW4gcGF0aCBhcHBlYXJzIHRvIGJlIGFuIHVucGFja2VkIGVnZy4KICAgICIiIgogICAgcmV0dXJuICgKICAgICAgICBfaXNfZWdnX3BhdGgocGF0aCkgYW5kCiAgICAgICAgb3MucGF0aC5pc2ZpbGUob3MucGF0aC5qb2luKHBhdGgsICdFR0ctSU5GTycsICdQS0ctSU5GTycpKQogICAgKQoKCmRlZiBfc2V0X3BhcmVudF9ucyhwYWNrYWdlTmFtZSk6CiAgICBwYXJ0cyA9IHBhY2thZ2VOYW1lLnNwbGl0KCcuJykKICAgIG5hbWUgPSBwYXJ0cy5wb3AoKQogICAgaWYgcGFydHM6CiAgICAgICAgcGFyZW50ID0gJy4nLmpvaW4ocGFydHMpCiAgICAgICAgc2V0YXR0cihzeXMubW9kdWxlc1twYXJlbnRdLCBuYW1lLCBzeXMubW9kdWxlc1twYWNrYWdlTmFtZV0pCgoKZGVmIHlpZWxkX2xpbmVzKHN0cnMpOgogICAgIiIiWWllbGQgbm9uLWVtcHR5L25vbi1jb21tZW50IGxpbmVzIG9mIGEgc3RyaW5nIG9yIHNlcXVlbmNlIiIiCiAgICBpZiBpc2luc3RhbmNlKHN0cnMsIHNpeC5zdHJpbmdfdHlwZXMpOgogICAgICAgIGZvciBzIGluIHN0cnMuc3BsaXRsaW5lcygpOgogICAgICAgICAgICBzID0gcy5zdHJpcCgpCiAgICAgICAgICAgICMgc2tpcCBibGFuayBsaW5lcy9jb21tZW50cwogICAgICAgICAgICBpZiBzIGFuZCBub3Qgcy5zdGFydHN3aXRoKCcjJyk6CiAgICAgICAgICAgICAgICB5aWVsZCBzCiAgICBlbHNlOgogICAgICAgIGZvciBzcyBpbiBzdHJzOgogICAgICAgICAgICBmb3IgcyBpbiB5aWVsZF9saW5lcyhzcyk6CiAgICAgICAgICAgICAgICB5aWVsZCBzCgoKTU9EVUxFID0gcmUuY29tcGlsZShyIlx3KyhcLlx3KykqJCIpLm1hdGNoCkVHR19OQU1FID0gcmUuY29tcGlsZSgKICAgIHIiIiIKICAgICg/UDxuYW1lPlteLV0rKSAoCiAgICAgICAgLSg/UDx2ZXI+W14tXSspICgKICAgICAgICAgICAgLXB5KD9QPHB5dmVyPlteLV0rKSAoCiAgICAgICAgICAgICAgICAtKD9QPHBsYXQ+LispCiAgICAgICAgICAgICk/CiAgICAgICAgKT8KICAgICk/CiAgICAiIiIsCiAgICByZS5WRVJCT1NFIHwgcmUuSUdOT1JFQ0FTRSwKKS5tYXRjaAoKCmNsYXNzIEVudHJ5UG9pbnQ6CiAgICAiIiJPYmplY3QgcmVwcmVzZW50aW5nIGFuIGFkdmVydGlzZWQgaW1wb3J0YWJsZSBvYmplY3QiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgbW9kdWxlX25hbWUsIGF0dHJzPSgpLCBleHRyYXM9KCksIGRpc3Q9Tm9uZSk6CiAgICAgICAgaWYgbm90IE1PRFVMRShtb2R1bGVfbmFtZSk6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkludmFsaWQgbW9kdWxlIG5hbWUiLCBtb2R1bGVfbmFtZSkKICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCiAgICAgICAgc2VsZi5tb2R1bGVfbmFtZSA9IG1vZHVsZV9uYW1lCiAgICAgICAgc2VsZi5hdHRycyA9IHR1cGxlKGF0dHJzKQogICAgICAgIHNlbGYuZXh0cmFzID0gdHVwbGUoZXh0cmFzKQogICAgICAgIHNlbGYuZGlzdCA9IGRpc3QKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICBzID0gIiVzID0gJXMiICUgKHNlbGYubmFtZSwgc2VsZi5tb2R1bGVfbmFtZSkKICAgICAgICBpZiBzZWxmLmF0dHJzOgogICAgICAgICAgICBzICs9ICc6JyArICcuJy5qb2luKHNlbGYuYXR0cnMpCiAgICAgICAgaWYgc2VsZi5leHRyYXM6CiAgICAgICAgICAgIHMgKz0gJyBbJXNdJyAlICcsJy5qb2luKHNlbGYuZXh0cmFzKQogICAgICAgIHJldHVybiBzCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiRW50cnlQb2ludC5wYXJzZSglcikiICUgc3RyKHNlbGYpCgogICAgZGVmIGxvYWQoc2VsZiwgcmVxdWlyZT1UcnVlLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgICIiIgogICAgICAgIFJlcXVpcmUgcGFja2FnZXMgZm9yIHRoaXMgRW50cnlQb2ludCwgdGhlbiByZXNvbHZlIGl0LgogICAgICAgICIiIgogICAgICAgIGlmIG5vdCByZXF1aXJlIG9yIGFyZ3Mgb3Iga3dhcmdzOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKAogICAgICAgICAgICAgICAgIlBhcmFtZXRlcnMgdG8gbG9hZCBhcmUgZGVwcmVjYXRlZC4gIENhbGwgLnJlc29sdmUgYW5kICIKICAgICAgICAgICAgICAgICIucmVxdWlyZSBzZXBhcmF0ZWx5LiIsCiAgICAgICAgICAgICAgICBQa2dSZXNvdXJjZXNEZXByZWNhdGlvbldhcm5pbmcsCiAgICAgICAgICAgICAgICBzdGFja2xldmVsPTIsCiAgICAgICAgICAgICkKICAgICAgICBpZiByZXF1aXJlOgogICAgICAgICAgICBzZWxmLnJlcXVpcmUoKmFyZ3MsICoqa3dhcmdzKQogICAgICAgIHJldHVybiBzZWxmLnJlc29sdmUoKQoKICAgIGRlZiByZXNvbHZlKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJlc29sdmUgdGhlIGVudHJ5IHBvaW50IGZyb20gaXRzIG1vZHVsZSBhbmQgYXR0cnMuCiAgICAgICAgIiIiCiAgICAgICAgbW9kdWxlID0gX19pbXBvcnRfXyhzZWxmLm1vZHVsZV9uYW1lLCBmcm9tbGlzdD1bJ19fbmFtZV9fJ10sIGxldmVsPTApCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gZnVuY3Rvb2xzLnJlZHVjZShnZXRhdHRyLCBzZWxmLmF0dHJzLCBtb2R1bGUpCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yIGFzIGV4YzoKICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3Ioc3RyKGV4YykpCgogICAgZGVmIHJlcXVpcmUoc2VsZiwgZW52PU5vbmUsIGluc3RhbGxlcj1Ob25lKToKICAgICAgICBpZiBzZWxmLmV4dHJhcyBhbmQgbm90IHNlbGYuZGlzdDoKICAgICAgICAgICAgcmFpc2UgVW5rbm93bkV4dHJhKCJDYW4ndCByZXF1aXJlKCkgd2l0aG91dCBhIGRpc3RyaWJ1dGlvbiIsIHNlbGYpCgogICAgICAgICMgR2V0IHRoZSByZXF1aXJlbWVudHMgZm9yIHRoaXMgZW50cnkgcG9pbnQgd2l0aCBhbGwgaXRzIGV4dHJhcyBhbmQKICAgICAgICAjIHRoZW4gcmVzb2x2ZSB0aGVtLiBXZSBoYXZlIHRvIHBhc3MgYGV4dHJhc2AgYWxvbmcgd2hlbiByZXNvbHZpbmcgc28KICAgICAgICAjIHRoYXQgdGhlIHdvcmtpbmcgc2V0IGtub3dzIHdoYXQgZXh0cmFzIHdlIHdhbnQuIE90aGVyd2lzZSwgZm9yCiAgICAgICAgIyBkaXN0LWluZm8gZGlzdHJpYnV0aW9ucywgdGhlIHdvcmtpbmcgc2V0IHdpbGwgYXNzdW1lIHRoYXQgdGhlCiAgICAgICAgIyByZXF1aXJlbWVudHMgZm9yIHRoYXQgZXh0cmEgYXJlIHB1cmVseSBvcHRpb25hbCBhbmQgc2tpcCBvdmVyIHRoZW0uCiAgICAgICAgcmVxcyA9IHNlbGYuZGlzdC5yZXF1aXJlcyhzZWxmLmV4dHJhcykKICAgICAgICBpdGVtcyA9IHdvcmtpbmdfc2V0LnJlc29sdmUocmVxcywgZW52LCBpbnN0YWxsZXIsIGV4dHJhcz1zZWxmLmV4dHJhcykKICAgICAgICBsaXN0KG1hcCh3b3JraW5nX3NldC5hZGQsIGl0ZW1zKSkKCiAgICBwYXR0ZXJuID0gcmUuY29tcGlsZSgKICAgICAgICByJ1xzKicKICAgICAgICByJyg/UDxuYW1lPi4rPylccyonCiAgICAgICAgcic9XHMqJwogICAgICAgIHInKD9QPG1vZHVsZT5bXHcuXSspXHMqJwogICAgICAgIHInKDpccyooP1A8YXR0cj5bXHcuXSspKT9ccyonCiAgICAgICAgcicoP1A8ZXh0cmFzPlxbLipcXSk/XHMqJCcKICAgICkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBwYXJzZShjbHMsIHNyYywgZGlzdD1Ob25lKToKICAgICAgICAiIiJQYXJzZSBhIHNpbmdsZSBlbnRyeSBwb2ludCBmcm9tIHN0cmluZyBgc3JjYAoKICAgICAgICBFbnRyeSBwb2ludCBzeW50YXggZm9sbG93cyB0aGUgZm9ybTo6CgogICAgICAgICAgICBuYW1lID0gc29tZS5tb2R1bGU6c29tZS5hdHRyIFtleHRyYTEsIGV4dHJhMl0KCiAgICAgICAgVGhlIGVudHJ5IG5hbWUgYW5kIG1vZHVsZSBuYW1lIGFyZSByZXF1aXJlZCwgYnV0IHRoZSBgYDphdHRyc2BgIGFuZAogICAgICAgIGBgW2V4dHJhc11gYCBwYXJ0cyBhcmUgb3B0aW9uYWwKICAgICAgICAiIiIKICAgICAgICBtID0gY2xzLnBhdHRlcm4ubWF0Y2goc3JjKQogICAgICAgIGlmIG5vdCBtOgogICAgICAgICAgICBtc2cgPSAiRW50cnlQb2ludCBtdXN0IGJlIGluICduYW1lPW1vZHVsZTphdHRycyBbZXh0cmFzXScgZm9ybWF0IgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKG1zZywgc3JjKQogICAgICAgIHJlcyA9IG0uZ3JvdXBkaWN0KCkKICAgICAgICBleHRyYXMgPSBjbHMuX3BhcnNlX2V4dHJhcyhyZXNbJ2V4dHJhcyddKQogICAgICAgIGF0dHJzID0gcmVzWydhdHRyJ10uc3BsaXQoJy4nKSBpZiByZXNbJ2F0dHInXSBlbHNlICgpCiAgICAgICAgcmV0dXJuIGNscyhyZXNbJ25hbWUnXSwgcmVzWydtb2R1bGUnXSwgYXR0cnMsIGV4dHJhcywgZGlzdCkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfcGFyc2VfZXh0cmFzKGNscywgZXh0cmFzX3NwZWMpOgogICAgICAgIGlmIG5vdCBleHRyYXNfc3BlYzoKICAgICAgICAgICAgcmV0dXJuICgpCiAgICAgICAgcmVxID0gUmVxdWlyZW1lbnQucGFyc2UoJ3gnICsgZXh0cmFzX3NwZWMpCiAgICAgICAgaWYgcmVxLnNwZWNzOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCkKICAgICAgICByZXR1cm4gcmVxLmV4dHJhcwoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIHBhcnNlX2dyb3VwKGNscywgZ3JvdXAsIGxpbmVzLCBkaXN0PU5vbmUpOgogICAgICAgICIiIlBhcnNlIGFuIGVudHJ5IHBvaW50IGdyb3VwIiIiCiAgICAgICAgaWYgbm90IE1PRFVMRShncm91cCk6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkludmFsaWQgZ3JvdXAgbmFtZSIsIGdyb3VwKQogICAgICAgIHRoaXMgPSB7fQogICAgICAgIGZvciBsaW5lIGluIHlpZWxkX2xpbmVzKGxpbmVzKToKICAgICAgICAgICAgZXAgPSBjbHMucGFyc2UobGluZSwgZGlzdCkKICAgICAgICAgICAgaWYgZXAubmFtZSBpbiB0aGlzOgogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiRHVwbGljYXRlIGVudHJ5IHBvaW50IiwgZ3JvdXAsIGVwLm5hbWUpCiAgICAgICAgICAgIHRoaXNbZXAubmFtZV0gPSBlcAogICAgICAgIHJldHVybiB0aGlzCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgcGFyc2VfbWFwKGNscywgZGF0YSwgZGlzdD1Ob25lKToKICAgICAgICAiIiJQYXJzZSBhIG1hcCBvZiBlbnRyeSBwb2ludCBncm91cHMiIiIKICAgICAgICBpZiBpc2luc3RhbmNlKGRhdGEsIGRpY3QpOgogICAgICAgICAgICBkYXRhID0gZGF0YS5pdGVtcygpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZGF0YSA9IHNwbGl0X3NlY3Rpb25zKGRhdGEpCiAgICAgICAgbWFwcyA9IHt9CiAgICAgICAgZm9yIGdyb3VwLCBsaW5lcyBpbiBkYXRhOgogICAgICAgICAgICBpZiBncm91cCBpcyBOb25lOgogICAgICAgICAgICAgICAgaWYgbm90IGxpbmVzOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJFbnRyeSBwb2ludHMgbXVzdCBiZSBsaXN0ZWQgaW4gZ3JvdXBzIikKICAgICAgICAgICAgZ3JvdXAgPSBncm91cC5zdHJpcCgpCiAgICAgICAgICAgIGlmIGdyb3VwIGluIG1hcHM6CiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJEdXBsaWNhdGUgZ3JvdXAgbmFtZSIsIGdyb3VwKQogICAgICAgICAgICBtYXBzW2dyb3VwXSA9IGNscy5wYXJzZV9ncm91cChncm91cCwgbGluZXMsIGRpc3QpCiAgICAgICAgcmV0dXJuIG1hcHMKCgpkZWYgX3JlbW92ZV9tZDVfZnJhZ21lbnQobG9jYXRpb24pOgogICAgaWYgbm90IGxvY2F0aW9uOgogICAgICAgIHJldHVybiAnJwogICAgcGFyc2VkID0gdXJsbGliLnBhcnNlLnVybHBhcnNlKGxvY2F0aW9uKQogICAgaWYgcGFyc2VkWy0xXS5zdGFydHN3aXRoKCdtZDU9Jyk6CiAgICAgICAgcmV0dXJuIHVybGxpYi5wYXJzZS51cmx1bnBhcnNlKHBhcnNlZFs6LTFdICsgKCcnLCkpCiAgICByZXR1cm4gbG9jYXRpb24KCgpkZWYgX3ZlcnNpb25fZnJvbV9maWxlKGxpbmVzKToKICAgICIiIgogICAgR2l2ZW4gYW4gaXRlcmFibGUgb2YgbGluZXMgZnJvbSBhIE1ldGFkYXRhIGZpbGUsIHJldHVybgogICAgdGhlIHZhbHVlIG9mIHRoZSBWZXJzaW9uIGZpZWxkLCBpZiBwcmVzZW50LCBvciBOb25lIG90aGVyd2lzZS4KICAgICIiIgogICAgZGVmIGlzX3ZlcnNpb25fbGluZShsaW5lKToKICAgICAgICByZXR1cm4gbGluZS5sb3dlcigpLnN0YXJ0c3dpdGgoJ3ZlcnNpb246JykKICAgIHZlcnNpb25fbGluZXMgPSBmaWx0ZXIoaXNfdmVyc2lvbl9saW5lLCBsaW5lcykKICAgIGxpbmUgPSBuZXh0KGl0ZXIodmVyc2lvbl9saW5lcyksICcnKQogICAgXywgXywgdmFsdWUgPSBsaW5lLnBhcnRpdGlvbignOicpCiAgICByZXR1cm4gc2FmZV92ZXJzaW9uKHZhbHVlLnN0cmlwKCkpIG9yIE5vbmUKCgpjbGFzcyBEaXN0cmlidXRpb246CiAgICAiIiJXcmFwIGFuIGFjdHVhbCBvciBwb3RlbnRpYWwgc3lzLnBhdGggZW50cnkgdy9tZXRhZGF0YSIiIgogICAgUEtHX0lORk8gPSAnUEtHLUlORk8nCgogICAgZGVmIF9faW5pdF9fKAogICAgICAgICAgICBzZWxmLCBsb2NhdGlvbj1Ob25lLCBtZXRhZGF0YT1Ob25lLCBwcm9qZWN0X25hbWU9Tm9uZSwKICAgICAgICAgICAgdmVyc2lvbj1Ob25lLCBweV92ZXJzaW9uPVBZX01BSk9SLCBwbGF0Zm9ybT1Ob25lLAogICAgICAgICAgICBwcmVjZWRlbmNlPUVHR19ESVNUKToKICAgICAgICBzZWxmLnByb2plY3RfbmFtZSA9IHNhZmVfbmFtZShwcm9qZWN0X25hbWUgb3IgJ1Vua25vd24nKQogICAgICAgIGlmIHZlcnNpb24gaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGYuX3ZlcnNpb24gPSBzYWZlX3ZlcnNpb24odmVyc2lvbikKICAgICAgICBzZWxmLnB5X3ZlcnNpb24gPSBweV92ZXJzaW9uCiAgICAgICAgc2VsZi5wbGF0Zm9ybSA9IHBsYXRmb3JtCiAgICAgICAgc2VsZi5sb2NhdGlvbiA9IGxvY2F0aW9uCiAgICAgICAgc2VsZi5wcmVjZWRlbmNlID0gcHJlY2VkZW5jZQogICAgICAgIHNlbGYuX3Byb3ZpZGVyID0gbWV0YWRhdGEgb3IgZW1wdHlfcHJvdmlkZXIKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBmcm9tX2xvY2F0aW9uKGNscywgbG9jYXRpb24sIGJhc2VuYW1lLCBtZXRhZGF0YT1Ob25lLCAqKmt3KToKICAgICAgICBwcm9qZWN0X25hbWUsIHZlcnNpb24sIHB5X3ZlcnNpb24sIHBsYXRmb3JtID0gW05vbmVdICogNAogICAgICAgIGJhc2VuYW1lLCBleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KGJhc2VuYW1lKQogICAgICAgIGlmIGV4dC5sb3dlcigpIGluIF9kaXN0cmlidXRpb25JbXBsOgogICAgICAgICAgICBjbHMgPSBfZGlzdHJpYnV0aW9uSW1wbFtleHQubG93ZXIoKV0KCiAgICAgICAgICAgIG1hdGNoID0gRUdHX05BTUUoYmFzZW5hbWUpCiAgICAgICAgICAgIGlmIG1hdGNoOgogICAgICAgICAgICAgICAgcHJvamVjdF9uYW1lLCB2ZXJzaW9uLCBweV92ZXJzaW9uLCBwbGF0Zm9ybSA9IG1hdGNoLmdyb3VwKAogICAgICAgICAgICAgICAgICAgICduYW1lJywgJ3ZlcicsICdweXZlcicsICdwbGF0JwogICAgICAgICAgICAgICAgKQogICAgICAgIHJldHVybiBjbHMoCiAgICAgICAgICAgIGxvY2F0aW9uLCBtZXRhZGF0YSwgcHJvamVjdF9uYW1lPXByb2plY3RfbmFtZSwgdmVyc2lvbj12ZXJzaW9uLAogICAgICAgICAgICBweV92ZXJzaW9uPXB5X3ZlcnNpb24sIHBsYXRmb3JtPXBsYXRmb3JtLCAqKmt3CiAgICAgICAgKS5fcmVsb2FkX3ZlcnNpb24oKQoKICAgIGRlZiBfcmVsb2FkX3ZlcnNpb24oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBAcHJvcGVydHkKICAgIGRlZiBoYXNoY21wKHNlbGYpOgogICAgICAgIHJldHVybiAoCiAgICAgICAgICAgIHNlbGYucGFyc2VkX3ZlcnNpb24sCiAgICAgICAgICAgIHNlbGYucHJlY2VkZW5jZSwKICAgICAgICAgICAgc2VsZi5rZXksCiAgICAgICAgICAgIF9yZW1vdmVfbWQ1X2ZyYWdtZW50KHNlbGYubG9jYXRpb24pLAogICAgICAgICAgICBzZWxmLnB5X3ZlcnNpb24gb3IgJycsCiAgICAgICAgICAgIHNlbGYucGxhdGZvcm0gb3IgJycsCiAgICAgICAgKQoKICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKICAgICAgICByZXR1cm4gaGFzaChzZWxmLmhhc2hjbXApCgogICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYuaGFzaGNtcCA8IG90aGVyLmhhc2hjbXAKCiAgICBkZWYgX19sZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5oYXNoY21wIDw9IG90aGVyLmhhc2hjbXAKCiAgICBkZWYgX19ndF9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5oYXNoY21wID4gb3RoZXIuaGFzaGNtcAoKICAgIGRlZiBfX2dlX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmLmhhc2hjbXAgPj0gb3RoZXIuaGFzaGNtcAoKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXyk6CiAgICAgICAgICAgICMgSXQncyBub3QgYSBEaXN0cmlidXRpb24sIHNvIHRoZXkgYXJlIG5vdCBlcXVhbAogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICByZXR1cm4gc2VsZi5oYXNoY21wID09IG90aGVyLmhhc2hjbXAKCiAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gbm90IHNlbGYgPT0gb3RoZXIKCiAgICAjIFRoZXNlIHByb3BlcnRpZXMgaGF2ZSB0byBiZSBsYXp5IHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBsb2FkIGFueQogICAgIyBtZXRhZGF0YSB1bnRpbC91bmxlc3MgaXQncyBhY3R1YWxseSBuZWVkZWQuICAoaS5lLiwgc29tZSBkaXN0cmlidXRpb25zCiAgICAjIG1heSBub3Qga25vdyB0aGVpciBuYW1lIG9yIHZlcnNpb24gd2l0aG91dCBsb2FkaW5nIFBLRy1JTkZPKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGtleShzZWxmKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9rZXkKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIHNlbGYuX2tleSA9IGtleSA9IHNlbGYucHJvamVjdF9uYW1lLmxvd2VyKCkKICAgICAgICAgICAgcmV0dXJuIGtleQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHBhcnNlZF92ZXJzaW9uKHNlbGYpOgogICAgICAgIGlmIG5vdCBoYXNhdHRyKHNlbGYsICJfcGFyc2VkX3ZlcnNpb24iKToKICAgICAgICAgICAgc2VsZi5fcGFyc2VkX3ZlcnNpb24gPSBwYXJzZV92ZXJzaW9uKHNlbGYudmVyc2lvbikKCiAgICAgICAgcmV0dXJuIHNlbGYuX3BhcnNlZF92ZXJzaW9uCgogICAgZGVmIF93YXJuX2xlZ2FjeV92ZXJzaW9uKHNlbGYpOgogICAgICAgIExWID0gcGFja2FnaW5nLnZlcnNpb24uTGVnYWN5VmVyc2lvbgogICAgICAgIGlzX2xlZ2FjeSA9IGlzaW5zdGFuY2Uoc2VsZi5fcGFyc2VkX3ZlcnNpb24sIExWKQogICAgICAgIGlmIG5vdCBpc19sZWdhY3k6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICAjIFdoaWxlIGFuIGVtcHR5IHZlcnNpb24gaXMgdGVjaG5pY2FsbHkgYSBsZWdhY3kgdmVyc2lvbiBhbmQKICAgICAgICAjIGlzIG5vdCBhIHZhbGlkIFBFUCA0NDAgdmVyc2lvbiwgaXQncyBhbHNvIHVubGlrZWx5IHRvCiAgICAgICAgIyBhY3R1YWxseSBjb21lIGZyb20gc29tZW9uZSBhbmQgaW5zdGVhZCBpdCBpcyBtb3JlIGxpa2VseSB0aGF0CiAgICAgICAgIyBpdCBjb21lcyBmcm9tIHNldHVwdG9vbHMgYXR0ZW1wdGluZyB0byBwYXJzZSBhIGZpbGVuYW1lIGFuZAogICAgICAgICMgaW5jbHVkaW5nIGl0IGluIHRoZSBsaXN0LiBTbyBmb3IgdGhhdCB3ZSdsbCBnYXRlIHRoaXMgd2FybmluZwogICAgICAgICMgb24gaWYgdGhlIHZlcnNpb24gaXMgYW55dGhpbmcgYXQgYWxsIG9yIG5vdC4KICAgICAgICBpZiBub3Qgc2VsZi52ZXJzaW9uOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgdG1wbCA9IHRleHR3cmFwLmRlZGVudCgiIiIKICAgICAgICAgICAgJ3twcm9qZWN0X25hbWV9ICh7dmVyc2lvbn0pJyBpcyBiZWluZyBwYXJzZWQgYXMgYSBsZWdhY3ksCiAgICAgICAgICAgIG5vbiBQRVAgNDQwLAogICAgICAgICAgICB2ZXJzaW9uLiBZb3UgbWF5IGZpbmQgb2RkIGJlaGF2aW9yIGFuZCBzb3J0IG9yZGVyLgogICAgICAgICAgICBJbiBwYXJ0aWN1bGFyIGl0IHdpbGwgYmUgc29ydGVkIGFzIGxlc3MgdGhhbiAwLjAuIEl0CiAgICAgICAgICAgIGlzIHJlY29tbWVuZGVkIHRvIG1pZ3JhdGUgdG8gUEVQIDQ0MCBjb21wYXRpYmxlCiAgICAgICAgICAgIHZlcnNpb25zLgogICAgICAgICAgICAiIiIpLnN0cmlwKCkucmVwbGFjZSgnXG4nLCAnICcpCgogICAgICAgIHdhcm5pbmdzLndhcm4odG1wbC5mb3JtYXQoKip2YXJzKHNlbGYpKSwgUEVQNDQwV2FybmluZykKCiAgICBAcHJvcGVydHkKICAgIGRlZiB2ZXJzaW9uKHNlbGYpOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3ZlcnNpb24KICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIHZlcnNpb24gPSBzZWxmLl9nZXRfdmVyc2lvbigpCiAgICAgICAgICAgIGlmIHZlcnNpb24gaXMgTm9uZToKICAgICAgICAgICAgICAgIHBhdGggPSBzZWxmLl9nZXRfbWV0YWRhdGFfcGF0aF9mb3JfZGlzcGxheShzZWxmLlBLR19JTkZPKQogICAgICAgICAgICAgICAgbXNnID0gKAogICAgICAgICAgICAgICAgICAgICJNaXNzaW5nICdWZXJzaW9uOicgaGVhZGVyIGFuZC9vciB7fSBmaWxlIGF0IHBhdGg6IHt9IgogICAgICAgICAgICAgICAgKS5mb3JtYXQoc2VsZi5QS0dfSU5GTywgcGF0aCkKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IobXNnLCBzZWxmKQoKICAgICAgICAgICAgcmV0dXJuIHZlcnNpb24KCiAgICBAcHJvcGVydHkKICAgIGRlZiBfZGVwX21hcChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBBIG1hcCBvZiBleHRyYSB0byBpdHMgbGlzdCBvZiAoZGlyZWN0KSByZXF1aXJlbWVudHMKICAgICAgICBmb3IgdGhpcyBkaXN0cmlidXRpb24sIGluY2x1ZGluZyB0aGUgbnVsbCBleHRyYS4KICAgICAgICAiIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9fZGVwX21hcAogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgc2VsZi5fX2RlcF9tYXAgPSBzZWxmLl9maWx0ZXJfZXh0cmFzKHNlbGYuX2J1aWxkX2RlcF9tYXAoKSkKICAgICAgICByZXR1cm4gc2VsZi5fX2RlcF9tYXAKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX2ZpbHRlcl9leHRyYXMoZG0pOgogICAgICAgICIiIgogICAgICAgIEdpdmVuIGEgbWFwcGluZyBvZiBleHRyYXMgdG8gZGVwZW5kZW5jaWVzLCBzdHJpcCBvZmYKICAgICAgICBlbnZpcm9ubWVudCBtYXJrZXJzIGFuZCBmaWx0ZXIgb3V0IGFueSBkZXBlbmRlbmNpZXMKICAgICAgICBub3QgbWF0Y2hpbmcgdGhlIG1hcmtlcnMuCiAgICAgICAgIiIiCiAgICAgICAgZm9yIGV4dHJhIGluIGxpc3QoZmlsdGVyKE5vbmUsIGRtKSk6CiAgICAgICAgICAgIG5ld19leHRyYSA9IGV4dHJhCiAgICAgICAgICAgIHJlcXMgPSBkbS5wb3AoZXh0cmEpCiAgICAgICAgICAgIG5ld19leHRyYSwgXywgbWFya2VyID0gZXh0cmEucGFydGl0aW9uKCc6JykKICAgICAgICAgICAgZmFpbHNfbWFya2VyID0gbWFya2VyIGFuZCAoCiAgICAgICAgICAgICAgICBpbnZhbGlkX21hcmtlcihtYXJrZXIpCiAgICAgICAgICAgICAgICBvciBub3QgZXZhbHVhdGVfbWFya2VyKG1hcmtlcikKICAgICAgICAgICAgKQogICAgICAgICAgICBpZiBmYWlsc19tYXJrZXI6CiAgICAgICAgICAgICAgICByZXFzID0gW10KICAgICAgICAgICAgbmV3X2V4dHJhID0gc2FmZV9leHRyYShuZXdfZXh0cmEpIG9yIE5vbmUKCiAgICAgICAgICAgIGRtLnNldGRlZmF1bHQobmV3X2V4dHJhLCBbXSkuZXh0ZW5kKHJlcXMpCiAgICAgICAgcmV0dXJuIGRtCgogICAgZGVmIF9idWlsZF9kZXBfbWFwKHNlbGYpOgogICAgICAgIGRtID0ge30KICAgICAgICBmb3IgbmFtZSBpbiAncmVxdWlyZXMudHh0JywgJ2RlcGVuZHMudHh0JzoKICAgICAgICAgICAgZm9yIGV4dHJhLCByZXFzIGluIHNwbGl0X3NlY3Rpb25zKHNlbGYuX2dldF9tZXRhZGF0YShuYW1lKSk6CiAgICAgICAgICAgICAgICBkbS5zZXRkZWZhdWx0KGV4dHJhLCBbXSkuZXh0ZW5kKHBhcnNlX3JlcXVpcmVtZW50cyhyZXFzKSkKICAgICAgICByZXR1cm4gZG0KCiAgICBkZWYgcmVxdWlyZXMoc2VsZiwgZXh0cmFzPSgpKToKICAgICAgICAiIiJMaXN0IG9mIFJlcXVpcmVtZW50cyBuZWVkZWQgZm9yIHRoaXMgZGlzdHJvIGlmIGBleHRyYXNgIGFyZSB1c2VkIiIiCiAgICAgICAgZG0gPSBzZWxmLl9kZXBfbWFwCiAgICAgICAgZGVwcyA9IFtdCiAgICAgICAgZGVwcy5leHRlbmQoZG0uZ2V0KE5vbmUsICgpKSkKICAgICAgICBmb3IgZXh0IGluIGV4dHJhczoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgZGVwcy5leHRlbmQoZG1bc2FmZV9leHRyYShleHQpXSkKICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICAgICAgcmFpc2UgVW5rbm93bkV4dHJhKAogICAgICAgICAgICAgICAgICAgICIlcyBoYXMgbm8gc3VjaCBleHRyYSBmZWF0dXJlICVyIiAlIChzZWxmLCBleHQpCiAgICAgICAgICAgICAgICApCiAgICAgICAgcmV0dXJuIGRlcHMKCiAgICBkZWYgX2dldF9tZXRhZGF0YV9wYXRoX2Zvcl9kaXNwbGF5KHNlbGYsIG5hbWUpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiB0aGUgcGF0aCB0byB0aGUgZ2l2ZW4gbWV0YWRhdGEgZmlsZSwgaWYgYXZhaWxhYmxlLgogICAgICAgICIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgIyBXZSBuZWVkIHRvIGFjY2VzcyBfZ2V0X21ldGFkYXRhX3BhdGgoKSBvbiB0aGUgcHJvdmlkZXIgb2JqZWN0CiAgICAgICAgICAgICMgZGlyZWN0bHkgcmF0aGVyIHRoYW4gdGhyb3VnaCB0aGlzIGNsYXNzJ3MgX19nZXRhdHRyX18oKQogICAgICAgICAgICAjIHNpbmNlIF9nZXRfbWV0YWRhdGFfcGF0aCgpIGlzIG1hcmtlZCBwcml2YXRlLgogICAgICAgICAgICBwYXRoID0gc2VsZi5fcHJvdmlkZXIuX2dldF9tZXRhZGF0YV9wYXRoKG5hbWUpCgogICAgICAgICMgSGFuZGxlIGV4Y2VwdGlvbnMgZS5nLiBpbiBjYXNlIHRoZSBkaXN0cmlidXRpb24ncyBtZXRhZGF0YQogICAgICAgICMgcHJvdmlkZXIgZG9lc24ndCBzdXBwb3J0IF9nZXRfbWV0YWRhdGFfcGF0aCgpLgogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIHJldHVybiAnW2NvdWxkIG5vdCBkZXRlY3RdJwoKICAgICAgICByZXR1cm4gcGF0aAoKICAgIGRlZiBfZ2V0X21ldGFkYXRhKHNlbGYsIG5hbWUpOgogICAgICAgIGlmIHNlbGYuaGFzX21ldGFkYXRhKG5hbWUpOgogICAgICAgICAgICBmb3IgbGluZSBpbiBzZWxmLmdldF9tZXRhZGF0YV9saW5lcyhuYW1lKToKICAgICAgICAgICAgICAgIHlpZWxkIGxpbmUKCiAgICBkZWYgX2dldF92ZXJzaW9uKHNlbGYpOgogICAgICAgIGxpbmVzID0gc2VsZi5fZ2V0X21ldGFkYXRhKHNlbGYuUEtHX0lORk8pCiAgICAgICAgdmVyc2lvbiA9IF92ZXJzaW9uX2Zyb21fZmlsZShsaW5lcykKCiAgICAgICAgcmV0dXJuIHZlcnNpb24KCiAgICBkZWYgYWN0aXZhdGUoc2VsZiwgcGF0aD1Ob25lLCByZXBsYWNlPUZhbHNlKToKICAgICAgICAiIiJFbnN1cmUgZGlzdHJpYnV0aW9uIGlzIGltcG9ydGFibGUgb24gYHBhdGhgIChkZWZhdWx0PXN5cy5wYXRoKSIiIgogICAgICAgIGlmIHBhdGggaXMgTm9uZToKICAgICAgICAgICAgcGF0aCA9IHN5cy5wYXRoCiAgICAgICAgc2VsZi5pbnNlcnRfb24ocGF0aCwgcmVwbGFjZT1yZXBsYWNlKQogICAgICAgIGlmIHBhdGggaXMgc3lzLnBhdGg6CiAgICAgICAgICAgIGZpeHVwX25hbWVzcGFjZV9wYWNrYWdlcyhzZWxmLmxvY2F0aW9uKQogICAgICAgICAgICBmb3IgcGtnIGluIHNlbGYuX2dldF9tZXRhZGF0YSgnbmFtZXNwYWNlX3BhY2thZ2VzLnR4dCcpOgogICAgICAgICAgICAgICAgaWYgcGtnIGluIHN5cy5tb2R1bGVzOgogICAgICAgICAgICAgICAgICAgIGRlY2xhcmVfbmFtZXNwYWNlKHBrZykKCiAgICBkZWYgZWdnX25hbWUoc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIHdoYXQgdGhpcyBkaXN0cmlidXRpb24ncyBzdGFuZGFyZCAuZWdnIGZpbGVuYW1lIHNob3VsZCBiZSIiIgogICAgICAgIGZpbGVuYW1lID0gIiVzLSVzLXB5JXMiICUgKAogICAgICAgICAgICB0b19maWxlbmFtZShzZWxmLnByb2plY3RfbmFtZSksIHRvX2ZpbGVuYW1lKHNlbGYudmVyc2lvbiksCiAgICAgICAgICAgIHNlbGYucHlfdmVyc2lvbiBvciBQWV9NQUpPUgogICAgICAgICkKCiAgICAgICAgaWYgc2VsZi5wbGF0Zm9ybToKICAgICAgICAgICAgZmlsZW5hbWUgKz0gJy0nICsgc2VsZi5wbGF0Zm9ybQogICAgICAgIHJldHVybiBmaWxlbmFtZQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICBpZiBzZWxmLmxvY2F0aW9uOgogICAgICAgICAgICByZXR1cm4gIiVzICglcykiICUgKHNlbGYsIHNlbGYubG9jYXRpb24pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHN0cihzZWxmKQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHRyeToKICAgICAgICAgICAgdmVyc2lvbiA9IGdldGF0dHIoc2VsZiwgJ3ZlcnNpb24nLCBOb25lKQogICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICB2ZXJzaW9uID0gTm9uZQogICAgICAgIHZlcnNpb24gPSB2ZXJzaW9uIG9yICJbdW5rbm93biB2ZXJzaW9uXSIKICAgICAgICByZXR1cm4gIiVzICVzIiAlIChzZWxmLnByb2plY3RfbmFtZSwgdmVyc2lvbikKCiAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgYXR0cik6CiAgICAgICAgIiIiRGVsZWdhdGUgYWxsIHVucmVjb2duaXplZCBwdWJsaWMgYXR0cmlidXRlcyB0byAubWV0YWRhdGEgcHJvdmlkZXIiIiIKICAgICAgICBpZiBhdHRyLnN0YXJ0c3dpdGgoJ18nKToKICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IoYXR0cikKICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLl9wcm92aWRlciwgYXR0cikKCiAgICBkZWYgX19kaXJfXyhzZWxmKToKICAgICAgICByZXR1cm4gbGlzdCgKICAgICAgICAgICAgc2V0KHN1cGVyKERpc3RyaWJ1dGlvbiwgc2VsZikuX19kaXJfXygpKQogICAgICAgICAgICB8IHNldCgKICAgICAgICAgICAgICAgIGF0dHIgZm9yIGF0dHIgaW4gc2VsZi5fcHJvdmlkZXIuX19kaXJfXygpCiAgICAgICAgICAgICAgICBpZiBub3QgYXR0ci5zdGFydHN3aXRoKCdfJykKICAgICAgICAgICAgKQogICAgICAgICkKCiAgICBpZiBub3QgaGFzYXR0cihvYmplY3QsICdfX2Rpcl9fJyk6CiAgICAgICAgIyBweXRob24gMi43IG5vdCBzdXBwb3J0ZWQKICAgICAgICBkZWwgX19kaXJfXwoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGZyb21fZmlsZW5hbWUoY2xzLCBmaWxlbmFtZSwgbWV0YWRhdGE9Tm9uZSwgKiprdyk6CiAgICAgICAgcmV0dXJuIGNscy5mcm9tX2xvY2F0aW9uKAogICAgICAgICAgICBfbm9ybWFsaXplX2NhY2hlZChmaWxlbmFtZSksIG9zLnBhdGguYmFzZW5hbWUoZmlsZW5hbWUpLCBtZXRhZGF0YSwKICAgICAgICAgICAgKiprdwogICAgICAgICkKCiAgICBkZWYgYXNfcmVxdWlyZW1lbnQoc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIGEgYGBSZXF1aXJlbWVudGBgIHRoYXQgbWF0Y2hlcyB0aGlzIGRpc3RyaWJ1dGlvbiBleGFjdGx5IiIiCiAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLnBhcnNlZF92ZXJzaW9uLCBwYWNrYWdpbmcudmVyc2lvbi5WZXJzaW9uKToKICAgICAgICAgICAgc3BlYyA9ICIlcz09JXMiICUgKHNlbGYucHJvamVjdF9uYW1lLCBzZWxmLnBhcnNlZF92ZXJzaW9uKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNwZWMgPSAiJXM9PT0lcyIgJSAoc2VsZi5wcm9qZWN0X25hbWUsIHNlbGYucGFyc2VkX3ZlcnNpb24pCgogICAgICAgIHJldHVybiBSZXF1aXJlbWVudC5wYXJzZShzcGVjKQoKICAgIGRlZiBsb2FkX2VudHJ5X3BvaW50KHNlbGYsIGdyb3VwLCBuYW1lKToKICAgICAgICAiIiJSZXR1cm4gdGhlIGBuYW1lYCBlbnRyeSBwb2ludCBvZiBgZ3JvdXBgIG9yIHJhaXNlIEltcG9ydEVycm9yIiIiCiAgICAgICAgZXAgPSBzZWxmLmdldF9lbnRyeV9pbmZvKGdyb3VwLCBuYW1lKQogICAgICAgIGlmIGVwIGlzIE5vbmU6CiAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yKCJFbnRyeSBwb2ludCAlciBub3QgZm91bmQiICUgKChncm91cCwgbmFtZSksKSkKICAgICAgICByZXR1cm4gZXAubG9hZCgpCgogICAgZGVmIGdldF9lbnRyeV9tYXAoc2VsZiwgZ3JvdXA9Tm9uZSk6CiAgICAgICAgIiIiUmV0dXJuIHRoZSBlbnRyeSBwb2ludCBtYXAgZm9yIGBncm91cGAsIG9yIHRoZSBmdWxsIGVudHJ5IG1hcCIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgZXBfbWFwID0gc2VsZi5fZXBfbWFwCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICBlcF9tYXAgPSBzZWxmLl9lcF9tYXAgPSBFbnRyeVBvaW50LnBhcnNlX21hcCgKICAgICAgICAgICAgICAgIHNlbGYuX2dldF9tZXRhZGF0YSgnZW50cnlfcG9pbnRzLnR4dCcpLCBzZWxmCiAgICAgICAgICAgICkKICAgICAgICBpZiBncm91cCBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuIGVwX21hcC5nZXQoZ3JvdXAsIHt9KQogICAgICAgIHJldHVybiBlcF9tYXAKCiAgICBkZWYgZ2V0X2VudHJ5X2luZm8oc2VsZiwgZ3JvdXAsIG5hbWUpOgogICAgICAgICIiIlJldHVybiB0aGUgRW50cnlQb2ludCBvYmplY3QgZm9yIGBncm91cGArYG5hbWVgLCBvciBgYE5vbmVgYCIiIgogICAgICAgIHJldHVybiBzZWxmLmdldF9lbnRyeV9tYXAoZ3JvdXApLmdldChuYW1lKQoKICAgIGRlZiBpbnNlcnRfb24oc2VsZiwgcGF0aCwgbG9jPU5vbmUsIHJlcGxhY2U9RmFsc2UpOgogICAgICAgICIiIkVuc3VyZSBzZWxmLmxvY2F0aW9uIGlzIG9uIHBhdGgKCiAgICAgICAgSWYgcmVwbGFjZT1GYWxzZSAoZGVmYXVsdCk6CiAgICAgICAgICAgIC0gSWYgbG9jYXRpb24gaXMgYWxyZWFkeSBpbiBwYXRoIGFueXdoZXJlLCBkbyBub3RoaW5nLgogICAgICAgICAgICAtIEVsc2U6CiAgICAgICAgICAgICAgLSBJZiBpdCdzIGFuIGVnZyBhbmQgaXRzIHBhcmVudCBkaXJlY3RvcnkgaXMgb24gcGF0aCwKICAgICAgICAgICAgICAgIGluc2VydCBqdXN0IGFoZWFkIG9mIHRoZSBwYXJlbnQuCiAgICAgICAgICAgICAgLSBFbHNlOiBhZGQgdG8gdGhlIGVuZCBvZiBwYXRoLgogICAgICAgIElmIHJlcGxhY2U9VHJ1ZToKICAgICAgICAgICAgLSBJZiBsb2NhdGlvbiBpcyBhbHJlYWR5IG9uIHBhdGggYW55d2hlcmUgKG5vdCBlZ2dzKQogICAgICAgICAgICAgIG9yIGhpZ2hlciBwcmlvcml0eSB0aGFuIGl0cyBwYXJlbnQgKGVnZ3MpCiAgICAgICAgICAgICAgZG8gbm90aGluZy4KICAgICAgICAgICAgLSBFbHNlOgogICAgICAgICAgICAgIC0gSWYgaXQncyBhbiBlZ2cgYW5kIGl0cyBwYXJlbnQgZGlyZWN0b3J5IGlzIG9uIHBhdGgsCiAgICAgICAgICAgICAgICBpbnNlcnQganVzdCBhaGVhZCBvZiB0aGUgcGFyZW50LAogICAgICAgICAgICAgICAgcmVtb3ZpbmcgYW55IGxvd2VyLXByaW9yaXR5IGVudHJpZXMuCiAgICAgICAgICAgICAgLSBFbHNlOiBhZGQgaXQgdG8gdGhlIGZyb250IG9mIHBhdGguCiAgICAgICAgIiIiCgogICAgICAgIGxvYyA9IGxvYyBvciBzZWxmLmxvY2F0aW9uCiAgICAgICAgaWYgbm90IGxvYzoKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIG5sb2MgPSBfbm9ybWFsaXplX2NhY2hlZChsb2MpCiAgICAgICAgYmRpciA9IG9zLnBhdGguZGlybmFtZShubG9jKQogICAgICAgIG5wYXRoID0gWyhwIGFuZCBfbm9ybWFsaXplX2NhY2hlZChwKSBvciBwKSBmb3IgcCBpbiBwYXRoXQoKICAgICAgICBmb3IgcCwgaXRlbSBpbiBlbnVtZXJhdGUobnBhdGgpOgogICAgICAgICAgICBpZiBpdGVtID09IG5sb2M6CiAgICAgICAgICAgICAgICBpZiByZXBsYWNlOgogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICMgZG9uJ3QgbW9kaWZ5IHBhdGggKGV2ZW4gcmVtb3ZpbmcgZHVwbGljYXRlcykgaWYKICAgICAgICAgICAgICAgICAgICAjIGZvdW5kIGFuZCBub3QgcmVwbGFjZQogICAgICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICBlbGlmIGl0ZW0gPT0gYmRpciBhbmQgc2VsZi5wcmVjZWRlbmNlID09IEVHR19ESVNUOgogICAgICAgICAgICAgICAgIyBpZiBpdCdzIGFuIC5lZ2csIGdpdmUgaXQgcHJlY2VkZW5jZSBvdmVyIGl0cyBkaXJlY3RvcnkKICAgICAgICAgICAgICAgICMgVU5MRVNTIGl0J3MgYWxyZWFkeSBiZWVuIGFkZGVkIHRvIHN5cy5wYXRoIGFuZCByZXBsYWNlPUZhbHNlCiAgICAgICAgICAgICAgICBpZiAobm90IHJlcGxhY2UpIGFuZCBubG9jIGluIG5wYXRoW3A6XToKICAgICAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgICAgIGlmIHBhdGggaXMgc3lzLnBhdGg6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5jaGVja192ZXJzaW9uX2NvbmZsaWN0KCkKICAgICAgICAgICAgICAgIHBhdGguaW5zZXJ0KHAsIGxvYykKICAgICAgICAgICAgICAgIG5wYXRoLmluc2VydChwLCBubG9jKQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICBlbHNlOgogICAgICAgICAgICBpZiBwYXRoIGlzIHN5cy5wYXRoOgogICAgICAgICAgICAgICAgc2VsZi5jaGVja192ZXJzaW9uX2NvbmZsaWN0KCkKICAgICAgICAgICAgaWYgcmVwbGFjZToKICAgICAgICAgICAgICAgIHBhdGguaW5zZXJ0KDAsIGxvYykKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHBhdGguYXBwZW5kKGxvYykKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICMgcCBpcyB0aGUgc3BvdCB3aGVyZSB3ZSBmb3VuZCBvciBpbnNlcnRlZCBsb2M7IG5vdyByZW1vdmUgZHVwbGljYXRlcwogICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIG5wID0gbnBhdGguaW5kZXgobmxvYywgcCArIDEpCiAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGRlbCBucGF0aFtucF0sIHBhdGhbbnBdCiAgICAgICAgICAgICAgICAjIGhhIQogICAgICAgICAgICAgICAgcCA9IG5wCgogICAgICAgIHJldHVybgoKICAgIGRlZiBjaGVja192ZXJzaW9uX2NvbmZsaWN0KHNlbGYpOgogICAgICAgIGlmIHNlbGYua2V5ID09ICdzZXR1cHRvb2xzJzoKICAgICAgICAgICAgIyBpZ25vcmUgdGhlIGluZXZpdGFibGUgc2V0dXB0b29scyBzZWxmLWNvbmZsaWN0cyAgOigKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIG5zcCA9IGRpY3QuZnJvbWtleXMoc2VsZi5fZ2V0X21ldGFkYXRhKCduYW1lc3BhY2VfcGFja2FnZXMudHh0JykpCiAgICAgICAgbG9jID0gbm9ybWFsaXplX3BhdGgoc2VsZi5sb2NhdGlvbikKICAgICAgICBmb3IgbW9kbmFtZSBpbiBzZWxmLl9nZXRfbWV0YWRhdGEoJ3RvcF9sZXZlbC50eHQnKToKICAgICAgICAgICAgaWYgKG1vZG5hbWUgbm90IGluIHN5cy5tb2R1bGVzIG9yIG1vZG5hbWUgaW4gbnNwCiAgICAgICAgICAgICAgICAgICAgb3IgbW9kbmFtZSBpbiBfbmFtZXNwYWNlX3BhY2thZ2VzKToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlmIG1vZG5hbWUgaW4gKCdwa2dfcmVzb3VyY2VzJywgJ3NldHVwdG9vbHMnLCAnc2l0ZScpOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgZm4gPSBnZXRhdHRyKHN5cy5tb2R1bGVzW21vZG5hbWVdLCAnX19maWxlX18nLCBOb25lKQogICAgICAgICAgICBpZiBmbiBhbmQgKG5vcm1hbGl6ZV9wYXRoKGZuKS5zdGFydHN3aXRoKGxvYykgb3IKICAgICAgICAgICAgICAgICAgICAgICBmbi5zdGFydHN3aXRoKHNlbGYubG9jYXRpb24pKToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlzc3VlX3dhcm5pbmcoCiAgICAgICAgICAgICAgICAiTW9kdWxlICVzIHdhcyBhbHJlYWR5IGltcG9ydGVkIGZyb20gJXMsIGJ1dCAlcyBpcyBiZWluZyBhZGRlZCIKICAgICAgICAgICAgICAgICIgdG8gc3lzLnBhdGgiICUgKG1vZG5hbWUsIGZuLCBzZWxmLmxvY2F0aW9uKSwKICAgICAgICAgICAgKQoKICAgIGRlZiBoYXNfdmVyc2lvbihzZWxmKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYudmVyc2lvbgogICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICBpc3N1ZV93YXJuaW5nKCJVbmJ1aWx0IGVnZyBmb3IgIiArIHJlcHIoc2VsZikpCiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGNsb25lKHNlbGYsICoqa3cpOgogICAgICAgICIiIkNvcHkgdGhpcyBkaXN0cmlidXRpb24sIHN1YnN0aXR1dGluZyBpbiBhbnkgY2hhbmdlZCBrZXl3b3JkIGFyZ3MiIiIKICAgICAgICBuYW1lcyA9ICdwcm9qZWN0X25hbWUgdmVyc2lvbiBweV92ZXJzaW9uIHBsYXRmb3JtIGxvY2F0aW9uIHByZWNlZGVuY2UnCiAgICAgICAgZm9yIGF0dHIgaW4gbmFtZXMuc3BsaXQoKToKICAgICAgICAgICAga3cuc2V0ZGVmYXVsdChhdHRyLCBnZXRhdHRyKHNlbGYsIGF0dHIsIE5vbmUpKQogICAgICAgIGt3LnNldGRlZmF1bHQoJ21ldGFkYXRhJywgc2VsZi5fcHJvdmlkZXIpCiAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKCoqa3cpCgogICAgQHByb3BlcnR5CiAgICBkZWYgZXh0cmFzKHNlbGYpOgogICAgICAgIHJldHVybiBbZGVwIGZvciBkZXAgaW4gc2VsZi5fZGVwX21hcCBpZiBkZXBdCgoKY2xhc3MgRWdnSW5mb0Rpc3RyaWJ1dGlvbihEaXN0cmlidXRpb24pOgogICAgZGVmIF9yZWxvYWRfdmVyc2lvbihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBQYWNrYWdlcyBpbnN0YWxsZWQgYnkgZGlzdHV0aWxzIChlLmcuIG51bXB5IG9yIHNjaXB5KSwKICAgICAgICB3aGljaCB1c2VzIGFuIG9sZCBzYWZlX3ZlcnNpb24sIGFuZCBzbwogICAgICAgIHRoZWlyIHZlcnNpb24gbnVtYmVycyBjYW4gZ2V0IG1hbmdsZWQgd2hlbgogICAgICAgIGNvbnZlcnRlZCB0byBmaWxlbmFtZXMgKGUuZy4sIDEuMTEuMC5kZXYwKzIzMjllYWUgdG8KICAgICAgICAxLjExLjAuZGV2MF8yMzI5ZWFlKS4gVGhlc2UgZGlzdHJpYnV0aW9ucyB3aWxsIG5vdCBiZQogICAgICAgIHBhcnNlZCBwcm9wZXJseQogICAgICAgIGRvd25zdHJlYW0gYnkgRGlzdHJpYnV0aW9uIGFuZCBzYWZlX3ZlcnNpb24sIHNvCiAgICAgICAgdGFrZSBhbiBleHRyYSBzdGVwIGFuZCB0cnkgdG8gZ2V0IHRoZSB2ZXJzaW9uIG51bWJlciBmcm9tCiAgICAgICAgdGhlIG1ldGFkYXRhIGZpbGUgaXRzZWxmIGluc3RlYWQgb2YgdGhlIGZpbGVuYW1lLgogICAgICAgICIiIgogICAgICAgIG1kX3ZlcnNpb24gPSBzZWxmLl9nZXRfdmVyc2lvbigpCiAgICAgICAgaWYgbWRfdmVyc2lvbjoKICAgICAgICAgICAgc2VsZi5fdmVyc2lvbiA9IG1kX3ZlcnNpb24KICAgICAgICByZXR1cm4gc2VsZgoKCmNsYXNzIERpc3RJbmZvRGlzdHJpYnV0aW9uKERpc3RyaWJ1dGlvbik6CiAgICAiIiIKICAgIFdyYXAgYW4gYWN0dWFsIG9yIHBvdGVudGlhbCBzeXMucGF0aCBlbnRyeQogICAgdy9tZXRhZGF0YSwgLmRpc3QtaW5mbyBzdHlsZS4KICAgICIiIgogICAgUEtHX0lORk8gPSAnTUVUQURBVEEnCiAgICBFUUVRID0gcmUuY29tcGlsZShyIihbXCgsXSlccyooXGQuKj8pXHMqKFssXCldKSIpCgogICAgQHByb3BlcnR5CiAgICBkZWYgX3BhcnNlZF9wa2dfaW5mbyhzZWxmKToKICAgICAgICAiIiJQYXJzZSBhbmQgY2FjaGUgbWV0YWRhdGEiIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9wa2dfaW5mbwogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgbWV0YWRhdGEgPSBzZWxmLmdldF9tZXRhZGF0YShzZWxmLlBLR19JTkZPKQogICAgICAgICAgICBzZWxmLl9wa2dfaW5mbyA9IGVtYWlsLnBhcnNlci5QYXJzZXIoKS5wYXJzZXN0cihtZXRhZGF0YSkKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3BrZ19pbmZvCgogICAgQHByb3BlcnR5CiAgICBkZWYgX2RlcF9tYXAoc2VsZik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc2VsZi5fX2RlcF9tYXAKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIHNlbGYuX19kZXBfbWFwID0gc2VsZi5fY29tcHV0ZV9kZXBlbmRlbmNpZXMoKQogICAgICAgICAgICByZXR1cm4gc2VsZi5fX2RlcF9tYXAKCiAgICBkZWYgX2NvbXB1dGVfZGVwZW5kZW5jaWVzKHNlbGYpOgogICAgICAgICIiIlJlY29tcHV0ZSB0aGlzIGRpc3RyaWJ1dGlvbidzIGRlcGVuZGVuY2llcy4iIiIKICAgICAgICBkbSA9IHNlbGYuX19kZXBfbWFwID0ge05vbmU6IFtdfQoKICAgICAgICByZXFzID0gW10KICAgICAgICAjIEluY2x1ZGluZyBhbnkgY29uZGl0aW9uIGV4cHJlc3Npb25zCiAgICAgICAgZm9yIHJlcSBpbiBzZWxmLl9wYXJzZWRfcGtnX2luZm8uZ2V0X2FsbCgnUmVxdWlyZXMtRGlzdCcpIG9yIFtdOgogICAgICAgICAgICByZXFzLmV4dGVuZChwYXJzZV9yZXF1aXJlbWVudHMocmVxKSkKCiAgICAgICAgZGVmIHJlcXNfZm9yX2V4dHJhKGV4dHJhKToKICAgICAgICAgICAgZm9yIHJlcSBpbiByZXFzOgogICAgICAgICAgICAgICAgaWYgbm90IHJlcS5tYXJrZXIgb3IgcmVxLm1hcmtlci5ldmFsdWF0ZSh7J2V4dHJhJzogZXh0cmF9KToKICAgICAgICAgICAgICAgICAgICB5aWVsZCByZXEKCiAgICAgICAgY29tbW9uID0gZnJvemVuc2V0KHJlcXNfZm9yX2V4dHJhKE5vbmUpKQogICAgICAgIGRtW05vbmVdLmV4dGVuZChjb21tb24pCgogICAgICAgIGZvciBleHRyYSBpbiBzZWxmLl9wYXJzZWRfcGtnX2luZm8uZ2V0X2FsbCgnUHJvdmlkZXMtRXh0cmEnKSBvciBbXToKICAgICAgICAgICAgc19leHRyYSA9IHNhZmVfZXh0cmEoZXh0cmEuc3RyaXAoKSkKICAgICAgICAgICAgZG1bc19leHRyYV0gPSBsaXN0KGZyb3plbnNldChyZXFzX2Zvcl9leHRyYShleHRyYSkpIC0gY29tbW9uKQoKICAgICAgICByZXR1cm4gZG0KCgpfZGlzdHJpYnV0aW9uSW1wbCA9IHsKICAgICcuZWdnJzogRGlzdHJpYnV0aW9uLAogICAgJy5lZ2ctaW5mbyc6IEVnZ0luZm9EaXN0cmlidXRpb24sCiAgICAnLmRpc3QtaW5mbyc6IERpc3RJbmZvRGlzdHJpYnV0aW9uLAp9CgoKZGVmIGlzc3VlX3dhcm5pbmcoKmFyZ3MsICoqa3cpOgogICAgbGV2ZWwgPSAxCiAgICBnID0gZ2xvYmFscygpCiAgICB0cnk6CiAgICAgICAgIyBmaW5kIHRoZSBmaXJzdCBzdGFjayBmcmFtZSB0aGF0IGlzICpub3QqIGNvZGUgaW4KICAgICAgICAjIHRoZSBwa2dfcmVzb3VyY2VzIG1vZHVsZSwgdG8gdXNlIGZvciB0aGUgd2FybmluZwogICAgICAgIHdoaWxlIHN5cy5fZ2V0ZnJhbWUobGV2ZWwpLmZfZ2xvYmFscyBpcyBnOgogICAgICAgICAgICBsZXZlbCArPSAxCiAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICBwYXNzCiAgICB3YXJuaW5ncy53YXJuKHN0YWNrbGV2ZWw9bGV2ZWwgKyAxLCAqYXJncywgKiprdykKCgpjbGFzcyBSZXF1aXJlbWVudFBhcnNlRXJyb3IoVmFsdWVFcnJvcik6CiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gJyAnLmpvaW4oc2VsZi5hcmdzKQoKCmRlZiBwYXJzZV9yZXF1aXJlbWVudHMoc3Rycyk6CiAgICAiIiJZaWVsZCBgYFJlcXVpcmVtZW50YGAgb2JqZWN0cyBmb3IgZWFjaCBzcGVjaWZpY2F0aW9uIGluIGBzdHJzYAoKICAgIGBzdHJzYCBtdXN0IGJlIGEgc3RyaW5nLCBvciBhIChwb3NzaWJseS1uZXN0ZWQpIGl0ZXJhYmxlIHRoZXJlb2YuCiAgICAiIiIKICAgICMgY3JlYXRlIGEgc3RlcHBhYmxlIGl0ZXJhdG9yLCBzbyB3ZSBjYW4gaGFuZGxlIFwtY29udGludWF0aW9ucwogICAgbGluZXMgPSBpdGVyKHlpZWxkX2xpbmVzKHN0cnMpKQoKICAgIGZvciBsaW5lIGluIGxpbmVzOgogICAgICAgICMgRHJvcCBjb21tZW50cyAtLSBhIGhhc2ggd2l0aG91dCBhIHNwYWNlIG1heSBiZSBpbiBhIFVSTC4KICAgICAgICBpZiAnICMnIGluIGxpbmU6CiAgICAgICAgICAgIGxpbmUgPSBsaW5lWzpsaW5lLmZpbmQoJyAjJyldCiAgICAgICAgIyBJZiB0aGVyZSBpcyBhIGxpbmUgY29udGludWF0aW9uLCBkcm9wIGl0LCBhbmQgYXBwZW5kIHRoZSBuZXh0IGxpbmUuCiAgICAgICAgaWYgbGluZS5lbmRzd2l0aCgnXFwnKToKICAgICAgICAgICAgbGluZSA9IGxpbmVbOi0yXS5zdHJpcCgpCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGxpbmUgKz0gbmV4dChsaW5lcykKICAgICAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICB5aWVsZCBSZXF1aXJlbWVudChsaW5lKQoKCmNsYXNzIFJlcXVpcmVtZW50KHBhY2thZ2luZy5yZXF1aXJlbWVudHMuUmVxdWlyZW1lbnQpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHJlcXVpcmVtZW50X3N0cmluZyk6CiAgICAgICAgIiIiRE8gTk9UIENBTEwgVEhJUyBVTkRPQ1VNRU5URUQgTUVUSE9EOyB1c2UgUmVxdWlyZW1lbnQucGFyc2UoKSEiIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIHN1cGVyKFJlcXVpcmVtZW50LCBzZWxmKS5fX2luaXRfXyhyZXF1aXJlbWVudF9zdHJpbmcpCiAgICAgICAgZXhjZXB0IHBhY2thZ2luZy5yZXF1aXJlbWVudHMuSW52YWxpZFJlcXVpcmVtZW50IGFzIGU6CiAgICAgICAgICAgIHJhaXNlIFJlcXVpcmVtZW50UGFyc2VFcnJvcihzdHIoZSkpCiAgICAgICAgc2VsZi51bnNhZmVfbmFtZSA9IHNlbGYubmFtZQogICAgICAgIHByb2plY3RfbmFtZSA9IHNhZmVfbmFtZShzZWxmLm5hbWUpCiAgICAgICAgc2VsZi5wcm9qZWN0X25hbWUsIHNlbGYua2V5ID0gcHJvamVjdF9uYW1lLCBwcm9qZWN0X25hbWUubG93ZXIoKQogICAgICAgIHNlbGYuc3BlY3MgPSBbCiAgICAgICAgICAgIChzcGVjLm9wZXJhdG9yLCBzcGVjLnZlcnNpb24pIGZvciBzcGVjIGluIHNlbGYuc3BlY2lmaWVyXQogICAgICAgIHNlbGYuZXh0cmFzID0gdHVwbGUobWFwKHNhZmVfZXh0cmEsIHNlbGYuZXh0cmFzKSkKICAgICAgICBzZWxmLmhhc2hDbXAgPSAoCiAgICAgICAgICAgIHNlbGYua2V5LAogICAgICAgICAgICBzZWxmLnVybCwKICAgICAgICAgICAgc2VsZi5zcGVjaWZpZXIsCiAgICAgICAgICAgIGZyb3plbnNldChzZWxmLmV4dHJhcyksCiAgICAgICAgICAgIHN0cihzZWxmLm1hcmtlcikgaWYgc2VsZi5tYXJrZXIgZWxzZSBOb25lLAogICAgICAgICkKICAgICAgICBzZWxmLl9faGFzaCA9IGhhc2goc2VsZi5oYXNoQ21wKQoKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiAoCiAgICAgICAgICAgIGlzaW5zdGFuY2Uob3RoZXIsIFJlcXVpcmVtZW50KSBhbmQKICAgICAgICAgICAgc2VsZi5oYXNoQ21wID09IG90aGVyLmhhc2hDbXAKICAgICAgICApCgogICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIG5vdCBzZWxmID09IG90aGVyCgogICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBpdGVtKToKICAgICAgICBpZiBpc2luc3RhbmNlKGl0ZW0sIERpc3RyaWJ1dGlvbik6CiAgICAgICAgICAgIGlmIGl0ZW0ua2V5ICE9IHNlbGYua2V5OgogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgICAgICBpdGVtID0gaXRlbS52ZXJzaW9uCgogICAgICAgICMgQWxsb3cgcHJlcmVsZWFzZXMgYWx3YXlzIGluIG9yZGVyIHRvIG1hdGNoIHRoZSBwcmV2aW91cyBiZWhhdmlvciBvZgogICAgICAgICMgdGhpcyBtZXRob2QuIEluIHRoZSBmdXR1cmUgdGhpcyBzaG91bGQgYmUgc21hcnRlciBhbmQgZm9sbG93IFBFUCA0NDAKICAgICAgICAjIG1vcmUgYWNjdXJhdGVseS4KICAgICAgICByZXR1cm4gc2VsZi5zcGVjaWZpZXIuY29udGFpbnMoaXRlbSwgcHJlcmVsZWFzZXM9VHJ1ZSkKCiAgICBkZWYgX19oYXNoX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX19oYXNoCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiUmVxdWlyZW1lbnQucGFyc2UoJXIpIiAlIHN0cihzZWxmKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBwYXJzZShzKToKICAgICAgICByZXEsID0gcGFyc2VfcmVxdWlyZW1lbnRzKHMpCiAgICAgICAgcmV0dXJuIHJlcQoKCmRlZiBfYWx3YXlzX29iamVjdChjbGFzc2VzKToKICAgICIiIgogICAgRW5zdXJlIG9iamVjdCBhcHBlYXJzIGluIHRoZSBtcm8gZXZlbgogICAgZm9yIG9sZC1zdHlsZSBjbGFzc2VzLgogICAgIiIiCiAgICBpZiBvYmplY3Qgbm90IGluIGNsYXNzZXM6CiAgICAgICAgcmV0dXJuIGNsYXNzZXMgKyAob2JqZWN0LCkKICAgIHJldHVybiBjbGFzc2VzCgoKZGVmIF9maW5kX2FkYXB0ZXIocmVnaXN0cnksIG9iKToKICAgICIiIlJldHVybiBhbiBhZGFwdGVyIGZhY3RvcnkgZm9yIGBvYmAgZnJvbSBgcmVnaXN0cnlgIiIiCiAgICB0eXBlcyA9IF9hbHdheXNfb2JqZWN0KGluc3BlY3QuZ2V0bXJvKGdldGF0dHIob2IsICdfX2NsYXNzX18nLCB0eXBlKG9iKSkpKQogICAgZm9yIHQgaW4gdHlwZXM6CiAgICAgICAgaWYgdCBpbiByZWdpc3RyeToKICAgICAgICAgICAgcmV0dXJuIHJlZ2lzdHJ5W3RdCgoKZGVmIGVuc3VyZV9kaXJlY3RvcnkocGF0aCk6CiAgICAiIiJFbnN1cmUgdGhhdCB0aGUgcGFyZW50IGRpcmVjdG9yeSBvZiBgcGF0aGAgZXhpc3RzIiIiCiAgICBkaXJuYW1lID0gb3MucGF0aC5kaXJuYW1lKHBhdGgpCiAgICBweTMxY29tcGF0Lm1ha2VkaXJzKGRpcm5hbWUsIGV4aXN0X29rPVRydWUpCgoKZGVmIF9ieXBhc3NfZW5zdXJlX2RpcmVjdG9yeShwYXRoKToKICAgICIiIlNhbmRib3gtYnlwYXNzaW5nIHZlcnNpb24gb2YgZW5zdXJlX2RpcmVjdG9yeSgpIiIiCiAgICBpZiBub3QgV1JJVEVfU1VQUE9SVDoKICAgICAgICByYWlzZSBJT0Vycm9yKCcib3MubWtkaXIiIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwbGF0Zm9ybS4nKQogICAgZGlybmFtZSwgZmlsZW5hbWUgPSBzcGxpdChwYXRoKQogICAgaWYgZGlybmFtZSBhbmQgZmlsZW5hbWUgYW5kIG5vdCBpc2RpcihkaXJuYW1lKToKICAgICAgICBfYnlwYXNzX2Vuc3VyZV9kaXJlY3RvcnkoZGlybmFtZSkKICAgICAgICB0cnk6CiAgICAgICAgICAgIG1rZGlyKGRpcm5hbWUsIDBvNzU1KQogICAgICAgIGV4Y2VwdCBGaWxlRXhpc3RzRXJyb3I6CiAgICAgICAgICAgIHBhc3MKCgpkZWYgc3BsaXRfc2VjdGlvbnMocyk6CiAgICAiIiJTcGxpdCBhIHN0cmluZyBvciBpdGVyYWJsZSB0aGVyZW9mIGludG8gKHNlY3Rpb24sIGNvbnRlbnQpIHBhaXJzCgogICAgRWFjaCBgYHNlY3Rpb25gYCBpcyBhIHN0cmlwcGVkIHZlcnNpb24gb2YgdGhlIHNlY3Rpb24gaGVhZGVyICgiW3NlY3Rpb25dIikKICAgIGFuZCBlYWNoIGBgY29udGVudGBgIGlzIGEgbGlzdCBvZiBzdHJpcHBlZCBsaW5lcyBleGNsdWRpbmcgYmxhbmsgbGluZXMgYW5kCiAgICBjb21tZW50LW9ubHkgbGluZXMuICBJZiB0aGVyZSBhcmUgYW55IHN1Y2ggbGluZXMgYmVmb3JlIHRoZSBmaXJzdCBzZWN0aW9uCiAgICBoZWFkZXIsIHRoZXkncmUgcmV0dXJuZWQgaW4gYSBmaXJzdCBgYHNlY3Rpb25gYCBvZiBgYE5vbmVgYC4KICAgICIiIgogICAgc2VjdGlvbiA9IE5vbmUKICAgIGNvbnRlbnQgPSBbXQogICAgZm9yIGxpbmUgaW4geWllbGRfbGluZXMocyk6CiAgICAgICAgaWYgbGluZS5zdGFydHN3aXRoKCJbIik6CiAgICAgICAgICAgIGlmIGxpbmUuZW5kc3dpdGgoIl0iKToKICAgICAgICAgICAgICAgIGlmIHNlY3Rpb24gb3IgY29udGVudDoKICAgICAgICAgICAgICAgICAgICB5aWVsZCBzZWN0aW9uLCBjb250ZW50CiAgICAgICAgICAgICAgICBzZWN0aW9uID0gbGluZVsxOi0xXS5zdHJpcCgpCiAgICAgICAgICAgICAgICBjb250ZW50ID0gW10KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkludmFsaWQgc2VjdGlvbiBoZWFkaW5nIiwgbGluZSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBjb250ZW50LmFwcGVuZChsaW5lKQoKICAgICMgd3JhcCB1cCBsYXN0IHNlZ21lbnQKICAgIHlpZWxkIHNlY3Rpb24sIGNvbnRlbnQKCgpkZWYgX21rc3RlbXAoKmFyZ3MsICoqa3cpOgogICAgb2xkX29wZW4gPSBvcy5vcGVuCiAgICB0cnk6CiAgICAgICAgIyB0ZW1wb3JhcmlseSBieXBhc3Mgc2FuZGJveGluZwogICAgICAgIG9zLm9wZW4gPSBvc19vcGVuCiAgICAgICAgcmV0dXJuIHRlbXBmaWxlLm1rc3RlbXAoKmFyZ3MsICoqa3cpCiAgICBmaW5hbGx5OgogICAgICAgICMgYW5kIHRoZW4gcHV0IGl0IGJhY2sKICAgICAgICBvcy5vcGVuID0gb2xkX29wZW4KCgojIFNpbGVuY2UgdGhlIFBFUDQ0MFdhcm5pbmcgYnkgZGVmYXVsdCwgc28gdGhhdCBlbmQgdXNlcnMgZG9uJ3QgZ2V0IGhpdCBieSBpdAojIHJhbmRvbWx5IGp1c3QgYmVjYXVzZSB0aGV5IHVzZSBwa2dfcmVzb3VyY2VzLiBXZSB3YW50IHRvIGFwcGVuZCB0aGUgcnVsZQojIGJlY2F1c2Ugd2Ugd2FudCBlYXJsaWVyIHVzZXMgb2YgZmlsdGVyd2FybmluZ3MgdG8gdGFrZSBwcmVjZWRlbmNlIG92ZXIgdGhpcwojIG9uZS4Kd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsIGNhdGVnb3J5PVBFUDQ0MFdhcm5pbmcsIGFwcGVuZD1UcnVlKQoKCiMgZnJvbSBqYXJhY28uZnVuY3Rvb2xzIDEuMwpkZWYgX2NhbGxfYXNpZGUoZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgIGYoKmFyZ3MsICoqa3dhcmdzKQogICAgcmV0dXJuIGYKCgpAX2NhbGxfYXNpZGUKZGVmIF9pbml0aWFsaXplKGc9Z2xvYmFscygpKToKICAgICJTZXQgdXAgZ2xvYmFsIHJlc291cmNlIG1hbmFnZXIgKGRlbGliZXJhdGVseSBub3Qgc3RhdGUtc2F2ZWQpIgogICAgbWFuYWdlciA9IFJlc291cmNlTWFuYWdlcigpCiAgICBnWydfbWFuYWdlciddID0gbWFuYWdlcgogICAgZy51cGRhdGUoCiAgICAgICAgKG5hbWUsIGdldGF0dHIobWFuYWdlciwgbmFtZSkpCiAgICAgICAgZm9yIG5hbWUgaW4gZGlyKG1hbmFnZXIpCiAgICAgICAgaWYgbm90IG5hbWUuc3RhcnRzd2l0aCgnXycpCiAgICApCgoKQF9jYWxsX2FzaWRlCmRlZiBfaW5pdGlhbGl6ZV9tYXN0ZXJfd29ya2luZ19zZXQoKToKICAgICIiIgogICAgUHJlcGFyZSB0aGUgbWFzdGVyIHdvcmtpbmcgc2V0IGFuZCBtYWtlIHRoZSBgYHJlcXVpcmUoKWBgCiAgICBBUEkgYXZhaWxhYmxlLgoKICAgIFRoaXMgZnVuY3Rpb24gaGFzIGV4cGxpY2l0IGVmZmVjdHMgb24gdGhlIGdsb2JhbCBzdGF0ZQogICAgb2YgcGtnX3Jlc291cmNlcy4gSXQgaXMgaW50ZW5kZWQgdG8gYmUgaW52b2tlZCBvbmNlIGF0CiAgICB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhpcyBtb2R1bGUuCgogICAgSW52b2NhdGlvbiBieSBvdGhlciBwYWNrYWdlcyBpcyB1bnN1cHBvcnRlZCBhbmQgZG9uZQogICAgYXQgdGhlaXIgb3duIHJpc2suCiAgICAiIiIKICAgIHdvcmtpbmdfc2V0ID0gV29ya2luZ1NldC5fYnVpbGRfbWFzdGVyKCkKICAgIF9kZWNsYXJlX3N0YXRlKCdvYmplY3QnLCB3b3JraW5nX3NldD13b3JraW5nX3NldCkKCiAgICByZXF1aXJlID0gd29ya2luZ19zZXQucmVxdWlyZQogICAgaXRlcl9lbnRyeV9wb2ludHMgPSB3b3JraW5nX3NldC5pdGVyX2VudHJ5X3BvaW50cwogICAgYWRkX2FjdGl2YXRpb25fbGlzdGVuZXIgPSB3b3JraW5nX3NldC5zdWJzY3JpYmUKICAgIHJ1bl9zY3JpcHQgPSB3b3JraW5nX3NldC5ydW5fc2NyaXB0CiAgICAjIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKICAgIHJ1bl9tYWluID0gcnVuX3NjcmlwdAogICAgIyBBY3RpdmF0ZSBhbGwgZGlzdHJpYnV0aW9ucyBhbHJlYWR5IG9uIHN5cy5wYXRoIHdpdGggcmVwbGFjZT1GYWxzZSBhbmQKICAgICMgZW5zdXJlIHRoYXQgYWxsIGRpc3RyaWJ1dGlvbnMgYWRkZWQgdG8gdGhlIHdvcmtpbmcgc2V0IGluIHRoZSBmdXR1cmUKICAgICMgKGUuZy4gYnkgY2FsbGluZyBgYHJlcXVpcmUoKWBgKSB3aWxsIGdldCBhY3RpdmF0ZWQgYXMgd2VsbCwKICAgICMgd2l0aCBoaWdoZXIgcHJpb3JpdHkgKHJlcGxhY2U9VHJ1ZSkuCiAgICB0dXBsZSgKICAgICAgICBkaXN0LmFjdGl2YXRlKHJlcGxhY2U9RmFsc2UpCiAgICAgICAgZm9yIGRpc3QgaW4gd29ya2luZ19zZXQKICAgICkKICAgIGFkZF9hY3RpdmF0aW9uX2xpc3RlbmVyKAogICAgICAgIGxhbWJkYSBkaXN0OiBkaXN0LmFjdGl2YXRlKHJlcGxhY2U9VHJ1ZSksCiAgICAgICAgZXhpc3Rpbmc9RmFsc2UsCiAgICApCiAgICB3b3JraW5nX3NldC5lbnRyaWVzID0gW10KICAgICMgbWF0Y2ggb3JkZXIKICAgIGxpc3QobWFwKHdvcmtpbmdfc2V0LmFkZF9lbnRyeSwgc3lzLnBhdGgpKQogICAgZ2xvYmFscygpLnVwZGF0ZShsb2NhbHMoKSkKCmNsYXNzIFBrZ1Jlc291cmNlc0RlcHJlY2F0aW9uV2FybmluZyhXYXJuaW5nKToKICAgICIiIgogICAgQmFzZSBjbGFzcyBmb3Igd2FybmluZyBhYm91dCBkZXByZWNhdGlvbnMgaW4gYGBwa2dfcmVzb3VyY2VzYGAKCiAgICBUaGlzIGNsYXNzIGlzIG5vdCBkZXJpdmVkIGZyb20gYGBEZXByZWNhdGlvbldhcm5pbmdgYCwgYW5kIGFzIHN1Y2ggaXMKICAgIHZpc2libGUgYnkgZGVmYXVsdC4KICAgICIiIgpQSwMEFAAAAAAAAAAhAAAAAAAAAAAAAAAAAEYAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvcGtnX3Jlc291cmNlcy9fdmVuZG9yL19faW5pdF9fLnB5UEsDBBQAAAAAAAAAIQCG82HUfWAAAH1gAABFAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3BrZ19yZXNvdXJjZXMvX3ZlbmRvci9hcHBkaXJzLnB5IyEvdXNyL2Jpbi9lbnYgcHl0aG9uCiMgLSotIGNvZGluZzogdXRmLTggLSotCiMgQ29weXJpZ2h0IChjKSAyMDA1LTIwMTAgQWN0aXZlU3RhdGUgU29mdHdhcmUgSW5jLgojIENvcHlyaWdodCAoYykgMjAxMyBFZGR5IFBldHJpyJlvcgoKIiIiVXRpbGl0aWVzIGZvciBkZXRlcm1pbmluZyBhcHBsaWNhdGlvbi1zcGVjaWZpYyBkaXJzLgoKU2VlIDxodHRwOi8vZ2l0aHViLmNvbS9BY3RpdmVTdGF0ZS9hcHBkaXJzPiBmb3IgZGV0YWlscyBhbmQgdXNhZ2UuCiIiIgojIERldiBOb3RlczoKIyAtIE1TRE4gb24gd2hlcmUgdG8gc3RvcmUgYXBwIGRhdGEgZmlsZXM6CiMgICBodHRwOi8vc3VwcG9ydC5taWNyb3NvZnQuY29tL2RlZmF1bHQuYXNweD9zY2lkPWtiO2VuLXVzOzMxMDI5NCNYU0xUSDMxOTQxMjExMjMxMjAxMjExMjAxMjAKIyAtIE1hYyBPUyBYOiBodHRwOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9kb2N1bWVudGF0aW9uL01hY09TWC9Db25jZXB0dWFsL0JQRmlsZVN5c3RlbS9pbmRleC5odG1sCiMgLSBYREcgc3BlYyBmb3IgVW4qeDogaHR0cDovL3N0YW5kYXJkcy5mcmVlZGVza3RvcC5vcmcvYmFzZWRpci1zcGVjL2Jhc2VkaXItc3BlYy1sYXRlc3QuaHRtbAoKX192ZXJzaW9uX2luZm9fXyA9ICgxLCA0LCAzKQpfX3ZlcnNpb25fXyA9ICcuJy5qb2luKG1hcChzdHIsIF9fdmVyc2lvbl9pbmZvX18pKQoKCmltcG9ydCBzeXMKaW1wb3J0IG9zCgpQWTMgPSBzeXMudmVyc2lvbl9pbmZvWzBdID09IDMKCmlmIFBZMzoKICAgIHVuaWNvZGUgPSBzdHIKCmlmIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdqYXZhJyk6CiAgICBpbXBvcnQgcGxhdGZvcm0KICAgIG9zX25hbWUgPSBwbGF0Zm9ybS5qYXZhX3ZlcigpWzNdWzBdCiAgICBpZiBvc19uYW1lLnN0YXJ0c3dpdGgoJ1dpbmRvd3MnKTogIyAiV2luZG93cyBYUCIsICJXaW5kb3dzIDciLCBldGMuCiAgICAgICAgc3lzdGVtID0gJ3dpbjMyJwogICAgZWxpZiBvc19uYW1lLnN0YXJ0c3dpdGgoJ01hYycpOiAjICJNYWMgT1MgWCIsIGV0Yy4KICAgICAgICBzeXN0ZW0gPSAnZGFyd2luJwogICAgZWxzZTogIyAiTGludXgiLCAiU3VuT1MiLCAiRnJlZUJTRCIsIGV0Yy4KICAgICAgICAjIFNldHRpbmcgdGhpcyB0byAibGludXgyIiBpcyBub3QgaWRlYWwsIGJ1dCBvbmx5IFdpbmRvd3Mgb3IgTWFjCiAgICAgICAgIyBhcmUgYWN0dWFsbHkgY2hlY2tlZCBmb3IgYW5kIHRoZSByZXN0IG9mIHRoZSBtb2R1bGUgZXhwZWN0cwogICAgICAgICMgKnN5cy5wbGF0Zm9ybSogc3R5bGUgc3RyaW5ncy4KICAgICAgICBzeXN0ZW0gPSAnbGludXgyJwplbHNlOgogICAgc3lzdGVtID0gc3lzLnBsYXRmb3JtCgoKCmRlZiB1c2VyX2RhdGFfZGlyKGFwcG5hbWU9Tm9uZSwgYXBwYXV0aG9yPU5vbmUsIHZlcnNpb249Tm9uZSwgcm9hbWluZz1GYWxzZSk6CiAgICByIiIiUmV0dXJuIGZ1bGwgcGF0aCB0byB0aGUgdXNlci1zcGVjaWZpYyBkYXRhIGRpciBmb3IgdGhpcyBhcHBsaWNhdGlvbi4KCiAgICAgICAgImFwcG5hbWUiIGlzIHRoZSBuYW1lIG9mIGFwcGxpY2F0aW9uLgogICAgICAgICAgICBJZiBOb25lLCBqdXN0IHRoZSBzeXN0ZW0gZGlyZWN0b3J5IGlzIHJldHVybmVkLgogICAgICAgICJhcHBhdXRob3IiIChvbmx5IHVzZWQgb24gV2luZG93cykgaXMgdGhlIG5hbWUgb2YgdGhlCiAgICAgICAgICAgIGFwcGF1dGhvciBvciBkaXN0cmlidXRpbmcgYm9keSBmb3IgdGhpcyBhcHBsaWNhdGlvbi4gVHlwaWNhbGx5CiAgICAgICAgICAgIGl0IGlzIHRoZSBvd25pbmcgY29tcGFueSBuYW1lLiBUaGlzIGZhbGxzIGJhY2sgdG8gYXBwbmFtZS4gWW91IG1heQogICAgICAgICAgICBwYXNzIEZhbHNlIHRvIGRpc2FibGUgaXQuCiAgICAgICAgInZlcnNpb24iIGlzIGFuIG9wdGlvbmFsIHZlcnNpb24gcGF0aCBlbGVtZW50IHRvIGFwcGVuZCB0byB0aGUKICAgICAgICAgICAgcGF0aC4gWW91IG1pZ2h0IHdhbnQgdG8gdXNlIHRoaXMgaWYgeW91IHdhbnQgbXVsdGlwbGUgdmVyc2lvbnMKICAgICAgICAgICAgb2YgeW91ciBhcHAgdG8gYmUgYWJsZSB0byBydW4gaW5kZXBlbmRlbnRseS4gSWYgdXNlZCwgdGhpcwogICAgICAgICAgICB3b3VsZCB0eXBpY2FsbHkgYmUgIjxtYWpvcj4uPG1pbm9yPiIuCiAgICAgICAgICAgIE9ubHkgYXBwbGllZCB3aGVuIGFwcG5hbWUgaXMgcHJlc2VudC4KICAgICAgICAicm9hbWluZyIgKGJvb2xlYW4sIGRlZmF1bHQgRmFsc2UpIGNhbiBiZSBzZXQgVHJ1ZSB0byB1c2UgdGhlIFdpbmRvd3MKICAgICAgICAgICAgcm9hbWluZyBhcHBkYXRhIGRpcmVjdG9yeS4gVGhhdCBtZWFucyB0aGF0IGZvciB1c2VycyBvbiBhIFdpbmRvd3MKICAgICAgICAgICAgbmV0d29yayBzZXR1cCBmb3Igcm9hbWluZyBwcm9maWxlcywgdGhpcyB1c2VyIGRhdGEgd2lsbCBiZQogICAgICAgICAgICBzeW5jJ2Qgb24gbG9naW4uIFNlZQogICAgICAgICAgICA8aHR0cDovL3RlY2huZXQubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2NjNzY2NDg5KFdTLjEwKS5hc3B4PgogICAgICAgICAgICBmb3IgYSBkaXNjdXNzaW9uIG9mIGlzc3Vlcy4KCiAgICBUeXBpY2FsIHVzZXIgZGF0YSBkaXJlY3RvcmllcyBhcmU6CiAgICAgICAgTWFjIE9TIFg6ICAgICAgICAgICAgICAgfi9MaWJyYXJ5L0FwcGxpY2F0aW9uIFN1cHBvcnQvPEFwcE5hbWU+CiAgICAgICAgVW5peDogICAgICAgICAgICAgICAgICAgfi8ubG9jYWwvc2hhcmUvPEFwcE5hbWU+ICAgICMgb3IgaW4gJFhER19EQVRBX0hPTUUsIGlmIGRlZmluZWQKICAgICAgICBXaW4gWFAgKG5vdCByb2FtaW5nKTogICBDOlxEb2N1bWVudHMgYW5kIFNldHRpbmdzXDx1c2VybmFtZT5cQXBwbGljYXRpb24gRGF0YVw8QXBwQXV0aG9yPlw8QXBwTmFtZT4KICAgICAgICBXaW4gWFAgKHJvYW1pbmcpOiAgICAgICBDOlxEb2N1bWVudHMgYW5kIFNldHRpbmdzXDx1c2VybmFtZT5cTG9jYWwgU2V0dGluZ3NcQXBwbGljYXRpb24gRGF0YVw8QXBwQXV0aG9yPlw8QXBwTmFtZT4KICAgICAgICBXaW4gNyAgKG5vdCByb2FtaW5nKTogICBDOlxVc2Vyc1w8dXNlcm5hbWU+XEFwcERhdGFcTG9jYWxcPEFwcEF1dGhvcj5cPEFwcE5hbWU+CiAgICAgICAgV2luIDcgIChyb2FtaW5nKTogICAgICAgQzpcVXNlcnNcPHVzZXJuYW1lPlxBcHBEYXRhXFJvYW1pbmdcPEFwcEF1dGhvcj5cPEFwcE5hbWU+CgogICAgRm9yIFVuaXgsIHdlIGZvbGxvdyB0aGUgWERHIHNwZWMgYW5kIHN1cHBvcnQgJFhER19EQVRBX0hPTUUuCiAgICBUaGF0IG1lYW5zLCBieSBkZWZhdWx0ICJ+Ly5sb2NhbC9zaGFyZS88QXBwTmFtZT4iLgogICAgIiIiCiAgICBpZiBzeXN0ZW0gPT0gIndpbjMyIjoKICAgICAgICBpZiBhcHBhdXRob3IgaXMgTm9uZToKICAgICAgICAgICAgYXBwYXV0aG9yID0gYXBwbmFtZQogICAgICAgIGNvbnN0ID0gcm9hbWluZyBhbmQgIkNTSURMX0FQUERBVEEiIG9yICJDU0lETF9MT0NBTF9BUFBEQVRBIgogICAgICAgIHBhdGggPSBvcy5wYXRoLm5vcm1wYXRoKF9nZXRfd2luX2ZvbGRlcihjb25zdCkpCiAgICAgICAgaWYgYXBwbmFtZToKICAgICAgICAgICAgaWYgYXBwYXV0aG9yIGlzIG5vdCBGYWxzZToKICAgICAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgYXBwYXV0aG9yLCBhcHBuYW1lKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCBhcHBuYW1lKQogICAgZWxpZiBzeXN0ZW0gPT0gJ2Rhcndpbic6CiAgICAgICAgcGF0aCA9IG9zLnBhdGguZXhwYW5kdXNlcignfi9MaWJyYXJ5L0FwcGxpY2F0aW9uIFN1cHBvcnQvJykKICAgICAgICBpZiBhcHBuYW1lOgogICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIGFwcG5hbWUpCiAgICBlbHNlOgogICAgICAgIHBhdGggPSBvcy5nZXRlbnYoJ1hER19EQVRBX0hPTUUnLCBvcy5wYXRoLmV4cGFuZHVzZXIoIn4vLmxvY2FsL3NoYXJlIikpCiAgICAgICAgaWYgYXBwbmFtZToKICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCBhcHBuYW1lKQogICAgaWYgYXBwbmFtZSBhbmQgdmVyc2lvbjoKICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIHZlcnNpb24pCiAgICByZXR1cm4gcGF0aAoKCmRlZiBzaXRlX2RhdGFfZGlyKGFwcG5hbWU9Tm9uZSwgYXBwYXV0aG9yPU5vbmUsIHZlcnNpb249Tm9uZSwgbXVsdGlwYXRoPUZhbHNlKToKICAgIHIiIiJSZXR1cm4gZnVsbCBwYXRoIHRvIHRoZSB1c2VyLXNoYXJlZCBkYXRhIGRpciBmb3IgdGhpcyBhcHBsaWNhdGlvbi4KCiAgICAgICAgImFwcG5hbWUiIGlzIHRoZSBuYW1lIG9mIGFwcGxpY2F0aW9uLgogICAgICAgICAgICBJZiBOb25lLCBqdXN0IHRoZSBzeXN0ZW0gZGlyZWN0b3J5IGlzIHJldHVybmVkLgogICAgICAgICJhcHBhdXRob3IiIChvbmx5IHVzZWQgb24gV2luZG93cykgaXMgdGhlIG5hbWUgb2YgdGhlCiAgICAgICAgICAgIGFwcGF1dGhvciBvciBkaXN0cmlidXRpbmcgYm9keSBmb3IgdGhpcyBhcHBsaWNhdGlvbi4gVHlwaWNhbGx5CiAgICAgICAgICAgIGl0IGlzIHRoZSBvd25pbmcgY29tcGFueSBuYW1lLiBUaGlzIGZhbGxzIGJhY2sgdG8gYXBwbmFtZS4gWW91IG1heQogICAgICAgICAgICBwYXNzIEZhbHNlIHRvIGRpc2FibGUgaXQuCiAgICAgICAgInZlcnNpb24iIGlzIGFuIG9wdGlvbmFsIHZlcnNpb24gcGF0aCBlbGVtZW50IHRvIGFwcGVuZCB0byB0aGUKICAgICAgICAgICAgcGF0aC4gWW91IG1pZ2h0IHdhbnQgdG8gdXNlIHRoaXMgaWYgeW91IHdhbnQgbXVsdGlwbGUgdmVyc2lvbnMKICAgICAgICAgICAgb2YgeW91ciBhcHAgdG8gYmUgYWJsZSB0byBydW4gaW5kZXBlbmRlbnRseS4gSWYgdXNlZCwgdGhpcwogICAgICAgICAgICB3b3VsZCB0eXBpY2FsbHkgYmUgIjxtYWpvcj4uPG1pbm9yPiIuCiAgICAgICAgICAgIE9ubHkgYXBwbGllZCB3aGVuIGFwcG5hbWUgaXMgcHJlc2VudC4KICAgICAgICAibXVsdGlwYXRoIiBpcyBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgb25seSBhcHBsaWNhYmxlIHRvICpuaXgKICAgICAgICAgICAgd2hpY2ggaW5kaWNhdGVzIHRoYXQgdGhlIGVudGlyZSBsaXN0IG9mIGRhdGEgZGlycyBzaG91bGQgYmUKICAgICAgICAgICAgcmV0dXJuZWQuIEJ5IGRlZmF1bHQsIHRoZSBmaXJzdCBpdGVtIGZyb20gWERHX0RBVEFfRElSUyBpcwogICAgICAgICAgICByZXR1cm5lZCwgb3IgJy91c3IvbG9jYWwvc2hhcmUvPEFwcE5hbWU+JywKICAgICAgICAgICAgaWYgWERHX0RBVEFfRElSUyBpcyBub3Qgc2V0CgogICAgVHlwaWNhbCBzaXRlIGRhdGEgZGlyZWN0b3JpZXMgYXJlOgogICAgICAgIE1hYyBPUyBYOiAgIC9MaWJyYXJ5L0FwcGxpY2F0aW9uIFN1cHBvcnQvPEFwcE5hbWU+CiAgICAgICAgVW5peDogICAgICAgL3Vzci9sb2NhbC9zaGFyZS88QXBwTmFtZT4gb3IgL3Vzci9zaGFyZS88QXBwTmFtZT4KICAgICAgICBXaW4gWFA6ICAgICBDOlxEb2N1bWVudHMgYW5kIFNldHRpbmdzXEFsbCBVc2Vyc1xBcHBsaWNhdGlvbiBEYXRhXDxBcHBBdXRob3I+XDxBcHBOYW1lPgogICAgICAgIFZpc3RhOiAgICAgIChGYWlsISAiQzpcUHJvZ3JhbURhdGEiIGlzIGEgaGlkZGVuICpzeXN0ZW0qIGRpcmVjdG9yeSBvbiBWaXN0YS4pCiAgICAgICAgV2luIDc6ICAgICAgQzpcUHJvZ3JhbURhdGFcPEFwcEF1dGhvcj5cPEFwcE5hbWU+ICAgIyBIaWRkZW4sIGJ1dCB3cml0ZWFibGUgb24gV2luIDcuCgogICAgRm9yIFVuaXgsIHRoaXMgaXMgdXNpbmcgdGhlICRYREdfREFUQV9ESVJTWzBdIGRlZmF1bHQuCgogICAgV0FSTklORzogRG8gbm90IHVzZSB0aGlzIG9uIFdpbmRvd3MuIFNlZSB0aGUgVmlzdGEtRmFpbCBub3RlIGFib3ZlIGZvciB3aHkuCiAgICAiIiIKICAgIGlmIHN5c3RlbSA9PSAid2luMzIiOgogICAgICAgIGlmIGFwcGF1dGhvciBpcyBOb25lOgogICAgICAgICAgICBhcHBhdXRob3IgPSBhcHBuYW1lCiAgICAgICAgcGF0aCA9IG9zLnBhdGgubm9ybXBhdGgoX2dldF93aW5fZm9sZGVyKCJDU0lETF9DT01NT05fQVBQREFUQSIpKQogICAgICAgIGlmIGFwcG5hbWU6CiAgICAgICAgICAgIGlmIGFwcGF1dGhvciBpcyBub3QgRmFsc2U6CiAgICAgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIGFwcGF1dGhvciwgYXBwbmFtZSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgYXBwbmFtZSkKICAgIGVsaWYgc3lzdGVtID09ICdkYXJ3aW4nOgogICAgICAgIHBhdGggPSBvcy5wYXRoLmV4cGFuZHVzZXIoJy9MaWJyYXJ5L0FwcGxpY2F0aW9uIFN1cHBvcnQnKQogICAgICAgIGlmIGFwcG5hbWU6CiAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgYXBwbmFtZSkKICAgIGVsc2U6CiAgICAgICAgIyBYREcgZGVmYXVsdCBmb3IgJFhER19EQVRBX0RJUlMKICAgICAgICAjIG9ubHkgZmlyc3QsIGlmIG11bHRpcGF0aCBpcyBGYWxzZQogICAgICAgIHBhdGggPSBvcy5nZXRlbnYoJ1hER19EQVRBX0RJUlMnLAogICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aHNlcC5qb2luKFsnL3Vzci9sb2NhbC9zaGFyZScsICcvdXNyL3NoYXJlJ10pKQogICAgICAgIHBhdGhsaXN0ID0gW29zLnBhdGguZXhwYW5kdXNlcih4LnJzdHJpcChvcy5zZXApKSBmb3IgeCBpbiBwYXRoLnNwbGl0KG9zLnBhdGhzZXApXQogICAgICAgIGlmIGFwcG5hbWU6CiAgICAgICAgICAgIGlmIHZlcnNpb246CiAgICAgICAgICAgICAgICBhcHBuYW1lID0gb3MucGF0aC5qb2luKGFwcG5hbWUsIHZlcnNpb24pCiAgICAgICAgICAgIHBhdGhsaXN0ID0gW29zLnNlcC5qb2luKFt4LCBhcHBuYW1lXSkgZm9yIHggaW4gcGF0aGxpc3RdCgogICAgICAgIGlmIG11bHRpcGF0aDoKICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGhzZXAuam9pbihwYXRobGlzdCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBwYXRoID0gcGF0aGxpc3RbMF0KICAgICAgICByZXR1cm4gcGF0aAoKICAgIGlmIGFwcG5hbWUgYW5kIHZlcnNpb246CiAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCB2ZXJzaW9uKQogICAgcmV0dXJuIHBhdGgKCgpkZWYgdXNlcl9jb25maWdfZGlyKGFwcG5hbWU9Tm9uZSwgYXBwYXV0aG9yPU5vbmUsIHZlcnNpb249Tm9uZSwgcm9hbWluZz1GYWxzZSk6CiAgICByIiIiUmV0dXJuIGZ1bGwgcGF0aCB0byB0aGUgdXNlci1zcGVjaWZpYyBjb25maWcgZGlyIGZvciB0aGlzIGFwcGxpY2F0aW9uLgoKICAgICAgICAiYXBwbmFtZSIgaXMgdGhlIG5hbWUgb2YgYXBwbGljYXRpb24uCiAgICAgICAgICAgIElmIE5vbmUsIGp1c3QgdGhlIHN5c3RlbSBkaXJlY3RvcnkgaXMgcmV0dXJuZWQuCiAgICAgICAgImFwcGF1dGhvciIgKG9ubHkgdXNlZCBvbiBXaW5kb3dzKSBpcyB0aGUgbmFtZSBvZiB0aGUKICAgICAgICAgICAgYXBwYXV0aG9yIG9yIGRpc3RyaWJ1dGluZyBib2R5IGZvciB0aGlzIGFwcGxpY2F0aW9uLiBUeXBpY2FsbHkKICAgICAgICAgICAgaXQgaXMgdGhlIG93bmluZyBjb21wYW55IG5hbWUuIFRoaXMgZmFsbHMgYmFjayB0byBhcHBuYW1lLiBZb3UgbWF5CiAgICAgICAgICAgIHBhc3MgRmFsc2UgdG8gZGlzYWJsZSBpdC4KICAgICAgICAidmVyc2lvbiIgaXMgYW4gb3B0aW9uYWwgdmVyc2lvbiBwYXRoIGVsZW1lbnQgdG8gYXBwZW5kIHRvIHRoZQogICAgICAgICAgICBwYXRoLiBZb3UgbWlnaHQgd2FudCB0byB1c2UgdGhpcyBpZiB5b3Ugd2FudCBtdWx0aXBsZSB2ZXJzaW9ucwogICAgICAgICAgICBvZiB5b3VyIGFwcCB0byBiZSBhYmxlIHRvIHJ1biBpbmRlcGVuZGVudGx5LiBJZiB1c2VkLCB0aGlzCiAgICAgICAgICAgIHdvdWxkIHR5cGljYWxseSBiZSAiPG1ham9yPi48bWlub3I+Ii4KICAgICAgICAgICAgT25seSBhcHBsaWVkIHdoZW4gYXBwbmFtZSBpcyBwcmVzZW50LgogICAgICAgICJyb2FtaW5nIiAoYm9vbGVhbiwgZGVmYXVsdCBGYWxzZSkgY2FuIGJlIHNldCBUcnVlIHRvIHVzZSB0aGUgV2luZG93cwogICAgICAgICAgICByb2FtaW5nIGFwcGRhdGEgZGlyZWN0b3J5LiBUaGF0IG1lYW5zIHRoYXQgZm9yIHVzZXJzIG9uIGEgV2luZG93cwogICAgICAgICAgICBuZXR3b3JrIHNldHVwIGZvciByb2FtaW5nIHByb2ZpbGVzLCB0aGlzIHVzZXIgZGF0YSB3aWxsIGJlCiAgICAgICAgICAgIHN5bmMnZCBvbiBsb2dpbi4gU2VlCiAgICAgICAgICAgIDxodHRwOi8vdGVjaG5ldC5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvY2M3NjY0ODkoV1MuMTApLmFzcHg+CiAgICAgICAgICAgIGZvciBhIGRpc2N1c3Npb24gb2YgaXNzdWVzLgoKICAgIFR5cGljYWwgdXNlciBjb25maWcgZGlyZWN0b3JpZXMgYXJlOgogICAgICAgIE1hYyBPUyBYOiAgICAgICAgICAgICAgIHNhbWUgYXMgdXNlcl9kYXRhX2RpcgogICAgICAgIFVuaXg6ICAgICAgICAgICAgICAgICAgIH4vLmNvbmZpZy88QXBwTmFtZT4gICAgICMgb3IgaW4gJFhER19DT05GSUdfSE9NRSwgaWYgZGVmaW5lZAogICAgICAgIFdpbiAqOiAgICAgICAgICAgICAgICAgIHNhbWUgYXMgdXNlcl9kYXRhX2RpcgoKICAgIEZvciBVbml4LCB3ZSBmb2xsb3cgdGhlIFhERyBzcGVjIGFuZCBzdXBwb3J0ICRYREdfQ09ORklHX0hPTUUuCiAgICBUaGF0IG1lYW5zLCBieSBkZWZhdWx0ICJ+Ly5jb25maWcvPEFwcE5hbWU+Ii4KICAgICIiIgogICAgaWYgc3lzdGVtIGluIFsid2luMzIiLCAiZGFyd2luIl06CiAgICAgICAgcGF0aCA9IHVzZXJfZGF0YV9kaXIoYXBwbmFtZSwgYXBwYXV0aG9yLCBOb25lLCByb2FtaW5nKQogICAgZWxzZToKICAgICAgICBwYXRoID0gb3MuZ2V0ZW52KCdYREdfQ09ORklHX0hPTUUnLCBvcy5wYXRoLmV4cGFuZHVzZXIoIn4vLmNvbmZpZyIpKQogICAgICAgIGlmIGFwcG5hbWU6CiAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgYXBwbmFtZSkKICAgIGlmIGFwcG5hbWUgYW5kIHZlcnNpb246CiAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCB2ZXJzaW9uKQogICAgcmV0dXJuIHBhdGgKCgpkZWYgc2l0ZV9jb25maWdfZGlyKGFwcG5hbWU9Tm9uZSwgYXBwYXV0aG9yPU5vbmUsIHZlcnNpb249Tm9uZSwgbXVsdGlwYXRoPUZhbHNlKToKICAgIHIiIiJSZXR1cm4gZnVsbCBwYXRoIHRvIHRoZSB1c2VyLXNoYXJlZCBkYXRhIGRpciBmb3IgdGhpcyBhcHBsaWNhdGlvbi4KCiAgICAgICAgImFwcG5hbWUiIGlzIHRoZSBuYW1lIG9mIGFwcGxpY2F0aW9uLgogICAgICAgICAgICBJZiBOb25lLCBqdXN0IHRoZSBzeXN0ZW0gZGlyZWN0b3J5IGlzIHJldHVybmVkLgogICAgICAgICJhcHBhdXRob3IiIChvbmx5IHVzZWQgb24gV2luZG93cykgaXMgdGhlIG5hbWUgb2YgdGhlCiAgICAgICAgICAgIGFwcGF1dGhvciBvciBkaXN0cmlidXRpbmcgYm9keSBmb3IgdGhpcyBhcHBsaWNhdGlvbi4gVHlwaWNhbGx5CiAgICAgICAgICAgIGl0IGlzIHRoZSBvd25pbmcgY29tcGFueSBuYW1lLiBUaGlzIGZhbGxzIGJhY2sgdG8gYXBwbmFtZS4gWW91IG1heQogICAgICAgICAgICBwYXNzIEZhbHNlIHRvIGRpc2FibGUgaXQuCiAgICAgICAgInZlcnNpb24iIGlzIGFuIG9wdGlvbmFsIHZlcnNpb24gcGF0aCBlbGVtZW50IHRvIGFwcGVuZCB0byB0aGUKICAgICAgICAgICAgcGF0aC4gWW91IG1pZ2h0IHdhbnQgdG8gdXNlIHRoaXMgaWYgeW91IHdhbnQgbXVsdGlwbGUgdmVyc2lvbnMKICAgICAgICAgICAgb2YgeW91ciBhcHAgdG8gYmUgYWJsZSB0byBydW4gaW5kZXBlbmRlbnRseS4gSWYgdXNlZCwgdGhpcwogICAgICAgICAgICB3b3VsZCB0eXBpY2FsbHkgYmUgIjxtYWpvcj4uPG1pbm9yPiIuCiAgICAgICAgICAgIE9ubHkgYXBwbGllZCB3aGVuIGFwcG5hbWUgaXMgcHJlc2VudC4KICAgICAgICAibXVsdGlwYXRoIiBpcyBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgb25seSBhcHBsaWNhYmxlIHRvICpuaXgKICAgICAgICAgICAgd2hpY2ggaW5kaWNhdGVzIHRoYXQgdGhlIGVudGlyZSBsaXN0IG9mIGNvbmZpZyBkaXJzIHNob3VsZCBiZQogICAgICAgICAgICByZXR1cm5lZC4gQnkgZGVmYXVsdCwgdGhlIGZpcnN0IGl0ZW0gZnJvbSBYREdfQ09ORklHX0RJUlMgaXMKICAgICAgICAgICAgcmV0dXJuZWQsIG9yICcvZXRjL3hkZy88QXBwTmFtZT4nLCBpZiBYREdfQ09ORklHX0RJUlMgaXMgbm90IHNldAoKICAgIFR5cGljYWwgc2l0ZSBjb25maWcgZGlyZWN0b3JpZXMgYXJlOgogICAgICAgIE1hYyBPUyBYOiAgIHNhbWUgYXMgc2l0ZV9kYXRhX2RpcgogICAgICAgIFVuaXg6ICAgICAgIC9ldGMveGRnLzxBcHBOYW1lPiBvciAkWERHX0NPTkZJR19ESVJTW2ldLzxBcHBOYW1lPiBmb3IgZWFjaCB2YWx1ZSBpbgogICAgICAgICAgICAgICAgICAgICRYREdfQ09ORklHX0RJUlMKICAgICAgICBXaW4gKjogICAgICBzYW1lIGFzIHNpdGVfZGF0YV9kaXIKICAgICAgICBWaXN0YTogICAgICAoRmFpbCEgIkM6XFByb2dyYW1EYXRhIiBpcyBhIGhpZGRlbiAqc3lzdGVtKiBkaXJlY3Rvcnkgb24gVmlzdGEuKQoKICAgIEZvciBVbml4LCB0aGlzIGlzIHVzaW5nIHRoZSAkWERHX0NPTkZJR19ESVJTWzBdIGRlZmF1bHQsIGlmIG11bHRpcGF0aD1GYWxzZQoKICAgIFdBUk5JTkc6IERvIG5vdCB1c2UgdGhpcyBvbiBXaW5kb3dzLiBTZWUgdGhlIFZpc3RhLUZhaWwgbm90ZSBhYm92ZSBmb3Igd2h5LgogICAgIiIiCiAgICBpZiBzeXN0ZW0gaW4gWyJ3aW4zMiIsICJkYXJ3aW4iXToKICAgICAgICBwYXRoID0gc2l0ZV9kYXRhX2RpcihhcHBuYW1lLCBhcHBhdXRob3IpCiAgICAgICAgaWYgYXBwbmFtZSBhbmQgdmVyc2lvbjoKICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCB2ZXJzaW9uKQogICAgZWxzZToKICAgICAgICAjIFhERyBkZWZhdWx0IGZvciAkWERHX0NPTkZJR19ESVJTCiAgICAgICAgIyBvbmx5IGZpcnN0LCBpZiBtdWx0aXBhdGggaXMgRmFsc2UKICAgICAgICBwYXRoID0gb3MuZ2V0ZW52KCdYREdfQ09ORklHX0RJUlMnLCAnL2V0Yy94ZGcnKQogICAgICAgIHBhdGhsaXN0ID0gW29zLnBhdGguZXhwYW5kdXNlcih4LnJzdHJpcChvcy5zZXApKSBmb3IgeCBpbiBwYXRoLnNwbGl0KG9zLnBhdGhzZXApXQogICAgICAgIGlmIGFwcG5hbWU6CiAgICAgICAgICAgIGlmIHZlcnNpb246CiAgICAgICAgICAgICAgICBhcHBuYW1lID0gb3MucGF0aC5qb2luKGFwcG5hbWUsIHZlcnNpb24pCiAgICAgICAgICAgIHBhdGhsaXN0ID0gW29zLnNlcC5qb2luKFt4LCBhcHBuYW1lXSkgZm9yIHggaW4gcGF0aGxpc3RdCgogICAgICAgIGlmIG11bHRpcGF0aDoKICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGhzZXAuam9pbihwYXRobGlzdCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBwYXRoID0gcGF0aGxpc3RbMF0KICAgIHJldHVybiBwYXRoCgoKZGVmIHVzZXJfY2FjaGVfZGlyKGFwcG5hbWU9Tm9uZSwgYXBwYXV0aG9yPU5vbmUsIHZlcnNpb249Tm9uZSwgb3Bpbmlvbj1UcnVlKToKICAgIHIiIiJSZXR1cm4gZnVsbCBwYXRoIHRvIHRoZSB1c2VyLXNwZWNpZmljIGNhY2hlIGRpciBmb3IgdGhpcyBhcHBsaWNhdGlvbi4KCiAgICAgICAgImFwcG5hbWUiIGlzIHRoZSBuYW1lIG9mIGFwcGxpY2F0aW9uLgogICAgICAgICAgICBJZiBOb25lLCBqdXN0IHRoZSBzeXN0ZW0gZGlyZWN0b3J5IGlzIHJldHVybmVkLgogICAgICAgICJhcHBhdXRob3IiIChvbmx5IHVzZWQgb24gV2luZG93cykgaXMgdGhlIG5hbWUgb2YgdGhlCiAgICAgICAgICAgIGFwcGF1dGhvciBvciBkaXN0cmlidXRpbmcgYm9keSBmb3IgdGhpcyBhcHBsaWNhdGlvbi4gVHlwaWNhbGx5CiAgICAgICAgICAgIGl0IGlzIHRoZSBvd25pbmcgY29tcGFueSBuYW1lLiBUaGlzIGZhbGxzIGJhY2sgdG8gYXBwbmFtZS4gWW91IG1heQogICAgICAgICAgICBwYXNzIEZhbHNlIHRvIGRpc2FibGUgaXQuCiAgICAgICAgInZlcnNpb24iIGlzIGFuIG9wdGlvbmFsIHZlcnNpb24gcGF0aCBlbGVtZW50IHRvIGFwcGVuZCB0byB0aGUKICAgICAgICAgICAgcGF0aC4gWW91IG1pZ2h0IHdhbnQgdG8gdXNlIHRoaXMgaWYgeW91IHdhbnQgbXVsdGlwbGUgdmVyc2lvbnMKICAgICAgICAgICAgb2YgeW91ciBhcHAgdG8gYmUgYWJsZSB0byBydW4gaW5kZXBlbmRlbnRseS4gSWYgdXNlZCwgdGhpcwogICAgICAgICAgICB3b3VsZCB0eXBpY2FsbHkgYmUgIjxtYWpvcj4uPG1pbm9yPiIuCiAgICAgICAgICAgIE9ubHkgYXBwbGllZCB3aGVuIGFwcG5hbWUgaXMgcHJlc2VudC4KICAgICAgICAib3BpbmlvbiIgKGJvb2xlYW4pIGNhbiBiZSBGYWxzZSB0byBkaXNhYmxlIHRoZSBhcHBlbmRpbmcgb2YKICAgICAgICAgICAgIkNhY2hlIiB0byB0aGUgYmFzZSBhcHAgZGF0YSBkaXIgZm9yIFdpbmRvd3MuIFNlZQogICAgICAgICAgICBkaXNjdXNzaW9uIGJlbG93LgoKICAgIFR5cGljYWwgdXNlciBjYWNoZSBkaXJlY3RvcmllcyBhcmU6CiAgICAgICAgTWFjIE9TIFg6ICAgfi9MaWJyYXJ5L0NhY2hlcy88QXBwTmFtZT4KICAgICAgICBVbml4OiAgICAgICB+Ly5jYWNoZS88QXBwTmFtZT4gKFhERyBkZWZhdWx0KQogICAgICAgIFdpbiBYUDogICAgIEM6XERvY3VtZW50cyBhbmQgU2V0dGluZ3NcPHVzZXJuYW1lPlxMb2NhbCBTZXR0aW5nc1xBcHBsaWNhdGlvbiBEYXRhXDxBcHBBdXRob3I+XDxBcHBOYW1lPlxDYWNoZQogICAgICAgIFZpc3RhOiAgICAgIEM6XFVzZXJzXDx1c2VybmFtZT5cQXBwRGF0YVxMb2NhbFw8QXBwQXV0aG9yPlw8QXBwTmFtZT5cQ2FjaGUKCiAgICBPbiBXaW5kb3dzIHRoZSBvbmx5IHN1Z2dlc3Rpb24gaW4gdGhlIE1TRE4gZG9jcyBpcyB0aGF0IGxvY2FsIHNldHRpbmdzIGdvIGluCiAgICB0aGUgYENTSURMX0xPQ0FMX0FQUERBVEFgIGRpcmVjdG9yeS4gVGhpcyBpcyBpZGVudGljYWwgdG8gdGhlIG5vbi1yb2FtaW5nCiAgICBhcHAgZGF0YSBkaXIgKHRoZSBkZWZhdWx0IHJldHVybmVkIGJ5IGB1c2VyX2RhdGFfZGlyYCBhYm92ZSkuIEFwcHMgdHlwaWNhbGx5CiAgICBwdXQgY2FjaGUgZGF0YSBzb21ld2hlcmUgKnVuZGVyKiB0aGUgZ2l2ZW4gZGlyIGhlcmUuIFNvbWUgZXhhbXBsZXM6CiAgICAgICAgLi4uXE1vemlsbGFcRmlyZWZveFxQcm9maWxlc1w8UHJvZmlsZU5hbWU+XENhY2hlCiAgICAgICAgLi4uXEFjbWVcU3VwZXJBcHBcQ2FjaGVcMS4wCiAgICBPUElOSU9OOiBUaGlzIGZ1bmN0aW9uIGFwcGVuZHMgIkNhY2hlIiB0byB0aGUgYENTSURMX0xPQ0FMX0FQUERBVEFgIHZhbHVlLgogICAgVGhpcyBjYW4gYmUgZGlzYWJsZWQgd2l0aCB0aGUgYG9waW5pb249RmFsc2VgIG9wdGlvbi4KICAgICIiIgogICAgaWYgc3lzdGVtID09ICJ3aW4zMiI6CiAgICAgICAgaWYgYXBwYXV0aG9yIGlzIE5vbmU6CiAgICAgICAgICAgIGFwcGF1dGhvciA9IGFwcG5hbWUKICAgICAgICBwYXRoID0gb3MucGF0aC5ub3JtcGF0aChfZ2V0X3dpbl9mb2xkZXIoIkNTSURMX0xPQ0FMX0FQUERBVEEiKSkKICAgICAgICBpZiBhcHBuYW1lOgogICAgICAgICAgICBpZiBhcHBhdXRob3IgaXMgbm90IEZhbHNlOgogICAgICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCBhcHBhdXRob3IsIGFwcG5hbWUpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIGFwcG5hbWUpCiAgICAgICAgICAgIGlmIG9waW5pb246CiAgICAgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsICJDYWNoZSIpCiAgICBlbGlmIHN5c3RlbSA9PSAnZGFyd2luJzoKICAgICAgICBwYXRoID0gb3MucGF0aC5leHBhbmR1c2VyKCd+L0xpYnJhcnkvQ2FjaGVzJykKICAgICAgICBpZiBhcHBuYW1lOgogICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIGFwcG5hbWUpCiAgICBlbHNlOgogICAgICAgIHBhdGggPSBvcy5nZXRlbnYoJ1hER19DQUNIRV9IT01FJywgb3MucGF0aC5leHBhbmR1c2VyKCd+Ly5jYWNoZScpKQogICAgICAgIGlmIGFwcG5hbWU6CiAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgYXBwbmFtZSkKICAgIGlmIGFwcG5hbWUgYW5kIHZlcnNpb246CiAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCB2ZXJzaW9uKQogICAgcmV0dXJuIHBhdGgKCgpkZWYgdXNlcl9zdGF0ZV9kaXIoYXBwbmFtZT1Ob25lLCBhcHBhdXRob3I9Tm9uZSwgdmVyc2lvbj1Ob25lLCByb2FtaW5nPUZhbHNlKToKICAgIHIiIiJSZXR1cm4gZnVsbCBwYXRoIHRvIHRoZSB1c2VyLXNwZWNpZmljIHN0YXRlIGRpciBmb3IgdGhpcyBhcHBsaWNhdGlvbi4KCiAgICAgICAgImFwcG5hbWUiIGlzIHRoZSBuYW1lIG9mIGFwcGxpY2F0aW9uLgogICAgICAgICAgICBJZiBOb25lLCBqdXN0IHRoZSBzeXN0ZW0gZGlyZWN0b3J5IGlzIHJldHVybmVkLgogICAgICAgICJhcHBhdXRob3IiIChvbmx5IHVzZWQgb24gV2luZG93cykgaXMgdGhlIG5hbWUgb2YgdGhlCiAgICAgICAgICAgIGFwcGF1dGhvciBvciBkaXN0cmlidXRpbmcgYm9keSBmb3IgdGhpcyBhcHBsaWNhdGlvbi4gVHlwaWNhbGx5CiAgICAgICAgICAgIGl0IGlzIHRoZSBvd25pbmcgY29tcGFueSBuYW1lLiBUaGlzIGZhbGxzIGJhY2sgdG8gYXBwbmFtZS4gWW91IG1heQogICAgICAgICAgICBwYXNzIEZhbHNlIHRvIGRpc2FibGUgaXQuCiAgICAgICAgInZlcnNpb24iIGlzIGFuIG9wdGlvbmFsIHZlcnNpb24gcGF0aCBlbGVtZW50IHRvIGFwcGVuZCB0byB0aGUKICAgICAgICAgICAgcGF0aC4gWW91IG1pZ2h0IHdhbnQgdG8gdXNlIHRoaXMgaWYgeW91IHdhbnQgbXVsdGlwbGUgdmVyc2lvbnMKICAgICAgICAgICAgb2YgeW91ciBhcHAgdG8gYmUgYWJsZSB0byBydW4gaW5kZXBlbmRlbnRseS4gSWYgdXNlZCwgdGhpcwogICAgICAgICAgICB3b3VsZCB0eXBpY2FsbHkgYmUgIjxtYWpvcj4uPG1pbm9yPiIuCiAgICAgICAgICAgIE9ubHkgYXBwbGllZCB3aGVuIGFwcG5hbWUgaXMgcHJlc2VudC4KICAgICAgICAicm9hbWluZyIgKGJvb2xlYW4sIGRlZmF1bHQgRmFsc2UpIGNhbiBiZSBzZXQgVHJ1ZSB0byB1c2UgdGhlIFdpbmRvd3MKICAgICAgICAgICAgcm9hbWluZyBhcHBkYXRhIGRpcmVjdG9yeS4gVGhhdCBtZWFucyB0aGF0IGZvciB1c2VycyBvbiBhIFdpbmRvd3MKICAgICAgICAgICAgbmV0d29yayBzZXR1cCBmb3Igcm9hbWluZyBwcm9maWxlcywgdGhpcyB1c2VyIGRhdGEgd2lsbCBiZQogICAgICAgICAgICBzeW5jJ2Qgb24gbG9naW4uIFNlZQogICAgICAgICAgICA8aHR0cDovL3RlY2huZXQubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2NjNzY2NDg5KFdTLjEwKS5hc3B4PgogICAgICAgICAgICBmb3IgYSBkaXNjdXNzaW9uIG9mIGlzc3Vlcy4KCiAgICBUeXBpY2FsIHVzZXIgc3RhdGUgZGlyZWN0b3JpZXMgYXJlOgogICAgICAgIE1hYyBPUyBYOiAgc2FtZSBhcyB1c2VyX2RhdGFfZGlyCiAgICAgICAgVW5peDogICAgICB+Ly5sb2NhbC9zdGF0ZS88QXBwTmFtZT4gICAjIG9yIGluICRYREdfU1RBVEVfSE9NRSwgaWYgZGVmaW5lZAogICAgICAgIFdpbiAqOiAgICAgc2FtZSBhcyB1c2VyX2RhdGFfZGlyCgogICAgRm9yIFVuaXgsIHdlIGZvbGxvdyB0aGlzIERlYmlhbiBwcm9wb3NhbCA8aHR0cHM6Ly93aWtpLmRlYmlhbi5vcmcvWERHQmFzZURpcmVjdG9yeVNwZWNpZmljYXRpb24jc3RhdGU+CiAgICB0byBleHRlbmQgdGhlIFhERyBzcGVjIGFuZCBzdXBwb3J0ICRYREdfU1RBVEVfSE9NRS4KCiAgICBUaGF0IG1lYW5zLCBieSBkZWZhdWx0ICJ+Ly5sb2NhbC9zdGF0ZS88QXBwTmFtZT4iLgogICAgIiIiCiAgICBpZiBzeXN0ZW0gaW4gWyJ3aW4zMiIsICJkYXJ3aW4iXToKICAgICAgICBwYXRoID0gdXNlcl9kYXRhX2RpcihhcHBuYW1lLCBhcHBhdXRob3IsIE5vbmUsIHJvYW1pbmcpCiAgICBlbHNlOgogICAgICAgIHBhdGggPSBvcy5nZXRlbnYoJ1hER19TVEFURV9IT01FJywgb3MucGF0aC5leHBhbmR1c2VyKCJ+Ly5sb2NhbC9zdGF0ZSIpKQogICAgICAgIGlmIGFwcG5hbWU6CiAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgYXBwbmFtZSkKICAgIGlmIGFwcG5hbWUgYW5kIHZlcnNpb246CiAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCB2ZXJzaW9uKQogICAgcmV0dXJuIHBhdGgKCgpkZWYgdXNlcl9sb2dfZGlyKGFwcG5hbWU9Tm9uZSwgYXBwYXV0aG9yPU5vbmUsIHZlcnNpb249Tm9uZSwgb3Bpbmlvbj1UcnVlKToKICAgIHIiIiJSZXR1cm4gZnVsbCBwYXRoIHRvIHRoZSB1c2VyLXNwZWNpZmljIGxvZyBkaXIgZm9yIHRoaXMgYXBwbGljYXRpb24uCgogICAgICAgICJhcHBuYW1lIiBpcyB0aGUgbmFtZSBvZiBhcHBsaWNhdGlvbi4KICAgICAgICAgICAgSWYgTm9uZSwganVzdCB0aGUgc3lzdGVtIGRpcmVjdG9yeSBpcyByZXR1cm5lZC4KICAgICAgICAiYXBwYXV0aG9yIiAob25seSB1c2VkIG9uIFdpbmRvd3MpIGlzIHRoZSBuYW1lIG9mIHRoZQogICAgICAgICAgICBhcHBhdXRob3Igb3IgZGlzdHJpYnV0aW5nIGJvZHkgZm9yIHRoaXMgYXBwbGljYXRpb24uIFR5cGljYWxseQogICAgICAgICAgICBpdCBpcyB0aGUgb3duaW5nIGNvbXBhbnkgbmFtZS4gVGhpcyBmYWxscyBiYWNrIHRvIGFwcG5hbWUuIFlvdSBtYXkKICAgICAgICAgICAgcGFzcyBGYWxzZSB0byBkaXNhYmxlIGl0LgogICAgICAgICJ2ZXJzaW9uIiBpcyBhbiBvcHRpb25hbCB2ZXJzaW9uIHBhdGggZWxlbWVudCB0byBhcHBlbmQgdG8gdGhlCiAgICAgICAgICAgIHBhdGguIFlvdSBtaWdodCB3YW50IHRvIHVzZSB0aGlzIGlmIHlvdSB3YW50IG11bHRpcGxlIHZlcnNpb25zCiAgICAgICAgICAgIG9mIHlvdXIgYXBwIHRvIGJlIGFibGUgdG8gcnVuIGluZGVwZW5kZW50bHkuIElmIHVzZWQsIHRoaXMKICAgICAgICAgICAgd291bGQgdHlwaWNhbGx5IGJlICI8bWFqb3I+LjxtaW5vcj4iLgogICAgICAgICAgICBPbmx5IGFwcGxpZWQgd2hlbiBhcHBuYW1lIGlzIHByZXNlbnQuCiAgICAgICAgIm9waW5pb24iIChib29sZWFuKSBjYW4gYmUgRmFsc2UgdG8gZGlzYWJsZSB0aGUgYXBwZW5kaW5nIG9mCiAgICAgICAgICAgICJMb2dzIiB0byB0aGUgYmFzZSBhcHAgZGF0YSBkaXIgZm9yIFdpbmRvd3MsIGFuZCAibG9nIiB0byB0aGUKICAgICAgICAgICAgYmFzZSBjYWNoZSBkaXIgZm9yIFVuaXguIFNlZSBkaXNjdXNzaW9uIGJlbG93LgoKICAgIFR5cGljYWwgdXNlciBsb2cgZGlyZWN0b3JpZXMgYXJlOgogICAgICAgIE1hYyBPUyBYOiAgIH4vTGlicmFyeS9Mb2dzLzxBcHBOYW1lPgogICAgICAgIFVuaXg6ICAgICAgIH4vLmNhY2hlLzxBcHBOYW1lPi9sb2cgICMgb3IgdW5kZXIgJFhER19DQUNIRV9IT01FIGlmIGRlZmluZWQKICAgICAgICBXaW4gWFA6ICAgICBDOlxEb2N1bWVudHMgYW5kIFNldHRpbmdzXDx1c2VybmFtZT5cTG9jYWwgU2V0dGluZ3NcQXBwbGljYXRpb24gRGF0YVw8QXBwQXV0aG9yPlw8QXBwTmFtZT5cTG9ncwogICAgICAgIFZpc3RhOiAgICAgIEM6XFVzZXJzXDx1c2VybmFtZT5cQXBwRGF0YVxMb2NhbFw8QXBwQXV0aG9yPlw8QXBwTmFtZT5cTG9ncwoKICAgIE9uIFdpbmRvd3MgdGhlIG9ubHkgc3VnZ2VzdGlvbiBpbiB0aGUgTVNETiBkb2NzIGlzIHRoYXQgbG9jYWwgc2V0dGluZ3MKICAgIGdvIGluIHRoZSBgQ1NJRExfTE9DQUxfQVBQREFUQWAgZGlyZWN0b3J5LiAoTm90ZTogSSdtIGludGVyZXN0ZWQgaW4KICAgIGV4YW1wbGVzIG9mIHdoYXQgc29tZSB3aW5kb3dzIGFwcHMgdXNlIGZvciBhIGxvZ3MgZGlyLikKCiAgICBPUElOSU9OOiBUaGlzIGZ1bmN0aW9uIGFwcGVuZHMgIkxvZ3MiIHRvIHRoZSBgQ1NJRExfTE9DQUxfQVBQREFUQWAKICAgIHZhbHVlIGZvciBXaW5kb3dzIGFuZCBhcHBlbmRzICJsb2ciIHRvIHRoZSB1c2VyIGNhY2hlIGRpciBmb3IgVW5peC4KICAgIFRoaXMgY2FuIGJlIGRpc2FibGVkIHdpdGggdGhlIGBvcGluaW9uPUZhbHNlYCBvcHRpb24uCiAgICAiIiIKICAgIGlmIHN5c3RlbSA9PSAiZGFyd2luIjoKICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKAogICAgICAgICAgICBvcy5wYXRoLmV4cGFuZHVzZXIoJ34vTGlicmFyeS9Mb2dzJyksCiAgICAgICAgICAgIGFwcG5hbWUpCiAgICBlbGlmIHN5c3RlbSA9PSAid2luMzIiOgogICAgICAgIHBhdGggPSB1c2VyX2RhdGFfZGlyKGFwcG5hbWUsIGFwcGF1dGhvciwgdmVyc2lvbikKICAgICAgICB2ZXJzaW9uID0gRmFsc2UKICAgICAgICBpZiBvcGluaW9uOgogICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsICJMb2dzIikKICAgIGVsc2U6CiAgICAgICAgcGF0aCA9IHVzZXJfY2FjaGVfZGlyKGFwcG5hbWUsIGFwcGF1dGhvciwgdmVyc2lvbikKICAgICAgICB2ZXJzaW9uID0gRmFsc2UKICAgICAgICBpZiBvcGluaW9uOgogICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsICJsb2ciKQogICAgaWYgYXBwbmFtZSBhbmQgdmVyc2lvbjoKICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIHZlcnNpb24pCiAgICByZXR1cm4gcGF0aAoKCmNsYXNzIEFwcERpcnMob2JqZWN0KToKICAgICIiIkNvbnZlbmllbmNlIHdyYXBwZXIgZm9yIGdldHRpbmcgYXBwbGljYXRpb24gZGlycy4iIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhcHBuYW1lPU5vbmUsIGFwcGF1dGhvcj1Ob25lLCB2ZXJzaW9uPU5vbmUsCiAgICAgICAgICAgIHJvYW1pbmc9RmFsc2UsIG11bHRpcGF0aD1GYWxzZSk6CiAgICAgICAgc2VsZi5hcHBuYW1lID0gYXBwbmFtZQogICAgICAgIHNlbGYuYXBwYXV0aG9yID0gYXBwYXV0aG9yCiAgICAgICAgc2VsZi52ZXJzaW9uID0gdmVyc2lvbgogICAgICAgIHNlbGYucm9hbWluZyA9IHJvYW1pbmcKICAgICAgICBzZWxmLm11bHRpcGF0aCA9IG11bHRpcGF0aAoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHVzZXJfZGF0YV9kaXIoc2VsZik6CiAgICAgICAgcmV0dXJuIHVzZXJfZGF0YV9kaXIoc2VsZi5hcHBuYW1lLCBzZWxmLmFwcGF1dGhvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uPXNlbGYudmVyc2lvbiwgcm9hbWluZz1zZWxmLnJvYW1pbmcpCgogICAgQHByb3BlcnR5CiAgICBkZWYgc2l0ZV9kYXRhX2RpcihzZWxmKToKICAgICAgICByZXR1cm4gc2l0ZV9kYXRhX2RpcihzZWxmLmFwcG5hbWUsIHNlbGYuYXBwYXV0aG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb249c2VsZi52ZXJzaW9uLCBtdWx0aXBhdGg9c2VsZi5tdWx0aXBhdGgpCgogICAgQHByb3BlcnR5CiAgICBkZWYgdXNlcl9jb25maWdfZGlyKHNlbGYpOgogICAgICAgIHJldHVybiB1c2VyX2NvbmZpZ19kaXIoc2VsZi5hcHBuYW1lLCBzZWxmLmFwcGF1dGhvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb249c2VsZi52ZXJzaW9uLCByb2FtaW5nPXNlbGYucm9hbWluZykKCiAgICBAcHJvcGVydHkKICAgIGRlZiBzaXRlX2NvbmZpZ19kaXIoc2VsZik6CiAgICAgICAgcmV0dXJuIHNpdGVfY29uZmlnX2RpcihzZWxmLmFwcG5hbWUsIHNlbGYuYXBwYXV0aG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb249c2VsZi52ZXJzaW9uLCBtdWx0aXBhdGg9c2VsZi5tdWx0aXBhdGgpCgogICAgQHByb3BlcnR5CiAgICBkZWYgdXNlcl9jYWNoZV9kaXIoc2VsZik6CiAgICAgICAgcmV0dXJuIHVzZXJfY2FjaGVfZGlyKHNlbGYuYXBwbmFtZSwgc2VsZi5hcHBhdXRob3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb249c2VsZi52ZXJzaW9uKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHVzZXJfc3RhdGVfZGlyKHNlbGYpOgogICAgICAgIHJldHVybiB1c2VyX3N0YXRlX2RpcihzZWxmLmFwcG5hbWUsIHNlbGYuYXBwYXV0aG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uPXNlbGYudmVyc2lvbikKCiAgICBAcHJvcGVydHkKICAgIGRlZiB1c2VyX2xvZ19kaXIoc2VsZik6CiAgICAgICAgcmV0dXJuIHVzZXJfbG9nX2RpcihzZWxmLmFwcG5hbWUsIHNlbGYuYXBwYXV0aG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbj1zZWxmLnZlcnNpb24pCgoKIy0tLS0gaW50ZXJuYWwgc3VwcG9ydCBzdHVmZgoKZGVmIF9nZXRfd2luX2ZvbGRlcl9mcm9tX3JlZ2lzdHJ5KGNzaWRsX25hbWUpOgogICAgIiIiVGhpcyBpcyBhIGZhbGxiYWNrIHRlY2huaXF1ZSBhdCBiZXN0LiBJJ20gbm90IHN1cmUgaWYgdXNpbmcgdGhlCiAgICByZWdpc3RyeSBmb3IgdGhpcyBndWFyYW50ZWVzIHVzIHRoZSBjb3JyZWN0IGFuc3dlciBmb3IgYWxsIENTSURMXyoKICAgIG5hbWVzLgogICAgIiIiCiAgICBpZiBQWTM6CiAgICAgIGltcG9ydCB3aW5yZWcgYXMgX3dpbnJlZwogICAgZWxzZToKICAgICAgaW1wb3J0IF93aW5yZWcKCiAgICBzaGVsbF9mb2xkZXJfbmFtZSA9IHsKICAgICAgICAiQ1NJRExfQVBQREFUQSI6ICJBcHBEYXRhIiwKICAgICAgICAiQ1NJRExfQ09NTU9OX0FQUERBVEEiOiAiQ29tbW9uIEFwcERhdGEiLAogICAgICAgICJDU0lETF9MT0NBTF9BUFBEQVRBIjogIkxvY2FsIEFwcERhdGEiLAogICAgfVtjc2lkbF9uYW1lXQoKICAgIGtleSA9IF93aW5yZWcuT3BlbktleSgKICAgICAgICBfd2lucmVnLkhLRVlfQ1VSUkVOVF9VU0VSLAogICAgICAgIHIiU29mdHdhcmVcTWljcm9zb2Z0XFdpbmRvd3NcQ3VycmVudFZlcnNpb25cRXhwbG9yZXJcU2hlbGwgRm9sZGVycyIKICAgICkKICAgIGRpciwgdHlwZSA9IF93aW5yZWcuUXVlcnlWYWx1ZUV4KGtleSwgc2hlbGxfZm9sZGVyX25hbWUpCiAgICByZXR1cm4gZGlyCgoKZGVmIF9nZXRfd2luX2ZvbGRlcl93aXRoX3B5d2luMzIoY3NpZGxfbmFtZSk6CiAgICBmcm9tIHdpbjMyY29tLnNoZWxsIGltcG9ydCBzaGVsbGNvbiwgc2hlbGwKICAgIGRpciA9IHNoZWxsLlNIR2V0Rm9sZGVyUGF0aCgwLCBnZXRhdHRyKHNoZWxsY29uLCBjc2lkbF9uYW1lKSwgMCwgMCkKICAgICMgVHJ5IHRvIG1ha2UgdGhpcyBhIHVuaWNvZGUgcGF0aCBiZWNhdXNlIFNIR2V0Rm9sZGVyUGF0aCBkb2VzCiAgICAjIG5vdCByZXR1cm4gdW5pY29kZSBzdHJpbmdzIHdoZW4gdGhlcmUgaXMgdW5pY29kZSBkYXRhIGluIHRoZQogICAgIyBwYXRoLgogICAgdHJ5OgogICAgICAgIGRpciA9IHVuaWNvZGUoZGlyKQoKICAgICAgICAjIERvd25ncmFkZSB0byBzaG9ydCBwYXRoIG5hbWUgaWYgaGF2ZSBoaWdoYml0IGNoYXJzLiBTZWUKICAgICAgICAjIDxodHRwOi8vYnVncy5hY3RpdmVzdGF0ZS5jb20vc2hvd19idWcuY2dpP2lkPTg1MDk5Pi4KICAgICAgICBoYXNfaGlnaF9jaGFyID0gRmFsc2UKICAgICAgICBmb3IgYyBpbiBkaXI6CiAgICAgICAgICAgIGlmIG9yZChjKSA+IDI1NToKICAgICAgICAgICAgICAgIGhhc19oaWdoX2NoYXIgPSBUcnVlCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgIGlmIGhhc19oaWdoX2NoYXI6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGltcG9ydCB3aW4zMmFwaQogICAgICAgICAgICAgICAgZGlyID0gd2luMzJhcGkuR2V0U2hvcnRQYXRoTmFtZShkaXIpCiAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICAgICAgICAgIHBhc3MKICAgIGV4Y2VwdCBVbmljb2RlRXJyb3I6CiAgICAgICAgcGFzcwogICAgcmV0dXJuIGRpcgoKCmRlZiBfZ2V0X3dpbl9mb2xkZXJfd2l0aF9jdHlwZXMoY3NpZGxfbmFtZSk6CiAgICBpbXBvcnQgY3R5cGVzCgogICAgY3NpZGxfY29uc3QgPSB7CiAgICAgICAgIkNTSURMX0FQUERBVEEiOiAyNiwKICAgICAgICAiQ1NJRExfQ09NTU9OX0FQUERBVEEiOiAzNSwKICAgICAgICAiQ1NJRExfTE9DQUxfQVBQREFUQSI6IDI4LAogICAgfVtjc2lkbF9uYW1lXQoKICAgIGJ1ZiA9IGN0eXBlcy5jcmVhdGVfdW5pY29kZV9idWZmZXIoMTAyNCkKICAgIGN0eXBlcy53aW5kbGwuc2hlbGwzMi5TSEdldEZvbGRlclBhdGhXKE5vbmUsIGNzaWRsX2NvbnN0LCBOb25lLCAwLCBidWYpCgogICAgIyBEb3duZ3JhZGUgdG8gc2hvcnQgcGF0aCBuYW1lIGlmIGhhdmUgaGlnaGJpdCBjaGFycy4gU2VlCiAgICAjIDxodHRwOi8vYnVncy5hY3RpdmVzdGF0ZS5jb20vc2hvd19idWcuY2dpP2lkPTg1MDk5Pi4KICAgIGhhc19oaWdoX2NoYXIgPSBGYWxzZQogICAgZm9yIGMgaW4gYnVmOgogICAgICAgIGlmIG9yZChjKSA+IDI1NToKICAgICAgICAgICAgaGFzX2hpZ2hfY2hhciA9IFRydWUKICAgICAgICAgICAgYnJlYWsKICAgIGlmIGhhc19oaWdoX2NoYXI6CiAgICAgICAgYnVmMiA9IGN0eXBlcy5jcmVhdGVfdW5pY29kZV9idWZmZXIoMTAyNCkKICAgICAgICBpZiBjdHlwZXMud2luZGxsLmtlcm5lbDMyLkdldFNob3J0UGF0aE5hbWVXKGJ1Zi52YWx1ZSwgYnVmMiwgMTAyNCk6CiAgICAgICAgICAgIGJ1ZiA9IGJ1ZjIKCiAgICByZXR1cm4gYnVmLnZhbHVlCgpkZWYgX2dldF93aW5fZm9sZGVyX3dpdGhfam5hKGNzaWRsX25hbWUpOgogICAgaW1wb3J0IGFycmF5CiAgICBmcm9tIGNvbS5zdW4gaW1wb3J0IGpuYQogICAgZnJvbSBjb20uc3VuLmpuYS5wbGF0Zm9ybSBpbXBvcnQgd2luMzIKCiAgICBidWZfc2l6ZSA9IHdpbjMyLldpbkRlZi5NQVhfUEFUSCAqIDIKICAgIGJ1ZiA9IGFycmF5Lnplcm9zKCdjJywgYnVmX3NpemUpCiAgICBzaGVsbCA9IHdpbjMyLlNoZWxsMzIuSU5TVEFOQ0UKICAgIHNoZWxsLlNIR2V0Rm9sZGVyUGF0aChOb25lLCBnZXRhdHRyKHdpbjMyLlNobE9iaiwgY3NpZGxfbmFtZSksIE5vbmUsIHdpbjMyLlNobE9iai5TSEdGUF9UWVBFX0NVUlJFTlQsIGJ1ZikKICAgIGRpciA9IGpuYS5OYXRpdmUudG9TdHJpbmcoYnVmLnRvc3RyaW5nKCkpLnJzdHJpcCgiXDAiKQoKICAgICMgRG93bmdyYWRlIHRvIHNob3J0IHBhdGggbmFtZSBpZiBoYXZlIGhpZ2hiaXQgY2hhcnMuIFNlZQogICAgIyA8aHR0cDovL2J1Z3MuYWN0aXZlc3RhdGUuY29tL3Nob3dfYnVnLmNnaT9pZD04NTA5OT4uCiAgICBoYXNfaGlnaF9jaGFyID0gRmFsc2UKICAgIGZvciBjIGluIGRpcjoKICAgICAgICBpZiBvcmQoYykgPiAyNTU6CiAgICAgICAgICAgIGhhc19oaWdoX2NoYXIgPSBUcnVlCiAgICAgICAgICAgIGJyZWFrCiAgICBpZiBoYXNfaGlnaF9jaGFyOgogICAgICAgIGJ1ZiA9IGFycmF5Lnplcm9zKCdjJywgYnVmX3NpemUpCiAgICAgICAga2VybmVsID0gd2luMzIuS2VybmVsMzIuSU5TVEFOQ0UKICAgICAgICBpZiBrZXJuZWwuR2V0U2hvcnRQYXRoTmFtZShkaXIsIGJ1ZiwgYnVmX3NpemUpOgogICAgICAgICAgICBkaXIgPSBqbmEuTmF0aXZlLnRvU3RyaW5nKGJ1Zi50b3N0cmluZygpKS5yc3RyaXAoIlwwIikKCiAgICByZXR1cm4gZGlyCgppZiBzeXN0ZW0gPT0gIndpbjMyIjoKICAgIHRyeToKICAgICAgICBpbXBvcnQgd2luMzJjb20uc2hlbGwKICAgICAgICBfZ2V0X3dpbl9mb2xkZXIgPSBfZ2V0X3dpbl9mb2xkZXJfd2l0aF9weXdpbjMyCiAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBmcm9tIGN0eXBlcyBpbXBvcnQgd2luZGxsCiAgICAgICAgICAgIF9nZXRfd2luX2ZvbGRlciA9IF9nZXRfd2luX2ZvbGRlcl93aXRoX2N0eXBlcwogICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgaW1wb3J0IGNvbS5zdW4uam5hCiAgICAgICAgICAgICAgICBfZ2V0X3dpbl9mb2xkZXIgPSBfZ2V0X3dpbl9mb2xkZXJfd2l0aF9qbmEKICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgICAgICAgICAgX2dldF93aW5fZm9sZGVyID0gX2dldF93aW5fZm9sZGVyX2Zyb21fcmVnaXN0cnkKCgojLS0tLSBzZWxmIHRlc3QgY29kZQoKaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgIGFwcG5hbWUgPSAiTXlBcHAiCiAgICBhcHBhdXRob3IgPSAiTXlDb21wYW55IgoKICAgIHByb3BzID0gKCJ1c2VyX2RhdGFfZGlyIiwKICAgICAgICAgICAgICJ1c2VyX2NvbmZpZ19kaXIiLAogICAgICAgICAgICAgInVzZXJfY2FjaGVfZGlyIiwKICAgICAgICAgICAgICJ1c2VyX3N0YXRlX2RpciIsCiAgICAgICAgICAgICAidXNlcl9sb2dfZGlyIiwKICAgICAgICAgICAgICJzaXRlX2RhdGFfZGlyIiwKICAgICAgICAgICAgICJzaXRlX2NvbmZpZ19kaXIiKQoKICAgIHByaW50KCItLSBhcHAgZGlycyAlcyAtLSIgJSBfX3ZlcnNpb25fXykKCiAgICBwcmludCgiLS0gYXBwIGRpcnMgKHdpdGggb3B0aW9uYWwgJ3ZlcnNpb24nKSIpCiAgICBkaXJzID0gQXBwRGlycyhhcHBuYW1lLCBhcHBhdXRob3IsIHZlcnNpb249IjEuMCIpCiAgICBmb3IgcHJvcCBpbiBwcm9wczoKICAgICAgICBwcmludCgiJXM6ICVzIiAlIChwcm9wLCBnZXRhdHRyKGRpcnMsIHByb3ApKSkKCiAgICBwcmludCgiXG4tLSBhcHAgZGlycyAod2l0aG91dCBvcHRpb25hbCAndmVyc2lvbicpIikKICAgIGRpcnMgPSBBcHBEaXJzKGFwcG5hbWUsIGFwcGF1dGhvcikKICAgIGZvciBwcm9wIGluIHByb3BzOgogICAgICAgIHByaW50KCIlczogJXMiICUgKHByb3AsIGdldGF0dHIoZGlycywgcHJvcCkpKQoKICAgIHByaW50KCJcbi0tIGFwcCBkaXJzICh3aXRob3V0IG9wdGlvbmFsICdhcHBhdXRob3InKSIpCiAgICBkaXJzID0gQXBwRGlycyhhcHBuYW1lKQogICAgZm9yIHByb3AgaW4gcHJvcHM6CiAgICAgICAgcHJpbnQoIiVzOiAlcyIgJSAocHJvcCwgZ2V0YXR0cihkaXJzLCBwcm9wKSkpCgogICAgcHJpbnQoIlxuLS0gYXBwIGRpcnMgKHdpdGggZGlzYWJsZWQgJ2FwcGF1dGhvcicpIikKICAgIGRpcnMgPSBBcHBEaXJzKGFwcG5hbWUsIGFwcGF1dGhvcj1GYWxzZSkKICAgIGZvciBwcm9wIGluIHByb3BzOgogICAgICAgIHByaW50KCIlczogJXMiICUgKHByb3AsIGdldGF0dHIoZGlycywgcHJvcCkpKQpQSwMEFAAAAAAAAAAhADwpWMbQAgAA0AIAAFEAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy9fX2Fib3V0X18ucHkjIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24KIyAyLjAsIGFuZCB0aGUgQlNEIExpY2Vuc2UuIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcmVwb3NpdG9yeQojIGZvciBjb21wbGV0ZSBkZXRhaWxzLgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHByaW50X2Z1bmN0aW9uCgpfX2FsbF9fID0gWwogICAgIl9fdGl0bGVfXyIsICJfX3N1bW1hcnlfXyIsICJfX3VyaV9fIiwgIl9fdmVyc2lvbl9fIiwgIl9fYXV0aG9yX18iLAogICAgIl9fZW1haWxfXyIsICJfX2xpY2Vuc2VfXyIsICJfX2NvcHlyaWdodF9fIiwKXQoKX190aXRsZV9fID0gInBhY2thZ2luZyIKX19zdW1tYXJ5X18gPSAiQ29yZSB1dGlsaXRpZXMgZm9yIFB5dGhvbiBwYWNrYWdlcyIKX191cmlfXyA9ICJodHRwczovL2dpdGh1Yi5jb20vcHlwYS9wYWNrYWdpbmciCgpfX3ZlcnNpb25fXyA9ICIxNi44IgoKX19hdXRob3JfXyA9ICJEb25hbGQgU3R1ZmZ0IGFuZCBpbmRpdmlkdWFsIGNvbnRyaWJ1dG9ycyIKX19lbWFpbF9fID0gImRvbmFsZEBzdHVmZnQuaW8iCgpfX2xpY2Vuc2VfXyA9ICJCU0Qgb3IgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wIgpfX2NvcHlyaWdodF9fID0gIkNvcHlyaWdodCAyMDE0LTIwMTYgJXMiICUgX19hdXRob3JfXwpQSwMEFAAAAAAAAAAhAIF2lsoBAgAAAQIAAFAAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy9fX2luaXRfXy5weSMgVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbgojIDIuMCwgYW5kIHRoZSBCU0QgTGljZW5zZS4gU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyByZXBvc2l0b3J5CiMgZm9yIGNvbXBsZXRlIGRldGFpbHMuCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgcHJpbnRfZnVuY3Rpb24KCmZyb20gLl9fYWJvdXRfXyBpbXBvcnQgKAogICAgX19hdXRob3JfXywgX19jb3B5cmlnaHRfXywgX19lbWFpbF9fLCBfX2xpY2Vuc2VfXywgX19zdW1tYXJ5X18sIF9fdGl0bGVfXywKICAgIF9fdXJpX18sIF9fdmVyc2lvbl9fCikKCl9fYWxsX18gPSBbCiAgICAiX190aXRsZV9fIiwgIl9fc3VtbWFyeV9fIiwgIl9fdXJpX18iLCAiX192ZXJzaW9uX18iLCAiX19hdXRob3JfXyIsCiAgICAiX19lbWFpbF9fIiwgIl9fbGljZW5zZV9fIiwgIl9fY29weXJpZ2h0X18iLApdClBLAwQUAAAAAAAAACEA5mlK41wDAABcAwAATwAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9wa2dfcmVzb3VyY2VzL192ZW5kb3IvcGFja2FnaW5nL19jb21wYXQucHkjIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24KIyAyLjAsIGFuZCB0aGUgQlNEIExpY2Vuc2UuIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcmVwb3NpdG9yeQojIGZvciBjb21wbGV0ZSBkZXRhaWxzLgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHByaW50X2Z1bmN0aW9uCgppbXBvcnQgc3lzCgoKUFkyID0gc3lzLnZlcnNpb25faW5mb1swXSA9PSAyClBZMyA9IHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMwoKIyBmbGFrZTg6IG5vcWEKCmlmIFBZMzoKICAgIHN0cmluZ190eXBlcyA9IHN0ciwKZWxzZToKICAgIHN0cmluZ190eXBlcyA9IGJhc2VzdHJpbmcsCgoKZGVmIHdpdGhfbWV0YWNsYXNzKG1ldGEsICpiYXNlcyk6CiAgICAiIiIKICAgIENyZWF0ZSBhIGJhc2UgY2xhc3Mgd2l0aCBhIG1ldGFjbGFzcy4KICAgICIiIgogICAgIyBUaGlzIHJlcXVpcmVzIGEgYml0IG9mIGV4cGxhbmF0aW9uOiB0aGUgYmFzaWMgaWRlYSBpcyB0byBtYWtlIGEgZHVtbXkKICAgICMgbWV0YWNsYXNzIGZvciBvbmUgbGV2ZWwgb2YgY2xhc3MgaW5zdGFudGlhdGlvbiB0aGF0IHJlcGxhY2VzIGl0c2VsZiB3aXRoCiAgICAjIHRoZSBhY3R1YWwgbWV0YWNsYXNzLgogICAgY2xhc3MgbWV0YWNsYXNzKG1ldGEpOgogICAgICAgIGRlZiBfX25ld19fKGNscywgbmFtZSwgdGhpc19iYXNlcywgZCk6CiAgICAgICAgICAgIHJldHVybiBtZXRhKG5hbWUsIGJhc2VzLCBkKQogICAgcmV0dXJuIHR5cGUuX19uZXdfXyhtZXRhY2xhc3MsICd0ZW1wb3JhcnlfY2xhc3MnLCAoKSwge30pClBLAwQUAAAAAAAAACEA+v2kEogFAACIBQAAUwAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9wa2dfcmVzb3VyY2VzL192ZW5kb3IvcGFja2FnaW5nL19zdHJ1Y3R1cmVzLnB5IyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uCiMgMi4wLCBhbmQgdGhlIEJTRCBMaWNlbnNlLiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHJlcG9zaXRvcnkKIyBmb3IgY29tcGxldGUgZGV0YWlscy4KZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCBwcmludF9mdW5jdGlvbgoKCmNsYXNzIEluZmluaXR5KG9iamVjdCk6CgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiSW5maW5pdHkiCgogICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgICAgIHJldHVybiBoYXNoKHJlcHIoc2VsZikpCgogICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZGVmIF9fbGVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKQoKICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBub3QgaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pCgogICAgZGVmIF9fZ3RfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgX19nZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBfX25lZ19fKHNlbGYpOgogICAgICAgIHJldHVybiBOZWdhdGl2ZUluZmluaXR5CgpJbmZpbml0eSA9IEluZmluaXR5KCkKCgpjbGFzcyBOZWdhdGl2ZUluZmluaXR5KG9iamVjdCk6CgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiLUluZmluaXR5IgoKICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKICAgICAgICByZXR1cm4gaGFzaChyZXByKHNlbGYpKQoKICAgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIF9fbGVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pCgogICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIG5vdCBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXykKCiAgICBkZWYgX19ndF9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgX19nZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgX19uZWdfXyhzZWxmKToKICAgICAgICByZXR1cm4gSW5maW5pdHkKCk5lZ2F0aXZlSW5maW5pdHkgPSBOZWdhdGl2ZUluZmluaXR5KCkKUEsDBBQAAAAAAAAAIQAw+BPcOCAAADggAABPAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3BrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvbWFya2Vycy5weSMgVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbgojIDIuMCwgYW5kIHRoZSBCU0QgTGljZW5zZS4gU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyByZXBvc2l0b3J5CiMgZm9yIGNvbXBsZXRlIGRldGFpbHMuCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgcHJpbnRfZnVuY3Rpb24KCmltcG9ydCBvcGVyYXRvcgppbXBvcnQgb3MKaW1wb3J0IHBsYXRmb3JtCmltcG9ydCBzeXMKCmZyb20gcGtnX3Jlc291cmNlcy5leHRlcm4ucHlwYXJzaW5nIGltcG9ydCBQYXJzZUV4Y2VwdGlvbiwgUGFyc2VSZXN1bHRzLCBzdHJpbmdTdGFydCwgc3RyaW5nRW5kCmZyb20gcGtnX3Jlc291cmNlcy5leHRlcm4ucHlwYXJzaW5nIGltcG9ydCBaZXJvT3JNb3JlLCBHcm91cCwgRm9yd2FyZCwgUXVvdGVkU3RyaW5nCmZyb20gcGtnX3Jlc291cmNlcy5leHRlcm4ucHlwYXJzaW5nIGltcG9ydCBMaXRlcmFsIGFzIEwgICMgbm9xYQoKZnJvbSAuX2NvbXBhdCBpbXBvcnQgc3RyaW5nX3R5cGVzCmZyb20gLnNwZWNpZmllcnMgaW1wb3J0IFNwZWNpZmllciwgSW52YWxpZFNwZWNpZmllcgoKCl9fYWxsX18gPSBbCiAgICAiSW52YWxpZE1hcmtlciIsICJVbmRlZmluZWRDb21wYXJpc29uIiwgIlVuZGVmaW5lZEVudmlyb25tZW50TmFtZSIsCiAgICAiTWFya2VyIiwgImRlZmF1bHRfZW52aXJvbm1lbnQiLApdCgoKY2xhc3MgSW52YWxpZE1hcmtlcihWYWx1ZUVycm9yKToKICAgICIiIgogICAgQW4gaW52YWxpZCBtYXJrZXIgd2FzIGZvdW5kLCB1c2VycyBzaG91bGQgcmVmZXIgdG8gUEVQIDUwOC4KICAgICIiIgoKCmNsYXNzIFVuZGVmaW5lZENvbXBhcmlzb24oVmFsdWVFcnJvcik6CiAgICAiIiIKICAgIEFuIGludmFsaWQgb3BlcmF0aW9uIHdhcyBhdHRlbXB0ZWQgb24gYSB2YWx1ZSB0aGF0IGRvZXNuJ3Qgc3VwcG9ydCBpdC4KICAgICIiIgoKCmNsYXNzIFVuZGVmaW5lZEVudmlyb25tZW50TmFtZShWYWx1ZUVycm9yKToKICAgICIiIgogICAgQSBuYW1lIHdhcyBhdHRlbXB0ZWQgdG8gYmUgdXNlZCB0aGF0IGRvZXMgbm90IGV4aXN0IGluc2lkZSBvZiB0aGUKICAgIGVudmlyb25tZW50LgogICAgIiIiCgoKY2xhc3MgTm9kZShvYmplY3QpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWx1ZSk6CiAgICAgICAgc2VsZi52YWx1ZSA9IHZhbHVlCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHN0cihzZWxmLnZhbHVlKQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIjx7MH0oezEhcn0pPiIuZm9ybWF0KHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzdHIoc2VsZikpCgogICAgZGVmIHNlcmlhbGl6ZShzZWxmKToKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCgoKY2xhc3MgVmFyaWFibGUoTm9kZSk6CgogICAgZGVmIHNlcmlhbGl6ZShzZWxmKToKICAgICAgICByZXR1cm4gc3RyKHNlbGYpCgoKY2xhc3MgVmFsdWUoTm9kZSk6CgogICAgZGVmIHNlcmlhbGl6ZShzZWxmKToKICAgICAgICByZXR1cm4gJyJ7MH0iJy5mb3JtYXQoc2VsZikKCgpjbGFzcyBPcChOb2RlKToKCiAgICBkZWYgc2VyaWFsaXplKHNlbGYpOgogICAgICAgIHJldHVybiBzdHIoc2VsZikKCgpWQVJJQUJMRSA9ICgKICAgIEwoImltcGxlbWVudGF0aW9uX3ZlcnNpb24iKSB8CiAgICBMKCJwbGF0Zm9ybV9weXRob25faW1wbGVtZW50YXRpb24iKSB8CiAgICBMKCJpbXBsZW1lbnRhdGlvbl9uYW1lIikgfAogICAgTCgicHl0aG9uX2Z1bGxfdmVyc2lvbiIpIHwKICAgIEwoInBsYXRmb3JtX3JlbGVhc2UiKSB8CiAgICBMKCJwbGF0Zm9ybV92ZXJzaW9uIikgfAogICAgTCgicGxhdGZvcm1fbWFjaGluZSIpIHwKICAgIEwoInBsYXRmb3JtX3N5c3RlbSIpIHwKICAgIEwoInB5dGhvbl92ZXJzaW9uIikgfAogICAgTCgic3lzX3BsYXRmb3JtIikgfAogICAgTCgib3NfbmFtZSIpIHwKICAgIEwoIm9zLm5hbWUiKSB8ICAjIFBFUC0zNDUKICAgIEwoInN5cy5wbGF0Zm9ybSIpIHwgICMgUEVQLTM0NQogICAgTCgicGxhdGZvcm0udmVyc2lvbiIpIHwgICMgUEVQLTM0NQogICAgTCgicGxhdGZvcm0ubWFjaGluZSIpIHwgICMgUEVQLTM0NQogICAgTCgicGxhdGZvcm0ucHl0aG9uX2ltcGxlbWVudGF0aW9uIikgfCAgIyBQRVAtMzQ1CiAgICBMKCJweXRob25faW1wbGVtZW50YXRpb24iKSB8ICAjIHVuZG9jdW1lbnRlZCBzZXR1cHRvb2xzIGxlZ2FjeQogICAgTCgiZXh0cmEiKQopCkFMSUFTRVMgPSB7CiAgICAnb3MubmFtZSc6ICdvc19uYW1lJywKICAgICdzeXMucGxhdGZvcm0nOiAnc3lzX3BsYXRmb3JtJywKICAgICdwbGF0Zm9ybS52ZXJzaW9uJzogJ3BsYXRmb3JtX3ZlcnNpb24nLAogICAgJ3BsYXRmb3JtLm1hY2hpbmUnOiAncGxhdGZvcm1fbWFjaGluZScsCiAgICAncGxhdGZvcm0ucHl0aG9uX2ltcGxlbWVudGF0aW9uJzogJ3BsYXRmb3JtX3B5dGhvbl9pbXBsZW1lbnRhdGlvbicsCiAgICAncHl0aG9uX2ltcGxlbWVudGF0aW9uJzogJ3BsYXRmb3JtX3B5dGhvbl9pbXBsZW1lbnRhdGlvbicKfQpWQVJJQUJMRS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcywgbCwgdDogVmFyaWFibGUoQUxJQVNFUy5nZXQodFswXSwgdFswXSkpKQoKVkVSU0lPTl9DTVAgPSAoCiAgICBMKCI9PT0iKSB8CiAgICBMKCI9PSIpIHwKICAgIEwoIj49IikgfAogICAgTCgiPD0iKSB8CiAgICBMKCIhPSIpIHwKICAgIEwoIn49IikgfAogICAgTCgiPiIpIHwKICAgIEwoIjwiKQopCgpNQVJLRVJfT1AgPSBWRVJTSU9OX0NNUCB8IEwoIm5vdCBpbiIpIHwgTCgiaW4iKQpNQVJLRVJfT1Auc2V0UGFyc2VBY3Rpb24obGFtYmRhIHMsIGwsIHQ6IE9wKHRbMF0pKQoKTUFSS0VSX1ZBTFVFID0gUXVvdGVkU3RyaW5nKCInIikgfCBRdW90ZWRTdHJpbmcoJyInKQpNQVJLRVJfVkFMVUUuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHMsIGwsIHQ6IFZhbHVlKHRbMF0pKQoKQk9PTE9QID0gTCgiYW5kIikgfCBMKCJvciIpCgpNQVJLRVJfVkFSID0gVkFSSUFCTEUgfCBNQVJLRVJfVkFMVUUKCk1BUktFUl9JVEVNID0gR3JvdXAoTUFSS0VSX1ZBUiArIE1BUktFUl9PUCArIE1BUktFUl9WQVIpCk1BUktFUl9JVEVNLnNldFBhcnNlQWN0aW9uKGxhbWJkYSBzLCBsLCB0OiB0dXBsZSh0WzBdKSkKCkxQQVJFTiA9IEwoIigiKS5zdXBwcmVzcygpClJQQVJFTiA9IEwoIikiKS5zdXBwcmVzcygpCgpNQVJLRVJfRVhQUiA9IEZvcndhcmQoKQpNQVJLRVJfQVRPTSA9IE1BUktFUl9JVEVNIHwgR3JvdXAoTFBBUkVOICsgTUFSS0VSX0VYUFIgKyBSUEFSRU4pCk1BUktFUl9FWFBSIDw8IE1BUktFUl9BVE9NICsgWmVyb09yTW9yZShCT09MT1AgKyBNQVJLRVJfRVhQUikKCk1BUktFUiA9IHN0cmluZ1N0YXJ0ICsgTUFSS0VSX0VYUFIgKyBzdHJpbmdFbmQKCgpkZWYgX2NvZXJjZV9wYXJzZV9yZXN1bHQocmVzdWx0cyk6CiAgICBpZiBpc2luc3RhbmNlKHJlc3VsdHMsIFBhcnNlUmVzdWx0cyk6CiAgICAgICAgcmV0dXJuIFtfY29lcmNlX3BhcnNlX3Jlc3VsdChpKSBmb3IgaSBpbiByZXN1bHRzXQogICAgZWxzZToKICAgICAgICByZXR1cm4gcmVzdWx0cwoKCmRlZiBfZm9ybWF0X21hcmtlcihtYXJrZXIsIGZpcnN0PVRydWUpOgogICAgYXNzZXJ0IGlzaW5zdGFuY2UobWFya2VyLCAobGlzdCwgdHVwbGUsIHN0cmluZ190eXBlcykpCgogICAgIyBTb21ldGltZXMgd2UgaGF2ZSBhIHN0cnVjdHVyZSBsaWtlIFtbLi4uXV0gd2hpY2ggaXMgYSBzaW5nbGUgaXRlbSBsaXN0CiAgICAjIHdoZXJlIHRoZSBzaW5nbGUgaXRlbSBpcyBpdHNlbGYgaXQncyBvd24gbGlzdC4gSW4gdGhhdCBjYXNlIHdlIHdhbnQgc2tpcAogICAgIyB0aGUgcmVzdCBvZiB0aGlzIGZ1bmN0aW9uIHNvIHRoYXQgd2UgZG9uJ3QgZ2V0IGV4dHJhbmVvdXMgKCkgb24gdGhlCiAgICAjIG91dHNpZGUuCiAgICBpZiAoaXNpbnN0YW5jZShtYXJrZXIsIGxpc3QpIGFuZCBsZW4obWFya2VyKSA9PSAxIGFuZAogICAgICAgICAgICBpc2luc3RhbmNlKG1hcmtlclswXSwgKGxpc3QsIHR1cGxlKSkpOgogICAgICAgIHJldHVybiBfZm9ybWF0X21hcmtlcihtYXJrZXJbMF0pCgogICAgaWYgaXNpbnN0YW5jZShtYXJrZXIsIGxpc3QpOgogICAgICAgIGlubmVyID0gKF9mb3JtYXRfbWFya2VyKG0sIGZpcnN0PUZhbHNlKSBmb3IgbSBpbiBtYXJrZXIpCiAgICAgICAgaWYgZmlyc3Q6CiAgICAgICAgICAgIHJldHVybiAiICIuam9pbihpbm5lcikKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gIigiICsgIiAiLmpvaW4oaW5uZXIpICsgIikiCiAgICBlbGlmIGlzaW5zdGFuY2UobWFya2VyLCB0dXBsZSk6CiAgICAgICAgcmV0dXJuICIgIi5qb2luKFttLnNlcmlhbGl6ZSgpIGZvciBtIGluIG1hcmtlcl0pCiAgICBlbHNlOgogICAgICAgIHJldHVybiBtYXJrZXIKCgpfb3BlcmF0b3JzID0gewogICAgImluIjogbGFtYmRhIGxocywgcmhzOiBsaHMgaW4gcmhzLAogICAgIm5vdCBpbiI6IGxhbWJkYSBsaHMsIHJoczogbGhzIG5vdCBpbiByaHMsCiAgICAiPCI6IG9wZXJhdG9yLmx0LAogICAgIjw9Ijogb3BlcmF0b3IubGUsCiAgICAiPT0iOiBvcGVyYXRvci5lcSwKICAgICIhPSI6IG9wZXJhdG9yLm5lLAogICAgIj49Ijogb3BlcmF0b3IuZ2UsCiAgICAiPiI6IG9wZXJhdG9yLmd0LAp9CgoKZGVmIF9ldmFsX29wKGxocywgb3AsIHJocyk6CiAgICB0cnk6CiAgICAgICAgc3BlYyA9IFNwZWNpZmllcigiIi5qb2luKFtvcC5zZXJpYWxpemUoKSwgcmhzXSkpCiAgICBleGNlcHQgSW52YWxpZFNwZWNpZmllcjoKICAgICAgICBwYXNzCiAgICBlbHNlOgogICAgICAgIHJldHVybiBzcGVjLmNvbnRhaW5zKGxocykKCiAgICBvcGVyID0gX29wZXJhdG9ycy5nZXQob3Auc2VyaWFsaXplKCkpCiAgICBpZiBvcGVyIGlzIE5vbmU6CiAgICAgICAgcmFpc2UgVW5kZWZpbmVkQ29tcGFyaXNvbigKICAgICAgICAgICAgIlVuZGVmaW5lZCB7MCFyfSBvbiB7MSFyfSBhbmQgezIhcn0uIi5mb3JtYXQob3AsIGxocywgcmhzKQogICAgICAgICkKCiAgICByZXR1cm4gb3BlcihsaHMsIHJocykKCgpfdW5kZWZpbmVkID0gb2JqZWN0KCkKCgpkZWYgX2dldF9lbnYoZW52aXJvbm1lbnQsIG5hbWUpOgogICAgdmFsdWUgPSBlbnZpcm9ubWVudC5nZXQobmFtZSwgX3VuZGVmaW5lZCkKCiAgICBpZiB2YWx1ZSBpcyBfdW5kZWZpbmVkOgogICAgICAgIHJhaXNlIFVuZGVmaW5lZEVudmlyb25tZW50TmFtZSgKICAgICAgICAgICAgInswIXJ9IGRvZXMgbm90IGV4aXN0IGluIGV2YWx1YXRpb24gZW52aXJvbm1lbnQuIi5mb3JtYXQobmFtZSkKICAgICAgICApCgogICAgcmV0dXJuIHZhbHVlCgoKZGVmIF9ldmFsdWF0ZV9tYXJrZXJzKG1hcmtlcnMsIGVudmlyb25tZW50KToKICAgIGdyb3VwcyA9IFtbXV0KCiAgICBmb3IgbWFya2VyIGluIG1hcmtlcnM6CiAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UobWFya2VyLCAobGlzdCwgdHVwbGUsIHN0cmluZ190eXBlcykpCgogICAgICAgIGlmIGlzaW5zdGFuY2UobWFya2VyLCBsaXN0KToKICAgICAgICAgICAgZ3JvdXBzWy0xXS5hcHBlbmQoX2V2YWx1YXRlX21hcmtlcnMobWFya2VyLCBlbnZpcm9ubWVudCkpCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKG1hcmtlciwgdHVwbGUpOgogICAgICAgICAgICBsaHMsIG9wLCByaHMgPSBtYXJrZXIKCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UobGhzLCBWYXJpYWJsZSk6CiAgICAgICAgICAgICAgICBsaHNfdmFsdWUgPSBfZ2V0X2VudihlbnZpcm9ubWVudCwgbGhzLnZhbHVlKQogICAgICAgICAgICAgICAgcmhzX3ZhbHVlID0gcmhzLnZhbHVlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBsaHNfdmFsdWUgPSBsaHMudmFsdWUKICAgICAgICAgICAgICAgIHJoc192YWx1ZSA9IF9nZXRfZW52KGVudmlyb25tZW50LCByaHMudmFsdWUpCgogICAgICAgICAgICBncm91cHNbLTFdLmFwcGVuZChfZXZhbF9vcChsaHNfdmFsdWUsIG9wLCByaHNfdmFsdWUpKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGFzc2VydCBtYXJrZXIgaW4gWyJhbmQiLCAib3IiXQogICAgICAgICAgICBpZiBtYXJrZXIgPT0gIm9yIjoKICAgICAgICAgICAgICAgIGdyb3Vwcy5hcHBlbmQoW10pCgogICAgcmV0dXJuIGFueShhbGwoaXRlbSkgZm9yIGl0ZW0gaW4gZ3JvdXBzKQoKCmRlZiBmb3JtYXRfZnVsbF92ZXJzaW9uKGluZm8pOgogICAgdmVyc2lvbiA9ICd7MC5tYWpvcn0uezAubWlub3J9LnswLm1pY3JvfScuZm9ybWF0KGluZm8pCiAgICBraW5kID0gaW5mby5yZWxlYXNlbGV2ZWwKICAgIGlmIGtpbmQgIT0gJ2ZpbmFsJzoKICAgICAgICB2ZXJzaW9uICs9IGtpbmRbMF0gKyBzdHIoaW5mby5zZXJpYWwpCiAgICByZXR1cm4gdmVyc2lvbgoKCmRlZiBkZWZhdWx0X2Vudmlyb25tZW50KCk6CiAgICBpZiBoYXNhdHRyKHN5cywgJ2ltcGxlbWVudGF0aW9uJyk6CiAgICAgICAgaXZlciA9IGZvcm1hdF9mdWxsX3ZlcnNpb24oc3lzLmltcGxlbWVudGF0aW9uLnZlcnNpb24pCiAgICAgICAgaW1wbGVtZW50YXRpb25fbmFtZSA9IHN5cy5pbXBsZW1lbnRhdGlvbi5uYW1lCiAgICBlbHNlOgogICAgICAgIGl2ZXIgPSAnMCcKICAgICAgICBpbXBsZW1lbnRhdGlvbl9uYW1lID0gJycKCiAgICByZXR1cm4gewogICAgICAgICJpbXBsZW1lbnRhdGlvbl9uYW1lIjogaW1wbGVtZW50YXRpb25fbmFtZSwKICAgICAgICAiaW1wbGVtZW50YXRpb25fdmVyc2lvbiI6IGl2ZXIsCiAgICAgICAgIm9zX25hbWUiOiBvcy5uYW1lLAogICAgICAgICJwbGF0Zm9ybV9tYWNoaW5lIjogcGxhdGZvcm0ubWFjaGluZSgpLAogICAgICAgICJwbGF0Zm9ybV9yZWxlYXNlIjogcGxhdGZvcm0ucmVsZWFzZSgpLAogICAgICAgICJwbGF0Zm9ybV9zeXN0ZW0iOiBwbGF0Zm9ybS5zeXN0ZW0oKSwKICAgICAgICAicGxhdGZvcm1fdmVyc2lvbiI6IHBsYXRmb3JtLnZlcnNpb24oKSwKICAgICAgICAicHl0aG9uX2Z1bGxfdmVyc2lvbiI6IHBsYXRmb3JtLnB5dGhvbl92ZXJzaW9uKCksCiAgICAgICAgInBsYXRmb3JtX3B5dGhvbl9pbXBsZW1lbnRhdGlvbiI6IHBsYXRmb3JtLnB5dGhvbl9pbXBsZW1lbnRhdGlvbigpLAogICAgICAgICJweXRob25fdmVyc2lvbiI6IHBsYXRmb3JtLnB5dGhvbl92ZXJzaW9uKClbOjNdLAogICAgICAgICJzeXNfcGxhdGZvcm0iOiBzeXMucGxhdGZvcm0sCiAgICB9CgoKY2xhc3MgTWFya2VyKG9iamVjdCk6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hcmtlcik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLl9tYXJrZXJzID0gX2NvZXJjZV9wYXJzZV9yZXN1bHQoTUFSS0VSLnBhcnNlU3RyaW5nKG1hcmtlcikpCiAgICAgICAgZXhjZXB0IFBhcnNlRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgIGVycl9zdHIgPSAiSW52YWxpZCBtYXJrZXI6IHswIXJ9LCBwYXJzZSBlcnJvciBhdCB7MSFyfSIuZm9ybWF0KAogICAgICAgICAgICAgICAgbWFya2VyLCBtYXJrZXJbZS5sb2M6ZS5sb2MgKyA4XSkKICAgICAgICAgICAgcmFpc2UgSW52YWxpZE1hcmtlcihlcnJfc3RyKQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJldHVybiBfZm9ybWF0X21hcmtlcihzZWxmLl9tYXJrZXJzKQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIjxNYXJrZXIoezAhcn0pPiIuZm9ybWF0KHN0cihzZWxmKSkKCiAgICBkZWYgZXZhbHVhdGUoc2VsZiwgZW52aXJvbm1lbnQ9Tm9uZSk6CiAgICAgICAgIiIiRXZhbHVhdGUgYSBtYXJrZXIuCgogICAgICAgIFJldHVybiB0aGUgYm9vbGVhbiBmcm9tIGV2YWx1YXRpbmcgdGhlIGdpdmVuIG1hcmtlciBhZ2FpbnN0IHRoZQogICAgICAgIGVudmlyb25tZW50LiBlbnZpcm9ubWVudCBpcyBhbiBvcHRpb25hbCBhcmd1bWVudCB0byBvdmVycmlkZSBhbGwgb3IKICAgICAgICBwYXJ0IG9mIHRoZSBkZXRlcm1pbmVkIGVudmlyb25tZW50LgoKICAgICAgICBUaGUgZW52aXJvbm1lbnQgaXMgZGV0ZXJtaW5lZCBmcm9tIHRoZSBjdXJyZW50IFB5dGhvbiBwcm9jZXNzLgogICAgICAgICIiIgogICAgICAgIGN1cnJlbnRfZW52aXJvbm1lbnQgPSBkZWZhdWx0X2Vudmlyb25tZW50KCkKICAgICAgICBpZiBlbnZpcm9ubWVudCBpcyBub3QgTm9uZToKICAgICAgICAgICAgY3VycmVudF9lbnZpcm9ubWVudC51cGRhdGUoZW52aXJvbm1lbnQpCgogICAgICAgIHJldHVybiBfZXZhbHVhdGVfbWFya2VycyhzZWxmLl9tYXJrZXJzLCBjdXJyZW50X2Vudmlyb25tZW50KQpQSwMEFAAAAAAAAAAhAKWGHdsDEQAAAxEAAFQAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy9yZXF1aXJlbWVudHMucHkjIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24KIyAyLjAsIGFuZCB0aGUgQlNEIExpY2Vuc2UuIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcmVwb3NpdG9yeQojIGZvciBjb21wbGV0ZSBkZXRhaWxzLgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHByaW50X2Z1bmN0aW9uCgppbXBvcnQgc3RyaW5nCmltcG9ydCByZQoKZnJvbSBwa2dfcmVzb3VyY2VzLmV4dGVybi5weXBhcnNpbmcgaW1wb3J0IHN0cmluZ1N0YXJ0LCBzdHJpbmdFbmQsIG9yaWdpbmFsVGV4dEZvciwgUGFyc2VFeGNlcHRpb24KZnJvbSBwa2dfcmVzb3VyY2VzLmV4dGVybi5weXBhcnNpbmcgaW1wb3J0IFplcm9Pck1vcmUsIFdvcmQsIE9wdGlvbmFsLCBSZWdleCwgQ29tYmluZQpmcm9tIHBrZ19yZXNvdXJjZXMuZXh0ZXJuLnB5cGFyc2luZyBpbXBvcnQgTGl0ZXJhbCBhcyBMICAjIG5vcWEKZnJvbSBwa2dfcmVzb3VyY2VzLmV4dGVybi5zaXgubW92ZXMudXJsbGliIGltcG9ydCBwYXJzZSBhcyB1cmxwYXJzZQoKZnJvbSAubWFya2VycyBpbXBvcnQgTUFSS0VSX0VYUFIsIE1hcmtlcgpmcm9tIC5zcGVjaWZpZXJzIGltcG9ydCBMZWdhY3lTcGVjaWZpZXIsIFNwZWNpZmllciwgU3BlY2lmaWVyU2V0CgoKY2xhc3MgSW52YWxpZFJlcXVpcmVtZW50KFZhbHVlRXJyb3IpOgogICAgIiIiCiAgICBBbiBpbnZhbGlkIHJlcXVpcmVtZW50IHdhcyBmb3VuZCwgdXNlcnMgc2hvdWxkIHJlZmVyIHRvIFBFUCA1MDguCiAgICAiIiIKCgpBTFBIQU5VTSA9IFdvcmQoc3RyaW5nLmFzY2lpX2xldHRlcnMgKyBzdHJpbmcuZGlnaXRzKQoKTEJSQUNLRVQgPSBMKCJbIikuc3VwcHJlc3MoKQpSQlJBQ0tFVCA9IEwoIl0iKS5zdXBwcmVzcygpCkxQQVJFTiA9IEwoIigiKS5zdXBwcmVzcygpClJQQVJFTiA9IEwoIikiKS5zdXBwcmVzcygpCkNPTU1BID0gTCgiLCIpLnN1cHByZXNzKCkKU0VNSUNPTE9OID0gTCgiOyIpLnN1cHByZXNzKCkKQVQgPSBMKCJAIikuc3VwcHJlc3MoKQoKUFVOQ1RVQVRJT04gPSBXb3JkKCItXy4iKQpJREVOVElGSUVSX0VORCA9IEFMUEhBTlVNIHwgKFplcm9Pck1vcmUoUFVOQ1RVQVRJT04pICsgQUxQSEFOVU0pCklERU5USUZJRVIgPSBDb21iaW5lKEFMUEhBTlVNICsgWmVyb09yTW9yZShJREVOVElGSUVSX0VORCkpCgpOQU1FID0gSURFTlRJRklFUigibmFtZSIpCkVYVFJBID0gSURFTlRJRklFUgoKVVJJID0gUmVnZXgocidbXiBdKycpKCJ1cmwiKQpVUkwgPSAoQVQgKyBVUkkpCgpFWFRSQVNfTElTVCA9IEVYVFJBICsgWmVyb09yTW9yZShDT01NQSArIEVYVFJBKQpFWFRSQVMgPSAoTEJSQUNLRVQgKyBPcHRpb25hbChFWFRSQVNfTElTVCkgKyBSQlJBQ0tFVCkoImV4dHJhcyIpCgpWRVJTSU9OX1BFUDQ0MCA9IFJlZ2V4KFNwZWNpZmllci5fcmVnZXhfc3RyLCByZS5WRVJCT1NFIHwgcmUuSUdOT1JFQ0FTRSkKVkVSU0lPTl9MRUdBQ1kgPSBSZWdleChMZWdhY3lTcGVjaWZpZXIuX3JlZ2V4X3N0ciwgcmUuVkVSQk9TRSB8IHJlLklHTk9SRUNBU0UpCgpWRVJTSU9OX09ORSA9IFZFUlNJT05fUEVQNDQwIF4gVkVSU0lPTl9MRUdBQ1kKVkVSU0lPTl9NQU5ZID0gQ29tYmluZShWRVJTSU9OX09ORSArIFplcm9Pck1vcmUoQ09NTUEgKyBWRVJTSU9OX09ORSksCiAgICAgICAgICAgICAgICAgICAgICAgam9pblN0cmluZz0iLCIsIGFkamFjZW50PUZhbHNlKSgiX3Jhd19zcGVjIikKX1ZFUlNJT05fU1BFQyA9IE9wdGlvbmFsKCgoTFBBUkVOICsgVkVSU0lPTl9NQU5ZICsgUlBBUkVOKSB8IFZFUlNJT05fTUFOWSkpCl9WRVJTSU9OX1NQRUMuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHMsIGwsIHQ6IHQuX3Jhd19zcGVjIG9yICcnKQoKVkVSU0lPTl9TUEVDID0gb3JpZ2luYWxUZXh0Rm9yKF9WRVJTSU9OX1NQRUMpKCJzcGVjaWZpZXIiKQpWRVJTSU9OX1NQRUMuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHMsIGwsIHQ6IHRbMV0pCgpNQVJLRVJfRVhQUiA9IG9yaWdpbmFsVGV4dEZvcihNQVJLRVJfRVhQUigpKSgibWFya2VyIikKTUFSS0VSX0VYUFIuc2V0UGFyc2VBY3Rpb24oCiAgICBsYW1iZGEgcywgbCwgdDogTWFya2VyKHNbdC5fb3JpZ2luYWxfc3RhcnQ6dC5fb3JpZ2luYWxfZW5kXSkKKQpNQVJLRVJfU0VQRVJBVE9SID0gU0VNSUNPTE9OCk1BUktFUiA9IE1BUktFUl9TRVBFUkFUT1IgKyBNQVJLRVJfRVhQUgoKVkVSU0lPTl9BTkRfTUFSS0VSID0gVkVSU0lPTl9TUEVDICsgT3B0aW9uYWwoTUFSS0VSKQpVUkxfQU5EX01BUktFUiA9IFVSTCArIE9wdGlvbmFsKE1BUktFUikKCk5BTUVEX1JFUVVJUkVNRU5UID0gXAogICAgTkFNRSArIE9wdGlvbmFsKEVYVFJBUykgKyAoVVJMX0FORF9NQVJLRVIgfCBWRVJTSU9OX0FORF9NQVJLRVIpCgpSRVFVSVJFTUVOVCA9IHN0cmluZ1N0YXJ0ICsgTkFNRURfUkVRVUlSRU1FTlQgKyBzdHJpbmdFbmQKCgpjbGFzcyBSZXF1aXJlbWVudChvYmplY3QpOgogICAgIiIiUGFyc2UgYSByZXF1aXJlbWVudC4KCiAgICBQYXJzZSBhIGdpdmVuIHJlcXVpcmVtZW50IHN0cmluZyBpbnRvIGl0cyBwYXJ0cywgc3VjaCBhcyBuYW1lLCBzcGVjaWZpZXIsCiAgICBVUkwsIGFuZCBleHRyYXMuIFJhaXNlcyBJbnZhbGlkUmVxdWlyZW1lbnQgb24gYSBiYWRseS1mb3JtZWQgcmVxdWlyZW1lbnQKICAgIHN0cmluZy4KICAgICIiIgoKICAgICMgVE9ETzogQ2FuIHdlIHRlc3Qgd2hldGhlciBzb21ldGhpbmcgaXMgY29udGFpbmVkIHdpdGhpbiBhIHJlcXVpcmVtZW50PwogICAgIyAgICAgICBJZiBzbyBob3cgZG8gd2UgZG8gdGhhdD8gRG8gd2UgbmVlZCB0byB0ZXN0IGFnYWluc3QgdGhlIF9uYW1lXyBvZgogICAgIyAgICAgICB0aGUgdGhpbmcgYXMgd2VsbCBhcyB0aGUgdmVyc2lvbj8gV2hhdCBhYm91dCB0aGUgbWFya2Vycz8KICAgICMgVE9ETzogQ2FuIHdlIG5vcm1hbGl6ZSB0aGUgbmFtZSBhbmQgZXh0cmEgbmFtZT8KCiAgICBkZWYgX19pbml0X18oc2VsZiwgcmVxdWlyZW1lbnRfc3RyaW5nKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJlcSA9IFJFUVVJUkVNRU5ULnBhcnNlU3RyaW5nKHJlcXVpcmVtZW50X3N0cmluZykKICAgICAgICBleGNlcHQgUGFyc2VFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgcmFpc2UgSW52YWxpZFJlcXVpcmVtZW50KAogICAgICAgICAgICAgICAgIkludmFsaWQgcmVxdWlyZW1lbnQsIHBhcnNlIGVycm9yIGF0IFwiezAhcn1cIiIuZm9ybWF0KAogICAgICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50X3N0cmluZ1tlLmxvYzplLmxvYyArIDhdKSkKCiAgICAgICAgc2VsZi5uYW1lID0gcmVxLm5hbWUKICAgICAgICBpZiByZXEudXJsOgogICAgICAgICAgICBwYXJzZWRfdXJsID0gdXJscGFyc2UudXJscGFyc2UocmVxLnVybCkKICAgICAgICAgICAgaWYgbm90IChwYXJzZWRfdXJsLnNjaGVtZSBhbmQgcGFyc2VkX3VybC5uZXRsb2MpIG9yICgKICAgICAgICAgICAgICAgICAgICBub3QgcGFyc2VkX3VybC5zY2hlbWUgYW5kIG5vdCBwYXJzZWRfdXJsLm5ldGxvYyk6CiAgICAgICAgICAgICAgICByYWlzZSBJbnZhbGlkUmVxdWlyZW1lbnQoIkludmFsaWQgVVJMIGdpdmVuIikKICAgICAgICAgICAgc2VsZi51cmwgPSByZXEudXJsCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi51cmwgPSBOb25lCiAgICAgICAgc2VsZi5leHRyYXMgPSBzZXQocmVxLmV4dHJhcy5hc0xpc3QoKSBpZiByZXEuZXh0cmFzIGVsc2UgW10pCiAgICAgICAgc2VsZi5zcGVjaWZpZXIgPSBTcGVjaWZpZXJTZXQocmVxLnNwZWNpZmllcikKICAgICAgICBzZWxmLm1hcmtlciA9IHJlcS5tYXJrZXIgaWYgcmVxLm1hcmtlciBlbHNlIE5vbmUKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICBwYXJ0cyA9IFtzZWxmLm5hbWVdCgogICAgICAgIGlmIHNlbGYuZXh0cmFzOgogICAgICAgICAgICBwYXJ0cy5hcHBlbmQoIlt7MH1dIi5mb3JtYXQoIiwiLmpvaW4oc29ydGVkKHNlbGYuZXh0cmFzKSkpKQoKICAgICAgICBpZiBzZWxmLnNwZWNpZmllcjoKICAgICAgICAgICAgcGFydHMuYXBwZW5kKHN0cihzZWxmLnNwZWNpZmllcikpCgogICAgICAgIGlmIHNlbGYudXJsOgogICAgICAgICAgICBwYXJ0cy5hcHBlbmQoIkAgezB9Ii5mb3JtYXQoc2VsZi51cmwpKQoKICAgICAgICBpZiBzZWxmLm1hcmtlcjoKICAgICAgICAgICAgcGFydHMuYXBwZW5kKCI7IHswfSIuZm9ybWF0KHNlbGYubWFya2VyKSkKCiAgICAgICAgcmV0dXJuICIiLmpvaW4ocGFydHMpCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiPFJlcXVpcmVtZW50KHswIXJ9KT4iLmZvcm1hdChzdHIoc2VsZikpClBLAwQUAAAAAAAAACEAfEWDjHltAAB5bQAAUgAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9wa2dfcmVzb3VyY2VzL192ZW5kb3IvcGFja2FnaW5nL3NwZWNpZmllcnMucHkjIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24KIyAyLjAsIGFuZCB0aGUgQlNEIExpY2Vuc2UuIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcmVwb3NpdG9yeQojIGZvciBjb21wbGV0ZSBkZXRhaWxzLgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHByaW50X2Z1bmN0aW9uCgppbXBvcnQgYWJjCmltcG9ydCBmdW5jdG9vbHMKaW1wb3J0IGl0ZXJ0b29scwppbXBvcnQgcmUKCmZyb20gLl9jb21wYXQgaW1wb3J0IHN0cmluZ190eXBlcywgd2l0aF9tZXRhY2xhc3MKZnJvbSAudmVyc2lvbiBpbXBvcnQgVmVyc2lvbiwgTGVnYWN5VmVyc2lvbiwgcGFyc2UKCgpjbGFzcyBJbnZhbGlkU3BlY2lmaWVyKFZhbHVlRXJyb3IpOgogICAgIiIiCiAgICBBbiBpbnZhbGlkIHNwZWNpZmllciB3YXMgZm91bmQsIHVzZXJzIHNob3VsZCByZWZlciB0byBQRVAgNDQwLgogICAgIiIiCgoKY2xhc3MgQmFzZVNwZWNpZmllcih3aXRoX21ldGFjbGFzcyhhYmMuQUJDTWV0YSwgb2JqZWN0KSk6CgogICAgQGFiYy5hYnN0cmFjdG1ldGhvZAogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJucyB0aGUgc3RyIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgU3BlY2lmaWVyIGxpa2Ugb2JqZWN0LiBUaGlzCiAgICAgICAgc2hvdWxkIGJlIHJlcHJlc2VudGF0aXZlIG9mIHRoZSBTcGVjaWZpZXIgaXRzZWxmLgogICAgICAgICIiIgoKICAgIEBhYmMuYWJzdHJhY3RtZXRob2QKICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm5zIGEgaGFzaCB2YWx1ZSBmb3IgdGhpcyBTcGVjaWZpZXIgbGlrZSBvYmplY3QuCiAgICAgICAgIiIiCgogICAgQGFiYy5hYnN0cmFjdG1ldGhvZAogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJucyBhIGJvb2xlYW4gcmVwcmVzZW50aW5nIHdoZXRoZXIgb3Igbm90IHRoZSB0d28gU3BlY2lmaWVyIGxpa2UKICAgICAgICBvYmplY3RzIGFyZSBlcXVhbC4KICAgICAgICAiIiIKCiAgICBAYWJjLmFic3RyYWN0bWV0aG9kCiAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm5zIGEgYm9vbGVhbiByZXByZXNlbnRpbmcgd2hldGhlciBvciBub3QgdGhlIHR3byBTcGVjaWZpZXIgbGlrZQogICAgICAgIG9iamVjdHMgYXJlIG5vdCBlcXVhbC4KICAgICAgICAiIiIKCiAgICBAYWJjLmFic3RyYWN0cHJvcGVydHkKICAgIGRlZiBwcmVyZWxlYXNlcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHByZS1yZWxlYXNlcyBhcyBhIHdob2xlIGFyZSBhbGxvd2VkIGJ5IHRoaXMKICAgICAgICBzcGVjaWZpZXIuCiAgICAgICAgIiIiCgogICAgQHByZXJlbGVhc2VzLnNldHRlcgogICAgZGVmIHByZXJlbGVhc2VzKHNlbGYsIHZhbHVlKToKICAgICAgICAiIiIKICAgICAgICBTZXRzIHdoZXRoZXIgb3Igbm90IHByZS1yZWxlYXNlcyBhcyBhIHdob2xlIGFyZSBhbGxvd2VkIGJ5IHRoaXMKICAgICAgICBzcGVjaWZpZXIuCiAgICAgICAgIiIiCgogICAgQGFiYy5hYnN0cmFjdG1ldGhvZAogICAgZGVmIGNvbnRhaW5zKHNlbGYsIGl0ZW0sIHByZXJlbGVhc2VzPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIERldGVybWluZXMgaWYgdGhlIGdpdmVuIGl0ZW0gaXMgY29udGFpbmVkIHdpdGhpbiB0aGlzIHNwZWNpZmllci4KICAgICAgICAiIiIKCiAgICBAYWJjLmFic3RyYWN0bWV0aG9kCiAgICBkZWYgZmlsdGVyKHNlbGYsIGl0ZXJhYmxlLCBwcmVyZWxlYXNlcz1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBUYWtlcyBhbiBpdGVyYWJsZSBvZiBpdGVtcyBhbmQgZmlsdGVycyB0aGVtIHNvIHRoYXQgb25seSBpdGVtcyB3aGljaAogICAgICAgIGFyZSBjb250YWluZWQgd2l0aGluIHRoaXMgc3BlY2lmaWVyIGFyZSBhbGxvd2VkIGluIGl0LgogICAgICAgICIiIgoKCmNsYXNzIF9JbmRpdmlkdWFsU3BlY2lmaWVyKEJhc2VTcGVjaWZpZXIpOgoKICAgIF9vcGVyYXRvcnMgPSB7fQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzcGVjPSIiLCBwcmVyZWxlYXNlcz1Ob25lKToKICAgICAgICBtYXRjaCA9IHNlbGYuX3JlZ2V4LnNlYXJjaChzcGVjKQogICAgICAgIGlmIG5vdCBtYXRjaDoKICAgICAgICAgICAgcmFpc2UgSW52YWxpZFNwZWNpZmllcigiSW52YWxpZCBzcGVjaWZpZXI6ICd7MH0nIi5mb3JtYXQoc3BlYykpCgogICAgICAgIHNlbGYuX3NwZWMgPSAoCiAgICAgICAgICAgIG1hdGNoLmdyb3VwKCJvcGVyYXRvciIpLnN0cmlwKCksCiAgICAgICAgICAgIG1hdGNoLmdyb3VwKCJ2ZXJzaW9uIikuc3RyaXAoKSwKICAgICAgICApCgogICAgICAgICMgU3RvcmUgd2hldGhlciBvciBub3QgdGhpcyBTcGVjaWZpZXIgc2hvdWxkIGFjY2VwdCBwcmVyZWxlYXNlcwogICAgICAgIHNlbGYuX3ByZXJlbGVhc2VzID0gcHJlcmVsZWFzZXMKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcHJlID0gKAogICAgICAgICAgICAiLCBwcmVyZWxlYXNlcz17MCFyfSIuZm9ybWF0KHNlbGYucHJlcmVsZWFzZXMpCiAgICAgICAgICAgIGlmIHNlbGYuX3ByZXJlbGVhc2VzIGlzIG5vdCBOb25lCiAgICAgICAgICAgIGVsc2UgIiIKICAgICAgICApCgogICAgICAgIHJldHVybiAiPHswfSh7MSFyfXsyfSk+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+MC4wLmRldjAKICAgICAgICBpZiBub3QgcHJlcmVsZWFzZXMgYW5kIGl0ZW0uaXNfcHJlcmVsZWFzZToKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgICMgV2Ugc2ltcGx5IGRpc3BhdGNoIHRvIHRoZSB1bmRlcmx5aW5nIHNwZWNzIGhlcmUgdG8gbWFrZSBzdXJlIHRoYXQgdGhlCiAgICAgICAgIyBnaXZlbiB2ZXJzaW9uIGlzIGNvbnRhaW5lZCB3aXRoaW4gYWxsIG9mIHRoZW0uCiAgICAgICAgIyBOb3RlOiBUaGlzIHVzZSBvZiBhbGwoKSBoZXJlIG1lYW5zIHRoYXQgYW4gZW1wdHkgc2V0IG9mIHNwZWNpZmllcnMKICAgICAgICAjICAgICAgIHdpbGwgYWx3YXlzIHJldHVybiBUcnVlLCB0aGlzIGlzIGFuIGV4cGxpY2l0IGRlc2lnbiBkZWNpc2lvbi4KICAgICAgICByZXR1cm4gYWxsKAogICAgICAgICAgICBzLmNvbnRhaW5zKGl0ZW0sIHByZXJlbGVhc2VzPXByZXJlbGVhc2VzKQogICAgICAgICAgICBmb3IgcyBpbiBzZWxmLl9zcGVjcwogICAgICAgICkKCiAgICBkZWYgZmlsdGVyKHNlbGYsIGl0ZXJhYmxlLCBwcmVyZWxlYXNlcz1Ob25lKToKICAgICAgICAjIERldGVybWluZSBpZiB3ZSdyZSBmb3JjaW5nIGEgcHJlcmVsZWFzZSBvciBub3QsIGlmIHdlJ3JlIG5vdCBmb3JjaW5nCiAgICAgICAgIyBvbmUgZm9yIHRoaXMgcGFydGljdWxhciBmaWx0ZXIgY2FsbCwgdGhlbiB3ZSdsbCB1c2Ugd2hhdGV2ZXIgdGhlCiAgICAgICAgIyBTcGVjaWZpZXJTZXQgdGhpbmtzIGZvciB3aGV0aGVyIG9yIG5vdCB3ZSBzaG91bGQgc3VwcG9ydCBwcmVyZWxlYXNlcy4KICAgICAgICBpZiBwcmVyZWxlYXNlcyBpcyBOb25lOgogICAgICAgICAgICBwcmVyZWxlYXNlcyA9IHNlbGYucHJlcmVsZWFzZXMKCiAgICAgICAgIyBJZiB3ZSBoYXZlIGFueSBzcGVjaWZpZXJzLCB0aGVuIHdlIHdhbnQgdG8gd3JhcCBvdXIgaXRlcmFibGUgaW4gdGhlCiAgICAgICAgIyBmaWx0ZXIgbWV0aG9kIGZvciBlYWNoIG9uZSwgdGhpcyB3aWxsIGFjdCBhcyBhIGxvZ2ljYWwgQU5EIGFtb25nc3QKICAgICAgICAjIGVhY2ggc3BlY2lmaWVyLgogICAgICAgIGlmIHNlbGYuX3NwZWNzOgogICAgICAgICAgICBmb3Igc3BlYyBpbiBzZWxmLl9zcGVjczoKICAgICAgICAgICAgICAgIGl0ZXJhYmxlID0gc3BlYy5maWx0ZXIoaXRlcmFibGUsIHByZXJlbGVhc2VzPWJvb2wocHJlcmVsZWFzZXMpKQogICAgICAgICAgICByZXR1cm4gaXRlcmFibGUKICAgICAgICAjIElmIHdlIGRvIG5vdCBoYXZlIGFueSBzcGVjaWZpZXJzLCB0aGVuIHdlIG5lZWQgdG8gaGF2ZSBhIHJvdWdoIGZpbHRlcgogICAgICAgICMgd2hpY2ggd2lsbCBmaWx0ZXIgb3V0IGFueSBwcmUtcmVsZWFzZXMsIHVubGVzcyB0aGVyZSBhcmUgbm8gZmluYWwKICAgICAgICAjIHJlbGVhc2VzLCBhbmQgd2hpY2ggd2lsbCBmaWx0ZXIgb3V0IExlZ2FjeVZlcnNpb24gaW4gZ2VuZXJhbC4KICAgICAgICBlbHNlOgogICAgICAgICAgICBmaWx0ZXJlZCA9IFtdCiAgICAgICAgICAgIGZvdW5kX3ByZXJlbGVhc2VzID0gW10KCiAgICAgICAgICAgIGZvciBpdGVtIGluIGl0ZXJhYmxlOgogICAgICAgICAgICAgICAgIyBFbnN1cmUgdGhhdCB3ZSBzb21lIGtpbmQgb2YgVmVyc2lvbiBjbGFzcyBmb3IgdGhpcyBpdGVtLgogICAgICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoaXRlbSwgKExlZ2FjeVZlcnNpb24sIFZlcnNpb24pKToKICAgICAgICAgICAgICAgICAgICBwYXJzZWRfdmVyc2lvbiA9IHBhcnNlKGl0ZW0pCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHBhcnNlZF92ZXJzaW9uID0gaXRlbQoKICAgICAgICAgICAgICAgICMgRmlsdGVyIG91dCBhbnkgaXRlbSB3aGljaCBpcyBwYXJzZWQgYXMgYSBMZWdhY3lWZXJzaW9uCiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHBhcnNlZF92ZXJzaW9uLCBMZWdhY3lWZXJzaW9uKToKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgICAgICMgU3RvcmUgYW55IGl0ZW0gd2hpY2ggaXMgYSBwcmUtcmVsZWFzZSBmb3IgbGF0ZXIgdW5sZXNzIHdlJ3ZlCiAgICAgICAgICAgICAgICAjIGFscmVhZHkgZm91bmQgYSBmaW5hbCB2ZXJzaW9uIG9yIHdlIGFyZSBhY2NlcHRpbmcgcHJlcmVsZWFzZXMKICAgICAgICAgICAgICAgIGlmIHBhcnNlZF92ZXJzaW9uLmlzX3ByZXJlbGVhc2UgYW5kIG5vdCBwcmVyZWxlYXNlczoKICAgICAgICAgICAgICAgICAgICBpZiBub3QgZmlsdGVyZWQ6CiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kX3ByZXJlbGVhc2VzLmFwcGVuZChpdGVtKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZC5hcHBlbmQoaXRlbSkKCiAgICAgICAgICAgICMgSWYgd2UndmUgZm91bmQgbm8gaXRlbXMgZXhjZXB0IGZvciBwcmUtcmVsZWFzZXMsIHRoZW4gd2UnbGwgZ28KICAgICAgICAgICAgIyBhaGVhZCBhbmQgdXNlIHRoZSBwcmUtcmVsZWFzZXMKICAgICAgICAgICAgaWYgbm90IGZpbHRlcmVkIGFuZCBmb3VuZF9wcmVyZWxlYXNlcyBhbmQgcHJlcmVsZWFzZXMgaXMgTm9uZToKICAgICAgICAgICAgICAgIHJldHVybiBmb3VuZF9wcmVyZWxlYXNlcwoKICAgICAgICAgICAgcmV0dXJuIGZpbHRlcmVkClBLAwQUAAAAAAAAACEAxeonD6UBAAClAQAATQAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9wa2dfcmVzb3VyY2VzL192ZW5kb3IvcGFja2FnaW5nL3V0aWxzLnB5IyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uCiMgMi4wLCBhbmQgdGhlIEJTRCBMaWNlbnNlLiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHJlcG9zaXRvcnkKIyBmb3IgY29tcGxldGUgZGV0YWlscy4KZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCBwcmludF9mdW5jdGlvbgoKaW1wb3J0IHJlCgoKX2Nhbm9uaWNhbGl6ZV9yZWdleCA9IHJlLmNvbXBpbGUociJbLV8uXSsiKQoKCmRlZiBjYW5vbmljYWxpemVfbmFtZShuYW1lKToKICAgICMgVGhpcyBpcyB0YWtlbiBmcm9tIFBFUCA1MDMuCiAgICByZXR1cm4gX2Nhbm9uaWNhbGl6ZV9yZWdleC5zdWIoIi0iLCBuYW1lKS5sb3dlcigpClBLAwQUAAAAAAAAACEADu/GoSQtAAAkLQAATwAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9wa2dfcmVzb3VyY2VzL192ZW5kb3IvcGFja2FnaW5nL3ZlcnNpb24ucHkjIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24KIyAyLjAsIGFuZCB0aGUgQlNEIExpY2Vuc2UuIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcmVwb3NpdG9yeQojIGZvciBjb21wbGV0ZSBkZXRhaWxzLgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHByaW50X2Z1bmN0aW9uCgppbXBvcnQgY29sbGVjdGlvbnMKaW1wb3J0IGl0ZXJ0b29scwppbXBvcnQgcmUKCmZyb20gLl9zdHJ1Y3R1cmVzIGltcG9ydCBJbmZpbml0eQoKCl9fYWxsX18gPSBbCiAgICAicGFyc2UiLCAiVmVyc2lvbiIsICJMZWdhY3lWZXJzaW9uIiwgIkludmFsaWRWZXJzaW9uIiwgIlZFUlNJT05fUEFUVEVSTiIKXQoKCl9WZXJzaW9uID0gY29sbGVjdGlvbnMubmFtZWR0dXBsZSgKICAgICJfVmVyc2lvbiIsCiAgICBbImVwb2NoIiwgInJlbGVhc2UiLCAiZGV2IiwgInByZSIsICJwb3N0IiwgImxvY2FsIl0sCikKCgpkZWYgcGFyc2UodmVyc2lvbik6CiAgICAiIiIKICAgIFBhcnNlIHRoZSBnaXZlbiB2ZXJzaW9uIHN0cmluZyBhbmQgcmV0dXJuIGVpdGhlciBhIDpjbGFzczpgVmVyc2lvbmAgb2JqZWN0CiAgICBvciBhIDpjbGFzczpgTGVnYWN5VmVyc2lvbmAgb2JqZWN0IGRlcGVuZGluZyBvbiBpZiB0aGUgZ2l2ZW4gdmVyc2lvbiBpcwogICAgYSB2YWxpZCBQRVAgNDQwIHZlcnNpb24gb3IgYSBsZWdhY3kgdmVyc2lvbi4KICAgICIiIgogICAgdHJ5OgogICAgICAgIHJldHVybiBWZXJzaW9uKHZlcnNpb24pCiAgICBleGNlcHQgSW52YWxpZFZlcnNpb246CiAgICAgICAgcmV0dXJuIExlZ2FjeVZlcnNpb24odmVyc2lvbikKCgpjbGFzcyBJbnZhbGlkVmVyc2lvbihWYWx1ZUVycm9yKToKICAgICIiIgogICAgQW4gaW52YWxpZCB2ZXJzaW9uIHdhcyBmb3VuZCwgdXNlcnMgc2hvdWxkIHJlZmVyIHRvIFBFUCA0NDAuCiAgICAiIiIKCgpjbGFzcyBfQmFzZVZlcnNpb24ob2JqZWN0KToKCiAgICBkZWYgX19oYXNoX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGhhc2goc2VsZi5fa2V5KQoKICAgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmLl9jb21wYXJlKG90aGVyLCBsYW1iZGEgcywgbzogcyA8IG8pCgogICAgZGVmIF9fbGVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2NvbXBhcmUob3RoZXIsIGxhbWJkYSBzLCBvOiBzIDw9IG8pCgogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2NvbXBhcmUob3RoZXIsIGxhbWJkYSBzLCBvOiBzID09IG8pCgogICAgZGVmIF9fZ2VfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2NvbXBhcmUob3RoZXIsIGxhbWJkYSBzLCBvOiBzID49IG8pCgogICAgZGVmIF9fZ3RfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2NvbXBhcmUob3RoZXIsIGxhbWJkYSBzLCBvOiBzID4gbykKCiAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5fY29tcGFyZShvdGhlciwgbGFtYmRhIHMsIG86IHMgIT0gbykKCiAgICBkZWYgX2NvbXBhcmUoc2VsZiwgb3RoZXIsIG1ldGhvZCk6CiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIF9CYXNlVmVyc2lvbik6CiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAoKICAgICAgICByZXR1cm4gbWV0aG9kKHNlbGYuX2tleSwgb3RoZXIuX2tleSkKCgpjbGFzcyBMZWdhY3lWZXJzaW9uKF9CYXNlVmVyc2lvbik6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHZlcnNpb24pOgogICAgICAgIHNlbGYuX3ZlcnNpb24gPSBzdHIodmVyc2lvbikKICAgICAgICBzZWxmLl9rZXkgPSBfbGVnYWN5X2NtcGtleShzZWxmLl92ZXJzaW9uKQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl92ZXJzaW9uCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiPExlZ2FjeVZlcnNpb24oezB9KT4iLmZvcm1hdChyZXByKHN0cihzZWxmKSkpCgogICAgQHByb3BlcnR5CiAgICBkZWYgcHVibGljKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl92ZXJzaW9uCgogICAgQHByb3BlcnR5CiAgICBkZWYgYmFzZV92ZXJzaW9uKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl92ZXJzaW9uCgogICAgQHByb3BlcnR5CiAgICBkZWYgbG9jYWwoc2VsZik6CiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc19wcmVyZWxlYXNlKHNlbGYpOgogICAgICAgIHJldHVybiBGYWxzZQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX3Bvc3RyZWxlYXNlKHNlbGYpOgogICAgICAgIHJldHVybiBGYWxzZQoKCl9sZWdhY3lfdmVyc2lvbl9jb21wb25lbnRfcmUgPSByZS5jb21waWxlKAogICAgciIoXGQrIHwgW2Etel0rIHwgXC58IC0pIiwgcmUuVkVSQk9TRSwKKQoKX2xlZ2FjeV92ZXJzaW9uX3JlcGxhY2VtZW50X21hcCA9IHsKICAgICJwcmUiOiAiYyIsICJwcmV2aWV3IjogImMiLCAiLSI6ICJmaW5hbC0iLCAicmMiOiAiYyIsICJkZXYiOiAiQCIsCn0KCgpkZWYgX3BhcnNlX3ZlcnNpb25fcGFydHMocyk6CiAgICBmb3IgcGFydCBpbiBfbGVnYWN5X3ZlcnNpb25fY29tcG9uZW50X3JlLnNwbGl0KHMpOgogICAgICAgIHBhcnQgPSBfbGVnYWN5X3ZlcnNpb25fcmVwbGFjZW1lbnRfbWFwLmdldChwYXJ0LCBwYXJ0KQoKICAgICAgICBpZiBub3QgcGFydCBvciBwYXJ0ID09ICIuIjoKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgaWYgcGFydFs6MV0gaW4gIjAxMjM0NTY3ODkiOgogICAgICAgICAgICAjIHBhZCBmb3IgbnVtZXJpYyBjb21wYXJpc29uCiAgICAgICAgICAgIHlpZWxkIHBhcnQuemZpbGwoOCkKICAgICAgICBlbHNlOgogICAgICAgICAgICB5aWVsZCAiKiIgKyBwYXJ0CgogICAgIyBlbnN1cmUgdGhhdCBhbHBoYS9iZXRhL2NhbmRpZGF0ZSBhcmUgYmVmb3JlIGZpbmFsCiAgICB5aWVsZCAiKmZpbmFsIgoKCmRlZiBfbGVnYWN5X2NtcGtleSh2ZXJzaW9uKToKICAgICMgV2UgaGFyZGNvZGUgYW4gZXBvY2ggb2YgLTEgaGVyZS4gQSBQRVAgNDQwIHZlcnNpb24gY2FuIG9ubHkgaGF2ZSBhIGVwb2NoCiAgICAjIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAwLiBUaGlzIHdpbGwgZWZmZWN0aXZlbHkgcHV0IHRoZSBMZWdhY3lWZXJzaW9uLAogICAgIyB3aGljaCB1c2VzIHRoZSBkZWZhY3RvIHN0YW5kYXJkIG9yaWdpbmFsbHkgaW1wbGVtZW50ZWQgYnkgc2V0dXB0b29scywKICAgICMgYXMgYmVmb3JlIGFsbCBQRVAgNDQwIHZlcnNpb25zLgogICAgZXBvY2ggPSAtMQoKICAgICMgVGhpcyBzY2hlbWUgaXMgdGFrZW4gZnJvbSBwa2dfcmVzb3VyY2VzLnBhcnNlX3ZlcnNpb24gc2V0dXB0b29scyBwcmlvciB0bwogICAgIyBpdCdzIGFkb3B0aW9uIG9mIHRoZSBwYWNrYWdpbmcgbGlicmFyeS4KICAgIHBhcnRzID0gW10KICAgIGZvciBwYXJ0IGluIF9wYXJzZV92ZXJzaW9uX3BhcnRzKHZlcnNpb24ubG93ZXIoKSk6CiAgICAgICAgaWYgcGFydC5zdGFydHN3aXRoKCIqIik6CiAgICAgICAgICAgICMgcmVtb3ZlICItIiBiZWZvcmUgYSBwcmVyZWxlYXNlIHRhZwogICAgICAgICAgICBpZiBwYXJ0IDwgIipmaW5hbCI6CiAgICAgICAgICAgICAgICB3aGlsZSBwYXJ0cyBhbmQgcGFydHNbLTFdID09ICIqZmluYWwtIjoKICAgICAgICAgICAgICAgICAgICBwYXJ0cy5wb3AoKQoKICAgICAgICAgICAgIyByZW1vdmUgdHJhaWxpbmcgemVyb3MgZnJvbSBlYWNoIHNlcmllcyBvZiBudW1lcmljIHBhcnRzCiAgICAgICAgICAgIHdoaWxlIHBhcnRzIGFuZCBwYXJ0c1stMV0gPT0gIjAwMDAwMDAwIjoKICAgICAgICAgICAgICAgIHBhcnRzLnBvcCgpCgogICAgICAgIHBhcnRzLmFwcGVuZChwYXJ0KQogICAgcGFydHMgPSB0dXBsZShwYXJ0cykKCiAgICByZXR1cm4gZXBvY2gsIHBhcnRzCgojIERlbGliZXJhdGVseSBub3QgYW5jaG9yZWQgdG8gdGhlIHN0YXJ0IGFuZCBlbmQgb2YgdGhlIHN0cmluZywgdG8gbWFrZSBpdAojIGVhc2llciBmb3IgM3JkIHBhcnR5IGNvZGUgdG8gcmV1c2UKVkVSU0lPTl9QQVRURVJOID0gciIiIgogICAgdj8KICAgICg/OgogICAgICAgICg/Oig/UDxlcG9jaD5bMC05XSspISk/ICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBlcG9jaAogICAgICAgICg/UDxyZWxlYXNlPlswLTldKyg/OlwuWzAtOV0rKSopICAgICAgICAgICAgICAgICAgIyByZWxlYXNlIHNlZ21lbnQKICAgICAgICAoP1A8cHJlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcHJlLXJlbGVhc2UKICAgICAgICAgICAgWy1fXC5dPwogICAgICAgICAgICAoP1A8cHJlX2w+KGF8YnxjfHJjfGFscGhhfGJldGF8cHJlfHByZXZpZXcpKQogICAgICAgICAgICBbLV9cLl0/CiAgICAgICAgICAgICg/UDxwcmVfbj5bMC05XSspPwogICAgICAgICk/CiAgICAgICAgKD9QPHBvc3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHBvc3QgcmVsZWFzZQogICAgICAgICAgICAoPzotKD9QPHBvc3RfbjE+WzAtOV0rKSkKICAgICAgICAgICAgfAogICAgICAgICAgICAoPzoKICAgICAgICAgICAgICAgIFstX1wuXT8KICAgICAgICAgICAgICAgICg/UDxwb3N0X2w+cG9zdHxyZXZ8cikKICAgICAgICAgICAgICAgIFstX1wuXT8KICAgICAgICAgICAgICAgICg/UDxwb3N0X24yPlswLTldKyk/CiAgICAgICAgICAgICkKICAgICAgICApPwogICAgICAgICg/UDxkZXY+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBkZXYgcmVsZWFzZQogICAgICAgICAgICBbLV9cLl0/CiAgICAgICAgICAgICg/UDxkZXZfbD5kZXYpCiAgICAgICAgICAgIFstX1wuXT8KICAgICAgICAgICAgKD9QPGRldl9uPlswLTldKyk/CiAgICAgICAgKT8KICAgICkKICAgICg/OlwrKD9QPGxvY2FsPlthLXowLTldKyg/OlstX1wuXVthLXowLTldKykqKSk/ICAgICAgICMgbG9jYWwgdmVyc2lvbgoiIiIKCgpjbGFzcyBWZXJzaW9uKF9CYXNlVmVyc2lvbik6CgogICAgX3JlZ2V4ID0gcmUuY29tcGlsZSgKICAgICAgICByIl5ccyoiICsgVkVSU0lPTl9QQVRURVJOICsgciJccyokIiwKICAgICAgICByZS5WRVJCT1NFIHwgcmUuSUdOT1JFQ0FTRSwKICAgICkKCiAgICBkZWYgX19pbml0X18oc2VsZiwgdmVyc2lvbik6CiAgICAgICAgIyBWYWxpZGF0ZSB0aGUgdmVyc2lvbiBhbmQgcGFyc2UgaXQgaW50byBwaWVjZXMKICAgICAgICBtYXRjaCA9IHNlbGYuX3JlZ2V4LnNlYXJjaCh2ZXJzaW9uKQogICAgICAgIGlmIG5vdCBtYXRjaDoKICAgICAgICAgICAgcmFpc2UgSW52YWxpZFZlcnNpb24oIkludmFsaWQgdmVyc2lvbjogJ3swfSciLmZvcm1hdCh2ZXJzaW9uKSkKCiAgICAgICAgIyBTdG9yZSB0aGUgcGFyc2VkIG91dCBwaWVjZXMgb2YgdGhlIHZlcnNpb24KICAgICAgICBzZWxmLl92ZXJzaW9uID0gX1ZlcnNpb24oCiAgICAgICAgICAgIGVwb2NoPWludChtYXRjaC5ncm91cCgiZXBvY2giKSkgaWYgbWF0Y2guZ3JvdXAoImVwb2NoIikgZWxzZSAwLAogICAgICAgICAgICByZWxlYXNlPXR1cGxlKGludChpKSBmb3IgaSBpbiBtYXRjaC5ncm91cCgicmVsZWFzZSIpLnNwbGl0KCIuIikpLAogICAgICAgICAgICBwcmU9X3BhcnNlX2xldHRlcl92ZXJzaW9uKAogICAgICAgICAgICAgICAgbWF0Y2guZ3JvdXAoInByZV9sIiksCiAgICAgICAgICAgICAgICBtYXRjaC5ncm91cCgicHJlX24iKSwKICAgICAgICAgICAgKSwKICAgICAgICAgICAgcG9zdD1fcGFyc2VfbGV0dGVyX3ZlcnNpb24oCiAgICAgICAgICAgICAgICBtYXRjaC5ncm91cCgicG9zdF9sIiksCiAgICAgICAgICAgICAgICBtYXRjaC5ncm91cCgicG9zdF9uMSIpIG9yIG1hdGNoLmdyb3VwKCJwb3N0X24yIiksCiAgICAgICAgICAgICksCiAgICAgICAgICAgIGRldj1fcGFyc2VfbGV0dGVyX3ZlcnNpb24oCiAgICAgICAgICAgICAgICBtYXRjaC5ncm91cCgiZGV2X2wiKSwKICAgICAgICAgICAgICAgIG1hdGNoLmdyb3VwKCJkZXZfbiIpLAogICAgICAgICAgICApLAogICAgICAgICAgICBsb2NhbD1fcGFyc2VfbG9jYWxfdmVyc2lvbihtYXRjaC5ncm91cCgibG9jYWwiKSksCiAgICAgICAgKQoKICAgICAgICAjIEdlbmVyYXRlIGEga2V5IHdoaWNoIHdpbGwgYmUgdXNlZCBmb3Igc29ydGluZwogICAgICAgIHNlbGYuX2tleSA9IF9jbXBrZXkoCiAgICAgICAgICAgIHNlbGYuX3ZlcnNpb24uZXBvY2gsCiAgICAgICAgICAgIHNlbGYuX3ZlcnNpb24ucmVsZWFzZSwKICAgICAgICAgICAgc2VsZi5fdmVyc2lvbi5wcmUsCiAgICAgICAgICAgIHNlbGYuX3ZlcnNpb24ucG9zdCwKICAgICAgICAgICAgc2VsZi5fdmVyc2lvbi5kZXYsCiAgICAgICAgICAgIHNlbGYuX3ZlcnNpb24ubG9jYWwsCiAgICAgICAgKQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIjxWZXJzaW9uKHswfSk+Ii5mb3JtYXQocmVwcihzdHIoc2VsZikpKQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHBhcnRzID0gW10KCiAgICAgICAgIyBFcG9jaAogICAgICAgIGlmIHNlbGYuX3ZlcnNpb24uZXBvY2ggIT0gMDoKICAgICAgICAgICAgcGFydHMuYXBwZW5kKCJ7MH0hIi5mb3JtYXQoc2VsZi5fdmVyc2lvbi5lcG9jaCkpCgogICAgICAgICMgUmVsZWFzZSBzZWdtZW50CiAgICAgICAgcGFydHMuYXBwZW5kKCIuIi5qb2luKHN0cih4KSBmb3IgeCBpbiBzZWxmLl92ZXJzaW9uLnJlbGVhc2UpKQoKICAgICAgICAjIFByZS1yZWxlYXNlCiAgICAgICAgaWYgc2VsZi5fdmVyc2lvbi5wcmUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgiIi5qb2luKHN0cih4KSBmb3IgeCBpbiBzZWxmLl92ZXJzaW9uLnByZSkpCgogICAgICAgICMgUG9zdC1yZWxlYXNlCiAgICAgICAgaWYgc2VsZi5fdmVyc2lvbi5wb3N0IGlzIG5vdCBOb25lOgogICAgICAgICAgICBwYXJ0cy5hcHBlbmQoIi5wb3N0ezB9Ii5mb3JtYXQoc2VsZi5fdmVyc2lvbi5wb3N0WzFdKSkKCiAgICAgICAgIyBEZXZlbG9wbWVudCByZWxlYXNlCiAgICAgICAgaWYgc2VsZi5fdmVyc2lvbi5kZXYgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgiLmRldnswfSIuZm9ybWF0KHNlbGYuX3ZlcnNpb24uZGV2WzFdKSkKCiAgICAgICAgIyBMb2NhbCB2ZXJzaW9uIHNlZ21lbnQKICAgICAgICBpZiBzZWxmLl92ZXJzaW9uLmxvY2FsIGlzIG5vdCBOb25lOgogICAgICAgICAgICBwYXJ0cy5hcHBlbmQoCiAgICAgICAgICAgICAgICAiK3swfSIuZm9ybWF0KCIuIi5qb2luKHN0cih4KSBmb3IgeCBpbiBzZWxmLl92ZXJzaW9uLmxvY2FsKSkKICAgICAgICAgICAgKQoKICAgICAgICByZXR1cm4gIiIuam9pbihwYXJ0cykKCiAgICBAcHJvcGVydHkKICAgIGRlZiBwdWJsaWMoc2VsZik6CiAgICAgICAgcmV0dXJuIHN0cihzZWxmKS5zcGxpdCgiKyIsIDEpWzBdCgogICAgQHByb3BlcnR5CiAgICBkZWYgYmFzZV92ZXJzaW9uKHNlbGYpOgogICAgICAgIHBhcnRzID0gW10KCiAgICAgICAgIyBFcG9jaAogICAgICAgIGlmIHNlbGYuX3ZlcnNpb24uZXBvY2ggIT0gMDoKICAgICAgICAgICAgcGFydHMuYXBwZW5kKCJ7MH0hIi5mb3JtYXQoc2VsZi5fdmVyc2lvbi5lcG9jaCkpCgogICAgICAgICMgUmVsZWFzZSBzZWdtZW50CiAgICAgICAgcGFydHMuYXBwZW5kKCIuIi5qb2luKHN0cih4KSBmb3IgeCBpbiBzZWxmLl92ZXJzaW9uLnJlbGVhc2UpKQoKICAgICAgICByZXR1cm4gIiIuam9pbihwYXJ0cykKCiAgICBAcHJvcGVydHkKICAgIGRlZiBsb2NhbChzZWxmKToKICAgICAgICB2ZXJzaW9uX3N0cmluZyA9IHN0cihzZWxmKQogICAgICAgIGlmICIrIiBpbiB2ZXJzaW9uX3N0cmluZzoKICAgICAgICAgICAgcmV0dXJuIHZlcnNpb25fc3RyaW5nLnNwbGl0KCIrIiwgMSlbMV0KCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc19wcmVyZWxlYXNlKHNlbGYpOgogICAgICAgIHJldHVybiBib29sKHNlbGYuX3ZlcnNpb24uZGV2IG9yIHNlbGYuX3ZlcnNpb24ucHJlKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX3Bvc3RyZWxlYXNlKHNlbGYpOgogICAgICAgIHJldHVybiBib29sKHNlbGYuX3ZlcnNpb24ucG9zdCkKCgpkZWYgX3BhcnNlX2xldHRlcl92ZXJzaW9uKGxldHRlciwgbnVtYmVyKToKICAgIGlmIGxldHRlcjoKICAgICAgICAjIFdlIGNvbnNpZGVyIHRoZXJlIHRvIGJlIGFuIGltcGxpY2l0IDAgaW4gYSBwcmUtcmVsZWFzZSBpZiB0aGVyZSBpcwogICAgICAgICMgbm90IGEgbnVtZXJhbCBhc3NvY2lhdGVkIHdpdGggaXQuCiAgICAgICAgaWYgbnVtYmVyIGlzIE5vbmU6CiAgICAgICAgICAgIG51bWJlciA9IDAKCiAgICAgICAgIyBXZSBub3JtYWxpemUgYW55IGxldHRlcnMgdG8gdGhlaXIgbG93ZXIgY2FzZSBmb3JtCiAgICAgICAgbGV0dGVyID0gbGV0dGVyLmxvd2VyKCkKCiAgICAgICAgIyBXZSBjb25zaWRlciBzb21lIHdvcmRzIHRvIGJlIGFsdGVybmF0ZSBzcGVsbGluZ3Mgb2Ygb3RoZXIgd29yZHMgYW5kCiAgICAgICAgIyBpbiB0aG9zZSBjYXNlcyB3ZSB3YW50IHRvIG5vcm1hbGl6ZSB0aGUgc3BlbGxpbmdzIHRvIG91ciBwcmVmZXJyZWQKICAgICAgICAjIHNwZWxsaW5nLgogICAgICAgIGlmIGxldHRlciA9PSAiYWxwaGEiOgogICAgICAgICAgICBsZXR0ZXIgPSAiYSIKICAgICAgICBlbGlmIGxldHRlciA9PSAiYmV0YSI6CiAgICAgICAgICAgIGxldHRlciA9ICJiIgogICAgICAgIGVsaWYgbGV0dGVyIGluIFsiYyIsICJwcmUiLCAicHJldmlldyJdOgogICAgICAgICAgICBsZXR0ZXIgPSAicmMiCiAgICAgICAgZWxpZiBsZXR0ZXIgaW4gWyJyZXYiLCAiciJdOgogICAgICAgICAgICBsZXR0ZXIgPSAicG9zdCIKCiAgICAgICAgcmV0dXJuIGxldHRlciwgaW50KG51bWJlcikKICAgIGlmIG5vdCBsZXR0ZXIgYW5kIG51bWJlcjoKICAgICAgICAjIFdlIGFzc3VtZSBpZiB3ZSBhcmUgZ2l2ZW4gYSBudW1iZXIsIGJ1dCB3ZSBhcmUgbm90IGdpdmVuIGEgbGV0dGVyCiAgICAgICAgIyB0aGVuIHRoaXMgaXMgdXNpbmcgdGhlIGltcGxpY2l0IHBvc3QgcmVsZWFzZSBzeW50YXggKGUuZy4gMS4wLTEpCiAgICAgICAgbGV0dGVyID0gInBvc3QiCgogICAgICAgIHJldHVybiBsZXR0ZXIsIGludChudW1iZXIpCgoKX2xvY2FsX3ZlcnNpb25fc2VwZXJhdG9ycyA9IHJlLmNvbXBpbGUociJbXC5fLV0iKQoKCmRlZiBfcGFyc2VfbG9jYWxfdmVyc2lvbihsb2NhbCk6CiAgICAiIiIKICAgIFRha2VzIGEgc3RyaW5nIGxpa2UgYWJjLjEudHdlbHZlIGFuZCB0dXJucyBpdCBpbnRvICgiYWJjIiwgMSwgInR3ZWx2ZSIpLgogICAgIiIiCiAgICBpZiBsb2NhbCBpcyBub3QgTm9uZToKICAgICAgICByZXR1cm4gdHVwbGUoCiAgICAgICAgICAgIHBhcnQubG93ZXIoKSBpZiBub3QgcGFydC5pc2RpZ2l0KCkgZWxzZSBpbnQocGFydCkKICAgICAgICAgICAgZm9yIHBhcnQgaW4gX2xvY2FsX3ZlcnNpb25fc2VwZXJhdG9ycy5zcGxpdChsb2NhbCkKICAgICAgICApCgoKZGVmIF9jbXBrZXkoZXBvY2gsIHJlbGVhc2UsIHByZSwgcG9zdCwgZGV2LCBsb2NhbCk6CiAgICAjIFdoZW4gd2UgY29tcGFyZSBhIHJlbGVhc2UgdmVyc2lvbiwgd2Ugd2FudCB0byBjb21wYXJlIGl0IHdpdGggYWxsIG9mIHRoZQogICAgIyB0cmFpbGluZyB6ZXJvcyByZW1vdmVkLiBTbyB3ZSdsbCB1c2UgYSByZXZlcnNlIHRoZSBsaXN0LCBkcm9wIGFsbCB0aGUgbm93CiAgICAjIGxlYWRpbmcgemVyb3MgdW50aWwgd2UgY29tZSB0byBzb21ldGhpbmcgbm9uIHplcm8sIHRoZW4gdGFrZSB0aGUgcmVzdAogICAgIyByZS1yZXZlcnNlIGl0IGJhY2sgaW50byB0aGUgY29ycmVjdCBvcmRlciBhbmQgbWFrZSBpdCBhIHR1cGxlIGFuZCB1c2UKICAgICMgdGhhdCBmb3Igb3VyIHNvcnRpbmcga2V5LgogICAgcmVsZWFzZSA9IHR1cGxlKAogICAgICAgIHJldmVyc2VkKGxpc3QoCiAgICAgICAgICAgIGl0ZXJ0b29scy5kcm9wd2hpbGUoCiAgICAgICAgICAgICAgICBsYW1iZGEgeDogeCA9PSAwLAogICAgICAgICAgICAgICAgcmV2ZXJzZWQocmVsZWFzZSksCiAgICAgICAgICAgICkKICAgICAgICApKQogICAgKQoKICAgICMgV2UgbmVlZCB0byAidHJpY2siIHRoZSBzb3J0aW5nIGFsZ29yaXRobSB0byBwdXQgMS4wLmRldjAgYmVmb3JlIDEuMGEwLgogICAgIyBXZSdsbCBkbyB0aGlzIGJ5IGFidXNpbmcgdGhlIHByZSBzZWdtZW50LCBidXQgd2UgX29ubHlfIHdhbnQgdG8gZG8gdGhpcwogICAgIyBpZiB0aGVyZSBpcyBub3QgYSBwcmUgb3IgYSBwb3N0IHNlZ21lbnQuIElmIHdlIGhhdmUgb25lIG9mIHRob3NlIHRoZW4KICAgICMgdGhlIG5vcm1hbCBzb3J0aW5nIHJ1bGVzIHdpbGwgaGFuZGxlIHRoaXMgY2FzZSBjb3JyZWN0bHkuCiAgICBpZiBwcmUgaXMgTm9uZSBhbmQgcG9zdCBpcyBOb25lIGFuZCBkZXYgaXMgbm90IE5vbmU6CiAgICAgICAgcHJlID0gLUluZmluaXR5CiAgICAjIFZlcnNpb25zIHdpdGhvdXQgYSBwcmUtcmVsZWFzZSAoZXhjZXB0IGFzIG5vdGVkIGFib3ZlKSBzaG91bGQgc29ydCBhZnRlcgogICAgIyB0aG9zZSB3aXRoIG9uZS4KICAgIGVsaWYgcHJlIGlzIE5vbmU6CiAgICAgICAgcHJlID0gSW5maW5pdHkKCiAgICAjIFZlcnNpb25zIHdpdGhvdXQgYSBwb3N0IHNlZ21lbnQgc2hvdWxkIHNvcnQgYmVmb3JlIHRob3NlIHdpdGggb25lLgogICAgaWYgcG9zdCBpcyBOb25lOgogICAgICAgIHBvc3QgPSAtSW5maW5pdHkKCiAgICAjIFZlcnNpb25zIHdpdGhvdXQgYSBkZXZlbG9wbWVudCBzZWdtZW50IHNob3VsZCBzb3J0IGFmdGVyIHRob3NlIHdpdGggb25lLgogICAgaWYgZGV2IGlzIE5vbmU6CiAgICAgICAgZGV2ID0gSW5maW5pdHkKCiAgICBpZiBsb2NhbCBpcyBOb25lOgogICAgICAgICMgVmVyc2lvbnMgd2l0aG91dCBhIGxvY2FsIHNlZ21lbnQgc2hvdWxkIHNvcnQgYmVmb3JlIHRob3NlIHdpdGggb25lLgogICAgICAgIGxvY2FsID0gLUluZmluaXR5CiAgICBlbHNlOgogICAgICAgICMgVmVyc2lvbnMgd2l0aCBhIGxvY2FsIHNlZ21lbnQgbmVlZCB0aGF0IHNlZ21lbnQgcGFyc2VkIHRvIGltcGxlbWVudAogICAgICAgICMgdGhlIHNvcnRpbmcgcnVsZXMgaW4gUEVQNDQwLgogICAgICAgICMgLSBBbHBoYSBudW1lcmljIHNlZ21lbnRzIHNvcnQgYmVmb3JlIG51bWVyaWMgc2VnbWVudHMKICAgICAgICAjIC0gQWxwaGEgbnVtZXJpYyBzZWdtZW50cyBzb3J0IGxleGljb2dyYXBoaWNhbGx5CiAgICAgICAgIyAtIE51bWVyaWMgc2VnbWVudHMgc29ydCBudW1lcmljYWxseQogICAgICAgICMgLSBTaG9ydGVyIHZlcnNpb25zIHNvcnQgYmVmb3JlIGxvbmdlciB2ZXJzaW9ucyB3aGVuIHRoZSBwcmVmaXhlcwogICAgICAgICMgICBtYXRjaCBleGFjdGx5CiAgICAgICAgbG9jYWwgPSB0dXBsZSgKICAgICAgICAgICAgKGksICIiKSBpZiBpc2luc3RhbmNlKGksIGludCkgZWxzZSAoLUluZmluaXR5LCBpKQogICAgICAgICAgICBmb3IgaSBpbiBsb2NhbAogICAgICAgICkKCiAgICByZXR1cm4gZXBvY2gsIHJlbGVhc2UsIHByZSwgcG9zdCwgZGV2LCBsb2NhbApQSwMEFAAAAAAAAAAhAGYPhLF3igMAd4oDAEcAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvcGtnX3Jlc291cmNlcy9fdmVuZG9yL3B5cGFyc2luZy5weSMgbW9kdWxlIHB5cGFyc2luZy5weQ0KIw0KIyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxOCAgUGF1bCBULiBNY0d1aXJlDQojDQojIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZw0KIyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUNCiMgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZw0KIyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsDQojIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bw0KIyBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8NCiMgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KIw0KIyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQ0KIyBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4NCiMNCiMgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsDQojIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRg0KIyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuDQojIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZDQojIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsDQojIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFDQojIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLg0KIw0KDQpfX2RvY19fID0gXA0KIiIiDQpweXBhcnNpbmcgbW9kdWxlIC0gQ2xhc3NlcyBhbmQgbWV0aG9kcyB0byBkZWZpbmUgYW5kIGV4ZWN1dGUgcGFyc2luZyBncmFtbWFycw0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KVGhlIHB5cGFyc2luZyBtb2R1bGUgaXMgYW4gYWx0ZXJuYXRpdmUgYXBwcm9hY2ggdG8gY3JlYXRpbmcgYW5kIGV4ZWN1dGluZyBzaW1wbGUgZ3JhbW1hcnMsDQp2cy4gdGhlIHRyYWRpdGlvbmFsIGxleC95YWNjIGFwcHJvYWNoLCBvciB0aGUgdXNlIG9mIHJlZ3VsYXIgZXhwcmVzc2lvbnMuICBXaXRoIHB5cGFyc2luZywgeW91DQpkb24ndCBuZWVkIHRvIGxlYXJuIGEgbmV3IHN5bnRheCBmb3IgZGVmaW5pbmcgZ3JhbW1hcnMgb3IgbWF0Y2hpbmcgZXhwcmVzc2lvbnMgLSB0aGUgcGFyc2luZyBtb2R1bGUNCnByb3ZpZGVzIGEgbGlicmFyeSBvZiBjbGFzc2VzIHRoYXQgeW91IHVzZSB0byBjb25zdHJ1Y3QgdGhlIGdyYW1tYXIgZGlyZWN0bHkgaW4gUHl0aG9uLg0KDQpIZXJlIGlzIGEgcHJvZ3JhbSB0byBwYXJzZSAiSGVsbG8sIFdvcmxkISIgKG9yIGFueSBncmVldGluZyBvZiB0aGUgZm9ybSANCkN7IjxzYWx1dGF0aW9uPiwgPGFkZHJlc3NlZT4hIn0pLCBidWlsdCB1cCB1c2luZyBMe1dvcmR9LCBMe0xpdGVyYWx9LCBhbmQgTHtBbmR9IGVsZW1lbnRzIA0KKEx7JysnPFBhcnNlckVsZW1lbnQuX19hZGRfXz59IG9wZXJhdG9yIGdpdmVzIEx7QW5kfSBleHByZXNzaW9ucywgc3RyaW5ncyBhcmUgYXV0by1jb252ZXJ0ZWQgdG8NCkx7TGl0ZXJhbH0gZXhwcmVzc2lvbnMpOjoNCg0KICAgIGZyb20gcHlwYXJzaW5nIGltcG9ydCBXb3JkLCBhbHBoYXMNCg0KICAgICMgZGVmaW5lIGdyYW1tYXIgb2YgYSBncmVldGluZw0KICAgIGdyZWV0ID0gV29yZChhbHBoYXMpICsgIiwiICsgV29yZChhbHBoYXMpICsgIiEiDQoNCiAgICBoZWxsbyA9ICJIZWxsbywgV29ybGQhIg0KICAgIHByaW50IChoZWxsbywgIi0+IiwgZ3JlZXQucGFyc2VTdHJpbmcoaGVsbG8pKQ0KDQpUaGUgcHJvZ3JhbSBvdXRwdXRzIHRoZSBmb2xsb3dpbmc6Og0KDQogICAgSGVsbG8sIFdvcmxkISAtPiBbJ0hlbGxvJywgJywnLCAnV29ybGQnLCAnISddDQoNClRoZSBQeXRob24gcmVwcmVzZW50YXRpb24gb2YgdGhlIGdyYW1tYXIgaXMgcXVpdGUgcmVhZGFibGUsIG93aW5nIHRvIHRoZSBzZWxmLWV4cGxhbmF0b3J5DQpjbGFzcyBuYW1lcywgYW5kIHRoZSB1c2Ugb2YgJysnLCAnfCcgYW5kICdeJyBvcGVyYXRvcnMuDQoNClRoZSBMe1BhcnNlUmVzdWx0c30gb2JqZWN0IHJldHVybmVkIGZyb20gTHtQYXJzZXJFbGVtZW50LnBhcnNlU3RyaW5nPFBhcnNlckVsZW1lbnQucGFyc2VTdHJpbmc+fSBjYW4gYmUgYWNjZXNzZWQgYXMgYSBuZXN0ZWQgbGlzdCwgYSBkaWN0aW9uYXJ5LCBvciBhbg0Kb2JqZWN0IHdpdGggbmFtZWQgYXR0cmlidXRlcy4NCg0KVGhlIHB5cGFyc2luZyBtb2R1bGUgaGFuZGxlcyBzb21lIG9mIHRoZSBwcm9ibGVtcyB0aGF0IGFyZSB0eXBpY2FsbHkgdmV4aW5nIHdoZW4gd3JpdGluZyB0ZXh0IHBhcnNlcnM6DQogLSBleHRyYSBvciBtaXNzaW5nIHdoaXRlc3BhY2UgKHRoZSBhYm92ZSBwcm9ncmFtIHdpbGwgYWxzbyBoYW5kbGUgIkhlbGxvLFdvcmxkISIsICJIZWxsbyAgLCAgV29ybGQgICEiLCBldGMuKQ0KIC0gcXVvdGVkIHN0cmluZ3MNCiAtIGVtYmVkZGVkIGNvbW1lbnRzDQoNCg0KR2V0dGluZyBTdGFydGVkIC0NCi0tLS0tLS0tLS0tLS0tLS0tDQpWaXNpdCB0aGUgY2xhc3NlcyBMe1BhcnNlckVsZW1lbnR9IGFuZCBMe1BhcnNlUmVzdWx0c30gdG8gc2VlIHRoZSBiYXNlIGNsYXNzZXMgdGhhdCBtb3N0IG90aGVyIHB5cGFyc2luZw0KY2xhc3NlcyBpbmhlcml0IGZyb20uIFVzZSB0aGUgZG9jc3RyaW5ncyBmb3IgZXhhbXBsZXMgb2YgaG93IHRvOg0KIC0gY29uc3RydWN0IGxpdGVyYWwgbWF0Y2ggZXhwcmVzc2lvbnMgZnJvbSBMe0xpdGVyYWx9IGFuZCBMe0Nhc2VsZXNzTGl0ZXJhbH0gY2xhc3Nlcw0KIC0gY29uc3RydWN0IGNoYXJhY3RlciB3b3JkLWdyb3VwIGV4cHJlc3Npb25zIHVzaW5nIHRoZSBMe1dvcmR9IGNsYXNzDQogLSBzZWUgaG93IHRvIGNyZWF0ZSByZXBldGl0aXZlIGV4cHJlc3Npb25zIHVzaW5nIEx7WmVyb09yTW9yZX0gYW5kIEx7T25lT3JNb3JlfSBjbGFzc2VzDQogLSB1c2UgTHsnKyc8QW5kPn0sIEx7J3wnPE1hdGNoRmlyc3Q+fSwgTHsnXic8T3I+fSwgYW5kIEx7JyYnPEVhY2g+fSBvcGVyYXRvcnMgdG8gY29tYmluZSBzaW1wbGUgZXhwcmVzc2lvbnMgaW50byBtb3JlIGNvbXBsZXggb25lcw0KIC0gYXNzb2NpYXRlIG5hbWVzIHdpdGggeW91ciBwYXJzZWQgcmVzdWx0cyB1c2luZyBMe1BhcnNlckVsZW1lbnQuc2V0UmVzdWx0c05hbWV9DQogLSBmaW5kIHNvbWUgaGVscGZ1bCBleHByZXNzaW9uIHNob3J0LWN1dHMgbGlrZSBMe2RlbGltaXRlZExpc3R9IGFuZCBMe29uZU9mfQ0KIC0gZmluZCBtb3JlIHVzZWZ1bCBjb21tb24gZXhwcmVzc2lvbnMgaW4gdGhlIEx7cHlwYXJzaW5nX2NvbW1vbn0gbmFtZXNwYWNlIGNsYXNzDQoiIiINCg0KX192ZXJzaW9uX18gPSAiMi4yLjEiDQpfX3ZlcnNpb25UaW1lX18gPSAiMTggU2VwIDIwMTggMDA6NDkgVVRDIg0KX19hdXRob3JfXyA9ICJQYXVsIE1jR3VpcmUgPHB0bWNnQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4iDQoNCmltcG9ydCBzdHJpbmcNCmZyb20gd2Vha3JlZiBpbXBvcnQgcmVmIGFzIHdrcmVmDQppbXBvcnQgY29weQ0KaW1wb3J0IHN5cw0KaW1wb3J0IHdhcm5pbmdzDQppbXBvcnQgcmUNCmltcG9ydCBzcmVfY29uc3RhbnRzDQppbXBvcnQgY29sbGVjdGlvbnMNCmltcG9ydCBwcHJpbnQNCmltcG9ydCB0cmFjZWJhY2sNCmltcG9ydCB0eXBlcw0KZnJvbSBkYXRldGltZSBpbXBvcnQgZGF0ZXRpbWUNCg0KdHJ5Og0KICAgIGZyb20gX3RocmVhZCBpbXBvcnQgUkxvY2sNCmV4Y2VwdCBJbXBvcnRFcnJvcjoNCiAgICBmcm9tIHRocmVhZGluZyBpbXBvcnQgUkxvY2sNCg0KdHJ5Og0KICAgICMgUHl0aG9uIDMNCiAgICBmcm9tIGNvbGxlY3Rpb25zLmFiYyBpbXBvcnQgSXRlcmFibGUNCiAgICBmcm9tIGNvbGxlY3Rpb25zLmFiYyBpbXBvcnQgTXV0YWJsZU1hcHBpbmcNCmV4Y2VwdCBJbXBvcnRFcnJvcjoNCiAgICAjIFB5dGhvbiAyLjcNCiAgICBmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBJdGVyYWJsZQ0KICAgIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IE11dGFibGVNYXBwaW5nDQoNCnRyeToNCiAgICBmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBPcmRlcmVkRGljdCBhcyBfT3JkZXJlZERpY3QNCmV4Y2VwdCBJbXBvcnRFcnJvcjoNCiAgICB0cnk6DQogICAgICAgIGZyb20gb3JkZXJlZGRpY3QgaW1wb3J0IE9yZGVyZWREaWN0IGFzIF9PcmRlcmVkRGljdA0KICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoNCiAgICAgICAgX09yZGVyZWREaWN0ID0gTm9uZQ0KDQojfiBzeXMuc3RkZXJyLndyaXRlKCAidGVzdGluZyBweXBhcnNpbmcgbW9kdWxlLCB2ZXJzaW9uICVzLCAlc1xuIiAlIChfX3ZlcnNpb25fXyxfX3ZlcnNpb25UaW1lX18gKSApDQoNCl9fYWxsX18gPSBbDQonQW5kJywgJ0Nhc2VsZXNzS2V5d29yZCcsICdDYXNlbGVzc0xpdGVyYWwnLCAnQ2hhcnNOb3RJbicsICdDb21iaW5lJywgJ0RpY3QnLCAnRWFjaCcsICdFbXB0eScsDQonRm9sbG93ZWRCeScsICdGb3J3YXJkJywgJ0dvVG9Db2x1bW4nLCAnR3JvdXAnLCAnS2V5d29yZCcsICdMaW5lRW5kJywgJ0xpbmVTdGFydCcsICdMaXRlcmFsJywNCidNYXRjaEZpcnN0JywgJ05vTWF0Y2gnLCAnTm90QW55JywgJ09uZU9yTW9yZScsICdPbmx5T25jZScsICdPcHRpb25hbCcsICdPcicsDQonUGFyc2VCYXNlRXhjZXB0aW9uJywgJ1BhcnNlRWxlbWVudEVuaGFuY2UnLCAnUGFyc2VFeGNlcHRpb24nLCAnUGFyc2VFeHByZXNzaW9uJywgJ1BhcnNlRmF0YWxFeGNlcHRpb24nLA0KJ1BhcnNlUmVzdWx0cycsICdQYXJzZVN5bnRheEV4Y2VwdGlvbicsICdQYXJzZXJFbGVtZW50JywgJ1F1b3RlZFN0cmluZycsICdSZWN1cnNpdmVHcmFtbWFyRXhjZXB0aW9uJywNCidSZWdleCcsICdTa2lwVG8nLCAnU3RyaW5nRW5kJywgJ1N0cmluZ1N0YXJ0JywgJ1N1cHByZXNzJywgJ1Rva2VuJywgJ1Rva2VuQ29udmVydGVyJywgDQonV2hpdGUnLCAnV29yZCcsICdXb3JkRW5kJywgJ1dvcmRTdGFydCcsICdaZXJvT3JNb3JlJywNCidhbHBoYW51bXMnLCAnYWxwaGFzJywgJ2FscGhhczhiaXQnLCAnYW55Q2xvc2VUYWcnLCAnYW55T3BlblRhZycsICdjU3R5bGVDb21tZW50JywgJ2NvbCcsDQonY29tbWFTZXBhcmF0ZWRMaXN0JywgJ2NvbW1vbkhUTUxFbnRpdHknLCAnY291bnRlZEFycmF5JywgJ2NwcFN0eWxlQ29tbWVudCcsICdkYmxRdW90ZWRTdHJpbmcnLA0KJ2RibFNsYXNoQ29tbWVudCcsICdkZWxpbWl0ZWRMaXN0JywgJ2RpY3RPZicsICdkb3duY2FzZVRva2VucycsICdlbXB0eScsICdoZXhudW1zJywNCidodG1sQ29tbWVudCcsICdqYXZhU3R5bGVDb21tZW50JywgJ2xpbmUnLCAnbGluZUVuZCcsICdsaW5lU3RhcnQnLCAnbGluZW5vJywNCidtYWtlSFRNTFRhZ3MnLCAnbWFrZVhNTFRhZ3MnLCAnbWF0Y2hPbmx5QXRDb2wnLCAnbWF0Y2hQcmV2aW91c0V4cHInLCAnbWF0Y2hQcmV2aW91c0xpdGVyYWwnLA0KJ25lc3RlZEV4cHInLCAnbnVsbERlYnVnQWN0aW9uJywgJ251bXMnLCAnb25lT2YnLCAnb3BBc3NvYycsICdvcGVyYXRvclByZWNlZGVuY2UnLCAncHJpbnRhYmxlcycsDQoncHVuYzhiaXQnLCAncHl0aG9uU3R5bGVDb21tZW50JywgJ3F1b3RlZFN0cmluZycsICdyZW1vdmVRdW90ZXMnLCAncmVwbGFjZUhUTUxFbnRpdHknLCANCidyZXBsYWNlV2l0aCcsICdyZXN0T2ZMaW5lJywgJ3NnbFF1b3RlZFN0cmluZycsICdzcmFuZ2UnLCAnc3RyaW5nRW5kJywNCidzdHJpbmdTdGFydCcsICd0cmFjZVBhcnNlQWN0aW9uJywgJ3VuaWNvZGVTdHJpbmcnLCAndXBjYXNlVG9rZW5zJywgJ3dpdGhBdHRyaWJ1dGUnLA0KJ2luZGVudGVkQmxvY2snLCAnb3JpZ2luYWxUZXh0Rm9yJywgJ3VuZ3JvdXAnLCAnaW5maXhOb3RhdGlvbicsJ2xvY2F0ZWRFeHByJywgJ3dpdGhDbGFzcycsDQonQ2xvc2VNYXRjaCcsICd0b2tlbk1hcCcsICdweXBhcnNpbmdfY29tbW9uJywNCl0NCg0Kc3lzdGVtX3ZlcnNpb24gPSB0dXBsZShzeXMudmVyc2lvbl9pbmZvKVs6M10NClBZXzMgPSBzeXN0ZW1fdmVyc2lvblswXSA9PSAzDQppZiBQWV8zOg0KICAgIF9NQVhfSU5UID0gc3lzLm1heHNpemUNCiAgICBiYXNlc3RyaW5nID0gc3RyDQogICAgdW5pY2hyID0gY2hyDQogICAgX3VzdHIgPSBzdHINCg0KICAgICMgYnVpbGQgbGlzdCBvZiBzaW5nbGUgYXJnIGJ1aWx0aW5zLCB0aGF0IGNhbiBiZSB1c2VkIGFzIHBhcnNlIGFjdGlvbnMNCiAgICBzaW5nbGVBcmdCdWlsdGlucyA9IFtzdW0sIGxlbiwgc29ydGVkLCByZXZlcnNlZCwgbGlzdCwgdHVwbGUsIHNldCwgYW55LCBhbGwsIG1pbiwgbWF4XQ0KDQplbHNlOg0KICAgIF9NQVhfSU5UID0gc3lzLm1heGludA0KICAgIHJhbmdlID0geHJhbmdlDQoNCiAgICBkZWYgX3VzdHIob2JqKToNCiAgICAgICAgIiIiRHJvcC1pbiByZXBsYWNlbWVudCBmb3Igc3RyKG9iaikgdGhhdCB0cmllcyB0byBiZSBVbmljb2RlIGZyaWVuZGx5LiBJdCBmaXJzdCB0cmllcw0KICAgICAgICAgICBzdHIob2JqKS4gSWYgdGhhdCBmYWlscyB3aXRoIGEgVW5pY29kZUVuY29kZUVycm9yLCB0aGVuIGl0IHRyaWVzIHVuaWNvZGUob2JqKS4gSXQNCiAgICAgICAgICAgdGhlbiA8IHJldHVybnMgdGhlIHVuaWNvZGUgb2JqZWN0IHwgZW5jb2RlcyBpdCB3aXRoIHRoZSBkZWZhdWx0IGVuY29kaW5nIHwgLi4uID4uDQogICAgICAgICIiIg0KICAgICAgICBpZiBpc2luc3RhbmNlKG9iaix1bmljb2RlKToNCiAgICAgICAgICAgIHJldHVybiBvYmoNCg0KICAgICAgICB0cnk6DQogICAgICAgICAgICAjIElmIHRoaXMgd29ya3MsIHRoZW4gX3VzdHIob2JqKSBoYXMgdGhlIHNhbWUgYmVoYXZpb3VyIGFzIHN0cihvYmopLCBzbw0KICAgICAgICAgICAgIyBpdCB3b24ndCBicmVhayBhbnkgZXhpc3RpbmcgY29kZS4NCiAgICAgICAgICAgIHJldHVybiBzdHIob2JqKQ0KDQogICAgICAgIGV4Y2VwdCBVbmljb2RlRW5jb2RlRXJyb3I6DQogICAgICAgICAgICAjIEVsc2UgZW5jb2RlIGl0DQogICAgICAgICAgICByZXQgPSB1bmljb2RlKG9iaikuZW5jb2RlKHN5cy5nZXRkZWZhdWx0ZW5jb2RpbmcoKSwgJ3htbGNoYXJyZWZyZXBsYWNlJykNCiAgICAgICAgICAgIHhtbGNoYXJyZWYgPSBSZWdleChyJyYjXGQrOycpDQogICAgICAgICAgICB4bWxjaGFycmVmLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0OiAnXFx1JyArIGhleChpbnQodFswXVsyOi0xXSkpWzI6XSkNCiAgICAgICAgICAgIHJldHVybiB4bWxjaGFycmVmLnRyYW5zZm9ybVN0cmluZyhyZXQpDQoNCiAgICAjIGJ1aWxkIGxpc3Qgb2Ygc2luZ2xlIGFyZyBidWlsdGlucywgdG9sZXJhbnQgb2YgUHl0aG9uIHZlcnNpb24sIHRoYXQgY2FuIGJlIHVzZWQgYXMgcGFyc2UgYWN0aW9ucw0KICAgIHNpbmdsZUFyZ0J1aWx0aW5zID0gW10NCiAgICBpbXBvcnQgX19idWlsdGluX18NCiAgICBmb3IgZm5hbWUgaW4gInN1bSBsZW4gc29ydGVkIHJldmVyc2VkIGxpc3QgdHVwbGUgc2V0IGFueSBhbGwgbWluIG1heCIuc3BsaXQoKToNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgc2luZ2xlQXJnQnVpbHRpbnMuYXBwZW5kKGdldGF0dHIoX19idWlsdGluX18sZm5hbWUpKQ0KICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6DQogICAgICAgICAgICBjb250aW51ZQ0KICAgICAgICAgICAgDQpfZ2VuZXJhdG9yVHlwZSA9IHR5cGUoKHkgZm9yIHkgaW4gcmFuZ2UoMSkpKQ0KIA0KZGVmIF94bWxfZXNjYXBlKGRhdGEpOg0KICAgICIiIkVzY2FwZSAmLCA8LCA+LCAiLCAnLCBldGMuIGluIGEgc3RyaW5nIG9mIGRhdGEuIiIiDQoNCiAgICAjIGFtcGVyc2FuZCBtdXN0IGJlIHJlcGxhY2VkIGZpcnN0DQogICAgZnJvbV9zeW1ib2xzID0gJyY+PCJcJycNCiAgICB0b19zeW1ib2xzID0gKCcmJytzKyc7JyBmb3IgcyBpbiAiYW1wIGd0IGx0IHF1b3QgYXBvcyIuc3BsaXQoKSkNCiAgICBmb3IgZnJvbV8sdG9fIGluIHppcChmcm9tX3N5bWJvbHMsIHRvX3N5bWJvbHMpOg0KICAgICAgICBkYXRhID0gZGF0YS5yZXBsYWNlKGZyb21fLCB0b18pDQogICAgcmV0dXJuIGRhdGENCg0KY2xhc3MgX0NvbnN0YW50cyhvYmplY3QpOg0KICAgIHBhc3MNCg0KYWxwaGFzICAgICA9IHN0cmluZy5hc2NpaV91cHBlcmNhc2UgKyBzdHJpbmcuYXNjaWlfbG93ZXJjYXNlDQpudW1zICAgICAgID0gIjAxMjM0NTY3ODkiDQpoZXhudW1zICAgID0gbnVtcyArICJBQkNERUZhYmNkZWYiDQphbHBoYW51bXMgID0gYWxwaGFzICsgbnVtcw0KX2JzbGFzaCAgICA9IGNocig5MikNCnByaW50YWJsZXMgPSAiIi5qb2luKGMgZm9yIGMgaW4gc3RyaW5nLnByaW50YWJsZSBpZiBjIG5vdCBpbiBzdHJpbmcud2hpdGVzcGFjZSkNCg0KY2xhc3MgUGFyc2VCYXNlRXhjZXB0aW9uKEV4Y2VwdGlvbik6DQogICAgIiIiYmFzZSBleGNlcHRpb24gY2xhc3MgZm9yIGFsbCBwYXJzaW5nIHJ1bnRpbWUgZXhjZXB0aW9ucyIiIg0KICAgICMgUGVyZm9ybWFuY2UgdHVuaW5nOiB3ZSBjb25zdHJ1Y3QgYSAqbG90KiBvZiB0aGVzZSwgc28ga2VlcCB0aGlzDQogICAgIyBjb25zdHJ1Y3RvciBhcyBzbWFsbCBhbmQgZmFzdCBhcyBwb3NzaWJsZQ0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgcHN0ciwgbG9jPTAsIG1zZz1Ob25lLCBlbGVtPU5vbmUgKToNCiAgICAgICAgc2VsZi5sb2MgPSBsb2MNCiAgICAgICAgaWYgbXNnIGlzIE5vbmU6DQogICAgICAgICAgICBzZWxmLm1zZyA9IHBzdHINCiAgICAgICAgICAgIHNlbGYucHN0ciA9ICIiDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBzZWxmLm1zZyA9IG1zZw0KICAgICAgICAgICAgc2VsZi5wc3RyID0gcHN0cg0KICAgICAgICBzZWxmLnBhcnNlckVsZW1lbnQgPSBlbGVtDQogICAgICAgIHNlbGYuYXJncyA9IChwc3RyLCBsb2MsIG1zZykNCg0KICAgIEBjbGFzc21ldGhvZA0KICAgIGRlZiBfZnJvbV9leGNlcHRpb24oY2xzLCBwZSk6DQogICAgICAgICIiIg0KICAgICAgICBpbnRlcm5hbCBmYWN0b3J5IG1ldGhvZCB0byBzaW1wbGlmeSBjcmVhdGluZyBvbmUgdHlwZSBvZiBQYXJzZUV4Y2VwdGlvbiANCiAgICAgICAgZnJvbSBhbm90aGVyIC0gYXZvaWRzIGhhdmluZyBfX2luaXRfXyBzaWduYXR1cmUgY29uZmxpY3RzIGFtb25nIHN1YmNsYXNzZXMNCiAgICAgICAgIiIiDQogICAgICAgIHJldHVybiBjbHMocGUucHN0ciwgcGUubG9jLCBwZS5tc2csIHBlLnBhcnNlckVsZW1lbnQpDQoNCiAgICBkZWYgX19nZXRhdHRyX18oIHNlbGYsIGFuYW1lICk6DQogICAgICAgICIiInN1cHBvcnRlZCBhdHRyaWJ1dGVzIGJ5IG5hbWUgYXJlOg0KICAgICAgICAgICAgLSBsaW5lbm8gLSByZXR1cm5zIHRoZSBsaW5lIG51bWJlciBvZiB0aGUgZXhjZXB0aW9uIHRleHQNCiAgICAgICAgICAgIC0gY29sIC0gcmV0dXJucyB0aGUgY29sdW1uIG51bWJlciBvZiB0aGUgZXhjZXB0aW9uIHRleHQNCiAgICAgICAgICAgIC0gbGluZSAtIHJldHVybnMgdGhlIGxpbmUgY29udGFpbmluZyB0aGUgZXhjZXB0aW9uIHRleHQNCiAgICAgICAgIiIiDQogICAgICAgIGlmKCBhbmFtZSA9PSAibGluZW5vIiApOg0KICAgICAgICAgICAgcmV0dXJuIGxpbmVubyggc2VsZi5sb2MsIHNlbGYucHN0ciApDQogICAgICAgIGVsaWYoIGFuYW1lIGluICgiY29sIiwgImNvbHVtbiIpICk6DQogICAgICAgICAgICByZXR1cm4gY29sKCBzZWxmLmxvYywgc2VsZi5wc3RyICkNCiAgICAgICAgZWxpZiggYW5hbWUgPT0gImxpbmUiICk6DQogICAgICAgICAgICByZXR1cm4gbGluZSggc2VsZi5sb2MsIHNlbGYucHN0ciApDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcihhbmFtZSkNCg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIHJldHVybiAiJXMgKGF0IGNoYXIgJWQpLCAobGluZTolZCwgY29sOiVkKSIgJSBcDQogICAgICAgICAgICAgICAgKCBzZWxmLm1zZywgc2VsZi5sb2MsIHNlbGYubGluZW5vLCBzZWxmLmNvbHVtbiApDQogICAgZGVmIF9fcmVwcl9fKCBzZWxmICk6DQogICAgICAgIHJldHVybiBfdXN0cihzZWxmKQ0KICAgIGRlZiBtYXJrSW5wdXRsaW5lKCBzZWxmLCBtYXJrZXJTdHJpbmcgPSAiPiE8IiApOg0KICAgICAgICAiIiJFeHRyYWN0cyB0aGUgZXhjZXB0aW9uIGxpbmUgZnJvbSB0aGUgaW5wdXQgc3RyaW5nLCBhbmQgbWFya3MNCiAgICAgICAgICAgdGhlIGxvY2F0aW9uIG9mIHRoZSBleGNlcHRpb24gd2l0aCBhIHNwZWNpYWwgc3ltYm9sLg0KICAgICAgICAiIiINCiAgICAgICAgbGluZV9zdHIgPSBzZWxmLmxpbmUNCiAgICAgICAgbGluZV9jb2x1bW4gPSBzZWxmLmNvbHVtbiAtIDENCiAgICAgICAgaWYgbWFya2VyU3RyaW5nOg0KICAgICAgICAgICAgbGluZV9zdHIgPSAiIi5qb2luKChsaW5lX3N0cls6bGluZV9jb2x1bW5dLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXJTdHJpbmcsIGxpbmVfc3RyW2xpbmVfY29sdW1uOl0pKQ0KICAgICAgICByZXR1cm4gbGluZV9zdHIuc3RyaXAoKQ0KICAgIGRlZiBfX2Rpcl9fKHNlbGYpOg0KICAgICAgICByZXR1cm4gImxpbmVubyBjb2wgbGluZSIuc3BsaXQoKSArIGRpcih0eXBlKHNlbGYpKQ0KDQpjbGFzcyBQYXJzZUV4Y2VwdGlvbihQYXJzZUJhc2VFeGNlcHRpb24pOg0KICAgICIiIg0KICAgIEV4Y2VwdGlvbiB0aHJvd24gd2hlbiBwYXJzZSBleHByZXNzaW9ucyBkb24ndCBtYXRjaCBjbGFzczsNCiAgICBzdXBwb3J0ZWQgYXR0cmlidXRlcyBieSBuYW1lIGFyZToNCiAgICAgLSBsaW5lbm8gLSByZXR1cm5zIHRoZSBsaW5lIG51bWJlciBvZiB0aGUgZXhjZXB0aW9uIHRleHQNCiAgICAgLSBjb2wgLSByZXR1cm5zIHRoZSBjb2x1bW4gbnVtYmVyIG9mIHRoZSBleGNlcHRpb24gdGV4dA0KICAgICAtIGxpbmUgLSByZXR1cm5zIHRoZSBsaW5lIGNvbnRhaW5pbmcgdGhlIGV4Y2VwdGlvbiB0ZXh0DQogICAgICAgIA0KICAgIEV4YW1wbGU6Og0KICAgICAgICB0cnk6DQogICAgICAgICAgICBXb3JkKG51bXMpLnNldE5hbWUoImludGVnZXIiKS5wYXJzZVN0cmluZygiQUJDIikNCiAgICAgICAgZXhjZXB0IFBhcnNlRXhjZXB0aW9uIGFzIHBlOg0KICAgICAgICAgICAgcHJpbnQocGUpDQogICAgICAgICAgICBwcmludCgiY29sdW1uOiB7fSIuZm9ybWF0KHBlLmNvbCkpDQogICAgICAgICAgICANCiAgICBwcmludHM6Og0KICAgICAgIEV4cGVjdGVkIGludGVnZXIgKGF0IGNoYXIgMCksIChsaW5lOjEsIGNvbDoxKQ0KICAgICAgICBjb2x1bW46IDENCiAgICAiIiINCiAgICBwYXNzDQoNCmNsYXNzIFBhcnNlRmF0YWxFeGNlcHRpb24oUGFyc2VCYXNlRXhjZXB0aW9uKToNCiAgICAiIiJ1c2VyLXRocm93YWJsZSBleGNlcHRpb24gdGhyb3duIHdoZW4gaW5jb25zaXN0ZW50IHBhcnNlIGNvbnRlbnQNCiAgICAgICBpcyBmb3VuZDsgc3RvcHMgYWxsIHBhcnNpbmcgaW1tZWRpYXRlbHkiIiINCiAgICBwYXNzDQoNCmNsYXNzIFBhcnNlU3ludGF4RXhjZXB0aW9uKFBhcnNlRmF0YWxFeGNlcHRpb24pOg0KICAgICIiImp1c3QgbGlrZSBMe1BhcnNlRmF0YWxFeGNlcHRpb259LCBidXQgdGhyb3duIGludGVybmFsbHkgd2hlbiBhbg0KICAgICAgIEx7RXJyb3JTdG9wPEFuZC5fRXJyb3JTdG9wPn0gKCctJyBvcGVyYXRvcikgaW5kaWNhdGVzIHRoYXQgcGFyc2luZyBpcyB0byBzdG9wIA0KICAgICAgIGltbWVkaWF0ZWx5IGJlY2F1c2UgYW4gdW5iYWNrdHJhY2thYmxlIHN5bnRheCBlcnJvciBoYXMgYmVlbiBmb3VuZCIiIg0KICAgIHBhc3MNCg0KI34gY2xhc3MgUmVwYXJzZUV4Y2VwdGlvbihQYXJzZUJhc2VFeGNlcHRpb24pOg0KICAgICN+ICIiIkV4cGVyaW1lbnRhbCBjbGFzcyAtIHBhcnNlIGFjdGlvbnMgY2FuIHJhaXNlIHRoaXMgZXhjZXB0aW9uIHRvIGNhdXNlDQogICAgICAgI34gcHlwYXJzaW5nIHRvIHJlcGFyc2UgdGhlIGlucHV0IHN0cmluZzoNCiAgICAgICAgI34gLSB3aXRoIGEgbW9kaWZpZWQgaW5wdXQgc3RyaW5nLCBhbmQvb3INCiAgICAgICAgI34gLSB3aXRoIGEgbW9kaWZpZWQgc3RhcnQgbG9jYXRpb24NCiAgICAgICAjfiBTZXQgdGhlIHZhbHVlcyBvZiB0aGUgUmVwYXJzZUV4Y2VwdGlvbiBpbiB0aGUgY29uc3RydWN0b3IsIGFuZCByYWlzZSB0aGUNCiAgICAgICAjfiBleGNlcHRpb24gaW4gYSBwYXJzZSBhY3Rpb24gdG8gY2F1c2UgcHlwYXJzaW5nIHRvIHVzZSB0aGUgbmV3IHN0cmluZy9sb2NhdGlvbi4NCiAgICAgICAjfiBTZXR0aW5nIHRoZSB2YWx1ZXMgYXMgTm9uZSBjYXVzZXMgbm8gY2hhbmdlIHRvIGJlIG1hZGUuDQogICAgICAgI34gIiIiDQogICAgI34gZGVmIF9faW5pdF8oIHNlbGYsIG5ld3N0cmluZywgcmVzdGFydExvYyApOg0KICAgICAgICAjfiBzZWxmLm5ld1BhcnNlVGV4dCA9IG5ld3N0cmluZw0KICAgICAgICAjfiBzZWxmLnJlcGFyc2VMb2MgPSByZXN0YXJ0TG9jDQoNCmNsYXNzIFJlY3Vyc2l2ZUdyYW1tYXJFeGNlcHRpb24oRXhjZXB0aW9uKToNCiAgICAiIiJleGNlcHRpb24gdGhyb3duIGJ5IEx7UGFyc2VyRWxlbWVudC52YWxpZGF0ZX0gaWYgdGhlIGdyYW1tYXIgY291bGQgYmUgaW1wcm9wZXJseSByZWN1cnNpdmUiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIHBhcnNlRWxlbWVudExpc3QgKToNCiAgICAgICAgc2VsZi5wYXJzZUVsZW1lbnRUcmFjZSA9IHBhcnNlRWxlbWVudExpc3QNCg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIHJldHVybiAiUmVjdXJzaXZlR3JhbW1hckV4Y2VwdGlvbjogJXMiICUgc2VsZi5wYXJzZUVsZW1lbnRUcmFjZQ0KDQpjbGFzcyBfUGFyc2VSZXN1bHRzV2l0aE9mZnNldChvYmplY3QpOg0KICAgIGRlZiBfX2luaXRfXyhzZWxmLHAxLHAyKToNCiAgICAgICAgc2VsZi50dXAgPSAocDEscDIpDQogICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsaSk6DQogICAgICAgIHJldHVybiBzZWxmLnR1cFtpXQ0KICAgIGRlZiBfX3JlcHJfXyhzZWxmKToNCiAgICAgICAgcmV0dXJuIHJlcHIoc2VsZi50dXBbMF0pDQogICAgZGVmIHNldE9mZnNldChzZWxmLGkpOg0KICAgICAgICBzZWxmLnR1cCA9IChzZWxmLnR1cFswXSxpKQ0KDQpjbGFzcyBQYXJzZVJlc3VsdHMob2JqZWN0KToNCiAgICAiIiINCiAgICBTdHJ1Y3R1cmVkIHBhcnNlIHJlc3VsdHMsIHRvIHByb3ZpZGUgbXVsdGlwbGUgbWVhbnMgb2YgYWNjZXNzIHRvIHRoZSBwYXJzZWQgZGF0YToNCiAgICAgICAtIGFzIGEgbGlzdCAoQ3tsZW4ocmVzdWx0cyl9KQ0KICAgICAgIC0gYnkgbGlzdCBpbmRleCAoQ3tyZXN1bHRzWzBdLCByZXN1bHRzWzFdfSwgZXRjLikNCiAgICAgICAtIGJ5IGF0dHJpYnV0ZSAoQ3tyZXN1bHRzLjxyZXN1bHRzTmFtZT59IC0gc2VlIEx7UGFyc2VyRWxlbWVudC5zZXRSZXN1bHRzTmFtZX0pDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykNCiAgICAgICAgZGF0ZV9zdHIgPSAoaW50ZWdlci5zZXRSZXN1bHRzTmFtZSgieWVhciIpICsgJy8nIA0KICAgICAgICAgICAgICAgICAgICAgICAgKyBpbnRlZ2VyLnNldFJlc3VsdHNOYW1lKCJtb250aCIpICsgJy8nIA0KICAgICAgICAgICAgICAgICAgICAgICAgKyBpbnRlZ2VyLnNldFJlc3VsdHNOYW1lKCJkYXkiKSkNCiAgICAgICAgIyBlcXVpdmFsZW50IGZvcm06DQogICAgICAgICMgZGF0ZV9zdHIgPSBpbnRlZ2VyKCJ5ZWFyIikgKyAnLycgKyBpbnRlZ2VyKCJtb250aCIpICsgJy8nICsgaW50ZWdlcigiZGF5IikNCg0KICAgICAgICAjIHBhcnNlU3RyaW5nIHJldHVybnMgYSBQYXJzZVJlc3VsdHMgb2JqZWN0DQogICAgICAgIHJlc3VsdCA9IGRhdGVfc3RyLnBhcnNlU3RyaW5nKCIxOTk5LzEyLzMxIikNCg0KICAgICAgICBkZWYgdGVzdChzLCBmbj1yZXByKToNCiAgICAgICAgICAgIHByaW50KCIlcyAtPiAlcyIgJSAocywgZm4oZXZhbChzKSkpKQ0KICAgICAgICB0ZXN0KCJsaXN0KHJlc3VsdCkiKQ0KICAgICAgICB0ZXN0KCJyZXN1bHRbMF0iKQ0KICAgICAgICB0ZXN0KCJyZXN1bHRbJ21vbnRoJ10iKQ0KICAgICAgICB0ZXN0KCJyZXN1bHQuZGF5IikNCiAgICAgICAgdGVzdCgiJ21vbnRoJyBpbiByZXN1bHQiKQ0KICAgICAgICB0ZXN0KCInbWludXRlcycgaW4gcmVzdWx0IikNCiAgICAgICAgdGVzdCgicmVzdWx0LmR1bXAoKSIsIHN0cikNCiAgICBwcmludHM6Og0KICAgICAgICBsaXN0KHJlc3VsdCkgLT4gWycxOTk5JywgJy8nLCAnMTInLCAnLycsICczMSddDQogICAgICAgIHJlc3VsdFswXSAtPiAnMTk5OScNCiAgICAgICAgcmVzdWx0Wydtb250aCddIC0+ICcxMicNCiAgICAgICAgcmVzdWx0LmRheSAtPiAnMzEnDQogICAgICAgICdtb250aCcgaW4gcmVzdWx0IC0+IFRydWUNCiAgICAgICAgJ21pbnV0ZXMnIGluIHJlc3VsdCAtPiBGYWxzZQ0KICAgICAgICByZXN1bHQuZHVtcCgpIC0+IFsnMTk5OScsICcvJywgJzEyJywgJy8nLCAnMzEnXQ0KICAgICAgICAtIGRheTogMzENCiAgICAgICAgLSBtb250aDogMTINCiAgICAgICAgLSB5ZWFyOiAxOTk5DQogICAgIiIiDQogICAgZGVmIF9fbmV3X18oY2xzLCB0b2tsaXN0PU5vbmUsIG5hbWU9Tm9uZSwgYXNMaXN0PVRydWUsIG1vZGFsPVRydWUgKToNCiAgICAgICAgaWYgaXNpbnN0YW5jZSh0b2tsaXN0LCBjbHMpOg0KICAgICAgICAgICAgcmV0dXJuIHRva2xpc3QNCiAgICAgICAgcmV0b2JqID0gb2JqZWN0Ll9fbmV3X18oY2xzKQ0KICAgICAgICByZXRvYmouX19kb2luaXQgPSBUcnVlDQogICAgICAgIHJldHVybiByZXRvYmoNCg0KICAgICMgUGVyZm9ybWFuY2UgdHVuaW5nOiB3ZSBjb25zdHJ1Y3QgYSAqbG90KiBvZiB0aGVzZSwgc28ga2VlcCB0aGlzDQogICAgIyBjb25zdHJ1Y3RvciBhcyBzbWFsbCBhbmQgZmFzdCBhcyBwb3NzaWJsZQ0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgdG9rbGlzdD1Ob25lLCBuYW1lPU5vbmUsIGFzTGlzdD1UcnVlLCBtb2RhbD1UcnVlLCBpc2luc3RhbmNlPWlzaW5zdGFuY2UgKToNCiAgICAgICAgaWYgc2VsZi5fX2RvaW5pdDoNCiAgICAgICAgICAgIHNlbGYuX19kb2luaXQgPSBGYWxzZQ0KICAgICAgICAgICAgc2VsZi5fX25hbWUgPSBOb25lDQogICAgICAgICAgICBzZWxmLl9fcGFyZW50ID0gTm9uZQ0KICAgICAgICAgICAgc2VsZi5fX2FjY3VtTmFtZXMgPSB7fQ0KICAgICAgICAgICAgc2VsZi5fX2FzTGlzdCA9IGFzTGlzdA0KICAgICAgICAgICAgc2VsZi5fX21vZGFsID0gbW9kYWwNCiAgICAgICAgICAgIGlmIHRva2xpc3QgaXMgTm9uZToNCiAgICAgICAgICAgICAgICB0b2tsaXN0ID0gW10NCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodG9rbGlzdCwgbGlzdCk6DQogICAgICAgICAgICAgICAgc2VsZi5fX3Rva2xpc3QgPSB0b2tsaXN0WzpdDQogICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UodG9rbGlzdCwgX2dlbmVyYXRvclR5cGUpOg0KICAgICAgICAgICAgICAgIHNlbGYuX190b2tsaXN0ID0gbGlzdCh0b2tsaXN0KQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICBzZWxmLl9fdG9rbGlzdCA9IFt0b2tsaXN0XQ0KICAgICAgICAgICAgc2VsZi5fX3Rva2RpY3QgPSBkaWN0KCkNCg0KICAgICAgICBpZiBuYW1lIGlzIG5vdCBOb25lIGFuZCBuYW1lOg0KICAgICAgICAgICAgaWYgbm90IG1vZGFsOg0KICAgICAgICAgICAgICAgIHNlbGYuX19hY2N1bU5hbWVzW25hbWVdID0gMA0KICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShuYW1lLGludCk6DQogICAgICAgICAgICAgICAgbmFtZSA9IF91c3RyKG5hbWUpICMgd2lsbCBhbHdheXMgcmV0dXJuIGEgc3RyLCBidXQgdXNlIF91c3RyIGZvciBjb25zaXN0ZW5jeQ0KICAgICAgICAgICAgc2VsZi5fX25hbWUgPSBuYW1lDQogICAgICAgICAgICBpZiBub3QgKGlzaW5zdGFuY2UodG9rbGlzdCwgKHR5cGUoTm9uZSksIGJhc2VzdHJpbmcsIGxpc3QpKSBhbmQgdG9rbGlzdCBpbiAoTm9uZSwnJyxbXSkpOg0KICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodG9rbGlzdCxiYXNlc3RyaW5nKToNCiAgICAgICAgICAgICAgICAgICAgdG9rbGlzdCA9IFsgdG9rbGlzdCBdDQogICAgICAgICAgICAgICAgaWYgYXNMaXN0Og0KICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHRva2xpc3QsUGFyc2VSZXN1bHRzKToNCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGZbbmFtZV0gPSBfUGFyc2VSZXN1bHRzV2l0aE9mZnNldCh0b2tsaXN0LmNvcHkoKSwwKQ0KICAgICAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZltuYW1lXSA9IF9QYXJzZVJlc3VsdHNXaXRoT2Zmc2V0KFBhcnNlUmVzdWx0cyh0b2tsaXN0WzBdKSwwKQ0KICAgICAgICAgICAgICAgICAgICBzZWxmW25hbWVdLl9fbmFtZSA9IG5hbWUNCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgICAgICAgICBzZWxmW25hbWVdID0gdG9rbGlzdFswXQ0KICAgICAgICAgICAgICAgICAgICBleGNlcHQgKEtleUVycm9yLFR5cGVFcnJvcixJbmRleEVycm9yKToNCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGZbbmFtZV0gPSB0b2tsaXN0DQoNCiAgICBkZWYgX19nZXRpdGVtX18oIHNlbGYsIGkgKToNCiAgICAgICAgaWYgaXNpbnN0YW5jZSggaSwgKGludCxzbGljZSkgKToNCiAgICAgICAgICAgIHJldHVybiBzZWxmLl9fdG9rbGlzdFtpXQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgaWYgaSBub3QgaW4gc2VsZi5fX2FjY3VtTmFtZXM6DQogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX190b2tkaWN0W2ldWy0xXVswXQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICByZXR1cm4gUGFyc2VSZXN1bHRzKFsgdlswXSBmb3IgdiBpbiBzZWxmLl9fdG9rZGljdFtpXSBdKQ0KDQogICAgZGVmIF9fc2V0aXRlbV9fKCBzZWxmLCBrLCB2LCBpc2luc3RhbmNlPWlzaW5zdGFuY2UgKToNCiAgICAgICAgaWYgaXNpbnN0YW5jZSh2LF9QYXJzZVJlc3VsdHNXaXRoT2Zmc2V0KToNCiAgICAgICAgICAgIHNlbGYuX190b2tkaWN0W2tdID0gc2VsZi5fX3Rva2RpY3QuZ2V0KGssbGlzdCgpKSArIFt2XQ0KICAgICAgICAgICAgc3ViID0gdlswXQ0KICAgICAgICBlbGlmIGlzaW5zdGFuY2UoaywoaW50LHNsaWNlKSk6DQogICAgICAgICAgICBzZWxmLl9fdG9rbGlzdFtrXSA9IHYNCiAgICAgICAgICAgIHN1YiA9IHYNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHNlbGYuX190b2tkaWN0W2tdID0gc2VsZi5fX3Rva2RpY3QuZ2V0KGssbGlzdCgpKSArIFtfUGFyc2VSZXN1bHRzV2l0aE9mZnNldCh2LDApXQ0KICAgICAgICAgICAgc3ViID0gdg0KICAgICAgICBpZiBpc2luc3RhbmNlKHN1YixQYXJzZVJlc3VsdHMpOg0KICAgICAgICAgICAgc3ViLl9fcGFyZW50ID0gd2tyZWYoc2VsZikNCg0KICAgIGRlZiBfX2RlbGl0ZW1fXyggc2VsZiwgaSApOg0KICAgICAgICBpZiBpc2luc3RhbmNlKGksKGludCxzbGljZSkpOg0KICAgICAgICAgICAgbXlsZW4gPSBsZW4oIHNlbGYuX190b2tsaXN0ICkNCiAgICAgICAgICAgIGRlbCBzZWxmLl9fdG9rbGlzdFtpXQ0KDQogICAgICAgICAgICAjIGNvbnZlcnQgaW50IHRvIHNsaWNlDQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGksIGludCk6DQogICAgICAgICAgICAgICAgaWYgaSA8IDA6DQogICAgICAgICAgICAgICAgICAgIGkgKz0gbXlsZW4NCiAgICAgICAgICAgICAgICBpID0gc2xpY2UoaSwgaSsxKQ0KICAgICAgICAgICAgIyBnZXQgcmVtb3ZlZCBpbmRpY2VzDQogICAgICAgICAgICByZW1vdmVkID0gbGlzdChyYW5nZSgqaS5pbmRpY2VzKG15bGVuKSkpDQogICAgICAgICAgICByZW1vdmVkLnJldmVyc2UoKQ0KICAgICAgICAgICAgIyBmaXh1cCBpbmRpY2VzIGluIHRva2VuIGRpY3Rpb25hcnkNCiAgICAgICAgICAgIGZvciBuYW1lLG9jY3VycmVuY2VzIGluIHNlbGYuX190b2tkaWN0Lml0ZW1zKCk6DQogICAgICAgICAgICAgICAgZm9yIGogaW4gcmVtb3ZlZDoNCiAgICAgICAgICAgICAgICAgICAgZm9yIGssICh2YWx1ZSwgcG9zaXRpb24pIGluIGVudW1lcmF0ZShvY2N1cnJlbmNlcyk6DQogICAgICAgICAgICAgICAgICAgICAgICBvY2N1cnJlbmNlc1trXSA9IF9QYXJzZVJlc3VsdHNXaXRoT2Zmc2V0KHZhbHVlLCBwb3NpdGlvbiAtIChwb3NpdGlvbiA+IGopKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgZGVsIHNlbGYuX190b2tkaWN0W2ldDQoNCiAgICBkZWYgX19jb250YWluc19fKCBzZWxmLCBrICk6DQogICAgICAgIHJldHVybiBrIGluIHNlbGYuX190b2tkaWN0DQoNCiAgICBkZWYgX19sZW5fXyggc2VsZiApOiByZXR1cm4gbGVuKCBzZWxmLl9fdG9rbGlzdCApDQogICAgZGVmIF9fYm9vbF9fKHNlbGYpOiByZXR1cm4gKCBub3Qgbm90IHNlbGYuX190b2tsaXN0ICkNCiAgICBfX25vbnplcm9fXyA9IF9fYm9vbF9fDQogICAgZGVmIF9faXRlcl9fKCBzZWxmICk6IHJldHVybiBpdGVyKCBzZWxmLl9fdG9rbGlzdCApDQogICAgZGVmIF9fcmV2ZXJzZWRfXyggc2VsZiApOiByZXR1cm4gaXRlciggc2VsZi5fX3Rva2xpc3RbOjotMV0gKQ0KICAgIGRlZiBfaXRlcmtleXMoIHNlbGYgKToNCiAgICAgICAgaWYgaGFzYXR0cihzZWxmLl9fdG9rZGljdCwgIml0ZXJrZXlzIik6DQogICAgICAgICAgICByZXR1cm4gc2VsZi5fX3Rva2RpY3QuaXRlcmtleXMoKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmV0dXJuIGl0ZXIoc2VsZi5fX3Rva2RpY3QpDQoNCiAgICBkZWYgX2l0ZXJ2YWx1ZXMoIHNlbGYgKToNCiAgICAgICAgcmV0dXJuIChzZWxmW2tdIGZvciBrIGluIHNlbGYuX2l0ZXJrZXlzKCkpDQogICAgICAgICAgICANCiAgICBkZWYgX2l0ZXJpdGVtcyggc2VsZiApOg0KICAgICAgICByZXR1cm4gKChrLCBzZWxmW2tdKSBmb3IgayBpbiBzZWxmLl9pdGVya2V5cygpKQ0KDQogICAgaWYgUFlfMzoNCiAgICAgICAga2V5cyA9IF9pdGVya2V5cyAgICAgICANCiAgICAgICAgIiIiUmV0dXJucyBhbiBpdGVyYXRvciBvZiBhbGwgbmFtZWQgcmVzdWx0IGtleXMgKFB5dGhvbiAzLnggb25seSkuIiIiDQoNCiAgICAgICAgdmFsdWVzID0gX2l0ZXJ2YWx1ZXMNCiAgICAgICAgIiIiUmV0dXJucyBhbiBpdGVyYXRvciBvZiBhbGwgbmFtZWQgcmVzdWx0IHZhbHVlcyAoUHl0aG9uIDMueCBvbmx5KS4iIiINCg0KICAgICAgICBpdGVtcyA9IF9pdGVyaXRlbXMNCiAgICAgICAgIiIiUmV0dXJucyBhbiBpdGVyYXRvciBvZiBhbGwgbmFtZWQgcmVzdWx0IGtleS12YWx1ZSB0dXBsZXMgKFB5dGhvbiAzLnggb25seSkuIiIiDQoNCiAgICBlbHNlOg0KICAgICAgICBpdGVya2V5cyA9IF9pdGVya2V5cw0KICAgICAgICAiIiJSZXR1cm5zIGFuIGl0ZXJhdG9yIG9mIGFsbCBuYW1lZCByZXN1bHQga2V5cyAoUHl0aG9uIDIueCBvbmx5KS4iIiINCg0KICAgICAgICBpdGVydmFsdWVzID0gX2l0ZXJ2YWx1ZXMNCiAgICAgICAgIiIiUmV0dXJucyBhbiBpdGVyYXRvciBvZiBhbGwgbmFtZWQgcmVzdWx0IHZhbHVlcyAoUHl0aG9uIDIueCBvbmx5KS4iIiINCg0KICAgICAgICBpdGVyaXRlbXMgPSBfaXRlcml0ZW1zDQogICAgICAgICIiIlJldHVybnMgYW4gaXRlcmF0b3Igb2YgYWxsIG5hbWVkIHJlc3VsdCBrZXktdmFsdWUgdHVwbGVzIChQeXRob24gMi54IG9ubHkpLiIiIg0KDQogICAgICAgIGRlZiBrZXlzKCBzZWxmICk6DQogICAgICAgICAgICAiIiJSZXR1cm5zIGFsbCBuYW1lZCByZXN1bHQga2V5cyAoYXMgYSBsaXN0IGluIFB5dGhvbiAyLngsIGFzIGFuIGl0ZXJhdG9yIGluIFB5dGhvbiAzLngpLiIiIg0KICAgICAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi5pdGVya2V5cygpKQ0KDQogICAgICAgIGRlZiB2YWx1ZXMoIHNlbGYgKToNCiAgICAgICAgICAgICIiIlJldHVybnMgYWxsIG5hbWVkIHJlc3VsdCB2YWx1ZXMgKGFzIGEgbGlzdCBpbiBQeXRob24gMi54LCBhcyBhbiBpdGVyYXRvciBpbiBQeXRob24gMy54KS4iIiINCiAgICAgICAgICAgIHJldHVybiBsaXN0KHNlbGYuaXRlcnZhbHVlcygpKQ0KICAgICAgICAgICAgICAgIA0KICAgICAgICBkZWYgaXRlbXMoIHNlbGYgKToNCiAgICAgICAgICAgICIiIlJldHVybnMgYWxsIG5hbWVkIHJlc3VsdCBrZXktdmFsdWVzIChhcyBhIGxpc3Qgb2YgdHVwbGVzIGluIFB5dGhvbiAyLngsIGFzIGFuIGl0ZXJhdG9yIGluIFB5dGhvbiAzLngpLiIiIg0KICAgICAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi5pdGVyaXRlbXMoKSkNCg0KICAgIGRlZiBoYXNrZXlzKCBzZWxmICk6DQogICAgICAgICIiIlNpbmNlIGtleXMoKSByZXR1cm5zIGFuIGl0ZXJhdG9yLCB0aGlzIG1ldGhvZCBpcyBoZWxwZnVsIGluIGJ5cGFzc2luZw0KICAgICAgICAgICBjb2RlIHRoYXQgbG9va3MgZm9yIHRoZSBleGlzdGVuY2Ugb2YgYW55IGRlZmluZWQgcmVzdWx0cyBuYW1lcy4iIiINCiAgICAgICAgcmV0dXJuIGJvb2woc2VsZi5fX3Rva2RpY3QpDQogICAgICAgIA0KICAgIGRlZiBwb3AoIHNlbGYsICphcmdzLCAqKmt3YXJncyk6DQogICAgICAgICIiIg0KICAgICAgICBSZW1vdmVzIGFuZCByZXR1cm5zIGl0ZW0gYXQgc3BlY2lmaWVkIGluZGV4IChkZWZhdWx0PUN7bGFzdH0pLg0KICAgICAgICBTdXBwb3J0cyBib3RoIEN7bGlzdH0gYW5kIEN7ZGljdH0gc2VtYW50aWNzIGZvciBDe3BvcCgpfS4gSWYgcGFzc2VkIG5vDQogICAgICAgIGFyZ3VtZW50IG9yIGFuIGludGVnZXIgYXJndW1lbnQsIGl0IHdpbGwgdXNlIEN7bGlzdH0gc2VtYW50aWNzDQogICAgICAgIGFuZCBwb3AgdG9rZW5zIGZyb20gdGhlIGxpc3Qgb2YgcGFyc2VkIHRva2Vucy4gSWYgcGFzc2VkIGEgDQogICAgICAgIG5vbi1pbnRlZ2VyIGFyZ3VtZW50IChtb3N0IGxpa2VseSBhIHN0cmluZyksIGl0IHdpbGwgdXNlIEN7ZGljdH0NCiAgICAgICAgc2VtYW50aWNzIGFuZCBwb3AgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgZnJvbSBhbnkgZGVmaW5lZCANCiAgICAgICAgcmVzdWx0cyBuYW1lcy4gQSBzZWNvbmQgZGVmYXVsdCByZXR1cm4gdmFsdWUgYXJndW1lbnQgaXMgDQogICAgICAgIHN1cHBvcnRlZCwganVzdCBhcyBpbiBDe2RpY3QucG9wKCl9Lg0KDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgZGVmIHJlbW92ZV9maXJzdCh0b2tlbnMpOg0KICAgICAgICAgICAgICAgIHRva2Vucy5wb3AoMCkNCiAgICAgICAgICAgIHByaW50KE9uZU9yTW9yZShXb3JkKG51bXMpKS5wYXJzZVN0cmluZygiMCAxMjMgMzIxIikpICMgLT4gWycwJywgJzEyMycsICczMjEnXQ0KICAgICAgICAgICAgcHJpbnQoT25lT3JNb3JlKFdvcmQobnVtcykpLmFkZFBhcnNlQWN0aW9uKHJlbW92ZV9maXJzdCkucGFyc2VTdHJpbmcoIjAgMTIzIDMyMSIpKSAjIC0+IFsnMTIzJywgJzMyMSddDQoNCiAgICAgICAgICAgIGxhYmVsID0gV29yZChhbHBoYXMpDQogICAgICAgICAgICBwYXR0ID0gbGFiZWwoIkxBQkVMIikgKyBPbmVPck1vcmUoV29yZChudW1zKSkNCiAgICAgICAgICAgIHByaW50KHBhdHQucGFyc2VTdHJpbmcoIkFBQiAxMjMgMzIxIikuZHVtcCgpKQ0KDQogICAgICAgICAgICAjIFVzZSBwb3AoKSBpbiBhIHBhcnNlIGFjdGlvbiB0byByZW1vdmUgbmFtZWQgcmVzdWx0IChub3RlIHRoYXQgY29ycmVzcG9uZGluZyB2YWx1ZSBpcyBub3QNCiAgICAgICAgICAgICMgcmVtb3ZlZCBmcm9tIGxpc3QgZm9ybSBvZiByZXN1bHRzKQ0KICAgICAgICAgICAgZGVmIHJlbW92ZV9MQUJFTCh0b2tlbnMpOg0KICAgICAgICAgICAgICAgIHRva2Vucy5wb3AoIkxBQkVMIikNCiAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5zDQogICAgICAgICAgICBwYXR0LmFkZFBhcnNlQWN0aW9uKHJlbW92ZV9MQUJFTCkNCiAgICAgICAgICAgIHByaW50KHBhdHQucGFyc2VTdHJpbmcoIkFBQiAxMjMgMzIxIikuZHVtcCgpKQ0KICAgICAgICBwcmludHM6Og0KICAgICAgICAgICAgWydBQUInLCAnMTIzJywgJzMyMSddDQogICAgICAgICAgICAtIExBQkVMOiBBQUINCg0KICAgICAgICAgICAgWydBQUInLCAnMTIzJywgJzMyMSddDQogICAgICAgICIiIg0KICAgICAgICBpZiBub3QgYXJnczoNCiAgICAgICAgICAgIGFyZ3MgPSBbLTFdDQogICAgICAgIGZvciBrLHYgaW4ga3dhcmdzLml0ZW1zKCk6DQogICAgICAgICAgICBpZiBrID09ICdkZWZhdWx0JzoNCiAgICAgICAgICAgICAgICBhcmdzID0gKGFyZ3NbMF0sIHYpDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigicG9wKCkgZ290IGFuIHVuZXhwZWN0ZWQga2V5d29yZCBhcmd1bWVudCAnJXMnIiAlIGspDQogICAgICAgIGlmIChpc2luc3RhbmNlKGFyZ3NbMF0sIGludCkgb3IgDQogICAgICAgICAgICAgICAgICAgICAgICBsZW4oYXJncykgPT0gMSBvciANCiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbMF0gaW4gc2VsZik6DQogICAgICAgICAgICBpbmRleCA9IGFyZ3NbMF0NCiAgICAgICAgICAgIHJldCA9IHNlbGZbaW5kZXhdDQogICAgICAgICAgICBkZWwgc2VsZltpbmRleF0NCiAgICAgICAgICAgIHJldHVybiByZXQNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIGRlZmF1bHR2YWx1ZSA9IGFyZ3NbMV0NCiAgICAgICAgICAgIHJldHVybiBkZWZhdWx0dmFsdWUNCg0KICAgIGRlZiBnZXQoc2VsZiwga2V5LCBkZWZhdWx0VmFsdWU9Tm9uZSk6DQogICAgICAgICIiIg0KICAgICAgICBSZXR1cm5zIG5hbWVkIHJlc3VsdCBtYXRjaGluZyB0aGUgZ2l2ZW4ga2V5LCBvciBpZiB0aGVyZSBpcyBubw0KICAgICAgICBzdWNoIG5hbWUsIHRoZW4gcmV0dXJucyB0aGUgZ2l2ZW4gQ3tkZWZhdWx0VmFsdWV9IG9yIEN7Tm9uZX0gaWYgbm8NCiAgICAgICAgQ3tkZWZhdWx0VmFsdWV9IGlzIHNwZWNpZmllZC4NCg0KICAgICAgICBTaW1pbGFyIHRvIEN7ZGljdC5nZXQoKX0uDQogICAgICAgIA0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpDQogICAgICAgICAgICBkYXRlX3N0ciA9IGludGVnZXIoInllYXIiKSArICcvJyArIGludGVnZXIoIm1vbnRoIikgKyAnLycgKyBpbnRlZ2VyKCJkYXkiKSAgICAgICAgICAgDQoNCiAgICAgICAgICAgIHJlc3VsdCA9IGRhdGVfc3RyLnBhcnNlU3RyaW5nKCIxOTk5LzEyLzMxIikNCiAgICAgICAgICAgIHByaW50KHJlc3VsdC5nZXQoInllYXIiKSkgIyAtPiAnMTk5OScNCiAgICAgICAgICAgIHByaW50KHJlc3VsdC5nZXQoImhvdXIiLCAibm90IHNwZWNpZmllZCIpKSAjIC0+ICdub3Qgc3BlY2lmaWVkJw0KICAgICAgICAgICAgcHJpbnQocmVzdWx0LmdldCgiaG91ciIpKSAjIC0+IE5vbmUNCiAgICAgICAgIiIiDQogICAgICAgIGlmIGtleSBpbiBzZWxmOg0KICAgICAgICAgICAgcmV0dXJuIHNlbGZba2V5XQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZQ0KDQogICAgZGVmIGluc2VydCggc2VsZiwgaW5kZXgsIGluc1N0ciApOg0KICAgICAgICAiIiINCiAgICAgICAgSW5zZXJ0cyBuZXcgZWxlbWVudCBhdCBsb2NhdGlvbiBpbmRleCBpbiB0aGUgbGlzdCBvZiBwYXJzZWQgdG9rZW5zLg0KICAgICAgICANCiAgICAgICAgU2ltaWxhciB0byBDe2xpc3QuaW5zZXJ0KCl9Lg0KDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgcHJpbnQoT25lT3JNb3JlKFdvcmQobnVtcykpLnBhcnNlU3RyaW5nKCIwIDEyMyAzMjEiKSkgIyAtPiBbJzAnLCAnMTIzJywgJzMyMSddDQoNCiAgICAgICAgICAgICMgdXNlIGEgcGFyc2UgYWN0aW9uIHRvIGluc2VydCB0aGUgcGFyc2UgbG9jYXRpb24gaW4gdGhlIGZyb250IG9mIHRoZSBwYXJzZWQgcmVzdWx0cw0KICAgICAgICAgICAgZGVmIGluc2VydF9sb2NuKGxvY24sIHRva2Vucyk6DQogICAgICAgICAgICAgICAgdG9rZW5zLmluc2VydCgwLCBsb2NuKQ0KICAgICAgICAgICAgcHJpbnQoT25lT3JNb3JlKFdvcmQobnVtcykpLmFkZFBhcnNlQWN0aW9uKGluc2VydF9sb2NuKS5wYXJzZVN0cmluZygiMCAxMjMgMzIxIikpICMgLT4gWzAsICcwJywgJzEyMycsICczMjEnXQ0KICAgICAgICAiIiINCiAgICAgICAgc2VsZi5fX3Rva2xpc3QuaW5zZXJ0KGluZGV4LCBpbnNTdHIpDQogICAgICAgICMgZml4dXAgaW5kaWNlcyBpbiB0b2tlbiBkaWN0aW9uYXJ5DQogICAgICAgIGZvciBuYW1lLG9jY3VycmVuY2VzIGluIHNlbGYuX190b2tkaWN0Lml0ZW1zKCk6DQogICAgICAgICAgICBmb3IgaywgKHZhbHVlLCBwb3NpdGlvbikgaW4gZW51bWVyYXRlKG9jY3VycmVuY2VzKToNCiAgICAgICAgICAgICAgICBvY2N1cnJlbmNlc1trXSA9IF9QYXJzZVJlc3VsdHNXaXRoT2Zmc2V0KHZhbHVlLCBwb3NpdGlvbiArIChwb3NpdGlvbiA+IGluZGV4KSkNCg0KICAgIGRlZiBhcHBlbmQoIHNlbGYsIGl0ZW0gKToNCiAgICAgICAgIiIiDQogICAgICAgIEFkZCBzaW5nbGUgZWxlbWVudCB0byBlbmQgb2YgUGFyc2VSZXN1bHRzIGxpc3Qgb2YgZWxlbWVudHMuDQoNCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBwcmludChPbmVPck1vcmUoV29yZChudW1zKSkucGFyc2VTdHJpbmcoIjAgMTIzIDMyMSIpKSAjIC0+IFsnMCcsICcxMjMnLCAnMzIxJ10NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgIyB1c2UgYSBwYXJzZSBhY3Rpb24gdG8gY29tcHV0ZSB0aGUgc3VtIG9mIHRoZSBwYXJzZWQgaW50ZWdlcnMsIGFuZCBhZGQgaXQgdG8gdGhlIGVuZA0KICAgICAgICAgICAgZGVmIGFwcGVuZF9zdW0odG9rZW5zKToNCiAgICAgICAgICAgICAgICB0b2tlbnMuYXBwZW5kKHN1bShtYXAoaW50LCB0b2tlbnMpKSkNCiAgICAgICAgICAgIHByaW50KE9uZU9yTW9yZShXb3JkKG51bXMpKS5hZGRQYXJzZUFjdGlvbihhcHBlbmRfc3VtKS5wYXJzZVN0cmluZygiMCAxMjMgMzIxIikpICMgLT4gWycwJywgJzEyMycsICczMjEnLCA0NDRdDQogICAgICAgICIiIg0KICAgICAgICBzZWxmLl9fdG9rbGlzdC5hcHBlbmQoaXRlbSkNCg0KICAgIGRlZiBleHRlbmQoIHNlbGYsIGl0ZW1zZXEgKToNCiAgICAgICAgIiIiDQogICAgICAgIEFkZCBzZXF1ZW5jZSBvZiBlbGVtZW50cyB0byBlbmQgb2YgUGFyc2VSZXN1bHRzIGxpc3Qgb2YgZWxlbWVudHMuDQoNCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBwYXR0ID0gT25lT3JNb3JlKFdvcmQoYWxwaGFzKSkNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgIyB1c2UgYSBwYXJzZSBhY3Rpb24gdG8gYXBwZW5kIHRoZSByZXZlcnNlIG9mIHRoZSBtYXRjaGVkIHN0cmluZ3MsIHRvIG1ha2UgYSBwYWxpbmRyb21lDQogICAgICAgICAgICBkZWYgbWFrZV9wYWxpbmRyb21lKHRva2Vucyk6DQogICAgICAgICAgICAgICAgdG9rZW5zLmV4dGVuZChyZXZlcnNlZChbdFs6Oi0xXSBmb3IgdCBpbiB0b2tlbnNdKSkNCiAgICAgICAgICAgICAgICByZXR1cm4gJycuam9pbih0b2tlbnMpDQogICAgICAgICAgICBwcmludChwYXR0LmFkZFBhcnNlQWN0aW9uKG1ha2VfcGFsaW5kcm9tZSkucGFyc2VTdHJpbmcoImxza2RqIHNkbGtqZiBsa3NkIikpICMgLT4gJ2xza2Rqc2Rsa2pmbGtzZGRza2xmamtsZHNqZGtzbCcNCiAgICAgICAgIiIiDQogICAgICAgIGlmIGlzaW5zdGFuY2UoaXRlbXNlcSwgUGFyc2VSZXN1bHRzKToNCiAgICAgICAgICAgIHNlbGYgKz0gaXRlbXNlcQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgc2VsZi5fX3Rva2xpc3QuZXh0ZW5kKGl0ZW1zZXEpDQoNCiAgICBkZWYgY2xlYXIoIHNlbGYgKToNCiAgICAgICAgIiIiDQogICAgICAgIENsZWFyIGFsbCBlbGVtZW50cyBhbmQgcmVzdWx0cyBuYW1lcy4NCiAgICAgICAgIiIiDQogICAgICAgIGRlbCBzZWxmLl9fdG9rbGlzdFs6XQ0KICAgICAgICBzZWxmLl9fdG9rZGljdC5jbGVhcigpDQoNCiAgICBkZWYgX19nZXRhdHRyX18oIHNlbGYsIG5hbWUgKToNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgcmV0dXJuIHNlbGZbbmFtZV0NCiAgICAgICAgZXhjZXB0IEtleUVycm9yOg0KICAgICAgICAgICAgcmV0dXJuICIiDQogICAgICAgICAgICANCiAgICAgICAgaWYgbmFtZSBpbiBzZWxmLl9fdG9rZGljdDoNCiAgICAgICAgICAgIGlmIG5hbWUgbm90IGluIHNlbGYuX19hY2N1bU5hbWVzOg0KICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9fdG9rZGljdFtuYW1lXVstMV1bMF0NCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgcmV0dXJuIFBhcnNlUmVzdWx0cyhbIHZbMF0gZm9yIHYgaW4gc2VsZi5fX3Rva2RpY3RbbmFtZV0gXSkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJldHVybiAiIg0KDQogICAgZGVmIF9fYWRkX18oIHNlbGYsIG90aGVyICk6DQogICAgICAgIHJldCA9IHNlbGYuY29weSgpDQogICAgICAgIHJldCArPSBvdGhlcg0KICAgICAgICByZXR1cm4gcmV0DQoNCiAgICBkZWYgX19pYWRkX18oIHNlbGYsIG90aGVyICk6DQogICAgICAgIGlmIG90aGVyLl9fdG9rZGljdDoNCiAgICAgICAgICAgIG9mZnNldCA9IGxlbihzZWxmLl9fdG9rbGlzdCkNCiAgICAgICAgICAgIGFkZG9mZnNldCA9IGxhbWJkYSBhOiBvZmZzZXQgaWYgYTwwIGVsc2UgYStvZmZzZXQNCiAgICAgICAgICAgIG90aGVyaXRlbXMgPSBvdGhlci5fX3Rva2RpY3QuaXRlbXMoKQ0KICAgICAgICAgICAgb3RoZXJkaWN0aXRlbXMgPSBbKGssIF9QYXJzZVJlc3VsdHNXaXRoT2Zmc2V0KHZbMF0sYWRkb2Zmc2V0KHZbMV0pKSApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoayx2bGlzdCkgaW4gb3RoZXJpdGVtcyBmb3IgdiBpbiB2bGlzdF0NCiAgICAgICAgICAgIGZvciBrLHYgaW4gb3RoZXJkaWN0aXRlbXM6DQogICAgICAgICAgICAgICAgc2VsZltrXSA9IHYNCiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHZbMF0sUGFyc2VSZXN1bHRzKToNCiAgICAgICAgICAgICAgICAgICAgdlswXS5fX3BhcmVudCA9IHdrcmVmKHNlbGYpDQogICAgICAgICAgICANCiAgICAgICAgc2VsZi5fX3Rva2xpc3QgKz0gb3RoZXIuX190b2tsaXN0DQogICAgICAgIHNlbGYuX19hY2N1bU5hbWVzLnVwZGF0ZSggb3RoZXIuX19hY2N1bU5hbWVzICkNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBfX3JhZGRfXyhzZWxmLCBvdGhlcik6DQogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsaW50KSBhbmQgb3RoZXIgPT0gMDoNCiAgICAgICAgICAgICMgdXNlZnVsIGZvciBtZXJnaW5nIG1hbnkgUGFyc2VSZXN1bHRzIHVzaW5nIHN1bSgpIGJ1aWx0aW4NCiAgICAgICAgICAgIHJldHVybiBzZWxmLmNvcHkoKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgIyB0aGlzIG1heSByYWlzZSBhIFR5cGVFcnJvciAtIHNvIGJlIGl0DQogICAgICAgICAgICByZXR1cm4gb3RoZXIgKyBzZWxmDQogICAgICAgIA0KICAgIGRlZiBfX3JlcHJfXyggc2VsZiApOg0KICAgICAgICByZXR1cm4gIiglcywgJXMpIiAlICggcmVwciggc2VsZi5fX3Rva2xpc3QgKSwgcmVwciggc2VsZi5fX3Rva2RpY3QgKSApDQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICByZXR1cm4gJ1snICsgJywgJy5qb2luKF91c3RyKGkpIGlmIGlzaW5zdGFuY2UoaSwgUGFyc2VSZXN1bHRzKSBlbHNlIHJlcHIoaSkgZm9yIGkgaW4gc2VsZi5fX3Rva2xpc3QpICsgJ10nDQoNCiAgICBkZWYgX2FzU3RyaW5nTGlzdCggc2VsZiwgc2VwPScnICk6DQogICAgICAgIG91dCA9IFtdDQogICAgICAgIGZvciBpdGVtIGluIHNlbGYuX190b2tsaXN0Og0KICAgICAgICAgICAgaWYgb3V0IGFuZCBzZXA6DQogICAgICAgICAgICAgICAgb3V0LmFwcGVuZChzZXApDQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKCBpdGVtLCBQYXJzZVJlc3VsdHMgKToNCiAgICAgICAgICAgICAgICBvdXQgKz0gaXRlbS5fYXNTdHJpbmdMaXN0KCkNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgb3V0LmFwcGVuZCggX3VzdHIoaXRlbSkgKQ0KICAgICAgICByZXR1cm4gb3V0DQoNCiAgICBkZWYgYXNMaXN0KCBzZWxmICk6DQogICAgICAgICIiIg0KICAgICAgICBSZXR1cm5zIHRoZSBwYXJzZSByZXN1bHRzIGFzIGEgbmVzdGVkIGxpc3Qgb2YgbWF0Y2hpbmcgdG9rZW5zLCBhbGwgY29udmVydGVkIHRvIHN0cmluZ3MuDQoNCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBwYXR0ID0gT25lT3JNb3JlKFdvcmQoYWxwaGFzKSkNCiAgICAgICAgICAgIHJlc3VsdCA9IHBhdHQucGFyc2VTdHJpbmcoInNsZGtqIGxzZGtqIHNsZGtqIikNCiAgICAgICAgICAgICMgZXZlbiB0aG91Z2ggdGhlIHJlc3VsdCBwcmludHMgaW4gc3RyaW5nLWxpa2UgZm9ybSwgaXQgaXMgYWN0dWFsbHkgYSBweXBhcnNpbmcgUGFyc2VSZXN1bHRzDQogICAgICAgICAgICBwcmludCh0eXBlKHJlc3VsdCksIHJlc3VsdCkgIyAtPiA8Y2xhc3MgJ3B5cGFyc2luZy5QYXJzZVJlc3VsdHMnPiBbJ3NsZGtqJywgJ2xzZGtqJywgJ3NsZGtqJ10NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgIyBVc2UgYXNMaXN0KCkgdG8gY3JlYXRlIGFuIGFjdHVhbCBsaXN0DQogICAgICAgICAgICByZXN1bHRfbGlzdCA9IHJlc3VsdC5hc0xpc3QoKQ0KICAgICAgICAgICAgcHJpbnQodHlwZShyZXN1bHRfbGlzdCksIHJlc3VsdF9saXN0KSAjIC0+IDxjbGFzcyAnbGlzdCc+IFsnc2xka2onLCAnbHNka2onLCAnc2xka2onXQ0KICAgICAgICAiIiINCiAgICAgICAgcmV0dXJuIFtyZXMuYXNMaXN0KCkgaWYgaXNpbnN0YW5jZShyZXMsUGFyc2VSZXN1bHRzKSBlbHNlIHJlcyBmb3IgcmVzIGluIHNlbGYuX190b2tsaXN0XQ0KDQogICAgZGVmIGFzRGljdCggc2VsZiApOg0KICAgICAgICAiIiINCiAgICAgICAgUmV0dXJucyB0aGUgbmFtZWQgcGFyc2UgcmVzdWx0cyBhcyBhIG5lc3RlZCBkaWN0aW9uYXJ5Lg0KDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykNCiAgICAgICAgICAgIGRhdGVfc3RyID0gaW50ZWdlcigieWVhciIpICsgJy8nICsgaW50ZWdlcigibW9udGgiKSArICcvJyArIGludGVnZXIoImRheSIpDQogICAgICAgICAgICANCiAgICAgICAgICAgIHJlc3VsdCA9IGRhdGVfc3RyLnBhcnNlU3RyaW5nKCcxMi8zMS8xOTk5JykNCiAgICAgICAgICAgIHByaW50KHR5cGUocmVzdWx0KSwgcmVwcihyZXN1bHQpKSAjIC0+IDxjbGFzcyAncHlwYXJzaW5nLlBhcnNlUmVzdWx0cyc+IChbJzEyJywgJy8nLCAnMzEnLCAnLycsICcxOTk5J10sIHsnZGF5JzogWygnMTk5OScsIDQpXSwgJ3llYXInOiBbKCcxMicsIDApXSwgJ21vbnRoJzogWygnMzEnLCAyKV19KQ0KICAgICAgICAgICAgDQogICAgICAgICAgICByZXN1bHRfZGljdCA9IHJlc3VsdC5hc0RpY3QoKQ0KICAgICAgICAgICAgcHJpbnQodHlwZShyZXN1bHRfZGljdCksIHJlcHIocmVzdWx0X2RpY3QpKSAjIC0+IDxjbGFzcyAnZGljdCc+IHsnZGF5JzogJzE5OTknLCAneWVhcic6ICcxMicsICdtb250aCc6ICczMSd9DQoNCiAgICAgICAgICAgICMgZXZlbiB0aG91Z2ggYSBQYXJzZVJlc3VsdHMgc3VwcG9ydHMgZGljdC1saWtlIGFjY2Vzcywgc29tZXRpbWUgeW91IGp1c3QgbmVlZCB0byBoYXZlIGEgZGljdA0KICAgICAgICAgICAgaW1wb3J0IGpzb24NCiAgICAgICAgICAgIHByaW50KGpzb24uZHVtcHMocmVzdWx0KSkgIyAtPiBFeGNlcHRpb246IFR5cGVFcnJvcjogLi4uIGlzIG5vdCBKU09OIHNlcmlhbGl6YWJsZQ0KICAgICAgICAgICAgcHJpbnQoanNvbi5kdW1wcyhyZXN1bHQuYXNEaWN0KCkpKSAjIC0+IHsibW9udGgiOiAiMzEiLCAiZGF5IjogIjE5OTkiLCAieWVhciI6ICIxMiJ9DQogICAgICAgICIiIg0KICAgICAgICBpZiBQWV8zOg0KICAgICAgICAgICAgaXRlbV9mbiA9IHNlbGYuaXRlbXMNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIGl0ZW1fZm4gPSBzZWxmLml0ZXJpdGVtcw0KICAgICAgICAgICAgDQogICAgICAgIGRlZiB0b0l0ZW0ob2JqKToNCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uob2JqLCBQYXJzZVJlc3VsdHMpOg0KICAgICAgICAgICAgICAgIGlmIG9iai5oYXNrZXlzKCk6DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBvYmouYXNEaWN0KCkNCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gW3RvSXRlbSh2KSBmb3IgdiBpbiBvYmpdDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHJldHVybiBvYmoNCiAgICAgICAgICAgICAgICANCiAgICAgICAgcmV0dXJuIGRpY3QoKGssdG9JdGVtKHYpKSBmb3Igayx2IGluIGl0ZW1fZm4oKSkNCg0KICAgIGRlZiBjb3B5KCBzZWxmICk6DQogICAgICAgICIiIg0KICAgICAgICBSZXR1cm5zIGEgbmV3IGNvcHkgb2YgYSBDe1BhcnNlUmVzdWx0c30gb2JqZWN0Lg0KICAgICAgICAiIiINCiAgICAgICAgcmV0ID0gUGFyc2VSZXN1bHRzKCBzZWxmLl9fdG9rbGlzdCApDQogICAgICAgIHJldC5fX3Rva2RpY3QgPSBzZWxmLl9fdG9rZGljdC5jb3B5KCkNCiAgICAgICAgcmV0Ll9fcGFyZW50ID0gc2VsZi5fX3BhcmVudA0KICAgICAgICByZXQuX19hY2N1bU5hbWVzLnVwZGF0ZSggc2VsZi5fX2FjY3VtTmFtZXMgKQ0KICAgICAgICByZXQuX19uYW1lID0gc2VsZi5fX25hbWUNCiAgICAgICAgcmV0dXJuIHJldA0KDQogICAgZGVmIGFzWE1MKCBzZWxmLCBkb2N0YWc9Tm9uZSwgbmFtZWRJdGVtc09ubHk9RmFsc2UsIGluZGVudD0iIiwgZm9ybWF0dGVkPVRydWUgKToNCiAgICAgICAgIiIiDQogICAgICAgIChEZXByZWNhdGVkKSBSZXR1cm5zIHRoZSBwYXJzZSByZXN1bHRzIGFzIFhNTC4gVGFncyBhcmUgY3JlYXRlZCBmb3IgdG9rZW5zIGFuZCBsaXN0cyB0aGF0IGhhdmUgZGVmaW5lZCByZXN1bHRzIG5hbWVzLg0KICAgICAgICAiIiINCiAgICAgICAgbmwgPSAiXG4iDQogICAgICAgIG91dCA9IFtdDQogICAgICAgIG5hbWVkSXRlbXMgPSBkaWN0KCh2WzFdLGspIGZvciAoayx2bGlzdCkgaW4gc2VsZi5fX3Rva2RpY3QuaXRlbXMoKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHYgaW4gdmxpc3QpDQogICAgICAgIG5leHRMZXZlbEluZGVudCA9IGluZGVudCArICIgICINCg0KICAgICAgICAjIGNvbGxhcHNlIG91dCBpbmRlbnRzIGlmIGZvcm1hdHRpbmcgaXMgbm90IGRlc2lyZWQNCiAgICAgICAgaWYgbm90IGZvcm1hdHRlZDoNCiAgICAgICAgICAgIGluZGVudCA9ICIiDQogICAgICAgICAgICBuZXh0TGV2ZWxJbmRlbnQgPSAiIg0KICAgICAgICAgICAgbmwgPSAiIg0KDQogICAgICAgIHNlbGZUYWcgPSBOb25lDQogICAgICAgIGlmIGRvY3RhZyBpcyBub3QgTm9uZToNCiAgICAgICAgICAgIHNlbGZUYWcgPSBkb2N0YWcNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIGlmIHNlbGYuX19uYW1lOg0KICAgICAgICAgICAgICAgIHNlbGZUYWcgPSBzZWxmLl9fbmFtZQ0KDQogICAgICAgIGlmIG5vdCBzZWxmVGFnOg0KICAgICAgICAgICAgaWYgbmFtZWRJdGVtc09ubHk6DQogICAgICAgICAgICAgICAgcmV0dXJuICIiDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHNlbGZUYWcgPSAiSVRFTSINCg0KICAgICAgICBvdXQgKz0gWyBubCwgaW5kZW50LCAiPCIsIHNlbGZUYWcsICI+IiBdDQoNCiAgICAgICAgZm9yIGkscmVzIGluIGVudW1lcmF0ZShzZWxmLl9fdG9rbGlzdCk6DQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHJlcyxQYXJzZVJlc3VsdHMpOg0KICAgICAgICAgICAgICAgIGlmIGkgaW4gbmFtZWRJdGVtczoNCiAgICAgICAgICAgICAgICAgICAgb3V0ICs9IFsgcmVzLmFzWE1MKG5hbWVkSXRlbXNbaV0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZWRJdGVtc09ubHkgYW5kIGRvY3RhZyBpcyBOb25lLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRMZXZlbEluZGVudCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZWQpXQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIG91dCArPSBbIHJlcy5hc1hNTChOb25lLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVkSXRlbXNPbmx5IGFuZCBkb2N0YWcgaXMgTm9uZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0TGV2ZWxJbmRlbnQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVkKV0NCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgIyBpbmRpdmlkdWFsIHRva2VuLCBzZWUgaWYgdGhlcmUgaXMgYSBuYW1lIGZvciBpdA0KICAgICAgICAgICAgICAgIHJlc1RhZyA9IE5vbmUNCiAgICAgICAgICAgICAgICBpZiBpIGluIG5hbWVkSXRlbXM6DQogICAgICAgICAgICAgICAgICAgIHJlc1RhZyA9IG5hbWVkSXRlbXNbaV0NCiAgICAgICAgICAgICAgICBpZiBub3QgcmVzVGFnOg0KICAgICAgICAgICAgICAgICAgICBpZiBuYW1lZEl0ZW1zT25seToNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlDQogICAgICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgICAgICByZXNUYWcgPSAiSVRFTSINCiAgICAgICAgICAgICAgICB4bWxCb2R5VGV4dCA9IF94bWxfZXNjYXBlKF91c3RyKHJlcykpDQogICAgICAgICAgICAgICAgb3V0ICs9IFsgbmwsIG5leHRMZXZlbEluZGVudCwgIjwiLCByZXNUYWcsICI+IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbEJvZHlUZXh0LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjwvIiwgcmVzVGFnLCAiPiIgXQ0KDQogICAgICAgIG91dCArPSBbIG5sLCBpbmRlbnQsICI8LyIsIHNlbGZUYWcsICI+IiBdDQogICAgICAgIHJldHVybiAiIi5qb2luKG91dCkNCg0KICAgIGRlZiBfX2xvb2t1cChzZWxmLHN1Yik6DQogICAgICAgIGZvciBrLHZsaXN0IGluIHNlbGYuX190b2tkaWN0Lml0ZW1zKCk6DQogICAgICAgICAgICBmb3Igdixsb2MgaW4gdmxpc3Q6DQogICAgICAgICAgICAgICAgaWYgc3ViIGlzIHY6DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBrDQogICAgICAgIHJldHVybiBOb25lDQoNCiAgICBkZWYgZ2V0TmFtZShzZWxmKToNCiAgICAgICAgciIiIg0KICAgICAgICBSZXR1cm5zIHRoZSByZXN1bHRzIG5hbWUgZm9yIHRoaXMgdG9rZW4gZXhwcmVzc2lvbi4gVXNlZnVsIHdoZW4gc2V2ZXJhbCANCiAgICAgICAgZGlmZmVyZW50IGV4cHJlc3Npb25zIG1pZ2h0IG1hdGNoIGF0IGEgcGFydGljdWxhciBsb2NhdGlvbi4NCg0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpDQogICAgICAgICAgICBzc25fZXhwciA9IFJlZ2V4KHIiXGRcZFxkLVxkXGQtXGRcZFxkXGQiKQ0KICAgICAgICAgICAgaG91c2VfbnVtYmVyX2V4cHIgPSBTdXBwcmVzcygnIycpICsgV29yZChudW1zLCBhbHBoYW51bXMpDQogICAgICAgICAgICB1c2VyX2RhdGEgPSAoR3JvdXAoaG91c2VfbnVtYmVyX2V4cHIpKCJob3VzZV9udW1iZXIiKSANCiAgICAgICAgICAgICAgICAgICAgICAgIHwgR3JvdXAoc3NuX2V4cHIpKCJzc24iKQ0KICAgICAgICAgICAgICAgICAgICAgICAgfCBHcm91cChpbnRlZ2VyKSgiYWdlIikpDQogICAgICAgICAgICB1c2VyX2luZm8gPSBPbmVPck1vcmUodXNlcl9kYXRhKQ0KICAgICAgICAgICAgDQogICAgICAgICAgICByZXN1bHQgPSB1c2VyX2luZm8ucGFyc2VTdHJpbmcoIjIyIDExMS0yMi0zMzMzICMyMjFCIikNCiAgICAgICAgICAgIGZvciBpdGVtIGluIHJlc3VsdDoNCiAgICAgICAgICAgICAgICBwcmludChpdGVtLmdldE5hbWUoKSwgJzonLCBpdGVtWzBdKQ0KICAgICAgICBwcmludHM6Og0KICAgICAgICAgICAgYWdlIDogMjINCiAgICAgICAgICAgIHNzbiA6IDExMS0yMi0zMzMzDQogICAgICAgICAgICBob3VzZV9udW1iZXIgOiAyMjFCDQogICAgICAgICIiIg0KICAgICAgICBpZiBzZWxmLl9fbmFtZToNCiAgICAgICAgICAgIHJldHVybiBzZWxmLl9fbmFtZQ0KICAgICAgICBlbGlmIHNlbGYuX19wYXJlbnQ6DQogICAgICAgICAgICBwYXIgPSBzZWxmLl9fcGFyZW50KCkNCiAgICAgICAgICAgIGlmIHBhcjoNCiAgICAgICAgICAgICAgICByZXR1cm4gcGFyLl9fbG9va3VwKHNlbGYpDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHJldHVybiBOb25lDQogICAgICAgIGVsaWYgKGxlbihzZWxmKSA9PSAxIGFuZA0KICAgICAgICAgICAgICAgbGVuKHNlbGYuX190b2tkaWN0KSA9PSAxIGFuZA0KICAgICAgICAgICAgICAgbmV4dChpdGVyKHNlbGYuX190b2tkaWN0LnZhbHVlcygpKSlbMF1bMV0gaW4gKDAsLTEpKToNCiAgICAgICAgICAgIHJldHVybiBuZXh0KGl0ZXIoc2VsZi5fX3Rva2RpY3Qua2V5cygpKSkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJldHVybiBOb25lDQoNCiAgICBkZWYgZHVtcChzZWxmLCBpbmRlbnQ9JycsIGRlcHRoPTAsIGZ1bGw9VHJ1ZSk6DQogICAgICAgICIiIg0KICAgICAgICBEaWFnbm9zdGljIG1ldGhvZCBmb3IgbGlzdGluZyBvdXQgdGhlIGNvbnRlbnRzIG9mIGEgQ3tQYXJzZVJlc3VsdHN9Lg0KICAgICAgICBBY2NlcHRzIGFuIG9wdGlvbmFsIEN7aW5kZW50fSBhcmd1bWVudCBzbyB0aGF0IHRoaXMgc3RyaW5nIGNhbiBiZSBlbWJlZGRlZA0KICAgICAgICBpbiBhIG5lc3RlZCBkaXNwbGF5IG9mIG90aGVyIGRhdGEuDQoNCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKQ0KICAgICAgICAgICAgZGF0ZV9zdHIgPSBpbnRlZ2VyKCJ5ZWFyIikgKyAnLycgKyBpbnRlZ2VyKCJtb250aCIpICsgJy8nICsgaW50ZWdlcigiZGF5IikNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgcmVzdWx0ID0gZGF0ZV9zdHIucGFyc2VTdHJpbmcoJzEyLzMxLzE5OTknKQ0KICAgICAgICAgICAgcHJpbnQocmVzdWx0LmR1bXAoKSkNCiAgICAgICAgcHJpbnRzOjoNCiAgICAgICAgICAgIFsnMTInLCAnLycsICczMScsICcvJywgJzE5OTknXQ0KICAgICAgICAgICAgLSBkYXk6IDE5OTkNCiAgICAgICAgICAgIC0gbW9udGg6IDMxDQogICAgICAgICAgICAtIHllYXI6IDEyDQogICAgICAgICIiIg0KICAgICAgICBvdXQgPSBbXQ0KICAgICAgICBOTCA9ICdcbicNCiAgICAgICAgb3V0LmFwcGVuZCggaW5kZW50K191c3RyKHNlbGYuYXNMaXN0KCkpICkNCiAgICAgICAgaWYgZnVsbDoNCiAgICAgICAgICAgIGlmIHNlbGYuaGFza2V5cygpOg0KICAgICAgICAgICAgICAgIGl0ZW1zID0gc29ydGVkKChzdHIoayksIHYpIGZvciBrLHYgaW4gc2VsZi5pdGVtcygpKQ0KICAgICAgICAgICAgICAgIGZvciBrLHYgaW4gaXRlbXM6DQogICAgICAgICAgICAgICAgICAgIGlmIG91dDoNCiAgICAgICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoTkwpDQogICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoICIlcyVzLSAlczogIiAlIChpbmRlbnQsKCcgICcqZGVwdGgpLCBrKSApDQogICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodixQYXJzZVJlc3VsdHMpOg0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgdjoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCB2LmR1bXAoaW5kZW50LGRlcHRoKzEpICkNCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZChfdXN0cih2KSkNCiAgICAgICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQocmVwcih2KSkNCiAgICAgICAgICAgIGVsaWYgYW55KGlzaW5zdGFuY2UodnYsUGFyc2VSZXN1bHRzKSBmb3IgdnYgaW4gc2VsZik6DQogICAgICAgICAgICAgICAgdiA9IHNlbGYNCiAgICAgICAgICAgICAgICBmb3IgaSx2diBpbiBlbnVtZXJhdGUodik6DQogICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodnYsUGFyc2VSZXN1bHRzKToNCiAgICAgICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoIlxuJXMlc1slZF06XG4lcyVzJXMiICUgKGluZGVudCwoJyAgJyooZGVwdGgpKSxpLGluZGVudCwoJyAgJyooZGVwdGgrMSkpLHZ2LmR1bXAoaW5kZW50LGRlcHRoKzEpICkpDQogICAgICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCJcbiVzJXNbJWRdOlxuJXMlcyVzIiAlIChpbmRlbnQsKCcgICcqKGRlcHRoKSksaSxpbmRlbnQsKCcgICcqKGRlcHRoKzEpKSxfdXN0cih2dikpKQ0KICAgICAgICAgICAgDQogICAgICAgIHJldHVybiAiIi5qb2luKG91dCkNCg0KICAgIGRlZiBwcHJpbnQoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToNCiAgICAgICAgIiIiDQogICAgICAgIFByZXR0eS1wcmludGVyIGZvciBwYXJzZWQgcmVzdWx0cyBhcyBhIGxpc3QsIHVzaW5nIHRoZSBDe3BwcmludH0gbW9kdWxlLg0KICAgICAgICBBY2NlcHRzIGFkZGl0aW9uYWwgcG9zaXRpb25hbCBvciBrZXl3b3JkIGFyZ3MgYXMgZGVmaW5lZCBmb3IgdGhlIA0KICAgICAgICBDe3BwcmludC5wcHJpbnR9IG1ldGhvZC4gKFV7aHR0cDovL2RvY3MucHl0aG9uLm9yZy8zL2xpYnJhcnkvcHByaW50Lmh0bWwjcHByaW50LnBwcmludH0pDQoNCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBpZGVudCA9IFdvcmQoYWxwaGFzLCBhbHBoYW51bXMpDQogICAgICAgICAgICBudW0gPSBXb3JkKG51bXMpDQogICAgICAgICAgICBmdW5jID0gRm9yd2FyZCgpDQogICAgICAgICAgICB0ZXJtID0gaWRlbnQgfCBudW0gfCBHcm91cCgnKCcgKyBmdW5jICsgJyknKQ0KICAgICAgICAgICAgZnVuYyA8PD0gaWRlbnQgKyBHcm91cChPcHRpb25hbChkZWxpbWl0ZWRMaXN0KHRlcm0pKSkNCiAgICAgICAgICAgIHJlc3VsdCA9IGZ1bmMucGFyc2VTdHJpbmcoImZuYSBhLGIsKGZuYiBjLGQsMjAwKSwxMDAiKQ0KICAgICAgICAgICAgcmVzdWx0LnBwcmludCh3aWR0aD00MCkNCiAgICAgICAgcHJpbnRzOjoNCiAgICAgICAgICAgIFsnZm5hJywNCiAgICAgICAgICAgICBbJ2EnLA0KICAgICAgICAgICAgICAnYicsDQogICAgICAgICAgICAgIFsnKCcsICdmbmInLCBbJ2MnLCAnZCcsICcyMDAnXSwgJyknXSwNCiAgICAgICAgICAgICAgJzEwMCddXQ0KICAgICAgICAiIiINCiAgICAgICAgcHByaW50LnBwcmludChzZWxmLmFzTGlzdCgpLCAqYXJncywgKiprd2FyZ3MpDQoNCiAgICAjIGFkZCBzdXBwb3J0IGZvciBwaWNrbGUgcHJvdG9jb2wNCiAgICBkZWYgX19nZXRzdGF0ZV9fKHNlbGYpOg0KICAgICAgICByZXR1cm4gKCBzZWxmLl9fdG9rbGlzdCwNCiAgICAgICAgICAgICAgICAgKCBzZWxmLl9fdG9rZGljdC5jb3B5KCksDQogICAgICAgICAgICAgICAgICAgc2VsZi5fX3BhcmVudCBpcyBub3QgTm9uZSBhbmQgc2VsZi5fX3BhcmVudCgpIG9yIE5vbmUsDQogICAgICAgICAgICAgICAgICAgc2VsZi5fX2FjY3VtTmFtZXMsDQogICAgICAgICAgICAgICAgICAgc2VsZi5fX25hbWUgKSApDQoNCiAgICBkZWYgX19zZXRzdGF0ZV9fKHNlbGYsc3RhdGUpOg0KICAgICAgICBzZWxmLl9fdG9rbGlzdCA9IHN0YXRlWzBdDQogICAgICAgIChzZWxmLl9fdG9rZGljdCwNCiAgICAgICAgIHBhciwNCiAgICAgICAgIGluQWNjdW1OYW1lcywNCiAgICAgICAgIHNlbGYuX19uYW1lKSA9IHN0YXRlWzFdDQogICAgICAgIHNlbGYuX19hY2N1bU5hbWVzID0ge30NCiAgICAgICAgc2VsZi5fX2FjY3VtTmFtZXMudXBkYXRlKGluQWNjdW1OYW1lcykNCiAgICAgICAgaWYgcGFyIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgc2VsZi5fX3BhcmVudCA9IHdrcmVmKHBhcikNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHNlbGYuX19wYXJlbnQgPSBOb25lDQoNCiAgICBkZWYgX19nZXRuZXdhcmdzX18oc2VsZik6DQogICAgICAgIHJldHVybiBzZWxmLl9fdG9rbGlzdCwgc2VsZi5fX25hbWUsIHNlbGYuX19hc0xpc3QsIHNlbGYuX19tb2RhbA0KDQogICAgZGVmIF9fZGlyX18oc2VsZik6DQogICAgICAgIHJldHVybiAoZGlyKHR5cGUoc2VsZikpICsgbGlzdChzZWxmLmtleXMoKSkpDQoNCk11dGFibGVNYXBwaW5nLnJlZ2lzdGVyKFBhcnNlUmVzdWx0cykNCg0KZGVmIGNvbCAobG9jLHN0cmcpOg0KICAgICIiIlJldHVybnMgY3VycmVudCBjb2x1bW4gd2l0aGluIGEgc3RyaW5nLCBjb3VudGluZyBuZXdsaW5lcyBhcyBsaW5lIHNlcGFyYXRvcnMuDQogICBUaGUgZmlyc3QgY29sdW1uIGlzIG51bWJlciAxLg0KDQogICBOb3RlOiB0aGUgZGVmYXVsdCBwYXJzaW5nIGJlaGF2aW9yIGlzIHRvIGV4cGFuZCB0YWJzIGluIHRoZSBpbnB1dCBzdHJpbmcNCiAgIGJlZm9yZSBzdGFydGluZyB0aGUgcGFyc2luZyBwcm9jZXNzLiAgU2VlIEx7SXtQYXJzZXJFbGVtZW50LnBhcnNlU3RyaW5nfTxQYXJzZXJFbGVtZW50LnBhcnNlU3RyaW5nPn0gZm9yIG1vcmUgaW5mb3JtYXRpb24NCiAgIG9uIHBhcnNpbmcgc3RyaW5ncyBjb250YWluaW5nIEN7PFRBQj59cywgYW5kIHN1Z2dlc3RlZCBtZXRob2RzIHRvIG1haW50YWluIGENCiAgIGNvbnNpc3RlbnQgdmlldyBvZiB0aGUgcGFyc2VkIHN0cmluZywgdGhlIHBhcnNlIGxvY2F0aW9uLCBhbmQgbGluZSBhbmQgY29sdW1uDQogICBwb3NpdGlvbnMgd2l0aGluIHRoZSBwYXJzZWQgc3RyaW5nLg0KICAgIiIiDQogICAgcyA9IHN0cmcNCiAgICByZXR1cm4gMSBpZiAwPGxvYzxsZW4ocykgYW5kIHNbbG9jLTFdID09ICdcbicgZWxzZSBsb2MgLSBzLnJmaW5kKCJcbiIsIDAsIGxvYykNCg0KZGVmIGxpbmVubyhsb2Msc3RyZyk6DQogICAgIiIiUmV0dXJucyBjdXJyZW50IGxpbmUgbnVtYmVyIHdpdGhpbiBhIHN0cmluZywgY291bnRpbmcgbmV3bGluZXMgYXMgbGluZSBzZXBhcmF0b3JzLg0KICAgVGhlIGZpcnN0IGxpbmUgaXMgbnVtYmVyIDEuDQoNCiAgIE5vdGU6IHRoZSBkZWZhdWx0IHBhcnNpbmcgYmVoYXZpb3IgaXMgdG8gZXhwYW5kIHRhYnMgaW4gdGhlIGlucHV0IHN0cmluZw0KICAgYmVmb3JlIHN0YXJ0aW5nIHRoZSBwYXJzaW5nIHByb2Nlc3MuICBTZWUgTHtJe1BhcnNlckVsZW1lbnQucGFyc2VTdHJpbmd9PFBhcnNlckVsZW1lbnQucGFyc2VTdHJpbmc+fSBmb3IgbW9yZSBpbmZvcm1hdGlvbg0KICAgb24gcGFyc2luZyBzdHJpbmdzIGNvbnRhaW5pbmcgQ3s8VEFCPn1zLCBhbmQgc3VnZ2VzdGVkIG1ldGhvZHMgdG8gbWFpbnRhaW4gYQ0KICAgY29uc2lzdGVudCB2aWV3IG9mIHRoZSBwYXJzZWQgc3RyaW5nLCB0aGUgcGFyc2UgbG9jYXRpb24sIGFuZCBsaW5lIGFuZCBjb2x1bW4NCiAgIHBvc2l0aW9ucyB3aXRoaW4gdGhlIHBhcnNlZCBzdHJpbmcuDQogICAiIiINCiAgICByZXR1cm4gc3RyZy5jb3VudCgiXG4iLDAsbG9jKSArIDENCg0KZGVmIGxpbmUoIGxvYywgc3RyZyApOg0KICAgICIiIlJldHVybnMgdGhlIGxpbmUgb2YgdGV4dCBjb250YWluaW5nIGxvYyB3aXRoaW4gYSBzdHJpbmcsIGNvdW50aW5nIG5ld2xpbmVzIGFzIGxpbmUgc2VwYXJhdG9ycy4NCiAgICAgICAiIiINCiAgICBsYXN0Q1IgPSBzdHJnLnJmaW5kKCJcbiIsIDAsIGxvYykNCiAgICBuZXh0Q1IgPSBzdHJnLmZpbmQoIlxuIiwgbG9jKQ0KICAgIGlmIG5leHRDUiA+PSAwOg0KICAgICAgICByZXR1cm4gc3RyZ1tsYXN0Q1IrMTpuZXh0Q1JdDQogICAgZWxzZToNCiAgICAgICAgcmV0dXJuIHN0cmdbbGFzdENSKzE6XQ0KDQpkZWYgX2RlZmF1bHRTdGFydERlYnVnQWN0aW9uKCBpbnN0cmluZywgbG9jLCBleHByICk6DQogICAgcHJpbnQgKCgiTWF0Y2ggIiArIF91c3RyKGV4cHIpICsgIiBhdCBsb2MgIiArIF91c3RyKGxvYykgKyAiKCVkLCVkKSIgJSAoIGxpbmVubyhsb2MsaW5zdHJpbmcpLCBjb2wobG9jLGluc3RyaW5nKSApKSkNCg0KZGVmIF9kZWZhdWx0U3VjY2Vzc0RlYnVnQWN0aW9uKCBpbnN0cmluZywgc3RhcnRsb2MsIGVuZGxvYywgZXhwciwgdG9rcyApOg0KICAgIHByaW50ICgiTWF0Y2hlZCAiICsgX3VzdHIoZXhwcikgKyAiIC0+ICIgKyBzdHIodG9rcy5hc0xpc3QoKSkpDQoNCmRlZiBfZGVmYXVsdEV4Y2VwdGlvbkRlYnVnQWN0aW9uKCBpbnN0cmluZywgbG9jLCBleHByLCBleGMgKToNCiAgICBwcmludCAoIkV4Y2VwdGlvbiByYWlzZWQ6IiArIF91c3RyKGV4YykpDQoNCmRlZiBudWxsRGVidWdBY3Rpb24oKmFyZ3MpOg0KICAgICIiIidEby1ub3RoaW5nJyBkZWJ1ZyBhY3Rpb24sIHRvIHN1cHByZXNzIGRlYnVnZ2luZyBvdXRwdXQgZHVyaW5nIHBhcnNpbmcuIiIiDQogICAgcGFzcw0KDQojIE9ubHkgd29ya3Mgb24gUHl0aG9uIDMueCAtIG5vbmxvY2FsIGlzIHRveGljIHRvIFB5dGhvbiAyIGluc3RhbGxzDQojfiAnZGVjb3JhdG9yIHRvIHRyaW0gZnVuY3Rpb24gY2FsbHMgdG8gbWF0Y2ggdGhlIGFyaXR5IG9mIHRoZSB0YXJnZXQnDQojfiBkZWYgX3RyaW1fYXJpdHkoZnVuYywgbWF4YXJncz0zKToNCiAgICAjfiBpZiBmdW5jIGluIHNpbmdsZUFyZ0J1aWx0aW5zOg0KICAgICAgICAjfiByZXR1cm4gbGFtYmRhIHMsbCx0OiBmdW5jKHQpDQogICAgI34gbGltaXQgPSAwDQogICAgI34gZm91bmRBcml0eSA9IEZhbHNlDQogICAgI34gZGVmIHdyYXBwZXIoKmFyZ3MpOg0KICAgICAgICAjfiBub25sb2NhbCBsaW1pdCxmb3VuZEFyaXR5DQogICAgICAgICN+IHdoaWxlIDE6DQogICAgICAgICAgICAjfiB0cnk6DQogICAgICAgICAgICAgICAgI34gcmV0ID0gZnVuYygqYXJnc1tsaW1pdDpdKQ0KICAgICAgICAgICAgICAgICN+IGZvdW5kQXJpdHkgPSBUcnVlDQogICAgICAgICAgICAgICAgI34gcmV0dXJuIHJldA0KICAgICAgICAgICAgI34gZXhjZXB0IFR5cGVFcnJvcjoNCiAgICAgICAgICAgICAgICAjfiBpZiBsaW1pdCA9PSBtYXhhcmdzIG9yIGZvdW5kQXJpdHk6DQogICAgICAgICAgICAgICAgICAgICN+IHJhaXNlDQogICAgICAgICAgICAgICAgI34gbGltaXQgKz0gMQ0KICAgICAgICAgICAgICAgICN+IGNvbnRpbnVlDQogICAgI34gcmV0dXJuIHdyYXBwZXINCg0KIyB0aGlzIHZlcnNpb24gaXMgUHl0aG9uIDIueC0zLnggY3Jvc3MtY29tcGF0aWJsZQ0KJ2RlY29yYXRvciB0byB0cmltIGZ1bmN0aW9uIGNhbGxzIHRvIG1hdGNoIHRoZSBhcml0eSBvZiB0aGUgdGFyZ2V0Jw0KZGVmIF90cmltX2FyaXR5KGZ1bmMsIG1heGFyZ3M9Mik6DQogICAgaWYgZnVuYyBpbiBzaW5nbGVBcmdCdWlsdGluczoNCiAgICAgICAgcmV0dXJuIGxhbWJkYSBzLGwsdDogZnVuYyh0KQ0KICAgIGxpbWl0ID0gWzBdDQogICAgZm91bmRBcml0eSA9IFtGYWxzZV0NCiAgICANCiAgICAjIHRyYWNlYmFjayByZXR1cm4gZGF0YSBzdHJ1Y3R1cmUgY2hhbmdlZCBpbiBQeTMuNSAtIG5vcm1hbGl6ZSBiYWNrIHRvIHBsYWluIHR1cGxlcw0KICAgIGlmIHN5c3RlbV92ZXJzaW9uWzoyXSA+PSAoMyw1KToNCiAgICAgICAgZGVmIGV4dHJhY3Rfc3RhY2sobGltaXQ9MCk6DQogICAgICAgICAgICAjIHNwZWNpYWwgaGFuZGxpbmcgZm9yIFB5dGhvbiAzLjUuMCAtIGV4dHJhIGRlZXAgY2FsbCBzdGFjayBieSAxDQogICAgICAgICAgICBvZmZzZXQgPSAtMyBpZiBzeXN0ZW1fdmVyc2lvbiA9PSAoMyw1LDApIGVsc2UgLTINCiAgICAgICAgICAgIGZyYW1lX3N1bW1hcnkgPSB0cmFjZWJhY2suZXh0cmFjdF9zdGFjayhsaW1pdD0tb2Zmc2V0K2xpbWl0LTEpW29mZnNldF0NCiAgICAgICAgICAgIHJldHVybiBbZnJhbWVfc3VtbWFyeVs6Ml1dDQogICAgICAgIGRlZiBleHRyYWN0X3RiKHRiLCBsaW1pdD0wKToNCiAgICAgICAgICAgIGZyYW1lcyA9IHRyYWNlYmFjay5leHRyYWN0X3RiKHRiLCBsaW1pdD1saW1pdCkNCiAgICAgICAgICAgIGZyYW1lX3N1bW1hcnkgPSBmcmFtZXNbLTFdDQogICAgICAgICAgICByZXR1cm4gW2ZyYW1lX3N1bW1hcnlbOjJdXQ0KICAgIGVsc2U6DQogICAgICAgIGV4dHJhY3Rfc3RhY2sgPSB0cmFjZWJhY2suZXh0cmFjdF9zdGFjaw0KICAgICAgICBleHRyYWN0X3RiID0gdHJhY2ViYWNrLmV4dHJhY3RfdGINCiAgICANCiAgICAjIHN5bnRoZXNpemUgd2hhdCB3b3VsZCBiZSByZXR1cm5lZCBieSB0cmFjZWJhY2suZXh0cmFjdF9zdGFjayBhdCB0aGUgY2FsbCB0byANCiAgICAjIHVzZXIncyBwYXJzZSBhY3Rpb24gJ2Z1bmMnLCBzbyB0aGF0IHdlIGRvbid0IGluY3VyIGNhbGwgcGVuYWx0eSBhdCBwYXJzZSB0aW1lDQogICAgDQogICAgTElORV9ESUZGID0gNg0KICAgICMgSUYgQU5ZIENPREUgQ0hBTkdFUywgRVZFTiBKVVNUIENPTU1FTlRTIE9SIEJMQU5LIExJTkVTLCBCRVRXRUVOIFRIRSBORVhUIExJTkUgQU5EIA0KICAgICMgVEhFIENBTEwgVE8gRlVOQyBJTlNJREUgV1JBUFBFUiwgTElORV9ESUZGIE1VU1QgQkUgTU9ESUZJRUQhISEhDQogICAgdGhpc19saW5lID0gZXh0cmFjdF9zdGFjayhsaW1pdD0yKVstMV0NCiAgICBwYV9jYWxsX2xpbmVfc3ludGggPSAodGhpc19saW5lWzBdLCB0aGlzX2xpbmVbMV0rTElORV9ESUZGKQ0KDQogICAgZGVmIHdyYXBwZXIoKmFyZ3MpOg0KICAgICAgICB3aGlsZSAxOg0KICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgIHJldCA9IGZ1bmMoKmFyZ3NbbGltaXRbMF06XSkNCiAgICAgICAgICAgICAgICBmb3VuZEFyaXR5WzBdID0gVHJ1ZQ0KICAgICAgICAgICAgICAgIHJldHVybiByZXQNCiAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6DQogICAgICAgICAgICAgICAgIyByZS1yYWlzZSBUeXBlRXJyb3JzIGlmIHRoZXkgZGlkIG5vdCBjb21lIGZyb20gb3VyIGFyaXR5IHRlc3RpbmcNCiAgICAgICAgICAgICAgICBpZiBmb3VuZEFyaXR5WzBdOg0KICAgICAgICAgICAgICAgICAgICByYWlzZQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICAgICAgICAgIHRiID0gc3lzLmV4Y19pbmZvKClbLTFdDQogICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgZXh0cmFjdF90Yih0YiwgbGltaXQ9MilbLTFdWzoyXSA9PSBwYV9jYWxsX2xpbmVfc3ludGg6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UNCiAgICAgICAgICAgICAgICAgICAgZmluYWxseToNCiAgICAgICAgICAgICAgICAgICAgICAgIGRlbCB0Yg0KDQogICAgICAgICAgICAgICAgaWYgbGltaXRbMF0gPD0gbWF4YXJnczoNCiAgICAgICAgICAgICAgICAgICAgbGltaXRbMF0gKz0gMQ0KICAgICAgICAgICAgICAgICAgICBjb250aW51ZQ0KICAgICAgICAgICAgICAgIHJhaXNlDQoNCiAgICAjIGNvcHkgZnVuYyBuYW1lIHRvIHdyYXBwZXIgZm9yIHNlbnNpYmxlIGRlYnVnIG91dHB1dA0KICAgIGZ1bmNfbmFtZSA9ICI8cGFyc2UgYWN0aW9uPiINCiAgICB0cnk6DQogICAgICAgIGZ1bmNfbmFtZSA9IGdldGF0dHIoZnVuYywgJ19fbmFtZV9fJywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0YXR0cihmdW5jLCAnX19jbGFzc19fJykuX19uYW1lX18pDQogICAgZXhjZXB0IEV4Y2VwdGlvbjoNCiAgICAgICAgZnVuY19uYW1lID0gc3RyKGZ1bmMpDQogICAgd3JhcHBlci5fX25hbWVfXyA9IGZ1bmNfbmFtZQ0KDQogICAgcmV0dXJuIHdyYXBwZXINCg0KY2xhc3MgUGFyc2VyRWxlbWVudChvYmplY3QpOg0KICAgICIiIkFic3RyYWN0IGJhc2UgbGV2ZWwgcGFyc2VyIGVsZW1lbnQgY2xhc3MuIiIiDQogICAgREVGQVVMVF9XSElURV9DSEFSUyA9ICIgXG5cdFxyIg0KICAgIHZlcmJvc2Vfc3RhY2t0cmFjZSA9IEZhbHNlDQoNCiAgICBAc3RhdGljbWV0aG9kDQogICAgZGVmIHNldERlZmF1bHRXaGl0ZXNwYWNlQ2hhcnMoIGNoYXJzICk6DQogICAgICAgIHIiIiINCiAgICAgICAgT3ZlcnJpZGVzIHRoZSBkZWZhdWx0IHdoaXRlc3BhY2UgY2hhcnMNCg0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgICMgZGVmYXVsdCB3aGl0ZXNwYWNlIGNoYXJzIGFyZSBzcGFjZSwgPFRBQj4gYW5kIG5ld2xpbmUNCiAgICAgICAgICAgIE9uZU9yTW9yZShXb3JkKGFscGhhcykpLnBhcnNlU3RyaW5nKCJhYmMgZGVmXG5naGkgamtsIikgICMgLT4gWydhYmMnLCAnZGVmJywgJ2doaScsICdqa2wnXQ0KICAgICAgICAgICAgDQogICAgICAgICAgICAjIGNoYW5nZSB0byBqdXN0IHRyZWF0IG5ld2xpbmUgYXMgc2lnbmlmaWNhbnQNCiAgICAgICAgICAgIFBhcnNlckVsZW1lbnQuc2V0RGVmYXVsdFdoaXRlc3BhY2VDaGFycygiIFx0IikNCiAgICAgICAgICAgIE9uZU9yTW9yZShXb3JkKGFscGhhcykpLnBhcnNlU3RyaW5nKCJhYmMgZGVmXG5naGkgamtsIikgICMgLT4gWydhYmMnLCAnZGVmJ10NCiAgICAgICAgIiIiDQogICAgICAgIFBhcnNlckVsZW1lbnQuREVGQVVMVF9XSElURV9DSEFSUyA9IGNoYXJzDQoNCiAgICBAc3RhdGljbWV0aG9kDQogICAgZGVmIGlubGluZUxpdGVyYWxzVXNpbmcoY2xzKToNCiAgICAgICAgIiIiDQogICAgICAgIFNldCBjbGFzcyB0byBiZSB1c2VkIGZvciBpbmNsdXNpb24gb2Ygc3RyaW5nIGxpdGVyYWxzIGludG8gYSBwYXJzZXIuDQogICAgICAgIA0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgICMgZGVmYXVsdCBsaXRlcmFsIGNsYXNzIHVzZWQgaXMgTGl0ZXJhbA0KICAgICAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykNCiAgICAgICAgICAgIGRhdGVfc3RyID0gaW50ZWdlcigieWVhciIpICsgJy8nICsgaW50ZWdlcigibW9udGgiKSArICcvJyArIGludGVnZXIoImRheSIpICAgICAgICAgICANCg0KICAgICAgICAgICAgZGF0ZV9zdHIucGFyc2VTdHJpbmcoIjE5OTkvMTIvMzEiKSAgIyAtPiBbJzE5OTknLCAnLycsICcxMicsICcvJywgJzMxJ10NCg0KDQogICAgICAgICAgICAjIGNoYW5nZSB0byBTdXBwcmVzcw0KICAgICAgICAgICAgUGFyc2VyRWxlbWVudC5pbmxpbmVMaXRlcmFsc1VzaW5nKFN1cHByZXNzKQ0KICAgICAgICAgICAgZGF0ZV9zdHIgPSBpbnRlZ2VyKCJ5ZWFyIikgKyAnLycgKyBpbnRlZ2VyKCJtb250aCIpICsgJy8nICsgaW50ZWdlcigiZGF5IikgICAgICAgICAgIA0KDQogICAgICAgICAgICBkYXRlX3N0ci5wYXJzZVN0cmluZygiMTk5OS8xMi8zMSIpICAjIC0+IFsnMTk5OScsICcxMicsICczMSddDQogICAgICAgICIiIg0KICAgICAgICBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MgPSBjbHMNCg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgc2F2ZWxpc3Q9RmFsc2UgKToNCiAgICAgICAgc2VsZi5wYXJzZUFjdGlvbiA9IGxpc3QoKQ0KICAgICAgICBzZWxmLmZhaWxBY3Rpb24gPSBOb25lDQogICAgICAgICN+IHNlbGYubmFtZSA9ICI8dW5rbm93bj4iICAjIGRvbid0IGRlZmluZSBzZWxmLm5hbWUsIGxldCBzdWJjbGFzc2VzIHRyeS9leGNlcHQgdXBjYWxsDQogICAgICAgIHNlbGYuc3RyUmVwciA9IE5vbmUNCiAgICAgICAgc2VsZi5yZXN1bHRzTmFtZSA9IE5vbmUNCiAgICAgICAgc2VsZi5zYXZlQXNMaXN0ID0gc2F2ZWxpc3QNCiAgICAgICAgc2VsZi5za2lwV2hpdGVzcGFjZSA9IFRydWUNCiAgICAgICAgc2VsZi53aGl0ZUNoYXJzID0gUGFyc2VyRWxlbWVudC5ERUZBVUxUX1dISVRFX0NIQVJTDQogICAgICAgIHNlbGYuY29weURlZmF1bHRXaGl0ZUNoYXJzID0gVHJ1ZQ0KICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gRmFsc2UgIyB1c2VkIHdoZW4gY2hlY2tpbmcgZm9yIGxlZnQtcmVjdXJzaW9uDQogICAgICAgIHNlbGYua2VlcFRhYnMgPSBGYWxzZQ0KICAgICAgICBzZWxmLmlnbm9yZUV4cHJzID0gbGlzdCgpDQogICAgICAgIHNlbGYuZGVidWcgPSBGYWxzZQ0KICAgICAgICBzZWxmLnN0cmVhbWxpbmVkID0gRmFsc2UNCiAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gVHJ1ZSAjIHVzZWQgdG8gb3B0aW1pemUgZXhjZXB0aW9uIGhhbmRsaW5nIGZvciBzdWJjbGFzc2VzIHRoYXQgZG9uJ3QgYWR2YW5jZSBwYXJzZSBpbmRleA0KICAgICAgICBzZWxmLmVycm1zZyA9ICIiDQogICAgICAgIHNlbGYubW9kYWxSZXN1bHRzID0gVHJ1ZSAjIHVzZWQgdG8gbWFyayByZXN1bHRzIG5hbWVzIGFzIG1vZGFsIChyZXBvcnQgb25seSBsYXN0KSBvciBjdW11bGF0aXZlIChsaXN0IGFsbCkNCiAgICAgICAgc2VsZi5kZWJ1Z0FjdGlvbnMgPSAoIE5vbmUsIE5vbmUsIE5vbmUgKSAjY3VzdG9tIGRlYnVnIGFjdGlvbnMNCiAgICAgICAgc2VsZi5yZSA9IE5vbmUNCiAgICAgICAgc2VsZi5jYWxsUHJlcGFyc2UgPSBUcnVlICMgdXNlZCB0byBhdm9pZCByZWR1bmRhbnQgY2FsbHMgdG8gcHJlUGFyc2UNCiAgICAgICAgc2VsZi5jYWxsRHVyaW5nVHJ5ID0gRmFsc2UNCg0KICAgIGRlZiBjb3B5KCBzZWxmICk6DQogICAgICAgICIiIg0KICAgICAgICBNYWtlIGEgY29weSBvZiB0aGlzIEN7UGFyc2VyRWxlbWVudH0uICBVc2VmdWwgZm9yIGRlZmluaW5nIGRpZmZlcmVudCBwYXJzZSBhY3Rpb25zDQogICAgICAgIGZvciB0aGUgc2FtZSBwYXJzaW5nIHBhdHRlcm4sIHVzaW5nIGNvcGllcyBvZiB0aGUgb3JpZ2luYWwgcGFyc2UgZWxlbWVudC4NCiAgICAgICAgDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHRva3M6IGludCh0b2tzWzBdKSkNCiAgICAgICAgICAgIGludGVnZXJLID0gaW50ZWdlci5jb3B5KCkuYWRkUGFyc2VBY3Rpb24obGFtYmRhIHRva3M6IHRva3NbMF0qMTAyNCkgKyBTdXBwcmVzcygiSyIpDQogICAgICAgICAgICBpbnRlZ2VyTSA9IGludGVnZXIuY29weSgpLmFkZFBhcnNlQWN0aW9uKGxhbWJkYSB0b2tzOiB0b2tzWzBdKjEwMjQqMTAyNCkgKyBTdXBwcmVzcygiTSIpDQogICAgICAgICAgICANCiAgICAgICAgICAgIHByaW50KE9uZU9yTW9yZShpbnRlZ2VySyB8IGludGVnZXJNIHwgaW50ZWdlcikucGFyc2VTdHJpbmcoIjVLIDEwMCA2NDBLIDI1Nk0iKSkNCiAgICAgICAgcHJpbnRzOjoNCiAgICAgICAgICAgIFs1MTIwLCAxMDAsIDY1NTM2MCwgMjY4NDM1NDU2XQ0KICAgICAgICBFcXVpdmFsZW50IGZvcm0gb2YgQ3tleHByLmNvcHkoKX0gaXMganVzdCBDe2V4cHIoKX06Og0KICAgICAgICAgICAgaW50ZWdlck0gPSBpbnRlZ2VyKCkuYWRkUGFyc2VBY3Rpb24obGFtYmRhIHRva3M6IHRva3NbMF0qMTAyNCoxMDI0KSArIFN1cHByZXNzKCJNIikNCiAgICAgICAgIiIiDQogICAgICAgIGNweSA9IGNvcHkuY29weSggc2VsZiApDQogICAgICAgIGNweS5wYXJzZUFjdGlvbiA9IHNlbGYucGFyc2VBY3Rpb25bOl0NCiAgICAgICAgY3B5Lmlnbm9yZUV4cHJzID0gc2VsZi5pZ25vcmVFeHByc1s6XQ0KICAgICAgICBpZiBzZWxmLmNvcHlEZWZhdWx0V2hpdGVDaGFyczoNCiAgICAgICAgICAgIGNweS53aGl0ZUNoYXJzID0gUGFyc2VyRWxlbWVudC5ERUZBVUxUX1dISVRFX0NIQVJTDQogICAgICAgIHJldHVybiBjcHkNCg0KICAgIGRlZiBzZXROYW1lKCBzZWxmLCBuYW1lICk6DQogICAgICAgICIiIg0KICAgICAgICBEZWZpbmUgbmFtZSBmb3IgdGhpcyBleHByZXNzaW9uLCBtYWtlcyBkZWJ1Z2dpbmcgYW5kIGV4Y2VwdGlvbiBtZXNzYWdlcyBjbGVhcmVyLg0KICAgICAgICANCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBXb3JkKG51bXMpLnBhcnNlU3RyaW5nKCJBQkMiKSAgIyAtPiBFeGNlcHRpb246IEV4cGVjdGVkIFc6KDAxMjMuLi4pIChhdCBjaGFyIDApLCAobGluZToxLCBjb2w6MSkNCiAgICAgICAgICAgIFdvcmQobnVtcykuc2V0TmFtZSgiaW50ZWdlciIpLnBhcnNlU3RyaW5nKCJBQkMiKSAgIyAtPiBFeGNlcHRpb246IEV4cGVjdGVkIGludGVnZXIgKGF0IGNoYXIgMCksIChsaW5lOjEsIGNvbDoxKQ0KICAgICAgICAiIiINCiAgICAgICAgc2VsZi5uYW1lID0gbmFtZQ0KICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCAiICsgc2VsZi5uYW1lDQogICAgICAgIGlmIGhhc2F0dHIoc2VsZiwiZXhjZXB0aW9uIik6DQogICAgICAgICAgICBzZWxmLmV4Y2VwdGlvbi5tc2cgPSBzZWxmLmVycm1zZw0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIHNldFJlc3VsdHNOYW1lKCBzZWxmLCBuYW1lLCBsaXN0QWxsTWF0Y2hlcz1GYWxzZSApOg0KICAgICAgICAiIiINCiAgICAgICAgRGVmaW5lIG5hbWUgZm9yIHJlZmVyZW5jaW5nIG1hdGNoaW5nIHRva2VucyBhcyBhIG5lc3RlZCBhdHRyaWJ1dGUNCiAgICAgICAgb2YgdGhlIHJldHVybmVkIHBhcnNlIHJlc3VsdHMuDQogICAgICAgIE5PVEU6IHRoaXMgcmV0dXJucyBhICpjb3B5KiBvZiB0aGUgb3JpZ2luYWwgQ3tQYXJzZXJFbGVtZW50fSBvYmplY3Q7DQogICAgICAgIHRoaXMgaXMgc28gdGhhdCB0aGUgY2xpZW50IGNhbiBkZWZpbmUgYSBiYXNpYyBlbGVtZW50LCBzdWNoIGFzIGFuDQogICAgICAgIGludGVnZXIsIGFuZCByZWZlcmVuY2UgaXQgaW4gbXVsdGlwbGUgcGxhY2VzIHdpdGggZGlmZmVyZW50IG5hbWVzLg0KDQogICAgICAgIFlvdSBjYW4gYWxzbyBzZXQgcmVzdWx0cyBuYW1lcyB1c2luZyB0aGUgYWJicmV2aWF0ZWQgc3ludGF4LA0KICAgICAgICBDe2V4cHIoIm5hbWUiKX0gaW4gcGxhY2Ugb2YgQ3tleHByLnNldFJlc3VsdHNOYW1lKCJuYW1lIil9IC0gDQogICAgICAgIHNlZSBMe0l7X19jYWxsX199PF9fY2FsbF9fPn0uDQoNCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBkYXRlX3N0ciA9IChpbnRlZ2VyLnNldFJlc3VsdHNOYW1lKCJ5ZWFyIikgKyAnLycgDQogICAgICAgICAgICAgICAgICAgICAgICArIGludGVnZXIuc2V0UmVzdWx0c05hbWUoIm1vbnRoIikgKyAnLycgDQogICAgICAgICAgICAgICAgICAgICAgICArIGludGVnZXIuc2V0UmVzdWx0c05hbWUoImRheSIpKQ0KDQogICAgICAgICAgICAjIGVxdWl2YWxlbnQgZm9ybToNCiAgICAgICAgICAgIGRhdGVfc3RyID0gaW50ZWdlcigieWVhciIpICsgJy8nICsgaW50ZWdlcigibW9udGgiKSArICcvJyArIGludGVnZXIoImRheSIpDQogICAgICAgICIiIg0KICAgICAgICBuZXdzZWxmID0gc2VsZi5jb3B5KCkNCiAgICAgICAgaWYgbmFtZS5lbmRzd2l0aCgiKiIpOg0KICAgICAgICAgICAgbmFtZSA9IG5hbWVbOi0xXQ0KICAgICAgICAgICAgbGlzdEFsbE1hdGNoZXM9VHJ1ZQ0KICAgICAgICBuZXdzZWxmLnJlc3VsdHNOYW1lID0gbmFtZQ0KICAgICAgICBuZXdzZWxmLm1vZGFsUmVzdWx0cyA9IG5vdCBsaXN0QWxsTWF0Y2hlcw0KICAgICAgICByZXR1cm4gbmV3c2VsZg0KDQogICAgZGVmIHNldEJyZWFrKHNlbGYsYnJlYWtGbGFnID0gVHJ1ZSk6DQogICAgICAgICIiIk1ldGhvZCB0byBpbnZva2UgdGhlIFB5dGhvbiBwZGIgZGVidWdnZXIgd2hlbiB0aGlzIGVsZW1lbnQgaXMNCiAgICAgICAgICAgYWJvdXQgdG8gYmUgcGFyc2VkLiBTZXQgQ3ticmVha0ZsYWd9IHRvIFRydWUgdG8gZW5hYmxlLCBGYWxzZSB0bw0KICAgICAgICAgICBkaXNhYmxlLg0KICAgICAgICAiIiINCiAgICAgICAgaWYgYnJlYWtGbGFnOg0KICAgICAgICAgICAgX3BhcnNlTWV0aG9kID0gc2VsZi5fcGFyc2UNCiAgICAgICAgICAgIGRlZiBicmVha2VyKGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlLCBjYWxsUHJlUGFyc2U9VHJ1ZSk6DQogICAgICAgICAgICAgICAgaW1wb3J0IHBkYg0KICAgICAgICAgICAgICAgIHBkYi5zZXRfdHJhY2UoKQ0KICAgICAgICAgICAgICAgIHJldHVybiBfcGFyc2VNZXRob2QoIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucywgY2FsbFByZVBhcnNlICkNCiAgICAgICAgICAgIGJyZWFrZXIuX29yaWdpbmFsUGFyc2VNZXRob2QgPSBfcGFyc2VNZXRob2QNCiAgICAgICAgICAgIHNlbGYuX3BhcnNlID0gYnJlYWtlcg0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgaWYgaGFzYXR0cihzZWxmLl9wYXJzZSwiX29yaWdpbmFsUGFyc2VNZXRob2QiKToNCiAgICAgICAgICAgICAgICBzZWxmLl9wYXJzZSA9IHNlbGYuX3BhcnNlLl9vcmlnaW5hbFBhcnNlTWV0aG9kDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgc2V0UGFyc2VBY3Rpb24oIHNlbGYsICpmbnMsICoqa3dhcmdzICk6DQogICAgICAgICIiIg0KICAgICAgICBEZWZpbmUgb25lIG9yIG1vcmUgYWN0aW9ucyB0byBwZXJmb3JtIHdoZW4gc3VjY2Vzc2Z1bGx5IG1hdGNoaW5nIHBhcnNlIGVsZW1lbnQgZGVmaW5pdGlvbi4NCiAgICAgICAgUGFyc2UgYWN0aW9uIGZuIGlzIGEgY2FsbGFibGUgbWV0aG9kIHdpdGggMC0zIGFyZ3VtZW50cywgY2FsbGVkIGFzIEN7Zm4ocyxsb2MsdG9rcyl9LA0KICAgICAgICBDe2ZuKGxvYyx0b2tzKX0sIEN7Zm4odG9rcyl9LCBvciBqdXN0IEN7Zm4oKX0sIHdoZXJlOg0KICAgICAgICAgLSBzICAgPSB0aGUgb3JpZ2luYWwgc3RyaW5nIGJlaW5nIHBhcnNlZCAoc2VlIG5vdGUgYmVsb3cpDQogICAgICAgICAtIGxvYyA9IHRoZSBsb2NhdGlvbiBvZiB0aGUgbWF0Y2hpbmcgc3Vic3RyaW5nDQogICAgICAgICAtIHRva3MgPSBhIGxpc3Qgb2YgdGhlIG1hdGNoZWQgdG9rZW5zLCBwYWNrYWdlZCBhcyBhIEN7THtQYXJzZVJlc3VsdHN9fSBvYmplY3QNCiAgICAgICAgSWYgdGhlIGZ1bmN0aW9ucyBpbiBmbnMgbW9kaWZ5IHRoZSB0b2tlbnMsIHRoZXkgY2FuIHJldHVybiB0aGVtIGFzIHRoZSByZXR1cm4NCiAgICAgICAgdmFsdWUgZnJvbSBmbiwgYW5kIHRoZSBtb2RpZmllZCBsaXN0IG9mIHRva2VucyB3aWxsIHJlcGxhY2UgdGhlIG9yaWdpbmFsLg0KICAgICAgICBPdGhlcndpc2UsIGZuIGRvZXMgbm90IG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZS4NCg0KICAgICAgICBPcHRpb25hbCBrZXl3b3JkIGFyZ3VtZW50czoNCiAgICAgICAgIC0gY2FsbER1cmluZ1RyeSA9IChkZWZhdWx0PUN7RmFsc2V9KSBpbmRpY2F0ZSBpZiBwYXJzZSBhY3Rpb24gc2hvdWxkIGJlIHJ1biBkdXJpbmcgbG9va2FoZWFkcyBhbmQgYWx0ZXJuYXRlIHRlc3RpbmcNCg0KICAgICAgICBOb3RlOiB0aGUgZGVmYXVsdCBwYXJzaW5nIGJlaGF2aW9yIGlzIHRvIGV4cGFuZCB0YWJzIGluIHRoZSBpbnB1dCBzdHJpbmcNCiAgICAgICAgYmVmb3JlIHN0YXJ0aW5nIHRoZSBwYXJzaW5nIHByb2Nlc3MuICBTZWUgTHtJe3BhcnNlU3RyaW5nfTxwYXJzZVN0cmluZz59IGZvciBtb3JlIGluZm9ybWF0aW9uDQogICAgICAgIG9uIHBhcnNpbmcgc3RyaW5ncyBjb250YWluaW5nIEN7PFRBQj59cywgYW5kIHN1Z2dlc3RlZCBtZXRob2RzIHRvIG1haW50YWluIGENCiAgICAgICAgY29uc2lzdGVudCB2aWV3IG9mIHRoZSBwYXJzZWQgc3RyaW5nLCB0aGUgcGFyc2UgbG9jYXRpb24sIGFuZCBsaW5lIGFuZCBjb2x1bW4NCiAgICAgICAgcG9zaXRpb25zIHdpdGhpbiB0aGUgcGFyc2VkIHN0cmluZy4NCiAgICAgICAgDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykNCiAgICAgICAgICAgIGRhdGVfc3RyID0gaW50ZWdlciArICcvJyArIGludGVnZXIgKyAnLycgKyBpbnRlZ2VyDQoNCiAgICAgICAgICAgIGRhdGVfc3RyLnBhcnNlU3RyaW5nKCIxOTk5LzEyLzMxIikgICMgLT4gWycxOTk5JywgJy8nLCAnMTInLCAnLycsICczMSddDQoNCiAgICAgICAgICAgICMgdXNlIHBhcnNlIGFjdGlvbiB0byBjb252ZXJ0IHRvIGludHMgYXQgcGFyc2UgdGltZQ0KICAgICAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHRva3M6IGludCh0b2tzWzBdKSkNCiAgICAgICAgICAgIGRhdGVfc3RyID0gaW50ZWdlciArICcvJyArIGludGVnZXIgKyAnLycgKyBpbnRlZ2VyDQoNCiAgICAgICAgICAgICMgbm90ZSB0aGF0IGludGVnZXIgZmllbGRzIGFyZSBub3cgaW50cywgbm90IHN0cmluZ3MNCiAgICAgICAgICAgIGRhdGVfc3RyLnBhcnNlU3RyaW5nKCIxOTk5LzEyLzMxIikgICMgLT4gWzE5OTksICcvJywgMTIsICcvJywgMzFdDQogICAgICAgICIiIg0KICAgICAgICBzZWxmLnBhcnNlQWN0aW9uID0gbGlzdChtYXAoX3RyaW1fYXJpdHksIGxpc3QoZm5zKSkpDQogICAgICAgIHNlbGYuY2FsbER1cmluZ1RyeSA9IGt3YXJncy5nZXQoImNhbGxEdXJpbmdUcnkiLCBGYWxzZSkNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBhZGRQYXJzZUFjdGlvbiggc2VsZiwgKmZucywgKiprd2FyZ3MgKToNCiAgICAgICAgIiIiDQogICAgICAgIEFkZCBvbmUgb3IgbW9yZSBwYXJzZSBhY3Rpb25zIHRvIGV4cHJlc3Npb24ncyBsaXN0IG9mIHBhcnNlIGFjdGlvbnMuIFNlZSBMe0l7c2V0UGFyc2VBY3Rpb259PHNldFBhcnNlQWN0aW9uPn0uDQogICAgICAgIA0KICAgICAgICBTZWUgZXhhbXBsZXMgaW4gTHtJe2NvcHl9PGNvcHk+fS4NCiAgICAgICAgIiIiDQogICAgICAgIHNlbGYucGFyc2VBY3Rpb24gKz0gbGlzdChtYXAoX3RyaW1fYXJpdHksIGxpc3QoZm5zKSkpDQogICAgICAgIHNlbGYuY2FsbER1cmluZ1RyeSA9IHNlbGYuY2FsbER1cmluZ1RyeSBvciBrd2FyZ3MuZ2V0KCJjYWxsRHVyaW5nVHJ5IiwgRmFsc2UpDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgYWRkQ29uZGl0aW9uKHNlbGYsICpmbnMsICoqa3dhcmdzKToNCiAgICAgICAgIiIiQWRkIGEgYm9vbGVhbiBwcmVkaWNhdGUgZnVuY3Rpb24gdG8gZXhwcmVzc2lvbidzIGxpc3Qgb2YgcGFyc2UgYWN0aW9ucy4gU2VlIA0KICAgICAgICBMe0l7c2V0UGFyc2VBY3Rpb259PHNldFBhcnNlQWN0aW9uPn0gZm9yIGZ1bmN0aW9uIGNhbGwgc2lnbmF0dXJlcy4gVW5saWtlIEN7c2V0UGFyc2VBY3Rpb259LCANCiAgICAgICAgZnVuY3Rpb25zIHBhc3NlZCB0byBDe2FkZENvbmRpdGlvbn0gbmVlZCB0byByZXR1cm4gYm9vbGVhbiBzdWNjZXNzL2ZhaWwgb2YgdGhlIGNvbmRpdGlvbi4NCg0KICAgICAgICBPcHRpb25hbCBrZXl3b3JkIGFyZ3VtZW50czoNCiAgICAgICAgIC0gbWVzc2FnZSA9IGRlZmluZSBhIGN1c3RvbSBtZXNzYWdlIHRvIGJlIHVzZWQgaW4gdGhlIHJhaXNlZCBleGNlcHRpb24NCiAgICAgICAgIC0gZmF0YWwgICA9IGlmIFRydWUsIHdpbGwgcmFpc2UgUGFyc2VGYXRhbEV4Y2VwdGlvbiB0byBzdG9wIHBhcnNpbmcgaW1tZWRpYXRlbHk7IG90aGVyd2lzZSB3aWxsIHJhaXNlIFBhcnNlRXhjZXB0aW9uDQogICAgICAgICANCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgdG9rczogaW50KHRva3NbMF0pKQ0KICAgICAgICAgICAgeWVhcl9pbnQgPSBpbnRlZ2VyLmNvcHkoKQ0KICAgICAgICAgICAgeWVhcl9pbnQuYWRkQ29uZGl0aW9uKGxhbWJkYSB0b2tzOiB0b2tzWzBdID49IDIwMDAsIG1lc3NhZ2U9Ik9ubHkgc3VwcG9ydCB5ZWFycyAyMDAwIGFuZCBsYXRlciIpDQogICAgICAgICAgICBkYXRlX3N0ciA9IHllYXJfaW50ICsgJy8nICsgaW50ZWdlciArICcvJyArIGludGVnZXINCg0KICAgICAgICAgICAgcmVzdWx0ID0gZGF0ZV9zdHIucGFyc2VTdHJpbmcoIjE5OTkvMTIvMzEiKSAgIyAtPiBFeGNlcHRpb246IE9ubHkgc3VwcG9ydCB5ZWFycyAyMDAwIGFuZCBsYXRlciAoYXQgY2hhciAwKSwgKGxpbmU6MSwgY29sOjEpDQogICAgICAgICIiIg0KICAgICAgICBtc2cgPSBrd2FyZ3MuZ2V0KCJtZXNzYWdlIiwgImZhaWxlZCB1c2VyLWRlZmluZWQgY29uZGl0aW9uIikNCiAgICAgICAgZXhjX3R5cGUgPSBQYXJzZUZhdGFsRXhjZXB0aW9uIGlmIGt3YXJncy5nZXQoImZhdGFsIiwgRmFsc2UpIGVsc2UgUGFyc2VFeGNlcHRpb24NCiAgICAgICAgZm9yIGZuIGluIGZuczoNCiAgICAgICAgICAgIGRlZiBwYShzLGwsdCk6DQogICAgICAgICAgICAgICAgaWYgbm90IGJvb2woX3RyaW1fYXJpdHkoZm4pKHMsbCx0KSk6DQogICAgICAgICAgICAgICAgICAgIHJhaXNlIGV4Y190eXBlKHMsbCxtc2cpDQogICAgICAgICAgICBzZWxmLnBhcnNlQWN0aW9uLmFwcGVuZChwYSkNCiAgICAgICAgc2VsZi5jYWxsRHVyaW5nVHJ5ID0gc2VsZi5jYWxsRHVyaW5nVHJ5IG9yIGt3YXJncy5nZXQoImNhbGxEdXJpbmdUcnkiLCBGYWxzZSkNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBzZXRGYWlsQWN0aW9uKCBzZWxmLCBmbiApOg0KICAgICAgICAiIiJEZWZpbmUgYWN0aW9uIHRvIHBlcmZvcm0gaWYgcGFyc2luZyBmYWlscyBhdCB0aGlzIGV4cHJlc3Npb24uDQogICAgICAgICAgIEZhaWwgYWN0b24gZm4gaXMgYSBjYWxsYWJsZSBmdW5jdGlvbiB0aGF0IHRha2VzIHRoZSBhcmd1bWVudHMNCiAgICAgICAgICAgQ3tmbihzLGxvYyxleHByLGVycil9IHdoZXJlOg0KICAgICAgICAgICAgLSBzID0gc3RyaW5nIGJlaW5nIHBhcnNlZA0KICAgICAgICAgICAgLSBsb2MgPSBsb2NhdGlvbiB3aGVyZSBleHByZXNzaW9uIG1hdGNoIHdhcyBhdHRlbXB0ZWQgYW5kIGZhaWxlZA0KICAgICAgICAgICAgLSBleHByID0gdGhlIHBhcnNlIGV4cHJlc3Npb24gdGhhdCBmYWlsZWQNCiAgICAgICAgICAgIC0gZXJyID0gdGhlIGV4Y2VwdGlvbiB0aHJvd24NCiAgICAgICAgICAgVGhlIGZ1bmN0aW9uIHJldHVybnMgbm8gdmFsdWUuICBJdCBtYXkgdGhyb3cgQ3tMe1BhcnNlRmF0YWxFeGNlcHRpb259fQ0KICAgICAgICAgICBpZiBpdCBpcyBkZXNpcmVkIHRvIHN0b3AgcGFyc2luZyBpbW1lZGlhdGVseS4iIiINCiAgICAgICAgc2VsZi5mYWlsQWN0aW9uID0gZm4NCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBfc2tpcElnbm9yYWJsZXMoIHNlbGYsIGluc3RyaW5nLCBsb2MgKToNCiAgICAgICAgZXhwcnNGb3VuZCA9IFRydWUNCiAgICAgICAgd2hpbGUgZXhwcnNGb3VuZDoNCiAgICAgICAgICAgIGV4cHJzRm91bmQgPSBGYWxzZQ0KICAgICAgICAgICAgZm9yIGUgaW4gc2VsZi5pZ25vcmVFeHByczoNCiAgICAgICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgICAgIHdoaWxlIDE6DQogICAgICAgICAgICAgICAgICAgICAgICBsb2MsZHVtbXkgPSBlLl9wYXJzZSggaW5zdHJpbmcsIGxvYyApDQogICAgICAgICAgICAgICAgICAgICAgICBleHByc0ZvdW5kID0gVHJ1ZQ0KICAgICAgICAgICAgICAgIGV4Y2VwdCBQYXJzZUV4Y2VwdGlvbjoNCiAgICAgICAgICAgICAgICAgICAgcGFzcw0KICAgICAgICByZXR1cm4gbG9jDQoNCiAgICBkZWYgcHJlUGFyc2UoIHNlbGYsIGluc3RyaW5nLCBsb2MgKToNCiAgICAgICAgaWYgc2VsZi5pZ25vcmVFeHByczoNCiAgICAgICAgICAgIGxvYyA9IHNlbGYuX3NraXBJZ25vcmFibGVzKCBpbnN0cmluZywgbG9jICkNCg0KICAgICAgICBpZiBzZWxmLnNraXBXaGl0ZXNwYWNlOg0KICAgICAgICAgICAgd3QgPSBzZWxmLndoaXRlQ2hhcnMNCiAgICAgICAgICAgIGluc3RybGVuID0gbGVuKGluc3RyaW5nKQ0KICAgICAgICAgICAgd2hpbGUgbG9jIDwgaW5zdHJsZW4gYW5kIGluc3RyaW5nW2xvY10gaW4gd3Q6DQogICAgICAgICAgICAgICAgbG9jICs9IDENCg0KICAgICAgICByZXR1cm4gbG9jDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICByZXR1cm4gbG9jLCBbXQ0KDQogICAgZGVmIHBvc3RQYXJzZSggc2VsZiwgaW5zdHJpbmcsIGxvYywgdG9rZW5saXN0ICk6DQogICAgICAgIHJldHVybiB0b2tlbmxpc3QNCg0KICAgICN+IEBwcm9maWxlDQogICAgZGVmIF9wYXJzZU5vQ2FjaGUoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlLCBjYWxsUHJlUGFyc2U9VHJ1ZSApOg0KICAgICAgICBkZWJ1Z2dpbmcgPSAoIHNlbGYuZGVidWcgKSAjYW5kIGRvQWN0aW9ucyApDQoNCiAgICAgICAgaWYgZGVidWdnaW5nIG9yIHNlbGYuZmFpbEFjdGlvbjoNCiAgICAgICAgICAgICN+IHByaW50ICgiTWF0Y2giLHNlbGYsImF0IGxvYyIsbG9jLCIoJWQsJWQpIiAlICggbGluZW5vKGxvYyxpbnN0cmluZyksIGNvbChsb2MsaW5zdHJpbmcpICkpDQogICAgICAgICAgICBpZiAoc2VsZi5kZWJ1Z0FjdGlvbnNbMF0gKToNCiAgICAgICAgICAgICAgICBzZWxmLmRlYnVnQWN0aW9uc1swXSggaW5zdHJpbmcsIGxvYywgc2VsZiApDQogICAgICAgICAgICBpZiBjYWxsUHJlUGFyc2UgYW5kIHNlbGYuY2FsbFByZXBhcnNlOg0KICAgICAgICAgICAgICAgIHByZWxvYyA9IHNlbGYucHJlUGFyc2UoIGluc3RyaW5nLCBsb2MgKQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICBwcmVsb2MgPSBsb2MNCiAgICAgICAgICAgIHRva2Vuc1N0YXJ0ID0gcHJlbG9jDQogICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgICAgICBsb2MsdG9rZW5zID0gc2VsZi5wYXJzZUltcGwoIGluc3RyaW5nLCBwcmVsb2MsIGRvQWN0aW9ucyApDQogICAgICAgICAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6DQogICAgICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKCBpbnN0cmluZywgbGVuKGluc3RyaW5nKSwgc2VsZi5lcnJtc2csIHNlbGYgKQ0KICAgICAgICAgICAgZXhjZXB0IFBhcnNlQmFzZUV4Y2VwdGlvbiBhcyBlcnI6DQogICAgICAgICAgICAgICAgI34gcHJpbnQgKCJFeGNlcHRpb24gcmFpc2VkOiIsIGVycikNCiAgICAgICAgICAgICAgICBpZiBzZWxmLmRlYnVnQWN0aW9uc1syXToNCiAgICAgICAgICAgICAgICAgICAgc2VsZi5kZWJ1Z0FjdGlvbnNbMl0oIGluc3RyaW5nLCB0b2tlbnNTdGFydCwgc2VsZiwgZXJyICkNCiAgICAgICAgICAgICAgICBpZiBzZWxmLmZhaWxBY3Rpb246DQogICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbEFjdGlvbiggaW5zdHJpbmcsIHRva2Vuc1N0YXJ0LCBzZWxmLCBlcnIgKQ0KICAgICAgICAgICAgICAgIHJhaXNlDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBpZiBjYWxsUHJlUGFyc2UgYW5kIHNlbGYuY2FsbFByZXBhcnNlOg0KICAgICAgICAgICAgICAgIHByZWxvYyA9IHNlbGYucHJlUGFyc2UoIGluc3RyaW5nLCBsb2MgKQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICBwcmVsb2MgPSBsb2MNCiAgICAgICAgICAgIHRva2Vuc1N0YXJ0ID0gcHJlbG9jDQogICAgICAgICAgICBpZiBzZWxmLm1heUluZGV4RXJyb3Igb3IgcHJlbG9jID49IGxlbihpbnN0cmluZyk6DQogICAgICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgICAgICBsb2MsdG9rZW5zID0gc2VsZi5wYXJzZUltcGwoIGluc3RyaW5nLCBwcmVsb2MsIGRvQWN0aW9ucyApDQogICAgICAgICAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6DQogICAgICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKCBpbnN0cmluZywgbGVuKGluc3RyaW5nKSwgc2VsZi5lcnJtc2csIHNlbGYgKQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICBsb2MsdG9rZW5zID0gc2VsZi5wYXJzZUltcGwoIGluc3RyaW5nLCBwcmVsb2MsIGRvQWN0aW9ucyApDQoNCiAgICAgICAgdG9rZW5zID0gc2VsZi5wb3N0UGFyc2UoIGluc3RyaW5nLCBsb2MsIHRva2VucyApDQoNCiAgICAgICAgcmV0VG9rZW5zID0gUGFyc2VSZXN1bHRzKCB0b2tlbnMsIHNlbGYucmVzdWx0c05hbWUsIGFzTGlzdD1zZWxmLnNhdmVBc0xpc3QsIG1vZGFsPXNlbGYubW9kYWxSZXN1bHRzICkNCiAgICAgICAgaWYgc2VsZi5wYXJzZUFjdGlvbiBhbmQgKGRvQWN0aW9ucyBvciBzZWxmLmNhbGxEdXJpbmdUcnkpOg0KICAgICAgICAgICAgaWYgZGVidWdnaW5nOg0KICAgICAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICAgICAgZm9yIGZuIGluIHNlbGYucGFyc2VBY3Rpb246DQogICAgICAgICAgICAgICAgICAgICAgICB0b2tlbnMgPSBmbiggaW5zdHJpbmcsIHRva2Vuc1N0YXJ0LCByZXRUb2tlbnMgKQ0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgdG9rZW5zIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldFRva2VucyA9IFBhcnNlUmVzdWx0cyggdG9rZW5zLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXN1bHRzTmFtZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzTGlzdD1zZWxmLnNhdmVBc0xpc3QgYW5kIGlzaW5zdGFuY2UodG9rZW5zLChQYXJzZVJlc3VsdHMsbGlzdCkpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kYWw9c2VsZi5tb2RhbFJlc3VsdHMgKQ0KICAgICAgICAgICAgICAgIGV4Y2VwdCBQYXJzZUJhc2VFeGNlcHRpb24gYXMgZXJyOg0KICAgICAgICAgICAgICAgICAgICAjfiBwcmludCAiRXhjZXB0aW9uIHJhaXNlZCBpbiB1c2VyIHBhcnNlIGFjdGlvbjoiLCBlcnINCiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZGVidWdBY3Rpb25zWzJdICk6DQogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRlYnVnQWN0aW9uc1syXSggaW5zdHJpbmcsIHRva2Vuc1N0YXJ0LCBzZWxmLCBlcnIgKQ0KICAgICAgICAgICAgICAgICAgICByYWlzZQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICBmb3IgZm4gaW4gc2VsZi5wYXJzZUFjdGlvbjoNCiAgICAgICAgICAgICAgICAgICAgdG9rZW5zID0gZm4oIGluc3RyaW5nLCB0b2tlbnNTdGFydCwgcmV0VG9rZW5zICkNCiAgICAgICAgICAgICAgICAgICAgaWYgdG9rZW5zIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0VG9rZW5zID0gUGFyc2VSZXN1bHRzKCB0b2tlbnMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVzdWx0c05hbWUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzTGlzdD1zZWxmLnNhdmVBc0xpc3QgYW5kIGlzaW5zdGFuY2UodG9rZW5zLChQYXJzZVJlc3VsdHMsbGlzdCkpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RhbD1zZWxmLm1vZGFsUmVzdWx0cyApDQogICAgICAgIGlmIGRlYnVnZ2luZzoNCiAgICAgICAgICAgICN+IHByaW50ICgiTWF0Y2hlZCIsc2VsZiwiLT4iLHJldFRva2Vucy5hc0xpc3QoKSkNCiAgICAgICAgICAgIGlmIChzZWxmLmRlYnVnQWN0aW9uc1sxXSApOg0KICAgICAgICAgICAgICAgIHNlbGYuZGVidWdBY3Rpb25zWzFdKCBpbnN0cmluZywgdG9rZW5zU3RhcnQsIGxvYywgc2VsZiwgcmV0VG9rZW5zICkNCg0KICAgICAgICByZXR1cm4gbG9jLCByZXRUb2tlbnMNCg0KICAgIGRlZiB0cnlQYXJzZSggc2VsZiwgaW5zdHJpbmcsIGxvYyApOg0KICAgICAgICB0cnk6DQogICAgICAgICAgICByZXR1cm4gc2VsZi5fcGFyc2UoIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1GYWxzZSApWzBdDQogICAgICAgIGV4Y2VwdCBQYXJzZUZhdGFsRXhjZXB0aW9uOg0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oIGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KICAgIA0KICAgIGRlZiBjYW5QYXJzZU5leHQoc2VsZiwgaW5zdHJpbmcsIGxvYyk6DQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHNlbGYudHJ5UGFyc2UoaW5zdHJpbmcsIGxvYykNCiAgICAgICAgZXhjZXB0IChQYXJzZUV4Y2VwdGlvbiwgSW5kZXhFcnJvcik6DQogICAgICAgICAgICByZXR1cm4gRmFsc2UNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJldHVybiBUcnVlDQoNCiAgICBjbGFzcyBfVW5ib3VuZGVkQ2FjaGUob2JqZWN0KToNCiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOg0KICAgICAgICAgICAgY2FjaGUgPSB7fQ0KICAgICAgICAgICAgc2VsZi5ub3RfaW5fY2FjaGUgPSBub3RfaW5fY2FjaGUgPSBvYmplY3QoKQ0KDQogICAgICAgICAgICBkZWYgZ2V0KHNlbGYsIGtleSk6DQogICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlLmdldChrZXksIG5vdF9pbl9jYWNoZSkNCg0KICAgICAgICAgICAgZGVmIHNldChzZWxmLCBrZXksIHZhbHVlKToNCiAgICAgICAgICAgICAgICBjYWNoZVtrZXldID0gdmFsdWUNCg0KICAgICAgICAgICAgZGVmIGNsZWFyKHNlbGYpOg0KICAgICAgICAgICAgICAgIGNhY2hlLmNsZWFyKCkNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgIGRlZiBjYWNoZV9sZW4oc2VsZik6DQogICAgICAgICAgICAgICAgcmV0dXJuIGxlbihjYWNoZSkNCg0KICAgICAgICAgICAgc2VsZi5nZXQgPSB0eXBlcy5NZXRob2RUeXBlKGdldCwgc2VsZikNCiAgICAgICAgICAgIHNlbGYuc2V0ID0gdHlwZXMuTWV0aG9kVHlwZShzZXQsIHNlbGYpDQogICAgICAgICAgICBzZWxmLmNsZWFyID0gdHlwZXMuTWV0aG9kVHlwZShjbGVhciwgc2VsZikNCiAgICAgICAgICAgIHNlbGYuX19sZW5fXyA9IHR5cGVzLk1ldGhvZFR5cGUoY2FjaGVfbGVuLCBzZWxmKQ0KDQogICAgaWYgX09yZGVyZWREaWN0IGlzIG5vdCBOb25lOg0KICAgICAgICBjbGFzcyBfRmlmb0NhY2hlKG9iamVjdCk6DQogICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgc2l6ZSk6DQogICAgICAgICAgICAgICAgc2VsZi5ub3RfaW5fY2FjaGUgPSBub3RfaW5fY2FjaGUgPSBvYmplY3QoKQ0KDQogICAgICAgICAgICAgICAgY2FjaGUgPSBfT3JkZXJlZERpY3QoKQ0KDQogICAgICAgICAgICAgICAgZGVmIGdldChzZWxmLCBrZXkpOg0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FjaGUuZ2V0KGtleSwgbm90X2luX2NhY2hlKQ0KDQogICAgICAgICAgICAgICAgZGVmIHNldChzZWxmLCBrZXksIHZhbHVlKToNCiAgICAgICAgICAgICAgICAgICAgY2FjaGVba2V5XSA9IHZhbHVlDQogICAgICAgICAgICAgICAgICAgIHdoaWxlIGxlbihjYWNoZSkgPiBzaXplOg0KICAgICAgICAgICAgICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlLnBvcGl0ZW0oRmFsc2UpDQogICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzcw0KDQogICAgICAgICAgICAgICAgZGVmIGNsZWFyKHNlbGYpOg0KICAgICAgICAgICAgICAgICAgICBjYWNoZS5jbGVhcigpDQoNCiAgICAgICAgICAgICAgICBkZWYgY2FjaGVfbGVuKHNlbGYpOg0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGVuKGNhY2hlKQ0KDQogICAgICAgICAgICAgICAgc2VsZi5nZXQgPSB0eXBlcy5NZXRob2RUeXBlKGdldCwgc2VsZikNCiAgICAgICAgICAgICAgICBzZWxmLnNldCA9IHR5cGVzLk1ldGhvZFR5cGUoc2V0LCBzZWxmKQ0KICAgICAgICAgICAgICAgIHNlbGYuY2xlYXIgPSB0eXBlcy5NZXRob2RUeXBlKGNsZWFyLCBzZWxmKQ0KICAgICAgICAgICAgICAgIHNlbGYuX19sZW5fXyA9IHR5cGVzLk1ldGhvZFR5cGUoY2FjaGVfbGVuLCBzZWxmKQ0KDQogICAgZWxzZToNCiAgICAgICAgY2xhc3MgX0ZpZm9DYWNoZShvYmplY3QpOg0KICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNpemUpOg0KICAgICAgICAgICAgICAgIHNlbGYubm90X2luX2NhY2hlID0gbm90X2luX2NhY2hlID0gb2JqZWN0KCkNCg0KICAgICAgICAgICAgICAgIGNhY2hlID0ge30NCiAgICAgICAgICAgICAgICBrZXlfZmlmbyA9IGNvbGxlY3Rpb25zLmRlcXVlKFtdLCBzaXplKQ0KDQogICAgICAgICAgICAgICAgZGVmIGdldChzZWxmLCBrZXkpOg0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FjaGUuZ2V0KGtleSwgbm90X2luX2NhY2hlKQ0KDQogICAgICAgICAgICAgICAgZGVmIHNldChzZWxmLCBrZXksIHZhbHVlKToNCiAgICAgICAgICAgICAgICAgICAgY2FjaGVba2V5XSA9IHZhbHVlDQogICAgICAgICAgICAgICAgICAgIHdoaWxlIGxlbihrZXlfZmlmbykgPiBzaXplOg0KICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGUucG9wKGtleV9maWZvLnBvcGxlZnQoKSwgTm9uZSkNCiAgICAgICAgICAgICAgICAgICAga2V5X2ZpZm8uYXBwZW5kKGtleSkNCg0KICAgICAgICAgICAgICAgIGRlZiBjbGVhcihzZWxmKToNCiAgICAgICAgICAgICAgICAgICAgY2FjaGUuY2xlYXIoKQ0KICAgICAgICAgICAgICAgICAgICBrZXlfZmlmby5jbGVhcigpDQoNCiAgICAgICAgICAgICAgICBkZWYgY2FjaGVfbGVuKHNlbGYpOg0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGVuKGNhY2hlKQ0KDQogICAgICAgICAgICAgICAgc2VsZi5nZXQgPSB0eXBlcy5NZXRob2RUeXBlKGdldCwgc2VsZikNCiAgICAgICAgICAgICAgICBzZWxmLnNldCA9IHR5cGVzLk1ldGhvZFR5cGUoc2V0LCBzZWxmKQ0KICAgICAgICAgICAgICAgIHNlbGYuY2xlYXIgPSB0eXBlcy5NZXRob2RUeXBlKGNsZWFyLCBzZWxmKQ0KICAgICAgICAgICAgICAgIHNlbGYuX19sZW5fXyA9IHR5cGVzLk1ldGhvZFR5cGUoY2FjaGVfbGVuLCBzZWxmKQ0KDQogICAgIyBhcmd1bWVudCBjYWNoZSBmb3Igb3B0aW1pemluZyByZXBlYXRlZCBjYWxscyB3aGVuIGJhY2t0cmFja2luZyB0aHJvdWdoIHJlY3Vyc2l2ZSBleHByZXNzaW9ucw0KICAgIHBhY2tyYXRfY2FjaGUgPSB7fSAjIHRoaXMgaXMgc2V0IGxhdGVyIGJ5IGVuYWJsZWRQYWNrcmF0KCk7IHRoaXMgaXMgaGVyZSBzbyB0aGF0IHJlc2V0Q2FjaGUoKSBkb2Vzbid0IGZhaWwNCiAgICBwYWNrcmF0X2NhY2hlX2xvY2sgPSBSTG9jaygpDQogICAgcGFja3JhdF9jYWNoZV9zdGF0cyA9IFswLCAwXQ0KDQogICAgIyB0aGlzIG1ldGhvZCBnZXRzIHJlcGVhdGVkbHkgY2FsbGVkIGR1cmluZyBiYWNrdHJhY2tpbmcgd2l0aCB0aGUgc2FtZSBhcmd1bWVudHMgLQ0KICAgICMgd2UgY2FuIGNhY2hlIHRoZXNlIGFyZ3VtZW50cyBhbmQgc2F2ZSBvdXJzZWx2ZXMgdGhlIHRyb3VibGUgb2YgcmUtcGFyc2luZyB0aGUgY29udGFpbmVkIGV4cHJlc3Npb24NCiAgICBkZWYgX3BhcnNlQ2FjaGUoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlLCBjYWxsUHJlUGFyc2U9VHJ1ZSApOg0KICAgICAgICBISVQsIE1JU1MgPSAwLCAxDQogICAgICAgIGxvb2t1cCA9IChzZWxmLCBpbnN0cmluZywgbG9jLCBjYWxsUHJlUGFyc2UsIGRvQWN0aW9ucykNCiAgICAgICAgd2l0aCBQYXJzZXJFbGVtZW50LnBhY2tyYXRfY2FjaGVfbG9jazoNCiAgICAgICAgICAgIGNhY2hlID0gUGFyc2VyRWxlbWVudC5wYWNrcmF0X2NhY2hlDQogICAgICAgICAgICB2YWx1ZSA9IGNhY2hlLmdldChsb29rdXApDQogICAgICAgICAgICBpZiB2YWx1ZSBpcyBjYWNoZS5ub3RfaW5fY2FjaGU6DQogICAgICAgICAgICAgICAgUGFyc2VyRWxlbWVudC5wYWNrcmF0X2NhY2hlX3N0YXRzW01JU1NdICs9IDENCiAgICAgICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gc2VsZi5fcGFyc2VOb0NhY2hlKGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucywgY2FsbFByZVBhcnNlKQ0KICAgICAgICAgICAgICAgIGV4Y2VwdCBQYXJzZUJhc2VFeGNlcHRpb24gYXMgcGU6DQogICAgICAgICAgICAgICAgICAgICMgY2FjaGUgYSBjb3B5IG9mIHRoZSBleGNlcHRpb24sIHdpdGhvdXQgdGhlIHRyYWNlYmFjaw0KICAgICAgICAgICAgICAgICAgICBjYWNoZS5zZXQobG9va3VwLCBwZS5fX2NsYXNzX18oKnBlLmFyZ3MpKQ0KICAgICAgICAgICAgICAgICAgICByYWlzZQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIGNhY2hlLnNldChsb29rdXAsICh2YWx1ZVswXSwgdmFsdWVbMV0uY29weSgpKSkNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIFBhcnNlckVsZW1lbnQucGFja3JhdF9jYWNoZV9zdGF0c1tISVRdICs9IDENCiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBFeGNlcHRpb24pOg0KICAgICAgICAgICAgICAgICAgICByYWlzZSB2YWx1ZQ0KICAgICAgICAgICAgICAgIHJldHVybiAodmFsdWVbMF0sIHZhbHVlWzFdLmNvcHkoKSkNCg0KICAgIF9wYXJzZSA9IF9wYXJzZU5vQ2FjaGUNCg0KICAgIEBzdGF0aWNtZXRob2QNCiAgICBkZWYgcmVzZXRDYWNoZSgpOg0KICAgICAgICBQYXJzZXJFbGVtZW50LnBhY2tyYXRfY2FjaGUuY2xlYXIoKQ0KICAgICAgICBQYXJzZXJFbGVtZW50LnBhY2tyYXRfY2FjaGVfc3RhdHNbOl0gPSBbMF0gKiBsZW4oUGFyc2VyRWxlbWVudC5wYWNrcmF0X2NhY2hlX3N0YXRzKQ0KDQogICAgX3BhY2tyYXRFbmFibGVkID0gRmFsc2UNCiAgICBAc3RhdGljbWV0aG9kDQogICAgZGVmIGVuYWJsZVBhY2tyYXQoY2FjaGVfc2l6ZV9saW1pdD0xMjgpOg0KICAgICAgICAiIiJFbmFibGVzICJwYWNrcmF0IiBwYXJzaW5nLCB3aGljaCBhZGRzIG1lbW9pemluZyB0byB0aGUgcGFyc2luZyBsb2dpYy4NCiAgICAgICAgICAgUmVwZWF0ZWQgcGFyc2UgYXR0ZW1wdHMgYXQgdGhlIHNhbWUgc3RyaW5nIGxvY2F0aW9uICh3aGljaCBoYXBwZW5zDQogICAgICAgICAgIG9mdGVuIGluIG1hbnkgY29tcGxleCBncmFtbWFycykgY2FuIGltbWVkaWF0ZWx5IHJldHVybiBhIGNhY2hlZCB2YWx1ZSwNCiAgICAgICAgICAgaW5zdGVhZCBvZiByZS1leGVjdXRpbmcgcGFyc2luZy92YWxpZGF0aW5nIGNvZGUuICBNZW1vaXppbmcgaXMgZG9uZSBvZg0KICAgICAgICAgICBib3RoIHZhbGlkIHJlc3VsdHMgYW5kIHBhcnNpbmcgZXhjZXB0aW9ucy4NCiAgICAgICAgICAgDQogICAgICAgICAgIFBhcmFtZXRlcnM6DQogICAgICAgICAgICAtIGNhY2hlX3NpemVfbGltaXQgLSAoZGVmYXVsdD1DezEyOH0pIC0gaWYgYW4gaW50ZWdlciB2YWx1ZSBpcyBwcm92aWRlZA0KICAgICAgICAgICAgICB3aWxsIGxpbWl0IHRoZSBzaXplIG9mIHRoZSBwYWNrcmF0IGNhY2hlOyBpZiBOb25lIGlzIHBhc3NlZCwgdGhlbg0KICAgICAgICAgICAgICB0aGUgY2FjaGUgc2l6ZSB3aWxsIGJlIHVuYm91bmRlZDsgaWYgMCBpcyBwYXNzZWQsIHRoZSBjYWNoZSB3aWxsDQogICAgICAgICAgICAgIGJlIGVmZmVjdGl2ZWx5IGRpc2FibGVkLg0KICAgICAgICAgICAgDQogICAgICAgICAgIFRoaXMgc3BlZWR1cCBtYXkgYnJlYWsgZXhpc3RpbmcgcHJvZ3JhbXMgdGhhdCB1c2UgcGFyc2UgYWN0aW9ucyB0aGF0DQogICAgICAgICAgIGhhdmUgc2lkZS1lZmZlY3RzLiAgRm9yIHRoaXMgcmVhc29uLCBwYWNrcmF0IHBhcnNpbmcgaXMgZGlzYWJsZWQgd2hlbg0KICAgICAgICAgICB5b3UgZmlyc3QgaW1wb3J0IHB5cGFyc2luZy4gIFRvIGFjdGl2YXRlIHRoZSBwYWNrcmF0IGZlYXR1cmUsIHlvdXINCiAgICAgICAgICAgcHJvZ3JhbSBtdXN0IGNhbGwgdGhlIGNsYXNzIG1ldGhvZCBDe1BhcnNlckVsZW1lbnQuZW5hYmxlUGFja3JhdCgpfS4gIElmDQogICAgICAgICAgIHlvdXIgcHJvZ3JhbSB1c2VzIEN7cHN5Y299IHRvICJjb21waWxlIGFzIHlvdSBnbyIsIHlvdSBtdXN0IGNhbGwNCiAgICAgICAgICAgQ3tlbmFibGVQYWNrcmF0fSBiZWZvcmUgY2FsbGluZyBDe3BzeWNvLmZ1bGwoKX0uICBJZiB5b3UgZG8gbm90IGRvIHRoaXMsDQogICAgICAgICAgIFB5dGhvbiB3aWxsIGNyYXNoLiAgRm9yIGJlc3QgcmVzdWx0cywgY2FsbCBDe2VuYWJsZVBhY2tyYXQoKX0gaW1tZWRpYXRlbHkNCiAgICAgICAgICAgYWZ0ZXIgaW1wb3J0aW5nIHB5cGFyc2luZy4NCiAgICAgICAgICAgDQogICAgICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgICAgaW1wb3J0IHB5cGFyc2luZw0KICAgICAgICAgICAgICAgcHlwYXJzaW5nLlBhcnNlckVsZW1lbnQuZW5hYmxlUGFja3JhdCgpDQogICAgICAgICIiIg0KICAgICAgICBpZiBub3QgUGFyc2VyRWxlbWVudC5fcGFja3JhdEVuYWJsZWQ6DQogICAgICAgICAgICBQYXJzZXJFbGVtZW50Ll9wYWNrcmF0RW5hYmxlZCA9IFRydWUNCiAgICAgICAgICAgIGlmIGNhY2hlX3NpemVfbGltaXQgaXMgTm9uZToNCiAgICAgICAgICAgICAgICBQYXJzZXJFbGVtZW50LnBhY2tyYXRfY2FjaGUgPSBQYXJzZXJFbGVtZW50Ll9VbmJvdW5kZWRDYWNoZSgpDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIFBhcnNlckVsZW1lbnQucGFja3JhdF9jYWNoZSA9IFBhcnNlckVsZW1lbnQuX0ZpZm9DYWNoZShjYWNoZV9zaXplX2xpbWl0KQ0KICAgICAgICAgICAgUGFyc2VyRWxlbWVudC5fcGFyc2UgPSBQYXJzZXJFbGVtZW50Ll9wYXJzZUNhY2hlDQoNCiAgICBkZWYgcGFyc2VTdHJpbmcoIHNlbGYsIGluc3RyaW5nLCBwYXJzZUFsbD1GYWxzZSApOg0KICAgICAgICAiIiINCiAgICAgICAgRXhlY3V0ZSB0aGUgcGFyc2UgZXhwcmVzc2lvbiB3aXRoIHRoZSBnaXZlbiBzdHJpbmcuDQogICAgICAgIFRoaXMgaXMgdGhlIG1haW4gaW50ZXJmYWNlIHRvIHRoZSBjbGllbnQgY29kZSwgb25jZSB0aGUgY29tcGxldGUNCiAgICAgICAgZXhwcmVzc2lvbiBoYXMgYmVlbiBidWlsdC4NCg0KICAgICAgICBJZiB5b3Ugd2FudCB0aGUgZ3JhbW1hciB0byByZXF1aXJlIHRoYXQgdGhlIGVudGlyZSBpbnB1dCBzdHJpbmcgYmUNCiAgICAgICAgc3VjY2Vzc2Z1bGx5IHBhcnNlZCwgdGhlbiBzZXQgQ3twYXJzZUFsbH0gdG8gVHJ1ZSAoZXF1aXZhbGVudCB0byBlbmRpbmcNCiAgICAgICAgdGhlIGdyYW1tYXIgd2l0aCBDe0x7U3RyaW5nRW5kKCl9fSkuDQoNCiAgICAgICAgTm90ZTogQ3twYXJzZVN0cmluZ30gaW1wbGljaXRseSBjYWxscyBDe2V4cGFuZHRhYnMoKX0gb24gdGhlIGlucHV0IHN0cmluZywNCiAgICAgICAgaW4gb3JkZXIgdG8gcmVwb3J0IHByb3BlciBjb2x1bW4gbnVtYmVycyBpbiBwYXJzZSBhY3Rpb25zLg0KICAgICAgICBJZiB0aGUgaW5wdXQgc3RyaW5nIGNvbnRhaW5zIHRhYnMgYW5kDQogICAgICAgIHRoZSBncmFtbWFyIHVzZXMgcGFyc2UgYWN0aW9ucyB0aGF0IHVzZSB0aGUgQ3tsb2N9IGFyZ3VtZW50IHRvIGluZGV4IGludG8gdGhlDQogICAgICAgIHN0cmluZyBiZWluZyBwYXJzZWQsIHlvdSBjYW4gZW5zdXJlIHlvdSBoYXZlIGEgY29uc2lzdGVudCB2aWV3IG9mIHRoZSBpbnB1dA0KICAgICAgICBzdHJpbmcgYnk6DQogICAgICAgICAtIGNhbGxpbmcgQ3twYXJzZVdpdGhUYWJzfSBvbiB5b3VyIGdyYW1tYXIgYmVmb3JlIGNhbGxpbmcgQ3twYXJzZVN0cmluZ30NCiAgICAgICAgICAgKHNlZSBMe0l7cGFyc2VXaXRoVGFic308cGFyc2VXaXRoVGFicz59KQ0KICAgICAgICAgLSBkZWZpbmUgeW91ciBwYXJzZSBhY3Rpb24gdXNpbmcgdGhlIGZ1bGwgQ3socyxsb2MsdG9rcyl9IHNpZ25hdHVyZSwgYW5kDQogICAgICAgICAgIHJlZmVyZW5jZSB0aGUgaW5wdXQgc3RyaW5nIHVzaW5nIHRoZSBwYXJzZSBhY3Rpb24ncyBDe3N9IGFyZ3VtZW50DQogICAgICAgICAtIGV4cGxpY3RseSBleHBhbmQgdGhlIHRhYnMgaW4geW91ciBpbnB1dCBzdHJpbmcgYmVmb3JlIGNhbGxpbmcNCiAgICAgICAgICAgQ3twYXJzZVN0cmluZ30NCiAgICAgICAgDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgV29yZCgnYScpLnBhcnNlU3RyaW5nKCdhYWFhYWJhYWEnKSAgIyAtPiBbJ2FhYWFhJ10NCiAgICAgICAgICAgIFdvcmQoJ2EnKS5wYXJzZVN0cmluZygnYWFhYWFiYWFhJywgcGFyc2VBbGw9VHJ1ZSkgICMgLT4gRXhjZXB0aW9uOiBFeHBlY3RlZCBlbmQgb2YgdGV4dA0KICAgICAgICAiIiINCiAgICAgICAgUGFyc2VyRWxlbWVudC5yZXNldENhY2hlKCkNCiAgICAgICAgaWYgbm90IHNlbGYuc3RyZWFtbGluZWQ6DQogICAgICAgICAgICBzZWxmLnN0cmVhbWxpbmUoKQ0KICAgICAgICAgICAgI34gc2VsZi5zYXZlQXNMaXN0ID0gVHJ1ZQ0KICAgICAgICBmb3IgZSBpbiBzZWxmLmlnbm9yZUV4cHJzOg0KICAgICAgICAgICAgZS5zdHJlYW1saW5lKCkNCiAgICAgICAgaWYgbm90IHNlbGYua2VlcFRhYnM6DQogICAgICAgICAgICBpbnN0cmluZyA9IGluc3RyaW5nLmV4cGFuZHRhYnMoKQ0KICAgICAgICB0cnk6DQogICAgICAgICAgICBsb2MsIHRva2VucyA9IHNlbGYuX3BhcnNlKCBpbnN0cmluZywgMCApDQogICAgICAgICAgICBpZiBwYXJzZUFsbDoNCiAgICAgICAgICAgICAgICBsb2MgPSBzZWxmLnByZVBhcnNlKCBpbnN0cmluZywgbG9jICkNCiAgICAgICAgICAgICAgICBzZSA9IEVtcHR5KCkgKyBTdHJpbmdFbmQoKQ0KICAgICAgICAgICAgICAgIHNlLl9wYXJzZSggaW5zdHJpbmcsIGxvYyApDQogICAgICAgIGV4Y2VwdCBQYXJzZUJhc2VFeGNlcHRpb24gYXMgZXhjOg0KICAgICAgICAgICAgaWYgUGFyc2VyRWxlbWVudC52ZXJib3NlX3N0YWNrdHJhY2U6DQogICAgICAgICAgICAgICAgcmFpc2UNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgIyBjYXRjaCBhbmQgcmUtcmFpc2UgZXhjZXB0aW9uIGZyb20gaGVyZSwgY2xlYXJzIG91dCBweXBhcnNpbmcgaW50ZXJuYWwgc3RhY2sgdHJhY2UNCiAgICAgICAgICAgICAgICByYWlzZSBleGMNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJldHVybiB0b2tlbnMNCg0KICAgIGRlZiBzY2FuU3RyaW5nKCBzZWxmLCBpbnN0cmluZywgbWF4TWF0Y2hlcz1fTUFYX0lOVCwgb3ZlcmxhcD1GYWxzZSApOg0KICAgICAgICAiIiINCiAgICAgICAgU2NhbiB0aGUgaW5wdXQgc3RyaW5nIGZvciBleHByZXNzaW9uIG1hdGNoZXMuICBFYWNoIG1hdGNoIHdpbGwgcmV0dXJuIHRoZQ0KICAgICAgICBtYXRjaGluZyB0b2tlbnMsIHN0YXJ0IGxvY2F0aW9uLCBhbmQgZW5kIGxvY2F0aW9uLiAgTWF5IGJlIGNhbGxlZCB3aXRoIG9wdGlvbmFsDQogICAgICAgIEN7bWF4TWF0Y2hlc30gYXJndW1lbnQsIHRvIGNsaXAgc2Nhbm5pbmcgYWZ0ZXIgJ24nIG1hdGNoZXMgYXJlIGZvdW5kLiAgSWYNCiAgICAgICAgQ3tvdmVybGFwfSBpcyBzcGVjaWZpZWQsIHRoZW4gb3ZlcmxhcHBpbmcgbWF0Y2hlcyB3aWxsIGJlIHJlcG9ydGVkLg0KDQogICAgICAgIE5vdGUgdGhhdCB0aGUgc3RhcnQgYW5kIGVuZCBsb2NhdGlvbnMgYXJlIHJlcG9ydGVkIHJlbGF0aXZlIHRvIHRoZSBzdHJpbmcNCiAgICAgICAgYmVpbmcgcGFyc2VkLiAgU2VlIEx7SXtwYXJzZVN0cmluZ308cGFyc2VTdHJpbmc+fSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBwYXJzaW5nDQogICAgICAgIHN0cmluZ3Mgd2l0aCBlbWJlZGRlZCB0YWJzLg0KDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgc291cmNlID0gInNsZGpmMTIzbHNkamprZjM0NXNsZGtqZjg3OWxranNmZDk4NyINCiAgICAgICAgICAgIHByaW50KHNvdXJjZSkNCiAgICAgICAgICAgIGZvciB0b2tlbnMsc3RhcnQsZW5kIGluIFdvcmQoYWxwaGFzKS5zY2FuU3RyaW5nKHNvdXJjZSk6DQogICAgICAgICAgICAgICAgcHJpbnQoJyAnKnN0YXJ0ICsgJ14nKihlbmQtc3RhcnQpKQ0KICAgICAgICAgICAgICAgIHByaW50KCcgJypzdGFydCArIHRva2Vuc1swXSkNCiAgICAgICAgDQogICAgICAgIHByaW50czo6DQogICAgICAgIA0KICAgICAgICAgICAgc2xkamYxMjNsc2RqamtmMzQ1c2xka2pmODc5bGtqc2ZkOTg3DQogICAgICAgICAgICBeXl5eXg0KICAgICAgICAgICAgc2xkamYNCiAgICAgICAgICAgICAgICAgICAgXl5eXl5eXg0KICAgICAgICAgICAgICAgICAgICBsc2RqamtmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsZGtqZg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsa2pzZmQNCiAgICAgICAgIiIiDQogICAgICAgIGlmIG5vdCBzZWxmLnN0cmVhbWxpbmVkOg0KICAgICAgICAgICAgc2VsZi5zdHJlYW1saW5lKCkNCiAgICAgICAgZm9yIGUgaW4gc2VsZi5pZ25vcmVFeHByczoNCiAgICAgICAgICAgIGUuc3RyZWFtbGluZSgpDQoNCiAgICAgICAgaWYgbm90IHNlbGYua2VlcFRhYnM6DQogICAgICAgICAgICBpbnN0cmluZyA9IF91c3RyKGluc3RyaW5nKS5leHBhbmR0YWJzKCkNCiAgICAgICAgaW5zdHJsZW4gPSBsZW4oaW5zdHJpbmcpDQogICAgICAgIGxvYyA9IDANCiAgICAgICAgcHJlcGFyc2VGbiA9IHNlbGYucHJlUGFyc2UNCiAgICAgICAgcGFyc2VGbiA9IHNlbGYuX3BhcnNlDQogICAgICAgIFBhcnNlckVsZW1lbnQucmVzZXRDYWNoZSgpDQogICAgICAgIG1hdGNoZXMgPSAwDQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHdoaWxlIGxvYyA8PSBpbnN0cmxlbiBhbmQgbWF0Y2hlcyA8IG1heE1hdGNoZXM6DQogICAgICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgICAgICBwcmVsb2MgPSBwcmVwYXJzZUZuKCBpbnN0cmluZywgbG9jICkNCiAgICAgICAgICAgICAgICAgICAgbmV4dExvYyx0b2tlbnMgPSBwYXJzZUZuKCBpbnN0cmluZywgcHJlbG9jLCBjYWxsUHJlUGFyc2U9RmFsc2UgKQ0KICAgICAgICAgICAgICAgIGV4Y2VwdCBQYXJzZUV4Y2VwdGlvbjoNCiAgICAgICAgICAgICAgICAgICAgbG9jID0gcHJlbG9jKzENCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICBpZiBuZXh0TG9jID4gbG9jOg0KICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcyArPSAxDQogICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCB0b2tlbnMsIHByZWxvYywgbmV4dExvYw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgb3ZlcmxhcDoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0bG9jID0gcHJlcGFyc2VGbiggaW5zdHJpbmcsIGxvYyApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbmV4dGxvYyA+IGxvYzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jID0gbmV4dExvYw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYyArPSAxDQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYyA9IG5leHRMb2MNCiAgICAgICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgICAgIGxvYyA9IHByZWxvYysxDQogICAgICAgIGV4Y2VwdCBQYXJzZUJhc2VFeGNlcHRpb24gYXMgZXhjOg0KICAgICAgICAgICAgaWYgUGFyc2VyRWxlbWVudC52ZXJib3NlX3N0YWNrdHJhY2U6DQogICAgICAgICAgICAgICAgcmFpc2UNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgIyBjYXRjaCBhbmQgcmUtcmFpc2UgZXhjZXB0aW9uIGZyb20gaGVyZSwgY2xlYXJzIG91dCBweXBhcnNpbmcgaW50ZXJuYWwgc3RhY2sgdHJhY2UNCiAgICAgICAgICAgICAgICByYWlzZSBleGMNCg0KICAgIGRlZiB0cmFuc2Zvcm1TdHJpbmcoIHNlbGYsIGluc3RyaW5nICk6DQogICAgICAgICIiIg0KICAgICAgICBFeHRlbnNpb24gdG8gQ3tMe3NjYW5TdHJpbmd9fSwgdG8gbW9kaWZ5IG1hdGNoaW5nIHRleHQgd2l0aCBtb2RpZmllZCB0b2tlbnMgdGhhdCBtYXkNCiAgICAgICAgYmUgcmV0dXJuZWQgZnJvbSBhIHBhcnNlIGFjdGlvbi4gIFRvIHVzZSBDe3RyYW5zZm9ybVN0cmluZ30sIGRlZmluZSBhIGdyYW1tYXIgYW5kDQogICAgICAgIGF0dGFjaCBhIHBhcnNlIGFjdGlvbiB0byBpdCB0aGF0IG1vZGlmaWVzIHRoZSByZXR1cm5lZCB0b2tlbiBsaXN0Lg0KICAgICAgICBJbnZva2luZyBDe3RyYW5zZm9ybVN0cmluZygpfSBvbiBhIHRhcmdldCBzdHJpbmcgd2lsbCB0aGVuIHNjYW4gZm9yIG1hdGNoZXMsDQogICAgICAgIGFuZCByZXBsYWNlIHRoZSBtYXRjaGVkIHRleHQgcGF0dGVybnMgYWNjb3JkaW5nIHRvIHRoZSBsb2dpYyBpbiB0aGUgcGFyc2UNCiAgICAgICAgYWN0aW9uLiAgQ3t0cmFuc2Zvcm1TdHJpbmcoKX0gcmV0dXJucyB0aGUgcmVzdWx0aW5nIHRyYW5zZm9ybWVkIHN0cmluZy4NCiAgICAgICAgDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgd2QgPSBXb3JkKGFscGhhcykNCiAgICAgICAgICAgIHdkLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0b2tzOiB0b2tzWzBdLnRpdGxlKCkpDQogICAgICAgICAgICANCiAgICAgICAgICAgIHByaW50KHdkLnRyYW5zZm9ybVN0cmluZygibm93IGlzIHRoZSB3aW50ZXIgb2Ygb3VyIGRpc2NvbnRlbnQgbWFkZSBnbG9yaW91cyBzdW1tZXIgYnkgdGhpcyBzdW4gb2YgeW9yay4iKSkNCiAgICAgICAgUHJpbnRzOjoNCiAgICAgICAgICAgIE5vdyBJcyBUaGUgV2ludGVyIE9mIE91ciBEaXNjb250ZW50IE1hZGUgR2xvcmlvdXMgU3VtbWVyIEJ5IFRoaXMgU3VuIE9mIFlvcmsuDQogICAgICAgICIiIg0KICAgICAgICBvdXQgPSBbXQ0KICAgICAgICBsYXN0RSA9IDANCiAgICAgICAgIyBmb3JjZSBwcmVzZXJ2YXRpb24gb2YgPFRBQj5zLCB0byBtaW5pbWl6ZSB1bndhbnRlZCB0cmFuc2Zvcm1hdGlvbiBvZiBzdHJpbmcsIGFuZCB0bw0KICAgICAgICAjIGtlZXAgc3RyaW5nIGxvY3Mgc3RyYWlnaHQgYmV0d2VlbiB0cmFuc2Zvcm1TdHJpbmcgYW5kIHNjYW5TdHJpbmcNCiAgICAgICAgc2VsZi5rZWVwVGFicyA9IFRydWUNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgZm9yIHQscyxlIGluIHNlbGYuc2NhblN0cmluZyggaW5zdHJpbmcgKToNCiAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCBpbnN0cmluZ1tsYXN0RTpzXSApDQogICAgICAgICAgICAgICAgaWYgdDoNCiAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh0LFBhcnNlUmVzdWx0cyk6DQogICAgICAgICAgICAgICAgICAgICAgICBvdXQgKz0gdC5hc0xpc3QoKQ0KICAgICAgICAgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UodCxsaXN0KToNCiAgICAgICAgICAgICAgICAgICAgICAgIG91dCArPSB0DQogICAgICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKHQpDQogICAgICAgICAgICAgICAgbGFzdEUgPSBlDQogICAgICAgICAgICBvdXQuYXBwZW5kKGluc3RyaW5nW2xhc3RFOl0pDQogICAgICAgICAgICBvdXQgPSBbbyBmb3IgbyBpbiBvdXQgaWYgb10NCiAgICAgICAgICAgIHJldHVybiAiIi5qb2luKG1hcChfdXN0cixfZmxhdHRlbihvdXQpKSkNCiAgICAgICAgZXhjZXB0IFBhcnNlQmFzZUV4Y2VwdGlvbiBhcyBleGM6DQogICAgICAgICAgICBpZiBQYXJzZXJFbGVtZW50LnZlcmJvc2Vfc3RhY2t0cmFjZToNCiAgICAgICAgICAgICAgICByYWlzZQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAjIGNhdGNoIGFuZCByZS1yYWlzZSBleGNlcHRpb24gZnJvbSBoZXJlLCBjbGVhcnMgb3V0IHB5cGFyc2luZyBpbnRlcm5hbCBzdGFjayB0cmFjZQ0KICAgICAgICAgICAgICAgIHJhaXNlIGV4Yw0KDQogICAgZGVmIHNlYXJjaFN0cmluZyggc2VsZiwgaW5zdHJpbmcsIG1heE1hdGNoZXM9X01BWF9JTlQgKToNCiAgICAgICAgIiIiDQogICAgICAgIEFub3RoZXIgZXh0ZW5zaW9uIHRvIEN7THtzY2FuU3RyaW5nfX0sIHNpbXBsaWZ5aW5nIHRoZSBhY2Nlc3MgdG8gdGhlIHRva2VucyBmb3VuZA0KICAgICAgICB0byBtYXRjaCB0aGUgZ2l2ZW4gcGFyc2UgZXhwcmVzc2lvbi4gIE1heSBiZSBjYWxsZWQgd2l0aCBvcHRpb25hbA0KICAgICAgICBDe21heE1hdGNoZXN9IGFyZ3VtZW50LCB0byBjbGlwIHNlYXJjaGluZyBhZnRlciAnbicgbWF0Y2hlcyBhcmUgZm91bmQuDQogICAgICAgIA0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgICMgYSBjYXBpdGFsaXplZCB3b3JkIHN0YXJ0cyB3aXRoIGFuIHVwcGVyY2FzZSBsZXR0ZXIsIGZvbGxvd2VkIGJ5IHplcm8gb3IgbW9yZSBsb3dlcmNhc2UgbGV0dGVycw0KICAgICAgICAgICAgY2FwX3dvcmQgPSBXb3JkKGFscGhhcy51cHBlcigpLCBhbHBoYXMubG93ZXIoKSkNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgcHJpbnQoY2FwX3dvcmQuc2VhcmNoU3RyaW5nKCJNb3JlIHRoYW4gSXJvbiwgbW9yZSB0aGFuIExlYWQsIG1vcmUgdGhhbiBHb2xkIEkgbmVlZCBFbGVjdHJpY2l0eSIpKQ0KDQogICAgICAgICAgICAjIHRoZSBzdW0oKSBidWlsdGluIGNhbiBiZSB1c2VkIHRvIG1lcmdlIHJlc3VsdHMgaW50byBhIHNpbmdsZSBQYXJzZVJlc3VsdHMgb2JqZWN0DQogICAgICAgICAgICBwcmludChzdW0oY2FwX3dvcmQuc2VhcmNoU3RyaW5nKCJNb3JlIHRoYW4gSXJvbiwgbW9yZSB0aGFuIExlYWQsIG1vcmUgdGhhbiBHb2xkIEkgbmVlZCBFbGVjdHJpY2l0eSIpKSkNCiAgICAgICAgcHJpbnRzOjoNCiAgICAgICAgICAgIFtbJ01vcmUnXSwgWydJcm9uJ10sIFsnTGVhZCddLCBbJ0dvbGQnXSwgWydJJ10sIFsnRWxlY3RyaWNpdHknXV0NCiAgICAgICAgICAgIFsnTW9yZScsICdJcm9uJywgJ0xlYWQnLCAnR29sZCcsICdJJywgJ0VsZWN0cmljaXR5J10NCiAgICAgICAgIiIiDQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHJldHVybiBQYXJzZVJlc3VsdHMoWyB0IGZvciB0LHMsZSBpbiBzZWxmLnNjYW5TdHJpbmcoIGluc3RyaW5nLCBtYXhNYXRjaGVzICkgXSkNCiAgICAgICAgZXhjZXB0IFBhcnNlQmFzZUV4Y2VwdGlvbiBhcyBleGM6DQogICAgICAgICAgICBpZiBQYXJzZXJFbGVtZW50LnZlcmJvc2Vfc3RhY2t0cmFjZToNCiAgICAgICAgICAgICAgICByYWlzZQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAjIGNhdGNoIGFuZCByZS1yYWlzZSBleGNlcHRpb24gZnJvbSBoZXJlLCBjbGVhcnMgb3V0IHB5cGFyc2luZyBpbnRlcm5hbCBzdGFjayB0cmFjZQ0KICAgICAgICAgICAgICAgIHJhaXNlIGV4Yw0KDQogICAgZGVmIHNwbGl0KHNlbGYsIGluc3RyaW5nLCBtYXhzcGxpdD1fTUFYX0lOVCwgaW5jbHVkZVNlcGFyYXRvcnM9RmFsc2UpOg0KICAgICAgICAiIiINCiAgICAgICAgR2VuZXJhdG9yIG1ldGhvZCB0byBzcGxpdCBhIHN0cmluZyB1c2luZyB0aGUgZ2l2ZW4gZXhwcmVzc2lvbiBhcyBhIHNlcGFyYXRvci4NCiAgICAgICAgTWF5IGJlIGNhbGxlZCB3aXRoIG9wdGlvbmFsIEN7bWF4c3BsaXR9IGFyZ3VtZW50LCB0byBsaW1pdCB0aGUgbnVtYmVyIG9mIHNwbGl0czsNCiAgICAgICAgYW5kIHRoZSBvcHRpb25hbCBDe2luY2x1ZGVTZXBhcmF0b3JzfSBhcmd1bWVudCAoZGVmYXVsdD1De0ZhbHNlfSksIGlmIHRoZSBzZXBhcmF0aW5nDQogICAgICAgIG1hdGNoaW5nIHRleHQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBzcGxpdCByZXN1bHRzLg0KICAgICAgICANCiAgICAgICAgRXhhbXBsZTo6ICAgICAgICANCiAgICAgICAgICAgIHB1bmMgPSBvbmVPZihsaXN0KCIuLDs6Ly0hPyIpKQ0KICAgICAgICAgICAgcHJpbnQobGlzdChwdW5jLnNwbGl0KCJUaGlzLCB0aGlzPywgdGhpcyBzZW50ZW5jZSwgaXMgYmFkbHkgcHVuY3R1YXRlZCEiKSkpDQogICAgICAgIHByaW50czo6DQogICAgICAgICAgICBbJ1RoaXMnLCAnIHRoaXMnLCAnJywgJyB0aGlzIHNlbnRlbmNlJywgJyBpcyBiYWRseSBwdW5jdHVhdGVkJywgJyddDQogICAgICAgICIiIg0KICAgICAgICBzcGxpdHMgPSAwDQogICAgICAgIGxhc3QgPSAwDQogICAgICAgIGZvciB0LHMsZSBpbiBzZWxmLnNjYW5TdHJpbmcoaW5zdHJpbmcsIG1heE1hdGNoZXM9bWF4c3BsaXQpOg0KICAgICAgICAgICAgeWllbGQgaW5zdHJpbmdbbGFzdDpzXQ0KICAgICAgICAgICAgaWYgaW5jbHVkZVNlcGFyYXRvcnM6DQogICAgICAgICAgICAgICAgeWllbGQgdFswXQ0KICAgICAgICAgICAgbGFzdCA9IGUNCiAgICAgICAgeWllbGQgaW5zdHJpbmdbbGFzdDpdDQoNCiAgICBkZWYgX19hZGRfXyhzZWxmLCBvdGhlciApOg0KICAgICAgICAiIiINCiAgICAgICAgSW1wbGVtZW50YXRpb24gb2YgKyBvcGVyYXRvciAtIHJldHVybnMgQ3tMe0FuZH19LiBBZGRpbmcgc3RyaW5ncyB0byBhIFBhcnNlckVsZW1lbnQNCiAgICAgICAgY29udmVydHMgdGhlbSB0byBMe0xpdGVyYWx9cyBieSBkZWZhdWx0Lg0KICAgICAgICANCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBncmVldCA9IFdvcmQoYWxwaGFzKSArICIsIiArIFdvcmQoYWxwaGFzKSArICIhIg0KICAgICAgICAgICAgaGVsbG8gPSAiSGVsbG8sIFdvcmxkISINCiAgICAgICAgICAgIHByaW50IChoZWxsbywgIi0+IiwgZ3JlZXQucGFyc2VTdHJpbmcoaGVsbG8pKQ0KICAgICAgICBQcmludHM6Og0KICAgICAgICAgICAgSGVsbG8sIFdvcmxkISAtPiBbJ0hlbGxvJywgJywnLCAnV29ybGQnLCAnISddDQogICAgICAgICIiIg0KICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOg0KICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIG90aGVyICkNCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoIG90aGVyLCBQYXJzZXJFbGVtZW50ICk6DQogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJDYW5ub3QgY29tYmluZSBlbGVtZW50IG9mIHR5cGUgJXMgd2l0aCBQYXJzZXJFbGVtZW50IiAlIHR5cGUob3RoZXIpLA0KICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpDQogICAgICAgICAgICByZXR1cm4gTm9uZQ0KICAgICAgICByZXR1cm4gQW5kKCBbIHNlbGYsIG90aGVyIF0gKQ0KDQogICAgZGVmIF9fcmFkZF9fKHNlbGYsIG90aGVyICk6DQogICAgICAgICIiIg0KICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiArIG9wZXJhdG9yIHdoZW4gbGVmdCBvcGVyYW5kIGlzIG5vdCBhIEN7THtQYXJzZXJFbGVtZW50fX0NCiAgICAgICAgIiIiDQogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6DQogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQ0KICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSggb3RoZXIsIFBhcnNlckVsZW1lbnQgKToNCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkNhbm5vdCBjb21iaW5lIGVsZW1lbnQgb2YgdHlwZSAlcyB3aXRoIFBhcnNlckVsZW1lbnQiICUgdHlwZShvdGhlciksDQogICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikNCiAgICAgICAgICAgIHJldHVybiBOb25lDQogICAgICAgIHJldHVybiBvdGhlciArIHNlbGYNCg0KICAgIGRlZiBfX3N1Yl9fKHNlbGYsIG90aGVyKToNCiAgICAgICAgIiIiDQogICAgICAgIEltcGxlbWVudGF0aW9uIG9mIC0gb3BlcmF0b3IsIHJldHVybnMgQ3tMe0FuZH19IHdpdGggZXJyb3Igc3RvcA0KICAgICAgICAiIiINCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToNCiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBvdGhlciApDQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKCBvdGhlciwgUGFyc2VyRWxlbWVudCApOg0KICAgICAgICAgICAgd2FybmluZ3Mud2FybigiQ2Fubm90IGNvbWJpbmUgZWxlbWVudCBvZiB0eXBlICVzIHdpdGggUGFyc2VyRWxlbWVudCIgJSB0eXBlKG90aGVyKSwNCiAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQ0KICAgICAgICAgICAgcmV0dXJuIE5vbmUNCiAgICAgICAgcmV0dXJuIHNlbGYgKyBBbmQuX0Vycm9yU3RvcCgpICsgb3RoZXINCg0KICAgIGRlZiBfX3JzdWJfXyhzZWxmLCBvdGhlciApOg0KICAgICAgICAiIiINCiAgICAgICAgSW1wbGVtZW50YXRpb24gb2YgLSBvcGVyYXRvciB3aGVuIGxlZnQgb3BlcmFuZCBpcyBub3QgYSBDe0x7UGFyc2VyRWxlbWVudH19DQogICAgICAgICIiIg0KICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOg0KICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIG90aGVyICkNCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoIG90aGVyLCBQYXJzZXJFbGVtZW50ICk6DQogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJDYW5ub3QgY29tYmluZSBlbGVtZW50IG9mIHR5cGUgJXMgd2l0aCBQYXJzZXJFbGVtZW50IiAlIHR5cGUob3RoZXIpLA0KICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpDQogICAgICAgICAgICByZXR1cm4gTm9uZQ0KICAgICAgICByZXR1cm4gb3RoZXIgLSBzZWxmDQoNCiAgICBkZWYgX19tdWxfXyhzZWxmLG90aGVyKToNCiAgICAgICAgIiIiDQogICAgICAgIEltcGxlbWVudGF0aW9uIG9mICogb3BlcmF0b3IsIGFsbG93cyB1c2Ugb2YgQ3tleHByICogM30gaW4gcGxhY2Ugb2YNCiAgICAgICAgQ3tleHByICsgZXhwciArIGV4cHJ9LiAgRXhwcmVzc2lvbnMgbWF5IGFsc28gbWUgbXVsdGlwbGllZCBieSBhIDItaW50ZWdlcg0KICAgICAgICB0dXBsZSwgc2ltaWxhciB0byBDe3ttaW4sbWF4fX0gbXVsdGlwbGllcnMgaW4gcmVndWxhciBleHByZXNzaW9ucy4gIFR1cGxlcw0KICAgICAgICBtYXkgYWxzbyBpbmNsdWRlIEN7Tm9uZX0gYXMgaW46DQogICAgICAgICAtIEN7ZXhwcioobixOb25lKX0gb3IgQ3tleHByKihuLCl9IGlzIGVxdWl2YWxlbnQNCiAgICAgICAgICAgICAgdG8gQ3tleHByKm4gKyBMe1plcm9Pck1vcmV9KGV4cHIpfQ0KICAgICAgICAgICAgICAocmVhZCBhcyAiYXQgbGVhc3QgbiBpbnN0YW5jZXMgb2YgQ3tleHByfSIpDQogICAgICAgICAtIEN7ZXhwciooTm9uZSxuKX0gaXMgZXF1aXZhbGVudCB0byBDe2V4cHIqKDAsbil9DQogICAgICAgICAgICAgIChyZWFkIGFzICIwIHRvIG4gaW5zdGFuY2VzIG9mIEN7ZXhwcn0iKQ0KICAgICAgICAgLSBDe2V4cHIqKE5vbmUsTm9uZSl9IGlzIGVxdWl2YWxlbnQgdG8gQ3tMe1plcm9Pck1vcmV9KGV4cHIpfQ0KICAgICAgICAgLSBDe2V4cHIqKDEsTm9uZSl9IGlzIGVxdWl2YWxlbnQgdG8gQ3tMe09uZU9yTW9yZX0oZXhwcil9DQoNCiAgICAgICAgTm90ZSB0aGF0IEN7ZXhwciooTm9uZSxuKX0gZG9lcyBub3QgcmFpc2UgYW4gZXhjZXB0aW9uIGlmDQogICAgICAgIG1vcmUgdGhhbiBuIGV4cHJzIGV4aXN0IGluIHRoZSBpbnB1dCBzdHJlYW07IHRoYXQgaXMsDQogICAgICAgIEN7ZXhwciooTm9uZSxuKX0gZG9lcyBub3QgZW5mb3JjZSBhIG1heGltdW0gbnVtYmVyIG9mIGV4cHINCiAgICAgICAgb2NjdXJyZW5jZXMuICBJZiB0aGlzIGJlaGF2aW9yIGlzIGRlc2lyZWQsIHRoZW4gd3JpdGUNCiAgICAgICAgQ3tleHByKihOb25lLG4pICsgfmV4cHJ9DQogICAgICAgICIiIg0KICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLGludCk6DQogICAgICAgICAgICBtaW5FbGVtZW50cywgb3B0RWxlbWVudHMgPSBvdGhlciwwDQogICAgICAgIGVsaWYgaXNpbnN0YW5jZShvdGhlcix0dXBsZSk6DQogICAgICAgICAgICBvdGhlciA9IChvdGhlciArIChOb25lLCBOb25lKSlbOjJdDQogICAgICAgICAgICBpZiBvdGhlclswXSBpcyBOb25lOg0KICAgICAgICAgICAgICAgIG90aGVyID0gKDAsIG90aGVyWzFdKQ0KICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlclswXSxpbnQpIGFuZCBvdGhlclsxXSBpcyBOb25lOg0KICAgICAgICAgICAgICAgIGlmIG90aGVyWzBdID09IDA6DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBaZXJvT3JNb3JlKHNlbGYpDQogICAgICAgICAgICAgICAgaWYgb3RoZXJbMF0gPT0gMToNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9uZU9yTW9yZShzZWxmKQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmKm90aGVyWzBdICsgWmVyb09yTW9yZShzZWxmKQ0KICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKG90aGVyWzBdLGludCkgYW5kIGlzaW5zdGFuY2Uob3RoZXJbMV0saW50KToNCiAgICAgICAgICAgICAgICBtaW5FbGVtZW50cywgb3B0RWxlbWVudHMgPSBvdGhlcg0KICAgICAgICAgICAgICAgIG9wdEVsZW1lbnRzIC09IG1pbkVsZW1lbnRzDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiY2Fubm90IG11bHRpcGx5ICdQYXJzZXJFbGVtZW50JyBhbmQgKCclcycsJyVzJykgb2JqZWN0cyIsIHR5cGUob3RoZXJbMF0pLHR5cGUob3RoZXJbMV0pKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJjYW5ub3QgbXVsdGlwbHkgJ1BhcnNlckVsZW1lbnQnIGFuZCAnJXMnIG9iamVjdHMiLCB0eXBlKG90aGVyKSkNCg0KICAgICAgICBpZiBtaW5FbGVtZW50cyA8IDA6DQogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJjYW5ub3QgbXVsdGlwbHkgUGFyc2VyRWxlbWVudCBieSBuZWdhdGl2ZSB2YWx1ZSIpDQogICAgICAgIGlmIG9wdEVsZW1lbnRzIDwgMDoNCiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInNlY29uZCB0dXBsZSB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgb3IgZXF1YWwgdG8gZmlyc3QgdHVwbGUgdmFsdWUiKQ0KICAgICAgICBpZiBtaW5FbGVtZW50cyA9PSBvcHRFbGVtZW50cyA9PSAwOg0KICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiY2Fubm90IG11bHRpcGx5IFBhcnNlckVsZW1lbnQgYnkgMCBvciAoMCwwKSIpDQoNCiAgICAgICAgaWYgKG9wdEVsZW1lbnRzKToNCiAgICAgICAgICAgIGRlZiBtYWtlT3B0aW9uYWxMaXN0KG4pOg0KICAgICAgICAgICAgICAgIGlmIG4+MToNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9wdGlvbmFsKHNlbGYgKyBtYWtlT3B0aW9uYWxMaXN0KG4tMSkpDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9wdGlvbmFsKHNlbGYpDQogICAgICAgICAgICBpZiBtaW5FbGVtZW50czoNCiAgICAgICAgICAgICAgICBpZiBtaW5FbGVtZW50cyA9PSAxOg0KICAgICAgICAgICAgICAgICAgICByZXQgPSBzZWxmICsgbWFrZU9wdGlvbmFsTGlzdChvcHRFbGVtZW50cykNCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICByZXQgPSBBbmQoW3NlbGZdKm1pbkVsZW1lbnRzKSArIG1ha2VPcHRpb25hbExpc3Qob3B0RWxlbWVudHMpDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHJldCA9IG1ha2VPcHRpb25hbExpc3Qob3B0RWxlbWVudHMpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBpZiBtaW5FbGVtZW50cyA9PSAxOg0KICAgICAgICAgICAgICAgIHJldCA9IHNlbGYNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgcmV0ID0gQW5kKFtzZWxmXSptaW5FbGVtZW50cykNCiAgICAgICAgcmV0dXJuIHJldA0KDQogICAgZGVmIF9fcm11bF9fKHNlbGYsIG90aGVyKToNCiAgICAgICAgcmV0dXJuIHNlbGYuX19tdWxfXyhvdGhlcikNCg0KICAgIGRlZiBfX29yX18oc2VsZiwgb3RoZXIgKToNCiAgICAgICAgIiIiDQogICAgICAgIEltcGxlbWVudGF0aW9uIG9mIHwgb3BlcmF0b3IgLSByZXR1cm5zIEN7THtNYXRjaEZpcnN0fX0NCiAgICAgICAgIiIiDQogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6DQogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQ0KICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSggb3RoZXIsIFBhcnNlckVsZW1lbnQgKToNCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkNhbm5vdCBjb21iaW5lIGVsZW1lbnQgb2YgdHlwZSAlcyB3aXRoIFBhcnNlckVsZW1lbnQiICUgdHlwZShvdGhlciksDQogICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikNCiAgICAgICAgICAgIHJldHVybiBOb25lDQogICAgICAgIHJldHVybiBNYXRjaEZpcnN0KCBbIHNlbGYsIG90aGVyIF0gKQ0KDQogICAgZGVmIF9fcm9yX18oc2VsZiwgb3RoZXIgKToNCiAgICAgICAgIiIiDQogICAgICAgIEltcGxlbWVudGF0aW9uIG9mIHwgb3BlcmF0b3Igd2hlbiBsZWZ0IG9wZXJhbmQgaXMgbm90IGEgQ3tMe1BhcnNlckVsZW1lbnR9fQ0KICAgICAgICAiIiINCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToNCiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBvdGhlciApDQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKCBvdGhlciwgUGFyc2VyRWxlbWVudCApOg0KICAgICAgICAgICAgd2FybmluZ3Mud2FybigiQ2Fubm90IGNvbWJpbmUgZWxlbWVudCBvZiB0eXBlICVzIHdpdGggUGFyc2VyRWxlbWVudCIgJSB0eXBlKG90aGVyKSwNCiAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQ0KICAgICAgICAgICAgcmV0dXJuIE5vbmUNCiAgICAgICAgcmV0dXJuIG90aGVyIHwgc2VsZg0KDQogICAgZGVmIF9feG9yX18oc2VsZiwgb3RoZXIgKToNCiAgICAgICAgIiIiDQogICAgICAgIEltcGxlbWVudGF0aW9uIG9mIF4gb3BlcmF0b3IgLSByZXR1cm5zIEN7THtPcn19DQogICAgICAgICIiIg0KICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOg0KICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIG90aGVyICkNCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoIG90aGVyLCBQYXJzZXJFbGVtZW50ICk6DQogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJDYW5ub3QgY29tYmluZSBlbGVtZW50IG9mIHR5cGUgJXMgd2l0aCBQYXJzZXJFbGVtZW50IiAlIHR5cGUob3RoZXIpLA0KICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpDQogICAgICAgICAgICByZXR1cm4gTm9uZQ0KICAgICAgICByZXR1cm4gT3IoIFsgc2VsZiwgb3RoZXIgXSApDQoNCiAgICBkZWYgX19yeG9yX18oc2VsZiwgb3RoZXIgKToNCiAgICAgICAgIiIiDQogICAgICAgIEltcGxlbWVudGF0aW9uIG9mIF4gb3BlcmF0b3Igd2hlbiBsZWZ0IG9wZXJhbmQgaXMgbm90IGEgQ3tMe1BhcnNlckVsZW1lbnR9fQ0KICAgICAgICAiIiINCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToNCiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBvdGhlciApDQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKCBvdGhlciwgUGFyc2VyRWxlbWVudCApOg0KICAgICAgICAgICAgd2FybmluZ3Mud2FybigiQ2Fubm90IGNvbWJpbmUgZWxlbWVudCBvZiB0eXBlICVzIHdpdGggUGFyc2VyRWxlbWVudCIgJSB0eXBlKG90aGVyKSwNCiAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQ0KICAgICAgICAgICAgcmV0dXJuIE5vbmUNCiAgICAgICAgcmV0dXJuIG90aGVyIF4gc2VsZg0KDQogICAgZGVmIF9fYW5kX18oc2VsZiwgb3RoZXIgKToNCiAgICAgICAgIiIiDQogICAgICAgIEltcGxlbWVudGF0aW9uIG9mICYgb3BlcmF0b3IgLSByZXR1cm5zIEN7THtFYWNofX0NCiAgICAgICAgIiIiDQogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6DQogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQ0KICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSggb3RoZXIsIFBhcnNlckVsZW1lbnQgKToNCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkNhbm5vdCBjb21iaW5lIGVsZW1lbnQgb2YgdHlwZSAlcyB3aXRoIFBhcnNlckVsZW1lbnQiICUgdHlwZShvdGhlciksDQogICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikNCiAgICAgICAgICAgIHJldHVybiBOb25lDQogICAgICAgIHJldHVybiBFYWNoKCBbIHNlbGYsIG90aGVyIF0gKQ0KDQogICAgZGVmIF9fcmFuZF9fKHNlbGYsIG90aGVyICk6DQogICAgICAgICIiIg0KICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiAmIG9wZXJhdG9yIHdoZW4gbGVmdCBvcGVyYW5kIGlzIG5vdCBhIEN7THtQYXJzZXJFbGVtZW50fX0NCiAgICAgICAgIiIiDQogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6DQogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQ0KICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSggb3RoZXIsIFBhcnNlckVsZW1lbnQgKToNCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkNhbm5vdCBjb21iaW5lIGVsZW1lbnQgb2YgdHlwZSAlcyB3aXRoIFBhcnNlckVsZW1lbnQiICUgdHlwZShvdGhlciksDQogICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikNCiAgICAgICAgICAgIHJldHVybiBOb25lDQogICAgICAgIHJldHVybiBvdGhlciAmIHNlbGYNCg0KICAgIGRlZiBfX2ludmVydF9fKCBzZWxmICk6DQogICAgICAgICIiIg0KICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiB+IG9wZXJhdG9yIC0gcmV0dXJucyBDe0x7Tm90QW55fX0NCiAgICAgICAgIiIiDQogICAgICAgIHJldHVybiBOb3RBbnkoIHNlbGYgKQ0KDQogICAgZGVmIF9fY2FsbF9fKHNlbGYsIG5hbWU9Tm9uZSk6DQogICAgICAgICIiIg0KICAgICAgICBTaG9ydGN1dCBmb3IgQ3tMe3NldFJlc3VsdHNOYW1lfX0sIHdpdGggQ3tsaXN0QWxsTWF0Y2hlcz1GYWxzZX0uDQogICAgICAgIA0KICAgICAgICBJZiBDe25hbWV9IGlzIGdpdmVuIHdpdGggYSB0cmFpbGluZyBDeycqJ30gY2hhcmFjdGVyLCB0aGVuIEN7bGlzdEFsbE1hdGNoZXN9IHdpbGwgYmUNCiAgICAgICAgcGFzc2VkIGFzIEN7VHJ1ZX0uDQogICAgICAgICAgIA0KICAgICAgICBJZiBDe25hbWV9IGlzIG9taXR0ZWQsIHNhbWUgYXMgY2FsbGluZyBDe0x7Y29weX19Lg0KDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgIyB0aGVzZSBhcmUgZXF1aXZhbGVudA0KICAgICAgICAgICAgdXNlcmRhdGEgPSBXb3JkKGFscGhhcykuc2V0UmVzdWx0c05hbWUoIm5hbWUiKSArIFdvcmQobnVtcysiLSIpLnNldFJlc3VsdHNOYW1lKCJzb2NzZWNubyIpDQogICAgICAgICAgICB1c2VyZGF0YSA9IFdvcmQoYWxwaGFzKSgibmFtZSIpICsgV29yZChudW1zKyItIikoInNvY3NlY25vIikgICAgICAgICAgICAgDQogICAgICAgICIiIg0KICAgICAgICBpZiBuYW1lIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgcmV0dXJuIHNlbGYuc2V0UmVzdWx0c05hbWUobmFtZSkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJldHVybiBzZWxmLmNvcHkoKQ0KDQogICAgZGVmIHN1cHByZXNzKCBzZWxmICk6DQogICAgICAgICIiIg0KICAgICAgICBTdXBwcmVzc2VzIHRoZSBvdXRwdXQgb2YgdGhpcyBDe1BhcnNlckVsZW1lbnR9OyB1c2VmdWwgdG8ga2VlcCBwdW5jdHVhdGlvbiBmcm9tDQogICAgICAgIGNsdXR0ZXJpbmcgdXAgcmV0dXJuZWQgb3V0cHV0Lg0KICAgICAgICAiIiINCiAgICAgICAgcmV0dXJuIFN1cHByZXNzKCBzZWxmICkNCg0KICAgIGRlZiBsZWF2ZVdoaXRlc3BhY2UoIHNlbGYgKToNCiAgICAgICAgIiIiDQogICAgICAgIERpc2FibGVzIHRoZSBza2lwcGluZyBvZiB3aGl0ZXNwYWNlIGJlZm9yZSBtYXRjaGluZyB0aGUgY2hhcmFjdGVycyBpbiB0aGUNCiAgICAgICAgQ3tQYXJzZXJFbGVtZW50fSdzIGRlZmluZWQgcGF0dGVybi4gIFRoaXMgaXMgbm9ybWFsbHkgb25seSB1c2VkIGludGVybmFsbHkgYnkNCiAgICAgICAgdGhlIHB5cGFyc2luZyBtb2R1bGUsIGJ1dCBtYXkgYmUgbmVlZGVkIGluIHNvbWUgd2hpdGVzcGFjZS1zZW5zaXRpdmUgZ3JhbW1hcnMuDQogICAgICAgICIiIg0KICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gRmFsc2UNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBzZXRXaGl0ZXNwYWNlQ2hhcnMoIHNlbGYsIGNoYXJzICk6DQogICAgICAgICIiIg0KICAgICAgICBPdmVycmlkZXMgdGhlIGRlZmF1bHQgd2hpdGVzcGFjZSBjaGFycw0KICAgICAgICAiIiINCiAgICAgICAgc2VsZi5za2lwV2hpdGVzcGFjZSA9IFRydWUNCiAgICAgICAgc2VsZi53aGl0ZUNoYXJzID0gY2hhcnMNCiAgICAgICAgc2VsZi5jb3B5RGVmYXVsdFdoaXRlQ2hhcnMgPSBGYWxzZQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIHBhcnNlV2l0aFRhYnMoIHNlbGYgKToNCiAgICAgICAgIiIiDQogICAgICAgIE92ZXJyaWRlcyBkZWZhdWx0IGJlaGF2aW9yIHRvIGV4cGFuZCBDezxUQUI+fXMgdG8gc3BhY2VzIGJlZm9yZSBwYXJzaW5nIHRoZSBpbnB1dCBzdHJpbmcuDQogICAgICAgIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBDe3BhcnNlU3RyaW5nfSB3aGVuIHRoZSBpbnB1dCBncmFtbWFyIGNvbnRhaW5zIGVsZW1lbnRzIHRoYXQNCiAgICAgICAgbWF0Y2ggQ3s8VEFCPn0gY2hhcmFjdGVycy4NCiAgICAgICAgIiIiDQogICAgICAgIHNlbGYua2VlcFRhYnMgPSBUcnVlDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgaWdub3JlKCBzZWxmLCBvdGhlciApOg0KICAgICAgICAiIiINCiAgICAgICAgRGVmaW5lIGV4cHJlc3Npb24gdG8gYmUgaWdub3JlZCAoZS5nLiwgY29tbWVudHMpIHdoaWxlIGRvaW5nIHBhdHRlcm4NCiAgICAgICAgbWF0Y2hpbmc7IG1heSBiZSBjYWxsZWQgcmVwZWF0ZWRseSwgdG8gZGVmaW5lIG11bHRpcGxlIGNvbW1lbnQgb3Igb3RoZXINCiAgICAgICAgaWdub3JhYmxlIHBhdHRlcm5zLg0KICAgICAgICANCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBwYXR0ID0gT25lT3JNb3JlKFdvcmQoYWxwaGFzKSkNCiAgICAgICAgICAgIHBhdHQucGFyc2VTdHJpbmcoJ2FibGFqIC8qIGNvbW1lbnQgKi8gbHNramQnKSAjIC0+IFsnYWJsYWonXQ0KICAgICAgICAgICAgDQogICAgICAgICAgICBwYXR0Lmlnbm9yZShjU3R5bGVDb21tZW50KQ0KICAgICAgICAgICAgcGF0dC5wYXJzZVN0cmluZygnYWJsYWogLyogY29tbWVudCAqLyBsc2tqZCcpICMgLT4gWydhYmxhaicsICdsc2tqZCddDQogICAgICAgICIiIg0KICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBiYXNlc3RyaW5nKToNCiAgICAgICAgICAgIG90aGVyID0gU3VwcHJlc3Mob3RoZXIpDQoNCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIFN1cHByZXNzICk6DQogICAgICAgICAgICBpZiBvdGhlciBub3QgaW4gc2VsZi5pZ25vcmVFeHByczoNCiAgICAgICAgICAgICAgICBzZWxmLmlnbm9yZUV4cHJzLmFwcGVuZChvdGhlcikNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHNlbGYuaWdub3JlRXhwcnMuYXBwZW5kKCBTdXBwcmVzcyggb3RoZXIuY29weSgpICkgKQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIHNldERlYnVnQWN0aW9ucyggc2VsZiwgc3RhcnRBY3Rpb24sIHN1Y2Nlc3NBY3Rpb24sIGV4Y2VwdGlvbkFjdGlvbiApOg0KICAgICAgICAiIiINCiAgICAgICAgRW5hYmxlIGRpc3BsYXkgb2YgZGVidWdnaW5nIG1lc3NhZ2VzIHdoaWxlIGRvaW5nIHBhdHRlcm4gbWF0Y2hpbmcuDQogICAgICAgICIiIg0KICAgICAgICBzZWxmLmRlYnVnQWN0aW9ucyA9IChzdGFydEFjdGlvbiBvciBfZGVmYXVsdFN0YXJ0RGVidWdBY3Rpb24sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NBY3Rpb24gb3IgX2RlZmF1bHRTdWNjZXNzRGVidWdBY3Rpb24sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbkFjdGlvbiBvciBfZGVmYXVsdEV4Y2VwdGlvbkRlYnVnQWN0aW9uKQ0KICAgICAgICBzZWxmLmRlYnVnID0gVHJ1ZQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIHNldERlYnVnKCBzZWxmLCBmbGFnPVRydWUgKToNCiAgICAgICAgIiIiDQogICAgICAgIEVuYWJsZSBkaXNwbGF5IG9mIGRlYnVnZ2luZyBtZXNzYWdlcyB3aGlsZSBkb2luZyBwYXR0ZXJuIG1hdGNoaW5nLg0KICAgICAgICBTZXQgQ3tmbGFnfSB0byBUcnVlIHRvIGVuYWJsZSwgRmFsc2UgdG8gZGlzYWJsZS4NCg0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIHdkID0gV29yZChhbHBoYXMpLnNldE5hbWUoImFscGhhd29yZCIpDQogICAgICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKS5zZXROYW1lKCJudW13b3JkIikNCiAgICAgICAgICAgIHRlcm0gPSB3ZCB8IGludGVnZXINCiAgICAgICAgICAgIA0KICAgICAgICAgICAgIyB0dXJuIG9uIGRlYnVnZ2luZyBmb3Igd2QNCiAgICAgICAgICAgIHdkLnNldERlYnVnKCkNCg0KICAgICAgICAgICAgT25lT3JNb3JlKHRlcm0pLnBhcnNlU3RyaW5nKCJhYmMgMTIzIHh5eiA4OTAiKQ0KICAgICAgICANCiAgICAgICAgcHJpbnRzOjoNCiAgICAgICAgICAgIE1hdGNoIGFscGhhd29yZCBhdCBsb2MgMCgxLDEpDQogICAgICAgICAgICBNYXRjaGVkIGFscGhhd29yZCAtPiBbJ2FiYyddDQogICAgICAgICAgICBNYXRjaCBhbHBoYXdvcmQgYXQgbG9jIDMoMSw0KQ0KICAgICAgICAgICAgRXhjZXB0aW9uIHJhaXNlZDpFeHBlY3RlZCBhbHBoYXdvcmQgKGF0IGNoYXIgNCksIChsaW5lOjEsIGNvbDo1KQ0KICAgICAgICAgICAgTWF0Y2ggYWxwaGF3b3JkIGF0IGxvYyA3KDEsOCkNCiAgICAgICAgICAgIE1hdGNoZWQgYWxwaGF3b3JkIC0+IFsneHl6J10NCiAgICAgICAgICAgIE1hdGNoIGFscGhhd29yZCBhdCBsb2MgMTEoMSwxMikNCiAgICAgICAgICAgIEV4Y2VwdGlvbiByYWlzZWQ6RXhwZWN0ZWQgYWxwaGF3b3JkIChhdCBjaGFyIDEyKSwgKGxpbmU6MSwgY29sOjEzKQ0KICAgICAgICAgICAgTWF0Y2ggYWxwaGF3b3JkIGF0IGxvYyAxNSgxLDE2KQ0KICAgICAgICAgICAgRXhjZXB0aW9uIHJhaXNlZDpFeHBlY3RlZCBhbHBoYXdvcmQgKGF0IGNoYXIgMTUpLCAobGluZToxLCBjb2w6MTYpDQoNCiAgICAgICAgVGhlIG91dHB1dCBzaG93biBpcyB0aGF0IHByb2R1Y2VkIGJ5IHRoZSBkZWZhdWx0IGRlYnVnIGFjdGlvbnMgLSBjdXN0b20gZGVidWcgYWN0aW9ucyBjYW4gYmUNCiAgICAgICAgc3BlY2lmaWVkIHVzaW5nIEx7c2V0RGVidWdBY3Rpb25zfS4gUHJpb3IgdG8gYXR0ZW1wdGluZw0KICAgICAgICB0byBtYXRjaCB0aGUgQ3t3ZH0gZXhwcmVzc2lvbiwgdGhlIGRlYnVnZ2luZyBtZXNzYWdlIEN7Ik1hdGNoIDxleHBybmFtZT4gYXQgbG9jIDxuPig8bGluZT4sPGNvbD4pIn0NCiAgICAgICAgaXMgc2hvd24uIFRoZW4gaWYgdGhlIHBhcnNlIHN1Y2NlZWRzLCBhIEN7Ik1hdGNoZWQifSBtZXNzYWdlIGlzIHNob3duLCBvciBhbiBDeyJFeGNlcHRpb24gcmFpc2VkIn0NCiAgICAgICAgbWVzc2FnZSBpcyBzaG93bi4gQWxzbyBub3RlIHRoZSB1c2Ugb2YgTHtzZXROYW1lfSB0byBhc3NpZ24gYSBodW1hbi1yZWFkYWJsZSBuYW1lIHRvIHRoZSBleHByZXNzaW9uLA0KICAgICAgICB3aGljaCBtYWtlcyBkZWJ1Z2dpbmcgYW5kIGV4Y2VwdGlvbiBtZXNzYWdlcyBlYXNpZXIgdG8gdW5kZXJzdGFuZCAtIGZvciBpbnN0YW5jZSwgdGhlIGRlZmF1bHQNCiAgICAgICAgbmFtZSBjcmVhdGVkIGZvciB0aGUgQ3tXb3JkfSBleHByZXNzaW9uIHdpdGhvdXQgY2FsbGluZyBDe3NldE5hbWV9IGlzIEN7Ilc6KEFCQ0QuLi4pIn0uDQogICAgICAgICIiIg0KICAgICAgICBpZiBmbGFnOg0KICAgICAgICAgICAgc2VsZi5zZXREZWJ1Z0FjdGlvbnMoIF9kZWZhdWx0U3RhcnREZWJ1Z0FjdGlvbiwgX2RlZmF1bHRTdWNjZXNzRGVidWdBY3Rpb24sIF9kZWZhdWx0RXhjZXB0aW9uRGVidWdBY3Rpb24gKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgc2VsZi5kZWJ1ZyA9IEZhbHNlDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICByZXR1cm4gc2VsZi5uYW1lDQoNCiAgICBkZWYgX19yZXByX18oIHNlbGYgKToNCiAgICAgICAgcmV0dXJuIF91c3RyKHNlbGYpDQoNCiAgICBkZWYgc3RyZWFtbGluZSggc2VsZiApOg0KICAgICAgICBzZWxmLnN0cmVhbWxpbmVkID0gVHJ1ZQ0KICAgICAgICBzZWxmLnN0clJlcHIgPSBOb25lDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgY2hlY2tSZWN1cnNpb24oIHNlbGYsIHBhcnNlRWxlbWVudExpc3QgKToNCiAgICAgICAgcGFzcw0KDQogICAgZGVmIHZhbGlkYXRlKCBzZWxmLCB2YWxpZGF0ZVRyYWNlPVtdICk6DQogICAgICAgICIiIg0KICAgICAgICBDaGVjayBkZWZpbmVkIGV4cHJlc3Npb25zIGZvciB2YWxpZCBzdHJ1Y3R1cmUsIGNoZWNrIGZvciBpbmZpbml0ZSByZWN1cnNpdmUgZGVmaW5pdGlvbnMuDQogICAgICAgICIiIg0KICAgICAgICBzZWxmLmNoZWNrUmVjdXJzaW9uKCBbXSApDQoNCiAgICBkZWYgcGFyc2VGaWxlKCBzZWxmLCBmaWxlX29yX2ZpbGVuYW1lLCBwYXJzZUFsbD1GYWxzZSApOg0KICAgICAgICAiIiINCiAgICAgICAgRXhlY3V0ZSB0aGUgcGFyc2UgZXhwcmVzc2lvbiBvbiB0aGUgZ2l2ZW4gZmlsZSBvciBmaWxlbmFtZS4NCiAgICAgICAgSWYgYSBmaWxlbmFtZSBpcyBzcGVjaWZpZWQgKGluc3RlYWQgb2YgYSBmaWxlIG9iamVjdCksDQogICAgICAgIHRoZSBlbnRpcmUgZmlsZSBpcyBvcGVuZWQsIHJlYWQsIGFuZCBjbG9zZWQgYmVmb3JlIHBhcnNpbmcuDQogICAgICAgICIiIg0KICAgICAgICB0cnk6DQogICAgICAgICAgICBmaWxlX2NvbnRlbnRzID0gZmlsZV9vcl9maWxlbmFtZS5yZWFkKCkNCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOg0KICAgICAgICAgICAgd2l0aCBvcGVuKGZpbGVfb3JfZmlsZW5hbWUsICJyIikgYXMgZjoNCiAgICAgICAgICAgICAgICBmaWxlX2NvbnRlbnRzID0gZi5yZWFkKCkNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VTdHJpbmcoZmlsZV9jb250ZW50cywgcGFyc2VBbGwpDQogICAgICAgIGV4Y2VwdCBQYXJzZUJhc2VFeGNlcHRpb24gYXMgZXhjOg0KICAgICAgICAgICAgaWYgUGFyc2VyRWxlbWVudC52ZXJib3NlX3N0YWNrdHJhY2U6DQogICAgICAgICAgICAgICAgcmFpc2UNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgIyBjYXRjaCBhbmQgcmUtcmFpc2UgZXhjZXB0aW9uIGZyb20gaGVyZSwgY2xlYXJzIG91dCBweXBhcnNpbmcgaW50ZXJuYWwgc3RhY2sgdHJhY2UNCiAgICAgICAgICAgICAgICByYWlzZSBleGMNCg0KICAgIGRlZiBfX2VxX18oc2VsZixvdGhlcik6DQogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIFBhcnNlckVsZW1lbnQpOg0KICAgICAgICAgICAgcmV0dXJuIHNlbGYgaXMgb3RoZXIgb3IgdmFycyhzZWxmKSA9PSB2YXJzKG90aGVyKQ0KICAgICAgICBlbGlmIGlzaW5zdGFuY2Uob3RoZXIsIGJhc2VzdHJpbmcpOg0KICAgICAgICAgICAgcmV0dXJuIHNlbGYubWF0Y2hlcyhvdGhlcikNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJldHVybiBzdXBlcihQYXJzZXJFbGVtZW50LHNlbGYpPT1vdGhlcg0KDQogICAgZGVmIF9fbmVfXyhzZWxmLG90aGVyKToNCiAgICAgICAgcmV0dXJuIG5vdCAoc2VsZiA9PSBvdGhlcikNCg0KICAgIGRlZiBfX2hhc2hfXyhzZWxmKToNCiAgICAgICAgcmV0dXJuIGhhc2goaWQoc2VsZikpDQoNCiAgICBkZWYgX19yZXFfXyhzZWxmLG90aGVyKToNCiAgICAgICAgcmV0dXJuIHNlbGYgPT0gb3RoZXINCg0KICAgIGRlZiBfX3JuZV9fKHNlbGYsb3RoZXIpOg0KICAgICAgICByZXR1cm4gbm90IChzZWxmID09IG90aGVyKQ0KDQogICAgZGVmIG1hdGNoZXMoc2VsZiwgdGVzdFN0cmluZywgcGFyc2VBbGw9VHJ1ZSk6DQogICAgICAgICIiIg0KICAgICAgICBNZXRob2QgZm9yIHF1aWNrIHRlc3Rpbmcgb2YgYSBwYXJzZXIgYWdhaW5zdCBhIHRlc3Qgc3RyaW5nLiBHb29kIGZvciBzaW1wbGUgDQogICAgICAgIGlubGluZSBtaWNyb3Rlc3RzIG9mIHN1YiBleHByZXNzaW9ucyB3aGlsZSBidWlsZGluZyB1cCBsYXJnZXIgcGFyc2VyLg0KICAgICAgICAgICANCiAgICAgICAgUGFyYW1ldGVyczoNCiAgICAgICAgIC0gdGVzdFN0cmluZyAtIHRvIHRlc3QgYWdhaW5zdCB0aGlzIGV4cHJlc3Npb24gZm9yIGEgbWF0Y2gNCiAgICAgICAgIC0gcGFyc2VBbGwgLSAoZGVmYXVsdD1De1RydWV9KSAtIGZsYWcgdG8gcGFzcyB0byBDe0x7cGFyc2VTdHJpbmd9fSB3aGVuIHJ1bm5pbmcgdGVzdHMNCiAgICAgICAgICAgIA0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIGV4cHIgPSBXb3JkKG51bXMpDQogICAgICAgICAgICBhc3NlcnQgZXhwci5tYXRjaGVzKCIxMDAiKQ0KICAgICAgICAiIiINCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgc2VsZi5wYXJzZVN0cmluZyhfdXN0cih0ZXN0U3RyaW5nKSwgcGFyc2VBbGw9cGFyc2VBbGwpDQogICAgICAgICAgICByZXR1cm4gVHJ1ZQ0KICAgICAgICBleGNlcHQgUGFyc2VCYXNlRXhjZXB0aW9uOg0KICAgICAgICAgICAgcmV0dXJuIEZhbHNlDQogICAgICAgICAgICAgICAgDQogICAgZGVmIHJ1blRlc3RzKHNlbGYsIHRlc3RzLCBwYXJzZUFsbD1UcnVlLCBjb21tZW50PScjJywgZnVsbER1bXA9VHJ1ZSwgcHJpbnRSZXN1bHRzPVRydWUsIGZhaWx1cmVUZXN0cz1GYWxzZSk6DQogICAgICAgICIiIg0KICAgICAgICBFeGVjdXRlIHRoZSBwYXJzZSBleHByZXNzaW9uIG9uIGEgc2VyaWVzIG9mIHRlc3Qgc3RyaW5ncywgc2hvd2luZyBlYWNoDQogICAgICAgIHRlc3QsIHRoZSBwYXJzZWQgcmVzdWx0cyBvciB3aGVyZSB0aGUgcGFyc2UgZmFpbGVkLiBRdWljayBhbmQgZWFzeSB3YXkgdG8NCiAgICAgICAgcnVuIGEgcGFyc2UgZXhwcmVzc2lvbiBhZ2FpbnN0IGEgbGlzdCBvZiBzYW1wbGUgc3RyaW5ncy4NCiAgICAgICAgICAgDQogICAgICAgIFBhcmFtZXRlcnM6DQogICAgICAgICAtIHRlc3RzIC0gYSBsaXN0IG9mIHNlcGFyYXRlIHRlc3Qgc3RyaW5ncywgb3IgYSBtdWx0aWxpbmUgc3RyaW5nIG9mIHRlc3Qgc3RyaW5ncw0KICAgICAgICAgLSBwYXJzZUFsbCAtIChkZWZhdWx0PUN7VHJ1ZX0pIC0gZmxhZyB0byBwYXNzIHRvIEN7THtwYXJzZVN0cmluZ319IHdoZW4gcnVubmluZyB0ZXN0cyAgICAgICAgICAgDQogICAgICAgICAtIGNvbW1lbnQgLSAoZGVmYXVsdD1DeycjJ30pIC0gZXhwcmVzc2lvbiBmb3IgaW5kaWNhdGluZyBlbWJlZGRlZCBjb21tZW50cyBpbiB0aGUgdGVzdCANCiAgICAgICAgICAgICAgc3RyaW5nOyBwYXNzIE5vbmUgdG8gZGlzYWJsZSBjb21tZW50IGZpbHRlcmluZw0KICAgICAgICAgLSBmdWxsRHVtcCAtIChkZWZhdWx0PUN7VHJ1ZX0pIC0gZHVtcCByZXN1bHRzIGFzIGxpc3QgZm9sbG93ZWQgYnkgcmVzdWx0cyBuYW1lcyBpbiBuZXN0ZWQgb3V0bGluZTsNCiAgICAgICAgICAgICAgaWYgRmFsc2UsIG9ubHkgZHVtcCBuZXN0ZWQgbGlzdA0KICAgICAgICAgLSBwcmludFJlc3VsdHMgLSAoZGVmYXVsdD1De1RydWV9KSBwcmludHMgdGVzdCBvdXRwdXQgdG8gc3Rkb3V0DQogICAgICAgICAtIGZhaWx1cmVUZXN0cyAtIChkZWZhdWx0PUN7RmFsc2V9KSBpbmRpY2F0ZXMgaWYgdGhlc2UgdGVzdHMgYXJlIGV4cGVjdGVkIHRvIGZhaWwgcGFyc2luZw0KDQogICAgICAgIFJldHVybnM6IGEgKHN1Y2Nlc3MsIHJlc3VsdHMpIHR1cGxlLCB3aGVyZSBzdWNjZXNzIGluZGljYXRlcyB0aGF0IGFsbCB0ZXN0cyBzdWNjZWVkZWQNCiAgICAgICAgKG9yIGZhaWxlZCBpZiBDe2ZhaWx1cmVUZXN0c30gaXMgVHJ1ZSksIGFuZCB0aGUgcmVzdWx0cyBjb250YWluIGEgbGlzdCBvZiBsaW5lcyBvZiBlYWNoIA0KICAgICAgICB0ZXN0J3Mgb3V0cHV0DQogICAgICAgIA0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIG51bWJlcl9leHByID0gcHlwYXJzaW5nX2NvbW1vbi5udW1iZXIuY29weSgpDQoNCiAgICAgICAgICAgIHJlc3VsdCA9IG51bWJlcl9leHByLnJ1blRlc3RzKCcnJw0KICAgICAgICAgICAgICAgICMgdW5zaWduZWQgaW50ZWdlcg0KICAgICAgICAgICAgICAgIDEwMA0KICAgICAgICAgICAgICAgICMgbmVnYXRpdmUgaW50ZWdlcg0KICAgICAgICAgICAgICAgIC0xMDANCiAgICAgICAgICAgICAgICAjIGZsb2F0IHdpdGggc2NpZW50aWZpYyBub3RhdGlvbg0KICAgICAgICAgICAgICAgIDYuMDJlMjMNCiAgICAgICAgICAgICAgICAjIGludGVnZXIgd2l0aCBzY2llbnRpZmljIG5vdGF0aW9uDQogICAgICAgICAgICAgICAgMWUtMTINCiAgICAgICAgICAgICAgICAnJycpDQogICAgICAgICAgICBwcmludCgiU3VjY2VzcyIgaWYgcmVzdWx0WzBdIGVsc2UgIkZhaWxlZCEiKQ0KDQogICAgICAgICAgICByZXN1bHQgPSBudW1iZXJfZXhwci5ydW5UZXN0cygnJycNCiAgICAgICAgICAgICAgICAjIHN0cmF5IGNoYXJhY3Rlcg0KICAgICAgICAgICAgICAgIDEwMFoNCiAgICAgICAgICAgICAgICAjIG1pc3NpbmcgbGVhZGluZyBkaWdpdCBiZWZvcmUgJy4nDQogICAgICAgICAgICAgICAgLS4xMDANCiAgICAgICAgICAgICAgICAjIHRvbyBtYW55ICcuJw0KICAgICAgICAgICAgICAgIDMuMTQuMTU5DQogICAgICAgICAgICAgICAgJycnLCBmYWlsdXJlVGVzdHM9VHJ1ZSkNCiAgICAgICAgICAgIHByaW50KCJTdWNjZXNzIiBpZiByZXN1bHRbMF0gZWxzZSAiRmFpbGVkISIpDQogICAgICAgIHByaW50czo6DQogICAgICAgICAgICAjIHVuc2lnbmVkIGludGVnZXINCiAgICAgICAgICAgIDEwMA0KICAgICAgICAgICAgWzEwMF0NCg0KICAgICAgICAgICAgIyBuZWdhdGl2ZSBpbnRlZ2VyDQogICAgICAgICAgICAtMTAwDQogICAgICAgICAgICBbLTEwMF0NCg0KICAgICAgICAgICAgIyBmbG9hdCB3aXRoIHNjaWVudGlmaWMgbm90YXRpb24NCiAgICAgICAgICAgIDYuMDJlMjMNCiAgICAgICAgICAgIFs2LjAyZSsyM10NCg0KICAgICAgICAgICAgIyBpbnRlZ2VyIHdpdGggc2NpZW50aWZpYyBub3RhdGlvbg0KICAgICAgICAgICAgMWUtMTINCiAgICAgICAgICAgIFsxZS0xMl0NCg0KICAgICAgICAgICAgU3VjY2Vzcw0KICAgICAgICAgICAgDQogICAgICAgICAgICAjIHN0cmF5IGNoYXJhY3Rlcg0KICAgICAgICAgICAgMTAwWg0KICAgICAgICAgICAgICAgXg0KICAgICAgICAgICAgRkFJTDogRXhwZWN0ZWQgZW5kIG9mIHRleHQgKGF0IGNoYXIgMyksIChsaW5lOjEsIGNvbDo0KQ0KDQogICAgICAgICAgICAjIG1pc3NpbmcgbGVhZGluZyBkaWdpdCBiZWZvcmUgJy4nDQogICAgICAgICAgICAtLjEwMA0KICAgICAgICAgICAgXg0KICAgICAgICAgICAgRkFJTDogRXhwZWN0ZWQge3JlYWwgbnVtYmVyIHdpdGggc2NpZW50aWZpYyBub3RhdGlvbiB8IHJlYWwgbnVtYmVyIHwgc2lnbmVkIGludGVnZXJ9IChhdCBjaGFyIDApLCAobGluZToxLCBjb2w6MSkNCg0KICAgICAgICAgICAgIyB0b28gbWFueSAnLicNCiAgICAgICAgICAgIDMuMTQuMTU5DQogICAgICAgICAgICAgICAgXg0KICAgICAgICAgICAgRkFJTDogRXhwZWN0ZWQgZW5kIG9mIHRleHQgKGF0IGNoYXIgNCksIChsaW5lOjEsIGNvbDo1KQ0KDQogICAgICAgICAgICBTdWNjZXNzDQoNCiAgICAgICAgRWFjaCB0ZXN0IHN0cmluZyBtdXN0IGJlIG9uIGEgc2luZ2xlIGxpbmUuIElmIHlvdSB3YW50IHRvIHRlc3QgYSBzdHJpbmcgdGhhdCBzcGFucyBtdWx0aXBsZQ0KICAgICAgICBsaW5lcywgY3JlYXRlIGEgdGVzdCBsaWtlIHRoaXM6Og0KDQogICAgICAgICAgICBleHByLnJ1blRlc3QociJ0aGlzIGlzIGEgdGVzdFxcbiBvZiBzdHJpbmdzIHRoYXQgc3BhbnMgXFxuIDMgbGluZXMiKQ0KICAgICAgICANCiAgICAgICAgKE5vdGUgdGhhdCB0aGlzIGlzIGEgcmF3IHN0cmluZyBsaXRlcmFsLCB5b3UgbXVzdCBpbmNsdWRlIHRoZSBsZWFkaW5nICdyJy4pDQogICAgICAgICIiIg0KICAgICAgICBpZiBpc2luc3RhbmNlKHRlc3RzLCBiYXNlc3RyaW5nKToNCiAgICAgICAgICAgIHRlc3RzID0gbGlzdChtYXAoc3RyLnN0cmlwLCB0ZXN0cy5yc3RyaXAoKS5zcGxpdGxpbmVzKCkpKQ0KICAgICAgICBpZiBpc2luc3RhbmNlKGNvbW1lbnQsIGJhc2VzdHJpbmcpOg0KICAgICAgICAgICAgY29tbWVudCA9IExpdGVyYWwoY29tbWVudCkNCiAgICAgICAgYWxsUmVzdWx0cyA9IFtdDQogICAgICAgIGNvbW1lbnRzID0gW10NCiAgICAgICAgc3VjY2VzcyA9IFRydWUNCiAgICAgICAgZm9yIHQgaW4gdGVzdHM6DQogICAgICAgICAgICBpZiBjb21tZW50IGlzIG5vdCBOb25lIGFuZCBjb21tZW50Lm1hdGNoZXModCwgRmFsc2UpIG9yIGNvbW1lbnRzIGFuZCBub3QgdDoNCiAgICAgICAgICAgICAgICBjb21tZW50cy5hcHBlbmQodCkNCiAgICAgICAgICAgICAgICBjb250aW51ZQ0KICAgICAgICAgICAgaWYgbm90IHQ6DQogICAgICAgICAgICAgICAgY29udGludWUNCiAgICAgICAgICAgIG91dCA9IFsnXG4nLmpvaW4oY29tbWVudHMpLCB0XQ0KICAgICAgICAgICAgY29tbWVudHMgPSBbXQ0KICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgIHQgPSB0LnJlcGxhY2UocidcbicsJ1xuJykNCiAgICAgICAgICAgICAgICByZXN1bHQgPSBzZWxmLnBhcnNlU3RyaW5nKHQsIHBhcnNlQWxsPXBhcnNlQWxsKQ0KICAgICAgICAgICAgICAgIG91dC5hcHBlbmQocmVzdWx0LmR1bXAoZnVsbD1mdWxsRHVtcCkpDQogICAgICAgICAgICAgICAgc3VjY2VzcyA9IHN1Y2Nlc3MgYW5kIG5vdCBmYWlsdXJlVGVzdHMNCiAgICAgICAgICAgIGV4Y2VwdCBQYXJzZUJhc2VFeGNlcHRpb24gYXMgcGU6DQogICAgICAgICAgICAgICAgZmF0YWwgPSAiKEZBVEFMKSIgaWYgaXNpbnN0YW5jZShwZSwgUGFyc2VGYXRhbEV4Y2VwdGlvbikgZWxzZSAiIg0KICAgICAgICAgICAgICAgIGlmICdcbicgaW4gdDoNCiAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZChsaW5lKHBlLmxvYywgdCkpDQogICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoJyAnKihjb2wocGUubG9jLHQpLTEpICsgJ14nICsgZmF0YWwpDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZCgnICcqcGUubG9jICsgJ14nICsgZmF0YWwpDQogICAgICAgICAgICAgICAgb3V0LmFwcGVuZCgiRkFJTDogIiArIHN0cihwZSkpDQogICAgICAgICAgICAgICAgc3VjY2VzcyA9IHN1Y2Nlc3MgYW5kIGZhaWx1cmVUZXN0cw0KICAgICAgICAgICAgICAgIHJlc3VsdCA9IHBlDQogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4YzoNCiAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCJGQUlMLUVYQ0VQVElPTjogIiArIHN0cihleGMpKQ0KICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBzdWNjZXNzIGFuZCBmYWlsdXJlVGVzdHMNCiAgICAgICAgICAgICAgICByZXN1bHQgPSBleGMNCg0KICAgICAgICAgICAgaWYgcHJpbnRSZXN1bHRzOg0KICAgICAgICAgICAgICAgIGlmIGZ1bGxEdW1wOg0KICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCcnKQ0KICAgICAgICAgICAgICAgIHByaW50KCdcbicuam9pbihvdXQpKQ0KDQogICAgICAgICAgICBhbGxSZXN1bHRzLmFwcGVuZCgodCwgcmVzdWx0KSkNCiAgICAgICAgDQogICAgICAgIHJldHVybiBzdWNjZXNzLCBhbGxSZXN1bHRzDQoNCiAgICAgICAgDQpjbGFzcyBUb2tlbihQYXJzZXJFbGVtZW50KToNCiAgICAiIiINCiAgICBBYnN0cmFjdCBDe1BhcnNlckVsZW1lbnR9IHN1YmNsYXNzLCBmb3IgZGVmaW5pbmcgYXRvbWljIG1hdGNoaW5nIHBhdHRlcm5zLg0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiApOg0KICAgICAgICBzdXBlcihUb2tlbixzZWxmKS5fX2luaXRfXyggc2F2ZWxpc3Q9RmFsc2UgKQ0KDQoNCmNsYXNzIEVtcHR5KFRva2VuKToNCiAgICAiIiINCiAgICBBbiBlbXB0eSB0b2tlbiwgd2lsbCBhbHdheXMgbWF0Y2guDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmICk6DQogICAgICAgIHN1cGVyKEVtcHR5LHNlbGYpLl9faW5pdF9fKCkNCiAgICAgICAgc2VsZi5uYW1lID0gIkVtcHR5Ig0KICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gVHJ1ZQ0KICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBGYWxzZQ0KDQoNCmNsYXNzIE5vTWF0Y2goVG9rZW4pOg0KICAgICIiIg0KICAgIEEgdG9rZW4gdGhhdCB3aWxsIG5ldmVyIG1hdGNoLg0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiApOg0KICAgICAgICBzdXBlcihOb01hdGNoLHNlbGYpLl9faW5pdF9fKCkNCiAgICAgICAgc2VsZi5uYW1lID0gIk5vTWF0Y2giDQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBUcnVlDQogICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IEZhbHNlDQogICAgICAgIHNlbGYuZXJybXNnID0gIlVubWF0Y2hhYmxlIHRva2VuIg0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQoNCg0KY2xhc3MgTGl0ZXJhbChUb2tlbik6DQogICAgIiIiDQogICAgVG9rZW4gdG8gZXhhY3RseSBtYXRjaCBhIHNwZWNpZmllZCBzdHJpbmcuDQogICAgDQogICAgRXhhbXBsZTo6DQogICAgICAgIExpdGVyYWwoJ2JsYWgnKS5wYXJzZVN0cmluZygnYmxhaCcpICAjIC0+IFsnYmxhaCddDQogICAgICAgIExpdGVyYWwoJ2JsYWgnKS5wYXJzZVN0cmluZygnYmxhaGZvb2JsYWgnKSAgIyAtPiBbJ2JsYWgnXQ0KICAgICAgICBMaXRlcmFsKCdibGFoJykucGFyc2VTdHJpbmcoJ2JsYScpICAjIC0+IEV4Y2VwdGlvbjogRXhwZWN0ZWQgImJsYWgiDQogICAgDQogICAgRm9yIGNhc2UtaW5zZW5zaXRpdmUgbWF0Y2hpbmcsIHVzZSBMe0Nhc2VsZXNzTGl0ZXJhbH0uDQogICAgDQogICAgRm9yIGtleXdvcmQgbWF0Y2hpbmcgKGZvcmNlIHdvcmQgYnJlYWsgYmVmb3JlIGFuZCBhZnRlciB0aGUgbWF0Y2hlZCBzdHJpbmcpLA0KICAgIHVzZSBMe0tleXdvcmR9IG9yIEx7Q2FzZWxlc3NLZXl3b3JkfS4NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIG1hdGNoU3RyaW5nICk6DQogICAgICAgIHN1cGVyKExpdGVyYWwsc2VsZikuX19pbml0X18oKQ0KICAgICAgICBzZWxmLm1hdGNoID0gbWF0Y2hTdHJpbmcNCiAgICAgICAgc2VsZi5tYXRjaExlbiA9IGxlbihtYXRjaFN0cmluZykNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgc2VsZi5maXJzdE1hdGNoQ2hhciA9IG1hdGNoU3RyaW5nWzBdDQogICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOg0KICAgICAgICAgICAgd2FybmluZ3Mud2FybigibnVsbCBzdHJpbmcgcGFzc2VkIHRvIExpdGVyYWw7IHVzZSBFbXB0eSgpIGluc3RlYWQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikNCiAgICAgICAgICAgIHNlbGYuX19jbGFzc19fID0gRW1wdHkNCiAgICAgICAgc2VsZi5uYW1lID0gJyIlcyInICUgX3VzdHIoc2VsZi5tYXRjaCkNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgIiArIHNlbGYubmFtZQ0KICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gRmFsc2UNCiAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gRmFsc2UNCg0KICAgICMgUGVyZm9ybWFuY2UgdHVuaW5nOiB0aGlzIHJvdXRpbmUgZ2V0cyBjYWxsZWQgYSAqbG90Kg0KICAgICMgaWYgdGhpcyBpcyBhIHNpbmdsZSBjaGFyYWN0ZXIgbWF0Y2ggc3RyaW5nICBhbmQgdGhlIGZpcnN0IGNoYXJhY3RlciBtYXRjaGVzLA0KICAgICMgc2hvcnQtY2lyY3VpdCBhcyBxdWlja2x5IGFzIHBvc3NpYmxlLCBhbmQgYXZvaWQgY2FsbGluZyBzdGFydHN3aXRoDQogICAgI34gQHByb2ZpbGUNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBpZiAoaW5zdHJpbmdbbG9jXSA9PSBzZWxmLmZpcnN0TWF0Y2hDaGFyIGFuZA0KICAgICAgICAgICAgKHNlbGYubWF0Y2hMZW49PTEgb3IgaW5zdHJpbmcuc3RhcnRzd2l0aChzZWxmLm1hdGNoLGxvYykpICk6DQogICAgICAgICAgICByZXR1cm4gbG9jK3NlbGYubWF0Y2hMZW4sIHNlbGYubWF0Y2gNCiAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQpfTCA9IExpdGVyYWwNClBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyA9IExpdGVyYWwNCg0KY2xhc3MgS2V5d29yZChUb2tlbik6DQogICAgIiIiDQogICAgVG9rZW4gdG8gZXhhY3RseSBtYXRjaCBhIHNwZWNpZmllZCBzdHJpbmcgYXMgYSBrZXl3b3JkLCB0aGF0IGlzLCBpdCBtdXN0IGJlDQogICAgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYSBub24ta2V5d29yZCBjaGFyYWN0ZXIuICBDb21wYXJlIHdpdGggQ3tMe0xpdGVyYWx9fToNCiAgICAgLSBDe0xpdGVyYWwoImlmIil9IHdpbGwgbWF0Y2ggdGhlIGxlYWRpbmcgQ3snaWYnfSBpbiBDeydpZkFuZE9ubHlJZid9Lg0KICAgICAtIEN7S2V5d29yZCgiaWYiKX0gd2lsbCBub3Q7IGl0IHdpbGwgb25seSBtYXRjaCB0aGUgbGVhZGluZyBDeydpZid9IGluIEN7J2lmIHg9MSd9LCBvciBDeydpZih5PT0yKSd9DQogICAgQWNjZXB0cyB0d28gb3B0aW9uYWwgY29uc3RydWN0b3IgYXJndW1lbnRzIGluIGFkZGl0aW9uIHRvIHRoZSBrZXl3b3JkIHN0cmluZzoNCiAgICAgLSBDe2lkZW50Q2hhcnN9IGlzIGEgc3RyaW5nIG9mIGNoYXJhY3RlcnMgdGhhdCB3b3VsZCBiZSB2YWxpZCBpZGVudGlmaWVyIGNoYXJhY3RlcnMsDQogICAgICAgICAgZGVmYXVsdGluZyB0byBhbGwgYWxwaGFudW1lcmljcyArICJfIiBhbmQgIiQiDQogICAgIC0gQ3tjYXNlbGVzc30gYWxsb3dzIGNhc2UtaW5zZW5zaXRpdmUgbWF0Y2hpbmcsIGRlZmF1bHQgaXMgQ3tGYWxzZX0uDQogICAgICAgDQogICAgRXhhbXBsZTo6DQogICAgICAgIEtleXdvcmQoInN0YXJ0IikucGFyc2VTdHJpbmcoInN0YXJ0IikgICMgLT4gWydzdGFydCddDQogICAgICAgIEtleXdvcmQoInN0YXJ0IikucGFyc2VTdHJpbmcoInN0YXJ0aW5nIikgICMgLT4gRXhjZXB0aW9uDQoNCiAgICBGb3IgY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaGluZywgdXNlIEx7Q2FzZWxlc3NLZXl3b3JkfS4NCiAgICAiIiINCiAgICBERUZBVUxUX0tFWVdPUkRfQ0hBUlMgPSBhbHBoYW51bXMrIl8kIg0KDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBtYXRjaFN0cmluZywgaWRlbnRDaGFycz1Ob25lLCBjYXNlbGVzcz1GYWxzZSApOg0KICAgICAgICBzdXBlcihLZXl3b3JkLHNlbGYpLl9faW5pdF9fKCkNCiAgICAgICAgaWYgaWRlbnRDaGFycyBpcyBOb25lOg0KICAgICAgICAgICAgaWRlbnRDaGFycyA9IEtleXdvcmQuREVGQVVMVF9LRVlXT1JEX0NIQVJTDQogICAgICAgIHNlbGYubWF0Y2ggPSBtYXRjaFN0cmluZw0KICAgICAgICBzZWxmLm1hdGNoTGVuID0gbGVuKG1hdGNoU3RyaW5nKQ0KICAgICAgICB0cnk6DQogICAgICAgICAgICBzZWxmLmZpcnN0TWF0Y2hDaGFyID0gbWF0Y2hTdHJpbmdbMF0NCiAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6DQogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJudWxsIHN0cmluZyBwYXNzZWQgdG8gS2V5d29yZDsgdXNlIEVtcHR5KCkgaW5zdGVhZCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQ0KICAgICAgICBzZWxmLm5hbWUgPSAnIiVzIicgJSBzZWxmLm1hdGNoDQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkICIgKyBzZWxmLm5hbWUNCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IEZhbHNlDQogICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IEZhbHNlDQogICAgICAgIHNlbGYuY2FzZWxlc3MgPSBjYXNlbGVzcw0KICAgICAgICBpZiBjYXNlbGVzczoNCiAgICAgICAgICAgIHNlbGYuY2FzZWxlc3NtYXRjaCA9IG1hdGNoU3RyaW5nLnVwcGVyKCkNCiAgICAgICAgICAgIGlkZW50Q2hhcnMgPSBpZGVudENoYXJzLnVwcGVyKCkNCiAgICAgICAgc2VsZi5pZGVudENoYXJzID0gc2V0KGlkZW50Q2hhcnMpDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBpZiBzZWxmLmNhc2VsZXNzOg0KICAgICAgICAgICAgaWYgKCAoaW5zdHJpbmdbIGxvYzpsb2Mrc2VsZi5tYXRjaExlbiBdLnVwcGVyKCkgPT0gc2VsZi5jYXNlbGVzc21hdGNoKSBhbmQNCiAgICAgICAgICAgICAgICAgKGxvYyA+PSBsZW4oaW5zdHJpbmcpLXNlbGYubWF0Y2hMZW4gb3IgaW5zdHJpbmdbbG9jK3NlbGYubWF0Y2hMZW5dLnVwcGVyKCkgbm90IGluIHNlbGYuaWRlbnRDaGFycykgYW5kDQogICAgICAgICAgICAgICAgIChsb2MgPT0gMCBvciBpbnN0cmluZ1tsb2MtMV0udXBwZXIoKSBub3QgaW4gc2VsZi5pZGVudENoYXJzKSApOg0KICAgICAgICAgICAgICAgIHJldHVybiBsb2Mrc2VsZi5tYXRjaExlbiwgc2VsZi5tYXRjaA0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgaWYgKGluc3RyaW5nW2xvY10gPT0gc2VsZi5maXJzdE1hdGNoQ2hhciBhbmQNCiAgICAgICAgICAgICAgICAoc2VsZi5tYXRjaExlbj09MSBvciBpbnN0cmluZy5zdGFydHN3aXRoKHNlbGYubWF0Y2gsbG9jKSkgYW5kDQogICAgICAgICAgICAgICAgKGxvYyA+PSBsZW4oaW5zdHJpbmcpLXNlbGYubWF0Y2hMZW4gb3IgaW5zdHJpbmdbbG9jK3NlbGYubWF0Y2hMZW5dIG5vdCBpbiBzZWxmLmlkZW50Q2hhcnMpIGFuZA0KICAgICAgICAgICAgICAgIChsb2MgPT0gMCBvciBpbnN0cmluZ1tsb2MtMV0gbm90IGluIHNlbGYuaWRlbnRDaGFycykgKToNCiAgICAgICAgICAgICAgICByZXR1cm4gbG9jK3NlbGYubWF0Y2hMZW4sIHNlbGYubWF0Y2gNCiAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQoNCiAgICBkZWYgY29weShzZWxmKToNCiAgICAgICAgYyA9IHN1cGVyKEtleXdvcmQsc2VsZikuY29weSgpDQogICAgICAgIGMuaWRlbnRDaGFycyA9IEtleXdvcmQuREVGQVVMVF9LRVlXT1JEX0NIQVJTDQogICAgICAgIHJldHVybiBjDQoNCiAgICBAc3RhdGljbWV0aG9kDQogICAgZGVmIHNldERlZmF1bHRLZXl3b3JkQ2hhcnMoIGNoYXJzICk6DQogICAgICAgICIiIk92ZXJyaWRlcyB0aGUgZGVmYXVsdCBLZXl3b3JkIGNoYXJzDQogICAgICAgICIiIg0KICAgICAgICBLZXl3b3JkLkRFRkFVTFRfS0VZV09SRF9DSEFSUyA9IGNoYXJzDQoNCmNsYXNzIENhc2VsZXNzTGl0ZXJhbChMaXRlcmFsKToNCiAgICAiIiINCiAgICBUb2tlbiB0byBtYXRjaCBhIHNwZWNpZmllZCBzdHJpbmcsIGlnbm9yaW5nIGNhc2Ugb2YgbGV0dGVycy4NCiAgICBOb3RlOiB0aGUgbWF0Y2hlZCByZXN1bHRzIHdpbGwgYWx3YXlzIGJlIGluIHRoZSBjYXNlIG9mIHRoZSBnaXZlbg0KICAgIG1hdGNoIHN0cmluZywgTk9UIHRoZSBjYXNlIG9mIHRoZSBpbnB1dCB0ZXh0Lg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIE9uZU9yTW9yZShDYXNlbGVzc0xpdGVyYWwoIkNNRCIpKS5wYXJzZVN0cmluZygiY21kIENNRCBDbWQxMCIpICMgLT4gWydDTUQnLCAnQ01EJywgJ0NNRCddDQogICAgICAgIA0KICAgIChDb250cmFzdCB3aXRoIGV4YW1wbGUgZm9yIEx7Q2FzZWxlc3NLZXl3b3JkfS4pDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBtYXRjaFN0cmluZyApOg0KICAgICAgICBzdXBlcihDYXNlbGVzc0xpdGVyYWwsc2VsZikuX19pbml0X18oIG1hdGNoU3RyaW5nLnVwcGVyKCkgKQ0KICAgICAgICAjIFByZXNlcnZlIHRoZSBkZWZpbmluZyBsaXRlcmFsLg0KICAgICAgICBzZWxmLnJldHVyblN0cmluZyA9IG1hdGNoU3RyaW5nDQogICAgICAgIHNlbGYubmFtZSA9ICInJXMnIiAlIHNlbGYucmV0dXJuU3RyaW5nDQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkICIgKyBzZWxmLm5hbWUNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIGlmIGluc3RyaW5nWyBsb2M6bG9jK3NlbGYubWF0Y2hMZW4gXS51cHBlcigpID09IHNlbGYubWF0Y2g6DQogICAgICAgICAgICByZXR1cm4gbG9jK3NlbGYubWF0Y2hMZW4sIHNlbGYucmV0dXJuU3RyaW5nDQogICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KDQpjbGFzcyBDYXNlbGVzc0tleXdvcmQoS2V5d29yZCk6DQogICAgIiIiDQogICAgQ2FzZWxlc3MgdmVyc2lvbiBvZiBMe0tleXdvcmR9Lg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIE9uZU9yTW9yZShDYXNlbGVzc0tleXdvcmQoIkNNRCIpKS5wYXJzZVN0cmluZygiY21kIENNRCBDbWQxMCIpICMgLT4gWydDTUQnLCAnQ01EJ10NCiAgICAgICAgDQogICAgKENvbnRyYXN0IHdpdGggZXhhbXBsZSBmb3IgTHtDYXNlbGVzc0xpdGVyYWx9LikNCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIG1hdGNoU3RyaW5nLCBpZGVudENoYXJzPU5vbmUgKToNCiAgICAgICAgc3VwZXIoQ2FzZWxlc3NLZXl3b3JkLHNlbGYpLl9faW5pdF9fKCBtYXRjaFN0cmluZywgaWRlbnRDaGFycywgY2FzZWxlc3M9VHJ1ZSApDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBpZiAoIChpbnN0cmluZ1sgbG9jOmxvYytzZWxmLm1hdGNoTGVuIF0udXBwZXIoKSA9PSBzZWxmLmNhc2VsZXNzbWF0Y2gpIGFuZA0KICAgICAgICAgICAgIChsb2MgPj0gbGVuKGluc3RyaW5nKS1zZWxmLm1hdGNoTGVuIG9yIGluc3RyaW5nW2xvYytzZWxmLm1hdGNoTGVuXS51cHBlcigpIG5vdCBpbiBzZWxmLmlkZW50Q2hhcnMpICk6DQogICAgICAgICAgICByZXR1cm4gbG9jK3NlbGYubWF0Y2hMZW4sIHNlbGYubWF0Y2gNCiAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQoNCmNsYXNzIENsb3NlTWF0Y2goVG9rZW4pOg0KICAgICIiIg0KICAgIEEgdmFyaWF0aW9uIG9uIEx7TGl0ZXJhbH0gd2hpY2ggbWF0Y2hlcyAiY2xvc2UiIG1hdGNoZXMsIHRoYXQgaXMsIA0KICAgIHN0cmluZ3Mgd2l0aCBhdCBtb3N0ICduJyBtaXNtYXRjaGluZyBjaGFyYWN0ZXJzLiBDe0Nsb3NlTWF0Y2h9IHRha2VzIHBhcmFtZXRlcnM6DQogICAgIC0gQ3ttYXRjaF9zdHJpbmd9IC0gc3RyaW5nIHRvIGJlIG1hdGNoZWQNCiAgICAgLSBDe21heE1pc21hdGNoZXN9IC0gKEN7ZGVmYXVsdD0xfSkgbWF4aW11bSBudW1iZXIgb2YgbWlzbWF0Y2hlcyBhbGxvd2VkIHRvIGNvdW50IGFzIGEgbWF0Y2gNCiAgICANCiAgICBUaGUgcmVzdWx0cyBmcm9tIGEgc3VjY2Vzc2Z1bCBwYXJzZSB3aWxsIGNvbnRhaW4gdGhlIG1hdGNoZWQgdGV4dCBmcm9tIHRoZSBpbnB1dCBzdHJpbmcgYW5kIHRoZSBmb2xsb3dpbmcgbmFtZWQgcmVzdWx0czoNCiAgICAgLSBDe21pc21hdGNoZXN9IC0gYSBsaXN0IG9mIHRoZSBwb3NpdGlvbnMgd2l0aGluIHRoZSBtYXRjaF9zdHJpbmcgd2hlcmUgbWlzbWF0Y2hlcyB3ZXJlIGZvdW5kDQogICAgIC0gQ3tvcmlnaW5hbH0gLSB0aGUgb3JpZ2luYWwgbWF0Y2hfc3RyaW5nIHVzZWQgdG8gY29tcGFyZSBhZ2FpbnN0IHRoZSBpbnB1dCBzdHJpbmcNCiAgICANCiAgICBJZiBDe21pc21hdGNoZXN9IGlzIGFuIGVtcHR5IGxpc3QsIHRoZW4gdGhlIG1hdGNoIHdhcyBhbiBleGFjdCBtYXRjaC4NCiAgICANCiAgICBFeGFtcGxlOjoNCiAgICAgICAgcGF0dCA9IENsb3NlTWF0Y2goIkFUQ0FUQ0dBQVRHR0EiKQ0KICAgICAgICBwYXR0LnBhcnNlU3RyaW5nKCJBVENBVENHQUFYR0dBIikgIyAtPiAoWydBVENBVENHQUFYR0dBJ10sIHsnbWlzbWF0Y2hlcyc6IFtbOV1dLCAnb3JpZ2luYWwnOiBbJ0FUQ0FUQ0dBQVRHR0EnXX0pDQogICAgICAgIHBhdHQucGFyc2VTdHJpbmcoIkFUQ0FYQ0dBQVhHR0EiKSAjIC0+IEV4Y2VwdGlvbjogRXhwZWN0ZWQgJ0FUQ0FUQ0dBQVRHR0EnICh3aXRoIHVwIHRvIDEgbWlzbWF0Y2hlcykgKGF0IGNoYXIgMCksIChsaW5lOjEsIGNvbDoxKQ0KDQogICAgICAgICMgZXhhY3QgbWF0Y2gNCiAgICAgICAgcGF0dC5wYXJzZVN0cmluZygiQVRDQVRDR0FBVEdHQSIpICMgLT4gKFsnQVRDQVRDR0FBVEdHQSddLCB7J21pc21hdGNoZXMnOiBbW11dLCAnb3JpZ2luYWwnOiBbJ0FUQ0FUQ0dBQVRHR0EnXX0pDQoNCiAgICAgICAgIyBjbG9zZSBtYXRjaCBhbGxvd2luZyB1cCB0byAyIG1pc21hdGNoZXMNCiAgICAgICAgcGF0dCA9IENsb3NlTWF0Y2goIkFUQ0FUQ0dBQVRHR0EiLCBtYXhNaXNtYXRjaGVzPTIpDQogICAgICAgIHBhdHQucGFyc2VTdHJpbmcoIkFUQ0FYQ0dBQVhHR0EiKSAjIC0+IChbJ0FUQ0FYQ0dBQVhHR0EnXSwgeydtaXNtYXRjaGVzJzogW1s0LCA5XV0sICdvcmlnaW5hbCc6IFsnQVRDQVRDR0FBVEdHQSddfSkNCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oc2VsZiwgbWF0Y2hfc3RyaW5nLCBtYXhNaXNtYXRjaGVzPTEpOg0KICAgICAgICBzdXBlcihDbG9zZU1hdGNoLHNlbGYpLl9faW5pdF9fKCkNCiAgICAgICAgc2VsZi5uYW1lID0gbWF0Y2hfc3RyaW5nDQogICAgICAgIHNlbGYubWF0Y2hfc3RyaW5nID0gbWF0Y2hfc3RyaW5nDQogICAgICAgIHNlbGYubWF4TWlzbWF0Y2hlcyA9IG1heE1pc21hdGNoZXMNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgJXIgKHdpdGggdXAgdG8gJWQgbWlzbWF0Y2hlcykiICUgKHNlbGYubWF0Y2hfc3RyaW5nLCBzZWxmLm1heE1pc21hdGNoZXMpDQogICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IEZhbHNlDQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBGYWxzZQ0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgc3RhcnQgPSBsb2MNCiAgICAgICAgaW5zdHJsZW4gPSBsZW4oaW5zdHJpbmcpDQogICAgICAgIG1heGxvYyA9IHN0YXJ0ICsgbGVuKHNlbGYubWF0Y2hfc3RyaW5nKQ0KDQogICAgICAgIGlmIG1heGxvYyA8PSBpbnN0cmxlbjoNCiAgICAgICAgICAgIG1hdGNoX3N0cmluZyA9IHNlbGYubWF0Y2hfc3RyaW5nDQogICAgICAgICAgICBtYXRjaF9zdHJpbmdsb2MgPSAwDQogICAgICAgICAgICBtaXNtYXRjaGVzID0gW10NCiAgICAgICAgICAgIG1heE1pc21hdGNoZXMgPSBzZWxmLm1heE1pc21hdGNoZXMNCg0KICAgICAgICAgICAgZm9yIG1hdGNoX3N0cmluZ2xvYyxzX20gaW4gZW51bWVyYXRlKHppcChpbnN0cmluZ1tsb2M6bWF4bG9jXSwgc2VsZi5tYXRjaF9zdHJpbmcpKToNCiAgICAgICAgICAgICAgICBzcmMsbWF0ID0gc19tDQogICAgICAgICAgICAgICAgaWYgc3JjICE9IG1hdDoNCiAgICAgICAgICAgICAgICAgICAgbWlzbWF0Y2hlcy5hcHBlbmQobWF0Y2hfc3RyaW5nbG9jKQ0KICAgICAgICAgICAgICAgICAgICBpZiBsZW4obWlzbWF0Y2hlcykgPiBtYXhNaXNtYXRjaGVzOg0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgbG9jID0gbWF0Y2hfc3RyaW5nbG9jICsgMQ0KICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBQYXJzZVJlc3VsdHMoW2luc3RyaW5nW3N0YXJ0OmxvY11dKQ0KICAgICAgICAgICAgICAgIHJlc3VsdHNbJ29yaWdpbmFsJ10gPSBzZWxmLm1hdGNoX3N0cmluZw0KICAgICAgICAgICAgICAgIHJlc3VsdHNbJ21pc21hdGNoZXMnXSA9IG1pc21hdGNoZXMNCiAgICAgICAgICAgICAgICByZXR1cm4gbG9jLCByZXN1bHRzDQoNCiAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQoNCg0KY2xhc3MgV29yZChUb2tlbik6DQogICAgIiIiDQogICAgVG9rZW4gZm9yIG1hdGNoaW5nIHdvcmRzIGNvbXBvc2VkIG9mIGFsbG93ZWQgY2hhcmFjdGVyIHNldHMuDQogICAgRGVmaW5lZCB3aXRoIHN0cmluZyBjb250YWluaW5nIGFsbCBhbGxvd2VkIGluaXRpYWwgY2hhcmFjdGVycywNCiAgICBhbiBvcHRpb25hbCBzdHJpbmcgY29udGFpbmluZyBhbGxvd2VkIGJvZHkgY2hhcmFjdGVycyAoaWYgb21pdHRlZCwNCiAgICBkZWZhdWx0cyB0byB0aGUgaW5pdGlhbCBjaGFyYWN0ZXIgc2V0KSwgYW5kIGFuIG9wdGlvbmFsIG1pbmltdW0sDQogICAgbWF4aW11bSwgYW5kL29yIGV4YWN0IGxlbmd0aC4gIFRoZSBkZWZhdWx0IHZhbHVlIGZvciBDe21pbn0gaXMgMSAoYQ0KICAgIG1pbmltdW0gdmFsdWUgPCAxIGlzIG5vdCB2YWxpZCk7IHRoZSBkZWZhdWx0IHZhbHVlcyBmb3IgQ3ttYXh9IGFuZCBDe2V4YWN0fQ0KICAgIGFyZSAwLCBtZWFuaW5nIG5vIG1heGltdW0gb3IgZXhhY3QgbGVuZ3RoIHJlc3RyaWN0aW9uLiBBbiBvcHRpb25hbA0KICAgIEN7ZXhjbHVkZUNoYXJzfSBwYXJhbWV0ZXIgY2FuIGxpc3QgY2hhcmFjdGVycyB0aGF0IG1pZ2h0IGJlIGZvdW5kIGluIA0KICAgIHRoZSBpbnB1dCBDe2JvZHlDaGFyc30gc3RyaW5nOyB1c2VmdWwgdG8gZGVmaW5lIGEgd29yZCBvZiBhbGwgcHJpbnRhYmxlcw0KICAgIGV4Y2VwdCBmb3Igb25lIG9yIHR3byBjaGFyYWN0ZXJzLCBmb3IgaW5zdGFuY2UuDQogICAgDQogICAgTHtzcmFuZ2V9IGlzIHVzZWZ1bCBmb3IgZGVmaW5pbmcgY3VzdG9tIGNoYXJhY3RlciBzZXQgc3RyaW5ncyBmb3IgZGVmaW5pbmcgDQogICAgQ3tXb3JkfSBleHByZXNzaW9ucywgdXNpbmcgcmFuZ2Ugbm90YXRpb24gZnJvbSByZWd1bGFyIGV4cHJlc3Npb24gY2hhcmFjdGVyIHNldHMuDQogICAgDQogICAgQSBjb21tb24gbWlzdGFrZSBpcyB0byB1c2UgQ3tXb3JkfSB0byBtYXRjaCBhIHNwZWNpZmljIGxpdGVyYWwgc3RyaW5nLCBhcyBpbiANCiAgICBDe1dvcmQoIkFkZHJlc3MiKX0uIFJlbWVtYmVyIHRoYXQgQ3tXb3JkfSB1c2VzIHRoZSBzdHJpbmcgYXJndW1lbnQgdG8gZGVmaW5lDQogICAgSXtzZXRzfSBvZiBtYXRjaGFibGUgY2hhcmFjdGVycy4gVGhpcyBleHByZXNzaW9uIHdvdWxkIG1hdGNoICJBZGQiLCAiQUFBIiwNCiAgICAiZEFyZWQiLCBvciBhbnkgb3RoZXIgd29yZCBtYWRlIHVwIG9mIHRoZSBjaGFyYWN0ZXJzICdBJywgJ2QnLCAncicsICdlJywgYW5kICdzJy4NCiAgICBUbyBtYXRjaCBhbiBleGFjdCBsaXRlcmFsIHN0cmluZywgdXNlIEx7TGl0ZXJhbH0gb3IgTHtLZXl3b3JkfS4NCg0KICAgIHB5cGFyc2luZyBpbmNsdWRlcyBoZWxwZXIgc3RyaW5ncyBmb3IgYnVpbGRpbmcgV29yZHM6DQogICAgIC0gTHthbHBoYXN9DQogICAgIC0gTHtudW1zfQ0KICAgICAtIEx7YWxwaGFudW1zfQ0KICAgICAtIEx7aGV4bnVtc30NCiAgICAgLSBMe2FscGhhczhiaXR9IChhbHBoYWJldGljIGNoYXJhY3RlcnMgaW4gQVNDSUkgcmFuZ2UgMTI4LTI1NSAtIGFjY2VudGVkLCB0aWxkZWQsIHVtbGF1dGVkLCBldGMuKQ0KICAgICAtIEx7cHVuYzhiaXR9IChub24tYWxwaGFiZXRpYyBjaGFyYWN0ZXJzIGluIEFTQ0lJIHJhbmdlIDEyOC0yNTUgLSBjdXJyZW5jeSwgc3ltYm9scywgc3VwZXJzY3JpcHRzLCBkaWFjcml0aWNhbHMsIGV0Yy4pDQogICAgIC0gTHtwcmludGFibGVzfSAoYW55IG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlcikNCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICAjIGEgd29yZCBjb21wb3NlZCBvZiBkaWdpdHMNCiAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykgIyBlcXVpdmFsZW50IHRvIFdvcmQoIjAxMjM0NTY3ODkiKSBvciBXb3JkKHNyYW5nZSgiMC05IikpDQogICAgICAgIA0KICAgICAgICAjIGEgd29yZCB3aXRoIGEgbGVhZGluZyBjYXBpdGFsLCBhbmQgemVybyBvciBtb3JlIGxvd2VyY2FzZQ0KICAgICAgICBjYXBpdGFsX3dvcmQgPSBXb3JkKGFscGhhcy51cHBlcigpLCBhbHBoYXMubG93ZXIoKSkNCg0KICAgICAgICAjIGhvc3RuYW1lcyBhcmUgYWxwaGFudW1lcmljLCB3aXRoIGxlYWRpbmcgYWxwaGEsIGFuZCAnLScNCiAgICAgICAgaG9zdG5hbWUgPSBXb3JkKGFscGhhcywgYWxwaGFudW1zKyctJykNCiAgICAgICAgDQogICAgICAgICMgcm9tYW4gbnVtZXJhbCAobm90IGEgc3RyaWN0IHBhcnNlciwgYWNjZXB0cyBpbnZhbGlkIG1peCBvZiBjaGFyYWN0ZXJzKQ0KICAgICAgICByb21hbiA9IFdvcmQoIklWWExDRE0iKQ0KICAgICAgICANCiAgICAgICAgIyBhbnkgc3RyaW5nIG9mIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlcnMsIGV4Y2VwdCBmb3IgJywnDQogICAgICAgIGNzdl92YWx1ZSA9IFdvcmQocHJpbnRhYmxlcywgZXhjbHVkZUNoYXJzPSIsIikNCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGluaXRDaGFycywgYm9keUNoYXJzPU5vbmUsIG1pbj0xLCBtYXg9MCwgZXhhY3Q9MCwgYXNLZXl3b3JkPUZhbHNlLCBleGNsdWRlQ2hhcnM9Tm9uZSApOg0KICAgICAgICBzdXBlcihXb3JkLHNlbGYpLl9faW5pdF9fKCkNCiAgICAgICAgaWYgZXhjbHVkZUNoYXJzOg0KICAgICAgICAgICAgaW5pdENoYXJzID0gJycuam9pbihjIGZvciBjIGluIGluaXRDaGFycyBpZiBjIG5vdCBpbiBleGNsdWRlQ2hhcnMpDQogICAgICAgICAgICBpZiBib2R5Q2hhcnM6DQogICAgICAgICAgICAgICAgYm9keUNoYXJzID0gJycuam9pbihjIGZvciBjIGluIGJvZHlDaGFycyBpZiBjIG5vdCBpbiBleGNsdWRlQ2hhcnMpDQogICAgICAgIHNlbGYuaW5pdENoYXJzT3JpZyA9IGluaXRDaGFycw0KICAgICAgICBzZWxmLmluaXRDaGFycyA9IHNldChpbml0Q2hhcnMpDQogICAgICAgIGlmIGJvZHlDaGFycyA6DQogICAgICAgICAgICBzZWxmLmJvZHlDaGFyc09yaWcgPSBib2R5Q2hhcnMNCiAgICAgICAgICAgIHNlbGYuYm9keUNoYXJzID0gc2V0KGJvZHlDaGFycykNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHNlbGYuYm9keUNoYXJzT3JpZyA9IGluaXRDaGFycw0KICAgICAgICAgICAgc2VsZi5ib2R5Q2hhcnMgPSBzZXQoaW5pdENoYXJzKQ0KDQogICAgICAgIHNlbGYubWF4U3BlY2lmaWVkID0gbWF4ID4gMA0KDQogICAgICAgIGlmIG1pbiA8IDE6DQogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJjYW5ub3Qgc3BlY2lmeSBhIG1pbmltdW0gbGVuZ3RoIDwgMTsgdXNlIE9wdGlvbmFsKFdvcmQoKSkgaWYgemVyby1sZW5ndGggd29yZCBpcyBwZXJtaXR0ZWQiKQ0KDQogICAgICAgIHNlbGYubWluTGVuID0gbWluDQoNCiAgICAgICAgaWYgbWF4ID4gMDoNCiAgICAgICAgICAgIHNlbGYubWF4TGVuID0gbWF4DQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBzZWxmLm1heExlbiA9IF9NQVhfSU5UDQoNCiAgICAgICAgaWYgZXhhY3QgPiAwOg0KICAgICAgICAgICAgc2VsZi5tYXhMZW4gPSBleGFjdA0KICAgICAgICAgICAgc2VsZi5taW5MZW4gPSBleGFjdA0KDQogICAgICAgIHNlbGYubmFtZSA9IF91c3RyKHNlbGYpDQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkICIgKyBzZWxmLm5hbWUNCiAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gRmFsc2UNCiAgICAgICAgc2VsZi5hc0tleXdvcmQgPSBhc0tleXdvcmQNCg0KICAgICAgICBpZiAnICcgbm90IGluIHNlbGYuaW5pdENoYXJzT3JpZytzZWxmLmJvZHlDaGFyc09yaWcgYW5kIChtaW49PTEgYW5kIG1heD09MCBhbmQgZXhhY3Q9PTApOg0KICAgICAgICAgICAgaWYgc2VsZi5ib2R5Q2hhcnNPcmlnID09IHNlbGYuaW5pdENoYXJzT3JpZzoNCiAgICAgICAgICAgICAgICBzZWxmLnJlU3RyaW5nID0gIlslc10rIiAlIF9lc2NhcGVSZWdleFJhbmdlQ2hhcnMoc2VsZi5pbml0Q2hhcnNPcmlnKQ0KICAgICAgICAgICAgZWxpZiBsZW4oc2VsZi5pbml0Q2hhcnNPcmlnKSA9PSAxOg0KICAgICAgICAgICAgICAgIHNlbGYucmVTdHJpbmcgPSAiJXNbJXNdKiIgJSBcDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZS5lc2NhcGUoc2VsZi5pbml0Q2hhcnNPcmlnKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2VzY2FwZVJlZ2V4UmFuZ2VDaGFycyhzZWxmLmJvZHlDaGFyc09yaWcpLCkNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgc2VsZi5yZVN0cmluZyA9ICJbJXNdWyVzXSoiICUgXA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX2VzY2FwZVJlZ2V4UmFuZ2VDaGFycyhzZWxmLmluaXRDaGFyc09yaWcpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZXNjYXBlUmVnZXhSYW5nZUNoYXJzKHNlbGYuYm9keUNoYXJzT3JpZyksKQ0KICAgICAgICAgICAgaWYgc2VsZi5hc0tleXdvcmQ6DQogICAgICAgICAgICAgICAgc2VsZi5yZVN0cmluZyA9IHIiXGIiK3NlbGYucmVTdHJpbmcrciJcYiINCiAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICBzZWxmLnJlID0gcmUuY29tcGlsZSggc2VsZi5yZVN0cmluZyApDQogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOg0KICAgICAgICAgICAgICAgIHNlbGYucmUgPSBOb25lDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBpZiBzZWxmLnJlOg0KICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5yZS5tYXRjaChpbnN0cmluZyxsb2MpDQogICAgICAgICAgICBpZiBub3QgcmVzdWx0Og0KICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KDQogICAgICAgICAgICBsb2MgPSByZXN1bHQuZW5kKCkNCiAgICAgICAgICAgIHJldHVybiBsb2MsIHJlc3VsdC5ncm91cCgpDQoNCiAgICAgICAgaWYgbm90KGluc3RyaW5nWyBsb2MgXSBpbiBzZWxmLmluaXRDaGFycyk6DQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCg0KICAgICAgICBzdGFydCA9IGxvYw0KICAgICAgICBsb2MgKz0gMQ0KICAgICAgICBpbnN0cmxlbiA9IGxlbihpbnN0cmluZykNCiAgICAgICAgYm9keWNoYXJzID0gc2VsZi5ib2R5Q2hhcnMNCiAgICAgICAgbWF4bG9jID0gc3RhcnQgKyBzZWxmLm1heExlbg0KICAgICAgICBtYXhsb2MgPSBtaW4oIG1heGxvYywgaW5zdHJsZW4gKQ0KICAgICAgICB3aGlsZSBsb2MgPCBtYXhsb2MgYW5kIGluc3RyaW5nW2xvY10gaW4gYm9keWNoYXJzOg0KICAgICAgICAgICAgbG9jICs9IDENCg0KICAgICAgICB0aHJvd0V4Y2VwdGlvbiA9IEZhbHNlDQogICAgICAgIGlmIGxvYyAtIHN0YXJ0IDwgc2VsZi5taW5MZW46DQogICAgICAgICAgICB0aHJvd0V4Y2VwdGlvbiA9IFRydWUNCiAgICAgICAgaWYgc2VsZi5tYXhTcGVjaWZpZWQgYW5kIGxvYyA8IGluc3RybGVuIGFuZCBpbnN0cmluZ1tsb2NdIGluIGJvZHljaGFyczoNCiAgICAgICAgICAgIHRocm93RXhjZXB0aW9uID0gVHJ1ZQ0KICAgICAgICBpZiBzZWxmLmFzS2V5d29yZDoNCiAgICAgICAgICAgIGlmIChzdGFydD4wIGFuZCBpbnN0cmluZ1tzdGFydC0xXSBpbiBib2R5Y2hhcnMpIG9yIChsb2M8aW5zdHJsZW4gYW5kIGluc3RyaW5nW2xvY10gaW4gYm9keWNoYXJzKToNCiAgICAgICAgICAgICAgICB0aHJvd0V4Y2VwdGlvbiA9IFRydWUNCg0KICAgICAgICBpZiB0aHJvd0V4Y2VwdGlvbjoNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KDQogICAgICAgIHJldHVybiBsb2MsIGluc3RyaW5nW3N0YXJ0OmxvY10NCg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHJldHVybiBzdXBlcihXb3JkLHNlbGYpLl9fc3RyX18oKQ0KICAgICAgICBleGNlcHQgRXhjZXB0aW9uOg0KICAgICAgICAgICAgcGFzcw0KDQoNCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6DQoNCiAgICAgICAgICAgIGRlZiBjaGFyc0FzU3RyKHMpOg0KICAgICAgICAgICAgICAgIGlmIGxlbihzKT40Og0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gc1s6NF0rIi4uLiINCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gcw0KDQogICAgICAgICAgICBpZiAoIHNlbGYuaW5pdENoYXJzT3JpZyAhPSBzZWxmLmJvZHlDaGFyc09yaWcgKToNCiAgICAgICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAiVzooJXMsJXMpIiAlICggY2hhcnNBc1N0cihzZWxmLmluaXRDaGFyc09yaWcpLCBjaGFyc0FzU3RyKHNlbGYuYm9keUNoYXJzT3JpZykgKQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAiVzooJXMpIiAlIGNoYXJzQXNTdHIoc2VsZi5pbml0Q2hhcnNPcmlnKQ0KDQogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHINCg0KDQpjbGFzcyBSZWdleChUb2tlbik6DQogICAgciIiIg0KICAgIFRva2VuIGZvciBtYXRjaGluZyBzdHJpbmdzIHRoYXQgbWF0Y2ggYSBnaXZlbiByZWd1bGFyIGV4cHJlc3Npb24uDQogICAgRGVmaW5lZCB3aXRoIHN0cmluZyBzcGVjaWZ5aW5nIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gaW4gYSBmb3JtIHJlY29nbml6ZWQgYnkgdGhlIGluYnVpbHQgUHl0aG9uIHJlIG1vZHVsZS4NCiAgICBJZiB0aGUgZ2l2ZW4gcmVnZXggY29udGFpbnMgbmFtZWQgZ3JvdXBzIChkZWZpbmVkIHVzaW5nIEN7KD9QPG5hbWU+Li4uKX0pLCB0aGVzZSB3aWxsIGJlIHByZXNlcnZlZCBhcyANCiAgICBuYW1lZCBwYXJzZSByZXN1bHRzLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIHJlYWxudW0gPSBSZWdleChyIlsrLV0/XGQrXC5cZCoiKQ0KICAgICAgICBkYXRlID0gUmVnZXgocicoP1A8eWVhcj5cZHs0fSktKD9QPG1vbnRoPlxkXGQ/KS0oP1A8ZGF5PlxkXGQ/KScpDQogICAgICAgICMgcmVmOiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzI2NzM5OS9ob3ctZG8teW91LW1hdGNoLW9ubHktdmFsaWQtcm9tYW4tbnVtZXJhbHMtd2l0aC1hLXJlZ3VsYXItZXhwcmVzc2lvbg0KICAgICAgICByb21hbiA9IFJlZ2V4KHIiTXswLDR9KENNfENEfEQ/Q3swLDN9KShYQ3xYTHxMP1h7MCwzfSkoSVh8SVZ8Vj9JezAsM30pIikNCiAgICAiIiINCiAgICBjb21waWxlZFJFdHlwZSA9IHR5cGUocmUuY29tcGlsZSgiW0EtWl0iKSkNCiAgICBkZWYgX19pbml0X18oIHNlbGYsIHBhdHRlcm4sIGZsYWdzPTApOg0KICAgICAgICAiIiJUaGUgcGFyYW1ldGVycyBDe3BhdHRlcm59IGFuZCBDe2ZsYWdzfSBhcmUgcGFzc2VkIHRvIHRoZSBDe3JlLmNvbXBpbGUoKX0gZnVuY3Rpb24gYXMtaXMuIFNlZSB0aGUgUHl0aG9uIEN7cmV9IG1vZHVsZSBmb3IgYW4gZXhwbGFuYXRpb24gb2YgdGhlIGFjY2VwdGFibGUgcGF0dGVybnMgYW5kIGZsYWdzLiIiIg0KICAgICAgICBzdXBlcihSZWdleCxzZWxmKS5fX2luaXRfXygpDQoNCiAgICAgICAgaWYgaXNpbnN0YW5jZShwYXR0ZXJuLCBiYXNlc3RyaW5nKToNCiAgICAgICAgICAgIGlmIG5vdCBwYXR0ZXJuOg0KICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIm51bGwgc3RyaW5nIHBhc3NlZCB0byBSZWdleDsgdXNlIEVtcHR5KCkgaW5zdGVhZCIsDQogICAgICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpDQoNCiAgICAgICAgICAgIHNlbGYucGF0dGVybiA9IHBhdHRlcm4NCiAgICAgICAgICAgIHNlbGYuZmxhZ3MgPSBmbGFncw0KDQogICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgc2VsZi5yZSA9IHJlLmNvbXBpbGUoc2VsZi5wYXR0ZXJuLCBzZWxmLmZsYWdzKQ0KICAgICAgICAgICAgICAgIHNlbGYucmVTdHJpbmcgPSBzZWxmLnBhdHRlcm4NCiAgICAgICAgICAgIGV4Y2VwdCBzcmVfY29uc3RhbnRzLmVycm9yOg0KICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oImludmFsaWQgcGF0dGVybiAoJXMpIHBhc3NlZCB0byBSZWdleCIgJSBwYXR0ZXJuLA0KICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpDQogICAgICAgICAgICAgICAgcmFpc2UNCg0KICAgICAgICBlbGlmIGlzaW5zdGFuY2UocGF0dGVybiwgUmVnZXguY29tcGlsZWRSRXR5cGUpOg0KICAgICAgICAgICAgc2VsZi5yZSA9IHBhdHRlcm4NCiAgICAgICAgICAgIHNlbGYucGF0dGVybiA9IFwNCiAgICAgICAgICAgIHNlbGYucmVTdHJpbmcgPSBzdHIocGF0dGVybikNCiAgICAgICAgICAgIHNlbGYuZmxhZ3MgPSBmbGFncw0KICAgICAgICAgICAgDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJSZWdleCBtYXkgb25seSBiZSBjb25zdHJ1Y3RlZCB3aXRoIGEgc3RyaW5nIG9yIGEgY29tcGlsZWQgUkUgb2JqZWN0IikNCg0KICAgICAgICBzZWxmLm5hbWUgPSBfdXN0cihzZWxmKQ0KICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCAiICsgc2VsZi5uYW1lDQogICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IEZhbHNlDQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBUcnVlDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICByZXN1bHQgPSBzZWxmLnJlLm1hdGNoKGluc3RyaW5nLGxvYykNCiAgICAgICAgaWYgbm90IHJlc3VsdDoNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KDQogICAgICAgIGxvYyA9IHJlc3VsdC5lbmQoKQ0KICAgICAgICBkID0gcmVzdWx0Lmdyb3VwZGljdCgpDQogICAgICAgIHJldCA9IFBhcnNlUmVzdWx0cyhyZXN1bHQuZ3JvdXAoKSkNCiAgICAgICAgaWYgZDoNCiAgICAgICAgICAgIGZvciBrIGluIGQ6DQogICAgICAgICAgICAgICAgcmV0W2tdID0gZFtrXQ0KICAgICAgICByZXR1cm4gbG9jLHJldA0KDQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgcmV0dXJuIHN1cGVyKFJlZ2V4LHNlbGYpLl9fc3RyX18oKQ0KICAgICAgICBleGNlcHQgRXhjZXB0aW9uOg0KICAgICAgICAgICAgcGFzcw0KDQogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lOg0KICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gIlJlOiglcykiICUgcmVwcihzZWxmLnBhdHRlcm4pDQoNCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcg0KDQoNCmNsYXNzIFF1b3RlZFN0cmluZyhUb2tlbik6DQogICAgciIiIg0KICAgIFRva2VuIGZvciBtYXRjaGluZyBzdHJpbmdzIHRoYXQgYXJlIGRlbGltaXRlZCBieSBxdW90aW5nIGNoYXJhY3RlcnMuDQogICAgDQogICAgRGVmaW5lZCB3aXRoIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoNCiAgICAgICAgLSBxdW90ZUNoYXIgLSBzdHJpbmcgb2Ygb25lIG9yIG1vcmUgY2hhcmFjdGVycyBkZWZpbmluZyB0aGUgcXVvdGUgZGVsaW1pdGluZyBzdHJpbmcNCiAgICAgICAgLSBlc2NDaGFyIC0gY2hhcmFjdGVyIHRvIGVzY2FwZSBxdW90ZXMsIHR5cGljYWxseSBiYWNrc2xhc2ggKGRlZmF1bHQ9Q3tOb25lfSkNCiAgICAgICAgLSBlc2NRdW90ZSAtIHNwZWNpYWwgcXVvdGUgc2VxdWVuY2UgdG8gZXNjYXBlIGFuIGVtYmVkZGVkIHF1b3RlIHN0cmluZyAoc3VjaCBhcyBTUUwncyAiIiB0byBlc2NhcGUgYW4gZW1iZWRkZWQgIikgKGRlZmF1bHQ9Q3tOb25lfSkNCiAgICAgICAgLSBtdWx0aWxpbmUgLSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBxdW90ZXMgY2FuIHNwYW4gbXVsdGlwbGUgbGluZXMgKGRlZmF1bHQ9Q3tGYWxzZX0pDQogICAgICAgIC0gdW5xdW90ZVJlc3VsdHMgLSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgbWF0Y2hlZCB0ZXh0IHNob3VsZCBiZSB1bnF1b3RlZCAoZGVmYXVsdD1De1RydWV9KQ0KICAgICAgICAtIGVuZFF1b3RlQ2hhciAtIHN0cmluZyBvZiBvbmUgb3IgbW9yZSBjaGFyYWN0ZXJzIGRlZmluaW5nIHRoZSBlbmQgb2YgdGhlIHF1b3RlIGRlbGltaXRlZCBzdHJpbmcgKGRlZmF1bHQ9Q3tOb25lfSA9PiBzYW1lIGFzIHF1b3RlQ2hhcikNCiAgICAgICAgLSBjb252ZXJ0V2hpdGVzcGFjZUVzY2FwZXMgLSBjb252ZXJ0IGVzY2FwZWQgd2hpdGVzcGFjZSAoQ3snXHQnfSwgQ3snXG4nfSwgZXRjLikgdG8gYWN0dWFsIHdoaXRlc3BhY2UgKGRlZmF1bHQ9Q3tUcnVlfSkNCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBxcyA9IFF1b3RlZFN0cmluZygnIicpDQogICAgICAgIHByaW50KHFzLnNlYXJjaFN0cmluZygnbHNqZGYgIlRoaXMgaXMgdGhlIHF1b3RlIiBzbGRqZicpKQ0KICAgICAgICBjb21wbGV4X3FzID0gUXVvdGVkU3RyaW5nKCd7eycsIGVuZFF1b3RlQ2hhcj0nfX0nKQ0KICAgICAgICBwcmludChjb21wbGV4X3FzLnNlYXJjaFN0cmluZygnbHNqZGYge3tUaGlzIGlzIHRoZSAicXVvdGUifX0gc2xkamYnKSkNCiAgICAgICAgc3FsX3FzID0gUXVvdGVkU3RyaW5nKCciJywgZXNjUXVvdGU9JyIiJykNCiAgICAgICAgcHJpbnQoc3FsX3FzLnNlYXJjaFN0cmluZygnbHNqZGYgIlRoaXMgaXMgdGhlIHF1b3RlIHdpdGggIiJlbWJlZGRlZCIiIHF1b3RlcyIgc2xkamYnKSkNCiAgICBwcmludHM6Og0KICAgICAgICBbWydUaGlzIGlzIHRoZSBxdW90ZSddXQ0KICAgICAgICBbWydUaGlzIGlzIHRoZSAicXVvdGUiJ11dDQogICAgICAgIFtbJ1RoaXMgaXMgdGhlIHF1b3RlIHdpdGggImVtYmVkZGVkIiBxdW90ZXMnXV0NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIHF1b3RlQ2hhciwgZXNjQ2hhcj1Ob25lLCBlc2NRdW90ZT1Ob25lLCBtdWx0aWxpbmU9RmFsc2UsIHVucXVvdGVSZXN1bHRzPVRydWUsIGVuZFF1b3RlQ2hhcj1Ob25lLCBjb252ZXJ0V2hpdGVzcGFjZUVzY2FwZXM9VHJ1ZSk6DQogICAgICAgIHN1cGVyKFF1b3RlZFN0cmluZyxzZWxmKS5fX2luaXRfXygpDQoNCiAgICAgICAgIyByZW1vdmUgd2hpdGUgc3BhY2UgZnJvbSBxdW90ZSBjaGFycyAtIHdvbnQgd29yayBhbnl3YXkNCiAgICAgICAgcXVvdGVDaGFyID0gcXVvdGVDaGFyLnN0cmlwKCkNCiAgICAgICAgaWYgbm90IHF1b3RlQ2hhcjoNCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oInF1b3RlQ2hhciBjYW5ub3QgYmUgdGhlIGVtcHR5IHN0cmluZyIsU3ludGF4V2FybmluZyxzdGFja2xldmVsPTIpDQogICAgICAgICAgICByYWlzZSBTeW50YXhFcnJvcigpDQoNCiAgICAgICAgaWYgZW5kUXVvdGVDaGFyIGlzIE5vbmU6DQogICAgICAgICAgICBlbmRRdW90ZUNoYXIgPSBxdW90ZUNoYXINCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIGVuZFF1b3RlQ2hhciA9IGVuZFF1b3RlQ2hhci5zdHJpcCgpDQogICAgICAgICAgICBpZiBub3QgZW5kUXVvdGVDaGFyOg0KICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oImVuZFF1b3RlQ2hhciBjYW5ub3QgYmUgdGhlIGVtcHR5IHN0cmluZyIsU3ludGF4V2FybmluZyxzdGFja2xldmVsPTIpDQogICAgICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IoKQ0KDQogICAgICAgIHNlbGYucXVvdGVDaGFyID0gcXVvdGVDaGFyDQogICAgICAgIHNlbGYucXVvdGVDaGFyTGVuID0gbGVuKHF1b3RlQ2hhcikNCiAgICAgICAgc2VsZi5maXJzdFF1b3RlQ2hhciA9IHF1b3RlQ2hhclswXQ0KICAgICAgICBzZWxmLmVuZFF1b3RlQ2hhciA9IGVuZFF1b3RlQ2hhcg0KICAgICAgICBzZWxmLmVuZFF1b3RlQ2hhckxlbiA9IGxlbihlbmRRdW90ZUNoYXIpDQogICAgICAgIHNlbGYuZXNjQ2hhciA9IGVzY0NoYXINCiAgICAgICAgc2VsZi5lc2NRdW90ZSA9IGVzY1F1b3RlDQogICAgICAgIHNlbGYudW5xdW90ZVJlc3VsdHMgPSB1bnF1b3RlUmVzdWx0cw0KICAgICAgICBzZWxmLmNvbnZlcnRXaGl0ZXNwYWNlRXNjYXBlcyA9IGNvbnZlcnRXaGl0ZXNwYWNlRXNjYXBlcw0KDQogICAgICAgIGlmIG11bHRpbGluZToNCiAgICAgICAgICAgIHNlbGYuZmxhZ3MgPSByZS5NVUxUSUxJTkUgfCByZS5ET1RBTEwNCiAgICAgICAgICAgIHNlbGYucGF0dGVybiA9IHInJXMoPzpbXiVzJXNdJyAlIFwNCiAgICAgICAgICAgICAgICAoIHJlLmVzY2FwZShzZWxmLnF1b3RlQ2hhciksDQogICAgICAgICAgICAgICAgICBfZXNjYXBlUmVnZXhSYW5nZUNoYXJzKHNlbGYuZW5kUXVvdGVDaGFyWzBdKSwNCiAgICAgICAgICAgICAgICAgIChlc2NDaGFyIGlzIG5vdCBOb25lIGFuZCBfZXNjYXBlUmVnZXhSYW5nZUNoYXJzKGVzY0NoYXIpIG9yICcnKSApDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBzZWxmLmZsYWdzID0gMA0KICAgICAgICAgICAgc2VsZi5wYXR0ZXJuID0gciclcyg/OlteJXNcblxyJXNdJyAlIFwNCiAgICAgICAgICAgICAgICAoIHJlLmVzY2FwZShzZWxmLnF1b3RlQ2hhciksDQogICAgICAgICAgICAgICAgICBfZXNjYXBlUmVnZXhSYW5nZUNoYXJzKHNlbGYuZW5kUXVvdGVDaGFyWzBdKSwNCiAgICAgICAgICAgICAgICAgIChlc2NDaGFyIGlzIG5vdCBOb25lIGFuZCBfZXNjYXBlUmVnZXhSYW5nZUNoYXJzKGVzY0NoYXIpIG9yICcnKSApDQogICAgICAgIGlmIGxlbihzZWxmLmVuZFF1b3RlQ2hhcikgPiAxOg0KICAgICAgICAgICAgc2VsZi5wYXR0ZXJuICs9ICgNCiAgICAgICAgICAgICAgICAnfCg/OicgKyAnKXwoPzonLmpvaW4oIiVzW14lc10iICUgKHJlLmVzY2FwZShzZWxmLmVuZFF1b3RlQ2hhcls6aV0pLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZXNjYXBlUmVnZXhSYW5nZUNoYXJzKHNlbGYuZW5kUXVvdGVDaGFyW2ldKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihzZWxmLmVuZFF1b3RlQ2hhciktMSwwLC0xKSkgKyAnKScNCiAgICAgICAgICAgICAgICApDQogICAgICAgIGlmIGVzY1F1b3RlOg0KICAgICAgICAgICAgc2VsZi5wYXR0ZXJuICs9IChyJ3woPzolcyknICUgcmUuZXNjYXBlKGVzY1F1b3RlKSkNCiAgICAgICAgaWYgZXNjQ2hhcjoNCiAgICAgICAgICAgIHNlbGYucGF0dGVybiArPSAocid8KD86JXMuKScgJSByZS5lc2NhcGUoZXNjQ2hhcikpDQogICAgICAgICAgICBzZWxmLmVzY0NoYXJSZXBsYWNlUGF0dGVybiA9IHJlLmVzY2FwZShzZWxmLmVzY0NoYXIpKyIoLikiDQogICAgICAgIHNlbGYucGF0dGVybiArPSAocicpKiVzJyAlIHJlLmVzY2FwZShzZWxmLmVuZFF1b3RlQ2hhcikpDQoNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgc2VsZi5yZSA9IHJlLmNvbXBpbGUoc2VsZi5wYXR0ZXJuLCBzZWxmLmZsYWdzKQ0KICAgICAgICAgICAgc2VsZi5yZVN0cmluZyA9IHNlbGYucGF0dGVybg0KICAgICAgICBleGNlcHQgc3JlX2NvbnN0YW50cy5lcnJvcjoNCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oImludmFsaWQgcGF0dGVybiAoJXMpIHBhc3NlZCB0byBSZWdleCIgJSBzZWxmLnBhdHRlcm4sDQogICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQ0KICAgICAgICAgICAgcmFpc2UNCg0KICAgICAgICBzZWxmLm5hbWUgPSBfdXN0cihzZWxmKQ0KICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCAiICsgc2VsZi5uYW1lDQogICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IEZhbHNlDQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBUcnVlDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICByZXN1bHQgPSBpbnN0cmluZ1tsb2NdID09IHNlbGYuZmlyc3RRdW90ZUNoYXIgYW5kIHNlbGYucmUubWF0Y2goaW5zdHJpbmcsbG9jKSBvciBOb25lDQogICAgICAgIGlmIG5vdCByZXN1bHQ6DQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCg0KICAgICAgICBsb2MgPSByZXN1bHQuZW5kKCkNCiAgICAgICAgcmV0ID0gcmVzdWx0Lmdyb3VwKCkNCg0KICAgICAgICBpZiBzZWxmLnVucXVvdGVSZXN1bHRzOg0KDQogICAgICAgICAgICAjIHN0cmlwIG9mZiBxdW90ZXMNCiAgICAgICAgICAgIHJldCA9IHJldFtzZWxmLnF1b3RlQ2hhckxlbjotc2VsZi5lbmRRdW90ZUNoYXJMZW5dDQoNCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UocmV0LGJhc2VzdHJpbmcpOg0KICAgICAgICAgICAgICAgICMgcmVwbGFjZSBlc2NhcGVkIHdoaXRlc3BhY2UNCiAgICAgICAgICAgICAgICBpZiAnXFwnIGluIHJldCBhbmQgc2VsZi5jb252ZXJ0V2hpdGVzcGFjZUVzY2FwZXM6DQogICAgICAgICAgICAgICAgICAgIHdzX21hcCA9IHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHInXHQnIDogJ1x0JywNCiAgICAgICAgICAgICAgICAgICAgICAgIHInXG4nIDogJ1xuJywNCiAgICAgICAgICAgICAgICAgICAgICAgIHInXGYnIDogJ1xmJywNCiAgICAgICAgICAgICAgICAgICAgICAgIHInXHInIDogJ1xyJywNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBmb3Igd3NsaXQsd3NjaGFyIGluIHdzX21hcC5pdGVtcygpOg0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gcmV0LnJlcGxhY2Uod3NsaXQsIHdzY2hhcikNCg0KICAgICAgICAgICAgICAgICMgcmVwbGFjZSBlc2NhcGVkIGNoYXJhY3RlcnMNCiAgICAgICAgICAgICAgICBpZiBzZWxmLmVzY0NoYXI6DQogICAgICAgICAgICAgICAgICAgIHJldCA9IHJlLnN1YihzZWxmLmVzY0NoYXJSZXBsYWNlUGF0dGVybiwgciJcZzwxPiIsIHJldCkNCg0KICAgICAgICAgICAgICAgICMgcmVwbGFjZSBlc2NhcGVkIHF1b3Rlcw0KICAgICAgICAgICAgICAgIGlmIHNlbGYuZXNjUXVvdGU6DQogICAgICAgICAgICAgICAgICAgIHJldCA9IHJldC5yZXBsYWNlKHNlbGYuZXNjUXVvdGUsIHNlbGYuZW5kUXVvdGVDaGFyKQ0KDQogICAgICAgIHJldHVybiBsb2MsIHJldA0KDQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgcmV0dXJuIHN1cGVyKFF1b3RlZFN0cmluZyxzZWxmKS5fX3N0cl9fKCkNCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoNCiAgICAgICAgICAgIHBhc3MNCg0KICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZToNCiAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICJxdW90ZWQgc3RyaW5nLCBzdGFydGluZyB3aXRoICVzIGVuZGluZyB3aXRoICVzIiAlIChzZWxmLnF1b3RlQ2hhciwgc2VsZi5lbmRRdW90ZUNoYXIpDQoNCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcg0KDQoNCmNsYXNzIENoYXJzTm90SW4oVG9rZW4pOg0KICAgICIiIg0KICAgIFRva2VuIGZvciBtYXRjaGluZyB3b3JkcyBjb21wb3NlZCBvZiBjaGFyYWN0ZXJzIEl7bm90fSBpbiBhIGdpdmVuIHNldCAod2lsbA0KICAgIGluY2x1ZGUgd2hpdGVzcGFjZSBpbiBtYXRjaGVkIGNoYXJhY3RlcnMgaWYgbm90IGxpc3RlZCBpbiB0aGUgcHJvdmlkZWQgZXhjbHVzaW9uIHNldCAtIHNlZSBleGFtcGxlKS4NCiAgICBEZWZpbmVkIHdpdGggc3RyaW5nIGNvbnRhaW5pbmcgYWxsIGRpc2FsbG93ZWQgY2hhcmFjdGVycywgYW5kIGFuIG9wdGlvbmFsDQogICAgbWluaW11bSwgbWF4aW11bSwgYW5kL29yIGV4YWN0IGxlbmd0aC4gIFRoZSBkZWZhdWx0IHZhbHVlIGZvciBDe21pbn0gaXMgMSAoYQ0KICAgIG1pbmltdW0gdmFsdWUgPCAxIGlzIG5vdCB2YWxpZCk7IHRoZSBkZWZhdWx0IHZhbHVlcyBmb3IgQ3ttYXh9IGFuZCBDe2V4YWN0fQ0KICAgIGFyZSAwLCBtZWFuaW5nIG5vIG1heGltdW0gb3IgZXhhY3QgbGVuZ3RoIHJlc3RyaWN0aW9uLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgICMgZGVmaW5lIGEgY29tbWEtc2VwYXJhdGVkLXZhbHVlIGFzIGFueXRoaW5nIHRoYXQgaXMgbm90IGEgJywnDQogICAgICAgIGNzdl92YWx1ZSA9IENoYXJzTm90SW4oJywnKQ0KICAgICAgICBwcmludChkZWxpbWl0ZWRMaXN0KGNzdl92YWx1ZSkucGFyc2VTdHJpbmcoImRrbHMsbHNka2pmLHMxMiAzNCxAISMsMjEzIikpDQogICAgcHJpbnRzOjoNCiAgICAgICAgWydka2xzJywgJ2xzZGtqZicsICdzMTIgMzQnLCAnQCEjJywgJzIxMyddDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBub3RDaGFycywgbWluPTEsIG1heD0wLCBleGFjdD0wICk6DQogICAgICAgIHN1cGVyKENoYXJzTm90SW4sc2VsZikuX19pbml0X18oKQ0KICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gRmFsc2UNCiAgICAgICAgc2VsZi5ub3RDaGFycyA9IG5vdENoYXJzDQoNCiAgICAgICAgaWYgbWluIDwgMToNCiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImNhbm5vdCBzcGVjaWZ5IGEgbWluaW11bSBsZW5ndGggPCAxOyB1c2UgT3B0aW9uYWwoQ2hhcnNOb3RJbigpKSBpZiB6ZXJvLWxlbmd0aCBjaGFyIGdyb3VwIGlzIHBlcm1pdHRlZCIpDQoNCiAgICAgICAgc2VsZi5taW5MZW4gPSBtaW4NCg0KICAgICAgICBpZiBtYXggPiAwOg0KICAgICAgICAgICAgc2VsZi5tYXhMZW4gPSBtYXgNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHNlbGYubWF4TGVuID0gX01BWF9JTlQNCg0KICAgICAgICBpZiBleGFjdCA+IDA6DQogICAgICAgICAgICBzZWxmLm1heExlbiA9IGV4YWN0DQogICAgICAgICAgICBzZWxmLm1pbkxlbiA9IGV4YWN0DQoNCiAgICAgICAgc2VsZi5uYW1lID0gX3VzdHIoc2VsZikNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgIiArIHNlbGYubmFtZQ0KICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gKCBzZWxmLm1pbkxlbiA9PSAwICkNCiAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gRmFsc2UNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIGlmIGluc3RyaW5nW2xvY10gaW4gc2VsZi5ub3RDaGFyczoNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KDQogICAgICAgIHN0YXJ0ID0gbG9jDQogICAgICAgIGxvYyArPSAxDQogICAgICAgIG5vdGNoYXJzID0gc2VsZi5ub3RDaGFycw0KICAgICAgICBtYXhsZW4gPSBtaW4oIHN0YXJ0K3NlbGYubWF4TGVuLCBsZW4oaW5zdHJpbmcpICkNCiAgICAgICAgd2hpbGUgbG9jIDwgbWF4bGVuIGFuZCBcDQogICAgICAgICAgICAgIChpbnN0cmluZ1tsb2NdIG5vdCBpbiBub3RjaGFycyk6DQogICAgICAgICAgICBsb2MgKz0gMQ0KDQogICAgICAgIGlmIGxvYyAtIHN0YXJ0IDwgc2VsZi5taW5MZW46DQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCg0KICAgICAgICByZXR1cm4gbG9jLCBpbnN0cmluZ1tzdGFydDpsb2NdDQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICB0cnk6DQogICAgICAgICAgICByZXR1cm4gc3VwZXIoQ2hhcnNOb3RJbiwgc2VsZikuX19zdHJfXygpDQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246DQogICAgICAgICAgICBwYXNzDQoNCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6DQogICAgICAgICAgICBpZiBsZW4oc2VsZi5ub3RDaGFycykgPiA0Og0KICAgICAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICIhVzooJXMuLi4pIiAlIHNlbGYubm90Q2hhcnNbOjRdDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICIhVzooJXMpIiAlIHNlbGYubm90Q2hhcnMNCg0KICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByDQoNCmNsYXNzIFdoaXRlKFRva2VuKToNCiAgICAiIiINCiAgICBTcGVjaWFsIG1hdGNoaW5nIGNsYXNzIGZvciBtYXRjaGluZyB3aGl0ZXNwYWNlLiAgTm9ybWFsbHksIHdoaXRlc3BhY2UgaXMgaWdub3JlZA0KICAgIGJ5IHB5cGFyc2luZyBncmFtbWFycy4gIFRoaXMgY2xhc3MgaXMgaW5jbHVkZWQgd2hlbiBzb21lIHdoaXRlc3BhY2Ugc3RydWN0dXJlcw0KICAgIGFyZSBzaWduaWZpY2FudC4gIERlZmluZSB3aXRoIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHdoaXRlc3BhY2UgY2hhcmFjdGVycyB0byBiZQ0KICAgIG1hdGNoZWQ7IGRlZmF1bHQgaXMgQ3siIFxcdFxcclxcbiJ9LiAgQWxzbyB0YWtlcyBvcHRpb25hbCBDe21pbn0sIEN7bWF4fSwgYW5kIEN7ZXhhY3R9IGFyZ3VtZW50cywNCiAgICBhcyBkZWZpbmVkIGZvciB0aGUgQ3tMe1dvcmR9fSBjbGFzcy4NCiAgICAiIiINCiAgICB3aGl0ZVN0cnMgPSB7DQogICAgICAgICIgIiA6ICI8U1BDPiIsDQogICAgICAgICJcdCI6ICI8VEFCPiIsDQogICAgICAgICJcbiI6ICI8TEY+IiwNCiAgICAgICAgIlxyIjogIjxDUj4iLA0KICAgICAgICAiXGYiOiAiPEZGPiIsDQogICAgICAgIH0NCiAgICBkZWYgX19pbml0X18oc2VsZiwgd3M9IiBcdFxyXG4iLCBtaW49MSwgbWF4PTAsIGV4YWN0PTApOg0KICAgICAgICBzdXBlcihXaGl0ZSxzZWxmKS5fX2luaXRfXygpDQogICAgICAgIHNlbGYubWF0Y2hXaGl0ZSA9IHdzDQogICAgICAgIHNlbGYuc2V0V2hpdGVzcGFjZUNoYXJzKCAiIi5qb2luKGMgZm9yIGMgaW4gc2VsZi53aGl0ZUNoYXJzIGlmIGMgbm90IGluIHNlbGYubWF0Y2hXaGl0ZSkgKQ0KICAgICAgICAjfiBzZWxmLmxlYXZlV2hpdGVzcGFjZSgpDQogICAgICAgIHNlbGYubmFtZSA9ICgiIi5qb2luKFdoaXRlLndoaXRlU3Ryc1tjXSBmb3IgYyBpbiBzZWxmLm1hdGNoV2hpdGUpKQ0KICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gVHJ1ZQ0KICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCAiICsgc2VsZi5uYW1lDQoNCiAgICAgICAgc2VsZi5taW5MZW4gPSBtaW4NCg0KICAgICAgICBpZiBtYXggPiAwOg0KICAgICAgICAgICAgc2VsZi5tYXhMZW4gPSBtYXgNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHNlbGYubWF4TGVuID0gX01BWF9JTlQNCg0KICAgICAgICBpZiBleGFjdCA+IDA6DQogICAgICAgICAgICBzZWxmLm1heExlbiA9IGV4YWN0DQogICAgICAgICAgICBzZWxmLm1pbkxlbiA9IGV4YWN0DQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBpZiBub3QoaW5zdHJpbmdbIGxvYyBdIGluIHNlbGYubWF0Y2hXaGl0ZSk6DQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCiAgICAgICAgc3RhcnQgPSBsb2MNCiAgICAgICAgbG9jICs9IDENCiAgICAgICAgbWF4bG9jID0gc3RhcnQgKyBzZWxmLm1heExlbg0KICAgICAgICBtYXhsb2MgPSBtaW4oIG1heGxvYywgbGVuKGluc3RyaW5nKSApDQogICAgICAgIHdoaWxlIGxvYyA8IG1heGxvYyBhbmQgaW5zdHJpbmdbbG9jXSBpbiBzZWxmLm1hdGNoV2hpdGU6DQogICAgICAgICAgICBsb2MgKz0gMQ0KDQogICAgICAgIGlmIGxvYyAtIHN0YXJ0IDwgc2VsZi5taW5MZW46DQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCg0KICAgICAgICByZXR1cm4gbG9jLCBpbnN0cmluZ1tzdGFydDpsb2NdDQoNCg0KY2xhc3MgX1Bvc2l0aW9uVG9rZW4oVG9rZW4pOg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiApOg0KICAgICAgICBzdXBlcihfUG9zaXRpb25Ub2tlbixzZWxmKS5fX2luaXRfXygpDQogICAgICAgIHNlbGYubmFtZT1zZWxmLl9fY2xhc3NfXy5fX25hbWVfXw0KICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gVHJ1ZQ0KICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBGYWxzZQ0KDQpjbGFzcyBHb1RvQ29sdW1uKF9Qb3NpdGlvblRva2VuKToNCiAgICAiIiINCiAgICBUb2tlbiB0byBhZHZhbmNlIHRvIGEgc3BlY2lmaWMgY29sdW1uIG9mIGlucHV0IHRleHQ7IHVzZWZ1bCBmb3IgdGFidWxhciByZXBvcnQgc2NyYXBpbmcuDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBjb2xubyApOg0KICAgICAgICBzdXBlcihHb1RvQ29sdW1uLHNlbGYpLl9faW5pdF9fKCkNCiAgICAgICAgc2VsZi5jb2wgPSBjb2xubw0KDQogICAgZGVmIHByZVBhcnNlKCBzZWxmLCBpbnN0cmluZywgbG9jICk6DQogICAgICAgIGlmIGNvbChsb2MsaW5zdHJpbmcpICE9IHNlbGYuY29sOg0KICAgICAgICAgICAgaW5zdHJsZW4gPSBsZW4oaW5zdHJpbmcpDQogICAgICAgICAgICBpZiBzZWxmLmlnbm9yZUV4cHJzOg0KICAgICAgICAgICAgICAgIGxvYyA9IHNlbGYuX3NraXBJZ25vcmFibGVzKCBpbnN0cmluZywgbG9jICkNCiAgICAgICAgICAgIHdoaWxlIGxvYyA8IGluc3RybGVuIGFuZCBpbnN0cmluZ1tsb2NdLmlzc3BhY2UoKSBhbmQgY29sKCBsb2MsIGluc3RyaW5nICkgIT0gc2VsZi5jb2wgOg0KICAgICAgICAgICAgICAgIGxvYyArPSAxDQogICAgICAgIHJldHVybiBsb2MNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIHRoaXNjb2wgPSBjb2woIGxvYywgaW5zdHJpbmcgKQ0KICAgICAgICBpZiB0aGlzY29sID4gc2VsZi5jb2w6DQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbiggaW5zdHJpbmcsIGxvYywgIlRleHQgbm90IGluIGV4cGVjdGVkIGNvbHVtbiIsIHNlbGYgKQ0KICAgICAgICBuZXdsb2MgPSBsb2MgKyBzZWxmLmNvbCAtIHRoaXNjb2wNCiAgICAgICAgcmV0ID0gaW5zdHJpbmdbIGxvYzogbmV3bG9jIF0NCiAgICAgICAgcmV0dXJuIG5ld2xvYywgcmV0DQoNCg0KY2xhc3MgTGluZVN0YXJ0KF9Qb3NpdGlvblRva2VuKToNCiAgICAiIiINCiAgICBNYXRjaGVzIGlmIGN1cnJlbnQgcG9zaXRpb24gaXMgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUgd2l0aGluIHRoZSBwYXJzZSBzdHJpbmcNCiAgICANCiAgICBFeGFtcGxlOjoNCiAgICANCiAgICAgICAgdGVzdCA9ICcnJ1wNCiAgICAgICAgQUFBIHRoaXMgbGluZQ0KICAgICAgICBBQUEgYW5kIHRoaXMgbGluZQ0KICAgICAgICAgIEFBQSBidXQgbm90IHRoaXMgb25lDQogICAgICAgIEIgQUFBIGFuZCBkZWZpbml0ZWx5IG5vdCB0aGlzIG9uZQ0KICAgICAgICAnJycNCg0KICAgICAgICBmb3IgdCBpbiAoTGluZVN0YXJ0KCkgKyAnQUFBJyArIHJlc3RPZkxpbmUpLnNlYXJjaFN0cmluZyh0ZXN0KToNCiAgICAgICAgICAgIHByaW50KHQpDQogICAgDQogICAgUHJpbnRzOjoNCiAgICAgICAgWydBQUEnLCAnIHRoaXMgbGluZSddDQogICAgICAgIFsnQUFBJywgJyBhbmQgdGhpcyBsaW5lJ10gICAgDQoNCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYgKToNCiAgICAgICAgc3VwZXIoTGluZVN0YXJ0LHNlbGYpLl9faW5pdF9fKCkNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgc3RhcnQgb2YgbGluZSINCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIGlmIGNvbChsb2MsIGluc3RyaW5nKSA9PSAxOg0KICAgICAgICAgICAgcmV0dXJuIGxvYywgW10NCiAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQoNCmNsYXNzIExpbmVFbmQoX1Bvc2l0aW9uVG9rZW4pOg0KICAgICIiIg0KICAgIE1hdGNoZXMgaWYgY3VycmVudCBwb3NpdGlvbiBpcyBhdCB0aGUgZW5kIG9mIGEgbGluZSB3aXRoaW4gdGhlIHBhcnNlIHN0cmluZw0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiApOg0KICAgICAgICBzdXBlcihMaW5lRW5kLHNlbGYpLl9faW5pdF9fKCkNCiAgICAgICAgc2VsZi5zZXRXaGl0ZXNwYWNlQ2hhcnMoIFBhcnNlckVsZW1lbnQuREVGQVVMVF9XSElURV9DSEFSUy5yZXBsYWNlKCJcbiIsIiIpICkNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgZW5kIG9mIGxpbmUiDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBpZiBsb2M8bGVuKGluc3RyaW5nKToNCiAgICAgICAgICAgIGlmIGluc3RyaW5nW2xvY10gPT0gIlxuIjoNCiAgICAgICAgICAgICAgICByZXR1cm4gbG9jKzEsICJcbiINCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQogICAgICAgIGVsaWYgbG9jID09IGxlbihpbnN0cmluZyk6DQogICAgICAgICAgICByZXR1cm4gbG9jKzEsIFtdDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCg0KY2xhc3MgU3RyaW5nU3RhcnQoX1Bvc2l0aW9uVG9rZW4pOg0KICAgICIiIg0KICAgIE1hdGNoZXMgaWYgY3VycmVudCBwb3NpdGlvbiBpcyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwYXJzZSBzdHJpbmcNCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYgKToNCiAgICAgICAgc3VwZXIoU3RyaW5nU3RhcnQsc2VsZikuX19pbml0X18oKQ0KICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCBzdGFydCBvZiB0ZXh0Ig0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgaWYgbG9jICE9IDA6DQogICAgICAgICAgICAjIHNlZSBpZiBlbnRpcmUgc3RyaW5nIHVwIHRvIGhlcmUgaXMganVzdCB3aGl0ZXNwYWNlIGFuZCBpZ25vcmVhYmxlcw0KICAgICAgICAgICAgaWYgbG9jICE9IHNlbGYucHJlUGFyc2UoIGluc3RyaW5nLCAwICk6DQogICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQogICAgICAgIHJldHVybiBsb2MsIFtdDQoNCmNsYXNzIFN0cmluZ0VuZChfUG9zaXRpb25Ub2tlbik6DQogICAgIiIiDQogICAgTWF0Y2hlcyBpZiBjdXJyZW50IHBvc2l0aW9uIGlzIGF0IHRoZSBlbmQgb2YgdGhlIHBhcnNlIHN0cmluZw0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiApOg0KICAgICAgICBzdXBlcihTdHJpbmdFbmQsc2VsZikuX19pbml0X18oKQ0KICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCBlbmQgb2YgdGV4dCINCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIGlmIGxvYyA8IGxlbihpbnN0cmluZyk6DQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCiAgICAgICAgZWxpZiBsb2MgPT0gbGVuKGluc3RyaW5nKToNCiAgICAgICAgICAgIHJldHVybiBsb2MrMSwgW10NCiAgICAgICAgZWxpZiBsb2MgPiBsZW4oaW5zdHJpbmcpOg0KICAgICAgICAgICAgcmV0dXJuIGxvYywgW10NCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KDQpjbGFzcyBXb3JkU3RhcnQoX1Bvc2l0aW9uVG9rZW4pOg0KICAgICIiIg0KICAgIE1hdGNoZXMgaWYgdGhlIGN1cnJlbnQgcG9zaXRpb24gaXMgYXQgdGhlIGJlZ2lubmluZyBvZiBhIFdvcmQsIGFuZA0KICAgIGlzIG5vdCBwcmVjZWRlZCBieSBhbnkgY2hhcmFjdGVyIGluIGEgZ2l2ZW4gc2V0IG9mIEN7d29yZENoYXJzfQ0KICAgIChkZWZhdWx0PUN7cHJpbnRhYmxlc30pLiBUbyBlbXVsYXRlIHRoZSBDe1xifSBiZWhhdmlvciBvZiByZWd1bGFyIGV4cHJlc3Npb25zLA0KICAgIHVzZSBDe1dvcmRTdGFydChhbHBoYW51bXMpfS4gQ3tXb3JkU3RhcnR9IHdpbGwgYWxzbyBtYXRjaCBhdCB0aGUgYmVnaW5uaW5nIG9mDQogICAgdGhlIHN0cmluZyBiZWluZyBwYXJzZWQsIG9yIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lLg0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyhzZWxmLCB3b3JkQ2hhcnMgPSBwcmludGFibGVzKToNCiAgICAgICAgc3VwZXIoV29yZFN0YXJ0LHNlbGYpLl9faW5pdF9fKCkNCiAgICAgICAgc2VsZi53b3JkQ2hhcnMgPSBzZXQod29yZENoYXJzKQ0KICAgICAgICBzZWxmLmVycm1zZyA9ICJOb3QgYXQgdGhlIHN0YXJ0IG9mIGEgd29yZCINCg0KICAgIGRlZiBwYXJzZUltcGwoc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgaWYgbG9jICE9IDA6DQogICAgICAgICAgICBpZiAoaW5zdHJpbmdbbG9jLTFdIGluIHNlbGYud29yZENoYXJzIG9yDQogICAgICAgICAgICAgICAgaW5zdHJpbmdbbG9jXSBub3QgaW4gc2VsZi53b3JkQ2hhcnMpOg0KICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KICAgICAgICByZXR1cm4gbG9jLCBbXQ0KDQpjbGFzcyBXb3JkRW5kKF9Qb3NpdGlvblRva2VuKToNCiAgICAiIiINCiAgICBNYXRjaGVzIGlmIHRoZSBjdXJyZW50IHBvc2l0aW9uIGlzIGF0IHRoZSBlbmQgb2YgYSBXb3JkLCBhbmQNCiAgICBpcyBub3QgZm9sbG93ZWQgYnkgYW55IGNoYXJhY3RlciBpbiBhIGdpdmVuIHNldCBvZiBDe3dvcmRDaGFyc30NCiAgICAoZGVmYXVsdD1De3ByaW50YWJsZXN9KS4gVG8gZW11bGF0ZSB0aGUgQ3tcYn0gYmVoYXZpb3Igb2YgcmVndWxhciBleHByZXNzaW9ucywNCiAgICB1c2UgQ3tXb3JkRW5kKGFscGhhbnVtcyl9LiBDe1dvcmRFbmR9IHdpbGwgYWxzbyBtYXRjaCBhdCB0aGUgZW5kIG9mDQogICAgdGhlIHN0cmluZyBiZWluZyBwYXJzZWQsIG9yIGF0IHRoZSBlbmQgb2YgYSBsaW5lLg0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyhzZWxmLCB3b3JkQ2hhcnMgPSBwcmludGFibGVzKToNCiAgICAgICAgc3VwZXIoV29yZEVuZCxzZWxmKS5fX2luaXRfXygpDQogICAgICAgIHNlbGYud29yZENoYXJzID0gc2V0KHdvcmRDaGFycykNCiAgICAgICAgc2VsZi5za2lwV2hpdGVzcGFjZSA9IEZhbHNlDQogICAgICAgIHNlbGYuZXJybXNnID0gIk5vdCBhdCB0aGUgZW5kIG9mIGEgd29yZCINCg0KICAgIGRlZiBwYXJzZUltcGwoc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgaW5zdHJsZW4gPSBsZW4oaW5zdHJpbmcpDQogICAgICAgIGlmIGluc3RybGVuPjAgYW5kIGxvYzxpbnN0cmxlbjoNCiAgICAgICAgICAgIGlmIChpbnN0cmluZ1tsb2NdIGluIHNlbGYud29yZENoYXJzIG9yDQogICAgICAgICAgICAgICAgaW5zdHJpbmdbbG9jLTFdIG5vdCBpbiBzZWxmLndvcmRDaGFycyk6DQogICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQogICAgICAgIHJldHVybiBsb2MsIFtdDQoNCg0KY2xhc3MgUGFyc2VFeHByZXNzaW9uKFBhcnNlckVsZW1lbnQpOg0KICAgICIiIg0KICAgIEFic3RyYWN0IHN1YmNsYXNzIG9mIFBhcnNlckVsZW1lbnQsIGZvciBjb21iaW5pbmcgYW5kIHBvc3QtcHJvY2Vzc2luZyBwYXJzZWQgdG9rZW5zLg0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwcnMsIHNhdmVsaXN0ID0gRmFsc2UgKToNCiAgICAgICAgc3VwZXIoUGFyc2VFeHByZXNzaW9uLHNlbGYpLl9faW5pdF9fKHNhdmVsaXN0KQ0KICAgICAgICBpZiBpc2luc3RhbmNlKCBleHBycywgX2dlbmVyYXRvclR5cGUgKToNCiAgICAgICAgICAgIGV4cHJzID0gbGlzdChleHBycykNCg0KICAgICAgICBpZiBpc2luc3RhbmNlKCBleHBycywgYmFzZXN0cmluZyApOg0KICAgICAgICAgICAgc2VsZi5leHBycyA9IFsgUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBleHBycyApIF0NCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKCBleHBycywgSXRlcmFibGUgKToNCiAgICAgICAgICAgIGV4cHJzID0gbGlzdChleHBycykNCiAgICAgICAgICAgICMgaWYgc2VxdWVuY2Ugb2Ygc3RyaW5ncyBwcm92aWRlZCwgd3JhcCB3aXRoIExpdGVyYWwNCiAgICAgICAgICAgIGlmIGFsbChpc2luc3RhbmNlKGV4cHIsIGJhc2VzdHJpbmcpIGZvciBleHByIGluIGV4cHJzKToNCiAgICAgICAgICAgICAgICBleHBycyA9IG1hcChQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MsIGV4cHJzKQ0KICAgICAgICAgICAgc2VsZi5leHBycyA9IGxpc3QoZXhwcnMpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgc2VsZi5leHBycyA9IGxpc3QoIGV4cHJzICkNCiAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6DQogICAgICAgICAgICAgICAgc2VsZi5leHBycyA9IFsgZXhwcnMgXQ0KICAgICAgICBzZWxmLmNhbGxQcmVwYXJzZSA9IEZhbHNlDQoNCiAgICBkZWYgX19nZXRpdGVtX18oIHNlbGYsIGkgKToNCiAgICAgICAgcmV0dXJuIHNlbGYuZXhwcnNbaV0NCg0KICAgIGRlZiBhcHBlbmQoIHNlbGYsIG90aGVyICk6DQogICAgICAgIHNlbGYuZXhwcnMuYXBwZW5kKCBvdGhlciApDQogICAgICAgIHNlbGYuc3RyUmVwciA9IE5vbmUNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBsZWF2ZVdoaXRlc3BhY2UoIHNlbGYgKToNCiAgICAgICAgIiIiRXh0ZW5kcyBDe2xlYXZlV2hpdGVzcGFjZX0gZGVmaW5lZCBpbiBiYXNlIGNsYXNzLCBhbmQgYWxzbyBpbnZva2VzIEN7bGVhdmVXaGl0ZXNwYWNlfSBvbg0KICAgICAgICAgICBhbGwgY29udGFpbmVkIGV4cHJlc3Npb25zLiIiIg0KICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gRmFsc2UNCiAgICAgICAgc2VsZi5leHBycyA9IFsgZS5jb3B5KCkgZm9yIGUgaW4gc2VsZi5leHBycyBdDQogICAgICAgIGZvciBlIGluIHNlbGYuZXhwcnM6DQogICAgICAgICAgICBlLmxlYXZlV2hpdGVzcGFjZSgpDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgaWdub3JlKCBzZWxmLCBvdGhlciApOg0KICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgU3VwcHJlc3MgKToNCiAgICAgICAgICAgIGlmIG90aGVyIG5vdCBpbiBzZWxmLmlnbm9yZUV4cHJzOg0KICAgICAgICAgICAgICAgIHN1cGVyKCBQYXJzZUV4cHJlc3Npb24sIHNlbGYpLmlnbm9yZSggb3RoZXIgKQ0KICAgICAgICAgICAgICAgIGZvciBlIGluIHNlbGYuZXhwcnM6DQogICAgICAgICAgICAgICAgICAgIGUuaWdub3JlKCBzZWxmLmlnbm9yZUV4cHJzWy0xXSApDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBzdXBlciggUGFyc2VFeHByZXNzaW9uLCBzZWxmKS5pZ25vcmUoIG90aGVyICkNCiAgICAgICAgICAgIGZvciBlIGluIHNlbGYuZXhwcnM6DQogICAgICAgICAgICAgICAgZS5pZ25vcmUoIHNlbGYuaWdub3JlRXhwcnNbLTFdICkNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHJldHVybiBzdXBlcihQYXJzZUV4cHJlc3Npb24sc2VsZikuX19zdHJfXygpDQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246DQogICAgICAgICAgICBwYXNzDQoNCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6DQogICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAiJXM6KCVzKSIgJSAoIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBfdXN0cihzZWxmLmV4cHJzKSApDQogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHINCg0KICAgIGRlZiBzdHJlYW1saW5lKCBzZWxmICk6DQogICAgICAgIHN1cGVyKFBhcnNlRXhwcmVzc2lvbixzZWxmKS5zdHJlYW1saW5lKCkNCg0KICAgICAgICBmb3IgZSBpbiBzZWxmLmV4cHJzOg0KICAgICAgICAgICAgZS5zdHJlYW1saW5lKCkNCg0KICAgICAgICAjIGNvbGxhcHNlIG5lc3RlZCBBbmQncyBvZiB0aGUgZm9ybSBBbmQoIEFuZCggQW5kKCBhLGIpLCBjKSwgZCkgdG8gQW5kKCBhLGIsYyxkICkNCiAgICAgICAgIyBidXQgb25seSBpZiB0aGVyZSBhcmUgbm8gcGFyc2UgYWN0aW9ucyBvciByZXN1bHRzTmFtZXMgb24gdGhlIG5lc3RlZCBBbmQncw0KICAgICAgICAjIChsaWtld2lzZSBmb3IgT3IncyBhbmQgTWF0Y2hGaXJzdCdzKQ0KICAgICAgICBpZiAoIGxlbihzZWxmLmV4cHJzKSA9PSAyICk6DQogICAgICAgICAgICBvdGhlciA9IHNlbGYuZXhwcnNbMF0NCiAgICAgICAgICAgIGlmICggaXNpbnN0YW5jZSggb3RoZXIsIHNlbGYuX19jbGFzc19fICkgYW5kDQogICAgICAgICAgICAgICAgICBub3Qob3RoZXIucGFyc2VBY3Rpb24pIGFuZA0KICAgICAgICAgICAgICAgICAgb3RoZXIucmVzdWx0c05hbWUgaXMgTm9uZSBhbmQNCiAgICAgICAgICAgICAgICAgIG5vdCBvdGhlci5kZWJ1ZyApOg0KICAgICAgICAgICAgICAgIHNlbGYuZXhwcnMgPSBvdGhlci5leHByc1s6XSArIFsgc2VsZi5leHByc1sxXSBdDQogICAgICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gTm9uZQ0KICAgICAgICAgICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgfD0gb3RoZXIubWF5UmV0dXJuRW1wdHkNCiAgICAgICAgICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgIHw9IG90aGVyLm1heUluZGV4RXJyb3INCg0KICAgICAgICAgICAgb3RoZXIgPSBzZWxmLmV4cHJzWy0xXQ0KICAgICAgICAgICAgaWYgKCBpc2luc3RhbmNlKCBvdGhlciwgc2VsZi5fX2NsYXNzX18gKSBhbmQNCiAgICAgICAgICAgICAgICAgIG5vdChvdGhlci5wYXJzZUFjdGlvbikgYW5kDQogICAgICAgICAgICAgICAgICBvdGhlci5yZXN1bHRzTmFtZSBpcyBOb25lIGFuZA0KICAgICAgICAgICAgICAgICAgbm90IG90aGVyLmRlYnVnICk6DQogICAgICAgICAgICAgICAgc2VsZi5leHBycyA9IHNlbGYuZXhwcnNbOi0xXSArIG90aGVyLmV4cHJzWzpdDQogICAgICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gTm9uZQ0KICAgICAgICAgICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgfD0gb3RoZXIubWF5UmV0dXJuRW1wdHkNCiAgICAgICAgICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgIHw9IG90aGVyLm1heUluZGV4RXJyb3INCg0KICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCAiICsgX3VzdHIoc2VsZikNCiAgICAgICAgDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgc2V0UmVzdWx0c05hbWUoIHNlbGYsIG5hbWUsIGxpc3RBbGxNYXRjaGVzPUZhbHNlICk6DQogICAgICAgIHJldCA9IHN1cGVyKFBhcnNlRXhwcmVzc2lvbixzZWxmKS5zZXRSZXN1bHRzTmFtZShuYW1lLGxpc3RBbGxNYXRjaGVzKQ0KICAgICAgICByZXR1cm4gcmV0DQoNCiAgICBkZWYgdmFsaWRhdGUoIHNlbGYsIHZhbGlkYXRlVHJhY2U9W10gKToNCiAgICAgICAgdG1wID0gdmFsaWRhdGVUcmFjZVs6XStbc2VsZl0NCiAgICAgICAgZm9yIGUgaW4gc2VsZi5leHByczoNCiAgICAgICAgICAgIGUudmFsaWRhdGUodG1wKQ0KICAgICAgICBzZWxmLmNoZWNrUmVjdXJzaW9uKCBbXSApDQogICAgICAgIA0KICAgIGRlZiBjb3B5KHNlbGYpOg0KICAgICAgICByZXQgPSBzdXBlcihQYXJzZUV4cHJlc3Npb24sc2VsZikuY29weSgpDQogICAgICAgIHJldC5leHBycyA9IFtlLmNvcHkoKSBmb3IgZSBpbiBzZWxmLmV4cHJzXQ0KICAgICAgICByZXR1cm4gcmV0DQoNCmNsYXNzIEFuZChQYXJzZUV4cHJlc3Npb24pOg0KICAgICIiIg0KICAgIFJlcXVpcmVzIGFsbCBnaXZlbiBDe1BhcnNlRXhwcmVzc2lvbn1zIHRvIGJlIGZvdW5kIGluIHRoZSBnaXZlbiBvcmRlci4NCiAgICBFeHByZXNzaW9ucyBtYXkgYmUgc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2UuDQogICAgTWF5IGJlIGNvbnN0cnVjdGVkIHVzaW5nIHRoZSBDeycrJ30gb3BlcmF0b3IuDQogICAgTWF5IGFsc28gYmUgY29uc3RydWN0ZWQgdXNpbmcgdGhlIEN7Jy0nfSBvcGVyYXRvciwgd2hpY2ggd2lsbCBzdXBwcmVzcyBiYWNrdHJhY2tpbmcuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykNCiAgICAgICAgbmFtZV9leHByID0gT25lT3JNb3JlKFdvcmQoYWxwaGFzKSkNCg0KICAgICAgICBleHByID0gQW5kKFtpbnRlZ2VyKCJpZCIpLG5hbWVfZXhwcigibmFtZSIpLGludGVnZXIoImFnZSIpXSkNCiAgICAgICAgIyBtb3JlIGVhc2lseSB3cml0dGVuIGFzOg0KICAgICAgICBleHByID0gaW50ZWdlcigiaWQiKSArIG5hbWVfZXhwcigibmFtZSIpICsgaW50ZWdlcigiYWdlIikNCiAgICAiIiINCg0KICAgIGNsYXNzIF9FcnJvclN0b3AoRW1wdHkpOg0KICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToNCiAgICAgICAgICAgIHN1cGVyKEFuZC5fRXJyb3JTdG9wLHNlbGYpLl9faW5pdF9fKCphcmdzLCAqKmt3YXJncykNCiAgICAgICAgICAgIHNlbGYubmFtZSA9ICctJw0KICAgICAgICAgICAgc2VsZi5sZWF2ZVdoaXRlc3BhY2UoKQ0KDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHBycywgc2F2ZWxpc3QgPSBUcnVlICk6DQogICAgICAgIHN1cGVyKEFuZCxzZWxmKS5fX2luaXRfXyhleHBycywgc2F2ZWxpc3QpDQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBhbGwoZS5tYXlSZXR1cm5FbXB0eSBmb3IgZSBpbiBzZWxmLmV4cHJzKQ0KICAgICAgICBzZWxmLnNldFdoaXRlc3BhY2VDaGFycyggc2VsZi5leHByc1swXS53aGl0ZUNoYXJzICkNCiAgICAgICAgc2VsZi5za2lwV2hpdGVzcGFjZSA9IHNlbGYuZXhwcnNbMF0uc2tpcFdoaXRlc3BhY2UNCiAgICAgICAgc2VsZi5jYWxsUHJlcGFyc2UgPSBUcnVlDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICAjIHBhc3MgRmFsc2UgYXMgbGFzdCBhcmcgdG8gX3BhcnNlIGZvciBmaXJzdCBlbGVtZW50LCBzaW5jZSB3ZSBhbHJlYWR5DQogICAgICAgICMgcHJlLXBhcnNlZCB0aGUgc3RyaW5nIGFzIHBhcnQgb2Ygb3VyIEFuZCBwcmUtcGFyc2luZw0KICAgICAgICBsb2MsIHJlc3VsdGxpc3QgPSBzZWxmLmV4cHJzWzBdLl9wYXJzZSggaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zLCBjYWxsUHJlUGFyc2U9RmFsc2UgKQ0KICAgICAgICBlcnJvclN0b3AgPSBGYWxzZQ0KICAgICAgICBmb3IgZSBpbiBzZWxmLmV4cHJzWzE6XToNCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZSwgQW5kLl9FcnJvclN0b3ApOg0KICAgICAgICAgICAgICAgIGVycm9yU3RvcCA9IFRydWUNCiAgICAgICAgICAgICAgICBjb250aW51ZQ0KICAgICAgICAgICAgaWYgZXJyb3JTdG9wOg0KICAgICAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICAgICAgbG9jLCBleHBydG9rZW5zID0gZS5fcGFyc2UoIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucyApDQogICAgICAgICAgICAgICAgZXhjZXB0IFBhcnNlU3ludGF4RXhjZXB0aW9uOg0KICAgICAgICAgICAgICAgICAgICByYWlzZQ0KICAgICAgICAgICAgICAgIGV4Y2VwdCBQYXJzZUJhc2VFeGNlcHRpb24gYXMgcGU6DQogICAgICAgICAgICAgICAgICAgIHBlLl9fdHJhY2ViYWNrX18gPSBOb25lDQogICAgICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlU3ludGF4RXhjZXB0aW9uLl9mcm9tX2V4Y2VwdGlvbihwZSkNCiAgICAgICAgICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoNCiAgICAgICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VTeW50YXhFeGNlcHRpb24oaW5zdHJpbmcsIGxlbihpbnN0cmluZyksIHNlbGYuZXJybXNnLCBzZWxmKQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICBsb2MsIGV4cHJ0b2tlbnMgPSBlLl9wYXJzZSggaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zICkNCiAgICAgICAgICAgIGlmIGV4cHJ0b2tlbnMgb3IgZXhwcnRva2Vucy5oYXNrZXlzKCk6DQogICAgICAgICAgICAgICAgcmVzdWx0bGlzdCArPSBleHBydG9rZW5zDQogICAgICAgIHJldHVybiBsb2MsIHJlc3VsdGxpc3QNCg0KICAgIGRlZiBfX2lhZGRfXyhzZWxmLCBvdGhlciApOg0KICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOg0KICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIG90aGVyICkNCiAgICAgICAgcmV0dXJuIHNlbGYuYXBwZW5kKCBvdGhlciApICNBbmQoIFsgc2VsZiwgb3RoZXIgXSApDQoNCiAgICBkZWYgY2hlY2tSZWN1cnNpb24oIHNlbGYsIHBhcnNlRWxlbWVudExpc3QgKToNCiAgICAgICAgc3ViUmVjQ2hlY2tMaXN0ID0gcGFyc2VFbGVtZW50TGlzdFs6XSArIFsgc2VsZiBdDQogICAgICAgIGZvciBlIGluIHNlbGYuZXhwcnM6DQogICAgICAgICAgICBlLmNoZWNrUmVjdXJzaW9uKCBzdWJSZWNDaGVja0xpc3QgKQ0KICAgICAgICAgICAgaWYgbm90IGUubWF5UmV0dXJuRW1wdHk6DQogICAgICAgICAgICAgICAgYnJlYWsNCg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIGlmIGhhc2F0dHIoc2VsZiwibmFtZSIpOg0KICAgICAgICAgICAgcmV0dXJuIHNlbGYubmFtZQ0KDQogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lOg0KICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gInsiICsgIiAiLmpvaW4oX3VzdHIoZSkgZm9yIGUgaW4gc2VsZi5leHBycykgKyAifSINCg0KICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByDQoNCg0KY2xhc3MgT3IoUGFyc2VFeHByZXNzaW9uKToNCiAgICAiIiINCiAgICBSZXF1aXJlcyB0aGF0IGF0IGxlYXN0IG9uZSBDe1BhcnNlRXhwcmVzc2lvbn0gaXMgZm91bmQuDQogICAgSWYgdHdvIGV4cHJlc3Npb25zIG1hdGNoLCB0aGUgZXhwcmVzc2lvbiB0aGF0IG1hdGNoZXMgdGhlIGxvbmdlc3Qgc3RyaW5nIHdpbGwgYmUgdXNlZC4NCiAgICBNYXkgYmUgY29uc3RydWN0ZWQgdXNpbmcgdGhlIEN7J14nfSBvcGVyYXRvci4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICAjIGNvbnN0cnVjdCBPciB1c2luZyAnXicgb3BlcmF0b3INCiAgICAgICAgDQogICAgICAgIG51bWJlciA9IFdvcmQobnVtcykgXiBDb21iaW5lKFdvcmQobnVtcykgKyAnLicgKyBXb3JkKG51bXMpKQ0KICAgICAgICBwcmludChudW1iZXIuc2VhcmNoU3RyaW5nKCIxMjMgMy4xNDE2IDc4OSIpKQ0KICAgIHByaW50czo6DQogICAgICAgIFtbJzEyMyddLCBbJzMuMTQxNiddLCBbJzc4OSddXQ0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwcnMsIHNhdmVsaXN0ID0gRmFsc2UgKToNCiAgICAgICAgc3VwZXIoT3Isc2VsZikuX19pbml0X18oZXhwcnMsIHNhdmVsaXN0KQ0KICAgICAgICBpZiBzZWxmLmV4cHJzOg0KICAgICAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IGFueShlLm1heVJldHVybkVtcHR5IGZvciBlIGluIHNlbGYuZXhwcnMpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gVHJ1ZQ0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgbWF4RXhjTG9jID0gLTENCiAgICAgICAgbWF4RXhjZXB0aW9uID0gTm9uZQ0KICAgICAgICBtYXRjaGVzID0gW10NCiAgICAgICAgZm9yIGUgaW4gc2VsZi5leHByczoNCiAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICBsb2MyID0gZS50cnlQYXJzZSggaW5zdHJpbmcsIGxvYyApDQogICAgICAgICAgICBleGNlcHQgUGFyc2VFeGNlcHRpb24gYXMgZXJyOg0KICAgICAgICAgICAgICAgIGVyci5fX3RyYWNlYmFja19fID0gTm9uZQ0KICAgICAgICAgICAgICAgIGlmIGVyci5sb2MgPiBtYXhFeGNMb2M6DQogICAgICAgICAgICAgICAgICAgIG1heEV4Y2VwdGlvbiA9IGVycg0KICAgICAgICAgICAgICAgICAgICBtYXhFeGNMb2MgPSBlcnIubG9jDQogICAgICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoNCiAgICAgICAgICAgICAgICBpZiBsZW4oaW5zdHJpbmcpID4gbWF4RXhjTG9jOg0KICAgICAgICAgICAgICAgICAgICBtYXhFeGNlcHRpb24gPSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZyxsZW4oaW5zdHJpbmcpLGUuZXJybXNnLHNlbGYpDQogICAgICAgICAgICAgICAgICAgIG1heEV4Y0xvYyA9IGxlbihpbnN0cmluZykNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgIyBzYXZlIG1hdGNoIGFtb25nIGFsbCBtYXRjaGVzLCB0byByZXRyeSBsb25nZXN0IHRvIHNob3J0ZXN0DQogICAgICAgICAgICAgICAgbWF0Y2hlcy5hcHBlbmQoKGxvYzIsIGUpKQ0KDQogICAgICAgIGlmIG1hdGNoZXM6DQogICAgICAgICAgICBtYXRjaGVzLnNvcnQoa2V5PWxhbWJkYSB4OiAteFswXSkNCiAgICAgICAgICAgIGZvciBfLGUgaW4gbWF0Y2hlczoNCiAgICAgICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBlLl9wYXJzZSggaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zICkNCiAgICAgICAgICAgICAgICBleGNlcHQgUGFyc2VFeGNlcHRpb24gYXMgZXJyOg0KICAgICAgICAgICAgICAgICAgICBlcnIuX190cmFjZWJhY2tfXyA9IE5vbmUNCiAgICAgICAgICAgICAgICAgICAgaWYgZXJyLmxvYyA+IG1heEV4Y0xvYzoNCiAgICAgICAgICAgICAgICAgICAgICAgIG1heEV4Y2VwdGlvbiA9IGVycg0KICAgICAgICAgICAgICAgICAgICAgICAgbWF4RXhjTG9jID0gZXJyLmxvYw0KDQogICAgICAgIGlmIG1heEV4Y2VwdGlvbiBpcyBub3QgTm9uZToNCiAgICAgICAgICAgIG1heEV4Y2VwdGlvbi5tc2cgPSBzZWxmLmVycm1zZw0KICAgICAgICAgICAgcmFpc2UgbWF4RXhjZXB0aW9uDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCAibm8gZGVmaW5lZCBhbHRlcm5hdGl2ZXMgdG8gbWF0Y2giLCBzZWxmKQ0KDQoNCiAgICBkZWYgX19peG9yX18oc2VsZiwgb3RoZXIgKToNCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToNCiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBvdGhlciApDQogICAgICAgIHJldHVybiBzZWxmLmFwcGVuZCggb3RoZXIgKSAjT3IoIFsgc2VsZiwgb3RoZXIgXSApDQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICBpZiBoYXNhdHRyKHNlbGYsIm5hbWUiKToNCiAgICAgICAgICAgIHJldHVybiBzZWxmLm5hbWUNCg0KICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZToNCiAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICJ7IiArICIgXiAiLmpvaW4oX3VzdHIoZSkgZm9yIGUgaW4gc2VsZi5leHBycykgKyAifSINCg0KICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByDQoNCiAgICBkZWYgY2hlY2tSZWN1cnNpb24oIHNlbGYsIHBhcnNlRWxlbWVudExpc3QgKToNCiAgICAgICAgc3ViUmVjQ2hlY2tMaXN0ID0gcGFyc2VFbGVtZW50TGlzdFs6XSArIFsgc2VsZiBdDQogICAgICAgIGZvciBlIGluIHNlbGYuZXhwcnM6DQogICAgICAgICAgICBlLmNoZWNrUmVjdXJzaW9uKCBzdWJSZWNDaGVja0xpc3QgKQ0KDQoNCmNsYXNzIE1hdGNoRmlyc3QoUGFyc2VFeHByZXNzaW9uKToNCiAgICAiIiINCiAgICBSZXF1aXJlcyB0aGF0IGF0IGxlYXN0IG9uZSBDe1BhcnNlRXhwcmVzc2lvbn0gaXMgZm91bmQuDQogICAgSWYgdHdvIGV4cHJlc3Npb25zIG1hdGNoLCB0aGUgZmlyc3Qgb25lIGxpc3RlZCBpcyB0aGUgb25lIHRoYXQgd2lsbCBtYXRjaC4NCiAgICBNYXkgYmUgY29uc3RydWN0ZWQgdXNpbmcgdGhlIEN7J3wnfSBvcGVyYXRvci4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICAjIGNvbnN0cnVjdCBNYXRjaEZpcnN0IHVzaW5nICd8JyBvcGVyYXRvcg0KICAgICAgICANCiAgICAgICAgIyB3YXRjaCB0aGUgb3JkZXIgb2YgZXhwcmVzc2lvbnMgdG8gbWF0Y2gNCiAgICAgICAgbnVtYmVyID0gV29yZChudW1zKSB8IENvbWJpbmUoV29yZChudW1zKSArICcuJyArIFdvcmQobnVtcykpDQogICAgICAgIHByaW50KG51bWJlci5zZWFyY2hTdHJpbmcoIjEyMyAzLjE0MTYgNzg5IikpICMgIEZhaWwhIC0+IFtbJzEyMyddLCBbJzMnXSwgWycxNDE2J10sIFsnNzg5J11dDQoNCiAgICAgICAgIyBwdXQgbW9yZSBzZWxlY3RpdmUgZXhwcmVzc2lvbiBmaXJzdA0KICAgICAgICBudW1iZXIgPSBDb21iaW5lKFdvcmQobnVtcykgKyAnLicgKyBXb3JkKG51bXMpKSB8IFdvcmQobnVtcykNCiAgICAgICAgcHJpbnQobnVtYmVyLnNlYXJjaFN0cmluZygiMTIzIDMuMTQxNiA3ODkiKSkgIyAgQmV0dGVyIC0+IFtbJzEyMyddLCBbJzMuMTQxNiddLCBbJzc4OSddXQ0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwcnMsIHNhdmVsaXN0ID0gRmFsc2UgKToNCiAgICAgICAgc3VwZXIoTWF0Y2hGaXJzdCxzZWxmKS5fX2luaXRfXyhleHBycywgc2F2ZWxpc3QpDQogICAgICAgIGlmIHNlbGYuZXhwcnM6DQogICAgICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gYW55KGUubWF5UmV0dXJuRW1wdHkgZm9yIGUgaW4gc2VsZi5leHBycykNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBUcnVlDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBtYXhFeGNMb2MgPSAtMQ0KICAgICAgICBtYXhFeGNlcHRpb24gPSBOb25lDQogICAgICAgIGZvciBlIGluIHNlbGYuZXhwcnM6DQogICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgcmV0ID0gZS5fcGFyc2UoIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucyApDQogICAgICAgICAgICAgICAgcmV0dXJuIHJldA0KICAgICAgICAgICAgZXhjZXB0IFBhcnNlRXhjZXB0aW9uIGFzIGVycjoNCiAgICAgICAgICAgICAgICBpZiBlcnIubG9jID4gbWF4RXhjTG9jOg0KICAgICAgICAgICAgICAgICAgICBtYXhFeGNlcHRpb24gPSBlcnINCiAgICAgICAgICAgICAgICAgICAgbWF4RXhjTG9jID0gZXJyLmxvYw0KICAgICAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6DQogICAgICAgICAgICAgICAgaWYgbGVuKGluc3RyaW5nKSA+IG1heEV4Y0xvYzoNCiAgICAgICAgICAgICAgICAgICAgbWF4RXhjZXB0aW9uID0gUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsbGVuKGluc3RyaW5nKSxlLmVycm1zZyxzZWxmKQ0KICAgICAgICAgICAgICAgICAgICBtYXhFeGNMb2MgPSBsZW4oaW5zdHJpbmcpDQoNCiAgICAgICAgIyBvbmx5IGdvdCBoZXJlIGlmIG5vIGV4cHJlc3Npb24gbWF0Y2hlZCwgcmFpc2UgZXhjZXB0aW9uIGZvciBtYXRjaCB0aGF0IG1hZGUgaXQgdGhlIGZ1cnRoZXN0DQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBpZiBtYXhFeGNlcHRpb24gaXMgbm90IE5vbmU6DQogICAgICAgICAgICAgICAgbWF4RXhjZXB0aW9uLm1zZyA9IHNlbGYuZXJybXNnDQogICAgICAgICAgICAgICAgcmFpc2UgbWF4RXhjZXB0aW9uDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsICJubyBkZWZpbmVkIGFsdGVybmF0aXZlcyB0byBtYXRjaCIsIHNlbGYpDQoNCiAgICBkZWYgX19pb3JfXyhzZWxmLCBvdGhlciApOg0KICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOg0KICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIG90aGVyICkNCiAgICAgICAgcmV0dXJuIHNlbGYuYXBwZW5kKCBvdGhlciApICNNYXRjaEZpcnN0KCBbIHNlbGYsIG90aGVyIF0gKQ0KDQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgaWYgaGFzYXR0cihzZWxmLCJuYW1lIik6DQogICAgICAgICAgICByZXR1cm4gc2VsZi5uYW1lDQoNCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6DQogICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAieyIgKyAiIHwgIi5qb2luKF91c3RyKGUpIGZvciBlIGluIHNlbGYuZXhwcnMpICsgIn0iDQoNCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcg0KDQogICAgZGVmIGNoZWNrUmVjdXJzaW9uKCBzZWxmLCBwYXJzZUVsZW1lbnRMaXN0ICk6DQogICAgICAgIHN1YlJlY0NoZWNrTGlzdCA9IHBhcnNlRWxlbWVudExpc3RbOl0gKyBbIHNlbGYgXQ0KICAgICAgICBmb3IgZSBpbiBzZWxmLmV4cHJzOg0KICAgICAgICAgICAgZS5jaGVja1JlY3Vyc2lvbiggc3ViUmVjQ2hlY2tMaXN0ICkNCg0KDQpjbGFzcyBFYWNoKFBhcnNlRXhwcmVzc2lvbik6DQogICAgIiIiDQogICAgUmVxdWlyZXMgYWxsIGdpdmVuIEN7UGFyc2VFeHByZXNzaW9ufXMgdG8gYmUgZm91bmQsIGJ1dCBpbiBhbnkgb3JkZXIuDQogICAgRXhwcmVzc2lvbnMgbWF5IGJlIHNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlLg0KICAgIE1heSBiZSBjb25zdHJ1Y3RlZCB1c2luZyB0aGUgQ3snJid9IG9wZXJhdG9yLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIGNvbG9yID0gb25lT2YoIlJFRCBPUkFOR0UgWUVMTE9XIEdSRUVOIEJMVUUgUFVSUExFIEJMQUNLIFdISVRFIEJST1dOIikNCiAgICAgICAgc2hhcGVfdHlwZSA9IG9uZU9mKCJTUVVBUkUgQ0lSQ0xFIFRSSUFOR0xFIFNUQVIgSEVYQUdPTiBPQ1RBR09OIikNCiAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykNCiAgICAgICAgc2hhcGVfYXR0ciA9ICJzaGFwZToiICsgc2hhcGVfdHlwZSgic2hhcGUiKQ0KICAgICAgICBwb3NuX2F0dHIgPSAicG9zbjoiICsgR3JvdXAoaW50ZWdlcigieCIpICsgJywnICsgaW50ZWdlcigieSIpKSgicG9zbiIpDQogICAgICAgIGNvbG9yX2F0dHIgPSAiY29sb3I6IiArIGNvbG9yKCJjb2xvciIpDQogICAgICAgIHNpemVfYXR0ciA9ICJzaXplOiIgKyBpbnRlZ2VyKCJzaXplIikNCg0KICAgICAgICAjIHVzZSBFYWNoICh1c2luZyBvcGVyYXRvciAnJicpIHRvIGFjY2VwdCBhdHRyaWJ1dGVzIGluIGFueSBvcmRlciANCiAgICAgICAgIyAoc2hhcGUgYW5kIHBvc24gYXJlIHJlcXVpcmVkLCBjb2xvciBhbmQgc2l6ZSBhcmUgb3B0aW9uYWwpDQogICAgICAgIHNoYXBlX3NwZWMgPSBzaGFwZV9hdHRyICYgcG9zbl9hdHRyICYgT3B0aW9uYWwoY29sb3JfYXR0cikgJiBPcHRpb25hbChzaXplX2F0dHIpDQoNCiAgICAgICAgc2hhcGVfc3BlYy5ydW5UZXN0cygnJycNCiAgICAgICAgICAgIHNoYXBlOiBTUVVBUkUgY29sb3I6IEJMQUNLIHBvc246IDEwMCwgMTIwDQogICAgICAgICAgICBzaGFwZTogQ0lSQ0xFIHNpemU6IDUwIGNvbG9yOiBCTFVFIHBvc246IDUwLDgwDQogICAgICAgICAgICBjb2xvcjpHUkVFTiBzaXplOjIwIHNoYXBlOlRSSUFOR0xFIHBvc246MjAsNDANCiAgICAgICAgICAgICcnJw0KICAgICAgICAgICAgKQ0KICAgIHByaW50czo6DQogICAgICAgIHNoYXBlOiBTUVVBUkUgY29sb3I6IEJMQUNLIHBvc246IDEwMCwgMTIwDQogICAgICAgIFsnc2hhcGU6JywgJ1NRVUFSRScsICdjb2xvcjonLCAnQkxBQ0snLCAncG9zbjonLCBbJzEwMCcsICcsJywgJzEyMCddXQ0KICAgICAgICAtIGNvbG9yOiBCTEFDSw0KICAgICAgICAtIHBvc246IFsnMTAwJywgJywnLCAnMTIwJ10NCiAgICAgICAgICAtIHg6IDEwMA0KICAgICAgICAgIC0geTogMTIwDQogICAgICAgIC0gc2hhcGU6IFNRVUFSRQ0KDQoNCiAgICAgICAgc2hhcGU6IENJUkNMRSBzaXplOiA1MCBjb2xvcjogQkxVRSBwb3NuOiA1MCw4MA0KICAgICAgICBbJ3NoYXBlOicsICdDSVJDTEUnLCAnc2l6ZTonLCAnNTAnLCAnY29sb3I6JywgJ0JMVUUnLCAncG9zbjonLCBbJzUwJywgJywnLCAnODAnXV0NCiAgICAgICAgLSBjb2xvcjogQkxVRQ0KICAgICAgICAtIHBvc246IFsnNTAnLCAnLCcsICc4MCddDQogICAgICAgICAgLSB4OiA1MA0KICAgICAgICAgIC0geTogODANCiAgICAgICAgLSBzaGFwZTogQ0lSQ0xFDQogICAgICAgIC0gc2l6ZTogNTANCg0KDQogICAgICAgIGNvbG9yOiBHUkVFTiBzaXplOiAyMCBzaGFwZTogVFJJQU5HTEUgcG9zbjogMjAsNDANCiAgICAgICAgWydjb2xvcjonLCAnR1JFRU4nLCAnc2l6ZTonLCAnMjAnLCAnc2hhcGU6JywgJ1RSSUFOR0xFJywgJ3Bvc246JywgWycyMCcsICcsJywgJzQwJ11dDQogICAgICAgIC0gY29sb3I6IEdSRUVODQogICAgICAgIC0gcG9zbjogWycyMCcsICcsJywgJzQwJ10NCiAgICAgICAgICAtIHg6IDIwDQogICAgICAgICAgLSB5OiA0MA0KICAgICAgICAtIHNoYXBlOiBUUklBTkdMRQ0KICAgICAgICAtIHNpemU6IDIwDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHBycywgc2F2ZWxpc3QgPSBUcnVlICk6DQogICAgICAgIHN1cGVyKEVhY2gsc2VsZikuX19pbml0X18oZXhwcnMsIHNhdmVsaXN0KQ0KICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gYWxsKGUubWF5UmV0dXJuRW1wdHkgZm9yIGUgaW4gc2VsZi5leHBycykNCiAgICAgICAgc2VsZi5za2lwV2hpdGVzcGFjZSA9IFRydWUNCiAgICAgICAgc2VsZi5pbml0RXhwckdyb3VwcyA9IFRydWUNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIGlmIHNlbGYuaW5pdEV4cHJHcm91cHM6DQogICAgICAgICAgICBzZWxmLm9wdDFtYXAgPSBkaWN0KChpZChlLmV4cHIpLGUpIGZvciBlIGluIHNlbGYuZXhwcnMgaWYgaXNpbnN0YW5jZShlLE9wdGlvbmFsKSkNCiAgICAgICAgICAgIG9wdDEgPSBbIGUuZXhwciBmb3IgZSBpbiBzZWxmLmV4cHJzIGlmIGlzaW5zdGFuY2UoZSxPcHRpb25hbCkgXQ0KICAgICAgICAgICAgb3B0MiA9IFsgZSBmb3IgZSBpbiBzZWxmLmV4cHJzIGlmIGUubWF5UmV0dXJuRW1wdHkgYW5kIG5vdCBpc2luc3RhbmNlKGUsT3B0aW9uYWwpXQ0KICAgICAgICAgICAgc2VsZi5vcHRpb25hbHMgPSBvcHQxICsgb3B0Mg0KICAgICAgICAgICAgc2VsZi5tdWx0aW9wdGlvbmFscyA9IFsgZS5leHByIGZvciBlIGluIHNlbGYuZXhwcnMgaWYgaXNpbnN0YW5jZShlLFplcm9Pck1vcmUpIF0NCiAgICAgICAgICAgIHNlbGYubXVsdGlyZXF1aXJlZCA9IFsgZS5leHByIGZvciBlIGluIHNlbGYuZXhwcnMgaWYgaXNpbnN0YW5jZShlLE9uZU9yTW9yZSkgXQ0KICAgICAgICAgICAgc2VsZi5yZXF1aXJlZCA9IFsgZSBmb3IgZSBpbiBzZWxmLmV4cHJzIGlmIG5vdCBpc2luc3RhbmNlKGUsKE9wdGlvbmFsLFplcm9Pck1vcmUsT25lT3JNb3JlKSkgXQ0KICAgICAgICAgICAgc2VsZi5yZXF1aXJlZCArPSBzZWxmLm11bHRpcmVxdWlyZWQNCiAgICAgICAgICAgIHNlbGYuaW5pdEV4cHJHcm91cHMgPSBGYWxzZQ0KICAgICAgICB0bXBMb2MgPSBsb2MNCiAgICAgICAgdG1wUmVxZCA9IHNlbGYucmVxdWlyZWRbOl0NCiAgICAgICAgdG1wT3B0ICA9IHNlbGYub3B0aW9uYWxzWzpdDQogICAgICAgIG1hdGNoT3JkZXIgPSBbXQ0KDQogICAgICAgIGtlZXBNYXRjaGluZyA9IFRydWUNCiAgICAgICAgd2hpbGUga2VlcE1hdGNoaW5nOg0KICAgICAgICAgICAgdG1wRXhwcnMgPSB0bXBSZXFkICsgdG1wT3B0ICsgc2VsZi5tdWx0aW9wdGlvbmFscyArIHNlbGYubXVsdGlyZXF1aXJlZA0KICAgICAgICAgICAgZmFpbGVkID0gW10NCiAgICAgICAgICAgIGZvciBlIGluIHRtcEV4cHJzOg0KICAgICAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICAgICAgdG1wTG9jID0gZS50cnlQYXJzZSggaW5zdHJpbmcsIHRtcExvYyApDQogICAgICAgICAgICAgICAgZXhjZXB0IFBhcnNlRXhjZXB0aW9uOg0KICAgICAgICAgICAgICAgICAgICBmYWlsZWQuYXBwZW5kKGUpDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgbWF0Y2hPcmRlci5hcHBlbmQoc2VsZi5vcHQxbWFwLmdldChpZChlKSxlKSkNCiAgICAgICAgICAgICAgICAgICAgaWYgZSBpbiB0bXBSZXFkOg0KICAgICAgICAgICAgICAgICAgICAgICAgdG1wUmVxZC5yZW1vdmUoZSkNCiAgICAgICAgICAgICAgICAgICAgZWxpZiBlIGluIHRtcE9wdDoNCiAgICAgICAgICAgICAgICAgICAgICAgIHRtcE9wdC5yZW1vdmUoZSkNCiAgICAgICAgICAgIGlmIGxlbihmYWlsZWQpID09IGxlbih0bXBFeHBycyk6DQogICAgICAgICAgICAgICAga2VlcE1hdGNoaW5nID0gRmFsc2UNCg0KICAgICAgICBpZiB0bXBSZXFkOg0KICAgICAgICAgICAgbWlzc2luZyA9ICIsICIuam9pbihfdXN0cihlKSBmb3IgZSBpbiB0bXBSZXFkKQ0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsbG9jLCJNaXNzaW5nIG9uZSBvciBtb3JlIHJlcXVpcmVkIGVsZW1lbnRzICglcykiICUgbWlzc2luZyApDQoNCiAgICAgICAgIyBhZGQgYW55IHVubWF0Y2hlZCBPcHRpb25hbHMsIGluIGNhc2UgdGhleSBoYXZlIGRlZmF1bHQgdmFsdWVzIGRlZmluZWQNCiAgICAgICAgbWF0Y2hPcmRlciArPSBbZSBmb3IgZSBpbiBzZWxmLmV4cHJzIGlmIGlzaW5zdGFuY2UoZSxPcHRpb25hbCkgYW5kIGUuZXhwciBpbiB0bXBPcHRdDQoNCiAgICAgICAgcmVzdWx0bGlzdCA9IFtdDQogICAgICAgIGZvciBlIGluIG1hdGNoT3JkZXI6DQogICAgICAgICAgICBsb2MscmVzdWx0cyA9IGUuX3BhcnNlKGluc3RyaW5nLGxvYyxkb0FjdGlvbnMpDQogICAgICAgICAgICByZXN1bHRsaXN0LmFwcGVuZChyZXN1bHRzKQ0KDQogICAgICAgIGZpbmFsUmVzdWx0cyA9IHN1bShyZXN1bHRsaXN0LCBQYXJzZVJlc3VsdHMoW10pKQ0KICAgICAgICByZXR1cm4gbG9jLCBmaW5hbFJlc3VsdHMNCg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIGlmIGhhc2F0dHIoc2VsZiwibmFtZSIpOg0KICAgICAgICAgICAgcmV0dXJuIHNlbGYubmFtZQ0KDQogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lOg0KICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gInsiICsgIiAmICIuam9pbihfdXN0cihlKSBmb3IgZSBpbiBzZWxmLmV4cHJzKSArICJ9Ig0KDQogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHINCg0KICAgIGRlZiBjaGVja1JlY3Vyc2lvbiggc2VsZiwgcGFyc2VFbGVtZW50TGlzdCApOg0KICAgICAgICBzdWJSZWNDaGVja0xpc3QgPSBwYXJzZUVsZW1lbnRMaXN0WzpdICsgWyBzZWxmIF0NCiAgICAgICAgZm9yIGUgaW4gc2VsZi5leHByczoNCiAgICAgICAgICAgIGUuY2hlY2tSZWN1cnNpb24oIHN1YlJlY0NoZWNrTGlzdCApDQoNCg0KY2xhc3MgUGFyc2VFbGVtZW50RW5oYW5jZShQYXJzZXJFbGVtZW50KToNCiAgICAiIiINCiAgICBBYnN0cmFjdCBzdWJjbGFzcyBvZiBDe1BhcnNlckVsZW1lbnR9LCBmb3IgY29tYmluaW5nIGFuZCBwb3N0LXByb2Nlc3NpbmcgcGFyc2VkIHRva2Vucy4NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHIsIHNhdmVsaXN0PUZhbHNlICk6DQogICAgICAgIHN1cGVyKFBhcnNlRWxlbWVudEVuaGFuY2Usc2VsZikuX19pbml0X18oc2F2ZWxpc3QpDQogICAgICAgIGlmIGlzaW5zdGFuY2UoIGV4cHIsIGJhc2VzdHJpbmcgKToNCiAgICAgICAgICAgIGlmIGlzc3ViY2xhc3MoUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzLCBUb2tlbik6DQogICAgICAgICAgICAgICAgZXhwciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyhleHByKQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICBleHByID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKExpdGVyYWwoZXhwcikpDQogICAgICAgIHNlbGYuZXhwciA9IGV4cHINCiAgICAgICAgc2VsZi5zdHJSZXByID0gTm9uZQ0KICAgICAgICBpZiBleHByIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gZXhwci5tYXlJbmRleEVycm9yDQogICAgICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gZXhwci5tYXlSZXR1cm5FbXB0eQ0KICAgICAgICAgICAgc2VsZi5zZXRXaGl0ZXNwYWNlQ2hhcnMoIGV4cHIud2hpdGVDaGFycyApDQogICAgICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gZXhwci5za2lwV2hpdGVzcGFjZQ0KICAgICAgICAgICAgc2VsZi5zYXZlQXNMaXN0ID0gZXhwci5zYXZlQXNMaXN0DQogICAgICAgICAgICBzZWxmLmNhbGxQcmVwYXJzZSA9IGV4cHIuY2FsbFByZXBhcnNlDQogICAgICAgICAgICBzZWxmLmlnbm9yZUV4cHJzLmV4dGVuZChleHByLmlnbm9yZUV4cHJzKQ0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgaWYgc2VsZi5leHByIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgcmV0dXJuIHNlbGYuZXhwci5fcGFyc2UoIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucywgY2FsbFByZVBhcnNlPUZhbHNlICkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKCIiLGxvYyxzZWxmLmVycm1zZyxzZWxmKQ0KDQogICAgZGVmIGxlYXZlV2hpdGVzcGFjZSggc2VsZiApOg0KICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gRmFsc2UNCiAgICAgICAgc2VsZi5leHByID0gc2VsZi5leHByLmNvcHkoKQ0KICAgICAgICBpZiBzZWxmLmV4cHIgaXMgbm90IE5vbmU6DQogICAgICAgICAgICBzZWxmLmV4cHIubGVhdmVXaGl0ZXNwYWNlKCkNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBpZ25vcmUoIHNlbGYsIG90aGVyICk6DQogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBTdXBwcmVzcyApOg0KICAgICAgICAgICAgaWYgb3RoZXIgbm90IGluIHNlbGYuaWdub3JlRXhwcnM6DQogICAgICAgICAgICAgICAgc3VwZXIoIFBhcnNlRWxlbWVudEVuaGFuY2UsIHNlbGYpLmlnbm9yZSggb3RoZXIgKQ0KICAgICAgICAgICAgICAgIGlmIHNlbGYuZXhwciBpcyBub3QgTm9uZToNCiAgICAgICAgICAgICAgICAgICAgc2VsZi5leHByLmlnbm9yZSggc2VsZi5pZ25vcmVFeHByc1stMV0gKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgc3VwZXIoIFBhcnNlRWxlbWVudEVuaGFuY2UsIHNlbGYpLmlnbm9yZSggb3RoZXIgKQ0KICAgICAgICAgICAgaWYgc2VsZi5leHByIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgICAgIHNlbGYuZXhwci5pZ25vcmUoIHNlbGYuaWdub3JlRXhwcnNbLTFdICkNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBzdHJlYW1saW5lKCBzZWxmICk6DQogICAgICAgIHN1cGVyKFBhcnNlRWxlbWVudEVuaGFuY2Usc2VsZikuc3RyZWFtbGluZSgpDQogICAgICAgIGlmIHNlbGYuZXhwciBpcyBub3QgTm9uZToNCiAgICAgICAgICAgIHNlbGYuZXhwci5zdHJlYW1saW5lKCkNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBjaGVja1JlY3Vyc2lvbiggc2VsZiwgcGFyc2VFbGVtZW50TGlzdCApOg0KICAgICAgICBpZiBzZWxmIGluIHBhcnNlRWxlbWVudExpc3Q6DQogICAgICAgICAgICByYWlzZSBSZWN1cnNpdmVHcmFtbWFyRXhjZXB0aW9uKCBwYXJzZUVsZW1lbnRMaXN0K1tzZWxmXSApDQogICAgICAgIHN1YlJlY0NoZWNrTGlzdCA9IHBhcnNlRWxlbWVudExpc3RbOl0gKyBbIHNlbGYgXQ0KICAgICAgICBpZiBzZWxmLmV4cHIgaXMgbm90IE5vbmU6DQogICAgICAgICAgICBzZWxmLmV4cHIuY2hlY2tSZWN1cnNpb24oIHN1YlJlY0NoZWNrTGlzdCApDQoNCiAgICBkZWYgdmFsaWRhdGUoIHNlbGYsIHZhbGlkYXRlVHJhY2U9W10gKToNCiAgICAgICAgdG1wID0gdmFsaWRhdGVUcmFjZVs6XStbc2VsZl0NCiAgICAgICAgaWYgc2VsZi5leHByIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgc2VsZi5leHByLnZhbGlkYXRlKHRtcCkNCiAgICAgICAgc2VsZi5jaGVja1JlY3Vyc2lvbiggW10gKQ0KDQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgcmV0dXJuIHN1cGVyKFBhcnNlRWxlbWVudEVuaGFuY2Usc2VsZikuX19zdHJfXygpDQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246DQogICAgICAgICAgICBwYXNzDQoNCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmUgYW5kIHNlbGYuZXhwciBpcyBub3QgTm9uZToNCiAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICIlczooJXMpIiAlICggc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIF91c3RyKHNlbGYuZXhwcikgKQ0KICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByDQoNCg0KY2xhc3MgRm9sbG93ZWRCeShQYXJzZUVsZW1lbnRFbmhhbmNlKToNCiAgICAiIiINCiAgICBMb29rYWhlYWQgbWF0Y2hpbmcgb2YgdGhlIGdpdmVuIHBhcnNlIGV4cHJlc3Npb24uICBDe0ZvbGxvd2VkQnl9DQogICAgZG9lcyBJe25vdH0gYWR2YW5jZSB0aGUgcGFyc2luZyBwb3NpdGlvbiB3aXRoaW4gdGhlIGlucHV0IHN0cmluZywgaXQgb25seQ0KICAgIHZlcmlmaWVzIHRoYXQgdGhlIHNwZWNpZmllZCBwYXJzZSBleHByZXNzaW9uIG1hdGNoZXMgYXQgdGhlIGN1cnJlbnQNCiAgICBwb3NpdGlvbi4gIEN7Rm9sbG93ZWRCeX0gYWx3YXlzIHJldHVybnMgYSBudWxsIHRva2VuIGxpc3QuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgIyB1c2UgRm9sbG93ZWRCeSB0byBtYXRjaCBhIGxhYmVsIG9ubHkgaWYgaXQgaXMgZm9sbG93ZWQgYnkgYSAnOicNCiAgICAgICAgZGF0YV93b3JkID0gV29yZChhbHBoYXMpDQogICAgICAgIGxhYmVsID0gZGF0YV93b3JkICsgRm9sbG93ZWRCeSgnOicpDQogICAgICAgIGF0dHJfZXhwciA9IEdyb3VwKGxhYmVsICsgU3VwcHJlc3MoJzonKSArIE9uZU9yTW9yZShkYXRhX3dvcmQsIHN0b3BPbj1sYWJlbCkuc2V0UGFyc2VBY3Rpb24oJyAnLmpvaW4pKQ0KICAgICAgICANCiAgICAgICAgT25lT3JNb3JlKGF0dHJfZXhwcikucGFyc2VTdHJpbmcoInNoYXBlOiBTUVVBUkUgY29sb3I6IEJMQUNLIHBvc246IHVwcGVyIGxlZnQiKS5wcHJpbnQoKQ0KICAgIHByaW50czo6DQogICAgICAgIFtbJ3NoYXBlJywgJ1NRVUFSRSddLCBbJ2NvbG9yJywgJ0JMQUNLJ10sIFsncG9zbicsICd1cHBlciBsZWZ0J11dDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHByICk6DQogICAgICAgIHN1cGVyKEZvbGxvd2VkQnksc2VsZikuX19pbml0X18oZXhwcikNCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIHNlbGYuZXhwci50cnlQYXJzZSggaW5zdHJpbmcsIGxvYyApDQogICAgICAgIHJldHVybiBsb2MsIFtdDQoNCg0KY2xhc3MgTm90QW55KFBhcnNlRWxlbWVudEVuaGFuY2UpOg0KICAgICIiIg0KICAgIExvb2thaGVhZCB0byBkaXNhbGxvdyBtYXRjaGluZyB3aXRoIHRoZSBnaXZlbiBwYXJzZSBleHByZXNzaW9uLiAgQ3tOb3RBbnl9DQogICAgZG9lcyBJe25vdH0gYWR2YW5jZSB0aGUgcGFyc2luZyBwb3NpdGlvbiB3aXRoaW4gdGhlIGlucHV0IHN0cmluZywgaXQgb25seQ0KICAgIHZlcmlmaWVzIHRoYXQgdGhlIHNwZWNpZmllZCBwYXJzZSBleHByZXNzaW9uIGRvZXMgSXtub3R9IG1hdGNoIGF0IHRoZSBjdXJyZW50DQogICAgcG9zaXRpb24uICBBbHNvLCBDe05vdEFueX0gZG9lcyBJe25vdH0gc2tpcCBvdmVyIGxlYWRpbmcgd2hpdGVzcGFjZS4gQ3tOb3RBbnl9DQogICAgYWx3YXlzIHJldHVybnMgYSBudWxsIHRva2VuIGxpc3QuICBNYXkgYmUgY29uc3RydWN0ZWQgdXNpbmcgdGhlICd+JyBvcGVyYXRvci4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICANCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHIgKToNCiAgICAgICAgc3VwZXIoTm90QW55LHNlbGYpLl9faW5pdF9fKGV4cHIpDQogICAgICAgICN+IHNlbGYubGVhdmVXaGl0ZXNwYWNlKCkNCiAgICAgICAgc2VsZi5za2lwV2hpdGVzcGFjZSA9IEZhbHNlICAjIGRvIE5PVCB1c2Ugc2VsZi5sZWF2ZVdoaXRlc3BhY2UoKSwgZG9uJ3Qgd2FudCB0byBwcm9wYWdhdGUgdG8gZXhwcnMNCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRm91bmQgdW53YW50ZWQgdG9rZW4sICIrX3VzdHIoc2VsZi5leHByKQ0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgaWYgc2VsZi5leHByLmNhblBhcnNlTmV4dChpbnN0cmluZywgbG9jKToNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KICAgICAgICByZXR1cm4gbG9jLCBbXQ0KDQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgaWYgaGFzYXR0cihzZWxmLCJuYW1lIik6DQogICAgICAgICAgICByZXR1cm4gc2VsZi5uYW1lDQoNCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6DQogICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAifnsiICsgX3VzdHIoc2VsZi5leHByKSArICJ9Ig0KDQogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHINCg0KY2xhc3MgX011bHRpcGxlTWF0Y2goUGFyc2VFbGVtZW50RW5oYW5jZSk6DQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHByLCBzdG9wT249Tm9uZSk6DQogICAgICAgIHN1cGVyKF9NdWx0aXBsZU1hdGNoLCBzZWxmKS5fX2luaXRfXyhleHByKQ0KICAgICAgICBzZWxmLnNhdmVBc0xpc3QgPSBUcnVlDQogICAgICAgIGVuZGVyID0gc3RvcE9uDQogICAgICAgIGlmIGlzaW5zdGFuY2UoZW5kZXIsIGJhc2VzdHJpbmcpOg0KICAgICAgICAgICAgZW5kZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoZW5kZXIpDQogICAgICAgIHNlbGYubm90X2VuZGVyID0gfmVuZGVyIGlmIGVuZGVyIGlzIG5vdCBOb25lIGVsc2UgTm9uZQ0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgc2VsZl9leHByX3BhcnNlID0gc2VsZi5leHByLl9wYXJzZQ0KICAgICAgICBzZWxmX3NraXBfaWdub3JhYmxlcyA9IHNlbGYuX3NraXBJZ25vcmFibGVzDQogICAgICAgIGNoZWNrX2VuZGVyID0gc2VsZi5ub3RfZW5kZXIgaXMgbm90IE5vbmUNCiAgICAgICAgaWYgY2hlY2tfZW5kZXI6DQogICAgICAgICAgICB0cnlfbm90X2VuZGVyID0gc2VsZi5ub3RfZW5kZXIudHJ5UGFyc2UNCiAgICAgICAgDQogICAgICAgICMgbXVzdCBiZSBhdCBsZWFzdCBvbmUgKGJ1dCBmaXJzdCBzZWUgaWYgd2UgYXJlIHRoZSBzdG9wT24gc2VudGluZWw7DQogICAgICAgICMgaWYgc28sIGZhaWwpDQogICAgICAgIGlmIGNoZWNrX2VuZGVyOg0KICAgICAgICAgICAgdHJ5X25vdF9lbmRlcihpbnN0cmluZywgbG9jKQ0KICAgICAgICBsb2MsIHRva2VucyA9IHNlbGZfZXhwcl9wYXJzZSggaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zLCBjYWxsUHJlUGFyc2U9RmFsc2UgKQ0KICAgICAgICB0cnk6DQogICAgICAgICAgICBoYXNJZ25vcmVFeHBycyA9IChub3Qgbm90IHNlbGYuaWdub3JlRXhwcnMpDQogICAgICAgICAgICB3aGlsZSAxOg0KICAgICAgICAgICAgICAgIGlmIGNoZWNrX2VuZGVyOg0KICAgICAgICAgICAgICAgICAgICB0cnlfbm90X2VuZGVyKGluc3RyaW5nLCBsb2MpDQogICAgICAgICAgICAgICAgaWYgaGFzSWdub3JlRXhwcnM6DQogICAgICAgICAgICAgICAgICAgIHByZWxvYyA9IHNlbGZfc2tpcF9pZ25vcmFibGVzKCBpbnN0cmluZywgbG9jICkNCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICBwcmVsb2MgPSBsb2MNCiAgICAgICAgICAgICAgICBsb2MsIHRtcHRva2VucyA9IHNlbGZfZXhwcl9wYXJzZSggaW5zdHJpbmcsIHByZWxvYywgZG9BY3Rpb25zICkNCiAgICAgICAgICAgICAgICBpZiB0bXB0b2tlbnMgb3IgdG1wdG9rZW5zLmhhc2tleXMoKToNCiAgICAgICAgICAgICAgICAgICAgdG9rZW5zICs9IHRtcHRva2Vucw0KICAgICAgICBleGNlcHQgKFBhcnNlRXhjZXB0aW9uLEluZGV4RXJyb3IpOg0KICAgICAgICAgICAgcGFzcw0KDQogICAgICAgIHJldHVybiBsb2MsIHRva2Vucw0KICAgICAgICANCmNsYXNzIE9uZU9yTW9yZShfTXVsdGlwbGVNYXRjaCk6DQogICAgIiIiDQogICAgUmVwZXRpdGlvbiBvZiBvbmUgb3IgbW9yZSBvZiB0aGUgZ2l2ZW4gZXhwcmVzc2lvbi4NCiAgICANCiAgICBQYXJhbWV0ZXJzOg0KICAgICAtIGV4cHIgLSBleHByZXNzaW9uIHRoYXQgbXVzdCBtYXRjaCBvbmUgb3IgbW9yZSB0aW1lcw0KICAgICAtIHN0b3BPbiAtIChkZWZhdWx0PUN7Tm9uZX0pIC0gZXhwcmVzc2lvbiBmb3IgYSB0ZXJtaW5hdGluZyBzZW50aW5lbA0KICAgICAgICAgIChvbmx5IHJlcXVpcmVkIGlmIHRoZSBzZW50aW5lbCB3b3VsZCBvcmRpbmFyaWx5IG1hdGNoIHRoZSByZXBldGl0aW9uIA0KICAgICAgICAgIGV4cHJlc3Npb24pICAgICAgICAgIA0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIGRhdGFfd29yZCA9IFdvcmQoYWxwaGFzKQ0KICAgICAgICBsYWJlbCA9IGRhdGFfd29yZCArIEZvbGxvd2VkQnkoJzonKQ0KICAgICAgICBhdHRyX2V4cHIgPSBHcm91cChsYWJlbCArIFN1cHByZXNzKCc6JykgKyBPbmVPck1vcmUoZGF0YV93b3JkKS5zZXRQYXJzZUFjdGlvbignICcuam9pbikpDQoNCiAgICAgICAgdGV4dCA9ICJzaGFwZTogU1FVQVJFIHBvc246IHVwcGVyIGxlZnQgY29sb3I6IEJMQUNLIg0KICAgICAgICBPbmVPck1vcmUoYXR0cl9leHByKS5wYXJzZVN0cmluZyh0ZXh0KS5wcHJpbnQoKSAgIyBGYWlsISByZWFkICdjb2xvcicgYXMgZGF0YSBpbnN0ZWFkIG9mIG5leHQgbGFiZWwgLT4gW1snc2hhcGUnLCAnU1FVQVJFIGNvbG9yJ11dDQoNCiAgICAgICAgIyB1c2Ugc3RvcE9uIGF0dHJpYnV0ZSBmb3IgT25lT3JNb3JlIHRvIGF2b2lkIHJlYWRpbmcgbGFiZWwgc3RyaW5nIGFzIHBhcnQgb2YgdGhlIGRhdGENCiAgICAgICAgYXR0cl9leHByID0gR3JvdXAobGFiZWwgKyBTdXBwcmVzcygnOicpICsgT25lT3JNb3JlKGRhdGFfd29yZCwgc3RvcE9uPWxhYmVsKS5zZXRQYXJzZUFjdGlvbignICcuam9pbikpDQogICAgICAgIE9uZU9yTW9yZShhdHRyX2V4cHIpLnBhcnNlU3RyaW5nKHRleHQpLnBwcmludCgpICMgQmV0dGVyIC0+IFtbJ3NoYXBlJywgJ1NRVUFSRSddLCBbJ3Bvc24nLCAndXBwZXIgbGVmdCddLCBbJ2NvbG9yJywgJ0JMQUNLJ11dDQogICAgICAgIA0KICAgICAgICAjIGNvdWxkIGFsc28gYmUgd3JpdHRlbiBhcw0KICAgICAgICAoYXR0cl9leHByICogKDEsKSkucGFyc2VTdHJpbmcodGV4dCkucHByaW50KCkNCiAgICAiIiINCg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIGlmIGhhc2F0dHIoc2VsZiwibmFtZSIpOg0KICAgICAgICAgICAgcmV0dXJuIHNlbGYubmFtZQ0KDQogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lOg0KICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gInsiICsgX3VzdHIoc2VsZi5leHByKSArICJ9Li4uIg0KDQogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHINCg0KY2xhc3MgWmVyb09yTW9yZShfTXVsdGlwbGVNYXRjaCk6DQogICAgIiIiDQogICAgT3B0aW9uYWwgcmVwZXRpdGlvbiBvZiB6ZXJvIG9yIG1vcmUgb2YgdGhlIGdpdmVuIGV4cHJlc3Npb24uDQogICAgDQogICAgUGFyYW1ldGVyczoNCiAgICAgLSBleHByIC0gZXhwcmVzc2lvbiB0aGF0IG11c3QgbWF0Y2ggemVybyBvciBtb3JlIHRpbWVzDQogICAgIC0gc3RvcE9uIC0gKGRlZmF1bHQ9Q3tOb25lfSkgLSBleHByZXNzaW9uIGZvciBhIHRlcm1pbmF0aW5nIHNlbnRpbmVsDQogICAgICAgICAgKG9ubHkgcmVxdWlyZWQgaWYgdGhlIHNlbnRpbmVsIHdvdWxkIG9yZGluYXJpbHkgbWF0Y2ggdGhlIHJlcGV0aXRpb24gDQogICAgICAgICAgZXhwcmVzc2lvbikgICAgICAgICAgDQoNCiAgICBFeGFtcGxlOiBzaW1pbGFyIHRvIEx7T25lT3JNb3JlfQ0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwciwgc3RvcE9uPU5vbmUpOg0KICAgICAgICBzdXBlcihaZXJvT3JNb3JlLHNlbGYpLl9faW5pdF9fKGV4cHIsIHN0b3BPbj1zdG9wT24pDQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBUcnVlDQogICAgICAgIA0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHJldHVybiBzdXBlcihaZXJvT3JNb3JlLCBzZWxmKS5wYXJzZUltcGwoaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zKQ0KICAgICAgICBleGNlcHQgKFBhcnNlRXhjZXB0aW9uLEluZGV4RXJyb3IpOg0KICAgICAgICAgICAgcmV0dXJuIGxvYywgW10NCg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIGlmIGhhc2F0dHIoc2VsZiwibmFtZSIpOg0KICAgICAgICAgICAgcmV0dXJuIHNlbGYubmFtZQ0KDQogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lOg0KICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gIlsiICsgX3VzdHIoc2VsZi5leHByKSArICJdLi4uIg0KDQogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHINCg0KY2xhc3MgX051bGxUb2tlbihvYmplY3QpOg0KICAgIGRlZiBfX2Jvb2xfXyhzZWxmKToNCiAgICAgICAgcmV0dXJuIEZhbHNlDQogICAgX19ub256ZXJvX18gPSBfX2Jvb2xfXw0KICAgIGRlZiBfX3N0cl9fKHNlbGYpOg0KICAgICAgICByZXR1cm4gIiINCg0KX29wdGlvbmFsTm90TWF0Y2hlZCA9IF9OdWxsVG9rZW4oKQ0KY2xhc3MgT3B0aW9uYWwoUGFyc2VFbGVtZW50RW5oYW5jZSk6DQogICAgIiIiDQogICAgT3B0aW9uYWwgbWF0Y2hpbmcgb2YgdGhlIGdpdmVuIGV4cHJlc3Npb24uDQoNCiAgICBQYXJhbWV0ZXJzOg0KICAgICAtIGV4cHIgLSBleHByZXNzaW9uIHRoYXQgbXVzdCBtYXRjaCB6ZXJvIG9yIG1vcmUgdGltZXMNCiAgICAgLSBkZWZhdWx0IChvcHRpb25hbCkgLSB2YWx1ZSB0byBiZSByZXR1cm5lZCBpZiB0aGUgb3B0aW9uYWwgZXhwcmVzc2lvbiBpcyBub3QgZm91bmQuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgIyBVUyBwb3N0YWwgY29kZSBjYW4gYmUgYSA1LWRpZ2l0IHppcCwgcGx1cyBvcHRpb25hbCA0LWRpZ2l0IHF1YWxpZmllcg0KICAgICAgICB6aXAgPSBDb21iaW5lKFdvcmQobnVtcywgZXhhY3Q9NSkgKyBPcHRpb25hbCgnLScgKyBXb3JkKG51bXMsIGV4YWN0PTQpKSkNCiAgICAgICAgemlwLnJ1blRlc3RzKCcnJw0KICAgICAgICAgICAgIyB0cmFkaXRpb25hbCBaSVAgY29kZQ0KICAgICAgICAgICAgMTIzNDUNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgIyBaSVArNCBmb3JtDQogICAgICAgICAgICAxMjEwMS0wMDAxDQogICAgICAgICAgICANCiAgICAgICAgICAgICMgaW52YWxpZCBaSVANCiAgICAgICAgICAgIDk4NzY1LQ0KICAgICAgICAgICAgJycnKQ0KICAgIHByaW50czo6DQogICAgICAgICMgdHJhZGl0aW9uYWwgWklQIGNvZGUNCiAgICAgICAgMTIzNDUNCiAgICAgICAgWycxMjM0NSddDQoNCiAgICAgICAgIyBaSVArNCBmb3JtDQogICAgICAgIDEyMTAxLTAwMDENCiAgICAgICAgWycxMjEwMS0wMDAxJ10NCg0KICAgICAgICAjIGludmFsaWQgWklQDQogICAgICAgIDk4NzY1LQ0KICAgICAgICAgICAgIF4NCiAgICAgICAgRkFJTDogRXhwZWN0ZWQgZW5kIG9mIHRleHQgKGF0IGNoYXIgNSksIChsaW5lOjEsIGNvbDo2KQ0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwciwgZGVmYXVsdD1fb3B0aW9uYWxOb3RNYXRjaGVkICk6DQogICAgICAgIHN1cGVyKE9wdGlvbmFsLHNlbGYpLl9faW5pdF9fKCBleHByLCBzYXZlbGlzdD1GYWxzZSApDQogICAgICAgIHNlbGYuc2F2ZUFzTGlzdCA9IHNlbGYuZXhwci5zYXZlQXNMaXN0DQogICAgICAgIHNlbGYuZGVmYXVsdFZhbHVlID0gZGVmYXVsdA0KICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gVHJ1ZQ0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgbG9jLCB0b2tlbnMgPSBzZWxmLmV4cHIuX3BhcnNlKCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnMsIGNhbGxQcmVQYXJzZT1GYWxzZSApDQogICAgICAgIGV4Y2VwdCAoUGFyc2VFeGNlcHRpb24sSW5kZXhFcnJvcik6DQogICAgICAgICAgICBpZiBzZWxmLmRlZmF1bHRWYWx1ZSBpcyBub3QgX29wdGlvbmFsTm90TWF0Y2hlZDoNCiAgICAgICAgICAgICAgICBpZiBzZWxmLmV4cHIucmVzdWx0c05hbWU6DQogICAgICAgICAgICAgICAgICAgIHRva2VucyA9IFBhcnNlUmVzdWx0cyhbIHNlbGYuZGVmYXVsdFZhbHVlIF0pDQogICAgICAgICAgICAgICAgICAgIHRva2Vuc1tzZWxmLmV4cHIucmVzdWx0c05hbWVdID0gc2VsZi5kZWZhdWx0VmFsdWUNCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICB0b2tlbnMgPSBbIHNlbGYuZGVmYXVsdFZhbHVlIF0NCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgdG9rZW5zID0gW10NCiAgICAgICAgcmV0dXJuIGxvYywgdG9rZW5zDQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICBpZiBoYXNhdHRyKHNlbGYsIm5hbWUiKToNCiAgICAgICAgICAgIHJldHVybiBzZWxmLm5hbWUNCg0KICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZToNCiAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICJbIiArIF91c3RyKHNlbGYuZXhwcikgKyAiXSINCg0KICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByDQoNCmNsYXNzIFNraXBUbyhQYXJzZUVsZW1lbnRFbmhhbmNlKToNCiAgICAiIiINCiAgICBUb2tlbiBmb3Igc2tpcHBpbmcgb3ZlciBhbGwgdW5kZWZpbmVkIHRleHQgdW50aWwgdGhlIG1hdGNoZWQgZXhwcmVzc2lvbiBpcyBmb3VuZC4NCg0KICAgIFBhcmFtZXRlcnM6DQogICAgIC0gZXhwciAtIHRhcmdldCBleHByZXNzaW9uIG1hcmtpbmcgdGhlIGVuZCBvZiB0aGUgZGF0YSB0byBiZSBza2lwcGVkDQogICAgIC0gaW5jbHVkZSAtIChkZWZhdWx0PUN7RmFsc2V9KSBpZiBUcnVlLCB0aGUgdGFyZ2V0IGV4cHJlc3Npb24gaXMgYWxzbyBwYXJzZWQgDQogICAgICAgICAgKHRoZSBza2lwcGVkIHRleHQgYW5kIHRhcmdldCBleHByZXNzaW9uIGFyZSByZXR1cm5lZCBhcyBhIDItZWxlbWVudCBsaXN0KS4NCiAgICAgLSBpZ25vcmUgLSAoZGVmYXVsdD1De05vbmV9KSB1c2VkIHRvIGRlZmluZSBncmFtbWFycyAodHlwaWNhbGx5IHF1b3RlZCBzdHJpbmdzIGFuZCANCiAgICAgICAgICBjb21tZW50cykgdGhhdCBtaWdodCBjb250YWluIGZhbHNlIG1hdGNoZXMgdG8gdGhlIHRhcmdldCBleHByZXNzaW9uDQogICAgIC0gZmFpbE9uIC0gKGRlZmF1bHQ9Q3tOb25lfSkgZGVmaW5lIGV4cHJlc3Npb25zIHRoYXQgYXJlIG5vdCBhbGxvd2VkIHRvIGJlIA0KICAgICAgICAgIGluY2x1ZGVkIGluIHRoZSBza2lwcGVkIHRlc3Q7IGlmIGZvdW5kIGJlZm9yZSB0aGUgdGFyZ2V0IGV4cHJlc3Npb24gaXMgZm91bmQsIA0KICAgICAgICAgIHRoZSBTa2lwVG8gaXMgbm90IGEgbWF0Y2gNCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICByZXBvcnQgPSAnJycNCiAgICAgICAgICAgIE91dHN0YW5kaW5nIElzc3VlcyBSZXBvcnQgLSAxIEphbiAyMDAwDQoNCiAgICAgICAgICAgICAgICMgfCBTZXZlcml0eSB8IERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIERheXMgT3Blbg0KICAgICAgICAgICAgLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tDQogICAgICAgICAgICAgMTAxIHwgQ3JpdGljYWwgfCBJbnRlcm1pdHRlbnQgc3lzdGVtIGNyYXNoICAgICAgICAgICAgICAgICB8ICAgICAgICAgIDYNCiAgICAgICAgICAgICAgOTQgfCBDb3NtZXRpYyB8IFNwZWxsaW5nIGVycm9yIG9uIExvZ2luICgnbG9nfG4nKSAgICAgICAgIHwgICAgICAgICAxNA0KICAgICAgICAgICAgICA3OSB8IE1pbm9yICAgIHwgU3lzdGVtIHNsb3cgd2hlbiBydW5uaW5nIHRvbyBtYW55IHJlcG9ydHMgfCAgICAgICAgIDQ3DQogICAgICAgICAgICAnJycNCiAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykNCiAgICAgICAgU0VQID0gU3VwcHJlc3MoJ3wnKQ0KICAgICAgICAjIHVzZSBTa2lwVG8gdG8gc2ltcGx5IG1hdGNoIGV2ZXJ5dGhpbmcgdXAgdW50aWwgdGhlIG5leHQgU0VQDQogICAgICAgICMgLSBpZ25vcmUgcXVvdGVkIHN0cmluZ3MsIHNvIHRoYXQgYSAnfCcgY2hhcmFjdGVyIGluc2lkZSBhIHF1b3RlZCBzdHJpbmcgZG9lcyBub3QgbWF0Y2gNCiAgICAgICAgIyAtIHBhcnNlIGFjdGlvbiB3aWxsIGNhbGwgdG9rZW4uc3RyaXAoKSBmb3IgZWFjaCBtYXRjaGVkIHRva2VuLCBpLmUuLCB0aGUgZGVzY3JpcHRpb24gYm9keQ0KICAgICAgICBzdHJpbmdfZGF0YSA9IFNraXBUbyhTRVAsIGlnbm9yZT1xdW90ZWRTdHJpbmcpDQogICAgICAgIHN0cmluZ19kYXRhLnNldFBhcnNlQWN0aW9uKHRva2VuTWFwKHN0ci5zdHJpcCkpDQogICAgICAgIHRpY2tldF9leHByID0gKGludGVnZXIoImlzc3VlX251bSIpICsgU0VQIA0KICAgICAgICAgICAgICAgICAgICAgICsgc3RyaW5nX2RhdGEoInNldiIpICsgU0VQIA0KICAgICAgICAgICAgICAgICAgICAgICsgc3RyaW5nX2RhdGEoImRlc2MiKSArIFNFUCANCiAgICAgICAgICAgICAgICAgICAgICArIGludGVnZXIoImRheXNfb3BlbiIpKQ0KICAgICAgICANCiAgICAgICAgZm9yIHRrdCBpbiB0aWNrZXRfZXhwci5zZWFyY2hTdHJpbmcocmVwb3J0KToNCiAgICAgICAgICAgIHByaW50IHRrdC5kdW1wKCkNCiAgICBwcmludHM6Og0KICAgICAgICBbJzEwMScsICdDcml0aWNhbCcsICdJbnRlcm1pdHRlbnQgc3lzdGVtIGNyYXNoJywgJzYnXQ0KICAgICAgICAtIGRheXNfb3BlbjogNg0KICAgICAgICAtIGRlc2M6IEludGVybWl0dGVudCBzeXN0ZW0gY3Jhc2gNCiAgICAgICAgLSBpc3N1ZV9udW06IDEwMQ0KICAgICAgICAtIHNldjogQ3JpdGljYWwNCiAgICAgICAgWyc5NCcsICdDb3NtZXRpYycsICJTcGVsbGluZyBlcnJvciBvbiBMb2dpbiAoJ2xvZ3xuJykiLCAnMTQnXQ0KICAgICAgICAtIGRheXNfb3BlbjogMTQNCiAgICAgICAgLSBkZXNjOiBTcGVsbGluZyBlcnJvciBvbiBMb2dpbiAoJ2xvZ3xuJykNCiAgICAgICAgLSBpc3N1ZV9udW06IDk0DQogICAgICAgIC0gc2V2OiBDb3NtZXRpYw0KICAgICAgICBbJzc5JywgJ01pbm9yJywgJ1N5c3RlbSBzbG93IHdoZW4gcnVubmluZyB0b28gbWFueSByZXBvcnRzJywgJzQ3J10NCiAgICAgICAgLSBkYXlzX29wZW46IDQ3DQogICAgICAgIC0gZGVzYzogU3lzdGVtIHNsb3cgd2hlbiBydW5uaW5nIHRvbyBtYW55IHJlcG9ydHMNCiAgICAgICAgLSBpc3N1ZV9udW06IDc5DQogICAgICAgIC0gc2V2OiBNaW5vcg0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgb3RoZXIsIGluY2x1ZGU9RmFsc2UsIGlnbm9yZT1Ob25lLCBmYWlsT249Tm9uZSApOg0KICAgICAgICBzdXBlciggU2tpcFRvLCBzZWxmICkuX19pbml0X18oIG90aGVyICkNCiAgICAgICAgc2VsZi5pZ25vcmVFeHByID0gaWdub3JlDQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBUcnVlDQogICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IEZhbHNlDQogICAgICAgIHNlbGYuaW5jbHVkZU1hdGNoID0gaW5jbHVkZQ0KICAgICAgICBzZWxmLmFzTGlzdCA9IEZhbHNlDQogICAgICAgIGlmIGlzaW5zdGFuY2UoZmFpbE9uLCBiYXNlc3RyaW5nKToNCiAgICAgICAgICAgIHNlbGYuZmFpbE9uID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKGZhaWxPbikNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHNlbGYuZmFpbE9uID0gZmFpbE9uDQogICAgICAgIHNlbGYuZXJybXNnID0gIk5vIG1hdGNoIGZvdW5kIGZvciAiK191c3RyKHNlbGYuZXhwcikNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIHN0YXJ0bG9jID0gbG9jDQogICAgICAgIGluc3RybGVuID0gbGVuKGluc3RyaW5nKQ0KICAgICAgICBleHByID0gc2VsZi5leHByDQogICAgICAgIGV4cHJfcGFyc2UgPSBzZWxmLmV4cHIuX3BhcnNlDQogICAgICAgIHNlbGZfZmFpbE9uX2NhblBhcnNlTmV4dCA9IHNlbGYuZmFpbE9uLmNhblBhcnNlTmV4dCBpZiBzZWxmLmZhaWxPbiBpcyBub3QgTm9uZSBlbHNlIE5vbmUNCiAgICAgICAgc2VsZl9pZ25vcmVFeHByX3RyeVBhcnNlID0gc2VsZi5pZ25vcmVFeHByLnRyeVBhcnNlIGlmIHNlbGYuaWdub3JlRXhwciBpcyBub3QgTm9uZSBlbHNlIE5vbmUNCiAgICAgICAgDQogICAgICAgIHRtcGxvYyA9IGxvYw0KICAgICAgICB3aGlsZSB0bXBsb2MgPD0gaW5zdHJsZW46DQogICAgICAgICAgICBpZiBzZWxmX2ZhaWxPbl9jYW5QYXJzZU5leHQgaXMgbm90IE5vbmU6DQogICAgICAgICAgICAgICAgIyBicmVhayBpZiBmYWlsT24gZXhwcmVzc2lvbiBtYXRjaGVzDQogICAgICAgICAgICAgICAgaWYgc2VsZl9mYWlsT25fY2FuUGFyc2VOZXh0KGluc3RyaW5nLCB0bXBsb2MpOg0KICAgICAgICAgICAgICAgICAgICBicmVhaw0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgIGlmIHNlbGZfaWdub3JlRXhwcl90cnlQYXJzZSBpcyBub3QgTm9uZToNCiAgICAgICAgICAgICAgICAjIGFkdmFuY2UgcGFzdCBpZ25vcmUgZXhwcmVzc2lvbnMNCiAgICAgICAgICAgICAgICB3aGlsZSAxOg0KICAgICAgICAgICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgICAgICAgICB0bXBsb2MgPSBzZWxmX2lnbm9yZUV4cHJfdHJ5UGFyc2UoaW5zdHJpbmcsIHRtcGxvYykNCiAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFBhcnNlQmFzZUV4Y2VwdGlvbjoNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrDQogICAgICAgICAgICANCiAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICBleHByX3BhcnNlKGluc3RyaW5nLCB0bXBsb2MsIGRvQWN0aW9ucz1GYWxzZSwgY2FsbFByZVBhcnNlPUZhbHNlKQ0KICAgICAgICAgICAgZXhjZXB0IChQYXJzZUV4Y2VwdGlvbiwgSW5kZXhFcnJvcik6DQogICAgICAgICAgICAgICAgIyBubyBtYXRjaCwgYWR2YW5jZSBsb2MgaW4gc3RyaW5nDQogICAgICAgICAgICAgICAgdG1wbG9jICs9IDENCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgIyBtYXRjaGVkIHNraXB0byBleHByLCBkb25lDQogICAgICAgICAgICAgICAgYnJlYWsNCg0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgIyByYW4gb2ZmIHRoZSBlbmQgb2YgdGhlIGlucHV0IHN0cmluZyB3aXRob3V0IG1hdGNoaW5nIHNraXB0byBleHByLCBmYWlsDQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCg0KICAgICAgICAjIGJ1aWxkIHVwIHJldHVybiB2YWx1ZXMNCiAgICAgICAgbG9jID0gdG1wbG9jDQogICAgICAgIHNraXB0ZXh0ID0gaW5zdHJpbmdbc3RhcnRsb2M6bG9jXQ0KICAgICAgICBza2lwcmVzdWx0ID0gUGFyc2VSZXN1bHRzKHNraXB0ZXh0KQ0KICAgICAgICANCiAgICAgICAgaWYgc2VsZi5pbmNsdWRlTWF0Y2g6DQogICAgICAgICAgICBsb2MsIG1hdCA9IGV4cHJfcGFyc2UoaW5zdHJpbmcsbG9jLGRvQWN0aW9ucyxjYWxsUHJlUGFyc2U9RmFsc2UpDQogICAgICAgICAgICBza2lwcmVzdWx0ICs9IG1hdA0KDQogICAgICAgIHJldHVybiBsb2MsIHNraXByZXN1bHQNCg0KY2xhc3MgRm9yd2FyZChQYXJzZUVsZW1lbnRFbmhhbmNlKToNCiAgICAiIiINCiAgICBGb3J3YXJkIGRlY2xhcmF0aW9uIG9mIGFuIGV4cHJlc3Npb24gdG8gYmUgZGVmaW5lZCBsYXRlciAtDQogICAgdXNlZCBmb3IgcmVjdXJzaXZlIGdyYW1tYXJzLCBzdWNoIGFzIGFsZ2VicmFpYyBpbmZpeCBub3RhdGlvbi4NCiAgICBXaGVuIHRoZSBleHByZXNzaW9uIGlzIGtub3duLCBpdCBpcyBhc3NpZ25lZCB0byB0aGUgQ3tGb3J3YXJkfSB2YXJpYWJsZSB1c2luZyB0aGUgJzw8JyBvcGVyYXRvci4NCg0KICAgIE5vdGU6IHRha2UgY2FyZSB3aGVuIGFzc2lnbmluZyB0byBDe0ZvcndhcmR9IG5vdCB0byBvdmVybG9vayBwcmVjZWRlbmNlIG9mIG9wZXJhdG9ycy4NCiAgICBTcGVjaWZpY2FsbHksICd8JyBoYXMgYSBsb3dlciBwcmVjZWRlbmNlIHRoYW4gJzw8Jywgc28gdGhhdDo6DQogICAgICAgIGZ3ZEV4cHIgPDwgYSB8IGIgfCBjDQogICAgd2lsbCBhY3R1YWxseSBiZSBldmFsdWF0ZWQgYXM6Og0KICAgICAgICAoZndkRXhwciA8PCBhKSB8IGIgfCBjDQogICAgdGhlcmVieSBsZWF2aW5nIGIgYW5kIGMgb3V0IGFzIHBhcnNlYWJsZSBhbHRlcm5hdGl2ZXMuICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IHlvdQ0KICAgIGV4cGxpY2l0bHkgZ3JvdXAgdGhlIHZhbHVlcyBpbnNlcnRlZCBpbnRvIHRoZSBDe0ZvcndhcmR9OjoNCiAgICAgICAgZndkRXhwciA8PCAoYSB8IGIgfCBjKQ0KICAgIENvbnZlcnRpbmcgdG8gdXNlIHRoZSAnPDw9JyBvcGVyYXRvciBpbnN0ZWFkIHdpbGwgYXZvaWQgdGhpcyBwcm9ibGVtLg0KDQogICAgU2VlIEx7UGFyc2VSZXN1bHRzLnBwcmludH0gZm9yIGFuIGV4YW1wbGUgb2YgYSByZWN1cnNpdmUgcGFyc2VyIGNyZWF0ZWQgdXNpbmcNCiAgICBDe0ZvcndhcmR9Lg0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgb3RoZXI9Tm9uZSApOg0KICAgICAgICBzdXBlcihGb3J3YXJkLHNlbGYpLl9faW5pdF9fKCBvdGhlciwgc2F2ZWxpc3Q9RmFsc2UgKQ0KDQogICAgZGVmIF9fbHNoaWZ0X18oIHNlbGYsIG90aGVyICk6DQogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6DQogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyhvdGhlcikNCiAgICAgICAgc2VsZi5leHByID0gb3RoZXINCiAgICAgICAgc2VsZi5zdHJSZXByID0gTm9uZQ0KICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBzZWxmLmV4cHIubWF5SW5kZXhFcnJvcg0KICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gc2VsZi5leHByLm1heVJldHVybkVtcHR5DQogICAgICAgIHNlbGYuc2V0V2hpdGVzcGFjZUNoYXJzKCBzZWxmLmV4cHIud2hpdGVDaGFycyApDQogICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBzZWxmLmV4cHIuc2tpcFdoaXRlc3BhY2UNCiAgICAgICAgc2VsZi5zYXZlQXNMaXN0ID0gc2VsZi5leHByLnNhdmVBc0xpc3QNCiAgICAgICAgc2VsZi5pZ25vcmVFeHBycy5leHRlbmQoc2VsZi5leHByLmlnbm9yZUV4cHJzKQ0KICAgICAgICByZXR1cm4gc2VsZg0KICAgICAgICANCiAgICBkZWYgX19pbHNoaWZ0X18oc2VsZiwgb3RoZXIpOg0KICAgICAgICByZXR1cm4gc2VsZiA8PCBvdGhlcg0KICAgIA0KICAgIGRlZiBsZWF2ZVdoaXRlc3BhY2UoIHNlbGYgKToNCiAgICAgICAgc2VsZi5za2lwV2hpdGVzcGFjZSA9IEZhbHNlDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgc3RyZWFtbGluZSggc2VsZiApOg0KICAgICAgICBpZiBub3Qgc2VsZi5zdHJlYW1saW5lZDoNCiAgICAgICAgICAgIHNlbGYuc3RyZWFtbGluZWQgPSBUcnVlDQogICAgICAgICAgICBpZiBzZWxmLmV4cHIgaXMgbm90IE5vbmU6DQogICAgICAgICAgICAgICAgc2VsZi5leHByLnN0cmVhbWxpbmUoKQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIHZhbGlkYXRlKCBzZWxmLCB2YWxpZGF0ZVRyYWNlPVtdICk6DQogICAgICAgIGlmIHNlbGYgbm90IGluIHZhbGlkYXRlVHJhY2U6DQogICAgICAgICAgICB0bXAgPSB2YWxpZGF0ZVRyYWNlWzpdK1tzZWxmXQ0KICAgICAgICAgICAgaWYgc2VsZi5leHByIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgICAgIHNlbGYuZXhwci52YWxpZGF0ZSh0bXApDQogICAgICAgIHNlbGYuY2hlY2tSZWN1cnNpb24oW10pDQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICBpZiBoYXNhdHRyKHNlbGYsIm5hbWUiKToNCiAgICAgICAgICAgIHJldHVybiBzZWxmLm5hbWUNCiAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fICsgIjogLi4uIg0KDQogICAgICAgICMgc3R1YmJlZCBvdXQgZm9yIG5vdyAtIGNyZWF0ZXMgYXdmdWwgbWVtb3J5IGFuZCBwZXJmIGlzc3Vlcw0KICAgICAgICBzZWxmLl9yZXZlcnRDbGFzcyA9IHNlbGYuX19jbGFzc19fDQogICAgICAgIHNlbGYuX19jbGFzc19fID0gX0ZvcndhcmROb1JlY3Vyc2UNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgaWYgc2VsZi5leHByIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgICAgIHJldFN0cmluZyA9IF91c3RyKHNlbGYuZXhwcikNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgcmV0U3RyaW5nID0gIk5vbmUiDQogICAgICAgIGZpbmFsbHk6DQogICAgICAgICAgICBzZWxmLl9fY2xhc3NfXyA9IHNlbGYuX3JldmVydENsYXNzDQogICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXyArICI6ICIgKyByZXRTdHJpbmcNCg0KICAgIGRlZiBjb3B5KHNlbGYpOg0KICAgICAgICBpZiBzZWxmLmV4cHIgaXMgbm90IE5vbmU6DQogICAgICAgICAgICByZXR1cm4gc3VwZXIoRm9yd2FyZCxzZWxmKS5jb3B5KCkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJldCA9IEZvcndhcmQoKQ0KICAgICAgICAgICAgcmV0IDw8PSBzZWxmDQogICAgICAgICAgICByZXR1cm4gcmV0DQoNCmNsYXNzIF9Gb3J3YXJkTm9SZWN1cnNlKEZvcndhcmQpOg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIHJldHVybiAiLi4uIg0KDQpjbGFzcyBUb2tlbkNvbnZlcnRlcihQYXJzZUVsZW1lbnRFbmhhbmNlKToNCiAgICAiIiINCiAgICBBYnN0cmFjdCBzdWJjbGFzcyBvZiBDe1BhcnNlRXhwcmVzc2lvbn0sIGZvciBjb252ZXJ0aW5nIHBhcnNlZCByZXN1bHRzLg0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwciwgc2F2ZWxpc3Q9RmFsc2UgKToNCiAgICAgICAgc3VwZXIoVG9rZW5Db252ZXJ0ZXIsc2VsZikuX19pbml0X18oIGV4cHIgKSMsIHNhdmVsaXN0ICkNCiAgICAgICAgc2VsZi5zYXZlQXNMaXN0ID0gRmFsc2UNCg0KY2xhc3MgQ29tYmluZShUb2tlbkNvbnZlcnRlcik6DQogICAgIiIiDQogICAgQ29udmVydGVyIHRvIGNvbmNhdGVuYXRlIGFsbCBtYXRjaGluZyB0b2tlbnMgdG8gYSBzaW5nbGUgc3RyaW5nLg0KICAgIEJ5IGRlZmF1bHQsIHRoZSBtYXRjaGluZyBwYXR0ZXJucyBtdXN0IGFsc28gYmUgY29udGlndW91cyBpbiB0aGUgaW5wdXQgc3RyaW5nOw0KICAgIHRoaXMgY2FuIGJlIGRpc2FibGVkIGJ5IHNwZWNpZnlpbmcgQ3snYWRqYWNlbnQ9RmFsc2UnfSBpbiB0aGUgY29uc3RydWN0b3IuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgcmVhbCA9IFdvcmQobnVtcykgKyAnLicgKyBXb3JkKG51bXMpDQogICAgICAgIHByaW50KHJlYWwucGFyc2VTdHJpbmcoJzMuMTQxNicpKSAjIC0+IFsnMycsICcuJywgJzE0MTYnXQ0KICAgICAgICAjIHdpbGwgYWxzbyBlcnJvbmVvdXNseSBtYXRjaCB0aGUgZm9sbG93aW5nDQogICAgICAgIHByaW50KHJlYWwucGFyc2VTdHJpbmcoJzMuIDE0MTYnKSkgIyAtPiBbJzMnLCAnLicsICcxNDE2J10NCg0KICAgICAgICByZWFsID0gQ29tYmluZShXb3JkKG51bXMpICsgJy4nICsgV29yZChudW1zKSkNCiAgICAgICAgcHJpbnQocmVhbC5wYXJzZVN0cmluZygnMy4xNDE2JykpICMgLT4gWyczLjE0MTYnXQ0KICAgICAgICAjIG5vIG1hdGNoIHdoZW4gdGhlcmUgYXJlIGludGVybmFsIHNwYWNlcw0KICAgICAgICBwcmludChyZWFsLnBhcnNlU3RyaW5nKCczLiAxNDE2JykpICMgLT4gRXhjZXB0aW9uOiBFeHBlY3RlZCBXOigwMTIzLi4uKQ0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwciwgam9pblN0cmluZz0iIiwgYWRqYWNlbnQ9VHJ1ZSApOg0KICAgICAgICBzdXBlcihDb21iaW5lLHNlbGYpLl9faW5pdF9fKCBleHByICkNCiAgICAgICAgIyBzdXBwcmVzcyB3aGl0ZXNwYWNlLXN0cmlwcGluZyBpbiBjb250YWluZWQgcGFyc2UgZXhwcmVzc2lvbnMsIGJ1dCByZS1lbmFibGUgaXQgb24gdGhlIENvbWJpbmUgaXRzZWxmDQogICAgICAgIGlmIGFkamFjZW50Og0KICAgICAgICAgICAgc2VsZi5sZWF2ZVdoaXRlc3BhY2UoKQ0KICAgICAgICBzZWxmLmFkamFjZW50ID0gYWRqYWNlbnQNCiAgICAgICAgc2VsZi5za2lwV2hpdGVzcGFjZSA9IFRydWUNCiAgICAgICAgc2VsZi5qb2luU3RyaW5nID0gam9pblN0cmluZw0KICAgICAgICBzZWxmLmNhbGxQcmVwYXJzZSA9IFRydWUNCg0KICAgIGRlZiBpZ25vcmUoIHNlbGYsIG90aGVyICk6DQogICAgICAgIGlmIHNlbGYuYWRqYWNlbnQ6DQogICAgICAgICAgICBQYXJzZXJFbGVtZW50Lmlnbm9yZShzZWxmLCBvdGhlcikNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHN1cGVyKCBDb21iaW5lLCBzZWxmKS5pZ25vcmUoIG90aGVyICkNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBwb3N0UGFyc2UoIHNlbGYsIGluc3RyaW5nLCBsb2MsIHRva2VubGlzdCApOg0KICAgICAgICByZXRUb2tzID0gdG9rZW5saXN0LmNvcHkoKQ0KICAgICAgICBkZWwgcmV0VG9rc1s6XQ0KICAgICAgICByZXRUb2tzICs9IFBhcnNlUmVzdWx0cyhbICIiLmpvaW4odG9rZW5saXN0Ll9hc1N0cmluZ0xpc3Qoc2VsZi5qb2luU3RyaW5nKSkgXSwgbW9kYWw9c2VsZi5tb2RhbFJlc3VsdHMpDQoNCiAgICAgICAgaWYgc2VsZi5yZXN1bHRzTmFtZSBhbmQgcmV0VG9rcy5oYXNrZXlzKCk6DQogICAgICAgICAgICByZXR1cm4gWyByZXRUb2tzIF0NCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJldHVybiByZXRUb2tzDQoNCmNsYXNzIEdyb3VwKFRva2VuQ29udmVydGVyKToNCiAgICAiIiINCiAgICBDb252ZXJ0ZXIgdG8gcmV0dXJuIHRoZSBtYXRjaGVkIHRva2VucyBhcyBhIGxpc3QgLSB1c2VmdWwgZm9yIHJldHVybmluZyB0b2tlbnMgb2YgQ3tMe1plcm9Pck1vcmV9fSBhbmQgQ3tMe09uZU9yTW9yZX19IGV4cHJlc3Npb25zLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIGlkZW50ID0gV29yZChhbHBoYXMpDQogICAgICAgIG51bSA9IFdvcmQobnVtcykNCiAgICAgICAgdGVybSA9IGlkZW50IHwgbnVtDQogICAgICAgIGZ1bmMgPSBpZGVudCArIE9wdGlvbmFsKGRlbGltaXRlZExpc3QodGVybSkpDQogICAgICAgIHByaW50KGZ1bmMucGFyc2VTdHJpbmcoImZuIGEsYiwxMDAiKSkgICMgLT4gWydmbicsICdhJywgJ2InLCAnMTAwJ10NCg0KICAgICAgICBmdW5jID0gaWRlbnQgKyBHcm91cChPcHRpb25hbChkZWxpbWl0ZWRMaXN0KHRlcm0pKSkNCiAgICAgICAgcHJpbnQoZnVuYy5wYXJzZVN0cmluZygiZm4gYSxiLDEwMCIpKSAgIyAtPiBbJ2ZuJywgWydhJywgJ2InLCAnMTAwJ11dDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHByICk6DQogICAgICAgIHN1cGVyKEdyb3VwLHNlbGYpLl9faW5pdF9fKCBleHByICkNCiAgICAgICAgc2VsZi5zYXZlQXNMaXN0ID0gVHJ1ZQ0KDQogICAgZGVmIHBvc3RQYXJzZSggc2VsZiwgaW5zdHJpbmcsIGxvYywgdG9rZW5saXN0ICk6DQogICAgICAgIHJldHVybiBbIHRva2VubGlzdCBdDQoNCmNsYXNzIERpY3QoVG9rZW5Db252ZXJ0ZXIpOg0KICAgICIiIg0KICAgIENvbnZlcnRlciB0byByZXR1cm4gYSByZXBldGl0aXZlIGV4cHJlc3Npb24gYXMgYSBsaXN0LCBidXQgYWxzbyBhcyBhIGRpY3Rpb25hcnkuDQogICAgRWFjaCBlbGVtZW50IGNhbiBhbHNvIGJlIHJlZmVyZW5jZWQgdXNpbmcgdGhlIGZpcnN0IHRva2VuIGluIHRoZSBleHByZXNzaW9uIGFzIGl0cyBrZXkuDQogICAgVXNlZnVsIGZvciB0YWJ1bGFyIHJlcG9ydCBzY3JhcGluZyB3aGVuIHRoZSBmaXJzdCBjb2x1bW4gY2FuIGJlIHVzZWQgYXMgYSBpdGVtIGtleS4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBkYXRhX3dvcmQgPSBXb3JkKGFscGhhcykNCiAgICAgICAgbGFiZWwgPSBkYXRhX3dvcmQgKyBGb2xsb3dlZEJ5KCc6JykNCiAgICAgICAgYXR0cl9leHByID0gR3JvdXAobGFiZWwgKyBTdXBwcmVzcygnOicpICsgT25lT3JNb3JlKGRhdGFfd29yZCkuc2V0UGFyc2VBY3Rpb24oJyAnLmpvaW4pKQ0KDQogICAgICAgIHRleHQgPSAic2hhcGU6IFNRVUFSRSBwb3NuOiB1cHBlciBsZWZ0IGNvbG9yOiBsaWdodCBibHVlIHRleHR1cmU6IGJ1cmxhcCINCiAgICAgICAgYXR0cl9leHByID0gKGxhYmVsICsgU3VwcHJlc3MoJzonKSArIE9uZU9yTW9yZShkYXRhX3dvcmQsIHN0b3BPbj1sYWJlbCkuc2V0UGFyc2VBY3Rpb24oJyAnLmpvaW4pKQ0KICAgICAgICANCiAgICAgICAgIyBwcmludCBhdHRyaWJ1dGVzIGFzIHBsYWluIGdyb3Vwcw0KICAgICAgICBwcmludChPbmVPck1vcmUoYXR0cl9leHByKS5wYXJzZVN0cmluZyh0ZXh0KS5kdW1wKCkpDQogICAgICAgIA0KICAgICAgICAjIGluc3RlYWQgb2YgT25lT3JNb3JlKGV4cHIpLCBwYXJzZSB1c2luZyBEaWN0KE9uZU9yTW9yZShHcm91cChleHByKSkpIC0gRGljdCB3aWxsIGF1dG8tYXNzaWduIG5hbWVzDQogICAgICAgIHJlc3VsdCA9IERpY3QoT25lT3JNb3JlKEdyb3VwKGF0dHJfZXhwcikpKS5wYXJzZVN0cmluZyh0ZXh0KQ0KICAgICAgICBwcmludChyZXN1bHQuZHVtcCgpKQ0KICAgICAgICANCiAgICAgICAgIyBhY2Nlc3MgbmFtZWQgZmllbGRzIGFzIGRpY3QgZW50cmllcywgb3Igb3V0cHV0IGFzIGRpY3QNCiAgICAgICAgcHJpbnQocmVzdWx0WydzaGFwZSddKSAgICAgICAgDQogICAgICAgIHByaW50KHJlc3VsdC5hc0RpY3QoKSkNCiAgICBwcmludHM6Og0KICAgICAgICBbJ3NoYXBlJywgJ1NRVUFSRScsICdwb3NuJywgJ3VwcGVyIGxlZnQnLCAnY29sb3InLCAnbGlnaHQgYmx1ZScsICd0ZXh0dXJlJywgJ2J1cmxhcCddDQoNCiAgICAgICAgW1snc2hhcGUnLCAnU1FVQVJFJ10sIFsncG9zbicsICd1cHBlciBsZWZ0J10sIFsnY29sb3InLCAnbGlnaHQgYmx1ZSddLCBbJ3RleHR1cmUnLCAnYnVybGFwJ11dDQogICAgICAgIC0gY29sb3I6IGxpZ2h0IGJsdWUNCiAgICAgICAgLSBwb3NuOiB1cHBlciBsZWZ0DQogICAgICAgIC0gc2hhcGU6IFNRVUFSRQ0KICAgICAgICAtIHRleHR1cmU6IGJ1cmxhcA0KICAgICAgICBTUVVBUkUNCiAgICAgICAgeydjb2xvcic6ICdsaWdodCBibHVlJywgJ3Bvc24nOiAndXBwZXIgbGVmdCcsICd0ZXh0dXJlJzogJ2J1cmxhcCcsICdzaGFwZSc6ICdTUVVBUkUnfQ0KICAgIFNlZSBtb3JlIGV4YW1wbGVzIGF0IEx7UGFyc2VSZXN1bHRzfSBvZiBhY2Nlc3NpbmcgZmllbGRzIGJ5IHJlc3VsdHMgbmFtZS4NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHIgKToNCiAgICAgICAgc3VwZXIoRGljdCxzZWxmKS5fX2luaXRfXyggZXhwciApDQogICAgICAgIHNlbGYuc2F2ZUFzTGlzdCA9IFRydWUNCg0KICAgIGRlZiBwb3N0UGFyc2UoIHNlbGYsIGluc3RyaW5nLCBsb2MsIHRva2VubGlzdCApOg0KICAgICAgICBmb3IgaSx0b2sgaW4gZW51bWVyYXRlKHRva2VubGlzdCk6DQogICAgICAgICAgICBpZiBsZW4odG9rKSA9PSAwOg0KICAgICAgICAgICAgICAgIGNvbnRpbnVlDQogICAgICAgICAgICBpa2V5ID0gdG9rWzBdDQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGlrZXksaW50KToNCiAgICAgICAgICAgICAgICBpa2V5ID0gX3VzdHIodG9rWzBdKS5zdHJpcCgpDQogICAgICAgICAgICBpZiBsZW4odG9rKT09MToNCiAgICAgICAgICAgICAgICB0b2tlbmxpc3RbaWtleV0gPSBfUGFyc2VSZXN1bHRzV2l0aE9mZnNldCgiIixpKQ0KICAgICAgICAgICAgZWxpZiBsZW4odG9rKT09MiBhbmQgbm90IGlzaW5zdGFuY2UodG9rWzFdLFBhcnNlUmVzdWx0cyk6DQogICAgICAgICAgICAgICAgdG9rZW5saXN0W2lrZXldID0gX1BhcnNlUmVzdWx0c1dpdGhPZmZzZXQodG9rWzFdLGkpDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIGRpY3R2YWx1ZSA9IHRvay5jb3B5KCkgI1BhcnNlUmVzdWx0cyhpKQ0KICAgICAgICAgICAgICAgIGRlbCBkaWN0dmFsdWVbMF0NCiAgICAgICAgICAgICAgICBpZiBsZW4oZGljdHZhbHVlKSE9IDEgb3IgKGlzaW5zdGFuY2UoZGljdHZhbHVlLFBhcnNlUmVzdWx0cykgYW5kIGRpY3R2YWx1ZS5oYXNrZXlzKCkpOg0KICAgICAgICAgICAgICAgICAgICB0b2tlbmxpc3RbaWtleV0gPSBfUGFyc2VSZXN1bHRzV2l0aE9mZnNldChkaWN0dmFsdWUsaSkNCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICB0b2tlbmxpc3RbaWtleV0gPSBfUGFyc2VSZXN1bHRzV2l0aE9mZnNldChkaWN0dmFsdWVbMF0saSkNCg0KICAgICAgICBpZiBzZWxmLnJlc3VsdHNOYW1lOg0KICAgICAgICAgICAgcmV0dXJuIFsgdG9rZW5saXN0IF0NCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJldHVybiB0b2tlbmxpc3QNCg0KDQpjbGFzcyBTdXBwcmVzcyhUb2tlbkNvbnZlcnRlcik6DQogICAgIiIiDQogICAgQ29udmVydGVyIGZvciBpZ25vcmluZyB0aGUgcmVzdWx0cyBvZiBhIHBhcnNlZCBleHByZXNzaW9uLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIHNvdXJjZSA9ICJhLCBiLCBjLGQiDQogICAgICAgIHdkID0gV29yZChhbHBoYXMpDQogICAgICAgIHdkX2xpc3QxID0gd2QgKyBaZXJvT3JNb3JlKCcsJyArIHdkKQ0KICAgICAgICBwcmludCh3ZF9saXN0MS5wYXJzZVN0cmluZyhzb3VyY2UpKQ0KDQogICAgICAgICMgb2Z0ZW4sIGRlbGltaXRlcnMgdGhhdCBhcmUgdXNlZnVsIGR1cmluZyBwYXJzaW5nIGFyZSBqdXN0IGluIHRoZQ0KICAgICAgICAjIHdheSBhZnRlcndhcmQgLSB1c2UgU3VwcHJlc3MgdG8ga2VlcCB0aGVtIG91dCBvZiB0aGUgcGFyc2VkIG91dHB1dA0KICAgICAgICB3ZF9saXN0MiA9IHdkICsgWmVyb09yTW9yZShTdXBwcmVzcygnLCcpICsgd2QpDQogICAgICAgIHByaW50KHdkX2xpc3QyLnBhcnNlU3RyaW5nKHNvdXJjZSkpDQogICAgcHJpbnRzOjoNCiAgICAgICAgWydhJywgJywnLCAnYicsICcsJywgJ2MnLCAnLCcsICdkJ10NCiAgICAgICAgWydhJywgJ2InLCAnYycsICdkJ10NCiAgICAoU2VlIGFsc28gTHtkZWxpbWl0ZWRMaXN0fS4pDQogICAgIiIiDQogICAgZGVmIHBvc3RQYXJzZSggc2VsZiwgaW5zdHJpbmcsIGxvYywgdG9rZW5saXN0ICk6DQogICAgICAgIHJldHVybiBbXQ0KDQogICAgZGVmIHN1cHByZXNzKCBzZWxmICk6DQogICAgICAgIHJldHVybiBzZWxmDQoNCg0KY2xhc3MgT25seU9uY2Uob2JqZWN0KToNCiAgICAiIiINCiAgICBXcmFwcGVyIGZvciBwYXJzZSBhY3Rpb25zLCB0byBlbnN1cmUgdGhleSBhcmUgb25seSBjYWxsZWQgb25jZS4NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oc2VsZiwgbWV0aG9kQ2FsbCk6DQogICAgICAgIHNlbGYuY2FsbGFibGUgPSBfdHJpbV9hcml0eShtZXRob2RDYWxsKQ0KICAgICAgICBzZWxmLmNhbGxlZCA9IEZhbHNlDQogICAgZGVmIF9fY2FsbF9fKHNlbGYscyxsLHQpOg0KICAgICAgICBpZiBub3Qgc2VsZi5jYWxsZWQ6DQogICAgICAgICAgICByZXN1bHRzID0gc2VsZi5jYWxsYWJsZShzLGwsdCkNCiAgICAgICAgICAgIHNlbGYuY2FsbGVkID0gVHJ1ZQ0KICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHMNCiAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24ocyxsLCIiKQ0KICAgIGRlZiByZXNldChzZWxmKToNCiAgICAgICAgc2VsZi5jYWxsZWQgPSBGYWxzZQ0KDQpkZWYgdHJhY2VQYXJzZUFjdGlvbihmKToNCiAgICAiIiINCiAgICBEZWNvcmF0b3IgZm9yIGRlYnVnZ2luZyBwYXJzZSBhY3Rpb25zLiANCiAgICANCiAgICBXaGVuIHRoZSBwYXJzZSBhY3Rpb24gaXMgY2FsbGVkLCB0aGlzIGRlY29yYXRvciB3aWxsIHByaW50IEN7Ij4+IGVudGVyaW5nIEl7bWV0aG9kLW5hbWV9KGxpbmU6SXtjdXJyZW50X3NvdXJjZV9saW5lfSwgSXtwYXJzZV9sb2NhdGlvbn0sIEl7bWF0Y2hlZF90b2tlbnN9KSIufQ0KICAgIFdoZW4gdGhlIHBhcnNlIGFjdGlvbiBjb21wbGV0ZXMsIHRoZSBkZWNvcmF0b3Igd2lsbCBwcmludCBDeyI8PCJ9IGZvbGxvd2VkIGJ5IHRoZSByZXR1cm5lZCB2YWx1ZSwgb3IgYW55IGV4Y2VwdGlvbiB0aGF0IHRoZSBwYXJzZSBhY3Rpb24gcmFpc2VkLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIHdkID0gV29yZChhbHBoYXMpDQoNCiAgICAgICAgQHRyYWNlUGFyc2VBY3Rpb24NCiAgICAgICAgZGVmIHJlbW92ZV9kdXBsaWNhdGVfY2hhcnModG9rZW5zKToNCiAgICAgICAgICAgIHJldHVybiAnJy5qb2luKHNvcnRlZChzZXQoJycuam9pbih0b2tlbnMpKSkpDQoNCiAgICAgICAgd2RzID0gT25lT3JNb3JlKHdkKS5zZXRQYXJzZUFjdGlvbihyZW1vdmVfZHVwbGljYXRlX2NoYXJzKQ0KICAgICAgICBwcmludCh3ZHMucGFyc2VTdHJpbmcoInNsa2RqcyBzbGQgc2xkZCBzZGxmIHNkbGpmIikpDQogICAgcHJpbnRzOjoNCiAgICAgICAgPj5lbnRlcmluZyByZW1vdmVfZHVwbGljYXRlX2NoYXJzKGxpbmU6ICdzbGtkanMgc2xkIHNsZGQgc2RsZiBzZGxqZicsIDAsIChbJ3Nsa2RqcycsICdzbGQnLCAnc2xkZCcsICdzZGxmJywgJ3NkbGpmJ10sIHt9KSkNCiAgICAgICAgPDxsZWF2aW5nIHJlbW92ZV9kdXBsaWNhdGVfY2hhcnMgKHJldDogJ2RmamtscycpDQogICAgICAgIFsnZGZqa2xzJ10NCiAgICAiIiINCiAgICBmID0gX3RyaW1fYXJpdHkoZikNCiAgICBkZWYgeigqcGFBcmdzKToNCiAgICAgICAgdGhpc0Z1bmMgPSBmLl9fbmFtZV9fDQogICAgICAgIHMsbCx0ID0gcGFBcmdzWy0zOl0NCiAgICAgICAgaWYgbGVuKHBhQXJncyk+MzoNCiAgICAgICAgICAgIHRoaXNGdW5jID0gcGFBcmdzWzBdLl9fY2xhc3NfXy5fX25hbWVfXyArICcuJyArIHRoaXNGdW5jDQogICAgICAgIHN5cy5zdGRlcnIud3JpdGUoICI+PmVudGVyaW5nICVzKGxpbmU6ICclcycsICVkLCAlcilcbiIgJSAodGhpc0Z1bmMsbGluZShsLHMpLGwsdCkgKQ0KICAgICAgICB0cnk6DQogICAgICAgICAgICByZXQgPSBmKCpwYUFyZ3MpDQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXhjOg0KICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSggIjw8bGVhdmluZyAlcyAoZXhjZXB0aW9uOiAlcylcbiIgJSAodGhpc0Z1bmMsZXhjKSApDQogICAgICAgICAgICByYWlzZQ0KICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCAiPDxsZWF2aW5nICVzIChyZXQ6ICVyKVxuIiAlICh0aGlzRnVuYyxyZXQpICkNCiAgICAgICAgcmV0dXJuIHJldA0KICAgIHRyeToNCiAgICAgICAgei5fX25hbWVfXyA9IGYuX19uYW1lX18NCiAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6DQogICAgICAgIHBhc3MNCiAgICByZXR1cm4geg0KDQojDQojIGdsb2JhbCBoZWxwZXJzDQojDQpkZWYgZGVsaW1pdGVkTGlzdCggZXhwciwgZGVsaW09IiwiLCBjb21iaW5lPUZhbHNlICk6DQogICAgIiIiDQogICAgSGVscGVyIHRvIGRlZmluZSBhIGRlbGltaXRlZCBsaXN0IG9mIGV4cHJlc3Npb25zIC0gdGhlIGRlbGltaXRlciBkZWZhdWx0cyB0byAnLCcuDQogICAgQnkgZGVmYXVsdCwgdGhlIGxpc3QgZWxlbWVudHMgYW5kIGRlbGltaXRlcnMgY2FuIGhhdmUgaW50ZXJ2ZW5pbmcgd2hpdGVzcGFjZSwgYW5kDQogICAgY29tbWVudHMsIGJ1dCB0aGlzIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHBhc3NpbmcgQ3tjb21iaW5lPVRydWV9IGluIHRoZSBjb25zdHJ1Y3Rvci4NCiAgICBJZiBDe2NvbWJpbmV9IGlzIHNldCB0byBDe1RydWV9LCB0aGUgbWF0Y2hpbmcgdG9rZW5zIGFyZSByZXR1cm5lZCBhcyBhIHNpbmdsZSB0b2tlbg0KICAgIHN0cmluZywgd2l0aCB0aGUgZGVsaW1pdGVycyBpbmNsdWRlZDsgb3RoZXJ3aXNlLCB0aGUgbWF0Y2hpbmcgdG9rZW5zIGFyZSByZXR1cm5lZA0KICAgIGFzIGEgbGlzdCBvZiB0b2tlbnMsIHdpdGggdGhlIGRlbGltaXRlcnMgc3VwcHJlc3NlZC4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBkZWxpbWl0ZWRMaXN0KFdvcmQoYWxwaGFzKSkucGFyc2VTdHJpbmcoImFhLGJiLGNjIikgIyAtPiBbJ2FhJywgJ2JiJywgJ2NjJ10NCiAgICAgICAgZGVsaW1pdGVkTGlzdChXb3JkKGhleG51bXMpLCBkZWxpbT0nOicsIGNvbWJpbmU9VHJ1ZSkucGFyc2VTdHJpbmcoIkFBOkJCOkNDOkREOkVFIikgIyAtPiBbJ0FBOkJCOkNDOkREOkVFJ10NCiAgICAiIiINCiAgICBkbE5hbWUgPSBfdXN0cihleHByKSsiIFsiK191c3RyKGRlbGltKSsiICIrX3VzdHIoZXhwcikrIl0uLi4iDQogICAgaWYgY29tYmluZToNCiAgICAgICAgcmV0dXJuIENvbWJpbmUoIGV4cHIgKyBaZXJvT3JNb3JlKCBkZWxpbSArIGV4cHIgKSApLnNldE5hbWUoZGxOYW1lKQ0KICAgIGVsc2U6DQogICAgICAgIHJldHVybiAoIGV4cHIgKyBaZXJvT3JNb3JlKCBTdXBwcmVzcyggZGVsaW0gKSArIGV4cHIgKSApLnNldE5hbWUoZGxOYW1lKQ0KDQpkZWYgY291bnRlZEFycmF5KCBleHByLCBpbnRFeHByPU5vbmUgKToNCiAgICAiIiINCiAgICBIZWxwZXIgdG8gZGVmaW5lIGEgY291bnRlZCBsaXN0IG9mIGV4cHJlc3Npb25zLg0KICAgIFRoaXMgaGVscGVyIGRlZmluZXMgYSBwYXR0ZXJuIG9mIHRoZSBmb3JtOjoNCiAgICAgICAgaW50ZWdlciBleHByIGV4cHIgZXhwci4uLg0KICAgIHdoZXJlIHRoZSBsZWFkaW5nIGludGVnZXIgdGVsbHMgaG93IG1hbnkgZXhwciBleHByZXNzaW9ucyBmb2xsb3cuDQogICAgVGhlIG1hdGNoZWQgdG9rZW5zIHJldHVybnMgdGhlIGFycmF5IG9mIGV4cHIgdG9rZW5zIGFzIGEgbGlzdCAtIHRoZSBsZWFkaW5nIGNvdW50IHRva2VuIGlzIHN1cHByZXNzZWQuDQogICAgDQogICAgSWYgQ3tpbnRFeHByfSBpcyBzcGVjaWZpZWQsIGl0IHNob3VsZCBiZSBhIHB5cGFyc2luZyBleHByZXNzaW9uIHRoYXQgcHJvZHVjZXMgYW4gaW50ZWdlciB2YWx1ZS4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBjb3VudGVkQXJyYXkoV29yZChhbHBoYXMpKS5wYXJzZVN0cmluZygnMiBhYiBjZCBlZicpICAjIC0+IFsnYWInLCAnY2QnXQ0KDQogICAgICAgICMgaW4gdGhpcyBwYXJzZXIsIHRoZSBsZWFkaW5nIGludGVnZXIgdmFsdWUgaXMgZ2l2ZW4gaW4gYmluYXJ5LA0KICAgICAgICAjICcxMCcgaW5kaWNhdGluZyB0aGF0IDIgdmFsdWVzIGFyZSBpbiB0aGUgYXJyYXkNCiAgICAgICAgYmluYXJ5Q29uc3RhbnQgPSBXb3JkKCcwMScpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0OiBpbnQodFswXSwgMikpDQogICAgICAgIGNvdW50ZWRBcnJheShXb3JkKGFscGhhcyksIGludEV4cHI9YmluYXJ5Q29uc3RhbnQpLnBhcnNlU3RyaW5nKCcxMCBhYiBjZCBlZicpICAjIC0+IFsnYWInLCAnY2QnXQ0KICAgICIiIg0KICAgIGFycmF5RXhwciA9IEZvcndhcmQoKQ0KICAgIGRlZiBjb3VudEZpZWxkUGFyc2VBY3Rpb24ocyxsLHQpOg0KICAgICAgICBuID0gdFswXQ0KICAgICAgICBhcnJheUV4cHIgPDwgKG4gYW5kIEdyb3VwKEFuZChbZXhwcl0qbikpIG9yIEdyb3VwKGVtcHR5KSkNCiAgICAgICAgcmV0dXJuIFtdDQogICAgaWYgaW50RXhwciBpcyBOb25lOg0KICAgICAgICBpbnRFeHByID0gV29yZChudW1zKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgdDppbnQodFswXSkpDQogICAgZWxzZToNCiAgICAgICAgaW50RXhwciA9IGludEV4cHIuY29weSgpDQogICAgaW50RXhwci5zZXROYW1lKCJhcnJheUxlbiIpDQogICAgaW50RXhwci5hZGRQYXJzZUFjdGlvbihjb3VudEZpZWxkUGFyc2VBY3Rpb24sIGNhbGxEdXJpbmdUcnk9VHJ1ZSkNCiAgICByZXR1cm4gKCBpbnRFeHByICsgYXJyYXlFeHByICkuc2V0TmFtZSgnKGxlbikgJyArIF91c3RyKGV4cHIpICsgJy4uLicpDQoNCmRlZiBfZmxhdHRlbihMKToNCiAgICByZXQgPSBbXQ0KICAgIGZvciBpIGluIEw6DQogICAgICAgIGlmIGlzaW5zdGFuY2UoaSxsaXN0KToNCiAgICAgICAgICAgIHJldC5leHRlbmQoX2ZsYXR0ZW4oaSkpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByZXQuYXBwZW5kKGkpDQogICAgcmV0dXJuIHJldA0KDQpkZWYgbWF0Y2hQcmV2aW91c0xpdGVyYWwoZXhwcik6DQogICAgIiIiDQogICAgSGVscGVyIHRvIGRlZmluZSBhbiBleHByZXNzaW9uIHRoYXQgaXMgaW5kaXJlY3RseSBkZWZpbmVkIGZyb20NCiAgICB0aGUgdG9rZW5zIG1hdGNoZWQgaW4gYSBwcmV2aW91cyBleHByZXNzaW9uLCB0aGF0IGlzLCBpdCBsb29rcw0KICAgIGZvciBhICdyZXBlYXQnIG9mIGEgcHJldmlvdXMgZXhwcmVzc2lvbi4gIEZvciBleGFtcGxlOjoNCiAgICAgICAgZmlyc3QgPSBXb3JkKG51bXMpDQogICAgICAgIHNlY29uZCA9IG1hdGNoUHJldmlvdXNMaXRlcmFsKGZpcnN0KQ0KICAgICAgICBtYXRjaEV4cHIgPSBmaXJzdCArICI6IiArIHNlY29uZA0KICAgIHdpbGwgbWF0Y2ggQ3siMToxIn0sIGJ1dCBub3QgQ3siMToyIn0uICBCZWNhdXNlIHRoaXMgbWF0Y2hlcyBhDQogICAgcHJldmlvdXMgbGl0ZXJhbCwgd2lsbCBhbHNvIG1hdGNoIHRoZSBsZWFkaW5nIEN7IjE6MSJ9IGluIEN7IjE6MTAifS4NCiAgICBJZiB0aGlzIGlzIG5vdCBkZXNpcmVkLCB1c2UgQ3ttYXRjaFByZXZpb3VzRXhwcn0uDQogICAgRG8gSXtub3R9IHVzZSB3aXRoIHBhY2tyYXQgcGFyc2luZyBlbmFibGVkLg0KICAgICIiIg0KICAgIHJlcCA9IEZvcndhcmQoKQ0KICAgIGRlZiBjb3B5VG9rZW5Ub1JlcGVhdGVyKHMsbCx0KToNCiAgICAgICAgaWYgdDoNCiAgICAgICAgICAgIGlmIGxlbih0KSA9PSAxOg0KICAgICAgICAgICAgICAgIHJlcCA8PCB0WzBdDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICMgZmxhdHRlbiB0IHRva2Vucw0KICAgICAgICAgICAgICAgIHRmbGF0ID0gX2ZsYXR0ZW4odC5hc0xpc3QoKSkNCiAgICAgICAgICAgICAgICByZXAgPDwgQW5kKExpdGVyYWwodHQpIGZvciB0dCBpbiB0ZmxhdCkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJlcCA8PCBFbXB0eSgpDQogICAgZXhwci5hZGRQYXJzZUFjdGlvbihjb3B5VG9rZW5Ub1JlcGVhdGVyLCBjYWxsRHVyaW5nVHJ5PVRydWUpDQogICAgcmVwLnNldE5hbWUoJyhwcmV2KSAnICsgX3VzdHIoZXhwcikpDQogICAgcmV0dXJuIHJlcA0KDQpkZWYgbWF0Y2hQcmV2aW91c0V4cHIoZXhwcik6DQogICAgIiIiDQogICAgSGVscGVyIHRvIGRlZmluZSBhbiBleHByZXNzaW9uIHRoYXQgaXMgaW5kaXJlY3RseSBkZWZpbmVkIGZyb20NCiAgICB0aGUgdG9rZW5zIG1hdGNoZWQgaW4gYSBwcmV2aW91cyBleHByZXNzaW9uLCB0aGF0IGlzLCBpdCBsb29rcw0KICAgIGZvciBhICdyZXBlYXQnIG9mIGEgcHJldmlvdXMgZXhwcmVzc2lvbi4gIEZvciBleGFtcGxlOjoNCiAgICAgICAgZmlyc3QgPSBXb3JkKG51bXMpDQogICAgICAgIHNlY29uZCA9IG1hdGNoUHJldmlvdXNFeHByKGZpcnN0KQ0KICAgICAgICBtYXRjaEV4cHIgPSBmaXJzdCArICI6IiArIHNlY29uZA0KICAgIHdpbGwgbWF0Y2ggQ3siMToxIn0sIGJ1dCBub3QgQ3siMToyIn0uICBCZWNhdXNlIHRoaXMgbWF0Y2hlcyBieQ0KICAgIGV4cHJlc3Npb25zLCB3aWxsIEl7bm90fSBtYXRjaCB0aGUgbGVhZGluZyBDeyIxOjEifSBpbiBDeyIxOjEwIn07DQogICAgdGhlIGV4cHJlc3Npb25zIGFyZSBldmFsdWF0ZWQgZmlyc3QsIGFuZCB0aGVuIGNvbXBhcmVkLCBzbw0KICAgIEN7IjEifSBpcyBjb21wYXJlZCB3aXRoIEN7IjEwIn0uDQogICAgRG8gSXtub3R9IHVzZSB3aXRoIHBhY2tyYXQgcGFyc2luZyBlbmFibGVkLg0KICAgICIiIg0KICAgIHJlcCA9IEZvcndhcmQoKQ0KICAgIGUyID0gZXhwci5jb3B5KCkNCiAgICByZXAgPDw9IGUyDQogICAgZGVmIGNvcHlUb2tlblRvUmVwZWF0ZXIocyxsLHQpOg0KICAgICAgICBtYXRjaFRva2VucyA9IF9mbGF0dGVuKHQuYXNMaXN0KCkpDQogICAgICAgIGRlZiBtdXN0TWF0Y2hUaGVzZVRva2VucyhzLGwsdCk6DQogICAgICAgICAgICB0aGVzZVRva2VucyA9IF9mbGF0dGVuKHQuYXNMaXN0KCkpDQogICAgICAgICAgICBpZiAgdGhlc2VUb2tlbnMgIT0gbWF0Y2hUb2tlbnM6DQogICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oIiIsMCwiIikNCiAgICAgICAgcmVwLnNldFBhcnNlQWN0aW9uKCBtdXN0TWF0Y2hUaGVzZVRva2VucywgY2FsbER1cmluZ1RyeT1UcnVlICkNCiAgICBleHByLmFkZFBhcnNlQWN0aW9uKGNvcHlUb2tlblRvUmVwZWF0ZXIsIGNhbGxEdXJpbmdUcnk9VHJ1ZSkNCiAgICByZXAuc2V0TmFtZSgnKHByZXYpICcgKyBfdXN0cihleHByKSkNCiAgICByZXR1cm4gcmVwDQoNCmRlZiBfZXNjYXBlUmVnZXhSYW5nZUNoYXJzKHMpOg0KICAgICN+ICBlc2NhcGUgdGhlc2UgY2hhcnM6IF4tXQ0KICAgIGZvciBjIGluIHIiXF4tXSI6DQogICAgICAgIHMgPSBzLnJlcGxhY2UoYyxfYnNsYXNoK2MpDQogICAgcyA9IHMucmVwbGFjZSgiXG4iLHIiXG4iKQ0KICAgIHMgPSBzLnJlcGxhY2UoIlx0IixyIlx0IikNCiAgICByZXR1cm4gX3VzdHIocykNCg0KZGVmIG9uZU9mKCBzdHJzLCBjYXNlbGVzcz1GYWxzZSwgdXNlUmVnZXg9VHJ1ZSApOg0KICAgICIiIg0KICAgIEhlbHBlciB0byBxdWlja2x5IGRlZmluZSBhIHNldCBvZiBhbHRlcm5hdGl2ZSBMaXRlcmFscywgYW5kIG1ha2VzIHN1cmUgdG8gZG8NCiAgICBsb25nZXN0LWZpcnN0IHRlc3Rpbmcgd2hlbiB0aGVyZSBpcyBhIGNvbmZsaWN0LCByZWdhcmRsZXNzIG9mIHRoZSBpbnB1dCBvcmRlciwNCiAgICBidXQgcmV0dXJucyBhIEN7THtNYXRjaEZpcnN0fX0gZm9yIGJlc3QgcGVyZm9ybWFuY2UuDQoNCiAgICBQYXJhbWV0ZXJzOg0KICAgICAtIHN0cnMgLSBhIHN0cmluZyBvZiBzcGFjZS1kZWxpbWl0ZWQgbGl0ZXJhbHMsIG9yIGEgY29sbGVjdGlvbiBvZiBzdHJpbmcgbGl0ZXJhbHMNCiAgICAgLSBjYXNlbGVzcyAtIChkZWZhdWx0PUN7RmFsc2V9KSAtIHRyZWF0IGFsbCBsaXRlcmFscyBhcyBjYXNlbGVzcw0KICAgICAtIHVzZVJlZ2V4IC0gKGRlZmF1bHQ9Q3tUcnVlfSkgLSBhcyBhbiBvcHRpbWl6YXRpb24sIHdpbGwgZ2VuZXJhdGUgYSBSZWdleA0KICAgICAgICAgIG9iamVjdDsgb3RoZXJ3aXNlLCB3aWxsIGdlbmVyYXRlIGEgQ3tNYXRjaEZpcnN0fSBvYmplY3QgKGlmIEN7Y2FzZWxlc3M9VHJ1ZX0sIG9yDQogICAgICAgICAgaWYgY3JlYXRpbmcgYSBDe1JlZ2V4fSByYWlzZXMgYW4gZXhjZXB0aW9uKQ0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIGNvbXBfb3BlciA9IG9uZU9mKCI8ID0gPiA8PSA+PSAhPSIpDQogICAgICAgIHZhciA9IFdvcmQoYWxwaGFzKQ0KICAgICAgICBudW1iZXIgPSBXb3JkKG51bXMpDQogICAgICAgIHRlcm0gPSB2YXIgfCBudW1iZXINCiAgICAgICAgY29tcGFyaXNvbl9leHByID0gdGVybSArIGNvbXBfb3BlciArIHRlcm0NCiAgICAgICAgcHJpbnQoY29tcGFyaXNvbl9leHByLnNlYXJjaFN0cmluZygiQiA9IDEyICBBQT0yMyBCPD1BQSBBQT4xMiIpKQ0KICAgIHByaW50czo6DQogICAgICAgIFtbJ0InLCAnPScsICcxMiddLCBbJ0FBJywgJz0nLCAnMjMnXSwgWydCJywgJzw9JywgJ0FBJ10sIFsnQUEnLCAnPicsICcxMiddXQ0KICAgICIiIg0KICAgIGlmIGNhc2VsZXNzOg0KICAgICAgICBpc2VxdWFsID0gKCBsYW1iZGEgYSxiOiBhLnVwcGVyKCkgPT0gYi51cHBlcigpICkNCiAgICAgICAgbWFza3MgPSAoIGxhbWJkYSBhLGI6IGIudXBwZXIoKS5zdGFydHN3aXRoKGEudXBwZXIoKSkgKQ0KICAgICAgICBwYXJzZUVsZW1lbnRDbGFzcyA9IENhc2VsZXNzTGl0ZXJhbA0KICAgIGVsc2U6DQogICAgICAgIGlzZXF1YWwgPSAoIGxhbWJkYSBhLGI6IGEgPT0gYiApDQogICAgICAgIG1hc2tzID0gKCBsYW1iZGEgYSxiOiBiLnN0YXJ0c3dpdGgoYSkgKQ0KICAgICAgICBwYXJzZUVsZW1lbnRDbGFzcyA9IExpdGVyYWwNCg0KICAgIHN5bWJvbHMgPSBbXQ0KICAgIGlmIGlzaW5zdGFuY2Uoc3RycyxiYXNlc3RyaW5nKToNCiAgICAgICAgc3ltYm9scyA9IHN0cnMuc3BsaXQoKQ0KICAgIGVsaWYgaXNpbnN0YW5jZShzdHJzLCBJdGVyYWJsZSk6DQogICAgICAgIHN5bWJvbHMgPSBsaXN0KHN0cnMpDQogICAgZWxzZToNCiAgICAgICAgd2FybmluZ3Mud2FybigiSW52YWxpZCBhcmd1bWVudCB0byBvbmVPZiwgZXhwZWN0ZWQgc3RyaW5nIG9yIGl0ZXJhYmxlIiwNCiAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpDQogICAgaWYgbm90IHN5bWJvbHM6DQogICAgICAgIHJldHVybiBOb01hdGNoKCkNCg0KICAgIGkgPSAwDQogICAgd2hpbGUgaSA8IGxlbihzeW1ib2xzKS0xOg0KICAgICAgICBjdXIgPSBzeW1ib2xzW2ldDQogICAgICAgIGZvciBqLG90aGVyIGluIGVudW1lcmF0ZShzeW1ib2xzW2krMTpdKToNCiAgICAgICAgICAgIGlmICggaXNlcXVhbChvdGhlciwgY3VyKSApOg0KICAgICAgICAgICAgICAgIGRlbCBzeW1ib2xzW2kraisxXQ0KICAgICAgICAgICAgICAgIGJyZWFrDQogICAgICAgICAgICBlbGlmICggbWFza3MoY3VyLCBvdGhlcikgKToNCiAgICAgICAgICAgICAgICBkZWwgc3ltYm9sc1tpK2orMV0NCiAgICAgICAgICAgICAgICBzeW1ib2xzLmluc2VydChpLG90aGVyKQ0KICAgICAgICAgICAgICAgIGN1ciA9IG90aGVyDQogICAgICAgICAgICAgICAgYnJlYWsNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIGkgKz0gMQ0KDQogICAgaWYgbm90IGNhc2VsZXNzIGFuZCB1c2VSZWdleDoNCiAgICAgICAgI34gcHJpbnQgKHN0cnMsIi0+IiwgInwiLmpvaW4oIFsgX2VzY2FwZVJlZ2V4Q2hhcnMoc3ltKSBmb3Igc3ltIGluIHN5bWJvbHNdICkpDQogICAgICAgIHRyeToNCiAgICAgICAgICAgIGlmIGxlbihzeW1ib2xzKT09bGVuKCIiLmpvaW4oc3ltYm9scykpOg0KICAgICAgICAgICAgICAgIHJldHVybiBSZWdleCggIlslc10iICUgIiIuam9pbihfZXNjYXBlUmVnZXhSYW5nZUNoYXJzKHN5bSkgZm9yIHN5bSBpbiBzeW1ib2xzKSApLnNldE5hbWUoJyB8ICcuam9pbihzeW1ib2xzKSkNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgcmV0dXJuIFJlZ2V4KCAifCIuam9pbihyZS5lc2NhcGUoc3ltKSBmb3Igc3ltIGluIHN5bWJvbHMpICkuc2V0TmFtZSgnIHwgJy5qb2luKHN5bWJvbHMpKQ0KICAgICAgICBleGNlcHQgRXhjZXB0aW9uOg0KICAgICAgICAgICAgd2FybmluZ3Mud2FybigiRXhjZXB0aW9uIGNyZWF0aW5nIFJlZ2V4IGZvciBvbmVPZiwgYnVpbGRpbmcgTWF0Y2hGaXJzdCIsDQogICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikNCg0KDQogICAgIyBsYXN0IHJlc29ydCwganVzdCB1c2UgTWF0Y2hGaXJzdA0KICAgIHJldHVybiBNYXRjaEZpcnN0KHBhcnNlRWxlbWVudENsYXNzKHN5bSkgZm9yIHN5bSBpbiBzeW1ib2xzKS5zZXROYW1lKCcgfCAnLmpvaW4oc3ltYm9scykpDQoNCmRlZiBkaWN0T2YoIGtleSwgdmFsdWUgKToNCiAgICAiIiINCiAgICBIZWxwZXIgdG8gZWFzaWx5IGFuZCBjbGVhcmx5IGRlZmluZSBhIGRpY3Rpb25hcnkgYnkgc3BlY2lmeWluZyB0aGUgcmVzcGVjdGl2ZSBwYXR0ZXJucw0KICAgIGZvciB0aGUga2V5IGFuZCB2YWx1ZS4gIFRha2VzIGNhcmUgb2YgZGVmaW5pbmcgdGhlIEN7THtEaWN0fX0sIEN7THtaZXJvT3JNb3JlfX0sIGFuZCBDe0x7R3JvdXB9fSB0b2tlbnMNCiAgICBpbiB0aGUgcHJvcGVyIG9yZGVyLiAgVGhlIGtleSBwYXR0ZXJuIGNhbiBpbmNsdWRlIGRlbGltaXRpbmcgbWFya2VycyBvciBwdW5jdHVhdGlvbiwNCiAgICBhcyBsb25nIGFzIHRoZXkgYXJlIHN1cHByZXNzZWQsIHRoZXJlYnkgbGVhdmluZyB0aGUgc2lnbmlmaWNhbnQga2V5IHRleHQuICBUaGUgdmFsdWUNCiAgICBwYXR0ZXJuIGNhbiBpbmNsdWRlIG5hbWVkIHJlc3VsdHMsIHNvIHRoYXQgdGhlIEN7RGljdH0gcmVzdWx0cyBjYW4gaW5jbHVkZSBuYW1lZCB0b2tlbg0KICAgIGZpZWxkcy4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICB0ZXh0ID0gInNoYXBlOiBTUVVBUkUgcG9zbjogdXBwZXIgbGVmdCBjb2xvcjogbGlnaHQgYmx1ZSB0ZXh0dXJlOiBidXJsYXAiDQogICAgICAgIGF0dHJfZXhwciA9IChsYWJlbCArIFN1cHByZXNzKCc6JykgKyBPbmVPck1vcmUoZGF0YV93b3JkLCBzdG9wT249bGFiZWwpLnNldFBhcnNlQWN0aW9uKCcgJy5qb2luKSkNCiAgICAgICAgcHJpbnQoT25lT3JNb3JlKGF0dHJfZXhwcikucGFyc2VTdHJpbmcodGV4dCkuZHVtcCgpKQ0KICAgICAgICANCiAgICAgICAgYXR0cl9sYWJlbCA9IGxhYmVsDQogICAgICAgIGF0dHJfdmFsdWUgPSBTdXBwcmVzcygnOicpICsgT25lT3JNb3JlKGRhdGFfd29yZCwgc3RvcE9uPWxhYmVsKS5zZXRQYXJzZUFjdGlvbignICcuam9pbikNCg0KICAgICAgICAjIHNpbWlsYXIgdG8gRGljdCwgYnV0IHNpbXBsZXIgY2FsbCBmb3JtYXQNCiAgICAgICAgcmVzdWx0ID0gZGljdE9mKGF0dHJfbGFiZWwsIGF0dHJfdmFsdWUpLnBhcnNlU3RyaW5nKHRleHQpDQogICAgICAgIHByaW50KHJlc3VsdC5kdW1wKCkpDQogICAgICAgIHByaW50KHJlc3VsdFsnc2hhcGUnXSkNCiAgICAgICAgcHJpbnQocmVzdWx0LnNoYXBlKSAgIyBvYmplY3QgYXR0cmlidXRlIGFjY2VzcyB3b3JrcyB0b28NCiAgICAgICAgcHJpbnQocmVzdWx0LmFzRGljdCgpKQ0KICAgIHByaW50czo6DQogICAgICAgIFtbJ3NoYXBlJywgJ1NRVUFSRSddLCBbJ3Bvc24nLCAndXBwZXIgbGVmdCddLCBbJ2NvbG9yJywgJ2xpZ2h0IGJsdWUnXSwgWyd0ZXh0dXJlJywgJ2J1cmxhcCddXQ0KICAgICAgICAtIGNvbG9yOiBsaWdodCBibHVlDQogICAgICAgIC0gcG9zbjogdXBwZXIgbGVmdA0KICAgICAgICAtIHNoYXBlOiBTUVVBUkUNCiAgICAgICAgLSB0ZXh0dXJlOiBidXJsYXANCiAgICAgICAgU1FVQVJFDQogICAgICAgIFNRVUFSRQ0KICAgICAgICB7J2NvbG9yJzogJ2xpZ2h0IGJsdWUnLCAnc2hhcGUnOiAnU1FVQVJFJywgJ3Bvc24nOiAndXBwZXIgbGVmdCcsICd0ZXh0dXJlJzogJ2J1cmxhcCd9DQogICAgIiIiDQogICAgcmV0dXJuIERpY3QoIFplcm9Pck1vcmUoIEdyb3VwICgga2V5ICsgdmFsdWUgKSApICkNCg0KZGVmIG9yaWdpbmFsVGV4dEZvcihleHByLCBhc1N0cmluZz1UcnVlKToNCiAgICAiIiINCiAgICBIZWxwZXIgdG8gcmV0dXJuIHRoZSBvcmlnaW5hbCwgdW50b2tlbml6ZWQgdGV4dCBmb3IgYSBnaXZlbiBleHByZXNzaW9uLiAgVXNlZnVsIHRvDQogICAgcmVzdG9yZSB0aGUgcGFyc2VkIGZpZWxkcyBvZiBhbiBIVE1MIHN0YXJ0IHRhZyBpbnRvIHRoZSByYXcgdGFnIHRleHQgaXRzZWxmLCBvciB0bw0KICAgIHJldmVydCBzZXBhcmF0ZSB0b2tlbnMgd2l0aCBpbnRlcnZlbmluZyB3aGl0ZXNwYWNlIGJhY2sgdG8gdGhlIG9yaWdpbmFsIG1hdGNoaW5nDQogICAgaW5wdXQgdGV4dC4gQnkgZGVmYXVsdCwgcmV0dXJucyBhc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG9yaWdpbmFsIHBhcnNlZCB0ZXh0LiAgDQogICAgICAgDQogICAgSWYgdGhlIG9wdGlvbmFsIEN7YXNTdHJpbmd9IGFyZ3VtZW50IGlzIHBhc3NlZCBhcyBDe0ZhbHNlfSwgdGhlbiB0aGUgcmV0dXJuIHZhbHVlIGlzIGEgDQogICAgQ3tMe1BhcnNlUmVzdWx0c319IGNvbnRhaW5pbmcgYW55IHJlc3VsdHMgbmFtZXMgdGhhdCB3ZXJlIG9yaWdpbmFsbHkgbWF0Y2hlZCwgYW5kIGEgDQogICAgc2luZ2xlIHRva2VuIGNvbnRhaW5pbmcgdGhlIG9yaWdpbmFsIG1hdGNoZWQgdGV4dCBmcm9tIHRoZSBpbnB1dCBzdHJpbmcuICBTbyBpZiANCiAgICB0aGUgZXhwcmVzc2lvbiBwYXNzZWQgdG8gQ3tMe29yaWdpbmFsVGV4dEZvcn19IGNvbnRhaW5zIGV4cHJlc3Npb25zIHdpdGggZGVmaW5lZA0KICAgIHJlc3VsdHMgbmFtZXMsIHlvdSBtdXN0IHNldCBDe2FzU3RyaW5nfSB0byBDe0ZhbHNlfSBpZiB5b3Ugd2FudCB0byBwcmVzZXJ2ZSB0aG9zZQ0KICAgIHJlc3VsdHMgbmFtZSB2YWx1ZXMuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgc3JjID0gInRoaXMgaXMgdGVzdCA8Yj4gYm9sZCA8aT50ZXh0PC9pPiA8L2I+IG5vcm1hbCB0ZXh0ICINCiAgICAgICAgZm9yIHRhZyBpbiAoImIiLCJpIik6DQogICAgICAgICAgICBvcGVuZXIsY2xvc2VyID0gbWFrZUhUTUxUYWdzKHRhZykNCiAgICAgICAgICAgIHBhdHQgPSBvcmlnaW5hbFRleHRGb3Iob3BlbmVyICsgU2tpcFRvKGNsb3NlcikgKyBjbG9zZXIpDQogICAgICAgICAgICBwcmludChwYXR0LnNlYXJjaFN0cmluZyhzcmMpWzBdKQ0KICAgIHByaW50czo6DQogICAgICAgIFsnPGI+IGJvbGQgPGk+dGV4dDwvaT4gPC9iPiddDQogICAgICAgIFsnPGk+dGV4dDwvaT4nXQ0KICAgICIiIg0KICAgIGxvY01hcmtlciA9IEVtcHR5KCkuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHMsbG9jLHQ6IGxvYykNCiAgICBlbmRsb2NNYXJrZXIgPSBsb2NNYXJrZXIuY29weSgpDQogICAgZW5kbG9jTWFya2VyLmNhbGxQcmVwYXJzZSA9IEZhbHNlDQogICAgbWF0Y2hFeHByID0gbG9jTWFya2VyKCJfb3JpZ2luYWxfc3RhcnQiKSArIGV4cHIgKyBlbmRsb2NNYXJrZXIoIl9vcmlnaW5hbF9lbmQiKQ0KICAgIGlmIGFzU3RyaW5nOg0KICAgICAgICBleHRyYWN0VGV4dCA9IGxhbWJkYSBzLGwsdDogc1t0Ll9vcmlnaW5hbF9zdGFydDp0Ll9vcmlnaW5hbF9lbmRdDQogICAgZWxzZToNCiAgICAgICAgZGVmIGV4dHJhY3RUZXh0KHMsbCx0KToNCiAgICAgICAgICAgIHRbOl0gPSBbc1t0LnBvcCgnX29yaWdpbmFsX3N0YXJ0Jyk6dC5wb3AoJ19vcmlnaW5hbF9lbmQnKV1dDQogICAgbWF0Y2hFeHByLnNldFBhcnNlQWN0aW9uKGV4dHJhY3RUZXh0KQ0KICAgIG1hdGNoRXhwci5pZ25vcmVFeHBycyA9IGV4cHIuaWdub3JlRXhwcnMNCiAgICByZXR1cm4gbWF0Y2hFeHByDQoNCmRlZiB1bmdyb3VwKGV4cHIpOiANCiAgICAiIiINCiAgICBIZWxwZXIgdG8gdW5kbyBweXBhcnNpbmcncyBkZWZhdWx0IGdyb3VwaW5nIG9mIEFuZCBleHByZXNzaW9ucywgZXZlbg0KICAgIGlmIGFsbCBidXQgb25lIGFyZSBub24tZW1wdHkuDQogICAgIiIiDQogICAgcmV0dXJuIFRva2VuQ29udmVydGVyKGV4cHIpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0OnRbMF0pDQoNCmRlZiBsb2NhdGVkRXhwcihleHByKToNCiAgICAiIiINCiAgICBIZWxwZXIgdG8gZGVjb3JhdGUgYSByZXR1cm5lZCB0b2tlbiB3aXRoIGl0cyBzdGFydGluZyBhbmQgZW5kaW5nIGxvY2F0aW9ucyBpbiB0aGUgaW5wdXQgc3RyaW5nLg0KICAgIFRoaXMgaGVscGVyIGFkZHMgdGhlIGZvbGxvd2luZyByZXN1bHRzIG5hbWVzOg0KICAgICAtIGxvY25fc3RhcnQgPSBsb2NhdGlvbiB3aGVyZSBtYXRjaGVkIGV4cHJlc3Npb24gYmVnaW5zDQogICAgIC0gbG9jbl9lbmQgPSBsb2NhdGlvbiB3aGVyZSBtYXRjaGVkIGV4cHJlc3Npb24gZW5kcw0KICAgICAtIHZhbHVlID0gdGhlIGFjdHVhbCBwYXJzZWQgcmVzdWx0cw0KDQogICAgQmUgY2FyZWZ1bCBpZiB0aGUgaW5wdXQgdGV4dCBjb250YWlucyBDezxUQUI+fSBjaGFyYWN0ZXJzLCB5b3UgbWF5IHdhbnQgdG8gY2FsbA0KICAgIEN7THtQYXJzZXJFbGVtZW50LnBhcnNlV2l0aFRhYnN9fQ0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIHdkID0gV29yZChhbHBoYXMpDQogICAgICAgIGZvciBtYXRjaCBpbiBsb2NhdGVkRXhwcih3ZCkuc2VhcmNoU3RyaW5nKCJsanNkZjEyM2xrc2RqamYxMjNsa2tqajEyMjIiKToNCiAgICAgICAgICAgIHByaW50KG1hdGNoKQ0KICAgIHByaW50czo6DQogICAgICAgIFtbMCwgJ2xqc2RmJywgNV1dDQogICAgICAgIFtbOCwgJ2xrc2RqamYnLCAxNV1dDQogICAgICAgIFtbMTgsICdsa2tqaicsIDIzXV0NCiAgICAiIiINCiAgICBsb2NhdG9yID0gRW1wdHkoKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcyxsLHQ6IGwpDQogICAgcmV0dXJuIEdyb3VwKGxvY2F0b3IoImxvY25fc3RhcnQiKSArIGV4cHIoInZhbHVlIikgKyBsb2NhdG9yLmNvcHkoKS5sZWF2ZVdoaXRlc3BhY2UoKSgibG9jbl9lbmQiKSkNCg0KDQojIGNvbnZlbmllbmNlIGNvbnN0YW50cyBmb3IgcG9zaXRpb25hbCBleHByZXNzaW9ucw0KZW1wdHkgICAgICAgPSBFbXB0eSgpLnNldE5hbWUoImVtcHR5IikNCmxpbmVTdGFydCAgID0gTGluZVN0YXJ0KCkuc2V0TmFtZSgibGluZVN0YXJ0IikNCmxpbmVFbmQgICAgID0gTGluZUVuZCgpLnNldE5hbWUoImxpbmVFbmQiKQ0Kc3RyaW5nU3RhcnQgPSBTdHJpbmdTdGFydCgpLnNldE5hbWUoInN0cmluZ1N0YXJ0IikNCnN0cmluZ0VuZCAgID0gU3RyaW5nRW5kKCkuc2V0TmFtZSgic3RyaW5nRW5kIikNCg0KX2VzY2FwZWRQdW5jID0gV29yZCggX2JzbGFzaCwgciJcW10tKi4kK14/KCl+ICIsIGV4YWN0PTIgKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcyxsLHQ6dFswXVsxXSkNCl9lc2NhcGVkSGV4Q2hhciA9IFJlZ2V4KHIiXFwwP1t4WF1bMC05YS1mQS1GXSsiKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcyxsLHQ6dW5pY2hyKGludCh0WzBdLmxzdHJpcChyJ1wweCcpLDE2KSkpDQpfZXNjYXBlZE9jdENoYXIgPSBSZWdleChyIlxcMFswLTddKyIpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSBzLGwsdDp1bmljaHIoaW50KHRbMF1bMTpdLDgpKSkNCl9zaW5nbGVDaGFyID0gX2VzY2FwZWRQdW5jIHwgX2VzY2FwZWRIZXhDaGFyIHwgX2VzY2FwZWRPY3RDaGFyIHwgQ2hhcnNOb3RJbihyJ1xdJywgZXhhY3Q9MSkNCl9jaGFyUmFuZ2UgPSBHcm91cChfc2luZ2xlQ2hhciArIFN1cHByZXNzKCItIikgKyBfc2luZ2xlQ2hhcikNCl9yZUJyYWNrZXRFeHByID0gTGl0ZXJhbCgiWyIpICsgT3B0aW9uYWwoIl4iKS5zZXRSZXN1bHRzTmFtZSgibmVnYXRlIikgKyBHcm91cCggT25lT3JNb3JlKCBfY2hhclJhbmdlIHwgX3NpbmdsZUNoYXIgKSApLnNldFJlc3VsdHNOYW1lKCJib2R5IikgKyAiXSINCg0KZGVmIHNyYW5nZShzKToNCiAgICByIiIiDQogICAgSGVscGVyIHRvIGVhc2lseSBkZWZpbmUgc3RyaW5nIHJhbmdlcyBmb3IgdXNlIGluIFdvcmQgY29uc3RydWN0aW9uLiAgQm9ycm93cw0KICAgIHN5bnRheCBmcm9tIHJlZ2V4cCAnW10nIHN0cmluZyByYW5nZSBkZWZpbml0aW9uczo6DQogICAgICAgIHNyYW5nZSgiWzAtOV0iKSAgIC0+ICIwMTIzNDU2Nzg5Ig0KICAgICAgICBzcmFuZ2UoIlthLXpdIikgICAtPiAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiDQogICAgICAgIHNyYW5nZSgiW2EteiRfXSIpIC0+ICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiRfIg0KICAgIFRoZSBpbnB1dCBzdHJpbmcgbXVzdCBiZSBlbmNsb3NlZCBpbiBbXSdzLCBhbmQgdGhlIHJldHVybmVkIHN0cmluZyBpcyB0aGUgZXhwYW5kZWQNCiAgICBjaGFyYWN0ZXIgc2V0IGpvaW5lZCBpbnRvIGEgc2luZ2xlIHN0cmluZy4NCiAgICBUaGUgdmFsdWVzIGVuY2xvc2VkIGluIHRoZSBbXSdzIG1heSBiZToNCiAgICAgLSBhIHNpbmdsZSBjaGFyYWN0ZXINCiAgICAgLSBhbiBlc2NhcGVkIGNoYXJhY3RlciB3aXRoIGEgbGVhZGluZyBiYWNrc2xhc2ggKHN1Y2ggYXMgQ3tcLX0gb3IgQ3tcXX0pDQogICAgIC0gYW4gZXNjYXBlZCBoZXggY2hhcmFjdGVyIHdpdGggYSBsZWFkaW5nIEN7J1x4J30gKEN7XHgyMX0sIHdoaWNoIGlzIGEgQ3snISd9IGNoYXJhY3RlcikgDQogICAgICAgICAoQ3tcMHgjI30gaXMgYWxzbyBzdXBwb3J0ZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5KSANCiAgICAgLSBhbiBlc2NhcGVkIG9jdGFsIGNoYXJhY3RlciB3aXRoIGEgbGVhZGluZyBDeydcMCd9IChDe1wwNDF9LCB3aGljaCBpcyBhIEN7JyEnfSBjaGFyYWN0ZXIpDQogICAgIC0gYSByYW5nZSBvZiBhbnkgb2YgdGhlIGFib3ZlLCBzZXBhcmF0ZWQgYnkgYSBkYXNoIChDeydhLXonfSwgZXRjLikNCiAgICAgLSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGFib3ZlIChDeydhZWlvdXknfSwgQ3snYS16QS1aMC05XyQnfSwgZXRjLikNCiAgICAiIiINCiAgICBfZXhwYW5kZWQgPSBsYW1iZGEgcDogcCBpZiBub3QgaXNpbnN0YW5jZShwLFBhcnNlUmVzdWx0cykgZWxzZSAnJy5qb2luKHVuaWNocihjKSBmb3IgYyBpbiByYW5nZShvcmQocFswXSksb3JkKHBbMV0pKzEpKQ0KICAgIHRyeToNCiAgICAgICAgcmV0dXJuICIiLmpvaW4oX2V4cGFuZGVkKHBhcnQpIGZvciBwYXJ0IGluIF9yZUJyYWNrZXRFeHByLnBhcnNlU3RyaW5nKHMpLmJvZHkpDQogICAgZXhjZXB0IEV4Y2VwdGlvbjoNCiAgICAgICAgcmV0dXJuICIiDQoNCmRlZiBtYXRjaE9ubHlBdENvbChuKToNCiAgICAiIiINCiAgICBIZWxwZXIgbWV0aG9kIGZvciBkZWZpbmluZyBwYXJzZSBhY3Rpb25zIHRoYXQgcmVxdWlyZSBtYXRjaGluZyBhdCBhIHNwZWNpZmljDQogICAgY29sdW1uIGluIHRoZSBpbnB1dCB0ZXh0Lg0KICAgICIiIg0KICAgIGRlZiB2ZXJpZnlDb2woc3RyZyxsb2NuLHRva3MpOg0KICAgICAgICBpZiBjb2wobG9jbixzdHJnKSAhPSBuOg0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oc3RyZyxsb2NuLCJtYXRjaGVkIHRva2VuIG5vdCBhdCBjb2x1bW4gJWQiICUgbikNCiAgICByZXR1cm4gdmVyaWZ5Q29sDQoNCmRlZiByZXBsYWNlV2l0aChyZXBsU3RyKToNCiAgICAiIiINCiAgICBIZWxwZXIgbWV0aG9kIGZvciBjb21tb24gcGFyc2UgYWN0aW9ucyB0aGF0IHNpbXBseSByZXR1cm4gYSBsaXRlcmFsIHZhbHVlLiAgRXNwZWNpYWxseQ0KICAgIHVzZWZ1bCB3aGVuIHVzZWQgd2l0aCBDe0x7dHJhbnNmb3JtU3RyaW5nPFBhcnNlckVsZW1lbnQudHJhbnNmb3JtU3RyaW5nPn0oKX0uDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgbnVtID0gV29yZChudW1zKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgdG9rczogaW50KHRva3NbMF0pKQ0KICAgICAgICBuYSA9IG9uZU9mKCJOL0EgTkEiKS5zZXRQYXJzZUFjdGlvbihyZXBsYWNlV2l0aChtYXRoLm5hbikpDQogICAgICAgIHRlcm0gPSBuYSB8IG51bQ0KICAgICAgICANCiAgICAgICAgT25lT3JNb3JlKHRlcm0pLnBhcnNlU3RyaW5nKCIzMjQgMjM0IE4vQSAyMzQiKSAjIC0+IFszMjQsIDIzNCwgbmFuLCAyMzRdDQogICAgIiIiDQogICAgcmV0dXJuIGxhbWJkYSBzLGwsdDogW3JlcGxTdHJdDQoNCmRlZiByZW1vdmVRdW90ZXMocyxsLHQpOg0KICAgICIiIg0KICAgIEhlbHBlciBwYXJzZSBhY3Rpb24gZm9yIHJlbW92aW5nIHF1b3RhdGlvbiBtYXJrcyBmcm9tIHBhcnNlZCBxdW90ZWQgc3RyaW5ncy4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICAjIGJ5IGRlZmF1bHQsIHF1b3RhdGlvbiBtYXJrcyBhcmUgaW5jbHVkZWQgaW4gcGFyc2VkIHJlc3VsdHMNCiAgICAgICAgcXVvdGVkU3RyaW5nLnBhcnNlU3RyaW5nKCInTm93IGlzIHRoZSBXaW50ZXIgb2Ygb3VyIERpc2NvbnRlbnQnIikgIyAtPiBbIidOb3cgaXMgdGhlIFdpbnRlciBvZiBvdXIgRGlzY29udGVudCciXQ0KDQogICAgICAgICMgdXNlIHJlbW92ZVF1b3RlcyB0byBzdHJpcCBxdW90YXRpb24gbWFya3MgZnJvbSBwYXJzZWQgcmVzdWx0cw0KICAgICAgICBxdW90ZWRTdHJpbmcuc2V0UGFyc2VBY3Rpb24ocmVtb3ZlUXVvdGVzKQ0KICAgICAgICBxdW90ZWRTdHJpbmcucGFyc2VTdHJpbmcoIidOb3cgaXMgdGhlIFdpbnRlciBvZiBvdXIgRGlzY29udGVudCciKSAjIC0+IFsiTm93IGlzIHRoZSBXaW50ZXIgb2Ygb3VyIERpc2NvbnRlbnQiXQ0KICAgICIiIg0KICAgIHJldHVybiB0WzBdWzE6LTFdDQoNCmRlZiB0b2tlbk1hcChmdW5jLCAqYXJncyk6DQogICAgIiIiDQogICAgSGVscGVyIHRvIGRlZmluZSBhIHBhcnNlIGFjdGlvbiBieSBtYXBwaW5nIGEgZnVuY3Rpb24gdG8gYWxsIGVsZW1lbnRzIG9mIGEgUGFyc2VSZXN1bHRzIGxpc3QuSWYgYW55IGFkZGl0aW9uYWwgDQogICAgYXJncyBhcmUgcGFzc2VkLCB0aGV5IGFyZSBmb3J3YXJkZWQgdG8gdGhlIGdpdmVuIGZ1bmN0aW9uIGFzIGFkZGl0aW9uYWwgYXJndW1lbnRzIGFmdGVyDQogICAgdGhlIHRva2VuLCBhcyBpbiBDe2hleF9pbnRlZ2VyID0gV29yZChoZXhudW1zKS5zZXRQYXJzZUFjdGlvbih0b2tlbk1hcChpbnQsIDE2KSl9LCB3aGljaCB3aWxsIGNvbnZlcnQgdGhlDQogICAgcGFyc2VkIGRhdGEgdG8gYW4gaW50ZWdlciB1c2luZyBiYXNlIDE2Lg0KDQogICAgRXhhbXBsZSAoY29tcGFyZSB0aGUgbGFzdCB0byBleGFtcGxlIGluIEx7UGFyc2VyRWxlbWVudC50cmFuc2Zvcm1TdHJpbmd9OjoNCiAgICAgICAgaGV4X2ludHMgPSBPbmVPck1vcmUoV29yZChoZXhudW1zKSkuc2V0UGFyc2VBY3Rpb24odG9rZW5NYXAoaW50LCAxNikpDQogICAgICAgIGhleF9pbnRzLnJ1blRlc3RzKCcnJw0KICAgICAgICAgICAgMDAgMTEgMjIgYWEgRkYgMGEgMGQgMWENCiAgICAgICAgICAgICcnJykNCiAgICAgICAgDQogICAgICAgIHVwcGVyd29yZCA9IFdvcmQoYWxwaGFzKS5zZXRQYXJzZUFjdGlvbih0b2tlbk1hcChzdHIudXBwZXIpKQ0KICAgICAgICBPbmVPck1vcmUodXBwZXJ3b3JkKS5ydW5UZXN0cygnJycNCiAgICAgICAgICAgIG15IGtpbmdkb20gZm9yIGEgaG9yc2UNCiAgICAgICAgICAgICcnJykNCg0KICAgICAgICB3ZCA9IFdvcmQoYWxwaGFzKS5zZXRQYXJzZUFjdGlvbih0b2tlbk1hcChzdHIudGl0bGUpKQ0KICAgICAgICBPbmVPck1vcmUod2QpLnNldFBhcnNlQWN0aW9uKCcgJy5qb2luKS5ydW5UZXN0cygnJycNCiAgICAgICAgICAgIG5vdyBpcyB0aGUgd2ludGVyIG9mIG91ciBkaXNjb250ZW50IG1hZGUgZ2xvcmlvdXMgc3VtbWVyIGJ5IHRoaXMgc3VuIG9mIHlvcmsNCiAgICAgICAgICAgICcnJykNCiAgICBwcmludHM6Og0KICAgICAgICAwMCAxMSAyMiBhYSBGRiAwYSAwZCAxYQ0KICAgICAgICBbMCwgMTcsIDM0LCAxNzAsIDI1NSwgMTAsIDEzLCAyNl0NCg0KICAgICAgICBteSBraW5nZG9tIGZvciBhIGhvcnNlDQogICAgICAgIFsnTVknLCAnS0lOR0RPTScsICdGT1InLCAnQScsICdIT1JTRSddDQoNCiAgICAgICAgbm93IGlzIHRoZSB3aW50ZXIgb2Ygb3VyIGRpc2NvbnRlbnQgbWFkZSBnbG9yaW91cyBzdW1tZXIgYnkgdGhpcyBzdW4gb2YgeW9yaw0KICAgICAgICBbJ05vdyBJcyBUaGUgV2ludGVyIE9mIE91ciBEaXNjb250ZW50IE1hZGUgR2xvcmlvdXMgU3VtbWVyIEJ5IFRoaXMgU3VuIE9mIFlvcmsnXQ0KICAgICIiIg0KICAgIGRlZiBwYShzLGwsdCk6DQogICAgICAgIHJldHVybiBbZnVuYyh0b2tuLCAqYXJncykgZm9yIHRva24gaW4gdF0NCg0KICAgIHRyeToNCiAgICAgICAgZnVuY19uYW1lID0gZ2V0YXR0cihmdW5jLCAnX19uYW1lX18nLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRhdHRyKGZ1bmMsICdfX2NsYXNzX18nKS5fX25hbWVfXykNCiAgICBleGNlcHQgRXhjZXB0aW9uOg0KICAgICAgICBmdW5jX25hbWUgPSBzdHIoZnVuYykNCiAgICBwYS5fX25hbWVfXyA9IGZ1bmNfbmFtZQ0KDQogICAgcmV0dXJuIHBhDQoNCnVwY2FzZVRva2VucyA9IHRva2VuTWFwKGxhbWJkYSB0OiBfdXN0cih0KS51cHBlcigpKQ0KIiIiKERlcHJlY2F0ZWQpIEhlbHBlciBwYXJzZSBhY3Rpb24gdG8gY29udmVydCB0b2tlbnMgdG8gdXBwZXIgY2FzZS4gRGVwcmVjYXRlZCBpbiBmYXZvciBvZiBMe3B5cGFyc2luZ19jb21tb24udXBjYXNlVG9rZW5zfSIiIg0KDQpkb3duY2FzZVRva2VucyA9IHRva2VuTWFwKGxhbWJkYSB0OiBfdXN0cih0KS5sb3dlcigpKQ0KIiIiKERlcHJlY2F0ZWQpIEhlbHBlciBwYXJzZSBhY3Rpb24gdG8gY29udmVydCB0b2tlbnMgdG8gbG93ZXIgY2FzZS4gRGVwcmVjYXRlZCBpbiBmYXZvciBvZiBMe3B5cGFyc2luZ19jb21tb24uZG93bmNhc2VUb2tlbnN9IiIiDQogICAgDQpkZWYgX21ha2VUYWdzKHRhZ1N0ciwgeG1sKToNCiAgICAiIiJJbnRlcm5hbCBoZWxwZXIgdG8gY29uc3RydWN0IG9wZW5pbmcgYW5kIGNsb3NpbmcgdGFnIGV4cHJlc3Npb25zLCBnaXZlbiBhIHRhZyBuYW1lIiIiDQogICAgaWYgaXNpbnN0YW5jZSh0YWdTdHIsYmFzZXN0cmluZyk6DQogICAgICAgIHJlc25hbWUgPSB0YWdTdHINCiAgICAgICAgdGFnU3RyID0gS2V5d29yZCh0YWdTdHIsIGNhc2VsZXNzPW5vdCB4bWwpDQogICAgZWxzZToNCiAgICAgICAgcmVzbmFtZSA9IHRhZ1N0ci5uYW1lDQoNCiAgICB0YWdBdHRyTmFtZSA9IFdvcmQoYWxwaGFzLGFscGhhbnVtcysiXy06IikNCiAgICBpZiAoeG1sKToNCiAgICAgICAgdGFnQXR0clZhbHVlID0gZGJsUXVvdGVkU3RyaW5nLmNvcHkoKS5zZXRQYXJzZUFjdGlvbiggcmVtb3ZlUXVvdGVzICkNCiAgICAgICAgb3BlblRhZyA9IFN1cHByZXNzKCI8IikgKyB0YWdTdHIoInRhZyIpICsgXA0KICAgICAgICAgICAgICAgIERpY3QoWmVyb09yTW9yZShHcm91cCggdGFnQXR0ck5hbWUgKyBTdXBwcmVzcygiPSIpICsgdGFnQXR0clZhbHVlICkpKSArIFwNCiAgICAgICAgICAgICAgICBPcHRpb25hbCgiLyIsZGVmYXVsdD1bRmFsc2VdKS5zZXRSZXN1bHRzTmFtZSgiZW1wdHkiKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcyxsLHQ6dFswXT09Jy8nKSArIFN1cHByZXNzKCI+IikNCiAgICBlbHNlOg0KICAgICAgICBwcmludGFibGVzTGVzc1JBYnJhY2sgPSAiIi5qb2luKGMgZm9yIGMgaW4gcHJpbnRhYmxlcyBpZiBjIG5vdCBpbiAiPiIpDQogICAgICAgIHRhZ0F0dHJWYWx1ZSA9IHF1b3RlZFN0cmluZy5jb3B5KCkuc2V0UGFyc2VBY3Rpb24oIHJlbW92ZVF1b3RlcyApIHwgV29yZChwcmludGFibGVzTGVzc1JBYnJhY2spDQogICAgICAgIG9wZW5UYWcgPSBTdXBwcmVzcygiPCIpICsgdGFnU3RyKCJ0YWciKSArIFwNCiAgICAgICAgICAgICAgICBEaWN0KFplcm9Pck1vcmUoR3JvdXAoIHRhZ0F0dHJOYW1lLnNldFBhcnNlQWN0aW9uKGRvd25jYXNlVG9rZW5zKSArIFwNCiAgICAgICAgICAgICAgICBPcHRpb25hbCggU3VwcHJlc3MoIj0iKSArIHRhZ0F0dHJWYWx1ZSApICkpKSArIFwNCiAgICAgICAgICAgICAgICBPcHRpb25hbCgiLyIsZGVmYXVsdD1bRmFsc2VdKS5zZXRSZXN1bHRzTmFtZSgiZW1wdHkiKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcyxsLHQ6dFswXT09Jy8nKSArIFN1cHByZXNzKCI+IikNCiAgICBjbG9zZVRhZyA9IENvbWJpbmUoX0woIjwvIikgKyB0YWdTdHIgKyAiPiIpDQoNCiAgICBvcGVuVGFnID0gb3BlblRhZy5zZXRSZXN1bHRzTmFtZSgic3RhcnQiKyIiLmpvaW4ocmVzbmFtZS5yZXBsYWNlKCI6IiwiICIpLnRpdGxlKCkuc3BsaXQoKSkpLnNldE5hbWUoIjwlcz4iICUgcmVzbmFtZSkNCiAgICBjbG9zZVRhZyA9IGNsb3NlVGFnLnNldFJlc3VsdHNOYW1lKCJlbmQiKyIiLmpvaW4ocmVzbmFtZS5yZXBsYWNlKCI6IiwiICIpLnRpdGxlKCkuc3BsaXQoKSkpLnNldE5hbWUoIjwvJXM+IiAlIHJlc25hbWUpDQogICAgb3BlblRhZy50YWcgPSByZXNuYW1lDQogICAgY2xvc2VUYWcudGFnID0gcmVzbmFtZQ0KICAgIHJldHVybiBvcGVuVGFnLCBjbG9zZVRhZw0KDQpkZWYgbWFrZUhUTUxUYWdzKHRhZ1N0cik6DQogICAgIiIiDQogICAgSGVscGVyIHRvIGNvbnN0cnVjdCBvcGVuaW5nIGFuZCBjbG9zaW5nIHRhZyBleHByZXNzaW9ucyBmb3IgSFRNTCwgZ2l2ZW4gYSB0YWcgbmFtZS4gTWF0Y2hlcw0KICAgIHRhZ3MgaW4gZWl0aGVyIHVwcGVyIG9yIGxvd2VyIGNhc2UsIGF0dHJpYnV0ZXMgd2l0aCBuYW1lc3BhY2VzIGFuZCB3aXRoIHF1b3RlZCBvciB1bnF1b3RlZCB2YWx1ZXMuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgdGV4dCA9ICc8dGQ+TW9yZSBpbmZvIGF0IHRoZSA8YSBocmVmPSJodHRwOi8vcHlwYXJzaW5nLndpa2lzcGFjZXMuY29tIj5weXBhcnNpbmc8L2E+IHdpa2kgcGFnZTwvdGQ+Jw0KICAgICAgICAjIG1ha2VIVE1MVGFncyByZXR1cm5zIHB5cGFyc2luZyBleHByZXNzaW9ucyBmb3IgdGhlIG9wZW5pbmcgYW5kIGNsb3NpbmcgdGFncyBhcyBhIDItdHVwbGUNCiAgICAgICAgYSxhX2VuZCA9IG1ha2VIVE1MVGFncygiQSIpDQogICAgICAgIGxpbmtfZXhwciA9IGEgKyBTa2lwVG8oYV9lbmQpKCJsaW5rX3RleHQiKSArIGFfZW5kDQogICAgICAgIA0KICAgICAgICBmb3IgbGluayBpbiBsaW5rX2V4cHIuc2VhcmNoU3RyaW5nKHRleHQpOg0KICAgICAgICAgICAgIyBhdHRyaWJ1dGVzIGluIHRoZSA8QT4gdGFnIChsaWtlICJocmVmIiBzaG93biBoZXJlKSBhcmUgYWxzbyBhY2Nlc3NpYmxlIGFzIG5hbWVkIHJlc3VsdHMNCiAgICAgICAgICAgIHByaW50KGxpbmsubGlua190ZXh0LCAnLT4nLCBsaW5rLmhyZWYpDQogICAgcHJpbnRzOjoNCiAgICAgICAgcHlwYXJzaW5nIC0+IGh0dHA6Ly9weXBhcnNpbmcud2lraXNwYWNlcy5jb20NCiAgICAiIiINCiAgICByZXR1cm4gX21ha2VUYWdzKCB0YWdTdHIsIEZhbHNlICkNCg0KZGVmIG1ha2VYTUxUYWdzKHRhZ1N0cik6DQogICAgIiIiDQogICAgSGVscGVyIHRvIGNvbnN0cnVjdCBvcGVuaW5nIGFuZCBjbG9zaW5nIHRhZyBleHByZXNzaW9ucyBmb3IgWE1MLCBnaXZlbiBhIHRhZyBuYW1lLiBNYXRjaGVzDQogICAgdGFncyBvbmx5IGluIHRoZSBnaXZlbiB1cHBlci9sb3dlciBjYXNlLg0KDQogICAgRXhhbXBsZTogc2ltaWxhciB0byBMe21ha2VIVE1MVGFnc30NCiAgICAiIiINCiAgICByZXR1cm4gX21ha2VUYWdzKCB0YWdTdHIsIFRydWUgKQ0KDQpkZWYgd2l0aEF0dHJpYnV0ZSgqYXJncywqKmF0dHJEaWN0KToNCiAgICAiIiINCiAgICBIZWxwZXIgdG8gY3JlYXRlIGEgdmFsaWRhdGluZyBwYXJzZSBhY3Rpb24gdG8gYmUgdXNlZCB3aXRoIHN0YXJ0IHRhZ3MgY3JlYXRlZA0KICAgIHdpdGggQ3tMe21ha2VYTUxUYWdzfX0gb3IgQ3tMe21ha2VIVE1MVGFnc319LiBVc2UgQ3t3aXRoQXR0cmlidXRlfSB0byBxdWFsaWZ5IGEgc3RhcnRpbmcgdGFnDQogICAgd2l0aCBhIHJlcXVpcmVkIGF0dHJpYnV0ZSB2YWx1ZSwgdG8gYXZvaWQgZmFsc2UgbWF0Y2hlcyBvbiBjb21tb24gdGFncyBzdWNoIGFzDQogICAgQ3s8VEQ+fSBvciBDezxESVY+fS4NCg0KICAgIENhbGwgQ3t3aXRoQXR0cmlidXRlfSB3aXRoIGEgc2VyaWVzIG9mIGF0dHJpYnV0ZSBuYW1lcyBhbmQgdmFsdWVzLiBTcGVjaWZ5IHRoZSBsaXN0DQogICAgb2YgZmlsdGVyIGF0dHJpYnV0ZXMgbmFtZXMgYW5kIHZhbHVlcyBhczoNCiAgICAgLSBrZXl3b3JkIGFyZ3VtZW50cywgYXMgaW4gQ3soYWxpZ249InJpZ2h0Iil9LCBvcg0KICAgICAtIGFzIGFuIGV4cGxpY2l0IGRpY3Qgd2l0aCBDeyoqfSBvcGVyYXRvciwgd2hlbiBhbiBhdHRyaWJ1dGUgbmFtZSBpcyBhbHNvIGEgUHl0aG9uDQogICAgICAgICAgcmVzZXJ2ZWQgd29yZCwgYXMgaW4gQ3sqKnsiY2xhc3MiOiJDdXN0b21lciIsICJhbGlnbiI6InJpZ2h0In19DQogICAgIC0gYSBsaXN0IG9mIG5hbWUtdmFsdWUgdHVwbGVzLCBhcyBpbiAoICgibnMxOmNsYXNzIiwgIkN1c3RvbWVyIiksICgibnMyOmFsaWduIiwicmlnaHQiKSApDQogICAgRm9yIGF0dHJpYnV0ZSBuYW1lcyB3aXRoIGEgbmFtZXNwYWNlIHByZWZpeCwgeW91IG11c3QgdXNlIHRoZSBzZWNvbmQgZm9ybS4gIEF0dHJpYnV0ZQ0KICAgIG5hbWVzIGFyZSBtYXRjaGVkIGluc2Vuc2l0aXZlIHRvIHVwcGVyL2xvd2VyIGNhc2UuDQogICAgICAgDQogICAgSWYganVzdCB0ZXN0aW5nIGZvciBDe2NsYXNzfSAod2l0aCBvciB3aXRob3V0IGEgbmFtZXNwYWNlKSwgdXNlIEN7THt3aXRoQ2xhc3N9fS4NCg0KICAgIFRvIHZlcmlmeSB0aGF0IHRoZSBhdHRyaWJ1dGUgZXhpc3RzLCBidXQgd2l0aG91dCBzcGVjaWZ5aW5nIGEgdmFsdWUsIHBhc3MNCiAgICBDe3dpdGhBdHRyaWJ1dGUuQU5ZX1ZBTFVFfSBhcyB0aGUgdmFsdWUuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgaHRtbCA9ICcnJw0KICAgICAgICAgICAgPGRpdj4NCiAgICAgICAgICAgIFNvbWUgdGV4dA0KICAgICAgICAgICAgPGRpdiB0eXBlPSJncmlkIj4xIDQgMCAxIDA8L2Rpdj4NCiAgICAgICAgICAgIDxkaXYgdHlwZT0iZ3JhcGgiPjEsMyAyLDMgMSwxPC9kaXY+DQogICAgICAgICAgICA8ZGl2PnRoaXMgaGFzIG5vIHR5cGU8L2Rpdj4NCiAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgIA0KICAgICAgICAnJycNCiAgICAgICAgZGl2LGRpdl9lbmQgPSBtYWtlSFRNTFRhZ3MoImRpdiIpDQoNCiAgICAgICAgIyBvbmx5IG1hdGNoIGRpdiB0YWcgaGF2aW5nIGEgdHlwZSBhdHRyaWJ1dGUgd2l0aCB2YWx1ZSAiZ3JpZCINCiAgICAgICAgZGl2X2dyaWQgPSBkaXYoKS5zZXRQYXJzZUFjdGlvbih3aXRoQXR0cmlidXRlKHR5cGU9ImdyaWQiKSkNCiAgICAgICAgZ3JpZF9leHByID0gZGl2X2dyaWQgKyBTa2lwVG8oZGl2IHwgZGl2X2VuZCkoImJvZHkiKQ0KICAgICAgICBmb3IgZ3JpZF9oZWFkZXIgaW4gZ3JpZF9leHByLnNlYXJjaFN0cmluZyhodG1sKToNCiAgICAgICAgICAgIHByaW50KGdyaWRfaGVhZGVyLmJvZHkpDQogICAgICAgIA0KICAgICAgICAjIGNvbnN0cnVjdCBhIG1hdGNoIHdpdGggYW55IGRpdiB0YWcgaGF2aW5nIGEgdHlwZSBhdHRyaWJ1dGUsIHJlZ2FyZGxlc3Mgb2YgdGhlIHZhbHVlDQogICAgICAgIGRpdl9hbnlfdHlwZSA9IGRpdigpLnNldFBhcnNlQWN0aW9uKHdpdGhBdHRyaWJ1dGUodHlwZT13aXRoQXR0cmlidXRlLkFOWV9WQUxVRSkpDQogICAgICAgIGRpdl9leHByID0gZGl2X2FueV90eXBlICsgU2tpcFRvKGRpdiB8IGRpdl9lbmQpKCJib2R5IikNCiAgICAgICAgZm9yIGRpdl9oZWFkZXIgaW4gZGl2X2V4cHIuc2VhcmNoU3RyaW5nKGh0bWwpOg0KICAgICAgICAgICAgcHJpbnQoZGl2X2hlYWRlci5ib2R5KQ0KICAgIHByaW50czo6DQogICAgICAgIDEgNCAwIDEgMA0KDQogICAgICAgIDEgNCAwIDEgMA0KICAgICAgICAxLDMgMiwzIDEsMQ0KICAgICIiIg0KICAgIGlmIGFyZ3M6DQogICAgICAgIGF0dHJzID0gYXJnc1s6XQ0KICAgIGVsc2U6DQogICAgICAgIGF0dHJzID0gYXR0ckRpY3QuaXRlbXMoKQ0KICAgIGF0dHJzID0gWyhrLHYpIGZvciBrLHYgaW4gYXR0cnNdDQogICAgZGVmIHBhKHMsbCx0b2tlbnMpOg0KICAgICAgICBmb3IgYXR0ck5hbWUsYXR0clZhbHVlIGluIGF0dHJzOg0KICAgICAgICAgICAgaWYgYXR0ck5hbWUgbm90IGluIHRva2VuczoNCiAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihzLGwsIm5vIG1hdGNoaW5nIGF0dHJpYnV0ZSAiICsgYXR0ck5hbWUpDQogICAgICAgICAgICBpZiBhdHRyVmFsdWUgIT0gd2l0aEF0dHJpYnV0ZS5BTllfVkFMVUUgYW5kIHRva2Vuc1thdHRyTmFtZV0gIT0gYXR0clZhbHVlOg0KICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKHMsbCwiYXR0cmlidXRlICclcycgaGFzIHZhbHVlICclcycsIG11c3QgYmUgJyVzJyIgJQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXR0ck5hbWUsIHRva2Vuc1thdHRyTmFtZV0sIGF0dHJWYWx1ZSkpDQogICAgcmV0dXJuIHBhDQp3aXRoQXR0cmlidXRlLkFOWV9WQUxVRSA9IG9iamVjdCgpDQoNCmRlZiB3aXRoQ2xhc3MoY2xhc3NuYW1lLCBuYW1lc3BhY2U9JycpOg0KICAgICIiIg0KICAgIFNpbXBsaWZpZWQgdmVyc2lvbiBvZiBDe0x7d2l0aEF0dHJpYnV0ZX19IHdoZW4gbWF0Y2hpbmcgb24gYSBkaXYgY2xhc3MgLSBtYWRlDQogICAgZGlmZmljdWx0IGJlY2F1c2UgQ3tjbGFzc30gaXMgYSByZXNlcnZlZCB3b3JkIGluIFB5dGhvbi4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBodG1sID0gJycnDQogICAgICAgICAgICA8ZGl2Pg0KICAgICAgICAgICAgU29tZSB0ZXh0DQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJncmlkIj4xIDQgMCAxIDA8L2Rpdj4NCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImdyYXBoIj4xLDMgMiwzIDEsMTwvZGl2Pg0KICAgICAgICAgICAgPGRpdj50aGlzICZsdDtkaXYmZ3Q7IGhhcyBubyBjbGFzczwvZGl2Pg0KICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgDQogICAgICAgICcnJw0KICAgICAgICBkaXYsZGl2X2VuZCA9IG1ha2VIVE1MVGFncygiZGl2IikNCiAgICAgICAgZGl2X2dyaWQgPSBkaXYoKS5zZXRQYXJzZUFjdGlvbih3aXRoQ2xhc3MoImdyaWQiKSkNCiAgICAgICAgDQogICAgICAgIGdyaWRfZXhwciA9IGRpdl9ncmlkICsgU2tpcFRvKGRpdiB8IGRpdl9lbmQpKCJib2R5IikNCiAgICAgICAgZm9yIGdyaWRfaGVhZGVyIGluIGdyaWRfZXhwci5zZWFyY2hTdHJpbmcoaHRtbCk6DQogICAgICAgICAgICBwcmludChncmlkX2hlYWRlci5ib2R5KQ0KICAgICAgICANCiAgICAgICAgZGl2X2FueV90eXBlID0gZGl2KCkuc2V0UGFyc2VBY3Rpb24od2l0aENsYXNzKHdpdGhBdHRyaWJ1dGUuQU5ZX1ZBTFVFKSkNCiAgICAgICAgZGl2X2V4cHIgPSBkaXZfYW55X3R5cGUgKyBTa2lwVG8oZGl2IHwgZGl2X2VuZCkoImJvZHkiKQ0KICAgICAgICBmb3IgZGl2X2hlYWRlciBpbiBkaXZfZXhwci5zZWFyY2hTdHJpbmcoaHRtbCk6DQogICAgICAgICAgICBwcmludChkaXZfaGVhZGVyLmJvZHkpDQogICAgcHJpbnRzOjoNCiAgICAgICAgMSA0IDAgMSAwDQoNCiAgICAgICAgMSA0IDAgMSAwDQogICAgICAgIDEsMyAyLDMgMSwxDQogICAgIiIiDQogICAgY2xhc3NhdHRyID0gIiVzOmNsYXNzIiAlIG5hbWVzcGFjZSBpZiBuYW1lc3BhY2UgZWxzZSAiY2xhc3MiDQogICAgcmV0dXJuIHdpdGhBdHRyaWJ1dGUoKip7Y2xhc3NhdHRyIDogY2xhc3NuYW1lfSkgICAgICAgIA0KDQpvcEFzc29jID0gX0NvbnN0YW50cygpDQpvcEFzc29jLkxFRlQgPSBvYmplY3QoKQ0Kb3BBc3NvYy5SSUdIVCA9IG9iamVjdCgpDQoNCmRlZiBpbmZpeE5vdGF0aW9uKCBiYXNlRXhwciwgb3BMaXN0LCBscGFyPVN1cHByZXNzKCcoJyksIHJwYXI9U3VwcHJlc3MoJyknKSApOg0KICAgICIiIg0KICAgIEhlbHBlciBtZXRob2QgZm9yIGNvbnN0cnVjdGluZyBncmFtbWFycyBvZiBleHByZXNzaW9ucyBtYWRlIHVwIG9mDQogICAgb3BlcmF0b3JzIHdvcmtpbmcgaW4gYSBwcmVjZWRlbmNlIGhpZXJhcmNoeS4gIE9wZXJhdG9ycyBtYXkgYmUgdW5hcnkgb3INCiAgICBiaW5hcnksIGxlZnQtIG9yIHJpZ2h0LWFzc29jaWF0aXZlLiAgUGFyc2UgYWN0aW9ucyBjYW4gYWxzbyBiZSBhdHRhY2hlZA0KICAgIHRvIG9wZXJhdG9yIGV4cHJlc3Npb25zLiBUaGUgZ2VuZXJhdGVkIHBhcnNlciB3aWxsIGFsc28gcmVjb2duaXplIHRoZSB1c2UgDQogICAgb2YgcGFyZW50aGVzZXMgdG8gb3ZlcnJpZGUgb3BlcmF0b3IgcHJlY2VkZW5jZXMgKHNlZSBleGFtcGxlIGJlbG93KS4NCiAgICANCiAgICBOb3RlOiBpZiB5b3UgZGVmaW5lIGEgZGVlcCBvcGVyYXRvciBsaXN0LCB5b3UgbWF5IHNlZSBwZXJmb3JtYW5jZSBpc3N1ZXMNCiAgICB3aGVuIHVzaW5nIGluZml4Tm90YXRpb24uIFNlZSBMe1BhcnNlckVsZW1lbnQuZW5hYmxlUGFja3JhdH0gZm9yIGENCiAgICBtZWNoYW5pc20gdG8gcG90ZW50aWFsbHkgaW1wcm92ZSB5b3VyIHBhcnNlciBwZXJmb3JtYW5jZS4NCg0KICAgIFBhcmFtZXRlcnM6DQogICAgIC0gYmFzZUV4cHIgLSBleHByZXNzaW9uIHJlcHJlc2VudGluZyB0aGUgbW9zdCBiYXNpYyBlbGVtZW50IGZvciB0aGUgbmVzdGVkDQogICAgIC0gb3BMaXN0IC0gbGlzdCBvZiB0dXBsZXMsIG9uZSBmb3IgZWFjaCBvcGVyYXRvciBwcmVjZWRlbmNlIGxldmVsIGluIHRoZQ0KICAgICAgZXhwcmVzc2lvbiBncmFtbWFyOyBlYWNoIHR1cGxlIGlzIG9mIHRoZSBmb3JtDQogICAgICAob3BFeHByLCBudW1UZXJtcywgcmlnaHRMZWZ0QXNzb2MsIHBhcnNlQWN0aW9uKSwgd2hlcmU6DQogICAgICAgLSBvcEV4cHIgaXMgdGhlIHB5cGFyc2luZyBleHByZXNzaW9uIGZvciB0aGUgb3BlcmF0b3I7DQogICAgICAgICAgbWF5IGFsc28gYmUgYSBzdHJpbmcsIHdoaWNoIHdpbGwgYmUgY29udmVydGVkIHRvIGEgTGl0ZXJhbDsNCiAgICAgICAgICBpZiBudW1UZXJtcyBpcyAzLCBvcEV4cHIgaXMgYSB0dXBsZSBvZiB0d28gZXhwcmVzc2lvbnMsIGZvciB0aGUNCiAgICAgICAgICB0d28gb3BlcmF0b3JzIHNlcGFyYXRpbmcgdGhlIDMgdGVybXMNCiAgICAgICAtIG51bVRlcm1zIGlzIHRoZSBudW1iZXIgb2YgdGVybXMgZm9yIHRoaXMgb3BlcmF0b3IgKG11c3QNCiAgICAgICAgICBiZSAxLCAyLCBvciAzKQ0KICAgICAgIC0gcmlnaHRMZWZ0QXNzb2MgaXMgdGhlIGluZGljYXRvciB3aGV0aGVyIHRoZSBvcGVyYXRvciBpcw0KICAgICAgICAgIHJpZ2h0IG9yIGxlZnQgYXNzb2NpYXRpdmUsIHVzaW5nIHRoZSBweXBhcnNpbmctZGVmaW5lZA0KICAgICAgICAgIGNvbnN0YW50cyBDe29wQXNzb2MuUklHSFR9IGFuZCBDe29wQXNzb2MuTEVGVH0uDQogICAgICAgLSBwYXJzZUFjdGlvbiBpcyB0aGUgcGFyc2UgYWN0aW9uIHRvIGJlIGFzc29jaWF0ZWQgd2l0aA0KICAgICAgICAgIGV4cHJlc3Npb25zIG1hdGNoaW5nIHRoaXMgb3BlcmF0b3IgZXhwcmVzc2lvbiAodGhlDQogICAgICAgICAgcGFyc2UgYWN0aW9uIHR1cGxlIG1lbWJlciBtYXkgYmUgb21pdHRlZCk7IGlmIHRoZSBwYXJzZSBhY3Rpb24NCiAgICAgICAgICBpcyBwYXNzZWQgYSB0dXBsZSBvciBsaXN0IG9mIGZ1bmN0aW9ucywgdGhpcyBpcyBlcXVpdmFsZW50IHRvDQogICAgICAgICAgY2FsbGluZyBDe3NldFBhcnNlQWN0aW9uKCpmbil9IChMe1BhcnNlckVsZW1lbnQuc2V0UGFyc2VBY3Rpb259KQ0KICAgICAtIGxwYXIgLSBleHByZXNzaW9uIGZvciBtYXRjaGluZyBsZWZ0LXBhcmVudGhlc2VzIChkZWZhdWx0PUN7U3VwcHJlc3MoJygnKX0pDQogICAgIC0gcnBhciAtIGV4cHJlc3Npb24gZm9yIG1hdGNoaW5nIHJpZ2h0LXBhcmVudGhlc2VzIChkZWZhdWx0PUN7U3VwcHJlc3MoJyknKX0pDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgIyBzaW1wbGUgZXhhbXBsZSBvZiBmb3VyLWZ1bmN0aW9uIGFyaXRobWV0aWMgd2l0aCBpbnRzIGFuZCB2YXJpYWJsZSBuYW1lcw0KICAgICAgICBpbnRlZ2VyID0gcHlwYXJzaW5nX2NvbW1vbi5zaWduZWRfaW50ZWdlcg0KICAgICAgICB2YXJuYW1lID0gcHlwYXJzaW5nX2NvbW1vbi5pZGVudGlmaWVyIA0KICAgICAgICANCiAgICAgICAgYXJpdGhfZXhwciA9IGluZml4Tm90YXRpb24oaW50ZWdlciB8IHZhcm5hbWUsDQogICAgICAgICAgICBbDQogICAgICAgICAgICAoJy0nLCAxLCBvcEFzc29jLlJJR0hUKSwNCiAgICAgICAgICAgIChvbmVPZignKiAvJyksIDIsIG9wQXNzb2MuTEVGVCksDQogICAgICAgICAgICAob25lT2YoJysgLScpLCAyLCBvcEFzc29jLkxFRlQpLA0KICAgICAgICAgICAgXSkNCiAgICAgICAgDQogICAgICAgIGFyaXRoX2V4cHIucnVuVGVzdHMoJycnDQogICAgICAgICAgICA1KzMqNg0KICAgICAgICAgICAgKDUrMykqNg0KICAgICAgICAgICAgLTItLTExDQogICAgICAgICAgICAnJycsIGZ1bGxEdW1wPUZhbHNlKQ0KICAgIHByaW50czo6DQogICAgICAgIDUrMyo2DQogICAgICAgIFtbNSwgJysnLCBbMywgJyonLCA2XV1dDQoNCiAgICAgICAgKDUrMykqNg0KICAgICAgICBbW1s1LCAnKycsIDNdLCAnKicsIDZdXQ0KDQogICAgICAgIC0yLS0xMQ0KICAgICAgICBbW1snLScsIDJdLCAnLScsIFsnLScsIDExXV1dDQogICAgIiIiDQogICAgcmV0ID0gRm9yd2FyZCgpDQogICAgbGFzdEV4cHIgPSBiYXNlRXhwciB8ICggbHBhciArIHJldCArIHJwYXIgKQ0KICAgIGZvciBpLG9wZXJEZWYgaW4gZW51bWVyYXRlKG9wTGlzdCk6DQogICAgICAgIG9wRXhwcixhcml0eSxyaWdodExlZnRBc3NvYyxwYSA9IChvcGVyRGVmICsgKE5vbmUsKSlbOjRdDQogICAgICAgIHRlcm1OYW1lID0gIiVzIHRlcm0iICUgb3BFeHByIGlmIGFyaXR5IDwgMyBlbHNlICIlcyVzIHRlcm0iICUgb3BFeHByDQogICAgICAgIGlmIGFyaXR5ID09IDM6DQogICAgICAgICAgICBpZiBvcEV4cHIgaXMgTm9uZSBvciBsZW4ob3BFeHByKSAhPSAyOg0KICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImlmIG51bXRlcm1zPTMsIG9wRXhwciBtdXN0IGJlIGEgdHVwbGUgb3IgbGlzdCBvZiB0d28gZXhwcmVzc2lvbnMiKQ0KICAgICAgICAgICAgb3BFeHByMSwgb3BFeHByMiA9IG9wRXhwcg0KICAgICAgICB0aGlzRXhwciA9IEZvcndhcmQoKS5zZXROYW1lKHRlcm1OYW1lKQ0KICAgICAgICBpZiByaWdodExlZnRBc3NvYyA9PSBvcEFzc29jLkxFRlQ6DQogICAgICAgICAgICBpZiBhcml0eSA9PSAxOg0KICAgICAgICAgICAgICAgIG1hdGNoRXhwciA9IEZvbGxvd2VkQnkobGFzdEV4cHIgKyBvcEV4cHIpICsgR3JvdXAoIGxhc3RFeHByICsgT25lT3JNb3JlKCBvcEV4cHIgKSApDQogICAgICAgICAgICBlbGlmIGFyaXR5ID09IDI6DQogICAgICAgICAgICAgICAgaWYgb3BFeHByIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgICAgICAgICBtYXRjaEV4cHIgPSBGb2xsb3dlZEJ5KGxhc3RFeHByICsgb3BFeHByICsgbGFzdEV4cHIpICsgR3JvdXAoIGxhc3RFeHByICsgT25lT3JNb3JlKCBvcEV4cHIgKyBsYXN0RXhwciApICkNCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICBtYXRjaEV4cHIgPSBGb2xsb3dlZEJ5KGxhc3RFeHByK2xhc3RFeHByKSArIEdyb3VwKCBsYXN0RXhwciArIE9uZU9yTW9yZShsYXN0RXhwcikgKQ0KICAgICAgICAgICAgZWxpZiBhcml0eSA9PSAzOg0KICAgICAgICAgICAgICAgIG1hdGNoRXhwciA9IEZvbGxvd2VkQnkobGFzdEV4cHIgKyBvcEV4cHIxICsgbGFzdEV4cHIgKyBvcEV4cHIyICsgbGFzdEV4cHIpICsgXA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyb3VwKCBsYXN0RXhwciArIG9wRXhwcjEgKyBsYXN0RXhwciArIG9wRXhwcjIgKyBsYXN0RXhwciApDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm9wZXJhdG9yIG11c3QgYmUgdW5hcnkgKDEpLCBiaW5hcnkgKDIpLCBvciB0ZXJuYXJ5ICgzKSIpDQogICAgICAgIGVsaWYgcmlnaHRMZWZ0QXNzb2MgPT0gb3BBc3NvYy5SSUdIVDoNCiAgICAgICAgICAgIGlmIGFyaXR5ID09IDE6DQogICAgICAgICAgICAgICAgIyB0cnkgdG8gYXZvaWQgTFIgd2l0aCB0aGlzIGV4dHJhIHRlc3QNCiAgICAgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvcEV4cHIsIE9wdGlvbmFsKToNCiAgICAgICAgICAgICAgICAgICAgb3BFeHByID0gT3B0aW9uYWwob3BFeHByKQ0KICAgICAgICAgICAgICAgIG1hdGNoRXhwciA9IEZvbGxvd2VkQnkob3BFeHByLmV4cHIgKyB0aGlzRXhwcikgKyBHcm91cCggb3BFeHByICsgdGhpc0V4cHIgKQ0KICAgICAgICAgICAgZWxpZiBhcml0eSA9PSAyOg0KICAgICAgICAgICAgICAgIGlmIG9wRXhwciBpcyBub3QgTm9uZToNCiAgICAgICAgICAgICAgICAgICAgbWF0Y2hFeHByID0gRm9sbG93ZWRCeShsYXN0RXhwciArIG9wRXhwciArIHRoaXNFeHByKSArIEdyb3VwKCBsYXN0RXhwciArIE9uZU9yTW9yZSggb3BFeHByICsgdGhpc0V4cHIgKSApDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgbWF0Y2hFeHByID0gRm9sbG93ZWRCeShsYXN0RXhwciArIHRoaXNFeHByKSArIEdyb3VwKCBsYXN0RXhwciArIE9uZU9yTW9yZSggdGhpc0V4cHIgKSApDQogICAgICAgICAgICBlbGlmIGFyaXR5ID09IDM6DQogICAgICAgICAgICAgICAgbWF0Y2hFeHByID0gRm9sbG93ZWRCeShsYXN0RXhwciArIG9wRXhwcjEgKyB0aGlzRXhwciArIG9wRXhwcjIgKyB0aGlzRXhwcikgKyBcDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JvdXAoIGxhc3RFeHByICsgb3BFeHByMSArIHRoaXNFeHByICsgb3BFeHByMiArIHRoaXNFeHByICkNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigib3BlcmF0b3IgbXVzdCBiZSB1bmFyeSAoMSksIGJpbmFyeSAoMiksIG9yIHRlcm5hcnkgKDMpIikNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm9wZXJhdG9yIG11c3QgaW5kaWNhdGUgcmlnaHQgb3IgbGVmdCBhc3NvY2lhdGl2aXR5IikNCiAgICAgICAgaWYgcGE6DQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHBhLCAodHVwbGUsIGxpc3QpKToNCiAgICAgICAgICAgICAgICBtYXRjaEV4cHIuc2V0UGFyc2VBY3Rpb24oKnBhKQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICBtYXRjaEV4cHIuc2V0UGFyc2VBY3Rpb24ocGEpDQogICAgICAgIHRoaXNFeHByIDw8PSAoIG1hdGNoRXhwci5zZXROYW1lKHRlcm1OYW1lKSB8IGxhc3RFeHByICkNCiAgICAgICAgbGFzdEV4cHIgPSB0aGlzRXhwcg0KICAgIHJldCA8PD0gbGFzdEV4cHINCiAgICByZXR1cm4gcmV0DQoNCm9wZXJhdG9yUHJlY2VkZW5jZSA9IGluZml4Tm90YXRpb24NCiIiIihEZXByZWNhdGVkKSBGb3JtZXIgbmFtZSBvZiBDe0x7aW5maXhOb3RhdGlvbn19LCB3aWxsIGJlIGRyb3BwZWQgaW4gYSBmdXR1cmUgcmVsZWFzZS4iIiINCg0KZGJsUXVvdGVkU3RyaW5nID0gQ29tYmluZShSZWdleChyJyIoPzpbXiJcblxyXFxdfCg/OiIiKXwoPzpcXCg/OlteeF18eFswLTlhLWZBLUZdKykpKSonKSsnIicpLnNldE5hbWUoInN0cmluZyBlbmNsb3NlZCBpbiBkb3VibGUgcXVvdGVzIikNCnNnbFF1b3RlZFN0cmluZyA9IENvbWJpbmUoUmVnZXgociInKD86W14nXG5cclxcXXwoPzonJyl8KD86XFwoPzpbXnhdfHhbMC05YS1mQS1GXSspKSkqIikrIiciKS5zZXROYW1lKCJzdHJpbmcgZW5jbG9zZWQgaW4gc2luZ2xlIHF1b3RlcyIpDQpxdW90ZWRTdHJpbmcgPSBDb21iaW5lKFJlZ2V4KHInIig/OlteIlxuXHJcXF18KD86IiIpfCg/OlxcKD86W154XXx4WzAtOWEtZkEtRl0rKSkpKicpKyciJ3wNCiAgICAgICAgICAgICAgICAgICAgICAgUmVnZXgociInKD86W14nXG5cclxcXXwoPzonJyl8KD86XFwoPzpbXnhdfHhbMC05YS1mQS1GXSspKSkqIikrIiciKS5zZXROYW1lKCJxdW90ZWRTdHJpbmcgdXNpbmcgc2luZ2xlIG9yIGRvdWJsZSBxdW90ZXMiKQ0KdW5pY29kZVN0cmluZyA9IENvbWJpbmUoX0woJ3UnKSArIHF1b3RlZFN0cmluZy5jb3B5KCkpLnNldE5hbWUoInVuaWNvZGUgc3RyaW5nIGxpdGVyYWwiKQ0KDQpkZWYgbmVzdGVkRXhwcihvcGVuZXI9IigiLCBjbG9zZXI9IikiLCBjb250ZW50PU5vbmUsIGlnbm9yZUV4cHI9cXVvdGVkU3RyaW5nLmNvcHkoKSk6DQogICAgIiIiDQogICAgSGVscGVyIG1ldGhvZCBmb3IgZGVmaW5pbmcgbmVzdGVkIGxpc3RzIGVuY2xvc2VkIGluIG9wZW5pbmcgYW5kIGNsb3NpbmcNCiAgICBkZWxpbWl0ZXJzICgiKCIgYW5kICIpIiBhcmUgdGhlIGRlZmF1bHQpLg0KDQogICAgUGFyYW1ldGVyczoNCiAgICAgLSBvcGVuZXIgLSBvcGVuaW5nIGNoYXJhY3RlciBmb3IgYSBuZXN0ZWQgbGlzdCAoZGVmYXVsdD1DeyIoIn0pOyBjYW4gYWxzbyBiZSBhIHB5cGFyc2luZyBleHByZXNzaW9uDQogICAgIC0gY2xvc2VyIC0gY2xvc2luZyBjaGFyYWN0ZXIgZm9yIGEgbmVzdGVkIGxpc3QgKGRlZmF1bHQ9Q3siKSJ9KTsgY2FuIGFsc28gYmUgYSBweXBhcnNpbmcgZXhwcmVzc2lvbg0KICAgICAtIGNvbnRlbnQgLSBleHByZXNzaW9uIGZvciBpdGVtcyB3aXRoaW4gdGhlIG5lc3RlZCBsaXN0cyAoZGVmYXVsdD1De05vbmV9KQ0KICAgICAtIGlnbm9yZUV4cHIgLSBleHByZXNzaW9uIGZvciBpZ25vcmluZyBvcGVuaW5nIGFuZCBjbG9zaW5nIGRlbGltaXRlcnMgKGRlZmF1bHQ9Q3txdW90ZWRTdHJpbmd9KQ0KDQogICAgSWYgYW4gZXhwcmVzc2lvbiBpcyBub3QgcHJvdmlkZWQgZm9yIHRoZSBjb250ZW50IGFyZ3VtZW50LCB0aGUgbmVzdGVkDQogICAgZXhwcmVzc2lvbiB3aWxsIGNhcHR1cmUgYWxsIHdoaXRlc3BhY2UtZGVsaW1pdGVkIGNvbnRlbnQgYmV0d2VlbiBkZWxpbWl0ZXJzDQogICAgYXMgYSBsaXN0IG9mIHNlcGFyYXRlIHZhbHVlcy4NCg0KICAgIFVzZSB0aGUgQ3tpZ25vcmVFeHByfSBhcmd1bWVudCB0byBkZWZpbmUgZXhwcmVzc2lvbnMgdGhhdCBtYXkgY29udGFpbg0KICAgIG9wZW5pbmcgb3IgY2xvc2luZyBjaGFyYWN0ZXJzIHRoYXQgc2hvdWxkIG5vdCBiZSB0cmVhdGVkIGFzIG9wZW5pbmcNCiAgICBvciBjbG9zaW5nIGNoYXJhY3RlcnMgZm9yIG5lc3RpbmcsIHN1Y2ggYXMgcXVvdGVkU3RyaW5nIG9yIGEgY29tbWVudA0KICAgIGV4cHJlc3Npb24uICBTcGVjaWZ5IG11bHRpcGxlIGV4cHJlc3Npb25zIHVzaW5nIGFuIEN7THtPcn19IG9yIEN7THtNYXRjaEZpcnN0fX0uDQogICAgVGhlIGRlZmF1bHQgaXMgTHtxdW90ZWRTdHJpbmd9LCBidXQgaWYgbm8gZXhwcmVzc2lvbnMgYXJlIHRvIGJlIGlnbm9yZWQsDQogICAgdGhlbiBwYXNzIEN7Tm9uZX0gZm9yIHRoaXMgYXJndW1lbnQuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgZGF0YV90eXBlID0gb25lT2YoInZvaWQgaW50IHNob3J0IGxvbmcgY2hhciBmbG9hdCBkb3VibGUiKQ0KICAgICAgICBkZWNsX2RhdGFfdHlwZSA9IENvbWJpbmUoZGF0YV90eXBlICsgT3B0aW9uYWwoV29yZCgnKicpKSkNCiAgICAgICAgaWRlbnQgPSBXb3JkKGFscGhhcysnXycsIGFscGhhbnVtcysnXycpDQogICAgICAgIG51bWJlciA9IHB5cGFyc2luZ19jb21tb24ubnVtYmVyDQogICAgICAgIGFyZyA9IEdyb3VwKGRlY2xfZGF0YV90eXBlICsgaWRlbnQpDQogICAgICAgIExQQVIsUlBBUiA9IG1hcChTdXBwcmVzcywgIigpIikNCg0KICAgICAgICBjb2RlX2JvZHkgPSBuZXN0ZWRFeHByKCd7JywgJ30nLCBpZ25vcmVFeHByPShxdW90ZWRTdHJpbmcgfCBjU3R5bGVDb21tZW50KSkNCg0KICAgICAgICBjX2Z1bmN0aW9uID0gKGRlY2xfZGF0YV90eXBlKCJ0eXBlIikgDQogICAgICAgICAgICAgICAgICAgICAgKyBpZGVudCgibmFtZSIpDQogICAgICAgICAgICAgICAgICAgICAgKyBMUEFSICsgT3B0aW9uYWwoZGVsaW1pdGVkTGlzdChhcmcpLCBbXSkoImFyZ3MiKSArIFJQQVIgDQogICAgICAgICAgICAgICAgICAgICAgKyBjb2RlX2JvZHkoImJvZHkiKSkNCiAgICAgICAgY19mdW5jdGlvbi5pZ25vcmUoY1N0eWxlQ29tbWVudCkNCiAgICAgICAgDQogICAgICAgIHNvdXJjZV9jb2RlID0gJycnDQogICAgICAgICAgICBpbnQgaXNfb2RkKGludCB4KSB7IA0KICAgICAgICAgICAgICAgIHJldHVybiAoeCUyKTsgDQogICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICBpbnQgZGVjX3RvX2hleChjaGFyIGhjaGFyKSB7IA0KICAgICAgICAgICAgICAgIGlmIChoY2hhciA+PSAnMCcgJiYgaGNoYXIgPD0gJzknKSB7IA0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG9yZChoY2hhciktb3JkKCcwJykpOyANCiAgICAgICAgICAgICAgICB9IGVsc2UgeyANCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgxMCtvcmQoaGNoYXIpLW9yZCgnQScpKTsNCiAgICAgICAgICAgICAgICB9IA0KICAgICAgICAgICAgfQ0KICAgICAgICAnJycNCiAgICAgICAgZm9yIGZ1bmMgaW4gY19mdW5jdGlvbi5zZWFyY2hTdHJpbmcoc291cmNlX2NvZGUpOg0KICAgICAgICAgICAgcHJpbnQoIiUobmFtZSlzICglKHR5cGUpcykgYXJnczogJShhcmdzKXMiICUgZnVuYykNCg0KICAgIHByaW50czo6DQogICAgICAgIGlzX29kZCAoaW50KSBhcmdzOiBbWydpbnQnLCAneCddXQ0KICAgICAgICBkZWNfdG9faGV4IChpbnQpIGFyZ3M6IFtbJ2NoYXInLCAnaGNoYXInXV0NCiAgICAiIiINCiAgICBpZiBvcGVuZXIgPT0gY2xvc2VyOg0KICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJvcGVuaW5nIGFuZCBjbG9zaW5nIHN0cmluZ3MgY2Fubm90IGJlIHRoZSBzYW1lIikNCiAgICBpZiBjb250ZW50IGlzIE5vbmU6DQogICAgICAgIGlmIGlzaW5zdGFuY2Uob3BlbmVyLGJhc2VzdHJpbmcpIGFuZCBpc2luc3RhbmNlKGNsb3NlcixiYXNlc3RyaW5nKToNCiAgICAgICAgICAgIGlmIGxlbihvcGVuZXIpID09IDEgYW5kIGxlbihjbG9zZXIpPT0xOg0KICAgICAgICAgICAgICAgIGlmIGlnbm9yZUV4cHIgaXMgbm90IE5vbmU6DQogICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSAoQ29tYmluZShPbmVPck1vcmUofmlnbm9yZUV4cHIgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnNOb3RJbihvcGVuZXIrY2xvc2VyK1BhcnNlckVsZW1lbnQuREVGQVVMVF9XSElURV9DSEFSUyxleGFjdD0xKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgdDp0WzBdLnN0cmlwKCkpKQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSAoZW1wdHkuY29weSgpK0NoYXJzTm90SW4ob3BlbmVyK2Nsb3NlcitQYXJzZXJFbGVtZW50LkRFRkFVTFRfV0hJVEVfQ0hBUlMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgdDp0WzBdLnN0cmlwKCkpKQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICBpZiBpZ25vcmVFeHByIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gKENvbWJpbmUoT25lT3JNb3JlKH5pZ25vcmVFeHByICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+TGl0ZXJhbChvcGVuZXIpICsgfkxpdGVyYWwoY2xvc2VyKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyc05vdEluKFBhcnNlckVsZW1lbnQuREVGQVVMVF9XSElURV9DSEFSUyxleGFjdD0xKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgdDp0WzBdLnN0cmlwKCkpKQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSAoQ29tYmluZShPbmVPck1vcmUofkxpdGVyYWwob3BlbmVyKSArIH5MaXRlcmFsKGNsb3NlcikgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnNOb3RJbihQYXJzZXJFbGVtZW50LkRFRkFVTFRfV0hJVEVfQ0hBUlMsZXhhY3Q9MSkpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHQ6dFswXS5zdHJpcCgpKSkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm9wZW5pbmcgYW5kIGNsb3NpbmcgYXJndW1lbnRzIG11c3QgYmUgc3RyaW5ncyBpZiBubyBjb250ZW50IGV4cHJlc3Npb24gaXMgZ2l2ZW4iKQ0KICAgIHJldCA9IEZvcndhcmQoKQ0KICAgIGlmIGlnbm9yZUV4cHIgaXMgbm90IE5vbmU6DQogICAgICAgIHJldCA8PD0gR3JvdXAoIFN1cHByZXNzKG9wZW5lcikgKyBaZXJvT3JNb3JlKCBpZ25vcmVFeHByIHwgcmV0IHwgY29udGVudCApICsgU3VwcHJlc3MoY2xvc2VyKSApDQogICAgZWxzZToNCiAgICAgICAgcmV0IDw8PSBHcm91cCggU3VwcHJlc3Mob3BlbmVyKSArIFplcm9Pck1vcmUoIHJldCB8IGNvbnRlbnQgKSAgKyBTdXBwcmVzcyhjbG9zZXIpICkNCiAgICByZXQuc2V0TmFtZSgnbmVzdGVkICVzJXMgZXhwcmVzc2lvbicgJSAob3BlbmVyLGNsb3NlcikpDQogICAgcmV0dXJuIHJldA0KDQpkZWYgaW5kZW50ZWRCbG9jayhibG9ja1N0YXRlbWVudEV4cHIsIGluZGVudFN0YWNrLCBpbmRlbnQ9VHJ1ZSk6DQogICAgIiIiDQogICAgSGVscGVyIG1ldGhvZCBmb3IgZGVmaW5pbmcgc3BhY2UtZGVsaW1pdGVkIGluZGVudGF0aW9uIGJsb2Nrcywgc3VjaCBhcw0KICAgIHRob3NlIHVzZWQgdG8gZGVmaW5lIGJsb2NrIHN0YXRlbWVudHMgaW4gUHl0aG9uIHNvdXJjZSBjb2RlLg0KDQogICAgUGFyYW1ldGVyczoNCiAgICAgLSBibG9ja1N0YXRlbWVudEV4cHIgLSBleHByZXNzaW9uIGRlZmluaW5nIHN5bnRheCBvZiBzdGF0ZW1lbnQgdGhhdA0KICAgICAgICAgICAgaXMgcmVwZWF0ZWQgd2l0aGluIHRoZSBpbmRlbnRlZCBibG9jaw0KICAgICAtIGluZGVudFN0YWNrIC0gbGlzdCBjcmVhdGVkIGJ5IGNhbGxlciB0byBtYW5hZ2UgaW5kZW50YXRpb24gc3RhY2sNCiAgICAgICAgICAgIChtdWx0aXBsZSBzdGF0ZW1lbnRXaXRoSW5kZW50ZWRCbG9jayBleHByZXNzaW9ucyB3aXRoaW4gYSBzaW5nbGUgZ3JhbW1hcg0KICAgICAgICAgICAgc2hvdWxkIHNoYXJlIGEgY29tbW9uIGluZGVudFN0YWNrKQ0KICAgICAtIGluZGVudCAtIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGJsb2NrIG11c3QgYmUgaW5kZW50ZWQgYmV5b25kIHRoZQ0KICAgICAgICAgICAgdGhlIGN1cnJlbnQgbGV2ZWw7IHNldCB0byBGYWxzZSBmb3IgYmxvY2sgb2YgbGVmdC1tb3N0IHN0YXRlbWVudHMNCiAgICAgICAgICAgIChkZWZhdWx0PUN7VHJ1ZX0pDQoNCiAgICBBIHZhbGlkIGJsb2NrIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgQ3tibG9ja1N0YXRlbWVudH0uDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgZGF0YSA9ICcnJw0KICAgICAgICBkZWYgQSh6KToNCiAgICAgICAgICBBMQ0KICAgICAgICAgIEIgPSAxMDANCiAgICAgICAgICBHID0gQTINCiAgICAgICAgICBBMg0KICAgICAgICAgIEEzDQogICAgICAgIEINCiAgICAgICAgZGVmIEJCKGEsYixjKToNCiAgICAgICAgICBCQjENCiAgICAgICAgICBkZWYgQkJBKCk6DQogICAgICAgICAgICBiYmExDQogICAgICAgICAgICBiYmEyDQogICAgICAgICAgICBiYmEzDQogICAgICAgIEMNCiAgICAgICAgRA0KICAgICAgICBkZWYgc3BhbSh4LHkpOg0KICAgICAgICAgICAgIGRlZiBlZ2dzKHopOg0KICAgICAgICAgICAgICAgICBwYXNzDQogICAgICAgICcnJw0KDQoNCiAgICAgICAgaW5kZW50U3RhY2sgPSBbMV0NCiAgICAgICAgc3RtdCA9IEZvcndhcmQoKQ0KDQogICAgICAgIGlkZW50aWZpZXIgPSBXb3JkKGFscGhhcywgYWxwaGFudW1zKQ0KICAgICAgICBmdW5jRGVjbCA9ICgiZGVmIiArIGlkZW50aWZpZXIgKyBHcm91cCggIigiICsgT3B0aW9uYWwoIGRlbGltaXRlZExpc3QoaWRlbnRpZmllcikgKSArICIpIiApICsgIjoiKQ0KICAgICAgICBmdW5jX2JvZHkgPSBpbmRlbnRlZEJsb2NrKHN0bXQsIGluZGVudFN0YWNrKQ0KICAgICAgICBmdW5jRGVmID0gR3JvdXAoIGZ1bmNEZWNsICsgZnVuY19ib2R5ICkNCg0KICAgICAgICBydmFsdWUgPSBGb3J3YXJkKCkNCiAgICAgICAgZnVuY0NhbGwgPSBHcm91cChpZGVudGlmaWVyICsgIigiICsgT3B0aW9uYWwoZGVsaW1pdGVkTGlzdChydmFsdWUpKSArICIpIikNCiAgICAgICAgcnZhbHVlIDw8IChmdW5jQ2FsbCB8IGlkZW50aWZpZXIgfCBXb3JkKG51bXMpKQ0KICAgICAgICBhc3NpZ25tZW50ID0gR3JvdXAoaWRlbnRpZmllciArICI9IiArIHJ2YWx1ZSkNCiAgICAgICAgc3RtdCA8PCAoIGZ1bmNEZWYgfCBhc3NpZ25tZW50IHwgaWRlbnRpZmllciApDQoNCiAgICAgICAgbW9kdWxlX2JvZHkgPSBPbmVPck1vcmUoc3RtdCkNCg0KICAgICAgICBwYXJzZVRyZWUgPSBtb2R1bGVfYm9keS5wYXJzZVN0cmluZyhkYXRhKQ0KICAgICAgICBwYXJzZVRyZWUucHByaW50KCkNCiAgICBwcmludHM6Og0KICAgICAgICBbWydkZWYnLA0KICAgICAgICAgICdBJywNCiAgICAgICAgICBbJygnLCAneicsICcpJ10sDQogICAgICAgICAgJzonLA0KICAgICAgICAgIFtbJ0ExJ10sIFtbJ0InLCAnPScsICcxMDAnXV0sIFtbJ0cnLCAnPScsICdBMiddXSwgWydBMiddLCBbJ0EzJ11dXSwNCiAgICAgICAgICdCJywNCiAgICAgICAgIFsnZGVmJywNCiAgICAgICAgICAnQkInLA0KICAgICAgICAgIFsnKCcsICdhJywgJ2InLCAnYycsICcpJ10sDQogICAgICAgICAgJzonLA0KICAgICAgICAgIFtbJ0JCMSddLCBbWydkZWYnLCAnQkJBJywgWycoJywgJyknXSwgJzonLCBbWydiYmExJ10sIFsnYmJhMiddLCBbJ2JiYTMnXV1dXV1dLA0KICAgICAgICAgJ0MnLA0KICAgICAgICAgJ0QnLA0KICAgICAgICAgWydkZWYnLA0KICAgICAgICAgICdzcGFtJywNCiAgICAgICAgICBbJygnLCAneCcsICd5JywgJyknXSwNCiAgICAgICAgICAnOicsDQogICAgICAgICAgW1tbJ2RlZicsICdlZ2dzJywgWycoJywgJ3onLCAnKSddLCAnOicsIFtbJ3Bhc3MnXV1dXV1dXSANCiAgICAiIiINCiAgICBkZWYgY2hlY2tQZWVySW5kZW50KHMsbCx0KToNCiAgICAgICAgaWYgbCA+PSBsZW4ocyk6IHJldHVybg0KICAgICAgICBjdXJDb2wgPSBjb2wobCxzKQ0KICAgICAgICBpZiBjdXJDb2wgIT0gaW5kZW50U3RhY2tbLTFdOg0KICAgICAgICAgICAgaWYgY3VyQ29sID4gaW5kZW50U3RhY2tbLTFdOg0KICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRmF0YWxFeGNlcHRpb24ocyxsLCJpbGxlZ2FsIG5lc3RpbmciKQ0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24ocyxsLCJub3QgYSBwZWVyIGVudHJ5IikNCg0KICAgIGRlZiBjaGVja1N1YkluZGVudChzLGwsdCk6DQogICAgICAgIGN1ckNvbCA9IGNvbChsLHMpDQogICAgICAgIGlmIGN1ckNvbCA+IGluZGVudFN0YWNrWy0xXToNCiAgICAgICAgICAgIGluZGVudFN0YWNrLmFwcGVuZCggY3VyQ29sICkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKHMsbCwibm90IGEgc3ViZW50cnkiKQ0KDQogICAgZGVmIGNoZWNrVW5pbmRlbnQocyxsLHQpOg0KICAgICAgICBpZiBsID49IGxlbihzKTogcmV0dXJuDQogICAgICAgIGN1ckNvbCA9IGNvbChsLHMpDQogICAgICAgIGlmIG5vdChpbmRlbnRTdGFjayBhbmQgY3VyQ29sIDwgaW5kZW50U3RhY2tbLTFdIGFuZCBjdXJDb2wgPD0gaW5kZW50U3RhY2tbLTJdKToNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKHMsbCwibm90IGFuIHVuaW5kZW50IikNCiAgICAgICAgaW5kZW50U3RhY2sucG9wKCkNCg0KICAgIE5MID0gT25lT3JNb3JlKExpbmVFbmQoKS5zZXRXaGl0ZXNwYWNlQ2hhcnMoIlx0ICIpLnN1cHByZXNzKCkpDQogICAgSU5ERU5UID0gKEVtcHR5KCkgKyBFbXB0eSgpLnNldFBhcnNlQWN0aW9uKGNoZWNrU3ViSW5kZW50KSkuc2V0TmFtZSgnSU5ERU5UJykNCiAgICBQRUVSICAgPSBFbXB0eSgpLnNldFBhcnNlQWN0aW9uKGNoZWNrUGVlckluZGVudCkuc2V0TmFtZSgnJykNCiAgICBVTkRFTlQgPSBFbXB0eSgpLnNldFBhcnNlQWN0aW9uKGNoZWNrVW5pbmRlbnQpLnNldE5hbWUoJ1VOSU5ERU5UJykNCiAgICBpZiBpbmRlbnQ6DQogICAgICAgIHNtRXhwciA9IEdyb3VwKCBPcHRpb25hbChOTCkgKw0KICAgICAgICAgICAgI34gRm9sbG93ZWRCeShibG9ja1N0YXRlbWVudEV4cHIpICsNCiAgICAgICAgICAgIElOREVOVCArIChPbmVPck1vcmUoIFBFRVIgKyBHcm91cChibG9ja1N0YXRlbWVudEV4cHIpICsgT3B0aW9uYWwoTkwpICkpICsgVU5ERU5UKQ0KICAgIGVsc2U6DQogICAgICAgIHNtRXhwciA9IEdyb3VwKCBPcHRpb25hbChOTCkgKw0KICAgICAgICAgICAgKE9uZU9yTW9yZSggUEVFUiArIEdyb3VwKGJsb2NrU3RhdGVtZW50RXhwcikgKyBPcHRpb25hbChOTCkgKSkgKQ0KICAgIGJsb2NrU3RhdGVtZW50RXhwci5pZ25vcmUoX2JzbGFzaCArIExpbmVFbmQoKSkNCiAgICByZXR1cm4gc21FeHByLnNldE5hbWUoJ2luZGVudGVkIGJsb2NrJykNCg0KYWxwaGFzOGJpdCA9IHNyYW5nZShyIltcMHhjMC1cMHhkNlwweGQ4LVwweGY2XDB4ZjgtXDB4ZmZdIikNCnB1bmM4Yml0ID0gc3JhbmdlKHIiW1wweGExLVwweGJmXDB4ZDdcMHhmN10iKQ0KDQphbnlPcGVuVGFnLGFueUNsb3NlVGFnID0gbWFrZUhUTUxUYWdzKFdvcmQoYWxwaGFzLGFscGhhbnVtcysiXzoiKS5zZXROYW1lKCdhbnkgdGFnJykpDQpfaHRtbEVudGl0eU1hcCA9IGRpY3QoemlwKCJndCBsdCBhbXAgbmJzcCBxdW90IGFwb3MiLnNwbGl0KCksJz48JiAiXCcnKSkNCmNvbW1vbkhUTUxFbnRpdHkgPSBSZWdleCgnJig/UDxlbnRpdHk+JyArICd8Jy5qb2luKF9odG1sRW50aXR5TWFwLmtleXMoKSkgKyIpOyIpLnNldE5hbWUoImNvbW1vbiBIVE1MIGVudGl0eSIpDQpkZWYgcmVwbGFjZUhUTUxFbnRpdHkodCk6DQogICAgIiIiSGVscGVyIHBhcnNlciBhY3Rpb24gdG8gcmVwbGFjZSBjb21tb24gSFRNTCBlbnRpdGllcyB3aXRoIHRoZWlyIHNwZWNpYWwgY2hhcmFjdGVycyIiIg0KICAgIHJldHVybiBfaHRtbEVudGl0eU1hcC5nZXQodC5lbnRpdHkpDQoNCiMgaXQncyBlYXN5IHRvIGdldCB0aGVzZSBjb21tZW50IHN0cnVjdHVyZXMgd3JvbmcgLSB0aGV5J3JlIHZlcnkgY29tbW9uLCBzbyBtYXkgYXMgd2VsbCBtYWtlIHRoZW0gYXZhaWxhYmxlDQpjU3R5bGVDb21tZW50ID0gQ29tYmluZShSZWdleChyIi9cKig/OlteKl18XCooPyEvKSkqIikgKyAnKi8nKS5zZXROYW1lKCJDIHN0eWxlIGNvbW1lbnQiKQ0KIkNvbW1lbnQgb2YgdGhlIGZvcm0gQ3svKiAuLi4gKi99Ig0KDQpodG1sQ29tbWVudCA9IFJlZ2V4KHIiPCEtLVtcc1xTXSo/LS0+Iikuc2V0TmFtZSgiSFRNTCBjb21tZW50IikNCiJDb21tZW50IG9mIHRoZSBmb3JtIEN7PCEtLSAuLi4gLS0+fSINCg0KcmVzdE9mTGluZSA9IFJlZ2V4KHIiLioiKS5sZWF2ZVdoaXRlc3BhY2UoKS5zZXROYW1lKCJyZXN0IG9mIGxpbmUiKQ0KZGJsU2xhc2hDb21tZW50ID0gUmVnZXgociIvLyg/OlxcXG58W15cbl0pKiIpLnNldE5hbWUoIi8vIGNvbW1lbnQiKQ0KIkNvbW1lbnQgb2YgdGhlIGZvcm0gQ3svLyAuLi4gKHRvIGVuZCBvZiBsaW5lKX0iDQoNCmNwcFN0eWxlQ29tbWVudCA9IENvbWJpbmUoUmVnZXgociIvXCooPzpbXipdfFwqKD8hLykpKiIpICsgJyovJ3wgZGJsU2xhc2hDb21tZW50KS5zZXROYW1lKCJDKysgc3R5bGUgY29tbWVudCIpDQoiQ29tbWVudCBvZiBlaXRoZXIgZm9ybSBDe0x7Y1N0eWxlQ29tbWVudH19IG9yIEN7THtkYmxTbGFzaENvbW1lbnR9fSINCg0KamF2YVN0eWxlQ29tbWVudCA9IGNwcFN0eWxlQ29tbWVudA0KIlNhbWUgYXMgQ3tMe2NwcFN0eWxlQ29tbWVudH19Ig0KDQpweXRob25TdHlsZUNvbW1lbnQgPSBSZWdleChyIiMuKiIpLnNldE5hbWUoIlB5dGhvbiBzdHlsZSBjb21tZW50IikNCiJDb21tZW50IG9mIHRoZSBmb3JtIEN7IyAuLi4gKHRvIGVuZCBvZiBsaW5lKX0iDQoNCl9jb21tYXNlcGl0ZW0gPSBDb21iaW5lKE9uZU9yTW9yZShXb3JkKHByaW50YWJsZXMsIGV4Y2x1ZGVDaGFycz0nLCcpICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbCggV29yZCgiIFx0IikgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+TGl0ZXJhbCgiLCIpICsgfkxpbmVFbmQoKSApICkgKS5zdHJlYW1saW5lKCkuc2V0TmFtZSgiY29tbWFJdGVtIikNCmNvbW1hU2VwYXJhdGVkTGlzdCA9IGRlbGltaXRlZExpc3QoIE9wdGlvbmFsKCBxdW90ZWRTdHJpbmcuY29weSgpIHwgX2NvbW1hc2VwaXRlbSwgZGVmYXVsdD0iIikgKS5zZXROYW1lKCJjb21tYVNlcGFyYXRlZExpc3QiKQ0KIiIiKERlcHJlY2F0ZWQpIFByZWRlZmluZWQgZXhwcmVzc2lvbiBvZiAxIG9yIG1vcmUgcHJpbnRhYmxlIHdvcmRzIG9yIHF1b3RlZCBzdHJpbmdzLCBzZXBhcmF0ZWQgYnkgY29tbWFzLg0KICAgVGhpcyBleHByZXNzaW9uIGlzIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgTHtweXBhcnNpbmdfY29tbW9uLmNvbW1hX3NlcGFyYXRlZF9saXN0fS4iIiINCg0KIyBzb21lIG90aGVyIHVzZWZ1bCBleHByZXNzaW9ucyAtIHVzaW5nIGxvd2VyLWNhc2UgY2xhc3MgbmFtZSBzaW5jZSB3ZSBhcmUgcmVhbGx5IHVzaW5nIHRoaXMgYXMgYSBuYW1lc3BhY2UNCmNsYXNzIHB5cGFyc2luZ19jb21tb246DQogICAgIiIiDQogICAgSGVyZSBhcmUgc29tZSBjb21tb24gbG93LWxldmVsIGV4cHJlc3Npb25zIHRoYXQgbWF5IGJlIHVzZWZ1bCBpbiBqdW1wLXN0YXJ0aW5nIHBhcnNlciBkZXZlbG9wbWVudDoNCiAgICAgLSBudW1lcmljIGZvcm1zIChMe2ludGVnZXJzPGludGVnZXI+fSwgTHtyZWFsczxyZWFsPn0sIEx7c2NpZW50aWZpYyBub3RhdGlvbjxzY2lfcmVhbD59KQ0KICAgICAtIGNvbW1vbiBMe3Byb2dyYW1taW5nIGlkZW50aWZpZXJzPGlkZW50aWZpZXI+fQ0KICAgICAtIG5ldHdvcmsgYWRkcmVzc2VzIChMe01BQzxtYWNfYWRkcmVzcz59LCBMe0lQdjQ8aXB2NF9hZGRyZXNzPn0sIEx7SVB2NjxpcHY2X2FkZHJlc3M+fSkNCiAgICAgLSBJU084NjAxIEx7ZGF0ZXM8aXNvODYwMV9kYXRlPn0gYW5kIEx7ZGF0ZXRpbWU8aXNvODYwMV9kYXRldGltZT59DQogICAgIC0gTHtVVUlEPHV1aWQ+fQ0KICAgICAtIEx7Y29tbWEtc2VwYXJhdGVkIGxpc3Q8Y29tbWFfc2VwYXJhdGVkX2xpc3Q+fQ0KICAgIFBhcnNlIGFjdGlvbnM6DQogICAgIC0gQ3tMe2NvbnZlcnRUb0ludGVnZXJ9fQ0KICAgICAtIEN7THtjb252ZXJ0VG9GbG9hdH19DQogICAgIC0gQ3tMe2NvbnZlcnRUb0RhdGV9fQ0KICAgICAtIEN7THtjb252ZXJ0VG9EYXRldGltZX19DQogICAgIC0gQ3tMe3N0cmlwSFRNTFRhZ3N9fQ0KICAgICAtIEN7THt1cGNhc2VUb2tlbnN9fQ0KICAgICAtIEN7THtkb3duY2FzZVRva2Vuc319DQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgcHlwYXJzaW5nX2NvbW1vbi5udW1iZXIucnVuVGVzdHMoJycnDQogICAgICAgICAgICAjIGFueSBpbnQgb3IgcmVhbCBudW1iZXIsIHJldHVybmVkIGFzIHRoZSBhcHByb3ByaWF0ZSB0eXBlDQogICAgICAgICAgICAxMDANCiAgICAgICAgICAgIC0xMDANCiAgICAgICAgICAgICsxMDANCiAgICAgICAgICAgIDMuMTQxNTkNCiAgICAgICAgICAgIDYuMDJlMjMNCiAgICAgICAgICAgIDFlLTEyDQogICAgICAgICAgICAnJycpDQoNCiAgICAgICAgcHlwYXJzaW5nX2NvbW1vbi5mbnVtYmVyLnJ1blRlc3RzKCcnJw0KICAgICAgICAgICAgIyBhbnkgaW50IG9yIHJlYWwgbnVtYmVyLCByZXR1cm5lZCBhcyBmbG9hdA0KICAgICAgICAgICAgMTAwDQogICAgICAgICAgICAtMTAwDQogICAgICAgICAgICArMTAwDQogICAgICAgICAgICAzLjE0MTU5DQogICAgICAgICAgICA2LjAyZTIzDQogICAgICAgICAgICAxZS0xMg0KICAgICAgICAgICAgJycnKQ0KDQogICAgICAgIHB5cGFyc2luZ19jb21tb24uaGV4X2ludGVnZXIucnVuVGVzdHMoJycnDQogICAgICAgICAgICAjIGhleCBudW1iZXJzDQogICAgICAgICAgICAxMDANCiAgICAgICAgICAgIEZGDQogICAgICAgICAgICAnJycpDQoNCiAgICAgICAgcHlwYXJzaW5nX2NvbW1vbi5mcmFjdGlvbi5ydW5UZXN0cygnJycNCiAgICAgICAgICAgICMgZnJhY3Rpb25zDQogICAgICAgICAgICAxLzINCiAgICAgICAgICAgIC0zLzQNCiAgICAgICAgICAgICcnJykNCg0KICAgICAgICBweXBhcnNpbmdfY29tbW9uLm1peGVkX2ludGVnZXIucnVuVGVzdHMoJycnDQogICAgICAgICAgICAjIG1peGVkIGZyYWN0aW9ucw0KICAgICAgICAgICAgMQ0KICAgICAgICAgICAgMS8yDQogICAgICAgICAgICAtMy80DQogICAgICAgICAgICAxLTMvNA0KICAgICAgICAgICAgJycnKQ0KDQogICAgICAgIGltcG9ydCB1dWlkDQogICAgICAgIHB5cGFyc2luZ19jb21tb24udXVpZC5zZXRQYXJzZUFjdGlvbih0b2tlbk1hcCh1dWlkLlVVSUQpKQ0KICAgICAgICBweXBhcnNpbmdfY29tbW9uLnV1aWQucnVuVGVzdHMoJycnDQogICAgICAgICAgICAjIHV1aWQNCiAgICAgICAgICAgIDEyMzQ1Njc4LTEyMzQtNTY3OC0xMjM0LTU2NzgxMjM0NTY3OA0KICAgICAgICAgICAgJycnKQ0KICAgIHByaW50czo6DQogICAgICAgICMgYW55IGludCBvciByZWFsIG51bWJlciwgcmV0dXJuZWQgYXMgdGhlIGFwcHJvcHJpYXRlIHR5cGUNCiAgICAgICAgMTAwDQogICAgICAgIFsxMDBdDQoNCiAgICAgICAgLTEwMA0KICAgICAgICBbLTEwMF0NCg0KICAgICAgICArMTAwDQogICAgICAgIFsxMDBdDQoNCiAgICAgICAgMy4xNDE1OQ0KICAgICAgICBbMy4xNDE1OV0NCg0KICAgICAgICA2LjAyZTIzDQogICAgICAgIFs2LjAyZSsyM10NCg0KICAgICAgICAxZS0xMg0KICAgICAgICBbMWUtMTJdDQoNCiAgICAgICAgIyBhbnkgaW50IG9yIHJlYWwgbnVtYmVyLCByZXR1cm5lZCBhcyBmbG9hdA0KICAgICAgICAxMDANCiAgICAgICAgWzEwMC4wXQ0KDQogICAgICAgIC0xMDANCiAgICAgICAgWy0xMDAuMF0NCg0KICAgICAgICArMTAwDQogICAgICAgIFsxMDAuMF0NCg0KICAgICAgICAzLjE0MTU5DQogICAgICAgIFszLjE0MTU5XQ0KDQogICAgICAgIDYuMDJlMjMNCiAgICAgICAgWzYuMDJlKzIzXQ0KDQogICAgICAgIDFlLTEyDQogICAgICAgIFsxZS0xMl0NCg0KICAgICAgICAjIGhleCBudW1iZXJzDQogICAgICAgIDEwMA0KICAgICAgICBbMjU2XQ0KDQogICAgICAgIEZGDQogICAgICAgIFsyNTVdDQoNCiAgICAgICAgIyBmcmFjdGlvbnMNCiAgICAgICAgMS8yDQogICAgICAgIFswLjVdDQoNCiAgICAgICAgLTMvNA0KICAgICAgICBbLTAuNzVdDQoNCiAgICAgICAgIyBtaXhlZCBmcmFjdGlvbnMNCiAgICAgICAgMQ0KICAgICAgICBbMV0NCg0KICAgICAgICAxLzINCiAgICAgICAgWzAuNV0NCg0KICAgICAgICAtMy80DQogICAgICAgIFstMC43NV0NCg0KICAgICAgICAxLTMvNA0KICAgICAgICBbMS43NV0NCg0KICAgICAgICAjIHV1aWQNCiAgICAgICAgMTIzNDU2NzgtMTIzNC01Njc4LTEyMzQtNTY3ODEyMzQ1Njc4DQogICAgICAgIFtVVUlEKCcxMjM0NTY3OC0xMjM0LTU2NzgtMTIzNC01Njc4MTIzNDU2NzgnKV0NCiAgICAiIiINCg0KICAgIGNvbnZlcnRUb0ludGVnZXIgPSB0b2tlbk1hcChpbnQpDQogICAgIiIiDQogICAgUGFyc2UgYWN0aW9uIGZvciBjb252ZXJ0aW5nIHBhcnNlZCBpbnRlZ2VycyB0byBQeXRob24gaW50DQogICAgIiIiDQoNCiAgICBjb252ZXJ0VG9GbG9hdCA9IHRva2VuTWFwKGZsb2F0KQ0KICAgICIiIg0KICAgIFBhcnNlIGFjdGlvbiBmb3IgY29udmVydGluZyBwYXJzZWQgbnVtYmVycyB0byBQeXRob24gZmxvYXQNCiAgICAiIiINCg0KICAgIGludGVnZXIgPSBXb3JkKG51bXMpLnNldE5hbWUoImludGVnZXIiKS5zZXRQYXJzZUFjdGlvbihjb252ZXJ0VG9JbnRlZ2VyKQ0KICAgICIiImV4cHJlc3Npb24gdGhhdCBwYXJzZXMgYW4gdW5zaWduZWQgaW50ZWdlciwgcmV0dXJucyBhbiBpbnQiIiINCg0KICAgIGhleF9pbnRlZ2VyID0gV29yZChoZXhudW1zKS5zZXROYW1lKCJoZXggaW50ZWdlciIpLnNldFBhcnNlQWN0aW9uKHRva2VuTWFwKGludCwxNikpDQogICAgIiIiZXhwcmVzc2lvbiB0aGF0IHBhcnNlcyBhIGhleGFkZWNpbWFsIGludGVnZXIsIHJldHVybnMgYW4gaW50IiIiDQoNCiAgICBzaWduZWRfaW50ZWdlciA9IFJlZ2V4KHInWystXT9cZCsnKS5zZXROYW1lKCJzaWduZWQgaW50ZWdlciIpLnNldFBhcnNlQWN0aW9uKGNvbnZlcnRUb0ludGVnZXIpDQogICAgIiIiZXhwcmVzc2lvbiB0aGF0IHBhcnNlcyBhbiBpbnRlZ2VyIHdpdGggb3B0aW9uYWwgbGVhZGluZyBzaWduLCByZXR1cm5zIGFuIGludCIiIg0KDQogICAgZnJhY3Rpb24gPSAoc2lnbmVkX2ludGVnZXIoKS5zZXRQYXJzZUFjdGlvbihjb252ZXJ0VG9GbG9hdCkgKyAnLycgKyBzaWduZWRfaW50ZWdlcigpLnNldFBhcnNlQWN0aW9uKGNvbnZlcnRUb0Zsb2F0KSkuc2V0TmFtZSgiZnJhY3Rpb24iKQ0KICAgICIiImZyYWN0aW9uYWwgZXhwcmVzc2lvbiBvZiBhbiBpbnRlZ2VyIGRpdmlkZWQgYnkgYW4gaW50ZWdlciwgcmV0dXJucyBhIGZsb2F0IiIiDQogICAgZnJhY3Rpb24uYWRkUGFyc2VBY3Rpb24obGFtYmRhIHQ6IHRbMF0vdFstMV0pDQoNCiAgICBtaXhlZF9pbnRlZ2VyID0gKGZyYWN0aW9uIHwgc2lnbmVkX2ludGVnZXIgKyBPcHRpb25hbChPcHRpb25hbCgnLScpLnN1cHByZXNzKCkgKyBmcmFjdGlvbikpLnNldE5hbWUoImZyYWN0aW9uIG9yIG1peGVkIGludGVnZXItZnJhY3Rpb24iKQ0KICAgICIiIm1peGVkIGludGVnZXIgb2YgdGhlIGZvcm0gJ2ludGVnZXIgLSBmcmFjdGlvbicsIHdpdGggb3B0aW9uYWwgbGVhZGluZyBpbnRlZ2VyLCByZXR1cm5zIGZsb2F0IiIiDQogICAgbWl4ZWRfaW50ZWdlci5hZGRQYXJzZUFjdGlvbihzdW0pDQoNCiAgICByZWFsID0gUmVnZXgocidbKy1dP1xkK1wuXGQqJykuc2V0TmFtZSgicmVhbCBudW1iZXIiKS5zZXRQYXJzZUFjdGlvbihjb252ZXJ0VG9GbG9hdCkNCiAgICAiIiJleHByZXNzaW9uIHRoYXQgcGFyc2VzIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGFuZCByZXR1cm5zIGEgZmxvYXQiIiINCg0KICAgIHNjaV9yZWFsID0gUmVnZXgocidbKy1dP1xkKyhbZUVdWystXT9cZCt8XC5cZCooW2VFXVsrLV0/XGQrKT8pJykuc2V0TmFtZSgicmVhbCBudW1iZXIgd2l0aCBzY2llbnRpZmljIG5vdGF0aW9uIikuc2V0UGFyc2VBY3Rpb24oY29udmVydFRvRmxvYXQpDQogICAgIiIiZXhwcmVzc2lvbiB0aGF0IHBhcnNlcyBhIGZsb2F0aW5nIHBvaW50IG51bWJlciB3aXRoIG9wdGlvbmFsIHNjaWVudGlmaWMgbm90YXRpb24gYW5kIHJldHVybnMgYSBmbG9hdCIiIg0KDQogICAgIyBzdHJlYW1saW5pbmcgdGhpcyBleHByZXNzaW9uIG1ha2VzIHRoZSBkb2NzIG5pY2VyLWxvb2tpbmcNCiAgICBudW1iZXIgPSAoc2NpX3JlYWwgfCByZWFsIHwgc2lnbmVkX2ludGVnZXIpLnN0cmVhbWxpbmUoKQ0KICAgICIiImFueSBudW1lcmljIGV4cHJlc3Npb24sIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgUHl0aG9uIHR5cGUiIiINCg0KICAgIGZudW1iZXIgPSBSZWdleChyJ1srLV0/XGQrXC4/XGQqKFtlRV1bKy1dP1xkKyk/Jykuc2V0TmFtZSgiZm51bWJlciIpLnNldFBhcnNlQWN0aW9uKGNvbnZlcnRUb0Zsb2F0KQ0KICAgICIiImFueSBpbnQgb3IgcmVhbCBudW1iZXIsIHJldHVybmVkIGFzIGZsb2F0IiIiDQogICAgDQogICAgaWRlbnRpZmllciA9IFdvcmQoYWxwaGFzKydfJywgYWxwaGFudW1zKydfJykuc2V0TmFtZSgiaWRlbnRpZmllciIpDQogICAgIiIidHlwaWNhbCBjb2RlIGlkZW50aWZpZXIgKGxlYWRpbmcgYWxwaGEgb3IgJ18nLCBmb2xsb3dlZCBieSAwIG9yIG1vcmUgYWxwaGFzLCBudW1zLCBvciAnXycpIiIiDQogICAgDQogICAgaXB2NF9hZGRyZXNzID0gUmVnZXgocicoMjVbMC01XXwyWzAtNF1bMC05XXwxP1swLTldezEsMn0pKFwuKDI1WzAtNV18MlswLTRdWzAtOV18MT9bMC05XXsxLDJ9KSl7M30nKS5zZXROYW1lKCJJUHY0IGFkZHJlc3MiKQ0KICAgICJJUHY0IGFkZHJlc3MgKEN7MC4wLjAuMCAtIDI1NS4yNTUuMjU1LjI1NX0pIg0KDQogICAgX2lwdjZfcGFydCA9IFJlZ2V4KHInWzAtOWEtZkEtRl17MSw0fScpLnNldE5hbWUoImhleF9pbnRlZ2VyIikNCiAgICBfZnVsbF9pcHY2X2FkZHJlc3MgPSAoX2lwdjZfcGFydCArICgnOicgKyBfaXB2Nl9wYXJ0KSo3KS5zZXROYW1lKCJmdWxsIElQdjYgYWRkcmVzcyIpDQogICAgX3Nob3J0X2lwdjZfYWRkcmVzcyA9IChPcHRpb25hbChfaXB2Nl9wYXJ0ICsgKCc6JyArIF9pcHY2X3BhcnQpKigwLDYpKSArICI6OiIgKyBPcHRpb25hbChfaXB2Nl9wYXJ0ICsgKCc6JyArIF9pcHY2X3BhcnQpKigwLDYpKSkuc2V0TmFtZSgic2hvcnQgSVB2NiBhZGRyZXNzIikNCiAgICBfc2hvcnRfaXB2Nl9hZGRyZXNzLmFkZENvbmRpdGlvbihsYW1iZGEgdDogc3VtKDEgZm9yIHR0IGluIHQgaWYgcHlwYXJzaW5nX2NvbW1vbi5faXB2Nl9wYXJ0Lm1hdGNoZXModHQpKSA8IDgpDQogICAgX21peGVkX2lwdjZfYWRkcmVzcyA9ICgiOjpmZmZmOiIgKyBpcHY0X2FkZHJlc3MpLnNldE5hbWUoIm1peGVkIElQdjYgYWRkcmVzcyIpDQogICAgaXB2Nl9hZGRyZXNzID0gQ29tYmluZSgoX2Z1bGxfaXB2Nl9hZGRyZXNzIHwgX21peGVkX2lwdjZfYWRkcmVzcyB8IF9zaG9ydF9pcHY2X2FkZHJlc3MpLnNldE5hbWUoIklQdjYgYWRkcmVzcyIpKS5zZXROYW1lKCJJUHY2IGFkZHJlc3MiKQ0KICAgICJJUHY2IGFkZHJlc3MgKGxvbmcsIHNob3J0LCBvciBtaXhlZCBmb3JtKSINCiAgICANCiAgICBtYWNfYWRkcmVzcyA9IFJlZ2V4KHInWzAtOWEtZkEtRl17Mn0oWzouLV0pWzAtOWEtZkEtRl17Mn0oPzpcMVswLTlhLWZBLUZdezJ9KXs0fScpLnNldE5hbWUoIk1BQyBhZGRyZXNzIikNCiAgICAiTUFDIGFkZHJlc3MgeHg6eHg6eHg6eHg6eHggKG1heSBhbHNvIGhhdmUgJy0nIG9yICcuJyBkZWxpbWl0ZXJzKSINCg0KICAgIEBzdGF0aWNtZXRob2QNCiAgICBkZWYgY29udmVydFRvRGF0ZShmbXQ9IiVZLSVtLSVkIik6DQogICAgICAgICIiIg0KICAgICAgICBIZWxwZXIgdG8gY3JlYXRlIGEgcGFyc2UgYWN0aW9uIGZvciBjb252ZXJ0aW5nIHBhcnNlZCBkYXRlIHN0cmluZyB0byBQeXRob24gZGF0ZXRpbWUuZGF0ZQ0KDQogICAgICAgIFBhcmFtcyAtDQogICAgICAgICAtIGZtdCAtIGZvcm1hdCB0byBiZSBwYXNzZWQgdG8gZGF0ZXRpbWUuc3RycHRpbWUgKGRlZmF1bHQ9Q3siJVktJW0tJWQifSkNCg0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIGRhdGVfZXhwciA9IHB5cGFyc2luZ19jb21tb24uaXNvODYwMV9kYXRlLmNvcHkoKQ0KICAgICAgICAgICAgZGF0ZV9leHByLnNldFBhcnNlQWN0aW9uKHB5cGFyc2luZ19jb21tb24uY29udmVydFRvRGF0ZSgpKQ0KICAgICAgICAgICAgcHJpbnQoZGF0ZV9leHByLnBhcnNlU3RyaW5nKCIxOTk5LTEyLTMxIikpDQogICAgICAgIHByaW50czo6DQogICAgICAgICAgICBbZGF0ZXRpbWUuZGF0ZSgxOTk5LCAxMiwgMzEpXQ0KICAgICAgICAiIiINCiAgICAgICAgZGVmIGN2dF9mbihzLGwsdCk6DQogICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgcmV0dXJuIGRhdGV0aW1lLnN0cnB0aW1lKHRbMF0sIGZtdCkuZGF0ZSgpDQogICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvciBhcyB2ZToNCiAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihzLCBsLCBzdHIodmUpKQ0KICAgICAgICByZXR1cm4gY3Z0X2ZuDQoNCiAgICBAc3RhdGljbWV0aG9kDQogICAgZGVmIGNvbnZlcnRUb0RhdGV0aW1lKGZtdD0iJVktJW0tJWRUJUg6JU06JVMuJWYiKToNCiAgICAgICAgIiIiDQogICAgICAgIEhlbHBlciB0byBjcmVhdGUgYSBwYXJzZSBhY3Rpb24gZm9yIGNvbnZlcnRpbmcgcGFyc2VkIGRhdGV0aW1lIHN0cmluZyB0byBQeXRob24gZGF0ZXRpbWUuZGF0ZXRpbWUNCg0KICAgICAgICBQYXJhbXMgLQ0KICAgICAgICAgLSBmbXQgLSBmb3JtYXQgdG8gYmUgcGFzc2VkIHRvIGRhdGV0aW1lLnN0cnB0aW1lIChkZWZhdWx0PUN7IiVZLSVtLSVkVCVIOiVNOiVTLiVmIn0pDQoNCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBkdF9leHByID0gcHlwYXJzaW5nX2NvbW1vbi5pc284NjAxX2RhdGV0aW1lLmNvcHkoKQ0KICAgICAgICAgICAgZHRfZXhwci5zZXRQYXJzZUFjdGlvbihweXBhcnNpbmdfY29tbW9uLmNvbnZlcnRUb0RhdGV0aW1lKCkpDQogICAgICAgICAgICBwcmludChkdF9leHByLnBhcnNlU3RyaW5nKCIxOTk5LTEyLTMxVDIzOjU5OjU5Ljk5OSIpKQ0KICAgICAgICBwcmludHM6Og0KICAgICAgICAgICAgW2RhdGV0aW1lLmRhdGV0aW1lKDE5OTksIDEyLCAzMSwgMjMsIDU5LCA1OSwgOTk5MDAwKV0NCiAgICAgICAgIiIiDQogICAgICAgIGRlZiBjdnRfZm4ocyxsLHQpOg0KICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgIHJldHVybiBkYXRldGltZS5zdHJwdGltZSh0WzBdLCBmbXQpDQogICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvciBhcyB2ZToNCiAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihzLCBsLCBzdHIodmUpKQ0KICAgICAgICByZXR1cm4gY3Z0X2ZuDQoNCiAgICBpc284NjAxX2RhdGUgPSBSZWdleChyJyg/UDx5ZWFyPlxkezR9KSg/Oi0oP1A8bW9udGg+XGRcZCkoPzotKD9QPGRheT5cZFxkKSk/KT8nKS5zZXROYW1lKCJJU084NjAxIGRhdGUiKQ0KICAgICJJU084NjAxIGRhdGUgKEN7eXl5eS1tbS1kZH0pIg0KDQogICAgaXNvODYwMV9kYXRldGltZSA9IFJlZ2V4KHInKD9QPHllYXI+XGR7NH0pLSg/UDxtb250aD5cZFxkKS0oP1A8ZGF5PlxkXGQpW1QgXSg/UDxob3VyPlxkXGQpOig/UDxtaW51dGU+XGRcZCkoOig/UDxzZWNvbmQ+XGRcZChcLlxkKik/KT8pPyg/UDx0ej5afFsrLV1cZFxkOj9cZFxkKT8nKS5zZXROYW1lKCJJU084NjAxIGRhdGV0aW1lIikNCiAgICAiSVNPODYwMSBkYXRldGltZSAoQ3t5eXl5LW1tLWRkVGhoOm1tOnNzLnMoWnwrLTAwOjAwKX0pIC0gdHJhaWxpbmcgc2Vjb25kcywgbWlsbGlzZWNvbmRzLCBhbmQgdGltZXpvbmUgb3B0aW9uYWw7IGFjY2VwdHMgc2VwYXJhdGluZyBDeydUJ30gb3IgQ3snICd9Ig0KDQogICAgdXVpZCA9IFJlZ2V4KHInWzAtOWEtZkEtRl17OH0oLVswLTlhLWZBLUZdezR9KXszfS1bMC05YS1mQS1GXXsxMn0nKS5zZXROYW1lKCJVVUlEIikNCiAgICAiVVVJRCAoQ3t4eHh4eHh4eC14eHh4LXh4eHgteHh4eC14eHh4eHh4eHh4eHh9KSINCg0KICAgIF9odG1sX3N0cmlwcGVyID0gYW55T3BlblRhZy5zdXBwcmVzcygpIHwgYW55Q2xvc2VUYWcuc3VwcHJlc3MoKQ0KICAgIEBzdGF0aWNtZXRob2QNCiAgICBkZWYgc3RyaXBIVE1MVGFncyhzLCBsLCB0b2tlbnMpOg0KICAgICAgICAiIiINCiAgICAgICAgUGFyc2UgYWN0aW9uIHRvIHJlbW92ZSBIVE1MIHRhZ3MgZnJvbSB3ZWIgcGFnZSBIVE1MIHNvdXJjZQ0KDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgIyBzdHJpcCBIVE1MIGxpbmtzIGZyb20gbm9ybWFsIHRleHQgDQogICAgICAgICAgICB0ZXh0ID0gJzx0ZD5Nb3JlIGluZm8gYXQgdGhlIDxhIGhyZWY9Imh0dHA6Ly9weXBhcnNpbmcud2lraXNwYWNlcy5jb20iPnB5cGFyc2luZzwvYT4gd2lraSBwYWdlPC90ZD4nDQogICAgICAgICAgICB0ZCx0ZF9lbmQgPSBtYWtlSFRNTFRhZ3MoIlREIikNCiAgICAgICAgICAgIHRhYmxlX3RleHQgPSB0ZCArIFNraXBUbyh0ZF9lbmQpLnNldFBhcnNlQWN0aW9uKHB5cGFyc2luZ19jb21tb24uc3RyaXBIVE1MVGFncykoImJvZHkiKSArIHRkX2VuZA0KICAgICAgICAgICAgDQogICAgICAgICAgICBwcmludCh0YWJsZV90ZXh0LnBhcnNlU3RyaW5nKHRleHQpLmJvZHkpICMgLT4gJ01vcmUgaW5mbyBhdCB0aGUgcHlwYXJzaW5nIHdpa2kgcGFnZScNCiAgICAgICAgIiIiDQogICAgICAgIHJldHVybiBweXBhcnNpbmdfY29tbW9uLl9odG1sX3N0cmlwcGVyLnRyYW5zZm9ybVN0cmluZyh0b2tlbnNbMF0pDQoNCiAgICBfY29tbWFzZXBpdGVtID0gQ29tYmluZShPbmVPck1vcmUofkxpdGVyYWwoIiwiKSArIH5MaW5lRW5kKCkgKyBXb3JkKHByaW50YWJsZXMsIGV4Y2x1ZGVDaGFycz0nLCcpIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgT3B0aW9uYWwoIFdoaXRlKCIgXHQiKSApICkgKS5zdHJlYW1saW5lKCkuc2V0TmFtZSgiY29tbWFJdGVtIikNCiAgICBjb21tYV9zZXBhcmF0ZWRfbGlzdCA9IGRlbGltaXRlZExpc3QoIE9wdGlvbmFsKCBxdW90ZWRTdHJpbmcuY29weSgpIHwgX2NvbW1hc2VwaXRlbSwgZGVmYXVsdD0iIikgKS5zZXROYW1lKCJjb21tYSBzZXBhcmF0ZWQgbGlzdCIpDQogICAgIiIiUHJlZGVmaW5lZCBleHByZXNzaW9uIG9mIDEgb3IgbW9yZSBwcmludGFibGUgd29yZHMgb3IgcXVvdGVkIHN0cmluZ3MsIHNlcGFyYXRlZCBieSBjb21tYXMuIiIiDQoNCiAgICB1cGNhc2VUb2tlbnMgPSBzdGF0aWNtZXRob2QodG9rZW5NYXAobGFtYmRhIHQ6IF91c3RyKHQpLnVwcGVyKCkpKQ0KICAgICIiIlBhcnNlIGFjdGlvbiB0byBjb252ZXJ0IHRva2VucyB0byB1cHBlciBjYXNlLiIiIg0KDQogICAgZG93bmNhc2VUb2tlbnMgPSBzdGF0aWNtZXRob2QodG9rZW5NYXAobGFtYmRhIHQ6IF91c3RyKHQpLmxvd2VyKCkpKQ0KICAgICIiIlBhcnNlIGFjdGlvbiB0byBjb252ZXJ0IHRva2VucyB0byBsb3dlciBjYXNlLiIiIg0KDQoNCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6DQoNCiAgICBzZWxlY3RUb2tlbiAgICA9IENhc2VsZXNzTGl0ZXJhbCgic2VsZWN0IikNCiAgICBmcm9tVG9rZW4gICAgICA9IENhc2VsZXNzTGl0ZXJhbCgiZnJvbSIpDQoNCiAgICBpZGVudCAgICAgICAgICA9IFdvcmQoYWxwaGFzLCBhbHBoYW51bXMgKyAiXyQiKQ0KDQogICAgY29sdW1uTmFtZSAgICAgPSBkZWxpbWl0ZWRMaXN0KGlkZW50LCAiLiIsIGNvbWJpbmU9VHJ1ZSkuc2V0UGFyc2VBY3Rpb24odXBjYXNlVG9rZW5zKQ0KICAgIGNvbHVtbk5hbWVMaXN0ID0gR3JvdXAoZGVsaW1pdGVkTGlzdChjb2x1bW5OYW1lKSkuc2V0TmFtZSgiY29sdW1ucyIpDQogICAgY29sdW1uU3BlYyAgICAgPSAoJyonIHwgY29sdW1uTmFtZUxpc3QpDQoNCiAgICB0YWJsZU5hbWUgICAgICA9IGRlbGltaXRlZExpc3QoaWRlbnQsICIuIiwgY29tYmluZT1UcnVlKS5zZXRQYXJzZUFjdGlvbih1cGNhc2VUb2tlbnMpDQogICAgdGFibGVOYW1lTGlzdCAgPSBHcm91cChkZWxpbWl0ZWRMaXN0KHRhYmxlTmFtZSkpLnNldE5hbWUoInRhYmxlcyIpDQogICAgDQogICAgc2ltcGxlU1FMICAgICAgPSBzZWxlY3RUb2tlbigiY29tbWFuZCIpICsgY29sdW1uU3BlYygiY29sdW1ucyIpICsgZnJvbVRva2VuICsgdGFibGVOYW1lTGlzdCgidGFibGVzIikNCg0KICAgICMgZGVtbyBydW5UZXN0cyBtZXRob2QsIGluY2x1ZGluZyBlbWJlZGRlZCBjb21tZW50cyBpbiB0ZXN0IHN0cmluZw0KICAgIHNpbXBsZVNRTC5ydW5UZXN0cygiIiINCiAgICAgICAgIyAnKicgYXMgY29sdW1uIGxpc3QgYW5kIGRvdHRlZCB0YWJsZSBuYW1lDQogICAgICAgIHNlbGVjdCAqIGZyb20gU1lTLlhZWlpZDQoNCiAgICAgICAgIyBjYXNlbGVzcyBtYXRjaCBvbiAiU0VMRUNUIiwgYW5kIGNhc3RzIGJhY2sgdG8gInNlbGVjdCINCiAgICAgICAgU0VMRUNUICogZnJvbSBYWVpaWSwgQUJDDQoNCiAgICAgICAgIyBsaXN0IG9mIGNvbHVtbiBuYW1lcywgYW5kIG1peGVkIGNhc2UgU0VMRUNUIGtleXdvcmQNCiAgICAgICAgU2VsZWN0IEFBLEJCLENDIGZyb20gU3lzLmR1YWwNCg0KICAgICAgICAjIG11bHRpcGxlIHRhYmxlcw0KICAgICAgICBTZWxlY3QgQSwgQiwgQyBmcm9tIFN5cy5kdWFsLCBUYWJsZTINCg0KICAgICAgICAjIGludmFsaWQgU0VMRUNUIGtleXdvcmQgLSBzaG91bGQgZmFpbA0KICAgICAgICBYZWxlY3QgQSwgQiwgQyBmcm9tIFN5cy5kdWFsDQoNCiAgICAgICAgIyBpbmNvbXBsZXRlIGNvbW1hbmQgLSBzaG91bGQgZmFpbA0KICAgICAgICBTZWxlY3QNCg0KICAgICAgICAjIGludmFsaWQgY29sdW1uIG5hbWUgLSBzaG91bGQgZmFpbA0KICAgICAgICBTZWxlY3QgXl5eIGZyb3ggU3lzLmR1YWwNCg0KICAgICAgICAiIiIpDQoNCiAgICBweXBhcnNpbmdfY29tbW9uLm51bWJlci5ydW5UZXN0cygiIiINCiAgICAgICAgMTAwDQogICAgICAgIC0xMDANCiAgICAgICAgKzEwMA0KICAgICAgICAzLjE0MTU5DQogICAgICAgIDYuMDJlMjMNCiAgICAgICAgMWUtMTINCiAgICAgICAgIiIiKQ0KDQogICAgIyBhbnkgaW50IG9yIHJlYWwgbnVtYmVyLCByZXR1cm5lZCBhcyBmbG9hdA0KICAgIHB5cGFyc2luZ19jb21tb24uZm51bWJlci5ydW5UZXN0cygiIiINCiAgICAgICAgMTAwDQogICAgICAgIC0xMDANCiAgICAgICAgKzEwMA0KICAgICAgICAzLjE0MTU5DQogICAgICAgIDYuMDJlMjMNCiAgICAgICAgMWUtMTINCiAgICAgICAgIiIiKQ0KDQogICAgcHlwYXJzaW5nX2NvbW1vbi5oZXhfaW50ZWdlci5ydW5UZXN0cygiIiINCiAgICAgICAgMTAwDQogICAgICAgIEZGDQogICAgICAgICIiIikNCg0KICAgIGltcG9ydCB1dWlkDQogICAgcHlwYXJzaW5nX2NvbW1vbi51dWlkLnNldFBhcnNlQWN0aW9uKHRva2VuTWFwKHV1aWQuVVVJRCkpDQogICAgcHlwYXJzaW5nX2NvbW1vbi51dWlkLnJ1blRlc3RzKCIiIg0KICAgICAgICAxMjM0NTY3OC0xMjM0LTU2NzgtMTIzNC01Njc4MTIzNDU2NzgNCiAgICAgICAgIiIiKQ0KUEsDBBQAAAAAAAAAIQCZWE1aknUAAJJ1AABBAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3BrZ19yZXNvdXJjZXMvX3ZlbmRvci9zaXgucHkiIiJVdGlsaXRpZXMgZm9yIHdyaXRpbmcgY29kZSB0aGF0IHJ1bnMgb24gUHl0aG9uIDIgYW5kIDMiIiIKCiMgQ29weXJpZ2h0IChjKSAyMDEwLTIwMTUgQmVuamFtaW4gUGV0ZXJzb24KIwojIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKIyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAojIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKIyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCiMgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCiMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIwojIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAojIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCiMKIyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgojIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAojIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQojIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKIyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAojIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCiMgU09GVFdBUkUuCgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IGZ1bmN0b29scwppbXBvcnQgaXRlcnRvb2xzCmltcG9ydCBvcGVyYXRvcgppbXBvcnQgc3lzCmltcG9ydCB0eXBlcwoKX19hdXRob3JfXyA9ICJCZW5qYW1pbiBQZXRlcnNvbiA8YmVuamFtaW5AcHl0aG9uLm9yZz4iCl9fdmVyc2lvbl9fID0gIjEuMTAuMCIKCgojIFVzZWZ1bCBmb3IgdmVyeSBjb2Fyc2UgdmVyc2lvbiBkaWZmZXJlbnRpYXRpb24uClBZMiA9IHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMgpQWTMgPSBzeXMudmVyc2lvbl9pbmZvWzBdID09IDMKUFkzNCA9IHN5cy52ZXJzaW9uX2luZm9bMDoyXSA+PSAoMywgNCkKCmlmIFBZMzoKICAgIHN0cmluZ190eXBlcyA9IHN0ciwKICAgIGludGVnZXJfdHlwZXMgPSBpbnQsCiAgICBjbGFzc190eXBlcyA9IHR5cGUsCiAgICB0ZXh0X3R5cGUgPSBzdHIKICAgIGJpbmFyeV90eXBlID0gYnl0ZXMKCiAgICBNQVhTSVpFID0gc3lzLm1heHNpemUKZWxzZToKICAgIHN0cmluZ190eXBlcyA9IGJhc2VzdHJpbmcsCiAgICBpbnRlZ2VyX3R5cGVzID0gKGludCwgbG9uZykKICAgIGNsYXNzX3R5cGVzID0gKHR5cGUsIHR5cGVzLkNsYXNzVHlwZSkKICAgIHRleHRfdHlwZSA9IHVuaWNvZGUKICAgIGJpbmFyeV90eXBlID0gc3RyCgogICAgaWYgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoImphdmEiKToKICAgICAgICAjIEp5dGhvbiBhbHdheXMgdXNlcyAzMiBiaXRzLgogICAgICAgIE1BWFNJWkUgPSBpbnQoKDEgPDwgMzEpIC0gMSkKICAgIGVsc2U6CiAgICAgICAgIyBJdCdzIHBvc3NpYmxlIHRvIGhhdmUgc2l6ZW9mKGxvbmcpICE9IHNpemVvZihQeV9zc2l6ZV90KS4KICAgICAgICBjbGFzcyBYKG9iamVjdCk6CgogICAgICAgICAgICBkZWYgX19sZW5fXyhzZWxmKToKICAgICAgICAgICAgICAgIHJldHVybiAxIDw8IDMxCiAgICAgICAgdHJ5OgogICAgICAgICAgICBsZW4oWCgpKQogICAgICAgIGV4Y2VwdCBPdmVyZmxvd0Vycm9yOgogICAgICAgICAgICAjIDMyLWJpdAogICAgICAgICAgICBNQVhTSVpFID0gaW50KCgxIDw8IDMxKSAtIDEpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyA2NC1iaXQKICAgICAgICAgICAgTUFYU0laRSA9IGludCgoMSA8PCA2MykgLSAxKQogICAgICAgIGRlbCBYCgoKZGVmIF9hZGRfZG9jKGZ1bmMsIGRvYyk6CiAgICAiIiJBZGQgZG9jdW1lbnRhdGlvbiB0byBhIGZ1bmN0aW9uLiIiIgogICAgZnVuYy5fX2RvY19fID0gZG9jCgoKZGVmIF9pbXBvcnRfbW9kdWxlKG5hbWUpOgogICAgIiIiSW1wb3J0IG1vZHVsZSwgcmV0dXJuaW5nIHRoZSBtb2R1bGUgYWZ0ZXIgdGhlIGxhc3QgZG90LiIiIgogICAgX19pbXBvcnRfXyhuYW1lKQogICAgcmV0dXJuIHN5cy5tb2R1bGVzW25hbWVdCgoKY2xhc3MgX0xhenlEZXNjcihvYmplY3QpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lKToKICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCgogICAgZGVmIF9fZ2V0X18oc2VsZiwgb2JqLCB0cCk6CiAgICAgICAgcmVzdWx0ID0gc2VsZi5fcmVzb2x2ZSgpCiAgICAgICAgc2V0YXR0cihvYmosIHNlbGYubmFtZSwgcmVzdWx0KSAgIyBJbnZva2VzIF9fc2V0X18uCiAgICAgICAgdHJ5OgogICAgICAgICAgICAjIFRoaXMgaXMgYSBiaXQgdWdseSwgYnV0IGl0IGF2b2lkcyBydW5uaW5nIHRoaXMgYWdhaW4gYnkKICAgICAgICAgICAgIyByZW1vdmluZyB0aGlzIGRlc2NyaXB0b3IuCiAgICAgICAgICAgIGRlbGF0dHIob2JqLl9fY2xhc3NfXywgc2VsZi5uYW1lKQogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgcGFzcwogICAgICAgIHJldHVybiByZXN1bHQKCgpjbGFzcyBNb3ZlZE1vZHVsZShfTGF6eURlc2NyKToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgb2xkLCBuZXc9Tm9uZSk6CiAgICAgICAgc3VwZXIoTW92ZWRNb2R1bGUsIHNlbGYpLl9faW5pdF9fKG5hbWUpCiAgICAgICAgaWYgUFkzOgogICAgICAgICAgICBpZiBuZXcgaXMgTm9uZToKICAgICAgICAgICAgICAgIG5ldyA9IG5hbWUKICAgICAgICAgICAgc2VsZi5tb2QgPSBuZXcKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLm1vZCA9IG9sZAoKICAgIGRlZiBfcmVzb2x2ZShzZWxmKToKICAgICAgICByZXR1cm4gX2ltcG9ydF9tb2R1bGUoc2VsZi5tb2QpCgogICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIGF0dHIpOgogICAgICAgIF9tb2R1bGUgPSBzZWxmLl9yZXNvbHZlKCkKICAgICAgICB2YWx1ZSA9IGdldGF0dHIoX21vZHVsZSwgYXR0cikKICAgICAgICBzZXRhdHRyKHNlbGYsIGF0dHIsIHZhbHVlKQogICAgICAgIHJldHVybiB2YWx1ZQoKCmNsYXNzIF9MYXp5TW9kdWxlKHR5cGVzLk1vZHVsZVR5cGUpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lKToKICAgICAgICBzdXBlcihfTGF6eU1vZHVsZSwgc2VsZikuX19pbml0X18obmFtZSkKICAgICAgICBzZWxmLl9fZG9jX18gPSBzZWxmLl9fY2xhc3NfXy5fX2RvY19fCgogICAgZGVmIF9fZGlyX18oc2VsZik6CiAgICAgICAgYXR0cnMgPSBbIl9fZG9jX18iLCAiX19uYW1lX18iXQogICAgICAgIGF0dHJzICs9IFthdHRyLm5hbWUgZm9yIGF0dHIgaW4gc2VsZi5fbW92ZWRfYXR0cmlidXRlc10KICAgICAgICByZXR1cm4gYXR0cnMKCiAgICAjIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMKICAgIF9tb3ZlZF9hdHRyaWJ1dGVzID0gW10KCgpjbGFzcyBNb3ZlZEF0dHJpYnV0ZShfTGF6eURlc2NyKToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgb2xkX21vZCwgbmV3X21vZCwgb2xkX2F0dHI9Tm9uZSwgbmV3X2F0dHI9Tm9uZSk6CiAgICAgICAgc3VwZXIoTW92ZWRBdHRyaWJ1dGUsIHNlbGYpLl9faW5pdF9fKG5hbWUpCiAgICAgICAgaWYgUFkzOgogICAgICAgICAgICBpZiBuZXdfbW9kIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBuZXdfbW9kID0gbmFtZQogICAgICAgICAgICBzZWxmLm1vZCA9IG5ld19tb2QKICAgICAgICAgICAgaWYgbmV3X2F0dHIgaXMgTm9uZToKICAgICAgICAgICAgICAgIGlmIG9sZF9hdHRyIGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgICAgbmV3X2F0dHIgPSBuYW1lCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIG5ld19hdHRyID0gb2xkX2F0dHIKICAgICAgICAgICAgc2VsZi5hdHRyID0gbmV3X2F0dHIKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLm1vZCA9IG9sZF9tb2QKICAgICAgICAgICAgaWYgb2xkX2F0dHIgaXMgTm9uZToKICAgICAgICAgICAgICAgIG9sZF9hdHRyID0gbmFtZQogICAgICAgICAgICBzZWxmLmF0dHIgPSBvbGRfYXR0cgoKICAgIGRlZiBfcmVzb2x2ZShzZWxmKToKICAgICAgICBtb2R1bGUgPSBfaW1wb3J0X21vZHVsZShzZWxmLm1vZCkKICAgICAgICByZXR1cm4gZ2V0YXR0cihtb2R1bGUsIHNlbGYuYXR0cikKCgpjbGFzcyBfU2l4TWV0YVBhdGhJbXBvcnRlcihvYmplY3QpOgoKICAgICIiIgogICAgQSBtZXRhIHBhdGggaW1wb3J0ZXIgdG8gaW1wb3J0IHNpeC5tb3ZlcyBhbmQgaXRzIHN1Ym1vZHVsZXMuCgogICAgVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGEgUEVQMzAyIGZpbmRlciBhbmQgbG9hZGVyLiBJdCBzaG91bGQgYmUgY29tcGF0aWJsZQogICAgd2l0aCBQeXRob24gMi41IGFuZCBhbGwgZXhpc3RpbmcgdmVyc2lvbnMgb2YgUHl0aG9uMwogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHNpeF9tb2R1bGVfbmFtZSk6CiAgICAgICAgc2VsZi5uYW1lID0gc2l4X21vZHVsZV9uYW1lCiAgICAgICAgc2VsZi5rbm93bl9tb2R1bGVzID0ge30KCiAgICBkZWYgX2FkZF9tb2R1bGUoc2VsZiwgbW9kLCAqZnVsbG5hbWVzKToKICAgICAgICBmb3IgZnVsbG5hbWUgaW4gZnVsbG5hbWVzOgogICAgICAgICAgICBzZWxmLmtub3duX21vZHVsZXNbc2VsZi5uYW1lICsgIi4iICsgZnVsbG5hbWVdID0gbW9kCgogICAgZGVmIF9nZXRfbW9kdWxlKHNlbGYsIGZ1bGxuYW1lKToKICAgICAgICByZXR1cm4gc2VsZi5rbm93bl9tb2R1bGVzW3NlbGYubmFtZSArICIuIiArIGZ1bGxuYW1lXQoKICAgIGRlZiBmaW5kX21vZHVsZShzZWxmLCBmdWxsbmFtZSwgcGF0aD1Ob25lKToKICAgICAgICBpZiBmdWxsbmFtZSBpbiBzZWxmLmtub3duX21vZHVsZXM6CiAgICAgICAgICAgIHJldHVybiBzZWxmCiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBkZWYgX19nZXRfbW9kdWxlKHNlbGYsIGZ1bGxuYW1lKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmtub3duX21vZHVsZXNbZnVsbG5hbWVdCiAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICByYWlzZSBJbXBvcnRFcnJvcigiVGhpcyBsb2FkZXIgZG9lcyBub3Qga25vdyBtb2R1bGUgIiArIGZ1bGxuYW1lKQoKICAgIGRlZiBsb2FkX21vZHVsZShzZWxmLCBmdWxsbmFtZSk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICAjIGluIGNhc2Ugb2YgYSByZWxvYWQKICAgICAgICAgICAgcmV0dXJuIHN5cy5tb2R1bGVzW2Z1bGxuYW1lXQogICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgcGFzcwogICAgICAgIG1vZCA9IHNlbGYuX19nZXRfbW9kdWxlKGZ1bGxuYW1lKQogICAgICAgIGlmIGlzaW5zdGFuY2UobW9kLCBNb3ZlZE1vZHVsZSk6CiAgICAgICAgICAgIG1vZCA9IG1vZC5fcmVzb2x2ZSgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbW9kLl9fbG9hZGVyX18gPSBzZWxmCiAgICAgICAgc3lzLm1vZHVsZXNbZnVsbG5hbWVdID0gbW9kCiAgICAgICAgcmV0dXJuIG1vZAoKICAgIGRlZiBpc19wYWNrYWdlKHNlbGYsIGZ1bGxuYW1lKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gdHJ1ZSwgaWYgdGhlIG5hbWVkIG1vZHVsZSBpcyBhIHBhY2thZ2UuCgogICAgICAgIFdlIG5lZWQgdGhpcyBtZXRob2QgdG8gZ2V0IGNvcnJlY3Qgc3BlYyBvYmplY3RzIHdpdGgKICAgICAgICBQeXRob24gMy40IChzZWUgUEVQNDUxKQogICAgICAgICIiIgogICAgICAgIHJldHVybiBoYXNhdHRyKHNlbGYuX19nZXRfbW9kdWxlKGZ1bGxuYW1lKSwgIl9fcGF0aF9fIikKCiAgICBkZWYgZ2V0X2NvZGUoc2VsZiwgZnVsbG5hbWUpOgogICAgICAgICIiIlJldHVybiBOb25lCgogICAgICAgIFJlcXVpcmVkLCBpZiBpc19wYWNrYWdlIGlzIGltcGxlbWVudGVkIiIiCiAgICAgICAgc2VsZi5fX2dldF9tb2R1bGUoZnVsbG5hbWUpICAjIGV2ZW50dWFsbHkgcmFpc2VzIEltcG9ydEVycm9yCiAgICAgICAgcmV0dXJuIE5vbmUKICAgIGdldF9zb3VyY2UgPSBnZXRfY29kZSAgIyBzYW1lIGFzIGdldF9jb2RlCgpfaW1wb3J0ZXIgPSBfU2l4TWV0YVBhdGhJbXBvcnRlcihfX25hbWVfXykKCgpjbGFzcyBfTW92ZWRJdGVtcyhfTGF6eU1vZHVsZSk6CgogICAgIiIiTGF6eSBsb2FkaW5nIG9mIG1vdmVkIG9iamVjdHMiIiIKICAgIF9fcGF0aF9fID0gW10gICMgbWFyayBhcyBwYWNrYWdlCgoKX21vdmVkX2F0dHJpYnV0ZXMgPSBbCiAgICBNb3ZlZEF0dHJpYnV0ZSgiY1N0cmluZ0lPIiwgImNTdHJpbmdJTyIsICJpbyIsICJTdHJpbmdJTyIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImZpbHRlciIsICJpdGVydG9vbHMiLCAiYnVpbHRpbnMiLCAiaWZpbHRlciIsICJmaWx0ZXIiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJmaWx0ZXJmYWxzZSIsICJpdGVydG9vbHMiLCAiaXRlcnRvb2xzIiwgImlmaWx0ZXJmYWxzZSIsICJmaWx0ZXJmYWxzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImlucHV0IiwgIl9fYnVpbHRpbl9fIiwgImJ1aWx0aW5zIiwgInJhd19pbnB1dCIsICJpbnB1dCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImludGVybiIsICJfX2J1aWx0aW5fXyIsICJzeXMiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJtYXAiLCAiaXRlcnRvb2xzIiwgImJ1aWx0aW5zIiwgImltYXAiLCAibWFwIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiZ2V0Y3dkIiwgIm9zIiwgIm9zIiwgImdldGN3ZHUiLCAiZ2V0Y3dkIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiZ2V0Y3dkYiIsICJvcyIsICJvcyIsICJnZXRjd2QiLCAiZ2V0Y3dkYiIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInJhbmdlIiwgIl9fYnVpbHRpbl9fIiwgImJ1aWx0aW5zIiwgInhyYW5nZSIsICJyYW5nZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInJlbG9hZF9tb2R1bGUiLCAiX19idWlsdGluX18iLCAiaW1wb3J0bGliIiBpZiBQWTM0IGVsc2UgImltcCIsICJyZWxvYWQiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJyZWR1Y2UiLCAiX19idWlsdGluX18iLCAiZnVuY3Rvb2xzIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgic2hsZXhfcXVvdGUiLCAicGlwZXMiLCAic2hsZXgiLCAicXVvdGUiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJTdHJpbmdJTyIsICJTdHJpbmdJTyIsICJpbyIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlVzZXJEaWN0IiwgIlVzZXJEaWN0IiwgImNvbGxlY3Rpb25zIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiVXNlckxpc3QiLCAiVXNlckxpc3QiLCAiY29sbGVjdGlvbnMiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJVc2VyU3RyaW5nIiwgIlVzZXJTdHJpbmciLCAiY29sbGVjdGlvbnMiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ4cmFuZ2UiLCAiX19idWlsdGluX18iLCAiYnVpbHRpbnMiLCAieHJhbmdlIiwgInJhbmdlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiemlwIiwgIml0ZXJ0b29scyIsICJidWlsdGlucyIsICJpemlwIiwgInppcCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInppcF9sb25nZXN0IiwgIml0ZXJ0b29scyIsICJpdGVydG9vbHMiLCAiaXppcF9sb25nZXN0IiwgInppcF9sb25nZXN0IiksCiAgICBNb3ZlZE1vZHVsZSgiYnVpbHRpbnMiLCAiX19idWlsdGluX18iKSwKICAgIE1vdmVkTW9kdWxlKCJjb25maWdwYXJzZXIiLCAiQ29uZmlnUGFyc2VyIiksCiAgICBNb3ZlZE1vZHVsZSgiY29weXJlZyIsICJjb3B5X3JlZyIpLAogICAgTW92ZWRNb2R1bGUoImRibV9nbnUiLCAiZ2RibSIsICJkYm0uZ251IiksCiAgICBNb3ZlZE1vZHVsZSgiX2R1bW15X3RocmVhZCIsICJkdW1teV90aHJlYWQiLCAiX2R1bW15X3RocmVhZCIpLAogICAgTW92ZWRNb2R1bGUoImh0dHBfY29va2llamFyIiwgImNvb2tpZWxpYiIsICJodHRwLmNvb2tpZWphciIpLAogICAgTW92ZWRNb2R1bGUoImh0dHBfY29va2llcyIsICJDb29raWUiLCAiaHR0cC5jb29raWVzIiksCiAgICBNb3ZlZE1vZHVsZSgiaHRtbF9lbnRpdGllcyIsICJodG1sZW50aXR5ZGVmcyIsICJodG1sLmVudGl0aWVzIiksCiAgICBNb3ZlZE1vZHVsZSgiaHRtbF9wYXJzZXIiLCAiSFRNTFBhcnNlciIsICJodG1sLnBhcnNlciIpLAogICAgTW92ZWRNb2R1bGUoImh0dHBfY2xpZW50IiwgImh0dHBsaWIiLCAiaHR0cC5jbGllbnQiKSwKICAgIE1vdmVkTW9kdWxlKCJlbWFpbF9taW1lX211bHRpcGFydCIsICJlbWFpbC5NSU1FTXVsdGlwYXJ0IiwgImVtYWlsLm1pbWUubXVsdGlwYXJ0IiksCiAgICBNb3ZlZE1vZHVsZSgiZW1haWxfbWltZV9ub25tdWx0aXBhcnQiLCAiZW1haWwuTUlNRU5vbk11bHRpcGFydCIsICJlbWFpbC5taW1lLm5vbm11bHRpcGFydCIpLAogICAgTW92ZWRNb2R1bGUoImVtYWlsX21pbWVfdGV4dCIsICJlbWFpbC5NSU1FVGV4dCIsICJlbWFpbC5taW1lLnRleHQiKSwKICAgIE1vdmVkTW9kdWxlKCJlbWFpbF9taW1lX2Jhc2UiLCAiZW1haWwuTUlNRUJhc2UiLCAiZW1haWwubWltZS5iYXNlIiksCiAgICBNb3ZlZE1vZHVsZSgiQmFzZUhUVFBTZXJ2ZXIiLCAiQmFzZUhUVFBTZXJ2ZXIiLCAiaHR0cC5zZXJ2ZXIiKSwKICAgIE1vdmVkTW9kdWxlKCJDR0lIVFRQU2VydmVyIiwgIkNHSUhUVFBTZXJ2ZXIiLCAiaHR0cC5zZXJ2ZXIiKSwKICAgIE1vdmVkTW9kdWxlKCJTaW1wbGVIVFRQU2VydmVyIiwgIlNpbXBsZUhUVFBTZXJ2ZXIiLCAiaHR0cC5zZXJ2ZXIiKSwKICAgIE1vdmVkTW9kdWxlKCJjUGlja2xlIiwgImNQaWNrbGUiLCAicGlja2xlIiksCiAgICBNb3ZlZE1vZHVsZSgicXVldWUiLCAiUXVldWUiKSwKICAgIE1vdmVkTW9kdWxlKCJyZXBybGliIiwgInJlcHIiKSwKICAgIE1vdmVkTW9kdWxlKCJzb2NrZXRzZXJ2ZXIiLCAiU29ja2V0U2VydmVyIiksCiAgICBNb3ZlZE1vZHVsZSgiX3RocmVhZCIsICJ0aHJlYWQiLCAiX3RocmVhZCIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXIiLCAiVGtpbnRlciIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfZGlhbG9nIiwgIkRpYWxvZyIsICJ0a2ludGVyLmRpYWxvZyIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfZmlsZWRpYWxvZyIsICJGaWxlRGlhbG9nIiwgInRraW50ZXIuZmlsZWRpYWxvZyIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfc2Nyb2xsZWR0ZXh0IiwgIlNjcm9sbGVkVGV4dCIsICJ0a2ludGVyLnNjcm9sbGVkdGV4dCIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfc2ltcGxlZGlhbG9nIiwgIlNpbXBsZURpYWxvZyIsICJ0a2ludGVyLnNpbXBsZWRpYWxvZyIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfdGl4IiwgIlRpeCIsICJ0a2ludGVyLnRpeCIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfdHRrIiwgInR0ayIsICJ0a2ludGVyLnR0ayIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfY29uc3RhbnRzIiwgIlRrY29uc3RhbnRzIiwgInRraW50ZXIuY29uc3RhbnRzIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl9kbmQiLCAiVGtkbmQiLCAidGtpbnRlci5kbmQiKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX2NvbG9yY2hvb3NlciIsICJ0a0NvbG9yQ2hvb3NlciIsCiAgICAgICAgICAgICAgICAidGtpbnRlci5jb2xvcmNob29zZXIiKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX2NvbW1vbmRpYWxvZyIsICJ0a0NvbW1vbkRpYWxvZyIsCiAgICAgICAgICAgICAgICAidGtpbnRlci5jb21tb25kaWFsb2ciKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX3RrZmlsZWRpYWxvZyIsICJ0a0ZpbGVEaWFsb2ciLCAidGtpbnRlci5maWxlZGlhbG9nIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl9mb250IiwgInRrRm9udCIsICJ0a2ludGVyLmZvbnQiKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX21lc3NhZ2Vib3giLCAidGtNZXNzYWdlQm94IiwgInRraW50ZXIubWVzc2FnZWJveCIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfdGtzaW1wbGVkaWFsb2ciLCAidGtTaW1wbGVEaWFsb2ciLAogICAgICAgICAgICAgICAgInRraW50ZXIuc2ltcGxlZGlhbG9nIiksCiAgICBNb3ZlZE1vZHVsZSgidXJsbGliX3BhcnNlIiwgX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYl9wYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkTW9kdWxlKCJ1cmxsaWJfZXJyb3IiLCBfX25hbWVfXyArICIubW92ZXMudXJsbGliX2Vycm9yIiwgInVybGxpYi5lcnJvciIpLAogICAgTW92ZWRNb2R1bGUoInVybGxpYiIsIF9fbmFtZV9fICsgIi5tb3Zlcy51cmxsaWIiLCBfX25hbWVfXyArICIubW92ZXMudXJsbGliIiksCiAgICBNb3ZlZE1vZHVsZSgidXJsbGliX3JvYm90cGFyc2VyIiwgInJvYm90cGFyc2VyIiwgInVybGxpYi5yb2JvdHBhcnNlciIpLAogICAgTW92ZWRNb2R1bGUoInhtbHJwY19jbGllbnQiLCAieG1scnBjbGliIiwgInhtbHJwYy5jbGllbnQiKSwKICAgIE1vdmVkTW9kdWxlKCJ4bWxycGNfc2VydmVyIiwgIlNpbXBsZVhNTFJQQ1NlcnZlciIsICJ4bWxycGMuc2VydmVyIiksCl0KIyBBZGQgd2luZG93cyBzcGVjaWZpYyBtb2R1bGVzLgppZiBzeXMucGxhdGZvcm0gPT0gIndpbjMyIjoKICAgIF9tb3ZlZF9hdHRyaWJ1dGVzICs9IFsKICAgICAgICBNb3ZlZE1vZHVsZSgid2lucmVnIiwgIl93aW5yZWciKSwKICAgIF0KCmZvciBhdHRyIGluIF9tb3ZlZF9hdHRyaWJ1dGVzOgogICAgc2V0YXR0cihfTW92ZWRJdGVtcywgYXR0ci5uYW1lLCBhdHRyKQogICAgaWYgaXNpbnN0YW5jZShhdHRyLCBNb3ZlZE1vZHVsZSk6CiAgICAgICAgX2ltcG9ydGVyLl9hZGRfbW9kdWxlKGF0dHIsICJtb3Zlcy4iICsgYXR0ci5uYW1lKQpkZWwgYXR0cgoKX01vdmVkSXRlbXMuX21vdmVkX2F0dHJpYnV0ZXMgPSBfbW92ZWRfYXR0cmlidXRlcwoKbW92ZXMgPSBfTW92ZWRJdGVtcyhfX25hbWVfXyArICIubW92ZXMiKQpfaW1wb3J0ZXIuX2FkZF9tb2R1bGUobW92ZXMsICJtb3ZlcyIpCgoKY2xhc3MgTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcGFyc2UoX0xhenlNb2R1bGUpOgoKICAgICIiIkxhenkgbG9hZGluZyBvZiBtb3ZlZCBvYmplY3RzIGluIHNpeC5tb3Zlcy51cmxsaWJfcGFyc2UiIiIKCgpfdXJsbGliX3BhcnNlX21vdmVkX2F0dHJpYnV0ZXMgPSBbCiAgICBNb3ZlZEF0dHJpYnV0ZSgiUGFyc2VSZXN1bHQiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiU3BsaXRSZXN1bHQiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgicGFyc2VfcXMiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgicGFyc2VfcXNsIiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVybGRlZnJhZyIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmxqb2luIiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVybHBhcnNlIiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVybHNwbGl0IiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVybHVucGFyc2UiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJsdW5zcGxpdCIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJxdW90ZSIsICJ1cmxsaWIiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgicXVvdGVfcGx1cyIsICJ1cmxsaWIiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidW5xdW90ZSIsICJ1cmxsaWIiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidW5xdW90ZV9wbHVzIiwgInVybGxpYiIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmxlbmNvZGUiLCAidXJsbGliIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInNwbGl0cXVlcnkiLCAidXJsbGliIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInNwbGl0dGFnIiwgInVybGxpYiIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJzcGxpdHVzZXIiLCAidXJsbGliIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVzZXNfZnJhZ21lbnQiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXNlc19uZXRsb2MiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXNlc19wYXJhbXMiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXNlc19xdWVyeSIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1c2VzX3JlbGF0aXZlIiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLApdCmZvciBhdHRyIGluIF91cmxsaWJfcGFyc2VfbW92ZWRfYXR0cmlidXRlczoKICAgIHNldGF0dHIoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcGFyc2UsIGF0dHIubmFtZSwgYXR0cikKZGVsIGF0dHIKCk1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3BhcnNlLl9tb3ZlZF9hdHRyaWJ1dGVzID0gX3VybGxpYl9wYXJzZV9tb3ZlZF9hdHRyaWJ1dGVzCgpfaW1wb3J0ZXIuX2FkZF9tb2R1bGUoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcGFyc2UoX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYl9wYXJzZSIpLAogICAgICAgICAgICAgICAgICAgICAgIm1vdmVzLnVybGxpYl9wYXJzZSIsICJtb3Zlcy51cmxsaWIucGFyc2UiKQoKCmNsYXNzIE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX2Vycm9yKF9MYXp5TW9kdWxlKToKCiAgICAiIiJMYXp5IGxvYWRpbmcgb2YgbW92ZWQgb2JqZWN0cyBpbiBzaXgubW92ZXMudXJsbGliX2Vycm9yIiIiCgoKX3VybGxpYl9lcnJvcl9tb3ZlZF9hdHRyaWJ1dGVzID0gWwogICAgTW92ZWRBdHRyaWJ1dGUoIlVSTEVycm9yIiwgInVybGxpYjIiLCAidXJsbGliLmVycm9yIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUEVycm9yIiwgInVybGxpYjIiLCAidXJsbGliLmVycm9yIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiQ29udGVudFRvb1Nob3J0RXJyb3IiLCAidXJsbGliIiwgInVybGxpYi5lcnJvciIpLApdCmZvciBhdHRyIGluIF91cmxsaWJfZXJyb3JfbW92ZWRfYXR0cmlidXRlczoKICAgIHNldGF0dHIoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfZXJyb3IsIGF0dHIubmFtZSwgYXR0cikKZGVsIGF0dHIKCk1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX2Vycm9yLl9tb3ZlZF9hdHRyaWJ1dGVzID0gX3VybGxpYl9lcnJvcl9tb3ZlZF9hdHRyaWJ1dGVzCgpfaW1wb3J0ZXIuX2FkZF9tb2R1bGUoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfZXJyb3IoX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYi5lcnJvciIpLAogICAgICAgICAgICAgICAgICAgICAgIm1vdmVzLnVybGxpYl9lcnJvciIsICJtb3Zlcy51cmxsaWIuZXJyb3IiKQoKCmNsYXNzIE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3JlcXVlc3QoX0xhenlNb2R1bGUpOgoKICAgICIiIkxhenkgbG9hZGluZyBvZiBtb3ZlZCBvYmplY3RzIGluIHNpeC5tb3Zlcy51cmxsaWJfcmVxdWVzdCIiIgoKCl91cmxsaWJfcmVxdWVzdF9tb3ZlZF9hdHRyaWJ1dGVzID0gWwogICAgTW92ZWRBdHRyaWJ1dGUoInVybG9wZW4iLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImluc3RhbGxfb3BlbmVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJidWlsZF9vcGVuZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInBhdGhuYW1lMnVybCIsICJ1cmxsaWIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmwycGF0aG5hbWUiLCAidXJsbGliIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiZ2V0cHJveGllcyIsICJ1cmxsaWIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJSZXF1ZXN0IiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJPcGVuZXJEaXJlY3RvciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUERlZmF1bHRFcnJvckhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBSZWRpcmVjdEhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBDb29raWVQcm9jZXNzb3IiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlByb3h5SGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiQmFzZUhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBQYXNzd29yZE1nciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUFBhc3N3b3JkTWdyV2l0aERlZmF1bHRSZWFsbSIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiQWJzdHJhY3RCYXNpY0F1dGhIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQQmFzaWNBdXRoSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiUHJveHlCYXNpY0F1dGhIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJBYnN0cmFjdERpZ2VzdEF1dGhIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQRGlnZXN0QXV0aEhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlByb3h5RGlnZXN0QXV0aEhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQU0hhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkZpbGVIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJGVFBIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJDYWNoZUZUUEhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlVua25vd25IYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQRXJyb3JQcm9jZXNzb3IiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVybHJldHJpZXZlIiwgInVybGxpYiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVybGNsZWFudXAiLCAidXJsbGliIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiVVJMb3BlbmVyIiwgInVybGxpYiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkZhbmN5VVJMb3BlbmVyIiwgInVybGxpYiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInByb3h5X2J5cGFzcyIsICJ1cmxsaWIiLCAidXJsbGliLnJlcXVlc3QiKSwKXQpmb3IgYXR0ciBpbiBfdXJsbGliX3JlcXVlc3RfbW92ZWRfYXR0cmlidXRlczoKICAgIHNldGF0dHIoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcmVxdWVzdCwgYXR0ci5uYW1lLCBhdHRyKQpkZWwgYXR0cgoKTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcmVxdWVzdC5fbW92ZWRfYXR0cmlidXRlcyA9IF91cmxsaWJfcmVxdWVzdF9tb3ZlZF9hdHRyaWJ1dGVzCgpfaW1wb3J0ZXIuX2FkZF9tb2R1bGUoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcmVxdWVzdChfX25hbWVfXyArICIubW92ZXMudXJsbGliLnJlcXVlc3QiKSwKICAgICAgICAgICAgICAgICAgICAgICJtb3Zlcy51cmxsaWJfcmVxdWVzdCIsICJtb3Zlcy51cmxsaWIucmVxdWVzdCIpCgoKY2xhc3MgTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcmVzcG9uc2UoX0xhenlNb2R1bGUpOgoKICAgICIiIkxhenkgbG9hZGluZyBvZiBtb3ZlZCBvYmplY3RzIGluIHNpeC5tb3Zlcy51cmxsaWJfcmVzcG9uc2UiIiIKCgpfdXJsbGliX3Jlc3BvbnNlX21vdmVkX2F0dHJpYnV0ZXMgPSBbCiAgICBNb3ZlZEF0dHJpYnV0ZSgiYWRkYmFzZSIsICJ1cmxsaWIiLCAidXJsbGliLnJlc3BvbnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiYWRkY2xvc2Vob29rIiwgInVybGxpYiIsICJ1cmxsaWIucmVzcG9uc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJhZGRpbmZvIiwgInVybGxpYiIsICJ1cmxsaWIucmVzcG9uc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJhZGRpbmZvdXJsIiwgInVybGxpYiIsICJ1cmxsaWIucmVzcG9uc2UiKSwKXQpmb3IgYXR0ciBpbiBfdXJsbGliX3Jlc3BvbnNlX21vdmVkX2F0dHJpYnV0ZXM6CiAgICBzZXRhdHRyKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3Jlc3BvbnNlLCBhdHRyLm5hbWUsIGF0dHIpCmRlbCBhdHRyCgpNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yZXNwb25zZS5fbW92ZWRfYXR0cmlidXRlcyA9IF91cmxsaWJfcmVzcG9uc2VfbW92ZWRfYXR0cmlidXRlcwoKX2ltcG9ydGVyLl9hZGRfbW9kdWxlKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3Jlc3BvbnNlKF9fbmFtZV9fICsgIi5tb3Zlcy51cmxsaWIucmVzcG9uc2UiKSwKICAgICAgICAgICAgICAgICAgICAgICJtb3Zlcy51cmxsaWJfcmVzcG9uc2UiLCAibW92ZXMudXJsbGliLnJlc3BvbnNlIikKCgpjbGFzcyBNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yb2JvdHBhcnNlcihfTGF6eU1vZHVsZSk6CgogICAgIiIiTGF6eSBsb2FkaW5nIG9mIG1vdmVkIG9iamVjdHMgaW4gc2l4Lm1vdmVzLnVybGxpYl9yb2JvdHBhcnNlciIiIgoKCl91cmxsaWJfcm9ib3RwYXJzZXJfbW92ZWRfYXR0cmlidXRlcyA9IFsKICAgIE1vdmVkQXR0cmlidXRlKCJSb2JvdEZpbGVQYXJzZXIiLCAicm9ib3RwYXJzZXIiLCAidXJsbGliLnJvYm90cGFyc2VyIiksCl0KZm9yIGF0dHIgaW4gX3VybGxpYl9yb2JvdHBhcnNlcl9tb3ZlZF9hdHRyaWJ1dGVzOgogICAgc2V0YXR0cihNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yb2JvdHBhcnNlciwgYXR0ci5uYW1lLCBhdHRyKQpkZWwgYXR0cgoKTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcm9ib3RwYXJzZXIuX21vdmVkX2F0dHJpYnV0ZXMgPSBfdXJsbGliX3JvYm90cGFyc2VyX21vdmVkX2F0dHJpYnV0ZXMKCl9pbXBvcnRlci5fYWRkX21vZHVsZShNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yb2JvdHBhcnNlcihfX25hbWVfXyArICIubW92ZXMudXJsbGliLnJvYm90cGFyc2VyIiksCiAgICAgICAgICAgICAgICAgICAgICAibW92ZXMudXJsbGliX3JvYm90cGFyc2VyIiwgIm1vdmVzLnVybGxpYi5yb2JvdHBhcnNlciIpCgoKY2xhc3MgTW9kdWxlX3NpeF9tb3Zlc191cmxsaWIodHlwZXMuTW9kdWxlVHlwZSk6CgogICAgIiIiQ3JlYXRlIGEgc2l4Lm1vdmVzLnVybGxpYiBuYW1lc3BhY2UgdGhhdCByZXNlbWJsZXMgdGhlIFB5dGhvbiAzIG5hbWVzcGFjZSIiIgogICAgX19wYXRoX18gPSBbXSAgIyBtYXJrIGFzIHBhY2thZ2UKICAgIHBhcnNlID0gX2ltcG9ydGVyLl9nZXRfbW9kdWxlKCJtb3Zlcy51cmxsaWJfcGFyc2UiKQogICAgZXJyb3IgPSBfaW1wb3J0ZXIuX2dldF9tb2R1bGUoIm1vdmVzLnVybGxpYl9lcnJvciIpCiAgICByZXF1ZXN0ID0gX2ltcG9ydGVyLl9nZXRfbW9kdWxlKCJtb3Zlcy51cmxsaWJfcmVxdWVzdCIpCiAgICByZXNwb25zZSA9IF9pbXBvcnRlci5fZ2V0X21vZHVsZSgibW92ZXMudXJsbGliX3Jlc3BvbnNlIikKICAgIHJvYm90cGFyc2VyID0gX2ltcG9ydGVyLl9nZXRfbW9kdWxlKCJtb3Zlcy51cmxsaWJfcm9ib3RwYXJzZXIiKQoKICAgIGRlZiBfX2Rpcl9fKHNlbGYpOgogICAgICAgIHJldHVybiBbJ3BhcnNlJywgJ2Vycm9yJywgJ3JlcXVlc3QnLCAncmVzcG9uc2UnLCAncm9ib3RwYXJzZXInXQoKX2ltcG9ydGVyLl9hZGRfbW9kdWxlKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliKF9fbmFtZV9fICsgIi5tb3Zlcy51cmxsaWIiKSwKICAgICAgICAgICAgICAgICAgICAgICJtb3Zlcy51cmxsaWIiKQoKCmRlZiBhZGRfbW92ZShtb3ZlKToKICAgICIiIkFkZCBhbiBpdGVtIHRvIHNpeC5tb3Zlcy4iIiIKICAgIHNldGF0dHIoX01vdmVkSXRlbXMsIG1vdmUubmFtZSwgbW92ZSkKCgpkZWYgcmVtb3ZlX21vdmUobmFtZSk6CiAgICAiIiJSZW1vdmUgaXRlbSBmcm9tIHNpeC5tb3Zlcy4iIiIKICAgIHRyeToKICAgICAgICBkZWxhdHRyKF9Nb3ZlZEl0ZW1zLCBuYW1lKQogICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgIHRyeToKICAgICAgICAgICAgZGVsIG1vdmVzLl9fZGljdF9fW25hbWVdCiAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcigibm8gc3VjaCBtb3ZlLCAlciIgJSAobmFtZSwpKQoKCmlmIFBZMzoKICAgIF9tZXRoX2Z1bmMgPSAiX19mdW5jX18iCiAgICBfbWV0aF9zZWxmID0gIl9fc2VsZl9fIgoKICAgIF9mdW5jX2Nsb3N1cmUgPSAiX19jbG9zdXJlX18iCiAgICBfZnVuY19jb2RlID0gIl9fY29kZV9fIgogICAgX2Z1bmNfZGVmYXVsdHMgPSAiX19kZWZhdWx0c19fIgogICAgX2Z1bmNfZ2xvYmFscyA9ICJfX2dsb2JhbHNfXyIKZWxzZToKICAgIF9tZXRoX2Z1bmMgPSAiaW1fZnVuYyIKICAgIF9tZXRoX3NlbGYgPSAiaW1fc2VsZiIKCiAgICBfZnVuY19jbG9zdXJlID0gImZ1bmNfY2xvc3VyZSIKICAgIF9mdW5jX2NvZGUgPSAiZnVuY19jb2RlIgogICAgX2Z1bmNfZGVmYXVsdHMgPSAiZnVuY19kZWZhdWx0cyIKICAgIF9mdW5jX2dsb2JhbHMgPSAiZnVuY19nbG9iYWxzIgoKCnRyeToKICAgIGFkdmFuY2VfaXRlcmF0b3IgPSBuZXh0CmV4Y2VwdCBOYW1lRXJyb3I6CiAgICBkZWYgYWR2YW5jZV9pdGVyYXRvcihpdCk6CiAgICAgICAgcmV0dXJuIGl0Lm5leHQoKQpuZXh0ID0gYWR2YW5jZV9pdGVyYXRvcgoKCnRyeToKICAgIGNhbGxhYmxlID0gY2FsbGFibGUKZXhjZXB0IE5hbWVFcnJvcjoKICAgIGRlZiBjYWxsYWJsZShvYmopOgogICAgICAgIHJldHVybiBhbnkoIl9fY2FsbF9fIiBpbiBrbGFzcy5fX2RpY3RfXyBmb3Iga2xhc3MgaW4gdHlwZShvYmopLl9fbXJvX18pCgoKaWYgUFkzOgogICAgZGVmIGdldF91bmJvdW5kX2Z1bmN0aW9uKHVuYm91bmQpOgogICAgICAgIHJldHVybiB1bmJvdW5kCgogICAgY3JlYXRlX2JvdW5kX21ldGhvZCA9IHR5cGVzLk1ldGhvZFR5cGUKCiAgICBkZWYgY3JlYXRlX3VuYm91bmRfbWV0aG9kKGZ1bmMsIGNscyk6CiAgICAgICAgcmV0dXJuIGZ1bmMKCiAgICBJdGVyYXRvciA9IG9iamVjdAplbHNlOgogICAgZGVmIGdldF91bmJvdW5kX2Z1bmN0aW9uKHVuYm91bmQpOgogICAgICAgIHJldHVybiB1bmJvdW5kLmltX2Z1bmMKCiAgICBkZWYgY3JlYXRlX2JvdW5kX21ldGhvZChmdW5jLCBvYmopOgogICAgICAgIHJldHVybiB0eXBlcy5NZXRob2RUeXBlKGZ1bmMsIG9iaiwgb2JqLl9fY2xhc3NfXykKCiAgICBkZWYgY3JlYXRlX3VuYm91bmRfbWV0aG9kKGZ1bmMsIGNscyk6CiAgICAgICAgcmV0dXJuIHR5cGVzLk1ldGhvZFR5cGUoZnVuYywgTm9uZSwgY2xzKQoKICAgIGNsYXNzIEl0ZXJhdG9yKG9iamVjdCk6CgogICAgICAgIGRlZiBuZXh0KHNlbGYpOgogICAgICAgICAgICByZXR1cm4gdHlwZShzZWxmKS5fX25leHRfXyhzZWxmKQoKICAgIGNhbGxhYmxlID0gY2FsbGFibGUKX2FkZF9kb2MoZ2V0X3VuYm91bmRfZnVuY3Rpb24sCiAgICAgICAgICIiIkdldCB0aGUgZnVuY3Rpb24gb3V0IG9mIGEgcG9zc2libHkgdW5ib3VuZCBmdW5jdGlvbiIiIikKCgpnZXRfbWV0aG9kX2Z1bmN0aW9uID0gb3BlcmF0b3IuYXR0cmdldHRlcihfbWV0aF9mdW5jKQpnZXRfbWV0aG9kX3NlbGYgPSBvcGVyYXRvci5hdHRyZ2V0dGVyKF9tZXRoX3NlbGYpCmdldF9mdW5jdGlvbl9jbG9zdXJlID0gb3BlcmF0b3IuYXR0cmdldHRlcihfZnVuY19jbG9zdXJlKQpnZXRfZnVuY3Rpb25fY29kZSA9IG9wZXJhdG9yLmF0dHJnZXR0ZXIoX2Z1bmNfY29kZSkKZ2V0X2Z1bmN0aW9uX2RlZmF1bHRzID0gb3BlcmF0b3IuYXR0cmdldHRlcihfZnVuY19kZWZhdWx0cykKZ2V0X2Z1bmN0aW9uX2dsb2JhbHMgPSBvcGVyYXRvci5hdHRyZ2V0dGVyKF9mdW5jX2dsb2JhbHMpCgoKaWYgUFkzOgogICAgZGVmIGl0ZXJrZXlzKGQsICoqa3cpOgogICAgICAgIHJldHVybiBpdGVyKGQua2V5cygqKmt3KSkKCiAgICBkZWYgaXRlcnZhbHVlcyhkLCAqKmt3KToKICAgICAgICByZXR1cm4gaXRlcihkLnZhbHVlcygqKmt3KSkKCiAgICBkZWYgaXRlcml0ZW1zKGQsICoqa3cpOgogICAgICAgIHJldHVybiBpdGVyKGQuaXRlbXMoKiprdykpCgogICAgZGVmIGl0ZXJsaXN0cyhkLCAqKmt3KToKICAgICAgICByZXR1cm4gaXRlcihkLmxpc3RzKCoqa3cpKQoKICAgIHZpZXdrZXlzID0gb3BlcmF0b3IubWV0aG9kY2FsbGVyKCJrZXlzIikKCiAgICB2aWV3dmFsdWVzID0gb3BlcmF0b3IubWV0aG9kY2FsbGVyKCJ2YWx1ZXMiKQoKICAgIHZpZXdpdGVtcyA9IG9wZXJhdG9yLm1ldGhvZGNhbGxlcigiaXRlbXMiKQplbHNlOgogICAgZGVmIGl0ZXJrZXlzKGQsICoqa3cpOgogICAgICAgIHJldHVybiBkLml0ZXJrZXlzKCoqa3cpCgogICAgZGVmIGl0ZXJ2YWx1ZXMoZCwgKiprdyk6CiAgICAgICAgcmV0dXJuIGQuaXRlcnZhbHVlcygqKmt3KQoKICAgIGRlZiBpdGVyaXRlbXMoZCwgKiprdyk6CiAgICAgICAgcmV0dXJuIGQuaXRlcml0ZW1zKCoqa3cpCgogICAgZGVmIGl0ZXJsaXN0cyhkLCAqKmt3KToKICAgICAgICByZXR1cm4gZC5pdGVybGlzdHMoKiprdykKCiAgICB2aWV3a2V5cyA9IG9wZXJhdG9yLm1ldGhvZGNhbGxlcigidmlld2tleXMiKQoKICAgIHZpZXd2YWx1ZXMgPSBvcGVyYXRvci5tZXRob2RjYWxsZXIoInZpZXd2YWx1ZXMiKQoKICAgIHZpZXdpdGVtcyA9IG9wZXJhdG9yLm1ldGhvZGNhbGxlcigidmlld2l0ZW1zIikKCl9hZGRfZG9jKGl0ZXJrZXlzLCAiUmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGtleXMgb2YgYSBkaWN0aW9uYXJ5LiIpCl9hZGRfZG9jKGl0ZXJ2YWx1ZXMsICJSZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciB0aGUgdmFsdWVzIG9mIGEgZGljdGlvbmFyeS4iKQpfYWRkX2RvYyhpdGVyaXRlbXMsCiAgICAgICAgICJSZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciB0aGUgKGtleSwgdmFsdWUpIHBhaXJzIG9mIGEgZGljdGlvbmFyeS4iKQpfYWRkX2RvYyhpdGVybGlzdHMsCiAgICAgICAgICJSZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciB0aGUgKGtleSwgW3ZhbHVlc10pIHBhaXJzIG9mIGEgZGljdGlvbmFyeS4iKQoKCmlmIFBZMzoKICAgIGRlZiBiKHMpOgogICAgICAgIHJldHVybiBzLmVuY29kZSgibGF0aW4tMSIpCgogICAgZGVmIHUocyk6CiAgICAgICAgcmV0dXJuIHMKICAgIHVuaWNociA9IGNocgogICAgaW1wb3J0IHN0cnVjdAogICAgaW50MmJ5dGUgPSBzdHJ1Y3QuU3RydWN0KCI+QiIpLnBhY2sKICAgIGRlbCBzdHJ1Y3QKICAgIGJ5dGUyaW50ID0gb3BlcmF0b3IuaXRlbWdldHRlcigwKQogICAgaW5kZXhieXRlcyA9IG9wZXJhdG9yLmdldGl0ZW0KICAgIGl0ZXJieXRlcyA9IGl0ZXIKICAgIGltcG9ydCBpbwogICAgU3RyaW5nSU8gPSBpby5TdHJpbmdJTwogICAgQnl0ZXNJTyA9IGlvLkJ5dGVzSU8KICAgIF9hc3NlcnRDb3VudEVxdWFsID0gImFzc2VydENvdW50RXF1YWwiCiAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzFdIDw9IDE6CiAgICAgICAgX2Fzc2VydFJhaXNlc1JlZ2V4ID0gImFzc2VydFJhaXNlc1JlZ2V4cCIKICAgICAgICBfYXNzZXJ0UmVnZXggPSAiYXNzZXJ0UmVnZXhwTWF0Y2hlcyIKICAgIGVsc2U6CiAgICAgICAgX2Fzc2VydFJhaXNlc1JlZ2V4ID0gImFzc2VydFJhaXNlc1JlZ2V4IgogICAgICAgIF9hc3NlcnRSZWdleCA9ICJhc3NlcnRSZWdleCIKZWxzZToKICAgIGRlZiBiKHMpOgogICAgICAgIHJldHVybiBzCiAgICAjIFdvcmthcm91bmQgZm9yIHN0YW5kYWxvbmUgYmFja3NsYXNoCgogICAgZGVmIHUocyk6CiAgICAgICAgcmV0dXJuIHVuaWNvZGUocy5yZXBsYWNlKHInXFwnLCByJ1xcXFwnKSwgInVuaWNvZGVfZXNjYXBlIikKICAgIHVuaWNociA9IHVuaWNocgogICAgaW50MmJ5dGUgPSBjaHIKCiAgICBkZWYgYnl0ZTJpbnQoYnMpOgogICAgICAgIHJldHVybiBvcmQoYnNbMF0pCgogICAgZGVmIGluZGV4Ynl0ZXMoYnVmLCBpKToKICAgICAgICByZXR1cm4gb3JkKGJ1ZltpXSkKICAgIGl0ZXJieXRlcyA9IGZ1bmN0b29scy5wYXJ0aWFsKGl0ZXJ0b29scy5pbWFwLCBvcmQpCiAgICBpbXBvcnQgU3RyaW5nSU8KICAgIFN0cmluZ0lPID0gQnl0ZXNJTyA9IFN0cmluZ0lPLlN0cmluZ0lPCiAgICBfYXNzZXJ0Q291bnRFcXVhbCA9ICJhc3NlcnRJdGVtc0VxdWFsIgogICAgX2Fzc2VydFJhaXNlc1JlZ2V4ID0gImFzc2VydFJhaXNlc1JlZ2V4cCIKICAgIF9hc3NlcnRSZWdleCA9ICJhc3NlcnRSZWdleHBNYXRjaGVzIgpfYWRkX2RvYyhiLCAiIiJCeXRlIGxpdGVyYWwiIiIpCl9hZGRfZG9jKHUsICIiIlRleHQgbGl0ZXJhbCIiIikKCgpkZWYgYXNzZXJ0Q291bnRFcXVhbChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgcmV0dXJuIGdldGF0dHIoc2VsZiwgX2Fzc2VydENvdW50RXF1YWwpKCphcmdzLCAqKmt3YXJncykKCgpkZWYgYXNzZXJ0UmFpc2VzUmVnZXgoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgIHJldHVybiBnZXRhdHRyKHNlbGYsIF9hc3NlcnRSYWlzZXNSZWdleCkoKmFyZ3MsICoqa3dhcmdzKQoKCmRlZiBhc3NlcnRSZWdleChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgcmV0dXJuIGdldGF0dHIoc2VsZiwgX2Fzc2VydFJlZ2V4KSgqYXJncywgKiprd2FyZ3MpCgoKaWYgUFkzOgogICAgZXhlY18gPSBnZXRhdHRyKG1vdmVzLmJ1aWx0aW5zLCAiZXhlYyIpCgogICAgZGVmIHJlcmFpc2UodHAsIHZhbHVlLCB0Yj1Ob25lKToKICAgICAgICBpZiB2YWx1ZSBpcyBOb25lOgogICAgICAgICAgICB2YWx1ZSA9IHRwKCkKICAgICAgICBpZiB2YWx1ZS5fX3RyYWNlYmFja19fIGlzIG5vdCB0YjoKICAgICAgICAgICAgcmFpc2UgdmFsdWUud2l0aF90cmFjZWJhY2sodGIpCiAgICAgICAgcmFpc2UgdmFsdWUKCmVsc2U6CiAgICBkZWYgZXhlY18oX2NvZGVfLCBfZ2xvYnNfPU5vbmUsIF9sb2NzXz1Ob25lKToKICAgICAgICAiIiJFeGVjdXRlIGNvZGUgaW4gYSBuYW1lc3BhY2UuIiIiCiAgICAgICAgaWYgX2dsb2JzXyBpcyBOb25lOgogICAgICAgICAgICBmcmFtZSA9IHN5cy5fZ2V0ZnJhbWUoMSkKICAgICAgICAgICAgX2dsb2JzXyA9IGZyYW1lLmZfZ2xvYmFscwogICAgICAgICAgICBpZiBfbG9jc18gaXMgTm9uZToKICAgICAgICAgICAgICAgIF9sb2NzXyA9IGZyYW1lLmZfbG9jYWxzCiAgICAgICAgICAgIGRlbCBmcmFtZQogICAgICAgIGVsaWYgX2xvY3NfIGlzIE5vbmU6CiAgICAgICAgICAgIF9sb2NzXyA9IF9nbG9ic18KICAgICAgICBleGVjKCIiImV4ZWMgX2NvZGVfIGluIF9nbG9ic18sIF9sb2NzXyIiIikKCiAgICBleGVjXygiIiJkZWYgcmVyYWlzZSh0cCwgdmFsdWUsIHRiPU5vbmUpOgogICAgcmFpc2UgdHAsIHZhbHVlLCB0YgoiIiIpCgoKaWYgc3lzLnZlcnNpb25faW5mb1s6Ml0gPT0gKDMsIDIpOgogICAgZXhlY18oIiIiZGVmIHJhaXNlX2Zyb20odmFsdWUsIGZyb21fdmFsdWUpOgogICAgaWYgZnJvbV92YWx1ZSBpcyBOb25lOgogICAgICAgIHJhaXNlIHZhbHVlCiAgICByYWlzZSB2YWx1ZSBmcm9tIGZyb21fdmFsdWUKIiIiKQplbGlmIHN5cy52ZXJzaW9uX2luZm9bOjJdID4gKDMsIDIpOgogICAgZXhlY18oIiIiZGVmIHJhaXNlX2Zyb20odmFsdWUsIGZyb21fdmFsdWUpOgogICAgcmFpc2UgdmFsdWUgZnJvbSBmcm9tX3ZhbHVlCiIiIikKZWxzZToKICAgIGRlZiByYWlzZV9mcm9tKHZhbHVlLCBmcm9tX3ZhbHVlKToKICAgICAgICByYWlzZSB2YWx1ZQoKCnByaW50XyA9IGdldGF0dHIobW92ZXMuYnVpbHRpbnMsICJwcmludCIsIE5vbmUpCmlmIHByaW50XyBpcyBOb25lOgogICAgZGVmIHByaW50XygqYXJncywgKiprd2FyZ3MpOgogICAgICAgICIiIlRoZSBuZXctc3R5bGUgcHJpbnQgZnVuY3Rpb24gZm9yIFB5dGhvbiAyLjQgYW5kIDIuNS4iIiIKICAgICAgICBmcCA9IGt3YXJncy5wb3AoImZpbGUiLCBzeXMuc3Rkb3V0KQogICAgICAgIGlmIGZwIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBkZWYgd3JpdGUoZGF0YSk6CiAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGRhdGEsIGJhc2VzdHJpbmcpOgogICAgICAgICAgICAgICAgZGF0YSA9IHN0cihkYXRhKQogICAgICAgICAgICAjIElmIHRoZSBmaWxlIGhhcyBhbiBlbmNvZGluZywgZW5jb2RlIHVuaWNvZGUgd2l0aCBpdC4KICAgICAgICAgICAgaWYgKGlzaW5zdGFuY2UoZnAsIGZpbGUpIGFuZAogICAgICAgICAgICAgICAgICAgIGlzaW5zdGFuY2UoZGF0YSwgdW5pY29kZSkgYW5kCiAgICAgICAgICAgICAgICAgICAgZnAuZW5jb2RpbmcgaXMgbm90IE5vbmUpOgogICAgICAgICAgICAgICAgZXJyb3JzID0gZ2V0YXR0cihmcCwgImVycm9ycyIsIE5vbmUpCiAgICAgICAgICAgICAgICBpZiBlcnJvcnMgaXMgTm9uZToKICAgICAgICAgICAgICAgICAgICBlcnJvcnMgPSAic3RyaWN0IgogICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEuZW5jb2RlKGZwLmVuY29kaW5nLCBlcnJvcnMpCiAgICAgICAgICAgIGZwLndyaXRlKGRhdGEpCiAgICAgICAgd2FudF91bmljb2RlID0gRmFsc2UKICAgICAgICBzZXAgPSBrd2FyZ3MucG9wKCJzZXAiLCBOb25lKQogICAgICAgIGlmIHNlcCBpcyBub3QgTm9uZToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShzZXAsIHVuaWNvZGUpOgogICAgICAgICAgICAgICAgd2FudF91bmljb2RlID0gVHJ1ZQogICAgICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKHNlcCwgc3RyKToKICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigic2VwIG11c3QgYmUgTm9uZSBvciBhIHN0cmluZyIpCiAgICAgICAgZW5kID0ga3dhcmdzLnBvcCgiZW5kIiwgTm9uZSkKICAgICAgICBpZiBlbmQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZW5kLCB1bmljb2RlKToKICAgICAgICAgICAgICAgIHdhbnRfdW5pY29kZSA9IFRydWUKICAgICAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZShlbmQsIHN0cik6CiAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoImVuZCBtdXN0IGJlIE5vbmUgb3IgYSBzdHJpbmciKQogICAgICAgIGlmIGt3YXJnczoKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJpbnZhbGlkIGtleXdvcmQgYXJndW1lbnRzIHRvIHByaW50KCkiKQogICAgICAgIGlmIG5vdCB3YW50X3VuaWNvZGU6CiAgICAgICAgICAgIGZvciBhcmcgaW4gYXJnczoKICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoYXJnLCB1bmljb2RlKToKICAgICAgICAgICAgICAgICAgICB3YW50X3VuaWNvZGUgPSBUcnVlCiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICBpZiB3YW50X3VuaWNvZGU6CiAgICAgICAgICAgIG5ld2xpbmUgPSB1bmljb2RlKCJcbiIpCiAgICAgICAgICAgIHNwYWNlID0gdW5pY29kZSgiICIpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbmV3bGluZSA9ICJcbiIKICAgICAgICAgICAgc3BhY2UgPSAiICIKICAgICAgICBpZiBzZXAgaXMgTm9uZToKICAgICAgICAgICAgc2VwID0gc3BhY2UKICAgICAgICBpZiBlbmQgaXMgTm9uZToKICAgICAgICAgICAgZW5kID0gbmV3bGluZQogICAgICAgIGZvciBpLCBhcmcgaW4gZW51bWVyYXRlKGFyZ3MpOgogICAgICAgICAgICBpZiBpOgogICAgICAgICAgICAgICAgd3JpdGUoc2VwKQogICAgICAgICAgICB3cml0ZShhcmcpCiAgICAgICAgd3JpdGUoZW5kKQppZiBzeXMudmVyc2lvbl9pbmZvWzoyXSA8ICgzLCAzKToKICAgIF9wcmludCA9IHByaW50XwoKICAgIGRlZiBwcmludF8oKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICBmcCA9IGt3YXJncy5nZXQoImZpbGUiLCBzeXMuc3Rkb3V0KQogICAgICAgIGZsdXNoID0ga3dhcmdzLnBvcCgiZmx1c2giLCBGYWxzZSkKICAgICAgICBfcHJpbnQoKmFyZ3MsICoqa3dhcmdzKQogICAgICAgIGlmIGZsdXNoIGFuZCBmcCBpcyBub3QgTm9uZToKICAgICAgICAgICAgZnAuZmx1c2goKQoKX2FkZF9kb2MocmVyYWlzZSwgIiIiUmVyYWlzZSBhbiBleGNlcHRpb24uIiIiKQoKaWYgc3lzLnZlcnNpb25faW5mb1swOjJdIDwgKDMsIDQpOgogICAgZGVmIHdyYXBzKHdyYXBwZWQsIGFzc2lnbmVkPWZ1bmN0b29scy5XUkFQUEVSX0FTU0lHTk1FTlRTLAogICAgICAgICAgICAgIHVwZGF0ZWQ9ZnVuY3Rvb2xzLldSQVBQRVJfVVBEQVRFUyk6CiAgICAgICAgZGVmIHdyYXBwZXIoZik6CiAgICAgICAgICAgIGYgPSBmdW5jdG9vbHMud3JhcHMod3JhcHBlZCwgYXNzaWduZWQsIHVwZGF0ZWQpKGYpCiAgICAgICAgICAgIGYuX193cmFwcGVkX18gPSB3cmFwcGVkCiAgICAgICAgICAgIHJldHVybiBmCiAgICAgICAgcmV0dXJuIHdyYXBwZXIKZWxzZToKICAgIHdyYXBzID0gZnVuY3Rvb2xzLndyYXBzCgoKZGVmIHdpdGhfbWV0YWNsYXNzKG1ldGEsICpiYXNlcyk6CiAgICAiIiJDcmVhdGUgYSBiYXNlIGNsYXNzIHdpdGggYSBtZXRhY2xhc3MuIiIiCiAgICAjIFRoaXMgcmVxdWlyZXMgYSBiaXQgb2YgZXhwbGFuYXRpb246IHRoZSBiYXNpYyBpZGVhIGlzIHRvIG1ha2UgYSBkdW1teQogICAgIyBtZXRhY2xhc3MgZm9yIG9uZSBsZXZlbCBvZiBjbGFzcyBpbnN0YW50aWF0aW9uIHRoYXQgcmVwbGFjZXMgaXRzZWxmIHdpdGgKICAgICMgdGhlIGFjdHVhbCBtZXRhY2xhc3MuCiAgICBjbGFzcyBtZXRhY2xhc3MobWV0YSk6CgogICAgICAgIGRlZiBfX25ld19fKGNscywgbmFtZSwgdGhpc19iYXNlcywgZCk6CiAgICAgICAgICAgIHJldHVybiBtZXRhKG5hbWUsIGJhc2VzLCBkKQogICAgcmV0dXJuIHR5cGUuX19uZXdfXyhtZXRhY2xhc3MsICd0ZW1wb3JhcnlfY2xhc3MnLCAoKSwge30pCgoKZGVmIGFkZF9tZXRhY2xhc3MobWV0YWNsYXNzKToKICAgICIiIkNsYXNzIGRlY29yYXRvciBmb3IgY3JlYXRpbmcgYSBjbGFzcyB3aXRoIGEgbWV0YWNsYXNzLiIiIgogICAgZGVmIHdyYXBwZXIoY2xzKToKICAgICAgICBvcmlnX3ZhcnMgPSBjbHMuX19kaWN0X18uY29weSgpCiAgICAgICAgc2xvdHMgPSBvcmlnX3ZhcnMuZ2V0KCdfX3Nsb3RzX18nKQogICAgICAgIGlmIHNsb3RzIGlzIG5vdCBOb25lOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHNsb3RzLCBzdHIpOgogICAgICAgICAgICAgICAgc2xvdHMgPSBbc2xvdHNdCiAgICAgICAgICAgIGZvciBzbG90c192YXIgaW4gc2xvdHM6CiAgICAgICAgICAgICAgICBvcmlnX3ZhcnMucG9wKHNsb3RzX3ZhcikKICAgICAgICBvcmlnX3ZhcnMucG9wKCdfX2RpY3RfXycsIE5vbmUpCiAgICAgICAgb3JpZ192YXJzLnBvcCgnX193ZWFrcmVmX18nLCBOb25lKQogICAgICAgIHJldHVybiBtZXRhY2xhc3MoY2xzLl9fbmFtZV9fLCBjbHMuX19iYXNlc19fLCBvcmlnX3ZhcnMpCiAgICByZXR1cm4gd3JhcHBlcgoKCmRlZiBweXRob25fMl91bmljb2RlX2NvbXBhdGlibGUoa2xhc3MpOgogICAgIiIiCiAgICBBIGRlY29yYXRvciB0aGF0IGRlZmluZXMgX191bmljb2RlX18gYW5kIF9fc3RyX18gbWV0aG9kcyB1bmRlciBQeXRob24gMi4KICAgIFVuZGVyIFB5dGhvbiAzIGl0IGRvZXMgbm90aGluZy4KCiAgICBUbyBzdXBwb3J0IFB5dGhvbiAyIGFuZCAzIHdpdGggYSBzaW5nbGUgY29kZSBiYXNlLCBkZWZpbmUgYSBfX3N0cl9fIG1ldGhvZAogICAgcmV0dXJuaW5nIHRleHQgYW5kIGFwcGx5IHRoaXMgZGVjb3JhdG9yIHRvIHRoZSBjbGFzcy4KICAgICIiIgogICAgaWYgUFkyOgogICAgICAgIGlmICdfX3N0cl9fJyBub3QgaW4ga2xhc3MuX19kaWN0X186CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkBweXRob25fMl91bmljb2RlX2NvbXBhdGlibGUgY2Fubm90IGJlIGFwcGxpZWQgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0byAlcyBiZWNhdXNlIGl0IGRvZXNuJ3QgZGVmaW5lIF9fc3RyX18oKS4iICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbGFzcy5fX25hbWVfXykKICAgICAgICBrbGFzcy5fX3VuaWNvZGVfXyA9IGtsYXNzLl9fc3RyX18KICAgICAgICBrbGFzcy5fX3N0cl9fID0gbGFtYmRhIHNlbGY6IHNlbGYuX191bmljb2RlX18oKS5lbmNvZGUoJ3V0Zi04JykKICAgIHJldHVybiBrbGFzcwoKCiMgQ29tcGxldGUgdGhlIG1vdmVzIGltcGxlbWVudGF0aW9uLgojIFRoaXMgY29kZSBpcyBhdCB0aGUgZW5kIG9mIHRoaXMgbW9kdWxlIHRvIHNwZWVkIHVwIG1vZHVsZSBsb2FkaW5nLgojIFR1cm4gdGhpcyBtb2R1bGUgaW50byBhIHBhY2thZ2UuCl9fcGF0aF9fID0gW10gICMgcmVxdWlyZWQgZm9yIFBFUCAzMDIgYW5kIFBFUCA0NTEKX19wYWNrYWdlX18gPSBfX25hbWVfXyAgIyBzZWUgUEVQIDM2NiBAUmVzZXJ2ZWRBc3NpZ25tZW50CmlmIGdsb2JhbHMoKS5nZXQoIl9fc3BlY19fIikgaXMgbm90IE5vbmU6CiAgICBfX3NwZWNfXy5zdWJtb2R1bGVfc2VhcmNoX2xvY2F0aW9ucyA9IFtdICAjIFBFUCA0NTEgQFVuZGVmaW5lZFZhcmlhYmxlCiMgUmVtb3ZlIG90aGVyIHNpeCBtZXRhIHBhdGggaW1wb3J0ZXJzLCBzaW5jZSB0aGV5IGNhdXNlIHByb2JsZW1zLiBUaGlzIGNhbgojIGhhcHBlbiBpZiBzaXggaXMgcmVtb3ZlZCBmcm9tIHN5cy5tb2R1bGVzIGFuZCB0aGVuIHJlbG9hZGVkLiAoU2V0dXB0b29scyBkb2VzCiMgdGhpcyBmb3Igc29tZSByZWFzb24uKQppZiBzeXMubWV0YV9wYXRoOgogICAgZm9yIGksIGltcG9ydGVyIGluIGVudW1lcmF0ZShzeXMubWV0YV9wYXRoKToKICAgICAgICAjIEhlcmUncyBzb21lIHJlYWwgbmFzdGluZXNzOiBBbm90aGVyICJpbnN0YW5jZSIgb2YgdGhlIHNpeCBtb2R1bGUgbWlnaHQKICAgICAgICAjIGJlIGZsb2F0aW5nIGFyb3VuZC4gVGhlcmVmb3JlLCB3ZSBjYW4ndCB1c2UgaXNpbnN0YW5jZSgpIHRvIGNoZWNrIGZvcgogICAgICAgICMgdGhlIHNpeCBtZXRhIHBhdGggaW1wb3J0ZXIsIHNpbmNlIHRoZSBvdGhlciBzaXggaW5zdGFuY2Ugd2lsbCBoYXZlCiAgICAgICAgIyBpbnNlcnRlZCBhbiBpbXBvcnRlciB3aXRoIGRpZmZlcmVudCBjbGFzcy4KICAgICAgICBpZiAodHlwZShpbXBvcnRlcikuX19uYW1lX18gPT0gIl9TaXhNZXRhUGF0aEltcG9ydGVyIiBhbmQKICAgICAgICAgICAgICAgIGltcG9ydGVyLm5hbWUgPT0gX19uYW1lX18pOgogICAgICAgICAgICBkZWwgc3lzLm1ldGFfcGF0aFtpXQogICAgICAgICAgICBicmVhawogICAgZGVsIGksIGltcG9ydGVyCiMgRmluYWxseSwgYWRkIHRoZSBpbXBvcnRlciB0byB0aGUgbWV0YSBwYXRoIGltcG9ydCBob29rLgpzeXMubWV0YV9wYXRoLmFwcGVuZChfaW1wb3J0ZXIpClBLAwQUAAAAAAAAACEA853ywcIJAADCCQAARQAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9wa2dfcmVzb3VyY2VzL2V4dGVybi9fX2luaXRfXy5weWltcG9ydCBzeXMKCgpjbGFzcyBWZW5kb3JJbXBvcnRlcjoKICAgICIiIgogICAgQSBQRVAgMzAyIG1ldGEgcGF0aCBpbXBvcnRlciBmb3IgZmluZGluZyBvcHRpb25hbGx5LXZlbmRvcmVkCiAgICBvciBvdGhlcndpc2UgbmF0dXJhbGx5LWluc3RhbGxlZCBwYWNrYWdlcyBmcm9tIHJvb3RfbmFtZS4KICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCByb290X25hbWUsIHZlbmRvcmVkX25hbWVzPSgpLCB2ZW5kb3JfcGtnPU5vbmUpOgogICAgICAgIHNlbGYucm9vdF9uYW1lID0gcm9vdF9uYW1lCiAgICAgICAgc2VsZi52ZW5kb3JlZF9uYW1lcyA9IHNldCh2ZW5kb3JlZF9uYW1lcykKICAgICAgICBzZWxmLnZlbmRvcl9wa2cgPSB2ZW5kb3JfcGtnIG9yIHJvb3RfbmFtZS5yZXBsYWNlKCdleHRlcm4nLCAnX3ZlbmRvcicpCgogICAgQHByb3BlcnR5CiAgICBkZWYgc2VhcmNoX3BhdGgoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgU2VhcmNoIGZpcnN0IHRoZSB2ZW5kb3IgcGFja2FnZSB0aGVuIGFzIGEgbmF0dXJhbCBwYWNrYWdlLgogICAgICAgICIiIgogICAgICAgIHlpZWxkIHNlbGYudmVuZG9yX3BrZyArICcuJwogICAgICAgIHlpZWxkICcnCgogICAgZGVmIGZpbmRfbW9kdWxlKHNlbGYsIGZ1bGxuYW1lLCBwYXRoPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBzZWxmIHdoZW4gZnVsbG5hbWUgc3RhcnRzIHdpdGggcm9vdF9uYW1lIGFuZCB0aGUKICAgICAgICB0YXJnZXQgbW9kdWxlIGlzIG9uZSB2ZW5kb3JlZCB0aHJvdWdoIHRoaXMgaW1wb3J0ZXIuCiAgICAgICAgIiIiCiAgICAgICAgcm9vdCwgYmFzZSwgdGFyZ2V0ID0gZnVsbG5hbWUucGFydGl0aW9uKHNlbGYucm9vdF9uYW1lICsgJy4nKQogICAgICAgIGlmIHJvb3Q6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIGlmIG5vdCBhbnkobWFwKHRhcmdldC5zdGFydHN3aXRoLCBzZWxmLnZlbmRvcmVkX25hbWVzKSk6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIGxvYWRfbW9kdWxlKHNlbGYsIGZ1bGxuYW1lKToKICAgICAgICAiIiIKICAgICAgICBJdGVyYXRlIG92ZXIgdGhlIHNlYXJjaCBwYXRoIHRvIGxvY2F0ZSBhbmQgbG9hZCBmdWxsbmFtZS4KICAgICAgICAiIiIKICAgICAgICByb290LCBiYXNlLCB0YXJnZXQgPSBmdWxsbmFtZS5wYXJ0aXRpb24oc2VsZi5yb290X25hbWUgKyAnLicpCiAgICAgICAgZm9yIHByZWZpeCBpbiBzZWxmLnNlYXJjaF9wYXRoOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBleHRhbnQgPSBwcmVmaXggKyB0YXJnZXQKICAgICAgICAgICAgICAgIF9faW1wb3J0X18oZXh0YW50KQogICAgICAgICAgICAgICAgbW9kID0gc3lzLm1vZHVsZXNbZXh0YW50XQogICAgICAgICAgICAgICAgc3lzLm1vZHVsZXNbZnVsbG5hbWVdID0gbW9kCiAgICAgICAgICAgICAgICAjIG15c3RlcmlvdXMgaGFjazoKICAgICAgICAgICAgICAgICMgUmVtb3ZlIHRoZSByZWZlcmVuY2UgdG8gdGhlIGV4dGFudCBwYWNrYWdlL21vZHVsZQogICAgICAgICAgICAgICAgIyBvbiBsYXRlciBQeXRob24gdmVyc2lvbnMgdG8gY2F1c2UgcmVsYXRpdmUgaW1wb3J0cwogICAgICAgICAgICAgICAgIyBpbiB0aGUgdmVuZG9yIHBhY2thZ2UgdG8gcmVzb2x2ZSB0aGUgc2FtZSBtb2R1bGVzCiAgICAgICAgICAgICAgICAjIGFzIHRob3NlIGdvaW5nIHRocm91Z2ggdGhpcyBpbXBvcnRlci4KICAgICAgICAgICAgICAgIGlmIHByZWZpeCBhbmQgc3lzLnZlcnNpb25faW5mbyA+ICgzLCAzKToKICAgICAgICAgICAgICAgICAgICBkZWwgc3lzLm1vZHVsZXNbZXh0YW50XQogICAgICAgICAgICAgICAgcmV0dXJuIG1vZAogICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IoCiAgICAgICAgICAgICAgICAiVGhlICd7dGFyZ2V0fScgcGFja2FnZSBpcyByZXF1aXJlZDsgIgogICAgICAgICAgICAgICAgIm5vcm1hbGx5IHRoaXMgaXMgYnVuZGxlZCB3aXRoIHRoaXMgcGFja2FnZSBzbyBpZiB5b3UgZ2V0ICIKICAgICAgICAgICAgICAgICJ0aGlzIHdhcm5pbmcsIGNvbnN1bHQgdGhlIHBhY2thZ2VyIG9mIHlvdXIgIgogICAgICAgICAgICAgICAgImRpc3RyaWJ1dGlvbi4iLmZvcm1hdCgqKmxvY2FscygpKQogICAgICAgICAgICApCgogICAgZGVmIGluc3RhbGwoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgSW5zdGFsbCB0aGlzIGltcG9ydGVyIGludG8gc3lzLm1ldGFfcGF0aCBpZiBub3QgYWxyZWFkeSBwcmVzZW50LgogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYgbm90IGluIHN5cy5tZXRhX3BhdGg6CiAgICAgICAgICAgIHN5cy5tZXRhX3BhdGguYXBwZW5kKHNlbGYpCgoKbmFtZXMgPSAncGFja2FnaW5nJywgJ3B5cGFyc2luZycsICdzaXgnLCAnYXBwZGlycycKVmVuZG9ySW1wb3J0ZXIoX19uYW1lX18sIG5hbWVzKS5pbnN0YWxsKCkKUEsDBBQAAAAAAAAAIQCLwJJGLgIAAC4CAABAAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3BrZ19yZXNvdXJjZXMvcHkzMWNvbXBhdC5weWltcG9ydCBvcwppbXBvcnQgZXJybm8KaW1wb3J0IHN5cwoKZnJvbSAuZXh0ZXJuIGltcG9ydCBzaXgKCgpkZWYgX21ha2VkaXJzXzMxKHBhdGgsIGV4aXN0X29rPUZhbHNlKToKICAgIHRyeToKICAgICAgICBvcy5tYWtlZGlycyhwYXRoKQogICAgZXhjZXB0IE9TRXJyb3IgYXMgZXhjOgogICAgICAgIGlmIG5vdCBleGlzdF9vayBvciBleGMuZXJybm8gIT0gZXJybm8uRUVYSVNUOgogICAgICAgICAgICByYWlzZQoKCiMgcmVseSBvbiBjb21wYXRpYmlsaXR5IGJlaGF2aW9yIHVudGlsIG1vZGUgY29uc2lkZXJhdGlvbnMKIyAgYW5kIGV4aXN0c19vayBjb25zaWRlcmF0aW9ucyBhcmUgZGlzZW50YW5nbGVkLgojIFNlZSBodHRwczovL2dpdGh1Yi5jb20vcHlwYS9zZXR1cHRvb2xzL3B1bGwvMTA4MyNpc3N1ZWNvbW1lbnQtMzE1MTY4NjYzCm5lZWRzX21ha2VkaXJzID0gKAogICAgc2l4LlBZMiBvcgogICAgKDMsIDQpIDw9IHN5cy52ZXJzaW9uX2luZm8gPCAoMywgNCwgMSkKKQptYWtlZGlycyA9IF9tYWtlZGlyc18zMSBpZiBuZWVkc19tYWtlZGlycyBlbHNlIG9zLm1ha2VkaXJzClBLAwQUAAAAAAAAACEAUNerBzYEAAA2BAAASAAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzLTQ0LjAuMC5kaXN0LWluZm8vTElDRU5TRUNvcHlyaWdodCAoQykgMjAxNiBKYXNvbiBSIENvb21icyA8amFyYWNvQGphcmFjby5jb20+CgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCnRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCnRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvCnNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbApjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFClNPRlRXQVJFLgpQSwMEFAAAAAAAAAAhADGQ3qB4DgAAeA4AAEkAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy00NC4wLjAuZGlzdC1pbmZvL01FVEFEQVRBTWV0YWRhdGEtVmVyc2lvbjogMi4xCk5hbWU6IHNldHVwdG9vbHMKVmVyc2lvbjogNDQuMC4wClN1bW1hcnk6IEVhc2lseSBkb3dubG9hZCwgYnVpbGQsIGluc3RhbGwsIHVwZ3JhZGUsIGFuZCB1bmluc3RhbGwgUHl0aG9uIHBhY2thZ2VzCkhvbWUtcGFnZTogaHR0cHM6Ly9naXRodWIuY29tL3B5cGEvc2V0dXB0b29scwpBdXRob3I6IFB5dGhvbiBQYWNrYWdpbmcgQXV0aG9yaXR5CkF1dGhvci1lbWFpbDogZGlzdHV0aWxzLXNpZ0BweXRob24ub3JnCkxpY2Vuc2U6IFVOS05PV04KUHJvamVjdC1VUkw6IERvY3VtZW50YXRpb24sIGh0dHBzOi8vc2V0dXB0b29scy5yZWFkdGhlZG9jcy5pby8KS2V5d29yZHM6IENQQU4gUHlQSSBkaXN0dXRpbHMgZWdncyBwYWNrYWdlIG1hbmFnZW1lbnQKUGxhdGZvcm06IFVOS05PV04KQ2xhc3NpZmllcjogRGV2ZWxvcG1lbnQgU3RhdHVzIDo6IDUgLSBQcm9kdWN0aW9uL1N0YWJsZQpDbGFzc2lmaWVyOiBJbnRlbmRlZCBBdWRpZW5jZSA6OiBEZXZlbG9wZXJzCkNsYXNzaWZpZXI6IExpY2Vuc2UgOjogT1NJIEFwcHJvdmVkIDo6IE1JVCBMaWNlbnNlCkNsYXNzaWZpZXI6IE9wZXJhdGluZyBTeXN0ZW0gOjogT1MgSW5kZXBlbmRlbnQKQ2xhc3NpZmllcjogUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDIKQ2xhc3NpZmllcjogUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDIuNwpDbGFzc2lmaWVyOiBQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMwpDbGFzc2lmaWVyOiBQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMy41CkNsYXNzaWZpZXI6IFByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzLjYKQ2xhc3NpZmllcjogUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMuNwpDbGFzc2lmaWVyOiBQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMy44CkNsYXNzaWZpZXI6IFRvcGljIDo6IFNvZnR3YXJlIERldmVsb3BtZW50IDo6IExpYnJhcmllcyA6OiBQeXRob24gTW9kdWxlcwpDbGFzc2lmaWVyOiBUb3BpYyA6OiBTeXN0ZW0gOjogQXJjaGl2aW5nIDo6IFBhY2thZ2luZwpDbGFzc2lmaWVyOiBUb3BpYyA6OiBTeXN0ZW0gOjogU3lzdGVtcyBBZG1pbmlzdHJhdGlvbgpDbGFzc2lmaWVyOiBUb3BpYyA6OiBVdGlsaXRpZXMKUmVxdWlyZXMtUHl0aG9uOiAhPTMuMC4qLCE9My4xLiosIT0zLjIuKiwhPTMuMy4qLCE9My40LiosPj0yLjcKRGVzY3JpcHRpb24tQ29udGVudC1UeXBlOiB0ZXh0L3gtcnN0OyBjaGFyc2V0PVVURi04ClByb3ZpZGVzLUV4dHJhOiBjZXJ0cwpSZXF1aXJlcy1EaXN0OiBjZXJ0aWZpICg9PTIwMTYuOS4yNikgOyBleHRyYSA9PSAnY2VydHMnClByb3ZpZGVzLUV4dHJhOiBzc2wKUmVxdWlyZXMtRGlzdDogd2luY2VydHN0b3JlICg9PTAuMikgOyAoc3lzX3BsYXRmb3JtID09ICJ3aW4zMiIpIGFuZCBleHRyYSA9PSAnc3NsJwoKLi4gaW1hZ2U6OiBodHRwczovL2ltZy5zaGllbGRzLmlvL3B5cGkvdi9zZXR1cHRvb2xzLnN2ZwogICA6dGFyZ2V0OiBodHRwczovL3B5cGkub3JnL3Byb2plY3Qvc2V0dXB0b29scwoKLi4gaW1hZ2U6OiBodHRwczovL2ltZy5zaGllbGRzLmlvL3JlYWR0aGVkb2NzL3NldHVwdG9vbHMvbGF0ZXN0LnN2ZwogICAgOnRhcmdldDogaHR0cHM6Ly9zZXR1cHRvb2xzLnJlYWR0aGVkb2NzLmlvCgouLiBpbWFnZTo6IGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vdHJhdmlzL3B5cGEvc2V0dXB0b29scy9tYXN0ZXIuc3ZnP2xhYmVsPUxpbnV4JTIwQ0kmbG9nbz10cmF2aXMmbG9nb0NvbG9yPXdoaXRlCiAgIDp0YXJnZXQ6IGh0dHBzOi8vdHJhdmlzLWNpLm9yZy9weXBhL3NldHVwdG9vbHMKCi4uIGltYWdlOjogaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9hcHB2ZXlvci9jaS9weXBhL3NldHVwdG9vbHMvbWFzdGVyLnN2Zz9sYWJlbD1XaW5kb3dzJTIwQ0kmbG9nbz1hcHB2ZXlvciZsb2dvQ29sb3I9d2hpdGUKICAgOnRhcmdldDogaHR0cHM6Ly9jaS5hcHB2ZXlvci5jb20vcHJvamVjdC9weXBhL3NldHVwdG9vbHMvYnJhbmNoL21hc3RlcgoKLi4gaW1hZ2U6OiBodHRwczovL2ltZy5zaGllbGRzLmlvL2NvZGVjb3YvYy9naXRodWIvcHlwYS9zZXR1cHRvb2xzL21hc3Rlci5zdmc/bG9nbz1jb2RlY292JmxvZ29Db2xvcj13aGl0ZQogICA6dGFyZ2V0OiBodHRwczovL2NvZGVjb3YuaW8vZ2gvcHlwYS9zZXR1cHRvb2xzCgouLiBpbWFnZTo6IGh0dHBzOi8vdGlkZWxpZnQuY29tL2JhZGdlcy9naXRodWIvcHlwYS9zZXR1cHRvb2xzP3N0eWxlPWZsYXQKICAgOnRhcmdldDogaHR0cHM6Ly90aWRlbGlmdC5jb20vc3Vic2NyaXB0aW9uL3BrZy9weXBpLXNldHVwdG9vbHM/dXRtX3NvdXJjZT1weXBpLXNldHVwdG9vbHMmdXRtX21lZGl1bT1yZWFkbWUKCi4uIGltYWdlOjogaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9weXBpL3B5dmVyc2lvbnMvc2V0dXB0b29scy5zdmcKClNlZSB0aGUgYEluc3RhbGxhdGlvbiBJbnN0cnVjdGlvbnMKPGh0dHBzOi8vcGFja2FnaW5nLnB5dGhvbi5vcmcvaW5zdGFsbGluZy8+YF8gaW4gdGhlIFB5dGhvbiBQYWNrYWdpbmcKVXNlcidzIEd1aWRlIGZvciBpbnN0cnVjdGlvbnMgb24gaW5zdGFsbGluZywgdXBncmFkaW5nLCBhbmQgdW5pbnN0YWxsaW5nClNldHVwdG9vbHMuCgpRdWVzdGlvbnMgYW5kIGNvbW1lbnRzIHNob3VsZCBiZSBkaXJlY3RlZCB0byB0aGUgYGRpc3R1dGlscy1zaWcKbWFpbGluZyBsaXN0IDxodHRwOi8vbWFpbC5weXRob24ub3JnL3BpcGVybWFpbC9kaXN0dXRpbHMtc2lnLz5gXy4KQnVnIHJlcG9ydHMgYW5kIGVzcGVjaWFsbHkgdGVzdGVkIHBhdGNoZXMgbWF5IGJlCnN1Ym1pdHRlZCBkaXJlY3RseSB0byB0aGUgYGJ1ZyB0cmFja2VyCjxodHRwczovL2dpdGh1Yi5jb20vcHlwYS9zZXR1cHRvb2xzL2lzc3Vlcz5gXy4KClRvIHJlcG9ydCBhIHNlY3VyaXR5IHZ1bG5lcmFiaWxpdHksIHBsZWFzZSB1c2UgdGhlCmBUaWRlbGlmdCBzZWN1cml0eSBjb250YWN0IDxodHRwczovL3RpZGVsaWZ0LmNvbS9zZWN1cml0eT5gXy4KVGlkZWxpZnQgd2lsbCBjb29yZGluYXRlIHRoZSBmaXggYW5kIGRpc2Nsb3N1cmUuCgoKRm9yIEVudGVycHJpc2UKPT09PT09PT09PT09PT0KCkF2YWlsYWJsZSBhcyBwYXJ0IG9mIHRoZSBUaWRlbGlmdCBTdWJzY3JpcHRpb24uCgpTZXR1cHRvb2xzIGFuZCB0aGUgbWFpbnRhaW5lcnMgb2YgdGhvdXNhbmRzIG9mIG90aGVyIHBhY2thZ2VzIGFyZSB3b3JraW5nIHdpdGggVGlkZWxpZnQgdG8gZGVsaXZlciBvbmUgZW50ZXJwcmlzZSBzdWJzY3JpcHRpb24gdGhhdCBjb3ZlcnMgYWxsIG9mIHRoZSBvcGVuIHNvdXJjZSB5b3UgdXNlLgoKYExlYXJuIG1vcmUgPGh0dHBzOi8vdGlkZWxpZnQuY29tL3N1YnNjcmlwdGlvbi9wa2cvcHlwaS1zZXR1cHRvb2xzP3V0bV9zb3VyY2U9cHlwaS1zZXR1cHRvb2xzJnV0bV9tZWRpdW09cmVmZXJyYWwmdXRtX2NhbXBhaWduPWdpdGh1Yj5gXy4KCkNvZGUgb2YgQ29uZHVjdAo9PT09PT09PT09PT09PT0KCkV2ZXJ5b25lIGludGVyYWN0aW5nIGluIHRoZSBzZXR1cHRvb2xzIHByb2plY3QncyBjb2RlYmFzZXMsIGlzc3VlIHRyYWNrZXJzLApjaGF0IHJvb21zLCBhbmQgbWFpbGluZyBsaXN0cyBpcyBleHBlY3RlZCB0byBmb2xsb3cgdGhlCmBQeVBBIENvZGUgb2YgQ29uZHVjdCA8aHR0cHM6Ly93d3cucHlwYS5pby9lbi9sYXRlc3QvY29kZS1vZi1jb25kdWN0Lz5gXy4KCgpQSwMEFAAAAAAAAAAhAHPPiYUoIwAAKCMAAEcAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy00NC4wLjAuZGlzdC1pbmZvL1JFQ09SRGVhc3lfaW5zdGFsbC5weSxzaGEyNTY9TURDOXZ0NUF4RHNYWDVxY0tsQnoyVG5XNlRwdXZfQW9ibmZoQ0o5WDNQTSwxMjYKcGtnX3Jlc291cmNlcy9fX2luaXRfXy5weSxzaGEyNTY9MElzc3hYUG5hREtwWVpScmE4SW1lMEpHNGh3b3NRbGpJdEdEMGJuSWtHaywxMDgzNDkKcGtnX3Jlc291cmNlcy9weTMxY29tcGF0LnB5LHNoYTI1Nj0tV1EwZTRjM1JHX2FjZGh3QzNnTGlYaFBfbGc0RzVxN1hZa1prUWcwZ3hVLDU1OApwa2dfcmVzb3VyY2VzL192ZW5kb3IvX19pbml0X18ucHksc2hhMjU2PTQ3REVRcGo4SEJTYS1fVEltVy01SkNldVFlUmttNU5NcEpXWkczaFN1RlUsMApwa2dfcmVzb3VyY2VzL192ZW5kb3IvYXBwZGlycy5weSxzaGEyNTY9TWlldlVFdXYzbF9tUUlTSDVTRjBzaERrX0JOaEhIellpQVByVDNJVE40SSwyNDcwMQpwa2dfcmVzb3VyY2VzL192ZW5kb3IvcHlwYXJzaW5nLnB5LHNoYTI1Nj10bXJwLWx1LXFPMWk3NVp6SU41QTEybktSUkQxQ200VnBrLTVMUjlyaW1zLDIzMjA1NQpwa2dfcmVzb3VyY2VzL192ZW5kb3Ivc2l4LnB5LHNoYTI1Nj1BNmhkSlpWakkzdF9nZWViWjlCelV2d1JySVhvMGxmd3pRbE0yTGNLeWFzLDMwMDk4CnBrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvX19hYm91dF9fLnB5LHNoYTI1Nj16a2NDUFROXzZUY0xXME5ybGcwMTc2LVIxUVFfV1ZQVG04c3oxUjQtSGpNLDcyMApwa2dfcmVzb3VyY2VzL192ZW5kb3IvcGFja2FnaW5nL19faW5pdF9fLnB5LHNoYTI1Nj1fdk5hYzVUcnp3c3J6Yk9GSWJGLTVjSHFjX1kyYVBUMkQ3enJJUjA2Qk9vLDUxMwpwa2dfcmVzb3VyY2VzL192ZW5kb3IvcGFja2FnaW5nL19jb21wYXQucHksc2hhMjU2PVZpX0EwckFRZUhiVS1hOVgwdHQxeVFtOVJxa2dRYkRTeHpSdzhXbFU5a0EsODYwCnBrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvX3N0cnVjdHVyZXMucHksc2hhMjU2PVJJbUVDSjRjX3dUbGFUWVl3WllMSEVpZWJETWFBSm1LMW9QQVJodzFUNW8sMTQxNgpwa2dfcmVzb3VyY2VzL192ZW5kb3IvcGFja2FnaW5nL21hcmtlcnMucHksc2hhMjU2PXVFY0JCdEd2enFsdGduQXJxYjljNFJyY0luWGV6RExvczE0emJCSGhXSm8sODI0OApwa2dfcmVzb3VyY2VzL192ZW5kb3IvcGFja2FnaW5nL3JlcXVpcmVtZW50cy5weSxzaGEyNTY9U2lrTDJVeW5ic1QwcXRZOWx0cW5nbmRoYV9zZm8wdzZYR0ZoQWhvU29hUSw0MzU1CnBrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvc3BlY2lmaWVycy5weSxzaGEyNTY9U0FNUmVyek8zZksySWtGWkNhWmt1d1phTF9FR3FITk96NHBuaTR2aG5OMCwyODAyNQpwa2dfcmVzb3VyY2VzL192ZW5kb3IvcGFja2FnaW5nL3V0aWxzLnB5LHNoYTI1Nj0zbTZXdlBtNk5OeEU4cmtUR21uMHI3NUJfR1pTR2c3aWthZnhIc0JOMVdBLDQyMQpwa2dfcmVzb3VyY2VzL192ZW5kb3IvcGFja2FnaW5nL3ZlcnNpb24ucHksc2hhMjU2PU93R254WWZyMmdoTnpZeDU5cVdJQmtySzNTbkI2bi1aZmQxWGFMcG5uTTAsMTE1NTYKcGtnX3Jlc291cmNlcy9leHRlcm4vX19pbml0X18ucHksc2hhMjU2PWNIaUVmSHVMbW02cnM1VmVfenRCZk1JN0xyMzF2c3MtRDR3a3FGNXh6bEksMjQ5OApzZXR1cHRvb2xzL19faW5pdF9fLnB5LHNoYTI1Nj1XQnBDY24ybHZkY2tvdGFiZWFlMVRUWW9uUE9jZ0NJRjNyYUQyelJXekJjLDcyODMKc2V0dXB0b29scy9fZGVwcmVjYXRpb25fd2FybmluZy5weSxzaGEyNTY9alU5LWR0ZnY2Y0ttdFFKT1hOOG5QMW1tN2dPTnc1a0tFdGlQdGJ3blp5SSwyMTgKc2V0dXB0b29scy9faW1wLnB5LHNoYTI1Nj1qbG9zbE9reHJUS2JvYmdlbWZQOTRZSUkwbmhxaUp6RTFiUm1DVFoxYTVJLDIyMjMKc2V0dXB0b29scy9hcmNoaXZlX3V0aWwucHksc2hhMjU2PWt3OEliX2xLakNjblBLTmJTN2g4SHp0UlZLMGQ1UmFjVTNyX0tSZFZubU0sNjU5MgpzZXR1cHRvb2xzL2J1aWxkX21ldGEucHksc2hhMjU2PS05Tm1qOVlkYlc0elgzVHNzUEpaaHNFTnJUYTRmdzNrODZKbTFjZEtNaWssOTU5NwpzZXR1cHRvb2xzL2NsaS0zMi5leGUsc2hhMjU2PWRmRXVvdk1ObkEySExhM2pSZk1QVmk1dGs0UjdhbENicFR2dXh0Q3l3MFksNjU1MzYKc2V0dXB0b29scy9jbGktNjQuZXhlLHNoYTI1Nj1LTEFCdTVweXJub2tKQ3Y2c2tqWFo2R3NYZXlZSEdjcU9VVDNvSEkzWHBvLDc0NzUyCnNldHVwdG9vbHMvY2xpLmV4ZSxzaGEyNTY9ZGZFdW92TU5uQTJITGEzalJmTVBWaTV0azRSN2FsQ2JwVHZ1eHRDeXcwWSw2NTUzNgpzZXR1cHRvb2xzL2NvbmZpZy5weSxzaGEyNTY9NlNCMk9ZM3Fjb29PSm1HX3JzS19zMHBLQnNvckJsRHBmTUpVeXpqUUlHaywyMDU3NQpzZXR1cHRvb2xzL2RlcF91dGlsLnB5LHNoYTI1Nj1mZ2l4dkMxUjdzSDNyMTNrdHlmN04wRkFMb3FFWEwxY0Jhcm1OcFNFb1dnLDkzNQpzZXR1cHRvb2xzL2RlcGVuZHMucHksc2hhMjU2PXF0MlJXbGxBclJ2aG5tOGx4c3lScGN0aEVaWXA0R0hRZ1JFbDFxMExrRncsNTUxNwpzZXR1cHRvb2xzL2Rpc3QucHksc2hhMjU2PWh2NUlUZlBqUWJrOGVDTUtXS1JzVlVIUXZ3Vmc0ZWNuQnRySXlrdFUtUUUsNDk4NTcKc2V0dXB0b29scy9lcnJvcnMucHksc2hhMjU2PU1WT2N2MzgxSE5TYWpEZ0VVV3pPUTRKNkI1QkhDQk1TakhmYVdjRXdBMW8sNTI0CnNldHVwdG9vbHMvZXh0ZW5zaW9uLnB5LHNoYTI1Nj11YzZuSEktTXh3bU5DTlBiVWlCbnliU3lxaHBKcWpiaHZPUS1lbWR2dF9FLDE3MjkKc2V0dXB0b29scy9nbG9iLnB5LHNoYTI1Nj1vNzVjSHJPeFlzdm44NTR0aFN4RTB4OWs4SnJLRHVoUF9yUlhsVkIwMFE0LDUwODQKc2V0dXB0b29scy9ndWktMzIuZXhlLHNoYTI1Nj1YQnIwYkhNQTZIcHoyczlzOUJ6amwtUHdYZmE5bkg0aWUwckZuNFYya1dBLDY1NTM2CnNldHVwdG9vbHMvZ3VpLTY0LmV4ZSxzaGEyNTY9YVlLTWhYMUlKTG40VUxIZ1dYMHNFMHlSRVV0NkIzVEVIZl9qT3c2eU55RSw3NTI2NApzZXR1cHRvb2xzL2d1aS5leGUsc2hhMjU2PVhCcjBiSE1BNkhwejJzOXM5QnpqbC1Qd1hmYTluSDRpZTByRm40VjJrV0EsNjU1MzYKc2V0dXB0b29scy9pbnN0YWxsZXIucHksc2hhMjU2PVRDRlJvblJvMDFJNzl6by11Y2YzWW1oajhUZW5QbG1oTWlqTjkxNmFhSnMsNTMzNwpzZXR1cHRvb2xzL2xhdW5jaC5weSxzaGEyNTY9c2Q3ZWp3aEJvY0NEeF93RzlySXMwT2FaOEh0bW1GVThaQzZJUl9TMEx2Zyw3ODcKc2V0dXB0b29scy9saWIydG8zX2V4LnB5LHNoYTI1Nj10NWUxMmhiUjJwaTlWNGV6V0RUQjRKTS1BSVNVbkdPa21jbllIZWszeGpnLDIwMTMKc2V0dXB0b29scy9tb25rZXkucHksc2hhMjU2PUZHYzlmZmZoN2dBeE1MRm1KczJEV19PWVdwQmprZGJOUzJuMTRVQUs0TkEsNTI2NApzZXR1cHRvb2xzL21zdmMucHksc2hhMjU2PThiYUo2YVlnQ0E0VFJkV1FRaTE4NXFCOWRuVThGYVA0d2dwYm1kN1ZPRHMsNDY3NTEKc2V0dXB0b29scy9uYW1lc3BhY2VzLnB5LHNoYTI1Nj1GME5yYnY4S0NUMk9yTzdyd2EwM29tNE40R1pLQWxuY2UtcnItY2dEUWE4LDMxOTkKc2V0dXB0b29scy9wYWNrYWdlX2luZGV4LnB5LHNoYTI1Nj02cGItQjFQT3RIeUx5Y0Fia0RFVGs0Zk8tUXY4X3NZLXJqVFhoVU9vaDZrLDQwNjA1CnNldHVwdG9vbHMvcHkyN2NvbXBhdC5weSxzaGEyNTY9dHZtZXIwVG4td2tfSnVtbUNrb00yMlVJanBqTC1BUTh1VWlPYXFUczhzSSwxNDk2CnNldHVwdG9vbHMvcHkzMWNvbXBhdC5weSxzaGEyNTY9aDJydFpnaE9md29HWWQ4c1EwLWF1YUtpRjNUY0wzcVgwYlgzVmVzc3FjRSw4MzgKc2V0dXB0b29scy9weTMzY29tcGF0LnB5LHNoYTI1Nj1TTUY5Wjh3bkdpY1RPa1UxdVJOd1pfa3o1Wl9iajI5UFVCYnFkcWVlTnNjLDEzMzAKc2V0dXB0b29scy9weTM0Y29tcGF0LnB5LHNoYTI1Nj1LWU9kNnliUnhqQlc4TkptWUQ4dF9VeXlWbXlzcHBGWHFIcEZMZHNsR1hVLDI0NQpzZXR1cHRvb2xzL3NhbmRib3gucHksc2hhMjU2PTlVYndmRUw1UVk0MzZvTUkxTHRGV29oaG9aLVV6d0h2R3laalVIX3Foa3csMTQyNzYKc2V0dXB0b29scy9zY3JpcHQgKGRldikudG1wbCxzaGEyNTY9UlV6UXpDUVVhWHR3ZEx0WUhXWWJJUW1PYUVTNUJycXExRnZVQV90dS01SSwyMTgKc2V0dXB0b29scy9zY3JpcHQudG1wbCxzaGEyNTY9V0dUdDVwaWV6TzI3Yy1EYng2bDVRNFQzRmYyMEE1ejc4NzJodjNhQWhZWSwxMzgKc2V0dXB0b29scy9zaXRlLXBhdGNoLnB5LHNoYTI1Nj1PdW1rSUhNdW9TZW5SU1cxMzgya0tXSTFWQXd4TkU4NkU1VzhpRGQzNEZZLDIzMDIKc2V0dXB0b29scy9zc2xfc3VwcG9ydC5weSxzaGEyNTY9bkxqUFVCQnc3UlRUeDZPNFJKWjVlQU1HZ2pKRzhiZWlEYmtGWERacEx1TSw4NDkzCnNldHVwdG9vbHMvdW5pY29kZV91dGlscy5weSxzaGEyNTY9Tk9pWl81aEQ3MkE2dy00d1ZqOGF3SEZNM241MUttdzFJY192eDE1WEZxdyw5OTYKc2V0dXB0b29scy92ZXJzaW9uLnB5LHNoYTI1Nj1vZ19jdVpRYjBRSTZ1a0taRmZaV1BscjFIZ0pCUFBuMnZPMm1fYkk5WlRFLDE0NApzZXR1cHRvb2xzL3doZWVsLnB5LHNoYTI1Nj16Y3QtU0VqNV9Mb0hnNlhFTHQyY1ZSZHVsc1VFTmVuQ2RTMWVrTTdUbFpBLDg0NTUKc2V0dXB0b29scy93aW5kb3dzX3N1cHBvcnQucHksc2hhMjU2PTVHcmZxU1AyLWRMR0pvWlRxMmc2ZENLa3lReHhhMm41SVFpWGxKQ29ZRUUsNzE0CnNldHVwdG9vbHMvX3ZlbmRvci9fX2luaXRfXy5weSxzaGEyNTY9NDdERVFwajhIQlNhLV9USW1XLTVKQ2V1UWVSa201Tk1wSldaRzNoU3VGVSwwCnNldHVwdG9vbHMvX3ZlbmRvci9vcmRlcmVkX3NldC5weSxzaGEyNTY9ZGJhQ2NzMjdkeU45Z25NV0dGNW5BX0JyVm42US1OcmpLWUpwVjlfZmdCcywxNTEzMApzZXR1cHRvb2xzL192ZW5kb3IvcHlwYXJzaW5nLnB5LHNoYTI1Nj10bXJwLWx1LXFPMWk3NVp6SU41QTEybktSUkQxQ200VnBrLTVMUjlyaW1zLDIzMjA1NQpzZXR1cHRvb2xzL192ZW5kb3Ivc2l4LnB5LHNoYTI1Nj1BNmhkSlpWakkzdF9nZWViWjlCelV2d1JySVhvMGxmd3pRbE0yTGNLeWFzLDMwMDk4CnNldHVwdG9vbHMvX3ZlbmRvci9wYWNrYWdpbmcvX19hYm91dF9fLnB5LHNoYTI1Nj1DcHVNU3loMVY3YWR3OFFNaldLa1kzTHRkcVJVa1JYNE1nSjZuRjRzdE0wLDc0NApzZXR1cHRvb2xzL192ZW5kb3IvcGFja2FnaW5nL19faW5pdF9fLnB5LHNoYTI1Nj02ZW5icDVYZ1JmakJqc0k5LWJuMDBIakhmNVRIMjFQRE1PS2tKVzh4dy13LDU2MgpzZXR1cHRvb2xzL192ZW5kb3IvcGFja2FnaW5nL19jb21wYXQucHksc2hhMjU2PVVnZG0tcWNuZVNjaFcyNUpydE1JS2dVeGZFRUJjQ0F6NldyRWVYZXF6OW8sODY1CnNldHVwdG9vbHMvX3ZlbmRvci9wYWNrYWdpbmcvX3N0cnVjdHVyZXMucHksc2hhMjU2PXBWZDkwWGNYUkd3cFpSQl9xZEZ1VkVpYmhDSHBYX2JMNXpZcjktTjBtYzgsMTQxNgpzZXR1cHRvb2xzL192ZW5kb3IvcGFja2FnaW5nL21hcmtlcnMucHksc2hhMjU2PS1tZUZsOUZyOVY4ckY1UmR1emdldHQ1RUhLOXdCWVJVcXNzQVYycGowbHcsODI2OApzZXR1cHRvb2xzL192ZW5kb3IvcGFja2FnaW5nL3JlcXVpcmVtZW50cy5weSxzaGEyNTY9M2R3SUpla3Q4UlJHQ1ViZ3hYOHJlZUFiZ21aWWpiMHdjQ1J0bUg2M2t4SSw0NzQyCnNldHVwdG9vbHMvX3ZlbmRvci9wYWNrYWdpbmcvc3BlY2lmaWVycy5weSxzaGEyNTY9MFp6UXBjVW52clE2TGpSLW1RUkx6TXI4RzZoZFJ2LW1ZMFZTZl9hbUZ0SSwyNzc3OApzZXR1cHRvb2xzL192ZW5kb3IvcGFja2FnaW5nL3RhZ3MucHksc2hhMjU2PUVQTFhoTzZHVEQ3X29pV0VPMVUwbDBQa2ZSOFJfeGl2cE1ESFhuc1RsdHMsMTI5MzMKc2V0dXB0b29scy9fdmVuZG9yL3BhY2thZ2luZy91dGlscy5weSxzaGEyNTY9VmFUQzBFaTd6TzJ4bDlBUmlXbXoyWUZMRnQ4OVB1dWhMYkFsWE15QUdtcywxNTIwCnNldHVwdG9vbHMvX3ZlbmRvci9wYWNrYWdpbmcvdmVyc2lvbi5weSxzaGEyNTY9TnBkd25iOE9IZWRqXzJMODZ5aVVxc2N1amI3d19pNWdtU0sxUGhPQUZ6ZywxMTk3OApzZXR1cHRvb2xzL2NvbW1hbmQvX19pbml0X18ucHksc2hhMjU2PVFDQXVBOXdobnE4Qm5vYzBiQmFTNkx3X0tBVU8wRGlIWVpRWEVNTm41aGcsNTY4CnNldHVwdG9vbHMvY29tbWFuZC9hbGlhcy5weSxzaGEyNTY9S2pwRTBzel9TRElIdjNmcFpjSVFLLXNDa0p6LVNyQzZHbXVnNmI5TmtjOCwyNDI2CnNldHVwdG9vbHMvY29tbWFuZC9iZGlzdF9lZ2cucHksc2hhMjU2PW5uZlY4QWg4SVJDX0lmdjVMb2E5RmR4TDY2TVZieURYd3ktZm9QODEwek0sMTgxODUKc2V0dXB0b29scy9jb21tYW5kL2JkaXN0X3JwbS5weSxzaGEyNTY9QjdsMFRuekNHYi0wbkxsbTZyUzAwaldMa29qQVN3Vm1kaFcydzVRel9BaywxNTA4CnNldHVwdG9vbHMvY29tbWFuZC9iZGlzdF93aW5pbnN0LnB5LHNoYTI1Nj1fNmR6M2xwQjF0WTIwMEx4S1BMTTdxZ3dUQ2NlT01nYVdGRi1qVzItcG0wLDYzNwpzZXR1cHRvb2xzL2NvbW1hbmQvYnVpbGRfY2xpYi5weSxzaGEyNTY9YlE5YUJyLTVaU08tOWZHc0dzREx6MG1ubkZ0ZUhVWm5mdFZMa2h2SERxMCw0NDg0CnNldHVwdG9vbHMvY29tbWFuZC9idWlsZF9leHQucHksc2hhMjU2PUliNDJZVUdrc0Jzd20ybUw1eG1RUEY2TmVUQTZIY3FydkF0RWdGQ3YzMkEsMTMwMTkKc2V0dXB0b29scy9jb21tYW5kL2J1aWxkX3B5LnB5LHNoYTI1Nj15V3lZYWFTOUYzbzlKYkljem4wNjRBNWcxQzVfVWlLUkR4R2FUcVlidExFLDk1OTYKc2V0dXB0b29scy9jb21tYW5kL2RldmVsb3AucHksc2hhMjU2PU1RbG5HUzZ1UDE5ZXJLMkpDTk95UVlvWXlxdWszUEFEcnFycmlucXFMdEEsODE4NApzZXR1cHRvb2xzL2NvbW1hbmQvZGlzdF9pbmZvLnB5LHNoYTI1Nj01dDZrT2ZyZGdBTFQtUDNvZ3NzNlBGOWstTGV5ZXN1ZXljdWszZFV5Wm5JLDk2MApzZXR1cHRvb2xzL2NvbW1hbmQvZWFzeV9pbnN0YWxsLnB5LHNoYTI1Nj1yUWZZR2pRb2htZjVxYklEWm1RVmVweFp0N2VETDJ0WEgtSjlsUlJ0ekVRLDg3NTQ0CnNldHVwdG9vbHMvY29tbWFuZC9lZ2dfaW5mby5weSxzaGEyNTY9dzczRWR4WVNPazJnc2FBaUhHTDJkWnJDbGRvUGl1UnIyZVRmcWNGdkNkcywyNTU3MApzZXR1cHRvb2xzL2NvbW1hbmQvaW5zdGFsbC5weSxzaGEyNTY9OGRvTXhlUUVEb0s0RWNvMG1PMldsWFh6enA5UW5zR0pRN1o3eVdrWlBHOCw0NzA1CnNldHVwdG9vbHMvY29tbWFuZC9pbnN0YWxsX2VnZ19pbmZvLnB5LHNoYTI1Nj1iTWdlSWVSaVh6UTREQUdQVjEzMjhrY2p3UWpIak9XVTRGbmdBV0xWNzhRLDIyMDMKc2V0dXB0b29scy9jb21tYW5kL2luc3RhbGxfbGliLnB5LHNoYTI1Nj1yNU51YXNhU3h2bUlyamdaTmozOElxLTFVSkcxbzFtczdDdUhxNk1DVGJRLDM4NjIKc2V0dXB0b29scy9jb21tYW5kL2luc3RhbGxfc2NyaXB0cy5weSxzaGEyNTY9VUQwckVaNjg2MW1UWWhJZHpjc3FLblVsOFBvem9jWFdsOVZCUTFWVFduYywyNDM5CnNldHVwdG9vbHMvY29tbWFuZC9sYXVuY2hlciBtYW5pZmVzdC54bWwsc2hhMjU2PXhsTGJqV3JCMDF0S0MwLWhsVmtPS2tpU1Biek1tbDJlT1B0Sl91Y0NuYkUsNjI4CnNldHVwdG9vbHMvY29tbWFuZC9weTM2Y29tcGF0LnB5LHNoYTI1Nj1TempaY094Rjd6ZEZVVDQ3WnYybjdBTTNIOGtvRHlzXzBPcFMtbjlnSWZjLDQ5ODYKc2V0dXB0b29scy9jb21tYW5kL3JlZ2lzdGVyLnB5LHNoYTI1Nj1razNEeFhDYjVsWFR2cW5oZnd4Mmc2cTdpd2JVbWdUeVhVQ2FCb29CT1VrLDQ2OApzZXR1cHRvb2xzL2NvbW1hbmQvcm90YXRlLnB5LHNoYTI1Nj1jbzVDMUVrSTdQMEdHVDZUcXotVDJTSWoyTEJKVFpYWUVMcG1hbzZkNEtRLDIxNjQKc2V0dXB0b29scy9jb21tYW5kL3NhdmVvcHRzLnB5LHNoYTI1Nj16YTdRQ0JjUWltS0tyaVdjb0NjYmh4UGpVejMwZ1NCNzR6dVRMNDd4cFA0LDY1OApzZXR1cHRvb2xzL2NvbW1hbmQvc2Rpc3QucHksc2hhMjU2PUlMMUxlcEQyaDhxR0tPRkozcnJRVmJqTkhfUTZWaUQ0MGwwUUFEcjRNRVUsODA4OApzZXR1cHRvb2xzL2NvbW1hbmQvc2V0b3B0LnB5LHNoYTI1Nj1OVFdEeXgtZ2pERi10eGY0ZE81NzdzN0xPekhWb0tSME1xMzNyRnhhUnI4LDUwODUKc2V0dXB0b29scy9jb21tYW5kL3Rlc3QucHksc2hhMjU2PXUya1huZ0lJZFNZcXR2d0ZsSGlONkl5ZTFJQjRUVTZ1YWRCMnVpVjFzencsOTYwMgpzZXR1cHRvb2xzL2NvbW1hbmQvdXBsb2FkLnB5LHNoYTI1Nj1YVDNZRlZmWVBBbUE1cWhHZzBldWx1VTk4ZnR4UlVXLVB6S2NPRE1MeFVzLDQ2MgpzZXR1cHRvb2xzL2NvbW1hbmQvdXBsb2FkX2RvY3MucHksc2hhMjU2PW9YaUdwbE1fY1VLTHdFNENXV3c5OFJ6Q3VmQXU4dEJoTUM5N0dlZ0ZjbXMsNzMxMQpzZXR1cHRvb2xzL2V4dGVybi9fX2luaXRfXy5weSxzaGEyNTY9NHE5Z3RTaEIxWEZQNkNpc2x0c3lQcXRjZlRPNlpNOUx1MVFCbDNsLXFtbywyNTE0CnNldHVwdG9vbHMtNDQuMC4wLmRpc3QtaW5mby9MSUNFTlNFLHNoYTI1Nj13eW82dzVXdll5SHYwb3ZuUFFhZ0R3MjJxNGg5SENIVV9zUmhLTklGYlZvLDEwNzgKc2V0dXB0b29scy00NC4wLjAuZGlzdC1pbmZvL01FVEFEQVRBLHNoYTI1Nj1RNTZVbWY0Vmo4SlgzRTRzdFBsdG5EUXJaRHFtd1FjVVFQTm1ib085SHIwLDM3MDQKc2V0dXB0b29scy00NC4wLjAuZGlzdC1pbmZvL1dIRUVMLHNoYTI1Nj04ek5ZWmJ3UVNYb0I5SWZYT2pQZmVOd3ZBc0FMQWpmZmdrMjdGcXZDV2JvLDExMApzZXR1cHRvb2xzLTQ0LjAuMC5kaXN0LWluZm8vZGVwZW5kZW5jeV9saW5rcy50eHQsc2hhMjU2PUhsa0NGa29LNVRiWjVFTUxiTEtZaExjWV9FMzFrQldEOFRxVzJFZ21hdFEsMjM5CnNldHVwdG9vbHMtNDQuMC4wLmRpc3QtaW5mby9lbnRyeV9wb2ludHMudHh0LHNoYTI1Nj1md29na1plYWtJZnhNTldvZzdreGNzYmp3bk1BTWtwQ3BRdjh4MVpqUTcwLDMyMDYKc2V0dXB0b29scy00NC4wLjAuZGlzdC1pbmZvL3RvcF9sZXZlbC50eHQsc2hhMjU2PTJIVVhWVndBNFBmZjF4Z1RGcjNHc1RYWEthUGFPNnZsRzZvTkpfNHU0VGcsMzgKc2V0dXB0b29scy00NC4wLjAuZGlzdC1pbmZvL3ppcC1zYWZlLHNoYTI1Nj1BYnBIR2NnTGIta1JzSkdud0ZFa3RrN3V6cFpPQ2NCWTc0LVlCZHJLVkdzLDEKc2V0dXB0b29scy00NC4wLjAuZGlzdC1pbmZvL1JFQ09SRCwsClBLAwQUAAAAAAAAACEAquBG9m4AAABuAAAARgAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzLTQ0LjAuMC5kaXN0LWluZm8vV0hFRUxXaGVlbC1WZXJzaW9uOiAxLjAKR2VuZXJhdG9yOiBiZGlzdF93aGVlbCAoMC4zMy42KQpSb290LUlzLVB1cmVsaWI6IHRydWUKVGFnOiBweTItbm9uZS1hbnkKVGFnOiBweTMtbm9uZS1hbnkKClBLAwQUAAAAAAAAACEAN9lf3e8AAADvAAAAVQAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzLTQ0LjAuMC5kaXN0LWluZm8vZGVwZW5kZW5jeV9saW5rcy50eHRodHRwczovL2ZpbGVzLnB5dGhvbmhvc3RlZC5vcmcvcGFja2FnZXMvc291cmNlL2MvY2VydGlmaS9jZXJ0aWZpLTIwMTYuOS4yNi50YXIuZ3ojbWQ1PWJhYTgxZTk1MWEyOTk1ODU2MzY4OWQ4NjhlZjEwNjRkCmh0dHBzOi8vZmlsZXMucHl0aG9uaG9zdGVkLm9yZy9wYWNrYWdlcy9zb3VyY2Uvdy93aW5jZXJ0c3RvcmUvd2luY2VydHN0b3JlLTAuMi56aXAjbWQ1PWFlNzI4ZjJmMDA3MTg1NjQ4ZDBjN2E4Njc5YjM2MWUyClBLAwQUAAAAAAAAACEArHUfCIYMAACGDAAAUQAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzLTQ0LjAuMC5kaXN0LWluZm8vZW50cnlfcG9pbnRzLnR4dFtjb25zb2xlX3NjcmlwdHNdCmVhc3lfaW5zdGFsbCA9IHNldHVwdG9vbHMuY29tbWFuZC5lYXN5X2luc3RhbGw6bWFpbgplYXN5X2luc3RhbGwtMy44ID0gc2V0dXB0b29scy5jb21tYW5kLmVhc3lfaW5zdGFsbDptYWluCgpbZGlzdHV0aWxzLmNvbW1hbmRzXQphbGlhcyA9IHNldHVwdG9vbHMuY29tbWFuZC5hbGlhczphbGlhcwpiZGlzdF9lZ2cgPSBzZXR1cHRvb2xzLmNvbW1hbmQuYmRpc3RfZWdnOmJkaXN0X2VnZwpiZGlzdF9ycG0gPSBzZXR1cHRvb2xzLmNvbW1hbmQuYmRpc3RfcnBtOmJkaXN0X3JwbQpiZGlzdF93aW5pbnN0ID0gc2V0dXB0b29scy5jb21tYW5kLmJkaXN0X3dpbmluc3Q6YmRpc3Rfd2luaW5zdApidWlsZF9jbGliID0gc2V0dXB0b29scy5jb21tYW5kLmJ1aWxkX2NsaWI6YnVpbGRfY2xpYgpidWlsZF9leHQgPSBzZXR1cHRvb2xzLmNvbW1hbmQuYnVpbGRfZXh0OmJ1aWxkX2V4dApidWlsZF9weSA9IHNldHVwdG9vbHMuY29tbWFuZC5idWlsZF9weTpidWlsZF9weQpkZXZlbG9wID0gc2V0dXB0b29scy5jb21tYW5kLmRldmVsb3A6ZGV2ZWxvcApkaXN0X2luZm8gPSBzZXR1cHRvb2xzLmNvbW1hbmQuZGlzdF9pbmZvOmRpc3RfaW5mbwplYXN5X2luc3RhbGwgPSBzZXR1cHRvb2xzLmNvbW1hbmQuZWFzeV9pbnN0YWxsOmVhc3lfaW5zdGFsbAplZ2dfaW5mbyA9IHNldHVwdG9vbHMuY29tbWFuZC5lZ2dfaW5mbzplZ2dfaW5mbwppbnN0YWxsID0gc2V0dXB0b29scy5jb21tYW5kLmluc3RhbGw6aW5zdGFsbAppbnN0YWxsX2VnZ19pbmZvID0gc2V0dXB0b29scy5jb21tYW5kLmluc3RhbGxfZWdnX2luZm86aW5zdGFsbF9lZ2dfaW5mbwppbnN0YWxsX2xpYiA9IHNldHVwdG9vbHMuY29tbWFuZC5pbnN0YWxsX2xpYjppbnN0YWxsX2xpYgppbnN0YWxsX3NjcmlwdHMgPSBzZXR1cHRvb2xzLmNvbW1hbmQuaW5zdGFsbF9zY3JpcHRzOmluc3RhbGxfc2NyaXB0cwpyb3RhdGUgPSBzZXR1cHRvb2xzLmNvbW1hbmQucm90YXRlOnJvdGF0ZQpzYXZlb3B0cyA9IHNldHVwdG9vbHMuY29tbWFuZC5zYXZlb3B0czpzYXZlb3B0cwpzZGlzdCA9IHNldHVwdG9vbHMuY29tbWFuZC5zZGlzdDpzZGlzdApzZXRvcHQgPSBzZXR1cHRvb2xzLmNvbW1hbmQuc2V0b3B0OnNldG9wdAp0ZXN0ID0gc2V0dXB0b29scy5jb21tYW5kLnRlc3Q6dGVzdAp1cGxvYWRfZG9jcyA9IHNldHVwdG9vbHMuY29tbWFuZC51cGxvYWRfZG9jczp1cGxvYWRfZG9jcwoKW2Rpc3R1dGlscy5zZXR1cF9rZXl3b3Jkc10KY29udmVydF8ydG8zX2RvY3Rlc3RzID0gc2V0dXB0b29scy5kaXN0OmFzc2VydF9zdHJpbmdfbGlzdApkZXBlbmRlbmN5X2xpbmtzID0gc2V0dXB0b29scy5kaXN0OmFzc2VydF9zdHJpbmdfbGlzdAplYWdlcl9yZXNvdXJjZXMgPSBzZXR1cHRvb2xzLmRpc3Q6YXNzZXJ0X3N0cmluZ19saXN0CmVudHJ5X3BvaW50cyA9IHNldHVwdG9vbHMuZGlzdDpjaGVja19lbnRyeV9wb2ludHMKZXhjbHVkZV9wYWNrYWdlX2RhdGEgPSBzZXR1cHRvb2xzLmRpc3Q6Y2hlY2tfcGFja2FnZV9kYXRhCmV4dHJhc19yZXF1aXJlID0gc2V0dXB0b29scy5kaXN0OmNoZWNrX2V4dHJhcwppbmNsdWRlX3BhY2thZ2VfZGF0YSA9IHNldHVwdG9vbHMuZGlzdDphc3NlcnRfYm9vbAppbnN0YWxsX3JlcXVpcmVzID0gc2V0dXB0b29scy5kaXN0OmNoZWNrX3JlcXVpcmVtZW50cwpuYW1lc3BhY2VfcGFja2FnZXMgPSBzZXR1cHRvb2xzLmRpc3Q6Y2hlY2tfbnNwCnBhY2thZ2VfZGF0YSA9IHNldHVwdG9vbHMuZGlzdDpjaGVja19wYWNrYWdlX2RhdGEKcGFja2FnZXMgPSBzZXR1cHRvb2xzLmRpc3Q6Y2hlY2tfcGFja2FnZXMKcHl0aG9uX3JlcXVpcmVzID0gc2V0dXB0b29scy5kaXN0OmNoZWNrX3NwZWNpZmllcgpzZXR1cF9yZXF1aXJlcyA9IHNldHVwdG9vbHMuZGlzdDpjaGVja19yZXF1aXJlbWVudHMKdGVzdF9sb2FkZXIgPSBzZXR1cHRvb2xzLmRpc3Q6Y2hlY2tfaW1wb3J0YWJsZQp0ZXN0X3J1bm5lciA9IHNldHVwdG9vbHMuZGlzdDpjaGVja19pbXBvcnRhYmxlCnRlc3Rfc3VpdGUgPSBzZXR1cHRvb2xzLmRpc3Q6Y2hlY2tfdGVzdF9zdWl0ZQp0ZXN0c19yZXF1aXJlID0gc2V0dXB0b29scy5kaXN0OmNoZWNrX3JlcXVpcmVtZW50cwp1c2VfMnRvMyA9IHNldHVwdG9vbHMuZGlzdDphc3NlcnRfYm9vbAp1c2VfMnRvM19leGNsdWRlX2ZpeGVycyA9IHNldHVwdG9vbHMuZGlzdDphc3NlcnRfc3RyaW5nX2xpc3QKdXNlXzJ0bzNfZml4ZXJzID0gc2V0dXB0b29scy5kaXN0OmFzc2VydF9zdHJpbmdfbGlzdAp6aXBfc2FmZSA9IHNldHVwdG9vbHMuZGlzdDphc3NlcnRfYm9vbAoKW2VnZ19pbmZvLndyaXRlcnNdClBLRy1JTkZPID0gc2V0dXB0b29scy5jb21tYW5kLmVnZ19pbmZvOndyaXRlX3BrZ19pbmZvCmRlcGVuZGVuY3lfbGlua3MudHh0ID0gc2V0dXB0b29scy5jb21tYW5kLmVnZ19pbmZvOm92ZXJ3cml0ZV9hcmcKZGVwZW5kcy50eHQgPSBzZXR1cHRvb2xzLmNvbW1hbmQuZWdnX2luZm86d2Fybl9kZXBlbmRzX29ic29sZXRlCmVhZ2VyX3Jlc291cmNlcy50eHQgPSBzZXR1cHRvb2xzLmNvbW1hbmQuZWdnX2luZm86b3ZlcndyaXRlX2FyZwplbnRyeV9wb2ludHMudHh0ID0gc2V0dXB0b29scy5jb21tYW5kLmVnZ19pbmZvOndyaXRlX2VudHJpZXMKbmFtZXNwYWNlX3BhY2thZ2VzLnR4dCA9IHNldHVwdG9vbHMuY29tbWFuZC5lZ2dfaW5mbzpvdmVyd3JpdGVfYXJnCnJlcXVpcmVzLnR4dCA9IHNldHVwdG9vbHMuY29tbWFuZC5lZ2dfaW5mbzp3cml0ZV9yZXF1aXJlbWVudHMKdG9wX2xldmVsLnR4dCA9IHNldHVwdG9vbHMuY29tbWFuZC5lZ2dfaW5mbzp3cml0ZV90b3BsZXZlbF9uYW1lcwoKW3NldHVwdG9vbHMuZmluYWxpemVfZGlzdHJpYnV0aW9uX29wdGlvbnNdCjJ0bzNfZG9jdGVzdHMgPSBzZXR1cHRvb2xzLmRpc3Q6RGlzdHJpYnV0aW9uLl9maW5hbGl6ZV8ydG8zX2RvY3Rlc3RzCmZlYXR1cmVzID0gc2V0dXB0b29scy5kaXN0OkRpc3RyaWJ1dGlvbi5fZmluYWxpemVfZmVhdHVyZV9vcHRzCmtleXdvcmRzID0gc2V0dXB0b29scy5kaXN0OkRpc3RyaWJ1dGlvbi5fZmluYWxpemVfc2V0dXBfa2V5d29yZHMKcGFyZW50X2ZpbmFsaXplID0gc2V0dXB0b29scy5kaXN0Ol9EaXN0cmlidXRpb24uZmluYWxpemVfb3B0aW9ucwoKW3NldHVwdG9vbHMuaW5zdGFsbGF0aW9uXQplZ2dzZWN1dGFibGUgPSBzZXR1cHRvb2xzLmNvbW1hbmQuZWFzeV9pbnN0YWxsOmJvb3RzdHJhcAoKUEsDBBQAAAAAAAAAIQAwXAGRJgAAACYAAABOAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMtNDQuMC4wLmRpc3QtaW5mby90b3BfbGV2ZWwudHh0ZWFzeV9pbnN0YWxsCnBrZ19yZXNvdXJjZXMKc2V0dXB0b29scwpQSwMEFAAAAAAAAAAhAJMG1zIBAAAAAQAAAEkAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy00NC4wLjAuZGlzdC1pbmZvL3ppcC1zYWZlClBLAwQUAAAAAAAAACEA0cDf6nMcAABzHAAAOwAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL19faW5pdF9fLnB5IiIiRXh0ZW5zaW9ucyB0byB0aGUgJ2Rpc3R1dGlscycgZm9yIGxhcmdlIG9yIGNvbXBsZXggZGlzdHJpYnV0aW9ucyIiIgoKaW1wb3J0IG9zCmltcG9ydCBzeXMKaW1wb3J0IGZ1bmN0b29scwppbXBvcnQgZGlzdHV0aWxzLmNvcmUKaW1wb3J0IGRpc3R1dGlscy5maWxlbGlzdAppbXBvcnQgcmUKZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNPcHRpb25FcnJvcgpmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBjb252ZXJ0X3BhdGgKZnJvbSBmbm1hdGNoIGltcG9ydCBmbm1hdGNoY2FzZQoKZnJvbSAuX2RlcHJlY2F0aW9uX3dhcm5pbmcgaW1wb3J0IFNldHVwdG9vbHNEZXByZWNhdGlvbldhcm5pbmcKCmZyb20gc2V0dXB0b29scy5leHRlcm4uc2l4IGltcG9ydCBQWTMsIHN0cmluZ190eXBlcwpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuLnNpeC5tb3ZlcyBpbXBvcnQgZmlsdGVyLCBtYXAKCmltcG9ydCBzZXR1cHRvb2xzLnZlcnNpb24KZnJvbSBzZXR1cHRvb2xzLmV4dGVuc2lvbiBpbXBvcnQgRXh0ZW5zaW9uCmZyb20gc2V0dXB0b29scy5kaXN0IGltcG9ydCBEaXN0cmlidXRpb24sIEZlYXR1cmUKZnJvbSBzZXR1cHRvb2xzLmRlcGVuZHMgaW1wb3J0IFJlcXVpcmUKZnJvbSAuIGltcG9ydCBtb25rZXkKCl9fbWV0YWNsYXNzX18gPSB0eXBlCgoKX19hbGxfXyA9IFsKICAgICdzZXR1cCcsICdEaXN0cmlidXRpb24nLCAnRmVhdHVyZScsICdDb21tYW5kJywgJ0V4dGVuc2lvbicsICdSZXF1aXJlJywKICAgICdTZXR1cHRvb2xzRGVwcmVjYXRpb25XYXJuaW5nJywKICAgICdmaW5kX3BhY2thZ2VzJwpdCgppZiBQWTM6CiAgX19hbGxfXy5hcHBlbmQoJ2ZpbmRfbmFtZXNwYWNlX3BhY2thZ2VzJykKCl9fdmVyc2lvbl9fID0gc2V0dXB0b29scy52ZXJzaW9uLl9fdmVyc2lvbl9fCgpib290c3RyYXBfaW5zdGFsbF9mcm9tID0gTm9uZQoKIyBJZiB3ZSBydW4gMnRvMyBvbiAucHkgZmlsZXMsIHNob3VsZCB3ZSBhbHNvIGNvbnZlcnQgZG9jc3RyaW5ncz8KIyBEZWZhdWx0OiB5ZXM7IGFzc3VtZSB0aGF0IHdlIGNhbiBkZXRlY3QgZG9jdGVzdHMgcmVsaWFibHkKcnVuXzJ0bzNfb25fZG9jdGVzdHMgPSBUcnVlCiMgU3RhbmRhcmQgcGFja2FnZSBuYW1lcyBmb3IgZml4ZXIgcGFja2FnZXMKbGliMnRvM19maXhlcl9wYWNrYWdlcyA9IFsnbGliMnRvMy5maXhlcyddCgoKY2xhc3MgUGFja2FnZUZpbmRlcjoKICAgICIiIgogICAgR2VuZXJhdGUgYSBsaXN0IG9mIGFsbCBQeXRob24gcGFja2FnZXMgZm91bmQgd2l0aGluIGEgZGlyZWN0b3J5CiAgICAiIiIKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBmaW5kKGNscywgd2hlcmU9Jy4nLCBleGNsdWRlPSgpLCBpbmNsdWRlPSgnKicsKSk6CiAgICAgICAgIiIiUmV0dXJuIGEgbGlzdCBhbGwgUHl0aG9uIHBhY2thZ2VzIGZvdW5kIHdpdGhpbiBkaXJlY3RvcnkgJ3doZXJlJwoKICAgICAgICAnd2hlcmUnIGlzIHRoZSByb290IGRpcmVjdG9yeSB3aGljaCB3aWxsIGJlIHNlYXJjaGVkIGZvciBwYWNrYWdlcy4gIEl0CiAgICAgICAgc2hvdWxkIGJlIHN1cHBsaWVkIGFzIGEgImNyb3NzLXBsYXRmb3JtIiAoaS5lLiBVUkwtc3R5bGUpIHBhdGg7IGl0IHdpbGwKICAgICAgICBiZSBjb252ZXJ0ZWQgdG8gdGhlIGFwcHJvcHJpYXRlIGxvY2FsIHBhdGggc3ludGF4LgoKICAgICAgICAnZXhjbHVkZScgaXMgYSBzZXF1ZW5jZSBvZiBwYWNrYWdlIG5hbWVzIHRvIGV4Y2x1ZGU7ICcqJyBjYW4gYmUgdXNlZAogICAgICAgIGFzIGEgd2lsZGNhcmQgaW4gdGhlIG5hbWVzLCBzdWNoIHRoYXQgJ2Zvby4qJyB3aWxsIGV4Y2x1ZGUgYWxsCiAgICAgICAgc3VicGFja2FnZXMgb2YgJ2ZvbycgKGJ1dCBub3QgJ2ZvbycgaXRzZWxmKS4KCiAgICAgICAgJ2luY2x1ZGUnIGlzIGEgc2VxdWVuY2Ugb2YgcGFja2FnZSBuYW1lcyB0byBpbmNsdWRlLiAgSWYgaXQncwogICAgICAgIHNwZWNpZmllZCwgb25seSB0aGUgbmFtZWQgcGFja2FnZXMgd2lsbCBiZSBpbmNsdWRlZC4gIElmIGl0J3Mgbm90CiAgICAgICAgc3BlY2lmaWVkLCBhbGwgZm91bmQgcGFja2FnZXMgd2lsbCBiZSBpbmNsdWRlZC4gICdpbmNsdWRlJyBjYW4gY29udGFpbgogICAgICAgIHNoZWxsIHN0eWxlIHdpbGRjYXJkIHBhdHRlcm5zIGp1c3QgbGlrZSAnZXhjbHVkZScuCiAgICAgICAgIiIiCgogICAgICAgIHJldHVybiBsaXN0KGNscy5fZmluZF9wYWNrYWdlc19pdGVyKAogICAgICAgICAgICBjb252ZXJ0X3BhdGgod2hlcmUpLAogICAgICAgICAgICBjbHMuX2J1aWxkX2ZpbHRlcignZXpfc2V0dXAnLCAnKl9fcHljYWNoZV9fJywgKmV4Y2x1ZGUpLAogICAgICAgICAgICBjbHMuX2J1aWxkX2ZpbHRlcigqaW5jbHVkZSkpKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9maW5kX3BhY2thZ2VzX2l0ZXIoY2xzLCB3aGVyZSwgZXhjbHVkZSwgaW5jbHVkZSk6CiAgICAgICAgIiIiCiAgICAgICAgQWxsIHRoZSBwYWNrYWdlcyBmb3VuZCBpbiAnd2hlcmUnIHRoYXQgcGFzcyB0aGUgJ2luY2x1ZGUnIGZpbHRlciwgYnV0CiAgICAgICAgbm90IHRoZSAnZXhjbHVkZScgZmlsdGVyLgogICAgICAgICIiIgogICAgICAgIGZvciByb290LCBkaXJzLCBmaWxlcyBpbiBvcy53YWxrKHdoZXJlLCBmb2xsb3dsaW5rcz1UcnVlKToKICAgICAgICAgICAgIyBDb3B5IGRpcnMgdG8gaXRlcmF0ZSBvdmVyIGl0LCB0aGVuIGVtcHR5IGRpcnMuCiAgICAgICAgICAgIGFsbF9kaXJzID0gZGlyc1s6XQogICAgICAgICAgICBkaXJzWzpdID0gW10KCiAgICAgICAgICAgIGZvciBkaXIgaW4gYWxsX2RpcnM6CiAgICAgICAgICAgICAgICBmdWxsX3BhdGggPSBvcy5wYXRoLmpvaW4ocm9vdCwgZGlyKQogICAgICAgICAgICAgICAgcmVsX3BhdGggPSBvcy5wYXRoLnJlbHBhdGgoZnVsbF9wYXRoLCB3aGVyZSkKICAgICAgICAgICAgICAgIHBhY2thZ2UgPSByZWxfcGF0aC5yZXBsYWNlKG9zLnBhdGguc2VwLCAnLicpCgogICAgICAgICAgICAgICAgIyBTa2lwIGRpcmVjdG9yeSB0cmVlcyB0aGF0IGFyZSBub3QgdmFsaWQgcGFja2FnZXMKICAgICAgICAgICAgICAgIGlmICgnLicgaW4gZGlyIG9yIG5vdCBjbHMuX2xvb2tzX2xpa2VfcGFja2FnZShmdWxsX3BhdGgpKToKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgICAgICMgU2hvdWxkIHRoaXMgcGFja2FnZSBiZSBpbmNsdWRlZD8KICAgICAgICAgICAgICAgIGlmIGluY2x1ZGUocGFja2FnZSkgYW5kIG5vdCBleGNsdWRlKHBhY2thZ2UpOgogICAgICAgICAgICAgICAgICAgIHlpZWxkIHBhY2thZ2UKCiAgICAgICAgICAgICAgICAjIEtlZXAgc2VhcmNoaW5nIHN1YmRpcmVjdG9yaWVzLCBhcyB0aGVyZSBtYXkgYmUgbW9yZSBwYWNrYWdlcwogICAgICAgICAgICAgICAgIyBkb3duIHRoZXJlLCBldmVuIGlmIHRoZSBwYXJlbnQgd2FzIGV4Y2x1ZGVkLgogICAgICAgICAgICAgICAgZGlycy5hcHBlbmQoZGlyKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfbG9va3NfbGlrZV9wYWNrYWdlKHBhdGgpOgogICAgICAgICIiIkRvZXMgYSBkaXJlY3RvcnkgbG9vayBsaWtlIGEgcGFja2FnZT8iIiIKICAgICAgICByZXR1cm4gb3MucGF0aC5pc2ZpbGUob3MucGF0aC5qb2luKHBhdGgsICdfX2luaXRfXy5weScpKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfYnVpbGRfZmlsdGVyKCpwYXR0ZXJucyk6CiAgICAgICAgIiIiCiAgICAgICAgR2l2ZW4gYSBsaXN0IG9mIHBhdHRlcm5zLCByZXR1cm4gYSBjYWxsYWJsZSB0aGF0IHdpbGwgYmUgdHJ1ZSBvbmx5IGlmCiAgICAgICAgdGhlIGlucHV0IG1hdGNoZXMgYXQgbGVhc3Qgb25lIG9mIHRoZSBwYXR0ZXJucy4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gbGFtYmRhIG5hbWU6IGFueShmbm1hdGNoY2FzZShuYW1lLCBwYXQ9cGF0KSBmb3IgcGF0IGluIHBhdHRlcm5zKQoKCmNsYXNzIFBFUDQyMFBhY2thZ2VGaW5kZXIoUGFja2FnZUZpbmRlcik6CiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX2xvb2tzX2xpa2VfcGFja2FnZShwYXRoKToKICAgICAgICByZXR1cm4gVHJ1ZQoKCmZpbmRfcGFja2FnZXMgPSBQYWNrYWdlRmluZGVyLmZpbmQKCmlmIFBZMzoKICBmaW5kX25hbWVzcGFjZV9wYWNrYWdlcyA9IFBFUDQyMFBhY2thZ2VGaW5kZXIuZmluZAoKCmRlZiBfaW5zdGFsbF9zZXR1cF9yZXF1aXJlcyhhdHRycyk6CiAgICAjIE5vdGU6IGRvIG5vdCB1c2UgYHNldHVwdG9vbHMuRGlzdHJpYnV0aW9uYCBkaXJlY3RseSwgYXMKICAgICMgb3VyIFBFUCA1MTcgYmFja2VuZCBwYXRjaCBgZGlzdHV0aWxzLmNvcmUuRGlzdHJpYnV0aW9uYC4KICAgIGRpc3QgPSBkaXN0dXRpbHMuY29yZS5EaXN0cmlidXRpb24oZGljdCgKICAgICAgICAoaywgdikgZm9yIGssIHYgaW4gYXR0cnMuaXRlbXMoKQogICAgICAgIGlmIGsgaW4gKCdkZXBlbmRlbmN5X2xpbmtzJywgJ3NldHVwX3JlcXVpcmVzJykKICAgICkpCiAgICAjIEhvbm9yIHNldHVwLmNmZydzIG9wdGlvbnMuCiAgICBkaXN0LnBhcnNlX2NvbmZpZ19maWxlcyhpZ25vcmVfb3B0aW9uX2Vycm9ycz1UcnVlKQogICAgaWYgZGlzdC5zZXR1cF9yZXF1aXJlczoKICAgICAgICBkaXN0LmZldGNoX2J1aWxkX2VnZ3MoZGlzdC5zZXR1cF9yZXF1aXJlcykKCgpkZWYgc2V0dXAoKiphdHRycyk6CiAgICAjIE1ha2Ugc3VyZSB3ZSBoYXZlIGFueSByZXF1aXJlbWVudHMgbmVlZGVkIHRvIGludGVycHJldCAnYXR0cnMnLgogICAgX2luc3RhbGxfc2V0dXBfcmVxdWlyZXMoYXR0cnMpCiAgICByZXR1cm4gZGlzdHV0aWxzLmNvcmUuc2V0dXAoKiphdHRycykKCnNldHVwLl9fZG9jX18gPSBkaXN0dXRpbHMuY29yZS5zZXR1cC5fX2RvY19fCgoKX0NvbW1hbmQgPSBtb25rZXkuZ2V0X3VucGF0Y2hlZChkaXN0dXRpbHMuY29yZS5Db21tYW5kKQoKCmNsYXNzIENvbW1hbmQoX0NvbW1hbmQpOgogICAgX19kb2NfXyA9IF9Db21tYW5kLl9fZG9jX18KCiAgICBjb21tYW5kX2NvbnN1bWVzX2FyZ3VtZW50cyA9IEZhbHNlCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGRpc3QsICoqa3cpOgogICAgICAgICIiIgogICAgICAgIENvbnN0cnVjdCB0aGUgY29tbWFuZCBmb3IgZGlzdCwgdXBkYXRpbmcKICAgICAgICB2YXJzKHNlbGYpIHdpdGggYW55IGtleXdvcmQgcGFyYW1ldGVycy4KICAgICAgICAiIiIKICAgICAgICBfQ29tbWFuZC5fX2luaXRfXyhzZWxmLCBkaXN0KQogICAgICAgIHZhcnMoc2VsZikudXBkYXRlKGt3KQoKICAgIGRlZiBfZW5zdXJlX3N0cmluZ2xpa2Uoc2VsZiwgb3B0aW9uLCB3aGF0LCBkZWZhdWx0PU5vbmUpOgogICAgICAgIHZhbCA9IGdldGF0dHIoc2VsZiwgb3B0aW9uKQogICAgICAgIGlmIHZhbCBpcyBOb25lOgogICAgICAgICAgICBzZXRhdHRyKHNlbGYsIG9wdGlvbiwgZGVmYXVsdCkKICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHQKICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKHZhbCwgc3RyaW5nX3R5cGVzKToKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoIiclcycgbXVzdCBiZSBhICVzIChnb3QgYCVzYCkiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKG9wdGlvbiwgd2hhdCwgdmFsKSkKICAgICAgICByZXR1cm4gdmFsCgogICAgZGVmIGVuc3VyZV9zdHJpbmdfbGlzdChzZWxmLCBvcHRpb24pOgogICAgICAgIHIiIiJFbnN1cmUgdGhhdCAnb3B0aW9uJyBpcyBhIGxpc3Qgb2Ygc3RyaW5ncy4gIElmICdvcHRpb24nIGlzCiAgICAgICAgY3VycmVudGx5IGEgc3RyaW5nLCB3ZSBzcGxpdCBpdCBlaXRoZXIgb24gLyxccyovIG9yIC9ccysvLCBzbwogICAgICAgICJmb28gYmFyIGJheiIsICJmb28sYmFyLGJheiIsIGFuZCAiZm9vLCAgIGJhciBiYXoiIGFsbCBiZWNvbWUKICAgICAgICBbImZvbyIsICJiYXIiLCAiYmF6Il0uCiAgICAgICAgIiIiCiAgICAgICAgdmFsID0gZ2V0YXR0cihzZWxmLCBvcHRpb24pCiAgICAgICAgaWYgdmFsIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIGVsaWYgaXNpbnN0YW5jZSh2YWwsIHN0cmluZ190eXBlcyk6CiAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgb3B0aW9uLCByZS5zcGxpdChyJyxccyp8XHMrJywgdmFsKSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHZhbCwgbGlzdCk6CiAgICAgICAgICAgICAgICBvayA9IGFsbChpc2luc3RhbmNlKHYsIHN0cmluZ190eXBlcykgZm9yIHYgaW4gdmFsKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgb2sgPSBGYWxzZQogICAgICAgICAgICBpZiBub3Qgb2s6CiAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcigKICAgICAgICAgICAgICAgICAgICAgICInJXMnIG11c3QgYmUgYSBsaXN0IG9mIHN0cmluZ3MgKGdvdCAlcikiCiAgICAgICAgICAgICAgICAgICAgICAlIChvcHRpb24sIHZhbCkpCgogICAgZGVmIHJlaW5pdGlhbGl6ZV9jb21tYW5kKHNlbGYsIGNvbW1hbmQsIHJlaW5pdF9zdWJjb21tYW5kcz0wLCAqKmt3KToKICAgICAgICBjbWQgPSBfQ29tbWFuZC5yZWluaXRpYWxpemVfY29tbWFuZChzZWxmLCBjb21tYW5kLCByZWluaXRfc3ViY29tbWFuZHMpCiAgICAgICAgdmFycyhjbWQpLnVwZGF0ZShrdykKICAgICAgICByZXR1cm4gY21kCgoKZGVmIF9maW5kX2FsbF9zaW1wbGUocGF0aCk6CiAgICAiIiIKICAgIEZpbmQgYWxsIGZpbGVzIHVuZGVyICdwYXRoJwogICAgIiIiCiAgICByZXN1bHRzID0gKAogICAgICAgIG9zLnBhdGguam9pbihiYXNlLCBmaWxlKQogICAgICAgIGZvciBiYXNlLCBkaXJzLCBmaWxlcyBpbiBvcy53YWxrKHBhdGgsIGZvbGxvd2xpbmtzPVRydWUpCiAgICAgICAgZm9yIGZpbGUgaW4gZmlsZXMKICAgICkKICAgIHJldHVybiBmaWx0ZXIob3MucGF0aC5pc2ZpbGUsIHJlc3VsdHMpCgoKZGVmIGZpbmRhbGwoZGlyPW9zLmN1cmRpcik6CiAgICAiIiIKICAgIEZpbmQgYWxsIGZpbGVzIHVuZGVyICdkaXInIGFuZCByZXR1cm4gdGhlIGxpc3Qgb2YgZnVsbCBmaWxlbmFtZXMuCiAgICBVbmxlc3MgZGlyIGlzICcuJywgcmV0dXJuIGZ1bGwgZmlsZW5hbWVzIHdpdGggZGlyIHByZXBlbmRlZC4KICAgICIiIgogICAgZmlsZXMgPSBfZmluZF9hbGxfc2ltcGxlKGRpcikKICAgIGlmIGRpciA9PSBvcy5jdXJkaXI6CiAgICAgICAgbWFrZV9yZWwgPSBmdW5jdG9vbHMucGFydGlhbChvcy5wYXRoLnJlbHBhdGgsIHN0YXJ0PWRpcikKICAgICAgICBmaWxlcyA9IG1hcChtYWtlX3JlbCwgZmlsZXMpCiAgICByZXR1cm4gbGlzdChmaWxlcykKCgojIEFwcGx5IG1vbmtleSBwYXRjaGVzCm1vbmtleS5wYXRjaF9hbGwoKQpQSwMEFAAAAAAAAAAhAA6sEkraAAAA2gAAAEcAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9fZGVwcmVjYXRpb25fd2FybmluZy5weWNsYXNzIFNldHVwdG9vbHNEZXByZWNhdGlvbldhcm5pbmcoV2FybmluZyk6CiAgICAiIiIKICAgIEJhc2UgY2xhc3MgZm9yIHdhcm5pbmcgZGVwcmVjYXRpb25zIGluIGBgc2V0dXB0b29sc2BgCgogICAgVGhpcyBjbGFzcyBpcyBub3QgZGVyaXZlZCBmcm9tIGBgRGVwcmVjYXRpb25XYXJuaW5nYGAsIGFuZCBhcyBzdWNoIGlzCiAgICB2aXNpYmxlIGJ5IGRlZmF1bHQuCiAgICAiIiIKUEsDBBQAAAAAAAAAIQBbFESOrwgAAK8IAAA3AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvX2ltcC5weSIiIgpSZS1pbXBsZW1lbnRhdGlvbiBvZiBmaW5kX21vZHVsZSBhbmQgZ2V0X2Zyb3plbl9vYmplY3QKZnJvbSB0aGUgZGVwcmVjYXRlZCBpbXAgbW9kdWxlLgoiIiIKCmltcG9ydCBvcwppbXBvcnQgaW1wb3J0bGliLnV0aWwKaW1wb3J0IGltcG9ydGxpYi5tYWNoaW5lcnkKCmZyb20gLnB5MzRjb21wYXQgaW1wb3J0IG1vZHVsZV9mcm9tX3NwZWMKCgpQWV9TT1VSQ0UgPSAxClBZX0NPTVBJTEVEID0gMgpDX0VYVEVOU0lPTiA9IDMKQ19CVUlMVElOID0gNgpQWV9GUk9aRU4gPSA3CgoKZGVmIGZpbmRfbW9kdWxlKG1vZHVsZSwgcGF0aHM9Tm9uZSk6CiAgICAiIiJKdXN0IGxpa2UgJ2ltcC5maW5kX21vZHVsZSgpJywgYnV0IHdpdGggcGFja2FnZSBzdXBwb3J0IiIiCiAgICBzcGVjID0gaW1wb3J0bGliLnV0aWwuZmluZF9zcGVjKG1vZHVsZSwgcGF0aHMpCiAgICBpZiBzcGVjIGlzIE5vbmU6CiAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IoIkNhbid0IGZpbmQgJXMiICUgbW9kdWxlKQogICAgaWYgbm90IHNwZWMuaGFzX2xvY2F0aW9uIGFuZCBoYXNhdHRyKHNwZWMsICdzdWJtb2R1bGVfc2VhcmNoX2xvY2F0aW9ucycpOgogICAgICAgIHNwZWMgPSBpbXBvcnRsaWIudXRpbC5zcGVjX2Zyb21fbG9hZGVyKCdfX2luaXRfXy5weScsIHNwZWMubG9hZGVyKQoKICAgIGtpbmQgPSAtMQogICAgZmlsZSA9IE5vbmUKICAgIHN0YXRpYyA9IGlzaW5zdGFuY2Uoc3BlYy5sb2FkZXIsIHR5cGUpCiAgICBpZiBzcGVjLm9yaWdpbiA9PSAnZnJvemVuJyBvciBzdGF0aWMgYW5kIGlzc3ViY2xhc3MoCiAgICAgICAgICAgIHNwZWMubG9hZGVyLCBpbXBvcnRsaWIubWFjaGluZXJ5LkZyb3plbkltcG9ydGVyKToKICAgICAgICBraW5kID0gUFlfRlJPWkVOCiAgICAgICAgcGF0aCA9IE5vbmUgICMgaW1wIGNvbXBhYmlsdHkKICAgICAgICBzdWZmaXggPSBtb2RlID0gJycgICMgaW1wIGNvbXBhYmlsaXR5CiAgICBlbGlmIHNwZWMub3JpZ2luID09ICdidWlsdC1pbicgb3Igc3RhdGljIGFuZCBpc3N1YmNsYXNzKAogICAgICAgICAgICBzcGVjLmxvYWRlciwgaW1wb3J0bGliLm1hY2hpbmVyeS5CdWlsdGluSW1wb3J0ZXIpOgogICAgICAgIGtpbmQgPSBDX0JVSUxUSU4KICAgICAgICBwYXRoID0gTm9uZSAgIyBpbXAgY29tcGFiaWx0eQogICAgICAgIHN1ZmZpeCA9IG1vZGUgPSAnJyAgIyBpbXAgY29tcGFiaWxpdHkKICAgIGVsaWYgc3BlYy5oYXNfbG9jYXRpb246CiAgICAgICAgcGF0aCA9IHNwZWMub3JpZ2luCiAgICAgICAgc3VmZml4ID0gb3MucGF0aC5zcGxpdGV4dChwYXRoKVsxXQogICAgICAgIG1vZGUgPSAncicgaWYgc3VmZml4IGluIGltcG9ydGxpYi5tYWNoaW5lcnkuU09VUkNFX1NVRkZJWEVTIGVsc2UgJ3JiJwoKICAgICAgICBpZiBzdWZmaXggaW4gaW1wb3J0bGliLm1hY2hpbmVyeS5TT1VSQ0VfU1VGRklYRVM6CiAgICAgICAgICAgIGtpbmQgPSBQWV9TT1VSQ0UKICAgICAgICBlbGlmIHN1ZmZpeCBpbiBpbXBvcnRsaWIubWFjaGluZXJ5LkJZVEVDT0RFX1NVRkZJWEVTOgogICAgICAgICAgICBraW5kID0gUFlfQ09NUElMRUQKICAgICAgICBlbGlmIHN1ZmZpeCBpbiBpbXBvcnRsaWIubWFjaGluZXJ5LkVYVEVOU0lPTl9TVUZGSVhFUzoKICAgICAgICAgICAga2luZCA9IENfRVhURU5TSU9OCgogICAgICAgIGlmIGtpbmQgaW4ge1BZX1NPVVJDRSwgUFlfQ09NUElMRUR9OgogICAgICAgICAgICBmaWxlID0gb3BlbihwYXRoLCBtb2RlKQogICAgZWxzZToKICAgICAgICBwYXRoID0gTm9uZQogICAgICAgIHN1ZmZpeCA9IG1vZGUgPSAnJwoKICAgIHJldHVybiBmaWxlLCBwYXRoLCAoc3VmZml4LCBtb2RlLCBraW5kKQoKCmRlZiBnZXRfZnJvemVuX29iamVjdChtb2R1bGUsIHBhdGhzPU5vbmUpOgogICAgc3BlYyA9IGltcG9ydGxpYi51dGlsLmZpbmRfc3BlYyhtb2R1bGUsIHBhdGhzKQogICAgaWYgbm90IHNwZWM6CiAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IoIkNhbid0IGZpbmQgJXMiICUgbW9kdWxlKQogICAgcmV0dXJuIHNwZWMubG9hZGVyLmdldF9jb2RlKG1vZHVsZSkKCgpkZWYgZ2V0X21vZHVsZShtb2R1bGUsIHBhdGhzLCBpbmZvKToKICAgIHNwZWMgPSBpbXBvcnRsaWIudXRpbC5maW5kX3NwZWMobW9kdWxlLCBwYXRocykKICAgIGlmIG5vdCBzcGVjOgogICAgICAgIHJhaXNlIEltcG9ydEVycm9yKCJDYW4ndCBmaW5kICVzIiAlIG1vZHVsZSkKICAgIHJldHVybiBtb2R1bGVfZnJvbV9zcGVjKHNwZWMpClBLAwQUAAAAAAAAACEAAAAAAAAAAAAAAAAAQwAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL192ZW5kb3IvX19pbml0X18ucHlQSwMEFAAAAAAAAAAhAETDKgMaOwAAGjsAAEYAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9fdmVuZG9yL29yZGVyZWRfc2V0LnB5IiIiCkFuIE9yZGVyZWRTZXQgaXMgYSBjdXN0b20gTXV0YWJsZVNldCB0aGF0IHJlbWVtYmVycyBpdHMgb3JkZXIsIHNvIHRoYXQgZXZlcnkKZW50cnkgaGFzIGFuIGluZGV4IHRoYXQgY2FuIGJlIGxvb2tlZCB1cC4KCkJhc2VkIG9uIGEgcmVjaXBlIG9yaWdpbmFsbHkgcG9zdGVkIHRvIEFjdGl2ZVN0YXRlIFJlY2lwZXMgYnkgUmF5bW9uZCBIZXR0aWdlciwKYW5kIHJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS4KIiIiCmltcG9ydCBpdGVydG9vbHMgYXMgaXQKZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVxdWUKCnRyeToKICAgICMgUHl0aG9uIDMKICAgIGZyb20gY29sbGVjdGlvbnMuYWJjIGltcG9ydCBNdXRhYmxlU2V0LCBTZXF1ZW5jZQpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAjIFB5dGhvbiAyLjcKICAgIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IE11dGFibGVTZXQsIFNlcXVlbmNlCgpTTElDRV9BTEwgPSBzbGljZShOb25lKQpfX3ZlcnNpb25fXyA9ICIzLjEiCgoKZGVmIGlzX2l0ZXJhYmxlKG9iaik6CiAgICAiIiIKICAgIEFyZSB3ZSBiZWluZyBhc2tlZCB0byBsb29rIHVwIGEgbGlzdCBvZiB0aGluZ3MsIGluc3RlYWQgb2YgYSBzaW5nbGUgdGhpbmc/CiAgICBXZSBjaGVjayBmb3IgdGhlIGBfX2l0ZXJfX2AgYXR0cmlidXRlIHNvIHRoYXQgdGhpcyBjYW4gY292ZXIgdHlwZXMgdGhhdAogICAgZG9uJ3QgaGF2ZSB0byBiZSBrbm93biBieSB0aGlzIG1vZHVsZSwgc3VjaCBhcyBOdW1QeSBhcnJheXMuCgogICAgU3RyaW5ncywgaG93ZXZlciwgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYXMgYXRvbWljIHZhbHVlcyB0byBsb29rIHVwLCBub3QKICAgIGl0ZXJhYmxlcy4gVGhlIHNhbWUgZ29lcyBmb3IgdHVwbGVzLCBzaW5jZSB0aGV5IGFyZSBpbW11dGFibGUgYW5kIHRoZXJlZm9yZQogICAgdmFsaWQgZW50cmllcy4KCiAgICBXZSBkb24ndCBuZWVkIHRvIGNoZWNrIGZvciB0aGUgUHl0aG9uIDIgYHVuaWNvZGVgIHR5cGUsIGJlY2F1c2UgaXQgZG9lc24ndAogICAgaGF2ZSBhbiBgX19pdGVyX19gIGF0dHJpYnV0ZSBhbnl3YXkuCiAgICAiIiIKICAgIHJldHVybiAoCiAgICAgICAgaGFzYXR0cihvYmosICJfX2l0ZXJfXyIpCiAgICAgICAgYW5kIG5vdCBpc2luc3RhbmNlKG9iaiwgc3RyKQogICAgICAgIGFuZCBub3QgaXNpbnN0YW5jZShvYmosIHR1cGxlKQogICAgKQoKCmNsYXNzIE9yZGVyZWRTZXQoTXV0YWJsZVNldCwgU2VxdWVuY2UpOgogICAgIiIiCiAgICBBbiBPcmRlcmVkU2V0IGlzIGEgY3VzdG9tIE11dGFibGVTZXQgdGhhdCByZW1lbWJlcnMgaXRzIG9yZGVyLCBzbyB0aGF0CiAgICBldmVyeSBlbnRyeSBoYXMgYW4gaW5kZXggdGhhdCBjYW4gYmUgbG9va2VkIHVwLgoKICAgIEV4YW1wbGU6CiAgICAgICAgPj4+IE9yZGVyZWRTZXQoWzEsIDEsIDIsIDMsIDJdKQogICAgICAgIE9yZGVyZWRTZXQoWzEsIDIsIDNdKQogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGl0ZXJhYmxlPU5vbmUpOgogICAgICAgIHNlbGYuaXRlbXMgPSBbXQogICAgICAgIHNlbGYubWFwID0ge30KICAgICAgICBpZiBpdGVyYWJsZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZiB8PSBpdGVyYWJsZQoKICAgIGRlZiBfX2xlbl9fKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJldHVybnMgdGhlIG51bWJlciBvZiB1bmlxdWUgZWxlbWVudHMgaW4gdGhlIG9yZGVyZWQgc2V0CgogICAgICAgIEV4YW1wbGU6CiAgICAgICAgICAgID4+PiBsZW4oT3JkZXJlZFNldChbXSkpCiAgICAgICAgICAgIDAKICAgICAgICAgICAgPj4+IGxlbihPcmRlcmVkU2V0KFsxLCAyXSkpCiAgICAgICAgICAgIDIKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gbGVuKHNlbGYuaXRlbXMpCgogICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGluZGV4KToKICAgICAgICAiIiIKICAgICAgICBHZXQgdGhlIGl0ZW0gYXQgYSBnaXZlbiBpbmRleC4KCiAgICAgICAgSWYgYGluZGV4YCBpcyBhIHNsaWNlLCB5b3Ugd2lsbCBnZXQgYmFjayB0aGF0IHNsaWNlIG9mIGl0ZW1zLCBhcyBhCiAgICAgICAgbmV3IE9yZGVyZWRTZXQuCgogICAgICAgIElmIGBpbmRleGAgaXMgYSBsaXN0IG9yIGEgc2ltaWxhciBpdGVyYWJsZSwgeW91J2xsIGdldCBhIGxpc3Qgb2YKICAgICAgICBpdGVtcyBjb3JyZXNwb25kaW5nIHRvIHRob3NlIGluZGljZXMuIFRoaXMgaXMgc2ltaWxhciB0byBOdW1QeSdzCiAgICAgICAgImZhbmN5IGluZGV4aW5nIi4gVGhlIHJlc3VsdCBpcyBub3QgYW4gT3JkZXJlZFNldCBiZWNhdXNlIHlvdSBtYXkgYXNrCiAgICAgICAgZm9yIGR1cGxpY2F0ZSBpbmRpY2VzLCBhbmQgdGhlIG51bWJlciBvZiBlbGVtZW50cyByZXR1cm5lZCBzaG91bGQgYmUKICAgICAgICB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGFza2VkIGZvci4KCiAgICAgICAgRXhhbXBsZToKICAgICAgICAgICAgPj4+IG9zZXQgPSBPcmRlcmVkU2V0KFsxLCAyLCAzXSkKICAgICAgICAgICAgPj4+IG9zZXRbMV0KICAgICAgICAgICAgMgogICAgICAgICIiIgogICAgICAgIGlmIGlzaW5zdGFuY2UoaW5kZXgsIHNsaWNlKSBhbmQgaW5kZXggPT0gU0xJQ0VfQUxMOgogICAgICAgICAgICByZXR1cm4gc2VsZi5jb3B5KCkKICAgICAgICBlbGlmIGlzX2l0ZXJhYmxlKGluZGV4KToKICAgICAgICAgICAgcmV0dXJuIFtzZWxmLml0ZW1zW2ldIGZvciBpIGluIGluZGV4XQogICAgICAgIGVsaWYgaGFzYXR0cihpbmRleCwgIl9faW5kZXhfXyIpIG9yIGlzaW5zdGFuY2UoaW5kZXgsIHNsaWNlKToKICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5pdGVtc1tpbmRleF0KICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShyZXN1bHQsIGxpc3QpOgogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKHJlc3VsdCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIkRvbid0IGtub3cgaG93IHRvIGluZGV4IGFuIE9yZGVyZWRTZXQgYnkgJXIiICUgaW5kZXgpCgogICAgZGVmIGNvcHkoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIGEgc2hhbGxvdyBjb3B5IG9mIHRoaXMgb2JqZWN0LgoKICAgICAgICBFeGFtcGxlOgogICAgICAgICAgICA+Pj4gdGhpcyA9IE9yZGVyZWRTZXQoWzEsIDIsIDNdKQogICAgICAgICAgICA+Pj4gb3RoZXIgPSB0aGlzLmNvcHkoKQogICAgICAgICAgICA+Pj4gdGhpcyA9PSBvdGhlcgogICAgICAgICAgICBUcnVlCiAgICAgICAgICAgID4+PiB0aGlzIGlzIG90aGVyCiAgICAgICAgICAgIEZhbHNlCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKHNlbGYpCgogICAgZGVmIF9fZ2V0c3RhdGVfXyhzZWxmKToKICAgICAgICBpZiBsZW4oc2VsZikgPT0gMDoKICAgICAgICAgICAgIyBUaGUgc3RhdGUgY2FuJ3QgYmUgYW4gZW1wdHkgbGlzdC4KICAgICAgICAgICAgIyBXZSBuZWVkIHRvIHJldHVybiBhIHRydXRoeSB2YWx1ZSwgb3IgZWxzZSBfX3NldHN0YXRlX18gd29uJ3QgYmUgcnVuLgogICAgICAgICAgICAjCiAgICAgICAgICAgICMgVGhpcyBjb3VsZCBoYXZlIGJlZW4gZG9uZSBtb3JlIGdyYWNlZnVsbHkgYnkgYWx3YXlzIHB1dHRpbmcgdGhlIHN0YXRlCiAgICAgICAgICAgICMgaW4gYSB0dXBsZSwgYnV0IHRoaXMgd2F5IGlzIGJhY2t3YXJkcy0gYW5kIGZvcndhcmRzLSBjb21wYXRpYmxlIHdpdGgKICAgICAgICAgICAgIyBwcmV2aW91cyB2ZXJzaW9ucyBvZiBPcmRlcmVkU2V0LgogICAgICAgICAgICByZXR1cm4gKE5vbmUsKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBsaXN0KHNlbGYpCgogICAgZGVmIF9fc2V0c3RhdGVfXyhzZWxmLCBzdGF0ZSk6CiAgICAgICAgaWYgc3RhdGUgPT0gKE5vbmUsKToKICAgICAgICAgICAgc2VsZi5fX2luaXRfXyhbXSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLl9faW5pdF9fKHN0YXRlKQoKICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwga2V5KToKICAgICAgICAiIiIKICAgICAgICBUZXN0IGlmIHRoZSBpdGVtIGlzIGluIHRoaXMgb3JkZXJlZCBzZXQKCiAgICAgICAgRXhhbXBsZToKICAgICAgICAgICAgPj4+IDEgaW4gT3JkZXJlZFNldChbMSwgMywgMl0pCiAgICAgICAgICAgIFRydWUKICAgICAgICAgICAgPj4+IDUgaW4gT3JkZXJlZFNldChbMSwgMywgMl0pCiAgICAgICAgICAgIEZhbHNlCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIGtleSBpbiBzZWxmLm1hcAoKICAgIGRlZiBhZGQoc2VsZiwga2V5KToKICAgICAgICAiIiIKICAgICAgICBBZGQgYGtleWAgYXMgYW4gaXRlbSB0byB0aGlzIE9yZGVyZWRTZXQsIHRoZW4gcmV0dXJuIGl0cyBpbmRleC4KCiAgICAgICAgSWYgYGtleWAgaXMgYWxyZWFkeSBpbiB0aGUgT3JkZXJlZFNldCwgcmV0dXJuIHRoZSBpbmRleCBpdCBhbHJlYWR5CiAgICAgICAgaGFkLgoKICAgICAgICBFeGFtcGxlOgogICAgICAgICAgICA+Pj4gb3NldCA9IE9yZGVyZWRTZXQoKQogICAgICAgICAgICA+Pj4gb3NldC5hcHBlbmQoMykKICAgICAgICAgICAgMAogICAgICAgICAgICA+Pj4gcHJpbnQob3NldCkKICAgICAgICAgICAgT3JkZXJlZFNldChbM10pCiAgICAgICAgIiIiCiAgICAgICAgaWYga2V5IG5vdCBpbiBzZWxmLm1hcDoKICAgICAgICAgICAgc2VsZi5tYXBba2V5XSA9IGxlbihzZWxmLml0ZW1zKQogICAgICAgICAgICBzZWxmLml0ZW1zLmFwcGVuZChrZXkpCiAgICAgICAgcmV0dXJuIHNlbGYubWFwW2tleV0KCiAgICBhcHBlbmQgPSBhZGQKCiAgICBkZWYgdXBkYXRlKHNlbGYsIHNlcXVlbmNlKToKICAgICAgICAiIiIKICAgICAgICBVcGRhdGUgdGhlIHNldCB3aXRoIHRoZSBnaXZlbiBpdGVyYWJsZSBzZXF1ZW5jZSwgdGhlbiByZXR1cm4gdGhlIGluZGV4CiAgICAgICAgb2YgdGhlIGxhc3QgZWxlbWVudCBpbnNlcnRlZC4KCiAgICAgICAgRXhhbXBsZToKICAgICAgICAgICAgPj4+IG9zZXQgPSBPcmRlcmVkU2V0KFsxLCAyLCAzXSkKICAgICAgICAgICAgPj4+IG9zZXQudXBkYXRlKFszLCAxLCA1LCAxLCA0XSkKICAgICAgICAgICAgNAogICAgICAgICAgICA+Pj4gcHJpbnQob3NldCkKICAgICAgICAgICAgT3JkZXJlZFNldChbMSwgMiwgMywgNSwgNF0pCiAgICAgICAgIiIiCiAgICAgICAgaXRlbV9pbmRleCA9IE5vbmUKICAgICAgICB0cnk6CiAgICAgICAgICAgIGZvciBpdGVtIGluIHNlcXVlbmNlOgogICAgICAgICAgICAgICAgaXRlbV9pbmRleCA9IHNlbGYuYWRkKGl0ZW0pCiAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKICAgICAgICAgICAgICAgICJBcmd1bWVudCBuZWVkcyB0byBiZSBhbiBpdGVyYWJsZSwgZ290ICVzIiAlIHR5cGUoc2VxdWVuY2UpCiAgICAgICAgICAgICkKICAgICAgICByZXR1cm4gaXRlbV9pbmRleAoKICAgIGRlZiBpbmRleChzZWxmLCBrZXkpOgogICAgICAgICIiIgogICAgICAgIEdldCB0aGUgaW5kZXggb2YgYSBnaXZlbiBlbnRyeSwgcmFpc2luZyBhbiBJbmRleEVycm9yIGlmIGl0J3Mgbm90CiAgICAgICAgcHJlc2VudC4KCiAgICAgICAgYGtleWAgY2FuIGJlIGFuIGl0ZXJhYmxlIG9mIGVudHJpZXMgdGhhdCBpcyBub3QgYSBzdHJpbmcsIGluIHdoaWNoIGNhc2UKICAgICAgICB0aGlzIHJldHVybnMgYSBsaXN0IG9mIGluZGljZXMuCgogICAgICAgIEV4YW1wbGU6CiAgICAgICAgICAgID4+PiBvc2V0ID0gT3JkZXJlZFNldChbMSwgMiwgM10pCiAgICAgICAgICAgID4+PiBvc2V0LmluZGV4KDIpCiAgICAgICAgICAgIDEKICAgICAgICAiIiIKICAgICAgICBpZiBpc19pdGVyYWJsZShrZXkpOgogICAgICAgICAgICByZXR1cm4gW3NlbGYuaW5kZXgoc3Via2V5KSBmb3Igc3Via2V5IGluIGtleV0KICAgICAgICByZXR1cm4gc2VsZi5tYXBba2V5XQoKICAgICMgUHJvdmlkZSBzb21lIGNvbXBhdGliaWxpdHkgd2l0aCBwZC5JbmRleAogICAgZ2V0X2xvYyA9IGluZGV4CiAgICBnZXRfaW5kZXhlciA9IGluZGV4CgogICAgZGVmIHBvcChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZW1vdmUgYW5kIHJldHVybiB0aGUgbGFzdCBlbGVtZW50IGZyb20gdGhlIHNldC4KCiAgICAgICAgUmFpc2VzIEtleUVycm9yIGlmIHRoZSBzZXQgaXMgZW1wdHkuCgogICAgICAgIEV4YW1wbGU6CiAgICAgICAgICAgID4+PiBvc2V0ID0gT3JkZXJlZFNldChbMSwgMiwgM10pCiAgICAgICAgICAgID4+PiBvc2V0LnBvcCgpCiAgICAgICAgICAgIDMKICAgICAgICAiIiIKICAgICAgICBpZiBub3Qgc2VsZi5pdGVtczoKICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IoIlNldCBpcyBlbXB0eSIpCgogICAgICAgIGVsZW0gPSBzZWxmLml0ZW1zWy0xXQogICAgICAgIGRlbCBzZWxmLml0ZW1zWy0xXQogICAgICAgIGRlbCBzZWxmLm1hcFtlbGVtXQogICAgICAgIHJldHVybiBlbGVtCgogICAgZGVmIGRpc2NhcmQoc2VsZiwga2V5KToKICAgICAgICAiIiIKICAgICAgICBSZW1vdmUgYW4gZWxlbWVudC4gIERvIG5vdCByYWlzZSBhbiBleGNlcHRpb24gaWYgYWJzZW50LgoKICAgICAgICBUaGUgTXV0YWJsZVNldCBtaXhpbiB1c2VzIHRoaXMgdG8gaW1wbGVtZW50IHRoZSAucmVtb3ZlKCkgbWV0aG9kLCB3aGljaAogICAgICAgICpkb2VzKiByYWlzZSBhbiBlcnJvciB3aGVuIGFza2VkIHRvIHJlbW92ZSBhIG5vbi1leGlzdGVudCBpdGVtLgoKICAgICAgICBFeGFtcGxlOgogICAgICAgICAgICA+Pj4gb3NldCA9IE9yZGVyZWRTZXQoWzEsIDIsIDNdKQogICAgICAgICAgICA+Pj4gb3NldC5kaXNjYXJkKDIpCiAgICAgICAgICAgID4+PiBwcmludChvc2V0KQogICAgICAgICAgICBPcmRlcmVkU2V0KFsxLCAzXSkKICAgICAgICAgICAgPj4+IG9zZXQuZGlzY2FyZCgyKQogICAgICAgICAgICA+Pj4gcHJpbnQob3NldCkKICAgICAgICAgICAgT3JkZXJlZFNldChbMSwgM10pCiAgICAgICAgIiIiCiAgICAgICAgaWYga2V5IGluIHNlbGY6CiAgICAgICAgICAgIGkgPSBzZWxmLm1hcFtrZXldCiAgICAgICAgICAgIGRlbCBzZWxmLml0ZW1zW2ldCiAgICAgICAgICAgIGRlbCBzZWxmLm1hcFtrZXldCiAgICAgICAgICAgIGZvciBrLCB2IGluIHNlbGYubWFwLml0ZW1zKCk6CiAgICAgICAgICAgICAgICBpZiB2ID49IGk6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5tYXBba10gPSB2IC0gMQoKICAgIGRlZiBjbGVhcihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZW1vdmUgYWxsIGl0ZW1zIGZyb20gdGhpcyBPcmRlcmVkU2V0LgogICAgICAgICIiIgogICAgICAgIGRlbCBzZWxmLml0ZW1zWzpdCiAgICAgICAgc2VsZi5tYXAuY2xlYXIoKQoKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBFeGFtcGxlOgogICAgICAgICAgICA+Pj4gbGlzdChpdGVyKE9yZGVyZWRTZXQoWzEsIDIsIDNdKSkpCiAgICAgICAgICAgIFsxLCAyLCAzXQogICAgICAgICIiIgogICAgICAgIHJldHVybiBpdGVyKHNlbGYuaXRlbXMpCgogICAgZGVmIF9fcmV2ZXJzZWRfXyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBFeGFtcGxlOgogICAgICAgICAgICA+Pj4gbGlzdChyZXZlcnNlZChPcmRlcmVkU2V0KFsxLCAyLCAzXSkpKQogICAgICAgICAgICBbMywgMiwgMV0KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gcmV2ZXJzZWQoc2VsZi5pdGVtcykKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgaWYgbm90IHNlbGY6CiAgICAgICAgICAgIHJldHVybiAiJXMoKSIgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sKQogICAgICAgIHJldHVybiAiJXMoJXIpIiAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgbGlzdChzZWxmKSkKCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm5zIHRydWUgaWYgdGhlIGNvbnRhaW5lcnMgaGF2ZSB0aGUgc2FtZSBpdGVtcy4gSWYgYG90aGVyYCBpcyBhCiAgICAgICAgU2VxdWVuY2UsIHRoZW4gb3JkZXIgaXMgY2hlY2tlZCwgb3RoZXJ3aXNlIGl0IGlzIGlnbm9yZWQuCgogICAgICAgIEV4YW1wbGU6CiAgICAgICAgICAgID4+PiBvc2V0ID0gT3JkZXJlZFNldChbMSwgMywgMl0pCiAgICAgICAgICAgID4+PiBvc2V0ID09IFsxLCAzLCAyXQogICAgICAgICAgICBUcnVlCiAgICAgICAgICAgID4+PiBvc2V0ID09IFsxLCAyLCAzXQogICAgICAgICAgICBGYWxzZQogICAgICAgICAgICA+Pj4gb3NldCA9PSBbMiwgM10KICAgICAgICAgICAgRmFsc2UKICAgICAgICAgICAgPj4+IG9zZXQgPT0gT3JkZXJlZFNldChbMywgMiwgMV0pCiAgICAgICAgICAgIEZhbHNlCiAgICAgICAgIiIiCiAgICAgICAgIyBJbiBQeXRob24gMiBkZXF1ZSBpcyBub3QgYSBTZXF1ZW5jZSwgc28gdHJlYXQgaXQgYXMgb25lIGZvcgogICAgICAgICMgY29uc2lzdGVudCBiZWhhdmlvciB3aXRoIFB5dGhvbiAzLgogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIChTZXF1ZW5jZSwgZGVxdWUpKToKICAgICAgICAgICAgIyBDaGVjayB0aGF0IHRoaXMgT3JkZXJlZFNldCBjb250YWlucyB0aGUgc2FtZSBlbGVtZW50cywgaW4gdGhlCiAgICAgICAgICAgICMgc2FtZSBvcmRlciwgYXMgdGhlIG90aGVyIG9iamVjdC4KICAgICAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZikgPT0gbGlzdChvdGhlcikKICAgICAgICB0cnk6CiAgICAgICAgICAgIG90aGVyX2FzX3NldCA9IHNldChvdGhlcikKICAgICAgICBleGNlcHQgVHlwZUVycm9yOgogICAgICAgICAgICAjIElmIGBvdGhlcmAgY2FuJ3QgYmUgY29udmVydGVkIGludG8gYSBzZXQsIGl0J3Mgbm90IGVxdWFsLgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gc2V0KHNlbGYpID09IG90aGVyX2FzX3NldAoKICAgIGRlZiB1bmlvbihzZWxmLCAqc2V0cyk6CiAgICAgICAgIiIiCiAgICAgICAgQ29tYmluZXMgYWxsIHVuaXF1ZSBpdGVtcy4KICAgICAgICBFYWNoIGl0ZW1zIG9yZGVyIGlzIGRlZmluZWQgYnkgaXRzIGZpcnN0IGFwcGVhcmFuY2UuCgogICAgICAgIEV4YW1wbGU6CiAgICAgICAgICAgID4+PiBvc2V0ID0gT3JkZXJlZFNldC51bmlvbihPcmRlcmVkU2V0KFszLCAxLCA0LCAxLCA1XSksIFsxLCAzXSwgWzIsIDBdKQogICAgICAgICAgICA+Pj4gcHJpbnQob3NldCkKICAgICAgICAgICAgT3JkZXJlZFNldChbMywgMSwgNCwgNSwgMiwgMF0pCiAgICAgICAgICAgID4+PiBvc2V0LnVuaW9uKFs4LCA5XSkKICAgICAgICAgICAgT3JkZXJlZFNldChbMywgMSwgNCwgNSwgMiwgMCwgOCwgOV0pCiAgICAgICAgICAgID4+PiBvc2V0IHwgezEwfQogICAgICAgICAgICBPcmRlcmVkU2V0KFszLCAxLCA0LCA1LCAyLCAwLCAxMF0pCiAgICAgICAgIiIiCiAgICAgICAgY2xzID0gc2VsZi5fX2NsYXNzX18gaWYgaXNpbnN0YW5jZShzZWxmLCBPcmRlcmVkU2V0KSBlbHNlIE9yZGVyZWRTZXQKICAgICAgICBjb250YWluZXJzID0gbWFwKGxpc3QsIGl0LmNoYWluKFtzZWxmXSwgc2V0cykpCiAgICAgICAgaXRlbXMgPSBpdC5jaGFpbi5mcm9tX2l0ZXJhYmxlKGNvbnRhaW5lcnMpCiAgICAgICAgcmV0dXJuIGNscyhpdGVtcykKCiAgICBkZWYgX19hbmRfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgIyB0aGUgcGFyZW50IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgaXMgYmFja3dhcmRzCiAgICAgICAgcmV0dXJuIHNlbGYuaW50ZXJzZWN0aW9uKG90aGVyKQoKICAgIGRlZiBpbnRlcnNlY3Rpb24oc2VsZiwgKnNldHMpOgogICAgICAgICIiIgogICAgICAgIFJldHVybnMgZWxlbWVudHMgaW4gY29tbW9uIGJldHdlZW4gYWxsIHNldHMuIE9yZGVyIGlzIGRlZmluZWQgb25seQogICAgICAgIGJ5IHRoZSBmaXJzdCBzZXQuCgogICAgICAgIEV4YW1wbGU6CiAgICAgICAgICAgID4+PiBvc2V0ID0gT3JkZXJlZFNldC5pbnRlcnNlY3Rpb24oT3JkZXJlZFNldChbMCwgMSwgMiwgM10pLCBbMSwgMiwgM10pCiAgICAgICAgICAgID4+PiBwcmludChvc2V0KQogICAgICAgICAgICBPcmRlcmVkU2V0KFsxLCAyLCAzXSkKICAgICAgICAgICAgPj4+IG9zZXQuaW50ZXJzZWN0aW9uKFsyLCA0LCA1XSwgWzEsIDIsIDMsIDRdKQogICAgICAgICAgICBPcmRlcmVkU2V0KFsyXSkKICAgICAgICAgICAgPj4+IG9zZXQuaW50ZXJzZWN0aW9uKCkKICAgICAgICAgICAgT3JkZXJlZFNldChbMSwgMiwgM10pCiAgICAgICAgIiIiCiAgICAgICAgY2xzID0gc2VsZi5fX2NsYXNzX18gaWYgaXNpbnN0YW5jZShzZWxmLCBPcmRlcmVkU2V0KSBlbHNlIE9yZGVyZWRTZXQKICAgICAgICBpZiBzZXRzOgogICAgICAgICAgICBjb21tb24gPSBzZXQuaW50ZXJzZWN0aW9uKCptYXAoc2V0LCBzZXRzKSkKICAgICAgICAgICAgaXRlbXMgPSAoaXRlbSBmb3IgaXRlbSBpbiBzZWxmIGlmIGl0ZW0gaW4gY29tbW9uKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGl0ZW1zID0gc2VsZgogICAgICAgIHJldHVybiBjbHMoaXRlbXMpCgogICAgZGVmIGRpZmZlcmVuY2Uoc2VsZiwgKnNldHMpOgogICAgICAgICIiIgogICAgICAgIFJldHVybnMgYWxsIGVsZW1lbnRzIHRoYXQgYXJlIGluIHRoaXMgc2V0IGJ1dCBub3QgdGhlIG90aGVycy4KCiAgICAgICAgRXhhbXBsZToKICAgICAgICAgICAgPj4+IE9yZGVyZWRTZXQoWzEsIDIsIDNdKS5kaWZmZXJlbmNlKE9yZGVyZWRTZXQoWzJdKSkKICAgICAgICAgICAgT3JkZXJlZFNldChbMSwgM10pCiAgICAgICAgICAgID4+PiBPcmRlcmVkU2V0KFsxLCAyLCAzXSkuZGlmZmVyZW5jZShPcmRlcmVkU2V0KFsyXSksIE9yZGVyZWRTZXQoWzNdKSkKICAgICAgICAgICAgT3JkZXJlZFNldChbMV0pCiAgICAgICAgICAgID4+PiBPcmRlcmVkU2V0KFsxLCAyLCAzXSkgLSBPcmRlcmVkU2V0KFsyXSkKICAgICAgICAgICAgT3JkZXJlZFNldChbMSwgM10pCiAgICAgICAgICAgID4+PiBPcmRlcmVkU2V0KFsxLCAyLCAzXSkuZGlmZmVyZW5jZSgpCiAgICAgICAgICAgIE9yZGVyZWRTZXQoWzEsIDIsIDNdKQogICAgICAgICIiIgogICAgICAgIGNscyA9IHNlbGYuX19jbGFzc19fCiAgICAgICAgaWYgc2V0czoKICAgICAgICAgICAgb3RoZXIgPSBzZXQudW5pb24oKm1hcChzZXQsIHNldHMpKQogICAgICAgICAgICBpdGVtcyA9IChpdGVtIGZvciBpdGVtIGluIHNlbGYgaWYgaXRlbSBub3QgaW4gb3RoZXIpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaXRlbXMgPSBzZWxmCiAgICAgICAgcmV0dXJuIGNscyhpdGVtcykKCiAgICBkZWYgaXNzdWJzZXQoc2VsZiwgb3RoZXIpOgogICAgICAgICIiIgogICAgICAgIFJlcG9ydCB3aGV0aGVyIGFub3RoZXIgc2V0IGNvbnRhaW5zIHRoaXMgc2V0LgoKICAgICAgICBFeGFtcGxlOgogICAgICAgICAgICA+Pj4gT3JkZXJlZFNldChbMSwgMiwgM10pLmlzc3Vic2V0KHsxLCAyfSkKICAgICAgICAgICAgRmFsc2UKICAgICAgICAgICAgPj4+IE9yZGVyZWRTZXQoWzEsIDIsIDNdKS5pc3N1YnNldCh7MSwgMiwgMywgNH0pCiAgICAgICAgICAgIFRydWUKICAgICAgICAgICAgPj4+IE9yZGVyZWRTZXQoWzEsIDIsIDNdKS5pc3N1YnNldCh7MSwgNCwgMywgNX0pCiAgICAgICAgICAgIEZhbHNlCiAgICAgICAgIiIiCiAgICAgICAgaWYgbGVuKHNlbGYpID4gbGVuKG90aGVyKTogICMgRmFzdCBjaGVjayBmb3Igb2J2aW91cyBjYXNlcwogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICByZXR1cm4gYWxsKGl0ZW0gaW4gb3RoZXIgZm9yIGl0ZW0gaW4gc2VsZikKCiAgICBkZWYgaXNzdXBlcnNldChzZWxmLCBvdGhlcik6CiAgICAgICAgIiIiCiAgICAgICAgUmVwb3J0IHdoZXRoZXIgdGhpcyBzZXQgY29udGFpbnMgYW5vdGhlciBzZXQuCgogICAgICAgIEV4YW1wbGU6CiAgICAgICAgICAgID4+PiBPcmRlcmVkU2V0KFsxLCAyXSkuaXNzdXBlcnNldChbMSwgMiwgM10pCiAgICAgICAgICAgIEZhbHNlCiAgICAgICAgICAgID4+PiBPcmRlcmVkU2V0KFsxLCAyLCAzLCA0XSkuaXNzdXBlcnNldCh7MSwgMiwgM30pCiAgICAgICAgICAgIFRydWUKICAgICAgICAgICAgPj4+IE9yZGVyZWRTZXQoWzEsIDQsIDMsIDVdKS5pc3N1cGVyc2V0KHsxLCAyLCAzfSkKICAgICAgICAgICAgRmFsc2UKICAgICAgICAiIiIKICAgICAgICBpZiBsZW4oc2VsZikgPCBsZW4ob3RoZXIpOiAgIyBGYXN0IGNoZWNrIGZvciBvYnZpb3VzIGNhc2VzCiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIHJldHVybiBhbGwoaXRlbSBpbiBzZWxmIGZvciBpdGVtIGluIG90aGVyKQoKICAgIGRlZiBzeW1tZXRyaWNfZGlmZmVyZW5jZShzZWxmLCBvdGhlcik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIHRoZSBzeW1tZXRyaWMgZGlmZmVyZW5jZSBvZiB0d28gT3JkZXJlZFNldHMgYXMgYSBuZXcgc2V0LgogICAgICAgIFRoYXQgaXMsIHRoZSBuZXcgc2V0IHdpbGwgY29udGFpbiBhbGwgZWxlbWVudHMgdGhhdCBhcmUgaW4gZXhhY3RseQogICAgICAgIG9uZSBvZiB0aGUgc2V0cy4KCiAgICAgICAgVGhlaXIgb3JkZXIgd2lsbCBiZSBwcmVzZXJ2ZWQsIHdpdGggZWxlbWVudHMgZnJvbSBgc2VsZmAgcHJlY2VkaW5nCiAgICAgICAgZWxlbWVudHMgZnJvbSBgb3RoZXJgLgoKICAgICAgICBFeGFtcGxlOgogICAgICAgICAgICA+Pj4gdGhpcyA9IE9yZGVyZWRTZXQoWzEsIDQsIDMsIDUsIDddKQogICAgICAgICAgICA+Pj4gb3RoZXIgPSBPcmRlcmVkU2V0KFs5LCA3LCAxLCAzLCAyXSkKICAgICAgICAgICAgPj4+IHRoaXMuc3ltbWV0cmljX2RpZmZlcmVuY2Uob3RoZXIpCiAgICAgICAgICAgIE9yZGVyZWRTZXQoWzQsIDUsIDksIDJdKQogICAgICAgICIiIgogICAgICAgIGNscyA9IHNlbGYuX19jbGFzc19fIGlmIGlzaW5zdGFuY2Uoc2VsZiwgT3JkZXJlZFNldCkgZWxzZSBPcmRlcmVkU2V0CiAgICAgICAgZGlmZjEgPSBjbHMoc2VsZikuZGlmZmVyZW5jZShvdGhlcikKICAgICAgICBkaWZmMiA9IGNscyhvdGhlcikuZGlmZmVyZW5jZShzZWxmKQogICAgICAgIHJldHVybiBkaWZmMS51bmlvbihkaWZmMikKCiAgICBkZWYgX3VwZGF0ZV9pdGVtcyhzZWxmLCBpdGVtcyk6CiAgICAgICAgIiIiCiAgICAgICAgUmVwbGFjZSB0aGUgJ2l0ZW1zJyBsaXN0IG9mIHRoaXMgT3JkZXJlZFNldCB3aXRoIGEgbmV3IG9uZSwgdXBkYXRpbmcKICAgICAgICBzZWxmLm1hcCBhY2NvcmRpbmdseS4KICAgICAgICAiIiIKICAgICAgICBzZWxmLml0ZW1zID0gaXRlbXMKICAgICAgICBzZWxmLm1hcCA9IHtpdGVtOiBpZHggZm9yIChpZHgsIGl0ZW0pIGluIGVudW1lcmF0ZShpdGVtcyl9CgogICAgZGVmIGRpZmZlcmVuY2VfdXBkYXRlKHNlbGYsICpzZXRzKToKICAgICAgICAiIiIKICAgICAgICBVcGRhdGUgdGhpcyBPcmRlcmVkU2V0IHRvIHJlbW92ZSBpdGVtcyBmcm9tIG9uZSBvciBtb3JlIG90aGVyIHNldHMuCgogICAgICAgIEV4YW1wbGU6CiAgICAgICAgICAgID4+PiB0aGlzID0gT3JkZXJlZFNldChbMSwgMiwgM10pCiAgICAgICAgICAgID4+PiB0aGlzLmRpZmZlcmVuY2VfdXBkYXRlKE9yZGVyZWRTZXQoWzIsIDRdKSkKICAgICAgICAgICAgPj4+IHByaW50KHRoaXMpCiAgICAgICAgICAgIE9yZGVyZWRTZXQoWzEsIDNdKQoKICAgICAgICAgICAgPj4+IHRoaXMgPSBPcmRlcmVkU2V0KFsxLCAyLCAzLCA0LCA1XSkKICAgICAgICAgICAgPj4+IHRoaXMuZGlmZmVyZW5jZV91cGRhdGUoT3JkZXJlZFNldChbMiwgNF0pLCBPcmRlcmVkU2V0KFsxLCA0LCA2XSkpCiAgICAgICAgICAgID4+PiBwcmludCh0aGlzKQogICAgICAgICAgICBPcmRlcmVkU2V0KFszLCA1XSkKICAgICAgICAiIiIKICAgICAgICBpdGVtc190b19yZW1vdmUgPSBzZXQoKQogICAgICAgIGZvciBvdGhlciBpbiBzZXRzOgogICAgICAgICAgICBpdGVtc190b19yZW1vdmUgfD0gc2V0KG90aGVyKQogICAgICAgIHNlbGYuX3VwZGF0ZV9pdGVtcyhbaXRlbSBmb3IgaXRlbSBpbiBzZWxmLml0ZW1zIGlmIGl0ZW0gbm90IGluIGl0ZW1zX3RvX3JlbW92ZV0pCgogICAgZGVmIGludGVyc2VjdGlvbl91cGRhdGUoc2VsZiwgb3RoZXIpOgogICAgICAgICIiIgogICAgICAgIFVwZGF0ZSB0aGlzIE9yZGVyZWRTZXQgdG8ga2VlcCBvbmx5IGl0ZW1zIGluIGFub3RoZXIgc2V0LCBwcmVzZXJ2aW5nCiAgICAgICAgdGhlaXIgb3JkZXIgaW4gdGhpcyBzZXQuCgogICAgICAgIEV4YW1wbGU6CiAgICAgICAgICAgID4+PiB0aGlzID0gT3JkZXJlZFNldChbMSwgNCwgMywgNSwgN10pCiAgICAgICAgICAgID4+PiBvdGhlciA9IE9yZGVyZWRTZXQoWzksIDcsIDEsIDMsIDJdKQogICAgICAgICAgICA+Pj4gdGhpcy5pbnRlcnNlY3Rpb25fdXBkYXRlKG90aGVyKQogICAgICAgICAgICA+Pj4gcHJpbnQodGhpcykKICAgICAgICAgICAgT3JkZXJlZFNldChbMSwgMywgN10pCiAgICAgICAgIiIiCiAgICAgICAgb3RoZXIgPSBzZXQob3RoZXIpCiAgICAgICAgc2VsZi5fdXBkYXRlX2l0ZW1zKFtpdGVtIGZvciBpdGVtIGluIHNlbGYuaXRlbXMgaWYgaXRlbSBpbiBvdGhlcl0pCgogICAgZGVmIHN5bW1ldHJpY19kaWZmZXJlbmNlX3VwZGF0ZShzZWxmLCBvdGhlcik6CiAgICAgICAgIiIiCiAgICAgICAgVXBkYXRlIHRoaXMgT3JkZXJlZFNldCB0byByZW1vdmUgaXRlbXMgZnJvbSBhbm90aGVyIHNldCwgdGhlbgogICAgICAgIGFkZCBpdGVtcyBmcm9tIHRoZSBvdGhlciBzZXQgdGhhdCB3ZXJlIG5vdCBwcmVzZW50IGluIHRoaXMgc2V0LgoKICAgICAgICBFeGFtcGxlOgogICAgICAgICAgICA+Pj4gdGhpcyA9IE9yZGVyZWRTZXQoWzEsIDQsIDMsIDUsIDddKQogICAgICAgICAgICA+Pj4gb3RoZXIgPSBPcmRlcmVkU2V0KFs5LCA3LCAxLCAzLCAyXSkKICAgICAgICAgICAgPj4+IHRoaXMuc3ltbWV0cmljX2RpZmZlcmVuY2VfdXBkYXRlKG90aGVyKQogICAgICAgICAgICA+Pj4gcHJpbnQodGhpcykKICAgICAgICAgICAgT3JkZXJlZFNldChbNCwgNSwgOSwgMl0pCiAgICAgICAgIiIiCiAgICAgICAgaXRlbXNfdG9fYWRkID0gW2l0ZW0gZm9yIGl0ZW0gaW4gb3RoZXIgaWYgaXRlbSBub3QgaW4gc2VsZl0KICAgICAgICBpdGVtc190b19yZW1vdmUgPSBzZXQob3RoZXIpCiAgICAgICAgc2VsZi5fdXBkYXRlX2l0ZW1zKAogICAgICAgICAgICBbaXRlbSBmb3IgaXRlbSBpbiBzZWxmLml0ZW1zIGlmIGl0ZW0gbm90IGluIGl0ZW1zX3RvX3JlbW92ZV0gKyBpdGVtc190b19hZGQKICAgICAgICApClBLAwQUAAAAAAAAACEAitd/0OgCAADoAgAATgAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL192ZW5kb3IvcGFja2FnaW5nL19fYWJvdXRfXy5weSMgVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbgojIDIuMCwgYW5kIHRoZSBCU0QgTGljZW5zZS4gU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyByZXBvc2l0b3J5CiMgZm9yIGNvbXBsZXRlIGRldGFpbHMuCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgcHJpbnRfZnVuY3Rpb24KCl9fYWxsX18gPSBbCiAgICAiX190aXRsZV9fIiwKICAgICJfX3N1bW1hcnlfXyIsCiAgICAiX191cmlfXyIsCiAgICAiX192ZXJzaW9uX18iLAogICAgIl9fYXV0aG9yX18iLAogICAgIl9fZW1haWxfXyIsCiAgICAiX19saWNlbnNlX18iLAogICAgIl9fY29weXJpZ2h0X18iLApdCgpfX3RpdGxlX18gPSAicGFja2FnaW5nIgpfX3N1bW1hcnlfXyA9ICJDb3JlIHV0aWxpdGllcyBmb3IgUHl0aG9uIHBhY2thZ2VzIgpfX3VyaV9fID0gImh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3BhY2thZ2luZyIKCl9fdmVyc2lvbl9fID0gIjE5LjIiCgpfX2F1dGhvcl9fID0gIkRvbmFsZCBTdHVmZnQgYW5kIGluZGl2aWR1YWwgY29udHJpYnV0b3JzIgpfX2VtYWlsX18gPSAiZG9uYWxkQHN0dWZmdC5pbyIKCl9fbGljZW5zZV9fID0gIkJTRCBvciBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAiCl9fY29weXJpZ2h0X18gPSAiQ29weXJpZ2h0IDIwMTQtMjAxOSAlcyIgJSBfX2F1dGhvcl9fClBLAwQUAAAAAAAAACEAZRsRRDICAAAyAgAATQAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL192ZW5kb3IvcGFja2FnaW5nL19faW5pdF9fLnB5IyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uCiMgMi4wLCBhbmQgdGhlIEJTRCBMaWNlbnNlLiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHJlcG9zaXRvcnkKIyBmb3IgY29tcGxldGUgZGV0YWlscy4KZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCBwcmludF9mdW5jdGlvbgoKZnJvbSAuX19hYm91dF9fIGltcG9ydCAoCiAgICBfX2F1dGhvcl9fLAogICAgX19jb3B5cmlnaHRfXywKICAgIF9fZW1haWxfXywKICAgIF9fbGljZW5zZV9fLAogICAgX19zdW1tYXJ5X18sCiAgICBfX3RpdGxlX18sCiAgICBfX3VyaV9fLAogICAgX192ZXJzaW9uX18sCikKCl9fYWxsX18gPSBbCiAgICAiX190aXRsZV9fIiwKICAgICJfX3N1bW1hcnlfXyIsCiAgICAiX191cmlfXyIsCiAgICAiX192ZXJzaW9uX18iLAogICAgIl9fYXV0aG9yX18iLAogICAgIl9fZW1haWxfXyIsCiAgICAiX19saWNlbnNlX18iLAogICAgIl9fY29weXJpZ2h0X18iLApdClBLAwQUAAAAAAAAACEAZora42EDAABhAwAATAAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL192ZW5kb3IvcGFja2FnaW5nL19jb21wYXQucHkjIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24KIyAyLjAsIGFuZCB0aGUgQlNEIExpY2Vuc2UuIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcmVwb3NpdG9yeQojIGZvciBjb21wbGV0ZSBkZXRhaWxzLgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHByaW50X2Z1bmN0aW9uCgppbXBvcnQgc3lzCgoKUFkyID0gc3lzLnZlcnNpb25faW5mb1swXSA9PSAyClBZMyA9IHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMwoKIyBmbGFrZTg6IG5vcWEKCmlmIFBZMzoKICAgIHN0cmluZ190eXBlcyA9IChzdHIsKQplbHNlOgogICAgc3RyaW5nX3R5cGVzID0gKGJhc2VzdHJpbmcsKQoKCmRlZiB3aXRoX21ldGFjbGFzcyhtZXRhLCAqYmFzZXMpOgogICAgIiIiCiAgICBDcmVhdGUgYSBiYXNlIGNsYXNzIHdpdGggYSBtZXRhY2xhc3MuCiAgICAiIiIKICAgICMgVGhpcyByZXF1aXJlcyBhIGJpdCBvZiBleHBsYW5hdGlvbjogdGhlIGJhc2ljIGlkZWEgaXMgdG8gbWFrZSBhIGR1bW15CiAgICAjIG1ldGFjbGFzcyBmb3Igb25lIGxldmVsIG9mIGNsYXNzIGluc3RhbnRpYXRpb24gdGhhdCByZXBsYWNlcyBpdHNlbGYgd2l0aAogICAgIyB0aGUgYWN0dWFsIG1ldGFjbGFzcy4KICAgIGNsYXNzIG1ldGFjbGFzcyhtZXRhKToKICAgICAgICBkZWYgX19uZXdfXyhjbHMsIG5hbWUsIHRoaXNfYmFzZXMsIGQpOgogICAgICAgICAgICByZXR1cm4gbWV0YShuYW1lLCBiYXNlcywgZCkKCiAgICByZXR1cm4gdHlwZS5fX25ld19fKG1ldGFjbGFzcywgInRlbXBvcmFyeV9jbGFzcyIsICgpLCB7fSkKUEsDBBQAAAAAAAAAIQBrjxyViAUAAIgFAABQAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvX3ZlbmRvci9wYWNrYWdpbmcvX3N0cnVjdHVyZXMucHkjIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24KIyAyLjAsIGFuZCB0aGUgQlNEIExpY2Vuc2UuIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcmVwb3NpdG9yeQojIGZvciBjb21wbGV0ZSBkZXRhaWxzLgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHByaW50X2Z1bmN0aW9uCgoKY2xhc3MgSW5maW5pdHkob2JqZWN0KToKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIkluZmluaXR5IgoKICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKICAgICAgICByZXR1cm4gaGFzaChyZXByKHNlbGYpKQoKICAgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGRlZiBfX2xlX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXykKCiAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gbm90IGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKQoKICAgIGRlZiBfX2d0X18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIF9fZ2VfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgX19uZWdfXyhzZWxmKToKICAgICAgICByZXR1cm4gTmVnYXRpdmVJbmZpbml0eQoKCkluZmluaXR5ID0gSW5maW5pdHkoKQoKCmNsYXNzIE5lZ2F0aXZlSW5maW5pdHkob2JqZWN0KToKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIi1JbmZpbml0eSIKCiAgICBkZWYgX19oYXNoX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGhhc2gocmVwcihzZWxmKSkKCiAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBfX2xlX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKQoKICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBub3QgaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pCgogICAgZGVmIF9fZ3RfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZGVmIF9fZ2VfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZGVmIF9fbmVnX18oc2VsZik6CiAgICAgICAgcmV0dXJuIEluZmluaXR5CgoKTmVnYXRpdmVJbmZpbml0eSA9IE5lZ2F0aXZlSW5maW5pdHkoKQpQSwMEFAAAAAAAAAAhAC854rJMIAAATCAAAEwAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9fdmVuZG9yL3BhY2thZ2luZy9tYXJrZXJzLnB5IyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uCiMgMi4wLCBhbmQgdGhlIEJTRCBMaWNlbnNlLiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHJlcG9zaXRvcnkKIyBmb3IgY29tcGxldGUgZGV0YWlscy4KZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCBwcmludF9mdW5jdGlvbgoKaW1wb3J0IG9wZXJhdG9yCmltcG9ydCBvcwppbXBvcnQgcGxhdGZvcm0KaW1wb3J0IHN5cwoKZnJvbSBzZXR1cHRvb2xzLmV4dGVybi5weXBhcnNpbmcgaW1wb3J0IFBhcnNlRXhjZXB0aW9uLCBQYXJzZVJlc3VsdHMsIHN0cmluZ1N0YXJ0LCBzdHJpbmdFbmQKZnJvbSBzZXR1cHRvb2xzLmV4dGVybi5weXBhcnNpbmcgaW1wb3J0IFplcm9Pck1vcmUsIEdyb3VwLCBGb3J3YXJkLCBRdW90ZWRTdHJpbmcKZnJvbSBzZXR1cHRvb2xzLmV4dGVybi5weXBhcnNpbmcgaW1wb3J0IExpdGVyYWwgYXMgTCAgIyBub3FhCgpmcm9tIC5fY29tcGF0IGltcG9ydCBzdHJpbmdfdHlwZXMKZnJvbSAuc3BlY2lmaWVycyBpbXBvcnQgU3BlY2lmaWVyLCBJbnZhbGlkU3BlY2lmaWVyCgoKX19hbGxfXyA9IFsKICAgICJJbnZhbGlkTWFya2VyIiwKICAgICJVbmRlZmluZWRDb21wYXJpc29uIiwKICAgICJVbmRlZmluZWRFbnZpcm9ubWVudE5hbWUiLAogICAgIk1hcmtlciIsCiAgICAiZGVmYXVsdF9lbnZpcm9ubWVudCIsCl0KCgpjbGFzcyBJbnZhbGlkTWFya2VyKFZhbHVlRXJyb3IpOgogICAgIiIiCiAgICBBbiBpbnZhbGlkIG1hcmtlciB3YXMgZm91bmQsIHVzZXJzIHNob3VsZCByZWZlciB0byBQRVAgNTA4LgogICAgIiIiCgoKY2xhc3MgVW5kZWZpbmVkQ29tcGFyaXNvbihWYWx1ZUVycm9yKToKICAgICIiIgogICAgQW4gaW52YWxpZCBvcGVyYXRpb24gd2FzIGF0dGVtcHRlZCBvbiBhIHZhbHVlIHRoYXQgZG9lc24ndCBzdXBwb3J0IGl0LgogICAgIiIiCgoKY2xhc3MgVW5kZWZpbmVkRW52aXJvbm1lbnROYW1lKFZhbHVlRXJyb3IpOgogICAgIiIiCiAgICBBIG5hbWUgd2FzIGF0dGVtcHRlZCB0byBiZSB1c2VkIHRoYXQgZG9lcyBub3QgZXhpc3QgaW5zaWRlIG9mIHRoZQogICAgZW52aXJvbm1lbnQuCiAgICAiIiIKCgpjbGFzcyBOb2RlKG9iamVjdCk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgdmFsdWUpOgogICAgICAgIHNlbGYudmFsdWUgPSB2YWx1ZQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJldHVybiBzdHIoc2VsZi52YWx1ZSkKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICI8ezB9KHsxIXJ9KT4iLmZvcm1hdChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgc3RyKHNlbGYpKQoKICAgIGRlZiBzZXJpYWxpemUoc2VsZik6CiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgoKCmNsYXNzIFZhcmlhYmxlKE5vZGUpOgogICAgZGVmIHNlcmlhbGl6ZShzZWxmKToKICAgICAgICByZXR1cm4gc3RyKHNlbGYpCgoKY2xhc3MgVmFsdWUoTm9kZSk6CiAgICBkZWYgc2VyaWFsaXplKHNlbGYpOgogICAgICAgIHJldHVybiAnInswfSInLmZvcm1hdChzZWxmKQoKCmNsYXNzIE9wKE5vZGUpOgogICAgZGVmIHNlcmlhbGl6ZShzZWxmKToKICAgICAgICByZXR1cm4gc3RyKHNlbGYpCgoKVkFSSUFCTEUgPSAoCiAgICBMKCJpbXBsZW1lbnRhdGlvbl92ZXJzaW9uIikKICAgIHwgTCgicGxhdGZvcm1fcHl0aG9uX2ltcGxlbWVudGF0aW9uIikKICAgIHwgTCgiaW1wbGVtZW50YXRpb25fbmFtZSIpCiAgICB8IEwoInB5dGhvbl9mdWxsX3ZlcnNpb24iKQogICAgfCBMKCJwbGF0Zm9ybV9yZWxlYXNlIikKICAgIHwgTCgicGxhdGZvcm1fdmVyc2lvbiIpCiAgICB8IEwoInBsYXRmb3JtX21hY2hpbmUiKQogICAgfCBMKCJwbGF0Zm9ybV9zeXN0ZW0iKQogICAgfCBMKCJweXRob25fdmVyc2lvbiIpCiAgICB8IEwoInN5c19wbGF0Zm9ybSIpCiAgICB8IEwoIm9zX25hbWUiKQogICAgfCBMKCJvcy5uYW1lIikKICAgIHwgTCgic3lzLnBsYXRmb3JtIikgICMgUEVQLTM0NQogICAgfCBMKCJwbGF0Zm9ybS52ZXJzaW9uIikgICMgUEVQLTM0NQogICAgfCBMKCJwbGF0Zm9ybS5tYWNoaW5lIikgICMgUEVQLTM0NQogICAgfCBMKCJwbGF0Zm9ybS5weXRob25faW1wbGVtZW50YXRpb24iKSAgIyBQRVAtMzQ1CiAgICB8IEwoInB5dGhvbl9pbXBsZW1lbnRhdGlvbiIpICAjIFBFUC0zNDUKICAgIHwgTCgiZXh0cmEiKSAgIyB1bmRvY3VtZW50ZWQgc2V0dXB0b29scyBsZWdhY3kKKQpBTElBU0VTID0gewogICAgIm9zLm5hbWUiOiAib3NfbmFtZSIsCiAgICAic3lzLnBsYXRmb3JtIjogInN5c19wbGF0Zm9ybSIsCiAgICAicGxhdGZvcm0udmVyc2lvbiI6ICJwbGF0Zm9ybV92ZXJzaW9uIiwKICAgICJwbGF0Zm9ybS5tYWNoaW5lIjogInBsYXRmb3JtX21hY2hpbmUiLAogICAgInBsYXRmb3JtLnB5dGhvbl9pbXBsZW1lbnRhdGlvbiI6ICJwbGF0Zm9ybV9weXRob25faW1wbGVtZW50YXRpb24iLAogICAgInB5dGhvbl9pbXBsZW1lbnRhdGlvbiI6ICJwbGF0Zm9ybV9weXRob25faW1wbGVtZW50YXRpb24iLAp9ClZBUklBQkxFLnNldFBhcnNlQWN0aW9uKGxhbWJkYSBzLCBsLCB0OiBWYXJpYWJsZShBTElBU0VTLmdldCh0WzBdLCB0WzBdKSkpCgpWRVJTSU9OX0NNUCA9ICgKICAgIEwoIj09PSIpIHwgTCgiPT0iKSB8IEwoIj49IikgfCBMKCI8PSIpIHwgTCgiIT0iKSB8IEwoIn49IikgfCBMKCI+IikgfCBMKCI8IikKKQoKTUFSS0VSX09QID0gVkVSU0lPTl9DTVAgfCBMKCJub3QgaW4iKSB8IEwoImluIikKTUFSS0VSX09QLnNldFBhcnNlQWN0aW9uKGxhbWJkYSBzLCBsLCB0OiBPcCh0WzBdKSkKCk1BUktFUl9WQUxVRSA9IFF1b3RlZFN0cmluZygiJyIpIHwgUXVvdGVkU3RyaW5nKCciJykKTUFSS0VSX1ZBTFVFLnNldFBhcnNlQWN0aW9uKGxhbWJkYSBzLCBsLCB0OiBWYWx1ZSh0WzBdKSkKCkJPT0xPUCA9IEwoImFuZCIpIHwgTCgib3IiKQoKTUFSS0VSX1ZBUiA9IFZBUklBQkxFIHwgTUFSS0VSX1ZBTFVFCgpNQVJLRVJfSVRFTSA9IEdyb3VwKE1BUktFUl9WQVIgKyBNQVJLRVJfT1AgKyBNQVJLRVJfVkFSKQpNQVJLRVJfSVRFTS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcywgbCwgdDogdHVwbGUodFswXSkpCgpMUEFSRU4gPSBMKCIoIikuc3VwcHJlc3MoKQpSUEFSRU4gPSBMKCIpIikuc3VwcHJlc3MoKQoKTUFSS0VSX0VYUFIgPSBGb3J3YXJkKCkKTUFSS0VSX0FUT00gPSBNQVJLRVJfSVRFTSB8IEdyb3VwKExQQVJFTiArIE1BUktFUl9FWFBSICsgUlBBUkVOKQpNQVJLRVJfRVhQUiA8PCBNQVJLRVJfQVRPTSArIFplcm9Pck1vcmUoQk9PTE9QICsgTUFSS0VSX0VYUFIpCgpNQVJLRVIgPSBzdHJpbmdTdGFydCArIE1BUktFUl9FWFBSICsgc3RyaW5nRW5kCgoKZGVmIF9jb2VyY2VfcGFyc2VfcmVzdWx0KHJlc3VsdHMpOgogICAgaWYgaXNpbnN0YW5jZShyZXN1bHRzLCBQYXJzZVJlc3VsdHMpOgogICAgICAgIHJldHVybiBbX2NvZXJjZV9wYXJzZV9yZXN1bHQoaSkgZm9yIGkgaW4gcmVzdWx0c10KICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIHJlc3VsdHMKCgpkZWYgX2Zvcm1hdF9tYXJrZXIobWFya2VyLCBmaXJzdD1UcnVlKToKICAgIGFzc2VydCBpc2luc3RhbmNlKG1hcmtlciwgKGxpc3QsIHR1cGxlLCBzdHJpbmdfdHlwZXMpKQoKICAgICMgU29tZXRpbWVzIHdlIGhhdmUgYSBzdHJ1Y3R1cmUgbGlrZSBbWy4uLl1dIHdoaWNoIGlzIGEgc2luZ2xlIGl0ZW0gbGlzdAogICAgIyB3aGVyZSB0aGUgc2luZ2xlIGl0ZW0gaXMgaXRzZWxmIGl0J3Mgb3duIGxpc3QuIEluIHRoYXQgY2FzZSB3ZSB3YW50IHNraXAKICAgICMgdGhlIHJlc3Qgb2YgdGhpcyBmdW5jdGlvbiBzbyB0aGF0IHdlIGRvbid0IGdldCBleHRyYW5lb3VzICgpIG9uIHRoZQogICAgIyBvdXRzaWRlLgogICAgaWYgKAogICAgICAgIGlzaW5zdGFuY2UobWFya2VyLCBsaXN0KQogICAgICAgIGFuZCBsZW4obWFya2VyKSA9PSAxCiAgICAgICAgYW5kIGlzaW5zdGFuY2UobWFya2VyWzBdLCAobGlzdCwgdHVwbGUpKQogICAgKToKICAgICAgICByZXR1cm4gX2Zvcm1hdF9tYXJrZXIobWFya2VyWzBdKQoKICAgIGlmIGlzaW5zdGFuY2UobWFya2VyLCBsaXN0KToKICAgICAgICBpbm5lciA9IChfZm9ybWF0X21hcmtlcihtLCBmaXJzdD1GYWxzZSkgZm9yIG0gaW4gbWFya2VyKQogICAgICAgIGlmIGZpcnN0OgogICAgICAgICAgICByZXR1cm4gIiAiLmpvaW4oaW5uZXIpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuICIoIiArICIgIi5qb2luKGlubmVyKSArICIpIgogICAgZWxpZiBpc2luc3RhbmNlKG1hcmtlciwgdHVwbGUpOgogICAgICAgIHJldHVybiAiICIuam9pbihbbS5zZXJpYWxpemUoKSBmb3IgbSBpbiBtYXJrZXJdKQogICAgZWxzZToKICAgICAgICByZXR1cm4gbWFya2VyCgoKX29wZXJhdG9ycyA9IHsKICAgICJpbiI6IGxhbWJkYSBsaHMsIHJoczogbGhzIGluIHJocywKICAgICJub3QgaW4iOiBsYW1iZGEgbGhzLCByaHM6IGxocyBub3QgaW4gcmhzLAogICAgIjwiOiBvcGVyYXRvci5sdCwKICAgICI8PSI6IG9wZXJhdG9yLmxlLAogICAgIj09Ijogb3BlcmF0b3IuZXEsCiAgICAiIT0iOiBvcGVyYXRvci5uZSwKICAgICI+PSI6IG9wZXJhdG9yLmdlLAogICAgIj4iOiBvcGVyYXRvci5ndCwKfQoKCmRlZiBfZXZhbF9vcChsaHMsIG9wLCByaHMpOgogICAgdHJ5OgogICAgICAgIHNwZWMgPSBTcGVjaWZpZXIoIiIuam9pbihbb3Auc2VyaWFsaXplKCksIHJoc10pKQogICAgZXhjZXB0IEludmFsaWRTcGVjaWZpZXI6CiAgICAgICAgcGFzcwogICAgZWxzZToKICAgICAgICByZXR1cm4gc3BlYy5jb250YWlucyhsaHMpCgogICAgb3BlciA9IF9vcGVyYXRvcnMuZ2V0KG9wLnNlcmlhbGl6ZSgpKQogICAgaWYgb3BlciBpcyBOb25lOgogICAgICAgIHJhaXNlIFVuZGVmaW5lZENvbXBhcmlzb24oCiAgICAgICAgICAgICJVbmRlZmluZWQgezAhcn0gb24gezEhcn0gYW5kIHsyIXJ9LiIuZm9ybWF0KG9wLCBsaHMsIHJocykKICAgICAgICApCgogICAgcmV0dXJuIG9wZXIobGhzLCByaHMpCgoKX3VuZGVmaW5lZCA9IG9iamVjdCgpCgoKZGVmIF9nZXRfZW52KGVudmlyb25tZW50LCBuYW1lKToKICAgIHZhbHVlID0gZW52aXJvbm1lbnQuZ2V0KG5hbWUsIF91bmRlZmluZWQpCgogICAgaWYgdmFsdWUgaXMgX3VuZGVmaW5lZDoKICAgICAgICByYWlzZSBVbmRlZmluZWRFbnZpcm9ubWVudE5hbWUoCiAgICAgICAgICAgICJ7MCFyfSBkb2VzIG5vdCBleGlzdCBpbiBldmFsdWF0aW9uIGVudmlyb25tZW50LiIuZm9ybWF0KG5hbWUpCiAgICAgICAgKQoKICAgIHJldHVybiB2YWx1ZQoKCmRlZiBfZXZhbHVhdGVfbWFya2VycyhtYXJrZXJzLCBlbnZpcm9ubWVudCk6CiAgICBncm91cHMgPSBbW11dCgogICAgZm9yIG1hcmtlciBpbiBtYXJrZXJzOgogICAgICAgIGFzc2VydCBpc2luc3RhbmNlKG1hcmtlciwgKGxpc3QsIHR1cGxlLCBzdHJpbmdfdHlwZXMpKQoKICAgICAgICBpZiBpc2luc3RhbmNlKG1hcmtlciwgbGlzdCk6CiAgICAgICAgICAgIGdyb3Vwc1stMV0uYXBwZW5kKF9ldmFsdWF0ZV9tYXJrZXJzKG1hcmtlciwgZW52aXJvbm1lbnQpKQogICAgICAgIGVsaWYgaXNpbnN0YW5jZShtYXJrZXIsIHR1cGxlKToKICAgICAgICAgICAgbGhzLCBvcCwgcmhzID0gbWFya2VyCgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGxocywgVmFyaWFibGUpOgogICAgICAgICAgICAgICAgbGhzX3ZhbHVlID0gX2dldF9lbnYoZW52aXJvbm1lbnQsIGxocy52YWx1ZSkKICAgICAgICAgICAgICAgIHJoc192YWx1ZSA9IHJocy52YWx1ZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgbGhzX3ZhbHVlID0gbGhzLnZhbHVlCiAgICAgICAgICAgICAgICByaHNfdmFsdWUgPSBfZ2V0X2VudihlbnZpcm9ubWVudCwgcmhzLnZhbHVlKQoKICAgICAgICAgICAgZ3JvdXBzWy0xXS5hcHBlbmQoX2V2YWxfb3AobGhzX3ZhbHVlLCBvcCwgcmhzX3ZhbHVlKSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBhc3NlcnQgbWFya2VyIGluIFsiYW5kIiwgIm9yIl0KICAgICAgICAgICAgaWYgbWFya2VyID09ICJvciI6CiAgICAgICAgICAgICAgICBncm91cHMuYXBwZW5kKFtdKQoKICAgIHJldHVybiBhbnkoYWxsKGl0ZW0pIGZvciBpdGVtIGluIGdyb3VwcykKCgpkZWYgZm9ybWF0X2Z1bGxfdmVyc2lvbihpbmZvKToKICAgIHZlcnNpb24gPSAiezAubWFqb3J9LnswLm1pbm9yfS57MC5taWNyb30iLmZvcm1hdChpbmZvKQogICAga2luZCA9IGluZm8ucmVsZWFzZWxldmVsCiAgICBpZiBraW5kICE9ICJmaW5hbCI6CiAgICAgICAgdmVyc2lvbiArPSBraW5kWzBdICsgc3RyKGluZm8uc2VyaWFsKQogICAgcmV0dXJuIHZlcnNpb24KCgpkZWYgZGVmYXVsdF9lbnZpcm9ubWVudCgpOgogICAgaWYgaGFzYXR0cihzeXMsICJpbXBsZW1lbnRhdGlvbiIpOgogICAgICAgIGl2ZXIgPSBmb3JtYXRfZnVsbF92ZXJzaW9uKHN5cy5pbXBsZW1lbnRhdGlvbi52ZXJzaW9uKQogICAgICAgIGltcGxlbWVudGF0aW9uX25hbWUgPSBzeXMuaW1wbGVtZW50YXRpb24ubmFtZQogICAgZWxzZToKICAgICAgICBpdmVyID0gIjAiCiAgICAgICAgaW1wbGVtZW50YXRpb25fbmFtZSA9ICIiCgogICAgcmV0dXJuIHsKICAgICAgICAiaW1wbGVtZW50YXRpb25fbmFtZSI6IGltcGxlbWVudGF0aW9uX25hbWUsCiAgICAgICAgImltcGxlbWVudGF0aW9uX3ZlcnNpb24iOiBpdmVyLAogICAgICAgICJvc19uYW1lIjogb3MubmFtZSwKICAgICAgICAicGxhdGZvcm1fbWFjaGluZSI6IHBsYXRmb3JtLm1hY2hpbmUoKSwKICAgICAgICAicGxhdGZvcm1fcmVsZWFzZSI6IHBsYXRmb3JtLnJlbGVhc2UoKSwKICAgICAgICAicGxhdGZvcm1fc3lzdGVtIjogcGxhdGZvcm0uc3lzdGVtKCksCiAgICAgICAgInBsYXRmb3JtX3ZlcnNpb24iOiBwbGF0Zm9ybS52ZXJzaW9uKCksCiAgICAgICAgInB5dGhvbl9mdWxsX3ZlcnNpb24iOiBwbGF0Zm9ybS5weXRob25fdmVyc2lvbigpLAogICAgICAgICJwbGF0Zm9ybV9weXRob25faW1wbGVtZW50YXRpb24iOiBwbGF0Zm9ybS5weXRob25faW1wbGVtZW50YXRpb24oKSwKICAgICAgICAicHl0aG9uX3ZlcnNpb24iOiAiLiIuam9pbihwbGF0Zm9ybS5weXRob25fdmVyc2lvbl90dXBsZSgpWzoyXSksCiAgICAgICAgInN5c19wbGF0Zm9ybSI6IHN5cy5wbGF0Zm9ybSwKICAgIH0KCgpjbGFzcyBNYXJrZXIob2JqZWN0KToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXJrZXIpOgogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5fbWFya2VycyA9IF9jb2VyY2VfcGFyc2VfcmVzdWx0KE1BUktFUi5wYXJzZVN0cmluZyhtYXJrZXIpKQogICAgICAgIGV4Y2VwdCBQYXJzZUV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICBlcnJfc3RyID0gIkludmFsaWQgbWFya2VyOiB7MCFyfSwgcGFyc2UgZXJyb3IgYXQgezEhcn0iLmZvcm1hdCgKICAgICAgICAgICAgICAgIG1hcmtlciwgbWFya2VyW2UubG9jIDogZS5sb2MgKyA4XQogICAgICAgICAgICApCiAgICAgICAgICAgIHJhaXNlIEludmFsaWRNYXJrZXIoZXJyX3N0cikKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gX2Zvcm1hdF9tYXJrZXIoc2VsZi5fbWFya2VycykKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICI8TWFya2VyKHswIXJ9KT4iLmZvcm1hdChzdHIoc2VsZikpCgogICAgZGVmIGV2YWx1YXRlKHNlbGYsIGVudmlyb25tZW50PU5vbmUpOgogICAgICAgICIiIkV2YWx1YXRlIGEgbWFya2VyLgoKICAgICAgICBSZXR1cm4gdGhlIGJvb2xlYW4gZnJvbSBldmFsdWF0aW5nIHRoZSBnaXZlbiBtYXJrZXIgYWdhaW5zdCB0aGUKICAgICAgICBlbnZpcm9ubWVudC4gZW52aXJvbm1lbnQgaXMgYW4gb3B0aW9uYWwgYXJndW1lbnQgdG8gb3ZlcnJpZGUgYWxsIG9yCiAgICAgICAgcGFydCBvZiB0aGUgZGV0ZXJtaW5lZCBlbnZpcm9ubWVudC4KCiAgICAgICAgVGhlIGVudmlyb25tZW50IGlzIGRldGVybWluZWQgZnJvbSB0aGUgY3VycmVudCBQeXRob24gcHJvY2Vzcy4KICAgICAgICAiIiIKICAgICAgICBjdXJyZW50X2Vudmlyb25tZW50ID0gZGVmYXVsdF9lbnZpcm9ubWVudCgpCiAgICAgICAgaWYgZW52aXJvbm1lbnQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGN1cnJlbnRfZW52aXJvbm1lbnQudXBkYXRlKGVudmlyb25tZW50KQoKICAgICAgICByZXR1cm4gX2V2YWx1YXRlX21hcmtlcnMoc2VsZi5fbWFya2VycywgY3VycmVudF9lbnZpcm9ubWVudCkKUEsDBBQAAAAAAAAAIQA4+ldchhIAAIYSAABRAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvX3ZlbmRvci9wYWNrYWdpbmcvcmVxdWlyZW1lbnRzLnB5IyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uCiMgMi4wLCBhbmQgdGhlIEJTRCBMaWNlbnNlLiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHJlcG9zaXRvcnkKIyBmb3IgY29tcGxldGUgZGV0YWlscy4KZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCBwcmludF9mdW5jdGlvbgoKaW1wb3J0IHN0cmluZwppbXBvcnQgcmUKCmZyb20gc2V0dXB0b29scy5leHRlcm4ucHlwYXJzaW5nIGltcG9ydCBzdHJpbmdTdGFydCwgc3RyaW5nRW5kLCBvcmlnaW5hbFRleHRGb3IsIFBhcnNlRXhjZXB0aW9uCmZyb20gc2V0dXB0b29scy5leHRlcm4ucHlwYXJzaW5nIGltcG9ydCBaZXJvT3JNb3JlLCBXb3JkLCBPcHRpb25hbCwgUmVnZXgsIENvbWJpbmUKZnJvbSBzZXR1cHRvb2xzLmV4dGVybi5weXBhcnNpbmcgaW1wb3J0IExpdGVyYWwgYXMgTCAgIyBub3FhCmZyb20gc2V0dXB0b29scy5leHRlcm4uc2l4Lm1vdmVzLnVybGxpYiBpbXBvcnQgcGFyc2UgYXMgdXJscGFyc2UKCmZyb20gLm1hcmtlcnMgaW1wb3J0IE1BUktFUl9FWFBSLCBNYXJrZXIKZnJvbSAuc3BlY2lmaWVycyBpbXBvcnQgTGVnYWN5U3BlY2lmaWVyLCBTcGVjaWZpZXIsIFNwZWNpZmllclNldAoKCmNsYXNzIEludmFsaWRSZXF1aXJlbWVudChWYWx1ZUVycm9yKToKICAgICIiIgogICAgQW4gaW52YWxpZCByZXF1aXJlbWVudCB3YXMgZm91bmQsIHVzZXJzIHNob3VsZCByZWZlciB0byBQRVAgNTA4LgogICAgIiIiCgoKQUxQSEFOVU0gPSBXb3JkKHN0cmluZy5hc2NpaV9sZXR0ZXJzICsgc3RyaW5nLmRpZ2l0cykKCkxCUkFDS0VUID0gTCgiWyIpLnN1cHByZXNzKCkKUkJSQUNLRVQgPSBMKCJdIikuc3VwcHJlc3MoKQpMUEFSRU4gPSBMKCIoIikuc3VwcHJlc3MoKQpSUEFSRU4gPSBMKCIpIikuc3VwcHJlc3MoKQpDT01NQSA9IEwoIiwiKS5zdXBwcmVzcygpClNFTUlDT0xPTiA9IEwoIjsiKS5zdXBwcmVzcygpCkFUID0gTCgiQCIpLnN1cHByZXNzKCkKClBVTkNUVUFUSU9OID0gV29yZCgiLV8uIikKSURFTlRJRklFUl9FTkQgPSBBTFBIQU5VTSB8IChaZXJvT3JNb3JlKFBVTkNUVUFUSU9OKSArIEFMUEhBTlVNKQpJREVOVElGSUVSID0gQ29tYmluZShBTFBIQU5VTSArIFplcm9Pck1vcmUoSURFTlRJRklFUl9FTkQpKQoKTkFNRSA9IElERU5USUZJRVIoIm5hbWUiKQpFWFRSQSA9IElERU5USUZJRVIKClVSSSA9IFJlZ2V4KHIiW14gXSsiKSgidXJsIikKVVJMID0gQVQgKyBVUkkKCkVYVFJBU19MSVNUID0gRVhUUkEgKyBaZXJvT3JNb3JlKENPTU1BICsgRVhUUkEpCkVYVFJBUyA9IChMQlJBQ0tFVCArIE9wdGlvbmFsKEVYVFJBU19MSVNUKSArIFJCUkFDS0VUKSgiZXh0cmFzIikKClZFUlNJT05fUEVQNDQwID0gUmVnZXgoU3BlY2lmaWVyLl9yZWdleF9zdHIsIHJlLlZFUkJPU0UgfCByZS5JR05PUkVDQVNFKQpWRVJTSU9OX0xFR0FDWSA9IFJlZ2V4KExlZ2FjeVNwZWNpZmllci5fcmVnZXhfc3RyLCByZS5WRVJCT1NFIHwgcmUuSUdOT1JFQ0FTRSkKClZFUlNJT05fT05FID0gVkVSU0lPTl9QRVA0NDAgXiBWRVJTSU9OX0xFR0FDWQpWRVJTSU9OX01BTlkgPSBDb21iaW5lKAogICAgVkVSU0lPTl9PTkUgKyBaZXJvT3JNb3JlKENPTU1BICsgVkVSU0lPTl9PTkUpLCBqb2luU3RyaW5nPSIsIiwgYWRqYWNlbnQ9RmFsc2UKKSgiX3Jhd19zcGVjIikKX1ZFUlNJT05fU1BFQyA9IE9wdGlvbmFsKCgoTFBBUkVOICsgVkVSU0lPTl9NQU5ZICsgUlBBUkVOKSB8IFZFUlNJT05fTUFOWSkpCl9WRVJTSU9OX1NQRUMuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHMsIGwsIHQ6IHQuX3Jhd19zcGVjIG9yICIiKQoKVkVSU0lPTl9TUEVDID0gb3JpZ2luYWxUZXh0Rm9yKF9WRVJTSU9OX1NQRUMpKCJzcGVjaWZpZXIiKQpWRVJTSU9OX1NQRUMuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHMsIGwsIHQ6IHRbMV0pCgpNQVJLRVJfRVhQUiA9IG9yaWdpbmFsVGV4dEZvcihNQVJLRVJfRVhQUigpKSgibWFya2VyIikKTUFSS0VSX0VYUFIuc2V0UGFyc2VBY3Rpb24oCiAgICBsYW1iZGEgcywgbCwgdDogTWFya2VyKHNbdC5fb3JpZ2luYWxfc3RhcnQgOiB0Ll9vcmlnaW5hbF9lbmRdKQopCk1BUktFUl9TRVBBUkFUT1IgPSBTRU1JQ09MT04KTUFSS0VSID0gTUFSS0VSX1NFUEFSQVRPUiArIE1BUktFUl9FWFBSCgpWRVJTSU9OX0FORF9NQVJLRVIgPSBWRVJTSU9OX1NQRUMgKyBPcHRpb25hbChNQVJLRVIpClVSTF9BTkRfTUFSS0VSID0gVVJMICsgT3B0aW9uYWwoTUFSS0VSKQoKTkFNRURfUkVRVUlSRU1FTlQgPSBOQU1FICsgT3B0aW9uYWwoRVhUUkFTKSArIChVUkxfQU5EX01BUktFUiB8IFZFUlNJT05fQU5EX01BUktFUikKClJFUVVJUkVNRU5UID0gc3RyaW5nU3RhcnQgKyBOQU1FRF9SRVFVSVJFTUVOVCArIHN0cmluZ0VuZAojIHNldHVwdG9vbHMuZXh0ZXJuLnB5cGFyc2luZyBpc24ndCB0aHJlYWQgc2FmZSBkdXJpbmcgaW5pdGlhbGl6YXRpb24sIHNvIHdlIGRvIGl0IGVhZ2VybHksIHNlZQojIGlzc3VlICMxMDQKUkVRVUlSRU1FTlQucGFyc2VTdHJpbmcoInhbXSIpCgoKY2xhc3MgUmVxdWlyZW1lbnQob2JqZWN0KToKICAgICIiIlBhcnNlIGEgcmVxdWlyZW1lbnQuCgogICAgUGFyc2UgYSBnaXZlbiByZXF1aXJlbWVudCBzdHJpbmcgaW50byBpdHMgcGFydHMsIHN1Y2ggYXMgbmFtZSwgc3BlY2lmaWVyLAogICAgVVJMLCBhbmQgZXh0cmFzLiBSYWlzZXMgSW52YWxpZFJlcXVpcmVtZW50IG9uIGEgYmFkbHktZm9ybWVkIHJlcXVpcmVtZW50CiAgICBzdHJpbmcuCiAgICAiIiIKCiAgICAjIFRPRE86IENhbiB3ZSB0ZXN0IHdoZXRoZXIgc29tZXRoaW5nIGlzIGNvbnRhaW5lZCB3aXRoaW4gYSByZXF1aXJlbWVudD8KICAgICMgICAgICAgSWYgc28gaG93IGRvIHdlIGRvIHRoYXQ/IERvIHdlIG5lZWQgdG8gdGVzdCBhZ2FpbnN0IHRoZSBfbmFtZV8gb2YKICAgICMgICAgICAgdGhlIHRoaW5nIGFzIHdlbGwgYXMgdGhlIHZlcnNpb24/IFdoYXQgYWJvdXQgdGhlIG1hcmtlcnM/CiAgICAjIFRPRE86IENhbiB3ZSBub3JtYWxpemUgdGhlIG5hbWUgYW5kIGV4dHJhIG5hbWU/CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHJlcXVpcmVtZW50X3N0cmluZyk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXEgPSBSRVFVSVJFTUVOVC5wYXJzZVN0cmluZyhyZXF1aXJlbWVudF9zdHJpbmcpCiAgICAgICAgZXhjZXB0IFBhcnNlRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgIHJhaXNlIEludmFsaWRSZXF1aXJlbWVudCgKICAgICAgICAgICAgICAgICdQYXJzZSBlcnJvciBhdCAiezAhcn0iOiB7MX0nLmZvcm1hdCgKICAgICAgICAgICAgICAgICAgICByZXF1aXJlbWVudF9zdHJpbmdbZS5sb2MgOiBlLmxvYyArIDhdLCBlLm1zZwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICApCgogICAgICAgIHNlbGYubmFtZSA9IHJlcS5uYW1lCiAgICAgICAgaWYgcmVxLnVybDoKICAgICAgICAgICAgcGFyc2VkX3VybCA9IHVybHBhcnNlLnVybHBhcnNlKHJlcS51cmwpCiAgICAgICAgICAgIGlmIHBhcnNlZF91cmwuc2NoZW1lID09ICJmaWxlIjoKICAgICAgICAgICAgICAgIGlmIHVybHBhcnNlLnVybHVucGFyc2UocGFyc2VkX3VybCkgIT0gcmVxLnVybDoKICAgICAgICAgICAgICAgICAgICByYWlzZSBJbnZhbGlkUmVxdWlyZW1lbnQoIkludmFsaWQgVVJMIGdpdmVuIikKICAgICAgICAgICAgZWxpZiBub3QgKHBhcnNlZF91cmwuc2NoZW1lIGFuZCBwYXJzZWRfdXJsLm5ldGxvYykgb3IgKAogICAgICAgICAgICAgICAgbm90IHBhcnNlZF91cmwuc2NoZW1lIGFuZCBub3QgcGFyc2VkX3VybC5uZXRsb2MKICAgICAgICAgICAgKToKICAgICAgICAgICAgICAgIHJhaXNlIEludmFsaWRSZXF1aXJlbWVudCgiSW52YWxpZCBVUkw6IHswfSIuZm9ybWF0KHJlcS51cmwpKQogICAgICAgICAgICBzZWxmLnVybCA9IHJlcS51cmwKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnVybCA9IE5vbmUKICAgICAgICBzZWxmLmV4dHJhcyA9IHNldChyZXEuZXh0cmFzLmFzTGlzdCgpIGlmIHJlcS5leHRyYXMgZWxzZSBbXSkKICAgICAgICBzZWxmLnNwZWNpZmllciA9IFNwZWNpZmllclNldChyZXEuc3BlY2lmaWVyKQogICAgICAgIHNlbGYubWFya2VyID0gcmVxLm1hcmtlciBpZiByZXEubWFya2VyIGVsc2UgTm9uZQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHBhcnRzID0gW3NlbGYubmFtZV0KCiAgICAgICAgaWYgc2VsZi5leHRyYXM6CiAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgiW3swfV0iLmZvcm1hdCgiLCIuam9pbihzb3J0ZWQoc2VsZi5leHRyYXMpKSkpCgogICAgICAgIGlmIHNlbGYuc3BlY2lmaWVyOgogICAgICAgICAgICBwYXJ0cy5hcHBlbmQoc3RyKHNlbGYuc3BlY2lmaWVyKSkKCiAgICAgICAgaWYgc2VsZi51cmw6CiAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgiQCB7MH0iLmZvcm1hdChzZWxmLnVybCkpCiAgICAgICAgICAgIGlmIHNlbGYubWFya2VyOgogICAgICAgICAgICAgICAgcGFydHMuYXBwZW5kKCIgIikKCiAgICAgICAgaWYgc2VsZi5tYXJrZXI6CiAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgiOyB7MH0iLmZvcm1hdChzZWxmLm1hcmtlcikpCgogICAgICAgIHJldHVybiAiIi5qb2luKHBhcnRzKQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIjxSZXF1aXJlbWVudCh7MCFyfSk+Ii5mb3JtYXQoc3RyKHNlbGYpKQpQSwMEFAAAAAAAAAAhAPKIRtOCbAAAgmwAAE8AAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9fdmVuZG9yL3BhY2thZ2luZy9zcGVjaWZpZXJzLnB5IyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uCiMgMi4wLCBhbmQgdGhlIEJTRCBMaWNlbnNlLiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHJlcG9zaXRvcnkKIyBmb3IgY29tcGxldGUgZGV0YWlscy4KZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCBwcmludF9mdW5jdGlvbgoKaW1wb3J0IGFiYwppbXBvcnQgZnVuY3Rvb2xzCmltcG9ydCBpdGVydG9vbHMKaW1wb3J0IHJlCgpmcm9tIC5fY29tcGF0IGltcG9ydCBzdHJpbmdfdHlwZXMsIHdpdGhfbWV0YWNsYXNzCmZyb20gLnZlcnNpb24gaW1wb3J0IFZlcnNpb24sIExlZ2FjeVZlcnNpb24sIHBhcnNlCgoKY2xhc3MgSW52YWxpZFNwZWNpZmllcihWYWx1ZUVycm9yKToKICAgICIiIgogICAgQW4gaW52YWxpZCBzcGVjaWZpZXIgd2FzIGZvdW5kLCB1c2VycyBzaG91bGQgcmVmZXIgdG8gUEVQIDQ0MC4KICAgICIiIgoKCmNsYXNzIEJhc2VTcGVjaWZpZXIod2l0aF9tZXRhY2xhc3MoYWJjLkFCQ01ldGEsIG9iamVjdCkpOgogICAgQGFiYy5hYnN0cmFjdG1ldGhvZAogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJucyB0aGUgc3RyIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgU3BlY2lmaWVyIGxpa2Ugb2JqZWN0LiBUaGlzCiAgICAgICAgc2hvdWxkIGJlIHJlcHJlc2VudGF0aXZlIG9mIHRoZSBTcGVjaWZpZXIgaXRzZWxmLgogICAgICAgICIiIgoKICAgIEBhYmMuYWJzdHJhY3RtZXRob2QKICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm5zIGEgaGFzaCB2YWx1ZSBmb3IgdGhpcyBTcGVjaWZpZXIgbGlrZSBvYmplY3QuCiAgICAgICAgIiIiCgogICAgQGFiYy5hYnN0cmFjdG1ldGhvZAogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJucyBhIGJvb2xlYW4gcmVwcmVzZW50aW5nIHdoZXRoZXIgb3Igbm90IHRoZSB0d28gU3BlY2lmaWVyIGxpa2UKICAgICAgICBvYmplY3RzIGFyZSBlcXVhbC4KICAgICAgICAiIiIKCiAgICBAYWJjLmFic3RyYWN0bWV0aG9kCiAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm5zIGEgYm9vbGVhbiByZXByZXNlbnRpbmcgd2hldGhlciBvciBub3QgdGhlIHR3byBTcGVjaWZpZXIgbGlrZQogICAgICAgIG9iamVjdHMgYXJlIG5vdCBlcXVhbC4KICAgICAgICAiIiIKCiAgICBAYWJjLmFic3RyYWN0cHJvcGVydHkKICAgIGRlZiBwcmVyZWxlYXNlcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHByZS1yZWxlYXNlcyBhcyBhIHdob2xlIGFyZSBhbGxvd2VkIGJ5IHRoaXMKICAgICAgICBzcGVjaWZpZXIuCiAgICAgICAgIiIiCgogICAgQHByZXJlbGVhc2VzLnNldHRlcgogICAgZGVmIHByZXJlbGVhc2VzKHNlbGYsIHZhbHVlKToKICAgICAgICAiIiIKICAgICAgICBTZXRzIHdoZXRoZXIgb3Igbm90IHByZS1yZWxlYXNlcyBhcyBhIHdob2xlIGFyZSBhbGxvd2VkIGJ5IHRoaXMKICAgICAgICBzcGVjaWZpZXIuCiAgICAgICAgIiIiCgogICAgQGFiYy5hYnN0cmFjdG1ldGhvZAogICAgZGVmIGNvbnRhaW5zKHNlbGYsIGl0ZW0sIHByZXJlbGVhc2VzPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIERldGVybWluZXMgaWYgdGhlIGdpdmVuIGl0ZW0gaXMgY29udGFpbmVkIHdpdGhpbiB0aGlzIHNwZWNpZmllci4KICAgICAgICAiIiIKCiAgICBAYWJjLmFic3RyYWN0bWV0aG9kCiAgICBkZWYgZmlsdGVyKHNlbGYsIGl0ZXJhYmxlLCBwcmVyZWxlYXNlcz1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBUYWtlcyBhbiBpdGVyYWJsZSBvZiBpdGVtcyBhbmQgZmlsdGVycyB0aGVtIHNvIHRoYXQgb25seSBpdGVtcyB3aGljaAogICAgICAgIGFyZSBjb250YWluZWQgd2l0aGluIHRoaXMgc3BlY2lmaWVyIGFyZSBhbGxvd2VkIGluIGl0LgogICAgICAgICIiIgoKCmNsYXNzIF9JbmRpdmlkdWFsU3BlY2lmaWVyKEJhc2VTcGVjaWZpZXIpOgoKICAgIF9vcGVyYXRvcnMgPSB7fQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzcGVjPSIiLCBwcmVyZWxlYXNlcz1Ob25lKToKICAgICAgICBtYXRjaCA9IHNlbGYuX3JlZ2V4LnNlYXJjaChzcGVjKQogICAgICAgIGlmIG5vdCBtYXRjaDoKICAgICAgICAgICAgcmFpc2UgSW52YWxpZFNwZWNpZmllcigiSW52YWxpZCBzcGVjaWZpZXI6ICd7MH0nIi5mb3JtYXQoc3BlYykpCgogICAgICAgIHNlbGYuX3NwZWMgPSAobWF0Y2guZ3JvdXAoIm9wZXJhdG9yIikuc3RyaXAoKSwgbWF0Y2guZ3JvdXAoInZlcnNpb24iKS5zdHJpcCgpKQoKICAgICAgICAjIFN0b3JlIHdoZXRoZXIgb3Igbm90IHRoaXMgU3BlY2lmaWVyIHNob3VsZCBhY2NlcHQgcHJlcmVsZWFzZXMKICAgICAgICBzZWxmLl9wcmVyZWxlYXNlcyA9IHByZXJlbGVhc2VzCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHByZSA9ICgKICAgICAgICAgICAgIiwgcHJlcmVsZWFzZXM9ezAhcn0iLmZvcm1hdChzZWxmLnByZXJlbGVhc2VzKQogICAgICAgICAgICBpZiBzZWxmLl9wcmVyZWxlYXNlcyBpcyBub3QgTm9uZQogICAgICAgICAgICBlbHNlICIiCiAgICAgICAgKQoKICAgICAgICByZXR1cm4gIjx7MH0oezEhcn17Mn0pPiIuZm9ybWF0KHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzdHIoc2VsZiksIHByZSkKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gInswfXsxfSIuZm9ybWF0KCpzZWxmLl9zcGVjKQoKICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKICAgICAgICByZXR1cm4gaGFzaChzZWxmLl9zcGVjKQoKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHN0cmluZ190eXBlcyk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIG90aGVyID0gc2VsZi5fX2NsYXNzX18ob3RoZXIpCiAgICAgICAgICAgIGV4Y2VwdCBJbnZhbGlkU3BlY2lmaWVyOgogICAgICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCiAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pOgogICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKCiAgICAgICAgcmV0dXJuIHNlbGYuX3NwZWMgPT0gb3RoZXIuX3NwZWMKCiAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBzdHJpbmdfdHlwZXMpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBvdGhlciA9IHNlbGYuX19jbGFzc19fKG90aGVyKQogICAgICAgICAgICBleGNlcHQgSW52YWxpZFNwZWNpZmllcjoKICAgICAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAogICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKToKICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCgogICAgICAgIHJldHVybiBzZWxmLl9zcGVjICE9IG90aGVyLl9zcGVjCgogICAgZGVmIF9nZXRfb3BlcmF0b3Ioc2VsZiwgb3ApOgogICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYsICJfY29tcGFyZV97MH0iLmZvcm1hdChzZWxmLl9vcGVyYXRvcnNbb3BdKSkKCiAgICBkZWYgX2NvZXJjZV92ZXJzaW9uKHNlbGYsIHZlcnNpb24pOgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHZlcnNpb24sIChMZWdhY3lWZXJzaW9uLCBWZXJzaW9uKSk6CiAgICAgICAgICAgIHZlcnNpb24gPSBwYXJzZSh2ZXJzaW9uKQogICAgICAgIHJldHVybiB2ZXJzaW9uCgogICAgQHByb3BlcnR5CiAgICBkZWYgb3BlcmF0b3Ioc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3NwZWNbMF0KCiAgICBAcHJvcGVydHkKICAgIGRlZiB2ZXJzaW9uKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9zcGVjWzFdCgogICAgQHByb3BlcnR5CiAgICBkZWYgcHJlcmVsZWFzZXMoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3ByZXJlbGVhc2VzCgogICAgQHByZXJlbGVhc2VzLnNldHRlcgogICAgZGVmIHByZXJlbGVhc2VzKHNlbGYsIHZhbHVlKToKICAgICAgICBzZWxmLl9wcmVyZWxlYXNlcyA9IHZhbHVlCgogICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBpdGVtKToKICAgICAgICByZXR1cm4gc2VsZi5jb250YWlucyhpdGVtKQoKICAgIGRlZiBjb250YWlucyhzZWxmLCBpdGVtLCBwcmVyZWxlYXNlcz1Ob25lKToKICAgICAgICAjIERldGVybWluZSBpZiBwcmVyZWxlYXNlcyBhcmUgdG8gYmUgYWxsb3dlZCBvciBub3QuCiAgICAgICAgaWYgcHJlcmVsZWFzZXMgaXMgTm9uZToKICAgICAgICAgICAgcHJlcmVsZWFzZXMgPSBzZWxmLnByZXJlbGVhc2VzCgogICAgICAgICMgTm9ybWFsaXplIGl0ZW0gdG8gYSBWZXJzaW9uIG9yIExlZ2FjeVZlcnNpb24sIHRoaXMgYWxsb3dzIHVzIHRvIGhhdmUKICAgICAgICAjIGEgc2hvcnRjdXQgZm9yIGBgIjIuMCIgaW4gU3BlY2lmaWVyKCI+PTIiKQogICAgICAgIGl0ZW0gPSBzZWxmLl9jb2VyY2VfdmVyc2lvbihpdGVtKQoKICAgICAgICAjIERldGVybWluZSBpZiB3ZSBzaG91bGQgYmUgc3VwcG9ydGluZyBwcmVyZWxlYXNlcyBpbiB0aGlzIHNwZWNpZmllcgogICAgICAgICMgb3Igbm90LCBpZiB3ZSBkbyBub3Qgc3VwcG9ydCBwcmVyZWxlYXNlcyB0aGFuIHdlIGNhbiBzaG9ydCBjaXJjdWl0CiAgICAgICAgIyBsb2dpYyBpZiB0aGlzIHZlcnNpb24gaXMgYSBwcmVyZWxlYXNlcy4KICAgICAgICBpZiBpdGVtLmlzX3ByZXJlbGVhc2UgYW5kIG5vdCBwcmVyZWxlYXNlczoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgICMgQWN0dWFsbHkgZG8gdGhlIGNvbXBhcmlzb24gdG8gZGV0ZXJtaW5lIGlmIHRoaXMgaXRlbSBpcyBjb250YWluZWQKICAgICAgICAjIHdpdGhpbiB0aGlzIFNwZWNpZmllciBvciBub3QuCiAgICAgICAgcmV0dXJuIHNlbGYuX2dldF9vcGVyYXRvcihzZWxmLm9wZXJhdG9yKShpdGVtLCBzZWxmLnZlcnNpb24pCgogICAgZGVmIGZpbHRlcihzZWxmLCBpdGVyYWJsZSwgcHJlcmVsZWFzZXM9Tm9uZSk6CiAgICAgICAgeWllbGRlZCA9IEZhbHNlCiAgICAgICAgZm91bmRfcHJlcmVsZWFzZXMgPSBbXQoKICAgICAgICBrdyA9IHsicHJlcmVsZWFzZXMiOiBwcmVyZWxlYXNlcyBpZiBwcmVyZWxlYXNlcyBpcyBub3QgTm9uZSBlbHNlIFRydWV9CgogICAgICAgICMgQXR0ZW1wdCB0byBpdGVyYXRlIG92ZXIgYWxsIHRoZSB2YWx1ZXMgaW4gdGhlIGl0ZXJhYmxlIGFuZCBpZiBhbnkgb2YKICAgICAgICAjIHRoZW0gbWF0Y2gsIHlpZWxkIHRoZW0uCiAgICAgICAgZm9yIHZlcnNpb24gaW4gaXRlcmFibGU6CiAgICAgICAgICAgIHBhcnNlZF92ZXJzaW9uID0gc2VsZi5fY29lcmNlX3ZlcnNpb24odmVyc2lvbikKCiAgICAgICAgICAgIGlmIHNlbGYuY29udGFpbnMocGFyc2VkX3ZlcnNpb24sICoqa3cpOgogICAgICAgICAgICAgICAgIyBJZiBvdXIgdmVyc2lvbiBpcyBhIHByZXJlbGVhc2UsIGFuZCB3ZSB3ZXJlIG5vdCBzZXQgdG8gYWxsb3cKICAgICAgICAgICAgICAgICMgcHJlcmVsZWFzZXMsIHRoZW4gd2UnbGwgc3RvcmUgaXQgZm9yIGxhdGVyIGluY2FzZSBub3RoaW5nCiAgICAgICAgICAgICAgICAjIGVsc2UgbWF0Y2hlcyB0aGlzIHNwZWNpZmllci4KICAgICAgICAgICAgICAgIGlmIHBhcnNlZF92ZXJzaW9uLmlzX3ByZXJlbGVhc2UgYW5kIG5vdCAoCiAgICAgICAgICAgICAgICAgICAgcHJlcmVsZWFzZXMgb3Igc2VsZi5wcmVyZWxlYXNlcwogICAgICAgICAgICAgICAgKToKICAgICAgICAgICAgICAgICAgICBmb3VuZF9wcmVyZWxlYXNlcy5hcHBlbmQodmVyc2lvbikKICAgICAgICAgICAgICAgICMgRWl0aGVyIHRoaXMgaXMgbm90IGEgcHJlcmVsZWFzZSwgb3Igd2Ugc2hvdWxkIGhhdmUgYmVlbgogICAgICAgICAgICAgICAgIyBhY2NlcHRpbmcgcHJlcmVsZWFzZXMgZnJvbSB0aGUgYmVnaW5uaW5nLgogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICB5aWVsZGVkID0gVHJ1ZQogICAgICAgICAgICAgICAgICAgIHlpZWxkIHZlcnNpb24KCiAgICAgICAgIyBOb3cgdGhhdCB3ZSd2ZSBpdGVyYXRlZCBvdmVyIGV2ZXJ5dGhpbmcsIGRldGVybWluZSBpZiB3ZSd2ZSB5aWVsZGVkCiAgICAgICAgIyBhbnkgdmFsdWVzLCBhbmQgaWYgd2UgaGF2ZSBub3QgYW5kIHdlIGhhdmUgYW55IHByZXJlbGVhc2VzIHN0b3JlZCB1cAogICAgICAgICMgdGhlbiB3ZSB3aWxsIGdvIGFoZWFkIGFuZCB5aWVsZCB0aGUgcHJlcmVsZWFzZXMuCiAgICAgICAgaWYgbm90IHlpZWxkZWQgYW5kIGZvdW5kX3ByZXJlbGVhc2VzOgogICAgICAgICAgICBmb3IgdmVyc2lvbiBpbiBmb3VuZF9wcmVyZWxlYXNlczoKICAgICAgICAgICAgICAgIHlpZWxkIHZlcnNpb24KCgpjbGFzcyBMZWdhY3lTcGVjaWZpZXIoX0luZGl2aWR1YWxTcGVjaWZpZXIpOgoKICAgIF9yZWdleF9zdHIgPSByIiIiCiAgICAgICAgKD9QPG9wZXJhdG9yPig9PXwhPXw8PXw+PXw8fD4pKQogICAgICAgIFxzKgogICAgICAgICg/UDx2ZXJzaW9uPgogICAgICAgICAgICBbXiw7XHMpXSogIyBTaW5jZSB0aGlzIGlzIGEgImxlZ2FjeSIgc3BlY2lmaWVyLCBhbmQgdGhlIHZlcnNpb24KICAgICAgICAgICAgICAgICAgICAgICMgc3RyaW5nIGNhbiBiZSBqdXN0IGFib3V0IGFueXRoaW5nLCB3ZSBtYXRjaCBldmVyeXRoaW5nCiAgICAgICAgICAgICAgICAgICAgICAjIGV4Y2VwdCBmb3Igd2hpdGVzcGFjZSwgYSBzZW1pLWNvbG9uIGZvciBtYXJrZXIgc3VwcG9ydCwKICAgICAgICAgICAgICAgICAgICAgICMgYSBjbG9zaW5nIHBhcmVuIHNpbmNlIHZlcnNpb25zIGNhbiBiZSBlbmNsb3NlZCBpbgogICAgICAgICAgICAgICAgICAgICAgIyB0aGVtLCBhbmQgYSBjb21tYSBzaW5jZSBpdCdzIGEgdmVyc2lvbiBzZXBhcmF0b3IuCiAgICAgICAgKQogICAgICAgICIiIgoKICAgIF9yZWdleCA9IHJlLmNvbXBpbGUociJeXHMqIiArIF9yZWdleF9zdHIgKyByIlxzKiQiLCByZS5WRVJCT1NFIHwgcmUuSUdOT1JFQ0FTRSkKCiAgICBfb3BlcmF0b3JzID0gewogICAgICAgICI9PSI6ICJlcXVhbCIsCiAgICAgICAgIiE9IjogIm5vdF9lcXVhbCIsCiAgICAgICAgIjw9IjogImxlc3NfdGhhbl9lcXVhbCIsCiAgICAgICAgIj49IjogImdyZWF0ZXJfdGhhbl9lcXVhbCIsCiAgICAgICAgIjwiOiAibGVzc190aGFuIiwKICAgICAgICAiPiI6ICJncmVhdGVyX3RoYW4iLAogICAgfQoKICAgIGRlZiBfY29lcmNlX3ZlcnNpb24oc2VsZiwgdmVyc2lvbik6CiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodmVyc2lvbiwgTGVnYWN5VmVyc2lvbik6CiAgICAgICAgICAgIHZlcnNpb24gPSBMZWdhY3lWZXJzaW9uKHN0cih2ZXJzaW9uKSkKICAgICAgICByZXR1cm4gdmVyc2lvbgoKICAgIGRlZiBfY29tcGFyZV9lcXVhbChzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgcmV0dXJuIHByb3NwZWN0aXZlID09IHNlbGYuX2NvZXJjZV92ZXJzaW9uKHNwZWMpCgogICAgZGVmIF9jb21wYXJlX25vdF9lcXVhbChzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgcmV0dXJuIHByb3NwZWN0aXZlICE9IHNlbGYuX2NvZXJjZV92ZXJzaW9uKHNwZWMpCgogICAgZGVmIF9jb21wYXJlX2xlc3NfdGhhbl9lcXVhbChzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgcmV0dXJuIHByb3NwZWN0aXZlIDw9IHNlbGYuX2NvZXJjZV92ZXJzaW9uKHNwZWMpCgogICAgZGVmIF9jb21wYXJlX2dyZWF0ZXJfdGhhbl9lcXVhbChzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgcmV0dXJuIHByb3NwZWN0aXZlID49IHNlbGYuX2NvZXJjZV92ZXJzaW9uKHNwZWMpCgogICAgZGVmIF9jb21wYXJlX2xlc3NfdGhhbihzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgcmV0dXJuIHByb3NwZWN0aXZlIDwgc2VsZi5fY29lcmNlX3ZlcnNpb24oc3BlYykKCiAgICBkZWYgX2NvbXBhcmVfZ3JlYXRlcl90aGFuKHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKToKICAgICAgICByZXR1cm4gcHJvc3BlY3RpdmUgPiBzZWxmLl9jb2VyY2VfdmVyc2lvbihzcGVjKQoKCmRlZiBfcmVxdWlyZV92ZXJzaW9uX2NvbXBhcmUoZm4pOgogICAgQGZ1bmN0b29scy53cmFwcyhmbikKICAgIGRlZiB3cmFwcGVkKHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKToKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShwcm9zcGVjdGl2ZSwgVmVyc2lvbik6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIHJldHVybiBmbihzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYykKCiAgICByZXR1cm4gd3JhcHBlZAoKCmNsYXNzIFNwZWNpZmllcihfSW5kaXZpZHVhbFNwZWNpZmllcik6CgogICAgX3JlZ2V4X3N0ciA9IHIiIiIKICAgICAgICAoP1A8b3BlcmF0b3I+KH49fD09fCE9fDw9fD49fDx8Pnw9PT0pKQogICAgICAgICg/UDx2ZXJzaW9uPgogICAgICAgICAgICAoPzoKICAgICAgICAgICAgICAgICMgVGhlIGlkZW50aXR5IG9wZXJhdG9ycyBhbGxvdyBmb3IgYW4gZXNjYXBlIGhhdGNoIHRoYXQgd2lsbAogICAgICAgICAgICAgICAgIyBkbyBhbiBleGFjdCBzdHJpbmcgbWF0Y2ggb2YgdGhlIHZlcnNpb24geW91IHdpc2ggdG8gaW5zdGFsbC4KICAgICAgICAgICAgICAgICMgVGhpcyB3aWxsIG5vdCBiZSBwYXJzZWQgYnkgUEVQIDQ0MCBhbmQgd2UgY2Fubm90IGRldGVybWluZQogICAgICAgICAgICAgICAgIyBhbnkgc2VtYW50aWMgbWVhbmluZyBmcm9tIGl0LiBUaGlzIG9wZXJhdG9yIGlzIGRpc2NvdXJhZ2VkCiAgICAgICAgICAgICAgICAjIGJ1dCBpbmNsdWRlZCBlbnRpcmVseSBhcyBhbiBlc2NhcGUgaGF0Y2guCiAgICAgICAgICAgICAgICAoPzw9PT09KSAgIyBPbmx5IG1hdGNoIGZvciB0aGUgaWRlbnRpdHkgb3BlcmF0b3IKICAgICAgICAgICAgICAgIFxzKgogICAgICAgICAgICAgICAgW15cc10qICAgICMgV2UganVzdCBtYXRjaCBldmVyeXRoaW5nLCBleGNlcHQgZm9yIHdoaXRlc3BhY2UKICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNpbmNlIHdlIGFyZSBvbmx5IHRlc3RpbmcgZm9yIHN0cmljdCBpZGVudGl0eS4KICAgICAgICAgICAgKQogICAgICAgICAgICB8CiAgICAgICAgICAgICg/OgogICAgICAgICAgICAgICAgIyBUaGUgKG5vbillcXVhbGl0eSBvcGVyYXRvcnMgYWxsb3cgZm9yIHdpbGQgY2FyZCBhbmQgbG9jYWwKICAgICAgICAgICAgICAgICMgdmVyc2lvbnMgdG8gYmUgc3BlY2lmaWVkIHNvIHdlIGhhdmUgdG8gZGVmaW5lIHRoZXNlIHR3bwogICAgICAgICAgICAgICAgIyBvcGVyYXRvcnMgc2VwYXJhdGVseSB0byBlbmFibGUgdGhhdC4KICAgICAgICAgICAgICAgICg/PD09PXwhPSkgICAgICAgICAgICAjIE9ubHkgbWF0Y2ggZm9yIGVxdWFscyBhbmQgbm90IGVxdWFscwoKICAgICAgICAgICAgICAgIFxzKgogICAgICAgICAgICAgICAgdj8KICAgICAgICAgICAgICAgICg/OlswLTldKyEpPyAgICAgICAgICAjIGVwb2NoCiAgICAgICAgICAgICAgICBbMC05XSsoPzpcLlswLTldKykqICAgIyByZWxlYXNlCiAgICAgICAgICAgICAgICAoPzogICAgICAgICAgICAgICAgICAgIyBwcmUgcmVsZWFzZQogICAgICAgICAgICAgICAgICAgIFstX1wuXT8KICAgICAgICAgICAgICAgICAgICAoYXxifGN8cmN8YWxwaGF8YmV0YXxwcmV8cHJldmlldykKICAgICAgICAgICAgICAgICAgICBbLV9cLl0/CiAgICAgICAgICAgICAgICAgICAgWzAtOV0qCiAgICAgICAgICAgICAgICApPwogICAgICAgICAgICAgICAgKD86ICAgICAgICAgICAgICAgICAgICMgcG9zdCByZWxlYXNlCiAgICAgICAgICAgICAgICAgICAgKD86LVswLTldKyl8KD86Wy1fXC5dPyhwb3N0fHJldnxyKVstX1wuXT9bMC05XSopCiAgICAgICAgICAgICAgICApPwoKICAgICAgICAgICAgICAgICMgWW91IGNhbm5vdCB1c2UgYSB3aWxkIGNhcmQgYW5kIGEgZGV2IG9yIGxvY2FsIHZlcnNpb24KICAgICAgICAgICAgICAgICMgdG9nZXRoZXIgc28gZ3JvdXAgdGhlbSB3aXRoIGEgfCBhbmQgbWFrZSB0aGVtIG9wdGlvbmFsLgogICAgICAgICAgICAgICAgKD86CiAgICAgICAgICAgICAgICAgICAgKD86Wy1fXC5dP2RldlstX1wuXT9bMC05XSopPyAgICAgICAgICMgZGV2IHJlbGVhc2UKICAgICAgICAgICAgICAgICAgICAoPzpcK1thLXowLTldKyg/OlstX1wuXVthLXowLTldKykqKT8gIyBsb2NhbAogICAgICAgICAgICAgICAgICAgIHwKICAgICAgICAgICAgICAgICAgICBcLlwqICAjIFdpbGQgY2FyZCBzeW50YXggb2YgLioKICAgICAgICAgICAgICAgICk/CiAgICAgICAgICAgICkKICAgICAgICAgICAgfAogICAgICAgICAgICAoPzoKICAgICAgICAgICAgICAgICMgVGhlIGNvbXBhdGlibGUgb3BlcmF0b3IgcmVxdWlyZXMgYXQgbGVhc3QgdHdvIGRpZ2l0cyBpbiB0aGUKICAgICAgICAgICAgICAgICMgcmVsZWFzZSBzZWdtZW50LgogICAgICAgICAgICAgICAgKD88PX49KSAgICAgICAgICAgICAgICMgT25seSBtYXRjaCBmb3IgdGhlIGNvbXBhdGlibGUgb3BlcmF0b3IKCiAgICAgICAgICAgICAgICBccyoKICAgICAgICAgICAgICAgIHY/CiAgICAgICAgICAgICAgICAoPzpbMC05XSshKT8gICAgICAgICAgIyBlcG9jaAogICAgICAgICAgICAgICAgWzAtOV0rKD86XC5bMC05XSspKyAgICMgcmVsZWFzZSAgKFdlIGhhdmUgYSArIGluc3RlYWQgb2YgYSAqKQogICAgICAgICAgICAgICAgKD86ICAgICAgICAgICAgICAgICAgICMgcHJlIHJlbGVhc2UKICAgICAgICAgICAgICAgICAgICBbLV9cLl0/CiAgICAgICAgICAgICAgICAgICAgKGF8YnxjfHJjfGFscGhhfGJldGF8cHJlfHByZXZpZXcpCiAgICAgICAgICAgICAgICAgICAgWy1fXC5dPwogICAgICAgICAgICAgICAgICAgIFswLTldKgogICAgICAgICAgICAgICAgKT8KICAgICAgICAgICAgICAgICg/OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBwb3N0IHJlbGVhc2UKICAgICAgICAgICAgICAgICAgICAoPzotWzAtOV0rKXwoPzpbLV9cLl0/KHBvc3R8cmV2fHIpWy1fXC5dP1swLTldKikKICAgICAgICAgICAgICAgICk/CiAgICAgICAgICAgICAgICAoPzpbLV9cLl0/ZGV2Wy1fXC5dP1swLTldKik/ICAgICAgICAgICMgZGV2IHJlbGVhc2UKICAgICAgICAgICAgKQogICAgICAgICAgICB8CiAgICAgICAgICAgICg/OgogICAgICAgICAgICAgICAgIyBBbGwgb3RoZXIgb3BlcmF0b3JzIG9ubHkgYWxsb3cgYSBzdWIgc2V0IG9mIHdoYXQgdGhlCiAgICAgICAgICAgICAgICAjIChub24pZXF1YWxpdHkgb3BlcmF0b3JzIGRvLiBTcGVjaWZpY2FsbHkgdGhleSBkbyBub3QgYWxsb3cKICAgICAgICAgICAgICAgICMgbG9jYWwgdmVyc2lvbnMgdG8gYmUgc3BlY2lmaWVkIG5vciBkbyB0aGV5IGFsbG93IHRoZSBwcmVmaXgKICAgICAgICAgICAgICAgICMgbWF0Y2hpbmcgd2lsZCBjYXJkcy4KICAgICAgICAgICAgICAgICg/PCE9PXwhPXx+PSkgICAgICAgICAjIFdlIGhhdmUgc3BlY2lhbCBjYXNlcyBmb3IgdGhlc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG9wZXJhdG9ycyBzbyB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB0aGV5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBkb24ndCBtYXRjaCBoZXJlLgoKICAgICAgICAgICAgICAgIFxzKgogICAgICAgICAgICAgICAgdj8KICAgICAgICAgICAgICAgICg/OlswLTldKyEpPyAgICAgICAgICAjIGVwb2NoCiAgICAgICAgICAgICAgICBbMC05XSsoPzpcLlswLTldKykqICAgIyByZWxlYXNlCiAgICAgICAgICAgICAgICAoPzogICAgICAgICAgICAgICAgICAgIyBwcmUgcmVsZWFzZQogICAgICAgICAgICAgICAgICAgIFstX1wuXT8KICAgICAgICAgICAgICAgICAgICAoYXxifGN8cmN8YWxwaGF8YmV0YXxwcmV8cHJldmlldykKICAgICAgICAgICAgICAgICAgICBbLV9cLl0/CiAgICAgICAgICAgICAgICAgICAgWzAtOV0qCiAgICAgICAgICAgICAgICApPwogICAgICAgICAgICAgICAgKD86ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHBvc3QgcmVsZWFzZQogICAgICAgICAgICAgICAgICAgICg/Oi1bMC05XSspfCg/OlstX1wuXT8ocG9zdHxyZXZ8cilbLV9cLl0/WzAtOV0qKQogICAgICAgICAgICAgICAgKT8KICAgICAgICAgICAgICAgICg/OlstX1wuXT9kZXZbLV9cLl0/WzAtOV0qKT8gICAgICAgICAgIyBkZXYgcmVsZWFzZQogICAgICAgICAgICApCiAgICAgICAgKQogICAgICAgICIiIgoKICAgIF9yZWdleCA9IHJlLmNvbXBpbGUociJeXHMqIiArIF9yZWdleF9zdHIgKyByIlxzKiQiLCByZS5WRVJCT1NFIHwgcmUuSUdOT1JFQ0FTRSkKCiAgICBfb3BlcmF0b3JzID0gewogICAgICAgICJ+PSI6ICJjb21wYXRpYmxlIiwKICAgICAgICAiPT0iOiAiZXF1YWwiLAogICAgICAgICIhPSI6ICJub3RfZXF1YWwiLAogICAgICAgICI8PSI6ICJsZXNzX3RoYW5fZXF1YWwiLAogICAgICAgICI+PSI6ICJncmVhdGVyX3RoYW5fZXF1YWwiLAogICAgICAgICI8IjogImxlc3NfdGhhbiIsCiAgICAgICAgIj4iOiAiZ3JlYXRlcl90aGFuIiwKICAgICAgICAiPT09IjogImFyYml0cmFyeSIsCiAgICB9CgogICAgQF9yZXF1aXJlX3ZlcnNpb25fY29tcGFyZQogICAgZGVmIF9jb21wYXJlX2NvbXBhdGlibGUoc2VsZiwgcHJvc3BlY3RpdmUsIHNwZWMpOgogICAgICAgICMgQ29tcGF0aWJsZSByZWxlYXNlcyBoYXZlIGFuIGVxdWl2YWxlbnQgY29tYmluYXRpb24gb2YgPj0gYW5kID09LiBUaGF0CiAgICAgICAgIyBpcyB0aGF0IH49Mi4yIGlzIGVxdWl2YWxlbnQgdG8gPj0yLjIsPT0yLiouIFRoaXMgYWxsb3dzIHVzIHRvCiAgICAgICAgIyBpbXBsZW1lbnQgdGhpcyBpbiB0ZXJtcyBvZiB0aGUgb3RoZXIgc3BlY2lmaWVycyBpbnN0ZWFkIG9mCiAgICAgICAgIyBpbXBsZW1lbnRpbmcgaXQgb3Vyc2VsdmVzLiBUaGUgb25seSB0aGluZyB3ZSBuZWVkIHRvIGRvIGlzIGNvbnN0cnVjdAogICAgICAgICMgdGhlIG90aGVyIHNwZWNpZmllcnMuCgogICAgICAgICMgV2Ugd2FudCBldmVyeXRoaW5nIGJ1dCB0aGUgbGFzdCBpdGVtIGluIHRoZSB2ZXJzaW9uLCBidXQgd2Ugd2FudCB0bwogICAgICAgICMgaWdub3JlIHBvc3QgYW5kIGRldiByZWxlYXNlcyBhbmQgd2Ugd2FudCB0byB0cmVhdCB0aGUgcHJlLXJlbGVhc2UgYXMKICAgICAgICAjIGl0J3Mgb3duIHNlcGFyYXRlIHNlZ21lbnQuCiAgICAgICAgcHJlZml4ID0gIi4iLmpvaW4oCiAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgICBpdGVydG9vbHMudGFrZXdoaWxlKAogICAgICAgICAgICAgICAgICAgIGxhbWJkYSB4OiAobm90IHguc3RhcnRzd2l0aCgicG9zdCIpIGFuZCBub3QgeC5zdGFydHN3aXRoKCJkZXYiKSksCiAgICAgICAgICAgICAgICAgICAgX3ZlcnNpb25fc3BsaXQoc3BlYyksCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIClbOi0xXQogICAgICAgICkKCiAgICAgICAgIyBBZGQgdGhlIHByZWZpeCBub3RhdGlvbiB0byB0aGUgZW5kIG9mIG91ciBzdHJpbmcKICAgICAgICBwcmVmaXggKz0gIi4qIgoKICAgICAgICByZXR1cm4gc2VsZi5fZ2V0X29wZXJhdG9yKCI+PSIpKHByb3NwZWN0aXZlLCBzcGVjKSBhbmQgc2VsZi5fZ2V0X29wZXJhdG9yKCI9PSIpKAogICAgICAgICAgICBwcm9zcGVjdGl2ZSwgcHJlZml4CiAgICAgICAgKQoKICAgIEBfcmVxdWlyZV92ZXJzaW9uX2NvbXBhcmUKICAgIGRlZiBfY29tcGFyZV9lcXVhbChzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgIyBXZSBuZWVkIHNwZWNpYWwgbG9naWMgdG8gaGFuZGxlIHByZWZpeCBtYXRjaGluZwogICAgICAgIGlmIHNwZWMuZW5kc3dpdGgoIi4qIik6CiAgICAgICAgICAgICMgSW4gdGhlIGNhc2Ugb2YgcHJlZml4IG1hdGNoaW5nIHdlIHdhbnQgdG8gaWdub3JlIGxvY2FsIHNlZ21lbnQuCiAgICAgICAgICAgIHByb3NwZWN0aXZlID0gVmVyc2lvbihwcm9zcGVjdGl2ZS5wdWJsaWMpCiAgICAgICAgICAgICMgU3BsaXQgdGhlIHNwZWMgb3V0IGJ5IGRvdHMsIGFuZCBwcmV0ZW5kIHRoYXQgdGhlcmUgaXMgYW4gaW1wbGljaXQKICAgICAgICAgICAgIyBkb3QgaW4gYmV0d2VlbiBhIHJlbGVhc2Ugc2VnbWVudCBhbmQgYSBwcmUtcmVsZWFzZSBzZWdtZW50LgogICAgICAgICAgICBzcGVjID0gX3ZlcnNpb25fc3BsaXQoc3BlY1s6LTJdKSAgIyBSZW1vdmUgdGhlIHRyYWlsaW5nIC4qCgogICAgICAgICAgICAjIFNwbGl0IHRoZSBwcm9zcGVjdGl2ZSB2ZXJzaW9uIG91dCBieSBkb3RzLCBhbmQgcHJldGVuZCB0aGF0IHRoZXJlCiAgICAgICAgICAgICMgaXMgYW4gaW1wbGljaXQgZG90IGluIGJldHdlZW4gYSByZWxlYXNlIHNlZ21lbnQgYW5kIGEgcHJlLXJlbGVhc2UKICAgICAgICAgICAgIyBzZWdtZW50LgogICAgICAgICAgICBwcm9zcGVjdGl2ZSA9IF92ZXJzaW9uX3NwbGl0KHN0cihwcm9zcGVjdGl2ZSkpCgogICAgICAgICAgICAjIFNob3J0ZW4gdGhlIHByb3NwZWN0aXZlIHZlcnNpb24gdG8gYmUgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBzcGVjCiAgICAgICAgICAgICMgc28gdGhhdCB3ZSBjYW4gZGV0ZXJtaW5lIGlmIHRoZSBzcGVjaWZpZXIgaXMgYSBwcmVmaXggb2YgdGhlCiAgICAgICAgICAgICMgcHJvc3BlY3RpdmUgdmVyc2lvbiBvciBub3QuCiAgICAgICAgICAgIHByb3NwZWN0aXZlID0gcHJvc3BlY3RpdmVbOiBsZW4oc3BlYyldCgogICAgICAgICAgICAjIFBhZCBvdXQgb3VyIHR3byBzaWRlcyB3aXRoIHplcm9zIHNvIHRoYXQgdGhleSBib3RoIGVxdWFsIHRoZSBzYW1lCiAgICAgICAgICAgICMgbGVuZ3RoLgogICAgICAgICAgICBzcGVjLCBwcm9zcGVjdGl2ZSA9IF9wYWRfdmVyc2lvbihzcGVjLCBwcm9zcGVjdGl2ZSkKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIENvbnZlcnQgb3VyIHNwZWMgc3RyaW5nIGludG8gYSBWZXJzaW9uCiAgICAgICAgICAgIHNwZWMgPSBWZXJzaW9uKHNwZWMpCgogICAgICAgICAgICAjIElmIHRoZSBzcGVjaWZpZXIgZG9lcyBub3QgaGF2ZSBhIGxvY2FsIHNlZ21lbnQsIHRoZW4gd2Ugd2FudCB0bwogICAgICAgICAgICAjIGFjdCBhcyBpZiB0aGUgcHJvc3BlY3RpdmUgdmVyc2lvbiBhbHNvIGRvZXMgbm90IGhhdmUgYSBsb2NhbAogICAgICAgICAgICAjIHNlZ21lbnQuCiAgICAgICAgICAgIGlmIG5vdCBzcGVjLmxvY2FsOgogICAgICAgICAgICAgICAgcHJvc3BlY3RpdmUgPSBWZXJzaW9uKHByb3NwZWN0aXZlLnB1YmxpYykKCiAgICAgICAgcmV0dXJuIHByb3NwZWN0aXZlID09IHNwZWMKCiAgICBAX3JlcXVpcmVfdmVyc2lvbl9jb21wYXJlCiAgICBkZWYgX2NvbXBhcmVfbm90X2VxdWFsKHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKToKICAgICAgICByZXR1cm4gbm90IHNlbGYuX2NvbXBhcmVfZXF1YWwocHJvc3BlY3RpdmUsIHNwZWMpCgogICAgQF9yZXF1aXJlX3ZlcnNpb25fY29tcGFyZQogICAgZGVmIF9jb21wYXJlX2xlc3NfdGhhbl9lcXVhbChzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgcmV0dXJuIHByb3NwZWN0aXZlIDw9IFZlcnNpb24oc3BlYykKCiAgICBAX3JlcXVpcmVfdmVyc2lvbl9jb21wYXJlCiAgICBkZWYgX2NvbXBhcmVfZ3JlYXRlcl90aGFuX2VxdWFsKHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKToKICAgICAgICByZXR1cm4gcHJvc3BlY3RpdmUgPj0gVmVyc2lvbihzcGVjKQoKICAgIEBfcmVxdWlyZV92ZXJzaW9uX2NvbXBhcmUKICAgIGRlZiBfY29tcGFyZV9sZXNzX3RoYW4oc2VsZiwgcHJvc3BlY3RpdmUsIHNwZWMpOgogICAgICAgICMgQ29udmVydCBvdXIgc3BlYyB0byBhIFZlcnNpb24gaW5zdGFuY2UsIHNpbmNlIHdlJ2xsIHdhbnQgdG8gd29yayB3aXRoCiAgICAgICAgIyBpdCBhcyBhIHZlcnNpb24uCiAgICAgICAgc3BlYyA9IFZlcnNpb24oc3BlYykKCiAgICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIHByb3NwZWN0aXZlIHZlcnNpb24gaXMgbGVzcyB0aGFuIHRoZSBzcGVjCiAgICAgICAgIyB2ZXJzaW9uLiBJZiBpdCdzIG5vdCB3ZSBjYW4gc2hvcnQgY2lyY3VpdCBhbmQganVzdCByZXR1cm4gRmFsc2Ugbm93CiAgICAgICAgIyBpbnN0ZWFkIG9mIGRvaW5nIGV4dHJhIHVubmVlZGVkIHdvcmsuCiAgICAgICAgaWYgbm90IHByb3NwZWN0aXZlIDwgc3BlYzoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgICMgVGhpcyBzcGVjaWFsIGNhc2UgaXMgaGVyZSBzbyB0aGF0LCB1bmxlc3MgdGhlIHNwZWNpZmllciBpdHNlbGYKICAgICAgICAjIGluY2x1ZGVzIGlzIGEgcHJlLXJlbGVhc2UgdmVyc2lvbiwgdGhhdCB3ZSBkbyBub3QgYWNjZXB0IHByZS1yZWxlYXNlCiAgICAgICAgIyB2ZXJzaW9ucyBmb3IgdGhlIHZlcnNpb24gbWVudGlvbmVkIGluIHRoZSBzcGVjaWZpZXIgKGUuZy4gPDMuMSBzaG91bGQKICAgICAgICAjIG5vdCBtYXRjaCAzLjEuZGV2MCwgYnV0IHNob3VsZCBtYXRjaCAzLjAuZGV2MCkuCiAgICAgICAgaWYgbm90IHNwZWMuaXNfcHJlcmVsZWFzZSBhbmQgcHJvc3BlY3RpdmUuaXNfcHJlcmVsZWFzZToKICAgICAgICAgICAgaWYgVmVyc2lvbihwcm9zcGVjdGl2ZS5iYXNlX3ZlcnNpb24pID09IFZlcnNpb24oc3BlYy5iYXNlX3ZlcnNpb24pOgogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgICMgSWYgd2UndmUgZ290dGVuIHRvIGhlcmUsIGl0IG1lYW5zIHRoYXQgcHJvc3BlY3RpdmUgdmVyc2lvbiBpcyBib3RoCiAgICAgICAgIyBsZXNzIHRoYW4gdGhlIHNwZWMgdmVyc2lvbiAqYW5kKiBpdCdzIG5vdCBhIHByZS1yZWxlYXNlIG9mIHRoZSBzYW1lCiAgICAgICAgIyB2ZXJzaW9uIGluIHRoZSBzcGVjLgogICAgICAgIHJldHVybiBUcnVlCgogICAgQF9yZXF1aXJlX3ZlcnNpb25fY29tcGFyZQogICAgZGVmIF9jb21wYXJlX2dyZWF0ZXJfdGhhbihzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgIyBDb252ZXJ0IG91ciBzcGVjIHRvIGEgVmVyc2lvbiBpbnN0YW5jZSwgc2luY2Ugd2UnbGwgd2FudCB0byB3b3JrIHdpdGgKICAgICAgICAjIGl0IGFzIGEgdmVyc2lvbi4KICAgICAgICBzcGVjID0gVmVyc2lvbihzcGVjKQoKICAgICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgcHJvc3BlY3RpdmUgdmVyc2lvbiBpcyBncmVhdGVyIHRoYW4gdGhlIHNwZWMKICAgICAgICAjIHZlcnNpb24uIElmIGl0J3Mgbm90IHdlIGNhbiBzaG9ydCBjaXJjdWl0IGFuZCBqdXN0IHJldHVybiBGYWxzZSBub3cKICAgICAgICAjIGluc3RlYWQgb2YgZG9pbmcgZXh0cmEgdW5uZWVkZWQgd29yay4KICAgICAgICBpZiBub3QgcHJvc3BlY3RpdmUgPiBzcGVjOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgIyBUaGlzIHNwZWNpYWwgY2FzZSBpcyBoZXJlIHNvIHRoYXQsIHVubGVzcyB0aGUgc3BlY2lmaWVyIGl0c2VsZgogICAgICAgICMgaW5jbHVkZXMgaXMgYSBwb3N0LXJlbGVhc2UgdmVyc2lvbiwgdGhhdCB3ZSBkbyBub3QgYWNjZXB0CiAgICAgICAgIyBwb3N0LXJlbGVhc2UgdmVyc2lvbnMgZm9yIHRoZSB2ZXJzaW9uIG1lbnRpb25lZCBpbiB0aGUgc3BlY2lmaWVyCiAgICAgICAgIyAoZS5nLiA+My4xIHNob3VsZCBub3QgbWF0Y2ggMy4wLnBvc3QwLCBidXQgc2hvdWxkIG1hdGNoIDMuMi5wb3N0MCkuCiAgICAgICAgaWYgbm90IHNwZWMuaXNfcG9zdHJlbGVhc2UgYW5kIHByb3NwZWN0aXZlLmlzX3Bvc3RyZWxlYXNlOgogICAgICAgICAgICBpZiBWZXJzaW9uKHByb3NwZWN0aXZlLmJhc2VfdmVyc2lvbikgPT0gVmVyc2lvbihzcGVjLmJhc2VfdmVyc2lvbik6CiAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgIyBFbnN1cmUgdGhhdCB3ZSBkbyBub3QgYWxsb3cgYSBsb2NhbCB2ZXJzaW9uIG9mIHRoZSB2ZXJzaW9uIG1lbnRpb25lZAogICAgICAgICMgaW4gdGhlIHNwZWNpZmllciwgd2hpY2ggaXMgdGVjaG5pY2FsbHkgZ3JlYXRlciB0aGFuLCB0byBtYXRjaC4KICAgICAgICBpZiBwcm9zcGVjdGl2ZS5sb2NhbCBpcyBub3QgTm9uZToKICAgICAgICAgICAgaWYgVmVyc2lvbihwcm9zcGVjdGl2ZS5iYXNlX3ZlcnNpb24pID09IFZlcnNpb24oc3BlYy5iYXNlX3ZlcnNpb24pOgogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgICMgSWYgd2UndmUgZ290dGVuIHRvIGhlcmUsIGl0IG1lYW5zIHRoYXQgcHJvc3BlY3RpdmUgdmVyc2lvbiBpcyBib3RoCiAgICAgICAgIyBncmVhdGVyIHRoYW4gdGhlIHNwZWMgdmVyc2lvbiAqYW5kKiBpdCdzIG5vdCBhIHByZS1yZWxlYXNlIG9mIHRoZQogICAgICAgICMgc2FtZSB2ZXJzaW9uIGluIHRoZSBzcGVjLgogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIF9jb21wYXJlX2FyYml0cmFyeShzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgcmV0dXJuIHN0cihwcm9zcGVjdGl2ZSkubG93ZXIoKSA9PSBzdHIoc3BlYykubG93ZXIoKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHByZXJlbGVhc2VzKHNlbGYpOgogICAgICAgICMgSWYgdGhlcmUgaXMgYW4gZXhwbGljaXQgcHJlcmVsZWFzZXMgc2V0IGZvciB0aGlzLCB0aGVuIHdlJ2xsIGp1c3QKICAgICAgICAjIGJsaW5kbHkgdXNlIHRoYXQuCiAgICAgICAgaWYgc2VsZi5fcHJlcmVsZWFzZXMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9wcmVyZWxlYXNlcwoKICAgICAgICAjIExvb2sgYXQgYWxsIG9mIG91ciBzcGVjaWZpZXJzIGFuZCBkZXRlcm1pbmUgaWYgdGhleSBhcmUgaW5jbHVzaXZlCiAgICAgICAgIyBvcGVyYXRvcnMsIGFuZCBpZiB0aGV5IGFyZSBpZiB0aGV5IGFyZSBpbmNsdWRpbmcgYW4gZXhwbGljaXQKICAgICAgICAjIHByZXJlbGVhc2UuCiAgICAgICAgb3BlcmF0b3IsIHZlcnNpb24gPSBzZWxmLl9zcGVjCiAgICAgICAgaWYgb3BlcmF0b3IgaW4gWyI9PSIsICI+PSIsICI8PSIsICJ+PSIsICI9PT0iXToKICAgICAgICAgICAgIyBUaGUgPT0gc3BlY2lmaWVyIGNhbiBpbmNsdWRlIGEgdHJhaWxpbmcgLiosIGlmIGl0IGRvZXMgd2UKICAgICAgICAgICAgIyB3YW50IHRvIHJlbW92ZSBiZWZvcmUgcGFyc2luZy4KICAgICAgICAgICAgaWYgb3BlcmF0b3IgPT0gIj09IiBhbmQgdmVyc2lvbi5lbmRzd2l0aCgiLioiKToKICAgICAgICAgICAgICAgIHZlcnNpb24gPSB2ZXJzaW9uWzotMl0KCiAgICAgICAgICAgICMgUGFyc2UgdGhlIHZlcnNpb24sIGFuZCBpZiBpdCBpcyBhIHByZS1yZWxlYXNlIHRoYW4gdGhpcwogICAgICAgICAgICAjIHNwZWNpZmllciBhbGxvd3MgcHJlLXJlbGVhc2VzLgogICAgICAgICAgICBpZiBwYXJzZSh2ZXJzaW9uKS5pc19wcmVyZWxlYXNlOgogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgQHByZXJlbGVhc2VzLnNldHRlcgogICAgZGVmIHByZXJlbGVhc2VzKHNlbGYsIHZhbHVlKToKICAgICAgICBzZWxmLl9wcmVyZWxlYXNlcyA9IHZhbHVlCgoKX3ByZWZpeF9yZWdleCA9IHJlLmNvbXBpbGUociJeKFswLTldKykoKD86YXxifGN8cmMpWzAtOV0rKSQiKQoKCmRlZiBfdmVyc2lvbl9zcGxpdCh2ZXJzaW9uKToKICAgIHJlc3VsdCA9IFtdCiAgICBmb3IgaXRlbSBpbiB2ZXJzaW9uLnNwbGl0KCIuIik6CiAgICAgICAgbWF0Y2ggPSBfcHJlZml4X3JlZ2V4LnNlYXJjaChpdGVtKQogICAgICAgIGlmIG1hdGNoOgogICAgICAgICAgICByZXN1bHQuZXh0ZW5kKG1hdGNoLmdyb3VwcygpKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoaXRlbSkKICAgIHJldHVybiByZXN1bHQKCgpkZWYgX3BhZF92ZXJzaW9uKGxlZnQsIHJpZ2h0KToKICAgIGxlZnRfc3BsaXQsIHJpZ2h0X3NwbGl0ID0gW10sIFtdCgogICAgIyBHZXQgdGhlIHJlbGVhc2Ugc2VnbWVudCBvZiBvdXIgdmVyc2lvbnMKICAgIGxlZnRfc3BsaXQuYXBwZW5kKGxpc3QoaXRlcnRvb2xzLnRha2V3aGlsZShsYW1iZGEgeDogeC5pc2RpZ2l0KCksIGxlZnQpKSkKICAgIHJpZ2h0X3NwbGl0LmFwcGVuZChsaXN0KGl0ZXJ0b29scy50YWtld2hpbGUobGFtYmRhIHg6IHguaXNkaWdpdCgpLCByaWdodCkpKQoKICAgICMgR2V0IHRoZSByZXN0IG9mIG91ciB2ZXJzaW9ucwogICAgbGVmdF9zcGxpdC5hcHBlbmQobGVmdFtsZW4obGVmdF9zcGxpdFswXSkgOl0pCiAgICByaWdodF9zcGxpdC5hcHBlbmQocmlnaHRbbGVuKHJpZ2h0X3NwbGl0WzBdKSA6XSkKCiAgICAjIEluc2VydCBvdXIgcGFkZGluZwogICAgbGVmdF9zcGxpdC5pbnNlcnQoMSwgWyIwIl0gKiBtYXgoMCwgbGVuKHJpZ2h0X3NwbGl0WzBdKSAtIGxlbihsZWZ0X3NwbGl0WzBdKSkpCiAgICByaWdodF9zcGxpdC5pbnNlcnQoMSwgWyIwIl0gKiBtYXgoMCwgbGVuKGxlZnRfc3BsaXRbMF0pIC0gbGVuKHJpZ2h0X3NwbGl0WzBdKSkpCgogICAgcmV0dXJuIChsaXN0KGl0ZXJ0b29scy5jaGFpbigqbGVmdF9zcGxpdCkpLCBsaXN0KGl0ZXJ0b29scy5jaGFpbigqcmlnaHRfc3BsaXQpKSkKCgpjbGFzcyBTcGVjaWZpZXJTZXQoQmFzZVNwZWNpZmllcik6CiAgICBkZWYgX19pbml0X18oc2VsZiwgc3BlY2lmaWVycz0iIiwgcHJlcmVsZWFzZXM9Tm9uZSk6CiAgICAgICAgIyBTcGxpdCBvbiAsIHRvIGJyZWFrIGVhY2ggaW5kaWRpdnVhbCBzcGVjaWZpZXIgaW50byBpdCdzIG93biBpdGVtLCBhbmQKICAgICAgICAjIHN0cmlwIGVhY2ggaXRlbSB0byByZW1vdmUgbGVhZGluZy90cmFpbGluZyB3aGl0ZXNwYWNlLgogICAgICAgIHNwZWNpZmllcnMgPSBbcy5zdHJpcCgpIGZvciBzIGluIHNwZWNpZmllcnMuc3BsaXQoIiwiKSBpZiBzLnN0cmlwKCldCgogICAgICAgICMgUGFyc2VkIGVhY2ggaW5kaXZpZHVhbCBzcGVjaWZpZXIsIGF0dGVtcHRpbmcgZmlyc3QgdG8gbWFrZSBpdCBhCiAgICAgICAgIyBTcGVjaWZpZXIgYW5kIGZhbGxpbmcgYmFjayB0byBhIExlZ2FjeVNwZWNpZmllci4KICAgICAgICBwYXJzZWQgPSBzZXQoKQogICAgICAgIGZvciBzcGVjaWZpZXIgaW4gc3BlY2lmaWVyczoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcGFyc2VkLmFkZChTcGVjaWZpZXIoc3BlY2lmaWVyKSkKICAgICAgICAgICAgZXhjZXB0IEludmFsaWRTcGVjaWZpZXI6CiAgICAgICAgICAgICAgICBwYXJzZWQuYWRkKExlZ2FjeVNwZWNpZmllcihzcGVjaWZpZXIpKQoKICAgICAgICAjIFR1cm4gb3VyIHBhcnNlZCBzcGVjaWZpZXJzIGludG8gYSBmcm96ZW4gc2V0IGFuZCBzYXZlIHRoZW0gZm9yIGxhdGVyLgogICAgICAgIHNlbGYuX3NwZWNzID0gZnJvemVuc2V0KHBhcnNlZCkKCiAgICAgICAgIyBTdG9yZSBvdXIgcHJlcmVsZWFzZXMgdmFsdWUgc28gd2UgY2FuIHVzZSBpdCBsYXRlciB0byBkZXRlcm1pbmUgaWYKICAgICAgICAjIHdlIGFjY2VwdCBwcmVyZWxlYXNlcyBvciBub3QuCiAgICAgICAgc2VsZi5fcHJlcmVsZWFzZXMgPSBwcmVyZWxlYXNlcwoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICBwcmUgPSAoCiAgICAgICAgICAgICIsIHByZXJlbGVhc2VzPXswIXJ9Ii5mb3JtYXQoc2VsZi5wcmVyZWxlYXNlcykKICAgICAgICAgICAgaWYgc2VsZi5fcHJlcmVsZWFzZXMgaXMgbm90IE5vbmUKICAgICAgICAgICAgZWxzZSAiIgogICAgICAgICkKCiAgICAgICAgcmV0dXJuICI8U3BlY2lmaWVyU2V0KHswIXJ9ezF9KT4iLmZvcm1hdChzdHIoc2VsZiksIHByZSkKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIiwiLmpvaW4oc29ydGVkKHN0cihzKSBmb3IgcyBpbiBzZWxmLl9zcGVjcykpCgogICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgICAgIHJldHVybiBoYXNoKHNlbGYuX3NwZWNzKQoKICAgIGRlZiBfX2FuZF9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBzdHJpbmdfdHlwZXMpOgogICAgICAgICAgICBvdGhlciA9IFNwZWNpZmllclNldChvdGhlcikKICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBTcGVjaWZpZXJTZXQpOgogICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKCiAgICAgICAgc3BlY2lmaWVyID0gU3BlY2lmaWVyU2V0KCkKICAgICAgICBzcGVjaWZpZXIuX3NwZWNzID0gZnJvemVuc2V0KHNlbGYuX3NwZWNzIHwgb3RoZXIuX3NwZWNzKQoKICAgICAgICBpZiBzZWxmLl9wcmVyZWxlYXNlcyBpcyBOb25lIGFuZCBvdGhlci5fcHJlcmVsZWFzZXMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNwZWNpZmllci5fcHJlcmVsZWFzZXMgPSBvdGhlci5fcHJlcmVsZWFzZXMKICAgICAgICBlbGlmIHNlbGYuX3ByZXJlbGVhc2VzIGlzIG5vdCBOb25lIGFuZCBvdGhlci5fcHJlcmVsZWFzZXMgaXMgTm9uZToKICAgICAgICAgICAgc3BlY2lmaWVyLl9wcmVyZWxlYXNlcyA9IHNlbGYuX3ByZXJlbGVhc2VzCiAgICAgICAgZWxpZiBzZWxmLl9wcmVyZWxlYXNlcyA9PSBvdGhlci5fcHJlcmVsZWFzZXM6CiAgICAgICAgICAgIHNwZWNpZmllci5fcHJlcmVsZWFzZXMgPSBzZWxmLl9wcmVyZWxlYXNlcwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCiAgICAgICAgICAgICAgICAiQ2Fubm90IGNvbWJpbmUgU3BlY2lmaWVyU2V0cyB3aXRoIFRydWUgYW5kIEZhbHNlIHByZXJlbGVhc2UgIgogICAgICAgICAgICAgICAgIm92ZXJyaWRlcy4iCiAgICAgICAgICAgICkKCiAgICAgICAgcmV0dXJuIHNwZWNpZmllcgoKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHN0cmluZ190eXBlcyk6CiAgICAgICAgICAgIG90aGVyID0gU3BlY2lmaWVyU2V0KG90aGVyKQogICAgICAgIGVsaWYgaXNpbnN0YW5jZShvdGhlciwgX0luZGl2aWR1YWxTcGVjaWZpZXIpOgogICAgICAgICAgICBvdGhlciA9IFNwZWNpZmllclNldChzdHIob3RoZXIpKQogICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIFNwZWNpZmllclNldCk6CiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAoKICAgICAgICByZXR1cm4gc2VsZi5fc3BlY3MgPT0gb3RoZXIuX3NwZWNzCgogICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgc3RyaW5nX3R5cGVzKToKICAgICAgICAgICAgb3RoZXIgPSBTcGVjaWZpZXJTZXQob3RoZXIpCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKG90aGVyLCBfSW5kaXZpZHVhbFNwZWNpZmllcik6CiAgICAgICAgICAgIG90aGVyID0gU3BlY2lmaWVyU2V0KHN0cihvdGhlcikpCiAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgU3BlY2lmaWVyU2V0KToKICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCgogICAgICAgIHJldHVybiBzZWxmLl9zcGVjcyAhPSBvdGhlci5fc3BlY3MKCiAgICBkZWYgX19sZW5fXyhzZWxmKToKICAgICAgICByZXR1cm4gbGVuKHNlbGYuX3NwZWNzKQoKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICByZXR1cm4gaXRlcihzZWxmLl9zcGVjcykKCiAgICBAcHJvcGVydHkKICAgIGRlZiBwcmVyZWxlYXNlcyhzZWxmKToKICAgICAgICAjIElmIHdlIGhhdmUgYmVlbiBnaXZlbiBhbiBleHBsaWNpdCBwcmVyZWxlYXNlIG1vZGlmaWVyLCB0aGVuIHdlJ2xsCiAgICAgICAgIyBwYXNzIHRoYXQgdGhyb3VnaCBoZXJlLgogICAgICAgIGlmIHNlbGYuX3ByZXJlbGVhc2VzIGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fcHJlcmVsZWFzZXMKCiAgICAgICAgIyBJZiB3ZSBkb24ndCBoYXZlIGFueSBzcGVjaWZpZXJzLCBhbmQgd2UgZG9uJ3QgaGF2ZSBhIGZvcmNlZCB2YWx1ZSwKICAgICAgICAjIHRoZW4gd2UnbGwganVzdCByZXR1cm4gTm9uZSBzaW5jZSB3ZSBkb24ndCBrbm93IGlmIHRoaXMgc2hvdWxkIGhhdmUKICAgICAgICAjIHByZS1yZWxlYXNlcyBvciBub3QuCiAgICAgICAgaWYgbm90IHNlbGYuX3NwZWNzOgogICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgICAgICAjIE90aGVyd2lzZSB3ZSdsbCBzZWUgaWYgYW55IG9mIHRoZSBnaXZlbiBzcGVjaWZpZXJzIGFjY2VwdAogICAgICAgICMgcHJlcmVsZWFzZXMsIGlmIGFueSBvZiB0aGVtIGRvIHdlJ2xsIHJldHVybiBUcnVlLCBvdGhlcndpc2UgRmFsc2UuCiAgICAgICAgcmV0dXJuIGFueShzLnByZXJlbGVhc2VzIGZvciBzIGluIHNlbGYuX3NwZWNzKQoKICAgIEBwcmVyZWxlYXNlcy5zZXR0ZXIKICAgIGRlZiBwcmVyZWxlYXNlcyhzZWxmLCB2YWx1ZSk6CiAgICAgICAgc2VsZi5fcHJlcmVsZWFzZXMgPSB2YWx1ZQoKICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwgaXRlbSk6CiAgICAgICAgcmV0dXJuIHNlbGYuY29udGFpbnMoaXRlbSkKCiAgICBkZWYgY29udGFpbnMoc2VsZiwgaXRlbSwgcHJlcmVsZWFzZXM9Tm9uZSk6CiAgICAgICAgIyBFbnN1cmUgdGhhdCBvdXIgaXRlbSBpcyBhIFZlcnNpb24gb3IgTGVnYWN5VmVyc2lvbiBpbnN0YW5jZS4KICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShpdGVtLCAoTGVnYWN5VmVyc2lvbiwgVmVyc2lvbikpOgogICAgICAgICAgICBpdGVtID0gcGFyc2UoaXRlbSkKCiAgICAgICAgIyBEZXRlcm1pbmUgaWYgd2UncmUgZm9yY2luZyBhIHByZXJlbGVhc2Ugb3Igbm90LCBpZiB3ZSdyZSBub3QgZm9yY2luZwogICAgICAgICMgb25lIGZvciB0aGlzIHBhcnRpY3VsYXIgZmlsdGVyIGNhbGwsIHRoZW4gd2UnbGwgdXNlIHdoYXRldmVyIHRoZQogICAgICAgICMgU3BlY2lmaWVyU2V0IHRoaW5rcyBmb3Igd2hldGhlciBvciBub3Qgd2Ugc2hvdWxkIHN1cHBvcnQgcHJlcmVsZWFzZXMuCiAgICAgICAgaWYgcHJlcmVsZWFzZXMgaXMgTm9uZToKICAgICAgICAgICAgcHJlcmVsZWFzZXMgPSBzZWxmLnByZXJlbGVhc2VzCgogICAgICAgICMgV2UgY2FuIGRldGVybWluZSBpZiB3ZSdyZSBnb2luZyB0byBhbGxvdyBwcmUtcmVsZWFzZXMgYnkgbG9va2luZyB0bwogICAgICAgICMgc2VlIGlmIGFueSBvZiB0aGUgdW5kZXJseWluZyBpdGVtcyBzdXBwb3J0cyB0aGVtLiBJZiBub25lIG9mIHRoZW0gZG8KICAgICAgICAjIGFuZCB0aGlzIGl0ZW0gaXMgYSBwcmUtcmVsZWFzZSB0aGVuIHdlIGRvIG5vdCBhbGxvdyBpdCBhbmQgd2UgY2FuCiAgICAgICAgIyBzaG9ydCBjaXJjdWl0IHRoYXQgaGVyZS4KICAgICAgICAjIE5vdGU6IFRoaXMgbWVhbnMgdGhhdCAxLjAuZGV2MSB3b3VsZCBub3QgYmUgY29udGFpbmVkIGluIHNvbWV0aGluZwogICAgICAgICMgICAgICAgbGlrZSA+PTEuMC5kZXZhYmMgaG93ZXZlciBpdCB3b3VsZCBiZSBpbiA+PTEuMC5kZWJhYmMsPjAuMC5kZXYwCiAgICAgICAgaWYgbm90IHByZXJlbGVhc2VzIGFuZCBpdGVtLmlzX3ByZXJlbGVhc2U6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICAjIFdlIHNpbXBseSBkaXNwYXRjaCB0byB0aGUgdW5kZXJseWluZyBzcGVjcyBoZXJlIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZQogICAgICAgICMgZ2l2ZW4gdmVyc2lvbiBpcyBjb250YWluZWQgd2l0aGluIGFsbCBvZiB0aGVtLgogICAgICAgICMgTm90ZTogVGhpcyB1c2Ugb2YgYWxsKCkgaGVyZSBtZWFucyB0aGF0IGFuIGVtcHR5IHNldCBvZiBzcGVjaWZpZXJzCiAgICAgICAgIyAgICAgICB3aWxsIGFsd2F5cyByZXR1cm4gVHJ1ZSwgdGhpcyBpcyBhbiBleHBsaWNpdCBkZXNpZ24gZGVjaXNpb24uCiAgICAgICAgcmV0dXJuIGFsbChzLmNvbnRhaW5zKGl0ZW0sIHByZXJlbGVhc2VzPXByZXJlbGVhc2VzKSBmb3IgcyBpbiBzZWxmLl9zcGVjcykKCiAgICBkZWYgZmlsdGVyKHNlbGYsIGl0ZXJhYmxlLCBwcmVyZWxlYXNlcz1Ob25lKToKICAgICAgICAjIERldGVybWluZSBpZiB3ZSdyZSBmb3JjaW5nIGEgcHJlcmVsZWFzZSBvciBub3QsIGlmIHdlJ3JlIG5vdCBmb3JjaW5nCiAgICAgICAgIyBvbmUgZm9yIHRoaXMgcGFydGljdWxhciBmaWx0ZXIgY2FsbCwgdGhlbiB3ZSdsbCB1c2Ugd2hhdGV2ZXIgdGhlCiAgICAgICAgIyBTcGVjaWZpZXJTZXQgdGhpbmtzIGZvciB3aGV0aGVyIG9yIG5vdCB3ZSBzaG91bGQgc3VwcG9ydCBwcmVyZWxlYXNlcy4KICAgICAgICBpZiBwcmVyZWxlYXNlcyBpcyBOb25lOgogICAgICAgICAgICBwcmVyZWxlYXNlcyA9IHNlbGYucHJlcmVsZWFzZXMKCiAgICAgICAgIyBJZiB3ZSBoYXZlIGFueSBzcGVjaWZpZXJzLCB0aGVuIHdlIHdhbnQgdG8gd3JhcCBvdXIgaXRlcmFibGUgaW4gdGhlCiAgICAgICAgIyBmaWx0ZXIgbWV0aG9kIGZvciBlYWNoIG9uZSwgdGhpcyB3aWxsIGFjdCBhcyBhIGxvZ2ljYWwgQU5EIGFtb25nc3QKICAgICAgICAjIGVhY2ggc3BlY2lmaWVyLgogICAgICAgIGlmIHNlbGYuX3NwZWNzOgogICAgICAgICAgICBmb3Igc3BlYyBpbiBzZWxmLl9zcGVjczoKICAgICAgICAgICAgICAgIGl0ZXJhYmxlID0gc3BlYy5maWx0ZXIoaXRlcmFibGUsIHByZXJlbGVhc2VzPWJvb2wocHJlcmVsZWFzZXMpKQogICAgICAgICAgICByZXR1cm4gaXRlcmFibGUKICAgICAgICAjIElmIHdlIGRvIG5vdCBoYXZlIGFueSBzcGVjaWZpZXJzLCB0aGVuIHdlIG5lZWQgdG8gaGF2ZSBhIHJvdWdoIGZpbHRlcgogICAgICAgICMgd2hpY2ggd2lsbCBmaWx0ZXIgb3V0IGFueSBwcmUtcmVsZWFzZXMsIHVubGVzcyB0aGVyZSBhcmUgbm8gZmluYWwKICAgICAgICAjIHJlbGVhc2VzLCBhbmQgd2hpY2ggd2lsbCBmaWx0ZXIgb3V0IExlZ2FjeVZlcnNpb24gaW4gZ2VuZXJhbC4KICAgICAgICBlbHNlOgogICAgICAgICAgICBmaWx0ZXJlZCA9IFtdCiAgICAgICAgICAgIGZvdW5kX3ByZXJlbGVhc2VzID0gW10KCiAgICAgICAgICAgIGZvciBpdGVtIGluIGl0ZXJhYmxlOgogICAgICAgICAgICAgICAgIyBFbnN1cmUgdGhhdCB3ZSBzb21lIGtpbmQgb2YgVmVyc2lvbiBjbGFzcyBmb3IgdGhpcyBpdGVtLgogICAgICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoaXRlbSwgKExlZ2FjeVZlcnNpb24sIFZlcnNpb24pKToKICAgICAgICAgICAgICAgICAgICBwYXJzZWRfdmVyc2lvbiA9IHBhcnNlKGl0ZW0pCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHBhcnNlZF92ZXJzaW9uID0gaXRlbQoKICAgICAgICAgICAgICAgICMgRmlsdGVyIG91dCBhbnkgaXRlbSB3aGljaCBpcyBwYXJzZWQgYXMgYSBMZWdhY3lWZXJzaW9uCiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHBhcnNlZF92ZXJzaW9uLCBMZWdhY3lWZXJzaW9uKToKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgICAgICMgU3RvcmUgYW55IGl0ZW0gd2hpY2ggaXMgYSBwcmUtcmVsZWFzZSBmb3IgbGF0ZXIgdW5sZXNzIHdlJ3ZlCiAgICAgICAgICAgICAgICAjIGFscmVhZHkgZm91bmQgYSBmaW5hbCB2ZXJzaW9uIG9yIHdlIGFyZSBhY2NlcHRpbmcgcHJlcmVsZWFzZXMKICAgICAgICAgICAgICAgIGlmIHBhcnNlZF92ZXJzaW9uLmlzX3ByZXJlbGVhc2UgYW5kIG5vdCBwcmVyZWxlYXNlczoKICAgICAgICAgICAgICAgICAgICBpZiBub3QgZmlsdGVyZWQ6CiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kX3ByZXJlbGVhc2VzLmFwcGVuZChpdGVtKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZC5hcHBlbmQoaXRlbSkKCiAgICAgICAgICAgICMgSWYgd2UndmUgZm91bmQgbm8gaXRlbXMgZXhjZXB0IGZvciBwcmUtcmVsZWFzZXMsIHRoZW4gd2UnbGwgZ28KICAgICAgICAgICAgIyBhaGVhZCBhbmQgdXNlIHRoZSBwcmUtcmVsZWFzZXMKICAgICAgICAgICAgaWYgbm90IGZpbHRlcmVkIGFuZCBmb3VuZF9wcmVyZWxlYXNlcyBhbmQgcHJlcmVsZWFzZXMgaXMgTm9uZToKICAgICAgICAgICAgICAgIHJldHVybiBmb3VuZF9wcmVyZWxlYXNlcwoKICAgICAgICAgICAgcmV0dXJuIGZpbHRlcmVkClBLAwQUAAAAAAAAACEA8/aH/4UyAACFMgAASQAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL192ZW5kb3IvcGFja2FnaW5nL3RhZ3MucHkjIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24KIyAyLjAsIGFuZCB0aGUgQlNEIExpY2Vuc2UuIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcmVwb3NpdG9yeQojIGZvciBjb21wbGV0ZSBkZXRhaWxzLgoKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBkaXN0dXRpbHMudXRpbAoKdHJ5OgogICAgZnJvbSBpbXBvcnRsaWIubWFjaGluZXJ5IGltcG9ydCBFWFRFTlNJT05fU1VGRklYRVMKZXhjZXB0IEltcG9ydEVycm9yOiAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICBpbXBvcnQgaW1wCgogICAgRVhURU5TSU9OX1NVRkZJWEVTID0gW3hbMF0gZm9yIHggaW4gaW1wLmdldF9zdWZmaXhlcygpXQogICAgZGVsIGltcAppbXBvcnQgcGxhdGZvcm0KaW1wb3J0IHJlCmltcG9ydCBzeXMKaW1wb3J0IHN5c2NvbmZpZwppbXBvcnQgd2FybmluZ3MKCgpJTlRFUlBSRVRFUl9TSE9SVF9OQU1FUyA9IHsKICAgICJweXRob24iOiAicHkiLCAgIyBHZW5lcmljLgogICAgImNweXRob24iOiAiY3AiLAogICAgInB5cHkiOiAicHAiLAogICAgImlyb25weXRob24iOiAiaXAiLAogICAgImp5dGhvbiI6ICJqeSIsCn0KCgpfMzJfQklUX0lOVEVSUFJFVEVSID0gc3lzLm1heHNpemUgPD0gMiAqKiAzMgoKCmNsYXNzIFRhZyhvYmplY3QpOgoKICAgIF9fc2xvdHNfXyA9IFsiX2ludGVycHJldGVyIiwgIl9hYmkiLCAiX3BsYXRmb3JtIl0KCiAgICBkZWYgX19pbml0X18oc2VsZiwgaW50ZXJwcmV0ZXIsIGFiaSwgcGxhdGZvcm0pOgogICAgICAgIHNlbGYuX2ludGVycHJldGVyID0gaW50ZXJwcmV0ZXIubG93ZXIoKQogICAgICAgIHNlbGYuX2FiaSA9IGFiaS5sb3dlcigpCiAgICAgICAgc2VsZi5fcGxhdGZvcm0gPSBwbGF0Zm9ybS5sb3dlcigpCgogICAgQHByb3BlcnR5CiAgICBkZWYgaW50ZXJwcmV0ZXIoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2ludGVycHJldGVyCgogICAgQHByb3BlcnR5CiAgICBkZWYgYWJpKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9hYmkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBwbGF0Zm9ybShzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fcGxhdGZvcm0KCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gKAogICAgICAgICAgICAoc2VsZi5wbGF0Zm9ybSA9PSBvdGhlci5wbGF0Zm9ybSkKICAgICAgICAgICAgYW5kIChzZWxmLmFiaSA9PSBvdGhlci5hYmkpCiAgICAgICAgICAgIGFuZCAoc2VsZi5pbnRlcnByZXRlciA9PSBvdGhlci5pbnRlcnByZXRlcikKICAgICAgICApCgogICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgICAgIHJldHVybiBoYXNoKChzZWxmLl9pbnRlcnByZXRlciwgc2VsZi5fYWJpLCBzZWxmLl9wbGF0Zm9ybSkpCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmV0dXJuICJ7fS17fS17fSIuZm9ybWF0KHNlbGYuX2ludGVycHJldGVyLCBzZWxmLl9hYmksIHNlbGYuX3BsYXRmb3JtKQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIjx7c2VsZn0gQCB7c2VsZl9pZH0+Ii5mb3JtYXQoc2VsZj1zZWxmLCBzZWxmX2lkPWlkKHNlbGYpKQoKCmRlZiBwYXJzZV90YWcodGFnKToKICAgIHRhZ3MgPSBzZXQoKQogICAgaW50ZXJwcmV0ZXJzLCBhYmlzLCBwbGF0Zm9ybXMgPSB0YWcuc3BsaXQoIi0iKQogICAgZm9yIGludGVycHJldGVyIGluIGludGVycHJldGVycy5zcGxpdCgiLiIpOgogICAgICAgIGZvciBhYmkgaW4gYWJpcy5zcGxpdCgiLiIpOgogICAgICAgICAgICBmb3IgcGxhdGZvcm1fIGluIHBsYXRmb3Jtcy5zcGxpdCgiLiIpOgogICAgICAgICAgICAgICAgdGFncy5hZGQoVGFnKGludGVycHJldGVyLCBhYmksIHBsYXRmb3JtXykpCiAgICByZXR1cm4gZnJvemVuc2V0KHRhZ3MpCgoKZGVmIF9ub3JtYWxpemVfc3RyaW5nKHN0cmluZyk6CiAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoIi4iLCAiXyIpLnJlcGxhY2UoIi0iLCAiXyIpCgoKZGVmIF9jcHl0aG9uX2ludGVycHJldGVyKHB5X3ZlcnNpb24pOgogICAgIyBUT0RPOiBJcyB1c2luZyBweV92ZXJzaW9uX25vZG90IGZvciBpbnRlcnByZXRlciB2ZXJzaW9uIGNyaXRpY2FsPwogICAgcmV0dXJuICJjcHttYWpvcn17bWlub3J9Ii5mb3JtYXQobWFqb3I9cHlfdmVyc2lvblswXSwgbWlub3I9cHlfdmVyc2lvblsxXSkKCgpkZWYgX2NweXRob25fYWJpcyhweV92ZXJzaW9uKToKICAgIGFiaXMgPSBbXQogICAgdmVyc2lvbiA9ICJ7fXt9Ii5mb3JtYXQoKnB5X3ZlcnNpb25bOjJdKQogICAgZGVidWcgPSBweW1hbGxvYyA9IHVjczQgPSAiIgogICAgd2l0aF9kZWJ1ZyA9IHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcigiUHlfREVCVUciKQogICAgaGFzX3JlZmNvdW50ID0gaGFzYXR0cihzeXMsICJnZXR0b3RhbHJlZmNvdW50IikKICAgICMgV2luZG93cyBkb2Vzbid0IHNldCBQeV9ERUJVRywgc28gY2hlY2tpbmcgZm9yIHN1cHBvcnQgb2YgZGVidWctY29tcGlsZWQKICAgICMgZXh0ZW5zaW9uIG1vZHVsZXMgaXMgdGhlIGJlc3Qgb3B0aW9uLgogICAgIyBodHRwczovL2dpdGh1Yi5jb20vcHlwYS9waXAvaXNzdWVzLzMzODMjaXNzdWVjb21tZW50LTE3MzI2NzY5MgogICAgaGFzX2V4dCA9ICJfZC5weWQiIGluIEVYVEVOU0lPTl9TVUZGSVhFUwogICAgaWYgd2l0aF9kZWJ1ZyBvciAod2l0aF9kZWJ1ZyBpcyBOb25lIGFuZCAoaGFzX3JlZmNvdW50IG9yIGhhc19leHQpKToKICAgICAgICBkZWJ1ZyA9ICJkIgogICAgaWYgcHlfdmVyc2lvbiA8ICgzLCA4KToKICAgICAgICB3aXRoX3B5bWFsbG9jID0gc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCJXSVRIX1BZTUFMTE9DIikKICAgICAgICBpZiB3aXRoX3B5bWFsbG9jIG9yIHdpdGhfcHltYWxsb2MgaXMgTm9uZToKICAgICAgICAgICAgcHltYWxsb2MgPSAibSIKICAgICAgICBpZiBweV92ZXJzaW9uIDwgKDMsIDMpOgogICAgICAgICAgICB1bmljb2RlX3NpemUgPSBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoIlB5X1VOSUNPREVfU0laRSIpCiAgICAgICAgICAgIGlmIHVuaWNvZGVfc2l6ZSA9PSA0IG9yICgKICAgICAgICAgICAgICAgIHVuaWNvZGVfc2l6ZSBpcyBOb25lIGFuZCBzeXMubWF4dW5pY29kZSA9PSAweDEwRkZGRgogICAgICAgICAgICApOgogICAgICAgICAgICAgICAgdWNzNCA9ICJ1IgogICAgZWxpZiBkZWJ1ZzoKICAgICAgICAjIERlYnVnIGJ1aWxkcyBjYW4gYWxzbyBsb2FkICJub3JtYWwiIGV4dGVuc2lvbiBtb2R1bGVzLgogICAgICAgICMgV2UgY2FuIGFsc28gYXNzdW1lIG5vIFVDUy00IG9yIHB5bWFsbG9jIHJlcXVpcmVtZW50LgogICAgICAgIGFiaXMuYXBwZW5kKCJjcHt2ZXJzaW9ufSIuZm9ybWF0KHZlcnNpb249dmVyc2lvbikpCiAgICBhYmlzLmluc2VydCgKICAgICAgICAwLAogICAgICAgICJjcHt2ZXJzaW9ufXtkZWJ1Z317cHltYWxsb2N9e3VjczR9Ii5mb3JtYXQoCiAgICAgICAgICAgIHZlcnNpb249dmVyc2lvbiwgZGVidWc9ZGVidWcsIHB5bWFsbG9jPXB5bWFsbG9jLCB1Y3M0PXVjczQKICAgICAgICApLAogICAgKQogICAgcmV0dXJuIGFiaXMKCgpkZWYgX2NweXRob25fdGFncyhweV92ZXJzaW9uLCBpbnRlcnByZXRlciwgYWJpcywgcGxhdGZvcm1zKToKICAgIGZvciBhYmkgaW4gYWJpczoKICAgICAgICBmb3IgcGxhdGZvcm1fIGluIHBsYXRmb3JtczoKICAgICAgICAgICAgeWllbGQgVGFnKGludGVycHJldGVyLCBhYmksIHBsYXRmb3JtXykKICAgIGZvciB0YWcgaW4gKFRhZyhpbnRlcnByZXRlciwgImFiaTMiLCBwbGF0Zm9ybV8pIGZvciBwbGF0Zm9ybV8gaW4gcGxhdGZvcm1zKToKICAgICAgICB5aWVsZCB0YWcKICAgIGZvciB0YWcgaW4gKFRhZyhpbnRlcnByZXRlciwgIm5vbmUiLCBwbGF0Zm9ybV8pIGZvciBwbGF0Zm9ybV8gaW4gcGxhdGZvcm1zKToKICAgICAgICB5aWVsZCB0YWcKICAgICMgUEVQIDM4NCB3YXMgZmlyc3QgaW1wbGVtZW50ZWQgaW4gUHl0aG9uIDMuMi4KICAgIGZvciBtaW5vcl92ZXJzaW9uIGluIHJhbmdlKHB5X3ZlcnNpb25bMV0gLSAxLCAxLCAtMSk6CiAgICAgICAgZm9yIHBsYXRmb3JtXyBpbiBwbGF0Zm9ybXM6CiAgICAgICAgICAgIGludGVycHJldGVyID0gImNwe21ham9yfXttaW5vcn0iLmZvcm1hdCgKICAgICAgICAgICAgICAgIG1ham9yPXB5X3ZlcnNpb25bMF0sIG1pbm9yPW1pbm9yX3ZlcnNpb24KICAgICAgICAgICAgKQogICAgICAgICAgICB5aWVsZCBUYWcoaW50ZXJwcmV0ZXIsICJhYmkzIiwgcGxhdGZvcm1fKQoKCmRlZiBfcHlweV9pbnRlcnByZXRlcigpOgogICAgcmV0dXJuICJwcHtweV9tYWpvcn17cHlweV9tYWpvcn17cHlweV9taW5vcn0iLmZvcm1hdCgKICAgICAgICBweV9tYWpvcj1zeXMudmVyc2lvbl9pbmZvWzBdLAogICAgICAgIHB5cHlfbWFqb3I9c3lzLnB5cHlfdmVyc2lvbl9pbmZvLm1ham9yLAogICAgICAgIHB5cHlfbWlub3I9c3lzLnB5cHlfdmVyc2lvbl9pbmZvLm1pbm9yLAogICAgKQoKCmRlZiBfZ2VuZXJpY19hYmkoKToKICAgIGFiaSA9IHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcigiU09BQkkiKQogICAgaWYgYWJpOgogICAgICAgIHJldHVybiBfbm9ybWFsaXplX3N0cmluZyhhYmkpCiAgICBlbHNlOgogICAgICAgIHJldHVybiAibm9uZSIKCgpkZWYgX3B5cHlfdGFncyhweV92ZXJzaW9uLCBpbnRlcnByZXRlciwgYWJpLCBwbGF0Zm9ybXMpOgogICAgZm9yIHRhZyBpbiAoVGFnKGludGVycHJldGVyLCBhYmksIHBsYXRmb3JtKSBmb3IgcGxhdGZvcm0gaW4gcGxhdGZvcm1zKToKICAgICAgICB5aWVsZCB0YWcKICAgIGZvciB0YWcgaW4gKFRhZyhpbnRlcnByZXRlciwgIm5vbmUiLCBwbGF0Zm9ybSkgZm9yIHBsYXRmb3JtIGluIHBsYXRmb3Jtcyk6CiAgICAgICAgeWllbGQgdGFnCgoKZGVmIF9nZW5lcmljX3RhZ3MoaW50ZXJwcmV0ZXIsIHB5X3ZlcnNpb24sIGFiaSwgcGxhdGZvcm1zKToKICAgIGZvciB0YWcgaW4gKFRhZyhpbnRlcnByZXRlciwgYWJpLCBwbGF0Zm9ybSkgZm9yIHBsYXRmb3JtIGluIHBsYXRmb3Jtcyk6CiAgICAgICAgeWllbGQgdGFnCiAgICBpZiBhYmkgIT0gIm5vbmUiOgogICAgICAgIHRhZ3MgPSAoVGFnKGludGVycHJldGVyLCAibm9uZSIsIHBsYXRmb3JtXykgZm9yIHBsYXRmb3JtXyBpbiBwbGF0Zm9ybXMpCiAgICAgICAgZm9yIHRhZyBpbiB0YWdzOgogICAgICAgICAgICB5aWVsZCB0YWcKCgpkZWYgX3B5X2ludGVycHJldGVyX3JhbmdlKHB5X3ZlcnNpb24pOgogICAgIiIiCiAgICBZaWVsZCBQeXRob24gdmVyc2lvbnMgaW4gZGVzY2VuZGluZyBvcmRlci4KCiAgICBBZnRlciB0aGUgbGF0ZXN0IHZlcnNpb24sIHRoZSBtYWpvci1vbmx5IHZlcnNpb24gd2lsbCBiZSB5aWVsZGVkLCBhbmQgdGhlbgogICAgYWxsIGZvbGxvd2luZyB2ZXJzaW9ucyB1cCB0byAnZW5kJy4KICAgICIiIgogICAgeWllbGQgInB5e21ham9yfXttaW5vcn0iLmZvcm1hdChtYWpvcj1weV92ZXJzaW9uWzBdLCBtaW5vcj1weV92ZXJzaW9uWzFdKQogICAgeWllbGQgInB5e21ham9yfSIuZm9ybWF0KG1ham9yPXB5X3ZlcnNpb25bMF0pCiAgICBmb3IgbWlub3IgaW4gcmFuZ2UocHlfdmVyc2lvblsxXSAtIDEsIC0xLCAtMSk6CiAgICAgICAgeWllbGQgInB5e21ham9yfXttaW5vcn0iLmZvcm1hdChtYWpvcj1weV92ZXJzaW9uWzBdLCBtaW5vcj1taW5vcikKCgpkZWYgX2luZGVwZW5kZW50X3RhZ3MoaW50ZXJwcmV0ZXIsIHB5X3ZlcnNpb24sIHBsYXRmb3Jtcyk6CiAgICAiIiIKICAgIFJldHVybiB0aGUgc2VxdWVuY2Ugb2YgdGFncyB0aGF0IGFyZSBjb25zaXN0ZW50IGFjcm9zcyBpbXBsZW1lbnRhdGlvbnMuCgogICAgVGhlIHRhZ3MgY29uc2lzdCBvZjoKICAgIC0gcHkqLW5vbmUtPHBsYXRmb3JtPgogICAgLSA8aW50ZXJwcmV0ZXI+LW5vbmUtYW55CiAgICAtIHB5Ki1ub25lLWFueQogICAgIiIiCiAgICBmb3IgdmVyc2lvbiBpbiBfcHlfaW50ZXJwcmV0ZXJfcmFuZ2UocHlfdmVyc2lvbik6CiAgICAgICAgZm9yIHBsYXRmb3JtXyBpbiBwbGF0Zm9ybXM6CiAgICAgICAgICAgIHlpZWxkIFRhZyh2ZXJzaW9uLCAibm9uZSIsIHBsYXRmb3JtXykKICAgIHlpZWxkIFRhZyhpbnRlcnByZXRlciwgIm5vbmUiLCAiYW55IikKICAgIGZvciB2ZXJzaW9uIGluIF9weV9pbnRlcnByZXRlcl9yYW5nZShweV92ZXJzaW9uKToKICAgICAgICB5aWVsZCBUYWcodmVyc2lvbiwgIm5vbmUiLCAiYW55IikKCgpkZWYgX21hY19hcmNoKGFyY2gsIGlzXzMyYml0PV8zMl9CSVRfSU5URVJQUkVURVIpOgogICAgaWYgbm90IGlzXzMyYml0OgogICAgICAgIHJldHVybiBhcmNoCgogICAgaWYgYXJjaC5zdGFydHN3aXRoKCJwcGMiKToKICAgICAgICByZXR1cm4gInBwYyIKCiAgICByZXR1cm4gImkzODYiCgoKZGVmIF9tYWNfYmluYXJ5X2Zvcm1hdHModmVyc2lvbiwgY3B1X2FyY2gpOgogICAgZm9ybWF0cyA9IFtjcHVfYXJjaF0KICAgIGlmIGNwdV9hcmNoID09ICJ4ODZfNjQiOgogICAgICAgIGlmIHZlcnNpb24gPCAoMTAsIDQpOgogICAgICAgICAgICByZXR1cm4gW10KICAgICAgICBmb3JtYXRzLmV4dGVuZChbImludGVsIiwgImZhdDY0IiwgImZhdDMyIl0pCgogICAgZWxpZiBjcHVfYXJjaCA9PSAiaTM4NiI6CiAgICAgICAgaWYgdmVyc2lvbiA8ICgxMCwgNCk6CiAgICAgICAgICAgIHJldHVybiBbXQogICAgICAgIGZvcm1hdHMuZXh0ZW5kKFsiaW50ZWwiLCAiZmF0MzIiLCAiZmF0Il0pCgogICAgZWxpZiBjcHVfYXJjaCA9PSAicHBjNjQiOgogICAgICAgICMgVE9ETzogTmVlZCB0byBjYXJlIGFib3V0IDMyLWJpdCBQUEMgZm9yIHBwYzY0IHRocm91Z2ggMTAuMj8KICAgICAgICBpZiB2ZXJzaW9uID4gKDEwLCA1KSBvciB2ZXJzaW9uIDwgKDEwLCA0KToKICAgICAgICAgICAgcmV0dXJuIFtdCiAgICAgICAgZm9ybWF0cy5hcHBlbmQoImZhdDY0IikKCiAgICBlbGlmIGNwdV9hcmNoID09ICJwcGMiOgogICAgICAgIGlmIHZlcnNpb24gPiAoMTAsIDYpOgogICAgICAgICAgICByZXR1cm4gW10KICAgICAgICBmb3JtYXRzLmV4dGVuZChbImZhdDMyIiwgImZhdCJdKQoKICAgIGZvcm1hdHMuYXBwZW5kKCJ1bml2ZXJzYWwiKQogICAgcmV0dXJuIGZvcm1hdHMKCgpkZWYgX21hY19wbGF0Zm9ybXModmVyc2lvbj1Ob25lLCBhcmNoPU5vbmUpOgogICAgdmVyc2lvbl9zdHIsIF8sIGNwdV9hcmNoID0gcGxhdGZvcm0ubWFjX3ZlcigpCiAgICBpZiB2ZXJzaW9uIGlzIE5vbmU6CiAgICAgICAgdmVyc2lvbiA9IHR1cGxlKG1hcChpbnQsIHZlcnNpb25fc3RyLnNwbGl0KCIuIilbOjJdKSkKICAgIGlmIGFyY2ggaXMgTm9uZToKICAgICAgICBhcmNoID0gX21hY19hcmNoKGNwdV9hcmNoKQogICAgcGxhdGZvcm1zID0gW10KICAgIGZvciBtaW5vcl92ZXJzaW9uIGluIHJhbmdlKHZlcnNpb25bMV0sIC0xLCAtMSk6CiAgICAgICAgY29tcGF0X3ZlcnNpb24gPSB2ZXJzaW9uWzBdLCBtaW5vcl92ZXJzaW9uCiAgICAgICAgYmluYXJ5X2Zvcm1hdHMgPSBfbWFjX2JpbmFyeV9mb3JtYXRzKGNvbXBhdF92ZXJzaW9uLCBhcmNoKQogICAgICAgIGZvciBiaW5hcnlfZm9ybWF0IGluIGJpbmFyeV9mb3JtYXRzOgogICAgICAgICAgICBwbGF0Zm9ybXMuYXBwZW5kKAogICAgICAgICAgICAgICAgIm1hY29zeF97bWFqb3J9X3ttaW5vcn1fe2JpbmFyeV9mb3JtYXR9Ii5mb3JtYXQoCiAgICAgICAgICAgICAgICAgICAgbWFqb3I9Y29tcGF0X3ZlcnNpb25bMF0sCiAgICAgICAgICAgICAgICAgICAgbWlub3I9Y29tcGF0X3ZlcnNpb25bMV0sCiAgICAgICAgICAgICAgICAgICAgYmluYXJ5X2Zvcm1hdD1iaW5hcnlfZm9ybWF0LAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICApCiAgICByZXR1cm4gcGxhdGZvcm1zCgoKIyBGcm9tIFBFUCA1MTMuCmRlZiBfaXNfbWFueWxpbnV4X2NvbXBhdGlibGUobmFtZSwgZ2xpYmNfdmVyc2lvbik6CiAgICAjIENoZWNrIGZvciBwcmVzZW5jZSBvZiBfbWFueWxpbnV4IG1vZHVsZS4KICAgIHRyeToKICAgICAgICBpbXBvcnQgX21hbnlsaW51eAoKICAgICAgICByZXR1cm4gYm9vbChnZXRhdHRyKF9tYW55bGludXgsIG5hbWUgKyAiX2NvbXBhdGlibGUiKSkKICAgIGV4Y2VwdCAoSW1wb3J0RXJyb3IsIEF0dHJpYnV0ZUVycm9yKToKICAgICAgICAjIEZhbGwgdGhyb3VnaCB0byBoZXVyaXN0aWMgY2hlY2sgYmVsb3cuCiAgICAgICAgcGFzcwoKICAgIHJldHVybiBfaGF2ZV9jb21wYXRpYmxlX2dsaWJjKCpnbGliY192ZXJzaW9uKQoKCmRlZiBfZ2xpYmNfdmVyc2lvbl9zdHJpbmcoKToKICAgICMgUmV0dXJucyBnbGliYyB2ZXJzaW9uIHN0cmluZywgb3IgTm9uZSBpZiBub3QgdXNpbmcgZ2xpYmMuCiAgICBpbXBvcnQgY3R5cGVzCgogICAgIyBjdHlwZXMuQ0RMTChOb25lKSBpbnRlcm5hbGx5IGNhbGxzIGRsb3BlbihOVUxMKSwgYW5kIGFzIHRoZSBkbG9wZW4KICAgICMgbWFucGFnZSBzYXlzLCAiSWYgZmlsZW5hbWUgaXMgTlVMTCwgdGhlbiB0aGUgcmV0dXJuZWQgaGFuZGxlIGlzIGZvciB0aGUKICAgICMgbWFpbiBwcm9ncmFtIi4gVGhpcyB3YXkgd2UgY2FuIGxldCB0aGUgbGlua2VyIGRvIHRoZSB3b3JrIHRvIGZpZ3VyZSBvdXQKICAgICMgd2hpY2ggbGliYyBvdXIgcHJvY2VzcyBpcyBhY3R1YWxseSB1c2luZy4KICAgIHByb2Nlc3NfbmFtZXNwYWNlID0gY3R5cGVzLkNETEwoTm9uZSkKICAgIHRyeToKICAgICAgICBnbnVfZ2V0X2xpYmNfdmVyc2lvbiA9IHByb2Nlc3NfbmFtZXNwYWNlLmdudV9nZXRfbGliY192ZXJzaW9uCiAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgIyBTeW1ib2wgZG9lc24ndCBleGlzdCAtPiB0aGVyZWZvcmUsIHdlIGFyZSBub3QgbGlua2VkIHRvCiAgICAgICAgIyBnbGliYy4KICAgICAgICByZXR1cm4gTm9uZQoKICAgICMgQ2FsbCBnbnVfZ2V0X2xpYmNfdmVyc2lvbiwgd2hpY2ggcmV0dXJucyBhIHN0cmluZyBsaWtlICIyLjUiCiAgICBnbnVfZ2V0X2xpYmNfdmVyc2lvbi5yZXN0eXBlID0gY3R5cGVzLmNfY2hhcl9wCiAgICB2ZXJzaW9uX3N0ciA9IGdudV9nZXRfbGliY192ZXJzaW9uKCkKICAgICMgcHkyIC8gcHkzIGNvbXBhdGliaWxpdHk6CiAgICBpZiBub3QgaXNpbnN0YW5jZSh2ZXJzaW9uX3N0ciwgc3RyKToKICAgICAgICB2ZXJzaW9uX3N0ciA9IHZlcnNpb25fc3RyLmRlY29kZSgiYXNjaWkiKQoKICAgIHJldHVybiB2ZXJzaW9uX3N0cgoKCiMgU2VwYXJhdGVkIG91dCBmcm9tIGhhdmVfY29tcGF0aWJsZV9nbGliYyBmb3IgZWFzaWVyIHVuaXQgdGVzdGluZy4KZGVmIF9jaGVja19nbGliY192ZXJzaW9uKHZlcnNpb25fc3RyLCByZXF1aXJlZF9tYWpvciwgbWluaW11bV9taW5vcik6CiAgICAjIFBhcnNlIHN0cmluZyBhbmQgY2hlY2sgYWdhaW5zdCByZXF1ZXN0ZWQgdmVyc2lvbi4KICAgICMKICAgICMgV2UgdXNlIGEgcmVnZXhwIGluc3RlYWQgb2Ygc3RyLnNwbGl0IGJlY2F1c2Ugd2Ugd2FudCB0byBkaXNjYXJkIGFueQogICAgIyByYW5kb20ganVuayB0aGF0IG1pZ2h0IGNvbWUgYWZ0ZXIgdGhlIG1pbm9yIHZlcnNpb24gLS0gdGhpcyBtaWdodCBoYXBwZW4KICAgICMgaW4gcGF0Y2hlZC9mb3JrZWQgdmVyc2lvbnMgb2YgZ2xpYmMgKGUuZy4gTGluYXJvJ3MgdmVyc2lvbiBvZiBnbGliYwogICAgIyB1c2VzIHZlcnNpb24gc3RyaW5ncyBsaWtlICIyLjIwLTIwMTQuMTEiKS4gU2VlIGdoLTM1ODguCiAgICBtID0gcmUubWF0Y2gociIoP1A8bWFqb3I+WzAtOV0rKVwuKD9QPG1pbm9yPlswLTldKykiLCB2ZXJzaW9uX3N0cikKICAgIGlmIG5vdCBtOgogICAgICAgIHdhcm5pbmdzLndhcm4oCiAgICAgICAgICAgICJFeHBlY3RlZCBnbGliYyB2ZXJzaW9uIHdpdGggMiBjb21wb25lbnRzIG1ham9yLm1pbm9yLCIKICAgICAgICAgICAgIiBnb3Q6ICVzIiAlIHZlcnNpb25fc3RyLAogICAgICAgICAgICBSdW50aW1lV2FybmluZywKICAgICAgICApCiAgICAgICAgcmV0dXJuIEZhbHNlCiAgICByZXR1cm4gKAogICAgICAgIGludChtLmdyb3VwKCJtYWpvciIpKSA9PSByZXF1aXJlZF9tYWpvcgogICAgICAgIGFuZCBpbnQobS5ncm91cCgibWlub3IiKSkgPj0gbWluaW11bV9taW5vcgogICAgKQoKCmRlZiBfaGF2ZV9jb21wYXRpYmxlX2dsaWJjKHJlcXVpcmVkX21ham9yLCBtaW5pbXVtX21pbm9yKToKICAgIHZlcnNpb25fc3RyID0gX2dsaWJjX3ZlcnNpb25fc3RyaW5nKCkKICAgIGlmIHZlcnNpb25fc3RyIGlzIE5vbmU6CiAgICAgICAgcmV0dXJuIEZhbHNlCiAgICByZXR1cm4gX2NoZWNrX2dsaWJjX3ZlcnNpb24odmVyc2lvbl9zdHIsIHJlcXVpcmVkX21ham9yLCBtaW5pbXVtX21pbm9yKQoKCmRlZiBfbGludXhfcGxhdGZvcm1zKGlzXzMyYml0PV8zMl9CSVRfSU5URVJQUkVURVIpOgogICAgbGludXggPSBfbm9ybWFsaXplX3N0cmluZyhkaXN0dXRpbHMudXRpbC5nZXRfcGxhdGZvcm0oKSkKICAgIGlmIGxpbnV4ID09ICJsaW51eF94ODZfNjQiIGFuZCBpc18zMmJpdDoKICAgICAgICBsaW51eCA9ICJsaW51eF9pNjg2IgogICAgbWFueWxpbnV4X3N1cHBvcnQgPSAoCiAgICAgICAgKCJtYW55bGludXgyMDE0IiwgKDIsIDE3KSksICAjIENlbnRPUyA3IHcvIGdsaWJjIDIuMTcgKFBFUCA1OTkpCiAgICAgICAgKCJtYW55bGludXgyMDEwIiwgKDIsIDEyKSksICAjIENlbnRPUyA2IHcvIGdsaWJjIDIuMTIgKFBFUCA1NzEpCiAgICAgICAgKCJtYW55bGludXgxIiwgKDIsIDUpKSwgICMgQ2VudE9TIDUgdy8gZ2xpYmMgMi41IChQRVAgNTEzKQogICAgKQogICAgbWFueWxpbnV4X3N1cHBvcnRfaXRlciA9IGl0ZXIobWFueWxpbnV4X3N1cHBvcnQpCiAgICBmb3IgbmFtZSwgZ2xpYmNfdmVyc2lvbiBpbiBtYW55bGludXhfc3VwcG9ydF9pdGVyOgogICAgICAgIGlmIF9pc19tYW55bGludXhfY29tcGF0aWJsZShuYW1lLCBnbGliY192ZXJzaW9uKToKICAgICAgICAgICAgcGxhdGZvcm1zID0gW2xpbnV4LnJlcGxhY2UoImxpbnV4IiwgbmFtZSldCiAgICAgICAgICAgIGJyZWFrCiAgICBlbHNlOgogICAgICAgIHBsYXRmb3JtcyA9IFtdCiAgICAjIFN1cHBvcnQgZm9yIGEgbGF0ZXIgbWFueWxpbnV4IGltcGxpZXMgc3VwcG9ydCBmb3IgYW4gZWFybGllciB2ZXJzaW9uLgogICAgcGxhdGZvcm1zICs9IFtsaW51eC5yZXBsYWNlKCJsaW51eCIsIG5hbWUpIGZvciBuYW1lLCBfIGluIG1hbnlsaW51eF9zdXBwb3J0X2l0ZXJdCiAgICBwbGF0Zm9ybXMuYXBwZW5kKGxpbnV4KQogICAgcmV0dXJuIHBsYXRmb3JtcwoKCmRlZiBfZ2VuZXJpY19wbGF0Zm9ybXMoKToKICAgIHBsYXRmb3JtID0gX25vcm1hbGl6ZV9zdHJpbmcoZGlzdHV0aWxzLnV0aWwuZ2V0X3BsYXRmb3JtKCkpCiAgICByZXR1cm4gW3BsYXRmb3JtXQoKCmRlZiBfaW50ZXJwcmV0ZXJfbmFtZSgpOgogICAgbmFtZSA9IHBsYXRmb3JtLnB5dGhvbl9pbXBsZW1lbnRhdGlvbigpLmxvd2VyKCkKICAgIHJldHVybiBJTlRFUlBSRVRFUl9TSE9SVF9OQU1FUy5nZXQobmFtZSkgb3IgbmFtZQoKCmRlZiBfZ2VuZXJpY19pbnRlcnByZXRlcihuYW1lLCBweV92ZXJzaW9uKToKICAgIHZlcnNpb24gPSBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoInB5X3ZlcnNpb25fbm9kb3QiKQogICAgaWYgbm90IHZlcnNpb246CiAgICAgICAgdmVyc2lvbiA9ICIiLmpvaW4obWFwKHN0ciwgcHlfdmVyc2lvbls6Ml0pKQogICAgcmV0dXJuICJ7bmFtZX17dmVyc2lvbn0iLmZvcm1hdChuYW1lPW5hbWUsIHZlcnNpb249dmVyc2lvbikKCgpkZWYgc3lzX3RhZ3MoKToKICAgICIiIgogICAgUmV0dXJucyB0aGUgc2VxdWVuY2Ugb2YgdGFnIHRyaXBsZXMgZm9yIHRoZSBydW5uaW5nIGludGVycHJldGVyLgoKICAgIFRoZSBvcmRlciBvZiB0aGUgc2VxdWVuY2UgY29ycmVzcG9uZHMgdG8gcHJpb3JpdHkgb3JkZXIgZm9yIHRoZQogICAgaW50ZXJwcmV0ZXIsIGZyb20gbW9zdCB0byBsZWFzdCBpbXBvcnRhbnQuCiAgICAiIiIKICAgIHB5X3ZlcnNpb24gPSBzeXMudmVyc2lvbl9pbmZvWzoyXQogICAgaW50ZXJwcmV0ZXJfbmFtZSA9IF9pbnRlcnByZXRlcl9uYW1lKCkKICAgIGlmIHBsYXRmb3JtLnN5c3RlbSgpID09ICJEYXJ3aW4iOgogICAgICAgIHBsYXRmb3JtcyA9IF9tYWNfcGxhdGZvcm1zKCkKICAgIGVsaWYgcGxhdGZvcm0uc3lzdGVtKCkgPT0gIkxpbnV4IjoKICAgICAgICBwbGF0Zm9ybXMgPSBfbGludXhfcGxhdGZvcm1zKCkKICAgIGVsc2U6CiAgICAgICAgcGxhdGZvcm1zID0gX2dlbmVyaWNfcGxhdGZvcm1zKCkKCiAgICBpZiBpbnRlcnByZXRlcl9uYW1lID09ICJjcCI6CiAgICAgICAgaW50ZXJwcmV0ZXIgPSBfY3B5dGhvbl9pbnRlcnByZXRlcihweV92ZXJzaW9uKQogICAgICAgIGFiaXMgPSBfY3B5dGhvbl9hYmlzKHB5X3ZlcnNpb24pCiAgICAgICAgZm9yIHRhZyBpbiBfY3B5dGhvbl90YWdzKHB5X3ZlcnNpb24sIGludGVycHJldGVyLCBhYmlzLCBwbGF0Zm9ybXMpOgogICAgICAgICAgICB5aWVsZCB0YWcKICAgIGVsaWYgaW50ZXJwcmV0ZXJfbmFtZSA9PSAicHAiOgogICAgICAgIGludGVycHJldGVyID0gX3B5cHlfaW50ZXJwcmV0ZXIoKQogICAgICAgIGFiaSA9IF9nZW5lcmljX2FiaSgpCiAgICAgICAgZm9yIHRhZyBpbiBfcHlweV90YWdzKHB5X3ZlcnNpb24sIGludGVycHJldGVyLCBhYmksIHBsYXRmb3Jtcyk6CiAgICAgICAgICAgIHlpZWxkIHRhZwogICAgZWxzZToKICAgICAgICBpbnRlcnByZXRlciA9IF9nZW5lcmljX2ludGVycHJldGVyKGludGVycHJldGVyX25hbWUsIHB5X3ZlcnNpb24pCiAgICAgICAgYWJpID0gX2dlbmVyaWNfYWJpKCkKICAgICAgICBmb3IgdGFnIGluIF9nZW5lcmljX3RhZ3MoaW50ZXJwcmV0ZXIsIHB5X3ZlcnNpb24sIGFiaSwgcGxhdGZvcm1zKToKICAgICAgICAgICAgeWllbGQgdGFnCiAgICBmb3IgdGFnIGluIF9pbmRlcGVuZGVudF90YWdzKGludGVycHJldGVyLCBweV92ZXJzaW9uLCBwbGF0Zm9ybXMpOgogICAgICAgIHlpZWxkIHRhZwpQSwMEFAAAAAAAAAAhAGE9rZ3wBQAA8AUAAEoAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9fdmVuZG9yL3BhY2thZ2luZy91dGlscy5weSMgVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbgojIDIuMCwgYW5kIHRoZSBCU0QgTGljZW5zZS4gU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyByZXBvc2l0b3J5CiMgZm9yIGNvbXBsZXRlIGRldGFpbHMuCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgcHJpbnRfZnVuY3Rpb24KCmltcG9ydCByZQoKZnJvbSAudmVyc2lvbiBpbXBvcnQgSW52YWxpZFZlcnNpb24sIFZlcnNpb24KCgpfY2Fub25pY2FsaXplX3JlZ2V4ID0gcmUuY29tcGlsZShyIlstXy5dKyIpCgoKZGVmIGNhbm9uaWNhbGl6ZV9uYW1lKG5hbWUpOgogICAgIyBUaGlzIGlzIHRha2VuIGZyb20gUEVQIDUwMy4KICAgIHJldHVybiBfY2Fub25pY2FsaXplX3JlZ2V4LnN1YigiLSIsIG5hbWUpLmxvd2VyKCkKCgpkZWYgY2Fub25pY2FsaXplX3ZlcnNpb24odmVyc2lvbik6CiAgICAiIiIKICAgIFRoaXMgaXMgdmVyeSBzaW1pbGFyIHRvIFZlcnNpb24uX19zdHJfXywgYnV0IGhhcyBvbmUgc3VidGxlIGRpZmZlcmVuY2VzCiAgICB3aXRoIHRoZSB3YXkgaXQgaGFuZGxlcyB0aGUgcmVsZWFzZSBzZWdtZW50LgogICAgIiIiCgogICAgdHJ5OgogICAgICAgIHZlcnNpb24gPSBWZXJzaW9uKHZlcnNpb24pCiAgICBleGNlcHQgSW52YWxpZFZlcnNpb246CiAgICAgICAgIyBMZWdhY3kgdmVyc2lvbnMgY2Fubm90IGJlIG5vcm1hbGl6ZWQKICAgICAgICByZXR1cm4gdmVyc2lvbgoKICAgIHBhcnRzID0gW10KCiAgICAjIEVwb2NoCiAgICBpZiB2ZXJzaW9uLmVwb2NoICE9IDA6CiAgICAgICAgcGFydHMuYXBwZW5kKCJ7MH0hIi5mb3JtYXQodmVyc2lvbi5lcG9jaCkpCgogICAgIyBSZWxlYXNlIHNlZ21lbnQKICAgICMgTkI6IFRoaXMgc3RyaXBzIHRyYWlsaW5nICcuMCdzIHRvIG5vcm1hbGl6ZQogICAgcGFydHMuYXBwZW5kKHJlLnN1YihyIihcLjApKyQiLCAiIiwgIi4iLmpvaW4oc3RyKHgpIGZvciB4IGluIHZlcnNpb24ucmVsZWFzZSkpKQoKICAgICMgUHJlLXJlbGVhc2UKICAgIGlmIHZlcnNpb24ucHJlIGlzIG5vdCBOb25lOgogICAgICAgIHBhcnRzLmFwcGVuZCgiIi5qb2luKHN0cih4KSBmb3IgeCBpbiB2ZXJzaW9uLnByZSkpCgogICAgIyBQb3N0LXJlbGVhc2UKICAgIGlmIHZlcnNpb24ucG9zdCBpcyBub3QgTm9uZToKICAgICAgICBwYXJ0cy5hcHBlbmQoIi5wb3N0ezB9Ii5mb3JtYXQodmVyc2lvbi5wb3N0KSkKCiAgICAjIERldmVsb3BtZW50IHJlbGVhc2UKICAgIGlmIHZlcnNpb24uZGV2IGlzIG5vdCBOb25lOgogICAgICAgIHBhcnRzLmFwcGVuZCgiLmRldnswfSIuZm9ybWF0KHZlcnNpb24uZGV2KSkKCiAgICAjIExvY2FsIHZlcnNpb24gc2VnbWVudAogICAgaWYgdmVyc2lvbi5sb2NhbCBpcyBub3QgTm9uZToKICAgICAgICBwYXJ0cy5hcHBlbmQoIit7MH0iLmZvcm1hdCh2ZXJzaW9uLmxvY2FsKSkKCiAgICByZXR1cm4gIiIuam9pbihwYXJ0cykKUEsDBBQAAAAAAAAAIQDxM3Lryi4AAMouAABMAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvX3ZlbmRvci9wYWNrYWdpbmcvdmVyc2lvbi5weSMgVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbgojIDIuMCwgYW5kIHRoZSBCU0QgTGljZW5zZS4gU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyByZXBvc2l0b3J5CiMgZm9yIGNvbXBsZXRlIGRldGFpbHMuCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgcHJpbnRfZnVuY3Rpb24KCmltcG9ydCBjb2xsZWN0aW9ucwppbXBvcnQgaXRlcnRvb2xzCmltcG9ydCByZQoKZnJvbSAuX3N0cnVjdHVyZXMgaW1wb3J0IEluZmluaXR5CgoKX19hbGxfXyA9IFsicGFyc2UiLCAiVmVyc2lvbiIsICJMZWdhY3lWZXJzaW9uIiwgIkludmFsaWRWZXJzaW9uIiwgIlZFUlNJT05fUEFUVEVSTiJdCgoKX1ZlcnNpb24gPSBjb2xsZWN0aW9ucy5uYW1lZHR1cGxlKAogICAgIl9WZXJzaW9uIiwgWyJlcG9jaCIsICJyZWxlYXNlIiwgImRldiIsICJwcmUiLCAicG9zdCIsICJsb2NhbCJdCikKCgpkZWYgcGFyc2UodmVyc2lvbik6CiAgICAiIiIKICAgIFBhcnNlIHRoZSBnaXZlbiB2ZXJzaW9uIHN0cmluZyBhbmQgcmV0dXJuIGVpdGhlciBhIDpjbGFzczpgVmVyc2lvbmAgb2JqZWN0CiAgICBvciBhIDpjbGFzczpgTGVnYWN5VmVyc2lvbmAgb2JqZWN0IGRlcGVuZGluZyBvbiBpZiB0aGUgZ2l2ZW4gdmVyc2lvbiBpcwogICAgYSB2YWxpZCBQRVAgNDQwIHZlcnNpb24gb3IgYSBsZWdhY3kgdmVyc2lvbi4KICAgICIiIgogICAgdHJ5OgogICAgICAgIHJldHVybiBWZXJzaW9uKHZlcnNpb24pCiAgICBleGNlcHQgSW52YWxpZFZlcnNpb246CiAgICAgICAgcmV0dXJuIExlZ2FjeVZlcnNpb24odmVyc2lvbikKCgpjbGFzcyBJbnZhbGlkVmVyc2lvbihWYWx1ZUVycm9yKToKICAgICIiIgogICAgQW4gaW52YWxpZCB2ZXJzaW9uIHdhcyBmb3VuZCwgdXNlcnMgc2hvdWxkIHJlZmVyIHRvIFBFUCA0NDAuCiAgICAiIiIKCgpjbGFzcyBfQmFzZVZlcnNpb24ob2JqZWN0KToKICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKICAgICAgICByZXR1cm4gaGFzaChzZWxmLl9rZXkpCgogICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2NvbXBhcmUob3RoZXIsIGxhbWJkYSBzLCBvOiBzIDwgbykKCiAgICBkZWYgX19sZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5fY29tcGFyZShvdGhlciwgbGFtYmRhIHMsIG86IHMgPD0gbykKCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5fY29tcGFyZShvdGhlciwgbGFtYmRhIHMsIG86IHMgPT0gbykKCiAgICBkZWYgX19nZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5fY29tcGFyZShvdGhlciwgbGFtYmRhIHMsIG86IHMgPj0gbykKCiAgICBkZWYgX19ndF9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5fY29tcGFyZShvdGhlciwgbGFtYmRhIHMsIG86IHMgPiBvKQoKICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmLl9jb21wYXJlKG90aGVyLCBsYW1iZGEgcywgbzogcyAhPSBvKQoKICAgIGRlZiBfY29tcGFyZShzZWxmLCBvdGhlciwgbWV0aG9kKToKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgX0Jhc2VWZXJzaW9uKToKICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCgogICAgICAgIHJldHVybiBtZXRob2Qoc2VsZi5fa2V5LCBvdGhlci5fa2V5KQoKCmNsYXNzIExlZ2FjeVZlcnNpb24oX0Jhc2VWZXJzaW9uKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2ZXJzaW9uKToKICAgICAgICBzZWxmLl92ZXJzaW9uID0gc3RyKHZlcnNpb24pCiAgICAgICAgc2VsZi5fa2V5ID0gX2xlZ2FjeV9jbXBrZXkoc2VsZi5fdmVyc2lvbikKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fdmVyc2lvbgoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIjxMZWdhY3lWZXJzaW9uKHswfSk+Ii5mb3JtYXQocmVwcihzdHIoc2VsZikpKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHB1YmxpYyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fdmVyc2lvbgoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGJhc2VfdmVyc2lvbihzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fdmVyc2lvbgoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGVwb2NoKHNlbGYpOgogICAgICAgIHJldHVybiAtMQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHJlbGVhc2Uoc2VsZik6CiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBAcHJvcGVydHkKICAgIGRlZiBwcmUoc2VsZik6CiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBAcHJvcGVydHkKICAgIGRlZiBwb3N0KHNlbGYpOgogICAgICAgIHJldHVybiBOb25lCgogICAgQHByb3BlcnR5CiAgICBkZWYgZGV2KHNlbGYpOgogICAgICAgIHJldHVybiBOb25lCgogICAgQHByb3BlcnR5CiAgICBkZWYgbG9jYWwoc2VsZik6CiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc19wcmVyZWxlYXNlKHNlbGYpOgogICAgICAgIHJldHVybiBGYWxzZQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX3Bvc3RyZWxlYXNlKHNlbGYpOgogICAgICAgIHJldHVybiBGYWxzZQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX2RldnJlbGVhc2Uoc2VsZik6CiAgICAgICAgcmV0dXJuIEZhbHNlCgoKX2xlZ2FjeV92ZXJzaW9uX2NvbXBvbmVudF9yZSA9IHJlLmNvbXBpbGUociIoXGQrIHwgW2Etel0rIHwgXC58IC0pIiwgcmUuVkVSQk9TRSkKCl9sZWdhY3lfdmVyc2lvbl9yZXBsYWNlbWVudF9tYXAgPSB7CiAgICAicHJlIjogImMiLAogICAgInByZXZpZXciOiAiYyIsCiAgICAiLSI6ICJmaW5hbC0iLAogICAgInJjIjogImMiLAogICAgImRldiI6ICJAIiwKfQoKCmRlZiBfcGFyc2VfdmVyc2lvbl9wYXJ0cyhzKToKICAgIGZvciBwYXJ0IGluIF9sZWdhY3lfdmVyc2lvbl9jb21wb25lbnRfcmUuc3BsaXQocyk6CiAgICAgICAgcGFydCA9IF9sZWdhY3lfdmVyc2lvbl9yZXBsYWNlbWVudF9tYXAuZ2V0KHBhcnQsIHBhcnQpCgogICAgICAgIGlmIG5vdCBwYXJ0IG9yIHBhcnQgPT0gIi4iOgogICAgICAgICAgICBjb250aW51ZQoKICAgICAgICBpZiBwYXJ0WzoxXSBpbiAiMDEyMzQ1Njc4OSI6CiAgICAgICAgICAgICMgcGFkIGZvciBudW1lcmljIGNvbXBhcmlzb24KICAgICAgICAgICAgeWllbGQgcGFydC56ZmlsbCg4KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHlpZWxkICIqIiArIHBhcnQKCiAgICAjIGVuc3VyZSB0aGF0IGFscGhhL2JldGEvY2FuZGlkYXRlIGFyZSBiZWZvcmUgZmluYWwKICAgIHlpZWxkICIqZmluYWwiCgoKZGVmIF9sZWdhY3lfY21wa2V5KHZlcnNpb24pOgogICAgIyBXZSBoYXJkY29kZSBhbiBlcG9jaCBvZiAtMSBoZXJlLiBBIFBFUCA0NDAgdmVyc2lvbiBjYW4gb25seSBoYXZlIGEgZXBvY2gKICAgICMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDAuIFRoaXMgd2lsbCBlZmZlY3RpdmVseSBwdXQgdGhlIExlZ2FjeVZlcnNpb24sCiAgICAjIHdoaWNoIHVzZXMgdGhlIGRlZmFjdG8gc3RhbmRhcmQgb3JpZ2luYWxseSBpbXBsZW1lbnRlZCBieSBzZXR1cHRvb2xzLAogICAgIyBhcyBiZWZvcmUgYWxsIFBFUCA0NDAgdmVyc2lvbnMuCiAgICBlcG9jaCA9IC0xCgogICAgIyBUaGlzIHNjaGVtZSBpcyB0YWtlbiBmcm9tIHBrZ19yZXNvdXJjZXMucGFyc2VfdmVyc2lvbiBzZXR1cHRvb2xzIHByaW9yIHRvCiAgICAjIGl0J3MgYWRvcHRpb24gb2YgdGhlIHBhY2thZ2luZyBsaWJyYXJ5LgogICAgcGFydHMgPSBbXQogICAgZm9yIHBhcnQgaW4gX3BhcnNlX3ZlcnNpb25fcGFydHModmVyc2lvbi5sb3dlcigpKToKICAgICAgICBpZiBwYXJ0LnN0YXJ0c3dpdGgoIioiKToKICAgICAgICAgICAgIyByZW1vdmUgIi0iIGJlZm9yZSBhIHByZXJlbGVhc2UgdGFnCiAgICAgICAgICAgIGlmIHBhcnQgPCAiKmZpbmFsIjoKICAgICAgICAgICAgICAgIHdoaWxlIHBhcnRzIGFuZCBwYXJ0c1stMV0gPT0gIipmaW5hbC0iOgogICAgICAgICAgICAgICAgICAgIHBhcnRzLnBvcCgpCgogICAgICAgICAgICAjIHJlbW92ZSB0cmFpbGluZyB6ZXJvcyBmcm9tIGVhY2ggc2VyaWVzIG9mIG51bWVyaWMgcGFydHMKICAgICAgICAgICAgd2hpbGUgcGFydHMgYW5kIHBhcnRzWy0xXSA9PSAiMDAwMDAwMDAiOgogICAgICAgICAgICAgICAgcGFydHMucG9wKCkKCiAgICAgICAgcGFydHMuYXBwZW5kKHBhcnQpCiAgICBwYXJ0cyA9IHR1cGxlKHBhcnRzKQoKICAgIHJldHVybiBlcG9jaCwgcGFydHMKCgojIERlbGliZXJhdGVseSBub3QgYW5jaG9yZWQgdG8gdGhlIHN0YXJ0IGFuZCBlbmQgb2YgdGhlIHN0cmluZywgdG8gbWFrZSBpdAojIGVhc2llciBmb3IgM3JkIHBhcnR5IGNvZGUgdG8gcmV1c2UKVkVSU0lPTl9QQVRURVJOID0gciIiIgogICAgdj8KICAgICg/OgogICAgICAgICg/Oig/UDxlcG9jaD5bMC05XSspISk/ICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBlcG9jaAogICAgICAgICg/UDxyZWxlYXNlPlswLTldKyg/OlwuWzAtOV0rKSopICAgICAgICAgICAgICAgICAgIyByZWxlYXNlIHNlZ21lbnQKICAgICAgICAoP1A8cHJlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcHJlLXJlbGVhc2UKICAgICAgICAgICAgWy1fXC5dPwogICAgICAgICAgICAoP1A8cHJlX2w+KGF8YnxjfHJjfGFscGhhfGJldGF8cHJlfHByZXZpZXcpKQogICAgICAgICAgICBbLV9cLl0/CiAgICAgICAgICAgICg/UDxwcmVfbj5bMC05XSspPwogICAgICAgICk/CiAgICAgICAgKD9QPHBvc3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHBvc3QgcmVsZWFzZQogICAgICAgICAgICAoPzotKD9QPHBvc3RfbjE+WzAtOV0rKSkKICAgICAgICAgICAgfAogICAgICAgICAgICAoPzoKICAgICAgICAgICAgICAgIFstX1wuXT8KICAgICAgICAgICAgICAgICg/UDxwb3N0X2w+cG9zdHxyZXZ8cikKICAgICAgICAgICAgICAgIFstX1wuXT8KICAgICAgICAgICAgICAgICg/UDxwb3N0X24yPlswLTldKyk/CiAgICAgICAgICAgICkKICAgICAgICApPwogICAgICAgICg/UDxkZXY+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBkZXYgcmVsZWFzZQogICAgICAgICAgICBbLV9cLl0/CiAgICAgICAgICAgICg/UDxkZXZfbD5kZXYpCiAgICAgICAgICAgIFstX1wuXT8KICAgICAgICAgICAgKD9QPGRldl9uPlswLTldKyk/CiAgICAgICAgKT8KICAgICkKICAgICg/OlwrKD9QPGxvY2FsPlthLXowLTldKyg/OlstX1wuXVthLXowLTldKykqKSk/ICAgICAgICMgbG9jYWwgdmVyc2lvbgoiIiIKCgpjbGFzcyBWZXJzaW9uKF9CYXNlVmVyc2lvbik6CgogICAgX3JlZ2V4ID0gcmUuY29tcGlsZShyIl5ccyoiICsgVkVSU0lPTl9QQVRURVJOICsgciJccyokIiwgcmUuVkVSQk9TRSB8IHJlLklHTk9SRUNBU0UpCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHZlcnNpb24pOgogICAgICAgICMgVmFsaWRhdGUgdGhlIHZlcnNpb24gYW5kIHBhcnNlIGl0IGludG8gcGllY2VzCiAgICAgICAgbWF0Y2ggPSBzZWxmLl9yZWdleC5zZWFyY2godmVyc2lvbikKICAgICAgICBpZiBub3QgbWF0Y2g6CiAgICAgICAgICAgIHJhaXNlIEludmFsaWRWZXJzaW9uKCJJbnZhbGlkIHZlcnNpb246ICd7MH0nIi5mb3JtYXQodmVyc2lvbikpCgogICAgICAgICMgU3RvcmUgdGhlIHBhcnNlZCBvdXQgcGllY2VzIG9mIHRoZSB2ZXJzaW9uCiAgICAgICAgc2VsZi5fdmVyc2lvbiA9IF9WZXJzaW9uKAogICAgICAgICAgICBlcG9jaD1pbnQobWF0Y2guZ3JvdXAoImVwb2NoIikpIGlmIG1hdGNoLmdyb3VwKCJlcG9jaCIpIGVsc2UgMCwKICAgICAgICAgICAgcmVsZWFzZT10dXBsZShpbnQoaSkgZm9yIGkgaW4gbWF0Y2guZ3JvdXAoInJlbGVhc2UiKS5zcGxpdCgiLiIpKSwKICAgICAgICAgICAgcHJlPV9wYXJzZV9sZXR0ZXJfdmVyc2lvbihtYXRjaC5ncm91cCgicHJlX2wiKSwgbWF0Y2guZ3JvdXAoInByZV9uIikpLAogICAgICAgICAgICBwb3N0PV9wYXJzZV9sZXR0ZXJfdmVyc2lvbigKICAgICAgICAgICAgICAgIG1hdGNoLmdyb3VwKCJwb3N0X2wiKSwgbWF0Y2guZ3JvdXAoInBvc3RfbjEiKSBvciBtYXRjaC5ncm91cCgicG9zdF9uMiIpCiAgICAgICAgICAgICksCiAgICAgICAgICAgIGRldj1fcGFyc2VfbGV0dGVyX3ZlcnNpb24obWF0Y2guZ3JvdXAoImRldl9sIiksIG1hdGNoLmdyb3VwKCJkZXZfbiIpKSwKICAgICAgICAgICAgbG9jYWw9X3BhcnNlX2xvY2FsX3ZlcnNpb24obWF0Y2guZ3JvdXAoImxvY2FsIikpLAogICAgICAgICkKCiAgICAgICAgIyBHZW5lcmF0ZSBhIGtleSB3aGljaCB3aWxsIGJlIHVzZWQgZm9yIHNvcnRpbmcKICAgICAgICBzZWxmLl9rZXkgPSBfY21wa2V5KAogICAgICAgICAgICBzZWxmLl92ZXJzaW9uLmVwb2NoLAogICAgICAgICAgICBzZWxmLl92ZXJzaW9uLnJlbGVhc2UsCiAgICAgICAgICAgIHNlbGYuX3ZlcnNpb24ucHJlLAogICAgICAgICAgICBzZWxmLl92ZXJzaW9uLnBvc3QsCiAgICAgICAgICAgIHNlbGYuX3ZlcnNpb24uZGV2LAogICAgICAgICAgICBzZWxmLl92ZXJzaW9uLmxvY2FsLAogICAgICAgICkKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICI8VmVyc2lvbih7MH0pPiIuZm9ybWF0KHJlcHIoc3RyKHNlbGYpKSkKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICBwYXJ0cyA9IFtdCgogICAgICAgICMgRXBvY2gKICAgICAgICBpZiBzZWxmLmVwb2NoICE9IDA6CiAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgiezB9ISIuZm9ybWF0KHNlbGYuZXBvY2gpKQoKICAgICAgICAjIFJlbGVhc2Ugc2VnbWVudAogICAgICAgIHBhcnRzLmFwcGVuZCgiLiIuam9pbihzdHIoeCkgZm9yIHggaW4gc2VsZi5yZWxlYXNlKSkKCiAgICAgICAgIyBQcmUtcmVsZWFzZQogICAgICAgIGlmIHNlbGYucHJlIGlzIG5vdCBOb25lOgogICAgICAgICAgICBwYXJ0cy5hcHBlbmQoIiIuam9pbihzdHIoeCkgZm9yIHggaW4gc2VsZi5wcmUpKQoKICAgICAgICAjIFBvc3QtcmVsZWFzZQogICAgICAgIGlmIHNlbGYucG9zdCBpcyBub3QgTm9uZToKICAgICAgICAgICAgcGFydHMuYXBwZW5kKCIucG9zdHswfSIuZm9ybWF0KHNlbGYucG9zdCkpCgogICAgICAgICMgRGV2ZWxvcG1lbnQgcmVsZWFzZQogICAgICAgIGlmIHNlbGYuZGV2IGlzIG5vdCBOb25lOgogICAgICAgICAgICBwYXJ0cy5hcHBlbmQoIi5kZXZ7MH0iLmZvcm1hdChzZWxmLmRldikpCgogICAgICAgICMgTG9jYWwgdmVyc2lvbiBzZWdtZW50CiAgICAgICAgaWYgc2VsZi5sb2NhbCBpcyBub3QgTm9uZToKICAgICAgICAgICAgcGFydHMuYXBwZW5kKCIrezB9Ii5mb3JtYXQoc2VsZi5sb2NhbCkpCgogICAgICAgIHJldHVybiAiIi5qb2luKHBhcnRzKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGVwb2NoKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl92ZXJzaW9uLmVwb2NoCgogICAgQHByb3BlcnR5CiAgICBkZWYgcmVsZWFzZShzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fdmVyc2lvbi5yZWxlYXNlCgogICAgQHByb3BlcnR5CiAgICBkZWYgcHJlKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl92ZXJzaW9uLnByZQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHBvc3Qoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3ZlcnNpb24ucG9zdFsxXSBpZiBzZWxmLl92ZXJzaW9uLnBvc3QgZWxzZSBOb25lCgogICAgQHByb3BlcnR5CiAgICBkZWYgZGV2KHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl92ZXJzaW9uLmRldlsxXSBpZiBzZWxmLl92ZXJzaW9uLmRldiBlbHNlIE5vbmUKCiAgICBAcHJvcGVydHkKICAgIGRlZiBsb2NhbChzZWxmKToKICAgICAgICBpZiBzZWxmLl92ZXJzaW9uLmxvY2FsOgogICAgICAgICAgICByZXR1cm4gIi4iLmpvaW4oc3RyKHgpIGZvciB4IGluIHNlbGYuX3ZlcnNpb24ubG9jYWwpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBAcHJvcGVydHkKICAgIGRlZiBwdWJsaWMoc2VsZik6CiAgICAgICAgcmV0dXJuIHN0cihzZWxmKS5zcGxpdCgiKyIsIDEpWzBdCgogICAgQHByb3BlcnR5CiAgICBkZWYgYmFzZV92ZXJzaW9uKHNlbGYpOgogICAgICAgIHBhcnRzID0gW10KCiAgICAgICAgIyBFcG9jaAogICAgICAgIGlmIHNlbGYuZXBvY2ggIT0gMDoKICAgICAgICAgICAgcGFydHMuYXBwZW5kKCJ7MH0hIi5mb3JtYXQoc2VsZi5lcG9jaCkpCgogICAgICAgICMgUmVsZWFzZSBzZWdtZW50CiAgICAgICAgcGFydHMuYXBwZW5kKCIuIi5qb2luKHN0cih4KSBmb3IgeCBpbiBzZWxmLnJlbGVhc2UpKQoKICAgICAgICByZXR1cm4gIiIuam9pbihwYXJ0cykKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc19wcmVyZWxlYXNlKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLmRldiBpcyBub3QgTm9uZSBvciBzZWxmLnByZSBpcyBub3QgTm9uZQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX3Bvc3RyZWxlYXNlKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLnBvc3QgaXMgbm90IE5vbmUKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc19kZXZyZWxlYXNlKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLmRldiBpcyBub3QgTm9uZQoKCmRlZiBfcGFyc2VfbGV0dGVyX3ZlcnNpb24obGV0dGVyLCBudW1iZXIpOgogICAgaWYgbGV0dGVyOgogICAgICAgICMgV2UgY29uc2lkZXIgdGhlcmUgdG8gYmUgYW4gaW1wbGljaXQgMCBpbiBhIHByZS1yZWxlYXNlIGlmIHRoZXJlIGlzCiAgICAgICAgIyBub3QgYSBudW1lcmFsIGFzc29jaWF0ZWQgd2l0aCBpdC4KICAgICAgICBpZiBudW1iZXIgaXMgTm9uZToKICAgICAgICAgICAgbnVtYmVyID0gMAoKICAgICAgICAjIFdlIG5vcm1hbGl6ZSBhbnkgbGV0dGVycyB0byB0aGVpciBsb3dlciBjYXNlIGZvcm0KICAgICAgICBsZXR0ZXIgPSBsZXR0ZXIubG93ZXIoKQoKICAgICAgICAjIFdlIGNvbnNpZGVyIHNvbWUgd29yZHMgdG8gYmUgYWx0ZXJuYXRlIHNwZWxsaW5ncyBvZiBvdGhlciB3b3JkcyBhbmQKICAgICAgICAjIGluIHRob3NlIGNhc2VzIHdlIHdhbnQgdG8gbm9ybWFsaXplIHRoZSBzcGVsbGluZ3MgdG8gb3VyIHByZWZlcnJlZAogICAgICAgICMgc3BlbGxpbmcuCiAgICAgICAgaWYgbGV0dGVyID09ICJhbHBoYSI6CiAgICAgICAgICAgIGxldHRlciA9ICJhIgogICAgICAgIGVsaWYgbGV0dGVyID09ICJiZXRhIjoKICAgICAgICAgICAgbGV0dGVyID0gImIiCiAgICAgICAgZWxpZiBsZXR0ZXIgaW4gWyJjIiwgInByZSIsICJwcmV2aWV3Il06CiAgICAgICAgICAgIGxldHRlciA9ICJyYyIKICAgICAgICBlbGlmIGxldHRlciBpbiBbInJldiIsICJyIl06CiAgICAgICAgICAgIGxldHRlciA9ICJwb3N0IgoKICAgICAgICByZXR1cm4gbGV0dGVyLCBpbnQobnVtYmVyKQogICAgaWYgbm90IGxldHRlciBhbmQgbnVtYmVyOgogICAgICAgICMgV2UgYXNzdW1lIGlmIHdlIGFyZSBnaXZlbiBhIG51bWJlciwgYnV0IHdlIGFyZSBub3QgZ2l2ZW4gYSBsZXR0ZXIKICAgICAgICAjIHRoZW4gdGhpcyBpcyB1c2luZyB0aGUgaW1wbGljaXQgcG9zdCByZWxlYXNlIHN5bnRheCAoZS5nLiAxLjAtMSkKICAgICAgICBsZXR0ZXIgPSAicG9zdCIKCiAgICAgICAgcmV0dXJuIGxldHRlciwgaW50KG51bWJlcikKCgpfbG9jYWxfdmVyc2lvbl9zZXBhcmF0b3JzID0gcmUuY29tcGlsZShyIltcLl8tXSIpCgoKZGVmIF9wYXJzZV9sb2NhbF92ZXJzaW9uKGxvY2FsKToKICAgICIiIgogICAgVGFrZXMgYSBzdHJpbmcgbGlrZSBhYmMuMS50d2VsdmUgYW5kIHR1cm5zIGl0IGludG8gKCJhYmMiLCAxLCAidHdlbHZlIikuCiAgICAiIiIKICAgIGlmIGxvY2FsIGlzIG5vdCBOb25lOgogICAgICAgIHJldHVybiB0dXBsZSgKICAgICAgICAgICAgcGFydC5sb3dlcigpIGlmIG5vdCBwYXJ0LmlzZGlnaXQoKSBlbHNlIGludChwYXJ0KQogICAgICAgICAgICBmb3IgcGFydCBpbiBfbG9jYWxfdmVyc2lvbl9zZXBhcmF0b3JzLnNwbGl0KGxvY2FsKQogICAgICAgICkKCgpkZWYgX2NtcGtleShlcG9jaCwgcmVsZWFzZSwgcHJlLCBwb3N0LCBkZXYsIGxvY2FsKToKICAgICMgV2hlbiB3ZSBjb21wYXJlIGEgcmVsZWFzZSB2ZXJzaW9uLCB3ZSB3YW50IHRvIGNvbXBhcmUgaXQgd2l0aCBhbGwgb2YgdGhlCiAgICAjIHRyYWlsaW5nIHplcm9zIHJlbW92ZWQuIFNvIHdlJ2xsIHVzZSBhIHJldmVyc2UgdGhlIGxpc3QsIGRyb3AgYWxsIHRoZSBub3cKICAgICMgbGVhZGluZyB6ZXJvcyB1bnRpbCB3ZSBjb21lIHRvIHNvbWV0aGluZyBub24gemVybywgdGhlbiB0YWtlIHRoZSByZXN0CiAgICAjIHJlLXJldmVyc2UgaXQgYmFjayBpbnRvIHRoZSBjb3JyZWN0IG9yZGVyIGFuZCBtYWtlIGl0IGEgdHVwbGUgYW5kIHVzZQogICAgIyB0aGF0IGZvciBvdXIgc29ydGluZyBrZXkuCiAgICByZWxlYXNlID0gdHVwbGUoCiAgICAgICAgcmV2ZXJzZWQobGlzdChpdGVydG9vbHMuZHJvcHdoaWxlKGxhbWJkYSB4OiB4ID09IDAsIHJldmVyc2VkKHJlbGVhc2UpKSkpCiAgICApCgogICAgIyBXZSBuZWVkIHRvICJ0cmljayIgdGhlIHNvcnRpbmcgYWxnb3JpdGhtIHRvIHB1dCAxLjAuZGV2MCBiZWZvcmUgMS4wYTAuCiAgICAjIFdlJ2xsIGRvIHRoaXMgYnkgYWJ1c2luZyB0aGUgcHJlIHNlZ21lbnQsIGJ1dCB3ZSBfb25seV8gd2FudCB0byBkbyB0aGlzCiAgICAjIGlmIHRoZXJlIGlzIG5vdCBhIHByZSBvciBhIHBvc3Qgc2VnbWVudC4gSWYgd2UgaGF2ZSBvbmUgb2YgdGhvc2UgdGhlbgogICAgIyB0aGUgbm9ybWFsIHNvcnRpbmcgcnVsZXMgd2lsbCBoYW5kbGUgdGhpcyBjYXNlIGNvcnJlY3RseS4KICAgIGlmIHByZSBpcyBOb25lIGFuZCBwb3N0IGlzIE5vbmUgYW5kIGRldiBpcyBub3QgTm9uZToKICAgICAgICBwcmUgPSAtSW5maW5pdHkKICAgICMgVmVyc2lvbnMgd2l0aG91dCBhIHByZS1yZWxlYXNlIChleGNlcHQgYXMgbm90ZWQgYWJvdmUpIHNob3VsZCBzb3J0IGFmdGVyCiAgICAjIHRob3NlIHdpdGggb25lLgogICAgZWxpZiBwcmUgaXMgTm9uZToKICAgICAgICBwcmUgPSBJbmZpbml0eQoKICAgICMgVmVyc2lvbnMgd2l0aG91dCBhIHBvc3Qgc2VnbWVudCBzaG91bGQgc29ydCBiZWZvcmUgdGhvc2Ugd2l0aCBvbmUuCiAgICBpZiBwb3N0IGlzIE5vbmU6CiAgICAgICAgcG9zdCA9IC1JbmZpbml0eQoKICAgICMgVmVyc2lvbnMgd2l0aG91dCBhIGRldmVsb3BtZW50IHNlZ21lbnQgc2hvdWxkIHNvcnQgYWZ0ZXIgdGhvc2Ugd2l0aCBvbmUuCiAgICBpZiBkZXYgaXMgTm9uZToKICAgICAgICBkZXYgPSBJbmZpbml0eQoKICAgIGlmIGxvY2FsIGlzIE5vbmU6CiAgICAgICAgIyBWZXJzaW9ucyB3aXRob3V0IGEgbG9jYWwgc2VnbWVudCBzaG91bGQgc29ydCBiZWZvcmUgdGhvc2Ugd2l0aCBvbmUuCiAgICAgICAgbG9jYWwgPSAtSW5maW5pdHkKICAgIGVsc2U6CiAgICAgICAgIyBWZXJzaW9ucyB3aXRoIGEgbG9jYWwgc2VnbWVudCBuZWVkIHRoYXQgc2VnbWVudCBwYXJzZWQgdG8gaW1wbGVtZW50CiAgICAgICAgIyB0aGUgc29ydGluZyBydWxlcyBpbiBQRVA0NDAuCiAgICAgICAgIyAtIEFscGhhIG51bWVyaWMgc2VnbWVudHMgc29ydCBiZWZvcmUgbnVtZXJpYyBzZWdtZW50cwogICAgICAgICMgLSBBbHBoYSBudW1lcmljIHNlZ21lbnRzIHNvcnQgbGV4aWNvZ3JhcGhpY2FsbHkKICAgICAgICAjIC0gTnVtZXJpYyBzZWdtZW50cyBzb3J0IG51bWVyaWNhbGx5CiAgICAgICAgIyAtIFNob3J0ZXIgdmVyc2lvbnMgc29ydCBiZWZvcmUgbG9uZ2VyIHZlcnNpb25zIHdoZW4gdGhlIHByZWZpeGVzCiAgICAgICAgIyAgIG1hdGNoIGV4YWN0bHkKICAgICAgICBsb2NhbCA9IHR1cGxlKChpLCAiIikgaWYgaXNpbnN0YW5jZShpLCBpbnQpIGVsc2UgKC1JbmZpbml0eSwgaSkgZm9yIGkgaW4gbG9jYWwpCgogICAgcmV0dXJuIGVwb2NoLCByZWxlYXNlLCBwcmUsIHBvc3QsIGRldiwgbG9jYWwKUEsDBBQAAAAAAAAAIQBmD4Sxd4oDAHeKAwBEAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvX3ZlbmRvci9weXBhcnNpbmcucHkjIG1vZHVsZSBweXBhcnNpbmcucHkNCiMNCiMgQ29weXJpZ2h0IChjKSAyMDAzLTIwMTggIFBhdWwgVC4gTWNHdWlyZQ0KIw0KIyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcNCiMgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlDQojICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcNCiMgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLA0KIyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8NCiMgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvDQojIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCiMNCiMgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUNCiMgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuDQojDQojIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELA0KIyBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YNCiMgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULg0KIyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQ0KIyBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULA0KIyBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQ0KIyBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4NCiMNCg0KX19kb2NfXyA9IFwNCiIiIg0KcHlwYXJzaW5nIG1vZHVsZSAtIENsYXNzZXMgYW5kIG1ldGhvZHMgdG8gZGVmaW5lIGFuZCBleGVjdXRlIHBhcnNpbmcgZ3JhbW1hcnMNCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNClRoZSBweXBhcnNpbmcgbW9kdWxlIGlzIGFuIGFsdGVybmF0aXZlIGFwcHJvYWNoIHRvIGNyZWF0aW5nIGFuZCBleGVjdXRpbmcgc2ltcGxlIGdyYW1tYXJzLA0KdnMuIHRoZSB0cmFkaXRpb25hbCBsZXgveWFjYyBhcHByb2FjaCwgb3IgdGhlIHVzZSBvZiByZWd1bGFyIGV4cHJlc3Npb25zLiAgV2l0aCBweXBhcnNpbmcsIHlvdQ0KZG9uJ3QgbmVlZCB0byBsZWFybiBhIG5ldyBzeW50YXggZm9yIGRlZmluaW5nIGdyYW1tYXJzIG9yIG1hdGNoaW5nIGV4cHJlc3Npb25zIC0gdGhlIHBhcnNpbmcgbW9kdWxlDQpwcm92aWRlcyBhIGxpYnJhcnkgb2YgY2xhc3NlcyB0aGF0IHlvdSB1c2UgdG8gY29uc3RydWN0IHRoZSBncmFtbWFyIGRpcmVjdGx5IGluIFB5dGhvbi4NCg0KSGVyZSBpcyBhIHByb2dyYW0gdG8gcGFyc2UgIkhlbGxvLCBXb3JsZCEiIChvciBhbnkgZ3JlZXRpbmcgb2YgdGhlIGZvcm0gDQpDeyI8c2FsdXRhdGlvbj4sIDxhZGRyZXNzZWU+ISJ9KSwgYnVpbHQgdXAgdXNpbmcgTHtXb3JkfSwgTHtMaXRlcmFsfSwgYW5kIEx7QW5kfSBlbGVtZW50cyANCihMeycrJzxQYXJzZXJFbGVtZW50Ll9fYWRkX18+fSBvcGVyYXRvciBnaXZlcyBMe0FuZH0gZXhwcmVzc2lvbnMsIHN0cmluZ3MgYXJlIGF1dG8tY29udmVydGVkIHRvDQpMe0xpdGVyYWx9IGV4cHJlc3Npb25zKTo6DQoNCiAgICBmcm9tIHB5cGFyc2luZyBpbXBvcnQgV29yZCwgYWxwaGFzDQoNCiAgICAjIGRlZmluZSBncmFtbWFyIG9mIGEgZ3JlZXRpbmcNCiAgICBncmVldCA9IFdvcmQoYWxwaGFzKSArICIsIiArIFdvcmQoYWxwaGFzKSArICIhIg0KDQogICAgaGVsbG8gPSAiSGVsbG8sIFdvcmxkISINCiAgICBwcmludCAoaGVsbG8sICItPiIsIGdyZWV0LnBhcnNlU3RyaW5nKGhlbGxvKSkNCg0KVGhlIHByb2dyYW0gb3V0cHV0cyB0aGUgZm9sbG93aW5nOjoNCg0KICAgIEhlbGxvLCBXb3JsZCEgLT4gWydIZWxsbycsICcsJywgJ1dvcmxkJywgJyEnXQ0KDQpUaGUgUHl0aG9uIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBncmFtbWFyIGlzIHF1aXRlIHJlYWRhYmxlLCBvd2luZyB0byB0aGUgc2VsZi1leHBsYW5hdG9yeQ0KY2xhc3MgbmFtZXMsIGFuZCB0aGUgdXNlIG9mICcrJywgJ3wnIGFuZCAnXicgb3BlcmF0b3JzLg0KDQpUaGUgTHtQYXJzZVJlc3VsdHN9IG9iamVjdCByZXR1cm5lZCBmcm9tIEx7UGFyc2VyRWxlbWVudC5wYXJzZVN0cmluZzxQYXJzZXJFbGVtZW50LnBhcnNlU3RyaW5nPn0gY2FuIGJlIGFjY2Vzc2VkIGFzIGEgbmVzdGVkIGxpc3QsIGEgZGljdGlvbmFyeSwgb3IgYW4NCm9iamVjdCB3aXRoIG5hbWVkIGF0dHJpYnV0ZXMuDQoNClRoZSBweXBhcnNpbmcgbW9kdWxlIGhhbmRsZXMgc29tZSBvZiB0aGUgcHJvYmxlbXMgdGhhdCBhcmUgdHlwaWNhbGx5IHZleGluZyB3aGVuIHdyaXRpbmcgdGV4dCBwYXJzZXJzOg0KIC0gZXh0cmEgb3IgbWlzc2luZyB3aGl0ZXNwYWNlICh0aGUgYWJvdmUgcHJvZ3JhbSB3aWxsIGFsc28gaGFuZGxlICJIZWxsbyxXb3JsZCEiLCAiSGVsbG8gICwgIFdvcmxkICAhIiwgZXRjLikNCiAtIHF1b3RlZCBzdHJpbmdzDQogLSBlbWJlZGRlZCBjb21tZW50cw0KDQoNCkdldHRpbmcgU3RhcnRlZCAtDQotLS0tLS0tLS0tLS0tLS0tLQ0KVmlzaXQgdGhlIGNsYXNzZXMgTHtQYXJzZXJFbGVtZW50fSBhbmQgTHtQYXJzZVJlc3VsdHN9IHRvIHNlZSB0aGUgYmFzZSBjbGFzc2VzIHRoYXQgbW9zdCBvdGhlciBweXBhcnNpbmcNCmNsYXNzZXMgaW5oZXJpdCBmcm9tLiBVc2UgdGhlIGRvY3N0cmluZ3MgZm9yIGV4YW1wbGVzIG9mIGhvdyB0bzoNCiAtIGNvbnN0cnVjdCBsaXRlcmFsIG1hdGNoIGV4cHJlc3Npb25zIGZyb20gTHtMaXRlcmFsfSBhbmQgTHtDYXNlbGVzc0xpdGVyYWx9IGNsYXNzZXMNCiAtIGNvbnN0cnVjdCBjaGFyYWN0ZXIgd29yZC1ncm91cCBleHByZXNzaW9ucyB1c2luZyB0aGUgTHtXb3JkfSBjbGFzcw0KIC0gc2VlIGhvdyB0byBjcmVhdGUgcmVwZXRpdGl2ZSBleHByZXNzaW9ucyB1c2luZyBMe1plcm9Pck1vcmV9IGFuZCBMe09uZU9yTW9yZX0gY2xhc3Nlcw0KIC0gdXNlIEx7JysnPEFuZD59LCBMeyd8JzxNYXRjaEZpcnN0Pn0sIEx7J14nPE9yPn0sIGFuZCBMeycmJzxFYWNoPn0gb3BlcmF0b3JzIHRvIGNvbWJpbmUgc2ltcGxlIGV4cHJlc3Npb25zIGludG8gbW9yZSBjb21wbGV4IG9uZXMNCiAtIGFzc29jaWF0ZSBuYW1lcyB3aXRoIHlvdXIgcGFyc2VkIHJlc3VsdHMgdXNpbmcgTHtQYXJzZXJFbGVtZW50LnNldFJlc3VsdHNOYW1lfQ0KIC0gZmluZCBzb21lIGhlbHBmdWwgZXhwcmVzc2lvbiBzaG9ydC1jdXRzIGxpa2UgTHtkZWxpbWl0ZWRMaXN0fSBhbmQgTHtvbmVPZn0NCiAtIGZpbmQgbW9yZSB1c2VmdWwgY29tbW9uIGV4cHJlc3Npb25zIGluIHRoZSBMe3B5cGFyc2luZ19jb21tb259IG5hbWVzcGFjZSBjbGFzcw0KIiIiDQoNCl9fdmVyc2lvbl9fID0gIjIuMi4xIg0KX192ZXJzaW9uVGltZV9fID0gIjE4IFNlcCAyMDE4IDAwOjQ5IFVUQyINCl9fYXV0aG9yX18gPSAiUGF1bCBNY0d1aXJlIDxwdG1jZ0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+Ig0KDQppbXBvcnQgc3RyaW5nDQpmcm9tIHdlYWtyZWYgaW1wb3J0IHJlZiBhcyB3a3JlZg0KaW1wb3J0IGNvcHkNCmltcG9ydCBzeXMNCmltcG9ydCB3YXJuaW5ncw0KaW1wb3J0IHJlDQppbXBvcnQgc3JlX2NvbnN0YW50cw0KaW1wb3J0IGNvbGxlY3Rpb25zDQppbXBvcnQgcHByaW50DQppbXBvcnQgdHJhY2ViYWNrDQppbXBvcnQgdHlwZXMNCmZyb20gZGF0ZXRpbWUgaW1wb3J0IGRhdGV0aW1lDQoNCnRyeToNCiAgICBmcm9tIF90aHJlYWQgaW1wb3J0IFJMb2NrDQpleGNlcHQgSW1wb3J0RXJyb3I6DQogICAgZnJvbSB0aHJlYWRpbmcgaW1wb3J0IFJMb2NrDQoNCnRyeToNCiAgICAjIFB5dGhvbiAzDQogICAgZnJvbSBjb2xsZWN0aW9ucy5hYmMgaW1wb3J0IEl0ZXJhYmxlDQogICAgZnJvbSBjb2xsZWN0aW9ucy5hYmMgaW1wb3J0IE11dGFibGVNYXBwaW5nDQpleGNlcHQgSW1wb3J0RXJyb3I6DQogICAgIyBQeXRob24gMi43DQogICAgZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgSXRlcmFibGUNCiAgICBmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBNdXRhYmxlTWFwcGluZw0KDQp0cnk6DQogICAgZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgT3JkZXJlZERpY3QgYXMgX09yZGVyZWREaWN0DQpleGNlcHQgSW1wb3J0RXJyb3I6DQogICAgdHJ5Og0KICAgICAgICBmcm9tIG9yZGVyZWRkaWN0IGltcG9ydCBPcmRlcmVkRGljdCBhcyBfT3JkZXJlZERpY3QNCiAgICBleGNlcHQgSW1wb3J0RXJyb3I6DQogICAgICAgIF9PcmRlcmVkRGljdCA9IE5vbmUNCg0KI34gc3lzLnN0ZGVyci53cml0ZSggInRlc3RpbmcgcHlwYXJzaW5nIG1vZHVsZSwgdmVyc2lvbiAlcywgJXNcbiIgJSAoX192ZXJzaW9uX18sX192ZXJzaW9uVGltZV9fICkgKQ0KDQpfX2FsbF9fID0gWw0KJ0FuZCcsICdDYXNlbGVzc0tleXdvcmQnLCAnQ2FzZWxlc3NMaXRlcmFsJywgJ0NoYXJzTm90SW4nLCAnQ29tYmluZScsICdEaWN0JywgJ0VhY2gnLCAnRW1wdHknLA0KJ0ZvbGxvd2VkQnknLCAnRm9yd2FyZCcsICdHb1RvQ29sdW1uJywgJ0dyb3VwJywgJ0tleXdvcmQnLCAnTGluZUVuZCcsICdMaW5lU3RhcnQnLCAnTGl0ZXJhbCcsDQonTWF0Y2hGaXJzdCcsICdOb01hdGNoJywgJ05vdEFueScsICdPbmVPck1vcmUnLCAnT25seU9uY2UnLCAnT3B0aW9uYWwnLCAnT3InLA0KJ1BhcnNlQmFzZUV4Y2VwdGlvbicsICdQYXJzZUVsZW1lbnRFbmhhbmNlJywgJ1BhcnNlRXhjZXB0aW9uJywgJ1BhcnNlRXhwcmVzc2lvbicsICdQYXJzZUZhdGFsRXhjZXB0aW9uJywNCidQYXJzZVJlc3VsdHMnLCAnUGFyc2VTeW50YXhFeGNlcHRpb24nLCAnUGFyc2VyRWxlbWVudCcsICdRdW90ZWRTdHJpbmcnLCAnUmVjdXJzaXZlR3JhbW1hckV4Y2VwdGlvbicsDQonUmVnZXgnLCAnU2tpcFRvJywgJ1N0cmluZ0VuZCcsICdTdHJpbmdTdGFydCcsICdTdXBwcmVzcycsICdUb2tlbicsICdUb2tlbkNvbnZlcnRlcicsIA0KJ1doaXRlJywgJ1dvcmQnLCAnV29yZEVuZCcsICdXb3JkU3RhcnQnLCAnWmVyb09yTW9yZScsDQonYWxwaGFudW1zJywgJ2FscGhhcycsICdhbHBoYXM4Yml0JywgJ2FueUNsb3NlVGFnJywgJ2FueU9wZW5UYWcnLCAnY1N0eWxlQ29tbWVudCcsICdjb2wnLA0KJ2NvbW1hU2VwYXJhdGVkTGlzdCcsICdjb21tb25IVE1MRW50aXR5JywgJ2NvdW50ZWRBcnJheScsICdjcHBTdHlsZUNvbW1lbnQnLCAnZGJsUXVvdGVkU3RyaW5nJywNCidkYmxTbGFzaENvbW1lbnQnLCAnZGVsaW1pdGVkTGlzdCcsICdkaWN0T2YnLCAnZG93bmNhc2VUb2tlbnMnLCAnZW1wdHknLCAnaGV4bnVtcycsDQonaHRtbENvbW1lbnQnLCAnamF2YVN0eWxlQ29tbWVudCcsICdsaW5lJywgJ2xpbmVFbmQnLCAnbGluZVN0YXJ0JywgJ2xpbmVubycsDQonbWFrZUhUTUxUYWdzJywgJ21ha2VYTUxUYWdzJywgJ21hdGNoT25seUF0Q29sJywgJ21hdGNoUHJldmlvdXNFeHByJywgJ21hdGNoUHJldmlvdXNMaXRlcmFsJywNCiduZXN0ZWRFeHByJywgJ251bGxEZWJ1Z0FjdGlvbicsICdudW1zJywgJ29uZU9mJywgJ29wQXNzb2MnLCAnb3BlcmF0b3JQcmVjZWRlbmNlJywgJ3ByaW50YWJsZXMnLA0KJ3B1bmM4Yml0JywgJ3B5dGhvblN0eWxlQ29tbWVudCcsICdxdW90ZWRTdHJpbmcnLCAncmVtb3ZlUXVvdGVzJywgJ3JlcGxhY2VIVE1MRW50aXR5JywgDQoncmVwbGFjZVdpdGgnLCAncmVzdE9mTGluZScsICdzZ2xRdW90ZWRTdHJpbmcnLCAnc3JhbmdlJywgJ3N0cmluZ0VuZCcsDQonc3RyaW5nU3RhcnQnLCAndHJhY2VQYXJzZUFjdGlvbicsICd1bmljb2RlU3RyaW5nJywgJ3VwY2FzZVRva2VucycsICd3aXRoQXR0cmlidXRlJywNCidpbmRlbnRlZEJsb2NrJywgJ29yaWdpbmFsVGV4dEZvcicsICd1bmdyb3VwJywgJ2luZml4Tm90YXRpb24nLCdsb2NhdGVkRXhwcicsICd3aXRoQ2xhc3MnLA0KJ0Nsb3NlTWF0Y2gnLCAndG9rZW5NYXAnLCAncHlwYXJzaW5nX2NvbW1vbicsDQpdDQoNCnN5c3RlbV92ZXJzaW9uID0gdHVwbGUoc3lzLnZlcnNpb25faW5mbylbOjNdDQpQWV8zID0gc3lzdGVtX3ZlcnNpb25bMF0gPT0gMw0KaWYgUFlfMzoNCiAgICBfTUFYX0lOVCA9IHN5cy5tYXhzaXplDQogICAgYmFzZXN0cmluZyA9IHN0cg0KICAgIHVuaWNociA9IGNocg0KICAgIF91c3RyID0gc3RyDQoNCiAgICAjIGJ1aWxkIGxpc3Qgb2Ygc2luZ2xlIGFyZyBidWlsdGlucywgdGhhdCBjYW4gYmUgdXNlZCBhcyBwYXJzZSBhY3Rpb25zDQogICAgc2luZ2xlQXJnQnVpbHRpbnMgPSBbc3VtLCBsZW4sIHNvcnRlZCwgcmV2ZXJzZWQsIGxpc3QsIHR1cGxlLCBzZXQsIGFueSwgYWxsLCBtaW4sIG1heF0NCg0KZWxzZToNCiAgICBfTUFYX0lOVCA9IHN5cy5tYXhpbnQNCiAgICByYW5nZSA9IHhyYW5nZQ0KDQogICAgZGVmIF91c3RyKG9iaik6DQogICAgICAgICIiIkRyb3AtaW4gcmVwbGFjZW1lbnQgZm9yIHN0cihvYmopIHRoYXQgdHJpZXMgdG8gYmUgVW5pY29kZSBmcmllbmRseS4gSXQgZmlyc3QgdHJpZXMNCiAgICAgICAgICAgc3RyKG9iaikuIElmIHRoYXQgZmFpbHMgd2l0aCBhIFVuaWNvZGVFbmNvZGVFcnJvciwgdGhlbiBpdCB0cmllcyB1bmljb2RlKG9iaikuIEl0DQogICAgICAgICAgIHRoZW4gPCByZXR1cm5zIHRoZSB1bmljb2RlIG9iamVjdCB8IGVuY29kZXMgaXQgd2l0aCB0aGUgZGVmYXVsdCBlbmNvZGluZyB8IC4uLiA+Lg0KICAgICAgICAiIiINCiAgICAgICAgaWYgaXNpbnN0YW5jZShvYmosdW5pY29kZSk6DQogICAgICAgICAgICByZXR1cm4gb2JqDQoNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgIyBJZiB0aGlzIHdvcmtzLCB0aGVuIF91c3RyKG9iaikgaGFzIHRoZSBzYW1lIGJlaGF2aW91ciBhcyBzdHIob2JqKSwgc28NCiAgICAgICAgICAgICMgaXQgd29uJ3QgYnJlYWsgYW55IGV4aXN0aW5nIGNvZGUuDQogICAgICAgICAgICByZXR1cm4gc3RyKG9iaikNCg0KICAgICAgICBleGNlcHQgVW5pY29kZUVuY29kZUVycm9yOg0KICAgICAgICAgICAgIyBFbHNlIGVuY29kZSBpdA0KICAgICAgICAgICAgcmV0ID0gdW5pY29kZShvYmopLmVuY29kZShzeXMuZ2V0ZGVmYXVsdGVuY29kaW5nKCksICd4bWxjaGFycmVmcmVwbGFjZScpDQogICAgICAgICAgICB4bWxjaGFycmVmID0gUmVnZXgocicmI1xkKzsnKQ0KICAgICAgICAgICAgeG1sY2hhcnJlZi5zZXRQYXJzZUFjdGlvbihsYW1iZGEgdDogJ1xcdScgKyBoZXgoaW50KHRbMF1bMjotMV0pKVsyOl0pDQogICAgICAgICAgICByZXR1cm4geG1sY2hhcnJlZi50cmFuc2Zvcm1TdHJpbmcocmV0KQ0KDQogICAgIyBidWlsZCBsaXN0IG9mIHNpbmdsZSBhcmcgYnVpbHRpbnMsIHRvbGVyYW50IG9mIFB5dGhvbiB2ZXJzaW9uLCB0aGF0IGNhbiBiZSB1c2VkIGFzIHBhcnNlIGFjdGlvbnMNCiAgICBzaW5nbGVBcmdCdWlsdGlucyA9IFtdDQogICAgaW1wb3J0IF9fYnVpbHRpbl9fDQogICAgZm9yIGZuYW1lIGluICJzdW0gbGVuIHNvcnRlZCByZXZlcnNlZCBsaXN0IHR1cGxlIHNldCBhbnkgYWxsIG1pbiBtYXgiLnNwbGl0KCk6DQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHNpbmdsZUFyZ0J1aWx0aW5zLmFwcGVuZChnZXRhdHRyKF9fYnVpbHRpbl9fLGZuYW1lKSkNCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOg0KICAgICAgICAgICAgY29udGludWUNCiAgICAgICAgICAgIA0KX2dlbmVyYXRvclR5cGUgPSB0eXBlKCh5IGZvciB5IGluIHJhbmdlKDEpKSkNCiANCmRlZiBfeG1sX2VzY2FwZShkYXRhKToNCiAgICAiIiJFc2NhcGUgJiwgPCwgPiwgIiwgJywgZXRjLiBpbiBhIHN0cmluZyBvZiBkYXRhLiIiIg0KDQogICAgIyBhbXBlcnNhbmQgbXVzdCBiZSByZXBsYWNlZCBmaXJzdA0KICAgIGZyb21fc3ltYm9scyA9ICcmPjwiXCcnDQogICAgdG9fc3ltYm9scyA9ICgnJicrcysnOycgZm9yIHMgaW4gImFtcCBndCBsdCBxdW90IGFwb3MiLnNwbGl0KCkpDQogICAgZm9yIGZyb21fLHRvXyBpbiB6aXAoZnJvbV9zeW1ib2xzLCB0b19zeW1ib2xzKToNCiAgICAgICAgZGF0YSA9IGRhdGEucmVwbGFjZShmcm9tXywgdG9fKQ0KICAgIHJldHVybiBkYXRhDQoNCmNsYXNzIF9Db25zdGFudHMob2JqZWN0KToNCiAgICBwYXNzDQoNCmFscGhhcyAgICAgPSBzdHJpbmcuYXNjaWlfdXBwZXJjYXNlICsgc3RyaW5nLmFzY2lpX2xvd2VyY2FzZQ0KbnVtcyAgICAgICA9ICIwMTIzNDU2Nzg5Ig0KaGV4bnVtcyAgICA9IG51bXMgKyAiQUJDREVGYWJjZGVmIg0KYWxwaGFudW1zICA9IGFscGhhcyArIG51bXMNCl9ic2xhc2ggICAgPSBjaHIoOTIpDQpwcmludGFibGVzID0gIiIuam9pbihjIGZvciBjIGluIHN0cmluZy5wcmludGFibGUgaWYgYyBub3QgaW4gc3RyaW5nLndoaXRlc3BhY2UpDQoNCmNsYXNzIFBhcnNlQmFzZUV4Y2VwdGlvbihFeGNlcHRpb24pOg0KICAgICIiImJhc2UgZXhjZXB0aW9uIGNsYXNzIGZvciBhbGwgcGFyc2luZyBydW50aW1lIGV4Y2VwdGlvbnMiIiINCiAgICAjIFBlcmZvcm1hbmNlIHR1bmluZzogd2UgY29uc3RydWN0IGEgKmxvdCogb2YgdGhlc2UsIHNvIGtlZXAgdGhpcw0KICAgICMgY29uc3RydWN0b3IgYXMgc21hbGwgYW5kIGZhc3QgYXMgcG9zc2libGUNCiAgICBkZWYgX19pbml0X18oIHNlbGYsIHBzdHIsIGxvYz0wLCBtc2c9Tm9uZSwgZWxlbT1Ob25lICk6DQogICAgICAgIHNlbGYubG9jID0gbG9jDQogICAgICAgIGlmIG1zZyBpcyBOb25lOg0KICAgICAgICAgICAgc2VsZi5tc2cgPSBwc3RyDQogICAgICAgICAgICBzZWxmLnBzdHIgPSAiIg0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgc2VsZi5tc2cgPSBtc2cNCiAgICAgICAgICAgIHNlbGYucHN0ciA9IHBzdHINCiAgICAgICAgc2VsZi5wYXJzZXJFbGVtZW50ID0gZWxlbQ0KICAgICAgICBzZWxmLmFyZ3MgPSAocHN0ciwgbG9jLCBtc2cpDQoNCiAgICBAY2xhc3NtZXRob2QNCiAgICBkZWYgX2Zyb21fZXhjZXB0aW9uKGNscywgcGUpOg0KICAgICAgICAiIiINCiAgICAgICAgaW50ZXJuYWwgZmFjdG9yeSBtZXRob2QgdG8gc2ltcGxpZnkgY3JlYXRpbmcgb25lIHR5cGUgb2YgUGFyc2VFeGNlcHRpb24gDQogICAgICAgIGZyb20gYW5vdGhlciAtIGF2b2lkcyBoYXZpbmcgX19pbml0X18gc2lnbmF0dXJlIGNvbmZsaWN0cyBhbW9uZyBzdWJjbGFzc2VzDQogICAgICAgICIiIg0KICAgICAgICByZXR1cm4gY2xzKHBlLnBzdHIsIHBlLmxvYywgcGUubXNnLCBwZS5wYXJzZXJFbGVtZW50KQ0KDQogICAgZGVmIF9fZ2V0YXR0cl9fKCBzZWxmLCBhbmFtZSApOg0KICAgICAgICAiIiJzdXBwb3J0ZWQgYXR0cmlidXRlcyBieSBuYW1lIGFyZToNCiAgICAgICAgICAgIC0gbGluZW5vIC0gcmV0dXJucyB0aGUgbGluZSBudW1iZXIgb2YgdGhlIGV4Y2VwdGlvbiB0ZXh0DQogICAgICAgICAgICAtIGNvbCAtIHJldHVybnMgdGhlIGNvbHVtbiBudW1iZXIgb2YgdGhlIGV4Y2VwdGlvbiB0ZXh0DQogICAgICAgICAgICAtIGxpbmUgLSByZXR1cm5zIHRoZSBsaW5lIGNvbnRhaW5pbmcgdGhlIGV4Y2VwdGlvbiB0ZXh0DQogICAgICAgICIiIg0KICAgICAgICBpZiggYW5hbWUgPT0gImxpbmVubyIgKToNCiAgICAgICAgICAgIHJldHVybiBsaW5lbm8oIHNlbGYubG9jLCBzZWxmLnBzdHIgKQ0KICAgICAgICBlbGlmKCBhbmFtZSBpbiAoImNvbCIsICJjb2x1bW4iKSApOg0KICAgICAgICAgICAgcmV0dXJuIGNvbCggc2VsZi5sb2MsIHNlbGYucHN0ciApDQogICAgICAgIGVsaWYoIGFuYW1lID09ICJsaW5lIiApOg0KICAgICAgICAgICAgcmV0dXJuIGxpbmUoIHNlbGYubG9jLCBzZWxmLnBzdHIgKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IoYW5hbWUpDQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICByZXR1cm4gIiVzIChhdCBjaGFyICVkKSwgKGxpbmU6JWQsIGNvbDolZCkiICUgXA0KICAgICAgICAgICAgICAgICggc2VsZi5tc2csIHNlbGYubG9jLCBzZWxmLmxpbmVubywgc2VsZi5jb2x1bW4gKQ0KICAgIGRlZiBfX3JlcHJfXyggc2VsZiApOg0KICAgICAgICByZXR1cm4gX3VzdHIoc2VsZikNCiAgICBkZWYgbWFya0lucHV0bGluZSggc2VsZiwgbWFya2VyU3RyaW5nID0gIj4hPCIgKToNCiAgICAgICAgIiIiRXh0cmFjdHMgdGhlIGV4Y2VwdGlvbiBsaW5lIGZyb20gdGhlIGlucHV0IHN0cmluZywgYW5kIG1hcmtzDQogICAgICAgICAgIHRoZSBsb2NhdGlvbiBvZiB0aGUgZXhjZXB0aW9uIHdpdGggYSBzcGVjaWFsIHN5bWJvbC4NCiAgICAgICAgIiIiDQogICAgICAgIGxpbmVfc3RyID0gc2VsZi5saW5lDQogICAgICAgIGxpbmVfY29sdW1uID0gc2VsZi5jb2x1bW4gLSAxDQogICAgICAgIGlmIG1hcmtlclN0cmluZzoNCiAgICAgICAgICAgIGxpbmVfc3RyID0gIiIuam9pbigobGluZV9zdHJbOmxpbmVfY29sdW1uXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VyU3RyaW5nLCBsaW5lX3N0cltsaW5lX2NvbHVtbjpdKSkNCiAgICAgICAgcmV0dXJuIGxpbmVfc3RyLnN0cmlwKCkNCiAgICBkZWYgX19kaXJfXyhzZWxmKToNCiAgICAgICAgcmV0dXJuICJsaW5lbm8gY29sIGxpbmUiLnNwbGl0KCkgKyBkaXIodHlwZShzZWxmKSkNCg0KY2xhc3MgUGFyc2VFeGNlcHRpb24oUGFyc2VCYXNlRXhjZXB0aW9uKToNCiAgICAiIiINCiAgICBFeGNlcHRpb24gdGhyb3duIHdoZW4gcGFyc2UgZXhwcmVzc2lvbnMgZG9uJ3QgbWF0Y2ggY2xhc3M7DQogICAgc3VwcG9ydGVkIGF0dHJpYnV0ZXMgYnkgbmFtZSBhcmU6DQogICAgIC0gbGluZW5vIC0gcmV0dXJucyB0aGUgbGluZSBudW1iZXIgb2YgdGhlIGV4Y2VwdGlvbiB0ZXh0DQogICAgIC0gY29sIC0gcmV0dXJucyB0aGUgY29sdW1uIG51bWJlciBvZiB0aGUgZXhjZXB0aW9uIHRleHQNCiAgICAgLSBsaW5lIC0gcmV0dXJucyB0aGUgbGluZSBjb250YWluaW5nIHRoZSBleGNlcHRpb24gdGV4dA0KICAgICAgICANCiAgICBFeGFtcGxlOjoNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgV29yZChudW1zKS5zZXROYW1lKCJpbnRlZ2VyIikucGFyc2VTdHJpbmcoIkFCQyIpDQogICAgICAgIGV4Y2VwdCBQYXJzZUV4Y2VwdGlvbiBhcyBwZToNCiAgICAgICAgICAgIHByaW50KHBlKQ0KICAgICAgICAgICAgcHJpbnQoImNvbHVtbjoge30iLmZvcm1hdChwZS5jb2wpKQ0KICAgICAgICAgICAgDQogICAgcHJpbnRzOjoNCiAgICAgICBFeHBlY3RlZCBpbnRlZ2VyIChhdCBjaGFyIDApLCAobGluZToxLCBjb2w6MSkNCiAgICAgICAgY29sdW1uOiAxDQogICAgIiIiDQogICAgcGFzcw0KDQpjbGFzcyBQYXJzZUZhdGFsRXhjZXB0aW9uKFBhcnNlQmFzZUV4Y2VwdGlvbik6DQogICAgIiIidXNlci10aHJvd2FibGUgZXhjZXB0aW9uIHRocm93biB3aGVuIGluY29uc2lzdGVudCBwYXJzZSBjb250ZW50DQogICAgICAgaXMgZm91bmQ7IHN0b3BzIGFsbCBwYXJzaW5nIGltbWVkaWF0ZWx5IiIiDQogICAgcGFzcw0KDQpjbGFzcyBQYXJzZVN5bnRheEV4Y2VwdGlvbihQYXJzZUZhdGFsRXhjZXB0aW9uKToNCiAgICAiIiJqdXN0IGxpa2UgTHtQYXJzZUZhdGFsRXhjZXB0aW9ufSwgYnV0IHRocm93biBpbnRlcm5hbGx5IHdoZW4gYW4NCiAgICAgICBMe0Vycm9yU3RvcDxBbmQuX0Vycm9yU3RvcD59ICgnLScgb3BlcmF0b3IpIGluZGljYXRlcyB0aGF0IHBhcnNpbmcgaXMgdG8gc3RvcCANCiAgICAgICBpbW1lZGlhdGVseSBiZWNhdXNlIGFuIHVuYmFja3RyYWNrYWJsZSBzeW50YXggZXJyb3IgaGFzIGJlZW4gZm91bmQiIiINCiAgICBwYXNzDQoNCiN+IGNsYXNzIFJlcGFyc2VFeGNlcHRpb24oUGFyc2VCYXNlRXhjZXB0aW9uKToNCiAgICAjfiAiIiJFeHBlcmltZW50YWwgY2xhc3MgLSBwYXJzZSBhY3Rpb25zIGNhbiByYWlzZSB0aGlzIGV4Y2VwdGlvbiB0byBjYXVzZQ0KICAgICAgICN+IHB5cGFyc2luZyB0byByZXBhcnNlIHRoZSBpbnB1dCBzdHJpbmc6DQogICAgICAgICN+IC0gd2l0aCBhIG1vZGlmaWVkIGlucHV0IHN0cmluZywgYW5kL29yDQogICAgICAgICN+IC0gd2l0aCBhIG1vZGlmaWVkIHN0YXJ0IGxvY2F0aW9uDQogICAgICAgI34gU2V0IHRoZSB2YWx1ZXMgb2YgdGhlIFJlcGFyc2VFeGNlcHRpb24gaW4gdGhlIGNvbnN0cnVjdG9yLCBhbmQgcmFpc2UgdGhlDQogICAgICAgI34gZXhjZXB0aW9uIGluIGEgcGFyc2UgYWN0aW9uIHRvIGNhdXNlIHB5cGFyc2luZyB0byB1c2UgdGhlIG5ldyBzdHJpbmcvbG9jYXRpb24uDQogICAgICAgI34gU2V0dGluZyB0aGUgdmFsdWVzIGFzIE5vbmUgY2F1c2VzIG5vIGNoYW5nZSB0byBiZSBtYWRlLg0KICAgICAgICN+ICIiIg0KICAgICN+IGRlZiBfX2luaXRfKCBzZWxmLCBuZXdzdHJpbmcsIHJlc3RhcnRMb2MgKToNCiAgICAgICAgI34gc2VsZi5uZXdQYXJzZVRleHQgPSBuZXdzdHJpbmcNCiAgICAgICAgI34gc2VsZi5yZXBhcnNlTG9jID0gcmVzdGFydExvYw0KDQpjbGFzcyBSZWN1cnNpdmVHcmFtbWFyRXhjZXB0aW9uKEV4Y2VwdGlvbik6DQogICAgIiIiZXhjZXB0aW9uIHRocm93biBieSBMe1BhcnNlckVsZW1lbnQudmFsaWRhdGV9IGlmIHRoZSBncmFtbWFyIGNvdWxkIGJlIGltcHJvcGVybHkgcmVjdXJzaXZlIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBwYXJzZUVsZW1lbnRMaXN0ICk6DQogICAgICAgIHNlbGYucGFyc2VFbGVtZW50VHJhY2UgPSBwYXJzZUVsZW1lbnRMaXN0DQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICByZXR1cm4gIlJlY3Vyc2l2ZUdyYW1tYXJFeGNlcHRpb246ICVzIiAlIHNlbGYucGFyc2VFbGVtZW50VHJhY2UNCg0KY2xhc3MgX1BhcnNlUmVzdWx0c1dpdGhPZmZzZXQob2JqZWN0KToNCiAgICBkZWYgX19pbml0X18oc2VsZixwMSxwMik6DQogICAgICAgIHNlbGYudHVwID0gKHAxLHAyKQ0KICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLGkpOg0KICAgICAgICByZXR1cm4gc2VsZi50dXBbaV0NCiAgICBkZWYgX19yZXByX18oc2VsZik6DQogICAgICAgIHJldHVybiByZXByKHNlbGYudHVwWzBdKQ0KICAgIGRlZiBzZXRPZmZzZXQoc2VsZixpKToNCiAgICAgICAgc2VsZi50dXAgPSAoc2VsZi50dXBbMF0saSkNCg0KY2xhc3MgUGFyc2VSZXN1bHRzKG9iamVjdCk6DQogICAgIiIiDQogICAgU3RydWN0dXJlZCBwYXJzZSByZXN1bHRzLCB0byBwcm92aWRlIG11bHRpcGxlIG1lYW5zIG9mIGFjY2VzcyB0byB0aGUgcGFyc2VkIGRhdGE6DQogICAgICAgLSBhcyBhIGxpc3QgKEN7bGVuKHJlc3VsdHMpfSkNCiAgICAgICAtIGJ5IGxpc3QgaW5kZXggKEN7cmVzdWx0c1swXSwgcmVzdWx0c1sxXX0sIGV0Yy4pDQogICAgICAgLSBieSBhdHRyaWJ1dGUgKEN7cmVzdWx0cy48cmVzdWx0c05hbWU+fSAtIHNlZSBMe1BhcnNlckVsZW1lbnQuc2V0UmVzdWx0c05hbWV9KQ0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpDQogICAgICAgIGRhdGVfc3RyID0gKGludGVnZXIuc2V0UmVzdWx0c05hbWUoInllYXIiKSArICcvJyANCiAgICAgICAgICAgICAgICAgICAgICAgICsgaW50ZWdlci5zZXRSZXN1bHRzTmFtZSgibW9udGgiKSArICcvJyANCiAgICAgICAgICAgICAgICAgICAgICAgICsgaW50ZWdlci5zZXRSZXN1bHRzTmFtZSgiZGF5IikpDQogICAgICAgICMgZXF1aXZhbGVudCBmb3JtOg0KICAgICAgICAjIGRhdGVfc3RyID0gaW50ZWdlcigieWVhciIpICsgJy8nICsgaW50ZWdlcigibW9udGgiKSArICcvJyArIGludGVnZXIoImRheSIpDQoNCiAgICAgICAgIyBwYXJzZVN0cmluZyByZXR1cm5zIGEgUGFyc2VSZXN1bHRzIG9iamVjdA0KICAgICAgICByZXN1bHQgPSBkYXRlX3N0ci5wYXJzZVN0cmluZygiMTk5OS8xMi8zMSIpDQoNCiAgICAgICAgZGVmIHRlc3QocywgZm49cmVwcik6DQogICAgICAgICAgICBwcmludCgiJXMgLT4gJXMiICUgKHMsIGZuKGV2YWwocykpKSkNCiAgICAgICAgdGVzdCgibGlzdChyZXN1bHQpIikNCiAgICAgICAgdGVzdCgicmVzdWx0WzBdIikNCiAgICAgICAgdGVzdCgicmVzdWx0Wydtb250aCddIikNCiAgICAgICAgdGVzdCgicmVzdWx0LmRheSIpDQogICAgICAgIHRlc3QoIidtb250aCcgaW4gcmVzdWx0IikNCiAgICAgICAgdGVzdCgiJ21pbnV0ZXMnIGluIHJlc3VsdCIpDQogICAgICAgIHRlc3QoInJlc3VsdC5kdW1wKCkiLCBzdHIpDQogICAgcHJpbnRzOjoNCiAgICAgICAgbGlzdChyZXN1bHQpIC0+IFsnMTk5OScsICcvJywgJzEyJywgJy8nLCAnMzEnXQ0KICAgICAgICByZXN1bHRbMF0gLT4gJzE5OTknDQogICAgICAgIHJlc3VsdFsnbW9udGgnXSAtPiAnMTInDQogICAgICAgIHJlc3VsdC5kYXkgLT4gJzMxJw0KICAgICAgICAnbW9udGgnIGluIHJlc3VsdCAtPiBUcnVlDQogICAgICAgICdtaW51dGVzJyBpbiByZXN1bHQgLT4gRmFsc2UNCiAgICAgICAgcmVzdWx0LmR1bXAoKSAtPiBbJzE5OTknLCAnLycsICcxMicsICcvJywgJzMxJ10NCiAgICAgICAgLSBkYXk6IDMxDQogICAgICAgIC0gbW9udGg6IDEyDQogICAgICAgIC0geWVhcjogMTk5OQ0KICAgICIiIg0KICAgIGRlZiBfX25ld19fKGNscywgdG9rbGlzdD1Ob25lLCBuYW1lPU5vbmUsIGFzTGlzdD1UcnVlLCBtb2RhbD1UcnVlICk6DQogICAgICAgIGlmIGlzaW5zdGFuY2UodG9rbGlzdCwgY2xzKToNCiAgICAgICAgICAgIHJldHVybiB0b2tsaXN0DQogICAgICAgIHJldG9iaiA9IG9iamVjdC5fX25ld19fKGNscykNCiAgICAgICAgcmV0b2JqLl9fZG9pbml0ID0gVHJ1ZQ0KICAgICAgICByZXR1cm4gcmV0b2JqDQoNCiAgICAjIFBlcmZvcm1hbmNlIHR1bmluZzogd2UgY29uc3RydWN0IGEgKmxvdCogb2YgdGhlc2UsIHNvIGtlZXAgdGhpcw0KICAgICMgY29uc3RydWN0b3IgYXMgc21hbGwgYW5kIGZhc3QgYXMgcG9zc2libGUNCiAgICBkZWYgX19pbml0X18oIHNlbGYsIHRva2xpc3Q9Tm9uZSwgbmFtZT1Ob25lLCBhc0xpc3Q9VHJ1ZSwgbW9kYWw9VHJ1ZSwgaXNpbnN0YW5jZT1pc2luc3RhbmNlICk6DQogICAgICAgIGlmIHNlbGYuX19kb2luaXQ6DQogICAgICAgICAgICBzZWxmLl9fZG9pbml0ID0gRmFsc2UNCiAgICAgICAgICAgIHNlbGYuX19uYW1lID0gTm9uZQ0KICAgICAgICAgICAgc2VsZi5fX3BhcmVudCA9IE5vbmUNCiAgICAgICAgICAgIHNlbGYuX19hY2N1bU5hbWVzID0ge30NCiAgICAgICAgICAgIHNlbGYuX19hc0xpc3QgPSBhc0xpc3QNCiAgICAgICAgICAgIHNlbGYuX19tb2RhbCA9IG1vZGFsDQogICAgICAgICAgICBpZiB0b2tsaXN0IGlzIE5vbmU6DQogICAgICAgICAgICAgICAgdG9rbGlzdCA9IFtdDQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHRva2xpc3QsIGxpc3QpOg0KICAgICAgICAgICAgICAgIHNlbGYuX190b2tsaXN0ID0gdG9rbGlzdFs6XQ0KICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKHRva2xpc3QsIF9nZW5lcmF0b3JUeXBlKToNCiAgICAgICAgICAgICAgICBzZWxmLl9fdG9rbGlzdCA9IGxpc3QodG9rbGlzdCkNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgc2VsZi5fX3Rva2xpc3QgPSBbdG9rbGlzdF0NCiAgICAgICAgICAgIHNlbGYuX190b2tkaWN0ID0gZGljdCgpDQoNCiAgICAgICAgaWYgbmFtZSBpcyBub3QgTm9uZSBhbmQgbmFtZToNCiAgICAgICAgICAgIGlmIG5vdCBtb2RhbDoNCiAgICAgICAgICAgICAgICBzZWxmLl9fYWNjdW1OYW1lc1tuYW1lXSA9IDANCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UobmFtZSxpbnQpOg0KICAgICAgICAgICAgICAgIG5hbWUgPSBfdXN0cihuYW1lKSAjIHdpbGwgYWx3YXlzIHJldHVybiBhIHN0ciwgYnV0IHVzZSBfdXN0ciBmb3IgY29uc2lzdGVuY3kNCiAgICAgICAgICAgIHNlbGYuX19uYW1lID0gbmFtZQ0KICAgICAgICAgICAgaWYgbm90IChpc2luc3RhbmNlKHRva2xpc3QsICh0eXBlKE5vbmUpLCBiYXNlc3RyaW5nLCBsaXN0KSkgYW5kIHRva2xpc3QgaW4gKE5vbmUsJycsW10pKToNCiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHRva2xpc3QsYmFzZXN0cmluZyk6DQogICAgICAgICAgICAgICAgICAgIHRva2xpc3QgPSBbIHRva2xpc3QgXQ0KICAgICAgICAgICAgICAgIGlmIGFzTGlzdDoNCiAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh0b2tsaXN0LFBhcnNlUmVzdWx0cyk6DQogICAgICAgICAgICAgICAgICAgICAgICBzZWxmW25hbWVdID0gX1BhcnNlUmVzdWx0c1dpdGhPZmZzZXQodG9rbGlzdC5jb3B5KCksMCkNCiAgICAgICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGZbbmFtZV0gPSBfUGFyc2VSZXN1bHRzV2l0aE9mZnNldChQYXJzZVJlc3VsdHModG9rbGlzdFswXSksMCkNCiAgICAgICAgICAgICAgICAgICAgc2VsZltuYW1lXS5fX25hbWUgPSBuYW1lDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZltuYW1lXSA9IHRva2xpc3RbMF0NCiAgICAgICAgICAgICAgICAgICAgZXhjZXB0IChLZXlFcnJvcixUeXBlRXJyb3IsSW5kZXhFcnJvcik6DQogICAgICAgICAgICAgICAgICAgICAgICBzZWxmW25hbWVdID0gdG9rbGlzdA0KDQogICAgZGVmIF9fZ2V0aXRlbV9fKCBzZWxmLCBpICk6DQogICAgICAgIGlmIGlzaW5zdGFuY2UoIGksIChpbnQsc2xpY2UpICk6DQogICAgICAgICAgICByZXR1cm4gc2VsZi5fX3Rva2xpc3RbaV0NCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIGlmIGkgbm90IGluIHNlbGYuX19hY2N1bU5hbWVzOg0KICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9fdG9rZGljdFtpXVstMV1bMF0NCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgcmV0dXJuIFBhcnNlUmVzdWx0cyhbIHZbMF0gZm9yIHYgaW4gc2VsZi5fX3Rva2RpY3RbaV0gXSkNCg0KICAgIGRlZiBfX3NldGl0ZW1fXyggc2VsZiwgaywgdiwgaXNpbnN0YW5jZT1pc2luc3RhbmNlICk6DQogICAgICAgIGlmIGlzaW5zdGFuY2UodixfUGFyc2VSZXN1bHRzV2l0aE9mZnNldCk6DQogICAgICAgICAgICBzZWxmLl9fdG9rZGljdFtrXSA9IHNlbGYuX190b2tkaWN0LmdldChrLGxpc3QoKSkgKyBbdl0NCiAgICAgICAgICAgIHN1YiA9IHZbMF0NCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKGssKGludCxzbGljZSkpOg0KICAgICAgICAgICAgc2VsZi5fX3Rva2xpc3Rba10gPSB2DQogICAgICAgICAgICBzdWIgPSB2DQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBzZWxmLl9fdG9rZGljdFtrXSA9IHNlbGYuX190b2tkaWN0LmdldChrLGxpc3QoKSkgKyBbX1BhcnNlUmVzdWx0c1dpdGhPZmZzZXQodiwwKV0NCiAgICAgICAgICAgIHN1YiA9IHYNCiAgICAgICAgaWYgaXNpbnN0YW5jZShzdWIsUGFyc2VSZXN1bHRzKToNCiAgICAgICAgICAgIHN1Yi5fX3BhcmVudCA9IHdrcmVmKHNlbGYpDQoNCiAgICBkZWYgX19kZWxpdGVtX18oIHNlbGYsIGkgKToNCiAgICAgICAgaWYgaXNpbnN0YW5jZShpLChpbnQsc2xpY2UpKToNCiAgICAgICAgICAgIG15bGVuID0gbGVuKCBzZWxmLl9fdG9rbGlzdCApDQogICAgICAgICAgICBkZWwgc2VsZi5fX3Rva2xpc3RbaV0NCg0KICAgICAgICAgICAgIyBjb252ZXJ0IGludCB0byBzbGljZQ0KICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShpLCBpbnQpOg0KICAgICAgICAgICAgICAgIGlmIGkgPCAwOg0KICAgICAgICAgICAgICAgICAgICBpICs9IG15bGVuDQogICAgICAgICAgICAgICAgaSA9IHNsaWNlKGksIGkrMSkNCiAgICAgICAgICAgICMgZ2V0IHJlbW92ZWQgaW5kaWNlcw0KICAgICAgICAgICAgcmVtb3ZlZCA9IGxpc3QocmFuZ2UoKmkuaW5kaWNlcyhteWxlbikpKQ0KICAgICAgICAgICAgcmVtb3ZlZC5yZXZlcnNlKCkNCiAgICAgICAgICAgICMgZml4dXAgaW5kaWNlcyBpbiB0b2tlbiBkaWN0aW9uYXJ5DQogICAgICAgICAgICBmb3IgbmFtZSxvY2N1cnJlbmNlcyBpbiBzZWxmLl9fdG9rZGljdC5pdGVtcygpOg0KICAgICAgICAgICAgICAgIGZvciBqIGluIHJlbW92ZWQ6DQogICAgICAgICAgICAgICAgICAgIGZvciBrLCAodmFsdWUsIHBvc2l0aW9uKSBpbiBlbnVtZXJhdGUob2NjdXJyZW5jZXMpOg0KICAgICAgICAgICAgICAgICAgICAgICAgb2NjdXJyZW5jZXNba10gPSBfUGFyc2VSZXN1bHRzV2l0aE9mZnNldCh2YWx1ZSwgcG9zaXRpb24gLSAocG9zaXRpb24gPiBqKSkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIGRlbCBzZWxmLl9fdG9rZGljdFtpXQ0KDQogICAgZGVmIF9fY29udGFpbnNfXyggc2VsZiwgayApOg0KICAgICAgICByZXR1cm4gayBpbiBzZWxmLl9fdG9rZGljdA0KDQogICAgZGVmIF9fbGVuX18oIHNlbGYgKTogcmV0dXJuIGxlbiggc2VsZi5fX3Rva2xpc3QgKQ0KICAgIGRlZiBfX2Jvb2xfXyhzZWxmKTogcmV0dXJuICggbm90IG5vdCBzZWxmLl9fdG9rbGlzdCApDQogICAgX19ub256ZXJvX18gPSBfX2Jvb2xfXw0KICAgIGRlZiBfX2l0ZXJfXyggc2VsZiApOiByZXR1cm4gaXRlciggc2VsZi5fX3Rva2xpc3QgKQ0KICAgIGRlZiBfX3JldmVyc2VkX18oIHNlbGYgKTogcmV0dXJuIGl0ZXIoIHNlbGYuX190b2tsaXN0Wzo6LTFdICkNCiAgICBkZWYgX2l0ZXJrZXlzKCBzZWxmICk6DQogICAgICAgIGlmIGhhc2F0dHIoc2VsZi5fX3Rva2RpY3QsICJpdGVya2V5cyIpOg0KICAgICAgICAgICAgcmV0dXJuIHNlbGYuX190b2tkaWN0Lml0ZXJrZXlzKCkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJldHVybiBpdGVyKHNlbGYuX190b2tkaWN0KQ0KDQogICAgZGVmIF9pdGVydmFsdWVzKCBzZWxmICk6DQogICAgICAgIHJldHVybiAoc2VsZltrXSBmb3IgayBpbiBzZWxmLl9pdGVya2V5cygpKQ0KICAgICAgICAgICAgDQogICAgZGVmIF9pdGVyaXRlbXMoIHNlbGYgKToNCiAgICAgICAgcmV0dXJuICgoaywgc2VsZltrXSkgZm9yIGsgaW4gc2VsZi5faXRlcmtleXMoKSkNCg0KICAgIGlmIFBZXzM6DQogICAgICAgIGtleXMgPSBfaXRlcmtleXMgICAgICAgDQogICAgICAgICIiIlJldHVybnMgYW4gaXRlcmF0b3Igb2YgYWxsIG5hbWVkIHJlc3VsdCBrZXlzIChQeXRob24gMy54IG9ubHkpLiIiIg0KDQogICAgICAgIHZhbHVlcyA9IF9pdGVydmFsdWVzDQogICAgICAgICIiIlJldHVybnMgYW4gaXRlcmF0b3Igb2YgYWxsIG5hbWVkIHJlc3VsdCB2YWx1ZXMgKFB5dGhvbiAzLnggb25seSkuIiIiDQoNCiAgICAgICAgaXRlbXMgPSBfaXRlcml0ZW1zDQogICAgICAgICIiIlJldHVybnMgYW4gaXRlcmF0b3Igb2YgYWxsIG5hbWVkIHJlc3VsdCBrZXktdmFsdWUgdHVwbGVzIChQeXRob24gMy54IG9ubHkpLiIiIg0KDQogICAgZWxzZToNCiAgICAgICAgaXRlcmtleXMgPSBfaXRlcmtleXMNCiAgICAgICAgIiIiUmV0dXJucyBhbiBpdGVyYXRvciBvZiBhbGwgbmFtZWQgcmVzdWx0IGtleXMgKFB5dGhvbiAyLnggb25seSkuIiIiDQoNCiAgICAgICAgaXRlcnZhbHVlcyA9IF9pdGVydmFsdWVzDQogICAgICAgICIiIlJldHVybnMgYW4gaXRlcmF0b3Igb2YgYWxsIG5hbWVkIHJlc3VsdCB2YWx1ZXMgKFB5dGhvbiAyLnggb25seSkuIiIiDQoNCiAgICAgICAgaXRlcml0ZW1zID0gX2l0ZXJpdGVtcw0KICAgICAgICAiIiJSZXR1cm5zIGFuIGl0ZXJhdG9yIG9mIGFsbCBuYW1lZCByZXN1bHQga2V5LXZhbHVlIHR1cGxlcyAoUHl0aG9uIDIueCBvbmx5KS4iIiINCg0KICAgICAgICBkZWYga2V5cyggc2VsZiApOg0KICAgICAgICAgICAgIiIiUmV0dXJucyBhbGwgbmFtZWQgcmVzdWx0IGtleXMgKGFzIGEgbGlzdCBpbiBQeXRob24gMi54LCBhcyBhbiBpdGVyYXRvciBpbiBQeXRob24gMy54KS4iIiINCiAgICAgICAgICAgIHJldHVybiBsaXN0KHNlbGYuaXRlcmtleXMoKSkNCg0KICAgICAgICBkZWYgdmFsdWVzKCBzZWxmICk6DQogICAgICAgICAgICAiIiJSZXR1cm5zIGFsbCBuYW1lZCByZXN1bHQgdmFsdWVzIChhcyBhIGxpc3QgaW4gUHl0aG9uIDIueCwgYXMgYW4gaXRlcmF0b3IgaW4gUHl0aG9uIDMueCkuIiIiDQogICAgICAgICAgICByZXR1cm4gbGlzdChzZWxmLml0ZXJ2YWx1ZXMoKSkNCiAgICAgICAgICAgICAgICANCiAgICAgICAgZGVmIGl0ZW1zKCBzZWxmICk6DQogICAgICAgICAgICAiIiJSZXR1cm5zIGFsbCBuYW1lZCByZXN1bHQga2V5LXZhbHVlcyAoYXMgYSBsaXN0IG9mIHR1cGxlcyBpbiBQeXRob24gMi54LCBhcyBhbiBpdGVyYXRvciBpbiBQeXRob24gMy54KS4iIiINCiAgICAgICAgICAgIHJldHVybiBsaXN0KHNlbGYuaXRlcml0ZW1zKCkpDQoNCiAgICBkZWYgaGFza2V5cyggc2VsZiApOg0KICAgICAgICAiIiJTaW5jZSBrZXlzKCkgcmV0dXJucyBhbiBpdGVyYXRvciwgdGhpcyBtZXRob2QgaXMgaGVscGZ1bCBpbiBieXBhc3NpbmcNCiAgICAgICAgICAgY29kZSB0aGF0IGxvb2tzIGZvciB0aGUgZXhpc3RlbmNlIG9mIGFueSBkZWZpbmVkIHJlc3VsdHMgbmFtZXMuIiIiDQogICAgICAgIHJldHVybiBib29sKHNlbGYuX190b2tkaWN0KQ0KICAgICAgICANCiAgICBkZWYgcG9wKCBzZWxmLCAqYXJncywgKiprd2FyZ3MpOg0KICAgICAgICAiIiINCiAgICAgICAgUmVtb3ZlcyBhbmQgcmV0dXJucyBpdGVtIGF0IHNwZWNpZmllZCBpbmRleCAoZGVmYXVsdD1De2xhc3R9KS4NCiAgICAgICAgU3VwcG9ydHMgYm90aCBDe2xpc3R9IGFuZCBDe2RpY3R9IHNlbWFudGljcyBmb3IgQ3twb3AoKX0uIElmIHBhc3NlZCBubw0KICAgICAgICBhcmd1bWVudCBvciBhbiBpbnRlZ2VyIGFyZ3VtZW50LCBpdCB3aWxsIHVzZSBDe2xpc3R9IHNlbWFudGljcw0KICAgICAgICBhbmQgcG9wIHRva2VucyBmcm9tIHRoZSBsaXN0IG9mIHBhcnNlZCB0b2tlbnMuIElmIHBhc3NlZCBhIA0KICAgICAgICBub24taW50ZWdlciBhcmd1bWVudCAobW9zdCBsaWtlbHkgYSBzdHJpbmcpLCBpdCB3aWxsIHVzZSBDe2RpY3R9DQogICAgICAgIHNlbWFudGljcyBhbmQgcG9wIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGZyb20gYW55IGRlZmluZWQgDQogICAgICAgIHJlc3VsdHMgbmFtZXMuIEEgc2Vjb25kIGRlZmF1bHQgcmV0dXJuIHZhbHVlIGFyZ3VtZW50IGlzIA0KICAgICAgICBzdXBwb3J0ZWQsIGp1c3QgYXMgaW4gQ3tkaWN0LnBvcCgpfS4NCg0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIGRlZiByZW1vdmVfZmlyc3QodG9rZW5zKToNCiAgICAgICAgICAgICAgICB0b2tlbnMucG9wKDApDQogICAgICAgICAgICBwcmludChPbmVPck1vcmUoV29yZChudW1zKSkucGFyc2VTdHJpbmcoIjAgMTIzIDMyMSIpKSAjIC0+IFsnMCcsICcxMjMnLCAnMzIxJ10NCiAgICAgICAgICAgIHByaW50KE9uZU9yTW9yZShXb3JkKG51bXMpKS5hZGRQYXJzZUFjdGlvbihyZW1vdmVfZmlyc3QpLnBhcnNlU3RyaW5nKCIwIDEyMyAzMjEiKSkgIyAtPiBbJzEyMycsICczMjEnXQ0KDQogICAgICAgICAgICBsYWJlbCA9IFdvcmQoYWxwaGFzKQ0KICAgICAgICAgICAgcGF0dCA9IGxhYmVsKCJMQUJFTCIpICsgT25lT3JNb3JlKFdvcmQobnVtcykpDQogICAgICAgICAgICBwcmludChwYXR0LnBhcnNlU3RyaW5nKCJBQUIgMTIzIDMyMSIpLmR1bXAoKSkNCg0KICAgICAgICAgICAgIyBVc2UgcG9wKCkgaW4gYSBwYXJzZSBhY3Rpb24gdG8gcmVtb3ZlIG5hbWVkIHJlc3VsdCAobm90ZSB0aGF0IGNvcnJlc3BvbmRpbmcgdmFsdWUgaXMgbm90DQogICAgICAgICAgICAjIHJlbW92ZWQgZnJvbSBsaXN0IGZvcm0gb2YgcmVzdWx0cykNCiAgICAgICAgICAgIGRlZiByZW1vdmVfTEFCRUwodG9rZW5zKToNCiAgICAgICAgICAgICAgICB0b2tlbnMucG9wKCJMQUJFTCIpDQogICAgICAgICAgICAgICAgcmV0dXJuIHRva2Vucw0KICAgICAgICAgICAgcGF0dC5hZGRQYXJzZUFjdGlvbihyZW1vdmVfTEFCRUwpDQogICAgICAgICAgICBwcmludChwYXR0LnBhcnNlU3RyaW5nKCJBQUIgMTIzIDMyMSIpLmR1bXAoKSkNCiAgICAgICAgcHJpbnRzOjoNCiAgICAgICAgICAgIFsnQUFCJywgJzEyMycsICczMjEnXQ0KICAgICAgICAgICAgLSBMQUJFTDogQUFCDQoNCiAgICAgICAgICAgIFsnQUFCJywgJzEyMycsICczMjEnXQ0KICAgICAgICAiIiINCiAgICAgICAgaWYgbm90IGFyZ3M6DQogICAgICAgICAgICBhcmdzID0gWy0xXQ0KICAgICAgICBmb3Igayx2IGluIGt3YXJncy5pdGVtcygpOg0KICAgICAgICAgICAgaWYgayA9PSAnZGVmYXVsdCc6DQogICAgICAgICAgICAgICAgYXJncyA9IChhcmdzWzBdLCB2KQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoInBvcCgpIGdvdCBhbiB1bmV4cGVjdGVkIGtleXdvcmQgYXJndW1lbnQgJyVzJyIgJSBrKQ0KICAgICAgICBpZiAoaXNpbnN0YW5jZShhcmdzWzBdLCBpbnQpIG9yIA0KICAgICAgICAgICAgICAgICAgICAgICAgbGVuKGFyZ3MpID09IDEgb3IgDQogICAgICAgICAgICAgICAgICAgICAgICBhcmdzWzBdIGluIHNlbGYpOg0KICAgICAgICAgICAgaW5kZXggPSBhcmdzWzBdDQogICAgICAgICAgICByZXQgPSBzZWxmW2luZGV4XQ0KICAgICAgICAgICAgZGVsIHNlbGZbaW5kZXhdDQogICAgICAgICAgICByZXR1cm4gcmV0DQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBkZWZhdWx0dmFsdWUgPSBhcmdzWzFdDQogICAgICAgICAgICByZXR1cm4gZGVmYXVsdHZhbHVlDQoNCiAgICBkZWYgZ2V0KHNlbGYsIGtleSwgZGVmYXVsdFZhbHVlPU5vbmUpOg0KICAgICAgICAiIiINCiAgICAgICAgUmV0dXJucyBuYW1lZCByZXN1bHQgbWF0Y2hpbmcgdGhlIGdpdmVuIGtleSwgb3IgaWYgdGhlcmUgaXMgbm8NCiAgICAgICAgc3VjaCBuYW1lLCB0aGVuIHJldHVybnMgdGhlIGdpdmVuIEN7ZGVmYXVsdFZhbHVlfSBvciBDe05vbmV9IGlmIG5vDQogICAgICAgIEN7ZGVmYXVsdFZhbHVlfSBpcyBzcGVjaWZpZWQuDQoNCiAgICAgICAgU2ltaWxhciB0byBDe2RpY3QuZ2V0KCl9Lg0KICAgICAgICANCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKQ0KICAgICAgICAgICAgZGF0ZV9zdHIgPSBpbnRlZ2VyKCJ5ZWFyIikgKyAnLycgKyBpbnRlZ2VyKCJtb250aCIpICsgJy8nICsgaW50ZWdlcigiZGF5IikgICAgICAgICAgIA0KDQogICAgICAgICAgICByZXN1bHQgPSBkYXRlX3N0ci5wYXJzZVN0cmluZygiMTk5OS8xMi8zMSIpDQogICAgICAgICAgICBwcmludChyZXN1bHQuZ2V0KCJ5ZWFyIikpICMgLT4gJzE5OTknDQogICAgICAgICAgICBwcmludChyZXN1bHQuZ2V0KCJob3VyIiwgIm5vdCBzcGVjaWZpZWQiKSkgIyAtPiAnbm90IHNwZWNpZmllZCcNCiAgICAgICAgICAgIHByaW50KHJlc3VsdC5nZXQoImhvdXIiKSkgIyAtPiBOb25lDQogICAgICAgICIiIg0KICAgICAgICBpZiBrZXkgaW4gc2VsZjoNCiAgICAgICAgICAgIHJldHVybiBzZWxmW2tleV0NCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWUNCg0KICAgIGRlZiBpbnNlcnQoIHNlbGYsIGluZGV4LCBpbnNTdHIgKToNCiAgICAgICAgIiIiDQogICAgICAgIEluc2VydHMgbmV3IGVsZW1lbnQgYXQgbG9jYXRpb24gaW5kZXggaW4gdGhlIGxpc3Qgb2YgcGFyc2VkIHRva2Vucy4NCiAgICAgICAgDQogICAgICAgIFNpbWlsYXIgdG8gQ3tsaXN0Lmluc2VydCgpfS4NCg0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIHByaW50KE9uZU9yTW9yZShXb3JkKG51bXMpKS5wYXJzZVN0cmluZygiMCAxMjMgMzIxIikpICMgLT4gWycwJywgJzEyMycsICczMjEnXQ0KDQogICAgICAgICAgICAjIHVzZSBhIHBhcnNlIGFjdGlvbiB0byBpbnNlcnQgdGhlIHBhcnNlIGxvY2F0aW9uIGluIHRoZSBmcm9udCBvZiB0aGUgcGFyc2VkIHJlc3VsdHMNCiAgICAgICAgICAgIGRlZiBpbnNlcnRfbG9jbihsb2NuLCB0b2tlbnMpOg0KICAgICAgICAgICAgICAgIHRva2Vucy5pbnNlcnQoMCwgbG9jbikNCiAgICAgICAgICAgIHByaW50KE9uZU9yTW9yZShXb3JkKG51bXMpKS5hZGRQYXJzZUFjdGlvbihpbnNlcnRfbG9jbikucGFyc2VTdHJpbmcoIjAgMTIzIDMyMSIpKSAjIC0+IFswLCAnMCcsICcxMjMnLCAnMzIxJ10NCiAgICAgICAgIiIiDQogICAgICAgIHNlbGYuX190b2tsaXN0Lmluc2VydChpbmRleCwgaW5zU3RyKQ0KICAgICAgICAjIGZpeHVwIGluZGljZXMgaW4gdG9rZW4gZGljdGlvbmFyeQ0KICAgICAgICBmb3IgbmFtZSxvY2N1cnJlbmNlcyBpbiBzZWxmLl9fdG9rZGljdC5pdGVtcygpOg0KICAgICAgICAgICAgZm9yIGssICh2YWx1ZSwgcG9zaXRpb24pIGluIGVudW1lcmF0ZShvY2N1cnJlbmNlcyk6DQogICAgICAgICAgICAgICAgb2NjdXJyZW5jZXNba10gPSBfUGFyc2VSZXN1bHRzV2l0aE9mZnNldCh2YWx1ZSwgcG9zaXRpb24gKyAocG9zaXRpb24gPiBpbmRleCkpDQoNCiAgICBkZWYgYXBwZW5kKCBzZWxmLCBpdGVtICk6DQogICAgICAgICIiIg0KICAgICAgICBBZGQgc2luZ2xlIGVsZW1lbnQgdG8gZW5kIG9mIFBhcnNlUmVzdWx0cyBsaXN0IG9mIGVsZW1lbnRzLg0KDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgcHJpbnQoT25lT3JNb3JlKFdvcmQobnVtcykpLnBhcnNlU3RyaW5nKCIwIDEyMyAzMjEiKSkgIyAtPiBbJzAnLCAnMTIzJywgJzMyMSddDQogICAgICAgICAgICANCiAgICAgICAgICAgICMgdXNlIGEgcGFyc2UgYWN0aW9uIHRvIGNvbXB1dGUgdGhlIHN1bSBvZiB0aGUgcGFyc2VkIGludGVnZXJzLCBhbmQgYWRkIGl0IHRvIHRoZSBlbmQNCiAgICAgICAgICAgIGRlZiBhcHBlbmRfc3VtKHRva2Vucyk6DQogICAgICAgICAgICAgICAgdG9rZW5zLmFwcGVuZChzdW0obWFwKGludCwgdG9rZW5zKSkpDQogICAgICAgICAgICBwcmludChPbmVPck1vcmUoV29yZChudW1zKSkuYWRkUGFyc2VBY3Rpb24oYXBwZW5kX3N1bSkucGFyc2VTdHJpbmcoIjAgMTIzIDMyMSIpKSAjIC0+IFsnMCcsICcxMjMnLCAnMzIxJywgNDQ0XQ0KICAgICAgICAiIiINCiAgICAgICAgc2VsZi5fX3Rva2xpc3QuYXBwZW5kKGl0ZW0pDQoNCiAgICBkZWYgZXh0ZW5kKCBzZWxmLCBpdGVtc2VxICk6DQogICAgICAgICIiIg0KICAgICAgICBBZGQgc2VxdWVuY2Ugb2YgZWxlbWVudHMgdG8gZW5kIG9mIFBhcnNlUmVzdWx0cyBsaXN0IG9mIGVsZW1lbnRzLg0KDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgcGF0dCA9IE9uZU9yTW9yZShXb3JkKGFscGhhcykpDQogICAgICAgICAgICANCiAgICAgICAgICAgICMgdXNlIGEgcGFyc2UgYWN0aW9uIHRvIGFwcGVuZCB0aGUgcmV2ZXJzZSBvZiB0aGUgbWF0Y2hlZCBzdHJpbmdzLCB0byBtYWtlIGEgcGFsaW5kcm9tZQ0KICAgICAgICAgICAgZGVmIG1ha2VfcGFsaW5kcm9tZSh0b2tlbnMpOg0KICAgICAgICAgICAgICAgIHRva2Vucy5leHRlbmQocmV2ZXJzZWQoW3RbOjotMV0gZm9yIHQgaW4gdG9rZW5zXSkpDQogICAgICAgICAgICAgICAgcmV0dXJuICcnLmpvaW4odG9rZW5zKQ0KICAgICAgICAgICAgcHJpbnQocGF0dC5hZGRQYXJzZUFjdGlvbihtYWtlX3BhbGluZHJvbWUpLnBhcnNlU3RyaW5nKCJsc2tkaiBzZGxramYgbGtzZCIpKSAjIC0+ICdsc2tkanNkbGtqZmxrc2Rkc2tsZmprbGRzamRrc2wnDQogICAgICAgICIiIg0KICAgICAgICBpZiBpc2luc3RhbmNlKGl0ZW1zZXEsIFBhcnNlUmVzdWx0cyk6DQogICAgICAgICAgICBzZWxmICs9IGl0ZW1zZXENCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHNlbGYuX190b2tsaXN0LmV4dGVuZChpdGVtc2VxKQ0KDQogICAgZGVmIGNsZWFyKCBzZWxmICk6DQogICAgICAgICIiIg0KICAgICAgICBDbGVhciBhbGwgZWxlbWVudHMgYW5kIHJlc3VsdHMgbmFtZXMuDQogICAgICAgICIiIg0KICAgICAgICBkZWwgc2VsZi5fX3Rva2xpc3RbOl0NCiAgICAgICAgc2VsZi5fX3Rva2RpY3QuY2xlYXIoKQ0KDQogICAgZGVmIF9fZ2V0YXR0cl9fKCBzZWxmLCBuYW1lICk6DQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHJldHVybiBzZWxmW25hbWVdDQogICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoNCiAgICAgICAgICAgIHJldHVybiAiIg0KICAgICAgICAgICAgDQogICAgICAgIGlmIG5hbWUgaW4gc2VsZi5fX3Rva2RpY3Q6DQogICAgICAgICAgICBpZiBuYW1lIG5vdCBpbiBzZWxmLl9fYWNjdW1OYW1lczoNCiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fX3Rva2RpY3RbbmFtZV1bLTFdWzBdDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHJldHVybiBQYXJzZVJlc3VsdHMoWyB2WzBdIGZvciB2IGluIHNlbGYuX190b2tkaWN0W25hbWVdIF0pDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByZXR1cm4gIiINCg0KICAgIGRlZiBfX2FkZF9fKCBzZWxmLCBvdGhlciApOg0KICAgICAgICByZXQgPSBzZWxmLmNvcHkoKQ0KICAgICAgICByZXQgKz0gb3RoZXINCiAgICAgICAgcmV0dXJuIHJldA0KDQogICAgZGVmIF9faWFkZF9fKCBzZWxmLCBvdGhlciApOg0KICAgICAgICBpZiBvdGhlci5fX3Rva2RpY3Q6DQogICAgICAgICAgICBvZmZzZXQgPSBsZW4oc2VsZi5fX3Rva2xpc3QpDQogICAgICAgICAgICBhZGRvZmZzZXQgPSBsYW1iZGEgYTogb2Zmc2V0IGlmIGE8MCBlbHNlIGErb2Zmc2V0DQogICAgICAgICAgICBvdGhlcml0ZW1zID0gb3RoZXIuX190b2tkaWN0Lml0ZW1zKCkNCiAgICAgICAgICAgIG90aGVyZGljdGl0ZW1zID0gWyhrLCBfUGFyc2VSZXN1bHRzV2l0aE9mZnNldCh2WzBdLGFkZG9mZnNldCh2WzFdKSkgKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGssdmxpc3QpIGluIG90aGVyaXRlbXMgZm9yIHYgaW4gdmxpc3RdDQogICAgICAgICAgICBmb3Igayx2IGluIG90aGVyZGljdGl0ZW1zOg0KICAgICAgICAgICAgICAgIHNlbGZba10gPSB2DQogICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2WzBdLFBhcnNlUmVzdWx0cyk6DQogICAgICAgICAgICAgICAgICAgIHZbMF0uX19wYXJlbnQgPSB3a3JlZihzZWxmKQ0KICAgICAgICAgICAgDQogICAgICAgIHNlbGYuX190b2tsaXN0ICs9IG90aGVyLl9fdG9rbGlzdA0KICAgICAgICBzZWxmLl9fYWNjdW1OYW1lcy51cGRhdGUoIG90aGVyLl9fYWNjdW1OYW1lcyApDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgX19yYWRkX18oc2VsZiwgb3RoZXIpOg0KICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLGludCkgYW5kIG90aGVyID09IDA6DQogICAgICAgICAgICAjIHVzZWZ1bCBmb3IgbWVyZ2luZyBtYW55IFBhcnNlUmVzdWx0cyB1c2luZyBzdW0oKSBidWlsdGluDQogICAgICAgICAgICByZXR1cm4gc2VsZi5jb3B5KCkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgICMgdGhpcyBtYXkgcmFpc2UgYSBUeXBlRXJyb3IgLSBzbyBiZSBpdA0KICAgICAgICAgICAgcmV0dXJuIG90aGVyICsgc2VsZg0KICAgICAgICANCiAgICBkZWYgX19yZXByX18oIHNlbGYgKToNCiAgICAgICAgcmV0dXJuICIoJXMsICVzKSIgJSAoIHJlcHIoIHNlbGYuX190b2tsaXN0ICksIHJlcHIoIHNlbGYuX190b2tkaWN0ICkgKQ0KDQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgcmV0dXJuICdbJyArICcsICcuam9pbihfdXN0cihpKSBpZiBpc2luc3RhbmNlKGksIFBhcnNlUmVzdWx0cykgZWxzZSByZXByKGkpIGZvciBpIGluIHNlbGYuX190b2tsaXN0KSArICddJw0KDQogICAgZGVmIF9hc1N0cmluZ0xpc3QoIHNlbGYsIHNlcD0nJyApOg0KICAgICAgICBvdXQgPSBbXQ0KICAgICAgICBmb3IgaXRlbSBpbiBzZWxmLl9fdG9rbGlzdDoNCiAgICAgICAgICAgIGlmIG91dCBhbmQgc2VwOg0KICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoc2VwKQ0KICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSggaXRlbSwgUGFyc2VSZXN1bHRzICk6DQogICAgICAgICAgICAgICAgb3V0ICs9IGl0ZW0uX2FzU3RyaW5nTGlzdCgpDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoIF91c3RyKGl0ZW0pICkNCiAgICAgICAgcmV0dXJuIG91dA0KDQogICAgZGVmIGFzTGlzdCggc2VsZiApOg0KICAgICAgICAiIiINCiAgICAgICAgUmV0dXJucyB0aGUgcGFyc2UgcmVzdWx0cyBhcyBhIG5lc3RlZCBsaXN0IG9mIG1hdGNoaW5nIHRva2VucywgYWxsIGNvbnZlcnRlZCB0byBzdHJpbmdzLg0KDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgcGF0dCA9IE9uZU9yTW9yZShXb3JkKGFscGhhcykpDQogICAgICAgICAgICByZXN1bHQgPSBwYXR0LnBhcnNlU3RyaW5nKCJzbGRraiBsc2RraiBzbGRraiIpDQogICAgICAgICAgICAjIGV2ZW4gdGhvdWdoIHRoZSByZXN1bHQgcHJpbnRzIGluIHN0cmluZy1saWtlIGZvcm0sIGl0IGlzIGFjdHVhbGx5IGEgcHlwYXJzaW5nIFBhcnNlUmVzdWx0cw0KICAgICAgICAgICAgcHJpbnQodHlwZShyZXN1bHQpLCByZXN1bHQpICMgLT4gPGNsYXNzICdweXBhcnNpbmcuUGFyc2VSZXN1bHRzJz4gWydzbGRraicsICdsc2RraicsICdzbGRraiddDQogICAgICAgICAgICANCiAgICAgICAgICAgICMgVXNlIGFzTGlzdCgpIHRvIGNyZWF0ZSBhbiBhY3R1YWwgbGlzdA0KICAgICAgICAgICAgcmVzdWx0X2xpc3QgPSByZXN1bHQuYXNMaXN0KCkNCiAgICAgICAgICAgIHByaW50KHR5cGUocmVzdWx0X2xpc3QpLCByZXN1bHRfbGlzdCkgIyAtPiA8Y2xhc3MgJ2xpc3QnPiBbJ3NsZGtqJywgJ2xzZGtqJywgJ3NsZGtqJ10NCiAgICAgICAgIiIiDQogICAgICAgIHJldHVybiBbcmVzLmFzTGlzdCgpIGlmIGlzaW5zdGFuY2UocmVzLFBhcnNlUmVzdWx0cykgZWxzZSByZXMgZm9yIHJlcyBpbiBzZWxmLl9fdG9rbGlzdF0NCg0KICAgIGRlZiBhc0RpY3QoIHNlbGYgKToNCiAgICAgICAgIiIiDQogICAgICAgIFJldHVybnMgdGhlIG5hbWVkIHBhcnNlIHJlc3VsdHMgYXMgYSBuZXN0ZWQgZGljdGlvbmFyeS4NCg0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpDQogICAgICAgICAgICBkYXRlX3N0ciA9IGludGVnZXIoInllYXIiKSArICcvJyArIGludGVnZXIoIm1vbnRoIikgKyAnLycgKyBpbnRlZ2VyKCJkYXkiKQ0KICAgICAgICAgICAgDQogICAgICAgICAgICByZXN1bHQgPSBkYXRlX3N0ci5wYXJzZVN0cmluZygnMTIvMzEvMTk5OScpDQogICAgICAgICAgICBwcmludCh0eXBlKHJlc3VsdCksIHJlcHIocmVzdWx0KSkgIyAtPiA8Y2xhc3MgJ3B5cGFyc2luZy5QYXJzZVJlc3VsdHMnPiAoWycxMicsICcvJywgJzMxJywgJy8nLCAnMTk5OSddLCB7J2RheSc6IFsoJzE5OTknLCA0KV0sICd5ZWFyJzogWygnMTInLCAwKV0sICdtb250aCc6IFsoJzMxJywgMildfSkNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgcmVzdWx0X2RpY3QgPSByZXN1bHQuYXNEaWN0KCkNCiAgICAgICAgICAgIHByaW50KHR5cGUocmVzdWx0X2RpY3QpLCByZXByKHJlc3VsdF9kaWN0KSkgIyAtPiA8Y2xhc3MgJ2RpY3QnPiB7J2RheSc6ICcxOTk5JywgJ3llYXInOiAnMTInLCAnbW9udGgnOiAnMzEnfQ0KDQogICAgICAgICAgICAjIGV2ZW4gdGhvdWdoIGEgUGFyc2VSZXN1bHRzIHN1cHBvcnRzIGRpY3QtbGlrZSBhY2Nlc3MsIHNvbWV0aW1lIHlvdSBqdXN0IG5lZWQgdG8gaGF2ZSBhIGRpY3QNCiAgICAgICAgICAgIGltcG9ydCBqc29uDQogICAgICAgICAgICBwcmludChqc29uLmR1bXBzKHJlc3VsdCkpICMgLT4gRXhjZXB0aW9uOiBUeXBlRXJyb3I6IC4uLiBpcyBub3QgSlNPTiBzZXJpYWxpemFibGUNCiAgICAgICAgICAgIHByaW50KGpzb24uZHVtcHMocmVzdWx0LmFzRGljdCgpKSkgIyAtPiB7Im1vbnRoIjogIjMxIiwgImRheSI6ICIxOTk5IiwgInllYXIiOiAiMTIifQ0KICAgICAgICAiIiINCiAgICAgICAgaWYgUFlfMzoNCiAgICAgICAgICAgIGl0ZW1fZm4gPSBzZWxmLml0ZW1zDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBpdGVtX2ZuID0gc2VsZi5pdGVyaXRlbXMNCiAgICAgICAgICAgIA0KICAgICAgICBkZWYgdG9JdGVtKG9iaik6DQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKG9iaiwgUGFyc2VSZXN1bHRzKToNCiAgICAgICAgICAgICAgICBpZiBvYmouaGFza2V5cygpOg0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2JqLmFzRGljdCgpDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFt0b0l0ZW0odikgZm9yIHYgaW4gb2JqXQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICByZXR1cm4gb2JqDQogICAgICAgICAgICAgICAgDQogICAgICAgIHJldHVybiBkaWN0KChrLHRvSXRlbSh2KSkgZm9yIGssdiBpbiBpdGVtX2ZuKCkpDQoNCiAgICBkZWYgY29weSggc2VsZiApOg0KICAgICAgICAiIiINCiAgICAgICAgUmV0dXJucyBhIG5ldyBjb3B5IG9mIGEgQ3tQYXJzZVJlc3VsdHN9IG9iamVjdC4NCiAgICAgICAgIiIiDQogICAgICAgIHJldCA9IFBhcnNlUmVzdWx0cyggc2VsZi5fX3Rva2xpc3QgKQ0KICAgICAgICByZXQuX190b2tkaWN0ID0gc2VsZi5fX3Rva2RpY3QuY29weSgpDQogICAgICAgIHJldC5fX3BhcmVudCA9IHNlbGYuX19wYXJlbnQNCiAgICAgICAgcmV0Ll9fYWNjdW1OYW1lcy51cGRhdGUoIHNlbGYuX19hY2N1bU5hbWVzICkNCiAgICAgICAgcmV0Ll9fbmFtZSA9IHNlbGYuX19uYW1lDQogICAgICAgIHJldHVybiByZXQNCg0KICAgIGRlZiBhc1hNTCggc2VsZiwgZG9jdGFnPU5vbmUsIG5hbWVkSXRlbXNPbmx5PUZhbHNlLCBpbmRlbnQ9IiIsIGZvcm1hdHRlZD1UcnVlICk6DQogICAgICAgICIiIg0KICAgICAgICAoRGVwcmVjYXRlZCkgUmV0dXJucyB0aGUgcGFyc2UgcmVzdWx0cyBhcyBYTUwuIFRhZ3MgYXJlIGNyZWF0ZWQgZm9yIHRva2VucyBhbmQgbGlzdHMgdGhhdCBoYXZlIGRlZmluZWQgcmVzdWx0cyBuYW1lcy4NCiAgICAgICAgIiIiDQogICAgICAgIG5sID0gIlxuIg0KICAgICAgICBvdXQgPSBbXQ0KICAgICAgICBuYW1lZEl0ZW1zID0gZGljdCgodlsxXSxrKSBmb3IgKGssdmxpc3QpIGluIHNlbGYuX190b2tkaWN0Lml0ZW1zKCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB2IGluIHZsaXN0KQ0KICAgICAgICBuZXh0TGV2ZWxJbmRlbnQgPSBpbmRlbnQgKyAiICAiDQoNCiAgICAgICAgIyBjb2xsYXBzZSBvdXQgaW5kZW50cyBpZiBmb3JtYXR0aW5nIGlzIG5vdCBkZXNpcmVkDQogICAgICAgIGlmIG5vdCBmb3JtYXR0ZWQ6DQogICAgICAgICAgICBpbmRlbnQgPSAiIg0KICAgICAgICAgICAgbmV4dExldmVsSW5kZW50ID0gIiINCiAgICAgICAgICAgIG5sID0gIiINCg0KICAgICAgICBzZWxmVGFnID0gTm9uZQ0KICAgICAgICBpZiBkb2N0YWcgaXMgbm90IE5vbmU6DQogICAgICAgICAgICBzZWxmVGFnID0gZG9jdGFnDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBpZiBzZWxmLl9fbmFtZToNCiAgICAgICAgICAgICAgICBzZWxmVGFnID0gc2VsZi5fX25hbWUNCg0KICAgICAgICBpZiBub3Qgc2VsZlRhZzoNCiAgICAgICAgICAgIGlmIG5hbWVkSXRlbXNPbmx5Og0KICAgICAgICAgICAgICAgIHJldHVybiAiIg0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICBzZWxmVGFnID0gIklURU0iDQoNCiAgICAgICAgb3V0ICs9IFsgbmwsIGluZGVudCwgIjwiLCBzZWxmVGFnLCAiPiIgXQ0KDQogICAgICAgIGZvciBpLHJlcyBpbiBlbnVtZXJhdGUoc2VsZi5fX3Rva2xpc3QpOg0KICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShyZXMsUGFyc2VSZXN1bHRzKToNCiAgICAgICAgICAgICAgICBpZiBpIGluIG5hbWVkSXRlbXM6DQogICAgICAgICAgICAgICAgICAgIG91dCArPSBbIHJlcy5hc1hNTChuYW1lZEl0ZW1zW2ldLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVkSXRlbXNPbmx5IGFuZCBkb2N0YWcgaXMgTm9uZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0TGV2ZWxJbmRlbnQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVkKV0NCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICBvdXQgKz0gWyByZXMuYXNYTUwoTm9uZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lZEl0ZW1zT25seSBhbmQgZG9jdGFnIGlzIE5vbmUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dExldmVsSW5kZW50LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlZCldDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICMgaW5kaXZpZHVhbCB0b2tlbiwgc2VlIGlmIHRoZXJlIGlzIGEgbmFtZSBmb3IgaXQNCiAgICAgICAgICAgICAgICByZXNUYWcgPSBOb25lDQogICAgICAgICAgICAgICAgaWYgaSBpbiBuYW1lZEl0ZW1zOg0KICAgICAgICAgICAgICAgICAgICByZXNUYWcgPSBuYW1lZEl0ZW1zW2ldDQogICAgICAgICAgICAgICAgaWYgbm90IHJlc1RhZzoNCiAgICAgICAgICAgICAgICAgICAgaWYgbmFtZWRJdGVtc09ubHk6DQogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQ0KICAgICAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICAgICAgcmVzVGFnID0gIklURU0iDQogICAgICAgICAgICAgICAgeG1sQm9keVRleHQgPSBfeG1sX2VzY2FwZShfdXN0cihyZXMpKQ0KICAgICAgICAgICAgICAgIG91dCArPSBbIG5sLCBuZXh0TGV2ZWxJbmRlbnQsICI8IiwgcmVzVGFnLCAiPiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxCb2R5VGV4dCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8LyIsIHJlc1RhZywgIj4iIF0NCg0KICAgICAgICBvdXQgKz0gWyBubCwgaW5kZW50LCAiPC8iLCBzZWxmVGFnLCAiPiIgXQ0KICAgICAgICByZXR1cm4gIiIuam9pbihvdXQpDQoNCiAgICBkZWYgX19sb29rdXAoc2VsZixzdWIpOg0KICAgICAgICBmb3Igayx2bGlzdCBpbiBzZWxmLl9fdG9rZGljdC5pdGVtcygpOg0KICAgICAgICAgICAgZm9yIHYsbG9jIGluIHZsaXN0Og0KICAgICAgICAgICAgICAgIGlmIHN1YiBpcyB2Og0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gaw0KICAgICAgICByZXR1cm4gTm9uZQ0KDQogICAgZGVmIGdldE5hbWUoc2VsZik6DQogICAgICAgIHIiIiINCiAgICAgICAgUmV0dXJucyB0aGUgcmVzdWx0cyBuYW1lIGZvciB0aGlzIHRva2VuIGV4cHJlc3Npb24uIFVzZWZ1bCB3aGVuIHNldmVyYWwgDQogICAgICAgIGRpZmZlcmVudCBleHByZXNzaW9ucyBtaWdodCBtYXRjaCBhdCBhIHBhcnRpY3VsYXIgbG9jYXRpb24uDQoNCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKQ0KICAgICAgICAgICAgc3NuX2V4cHIgPSBSZWdleChyIlxkXGRcZC1cZFxkLVxkXGRcZFxkIikNCiAgICAgICAgICAgIGhvdXNlX251bWJlcl9leHByID0gU3VwcHJlc3MoJyMnKSArIFdvcmQobnVtcywgYWxwaGFudW1zKQ0KICAgICAgICAgICAgdXNlcl9kYXRhID0gKEdyb3VwKGhvdXNlX251bWJlcl9leHByKSgiaG91c2VfbnVtYmVyIikgDQogICAgICAgICAgICAgICAgICAgICAgICB8IEdyb3VwKHNzbl9leHByKSgic3NuIikNCiAgICAgICAgICAgICAgICAgICAgICAgIHwgR3JvdXAoaW50ZWdlcikoImFnZSIpKQ0KICAgICAgICAgICAgdXNlcl9pbmZvID0gT25lT3JNb3JlKHVzZXJfZGF0YSkNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgcmVzdWx0ID0gdXNlcl9pbmZvLnBhcnNlU3RyaW5nKCIyMiAxMTEtMjItMzMzMyAjMjIxQiIpDQogICAgICAgICAgICBmb3IgaXRlbSBpbiByZXN1bHQ6DQogICAgICAgICAgICAgICAgcHJpbnQoaXRlbS5nZXROYW1lKCksICc6JywgaXRlbVswXSkNCiAgICAgICAgcHJpbnRzOjoNCiAgICAgICAgICAgIGFnZSA6IDIyDQogICAgICAgICAgICBzc24gOiAxMTEtMjItMzMzMw0KICAgICAgICAgICAgaG91c2VfbnVtYmVyIDogMjIxQg0KICAgICAgICAiIiINCiAgICAgICAgaWYgc2VsZi5fX25hbWU6DQogICAgICAgICAgICByZXR1cm4gc2VsZi5fX25hbWUNCiAgICAgICAgZWxpZiBzZWxmLl9fcGFyZW50Og0KICAgICAgICAgICAgcGFyID0gc2VsZi5fX3BhcmVudCgpDQogICAgICAgICAgICBpZiBwYXI6DQogICAgICAgICAgICAgICAgcmV0dXJuIHBhci5fX2xvb2t1cChzZWxmKQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQ0KICAgICAgICBlbGlmIChsZW4oc2VsZikgPT0gMSBhbmQNCiAgICAgICAgICAgICAgIGxlbihzZWxmLl9fdG9rZGljdCkgPT0gMSBhbmQNCiAgICAgICAgICAgICAgIG5leHQoaXRlcihzZWxmLl9fdG9rZGljdC52YWx1ZXMoKSkpWzBdWzFdIGluICgwLC0xKSk6DQogICAgICAgICAgICByZXR1cm4gbmV4dChpdGVyKHNlbGYuX190b2tkaWN0LmtleXMoKSkpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByZXR1cm4gTm9uZQ0KDQogICAgZGVmIGR1bXAoc2VsZiwgaW5kZW50PScnLCBkZXB0aD0wLCBmdWxsPVRydWUpOg0KICAgICAgICAiIiINCiAgICAgICAgRGlhZ25vc3RpYyBtZXRob2QgZm9yIGxpc3Rpbmcgb3V0IHRoZSBjb250ZW50cyBvZiBhIEN7UGFyc2VSZXN1bHRzfS4NCiAgICAgICAgQWNjZXB0cyBhbiBvcHRpb25hbCBDe2luZGVudH0gYXJndW1lbnQgc28gdGhhdCB0aGlzIHN0cmluZyBjYW4gYmUgZW1iZWRkZWQNCiAgICAgICAgaW4gYSBuZXN0ZWQgZGlzcGxheSBvZiBvdGhlciBkYXRhLg0KDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykNCiAgICAgICAgICAgIGRhdGVfc3RyID0gaW50ZWdlcigieWVhciIpICsgJy8nICsgaW50ZWdlcigibW9udGgiKSArICcvJyArIGludGVnZXIoImRheSIpDQogICAgICAgICAgICANCiAgICAgICAgICAgIHJlc3VsdCA9IGRhdGVfc3RyLnBhcnNlU3RyaW5nKCcxMi8zMS8xOTk5JykNCiAgICAgICAgICAgIHByaW50KHJlc3VsdC5kdW1wKCkpDQogICAgICAgIHByaW50czo6DQogICAgICAgICAgICBbJzEyJywgJy8nLCAnMzEnLCAnLycsICcxOTk5J10NCiAgICAgICAgICAgIC0gZGF5OiAxOTk5DQogICAgICAgICAgICAtIG1vbnRoOiAzMQ0KICAgICAgICAgICAgLSB5ZWFyOiAxMg0KICAgICAgICAiIiINCiAgICAgICAgb3V0ID0gW10NCiAgICAgICAgTkwgPSAnXG4nDQogICAgICAgIG91dC5hcHBlbmQoIGluZGVudCtfdXN0cihzZWxmLmFzTGlzdCgpKSApDQogICAgICAgIGlmIGZ1bGw6DQogICAgICAgICAgICBpZiBzZWxmLmhhc2tleXMoKToNCiAgICAgICAgICAgICAgICBpdGVtcyA9IHNvcnRlZCgoc3RyKGspLCB2KSBmb3Igayx2IGluIHNlbGYuaXRlbXMoKSkNCiAgICAgICAgICAgICAgICBmb3Igayx2IGluIGl0ZW1zOg0KICAgICAgICAgICAgICAgICAgICBpZiBvdXQ6DQogICAgICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKE5MKQ0KICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCAiJXMlcy0gJXM6ICIgJSAoaW5kZW50LCgnICAnKmRlcHRoKSwgaykgKQ0KICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHYsUGFyc2VSZXN1bHRzKToNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHY6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZCggdi5kdW1wKGluZGVudCxkZXB0aCsxKSApDQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoX3VzdHIodikpDQogICAgICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKHJlcHIodikpDQogICAgICAgICAgICBlbGlmIGFueShpc2luc3RhbmNlKHZ2LFBhcnNlUmVzdWx0cykgZm9yIHZ2IGluIHNlbGYpOg0KICAgICAgICAgICAgICAgIHYgPSBzZWxmDQogICAgICAgICAgICAgICAgZm9yIGksdnYgaW4gZW51bWVyYXRlKHYpOg0KICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHZ2LFBhcnNlUmVzdWx0cyk6DQogICAgICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCJcbiVzJXNbJWRdOlxuJXMlcyVzIiAlIChpbmRlbnQsKCcgICcqKGRlcHRoKSksaSxpbmRlbnQsKCcgICcqKGRlcHRoKzEpKSx2di5kdW1wKGluZGVudCxkZXB0aCsxKSApKQ0KICAgICAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZCgiXG4lcyVzWyVkXTpcbiVzJXMlcyIgJSAoaW5kZW50LCgnICAnKihkZXB0aCkpLGksaW5kZW50LCgnICAnKihkZXB0aCsxKSksX3VzdHIodnYpKSkNCiAgICAgICAgICAgIA0KICAgICAgICByZXR1cm4gIiIuam9pbihvdXQpDQoNCiAgICBkZWYgcHByaW50KHNlbGYsICphcmdzLCAqKmt3YXJncyk6DQogICAgICAgICIiIg0KICAgICAgICBQcmV0dHktcHJpbnRlciBmb3IgcGFyc2VkIHJlc3VsdHMgYXMgYSBsaXN0LCB1c2luZyB0aGUgQ3twcHJpbnR9IG1vZHVsZS4NCiAgICAgICAgQWNjZXB0cyBhZGRpdGlvbmFsIHBvc2l0aW9uYWwgb3Iga2V5d29yZCBhcmdzIGFzIGRlZmluZWQgZm9yIHRoZSANCiAgICAgICAgQ3twcHJpbnQucHByaW50fSBtZXRob2QuIChVe2h0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvMy9saWJyYXJ5L3BwcmludC5odG1sI3BwcmludC5wcHJpbnR9KQ0KDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgaWRlbnQgPSBXb3JkKGFscGhhcywgYWxwaGFudW1zKQ0KICAgICAgICAgICAgbnVtID0gV29yZChudW1zKQ0KICAgICAgICAgICAgZnVuYyA9IEZvcndhcmQoKQ0KICAgICAgICAgICAgdGVybSA9IGlkZW50IHwgbnVtIHwgR3JvdXAoJygnICsgZnVuYyArICcpJykNCiAgICAgICAgICAgIGZ1bmMgPDw9IGlkZW50ICsgR3JvdXAoT3B0aW9uYWwoZGVsaW1pdGVkTGlzdCh0ZXJtKSkpDQogICAgICAgICAgICByZXN1bHQgPSBmdW5jLnBhcnNlU3RyaW5nKCJmbmEgYSxiLChmbmIgYyxkLDIwMCksMTAwIikNCiAgICAgICAgICAgIHJlc3VsdC5wcHJpbnQod2lkdGg9NDApDQogICAgICAgIHByaW50czo6DQogICAgICAgICAgICBbJ2ZuYScsDQogICAgICAgICAgICAgWydhJywNCiAgICAgICAgICAgICAgJ2InLA0KICAgICAgICAgICAgICBbJygnLCAnZm5iJywgWydjJywgJ2QnLCAnMjAwJ10sICcpJ10sDQogICAgICAgICAgICAgICcxMDAnXV0NCiAgICAgICAgIiIiDQogICAgICAgIHBwcmludC5wcHJpbnQoc2VsZi5hc0xpc3QoKSwgKmFyZ3MsICoqa3dhcmdzKQ0KDQogICAgIyBhZGQgc3VwcG9ydCBmb3IgcGlja2xlIHByb3RvY29sDQogICAgZGVmIF9fZ2V0c3RhdGVfXyhzZWxmKToNCiAgICAgICAgcmV0dXJuICggc2VsZi5fX3Rva2xpc3QsDQogICAgICAgICAgICAgICAgICggc2VsZi5fX3Rva2RpY3QuY29weSgpLA0KICAgICAgICAgICAgICAgICAgIHNlbGYuX19wYXJlbnQgaXMgbm90IE5vbmUgYW5kIHNlbGYuX19wYXJlbnQoKSBvciBOb25lLA0KICAgICAgICAgICAgICAgICAgIHNlbGYuX19hY2N1bU5hbWVzLA0KICAgICAgICAgICAgICAgICAgIHNlbGYuX19uYW1lICkgKQ0KDQogICAgZGVmIF9fc2V0c3RhdGVfXyhzZWxmLHN0YXRlKToNCiAgICAgICAgc2VsZi5fX3Rva2xpc3QgPSBzdGF0ZVswXQ0KICAgICAgICAoc2VsZi5fX3Rva2RpY3QsDQogICAgICAgICBwYXIsDQogICAgICAgICBpbkFjY3VtTmFtZXMsDQogICAgICAgICBzZWxmLl9fbmFtZSkgPSBzdGF0ZVsxXQ0KICAgICAgICBzZWxmLl9fYWNjdW1OYW1lcyA9IHt9DQogICAgICAgIHNlbGYuX19hY2N1bU5hbWVzLnVwZGF0ZShpbkFjY3VtTmFtZXMpDQogICAgICAgIGlmIHBhciBpcyBub3QgTm9uZToNCiAgICAgICAgICAgIHNlbGYuX19wYXJlbnQgPSB3a3JlZihwYXIpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBzZWxmLl9fcGFyZW50ID0gTm9uZQ0KDQogICAgZGVmIF9fZ2V0bmV3YXJnc19fKHNlbGYpOg0KICAgICAgICByZXR1cm4gc2VsZi5fX3Rva2xpc3QsIHNlbGYuX19uYW1lLCBzZWxmLl9fYXNMaXN0LCBzZWxmLl9fbW9kYWwNCg0KICAgIGRlZiBfX2Rpcl9fKHNlbGYpOg0KICAgICAgICByZXR1cm4gKGRpcih0eXBlKHNlbGYpKSArIGxpc3Qoc2VsZi5rZXlzKCkpKQ0KDQpNdXRhYmxlTWFwcGluZy5yZWdpc3RlcihQYXJzZVJlc3VsdHMpDQoNCmRlZiBjb2wgKGxvYyxzdHJnKToNCiAgICAiIiJSZXR1cm5zIGN1cnJlbnQgY29sdW1uIHdpdGhpbiBhIHN0cmluZywgY291bnRpbmcgbmV3bGluZXMgYXMgbGluZSBzZXBhcmF0b3JzLg0KICAgVGhlIGZpcnN0IGNvbHVtbiBpcyBudW1iZXIgMS4NCg0KICAgTm90ZTogdGhlIGRlZmF1bHQgcGFyc2luZyBiZWhhdmlvciBpcyB0byBleHBhbmQgdGFicyBpbiB0aGUgaW5wdXQgc3RyaW5nDQogICBiZWZvcmUgc3RhcnRpbmcgdGhlIHBhcnNpbmcgcHJvY2Vzcy4gIFNlZSBMe0l7UGFyc2VyRWxlbWVudC5wYXJzZVN0cmluZ308UGFyc2VyRWxlbWVudC5wYXJzZVN0cmluZz59IGZvciBtb3JlIGluZm9ybWF0aW9uDQogICBvbiBwYXJzaW5nIHN0cmluZ3MgY29udGFpbmluZyBDezxUQUI+fXMsIGFuZCBzdWdnZXN0ZWQgbWV0aG9kcyB0byBtYWludGFpbiBhDQogICBjb25zaXN0ZW50IHZpZXcgb2YgdGhlIHBhcnNlZCBzdHJpbmcsIHRoZSBwYXJzZSBsb2NhdGlvbiwgYW5kIGxpbmUgYW5kIGNvbHVtbg0KICAgcG9zaXRpb25zIHdpdGhpbiB0aGUgcGFyc2VkIHN0cmluZy4NCiAgICIiIg0KICAgIHMgPSBzdHJnDQogICAgcmV0dXJuIDEgaWYgMDxsb2M8bGVuKHMpIGFuZCBzW2xvYy0xXSA9PSAnXG4nIGVsc2UgbG9jIC0gcy5yZmluZCgiXG4iLCAwLCBsb2MpDQoNCmRlZiBsaW5lbm8obG9jLHN0cmcpOg0KICAgICIiIlJldHVybnMgY3VycmVudCBsaW5lIG51bWJlciB3aXRoaW4gYSBzdHJpbmcsIGNvdW50aW5nIG5ld2xpbmVzIGFzIGxpbmUgc2VwYXJhdG9ycy4NCiAgIFRoZSBmaXJzdCBsaW5lIGlzIG51bWJlciAxLg0KDQogICBOb3RlOiB0aGUgZGVmYXVsdCBwYXJzaW5nIGJlaGF2aW9yIGlzIHRvIGV4cGFuZCB0YWJzIGluIHRoZSBpbnB1dCBzdHJpbmcNCiAgIGJlZm9yZSBzdGFydGluZyB0aGUgcGFyc2luZyBwcm9jZXNzLiAgU2VlIEx7SXtQYXJzZXJFbGVtZW50LnBhcnNlU3RyaW5nfTxQYXJzZXJFbGVtZW50LnBhcnNlU3RyaW5nPn0gZm9yIG1vcmUgaW5mb3JtYXRpb24NCiAgIG9uIHBhcnNpbmcgc3RyaW5ncyBjb250YWluaW5nIEN7PFRBQj59cywgYW5kIHN1Z2dlc3RlZCBtZXRob2RzIHRvIG1haW50YWluIGENCiAgIGNvbnNpc3RlbnQgdmlldyBvZiB0aGUgcGFyc2VkIHN0cmluZywgdGhlIHBhcnNlIGxvY2F0aW9uLCBhbmQgbGluZSBhbmQgY29sdW1uDQogICBwb3NpdGlvbnMgd2l0aGluIHRoZSBwYXJzZWQgc3RyaW5nLg0KICAgIiIiDQogICAgcmV0dXJuIHN0cmcuY291bnQoIlxuIiwwLGxvYykgKyAxDQoNCmRlZiBsaW5lKCBsb2MsIHN0cmcgKToNCiAgICAiIiJSZXR1cm5zIHRoZSBsaW5lIG9mIHRleHQgY29udGFpbmluZyBsb2Mgd2l0aGluIGEgc3RyaW5nLCBjb3VudGluZyBuZXdsaW5lcyBhcyBsaW5lIHNlcGFyYXRvcnMuDQogICAgICAgIiIiDQogICAgbGFzdENSID0gc3RyZy5yZmluZCgiXG4iLCAwLCBsb2MpDQogICAgbmV4dENSID0gc3RyZy5maW5kKCJcbiIsIGxvYykNCiAgICBpZiBuZXh0Q1IgPj0gMDoNCiAgICAgICAgcmV0dXJuIHN0cmdbbGFzdENSKzE6bmV4dENSXQ0KICAgIGVsc2U6DQogICAgICAgIHJldHVybiBzdHJnW2xhc3RDUisxOl0NCg0KZGVmIF9kZWZhdWx0U3RhcnREZWJ1Z0FjdGlvbiggaW5zdHJpbmcsIGxvYywgZXhwciApOg0KICAgIHByaW50ICgoIk1hdGNoICIgKyBfdXN0cihleHByKSArICIgYXQgbG9jICIgKyBfdXN0cihsb2MpICsgIiglZCwlZCkiICUgKCBsaW5lbm8obG9jLGluc3RyaW5nKSwgY29sKGxvYyxpbnN0cmluZykgKSkpDQoNCmRlZiBfZGVmYXVsdFN1Y2Nlc3NEZWJ1Z0FjdGlvbiggaW5zdHJpbmcsIHN0YXJ0bG9jLCBlbmRsb2MsIGV4cHIsIHRva3MgKToNCiAgICBwcmludCAoIk1hdGNoZWQgIiArIF91c3RyKGV4cHIpICsgIiAtPiAiICsgc3RyKHRva3MuYXNMaXN0KCkpKQ0KDQpkZWYgX2RlZmF1bHRFeGNlcHRpb25EZWJ1Z0FjdGlvbiggaW5zdHJpbmcsIGxvYywgZXhwciwgZXhjICk6DQogICAgcHJpbnQgKCJFeGNlcHRpb24gcmFpc2VkOiIgKyBfdXN0cihleGMpKQ0KDQpkZWYgbnVsbERlYnVnQWN0aW9uKCphcmdzKToNCiAgICAiIiInRG8tbm90aGluZycgZGVidWcgYWN0aW9uLCB0byBzdXBwcmVzcyBkZWJ1Z2dpbmcgb3V0cHV0IGR1cmluZyBwYXJzaW5nLiIiIg0KICAgIHBhc3MNCg0KIyBPbmx5IHdvcmtzIG9uIFB5dGhvbiAzLnggLSBub25sb2NhbCBpcyB0b3hpYyB0byBQeXRob24gMiBpbnN0YWxscw0KI34gJ2RlY29yYXRvciB0byB0cmltIGZ1bmN0aW9uIGNhbGxzIHRvIG1hdGNoIHRoZSBhcml0eSBvZiB0aGUgdGFyZ2V0Jw0KI34gZGVmIF90cmltX2FyaXR5KGZ1bmMsIG1heGFyZ3M9Myk6DQogICAgI34gaWYgZnVuYyBpbiBzaW5nbGVBcmdCdWlsdGluczoNCiAgICAgICAgI34gcmV0dXJuIGxhbWJkYSBzLGwsdDogZnVuYyh0KQ0KICAgICN+IGxpbWl0ID0gMA0KICAgICN+IGZvdW5kQXJpdHkgPSBGYWxzZQ0KICAgICN+IGRlZiB3cmFwcGVyKCphcmdzKToNCiAgICAgICAgI34gbm9ubG9jYWwgbGltaXQsZm91bmRBcml0eQ0KICAgICAgICAjfiB3aGlsZSAxOg0KICAgICAgICAgICAgI34gdHJ5Og0KICAgICAgICAgICAgICAgICN+IHJldCA9IGZ1bmMoKmFyZ3NbbGltaXQ6XSkNCiAgICAgICAgICAgICAgICAjfiBmb3VuZEFyaXR5ID0gVHJ1ZQ0KICAgICAgICAgICAgICAgICN+IHJldHVybiByZXQNCiAgICAgICAgICAgICN+IGV4Y2VwdCBUeXBlRXJyb3I6DQogICAgICAgICAgICAgICAgI34gaWYgbGltaXQgPT0gbWF4YXJncyBvciBmb3VuZEFyaXR5Og0KICAgICAgICAgICAgICAgICAgICAjfiByYWlzZQ0KICAgICAgICAgICAgICAgICN+IGxpbWl0ICs9IDENCiAgICAgICAgICAgICAgICAjfiBjb250aW51ZQ0KICAgICN+IHJldHVybiB3cmFwcGVyDQoNCiMgdGhpcyB2ZXJzaW9uIGlzIFB5dGhvbiAyLngtMy54IGNyb3NzLWNvbXBhdGlibGUNCidkZWNvcmF0b3IgdG8gdHJpbSBmdW5jdGlvbiBjYWxscyB0byBtYXRjaCB0aGUgYXJpdHkgb2YgdGhlIHRhcmdldCcNCmRlZiBfdHJpbV9hcml0eShmdW5jLCBtYXhhcmdzPTIpOg0KICAgIGlmIGZ1bmMgaW4gc2luZ2xlQXJnQnVpbHRpbnM6DQogICAgICAgIHJldHVybiBsYW1iZGEgcyxsLHQ6IGZ1bmModCkNCiAgICBsaW1pdCA9IFswXQ0KICAgIGZvdW5kQXJpdHkgPSBbRmFsc2VdDQogICAgDQogICAgIyB0cmFjZWJhY2sgcmV0dXJuIGRhdGEgc3RydWN0dXJlIGNoYW5nZWQgaW4gUHkzLjUgLSBub3JtYWxpemUgYmFjayB0byBwbGFpbiB0dXBsZXMNCiAgICBpZiBzeXN0ZW1fdmVyc2lvbls6Ml0gPj0gKDMsNSk6DQogICAgICAgIGRlZiBleHRyYWN0X3N0YWNrKGxpbWl0PTApOg0KICAgICAgICAgICAgIyBzcGVjaWFsIGhhbmRsaW5nIGZvciBQeXRob24gMy41LjAgLSBleHRyYSBkZWVwIGNhbGwgc3RhY2sgYnkgMQ0KICAgICAgICAgICAgb2Zmc2V0ID0gLTMgaWYgc3lzdGVtX3ZlcnNpb24gPT0gKDMsNSwwKSBlbHNlIC0yDQogICAgICAgICAgICBmcmFtZV9zdW1tYXJ5ID0gdHJhY2ViYWNrLmV4dHJhY3Rfc3RhY2sobGltaXQ9LW9mZnNldCtsaW1pdC0xKVtvZmZzZXRdDQogICAgICAgICAgICByZXR1cm4gW2ZyYW1lX3N1bW1hcnlbOjJdXQ0KICAgICAgICBkZWYgZXh0cmFjdF90Yih0YiwgbGltaXQ9MCk6DQogICAgICAgICAgICBmcmFtZXMgPSB0cmFjZWJhY2suZXh0cmFjdF90Yih0YiwgbGltaXQ9bGltaXQpDQogICAgICAgICAgICBmcmFtZV9zdW1tYXJ5ID0gZnJhbWVzWy0xXQ0KICAgICAgICAgICAgcmV0dXJuIFtmcmFtZV9zdW1tYXJ5WzoyXV0NCiAgICBlbHNlOg0KICAgICAgICBleHRyYWN0X3N0YWNrID0gdHJhY2ViYWNrLmV4dHJhY3Rfc3RhY2sNCiAgICAgICAgZXh0cmFjdF90YiA9IHRyYWNlYmFjay5leHRyYWN0X3RiDQogICAgDQogICAgIyBzeW50aGVzaXplIHdoYXQgd291bGQgYmUgcmV0dXJuZWQgYnkgdHJhY2ViYWNrLmV4dHJhY3Rfc3RhY2sgYXQgdGhlIGNhbGwgdG8gDQogICAgIyB1c2VyJ3MgcGFyc2UgYWN0aW9uICdmdW5jJywgc28gdGhhdCB3ZSBkb24ndCBpbmN1ciBjYWxsIHBlbmFsdHkgYXQgcGFyc2UgdGltZQ0KICAgIA0KICAgIExJTkVfRElGRiA9IDYNCiAgICAjIElGIEFOWSBDT0RFIENIQU5HRVMsIEVWRU4gSlVTVCBDT01NRU5UUyBPUiBCTEFOSyBMSU5FUywgQkVUV0VFTiBUSEUgTkVYVCBMSU5FIEFORCANCiAgICAjIFRIRSBDQUxMIFRPIEZVTkMgSU5TSURFIFdSQVBQRVIsIExJTkVfRElGRiBNVVNUIEJFIE1PRElGSUVEISEhIQ0KICAgIHRoaXNfbGluZSA9IGV4dHJhY3Rfc3RhY2sobGltaXQ9MilbLTFdDQogICAgcGFfY2FsbF9saW5lX3N5bnRoID0gKHRoaXNfbGluZVswXSwgdGhpc19saW5lWzFdK0xJTkVfRElGRikNCg0KICAgIGRlZiB3cmFwcGVyKCphcmdzKToNCiAgICAgICAgd2hpbGUgMToNCiAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICByZXQgPSBmdW5jKCphcmdzW2xpbWl0WzBdOl0pDQogICAgICAgICAgICAgICAgZm91bmRBcml0eVswXSA9IFRydWUNCiAgICAgICAgICAgICAgICByZXR1cm4gcmV0DQogICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOg0KICAgICAgICAgICAgICAgICMgcmUtcmFpc2UgVHlwZUVycm9ycyBpZiB0aGV5IGRpZCBub3QgY29tZSBmcm9tIG91ciBhcml0eSB0ZXN0aW5nDQogICAgICAgICAgICAgICAgaWYgZm91bmRBcml0eVswXToNCiAgICAgICAgICAgICAgICAgICAgcmFpc2UNCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgICAgICAgICB0YiA9IHN5cy5leGNfaW5mbygpWy0xXQ0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IGV4dHJhY3RfdGIodGIsIGxpbWl0PTIpWy0xXVs6Ml0gPT0gcGFfY2FsbF9saW5lX3N5bnRoOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlDQogICAgICAgICAgICAgICAgICAgIGZpbmFsbHk6DQogICAgICAgICAgICAgICAgICAgICAgICBkZWwgdGINCg0KICAgICAgICAgICAgICAgIGlmIGxpbWl0WzBdIDw9IG1heGFyZ3M6DQogICAgICAgICAgICAgICAgICAgIGxpbWl0WzBdICs9IDENCiAgICAgICAgICAgICAgICAgICAgY29udGludWUNCiAgICAgICAgICAgICAgICByYWlzZQ0KDQogICAgIyBjb3B5IGZ1bmMgbmFtZSB0byB3cmFwcGVyIGZvciBzZW5zaWJsZSBkZWJ1ZyBvdXRwdXQNCiAgICBmdW5jX25hbWUgPSAiPHBhcnNlIGFjdGlvbj4iDQogICAgdHJ5Og0KICAgICAgICBmdW5jX25hbWUgPSBnZXRhdHRyKGZ1bmMsICdfX25hbWVfXycsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldGF0dHIoZnVuYywgJ19fY2xhc3NfXycpLl9fbmFtZV9fKQ0KICAgIGV4Y2VwdCBFeGNlcHRpb246DQogICAgICAgIGZ1bmNfbmFtZSA9IHN0cihmdW5jKQ0KICAgIHdyYXBwZXIuX19uYW1lX18gPSBmdW5jX25hbWUNCg0KICAgIHJldHVybiB3cmFwcGVyDQoNCmNsYXNzIFBhcnNlckVsZW1lbnQob2JqZWN0KToNCiAgICAiIiJBYnN0cmFjdCBiYXNlIGxldmVsIHBhcnNlciBlbGVtZW50IGNsYXNzLiIiIg0KICAgIERFRkFVTFRfV0hJVEVfQ0hBUlMgPSAiIFxuXHRcciINCiAgICB2ZXJib3NlX3N0YWNrdHJhY2UgPSBGYWxzZQ0KDQogICAgQHN0YXRpY21ldGhvZA0KICAgIGRlZiBzZXREZWZhdWx0V2hpdGVzcGFjZUNoYXJzKCBjaGFycyApOg0KICAgICAgICByIiIiDQogICAgICAgIE92ZXJyaWRlcyB0aGUgZGVmYXVsdCB3aGl0ZXNwYWNlIGNoYXJzDQoNCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICAjIGRlZmF1bHQgd2hpdGVzcGFjZSBjaGFycyBhcmUgc3BhY2UsIDxUQUI+IGFuZCBuZXdsaW5lDQogICAgICAgICAgICBPbmVPck1vcmUoV29yZChhbHBoYXMpKS5wYXJzZVN0cmluZygiYWJjIGRlZlxuZ2hpIGprbCIpICAjIC0+IFsnYWJjJywgJ2RlZicsICdnaGknLCAnamtsJ10NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgIyBjaGFuZ2UgdG8ganVzdCB0cmVhdCBuZXdsaW5lIGFzIHNpZ25pZmljYW50DQogICAgICAgICAgICBQYXJzZXJFbGVtZW50LnNldERlZmF1bHRXaGl0ZXNwYWNlQ2hhcnMoIiBcdCIpDQogICAgICAgICAgICBPbmVPck1vcmUoV29yZChhbHBoYXMpKS5wYXJzZVN0cmluZygiYWJjIGRlZlxuZ2hpIGprbCIpICAjIC0+IFsnYWJjJywgJ2RlZiddDQogICAgICAgICIiIg0KICAgICAgICBQYXJzZXJFbGVtZW50LkRFRkFVTFRfV0hJVEVfQ0hBUlMgPSBjaGFycw0KDQogICAgQHN0YXRpY21ldGhvZA0KICAgIGRlZiBpbmxpbmVMaXRlcmFsc1VzaW5nKGNscyk6DQogICAgICAgICIiIg0KICAgICAgICBTZXQgY2xhc3MgdG8gYmUgdXNlZCBmb3IgaW5jbHVzaW9uIG9mIHN0cmluZyBsaXRlcmFscyBpbnRvIGEgcGFyc2VyLg0KICAgICAgICANCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICAjIGRlZmF1bHQgbGl0ZXJhbCBjbGFzcyB1c2VkIGlzIExpdGVyYWwNCiAgICAgICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpDQogICAgICAgICAgICBkYXRlX3N0ciA9IGludGVnZXIoInllYXIiKSArICcvJyArIGludGVnZXIoIm1vbnRoIikgKyAnLycgKyBpbnRlZ2VyKCJkYXkiKSAgICAgICAgICAgDQoNCiAgICAgICAgICAgIGRhdGVfc3RyLnBhcnNlU3RyaW5nKCIxOTk5LzEyLzMxIikgICMgLT4gWycxOTk5JywgJy8nLCAnMTInLCAnLycsICczMSddDQoNCg0KICAgICAgICAgICAgIyBjaGFuZ2UgdG8gU3VwcHJlc3MNCiAgICAgICAgICAgIFBhcnNlckVsZW1lbnQuaW5saW5lTGl0ZXJhbHNVc2luZyhTdXBwcmVzcykNCiAgICAgICAgICAgIGRhdGVfc3RyID0gaW50ZWdlcigieWVhciIpICsgJy8nICsgaW50ZWdlcigibW9udGgiKSArICcvJyArIGludGVnZXIoImRheSIpICAgICAgICAgICANCg0KICAgICAgICAgICAgZGF0ZV9zdHIucGFyc2VTdHJpbmcoIjE5OTkvMTIvMzEiKSAgIyAtPiBbJzE5OTknLCAnMTInLCAnMzEnXQ0KICAgICAgICAiIiINCiAgICAgICAgUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzID0gY2xzDQoNCiAgICBkZWYgX19pbml0X18oIHNlbGYsIHNhdmVsaXN0PUZhbHNlICk6DQogICAgICAgIHNlbGYucGFyc2VBY3Rpb24gPSBsaXN0KCkNCiAgICAgICAgc2VsZi5mYWlsQWN0aW9uID0gTm9uZQ0KICAgICAgICAjfiBzZWxmLm5hbWUgPSAiPHVua25vd24+IiAgIyBkb24ndCBkZWZpbmUgc2VsZi5uYW1lLCBsZXQgc3ViY2xhc3NlcyB0cnkvZXhjZXB0IHVwY2FsbA0KICAgICAgICBzZWxmLnN0clJlcHIgPSBOb25lDQogICAgICAgIHNlbGYucmVzdWx0c05hbWUgPSBOb25lDQogICAgICAgIHNlbGYuc2F2ZUFzTGlzdCA9IHNhdmVsaXN0DQogICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBUcnVlDQogICAgICAgIHNlbGYud2hpdGVDaGFycyA9IFBhcnNlckVsZW1lbnQuREVGQVVMVF9XSElURV9DSEFSUw0KICAgICAgICBzZWxmLmNvcHlEZWZhdWx0V2hpdGVDaGFycyA9IFRydWUNCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IEZhbHNlICMgdXNlZCB3aGVuIGNoZWNraW5nIGZvciBsZWZ0LXJlY3Vyc2lvbg0KICAgICAgICBzZWxmLmtlZXBUYWJzID0gRmFsc2UNCiAgICAgICAgc2VsZi5pZ25vcmVFeHBycyA9IGxpc3QoKQ0KICAgICAgICBzZWxmLmRlYnVnID0gRmFsc2UNCiAgICAgICAgc2VsZi5zdHJlYW1saW5lZCA9IEZhbHNlDQogICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IFRydWUgIyB1c2VkIHRvIG9wdGltaXplIGV4Y2VwdGlvbiBoYW5kbGluZyBmb3Igc3ViY2xhc3NlcyB0aGF0IGRvbid0IGFkdmFuY2UgcGFyc2UgaW5kZXgNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiIg0KICAgICAgICBzZWxmLm1vZGFsUmVzdWx0cyA9IFRydWUgIyB1c2VkIHRvIG1hcmsgcmVzdWx0cyBuYW1lcyBhcyBtb2RhbCAocmVwb3J0IG9ubHkgbGFzdCkgb3IgY3VtdWxhdGl2ZSAobGlzdCBhbGwpDQogICAgICAgIHNlbGYuZGVidWdBY3Rpb25zID0gKCBOb25lLCBOb25lLCBOb25lICkgI2N1c3RvbSBkZWJ1ZyBhY3Rpb25zDQogICAgICAgIHNlbGYucmUgPSBOb25lDQogICAgICAgIHNlbGYuY2FsbFByZXBhcnNlID0gVHJ1ZSAjIHVzZWQgdG8gYXZvaWQgcmVkdW5kYW50IGNhbGxzIHRvIHByZVBhcnNlDQogICAgICAgIHNlbGYuY2FsbER1cmluZ1RyeSA9IEZhbHNlDQoNCiAgICBkZWYgY29weSggc2VsZiApOg0KICAgICAgICAiIiINCiAgICAgICAgTWFrZSBhIGNvcHkgb2YgdGhpcyBDe1BhcnNlckVsZW1lbnR9LiAgVXNlZnVsIGZvciBkZWZpbmluZyBkaWZmZXJlbnQgcGFyc2UgYWN0aW9ucw0KICAgICAgICBmb3IgdGhlIHNhbWUgcGFyc2luZyBwYXR0ZXJuLCB1c2luZyBjb3BpZXMgb2YgdGhlIG9yaWdpbmFsIHBhcnNlIGVsZW1lbnQuDQogICAgICAgIA0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0b2tzOiBpbnQodG9rc1swXSkpDQogICAgICAgICAgICBpbnRlZ2VySyA9IGludGVnZXIuY29weSgpLmFkZFBhcnNlQWN0aW9uKGxhbWJkYSB0b2tzOiB0b2tzWzBdKjEwMjQpICsgU3VwcHJlc3MoIksiKQ0KICAgICAgICAgICAgaW50ZWdlck0gPSBpbnRlZ2VyLmNvcHkoKS5hZGRQYXJzZUFjdGlvbihsYW1iZGEgdG9rczogdG9rc1swXSoxMDI0KjEwMjQpICsgU3VwcHJlc3MoIk0iKQ0KICAgICAgICAgICAgDQogICAgICAgICAgICBwcmludChPbmVPck1vcmUoaW50ZWdlcksgfCBpbnRlZ2VyTSB8IGludGVnZXIpLnBhcnNlU3RyaW5nKCI1SyAxMDAgNjQwSyAyNTZNIikpDQogICAgICAgIHByaW50czo6DQogICAgICAgICAgICBbNTEyMCwgMTAwLCA2NTUzNjAsIDI2ODQzNTQ1Nl0NCiAgICAgICAgRXF1aXZhbGVudCBmb3JtIG9mIEN7ZXhwci5jb3B5KCl9IGlzIGp1c3QgQ3tleHByKCl9OjoNCiAgICAgICAgICAgIGludGVnZXJNID0gaW50ZWdlcigpLmFkZFBhcnNlQWN0aW9uKGxhbWJkYSB0b2tzOiB0b2tzWzBdKjEwMjQqMTAyNCkgKyBTdXBwcmVzcygiTSIpDQogICAgICAgICIiIg0KICAgICAgICBjcHkgPSBjb3B5LmNvcHkoIHNlbGYgKQ0KICAgICAgICBjcHkucGFyc2VBY3Rpb24gPSBzZWxmLnBhcnNlQWN0aW9uWzpdDQogICAgICAgIGNweS5pZ25vcmVFeHBycyA9IHNlbGYuaWdub3JlRXhwcnNbOl0NCiAgICAgICAgaWYgc2VsZi5jb3B5RGVmYXVsdFdoaXRlQ2hhcnM6DQogICAgICAgICAgICBjcHkud2hpdGVDaGFycyA9IFBhcnNlckVsZW1lbnQuREVGQVVMVF9XSElURV9DSEFSUw0KICAgICAgICByZXR1cm4gY3B5DQoNCiAgICBkZWYgc2V0TmFtZSggc2VsZiwgbmFtZSApOg0KICAgICAgICAiIiINCiAgICAgICAgRGVmaW5lIG5hbWUgZm9yIHRoaXMgZXhwcmVzc2lvbiwgbWFrZXMgZGVidWdnaW5nIGFuZCBleGNlcHRpb24gbWVzc2FnZXMgY2xlYXJlci4NCiAgICAgICAgDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgV29yZChudW1zKS5wYXJzZVN0cmluZygiQUJDIikgICMgLT4gRXhjZXB0aW9uOiBFeHBlY3RlZCBXOigwMTIzLi4uKSAoYXQgY2hhciAwKSwgKGxpbmU6MSwgY29sOjEpDQogICAgICAgICAgICBXb3JkKG51bXMpLnNldE5hbWUoImludGVnZXIiKS5wYXJzZVN0cmluZygiQUJDIikgICMgLT4gRXhjZXB0aW9uOiBFeHBlY3RlZCBpbnRlZ2VyIChhdCBjaGFyIDApLCAobGluZToxLCBjb2w6MSkNCiAgICAgICAgIiIiDQogICAgICAgIHNlbGYubmFtZSA9IG5hbWUNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgIiArIHNlbGYubmFtZQ0KICAgICAgICBpZiBoYXNhdHRyKHNlbGYsImV4Y2VwdGlvbiIpOg0KICAgICAgICAgICAgc2VsZi5leGNlcHRpb24ubXNnID0gc2VsZi5lcnJtc2cNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBzZXRSZXN1bHRzTmFtZSggc2VsZiwgbmFtZSwgbGlzdEFsbE1hdGNoZXM9RmFsc2UgKToNCiAgICAgICAgIiIiDQogICAgICAgIERlZmluZSBuYW1lIGZvciByZWZlcmVuY2luZyBtYXRjaGluZyB0b2tlbnMgYXMgYSBuZXN0ZWQgYXR0cmlidXRlDQogICAgICAgIG9mIHRoZSByZXR1cm5lZCBwYXJzZSByZXN1bHRzLg0KICAgICAgICBOT1RFOiB0aGlzIHJldHVybnMgYSAqY29weSogb2YgdGhlIG9yaWdpbmFsIEN7UGFyc2VyRWxlbWVudH0gb2JqZWN0Ow0KICAgICAgICB0aGlzIGlzIHNvIHRoYXQgdGhlIGNsaWVudCBjYW4gZGVmaW5lIGEgYmFzaWMgZWxlbWVudCwgc3VjaCBhcyBhbg0KICAgICAgICBpbnRlZ2VyLCBhbmQgcmVmZXJlbmNlIGl0IGluIG11bHRpcGxlIHBsYWNlcyB3aXRoIGRpZmZlcmVudCBuYW1lcy4NCg0KICAgICAgICBZb3UgY2FuIGFsc28gc2V0IHJlc3VsdHMgbmFtZXMgdXNpbmcgdGhlIGFiYnJldmlhdGVkIHN5bnRheCwNCiAgICAgICAgQ3tleHByKCJuYW1lIil9IGluIHBsYWNlIG9mIEN7ZXhwci5zZXRSZXN1bHRzTmFtZSgibmFtZSIpfSAtIA0KICAgICAgICBzZWUgTHtJe19fY2FsbF9ffTxfX2NhbGxfXz59Lg0KDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgZGF0ZV9zdHIgPSAoaW50ZWdlci5zZXRSZXN1bHRzTmFtZSgieWVhciIpICsgJy8nIA0KICAgICAgICAgICAgICAgICAgICAgICAgKyBpbnRlZ2VyLnNldFJlc3VsdHNOYW1lKCJtb250aCIpICsgJy8nIA0KICAgICAgICAgICAgICAgICAgICAgICAgKyBpbnRlZ2VyLnNldFJlc3VsdHNOYW1lKCJkYXkiKSkNCg0KICAgICAgICAgICAgIyBlcXVpdmFsZW50IGZvcm06DQogICAgICAgICAgICBkYXRlX3N0ciA9IGludGVnZXIoInllYXIiKSArICcvJyArIGludGVnZXIoIm1vbnRoIikgKyAnLycgKyBpbnRlZ2VyKCJkYXkiKQ0KICAgICAgICAiIiINCiAgICAgICAgbmV3c2VsZiA9IHNlbGYuY29weSgpDQogICAgICAgIGlmIG5hbWUuZW5kc3dpdGgoIioiKToNCiAgICAgICAgICAgIG5hbWUgPSBuYW1lWzotMV0NCiAgICAgICAgICAgIGxpc3RBbGxNYXRjaGVzPVRydWUNCiAgICAgICAgbmV3c2VsZi5yZXN1bHRzTmFtZSA9IG5hbWUNCiAgICAgICAgbmV3c2VsZi5tb2RhbFJlc3VsdHMgPSBub3QgbGlzdEFsbE1hdGNoZXMNCiAgICAgICAgcmV0dXJuIG5ld3NlbGYNCg0KICAgIGRlZiBzZXRCcmVhayhzZWxmLGJyZWFrRmxhZyA9IFRydWUpOg0KICAgICAgICAiIiJNZXRob2QgdG8gaW52b2tlIHRoZSBQeXRob24gcGRiIGRlYnVnZ2VyIHdoZW4gdGhpcyBlbGVtZW50IGlzDQogICAgICAgICAgIGFib3V0IHRvIGJlIHBhcnNlZC4gU2V0IEN7YnJlYWtGbGFnfSB0byBUcnVlIHRvIGVuYWJsZSwgRmFsc2UgdG8NCiAgICAgICAgICAgZGlzYWJsZS4NCiAgICAgICAgIiIiDQogICAgICAgIGlmIGJyZWFrRmxhZzoNCiAgICAgICAgICAgIF9wYXJzZU1ldGhvZCA9IHNlbGYuX3BhcnNlDQogICAgICAgICAgICBkZWYgYnJlYWtlcihpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSwgY2FsbFByZVBhcnNlPVRydWUpOg0KICAgICAgICAgICAgICAgIGltcG9ydCBwZGINCiAgICAgICAgICAgICAgICBwZGIuc2V0X3RyYWNlKCkNCiAgICAgICAgICAgICAgICByZXR1cm4gX3BhcnNlTWV0aG9kKCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnMsIGNhbGxQcmVQYXJzZSApDQogICAgICAgICAgICBicmVha2VyLl9vcmlnaW5hbFBhcnNlTWV0aG9kID0gX3BhcnNlTWV0aG9kDQogICAgICAgICAgICBzZWxmLl9wYXJzZSA9IGJyZWFrZXINCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIGlmIGhhc2F0dHIoc2VsZi5fcGFyc2UsIl9vcmlnaW5hbFBhcnNlTWV0aG9kIik6DQogICAgICAgICAgICAgICAgc2VsZi5fcGFyc2UgPSBzZWxmLl9wYXJzZS5fb3JpZ2luYWxQYXJzZU1ldGhvZA0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIHNldFBhcnNlQWN0aW9uKCBzZWxmLCAqZm5zLCAqKmt3YXJncyApOg0KICAgICAgICAiIiINCiAgICAgICAgRGVmaW5lIG9uZSBvciBtb3JlIGFjdGlvbnMgdG8gcGVyZm9ybSB3aGVuIHN1Y2Nlc3NmdWxseSBtYXRjaGluZyBwYXJzZSBlbGVtZW50IGRlZmluaXRpb24uDQogICAgICAgIFBhcnNlIGFjdGlvbiBmbiBpcyBhIGNhbGxhYmxlIG1ldGhvZCB3aXRoIDAtMyBhcmd1bWVudHMsIGNhbGxlZCBhcyBDe2ZuKHMsbG9jLHRva3MpfSwNCiAgICAgICAgQ3tmbihsb2MsdG9rcyl9LCBDe2ZuKHRva3MpfSwgb3IganVzdCBDe2ZuKCl9LCB3aGVyZToNCiAgICAgICAgIC0gcyAgID0gdGhlIG9yaWdpbmFsIHN0cmluZyBiZWluZyBwYXJzZWQgKHNlZSBub3RlIGJlbG93KQ0KICAgICAgICAgLSBsb2MgPSB0aGUgbG9jYXRpb24gb2YgdGhlIG1hdGNoaW5nIHN1YnN0cmluZw0KICAgICAgICAgLSB0b2tzID0gYSBsaXN0IG9mIHRoZSBtYXRjaGVkIHRva2VucywgcGFja2FnZWQgYXMgYSBDe0x7UGFyc2VSZXN1bHRzfX0gb2JqZWN0DQogICAgICAgIElmIHRoZSBmdW5jdGlvbnMgaW4gZm5zIG1vZGlmeSB0aGUgdG9rZW5zLCB0aGV5IGNhbiByZXR1cm4gdGhlbSBhcyB0aGUgcmV0dXJuDQogICAgICAgIHZhbHVlIGZyb20gZm4sIGFuZCB0aGUgbW9kaWZpZWQgbGlzdCBvZiB0b2tlbnMgd2lsbCByZXBsYWNlIHRoZSBvcmlnaW5hbC4NCiAgICAgICAgT3RoZXJ3aXNlLCBmbiBkb2VzIG5vdCBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUuDQoNCiAgICAgICAgT3B0aW9uYWwga2V5d29yZCBhcmd1bWVudHM6DQogICAgICAgICAtIGNhbGxEdXJpbmdUcnkgPSAoZGVmYXVsdD1De0ZhbHNlfSkgaW5kaWNhdGUgaWYgcGFyc2UgYWN0aW9uIHNob3VsZCBiZSBydW4gZHVyaW5nIGxvb2thaGVhZHMgYW5kIGFsdGVybmF0ZSB0ZXN0aW5nDQoNCiAgICAgICAgTm90ZTogdGhlIGRlZmF1bHQgcGFyc2luZyBiZWhhdmlvciBpcyB0byBleHBhbmQgdGFicyBpbiB0aGUgaW5wdXQgc3RyaW5nDQogICAgICAgIGJlZm9yZSBzdGFydGluZyB0aGUgcGFyc2luZyBwcm9jZXNzLiAgU2VlIEx7SXtwYXJzZVN0cmluZ308cGFyc2VTdHJpbmc+fSBmb3IgbW9yZSBpbmZvcm1hdGlvbg0KICAgICAgICBvbiBwYXJzaW5nIHN0cmluZ3MgY29udGFpbmluZyBDezxUQUI+fXMsIGFuZCBzdWdnZXN0ZWQgbWV0aG9kcyB0byBtYWludGFpbiBhDQogICAgICAgIGNvbnNpc3RlbnQgdmlldyBvZiB0aGUgcGFyc2VkIHN0cmluZywgdGhlIHBhcnNlIGxvY2F0aW9uLCBhbmQgbGluZSBhbmQgY29sdW1uDQogICAgICAgIHBvc2l0aW9ucyB3aXRoaW4gdGhlIHBhcnNlZCBzdHJpbmcuDQogICAgICAgIA0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpDQogICAgICAgICAgICBkYXRlX3N0ciA9IGludGVnZXIgKyAnLycgKyBpbnRlZ2VyICsgJy8nICsgaW50ZWdlcg0KDQogICAgICAgICAgICBkYXRlX3N0ci5wYXJzZVN0cmluZygiMTk5OS8xMi8zMSIpICAjIC0+IFsnMTk5OScsICcvJywgJzEyJywgJy8nLCAnMzEnXQ0KDQogICAgICAgICAgICAjIHVzZSBwYXJzZSBhY3Rpb24gdG8gY29udmVydCB0byBpbnRzIGF0IHBhcnNlIHRpbWUNCiAgICAgICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0b2tzOiBpbnQodG9rc1swXSkpDQogICAgICAgICAgICBkYXRlX3N0ciA9IGludGVnZXIgKyAnLycgKyBpbnRlZ2VyICsgJy8nICsgaW50ZWdlcg0KDQogICAgICAgICAgICAjIG5vdGUgdGhhdCBpbnRlZ2VyIGZpZWxkcyBhcmUgbm93IGludHMsIG5vdCBzdHJpbmdzDQogICAgICAgICAgICBkYXRlX3N0ci5wYXJzZVN0cmluZygiMTk5OS8xMi8zMSIpICAjIC0+IFsxOTk5LCAnLycsIDEyLCAnLycsIDMxXQ0KICAgICAgICAiIiINCiAgICAgICAgc2VsZi5wYXJzZUFjdGlvbiA9IGxpc3QobWFwKF90cmltX2FyaXR5LCBsaXN0KGZucykpKQ0KICAgICAgICBzZWxmLmNhbGxEdXJpbmdUcnkgPSBrd2FyZ3MuZ2V0KCJjYWxsRHVyaW5nVHJ5IiwgRmFsc2UpDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgYWRkUGFyc2VBY3Rpb24oIHNlbGYsICpmbnMsICoqa3dhcmdzICk6DQogICAgICAgICIiIg0KICAgICAgICBBZGQgb25lIG9yIG1vcmUgcGFyc2UgYWN0aW9ucyB0byBleHByZXNzaW9uJ3MgbGlzdCBvZiBwYXJzZSBhY3Rpb25zLiBTZWUgTHtJe3NldFBhcnNlQWN0aW9ufTxzZXRQYXJzZUFjdGlvbj59Lg0KICAgICAgICANCiAgICAgICAgU2VlIGV4YW1wbGVzIGluIEx7SXtjb3B5fTxjb3B5Pn0uDQogICAgICAgICIiIg0KICAgICAgICBzZWxmLnBhcnNlQWN0aW9uICs9IGxpc3QobWFwKF90cmltX2FyaXR5LCBsaXN0KGZucykpKQ0KICAgICAgICBzZWxmLmNhbGxEdXJpbmdUcnkgPSBzZWxmLmNhbGxEdXJpbmdUcnkgb3Iga3dhcmdzLmdldCgiY2FsbER1cmluZ1RyeSIsIEZhbHNlKQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIGFkZENvbmRpdGlvbihzZWxmLCAqZm5zLCAqKmt3YXJncyk6DQogICAgICAgICIiIkFkZCBhIGJvb2xlYW4gcHJlZGljYXRlIGZ1bmN0aW9uIHRvIGV4cHJlc3Npb24ncyBsaXN0IG9mIHBhcnNlIGFjdGlvbnMuIFNlZSANCiAgICAgICAgTHtJe3NldFBhcnNlQWN0aW9ufTxzZXRQYXJzZUFjdGlvbj59IGZvciBmdW5jdGlvbiBjYWxsIHNpZ25hdHVyZXMuIFVubGlrZSBDe3NldFBhcnNlQWN0aW9ufSwgDQogICAgICAgIGZ1bmN0aW9ucyBwYXNzZWQgdG8gQ3thZGRDb25kaXRpb259IG5lZWQgdG8gcmV0dXJuIGJvb2xlYW4gc3VjY2Vzcy9mYWlsIG9mIHRoZSBjb25kaXRpb24uDQoNCiAgICAgICAgT3B0aW9uYWwga2V5d29yZCBhcmd1bWVudHM6DQogICAgICAgICAtIG1lc3NhZ2UgPSBkZWZpbmUgYSBjdXN0b20gbWVzc2FnZSB0byBiZSB1c2VkIGluIHRoZSByYWlzZWQgZXhjZXB0aW9uDQogICAgICAgICAtIGZhdGFsICAgPSBpZiBUcnVlLCB3aWxsIHJhaXNlIFBhcnNlRmF0YWxFeGNlcHRpb24gdG8gc3RvcCBwYXJzaW5nIGltbWVkaWF0ZWx5OyBvdGhlcndpc2Ugd2lsbCByYWlzZSBQYXJzZUV4Y2VwdGlvbg0KICAgICAgICAgDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHRva3M6IGludCh0b2tzWzBdKSkNCiAgICAgICAgICAgIHllYXJfaW50ID0gaW50ZWdlci5jb3B5KCkNCiAgICAgICAgICAgIHllYXJfaW50LmFkZENvbmRpdGlvbihsYW1iZGEgdG9rczogdG9rc1swXSA+PSAyMDAwLCBtZXNzYWdlPSJPbmx5IHN1cHBvcnQgeWVhcnMgMjAwMCBhbmQgbGF0ZXIiKQ0KICAgICAgICAgICAgZGF0ZV9zdHIgPSB5ZWFyX2ludCArICcvJyArIGludGVnZXIgKyAnLycgKyBpbnRlZ2VyDQoNCiAgICAgICAgICAgIHJlc3VsdCA9IGRhdGVfc3RyLnBhcnNlU3RyaW5nKCIxOTk5LzEyLzMxIikgICMgLT4gRXhjZXB0aW9uOiBPbmx5IHN1cHBvcnQgeWVhcnMgMjAwMCBhbmQgbGF0ZXIgKGF0IGNoYXIgMCksIChsaW5lOjEsIGNvbDoxKQ0KICAgICAgICAiIiINCiAgICAgICAgbXNnID0ga3dhcmdzLmdldCgibWVzc2FnZSIsICJmYWlsZWQgdXNlci1kZWZpbmVkIGNvbmRpdGlvbiIpDQogICAgICAgIGV4Y190eXBlID0gUGFyc2VGYXRhbEV4Y2VwdGlvbiBpZiBrd2FyZ3MuZ2V0KCJmYXRhbCIsIEZhbHNlKSBlbHNlIFBhcnNlRXhjZXB0aW9uDQogICAgICAgIGZvciBmbiBpbiBmbnM6DQogICAgICAgICAgICBkZWYgcGEocyxsLHQpOg0KICAgICAgICAgICAgICAgIGlmIG5vdCBib29sKF90cmltX2FyaXR5KGZuKShzLGwsdCkpOg0KICAgICAgICAgICAgICAgICAgICByYWlzZSBleGNfdHlwZShzLGwsbXNnKQ0KICAgICAgICAgICAgc2VsZi5wYXJzZUFjdGlvbi5hcHBlbmQocGEpDQogICAgICAgIHNlbGYuY2FsbER1cmluZ1RyeSA9IHNlbGYuY2FsbER1cmluZ1RyeSBvciBrd2FyZ3MuZ2V0KCJjYWxsRHVyaW5nVHJ5IiwgRmFsc2UpDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgc2V0RmFpbEFjdGlvbiggc2VsZiwgZm4gKToNCiAgICAgICAgIiIiRGVmaW5lIGFjdGlvbiB0byBwZXJmb3JtIGlmIHBhcnNpbmcgZmFpbHMgYXQgdGhpcyBleHByZXNzaW9uLg0KICAgICAgICAgICBGYWlsIGFjdG9uIGZuIGlzIGEgY2FsbGFibGUgZnVuY3Rpb24gdGhhdCB0YWtlcyB0aGUgYXJndW1lbnRzDQogICAgICAgICAgIEN7Zm4ocyxsb2MsZXhwcixlcnIpfSB3aGVyZToNCiAgICAgICAgICAgIC0gcyA9IHN0cmluZyBiZWluZyBwYXJzZWQNCiAgICAgICAgICAgIC0gbG9jID0gbG9jYXRpb24gd2hlcmUgZXhwcmVzc2lvbiBtYXRjaCB3YXMgYXR0ZW1wdGVkIGFuZCBmYWlsZWQNCiAgICAgICAgICAgIC0gZXhwciA9IHRoZSBwYXJzZSBleHByZXNzaW9uIHRoYXQgZmFpbGVkDQogICAgICAgICAgICAtIGVyciA9IHRoZSBleGNlcHRpb24gdGhyb3duDQogICAgICAgICAgIFRoZSBmdW5jdGlvbiByZXR1cm5zIG5vIHZhbHVlLiAgSXQgbWF5IHRocm93IEN7THtQYXJzZUZhdGFsRXhjZXB0aW9ufX0NCiAgICAgICAgICAgaWYgaXQgaXMgZGVzaXJlZCB0byBzdG9wIHBhcnNpbmcgaW1tZWRpYXRlbHkuIiIiDQogICAgICAgIHNlbGYuZmFpbEFjdGlvbiA9IGZuDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgX3NraXBJZ25vcmFibGVzKCBzZWxmLCBpbnN0cmluZywgbG9jICk6DQogICAgICAgIGV4cHJzRm91bmQgPSBUcnVlDQogICAgICAgIHdoaWxlIGV4cHJzRm91bmQ6DQogICAgICAgICAgICBleHByc0ZvdW5kID0gRmFsc2UNCiAgICAgICAgICAgIGZvciBlIGluIHNlbGYuaWdub3JlRXhwcnM6DQogICAgICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgICAgICB3aGlsZSAxOg0KICAgICAgICAgICAgICAgICAgICAgICAgbG9jLGR1bW15ID0gZS5fcGFyc2UoIGluc3RyaW5nLCBsb2MgKQ0KICAgICAgICAgICAgICAgICAgICAgICAgZXhwcnNGb3VuZCA9IFRydWUNCiAgICAgICAgICAgICAgICBleGNlcHQgUGFyc2VFeGNlcHRpb246DQogICAgICAgICAgICAgICAgICAgIHBhc3MNCiAgICAgICAgcmV0dXJuIGxvYw0KDQogICAgZGVmIHByZVBhcnNlKCBzZWxmLCBpbnN0cmluZywgbG9jICk6DQogICAgICAgIGlmIHNlbGYuaWdub3JlRXhwcnM6DQogICAgICAgICAgICBsb2MgPSBzZWxmLl9za2lwSWdub3JhYmxlcyggaW5zdHJpbmcsIGxvYyApDQoNCiAgICAgICAgaWYgc2VsZi5za2lwV2hpdGVzcGFjZToNCiAgICAgICAgICAgIHd0ID0gc2VsZi53aGl0ZUNoYXJzDQogICAgICAgICAgICBpbnN0cmxlbiA9IGxlbihpbnN0cmluZykNCiAgICAgICAgICAgIHdoaWxlIGxvYyA8IGluc3RybGVuIGFuZCBpbnN0cmluZ1tsb2NdIGluIHd0Og0KICAgICAgICAgICAgICAgIGxvYyArPSAxDQoNCiAgICAgICAgcmV0dXJuIGxvYw0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgcmV0dXJuIGxvYywgW10NCg0KICAgIGRlZiBwb3N0UGFyc2UoIHNlbGYsIGluc3RyaW5nLCBsb2MsIHRva2VubGlzdCApOg0KICAgICAgICByZXR1cm4gdG9rZW5saXN0DQoNCiAgICAjfiBAcHJvZmlsZQ0KICAgIGRlZiBfcGFyc2VOb0NhY2hlKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSwgY2FsbFByZVBhcnNlPVRydWUgKToNCiAgICAgICAgZGVidWdnaW5nID0gKCBzZWxmLmRlYnVnICkgI2FuZCBkb0FjdGlvbnMgKQ0KDQogICAgICAgIGlmIGRlYnVnZ2luZyBvciBzZWxmLmZhaWxBY3Rpb246DQogICAgICAgICAgICAjfiBwcmludCAoIk1hdGNoIixzZWxmLCJhdCBsb2MiLGxvYywiKCVkLCVkKSIgJSAoIGxpbmVubyhsb2MsaW5zdHJpbmcpLCBjb2wobG9jLGluc3RyaW5nKSApKQ0KICAgICAgICAgICAgaWYgKHNlbGYuZGVidWdBY3Rpb25zWzBdICk6DQogICAgICAgICAgICAgICAgc2VsZi5kZWJ1Z0FjdGlvbnNbMF0oIGluc3RyaW5nLCBsb2MsIHNlbGYgKQ0KICAgICAgICAgICAgaWYgY2FsbFByZVBhcnNlIGFuZCBzZWxmLmNhbGxQcmVwYXJzZToNCiAgICAgICAgICAgICAgICBwcmVsb2MgPSBzZWxmLnByZVBhcnNlKCBpbnN0cmluZywgbG9jICkNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgcHJlbG9jID0gbG9jDQogICAgICAgICAgICB0b2tlbnNTdGFydCA9IHByZWxvYw0KICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICAgICAgbG9jLHRva2VucyA9IHNlbGYucGFyc2VJbXBsKCBpbnN0cmluZywgcHJlbG9jLCBkb0FjdGlvbnMgKQ0KICAgICAgICAgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOg0KICAgICAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbiggaW5zdHJpbmcsIGxlbihpbnN0cmluZyksIHNlbGYuZXJybXNnLCBzZWxmICkNCiAgICAgICAgICAgIGV4Y2VwdCBQYXJzZUJhc2VFeGNlcHRpb24gYXMgZXJyOg0KICAgICAgICAgICAgICAgICN+IHByaW50ICgiRXhjZXB0aW9uIHJhaXNlZDoiLCBlcnIpDQogICAgICAgICAgICAgICAgaWYgc2VsZi5kZWJ1Z0FjdGlvbnNbMl06DQogICAgICAgICAgICAgICAgICAgIHNlbGYuZGVidWdBY3Rpb25zWzJdKCBpbnN0cmluZywgdG9rZW5zU3RhcnQsIHNlbGYsIGVyciApDQogICAgICAgICAgICAgICAgaWYgc2VsZi5mYWlsQWN0aW9uOg0KICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWxBY3Rpb24oIGluc3RyaW5nLCB0b2tlbnNTdGFydCwgc2VsZiwgZXJyICkNCiAgICAgICAgICAgICAgICByYWlzZQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgaWYgY2FsbFByZVBhcnNlIGFuZCBzZWxmLmNhbGxQcmVwYXJzZToNCiAgICAgICAgICAgICAgICBwcmVsb2MgPSBzZWxmLnByZVBhcnNlKCBpbnN0cmluZywgbG9jICkNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgcHJlbG9jID0gbG9jDQogICAgICAgICAgICB0b2tlbnNTdGFydCA9IHByZWxvYw0KICAgICAgICAgICAgaWYgc2VsZi5tYXlJbmRleEVycm9yIG9yIHByZWxvYyA+PSBsZW4oaW5zdHJpbmcpOg0KICAgICAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICAgICAgbG9jLHRva2VucyA9IHNlbGYucGFyc2VJbXBsKCBpbnN0cmluZywgcHJlbG9jLCBkb0FjdGlvbnMgKQ0KICAgICAgICAgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOg0KICAgICAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbiggaW5zdHJpbmcsIGxlbihpbnN0cmluZyksIHNlbGYuZXJybXNnLCBzZWxmICkNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgbG9jLHRva2VucyA9IHNlbGYucGFyc2VJbXBsKCBpbnN0cmluZywgcHJlbG9jLCBkb0FjdGlvbnMgKQ0KDQogICAgICAgIHRva2VucyA9IHNlbGYucG9zdFBhcnNlKCBpbnN0cmluZywgbG9jLCB0b2tlbnMgKQ0KDQogICAgICAgIHJldFRva2VucyA9IFBhcnNlUmVzdWx0cyggdG9rZW5zLCBzZWxmLnJlc3VsdHNOYW1lLCBhc0xpc3Q9c2VsZi5zYXZlQXNMaXN0LCBtb2RhbD1zZWxmLm1vZGFsUmVzdWx0cyApDQogICAgICAgIGlmIHNlbGYucGFyc2VBY3Rpb24gYW5kIChkb0FjdGlvbnMgb3Igc2VsZi5jYWxsRHVyaW5nVHJ5KToNCiAgICAgICAgICAgIGlmIGRlYnVnZ2luZzoNCiAgICAgICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgICAgIGZvciBmbiBpbiBzZWxmLnBhcnNlQWN0aW9uOg0KICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5zID0gZm4oIGluc3RyaW5nLCB0b2tlbnNTdGFydCwgcmV0VG9rZW5zICkNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRva2VucyBpcyBub3QgTm9uZToNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRUb2tlbnMgPSBQYXJzZVJlc3VsdHMoIHRva2VucywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVzdWx0c05hbWUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc0xpc3Q9c2VsZi5zYXZlQXNMaXN0IGFuZCBpc2luc3RhbmNlKHRva2VucywoUGFyc2VSZXN1bHRzLGxpc3QpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGFsPXNlbGYubW9kYWxSZXN1bHRzICkNCiAgICAgICAgICAgICAgICBleGNlcHQgUGFyc2VCYXNlRXhjZXB0aW9uIGFzIGVycjoNCiAgICAgICAgICAgICAgICAgICAgI34gcHJpbnQgIkV4Y2VwdGlvbiByYWlzZWQgaW4gdXNlciBwYXJzZSBhY3Rpb246IiwgZXJyDQogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmRlYnVnQWN0aW9uc1syXSApOg0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kZWJ1Z0FjdGlvbnNbMl0oIGluc3RyaW5nLCB0b2tlbnNTdGFydCwgc2VsZiwgZXJyICkNCiAgICAgICAgICAgICAgICAgICAgcmFpc2UNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgZm9yIGZuIGluIHNlbGYucGFyc2VBY3Rpb246DQogICAgICAgICAgICAgICAgICAgIHRva2VucyA9IGZuKCBpbnN0cmluZywgdG9rZW5zU3RhcnQsIHJldFRva2VucyApDQogICAgICAgICAgICAgICAgICAgIGlmIHRva2VucyBpcyBub3QgTm9uZToNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldFRva2VucyA9IFBhcnNlUmVzdWx0cyggdG9rZW5zLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlc3VsdHNOYW1lLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc0xpc3Q9c2VsZi5zYXZlQXNMaXN0IGFuZCBpc2luc3RhbmNlKHRva2VucywoUGFyc2VSZXN1bHRzLGxpc3QpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kYWw9c2VsZi5tb2RhbFJlc3VsdHMgKQ0KICAgICAgICBpZiBkZWJ1Z2dpbmc6DQogICAgICAgICAgICAjfiBwcmludCAoIk1hdGNoZWQiLHNlbGYsIi0+IixyZXRUb2tlbnMuYXNMaXN0KCkpDQogICAgICAgICAgICBpZiAoc2VsZi5kZWJ1Z0FjdGlvbnNbMV0gKToNCiAgICAgICAgICAgICAgICBzZWxmLmRlYnVnQWN0aW9uc1sxXSggaW5zdHJpbmcsIHRva2Vuc1N0YXJ0LCBsb2MsIHNlbGYsIHJldFRva2VucyApDQoNCiAgICAgICAgcmV0dXJuIGxvYywgcmV0VG9rZW5zDQoNCiAgICBkZWYgdHJ5UGFyc2UoIHNlbGYsIGluc3RyaW5nLCBsb2MgKToNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3BhcnNlKCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9RmFsc2UgKVswXQ0KICAgICAgICBleGNlcHQgUGFyc2VGYXRhbEV4Y2VwdGlvbjoNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKCBpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCiAgICANCiAgICBkZWYgY2FuUGFyc2VOZXh0KHNlbGYsIGluc3RyaW5nLCBsb2MpOg0KICAgICAgICB0cnk6DQogICAgICAgICAgICBzZWxmLnRyeVBhcnNlKGluc3RyaW5nLCBsb2MpDQogICAgICAgIGV4Y2VwdCAoUGFyc2VFeGNlcHRpb24sIEluZGV4RXJyb3IpOg0KICAgICAgICAgICAgcmV0dXJuIEZhbHNlDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByZXR1cm4gVHJ1ZQ0KDQogICAgY2xhc3MgX1VuYm91bmRlZENhY2hlKG9iamVjdCk6DQogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToNCiAgICAgICAgICAgIGNhY2hlID0ge30NCiAgICAgICAgICAgIHNlbGYubm90X2luX2NhY2hlID0gbm90X2luX2NhY2hlID0gb2JqZWN0KCkNCg0KICAgICAgICAgICAgZGVmIGdldChzZWxmLCBrZXkpOg0KICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZS5nZXQoa2V5LCBub3RfaW5fY2FjaGUpDQoNCiAgICAgICAgICAgIGRlZiBzZXQoc2VsZiwga2V5LCB2YWx1ZSk6DQogICAgICAgICAgICAgICAgY2FjaGVba2V5XSA9IHZhbHVlDQoNCiAgICAgICAgICAgIGRlZiBjbGVhcihzZWxmKToNCiAgICAgICAgICAgICAgICBjYWNoZS5jbGVhcigpDQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICBkZWYgY2FjaGVfbGVuKHNlbGYpOg0KICAgICAgICAgICAgICAgIHJldHVybiBsZW4oY2FjaGUpDQoNCiAgICAgICAgICAgIHNlbGYuZ2V0ID0gdHlwZXMuTWV0aG9kVHlwZShnZXQsIHNlbGYpDQogICAgICAgICAgICBzZWxmLnNldCA9IHR5cGVzLk1ldGhvZFR5cGUoc2V0LCBzZWxmKQ0KICAgICAgICAgICAgc2VsZi5jbGVhciA9IHR5cGVzLk1ldGhvZFR5cGUoY2xlYXIsIHNlbGYpDQogICAgICAgICAgICBzZWxmLl9fbGVuX18gPSB0eXBlcy5NZXRob2RUeXBlKGNhY2hlX2xlbiwgc2VsZikNCg0KICAgIGlmIF9PcmRlcmVkRGljdCBpcyBub3QgTm9uZToNCiAgICAgICAgY2xhc3MgX0ZpZm9DYWNoZShvYmplY3QpOg0KICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNpemUpOg0KICAgICAgICAgICAgICAgIHNlbGYubm90X2luX2NhY2hlID0gbm90X2luX2NhY2hlID0gb2JqZWN0KCkNCg0KICAgICAgICAgICAgICAgIGNhY2hlID0gX09yZGVyZWREaWN0KCkNCg0KICAgICAgICAgICAgICAgIGRlZiBnZXQoc2VsZiwga2V5KToNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlLmdldChrZXksIG5vdF9pbl9jYWNoZSkNCg0KICAgICAgICAgICAgICAgIGRlZiBzZXQoc2VsZiwga2V5LCB2YWx1ZSk6DQogICAgICAgICAgICAgICAgICAgIGNhY2hlW2tleV0gPSB2YWx1ZQ0KICAgICAgICAgICAgICAgICAgICB3aGlsZSBsZW4oY2FjaGUpID4gc2l6ZToNCiAgICAgICAgICAgICAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZS5wb3BpdGVtKEZhbHNlKQ0KICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MNCg0KICAgICAgICAgICAgICAgIGRlZiBjbGVhcihzZWxmKToNCiAgICAgICAgICAgICAgICAgICAgY2FjaGUuY2xlYXIoKQ0KDQogICAgICAgICAgICAgICAgZGVmIGNhY2hlX2xlbihzZWxmKToNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlbihjYWNoZSkNCg0KICAgICAgICAgICAgICAgIHNlbGYuZ2V0ID0gdHlwZXMuTWV0aG9kVHlwZShnZXQsIHNlbGYpDQogICAgICAgICAgICAgICAgc2VsZi5zZXQgPSB0eXBlcy5NZXRob2RUeXBlKHNldCwgc2VsZikNCiAgICAgICAgICAgICAgICBzZWxmLmNsZWFyID0gdHlwZXMuTWV0aG9kVHlwZShjbGVhciwgc2VsZikNCiAgICAgICAgICAgICAgICBzZWxmLl9fbGVuX18gPSB0eXBlcy5NZXRob2RUeXBlKGNhY2hlX2xlbiwgc2VsZikNCg0KICAgIGVsc2U6DQogICAgICAgIGNsYXNzIF9GaWZvQ2FjaGUob2JqZWN0KToNCiAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzaXplKToNCiAgICAgICAgICAgICAgICBzZWxmLm5vdF9pbl9jYWNoZSA9IG5vdF9pbl9jYWNoZSA9IG9iamVjdCgpDQoNCiAgICAgICAgICAgICAgICBjYWNoZSA9IHt9DQogICAgICAgICAgICAgICAga2V5X2ZpZm8gPSBjb2xsZWN0aW9ucy5kZXF1ZShbXSwgc2l6ZSkNCg0KICAgICAgICAgICAgICAgIGRlZiBnZXQoc2VsZiwga2V5KToNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlLmdldChrZXksIG5vdF9pbl9jYWNoZSkNCg0KICAgICAgICAgICAgICAgIGRlZiBzZXQoc2VsZiwga2V5LCB2YWx1ZSk6DQogICAgICAgICAgICAgICAgICAgIGNhY2hlW2tleV0gPSB2YWx1ZQ0KICAgICAgICAgICAgICAgICAgICB3aGlsZSBsZW4oa2V5X2ZpZm8pID4gc2l6ZToNCiAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlLnBvcChrZXlfZmlmby5wb3BsZWZ0KCksIE5vbmUpDQogICAgICAgICAgICAgICAgICAgIGtleV9maWZvLmFwcGVuZChrZXkpDQoNCiAgICAgICAgICAgICAgICBkZWYgY2xlYXIoc2VsZik6DQogICAgICAgICAgICAgICAgICAgIGNhY2hlLmNsZWFyKCkNCiAgICAgICAgICAgICAgICAgICAga2V5X2ZpZm8uY2xlYXIoKQ0KDQogICAgICAgICAgICAgICAgZGVmIGNhY2hlX2xlbihzZWxmKToNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlbihjYWNoZSkNCg0KICAgICAgICAgICAgICAgIHNlbGYuZ2V0ID0gdHlwZXMuTWV0aG9kVHlwZShnZXQsIHNlbGYpDQogICAgICAgICAgICAgICAgc2VsZi5zZXQgPSB0eXBlcy5NZXRob2RUeXBlKHNldCwgc2VsZikNCiAgICAgICAgICAgICAgICBzZWxmLmNsZWFyID0gdHlwZXMuTWV0aG9kVHlwZShjbGVhciwgc2VsZikNCiAgICAgICAgICAgICAgICBzZWxmLl9fbGVuX18gPSB0eXBlcy5NZXRob2RUeXBlKGNhY2hlX2xlbiwgc2VsZikNCg0KICAgICMgYXJndW1lbnQgY2FjaGUgZm9yIG9wdGltaXppbmcgcmVwZWF0ZWQgY2FsbHMgd2hlbiBiYWNrdHJhY2tpbmcgdGhyb3VnaCByZWN1cnNpdmUgZXhwcmVzc2lvbnMNCiAgICBwYWNrcmF0X2NhY2hlID0ge30gIyB0aGlzIGlzIHNldCBsYXRlciBieSBlbmFibGVkUGFja3JhdCgpOyB0aGlzIGlzIGhlcmUgc28gdGhhdCByZXNldENhY2hlKCkgZG9lc24ndCBmYWlsDQogICAgcGFja3JhdF9jYWNoZV9sb2NrID0gUkxvY2soKQ0KICAgIHBhY2tyYXRfY2FjaGVfc3RhdHMgPSBbMCwgMF0NCg0KICAgICMgdGhpcyBtZXRob2QgZ2V0cyByZXBlYXRlZGx5IGNhbGxlZCBkdXJpbmcgYmFja3RyYWNraW5nIHdpdGggdGhlIHNhbWUgYXJndW1lbnRzIC0NCiAgICAjIHdlIGNhbiBjYWNoZSB0aGVzZSBhcmd1bWVudHMgYW5kIHNhdmUgb3Vyc2VsdmVzIHRoZSB0cm91YmxlIG9mIHJlLXBhcnNpbmcgdGhlIGNvbnRhaW5lZCBleHByZXNzaW9uDQogICAgZGVmIF9wYXJzZUNhY2hlKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSwgY2FsbFByZVBhcnNlPVRydWUgKToNCiAgICAgICAgSElULCBNSVNTID0gMCwgMQ0KICAgICAgICBsb29rdXAgPSAoc2VsZiwgaW5zdHJpbmcsIGxvYywgY2FsbFByZVBhcnNlLCBkb0FjdGlvbnMpDQogICAgICAgIHdpdGggUGFyc2VyRWxlbWVudC5wYWNrcmF0X2NhY2hlX2xvY2s6DQogICAgICAgICAgICBjYWNoZSA9IFBhcnNlckVsZW1lbnQucGFja3JhdF9jYWNoZQ0KICAgICAgICAgICAgdmFsdWUgPSBjYWNoZS5nZXQobG9va3VwKQ0KICAgICAgICAgICAgaWYgdmFsdWUgaXMgY2FjaGUubm90X2luX2NhY2hlOg0KICAgICAgICAgICAgICAgIFBhcnNlckVsZW1lbnQucGFja3JhdF9jYWNoZV9zdGF0c1tNSVNTXSArPSAxDQogICAgICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuX3BhcnNlTm9DYWNoZShpbnN0cmluZywgbG9jLCBkb0FjdGlvbnMsIGNhbGxQcmVQYXJzZSkNCiAgICAgICAgICAgICAgICBleGNlcHQgUGFyc2VCYXNlRXhjZXB0aW9uIGFzIHBlOg0KICAgICAgICAgICAgICAgICAgICAjIGNhY2hlIGEgY29weSBvZiB0aGUgZXhjZXB0aW9uLCB3aXRob3V0IHRoZSB0cmFjZWJhY2sNCiAgICAgICAgICAgICAgICAgICAgY2FjaGUuc2V0KGxvb2t1cCwgcGUuX19jbGFzc19fKCpwZS5hcmdzKSkNCiAgICAgICAgICAgICAgICAgICAgcmFpc2UNCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICBjYWNoZS5zZXQobG9va3VwLCAodmFsdWVbMF0sIHZhbHVlWzFdLmNvcHkoKSkpDQogICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICBQYXJzZXJFbGVtZW50LnBhY2tyYXRfY2FjaGVfc3RhdHNbSElUXSArPSAxDQogICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgRXhjZXB0aW9uKToNCiAgICAgICAgICAgICAgICAgICAgcmFpc2UgdmFsdWUNCiAgICAgICAgICAgICAgICByZXR1cm4gKHZhbHVlWzBdLCB2YWx1ZVsxXS5jb3B5KCkpDQoNCiAgICBfcGFyc2UgPSBfcGFyc2VOb0NhY2hlDQoNCiAgICBAc3RhdGljbWV0aG9kDQogICAgZGVmIHJlc2V0Q2FjaGUoKToNCiAgICAgICAgUGFyc2VyRWxlbWVudC5wYWNrcmF0X2NhY2hlLmNsZWFyKCkNCiAgICAgICAgUGFyc2VyRWxlbWVudC5wYWNrcmF0X2NhY2hlX3N0YXRzWzpdID0gWzBdICogbGVuKFBhcnNlckVsZW1lbnQucGFja3JhdF9jYWNoZV9zdGF0cykNCg0KICAgIF9wYWNrcmF0RW5hYmxlZCA9IEZhbHNlDQogICAgQHN0YXRpY21ldGhvZA0KICAgIGRlZiBlbmFibGVQYWNrcmF0KGNhY2hlX3NpemVfbGltaXQ9MTI4KToNCiAgICAgICAgIiIiRW5hYmxlcyAicGFja3JhdCIgcGFyc2luZywgd2hpY2ggYWRkcyBtZW1vaXppbmcgdG8gdGhlIHBhcnNpbmcgbG9naWMuDQogICAgICAgICAgIFJlcGVhdGVkIHBhcnNlIGF0dGVtcHRzIGF0IHRoZSBzYW1lIHN0cmluZyBsb2NhdGlvbiAod2hpY2ggaGFwcGVucw0KICAgICAgICAgICBvZnRlbiBpbiBtYW55IGNvbXBsZXggZ3JhbW1hcnMpIGNhbiBpbW1lZGlhdGVseSByZXR1cm4gYSBjYWNoZWQgdmFsdWUsDQogICAgICAgICAgIGluc3RlYWQgb2YgcmUtZXhlY3V0aW5nIHBhcnNpbmcvdmFsaWRhdGluZyBjb2RlLiAgTWVtb2l6aW5nIGlzIGRvbmUgb2YNCiAgICAgICAgICAgYm90aCB2YWxpZCByZXN1bHRzIGFuZCBwYXJzaW5nIGV4Y2VwdGlvbnMuDQogICAgICAgICAgIA0KICAgICAgICAgICBQYXJhbWV0ZXJzOg0KICAgICAgICAgICAgLSBjYWNoZV9zaXplX2xpbWl0IC0gKGRlZmF1bHQ9Q3sxMjh9KSAtIGlmIGFuIGludGVnZXIgdmFsdWUgaXMgcHJvdmlkZWQNCiAgICAgICAgICAgICAgd2lsbCBsaW1pdCB0aGUgc2l6ZSBvZiB0aGUgcGFja3JhdCBjYWNoZTsgaWYgTm9uZSBpcyBwYXNzZWQsIHRoZW4NCiAgICAgICAgICAgICAgdGhlIGNhY2hlIHNpemUgd2lsbCBiZSB1bmJvdW5kZWQ7IGlmIDAgaXMgcGFzc2VkLCB0aGUgY2FjaGUgd2lsbA0KICAgICAgICAgICAgICBiZSBlZmZlY3RpdmVseSBkaXNhYmxlZC4NCiAgICAgICAgICAgIA0KICAgICAgICAgICBUaGlzIHNwZWVkdXAgbWF5IGJyZWFrIGV4aXN0aW5nIHByb2dyYW1zIHRoYXQgdXNlIHBhcnNlIGFjdGlvbnMgdGhhdA0KICAgICAgICAgICBoYXZlIHNpZGUtZWZmZWN0cy4gIEZvciB0aGlzIHJlYXNvbiwgcGFja3JhdCBwYXJzaW5nIGlzIGRpc2FibGVkIHdoZW4NCiAgICAgICAgICAgeW91IGZpcnN0IGltcG9ydCBweXBhcnNpbmcuICBUbyBhY3RpdmF0ZSB0aGUgcGFja3JhdCBmZWF0dXJlLCB5b3VyDQogICAgICAgICAgIHByb2dyYW0gbXVzdCBjYWxsIHRoZSBjbGFzcyBtZXRob2QgQ3tQYXJzZXJFbGVtZW50LmVuYWJsZVBhY2tyYXQoKX0uICBJZg0KICAgICAgICAgICB5b3VyIHByb2dyYW0gdXNlcyBDe3BzeWNvfSB0byAiY29tcGlsZSBhcyB5b3UgZ28iLCB5b3UgbXVzdCBjYWxsDQogICAgICAgICAgIEN7ZW5hYmxlUGFja3JhdH0gYmVmb3JlIGNhbGxpbmcgQ3twc3ljby5mdWxsKCl9LiAgSWYgeW91IGRvIG5vdCBkbyB0aGlzLA0KICAgICAgICAgICBQeXRob24gd2lsbCBjcmFzaC4gIEZvciBiZXN0IHJlc3VsdHMsIGNhbGwgQ3tlbmFibGVQYWNrcmF0KCl9IGltbWVkaWF0ZWx5DQogICAgICAgICAgIGFmdGVyIGltcG9ydGluZyBweXBhcnNpbmcuDQogICAgICAgICAgIA0KICAgICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgICAgIGltcG9ydCBweXBhcnNpbmcNCiAgICAgICAgICAgICAgIHB5cGFyc2luZy5QYXJzZXJFbGVtZW50LmVuYWJsZVBhY2tyYXQoKQ0KICAgICAgICAiIiINCiAgICAgICAgaWYgbm90IFBhcnNlckVsZW1lbnQuX3BhY2tyYXRFbmFibGVkOg0KICAgICAgICAgICAgUGFyc2VyRWxlbWVudC5fcGFja3JhdEVuYWJsZWQgPSBUcnVlDQogICAgICAgICAgICBpZiBjYWNoZV9zaXplX2xpbWl0IGlzIE5vbmU6DQogICAgICAgICAgICAgICAgUGFyc2VyRWxlbWVudC5wYWNrcmF0X2NhY2hlID0gUGFyc2VyRWxlbWVudC5fVW5ib3VuZGVkQ2FjaGUoKQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICBQYXJzZXJFbGVtZW50LnBhY2tyYXRfY2FjaGUgPSBQYXJzZXJFbGVtZW50Ll9GaWZvQ2FjaGUoY2FjaGVfc2l6ZV9saW1pdCkNCiAgICAgICAgICAgIFBhcnNlckVsZW1lbnQuX3BhcnNlID0gUGFyc2VyRWxlbWVudC5fcGFyc2VDYWNoZQ0KDQogICAgZGVmIHBhcnNlU3RyaW5nKCBzZWxmLCBpbnN0cmluZywgcGFyc2VBbGw9RmFsc2UgKToNCiAgICAgICAgIiIiDQogICAgICAgIEV4ZWN1dGUgdGhlIHBhcnNlIGV4cHJlc3Npb24gd2l0aCB0aGUgZ2l2ZW4gc3RyaW5nLg0KICAgICAgICBUaGlzIGlzIHRoZSBtYWluIGludGVyZmFjZSB0byB0aGUgY2xpZW50IGNvZGUsIG9uY2UgdGhlIGNvbXBsZXRlDQogICAgICAgIGV4cHJlc3Npb24gaGFzIGJlZW4gYnVpbHQuDQoNCiAgICAgICAgSWYgeW91IHdhbnQgdGhlIGdyYW1tYXIgdG8gcmVxdWlyZSB0aGF0IHRoZSBlbnRpcmUgaW5wdXQgc3RyaW5nIGJlDQogICAgICAgIHN1Y2Nlc3NmdWxseSBwYXJzZWQsIHRoZW4gc2V0IEN7cGFyc2VBbGx9IHRvIFRydWUgKGVxdWl2YWxlbnQgdG8gZW5kaW5nDQogICAgICAgIHRoZSBncmFtbWFyIHdpdGggQ3tMe1N0cmluZ0VuZCgpfX0pLg0KDQogICAgICAgIE5vdGU6IEN7cGFyc2VTdHJpbmd9IGltcGxpY2l0bHkgY2FsbHMgQ3tleHBhbmR0YWJzKCl9IG9uIHRoZSBpbnB1dCBzdHJpbmcsDQogICAgICAgIGluIG9yZGVyIHRvIHJlcG9ydCBwcm9wZXIgY29sdW1uIG51bWJlcnMgaW4gcGFyc2UgYWN0aW9ucy4NCiAgICAgICAgSWYgdGhlIGlucHV0IHN0cmluZyBjb250YWlucyB0YWJzIGFuZA0KICAgICAgICB0aGUgZ3JhbW1hciB1c2VzIHBhcnNlIGFjdGlvbnMgdGhhdCB1c2UgdGhlIEN7bG9jfSBhcmd1bWVudCB0byBpbmRleCBpbnRvIHRoZQ0KICAgICAgICBzdHJpbmcgYmVpbmcgcGFyc2VkLCB5b3UgY2FuIGVuc3VyZSB5b3UgaGF2ZSBhIGNvbnNpc3RlbnQgdmlldyBvZiB0aGUgaW5wdXQNCiAgICAgICAgc3RyaW5nIGJ5Og0KICAgICAgICAgLSBjYWxsaW5nIEN7cGFyc2VXaXRoVGFic30gb24geW91ciBncmFtbWFyIGJlZm9yZSBjYWxsaW5nIEN7cGFyc2VTdHJpbmd9DQogICAgICAgICAgIChzZWUgTHtJe3BhcnNlV2l0aFRhYnN9PHBhcnNlV2l0aFRhYnM+fSkNCiAgICAgICAgIC0gZGVmaW5lIHlvdXIgcGFyc2UgYWN0aW9uIHVzaW5nIHRoZSBmdWxsIEN7KHMsbG9jLHRva3MpfSBzaWduYXR1cmUsIGFuZA0KICAgICAgICAgICByZWZlcmVuY2UgdGhlIGlucHV0IHN0cmluZyB1c2luZyB0aGUgcGFyc2UgYWN0aW9uJ3MgQ3tzfSBhcmd1bWVudA0KICAgICAgICAgLSBleHBsaWN0bHkgZXhwYW5kIHRoZSB0YWJzIGluIHlvdXIgaW5wdXQgc3RyaW5nIGJlZm9yZSBjYWxsaW5nDQogICAgICAgICAgIEN7cGFyc2VTdHJpbmd9DQogICAgICAgIA0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIFdvcmQoJ2EnKS5wYXJzZVN0cmluZygnYWFhYWFiYWFhJykgICMgLT4gWydhYWFhYSddDQogICAgICAgICAgICBXb3JkKCdhJykucGFyc2VTdHJpbmcoJ2FhYWFhYmFhYScsIHBhcnNlQWxsPVRydWUpICAjIC0+IEV4Y2VwdGlvbjogRXhwZWN0ZWQgZW5kIG9mIHRleHQNCiAgICAgICAgIiIiDQogICAgICAgIFBhcnNlckVsZW1lbnQucmVzZXRDYWNoZSgpDQogICAgICAgIGlmIG5vdCBzZWxmLnN0cmVhbWxpbmVkOg0KICAgICAgICAgICAgc2VsZi5zdHJlYW1saW5lKCkNCiAgICAgICAgICAgICN+IHNlbGYuc2F2ZUFzTGlzdCA9IFRydWUNCiAgICAgICAgZm9yIGUgaW4gc2VsZi5pZ25vcmVFeHByczoNCiAgICAgICAgICAgIGUuc3RyZWFtbGluZSgpDQogICAgICAgIGlmIG5vdCBzZWxmLmtlZXBUYWJzOg0KICAgICAgICAgICAgaW5zdHJpbmcgPSBpbnN0cmluZy5leHBhbmR0YWJzKCkNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgbG9jLCB0b2tlbnMgPSBzZWxmLl9wYXJzZSggaW5zdHJpbmcsIDAgKQ0KICAgICAgICAgICAgaWYgcGFyc2VBbGw6DQogICAgICAgICAgICAgICAgbG9jID0gc2VsZi5wcmVQYXJzZSggaW5zdHJpbmcsIGxvYyApDQogICAgICAgICAgICAgICAgc2UgPSBFbXB0eSgpICsgU3RyaW5nRW5kKCkNCiAgICAgICAgICAgICAgICBzZS5fcGFyc2UoIGluc3RyaW5nLCBsb2MgKQ0KICAgICAgICBleGNlcHQgUGFyc2VCYXNlRXhjZXB0aW9uIGFzIGV4YzoNCiAgICAgICAgICAgIGlmIFBhcnNlckVsZW1lbnQudmVyYm9zZV9zdGFja3RyYWNlOg0KICAgICAgICAgICAgICAgIHJhaXNlDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICMgY2F0Y2ggYW5kIHJlLXJhaXNlIGV4Y2VwdGlvbiBmcm9tIGhlcmUsIGNsZWFycyBvdXQgcHlwYXJzaW5nIGludGVybmFsIHN0YWNrIHRyYWNlDQogICAgICAgICAgICAgICAgcmFpc2UgZXhjDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByZXR1cm4gdG9rZW5zDQoNCiAgICBkZWYgc2NhblN0cmluZyggc2VsZiwgaW5zdHJpbmcsIG1heE1hdGNoZXM9X01BWF9JTlQsIG92ZXJsYXA9RmFsc2UgKToNCiAgICAgICAgIiIiDQogICAgICAgIFNjYW4gdGhlIGlucHV0IHN0cmluZyBmb3IgZXhwcmVzc2lvbiBtYXRjaGVzLiAgRWFjaCBtYXRjaCB3aWxsIHJldHVybiB0aGUNCiAgICAgICAgbWF0Y2hpbmcgdG9rZW5zLCBzdGFydCBsb2NhdGlvbiwgYW5kIGVuZCBsb2NhdGlvbi4gIE1heSBiZSBjYWxsZWQgd2l0aCBvcHRpb25hbA0KICAgICAgICBDe21heE1hdGNoZXN9IGFyZ3VtZW50LCB0byBjbGlwIHNjYW5uaW5nIGFmdGVyICduJyBtYXRjaGVzIGFyZSBmb3VuZC4gIElmDQogICAgICAgIEN7b3ZlcmxhcH0gaXMgc3BlY2lmaWVkLCB0aGVuIG92ZXJsYXBwaW5nIG1hdGNoZXMgd2lsbCBiZSByZXBvcnRlZC4NCg0KICAgICAgICBOb3RlIHRoYXQgdGhlIHN0YXJ0IGFuZCBlbmQgbG9jYXRpb25zIGFyZSByZXBvcnRlZCByZWxhdGl2ZSB0byB0aGUgc3RyaW5nDQogICAgICAgIGJlaW5nIHBhcnNlZC4gIFNlZSBMe0l7cGFyc2VTdHJpbmd9PHBhcnNlU3RyaW5nPn0gZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gcGFyc2luZw0KICAgICAgICBzdHJpbmdzIHdpdGggZW1iZWRkZWQgdGFicy4NCg0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIHNvdXJjZSA9ICJzbGRqZjEyM2xzZGpqa2YzNDVzbGRramY4Nzlsa2pzZmQ5ODciDQogICAgICAgICAgICBwcmludChzb3VyY2UpDQogICAgICAgICAgICBmb3IgdG9rZW5zLHN0YXJ0LGVuZCBpbiBXb3JkKGFscGhhcykuc2NhblN0cmluZyhzb3VyY2UpOg0KICAgICAgICAgICAgICAgIHByaW50KCcgJypzdGFydCArICdeJyooZW5kLXN0YXJ0KSkNCiAgICAgICAgICAgICAgICBwcmludCgnICcqc3RhcnQgKyB0b2tlbnNbMF0pDQogICAgICAgIA0KICAgICAgICBwcmludHM6Og0KICAgICAgICANCiAgICAgICAgICAgIHNsZGpmMTIzbHNkamprZjM0NXNsZGtqZjg3OWxranNmZDk4Nw0KICAgICAgICAgICAgXl5eXl4NCiAgICAgICAgICAgIHNsZGpmDQogICAgICAgICAgICAgICAgICAgIF5eXl5eXl4NCiAgICAgICAgICAgICAgICAgICAgbHNkamprZg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGRramYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGtqc2ZkDQogICAgICAgICIiIg0KICAgICAgICBpZiBub3Qgc2VsZi5zdHJlYW1saW5lZDoNCiAgICAgICAgICAgIHNlbGYuc3RyZWFtbGluZSgpDQogICAgICAgIGZvciBlIGluIHNlbGYuaWdub3JlRXhwcnM6DQogICAgICAgICAgICBlLnN0cmVhbWxpbmUoKQ0KDQogICAgICAgIGlmIG5vdCBzZWxmLmtlZXBUYWJzOg0KICAgICAgICAgICAgaW5zdHJpbmcgPSBfdXN0cihpbnN0cmluZykuZXhwYW5kdGFicygpDQogICAgICAgIGluc3RybGVuID0gbGVuKGluc3RyaW5nKQ0KICAgICAgICBsb2MgPSAwDQogICAgICAgIHByZXBhcnNlRm4gPSBzZWxmLnByZVBhcnNlDQogICAgICAgIHBhcnNlRm4gPSBzZWxmLl9wYXJzZQ0KICAgICAgICBQYXJzZXJFbGVtZW50LnJlc2V0Q2FjaGUoKQ0KICAgICAgICBtYXRjaGVzID0gMA0KICAgICAgICB0cnk6DQogICAgICAgICAgICB3aGlsZSBsb2MgPD0gaW5zdHJsZW4gYW5kIG1hdGNoZXMgPCBtYXhNYXRjaGVzOg0KICAgICAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICAgICAgcHJlbG9jID0gcHJlcGFyc2VGbiggaW5zdHJpbmcsIGxvYyApDQogICAgICAgICAgICAgICAgICAgIG5leHRMb2MsdG9rZW5zID0gcGFyc2VGbiggaW5zdHJpbmcsIHByZWxvYywgY2FsbFByZVBhcnNlPUZhbHNlICkNCiAgICAgICAgICAgICAgICBleGNlcHQgUGFyc2VFeGNlcHRpb246DQogICAgICAgICAgICAgICAgICAgIGxvYyA9IHByZWxvYysxDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgaWYgbmV4dExvYyA+IGxvYzoNCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXMgKz0gMQ0KICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgdG9rZW5zLCBwcmVsb2MsIG5leHRMb2MNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIG92ZXJsYXA6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dGxvYyA9IHByZXBhcnNlRm4oIGluc3RyaW5nLCBsb2MgKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5leHRsb2MgPiBsb2M6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYyA9IG5leHRMb2MNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2MgKz0gMQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2MgPSBuZXh0TG9jDQogICAgICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgICAgICBsb2MgPSBwcmVsb2MrMQ0KICAgICAgICBleGNlcHQgUGFyc2VCYXNlRXhjZXB0aW9uIGFzIGV4YzoNCiAgICAgICAgICAgIGlmIFBhcnNlckVsZW1lbnQudmVyYm9zZV9zdGFja3RyYWNlOg0KICAgICAgICAgICAgICAgIHJhaXNlDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICMgY2F0Y2ggYW5kIHJlLXJhaXNlIGV4Y2VwdGlvbiBmcm9tIGhlcmUsIGNsZWFycyBvdXQgcHlwYXJzaW5nIGludGVybmFsIHN0YWNrIHRyYWNlDQogICAgICAgICAgICAgICAgcmFpc2UgZXhjDQoNCiAgICBkZWYgdHJhbnNmb3JtU3RyaW5nKCBzZWxmLCBpbnN0cmluZyApOg0KICAgICAgICAiIiINCiAgICAgICAgRXh0ZW5zaW9uIHRvIEN7THtzY2FuU3RyaW5nfX0sIHRvIG1vZGlmeSBtYXRjaGluZyB0ZXh0IHdpdGggbW9kaWZpZWQgdG9rZW5zIHRoYXQgbWF5DQogICAgICAgIGJlIHJldHVybmVkIGZyb20gYSBwYXJzZSBhY3Rpb24uICBUbyB1c2UgQ3t0cmFuc2Zvcm1TdHJpbmd9LCBkZWZpbmUgYSBncmFtbWFyIGFuZA0KICAgICAgICBhdHRhY2ggYSBwYXJzZSBhY3Rpb24gdG8gaXQgdGhhdCBtb2RpZmllcyB0aGUgcmV0dXJuZWQgdG9rZW4gbGlzdC4NCiAgICAgICAgSW52b2tpbmcgQ3t0cmFuc2Zvcm1TdHJpbmcoKX0gb24gYSB0YXJnZXQgc3RyaW5nIHdpbGwgdGhlbiBzY2FuIGZvciBtYXRjaGVzLA0KICAgICAgICBhbmQgcmVwbGFjZSB0aGUgbWF0Y2hlZCB0ZXh0IHBhdHRlcm5zIGFjY29yZGluZyB0byB0aGUgbG9naWMgaW4gdGhlIHBhcnNlDQogICAgICAgIGFjdGlvbi4gIEN7dHJhbnNmb3JtU3RyaW5nKCl9IHJldHVybnMgdGhlIHJlc3VsdGluZyB0cmFuc2Zvcm1lZCBzdHJpbmcuDQogICAgICAgIA0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIHdkID0gV29yZChhbHBoYXMpDQogICAgICAgICAgICB3ZC5zZXRQYXJzZUFjdGlvbihsYW1iZGEgdG9rczogdG9rc1swXS50aXRsZSgpKQ0KICAgICAgICAgICAgDQogICAgICAgICAgICBwcmludCh3ZC50cmFuc2Zvcm1TdHJpbmcoIm5vdyBpcyB0aGUgd2ludGVyIG9mIG91ciBkaXNjb250ZW50IG1hZGUgZ2xvcmlvdXMgc3VtbWVyIGJ5IHRoaXMgc3VuIG9mIHlvcmsuIikpDQogICAgICAgIFByaW50czo6DQogICAgICAgICAgICBOb3cgSXMgVGhlIFdpbnRlciBPZiBPdXIgRGlzY29udGVudCBNYWRlIEdsb3Jpb3VzIFN1bW1lciBCeSBUaGlzIFN1biBPZiBZb3JrLg0KICAgICAgICAiIiINCiAgICAgICAgb3V0ID0gW10NCiAgICAgICAgbGFzdEUgPSAwDQogICAgICAgICMgZm9yY2UgcHJlc2VydmF0aW9uIG9mIDxUQUI+cywgdG8gbWluaW1pemUgdW53YW50ZWQgdHJhbnNmb3JtYXRpb24gb2Ygc3RyaW5nLCBhbmQgdG8NCiAgICAgICAgIyBrZWVwIHN0cmluZyBsb2NzIHN0cmFpZ2h0IGJldHdlZW4gdHJhbnNmb3JtU3RyaW5nIGFuZCBzY2FuU3RyaW5nDQogICAgICAgIHNlbGYua2VlcFRhYnMgPSBUcnVlDQogICAgICAgIHRyeToNCiAgICAgICAgICAgIGZvciB0LHMsZSBpbiBzZWxmLnNjYW5TdHJpbmcoIGluc3RyaW5nICk6DQogICAgICAgICAgICAgICAgb3V0LmFwcGVuZCggaW5zdHJpbmdbbGFzdEU6c10gKQ0KICAgICAgICAgICAgICAgIGlmIHQ6DQogICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodCxQYXJzZVJlc3VsdHMpOg0KICAgICAgICAgICAgICAgICAgICAgICAgb3V0ICs9IHQuYXNMaXN0KCkNCiAgICAgICAgICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKHQsbGlzdCk6DQogICAgICAgICAgICAgICAgICAgICAgICBvdXQgKz0gdA0KICAgICAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZCh0KQ0KICAgICAgICAgICAgICAgIGxhc3RFID0gZQ0KICAgICAgICAgICAgb3V0LmFwcGVuZChpbnN0cmluZ1tsYXN0RTpdKQ0KICAgICAgICAgICAgb3V0ID0gW28gZm9yIG8gaW4gb3V0IGlmIG9dDQogICAgICAgICAgICByZXR1cm4gIiIuam9pbihtYXAoX3VzdHIsX2ZsYXR0ZW4ob3V0KSkpDQogICAgICAgIGV4Y2VwdCBQYXJzZUJhc2VFeGNlcHRpb24gYXMgZXhjOg0KICAgICAgICAgICAgaWYgUGFyc2VyRWxlbWVudC52ZXJib3NlX3N0YWNrdHJhY2U6DQogICAgICAgICAgICAgICAgcmFpc2UNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgIyBjYXRjaCBhbmQgcmUtcmFpc2UgZXhjZXB0aW9uIGZyb20gaGVyZSwgY2xlYXJzIG91dCBweXBhcnNpbmcgaW50ZXJuYWwgc3RhY2sgdHJhY2UNCiAgICAgICAgICAgICAgICByYWlzZSBleGMNCg0KICAgIGRlZiBzZWFyY2hTdHJpbmcoIHNlbGYsIGluc3RyaW5nLCBtYXhNYXRjaGVzPV9NQVhfSU5UICk6DQogICAgICAgICIiIg0KICAgICAgICBBbm90aGVyIGV4dGVuc2lvbiB0byBDe0x7c2NhblN0cmluZ319LCBzaW1wbGlmeWluZyB0aGUgYWNjZXNzIHRvIHRoZSB0b2tlbnMgZm91bmQNCiAgICAgICAgdG8gbWF0Y2ggdGhlIGdpdmVuIHBhcnNlIGV4cHJlc3Npb24uICBNYXkgYmUgY2FsbGVkIHdpdGggb3B0aW9uYWwNCiAgICAgICAgQ3ttYXhNYXRjaGVzfSBhcmd1bWVudCwgdG8gY2xpcCBzZWFyY2hpbmcgYWZ0ZXIgJ24nIG1hdGNoZXMgYXJlIGZvdW5kLg0KICAgICAgICANCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICAjIGEgY2FwaXRhbGl6ZWQgd29yZCBzdGFydHMgd2l0aCBhbiB1cHBlcmNhc2UgbGV0dGVyLCBmb2xsb3dlZCBieSB6ZXJvIG9yIG1vcmUgbG93ZXJjYXNlIGxldHRlcnMNCiAgICAgICAgICAgIGNhcF93b3JkID0gV29yZChhbHBoYXMudXBwZXIoKSwgYWxwaGFzLmxvd2VyKCkpDQogICAgICAgICAgICANCiAgICAgICAgICAgIHByaW50KGNhcF93b3JkLnNlYXJjaFN0cmluZygiTW9yZSB0aGFuIElyb24sIG1vcmUgdGhhbiBMZWFkLCBtb3JlIHRoYW4gR29sZCBJIG5lZWQgRWxlY3RyaWNpdHkiKSkNCg0KICAgICAgICAgICAgIyB0aGUgc3VtKCkgYnVpbHRpbiBjYW4gYmUgdXNlZCB0byBtZXJnZSByZXN1bHRzIGludG8gYSBzaW5nbGUgUGFyc2VSZXN1bHRzIG9iamVjdA0KICAgICAgICAgICAgcHJpbnQoc3VtKGNhcF93b3JkLnNlYXJjaFN0cmluZygiTW9yZSB0aGFuIElyb24sIG1vcmUgdGhhbiBMZWFkLCBtb3JlIHRoYW4gR29sZCBJIG5lZWQgRWxlY3RyaWNpdHkiKSkpDQogICAgICAgIHByaW50czo6DQogICAgICAgICAgICBbWydNb3JlJ10sIFsnSXJvbiddLCBbJ0xlYWQnXSwgWydHb2xkJ10sIFsnSSddLCBbJ0VsZWN0cmljaXR5J11dDQogICAgICAgICAgICBbJ01vcmUnLCAnSXJvbicsICdMZWFkJywgJ0dvbGQnLCAnSScsICdFbGVjdHJpY2l0eSddDQogICAgICAgICIiIg0KICAgICAgICB0cnk6DQogICAgICAgICAgICByZXR1cm4gUGFyc2VSZXN1bHRzKFsgdCBmb3IgdCxzLGUgaW4gc2VsZi5zY2FuU3RyaW5nKCBpbnN0cmluZywgbWF4TWF0Y2hlcyApIF0pDQogICAgICAgIGV4Y2VwdCBQYXJzZUJhc2VFeGNlcHRpb24gYXMgZXhjOg0KICAgICAgICAgICAgaWYgUGFyc2VyRWxlbWVudC52ZXJib3NlX3N0YWNrdHJhY2U6DQogICAgICAgICAgICAgICAgcmFpc2UNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgIyBjYXRjaCBhbmQgcmUtcmFpc2UgZXhjZXB0aW9uIGZyb20gaGVyZSwgY2xlYXJzIG91dCBweXBhcnNpbmcgaW50ZXJuYWwgc3RhY2sgdHJhY2UNCiAgICAgICAgICAgICAgICByYWlzZSBleGMNCg0KICAgIGRlZiBzcGxpdChzZWxmLCBpbnN0cmluZywgbWF4c3BsaXQ9X01BWF9JTlQsIGluY2x1ZGVTZXBhcmF0b3JzPUZhbHNlKToNCiAgICAgICAgIiIiDQogICAgICAgIEdlbmVyYXRvciBtZXRob2QgdG8gc3BsaXQgYSBzdHJpbmcgdXNpbmcgdGhlIGdpdmVuIGV4cHJlc3Npb24gYXMgYSBzZXBhcmF0b3IuDQogICAgICAgIE1heSBiZSBjYWxsZWQgd2l0aCBvcHRpb25hbCBDe21heHNwbGl0fSBhcmd1bWVudCwgdG8gbGltaXQgdGhlIG51bWJlciBvZiBzcGxpdHM7DQogICAgICAgIGFuZCB0aGUgb3B0aW9uYWwgQ3tpbmNsdWRlU2VwYXJhdG9yc30gYXJndW1lbnQgKGRlZmF1bHQ9Q3tGYWxzZX0pLCBpZiB0aGUgc2VwYXJhdGluZw0KICAgICAgICBtYXRjaGluZyB0ZXh0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgc3BsaXQgcmVzdWx0cy4NCiAgICAgICAgDQogICAgICAgIEV4YW1wbGU6OiAgICAgICAgDQogICAgICAgICAgICBwdW5jID0gb25lT2YobGlzdCgiLiw7Oi8tIT8iKSkNCiAgICAgICAgICAgIHByaW50KGxpc3QocHVuYy5zcGxpdCgiVGhpcywgdGhpcz8sIHRoaXMgc2VudGVuY2UsIGlzIGJhZGx5IHB1bmN0dWF0ZWQhIikpKQ0KICAgICAgICBwcmludHM6Og0KICAgICAgICAgICAgWydUaGlzJywgJyB0aGlzJywgJycsICcgdGhpcyBzZW50ZW5jZScsICcgaXMgYmFkbHkgcHVuY3R1YXRlZCcsICcnXQ0KICAgICAgICAiIiINCiAgICAgICAgc3BsaXRzID0gMA0KICAgICAgICBsYXN0ID0gMA0KICAgICAgICBmb3IgdCxzLGUgaW4gc2VsZi5zY2FuU3RyaW5nKGluc3RyaW5nLCBtYXhNYXRjaGVzPW1heHNwbGl0KToNCiAgICAgICAgICAgIHlpZWxkIGluc3RyaW5nW2xhc3Q6c10NCiAgICAgICAgICAgIGlmIGluY2x1ZGVTZXBhcmF0b3JzOg0KICAgICAgICAgICAgICAgIHlpZWxkIHRbMF0NCiAgICAgICAgICAgIGxhc3QgPSBlDQogICAgICAgIHlpZWxkIGluc3RyaW5nW2xhc3Q6XQ0KDQogICAgZGVmIF9fYWRkX18oc2VsZiwgb3RoZXIgKToNCiAgICAgICAgIiIiDQogICAgICAgIEltcGxlbWVudGF0aW9uIG9mICsgb3BlcmF0b3IgLSByZXR1cm5zIEN7THtBbmR9fS4gQWRkaW5nIHN0cmluZ3MgdG8gYSBQYXJzZXJFbGVtZW50DQogICAgICAgIGNvbnZlcnRzIHRoZW0gdG8gTHtMaXRlcmFsfXMgYnkgZGVmYXVsdC4NCiAgICAgICAgDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgZ3JlZXQgPSBXb3JkKGFscGhhcykgKyAiLCIgKyBXb3JkKGFscGhhcykgKyAiISINCiAgICAgICAgICAgIGhlbGxvID0gIkhlbGxvLCBXb3JsZCEiDQogICAgICAgICAgICBwcmludCAoaGVsbG8sICItPiIsIGdyZWV0LnBhcnNlU3RyaW5nKGhlbGxvKSkNCiAgICAgICAgUHJpbnRzOjoNCiAgICAgICAgICAgIEhlbGxvLCBXb3JsZCEgLT4gWydIZWxsbycsICcsJywgJ1dvcmxkJywgJyEnXQ0KICAgICAgICAiIiINCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToNCiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBvdGhlciApDQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKCBvdGhlciwgUGFyc2VyRWxlbWVudCApOg0KICAgICAgICAgICAgd2FybmluZ3Mud2FybigiQ2Fubm90IGNvbWJpbmUgZWxlbWVudCBvZiB0eXBlICVzIHdpdGggUGFyc2VyRWxlbWVudCIgJSB0eXBlKG90aGVyKSwNCiAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQ0KICAgICAgICAgICAgcmV0dXJuIE5vbmUNCiAgICAgICAgcmV0dXJuIEFuZCggWyBzZWxmLCBvdGhlciBdICkNCg0KICAgIGRlZiBfX3JhZGRfXyhzZWxmLCBvdGhlciApOg0KICAgICAgICAiIiINCiAgICAgICAgSW1wbGVtZW50YXRpb24gb2YgKyBvcGVyYXRvciB3aGVuIGxlZnQgb3BlcmFuZCBpcyBub3QgYSBDe0x7UGFyc2VyRWxlbWVudH19DQogICAgICAgICIiIg0KICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOg0KICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIG90aGVyICkNCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoIG90aGVyLCBQYXJzZXJFbGVtZW50ICk6DQogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJDYW5ub3QgY29tYmluZSBlbGVtZW50IG9mIHR5cGUgJXMgd2l0aCBQYXJzZXJFbGVtZW50IiAlIHR5cGUob3RoZXIpLA0KICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpDQogICAgICAgICAgICByZXR1cm4gTm9uZQ0KICAgICAgICByZXR1cm4gb3RoZXIgKyBzZWxmDQoNCiAgICBkZWYgX19zdWJfXyhzZWxmLCBvdGhlcik6DQogICAgICAgICIiIg0KICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiAtIG9wZXJhdG9yLCByZXR1cm5zIEN7THtBbmR9fSB3aXRoIGVycm9yIHN0b3ANCiAgICAgICAgIiIiDQogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6DQogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQ0KICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSggb3RoZXIsIFBhcnNlckVsZW1lbnQgKToNCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkNhbm5vdCBjb21iaW5lIGVsZW1lbnQgb2YgdHlwZSAlcyB3aXRoIFBhcnNlckVsZW1lbnQiICUgdHlwZShvdGhlciksDQogICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikNCiAgICAgICAgICAgIHJldHVybiBOb25lDQogICAgICAgIHJldHVybiBzZWxmICsgQW5kLl9FcnJvclN0b3AoKSArIG90aGVyDQoNCiAgICBkZWYgX19yc3ViX18oc2VsZiwgb3RoZXIgKToNCiAgICAgICAgIiIiDQogICAgICAgIEltcGxlbWVudGF0aW9uIG9mIC0gb3BlcmF0b3Igd2hlbiBsZWZ0IG9wZXJhbmQgaXMgbm90IGEgQ3tMe1BhcnNlckVsZW1lbnR9fQ0KICAgICAgICAiIiINCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToNCiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBvdGhlciApDQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKCBvdGhlciwgUGFyc2VyRWxlbWVudCApOg0KICAgICAgICAgICAgd2FybmluZ3Mud2FybigiQ2Fubm90IGNvbWJpbmUgZWxlbWVudCBvZiB0eXBlICVzIHdpdGggUGFyc2VyRWxlbWVudCIgJSB0eXBlKG90aGVyKSwNCiAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQ0KICAgICAgICAgICAgcmV0dXJuIE5vbmUNCiAgICAgICAgcmV0dXJuIG90aGVyIC0gc2VsZg0KDQogICAgZGVmIF9fbXVsX18oc2VsZixvdGhlcik6DQogICAgICAgICIiIg0KICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiAqIG9wZXJhdG9yLCBhbGxvd3MgdXNlIG9mIEN7ZXhwciAqIDN9IGluIHBsYWNlIG9mDQogICAgICAgIEN7ZXhwciArIGV4cHIgKyBleHByfS4gIEV4cHJlc3Npb25zIG1heSBhbHNvIG1lIG11bHRpcGxpZWQgYnkgYSAyLWludGVnZXINCiAgICAgICAgdHVwbGUsIHNpbWlsYXIgdG8gQ3t7bWluLG1heH19IG11bHRpcGxpZXJzIGluIHJlZ3VsYXIgZXhwcmVzc2lvbnMuICBUdXBsZXMNCiAgICAgICAgbWF5IGFsc28gaW5jbHVkZSBDe05vbmV9IGFzIGluOg0KICAgICAgICAgLSBDe2V4cHIqKG4sTm9uZSl9IG9yIEN7ZXhwcioobiwpfSBpcyBlcXVpdmFsZW50DQogICAgICAgICAgICAgIHRvIEN7ZXhwcipuICsgTHtaZXJvT3JNb3JlfShleHByKX0NCiAgICAgICAgICAgICAgKHJlYWQgYXMgImF0IGxlYXN0IG4gaW5zdGFuY2VzIG9mIEN7ZXhwcn0iKQ0KICAgICAgICAgLSBDe2V4cHIqKE5vbmUsbil9IGlzIGVxdWl2YWxlbnQgdG8gQ3tleHByKigwLG4pfQ0KICAgICAgICAgICAgICAocmVhZCBhcyAiMCB0byBuIGluc3RhbmNlcyBvZiBDe2V4cHJ9IikNCiAgICAgICAgIC0gQ3tleHByKihOb25lLE5vbmUpfSBpcyBlcXVpdmFsZW50IHRvIEN7THtaZXJvT3JNb3JlfShleHByKX0NCiAgICAgICAgIC0gQ3tleHByKigxLE5vbmUpfSBpcyBlcXVpdmFsZW50IHRvIEN7THtPbmVPck1vcmV9KGV4cHIpfQ0KDQogICAgICAgIE5vdGUgdGhhdCBDe2V4cHIqKE5vbmUsbil9IGRvZXMgbm90IHJhaXNlIGFuIGV4Y2VwdGlvbiBpZg0KICAgICAgICBtb3JlIHRoYW4gbiBleHBycyBleGlzdCBpbiB0aGUgaW5wdXQgc3RyZWFtOyB0aGF0IGlzLA0KICAgICAgICBDe2V4cHIqKE5vbmUsbil9IGRvZXMgbm90IGVuZm9yY2UgYSBtYXhpbXVtIG51bWJlciBvZiBleHByDQogICAgICAgIG9jY3VycmVuY2VzLiAgSWYgdGhpcyBiZWhhdmlvciBpcyBkZXNpcmVkLCB0aGVuIHdyaXRlDQogICAgICAgIEN7ZXhwciooTm9uZSxuKSArIH5leHByfQ0KICAgICAgICAiIiINCiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlcixpbnQpOg0KICAgICAgICAgICAgbWluRWxlbWVudHMsIG9wdEVsZW1lbnRzID0gb3RoZXIsMA0KICAgICAgICBlbGlmIGlzaW5zdGFuY2Uob3RoZXIsdHVwbGUpOg0KICAgICAgICAgICAgb3RoZXIgPSAob3RoZXIgKyAoTm9uZSwgTm9uZSkpWzoyXQ0KICAgICAgICAgICAgaWYgb3RoZXJbMF0gaXMgTm9uZToNCiAgICAgICAgICAgICAgICBvdGhlciA9ICgwLCBvdGhlclsxXSkNCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXJbMF0saW50KSBhbmQgb3RoZXJbMV0gaXMgTm9uZToNCiAgICAgICAgICAgICAgICBpZiBvdGhlclswXSA9PSAwOg0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gWmVyb09yTW9yZShzZWxmKQ0KICAgICAgICAgICAgICAgIGlmIG90aGVyWzBdID09IDE6DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBPbmVPck1vcmUoc2VsZikNCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZipvdGhlclswXSArIFplcm9Pck1vcmUoc2VsZikNCiAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShvdGhlclswXSxpbnQpIGFuZCBpc2luc3RhbmNlKG90aGVyWzFdLGludCk6DQogICAgICAgICAgICAgICAgbWluRWxlbWVudHMsIG9wdEVsZW1lbnRzID0gb3RoZXINCiAgICAgICAgICAgICAgICBvcHRFbGVtZW50cyAtPSBtaW5FbGVtZW50cw0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoImNhbm5vdCBtdWx0aXBseSAnUGFyc2VyRWxlbWVudCcgYW5kICgnJXMnLCclcycpIG9iamVjdHMiLCB0eXBlKG90aGVyWzBdKSx0eXBlKG90aGVyWzFdKSkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiY2Fubm90IG11bHRpcGx5ICdQYXJzZXJFbGVtZW50JyBhbmQgJyVzJyBvYmplY3RzIiwgdHlwZShvdGhlcikpDQoNCiAgICAgICAgaWYgbWluRWxlbWVudHMgPCAwOg0KICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiY2Fubm90IG11bHRpcGx5IFBhcnNlckVsZW1lbnQgYnkgbmVnYXRpdmUgdmFsdWUiKQ0KICAgICAgICBpZiBvcHRFbGVtZW50cyA8IDA6DQogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJzZWNvbmQgdHVwbGUgdmFsdWUgbXVzdCBiZSBncmVhdGVyIG9yIGVxdWFsIHRvIGZpcnN0IHR1cGxlIHZhbHVlIikNCiAgICAgICAgaWYgbWluRWxlbWVudHMgPT0gb3B0RWxlbWVudHMgPT0gMDoNCiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImNhbm5vdCBtdWx0aXBseSBQYXJzZXJFbGVtZW50IGJ5IDAgb3IgKDAsMCkiKQ0KDQogICAgICAgIGlmIChvcHRFbGVtZW50cyk6DQogICAgICAgICAgICBkZWYgbWFrZU9wdGlvbmFsTGlzdChuKToNCiAgICAgICAgICAgICAgICBpZiBuPjE6DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBPcHRpb25hbChzZWxmICsgbWFrZU9wdGlvbmFsTGlzdChuLTEpKQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBPcHRpb25hbChzZWxmKQ0KICAgICAgICAgICAgaWYgbWluRWxlbWVudHM6DQogICAgICAgICAgICAgICAgaWYgbWluRWxlbWVudHMgPT0gMToNCiAgICAgICAgICAgICAgICAgICAgcmV0ID0gc2VsZiArIG1ha2VPcHRpb25hbExpc3Qob3B0RWxlbWVudHMpDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgcmV0ID0gQW5kKFtzZWxmXSptaW5FbGVtZW50cykgKyBtYWtlT3B0aW9uYWxMaXN0KG9wdEVsZW1lbnRzKQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICByZXQgPSBtYWtlT3B0aW9uYWxMaXN0KG9wdEVsZW1lbnRzKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgaWYgbWluRWxlbWVudHMgPT0gMToNCiAgICAgICAgICAgICAgICByZXQgPSBzZWxmDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHJldCA9IEFuZChbc2VsZl0qbWluRWxlbWVudHMpDQogICAgICAgIHJldHVybiByZXQNCg0KICAgIGRlZiBfX3JtdWxfXyhzZWxmLCBvdGhlcik6DQogICAgICAgIHJldHVybiBzZWxmLl9fbXVsX18ob3RoZXIpDQoNCiAgICBkZWYgX19vcl9fKHNlbGYsIG90aGVyICk6DQogICAgICAgICIiIg0KICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiB8IG9wZXJhdG9yIC0gcmV0dXJucyBDe0x7TWF0Y2hGaXJzdH19DQogICAgICAgICIiIg0KICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOg0KICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIG90aGVyICkNCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoIG90aGVyLCBQYXJzZXJFbGVtZW50ICk6DQogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJDYW5ub3QgY29tYmluZSBlbGVtZW50IG9mIHR5cGUgJXMgd2l0aCBQYXJzZXJFbGVtZW50IiAlIHR5cGUob3RoZXIpLA0KICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpDQogICAgICAgICAgICByZXR1cm4gTm9uZQ0KICAgICAgICByZXR1cm4gTWF0Y2hGaXJzdCggWyBzZWxmLCBvdGhlciBdICkNCg0KICAgIGRlZiBfX3Jvcl9fKHNlbGYsIG90aGVyICk6DQogICAgICAgICIiIg0KICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiB8IG9wZXJhdG9yIHdoZW4gbGVmdCBvcGVyYW5kIGlzIG5vdCBhIEN7THtQYXJzZXJFbGVtZW50fX0NCiAgICAgICAgIiIiDQogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6DQogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQ0KICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSggb3RoZXIsIFBhcnNlckVsZW1lbnQgKToNCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkNhbm5vdCBjb21iaW5lIGVsZW1lbnQgb2YgdHlwZSAlcyB3aXRoIFBhcnNlckVsZW1lbnQiICUgdHlwZShvdGhlciksDQogICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikNCiAgICAgICAgICAgIHJldHVybiBOb25lDQogICAgICAgIHJldHVybiBvdGhlciB8IHNlbGYNCg0KICAgIGRlZiBfX3hvcl9fKHNlbGYsIG90aGVyICk6DQogICAgICAgICIiIg0KICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiBeIG9wZXJhdG9yIC0gcmV0dXJucyBDe0x7T3J9fQ0KICAgICAgICAiIiINCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToNCiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBvdGhlciApDQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKCBvdGhlciwgUGFyc2VyRWxlbWVudCApOg0KICAgICAgICAgICAgd2FybmluZ3Mud2FybigiQ2Fubm90IGNvbWJpbmUgZWxlbWVudCBvZiB0eXBlICVzIHdpdGggUGFyc2VyRWxlbWVudCIgJSB0eXBlKG90aGVyKSwNCiAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQ0KICAgICAgICAgICAgcmV0dXJuIE5vbmUNCiAgICAgICAgcmV0dXJuIE9yKCBbIHNlbGYsIG90aGVyIF0gKQ0KDQogICAgZGVmIF9fcnhvcl9fKHNlbGYsIG90aGVyICk6DQogICAgICAgICIiIg0KICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiBeIG9wZXJhdG9yIHdoZW4gbGVmdCBvcGVyYW5kIGlzIG5vdCBhIEN7THtQYXJzZXJFbGVtZW50fX0NCiAgICAgICAgIiIiDQogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6DQogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQ0KICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSggb3RoZXIsIFBhcnNlckVsZW1lbnQgKToNCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkNhbm5vdCBjb21iaW5lIGVsZW1lbnQgb2YgdHlwZSAlcyB3aXRoIFBhcnNlckVsZW1lbnQiICUgdHlwZShvdGhlciksDQogICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikNCiAgICAgICAgICAgIHJldHVybiBOb25lDQogICAgICAgIHJldHVybiBvdGhlciBeIHNlbGYNCg0KICAgIGRlZiBfX2FuZF9fKHNlbGYsIG90aGVyICk6DQogICAgICAgICIiIg0KICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiAmIG9wZXJhdG9yIC0gcmV0dXJucyBDe0x7RWFjaH19DQogICAgICAgICIiIg0KICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOg0KICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIG90aGVyICkNCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoIG90aGVyLCBQYXJzZXJFbGVtZW50ICk6DQogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJDYW5ub3QgY29tYmluZSBlbGVtZW50IG9mIHR5cGUgJXMgd2l0aCBQYXJzZXJFbGVtZW50IiAlIHR5cGUob3RoZXIpLA0KICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpDQogICAgICAgICAgICByZXR1cm4gTm9uZQ0KICAgICAgICByZXR1cm4gRWFjaCggWyBzZWxmLCBvdGhlciBdICkNCg0KICAgIGRlZiBfX3JhbmRfXyhzZWxmLCBvdGhlciApOg0KICAgICAgICAiIiINCiAgICAgICAgSW1wbGVtZW50YXRpb24gb2YgJiBvcGVyYXRvciB3aGVuIGxlZnQgb3BlcmFuZCBpcyBub3QgYSBDe0x7UGFyc2VyRWxlbWVudH19DQogICAgICAgICIiIg0KICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOg0KICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIG90aGVyICkNCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoIG90aGVyLCBQYXJzZXJFbGVtZW50ICk6DQogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJDYW5ub3QgY29tYmluZSBlbGVtZW50IG9mIHR5cGUgJXMgd2l0aCBQYXJzZXJFbGVtZW50IiAlIHR5cGUob3RoZXIpLA0KICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpDQogICAgICAgICAgICByZXR1cm4gTm9uZQ0KICAgICAgICByZXR1cm4gb3RoZXIgJiBzZWxmDQoNCiAgICBkZWYgX19pbnZlcnRfXyggc2VsZiApOg0KICAgICAgICAiIiINCiAgICAgICAgSW1wbGVtZW50YXRpb24gb2YgfiBvcGVyYXRvciAtIHJldHVybnMgQ3tMe05vdEFueX19DQogICAgICAgICIiIg0KICAgICAgICByZXR1cm4gTm90QW55KCBzZWxmICkNCg0KICAgIGRlZiBfX2NhbGxfXyhzZWxmLCBuYW1lPU5vbmUpOg0KICAgICAgICAiIiINCiAgICAgICAgU2hvcnRjdXQgZm9yIEN7THtzZXRSZXN1bHRzTmFtZX19LCB3aXRoIEN7bGlzdEFsbE1hdGNoZXM9RmFsc2V9Lg0KICAgICAgICANCiAgICAgICAgSWYgQ3tuYW1lfSBpcyBnaXZlbiB3aXRoIGEgdHJhaWxpbmcgQ3snKid9IGNoYXJhY3RlciwgdGhlbiBDe2xpc3RBbGxNYXRjaGVzfSB3aWxsIGJlDQogICAgICAgIHBhc3NlZCBhcyBDe1RydWV9Lg0KICAgICAgICAgICANCiAgICAgICAgSWYgQ3tuYW1lfSBpcyBvbWl0dGVkLCBzYW1lIGFzIGNhbGxpbmcgQ3tMe2NvcHl9fS4NCg0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgICMgdGhlc2UgYXJlIGVxdWl2YWxlbnQNCiAgICAgICAgICAgIHVzZXJkYXRhID0gV29yZChhbHBoYXMpLnNldFJlc3VsdHNOYW1lKCJuYW1lIikgKyBXb3JkKG51bXMrIi0iKS5zZXRSZXN1bHRzTmFtZSgic29jc2Vjbm8iKQ0KICAgICAgICAgICAgdXNlcmRhdGEgPSBXb3JkKGFscGhhcykoIm5hbWUiKSArIFdvcmQobnVtcysiLSIpKCJzb2NzZWNubyIpICAgICAgICAgICAgIA0KICAgICAgICAiIiINCiAgICAgICAgaWYgbmFtZSBpcyBub3QgTm9uZToNCiAgICAgICAgICAgIHJldHVybiBzZWxmLnNldFJlc3VsdHNOYW1lKG5hbWUpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByZXR1cm4gc2VsZi5jb3B5KCkNCg0KICAgIGRlZiBzdXBwcmVzcyggc2VsZiApOg0KICAgICAgICAiIiINCiAgICAgICAgU3VwcHJlc3NlcyB0aGUgb3V0cHV0IG9mIHRoaXMgQ3tQYXJzZXJFbGVtZW50fTsgdXNlZnVsIHRvIGtlZXAgcHVuY3R1YXRpb24gZnJvbQ0KICAgICAgICBjbHV0dGVyaW5nIHVwIHJldHVybmVkIG91dHB1dC4NCiAgICAgICAgIiIiDQogICAgICAgIHJldHVybiBTdXBwcmVzcyggc2VsZiApDQoNCiAgICBkZWYgbGVhdmVXaGl0ZXNwYWNlKCBzZWxmICk6DQogICAgICAgICIiIg0KICAgICAgICBEaXNhYmxlcyB0aGUgc2tpcHBpbmcgb2Ygd2hpdGVzcGFjZSBiZWZvcmUgbWF0Y2hpbmcgdGhlIGNoYXJhY3RlcnMgaW4gdGhlDQogICAgICAgIEN7UGFyc2VyRWxlbWVudH0ncyBkZWZpbmVkIHBhdHRlcm4uICBUaGlzIGlzIG5vcm1hbGx5IG9ubHkgdXNlZCBpbnRlcm5hbGx5IGJ5DQogICAgICAgIHRoZSBweXBhcnNpbmcgbW9kdWxlLCBidXQgbWF5IGJlIG5lZWRlZCBpbiBzb21lIHdoaXRlc3BhY2Utc2Vuc2l0aXZlIGdyYW1tYXJzLg0KICAgICAgICAiIiINCiAgICAgICAgc2VsZi5za2lwV2hpdGVzcGFjZSA9IEZhbHNlDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgc2V0V2hpdGVzcGFjZUNoYXJzKCBzZWxmLCBjaGFycyApOg0KICAgICAgICAiIiINCiAgICAgICAgT3ZlcnJpZGVzIHRoZSBkZWZhdWx0IHdoaXRlc3BhY2UgY2hhcnMNCiAgICAgICAgIiIiDQogICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBUcnVlDQogICAgICAgIHNlbGYud2hpdGVDaGFycyA9IGNoYXJzDQogICAgICAgIHNlbGYuY29weURlZmF1bHRXaGl0ZUNoYXJzID0gRmFsc2UNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBwYXJzZVdpdGhUYWJzKCBzZWxmICk6DQogICAgICAgICIiIg0KICAgICAgICBPdmVycmlkZXMgZGVmYXVsdCBiZWhhdmlvciB0byBleHBhbmQgQ3s8VEFCPn1zIHRvIHNwYWNlcyBiZWZvcmUgcGFyc2luZyB0aGUgaW5wdXQgc3RyaW5nLg0KICAgICAgICBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgQ3twYXJzZVN0cmluZ30gd2hlbiB0aGUgaW5wdXQgZ3JhbW1hciBjb250YWlucyBlbGVtZW50cyB0aGF0DQogICAgICAgIG1hdGNoIEN7PFRBQj59IGNoYXJhY3RlcnMuDQogICAgICAgICIiIg0KICAgICAgICBzZWxmLmtlZXBUYWJzID0gVHJ1ZQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIGlnbm9yZSggc2VsZiwgb3RoZXIgKToNCiAgICAgICAgIiIiDQogICAgICAgIERlZmluZSBleHByZXNzaW9uIHRvIGJlIGlnbm9yZWQgKGUuZy4sIGNvbW1lbnRzKSB3aGlsZSBkb2luZyBwYXR0ZXJuDQogICAgICAgIG1hdGNoaW5nOyBtYXkgYmUgY2FsbGVkIHJlcGVhdGVkbHksIHRvIGRlZmluZSBtdWx0aXBsZSBjb21tZW50IG9yIG90aGVyDQogICAgICAgIGlnbm9yYWJsZSBwYXR0ZXJucy4NCiAgICAgICAgDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgcGF0dCA9IE9uZU9yTW9yZShXb3JkKGFscGhhcykpDQogICAgICAgICAgICBwYXR0LnBhcnNlU3RyaW5nKCdhYmxhaiAvKiBjb21tZW50ICovIGxza2pkJykgIyAtPiBbJ2FibGFqJ10NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgcGF0dC5pZ25vcmUoY1N0eWxlQ29tbWVudCkNCiAgICAgICAgICAgIHBhdHQucGFyc2VTdHJpbmcoJ2FibGFqIC8qIGNvbW1lbnQgKi8gbHNramQnKSAjIC0+IFsnYWJsYWonLCAnbHNramQnXQ0KICAgICAgICAiIiINCiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgYmFzZXN0cmluZyk6DQogICAgICAgICAgICBvdGhlciA9IFN1cHByZXNzKG90aGVyKQ0KDQogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBTdXBwcmVzcyApOg0KICAgICAgICAgICAgaWYgb3RoZXIgbm90IGluIHNlbGYuaWdub3JlRXhwcnM6DQogICAgICAgICAgICAgICAgc2VsZi5pZ25vcmVFeHBycy5hcHBlbmQob3RoZXIpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBzZWxmLmlnbm9yZUV4cHJzLmFwcGVuZCggU3VwcHJlc3MoIG90aGVyLmNvcHkoKSApICkNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBzZXREZWJ1Z0FjdGlvbnMoIHNlbGYsIHN0YXJ0QWN0aW9uLCBzdWNjZXNzQWN0aW9uLCBleGNlcHRpb25BY3Rpb24gKToNCiAgICAgICAgIiIiDQogICAgICAgIEVuYWJsZSBkaXNwbGF5IG9mIGRlYnVnZ2luZyBtZXNzYWdlcyB3aGlsZSBkb2luZyBwYXR0ZXJuIG1hdGNoaW5nLg0KICAgICAgICAiIiINCiAgICAgICAgc2VsZi5kZWJ1Z0FjdGlvbnMgPSAoc3RhcnRBY3Rpb24gb3IgX2RlZmF1bHRTdGFydERlYnVnQWN0aW9uLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzQWN0aW9uIG9yIF9kZWZhdWx0U3VjY2Vzc0RlYnVnQWN0aW9uLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb25BY3Rpb24gb3IgX2RlZmF1bHRFeGNlcHRpb25EZWJ1Z0FjdGlvbikNCiAgICAgICAgc2VsZi5kZWJ1ZyA9IFRydWUNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBzZXREZWJ1Zyggc2VsZiwgZmxhZz1UcnVlICk6DQogICAgICAgICIiIg0KICAgICAgICBFbmFibGUgZGlzcGxheSBvZiBkZWJ1Z2dpbmcgbWVzc2FnZXMgd2hpbGUgZG9pbmcgcGF0dGVybiBtYXRjaGluZy4NCiAgICAgICAgU2V0IEN7ZmxhZ30gdG8gVHJ1ZSB0byBlbmFibGUsIEZhbHNlIHRvIGRpc2FibGUuDQoNCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICB3ZCA9IFdvcmQoYWxwaGFzKS5zZXROYW1lKCJhbHBoYXdvcmQiKQ0KICAgICAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykuc2V0TmFtZSgibnVtd29yZCIpDQogICAgICAgICAgICB0ZXJtID0gd2QgfCBpbnRlZ2VyDQogICAgICAgICAgICANCiAgICAgICAgICAgICMgdHVybiBvbiBkZWJ1Z2dpbmcgZm9yIHdkDQogICAgICAgICAgICB3ZC5zZXREZWJ1ZygpDQoNCiAgICAgICAgICAgIE9uZU9yTW9yZSh0ZXJtKS5wYXJzZVN0cmluZygiYWJjIDEyMyB4eXogODkwIikNCiAgICAgICAgDQogICAgICAgIHByaW50czo6DQogICAgICAgICAgICBNYXRjaCBhbHBoYXdvcmQgYXQgbG9jIDAoMSwxKQ0KICAgICAgICAgICAgTWF0Y2hlZCBhbHBoYXdvcmQgLT4gWydhYmMnXQ0KICAgICAgICAgICAgTWF0Y2ggYWxwaGF3b3JkIGF0IGxvYyAzKDEsNCkNCiAgICAgICAgICAgIEV4Y2VwdGlvbiByYWlzZWQ6RXhwZWN0ZWQgYWxwaGF3b3JkIChhdCBjaGFyIDQpLCAobGluZToxLCBjb2w6NSkNCiAgICAgICAgICAgIE1hdGNoIGFscGhhd29yZCBhdCBsb2MgNygxLDgpDQogICAgICAgICAgICBNYXRjaGVkIGFscGhhd29yZCAtPiBbJ3h5eiddDQogICAgICAgICAgICBNYXRjaCBhbHBoYXdvcmQgYXQgbG9jIDExKDEsMTIpDQogICAgICAgICAgICBFeGNlcHRpb24gcmFpc2VkOkV4cGVjdGVkIGFscGhhd29yZCAoYXQgY2hhciAxMiksIChsaW5lOjEsIGNvbDoxMykNCiAgICAgICAgICAgIE1hdGNoIGFscGhhd29yZCBhdCBsb2MgMTUoMSwxNikNCiAgICAgICAgICAgIEV4Y2VwdGlvbiByYWlzZWQ6RXhwZWN0ZWQgYWxwaGF3b3JkIChhdCBjaGFyIDE1KSwgKGxpbmU6MSwgY29sOjE2KQ0KDQogICAgICAgIFRoZSBvdXRwdXQgc2hvd24gaXMgdGhhdCBwcm9kdWNlZCBieSB0aGUgZGVmYXVsdCBkZWJ1ZyBhY3Rpb25zIC0gY3VzdG9tIGRlYnVnIGFjdGlvbnMgY2FuIGJlDQogICAgICAgIHNwZWNpZmllZCB1c2luZyBMe3NldERlYnVnQWN0aW9uc30uIFByaW9yIHRvIGF0dGVtcHRpbmcNCiAgICAgICAgdG8gbWF0Y2ggdGhlIEN7d2R9IGV4cHJlc3Npb24sIHRoZSBkZWJ1Z2dpbmcgbWVzc2FnZSBDeyJNYXRjaCA8ZXhwcm5hbWU+IGF0IGxvYyA8bj4oPGxpbmU+LDxjb2w+KSJ9DQogICAgICAgIGlzIHNob3duLiBUaGVuIGlmIHRoZSBwYXJzZSBzdWNjZWVkcywgYSBDeyJNYXRjaGVkIn0gbWVzc2FnZSBpcyBzaG93biwgb3IgYW4gQ3siRXhjZXB0aW9uIHJhaXNlZCJ9DQogICAgICAgIG1lc3NhZ2UgaXMgc2hvd24uIEFsc28gbm90ZSB0aGUgdXNlIG9mIEx7c2V0TmFtZX0gdG8gYXNzaWduIGEgaHVtYW4tcmVhZGFibGUgbmFtZSB0byB0aGUgZXhwcmVzc2lvbiwNCiAgICAgICAgd2hpY2ggbWFrZXMgZGVidWdnaW5nIGFuZCBleGNlcHRpb24gbWVzc2FnZXMgZWFzaWVyIHRvIHVuZGVyc3RhbmQgLSBmb3IgaW5zdGFuY2UsIHRoZSBkZWZhdWx0DQogICAgICAgIG5hbWUgY3JlYXRlZCBmb3IgdGhlIEN7V29yZH0gZXhwcmVzc2lvbiB3aXRob3V0IGNhbGxpbmcgQ3tzZXROYW1lfSBpcyBDeyJXOihBQkNELi4uKSJ9Lg0KICAgICAgICAiIiINCiAgICAgICAgaWYgZmxhZzoNCiAgICAgICAgICAgIHNlbGYuc2V0RGVidWdBY3Rpb25zKCBfZGVmYXVsdFN0YXJ0RGVidWdBY3Rpb24sIF9kZWZhdWx0U3VjY2Vzc0RlYnVnQWN0aW9uLCBfZGVmYXVsdEV4Y2VwdGlvbkRlYnVnQWN0aW9uICkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHNlbGYuZGVidWcgPSBGYWxzZQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgcmV0dXJuIHNlbGYubmFtZQ0KDQogICAgZGVmIF9fcmVwcl9fKCBzZWxmICk6DQogICAgICAgIHJldHVybiBfdXN0cihzZWxmKQ0KDQogICAgZGVmIHN0cmVhbWxpbmUoIHNlbGYgKToNCiAgICAgICAgc2VsZi5zdHJlYW1saW5lZCA9IFRydWUNCiAgICAgICAgc2VsZi5zdHJSZXByID0gTm9uZQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIGNoZWNrUmVjdXJzaW9uKCBzZWxmLCBwYXJzZUVsZW1lbnRMaXN0ICk6DQogICAgICAgIHBhc3MNCg0KICAgIGRlZiB2YWxpZGF0ZSggc2VsZiwgdmFsaWRhdGVUcmFjZT1bXSApOg0KICAgICAgICAiIiINCiAgICAgICAgQ2hlY2sgZGVmaW5lZCBleHByZXNzaW9ucyBmb3IgdmFsaWQgc3RydWN0dXJlLCBjaGVjayBmb3IgaW5maW5pdGUgcmVjdXJzaXZlIGRlZmluaXRpb25zLg0KICAgICAgICAiIiINCiAgICAgICAgc2VsZi5jaGVja1JlY3Vyc2lvbiggW10gKQ0KDQogICAgZGVmIHBhcnNlRmlsZSggc2VsZiwgZmlsZV9vcl9maWxlbmFtZSwgcGFyc2VBbGw9RmFsc2UgKToNCiAgICAgICAgIiIiDQogICAgICAgIEV4ZWN1dGUgdGhlIHBhcnNlIGV4cHJlc3Npb24gb24gdGhlIGdpdmVuIGZpbGUgb3IgZmlsZW5hbWUuDQogICAgICAgIElmIGEgZmlsZW5hbWUgaXMgc3BlY2lmaWVkIChpbnN0ZWFkIG9mIGEgZmlsZSBvYmplY3QpLA0KICAgICAgICB0aGUgZW50aXJlIGZpbGUgaXMgb3BlbmVkLCByZWFkLCBhbmQgY2xvc2VkIGJlZm9yZSBwYXJzaW5nLg0KICAgICAgICAiIiINCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgZmlsZV9jb250ZW50cyA9IGZpbGVfb3JfZmlsZW5hbWUucmVhZCgpDQogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoNCiAgICAgICAgICAgIHdpdGggb3BlbihmaWxlX29yX2ZpbGVuYW1lLCAiciIpIGFzIGY6DQogICAgICAgICAgICAgICAgZmlsZV9jb250ZW50cyA9IGYucmVhZCgpDQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlU3RyaW5nKGZpbGVfY29udGVudHMsIHBhcnNlQWxsKQ0KICAgICAgICBleGNlcHQgUGFyc2VCYXNlRXhjZXB0aW9uIGFzIGV4YzoNCiAgICAgICAgICAgIGlmIFBhcnNlckVsZW1lbnQudmVyYm9zZV9zdGFja3RyYWNlOg0KICAgICAgICAgICAgICAgIHJhaXNlDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICMgY2F0Y2ggYW5kIHJlLXJhaXNlIGV4Y2VwdGlvbiBmcm9tIGhlcmUsIGNsZWFycyBvdXQgcHlwYXJzaW5nIGludGVybmFsIHN0YWNrIHRyYWNlDQogICAgICAgICAgICAgICAgcmFpc2UgZXhjDQoNCiAgICBkZWYgX19lcV9fKHNlbGYsb3RoZXIpOg0KICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBQYXJzZXJFbGVtZW50KToNCiAgICAgICAgICAgIHJldHVybiBzZWxmIGlzIG90aGVyIG9yIHZhcnMoc2VsZikgPT0gdmFycyhvdGhlcikNCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKG90aGVyLCBiYXNlc3RyaW5nKToNCiAgICAgICAgICAgIHJldHVybiBzZWxmLm1hdGNoZXMob3RoZXIpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByZXR1cm4gc3VwZXIoUGFyc2VyRWxlbWVudCxzZWxmKT09b3RoZXINCg0KICAgIGRlZiBfX25lX18oc2VsZixvdGhlcik6DQogICAgICAgIHJldHVybiBub3QgKHNlbGYgPT0gb3RoZXIpDQoNCiAgICBkZWYgX19oYXNoX18oc2VsZik6DQogICAgICAgIHJldHVybiBoYXNoKGlkKHNlbGYpKQ0KDQogICAgZGVmIF9fcmVxX18oc2VsZixvdGhlcik6DQogICAgICAgIHJldHVybiBzZWxmID09IG90aGVyDQoNCiAgICBkZWYgX19ybmVfXyhzZWxmLG90aGVyKToNCiAgICAgICAgcmV0dXJuIG5vdCAoc2VsZiA9PSBvdGhlcikNCg0KICAgIGRlZiBtYXRjaGVzKHNlbGYsIHRlc3RTdHJpbmcsIHBhcnNlQWxsPVRydWUpOg0KICAgICAgICAiIiINCiAgICAgICAgTWV0aG9kIGZvciBxdWljayB0ZXN0aW5nIG9mIGEgcGFyc2VyIGFnYWluc3QgYSB0ZXN0IHN0cmluZy4gR29vZCBmb3Igc2ltcGxlIA0KICAgICAgICBpbmxpbmUgbWljcm90ZXN0cyBvZiBzdWIgZXhwcmVzc2lvbnMgd2hpbGUgYnVpbGRpbmcgdXAgbGFyZ2VyIHBhcnNlci4NCiAgICAgICAgICAgDQogICAgICAgIFBhcmFtZXRlcnM6DQogICAgICAgICAtIHRlc3RTdHJpbmcgLSB0byB0ZXN0IGFnYWluc3QgdGhpcyBleHByZXNzaW9uIGZvciBhIG1hdGNoDQogICAgICAgICAtIHBhcnNlQWxsIC0gKGRlZmF1bHQ9Q3tUcnVlfSkgLSBmbGFnIHRvIHBhc3MgdG8gQ3tMe3BhcnNlU3RyaW5nfX0gd2hlbiBydW5uaW5nIHRlc3RzDQogICAgICAgICAgICANCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBleHByID0gV29yZChudW1zKQ0KICAgICAgICAgICAgYXNzZXJ0IGV4cHIubWF0Y2hlcygiMTAwIikNCiAgICAgICAgIiIiDQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHNlbGYucGFyc2VTdHJpbmcoX3VzdHIodGVzdFN0cmluZyksIHBhcnNlQWxsPXBhcnNlQWxsKQ0KICAgICAgICAgICAgcmV0dXJuIFRydWUNCiAgICAgICAgZXhjZXB0IFBhcnNlQmFzZUV4Y2VwdGlvbjoNCiAgICAgICAgICAgIHJldHVybiBGYWxzZQ0KICAgICAgICAgICAgICAgIA0KICAgIGRlZiBydW5UZXN0cyhzZWxmLCB0ZXN0cywgcGFyc2VBbGw9VHJ1ZSwgY29tbWVudD0nIycsIGZ1bGxEdW1wPVRydWUsIHByaW50UmVzdWx0cz1UcnVlLCBmYWlsdXJlVGVzdHM9RmFsc2UpOg0KICAgICAgICAiIiINCiAgICAgICAgRXhlY3V0ZSB0aGUgcGFyc2UgZXhwcmVzc2lvbiBvbiBhIHNlcmllcyBvZiB0ZXN0IHN0cmluZ3MsIHNob3dpbmcgZWFjaA0KICAgICAgICB0ZXN0LCB0aGUgcGFyc2VkIHJlc3VsdHMgb3Igd2hlcmUgdGhlIHBhcnNlIGZhaWxlZC4gUXVpY2sgYW5kIGVhc3kgd2F5IHRvDQogICAgICAgIHJ1biBhIHBhcnNlIGV4cHJlc3Npb24gYWdhaW5zdCBhIGxpc3Qgb2Ygc2FtcGxlIHN0cmluZ3MuDQogICAgICAgICAgIA0KICAgICAgICBQYXJhbWV0ZXJzOg0KICAgICAgICAgLSB0ZXN0cyAtIGEgbGlzdCBvZiBzZXBhcmF0ZSB0ZXN0IHN0cmluZ3MsIG9yIGEgbXVsdGlsaW5lIHN0cmluZyBvZiB0ZXN0IHN0cmluZ3MNCiAgICAgICAgIC0gcGFyc2VBbGwgLSAoZGVmYXVsdD1De1RydWV9KSAtIGZsYWcgdG8gcGFzcyB0byBDe0x7cGFyc2VTdHJpbmd9fSB3aGVuIHJ1bm5pbmcgdGVzdHMgICAgICAgICAgIA0KICAgICAgICAgLSBjb21tZW50IC0gKGRlZmF1bHQ9Q3snIyd9KSAtIGV4cHJlc3Npb24gZm9yIGluZGljYXRpbmcgZW1iZWRkZWQgY29tbWVudHMgaW4gdGhlIHRlc3QgDQogICAgICAgICAgICAgIHN0cmluZzsgcGFzcyBOb25lIHRvIGRpc2FibGUgY29tbWVudCBmaWx0ZXJpbmcNCiAgICAgICAgIC0gZnVsbER1bXAgLSAoZGVmYXVsdD1De1RydWV9KSAtIGR1bXAgcmVzdWx0cyBhcyBsaXN0IGZvbGxvd2VkIGJ5IHJlc3VsdHMgbmFtZXMgaW4gbmVzdGVkIG91dGxpbmU7DQogICAgICAgICAgICAgIGlmIEZhbHNlLCBvbmx5IGR1bXAgbmVzdGVkIGxpc3QNCiAgICAgICAgIC0gcHJpbnRSZXN1bHRzIC0gKGRlZmF1bHQ9Q3tUcnVlfSkgcHJpbnRzIHRlc3Qgb3V0cHV0IHRvIHN0ZG91dA0KICAgICAgICAgLSBmYWlsdXJlVGVzdHMgLSAoZGVmYXVsdD1De0ZhbHNlfSkgaW5kaWNhdGVzIGlmIHRoZXNlIHRlc3RzIGFyZSBleHBlY3RlZCB0byBmYWlsIHBhcnNpbmcNCg0KICAgICAgICBSZXR1cm5zOiBhIChzdWNjZXNzLCByZXN1bHRzKSB0dXBsZSwgd2hlcmUgc3VjY2VzcyBpbmRpY2F0ZXMgdGhhdCBhbGwgdGVzdHMgc3VjY2VlZGVkDQogICAgICAgIChvciBmYWlsZWQgaWYgQ3tmYWlsdXJlVGVzdHN9IGlzIFRydWUpLCBhbmQgdGhlIHJlc3VsdHMgY29udGFpbiBhIGxpc3Qgb2YgbGluZXMgb2YgZWFjaCANCiAgICAgICAgdGVzdCdzIG91dHB1dA0KICAgICAgICANCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBudW1iZXJfZXhwciA9IHB5cGFyc2luZ19jb21tb24ubnVtYmVyLmNvcHkoKQ0KDQogICAgICAgICAgICByZXN1bHQgPSBudW1iZXJfZXhwci5ydW5UZXN0cygnJycNCiAgICAgICAgICAgICAgICAjIHVuc2lnbmVkIGludGVnZXINCiAgICAgICAgICAgICAgICAxMDANCiAgICAgICAgICAgICAgICAjIG5lZ2F0aXZlIGludGVnZXINCiAgICAgICAgICAgICAgICAtMTAwDQogICAgICAgICAgICAgICAgIyBmbG9hdCB3aXRoIHNjaWVudGlmaWMgbm90YXRpb24NCiAgICAgICAgICAgICAgICA2LjAyZTIzDQogICAgICAgICAgICAgICAgIyBpbnRlZ2VyIHdpdGggc2NpZW50aWZpYyBub3RhdGlvbg0KICAgICAgICAgICAgICAgIDFlLTEyDQogICAgICAgICAgICAgICAgJycnKQ0KICAgICAgICAgICAgcHJpbnQoIlN1Y2Nlc3MiIGlmIHJlc3VsdFswXSBlbHNlICJGYWlsZWQhIikNCg0KICAgICAgICAgICAgcmVzdWx0ID0gbnVtYmVyX2V4cHIucnVuVGVzdHMoJycnDQogICAgICAgICAgICAgICAgIyBzdHJheSBjaGFyYWN0ZXINCiAgICAgICAgICAgICAgICAxMDBaDQogICAgICAgICAgICAgICAgIyBtaXNzaW5nIGxlYWRpbmcgZGlnaXQgYmVmb3JlICcuJw0KICAgICAgICAgICAgICAgIC0uMTAwDQogICAgICAgICAgICAgICAgIyB0b28gbWFueSAnLicNCiAgICAgICAgICAgICAgICAzLjE0LjE1OQ0KICAgICAgICAgICAgICAgICcnJywgZmFpbHVyZVRlc3RzPVRydWUpDQogICAgICAgICAgICBwcmludCgiU3VjY2VzcyIgaWYgcmVzdWx0WzBdIGVsc2UgIkZhaWxlZCEiKQ0KICAgICAgICBwcmludHM6Og0KICAgICAgICAgICAgIyB1bnNpZ25lZCBpbnRlZ2VyDQogICAgICAgICAgICAxMDANCiAgICAgICAgICAgIFsxMDBdDQoNCiAgICAgICAgICAgICMgbmVnYXRpdmUgaW50ZWdlcg0KICAgICAgICAgICAgLTEwMA0KICAgICAgICAgICAgWy0xMDBdDQoNCiAgICAgICAgICAgICMgZmxvYXQgd2l0aCBzY2llbnRpZmljIG5vdGF0aW9uDQogICAgICAgICAgICA2LjAyZTIzDQogICAgICAgICAgICBbNi4wMmUrMjNdDQoNCiAgICAgICAgICAgICMgaW50ZWdlciB3aXRoIHNjaWVudGlmaWMgbm90YXRpb24NCiAgICAgICAgICAgIDFlLTEyDQogICAgICAgICAgICBbMWUtMTJdDQoNCiAgICAgICAgICAgIFN1Y2Nlc3MNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgIyBzdHJheSBjaGFyYWN0ZXINCiAgICAgICAgICAgIDEwMFoNCiAgICAgICAgICAgICAgIF4NCiAgICAgICAgICAgIEZBSUw6IEV4cGVjdGVkIGVuZCBvZiB0ZXh0IChhdCBjaGFyIDMpLCAobGluZToxLCBjb2w6NCkNCg0KICAgICAgICAgICAgIyBtaXNzaW5nIGxlYWRpbmcgZGlnaXQgYmVmb3JlICcuJw0KICAgICAgICAgICAgLS4xMDANCiAgICAgICAgICAgIF4NCiAgICAgICAgICAgIEZBSUw6IEV4cGVjdGVkIHtyZWFsIG51bWJlciB3aXRoIHNjaWVudGlmaWMgbm90YXRpb24gfCByZWFsIG51bWJlciB8IHNpZ25lZCBpbnRlZ2VyfSAoYXQgY2hhciAwKSwgKGxpbmU6MSwgY29sOjEpDQoNCiAgICAgICAgICAgICMgdG9vIG1hbnkgJy4nDQogICAgICAgICAgICAzLjE0LjE1OQ0KICAgICAgICAgICAgICAgIF4NCiAgICAgICAgICAgIEZBSUw6IEV4cGVjdGVkIGVuZCBvZiB0ZXh0IChhdCBjaGFyIDQpLCAobGluZToxLCBjb2w6NSkNCg0KICAgICAgICAgICAgU3VjY2Vzcw0KDQogICAgICAgIEVhY2ggdGVzdCBzdHJpbmcgbXVzdCBiZSBvbiBhIHNpbmdsZSBsaW5lLiBJZiB5b3Ugd2FudCB0byB0ZXN0IGEgc3RyaW5nIHRoYXQgc3BhbnMgbXVsdGlwbGUNCiAgICAgICAgbGluZXMsIGNyZWF0ZSBhIHRlc3QgbGlrZSB0aGlzOjoNCg0KICAgICAgICAgICAgZXhwci5ydW5UZXN0KHIidGhpcyBpcyBhIHRlc3RcXG4gb2Ygc3RyaW5ncyB0aGF0IHNwYW5zIFxcbiAzIGxpbmVzIikNCiAgICAgICAgDQogICAgICAgIChOb3RlIHRoYXQgdGhpcyBpcyBhIHJhdyBzdHJpbmcgbGl0ZXJhbCwgeW91IG11c3QgaW5jbHVkZSB0aGUgbGVhZGluZyAncicuKQ0KICAgICAgICAiIiINCiAgICAgICAgaWYgaXNpbnN0YW5jZSh0ZXN0cywgYmFzZXN0cmluZyk6DQogICAgICAgICAgICB0ZXN0cyA9IGxpc3QobWFwKHN0ci5zdHJpcCwgdGVzdHMucnN0cmlwKCkuc3BsaXRsaW5lcygpKSkNCiAgICAgICAgaWYgaXNpbnN0YW5jZShjb21tZW50LCBiYXNlc3RyaW5nKToNCiAgICAgICAgICAgIGNvbW1lbnQgPSBMaXRlcmFsKGNvbW1lbnQpDQogICAgICAgIGFsbFJlc3VsdHMgPSBbXQ0KICAgICAgICBjb21tZW50cyA9IFtdDQogICAgICAgIHN1Y2Nlc3MgPSBUcnVlDQogICAgICAgIGZvciB0IGluIHRlc3RzOg0KICAgICAgICAgICAgaWYgY29tbWVudCBpcyBub3QgTm9uZSBhbmQgY29tbWVudC5tYXRjaGVzKHQsIEZhbHNlKSBvciBjb21tZW50cyBhbmQgbm90IHQ6DQogICAgICAgICAgICAgICAgY29tbWVudHMuYXBwZW5kKHQpDQogICAgICAgICAgICAgICAgY29udGludWUNCiAgICAgICAgICAgIGlmIG5vdCB0Og0KICAgICAgICAgICAgICAgIGNvbnRpbnVlDQogICAgICAgICAgICBvdXQgPSBbJ1xuJy5qb2luKGNvbW1lbnRzKSwgdF0NCiAgICAgICAgICAgIGNvbW1lbnRzID0gW10NCiAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICB0ID0gdC5yZXBsYWNlKHInXG4nLCdcbicpDQogICAgICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5wYXJzZVN0cmluZyh0LCBwYXJzZUFsbD1wYXJzZUFsbCkNCiAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKHJlc3VsdC5kdW1wKGZ1bGw9ZnVsbER1bXApKQ0KICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBzdWNjZXNzIGFuZCBub3QgZmFpbHVyZVRlc3RzDQogICAgICAgICAgICBleGNlcHQgUGFyc2VCYXNlRXhjZXB0aW9uIGFzIHBlOg0KICAgICAgICAgICAgICAgIGZhdGFsID0gIihGQVRBTCkiIGlmIGlzaW5zdGFuY2UocGUsIFBhcnNlRmF0YWxFeGNlcHRpb24pIGVsc2UgIiINCiAgICAgICAgICAgICAgICBpZiAnXG4nIGluIHQ6DQogICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQobGluZShwZS5sb2MsIHQpKQ0KICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCcgJyooY29sKHBlLmxvYyx0KS0xKSArICdeJyArIGZhdGFsKQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoJyAnKnBlLmxvYyArICdeJyArIGZhdGFsKQ0KICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoIkZBSUw6ICIgKyBzdHIocGUpKQ0KICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBzdWNjZXNzIGFuZCBmYWlsdXJlVGVzdHMNCiAgICAgICAgICAgICAgICByZXN1bHQgPSBwZQ0KICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBleGM6DQogICAgICAgICAgICAgICAgb3V0LmFwcGVuZCgiRkFJTC1FWENFUFRJT046ICIgKyBzdHIoZXhjKSkNCiAgICAgICAgICAgICAgICBzdWNjZXNzID0gc3VjY2VzcyBhbmQgZmFpbHVyZVRlc3RzDQogICAgICAgICAgICAgICAgcmVzdWx0ID0gZXhjDQoNCiAgICAgICAgICAgIGlmIHByaW50UmVzdWx0czoNCiAgICAgICAgICAgICAgICBpZiBmdWxsRHVtcDoNCiAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZCgnJykNCiAgICAgICAgICAgICAgICBwcmludCgnXG4nLmpvaW4ob3V0KSkNCg0KICAgICAgICAgICAgYWxsUmVzdWx0cy5hcHBlbmQoKHQsIHJlc3VsdCkpDQogICAgICAgIA0KICAgICAgICByZXR1cm4gc3VjY2VzcywgYWxsUmVzdWx0cw0KDQogICAgICAgIA0KY2xhc3MgVG9rZW4oUGFyc2VyRWxlbWVudCk6DQogICAgIiIiDQogICAgQWJzdHJhY3QgQ3tQYXJzZXJFbGVtZW50fSBzdWJjbGFzcywgZm9yIGRlZmluaW5nIGF0b21pYyBtYXRjaGluZyBwYXR0ZXJucy4NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYgKToNCiAgICAgICAgc3VwZXIoVG9rZW4sc2VsZikuX19pbml0X18oIHNhdmVsaXN0PUZhbHNlICkNCg0KDQpjbGFzcyBFbXB0eShUb2tlbik6DQogICAgIiIiDQogICAgQW4gZW1wdHkgdG9rZW4sIHdpbGwgYWx3YXlzIG1hdGNoLg0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiApOg0KICAgICAgICBzdXBlcihFbXB0eSxzZWxmKS5fX2luaXRfXygpDQogICAgICAgIHNlbGYubmFtZSA9ICJFbXB0eSINCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUNCiAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gRmFsc2UNCg0KDQpjbGFzcyBOb01hdGNoKFRva2VuKToNCiAgICAiIiINCiAgICBBIHRva2VuIHRoYXQgd2lsbCBuZXZlciBtYXRjaC4NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYgKToNCiAgICAgICAgc3VwZXIoTm9NYXRjaCxzZWxmKS5fX2luaXRfXygpDQogICAgICAgIHNlbGYubmFtZSA9ICJOb01hdGNoIg0KICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gVHJ1ZQ0KICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBGYWxzZQ0KICAgICAgICBzZWxmLmVycm1zZyA9ICJVbm1hdGNoYWJsZSB0b2tlbiINCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KDQoNCmNsYXNzIExpdGVyYWwoVG9rZW4pOg0KICAgICIiIg0KICAgIFRva2VuIHRvIGV4YWN0bHkgbWF0Y2ggYSBzcGVjaWZpZWQgc3RyaW5nLg0KICAgIA0KICAgIEV4YW1wbGU6Og0KICAgICAgICBMaXRlcmFsKCdibGFoJykucGFyc2VTdHJpbmcoJ2JsYWgnKSAgIyAtPiBbJ2JsYWgnXQ0KICAgICAgICBMaXRlcmFsKCdibGFoJykucGFyc2VTdHJpbmcoJ2JsYWhmb29ibGFoJykgICMgLT4gWydibGFoJ10NCiAgICAgICAgTGl0ZXJhbCgnYmxhaCcpLnBhcnNlU3RyaW5nKCdibGEnKSAgIyAtPiBFeGNlcHRpb246IEV4cGVjdGVkICJibGFoIg0KICAgIA0KICAgIEZvciBjYXNlLWluc2Vuc2l0aXZlIG1hdGNoaW5nLCB1c2UgTHtDYXNlbGVzc0xpdGVyYWx9Lg0KICAgIA0KICAgIEZvciBrZXl3b3JkIG1hdGNoaW5nIChmb3JjZSB3b3JkIGJyZWFrIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIG1hdGNoZWQgc3RyaW5nKSwNCiAgICB1c2UgTHtLZXl3b3JkfSBvciBMe0Nhc2VsZXNzS2V5d29yZH0uDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBtYXRjaFN0cmluZyApOg0KICAgICAgICBzdXBlcihMaXRlcmFsLHNlbGYpLl9faW5pdF9fKCkNCiAgICAgICAgc2VsZi5tYXRjaCA9IG1hdGNoU3RyaW5nDQogICAgICAgIHNlbGYubWF0Y2hMZW4gPSBsZW4obWF0Y2hTdHJpbmcpDQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHNlbGYuZmlyc3RNYXRjaENoYXIgPSBtYXRjaFN0cmluZ1swXQ0KICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoNCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIm51bGwgc3RyaW5nIHBhc3NlZCB0byBMaXRlcmFsOyB1c2UgRW1wdHkoKSBpbnN0ZWFkIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpDQogICAgICAgICAgICBzZWxmLl9fY2xhc3NfXyA9IEVtcHR5DQogICAgICAgIHNlbGYubmFtZSA9ICciJXMiJyAlIF91c3RyKHNlbGYubWF0Y2gpDQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkICIgKyBzZWxmLm5hbWUNCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IEZhbHNlDQogICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IEZhbHNlDQoNCiAgICAjIFBlcmZvcm1hbmNlIHR1bmluZzogdGhpcyByb3V0aW5lIGdldHMgY2FsbGVkIGEgKmxvdCoNCiAgICAjIGlmIHRoaXMgaXMgYSBzaW5nbGUgY2hhcmFjdGVyIG1hdGNoIHN0cmluZyAgYW5kIHRoZSBmaXJzdCBjaGFyYWN0ZXIgbWF0Y2hlcywNCiAgICAjIHNob3J0LWNpcmN1aXQgYXMgcXVpY2tseSBhcyBwb3NzaWJsZSwgYW5kIGF2b2lkIGNhbGxpbmcgc3RhcnRzd2l0aA0KICAgICN+IEBwcm9maWxlDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgaWYgKGluc3RyaW5nW2xvY10gPT0gc2VsZi5maXJzdE1hdGNoQ2hhciBhbmQNCiAgICAgICAgICAgIChzZWxmLm1hdGNoTGVuPT0xIG9yIGluc3RyaW5nLnN0YXJ0c3dpdGgoc2VsZi5tYXRjaCxsb2MpKSApOg0KICAgICAgICAgICAgcmV0dXJuIGxvYytzZWxmLm1hdGNoTGVuLCBzZWxmLm1hdGNoDQogICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KX0wgPSBMaXRlcmFsDQpQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MgPSBMaXRlcmFsDQoNCmNsYXNzIEtleXdvcmQoVG9rZW4pOg0KICAgICIiIg0KICAgIFRva2VuIHRvIGV4YWN0bHkgbWF0Y2ggYSBzcGVjaWZpZWQgc3RyaW5nIGFzIGEga2V5d29yZCwgdGhhdCBpcywgaXQgbXVzdCBiZQ0KICAgIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGEgbm9uLWtleXdvcmQgY2hhcmFjdGVyLiAgQ29tcGFyZSB3aXRoIEN7THtMaXRlcmFsfX06DQogICAgIC0gQ3tMaXRlcmFsKCJpZiIpfSB3aWxsIG1hdGNoIHRoZSBsZWFkaW5nIEN7J2lmJ30gaW4gQ3snaWZBbmRPbmx5SWYnfS4NCiAgICAgLSBDe0tleXdvcmQoImlmIil9IHdpbGwgbm90OyBpdCB3aWxsIG9ubHkgbWF0Y2ggdGhlIGxlYWRpbmcgQ3snaWYnfSBpbiBDeydpZiB4PTEnfSwgb3IgQ3snaWYoeT09MiknfQ0KICAgIEFjY2VwdHMgdHdvIG9wdGlvbmFsIGNvbnN0cnVjdG9yIGFyZ3VtZW50cyBpbiBhZGRpdGlvbiB0byB0aGUga2V5d29yZCBzdHJpbmc6DQogICAgIC0gQ3tpZGVudENoYXJzfSBpcyBhIHN0cmluZyBvZiBjaGFyYWN0ZXJzIHRoYXQgd291bGQgYmUgdmFsaWQgaWRlbnRpZmllciBjaGFyYWN0ZXJzLA0KICAgICAgICAgIGRlZmF1bHRpbmcgdG8gYWxsIGFscGhhbnVtZXJpY3MgKyAiXyIgYW5kICIkIg0KICAgICAtIEN7Y2FzZWxlc3N9IGFsbG93cyBjYXNlLWluc2Vuc2l0aXZlIG1hdGNoaW5nLCBkZWZhdWx0IGlzIEN7RmFsc2V9Lg0KICAgICAgIA0KICAgIEV4YW1wbGU6Og0KICAgICAgICBLZXl3b3JkKCJzdGFydCIpLnBhcnNlU3RyaW5nKCJzdGFydCIpICAjIC0+IFsnc3RhcnQnXQ0KICAgICAgICBLZXl3b3JkKCJzdGFydCIpLnBhcnNlU3RyaW5nKCJzdGFydGluZyIpICAjIC0+IEV4Y2VwdGlvbg0KDQogICAgRm9yIGNhc2UtaW5zZW5zaXRpdmUgbWF0Y2hpbmcsIHVzZSBMe0Nhc2VsZXNzS2V5d29yZH0uDQogICAgIiIiDQogICAgREVGQVVMVF9LRVlXT1JEX0NIQVJTID0gYWxwaGFudW1zKyJfJCINCg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgbWF0Y2hTdHJpbmcsIGlkZW50Q2hhcnM9Tm9uZSwgY2FzZWxlc3M9RmFsc2UgKToNCiAgICAgICAgc3VwZXIoS2V5d29yZCxzZWxmKS5fX2luaXRfXygpDQogICAgICAgIGlmIGlkZW50Q2hhcnMgaXMgTm9uZToNCiAgICAgICAgICAgIGlkZW50Q2hhcnMgPSBLZXl3b3JkLkRFRkFVTFRfS0VZV09SRF9DSEFSUw0KICAgICAgICBzZWxmLm1hdGNoID0gbWF0Y2hTdHJpbmcNCiAgICAgICAgc2VsZi5tYXRjaExlbiA9IGxlbihtYXRjaFN0cmluZykNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgc2VsZi5maXJzdE1hdGNoQ2hhciA9IG1hdGNoU3RyaW5nWzBdDQogICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOg0KICAgICAgICAgICAgd2FybmluZ3Mud2FybigibnVsbCBzdHJpbmcgcGFzc2VkIHRvIEtleXdvcmQ7IHVzZSBFbXB0eSgpIGluc3RlYWQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikNCiAgICAgICAgc2VsZi5uYW1lID0gJyIlcyInICUgc2VsZi5tYXRjaA0KICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCAiICsgc2VsZi5uYW1lDQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBGYWxzZQ0KICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBGYWxzZQ0KICAgICAgICBzZWxmLmNhc2VsZXNzID0gY2FzZWxlc3MNCiAgICAgICAgaWYgY2FzZWxlc3M6DQogICAgICAgICAgICBzZWxmLmNhc2VsZXNzbWF0Y2ggPSBtYXRjaFN0cmluZy51cHBlcigpDQogICAgICAgICAgICBpZGVudENoYXJzID0gaWRlbnRDaGFycy51cHBlcigpDQogICAgICAgIHNlbGYuaWRlbnRDaGFycyA9IHNldChpZGVudENoYXJzKQ0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgaWYgc2VsZi5jYXNlbGVzczoNCiAgICAgICAgICAgIGlmICggKGluc3RyaW5nWyBsb2M6bG9jK3NlbGYubWF0Y2hMZW4gXS51cHBlcigpID09IHNlbGYuY2FzZWxlc3NtYXRjaCkgYW5kDQogICAgICAgICAgICAgICAgIChsb2MgPj0gbGVuKGluc3RyaW5nKS1zZWxmLm1hdGNoTGVuIG9yIGluc3RyaW5nW2xvYytzZWxmLm1hdGNoTGVuXS51cHBlcigpIG5vdCBpbiBzZWxmLmlkZW50Q2hhcnMpIGFuZA0KICAgICAgICAgICAgICAgICAobG9jID09IDAgb3IgaW5zdHJpbmdbbG9jLTFdLnVwcGVyKCkgbm90IGluIHNlbGYuaWRlbnRDaGFycykgKToNCiAgICAgICAgICAgICAgICByZXR1cm4gbG9jK3NlbGYubWF0Y2hMZW4sIHNlbGYubWF0Y2gNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIGlmIChpbnN0cmluZ1tsb2NdID09IHNlbGYuZmlyc3RNYXRjaENoYXIgYW5kDQogICAgICAgICAgICAgICAgKHNlbGYubWF0Y2hMZW49PTEgb3IgaW5zdHJpbmcuc3RhcnRzd2l0aChzZWxmLm1hdGNoLGxvYykpIGFuZA0KICAgICAgICAgICAgICAgIChsb2MgPj0gbGVuKGluc3RyaW5nKS1zZWxmLm1hdGNoTGVuIG9yIGluc3RyaW5nW2xvYytzZWxmLm1hdGNoTGVuXSBub3QgaW4gc2VsZi5pZGVudENoYXJzKSBhbmQNCiAgICAgICAgICAgICAgICAobG9jID09IDAgb3IgaW5zdHJpbmdbbG9jLTFdIG5vdCBpbiBzZWxmLmlkZW50Q2hhcnMpICk6DQogICAgICAgICAgICAgICAgcmV0dXJuIGxvYytzZWxmLm1hdGNoTGVuLCBzZWxmLm1hdGNoDQogICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KDQogICAgZGVmIGNvcHkoc2VsZik6DQogICAgICAgIGMgPSBzdXBlcihLZXl3b3JkLHNlbGYpLmNvcHkoKQ0KICAgICAgICBjLmlkZW50Q2hhcnMgPSBLZXl3b3JkLkRFRkFVTFRfS0VZV09SRF9DSEFSUw0KICAgICAgICByZXR1cm4gYw0KDQogICAgQHN0YXRpY21ldGhvZA0KICAgIGRlZiBzZXREZWZhdWx0S2V5d29yZENoYXJzKCBjaGFycyApOg0KICAgICAgICAiIiJPdmVycmlkZXMgdGhlIGRlZmF1bHQgS2V5d29yZCBjaGFycw0KICAgICAgICAiIiINCiAgICAgICAgS2V5d29yZC5ERUZBVUxUX0tFWVdPUkRfQ0hBUlMgPSBjaGFycw0KDQpjbGFzcyBDYXNlbGVzc0xpdGVyYWwoTGl0ZXJhbCk6DQogICAgIiIiDQogICAgVG9rZW4gdG8gbWF0Y2ggYSBzcGVjaWZpZWQgc3RyaW5nLCBpZ25vcmluZyBjYXNlIG9mIGxldHRlcnMuDQogICAgTm90ZTogdGhlIG1hdGNoZWQgcmVzdWx0cyB3aWxsIGFsd2F5cyBiZSBpbiB0aGUgY2FzZSBvZiB0aGUgZ2l2ZW4NCiAgICBtYXRjaCBzdHJpbmcsIE5PVCB0aGUgY2FzZSBvZiB0aGUgaW5wdXQgdGV4dC4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBPbmVPck1vcmUoQ2FzZWxlc3NMaXRlcmFsKCJDTUQiKSkucGFyc2VTdHJpbmcoImNtZCBDTUQgQ21kMTAiKSAjIC0+IFsnQ01EJywgJ0NNRCcsICdDTUQnXQ0KICAgICAgICANCiAgICAoQ29udHJhc3Qgd2l0aCBleGFtcGxlIGZvciBMe0Nhc2VsZXNzS2V5d29yZH0uKQ0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgbWF0Y2hTdHJpbmcgKToNCiAgICAgICAgc3VwZXIoQ2FzZWxlc3NMaXRlcmFsLHNlbGYpLl9faW5pdF9fKCBtYXRjaFN0cmluZy51cHBlcigpICkNCiAgICAgICAgIyBQcmVzZXJ2ZSB0aGUgZGVmaW5pbmcgbGl0ZXJhbC4NCiAgICAgICAgc2VsZi5yZXR1cm5TdHJpbmcgPSBtYXRjaFN0cmluZw0KICAgICAgICBzZWxmLm5hbWUgPSAiJyVzJyIgJSBzZWxmLnJldHVyblN0cmluZw0KICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCAiICsgc2VsZi5uYW1lDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBpZiBpbnN0cmluZ1sgbG9jOmxvYytzZWxmLm1hdGNoTGVuIF0udXBwZXIoKSA9PSBzZWxmLm1hdGNoOg0KICAgICAgICAgICAgcmV0dXJuIGxvYytzZWxmLm1hdGNoTGVuLCBzZWxmLnJldHVyblN0cmluZw0KICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCg0KY2xhc3MgQ2FzZWxlc3NLZXl3b3JkKEtleXdvcmQpOg0KICAgICIiIg0KICAgIENhc2VsZXNzIHZlcnNpb24gb2YgTHtLZXl3b3JkfS4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBPbmVPck1vcmUoQ2FzZWxlc3NLZXl3b3JkKCJDTUQiKSkucGFyc2VTdHJpbmcoImNtZCBDTUQgQ21kMTAiKSAjIC0+IFsnQ01EJywgJ0NNRCddDQogICAgICAgIA0KICAgIChDb250cmFzdCB3aXRoIGV4YW1wbGUgZm9yIEx7Q2FzZWxlc3NMaXRlcmFsfS4pDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBtYXRjaFN0cmluZywgaWRlbnRDaGFycz1Ob25lICk6DQogICAgICAgIHN1cGVyKENhc2VsZXNzS2V5d29yZCxzZWxmKS5fX2luaXRfXyggbWF0Y2hTdHJpbmcsIGlkZW50Q2hhcnMsIGNhc2VsZXNzPVRydWUgKQ0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgaWYgKCAoaW5zdHJpbmdbIGxvYzpsb2Mrc2VsZi5tYXRjaExlbiBdLnVwcGVyKCkgPT0gc2VsZi5jYXNlbGVzc21hdGNoKSBhbmQNCiAgICAgICAgICAgICAobG9jID49IGxlbihpbnN0cmluZyktc2VsZi5tYXRjaExlbiBvciBpbnN0cmluZ1tsb2Mrc2VsZi5tYXRjaExlbl0udXBwZXIoKSBub3QgaW4gc2VsZi5pZGVudENoYXJzKSApOg0KICAgICAgICAgICAgcmV0dXJuIGxvYytzZWxmLm1hdGNoTGVuLCBzZWxmLm1hdGNoDQogICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KDQpjbGFzcyBDbG9zZU1hdGNoKFRva2VuKToNCiAgICAiIiINCiAgICBBIHZhcmlhdGlvbiBvbiBMe0xpdGVyYWx9IHdoaWNoIG1hdGNoZXMgImNsb3NlIiBtYXRjaGVzLCB0aGF0IGlzLCANCiAgICBzdHJpbmdzIHdpdGggYXQgbW9zdCAnbicgbWlzbWF0Y2hpbmcgY2hhcmFjdGVycy4gQ3tDbG9zZU1hdGNofSB0YWtlcyBwYXJhbWV0ZXJzOg0KICAgICAtIEN7bWF0Y2hfc3RyaW5nfSAtIHN0cmluZyB0byBiZSBtYXRjaGVkDQogICAgIC0gQ3ttYXhNaXNtYXRjaGVzfSAtIChDe2RlZmF1bHQ9MX0pIG1heGltdW0gbnVtYmVyIG9mIG1pc21hdGNoZXMgYWxsb3dlZCB0byBjb3VudCBhcyBhIG1hdGNoDQogICAgDQogICAgVGhlIHJlc3VsdHMgZnJvbSBhIHN1Y2Nlc3NmdWwgcGFyc2Ugd2lsbCBjb250YWluIHRoZSBtYXRjaGVkIHRleHQgZnJvbSB0aGUgaW5wdXQgc3RyaW5nIGFuZCB0aGUgZm9sbG93aW5nIG5hbWVkIHJlc3VsdHM6DQogICAgIC0gQ3ttaXNtYXRjaGVzfSAtIGEgbGlzdCBvZiB0aGUgcG9zaXRpb25zIHdpdGhpbiB0aGUgbWF0Y2hfc3RyaW5nIHdoZXJlIG1pc21hdGNoZXMgd2VyZSBmb3VuZA0KICAgICAtIEN7b3JpZ2luYWx9IC0gdGhlIG9yaWdpbmFsIG1hdGNoX3N0cmluZyB1c2VkIHRvIGNvbXBhcmUgYWdhaW5zdCB0aGUgaW5wdXQgc3RyaW5nDQogICAgDQogICAgSWYgQ3ttaXNtYXRjaGVzfSBpcyBhbiBlbXB0eSBsaXN0LCB0aGVuIHRoZSBtYXRjaCB3YXMgYW4gZXhhY3QgbWF0Y2guDQogICAgDQogICAgRXhhbXBsZTo6DQogICAgICAgIHBhdHQgPSBDbG9zZU1hdGNoKCJBVENBVENHQUFUR0dBIikNCiAgICAgICAgcGF0dC5wYXJzZVN0cmluZygiQVRDQVRDR0FBWEdHQSIpICMgLT4gKFsnQVRDQVRDR0FBWEdHQSddLCB7J21pc21hdGNoZXMnOiBbWzldXSwgJ29yaWdpbmFsJzogWydBVENBVENHQUFUR0dBJ119KQ0KICAgICAgICBwYXR0LnBhcnNlU3RyaW5nKCJBVENBWENHQUFYR0dBIikgIyAtPiBFeGNlcHRpb246IEV4cGVjdGVkICdBVENBVENHQUFUR0dBJyAod2l0aCB1cCB0byAxIG1pc21hdGNoZXMpIChhdCBjaGFyIDApLCAobGluZToxLCBjb2w6MSkNCg0KICAgICAgICAjIGV4YWN0IG1hdGNoDQogICAgICAgIHBhdHQucGFyc2VTdHJpbmcoIkFUQ0FUQ0dBQVRHR0EiKSAjIC0+IChbJ0FUQ0FUQ0dBQVRHR0EnXSwgeydtaXNtYXRjaGVzJzogW1tdXSwgJ29yaWdpbmFsJzogWydBVENBVENHQUFUR0dBJ119KQ0KDQogICAgICAgICMgY2xvc2UgbWF0Y2ggYWxsb3dpbmcgdXAgdG8gMiBtaXNtYXRjaGVzDQogICAgICAgIHBhdHQgPSBDbG9zZU1hdGNoKCJBVENBVENHQUFUR0dBIiwgbWF4TWlzbWF0Y2hlcz0yKQ0KICAgICAgICBwYXR0LnBhcnNlU3RyaW5nKCJBVENBWENHQUFYR0dBIikgIyAtPiAoWydBVENBWENHQUFYR0dBJ10sIHsnbWlzbWF0Y2hlcyc6IFtbNCwgOV1dLCAnb3JpZ2luYWwnOiBbJ0FUQ0FUQ0dBQVRHR0EnXX0pDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hdGNoX3N0cmluZywgbWF4TWlzbWF0Y2hlcz0xKToNCiAgICAgICAgc3VwZXIoQ2xvc2VNYXRjaCxzZWxmKS5fX2luaXRfXygpDQogICAgICAgIHNlbGYubmFtZSA9IG1hdGNoX3N0cmluZw0KICAgICAgICBzZWxmLm1hdGNoX3N0cmluZyA9IG1hdGNoX3N0cmluZw0KICAgICAgICBzZWxmLm1heE1pc21hdGNoZXMgPSBtYXhNaXNtYXRjaGVzDQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkICVyICh3aXRoIHVwIHRvICVkIG1pc21hdGNoZXMpIiAlIChzZWxmLm1hdGNoX3N0cmluZywgc2VsZi5tYXhNaXNtYXRjaGVzKQ0KICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBGYWxzZQ0KICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gRmFsc2UNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIHN0YXJ0ID0gbG9jDQogICAgICAgIGluc3RybGVuID0gbGVuKGluc3RyaW5nKQ0KICAgICAgICBtYXhsb2MgPSBzdGFydCArIGxlbihzZWxmLm1hdGNoX3N0cmluZykNCg0KICAgICAgICBpZiBtYXhsb2MgPD0gaW5zdHJsZW46DQogICAgICAgICAgICBtYXRjaF9zdHJpbmcgPSBzZWxmLm1hdGNoX3N0cmluZw0KICAgICAgICAgICAgbWF0Y2hfc3RyaW5nbG9jID0gMA0KICAgICAgICAgICAgbWlzbWF0Y2hlcyA9IFtdDQogICAgICAgICAgICBtYXhNaXNtYXRjaGVzID0gc2VsZi5tYXhNaXNtYXRjaGVzDQoNCiAgICAgICAgICAgIGZvciBtYXRjaF9zdHJpbmdsb2Msc19tIGluIGVudW1lcmF0ZSh6aXAoaW5zdHJpbmdbbG9jOm1heGxvY10sIHNlbGYubWF0Y2hfc3RyaW5nKSk6DQogICAgICAgICAgICAgICAgc3JjLG1hdCA9IHNfbQ0KICAgICAgICAgICAgICAgIGlmIHNyYyAhPSBtYXQ6DQogICAgICAgICAgICAgICAgICAgIG1pc21hdGNoZXMuYXBwZW5kKG1hdGNoX3N0cmluZ2xvYykNCiAgICAgICAgICAgICAgICAgICAgaWYgbGVuKG1pc21hdGNoZXMpID4gbWF4TWlzbWF0Y2hlczoNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIGxvYyA9IG1hdGNoX3N0cmluZ2xvYyArIDENCiAgICAgICAgICAgICAgICByZXN1bHRzID0gUGFyc2VSZXN1bHRzKFtpbnN0cmluZ1tzdGFydDpsb2NdXSkNCiAgICAgICAgICAgICAgICByZXN1bHRzWydvcmlnaW5hbCddID0gc2VsZi5tYXRjaF9zdHJpbmcNCiAgICAgICAgICAgICAgICByZXN1bHRzWydtaXNtYXRjaGVzJ10gPSBtaXNtYXRjaGVzDQogICAgICAgICAgICAgICAgcmV0dXJuIGxvYywgcmVzdWx0cw0KDQogICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KDQoNCmNsYXNzIFdvcmQoVG9rZW4pOg0KICAgICIiIg0KICAgIFRva2VuIGZvciBtYXRjaGluZyB3b3JkcyBjb21wb3NlZCBvZiBhbGxvd2VkIGNoYXJhY3RlciBzZXRzLg0KICAgIERlZmluZWQgd2l0aCBzdHJpbmcgY29udGFpbmluZyBhbGwgYWxsb3dlZCBpbml0aWFsIGNoYXJhY3RlcnMsDQogICAgYW4gb3B0aW9uYWwgc3RyaW5nIGNvbnRhaW5pbmcgYWxsb3dlZCBib2R5IGNoYXJhY3RlcnMgKGlmIG9taXR0ZWQsDQogICAgZGVmYXVsdHMgdG8gdGhlIGluaXRpYWwgY2hhcmFjdGVyIHNldCksIGFuZCBhbiBvcHRpb25hbCBtaW5pbXVtLA0KICAgIG1heGltdW0sIGFuZC9vciBleGFjdCBsZW5ndGguICBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgQ3ttaW59IGlzIDEgKGENCiAgICBtaW5pbXVtIHZhbHVlIDwgMSBpcyBub3QgdmFsaWQpOyB0aGUgZGVmYXVsdCB2YWx1ZXMgZm9yIEN7bWF4fSBhbmQgQ3tleGFjdH0NCiAgICBhcmUgMCwgbWVhbmluZyBubyBtYXhpbXVtIG9yIGV4YWN0IGxlbmd0aCByZXN0cmljdGlvbi4gQW4gb3B0aW9uYWwNCiAgICBDe2V4Y2x1ZGVDaGFyc30gcGFyYW1ldGVyIGNhbiBsaXN0IGNoYXJhY3RlcnMgdGhhdCBtaWdodCBiZSBmb3VuZCBpbiANCiAgICB0aGUgaW5wdXQgQ3tib2R5Q2hhcnN9IHN0cmluZzsgdXNlZnVsIHRvIGRlZmluZSBhIHdvcmQgb2YgYWxsIHByaW50YWJsZXMNCiAgICBleGNlcHQgZm9yIG9uZSBvciB0d28gY2hhcmFjdGVycywgZm9yIGluc3RhbmNlLg0KICAgIA0KICAgIEx7c3JhbmdlfSBpcyB1c2VmdWwgZm9yIGRlZmluaW5nIGN1c3RvbSBjaGFyYWN0ZXIgc2V0IHN0cmluZ3MgZm9yIGRlZmluaW5nIA0KICAgIEN7V29yZH0gZXhwcmVzc2lvbnMsIHVzaW5nIHJhbmdlIG5vdGF0aW9uIGZyb20gcmVndWxhciBleHByZXNzaW9uIGNoYXJhY3RlciBzZXRzLg0KICAgIA0KICAgIEEgY29tbW9uIG1pc3Rha2UgaXMgdG8gdXNlIEN7V29yZH0gdG8gbWF0Y2ggYSBzcGVjaWZpYyBsaXRlcmFsIHN0cmluZywgYXMgaW4gDQogICAgQ3tXb3JkKCJBZGRyZXNzIil9LiBSZW1lbWJlciB0aGF0IEN7V29yZH0gdXNlcyB0aGUgc3RyaW5nIGFyZ3VtZW50IHRvIGRlZmluZQ0KICAgIEl7c2V0c30gb2YgbWF0Y2hhYmxlIGNoYXJhY3RlcnMuIFRoaXMgZXhwcmVzc2lvbiB3b3VsZCBtYXRjaCAiQWRkIiwgIkFBQSIsDQogICAgImRBcmVkIiwgb3IgYW55IG90aGVyIHdvcmQgbWFkZSB1cCBvZiB0aGUgY2hhcmFjdGVycyAnQScsICdkJywgJ3InLCAnZScsIGFuZCAncycuDQogICAgVG8gbWF0Y2ggYW4gZXhhY3QgbGl0ZXJhbCBzdHJpbmcsIHVzZSBMe0xpdGVyYWx9IG9yIEx7S2V5d29yZH0uDQoNCiAgICBweXBhcnNpbmcgaW5jbHVkZXMgaGVscGVyIHN0cmluZ3MgZm9yIGJ1aWxkaW5nIFdvcmRzOg0KICAgICAtIEx7YWxwaGFzfQ0KICAgICAtIEx7bnVtc30NCiAgICAgLSBMe2FscGhhbnVtc30NCiAgICAgLSBMe2hleG51bXN9DQogICAgIC0gTHthbHBoYXM4Yml0fSAoYWxwaGFiZXRpYyBjaGFyYWN0ZXJzIGluIEFTQ0lJIHJhbmdlIDEyOC0yNTUgLSBhY2NlbnRlZCwgdGlsZGVkLCB1bWxhdXRlZCwgZXRjLikNCiAgICAgLSBMe3B1bmM4Yml0fSAobm9uLWFscGhhYmV0aWMgY2hhcmFjdGVycyBpbiBBU0NJSSByYW5nZSAxMjgtMjU1IC0gY3VycmVuY3ksIHN5bWJvbHMsIHN1cGVyc2NyaXB0cywgZGlhY3JpdGljYWxzLCBldGMuKQ0KICAgICAtIEx7cHJpbnRhYmxlc30gKGFueSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIpDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgIyBhIHdvcmQgY29tcG9zZWQgb2YgZGlnaXRzDQogICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpICMgZXF1aXZhbGVudCB0byBXb3JkKCIwMTIzNDU2Nzg5Iikgb3IgV29yZChzcmFuZ2UoIjAtOSIpKQ0KICAgICAgICANCiAgICAgICAgIyBhIHdvcmQgd2l0aCBhIGxlYWRpbmcgY2FwaXRhbCwgYW5kIHplcm8gb3IgbW9yZSBsb3dlcmNhc2UNCiAgICAgICAgY2FwaXRhbF93b3JkID0gV29yZChhbHBoYXMudXBwZXIoKSwgYWxwaGFzLmxvd2VyKCkpDQoNCiAgICAgICAgIyBob3N0bmFtZXMgYXJlIGFscGhhbnVtZXJpYywgd2l0aCBsZWFkaW5nIGFscGhhLCBhbmQgJy0nDQogICAgICAgIGhvc3RuYW1lID0gV29yZChhbHBoYXMsIGFscGhhbnVtcysnLScpDQogICAgICAgIA0KICAgICAgICAjIHJvbWFuIG51bWVyYWwgKG5vdCBhIHN0cmljdCBwYXJzZXIsIGFjY2VwdHMgaW52YWxpZCBtaXggb2YgY2hhcmFjdGVycykNCiAgICAgICAgcm9tYW4gPSBXb3JkKCJJVlhMQ0RNIikNCiAgICAgICAgDQogICAgICAgICMgYW55IHN0cmluZyBvZiBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXJzLCBleGNlcHQgZm9yICcsJw0KICAgICAgICBjc3ZfdmFsdWUgPSBXb3JkKHByaW50YWJsZXMsIGV4Y2x1ZGVDaGFycz0iLCIpDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBpbml0Q2hhcnMsIGJvZHlDaGFycz1Ob25lLCBtaW49MSwgbWF4PTAsIGV4YWN0PTAsIGFzS2V5d29yZD1GYWxzZSwgZXhjbHVkZUNoYXJzPU5vbmUgKToNCiAgICAgICAgc3VwZXIoV29yZCxzZWxmKS5fX2luaXRfXygpDQogICAgICAgIGlmIGV4Y2x1ZGVDaGFyczoNCiAgICAgICAgICAgIGluaXRDaGFycyA9ICcnLmpvaW4oYyBmb3IgYyBpbiBpbml0Q2hhcnMgaWYgYyBub3QgaW4gZXhjbHVkZUNoYXJzKQ0KICAgICAgICAgICAgaWYgYm9keUNoYXJzOg0KICAgICAgICAgICAgICAgIGJvZHlDaGFycyA9ICcnLmpvaW4oYyBmb3IgYyBpbiBib2R5Q2hhcnMgaWYgYyBub3QgaW4gZXhjbHVkZUNoYXJzKQ0KICAgICAgICBzZWxmLmluaXRDaGFyc09yaWcgPSBpbml0Q2hhcnMNCiAgICAgICAgc2VsZi5pbml0Q2hhcnMgPSBzZXQoaW5pdENoYXJzKQ0KICAgICAgICBpZiBib2R5Q2hhcnMgOg0KICAgICAgICAgICAgc2VsZi5ib2R5Q2hhcnNPcmlnID0gYm9keUNoYXJzDQogICAgICAgICAgICBzZWxmLmJvZHlDaGFycyA9IHNldChib2R5Q2hhcnMpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBzZWxmLmJvZHlDaGFyc09yaWcgPSBpbml0Q2hhcnMNCiAgICAgICAgICAgIHNlbGYuYm9keUNoYXJzID0gc2V0KGluaXRDaGFycykNCg0KICAgICAgICBzZWxmLm1heFNwZWNpZmllZCA9IG1heCA+IDANCg0KICAgICAgICBpZiBtaW4gPCAxOg0KICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiY2Fubm90IHNwZWNpZnkgYSBtaW5pbXVtIGxlbmd0aCA8IDE7IHVzZSBPcHRpb25hbChXb3JkKCkpIGlmIHplcm8tbGVuZ3RoIHdvcmQgaXMgcGVybWl0dGVkIikNCg0KICAgICAgICBzZWxmLm1pbkxlbiA9IG1pbg0KDQogICAgICAgIGlmIG1heCA+IDA6DQogICAgICAgICAgICBzZWxmLm1heExlbiA9IG1heA0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgc2VsZi5tYXhMZW4gPSBfTUFYX0lOVA0KDQogICAgICAgIGlmIGV4YWN0ID4gMDoNCiAgICAgICAgICAgIHNlbGYubWF4TGVuID0gZXhhY3QNCiAgICAgICAgICAgIHNlbGYubWluTGVuID0gZXhhY3QNCg0KICAgICAgICBzZWxmLm5hbWUgPSBfdXN0cihzZWxmKQ0KICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCAiICsgc2VsZi5uYW1lDQogICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IEZhbHNlDQogICAgICAgIHNlbGYuYXNLZXl3b3JkID0gYXNLZXl3b3JkDQoNCiAgICAgICAgaWYgJyAnIG5vdCBpbiBzZWxmLmluaXRDaGFyc09yaWcrc2VsZi5ib2R5Q2hhcnNPcmlnIGFuZCAobWluPT0xIGFuZCBtYXg9PTAgYW5kIGV4YWN0PT0wKToNCiAgICAgICAgICAgIGlmIHNlbGYuYm9keUNoYXJzT3JpZyA9PSBzZWxmLmluaXRDaGFyc09yaWc6DQogICAgICAgICAgICAgICAgc2VsZi5yZVN0cmluZyA9ICJbJXNdKyIgJSBfZXNjYXBlUmVnZXhSYW5nZUNoYXJzKHNlbGYuaW5pdENoYXJzT3JpZykNCiAgICAgICAgICAgIGVsaWYgbGVuKHNlbGYuaW5pdENoYXJzT3JpZykgPT0gMToNCiAgICAgICAgICAgICAgICBzZWxmLnJlU3RyaW5nID0gIiVzWyVzXSoiICUgXA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmUuZXNjYXBlKHNlbGYuaW5pdENoYXJzT3JpZyksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9lc2NhcGVSZWdleFJhbmdlQ2hhcnMoc2VsZi5ib2R5Q2hhcnNPcmlnKSwpDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHNlbGYucmVTdHJpbmcgPSAiWyVzXVslc10qIiAlIFwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9lc2NhcGVSZWdleFJhbmdlQ2hhcnMoc2VsZi5pbml0Q2hhcnNPcmlnKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2VzY2FwZVJlZ2V4UmFuZ2VDaGFycyhzZWxmLmJvZHlDaGFyc09yaWcpLCkNCiAgICAgICAgICAgIGlmIHNlbGYuYXNLZXl3b3JkOg0KICAgICAgICAgICAgICAgIHNlbGYucmVTdHJpbmcgPSByIlxiIitzZWxmLnJlU3RyaW5nK3IiXGIiDQogICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgc2VsZi5yZSA9IHJlLmNvbXBpbGUoIHNlbGYucmVTdHJpbmcgKQ0KICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoNCiAgICAgICAgICAgICAgICBzZWxmLnJlID0gTm9uZQ0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgaWYgc2VsZi5yZToNCiAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYucmUubWF0Y2goaW5zdHJpbmcsbG9jKQ0KICAgICAgICAgICAgaWYgbm90IHJlc3VsdDoNCiAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCg0KICAgICAgICAgICAgbG9jID0gcmVzdWx0LmVuZCgpDQogICAgICAgICAgICByZXR1cm4gbG9jLCByZXN1bHQuZ3JvdXAoKQ0KDQogICAgICAgIGlmIG5vdChpbnN0cmluZ1sgbG9jIF0gaW4gc2VsZi5pbml0Q2hhcnMpOg0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQoNCiAgICAgICAgc3RhcnQgPSBsb2MNCiAgICAgICAgbG9jICs9IDENCiAgICAgICAgaW5zdHJsZW4gPSBsZW4oaW5zdHJpbmcpDQogICAgICAgIGJvZHljaGFycyA9IHNlbGYuYm9keUNoYXJzDQogICAgICAgIG1heGxvYyA9IHN0YXJ0ICsgc2VsZi5tYXhMZW4NCiAgICAgICAgbWF4bG9jID0gbWluKCBtYXhsb2MsIGluc3RybGVuICkNCiAgICAgICAgd2hpbGUgbG9jIDwgbWF4bG9jIGFuZCBpbnN0cmluZ1tsb2NdIGluIGJvZHljaGFyczoNCiAgICAgICAgICAgIGxvYyArPSAxDQoNCiAgICAgICAgdGhyb3dFeGNlcHRpb24gPSBGYWxzZQ0KICAgICAgICBpZiBsb2MgLSBzdGFydCA8IHNlbGYubWluTGVuOg0KICAgICAgICAgICAgdGhyb3dFeGNlcHRpb24gPSBUcnVlDQogICAgICAgIGlmIHNlbGYubWF4U3BlY2lmaWVkIGFuZCBsb2MgPCBpbnN0cmxlbiBhbmQgaW5zdHJpbmdbbG9jXSBpbiBib2R5Y2hhcnM6DQogICAgICAgICAgICB0aHJvd0V4Y2VwdGlvbiA9IFRydWUNCiAgICAgICAgaWYgc2VsZi5hc0tleXdvcmQ6DQogICAgICAgICAgICBpZiAoc3RhcnQ+MCBhbmQgaW5zdHJpbmdbc3RhcnQtMV0gaW4gYm9keWNoYXJzKSBvciAobG9jPGluc3RybGVuIGFuZCBpbnN0cmluZ1tsb2NdIGluIGJvZHljaGFycyk6DQogICAgICAgICAgICAgICAgdGhyb3dFeGNlcHRpb24gPSBUcnVlDQoNCiAgICAgICAgaWYgdGhyb3dFeGNlcHRpb246DQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCg0KICAgICAgICByZXR1cm4gbG9jLCBpbnN0cmluZ1tzdGFydDpsb2NdDQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICB0cnk6DQogICAgICAgICAgICByZXR1cm4gc3VwZXIoV29yZCxzZWxmKS5fX3N0cl9fKCkNCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoNCiAgICAgICAgICAgIHBhc3MNCg0KDQogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lOg0KDQogICAgICAgICAgICBkZWYgY2hhcnNBc1N0cihzKToNCiAgICAgICAgICAgICAgICBpZiBsZW4ocyk+NDoNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNbOjRdKyIuLi4iDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMNCg0KICAgICAgICAgICAgaWYgKCBzZWxmLmluaXRDaGFyc09yaWcgIT0gc2VsZi5ib2R5Q2hhcnNPcmlnICk6DQogICAgICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gIlc6KCVzLCVzKSIgJSAoIGNoYXJzQXNTdHIoc2VsZi5pbml0Q2hhcnNPcmlnKSwgY2hhcnNBc1N0cihzZWxmLmJvZHlDaGFyc09yaWcpICkNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gIlc6KCVzKSIgJSBjaGFyc0FzU3RyKHNlbGYuaW5pdENoYXJzT3JpZykNCg0KICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByDQoNCg0KY2xhc3MgUmVnZXgoVG9rZW4pOg0KICAgIHIiIiINCiAgICBUb2tlbiBmb3IgbWF0Y2hpbmcgc3RyaW5ncyB0aGF0IG1hdGNoIGEgZ2l2ZW4gcmVndWxhciBleHByZXNzaW9uLg0KICAgIERlZmluZWQgd2l0aCBzdHJpbmcgc3BlY2lmeWluZyB0aGUgcmVndWxhciBleHByZXNzaW9uIGluIGEgZm9ybSByZWNvZ25pemVkIGJ5IHRoZSBpbmJ1aWx0IFB5dGhvbiByZSBtb2R1bGUuDQogICAgSWYgdGhlIGdpdmVuIHJlZ2V4IGNvbnRhaW5zIG5hbWVkIGdyb3VwcyAoZGVmaW5lZCB1c2luZyBDeyg/UDxuYW1lPi4uLil9KSwgdGhlc2Ugd2lsbCBiZSBwcmVzZXJ2ZWQgYXMgDQogICAgbmFtZWQgcGFyc2UgcmVzdWx0cy4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICByZWFsbnVtID0gUmVnZXgociJbKy1dP1xkK1wuXGQqIikNCiAgICAgICAgZGF0ZSA9IFJlZ2V4KHInKD9QPHllYXI+XGR7NH0pLSg/UDxtb250aD5cZFxkPyktKD9QPGRheT5cZFxkPyknKQ0KICAgICAgICAjIHJlZjogaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8yNjczOTkvaG93LWRvLXlvdS1tYXRjaC1vbmx5LXZhbGlkLXJvbWFuLW51bWVyYWxzLXdpdGgtYS1yZWd1bGFyLWV4cHJlc3Npb24NCiAgICAgICAgcm9tYW4gPSBSZWdleChyIk17MCw0fShDTXxDRHxEP0N7MCwzfSkoWEN8WEx8TD9YezAsM30pKElYfElWfFY/SXswLDN9KSIpDQogICAgIiIiDQogICAgY29tcGlsZWRSRXR5cGUgPSB0eXBlKHJlLmNvbXBpbGUoIltBLVpdIikpDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBwYXR0ZXJuLCBmbGFncz0wKToNCiAgICAgICAgIiIiVGhlIHBhcmFtZXRlcnMgQ3twYXR0ZXJufSBhbmQgQ3tmbGFnc30gYXJlIHBhc3NlZCB0byB0aGUgQ3tyZS5jb21waWxlKCl9IGZ1bmN0aW9uIGFzLWlzLiBTZWUgdGhlIFB5dGhvbiBDe3JlfSBtb2R1bGUgZm9yIGFuIGV4cGxhbmF0aW9uIG9mIHRoZSBhY2NlcHRhYmxlIHBhdHRlcm5zIGFuZCBmbGFncy4iIiINCiAgICAgICAgc3VwZXIoUmVnZXgsc2VsZikuX19pbml0X18oKQ0KDQogICAgICAgIGlmIGlzaW5zdGFuY2UocGF0dGVybiwgYmFzZXN0cmluZyk6DQogICAgICAgICAgICBpZiBub3QgcGF0dGVybjoNCiAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJudWxsIHN0cmluZyBwYXNzZWQgdG8gUmVnZXg7IHVzZSBFbXB0eSgpIGluc3RlYWQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQ0KDQogICAgICAgICAgICBzZWxmLnBhdHRlcm4gPSBwYXR0ZXJuDQogICAgICAgICAgICBzZWxmLmZsYWdzID0gZmxhZ3MNCg0KICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgIHNlbGYucmUgPSByZS5jb21waWxlKHNlbGYucGF0dGVybiwgc2VsZi5mbGFncykNCiAgICAgICAgICAgICAgICBzZWxmLnJlU3RyaW5nID0gc2VsZi5wYXR0ZXJuDQogICAgICAgICAgICBleGNlcHQgc3JlX2NvbnN0YW50cy5lcnJvcjoNCiAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJpbnZhbGlkIHBhdHRlcm4gKCVzKSBwYXNzZWQgdG8gUmVnZXgiICUgcGF0dGVybiwNCiAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQ0KICAgICAgICAgICAgICAgIHJhaXNlDQoNCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKHBhdHRlcm4sIFJlZ2V4LmNvbXBpbGVkUkV0eXBlKToNCiAgICAgICAgICAgIHNlbGYucmUgPSBwYXR0ZXJuDQogICAgICAgICAgICBzZWxmLnBhdHRlcm4gPSBcDQogICAgICAgICAgICBzZWxmLnJlU3RyaW5nID0gc3RyKHBhdHRlcm4pDQogICAgICAgICAgICBzZWxmLmZsYWdzID0gZmxhZ3MNCiAgICAgICAgICAgIA0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiUmVnZXggbWF5IG9ubHkgYmUgY29uc3RydWN0ZWQgd2l0aCBhIHN0cmluZyBvciBhIGNvbXBpbGVkIFJFIG9iamVjdCIpDQoNCiAgICAgICAgc2VsZi5uYW1lID0gX3VzdHIoc2VsZikNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgIiArIHNlbGYubmFtZQ0KICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBGYWxzZQ0KICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gVHJ1ZQ0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgcmVzdWx0ID0gc2VsZi5yZS5tYXRjaChpbnN0cmluZyxsb2MpDQogICAgICAgIGlmIG5vdCByZXN1bHQ6DQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCg0KICAgICAgICBsb2MgPSByZXN1bHQuZW5kKCkNCiAgICAgICAgZCA9IHJlc3VsdC5ncm91cGRpY3QoKQ0KICAgICAgICByZXQgPSBQYXJzZVJlc3VsdHMocmVzdWx0Lmdyb3VwKCkpDQogICAgICAgIGlmIGQ6DQogICAgICAgICAgICBmb3IgayBpbiBkOg0KICAgICAgICAgICAgICAgIHJldFtrXSA9IGRba10NCiAgICAgICAgcmV0dXJuIGxvYyxyZXQNCg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHJldHVybiBzdXBlcihSZWdleCxzZWxmKS5fX3N0cl9fKCkNCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoNCiAgICAgICAgICAgIHBhc3MNCg0KICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZToNCiAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICJSZTooJXMpIiAlIHJlcHIoc2VsZi5wYXR0ZXJuKQ0KDQogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHINCg0KDQpjbGFzcyBRdW90ZWRTdHJpbmcoVG9rZW4pOg0KICAgIHIiIiINCiAgICBUb2tlbiBmb3IgbWF0Y2hpbmcgc3RyaW5ncyB0aGF0IGFyZSBkZWxpbWl0ZWQgYnkgcXVvdGluZyBjaGFyYWN0ZXJzLg0KICAgIA0KICAgIERlZmluZWQgd2l0aCB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6DQogICAgICAgIC0gcXVvdGVDaGFyIC0gc3RyaW5nIG9mIG9uZSBvciBtb3JlIGNoYXJhY3RlcnMgZGVmaW5pbmcgdGhlIHF1b3RlIGRlbGltaXRpbmcgc3RyaW5nDQogICAgICAgIC0gZXNjQ2hhciAtIGNoYXJhY3RlciB0byBlc2NhcGUgcXVvdGVzLCB0eXBpY2FsbHkgYmFja3NsYXNoIChkZWZhdWx0PUN7Tm9uZX0pDQogICAgICAgIC0gZXNjUXVvdGUgLSBzcGVjaWFsIHF1b3RlIHNlcXVlbmNlIHRvIGVzY2FwZSBhbiBlbWJlZGRlZCBxdW90ZSBzdHJpbmcgKHN1Y2ggYXMgU1FMJ3MgIiIgdG8gZXNjYXBlIGFuIGVtYmVkZGVkICIpIChkZWZhdWx0PUN7Tm9uZX0pDQogICAgICAgIC0gbXVsdGlsaW5lIC0gYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgcXVvdGVzIGNhbiBzcGFuIG11bHRpcGxlIGxpbmVzIChkZWZhdWx0PUN7RmFsc2V9KQ0KICAgICAgICAtIHVucXVvdGVSZXN1bHRzIC0gYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIG1hdGNoZWQgdGV4dCBzaG91bGQgYmUgdW5xdW90ZWQgKGRlZmF1bHQ9Q3tUcnVlfSkNCiAgICAgICAgLSBlbmRRdW90ZUNoYXIgLSBzdHJpbmcgb2Ygb25lIG9yIG1vcmUgY2hhcmFjdGVycyBkZWZpbmluZyB0aGUgZW5kIG9mIHRoZSBxdW90ZSBkZWxpbWl0ZWQgc3RyaW5nIChkZWZhdWx0PUN7Tm9uZX0gPT4gc2FtZSBhcyBxdW90ZUNoYXIpDQogICAgICAgIC0gY29udmVydFdoaXRlc3BhY2VFc2NhcGVzIC0gY29udmVydCBlc2NhcGVkIHdoaXRlc3BhY2UgKEN7J1x0J30sIEN7J1xuJ30sIGV0Yy4pIHRvIGFjdHVhbCB3aGl0ZXNwYWNlIChkZWZhdWx0PUN7VHJ1ZX0pDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgcXMgPSBRdW90ZWRTdHJpbmcoJyInKQ0KICAgICAgICBwcmludChxcy5zZWFyY2hTdHJpbmcoJ2xzamRmICJUaGlzIGlzIHRoZSBxdW90ZSIgc2xkamYnKSkNCiAgICAgICAgY29tcGxleF9xcyA9IFF1b3RlZFN0cmluZygne3snLCBlbmRRdW90ZUNoYXI9J319JykNCiAgICAgICAgcHJpbnQoY29tcGxleF9xcy5zZWFyY2hTdHJpbmcoJ2xzamRmIHt7VGhpcyBpcyB0aGUgInF1b3RlIn19IHNsZGpmJykpDQogICAgICAgIHNxbF9xcyA9IFF1b3RlZFN0cmluZygnIicsIGVzY1F1b3RlPSciIicpDQogICAgICAgIHByaW50KHNxbF9xcy5zZWFyY2hTdHJpbmcoJ2xzamRmICJUaGlzIGlzIHRoZSBxdW90ZSB3aXRoICIiZW1iZWRkZWQiIiBxdW90ZXMiIHNsZGpmJykpDQogICAgcHJpbnRzOjoNCiAgICAgICAgW1snVGhpcyBpcyB0aGUgcXVvdGUnXV0NCiAgICAgICAgW1snVGhpcyBpcyB0aGUgInF1b3RlIiddXQ0KICAgICAgICBbWydUaGlzIGlzIHRoZSBxdW90ZSB3aXRoICJlbWJlZGRlZCIgcXVvdGVzJ11dDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBxdW90ZUNoYXIsIGVzY0NoYXI9Tm9uZSwgZXNjUXVvdGU9Tm9uZSwgbXVsdGlsaW5lPUZhbHNlLCB1bnF1b3RlUmVzdWx0cz1UcnVlLCBlbmRRdW90ZUNoYXI9Tm9uZSwgY29udmVydFdoaXRlc3BhY2VFc2NhcGVzPVRydWUpOg0KICAgICAgICBzdXBlcihRdW90ZWRTdHJpbmcsc2VsZikuX19pbml0X18oKQ0KDQogICAgICAgICMgcmVtb3ZlIHdoaXRlIHNwYWNlIGZyb20gcXVvdGUgY2hhcnMgLSB3b250IHdvcmsgYW55d2F5DQogICAgICAgIHF1b3RlQ2hhciA9IHF1b3RlQ2hhci5zdHJpcCgpDQogICAgICAgIGlmIG5vdCBxdW90ZUNoYXI6DQogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJxdW90ZUNoYXIgY2Fubm90IGJlIHRoZSBlbXB0eSBzdHJpbmciLFN5bnRheFdhcm5pbmcsc3RhY2tsZXZlbD0yKQ0KICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IoKQ0KDQogICAgICAgIGlmIGVuZFF1b3RlQ2hhciBpcyBOb25lOg0KICAgICAgICAgICAgZW5kUXVvdGVDaGFyID0gcXVvdGVDaGFyDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBlbmRRdW90ZUNoYXIgPSBlbmRRdW90ZUNoYXIuc3RyaXAoKQ0KICAgICAgICAgICAgaWYgbm90IGVuZFF1b3RlQ2hhcjoNCiAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJlbmRRdW90ZUNoYXIgY2Fubm90IGJlIHRoZSBlbXB0eSBzdHJpbmciLFN5bnRheFdhcm5pbmcsc3RhY2tsZXZlbD0yKQ0KICAgICAgICAgICAgICAgIHJhaXNlIFN5bnRheEVycm9yKCkNCg0KICAgICAgICBzZWxmLnF1b3RlQ2hhciA9IHF1b3RlQ2hhcg0KICAgICAgICBzZWxmLnF1b3RlQ2hhckxlbiA9IGxlbihxdW90ZUNoYXIpDQogICAgICAgIHNlbGYuZmlyc3RRdW90ZUNoYXIgPSBxdW90ZUNoYXJbMF0NCiAgICAgICAgc2VsZi5lbmRRdW90ZUNoYXIgPSBlbmRRdW90ZUNoYXINCiAgICAgICAgc2VsZi5lbmRRdW90ZUNoYXJMZW4gPSBsZW4oZW5kUXVvdGVDaGFyKQ0KICAgICAgICBzZWxmLmVzY0NoYXIgPSBlc2NDaGFyDQogICAgICAgIHNlbGYuZXNjUXVvdGUgPSBlc2NRdW90ZQ0KICAgICAgICBzZWxmLnVucXVvdGVSZXN1bHRzID0gdW5xdW90ZVJlc3VsdHMNCiAgICAgICAgc2VsZi5jb252ZXJ0V2hpdGVzcGFjZUVzY2FwZXMgPSBjb252ZXJ0V2hpdGVzcGFjZUVzY2FwZXMNCg0KICAgICAgICBpZiBtdWx0aWxpbmU6DQogICAgICAgICAgICBzZWxmLmZsYWdzID0gcmUuTVVMVElMSU5FIHwgcmUuRE9UQUxMDQogICAgICAgICAgICBzZWxmLnBhdHRlcm4gPSByJyVzKD86W14lcyVzXScgJSBcDQogICAgICAgICAgICAgICAgKCByZS5lc2NhcGUoc2VsZi5xdW90ZUNoYXIpLA0KICAgICAgICAgICAgICAgICAgX2VzY2FwZVJlZ2V4UmFuZ2VDaGFycyhzZWxmLmVuZFF1b3RlQ2hhclswXSksDQogICAgICAgICAgICAgICAgICAoZXNjQ2hhciBpcyBub3QgTm9uZSBhbmQgX2VzY2FwZVJlZ2V4UmFuZ2VDaGFycyhlc2NDaGFyKSBvciAnJykgKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgc2VsZi5mbGFncyA9IDANCiAgICAgICAgICAgIHNlbGYucGF0dGVybiA9IHInJXMoPzpbXiVzXG5cciVzXScgJSBcDQogICAgICAgICAgICAgICAgKCByZS5lc2NhcGUoc2VsZi5xdW90ZUNoYXIpLA0KICAgICAgICAgICAgICAgICAgX2VzY2FwZVJlZ2V4UmFuZ2VDaGFycyhzZWxmLmVuZFF1b3RlQ2hhclswXSksDQogICAgICAgICAgICAgICAgICAoZXNjQ2hhciBpcyBub3QgTm9uZSBhbmQgX2VzY2FwZVJlZ2V4UmFuZ2VDaGFycyhlc2NDaGFyKSBvciAnJykgKQ0KICAgICAgICBpZiBsZW4oc2VsZi5lbmRRdW90ZUNoYXIpID4gMToNCiAgICAgICAgICAgIHNlbGYucGF0dGVybiArPSAoDQogICAgICAgICAgICAgICAgJ3woPzonICsgJyl8KD86Jy5qb2luKCIlc1teJXNdIiAlIChyZS5lc2NhcGUoc2VsZi5lbmRRdW90ZUNoYXJbOmldKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2VzY2FwZVJlZ2V4UmFuZ2VDaGFycyhzZWxmLmVuZFF1b3RlQ2hhcltpXSkpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5lbmRRdW90ZUNoYXIpLTEsMCwtMSkpICsgJyknDQogICAgICAgICAgICAgICAgKQ0KICAgICAgICBpZiBlc2NRdW90ZToNCiAgICAgICAgICAgIHNlbGYucGF0dGVybiArPSAocid8KD86JXMpJyAlIHJlLmVzY2FwZShlc2NRdW90ZSkpDQogICAgICAgIGlmIGVzY0NoYXI6DQogICAgICAgICAgICBzZWxmLnBhdHRlcm4gKz0gKHInfCg/OiVzLiknICUgcmUuZXNjYXBlKGVzY0NoYXIpKQ0KICAgICAgICAgICAgc2VsZi5lc2NDaGFyUmVwbGFjZVBhdHRlcm4gPSByZS5lc2NhcGUoc2VsZi5lc2NDaGFyKSsiKC4pIg0KICAgICAgICBzZWxmLnBhdHRlcm4gKz0gKHInKSolcycgJSByZS5lc2NhcGUoc2VsZi5lbmRRdW90ZUNoYXIpKQ0KDQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHNlbGYucmUgPSByZS5jb21waWxlKHNlbGYucGF0dGVybiwgc2VsZi5mbGFncykNCiAgICAgICAgICAgIHNlbGYucmVTdHJpbmcgPSBzZWxmLnBhdHRlcm4NCiAgICAgICAgZXhjZXB0IHNyZV9jb25zdGFudHMuZXJyb3I6DQogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJpbnZhbGlkIHBhdHRlcm4gKCVzKSBwYXNzZWQgdG8gUmVnZXgiICUgc2VsZi5wYXR0ZXJuLA0KICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikNCiAgICAgICAgICAgIHJhaXNlDQoNCiAgICAgICAgc2VsZi5uYW1lID0gX3VzdHIoc2VsZikNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgIiArIHNlbGYubmFtZQ0KICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBGYWxzZQ0KICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gVHJ1ZQ0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgcmVzdWx0ID0gaW5zdHJpbmdbbG9jXSA9PSBzZWxmLmZpcnN0UXVvdGVDaGFyIGFuZCBzZWxmLnJlLm1hdGNoKGluc3RyaW5nLGxvYykgb3IgTm9uZQ0KICAgICAgICBpZiBub3QgcmVzdWx0Og0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQoNCiAgICAgICAgbG9jID0gcmVzdWx0LmVuZCgpDQogICAgICAgIHJldCA9IHJlc3VsdC5ncm91cCgpDQoNCiAgICAgICAgaWYgc2VsZi51bnF1b3RlUmVzdWx0czoNCg0KICAgICAgICAgICAgIyBzdHJpcCBvZmYgcXVvdGVzDQogICAgICAgICAgICByZXQgPSByZXRbc2VsZi5xdW90ZUNoYXJMZW46LXNlbGYuZW5kUXVvdGVDaGFyTGVuXQ0KDQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHJldCxiYXNlc3RyaW5nKToNCiAgICAgICAgICAgICAgICAjIHJlcGxhY2UgZXNjYXBlZCB3aGl0ZXNwYWNlDQogICAgICAgICAgICAgICAgaWYgJ1xcJyBpbiByZXQgYW5kIHNlbGYuY29udmVydFdoaXRlc3BhY2VFc2NhcGVzOg0KICAgICAgICAgICAgICAgICAgICB3c19tYXAgPSB7DQogICAgICAgICAgICAgICAgICAgICAgICByJ1x0JyA6ICdcdCcsDQogICAgICAgICAgICAgICAgICAgICAgICByJ1xuJyA6ICdcbicsDQogICAgICAgICAgICAgICAgICAgICAgICByJ1xmJyA6ICdcZicsDQogICAgICAgICAgICAgICAgICAgICAgICByJ1xyJyA6ICdccicsDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZm9yIHdzbGl0LHdzY2hhciBpbiB3c19tYXAuaXRlbXMoKToNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IHJldC5yZXBsYWNlKHdzbGl0LCB3c2NoYXIpDQoNCiAgICAgICAgICAgICAgICAjIHJlcGxhY2UgZXNjYXBlZCBjaGFyYWN0ZXJzDQogICAgICAgICAgICAgICAgaWYgc2VsZi5lc2NDaGFyOg0KICAgICAgICAgICAgICAgICAgICByZXQgPSByZS5zdWIoc2VsZi5lc2NDaGFyUmVwbGFjZVBhdHRlcm4sIHIiXGc8MT4iLCByZXQpDQoNCiAgICAgICAgICAgICAgICAjIHJlcGxhY2UgZXNjYXBlZCBxdW90ZXMNCiAgICAgICAgICAgICAgICBpZiBzZWxmLmVzY1F1b3RlOg0KICAgICAgICAgICAgICAgICAgICByZXQgPSByZXQucmVwbGFjZShzZWxmLmVzY1F1b3RlLCBzZWxmLmVuZFF1b3RlQ2hhcikNCg0KICAgICAgICByZXR1cm4gbG9jLCByZXQNCg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHJldHVybiBzdXBlcihRdW90ZWRTdHJpbmcsc2VsZikuX19zdHJfXygpDQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246DQogICAgICAgICAgICBwYXNzDQoNCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6DQogICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAicXVvdGVkIHN0cmluZywgc3RhcnRpbmcgd2l0aCAlcyBlbmRpbmcgd2l0aCAlcyIgJSAoc2VsZi5xdW90ZUNoYXIsIHNlbGYuZW5kUXVvdGVDaGFyKQ0KDQogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHINCg0KDQpjbGFzcyBDaGFyc05vdEluKFRva2VuKToNCiAgICAiIiINCiAgICBUb2tlbiBmb3IgbWF0Y2hpbmcgd29yZHMgY29tcG9zZWQgb2YgY2hhcmFjdGVycyBJe25vdH0gaW4gYSBnaXZlbiBzZXQgKHdpbGwNCiAgICBpbmNsdWRlIHdoaXRlc3BhY2UgaW4gbWF0Y2hlZCBjaGFyYWN0ZXJzIGlmIG5vdCBsaXN0ZWQgaW4gdGhlIHByb3ZpZGVkIGV4Y2x1c2lvbiBzZXQgLSBzZWUgZXhhbXBsZSkuDQogICAgRGVmaW5lZCB3aXRoIHN0cmluZyBjb250YWluaW5nIGFsbCBkaXNhbGxvd2VkIGNoYXJhY3RlcnMsIGFuZCBhbiBvcHRpb25hbA0KICAgIG1pbmltdW0sIG1heGltdW0sIGFuZC9vciBleGFjdCBsZW5ndGguICBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgQ3ttaW59IGlzIDEgKGENCiAgICBtaW5pbXVtIHZhbHVlIDwgMSBpcyBub3QgdmFsaWQpOyB0aGUgZGVmYXVsdCB2YWx1ZXMgZm9yIEN7bWF4fSBhbmQgQ3tleGFjdH0NCiAgICBhcmUgMCwgbWVhbmluZyBubyBtYXhpbXVtIG9yIGV4YWN0IGxlbmd0aCByZXN0cmljdGlvbi4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICAjIGRlZmluZSBhIGNvbW1hLXNlcGFyYXRlZC12YWx1ZSBhcyBhbnl0aGluZyB0aGF0IGlzIG5vdCBhICcsJw0KICAgICAgICBjc3ZfdmFsdWUgPSBDaGFyc05vdEluKCcsJykNCiAgICAgICAgcHJpbnQoZGVsaW1pdGVkTGlzdChjc3ZfdmFsdWUpLnBhcnNlU3RyaW5nKCJka2xzLGxzZGtqZixzMTIgMzQsQCEjLDIxMyIpKQ0KICAgIHByaW50czo6DQogICAgICAgIFsnZGtscycsICdsc2RramYnLCAnczEyIDM0JywgJ0AhIycsICcyMTMnXQ0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgbm90Q2hhcnMsIG1pbj0xLCBtYXg9MCwgZXhhY3Q9MCApOg0KICAgICAgICBzdXBlcihDaGFyc05vdEluLHNlbGYpLl9faW5pdF9fKCkNCiAgICAgICAgc2VsZi5za2lwV2hpdGVzcGFjZSA9IEZhbHNlDQogICAgICAgIHNlbGYubm90Q2hhcnMgPSBub3RDaGFycw0KDQogICAgICAgIGlmIG1pbiA8IDE6DQogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJjYW5ub3Qgc3BlY2lmeSBhIG1pbmltdW0gbGVuZ3RoIDwgMTsgdXNlIE9wdGlvbmFsKENoYXJzTm90SW4oKSkgaWYgemVyby1sZW5ndGggY2hhciBncm91cCBpcyBwZXJtaXR0ZWQiKQ0KDQogICAgICAgIHNlbGYubWluTGVuID0gbWluDQoNCiAgICAgICAgaWYgbWF4ID4gMDoNCiAgICAgICAgICAgIHNlbGYubWF4TGVuID0gbWF4DQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBzZWxmLm1heExlbiA9IF9NQVhfSU5UDQoNCiAgICAgICAgaWYgZXhhY3QgPiAwOg0KICAgICAgICAgICAgc2VsZi5tYXhMZW4gPSBleGFjdA0KICAgICAgICAgICAgc2VsZi5taW5MZW4gPSBleGFjdA0KDQogICAgICAgIHNlbGYubmFtZSA9IF91c3RyKHNlbGYpDQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkICIgKyBzZWxmLm5hbWUNCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9ICggc2VsZi5taW5MZW4gPT0gMCApDQogICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IEZhbHNlDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBpZiBpbnN0cmluZ1tsb2NdIGluIHNlbGYubm90Q2hhcnM6DQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCg0KICAgICAgICBzdGFydCA9IGxvYw0KICAgICAgICBsb2MgKz0gMQ0KICAgICAgICBub3RjaGFycyA9IHNlbGYubm90Q2hhcnMNCiAgICAgICAgbWF4bGVuID0gbWluKCBzdGFydCtzZWxmLm1heExlbiwgbGVuKGluc3RyaW5nKSApDQogICAgICAgIHdoaWxlIGxvYyA8IG1heGxlbiBhbmQgXA0KICAgICAgICAgICAgICAoaW5zdHJpbmdbbG9jXSBub3QgaW4gbm90Y2hhcnMpOg0KICAgICAgICAgICAgbG9jICs9IDENCg0KICAgICAgICBpZiBsb2MgLSBzdGFydCA8IHNlbGYubWluTGVuOg0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQoNCiAgICAgICAgcmV0dXJuIGxvYywgaW5zdHJpbmdbc3RhcnQ6bG9jXQ0KDQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgcmV0dXJuIHN1cGVyKENoYXJzTm90SW4sIHNlbGYpLl9fc3RyX18oKQ0KICAgICAgICBleGNlcHQgRXhjZXB0aW9uOg0KICAgICAgICAgICAgcGFzcw0KDQogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lOg0KICAgICAgICAgICAgaWYgbGVuKHNlbGYubm90Q2hhcnMpID4gNDoNCiAgICAgICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAiIVc6KCVzLi4uKSIgJSBzZWxmLm5vdENoYXJzWzo0XQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAiIVc6KCVzKSIgJSBzZWxmLm5vdENoYXJzDQoNCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcg0KDQpjbGFzcyBXaGl0ZShUb2tlbik6DQogICAgIiIiDQogICAgU3BlY2lhbCBtYXRjaGluZyBjbGFzcyBmb3IgbWF0Y2hpbmcgd2hpdGVzcGFjZS4gIE5vcm1hbGx5LCB3aGl0ZXNwYWNlIGlzIGlnbm9yZWQNCiAgICBieSBweXBhcnNpbmcgZ3JhbW1hcnMuICBUaGlzIGNsYXNzIGlzIGluY2x1ZGVkIHdoZW4gc29tZSB3aGl0ZXNwYWNlIHN0cnVjdHVyZXMNCiAgICBhcmUgc2lnbmlmaWNhbnQuICBEZWZpbmUgd2l0aCBhIHN0cmluZyBjb250YWluaW5nIHRoZSB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgdG8gYmUNCiAgICBtYXRjaGVkOyBkZWZhdWx0IGlzIEN7IiBcXHRcXHJcXG4ifS4gIEFsc28gdGFrZXMgb3B0aW9uYWwgQ3ttaW59LCBDe21heH0sIGFuZCBDe2V4YWN0fSBhcmd1bWVudHMsDQogICAgYXMgZGVmaW5lZCBmb3IgdGhlIEN7THtXb3JkfX0gY2xhc3MuDQogICAgIiIiDQogICAgd2hpdGVTdHJzID0gew0KICAgICAgICAiICIgOiAiPFNQQz4iLA0KICAgICAgICAiXHQiOiAiPFRBQj4iLA0KICAgICAgICAiXG4iOiAiPExGPiIsDQogICAgICAgICJcciI6ICI8Q1I+IiwNCiAgICAgICAgIlxmIjogIjxGRj4iLA0KICAgICAgICB9DQogICAgZGVmIF9faW5pdF9fKHNlbGYsIHdzPSIgXHRcclxuIiwgbWluPTEsIG1heD0wLCBleGFjdD0wKToNCiAgICAgICAgc3VwZXIoV2hpdGUsc2VsZikuX19pbml0X18oKQ0KICAgICAgICBzZWxmLm1hdGNoV2hpdGUgPSB3cw0KICAgICAgICBzZWxmLnNldFdoaXRlc3BhY2VDaGFycyggIiIuam9pbihjIGZvciBjIGluIHNlbGYud2hpdGVDaGFycyBpZiBjIG5vdCBpbiBzZWxmLm1hdGNoV2hpdGUpICkNCiAgICAgICAgI34gc2VsZi5sZWF2ZVdoaXRlc3BhY2UoKQ0KICAgICAgICBzZWxmLm5hbWUgPSAoIiIuam9pbihXaGl0ZS53aGl0ZVN0cnNbY10gZm9yIGMgaW4gc2VsZi5tYXRjaFdoaXRlKSkNCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgIiArIHNlbGYubmFtZQ0KDQogICAgICAgIHNlbGYubWluTGVuID0gbWluDQoNCiAgICAgICAgaWYgbWF4ID4gMDoNCiAgICAgICAgICAgIHNlbGYubWF4TGVuID0gbWF4DQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBzZWxmLm1heExlbiA9IF9NQVhfSU5UDQoNCiAgICAgICAgaWYgZXhhY3QgPiAwOg0KICAgICAgICAgICAgc2VsZi5tYXhMZW4gPSBleGFjdA0KICAgICAgICAgICAgc2VsZi5taW5MZW4gPSBleGFjdA0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgaWYgbm90KGluc3RyaW5nWyBsb2MgXSBpbiBzZWxmLm1hdGNoV2hpdGUpOg0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQogICAgICAgIHN0YXJ0ID0gbG9jDQogICAgICAgIGxvYyArPSAxDQogICAgICAgIG1heGxvYyA9IHN0YXJ0ICsgc2VsZi5tYXhMZW4NCiAgICAgICAgbWF4bG9jID0gbWluKCBtYXhsb2MsIGxlbihpbnN0cmluZykgKQ0KICAgICAgICB3aGlsZSBsb2MgPCBtYXhsb2MgYW5kIGluc3RyaW5nW2xvY10gaW4gc2VsZi5tYXRjaFdoaXRlOg0KICAgICAgICAgICAgbG9jICs9IDENCg0KICAgICAgICBpZiBsb2MgLSBzdGFydCA8IHNlbGYubWluTGVuOg0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQoNCiAgICAgICAgcmV0dXJuIGxvYywgaW5zdHJpbmdbc3RhcnQ6bG9jXQ0KDQoNCmNsYXNzIF9Qb3NpdGlvblRva2VuKFRva2VuKToNCiAgICBkZWYgX19pbml0X18oIHNlbGYgKToNCiAgICAgICAgc3VwZXIoX1Bvc2l0aW9uVG9rZW4sc2VsZikuX19pbml0X18oKQ0KICAgICAgICBzZWxmLm5hbWU9c2VsZi5fX2NsYXNzX18uX19uYW1lX18NCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUNCiAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gRmFsc2UNCg0KY2xhc3MgR29Ub0NvbHVtbihfUG9zaXRpb25Ub2tlbik6DQogICAgIiIiDQogICAgVG9rZW4gdG8gYWR2YW5jZSB0byBhIHNwZWNpZmljIGNvbHVtbiBvZiBpbnB1dCB0ZXh0OyB1c2VmdWwgZm9yIHRhYnVsYXIgcmVwb3J0IHNjcmFwaW5nLg0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgY29sbm8gKToNCiAgICAgICAgc3VwZXIoR29Ub0NvbHVtbixzZWxmKS5fX2luaXRfXygpDQogICAgICAgIHNlbGYuY29sID0gY29sbm8NCg0KICAgIGRlZiBwcmVQYXJzZSggc2VsZiwgaW5zdHJpbmcsIGxvYyApOg0KICAgICAgICBpZiBjb2wobG9jLGluc3RyaW5nKSAhPSBzZWxmLmNvbDoNCiAgICAgICAgICAgIGluc3RybGVuID0gbGVuKGluc3RyaW5nKQ0KICAgICAgICAgICAgaWYgc2VsZi5pZ25vcmVFeHByczoNCiAgICAgICAgICAgICAgICBsb2MgPSBzZWxmLl9za2lwSWdub3JhYmxlcyggaW5zdHJpbmcsIGxvYyApDQogICAgICAgICAgICB3aGlsZSBsb2MgPCBpbnN0cmxlbiBhbmQgaW5zdHJpbmdbbG9jXS5pc3NwYWNlKCkgYW5kIGNvbCggbG9jLCBpbnN0cmluZyApICE9IHNlbGYuY29sIDoNCiAgICAgICAgICAgICAgICBsb2MgKz0gMQ0KICAgICAgICByZXR1cm4gbG9jDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICB0aGlzY29sID0gY29sKCBsb2MsIGluc3RyaW5nICkNCiAgICAgICAgaWYgdGhpc2NvbCA+IHNlbGYuY29sOg0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oIGluc3RyaW5nLCBsb2MsICJUZXh0IG5vdCBpbiBleHBlY3RlZCBjb2x1bW4iLCBzZWxmICkNCiAgICAgICAgbmV3bG9jID0gbG9jICsgc2VsZi5jb2wgLSB0aGlzY29sDQogICAgICAgIHJldCA9IGluc3RyaW5nWyBsb2M6IG5ld2xvYyBdDQogICAgICAgIHJldHVybiBuZXdsb2MsIHJldA0KDQoNCmNsYXNzIExpbmVTdGFydChfUG9zaXRpb25Ub2tlbik6DQogICAgIiIiDQogICAgTWF0Y2hlcyBpZiBjdXJyZW50IHBvc2l0aW9uIGlzIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lIHdpdGhpbiB0aGUgcGFyc2Ugc3RyaW5nDQogICAgDQogICAgRXhhbXBsZTo6DQogICAgDQogICAgICAgIHRlc3QgPSAnJydcDQogICAgICAgIEFBQSB0aGlzIGxpbmUNCiAgICAgICAgQUFBIGFuZCB0aGlzIGxpbmUNCiAgICAgICAgICBBQUEgYnV0IG5vdCB0aGlzIG9uZQ0KICAgICAgICBCIEFBQSBhbmQgZGVmaW5pdGVseSBub3QgdGhpcyBvbmUNCiAgICAgICAgJycnDQoNCiAgICAgICAgZm9yIHQgaW4gKExpbmVTdGFydCgpICsgJ0FBQScgKyByZXN0T2ZMaW5lKS5zZWFyY2hTdHJpbmcodGVzdCk6DQogICAgICAgICAgICBwcmludCh0KQ0KICAgIA0KICAgIFByaW50czo6DQogICAgICAgIFsnQUFBJywgJyB0aGlzIGxpbmUnXQ0KICAgICAgICBbJ0FBQScsICcgYW5kIHRoaXMgbGluZSddICAgIA0KDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmICk6DQogICAgICAgIHN1cGVyKExpbmVTdGFydCxzZWxmKS5fX2luaXRfXygpDQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkIHN0YXJ0IG9mIGxpbmUiDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBpZiBjb2wobG9jLCBpbnN0cmluZykgPT0gMToNCiAgICAgICAgICAgIHJldHVybiBsb2MsIFtdDQogICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KDQpjbGFzcyBMaW5lRW5kKF9Qb3NpdGlvblRva2VuKToNCiAgICAiIiINCiAgICBNYXRjaGVzIGlmIGN1cnJlbnQgcG9zaXRpb24gaXMgYXQgdGhlIGVuZCBvZiBhIGxpbmUgd2l0aGluIHRoZSBwYXJzZSBzdHJpbmcNCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYgKToNCiAgICAgICAgc3VwZXIoTGluZUVuZCxzZWxmKS5fX2luaXRfXygpDQogICAgICAgIHNlbGYuc2V0V2hpdGVzcGFjZUNoYXJzKCBQYXJzZXJFbGVtZW50LkRFRkFVTFRfV0hJVEVfQ0hBUlMucmVwbGFjZSgiXG4iLCIiKSApDQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkIGVuZCBvZiBsaW5lIg0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgaWYgbG9jPGxlbihpbnN0cmluZyk6DQogICAgICAgICAgICBpZiBpbnN0cmluZ1tsb2NdID09ICJcbiI6DQogICAgICAgICAgICAgICAgcmV0dXJuIGxvYysxLCAiXG4iDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KICAgICAgICBlbGlmIGxvYyA9PSBsZW4oaW5zdHJpbmcpOg0KICAgICAgICAgICAgcmV0dXJuIGxvYysxLCBbXQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQoNCmNsYXNzIFN0cmluZ1N0YXJ0KF9Qb3NpdGlvblRva2VuKToNCiAgICAiIiINCiAgICBNYXRjaGVzIGlmIGN1cnJlbnQgcG9zaXRpb24gaXMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcGFyc2Ugc3RyaW5nDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmICk6DQogICAgICAgIHN1cGVyKFN0cmluZ1N0YXJ0LHNlbGYpLl9faW5pdF9fKCkNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgc3RhcnQgb2YgdGV4dCINCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIGlmIGxvYyAhPSAwOg0KICAgICAgICAgICAgIyBzZWUgaWYgZW50aXJlIHN0cmluZyB1cCB0byBoZXJlIGlzIGp1c3Qgd2hpdGVzcGFjZSBhbmQgaWdub3JlYWJsZXMNCiAgICAgICAgICAgIGlmIGxvYyAhPSBzZWxmLnByZVBhcnNlKCBpbnN0cmluZywgMCApOg0KICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KICAgICAgICByZXR1cm4gbG9jLCBbXQ0KDQpjbGFzcyBTdHJpbmdFbmQoX1Bvc2l0aW9uVG9rZW4pOg0KICAgICIiIg0KICAgIE1hdGNoZXMgaWYgY3VycmVudCBwb3NpdGlvbiBpcyBhdCB0aGUgZW5kIG9mIHRoZSBwYXJzZSBzdHJpbmcNCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYgKToNCiAgICAgICAgc3VwZXIoU3RyaW5nRW5kLHNlbGYpLl9faW5pdF9fKCkNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgZW5kIG9mIHRleHQiDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBpZiBsb2MgPCBsZW4oaW5zdHJpbmcpOg0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQogICAgICAgIGVsaWYgbG9jID09IGxlbihpbnN0cmluZyk6DQogICAgICAgICAgICByZXR1cm4gbG9jKzEsIFtdDQogICAgICAgIGVsaWYgbG9jID4gbGVuKGluc3RyaW5nKToNCiAgICAgICAgICAgIHJldHVybiBsb2MsIFtdDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCg0KY2xhc3MgV29yZFN0YXJ0KF9Qb3NpdGlvblRva2VuKToNCiAgICAiIiINCiAgICBNYXRjaGVzIGlmIHRoZSBjdXJyZW50IHBvc2l0aW9uIGlzIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBXb3JkLCBhbmQNCiAgICBpcyBub3QgcHJlY2VkZWQgYnkgYW55IGNoYXJhY3RlciBpbiBhIGdpdmVuIHNldCBvZiBDe3dvcmRDaGFyc30NCiAgICAoZGVmYXVsdD1De3ByaW50YWJsZXN9KS4gVG8gZW11bGF0ZSB0aGUgQ3tcYn0gYmVoYXZpb3Igb2YgcmVndWxhciBleHByZXNzaW9ucywNCiAgICB1c2UgQ3tXb3JkU3RhcnQoYWxwaGFudW1zKX0uIEN7V29yZFN0YXJ0fSB3aWxsIGFsc28gbWF0Y2ggYXQgdGhlIGJlZ2lubmluZyBvZg0KICAgIHRoZSBzdHJpbmcgYmVpbmcgcGFyc2VkLCBvciBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZS4NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oc2VsZiwgd29yZENoYXJzID0gcHJpbnRhYmxlcyk6DQogICAgICAgIHN1cGVyKFdvcmRTdGFydCxzZWxmKS5fX2luaXRfXygpDQogICAgICAgIHNlbGYud29yZENoYXJzID0gc2V0KHdvcmRDaGFycykNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiTm90IGF0IHRoZSBzdGFydCBvZiBhIHdvcmQiDQoNCiAgICBkZWYgcGFyc2VJbXBsKHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIGlmIGxvYyAhPSAwOg0KICAgICAgICAgICAgaWYgKGluc3RyaW5nW2xvYy0xXSBpbiBzZWxmLndvcmRDaGFycyBvcg0KICAgICAgICAgICAgICAgIGluc3RyaW5nW2xvY10gbm90IGluIHNlbGYud29yZENoYXJzKToNCiAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCiAgICAgICAgcmV0dXJuIGxvYywgW10NCg0KY2xhc3MgV29yZEVuZChfUG9zaXRpb25Ub2tlbik6DQogICAgIiIiDQogICAgTWF0Y2hlcyBpZiB0aGUgY3VycmVudCBwb3NpdGlvbiBpcyBhdCB0aGUgZW5kIG9mIGEgV29yZCwgYW5kDQogICAgaXMgbm90IGZvbGxvd2VkIGJ5IGFueSBjaGFyYWN0ZXIgaW4gYSBnaXZlbiBzZXQgb2YgQ3t3b3JkQ2hhcnN9DQogICAgKGRlZmF1bHQ9Q3twcmludGFibGVzfSkuIFRvIGVtdWxhdGUgdGhlIEN7XGJ9IGJlaGF2aW9yIG9mIHJlZ3VsYXIgZXhwcmVzc2lvbnMsDQogICAgdXNlIEN7V29yZEVuZChhbHBoYW51bXMpfS4gQ3tXb3JkRW5kfSB3aWxsIGFsc28gbWF0Y2ggYXQgdGhlIGVuZCBvZg0KICAgIHRoZSBzdHJpbmcgYmVpbmcgcGFyc2VkLCBvciBhdCB0aGUgZW5kIG9mIGEgbGluZS4NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oc2VsZiwgd29yZENoYXJzID0gcHJpbnRhYmxlcyk6DQogICAgICAgIHN1cGVyKFdvcmRFbmQsc2VsZikuX19pbml0X18oKQ0KICAgICAgICBzZWxmLndvcmRDaGFycyA9IHNldCh3b3JkQ2hhcnMpDQogICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBGYWxzZQ0KICAgICAgICBzZWxmLmVycm1zZyA9ICJOb3QgYXQgdGhlIGVuZCBvZiBhIHdvcmQiDQoNCiAgICBkZWYgcGFyc2VJbXBsKHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIGluc3RybGVuID0gbGVuKGluc3RyaW5nKQ0KICAgICAgICBpZiBpbnN0cmxlbj4wIGFuZCBsb2M8aW5zdHJsZW46DQogICAgICAgICAgICBpZiAoaW5zdHJpbmdbbG9jXSBpbiBzZWxmLndvcmRDaGFycyBvcg0KICAgICAgICAgICAgICAgIGluc3RyaW5nW2xvYy0xXSBub3QgaW4gc2VsZi53b3JkQ2hhcnMpOg0KICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KICAgICAgICByZXR1cm4gbG9jLCBbXQ0KDQoNCmNsYXNzIFBhcnNlRXhwcmVzc2lvbihQYXJzZXJFbGVtZW50KToNCiAgICAiIiINCiAgICBBYnN0cmFjdCBzdWJjbGFzcyBvZiBQYXJzZXJFbGVtZW50LCBmb3IgY29tYmluaW5nIGFuZCBwb3N0LXByb2Nlc3NpbmcgcGFyc2VkIHRva2Vucy4NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHJzLCBzYXZlbGlzdCA9IEZhbHNlICk6DQogICAgICAgIHN1cGVyKFBhcnNlRXhwcmVzc2lvbixzZWxmKS5fX2luaXRfXyhzYXZlbGlzdCkNCiAgICAgICAgaWYgaXNpbnN0YW5jZSggZXhwcnMsIF9nZW5lcmF0b3JUeXBlICk6DQogICAgICAgICAgICBleHBycyA9IGxpc3QoZXhwcnMpDQoNCiAgICAgICAgaWYgaXNpbnN0YW5jZSggZXhwcnMsIGJhc2VzdHJpbmcgKToNCiAgICAgICAgICAgIHNlbGYuZXhwcnMgPSBbIFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggZXhwcnMgKSBdDQogICAgICAgIGVsaWYgaXNpbnN0YW5jZSggZXhwcnMsIEl0ZXJhYmxlICk6DQogICAgICAgICAgICBleHBycyA9IGxpc3QoZXhwcnMpDQogICAgICAgICAgICAjIGlmIHNlcXVlbmNlIG9mIHN0cmluZ3MgcHJvdmlkZWQsIHdyYXAgd2l0aCBMaXRlcmFsDQogICAgICAgICAgICBpZiBhbGwoaXNpbnN0YW5jZShleHByLCBiYXNlc3RyaW5nKSBmb3IgZXhwciBpbiBleHBycyk6DQogICAgICAgICAgICAgICAgZXhwcnMgPSBtYXAoUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzLCBleHBycykNCiAgICAgICAgICAgIHNlbGYuZXhwcnMgPSBsaXN0KGV4cHJzKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgIHNlbGYuZXhwcnMgPSBsaXN0KCBleHBycyApDQogICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOg0KICAgICAgICAgICAgICAgIHNlbGYuZXhwcnMgPSBbIGV4cHJzIF0NCiAgICAgICAgc2VsZi5jYWxsUHJlcGFyc2UgPSBGYWxzZQ0KDQogICAgZGVmIF9fZ2V0aXRlbV9fKCBzZWxmLCBpICk6DQogICAgICAgIHJldHVybiBzZWxmLmV4cHJzW2ldDQoNCiAgICBkZWYgYXBwZW5kKCBzZWxmLCBvdGhlciApOg0KICAgICAgICBzZWxmLmV4cHJzLmFwcGVuZCggb3RoZXIgKQ0KICAgICAgICBzZWxmLnN0clJlcHIgPSBOb25lDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgbGVhdmVXaGl0ZXNwYWNlKCBzZWxmICk6DQogICAgICAgICIiIkV4dGVuZHMgQ3tsZWF2ZVdoaXRlc3BhY2V9IGRlZmluZWQgaW4gYmFzZSBjbGFzcywgYW5kIGFsc28gaW52b2tlcyBDe2xlYXZlV2hpdGVzcGFjZX0gb24NCiAgICAgICAgICAgYWxsIGNvbnRhaW5lZCBleHByZXNzaW9ucy4iIiINCiAgICAgICAgc2VsZi5za2lwV2hpdGVzcGFjZSA9IEZhbHNlDQogICAgICAgIHNlbGYuZXhwcnMgPSBbIGUuY29weSgpIGZvciBlIGluIHNlbGYuZXhwcnMgXQ0KICAgICAgICBmb3IgZSBpbiBzZWxmLmV4cHJzOg0KICAgICAgICAgICAgZS5sZWF2ZVdoaXRlc3BhY2UoKQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIGlnbm9yZSggc2VsZiwgb3RoZXIgKToNCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIFN1cHByZXNzICk6DQogICAgICAgICAgICBpZiBvdGhlciBub3QgaW4gc2VsZi5pZ25vcmVFeHByczoNCiAgICAgICAgICAgICAgICBzdXBlciggUGFyc2VFeHByZXNzaW9uLCBzZWxmKS5pZ25vcmUoIG90aGVyICkNCiAgICAgICAgICAgICAgICBmb3IgZSBpbiBzZWxmLmV4cHJzOg0KICAgICAgICAgICAgICAgICAgICBlLmlnbm9yZSggc2VsZi5pZ25vcmVFeHByc1stMV0gKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgc3VwZXIoIFBhcnNlRXhwcmVzc2lvbiwgc2VsZikuaWdub3JlKCBvdGhlciApDQogICAgICAgICAgICBmb3IgZSBpbiBzZWxmLmV4cHJzOg0KICAgICAgICAgICAgICAgIGUuaWdub3JlKCBzZWxmLmlnbm9yZUV4cHJzWy0xXSApDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICB0cnk6DQogICAgICAgICAgICByZXR1cm4gc3VwZXIoUGFyc2VFeHByZXNzaW9uLHNlbGYpLl9fc3RyX18oKQ0KICAgICAgICBleGNlcHQgRXhjZXB0aW9uOg0KICAgICAgICAgICAgcGFzcw0KDQogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lOg0KICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gIiVzOiglcykiICUgKCBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgX3VzdHIoc2VsZi5leHBycykgKQ0KICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByDQoNCiAgICBkZWYgc3RyZWFtbGluZSggc2VsZiApOg0KICAgICAgICBzdXBlcihQYXJzZUV4cHJlc3Npb24sc2VsZikuc3RyZWFtbGluZSgpDQoNCiAgICAgICAgZm9yIGUgaW4gc2VsZi5leHByczoNCiAgICAgICAgICAgIGUuc3RyZWFtbGluZSgpDQoNCiAgICAgICAgIyBjb2xsYXBzZSBuZXN0ZWQgQW5kJ3Mgb2YgdGhlIGZvcm0gQW5kKCBBbmQoIEFuZCggYSxiKSwgYyksIGQpIHRvIEFuZCggYSxiLGMsZCApDQogICAgICAgICMgYnV0IG9ubHkgaWYgdGhlcmUgYXJlIG5vIHBhcnNlIGFjdGlvbnMgb3IgcmVzdWx0c05hbWVzIG9uIHRoZSBuZXN0ZWQgQW5kJ3MNCiAgICAgICAgIyAobGlrZXdpc2UgZm9yIE9yJ3MgYW5kIE1hdGNoRmlyc3QncykNCiAgICAgICAgaWYgKCBsZW4oc2VsZi5leHBycykgPT0gMiApOg0KICAgICAgICAgICAgb3RoZXIgPSBzZWxmLmV4cHJzWzBdDQogICAgICAgICAgICBpZiAoIGlzaW5zdGFuY2UoIG90aGVyLCBzZWxmLl9fY2xhc3NfXyApIGFuZA0KICAgICAgICAgICAgICAgICAgbm90KG90aGVyLnBhcnNlQWN0aW9uKSBhbmQNCiAgICAgICAgICAgICAgICAgIG90aGVyLnJlc3VsdHNOYW1lIGlzIE5vbmUgYW5kDQogICAgICAgICAgICAgICAgICBub3Qgb3RoZXIuZGVidWcgKToNCiAgICAgICAgICAgICAgICBzZWxmLmV4cHJzID0gb3RoZXIuZXhwcnNbOl0gKyBbIHNlbGYuZXhwcnNbMV0gXQ0KICAgICAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9IE5vbmUNCiAgICAgICAgICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5IHw9IG90aGVyLm1heVJldHVybkVtcHR5DQogICAgICAgICAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yICB8PSBvdGhlci5tYXlJbmRleEVycm9yDQoNCiAgICAgICAgICAgIG90aGVyID0gc2VsZi5leHByc1stMV0NCiAgICAgICAgICAgIGlmICggaXNpbnN0YW5jZSggb3RoZXIsIHNlbGYuX19jbGFzc19fICkgYW5kDQogICAgICAgICAgICAgICAgICBub3Qob3RoZXIucGFyc2VBY3Rpb24pIGFuZA0KICAgICAgICAgICAgICAgICAgb3RoZXIucmVzdWx0c05hbWUgaXMgTm9uZSBhbmQNCiAgICAgICAgICAgICAgICAgIG5vdCBvdGhlci5kZWJ1ZyApOg0KICAgICAgICAgICAgICAgIHNlbGYuZXhwcnMgPSBzZWxmLmV4cHJzWzotMV0gKyBvdGhlci5leHByc1s6XQ0KICAgICAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9IE5vbmUNCiAgICAgICAgICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5IHw9IG90aGVyLm1heVJldHVybkVtcHR5DQogICAgICAgICAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yICB8PSBvdGhlci5tYXlJbmRleEVycm9yDQoNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgIiArIF91c3RyKHNlbGYpDQogICAgICAgIA0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIHNldFJlc3VsdHNOYW1lKCBzZWxmLCBuYW1lLCBsaXN0QWxsTWF0Y2hlcz1GYWxzZSApOg0KICAgICAgICByZXQgPSBzdXBlcihQYXJzZUV4cHJlc3Npb24sc2VsZikuc2V0UmVzdWx0c05hbWUobmFtZSxsaXN0QWxsTWF0Y2hlcykNCiAgICAgICAgcmV0dXJuIHJldA0KDQogICAgZGVmIHZhbGlkYXRlKCBzZWxmLCB2YWxpZGF0ZVRyYWNlPVtdICk6DQogICAgICAgIHRtcCA9IHZhbGlkYXRlVHJhY2VbOl0rW3NlbGZdDQogICAgICAgIGZvciBlIGluIHNlbGYuZXhwcnM6DQogICAgICAgICAgICBlLnZhbGlkYXRlKHRtcCkNCiAgICAgICAgc2VsZi5jaGVja1JlY3Vyc2lvbiggW10gKQ0KICAgICAgICANCiAgICBkZWYgY29weShzZWxmKToNCiAgICAgICAgcmV0ID0gc3VwZXIoUGFyc2VFeHByZXNzaW9uLHNlbGYpLmNvcHkoKQ0KICAgICAgICByZXQuZXhwcnMgPSBbZS5jb3B5KCkgZm9yIGUgaW4gc2VsZi5leHByc10NCiAgICAgICAgcmV0dXJuIHJldA0KDQpjbGFzcyBBbmQoUGFyc2VFeHByZXNzaW9uKToNCiAgICAiIiINCiAgICBSZXF1aXJlcyBhbGwgZ2l2ZW4gQ3tQYXJzZUV4cHJlc3Npb259cyB0byBiZSBmb3VuZCBpbiB0aGUgZ2l2ZW4gb3JkZXIuDQogICAgRXhwcmVzc2lvbnMgbWF5IGJlIHNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlLg0KICAgIE1heSBiZSBjb25zdHJ1Y3RlZCB1c2luZyB0aGUgQ3snKyd9IG9wZXJhdG9yLg0KICAgIE1heSBhbHNvIGJlIGNvbnN0cnVjdGVkIHVzaW5nIHRoZSBDeyctJ30gb3BlcmF0b3IsIHdoaWNoIHdpbGwgc3VwcHJlc3MgYmFja3RyYWNraW5nLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpDQogICAgICAgIG5hbWVfZXhwciA9IE9uZU9yTW9yZShXb3JkKGFscGhhcykpDQoNCiAgICAgICAgZXhwciA9IEFuZChbaW50ZWdlcigiaWQiKSxuYW1lX2V4cHIoIm5hbWUiKSxpbnRlZ2VyKCJhZ2UiKV0pDQogICAgICAgICMgbW9yZSBlYXNpbHkgd3JpdHRlbiBhczoNCiAgICAgICAgZXhwciA9IGludGVnZXIoImlkIikgKyBuYW1lX2V4cHIoIm5hbWUiKSArIGludGVnZXIoImFnZSIpDQogICAgIiIiDQoNCiAgICBjbGFzcyBfRXJyb3JTdG9wKEVtcHR5KToNCiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6DQogICAgICAgICAgICBzdXBlcihBbmQuX0Vycm9yU3RvcCxzZWxmKS5fX2luaXRfXygqYXJncywgKiprd2FyZ3MpDQogICAgICAgICAgICBzZWxmLm5hbWUgPSAnLScNCiAgICAgICAgICAgIHNlbGYubGVhdmVXaGl0ZXNwYWNlKCkNCg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwcnMsIHNhdmVsaXN0ID0gVHJ1ZSApOg0KICAgICAgICBzdXBlcihBbmQsc2VsZikuX19pbml0X18oZXhwcnMsIHNhdmVsaXN0KQ0KICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gYWxsKGUubWF5UmV0dXJuRW1wdHkgZm9yIGUgaW4gc2VsZi5leHBycykNCiAgICAgICAgc2VsZi5zZXRXaGl0ZXNwYWNlQ2hhcnMoIHNlbGYuZXhwcnNbMF0ud2hpdGVDaGFycyApDQogICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBzZWxmLmV4cHJzWzBdLnNraXBXaGl0ZXNwYWNlDQogICAgICAgIHNlbGYuY2FsbFByZXBhcnNlID0gVHJ1ZQ0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgIyBwYXNzIEZhbHNlIGFzIGxhc3QgYXJnIHRvIF9wYXJzZSBmb3IgZmlyc3QgZWxlbWVudCwgc2luY2Ugd2UgYWxyZWFkeQ0KICAgICAgICAjIHByZS1wYXJzZWQgdGhlIHN0cmluZyBhcyBwYXJ0IG9mIG91ciBBbmQgcHJlLXBhcnNpbmcNCiAgICAgICAgbG9jLCByZXN1bHRsaXN0ID0gc2VsZi5leHByc1swXS5fcGFyc2UoIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucywgY2FsbFByZVBhcnNlPUZhbHNlICkNCiAgICAgICAgZXJyb3JTdG9wID0gRmFsc2UNCiAgICAgICAgZm9yIGUgaW4gc2VsZi5leHByc1sxOl06DQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGUsIEFuZC5fRXJyb3JTdG9wKToNCiAgICAgICAgICAgICAgICBlcnJvclN0b3AgPSBUcnVlDQogICAgICAgICAgICAgICAgY29udGludWUNCiAgICAgICAgICAgIGlmIGVycm9yU3RvcDoNCiAgICAgICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgICAgIGxvYywgZXhwcnRva2VucyA9IGUuX3BhcnNlKCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnMgKQ0KICAgICAgICAgICAgICAgIGV4Y2VwdCBQYXJzZVN5bnRheEV4Y2VwdGlvbjoNCiAgICAgICAgICAgICAgICAgICAgcmFpc2UNCiAgICAgICAgICAgICAgICBleGNlcHQgUGFyc2VCYXNlRXhjZXB0aW9uIGFzIHBlOg0KICAgICAgICAgICAgICAgICAgICBwZS5fX3RyYWNlYmFja19fID0gTm9uZQ0KICAgICAgICAgICAgICAgICAgICByYWlzZSBQYXJzZVN5bnRheEV4Y2VwdGlvbi5fZnJvbV9leGNlcHRpb24ocGUpDQogICAgICAgICAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6DQogICAgICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlU3ludGF4RXhjZXB0aW9uKGluc3RyaW5nLCBsZW4oaW5zdHJpbmcpLCBzZWxmLmVycm1zZywgc2VsZikNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgbG9jLCBleHBydG9rZW5zID0gZS5fcGFyc2UoIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucyApDQogICAgICAgICAgICBpZiBleHBydG9rZW5zIG9yIGV4cHJ0b2tlbnMuaGFza2V5cygpOg0KICAgICAgICAgICAgICAgIHJlc3VsdGxpc3QgKz0gZXhwcnRva2Vucw0KICAgICAgICByZXR1cm4gbG9jLCByZXN1bHRsaXN0DQoNCiAgICBkZWYgX19pYWRkX18oc2VsZiwgb3RoZXIgKToNCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToNCiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBvdGhlciApDQogICAgICAgIHJldHVybiBzZWxmLmFwcGVuZCggb3RoZXIgKSAjQW5kKCBbIHNlbGYsIG90aGVyIF0gKQ0KDQogICAgZGVmIGNoZWNrUmVjdXJzaW9uKCBzZWxmLCBwYXJzZUVsZW1lbnRMaXN0ICk6DQogICAgICAgIHN1YlJlY0NoZWNrTGlzdCA9IHBhcnNlRWxlbWVudExpc3RbOl0gKyBbIHNlbGYgXQ0KICAgICAgICBmb3IgZSBpbiBzZWxmLmV4cHJzOg0KICAgICAgICAgICAgZS5jaGVja1JlY3Vyc2lvbiggc3ViUmVjQ2hlY2tMaXN0ICkNCiAgICAgICAgICAgIGlmIG5vdCBlLm1heVJldHVybkVtcHR5Og0KICAgICAgICAgICAgICAgIGJyZWFrDQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICBpZiBoYXNhdHRyKHNlbGYsIm5hbWUiKToNCiAgICAgICAgICAgIHJldHVybiBzZWxmLm5hbWUNCg0KICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZToNCiAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICJ7IiArICIgIi5qb2luKF91c3RyKGUpIGZvciBlIGluIHNlbGYuZXhwcnMpICsgIn0iDQoNCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcg0KDQoNCmNsYXNzIE9yKFBhcnNlRXhwcmVzc2lvbik6DQogICAgIiIiDQogICAgUmVxdWlyZXMgdGhhdCBhdCBsZWFzdCBvbmUgQ3tQYXJzZUV4cHJlc3Npb259IGlzIGZvdW5kLg0KICAgIElmIHR3byBleHByZXNzaW9ucyBtYXRjaCwgdGhlIGV4cHJlc3Npb24gdGhhdCBtYXRjaGVzIHRoZSBsb25nZXN0IHN0cmluZyB3aWxsIGJlIHVzZWQuDQogICAgTWF5IGJlIGNvbnN0cnVjdGVkIHVzaW5nIHRoZSBDeydeJ30gb3BlcmF0b3IuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgIyBjb25zdHJ1Y3QgT3IgdXNpbmcgJ14nIG9wZXJhdG9yDQogICAgICAgIA0KICAgICAgICBudW1iZXIgPSBXb3JkKG51bXMpIF4gQ29tYmluZShXb3JkKG51bXMpICsgJy4nICsgV29yZChudW1zKSkNCiAgICAgICAgcHJpbnQobnVtYmVyLnNlYXJjaFN0cmluZygiMTIzIDMuMTQxNiA3ODkiKSkNCiAgICBwcmludHM6Og0KICAgICAgICBbWycxMjMnXSwgWyczLjE0MTYnXSwgWyc3ODknXV0NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHJzLCBzYXZlbGlzdCA9IEZhbHNlICk6DQogICAgICAgIHN1cGVyKE9yLHNlbGYpLl9faW5pdF9fKGV4cHJzLCBzYXZlbGlzdCkNCiAgICAgICAgaWYgc2VsZi5leHByczoNCiAgICAgICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBhbnkoZS5tYXlSZXR1cm5FbXB0eSBmb3IgZSBpbiBzZWxmLmV4cHJzKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIG1heEV4Y0xvYyA9IC0xDQogICAgICAgIG1heEV4Y2VwdGlvbiA9IE5vbmUNCiAgICAgICAgbWF0Y2hlcyA9IFtdDQogICAgICAgIGZvciBlIGluIHNlbGYuZXhwcnM6DQogICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgbG9jMiA9IGUudHJ5UGFyc2UoIGluc3RyaW5nLCBsb2MgKQ0KICAgICAgICAgICAgZXhjZXB0IFBhcnNlRXhjZXB0aW9uIGFzIGVycjoNCiAgICAgICAgICAgICAgICBlcnIuX190cmFjZWJhY2tfXyA9IE5vbmUNCiAgICAgICAgICAgICAgICBpZiBlcnIubG9jID4gbWF4RXhjTG9jOg0KICAgICAgICAgICAgICAgICAgICBtYXhFeGNlcHRpb24gPSBlcnINCiAgICAgICAgICAgICAgICAgICAgbWF4RXhjTG9jID0gZXJyLmxvYw0KICAgICAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6DQogICAgICAgICAgICAgICAgaWYgbGVuKGluc3RyaW5nKSA+IG1heEV4Y0xvYzoNCiAgICAgICAgICAgICAgICAgICAgbWF4RXhjZXB0aW9uID0gUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsbGVuKGluc3RyaW5nKSxlLmVycm1zZyxzZWxmKQ0KICAgICAgICAgICAgICAgICAgICBtYXhFeGNMb2MgPSBsZW4oaW5zdHJpbmcpDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICMgc2F2ZSBtYXRjaCBhbW9uZyBhbGwgbWF0Y2hlcywgdG8gcmV0cnkgbG9uZ2VzdCB0byBzaG9ydGVzdA0KICAgICAgICAgICAgICAgIG1hdGNoZXMuYXBwZW5kKChsb2MyLCBlKSkNCg0KICAgICAgICBpZiBtYXRjaGVzOg0KICAgICAgICAgICAgbWF0Y2hlcy5zb3J0KGtleT1sYW1iZGEgeDogLXhbMF0pDQogICAgICAgICAgICBmb3IgXyxlIGluIG1hdGNoZXM6DQogICAgICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5fcGFyc2UoIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucyApDQogICAgICAgICAgICAgICAgZXhjZXB0IFBhcnNlRXhjZXB0aW9uIGFzIGVycjoNCiAgICAgICAgICAgICAgICAgICAgZXJyLl9fdHJhY2ViYWNrX18gPSBOb25lDQogICAgICAgICAgICAgICAgICAgIGlmIGVyci5sb2MgPiBtYXhFeGNMb2M6DQogICAgICAgICAgICAgICAgICAgICAgICBtYXhFeGNlcHRpb24gPSBlcnINCiAgICAgICAgICAgICAgICAgICAgICAgIG1heEV4Y0xvYyA9IGVyci5sb2MNCg0KICAgICAgICBpZiBtYXhFeGNlcHRpb24gaXMgbm90IE5vbmU6DQogICAgICAgICAgICBtYXhFeGNlcHRpb24ubXNnID0gc2VsZi5lcnJtc2cNCiAgICAgICAgICAgIHJhaXNlIG1heEV4Y2VwdGlvbg0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgIm5vIGRlZmluZWQgYWx0ZXJuYXRpdmVzIHRvIG1hdGNoIiwgc2VsZikNCg0KDQogICAgZGVmIF9faXhvcl9fKHNlbGYsIG90aGVyICk6DQogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6DQogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQ0KICAgICAgICByZXR1cm4gc2VsZi5hcHBlbmQoIG90aGVyICkgI09yKCBbIHNlbGYsIG90aGVyIF0gKQ0KDQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgaWYgaGFzYXR0cihzZWxmLCJuYW1lIik6DQogICAgICAgICAgICByZXR1cm4gc2VsZi5uYW1lDQoNCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6DQogICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAieyIgKyAiIF4gIi5qb2luKF91c3RyKGUpIGZvciBlIGluIHNlbGYuZXhwcnMpICsgIn0iDQoNCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcg0KDQogICAgZGVmIGNoZWNrUmVjdXJzaW9uKCBzZWxmLCBwYXJzZUVsZW1lbnRMaXN0ICk6DQogICAgICAgIHN1YlJlY0NoZWNrTGlzdCA9IHBhcnNlRWxlbWVudExpc3RbOl0gKyBbIHNlbGYgXQ0KICAgICAgICBmb3IgZSBpbiBzZWxmLmV4cHJzOg0KICAgICAgICAgICAgZS5jaGVja1JlY3Vyc2lvbiggc3ViUmVjQ2hlY2tMaXN0ICkNCg0KDQpjbGFzcyBNYXRjaEZpcnN0KFBhcnNlRXhwcmVzc2lvbik6DQogICAgIiIiDQogICAgUmVxdWlyZXMgdGhhdCBhdCBsZWFzdCBvbmUgQ3tQYXJzZUV4cHJlc3Npb259IGlzIGZvdW5kLg0KICAgIElmIHR3byBleHByZXNzaW9ucyBtYXRjaCwgdGhlIGZpcnN0IG9uZSBsaXN0ZWQgaXMgdGhlIG9uZSB0aGF0IHdpbGwgbWF0Y2guDQogICAgTWF5IGJlIGNvbnN0cnVjdGVkIHVzaW5nIHRoZSBDeyd8J30gb3BlcmF0b3IuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgIyBjb25zdHJ1Y3QgTWF0Y2hGaXJzdCB1c2luZyAnfCcgb3BlcmF0b3INCiAgICAgICAgDQogICAgICAgICMgd2F0Y2ggdGhlIG9yZGVyIG9mIGV4cHJlc3Npb25zIHRvIG1hdGNoDQogICAgICAgIG51bWJlciA9IFdvcmQobnVtcykgfCBDb21iaW5lKFdvcmQobnVtcykgKyAnLicgKyBXb3JkKG51bXMpKQ0KICAgICAgICBwcmludChudW1iZXIuc2VhcmNoU3RyaW5nKCIxMjMgMy4xNDE2IDc4OSIpKSAjICBGYWlsISAtPiBbWycxMjMnXSwgWyczJ10sIFsnMTQxNiddLCBbJzc4OSddXQ0KDQogICAgICAgICMgcHV0IG1vcmUgc2VsZWN0aXZlIGV4cHJlc3Npb24gZmlyc3QNCiAgICAgICAgbnVtYmVyID0gQ29tYmluZShXb3JkKG51bXMpICsgJy4nICsgV29yZChudW1zKSkgfCBXb3JkKG51bXMpDQogICAgICAgIHByaW50KG51bWJlci5zZWFyY2hTdHJpbmcoIjEyMyAzLjE0MTYgNzg5IikpICMgIEJldHRlciAtPiBbWycxMjMnXSwgWyczLjE0MTYnXSwgWyc3ODknXV0NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHJzLCBzYXZlbGlzdCA9IEZhbHNlICk6DQogICAgICAgIHN1cGVyKE1hdGNoRmlyc3Qsc2VsZikuX19pbml0X18oZXhwcnMsIHNhdmVsaXN0KQ0KICAgICAgICBpZiBzZWxmLmV4cHJzOg0KICAgICAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IGFueShlLm1heVJldHVybkVtcHR5IGZvciBlIGluIHNlbGYuZXhwcnMpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gVHJ1ZQ0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgbWF4RXhjTG9jID0gLTENCiAgICAgICAgbWF4RXhjZXB0aW9uID0gTm9uZQ0KICAgICAgICBmb3IgZSBpbiBzZWxmLmV4cHJzOg0KICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgIHJldCA9IGUuX3BhcnNlKCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnMgKQ0KICAgICAgICAgICAgICAgIHJldHVybiByZXQNCiAgICAgICAgICAgIGV4Y2VwdCBQYXJzZUV4Y2VwdGlvbiBhcyBlcnI6DQogICAgICAgICAgICAgICAgaWYgZXJyLmxvYyA+IG1heEV4Y0xvYzoNCiAgICAgICAgICAgICAgICAgICAgbWF4RXhjZXB0aW9uID0gZXJyDQogICAgICAgICAgICAgICAgICAgIG1heEV4Y0xvYyA9IGVyci5sb2MNCiAgICAgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOg0KICAgICAgICAgICAgICAgIGlmIGxlbihpbnN0cmluZykgPiBtYXhFeGNMb2M6DQogICAgICAgICAgICAgICAgICAgIG1heEV4Y2VwdGlvbiA9IFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLGxlbihpbnN0cmluZyksZS5lcnJtc2csc2VsZikNCiAgICAgICAgICAgICAgICAgICAgbWF4RXhjTG9jID0gbGVuKGluc3RyaW5nKQ0KDQogICAgICAgICMgb25seSBnb3QgaGVyZSBpZiBubyBleHByZXNzaW9uIG1hdGNoZWQsIHJhaXNlIGV4Y2VwdGlvbiBmb3IgbWF0Y2ggdGhhdCBtYWRlIGl0IHRoZSBmdXJ0aGVzdA0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgaWYgbWF4RXhjZXB0aW9uIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgICAgIG1heEV4Y2VwdGlvbi5tc2cgPSBzZWxmLmVycm1zZw0KICAgICAgICAgICAgICAgIHJhaXNlIG1heEV4Y2VwdGlvbg0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCAibm8gZGVmaW5lZCBhbHRlcm5hdGl2ZXMgdG8gbWF0Y2giLCBzZWxmKQ0KDQogICAgZGVmIF9faW9yX18oc2VsZiwgb3RoZXIgKToNCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToNCiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBvdGhlciApDQogICAgICAgIHJldHVybiBzZWxmLmFwcGVuZCggb3RoZXIgKSAjTWF0Y2hGaXJzdCggWyBzZWxmLCBvdGhlciBdICkNCg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIGlmIGhhc2F0dHIoc2VsZiwibmFtZSIpOg0KICAgICAgICAgICAgcmV0dXJuIHNlbGYubmFtZQ0KDQogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lOg0KICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gInsiICsgIiB8ICIuam9pbihfdXN0cihlKSBmb3IgZSBpbiBzZWxmLmV4cHJzKSArICJ9Ig0KDQogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHINCg0KICAgIGRlZiBjaGVja1JlY3Vyc2lvbiggc2VsZiwgcGFyc2VFbGVtZW50TGlzdCApOg0KICAgICAgICBzdWJSZWNDaGVja0xpc3QgPSBwYXJzZUVsZW1lbnRMaXN0WzpdICsgWyBzZWxmIF0NCiAgICAgICAgZm9yIGUgaW4gc2VsZi5leHByczoNCiAgICAgICAgICAgIGUuY2hlY2tSZWN1cnNpb24oIHN1YlJlY0NoZWNrTGlzdCApDQoNCg0KY2xhc3MgRWFjaChQYXJzZUV4cHJlc3Npb24pOg0KICAgICIiIg0KICAgIFJlcXVpcmVzIGFsbCBnaXZlbiBDe1BhcnNlRXhwcmVzc2lvbn1zIHRvIGJlIGZvdW5kLCBidXQgaW4gYW55IG9yZGVyLg0KICAgIEV4cHJlc3Npb25zIG1heSBiZSBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZS4NCiAgICBNYXkgYmUgY29uc3RydWN0ZWQgdXNpbmcgdGhlIEN7JyYnfSBvcGVyYXRvci4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBjb2xvciA9IG9uZU9mKCJSRUQgT1JBTkdFIFlFTExPVyBHUkVFTiBCTFVFIFBVUlBMRSBCTEFDSyBXSElURSBCUk9XTiIpDQogICAgICAgIHNoYXBlX3R5cGUgPSBvbmVPZigiU1FVQVJFIENJUkNMRSBUUklBTkdMRSBTVEFSIEhFWEFHT04gT0NUQUdPTiIpDQogICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpDQogICAgICAgIHNoYXBlX2F0dHIgPSAic2hhcGU6IiArIHNoYXBlX3R5cGUoInNoYXBlIikNCiAgICAgICAgcG9zbl9hdHRyID0gInBvc246IiArIEdyb3VwKGludGVnZXIoIngiKSArICcsJyArIGludGVnZXIoInkiKSkoInBvc24iKQ0KICAgICAgICBjb2xvcl9hdHRyID0gImNvbG9yOiIgKyBjb2xvcigiY29sb3IiKQ0KICAgICAgICBzaXplX2F0dHIgPSAic2l6ZToiICsgaW50ZWdlcigic2l6ZSIpDQoNCiAgICAgICAgIyB1c2UgRWFjaCAodXNpbmcgb3BlcmF0b3IgJyYnKSB0byBhY2NlcHQgYXR0cmlidXRlcyBpbiBhbnkgb3JkZXIgDQogICAgICAgICMgKHNoYXBlIGFuZCBwb3NuIGFyZSByZXF1aXJlZCwgY29sb3IgYW5kIHNpemUgYXJlIG9wdGlvbmFsKQ0KICAgICAgICBzaGFwZV9zcGVjID0gc2hhcGVfYXR0ciAmIHBvc25fYXR0ciAmIE9wdGlvbmFsKGNvbG9yX2F0dHIpICYgT3B0aW9uYWwoc2l6ZV9hdHRyKQ0KDQogICAgICAgIHNoYXBlX3NwZWMucnVuVGVzdHMoJycnDQogICAgICAgICAgICBzaGFwZTogU1FVQVJFIGNvbG9yOiBCTEFDSyBwb3NuOiAxMDAsIDEyMA0KICAgICAgICAgICAgc2hhcGU6IENJUkNMRSBzaXplOiA1MCBjb2xvcjogQkxVRSBwb3NuOiA1MCw4MA0KICAgICAgICAgICAgY29sb3I6R1JFRU4gc2l6ZToyMCBzaGFwZTpUUklBTkdMRSBwb3NuOjIwLDQwDQogICAgICAgICAgICAnJycNCiAgICAgICAgICAgICkNCiAgICBwcmludHM6Og0KICAgICAgICBzaGFwZTogU1FVQVJFIGNvbG9yOiBCTEFDSyBwb3NuOiAxMDAsIDEyMA0KICAgICAgICBbJ3NoYXBlOicsICdTUVVBUkUnLCAnY29sb3I6JywgJ0JMQUNLJywgJ3Bvc246JywgWycxMDAnLCAnLCcsICcxMjAnXV0NCiAgICAgICAgLSBjb2xvcjogQkxBQ0sNCiAgICAgICAgLSBwb3NuOiBbJzEwMCcsICcsJywgJzEyMCddDQogICAgICAgICAgLSB4OiAxMDANCiAgICAgICAgICAtIHk6IDEyMA0KICAgICAgICAtIHNoYXBlOiBTUVVBUkUNCg0KDQogICAgICAgIHNoYXBlOiBDSVJDTEUgc2l6ZTogNTAgY29sb3I6IEJMVUUgcG9zbjogNTAsODANCiAgICAgICAgWydzaGFwZTonLCAnQ0lSQ0xFJywgJ3NpemU6JywgJzUwJywgJ2NvbG9yOicsICdCTFVFJywgJ3Bvc246JywgWyc1MCcsICcsJywgJzgwJ11dDQogICAgICAgIC0gY29sb3I6IEJMVUUNCiAgICAgICAgLSBwb3NuOiBbJzUwJywgJywnLCAnODAnXQ0KICAgICAgICAgIC0geDogNTANCiAgICAgICAgICAtIHk6IDgwDQogICAgICAgIC0gc2hhcGU6IENJUkNMRQ0KICAgICAgICAtIHNpemU6IDUwDQoNCg0KICAgICAgICBjb2xvcjogR1JFRU4gc2l6ZTogMjAgc2hhcGU6IFRSSUFOR0xFIHBvc246IDIwLDQwDQogICAgICAgIFsnY29sb3I6JywgJ0dSRUVOJywgJ3NpemU6JywgJzIwJywgJ3NoYXBlOicsICdUUklBTkdMRScsICdwb3NuOicsIFsnMjAnLCAnLCcsICc0MCddXQ0KICAgICAgICAtIGNvbG9yOiBHUkVFTg0KICAgICAgICAtIHBvc246IFsnMjAnLCAnLCcsICc0MCddDQogICAgICAgICAgLSB4OiAyMA0KICAgICAgICAgIC0geTogNDANCiAgICAgICAgLSBzaGFwZTogVFJJQU5HTEUNCiAgICAgICAgLSBzaXplOiAyMA0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwcnMsIHNhdmVsaXN0ID0gVHJ1ZSApOg0KICAgICAgICBzdXBlcihFYWNoLHNlbGYpLl9faW5pdF9fKGV4cHJzLCBzYXZlbGlzdCkNCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IGFsbChlLm1heVJldHVybkVtcHR5IGZvciBlIGluIHNlbGYuZXhwcnMpDQogICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBUcnVlDQogICAgICAgIHNlbGYuaW5pdEV4cHJHcm91cHMgPSBUcnVlDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBpZiBzZWxmLmluaXRFeHByR3JvdXBzOg0KICAgICAgICAgICAgc2VsZi5vcHQxbWFwID0gZGljdCgoaWQoZS5leHByKSxlKSBmb3IgZSBpbiBzZWxmLmV4cHJzIGlmIGlzaW5zdGFuY2UoZSxPcHRpb25hbCkpDQogICAgICAgICAgICBvcHQxID0gWyBlLmV4cHIgZm9yIGUgaW4gc2VsZi5leHBycyBpZiBpc2luc3RhbmNlKGUsT3B0aW9uYWwpIF0NCiAgICAgICAgICAgIG9wdDIgPSBbIGUgZm9yIGUgaW4gc2VsZi5leHBycyBpZiBlLm1heVJldHVybkVtcHR5IGFuZCBub3QgaXNpbnN0YW5jZShlLE9wdGlvbmFsKV0NCiAgICAgICAgICAgIHNlbGYub3B0aW9uYWxzID0gb3B0MSArIG9wdDINCiAgICAgICAgICAgIHNlbGYubXVsdGlvcHRpb25hbHMgPSBbIGUuZXhwciBmb3IgZSBpbiBzZWxmLmV4cHJzIGlmIGlzaW5zdGFuY2UoZSxaZXJvT3JNb3JlKSBdDQogICAgICAgICAgICBzZWxmLm11bHRpcmVxdWlyZWQgPSBbIGUuZXhwciBmb3IgZSBpbiBzZWxmLmV4cHJzIGlmIGlzaW5zdGFuY2UoZSxPbmVPck1vcmUpIF0NCiAgICAgICAgICAgIHNlbGYucmVxdWlyZWQgPSBbIGUgZm9yIGUgaW4gc2VsZi5leHBycyBpZiBub3QgaXNpbnN0YW5jZShlLChPcHRpb25hbCxaZXJvT3JNb3JlLE9uZU9yTW9yZSkpIF0NCiAgICAgICAgICAgIHNlbGYucmVxdWlyZWQgKz0gc2VsZi5tdWx0aXJlcXVpcmVkDQogICAgICAgICAgICBzZWxmLmluaXRFeHByR3JvdXBzID0gRmFsc2UNCiAgICAgICAgdG1wTG9jID0gbG9jDQogICAgICAgIHRtcFJlcWQgPSBzZWxmLnJlcXVpcmVkWzpdDQogICAgICAgIHRtcE9wdCAgPSBzZWxmLm9wdGlvbmFsc1s6XQ0KICAgICAgICBtYXRjaE9yZGVyID0gW10NCg0KICAgICAgICBrZWVwTWF0Y2hpbmcgPSBUcnVlDQogICAgICAgIHdoaWxlIGtlZXBNYXRjaGluZzoNCiAgICAgICAgICAgIHRtcEV4cHJzID0gdG1wUmVxZCArIHRtcE9wdCArIHNlbGYubXVsdGlvcHRpb25hbHMgKyBzZWxmLm11bHRpcmVxdWlyZWQNCiAgICAgICAgICAgIGZhaWxlZCA9IFtdDQogICAgICAgICAgICBmb3IgZSBpbiB0bXBFeHByczoNCiAgICAgICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgICAgIHRtcExvYyA9IGUudHJ5UGFyc2UoIGluc3RyaW5nLCB0bXBMb2MgKQ0KICAgICAgICAgICAgICAgIGV4Y2VwdCBQYXJzZUV4Y2VwdGlvbjoNCiAgICAgICAgICAgICAgICAgICAgZmFpbGVkLmFwcGVuZChlKQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIG1hdGNoT3JkZXIuYXBwZW5kKHNlbGYub3B0MW1hcC5nZXQoaWQoZSksZSkpDQogICAgICAgICAgICAgICAgICAgIGlmIGUgaW4gdG1wUmVxZDoNCiAgICAgICAgICAgICAgICAgICAgICAgIHRtcFJlcWQucmVtb3ZlKGUpDQogICAgICAgICAgICAgICAgICAgIGVsaWYgZSBpbiB0bXBPcHQ6DQogICAgICAgICAgICAgICAgICAgICAgICB0bXBPcHQucmVtb3ZlKGUpDQogICAgICAgICAgICBpZiBsZW4oZmFpbGVkKSA9PSBsZW4odG1wRXhwcnMpOg0KICAgICAgICAgICAgICAgIGtlZXBNYXRjaGluZyA9IEZhbHNlDQoNCiAgICAgICAgaWYgdG1wUmVxZDoNCiAgICAgICAgICAgIG1pc3NpbmcgPSAiLCAiLmpvaW4oX3VzdHIoZSkgZm9yIGUgaW4gdG1wUmVxZCkNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLGxvYywiTWlzc2luZyBvbmUgb3IgbW9yZSByZXF1aXJlZCBlbGVtZW50cyAoJXMpIiAlIG1pc3NpbmcgKQ0KDQogICAgICAgICMgYWRkIGFueSB1bm1hdGNoZWQgT3B0aW9uYWxzLCBpbiBjYXNlIHRoZXkgaGF2ZSBkZWZhdWx0IHZhbHVlcyBkZWZpbmVkDQogICAgICAgIG1hdGNoT3JkZXIgKz0gW2UgZm9yIGUgaW4gc2VsZi5leHBycyBpZiBpc2luc3RhbmNlKGUsT3B0aW9uYWwpIGFuZCBlLmV4cHIgaW4gdG1wT3B0XQ0KDQogICAgICAgIHJlc3VsdGxpc3QgPSBbXQ0KICAgICAgICBmb3IgZSBpbiBtYXRjaE9yZGVyOg0KICAgICAgICAgICAgbG9jLHJlc3VsdHMgPSBlLl9wYXJzZShpbnN0cmluZyxsb2MsZG9BY3Rpb25zKQ0KICAgICAgICAgICAgcmVzdWx0bGlzdC5hcHBlbmQocmVzdWx0cykNCg0KICAgICAgICBmaW5hbFJlc3VsdHMgPSBzdW0ocmVzdWx0bGlzdCwgUGFyc2VSZXN1bHRzKFtdKSkNCiAgICAgICAgcmV0dXJuIGxvYywgZmluYWxSZXN1bHRzDQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICBpZiBoYXNhdHRyKHNlbGYsIm5hbWUiKToNCiAgICAgICAgICAgIHJldHVybiBzZWxmLm5hbWUNCg0KICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZToNCiAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICJ7IiArICIgJiAiLmpvaW4oX3VzdHIoZSkgZm9yIGUgaW4gc2VsZi5leHBycykgKyAifSINCg0KICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByDQoNCiAgICBkZWYgY2hlY2tSZWN1cnNpb24oIHNlbGYsIHBhcnNlRWxlbWVudExpc3QgKToNCiAgICAgICAgc3ViUmVjQ2hlY2tMaXN0ID0gcGFyc2VFbGVtZW50TGlzdFs6XSArIFsgc2VsZiBdDQogICAgICAgIGZvciBlIGluIHNlbGYuZXhwcnM6DQogICAgICAgICAgICBlLmNoZWNrUmVjdXJzaW9uKCBzdWJSZWNDaGVja0xpc3QgKQ0KDQoNCmNsYXNzIFBhcnNlRWxlbWVudEVuaGFuY2UoUGFyc2VyRWxlbWVudCk6DQogICAgIiIiDQogICAgQWJzdHJhY3Qgc3ViY2xhc3Mgb2YgQ3tQYXJzZXJFbGVtZW50fSwgZm9yIGNvbWJpbmluZyBhbmQgcG9zdC1wcm9jZXNzaW5nIHBhcnNlZCB0b2tlbnMuDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHByLCBzYXZlbGlzdD1GYWxzZSApOg0KICAgICAgICBzdXBlcihQYXJzZUVsZW1lbnRFbmhhbmNlLHNlbGYpLl9faW5pdF9fKHNhdmVsaXN0KQ0KICAgICAgICBpZiBpc2luc3RhbmNlKCBleHByLCBiYXNlc3RyaW5nICk6DQogICAgICAgICAgICBpZiBpc3N1YmNsYXNzKFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcywgVG9rZW4pOg0KICAgICAgICAgICAgICAgIGV4cHIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoZXhwcikNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgZXhwciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyhMaXRlcmFsKGV4cHIpKQ0KICAgICAgICBzZWxmLmV4cHIgPSBleHByDQogICAgICAgIHNlbGYuc3RyUmVwciA9IE5vbmUNCiAgICAgICAgaWYgZXhwciBpcyBub3QgTm9uZToNCiAgICAgICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IGV4cHIubWF5SW5kZXhFcnJvcg0KICAgICAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IGV4cHIubWF5UmV0dXJuRW1wdHkNCiAgICAgICAgICAgIHNlbGYuc2V0V2hpdGVzcGFjZUNoYXJzKCBleHByLndoaXRlQ2hhcnMgKQ0KICAgICAgICAgICAgc2VsZi5za2lwV2hpdGVzcGFjZSA9IGV4cHIuc2tpcFdoaXRlc3BhY2UNCiAgICAgICAgICAgIHNlbGYuc2F2ZUFzTGlzdCA9IGV4cHIuc2F2ZUFzTGlzdA0KICAgICAgICAgICAgc2VsZi5jYWxsUHJlcGFyc2UgPSBleHByLmNhbGxQcmVwYXJzZQ0KICAgICAgICAgICAgc2VsZi5pZ25vcmVFeHBycy5leHRlbmQoZXhwci5pZ25vcmVFeHBycykNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIGlmIHNlbGYuZXhwciBpcyBub3QgTm9uZToNCiAgICAgICAgICAgIHJldHVybiBzZWxmLmV4cHIuX3BhcnNlKCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnMsIGNhbGxQcmVQYXJzZT1GYWxzZSApDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbigiIixsb2Msc2VsZi5lcnJtc2csc2VsZikNCg0KICAgIGRlZiBsZWF2ZVdoaXRlc3BhY2UoIHNlbGYgKToNCiAgICAgICAgc2VsZi5za2lwV2hpdGVzcGFjZSA9IEZhbHNlDQogICAgICAgIHNlbGYuZXhwciA9IHNlbGYuZXhwci5jb3B5KCkNCiAgICAgICAgaWYgc2VsZi5leHByIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgc2VsZi5leHByLmxlYXZlV2hpdGVzcGFjZSgpDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgaWdub3JlKCBzZWxmLCBvdGhlciApOg0KICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgU3VwcHJlc3MgKToNCiAgICAgICAgICAgIGlmIG90aGVyIG5vdCBpbiBzZWxmLmlnbm9yZUV4cHJzOg0KICAgICAgICAgICAgICAgIHN1cGVyKCBQYXJzZUVsZW1lbnRFbmhhbmNlLCBzZWxmKS5pZ25vcmUoIG90aGVyICkNCiAgICAgICAgICAgICAgICBpZiBzZWxmLmV4cHIgaXMgbm90IE5vbmU6DQogICAgICAgICAgICAgICAgICAgIHNlbGYuZXhwci5pZ25vcmUoIHNlbGYuaWdub3JlRXhwcnNbLTFdICkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHN1cGVyKCBQYXJzZUVsZW1lbnRFbmhhbmNlLCBzZWxmKS5pZ25vcmUoIG90aGVyICkNCiAgICAgICAgICAgIGlmIHNlbGYuZXhwciBpcyBub3QgTm9uZToNCiAgICAgICAgICAgICAgICBzZWxmLmV4cHIuaWdub3JlKCBzZWxmLmlnbm9yZUV4cHJzWy0xXSApDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgc3RyZWFtbGluZSggc2VsZiApOg0KICAgICAgICBzdXBlcihQYXJzZUVsZW1lbnRFbmhhbmNlLHNlbGYpLnN0cmVhbWxpbmUoKQ0KICAgICAgICBpZiBzZWxmLmV4cHIgaXMgbm90IE5vbmU6DQogICAgICAgICAgICBzZWxmLmV4cHIuc3RyZWFtbGluZSgpDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgY2hlY2tSZWN1cnNpb24oIHNlbGYsIHBhcnNlRWxlbWVudExpc3QgKToNCiAgICAgICAgaWYgc2VsZiBpbiBwYXJzZUVsZW1lbnRMaXN0Og0KICAgICAgICAgICAgcmFpc2UgUmVjdXJzaXZlR3JhbW1hckV4Y2VwdGlvbiggcGFyc2VFbGVtZW50TGlzdCtbc2VsZl0gKQ0KICAgICAgICBzdWJSZWNDaGVja0xpc3QgPSBwYXJzZUVsZW1lbnRMaXN0WzpdICsgWyBzZWxmIF0NCiAgICAgICAgaWYgc2VsZi5leHByIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgc2VsZi5leHByLmNoZWNrUmVjdXJzaW9uKCBzdWJSZWNDaGVja0xpc3QgKQ0KDQogICAgZGVmIHZhbGlkYXRlKCBzZWxmLCB2YWxpZGF0ZVRyYWNlPVtdICk6DQogICAgICAgIHRtcCA9IHZhbGlkYXRlVHJhY2VbOl0rW3NlbGZdDQogICAgICAgIGlmIHNlbGYuZXhwciBpcyBub3QgTm9uZToNCiAgICAgICAgICAgIHNlbGYuZXhwci52YWxpZGF0ZSh0bXApDQogICAgICAgIHNlbGYuY2hlY2tSZWN1cnNpb24oIFtdICkNCg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHJldHVybiBzdXBlcihQYXJzZUVsZW1lbnRFbmhhbmNlLHNlbGYpLl9fc3RyX18oKQ0KICAgICAgICBleGNlcHQgRXhjZXB0aW9uOg0KICAgICAgICAgICAgcGFzcw0KDQogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lIGFuZCBzZWxmLmV4cHIgaXMgbm90IE5vbmU6DQogICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAiJXM6KCVzKSIgJSAoIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBfdXN0cihzZWxmLmV4cHIpICkNCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcg0KDQoNCmNsYXNzIEZvbGxvd2VkQnkoUGFyc2VFbGVtZW50RW5oYW5jZSk6DQogICAgIiIiDQogICAgTG9va2FoZWFkIG1hdGNoaW5nIG9mIHRoZSBnaXZlbiBwYXJzZSBleHByZXNzaW9uLiAgQ3tGb2xsb3dlZEJ5fQ0KICAgIGRvZXMgSXtub3R9IGFkdmFuY2UgdGhlIHBhcnNpbmcgcG9zaXRpb24gd2l0aGluIHRoZSBpbnB1dCBzdHJpbmcsIGl0IG9ubHkNCiAgICB2ZXJpZmllcyB0aGF0IHRoZSBzcGVjaWZpZWQgcGFyc2UgZXhwcmVzc2lvbiBtYXRjaGVzIGF0IHRoZSBjdXJyZW50DQogICAgcG9zaXRpb24uICBDe0ZvbGxvd2VkQnl9IGFsd2F5cyByZXR1cm5zIGEgbnVsbCB0b2tlbiBsaXN0Lg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgICMgdXNlIEZvbGxvd2VkQnkgdG8gbWF0Y2ggYSBsYWJlbCBvbmx5IGlmIGl0IGlzIGZvbGxvd2VkIGJ5IGEgJzonDQogICAgICAgIGRhdGFfd29yZCA9IFdvcmQoYWxwaGFzKQ0KICAgICAgICBsYWJlbCA9IGRhdGFfd29yZCArIEZvbGxvd2VkQnkoJzonKQ0KICAgICAgICBhdHRyX2V4cHIgPSBHcm91cChsYWJlbCArIFN1cHByZXNzKCc6JykgKyBPbmVPck1vcmUoZGF0YV93b3JkLCBzdG9wT249bGFiZWwpLnNldFBhcnNlQWN0aW9uKCcgJy5qb2luKSkNCiAgICAgICAgDQogICAgICAgIE9uZU9yTW9yZShhdHRyX2V4cHIpLnBhcnNlU3RyaW5nKCJzaGFwZTogU1FVQVJFIGNvbG9yOiBCTEFDSyBwb3NuOiB1cHBlciBsZWZ0IikucHByaW50KCkNCiAgICBwcmludHM6Og0KICAgICAgICBbWydzaGFwZScsICdTUVVBUkUnXSwgWydjb2xvcicsICdCTEFDSyddLCBbJ3Bvc24nLCAndXBwZXIgbGVmdCddXQ0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwciApOg0KICAgICAgICBzdXBlcihGb2xsb3dlZEJ5LHNlbGYpLl9faW5pdF9fKGV4cHIpDQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBUcnVlDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBzZWxmLmV4cHIudHJ5UGFyc2UoIGluc3RyaW5nLCBsb2MgKQ0KICAgICAgICByZXR1cm4gbG9jLCBbXQ0KDQoNCmNsYXNzIE5vdEFueShQYXJzZUVsZW1lbnRFbmhhbmNlKToNCiAgICAiIiINCiAgICBMb29rYWhlYWQgdG8gZGlzYWxsb3cgbWF0Y2hpbmcgd2l0aCB0aGUgZ2l2ZW4gcGFyc2UgZXhwcmVzc2lvbi4gIEN7Tm90QW55fQ0KICAgIGRvZXMgSXtub3R9IGFkdmFuY2UgdGhlIHBhcnNpbmcgcG9zaXRpb24gd2l0aGluIHRoZSBpbnB1dCBzdHJpbmcsIGl0IG9ubHkNCiAgICB2ZXJpZmllcyB0aGF0IHRoZSBzcGVjaWZpZWQgcGFyc2UgZXhwcmVzc2lvbiBkb2VzIEl7bm90fSBtYXRjaCBhdCB0aGUgY3VycmVudA0KICAgIHBvc2l0aW9uLiAgQWxzbywgQ3tOb3RBbnl9IGRvZXMgSXtub3R9IHNraXAgb3ZlciBsZWFkaW5nIHdoaXRlc3BhY2UuIEN7Tm90QW55fQ0KICAgIGFsd2F5cyByZXR1cm5zIGEgbnVsbCB0b2tlbiBsaXN0LiAgTWF5IGJlIGNvbnN0cnVjdGVkIHVzaW5nIHRoZSAnficgb3BlcmF0b3IuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHByICk6DQogICAgICAgIHN1cGVyKE5vdEFueSxzZWxmKS5fX2luaXRfXyhleHByKQ0KICAgICAgICAjfiBzZWxmLmxlYXZlV2hpdGVzcGFjZSgpDQogICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBGYWxzZSAgIyBkbyBOT1QgdXNlIHNlbGYubGVhdmVXaGl0ZXNwYWNlKCksIGRvbid0IHdhbnQgdG8gcHJvcGFnYXRlIHRvIGV4cHJzDQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBUcnVlDQogICAgICAgIHNlbGYuZXJybXNnID0gIkZvdW5kIHVud2FudGVkIHRva2VuLCAiK191c3RyKHNlbGYuZXhwcikNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIGlmIHNlbGYuZXhwci5jYW5QYXJzZU5leHQoaW5zdHJpbmcsIGxvYyk6DQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCiAgICAgICAgcmV0dXJuIGxvYywgW10NCg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIGlmIGhhc2F0dHIoc2VsZiwibmFtZSIpOg0KICAgICAgICAgICAgcmV0dXJuIHNlbGYubmFtZQ0KDQogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lOg0KICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gIn57IiArIF91c3RyKHNlbGYuZXhwcikgKyAifSINCg0KICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByDQoNCmNsYXNzIF9NdWx0aXBsZU1hdGNoKFBhcnNlRWxlbWVudEVuaGFuY2UpOg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwciwgc3RvcE9uPU5vbmUpOg0KICAgICAgICBzdXBlcihfTXVsdGlwbGVNYXRjaCwgc2VsZikuX19pbml0X18oZXhwcikNCiAgICAgICAgc2VsZi5zYXZlQXNMaXN0ID0gVHJ1ZQ0KICAgICAgICBlbmRlciA9IHN0b3BPbg0KICAgICAgICBpZiBpc2luc3RhbmNlKGVuZGVyLCBiYXNlc3RyaW5nKToNCiAgICAgICAgICAgIGVuZGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKGVuZGVyKQ0KICAgICAgICBzZWxmLm5vdF9lbmRlciA9IH5lbmRlciBpZiBlbmRlciBpcyBub3QgTm9uZSBlbHNlIE5vbmUNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIHNlbGZfZXhwcl9wYXJzZSA9IHNlbGYuZXhwci5fcGFyc2UNCiAgICAgICAgc2VsZl9za2lwX2lnbm9yYWJsZXMgPSBzZWxmLl9za2lwSWdub3JhYmxlcw0KICAgICAgICBjaGVja19lbmRlciA9IHNlbGYubm90X2VuZGVyIGlzIG5vdCBOb25lDQogICAgICAgIGlmIGNoZWNrX2VuZGVyOg0KICAgICAgICAgICAgdHJ5X25vdF9lbmRlciA9IHNlbGYubm90X2VuZGVyLnRyeVBhcnNlDQogICAgICAgIA0KICAgICAgICAjIG11c3QgYmUgYXQgbGVhc3Qgb25lIChidXQgZmlyc3Qgc2VlIGlmIHdlIGFyZSB0aGUgc3RvcE9uIHNlbnRpbmVsOw0KICAgICAgICAjIGlmIHNvLCBmYWlsKQ0KICAgICAgICBpZiBjaGVja19lbmRlcjoNCiAgICAgICAgICAgIHRyeV9ub3RfZW5kZXIoaW5zdHJpbmcsIGxvYykNCiAgICAgICAgbG9jLCB0b2tlbnMgPSBzZWxmX2V4cHJfcGFyc2UoIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucywgY2FsbFByZVBhcnNlPUZhbHNlICkNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgaGFzSWdub3JlRXhwcnMgPSAobm90IG5vdCBzZWxmLmlnbm9yZUV4cHJzKQ0KICAgICAgICAgICAgd2hpbGUgMToNCiAgICAgICAgICAgICAgICBpZiBjaGVja19lbmRlcjoNCiAgICAgICAgICAgICAgICAgICAgdHJ5X25vdF9lbmRlcihpbnN0cmluZywgbG9jKQ0KICAgICAgICAgICAgICAgIGlmIGhhc0lnbm9yZUV4cHJzOg0KICAgICAgICAgICAgICAgICAgICBwcmVsb2MgPSBzZWxmX3NraXBfaWdub3JhYmxlcyggaW5zdHJpbmcsIGxvYyApDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgcHJlbG9jID0gbG9jDQogICAgICAgICAgICAgICAgbG9jLCB0bXB0b2tlbnMgPSBzZWxmX2V4cHJfcGFyc2UoIGluc3RyaW5nLCBwcmVsb2MsIGRvQWN0aW9ucyApDQogICAgICAgICAgICAgICAgaWYgdG1wdG9rZW5zIG9yIHRtcHRva2Vucy5oYXNrZXlzKCk6DQogICAgICAgICAgICAgICAgICAgIHRva2VucyArPSB0bXB0b2tlbnMNCiAgICAgICAgZXhjZXB0IChQYXJzZUV4Y2VwdGlvbixJbmRleEVycm9yKToNCiAgICAgICAgICAgIHBhc3MNCg0KICAgICAgICByZXR1cm4gbG9jLCB0b2tlbnMNCiAgICAgICAgDQpjbGFzcyBPbmVPck1vcmUoX011bHRpcGxlTWF0Y2gpOg0KICAgICIiIg0KICAgIFJlcGV0aXRpb24gb2Ygb25lIG9yIG1vcmUgb2YgdGhlIGdpdmVuIGV4cHJlc3Npb24uDQogICAgDQogICAgUGFyYW1ldGVyczoNCiAgICAgLSBleHByIC0gZXhwcmVzc2lvbiB0aGF0IG11c3QgbWF0Y2ggb25lIG9yIG1vcmUgdGltZXMNCiAgICAgLSBzdG9wT24gLSAoZGVmYXVsdD1De05vbmV9KSAtIGV4cHJlc3Npb24gZm9yIGEgdGVybWluYXRpbmcgc2VudGluZWwNCiAgICAgICAgICAob25seSByZXF1aXJlZCBpZiB0aGUgc2VudGluZWwgd291bGQgb3JkaW5hcmlseSBtYXRjaCB0aGUgcmVwZXRpdGlvbiANCiAgICAgICAgICBleHByZXNzaW9uKSAgICAgICAgICANCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBkYXRhX3dvcmQgPSBXb3JkKGFscGhhcykNCiAgICAgICAgbGFiZWwgPSBkYXRhX3dvcmQgKyBGb2xsb3dlZEJ5KCc6JykNCiAgICAgICAgYXR0cl9leHByID0gR3JvdXAobGFiZWwgKyBTdXBwcmVzcygnOicpICsgT25lT3JNb3JlKGRhdGFfd29yZCkuc2V0UGFyc2VBY3Rpb24oJyAnLmpvaW4pKQ0KDQogICAgICAgIHRleHQgPSAic2hhcGU6IFNRVUFSRSBwb3NuOiB1cHBlciBsZWZ0IGNvbG9yOiBCTEFDSyINCiAgICAgICAgT25lT3JNb3JlKGF0dHJfZXhwcikucGFyc2VTdHJpbmcodGV4dCkucHByaW50KCkgICMgRmFpbCEgcmVhZCAnY29sb3InIGFzIGRhdGEgaW5zdGVhZCBvZiBuZXh0IGxhYmVsIC0+IFtbJ3NoYXBlJywgJ1NRVUFSRSBjb2xvciddXQ0KDQogICAgICAgICMgdXNlIHN0b3BPbiBhdHRyaWJ1dGUgZm9yIE9uZU9yTW9yZSB0byBhdm9pZCByZWFkaW5nIGxhYmVsIHN0cmluZyBhcyBwYXJ0IG9mIHRoZSBkYXRhDQogICAgICAgIGF0dHJfZXhwciA9IEdyb3VwKGxhYmVsICsgU3VwcHJlc3MoJzonKSArIE9uZU9yTW9yZShkYXRhX3dvcmQsIHN0b3BPbj1sYWJlbCkuc2V0UGFyc2VBY3Rpb24oJyAnLmpvaW4pKQ0KICAgICAgICBPbmVPck1vcmUoYXR0cl9leHByKS5wYXJzZVN0cmluZyh0ZXh0KS5wcHJpbnQoKSAjIEJldHRlciAtPiBbWydzaGFwZScsICdTUVVBUkUnXSwgWydwb3NuJywgJ3VwcGVyIGxlZnQnXSwgWydjb2xvcicsICdCTEFDSyddXQ0KICAgICAgICANCiAgICAgICAgIyBjb3VsZCBhbHNvIGJlIHdyaXR0ZW4gYXMNCiAgICAgICAgKGF0dHJfZXhwciAqICgxLCkpLnBhcnNlU3RyaW5nKHRleHQpLnBwcmludCgpDQogICAgIiIiDQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICBpZiBoYXNhdHRyKHNlbGYsIm5hbWUiKToNCiAgICAgICAgICAgIHJldHVybiBzZWxmLm5hbWUNCg0KICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZToNCiAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICJ7IiArIF91c3RyKHNlbGYuZXhwcikgKyAifS4uLiINCg0KICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByDQoNCmNsYXNzIFplcm9Pck1vcmUoX011bHRpcGxlTWF0Y2gpOg0KICAgICIiIg0KICAgIE9wdGlvbmFsIHJlcGV0aXRpb24gb2YgemVybyBvciBtb3JlIG9mIHRoZSBnaXZlbiBleHByZXNzaW9uLg0KICAgIA0KICAgIFBhcmFtZXRlcnM6DQogICAgIC0gZXhwciAtIGV4cHJlc3Npb24gdGhhdCBtdXN0IG1hdGNoIHplcm8gb3IgbW9yZSB0aW1lcw0KICAgICAtIHN0b3BPbiAtIChkZWZhdWx0PUN7Tm9uZX0pIC0gZXhwcmVzc2lvbiBmb3IgYSB0ZXJtaW5hdGluZyBzZW50aW5lbA0KICAgICAgICAgIChvbmx5IHJlcXVpcmVkIGlmIHRoZSBzZW50aW5lbCB3b3VsZCBvcmRpbmFyaWx5IG1hdGNoIHRoZSByZXBldGl0aW9uIA0KICAgICAgICAgIGV4cHJlc3Npb24pICAgICAgICAgIA0KDQogICAgRXhhbXBsZTogc2ltaWxhciB0byBMe09uZU9yTW9yZX0NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHIsIHN0b3BPbj1Ob25lKToNCiAgICAgICAgc3VwZXIoWmVyb09yTW9yZSxzZWxmKS5fX2luaXRfXyhleHByLCBzdG9wT249c3RvcE9uKQ0KICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gVHJ1ZQ0KICAgICAgICANCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICB0cnk6DQogICAgICAgICAgICByZXR1cm4gc3VwZXIoWmVyb09yTW9yZSwgc2VsZikucGFyc2VJbXBsKGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucykNCiAgICAgICAgZXhjZXB0IChQYXJzZUV4Y2VwdGlvbixJbmRleEVycm9yKToNCiAgICAgICAgICAgIHJldHVybiBsb2MsIFtdDQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICBpZiBoYXNhdHRyKHNlbGYsIm5hbWUiKToNCiAgICAgICAgICAgIHJldHVybiBzZWxmLm5hbWUNCg0KICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZToNCiAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICJbIiArIF91c3RyKHNlbGYuZXhwcikgKyAiXS4uLiINCg0KICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByDQoNCmNsYXNzIF9OdWxsVG9rZW4ob2JqZWN0KToNCiAgICBkZWYgX19ib29sX18oc2VsZik6DQogICAgICAgIHJldHVybiBGYWxzZQ0KICAgIF9fbm9uemVyb19fID0gX19ib29sX18NCiAgICBkZWYgX19zdHJfXyhzZWxmKToNCiAgICAgICAgcmV0dXJuICIiDQoNCl9vcHRpb25hbE5vdE1hdGNoZWQgPSBfTnVsbFRva2VuKCkNCmNsYXNzIE9wdGlvbmFsKFBhcnNlRWxlbWVudEVuaGFuY2UpOg0KICAgICIiIg0KICAgIE9wdGlvbmFsIG1hdGNoaW5nIG9mIHRoZSBnaXZlbiBleHByZXNzaW9uLg0KDQogICAgUGFyYW1ldGVyczoNCiAgICAgLSBleHByIC0gZXhwcmVzc2lvbiB0aGF0IG11c3QgbWF0Y2ggemVybyBvciBtb3JlIHRpbWVzDQogICAgIC0gZGVmYXVsdCAob3B0aW9uYWwpIC0gdmFsdWUgdG8gYmUgcmV0dXJuZWQgaWYgdGhlIG9wdGlvbmFsIGV4cHJlc3Npb24gaXMgbm90IGZvdW5kLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgICMgVVMgcG9zdGFsIGNvZGUgY2FuIGJlIGEgNS1kaWdpdCB6aXAsIHBsdXMgb3B0aW9uYWwgNC1kaWdpdCBxdWFsaWZpZXINCiAgICAgICAgemlwID0gQ29tYmluZShXb3JkKG51bXMsIGV4YWN0PTUpICsgT3B0aW9uYWwoJy0nICsgV29yZChudW1zLCBleGFjdD00KSkpDQogICAgICAgIHppcC5ydW5UZXN0cygnJycNCiAgICAgICAgICAgICMgdHJhZGl0aW9uYWwgWklQIGNvZGUNCiAgICAgICAgICAgIDEyMzQ1DQogICAgICAgICAgICANCiAgICAgICAgICAgICMgWklQKzQgZm9ybQ0KICAgICAgICAgICAgMTIxMDEtMDAwMQ0KICAgICAgICAgICAgDQogICAgICAgICAgICAjIGludmFsaWQgWklQDQogICAgICAgICAgICA5ODc2NS0NCiAgICAgICAgICAgICcnJykNCiAgICBwcmludHM6Og0KICAgICAgICAjIHRyYWRpdGlvbmFsIFpJUCBjb2RlDQogICAgICAgIDEyMzQ1DQogICAgICAgIFsnMTIzNDUnXQ0KDQogICAgICAgICMgWklQKzQgZm9ybQ0KICAgICAgICAxMjEwMS0wMDAxDQogICAgICAgIFsnMTIxMDEtMDAwMSddDQoNCiAgICAgICAgIyBpbnZhbGlkIFpJUA0KICAgICAgICA5ODc2NS0NCiAgICAgICAgICAgICBeDQogICAgICAgIEZBSUw6IEV4cGVjdGVkIGVuZCBvZiB0ZXh0IChhdCBjaGFyIDUpLCAobGluZToxLCBjb2w6NikNCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHIsIGRlZmF1bHQ9X29wdGlvbmFsTm90TWF0Y2hlZCApOg0KICAgICAgICBzdXBlcihPcHRpb25hbCxzZWxmKS5fX2luaXRfXyggZXhwciwgc2F2ZWxpc3Q9RmFsc2UgKQ0KICAgICAgICBzZWxmLnNhdmVBc0xpc3QgPSBzZWxmLmV4cHIuc2F2ZUFzTGlzdA0KICAgICAgICBzZWxmLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHQNCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIHRyeToNCiAgICAgICAgICAgIGxvYywgdG9rZW5zID0gc2VsZi5leHByLl9wYXJzZSggaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zLCBjYWxsUHJlUGFyc2U9RmFsc2UgKQ0KICAgICAgICBleGNlcHQgKFBhcnNlRXhjZXB0aW9uLEluZGV4RXJyb3IpOg0KICAgICAgICAgICAgaWYgc2VsZi5kZWZhdWx0VmFsdWUgaXMgbm90IF9vcHRpb25hbE5vdE1hdGNoZWQ6DQogICAgICAgICAgICAgICAgaWYgc2VsZi5leHByLnJlc3VsdHNOYW1lOg0KICAgICAgICAgICAgICAgICAgICB0b2tlbnMgPSBQYXJzZVJlc3VsdHMoWyBzZWxmLmRlZmF1bHRWYWx1ZSBdKQ0KICAgICAgICAgICAgICAgICAgICB0b2tlbnNbc2VsZi5leHByLnJlc3VsdHNOYW1lXSA9IHNlbGYuZGVmYXVsdFZhbHVlDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgdG9rZW5zID0gWyBzZWxmLmRlZmF1bHRWYWx1ZSBdDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHRva2VucyA9IFtdDQogICAgICAgIHJldHVybiBsb2MsIHRva2Vucw0KDQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgaWYgaGFzYXR0cihzZWxmLCJuYW1lIik6DQogICAgICAgICAgICByZXR1cm4gc2VsZi5uYW1lDQoNCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6DQogICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAiWyIgKyBfdXN0cihzZWxmLmV4cHIpICsgIl0iDQoNCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcg0KDQpjbGFzcyBTa2lwVG8oUGFyc2VFbGVtZW50RW5oYW5jZSk6DQogICAgIiIiDQogICAgVG9rZW4gZm9yIHNraXBwaW5nIG92ZXIgYWxsIHVuZGVmaW5lZCB0ZXh0IHVudGlsIHRoZSBtYXRjaGVkIGV4cHJlc3Npb24gaXMgZm91bmQuDQoNCiAgICBQYXJhbWV0ZXJzOg0KICAgICAtIGV4cHIgLSB0YXJnZXQgZXhwcmVzc2lvbiBtYXJraW5nIHRoZSBlbmQgb2YgdGhlIGRhdGEgdG8gYmUgc2tpcHBlZA0KICAgICAtIGluY2x1ZGUgLSAoZGVmYXVsdD1De0ZhbHNlfSkgaWYgVHJ1ZSwgdGhlIHRhcmdldCBleHByZXNzaW9uIGlzIGFsc28gcGFyc2VkIA0KICAgICAgICAgICh0aGUgc2tpcHBlZCB0ZXh0IGFuZCB0YXJnZXQgZXhwcmVzc2lvbiBhcmUgcmV0dXJuZWQgYXMgYSAyLWVsZW1lbnQgbGlzdCkuDQogICAgIC0gaWdub3JlIC0gKGRlZmF1bHQ9Q3tOb25lfSkgdXNlZCB0byBkZWZpbmUgZ3JhbW1hcnMgKHR5cGljYWxseSBxdW90ZWQgc3RyaW5ncyBhbmQgDQogICAgICAgICAgY29tbWVudHMpIHRoYXQgbWlnaHQgY29udGFpbiBmYWxzZSBtYXRjaGVzIHRvIHRoZSB0YXJnZXQgZXhwcmVzc2lvbg0KICAgICAtIGZhaWxPbiAtIChkZWZhdWx0PUN7Tm9uZX0pIGRlZmluZSBleHByZXNzaW9ucyB0aGF0IGFyZSBub3QgYWxsb3dlZCB0byBiZSANCiAgICAgICAgICBpbmNsdWRlZCBpbiB0aGUgc2tpcHBlZCB0ZXN0OyBpZiBmb3VuZCBiZWZvcmUgdGhlIHRhcmdldCBleHByZXNzaW9uIGlzIGZvdW5kLCANCiAgICAgICAgICB0aGUgU2tpcFRvIGlzIG5vdCBhIG1hdGNoDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgcmVwb3J0ID0gJycnDQogICAgICAgICAgICBPdXRzdGFuZGluZyBJc3N1ZXMgUmVwb3J0IC0gMSBKYW4gMjAwMA0KDQogICAgICAgICAgICAgICAjIHwgU2V2ZXJpdHkgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICBEYXlzIE9wZW4NCiAgICAgICAgICAgIC0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLQ0KICAgICAgICAgICAgIDEwMSB8IENyaXRpY2FsIHwgSW50ZXJtaXR0ZW50IHN5c3RlbSBjcmFzaCAgICAgICAgICAgICAgICAgfCAgICAgICAgICA2DQogICAgICAgICAgICAgIDk0IHwgQ29zbWV0aWMgfCBTcGVsbGluZyBlcnJvciBvbiBMb2dpbiAoJ2xvZ3xuJykgICAgICAgICB8ICAgICAgICAgMTQNCiAgICAgICAgICAgICAgNzkgfCBNaW5vciAgICB8IFN5c3RlbSBzbG93IHdoZW4gcnVubmluZyB0b28gbWFueSByZXBvcnRzIHwgICAgICAgICA0Nw0KICAgICAgICAgICAgJycnDQogICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpDQogICAgICAgIFNFUCA9IFN1cHByZXNzKCd8JykNCiAgICAgICAgIyB1c2UgU2tpcFRvIHRvIHNpbXBseSBtYXRjaCBldmVyeXRoaW5nIHVwIHVudGlsIHRoZSBuZXh0IFNFUA0KICAgICAgICAjIC0gaWdub3JlIHF1b3RlZCBzdHJpbmdzLCBzbyB0aGF0IGEgJ3wnIGNoYXJhY3RlciBpbnNpZGUgYSBxdW90ZWQgc3RyaW5nIGRvZXMgbm90IG1hdGNoDQogICAgICAgICMgLSBwYXJzZSBhY3Rpb24gd2lsbCBjYWxsIHRva2VuLnN0cmlwKCkgZm9yIGVhY2ggbWF0Y2hlZCB0b2tlbiwgaS5lLiwgdGhlIGRlc2NyaXB0aW9uIGJvZHkNCiAgICAgICAgc3RyaW5nX2RhdGEgPSBTa2lwVG8oU0VQLCBpZ25vcmU9cXVvdGVkU3RyaW5nKQ0KICAgICAgICBzdHJpbmdfZGF0YS5zZXRQYXJzZUFjdGlvbih0b2tlbk1hcChzdHIuc3RyaXApKQ0KICAgICAgICB0aWNrZXRfZXhwciA9IChpbnRlZ2VyKCJpc3N1ZV9udW0iKSArIFNFUCANCiAgICAgICAgICAgICAgICAgICAgICArIHN0cmluZ19kYXRhKCJzZXYiKSArIFNFUCANCiAgICAgICAgICAgICAgICAgICAgICArIHN0cmluZ19kYXRhKCJkZXNjIikgKyBTRVAgDQogICAgICAgICAgICAgICAgICAgICAgKyBpbnRlZ2VyKCJkYXlzX29wZW4iKSkNCiAgICAgICAgDQogICAgICAgIGZvciB0a3QgaW4gdGlja2V0X2V4cHIuc2VhcmNoU3RyaW5nKHJlcG9ydCk6DQogICAgICAgICAgICBwcmludCB0a3QuZHVtcCgpDQogICAgcHJpbnRzOjoNCiAgICAgICAgWycxMDEnLCAnQ3JpdGljYWwnLCAnSW50ZXJtaXR0ZW50IHN5c3RlbSBjcmFzaCcsICc2J10NCiAgICAgICAgLSBkYXlzX29wZW46IDYNCiAgICAgICAgLSBkZXNjOiBJbnRlcm1pdHRlbnQgc3lzdGVtIGNyYXNoDQogICAgICAgIC0gaXNzdWVfbnVtOiAxMDENCiAgICAgICAgLSBzZXY6IENyaXRpY2FsDQogICAgICAgIFsnOTQnLCAnQ29zbWV0aWMnLCAiU3BlbGxpbmcgZXJyb3Igb24gTG9naW4gKCdsb2d8bicpIiwgJzE0J10NCiAgICAgICAgLSBkYXlzX29wZW46IDE0DQogICAgICAgIC0gZGVzYzogU3BlbGxpbmcgZXJyb3Igb24gTG9naW4gKCdsb2d8bicpDQogICAgICAgIC0gaXNzdWVfbnVtOiA5NA0KICAgICAgICAtIHNldjogQ29zbWV0aWMNCiAgICAgICAgWyc3OScsICdNaW5vcicsICdTeXN0ZW0gc2xvdyB3aGVuIHJ1bm5pbmcgdG9vIG1hbnkgcmVwb3J0cycsICc0NyddDQogICAgICAgIC0gZGF5c19vcGVuOiA0Nw0KICAgICAgICAtIGRlc2M6IFN5c3RlbSBzbG93IHdoZW4gcnVubmluZyB0b28gbWFueSByZXBvcnRzDQogICAgICAgIC0gaXNzdWVfbnVtOiA3OQ0KICAgICAgICAtIHNldjogTWlub3INCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIG90aGVyLCBpbmNsdWRlPUZhbHNlLCBpZ25vcmU9Tm9uZSwgZmFpbE9uPU5vbmUgKToNCiAgICAgICAgc3VwZXIoIFNraXBUbywgc2VsZiApLl9faW5pdF9fKCBvdGhlciApDQogICAgICAgIHNlbGYuaWdub3JlRXhwciA9IGlnbm9yZQ0KICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gVHJ1ZQ0KICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBGYWxzZQ0KICAgICAgICBzZWxmLmluY2x1ZGVNYXRjaCA9IGluY2x1ZGUNCiAgICAgICAgc2VsZi5hc0xpc3QgPSBGYWxzZQ0KICAgICAgICBpZiBpc2luc3RhbmNlKGZhaWxPbiwgYmFzZXN0cmluZyk6DQogICAgICAgICAgICBzZWxmLmZhaWxPbiA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyhmYWlsT24pDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBzZWxmLmZhaWxPbiA9IGZhaWxPbg0KICAgICAgICBzZWxmLmVycm1zZyA9ICJObyBtYXRjaCBmb3VuZCBmb3IgIitfdXN0cihzZWxmLmV4cHIpDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBzdGFydGxvYyA9IGxvYw0KICAgICAgICBpbnN0cmxlbiA9IGxlbihpbnN0cmluZykNCiAgICAgICAgZXhwciA9IHNlbGYuZXhwcg0KICAgICAgICBleHByX3BhcnNlID0gc2VsZi5leHByLl9wYXJzZQ0KICAgICAgICBzZWxmX2ZhaWxPbl9jYW5QYXJzZU5leHQgPSBzZWxmLmZhaWxPbi5jYW5QYXJzZU5leHQgaWYgc2VsZi5mYWlsT24gaXMgbm90IE5vbmUgZWxzZSBOb25lDQogICAgICAgIHNlbGZfaWdub3JlRXhwcl90cnlQYXJzZSA9IHNlbGYuaWdub3JlRXhwci50cnlQYXJzZSBpZiBzZWxmLmlnbm9yZUV4cHIgaXMgbm90IE5vbmUgZWxzZSBOb25lDQogICAgICAgIA0KICAgICAgICB0bXBsb2MgPSBsb2MNCiAgICAgICAgd2hpbGUgdG1wbG9jIDw9IGluc3RybGVuOg0KICAgICAgICAgICAgaWYgc2VsZl9mYWlsT25fY2FuUGFyc2VOZXh0IGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgICAgICMgYnJlYWsgaWYgZmFpbE9uIGV4cHJlc3Npb24gbWF0Y2hlcw0KICAgICAgICAgICAgICAgIGlmIHNlbGZfZmFpbE9uX2NhblBhcnNlTmV4dChpbnN0cmluZywgdG1wbG9jKToNCiAgICAgICAgICAgICAgICAgICAgYnJlYWsNCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICBpZiBzZWxmX2lnbm9yZUV4cHJfdHJ5UGFyc2UgaXMgbm90IE5vbmU6DQogICAgICAgICAgICAgICAgIyBhZHZhbmNlIHBhc3QgaWdub3JlIGV4cHJlc3Npb25zDQogICAgICAgICAgICAgICAgd2hpbGUgMToNCiAgICAgICAgICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgICAgICAgICAgdG1wbG9jID0gc2VsZl9pZ25vcmVFeHByX3RyeVBhcnNlKGluc3RyaW5nLCB0bXBsb2MpDQogICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBQYXJzZUJhc2VFeGNlcHRpb246DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhaw0KICAgICAgICAgICAgDQogICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgZXhwcl9wYXJzZShpbnN0cmluZywgdG1wbG9jLCBkb0FjdGlvbnM9RmFsc2UsIGNhbGxQcmVQYXJzZT1GYWxzZSkNCiAgICAgICAgICAgIGV4Y2VwdCAoUGFyc2VFeGNlcHRpb24sIEluZGV4RXJyb3IpOg0KICAgICAgICAgICAgICAgICMgbm8gbWF0Y2gsIGFkdmFuY2UgbG9jIGluIHN0cmluZw0KICAgICAgICAgICAgICAgIHRtcGxvYyArPSAxDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICMgbWF0Y2hlZCBza2lwdG8gZXhwciwgZG9uZQ0KICAgICAgICAgICAgICAgIGJyZWFrDQoNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgICMgcmFuIG9mZiB0aGUgZW5kIG9mIHRoZSBpbnB1dCBzdHJpbmcgd2l0aG91dCBtYXRjaGluZyBza2lwdG8gZXhwciwgZmFpbA0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQoNCiAgICAgICAgIyBidWlsZCB1cCByZXR1cm4gdmFsdWVzDQogICAgICAgIGxvYyA9IHRtcGxvYw0KICAgICAgICBza2lwdGV4dCA9IGluc3RyaW5nW3N0YXJ0bG9jOmxvY10NCiAgICAgICAgc2tpcHJlc3VsdCA9IFBhcnNlUmVzdWx0cyhza2lwdGV4dCkNCiAgICAgICAgDQogICAgICAgIGlmIHNlbGYuaW5jbHVkZU1hdGNoOg0KICAgICAgICAgICAgbG9jLCBtYXQgPSBleHByX3BhcnNlKGluc3RyaW5nLGxvYyxkb0FjdGlvbnMsY2FsbFByZVBhcnNlPUZhbHNlKQ0KICAgICAgICAgICAgc2tpcHJlc3VsdCArPSBtYXQNCg0KICAgICAgICByZXR1cm4gbG9jLCBza2lwcmVzdWx0DQoNCmNsYXNzIEZvcndhcmQoUGFyc2VFbGVtZW50RW5oYW5jZSk6DQogICAgIiIiDQogICAgRm9yd2FyZCBkZWNsYXJhdGlvbiBvZiBhbiBleHByZXNzaW9uIHRvIGJlIGRlZmluZWQgbGF0ZXIgLQ0KICAgIHVzZWQgZm9yIHJlY3Vyc2l2ZSBncmFtbWFycywgc3VjaCBhcyBhbGdlYnJhaWMgaW5maXggbm90YXRpb24uDQogICAgV2hlbiB0aGUgZXhwcmVzc2lvbiBpcyBrbm93biwgaXQgaXMgYXNzaWduZWQgdG8gdGhlIEN7Rm9yd2FyZH0gdmFyaWFibGUgdXNpbmcgdGhlICc8PCcgb3BlcmF0b3IuDQoNCiAgICBOb3RlOiB0YWtlIGNhcmUgd2hlbiBhc3NpZ25pbmcgdG8gQ3tGb3J3YXJkfSBub3QgdG8gb3Zlcmxvb2sgcHJlY2VkZW5jZSBvZiBvcGVyYXRvcnMuDQogICAgU3BlY2lmaWNhbGx5LCAnfCcgaGFzIGEgbG93ZXIgcHJlY2VkZW5jZSB0aGFuICc8PCcsIHNvIHRoYXQ6Og0KICAgICAgICBmd2RFeHByIDw8IGEgfCBiIHwgYw0KICAgIHdpbGwgYWN0dWFsbHkgYmUgZXZhbHVhdGVkIGFzOjoNCiAgICAgICAgKGZ3ZEV4cHIgPDwgYSkgfCBiIHwgYw0KICAgIHRoZXJlYnkgbGVhdmluZyBiIGFuZCBjIG91dCBhcyBwYXJzZWFibGUgYWx0ZXJuYXRpdmVzLiAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCB5b3UNCiAgICBleHBsaWNpdGx5IGdyb3VwIHRoZSB2YWx1ZXMgaW5zZXJ0ZWQgaW50byB0aGUgQ3tGb3J3YXJkfTo6DQogICAgICAgIGZ3ZEV4cHIgPDwgKGEgfCBiIHwgYykNCiAgICBDb252ZXJ0aW5nIHRvIHVzZSB0aGUgJzw8PScgb3BlcmF0b3IgaW5zdGVhZCB3aWxsIGF2b2lkIHRoaXMgcHJvYmxlbS4NCg0KICAgIFNlZSBMe1BhcnNlUmVzdWx0cy5wcHJpbnR9IGZvciBhbiBleGFtcGxlIG9mIGEgcmVjdXJzaXZlIHBhcnNlciBjcmVhdGVkIHVzaW5nDQogICAgQ3tGb3J3YXJkfS4NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIG90aGVyPU5vbmUgKToNCiAgICAgICAgc3VwZXIoRm9yd2FyZCxzZWxmKS5fX2luaXRfXyggb3RoZXIsIHNhdmVsaXN0PUZhbHNlICkNCg0KICAgIGRlZiBfX2xzaGlmdF9fKCBzZWxmLCBvdGhlciApOg0KICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOg0KICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3Mob3RoZXIpDQogICAgICAgIHNlbGYuZXhwciA9IG90aGVyDQogICAgICAgIHNlbGYuc3RyUmVwciA9IE5vbmUNCiAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gc2VsZi5leHByLm1heUluZGV4RXJyb3INCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IHNlbGYuZXhwci5tYXlSZXR1cm5FbXB0eQ0KICAgICAgICBzZWxmLnNldFdoaXRlc3BhY2VDaGFycyggc2VsZi5leHByLndoaXRlQ2hhcnMgKQ0KICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gc2VsZi5leHByLnNraXBXaGl0ZXNwYWNlDQogICAgICAgIHNlbGYuc2F2ZUFzTGlzdCA9IHNlbGYuZXhwci5zYXZlQXNMaXN0DQogICAgICAgIHNlbGYuaWdub3JlRXhwcnMuZXh0ZW5kKHNlbGYuZXhwci5pZ25vcmVFeHBycykNCiAgICAgICAgcmV0dXJuIHNlbGYNCiAgICAgICAgDQogICAgZGVmIF9faWxzaGlmdF9fKHNlbGYsIG90aGVyKToNCiAgICAgICAgcmV0dXJuIHNlbGYgPDwgb3RoZXINCiAgICANCiAgICBkZWYgbGVhdmVXaGl0ZXNwYWNlKCBzZWxmICk6DQogICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBGYWxzZQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIHN0cmVhbWxpbmUoIHNlbGYgKToNCiAgICAgICAgaWYgbm90IHNlbGYuc3RyZWFtbGluZWQ6DQogICAgICAgICAgICBzZWxmLnN0cmVhbWxpbmVkID0gVHJ1ZQ0KICAgICAgICAgICAgaWYgc2VsZi5leHByIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgICAgIHNlbGYuZXhwci5zdHJlYW1saW5lKCkNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiB2YWxpZGF0ZSggc2VsZiwgdmFsaWRhdGVUcmFjZT1bXSApOg0KICAgICAgICBpZiBzZWxmIG5vdCBpbiB2YWxpZGF0ZVRyYWNlOg0KICAgICAgICAgICAgdG1wID0gdmFsaWRhdGVUcmFjZVs6XStbc2VsZl0NCiAgICAgICAgICAgIGlmIHNlbGYuZXhwciBpcyBub3QgTm9uZToNCiAgICAgICAgICAgICAgICBzZWxmLmV4cHIudmFsaWRhdGUodG1wKQ0KICAgICAgICBzZWxmLmNoZWNrUmVjdXJzaW9uKFtdKQ0KDQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgaWYgaGFzYXR0cihzZWxmLCJuYW1lIik6DQogICAgICAgICAgICByZXR1cm4gc2VsZi5uYW1lDQogICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXyArICI6IC4uLiINCg0KICAgICAgICAjIHN0dWJiZWQgb3V0IGZvciBub3cgLSBjcmVhdGVzIGF3ZnVsIG1lbW9yeSBhbmQgcGVyZiBpc3N1ZXMNCiAgICAgICAgc2VsZi5fcmV2ZXJ0Q2xhc3MgPSBzZWxmLl9fY2xhc3NfXw0KICAgICAgICBzZWxmLl9fY2xhc3NfXyA9IF9Gb3J3YXJkTm9SZWN1cnNlDQogICAgICAgIHRyeToNCiAgICAgICAgICAgIGlmIHNlbGYuZXhwciBpcyBub3QgTm9uZToNCiAgICAgICAgICAgICAgICByZXRTdHJpbmcgPSBfdXN0cihzZWxmLmV4cHIpDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHJldFN0cmluZyA9ICJOb25lIg0KICAgICAgICBmaW5hbGx5Og0KICAgICAgICAgICAgc2VsZi5fX2NsYXNzX18gPSBzZWxmLl9yZXZlcnRDbGFzcw0KICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18uX19uYW1lX18gKyAiOiAiICsgcmV0U3RyaW5nDQoNCiAgICBkZWYgY29weShzZWxmKToNCiAgICAgICAgaWYgc2VsZi5leHByIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgcmV0dXJuIHN1cGVyKEZvcndhcmQsc2VsZikuY29weSgpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByZXQgPSBGb3J3YXJkKCkNCiAgICAgICAgICAgIHJldCA8PD0gc2VsZg0KICAgICAgICAgICAgcmV0dXJuIHJldA0KDQpjbGFzcyBfRm9yd2FyZE5vUmVjdXJzZShGb3J3YXJkKToNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICByZXR1cm4gIi4uLiINCg0KY2xhc3MgVG9rZW5Db252ZXJ0ZXIoUGFyc2VFbGVtZW50RW5oYW5jZSk6DQogICAgIiIiDQogICAgQWJzdHJhY3Qgc3ViY2xhc3Mgb2YgQ3tQYXJzZUV4cHJlc3Npb259LCBmb3IgY29udmVydGluZyBwYXJzZWQgcmVzdWx0cy4NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHIsIHNhdmVsaXN0PUZhbHNlICk6DQogICAgICAgIHN1cGVyKFRva2VuQ29udmVydGVyLHNlbGYpLl9faW5pdF9fKCBleHByICkjLCBzYXZlbGlzdCApDQogICAgICAgIHNlbGYuc2F2ZUFzTGlzdCA9IEZhbHNlDQoNCmNsYXNzIENvbWJpbmUoVG9rZW5Db252ZXJ0ZXIpOg0KICAgICIiIg0KICAgIENvbnZlcnRlciB0byBjb25jYXRlbmF0ZSBhbGwgbWF0Y2hpbmcgdG9rZW5zIHRvIGEgc2luZ2xlIHN0cmluZy4NCiAgICBCeSBkZWZhdWx0LCB0aGUgbWF0Y2hpbmcgcGF0dGVybnMgbXVzdCBhbHNvIGJlIGNvbnRpZ3VvdXMgaW4gdGhlIGlucHV0IHN0cmluZzsNCiAgICB0aGlzIGNhbiBiZSBkaXNhYmxlZCBieSBzcGVjaWZ5aW5nIEN7J2FkamFjZW50PUZhbHNlJ30gaW4gdGhlIGNvbnN0cnVjdG9yLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIHJlYWwgPSBXb3JkKG51bXMpICsgJy4nICsgV29yZChudW1zKQ0KICAgICAgICBwcmludChyZWFsLnBhcnNlU3RyaW5nKCczLjE0MTYnKSkgIyAtPiBbJzMnLCAnLicsICcxNDE2J10NCiAgICAgICAgIyB3aWxsIGFsc28gZXJyb25lb3VzbHkgbWF0Y2ggdGhlIGZvbGxvd2luZw0KICAgICAgICBwcmludChyZWFsLnBhcnNlU3RyaW5nKCczLiAxNDE2JykpICMgLT4gWyczJywgJy4nLCAnMTQxNiddDQoNCiAgICAgICAgcmVhbCA9IENvbWJpbmUoV29yZChudW1zKSArICcuJyArIFdvcmQobnVtcykpDQogICAgICAgIHByaW50KHJlYWwucGFyc2VTdHJpbmcoJzMuMTQxNicpKSAjIC0+IFsnMy4xNDE2J10NCiAgICAgICAgIyBubyBtYXRjaCB3aGVuIHRoZXJlIGFyZSBpbnRlcm5hbCBzcGFjZXMNCiAgICAgICAgcHJpbnQocmVhbC5wYXJzZVN0cmluZygnMy4gMTQxNicpKSAjIC0+IEV4Y2VwdGlvbjogRXhwZWN0ZWQgVzooMDEyMy4uLikNCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHIsIGpvaW5TdHJpbmc9IiIsIGFkamFjZW50PVRydWUgKToNCiAgICAgICAgc3VwZXIoQ29tYmluZSxzZWxmKS5fX2luaXRfXyggZXhwciApDQogICAgICAgICMgc3VwcHJlc3Mgd2hpdGVzcGFjZS1zdHJpcHBpbmcgaW4gY29udGFpbmVkIHBhcnNlIGV4cHJlc3Npb25zLCBidXQgcmUtZW5hYmxlIGl0IG9uIHRoZSBDb21iaW5lIGl0c2VsZg0KICAgICAgICBpZiBhZGphY2VudDoNCiAgICAgICAgICAgIHNlbGYubGVhdmVXaGl0ZXNwYWNlKCkNCiAgICAgICAgc2VsZi5hZGphY2VudCA9IGFkamFjZW50DQogICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBUcnVlDQogICAgICAgIHNlbGYuam9pblN0cmluZyA9IGpvaW5TdHJpbmcNCiAgICAgICAgc2VsZi5jYWxsUHJlcGFyc2UgPSBUcnVlDQoNCiAgICBkZWYgaWdub3JlKCBzZWxmLCBvdGhlciApOg0KICAgICAgICBpZiBzZWxmLmFkamFjZW50Og0KICAgICAgICAgICAgUGFyc2VyRWxlbWVudC5pZ25vcmUoc2VsZiwgb3RoZXIpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBzdXBlciggQ29tYmluZSwgc2VsZikuaWdub3JlKCBvdGhlciApDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgcG9zdFBhcnNlKCBzZWxmLCBpbnN0cmluZywgbG9jLCB0b2tlbmxpc3QgKToNCiAgICAgICAgcmV0VG9rcyA9IHRva2VubGlzdC5jb3B5KCkNCiAgICAgICAgZGVsIHJldFRva3NbOl0NCiAgICAgICAgcmV0VG9rcyArPSBQYXJzZVJlc3VsdHMoWyAiIi5qb2luKHRva2VubGlzdC5fYXNTdHJpbmdMaXN0KHNlbGYuam9pblN0cmluZykpIF0sIG1vZGFsPXNlbGYubW9kYWxSZXN1bHRzKQ0KDQogICAgICAgIGlmIHNlbGYucmVzdWx0c05hbWUgYW5kIHJldFRva3MuaGFza2V5cygpOg0KICAgICAgICAgICAgcmV0dXJuIFsgcmV0VG9rcyBdDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByZXR1cm4gcmV0VG9rcw0KDQpjbGFzcyBHcm91cChUb2tlbkNvbnZlcnRlcik6DQogICAgIiIiDQogICAgQ29udmVydGVyIHRvIHJldHVybiB0aGUgbWF0Y2hlZCB0b2tlbnMgYXMgYSBsaXN0IC0gdXNlZnVsIGZvciByZXR1cm5pbmcgdG9rZW5zIG9mIEN7THtaZXJvT3JNb3JlfX0gYW5kIEN7THtPbmVPck1vcmV9fSBleHByZXNzaW9ucy4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBpZGVudCA9IFdvcmQoYWxwaGFzKQ0KICAgICAgICBudW0gPSBXb3JkKG51bXMpDQogICAgICAgIHRlcm0gPSBpZGVudCB8IG51bQ0KICAgICAgICBmdW5jID0gaWRlbnQgKyBPcHRpb25hbChkZWxpbWl0ZWRMaXN0KHRlcm0pKQ0KICAgICAgICBwcmludChmdW5jLnBhcnNlU3RyaW5nKCJmbiBhLGIsMTAwIikpICAjIC0+IFsnZm4nLCAnYScsICdiJywgJzEwMCddDQoNCiAgICAgICAgZnVuYyA9IGlkZW50ICsgR3JvdXAoT3B0aW9uYWwoZGVsaW1pdGVkTGlzdCh0ZXJtKSkpDQogICAgICAgIHByaW50KGZ1bmMucGFyc2VTdHJpbmcoImZuIGEsYiwxMDAiKSkgICMgLT4gWydmbicsIFsnYScsICdiJywgJzEwMCddXQ0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwciApOg0KICAgICAgICBzdXBlcihHcm91cCxzZWxmKS5fX2luaXRfXyggZXhwciApDQogICAgICAgIHNlbGYuc2F2ZUFzTGlzdCA9IFRydWUNCg0KICAgIGRlZiBwb3N0UGFyc2UoIHNlbGYsIGluc3RyaW5nLCBsb2MsIHRva2VubGlzdCApOg0KICAgICAgICByZXR1cm4gWyB0b2tlbmxpc3QgXQ0KDQpjbGFzcyBEaWN0KFRva2VuQ29udmVydGVyKToNCiAgICAiIiINCiAgICBDb252ZXJ0ZXIgdG8gcmV0dXJuIGEgcmVwZXRpdGl2ZSBleHByZXNzaW9uIGFzIGEgbGlzdCwgYnV0IGFsc28gYXMgYSBkaWN0aW9uYXJ5Lg0KICAgIEVhY2ggZWxlbWVudCBjYW4gYWxzbyBiZSByZWZlcmVuY2VkIHVzaW5nIHRoZSBmaXJzdCB0b2tlbiBpbiB0aGUgZXhwcmVzc2lvbiBhcyBpdHMga2V5Lg0KICAgIFVzZWZ1bCBmb3IgdGFidWxhciByZXBvcnQgc2NyYXBpbmcgd2hlbiB0aGUgZmlyc3QgY29sdW1uIGNhbiBiZSB1c2VkIGFzIGEgaXRlbSBrZXkuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgZGF0YV93b3JkID0gV29yZChhbHBoYXMpDQogICAgICAgIGxhYmVsID0gZGF0YV93b3JkICsgRm9sbG93ZWRCeSgnOicpDQogICAgICAgIGF0dHJfZXhwciA9IEdyb3VwKGxhYmVsICsgU3VwcHJlc3MoJzonKSArIE9uZU9yTW9yZShkYXRhX3dvcmQpLnNldFBhcnNlQWN0aW9uKCcgJy5qb2luKSkNCg0KICAgICAgICB0ZXh0ID0gInNoYXBlOiBTUVVBUkUgcG9zbjogdXBwZXIgbGVmdCBjb2xvcjogbGlnaHQgYmx1ZSB0ZXh0dXJlOiBidXJsYXAiDQogICAgICAgIGF0dHJfZXhwciA9IChsYWJlbCArIFN1cHByZXNzKCc6JykgKyBPbmVPck1vcmUoZGF0YV93b3JkLCBzdG9wT249bGFiZWwpLnNldFBhcnNlQWN0aW9uKCcgJy5qb2luKSkNCiAgICAgICAgDQogICAgICAgICMgcHJpbnQgYXR0cmlidXRlcyBhcyBwbGFpbiBncm91cHMNCiAgICAgICAgcHJpbnQoT25lT3JNb3JlKGF0dHJfZXhwcikucGFyc2VTdHJpbmcodGV4dCkuZHVtcCgpKQ0KICAgICAgICANCiAgICAgICAgIyBpbnN0ZWFkIG9mIE9uZU9yTW9yZShleHByKSwgcGFyc2UgdXNpbmcgRGljdChPbmVPck1vcmUoR3JvdXAoZXhwcikpKSAtIERpY3Qgd2lsbCBhdXRvLWFzc2lnbiBuYW1lcw0KICAgICAgICByZXN1bHQgPSBEaWN0KE9uZU9yTW9yZShHcm91cChhdHRyX2V4cHIpKSkucGFyc2VTdHJpbmcodGV4dCkNCiAgICAgICAgcHJpbnQocmVzdWx0LmR1bXAoKSkNCiAgICAgICAgDQogICAgICAgICMgYWNjZXNzIG5hbWVkIGZpZWxkcyBhcyBkaWN0IGVudHJpZXMsIG9yIG91dHB1dCBhcyBkaWN0DQogICAgICAgIHByaW50KHJlc3VsdFsnc2hhcGUnXSkgICAgICAgIA0KICAgICAgICBwcmludChyZXN1bHQuYXNEaWN0KCkpDQogICAgcHJpbnRzOjoNCiAgICAgICAgWydzaGFwZScsICdTUVVBUkUnLCAncG9zbicsICd1cHBlciBsZWZ0JywgJ2NvbG9yJywgJ2xpZ2h0IGJsdWUnLCAndGV4dHVyZScsICdidXJsYXAnXQ0KDQogICAgICAgIFtbJ3NoYXBlJywgJ1NRVUFSRSddLCBbJ3Bvc24nLCAndXBwZXIgbGVmdCddLCBbJ2NvbG9yJywgJ2xpZ2h0IGJsdWUnXSwgWyd0ZXh0dXJlJywgJ2J1cmxhcCddXQ0KICAgICAgICAtIGNvbG9yOiBsaWdodCBibHVlDQogICAgICAgIC0gcG9zbjogdXBwZXIgbGVmdA0KICAgICAgICAtIHNoYXBlOiBTUVVBUkUNCiAgICAgICAgLSB0ZXh0dXJlOiBidXJsYXANCiAgICAgICAgU1FVQVJFDQogICAgICAgIHsnY29sb3InOiAnbGlnaHQgYmx1ZScsICdwb3NuJzogJ3VwcGVyIGxlZnQnLCAndGV4dHVyZSc6ICdidXJsYXAnLCAnc2hhcGUnOiAnU1FVQVJFJ30NCiAgICBTZWUgbW9yZSBleGFtcGxlcyBhdCBMe1BhcnNlUmVzdWx0c30gb2YgYWNjZXNzaW5nIGZpZWxkcyBieSByZXN1bHRzIG5hbWUuDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHByICk6DQogICAgICAgIHN1cGVyKERpY3Qsc2VsZikuX19pbml0X18oIGV4cHIgKQ0KICAgICAgICBzZWxmLnNhdmVBc0xpc3QgPSBUcnVlDQoNCiAgICBkZWYgcG9zdFBhcnNlKCBzZWxmLCBpbnN0cmluZywgbG9jLCB0b2tlbmxpc3QgKToNCiAgICAgICAgZm9yIGksdG9rIGluIGVudW1lcmF0ZSh0b2tlbmxpc3QpOg0KICAgICAgICAgICAgaWYgbGVuKHRvaykgPT0gMDoNCiAgICAgICAgICAgICAgICBjb250aW51ZQ0KICAgICAgICAgICAgaWtleSA9IHRva1swXQ0KICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShpa2V5LGludCk6DQogICAgICAgICAgICAgICAgaWtleSA9IF91c3RyKHRva1swXSkuc3RyaXAoKQ0KICAgICAgICAgICAgaWYgbGVuKHRvayk9PTE6DQogICAgICAgICAgICAgICAgdG9rZW5saXN0W2lrZXldID0gX1BhcnNlUmVzdWx0c1dpdGhPZmZzZXQoIiIsaSkNCiAgICAgICAgICAgIGVsaWYgbGVuKHRvayk9PTIgYW5kIG5vdCBpc2luc3RhbmNlKHRva1sxXSxQYXJzZVJlc3VsdHMpOg0KICAgICAgICAgICAgICAgIHRva2VubGlzdFtpa2V5XSA9IF9QYXJzZVJlc3VsdHNXaXRoT2Zmc2V0KHRva1sxXSxpKQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICBkaWN0dmFsdWUgPSB0b2suY29weSgpICNQYXJzZVJlc3VsdHMoaSkNCiAgICAgICAgICAgICAgICBkZWwgZGljdHZhbHVlWzBdDQogICAgICAgICAgICAgICAgaWYgbGVuKGRpY3R2YWx1ZSkhPSAxIG9yIChpc2luc3RhbmNlKGRpY3R2YWx1ZSxQYXJzZVJlc3VsdHMpIGFuZCBkaWN0dmFsdWUuaGFza2V5cygpKToNCiAgICAgICAgICAgICAgICAgICAgdG9rZW5saXN0W2lrZXldID0gX1BhcnNlUmVzdWx0c1dpdGhPZmZzZXQoZGljdHZhbHVlLGkpDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgdG9rZW5saXN0W2lrZXldID0gX1BhcnNlUmVzdWx0c1dpdGhPZmZzZXQoZGljdHZhbHVlWzBdLGkpDQoNCiAgICAgICAgaWYgc2VsZi5yZXN1bHRzTmFtZToNCiAgICAgICAgICAgIHJldHVybiBbIHRva2VubGlzdCBdDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByZXR1cm4gdG9rZW5saXN0DQoNCg0KY2xhc3MgU3VwcHJlc3MoVG9rZW5Db252ZXJ0ZXIpOg0KICAgICIiIg0KICAgIENvbnZlcnRlciBmb3IgaWdub3JpbmcgdGhlIHJlc3VsdHMgb2YgYSBwYXJzZWQgZXhwcmVzc2lvbi4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBzb3VyY2UgPSAiYSwgYiwgYyxkIg0KICAgICAgICB3ZCA9IFdvcmQoYWxwaGFzKQ0KICAgICAgICB3ZF9saXN0MSA9IHdkICsgWmVyb09yTW9yZSgnLCcgKyB3ZCkNCiAgICAgICAgcHJpbnQod2RfbGlzdDEucGFyc2VTdHJpbmcoc291cmNlKSkNCg0KICAgICAgICAjIG9mdGVuLCBkZWxpbWl0ZXJzIHRoYXQgYXJlIHVzZWZ1bCBkdXJpbmcgcGFyc2luZyBhcmUganVzdCBpbiB0aGUNCiAgICAgICAgIyB3YXkgYWZ0ZXJ3YXJkIC0gdXNlIFN1cHByZXNzIHRvIGtlZXAgdGhlbSBvdXQgb2YgdGhlIHBhcnNlZCBvdXRwdXQNCiAgICAgICAgd2RfbGlzdDIgPSB3ZCArIFplcm9Pck1vcmUoU3VwcHJlc3MoJywnKSArIHdkKQ0KICAgICAgICBwcmludCh3ZF9saXN0Mi5wYXJzZVN0cmluZyhzb3VyY2UpKQ0KICAgIHByaW50czo6DQogICAgICAgIFsnYScsICcsJywgJ2InLCAnLCcsICdjJywgJywnLCAnZCddDQogICAgICAgIFsnYScsICdiJywgJ2MnLCAnZCddDQogICAgKFNlZSBhbHNvIEx7ZGVsaW1pdGVkTGlzdH0uKQ0KICAgICIiIg0KICAgIGRlZiBwb3N0UGFyc2UoIHNlbGYsIGluc3RyaW5nLCBsb2MsIHRva2VubGlzdCApOg0KICAgICAgICByZXR1cm4gW10NCg0KICAgIGRlZiBzdXBwcmVzcyggc2VsZiApOg0KICAgICAgICByZXR1cm4gc2VsZg0KDQoNCmNsYXNzIE9ubHlPbmNlKG9iamVjdCk6DQogICAgIiIiDQogICAgV3JhcHBlciBmb3IgcGFyc2UgYWN0aW9ucywgdG8gZW5zdXJlIHRoZXkgYXJlIG9ubHkgY2FsbGVkIG9uY2UuDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKHNlbGYsIG1ldGhvZENhbGwpOg0KICAgICAgICBzZWxmLmNhbGxhYmxlID0gX3RyaW1fYXJpdHkobWV0aG9kQ2FsbCkNCiAgICAgICAgc2VsZi5jYWxsZWQgPSBGYWxzZQ0KICAgIGRlZiBfX2NhbGxfXyhzZWxmLHMsbCx0KToNCiAgICAgICAgaWYgbm90IHNlbGYuY2FsbGVkOg0KICAgICAgICAgICAgcmVzdWx0cyA9IHNlbGYuY2FsbGFibGUocyxsLHQpDQogICAgICAgICAgICBzZWxmLmNhbGxlZCA9IFRydWUNCiAgICAgICAgICAgIHJldHVybiByZXN1bHRzDQogICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKHMsbCwiIikNCiAgICBkZWYgcmVzZXQoc2VsZik6DQogICAgICAgIHNlbGYuY2FsbGVkID0gRmFsc2UNCg0KZGVmIHRyYWNlUGFyc2VBY3Rpb24oZik6DQogICAgIiIiDQogICAgRGVjb3JhdG9yIGZvciBkZWJ1Z2dpbmcgcGFyc2UgYWN0aW9ucy4gDQogICAgDQogICAgV2hlbiB0aGUgcGFyc2UgYWN0aW9uIGlzIGNhbGxlZCwgdGhpcyBkZWNvcmF0b3Igd2lsbCBwcmludCBDeyI+PiBlbnRlcmluZyBJe21ldGhvZC1uYW1lfShsaW5lOkl7Y3VycmVudF9zb3VyY2VfbGluZX0sIEl7cGFyc2VfbG9jYXRpb259LCBJe21hdGNoZWRfdG9rZW5zfSkiLn0NCiAgICBXaGVuIHRoZSBwYXJzZSBhY3Rpb24gY29tcGxldGVzLCB0aGUgZGVjb3JhdG9yIHdpbGwgcHJpbnQgQ3siPDwifSBmb2xsb3dlZCBieSB0aGUgcmV0dXJuZWQgdmFsdWUsIG9yIGFueSBleGNlcHRpb24gdGhhdCB0aGUgcGFyc2UgYWN0aW9uIHJhaXNlZC4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICB3ZCA9IFdvcmQoYWxwaGFzKQ0KDQogICAgICAgIEB0cmFjZVBhcnNlQWN0aW9uDQogICAgICAgIGRlZiByZW1vdmVfZHVwbGljYXRlX2NoYXJzKHRva2Vucyk6DQogICAgICAgICAgICByZXR1cm4gJycuam9pbihzb3J0ZWQoc2V0KCcnLmpvaW4odG9rZW5zKSkpKQ0KDQogICAgICAgIHdkcyA9IE9uZU9yTW9yZSh3ZCkuc2V0UGFyc2VBY3Rpb24ocmVtb3ZlX2R1cGxpY2F0ZV9jaGFycykNCiAgICAgICAgcHJpbnQod2RzLnBhcnNlU3RyaW5nKCJzbGtkanMgc2xkIHNsZGQgc2RsZiBzZGxqZiIpKQ0KICAgIHByaW50czo6DQogICAgICAgID4+ZW50ZXJpbmcgcmVtb3ZlX2R1cGxpY2F0ZV9jaGFycyhsaW5lOiAnc2xrZGpzIHNsZCBzbGRkIHNkbGYgc2RsamYnLCAwLCAoWydzbGtkanMnLCAnc2xkJywgJ3NsZGQnLCAnc2RsZicsICdzZGxqZiddLCB7fSkpDQogICAgICAgIDw8bGVhdmluZyByZW1vdmVfZHVwbGljYXRlX2NoYXJzIChyZXQ6ICdkZmprbHMnKQ0KICAgICAgICBbJ2RmamtscyddDQogICAgIiIiDQogICAgZiA9IF90cmltX2FyaXR5KGYpDQogICAgZGVmIHooKnBhQXJncyk6DQogICAgICAgIHRoaXNGdW5jID0gZi5fX25hbWVfXw0KICAgICAgICBzLGwsdCA9IHBhQXJnc1stMzpdDQogICAgICAgIGlmIGxlbihwYUFyZ3MpPjM6DQogICAgICAgICAgICB0aGlzRnVuYyA9IHBhQXJnc1swXS5fX2NsYXNzX18uX19uYW1lX18gKyAnLicgKyB0aGlzRnVuYw0KICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCAiPj5lbnRlcmluZyAlcyhsaW5lOiAnJXMnLCAlZCwgJXIpXG4iICUgKHRoaXNGdW5jLGxpbmUobCxzKSxsLHQpICkNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgcmV0ID0gZigqcGFBcmdzKQ0KICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4YzoNCiAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoICI8PGxlYXZpbmcgJXMgKGV4Y2VwdGlvbjogJXMpXG4iICUgKHRoaXNGdW5jLGV4YykgKQ0KICAgICAgICAgICAgcmFpc2UNCiAgICAgICAgc3lzLnN0ZGVyci53cml0ZSggIjw8bGVhdmluZyAlcyAocmV0OiAlcilcbiIgJSAodGhpc0Z1bmMscmV0KSApDQogICAgICAgIHJldHVybiByZXQNCiAgICB0cnk6DQogICAgICAgIHouX19uYW1lX18gPSBmLl9fbmFtZV9fDQogICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOg0KICAgICAgICBwYXNzDQogICAgcmV0dXJuIHoNCg0KIw0KIyBnbG9iYWwgaGVscGVycw0KIw0KZGVmIGRlbGltaXRlZExpc3QoIGV4cHIsIGRlbGltPSIsIiwgY29tYmluZT1GYWxzZSApOg0KICAgICIiIg0KICAgIEhlbHBlciB0byBkZWZpbmUgYSBkZWxpbWl0ZWQgbGlzdCBvZiBleHByZXNzaW9ucyAtIHRoZSBkZWxpbWl0ZXIgZGVmYXVsdHMgdG8gJywnLg0KICAgIEJ5IGRlZmF1bHQsIHRoZSBsaXN0IGVsZW1lbnRzIGFuZCBkZWxpbWl0ZXJzIGNhbiBoYXZlIGludGVydmVuaW5nIHdoaXRlc3BhY2UsIGFuZA0KICAgIGNvbW1lbnRzLCBidXQgdGhpcyBjYW4gYmUgb3ZlcnJpZGRlbiBieSBwYXNzaW5nIEN7Y29tYmluZT1UcnVlfSBpbiB0aGUgY29uc3RydWN0b3IuDQogICAgSWYgQ3tjb21iaW5lfSBpcyBzZXQgdG8gQ3tUcnVlfSwgdGhlIG1hdGNoaW5nIHRva2VucyBhcmUgcmV0dXJuZWQgYXMgYSBzaW5nbGUgdG9rZW4NCiAgICBzdHJpbmcsIHdpdGggdGhlIGRlbGltaXRlcnMgaW5jbHVkZWQ7IG90aGVyd2lzZSwgdGhlIG1hdGNoaW5nIHRva2VucyBhcmUgcmV0dXJuZWQNCiAgICBhcyBhIGxpc3Qgb2YgdG9rZW5zLCB3aXRoIHRoZSBkZWxpbWl0ZXJzIHN1cHByZXNzZWQuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgZGVsaW1pdGVkTGlzdChXb3JkKGFscGhhcykpLnBhcnNlU3RyaW5nKCJhYSxiYixjYyIpICMgLT4gWydhYScsICdiYicsICdjYyddDQogICAgICAgIGRlbGltaXRlZExpc3QoV29yZChoZXhudW1zKSwgZGVsaW09JzonLCBjb21iaW5lPVRydWUpLnBhcnNlU3RyaW5nKCJBQTpCQjpDQzpERDpFRSIpICMgLT4gWydBQTpCQjpDQzpERDpFRSddDQogICAgIiIiDQogICAgZGxOYW1lID0gX3VzdHIoZXhwcikrIiBbIitfdXN0cihkZWxpbSkrIiAiK191c3RyKGV4cHIpKyJdLi4uIg0KICAgIGlmIGNvbWJpbmU6DQogICAgICAgIHJldHVybiBDb21iaW5lKCBleHByICsgWmVyb09yTW9yZSggZGVsaW0gKyBleHByICkgKS5zZXROYW1lKGRsTmFtZSkNCiAgICBlbHNlOg0KICAgICAgICByZXR1cm4gKCBleHByICsgWmVyb09yTW9yZSggU3VwcHJlc3MoIGRlbGltICkgKyBleHByICkgKS5zZXROYW1lKGRsTmFtZSkNCg0KZGVmIGNvdW50ZWRBcnJheSggZXhwciwgaW50RXhwcj1Ob25lICk6DQogICAgIiIiDQogICAgSGVscGVyIHRvIGRlZmluZSBhIGNvdW50ZWQgbGlzdCBvZiBleHByZXNzaW9ucy4NCiAgICBUaGlzIGhlbHBlciBkZWZpbmVzIGEgcGF0dGVybiBvZiB0aGUgZm9ybTo6DQogICAgICAgIGludGVnZXIgZXhwciBleHByIGV4cHIuLi4NCiAgICB3aGVyZSB0aGUgbGVhZGluZyBpbnRlZ2VyIHRlbGxzIGhvdyBtYW55IGV4cHIgZXhwcmVzc2lvbnMgZm9sbG93Lg0KICAgIFRoZSBtYXRjaGVkIHRva2VucyByZXR1cm5zIHRoZSBhcnJheSBvZiBleHByIHRva2VucyBhcyBhIGxpc3QgLSB0aGUgbGVhZGluZyBjb3VudCB0b2tlbiBpcyBzdXBwcmVzc2VkLg0KICAgIA0KICAgIElmIEN7aW50RXhwcn0gaXMgc3BlY2lmaWVkLCBpdCBzaG91bGQgYmUgYSBweXBhcnNpbmcgZXhwcmVzc2lvbiB0aGF0IHByb2R1Y2VzIGFuIGludGVnZXIgdmFsdWUuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgY291bnRlZEFycmF5KFdvcmQoYWxwaGFzKSkucGFyc2VTdHJpbmcoJzIgYWIgY2QgZWYnKSAgIyAtPiBbJ2FiJywgJ2NkJ10NCg0KICAgICAgICAjIGluIHRoaXMgcGFyc2VyLCB0aGUgbGVhZGluZyBpbnRlZ2VyIHZhbHVlIGlzIGdpdmVuIGluIGJpbmFyeSwNCiAgICAgICAgIyAnMTAnIGluZGljYXRpbmcgdGhhdCAyIHZhbHVlcyBhcmUgaW4gdGhlIGFycmF5DQogICAgICAgIGJpbmFyeUNvbnN0YW50ID0gV29yZCgnMDEnKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgdDogaW50KHRbMF0sIDIpKQ0KICAgICAgICBjb3VudGVkQXJyYXkoV29yZChhbHBoYXMpLCBpbnRFeHByPWJpbmFyeUNvbnN0YW50KS5wYXJzZVN0cmluZygnMTAgYWIgY2QgZWYnKSAgIyAtPiBbJ2FiJywgJ2NkJ10NCiAgICAiIiINCiAgICBhcnJheUV4cHIgPSBGb3J3YXJkKCkNCiAgICBkZWYgY291bnRGaWVsZFBhcnNlQWN0aW9uKHMsbCx0KToNCiAgICAgICAgbiA9IHRbMF0NCiAgICAgICAgYXJyYXlFeHByIDw8IChuIGFuZCBHcm91cChBbmQoW2V4cHJdKm4pKSBvciBHcm91cChlbXB0eSkpDQogICAgICAgIHJldHVybiBbXQ0KICAgIGlmIGludEV4cHIgaXMgTm9uZToNCiAgICAgICAgaW50RXhwciA9IFdvcmQobnVtcykuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHQ6aW50KHRbMF0pKQ0KICAgIGVsc2U6DQogICAgICAgIGludEV4cHIgPSBpbnRFeHByLmNvcHkoKQ0KICAgIGludEV4cHIuc2V0TmFtZSgiYXJyYXlMZW4iKQ0KICAgIGludEV4cHIuYWRkUGFyc2VBY3Rpb24oY291bnRGaWVsZFBhcnNlQWN0aW9uLCBjYWxsRHVyaW5nVHJ5PVRydWUpDQogICAgcmV0dXJuICggaW50RXhwciArIGFycmF5RXhwciApLnNldE5hbWUoJyhsZW4pICcgKyBfdXN0cihleHByKSArICcuLi4nKQ0KDQpkZWYgX2ZsYXR0ZW4oTCk6DQogICAgcmV0ID0gW10NCiAgICBmb3IgaSBpbiBMOg0KICAgICAgICBpZiBpc2luc3RhbmNlKGksbGlzdCk6DQogICAgICAgICAgICByZXQuZXh0ZW5kKF9mbGF0dGVuKGkpKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmV0LmFwcGVuZChpKQ0KICAgIHJldHVybiByZXQNCg0KZGVmIG1hdGNoUHJldmlvdXNMaXRlcmFsKGV4cHIpOg0KICAgICIiIg0KICAgIEhlbHBlciB0byBkZWZpbmUgYW4gZXhwcmVzc2lvbiB0aGF0IGlzIGluZGlyZWN0bHkgZGVmaW5lZCBmcm9tDQogICAgdGhlIHRva2VucyBtYXRjaGVkIGluIGEgcHJldmlvdXMgZXhwcmVzc2lvbiwgdGhhdCBpcywgaXQgbG9va3MNCiAgICBmb3IgYSAncmVwZWF0JyBvZiBhIHByZXZpb3VzIGV4cHJlc3Npb24uICBGb3IgZXhhbXBsZTo6DQogICAgICAgIGZpcnN0ID0gV29yZChudW1zKQ0KICAgICAgICBzZWNvbmQgPSBtYXRjaFByZXZpb3VzTGl0ZXJhbChmaXJzdCkNCiAgICAgICAgbWF0Y2hFeHByID0gZmlyc3QgKyAiOiIgKyBzZWNvbmQNCiAgICB3aWxsIG1hdGNoIEN7IjE6MSJ9LCBidXQgbm90IEN7IjE6MiJ9LiAgQmVjYXVzZSB0aGlzIG1hdGNoZXMgYQ0KICAgIHByZXZpb3VzIGxpdGVyYWwsIHdpbGwgYWxzbyBtYXRjaCB0aGUgbGVhZGluZyBDeyIxOjEifSBpbiBDeyIxOjEwIn0uDQogICAgSWYgdGhpcyBpcyBub3QgZGVzaXJlZCwgdXNlIEN7bWF0Y2hQcmV2aW91c0V4cHJ9Lg0KICAgIERvIEl7bm90fSB1c2Ugd2l0aCBwYWNrcmF0IHBhcnNpbmcgZW5hYmxlZC4NCiAgICAiIiINCiAgICByZXAgPSBGb3J3YXJkKCkNCiAgICBkZWYgY29weVRva2VuVG9SZXBlYXRlcihzLGwsdCk6DQogICAgICAgIGlmIHQ6DQogICAgICAgICAgICBpZiBsZW4odCkgPT0gMToNCiAgICAgICAgICAgICAgICByZXAgPDwgdFswXQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAjIGZsYXR0ZW4gdCB0b2tlbnMNCiAgICAgICAgICAgICAgICB0ZmxhdCA9IF9mbGF0dGVuKHQuYXNMaXN0KCkpDQogICAgICAgICAgICAgICAgcmVwIDw8IEFuZChMaXRlcmFsKHR0KSBmb3IgdHQgaW4gdGZsYXQpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByZXAgPDwgRW1wdHkoKQ0KICAgIGV4cHIuYWRkUGFyc2VBY3Rpb24oY29weVRva2VuVG9SZXBlYXRlciwgY2FsbER1cmluZ1RyeT1UcnVlKQ0KICAgIHJlcC5zZXROYW1lKCcocHJldikgJyArIF91c3RyKGV4cHIpKQ0KICAgIHJldHVybiByZXANCg0KZGVmIG1hdGNoUHJldmlvdXNFeHByKGV4cHIpOg0KICAgICIiIg0KICAgIEhlbHBlciB0byBkZWZpbmUgYW4gZXhwcmVzc2lvbiB0aGF0IGlzIGluZGlyZWN0bHkgZGVmaW5lZCBmcm9tDQogICAgdGhlIHRva2VucyBtYXRjaGVkIGluIGEgcHJldmlvdXMgZXhwcmVzc2lvbiwgdGhhdCBpcywgaXQgbG9va3MNCiAgICBmb3IgYSAncmVwZWF0JyBvZiBhIHByZXZpb3VzIGV4cHJlc3Npb24uICBGb3IgZXhhbXBsZTo6DQogICAgICAgIGZpcnN0ID0gV29yZChudW1zKQ0KICAgICAgICBzZWNvbmQgPSBtYXRjaFByZXZpb3VzRXhwcihmaXJzdCkNCiAgICAgICAgbWF0Y2hFeHByID0gZmlyc3QgKyAiOiIgKyBzZWNvbmQNCiAgICB3aWxsIG1hdGNoIEN7IjE6MSJ9LCBidXQgbm90IEN7IjE6MiJ9LiAgQmVjYXVzZSB0aGlzIG1hdGNoZXMgYnkNCiAgICBleHByZXNzaW9ucywgd2lsbCBJe25vdH0gbWF0Y2ggdGhlIGxlYWRpbmcgQ3siMToxIn0gaW4gQ3siMToxMCJ9Ow0KICAgIHRoZSBleHByZXNzaW9ucyBhcmUgZXZhbHVhdGVkIGZpcnN0LCBhbmQgdGhlbiBjb21wYXJlZCwgc28NCiAgICBDeyIxIn0gaXMgY29tcGFyZWQgd2l0aCBDeyIxMCJ9Lg0KICAgIERvIEl7bm90fSB1c2Ugd2l0aCBwYWNrcmF0IHBhcnNpbmcgZW5hYmxlZC4NCiAgICAiIiINCiAgICByZXAgPSBGb3J3YXJkKCkNCiAgICBlMiA9IGV4cHIuY29weSgpDQogICAgcmVwIDw8PSBlMg0KICAgIGRlZiBjb3B5VG9rZW5Ub1JlcGVhdGVyKHMsbCx0KToNCiAgICAgICAgbWF0Y2hUb2tlbnMgPSBfZmxhdHRlbih0LmFzTGlzdCgpKQ0KICAgICAgICBkZWYgbXVzdE1hdGNoVGhlc2VUb2tlbnMocyxsLHQpOg0KICAgICAgICAgICAgdGhlc2VUb2tlbnMgPSBfZmxhdHRlbih0LmFzTGlzdCgpKQ0KICAgICAgICAgICAgaWYgIHRoZXNlVG9rZW5zICE9IG1hdGNoVG9rZW5zOg0KICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKCIiLDAsIiIpDQogICAgICAgIHJlcC5zZXRQYXJzZUFjdGlvbiggbXVzdE1hdGNoVGhlc2VUb2tlbnMsIGNhbGxEdXJpbmdUcnk9VHJ1ZSApDQogICAgZXhwci5hZGRQYXJzZUFjdGlvbihjb3B5VG9rZW5Ub1JlcGVhdGVyLCBjYWxsRHVyaW5nVHJ5PVRydWUpDQogICAgcmVwLnNldE5hbWUoJyhwcmV2KSAnICsgX3VzdHIoZXhwcikpDQogICAgcmV0dXJuIHJlcA0KDQpkZWYgX2VzY2FwZVJlZ2V4UmFuZ2VDaGFycyhzKToNCiAgICAjfiAgZXNjYXBlIHRoZXNlIGNoYXJzOiBeLV0NCiAgICBmb3IgYyBpbiByIlxeLV0iOg0KICAgICAgICBzID0gcy5yZXBsYWNlKGMsX2JzbGFzaCtjKQ0KICAgIHMgPSBzLnJlcGxhY2UoIlxuIixyIlxuIikNCiAgICBzID0gcy5yZXBsYWNlKCJcdCIsciJcdCIpDQogICAgcmV0dXJuIF91c3RyKHMpDQoNCmRlZiBvbmVPZiggc3RycywgY2FzZWxlc3M9RmFsc2UsIHVzZVJlZ2V4PVRydWUgKToNCiAgICAiIiINCiAgICBIZWxwZXIgdG8gcXVpY2tseSBkZWZpbmUgYSBzZXQgb2YgYWx0ZXJuYXRpdmUgTGl0ZXJhbHMsIGFuZCBtYWtlcyBzdXJlIHRvIGRvDQogICAgbG9uZ2VzdC1maXJzdCB0ZXN0aW5nIHdoZW4gdGhlcmUgaXMgYSBjb25mbGljdCwgcmVnYXJkbGVzcyBvZiB0aGUgaW5wdXQgb3JkZXIsDQogICAgYnV0IHJldHVybnMgYSBDe0x7TWF0Y2hGaXJzdH19IGZvciBiZXN0IHBlcmZvcm1hbmNlLg0KDQogICAgUGFyYW1ldGVyczoNCiAgICAgLSBzdHJzIC0gYSBzdHJpbmcgb2Ygc3BhY2UtZGVsaW1pdGVkIGxpdGVyYWxzLCBvciBhIGNvbGxlY3Rpb24gb2Ygc3RyaW5nIGxpdGVyYWxzDQogICAgIC0gY2FzZWxlc3MgLSAoZGVmYXVsdD1De0ZhbHNlfSkgLSB0cmVhdCBhbGwgbGl0ZXJhbHMgYXMgY2FzZWxlc3MNCiAgICAgLSB1c2VSZWdleCAtIChkZWZhdWx0PUN7VHJ1ZX0pIC0gYXMgYW4gb3B0aW1pemF0aW9uLCB3aWxsIGdlbmVyYXRlIGEgUmVnZXgNCiAgICAgICAgICBvYmplY3Q7IG90aGVyd2lzZSwgd2lsbCBnZW5lcmF0ZSBhIEN7TWF0Y2hGaXJzdH0gb2JqZWN0IChpZiBDe2Nhc2VsZXNzPVRydWV9LCBvcg0KICAgICAgICAgIGlmIGNyZWF0aW5nIGEgQ3tSZWdleH0gcmFpc2VzIGFuIGV4Y2VwdGlvbikNCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBjb21wX29wZXIgPSBvbmVPZigiPCA9ID4gPD0gPj0gIT0iKQ0KICAgICAgICB2YXIgPSBXb3JkKGFscGhhcykNCiAgICAgICAgbnVtYmVyID0gV29yZChudW1zKQ0KICAgICAgICB0ZXJtID0gdmFyIHwgbnVtYmVyDQogICAgICAgIGNvbXBhcmlzb25fZXhwciA9IHRlcm0gKyBjb21wX29wZXIgKyB0ZXJtDQogICAgICAgIHByaW50KGNvbXBhcmlzb25fZXhwci5zZWFyY2hTdHJpbmcoIkIgPSAxMiAgQUE9MjMgQjw9QUEgQUE+MTIiKSkNCiAgICBwcmludHM6Og0KICAgICAgICBbWydCJywgJz0nLCAnMTInXSwgWydBQScsICc9JywgJzIzJ10sIFsnQicsICc8PScsICdBQSddLCBbJ0FBJywgJz4nLCAnMTInXV0NCiAgICAiIiINCiAgICBpZiBjYXNlbGVzczoNCiAgICAgICAgaXNlcXVhbCA9ICggbGFtYmRhIGEsYjogYS51cHBlcigpID09IGIudXBwZXIoKSApDQogICAgICAgIG1hc2tzID0gKCBsYW1iZGEgYSxiOiBiLnVwcGVyKCkuc3RhcnRzd2l0aChhLnVwcGVyKCkpICkNCiAgICAgICAgcGFyc2VFbGVtZW50Q2xhc3MgPSBDYXNlbGVzc0xpdGVyYWwNCiAgICBlbHNlOg0KICAgICAgICBpc2VxdWFsID0gKCBsYW1iZGEgYSxiOiBhID09IGIgKQ0KICAgICAgICBtYXNrcyA9ICggbGFtYmRhIGEsYjogYi5zdGFydHN3aXRoKGEpICkNCiAgICAgICAgcGFyc2VFbGVtZW50Q2xhc3MgPSBMaXRlcmFsDQoNCiAgICBzeW1ib2xzID0gW10NCiAgICBpZiBpc2luc3RhbmNlKHN0cnMsYmFzZXN0cmluZyk6DQogICAgICAgIHN5bWJvbHMgPSBzdHJzLnNwbGl0KCkNCiAgICBlbGlmIGlzaW5zdGFuY2Uoc3RycywgSXRlcmFibGUpOg0KICAgICAgICBzeW1ib2xzID0gbGlzdChzdHJzKQ0KICAgIGVsc2U6DQogICAgICAgIHdhcm5pbmdzLndhcm4oIkludmFsaWQgYXJndW1lbnQgdG8gb25lT2YsIGV4cGVjdGVkIHN0cmluZyBvciBpdGVyYWJsZSIsDQogICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQ0KICAgIGlmIG5vdCBzeW1ib2xzOg0KICAgICAgICByZXR1cm4gTm9NYXRjaCgpDQoNCiAgICBpID0gMA0KICAgIHdoaWxlIGkgPCBsZW4oc3ltYm9scyktMToNCiAgICAgICAgY3VyID0gc3ltYm9sc1tpXQ0KICAgICAgICBmb3IgaixvdGhlciBpbiBlbnVtZXJhdGUoc3ltYm9sc1tpKzE6XSk6DQogICAgICAgICAgICBpZiAoIGlzZXF1YWwob3RoZXIsIGN1cikgKToNCiAgICAgICAgICAgICAgICBkZWwgc3ltYm9sc1tpK2orMV0NCiAgICAgICAgICAgICAgICBicmVhaw0KICAgICAgICAgICAgZWxpZiAoIG1hc2tzKGN1ciwgb3RoZXIpICk6DQogICAgICAgICAgICAgICAgZGVsIHN5bWJvbHNbaStqKzFdDQogICAgICAgICAgICAgICAgc3ltYm9scy5pbnNlcnQoaSxvdGhlcikNCiAgICAgICAgICAgICAgICBjdXIgPSBvdGhlcg0KICAgICAgICAgICAgICAgIGJyZWFrDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBpICs9IDENCg0KICAgIGlmIG5vdCBjYXNlbGVzcyBhbmQgdXNlUmVnZXg6DQogICAgICAgICN+IHByaW50IChzdHJzLCItPiIsICJ8Ii5qb2luKCBbIF9lc2NhcGVSZWdleENoYXJzKHN5bSkgZm9yIHN5bSBpbiBzeW1ib2xzXSApKQ0KICAgICAgICB0cnk6DQogICAgICAgICAgICBpZiBsZW4oc3ltYm9scyk9PWxlbigiIi5qb2luKHN5bWJvbHMpKToNCiAgICAgICAgICAgICAgICByZXR1cm4gUmVnZXgoICJbJXNdIiAlICIiLmpvaW4oX2VzY2FwZVJlZ2V4UmFuZ2VDaGFycyhzeW0pIGZvciBzeW0gaW4gc3ltYm9scykgKS5zZXROYW1lKCcgfCAnLmpvaW4oc3ltYm9scykpDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHJldHVybiBSZWdleCggInwiLmpvaW4ocmUuZXNjYXBlKHN5bSkgZm9yIHN5bSBpbiBzeW1ib2xzKSApLnNldE5hbWUoJyB8ICcuam9pbihzeW1ib2xzKSkNCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoNCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkV4Y2VwdGlvbiBjcmVhdGluZyBSZWdleCBmb3Igb25lT2YsIGJ1aWxkaW5nIE1hdGNoRmlyc3QiLA0KICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpDQoNCg0KICAgICMgbGFzdCByZXNvcnQsIGp1c3QgdXNlIE1hdGNoRmlyc3QNCiAgICByZXR1cm4gTWF0Y2hGaXJzdChwYXJzZUVsZW1lbnRDbGFzcyhzeW0pIGZvciBzeW0gaW4gc3ltYm9scykuc2V0TmFtZSgnIHwgJy5qb2luKHN5bWJvbHMpKQ0KDQpkZWYgZGljdE9mKCBrZXksIHZhbHVlICk6DQogICAgIiIiDQogICAgSGVscGVyIHRvIGVhc2lseSBhbmQgY2xlYXJseSBkZWZpbmUgYSBkaWN0aW9uYXJ5IGJ5IHNwZWNpZnlpbmcgdGhlIHJlc3BlY3RpdmUgcGF0dGVybnMNCiAgICBmb3IgdGhlIGtleSBhbmQgdmFsdWUuICBUYWtlcyBjYXJlIG9mIGRlZmluaW5nIHRoZSBDe0x7RGljdH19LCBDe0x7WmVyb09yTW9yZX19LCBhbmQgQ3tMe0dyb3VwfX0gdG9rZW5zDQogICAgaW4gdGhlIHByb3BlciBvcmRlci4gIFRoZSBrZXkgcGF0dGVybiBjYW4gaW5jbHVkZSBkZWxpbWl0aW5nIG1hcmtlcnMgb3IgcHVuY3R1YXRpb24sDQogICAgYXMgbG9uZyBhcyB0aGV5IGFyZSBzdXBwcmVzc2VkLCB0aGVyZWJ5IGxlYXZpbmcgdGhlIHNpZ25pZmljYW50IGtleSB0ZXh0LiAgVGhlIHZhbHVlDQogICAgcGF0dGVybiBjYW4gaW5jbHVkZSBuYW1lZCByZXN1bHRzLCBzbyB0aGF0IHRoZSBDe0RpY3R9IHJlc3VsdHMgY2FuIGluY2x1ZGUgbmFtZWQgdG9rZW4NCiAgICBmaWVsZHMuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgdGV4dCA9ICJzaGFwZTogU1FVQVJFIHBvc246IHVwcGVyIGxlZnQgY29sb3I6IGxpZ2h0IGJsdWUgdGV4dHVyZTogYnVybGFwIg0KICAgICAgICBhdHRyX2V4cHIgPSAobGFiZWwgKyBTdXBwcmVzcygnOicpICsgT25lT3JNb3JlKGRhdGFfd29yZCwgc3RvcE9uPWxhYmVsKS5zZXRQYXJzZUFjdGlvbignICcuam9pbikpDQogICAgICAgIHByaW50KE9uZU9yTW9yZShhdHRyX2V4cHIpLnBhcnNlU3RyaW5nKHRleHQpLmR1bXAoKSkNCiAgICAgICAgDQogICAgICAgIGF0dHJfbGFiZWwgPSBsYWJlbA0KICAgICAgICBhdHRyX3ZhbHVlID0gU3VwcHJlc3MoJzonKSArIE9uZU9yTW9yZShkYXRhX3dvcmQsIHN0b3BPbj1sYWJlbCkuc2V0UGFyc2VBY3Rpb24oJyAnLmpvaW4pDQoNCiAgICAgICAgIyBzaW1pbGFyIHRvIERpY3QsIGJ1dCBzaW1wbGVyIGNhbGwgZm9ybWF0DQogICAgICAgIHJlc3VsdCA9IGRpY3RPZihhdHRyX2xhYmVsLCBhdHRyX3ZhbHVlKS5wYXJzZVN0cmluZyh0ZXh0KQ0KICAgICAgICBwcmludChyZXN1bHQuZHVtcCgpKQ0KICAgICAgICBwcmludChyZXN1bHRbJ3NoYXBlJ10pDQogICAgICAgIHByaW50KHJlc3VsdC5zaGFwZSkgICMgb2JqZWN0IGF0dHJpYnV0ZSBhY2Nlc3Mgd29ya3MgdG9vDQogICAgICAgIHByaW50KHJlc3VsdC5hc0RpY3QoKSkNCiAgICBwcmludHM6Og0KICAgICAgICBbWydzaGFwZScsICdTUVVBUkUnXSwgWydwb3NuJywgJ3VwcGVyIGxlZnQnXSwgWydjb2xvcicsICdsaWdodCBibHVlJ10sIFsndGV4dHVyZScsICdidXJsYXAnXV0NCiAgICAgICAgLSBjb2xvcjogbGlnaHQgYmx1ZQ0KICAgICAgICAtIHBvc246IHVwcGVyIGxlZnQNCiAgICAgICAgLSBzaGFwZTogU1FVQVJFDQogICAgICAgIC0gdGV4dHVyZTogYnVybGFwDQogICAgICAgIFNRVUFSRQ0KICAgICAgICBTUVVBUkUNCiAgICAgICAgeydjb2xvcic6ICdsaWdodCBibHVlJywgJ3NoYXBlJzogJ1NRVUFSRScsICdwb3NuJzogJ3VwcGVyIGxlZnQnLCAndGV4dHVyZSc6ICdidXJsYXAnfQ0KICAgICIiIg0KICAgIHJldHVybiBEaWN0KCBaZXJvT3JNb3JlKCBHcm91cCAoIGtleSArIHZhbHVlICkgKSApDQoNCmRlZiBvcmlnaW5hbFRleHRGb3IoZXhwciwgYXNTdHJpbmc9VHJ1ZSk6DQogICAgIiIiDQogICAgSGVscGVyIHRvIHJldHVybiB0aGUgb3JpZ2luYWwsIHVudG9rZW5pemVkIHRleHQgZm9yIGEgZ2l2ZW4gZXhwcmVzc2lvbi4gIFVzZWZ1bCB0bw0KICAgIHJlc3RvcmUgdGhlIHBhcnNlZCBmaWVsZHMgb2YgYW4gSFRNTCBzdGFydCB0YWcgaW50byB0aGUgcmF3IHRhZyB0ZXh0IGl0c2VsZiwgb3IgdG8NCiAgICByZXZlcnQgc2VwYXJhdGUgdG9rZW5zIHdpdGggaW50ZXJ2ZW5pbmcgd2hpdGVzcGFjZSBiYWNrIHRvIHRoZSBvcmlnaW5hbCBtYXRjaGluZw0KICAgIGlucHV0IHRleHQuIEJ5IGRlZmF1bHQsIHJldHVybnMgYXN0cmluZyBjb250YWluaW5nIHRoZSBvcmlnaW5hbCBwYXJzZWQgdGV4dC4gIA0KICAgICAgIA0KICAgIElmIHRoZSBvcHRpb25hbCBDe2FzU3RyaW5nfSBhcmd1bWVudCBpcyBwYXNzZWQgYXMgQ3tGYWxzZX0sIHRoZW4gdGhlIHJldHVybiB2YWx1ZSBpcyBhIA0KICAgIEN7THtQYXJzZVJlc3VsdHN9fSBjb250YWluaW5nIGFueSByZXN1bHRzIG5hbWVzIHRoYXQgd2VyZSBvcmlnaW5hbGx5IG1hdGNoZWQsIGFuZCBhIA0KICAgIHNpbmdsZSB0b2tlbiBjb250YWluaW5nIHRoZSBvcmlnaW5hbCBtYXRjaGVkIHRleHQgZnJvbSB0aGUgaW5wdXQgc3RyaW5nLiAgU28gaWYgDQogICAgdGhlIGV4cHJlc3Npb24gcGFzc2VkIHRvIEN7THtvcmlnaW5hbFRleHRGb3J9fSBjb250YWlucyBleHByZXNzaW9ucyB3aXRoIGRlZmluZWQNCiAgICByZXN1bHRzIG5hbWVzLCB5b3UgbXVzdCBzZXQgQ3thc1N0cmluZ30gdG8gQ3tGYWxzZX0gaWYgeW91IHdhbnQgdG8gcHJlc2VydmUgdGhvc2UNCiAgICByZXN1bHRzIG5hbWUgdmFsdWVzLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIHNyYyA9ICJ0aGlzIGlzIHRlc3QgPGI+IGJvbGQgPGk+dGV4dDwvaT4gPC9iPiBub3JtYWwgdGV4dCAiDQogICAgICAgIGZvciB0YWcgaW4gKCJiIiwiaSIpOg0KICAgICAgICAgICAgb3BlbmVyLGNsb3NlciA9IG1ha2VIVE1MVGFncyh0YWcpDQogICAgICAgICAgICBwYXR0ID0gb3JpZ2luYWxUZXh0Rm9yKG9wZW5lciArIFNraXBUbyhjbG9zZXIpICsgY2xvc2VyKQ0KICAgICAgICAgICAgcHJpbnQocGF0dC5zZWFyY2hTdHJpbmcoc3JjKVswXSkNCiAgICBwcmludHM6Og0KICAgICAgICBbJzxiPiBib2xkIDxpPnRleHQ8L2k+IDwvYj4nXQ0KICAgICAgICBbJzxpPnRleHQ8L2k+J10NCiAgICAiIiINCiAgICBsb2NNYXJrZXIgPSBFbXB0eSgpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSBzLGxvYyx0OiBsb2MpDQogICAgZW5kbG9jTWFya2VyID0gbG9jTWFya2VyLmNvcHkoKQ0KICAgIGVuZGxvY01hcmtlci5jYWxsUHJlcGFyc2UgPSBGYWxzZQ0KICAgIG1hdGNoRXhwciA9IGxvY01hcmtlcigiX29yaWdpbmFsX3N0YXJ0IikgKyBleHByICsgZW5kbG9jTWFya2VyKCJfb3JpZ2luYWxfZW5kIikNCiAgICBpZiBhc1N0cmluZzoNCiAgICAgICAgZXh0cmFjdFRleHQgPSBsYW1iZGEgcyxsLHQ6IHNbdC5fb3JpZ2luYWxfc3RhcnQ6dC5fb3JpZ2luYWxfZW5kXQ0KICAgIGVsc2U6DQogICAgICAgIGRlZiBleHRyYWN0VGV4dChzLGwsdCk6DQogICAgICAgICAgICB0WzpdID0gW3NbdC5wb3AoJ19vcmlnaW5hbF9zdGFydCcpOnQucG9wKCdfb3JpZ2luYWxfZW5kJyldXQ0KICAgIG1hdGNoRXhwci5zZXRQYXJzZUFjdGlvbihleHRyYWN0VGV4dCkNCiAgICBtYXRjaEV4cHIuaWdub3JlRXhwcnMgPSBleHByLmlnbm9yZUV4cHJzDQogICAgcmV0dXJuIG1hdGNoRXhwcg0KDQpkZWYgdW5ncm91cChleHByKTogDQogICAgIiIiDQogICAgSGVscGVyIHRvIHVuZG8gcHlwYXJzaW5nJ3MgZGVmYXVsdCBncm91cGluZyBvZiBBbmQgZXhwcmVzc2lvbnMsIGV2ZW4NCiAgICBpZiBhbGwgYnV0IG9uZSBhcmUgbm9uLWVtcHR5Lg0KICAgICIiIg0KICAgIHJldHVybiBUb2tlbkNvbnZlcnRlcihleHByKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgdDp0WzBdKQ0KDQpkZWYgbG9jYXRlZEV4cHIoZXhwcik6DQogICAgIiIiDQogICAgSGVscGVyIHRvIGRlY29yYXRlIGEgcmV0dXJuZWQgdG9rZW4gd2l0aCBpdHMgc3RhcnRpbmcgYW5kIGVuZGluZyBsb2NhdGlvbnMgaW4gdGhlIGlucHV0IHN0cmluZy4NCiAgICBUaGlzIGhlbHBlciBhZGRzIHRoZSBmb2xsb3dpbmcgcmVzdWx0cyBuYW1lczoNCiAgICAgLSBsb2NuX3N0YXJ0ID0gbG9jYXRpb24gd2hlcmUgbWF0Y2hlZCBleHByZXNzaW9uIGJlZ2lucw0KICAgICAtIGxvY25fZW5kID0gbG9jYXRpb24gd2hlcmUgbWF0Y2hlZCBleHByZXNzaW9uIGVuZHMNCiAgICAgLSB2YWx1ZSA9IHRoZSBhY3R1YWwgcGFyc2VkIHJlc3VsdHMNCg0KICAgIEJlIGNhcmVmdWwgaWYgdGhlIGlucHV0IHRleHQgY29udGFpbnMgQ3s8VEFCPn0gY2hhcmFjdGVycywgeW91IG1heSB3YW50IHRvIGNhbGwNCiAgICBDe0x7UGFyc2VyRWxlbWVudC5wYXJzZVdpdGhUYWJzfX0NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICB3ZCA9IFdvcmQoYWxwaGFzKQ0KICAgICAgICBmb3IgbWF0Y2ggaW4gbG9jYXRlZEV4cHIod2QpLnNlYXJjaFN0cmluZygibGpzZGYxMjNsa3NkampmMTIzbGtramoxMjIyIik6DQogICAgICAgICAgICBwcmludChtYXRjaCkNCiAgICBwcmludHM6Og0KICAgICAgICBbWzAsICdsanNkZicsIDVdXQ0KICAgICAgICBbWzgsICdsa3NkampmJywgMTVdXQ0KICAgICAgICBbWzE4LCAnbGtramonLCAyM11dDQogICAgIiIiDQogICAgbG9jYXRvciA9IEVtcHR5KCkuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHMsbCx0OiBsKQ0KICAgIHJldHVybiBHcm91cChsb2NhdG9yKCJsb2NuX3N0YXJ0IikgKyBleHByKCJ2YWx1ZSIpICsgbG9jYXRvci5jb3B5KCkubGVhdmVXaGl0ZXNwYWNlKCkoImxvY25fZW5kIikpDQoNCg0KIyBjb252ZW5pZW5jZSBjb25zdGFudHMgZm9yIHBvc2l0aW9uYWwgZXhwcmVzc2lvbnMNCmVtcHR5ICAgICAgID0gRW1wdHkoKS5zZXROYW1lKCJlbXB0eSIpDQpsaW5lU3RhcnQgICA9IExpbmVTdGFydCgpLnNldE5hbWUoImxpbmVTdGFydCIpDQpsaW5lRW5kICAgICA9IExpbmVFbmQoKS5zZXROYW1lKCJsaW5lRW5kIikNCnN0cmluZ1N0YXJ0ID0gU3RyaW5nU3RhcnQoKS5zZXROYW1lKCJzdHJpbmdTdGFydCIpDQpzdHJpbmdFbmQgICA9IFN0cmluZ0VuZCgpLnNldE5hbWUoInN0cmluZ0VuZCIpDQoNCl9lc2NhcGVkUHVuYyA9IFdvcmQoIF9ic2xhc2gsIHIiXFtdLSouJCtePygpfiAiLCBleGFjdD0yICkuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHMsbCx0OnRbMF1bMV0pDQpfZXNjYXBlZEhleENoYXIgPSBSZWdleChyIlxcMD9beFhdWzAtOWEtZkEtRl0rIikuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHMsbCx0OnVuaWNocihpbnQodFswXS5sc3RyaXAocidcMHgnKSwxNikpKQ0KX2VzY2FwZWRPY3RDaGFyID0gUmVnZXgociJcXDBbMC03XSsiKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcyxsLHQ6dW5pY2hyKGludCh0WzBdWzE6XSw4KSkpDQpfc2luZ2xlQ2hhciA9IF9lc2NhcGVkUHVuYyB8IF9lc2NhcGVkSGV4Q2hhciB8IF9lc2NhcGVkT2N0Q2hhciB8IENoYXJzTm90SW4ocidcXScsIGV4YWN0PTEpDQpfY2hhclJhbmdlID0gR3JvdXAoX3NpbmdsZUNoYXIgKyBTdXBwcmVzcygiLSIpICsgX3NpbmdsZUNoYXIpDQpfcmVCcmFja2V0RXhwciA9IExpdGVyYWwoIlsiKSArIE9wdGlvbmFsKCJeIikuc2V0UmVzdWx0c05hbWUoIm5lZ2F0ZSIpICsgR3JvdXAoIE9uZU9yTW9yZSggX2NoYXJSYW5nZSB8IF9zaW5nbGVDaGFyICkgKS5zZXRSZXN1bHRzTmFtZSgiYm9keSIpICsgIl0iDQoNCmRlZiBzcmFuZ2Uocyk6DQogICAgciIiIg0KICAgIEhlbHBlciB0byBlYXNpbHkgZGVmaW5lIHN0cmluZyByYW5nZXMgZm9yIHVzZSBpbiBXb3JkIGNvbnN0cnVjdGlvbi4gIEJvcnJvd3MNCiAgICBzeW50YXggZnJvbSByZWdleHAgJ1tdJyBzdHJpbmcgcmFuZ2UgZGVmaW5pdGlvbnM6Og0KICAgICAgICBzcmFuZ2UoIlswLTldIikgICAtPiAiMDEyMzQ1Njc4OSINCiAgICAgICAgc3JhbmdlKCJbYS16XSIpICAgLT4gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Ig0KICAgICAgICBzcmFuZ2UoIlthLXokX10iKSAtPiAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXokXyINCiAgICBUaGUgaW5wdXQgc3RyaW5nIG11c3QgYmUgZW5jbG9zZWQgaW4gW10ncywgYW5kIHRoZSByZXR1cm5lZCBzdHJpbmcgaXMgdGhlIGV4cGFuZGVkDQogICAgY2hhcmFjdGVyIHNldCBqb2luZWQgaW50byBhIHNpbmdsZSBzdHJpbmcuDQogICAgVGhlIHZhbHVlcyBlbmNsb3NlZCBpbiB0aGUgW10ncyBtYXkgYmU6DQogICAgIC0gYSBzaW5nbGUgY2hhcmFjdGVyDQogICAgIC0gYW4gZXNjYXBlZCBjaGFyYWN0ZXIgd2l0aCBhIGxlYWRpbmcgYmFja3NsYXNoIChzdWNoIGFzIEN7XC19IG9yIEN7XF19KQ0KICAgICAtIGFuIGVzY2FwZWQgaGV4IGNoYXJhY3RlciB3aXRoIGEgbGVhZGluZyBDeydceCd9IChDe1x4MjF9LCB3aGljaCBpcyBhIEN7JyEnfSBjaGFyYWN0ZXIpIA0KICAgICAgICAgKEN7XDB4IyN9IGlzIGFsc28gc3VwcG9ydGVkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSkgDQogICAgIC0gYW4gZXNjYXBlZCBvY3RhbCBjaGFyYWN0ZXIgd2l0aCBhIGxlYWRpbmcgQ3snXDAnfSAoQ3tcMDQxfSwgd2hpY2ggaXMgYSBDeychJ30gY2hhcmFjdGVyKQ0KICAgICAtIGEgcmFuZ2Ugb2YgYW55IG9mIHRoZSBhYm92ZSwgc2VwYXJhdGVkIGJ5IGEgZGFzaCAoQ3snYS16J30sIGV0Yy4pDQogICAgIC0gYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBhYm92ZSAoQ3snYWVpb3V5J30sIEN7J2EtekEtWjAtOV8kJ30sIGV0Yy4pDQogICAgIiIiDQogICAgX2V4cGFuZGVkID0gbGFtYmRhIHA6IHAgaWYgbm90IGlzaW5zdGFuY2UocCxQYXJzZVJlc3VsdHMpIGVsc2UgJycuam9pbih1bmljaHIoYykgZm9yIGMgaW4gcmFuZ2Uob3JkKHBbMF0pLG9yZChwWzFdKSsxKSkNCiAgICB0cnk6DQogICAgICAgIHJldHVybiAiIi5qb2luKF9leHBhbmRlZChwYXJ0KSBmb3IgcGFydCBpbiBfcmVCcmFja2V0RXhwci5wYXJzZVN0cmluZyhzKS5ib2R5KQ0KICAgIGV4Y2VwdCBFeGNlcHRpb246DQogICAgICAgIHJldHVybiAiIg0KDQpkZWYgbWF0Y2hPbmx5QXRDb2wobik6DQogICAgIiIiDQogICAgSGVscGVyIG1ldGhvZCBmb3IgZGVmaW5pbmcgcGFyc2UgYWN0aW9ucyB0aGF0IHJlcXVpcmUgbWF0Y2hpbmcgYXQgYSBzcGVjaWZpYw0KICAgIGNvbHVtbiBpbiB0aGUgaW5wdXQgdGV4dC4NCiAgICAiIiINCiAgICBkZWYgdmVyaWZ5Q29sKHN0cmcsbG9jbix0b2tzKToNCiAgICAgICAgaWYgY29sKGxvY24sc3RyZykgIT0gbjoNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKHN0cmcsbG9jbiwibWF0Y2hlZCB0b2tlbiBub3QgYXQgY29sdW1uICVkIiAlIG4pDQogICAgcmV0dXJuIHZlcmlmeUNvbA0KDQpkZWYgcmVwbGFjZVdpdGgocmVwbFN0cik6DQogICAgIiIiDQogICAgSGVscGVyIG1ldGhvZCBmb3IgY29tbW9uIHBhcnNlIGFjdGlvbnMgdGhhdCBzaW1wbHkgcmV0dXJuIGEgbGl0ZXJhbCB2YWx1ZS4gIEVzcGVjaWFsbHkNCiAgICB1c2VmdWwgd2hlbiB1c2VkIHdpdGggQ3tMe3RyYW5zZm9ybVN0cmluZzxQYXJzZXJFbGVtZW50LnRyYW5zZm9ybVN0cmluZz59KCl9Lg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIG51bSA9IFdvcmQobnVtcykuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHRva3M6IGludCh0b2tzWzBdKSkNCiAgICAgICAgbmEgPSBvbmVPZigiTi9BIE5BIikuc2V0UGFyc2VBY3Rpb24ocmVwbGFjZVdpdGgobWF0aC5uYW4pKQ0KICAgICAgICB0ZXJtID0gbmEgfCBudW0NCiAgICAgICAgDQogICAgICAgIE9uZU9yTW9yZSh0ZXJtKS5wYXJzZVN0cmluZygiMzI0IDIzNCBOL0EgMjM0IikgIyAtPiBbMzI0LCAyMzQsIG5hbiwgMjM0XQ0KICAgICIiIg0KICAgIHJldHVybiBsYW1iZGEgcyxsLHQ6IFtyZXBsU3RyXQ0KDQpkZWYgcmVtb3ZlUXVvdGVzKHMsbCx0KToNCiAgICAiIiINCiAgICBIZWxwZXIgcGFyc2UgYWN0aW9uIGZvciByZW1vdmluZyBxdW90YXRpb24gbWFya3MgZnJvbSBwYXJzZWQgcXVvdGVkIHN0cmluZ3MuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgIyBieSBkZWZhdWx0LCBxdW90YXRpb24gbWFya3MgYXJlIGluY2x1ZGVkIGluIHBhcnNlZCByZXN1bHRzDQogICAgICAgIHF1b3RlZFN0cmluZy5wYXJzZVN0cmluZygiJ05vdyBpcyB0aGUgV2ludGVyIG9mIG91ciBEaXNjb250ZW50JyIpICMgLT4gWyInTm93IGlzIHRoZSBXaW50ZXIgb2Ygb3VyIERpc2NvbnRlbnQnIl0NCg0KICAgICAgICAjIHVzZSByZW1vdmVRdW90ZXMgdG8gc3RyaXAgcXVvdGF0aW9uIG1hcmtzIGZyb20gcGFyc2VkIHJlc3VsdHMNCiAgICAgICAgcXVvdGVkU3RyaW5nLnNldFBhcnNlQWN0aW9uKHJlbW92ZVF1b3RlcykNCiAgICAgICAgcXVvdGVkU3RyaW5nLnBhcnNlU3RyaW5nKCInTm93IGlzIHRoZSBXaW50ZXIgb2Ygb3VyIERpc2NvbnRlbnQnIikgIyAtPiBbIk5vdyBpcyB0aGUgV2ludGVyIG9mIG91ciBEaXNjb250ZW50Il0NCiAgICAiIiINCiAgICByZXR1cm4gdFswXVsxOi0xXQ0KDQpkZWYgdG9rZW5NYXAoZnVuYywgKmFyZ3MpOg0KICAgICIiIg0KICAgIEhlbHBlciB0byBkZWZpbmUgYSBwYXJzZSBhY3Rpb24gYnkgbWFwcGluZyBhIGZ1bmN0aW9uIHRvIGFsbCBlbGVtZW50cyBvZiBhIFBhcnNlUmVzdWx0cyBsaXN0LklmIGFueSBhZGRpdGlvbmFsIA0KICAgIGFyZ3MgYXJlIHBhc3NlZCwgdGhleSBhcmUgZm9yd2FyZGVkIHRvIHRoZSBnaXZlbiBmdW5jdGlvbiBhcyBhZGRpdGlvbmFsIGFyZ3VtZW50cyBhZnRlcg0KICAgIHRoZSB0b2tlbiwgYXMgaW4gQ3toZXhfaW50ZWdlciA9IFdvcmQoaGV4bnVtcykuc2V0UGFyc2VBY3Rpb24odG9rZW5NYXAoaW50LCAxNikpfSwgd2hpY2ggd2lsbCBjb252ZXJ0IHRoZQ0KICAgIHBhcnNlZCBkYXRhIHRvIGFuIGludGVnZXIgdXNpbmcgYmFzZSAxNi4NCg0KICAgIEV4YW1wbGUgKGNvbXBhcmUgdGhlIGxhc3QgdG8gZXhhbXBsZSBpbiBMe1BhcnNlckVsZW1lbnQudHJhbnNmb3JtU3RyaW5nfTo6DQogICAgICAgIGhleF9pbnRzID0gT25lT3JNb3JlKFdvcmQoaGV4bnVtcykpLnNldFBhcnNlQWN0aW9uKHRva2VuTWFwKGludCwgMTYpKQ0KICAgICAgICBoZXhfaW50cy5ydW5UZXN0cygnJycNCiAgICAgICAgICAgIDAwIDExIDIyIGFhIEZGIDBhIDBkIDFhDQogICAgICAgICAgICAnJycpDQogICAgICAgIA0KICAgICAgICB1cHBlcndvcmQgPSBXb3JkKGFscGhhcykuc2V0UGFyc2VBY3Rpb24odG9rZW5NYXAoc3RyLnVwcGVyKSkNCiAgICAgICAgT25lT3JNb3JlKHVwcGVyd29yZCkucnVuVGVzdHMoJycnDQogICAgICAgICAgICBteSBraW5nZG9tIGZvciBhIGhvcnNlDQogICAgICAgICAgICAnJycpDQoNCiAgICAgICAgd2QgPSBXb3JkKGFscGhhcykuc2V0UGFyc2VBY3Rpb24odG9rZW5NYXAoc3RyLnRpdGxlKSkNCiAgICAgICAgT25lT3JNb3JlKHdkKS5zZXRQYXJzZUFjdGlvbignICcuam9pbikucnVuVGVzdHMoJycnDQogICAgICAgICAgICBub3cgaXMgdGhlIHdpbnRlciBvZiBvdXIgZGlzY29udGVudCBtYWRlIGdsb3Jpb3VzIHN1bW1lciBieSB0aGlzIHN1biBvZiB5b3JrDQogICAgICAgICAgICAnJycpDQogICAgcHJpbnRzOjoNCiAgICAgICAgMDAgMTEgMjIgYWEgRkYgMGEgMGQgMWENCiAgICAgICAgWzAsIDE3LCAzNCwgMTcwLCAyNTUsIDEwLCAxMywgMjZdDQoNCiAgICAgICAgbXkga2luZ2RvbSBmb3IgYSBob3JzZQ0KICAgICAgICBbJ01ZJywgJ0tJTkdET00nLCAnRk9SJywgJ0EnLCAnSE9SU0UnXQ0KDQogICAgICAgIG5vdyBpcyB0aGUgd2ludGVyIG9mIG91ciBkaXNjb250ZW50IG1hZGUgZ2xvcmlvdXMgc3VtbWVyIGJ5IHRoaXMgc3VuIG9mIHlvcmsNCiAgICAgICAgWydOb3cgSXMgVGhlIFdpbnRlciBPZiBPdXIgRGlzY29udGVudCBNYWRlIEdsb3Jpb3VzIFN1bW1lciBCeSBUaGlzIFN1biBPZiBZb3JrJ10NCiAgICAiIiINCiAgICBkZWYgcGEocyxsLHQpOg0KICAgICAgICByZXR1cm4gW2Z1bmModG9rbiwgKmFyZ3MpIGZvciB0b2tuIGluIHRdDQoNCiAgICB0cnk6DQogICAgICAgIGZ1bmNfbmFtZSA9IGdldGF0dHIoZnVuYywgJ19fbmFtZV9fJywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0YXR0cihmdW5jLCAnX19jbGFzc19fJykuX19uYW1lX18pDQogICAgZXhjZXB0IEV4Y2VwdGlvbjoNCiAgICAgICAgZnVuY19uYW1lID0gc3RyKGZ1bmMpDQogICAgcGEuX19uYW1lX18gPSBmdW5jX25hbWUNCg0KICAgIHJldHVybiBwYQ0KDQp1cGNhc2VUb2tlbnMgPSB0b2tlbk1hcChsYW1iZGEgdDogX3VzdHIodCkudXBwZXIoKSkNCiIiIihEZXByZWNhdGVkKSBIZWxwZXIgcGFyc2UgYWN0aW9uIHRvIGNvbnZlcnQgdG9rZW5zIHRvIHVwcGVyIGNhc2UuIERlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgTHtweXBhcnNpbmdfY29tbW9uLnVwY2FzZVRva2Vuc30iIiINCg0KZG93bmNhc2VUb2tlbnMgPSB0b2tlbk1hcChsYW1iZGEgdDogX3VzdHIodCkubG93ZXIoKSkNCiIiIihEZXByZWNhdGVkKSBIZWxwZXIgcGFyc2UgYWN0aW9uIHRvIGNvbnZlcnQgdG9rZW5zIHRvIGxvd2VyIGNhc2UuIERlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgTHtweXBhcnNpbmdfY29tbW9uLmRvd25jYXNlVG9rZW5zfSIiIg0KICAgIA0KZGVmIF9tYWtlVGFncyh0YWdTdHIsIHhtbCk6DQogICAgIiIiSW50ZXJuYWwgaGVscGVyIHRvIGNvbnN0cnVjdCBvcGVuaW5nIGFuZCBjbG9zaW5nIHRhZyBleHByZXNzaW9ucywgZ2l2ZW4gYSB0YWcgbmFtZSIiIg0KICAgIGlmIGlzaW5zdGFuY2UodGFnU3RyLGJhc2VzdHJpbmcpOg0KICAgICAgICByZXNuYW1lID0gdGFnU3RyDQogICAgICAgIHRhZ1N0ciA9IEtleXdvcmQodGFnU3RyLCBjYXNlbGVzcz1ub3QgeG1sKQ0KICAgIGVsc2U6DQogICAgICAgIHJlc25hbWUgPSB0YWdTdHIubmFtZQ0KDQogICAgdGFnQXR0ck5hbWUgPSBXb3JkKGFscGhhcyxhbHBoYW51bXMrIl8tOiIpDQogICAgaWYgKHhtbCk6DQogICAgICAgIHRhZ0F0dHJWYWx1ZSA9IGRibFF1b3RlZFN0cmluZy5jb3B5KCkuc2V0UGFyc2VBY3Rpb24oIHJlbW92ZVF1b3RlcyApDQogICAgICAgIG9wZW5UYWcgPSBTdXBwcmVzcygiPCIpICsgdGFnU3RyKCJ0YWciKSArIFwNCiAgICAgICAgICAgICAgICBEaWN0KFplcm9Pck1vcmUoR3JvdXAoIHRhZ0F0dHJOYW1lICsgU3VwcHJlc3MoIj0iKSArIHRhZ0F0dHJWYWx1ZSApKSkgKyBcDQogICAgICAgICAgICAgICAgT3B0aW9uYWwoIi8iLGRlZmF1bHQ9W0ZhbHNlXSkuc2V0UmVzdWx0c05hbWUoImVtcHR5Iikuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHMsbCx0OnRbMF09PScvJykgKyBTdXBwcmVzcygiPiIpDQogICAgZWxzZToNCiAgICAgICAgcHJpbnRhYmxlc0xlc3NSQWJyYWNrID0gIiIuam9pbihjIGZvciBjIGluIHByaW50YWJsZXMgaWYgYyBub3QgaW4gIj4iKQ0KICAgICAgICB0YWdBdHRyVmFsdWUgPSBxdW90ZWRTdHJpbmcuY29weSgpLnNldFBhcnNlQWN0aW9uKCByZW1vdmVRdW90ZXMgKSB8IFdvcmQocHJpbnRhYmxlc0xlc3NSQWJyYWNrKQ0KICAgICAgICBvcGVuVGFnID0gU3VwcHJlc3MoIjwiKSArIHRhZ1N0cigidGFnIikgKyBcDQogICAgICAgICAgICAgICAgRGljdChaZXJvT3JNb3JlKEdyb3VwKCB0YWdBdHRyTmFtZS5zZXRQYXJzZUFjdGlvbihkb3duY2FzZVRva2VucykgKyBcDQogICAgICAgICAgICAgICAgT3B0aW9uYWwoIFN1cHByZXNzKCI9IikgKyB0YWdBdHRyVmFsdWUgKSApKSkgKyBcDQogICAgICAgICAgICAgICAgT3B0aW9uYWwoIi8iLGRlZmF1bHQ9W0ZhbHNlXSkuc2V0UmVzdWx0c05hbWUoImVtcHR5Iikuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHMsbCx0OnRbMF09PScvJykgKyBTdXBwcmVzcygiPiIpDQogICAgY2xvc2VUYWcgPSBDb21iaW5lKF9MKCI8LyIpICsgdGFnU3RyICsgIj4iKQ0KDQogICAgb3BlblRhZyA9IG9wZW5UYWcuc2V0UmVzdWx0c05hbWUoInN0YXJ0IisiIi5qb2luKHJlc25hbWUucmVwbGFjZSgiOiIsIiAiKS50aXRsZSgpLnNwbGl0KCkpKS5zZXROYW1lKCI8JXM+IiAlIHJlc25hbWUpDQogICAgY2xvc2VUYWcgPSBjbG9zZVRhZy5zZXRSZXN1bHRzTmFtZSgiZW5kIisiIi5qb2luKHJlc25hbWUucmVwbGFjZSgiOiIsIiAiKS50aXRsZSgpLnNwbGl0KCkpKS5zZXROYW1lKCI8LyVzPiIgJSByZXNuYW1lKQ0KICAgIG9wZW5UYWcudGFnID0gcmVzbmFtZQ0KICAgIGNsb3NlVGFnLnRhZyA9IHJlc25hbWUNCiAgICByZXR1cm4gb3BlblRhZywgY2xvc2VUYWcNCg0KZGVmIG1ha2VIVE1MVGFncyh0YWdTdHIpOg0KICAgICIiIg0KICAgIEhlbHBlciB0byBjb25zdHJ1Y3Qgb3BlbmluZyBhbmQgY2xvc2luZyB0YWcgZXhwcmVzc2lvbnMgZm9yIEhUTUwsIGdpdmVuIGEgdGFnIG5hbWUuIE1hdGNoZXMNCiAgICB0YWdzIGluIGVpdGhlciB1cHBlciBvciBsb3dlciBjYXNlLCBhdHRyaWJ1dGVzIHdpdGggbmFtZXNwYWNlcyBhbmQgd2l0aCBxdW90ZWQgb3IgdW5xdW90ZWQgdmFsdWVzLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIHRleHQgPSAnPHRkPk1vcmUgaW5mbyBhdCB0aGUgPGEgaHJlZj0iaHR0cDovL3B5cGFyc2luZy53aWtpc3BhY2VzLmNvbSI+cHlwYXJzaW5nPC9hPiB3aWtpIHBhZ2U8L3RkPicNCiAgICAgICAgIyBtYWtlSFRNTFRhZ3MgcmV0dXJucyBweXBhcnNpbmcgZXhwcmVzc2lvbnMgZm9yIHRoZSBvcGVuaW5nIGFuZCBjbG9zaW5nIHRhZ3MgYXMgYSAyLXR1cGxlDQogICAgICAgIGEsYV9lbmQgPSBtYWtlSFRNTFRhZ3MoIkEiKQ0KICAgICAgICBsaW5rX2V4cHIgPSBhICsgU2tpcFRvKGFfZW5kKSgibGlua190ZXh0IikgKyBhX2VuZA0KICAgICAgICANCiAgICAgICAgZm9yIGxpbmsgaW4gbGlua19leHByLnNlYXJjaFN0cmluZyh0ZXh0KToNCiAgICAgICAgICAgICMgYXR0cmlidXRlcyBpbiB0aGUgPEE+IHRhZyAobGlrZSAiaHJlZiIgc2hvd24gaGVyZSkgYXJlIGFsc28gYWNjZXNzaWJsZSBhcyBuYW1lZCByZXN1bHRzDQogICAgICAgICAgICBwcmludChsaW5rLmxpbmtfdGV4dCwgJy0+JywgbGluay5ocmVmKQ0KICAgIHByaW50czo6DQogICAgICAgIHB5cGFyc2luZyAtPiBodHRwOi8vcHlwYXJzaW5nLndpa2lzcGFjZXMuY29tDQogICAgIiIiDQogICAgcmV0dXJuIF9tYWtlVGFncyggdGFnU3RyLCBGYWxzZSApDQoNCmRlZiBtYWtlWE1MVGFncyh0YWdTdHIpOg0KICAgICIiIg0KICAgIEhlbHBlciB0byBjb25zdHJ1Y3Qgb3BlbmluZyBhbmQgY2xvc2luZyB0YWcgZXhwcmVzc2lvbnMgZm9yIFhNTCwgZ2l2ZW4gYSB0YWcgbmFtZS4gTWF0Y2hlcw0KICAgIHRhZ3Mgb25seSBpbiB0aGUgZ2l2ZW4gdXBwZXIvbG93ZXIgY2FzZS4NCg0KICAgIEV4YW1wbGU6IHNpbWlsYXIgdG8gTHttYWtlSFRNTFRhZ3N9DQogICAgIiIiDQogICAgcmV0dXJuIF9tYWtlVGFncyggdGFnU3RyLCBUcnVlICkNCg0KZGVmIHdpdGhBdHRyaWJ1dGUoKmFyZ3MsKiphdHRyRGljdCk6DQogICAgIiIiDQogICAgSGVscGVyIHRvIGNyZWF0ZSBhIHZhbGlkYXRpbmcgcGFyc2UgYWN0aW9uIHRvIGJlIHVzZWQgd2l0aCBzdGFydCB0YWdzIGNyZWF0ZWQNCiAgICB3aXRoIEN7THttYWtlWE1MVGFnc319IG9yIEN7THttYWtlSFRNTFRhZ3N9fS4gVXNlIEN7d2l0aEF0dHJpYnV0ZX0gdG8gcXVhbGlmeSBhIHN0YXJ0aW5nIHRhZw0KICAgIHdpdGggYSByZXF1aXJlZCBhdHRyaWJ1dGUgdmFsdWUsIHRvIGF2b2lkIGZhbHNlIG1hdGNoZXMgb24gY29tbW9uIHRhZ3Mgc3VjaCBhcw0KICAgIEN7PFREPn0gb3IgQ3s8RElWPn0uDQoNCiAgICBDYWxsIEN7d2l0aEF0dHJpYnV0ZX0gd2l0aCBhIHNlcmllcyBvZiBhdHRyaWJ1dGUgbmFtZXMgYW5kIHZhbHVlcy4gU3BlY2lmeSB0aGUgbGlzdA0KICAgIG9mIGZpbHRlciBhdHRyaWJ1dGVzIG5hbWVzIGFuZCB2YWx1ZXMgYXM6DQogICAgIC0ga2V5d29yZCBhcmd1bWVudHMsIGFzIGluIEN7KGFsaWduPSJyaWdodCIpfSwgb3INCiAgICAgLSBhcyBhbiBleHBsaWNpdCBkaWN0IHdpdGggQ3sqKn0gb3BlcmF0b3IsIHdoZW4gYW4gYXR0cmlidXRlIG5hbWUgaXMgYWxzbyBhIFB5dGhvbg0KICAgICAgICAgIHJlc2VydmVkIHdvcmQsIGFzIGluIEN7Kip7ImNsYXNzIjoiQ3VzdG9tZXIiLCAiYWxpZ24iOiJyaWdodCJ9fQ0KICAgICAtIGEgbGlzdCBvZiBuYW1lLXZhbHVlIHR1cGxlcywgYXMgaW4gKCAoIm5zMTpjbGFzcyIsICJDdXN0b21lciIpLCAoIm5zMjphbGlnbiIsInJpZ2h0IikgKQ0KICAgIEZvciBhdHRyaWJ1dGUgbmFtZXMgd2l0aCBhIG5hbWVzcGFjZSBwcmVmaXgsIHlvdSBtdXN0IHVzZSB0aGUgc2Vjb25kIGZvcm0uICBBdHRyaWJ1dGUNCiAgICBuYW1lcyBhcmUgbWF0Y2hlZCBpbnNlbnNpdGl2ZSB0byB1cHBlci9sb3dlciBjYXNlLg0KICAgICAgIA0KICAgIElmIGp1c3QgdGVzdGluZyBmb3IgQ3tjbGFzc30gKHdpdGggb3Igd2l0aG91dCBhIG5hbWVzcGFjZSksIHVzZSBDe0x7d2l0aENsYXNzfX0uDQoNCiAgICBUbyB2ZXJpZnkgdGhhdCB0aGUgYXR0cmlidXRlIGV4aXN0cywgYnV0IHdpdGhvdXQgc3BlY2lmeWluZyBhIHZhbHVlLCBwYXNzDQogICAgQ3t3aXRoQXR0cmlidXRlLkFOWV9WQUxVRX0gYXMgdGhlIHZhbHVlLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIGh0bWwgPSAnJycNCiAgICAgICAgICAgIDxkaXY+DQogICAgICAgICAgICBTb21lIHRleHQNCiAgICAgICAgICAgIDxkaXYgdHlwZT0iZ3JpZCI+MSA0IDAgMSAwPC9kaXY+DQogICAgICAgICAgICA8ZGl2IHR5cGU9ImdyYXBoIj4xLDMgMiwzIDEsMTwvZGl2Pg0KICAgICAgICAgICAgPGRpdj50aGlzIGhhcyBubyB0eXBlPC9kaXY+DQogICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICANCiAgICAgICAgJycnDQogICAgICAgIGRpdixkaXZfZW5kID0gbWFrZUhUTUxUYWdzKCJkaXYiKQ0KDQogICAgICAgICMgb25seSBtYXRjaCBkaXYgdGFnIGhhdmluZyBhIHR5cGUgYXR0cmlidXRlIHdpdGggdmFsdWUgImdyaWQiDQogICAgICAgIGRpdl9ncmlkID0gZGl2KCkuc2V0UGFyc2VBY3Rpb24od2l0aEF0dHJpYnV0ZSh0eXBlPSJncmlkIikpDQogICAgICAgIGdyaWRfZXhwciA9IGRpdl9ncmlkICsgU2tpcFRvKGRpdiB8IGRpdl9lbmQpKCJib2R5IikNCiAgICAgICAgZm9yIGdyaWRfaGVhZGVyIGluIGdyaWRfZXhwci5zZWFyY2hTdHJpbmcoaHRtbCk6DQogICAgICAgICAgICBwcmludChncmlkX2hlYWRlci5ib2R5KQ0KICAgICAgICANCiAgICAgICAgIyBjb25zdHJ1Y3QgYSBtYXRjaCB3aXRoIGFueSBkaXYgdGFnIGhhdmluZyBhIHR5cGUgYXR0cmlidXRlLCByZWdhcmRsZXNzIG9mIHRoZSB2YWx1ZQ0KICAgICAgICBkaXZfYW55X3R5cGUgPSBkaXYoKS5zZXRQYXJzZUFjdGlvbih3aXRoQXR0cmlidXRlKHR5cGU9d2l0aEF0dHJpYnV0ZS5BTllfVkFMVUUpKQ0KICAgICAgICBkaXZfZXhwciA9IGRpdl9hbnlfdHlwZSArIFNraXBUbyhkaXYgfCBkaXZfZW5kKSgiYm9keSIpDQogICAgICAgIGZvciBkaXZfaGVhZGVyIGluIGRpdl9leHByLnNlYXJjaFN0cmluZyhodG1sKToNCiAgICAgICAgICAgIHByaW50KGRpdl9oZWFkZXIuYm9keSkNCiAgICBwcmludHM6Og0KICAgICAgICAxIDQgMCAxIDANCg0KICAgICAgICAxIDQgMCAxIDANCiAgICAgICAgMSwzIDIsMyAxLDENCiAgICAiIiINCiAgICBpZiBhcmdzOg0KICAgICAgICBhdHRycyA9IGFyZ3NbOl0NCiAgICBlbHNlOg0KICAgICAgICBhdHRycyA9IGF0dHJEaWN0Lml0ZW1zKCkNCiAgICBhdHRycyA9IFsoayx2KSBmb3Igayx2IGluIGF0dHJzXQ0KICAgIGRlZiBwYShzLGwsdG9rZW5zKToNCiAgICAgICAgZm9yIGF0dHJOYW1lLGF0dHJWYWx1ZSBpbiBhdHRyczoNCiAgICAgICAgICAgIGlmIGF0dHJOYW1lIG5vdCBpbiB0b2tlbnM6DQogICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24ocyxsLCJubyBtYXRjaGluZyBhdHRyaWJ1dGUgIiArIGF0dHJOYW1lKQ0KICAgICAgICAgICAgaWYgYXR0clZhbHVlICE9IHdpdGhBdHRyaWJ1dGUuQU5ZX1ZBTFVFIGFuZCB0b2tlbnNbYXR0ck5hbWVdICE9IGF0dHJWYWx1ZToNCiAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihzLGwsImF0dHJpYnV0ZSAnJXMnIGhhcyB2YWx1ZSAnJXMnLCBtdXN0IGJlICclcyciICUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF0dHJOYW1lLCB0b2tlbnNbYXR0ck5hbWVdLCBhdHRyVmFsdWUpKQ0KICAgIHJldHVybiBwYQ0Kd2l0aEF0dHJpYnV0ZS5BTllfVkFMVUUgPSBvYmplY3QoKQ0KDQpkZWYgd2l0aENsYXNzKGNsYXNzbmFtZSwgbmFtZXNwYWNlPScnKToNCiAgICAiIiINCiAgICBTaW1wbGlmaWVkIHZlcnNpb24gb2YgQ3tMe3dpdGhBdHRyaWJ1dGV9fSB3aGVuIG1hdGNoaW5nIG9uIGEgZGl2IGNsYXNzIC0gbWFkZQ0KICAgIGRpZmZpY3VsdCBiZWNhdXNlIEN7Y2xhc3N9IGlzIGEgcmVzZXJ2ZWQgd29yZCBpbiBQeXRob24uDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgaHRtbCA9ICcnJw0KICAgICAgICAgICAgPGRpdj4NCiAgICAgICAgICAgIFNvbWUgdGV4dA0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZ3JpZCI+MSA0IDAgMSAwPC9kaXY+DQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJncmFwaCI+MSwzIDIsMyAxLDE8L2Rpdj4NCiAgICAgICAgICAgIDxkaXY+dGhpcyAmbHQ7ZGl2Jmd0OyBoYXMgbm8gY2xhc3M8L2Rpdj4NCiAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgIA0KICAgICAgICAnJycNCiAgICAgICAgZGl2LGRpdl9lbmQgPSBtYWtlSFRNTFRhZ3MoImRpdiIpDQogICAgICAgIGRpdl9ncmlkID0gZGl2KCkuc2V0UGFyc2VBY3Rpb24od2l0aENsYXNzKCJncmlkIikpDQogICAgICAgIA0KICAgICAgICBncmlkX2V4cHIgPSBkaXZfZ3JpZCArIFNraXBUbyhkaXYgfCBkaXZfZW5kKSgiYm9keSIpDQogICAgICAgIGZvciBncmlkX2hlYWRlciBpbiBncmlkX2V4cHIuc2VhcmNoU3RyaW5nKGh0bWwpOg0KICAgICAgICAgICAgcHJpbnQoZ3JpZF9oZWFkZXIuYm9keSkNCiAgICAgICAgDQogICAgICAgIGRpdl9hbnlfdHlwZSA9IGRpdigpLnNldFBhcnNlQWN0aW9uKHdpdGhDbGFzcyh3aXRoQXR0cmlidXRlLkFOWV9WQUxVRSkpDQogICAgICAgIGRpdl9leHByID0gZGl2X2FueV90eXBlICsgU2tpcFRvKGRpdiB8IGRpdl9lbmQpKCJib2R5IikNCiAgICAgICAgZm9yIGRpdl9oZWFkZXIgaW4gZGl2X2V4cHIuc2VhcmNoU3RyaW5nKGh0bWwpOg0KICAgICAgICAgICAgcHJpbnQoZGl2X2hlYWRlci5ib2R5KQ0KICAgIHByaW50czo6DQogICAgICAgIDEgNCAwIDEgMA0KDQogICAgICAgIDEgNCAwIDEgMA0KICAgICAgICAxLDMgMiwzIDEsMQ0KICAgICIiIg0KICAgIGNsYXNzYXR0ciA9ICIlczpjbGFzcyIgJSBuYW1lc3BhY2UgaWYgbmFtZXNwYWNlIGVsc2UgImNsYXNzIg0KICAgIHJldHVybiB3aXRoQXR0cmlidXRlKCoqe2NsYXNzYXR0ciA6IGNsYXNzbmFtZX0pICAgICAgICANCg0Kb3BBc3NvYyA9IF9Db25zdGFudHMoKQ0Kb3BBc3NvYy5MRUZUID0gb2JqZWN0KCkNCm9wQXNzb2MuUklHSFQgPSBvYmplY3QoKQ0KDQpkZWYgaW5maXhOb3RhdGlvbiggYmFzZUV4cHIsIG9wTGlzdCwgbHBhcj1TdXBwcmVzcygnKCcpLCBycGFyPVN1cHByZXNzKCcpJykgKToNCiAgICAiIiINCiAgICBIZWxwZXIgbWV0aG9kIGZvciBjb25zdHJ1Y3RpbmcgZ3JhbW1hcnMgb2YgZXhwcmVzc2lvbnMgbWFkZSB1cCBvZg0KICAgIG9wZXJhdG9ycyB3b3JraW5nIGluIGEgcHJlY2VkZW5jZSBoaWVyYXJjaHkuICBPcGVyYXRvcnMgbWF5IGJlIHVuYXJ5IG9yDQogICAgYmluYXJ5LCBsZWZ0LSBvciByaWdodC1hc3NvY2lhdGl2ZS4gIFBhcnNlIGFjdGlvbnMgY2FuIGFsc28gYmUgYXR0YWNoZWQNCiAgICB0byBvcGVyYXRvciBleHByZXNzaW9ucy4gVGhlIGdlbmVyYXRlZCBwYXJzZXIgd2lsbCBhbHNvIHJlY29nbml6ZSB0aGUgdXNlIA0KICAgIG9mIHBhcmVudGhlc2VzIHRvIG92ZXJyaWRlIG9wZXJhdG9yIHByZWNlZGVuY2VzIChzZWUgZXhhbXBsZSBiZWxvdykuDQogICAgDQogICAgTm90ZTogaWYgeW91IGRlZmluZSBhIGRlZXAgb3BlcmF0b3IgbGlzdCwgeW91IG1heSBzZWUgcGVyZm9ybWFuY2UgaXNzdWVzDQogICAgd2hlbiB1c2luZyBpbmZpeE5vdGF0aW9uLiBTZWUgTHtQYXJzZXJFbGVtZW50LmVuYWJsZVBhY2tyYXR9IGZvciBhDQogICAgbWVjaGFuaXNtIHRvIHBvdGVudGlhbGx5IGltcHJvdmUgeW91ciBwYXJzZXIgcGVyZm9ybWFuY2UuDQoNCiAgICBQYXJhbWV0ZXJzOg0KICAgICAtIGJhc2VFeHByIC0gZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgdGhlIG1vc3QgYmFzaWMgZWxlbWVudCBmb3IgdGhlIG5lc3RlZA0KICAgICAtIG9wTGlzdCAtIGxpc3Qgb2YgdHVwbGVzLCBvbmUgZm9yIGVhY2ggb3BlcmF0b3IgcHJlY2VkZW5jZSBsZXZlbCBpbiB0aGUNCiAgICAgIGV4cHJlc3Npb24gZ3JhbW1hcjsgZWFjaCB0dXBsZSBpcyBvZiB0aGUgZm9ybQ0KICAgICAgKG9wRXhwciwgbnVtVGVybXMsIHJpZ2h0TGVmdEFzc29jLCBwYXJzZUFjdGlvbiksIHdoZXJlOg0KICAgICAgIC0gb3BFeHByIGlzIHRoZSBweXBhcnNpbmcgZXhwcmVzc2lvbiBmb3IgdGhlIG9wZXJhdG9yOw0KICAgICAgICAgIG1heSBhbHNvIGJlIGEgc3RyaW5nLCB3aGljaCB3aWxsIGJlIGNvbnZlcnRlZCB0byBhIExpdGVyYWw7DQogICAgICAgICAgaWYgbnVtVGVybXMgaXMgMywgb3BFeHByIGlzIGEgdHVwbGUgb2YgdHdvIGV4cHJlc3Npb25zLCBmb3IgdGhlDQogICAgICAgICAgdHdvIG9wZXJhdG9ycyBzZXBhcmF0aW5nIHRoZSAzIHRlcm1zDQogICAgICAgLSBudW1UZXJtcyBpcyB0aGUgbnVtYmVyIG9mIHRlcm1zIGZvciB0aGlzIG9wZXJhdG9yIChtdXN0DQogICAgICAgICAgYmUgMSwgMiwgb3IgMykNCiAgICAgICAtIHJpZ2h0TGVmdEFzc29jIGlzIHRoZSBpbmRpY2F0b3Igd2hldGhlciB0aGUgb3BlcmF0b3IgaXMNCiAgICAgICAgICByaWdodCBvciBsZWZ0IGFzc29jaWF0aXZlLCB1c2luZyB0aGUgcHlwYXJzaW5nLWRlZmluZWQNCiAgICAgICAgICBjb25zdGFudHMgQ3tvcEFzc29jLlJJR0hUfSBhbmQgQ3tvcEFzc29jLkxFRlR9Lg0KICAgICAgIC0gcGFyc2VBY3Rpb24gaXMgdGhlIHBhcnNlIGFjdGlvbiB0byBiZSBhc3NvY2lhdGVkIHdpdGgNCiAgICAgICAgICBleHByZXNzaW9ucyBtYXRjaGluZyB0aGlzIG9wZXJhdG9yIGV4cHJlc3Npb24gKHRoZQ0KICAgICAgICAgIHBhcnNlIGFjdGlvbiB0dXBsZSBtZW1iZXIgbWF5IGJlIG9taXR0ZWQpOyBpZiB0aGUgcGFyc2UgYWN0aW9uDQogICAgICAgICAgaXMgcGFzc2VkIGEgdHVwbGUgb3IgbGlzdCBvZiBmdW5jdGlvbnMsIHRoaXMgaXMgZXF1aXZhbGVudCB0bw0KICAgICAgICAgIGNhbGxpbmcgQ3tzZXRQYXJzZUFjdGlvbigqZm4pfSAoTHtQYXJzZXJFbGVtZW50LnNldFBhcnNlQWN0aW9ufSkNCiAgICAgLSBscGFyIC0gZXhwcmVzc2lvbiBmb3IgbWF0Y2hpbmcgbGVmdC1wYXJlbnRoZXNlcyAoZGVmYXVsdD1De1N1cHByZXNzKCcoJyl9KQ0KICAgICAtIHJwYXIgLSBleHByZXNzaW9uIGZvciBtYXRjaGluZyByaWdodC1wYXJlbnRoZXNlcyAoZGVmYXVsdD1De1N1cHByZXNzKCcpJyl9KQ0KDQogICAgRXhhbXBsZTo6DQogICAgICAgICMgc2ltcGxlIGV4YW1wbGUgb2YgZm91ci1mdW5jdGlvbiBhcml0aG1ldGljIHdpdGggaW50cyBhbmQgdmFyaWFibGUgbmFtZXMNCiAgICAgICAgaW50ZWdlciA9IHB5cGFyc2luZ19jb21tb24uc2lnbmVkX2ludGVnZXINCiAgICAgICAgdmFybmFtZSA9IHB5cGFyc2luZ19jb21tb24uaWRlbnRpZmllciANCiAgICAgICAgDQogICAgICAgIGFyaXRoX2V4cHIgPSBpbmZpeE5vdGF0aW9uKGludGVnZXIgfCB2YXJuYW1lLA0KICAgICAgICAgICAgWw0KICAgICAgICAgICAgKCctJywgMSwgb3BBc3NvYy5SSUdIVCksDQogICAgICAgICAgICAob25lT2YoJyogLycpLCAyLCBvcEFzc29jLkxFRlQpLA0KICAgICAgICAgICAgKG9uZU9mKCcrIC0nKSwgMiwgb3BBc3NvYy5MRUZUKSwNCiAgICAgICAgICAgIF0pDQogICAgICAgIA0KICAgICAgICBhcml0aF9leHByLnJ1blRlc3RzKCcnJw0KICAgICAgICAgICAgNSszKjYNCiAgICAgICAgICAgICg1KzMpKjYNCiAgICAgICAgICAgIC0yLS0xMQ0KICAgICAgICAgICAgJycnLCBmdWxsRHVtcD1GYWxzZSkNCiAgICBwcmludHM6Og0KICAgICAgICA1KzMqNg0KICAgICAgICBbWzUsICcrJywgWzMsICcqJywgNl1dXQ0KDQogICAgICAgICg1KzMpKjYNCiAgICAgICAgW1tbNSwgJysnLCAzXSwgJyonLCA2XV0NCg0KICAgICAgICAtMi0tMTENCiAgICAgICAgW1tbJy0nLCAyXSwgJy0nLCBbJy0nLCAxMV1dXQ0KICAgICIiIg0KICAgIHJldCA9IEZvcndhcmQoKQ0KICAgIGxhc3RFeHByID0gYmFzZUV4cHIgfCAoIGxwYXIgKyByZXQgKyBycGFyICkNCiAgICBmb3IgaSxvcGVyRGVmIGluIGVudW1lcmF0ZShvcExpc3QpOg0KICAgICAgICBvcEV4cHIsYXJpdHkscmlnaHRMZWZ0QXNzb2MscGEgPSAob3BlckRlZiArIChOb25lLCkpWzo0XQ0KICAgICAgICB0ZXJtTmFtZSA9ICIlcyB0ZXJtIiAlIG9wRXhwciBpZiBhcml0eSA8IDMgZWxzZSAiJXMlcyB0ZXJtIiAlIG9wRXhwcg0KICAgICAgICBpZiBhcml0eSA9PSAzOg0KICAgICAgICAgICAgaWYgb3BFeHByIGlzIE5vbmUgb3IgbGVuKG9wRXhwcikgIT0gMjoNCiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJpZiBudW10ZXJtcz0zLCBvcEV4cHIgbXVzdCBiZSBhIHR1cGxlIG9yIGxpc3Qgb2YgdHdvIGV4cHJlc3Npb25zIikNCiAgICAgICAgICAgIG9wRXhwcjEsIG9wRXhwcjIgPSBvcEV4cHINCiAgICAgICAgdGhpc0V4cHIgPSBGb3J3YXJkKCkuc2V0TmFtZSh0ZXJtTmFtZSkNCiAgICAgICAgaWYgcmlnaHRMZWZ0QXNzb2MgPT0gb3BBc3NvYy5MRUZUOg0KICAgICAgICAgICAgaWYgYXJpdHkgPT0gMToNCiAgICAgICAgICAgICAgICBtYXRjaEV4cHIgPSBGb2xsb3dlZEJ5KGxhc3RFeHByICsgb3BFeHByKSArIEdyb3VwKCBsYXN0RXhwciArIE9uZU9yTW9yZSggb3BFeHByICkgKQ0KICAgICAgICAgICAgZWxpZiBhcml0eSA9PSAyOg0KICAgICAgICAgICAgICAgIGlmIG9wRXhwciBpcyBub3QgTm9uZToNCiAgICAgICAgICAgICAgICAgICAgbWF0Y2hFeHByID0gRm9sbG93ZWRCeShsYXN0RXhwciArIG9wRXhwciArIGxhc3RFeHByKSArIEdyb3VwKCBsYXN0RXhwciArIE9uZU9yTW9yZSggb3BFeHByICsgbGFzdEV4cHIgKSApDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgbWF0Y2hFeHByID0gRm9sbG93ZWRCeShsYXN0RXhwcitsYXN0RXhwcikgKyBHcm91cCggbGFzdEV4cHIgKyBPbmVPck1vcmUobGFzdEV4cHIpICkNCiAgICAgICAgICAgIGVsaWYgYXJpdHkgPT0gMzoNCiAgICAgICAgICAgICAgICBtYXRjaEV4cHIgPSBGb2xsb3dlZEJ5KGxhc3RFeHByICsgb3BFeHByMSArIGxhc3RFeHByICsgb3BFeHByMiArIGxhc3RFeHByKSArIFwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcm91cCggbGFzdEV4cHIgKyBvcEV4cHIxICsgbGFzdEV4cHIgKyBvcEV4cHIyICsgbGFzdEV4cHIgKQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJvcGVyYXRvciBtdXN0IGJlIHVuYXJ5ICgxKSwgYmluYXJ5ICgyKSwgb3IgdGVybmFyeSAoMykiKQ0KICAgICAgICBlbGlmIHJpZ2h0TGVmdEFzc29jID09IG9wQXNzb2MuUklHSFQ6DQogICAgICAgICAgICBpZiBhcml0eSA9PSAxOg0KICAgICAgICAgICAgICAgICMgdHJ5IHRvIGF2b2lkIExSIHdpdGggdGhpcyBleHRyYSB0ZXN0DQogICAgICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3BFeHByLCBPcHRpb25hbCk6DQogICAgICAgICAgICAgICAgICAgIG9wRXhwciA9IE9wdGlvbmFsKG9wRXhwcikNCiAgICAgICAgICAgICAgICBtYXRjaEV4cHIgPSBGb2xsb3dlZEJ5KG9wRXhwci5leHByICsgdGhpc0V4cHIpICsgR3JvdXAoIG9wRXhwciArIHRoaXNFeHByICkNCiAgICAgICAgICAgIGVsaWYgYXJpdHkgPT0gMjoNCiAgICAgICAgICAgICAgICBpZiBvcEV4cHIgaXMgbm90IE5vbmU6DQogICAgICAgICAgICAgICAgICAgIG1hdGNoRXhwciA9IEZvbGxvd2VkQnkobGFzdEV4cHIgKyBvcEV4cHIgKyB0aGlzRXhwcikgKyBHcm91cCggbGFzdEV4cHIgKyBPbmVPck1vcmUoIG9wRXhwciArIHRoaXNFeHByICkgKQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIG1hdGNoRXhwciA9IEZvbGxvd2VkQnkobGFzdEV4cHIgKyB0aGlzRXhwcikgKyBHcm91cCggbGFzdEV4cHIgKyBPbmVPck1vcmUoIHRoaXNFeHByICkgKQ0KICAgICAgICAgICAgZWxpZiBhcml0eSA9PSAzOg0KICAgICAgICAgICAgICAgIG1hdGNoRXhwciA9IEZvbGxvd2VkQnkobGFzdEV4cHIgKyBvcEV4cHIxICsgdGhpc0V4cHIgKyBvcEV4cHIyICsgdGhpc0V4cHIpICsgXA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyb3VwKCBsYXN0RXhwciArIG9wRXhwcjEgKyB0aGlzRXhwciArIG9wRXhwcjIgKyB0aGlzRXhwciApDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm9wZXJhdG9yIG11c3QgYmUgdW5hcnkgKDEpLCBiaW5hcnkgKDIpLCBvciB0ZXJuYXJ5ICgzKSIpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJvcGVyYXRvciBtdXN0IGluZGljYXRlIHJpZ2h0IG9yIGxlZnQgYXNzb2NpYXRpdml0eSIpDQogICAgICAgIGlmIHBhOg0KICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShwYSwgKHR1cGxlLCBsaXN0KSk6DQogICAgICAgICAgICAgICAgbWF0Y2hFeHByLnNldFBhcnNlQWN0aW9uKCpwYSkNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgbWF0Y2hFeHByLnNldFBhcnNlQWN0aW9uKHBhKQ0KICAgICAgICB0aGlzRXhwciA8PD0gKCBtYXRjaEV4cHIuc2V0TmFtZSh0ZXJtTmFtZSkgfCBsYXN0RXhwciApDQogICAgICAgIGxhc3RFeHByID0gdGhpc0V4cHINCiAgICByZXQgPDw9IGxhc3RFeHByDQogICAgcmV0dXJuIHJldA0KDQpvcGVyYXRvclByZWNlZGVuY2UgPSBpbmZpeE5vdGF0aW9uDQoiIiIoRGVwcmVjYXRlZCkgRm9ybWVyIG5hbWUgb2YgQ3tMe2luZml4Tm90YXRpb259fSwgd2lsbCBiZSBkcm9wcGVkIGluIGEgZnV0dXJlIHJlbGVhc2UuIiIiDQoNCmRibFF1b3RlZFN0cmluZyA9IENvbWJpbmUoUmVnZXgociciKD86W14iXG5cclxcXXwoPzoiIil8KD86XFwoPzpbXnhdfHhbMC05YS1mQS1GXSspKSkqJykrJyInKS5zZXROYW1lKCJzdHJpbmcgZW5jbG9zZWQgaW4gZG91YmxlIHF1b3RlcyIpDQpzZ2xRdW90ZWRTdHJpbmcgPSBDb21iaW5lKFJlZ2V4KHIiJyg/OlteJ1xuXHJcXF18KD86JycpfCg/OlxcKD86W154XXx4WzAtOWEtZkEtRl0rKSkpKiIpKyInIikuc2V0TmFtZSgic3RyaW5nIGVuY2xvc2VkIGluIHNpbmdsZSBxdW90ZXMiKQ0KcXVvdGVkU3RyaW5nID0gQ29tYmluZShSZWdleChyJyIoPzpbXiJcblxyXFxdfCg/OiIiKXwoPzpcXCg/OlteeF18eFswLTlhLWZBLUZdKykpKSonKSsnIid8DQogICAgICAgICAgICAgICAgICAgICAgIFJlZ2V4KHIiJyg/OlteJ1xuXHJcXF18KD86JycpfCg/OlxcKD86W154XXx4WzAtOWEtZkEtRl0rKSkpKiIpKyInIikuc2V0TmFtZSgicXVvdGVkU3RyaW5nIHVzaW5nIHNpbmdsZSBvciBkb3VibGUgcXVvdGVzIikNCnVuaWNvZGVTdHJpbmcgPSBDb21iaW5lKF9MKCd1JykgKyBxdW90ZWRTdHJpbmcuY29weSgpKS5zZXROYW1lKCJ1bmljb2RlIHN0cmluZyBsaXRlcmFsIikNCg0KZGVmIG5lc3RlZEV4cHIob3BlbmVyPSIoIiwgY2xvc2VyPSIpIiwgY29udGVudD1Ob25lLCBpZ25vcmVFeHByPXF1b3RlZFN0cmluZy5jb3B5KCkpOg0KICAgICIiIg0KICAgIEhlbHBlciBtZXRob2QgZm9yIGRlZmluaW5nIG5lc3RlZCBsaXN0cyBlbmNsb3NlZCBpbiBvcGVuaW5nIGFuZCBjbG9zaW5nDQogICAgZGVsaW1pdGVycyAoIigiIGFuZCAiKSIgYXJlIHRoZSBkZWZhdWx0KS4NCg0KICAgIFBhcmFtZXRlcnM6DQogICAgIC0gb3BlbmVyIC0gb3BlbmluZyBjaGFyYWN0ZXIgZm9yIGEgbmVzdGVkIGxpc3QgKGRlZmF1bHQ9Q3siKCJ9KTsgY2FuIGFsc28gYmUgYSBweXBhcnNpbmcgZXhwcmVzc2lvbg0KICAgICAtIGNsb3NlciAtIGNsb3NpbmcgY2hhcmFjdGVyIGZvciBhIG5lc3RlZCBsaXN0IChkZWZhdWx0PUN7IikifSk7IGNhbiBhbHNvIGJlIGEgcHlwYXJzaW5nIGV4cHJlc3Npb24NCiAgICAgLSBjb250ZW50IC0gZXhwcmVzc2lvbiBmb3IgaXRlbXMgd2l0aGluIHRoZSBuZXN0ZWQgbGlzdHMgKGRlZmF1bHQ9Q3tOb25lfSkNCiAgICAgLSBpZ25vcmVFeHByIC0gZXhwcmVzc2lvbiBmb3IgaWdub3Jpbmcgb3BlbmluZyBhbmQgY2xvc2luZyBkZWxpbWl0ZXJzIChkZWZhdWx0PUN7cXVvdGVkU3RyaW5nfSkNCg0KICAgIElmIGFuIGV4cHJlc3Npb24gaXMgbm90IHByb3ZpZGVkIGZvciB0aGUgY29udGVudCBhcmd1bWVudCwgdGhlIG5lc3RlZA0KICAgIGV4cHJlc3Npb24gd2lsbCBjYXB0dXJlIGFsbCB3aGl0ZXNwYWNlLWRlbGltaXRlZCBjb250ZW50IGJldHdlZW4gZGVsaW1pdGVycw0KICAgIGFzIGEgbGlzdCBvZiBzZXBhcmF0ZSB2YWx1ZXMuDQoNCiAgICBVc2UgdGhlIEN7aWdub3JlRXhwcn0gYXJndW1lbnQgdG8gZGVmaW5lIGV4cHJlc3Npb25zIHRoYXQgbWF5IGNvbnRhaW4NCiAgICBvcGVuaW5nIG9yIGNsb3NpbmcgY2hhcmFjdGVycyB0aGF0IHNob3VsZCBub3QgYmUgdHJlYXRlZCBhcyBvcGVuaW5nDQogICAgb3IgY2xvc2luZyBjaGFyYWN0ZXJzIGZvciBuZXN0aW5nLCBzdWNoIGFzIHF1b3RlZFN0cmluZyBvciBhIGNvbW1lbnQNCiAgICBleHByZXNzaW9uLiAgU3BlY2lmeSBtdWx0aXBsZSBleHByZXNzaW9ucyB1c2luZyBhbiBDe0x7T3J9fSBvciBDe0x7TWF0Y2hGaXJzdH19Lg0KICAgIFRoZSBkZWZhdWx0IGlzIEx7cXVvdGVkU3RyaW5nfSwgYnV0IGlmIG5vIGV4cHJlc3Npb25zIGFyZSB0byBiZSBpZ25vcmVkLA0KICAgIHRoZW4gcGFzcyBDe05vbmV9IGZvciB0aGlzIGFyZ3VtZW50Lg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIGRhdGFfdHlwZSA9IG9uZU9mKCJ2b2lkIGludCBzaG9ydCBsb25nIGNoYXIgZmxvYXQgZG91YmxlIikNCiAgICAgICAgZGVjbF9kYXRhX3R5cGUgPSBDb21iaW5lKGRhdGFfdHlwZSArIE9wdGlvbmFsKFdvcmQoJyonKSkpDQogICAgICAgIGlkZW50ID0gV29yZChhbHBoYXMrJ18nLCBhbHBoYW51bXMrJ18nKQ0KICAgICAgICBudW1iZXIgPSBweXBhcnNpbmdfY29tbW9uLm51bWJlcg0KICAgICAgICBhcmcgPSBHcm91cChkZWNsX2RhdGFfdHlwZSArIGlkZW50KQ0KICAgICAgICBMUEFSLFJQQVIgPSBtYXAoU3VwcHJlc3MsICIoKSIpDQoNCiAgICAgICAgY29kZV9ib2R5ID0gbmVzdGVkRXhwcigneycsICd9JywgaWdub3JlRXhwcj0ocXVvdGVkU3RyaW5nIHwgY1N0eWxlQ29tbWVudCkpDQoNCiAgICAgICAgY19mdW5jdGlvbiA9IChkZWNsX2RhdGFfdHlwZSgidHlwZSIpIA0KICAgICAgICAgICAgICAgICAgICAgICsgaWRlbnQoIm5hbWUiKQ0KICAgICAgICAgICAgICAgICAgICAgICsgTFBBUiArIE9wdGlvbmFsKGRlbGltaXRlZExpc3QoYXJnKSwgW10pKCJhcmdzIikgKyBSUEFSIA0KICAgICAgICAgICAgICAgICAgICAgICsgY29kZV9ib2R5KCJib2R5IikpDQogICAgICAgIGNfZnVuY3Rpb24uaWdub3JlKGNTdHlsZUNvbW1lbnQpDQogICAgICAgIA0KICAgICAgICBzb3VyY2VfY29kZSA9ICcnJw0KICAgICAgICAgICAgaW50IGlzX29kZChpbnQgeCkgeyANCiAgICAgICAgICAgICAgICByZXR1cm4gKHglMik7IA0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgaW50IGRlY190b19oZXgoY2hhciBoY2hhcikgeyANCiAgICAgICAgICAgICAgICBpZiAoaGNoYXIgPj0gJzAnICYmIGhjaGFyIDw9ICc5JykgeyANCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChvcmQoaGNoYXIpLW9yZCgnMCcpKTsgDQogICAgICAgICAgICAgICAgfSBlbHNlIHsgDQogICAgICAgICAgICAgICAgICAgIHJldHVybiAoMTArb3JkKGhjaGFyKS1vcmQoJ0EnKSk7DQogICAgICAgICAgICAgICAgfSANCiAgICAgICAgICAgIH0NCiAgICAgICAgJycnDQogICAgICAgIGZvciBmdW5jIGluIGNfZnVuY3Rpb24uc2VhcmNoU3RyaW5nKHNvdXJjZV9jb2RlKToNCiAgICAgICAgICAgIHByaW50KCIlKG5hbWUpcyAoJSh0eXBlKXMpIGFyZ3M6ICUoYXJncylzIiAlIGZ1bmMpDQoNCiAgICBwcmludHM6Og0KICAgICAgICBpc19vZGQgKGludCkgYXJnczogW1snaW50JywgJ3gnXV0NCiAgICAgICAgZGVjX3RvX2hleCAoaW50KSBhcmdzOiBbWydjaGFyJywgJ2hjaGFyJ11dDQogICAgIiIiDQogICAgaWYgb3BlbmVyID09IGNsb3NlcjoNCiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigib3BlbmluZyBhbmQgY2xvc2luZyBzdHJpbmdzIGNhbm5vdCBiZSB0aGUgc2FtZSIpDQogICAgaWYgY29udGVudCBpcyBOb25lOg0KICAgICAgICBpZiBpc2luc3RhbmNlKG9wZW5lcixiYXNlc3RyaW5nKSBhbmQgaXNpbnN0YW5jZShjbG9zZXIsYmFzZXN0cmluZyk6DQogICAgICAgICAgICBpZiBsZW4ob3BlbmVyKSA9PSAxIGFuZCBsZW4oY2xvc2VyKT09MToNCiAgICAgICAgICAgICAgICBpZiBpZ25vcmVFeHByIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gKENvbWJpbmUoT25lT3JNb3JlKH5pZ25vcmVFeHByICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJzTm90SW4ob3BlbmVyK2Nsb3NlcitQYXJzZXJFbGVtZW50LkRFRkFVTFRfV0hJVEVfQ0hBUlMsZXhhY3Q9MSkpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHQ6dFswXS5zdHJpcCgpKSkNCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gKGVtcHR5LmNvcHkoKStDaGFyc05vdEluKG9wZW5lcitjbG9zZXIrUGFyc2VyRWxlbWVudC5ERUZBVUxUX1dISVRFX0NIQVJTDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHQ6dFswXS5zdHJpcCgpKSkNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgaWYgaWdub3JlRXhwciBpcyBub3QgTm9uZToNCiAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IChDb21iaW5lKE9uZU9yTW9yZSh+aWdub3JlRXhwciArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfkxpdGVyYWwob3BlbmVyKSArIH5MaXRlcmFsKGNsb3NlcikgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnNOb3RJbihQYXJzZXJFbGVtZW50LkRFRkFVTFRfV0hJVEVfQ0hBUlMsZXhhY3Q9MSkpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHQ6dFswXS5zdHJpcCgpKSkNCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gKENvbWJpbmUoT25lT3JNb3JlKH5MaXRlcmFsKG9wZW5lcikgKyB+TGl0ZXJhbChjbG9zZXIpICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJzTm90SW4oUGFyc2VyRWxlbWVudC5ERUZBVUxUX1dISVRFX0NIQVJTLGV4YWN0PTEpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0OnRbMF0uc3RyaXAoKSkpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJvcGVuaW5nIGFuZCBjbG9zaW5nIGFyZ3VtZW50cyBtdXN0IGJlIHN0cmluZ3MgaWYgbm8gY29udGVudCBleHByZXNzaW9uIGlzIGdpdmVuIikNCiAgICByZXQgPSBGb3J3YXJkKCkNCiAgICBpZiBpZ25vcmVFeHByIGlzIG5vdCBOb25lOg0KICAgICAgICByZXQgPDw9IEdyb3VwKCBTdXBwcmVzcyhvcGVuZXIpICsgWmVyb09yTW9yZSggaWdub3JlRXhwciB8IHJldCB8IGNvbnRlbnQgKSArIFN1cHByZXNzKGNsb3NlcikgKQ0KICAgIGVsc2U6DQogICAgICAgIHJldCA8PD0gR3JvdXAoIFN1cHByZXNzKG9wZW5lcikgKyBaZXJvT3JNb3JlKCByZXQgfCBjb250ZW50ICkgICsgU3VwcHJlc3MoY2xvc2VyKSApDQogICAgcmV0LnNldE5hbWUoJ25lc3RlZCAlcyVzIGV4cHJlc3Npb24nICUgKG9wZW5lcixjbG9zZXIpKQ0KICAgIHJldHVybiByZXQNCg0KZGVmIGluZGVudGVkQmxvY2soYmxvY2tTdGF0ZW1lbnRFeHByLCBpbmRlbnRTdGFjaywgaW5kZW50PVRydWUpOg0KICAgICIiIg0KICAgIEhlbHBlciBtZXRob2QgZm9yIGRlZmluaW5nIHNwYWNlLWRlbGltaXRlZCBpbmRlbnRhdGlvbiBibG9ja3MsIHN1Y2ggYXMNCiAgICB0aG9zZSB1c2VkIHRvIGRlZmluZSBibG9jayBzdGF0ZW1lbnRzIGluIFB5dGhvbiBzb3VyY2UgY29kZS4NCg0KICAgIFBhcmFtZXRlcnM6DQogICAgIC0gYmxvY2tTdGF0ZW1lbnRFeHByIC0gZXhwcmVzc2lvbiBkZWZpbmluZyBzeW50YXggb2Ygc3RhdGVtZW50IHRoYXQNCiAgICAgICAgICAgIGlzIHJlcGVhdGVkIHdpdGhpbiB0aGUgaW5kZW50ZWQgYmxvY2sNCiAgICAgLSBpbmRlbnRTdGFjayAtIGxpc3QgY3JlYXRlZCBieSBjYWxsZXIgdG8gbWFuYWdlIGluZGVudGF0aW9uIHN0YWNrDQogICAgICAgICAgICAobXVsdGlwbGUgc3RhdGVtZW50V2l0aEluZGVudGVkQmxvY2sgZXhwcmVzc2lvbnMgd2l0aGluIGEgc2luZ2xlIGdyYW1tYXINCiAgICAgICAgICAgIHNob3VsZCBzaGFyZSBhIGNvbW1vbiBpbmRlbnRTdGFjaykNCiAgICAgLSBpbmRlbnQgLSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBibG9jayBtdXN0IGJlIGluZGVudGVkIGJleW9uZCB0aGUNCiAgICAgICAgICAgIHRoZSBjdXJyZW50IGxldmVsOyBzZXQgdG8gRmFsc2UgZm9yIGJsb2NrIG9mIGxlZnQtbW9zdCBzdGF0ZW1lbnRzDQogICAgICAgICAgICAoZGVmYXVsdD1De1RydWV9KQ0KDQogICAgQSB2YWxpZCBibG9jayBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIEN7YmxvY2tTdGF0ZW1lbnR9Lg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIGRhdGEgPSAnJycNCiAgICAgICAgZGVmIEEoeik6DQogICAgICAgICAgQTENCiAgICAgICAgICBCID0gMTAwDQogICAgICAgICAgRyA9IEEyDQogICAgICAgICAgQTINCiAgICAgICAgICBBMw0KICAgICAgICBCDQogICAgICAgIGRlZiBCQihhLGIsYyk6DQogICAgICAgICAgQkIxDQogICAgICAgICAgZGVmIEJCQSgpOg0KICAgICAgICAgICAgYmJhMQ0KICAgICAgICAgICAgYmJhMg0KICAgICAgICAgICAgYmJhMw0KICAgICAgICBDDQogICAgICAgIEQNCiAgICAgICAgZGVmIHNwYW0oeCx5KToNCiAgICAgICAgICAgICBkZWYgZWdncyh6KToNCiAgICAgICAgICAgICAgICAgcGFzcw0KICAgICAgICAnJycNCg0KDQogICAgICAgIGluZGVudFN0YWNrID0gWzFdDQogICAgICAgIHN0bXQgPSBGb3J3YXJkKCkNCg0KICAgICAgICBpZGVudGlmaWVyID0gV29yZChhbHBoYXMsIGFscGhhbnVtcykNCiAgICAgICAgZnVuY0RlY2wgPSAoImRlZiIgKyBpZGVudGlmaWVyICsgR3JvdXAoICIoIiArIE9wdGlvbmFsKCBkZWxpbWl0ZWRMaXN0KGlkZW50aWZpZXIpICkgKyAiKSIgKSArICI6IikNCiAgICAgICAgZnVuY19ib2R5ID0gaW5kZW50ZWRCbG9jayhzdG10LCBpbmRlbnRTdGFjaykNCiAgICAgICAgZnVuY0RlZiA9IEdyb3VwKCBmdW5jRGVjbCArIGZ1bmNfYm9keSApDQoNCiAgICAgICAgcnZhbHVlID0gRm9yd2FyZCgpDQogICAgICAgIGZ1bmNDYWxsID0gR3JvdXAoaWRlbnRpZmllciArICIoIiArIE9wdGlvbmFsKGRlbGltaXRlZExpc3QocnZhbHVlKSkgKyAiKSIpDQogICAgICAgIHJ2YWx1ZSA8PCAoZnVuY0NhbGwgfCBpZGVudGlmaWVyIHwgV29yZChudW1zKSkNCiAgICAgICAgYXNzaWdubWVudCA9IEdyb3VwKGlkZW50aWZpZXIgKyAiPSIgKyBydmFsdWUpDQogICAgICAgIHN0bXQgPDwgKCBmdW5jRGVmIHwgYXNzaWdubWVudCB8IGlkZW50aWZpZXIgKQ0KDQogICAgICAgIG1vZHVsZV9ib2R5ID0gT25lT3JNb3JlKHN0bXQpDQoNCiAgICAgICAgcGFyc2VUcmVlID0gbW9kdWxlX2JvZHkucGFyc2VTdHJpbmcoZGF0YSkNCiAgICAgICAgcGFyc2VUcmVlLnBwcmludCgpDQogICAgcHJpbnRzOjoNCiAgICAgICAgW1snZGVmJywNCiAgICAgICAgICAnQScsDQogICAgICAgICAgWycoJywgJ3onLCAnKSddLA0KICAgICAgICAgICc6JywNCiAgICAgICAgICBbWydBMSddLCBbWydCJywgJz0nLCAnMTAwJ11dLCBbWydHJywgJz0nLCAnQTInXV0sIFsnQTInXSwgWydBMyddXV0sDQogICAgICAgICAnQicsDQogICAgICAgICBbJ2RlZicsDQogICAgICAgICAgJ0JCJywNCiAgICAgICAgICBbJygnLCAnYScsICdiJywgJ2MnLCAnKSddLA0KICAgICAgICAgICc6JywNCiAgICAgICAgICBbWydCQjEnXSwgW1snZGVmJywgJ0JCQScsIFsnKCcsICcpJ10sICc6JywgW1snYmJhMSddLCBbJ2JiYTInXSwgWydiYmEzJ11dXV1dXSwNCiAgICAgICAgICdDJywNCiAgICAgICAgICdEJywNCiAgICAgICAgIFsnZGVmJywNCiAgICAgICAgICAnc3BhbScsDQogICAgICAgICAgWycoJywgJ3gnLCAneScsICcpJ10sDQogICAgICAgICAgJzonLA0KICAgICAgICAgIFtbWydkZWYnLCAnZWdncycsIFsnKCcsICd6JywgJyknXSwgJzonLCBbWydwYXNzJ11dXV1dXV0gDQogICAgIiIiDQogICAgZGVmIGNoZWNrUGVlckluZGVudChzLGwsdCk6DQogICAgICAgIGlmIGwgPj0gbGVuKHMpOiByZXR1cm4NCiAgICAgICAgY3VyQ29sID0gY29sKGwscykNCiAgICAgICAgaWYgY3VyQ29sICE9IGluZGVudFN0YWNrWy0xXToNCiAgICAgICAgICAgIGlmIGN1ckNvbCA+IGluZGVudFN0YWNrWy0xXToNCiAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUZhdGFsRXhjZXB0aW9uKHMsbCwiaWxsZWdhbCBuZXN0aW5nIikNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKHMsbCwibm90IGEgcGVlciBlbnRyeSIpDQoNCiAgICBkZWYgY2hlY2tTdWJJbmRlbnQocyxsLHQpOg0KICAgICAgICBjdXJDb2wgPSBjb2wobCxzKQ0KICAgICAgICBpZiBjdXJDb2wgPiBpbmRlbnRTdGFja1stMV06DQogICAgICAgICAgICBpbmRlbnRTdGFjay5hcHBlbmQoIGN1ckNvbCApDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihzLGwsIm5vdCBhIHN1YmVudHJ5IikNCg0KICAgIGRlZiBjaGVja1VuaW5kZW50KHMsbCx0KToNCiAgICAgICAgaWYgbCA+PSBsZW4ocyk6IHJldHVybg0KICAgICAgICBjdXJDb2wgPSBjb2wobCxzKQ0KICAgICAgICBpZiBub3QoaW5kZW50U3RhY2sgYW5kIGN1ckNvbCA8IGluZGVudFN0YWNrWy0xXSBhbmQgY3VyQ29sIDw9IGluZGVudFN0YWNrWy0yXSk6DQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihzLGwsIm5vdCBhbiB1bmluZGVudCIpDQogICAgICAgIGluZGVudFN0YWNrLnBvcCgpDQoNCiAgICBOTCA9IE9uZU9yTW9yZShMaW5lRW5kKCkuc2V0V2hpdGVzcGFjZUNoYXJzKCJcdCAiKS5zdXBwcmVzcygpKQ0KICAgIElOREVOVCA9IChFbXB0eSgpICsgRW1wdHkoKS5zZXRQYXJzZUFjdGlvbihjaGVja1N1YkluZGVudCkpLnNldE5hbWUoJ0lOREVOVCcpDQogICAgUEVFUiAgID0gRW1wdHkoKS5zZXRQYXJzZUFjdGlvbihjaGVja1BlZXJJbmRlbnQpLnNldE5hbWUoJycpDQogICAgVU5ERU5UID0gRW1wdHkoKS5zZXRQYXJzZUFjdGlvbihjaGVja1VuaW5kZW50KS5zZXROYW1lKCdVTklOREVOVCcpDQogICAgaWYgaW5kZW50Og0KICAgICAgICBzbUV4cHIgPSBHcm91cCggT3B0aW9uYWwoTkwpICsNCiAgICAgICAgICAgICN+IEZvbGxvd2VkQnkoYmxvY2tTdGF0ZW1lbnRFeHByKSArDQogICAgICAgICAgICBJTkRFTlQgKyAoT25lT3JNb3JlKCBQRUVSICsgR3JvdXAoYmxvY2tTdGF0ZW1lbnRFeHByKSArIE9wdGlvbmFsKE5MKSApKSArIFVOREVOVCkNCiAgICBlbHNlOg0KICAgICAgICBzbUV4cHIgPSBHcm91cCggT3B0aW9uYWwoTkwpICsNCiAgICAgICAgICAgIChPbmVPck1vcmUoIFBFRVIgKyBHcm91cChibG9ja1N0YXRlbWVudEV4cHIpICsgT3B0aW9uYWwoTkwpICkpICkNCiAgICBibG9ja1N0YXRlbWVudEV4cHIuaWdub3JlKF9ic2xhc2ggKyBMaW5lRW5kKCkpDQogICAgcmV0dXJuIHNtRXhwci5zZXROYW1lKCdpbmRlbnRlZCBibG9jaycpDQoNCmFscGhhczhiaXQgPSBzcmFuZ2UociJbXDB4YzAtXDB4ZDZcMHhkOC1cMHhmNlwweGY4LVwweGZmXSIpDQpwdW5jOGJpdCA9IHNyYW5nZShyIltcMHhhMS1cMHhiZlwweGQ3XDB4ZjddIikNCg0KYW55T3BlblRhZyxhbnlDbG9zZVRhZyA9IG1ha2VIVE1MVGFncyhXb3JkKGFscGhhcyxhbHBoYW51bXMrIl86Iikuc2V0TmFtZSgnYW55IHRhZycpKQ0KX2h0bWxFbnRpdHlNYXAgPSBkaWN0KHppcCgiZ3QgbHQgYW1wIG5ic3AgcXVvdCBhcG9zIi5zcGxpdCgpLCc+PCYgIlwnJykpDQpjb21tb25IVE1MRW50aXR5ID0gUmVnZXgoJyYoP1A8ZW50aXR5PicgKyAnfCcuam9pbihfaHRtbEVudGl0eU1hcC5rZXlzKCkpICsiKTsiKS5zZXROYW1lKCJjb21tb24gSFRNTCBlbnRpdHkiKQ0KZGVmIHJlcGxhY2VIVE1MRW50aXR5KHQpOg0KICAgICIiIkhlbHBlciBwYXJzZXIgYWN0aW9uIHRvIHJlcGxhY2UgY29tbW9uIEhUTUwgZW50aXRpZXMgd2l0aCB0aGVpciBzcGVjaWFsIGNoYXJhY3RlcnMiIiINCiAgICByZXR1cm4gX2h0bWxFbnRpdHlNYXAuZ2V0KHQuZW50aXR5KQ0KDQojIGl0J3MgZWFzeSB0byBnZXQgdGhlc2UgY29tbWVudCBzdHJ1Y3R1cmVzIHdyb25nIC0gdGhleSdyZSB2ZXJ5IGNvbW1vbiwgc28gbWF5IGFzIHdlbGwgbWFrZSB0aGVtIGF2YWlsYWJsZQ0KY1N0eWxlQ29tbWVudCA9IENvbWJpbmUoUmVnZXgociIvXCooPzpbXipdfFwqKD8hLykpKiIpICsgJyovJykuc2V0TmFtZSgiQyBzdHlsZSBjb21tZW50IikNCiJDb21tZW50IG9mIHRoZSBmb3JtIEN7LyogLi4uICovfSINCg0KaHRtbENvbW1lbnQgPSBSZWdleChyIjwhLS1bXHNcU10qPy0tPiIpLnNldE5hbWUoIkhUTUwgY29tbWVudCIpDQoiQ29tbWVudCBvZiB0aGUgZm9ybSBDezwhLS0gLi4uIC0tPn0iDQoNCnJlc3RPZkxpbmUgPSBSZWdleChyIi4qIikubGVhdmVXaGl0ZXNwYWNlKCkuc2V0TmFtZSgicmVzdCBvZiBsaW5lIikNCmRibFNsYXNoQ29tbWVudCA9IFJlZ2V4KHIiLy8oPzpcXFxufFteXG5dKSoiKS5zZXROYW1lKCIvLyBjb21tZW50IikNCiJDb21tZW50IG9mIHRoZSBmb3JtIEN7Ly8gLi4uICh0byBlbmQgb2YgbGluZSl9Ig0KDQpjcHBTdHlsZUNvbW1lbnQgPSBDb21iaW5lKFJlZ2V4KHIiL1wqKD86W14qXXxcKig/IS8pKSoiKSArICcqLyd8IGRibFNsYXNoQ29tbWVudCkuc2V0TmFtZSgiQysrIHN0eWxlIGNvbW1lbnQiKQ0KIkNvbW1lbnQgb2YgZWl0aGVyIGZvcm0gQ3tMe2NTdHlsZUNvbW1lbnR9fSBvciBDe0x7ZGJsU2xhc2hDb21tZW50fX0iDQoNCmphdmFTdHlsZUNvbW1lbnQgPSBjcHBTdHlsZUNvbW1lbnQNCiJTYW1lIGFzIEN7THtjcHBTdHlsZUNvbW1lbnR9fSINCg0KcHl0aG9uU3R5bGVDb21tZW50ID0gUmVnZXgociIjLioiKS5zZXROYW1lKCJQeXRob24gc3R5bGUgY29tbWVudCIpDQoiQ29tbWVudCBvZiB0aGUgZm9ybSBDeyMgLi4uICh0byBlbmQgb2YgbGluZSl9Ig0KDQpfY29tbWFzZXBpdGVtID0gQ29tYmluZShPbmVPck1vcmUoV29yZChwcmludGFibGVzLCBleGNsdWRlQ2hhcnM9JywnKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWwoIFdvcmQoIiBcdCIpICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfkxpdGVyYWwoIiwiKSArIH5MaW5lRW5kKCkgKSApICkuc3RyZWFtbGluZSgpLnNldE5hbWUoImNvbW1hSXRlbSIpDQpjb21tYVNlcGFyYXRlZExpc3QgPSBkZWxpbWl0ZWRMaXN0KCBPcHRpb25hbCggcXVvdGVkU3RyaW5nLmNvcHkoKSB8IF9jb21tYXNlcGl0ZW0sIGRlZmF1bHQ9IiIpICkuc2V0TmFtZSgiY29tbWFTZXBhcmF0ZWRMaXN0IikNCiIiIihEZXByZWNhdGVkKSBQcmVkZWZpbmVkIGV4cHJlc3Npb24gb2YgMSBvciBtb3JlIHByaW50YWJsZSB3b3JkcyBvciBxdW90ZWQgc3RyaW5ncywgc2VwYXJhdGVkIGJ5IGNvbW1hcy4NCiAgIFRoaXMgZXhwcmVzc2lvbiBpcyBkZXByZWNhdGVkIGluIGZhdm9yIG9mIEx7cHlwYXJzaW5nX2NvbW1vbi5jb21tYV9zZXBhcmF0ZWRfbGlzdH0uIiIiDQoNCiMgc29tZSBvdGhlciB1c2VmdWwgZXhwcmVzc2lvbnMgLSB1c2luZyBsb3dlci1jYXNlIGNsYXNzIG5hbWUgc2luY2Ugd2UgYXJlIHJlYWxseSB1c2luZyB0aGlzIGFzIGEgbmFtZXNwYWNlDQpjbGFzcyBweXBhcnNpbmdfY29tbW9uOg0KICAgICIiIg0KICAgIEhlcmUgYXJlIHNvbWUgY29tbW9uIGxvdy1sZXZlbCBleHByZXNzaW9ucyB0aGF0IG1heSBiZSB1c2VmdWwgaW4ganVtcC1zdGFydGluZyBwYXJzZXIgZGV2ZWxvcG1lbnQ6DQogICAgIC0gbnVtZXJpYyBmb3JtcyAoTHtpbnRlZ2VyczxpbnRlZ2VyPn0sIEx7cmVhbHM8cmVhbD59LCBMe3NjaWVudGlmaWMgbm90YXRpb248c2NpX3JlYWw+fSkNCiAgICAgLSBjb21tb24gTHtwcm9ncmFtbWluZyBpZGVudGlmaWVyczxpZGVudGlmaWVyPn0NCiAgICAgLSBuZXR3b3JrIGFkZHJlc3NlcyAoTHtNQUM8bWFjX2FkZHJlc3M+fSwgTHtJUHY0PGlwdjRfYWRkcmVzcz59LCBMe0lQdjY8aXB2Nl9hZGRyZXNzPn0pDQogICAgIC0gSVNPODYwMSBMe2RhdGVzPGlzbzg2MDFfZGF0ZT59IGFuZCBMe2RhdGV0aW1lPGlzbzg2MDFfZGF0ZXRpbWU+fQ0KICAgICAtIEx7VVVJRDx1dWlkPn0NCiAgICAgLSBMe2NvbW1hLXNlcGFyYXRlZCBsaXN0PGNvbW1hX3NlcGFyYXRlZF9saXN0Pn0NCiAgICBQYXJzZSBhY3Rpb25zOg0KICAgICAtIEN7THtjb252ZXJ0VG9JbnRlZ2VyfX0NCiAgICAgLSBDe0x7Y29udmVydFRvRmxvYXR9fQ0KICAgICAtIEN7THtjb252ZXJ0VG9EYXRlfX0NCiAgICAgLSBDe0x7Y29udmVydFRvRGF0ZXRpbWV9fQ0KICAgICAtIEN7THtzdHJpcEhUTUxUYWdzfX0NCiAgICAgLSBDe0x7dXBjYXNlVG9rZW5zfX0NCiAgICAgLSBDe0x7ZG93bmNhc2VUb2tlbnN9fQ0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIHB5cGFyc2luZ19jb21tb24ubnVtYmVyLnJ1blRlc3RzKCcnJw0KICAgICAgICAgICAgIyBhbnkgaW50IG9yIHJlYWwgbnVtYmVyLCByZXR1cm5lZCBhcyB0aGUgYXBwcm9wcmlhdGUgdHlwZQ0KICAgICAgICAgICAgMTAwDQogICAgICAgICAgICAtMTAwDQogICAgICAgICAgICArMTAwDQogICAgICAgICAgICAzLjE0MTU5DQogICAgICAgICAgICA2LjAyZTIzDQogICAgICAgICAgICAxZS0xMg0KICAgICAgICAgICAgJycnKQ0KDQogICAgICAgIHB5cGFyc2luZ19jb21tb24uZm51bWJlci5ydW5UZXN0cygnJycNCiAgICAgICAgICAgICMgYW55IGludCBvciByZWFsIG51bWJlciwgcmV0dXJuZWQgYXMgZmxvYXQNCiAgICAgICAgICAgIDEwMA0KICAgICAgICAgICAgLTEwMA0KICAgICAgICAgICAgKzEwMA0KICAgICAgICAgICAgMy4xNDE1OQ0KICAgICAgICAgICAgNi4wMmUyMw0KICAgICAgICAgICAgMWUtMTINCiAgICAgICAgICAgICcnJykNCg0KICAgICAgICBweXBhcnNpbmdfY29tbW9uLmhleF9pbnRlZ2VyLnJ1blRlc3RzKCcnJw0KICAgICAgICAgICAgIyBoZXggbnVtYmVycw0KICAgICAgICAgICAgMTAwDQogICAgICAgICAgICBGRg0KICAgICAgICAgICAgJycnKQ0KDQogICAgICAgIHB5cGFyc2luZ19jb21tb24uZnJhY3Rpb24ucnVuVGVzdHMoJycnDQogICAgICAgICAgICAjIGZyYWN0aW9ucw0KICAgICAgICAgICAgMS8yDQogICAgICAgICAgICAtMy80DQogICAgICAgICAgICAnJycpDQoNCiAgICAgICAgcHlwYXJzaW5nX2NvbW1vbi5taXhlZF9pbnRlZ2VyLnJ1blRlc3RzKCcnJw0KICAgICAgICAgICAgIyBtaXhlZCBmcmFjdGlvbnMNCiAgICAgICAgICAgIDENCiAgICAgICAgICAgIDEvMg0KICAgICAgICAgICAgLTMvNA0KICAgICAgICAgICAgMS0zLzQNCiAgICAgICAgICAgICcnJykNCg0KICAgICAgICBpbXBvcnQgdXVpZA0KICAgICAgICBweXBhcnNpbmdfY29tbW9uLnV1aWQuc2V0UGFyc2VBY3Rpb24odG9rZW5NYXAodXVpZC5VVUlEKSkNCiAgICAgICAgcHlwYXJzaW5nX2NvbW1vbi51dWlkLnJ1blRlc3RzKCcnJw0KICAgICAgICAgICAgIyB1dWlkDQogICAgICAgICAgICAxMjM0NTY3OC0xMjM0LTU2NzgtMTIzNC01Njc4MTIzNDU2NzgNCiAgICAgICAgICAgICcnJykNCiAgICBwcmludHM6Og0KICAgICAgICAjIGFueSBpbnQgb3IgcmVhbCBudW1iZXIsIHJldHVybmVkIGFzIHRoZSBhcHByb3ByaWF0ZSB0eXBlDQogICAgICAgIDEwMA0KICAgICAgICBbMTAwXQ0KDQogICAgICAgIC0xMDANCiAgICAgICAgWy0xMDBdDQoNCiAgICAgICAgKzEwMA0KICAgICAgICBbMTAwXQ0KDQogICAgICAgIDMuMTQxNTkNCiAgICAgICAgWzMuMTQxNTldDQoNCiAgICAgICAgNi4wMmUyMw0KICAgICAgICBbNi4wMmUrMjNdDQoNCiAgICAgICAgMWUtMTINCiAgICAgICAgWzFlLTEyXQ0KDQogICAgICAgICMgYW55IGludCBvciByZWFsIG51bWJlciwgcmV0dXJuZWQgYXMgZmxvYXQNCiAgICAgICAgMTAwDQogICAgICAgIFsxMDAuMF0NCg0KICAgICAgICAtMTAwDQogICAgICAgIFstMTAwLjBdDQoNCiAgICAgICAgKzEwMA0KICAgICAgICBbMTAwLjBdDQoNCiAgICAgICAgMy4xNDE1OQ0KICAgICAgICBbMy4xNDE1OV0NCg0KICAgICAgICA2LjAyZTIzDQogICAgICAgIFs2LjAyZSsyM10NCg0KICAgICAgICAxZS0xMg0KICAgICAgICBbMWUtMTJdDQoNCiAgICAgICAgIyBoZXggbnVtYmVycw0KICAgICAgICAxMDANCiAgICAgICAgWzI1Nl0NCg0KICAgICAgICBGRg0KICAgICAgICBbMjU1XQ0KDQogICAgICAgICMgZnJhY3Rpb25zDQogICAgICAgIDEvMg0KICAgICAgICBbMC41XQ0KDQogICAgICAgIC0zLzQNCiAgICAgICAgWy0wLjc1XQ0KDQogICAgICAgICMgbWl4ZWQgZnJhY3Rpb25zDQogICAgICAgIDENCiAgICAgICAgWzFdDQoNCiAgICAgICAgMS8yDQogICAgICAgIFswLjVdDQoNCiAgICAgICAgLTMvNA0KICAgICAgICBbLTAuNzVdDQoNCiAgICAgICAgMS0zLzQNCiAgICAgICAgWzEuNzVdDQoNCiAgICAgICAgIyB1dWlkDQogICAgICAgIDEyMzQ1Njc4LTEyMzQtNTY3OC0xMjM0LTU2NzgxMjM0NTY3OA0KICAgICAgICBbVVVJRCgnMTIzNDU2NzgtMTIzNC01Njc4LTEyMzQtNTY3ODEyMzQ1Njc4JyldDQogICAgIiIiDQoNCiAgICBjb252ZXJ0VG9JbnRlZ2VyID0gdG9rZW5NYXAoaW50KQ0KICAgICIiIg0KICAgIFBhcnNlIGFjdGlvbiBmb3IgY29udmVydGluZyBwYXJzZWQgaW50ZWdlcnMgdG8gUHl0aG9uIGludA0KICAgICIiIg0KDQogICAgY29udmVydFRvRmxvYXQgPSB0b2tlbk1hcChmbG9hdCkNCiAgICAiIiINCiAgICBQYXJzZSBhY3Rpb24gZm9yIGNvbnZlcnRpbmcgcGFyc2VkIG51bWJlcnMgdG8gUHl0aG9uIGZsb2F0DQogICAgIiIiDQoNCiAgICBpbnRlZ2VyID0gV29yZChudW1zKS5zZXROYW1lKCJpbnRlZ2VyIikuc2V0UGFyc2VBY3Rpb24oY29udmVydFRvSW50ZWdlcikNCiAgICAiIiJleHByZXNzaW9uIHRoYXQgcGFyc2VzIGFuIHVuc2lnbmVkIGludGVnZXIsIHJldHVybnMgYW4gaW50IiIiDQoNCiAgICBoZXhfaW50ZWdlciA9IFdvcmQoaGV4bnVtcykuc2V0TmFtZSgiaGV4IGludGVnZXIiKS5zZXRQYXJzZUFjdGlvbih0b2tlbk1hcChpbnQsMTYpKQ0KICAgICIiImV4cHJlc3Npb24gdGhhdCBwYXJzZXMgYSBoZXhhZGVjaW1hbCBpbnRlZ2VyLCByZXR1cm5zIGFuIGludCIiIg0KDQogICAgc2lnbmVkX2ludGVnZXIgPSBSZWdleChyJ1srLV0/XGQrJykuc2V0TmFtZSgic2lnbmVkIGludGVnZXIiKS5zZXRQYXJzZUFjdGlvbihjb252ZXJ0VG9JbnRlZ2VyKQ0KICAgICIiImV4cHJlc3Npb24gdGhhdCBwYXJzZXMgYW4gaW50ZWdlciB3aXRoIG9wdGlvbmFsIGxlYWRpbmcgc2lnbiwgcmV0dXJucyBhbiBpbnQiIiINCg0KICAgIGZyYWN0aW9uID0gKHNpZ25lZF9pbnRlZ2VyKCkuc2V0UGFyc2VBY3Rpb24oY29udmVydFRvRmxvYXQpICsgJy8nICsgc2lnbmVkX2ludGVnZXIoKS5zZXRQYXJzZUFjdGlvbihjb252ZXJ0VG9GbG9hdCkpLnNldE5hbWUoImZyYWN0aW9uIikNCiAgICAiIiJmcmFjdGlvbmFsIGV4cHJlc3Npb24gb2YgYW4gaW50ZWdlciBkaXZpZGVkIGJ5IGFuIGludGVnZXIsIHJldHVybnMgYSBmbG9hdCIiIg0KICAgIGZyYWN0aW9uLmFkZFBhcnNlQWN0aW9uKGxhbWJkYSB0OiB0WzBdL3RbLTFdKQ0KDQogICAgbWl4ZWRfaW50ZWdlciA9IChmcmFjdGlvbiB8IHNpZ25lZF9pbnRlZ2VyICsgT3B0aW9uYWwoT3B0aW9uYWwoJy0nKS5zdXBwcmVzcygpICsgZnJhY3Rpb24pKS5zZXROYW1lKCJmcmFjdGlvbiBvciBtaXhlZCBpbnRlZ2VyLWZyYWN0aW9uIikNCiAgICAiIiJtaXhlZCBpbnRlZ2VyIG9mIHRoZSBmb3JtICdpbnRlZ2VyIC0gZnJhY3Rpb24nLCB3aXRoIG9wdGlvbmFsIGxlYWRpbmcgaW50ZWdlciwgcmV0dXJucyBmbG9hdCIiIg0KICAgIG1peGVkX2ludGVnZXIuYWRkUGFyc2VBY3Rpb24oc3VtKQ0KDQogICAgcmVhbCA9IFJlZ2V4KHInWystXT9cZCtcLlxkKicpLnNldE5hbWUoInJlYWwgbnVtYmVyIikuc2V0UGFyc2VBY3Rpb24oY29udmVydFRvRmxvYXQpDQogICAgIiIiZXhwcmVzc2lvbiB0aGF0IHBhcnNlcyBhIGZsb2F0aW5nIHBvaW50IG51bWJlciBhbmQgcmV0dXJucyBhIGZsb2F0IiIiDQoNCiAgICBzY2lfcmVhbCA9IFJlZ2V4KHInWystXT9cZCsoW2VFXVsrLV0/XGQrfFwuXGQqKFtlRV1bKy1dP1xkKyk/KScpLnNldE5hbWUoInJlYWwgbnVtYmVyIHdpdGggc2NpZW50aWZpYyBub3RhdGlvbiIpLnNldFBhcnNlQWN0aW9uKGNvbnZlcnRUb0Zsb2F0KQ0KICAgICIiImV4cHJlc3Npb24gdGhhdCBwYXJzZXMgYSBmbG9hdGluZyBwb2ludCBudW1iZXIgd2l0aCBvcHRpb25hbCBzY2llbnRpZmljIG5vdGF0aW9uIGFuZCByZXR1cm5zIGEgZmxvYXQiIiINCg0KICAgICMgc3RyZWFtbGluaW5nIHRoaXMgZXhwcmVzc2lvbiBtYWtlcyB0aGUgZG9jcyBuaWNlci1sb29raW5nDQogICAgbnVtYmVyID0gKHNjaV9yZWFsIHwgcmVhbCB8IHNpZ25lZF9pbnRlZ2VyKS5zdHJlYW1saW5lKCkNCiAgICAiIiJhbnkgbnVtZXJpYyBleHByZXNzaW9uLCByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIFB5dGhvbiB0eXBlIiIiDQoNCiAgICBmbnVtYmVyID0gUmVnZXgocidbKy1dP1xkK1wuP1xkKihbZUVdWystXT9cZCspPycpLnNldE5hbWUoImZudW1iZXIiKS5zZXRQYXJzZUFjdGlvbihjb252ZXJ0VG9GbG9hdCkNCiAgICAiIiJhbnkgaW50IG9yIHJlYWwgbnVtYmVyLCByZXR1cm5lZCBhcyBmbG9hdCIiIg0KICAgIA0KICAgIGlkZW50aWZpZXIgPSBXb3JkKGFscGhhcysnXycsIGFscGhhbnVtcysnXycpLnNldE5hbWUoImlkZW50aWZpZXIiKQ0KICAgICIiInR5cGljYWwgY29kZSBpZGVudGlmaWVyIChsZWFkaW5nIGFscGhhIG9yICdfJywgZm9sbG93ZWQgYnkgMCBvciBtb3JlIGFscGhhcywgbnVtcywgb3IgJ18nKSIiIg0KICAgIA0KICAgIGlwdjRfYWRkcmVzcyA9IFJlZ2V4KHInKDI1WzAtNV18MlswLTRdWzAtOV18MT9bMC05XXsxLDJ9KShcLigyNVswLTVdfDJbMC00XVswLTldfDE/WzAtOV17MSwyfSkpezN9Jykuc2V0TmFtZSgiSVB2NCBhZGRyZXNzIikNCiAgICAiSVB2NCBhZGRyZXNzIChDezAuMC4wLjAgLSAyNTUuMjU1LjI1NS4yNTV9KSINCg0KICAgIF9pcHY2X3BhcnQgPSBSZWdleChyJ1swLTlhLWZBLUZdezEsNH0nKS5zZXROYW1lKCJoZXhfaW50ZWdlciIpDQogICAgX2Z1bGxfaXB2Nl9hZGRyZXNzID0gKF9pcHY2X3BhcnQgKyAoJzonICsgX2lwdjZfcGFydCkqNykuc2V0TmFtZSgiZnVsbCBJUHY2IGFkZHJlc3MiKQ0KICAgIF9zaG9ydF9pcHY2X2FkZHJlc3MgPSAoT3B0aW9uYWwoX2lwdjZfcGFydCArICgnOicgKyBfaXB2Nl9wYXJ0KSooMCw2KSkgKyAiOjoiICsgT3B0aW9uYWwoX2lwdjZfcGFydCArICgnOicgKyBfaXB2Nl9wYXJ0KSooMCw2KSkpLnNldE5hbWUoInNob3J0IElQdjYgYWRkcmVzcyIpDQogICAgX3Nob3J0X2lwdjZfYWRkcmVzcy5hZGRDb25kaXRpb24obGFtYmRhIHQ6IHN1bSgxIGZvciB0dCBpbiB0IGlmIHB5cGFyc2luZ19jb21tb24uX2lwdjZfcGFydC5tYXRjaGVzKHR0KSkgPCA4KQ0KICAgIF9taXhlZF9pcHY2X2FkZHJlc3MgPSAoIjo6ZmZmZjoiICsgaXB2NF9hZGRyZXNzKS5zZXROYW1lKCJtaXhlZCBJUHY2IGFkZHJlc3MiKQ0KICAgIGlwdjZfYWRkcmVzcyA9IENvbWJpbmUoKF9mdWxsX2lwdjZfYWRkcmVzcyB8IF9taXhlZF9pcHY2X2FkZHJlc3MgfCBfc2hvcnRfaXB2Nl9hZGRyZXNzKS5zZXROYW1lKCJJUHY2IGFkZHJlc3MiKSkuc2V0TmFtZSgiSVB2NiBhZGRyZXNzIikNCiAgICAiSVB2NiBhZGRyZXNzIChsb25nLCBzaG9ydCwgb3IgbWl4ZWQgZm9ybSkiDQogICAgDQogICAgbWFjX2FkZHJlc3MgPSBSZWdleChyJ1swLTlhLWZBLUZdezJ9KFs6Li1dKVswLTlhLWZBLUZdezJ9KD86XDFbMC05YS1mQS1GXXsyfSl7NH0nKS5zZXROYW1lKCJNQUMgYWRkcmVzcyIpDQogICAgIk1BQyBhZGRyZXNzIHh4Onh4Onh4Onh4Onh4IChtYXkgYWxzbyBoYXZlICctJyBvciAnLicgZGVsaW1pdGVycykiDQoNCiAgICBAc3RhdGljbWV0aG9kDQogICAgZGVmIGNvbnZlcnRUb0RhdGUoZm10PSIlWS0lbS0lZCIpOg0KICAgICAgICAiIiINCiAgICAgICAgSGVscGVyIHRvIGNyZWF0ZSBhIHBhcnNlIGFjdGlvbiBmb3IgY29udmVydGluZyBwYXJzZWQgZGF0ZSBzdHJpbmcgdG8gUHl0aG9uIGRhdGV0aW1lLmRhdGUNCg0KICAgICAgICBQYXJhbXMgLQ0KICAgICAgICAgLSBmbXQgLSBmb3JtYXQgdG8gYmUgcGFzc2VkIHRvIGRhdGV0aW1lLnN0cnB0aW1lIChkZWZhdWx0PUN7IiVZLSVtLSVkIn0pDQoNCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBkYXRlX2V4cHIgPSBweXBhcnNpbmdfY29tbW9uLmlzbzg2MDFfZGF0ZS5jb3B5KCkNCiAgICAgICAgICAgIGRhdGVfZXhwci5zZXRQYXJzZUFjdGlvbihweXBhcnNpbmdfY29tbW9uLmNvbnZlcnRUb0RhdGUoKSkNCiAgICAgICAgICAgIHByaW50KGRhdGVfZXhwci5wYXJzZVN0cmluZygiMTk5OS0xMi0zMSIpKQ0KICAgICAgICBwcmludHM6Og0KICAgICAgICAgICAgW2RhdGV0aW1lLmRhdGUoMTk5OSwgMTIsIDMxKV0NCiAgICAgICAgIiIiDQogICAgICAgIGRlZiBjdnRfZm4ocyxsLHQpOg0KICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgIHJldHVybiBkYXRldGltZS5zdHJwdGltZSh0WzBdLCBmbXQpLmRhdGUoKQ0KICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3IgYXMgdmU6DQogICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24ocywgbCwgc3RyKHZlKSkNCiAgICAgICAgcmV0dXJuIGN2dF9mbg0KDQogICAgQHN0YXRpY21ldGhvZA0KICAgIGRlZiBjb252ZXJ0VG9EYXRldGltZShmbXQ9IiVZLSVtLSVkVCVIOiVNOiVTLiVmIik6DQogICAgICAgICIiIg0KICAgICAgICBIZWxwZXIgdG8gY3JlYXRlIGEgcGFyc2UgYWN0aW9uIGZvciBjb252ZXJ0aW5nIHBhcnNlZCBkYXRldGltZSBzdHJpbmcgdG8gUHl0aG9uIGRhdGV0aW1lLmRhdGV0aW1lDQoNCiAgICAgICAgUGFyYW1zIC0NCiAgICAgICAgIC0gZm10IC0gZm9ybWF0IHRvIGJlIHBhc3NlZCB0byBkYXRldGltZS5zdHJwdGltZSAoZGVmYXVsdD1DeyIlWS0lbS0lZFQlSDolTTolUy4lZiJ9KQ0KDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgZHRfZXhwciA9IHB5cGFyc2luZ19jb21tb24uaXNvODYwMV9kYXRldGltZS5jb3B5KCkNCiAgICAgICAgICAgIGR0X2V4cHIuc2V0UGFyc2VBY3Rpb24ocHlwYXJzaW5nX2NvbW1vbi5jb252ZXJ0VG9EYXRldGltZSgpKQ0KICAgICAgICAgICAgcHJpbnQoZHRfZXhwci5wYXJzZVN0cmluZygiMTk5OS0xMi0zMVQyMzo1OTo1OS45OTkiKSkNCiAgICAgICAgcHJpbnRzOjoNCiAgICAgICAgICAgIFtkYXRldGltZS5kYXRldGltZSgxOTk5LCAxMiwgMzEsIDIzLCA1OSwgNTksIDk5OTAwMCldDQogICAgICAgICIiIg0KICAgICAgICBkZWYgY3Z0X2ZuKHMsbCx0KToNCiAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICByZXR1cm4gZGF0ZXRpbWUuc3RycHRpbWUodFswXSwgZm10KQ0KICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3IgYXMgdmU6DQogICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24ocywgbCwgc3RyKHZlKSkNCiAgICAgICAgcmV0dXJuIGN2dF9mbg0KDQogICAgaXNvODYwMV9kYXRlID0gUmVnZXgocicoP1A8eWVhcj5cZHs0fSkoPzotKD9QPG1vbnRoPlxkXGQpKD86LSg/UDxkYXk+XGRcZCkpPyk/Jykuc2V0TmFtZSgiSVNPODYwMSBkYXRlIikNCiAgICAiSVNPODYwMSBkYXRlIChDe3l5eXktbW0tZGR9KSINCg0KICAgIGlzbzg2MDFfZGF0ZXRpbWUgPSBSZWdleChyJyg/UDx5ZWFyPlxkezR9KS0oP1A8bW9udGg+XGRcZCktKD9QPGRheT5cZFxkKVtUIF0oP1A8aG91cj5cZFxkKTooP1A8bWludXRlPlxkXGQpKDooP1A8c2Vjb25kPlxkXGQoXC5cZCopPyk/KT8oP1A8dHo+WnxbKy1dXGRcZDo/XGRcZCk/Jykuc2V0TmFtZSgiSVNPODYwMSBkYXRldGltZSIpDQogICAgIklTTzg2MDEgZGF0ZXRpbWUgKEN7eXl5eS1tbS1kZFRoaDptbTpzcy5zKFp8Ky0wMDowMCl9KSAtIHRyYWlsaW5nIHNlY29uZHMsIG1pbGxpc2Vjb25kcywgYW5kIHRpbWV6b25lIG9wdGlvbmFsOyBhY2NlcHRzIHNlcGFyYXRpbmcgQ3snVCd9IG9yIEN7JyAnfSINCg0KICAgIHV1aWQgPSBSZWdleChyJ1swLTlhLWZBLUZdezh9KC1bMC05YS1mQS1GXXs0fSl7M30tWzAtOWEtZkEtRl17MTJ9Jykuc2V0TmFtZSgiVVVJRCIpDQogICAgIlVVSUQgKEN7eHh4eHh4eHgteHh4eC14eHh4LXh4eHgteHh4eHh4eHh4eHh4fSkiDQoNCiAgICBfaHRtbF9zdHJpcHBlciA9IGFueU9wZW5UYWcuc3VwcHJlc3MoKSB8IGFueUNsb3NlVGFnLnN1cHByZXNzKCkNCiAgICBAc3RhdGljbWV0aG9kDQogICAgZGVmIHN0cmlwSFRNTFRhZ3MocywgbCwgdG9rZW5zKToNCiAgICAgICAgIiIiDQogICAgICAgIFBhcnNlIGFjdGlvbiB0byByZW1vdmUgSFRNTCB0YWdzIGZyb20gd2ViIHBhZ2UgSFRNTCBzb3VyY2UNCg0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgICMgc3RyaXAgSFRNTCBsaW5rcyBmcm9tIG5vcm1hbCB0ZXh0IA0KICAgICAgICAgICAgdGV4dCA9ICc8dGQ+TW9yZSBpbmZvIGF0IHRoZSA8YSBocmVmPSJodHRwOi8vcHlwYXJzaW5nLndpa2lzcGFjZXMuY29tIj5weXBhcnNpbmc8L2E+IHdpa2kgcGFnZTwvdGQ+Jw0KICAgICAgICAgICAgdGQsdGRfZW5kID0gbWFrZUhUTUxUYWdzKCJURCIpDQogICAgICAgICAgICB0YWJsZV90ZXh0ID0gdGQgKyBTa2lwVG8odGRfZW5kKS5zZXRQYXJzZUFjdGlvbihweXBhcnNpbmdfY29tbW9uLnN0cmlwSFRNTFRhZ3MpKCJib2R5IikgKyB0ZF9lbmQNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgcHJpbnQodGFibGVfdGV4dC5wYXJzZVN0cmluZyh0ZXh0KS5ib2R5KSAjIC0+ICdNb3JlIGluZm8gYXQgdGhlIHB5cGFyc2luZyB3aWtpIHBhZ2UnDQogICAgICAgICIiIg0KICAgICAgICByZXR1cm4gcHlwYXJzaW5nX2NvbW1vbi5faHRtbF9zdHJpcHBlci50cmFuc2Zvcm1TdHJpbmcodG9rZW5zWzBdKQ0KDQogICAgX2NvbW1hc2VwaXRlbSA9IENvbWJpbmUoT25lT3JNb3JlKH5MaXRlcmFsKCIsIikgKyB+TGluZUVuZCgpICsgV29yZChwcmludGFibGVzLCBleGNsdWRlQ2hhcnM9JywnKSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIE9wdGlvbmFsKCBXaGl0ZSgiIFx0IikgKSApICkuc3RyZWFtbGluZSgpLnNldE5hbWUoImNvbW1hSXRlbSIpDQogICAgY29tbWFfc2VwYXJhdGVkX2xpc3QgPSBkZWxpbWl0ZWRMaXN0KCBPcHRpb25hbCggcXVvdGVkU3RyaW5nLmNvcHkoKSB8IF9jb21tYXNlcGl0ZW0sIGRlZmF1bHQ9IiIpICkuc2V0TmFtZSgiY29tbWEgc2VwYXJhdGVkIGxpc3QiKQ0KICAgICIiIlByZWRlZmluZWQgZXhwcmVzc2lvbiBvZiAxIG9yIG1vcmUgcHJpbnRhYmxlIHdvcmRzIG9yIHF1b3RlZCBzdHJpbmdzLCBzZXBhcmF0ZWQgYnkgY29tbWFzLiIiIg0KDQogICAgdXBjYXNlVG9rZW5zID0gc3RhdGljbWV0aG9kKHRva2VuTWFwKGxhbWJkYSB0OiBfdXN0cih0KS51cHBlcigpKSkNCiAgICAiIiJQYXJzZSBhY3Rpb24gdG8gY29udmVydCB0b2tlbnMgdG8gdXBwZXIgY2FzZS4iIiINCg0KICAgIGRvd25jYXNlVG9rZW5zID0gc3RhdGljbWV0aG9kKHRva2VuTWFwKGxhbWJkYSB0OiBfdXN0cih0KS5sb3dlcigpKSkNCiAgICAiIiJQYXJzZSBhY3Rpb24gdG8gY29udmVydCB0b2tlbnMgdG8gbG93ZXIgY2FzZS4iIiINCg0KDQppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOg0KDQogICAgc2VsZWN0VG9rZW4gICAgPSBDYXNlbGVzc0xpdGVyYWwoInNlbGVjdCIpDQogICAgZnJvbVRva2VuICAgICAgPSBDYXNlbGVzc0xpdGVyYWwoImZyb20iKQ0KDQogICAgaWRlbnQgICAgICAgICAgPSBXb3JkKGFscGhhcywgYWxwaGFudW1zICsgIl8kIikNCg0KICAgIGNvbHVtbk5hbWUgICAgID0gZGVsaW1pdGVkTGlzdChpZGVudCwgIi4iLCBjb21iaW5lPVRydWUpLnNldFBhcnNlQWN0aW9uKHVwY2FzZVRva2VucykNCiAgICBjb2x1bW5OYW1lTGlzdCA9IEdyb3VwKGRlbGltaXRlZExpc3QoY29sdW1uTmFtZSkpLnNldE5hbWUoImNvbHVtbnMiKQ0KICAgIGNvbHVtblNwZWMgICAgID0gKCcqJyB8IGNvbHVtbk5hbWVMaXN0KQ0KDQogICAgdGFibGVOYW1lICAgICAgPSBkZWxpbWl0ZWRMaXN0KGlkZW50LCAiLiIsIGNvbWJpbmU9VHJ1ZSkuc2V0UGFyc2VBY3Rpb24odXBjYXNlVG9rZW5zKQ0KICAgIHRhYmxlTmFtZUxpc3QgID0gR3JvdXAoZGVsaW1pdGVkTGlzdCh0YWJsZU5hbWUpKS5zZXROYW1lKCJ0YWJsZXMiKQ0KICAgIA0KICAgIHNpbXBsZVNRTCAgICAgID0gc2VsZWN0VG9rZW4oImNvbW1hbmQiKSArIGNvbHVtblNwZWMoImNvbHVtbnMiKSArIGZyb21Ub2tlbiArIHRhYmxlTmFtZUxpc3QoInRhYmxlcyIpDQoNCiAgICAjIGRlbW8gcnVuVGVzdHMgbWV0aG9kLCBpbmNsdWRpbmcgZW1iZWRkZWQgY29tbWVudHMgaW4gdGVzdCBzdHJpbmcNCiAgICBzaW1wbGVTUUwucnVuVGVzdHMoIiIiDQogICAgICAgICMgJyonIGFzIGNvbHVtbiBsaXN0IGFuZCBkb3R0ZWQgdGFibGUgbmFtZQ0KICAgICAgICBzZWxlY3QgKiBmcm9tIFNZUy5YWVpaWQ0KDQogICAgICAgICMgY2FzZWxlc3MgbWF0Y2ggb24gIlNFTEVDVCIsIGFuZCBjYXN0cyBiYWNrIHRvICJzZWxlY3QiDQogICAgICAgIFNFTEVDVCAqIGZyb20gWFlaWlksIEFCQw0KDQogICAgICAgICMgbGlzdCBvZiBjb2x1bW4gbmFtZXMsIGFuZCBtaXhlZCBjYXNlIFNFTEVDVCBrZXl3b3JkDQogICAgICAgIFNlbGVjdCBBQSxCQixDQyBmcm9tIFN5cy5kdWFsDQoNCiAgICAgICAgIyBtdWx0aXBsZSB0YWJsZXMNCiAgICAgICAgU2VsZWN0IEEsIEIsIEMgZnJvbSBTeXMuZHVhbCwgVGFibGUyDQoNCiAgICAgICAgIyBpbnZhbGlkIFNFTEVDVCBrZXl3b3JkIC0gc2hvdWxkIGZhaWwNCiAgICAgICAgWGVsZWN0IEEsIEIsIEMgZnJvbSBTeXMuZHVhbA0KDQogICAgICAgICMgaW5jb21wbGV0ZSBjb21tYW5kIC0gc2hvdWxkIGZhaWwNCiAgICAgICAgU2VsZWN0DQoNCiAgICAgICAgIyBpbnZhbGlkIGNvbHVtbiBuYW1lIC0gc2hvdWxkIGZhaWwNCiAgICAgICAgU2VsZWN0IF5eXiBmcm94IFN5cy5kdWFsDQoNCiAgICAgICAgIiIiKQ0KDQogICAgcHlwYXJzaW5nX2NvbW1vbi5udW1iZXIucnVuVGVzdHMoIiIiDQogICAgICAgIDEwMA0KICAgICAgICAtMTAwDQogICAgICAgICsxMDANCiAgICAgICAgMy4xNDE1OQ0KICAgICAgICA2LjAyZTIzDQogICAgICAgIDFlLTEyDQogICAgICAgICIiIikNCg0KICAgICMgYW55IGludCBvciByZWFsIG51bWJlciwgcmV0dXJuZWQgYXMgZmxvYXQNCiAgICBweXBhcnNpbmdfY29tbW9uLmZudW1iZXIucnVuVGVzdHMoIiIiDQogICAgICAgIDEwMA0KICAgICAgICAtMTAwDQogICAgICAgICsxMDANCiAgICAgICAgMy4xNDE1OQ0KICAgICAgICA2LjAyZTIzDQogICAgICAgIDFlLTEyDQogICAgICAgICIiIikNCg0KICAgIHB5cGFyc2luZ19jb21tb24uaGV4X2ludGVnZXIucnVuVGVzdHMoIiIiDQogICAgICAgIDEwMA0KICAgICAgICBGRg0KICAgICAgICAiIiIpDQoNCiAgICBpbXBvcnQgdXVpZA0KICAgIHB5cGFyc2luZ19jb21tb24udXVpZC5zZXRQYXJzZUFjdGlvbih0b2tlbk1hcCh1dWlkLlVVSUQpKQ0KICAgIHB5cGFyc2luZ19jb21tb24udXVpZC5ydW5UZXN0cygiIiINCiAgICAgICAgMTIzNDU2NzgtMTIzNC01Njc4LTEyMzQtNTY3ODEyMzQ1Njc4DQogICAgICAgICIiIikNClBLAwQUAAAAAAAAACEAmVhNWpJ1AACSdQAAPgAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL192ZW5kb3Ivc2l4LnB5IiIiVXRpbGl0aWVzIGZvciB3cml0aW5nIGNvZGUgdGhhdCBydW5zIG9uIFB5dGhvbiAyIGFuZCAzIiIiCgojIENvcHlyaWdodCAoYykgMjAxMC0yMDE1IEJlbmphbWluIFBldGVyc29uCiMKIyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CiMgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKIyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCiMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAojIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwojIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiMKIyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKIyBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgojCiMgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKIyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKIyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKIyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCiMgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKIyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQojIFNPRlRXQVJFLgoKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBmdW5jdG9vbHMKaW1wb3J0IGl0ZXJ0b29scwppbXBvcnQgb3BlcmF0b3IKaW1wb3J0IHN5cwppbXBvcnQgdHlwZXMKCl9fYXV0aG9yX18gPSAiQmVuamFtaW4gUGV0ZXJzb24gPGJlbmphbWluQHB5dGhvbi5vcmc+IgpfX3ZlcnNpb25fXyA9ICIxLjEwLjAiCgoKIyBVc2VmdWwgZm9yIHZlcnkgY29hcnNlIHZlcnNpb24gZGlmZmVyZW50aWF0aW9uLgpQWTIgPSBzeXMudmVyc2lvbl9pbmZvWzBdID09IDIKUFkzID0gc3lzLnZlcnNpb25faW5mb1swXSA9PSAzClBZMzQgPSBzeXMudmVyc2lvbl9pbmZvWzA6Ml0gPj0gKDMsIDQpCgppZiBQWTM6CiAgICBzdHJpbmdfdHlwZXMgPSBzdHIsCiAgICBpbnRlZ2VyX3R5cGVzID0gaW50LAogICAgY2xhc3NfdHlwZXMgPSB0eXBlLAogICAgdGV4dF90eXBlID0gc3RyCiAgICBiaW5hcnlfdHlwZSA9IGJ5dGVzCgogICAgTUFYU0laRSA9IHN5cy5tYXhzaXplCmVsc2U6CiAgICBzdHJpbmdfdHlwZXMgPSBiYXNlc3RyaW5nLAogICAgaW50ZWdlcl90eXBlcyA9IChpbnQsIGxvbmcpCiAgICBjbGFzc190eXBlcyA9ICh0eXBlLCB0eXBlcy5DbGFzc1R5cGUpCiAgICB0ZXh0X3R5cGUgPSB1bmljb2RlCiAgICBiaW5hcnlfdHlwZSA9IHN0cgoKICAgIGlmIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCJqYXZhIik6CiAgICAgICAgIyBKeXRob24gYWx3YXlzIHVzZXMgMzIgYml0cy4KICAgICAgICBNQVhTSVpFID0gaW50KCgxIDw8IDMxKSAtIDEpCiAgICBlbHNlOgogICAgICAgICMgSXQncyBwb3NzaWJsZSB0byBoYXZlIHNpemVvZihsb25nKSAhPSBzaXplb2YoUHlfc3NpemVfdCkuCiAgICAgICAgY2xhc3MgWChvYmplY3QpOgoKICAgICAgICAgICAgZGVmIF9fbGVuX18oc2VsZik6CiAgICAgICAgICAgICAgICByZXR1cm4gMSA8PCAzMQogICAgICAgIHRyeToKICAgICAgICAgICAgbGVuKFgoKSkKICAgICAgICBleGNlcHQgT3ZlcmZsb3dFcnJvcjoKICAgICAgICAgICAgIyAzMi1iaXQKICAgICAgICAgICAgTUFYU0laRSA9IGludCgoMSA8PCAzMSkgLSAxKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgNjQtYml0CiAgICAgICAgICAgIE1BWFNJWkUgPSBpbnQoKDEgPDwgNjMpIC0gMSkKICAgICAgICBkZWwgWAoKCmRlZiBfYWRkX2RvYyhmdW5jLCBkb2MpOgogICAgIiIiQWRkIGRvY3VtZW50YXRpb24gdG8gYSBmdW5jdGlvbi4iIiIKICAgIGZ1bmMuX19kb2NfXyA9IGRvYwoKCmRlZiBfaW1wb3J0X21vZHVsZShuYW1lKToKICAgICIiIkltcG9ydCBtb2R1bGUsIHJldHVybmluZyB0aGUgbW9kdWxlIGFmdGVyIHRoZSBsYXN0IGRvdC4iIiIKICAgIF9faW1wb3J0X18obmFtZSkKICAgIHJldHVybiBzeXMubW9kdWxlc1tuYW1lXQoKCmNsYXNzIF9MYXp5RGVzY3Iob2JqZWN0KToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSk6CiAgICAgICAgc2VsZi5uYW1lID0gbmFtZQoKICAgIGRlZiBfX2dldF9fKHNlbGYsIG9iaiwgdHApOgogICAgICAgIHJlc3VsdCA9IHNlbGYuX3Jlc29sdmUoKQogICAgICAgIHNldGF0dHIob2JqLCBzZWxmLm5hbWUsIHJlc3VsdCkgICMgSW52b2tlcyBfX3NldF9fLgogICAgICAgIHRyeToKICAgICAgICAgICAgIyBUaGlzIGlzIGEgYml0IHVnbHksIGJ1dCBpdCBhdm9pZHMgcnVubmluZyB0aGlzIGFnYWluIGJ5CiAgICAgICAgICAgICMgcmVtb3ZpbmcgdGhpcyBkZXNjcmlwdG9yLgogICAgICAgICAgICBkZWxhdHRyKG9iai5fX2NsYXNzX18sIHNlbGYubmFtZSkKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIHBhc3MKICAgICAgICByZXR1cm4gcmVzdWx0CgoKY2xhc3MgTW92ZWRNb2R1bGUoX0xhenlEZXNjcik6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIG9sZCwgbmV3PU5vbmUpOgogICAgICAgIHN1cGVyKE1vdmVkTW9kdWxlLCBzZWxmKS5fX2luaXRfXyhuYW1lKQogICAgICAgIGlmIFBZMzoKICAgICAgICAgICAgaWYgbmV3IGlzIE5vbmU6CiAgICAgICAgICAgICAgICBuZXcgPSBuYW1lCiAgICAgICAgICAgIHNlbGYubW9kID0gbmV3CiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5tb2QgPSBvbGQKCiAgICBkZWYgX3Jlc29sdmUoc2VsZik6CiAgICAgICAgcmV0dXJuIF9pbXBvcnRfbW9kdWxlKHNlbGYubW9kKQoKICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBhdHRyKToKICAgICAgICBfbW9kdWxlID0gc2VsZi5fcmVzb2x2ZSgpCiAgICAgICAgdmFsdWUgPSBnZXRhdHRyKF9tb2R1bGUsIGF0dHIpCiAgICAgICAgc2V0YXR0cihzZWxmLCBhdHRyLCB2YWx1ZSkKICAgICAgICByZXR1cm4gdmFsdWUKCgpjbGFzcyBfTGF6eU1vZHVsZSh0eXBlcy5Nb2R1bGVUeXBlKToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSk6CiAgICAgICAgc3VwZXIoX0xhenlNb2R1bGUsIHNlbGYpLl9faW5pdF9fKG5hbWUpCiAgICAgICAgc2VsZi5fX2RvY19fID0gc2VsZi5fX2NsYXNzX18uX19kb2NfXwoKICAgIGRlZiBfX2Rpcl9fKHNlbGYpOgogICAgICAgIGF0dHJzID0gWyJfX2RvY19fIiwgIl9fbmFtZV9fIl0KICAgICAgICBhdHRycyArPSBbYXR0ci5uYW1lIGZvciBhdHRyIGluIHNlbGYuX21vdmVkX2F0dHJpYnV0ZXNdCiAgICAgICAgcmV0dXJuIGF0dHJzCgogICAgIyBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0aGlzCiAgICBfbW92ZWRfYXR0cmlidXRlcyA9IFtdCgoKY2xhc3MgTW92ZWRBdHRyaWJ1dGUoX0xhenlEZXNjcik6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIG9sZF9tb2QsIG5ld19tb2QsIG9sZF9hdHRyPU5vbmUsIG5ld19hdHRyPU5vbmUpOgogICAgICAgIHN1cGVyKE1vdmVkQXR0cmlidXRlLCBzZWxmKS5fX2luaXRfXyhuYW1lKQogICAgICAgIGlmIFBZMzoKICAgICAgICAgICAgaWYgbmV3X21vZCBpcyBOb25lOgogICAgICAgICAgICAgICAgbmV3X21vZCA9IG5hbWUKICAgICAgICAgICAgc2VsZi5tb2QgPSBuZXdfbW9kCiAgICAgICAgICAgIGlmIG5ld19hdHRyIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBpZiBvbGRfYXR0ciBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgIG5ld19hdHRyID0gbmFtZQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBuZXdfYXR0ciA9IG9sZF9hdHRyCiAgICAgICAgICAgIHNlbGYuYXR0ciA9IG5ld19hdHRyCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5tb2QgPSBvbGRfbW9kCiAgICAgICAgICAgIGlmIG9sZF9hdHRyIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBvbGRfYXR0ciA9IG5hbWUKICAgICAgICAgICAgc2VsZi5hdHRyID0gb2xkX2F0dHIKCiAgICBkZWYgX3Jlc29sdmUoc2VsZik6CiAgICAgICAgbW9kdWxlID0gX2ltcG9ydF9tb2R1bGUoc2VsZi5tb2QpCiAgICAgICAgcmV0dXJuIGdldGF0dHIobW9kdWxlLCBzZWxmLmF0dHIpCgoKY2xhc3MgX1NpeE1ldGFQYXRoSW1wb3J0ZXIob2JqZWN0KToKCiAgICAiIiIKICAgIEEgbWV0YSBwYXRoIGltcG9ydGVyIHRvIGltcG9ydCBzaXgubW92ZXMgYW5kIGl0cyBzdWJtb2R1bGVzLgoKICAgIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhIFBFUDMwMiBmaW5kZXIgYW5kIGxvYWRlci4gSXQgc2hvdWxkIGJlIGNvbXBhdGlibGUKICAgIHdpdGggUHl0aG9uIDIuNSBhbmQgYWxsIGV4aXN0aW5nIHZlcnNpb25zIG9mIFB5dGhvbjMKICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzaXhfbW9kdWxlX25hbWUpOgogICAgICAgIHNlbGYubmFtZSA9IHNpeF9tb2R1bGVfbmFtZQogICAgICAgIHNlbGYua25vd25fbW9kdWxlcyA9IHt9CgogICAgZGVmIF9hZGRfbW9kdWxlKHNlbGYsIG1vZCwgKmZ1bGxuYW1lcyk6CiAgICAgICAgZm9yIGZ1bGxuYW1lIGluIGZ1bGxuYW1lczoKICAgICAgICAgICAgc2VsZi5rbm93bl9tb2R1bGVzW3NlbGYubmFtZSArICIuIiArIGZ1bGxuYW1lXSA9IG1vZAoKICAgIGRlZiBfZ2V0X21vZHVsZShzZWxmLCBmdWxsbmFtZSk6CiAgICAgICAgcmV0dXJuIHNlbGYua25vd25fbW9kdWxlc1tzZWxmLm5hbWUgKyAiLiIgKyBmdWxsbmFtZV0KCiAgICBkZWYgZmluZF9tb2R1bGUoc2VsZiwgZnVsbG5hbWUsIHBhdGg9Tm9uZSk6CiAgICAgICAgaWYgZnVsbG5hbWUgaW4gc2VsZi5rbm93bl9tb2R1bGVzOgogICAgICAgICAgICByZXR1cm4gc2VsZgogICAgICAgIHJldHVybiBOb25lCgogICAgZGVmIF9fZ2V0X21vZHVsZShzZWxmLCBmdWxsbmFtZSk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc2VsZi5rbm93bl9tb2R1bGVzW2Z1bGxuYW1lXQogICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IoIlRoaXMgbG9hZGVyIGRvZXMgbm90IGtub3cgbW9kdWxlICIgKyBmdWxsbmFtZSkKCiAgICBkZWYgbG9hZF9tb2R1bGUoc2VsZiwgZnVsbG5hbWUpOgogICAgICAgIHRyeToKICAgICAgICAgICAgIyBpbiBjYXNlIG9mIGEgcmVsb2FkCiAgICAgICAgICAgIHJldHVybiBzeXMubW9kdWxlc1tmdWxsbmFtZV0KICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgIHBhc3MKICAgICAgICBtb2QgPSBzZWxmLl9fZ2V0X21vZHVsZShmdWxsbmFtZSkKICAgICAgICBpZiBpc2luc3RhbmNlKG1vZCwgTW92ZWRNb2R1bGUpOgogICAgICAgICAgICBtb2QgPSBtb2QuX3Jlc29sdmUoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG1vZC5fX2xvYWRlcl9fID0gc2VsZgogICAgICAgIHN5cy5tb2R1bGVzW2Z1bGxuYW1lXSA9IG1vZAogICAgICAgIHJldHVybiBtb2QKCiAgICBkZWYgaXNfcGFja2FnZShzZWxmLCBmdWxsbmFtZSk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIHRydWUsIGlmIHRoZSBuYW1lZCBtb2R1bGUgaXMgYSBwYWNrYWdlLgoKICAgICAgICBXZSBuZWVkIHRoaXMgbWV0aG9kIHRvIGdldCBjb3JyZWN0IHNwZWMgb2JqZWN0cyB3aXRoCiAgICAgICAgUHl0aG9uIDMuNCAoc2VlIFBFUDQ1MSkKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gaGFzYXR0cihzZWxmLl9fZ2V0X21vZHVsZShmdWxsbmFtZSksICJfX3BhdGhfXyIpCgogICAgZGVmIGdldF9jb2RlKHNlbGYsIGZ1bGxuYW1lKToKICAgICAgICAiIiJSZXR1cm4gTm9uZQoKICAgICAgICBSZXF1aXJlZCwgaWYgaXNfcGFja2FnZSBpcyBpbXBsZW1lbnRlZCIiIgogICAgICAgIHNlbGYuX19nZXRfbW9kdWxlKGZ1bGxuYW1lKSAgIyBldmVudHVhbGx5IHJhaXNlcyBJbXBvcnRFcnJvcgogICAgICAgIHJldHVybiBOb25lCiAgICBnZXRfc291cmNlID0gZ2V0X2NvZGUgICMgc2FtZSBhcyBnZXRfY29kZQoKX2ltcG9ydGVyID0gX1NpeE1ldGFQYXRoSW1wb3J0ZXIoX19uYW1lX18pCgoKY2xhc3MgX01vdmVkSXRlbXMoX0xhenlNb2R1bGUpOgoKICAgICIiIkxhenkgbG9hZGluZyBvZiBtb3ZlZCBvYmplY3RzIiIiCiAgICBfX3BhdGhfXyA9IFtdICAjIG1hcmsgYXMgcGFja2FnZQoKCl9tb3ZlZF9hdHRyaWJ1dGVzID0gWwogICAgTW92ZWRBdHRyaWJ1dGUoImNTdHJpbmdJTyIsICJjU3RyaW5nSU8iLCAiaW8iLCAiU3RyaW5nSU8iKSwKICAgIE1vdmVkQXR0cmlidXRlKCJmaWx0ZXIiLCAiaXRlcnRvb2xzIiwgImJ1aWx0aW5zIiwgImlmaWx0ZXIiLCAiZmlsdGVyIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiZmlsdGVyZmFsc2UiLCAiaXRlcnRvb2xzIiwgIml0ZXJ0b29scyIsICJpZmlsdGVyZmFsc2UiLCAiZmlsdGVyZmFsc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJpbnB1dCIsICJfX2J1aWx0aW5fXyIsICJidWlsdGlucyIsICJyYXdfaW5wdXQiLCAiaW5wdXQiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJpbnRlcm4iLCAiX19idWlsdGluX18iLCAic3lzIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgibWFwIiwgIml0ZXJ0b29scyIsICJidWlsdGlucyIsICJpbWFwIiwgIm1hcCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImdldGN3ZCIsICJvcyIsICJvcyIsICJnZXRjd2R1IiwgImdldGN3ZCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImdldGN3ZGIiLCAib3MiLCAib3MiLCAiZ2V0Y3dkIiwgImdldGN3ZGIiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJyYW5nZSIsICJfX2J1aWx0aW5fXyIsICJidWlsdGlucyIsICJ4cmFuZ2UiLCAicmFuZ2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJyZWxvYWRfbW9kdWxlIiwgIl9fYnVpbHRpbl9fIiwgImltcG9ydGxpYiIgaWYgUFkzNCBlbHNlICJpbXAiLCAicmVsb2FkIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgicmVkdWNlIiwgIl9fYnVpbHRpbl9fIiwgImZ1bmN0b29scyIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInNobGV4X3F1b3RlIiwgInBpcGVzIiwgInNobGV4IiwgInF1b3RlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiU3RyaW5nSU8iLCAiU3RyaW5nSU8iLCAiaW8iKSwKICAgIE1vdmVkQXR0cmlidXRlKCJVc2VyRGljdCIsICJVc2VyRGljdCIsICJjb2xsZWN0aW9ucyIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlVzZXJMaXN0IiwgIlVzZXJMaXN0IiwgImNvbGxlY3Rpb25zIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiVXNlclN0cmluZyIsICJVc2VyU3RyaW5nIiwgImNvbGxlY3Rpb25zIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgieHJhbmdlIiwgIl9fYnVpbHRpbl9fIiwgImJ1aWx0aW5zIiwgInhyYW5nZSIsICJyYW5nZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInppcCIsICJpdGVydG9vbHMiLCAiYnVpbHRpbnMiLCAiaXppcCIsICJ6aXAiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ6aXBfbG9uZ2VzdCIsICJpdGVydG9vbHMiLCAiaXRlcnRvb2xzIiwgIml6aXBfbG9uZ2VzdCIsICJ6aXBfbG9uZ2VzdCIpLAogICAgTW92ZWRNb2R1bGUoImJ1aWx0aW5zIiwgIl9fYnVpbHRpbl9fIiksCiAgICBNb3ZlZE1vZHVsZSgiY29uZmlncGFyc2VyIiwgIkNvbmZpZ1BhcnNlciIpLAogICAgTW92ZWRNb2R1bGUoImNvcHlyZWciLCAiY29weV9yZWciKSwKICAgIE1vdmVkTW9kdWxlKCJkYm1fZ251IiwgImdkYm0iLCAiZGJtLmdudSIpLAogICAgTW92ZWRNb2R1bGUoIl9kdW1teV90aHJlYWQiLCAiZHVtbXlfdGhyZWFkIiwgIl9kdW1teV90aHJlYWQiKSwKICAgIE1vdmVkTW9kdWxlKCJodHRwX2Nvb2tpZWphciIsICJjb29raWVsaWIiLCAiaHR0cC5jb29raWVqYXIiKSwKICAgIE1vdmVkTW9kdWxlKCJodHRwX2Nvb2tpZXMiLCAiQ29va2llIiwgImh0dHAuY29va2llcyIpLAogICAgTW92ZWRNb2R1bGUoImh0bWxfZW50aXRpZXMiLCAiaHRtbGVudGl0eWRlZnMiLCAiaHRtbC5lbnRpdGllcyIpLAogICAgTW92ZWRNb2R1bGUoImh0bWxfcGFyc2VyIiwgIkhUTUxQYXJzZXIiLCAiaHRtbC5wYXJzZXIiKSwKICAgIE1vdmVkTW9kdWxlKCJodHRwX2NsaWVudCIsICJodHRwbGliIiwgImh0dHAuY2xpZW50IiksCiAgICBNb3ZlZE1vZHVsZSgiZW1haWxfbWltZV9tdWx0aXBhcnQiLCAiZW1haWwuTUlNRU11bHRpcGFydCIsICJlbWFpbC5taW1lLm11bHRpcGFydCIpLAogICAgTW92ZWRNb2R1bGUoImVtYWlsX21pbWVfbm9ubXVsdGlwYXJ0IiwgImVtYWlsLk1JTUVOb25NdWx0aXBhcnQiLCAiZW1haWwubWltZS5ub25tdWx0aXBhcnQiKSwKICAgIE1vdmVkTW9kdWxlKCJlbWFpbF9taW1lX3RleHQiLCAiZW1haWwuTUlNRVRleHQiLCAiZW1haWwubWltZS50ZXh0IiksCiAgICBNb3ZlZE1vZHVsZSgiZW1haWxfbWltZV9iYXNlIiwgImVtYWlsLk1JTUVCYXNlIiwgImVtYWlsLm1pbWUuYmFzZSIpLAogICAgTW92ZWRNb2R1bGUoIkJhc2VIVFRQU2VydmVyIiwgIkJhc2VIVFRQU2VydmVyIiwgImh0dHAuc2VydmVyIiksCiAgICBNb3ZlZE1vZHVsZSgiQ0dJSFRUUFNlcnZlciIsICJDR0lIVFRQU2VydmVyIiwgImh0dHAuc2VydmVyIiksCiAgICBNb3ZlZE1vZHVsZSgiU2ltcGxlSFRUUFNlcnZlciIsICJTaW1wbGVIVFRQU2VydmVyIiwgImh0dHAuc2VydmVyIiksCiAgICBNb3ZlZE1vZHVsZSgiY1BpY2tsZSIsICJjUGlja2xlIiwgInBpY2tsZSIpLAogICAgTW92ZWRNb2R1bGUoInF1ZXVlIiwgIlF1ZXVlIiksCiAgICBNb3ZlZE1vZHVsZSgicmVwcmxpYiIsICJyZXByIiksCiAgICBNb3ZlZE1vZHVsZSgic29ja2V0c2VydmVyIiwgIlNvY2tldFNlcnZlciIpLAogICAgTW92ZWRNb2R1bGUoIl90aHJlYWQiLCAidGhyZWFkIiwgIl90aHJlYWQiKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyIiwgIlRraW50ZXIiKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX2RpYWxvZyIsICJEaWFsb2ciLCAidGtpbnRlci5kaWFsb2ciKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX2ZpbGVkaWFsb2ciLCAiRmlsZURpYWxvZyIsICJ0a2ludGVyLmZpbGVkaWFsb2ciKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX3Njcm9sbGVkdGV4dCIsICJTY3JvbGxlZFRleHQiLCAidGtpbnRlci5zY3JvbGxlZHRleHQiKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX3NpbXBsZWRpYWxvZyIsICJTaW1wbGVEaWFsb2ciLCAidGtpbnRlci5zaW1wbGVkaWFsb2ciKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX3RpeCIsICJUaXgiLCAidGtpbnRlci50aXgiKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX3R0ayIsICJ0dGsiLCAidGtpbnRlci50dGsiKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX2NvbnN0YW50cyIsICJUa2NvbnN0YW50cyIsICJ0a2ludGVyLmNvbnN0YW50cyIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfZG5kIiwgIlRrZG5kIiwgInRraW50ZXIuZG5kIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl9jb2xvcmNob29zZXIiLCAidGtDb2xvckNob29zZXIiLAogICAgICAgICAgICAgICAgInRraW50ZXIuY29sb3JjaG9vc2VyIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl9jb21tb25kaWFsb2ciLCAidGtDb21tb25EaWFsb2ciLAogICAgICAgICAgICAgICAgInRraW50ZXIuY29tbW9uZGlhbG9nIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl90a2ZpbGVkaWFsb2ciLCAidGtGaWxlRGlhbG9nIiwgInRraW50ZXIuZmlsZWRpYWxvZyIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfZm9udCIsICJ0a0ZvbnQiLCAidGtpbnRlci5mb250IiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl9tZXNzYWdlYm94IiwgInRrTWVzc2FnZUJveCIsICJ0a2ludGVyLm1lc3NhZ2Vib3giKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX3Rrc2ltcGxlZGlhbG9nIiwgInRrU2ltcGxlRGlhbG9nIiwKICAgICAgICAgICAgICAgICJ0a2ludGVyLnNpbXBsZWRpYWxvZyIpLAogICAgTW92ZWRNb2R1bGUoInVybGxpYl9wYXJzZSIsIF9fbmFtZV9fICsgIi5tb3Zlcy51cmxsaWJfcGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZE1vZHVsZSgidXJsbGliX2Vycm9yIiwgX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYl9lcnJvciIsICJ1cmxsaWIuZXJyb3IiKSwKICAgIE1vdmVkTW9kdWxlKCJ1cmxsaWIiLCBfX25hbWVfXyArICIubW92ZXMudXJsbGliIiwgX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYiIpLAogICAgTW92ZWRNb2R1bGUoInVybGxpYl9yb2JvdHBhcnNlciIsICJyb2JvdHBhcnNlciIsICJ1cmxsaWIucm9ib3RwYXJzZXIiKSwKICAgIE1vdmVkTW9kdWxlKCJ4bWxycGNfY2xpZW50IiwgInhtbHJwY2xpYiIsICJ4bWxycGMuY2xpZW50IiksCiAgICBNb3ZlZE1vZHVsZSgieG1scnBjX3NlcnZlciIsICJTaW1wbGVYTUxSUENTZXJ2ZXIiLCAieG1scnBjLnNlcnZlciIpLApdCiMgQWRkIHdpbmRvd3Mgc3BlY2lmaWMgbW9kdWxlcy4KaWYgc3lzLnBsYXRmb3JtID09ICJ3aW4zMiI6CiAgICBfbW92ZWRfYXR0cmlidXRlcyArPSBbCiAgICAgICAgTW92ZWRNb2R1bGUoIndpbnJlZyIsICJfd2lucmVnIiksCiAgICBdCgpmb3IgYXR0ciBpbiBfbW92ZWRfYXR0cmlidXRlczoKICAgIHNldGF0dHIoX01vdmVkSXRlbXMsIGF0dHIubmFtZSwgYXR0cikKICAgIGlmIGlzaW5zdGFuY2UoYXR0ciwgTW92ZWRNb2R1bGUpOgogICAgICAgIF9pbXBvcnRlci5fYWRkX21vZHVsZShhdHRyLCAibW92ZXMuIiArIGF0dHIubmFtZSkKZGVsIGF0dHIKCl9Nb3ZlZEl0ZW1zLl9tb3ZlZF9hdHRyaWJ1dGVzID0gX21vdmVkX2F0dHJpYnV0ZXMKCm1vdmVzID0gX01vdmVkSXRlbXMoX19uYW1lX18gKyAiLm1vdmVzIikKX2ltcG9ydGVyLl9hZGRfbW9kdWxlKG1vdmVzLCAibW92ZXMiKQoKCmNsYXNzIE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3BhcnNlKF9MYXp5TW9kdWxlKToKCiAgICAiIiJMYXp5IGxvYWRpbmcgb2YgbW92ZWQgb2JqZWN0cyBpbiBzaXgubW92ZXMudXJsbGliX3BhcnNlIiIiCgoKX3VybGxpYl9wYXJzZV9tb3ZlZF9hdHRyaWJ1dGVzID0gWwogICAgTW92ZWRBdHRyaWJ1dGUoIlBhcnNlUmVzdWx0IiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlNwbGl0UmVzdWx0IiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInBhcnNlX3FzIiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInBhcnNlX3FzbCIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmxkZWZyYWciLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJsam9pbiIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmxwYXJzZSIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmxzcGxpdCIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmx1bnBhcnNlIiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVybHVuc3BsaXQiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgicXVvdGUiLCAidXJsbGliIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInF1b3RlX3BsdXMiLCAidXJsbGliIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVucXVvdGUiLCAidXJsbGliIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVucXVvdGVfcGx1cyIsICJ1cmxsaWIiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJsZW5jb2RlIiwgInVybGxpYiIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJzcGxpdHF1ZXJ5IiwgInVybGxpYiIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJzcGxpdHRhZyIsICJ1cmxsaWIiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgic3BsaXR1c2VyIiwgInVybGxpYiIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1c2VzX2ZyYWdtZW50IiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVzZXNfbmV0bG9jIiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVzZXNfcGFyYW1zIiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVzZXNfcXVlcnkiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXNlc19yZWxhdGl2ZSIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKXQpmb3IgYXR0ciBpbiBfdXJsbGliX3BhcnNlX21vdmVkX2F0dHJpYnV0ZXM6CiAgICBzZXRhdHRyKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3BhcnNlLCBhdHRyLm5hbWUsIGF0dHIpCmRlbCBhdHRyCgpNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9wYXJzZS5fbW92ZWRfYXR0cmlidXRlcyA9IF91cmxsaWJfcGFyc2VfbW92ZWRfYXR0cmlidXRlcwoKX2ltcG9ydGVyLl9hZGRfbW9kdWxlKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3BhcnNlKF9fbmFtZV9fICsgIi5tb3Zlcy51cmxsaWJfcGFyc2UiKSwKICAgICAgICAgICAgICAgICAgICAgICJtb3Zlcy51cmxsaWJfcGFyc2UiLCAibW92ZXMudXJsbGliLnBhcnNlIikKCgpjbGFzcyBNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9lcnJvcihfTGF6eU1vZHVsZSk6CgogICAgIiIiTGF6eSBsb2FkaW5nIG9mIG1vdmVkIG9iamVjdHMgaW4gc2l4Lm1vdmVzLnVybGxpYl9lcnJvciIiIgoKCl91cmxsaWJfZXJyb3JfbW92ZWRfYXR0cmlidXRlcyA9IFsKICAgIE1vdmVkQXR0cmlidXRlKCJVUkxFcnJvciIsICJ1cmxsaWIyIiwgInVybGxpYi5lcnJvciIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBFcnJvciIsICJ1cmxsaWIyIiwgInVybGxpYi5lcnJvciIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkNvbnRlbnRUb29TaG9ydEVycm9yIiwgInVybGxpYiIsICJ1cmxsaWIuZXJyb3IiKSwKXQpmb3IgYXR0ciBpbiBfdXJsbGliX2Vycm9yX21vdmVkX2F0dHJpYnV0ZXM6CiAgICBzZXRhdHRyKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX2Vycm9yLCBhdHRyLm5hbWUsIGF0dHIpCmRlbCBhdHRyCgpNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9lcnJvci5fbW92ZWRfYXR0cmlidXRlcyA9IF91cmxsaWJfZXJyb3JfbW92ZWRfYXR0cmlidXRlcwoKX2ltcG9ydGVyLl9hZGRfbW9kdWxlKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX2Vycm9yKF9fbmFtZV9fICsgIi5tb3Zlcy51cmxsaWIuZXJyb3IiKSwKICAgICAgICAgICAgICAgICAgICAgICJtb3Zlcy51cmxsaWJfZXJyb3IiLCAibW92ZXMudXJsbGliLmVycm9yIikKCgpjbGFzcyBNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yZXF1ZXN0KF9MYXp5TW9kdWxlKToKCiAgICAiIiJMYXp5IGxvYWRpbmcgb2YgbW92ZWQgb2JqZWN0cyBpbiBzaXgubW92ZXMudXJsbGliX3JlcXVlc3QiIiIKCgpfdXJsbGliX3JlcXVlc3RfbW92ZWRfYXR0cmlidXRlcyA9IFsKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmxvcGVuIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJpbnN0YWxsX29wZW5lciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiYnVpbGRfb3BlbmVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJwYXRobmFtZTJ1cmwiLCAidXJsbGliIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJsMnBhdGhuYW1lIiwgInVybGxpYiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImdldHByb3hpZXMiLCAidXJsbGliIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiUmVxdWVzdCIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiT3BlbmVyRGlyZWN0b3IiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBEZWZhdWx0RXJyb3JIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQUmVkaXJlY3RIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQQ29va2llUHJvY2Vzc29yIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJQcm94eUhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkJhc2VIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQUGFzc3dvcmRNZ3IiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBQYXNzd29yZE1ncldpdGhEZWZhdWx0UmVhbG0iLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkFic3RyYWN0QmFzaWNBdXRoSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUEJhc2ljQXV0aEhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlByb3h5QmFzaWNBdXRoSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiQWJzdHJhY3REaWdlc3RBdXRoSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUERpZ2VzdEF1dGhIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJQcm94eURpZ2VzdEF1dGhIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUFNIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJGaWxlSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiRlRQSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiQ2FjaGVGVFBIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJVbmtub3duSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUEVycm9yUHJvY2Vzc29yIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmxyZXRyaWV2ZSIsICJ1cmxsaWIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmxjbGVhbnVwIiwgInVybGxpYiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlVSTG9wZW5lciIsICJ1cmxsaWIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJGYW5jeVVSTG9wZW5lciIsICJ1cmxsaWIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJwcm94eV9ieXBhc3MiLCAidXJsbGliIiwgInVybGxpYi5yZXF1ZXN0IiksCl0KZm9yIGF0dHIgaW4gX3VybGxpYl9yZXF1ZXN0X21vdmVkX2F0dHJpYnV0ZXM6CiAgICBzZXRhdHRyKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3JlcXVlc3QsIGF0dHIubmFtZSwgYXR0cikKZGVsIGF0dHIKCk1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3JlcXVlc3QuX21vdmVkX2F0dHJpYnV0ZXMgPSBfdXJsbGliX3JlcXVlc3RfbW92ZWRfYXR0cmlidXRlcwoKX2ltcG9ydGVyLl9hZGRfbW9kdWxlKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3JlcXVlc3QoX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYi5yZXF1ZXN0IiksCiAgICAgICAgICAgICAgICAgICAgICAibW92ZXMudXJsbGliX3JlcXVlc3QiLCAibW92ZXMudXJsbGliLnJlcXVlc3QiKQoKCmNsYXNzIE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3Jlc3BvbnNlKF9MYXp5TW9kdWxlKToKCiAgICAiIiJMYXp5IGxvYWRpbmcgb2YgbW92ZWQgb2JqZWN0cyBpbiBzaXgubW92ZXMudXJsbGliX3Jlc3BvbnNlIiIiCgoKX3VybGxpYl9yZXNwb25zZV9tb3ZlZF9hdHRyaWJ1dGVzID0gWwogICAgTW92ZWRBdHRyaWJ1dGUoImFkZGJhc2UiLCAidXJsbGliIiwgInVybGxpYi5yZXNwb25zZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImFkZGNsb3NlaG9vayIsICJ1cmxsaWIiLCAidXJsbGliLnJlc3BvbnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiYWRkaW5mbyIsICJ1cmxsaWIiLCAidXJsbGliLnJlc3BvbnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiYWRkaW5mb3VybCIsICJ1cmxsaWIiLCAidXJsbGliLnJlc3BvbnNlIiksCl0KZm9yIGF0dHIgaW4gX3VybGxpYl9yZXNwb25zZV9tb3ZlZF9hdHRyaWJ1dGVzOgogICAgc2V0YXR0cihNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yZXNwb25zZSwgYXR0ci5uYW1lLCBhdHRyKQpkZWwgYXR0cgoKTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcmVzcG9uc2UuX21vdmVkX2F0dHJpYnV0ZXMgPSBfdXJsbGliX3Jlc3BvbnNlX21vdmVkX2F0dHJpYnV0ZXMKCl9pbXBvcnRlci5fYWRkX21vZHVsZShNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yZXNwb25zZShfX25hbWVfXyArICIubW92ZXMudXJsbGliLnJlc3BvbnNlIiksCiAgICAgICAgICAgICAgICAgICAgICAibW92ZXMudXJsbGliX3Jlc3BvbnNlIiwgIm1vdmVzLnVybGxpYi5yZXNwb25zZSIpCgoKY2xhc3MgTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcm9ib3RwYXJzZXIoX0xhenlNb2R1bGUpOgoKICAgICIiIkxhenkgbG9hZGluZyBvZiBtb3ZlZCBvYmplY3RzIGluIHNpeC5tb3Zlcy51cmxsaWJfcm9ib3RwYXJzZXIiIiIKCgpfdXJsbGliX3JvYm90cGFyc2VyX21vdmVkX2F0dHJpYnV0ZXMgPSBbCiAgICBNb3ZlZEF0dHJpYnV0ZSgiUm9ib3RGaWxlUGFyc2VyIiwgInJvYm90cGFyc2VyIiwgInVybGxpYi5yb2JvdHBhcnNlciIpLApdCmZvciBhdHRyIGluIF91cmxsaWJfcm9ib3RwYXJzZXJfbW92ZWRfYXR0cmlidXRlczoKICAgIHNldGF0dHIoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcm9ib3RwYXJzZXIsIGF0dHIubmFtZSwgYXR0cikKZGVsIGF0dHIKCk1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3JvYm90cGFyc2VyLl9tb3ZlZF9hdHRyaWJ1dGVzID0gX3VybGxpYl9yb2JvdHBhcnNlcl9tb3ZlZF9hdHRyaWJ1dGVzCgpfaW1wb3J0ZXIuX2FkZF9tb2R1bGUoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcm9ib3RwYXJzZXIoX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYi5yb2JvdHBhcnNlciIpLAogICAgICAgICAgICAgICAgICAgICAgIm1vdmVzLnVybGxpYl9yb2JvdHBhcnNlciIsICJtb3Zlcy51cmxsaWIucm9ib3RwYXJzZXIiKQoKCmNsYXNzIE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliKHR5cGVzLk1vZHVsZVR5cGUpOgoKICAgICIiIkNyZWF0ZSBhIHNpeC5tb3Zlcy51cmxsaWIgbmFtZXNwYWNlIHRoYXQgcmVzZW1ibGVzIHRoZSBQeXRob24gMyBuYW1lc3BhY2UiIiIKICAgIF9fcGF0aF9fID0gW10gICMgbWFyayBhcyBwYWNrYWdlCiAgICBwYXJzZSA9IF9pbXBvcnRlci5fZ2V0X21vZHVsZSgibW92ZXMudXJsbGliX3BhcnNlIikKICAgIGVycm9yID0gX2ltcG9ydGVyLl9nZXRfbW9kdWxlKCJtb3Zlcy51cmxsaWJfZXJyb3IiKQogICAgcmVxdWVzdCA9IF9pbXBvcnRlci5fZ2V0X21vZHVsZSgibW92ZXMudXJsbGliX3JlcXVlc3QiKQogICAgcmVzcG9uc2UgPSBfaW1wb3J0ZXIuX2dldF9tb2R1bGUoIm1vdmVzLnVybGxpYl9yZXNwb25zZSIpCiAgICByb2JvdHBhcnNlciA9IF9pbXBvcnRlci5fZ2V0X21vZHVsZSgibW92ZXMudXJsbGliX3JvYm90cGFyc2VyIikKCiAgICBkZWYgX19kaXJfXyhzZWxmKToKICAgICAgICByZXR1cm4gWydwYXJzZScsICdlcnJvcicsICdyZXF1ZXN0JywgJ3Jlc3BvbnNlJywgJ3JvYm90cGFyc2VyJ10KCl9pbXBvcnRlci5fYWRkX21vZHVsZShNb2R1bGVfc2l4X21vdmVzX3VybGxpYihfX25hbWVfXyArICIubW92ZXMudXJsbGliIiksCiAgICAgICAgICAgICAgICAgICAgICAibW92ZXMudXJsbGliIikKCgpkZWYgYWRkX21vdmUobW92ZSk6CiAgICAiIiJBZGQgYW4gaXRlbSB0byBzaXgubW92ZXMuIiIiCiAgICBzZXRhdHRyKF9Nb3ZlZEl0ZW1zLCBtb3ZlLm5hbWUsIG1vdmUpCgoKZGVmIHJlbW92ZV9tb3ZlKG5hbWUpOgogICAgIiIiUmVtb3ZlIGl0ZW0gZnJvbSBzaXgubW92ZXMuIiIiCiAgICB0cnk6CiAgICAgICAgZGVsYXR0cihfTW92ZWRJdGVtcywgbmFtZSkKICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGRlbCBtb3Zlcy5fX2RpY3RfX1tuYW1lXQogICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IoIm5vIHN1Y2ggbW92ZSwgJXIiICUgKG5hbWUsKSkKCgppZiBQWTM6CiAgICBfbWV0aF9mdW5jID0gIl9fZnVuY19fIgogICAgX21ldGhfc2VsZiA9ICJfX3NlbGZfXyIKCiAgICBfZnVuY19jbG9zdXJlID0gIl9fY2xvc3VyZV9fIgogICAgX2Z1bmNfY29kZSA9ICJfX2NvZGVfXyIKICAgIF9mdW5jX2RlZmF1bHRzID0gIl9fZGVmYXVsdHNfXyIKICAgIF9mdW5jX2dsb2JhbHMgPSAiX19nbG9iYWxzX18iCmVsc2U6CiAgICBfbWV0aF9mdW5jID0gImltX2Z1bmMiCiAgICBfbWV0aF9zZWxmID0gImltX3NlbGYiCgogICAgX2Z1bmNfY2xvc3VyZSA9ICJmdW5jX2Nsb3N1cmUiCiAgICBfZnVuY19jb2RlID0gImZ1bmNfY29kZSIKICAgIF9mdW5jX2RlZmF1bHRzID0gImZ1bmNfZGVmYXVsdHMiCiAgICBfZnVuY19nbG9iYWxzID0gImZ1bmNfZ2xvYmFscyIKCgp0cnk6CiAgICBhZHZhbmNlX2l0ZXJhdG9yID0gbmV4dApleGNlcHQgTmFtZUVycm9yOgogICAgZGVmIGFkdmFuY2VfaXRlcmF0b3IoaXQpOgogICAgICAgIHJldHVybiBpdC5uZXh0KCkKbmV4dCA9IGFkdmFuY2VfaXRlcmF0b3IKCgp0cnk6CiAgICBjYWxsYWJsZSA9IGNhbGxhYmxlCmV4Y2VwdCBOYW1lRXJyb3I6CiAgICBkZWYgY2FsbGFibGUob2JqKToKICAgICAgICByZXR1cm4gYW55KCJfX2NhbGxfXyIgaW4ga2xhc3MuX19kaWN0X18gZm9yIGtsYXNzIGluIHR5cGUob2JqKS5fX21yb19fKQoKCmlmIFBZMzoKICAgIGRlZiBnZXRfdW5ib3VuZF9mdW5jdGlvbih1bmJvdW5kKToKICAgICAgICByZXR1cm4gdW5ib3VuZAoKICAgIGNyZWF0ZV9ib3VuZF9tZXRob2QgPSB0eXBlcy5NZXRob2RUeXBlCgogICAgZGVmIGNyZWF0ZV91bmJvdW5kX21ldGhvZChmdW5jLCBjbHMpOgogICAgICAgIHJldHVybiBmdW5jCgogICAgSXRlcmF0b3IgPSBvYmplY3QKZWxzZToKICAgIGRlZiBnZXRfdW5ib3VuZF9mdW5jdGlvbih1bmJvdW5kKToKICAgICAgICByZXR1cm4gdW5ib3VuZC5pbV9mdW5jCgogICAgZGVmIGNyZWF0ZV9ib3VuZF9tZXRob2QoZnVuYywgb2JqKToKICAgICAgICByZXR1cm4gdHlwZXMuTWV0aG9kVHlwZShmdW5jLCBvYmosIG9iai5fX2NsYXNzX18pCgogICAgZGVmIGNyZWF0ZV91bmJvdW5kX21ldGhvZChmdW5jLCBjbHMpOgogICAgICAgIHJldHVybiB0eXBlcy5NZXRob2RUeXBlKGZ1bmMsIE5vbmUsIGNscykKCiAgICBjbGFzcyBJdGVyYXRvcihvYmplY3QpOgoKICAgICAgICBkZWYgbmV4dChzZWxmKToKICAgICAgICAgICAgcmV0dXJuIHR5cGUoc2VsZikuX19uZXh0X18oc2VsZikKCiAgICBjYWxsYWJsZSA9IGNhbGxhYmxlCl9hZGRfZG9jKGdldF91bmJvdW5kX2Z1bmN0aW9uLAogICAgICAgICAiIiJHZXQgdGhlIGZ1bmN0aW9uIG91dCBvZiBhIHBvc3NpYmx5IHVuYm91bmQgZnVuY3Rpb24iIiIpCgoKZ2V0X21ldGhvZF9mdW5jdGlvbiA9IG9wZXJhdG9yLmF0dHJnZXR0ZXIoX21ldGhfZnVuYykKZ2V0X21ldGhvZF9zZWxmID0gb3BlcmF0b3IuYXR0cmdldHRlcihfbWV0aF9zZWxmKQpnZXRfZnVuY3Rpb25fY2xvc3VyZSA9IG9wZXJhdG9yLmF0dHJnZXR0ZXIoX2Z1bmNfY2xvc3VyZSkKZ2V0X2Z1bmN0aW9uX2NvZGUgPSBvcGVyYXRvci5hdHRyZ2V0dGVyKF9mdW5jX2NvZGUpCmdldF9mdW5jdGlvbl9kZWZhdWx0cyA9IG9wZXJhdG9yLmF0dHJnZXR0ZXIoX2Z1bmNfZGVmYXVsdHMpCmdldF9mdW5jdGlvbl9nbG9iYWxzID0gb3BlcmF0b3IuYXR0cmdldHRlcihfZnVuY19nbG9iYWxzKQoKCmlmIFBZMzoKICAgIGRlZiBpdGVya2V5cyhkLCAqKmt3KToKICAgICAgICByZXR1cm4gaXRlcihkLmtleXMoKiprdykpCgogICAgZGVmIGl0ZXJ2YWx1ZXMoZCwgKiprdyk6CiAgICAgICAgcmV0dXJuIGl0ZXIoZC52YWx1ZXMoKiprdykpCgogICAgZGVmIGl0ZXJpdGVtcyhkLCAqKmt3KToKICAgICAgICByZXR1cm4gaXRlcihkLml0ZW1zKCoqa3cpKQoKICAgIGRlZiBpdGVybGlzdHMoZCwgKiprdyk6CiAgICAgICAgcmV0dXJuIGl0ZXIoZC5saXN0cygqKmt3KSkKCiAgICB2aWV3a2V5cyA9IG9wZXJhdG9yLm1ldGhvZGNhbGxlcigia2V5cyIpCgogICAgdmlld3ZhbHVlcyA9IG9wZXJhdG9yLm1ldGhvZGNhbGxlcigidmFsdWVzIikKCiAgICB2aWV3aXRlbXMgPSBvcGVyYXRvci5tZXRob2RjYWxsZXIoIml0ZW1zIikKZWxzZToKICAgIGRlZiBpdGVya2V5cyhkLCAqKmt3KToKICAgICAgICByZXR1cm4gZC5pdGVya2V5cygqKmt3KQoKICAgIGRlZiBpdGVydmFsdWVzKGQsICoqa3cpOgogICAgICAgIHJldHVybiBkLml0ZXJ2YWx1ZXMoKiprdykKCiAgICBkZWYgaXRlcml0ZW1zKGQsICoqa3cpOgogICAgICAgIHJldHVybiBkLml0ZXJpdGVtcygqKmt3KQoKICAgIGRlZiBpdGVybGlzdHMoZCwgKiprdyk6CiAgICAgICAgcmV0dXJuIGQuaXRlcmxpc3RzKCoqa3cpCgogICAgdmlld2tleXMgPSBvcGVyYXRvci5tZXRob2RjYWxsZXIoInZpZXdrZXlzIikKCiAgICB2aWV3dmFsdWVzID0gb3BlcmF0b3IubWV0aG9kY2FsbGVyKCJ2aWV3dmFsdWVzIikKCiAgICB2aWV3aXRlbXMgPSBvcGVyYXRvci5tZXRob2RjYWxsZXIoInZpZXdpdGVtcyIpCgpfYWRkX2RvYyhpdGVya2V5cywgIlJldHVybiBhbiBpdGVyYXRvciBvdmVyIHRoZSBrZXlzIG9mIGEgZGljdGlvbmFyeS4iKQpfYWRkX2RvYyhpdGVydmFsdWVzLCAiUmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIHZhbHVlcyBvZiBhIGRpY3Rpb25hcnkuIikKX2FkZF9kb2MoaXRlcml0ZW1zLAogICAgICAgICAiUmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIChrZXksIHZhbHVlKSBwYWlycyBvZiBhIGRpY3Rpb25hcnkuIikKX2FkZF9kb2MoaXRlcmxpc3RzLAogICAgICAgICAiUmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIChrZXksIFt2YWx1ZXNdKSBwYWlycyBvZiBhIGRpY3Rpb25hcnkuIikKCgppZiBQWTM6CiAgICBkZWYgYihzKToKICAgICAgICByZXR1cm4gcy5lbmNvZGUoImxhdGluLTEiKQoKICAgIGRlZiB1KHMpOgogICAgICAgIHJldHVybiBzCiAgICB1bmljaHIgPSBjaHIKICAgIGltcG9ydCBzdHJ1Y3QKICAgIGludDJieXRlID0gc3RydWN0LlN0cnVjdCgiPkIiKS5wYWNrCiAgICBkZWwgc3RydWN0CiAgICBieXRlMmludCA9IG9wZXJhdG9yLml0ZW1nZXR0ZXIoMCkKICAgIGluZGV4Ynl0ZXMgPSBvcGVyYXRvci5nZXRpdGVtCiAgICBpdGVyYnl0ZXMgPSBpdGVyCiAgICBpbXBvcnQgaW8KICAgIFN0cmluZ0lPID0gaW8uU3RyaW5nSU8KICAgIEJ5dGVzSU8gPSBpby5CeXRlc0lPCiAgICBfYXNzZXJ0Q291bnRFcXVhbCA9ICJhc3NlcnRDb3VudEVxdWFsIgogICAgaWYgc3lzLnZlcnNpb25faW5mb1sxXSA8PSAxOgogICAgICAgIF9hc3NlcnRSYWlzZXNSZWdleCA9ICJhc3NlcnRSYWlzZXNSZWdleHAiCiAgICAgICAgX2Fzc2VydFJlZ2V4ID0gImFzc2VydFJlZ2V4cE1hdGNoZXMiCiAgICBlbHNlOgogICAgICAgIF9hc3NlcnRSYWlzZXNSZWdleCA9ICJhc3NlcnRSYWlzZXNSZWdleCIKICAgICAgICBfYXNzZXJ0UmVnZXggPSAiYXNzZXJ0UmVnZXgiCmVsc2U6CiAgICBkZWYgYihzKToKICAgICAgICByZXR1cm4gcwogICAgIyBXb3JrYXJvdW5kIGZvciBzdGFuZGFsb25lIGJhY2tzbGFzaAoKICAgIGRlZiB1KHMpOgogICAgICAgIHJldHVybiB1bmljb2RlKHMucmVwbGFjZShyJ1xcJywgcidcXFxcJyksICJ1bmljb2RlX2VzY2FwZSIpCiAgICB1bmljaHIgPSB1bmljaHIKICAgIGludDJieXRlID0gY2hyCgogICAgZGVmIGJ5dGUyaW50KGJzKToKICAgICAgICByZXR1cm4gb3JkKGJzWzBdKQoKICAgIGRlZiBpbmRleGJ5dGVzKGJ1ZiwgaSk6CiAgICAgICAgcmV0dXJuIG9yZChidWZbaV0pCiAgICBpdGVyYnl0ZXMgPSBmdW5jdG9vbHMucGFydGlhbChpdGVydG9vbHMuaW1hcCwgb3JkKQogICAgaW1wb3J0IFN0cmluZ0lPCiAgICBTdHJpbmdJTyA9IEJ5dGVzSU8gPSBTdHJpbmdJTy5TdHJpbmdJTwogICAgX2Fzc2VydENvdW50RXF1YWwgPSAiYXNzZXJ0SXRlbXNFcXVhbCIKICAgIF9hc3NlcnRSYWlzZXNSZWdleCA9ICJhc3NlcnRSYWlzZXNSZWdleHAiCiAgICBfYXNzZXJ0UmVnZXggPSAiYXNzZXJ0UmVnZXhwTWF0Y2hlcyIKX2FkZF9kb2MoYiwgIiIiQnl0ZSBsaXRlcmFsIiIiKQpfYWRkX2RvYyh1LCAiIiJUZXh0IGxpdGVyYWwiIiIpCgoKZGVmIGFzc2VydENvdW50RXF1YWwoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgIHJldHVybiBnZXRhdHRyKHNlbGYsIF9hc3NlcnRDb3VudEVxdWFsKSgqYXJncywgKiprd2FyZ3MpCgoKZGVmIGFzc2VydFJhaXNlc1JlZ2V4KHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICByZXR1cm4gZ2V0YXR0cihzZWxmLCBfYXNzZXJ0UmFpc2VzUmVnZXgpKCphcmdzLCAqKmt3YXJncykKCgpkZWYgYXNzZXJ0UmVnZXgoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgIHJldHVybiBnZXRhdHRyKHNlbGYsIF9hc3NlcnRSZWdleCkoKmFyZ3MsICoqa3dhcmdzKQoKCmlmIFBZMzoKICAgIGV4ZWNfID0gZ2V0YXR0cihtb3Zlcy5idWlsdGlucywgImV4ZWMiKQoKICAgIGRlZiByZXJhaXNlKHRwLCB2YWx1ZSwgdGI9Tm9uZSk6CiAgICAgICAgaWYgdmFsdWUgaXMgTm9uZToKICAgICAgICAgICAgdmFsdWUgPSB0cCgpCiAgICAgICAgaWYgdmFsdWUuX190cmFjZWJhY2tfXyBpcyBub3QgdGI6CiAgICAgICAgICAgIHJhaXNlIHZhbHVlLndpdGhfdHJhY2ViYWNrKHRiKQogICAgICAgIHJhaXNlIHZhbHVlCgplbHNlOgogICAgZGVmIGV4ZWNfKF9jb2RlXywgX2dsb2JzXz1Ob25lLCBfbG9jc189Tm9uZSk6CiAgICAgICAgIiIiRXhlY3V0ZSBjb2RlIGluIGEgbmFtZXNwYWNlLiIiIgogICAgICAgIGlmIF9nbG9ic18gaXMgTm9uZToKICAgICAgICAgICAgZnJhbWUgPSBzeXMuX2dldGZyYW1lKDEpCiAgICAgICAgICAgIF9nbG9ic18gPSBmcmFtZS5mX2dsb2JhbHMKICAgICAgICAgICAgaWYgX2xvY3NfIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBfbG9jc18gPSBmcmFtZS5mX2xvY2FscwogICAgICAgICAgICBkZWwgZnJhbWUKICAgICAgICBlbGlmIF9sb2NzXyBpcyBOb25lOgogICAgICAgICAgICBfbG9jc18gPSBfZ2xvYnNfCiAgICAgICAgZXhlYygiIiJleGVjIF9jb2RlXyBpbiBfZ2xvYnNfLCBfbG9jc18iIiIpCgogICAgZXhlY18oIiIiZGVmIHJlcmFpc2UodHAsIHZhbHVlLCB0Yj1Ob25lKToKICAgIHJhaXNlIHRwLCB2YWx1ZSwgdGIKIiIiKQoKCmlmIHN5cy52ZXJzaW9uX2luZm9bOjJdID09ICgzLCAyKToKICAgIGV4ZWNfKCIiImRlZiByYWlzZV9mcm9tKHZhbHVlLCBmcm9tX3ZhbHVlKToKICAgIGlmIGZyb21fdmFsdWUgaXMgTm9uZToKICAgICAgICByYWlzZSB2YWx1ZQogICAgcmFpc2UgdmFsdWUgZnJvbSBmcm9tX3ZhbHVlCiIiIikKZWxpZiBzeXMudmVyc2lvbl9pbmZvWzoyXSA+ICgzLCAyKToKICAgIGV4ZWNfKCIiImRlZiByYWlzZV9mcm9tKHZhbHVlLCBmcm9tX3ZhbHVlKToKICAgIHJhaXNlIHZhbHVlIGZyb20gZnJvbV92YWx1ZQoiIiIpCmVsc2U6CiAgICBkZWYgcmFpc2VfZnJvbSh2YWx1ZSwgZnJvbV92YWx1ZSk6CiAgICAgICAgcmFpc2UgdmFsdWUKCgpwcmludF8gPSBnZXRhdHRyKG1vdmVzLmJ1aWx0aW5zLCAicHJpbnQiLCBOb25lKQppZiBwcmludF8gaXMgTm9uZToKICAgIGRlZiBwcmludF8oKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAiIiJUaGUgbmV3LXN0eWxlIHByaW50IGZ1bmN0aW9uIGZvciBQeXRob24gMi40IGFuZCAyLjUuIiIiCiAgICAgICAgZnAgPSBrd2FyZ3MucG9wKCJmaWxlIiwgc3lzLnN0ZG91dCkKICAgICAgICBpZiBmcCBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgZGVmIHdyaXRlKGRhdGEpOgogICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShkYXRhLCBiYXNlc3RyaW5nKToKICAgICAgICAgICAgICAgIGRhdGEgPSBzdHIoZGF0YSkKICAgICAgICAgICAgIyBJZiB0aGUgZmlsZSBoYXMgYW4gZW5jb2RpbmcsIGVuY29kZSB1bmljb2RlIHdpdGggaXQuCiAgICAgICAgICAgIGlmIChpc2luc3RhbmNlKGZwLCBmaWxlKSBhbmQKICAgICAgICAgICAgICAgICAgICBpc2luc3RhbmNlKGRhdGEsIHVuaWNvZGUpIGFuZAogICAgICAgICAgICAgICAgICAgIGZwLmVuY29kaW5nIGlzIG5vdCBOb25lKToKICAgICAgICAgICAgICAgIGVycm9ycyA9IGdldGF0dHIoZnAsICJlcnJvcnMiLCBOb25lKQogICAgICAgICAgICAgICAgaWYgZXJyb3JzIGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgICAgZXJyb3JzID0gInN0cmljdCIKICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLmVuY29kZShmcC5lbmNvZGluZywgZXJyb3JzKQogICAgICAgICAgICBmcC53cml0ZShkYXRhKQogICAgICAgIHdhbnRfdW5pY29kZSA9IEZhbHNlCiAgICAgICAgc2VwID0ga3dhcmdzLnBvcCgic2VwIiwgTm9uZSkKICAgICAgICBpZiBzZXAgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VwLCB1bmljb2RlKToKICAgICAgICAgICAgICAgIHdhbnRfdW5pY29kZSA9IFRydWUKICAgICAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZShzZXAsIHN0cik6CiAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoInNlcCBtdXN0IGJlIE5vbmUgb3IgYSBzdHJpbmciKQogICAgICAgIGVuZCA9IGt3YXJncy5wb3AoImVuZCIsIE5vbmUpCiAgICAgICAgaWYgZW5kIGlzIG5vdCBOb25lOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGVuZCwgdW5pY29kZSk6CiAgICAgICAgICAgICAgICB3YW50X3VuaWNvZGUgPSBUcnVlCiAgICAgICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2UoZW5kLCBzdHIpOgogICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJlbmQgbXVzdCBiZSBOb25lIG9yIGEgc3RyaW5nIikKICAgICAgICBpZiBrd2FyZ3M6CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiaW52YWxpZCBrZXl3b3JkIGFyZ3VtZW50cyB0byBwcmludCgpIikKICAgICAgICBpZiBub3Qgd2FudF91bmljb2RlOgogICAgICAgICAgICBmb3IgYXJnIGluIGFyZ3M6CiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGFyZywgdW5pY29kZSk6CiAgICAgICAgICAgICAgICAgICAgd2FudF91bmljb2RlID0gVHJ1ZQogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgaWYgd2FudF91bmljb2RlOgogICAgICAgICAgICBuZXdsaW5lID0gdW5pY29kZSgiXG4iKQogICAgICAgICAgICBzcGFjZSA9IHVuaWNvZGUoIiAiKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG5ld2xpbmUgPSAiXG4iCiAgICAgICAgICAgIHNwYWNlID0gIiAiCiAgICAgICAgaWYgc2VwIGlzIE5vbmU6CiAgICAgICAgICAgIHNlcCA9IHNwYWNlCiAgICAgICAgaWYgZW5kIGlzIE5vbmU6CiAgICAgICAgICAgIGVuZCA9IG5ld2xpbmUKICAgICAgICBmb3IgaSwgYXJnIGluIGVudW1lcmF0ZShhcmdzKToKICAgICAgICAgICAgaWYgaToKICAgICAgICAgICAgICAgIHdyaXRlKHNlcCkKICAgICAgICAgICAgd3JpdGUoYXJnKQogICAgICAgIHdyaXRlKGVuZCkKaWYgc3lzLnZlcnNpb25faW5mb1s6Ml0gPCAoMywgMyk6CiAgICBfcHJpbnQgPSBwcmludF8KCiAgICBkZWYgcHJpbnRfKCphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgZnAgPSBrd2FyZ3MuZ2V0KCJmaWxlIiwgc3lzLnN0ZG91dCkKICAgICAgICBmbHVzaCA9IGt3YXJncy5wb3AoImZsdXNoIiwgRmFsc2UpCiAgICAgICAgX3ByaW50KCphcmdzLCAqKmt3YXJncykKICAgICAgICBpZiBmbHVzaCBhbmQgZnAgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGZwLmZsdXNoKCkKCl9hZGRfZG9jKHJlcmFpc2UsICIiIlJlcmFpc2UgYW4gZXhjZXB0aW9uLiIiIikKCmlmIHN5cy52ZXJzaW9uX2luZm9bMDoyXSA8ICgzLCA0KToKICAgIGRlZiB3cmFwcyh3cmFwcGVkLCBhc3NpZ25lZD1mdW5jdG9vbHMuV1JBUFBFUl9BU1NJR05NRU5UUywKICAgICAgICAgICAgICB1cGRhdGVkPWZ1bmN0b29scy5XUkFQUEVSX1VQREFURVMpOgogICAgICAgIGRlZiB3cmFwcGVyKGYpOgogICAgICAgICAgICBmID0gZnVuY3Rvb2xzLndyYXBzKHdyYXBwZWQsIGFzc2lnbmVkLCB1cGRhdGVkKShmKQogICAgICAgICAgICBmLl9fd3JhcHBlZF9fID0gd3JhcHBlZAogICAgICAgICAgICByZXR1cm4gZgogICAgICAgIHJldHVybiB3cmFwcGVyCmVsc2U6CiAgICB3cmFwcyA9IGZ1bmN0b29scy53cmFwcwoKCmRlZiB3aXRoX21ldGFjbGFzcyhtZXRhLCAqYmFzZXMpOgogICAgIiIiQ3JlYXRlIGEgYmFzZSBjbGFzcyB3aXRoIGEgbWV0YWNsYXNzLiIiIgogICAgIyBUaGlzIHJlcXVpcmVzIGEgYml0IG9mIGV4cGxhbmF0aW9uOiB0aGUgYmFzaWMgaWRlYSBpcyB0byBtYWtlIGEgZHVtbXkKICAgICMgbWV0YWNsYXNzIGZvciBvbmUgbGV2ZWwgb2YgY2xhc3MgaW5zdGFudGlhdGlvbiB0aGF0IHJlcGxhY2VzIGl0c2VsZiB3aXRoCiAgICAjIHRoZSBhY3R1YWwgbWV0YWNsYXNzLgogICAgY2xhc3MgbWV0YWNsYXNzKG1ldGEpOgoKICAgICAgICBkZWYgX19uZXdfXyhjbHMsIG5hbWUsIHRoaXNfYmFzZXMsIGQpOgogICAgICAgICAgICByZXR1cm4gbWV0YShuYW1lLCBiYXNlcywgZCkKICAgIHJldHVybiB0eXBlLl9fbmV3X18obWV0YWNsYXNzLCAndGVtcG9yYXJ5X2NsYXNzJywgKCksIHt9KQoKCmRlZiBhZGRfbWV0YWNsYXNzKG1ldGFjbGFzcyk6CiAgICAiIiJDbGFzcyBkZWNvcmF0b3IgZm9yIGNyZWF0aW5nIGEgY2xhc3Mgd2l0aCBhIG1ldGFjbGFzcy4iIiIKICAgIGRlZiB3cmFwcGVyKGNscyk6CiAgICAgICAgb3JpZ192YXJzID0gY2xzLl9fZGljdF9fLmNvcHkoKQogICAgICAgIHNsb3RzID0gb3JpZ192YXJzLmdldCgnX19zbG90c19fJykKICAgICAgICBpZiBzbG90cyBpcyBub3QgTm9uZToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShzbG90cywgc3RyKToKICAgICAgICAgICAgICAgIHNsb3RzID0gW3Nsb3RzXQogICAgICAgICAgICBmb3Igc2xvdHNfdmFyIGluIHNsb3RzOgogICAgICAgICAgICAgICAgb3JpZ192YXJzLnBvcChzbG90c192YXIpCiAgICAgICAgb3JpZ192YXJzLnBvcCgnX19kaWN0X18nLCBOb25lKQogICAgICAgIG9yaWdfdmFycy5wb3AoJ19fd2Vha3JlZl9fJywgTm9uZSkKICAgICAgICByZXR1cm4gbWV0YWNsYXNzKGNscy5fX25hbWVfXywgY2xzLl9fYmFzZXNfXywgb3JpZ192YXJzKQogICAgcmV0dXJuIHdyYXBwZXIKCgpkZWYgcHl0aG9uXzJfdW5pY29kZV9jb21wYXRpYmxlKGtsYXNzKToKICAgICIiIgogICAgQSBkZWNvcmF0b3IgdGhhdCBkZWZpbmVzIF9fdW5pY29kZV9fIGFuZCBfX3N0cl9fIG1ldGhvZHMgdW5kZXIgUHl0aG9uIDIuCiAgICBVbmRlciBQeXRob24gMyBpdCBkb2VzIG5vdGhpbmcuCgogICAgVG8gc3VwcG9ydCBQeXRob24gMiBhbmQgMyB3aXRoIGEgc2luZ2xlIGNvZGUgYmFzZSwgZGVmaW5lIGEgX19zdHJfXyBtZXRob2QKICAgIHJldHVybmluZyB0ZXh0IGFuZCBhcHBseSB0aGlzIGRlY29yYXRvciB0byB0aGUgY2xhc3MuCiAgICAiIiIKICAgIGlmIFBZMjoKICAgICAgICBpZiAnX19zdHJfXycgbm90IGluIGtsYXNzLl9fZGljdF9fOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJAcHl0aG9uXzJfdW5pY29kZV9jb21wYXRpYmxlIGNhbm5vdCBiZSBhcHBsaWVkICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG8gJXMgYmVjYXVzZSBpdCBkb2Vzbid0IGRlZmluZSBfX3N0cl9fKCkuIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2xhc3MuX19uYW1lX18pCiAgICAgICAga2xhc3MuX191bmljb2RlX18gPSBrbGFzcy5fX3N0cl9fCiAgICAgICAga2xhc3MuX19zdHJfXyA9IGxhbWJkYSBzZWxmOiBzZWxmLl9fdW5pY29kZV9fKCkuZW5jb2RlKCd1dGYtOCcpCiAgICByZXR1cm4ga2xhc3MKCgojIENvbXBsZXRlIHRoZSBtb3ZlcyBpbXBsZW1lbnRhdGlvbi4KIyBUaGlzIGNvZGUgaXMgYXQgdGhlIGVuZCBvZiB0aGlzIG1vZHVsZSB0byBzcGVlZCB1cCBtb2R1bGUgbG9hZGluZy4KIyBUdXJuIHRoaXMgbW9kdWxlIGludG8gYSBwYWNrYWdlLgpfX3BhdGhfXyA9IFtdICAjIHJlcXVpcmVkIGZvciBQRVAgMzAyIGFuZCBQRVAgNDUxCl9fcGFja2FnZV9fID0gX19uYW1lX18gICMgc2VlIFBFUCAzNjYgQFJlc2VydmVkQXNzaWdubWVudAppZiBnbG9iYWxzKCkuZ2V0KCJfX3NwZWNfXyIpIGlzIG5vdCBOb25lOgogICAgX19zcGVjX18uc3VibW9kdWxlX3NlYXJjaF9sb2NhdGlvbnMgPSBbXSAgIyBQRVAgNDUxIEBVbmRlZmluZWRWYXJpYWJsZQojIFJlbW92ZSBvdGhlciBzaXggbWV0YSBwYXRoIGltcG9ydGVycywgc2luY2UgdGhleSBjYXVzZSBwcm9ibGVtcy4gVGhpcyBjYW4KIyBoYXBwZW4gaWYgc2l4IGlzIHJlbW92ZWQgZnJvbSBzeXMubW9kdWxlcyBhbmQgdGhlbiByZWxvYWRlZC4gKFNldHVwdG9vbHMgZG9lcwojIHRoaXMgZm9yIHNvbWUgcmVhc29uLikKaWYgc3lzLm1ldGFfcGF0aDoKICAgIGZvciBpLCBpbXBvcnRlciBpbiBlbnVtZXJhdGUoc3lzLm1ldGFfcGF0aCk6CiAgICAgICAgIyBIZXJlJ3Mgc29tZSByZWFsIG5hc3RpbmVzczogQW5vdGhlciAiaW5zdGFuY2UiIG9mIHRoZSBzaXggbW9kdWxlIG1pZ2h0CiAgICAgICAgIyBiZSBmbG9hdGluZyBhcm91bmQuIFRoZXJlZm9yZSwgd2UgY2FuJ3QgdXNlIGlzaW5zdGFuY2UoKSB0byBjaGVjayBmb3IKICAgICAgICAjIHRoZSBzaXggbWV0YSBwYXRoIGltcG9ydGVyLCBzaW5jZSB0aGUgb3RoZXIgc2l4IGluc3RhbmNlIHdpbGwgaGF2ZQogICAgICAgICMgaW5zZXJ0ZWQgYW4gaW1wb3J0ZXIgd2l0aCBkaWZmZXJlbnQgY2xhc3MuCiAgICAgICAgaWYgKHR5cGUoaW1wb3J0ZXIpLl9fbmFtZV9fID09ICJfU2l4TWV0YVBhdGhJbXBvcnRlciIgYW5kCiAgICAgICAgICAgICAgICBpbXBvcnRlci5uYW1lID09IF9fbmFtZV9fKToKICAgICAgICAgICAgZGVsIHN5cy5tZXRhX3BhdGhbaV0KICAgICAgICAgICAgYnJlYWsKICAgIGRlbCBpLCBpbXBvcnRlcgojIEZpbmFsbHksIGFkZCB0aGUgaW1wb3J0ZXIgdG8gdGhlIG1ldGEgcGF0aCBpbXBvcnQgaG9vay4Kc3lzLm1ldGFfcGF0aC5hcHBlbmQoX2ltcG9ydGVyKQpQSwMEFAAAAAAAAAAhAKWHZVHAGQAAwBkAAD8AAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9hcmNoaXZlX3V0aWwucHkiIiJVdGlsaXRpZXMgZm9yIGV4dHJhY3RpbmcgY29tbW9uIGFyY2hpdmUgZm9ybWF0cyIiIgoKaW1wb3J0IHppcGZpbGUKaW1wb3J0IHRhcmZpbGUKaW1wb3J0IG9zCmltcG9ydCBzaHV0aWwKaW1wb3J0IHBvc2l4cGF0aAppbXBvcnQgY29udGV4dGxpYgpmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc0Vycm9yCgpmcm9tIHBrZ19yZXNvdXJjZXMgaW1wb3J0IGVuc3VyZV9kaXJlY3RvcnkKCl9fYWxsX18gPSBbCiAgICAidW5wYWNrX2FyY2hpdmUiLCAidW5wYWNrX3ppcGZpbGUiLCAidW5wYWNrX3RhcmZpbGUiLCAiZGVmYXVsdF9maWx0ZXIiLAogICAgIlVucmVjb2duaXplZEZvcm1hdCIsICJleHRyYWN0aW9uX2RyaXZlcnMiLCAidW5wYWNrX2RpcmVjdG9yeSIsCl0KCgpjbGFzcyBVbnJlY29nbml6ZWRGb3JtYXQoRGlzdHV0aWxzRXJyb3IpOgogICAgIiIiQ291bGRuJ3QgcmVjb2duaXplIHRoZSBhcmNoaXZlIHR5cGUiIiIKCgpkZWYgZGVmYXVsdF9maWx0ZXIoc3JjLCBkc3QpOgogICAgIiIiVGhlIGRlZmF1bHQgcHJvZ3Jlc3MvZmlsdGVyIGNhbGxiYWNrOyByZXR1cm5zIFRydWUgZm9yIGFsbCBmaWxlcyIiIgogICAgcmV0dXJuIGRzdAoKCmRlZiB1bnBhY2tfYXJjaGl2ZShmaWxlbmFtZSwgZXh0cmFjdF9kaXIsIHByb2dyZXNzX2ZpbHRlcj1kZWZhdWx0X2ZpbHRlciwKICAgICAgICBkcml2ZXJzPU5vbmUpOgogICAgIiIiVW5wYWNrIGBmaWxlbmFtZWAgdG8gYGV4dHJhY3RfZGlyYCwgb3IgcmFpc2UgYGBVbnJlY29nbml6ZWRGb3JtYXRgYAoKICAgIGBwcm9ncmVzc19maWx0ZXJgIGlzIGEgZnVuY3Rpb24gdGFraW5nIHR3byBhcmd1bWVudHM6IGEgc291cmNlIHBhdGgKICAgIGludGVybmFsIHRvIHRoZSBhcmNoaXZlICgnLyctc2VwYXJhdGVkKSwgYW5kIGEgZmlsZXN5c3RlbSBwYXRoIHdoZXJlIGl0CiAgICB3aWxsIGJlIGV4dHJhY3RlZC4gIFRoZSBjYWxsYmFjayBtdXN0IHJldHVybiB0aGUgZGVzaXJlZCBleHRyYWN0IHBhdGgKICAgICh3aGljaCBtYXkgYmUgdGhlIHNhbWUgYXMgdGhlIG9uZSBwYXNzZWQgaW4pLCBvciBlbHNlIGBgTm9uZWBgIHRvIHNraXAKICAgIHRoYXQgZmlsZSBvciBkaXJlY3RvcnkuICBUaGUgY2FsbGJhY2sgY2FuIHRodXMgYmUgdXNlZCB0byByZXBvcnQgb24gdGhlCiAgICBwcm9ncmVzcyBvZiB0aGUgZXh0cmFjdGlvbiwgYXMgd2VsbCBhcyB0byBmaWx0ZXIgdGhlIGl0ZW1zIGV4dHJhY3RlZCBvcgogICAgYWx0ZXIgdGhlaXIgZXh0cmFjdGlvbiBwYXRocy4KCiAgICBgZHJpdmVyc2AsIGlmIHN1cHBsaWVkLCBtdXN0IGJlIGEgbm9uLWVtcHR5IHNlcXVlbmNlIG9mIGZ1bmN0aW9ucyB3aXRoIHRoZQogICAgc2FtZSBzaWduYXR1cmUgYXMgdGhpcyBmdW5jdGlvbiAobWludXMgdGhlIGBkcml2ZXJzYCBhcmd1bWVudCksIHRoYXQgcmFpc2UKICAgIGBgVW5yZWNvZ25pemVkRm9ybWF0YGAgaWYgdGhleSBkbyBub3Qgc3VwcG9ydCBleHRyYWN0aW5nIHRoZSBkZXNpZ25hdGVkCiAgICBhcmNoaXZlIHR5cGUuICBUaGUgYGRyaXZlcnNgIGFyZSB0cmllZCBpbiBzZXF1ZW5jZSB1bnRpbCBvbmUgaXMgZm91bmQgdGhhdAogICAgZG9lcyBub3QgcmFpc2UgYW4gZXJyb3IsIG9yIHVudGlsIGFsbCBhcmUgZXhoYXVzdGVkIChpbiB3aGljaCBjYXNlCiAgICBgYFVucmVjb2duaXplZEZvcm1hdGBgIGlzIHJhaXNlZCkuICBJZiB5b3UgZG8gbm90IHN1cHBseSBhIHNlcXVlbmNlIG9mCiAgICBkcml2ZXJzLCB0aGUgbW9kdWxlJ3MgYGBleHRyYWN0aW9uX2RyaXZlcnNgYCBjb25zdGFudCB3aWxsIGJlIHVzZWQsIHdoaWNoCiAgICBtZWFucyB0aGF0IGBgdW5wYWNrX3ppcGZpbGVgYCBhbmQgYGB1bnBhY2tfdGFyZmlsZWBgIHdpbGwgYmUgdHJpZWQsIGluIHRoYXQKICAgIG9yZGVyLgogICAgIiIiCiAgICBmb3IgZHJpdmVyIGluIGRyaXZlcnMgb3IgZXh0cmFjdGlvbl9kcml2ZXJzOgogICAgICAgIHRyeToKICAgICAgICAgICAgZHJpdmVyKGZpbGVuYW1lLCBleHRyYWN0X2RpciwgcHJvZ3Jlc3NfZmlsdGVyKQogICAgICAgIGV4Y2VwdCBVbnJlY29nbml6ZWRGb3JtYXQ6CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuCiAgICBlbHNlOgogICAgICAgIHJhaXNlIFVucmVjb2duaXplZEZvcm1hdCgKICAgICAgICAgICAgIk5vdCBhIHJlY29nbml6ZWQgYXJjaGl2ZSB0eXBlOiAlcyIgJSBmaWxlbmFtZQogICAgICAgICkKCgpkZWYgdW5wYWNrX2RpcmVjdG9yeShmaWxlbmFtZSwgZXh0cmFjdF9kaXIsIHByb2dyZXNzX2ZpbHRlcj1kZWZhdWx0X2ZpbHRlcik6CiAgICAiIiIiVW5wYWNrIiBhIGRpcmVjdG9yeSwgdXNpbmcgdGhlIHNhbWUgaW50ZXJmYWNlIGFzIGZvciBhcmNoaXZlcwoKICAgIFJhaXNlcyBgYFVucmVjb2duaXplZEZvcm1hdGBgIGlmIGBmaWxlbmFtZWAgaXMgbm90IGEgZGlyZWN0b3J5CiAgICAiIiIKICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKGZpbGVuYW1lKToKICAgICAgICByYWlzZSBVbnJlY29nbml6ZWRGb3JtYXQoIiVzIGlzIG5vdCBhIGRpcmVjdG9yeSIgJSBmaWxlbmFtZSkKCiAgICBwYXRocyA9IHsKICAgICAgICBmaWxlbmFtZTogKCcnLCBleHRyYWN0X2RpciksCiAgICB9CiAgICBmb3IgYmFzZSwgZGlycywgZmlsZXMgaW4gb3Mud2FsayhmaWxlbmFtZSk6CiAgICAgICAgc3JjLCBkc3QgPSBwYXRoc1tiYXNlXQogICAgICAgIGZvciBkIGluIGRpcnM6CiAgICAgICAgICAgIHBhdGhzW29zLnBhdGguam9pbihiYXNlLCBkKV0gPSBzcmMgKyBkICsgJy8nLCBvcy5wYXRoLmpvaW4oZHN0LCBkKQogICAgICAgIGZvciBmIGluIGZpbGVzOgogICAgICAgICAgICB0YXJnZXQgPSBvcy5wYXRoLmpvaW4oZHN0LCBmKQogICAgICAgICAgICB0YXJnZXQgPSBwcm9ncmVzc19maWx0ZXIoc3JjICsgZiwgdGFyZ2V0KQogICAgICAgICAgICBpZiBub3QgdGFyZ2V0OgogICAgICAgICAgICAgICAgIyBza2lwIG5vbi1maWxlcwogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgZW5zdXJlX2RpcmVjdG9yeSh0YXJnZXQpCiAgICAgICAgICAgIGYgPSBvcy5wYXRoLmpvaW4oYmFzZSwgZikKICAgICAgICAgICAgc2h1dGlsLmNvcHlmaWxlKGYsIHRhcmdldCkKICAgICAgICAgICAgc2h1dGlsLmNvcHlzdGF0KGYsIHRhcmdldCkKCgpkZWYgdW5wYWNrX3ppcGZpbGUoZmlsZW5hbWUsIGV4dHJhY3RfZGlyLCBwcm9ncmVzc19maWx0ZXI9ZGVmYXVsdF9maWx0ZXIpOgogICAgIiIiVW5wYWNrIHppcCBgZmlsZW5hbWVgIHRvIGBleHRyYWN0X2RpcmAKCiAgICBSYWlzZXMgYGBVbnJlY29nbml6ZWRGb3JtYXRgYCBpZiBgZmlsZW5hbWVgIGlzIG5vdCBhIHppcGZpbGUgKGFzIGRldGVybWluZWQKICAgIGJ5IGBgemlwZmlsZS5pc196aXBmaWxlKClgYCkuICBTZWUgYGB1bnBhY2tfYXJjaGl2ZSgpYGAgZm9yIGFuIGV4cGxhbmF0aW9uCiAgICBvZiB0aGUgYHByb2dyZXNzX2ZpbHRlcmAgYXJndW1lbnQuCiAgICAiIiIKCiAgICBpZiBub3QgemlwZmlsZS5pc196aXBmaWxlKGZpbGVuYW1lKToKICAgICAgICByYWlzZSBVbnJlY29nbml6ZWRGb3JtYXQoIiVzIGlzIG5vdCBhIHppcCBmaWxlIiAlIChmaWxlbmFtZSwpKQoKICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKGZpbGVuYW1lKSBhcyB6OgogICAgICAgIGZvciBpbmZvIGluIHouaW5mb2xpc3QoKToKICAgICAgICAgICAgbmFtZSA9IGluZm8uZmlsZW5hbWUKCiAgICAgICAgICAgICMgZG9uJ3QgZXh0cmFjdCBhYnNvbHV0ZSBwYXRocyBvciBvbmVzIHdpdGggLi4gaW4gdGhlbQogICAgICAgICAgICBpZiBuYW1lLnN0YXJ0c3dpdGgoJy8nKSBvciAnLi4nIGluIG5hbWUuc3BsaXQoJy8nKToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICB0YXJnZXQgPSBvcy5wYXRoLmpvaW4oZXh0cmFjdF9kaXIsICpuYW1lLnNwbGl0KCcvJykpCiAgICAgICAgICAgIHRhcmdldCA9IHByb2dyZXNzX2ZpbHRlcihuYW1lLCB0YXJnZXQpCiAgICAgICAgICAgIGlmIG5vdCB0YXJnZXQ6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBpZiBuYW1lLmVuZHN3aXRoKCcvJyk6CiAgICAgICAgICAgICAgICAjIGRpcmVjdG9yeQogICAgICAgICAgICAgICAgZW5zdXJlX2RpcmVjdG9yeSh0YXJnZXQpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIGZpbGUKICAgICAgICAgICAgICAgIGVuc3VyZV9kaXJlY3RvcnkodGFyZ2V0KQogICAgICAgICAgICAgICAgZGF0YSA9IHoucmVhZChpbmZvLmZpbGVuYW1lKQogICAgICAgICAgICAgICAgd2l0aCBvcGVuKHRhcmdldCwgJ3diJykgYXMgZjoKICAgICAgICAgICAgICAgICAgICBmLndyaXRlKGRhdGEpCiAgICAgICAgICAgIHVuaXhfYXR0cmlidXRlcyA9IGluZm8uZXh0ZXJuYWxfYXR0ciA+PiAxNgogICAgICAgICAgICBpZiB1bml4X2F0dHJpYnV0ZXM6CiAgICAgICAgICAgICAgICBvcy5jaG1vZCh0YXJnZXQsIHVuaXhfYXR0cmlidXRlcykKCgpkZWYgdW5wYWNrX3RhcmZpbGUoZmlsZW5hbWUsIGV4dHJhY3RfZGlyLCBwcm9ncmVzc19maWx0ZXI9ZGVmYXVsdF9maWx0ZXIpOgogICAgIiIiVW5wYWNrIHRhci90YXIuZ3ovdGFyLmJ6MiBgZmlsZW5hbWVgIHRvIGBleHRyYWN0X2RpcmAKCiAgICBSYWlzZXMgYGBVbnJlY29nbml6ZWRGb3JtYXRgYCBpZiBgZmlsZW5hbWVgIGlzIG5vdCBhIHRhcmZpbGUgKGFzIGRldGVybWluZWQKICAgIGJ5IGBgdGFyZmlsZS5vcGVuKClgYCkuICBTZWUgYGB1bnBhY2tfYXJjaGl2ZSgpYGAgZm9yIGFuIGV4cGxhbmF0aW9uCiAgICBvZiB0aGUgYHByb2dyZXNzX2ZpbHRlcmAgYXJndW1lbnQuCiAgICAiIiIKICAgIHRyeToKICAgICAgICB0YXJvYmogPSB0YXJmaWxlLm9wZW4oZmlsZW5hbWUpCiAgICBleGNlcHQgdGFyZmlsZS5UYXJFcnJvcjoKICAgICAgICByYWlzZSBVbnJlY29nbml6ZWRGb3JtYXQoCiAgICAgICAgICAgICIlcyBpcyBub3QgYSBjb21wcmVzc2VkIG9yIHVuY29tcHJlc3NlZCB0YXIgZmlsZSIgJSAoZmlsZW5hbWUsKQogICAgICAgICkKICAgIHdpdGggY29udGV4dGxpYi5jbG9zaW5nKHRhcm9iaik6CiAgICAgICAgIyBkb24ndCBkbyBhbnkgY2hvd25pbmchCiAgICAgICAgdGFyb2JqLmNob3duID0gbGFtYmRhICphcmdzOiBOb25lCiAgICAgICAgZm9yIG1lbWJlciBpbiB0YXJvYmo6CiAgICAgICAgICAgIG5hbWUgPSBtZW1iZXIubmFtZQogICAgICAgICAgICAjIGRvbid0IGV4dHJhY3QgYWJzb2x1dGUgcGF0aHMgb3Igb25lcyB3aXRoIC4uIGluIHRoZW0KICAgICAgICAgICAgaWYgbm90IG5hbWUuc3RhcnRzd2l0aCgnLycpIGFuZCAnLi4nIG5vdCBpbiBuYW1lLnNwbGl0KCcvJyk6CiAgICAgICAgICAgICAgICBwcmVsaW1fZHN0ID0gb3MucGF0aC5qb2luKGV4dHJhY3RfZGlyLCAqbmFtZS5zcGxpdCgnLycpKQoKICAgICAgICAgICAgICAgICMgcmVzb2x2ZSBhbnkgbGlua3MgYW5kIHRvIGV4dHJhY3QgdGhlIGxpbmsgdGFyZ2V0cyBhcyBub3JtYWwKICAgICAgICAgICAgICAgICMgZmlsZXMKICAgICAgICAgICAgICAgIHdoaWxlIG1lbWJlciBpcyBub3QgTm9uZSBhbmQgKG1lbWJlci5pc2xuaygpIG9yIG1lbWJlci5pc3N5bSgpKToKICAgICAgICAgICAgICAgICAgICBsaW5rcGF0aCA9IG1lbWJlci5saW5rbmFtZQogICAgICAgICAgICAgICAgICAgIGlmIG1lbWJlci5pc3N5bSgpOgogICAgICAgICAgICAgICAgICAgICAgICBiYXNlID0gcG9zaXhwYXRoLmRpcm5hbWUobWVtYmVyLm5hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtwYXRoID0gcG9zaXhwYXRoLmpvaW4oYmFzZSwgbGlua3BhdGgpCiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtwYXRoID0gcG9zaXhwYXRoLm5vcm1wYXRoKGxpbmtwYXRoKQogICAgICAgICAgICAgICAgICAgIG1lbWJlciA9IHRhcm9iai5fZ2V0bWVtYmVyKGxpbmtwYXRoKQoKICAgICAgICAgICAgICAgIGlmIG1lbWJlciBpcyBub3QgTm9uZSBhbmQgKG1lbWJlci5pc2ZpbGUoKSBvciBtZW1iZXIuaXNkaXIoKSk6CiAgICAgICAgICAgICAgICAgICAgZmluYWxfZHN0ID0gcHJvZ3Jlc3NfZmlsdGVyKG5hbWUsIHByZWxpbV9kc3QpCiAgICAgICAgICAgICAgICAgICAgaWYgZmluYWxfZHN0OgogICAgICAgICAgICAgICAgICAgICAgICBpZiBmaW5hbF9kc3QuZW5kc3dpdGgob3Muc2VwKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsX2RzdCA9IGZpbmFsX2RzdFs6LTFdCiAgICAgICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgWFhYIFVnaAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyb2JqLl9leHRyYWN0X21lbWJlcihtZW1iZXIsIGZpbmFsX2RzdCkKICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IHRhcmZpbGUuRXh0cmFjdEVycm9yOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBjaG93bi9jaG1vZC9ta2ZpZm8vbWtub2RlL21ha2VkZXYgZmFpbGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgcmV0dXJuIFRydWUKCgpleHRyYWN0aW9uX2RyaXZlcnMgPSB1bnBhY2tfZGlyZWN0b3J5LCB1bnBhY2tfemlwZmlsZSwgdW5wYWNrX3RhcmZpbGUKUEsDBBQAAAAAAAAAIQDGtbJjfSUAAH0lAAA9AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvYnVpbGRfbWV0YS5weSIiIkEgUEVQIDUxNyBpbnRlcmZhY2UgdG8gc2V0dXB0b29scwoKUHJldmlvdXNseSwgd2hlbiBhIHVzZXIgb3IgYSBjb21tYW5kIGxpbmUgdG9vbCAobGV0J3MgY2FsbCBpdCBhICJmcm9udGVuZCIpCm5lZWRlZCB0byBtYWtlIGEgcmVxdWVzdCBvZiBzZXR1cHRvb2xzIHRvIHRha2UgYSBjZXJ0YWluIGFjdGlvbiwgZm9yCmV4YW1wbGUsIGdlbmVyYXRpbmcgYSBsaXN0IG9mIGluc3RhbGxhdGlvbiByZXF1aXJlbWVudHMsIHRoZSBmcm9udGVuZCB3b3VsZAp3b3VsZCBjYWxsICJzZXR1cC5weSBlZ2dfaW5mbyIgb3IgInNldHVwLnB5IGJkaXN0X3doZWVsIiBvbiB0aGUgY29tbWFuZCBsaW5lLgoKUEVQIDUxNyBkZWZpbmVzIGEgZGlmZmVyZW50IG1ldGhvZCBvZiBpbnRlcmZhY2luZyB3aXRoIHNldHVwdG9vbHMuIFJhdGhlcgp0aGFuIGNhbGxpbmcgInNldHVwLnB5IiBkaXJlY3RseSwgdGhlIGZyb250ZW5kIHNob3VsZDoKCiAgMS4gU2V0IHRoZSBjdXJyZW50IGRpcmVjdG9yeSB0byB0aGUgZGlyZWN0b3J5IHdpdGggYSBzZXR1cC5weSBmaWxlCiAgMi4gSW1wb3J0IHRoaXMgbW9kdWxlIGludG8gYSBzYWZlIHB5dGhvbiBpbnRlcnByZXRlciAob25lIGluIHdoaWNoCiAgICAgc2V0dXB0b29scyBjYW4gcG90ZW50aWFsbHkgc2V0IGdsb2JhbCB2YXJpYWJsZXMgb3IgY3Jhc2ggaGFyZCkuCiAgMy4gQ2FsbCBvbmUgb2YgdGhlIGZ1bmN0aW9ucyBkZWZpbmVkIGluIFBFUCA1MTcuCgpXaGF0IGVhY2ggZnVuY3Rpb24gZG9lcyBpcyBkZWZpbmVkIGluIFBFUCA1MTcuIEhvd2V2ZXIsIGhlcmUgaXMgYSAiY2FzdWFsIgpkZWZpbml0aW9uIG9mIHRoZSBmdW5jdGlvbnMgKHRoaXMgZGVmaW5pdGlvbiBzaG91bGQgbm90IGJlIHJlbGllZCBvbiBmb3IKYnVnIHJlcG9ydHMgb3IgQVBJIHN0YWJpbGl0eSk6CgogIC0gYGJ1aWxkX3doZWVsYDogYnVpbGQgYSB3aGVlbCBpbiB0aGUgZm9sZGVyIGFuZCByZXR1cm4gdGhlIGJhc2VuYW1lCiAgLSBgZ2V0X3JlcXVpcmVzX2Zvcl9idWlsZF93aGVlbGA6IGdldCB0aGUgYHNldHVwX3JlcXVpcmVzYCB0byBidWlsZAogIC0gYHByZXBhcmVfbWV0YWRhdGFfZm9yX2J1aWxkX3doZWVsYDogZ2V0IHRoZSBgaW5zdGFsbF9yZXF1aXJlc2AKICAtIGBidWlsZF9zZGlzdGA6IGJ1aWxkIGFuIHNkaXN0IGluIHRoZSBmb2xkZXIgYW5kIHJldHVybiB0aGUgYmFzZW5hbWUKICAtIGBnZXRfcmVxdWlyZXNfZm9yX2J1aWxkX3NkaXN0YDogZ2V0IHRoZSBgc2V0dXBfcmVxdWlyZXNgIHRvIGJ1aWxkCgpBZ2FpbiwgdGhpcyBpcyBub3QgYSBmb3JtYWwgZGVmaW5pdGlvbiEgSnVzdCBhICJ0YXN0ZSIgb2YgdGhlIG1vZHVsZS4KIiIiCgppbXBvcnQgaW8KaW1wb3J0IG9zCmltcG9ydCBzeXMKaW1wb3J0IHRva2VuaXplCmltcG9ydCBzaHV0aWwKaW1wb3J0IGNvbnRleHRsaWIKCmltcG9ydCBzZXR1cHRvb2xzCmltcG9ydCBkaXN0dXRpbHMKZnJvbSBzZXR1cHRvb2xzLnB5MzFjb21wYXQgaW1wb3J0IFRlbXBvcmFyeURpcmVjdG9yeQoKZnJvbSBwa2dfcmVzb3VyY2VzIGltcG9ydCBwYXJzZV9yZXF1aXJlbWVudHMKZnJvbSBwa2dfcmVzb3VyY2VzLnB5MzFjb21wYXQgaW1wb3J0IG1ha2VkaXJzCgpfX2FsbF9fID0gWydnZXRfcmVxdWlyZXNfZm9yX2J1aWxkX3NkaXN0JywKICAgICAgICAgICAnZ2V0X3JlcXVpcmVzX2Zvcl9idWlsZF93aGVlbCcsCiAgICAgICAgICAgJ3ByZXBhcmVfbWV0YWRhdGFfZm9yX2J1aWxkX3doZWVsJywKICAgICAgICAgICAnYnVpbGRfd2hlZWwnLAogICAgICAgICAgICdidWlsZF9zZGlzdCcsCiAgICAgICAgICAgJ19fbGVnYWN5X18nLAogICAgICAgICAgICdTZXR1cFJlcXVpcmVtZW50c0Vycm9yJ10KCmNsYXNzIFNldHVwUmVxdWlyZW1lbnRzRXJyb3IoQmFzZUV4Y2VwdGlvbik6CiAgICBkZWYgX19pbml0X18oc2VsZiwgc3BlY2lmaWVycyk6CiAgICAgICAgc2VsZi5zcGVjaWZpZXJzID0gc3BlY2lmaWVycwoKCmNsYXNzIERpc3RyaWJ1dGlvbihzZXR1cHRvb2xzLmRpc3QuRGlzdHJpYnV0aW9uKToKICAgIGRlZiBmZXRjaF9idWlsZF9lZ2dzKHNlbGYsIHNwZWNpZmllcnMpOgogICAgICAgIHNwZWNpZmllcl9saXN0ID0gbGlzdChtYXAoc3RyLCBwYXJzZV9yZXF1aXJlbWVudHMoc3BlY2lmaWVycykpKQoKICAgICAgICByYWlzZSBTZXR1cFJlcXVpcmVtZW50c0Vycm9yKHNwZWNpZmllcl9saXN0KQoKICAgIEBjbGFzc21ldGhvZAogICAgQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKICAgIGRlZiBwYXRjaChjbHMpOgogICAgICAgICIiIgogICAgICAgIFJlcGxhY2UKICAgICAgICBkaXN0dXRpbHMuZGlzdC5EaXN0cmlidXRpb24gd2l0aCB0aGlzIGNsYXNzCiAgICAgICAgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGlzIGNvbnRleHQuCiAgICAgICAgIiIiCiAgICAgICAgb3JpZyA9IGRpc3R1dGlscy5jb3JlLkRpc3RyaWJ1dGlvbgogICAgICAgIGRpc3R1dGlscy5jb3JlLkRpc3RyaWJ1dGlvbiA9IGNscwogICAgICAgIHRyeToKICAgICAgICAgICAgeWllbGQKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBkaXN0dXRpbHMuY29yZS5EaXN0cmlidXRpb24gPSBvcmlnCgoKZGVmIF90b19zdHIocyk6CiAgICAiIiIKICAgIENvbnZlcnQgYSBmaWxlbmFtZSB0byBhIHN0cmluZyAob24gUHl0aG9uIDIsIGV4cGxpY2l0bHkKICAgIGEgYnl0ZSBzdHJpbmcsIG5vdCBVbmljb2RlKSBhcyBkaXN0dXRpbHMgY2hlY2tzIGZvciB0aGUKICAgIGV4YWN0IHR5cGUgc3RyLgogICAgIiIiCiAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdID09IDIgYW5kIG5vdCBpc2luc3RhbmNlKHMsIHN0cik6CiAgICAgICAgIyBBc3N1bWUgaXQncyBVbmljb2RlLCBhcyB0aGF0J3Mgd2hhdCB0aGUgUEVQIHNheXMKICAgICAgICAjIHNob3VsZCBiZSBwcm92aWRlZC4KICAgICAgICByZXR1cm4gcy5lbmNvZGUoc3lzLmdldGZpbGVzeXN0ZW1lbmNvZGluZygpKQogICAgcmV0dXJuIHMKCgpkZWYgX2dldF9pbW1lZGlhdGVfc3ViZGlyZWN0b3JpZXMoYV9kaXIpOgogICAgcmV0dXJuIFtuYW1lIGZvciBuYW1lIGluIG9zLmxpc3RkaXIoYV9kaXIpCiAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIob3MucGF0aC5qb2luKGFfZGlyLCBuYW1lKSldCgoKZGVmIF9maWxlX3dpdGhfZXh0ZW5zaW9uKGRpcmVjdG9yeSwgZXh0ZW5zaW9uKToKICAgIG1hdGNoaW5nID0gKAogICAgICAgIGYgZm9yIGYgaW4gb3MubGlzdGRpcihkaXJlY3RvcnkpCiAgICAgICAgaWYgZi5lbmRzd2l0aChleHRlbnNpb24pCiAgICApCiAgICBmaWxlLCA9IG1hdGNoaW5nCiAgICByZXR1cm4gZmlsZQoKCmRlZiBfb3Blbl9zZXR1cF9zY3JpcHQoc2V0dXBfc2NyaXB0KToKICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzZXR1cF9zY3JpcHQpOgogICAgICAgICMgU3VwcGx5IGEgZGVmYXVsdCBzZXR1cC5weQogICAgICAgIHJldHVybiBpby5TdHJpbmdJTyh1ImZyb20gc2V0dXB0b29scyBpbXBvcnQgc2V0dXA7IHNldHVwKCkiKQoKICAgIHJldHVybiBnZXRhdHRyKHRva2VuaXplLCAnb3BlbicsIG9wZW4pKHNldHVwX3NjcmlwdCkKCgpjbGFzcyBfQnVpbGRNZXRhQmFja2VuZChvYmplY3QpOgoKICAgIGRlZiBfZml4X2NvbmZpZyhzZWxmLCBjb25maWdfc2V0dGluZ3MpOgogICAgICAgIGNvbmZpZ19zZXR0aW5ncyA9IGNvbmZpZ19zZXR0aW5ncyBvciB7fQogICAgICAgIGNvbmZpZ19zZXR0aW5ncy5zZXRkZWZhdWx0KCctLWdsb2JhbC1vcHRpb24nLCBbXSkKICAgICAgICByZXR1cm4gY29uZmlnX3NldHRpbmdzCgogICAgZGVmIF9nZXRfYnVpbGRfcmVxdWlyZXMoc2VsZiwgY29uZmlnX3NldHRpbmdzLCByZXF1aXJlbWVudHMpOgogICAgICAgIGNvbmZpZ19zZXR0aW5ncyA9IHNlbGYuX2ZpeF9jb25maWcoY29uZmlnX3NldHRpbmdzKQoKICAgICAgICBzeXMuYXJndiA9IHN5cy5hcmd2WzoxXSArIFsnZWdnX2luZm8nXSArIFwKICAgICAgICAgICAgY29uZmlnX3NldHRpbmdzWyItLWdsb2JhbC1vcHRpb24iXQogICAgICAgIHRyeToKICAgICAgICAgICAgd2l0aCBEaXN0cmlidXRpb24ucGF0Y2goKToKICAgICAgICAgICAgICAgIHNlbGYucnVuX3NldHVwKCkKICAgICAgICBleGNlcHQgU2V0dXBSZXF1aXJlbWVudHNFcnJvciBhcyBlOgogICAgICAgICAgICByZXF1aXJlbWVudHMgKz0gZS5zcGVjaWZpZXJzCgogICAgICAgIHJldHVybiByZXF1aXJlbWVudHMKCiAgICBkZWYgcnVuX3NldHVwKHNlbGYsIHNldHVwX3NjcmlwdD0nc2V0dXAucHknKToKICAgICAgICAjIE5vdGUgdGhhdCB3ZSBjYW4gcmV1c2Ugb3VyIGJ1aWxkIGRpcmVjdG9yeSBiZXR3ZWVuIGNhbGxzCiAgICAgICAgIyBDb3JyZWN0bmVzcyBjb21lcyBmaXJzdCwgdGhlbiBvcHRpbWl6YXRpb24gbGF0ZXIKICAgICAgICBfX2ZpbGVfXyA9IHNldHVwX3NjcmlwdAogICAgICAgIF9fbmFtZV9fID0gJ19fbWFpbl9fJwoKICAgICAgICB3aXRoIF9vcGVuX3NldHVwX3NjcmlwdChfX2ZpbGVfXykgYXMgZjoKICAgICAgICAgICAgY29kZSA9IGYucmVhZCgpLnJlcGxhY2UocidcclxuJywgcidcbicpCgogICAgICAgIGV4ZWMoY29tcGlsZShjb2RlLCBfX2ZpbGVfXywgJ2V4ZWMnKSwgbG9jYWxzKCkpCgogICAgZGVmIGdldF9yZXF1aXJlc19mb3JfYnVpbGRfd2hlZWwoc2VsZiwgY29uZmlnX3NldHRpbmdzPU5vbmUpOgogICAgICAgIGNvbmZpZ19zZXR0aW5ncyA9IHNlbGYuX2ZpeF9jb25maWcoY29uZmlnX3NldHRpbmdzKQogICAgICAgIHJldHVybiBzZWxmLl9nZXRfYnVpbGRfcmVxdWlyZXMoY29uZmlnX3NldHRpbmdzLCByZXF1aXJlbWVudHM9Wyd3aGVlbCddKQoKICAgIGRlZiBnZXRfcmVxdWlyZXNfZm9yX2J1aWxkX3NkaXN0KHNlbGYsIGNvbmZpZ19zZXR0aW5ncz1Ob25lKToKICAgICAgICBjb25maWdfc2V0dGluZ3MgPSBzZWxmLl9maXhfY29uZmlnKGNvbmZpZ19zZXR0aW5ncykKICAgICAgICByZXR1cm4gc2VsZi5fZ2V0X2J1aWxkX3JlcXVpcmVzKGNvbmZpZ19zZXR0aW5ncywgcmVxdWlyZW1lbnRzPVtdKQoKICAgIGRlZiBwcmVwYXJlX21ldGFkYXRhX2Zvcl9idWlsZF93aGVlbChzZWxmLCBtZXRhZGF0YV9kaXJlY3RvcnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnX3NldHRpbmdzPU5vbmUpOgogICAgICAgIHN5cy5hcmd2ID0gc3lzLmFyZ3ZbOjFdICsgWydkaXN0X2luZm8nLCAnLS1lZ2ctYmFzZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RvX3N0cihtZXRhZGF0YV9kaXJlY3RvcnkpXQogICAgICAgIHNlbGYucnVuX3NldHVwKCkKCiAgICAgICAgZGlzdF9pbmZvX2RpcmVjdG9yeSA9IG1ldGFkYXRhX2RpcmVjdG9yeQogICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgIGRpc3RfaW5mb3MgPSBbZiBmb3IgZiBpbiBvcy5saXN0ZGlyKGRpc3RfaW5mb19kaXJlY3RvcnkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgZi5lbmRzd2l0aCgnLmRpc3QtaW5mbycpXQoKICAgICAgICAgICAgaWYgKGxlbihkaXN0X2luZm9zKSA9PSAwIGFuZAogICAgICAgICAgICAgICAgbGVuKF9nZXRfaW1tZWRpYXRlX3N1YmRpcmVjdG9yaWVzKGRpc3RfaW5mb19kaXJlY3RvcnkpKSA9PSAxKToKCiAgICAgICAgICAgICAgICBkaXN0X2luZm9fZGlyZWN0b3J5ID0gb3MucGF0aC5qb2luKAogICAgICAgICAgICAgICAgICAgIGRpc3RfaW5mb19kaXJlY3RvcnksIG9zLmxpc3RkaXIoZGlzdF9pbmZvX2RpcmVjdG9yeSlbMF0pCiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgYXNzZXJ0IGxlbihkaXN0X2luZm9zKSA9PSAxCiAgICAgICAgICAgIGJyZWFrCgogICAgICAgICMgUEVQIDUxNyByZXF1aXJlcyB0aGF0IHRoZSAuZGlzdC1pbmZvIGRpcmVjdG9yeSBiZSBwbGFjZWQgaW4gdGhlCiAgICAgICAgIyBtZXRhZGF0YV9kaXJlY3RvcnkuIFRvIGNvbXBseSwgd2UgTVVTVCBjb3B5IHRoZSBkaXJlY3RvcnkgdG8gdGhlIHJvb3QKICAgICAgICBpZiBkaXN0X2luZm9fZGlyZWN0b3J5ICE9IG1ldGFkYXRhX2RpcmVjdG9yeToKICAgICAgICAgICAgc2h1dGlsLm1vdmUoCiAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oZGlzdF9pbmZvX2RpcmVjdG9yeSwgZGlzdF9pbmZvc1swXSksCiAgICAgICAgICAgICAgICBtZXRhZGF0YV9kaXJlY3RvcnkpCiAgICAgICAgICAgIHNodXRpbC5ybXRyZWUoZGlzdF9pbmZvX2RpcmVjdG9yeSwgaWdub3JlX2Vycm9ycz1UcnVlKQoKICAgICAgICByZXR1cm4gZGlzdF9pbmZvc1swXQoKICAgIGRlZiBfYnVpbGRfd2l0aF90ZW1wX2RpcihzZWxmLCBzZXR1cF9jb21tYW5kLCByZXN1bHRfZXh0ZW5zaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdF9kaXJlY3RvcnksIGNvbmZpZ19zZXR0aW5ncyk6CiAgICAgICAgY29uZmlnX3NldHRpbmdzID0gc2VsZi5fZml4X2NvbmZpZyhjb25maWdfc2V0dGluZ3MpCiAgICAgICAgcmVzdWx0X2RpcmVjdG9yeSA9IG9zLnBhdGguYWJzcGF0aChyZXN1bHRfZGlyZWN0b3J5KQoKICAgICAgICAjIEJ1aWxkIGluIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSwgdGhlbiBjb3B5IHRvIHRoZSB0YXJnZXQuCiAgICAgICAgbWFrZWRpcnMocmVzdWx0X2RpcmVjdG9yeSwgZXhpc3Rfb2s9VHJ1ZSkKICAgICAgICB3aXRoIFRlbXBvcmFyeURpcmVjdG9yeShkaXI9cmVzdWx0X2RpcmVjdG9yeSkgYXMgdG1wX2Rpc3RfZGlyOgogICAgICAgICAgICBzeXMuYXJndiA9IChzeXMuYXJndls6MV0gKyBzZXR1cF9jb21tYW5kICsKICAgICAgICAgICAgICAgICAgICAgICAgWyctLWRpc3QtZGlyJywgdG1wX2Rpc3RfZGlyXSArCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ19zZXR0aW5nc1siLS1nbG9iYWwtb3B0aW9uIl0pCiAgICAgICAgICAgIHNlbGYucnVuX3NldHVwKCkKCiAgICAgICAgICAgIHJlc3VsdF9iYXNlbmFtZSA9IF9maWxlX3dpdGhfZXh0ZW5zaW9uKHRtcF9kaXN0X2RpciwgcmVzdWx0X2V4dGVuc2lvbikKICAgICAgICAgICAgcmVzdWx0X3BhdGggPSBvcy5wYXRoLmpvaW4ocmVzdWx0X2RpcmVjdG9yeSwgcmVzdWx0X2Jhc2VuYW1lKQogICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhyZXN1bHRfcGF0aCk6CiAgICAgICAgICAgICAgICAjIG9zLnJlbmFtZSB3aWxsIGZhaWwgb3ZlcndyaXRpbmcgb24gbm9uLVVuaXguCiAgICAgICAgICAgICAgICBvcy5yZW1vdmUocmVzdWx0X3BhdGgpCiAgICAgICAgICAgIG9zLnJlbmFtZShvcy5wYXRoLmpvaW4odG1wX2Rpc3RfZGlyLCByZXN1bHRfYmFzZW5hbWUpLCByZXN1bHRfcGF0aCkKCiAgICAgICAgcmV0dXJuIHJlc3VsdF9iYXNlbmFtZQoKCiAgICBkZWYgYnVpbGRfd2hlZWwoc2VsZiwgd2hlZWxfZGlyZWN0b3J5LCBjb25maWdfc2V0dGluZ3M9Tm9uZSwKICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YV9kaXJlY3Rvcnk9Tm9uZSk6CiAgICAgICAgcmV0dXJuIHNlbGYuX2J1aWxkX3dpdGhfdGVtcF9kaXIoWydiZGlzdF93aGVlbCddLCAnLndobCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlZWxfZGlyZWN0b3J5LCBjb25maWdfc2V0dGluZ3MpCgogICAgZGVmIGJ1aWxkX3NkaXN0KHNlbGYsIHNkaXN0X2RpcmVjdG9yeSwgY29uZmlnX3NldHRpbmdzPU5vbmUpOgogICAgICAgIHJldHVybiBzZWxmLl9idWlsZF93aXRoX3RlbXBfZGlyKFsnc2Rpc3QnLCAnLS1mb3JtYXRzJywgJ2d6dGFyJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy50YXIuZ3onLCBzZGlzdF9kaXJlY3RvcnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnX3NldHRpbmdzKQoKCmNsYXNzIF9CdWlsZE1ldGFMZWdhY3lCYWNrZW5kKF9CdWlsZE1ldGFCYWNrZW5kKToKICAgICIiIkNvbXBhdGliaWxpdHkgYmFja2VuZCBmb3Igc2V0dXB0b29scwoKICAgIFRoaXMgaXMgYSB2ZXJzaW9uIG9mIHNldHVwdG9vbHMuYnVpbGRfbWV0YSB0aGF0IGVuZGVhdm9ycyB0byBtYWludGFpbiBiYWNrd2FyZHMKICAgIGNvbXBhdGliaWxpdHkgd2l0aCBwcmUtUEVQIDUxNyBtb2RlcyBvZiBpbnZvY2F0aW9uLiBJdCBleGlzdHMgYXMgYSB0ZW1wb3JhcnkKICAgIGJyaWRnZSBiZXR3ZWVuIHRoZSBvbGQgcGFja2FnaW5nIG1lY2hhbmlzbSBhbmQgdGhlIG5ldyBwYWNrYWdpbmcgbWVjaGFuaXNtLAogICAgYW5kIHdpbGwgZXZlbnR1YWxseSBiZSByZW1vdmVkLgogICAgIiIiCiAgICBkZWYgcnVuX3NldHVwKHNlbGYsIHNldHVwX3NjcmlwdD0nc2V0dXAucHknKToKICAgICAgICAjIEluIG9yZGVyIHRvIG1haW50YWluIGNvbXBhdGliaWxpdHkgd2l0aCBzY3JpcHRzIGFzc3VtaW5nIHRoYXQKICAgICAgICAjIHRoZSBzZXR1cC5weSBzY3JpcHQgaXMgaW4gYSBkaXJlY3Rvcnkgb24gdGhlIFBZVEhPTlBBVEgsIGluamVjdAogICAgICAgICMgJycgaW50byBzeXMucGF0aC4gKHB5cGEvc2V0dXB0b29scyMxNjQyKQogICAgICAgIHN5c19wYXRoID0gbGlzdChzeXMucGF0aCkgICAgICAgICAgICMgU2F2ZSB0aGUgb3JpZ2luYWwgcGF0aAoKICAgICAgICBzY3JpcHRfZGlyID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGguYWJzcGF0aChzZXR1cF9zY3JpcHQpKQogICAgICAgIGlmIHNjcmlwdF9kaXIgbm90IGluIHN5cy5wYXRoOgogICAgICAgICAgICBzeXMucGF0aC5pbnNlcnQoMCwgc2NyaXB0X2RpcikKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzdXBlcihfQnVpbGRNZXRhTGVnYWN5QmFja2VuZCwKICAgICAgICAgICAgICAgICAgc2VsZikucnVuX3NldHVwKHNldHVwX3NjcmlwdD1zZXR1cF9zY3JpcHQpCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgIyBXaGlsZSBQRVAgNTE3IGZyb250ZW5kcyBzaG91bGQgYmUgY2FsbGluZyBlYWNoIGhvb2sgaW4gYSBmcmVzaAogICAgICAgICAgICAjIHN1YnByb2Nlc3MgYWNjb3JkaW5nIHRvIHRoZSBzdGFuZGFyZCAoYW5kIHRodXMgaXQgc2hvdWxkIG5vdCBiZQogICAgICAgICAgICAjIHN0cmljdGx5IG5lY2Vzc2FyeSB0byByZXN0b3JlIHRoZSBvbGQgc3lzLnBhdGgpLCB3ZSdsbCByZXN0b3JlCiAgICAgICAgICAgICMgdGhlIG9yaWdpbmFsIHBhdGggc28gdGhhdCB0aGUgcGF0aCBtYW5pcHVsYXRpb24gZG9lcyBub3QgcGVyc2lzdAogICAgICAgICAgICAjIHdpdGhpbiB0aGUgaG9vayBhZnRlciBydW5fc2V0dXAgaXMgY2FsbGVkLgogICAgICAgICAgICBzeXMucGF0aFs6XSA9IHN5c19wYXRoCgojIFRoZSBwcmltYXJ5IGJhY2tlbmQKX0JBQ0tFTkQgPSBfQnVpbGRNZXRhQmFja2VuZCgpCgpnZXRfcmVxdWlyZXNfZm9yX2J1aWxkX3doZWVsID0gX0JBQ0tFTkQuZ2V0X3JlcXVpcmVzX2Zvcl9idWlsZF93aGVlbApnZXRfcmVxdWlyZXNfZm9yX2J1aWxkX3NkaXN0ID0gX0JBQ0tFTkQuZ2V0X3JlcXVpcmVzX2Zvcl9idWlsZF9zZGlzdApwcmVwYXJlX21l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/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//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UFBqBY1N9FFqAY2NQOX//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//8cACQAAAFNTU1NT6Bq1//+DxBTr0IvIwfkFjTyNoCpBAIvwg+YfweYGiw8PvkwOBIPhAXTGUOhsIwAAWYld/IsH9kQGBAF0Mf91COjgIgAAWVD/FeTgQACFwHUL/xVc4EAAiUXk6wOJXeQ5XeR0Gegxtf//i03kiQjoFLX//8cACQAAAINN5P/HRfz+////6AkAAACLReToh7X//8P/dQjooiMAAFnDi/9Vi+yD7BBTM9s5XQh1HOjWtP//U1NTU1PHABYAAADoXrT//4PEFDPA62pWi3UM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D4XoAAAAiV34OV0YdQiLB4tABIlFGIs17OBAADPAOV0gU1P/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////toQAAADoY67///+2iAAAAOhYrv///7aMAAAA6E2u////tpAAAADoQq7///+2lAAAAOg3rv///7aYAAAA6Cyu////tpwAAADoIa7///+2oAAAAOgWrv///7akAAAA6Auu////tqgAAADoAK7//4PELF5dw4v/VYvsVot1CIX2dDWLBjsFSB1BAHQHUOjdrf//WYtGBDsFTB1BAHQHUOjLrf//WYt2CDs1UB1BAHQHVui5rf//WV5dw4v/VYvsVot1CIX2dH6LRgw7BVQdQQB0B1Dol63/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bWUgZXJyb3IgAAANCgAAVExPU1MgZXJyb3INCgAAAFNJTkcgZXJyb3INCgAAAABET01BSU4gZXJyb3INCgAAUjYwMzQNCkFuIGFwcGxpY2F0aW9uIGhhcyBtYWRlIGFuIGF0dGVtcHQgdG8gbG9hZCB0aGUgQyBydW50aW1lIGxpYnJhcnkgaW5jb3JyZWN0bHkuClBsZWFzZSBjb250YWN0IHRoZSBhcHBsaWNhdGlvbidzIHN1cHBvcnQgdGVhbSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4NCgAAAAAAAFI2MDMzDQotIEF0dGVtcHQgdG8gdXNlIE1TSUwgY29kZSBmcm9tIHRoaXMgYXNzZW1ibHkgZHVyaW5nIG5hdGl2ZSBjb2RlIGluaXRpYWxpemF0aW9uClRoaXMgaW5kaWNhdGVzIGEgYnVnIGluIHlvdXIgYXBwbGljYXRpb24uIEl0IGlzIG1vc3QgbGlrZWx5IHRoZSByZXN1bHQgb2YgY2FsbGluZyBhbiBNU0lMLWNvbXBpbGVkICgvY2xyKSBmdW5jdGlvbiBmcm9tIGEgbmF0aXZlIGNvbnN0cnVjdG9yIG9yIGZyb20gRGxsTWFpbi4NCgAAUjYwMzINCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgbG9jYWxlIGluZm9ybWF0aW9uDQoAAAAAAABSNjAzMQ0KLSBBdHRlbXB0IHRvIGluaXRpYWxpemUgdGhlIENSVCBtb3JlIHRoYW4gb25jZS4KVGhpcyBpbmRpY2F0ZXMgYSBidWcgaW4geW91ciBhcHBsaWNhdGlvbi4NCgAAUjYwMzANCi0gQ1JUIG5vdCBpbml0aWFsaXplZA0KAABSNjAyOA0KLSB1bmFibGUgdG8gaW5pdGlhbGl6ZSBoZWFwDQoAAAAAUjYwMjcNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgbG93aW8gaW5pdGlhbGl6YXRpb24NCgAAAABSNjAyNg0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBzdGRpbyBpbml0aWFsaXphdGlvbg0KAAAAAFI2MDI1DQotIHB1cmUgdmlydHVhbCBmdW5jdGlvbiBjYWxsDQoAAABSNjAyNA0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBfb25leGl0L2F0ZXhpdCB0YWJsZQ0KAAAAAFI2MDE5DQotIHVuYWJsZSB0byBvcGVuIGNvbnNvbGUgZGV2aWNlDQoAAAAAUjYwMTgNCi0gdW5leHBlY3RlZCBoZWFwIGVycm9yDQoAAAAAUjYwMTcNCi0gdW5leHBlY3RlZCBtdWx0aXRocmVhZCBsb2NrIGVycm9yDQoAAAAAUjYwMTYNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgdGhyZWFkIGRhdGENCgANClRoaXMgYXBwbGljYXRpb24gaGFzIHJlcXVlc3RlZCB0aGUgUnVudGltZSB0byB0ZXJtaW5hdGUgaXQgaW4gYW4gdW51c3VhbCB3YXkuClBsZWFzZSBjb250YWN0IHRoZSBhcHBsaWNhdGlvbidzIHN1cHBvcnQgdGVhbSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4NCgAAAFI2MDA5DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIGVudmlyb25tZW50DQoAUjYwMDgNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgYXJndW1lbnRzDQoAAABSNjAwMg0KLSBmbG9hdGluZyBwb2ludCBzdXBwb3J0IG5vdCBsb2FkZWQNCgAAAABNaWNyb3NvZnQgVmlzdWFsIEMrKyBSdW50aW1lIExpYnJhcnkAAAAACgoAAC4uLgA8cHJvZ3JhbSBuYW1lIHVua25vd24+AABSdW50aW1lIEVycm9yIQoKUHJvZ3JhbTogAAAAAAAAAAUAAMALAAAAAAAAAB0AAMAEAAAAAAAAAJYAAMAEAAAAAAAAAI0AAMAIAAAAAAAAAI4AAMAIAAAAAAAAAI8AAMAIAAAAAAAAAJAAAMAIAAAAAAAAAJEAAMAIAAAAAAAAAJIAAMAIAAAAAAAAAJMAAMAIAAAAAAAAAAaAgIaAgYAAABADhoCGgoAUBQVFRUWFhYUFAAAwMIBQgIgACAAoJzhQV4AABwA3MDBQUIgAAAAgKICIgIAAAABgaGBoaGgICAd4cHB3cHAICAAACAAIAAcIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgACAAIAAgACAAIAAgACAAIAAoACgAKAAoACgAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAASAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACEAIQAhACEAIQAhACEAIQAhACEABAAEAAQABAAEAAQABAAgQCBAIEAgQCBAIEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABAAEAAQABAAEAAQAIIAggCCAIIAggCCAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAQABAAEAAQACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAgACAAIAAgACAAIAAgACAAaAAoACgAKAAoACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAEgAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAhACEAIQAhACEAIQAhACEAIQAhAAQABAAEAAQABAAEAAQAIEBgQGBAYEBgQGBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEQABAAEAAQABAAEACCAYIBggGCAYIBggECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgEC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NUAAQDVAAAAAAAD+////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+BFRsc0dldFZhbHVlADwEVGxzQWxsb2MAAD8EVGxzU2V0VmFsdWUAPQRUbHNGcmVlAPQDU2V0TGFzdEVycm9yAACuAUdldEN1cnJlbnRUaHJlYWRJZAAAlwRXcml0ZUZpbGUA9gJMb2FkTGlicmFyeUEAALoCSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbkFuZFNwaW5Db3VudABLAUZyZWVFbnZpcm9ubWVudFN0cmluZ3NBAMABR2V0RW52aXJvbm1lbnRTdHJpbmdzAEwBRnJlZUVudmlyb25tZW50U3RyaW5nc1cAhARXaWRlQ2hhclRvTXVsdGlCeXRlAMIBR2V0RW52aXJvbm1lbnRTdHJpbmdzVwAApAJIZWFwQ3JlYXRlAABhBFZpcnR1YWxGcmVlAFkDUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIAagJHZXRUaWNrQ291bnQAAKsBR2V0Q3VycmVudFByb2Nlc3NJZABTAkdldFN5c3RlbVRpbWVBc0ZpbGVUaW1lAJoDUnRsVW53aW5kAKkCSGVhcFJlQWxsb2MAXgRWaXJ0dWFsQWxsb2MAAIQBR2V0Q29uc29sZUNQAACWAUdldENvbnNvbGVNb2RlAABCAUZsdXNoRmlsZUJ1ZmZlcnMAAOYCTENNYXBTdHJpbmdBAAAfA011bHRpQnl0ZVRvV2lkZUNoYXIA6AJMQ01hcFN0cmluZ1cAAEACR2V0U3RyaW5nVHlwZUEAAEMCR2V0U3RyaW5nVHlwZVcAAOkBR2V0TG9jYWxlSW5mb0EAAOcDU2V0RmlsZVBvaW50ZXIAAKsCSGVhcFNpemUAAEQAQ2xvc2VIYW5kbGUAjARXcml0ZUNvbnNvbGVBAJoBR2V0Q29uc29sZU91dHB1dENQAACWBFdyaXRlQ29uc29sZVcABgRTZXRTdGRIYW5kbGUAAHkAQ3JlYXRlRmlsZUEAUwBDb21wYXJlU3RyaW5nQQAAVgBDb21wYXJlU3RyaW5n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YXRpdmUgY29kZSBpbml0aWFsaXphdGlvbgpUaGlzIGluZGljYXRlcyBhIGJ1ZyBpbiB5b3VyIGFwcGxpY2F0aW9uLiBJdCBpcyBtb3N0IGxpa2VseSB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgYW4gTVNJTC1jb21waWxlZCAoL2NscikgZnVuY3Rpb24gZnJvbSBhIG5hdGl2ZSBjb25zdHJ1Y3RvciBvciBmcm9tIERsbE1haW4uDQoAAFI2MDMyDQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIGxvY2FsZSBpbmZvcm1hdGlvbg0KAAAAAAAAUjYwMzENCi0gQXR0ZW1wdCB0byBpbml0aWFsaXplIHRoZSBDUlQgbW9yZSB0aGFuIG9uY2UuClRoaXMgaW5kaWNhdGVzIGEgYnVnIGluIHlvdXIgYXBwbGljYXRpb24uDQoAAAAAAABSNjAzMA0KLSBDUlQgbm90IGluaXRpYWxpemVkDQoAAFI2MDI4DQotIHVuYWJsZSB0byBpbml0aWFsaXplIGhlYXANCgAAAABSNjAyNw0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBsb3dpbyBpbml0aWFsaXphdGlvbg0KAAAAAFI2MDI2DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIHN0ZGlvIGluaXRpYWxpemF0aW9uDQoAAAAAUjYwMjUNCi0gcHVyZSB2aXJ0dWFsIGZ1bmN0aW9uIGNhbGwNCgAAAFI2MDI0DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIF9vbmV4aXQvYXRleGl0IHRhYmxlDQoAAAAAUjYwMTkNCi0gdW5hYmxlIHRvIG9wZW4gY29uc29sZSBkZXZpY2UNCgAAAAAAAAAAUjYwMTgNCi0gdW5leHBlY3RlZCBoZWFwIGVycm9yDQoAAAAAAAAAAFI2MDE3DQotIHVuZXhwZWN0ZWQgbXVsdGl0aHJlYWQgbG9jayBlcnJvcg0KAAAAAFI2MDE2DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIHRocmVhZCBkYXRhDQoAAAAAAAAAAAAAAAAADQpUaGlzIGFwcGxpY2F0aW9uIGhhcyByZXF1ZXN0ZWQgdGhlIFJ1bnRpbWUgdG8gdGVybWluYXRlIGl0IGluIGFuIHVudXN1YWwgd2F5LgpQbGVhc2UgY29udGFjdCB0aGUgYXBwbGljYXRpb24ncyBzdXBwb3J0IHRlYW0gZm9yIG1vcmUgaW5mb3JtYXRpb24uDQoAAABSNjAwOQ0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBlbnZpcm9ubWVudA0KAAAAAABSNjAwOA0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBhcmd1bWVudHMNCgAAAAAAAABSNjAwMg0KLSBmbG9hdGluZyBwb2ludCBzdXBwb3J0IG5vdCBsb2FkZWQNCgAAAABNaWNyb3NvZnQgVmlzdWFsIEMrKyBSdW50aW1lIExpYnJhcnkAAAAACgoAAC4uLgA8cHJvZ3JhbSBuYW1lIHVua25vd24+AABSdW50aW1lIEVycm9yIQoKUHJvZ3JhbTogAAAAAAAAAAUAAMALAAAAAAAAAAAAAAAdAADABAAAAAAAAAAAAAAAlgAAwAQAAAAAAAAAAAAAAI0AAMAIAAAAAAAAAAAAAACOAADACAAAAAAAAAAAAAAAjwAAwAgAAAAAAAAAAAAAAJAAAMAIAAAAAAAAAAAAAACRAADACAAAAAAAAAAAAAAAkgAAwAgAAAAAAAAAAAAAAJMAAMAIAAAAAAAAAAAAAAAGgICGgIGAAAAQA4aAhoKAFAUFRUVFhYWFBQAAMDCAUICIAAgAKCc4UFeAAAcANzAwUFCIAAAAICiAiICAAAAAYGhgaGhoCAgHeHBwd3BwCAgAAAgACAAHCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAgACAAIAAgACAAIAAgACAAKAAoACgAKAAoACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAEgAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAhACEAIQAhACEAIQAhACEAIQAhAAQABAAEAAQABAAEAAQAIEAgQCBAIEAgQCBAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAQABAAEAAQABAAEACCAIIAggCCAIIAggACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAEAAQABAAEAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAIAAgACAAIAAgACAAIAAgAGgAKAAoACgAKAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIABIABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAIQAhACEAIQAhACEAIQAhACEAIQAEAAQABAAEAAQABAAEACBAYEBgQGBAYEBgQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBEAAQABAAEAAQABAAggGCAYIBggGCAYIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECARAAEAAQABAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAASAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAFAAUABAAEAAQABAAEAAUABAAEAAQABAAEAAQAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEQAAEBAQEBAQEBAQEBAQEBAgECAQIBAgEC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AAAAcBYBAAAAAACAFgEAAAAAAJYWAQAAAAAAohYBAAAAAACuFgEAAAAAAL4WAQAAAAAA5hYBAAAAAAAAFwEAAAAAABgXAQAAAAAAMhcBAAAAAABIFwEAAAAAAGIXAQAAAAAAeBcBAAAAAACGFwEAAAAAAKAXAQAAAAAAsBcBAAAAAADGFwEAAAAAAOAXAQAAAAAA7hcBAAAAAAD+FwEAAAAAABAYAQAAAAAAJBgBAAAAAAA0GAEAAAAAAEoYAQAAAAAAWhgBAAAAAABsGAEAAAAAAH4YAQAAAAAAkBgBAAAAAACiGAEAAAAAAK4YAQAAAAAAvBgBAAAAAADMGAEAAAAAAOIYAQAAAAAA8hgBAAAAAAACGQEAAAAAABAZAQAAAAAAIhkBAAAAAAA0GQEAAAAAAFwZAQAAAAAAaBkBAAAAAAB4GQEAAAAAAIoZAQAAAAAAAAAAAAAAAABTAUdlbmVyYXRlQ29uc29sZUN0cmxFdmVudAAAxwFHZXRFeGl0Q29kZVByb2Nlc3MAAHIEV2FpdEZvclNpbmdsZU9iamVjdACWAENyZWF0ZVByb2Nlc3NBAAC0A1NldENvbnNvbGVDdHJsSGFuZGxlcgD1AUdldE1vZHVsZUZpbGVOYW1lQQAA2wBFbnRlckNyaXRpY2FsU2VjdGlvbgAA7gJMZWF2ZUNyaXRpY2FsU2VjdGlvbgAA+gFHZXRNb2R1bGVIYW5kbGVXAAAvBFNsZWVwACICR2V0UHJvY0FkZHJlc3MAAAYBRXhpdFByb2Nlc3MAcQFHZXRDb21tYW5kTGluZUEAngNSdGxVbndpbmRFeAD0A1NldEhhbmRsZUNvdW50AAA+AkdldFN0ZEhhbmRsZQAA2QFHZXRGaWxlVHlwZQA8AkdldFN0YXJ0dXBJbmZvQQDAAERlbGV0ZUNyaXRpY2FsU2VjdGlvbgA7BFRlcm1pbmF0ZVByb2Nlc3MAAKsBR2V0Q3VycmVudFByb2Nlc3MATARVbmhhbmRsZWRFeGNlcHRpb25GaWx0ZXIAACMEU2V0VW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyANACSXNEZWJ1Z2dlclByZXNlbnQAnwNSdGxWaXJ0dWFsVW53aW5kAACYA1J0bExvb2t1cEZ1bmN0aW9uRW50cnkAAJEDUnRsQ2FwdHVyZUNvbnRleHQA5wFHZXRMYXN0RXJyb3IAAKYCSGVhcEZyZWUAAKICSGVhcEFsbG9jAF0BR2V0Q1BJbmZvAFQBR2V0QUNQAAAUAkdldE9FTUNQAADaAklzVmFsaWRDb2RlUGFnZQDXAEVuY29kZVBvaW50ZXIAuQBEZWNvZGVQb2ludGVyAEABRmxzR2V0VmFsdWUAQQFGbHNTZXRWYWx1ZQA/AUZsc0ZyZWUA+ANTZXRMYXN0RXJyb3IAAK8BR2V0Q3VycmVudFRocmVhZElkAAA+AUZsc0FsbG9jAACbBFdyaXRlRmlsZQDwAkxvYWRMaWJyYXJ5QQAAugJJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uQW5kU3BpbkNvdW50AEwBRnJlZUVudmlyb25tZW50U3RyaW5nc0EAwQFHZXRFbnZpcm9ubWVudFN0cmluZ3MATQFGcmVlRW52aXJvbm1lbnRTdHJpbmdzVwCIBFdpZGVDaGFyVG9NdWx0aUJ5dGUAwwFHZXRFbnZpcm9ubWVudFN0cmluZ3NXAACqAkhlYXBTZXRJbmZvcm1hdGlvbgAApAJIZWFwQ3JlYXRlAABTA1F1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyAGoCR2V0VGlja0NvdW50AACsAUdldEN1cnJlbnRQcm9jZXNzSWQAUwJHZXRTeXN0ZW1UaW1lQXNGaWxlVGltZQCpAkhlYXBSZUFsbG9jAIUBR2V0Q29uc29sZUNQAACXAUdldENvbnNvbGVNb2RlAABDAUZsdXNoRmlsZUJ1ZmZlcnMAAOACTENNYXBTdHJpbmdBAAAZA011bHRpQnl0ZVRvV2lkZUNoYXIA4gJMQ01hcFN0cmluZ1cAAEACR2V0U3RyaW5nVHlwZUEAAEMCR2V0U3RyaW5nVHlwZVcAAOkBR2V0TG9jYWxlSW5mb0EAAOwDU2V0RmlsZVBvaW50ZXIAAKsCSGVhcFNpemUAAEQAQ2xvc2VIYW5kbGUAkARXcml0ZUNvbnNvbGVBAJsBR2V0Q29uc29sZU91dHB1dENQAACaBFdyaXRlQ29uc29sZVcACgRTZXRTdGRIYW5kbGUAAHoAQ3JlYXRlRmlsZUEAUwBDb21wYXJlU3RyaW5nQQAAVgBDb21wYXJlU3RyaW5nVwAA3QNTZXRFbnZpcm9ubWVudFZhcmlhYmxlQQBLRVJORUwz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cgAAUAwBAOxyAACicwAAeBABAKRzAAB3dAAAeBABAHh0AAASdQAAaAwBABR1AACddQAAoAkBAKB1AAAWdgAAeAwBABh2AAB2fQAAnAwBAHh9AACpfgAAwAwBAKx+AAC/fwAA8AwBAMB/AAB6gAAAGA0BAISAAAArgwAAJA0BACyDAABpiAAAPA0BAGyIAAACiQAAZA0BAASJAABuiwAAdA0BAHCLAAD5iwAAnA0BAESPAAAukQAArA0BADCRAAB4kQAA3AgBAHiRAAANkgAArA0BABCSAACZkgAAtA0BAJySAABxkwAAtA0BAHSTAADlkwAAtA0BAIiVAAAdlgAAKA4BACCWAABXlwAAvA0BAFiXAACrlwAApAcBAKyXAACgmQAA7A0BAKCZAADwmQAAUAwBAPCZAAA2mgAAUAwBAESaAADlmgAABA4BAOiaAABqnQAADA4BAGydAACcnQAAUAwBAJydAABYngAAKA4BAFieAABwnwAANA4BAHCfAACnnwAApAcBAKifAAC8oAAAYA4BALygAAAtogAA2BABAECiAADvogAAYAkBAPCiAACcowAAeA4BAJyjAAAgpAAAUAwBACCkAADGpAAAiA4BAPCkAAAMpwAAuA4BAAynAABfpwAA+A4BAGCnAADlqQAACA8BADyqAABNqwAA2BABAFCrAACrqwAAUAwBAKyrAADnqwAALA8BAOirAAAjrAAADAgBACSsAADFrAAAeBABAMisAAD7rQAAPA8BAPytAABsrwAAaA8BAGyvAAB7sAAAdA8BAISwAAB2sQAAiA8BAHixAABStgAAmA8BAFS2AADdtgAAnA0BAOC2AAD1twAAnA0BAPi3AACouwAAuA8BAKi7AAAXvAAAaAwBABi8AAAOvQAAyBABAES9AACXvQAAUAwBAJi9AAAXxQAA0A8BABjFAACKxgAA6A8BAIzGAACKzgAAGBABAIzOAAB5zwAAOBABAHzPAAAR0AAAtA0BABTQAACV0gAAfAcBAJjSAAAw1AAAXBABADDUAADG1AAAeBABAMjUAACW1QAAiBABAJjVAADX1QAAUAwBANjVAACj2AAAkBABAKTYAACA3QAAqBABAIDdAAAQ3gAAtA0BABDeAAD93gAAyBABAAjfAADL4AAA2BABABDhAABe4QAAcA4BAGDhAAB44QAANA8BAHjhAACa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QHQGg3kIAHQk/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/51C6GQEkEAiYXk/f//i4Xk/f//6wdJgDgAdAVAO8519SuF5P3//4mF4P3//4O9wP3//wAPhVwBAACLhfD9//+oQHQyqQABAAB0CcaF1P3//y3rGKgBdAnGhdT9//8r6wuoAnQRxoXU/f//IMeF0P3/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QOX//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//g8QU69CLyMH5BY08jaAqQQCL8IPmH8HmBosPD75MDgSD4QF0xlDobCMAAFmJXfyLB/ZEBgQBdDH/dQjo4CIAAFlQ/xXk4EAAhcB1C/8VXOBAAIlF5OsDiV3kOV3kdBnoMbX//4tN5IkI6BS1///HAAkAAACDTeT/x0X8/v///+gJAAAAi0Xk6Ie1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4EAAhcB0CIk1iClBAOs0/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////tpQAAADoN67///+2mAAAAOgsrv///7acAAAA6CGu////tqAAAADoFq7///+2pAAAAOgLrv///7aoAAAA6ACu//+DxCxeXcOL/1WL7FaLdQiF9nQ1iwY7BUgdQQB0B1Do3a3//1mLRgQ7BUwd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ZGVQb2ludGVyAAAARmxzRnJlZQBGbHNTZXRWYWx1ZQBGbHNHZXRWYWx1ZQBGbHNBbGxvYwAAAABydW50aW1lIGVycm9yIAAADQoAAFRMT1NTIGVycm9yDQoAAABTSU5HIGVycm9yDQoAAAAARE9NQUlOIGVycm9yDQoAAFI2MDM0DQpBbiBhcHBsaWNhdGlvbiBoYXMgbWFkZSBhbiBhdHRlbXB0IHRvIGxvYWQgdGhlIEMgcnVudGltZSBsaWJyYXJ5IGluY29ycmVjdGx5LgpQbGVhc2UgY29udGFjdCB0aGUgYXBwbGljYXRpb24ncyBzdXBwb3J0IHRlYW0gZm9yIG1vcmUgaW5mb3JtYXRpb24uDQoAAAAAAABSNjAzMw0KLSBBdHRlbXB0IHRvIHVzZSBNU0lMIGNvZGUgZnJvbSB0aGlzIGFzc2VtYmx5IGR1cmluZyBuYXRpdmUgY29kZSBpbml0aWFsaXphdGlvbgpUaGlzIGluZGljYXRlcyBhIGJ1ZyBpbiB5b3VyIGFwcGxpY2F0aW9uLiBJdCBpcyBtb3N0IGxpa2VseSB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgYW4gTVNJTC1jb21waWxlZCAoL2NscikgZnVuY3Rpb24gZnJvbSBhIG5hdGl2ZSBjb25zdHJ1Y3RvciBvciBmcm9tIERsbE1haW4uDQoAAFI2MDMyDQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIGxvY2FsZSBpbmZvcm1hdGlvbg0KAAAAAAAAUjYwMzENCi0gQXR0ZW1wdCB0byBpbml0aWFsaXplIHRoZSBDUlQgbW9yZSB0aGFuIG9uY2UuClRoaXMgaW5kaWNhdGVzIGEgYnVnIGluIHlvdXIgYXBwbGljYXRpb24uDQoAAFI2MDMwDQotIENSVCBub3QgaW5pdGlhbGl6ZWQNCgAAUjYwMjgNCi0gdW5hYmxlIHRvIGluaXRpYWxpemUgaGVhcA0KAAAAAFI2MDI3DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIGxvd2lvIGluaXRpYWxpemF0aW9uDQoAAAAAUjYwMjYNCi0gbm90IGVub3VnaCBzcGFjZSBmb3Igc3RkaW8gaW5pdGlhbGl6YXRpb24NCgAAAABSNjAyNQ0KLSBwdXJlIHZpcnR1YWwgZnVuY3Rpb24gY2FsbA0KAAAAUjYwMjQNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgX29uZXhpdC9hdGV4aXQgdGFibGUNCgAAAABSNjAxOQ0KLSB1bmFibGUgdG8gb3BlbiBjb25zb2xlIGRldmljZQ0KAAAAAFI2MDE4DQotIHVuZXhwZWN0ZWQgaGVhcCBlcnJvcg0KAAAAAFI2MDE3DQotIHVuZXhwZWN0ZWQgbXVsdGl0aHJlYWQgbG9jayBlcnJvcg0KAAAAAFI2MDE2DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIHRocmVhZCBkYXRhDQoADQpUaGlzIGFwcGxpY2F0aW9uIGhhcyByZXF1ZXN0ZWQgdGhlIFJ1bnRpbWUgdG8gdGVybWluYXRlIGl0IGluIGFuIHVudXN1YWwgd2F5LgpQbGVhc2UgY29udGFjdCB0aGUgYXBwbGljYXRpb24ncyBzdXBwb3J0IHRlYW0gZm9yIG1vcmUgaW5mb3JtYXRpb24uDQoAAABSNjAwOQ0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBlbnZpcm9ubWVudA0KAFI2MDA4DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIGFyZ3VtZW50cw0KAAAAUjYwMDINCi0gZmxvYXRpbmcgcG9pbnQgc3VwcG9ydCBub3QgbG9hZGVkDQoAAAAATWljcm9zb2Z0IFZpc3VhbCBDKysgUnVudGltZSBMaWJyYXJ5AAAAAAoKAAAuLi4APHByb2dyYW0gbmFtZSB1bmtub3duPgAAUnVudGltZSBFcnJvciEKClByb2dyYW06IAAAAAAAAAAFAADACwAAAAAAAAAdAADABAAAAAAAAACWAADABAAAAAAAAACNAADACAAAAAAAAACOAADACAAAAAAAAACPAADACAAAAAAAAACQAADACAAAAAAAAACRAADACAAAAAAAAACSAADACAAAAAAAAACTAADACAAAAAAAAAAGgICGgIGAAAAQA4aAhoKAFAUFRUVFhYWFBQAAMDCAUICIAAgAKCc4UFeAAAcANzAwUFCIAAAAICiAiICAAAAAYGhgaGhoCAgHeHBwd3BwCAgAAAgACAAHCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAgACAAIAAgACAAIAAgACAAKAAoACgAKAAoACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAEgAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAhACEAIQAhACEAIQAhACEAIQAhAAQABAAEAAQABAAEAAQAIEAgQCBAIEAgQCBAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAQABAAEAAQABAAEACCAIIAggCCAIIAggACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAEAAQABAAEAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAIAAgACAAIAAgACAAIAAgAGgAKAAoACgAKAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIABIABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAIQAhACEAIQAhACEAIQAhACEAIQAEAAQABAAEAAQABAAEACBAYEBgQGBAYEBgQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB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vCNAAAAAAAD+////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/BFRsc1NldFZhbHVlAD0EVGxzRnJlZQD0A1NldExhc3RFcnJvcgAArgFHZXRDdXJyZW50VGhyZWFkSWQAAJcEV3JpdGVGaWxlAPYCTG9hZExpYnJhcnlBAAC6AkluaXRpYWxpemVDcml0aWNhbFNlY3Rpb25BbmRTcGluQ291bnQASwFGcmVlRW52aXJvbm1lbnRTdHJpbmdzQQDAAUdldEVudmlyb25tZW50U3RyaW5ncwBMAUZyZWVFbnZpcm9ubWVudFN0cmluZ3NXAIQEV2lkZUNoYXJUb011bHRpQnl0ZQDCAUdldEVudmlyb25tZW50U3RyaW5nc1cAAKQCSGVhcENyZWF0ZQAAYQRWaXJ0dWFsRnJlZQBZA1F1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyAGoCR2V0VGlja0NvdW50AACrAUdldEN1cnJlbnRQcm9jZXNzSWQAUwJHZXRTeXN0ZW1UaW1lQXNGaWxlVGltZQCaA1J0bFVud2luZACpAkhlYXBSZUFsbG9jAF4EVmlydHVhbEFsbG9jAACEAUdldENvbnNvbGVDUAAAlgFHZXRDb25zb2xlTW9kZQAAQgFGbHVzaEZpbGVCdWZmZXJzAADmAkxDTWFwU3RyaW5nQQAAHwNNdWx0aUJ5dGVUb1dpZGVDaGFyAOgCTENNYXBTdHJpbmdXAABAAkdldFN0cmluZ1R5cGVBAABDAkdldFN0cmluZ1R5cGVXAADpAUdldExvY2FsZUluZm9BAADnA1NldEZpbGVQb2ludGVyAACrAkhlYXBTaXplAABEAENsb3NlSGFuZGxlAIwEV3JpdGVDb25zb2xlQQCaAUdldENvbnNvbGVPdXRwdXRDUAAAlgRXcml0ZUNvbnNvbGVXAAYE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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgICAgICAgICAgICAgICAgMDAwMDAwMDAAAAAAAAAABs9EAAZPRAAFz0QABU9EAAAgAAAAAAAAAAAAAAAAAAAFBLAwQUAAAAAAAAACEAFu8ZBTgCAAA4AgAAQwAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2NvbW1hbmQvX19pbml0X18ucHlfX2FsbF9fID0gWwogICAgJ2FsaWFzJywgJ2JkaXN0X2VnZycsICdiZGlzdF9ycG0nLCAnYnVpbGRfZXh0JywgJ2J1aWxkX3B5JywgJ2RldmVsb3AnLAogICAgJ2Vhc3lfaW5zdGFsbCcsICdlZ2dfaW5mbycsICdpbnN0YWxsJywgJ2luc3RhbGxfbGliJywgJ3JvdGF0ZScsICdzYXZlb3B0cycsCiAgICAnc2Rpc3QnLCAnc2V0b3B0JywgJ3Rlc3QnLCAnaW5zdGFsbF9lZ2dfaW5mbycsICdpbnN0YWxsX3NjcmlwdHMnLAogICAgJ2JkaXN0X3dpbmluc3QnLCAndXBsb2FkX2RvY3MnLCAnYnVpbGRfY2xpYicsICdkaXN0X2luZm8nLApdCgpmcm9tIGRpc3R1dGlscy5jb21tYW5kLmJkaXN0IGltcG9ydCBiZGlzdAppbXBvcnQgc3lzCgpmcm9tIHNldHVwdG9vbHMuY29tbWFuZCBpbXBvcnQgaW5zdGFsbF9zY3JpcHRzCgppZiAnZWdnJyBub3QgaW4gYmRpc3QuZm9ybWF0X2NvbW1hbmRzOgogICAgYmRpc3QuZm9ybWF0X2NvbW1hbmRbJ2VnZyddID0gKCdiZGlzdF9lZ2cnLCAiUHl0aG9uIC5lZ2cgZmlsZSIpCiAgICBiZGlzdC5mb3JtYXRfY29tbWFuZHMuYXBwZW5kKCdlZ2cnKQoKZGVsIGJkaXN0LCBzeXMKUEsDBBQAAAAAAAAAIQBQ+CPyegkAAHoJAABAAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvY29tbWFuZC9hbGlhcy5weWZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzT3B0aW9uRXJyb3IKCmZyb20gc2V0dXB0b29scy5leHRlcm4uc2l4Lm1vdmVzIGltcG9ydCBtYXAKCmZyb20gc2V0dXB0b29scy5jb21tYW5kLnNldG9wdCBpbXBvcnQgZWRpdF9jb25maWcsIG9wdGlvbl9iYXNlLCBjb25maWdfZmlsZQoKCmRlZiBzaHF1b3RlKGFyZyk6CiAgICAiIiJRdW90ZSBhbiBhcmd1bWVudCBmb3IgbGF0ZXIgcGFyc2luZyBieSBzaGxleC5zcGxpdCgpIiIiCiAgICBmb3IgYyBpbiAnIicsICInIiwgIlxcIiwgIiMiOgogICAgICAgIGlmIGMgaW4gYXJnOgogICAgICAgICAgICByZXR1cm4gcmVwcihhcmcpCiAgICBpZiBhcmcuc3BsaXQoKSAhPSBbYXJnXToKICAgICAgICByZXR1cm4gcmVwcihhcmcpCiAgICByZXR1cm4gYXJnCgoKY2xhc3MgYWxpYXMob3B0aW9uX2Jhc2UpOgogICAgIiIiRGVmaW5lIGEgc2hvcnRjdXQgdGhhdCBpbnZva2VzIG9uZSBvciBtb3JlIGNvbW1hbmRzIiIiCgogICAgZGVzY3JpcHRpb24gPSAiZGVmaW5lIGEgc2hvcnRjdXQgdG8gaW52b2tlIG9uZSBvciBtb3JlIGNvbW1hbmRzIgogICAgY29tbWFuZF9jb25zdW1lc19hcmd1bWVudHMgPSBUcnVlCgogICAgdXNlcl9vcHRpb25zID0gWwogICAgICAgICgncmVtb3ZlJywgJ3InLCAncmVtb3ZlICh1bnNldCkgdGhlIGFsaWFzJyksCiAgICBdICsgb3B0aW9uX2Jhc2UudXNlcl9vcHRpb25zCgogICAgYm9vbGVhbl9vcHRpb25zID0gb3B0aW9uX2Jhc2UuYm9vbGVhbl9vcHRpb25zICsgWydyZW1vdmUnXQoKICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgb3B0aW9uX2Jhc2UuaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpCiAgICAgICAgc2VsZi5hcmdzID0gTm9uZQogICAgICAgIHNlbGYucmVtb3ZlID0gTm9uZQoKICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIG9wdGlvbl9iYXNlLmZpbmFsaXplX29wdGlvbnMoc2VsZikKICAgICAgICBpZiBzZWxmLnJlbW92ZSBhbmQgbGVuKHNlbGYuYXJncykgIT0gMToKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAiTXVzdCBzcGVjaWZ5IGV4YWN0bHkgb25lIGFyZ3VtZW50ICh0aGUgYWxpYXMgbmFtZSkgd2hlbiAiCiAgICAgICAgICAgICAgICAidXNpbmcgLS1yZW1vdmUiCiAgICAgICAgICAgICkKCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgIGFsaWFzZXMgPSBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfb3B0aW9uX2RpY3QoJ2FsaWFzZXMnKQoKICAgICAgICBpZiBub3Qgc2VsZi5hcmdzOgogICAgICAgICAgICBwcmludCgiQ29tbWFuZCBBbGlhc2VzIikKICAgICAgICAgICAgcHJpbnQoIi0tLS0tLS0tLS0tLS0tLSIpCiAgICAgICAgICAgIGZvciBhbGlhcyBpbiBhbGlhc2VzOgogICAgICAgICAgICAgICAgcHJpbnQoInNldHVwLnB5IGFsaWFzIiwgZm9ybWF0X2FsaWFzKGFsaWFzLCBhbGlhc2VzKSkKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGVsaWYgbGVuKHNlbGYuYXJncykgPT0gMToKICAgICAgICAgICAgYWxpYXMsID0gc2VsZi5hcmdzCiAgICAgICAgICAgIGlmIHNlbGYucmVtb3ZlOgogICAgICAgICAgICAgICAgY29tbWFuZCA9IE5vbmUKICAgICAgICAgICAgZWxpZiBhbGlhcyBpbiBhbGlhc2VzOgogICAgICAgICAgICAgICAgcHJpbnQoInNldHVwLnB5IGFsaWFzIiwgZm9ybWF0X2FsaWFzKGFsaWFzLCBhbGlhc2VzKSkKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcHJpbnQoIk5vIGFsaWFzIGRlZmluaXRpb24gZm91bmQgZm9yICVyIiAlIGFsaWFzKQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgZWxzZToKICAgICAgICAgICAgYWxpYXMgPSBzZWxmLmFyZ3NbMF0KICAgICAgICAgICAgY29tbWFuZCA9ICcgJy5qb2luKG1hcChzaHF1b3RlLCBzZWxmLmFyZ3NbMTpdKSkKCiAgICAgICAgZWRpdF9jb25maWcoc2VsZi5maWxlbmFtZSwgeydhbGlhc2VzJzoge2FsaWFzOiBjb21tYW5kfX0sIHNlbGYuZHJ5X3J1bikKCgpkZWYgZm9ybWF0X2FsaWFzKG5hbWUsIGFsaWFzZXMpOgogICAgc291cmNlLCBjb21tYW5kID0gYWxpYXNlc1tuYW1lXQogICAgaWYgc291cmNlID09IGNvbmZpZ19maWxlKCdnbG9iYWwnKToKICAgICAgICBzb3VyY2UgPSAnLS1nbG9iYWwtY29uZmlnICcKICAgIGVsaWYgc291cmNlID09IGNvbmZpZ19maWxlKCd1c2VyJyk6CiAgICAgICAgc291cmNlID0gJy0tdXNlci1jb25maWcgJwogICAgZWxpZiBzb3VyY2UgPT0gY29uZmlnX2ZpbGUoJ2xvY2FsJyk6CiAgICAgICAgc291cmNlID0gJycKICAgIGVsc2U6CiAgICAgICAgc291cmNlID0gJy0tZmlsZW5hbWU9JXInICUgc291cmNlCiAgICByZXR1cm4gc291cmNlICsgbmFtZSArICcgJyArIGNvbW1hbmQKUEsDBBQAAAAAAAAAIQCcbDkwCUcAAAlHAABEAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvY29tbWFuZC9iZGlzdF9lZ2cucHkiIiJzZXR1cHRvb2xzLmNvbW1hbmQuYmRpc3RfZWdnCgpCdWlsZCAuZWdnIGRpc3RyaWJ1dGlvbnMiIiIKCmZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzU2V0dXBFcnJvcgpmcm9tIGRpc3R1dGlscy5kaXJfdXRpbCBpbXBvcnQgcmVtb3ZlX3RyZWUsIG1rcGF0aApmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCmZyb20gdHlwZXMgaW1wb3J0IENvZGVUeXBlCmltcG9ydCBzeXMKaW1wb3J0IG9zCmltcG9ydCByZQppbXBvcnQgdGV4dHdyYXAKaW1wb3J0IG1hcnNoYWwKCmZyb20gc2V0dXB0b29scy5leHRlcm4gaW1wb3J0IHNpeAoKZnJvbSBwa2dfcmVzb3VyY2VzIGltcG9ydCBnZXRfYnVpbGRfcGxhdGZvcm0sIERpc3RyaWJ1dGlvbiwgZW5zdXJlX2RpcmVjdG9yeQpmcm9tIHBrZ19yZXNvdXJjZXMgaW1wb3J0IEVudHJ5UG9pbnQKZnJvbSBzZXR1cHRvb2xzLmV4dGVuc2lvbiBpbXBvcnQgTGlicmFyeQpmcm9tIHNldHVwdG9vbHMgaW1wb3J0IENvbW1hbmQKCnRyeToKICAgICMgUHl0aG9uIDIuNyBvciA+PTMuMgogICAgZnJvbSBzeXNjb25maWcgaW1wb3J0IGdldF9wYXRoLCBnZXRfcHl0aG9uX3ZlcnNpb24KCiAgICBkZWYgX2dldF9wdXJlbGliKCk6CiAgICAgICAgcmV0dXJuIGdldF9wYXRoKCJwdXJlbGliIikKZXhjZXB0IEltcG9ydEVycm9yOgogICAgZnJvbSBkaXN0dXRpbHMuc3lzY29uZmlnIGltcG9ydCBnZXRfcHl0aG9uX2xpYiwgZ2V0X3B5dGhvbl92ZXJzaW9uCgogICAgZGVmIF9nZXRfcHVyZWxpYigpOgogICAgICAgIHJldHVybiBnZXRfcHl0aG9uX2xpYihGYWxzZSkKCgpkZWYgc3RyaXBfbW9kdWxlKGZpbGVuYW1lKToKICAgIGlmICcuJyBpbiBmaWxlbmFtZToKICAgICAgICBmaWxlbmFtZSA9IG9zLnBhdGguc3BsaXRleHQoZmlsZW5hbWUpWzBdCiAgICBpZiBmaWxlbmFtZS5lbmRzd2l0aCgnbW9kdWxlJyk6CiAgICAgICAgZmlsZW5hbWUgPSBmaWxlbmFtZVs6LTZdCiAgICByZXR1cm4gZmlsZW5hbWUKCgpkZWYgc29ydGVkX3dhbGsoZGlyKToKICAgICIiIkRvIG9zLndhbGsgaW4gYSByZXByb2R1Y2libGUgd2F5LAogICAgaW5kZXBlbmRlbnQgb2YgaW5kZXRlcm1pbmlzdGljIGZpbGVzeXN0ZW0gcmVhZGRpciBvcmRlcgogICAgIiIiCiAgICBmb3IgYmFzZSwgZGlycywgZmlsZXMgaW4gb3Mud2FsayhkaXIpOgogICAgICAgIGRpcnMuc29ydCgpCiAgICAgICAgZmlsZXMuc29ydCgpCiAgICAgICAgeWllbGQgYmFzZSwgZGlycywgZmlsZXMKCgpkZWYgd3JpdGVfc3R1YihyZXNvdXJjZSwgcHlmaWxlKToKICAgIF9zdHViX3RlbXBsYXRlID0gdGV4dHdyYXAuZGVkZW50KCIiIgogICAgICAgIGRlZiBfX2Jvb3RzdHJhcF9fKCk6CiAgICAgICAgICAgIGdsb2JhbCBfX2Jvb3RzdHJhcF9fLCBfX2xvYWRlcl9fLCBfX2ZpbGVfXwogICAgICAgICAgICBpbXBvcnQgc3lzLCBwa2dfcmVzb3VyY2VzLCBpbXAKICAgICAgICAgICAgX19maWxlX18gPSBwa2dfcmVzb3VyY2VzLnJlc291cmNlX2ZpbGVuYW1lKF9fbmFtZV9fLCAlcikKICAgICAgICAgICAgX19sb2FkZXJfXyA9IE5vbmU7IGRlbCBfX2Jvb3RzdHJhcF9fLCBfX2xvYWRlcl9fCiAgICAgICAgICAgIGltcC5sb2FkX2R5bmFtaWMoX19uYW1lX18sX19maWxlX18pCiAgICAgICAgX19ib290c3RyYXBfXygpCiAgICAgICAgIiIiKS5sc3RyaXAoKQogICAgd2l0aCBvcGVuKHB5ZmlsZSwgJ3cnKSBhcyBmOgogICAgICAgIGYud3JpdGUoX3N0dWJfdGVtcGxhdGUgJSByZXNvdXJjZSkKCgpjbGFzcyBiZGlzdF9lZ2coQ29tbWFuZCk6CiAgICBkZXNjcmlwdGlvbiA9ICJjcmVhdGUgYW4gXCJlZ2dcIiBkaXN0cmlidXRpb24iCgogICAgdXNlcl9vcHRpb25zID0gWwogICAgICAgICgnYmRpc3QtZGlyPScsICdiJywKICAgICAgICAgInRlbXBvcmFyeSBkaXJlY3RvcnkgZm9yIGNyZWF0aW5nIHRoZSBkaXN0cmlidXRpb24iKSwKICAgICAgICAoJ3BsYXQtbmFtZT0nLCAncCcsICJwbGF0Zm9ybSBuYW1lIHRvIGVtYmVkIGluIGdlbmVyYXRlZCBmaWxlbmFtZXMgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIihkZWZhdWx0OiAlcykiICUgZ2V0X2J1aWxkX3BsYXRmb3JtKCkpLAogICAgICAgICgnZXhjbHVkZS1zb3VyY2UtZmlsZXMnLCBOb25lLAogICAgICAgICAicmVtb3ZlIGFsbCAucHkgZmlsZXMgZnJvbSB0aGUgZ2VuZXJhdGVkIGVnZyIpLAogICAgICAgICgna2VlcC10ZW1wJywgJ2snLAogICAgICAgICAia2VlcCB0aGUgcHNldWRvLWluc3RhbGxhdGlvbiB0cmVlIGFyb3VuZCBhZnRlciAiICsKICAgICAgICAgImNyZWF0aW5nIHRoZSBkaXN0cmlidXRpb24gYXJjaGl2ZSIpLAogICAgICAgICgnZGlzdC1kaXI9JywgJ2QnLAogICAgICAgICAiZGlyZWN0b3J5IHRvIHB1dCBmaW5hbCBidWlsdCBkaXN0cmlidXRpb25zIGluIiksCiAgICAgICAgKCdza2lwLWJ1aWxkJywgTm9uZSwKICAgICAgICAgInNraXAgcmVidWlsZGluZyBldmVyeXRoaW5nIChmb3IgdGVzdGluZy9kZWJ1Z2dpbmcpIiksCiAgICBdCgogICAgYm9vbGVhbl9vcHRpb25zID0gWwogICAgICAgICdrZWVwLXRlbXAnLCAnc2tpcC1idWlsZCcsICdleGNsdWRlLXNvdXJjZS1maWxlcycKICAgIF0KCiAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIHNlbGYuYmRpc3RfZGlyID0gTm9uZQogICAgICAgIHNlbGYucGxhdF9uYW1lID0gTm9uZQogICAgICAgIHNlbGYua2VlcF90ZW1wID0gMAogICAgICAgIHNlbGYuZGlzdF9kaXIgPSBOb25lCiAgICAgICAgc2VsZi5za2lwX2J1aWxkID0gMAogICAgICAgIHNlbGYuZWdnX291dHB1dCA9IE5vbmUKICAgICAgICBzZWxmLmV4Y2x1ZGVfc291cmNlX2ZpbGVzID0gTm9uZQoKICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIGVpX2NtZCA9IHNlbGYuZWlfY21kID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoImVnZ19pbmZvIikKICAgICAgICBzZWxmLmVnZ19pbmZvID0gZWlfY21kLmVnZ19pbmZvCgogICAgICAgIGlmIHNlbGYuYmRpc3RfZGlyIGlzIE5vbmU6CiAgICAgICAgICAgIGJkaXN0X2Jhc2UgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnYmRpc3QnKS5iZGlzdF9iYXNlCiAgICAgICAgICAgIHNlbGYuYmRpc3RfZGlyID0gb3MucGF0aC5qb2luKGJkaXN0X2Jhc2UsICdlZ2cnKQoKICAgICAgICBpZiBzZWxmLnBsYXRfbmFtZSBpcyBOb25lOgogICAgICAgICAgICBzZWxmLnBsYXRfbmFtZSA9IGdldF9idWlsZF9wbGF0Zm9ybSgpCgogICAgICAgIHNlbGYuc2V0X3VuZGVmaW5lZF9vcHRpb25zKCdiZGlzdCcsICgnZGlzdF9kaXInLCAnZGlzdF9kaXInKSkKCiAgICAgICAgaWYgc2VsZi5lZ2dfb3V0cHV0IGlzIE5vbmU6CgogICAgICAgICAgICAjIENvbXB1dGUgZmlsZW5hbWUgb2YgdGhlIG91dHB1dCBlZ2cKICAgICAgICAgICAgYmFzZW5hbWUgPSBEaXN0cmlidXRpb24oCiAgICAgICAgICAgICAgICBOb25lLCBOb25lLCBlaV9jbWQuZWdnX25hbWUsIGVpX2NtZC5lZ2dfdmVyc2lvbiwKICAgICAgICAgICAgICAgIGdldF9weXRob25fdmVyc2lvbigpLAogICAgICAgICAgICAgICAgc2VsZi5kaXN0cmlidXRpb24uaGFzX2V4dF9tb2R1bGVzKCkgYW5kIHNlbGYucGxhdF9uYW1lCiAgICAgICAgICAgICkuZWdnX25hbWUoKQoKICAgICAgICAgICAgc2VsZi5lZ2dfb3V0cHV0ID0gb3MucGF0aC5qb2luKHNlbGYuZGlzdF9kaXIsIGJhc2VuYW1lICsgJy5lZ2cnKQoKICAgIGRlZiBkb19pbnN0YWxsX2RhdGEoc2VsZik6CiAgICAgICAgIyBIYWNrIGZvciBwYWNrYWdlcyB0aGF0IGluc3RhbGwgZGF0YSB0byBpbnN0YWxsJ3MgLS1pbnN0YWxsLWxpYgogICAgICAgIHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdpbnN0YWxsJykuaW5zdGFsbF9saWIgPSBzZWxmLmJkaXN0X2RpcgoKICAgICAgICBzaXRlX3BhY2thZ2VzID0gb3MucGF0aC5ub3JtY2FzZShvcy5wYXRoLnJlYWxwYXRoKF9nZXRfcHVyZWxpYigpKSkKICAgICAgICBvbGQsIHNlbGYuZGlzdHJpYnV0aW9uLmRhdGFfZmlsZXMgPSBzZWxmLmRpc3RyaWJ1dGlvbi5kYXRhX2ZpbGVzLCBbXQoKICAgICAgICBmb3IgaXRlbSBpbiBvbGQ6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoaXRlbSwgdHVwbGUpIGFuZCBsZW4oaXRlbSkgPT0gMjoKICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNhYnMoaXRlbVswXSk6CiAgICAgICAgICAgICAgICAgICAgcmVhbHBhdGggPSBvcy5wYXRoLnJlYWxwYXRoKGl0ZW1bMF0pCiAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZCA9IG9zLnBhdGgubm9ybWNhc2UocmVhbHBhdGgpCiAgICAgICAgICAgICAgICAgICAgaWYgbm9ybWFsaXplZCA9PSBzaXRlX3BhY2thZ2VzIG9yIG5vcm1hbGl6ZWQuc3RhcnRzd2l0aCgKICAgICAgICAgICAgICAgICAgICAgICAgc2l0ZV9wYWNrYWdlcyArIG9zLnNlcAogICAgICAgICAgICAgICAgICAgICk6CiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0gPSByZWFscGF0aFtsZW4oc2l0ZV9wYWNrYWdlcykgKyAxOl0sIGl0ZW1bMV0KICAgICAgICAgICAgICAgICAgICAgICAgIyBYWFggZWxzZTogcmFpc2UgPz8/CiAgICAgICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uLmRhdGFfZmlsZXMuYXBwZW5kKGl0ZW0pCgogICAgICAgIHRyeToKICAgICAgICAgICAgbG9nLmluZm8oImluc3RhbGxpbmcgcGFja2FnZSBkYXRhIHRvICVzIiwgc2VsZi5iZGlzdF9kaXIpCiAgICAgICAgICAgIHNlbGYuY2FsbF9jb21tYW5kKCdpbnN0YWxsX2RhdGEnLCBmb3JjZT0wLCByb290PU5vbmUpCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgc2VsZi5kaXN0cmlidXRpb24uZGF0YV9maWxlcyA9IG9sZAoKICAgIGRlZiBnZXRfb3V0cHV0cyhzZWxmKToKICAgICAgICByZXR1cm4gW3NlbGYuZWdnX291dHB1dF0KCiAgICBkZWYgY2FsbF9jb21tYW5kKHNlbGYsIGNtZG5hbWUsICoqa3cpOgogICAgICAgICIiIkludm9rZSByZWluaXRpYWxpemVkIGNvbW1hbmQgYGNtZG5hbWVgIHdpdGgga2V5d29yZCBhcmdzIiIiCiAgICAgICAgZm9yIGRpcm5hbWUgaW4gSU5TVEFMTF9ESVJFQ1RPUllfQVRUUlM6CiAgICAgICAgICAgIGt3LnNldGRlZmF1bHQoZGlybmFtZSwgc2VsZi5iZGlzdF9kaXIpCiAgICAgICAga3cuc2V0ZGVmYXVsdCgnc2tpcF9idWlsZCcsIHNlbGYuc2tpcF9idWlsZCkKICAgICAgICBrdy5zZXRkZWZhdWx0KCdkcnlfcnVuJywgc2VsZi5kcnlfcnVuKQogICAgICAgIGNtZCA9IHNlbGYucmVpbml0aWFsaXplX2NvbW1hbmQoY21kbmFtZSwgKiprdykKICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKGNtZG5hbWUpCiAgICAgICAgcmV0dXJuIGNtZAoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgIyBHZW5lcmF0ZSBtZXRhZGF0YSBmaXJzdAogICAgICAgIHNlbGYucnVuX2NvbW1hbmQoImVnZ19pbmZvIikKICAgICAgICAjIFdlIHJ1biBpbnN0YWxsX2xpYiBiZWZvcmUgaW5zdGFsbF9kYXRhLCBiZWNhdXNlIHNvbWUgZGF0YSBoYWNrcwogICAgICAgICMgcHVsbCB0aGVpciBkYXRhIHBhdGggZnJvbSB0aGUgaW5zdGFsbF9saWIgY29tbWFuZC4KICAgICAgICBsb2cuaW5mbygiaW5zdGFsbGluZyBsaWJyYXJ5IGNvZGUgdG8gJXMiLCBzZWxmLmJkaXN0X2RpcikKICAgICAgICBpbnN0Y21kID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2luc3RhbGwnKQogICAgICAgIG9sZF9yb290ID0gaW5zdGNtZC5yb290CiAgICAgICAgaW5zdGNtZC5yb290ID0gTm9uZQogICAgICAgIGlmIHNlbGYuZGlzdHJpYnV0aW9uLmhhc19jX2xpYnJhcmllcygpIGFuZCBub3Qgc2VsZi5za2lwX2J1aWxkOgogICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdidWlsZF9jbGliJykKICAgICAgICBjbWQgPSBzZWxmLmNhbGxfY29tbWFuZCgnaW5zdGFsbF9saWInLCB3YXJuX2Rpcj0wKQogICAgICAgIGluc3RjbWQucm9vdCA9IG9sZF9yb290CgogICAgICAgIGFsbF9vdXRwdXRzLCBleHRfb3V0cHV0cyA9IHNlbGYuZ2V0X2V4dF9vdXRwdXRzKCkKICAgICAgICBzZWxmLnN0dWJzID0gW10KICAgICAgICB0b19jb21waWxlID0gW10KICAgICAgICBmb3IgKHAsIGV4dF9uYW1lKSBpbiBlbnVtZXJhdGUoZXh0X291dHB1dHMpOgogICAgICAgICAgICBmaWxlbmFtZSwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChleHRfbmFtZSkKICAgICAgICAgICAgcHlmaWxlID0gb3MucGF0aC5qb2luKHNlbGYuYmRpc3RfZGlyLCBzdHJpcF9tb2R1bGUoZmlsZW5hbWUpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcucHknKQogICAgICAgICAgICBzZWxmLnN0dWJzLmFwcGVuZChweWZpbGUpCiAgICAgICAgICAgIGxvZy5pbmZvKCJjcmVhdGluZyBzdHViIGxvYWRlciBmb3IgJXMiLCBleHRfbmFtZSkKICAgICAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgICAgIHdyaXRlX3N0dWIob3MucGF0aC5iYXNlbmFtZShleHRfbmFtZSksIHB5ZmlsZSkKICAgICAgICAgICAgdG9fY29tcGlsZS5hcHBlbmQocHlmaWxlKQogICAgICAgICAgICBleHRfb3V0cHV0c1twXSA9IGV4dF9uYW1lLnJlcGxhY2Uob3Muc2VwLCAnLycpCgogICAgICAgIGlmIHRvX2NvbXBpbGU6CiAgICAgICAgICAgIGNtZC5ieXRlX2NvbXBpbGUodG9fY29tcGlsZSkKICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi5kYXRhX2ZpbGVzOgogICAgICAgICAgICBzZWxmLmRvX2luc3RhbGxfZGF0YSgpCgogICAgICAgICMgTWFrZSB0aGUgRUdHLUlORk8gZGlyZWN0b3J5CiAgICAgICAgYXJjaGl2ZV9yb290ID0gc2VsZi5iZGlzdF9kaXIKICAgICAgICBlZ2dfaW5mbyA9IG9zLnBhdGguam9pbihhcmNoaXZlX3Jvb3QsICdFR0ctSU5GTycpCiAgICAgICAgc2VsZi5ta3BhdGgoZWdnX2luZm8pCiAgICAgICAgaWYgc2VsZi5kaXN0cmlidXRpb24uc2NyaXB0czoKICAgICAgICAgICAgc2NyaXB0X2RpciA9IG9zLnBhdGguam9pbihlZ2dfaW5mbywgJ3NjcmlwdHMnKQogICAgICAgICAgICBsb2cuaW5mbygiaW5zdGFsbGluZyBzY3JpcHRzIHRvICVzIiwgc2NyaXB0X2RpcikKICAgICAgICAgICAgc2VsZi5jYWxsX2NvbW1hbmQoJ2luc3RhbGxfc2NyaXB0cycsIGluc3RhbGxfZGlyPXNjcmlwdF9kaXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vX2VwPTEpCgogICAgICAgIHNlbGYuY29weV9tZXRhZGF0YV90byhlZ2dfaW5mbykKICAgICAgICBuYXRpdmVfbGlicyA9IG9zLnBhdGguam9pbihlZ2dfaW5mbywgIm5hdGl2ZV9saWJzLnR4dCIpCiAgICAgICAgaWYgYWxsX291dHB1dHM6CiAgICAgICAgICAgIGxvZy5pbmZvKCJ3cml0aW5nICVzIiwgbmF0aXZlX2xpYnMpCiAgICAgICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgICAgICBlbnN1cmVfZGlyZWN0b3J5KG5hdGl2ZV9saWJzKQogICAgICAgICAgICAgICAgbGlic19maWxlID0gb3BlbihuYXRpdmVfbGlicywgJ3d0JykKICAgICAgICAgICAgICAgIGxpYnNfZmlsZS53cml0ZSgnXG4nLmpvaW4oYWxsX291dHB1dHMpKQogICAgICAgICAgICAgICAgbGlic19maWxlLndyaXRlKCdcbicpCiAgICAgICAgICAgICAgICBsaWJzX2ZpbGUuY2xvc2UoKQogICAgICAgIGVsaWYgb3MucGF0aC5pc2ZpbGUobmF0aXZlX2xpYnMpOgogICAgICAgICAgICBsb2cuaW5mbygicmVtb3ZpbmcgJXMiLCBuYXRpdmVfbGlicykKICAgICAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgICAgIG9zLnVubGluayhuYXRpdmVfbGlicykKCiAgICAgICAgd3JpdGVfc2FmZXR5X2ZsYWcoCiAgICAgICAgICAgIG9zLnBhdGguam9pbihhcmNoaXZlX3Jvb3QsICdFR0ctSU5GTycpLCBzZWxmLnppcF9zYWZlKCkKICAgICAgICApCgogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihzZWxmLmVnZ19pbmZvLCAnZGVwZW5kcy50eHQnKSk6CiAgICAgICAgICAgIGxvZy53YXJuKAogICAgICAgICAgICAgICAgIldBUk5JTkc6ICdkZXBlbmRzLnR4dCcgd2lsbCBub3QgYmUgdXNlZCBieSBzZXR1cHRvb2xzIDAuNiFcbiIKICAgICAgICAgICAgICAgICJVc2UgdGhlIGluc3RhbGxfcmVxdWlyZXMvZXh0cmFzX3JlcXVpcmUgc2V0dXAoKSBhcmdzIGluc3RlYWQuIgogICAgICAgICAgICApCgogICAgICAgIGlmIHNlbGYuZXhjbHVkZV9zb3VyY2VfZmlsZXM6CiAgICAgICAgICAgIHNlbGYuemFwX3B5ZmlsZXMoKQoKICAgICAgICAjIE1ha2UgdGhlIGFyY2hpdmUKICAgICAgICBtYWtlX3ppcGZpbGUoc2VsZi5lZ2dfb3V0cHV0LCBhcmNoaXZlX3Jvb3QsIHZlcmJvc2U9c2VsZi52ZXJib3NlLAogICAgICAgICAgICAgICAgICAgICBkcnlfcnVuPXNlbGYuZHJ5X3J1biwgbW9kZT1zZWxmLmdlbl9oZWFkZXIoKSkKICAgICAgICBpZiBub3Qgc2VsZi5rZWVwX3RlbXA6CiAgICAgICAgICAgIHJlbW92ZV90cmVlKHNlbGYuYmRpc3RfZGlyLCBkcnlfcnVuPXNlbGYuZHJ5X3J1bikKCiAgICAgICAgIyBBZGQgdG8gJ0Rpc3RyaWJ1dGlvbi5kaXN0X2ZpbGVzJyBzbyB0aGF0IHRoZSAidXBsb2FkIiBjb21tYW5kIHdvcmtzCiAgICAgICAgZ2V0YXR0cihzZWxmLmRpc3RyaWJ1dGlvbiwgJ2Rpc3RfZmlsZXMnLCBbXSkuYXBwZW5kKAogICAgICAgICAgICAoJ2JkaXN0X2VnZycsIGdldF9weXRob25fdmVyc2lvbigpLCBzZWxmLmVnZ19vdXRwdXQpKQoKICAgIGRlZiB6YXBfcHlmaWxlcyhzZWxmKToKICAgICAgICBsb2cuaW5mbygiUmVtb3ZpbmcgLnB5IGZpbGVzIGZyb20gdGVtcG9yYXJ5IGRpcmVjdG9yeSIpCiAgICAgICAgZm9yIGJhc2UsIGRpcnMsIGZpbGVzIGluIHdhbGtfZWdnKHNlbGYuYmRpc3RfZGlyKToKICAgICAgICAgICAgZm9yIG5hbWUgaW4gZmlsZXM6CiAgICAgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKGJhc2UsIG5hbWUpCgogICAgICAgICAgICAgICAgaWYgbmFtZS5lbmRzd2l0aCgnLnB5Jyk6CiAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJEZWxldGluZyAlcyIsIHBhdGgpCiAgICAgICAgICAgICAgICAgICAgb3MudW5saW5rKHBhdGgpCgogICAgICAgICAgICAgICAgaWYgYmFzZS5lbmRzd2l0aCgnX19weWNhY2hlX18nKToKICAgICAgICAgICAgICAgICAgICBwYXRoX29sZCA9IHBhdGgKCiAgICAgICAgICAgICAgICAgICAgcGF0dGVybiA9IHInKD9QPG5hbWU+LispXC4oP1A8bWFnaWM+W14uXSspXC5weWMnCiAgICAgICAgICAgICAgICAgICAgbSA9IHJlLm1hdGNoKHBhdHRlcm4sIG5hbWUpCiAgICAgICAgICAgICAgICAgICAgcGF0aF9uZXcgPSBvcy5wYXRoLmpvaW4oCiAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UsIG9zLnBhcmRpciwgbS5ncm91cCgnbmFtZScpICsgJy5weWMnKQogICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKAogICAgICAgICAgICAgICAgICAgICAgICAiUmVuYW1pbmcgZmlsZSBmcm9tIFslc10gdG8gWyVzXSIKICAgICAgICAgICAgICAgICAgICAgICAgJSAocGF0aF9vbGQsIHBhdGhfbmV3KSkKICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgIG9zLnJlbW92ZShwYXRoX25ldykKICAgICAgICAgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKICAgICAgICAgICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICAgICAgICAgIG9zLnJlbmFtZShwYXRoX29sZCwgcGF0aF9uZXcpCgogICAgZGVmIHppcF9zYWZlKHNlbGYpOgogICAgICAgIHNhZmUgPSBnZXRhdHRyKHNlbGYuZGlzdHJpYnV0aW9uLCAnemlwX3NhZmUnLCBOb25lKQogICAgICAgIGlmIHNhZmUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJldHVybiBzYWZlCiAgICAgICAgbG9nLndhcm4oInppcF9zYWZlIGZsYWcgbm90IHNldDsgYW5hbHl6aW5nIGFyY2hpdmUgY29udGVudHMuLi4iKQogICAgICAgIHJldHVybiBhbmFseXplX2VnZyhzZWxmLmJkaXN0X2Rpciwgc2VsZi5zdHVicykKCiAgICBkZWYgZ2VuX2hlYWRlcihzZWxmKToKICAgICAgICBlcG0gPSBFbnRyeVBvaW50LnBhcnNlX21hcChzZWxmLmRpc3RyaWJ1dGlvbi5lbnRyeV9wb2ludHMgb3IgJycpCiAgICAgICAgZXAgPSBlcG0uZ2V0KCdzZXR1cHRvb2xzLmluc3RhbGxhdGlvbicsIHt9KS5nZXQoJ2VnZ3NlY3V0YWJsZScpCiAgICAgICAgaWYgZXAgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuICd3JyAgIyBub3QgYW4gZWdnc2VjdXRhYmxlLCBkbyBpdCB0aGUgdXN1YWwgd2F5LgoKICAgICAgICBpZiBub3QgZXAuYXR0cnMgb3IgZXAuZXh0cmFzOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAogICAgICAgICAgICAgICAgImVnZ3NlY3V0YWJsZSBlbnRyeSBwb2ludCAoJXIpIGNhbm5vdCBoYXZlICdleHRyYXMnICIKICAgICAgICAgICAgICAgICJvciByZWZlciB0byBhIG1vZHVsZSIgJSAoZXAsKQogICAgICAgICAgICApCgogICAgICAgIHB5dmVyID0gJ3t9Lnt9Jy5mb3JtYXQoKnN5cy52ZXJzaW9uX2luZm8pCiAgICAgICAgcGtnID0gZXAubW9kdWxlX25hbWUKICAgICAgICBmdWxsID0gJy4nLmpvaW4oZXAuYXR0cnMpCiAgICAgICAgYmFzZSA9IGVwLmF0dHJzWzBdCiAgICAgICAgYmFzZW5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKHNlbGYuZWdnX291dHB1dCkKCiAgICAgICAgaGVhZGVyID0gKAogICAgICAgICAgICAiIyEvYmluL3NoXG4iCiAgICAgICAgICAgICdpZiBbIGBiYXNlbmFtZSAkMGAgPSAiJShiYXNlbmFtZSlzIiBdXG4nCiAgICAgICAgICAgICd0aGVuIGV4ZWMgcHl0aG9uJShweXZlcilzIC1jICInCiAgICAgICAgICAgICJpbXBvcnQgc3lzLCBvczsgc3lzLnBhdGguaW5zZXJ0KDAsIG9zLnBhdGguYWJzcGF0aCgnJDAnKSk7ICIKICAgICAgICAgICAgImZyb20gJShwa2cpcyBpbXBvcnQgJShiYXNlKXM7IHN5cy5leGl0KCUoZnVsbClzKCkpIgogICAgICAgICAgICAnIiAiJEAiXG4nCiAgICAgICAgICAgICdlbHNlXG4nCiAgICAgICAgICAgICcgIGVjaG8gJDAgaXMgbm90IHRoZSBjb3JyZWN0IG5hbWUgZm9yIHRoaXMgZWdnIGZpbGUuXG4nCiAgICAgICAgICAgICcgIGVjaG8gUGxlYXNlIHJlbmFtZSBpdCBiYWNrIHRvICUoYmFzZW5hbWUpcyBhbmQgdHJ5IGFnYWluLlxuJwogICAgICAgICAgICAnICBleGVjIGZhbHNlXG4nCiAgICAgICAgICAgICdmaVxuJwogICAgICAgICkgJSBsb2NhbHMoKQoKICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICBta3BhdGgob3MucGF0aC5kaXJuYW1lKHNlbGYuZWdnX291dHB1dCksIGRyeV9ydW49c2VsZi5kcnlfcnVuKQogICAgICAgICAgICBmID0gb3BlbihzZWxmLmVnZ19vdXRwdXQsICd3JykKICAgICAgICAgICAgZi53cml0ZShoZWFkZXIpCiAgICAgICAgICAgIGYuY2xvc2UoKQogICAgICAgIHJldHVybiAnYScKCiAgICBkZWYgY29weV9tZXRhZGF0YV90byhzZWxmLCB0YXJnZXRfZGlyKToKICAgICAgICAiQ29weSBtZXRhZGF0YSAoZWdnIGluZm8pIHRvIHRoZSB0YXJnZXRfZGlyIgogICAgICAgICMgbm9ybWFsaXplIHRoZSBwYXRoIChzbyB0aGF0IGEgZm9yd2FyZC1zbGFzaCBpbiBlZ2dfaW5mbyB3aWxsCiAgICAgICAgIyBtYXRjaCB1c2luZyBzdGFydHN3aXRoIGJlbG93KQogICAgICAgIG5vcm1fZWdnX2luZm8gPSBvcy5wYXRoLm5vcm1wYXRoKHNlbGYuZWdnX2luZm8pCiAgICAgICAgcHJlZml4ID0gb3MucGF0aC5qb2luKG5vcm1fZWdnX2luZm8sICcnKQogICAgICAgIGZvciBwYXRoIGluIHNlbGYuZWlfY21kLmZpbGVsaXN0LmZpbGVzOgogICAgICAgICAgICBpZiBwYXRoLnN0YXJ0c3dpdGgocHJlZml4KToKICAgICAgICAgICAgICAgIHRhcmdldCA9IG9zLnBhdGguam9pbih0YXJnZXRfZGlyLCBwYXRoW2xlbihwcmVmaXgpOl0pCiAgICAgICAgICAgICAgICBlbnN1cmVfZGlyZWN0b3J5KHRhcmdldCkKICAgICAgICAgICAgICAgIHNlbGYuY29weV9maWxlKHBhdGgsIHRhcmdldCkKCiAgICBkZWYgZ2V0X2V4dF9vdXRwdXRzKHNlbGYpOgogICAgICAgICIiIkdldCBhIGxpc3Qgb2YgcmVsYXRpdmUgcGF0aHMgdG8gQyBleHRlbnNpb25zIGluIHRoZSBvdXRwdXQgZGlzdHJvIiIiCgogICAgICAgIGFsbF9vdXRwdXRzID0gW10KICAgICAgICBleHRfb3V0cHV0cyA9IFtdCgogICAgICAgIHBhdGhzID0ge3NlbGYuYmRpc3RfZGlyOiAnJ30KICAgICAgICBmb3IgYmFzZSwgZGlycywgZmlsZXMgaW4gc29ydGVkX3dhbGsoc2VsZi5iZGlzdF9kaXIpOgogICAgICAgICAgICBmb3IgZmlsZW5hbWUgaW4gZmlsZXM6CiAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLnNwbGl0ZXh0KGZpbGVuYW1lKVsxXS5sb3dlcigpIGluIE5BVElWRV9FWFRFTlNJT05TOgogICAgICAgICAgICAgICAgICAgIGFsbF9vdXRwdXRzLmFwcGVuZChwYXRoc1tiYXNlXSArIGZpbGVuYW1lKQogICAgICAgICAgICBmb3IgZmlsZW5hbWUgaW4gZGlyczoKICAgICAgICAgICAgICAgIHBhdGhzW29zLnBhdGguam9pbihiYXNlLCBmaWxlbmFtZSldID0gKHBhdGhzW2Jhc2VdICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lICsgJy8nKQoKICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi5oYXNfZXh0X21vZHVsZXMoKToKICAgICAgICAgICAgYnVpbGRfY21kID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2J1aWxkX2V4dCcpCiAgICAgICAgICAgIGZvciBleHQgaW4gYnVpbGRfY21kLmV4dGVuc2lvbnM6CiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV4dCwgTGlicmFyeSk6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIGZ1bGxuYW1lID0gYnVpbGRfY21kLmdldF9leHRfZnVsbG5hbWUoZXh0Lm5hbWUpCiAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IGJ1aWxkX2NtZC5nZXRfZXh0X2ZpbGVuYW1lKGZ1bGxuYW1lKQogICAgICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguYmFzZW5hbWUoZmlsZW5hbWUpLnN0YXJ0c3dpdGgoJ2RsLScpOgogICAgICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihzZWxmLmJkaXN0X2RpciwgZmlsZW5hbWUpKToKICAgICAgICAgICAgICAgICAgICAgICAgZXh0X291dHB1dHMuYXBwZW5kKGZpbGVuYW1lKQoKICAgICAgICByZXR1cm4gYWxsX291dHB1dHMsIGV4dF9vdXRwdXRzCgoKTkFUSVZFX0VYVEVOU0lPTlMgPSBkaWN0LmZyb21rZXlzKCcuZGxsIC5zbyAuZHlsaWIgLnB5ZCcuc3BsaXQoKSkKCgpkZWYgd2Fsa19lZ2coZWdnX2Rpcik6CiAgICAiIiJXYWxrIGFuIHVucGFja2VkIGVnZydzIGNvbnRlbnRzLCBza2lwcGluZyB0aGUgbWV0YWRhdGEgZGlyZWN0b3J5IiIiCiAgICB3YWxrZXIgPSBzb3J0ZWRfd2FsayhlZ2dfZGlyKQogICAgYmFzZSwgZGlycywgZmlsZXMgPSBuZXh0KHdhbGtlcikKICAgIGlmICdFR0ctSU5GTycgaW4gZGlyczoKICAgICAgICBkaXJzLnJlbW92ZSgnRUdHLUlORk8nKQogICAgeWllbGQgYmFzZSwgZGlycywgZmlsZXMKICAgIGZvciBiZGYgaW4gd2Fsa2VyOgogICAgICAgIHlpZWxkIGJkZgoKCmRlZiBhbmFseXplX2VnZyhlZ2dfZGlyLCBzdHVicyk6CiAgICAjIGNoZWNrIGZvciBleGlzdGluZyBmbGFnIGluIEVHRy1JTkZPCiAgICBmb3IgZmxhZywgZm4gaW4gc2FmZXR5X2ZsYWdzLml0ZW1zKCk6CiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKGVnZ19kaXIsICdFR0ctSU5GTycsIGZuKSk6CiAgICAgICAgICAgIHJldHVybiBmbGFnCiAgICBpZiBub3QgY2FuX3NjYW4oKToKICAgICAgICByZXR1cm4gRmFsc2UKICAgIHNhZmUgPSBUcnVlCiAgICBmb3IgYmFzZSwgZGlycywgZmlsZXMgaW4gd2Fsa19lZ2coZWdnX2Rpcik6CiAgICAgICAgZm9yIG5hbWUgaW4gZmlsZXM6CiAgICAgICAgICAgIGlmIG5hbWUuZW5kc3dpdGgoJy5weScpIG9yIG5hbWUuZW5kc3dpdGgoJy5weXcnKToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGVsaWYgbmFtZS5lbmRzd2l0aCgnLnB5YycpIG9yIG5hbWUuZW5kc3dpdGgoJy5weW8nKToKICAgICAgICAgICAgICAgICMgYWx3YXlzIHNjYW4sIGV2ZW4gaWYgd2UgYWxyZWFkeSBrbm93IHdlJ3JlIG5vdCBzYWZlCiAgICAgICAgICAgICAgICBzYWZlID0gc2Nhbl9tb2R1bGUoZWdnX2RpciwgYmFzZSwgbmFtZSwgc3R1YnMpIGFuZCBzYWZlCiAgICByZXR1cm4gc2FmZQoKCmRlZiB3cml0ZV9zYWZldHlfZmxhZyhlZ2dfZGlyLCBzYWZlKToKICAgICMgV3JpdGUgb3IgcmVtb3ZlIHppcCBzYWZldHkgZmxhZyBmaWxlKHMpCiAgICBmb3IgZmxhZywgZm4gaW4gc2FmZXR5X2ZsYWdzLml0ZW1zKCk6CiAgICAgICAgZm4gPSBvcy5wYXRoLmpvaW4oZWdnX2RpciwgZm4pCiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoZm4pOgogICAgICAgICAgICBpZiBzYWZlIGlzIE5vbmUgb3IgYm9vbChzYWZlKSAhPSBmbGFnOgogICAgICAgICAgICAgICAgb3MudW5saW5rKGZuKQogICAgICAgIGVsaWYgc2FmZSBpcyBub3QgTm9uZSBhbmQgYm9vbChzYWZlKSA9PSBmbGFnOgogICAgICAgICAgICBmID0gb3BlbihmbiwgJ3d0JykKICAgICAgICAgICAgZi53cml0ZSgnXG4nKQogICAgICAgICAgICBmLmNsb3NlKCkKCgpzYWZldHlfZmxhZ3MgPSB7CiAgICBUcnVlOiAnemlwLXNhZmUnLAogICAgRmFsc2U6ICdub3QtemlwLXNhZmUnLAp9CgoKZGVmIHNjYW5fbW9kdWxlKGVnZ19kaXIsIGJhc2UsIG5hbWUsIHN0dWJzKToKICAgICIiIkNoZWNrIHdoZXRoZXIgbW9kdWxlIHBvc3NpYmx5IHVzZXMgdW5zYWZlLWZvci16aXBmaWxlIHN0dWZmIiIiCgogICAgZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4oYmFzZSwgbmFtZSkKICAgIGlmIGZpbGVuYW1lWzotMV0gaW4gc3R1YnM6CiAgICAgICAgcmV0dXJuIFRydWUgICMgRXh0ZW5zaW9uIG1vZHVsZQogICAgcGtnID0gYmFzZVtsZW4oZWdnX2RpcikgKyAxOl0ucmVwbGFjZShvcy5zZXAsICcuJykKICAgIG1vZHVsZSA9IHBrZyArIChwa2cgYW5kICcuJyBvciAnJykgKyBvcy5wYXRoLnNwbGl0ZXh0KG5hbWUpWzBdCiAgICBpZiBzaXguUFkyOgogICAgICAgIHNraXAgPSA4ICAjIHNraXAgbWFnaWMgJiBkYXRlCiAgICBlbGlmIHN5cy52ZXJzaW9uX2luZm8gPCAoMywgNyk6CiAgICAgICAgc2tpcCA9IDEyICAjIHNraXAgbWFnaWMgJiBkYXRlICYgZmlsZSBzaXplCiAgICBlbHNlOgogICAgICAgIHNraXAgPSAxNiAgIyBza2lwIG1hZ2ljICYgcmVzZXJ2ZWQ/ICYgZGF0ZSAmIGZpbGUgc2l6ZQogICAgZiA9IG9wZW4oZmlsZW5hbWUsICdyYicpCiAgICBmLnJlYWQoc2tpcCkKICAgIGNvZGUgPSBtYXJzaGFsLmxvYWQoZikKICAgIGYuY2xvc2UoKQogICAgc2FmZSA9IFRydWUKICAgIHN5bWJvbHMgPSBkaWN0LmZyb21rZXlzKGl0ZXJfc3ltYm9scyhjb2RlKSkKICAgIGZvciBiYWQgaW4gWydfX2ZpbGVfXycsICdfX3BhdGhfXyddOgogICAgICAgIGlmIGJhZCBpbiBzeW1ib2xzOgogICAgICAgICAgICBsb2cud2FybigiJXM6IG1vZHVsZSByZWZlcmVuY2VzICVzIiwgbW9kdWxlLCBiYWQpCiAgICAgICAgICAgIHNhZmUgPSBGYWxzZQogICAgaWYgJ2luc3BlY3QnIGluIHN5bWJvbHM6CiAgICAgICAgZm9yIGJhZCBpbiBbCiAgICAgICAgICAgICdnZXRzb3VyY2UnLCAnZ2V0YWJzZmlsZScsICdnZXRzb3VyY2VmaWxlJywgJ2dldGZpbGUnCiAgICAgICAgICAgICdnZXRzb3VyY2VsaW5lcycsICdmaW5kc291cmNlJywgJ2dldGNvbW1lbnRzJywgJ2dldGZyYW1laW5mbycsCiAgICAgICAgICAgICdnZXRpbm5lcmZyYW1lcycsICdnZXRvdXRlcmZyYW1lcycsICdzdGFjaycsICd0cmFjZScKICAgICAgICBdOgogICAgICAgICAgICBpZiBiYWQgaW4gc3ltYm9sczoKICAgICAgICAgICAgICAgIGxvZy53YXJuKCIlczogbW9kdWxlIE1BWSBiZSB1c2luZyBpbnNwZWN0LiVzIiwgbW9kdWxlLCBiYWQpCiAgICAgICAgICAgICAgICBzYWZlID0gRmFsc2UKICAgIHJldHVybiBzYWZlCgoKZGVmIGl0ZXJfc3ltYm9scyhjb2RlKToKICAgICIiIllpZWxkIG5hbWVzIGFuZCBzdHJpbmdzIHVzZWQgYnkgYGNvZGVgIGFuZCBpdHMgbmVzdGVkIGNvZGUgb2JqZWN0cyIiIgogICAgZm9yIG5hbWUgaW4gY29kZS5jb19uYW1lczoKICAgICAgICB5aWVsZCBuYW1lCiAgICBmb3IgY29uc3QgaW4gY29kZS5jb19jb25zdHM6CiAgICAgICAgaWYgaXNpbnN0YW5jZShjb25zdCwgc2l4LnN0cmluZ190eXBlcyk6CiAgICAgICAgICAgIHlpZWxkIGNvbnN0CiAgICAgICAgZWxpZiBpc2luc3RhbmNlKGNvbnN0LCBDb2RlVHlwZSk6CiAgICAgICAgICAgIGZvciBuYW1lIGluIGl0ZXJfc3ltYm9scyhjb25zdCk6CiAgICAgICAgICAgICAgICB5aWVsZCBuYW1lCgoKZGVmIGNhbl9zY2FuKCk6CiAgICBpZiBub3Qgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ2phdmEnKSBhbmQgc3lzLnBsYXRmb3JtICE9ICdjbGknOgogICAgICAgICMgQ1B5dGhvbiwgUHlQeSwgZXRjLgogICAgICAgIHJldHVybiBUcnVlCiAgICBsb2cud2FybigiVW5hYmxlIHRvIGFuYWx5emUgY29tcGlsZWQgY29kZSBvbiB0aGlzIHBsYXRmb3JtLiIpCiAgICBsb2cud2FybigiUGxlYXNlIGFzayB0aGUgYXV0aG9yIHRvIGluY2x1ZGUgYSAnemlwX3NhZmUnIgogICAgICAgICAgICAgIiBzZXR0aW5nIChlaXRoZXIgVHJ1ZSBvciBGYWxzZSkgaW4gdGhlIHBhY2thZ2UncyBzZXR1cC5weSIpCgoKIyBBdHRyaWJ1dGUgbmFtZXMgb2Ygb3B0aW9ucyBmb3IgY29tbWFuZHMgdGhhdCBtaWdodCBuZWVkIHRvIGJlIGNvbnZpbmNlZCB0bwojIGluc3RhbGwgdG8gdGhlIGVnZyBidWlsZCBkaXJlY3RvcnkKCklOU1RBTExfRElSRUNUT1JZX0FUVFJTID0gWwogICAgJ2luc3RhbGxfbGliJywgJ2luc3RhbGxfZGlyJywgJ2luc3RhbGxfZGF0YScsICdpbnN0YWxsX2Jhc2UnCl0KCgpkZWYgbWFrZV96aXBmaWxlKHppcF9maWxlbmFtZSwgYmFzZV9kaXIsIHZlcmJvc2U9MCwgZHJ5X3J1bj0wLCBjb21wcmVzcz1UcnVlLAogICAgICAgICAgICAgICAgIG1vZGU9J3cnKToKICAgICIiIkNyZWF0ZSBhIHppcCBmaWxlIGZyb20gYWxsIHRoZSBmaWxlcyB1bmRlciAnYmFzZV9kaXInLiAgVGhlIG91dHB1dAogICAgemlwIGZpbGUgd2lsbCBiZSBuYW1lZCAnYmFzZV9kaXInICsgIi56aXAiLiAgVXNlcyBlaXRoZXIgdGhlICJ6aXBmaWxlIgogICAgUHl0aG9uIG1vZHVsZSAoaWYgYXZhaWxhYmxlKSBvciB0aGUgSW5mb1pJUCAiemlwIiB1dGlsaXR5IChpZiBpbnN0YWxsZWQKICAgIGFuZCBmb3VuZCBvbiB0aGUgZGVmYXVsdCBzZWFyY2ggcGF0aCkuICBJZiBuZWl0aGVyIHRvb2wgaXMgYXZhaWxhYmxlLAogICAgcmFpc2VzIERpc3R1dGlsc0V4ZWNFcnJvci4gIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIG91dHB1dCB6aXAgZmlsZS4KICAgICIiIgogICAgaW1wb3J0IHppcGZpbGUKCiAgICBta3BhdGgob3MucGF0aC5kaXJuYW1lKHppcF9maWxlbmFtZSksIGRyeV9ydW49ZHJ5X3J1bikKICAgIGxvZy5pbmZvKCJjcmVhdGluZyAnJXMnIGFuZCBhZGRpbmcgJyVzJyB0byBpdCIsIHppcF9maWxlbmFtZSwgYmFzZV9kaXIpCgogICAgZGVmIHZpc2l0KHosIGRpcm5hbWUsIG5hbWVzKToKICAgICAgICBmb3IgbmFtZSBpbiBuYW1lczoKICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGgubm9ybXBhdGgob3MucGF0aC5qb2luKGRpcm5hbWUsIG5hbWUpKQogICAgICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShwYXRoKToKICAgICAgICAgICAgICAgIHAgPSBwYXRoW2xlbihiYXNlX2RpcikgKyAxOl0KICAgICAgICAgICAgICAgIGlmIG5vdCBkcnlfcnVuOgogICAgICAgICAgICAgICAgICAgIHoud3JpdGUocGF0aCwgcCkKICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiYWRkaW5nICclcyciLCBwKQoKICAgIGNvbXByZXNzaW9uID0gemlwZmlsZS5aSVBfREVGTEFURUQgaWYgY29tcHJlc3MgZWxzZSB6aXBmaWxlLlpJUF9TVE9SRUQKICAgIGlmIG5vdCBkcnlfcnVuOgogICAgICAgIHogPSB6aXBmaWxlLlppcEZpbGUoemlwX2ZpbGVuYW1lLCBtb2RlLCBjb21wcmVzc2lvbj1jb21wcmVzc2lvbikKICAgICAgICBmb3IgZGlybmFtZSwgZGlycywgZmlsZXMgaW4gc29ydGVkX3dhbGsoYmFzZV9kaXIpOgogICAgICAgICAgICB2aXNpdCh6LCBkaXJuYW1lLCBmaWxlcykKICAgICAgICB6LmNsb3NlKCkKICAgIGVsc2U6CiAgICAgICAgZm9yIGRpcm5hbWUsIGRpcnMsIGZpbGVzIGluIHNvcnRlZF93YWxrKGJhc2VfZGlyKToKICAgICAgICAgICAgdmlzaXQoTm9uZSwgZGlybmFtZSwgZmlsZXMpCiAgICByZXR1cm4gemlwX2ZpbGVuYW1lClBLAwQUAAAAAAAAACEA69J0FuQFAADkBQAARAAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2NvbW1hbmQvYmRpc3RfcnBtLnB5aW1wb3J0IGRpc3R1dGlscy5jb21tYW5kLmJkaXN0X3JwbSBhcyBvcmlnCgoKY2xhc3MgYmRpc3RfcnBtKG9yaWcuYmRpc3RfcnBtKToKICAgICIiIgogICAgT3ZlcnJpZGUgdGhlIGRlZmF1bHQgYmRpc3RfcnBtIGJlaGF2aW9yIHRvIGRvIHRoZSBmb2xsb3dpbmc6CgogICAgMS4gUnVuIGVnZ19pbmZvIHRvIGVuc3VyZSB0aGUgbmFtZSBhbmQgdmVyc2lvbiBhcmUgcHJvcGVybHkgY2FsY3VsYXRlZC4KICAgIDIuIEFsd2F5cyBydW4gJ2luc3RhbGwnIHVzaW5nIC0tc2luZ2xlLXZlcnNpb24tZXh0ZXJuYWxseS1tYW5hZ2VkIHRvCiAgICAgICBkaXNhYmxlIGVnZ3MgaW4gUlBNIGRpc3RyaWJ1dGlvbnMuCiAgICAzLiBSZXBsYWNlIGRhc2ggd2l0aCB1bmRlcnNjb3JlIGluIHRoZSB2ZXJzaW9uIG51bWJlcnMgZm9yIGJldHRlciBSUE0KICAgICAgIGNvbXBhdGliaWxpdHkuCiAgICAiIiIKCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgICMgZW5zdXJlIGRpc3RybyBuYW1lIGlzIHVwLXRvLWRhdGUKICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdlZ2dfaW5mbycpCgogICAgICAgIG9yaWcuYmRpc3RfcnBtLnJ1bihzZWxmKQoKICAgIGRlZiBfbWFrZV9zcGVjX2ZpbGUoc2VsZik6CiAgICAgICAgdmVyc2lvbiA9IHNlbGYuZGlzdHJpYnV0aW9uLmdldF92ZXJzaW9uKCkKICAgICAgICBycG12ZXJzaW9uID0gdmVyc2lvbi5yZXBsYWNlKCctJywgJ18nKQogICAgICAgIHNwZWMgPSBvcmlnLmJkaXN0X3JwbS5fbWFrZV9zcGVjX2ZpbGUoc2VsZikKICAgICAgICBsaW5lMjMgPSAnJWRlZmluZSB2ZXJzaW9uICcgKyB2ZXJzaW9uCiAgICAgICAgbGluZTI0ID0gJyVkZWZpbmUgdmVyc2lvbiAnICsgcnBtdmVyc2lvbgogICAgICAgIHNwZWMgPSBbCiAgICAgICAgICAgIGxpbmUucmVwbGFjZSgKICAgICAgICAgICAgICAgICJTb3VyY2UwOiAle25hbWV9LSV7dmVyc2lvbn0udGFyIiwKICAgICAgICAgICAgICAgICJTb3VyY2UwOiAle25hbWV9LSV7dW5tYW5nbGVkX3ZlcnNpb259LnRhciIKICAgICAgICAgICAgKS5yZXBsYWNlKAogICAgICAgICAgICAgICAgInNldHVwLnB5IGluc3RhbGwgIiwKICAgICAgICAgICAgICAgICJzZXR1cC5weSBpbnN0YWxsIC0tc2luZ2xlLXZlcnNpb24tZXh0ZXJuYWxseS1tYW5hZ2VkICIKICAgICAgICAgICAgKS5yZXBsYWNlKAogICAgICAgICAgICAgICAgIiVzZXR1cCIsCiAgICAgICAgICAgICAgICAiJXNldHVwIC1uICV7bmFtZX0tJXt1bm1hbmdsZWRfdmVyc2lvbn0iCiAgICAgICAgICAgICkucmVwbGFjZShsaW5lMjMsIGxpbmUyNCkKICAgICAgICAgICAgZm9yIGxpbmUgaW4gc3BlYwogICAgICAgIF0KICAgICAgICBpbnNlcnRfbG9jID0gc3BlYy5pbmRleChsaW5lMjQpICsgMQogICAgICAgIHVubWFuZ2xlZF92ZXJzaW9uID0gIiVkZWZpbmUgdW5tYW5nbGVkX3ZlcnNpb24gIiArIHZlcnNpb24KICAgICAgICBzcGVjLmluc2VydChpbnNlcnRfbG9jLCB1bm1hbmdsZWRfdmVyc2lvbikKICAgICAgICByZXR1cm4gc3BlYwpQSwMEFAAAAAAAAAAhACCMdRR9AgAAfQIAAEgAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9jb21tYW5kL2JkaXN0X3dpbmluc3QucHlpbXBvcnQgZGlzdHV0aWxzLmNvbW1hbmQuYmRpc3Rfd2luaW5zdCBhcyBvcmlnCgoKY2xhc3MgYmRpc3Rfd2luaW5zdChvcmlnLmJkaXN0X3dpbmluc3QpOgogICAgZGVmIHJlaW5pdGlhbGl6ZV9jb21tYW5kKHNlbGYsIGNvbW1hbmQsIHJlaW5pdF9zdWJjb21tYW5kcz0wKToKICAgICAgICAiIiIKICAgICAgICBTdXBwbGVtZW50IHJlaW5pdGlhbGl6ZV9jb21tYW5kIHRvIHdvcmsgYXJvdW5kCiAgICAgICAgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTIwODE5CiAgICAgICAgIiIiCiAgICAgICAgY21kID0gc2VsZi5kaXN0cmlidXRpb24ucmVpbml0aWFsaXplX2NvbW1hbmQoCiAgICAgICAgICAgIGNvbW1hbmQsIHJlaW5pdF9zdWJjb21tYW5kcykKICAgICAgICBpZiBjb21tYW5kIGluICgnaW5zdGFsbCcsICdpbnN0YWxsX2xpYicpOgogICAgICAgICAgICBjbWQuaW5zdGFsbF9saWIgPSBOb25lCiAgICAgICAgcmV0dXJuIGNtZAoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgc2VsZi5faXNfcnVubmluZyA9IFRydWUKICAgICAgICB0cnk6CiAgICAgICAgICAgIG9yaWcuYmRpc3Rfd2luaW5zdC5ydW4oc2VsZikKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBzZWxmLl9pc19ydW5uaW5nID0gRmFsc2UKUEsDBBQAAAAAAAAAIQAnGo0bhBEAAIQRAABFAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvY29tbWFuZC9idWlsZF9jbGliLnB5aW1wb3J0IGRpc3R1dGlscy5jb21tYW5kLmJ1aWxkX2NsaWIgYXMgb3JpZwpmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc1NldHVwRXJyb3IKZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZwpmcm9tIHNldHVwdG9vbHMuZGVwX3V0aWwgaW1wb3J0IG5ld2VyX3BhaXJ3aXNlX2dyb3VwCgoKY2xhc3MgYnVpbGRfY2xpYihvcmlnLmJ1aWxkX2NsaWIpOgogICAgIiIiCiAgICBPdmVycmlkZSB0aGUgZGVmYXVsdCBidWlsZF9jbGliIGJlaGF2aW91ciB0byBkbyB0aGUgZm9sbG93aW5nOgoKICAgIDEuIEltcGxlbWVudCBhIHJ1ZGltZW50YXJ5IHRpbWVzdGFtcC1iYXNlZCBkZXBlbmRlbmN5IHN5c3RlbQogICAgICAgc28gJ2NvbXBpbGUoKScgZG9lc24ndCBydW4gZXZlcnkgdGltZS4KICAgIDIuIEFkZCBtb3JlIGtleXMgdG8gdGhlICdidWlsZF9pbmZvJyBkaWN0aW9uYXJ5OgogICAgICAgICogb2JqX2RlcHMgLSBzcGVjaWZ5IGRlcGVuZGVuY2llcyBmb3IgZWFjaCBvYmplY3QgY29tcGlsZWQuCiAgICAgICAgICAgICAgICAgICAgIHRoaXMgc2hvdWxkIGJlIGEgZGljdGlvbmFyeSBtYXBwaW5nIGEga2V5CiAgICAgICAgICAgICAgICAgICAgIHdpdGggdGhlIHNvdXJjZSBmaWxlbmFtZSB0byBhIGxpc3Qgb2YKICAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzLiBVc2UgYW4gZW1wdHkgc3RyaW5nIGZvciBnbG9iYWwKICAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzLgogICAgICAgICogY2ZsYWdzICAgLSBzcGVjaWZ5IGEgbGlzdCBvZiBhZGRpdGlvbmFsIGZsYWdzIHRvIHBhc3MgdG8KICAgICAgICAgICAgICAgICAgICAgdGhlIGNvbXBpbGVyLgogICAgIiIiCgogICAgZGVmIGJ1aWxkX2xpYnJhcmllcyhzZWxmLCBsaWJyYXJpZXMpOgogICAgICAgIGZvciAobGliX25hbWUsIGJ1aWxkX2luZm8pIGluIGxpYnJhcmllczoKICAgICAgICAgICAgc291cmNlcyA9IGJ1aWxkX2luZm8uZ2V0KCdzb3VyY2VzJykKICAgICAgICAgICAgaWYgc291cmNlcyBpcyBOb25lIG9yIG5vdCBpc2luc3RhbmNlKHNvdXJjZXMsIChsaXN0LCB0dXBsZSkpOgogICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAiaW4gJ2xpYnJhcmllcycgb3B0aW9uIChsaWJyYXJ5ICclcycpLCAiCiAgICAgICAgICAgICAgICAgICAgICAgIidzb3VyY2VzJyBtdXN0IGJlIHByZXNlbnQgYW5kIG11c3QgYmUgIgogICAgICAgICAgICAgICAgICAgICAgICJhIGxpc3Qgb2Ygc291cmNlIGZpbGVuYW1lcyIgJSBsaWJfbmFtZSkKICAgICAgICAgICAgc291cmNlcyA9IGxpc3Qoc291cmNlcykKCiAgICAgICAgICAgIGxvZy5pbmZvKCJidWlsZGluZyAnJXMnIGxpYnJhcnkiLCBsaWJfbmFtZSkKCiAgICAgICAgICAgICMgTWFrZSBzdXJlIGV2ZXJ5dGhpbmcgaXMgdGhlIGNvcnJlY3QgdHlwZS4KICAgICAgICAgICAgIyBvYmpfZGVwcyBzaG91bGQgYmUgYSBkaWN0aW9uYXJ5IG9mIGtleXMgYXMgc291cmNlcwogICAgICAgICAgICAjIGFuZCBhIGxpc3QvdHVwbGUgb2YgZmlsZXMgdGhhdCBhcmUgaXRzIGRlcGVuZGVuY2llcy4KICAgICAgICAgICAgb2JqX2RlcHMgPSBidWlsZF9pbmZvLmdldCgnb2JqX2RlcHMnLCBkaWN0KCkpCiAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG9ial9kZXBzLCBkaWN0KToKICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgImluICdsaWJyYXJpZXMnIG9wdGlvbiAobGlicmFyeSAnJXMnKSwgIgogICAgICAgICAgICAgICAgICAgICAgICInb2JqX2RlcHMnIG11c3QgYmUgYSBkaWN0aW9uYXJ5IG9mICIKICAgICAgICAgICAgICAgICAgICAgICAidHlwZSAnc291cmNlOiBsaXN0JyIgJSBsaWJfbmFtZSkKICAgICAgICAgICAgZGVwZW5kZW5jaWVzID0gW10KCiAgICAgICAgICAgICMgR2V0IHRoZSBnbG9iYWwgZGVwZW5kZW5jaWVzIHRoYXQgYXJlIHNwZWNpZmllZCBieSB0aGUgJycga2V5LgogICAgICAgICAgICAjIFRoZXNlIHdpbGwgZ28gaW50byBldmVyeSBzb3VyY2UncyBkZXBlbmRlbmN5IGxpc3QuCiAgICAgICAgICAgIGdsb2JhbF9kZXBzID0gb2JqX2RlcHMuZ2V0KCcnLCBsaXN0KCkpCiAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGdsb2JhbF9kZXBzLCAobGlzdCwgdHVwbGUpKToKICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgImluICdsaWJyYXJpZXMnIG9wdGlvbiAobGlicmFyeSAnJXMnKSwgIgogICAgICAgICAgICAgICAgICAgICAgICInb2JqX2RlcHMnIG11c3QgYmUgYSBkaWN0aW9uYXJ5IG9mICIKICAgICAgICAgICAgICAgICAgICAgICAidHlwZSAnc291cmNlOiBsaXN0JyIgJSBsaWJfbmFtZSkKCiAgICAgICAgICAgICMgQnVpbGQgdGhlIGxpc3QgdG8gYmUgdXNlZCBieSBuZXdlcl9wYWlyd2lzZV9ncm91cAogICAgICAgICAgICAjIGVhY2ggc291cmNlIHdpbGwgYmUgYXV0by1hZGRlZCB0byBpdHMgZGVwZW5kZW5jaWVzLgogICAgICAgICAgICBmb3Igc291cmNlIGluIHNvdXJjZXM6CiAgICAgICAgICAgICAgICBzcmNfZGVwcyA9IFtzb3VyY2VdCiAgICAgICAgICAgICAgICBzcmNfZGVwcy5leHRlbmQoZ2xvYmFsX2RlcHMpCiAgICAgICAgICAgICAgICBleHRyYV9kZXBzID0gb2JqX2RlcHMuZ2V0KHNvdXJjZSwgbGlzdCgpKQogICAgICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZXh0cmFfZGVwcywgKGxpc3QsIHR1cGxlKSk6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgICAgImluICdsaWJyYXJpZXMnIG9wdGlvbiAobGlicmFyeSAnJXMnKSwgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAiJ29ial9kZXBzJyBtdXN0IGJlIGEgZGljdGlvbmFyeSBvZiAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlICdzb3VyY2U6IGxpc3QnIiAlIGxpYl9uYW1lKQogICAgICAgICAgICAgICAgc3JjX2RlcHMuZXh0ZW5kKGV4dHJhX2RlcHMpCiAgICAgICAgICAgICAgICBkZXBlbmRlbmNpZXMuYXBwZW5kKHNyY19kZXBzKQoKICAgICAgICAgICAgZXhwZWN0ZWRfb2JqZWN0cyA9IHNlbGYuY29tcGlsZXIub2JqZWN0X2ZpbGVuYW1lcygKICAgICAgICAgICAgICAgICAgICBzb3VyY2VzLAogICAgICAgICAgICAgICAgICAgIG91dHB1dF9kaXI9c2VsZi5idWlsZF90ZW1wCiAgICAgICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgaWYgbmV3ZXJfcGFpcndpc2VfZ3JvdXAoZGVwZW5kZW5jaWVzLCBleHBlY3RlZF9vYmplY3RzKSAhPSAoW10sIFtdKToKICAgICAgICAgICAgICAgICMgRmlyc3QsIGNvbXBpbGUgdGhlIHNvdXJjZSBjb2RlIHRvIG9iamVjdCBmaWxlcyBpbiB0aGUgbGlicmFyeQogICAgICAgICAgICAgICAgIyBkaXJlY3RvcnkuICAoVGhpcyBzaG91bGQgcHJvYmFibHkgY2hhbmdlIHRvIHB1dHRpbmcgb2JqZWN0CiAgICAgICAgICAgICAgICAjIGZpbGVzIGluIGEgdGVtcG9yYXJ5IGJ1aWxkIGRpcmVjdG9yeS4pCiAgICAgICAgICAgICAgICBtYWNyb3MgPSBidWlsZF9pbmZvLmdldCgnbWFjcm9zJykKICAgICAgICAgICAgICAgIGluY2x1ZGVfZGlycyA9IGJ1aWxkX2luZm8uZ2V0KCdpbmNsdWRlX2RpcnMnKQogICAgICAgICAgICAgICAgY2ZsYWdzID0gYnVpbGRfaW5mby5nZXQoJ2NmbGFncycpCiAgICAgICAgICAgICAgICBvYmplY3RzID0gc2VsZi5jb21waWxlci5jb21waWxlKAogICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VzLAogICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfZGlyPXNlbGYuYnVpbGRfdGVtcCwKICAgICAgICAgICAgICAgICAgICAgICAgbWFjcm9zPW1hY3JvcywKICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZV9kaXJzPWluY2x1ZGVfZGlycywKICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFfcG9zdGFyZ3M9Y2ZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Zz1zZWxmLmRlYnVnCiAgICAgICAgICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgICMgTm93ICJsaW5rIiB0aGUgb2JqZWN0IGZpbGVzIHRvZ2V0aGVyIGludG8gYSBzdGF0aWMgbGlicmFyeS4KICAgICAgICAgICAgIyAoT24gVW5peCBhdCBsZWFzdCwgdGhpcyBpc24ndCByZWFsbHkgbGlua2luZyAtLSBpdCBqdXN0CiAgICAgICAgICAgICMgYnVpbGRzIGFuIGFyY2hpdmUuICBXaGF0ZXZlci4pCiAgICAgICAgICAgIHNlbGYuY29tcGlsZXIuY3JlYXRlX3N0YXRpY19saWIoCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfb2JqZWN0cywKICAgICAgICAgICAgICAgICAgICBsaWJfbmFtZSwKICAgICAgICAgICAgICAgICAgICBvdXRwdXRfZGlyPXNlbGYuYnVpbGRfY2xpYiwKICAgICAgICAgICAgICAgICAgICBkZWJ1Zz1zZWxmLmRlYnVnCiAgICAgICAgICAgICAgICAgICAgKQpQSwMEFAAAAAAAAAAhAI0o/XDbMgAA2zIAAEQAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9jb21tYW5kL2J1aWxkX2V4dC5weWltcG9ydCBvcwppbXBvcnQgc3lzCmltcG9ydCBpdGVydG9vbHMKZnJvbSBkaXN0dXRpbHMuY29tbWFuZC5idWlsZF9leHQgaW1wb3J0IGJ1aWxkX2V4dCBhcyBfZHVfYnVpbGRfZXh0CmZyb20gZGlzdHV0aWxzLmZpbGVfdXRpbCBpbXBvcnQgY29weV9maWxlCmZyb20gZGlzdHV0aWxzLmNjb21waWxlciBpbXBvcnQgbmV3X2NvbXBpbGVyCmZyb20gZGlzdHV0aWxzLnN5c2NvbmZpZyBpbXBvcnQgY3VzdG9taXplX2NvbXBpbGVyLCBnZXRfY29uZmlnX3Zhcgpmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc0Vycm9yCmZyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKCmZyb20gc2V0dXB0b29scy5leHRlbnNpb24gaW1wb3J0IExpYnJhcnkKZnJvbSBzZXR1cHRvb2xzLmV4dGVybiBpbXBvcnQgc2l4CgppZiBzaXguUFkyOgogICAgaW1wb3J0IGltcAoKICAgIEVYVEVOU0lPTl9TVUZGSVhFUyA9IFtzIGZvciBzLCBfLCB0cCBpbiBpbXAuZ2V0X3N1ZmZpeGVzKCkgaWYgdHAgPT0gaW1wLkNfRVhURU5TSU9OXQplbHNlOgogICAgZnJvbSBpbXBvcnRsaWIubWFjaGluZXJ5IGltcG9ydCBFWFRFTlNJT05fU1VGRklYRVMKCnRyeToKICAgICMgQXR0ZW1wdCB0byB1c2UgQ3l0aG9uIGZvciBidWlsZGluZyBleHRlbnNpb25zLCBpZiBhdmFpbGFibGUKICAgIGZyb20gQ3l0aG9uLkRpc3R1dGlscy5idWlsZF9leHQgaW1wb3J0IGJ1aWxkX2V4dCBhcyBfYnVpbGRfZXh0CiAgICAjIEFkZGl0aW9uYWxseSwgYXNzZXJ0IHRoYXQgdGhlIGNvbXBpbGVyIG1vZHVsZSB3aWxsIGxvYWQKICAgICMgYWxzby4gUmVmICMxMjI5LgogICAgX19pbXBvcnRfXygnQ3l0aG9uLkNvbXBpbGVyLk1haW4nKQpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBfYnVpbGRfZXh0ID0gX2R1X2J1aWxkX2V4dAoKIyBtYWtlIHN1cmUgX2NvbmZpZ192YXJzIGlzIGluaXRpYWxpemVkCmdldF9jb25maWdfdmFyKCJMRFNIQVJFRCIpCmZyb20gZGlzdHV0aWxzLnN5c2NvbmZpZyBpbXBvcnQgX2NvbmZpZ192YXJzIGFzIF9DT05GSUdfVkFSUwoKCmRlZiBfY3VzdG9taXplX2NvbXBpbGVyX2Zvcl9zaGxpYihjb21waWxlcik6CiAgICBpZiBzeXMucGxhdGZvcm0gPT0gImRhcndpbiI6CiAgICAgICAgIyBidWlsZGluZyAuZHlsaWIgcmVxdWlyZXMgYWRkaXRpb25hbCBjb21waWxlciBmbGFncyBvbiBPU1g7IGhlcmUgd2UKICAgICAgICAjIHRlbXBvcmFyaWx5IHN1YnN0aXR1dGUgdGhlIHB5Y29uZmlnLmggdmFyaWFibGVzIHNvIHRoYXQgZGlzdHV0aWxzJwogICAgICAgICMgJ2N1c3RvbWl6ZV9jb21waWxlcicgdXNlcyB0aGVtIGJlZm9yZSB3ZSBidWlsZCB0aGUgc2hhcmVkIGxpYnJhcmllcy4KICAgICAgICB0bXAgPSBfQ09ORklHX1ZBUlMuY29weSgpCiAgICAgICAgdHJ5OgogICAgICAgICAgICAjIFhYWCBIZWxwISAgSSBkb24ndCBoYXZlIGFueSBpZGVhIHdoZXRoZXIgdGhlc2UgYXJlIHJpZ2h0Li4uCiAgICAgICAgICAgIF9DT05GSUdfVkFSU1snTERTSEFSRUQnXSA9ICgKICAgICAgICAgICAgICAgICJnY2MgLVdsLC14IC1keW5hbWljbGliIC11bmRlZmluZWQgZHluYW1pY19sb29rdXAiKQogICAgICAgICAgICBfQ09ORklHX1ZBUlNbJ0NDU0hBUkVEJ10gPSAiIC1keW5hbWljbGliIgogICAgICAgICAgICBfQ09ORklHX1ZBUlNbJ1NPJ10gPSAiLmR5bGliIgogICAgICAgICAgICBjdXN0b21pemVfY29tcGlsZXIoY29tcGlsZXIpCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgX0NPTkZJR19WQVJTLmNsZWFyKCkKICAgICAgICAgICAgX0NPTkZJR19WQVJTLnVwZGF0ZSh0bXApCiAgICBlbHNlOgogICAgICAgIGN1c3RvbWl6ZV9jb21waWxlcihjb21waWxlcikKCgpoYXZlX3J0bGQgPSBGYWxzZQp1c2Vfc3R1YnMgPSBGYWxzZQpsaWJ0eXBlID0gJ3NoYXJlZCcKCmlmIHN5cy5wbGF0Zm9ybSA9PSAiZGFyd2luIjoKICAgIHVzZV9zdHVicyA9IFRydWUKZWxpZiBvcy5uYW1lICE9ICdudCc6CiAgICB0cnk6CiAgICAgICAgaW1wb3J0IGRsCiAgICAgICAgdXNlX3N0dWJzID0gaGF2ZV9ydGxkID0gaGFzYXR0cihkbCwgJ1JUTERfTk9XJykKICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICBwYXNzCgppZl9kbCA9IGxhbWJkYSBzOiBzIGlmIGhhdmVfcnRsZCBlbHNlICcnCgoKZGVmIGdldF9hYmkzX3N1ZmZpeCgpOgogICAgIiIiUmV0dXJuIHRoZSBmaWxlIGV4dGVuc2lvbiBmb3IgYW4gYWJpMy1jb21wbGlhbnQgRXh0ZW5zaW9uKCkiIiIKICAgIGZvciBzdWZmaXggaW4gRVhURU5TSU9OX1NVRkZJWEVTOgogICAgICAgIGlmICcuYWJpMycgaW4gc3VmZml4OiAgIyBVbml4CiAgICAgICAgICAgIHJldHVybiBzdWZmaXgKICAgICAgICBlbGlmIHN1ZmZpeCA9PSAnLnB5ZCc6ICAjIFdpbmRvd3MKICAgICAgICAgICAgcmV0dXJuIHN1ZmZpeAoKCmNsYXNzIGJ1aWxkX2V4dChfYnVpbGRfZXh0KToKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgIiIiQnVpbGQgZXh0ZW5zaW9ucyBpbiBidWlsZCBkaXJlY3RvcnksIHRoZW4gY29weSBpZiAtLWlucGxhY2UiIiIKICAgICAgICBvbGRfaW5wbGFjZSwgc2VsZi5pbnBsYWNlID0gc2VsZi5pbnBsYWNlLCAwCiAgICAgICAgX2J1aWxkX2V4dC5ydW4oc2VsZikKICAgICAgICBzZWxmLmlucGxhY2UgPSBvbGRfaW5wbGFjZQogICAgICAgIGlmIG9sZF9pbnBsYWNlOgogICAgICAgICAgICBzZWxmLmNvcHlfZXh0ZW5zaW9uc190b19zb3VyY2UoKQoKICAgIGRlZiBjb3B5X2V4dGVuc2lvbnNfdG9fc291cmNlKHNlbGYpOgogICAgICAgIGJ1aWxkX3B5ID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2J1aWxkX3B5JykKICAgICAgICBmb3IgZXh0IGluIHNlbGYuZXh0ZW5zaW9uczoKICAgICAgICAgICAgZnVsbG5hbWUgPSBzZWxmLmdldF9leHRfZnVsbG5hbWUoZXh0Lm5hbWUpCiAgICAgICAgICAgIGZpbGVuYW1lID0gc2VsZi5nZXRfZXh0X2ZpbGVuYW1lKGZ1bGxuYW1lKQogICAgICAgICAgICBtb2RwYXRoID0gZnVsbG5hbWUuc3BsaXQoJy4nKQogICAgICAgICAgICBwYWNrYWdlID0gJy4nLmpvaW4obW9kcGF0aFs6LTFdKQogICAgICAgICAgICBwYWNrYWdlX2RpciA9IGJ1aWxkX3B5LmdldF9wYWNrYWdlX2RpcihwYWNrYWdlKQogICAgICAgICAgICBkZXN0X2ZpbGVuYW1lID0gb3MucGF0aC5qb2luKHBhY2thZ2VfZGlyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguYmFzZW5hbWUoZmlsZW5hbWUpKQogICAgICAgICAgICBzcmNfZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4oc2VsZi5idWlsZF9saWIsIGZpbGVuYW1lKQoKICAgICAgICAgICAgIyBBbHdheXMgY29weSwgZXZlbiBpZiBzb3VyY2UgaXMgb2xkZXIgdGhhbiBkZXN0aW5hdGlvbiwgdG8gZW5zdXJlCiAgICAgICAgICAgICMgdGhhdCB0aGUgcmlnaHQgZXh0ZW5zaW9ucyBmb3IgdGhlIGN1cnJlbnQgUHl0aG9uL3BsYXRmb3JtIGFyZQogICAgICAgICAgICAjIHVzZWQuCiAgICAgICAgICAgIGNvcHlfZmlsZSgKICAgICAgICAgICAgICAgIHNyY19maWxlbmFtZSwgZGVzdF9maWxlbmFtZSwgdmVyYm9zZT1zZWxmLnZlcmJvc2UsCiAgICAgICAgICAgICAgICBkcnlfcnVuPXNlbGYuZHJ5X3J1bgogICAgICAgICAgICApCiAgICAgICAgICAgIGlmIGV4dC5fbmVlZHNfc3R1YjoKICAgICAgICAgICAgICAgIHNlbGYud3JpdGVfc3R1YihwYWNrYWdlX2RpciBvciBvcy5jdXJkaXIsIGV4dCwgVHJ1ZSkKCiAgICBkZWYgZ2V0X2V4dF9maWxlbmFtZShzZWxmLCBmdWxsbmFtZSk6CiAgICAgICAgZmlsZW5hbWUgPSBfYnVpbGRfZXh0LmdldF9leHRfZmlsZW5hbWUoc2VsZiwgZnVsbG5hbWUpCiAgICAgICAgaWYgZnVsbG5hbWUgaW4gc2VsZi5leHRfbWFwOgogICAgICAgICAgICBleHQgPSBzZWxmLmV4dF9tYXBbZnVsbG5hbWVdCiAgICAgICAgICAgIHVzZV9hYmkzID0gKAogICAgICAgICAgICAgICAgc2l4LlBZMwogICAgICAgICAgICAgICAgYW5kIGdldGF0dHIoZXh0LCAncHlfbGltaXRlZF9hcGknKQogICAgICAgICAgICAgICAgYW5kIGdldF9hYmkzX3N1ZmZpeCgpCiAgICAgICAgICAgICkKICAgICAgICAgICAgaWYgdXNlX2FiaTM6CiAgICAgICAgICAgICAgICBzb19leHQgPSBnZXRfY29uZmlnX3ZhcignRVhUX1NVRkZJWCcpCiAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lWzotbGVuKHNvX2V4dCldCiAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lICsgZ2V0X2FiaTNfc3VmZml4KCkKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShleHQsIExpYnJhcnkpOgogICAgICAgICAgICAgICAgZm4sIGV4dCA9IG9zLnBhdGguc3BsaXRleHQoZmlsZW5hbWUpCiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5zaGxpYl9jb21waWxlci5saWJyYXJ5X2ZpbGVuYW1lKGZuLCBsaWJ0eXBlKQogICAgICAgICAgICBlbGlmIHVzZV9zdHVicyBhbmQgZXh0Ll9saW5rc190b19keW5hbWljOgogICAgICAgICAgICAgICAgZCwgZm4gPSBvcy5wYXRoLnNwbGl0KGZpbGVuYW1lKQogICAgICAgICAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbihkLCAnZGwtJyArIGZuKQogICAgICAgIHJldHVybiBmaWxlbmFtZQoKICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgX2J1aWxkX2V4dC5pbml0aWFsaXplX29wdGlvbnMoc2VsZikKICAgICAgICBzZWxmLnNobGliX2NvbXBpbGVyID0gTm9uZQogICAgICAgIHNlbGYuc2hsaWJzID0gW10KICAgICAgICBzZWxmLmV4dF9tYXAgPSB7fQoKICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIF9idWlsZF9leHQuZmluYWxpemVfb3B0aW9ucyhzZWxmKQogICAgICAgIHNlbGYuZXh0ZW5zaW9ucyA9IHNlbGYuZXh0ZW5zaW9ucyBvciBbXQogICAgICAgIHNlbGYuY2hlY2tfZXh0ZW5zaW9uc19saXN0KHNlbGYuZXh0ZW5zaW9ucykKICAgICAgICBzZWxmLnNobGlicyA9IFtleHQgZm9yIGV4dCBpbiBzZWxmLmV4dGVuc2lvbnMKICAgICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV4dCwgTGlicmFyeSldCiAgICAgICAgaWYgc2VsZi5zaGxpYnM6CiAgICAgICAgICAgIHNlbGYuc2V0dXBfc2hsaWJfY29tcGlsZXIoKQogICAgICAgIGZvciBleHQgaW4gc2VsZi5leHRlbnNpb25zOgogICAgICAgICAgICBleHQuX2Z1bGxfbmFtZSA9IHNlbGYuZ2V0X2V4dF9mdWxsbmFtZShleHQubmFtZSkKICAgICAgICBmb3IgZXh0IGluIHNlbGYuZXh0ZW5zaW9uczoKICAgICAgICAgICAgZnVsbG5hbWUgPSBleHQuX2Z1bGxfbmFtZQogICAgICAgICAgICBzZWxmLmV4dF9tYXBbZnVsbG5hbWVdID0gZXh0CgogICAgICAgICAgICAjIGRpc3R1dGlscyAzLjEgd2lsbCBhbHNvIGFzayBmb3IgbW9kdWxlIG5hbWVzCiAgICAgICAgICAgICMgWFhYIHdoYXQgdG8gZG8gd2l0aCBjb25mbGljdHM/CiAgICAgICAgICAgIHNlbGYuZXh0X21hcFtmdWxsbmFtZS5zcGxpdCgnLicpWy0xXV0gPSBleHQKCiAgICAgICAgICAgIGx0ZCA9IHNlbGYuc2hsaWJzIGFuZCBzZWxmLmxpbmtzX3RvX2R5bmFtaWMoZXh0KSBvciBGYWxzZQogICAgICAgICAgICBucyA9IGx0ZCBhbmQgdXNlX3N0dWJzIGFuZCBub3QgaXNpbnN0YW5jZShleHQsIExpYnJhcnkpCiAgICAgICAgICAgIGV4dC5fbGlua3NfdG9fZHluYW1pYyA9IGx0ZAogICAgICAgICAgICBleHQuX25lZWRzX3N0dWIgPSBucwogICAgICAgICAgICBmaWxlbmFtZSA9IGV4dC5fZmlsZV9uYW1lID0gc2VsZi5nZXRfZXh0X2ZpbGVuYW1lKGZ1bGxuYW1lKQogICAgICAgICAgICBsaWJkaXIgPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5qb2luKHNlbGYuYnVpbGRfbGliLCBmaWxlbmFtZSkpCiAgICAgICAgICAgIGlmIGx0ZCBhbmQgbGliZGlyIG5vdCBpbiBleHQubGlicmFyeV9kaXJzOgogICAgICAgICAgICAgICAgZXh0LmxpYnJhcnlfZGlycy5hcHBlbmQobGliZGlyKQogICAgICAgICAgICBpZiBsdGQgYW5kIHVzZV9zdHVicyBhbmQgb3MuY3VyZGlyIG5vdCBpbiBleHQucnVudGltZV9saWJyYXJ5X2RpcnM6CiAgICAgICAgICAgICAgICBleHQucnVudGltZV9saWJyYXJ5X2RpcnMuYXBwZW5kKG9zLmN1cmRpcikKCiAgICBkZWYgc2V0dXBfc2hsaWJfY29tcGlsZXIoc2VsZik6CiAgICAgICAgY29tcGlsZXIgPSBzZWxmLnNobGliX2NvbXBpbGVyID0gbmV3X2NvbXBpbGVyKAogICAgICAgICAgICBjb21waWxlcj1zZWxmLmNvbXBpbGVyLCBkcnlfcnVuPXNlbGYuZHJ5X3J1biwgZm9yY2U9c2VsZi5mb3JjZQogICAgICAgICkKICAgICAgICBfY3VzdG9taXplX2NvbXBpbGVyX2Zvcl9zaGxpYihjb21waWxlcikKCiAgICAgICAgaWYgc2VsZi5pbmNsdWRlX2RpcnMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGNvbXBpbGVyLnNldF9pbmNsdWRlX2RpcnMoc2VsZi5pbmNsdWRlX2RpcnMpCiAgICAgICAgaWYgc2VsZi5kZWZpbmUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICMgJ2RlZmluZScgb3B0aW9uIGlzIGEgbGlzdCBvZiAobmFtZSx2YWx1ZSkgdHVwbGVzCiAgICAgICAgICAgIGZvciAobmFtZSwgdmFsdWUpIGluIHNlbGYuZGVmaW5lOgogICAgICAgICAgICAgICAgY29tcGlsZXIuZGVmaW5lX21hY3JvKG5hbWUsIHZhbHVlKQogICAgICAgIGlmIHNlbGYudW5kZWYgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGZvciBtYWNybyBpbiBzZWxmLnVuZGVmOgogICAgICAgICAgICAgICAgY29tcGlsZXIudW5kZWZpbmVfbWFjcm8obWFjcm8pCiAgICAgICAgaWYgc2VsZi5saWJyYXJpZXMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGNvbXBpbGVyLnNldF9saWJyYXJpZXMoc2VsZi5saWJyYXJpZXMpCiAgICAgICAgaWYgc2VsZi5saWJyYXJ5X2RpcnMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGNvbXBpbGVyLnNldF9saWJyYXJ5X2RpcnMoc2VsZi5saWJyYXJ5X2RpcnMpCiAgICAgICAgaWYgc2VsZi5ycGF0aCBpcyBub3QgTm9uZToKICAgICAgICAgICAgY29tcGlsZXIuc2V0X3J1bnRpbWVfbGlicmFyeV9kaXJzKHNlbGYucnBhdGgpCiAgICAgICAgaWYgc2VsZi5saW5rX29iamVjdHMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGNvbXBpbGVyLnNldF9saW5rX29iamVjdHMoc2VsZi5saW5rX29iamVjdHMpCgogICAgICAgICMgaGFjayBzbyBkaXN0dXRpbHMnIGJ1aWxkX2V4dGVuc2lvbigpIGJ1aWxkcyBhIGxpYnJhcnkgaW5zdGVhZAogICAgICAgIGNvbXBpbGVyLmxpbmtfc2hhcmVkX29iamVjdCA9IGxpbmtfc2hhcmVkX29iamVjdC5fX2dldF9fKGNvbXBpbGVyKQoKICAgIGRlZiBnZXRfZXhwb3J0X3N5bWJvbHMoc2VsZiwgZXh0KToKICAgICAgICBpZiBpc2luc3RhbmNlKGV4dCwgTGlicmFyeSk6CiAgICAgICAgICAgIHJldHVybiBleHQuZXhwb3J0X3N5bWJvbHMKICAgICAgICByZXR1cm4gX2J1aWxkX2V4dC5nZXRfZXhwb3J0X3N5bWJvbHMoc2VsZiwgZXh0KQoKICAgIGRlZiBidWlsZF9leHRlbnNpb24oc2VsZiwgZXh0KToKICAgICAgICBleHQuX2NvbnZlcnRfcHl4X3NvdXJjZXNfdG9fbGFuZygpCiAgICAgICAgX2NvbXBpbGVyID0gc2VsZi5jb21waWxlcgogICAgICAgIHRyeToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShleHQsIExpYnJhcnkpOgogICAgICAgICAgICAgICAgc2VsZi5jb21waWxlciA9IHNlbGYuc2hsaWJfY29tcGlsZXIKICAgICAgICAgICAgX2J1aWxkX2V4dC5idWlsZF9leHRlbnNpb24oc2VsZiwgZXh0KQogICAgICAgICAgICBpZiBleHQuX25lZWRzX3N0dWI6CiAgICAgICAgICAgICAgICBjbWQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnYnVpbGRfcHknKS5idWlsZF9saWIKICAgICAgICAgICAgICAgIHNlbGYud3JpdGVfc3R1YihjbWQsIGV4dCkKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBzZWxmLmNvbXBpbGVyID0gX2NvbXBpbGVyCgogICAgZGVmIGxpbmtzX3RvX2R5bmFtaWMoc2VsZiwgZXh0KToKICAgICAgICAiIiJSZXR1cm4gdHJ1ZSBpZiAnZXh0JyBsaW5rcyB0byBhIGR5bmFtaWMgbGliIGluIHRoZSBzYW1lIHBhY2thZ2UiIiIKICAgICAgICAjIFhYWCB0aGlzIHNob3VsZCBjaGVjayB0byBlbnN1cmUgdGhlIGxpYiBpcyBhY3R1YWxseSBiZWluZyBidWlsdAogICAgICAgICMgWFhYIGFzIGR5bmFtaWMsIGFuZCBub3QganVzdCB1c2luZyBhIGxvY2FsbHktZm91bmQgdmVyc2lvbiBvciBhCiAgICAgICAgIyBYWFggc3RhdGljLWNvbXBpbGVkIHZlcnNpb24KICAgICAgICBsaWJuYW1lcyA9IGRpY3QuZnJvbWtleXMoW2xpYi5fZnVsbF9uYW1lIGZvciBsaWIgaW4gc2VsZi5zaGxpYnNdKQogICAgICAgIHBrZyA9ICcuJy5qb2luKGV4dC5fZnVsbF9uYW1lLnNwbGl0KCcuJylbOi0xXSArIFsnJ10pCiAgICAgICAgcmV0dXJuIGFueShwa2cgKyBsaWJuYW1lIGluIGxpYm5hbWVzIGZvciBsaWJuYW1lIGluIGV4dC5saWJyYXJpZXMpCgogICAgZGVmIGdldF9vdXRwdXRzKHNlbGYpOgogICAgICAgIHJldHVybiBfYnVpbGRfZXh0LmdldF9vdXRwdXRzKHNlbGYpICsgc2VsZi5fX2dldF9zdHVic19vdXRwdXRzKCkKCiAgICBkZWYgX19nZXRfc3R1YnNfb3V0cHV0cyhzZWxmKToKICAgICAgICAjIGFzc2VtYmxlIHRoZSBiYXNlIG5hbWUgZm9yIGVhY2ggZXh0ZW5zaW9uIHRoYXQgbmVlZHMgYSBzdHViCiAgICAgICAgbnNfZXh0X2Jhc2VzID0gKAogICAgICAgICAgICBvcy5wYXRoLmpvaW4oc2VsZi5idWlsZF9saWIsICpleHQuX2Z1bGxfbmFtZS5zcGxpdCgnLicpKQogICAgICAgICAgICBmb3IgZXh0IGluIHNlbGYuZXh0ZW5zaW9ucwogICAgICAgICAgICBpZiBleHQuX25lZWRzX3N0dWIKICAgICAgICApCiAgICAgICAgIyBwYWlyIGVhY2ggYmFzZSB3aXRoIHRoZSBleHRlbnNpb24KICAgICAgICBwYWlycyA9IGl0ZXJ0b29scy5wcm9kdWN0KG5zX2V4dF9iYXNlcywgc2VsZi5fX2dldF9vdXRwdXRfZXh0ZW5zaW9ucygpKQogICAgICAgIHJldHVybiBsaXN0KGJhc2UgKyBmbmV4dCBmb3IgYmFzZSwgZm5leHQgaW4gcGFpcnMpCgogICAgZGVmIF9fZ2V0X291dHB1dF9leHRlbnNpb25zKHNlbGYpOgogICAgICAgIHlpZWxkICcucHknCiAgICAgICAgeWllbGQgJy5weWMnCiAgICAgICAgaWYgc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2J1aWxkX3B5Jykub3B0aW1pemU6CiAgICAgICAgICAgIHlpZWxkICcucHlvJwoKICAgIGRlZiB3cml0ZV9zdHViKHNlbGYsIG91dHB1dF9kaXIsIGV4dCwgY29tcGlsZT1GYWxzZSk6CiAgICAgICAgbG9nLmluZm8oIndyaXRpbmcgc3R1YiBsb2FkZXIgZm9yICVzIHRvICVzIiwgZXh0Ll9mdWxsX25hbWUsCiAgICAgICAgICAgICAgICAgb3V0cHV0X2RpcikKICAgICAgICBzdHViX2ZpbGUgPSAob3MucGF0aC5qb2luKG91dHB1dF9kaXIsICpleHQuX2Z1bGxfbmFtZS5zcGxpdCgnLicpKSArCiAgICAgICAgICAgICAgICAgICAgICcucHknKQogICAgICAgIGlmIGNvbXBpbGUgYW5kIG9zLnBhdGguZXhpc3RzKHN0dWJfZmlsZSk6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKHN0dWJfZmlsZSArICIgYWxyZWFkeSBleGlzdHMhIFBsZWFzZSBkZWxldGUuIikKICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICBmID0gb3BlbihzdHViX2ZpbGUsICd3JykKICAgICAgICAgICAgZi53cml0ZSgKICAgICAgICAgICAgICAgICdcbicuam9pbihbCiAgICAgICAgICAgICAgICAgICAgImRlZiBfX2Jvb3RzdHJhcF9fKCk6IiwKICAgICAgICAgICAgICAgICAgICAiICAgZ2xvYmFsIF9fYm9vdHN0cmFwX18sIF9fZmlsZV9fLCBfX2xvYWRlcl9fIiwKICAgICAgICAgICAgICAgICAgICAiICAgaW1wb3J0IHN5cywgb3MsIHBrZ19yZXNvdXJjZXMsIGltcCIgKyBpZl9kbCgiLCBkbCIpLAogICAgICAgICAgICAgICAgICAgICIgICBfX2ZpbGVfXyA9IHBrZ19yZXNvdXJjZXMucmVzb3VyY2VfZmlsZW5hbWUiCiAgICAgICAgICAgICAgICAgICAgIihfX25hbWVfXywlcikiCiAgICAgICAgICAgICAgICAgICAgJSBvcy5wYXRoLmJhc2VuYW1lKGV4dC5fZmlsZV9uYW1lKSwKICAgICAgICAgICAgICAgICAgICAiICAgZGVsIF9fYm9vdHN0cmFwX18iLAogICAgICAgICAgICAgICAgICAgICIgICBpZiAnX19sb2FkZXJfXycgaW4gZ2xvYmFscygpOiIsCiAgICAgICAgICAgICAgICAgICAgIiAgICAgICBkZWwgX19sb2FkZXJfXyIsCiAgICAgICAgICAgICAgICAgICAgaWZfZGwoIiAgIG9sZF9mbGFncyA9IHN5cy5nZXRkbG9wZW5mbGFncygpIiksCiAgICAgICAgICAgICAgICAgICAgIiAgIG9sZF9kaXIgPSBvcy5nZXRjd2QoKSIsCiAgICAgICAgICAgICAgICAgICAgIiAgIHRyeToiLAogICAgICAgICAgICAgICAgICAgICIgICAgIG9zLmNoZGlyKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpIiwKICAgICAgICAgICAgICAgICAgICBpZl9kbCgiICAgICBzeXMuc2V0ZGxvcGVuZmxhZ3MoZGwuUlRMRF9OT1cpIiksCiAgICAgICAgICAgICAgICAgICAgIiAgICAgaW1wLmxvYWRfZHluYW1pYyhfX25hbWVfXyxfX2ZpbGVfXykiLAogICAgICAgICAgICAgICAgICAgICIgICBmaW5hbGx5OiIsCiAgICAgICAgICAgICAgICAgICAgaWZfZGwoIiAgICAgc3lzLnNldGRsb3BlbmZsYWdzKG9sZF9mbGFncykiKSwKICAgICAgICAgICAgICAgICAgICAiICAgICBvcy5jaGRpcihvbGRfZGlyKSIsCiAgICAgICAgICAgICAgICAgICAgIl9fYm9vdHN0cmFwX18oKSIsCiAgICAgICAgICAgICAgICAgICAgIiIgICMgdGVybWluYWwgXG4KICAgICAgICAgICAgICAgIF0pCiAgICAgICAgICAgICkKICAgICAgICAgICAgZi5jbG9zZSgpCiAgICAgICAgaWYgY29tcGlsZToKICAgICAgICAgICAgZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgYnl0ZV9jb21waWxlCgogICAgICAgICAgICBieXRlX2NvbXBpbGUoW3N0dWJfZmlsZV0sIG9wdGltaXplPTAsCiAgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZT1UcnVlLCBkcnlfcnVuPXNlbGYuZHJ5X3J1bikKICAgICAgICAgICAgb3B0aW1pemUgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnaW5zdGFsbF9saWInKS5vcHRpbWl6ZQogICAgICAgICAgICBpZiBvcHRpbWl6ZSA+IDA6CiAgICAgICAgICAgICAgICBieXRlX2NvbXBpbGUoW3N0dWJfZmlsZV0sIG9wdGltaXplPW9wdGltaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlPVRydWUsIGRyeV9ydW49c2VsZi5kcnlfcnVuKQogICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhzdHViX2ZpbGUpIGFuZCBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICAgICAgb3MudW5saW5rKHN0dWJfZmlsZSkKCgppZiB1c2Vfc3R1YnMgb3Igb3MubmFtZSA9PSAnbnQnOgogICAgIyBCdWlsZCBzaGFyZWQgbGlicmFyaWVzCiAgICAjCiAgICBkZWYgbGlua19zaGFyZWRfb2JqZWN0KAogICAgICAgICAgICBzZWxmLCBvYmplY3RzLCBvdXRwdXRfbGlibmFtZSwgb3V0cHV0X2Rpcj1Ob25lLCBsaWJyYXJpZXM9Tm9uZSwKICAgICAgICAgICAgbGlicmFyeV9kaXJzPU5vbmUsIHJ1bnRpbWVfbGlicmFyeV9kaXJzPU5vbmUsIGV4cG9ydF9zeW1ib2xzPU5vbmUsCiAgICAgICAgICAgIGRlYnVnPTAsIGV4dHJhX3ByZWFyZ3M9Tm9uZSwgZXh0cmFfcG9zdGFyZ3M9Tm9uZSwgYnVpbGRfdGVtcD1Ob25lLAogICAgICAgICAgICB0YXJnZXRfbGFuZz1Ob25lKToKICAgICAgICBzZWxmLmxpbmsoCiAgICAgICAgICAgIHNlbGYuU0hBUkVEX0xJQlJBUlksIG9iamVjdHMsIG91dHB1dF9saWJuYW1lLAogICAgICAgICAgICBvdXRwdXRfZGlyLCBsaWJyYXJpZXMsIGxpYnJhcnlfZGlycywgcnVudGltZV9saWJyYXJ5X2RpcnMsCiAgICAgICAgICAgIGV4cG9ydF9zeW1ib2xzLCBkZWJ1ZywgZXh0cmFfcHJlYXJncywgZXh0cmFfcG9zdGFyZ3MsCiAgICAgICAgICAgIGJ1aWxkX3RlbXAsIHRhcmdldF9sYW5nCiAgICAgICAgKQplbHNlOgogICAgIyBCdWlsZCBzdGF0aWMgbGlicmFyaWVzIGV2ZXJ5d2hlcmUgZWxzZQogICAgbGlidHlwZSA9ICdzdGF0aWMnCgogICAgZGVmIGxpbmtfc2hhcmVkX29iamVjdCgKICAgICAgICAgICAgc2VsZiwgb2JqZWN0cywgb3V0cHV0X2xpYm5hbWUsIG91dHB1dF9kaXI9Tm9uZSwgbGlicmFyaWVzPU5vbmUsCiAgICAgICAgICAgIGxpYnJhcnlfZGlycz1Ob25lLCBydW50aW1lX2xpYnJhcnlfZGlycz1Ob25lLCBleHBvcnRfc3ltYm9scz1Ob25lLAogICAgICAgICAgICBkZWJ1Zz0wLCBleHRyYV9wcmVhcmdzPU5vbmUsIGV4dHJhX3Bvc3RhcmdzPU5vbmUsIGJ1aWxkX3RlbXA9Tm9uZSwKICAgICAgICAgICAgdGFyZ2V0X2xhbmc9Tm9uZSk6CiAgICAgICAgIyBYWFggd2UgbmVlZCB0byBlaXRoZXIgZGlzYWxsb3cgdGhlc2UgYXR0cnMgb24gTGlicmFyeSBpbnN0YW5jZXMsCiAgICAgICAgIyBvciB3YXJuL2Fib3J0IGhlcmUgaWYgc2V0LCBvciBzb21ldGhpbmcuLi4KICAgICAgICAjIGxpYnJhcmllcz1Ob25lLCBsaWJyYXJ5X2RpcnM9Tm9uZSwgcnVudGltZV9saWJyYXJ5X2RpcnM9Tm9uZSwKICAgICAgICAjIGV4cG9ydF9zeW1ib2xzPU5vbmUsIGV4dHJhX3ByZWFyZ3M9Tm9uZSwgZXh0cmFfcG9zdGFyZ3M9Tm9uZSwKICAgICAgICAjIGJ1aWxkX3RlbXA9Tm9uZQoKICAgICAgICBhc3NlcnQgb3V0cHV0X2RpciBpcyBOb25lICAjIGRpc3R1dGlscyBidWlsZF9leHQgZG9lc24ndCBwYXNzIHRoaXMKICAgICAgICBvdXRwdXRfZGlyLCBmaWxlbmFtZSA9IG9zLnBhdGguc3BsaXQob3V0cHV0X2xpYm5hbWUpCiAgICAgICAgYmFzZW5hbWUsIGV4dCA9IG9zLnBhdGguc3BsaXRleHQoZmlsZW5hbWUpCiAgICAgICAgaWYgc2VsZi5saWJyYXJ5X2ZpbGVuYW1lKCJ4Iikuc3RhcnRzd2l0aCgnbGliJyk6CiAgICAgICAgICAgICMgc3RyaXAgJ2xpYicgcHJlZml4OyB0aGlzIGlzIGtsdWRneSBpZiBzb21lIHBsYXRmb3JtIHVzZXMKICAgICAgICAgICAgIyBhIGRpZmZlcmVudCBwcmVmaXgKICAgICAgICAgICAgYmFzZW5hbWUgPSBiYXNlbmFtZVszOl0KCiAgICAgICAgc2VsZi5jcmVhdGVfc3RhdGljX2xpYigKICAgICAgICAgICAgb2JqZWN0cywgYmFzZW5hbWUsIG91dHB1dF9kaXIsIGRlYnVnLCB0YXJnZXRfbGFuZwogICAgICAgICkKUEsDBBQAAAAAAAAAIQBARkLcfCUAAHwlAABDAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvY29tbWFuZC9idWlsZF9weS5weWZyb20gZ2xvYiBpbXBvcnQgZ2xvYgpmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBjb252ZXJ0X3BhdGgKaW1wb3J0IGRpc3R1dGlscy5jb21tYW5kLmJ1aWxkX3B5IGFzIG9yaWcKaW1wb3J0IG9zCmltcG9ydCBmbm1hdGNoCmltcG9ydCB0ZXh0d3JhcAppbXBvcnQgaW8KaW1wb3J0IGRpc3R1dGlscy5lcnJvcnMKaW1wb3J0IGl0ZXJ0b29scwoKZnJvbSBzZXR1cHRvb2xzLmV4dGVybiBpbXBvcnQgc2l4CmZyb20gc2V0dXB0b29scy5leHRlcm4uc2l4Lm1vdmVzIGltcG9ydCBtYXAsIGZpbHRlciwgZmlsdGVyZmFsc2UKCnRyeToKICAgIGZyb20gc2V0dXB0b29scy5saWIydG8zX2V4IGltcG9ydCBNaXhpbjJ0bzMKZXhjZXB0IEltcG9ydEVycm9yOgoKICAgIGNsYXNzIE1peGluMnRvMzoKICAgICAgICBkZWYgcnVuXzJ0bzMoc2VsZiwgZmlsZXMsIGRvY3Rlc3RzPVRydWUpOgogICAgICAgICAgICAiZG8gbm90aGluZyIKCgpjbGFzcyBidWlsZF9weShvcmlnLmJ1aWxkX3B5LCBNaXhpbjJ0bzMpOgogICAgIiIiRW5oYW5jZWQgJ2J1aWxkX3B5JyBjb21tYW5kIHRoYXQgaW5jbHVkZXMgZGF0YSBmaWxlcyB3aXRoIHBhY2thZ2VzCgogICAgVGhlIGRhdGEgZmlsZXMgYXJlIHNwZWNpZmllZCB2aWEgYSAncGFja2FnZV9kYXRhJyBhcmd1bWVudCB0byAnc2V0dXAoKScuCiAgICBTZWUgJ3NldHVwdG9vbHMuZGlzdC5EaXN0cmlidXRpb24nIGZvciBtb3JlIGRldGFpbHMuCgogICAgQWxzbywgdGhpcyB2ZXJzaW9uIG9mIHRoZSAnYnVpbGRfcHknIGNvbW1hbmQgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IGJvdGgKICAgICdweV9tb2R1bGVzJyBhbmQgJ3BhY2thZ2VzJyBpbiB0aGUgc2FtZSBzZXR1cCBvcGVyYXRpb24uCiAgICAiIiIKCiAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBvcmlnLmJ1aWxkX3B5LmZpbmFsaXplX29wdGlvbnMoc2VsZikKICAgICAgICBzZWxmLnBhY2thZ2VfZGF0YSA9IHNlbGYuZGlzdHJpYnV0aW9uLnBhY2thZ2VfZGF0YQogICAgICAgIHNlbGYuZXhjbHVkZV9wYWNrYWdlX2RhdGEgPSAoc2VsZi5kaXN0cmlidXRpb24uZXhjbHVkZV9wYWNrYWdlX2RhdGEgb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt9KQogICAgICAgIGlmICdkYXRhX2ZpbGVzJyBpbiBzZWxmLl9fZGljdF9fOgogICAgICAgICAgICBkZWwgc2VsZi5fX2RpY3RfX1snZGF0YV9maWxlcyddCiAgICAgICAgc2VsZi5fX3VwZGF0ZWRfZmlsZXMgPSBbXQogICAgICAgIHNlbGYuX19kb2N0ZXN0c18ydG8zID0gW10KCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgICIiIkJ1aWxkIG1vZHVsZXMsIHBhY2thZ2VzLCBhbmQgY29weSBkYXRhIGZpbGVzIHRvIGJ1aWxkIGRpcmVjdG9yeSIiIgogICAgICAgIGlmIG5vdCBzZWxmLnB5X21vZHVsZXMgYW5kIG5vdCBzZWxmLnBhY2thZ2VzOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgaWYgc2VsZi5weV9tb2R1bGVzOgogICAgICAgICAgICBzZWxmLmJ1aWxkX21vZHVsZXMoKQoKICAgICAgICBpZiBzZWxmLnBhY2thZ2VzOgogICAgICAgICAgICBzZWxmLmJ1aWxkX3BhY2thZ2VzKCkKICAgICAgICAgICAgc2VsZi5idWlsZF9wYWNrYWdlX2RhdGEoKQoKICAgICAgICBzZWxmLnJ1bl8ydG8zKHNlbGYuX191cGRhdGVkX2ZpbGVzLCBGYWxzZSkKICAgICAgICBzZWxmLnJ1bl8ydG8zKHNlbGYuX191cGRhdGVkX2ZpbGVzLCBUcnVlKQogICAgICAgIHNlbGYucnVuXzJ0bzMoc2VsZi5fX2RvY3Rlc3RzXzJ0bzMsIFRydWUpCgogICAgICAgICMgT25seSBjb21waWxlIGFjdHVhbCAucHkgZmlsZXMsIHVzaW5nIG91ciBiYXNlIGNsYXNzJyBpZGVhIG9mIHdoYXQgb3VyCiAgICAgICAgIyBvdXRwdXQgZmlsZXMgYXJlLgogICAgICAgIHNlbGYuYnl0ZV9jb21waWxlKG9yaWcuYnVpbGRfcHkuZ2V0X291dHB1dHMoc2VsZiwgaW5jbHVkZV9ieXRlY29kZT0wKSkKCiAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgYXR0cik6CiAgICAgICAgImxhemlseSBjb21wdXRlIGRhdGEgZmlsZXMiCiAgICAgICAgaWYgYXR0ciA9PSAnZGF0YV9maWxlcyc6CiAgICAgICAgICAgIHNlbGYuZGF0YV9maWxlcyA9IHNlbGYuX2dldF9kYXRhX2ZpbGVzKCkKICAgICAgICAgICAgcmV0dXJuIHNlbGYuZGF0YV9maWxlcwogICAgICAgIHJldHVybiBvcmlnLmJ1aWxkX3B5Ll9fZ2V0YXR0cl9fKHNlbGYsIGF0dHIpCgogICAgZGVmIGJ1aWxkX21vZHVsZShzZWxmLCBtb2R1bGUsIG1vZHVsZV9maWxlLCBwYWNrYWdlKToKICAgICAgICBpZiBzaXguUFkyIGFuZCBpc2luc3RhbmNlKHBhY2thZ2UsIHNpeC5zdHJpbmdfdHlwZXMpOgogICAgICAgICAgICAjIGF2b2lkIGVycm9ycyBvbiBQeXRob24gMiB3aGVuIHVuaWNvZGUgaXMgcGFzc2VkICgjMTkwKQogICAgICAgICAgICBwYWNrYWdlID0gcGFja2FnZS5zcGxpdCgnLicpCiAgICAgICAgb3V0ZmlsZSwgY29waWVkID0gb3JpZy5idWlsZF9weS5idWlsZF9tb2R1bGUoc2VsZiwgbW9kdWxlLCBtb2R1bGVfZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlKQogICAgICAgIGlmIGNvcGllZDoKICAgICAgICAgICAgc2VsZi5fX3VwZGF0ZWRfZmlsZXMuYXBwZW5kKG91dGZpbGUpCiAgICAgICAgcmV0dXJuIG91dGZpbGUsIGNvcGllZAoKICAgIGRlZiBfZ2V0X2RhdGFfZmlsZXMoc2VsZik6CiAgICAgICAgIiIiR2VuZXJhdGUgbGlzdCBvZiAnKHBhY2thZ2Usc3JjX2RpcixidWlsZF9kaXIsZmlsZW5hbWVzKScgdHVwbGVzIiIiCiAgICAgICAgc2VsZi5hbmFseXplX21hbmlmZXN0KCkKICAgICAgICByZXR1cm4gbGlzdChtYXAoc2VsZi5fZ2V0X3BrZ19kYXRhX2ZpbGVzLCBzZWxmLnBhY2thZ2VzIG9yICgpKSkKCiAgICBkZWYgX2dldF9wa2dfZGF0YV9maWxlcyhzZWxmLCBwYWNrYWdlKToKICAgICAgICAjIExvY2F0ZSBwYWNrYWdlIHNvdXJjZSBkaXJlY3RvcnkKICAgICAgICBzcmNfZGlyID0gc2VsZi5nZXRfcGFja2FnZV9kaXIocGFja2FnZSkKCiAgICAgICAgIyBDb21wdXRlIHBhY2thZ2UgYnVpbGQgZGlyZWN0b3J5CiAgICAgICAgYnVpbGRfZGlyID0gb3MucGF0aC5qb2luKCooW3NlbGYuYnVpbGRfbGliXSArIHBhY2thZ2Uuc3BsaXQoJy4nKSkpCgogICAgICAgICMgU3RyaXAgZGlyZWN0b3J5IGZyb20gZ2xvYmJlZCBmaWxlbmFtZXMKICAgICAgICBmaWxlbmFtZXMgPSBbCiAgICAgICAgICAgIG9zLnBhdGgucmVscGF0aChmaWxlLCBzcmNfZGlyKQogICAgICAgICAgICBmb3IgZmlsZSBpbiBzZWxmLmZpbmRfZGF0YV9maWxlcyhwYWNrYWdlLCBzcmNfZGlyKQogICAgICAgIF0KICAgICAgICByZXR1cm4gcGFja2FnZSwgc3JjX2RpciwgYnVpbGRfZGlyLCBmaWxlbmFtZXMKCiAgICBkZWYgZmluZF9kYXRhX2ZpbGVzKHNlbGYsIHBhY2thZ2UsIHNyY19kaXIpOgogICAgICAgICIiIlJldHVybiBmaWxlbmFtZXMgZm9yIHBhY2thZ2UncyBkYXRhIGZpbGVzIGluICdzcmNfZGlyJyIiIgogICAgICAgIHBhdHRlcm5zID0gc2VsZi5fZ2V0X3BsYXRmb3JtX3BhdHRlcm5zKAogICAgICAgICAgICBzZWxmLnBhY2thZ2VfZGF0YSwKICAgICAgICAgICAgcGFja2FnZSwKICAgICAgICAgICAgc3JjX2RpciwKICAgICAgICApCiAgICAgICAgZ2xvYnNfZXhwYW5kZWQgPSBtYXAoZ2xvYiwgcGF0dGVybnMpCiAgICAgICAgIyBmbGF0dGVuIHRoZSBleHBhbmRlZCBnbG9icyBpbnRvIGFuIGl0ZXJhYmxlIG9mIG1hdGNoZXMKICAgICAgICBnbG9ic19tYXRjaGVzID0gaXRlcnRvb2xzLmNoYWluLmZyb21faXRlcmFibGUoZ2xvYnNfZXhwYW5kZWQpCiAgICAgICAgZ2xvYl9maWxlcyA9IGZpbHRlcihvcy5wYXRoLmlzZmlsZSwgZ2xvYnNfbWF0Y2hlcykKICAgICAgICBmaWxlcyA9IGl0ZXJ0b29scy5jaGFpbigKICAgICAgICAgICAgc2VsZi5tYW5pZmVzdF9maWxlcy5nZXQocGFja2FnZSwgW10pLAogICAgICAgICAgICBnbG9iX2ZpbGVzLAogICAgICAgICkKICAgICAgICByZXR1cm4gc2VsZi5leGNsdWRlX2RhdGFfZmlsZXMocGFja2FnZSwgc3JjX2RpciwgZmlsZXMpCgogICAgZGVmIGJ1aWxkX3BhY2thZ2VfZGF0YShzZWxmKToKICAgICAgICAiIiJDb3B5IGRhdGEgZmlsZXMgaW50byBidWlsZCBkaXJlY3RvcnkiIiIKICAgICAgICBmb3IgcGFja2FnZSwgc3JjX2RpciwgYnVpbGRfZGlyLCBmaWxlbmFtZXMgaW4gc2VsZi5kYXRhX2ZpbGVzOgogICAgICAgICAgICBmb3IgZmlsZW5hbWUgaW4gZmlsZW5hbWVzOgogICAgICAgICAgICAgICAgdGFyZ2V0ID0gb3MucGF0aC5qb2luKGJ1aWxkX2RpciwgZmlsZW5hbWUpCiAgICAgICAgICAgICAgICBzZWxmLm1rcGF0aChvcy5wYXRoLmRpcm5hbWUodGFyZ2V0KSkKICAgICAgICAgICAgICAgIHNyY2ZpbGUgPSBvcy5wYXRoLmpvaW4oc3JjX2RpciwgZmlsZW5hbWUpCiAgICAgICAgICAgICAgICBvdXRmLCBjb3BpZWQgPSBzZWxmLmNvcHlfZmlsZShzcmNmaWxlLCB0YXJnZXQpCiAgICAgICAgICAgICAgICBzcmNmaWxlID0gb3MucGF0aC5hYnNwYXRoKHNyY2ZpbGUpCiAgICAgICAgICAgICAgICBpZiAoY29waWVkIGFuZAogICAgICAgICAgICAgICAgICAgICAgICBzcmNmaWxlIGluIHNlbGYuZGlzdHJpYnV0aW9uLmNvbnZlcnRfMnRvM19kb2N0ZXN0cyk6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fX2RvY3Rlc3RzXzJ0bzMuYXBwZW5kKG91dGYpCgogICAgZGVmIGFuYWx5emVfbWFuaWZlc3Qoc2VsZik6CiAgICAgICAgc2VsZi5tYW5pZmVzdF9maWxlcyA9IG1mID0ge30KICAgICAgICBpZiBub3Qgc2VsZi5kaXN0cmlidXRpb24uaW5jbHVkZV9wYWNrYWdlX2RhdGE6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIHNyY19kaXJzID0ge30KICAgICAgICBmb3IgcGFja2FnZSBpbiBzZWxmLnBhY2thZ2VzIG9yICgpOgogICAgICAgICAgICAjIExvY2F0ZSBwYWNrYWdlIHNvdXJjZSBkaXJlY3RvcnkKICAgICAgICAgICAgc3JjX2RpcnNbYXNzZXJ0X3JlbGF0aXZlKHNlbGYuZ2V0X3BhY2thZ2VfZGlyKHBhY2thZ2UpKV0gPSBwYWNrYWdlCgogICAgICAgIHNlbGYucnVuX2NvbW1hbmQoJ2VnZ19pbmZvJykKICAgICAgICBlaV9jbWQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnZWdnX2luZm8nKQogICAgICAgIGZvciBwYXRoIGluIGVpX2NtZC5maWxlbGlzdC5maWxlczoKICAgICAgICAgICAgZCwgZiA9IG9zLnBhdGguc3BsaXQoYXNzZXJ0X3JlbGF0aXZlKHBhdGgpKQogICAgICAgICAgICBwcmV2ID0gTm9uZQogICAgICAgICAgICBvbGRmID0gZgogICAgICAgICAgICB3aGlsZSBkIGFuZCBkICE9IHByZXYgYW5kIGQgbm90IGluIHNyY19kaXJzOgogICAgICAgICAgICAgICAgcHJldiA9IGQKICAgICAgICAgICAgICAgIGQsIGRmID0gb3MucGF0aC5zcGxpdChkKQogICAgICAgICAgICAgICAgZiA9IG9zLnBhdGguam9pbihkZiwgZikKICAgICAgICAgICAgaWYgZCBpbiBzcmNfZGlyczoKICAgICAgICAgICAgICAgIGlmIHBhdGguZW5kc3dpdGgoJy5weScpIGFuZCBmID09IG9sZGY6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUgICMgaXQncyBhIG1vZHVsZSwgbm90IGRhdGEKICAgICAgICAgICAgICAgIG1mLnNldGRlZmF1bHQoc3JjX2RpcnNbZF0sIFtdKS5hcHBlbmQocGF0aCkKCiAgICBkZWYgZ2V0X2RhdGFfZmlsZXMoc2VsZik6CiAgICAgICAgcGFzcyAgIyBMYXppbHkgY29tcHV0ZSBkYXRhIGZpbGVzIGluIF9nZXRfZGF0YV9maWxlcygpIGZ1bmN0aW9uLgoKICAgIGRlZiBjaGVja19wYWNrYWdlKHNlbGYsIHBhY2thZ2UsIHBhY2thZ2VfZGlyKToKICAgICAgICAiIiJDaGVjayBuYW1lc3BhY2UgcGFja2FnZXMnIF9faW5pdF9fIGZvciBkZWNsYXJlX25hbWVzcGFjZSIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFja2FnZXNfY2hlY2tlZFtwYWNrYWdlXQogICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgcGFzcwoKICAgICAgICBpbml0X3B5ID0gb3JpZy5idWlsZF9weS5jaGVja19wYWNrYWdlKHNlbGYsIHBhY2thZ2UsIHBhY2thZ2VfZGlyKQogICAgICAgIHNlbGYucGFja2FnZXNfY2hlY2tlZFtwYWNrYWdlXSA9IGluaXRfcHkKCiAgICAgICAgaWYgbm90IGluaXRfcHkgb3Igbm90IHNlbGYuZGlzdHJpYnV0aW9uLm5hbWVzcGFjZV9wYWNrYWdlczoKICAgICAgICAgICAgcmV0dXJuIGluaXRfcHkKCiAgICAgICAgZm9yIHBrZyBpbiBzZWxmLmRpc3RyaWJ1dGlvbi5uYW1lc3BhY2VfcGFja2FnZXM6CiAgICAgICAgICAgIGlmIHBrZyA9PSBwYWNrYWdlIG9yIHBrZy5zdGFydHN3aXRoKHBhY2thZ2UgKyAnLicpOgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gaW5pdF9weQoKICAgICAgICB3aXRoIGlvLm9wZW4oaW5pdF9weSwgJ3JiJykgYXMgZjoKICAgICAgICAgICAgY29udGVudHMgPSBmLnJlYWQoKQogICAgICAgIGlmIGInZGVjbGFyZV9uYW1lc3BhY2UnIG5vdCBpbiBjb250ZW50czoKICAgICAgICAgICAgcmFpc2UgZGlzdHV0aWxzLmVycm9ycy5EaXN0dXRpbHNFcnJvcigKICAgICAgICAgICAgICAgICJOYW1lc3BhY2UgcGFja2FnZSBwcm9ibGVtOiAlcyBpcyBhIG5hbWVzcGFjZSBwYWNrYWdlLCBidXQgIgogICAgICAgICAgICAgICAgIml0c1xuX19pbml0X18ucHkgZG9lcyBub3QgY2FsbCBkZWNsYXJlX25hbWVzcGFjZSgpISBQbGVhc2UgIgogICAgICAgICAgICAgICAgJ2ZpeCBpdC5cbihTZWUgdGhlIHNldHVwdG9vbHMgbWFudWFsIHVuZGVyICcKICAgICAgICAgICAgICAgICciTmFtZXNwYWNlIFBhY2thZ2VzIiBmb3IgZGV0YWlscy4pXG4iJyAlIChwYWNrYWdlLCkKICAgICAgICAgICAgKQogICAgICAgIHJldHVybiBpbml0X3B5CgogICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBzZWxmLnBhY2thZ2VzX2NoZWNrZWQgPSB7fQogICAgICAgIG9yaWcuYnVpbGRfcHkuaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpCgogICAgZGVmIGdldF9wYWNrYWdlX2RpcihzZWxmLCBwYWNrYWdlKToKICAgICAgICByZXMgPSBvcmlnLmJ1aWxkX3B5LmdldF9wYWNrYWdlX2RpcihzZWxmLCBwYWNrYWdlKQogICAgICAgIGlmIHNlbGYuZGlzdHJpYnV0aW9uLnNyY19yb290IGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKHNlbGYuZGlzdHJpYnV0aW9uLnNyY19yb290LCByZXMpCiAgICAgICAgcmV0dXJuIHJlcwoKICAgIGRlZiBleGNsdWRlX2RhdGFfZmlsZXMoc2VsZiwgcGFja2FnZSwgc3JjX2RpciwgZmlsZXMpOgogICAgICAgICIiIkZpbHRlciBmaWxlbmFtZXMgZm9yIHBhY2thZ2UncyBkYXRhIGZpbGVzIGluICdzcmNfZGlyJyIiIgogICAgICAgIGZpbGVzID0gbGlzdChmaWxlcykKICAgICAgICBwYXR0ZXJucyA9IHNlbGYuX2dldF9wbGF0Zm9ybV9wYXR0ZXJucygKICAgICAgICAgICAgc2VsZi5leGNsdWRlX3BhY2thZ2VfZGF0YSwKICAgICAgICAgICAgcGFja2FnZSwKICAgICAgICAgICAgc3JjX2RpciwKICAgICAgICApCiAgICAgICAgbWF0Y2hfZ3JvdXBzID0gKAogICAgICAgICAgICBmbm1hdGNoLmZpbHRlcihmaWxlcywgcGF0dGVybikKICAgICAgICAgICAgZm9yIHBhdHRlcm4gaW4gcGF0dGVybnMKICAgICAgICApCiAgICAgICAgIyBmbGF0dGVuIHRoZSBncm91cHMgb2YgbWF0Y2hlcyBpbnRvIGFuIGl0ZXJhYmxlIG9mIG1hdGNoZXMKICAgICAgICBtYXRjaGVzID0gaXRlcnRvb2xzLmNoYWluLmZyb21faXRlcmFibGUobWF0Y2hfZ3JvdXBzKQogICAgICAgIGJhZCA9IHNldChtYXRjaGVzKQogICAgICAgIGtlZXBlcnMgPSAoCiAgICAgICAgICAgIGZuCiAgICAgICAgICAgIGZvciBmbiBpbiBmaWxlcwogICAgICAgICAgICBpZiBmbiBub3QgaW4gYmFkCiAgICAgICAgKQogICAgICAgICMgZGl0Y2ggZHVwZXMKICAgICAgICByZXR1cm4gbGlzdChfdW5pcXVlX2V2ZXJzZWVuKGtlZXBlcnMpKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfZ2V0X3BsYXRmb3JtX3BhdHRlcm5zKHNwZWMsIHBhY2thZ2UsIHNyY19kaXIpOgogICAgICAgICIiIgogICAgICAgIHlpZWxkIHBsYXRmb3JtLXNwZWNpZmljIHBhdGggcGF0dGVybnMgKHN1aXRhYmxlIGZvciBnbG9iCiAgICAgICAgb3IgZm5fbWF0Y2gpIGZyb20gYSBnbG9iLWJhc2VkIHNwZWMgKHN1Y2ggYXMKICAgICAgICBzZWxmLnBhY2thZ2VfZGF0YSBvciBzZWxmLmV4Y2x1ZGVfcGFja2FnZV9kYXRhKQogICAgICAgIG1hdGNoaW5nIHBhY2thZ2UgaW4gc3JjX2Rpci4KICAgICAgICAiIiIKICAgICAgICByYXdfcGF0dGVybnMgPSBpdGVydG9vbHMuY2hhaW4oCiAgICAgICAgICAgIHNwZWMuZ2V0KCcnLCBbXSksCiAgICAgICAgICAgIHNwZWMuZ2V0KHBhY2thZ2UsIFtdKSwKICAgICAgICApCiAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgIyBFYWNoIHBhdHRlcm4gaGFzIHRvIGJlIGNvbnZlcnRlZCB0byBhIHBsYXRmb3JtLXNwZWNpZmljIHBhdGgKICAgICAgICAgICAgb3MucGF0aC5qb2luKHNyY19kaXIsIGNvbnZlcnRfcGF0aChwYXR0ZXJuKSkKICAgICAgICAgICAgZm9yIHBhdHRlcm4gaW4gcmF3X3BhdHRlcm5zCiAgICAgICAgKQoKCiMgZnJvbSBQeXRob24gZG9jcwpkZWYgX3VuaXF1ZV9ldmVyc2VlbihpdGVyYWJsZSwga2V5PU5vbmUpOgogICAgIkxpc3QgdW5pcXVlIGVsZW1lbnRzLCBwcmVzZXJ2aW5nIG9yZGVyLiBSZW1lbWJlciBhbGwgZWxlbWVudHMgZXZlciBzZWVuLiIKICAgICMgdW5pcXVlX2V2ZXJzZWVuKCdBQUFBQkJCQ0NEQUFCQkInKSAtLT4gQSBCIEMgRAogICAgIyB1bmlxdWVfZXZlcnNlZW4oJ0FCQkNjQUQnLCBzdHIubG93ZXIpIC0tPiBBIEIgQyBECiAgICBzZWVuID0gc2V0KCkKICAgIHNlZW5fYWRkID0gc2Vlbi5hZGQKICAgIGlmIGtleSBpcyBOb25lOgogICAgICAgIGZvciBlbGVtZW50IGluIGZpbHRlcmZhbHNlKHNlZW4uX19jb250YWluc19fLCBpdGVyYWJsZSk6CiAgICAgICAgICAgIHNlZW5fYWRkKGVsZW1lbnQpCiAgICAgICAgICAgIHlpZWxkIGVsZW1lbnQKICAgIGVsc2U6CiAgICAgICAgZm9yIGVsZW1lbnQgaW4gaXRlcmFibGU6CiAgICAgICAgICAgIGsgPSBrZXkoZWxlbWVudCkKICAgICAgICAgICAgaWYgayBub3QgaW4gc2VlbjoKICAgICAgICAgICAgICAgIHNlZW5fYWRkKGspCiAgICAgICAgICAgICAgICB5aWVsZCBlbGVtZW50CgoKZGVmIGFzc2VydF9yZWxhdGl2ZShwYXRoKToKICAgIGlmIG5vdCBvcy5wYXRoLmlzYWJzKHBhdGgpOgogICAgICAgIHJldHVybiBwYXRoCiAgICBmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc1NldHVwRXJyb3IKCiAgICBtc2cgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiCiAgICAgICAgRXJyb3I6IHNldHVwIHNjcmlwdCBzcGVjaWZpZXMgYW4gYWJzb2x1dGUgcGF0aDoKCiAgICAgICAgICAgICVzCgogICAgICAgIHNldHVwKCkgYXJndW1lbnRzIG11c3QgKmFsd2F5cyogYmUgLy1zZXBhcmF0ZWQgcGF0aHMgcmVsYXRpdmUgdG8gdGhlCiAgICAgICAgc2V0dXAucHkgZGlyZWN0b3J5LCAqbmV2ZXIqIGFic29sdXRlIHBhdGhzLgogICAgICAgICIiIikubHN0cmlwKCkgJSBwYXRoCiAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKG1zZykKUEsDBBQAAAAAAAAAIQDQzfM9+B8AAPgfAABCAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvY29tbWFuZC9kZXZlbG9wLnB5ZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgY29udmVydF9wYXRoCmZyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNFcnJvciwgRGlzdHV0aWxzT3B0aW9uRXJyb3IKaW1wb3J0IG9zCmltcG9ydCBnbG9iCmltcG9ydCBpbwoKZnJvbSBzZXR1cHRvb2xzLmV4dGVybiBpbXBvcnQgc2l4CgppbXBvcnQgcGtnX3Jlc291cmNlcwpmcm9tIHNldHVwdG9vbHMuY29tbWFuZC5lYXN5X2luc3RhbGwgaW1wb3J0IGVhc3lfaW5zdGFsbApmcm9tIHNldHVwdG9vbHMgaW1wb3J0IG5hbWVzcGFjZXMKaW1wb3J0IHNldHVwdG9vbHMKCl9fbWV0YWNsYXNzX18gPSB0eXBlCgoKY2xhc3MgZGV2ZWxvcChuYW1lc3BhY2VzLkRldmVsb3BJbnN0YWxsZXIsIGVhc3lfaW5zdGFsbCk6CiAgICAiIiJTZXQgdXAgcGFja2FnZSBmb3IgZGV2ZWxvcG1lbnQiIiIKCiAgICBkZXNjcmlwdGlvbiA9ICJpbnN0YWxsIHBhY2thZ2UgaW4gJ2RldmVsb3BtZW50IG1vZGUnIgoKICAgIHVzZXJfb3B0aW9ucyA9IGVhc3lfaW5zdGFsbC51c2VyX29wdGlvbnMgKyBbCiAgICAgICAgKCJ1bmluc3RhbGwiLCAidSIsICJVbmluc3RhbGwgdGhpcyBzb3VyY2UgcGFja2FnZSIpLAogICAgICAgICgiZWdnLXBhdGg9IiwgTm9uZSwgIlNldCB0aGUgcGF0aCB0byBiZSB1c2VkIGluIHRoZSAuZWdnLWxpbmsgZmlsZSIpLAogICAgXQoKICAgIGJvb2xlYW5fb3B0aW9ucyA9IGVhc3lfaW5zdGFsbC5ib29sZWFuX29wdGlvbnMgKyBbJ3VuaW5zdGFsbCddCgogICAgY29tbWFuZF9jb25zdW1lc19hcmd1bWVudHMgPSBGYWxzZSAgIyBvdmVycmlkZSBiYXNlCgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICBpZiBzZWxmLnVuaW5zdGFsbDoKICAgICAgICAgICAgc2VsZi5tdWx0aV92ZXJzaW9uID0gVHJ1ZQogICAgICAgICAgICBzZWxmLnVuaW5zdGFsbF9saW5rKCkKICAgICAgICAgICAgc2VsZi51bmluc3RhbGxfbmFtZXNwYWNlcygpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5pbnN0YWxsX2Zvcl9kZXZlbG9wbWVudCgpCiAgICAgICAgc2VsZi53YXJuX2RlcHJlY2F0ZWRfb3B0aW9ucygpCgogICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBzZWxmLnVuaW5zdGFsbCA9IE5vbmUKICAgICAgICBzZWxmLmVnZ19wYXRoID0gTm9uZQogICAgICAgIGVhc3lfaW5zdGFsbC5pbml0aWFsaXplX29wdGlvbnMoc2VsZikKICAgICAgICBzZWxmLnNldHVwX3BhdGggPSBOb25lCiAgICAgICAgc2VsZi5hbHdheXNfY29weV9mcm9tID0gJy4nICAjIGFsd2F5cyBjb3B5IGVnZ3MgaW5zdGFsbGVkIGluIGN1cmRpcgoKICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIGVpID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoImVnZ19pbmZvIikKICAgICAgICBpZiBlaS5icm9rZW5fZWdnX2luZm86CiAgICAgICAgICAgIHRlbXBsYXRlID0gIlBsZWFzZSByZW5hbWUgJXIgdG8gJXIgYmVmb3JlIHVzaW5nICdkZXZlbG9wJyIKICAgICAgICAgICAgYXJncyA9IGVpLmVnZ19pbmZvLCBlaS5icm9rZW5fZWdnX2luZm8KICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IodGVtcGxhdGUgJSBhcmdzKQogICAgICAgIHNlbGYuYXJncyA9IFtlaS5lZ2dfbmFtZV0KCiAgICAgICAgZWFzeV9pbnN0YWxsLmZpbmFsaXplX29wdGlvbnMoc2VsZikKICAgICAgICBzZWxmLmV4cGFuZF9iYXNlZGlycygpCiAgICAgICAgc2VsZi5leHBhbmRfZGlycygpCiAgICAgICAgIyBwaWNrIHVwIHNldHVwLWRpciAuZWdnIGZpbGVzIG9ubHk6IG5vIC5lZ2ctaW5mbwogICAgICAgIHNlbGYucGFja2FnZV9pbmRleC5zY2FuKGdsb2IuZ2xvYignKi5lZ2cnKSkKCiAgICAgICAgZWdnX2xpbmtfZm4gPSBlaS5lZ2dfbmFtZSArICcuZWdnLWxpbmsnCiAgICAgICAgc2VsZi5lZ2dfbGluayA9IG9zLnBhdGguam9pbihzZWxmLmluc3RhbGxfZGlyLCBlZ2dfbGlua19mbikKICAgICAgICBzZWxmLmVnZ19iYXNlID0gZWkuZWdnX2Jhc2UKICAgICAgICBpZiBzZWxmLmVnZ19wYXRoIGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYuZWdnX3BhdGggPSBvcy5wYXRoLmFic3BhdGgoZWkuZWdnX2Jhc2UpCgogICAgICAgIHRhcmdldCA9IHBrZ19yZXNvdXJjZXMubm9ybWFsaXplX3BhdGgoc2VsZi5lZ2dfYmFzZSkKICAgICAgICBlZ2dfcGF0aCA9IHBrZ19yZXNvdXJjZXMubm9ybWFsaXplX3BhdGgoCiAgICAgICAgICAgIG9zLnBhdGguam9pbihzZWxmLmluc3RhbGxfZGlyLCBzZWxmLmVnZ19wYXRoKSkKICAgICAgICBpZiBlZ2dfcGF0aCAhPSB0YXJnZXQ6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKAogICAgICAgICAgICAgICAgIi0tZWdnLXBhdGggbXVzdCBiZSBhIHJlbGF0aXZlIHBhdGggZnJvbSB0aGUgaW5zdGFsbCIKICAgICAgICAgICAgICAgICIgZGlyZWN0b3J5IHRvICIgKyB0YXJnZXQKICAgICAgICAgICAgKQoKICAgICAgICAjIE1ha2UgYSBkaXN0cmlidXRpb24gZm9yIHRoZSBwYWNrYWdlJ3Mgc291cmNlCiAgICAgICAgc2VsZi5kaXN0ID0gcGtnX3Jlc291cmNlcy5EaXN0cmlidXRpb24oCiAgICAgICAgICAgIHRhcmdldCwKICAgICAgICAgICAgcGtnX3Jlc291cmNlcy5QYXRoTWV0YWRhdGEodGFyZ2V0LCBvcy5wYXRoLmFic3BhdGgoZWkuZWdnX2luZm8pKSwKICAgICAgICAgICAgcHJvamVjdF9uYW1lPWVpLmVnZ19uYW1lCiAgICAgICAgKQoKICAgICAgICBzZWxmLnNldHVwX3BhdGggPSBzZWxmLl9yZXNvbHZlX3NldHVwX3BhdGgoCiAgICAgICAgICAgIHNlbGYuZWdnX2Jhc2UsCiAgICAgICAgICAgIHNlbGYuaW5zdGFsbF9kaXIsCiAgICAgICAgICAgIHNlbGYuZWdnX3BhdGgsCiAgICAgICAgKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfcmVzb2x2ZV9zZXR1cF9wYXRoKGVnZ19iYXNlLCBpbnN0YWxsX2RpciwgZWdnX3BhdGgpOgogICAgICAgICIiIgogICAgICAgIEdlbmVyYXRlIGEgcGF0aCBmcm9tIGVnZ19iYXNlIGJhY2sgdG8gJy4nIHdoZXJlIHRoZQogICAgICAgIHNldHVwIHNjcmlwdCByZXNpZGVzIGFuZCBlbnN1cmUgdGhhdCBwYXRoIHBvaW50cyB0byB0aGUKICAgICAgICBzZXR1cCBwYXRoIGZyb20gJGluc3RhbGxfZGlyLyRlZ2dfcGF0aC4KICAgICAgICAiIiIKICAgICAgICBwYXRoX3RvX3NldHVwID0gZWdnX2Jhc2UucmVwbGFjZShvcy5zZXAsICcvJykucnN0cmlwKCcvJykKICAgICAgICBpZiBwYXRoX3RvX3NldHVwICE9IG9zLmN1cmRpcjoKICAgICAgICAgICAgcGF0aF90b19zZXR1cCA9ICcuLi8nICogKHBhdGhfdG9fc2V0dXAuY291bnQoJy8nKSArIDEpCiAgICAgICAgcmVzb2x2ZWQgPSBwa2dfcmVzb3VyY2VzLm5vcm1hbGl6ZV9wYXRoKAogICAgICAgICAgICBvcy5wYXRoLmpvaW4oaW5zdGFsbF9kaXIsIGVnZ19wYXRoLCBwYXRoX3RvX3NldHVwKQogICAgICAgICkKICAgICAgICBpZiByZXNvbHZlZCAhPSBwa2dfcmVzb3VyY2VzLm5vcm1hbGl6ZV9wYXRoKG9zLmN1cmRpcik6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKAogICAgICAgICAgICAgICAgIkNhbid0IGdldCBhIGNvbnNpc3RlbnQgcGF0aCB0byBzZXR1cCBzY3JpcHQgZnJvbSIKICAgICAgICAgICAgICAgICIgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSIsIHJlc29sdmVkLAogICAgICAgICAgICAgICAgcGtnX3Jlc291cmNlcy5ub3JtYWxpemVfcGF0aChvcy5jdXJkaXIpKQogICAgICAgIHJldHVybiBwYXRoX3RvX3NldHVwCgogICAgZGVmIGluc3RhbGxfZm9yX2RldmVsb3BtZW50KHNlbGYpOgogICAgICAgIGlmIHNpeC5QWTMgYW5kIGdldGF0dHIoc2VsZi5kaXN0cmlidXRpb24sICd1c2VfMnRvMycsIEZhbHNlKToKICAgICAgICAgICAgIyBJZiB3ZSBydW4gMnRvMyB3ZSBjYW4gbm90IGRvIHRoaXMgaW5wbGFjZToKCiAgICAgICAgICAgICMgRW5zdXJlIG1ldGFkYXRhIGlzIHVwLXRvLWRhdGUKICAgICAgICAgICAgc2VsZi5yZWluaXRpYWxpemVfY29tbWFuZCgnYnVpbGRfcHknLCBpbnBsYWNlPTApCiAgICAgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoJ2J1aWxkX3B5JykKICAgICAgICAgICAgYnB5X2NtZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCJidWlsZF9weSIpCiAgICAgICAgICAgIGJ1aWxkX3BhdGggPSBwa2dfcmVzb3VyY2VzLm5vcm1hbGl6ZV9wYXRoKGJweV9jbWQuYnVpbGRfbGliKQoKICAgICAgICAgICAgIyBCdWlsZCBleHRlbnNpb25zCiAgICAgICAgICAgIHNlbGYucmVpbml0aWFsaXplX2NvbW1hbmQoJ2VnZ19pbmZvJywgZWdnX2Jhc2U9YnVpbGRfcGF0aCkKICAgICAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgnZWdnX2luZm8nKQoKICAgICAgICAgICAgc2VsZi5yZWluaXRpYWxpemVfY29tbWFuZCgnYnVpbGRfZXh0JywgaW5wbGFjZT0wKQogICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdidWlsZF9leHQnKQoKICAgICAgICAgICAgIyBGaXh1cCBlZ2ctbGluayBhbmQgZWFzeS1pbnN0YWxsLnB0aAogICAgICAgICAgICBlaV9jbWQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgiZWdnX2luZm8iKQogICAgICAgICAgICBzZWxmLmVnZ19wYXRoID0gYnVpbGRfcGF0aAogICAgICAgICAgICBzZWxmLmRpc3QubG9jYXRpb24gPSBidWlsZF9wYXRoCiAgICAgICAgICAgICMgWFhYCiAgICAgICAgICAgIHNlbGYuZGlzdC5fcHJvdmlkZXIgPSBwa2dfcmVzb3VyY2VzLlBhdGhNZXRhZGF0YSgKICAgICAgICAgICAgICAgIGJ1aWxkX3BhdGgsIGVpX2NtZC5lZ2dfaW5mbykKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIFdpdGhvdXQgMnRvMyBpbnBsYWNlIHdvcmtzIGZpbmU6CiAgICAgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoJ2VnZ19pbmZvJykKCiAgICAgICAgICAgICMgQnVpbGQgZXh0ZW5zaW9ucyBpbi1wbGFjZQogICAgICAgICAgICBzZWxmLnJlaW5pdGlhbGl6ZV9jb21tYW5kKCdidWlsZF9leHQnLCBpbnBsYWNlPTEpCiAgICAgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoJ2J1aWxkX2V4dCcpCgogICAgICAgIHNlbGYuaW5zdGFsbF9zaXRlX3B5KCkgICMgZW5zdXJlIHRoYXQgdGFyZ2V0IGRpciBpcyBzaXRlLXNhZmUKICAgICAgICBpZiBzZXR1cHRvb2xzLmJvb3RzdHJhcF9pbnN0YWxsX2Zyb206CiAgICAgICAgICAgIHNlbGYuZWFzeV9pbnN0YWxsKHNldHVwdG9vbHMuYm9vdHN0cmFwX2luc3RhbGxfZnJvbSkKICAgICAgICAgICAgc2V0dXB0b29scy5ib290c3RyYXBfaW5zdGFsbF9mcm9tID0gTm9uZQoKICAgICAgICBzZWxmLmluc3RhbGxfbmFtZXNwYWNlcygpCgogICAgICAgICMgY3JlYXRlIGFuIC5lZ2ctbGluayBpbiB0aGUgaW5zdGFsbGF0aW9uIGRpciwgcG9pbnRpbmcgdG8gb3VyIGVnZwogICAgICAgIGxvZy5pbmZvKCJDcmVhdGluZyAlcyAobGluayB0byAlcykiLCBzZWxmLmVnZ19saW5rLCBzZWxmLmVnZ19iYXNlKQogICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgIHdpdGggb3BlbihzZWxmLmVnZ19saW5rLCAidyIpIGFzIGY6CiAgICAgICAgICAgICAgICBmLndyaXRlKHNlbGYuZWdnX3BhdGggKyAiXG4iICsgc2VsZi5zZXR1cF9wYXRoKQogICAgICAgICMgcG9zdHByb2Nlc3MgdGhlIGluc3RhbGxlZCBkaXN0cm8sIGZpeGluZyB1cCAucHRoLCBpbnN0YWxsaW5nIHNjcmlwdHMsCiAgICAgICAgIyBhbmQgaGFuZGxpbmcgcmVxdWlyZW1lbnRzCiAgICAgICAgc2VsZi5wcm9jZXNzX2Rpc3RyaWJ1dGlvbihOb25lLCBzZWxmLmRpc3QsIG5vdCBzZWxmLm5vX2RlcHMpCgogICAgZGVmIHVuaW5zdGFsbF9saW5rKHNlbGYpOgogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHNlbGYuZWdnX2xpbmspOgogICAgICAgICAgICBsb2cuaW5mbygiUmVtb3ZpbmcgJXMgKGxpbmsgdG8gJXMpIiwgc2VsZi5lZ2dfbGluaywgc2VsZi5lZ2dfYmFzZSkKICAgICAgICAgICAgZWdnX2xpbmtfZmlsZSA9IG9wZW4oc2VsZi5lZ2dfbGluaykKICAgICAgICAgICAgY29udGVudHMgPSBbbGluZS5yc3RyaXAoKSBmb3IgbGluZSBpbiBlZ2dfbGlua19maWxlXQogICAgICAgICAgICBlZ2dfbGlua19maWxlLmNsb3NlKCkKICAgICAgICAgICAgaWYgY29udGVudHMgbm90IGluIChbc2VsZi5lZ2dfcGF0aF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGYuZWdnX3BhdGgsIHNlbGYuc2V0dXBfcGF0aF0pOgogICAgICAgICAgICAgICAgbG9nLndhcm4oIkxpbmsgcG9pbnRzIHRvICVzOiB1bmluc3RhbGwgYWJvcnRlZCIsIGNvbnRlbnRzKQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgICAgICBvcy51bmxpbmsoc2VsZi5lZ2dfbGluaykKICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICBzZWxmLnVwZGF0ZV9wdGgoc2VsZi5kaXN0KSAgIyByZW1vdmUgYW55IC5wdGggbGluayB0byB1cwogICAgICAgIGlmIHNlbGYuZGlzdHJpYnV0aW9uLnNjcmlwdHM6CiAgICAgICAgICAgICMgWFhYIHNob3VsZCBhbHNvIGNoZWNrIGZvciBlbnRyeSBwb2ludCBzY3JpcHRzIQogICAgICAgICAgICBsb2cud2FybigiTm90ZTogeW91IG11c3QgdW5pbnN0YWxsIG9yIHJlcGxhY2Ugc2NyaXB0cyBtYW51YWxseSEiKQoKICAgIGRlZiBpbnN0YWxsX2VnZ19zY3JpcHRzKHNlbGYsIGRpc3QpOgogICAgICAgIGlmIGRpc3QgaXMgbm90IHNlbGYuZGlzdDoKICAgICAgICAgICAgIyBJbnN0YWxsaW5nIGEgZGVwZW5kZW5jeSwgc28gZmFsbCBiYWNrIHRvIG5vcm1hbCBiZWhhdmlvcgogICAgICAgICAgICByZXR1cm4gZWFzeV9pbnN0YWxsLmluc3RhbGxfZWdnX3NjcmlwdHMoc2VsZiwgZGlzdCkKCiAgICAgICAgIyBjcmVhdGUgd3JhcHBlciBzY3JpcHRzIGluIHRoZSBzY3JpcHQgZGlyLCBwb2ludGluZyB0byBkaXN0LnNjcmlwdHMKCiAgICAgICAgIyBuZXctc3R5bGUuLi4KICAgICAgICBzZWxmLmluc3RhbGxfd3JhcHBlcl9zY3JpcHRzKGRpc3QpCgogICAgICAgICMgLi4uYW5kIG9sZC1zdHlsZQogICAgICAgIGZvciBzY3JpcHRfbmFtZSBpbiBzZWxmLmRpc3RyaWJ1dGlvbi5zY3JpcHRzIG9yIFtdOgogICAgICAgICAgICBzY3JpcHRfcGF0aCA9IG9zLnBhdGguYWJzcGF0aChjb252ZXJ0X3BhdGgoc2NyaXB0X25hbWUpKQogICAgICAgICAgICBzY3JpcHRfbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUoc2NyaXB0X3BhdGgpCiAgICAgICAgICAgIHdpdGggaW8ub3BlbihzY3JpcHRfcGF0aCkgYXMgc3RybToKICAgICAgICAgICAgICAgIHNjcmlwdF90ZXh0ID0gc3RybS5yZWFkKCkKICAgICAgICAgICAgc2VsZi5pbnN0YWxsX3NjcmlwdChkaXN0LCBzY3JpcHRfbmFtZSwgc2NyaXB0X3RleHQsIHNjcmlwdF9wYXRoKQoKICAgIGRlZiBpbnN0YWxsX3dyYXBwZXJfc2NyaXB0cyhzZWxmLCBkaXN0KToKICAgICAgICBkaXN0ID0gVmVyc2lvbmxlc3NSZXF1aXJlbWVudChkaXN0KQogICAgICAgIHJldHVybiBlYXN5X2luc3RhbGwuaW5zdGFsbF93cmFwcGVyX3NjcmlwdHMoc2VsZiwgZGlzdCkKCgpjbGFzcyBWZXJzaW9ubGVzc1JlcXVpcmVtZW50OgogICAgIiIiCiAgICBBZGFwdCBhIHBrZ19yZXNvdXJjZXMuRGlzdHJpYnV0aW9uIHRvIHNpbXBseSByZXR1cm4gdGhlIHByb2plY3QKICAgIG5hbWUgYXMgdGhlICdyZXF1aXJlbWVudCcgc28gdGhhdCBzY3JpcHRzIHdpbGwgd29yayBhY3Jvc3MKICAgIG11bHRpcGxlIHZlcnNpb25zLgoKICAgID4+PiBmcm9tIHBrZ19yZXNvdXJjZXMgaW1wb3J0IERpc3RyaWJ1dGlvbgogICAgPj4+IGRpc3QgPSBEaXN0cmlidXRpb24ocHJvamVjdF9uYW1lPSdmb28nLCB2ZXJzaW9uPScxLjAnKQogICAgPj4+IHN0cihkaXN0LmFzX3JlcXVpcmVtZW50KCkpCiAgICAnZm9vPT0xLjAnCiAgICA+Pj4gYWRhcHRlZF9kaXN0ID0gVmVyc2lvbmxlc3NSZXF1aXJlbWVudChkaXN0KQogICAgPj4+IHN0cihhZGFwdGVkX2Rpc3QuYXNfcmVxdWlyZW1lbnQoKSkKICAgICdmb28nCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgZGlzdCk6CiAgICAgICAgc2VsZi5fX2Rpc3QgPSBkaXN0CgogICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUpOgogICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYuX19kaXN0LCBuYW1lKQoKICAgIGRlZiBhc19yZXF1aXJlbWVudChzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5wcm9qZWN0X25hbWUKUEsDBBQAAAAAAAAAIQD/6PaRwAMAAMADAABEAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvY29tbWFuZC9kaXN0X2luZm8ucHkiIiIKQ3JlYXRlIGEgZGlzdF9pbmZvIGRpcmVjdG9yeQpBcyBkZWZpbmVkIGluIHRoZSB3aGVlbCBzcGVjaWZpY2F0aW9uCiIiIgoKaW1wb3J0IG9zCgpmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBDb21tYW5kCmZyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKCgpjbGFzcyBkaXN0X2luZm8oQ29tbWFuZCk6CgogICAgZGVzY3JpcHRpb24gPSAnY3JlYXRlIGEgLmRpc3QtaW5mbyBkaXJlY3RvcnknCgogICAgdXNlcl9vcHRpb25zID0gWwogICAgICAgICgnZWdnLWJhc2U9JywgJ2UnLCAiZGlyZWN0b3J5IGNvbnRhaW5pbmcgLmVnZy1pbmZvIGRpcmVjdG9yaWVzIgogICAgICAgICAgICAgICAgICAgICAgICAgICAiIChkZWZhdWx0OiB0b3Agb2YgdGhlIHNvdXJjZSB0cmVlKSIpLAogICAgXQoKICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgc2VsZi5lZ2dfYmFzZSA9IE5vbmUKCiAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBwYXNzCgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICBlZ2dfaW5mbyA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdlZ2dfaW5mbycpCiAgICAgICAgZWdnX2luZm8uZWdnX2Jhc2UgPSBzZWxmLmVnZ19iYXNlCiAgICAgICAgZWdnX2luZm8uZmluYWxpemVfb3B0aW9ucygpCiAgICAgICAgZWdnX2luZm8ucnVuKCkKICAgICAgICBkaXN0X2luZm9fZGlyID0gZWdnX2luZm8uZWdnX2luZm9bOi1sZW4oJy5lZ2ctaW5mbycpXSArICcuZGlzdC1pbmZvJwogICAgICAgIGxvZy5pbmZvKCJjcmVhdGluZyAne30nIi5mb3JtYXQob3MucGF0aC5hYnNwYXRoKGRpc3RfaW5mb19kaXIpKSkKCiAgICAgICAgYmRpc3Rfd2hlZWwgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnYmRpc3Rfd2hlZWwnKQogICAgICAgIGJkaXN0X3doZWVsLmVnZzJkaXN0KGVnZ19pbmZvLmVnZ19pbmZvLCBkaXN0X2luZm9fZGlyKQpQSwMEFAAAAAAAAAAhAFZjmkX4VQEA+FUBAEcAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9jb21tYW5kL2Vhc3lfaW5zdGFsbC5weSMhL3Vzci9iaW4vZW52IHB5dGhvbgoiIiIKRWFzeSBJbnN0YWxsCi0tLS0tLS0tLS0tLQoKQSB0b29sIGZvciBkb2luZyBhdXRvbWF0aWMgZG93bmxvYWQvZXh0cmFjdC9idWlsZCBvZiBkaXN0dXRpbHMtYmFzZWQgUHl0aG9uCnBhY2thZ2VzLiAgRm9yIGRldGFpbGVkIGRvY3VtZW50YXRpb24sIHNlZSB0aGUgYWNjb21wYW55aW5nIEVhc3lJbnN0YWxsLnR4dApmaWxlLCBvciB2aXNpdCB0aGUgYEVhc3lJbnN0YWxsIGhvbWUgcGFnZWBfXy4KCl9fIGh0dHBzOi8vc2V0dXB0b29scy5yZWFkdGhlZG9jcy5pby9lbi9sYXRlc3QvZWFzeV9pbnN0YWxsLmh0bWwKCiIiIgoKZnJvbSBnbG9iIGltcG9ydCBnbG9iCmZyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGdldF9wbGF0Zm9ybQpmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBjb252ZXJ0X3BhdGgsIHN1YnN0X3ZhcnMKZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCAoCiAgICBEaXN0dXRpbHNBcmdFcnJvciwgRGlzdHV0aWxzT3B0aW9uRXJyb3IsCiAgICBEaXN0dXRpbHNFcnJvciwgRGlzdHV0aWxzUGxhdGZvcm1FcnJvciwKKQpmcm9tIGRpc3R1dGlscy5jb21tYW5kLmluc3RhbGwgaW1wb3J0IElOU1RBTExfU0NIRU1FUywgU0NIRU1FX0tFWVMKZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZywgZGlyX3V0aWwKZnJvbSBkaXN0dXRpbHMuY29tbWFuZC5idWlsZF9zY3JpcHRzIGltcG9ydCBmaXJzdF9saW5lX3JlCmZyb20gZGlzdHV0aWxzLnNwYXduIGltcG9ydCBmaW5kX2V4ZWN1dGFibGUKaW1wb3J0IHN5cwppbXBvcnQgb3MKaW1wb3J0IHppcGltcG9ydAppbXBvcnQgc2h1dGlsCmltcG9ydCB0ZW1wZmlsZQppbXBvcnQgemlwZmlsZQppbXBvcnQgcmUKaW1wb3J0IHN0YXQKaW1wb3J0IHJhbmRvbQppbXBvcnQgdGV4dHdyYXAKaW1wb3J0IHdhcm5pbmdzCmltcG9ydCBzaXRlCmltcG9ydCBzdHJ1Y3QKaW1wb3J0IGNvbnRleHRsaWIKaW1wb3J0IHN1YnByb2Nlc3MKaW1wb3J0IHNobGV4CmltcG9ydCBpbwoKCmZyb20gc3lzY29uZmlnIGltcG9ydCBnZXRfY29uZmlnX3ZhcnMsIGdldF9wYXRoCgpmcm9tIHNldHVwdG9vbHMgaW1wb3J0IFNldHVwdG9vbHNEZXByZWNhdGlvbldhcm5pbmcKCmZyb20gc2V0dXB0b29scy5leHRlcm4gaW1wb3J0IHNpeApmcm9tIHNldHVwdG9vbHMuZXh0ZXJuLnNpeC5tb3ZlcyBpbXBvcnQgY29uZmlncGFyc2VyLCBtYXAKCmZyb20gc2V0dXB0b29scyBpbXBvcnQgQ29tbWFuZApmcm9tIHNldHVwdG9vbHMuc2FuZGJveCBpbXBvcnQgcnVuX3NldHVwCmZyb20gc2V0dXB0b29scy5weTI3Y29tcGF0IGltcG9ydCBybXRyZWVfc2FmZQpmcm9tIHNldHVwdG9vbHMuY29tbWFuZCBpbXBvcnQgc2V0b3B0CmZyb20gc2V0dXB0b29scy5hcmNoaXZlX3V0aWwgaW1wb3J0IHVucGFja19hcmNoaXZlCmZyb20gc2V0dXB0b29scy5wYWNrYWdlX2luZGV4IGltcG9ydCAoCiAgICBQYWNrYWdlSW5kZXgsIHBhcnNlX3JlcXVpcmVtZW50X2FyZywgVVJMX1NDSEVNRSwKKQpmcm9tIHNldHVwdG9vbHMuY29tbWFuZCBpbXBvcnQgYmRpc3RfZWdnLCBlZ2dfaW5mbwpmcm9tIHNldHVwdG9vbHMud2hlZWwgaW1wb3J0IFdoZWVsCmZyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgKAogICAgeWllbGRfbGluZXMsIG5vcm1hbGl6ZV9wYXRoLCByZXNvdXJjZV9zdHJpbmcsIGVuc3VyZV9kaXJlY3RvcnksCiAgICBnZXRfZGlzdHJpYnV0aW9uLCBmaW5kX2Rpc3RyaWJ1dGlvbnMsIEVudmlyb25tZW50LCBSZXF1aXJlbWVudCwKICAgIERpc3RyaWJ1dGlvbiwgUGF0aE1ldGFkYXRhLCBFZ2dNZXRhZGF0YSwgV29ya2luZ1NldCwgRGlzdHJpYnV0aW9uTm90Rm91bmQsCiAgICBWZXJzaW9uQ29uZmxpY3QsIERFVkVMT1BfRElTVCwKKQppbXBvcnQgcGtnX3Jlc291cmNlcy5weTMxY29tcGF0CgpfX21ldGFjbGFzc19fID0gdHlwZQoKIyBUdXJuIG9uIFBFUDQ0MFdhcm5pbmdzCndhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJkZWZhdWx0IiwgY2F0ZWdvcnk9cGtnX3Jlc291cmNlcy5QRVA0NDBXYXJuaW5nKQoKX19hbGxfXyA9IFsKICAgICdzYW1lZmlsZScsICdlYXN5X2luc3RhbGwnLCAnUHRoRGlzdHJpYnV0aW9ucycsICdleHRyYWN0X3dpbmluc3RfY2ZnJywKICAgICdtYWluJywgJ2dldF9leGVfcHJlZml4ZXMnLApdCgoKZGVmIGlzXzY0Yml0KCk6CiAgICByZXR1cm4gc3RydWN0LmNhbGNzaXplKCJQIikgPT0gOAoKCmRlZiBzYW1lZmlsZShwMSwgcDIpOgogICAgIiIiCiAgICBEZXRlcm1pbmUgaWYgdHdvIHBhdGhzIHJlZmVyZW5jZSB0aGUgc2FtZSBmaWxlLgoKICAgIEF1Z21lbnRzIG9zLnBhdGguc2FtZWZpbGUgdG8gd29yayBvbiBXaW5kb3dzIGFuZAogICAgc3VwcHJlc3NlcyBlcnJvcnMgaWYgdGhlIHBhdGggZG9lc24ndCBleGlzdC4KICAgICIiIgogICAgYm90aF9leGlzdCA9IG9zLnBhdGguZXhpc3RzKHAxKSBhbmQgb3MucGF0aC5leGlzdHMocDIpCiAgICB1c2Vfc2FtZWZpbGUgPSBoYXNhdHRyKG9zLnBhdGgsICdzYW1lZmlsZScpIGFuZCBib3RoX2V4aXN0CiAgICBpZiB1c2Vfc2FtZWZpbGU6CiAgICAgICAgcmV0dXJuIG9zLnBhdGguc2FtZWZpbGUocDEsIHAyKQogICAgbm9ybV9wMSA9IG9zLnBhdGgubm9ybXBhdGgob3MucGF0aC5ub3JtY2FzZShwMSkpCiAgICBub3JtX3AyID0gb3MucGF0aC5ub3JtcGF0aChvcy5wYXRoLm5vcm1jYXNlKHAyKSkKICAgIHJldHVybiBub3JtX3AxID09IG5vcm1fcDIKCgppZiBzaXguUFkyOgoKICAgIGRlZiBfdG9fYnl0ZXMocyk6CiAgICAgICAgcmV0dXJuIHMKCiAgICBkZWYgaXNhc2NpaShzKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNpeC50ZXh0X3R5cGUocywgJ2FzY2lpJykKICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICBleGNlcHQgVW5pY29kZUVycm9yOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKZWxzZToKCiAgICBkZWYgX3RvX2J5dGVzKHMpOgogICAgICAgIHJldHVybiBzLmVuY29kZSgndXRmOCcpCgogICAgZGVmIGlzYXNjaWkocyk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBzLmVuY29kZSgnYXNjaWknKQogICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIGV4Y2VwdCBVbmljb2RlRXJyb3I6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKCl9vbmVfbGluZXIgPSBsYW1iZGEgdGV4dDogdGV4dHdyYXAuZGVkZW50KHRleHQpLnN0cmlwKCkucmVwbGFjZSgnXG4nLCAnOyAnKQoKCmNsYXNzIGVhc3lfaW5zdGFsbChDb21tYW5kKToKICAgICIiIk1hbmFnZSBhIGRvd25sb2FkL2J1aWxkL2luc3RhbGwgcHJvY2VzcyIiIgogICAgZGVzY3JpcHRpb24gPSAiRmluZC9nZXQvaW5zdGFsbCBQeXRob24gcGFja2FnZXMiCiAgICBjb21tYW5kX2NvbnN1bWVzX2FyZ3VtZW50cyA9IFRydWUKCiAgICB1c2VyX29wdGlvbnMgPSBbCiAgICAgICAgKCdwcmVmaXg9JywgTm9uZSwgImluc3RhbGxhdGlvbiBwcmVmaXgiKSwKICAgICAgICAoInppcC1vayIsICJ6IiwgImluc3RhbGwgcGFja2FnZSBhcyBhIHppcGZpbGUiKSwKICAgICAgICAoIm11bHRpLXZlcnNpb24iLCAibSIsICJtYWtlIGFwcHMgaGF2ZSB0byByZXF1aXJlKCkgYSB2ZXJzaW9uIiksCiAgICAgICAgKCJ1cGdyYWRlIiwgIlUiLCAiZm9yY2UgdXBncmFkZSAoc2VhcmNoZXMgUHlQSSBmb3IgbGF0ZXN0IHZlcnNpb25zKSIpLAogICAgICAgICgiaW5zdGFsbC1kaXI9IiwgImQiLCAiaW5zdGFsbCBwYWNrYWdlIHRvIERJUiIpLAogICAgICAgICgic2NyaXB0LWRpcj0iLCAicyIsICJpbnN0YWxsIHNjcmlwdHMgdG8gRElSIiksCiAgICAgICAgKCJleGNsdWRlLXNjcmlwdHMiLCAieCIsICJEb24ndCBpbnN0YWxsIHNjcmlwdHMiKSwKICAgICAgICAoImFsd2F5cy1jb3B5IiwgImEiLCAiQ29weSBhbGwgbmVlZGVkIHBhY2thZ2VzIHRvIGluc3RhbGwgZGlyIiksCiAgICAgICAgKCJpbmRleC11cmw9IiwgImkiLCAiYmFzZSBVUkwgb2YgUHl0aG9uIFBhY2thZ2UgSW5kZXgiKSwKICAgICAgICAoImZpbmQtbGlua3M9IiwgImYiLCAiYWRkaXRpb25hbCBVUkwocykgdG8gc2VhcmNoIGZvciBwYWNrYWdlcyIpLAogICAgICAgICgiYnVpbGQtZGlyZWN0b3J5PSIsICJiIiwKICAgICAgICAgImRvd25sb2FkL2V4dHJhY3QvYnVpbGQgaW4gRElSOyBrZWVwIHRoZSByZXN1bHRzIiksCiAgICAgICAgKCdvcHRpbWl6ZT0nLCAnTycsCiAgICAgICAgICJhbHNvIGNvbXBpbGUgd2l0aCBvcHRpbWl6YXRpb246IC1PMSBmb3IgXCJweXRob24gLU9cIiwgIgogICAgICAgICAiLU8yIGZvciBcInB5dGhvbiAtT09cIiwgYW5kIC1PMCB0byBkaXNhYmxlIFtkZWZhdWx0OiAtTzBdIiksCiAgICAgICAgKCdyZWNvcmQ9JywgTm9uZSwKICAgICAgICAgImZpbGVuYW1lIGluIHdoaWNoIHRvIHJlY29yZCBsaXN0IG9mIGluc3RhbGxlZCBmaWxlcyIpLAogICAgICAgICgnYWx3YXlzLXVuemlwJywgJ1onLCAiZG9uJ3QgaW5zdGFsbCBhcyBhIHppcGZpbGUsIG5vIG1hdHRlciB3aGF0IiksCiAgICAgICAgKCdzaXRlLWRpcnM9JywgJ1MnLCAibGlzdCBvZiBkaXJlY3RvcmllcyB3aGVyZSAucHRoIGZpbGVzIHdvcmsiKSwKICAgICAgICAoJ2VkaXRhYmxlJywgJ2UnLCAiSW5zdGFsbCBzcGVjaWZpZWQgcGFja2FnZXMgaW4gZWRpdGFibGUgZm9ybSIpLAogICAgICAgICgnbm8tZGVwcycsICdOJywgImRvbid0IGluc3RhbGwgZGVwZW5kZW5jaWVzIiksCiAgICAgICAgKCdhbGxvdy1ob3N0cz0nLCAnSCcsICJwYXR0ZXJuKHMpIHRoYXQgaG9zdG5hbWVzIG11c3QgbWF0Y2giKSwKICAgICAgICAoJ2xvY2FsLXNuYXBzaG90cy1vaycsICdsJywKICAgICAgICAgImFsbG93IGJ1aWxkaW5nIGVnZ3MgZnJvbSBsb2NhbCBjaGVja291dHMiKSwKICAgICAgICAoJ3ZlcnNpb24nLCBOb25lLCAicHJpbnQgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdCIpLAogICAgICAgICgnbm8tZmluZC1saW5rcycsIE5vbmUsCiAgICAgICAgICJEb24ndCBsb2FkIGZpbmQtbGlua3MgZGVmaW5lZCBpbiBwYWNrYWdlcyBiZWluZyBpbnN0YWxsZWQiKQogICAgXQogICAgYm9vbGVhbl9vcHRpb25zID0gWwogICAgICAgICd6aXAtb2snLCAnbXVsdGktdmVyc2lvbicsICdleGNsdWRlLXNjcmlwdHMnLCAndXBncmFkZScsICdhbHdheXMtY29weScsCiAgICAgICAgJ2VkaXRhYmxlJywKICAgICAgICAnbm8tZGVwcycsICdsb2NhbC1zbmFwc2hvdHMtb2snLCAndmVyc2lvbicKICAgIF0KCiAgICBpZiBzaXRlLkVOQUJMRV9VU0VSX1NJVEU6CiAgICAgICAgaGVscF9tc2cgPSAiaW5zdGFsbCBpbiB1c2VyIHNpdGUtcGFja2FnZSAnJXMnIiAlIHNpdGUuVVNFUl9TSVRFCiAgICAgICAgdXNlcl9vcHRpb25zLmFwcGVuZCgoJ3VzZXInLCBOb25lLCBoZWxwX21zZykpCiAgICAgICAgYm9vbGVhbl9vcHRpb25zLmFwcGVuZCgndXNlcicpCgogICAgbmVnYXRpdmVfb3B0ID0geydhbHdheXMtdW56aXAnOiAnemlwLW9rJ30KICAgIGNyZWF0ZV9pbmRleCA9IFBhY2thZ2VJbmRleAoKICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgIyB0aGUgLS11c2VyIG9wdGlvbiBzZWVtcyB0byBiZSBhbiBvcHQtaW4gb25lLAogICAgICAgICMgc28gdGhlIGRlZmF1bHQgc2hvdWxkIGJlIEZhbHNlLgogICAgICAgIHNlbGYudXNlciA9IDAKICAgICAgICBzZWxmLnppcF9vayA9IHNlbGYubG9jYWxfc25hcHNob3RzX29rID0gTm9uZQogICAgICAgIHNlbGYuaW5zdGFsbF9kaXIgPSBzZWxmLnNjcmlwdF9kaXIgPSBzZWxmLmV4Y2x1ZGVfc2NyaXB0cyA9IE5vbmUKICAgICAgICBzZWxmLmluZGV4X3VybCA9IE5vbmUKICAgICAgICBzZWxmLmZpbmRfbGlua3MgPSBOb25lCiAgICAgICAgc2VsZi5idWlsZF9kaXJlY3RvcnkgPSBOb25lCiAgICAgICAgc2VsZi5hcmdzID0gTm9uZQogICAgICAgIHNlbGYub3B0aW1pemUgPSBzZWxmLnJlY29yZCA9IE5vbmUKICAgICAgICBzZWxmLnVwZ3JhZGUgPSBzZWxmLmFsd2F5c19jb3B5ID0gc2VsZi5tdWx0aV92ZXJzaW9uID0gTm9uZQogICAgICAgIHNlbGYuZWRpdGFibGUgPSBzZWxmLm5vX2RlcHMgPSBzZWxmLmFsbG93X2hvc3RzID0gTm9uZQogICAgICAgIHNlbGYucm9vdCA9IHNlbGYucHJlZml4ID0gc2VsZi5ub19yZXBvcnQgPSBOb25lCiAgICAgICAgc2VsZi52ZXJzaW9uID0gTm9uZQogICAgICAgIHNlbGYuaW5zdGFsbF9wdXJlbGliID0gTm9uZSAgIyBmb3IgcHVyZSBtb2R1bGUgZGlzdHJpYnV0aW9ucwogICAgICAgIHNlbGYuaW5zdGFsbF9wbGF0bGliID0gTm9uZSAgIyBub24tcHVyZSAoZGlzdHMgdy8gZXh0ZW5zaW9ucykKICAgICAgICBzZWxmLmluc3RhbGxfaGVhZGVycyA9IE5vbmUgICMgZm9yIEMvQysrIGhlYWRlcnMKICAgICAgICBzZWxmLmluc3RhbGxfbGliID0gTm9uZSAgIyBzZXQgdG8gZWl0aGVyIHB1cmVsaWIgb3IgcGxhdGxpYgogICAgICAgIHNlbGYuaW5zdGFsbF9zY3JpcHRzID0gTm9uZQogICAgICAgIHNlbGYuaW5zdGFsbF9kYXRhID0gTm9uZQogICAgICAgIHNlbGYuaW5zdGFsbF9iYXNlID0gTm9uZQogICAgICAgIHNlbGYuaW5zdGFsbF9wbGF0YmFzZSA9IE5vbmUKICAgICAgICBpZiBzaXRlLkVOQUJMRV9VU0VSX1NJVEU6CiAgICAgICAgICAgIHNlbGYuaW5zdGFsbF91c2VyYmFzZSA9IHNpdGUuVVNFUl9CQVNFCiAgICAgICAgICAgIHNlbGYuaW5zdGFsbF91c2Vyc2l0ZSA9IHNpdGUuVVNFUl9TSVRFCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5pbnN0YWxsX3VzZXJiYXNlID0gTm9uZQogICAgICAgICAgICBzZWxmLmluc3RhbGxfdXNlcnNpdGUgPSBOb25lCiAgICAgICAgc2VsZi5ub19maW5kX2xpbmtzID0gTm9uZQoKICAgICAgICAjIE9wdGlvbnMgbm90IHNwZWNpZmlhYmxlIHZpYSBjb21tYW5kIGxpbmUKICAgICAgICBzZWxmLnBhY2thZ2VfaW5kZXggPSBOb25lCiAgICAgICAgc2VsZi5wdGhfZmlsZSA9IHNlbGYuYWx3YXlzX2NvcHlfZnJvbSA9IE5vbmUKICAgICAgICBzZWxmLnNpdGVfZGlycyA9IE5vbmUKICAgICAgICBzZWxmLmluc3RhbGxlZF9wcm9qZWN0cyA9IHt9CiAgICAgICAgc2VsZi5zaXRlcHlfaW5zdGFsbGVkID0gRmFsc2UKICAgICAgICAjIEFsd2F5cyByZWFkIGVhc3lfaW5zdGFsbCBvcHRpb25zLCBldmVuIGlmIHdlIGFyZSBzdWJjbGFzc2VkLCBvciBoYXZlCiAgICAgICAgIyBhbiBpbmRlcGVuZGVudCBpbnN0YW5jZSBjcmVhdGVkLiAgVGhpcyBlbnN1cmVzIHRoYXQgZGVmYXVsdHMgd2lsbAogICAgICAgICMgYWx3YXlzIGNvbWUgZnJvbSB0aGUgc3RhbmRhcmQgY29uZmlndXJhdGlvbiBmaWxlKHMpJyAiZWFzeV9pbnN0YWxsIgogICAgICAgICMgc2VjdGlvbiwgZXZlbiBpZiB0aGlzIGlzIGEgImRldmVsb3AiIG9yICJpbnN0YWxsIiBjb21tYW5kLCBvciBzb21lCiAgICAgICAgIyBvdGhlciBlbWJlZGRpbmcuCiAgICAgICAgc2VsZi5fZHJ5X3J1biA9IE5vbmUKICAgICAgICBzZWxmLnZlcmJvc2UgPSBzZWxmLmRpc3RyaWJ1dGlvbi52ZXJib3NlCiAgICAgICAgc2VsZi5kaXN0cmlidXRpb24uX3NldF9jb21tYW5kX29wdGlvbnMoCiAgICAgICAgICAgIHNlbGYsIHNlbGYuZGlzdHJpYnV0aW9uLmdldF9vcHRpb25fZGljdCgnZWFzeV9pbnN0YWxsJykKICAgICAgICApCgogICAgZGVmIGRlbGV0ZV9ibG9ja2VycyhzZWxmLCBibG9ja2Vycyk6CiAgICAgICAgZXh0YW50X2Jsb2NrZXJzID0gKAogICAgICAgICAgICBmaWxlbmFtZSBmb3IgZmlsZW5hbWUgaW4gYmxvY2tlcnMKICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoZmlsZW5hbWUpIG9yIG9zLnBhdGguaXNsaW5rKGZpbGVuYW1lKQogICAgICAgICkKICAgICAgICBsaXN0KG1hcChzZWxmLl9kZWxldGVfcGF0aCwgZXh0YW50X2Jsb2NrZXJzKSkKCiAgICBkZWYgX2RlbGV0ZV9wYXRoKHNlbGYsIHBhdGgpOgogICAgICAgIGxvZy5pbmZvKCJEZWxldGluZyAlcyIsIHBhdGgpCiAgICAgICAgaWYgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgaXNfdHJlZSA9IG9zLnBhdGguaXNkaXIocGF0aCkgYW5kIG5vdCBvcy5wYXRoLmlzbGluayhwYXRoKQogICAgICAgIHJlbW92ZXIgPSBybXRyZWUgaWYgaXNfdHJlZSBlbHNlIG9zLnVubGluawogICAgICAgIHJlbW92ZXIocGF0aCkKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX3JlbmRlcl92ZXJzaW9uKCk6CiAgICAgICAgIiIiCiAgICAgICAgUmVuZGVyIHRoZSBTZXR1cHRvb2xzIHZlcnNpb24gYW5kIGluc3RhbGxhdGlvbiBkZXRhaWxzLCB0aGVuIGV4aXQuCiAgICAgICAgIiIiCiAgICAgICAgdmVyID0gJ3t9Lnt9Jy5mb3JtYXQoKnN5cy52ZXJzaW9uX2luZm8pCiAgICAgICAgZGlzdCA9IGdldF9kaXN0cmlidXRpb24oJ3NldHVwdG9vbHMnKQogICAgICAgIHRtcGwgPSAnc2V0dXB0b29scyB7ZGlzdC52ZXJzaW9ufSBmcm9tIHtkaXN0LmxvY2F0aW9ufSAoUHl0aG9uIHt2ZXJ9KScKICAgICAgICBwcmludCh0bXBsLmZvcm1hdCgqKmxvY2FscygpKSkKICAgICAgICByYWlzZSBTeXN0ZW1FeGl0KCkKCiAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBzZWxmLnZlcnNpb24gYW5kIHNlbGYuX3JlbmRlcl92ZXJzaW9uKCkKCiAgICAgICAgcHlfdmVyc2lvbiA9IHN5cy52ZXJzaW9uLnNwbGl0KClbMF0KICAgICAgICBwcmVmaXgsIGV4ZWNfcHJlZml4ID0gZ2V0X2NvbmZpZ192YXJzKCdwcmVmaXgnLCAnZXhlY19wcmVmaXgnKQoKICAgICAgICBzZWxmLmNvbmZpZ192YXJzID0gewogICAgICAgICAgICAnZGlzdF9uYW1lJzogc2VsZi5kaXN0cmlidXRpb24uZ2V0X25hbWUoKSwKICAgICAgICAgICAgJ2Rpc3RfdmVyc2lvbic6IHNlbGYuZGlzdHJpYnV0aW9uLmdldF92ZXJzaW9uKCksCiAgICAgICAgICAgICdkaXN0X2Z1bGxuYW1lJzogc2VsZi5kaXN0cmlidXRpb24uZ2V0X2Z1bGxuYW1lKCksCiAgICAgICAgICAgICdweV92ZXJzaW9uJzogcHlfdmVyc2lvbiwKICAgICAgICAgICAgJ3B5X3ZlcnNpb25fc2hvcnQnOiBweV92ZXJzaW9uWzA6M10sCiAgICAgICAgICAgICdweV92ZXJzaW9uX25vZG90JzogcHlfdmVyc2lvblswXSArIHB5X3ZlcnNpb25bMl0sCiAgICAgICAgICAgICdzeXNfcHJlZml4JzogcHJlZml4LAogICAgICAgICAgICAncHJlZml4JzogcHJlZml4LAogICAgICAgICAgICAnc3lzX2V4ZWNfcHJlZml4JzogZXhlY19wcmVmaXgsCiAgICAgICAgICAgICdleGVjX3ByZWZpeCc6IGV4ZWNfcHJlZml4LAogICAgICAgICAgICAjIE9ubHkgcHl0aG9uIDMuMisgaGFzIGFiaWZsYWdzCiAgICAgICAgICAgICdhYmlmbGFncyc6IGdldGF0dHIoc3lzLCAnYWJpZmxhZ3MnLCAnJyksCiAgICAgICAgfQoKICAgICAgICBpZiBzaXRlLkVOQUJMRV9VU0VSX1NJVEU6CiAgICAgICAgICAgIHNlbGYuY29uZmlnX3ZhcnNbJ3VzZXJiYXNlJ10gPSBzZWxmLmluc3RhbGxfdXNlcmJhc2UKICAgICAgICAgICAgc2VsZi5jb25maWdfdmFyc1sndXNlcnNpdGUnXSA9IHNlbGYuaW5zdGFsbF91c2Vyc2l0ZQoKICAgICAgICBzZWxmLl9maXhfaW5zdGFsbF9kaXJfZm9yX3VzZXJfc2l0ZSgpCgogICAgICAgIHNlbGYuZXhwYW5kX2Jhc2VkaXJzKCkKICAgICAgICBzZWxmLmV4cGFuZF9kaXJzKCkKCiAgICAgICAgc2VsZi5fZXhwYW5kKAogICAgICAgICAgICAnaW5zdGFsbF9kaXInLCAnc2NyaXB0X2RpcicsICdidWlsZF9kaXJlY3RvcnknLAogICAgICAgICAgICAnc2l0ZV9kaXJzJywKICAgICAgICApCiAgICAgICAgIyBJZiBhIG5vbi1kZWZhdWx0IGluc3RhbGxhdGlvbiBkaXJlY3Rvcnkgd2FzIHNwZWNpZmllZCwgZGVmYXVsdCB0aGUKICAgICAgICAjIHNjcmlwdCBkaXJlY3RvcnkgdG8gbWF0Y2ggaXQuCiAgICAgICAgaWYgc2VsZi5zY3JpcHRfZGlyIGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYuc2NyaXB0X2RpciA9IHNlbGYuaW5zdGFsbF9kaXIKCiAgICAgICAgaWYgc2VsZi5ub19maW5kX2xpbmtzIGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYubm9fZmluZF9saW5rcyA9IEZhbHNlCgogICAgICAgICMgTGV0IGluc3RhbGxfZGlyIGdldCBzZXQgYnkgaW5zdGFsbF9saWIgY29tbWFuZCwgd2hpY2ggaW4gdHVybgogICAgICAgICMgZ2V0cyBpdHMgaW5mbyBmcm9tIHRoZSBpbnN0YWxsIGNvbW1hbmQsIGFuZCB0YWtlcyBpbnRvIGFjY291bnQKICAgICAgICAjIC0tcHJlZml4IGFuZCAtLWhvbWUgYW5kIGFsbCB0aGF0IG90aGVyIGNydWQuCiAgICAgICAgc2VsZi5zZXRfdW5kZWZpbmVkX29wdGlvbnMoCiAgICAgICAgICAgICdpbnN0YWxsX2xpYicsICgnaW5zdGFsbF9kaXInLCAnaW5zdGFsbF9kaXInKQogICAgICAgICkKICAgICAgICAjIExpa2V3aXNlLCBzZXQgZGVmYXVsdCBzY3JpcHRfZGlyIGZyb20gJ2luc3RhbGxfc2NyaXB0cy5pbnN0YWxsX2RpcicKICAgICAgICBzZWxmLnNldF91bmRlZmluZWRfb3B0aW9ucygKICAgICAgICAgICAgJ2luc3RhbGxfc2NyaXB0cycsICgnaW5zdGFsbF9kaXInLCAnc2NyaXB0X2RpcicpCiAgICAgICAgKQoKICAgICAgICBpZiBzZWxmLnVzZXIgYW5kIHNlbGYuaW5zdGFsbF9wdXJlbGliOgogICAgICAgICAgICBzZWxmLmluc3RhbGxfZGlyID0gc2VsZi5pbnN0YWxsX3B1cmVsaWIKICAgICAgICAgICAgc2VsZi5zY3JpcHRfZGlyID0gc2VsZi5pbnN0YWxsX3NjcmlwdHMKICAgICAgICAjIGRlZmF1bHQgLS1yZWNvcmQgZnJvbSB0aGUgaW5zdGFsbCBjb21tYW5kCiAgICAgICAgc2VsZi5zZXRfdW5kZWZpbmVkX29wdGlvbnMoJ2luc3RhbGwnLCAoJ3JlY29yZCcsICdyZWNvcmQnKSkKICAgICAgICAjIFNob3VsZCB0aGlzIGJlIG1vdmVkIHRvIHRoZSBpZiBzdGF0ZW1lbnQgYmVsb3c/IEl0J3Mgbm90IHVzZWQKICAgICAgICAjIGVsc2V3aGVyZQogICAgICAgIG5vcm1wYXRoID0gbWFwKG5vcm1hbGl6ZV9wYXRoLCBzeXMucGF0aCkKICAgICAgICBzZWxmLmFsbF9zaXRlX2RpcnMgPSBnZXRfc2l0ZV9kaXJzKCkKICAgICAgICBpZiBzZWxmLnNpdGVfZGlycyBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2l0ZV9kaXJzID0gWwogICAgICAgICAgICAgICAgb3MucGF0aC5leHBhbmR1c2VyKHMuc3RyaXAoKSkgZm9yIHMgaW4KICAgICAgICAgICAgICAgIHNlbGYuc2l0ZV9kaXJzLnNwbGl0KCcsJykKICAgICAgICAgICAgXQogICAgICAgICAgICBmb3IgZCBpbiBzaXRlX2RpcnM6CiAgICAgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2RpcihkKToKICAgICAgICAgICAgICAgICAgICBsb2cud2FybigiJXMgKGluIC0tc2l0ZS1kaXJzKSBkb2VzIG5vdCBleGlzdCIsIGQpCiAgICAgICAgICAgICAgICBlbGlmIG5vcm1hbGl6ZV9wYXRoKGQpIG5vdCBpbiBub3JtcGF0aDoKICAgICAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgZCArICIgKGluIC0tc2l0ZS1kaXJzKSBpcyBub3Qgb24gc3lzLnBhdGgiCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBzZWxmLmFsbF9zaXRlX2RpcnMuYXBwZW5kKG5vcm1hbGl6ZV9wYXRoKGQpKQogICAgICAgIGlmIG5vdCBzZWxmLmVkaXRhYmxlOgogICAgICAgICAgICBzZWxmLmNoZWNrX3NpdGVfZGlyKCkKICAgICAgICBzZWxmLmluZGV4X3VybCA9IHNlbGYuaW5kZXhfdXJsIG9yICJodHRwczovL3B5cGkub3JnL3NpbXBsZS8iCiAgICAgICAgc2VsZi5zaGFkb3dfcGF0aCA9IHNlbGYuYWxsX3NpdGVfZGlyc1s6XQogICAgICAgIGZvciBwYXRoX2l0ZW0gaW4gc2VsZi5pbnN0YWxsX2Rpciwgbm9ybWFsaXplX3BhdGgoc2VsZi5zY3JpcHRfZGlyKToKICAgICAgICAgICAgaWYgcGF0aF9pdGVtIG5vdCBpbiBzZWxmLnNoYWRvd19wYXRoOgogICAgICAgICAgICAgICAgc2VsZi5zaGFkb3dfcGF0aC5pbnNlcnQoMCwgcGF0aF9pdGVtKQoKICAgICAgICBpZiBzZWxmLmFsbG93X2hvc3RzIGlzIG5vdCBOb25lOgogICAgICAgICAgICBob3N0cyA9IFtzLnN0cmlwKCkgZm9yIHMgaW4gc2VsZi5hbGxvd19ob3N0cy5zcGxpdCgnLCcpXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGhvc3RzID0gWycqJ10KICAgICAgICBpZiBzZWxmLnBhY2thZ2VfaW5kZXggaXMgTm9uZToKICAgICAgICAgICAgc2VsZi5wYWNrYWdlX2luZGV4ID0gc2VsZi5jcmVhdGVfaW5kZXgoCiAgICAgICAgICAgICAgICBzZWxmLmluZGV4X3VybCwgc2VhcmNoX3BhdGg9c2VsZi5zaGFkb3dfcGF0aCwgaG9zdHM9aG9zdHMsCiAgICAgICAgICAgICkKICAgICAgICBzZWxmLmxvY2FsX2luZGV4ID0gRW52aXJvbm1lbnQoc2VsZi5zaGFkb3dfcGF0aCArIHN5cy5wYXRoKQoKICAgICAgICBpZiBzZWxmLmZpbmRfbGlua3MgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5maW5kX2xpbmtzLCBzaXguc3RyaW5nX3R5cGVzKToKICAgICAgICAgICAgICAgIHNlbGYuZmluZF9saW5rcyA9IHNlbGYuZmluZF9saW5rcy5zcGxpdCgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5maW5kX2xpbmtzID0gW10KICAgICAgICBpZiBzZWxmLmxvY2FsX3NuYXBzaG90c19vazoKICAgICAgICAgICAgc2VsZi5wYWNrYWdlX2luZGV4LnNjYW5fZWdnX2xpbmtzKHNlbGYuc2hhZG93X3BhdGggKyBzeXMucGF0aCkKICAgICAgICBpZiBub3Qgc2VsZi5ub19maW5kX2xpbmtzOgogICAgICAgICAgICBzZWxmLnBhY2thZ2VfaW5kZXguYWRkX2ZpbmRfbGlua3Moc2VsZi5maW5kX2xpbmtzKQogICAgICAgIHNlbGYuc2V0X3VuZGVmaW5lZF9vcHRpb25zKCdpbnN0YWxsX2xpYicsICgnb3B0aW1pemUnLCAnb3B0aW1pemUnKSkKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShzZWxmLm9wdGltaXplLCBpbnQpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBzZWxmLm9wdGltaXplID0gaW50KHNlbGYub3B0aW1pemUpCiAgICAgICAgICAgICAgICBpZiBub3QgKDAgPD0gc2VsZi5vcHRpbWl6ZSA8PSAyKToKICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yCiAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoIi0tb3B0aW1pemUgbXVzdCBiZSAwLCAxLCBvciAyIikKCiAgICAgICAgaWYgc2VsZi5lZGl0YWJsZSBhbmQgbm90IHNlbGYuYnVpbGRfZGlyZWN0b3J5OgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNBcmdFcnJvcigKICAgICAgICAgICAgICAgICJNdXN0IHNwZWNpZnkgYSBidWlsZCBkaXJlY3RvcnkgKC1iKSB3aGVuIHVzaW5nIC0tZWRpdGFibGUiCiAgICAgICAgICAgICkKICAgICAgICBpZiBub3Qgc2VsZi5hcmdzOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNBcmdFcnJvcigKICAgICAgICAgICAgICAgICJObyB1cmxzLCBmaWxlbmFtZXMsIG9yIHJlcXVpcmVtZW50cyBzcGVjaWZpZWQgKHNlZSAtLWhlbHApIikKCiAgICAgICAgc2VsZi5vdXRwdXRzID0gW10KCiAgICBkZWYgX2ZpeF9pbnN0YWxsX2Rpcl9mb3JfdXNlcl9zaXRlKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIEZpeCB0aGUgaW5zdGFsbF9kaXIgaWYgIi0tdXNlciIgd2FzIHVzZWQuCiAgICAgICAgIiIiCiAgICAgICAgaWYgbm90IHNlbGYudXNlciBvciBub3Qgc2l0ZS5FTkFCTEVfVVNFUl9TSVRFOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgc2VsZi5jcmVhdGVfaG9tZV9wYXRoKCkKICAgICAgICBpZiBzZWxmLmluc3RhbGxfdXNlcmJhc2UgaXMgTm9uZToKICAgICAgICAgICAgbXNnID0gIlVzZXIgYmFzZSBkaXJlY3RvcnkgaXMgbm90IHNwZWNpZmllZCIKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzUGxhdGZvcm1FcnJvcihtc2cpCiAgICAgICAgc2VsZi5pbnN0YWxsX2Jhc2UgPSBzZWxmLmluc3RhbGxfcGxhdGJhc2UgPSBzZWxmLmluc3RhbGxfdXNlcmJhc2UKICAgICAgICBzY2hlbWVfbmFtZSA9IG9zLm5hbWUucmVwbGFjZSgncG9zaXgnLCAndW5peCcpICsgJ191c2VyJwogICAgICAgIHNlbGYuc2VsZWN0X3NjaGVtZShzY2hlbWVfbmFtZSkKCiAgICBkZWYgX2V4cGFuZF9hdHRycyhzZWxmLCBhdHRycyk6CiAgICAgICAgZm9yIGF0dHIgaW4gYXR0cnM6CiAgICAgICAgICAgIHZhbCA9IGdldGF0dHIoc2VsZiwgYXR0cikKICAgICAgICAgICAgaWYgdmFsIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgaWYgb3MubmFtZSA9PSAncG9zaXgnIG9yIG9zLm5hbWUgPT0gJ250JzoKICAgICAgICAgICAgICAgICAgICB2YWwgPSBvcy5wYXRoLmV4cGFuZHVzZXIodmFsKQogICAgICAgICAgICAgICAgdmFsID0gc3Vic3RfdmFycyh2YWwsIHNlbGYuY29uZmlnX3ZhcnMpCiAgICAgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIGF0dHIsIHZhbCkKCiAgICBkZWYgZXhwYW5kX2Jhc2VkaXJzKHNlbGYpOgogICAgICAgICIiIkNhbGxzIGBvcy5wYXRoLmV4cGFuZHVzZXJgIG9uIGluc3RhbGxfYmFzZSwgaW5zdGFsbF9wbGF0YmFzZSBhbmQKICAgICAgICByb290LiIiIgogICAgICAgIHNlbGYuX2V4cGFuZF9hdHRycyhbJ2luc3RhbGxfYmFzZScsICdpbnN0YWxsX3BsYXRiYXNlJywgJ3Jvb3QnXSkKCiAgICBkZWYgZXhwYW5kX2RpcnMoc2VsZik6CiAgICAgICAgIiIiQ2FsbHMgYG9zLnBhdGguZXhwYW5kdXNlcmAgb24gaW5zdGFsbCBkaXJzLiIiIgogICAgICAgIGRpcnMgPSBbCiAgICAgICAgICAgICdpbnN0YWxsX3B1cmVsaWInLAogICAgICAgICAgICAnaW5zdGFsbF9wbGF0bGliJywKICAgICAgICAgICAgJ2luc3RhbGxfbGliJywKICAgICAgICAgICAgJ2luc3RhbGxfaGVhZGVycycsCiAgICAgICAgICAgICdpbnN0YWxsX3NjcmlwdHMnLAogICAgICAgICAgICAnaW5zdGFsbF9kYXRhJywKICAgICAgICBdCiAgICAgICAgc2VsZi5fZXhwYW5kX2F0dHJzKGRpcnMpCgogICAgZGVmIHJ1bihzZWxmLCBzaG93X2RlcHJlY2F0aW9uPVRydWUpOgogICAgICAgIGlmIHNob3dfZGVwcmVjYXRpb246CiAgICAgICAgICAgIHNlbGYuYW5ub3VuY2UoCiAgICAgICAgICAgICAgICAiV0FSTklORzogVGhlIGVhc3lfaW5zdGFsbCBjb21tYW5kIGlzIGRlcHJlY2F0ZWQgIgogICAgICAgICAgICAgICAgImFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbi4iCiAgICAgICAgICAgICAgICAsIGxvZy5XQVJOLAogICAgICAgICAgICApCiAgICAgICAgaWYgc2VsZi52ZXJib3NlICE9IHNlbGYuZGlzdHJpYnV0aW9uLnZlcmJvc2U6CiAgICAgICAgICAgIGxvZy5zZXRfdmVyYm9zaXR5KHNlbGYudmVyYm9zZSkKICAgICAgICB0cnk6CiAgICAgICAgICAgIGZvciBzcGVjIGluIHNlbGYuYXJnczoKICAgICAgICAgICAgICAgIHNlbGYuZWFzeV9pbnN0YWxsKHNwZWMsIG5vdCBzZWxmLm5vX2RlcHMpCiAgICAgICAgICAgIGlmIHNlbGYucmVjb3JkOgogICAgICAgICAgICAgICAgb3V0cHV0cyA9IHNlbGYub3V0cHV0cwogICAgICAgICAgICAgICAgaWYgc2VsZi5yb290OiAgIyBzdHJpcCBhbnkgcGFja2FnZSBwcmVmaXgKICAgICAgICAgICAgICAgICAgICByb290X2xlbiA9IGxlbihzZWxmLnJvb3QpCiAgICAgICAgICAgICAgICAgICAgZm9yIGNvdW50ZXIgaW4gcmFuZ2UobGVuKG91dHB1dHMpKToKICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0c1tjb3VudGVyXSA9IG91dHB1dHNbY291bnRlcl1bcm9vdF9sZW46XQogICAgICAgICAgICAgICAgZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGZpbGVfdXRpbAoKICAgICAgICAgICAgICAgIHNlbGYuZXhlY3V0ZSgKICAgICAgICAgICAgICAgICAgICBmaWxlX3V0aWwud3JpdGVfZmlsZSwgKHNlbGYucmVjb3JkLCBvdXRwdXRzKSwKICAgICAgICAgICAgICAgICAgICAid3JpdGluZyBsaXN0IG9mIGluc3RhbGxlZCBmaWxlcyB0byAnJXMnIiAlCiAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWNvcmQKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgc2VsZi53YXJuX2RlcHJlY2F0ZWRfb3B0aW9ucygpCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgbG9nLnNldF92ZXJib3NpdHkoc2VsZi5kaXN0cmlidXRpb24udmVyYm9zZSkKCiAgICBkZWYgcHNldWRvX3RlbXBuYW1lKHNlbGYpOgogICAgICAgICIiIlJldHVybiBhIHBzZXVkby10ZW1wbmFtZSBiYXNlIGluIHRoZSBpbnN0YWxsIGRpcmVjdG9yeS4KICAgICAgICBUaGlzIGNvZGUgaXMgaW50ZW50aW9uYWxseSBuYWl2ZTsgaWYgYSBtYWxpY2lvdXMgcGFydHkgY2FuIHdyaXRlIHRvCiAgICAgICAgdGhlIHRhcmdldCBkaXJlY3RvcnkgeW91J3JlIGFscmVhZHkgaW4gZGVlcCBkb29kb28uCiAgICAgICAgIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICBwaWQgPSBvcy5nZXRwaWQoKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIHBpZCA9IHJhbmRvbS5yYW5kaW50KDAsIHN5cy5tYXhzaXplKQogICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4oc2VsZi5pbnN0YWxsX2RpciwgInRlc3QtZWFzeS1pbnN0YWxsLSVzIiAlIHBpZCkKCiAgICBkZWYgd2Fybl9kZXByZWNhdGVkX29wdGlvbnMoc2VsZik6CiAgICAgICAgcGFzcwoKICAgIGRlZiBjaGVja19zaXRlX2RpcihzZWxmKToKICAgICAgICAiIiJWZXJpZnkgdGhhdCBzZWxmLmluc3RhbGxfZGlyIGlzIC5wdGgtY2FwYWJsZSBkaXIsIGlmIG5lZWRlZCIiIgoKICAgICAgICBpbnN0ZGlyID0gbm9ybWFsaXplX3BhdGgoc2VsZi5pbnN0YWxsX2RpcikKICAgICAgICBwdGhfZmlsZSA9IG9zLnBhdGguam9pbihpbnN0ZGlyLCAnZWFzeS1pbnN0YWxsLnB0aCcpCgogICAgICAgICMgSXMgaXQgYSBjb25maWd1cmVkLCBQWVRIT05QQVRILCBpbXBsaWNpdCwgb3IgZXhwbGljaXQgc2l0ZSBkaXI/CiAgICAgICAgaXNfc2l0ZV9kaXIgPSBpbnN0ZGlyIGluIHNlbGYuYWxsX3NpdGVfZGlycwoKICAgICAgICBpZiBub3QgaXNfc2l0ZV9kaXIgYW5kIG5vdCBzZWxmLm11bHRpX3ZlcnNpb246CiAgICAgICAgICAgICMgTm8/ICBUaGVuIGRpcmVjdGx5IHRlc3Qgd2hldGhlciBpdCBkb2VzIC5wdGggZmlsZSBwcm9jZXNzaW5nCiAgICAgICAgICAgIGlzX3NpdGVfZGlyID0gc2VsZi5jaGVja19wdGhfcHJvY2Vzc2luZygpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBtYWtlIHN1cmUgd2UgY2FuIHdyaXRlIHRvIHRhcmdldCBkaXIKICAgICAgICAgICAgdGVzdGZpbGUgPSBzZWxmLnBzZXVkb190ZW1wbmFtZSgpICsgJy53cml0ZS10ZXN0JwogICAgICAgICAgICB0ZXN0X2V4aXN0cyA9IG9zLnBhdGguZXhpc3RzKHRlc3RmaWxlKQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBpZiB0ZXN0X2V4aXN0czoKICAgICAgICAgICAgICAgICAgICBvcy51bmxpbmsodGVzdGZpbGUpCiAgICAgICAgICAgICAgICBvcGVuKHRlc3RmaWxlLCAndycpLmNsb3NlKCkKICAgICAgICAgICAgICAgIG9zLnVubGluayh0ZXN0ZmlsZSkKICAgICAgICAgICAgZXhjZXB0IChPU0Vycm9yLCBJT0Vycm9yKToKICAgICAgICAgICAgICAgIHNlbGYuY2FudF93cml0ZV90b190YXJnZXQoKQoKICAgICAgICBpZiBub3QgaXNfc2l0ZV9kaXIgYW5kIG5vdCBzZWxmLm11bHRpX3ZlcnNpb246CiAgICAgICAgICAgICMgQ2FuJ3QgaW5zdGFsbCBub24tbXVsdGkgdG8gbm9uLXNpdGUgZGlyCiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKHNlbGYubm9fZGVmYXVsdF92ZXJzaW9uX21zZygpKQoKICAgICAgICBpZiBpc19zaXRlX2RpcjoKICAgICAgICAgICAgaWYgc2VsZi5wdGhfZmlsZSBpcyBOb25lOgogICAgICAgICAgICAgICAgc2VsZi5wdGhfZmlsZSA9IFB0aERpc3RyaWJ1dGlvbnMocHRoX2ZpbGUsIHNlbGYuYWxsX3NpdGVfZGlycykKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnB0aF9maWxlID0gTm9uZQoKICAgICAgICBpZiBpbnN0ZGlyIG5vdCBpbiBtYXAobm9ybWFsaXplX3BhdGgsIF9weXRob25wYXRoKCkpOgogICAgICAgICAgICAjIG9ubHkgUFlUSE9OUEFUSCBkaXJzIG5lZWQgYSBzaXRlLnB5LCBzbyBwcmV0ZW5kIGl0J3MgdGhlcmUKICAgICAgICAgICAgc2VsZi5zaXRlcHlfaW5zdGFsbGVkID0gVHJ1ZQogICAgICAgIGVsaWYgc2VsZi5tdWx0aV92ZXJzaW9uIGFuZCBub3Qgb3MucGF0aC5leGlzdHMocHRoX2ZpbGUpOgogICAgICAgICAgICBzZWxmLnNpdGVweV9pbnN0YWxsZWQgPSBUcnVlICAjIGRvbid0IG5lZWQgc2l0ZS5weSBpbiB0aGlzIGNhc2UKICAgICAgICAgICAgc2VsZi5wdGhfZmlsZSA9IE5vbmUgICMgYW5kIGRvbid0IGNyZWF0ZSBhIC5wdGggZmlsZQogICAgICAgIHNlbGYuaW5zdGFsbF9kaXIgPSBpbnN0ZGlyCgogICAgX19jYW50X3dyaXRlX21zZyA9IHRleHR3cmFwLmRlZGVudCgiIiIKICAgICAgICBjYW4ndCBjcmVhdGUgb3IgcmVtb3ZlIGZpbGVzIGluIGluc3RhbGwgZGlyZWN0b3J5CgogICAgICAgIFRoZSBmb2xsb3dpbmcgZXJyb3Igb2NjdXJyZWQgd2hpbGUgdHJ5aW5nIHRvIGFkZCBvciByZW1vdmUgZmlsZXMgaW4gdGhlCiAgICAgICAgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeToKCiAgICAgICAgICAgICVzCgogICAgICAgIFRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IHlvdSBzcGVjaWZpZWQgKHZpYSAtLWluc3RhbGwtZGlyLCAtLXByZWZpeCwgb3IKICAgICAgICB0aGUgZGlzdHV0aWxzIGRlZmF1bHQgc2V0dGluZykgd2FzOgoKICAgICAgICAgICAgJXMKICAgICAgICAiIiIpLmxzdHJpcCgpCgogICAgX19ub3RfZXhpc3RzX2lkID0gdGV4dHdyYXAuZGVkZW50KCIiIgogICAgICAgIFRoaXMgZGlyZWN0b3J5IGRvZXMgbm90IGN1cnJlbnRseSBleGlzdC4gIFBsZWFzZSBjcmVhdGUgaXQgYW5kIHRyeSBhZ2Fpbiwgb3IKICAgICAgICBjaG9vc2UgYSBkaWZmZXJlbnQgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSAodXNpbmcgdGhlIC1kIG9yIC0taW5zdGFsbC1kaXIKICAgICAgICBvcHRpb24pLgogICAgICAgICIiIikubHN0cmlwKCkKCiAgICBfX2FjY2Vzc19tc2cgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiCiAgICAgICAgUGVyaGFwcyB5b3VyIGFjY291bnQgZG9lcyBub3QgaGF2ZSB3cml0ZSBhY2Nlc3MgdG8gdGhpcyBkaXJlY3Rvcnk/ICBJZiB0aGUKICAgICAgICBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IGlzIGEgc3lzdGVtLW93bmVkIGRpcmVjdG9yeSwgeW91IG1heSBuZWVkIHRvIHNpZ24gaW4KICAgICAgICBhcyB0aGUgYWRtaW5pc3RyYXRvciBvciAicm9vdCIgYWNjb3VudC4gIElmIHlvdSBkbyBub3QgaGF2ZSBhZG1pbmlzdHJhdGl2ZQogICAgICAgIGFjY2VzcyB0byB0aGlzIG1hY2hpbmUsIHlvdSBtYXkgd2lzaCB0byBjaG9vc2UgYSBkaWZmZXJlbnQgaW5zdGFsbGF0aW9uCiAgICAgICAgZGlyZWN0b3J5LCBwcmVmZXJhYmx5IG9uZSB0aGF0IGlzIGxpc3RlZCBpbiB5b3VyIFBZVEhPTlBBVEggZW52aXJvbm1lbnQKICAgICAgICB2YXJpYWJsZS4KCiAgICAgICAgRm9yIGluZm9ybWF0aW9uIG9uIG90aGVyIG9wdGlvbnMsIHlvdSBtYXkgd2lzaCB0byBjb25zdWx0IHRoZQogICAgICAgIGRvY3VtZW50YXRpb24gYXQ6CgogICAgICAgICAgaHR0cHM6Ly9zZXR1cHRvb2xzLnJlYWR0aGVkb2NzLmlvL2VuL2xhdGVzdC9lYXN5X2luc3RhbGwuaHRtbAoKICAgICAgICBQbGVhc2UgbWFrZSB0aGUgYXBwcm9wcmlhdGUgY2hhbmdlcyBmb3IgeW91ciBzeXN0ZW0gYW5kIHRyeSBhZ2Fpbi4KICAgICAgICAiIiIpLmxzdHJpcCgpCgogICAgZGVmIGNhbnRfd3JpdGVfdG9fdGFyZ2V0KHNlbGYpOgogICAgICAgIG1zZyA9IHNlbGYuX19jYW50X3dyaXRlX21zZyAlIChzeXMuZXhjX2luZm8oKVsxXSwgc2VsZi5pbnN0YWxsX2RpciwpCgogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzZWxmLmluc3RhbGxfZGlyKToKICAgICAgICAgICAgbXNnICs9ICdcbicgKyBzZWxmLl9fbm90X2V4aXN0c19pZAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG1zZyArPSAnXG4nICsgc2VsZi5fX2FjY2Vzc19tc2cKICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcihtc2cpCgogICAgZGVmIGNoZWNrX3B0aF9wcm9jZXNzaW5nKHNlbGYpOgogICAgICAgICIiIkVtcGlyaWNhbGx5IHZlcmlmeSB3aGV0aGVyIC5wdGggZmlsZXMgYXJlIHN1cHBvcnRlZCBpbiBpbnN0LiBkaXIiIiIKICAgICAgICBpbnN0ZGlyID0gc2VsZi5pbnN0YWxsX2RpcgogICAgICAgIGxvZy5pbmZvKCJDaGVja2luZyAucHRoIGZpbGUgc3VwcG9ydCBpbiAlcyIsIGluc3RkaXIpCiAgICAgICAgcHRoX2ZpbGUgPSBzZWxmLnBzZXVkb190ZW1wbmFtZSgpICsgIi5wdGgiCiAgICAgICAgb2tfZmlsZSA9IHB0aF9maWxlICsgJy5vaycKICAgICAgICBva19leGlzdHMgPSBvcy5wYXRoLmV4aXN0cyhva19maWxlKQogICAgICAgIHRtcGwgPSBfb25lX2xpbmVyKCIiIgogICAgICAgICAgICBpbXBvcnQgb3MKICAgICAgICAgICAgZiA9IG9wZW4oe29rX2ZpbGUhcn0sICd3JykKICAgICAgICAgICAgZi53cml0ZSgnT0snKQogICAgICAgICAgICBmLmNsb3NlKCkKICAgICAgICAgICAgIiIiKSArICdcbicKICAgICAgICB0cnk6CiAgICAgICAgICAgIGlmIG9rX2V4aXN0czoKICAgICAgICAgICAgICAgIG9zLnVubGluayhva19maWxlKQogICAgICAgICAgICBkaXJuYW1lID0gb3MucGF0aC5kaXJuYW1lKG9rX2ZpbGUpCiAgICAgICAgICAgIHBrZ19yZXNvdXJjZXMucHkzMWNvbXBhdC5tYWtlZGlycyhkaXJuYW1lLCBleGlzdF9vaz1UcnVlKQogICAgICAgICAgICBmID0gb3BlbihwdGhfZmlsZSwgJ3cnKQogICAgICAgIGV4Y2VwdCAoT1NFcnJvciwgSU9FcnJvcik6CiAgICAgICAgICAgIHNlbGYuY2FudF93cml0ZV90b190YXJnZXQoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGYud3JpdGUodG1wbC5mb3JtYXQoKipsb2NhbHMoKSkpCiAgICAgICAgICAgICAgICBmLmNsb3NlKCkKICAgICAgICAgICAgICAgIGYgPSBOb25lCiAgICAgICAgICAgICAgICBleGVjdXRhYmxlID0gc3lzLmV4ZWN1dGFibGUKICAgICAgICAgICAgICAgIGlmIG9zLm5hbWUgPT0gJ250JzoKICAgICAgICAgICAgICAgICAgICBkaXJuYW1lLCBiYXNlbmFtZSA9IG9zLnBhdGguc3BsaXQoZXhlY3V0YWJsZSkKICAgICAgICAgICAgICAgICAgICBhbHQgPSBvcy5wYXRoLmpvaW4oZGlybmFtZSwgJ3B5dGhvbncuZXhlJykKICAgICAgICAgICAgICAgICAgICB1c2VfYWx0ID0gKAogICAgICAgICAgICAgICAgICAgICAgICBiYXNlbmFtZS5sb3dlcigpID09ICdweXRob24uZXhlJyBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5leGlzdHMoYWx0KQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICBpZiB1c2VfYWx0OgogICAgICAgICAgICAgICAgICAgICAgICAjIHVzZSBweXRob253LmV4ZSB0byBhdm9pZCBvcGVuaW5nIGEgY29uc29sZSB3aW5kb3cKICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0YWJsZSA9IGFsdAoKICAgICAgICAgICAgICAgIGZyb20gZGlzdHV0aWxzLnNwYXduIGltcG9ydCBzcGF3bgoKICAgICAgICAgICAgICAgIHNwYXduKFtleGVjdXRhYmxlLCAnLUUnLCAnLWMnLCAncGFzcyddLCAwKQoKICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKG9rX2ZpbGUpOgogICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKAogICAgICAgICAgICAgICAgICAgICAgICAiVEVTVCBQQVNTRUQ6ICVzIGFwcGVhcnMgdG8gc3VwcG9ydCAucHRoIGZpbGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGRpcgogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgICAgaWYgZjoKICAgICAgICAgICAgICAgICAgICBmLmNsb3NlKCkKICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKG9rX2ZpbGUpOgogICAgICAgICAgICAgICAgICAgIG9zLnVubGluayhva19maWxlKQogICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMocHRoX2ZpbGUpOgogICAgICAgICAgICAgICAgICAgIG9zLnVubGluayhwdGhfZmlsZSkKICAgICAgICBpZiBub3Qgc2VsZi5tdWx0aV92ZXJzaW9uOgogICAgICAgICAgICBsb2cud2FybigiVEVTVCBGQUlMRUQ6ICVzIGRvZXMgTk9UIHN1cHBvcnQgLnB0aCBmaWxlcyIsIGluc3RkaXIpCiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZGVmIGluc3RhbGxfZWdnX3NjcmlwdHMoc2VsZiwgZGlzdCk6CiAgICAgICAgIiIiV3JpdGUgYWxsIHRoZSBzY3JpcHRzIGZvciBgZGlzdGAsIHVubGVzcyBzY3JpcHRzIGFyZSBleGNsdWRlZCIiIgogICAgICAgIGlmIG5vdCBzZWxmLmV4Y2x1ZGVfc2NyaXB0cyBhbmQgZGlzdC5tZXRhZGF0YV9pc2Rpcignc2NyaXB0cycpOgogICAgICAgICAgICBmb3Igc2NyaXB0X25hbWUgaW4gZGlzdC5tZXRhZGF0YV9saXN0ZGlyKCdzY3JpcHRzJyk6CiAgICAgICAgICAgICAgICBpZiBkaXN0Lm1ldGFkYXRhX2lzZGlyKCdzY3JpcHRzLycgKyBzY3JpcHRfbmFtZSk6CiAgICAgICAgICAgICAgICAgICAgIyBUaGUgInNjcmlwdCIgaXMgYSBkaXJlY3RvcnksIGxpa2VseSBhIFB5dGhvbiAzCiAgICAgICAgICAgICAgICAgICAgIyBfX3B5Y2FjaGVfXyBkaXJlY3RvcnksIHNvIHNraXAgaXQuCiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIHNlbGYuaW5zdGFsbF9zY3JpcHQoCiAgICAgICAgICAgICAgICAgICAgZGlzdCwgc2NyaXB0X25hbWUsCiAgICAgICAgICAgICAgICAgICAgZGlzdC5nZXRfbWV0YWRhdGEoJ3NjcmlwdHMvJyArIHNjcmlwdF9uYW1lKQogICAgICAgICAgICAgICAgKQogICAgICAgIHNlbGYuaW5zdGFsbF93cmFwcGVyX3NjcmlwdHMoZGlzdCkKCiAgICBkZWYgYWRkX291dHB1dChzZWxmLCBwYXRoKToKICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKHBhdGgpOgogICAgICAgICAgICBmb3IgYmFzZSwgZGlycywgZmlsZXMgaW4gb3Mud2FsayhwYXRoKToKICAgICAgICAgICAgICAgIGZvciBmaWxlbmFtZSBpbiBmaWxlczoKICAgICAgICAgICAgICAgICAgICBzZWxmLm91dHB1dHMuYXBwZW5kKG9zLnBhdGguam9pbihiYXNlLCBmaWxlbmFtZSkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5vdXRwdXRzLmFwcGVuZChwYXRoKQoKICAgIGRlZiBub3RfZWRpdGFibGUoc2VsZiwgc3BlYyk6CiAgICAgICAgaWYgc2VsZi5lZGl0YWJsZToKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzQXJnRXJyb3IoCiAgICAgICAgICAgICAgICAiSW52YWxpZCBhcmd1bWVudCAlcjogeW91IGNhbid0IHVzZSBmaWxlbmFtZXMgb3IgVVJMcyAiCiAgICAgICAgICAgICAgICAid2l0aCAtLWVkaXRhYmxlIChleGNlcHQgdmlhIHRoZSAtLWZpbmQtbGlua3Mgb3B0aW9uKS4iCiAgICAgICAgICAgICAgICAlIChzcGVjLCkKICAgICAgICAgICAgKQoKICAgIGRlZiBjaGVja19lZGl0YWJsZShzZWxmLCBzcGVjKToKICAgICAgICBpZiBub3Qgc2VsZi5lZGl0YWJsZToKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihzZWxmLmJ1aWxkX2RpcmVjdG9yeSwgc3BlYy5rZXkpKToKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzQXJnRXJyb3IoCiAgICAgICAgICAgICAgICAiJXIgYWxyZWFkeSBleGlzdHMgaW4gJXM7IGNhbid0IGRvIGEgY2hlY2tvdXQgdGhlcmUiICUKICAgICAgICAgICAgICAgIChzcGVjLmtleSwgc2VsZi5idWlsZF9kaXJlY3RvcnkpCiAgICAgICAgICAgICkKCiAgICBAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgogICAgZGVmIF90bXBkaXIoc2VsZik6CiAgICAgICAgdG1wZGlyID0gdGVtcGZpbGUubWtkdGVtcChwcmVmaXg9dSJlYXN5X2luc3RhbGwtIikKICAgICAgICB0cnk6CiAgICAgICAgICAgICMgY2FzdCB0byBzdHIgYXMgd29ya2Fyb3VuZCBmb3IgIzcwOSBhbmQgIzcxMCBhbmQgIzcxMgogICAgICAgICAgICB5aWVsZCBzdHIodG1wZGlyKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIG9zLnBhdGguZXhpc3RzKHRtcGRpcikgYW5kIHJtdHJlZShybXRyZWVfc2FmZSh0bXBkaXIpKQoKICAgIGRlZiBlYXN5X2luc3RhbGwoc2VsZiwgc3BlYywgZGVwcz1GYWxzZSk6CiAgICAgICAgaWYgbm90IHNlbGYuZWRpdGFibGU6CiAgICAgICAgICAgIHNlbGYuaW5zdGFsbF9zaXRlX3B5KCkKCiAgICAgICAgd2l0aCBzZWxmLl90bXBkaXIoKSBhcyB0bXBkaXI6CiAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHNwZWMsIFJlcXVpcmVtZW50KToKICAgICAgICAgICAgICAgIGlmIFVSTF9TQ0hFTUUoc3BlYyk6CiAgICAgICAgICAgICAgICAgICAgIyBJdCdzIGEgdXJsLCBkb3dubG9hZCBpdCB0byB0bXBkaXIgYW5kIHByb2Nlc3MKICAgICAgICAgICAgICAgICAgICBzZWxmLm5vdF9lZGl0YWJsZShzcGVjKQogICAgICAgICAgICAgICAgICAgIGRsID0gc2VsZi5wYWNrYWdlX2luZGV4LmRvd25sb2FkKHNwZWMsIHRtcGRpcikKICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5pbnN0YWxsX2l0ZW0oTm9uZSwgZGwsIHRtcGRpciwgZGVwcywgVHJ1ZSkKCiAgICAgICAgICAgICAgICBlbGlmIG9zLnBhdGguZXhpc3RzKHNwZWMpOgogICAgICAgICAgICAgICAgICAgICMgRXhpc3RpbmcgZmlsZSBvciBkaXJlY3RvcnksIGp1c3QgcHJvY2VzcyBpdCBkaXJlY3RseQogICAgICAgICAgICAgICAgICAgIHNlbGYubm90X2VkaXRhYmxlKHNwZWMpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuaW5zdGFsbF9pdGVtKE5vbmUsIHNwZWMsIHRtcGRpciwgZGVwcywgVHJ1ZSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgc3BlYyA9IHBhcnNlX3JlcXVpcmVtZW50X2FyZyhzcGVjKQoKICAgICAgICAgICAgc2VsZi5jaGVja19lZGl0YWJsZShzcGVjKQogICAgICAgICAgICBkaXN0ID0gc2VsZi5wYWNrYWdlX2luZGV4LmZldGNoX2Rpc3RyaWJ1dGlvbigKICAgICAgICAgICAgICAgIHNwZWMsIHRtcGRpciwgc2VsZi51cGdyYWRlLCBzZWxmLmVkaXRhYmxlLAogICAgICAgICAgICAgICAgbm90IHNlbGYuYWx3YXlzX2NvcHksIHNlbGYubG9jYWxfaW5kZXgKICAgICAgICAgICAgKQogICAgICAgICAgICBpZiBkaXN0IGlzIE5vbmU6CiAgICAgICAgICAgICAgICBtc2cgPSAiQ291bGQgbm90IGZpbmQgc3VpdGFibGUgZGlzdHJpYnV0aW9uIGZvciAlciIgJSBzcGVjCiAgICAgICAgICAgICAgICBpZiBzZWxmLmFsd2F5c19jb3B5OgogICAgICAgICAgICAgICAgICAgIG1zZyArPSAiICgtLWFsd2F5cy1jb3B5IHNraXBzIHN5c3RlbSBhbmQgZGV2ZWxvcG1lbnQgZWdncykiCiAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcihtc2cpCiAgICAgICAgICAgIGVsaWYgZGlzdC5wcmVjZWRlbmNlID09IERFVkVMT1BfRElTVDoKICAgICAgICAgICAgICAgICMgLmVnZy1pbmZvIGRpc3RzIGRvbid0IG5lZWQgaW5zdGFsbGluZywganVzdCBwcm9jZXNzIGRlcHMKICAgICAgICAgICAgICAgIHNlbGYucHJvY2Vzc19kaXN0cmlidXRpb24oc3BlYywgZGlzdCwgZGVwcywgIlVzaW5nIikKICAgICAgICAgICAgICAgIHJldHVybiBkaXN0CiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5pbnN0YWxsX2l0ZW0oc3BlYywgZGlzdC5sb2NhdGlvbiwgdG1wZGlyLCBkZXBzKQoKICAgIGRlZiBpbnN0YWxsX2l0ZW0oc2VsZiwgc3BlYywgZG93bmxvYWQsIHRtcGRpciwgZGVwcywgaW5zdGFsbF9uZWVkZWQ9RmFsc2UpOgoKICAgICAgICAjIEluc3RhbGxhdGlvbiBpcyBhbHNvIG5lZWRlZCBpZiBmaWxlIGluIHRtcGRpciBvciBpcyBub3QgYW4gZWdnCiAgICAgICAgaW5zdGFsbF9uZWVkZWQgPSBpbnN0YWxsX25lZWRlZCBvciBzZWxmLmFsd2F5c19jb3B5CiAgICAgICAgaW5zdGFsbF9uZWVkZWQgPSBpbnN0YWxsX25lZWRlZCBvciBvcy5wYXRoLmRpcm5hbWUoZG93bmxvYWQpID09IHRtcGRpcgogICAgICAgIGluc3RhbGxfbmVlZGVkID0gaW5zdGFsbF9uZWVkZWQgb3Igbm90IGRvd25sb2FkLmVuZHN3aXRoKCcuZWdnJykKICAgICAgICBpbnN0YWxsX25lZWRlZCA9IGluc3RhbGxfbmVlZGVkIG9yICgKICAgICAgICAgICAgc2VsZi5hbHdheXNfY29weV9mcm9tIGlzIG5vdCBOb25lIGFuZAogICAgICAgICAgICBvcy5wYXRoLmRpcm5hbWUobm9ybWFsaXplX3BhdGgoZG93bmxvYWQpKSA9PQogICAgICAgICAgICBub3JtYWxpemVfcGF0aChzZWxmLmFsd2F5c19jb3B5X2Zyb20pCiAgICAgICAgKQoKICAgICAgICBpZiBzcGVjIGFuZCBub3QgaW5zdGFsbF9uZWVkZWQ6CiAgICAgICAgICAgICMgYXQgdGhpcyBwb2ludCwgd2Uga25vdyBpdCdzIGEgbG9jYWwgLmVnZywgd2UganVzdCBkb24ndCBrbm93IGlmCiAgICAgICAgICAgICMgaXQncyBhbHJlYWR5IGluc3RhbGxlZC4KICAgICAgICAgICAgZm9yIGRpc3QgaW4gc2VsZi5sb2NhbF9pbmRleFtzcGVjLnByb2plY3RfbmFtZV06CiAgICAgICAgICAgICAgICBpZiBkaXN0LmxvY2F0aW9uID09IGRvd25sb2FkOgogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBpbnN0YWxsX25lZWRlZCA9IFRydWUgICMgaXQncyBub3QgaW4gdGhlIGxvY2FsIGluZGV4CgogICAgICAgIGxvZy5pbmZvKCJQcm9jZXNzaW5nICVzIiwgb3MucGF0aC5iYXNlbmFtZShkb3dubG9hZCkpCgogICAgICAgIGlmIGluc3RhbGxfbmVlZGVkOgogICAgICAgICAgICBkaXN0cyA9IHNlbGYuaW5zdGFsbF9lZ2dzKHNwZWMsIGRvd25sb2FkLCB0bXBkaXIpCiAgICAgICAgICAgIGZvciBkaXN0IGluIGRpc3RzOgogICAgICAgICAgICAgICAgc2VsZi5wcm9jZXNzX2Rpc3RyaWJ1dGlvbihzcGVjLCBkaXN0LCBkZXBzKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGRpc3RzID0gW3NlbGYuZWdnX2Rpc3RyaWJ1dGlvbihkb3dubG9hZCldCiAgICAgICAgICAgIHNlbGYucHJvY2Vzc19kaXN0cmlidXRpb24oc3BlYywgZGlzdHNbMF0sIGRlcHMsICJVc2luZyIpCgogICAgICAgIGlmIHNwZWMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGZvciBkaXN0IGluIGRpc3RzOgogICAgICAgICAgICAgICAgaWYgZGlzdCBpbiBzcGVjOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBkaXN0CgogICAgZGVmIHNlbGVjdF9zY2hlbWUoc2VsZiwgbmFtZSk6CiAgICAgICAgIiIiU2V0cyB0aGUgaW5zdGFsbCBkaXJlY3RvcmllcyBieSBhcHBseWluZyB0aGUgaW5zdGFsbCBzY2hlbWVzLiIiIgogICAgICAgICMgaXQncyB0aGUgY2FsbGVyJ3MgcHJvYmxlbSBpZiB0aGV5IHN1cHBseSBhIGJhZCBuYW1lIQogICAgICAgIHNjaGVtZSA9IElOU1RBTExfU0NIRU1FU1tuYW1lXQogICAgICAgIGZvciBrZXkgaW4gU0NIRU1FX0tFWVM6CiAgICAgICAgICAgIGF0dHJuYW1lID0gJ2luc3RhbGxfJyArIGtleQogICAgICAgICAgICBpZiBnZXRhdHRyKHNlbGYsIGF0dHJuYW1lKSBpcyBOb25lOgogICAgICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBhdHRybmFtZSwgc2NoZW1lW2tleV0pCgogICAgZGVmIHByb2Nlc3NfZGlzdHJpYnV0aW9uKHNlbGYsIHJlcXVpcmVtZW50LCBkaXN0LCBkZXBzPVRydWUsICppbmZvKToKICAgICAgICBzZWxmLnVwZGF0ZV9wdGgoZGlzdCkKICAgICAgICBzZWxmLnBhY2thZ2VfaW5kZXguYWRkKGRpc3QpCiAgICAgICAgaWYgZGlzdCBpbiBzZWxmLmxvY2FsX2luZGV4W2Rpc3Qua2V5XToKICAgICAgICAgICAgc2VsZi5sb2NhbF9pbmRleC5yZW1vdmUoZGlzdCkKICAgICAgICBzZWxmLmxvY2FsX2luZGV4LmFkZChkaXN0KQogICAgICAgIHNlbGYuaW5zdGFsbF9lZ2dfc2NyaXB0cyhkaXN0KQogICAgICAgIHNlbGYuaW5zdGFsbGVkX3Byb2plY3RzW2Rpc3Qua2V5XSA9IGRpc3QKICAgICAgICBsb2cuaW5mbyhzZWxmLmluc3RhbGxhdGlvbl9yZXBvcnQocmVxdWlyZW1lbnQsIGRpc3QsICppbmZvKSkKICAgICAgICBpZiAoZGlzdC5oYXNfbWV0YWRhdGEoJ2RlcGVuZGVuY3lfbGlua3MudHh0JykgYW5kCiAgICAgICAgICAgICAgICBub3Qgc2VsZi5ub19maW5kX2xpbmtzKToKICAgICAgICAgICAgc2VsZi5wYWNrYWdlX2luZGV4LmFkZF9maW5kX2xpbmtzKAogICAgICAgICAgICAgICAgZGlzdC5nZXRfbWV0YWRhdGFfbGluZXMoJ2RlcGVuZGVuY3lfbGlua3MudHh0JykKICAgICAgICAgICAgKQogICAgICAgIGlmIG5vdCBkZXBzIGFuZCBub3Qgc2VsZi5hbHdheXNfY29weToKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgZWxpZiByZXF1aXJlbWVudCBpcyBub3QgTm9uZSBhbmQgZGlzdC5rZXkgIT0gcmVxdWlyZW1lbnQua2V5OgogICAgICAgICAgICBsb2cud2FybigiU2tpcHBpbmcgZGVwZW5kZW5jaWVzIGZvciAlcyIsIGRpc3QpCiAgICAgICAgICAgIHJldHVybiAgIyBYWFggdGhpcyBpcyBub3QgdGhlIGRpc3RyaWJ1dGlvbiB3ZSB3ZXJlIGxvb2tpbmcgZm9yCiAgICAgICAgZWxpZiByZXF1aXJlbWVudCBpcyBOb25lIG9yIGRpc3Qgbm90IGluIHJlcXVpcmVtZW50OgogICAgICAgICAgICAjIGlmIHdlIHdvdW5kIHVwIHdpdGggYSBkaWZmZXJlbnQgdmVyc2lvbiwgcmVzb2x2ZSB3aGF0IHdlJ3ZlIGdvdAogICAgICAgICAgICBkaXN0cmVxID0gZGlzdC5hc19yZXF1aXJlbWVudCgpCiAgICAgICAgICAgIHJlcXVpcmVtZW50ID0gUmVxdWlyZW1lbnQoc3RyKGRpc3RyZXEpKQogICAgICAgIGxvZy5pbmZvKCJQcm9jZXNzaW5nIGRlcGVuZGVuY2llcyBmb3IgJXMiLCByZXF1aXJlbWVudCkKICAgICAgICB0cnk6CiAgICAgICAgICAgIGRpc3Ryb3MgPSBXb3JraW5nU2V0KFtdKS5yZXNvbHZlKAogICAgICAgICAgICAgICAgW3JlcXVpcmVtZW50XSwgc2VsZi5sb2NhbF9pbmRleCwgc2VsZi5lYXN5X2luc3RhbGwKICAgICAgICAgICAgKQogICAgICAgIGV4Y2VwdCBEaXN0cmlidXRpb25Ob3RGb3VuZCBhcyBlOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcihzdHIoZSkpCiAgICAgICAgZXhjZXB0IFZlcnNpb25Db25mbGljdCBhcyBlOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcihlLnJlcG9ydCgpKQogICAgICAgIGlmIHNlbGYuYWx3YXlzX2NvcHkgb3Igc2VsZi5hbHdheXNfY29weV9mcm9tOgogICAgICAgICAgICAjIEZvcmNlIGFsbCB0aGUgcmVsZXZhbnQgZGlzdHJvcyB0byBiZSBjb3BpZWQgb3IgYWN0aXZhdGVkCiAgICAgICAgICAgIGZvciBkaXN0IGluIGRpc3Ryb3M6CiAgICAgICAgICAgICAgICBpZiBkaXN0LmtleSBub3QgaW4gc2VsZi5pbnN0YWxsZWRfcHJvamVjdHM6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lYXN5X2luc3RhbGwoZGlzdC5hc19yZXF1aXJlbWVudCgpKQogICAgICAgIGxvZy5pbmZvKCJGaW5pc2hlZCBwcm9jZXNzaW5nIGRlcGVuZGVuY2llcyBmb3IgJXMiLCByZXF1aXJlbWVudCkKCiAgICBkZWYgc2hvdWxkX3VuemlwKHNlbGYsIGRpc3QpOgogICAgICAgIGlmIHNlbGYuemlwX29rIGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4gbm90IHNlbGYuemlwX29rCiAgICAgICAgaWYgZGlzdC5oYXNfbWV0YWRhdGEoJ25vdC16aXAtc2FmZScpOgogICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIGlmIG5vdCBkaXN0Lmhhc19tZXRhZGF0YSgnemlwLXNhZmUnKToKICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgbWF5YmVfbW92ZShzZWxmLCBzcGVjLCBkaXN0X2ZpbGVuYW1lLCBzZXR1cF9iYXNlKToKICAgICAgICBkc3QgPSBvcy5wYXRoLmpvaW4oc2VsZi5idWlsZF9kaXJlY3RvcnksIHNwZWMua2V5KQogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGRzdCk6CiAgICAgICAgICAgIG1zZyA9ICgKICAgICAgICAgICAgICAgICIlciBhbHJlYWR5IGV4aXN0cyBpbiAlczsgYnVpbGQgZGlyZWN0b3J5ICVzIHdpbGwgbm90IGJlIGtlcHQiCiAgICAgICAgICAgICkKICAgICAgICAgICAgbG9nLndhcm4obXNnLCBzcGVjLmtleSwgc2VsZi5idWlsZF9kaXJlY3RvcnksIHNldHVwX2Jhc2UpCiAgICAgICAgICAgIHJldHVybiBzZXR1cF9iYXNlCiAgICAgICAgaWYgb3MucGF0aC5pc2RpcihkaXN0X2ZpbGVuYW1lKToKICAgICAgICAgICAgc2V0dXBfYmFzZSA9IGRpc3RfZmlsZW5hbWUKICAgICAgICBlbHNlOgogICAgICAgICAgICBpZiBvcy5wYXRoLmRpcm5hbWUoZGlzdF9maWxlbmFtZSkgPT0gc2V0dXBfYmFzZToKICAgICAgICAgICAgICAgIG9zLnVubGluayhkaXN0X2ZpbGVuYW1lKSAgIyBnZXQgaXQgb3V0IG9mIHRoZSB0bXAgZGlyCiAgICAgICAgICAgIGNvbnRlbnRzID0gb3MubGlzdGRpcihzZXR1cF9iYXNlKQogICAgICAgICAgICBpZiBsZW4oY29udGVudHMpID09IDE6CiAgICAgICAgICAgICAgICBkaXN0X2ZpbGVuYW1lID0gb3MucGF0aC5qb2luKHNldHVwX2Jhc2UsIGNvbnRlbnRzWzBdKQogICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2RpcihkaXN0X2ZpbGVuYW1lKToKICAgICAgICAgICAgICAgICAgICAjIGlmIHRoZSBvbmx5IHRoaW5nIHRoZXJlIGlzIGEgZGlyZWN0b3J5LCBtb3ZlIGl0IGluc3RlYWQKICAgICAgICAgICAgICAgICAgICBzZXR1cF9iYXNlID0gZGlzdF9maWxlbmFtZQogICAgICAgIGVuc3VyZV9kaXJlY3RvcnkoZHN0KQogICAgICAgIHNodXRpbC5tb3ZlKHNldHVwX2Jhc2UsIGRzdCkKICAgICAgICByZXR1cm4gZHN0CgogICAgZGVmIGluc3RhbGxfd3JhcHBlcl9zY3JpcHRzKHNlbGYsIGRpc3QpOgogICAgICAgIGlmIHNlbGYuZXhjbHVkZV9zY3JpcHRzOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBmb3IgYXJncyBpbiBTY3JpcHRXcml0ZXIuYmVzdCgpLmdldF9hcmdzKGRpc3QpOgogICAgICAgICAgICBzZWxmLndyaXRlX3NjcmlwdCgqYXJncykKCiAgICBkZWYgaW5zdGFsbF9zY3JpcHQoc2VsZiwgZGlzdCwgc2NyaXB0X25hbWUsIHNjcmlwdF90ZXh0LCBkZXZfcGF0aD1Ob25lKToKICAgICAgICAiIiJHZW5lcmF0ZSBhIGxlZ2FjeSBzY3JpcHQgd3JhcHBlciBhbmQgaW5zdGFsbCBpdCIiIgogICAgICAgIHNwZWMgPSBzdHIoZGlzdC5hc19yZXF1aXJlbWVudCgpKQogICAgICAgIGlzX3NjcmlwdCA9IGlzX3B5dGhvbl9zY3JpcHQoc2NyaXB0X3RleHQsIHNjcmlwdF9uYW1lKQoKICAgICAgICBpZiBpc19zY3JpcHQ6CiAgICAgICAgICAgIGJvZHkgPSBzZWxmLl9sb2FkX3RlbXBsYXRlKGRldl9wYXRoKSAlIGxvY2FscygpCiAgICAgICAgICAgIHNjcmlwdF90ZXh0ID0gU2NyaXB0V3JpdGVyLmdldF9oZWFkZXIoc2NyaXB0X3RleHQpICsgYm9keQogICAgICAgIHNlbGYud3JpdGVfc2NyaXB0KHNjcmlwdF9uYW1lLCBfdG9fYnl0ZXMoc2NyaXB0X3RleHQpLCAnYicpCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9sb2FkX3RlbXBsYXRlKGRldl9wYXRoKToKICAgICAgICAiIiIKICAgICAgICBUaGVyZSBhcmUgYSBjb3VwbGUgb2YgdGVtcGxhdGUgc2NyaXB0cyBpbiB0aGUgcGFja2FnZS4gVGhpcwogICAgICAgIGZ1bmN0aW9uIGxvYWRzIG9uZSBvZiB0aGVtIGFuZCBwcmVwYXJlcyBpdCBmb3IgdXNlLgogICAgICAgICIiIgogICAgICAgICMgU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3NldHVwdG9vbHMvaXNzdWVzLzEzNCBmb3IgaW5mbwogICAgICAgICMgb24gc2NyaXB0IGZpbGUgbmFtaW5nIGFuZCBkb3duc3RyZWFtIGlzc3VlcyB3aXRoIFNWUjQKICAgICAgICBuYW1lID0gJ3NjcmlwdC50bXBsJwogICAgICAgIGlmIGRldl9wYXRoOgogICAgICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKCcudG1wbCcsICcgKGRldikudG1wbCcpCgogICAgICAgIHJhd19ieXRlcyA9IHJlc291cmNlX3N0cmluZygnc2V0dXB0b29scycsIG5hbWUpCiAgICAgICAgcmV0dXJuIHJhd19ieXRlcy5kZWNvZGUoJ3V0Zi04JykKCiAgICBkZWYgd3JpdGVfc2NyaXB0KHNlbGYsIHNjcmlwdF9uYW1lLCBjb250ZW50cywgbW9kZT0idCIsIGJsb2NrZXJzPSgpKToKICAgICAgICAiIiJXcml0ZSBhbiBleGVjdXRhYmxlIGZpbGUgdG8gdGhlIHNjcmlwdHMgZGlyZWN0b3J5IiIiCiAgICAgICAgc2VsZi5kZWxldGVfYmxvY2tlcnMoICAjIGNsZWFuIHVwIG9sZCAucHkvLnB5dyB3L28gYSBzY3JpcHQKICAgICAgICAgICAgW29zLnBhdGguam9pbihzZWxmLnNjcmlwdF9kaXIsIHgpIGZvciB4IGluIGJsb2NrZXJzXQogICAgICAgICkKICAgICAgICBsb2cuaW5mbygiSW5zdGFsbGluZyAlcyBzY3JpcHQgdG8gJXMiLCBzY3JpcHRfbmFtZSwgc2VsZi5zY3JpcHRfZGlyKQogICAgICAgIHRhcmdldCA9IG9zLnBhdGguam9pbihzZWxmLnNjcmlwdF9kaXIsIHNjcmlwdF9uYW1lKQogICAgICAgIHNlbGYuYWRkX291dHB1dCh0YXJnZXQpCgogICAgICAgIGlmIHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIG1hc2sgPSBjdXJyZW50X3VtYXNrKCkKICAgICAgICBlbnN1cmVfZGlyZWN0b3J5KHRhcmdldCkKICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyh0YXJnZXQpOgogICAgICAgICAgICBvcy51bmxpbmsodGFyZ2V0KQogICAgICAgIHdpdGggb3Blbih0YXJnZXQsICJ3IiArIG1vZGUpIGFzIGY6CiAgICAgICAgICAgIGYud3JpdGUoY29udGVudHMpCiAgICAgICAgY2htb2QodGFyZ2V0LCAwbzc3NyAtIG1hc2spCgogICAgZGVmIGluc3RhbGxfZWdncyhzZWxmLCBzcGVjLCBkaXN0X2ZpbGVuYW1lLCB0bXBkaXIpOgogICAgICAgICMgLmVnZyBkaXJzIG9yIGZpbGVzIGFyZSBhbHJlYWR5IGJ1aWx0LCBzbyBqdXN0IHJldHVybiB0aGVtCiAgICAgICAgaWYgZGlzdF9maWxlbmFtZS5sb3dlcigpLmVuZHN3aXRoKCcuZWdnJyk6CiAgICAgICAgICAgIHJldHVybiBbc2VsZi5pbnN0YWxsX2VnZyhkaXN0X2ZpbGVuYW1lLCB0bXBkaXIpXQogICAgICAgIGVsaWYgZGlzdF9maWxlbmFtZS5sb3dlcigpLmVuZHN3aXRoKCcuZXhlJyk6CiAgICAgICAgICAgIHJldHVybiBbc2VsZi5pbnN0YWxsX2V4ZShkaXN0X2ZpbGVuYW1lLCB0bXBkaXIpXQogICAgICAgIGVsaWYgZGlzdF9maWxlbmFtZS5sb3dlcigpLmVuZHN3aXRoKCcud2hsJyk6CiAgICAgICAgICAgIHJldHVybiBbc2VsZi5pbnN0YWxsX3doZWVsKGRpc3RfZmlsZW5hbWUsIHRtcGRpcildCgogICAgICAgICMgQW55dGhpbmcgZWxzZSwgdHJ5IHRvIGV4dHJhY3QgYW5kIGJ1aWxkCiAgICAgICAgc2V0dXBfYmFzZSA9IHRtcGRpcgogICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKGRpc3RfZmlsZW5hbWUpIGFuZCBub3QgZGlzdF9maWxlbmFtZS5lbmRzd2l0aCgnLnB5Jyk6CiAgICAgICAgICAgIHVucGFja19hcmNoaXZlKGRpc3RfZmlsZW5hbWUsIHRtcGRpciwgc2VsZi51bnBhY2tfcHJvZ3Jlc3MpCiAgICAgICAgZWxpZiBvcy5wYXRoLmlzZGlyKGRpc3RfZmlsZW5hbWUpOgogICAgICAgICAgICBzZXR1cF9iYXNlID0gb3MucGF0aC5hYnNwYXRoKGRpc3RfZmlsZW5hbWUpCgogICAgICAgIGlmIChzZXR1cF9iYXNlLnN0YXJ0c3dpdGgodG1wZGlyKSAgIyBzb21ldGhpbmcgd2UgZG93bmxvYWRlZAogICAgICAgICAgICAgICAgYW5kIHNlbGYuYnVpbGRfZGlyZWN0b3J5IGFuZCBzcGVjIGlzIG5vdCBOb25lKToKICAgICAgICAgICAgc2V0dXBfYmFzZSA9IHNlbGYubWF5YmVfbW92ZShzcGVjLCBkaXN0X2ZpbGVuYW1lLCBzZXR1cF9iYXNlKQoKICAgICAgICAjIEZpbmQgdGhlIHNldHVwLnB5IGZpbGUKICAgICAgICBzZXR1cF9zY3JpcHQgPSBvcy5wYXRoLmpvaW4oc2V0dXBfYmFzZSwgJ3NldHVwLnB5JykKCiAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHNldHVwX3NjcmlwdCk6CiAgICAgICAgICAgIHNldHVwcyA9IGdsb2Iob3MucGF0aC5qb2luKHNldHVwX2Jhc2UsICcqJywgJ3NldHVwLnB5JykpCiAgICAgICAgICAgIGlmIG5vdCBzZXR1cHM6CiAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcigKICAgICAgICAgICAgICAgICAgICAiQ291bGRuJ3QgZmluZCBhIHNldHVwIHNjcmlwdCBpbiAlcyIgJQogICAgICAgICAgICAgICAgICAgIG9zLnBhdGguYWJzcGF0aChkaXN0X2ZpbGVuYW1lKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICBpZiBsZW4oc2V0dXBzKSA+IDE6CiAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcigKICAgICAgICAgICAgICAgICAgICAiTXVsdGlwbGUgc2V0dXAgc2NyaXB0cyBpbiAlcyIgJQogICAgICAgICAgICAgICAgICAgIG9zLnBhdGguYWJzcGF0aChkaXN0X2ZpbGVuYW1lKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICBzZXR1cF9zY3JpcHQgPSBzZXR1cHNbMF0KCiAgICAgICAgIyBOb3cgcnVuIGl0LCBhbmQgcmV0dXJuIHRoZSByZXN1bHQKICAgICAgICBpZiBzZWxmLmVkaXRhYmxlOgogICAgICAgICAgICBsb2cuaW5mbyhzZWxmLnJlcG9ydF9lZGl0YWJsZShzcGVjLCBzZXR1cF9zY3JpcHQpKQogICAgICAgICAgICByZXR1cm4gW10KICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gc2VsZi5idWlsZF9hbmRfaW5zdGFsbChzZXR1cF9zY3JpcHQsIHNldHVwX2Jhc2UpCgogICAgZGVmIGVnZ19kaXN0cmlidXRpb24oc2VsZiwgZWdnX3BhdGgpOgogICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZWdnX3BhdGgpOgogICAgICAgICAgICBtZXRhZGF0YSA9IFBhdGhNZXRhZGF0YShlZ2dfcGF0aCwgb3MucGF0aC5qb2luKGVnZ19wYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdFR0ctSU5GTycpKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG1ldGFkYXRhID0gRWdnTWV0YWRhdGEoemlwaW1wb3J0LnppcGltcG9ydGVyKGVnZ19wYXRoKSkKICAgICAgICByZXR1cm4gRGlzdHJpYnV0aW9uLmZyb21fZmlsZW5hbWUoZWdnX3BhdGgsIG1ldGFkYXRhPW1ldGFkYXRhKQoKICAgIGRlZiBpbnN0YWxsX2VnZyhzZWxmLCBlZ2dfcGF0aCwgdG1wZGlyKToKICAgICAgICBkZXN0aW5hdGlvbiA9IG9zLnBhdGguam9pbigKICAgICAgICAgICAgc2VsZi5pbnN0YWxsX2RpciwKICAgICAgICAgICAgb3MucGF0aC5iYXNlbmFtZShlZ2dfcGF0aCksCiAgICAgICAgKQogICAgICAgIGRlc3RpbmF0aW9uID0gb3MucGF0aC5hYnNwYXRoKGRlc3RpbmF0aW9uKQogICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgIGVuc3VyZV9kaXJlY3RvcnkoZGVzdGluYXRpb24pCgogICAgICAgIGRpc3QgPSBzZWxmLmVnZ19kaXN0cmlidXRpb24oZWdnX3BhdGgpCiAgICAgICAgaWYgbm90IHNhbWVmaWxlKGVnZ19wYXRoLCBkZXN0aW5hdGlvbik6CiAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZGVzdGluYXRpb24pIGFuZCBub3Qgb3MucGF0aC5pc2xpbmsoZGVzdGluYXRpb24pOgogICAgICAgICAgICAgICAgZGlyX3V0aWwucmVtb3ZlX3RyZWUoZGVzdGluYXRpb24sIGRyeV9ydW49c2VsZi5kcnlfcnVuKQogICAgICAgICAgICBlbGlmIG9zLnBhdGguZXhpc3RzKGRlc3RpbmF0aW9uKToKICAgICAgICAgICAgICAgIHNlbGYuZXhlY3V0ZSgKICAgICAgICAgICAgICAgICAgICBvcy51bmxpbmssCiAgICAgICAgICAgICAgICAgICAgKGRlc3RpbmF0aW9uLCksCiAgICAgICAgICAgICAgICAgICAgIlJlbW92aW5nICIgKyBkZXN0aW5hdGlvbiwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgbmV3X2Rpc3RfaXNfemlwcGVkID0gRmFsc2UKICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZWdnX3BhdGgpOgogICAgICAgICAgICAgICAgICAgIGlmIGVnZ19wYXRoLnN0YXJ0c3dpdGgodG1wZGlyKToKICAgICAgICAgICAgICAgICAgICAgICAgZiwgbSA9IHNodXRpbC5tb3ZlLCAiTW92aW5nIgogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGYsIG0gPSBzaHV0aWwuY29weXRyZWUsICJDb3B5aW5nIgogICAgICAgICAgICAgICAgZWxpZiBzZWxmLnNob3VsZF91bnppcChkaXN0KToKICAgICAgICAgICAgICAgICAgICBzZWxmLm1rcGF0aChkZXN0aW5hdGlvbikKICAgICAgICAgICAgICAgICAgICBmLCBtID0gc2VsZi51bnBhY2tfYW5kX2NvbXBpbGUsICJFeHRyYWN0aW5nIgogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBuZXdfZGlzdF9pc196aXBwZWQgPSBUcnVlCiAgICAgICAgICAgICAgICAgICAgaWYgZWdnX3BhdGguc3RhcnRzd2l0aCh0bXBkaXIpOgogICAgICAgICAgICAgICAgICAgICAgICBmLCBtID0gc2h1dGlsLm1vdmUsICJNb3ZpbmciCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgZiwgbSA9IHNodXRpbC5jb3B5MiwgIkNvcHlpbmciCiAgICAgICAgICAgICAgICBzZWxmLmV4ZWN1dGUoCiAgICAgICAgICAgICAgICAgICAgZiwKICAgICAgICAgICAgICAgICAgICAoZWdnX3BhdGgsIGRlc3RpbmF0aW9uKSwKICAgICAgICAgICAgICAgICAgICAobSArICIgJXMgdG8gJXMiKSAlICgKICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5iYXNlbmFtZShlZ2dfcGF0aCksCiAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguZGlybmFtZShkZXN0aW5hdGlvbikKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgdXBkYXRlX2Rpc3RfY2FjaGVzKAogICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uLAogICAgICAgICAgICAgICAgICAgIGZpeF96aXBpbXBvcnRlcl9jYWNoZXM9bmV3X2Rpc3RfaXNfemlwcGVkLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgdXBkYXRlX2Rpc3RfY2FjaGVzKGRlc3RpbmF0aW9uLCBmaXhfemlwaW1wb3J0ZXJfY2FjaGVzPUZhbHNlKQogICAgICAgICAgICAgICAgcmFpc2UKCiAgICAgICAgc2VsZi5hZGRfb3V0cHV0KGRlc3RpbmF0aW9uKQogICAgICAgIHJldHVybiBzZWxmLmVnZ19kaXN0cmlidXRpb24oZGVzdGluYXRpb24pCgogICAgZGVmIGluc3RhbGxfZXhlKHNlbGYsIGRpc3RfZmlsZW5hbWUsIHRtcGRpcik6CiAgICAgICAgIyBTZWUgaWYgaXQncyB2YWxpZCwgZ2V0IGRhdGEKICAgICAgICBjZmcgPSBleHRyYWN0X3dpbmluc3RfY2ZnKGRpc3RfZmlsZW5hbWUpCiAgICAgICAgaWYgY2ZnIGlzIE5vbmU6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKAogICAgICAgICAgICAgICAgIiVzIGlzIG5vdCBhIHZhbGlkIGRpc3R1dGlscyBXaW5kb3dzIC5leGUiICUgZGlzdF9maWxlbmFtZQogICAgICAgICAgICApCiAgICAgICAgIyBDcmVhdGUgYSBkdW1teSBkaXN0cmlidXRpb24gb2JqZWN0IHVudGlsIHdlIGJ1aWxkIHRoZSByZWFsIGRpc3RybwogICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24oCiAgICAgICAgICAgIE5vbmUsCiAgICAgICAgICAgIHByb2plY3RfbmFtZT1jZmcuZ2V0KCdtZXRhZGF0YScsICduYW1lJyksCiAgICAgICAgICAgIHZlcnNpb249Y2ZnLmdldCgnbWV0YWRhdGEnLCAndmVyc2lvbicpLCBwbGF0Zm9ybT1nZXRfcGxhdGZvcm0oKSwKICAgICAgICApCgogICAgICAgICMgQ29udmVydCB0aGUgLmV4ZSB0byBhbiB1bnBhY2tlZCBlZ2cKICAgICAgICBlZ2dfcGF0aCA9IG9zLnBhdGguam9pbih0bXBkaXIsIGRpc3QuZWdnX25hbWUoKSArICcuZWdnJykKICAgICAgICBkaXN0LmxvY2F0aW9uID0gZWdnX3BhdGgKICAgICAgICBlZ2dfdG1wID0gZWdnX3BhdGggKyAnLnRtcCcKICAgICAgICBfZWdnX2luZm8gPSBvcy5wYXRoLmpvaW4oZWdnX3RtcCwgJ0VHRy1JTkZPJykKICAgICAgICBwa2dfaW5mID0gb3MucGF0aC5qb2luKF9lZ2dfaW5mbywgJ1BLRy1JTkZPJykKICAgICAgICBlbnN1cmVfZGlyZWN0b3J5KHBrZ19pbmYpICAjIG1ha2Ugc3VyZSBFR0ctSU5GTyBkaXIgZXhpc3RzCiAgICAgICAgZGlzdC5fcHJvdmlkZXIgPSBQYXRoTWV0YWRhdGEoZWdnX3RtcCwgX2VnZ19pbmZvKSAgIyBYWFgKICAgICAgICBzZWxmLmV4ZV90b19lZ2coZGlzdF9maWxlbmFtZSwgZWdnX3RtcCkKCiAgICAgICAgIyBXcml0ZSBFR0ctSU5GTy9QS0ctSU5GTwogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhwa2dfaW5mKToKICAgICAgICAgICAgZiA9IG9wZW4ocGtnX2luZiwgJ3cnKQogICAgICAgICAgICBmLndyaXRlKCdNZXRhZGF0YS1WZXJzaW9uOiAxLjBcbicpCiAgICAgICAgICAgIGZvciBrLCB2IGluIGNmZy5pdGVtcygnbWV0YWRhdGEnKToKICAgICAgICAgICAgICAgIGlmIGsgIT0gJ3RhcmdldF92ZXJzaW9uJzoKICAgICAgICAgICAgICAgICAgICBmLndyaXRlKCclczogJXNcbicgJSAoay5yZXBsYWNlKCdfJywgJy0nKS50aXRsZSgpLCB2KSkKICAgICAgICAgICAgZi5jbG9zZSgpCiAgICAgICAgc2NyaXB0X2RpciA9IG9zLnBhdGguam9pbihfZWdnX2luZm8sICdzY3JpcHRzJykKICAgICAgICAjIGRlbGV0ZSBlbnRyeS1wb2ludCBzY3JpcHRzIHRvIGF2b2lkIGR1cGluZwogICAgICAgIHNlbGYuZGVsZXRlX2Jsb2NrZXJzKFsKICAgICAgICAgICAgb3MucGF0aC5qb2luKHNjcmlwdF9kaXIsIGFyZ3NbMF0pCiAgICAgICAgICAgIGZvciBhcmdzIGluIFNjcmlwdFdyaXRlci5nZXRfYXJncyhkaXN0KQogICAgICAgIF0pCiAgICAgICAgIyBCdWlsZCAuZWdnIGZpbGUgZnJvbSB0bXBkaXIKICAgICAgICBiZGlzdF9lZ2cubWFrZV96aXBmaWxlKAogICAgICAgICAgICBlZ2dfcGF0aCwgZWdnX3RtcCwgdmVyYm9zZT1zZWxmLnZlcmJvc2UsIGRyeV9ydW49c2VsZi5kcnlfcnVuLAogICAgICAgICkKICAgICAgICAjIGluc3RhbGwgdGhlIC5lZ2cKICAgICAgICByZXR1cm4gc2VsZi5pbnN0YWxsX2VnZyhlZ2dfcGF0aCwgdG1wZGlyKQoKICAgIGRlZiBleGVfdG9fZWdnKHNlbGYsIGRpc3RfZmlsZW5hbWUsIGVnZ190bXApOgogICAgICAgICIiIkV4dHJhY3QgYSBiZGlzdF93aW5pbnN0IHRvIHRoZSBkaXJlY3RvcmllcyBhbiBlZ2cgd291bGQgdXNlIiIiCiAgICAgICAgIyBDaGVjayBmb3IgLnB0aCBmaWxlIGFuZCBzZXQgdXAgcHJlZml4IHRyYW5zbGF0aW9ucwogICAgICAgIHByZWZpeGVzID0gZ2V0X2V4ZV9wcmVmaXhlcyhkaXN0X2ZpbGVuYW1lKQogICAgICAgIHRvX2NvbXBpbGUgPSBbXQogICAgICAgIG5hdGl2ZV9saWJzID0gW10KICAgICAgICB0b3BfbGV2ZWwgPSB7fQoKICAgICAgICBkZWYgcHJvY2VzcyhzcmMsIGRzdCk6CiAgICAgICAgICAgIHMgPSBzcmMubG93ZXIoKQogICAgICAgICAgICBmb3Igb2xkLCBuZXcgaW4gcHJlZml4ZXM6CiAgICAgICAgICAgICAgICBpZiBzLnN0YXJ0c3dpdGgob2xkKToKICAgICAgICAgICAgICAgICAgICBzcmMgPSBuZXcgKyBzcmNbbGVuKG9sZCk6XQogICAgICAgICAgICAgICAgICAgIHBhcnRzID0gc3JjLnNwbGl0KCcvJykKICAgICAgICAgICAgICAgICAgICBkc3QgPSBvcy5wYXRoLmpvaW4oZWdnX3RtcCwgKnBhcnRzKQogICAgICAgICAgICAgICAgICAgIGRsID0gZHN0Lmxvd2VyKCkKICAgICAgICAgICAgICAgICAgICBpZiBkbC5lbmRzd2l0aCgnLnB5ZCcpIG9yIGRsLmVuZHN3aXRoKCcuZGxsJyk6CiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRzWy0xXSA9IGJkaXN0X2VnZy5zdHJpcF9tb2R1bGUocGFydHNbLTFdKQogICAgICAgICAgICAgICAgICAgICAgICB0b3BfbGV2ZWxbb3MucGF0aC5zcGxpdGV4dChwYXJ0c1swXSlbMF1dID0gMQogICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVfbGlicy5hcHBlbmQoc3JjKQogICAgICAgICAgICAgICAgICAgIGVsaWYgZGwuZW5kc3dpdGgoJy5weScpIGFuZCBvbGQgIT0gJ1NDUklQVFMvJzoKICAgICAgICAgICAgICAgICAgICAgICAgdG9wX2xldmVsW29zLnBhdGguc3BsaXRleHQocGFydHNbMF0pWzBdXSA9IDEKICAgICAgICAgICAgICAgICAgICAgICAgdG9fY29tcGlsZS5hcHBlbmQoZHN0KQogICAgICAgICAgICAgICAgICAgIHJldHVybiBkc3QKICAgICAgICAgICAgaWYgbm90IHNyYy5lbmRzd2l0aCgnLnB0aCcpOgogICAgICAgICAgICAgICAgbG9nLndhcm4oIldBUk5JTkc6IGNhbid0IHByb2Nlc3MgJXMiLCBzcmMpCiAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgICAgICMgZXh0cmFjdCwgdHJhY2tpbmcgLnB5ZC8uZGxsLT5uYXRpdmVfbGlicyBhbmQgLnB5IC0+IHRvX2NvbXBpbGUKICAgICAgICB1bnBhY2tfYXJjaGl2ZShkaXN0X2ZpbGVuYW1lLCBlZ2dfdG1wLCBwcm9jZXNzKQogICAgICAgIHN0dWJzID0gW10KICAgICAgICBmb3IgcmVzIGluIG5hdGl2ZV9saWJzOgogICAgICAgICAgICBpZiByZXMubG93ZXIoKS5lbmRzd2l0aCgnLnB5ZCcpOiAgIyBjcmVhdGUgc3R1YnMgZm9yIC5weWQncwogICAgICAgICAgICAgICAgcGFydHMgPSByZXMuc3BsaXQoJy8nKQogICAgICAgICAgICAgICAgcmVzb3VyY2UgPSBwYXJ0c1stMV0KICAgICAgICAgICAgICAgIHBhcnRzWy0xXSA9IGJkaXN0X2VnZy5zdHJpcF9tb2R1bGUocGFydHNbLTFdKSArICcucHknCiAgICAgICAgICAgICAgICBweWZpbGUgPSBvcy5wYXRoLmpvaW4oZWdnX3RtcCwgKnBhcnRzKQogICAgICAgICAgICAgICAgdG9fY29tcGlsZS5hcHBlbmQocHlmaWxlKQogICAgICAgICAgICAgICAgc3R1YnMuYXBwZW5kKHB5ZmlsZSkKICAgICAgICAgICAgICAgIGJkaXN0X2VnZy53cml0ZV9zdHViKHJlc291cmNlLCBweWZpbGUpCiAgICAgICAgc2VsZi5ieXRlX2NvbXBpbGUodG9fY29tcGlsZSkgICMgY29tcGlsZSAucHkncwogICAgICAgIGJkaXN0X2VnZy53cml0ZV9zYWZldHlfZmxhZygKICAgICAgICAgICAgb3MucGF0aC5qb2luKGVnZ190bXAsICdFR0ctSU5GTycpLAogICAgICAgICAgICBiZGlzdF9lZ2cuYW5hbHl6ZV9lZ2coZWdnX3RtcCwgc3R1YnMpKSAgIyB3cml0ZSB6aXAtc2FmZXR5IGZsYWcKCiAgICAgICAgZm9yIG5hbWUgaW4gJ3RvcF9sZXZlbCcsICduYXRpdmVfbGlicyc6CiAgICAgICAgICAgIGlmIGxvY2FscygpW25hbWVdOgogICAgICAgICAgICAgICAgdHh0ID0gb3MucGF0aC5qb2luKGVnZ190bXAsICdFR0ctSU5GTycsIG5hbWUgKyAnLnR4dCcpCiAgICAgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHModHh0KToKICAgICAgICAgICAgICAgICAgICBmID0gb3Blbih0eHQsICd3JykKICAgICAgICAgICAgICAgICAgICBmLndyaXRlKCdcbicuam9pbihsb2NhbHMoKVtuYW1lXSkgKyAnXG4nKQogICAgICAgICAgICAgICAgICAgIGYuY2xvc2UoKQoKICAgIGRlZiBpbnN0YWxsX3doZWVsKHNlbGYsIHdoZWVsX3BhdGgsIHRtcGRpcik6CiAgICAgICAgd2hlZWwgPSBXaGVlbCh3aGVlbF9wYXRoKQogICAgICAgIGFzc2VydCB3aGVlbC5pc19jb21wYXRpYmxlKCkKICAgICAgICBkZXN0aW5hdGlvbiA9IG9zLnBhdGguam9pbihzZWxmLmluc3RhbGxfZGlyLCB3aGVlbC5lZ2dfbmFtZSgpKQogICAgICAgIGRlc3RpbmF0aW9uID0gb3MucGF0aC5hYnNwYXRoKGRlc3RpbmF0aW9uKQogICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgIGVuc3VyZV9kaXJlY3RvcnkoZGVzdGluYXRpb24pCiAgICAgICAgaWYgb3MucGF0aC5pc2RpcihkZXN0aW5hdGlvbikgYW5kIG5vdCBvcy5wYXRoLmlzbGluayhkZXN0aW5hdGlvbik6CiAgICAgICAgICAgIGRpcl91dGlsLnJlbW92ZV90cmVlKGRlc3RpbmF0aW9uLCBkcnlfcnVuPXNlbGYuZHJ5X3J1bikKICAgICAgICBlbGlmIG9zLnBhdGguZXhpc3RzKGRlc3RpbmF0aW9uKToKICAgICAgICAgICAgc2VsZi5leGVjdXRlKAogICAgICAgICAgICAgICAgb3MudW5saW5rLAogICAgICAgICAgICAgICAgKGRlc3RpbmF0aW9uLCksCiAgICAgICAgICAgICAgICAiUmVtb3ZpbmcgIiArIGRlc3RpbmF0aW9uLAogICAgICAgICAgICApCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLmV4ZWN1dGUoCiAgICAgICAgICAgICAgICB3aGVlbC5pbnN0YWxsX2FzX2VnZywKICAgICAgICAgICAgICAgIChkZXN0aW5hdGlvbiwpLAogICAgICAgICAgICAgICAgKCJJbnN0YWxsaW5nICVzIHRvICVzIikgJSAoCiAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5iYXNlbmFtZSh3aGVlbF9wYXRoKSwKICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmRpcm5hbWUoZGVzdGluYXRpb24pCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgdXBkYXRlX2Rpc3RfY2FjaGVzKGRlc3RpbmF0aW9uLCBmaXhfemlwaW1wb3J0ZXJfY2FjaGVzPUZhbHNlKQogICAgICAgIHNlbGYuYWRkX291dHB1dChkZXN0aW5hdGlvbikKICAgICAgICByZXR1cm4gc2VsZi5lZ2dfZGlzdHJpYnV0aW9uKGRlc3RpbmF0aW9uKQoKICAgIF9fbXZfd2FybmluZyA9IHRleHR3cmFwLmRlZGVudCgiIiIKICAgICAgICBCZWNhdXNlIHRoaXMgZGlzdHJpYnV0aW9uIHdhcyBpbnN0YWxsZWQgLS1tdWx0aS12ZXJzaW9uLCBiZWZvcmUgeW91IGNhbgogICAgICAgIGltcG9ydCBtb2R1bGVzIGZyb20gdGhpcyBwYWNrYWdlIGluIGFuIGFwcGxpY2F0aW9uLCB5b3Ugd2lsbCBuZWVkIHRvCiAgICAgICAgJ2ltcG9ydCBwa2dfcmVzb3VyY2VzJyBhbmQgdGhlbiB1c2UgYSAncmVxdWlyZSgpJyBjYWxsIHNpbWlsYXIgdG8gb25lIG9mCiAgICAgICAgdGhlc2UgZXhhbXBsZXMsIGluIG9yZGVyIHRvIHNlbGVjdCB0aGUgZGVzaXJlZCB2ZXJzaW9uOgoKICAgICAgICAgICAgcGtnX3Jlc291cmNlcy5yZXF1aXJlKCIlKG5hbWUpcyIpICAjIGxhdGVzdCBpbnN0YWxsZWQgdmVyc2lvbgogICAgICAgICAgICBwa2dfcmVzb3VyY2VzLnJlcXVpcmUoIiUobmFtZSlzPT0lKHZlcnNpb24pcyIpICAjIHRoaXMgZXhhY3QgdmVyc2lvbgogICAgICAgICAgICBwa2dfcmVzb3VyY2VzLnJlcXVpcmUoIiUobmFtZSlzPj0lKHZlcnNpb24pcyIpICAjIHRoaXMgdmVyc2lvbiBvciBoaWdoZXIKICAgICAgICAiIiIpLmxzdHJpcCgpCgogICAgX19pZF93YXJuaW5nID0gdGV4dHdyYXAuZGVkZW50KCIiIgogICAgICAgIE5vdGUgYWxzbyB0aGF0IHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IG11c3QgYmUgb24gc3lzLnBhdGggYXQgcnVudGltZSBmb3IKICAgICAgICB0aGlzIHRvIHdvcmsuICAoZS5nLiBieSBiZWluZyB0aGUgYXBwbGljYXRpb24ncyBzY3JpcHQgZGlyZWN0b3J5LCBieSBiZWluZyBvbgogICAgICAgIFBZVEhPTlBBVEgsIG9yIGJ5IGJlaW5nIGFkZGVkIHRvIHN5cy5wYXRoIGJ5IHlvdXIgY29kZS4pCiAgICAgICAgIiIiKQoKICAgIGRlZiBpbnN0YWxsYXRpb25fcmVwb3J0KHNlbGYsIHJlcSwgZGlzdCwgd2hhdD0iSW5zdGFsbGVkIik6CiAgICAgICAgIiIiSGVscGZ1bCBpbnN0YWxsYXRpb24gbWVzc2FnZSBmb3IgZGlzcGxheSB0byBwYWNrYWdlIHVzZXJzIiIiCiAgICAgICAgbXNnID0gIlxuJSh3aGF0KXMgJShlZ2dsb2MpcyUoZXh0cmFzKXMiCiAgICAgICAgaWYgc2VsZi5tdWx0aV92ZXJzaW9uIGFuZCBub3Qgc2VsZi5ub19yZXBvcnQ6CiAgICAgICAgICAgIG1zZyArPSAnXG4nICsgc2VsZi5fX212X3dhcm5pbmcKICAgICAgICAgICAgaWYgc2VsZi5pbnN0YWxsX2RpciBub3QgaW4gbWFwKG5vcm1hbGl6ZV9wYXRoLCBzeXMucGF0aCk6CiAgICAgICAgICAgICAgICBtc2cgKz0gJ1xuJyArIHNlbGYuX19pZF93YXJuaW5nCgogICAgICAgIGVnZ2xvYyA9IGRpc3QubG9jYXRpb24KICAgICAgICBuYW1lID0gZGlzdC5wcm9qZWN0X25hbWUKICAgICAgICB2ZXJzaW9uID0gZGlzdC52ZXJzaW9uCiAgICAgICAgZXh0cmFzID0gJycgICMgVE9ETzogc2VsZi5yZXBvcnRfZXh0cmFzKHJlcSwgZGlzdCkKICAgICAgICByZXR1cm4gbXNnICUgbG9jYWxzKCkKCiAgICBfX2VkaXRhYmxlX21zZyA9IHRleHR3cmFwLmRlZGVudCgiIiIKICAgICAgICBFeHRyYWN0ZWQgZWRpdGFibGUgdmVyc2lvbiBvZiAlKHNwZWMpcyB0byAlKGRpcm5hbWUpcwoKICAgICAgICBJZiBpdCB1c2VzIHNldHVwdG9vbHMgaW4gaXRzIHNldHVwIHNjcmlwdCwgeW91IGNhbiBhY3RpdmF0ZSBpdCBpbgogICAgICAgICJkZXZlbG9wbWVudCIgbW9kZSBieSBnb2luZyB0byB0aGF0IGRpcmVjdG9yeSBhbmQgcnVubmluZzo6CgogICAgICAgICAgICAlKHB5dGhvbilzIHNldHVwLnB5IGRldmVsb3AKCiAgICAgICAgU2VlIHRoZSBzZXR1cHRvb2xzIGRvY3VtZW50YXRpb24gZm9yIHRoZSAiZGV2ZWxvcCIgY29tbWFuZCBmb3IgbW9yZSBpbmZvLgogICAgICAgICIiIikubHN0cmlwKCkKCiAgICBkZWYgcmVwb3J0X2VkaXRhYmxlKHNlbGYsIHNwZWMsIHNldHVwX3NjcmlwdCk6CiAgICAgICAgZGlybmFtZSA9IG9zLnBhdGguZGlybmFtZShzZXR1cF9zY3JpcHQpCiAgICAgICAgcHl0aG9uID0gc3lzLmV4ZWN1dGFibGUKICAgICAgICByZXR1cm4gJ1xuJyArIHNlbGYuX19lZGl0YWJsZV9tc2cgJSBsb2NhbHMoKQoKICAgIGRlZiBydW5fc2V0dXAoc2VsZiwgc2V0dXBfc2NyaXB0LCBzZXR1cF9iYXNlLCBhcmdzKToKICAgICAgICBzeXMubW9kdWxlcy5zZXRkZWZhdWx0KCdkaXN0dXRpbHMuY29tbWFuZC5iZGlzdF9lZ2cnLCBiZGlzdF9lZ2cpCiAgICAgICAgc3lzLm1vZHVsZXMuc2V0ZGVmYXVsdCgnZGlzdHV0aWxzLmNvbW1hbmQuZWdnX2luZm8nLCBlZ2dfaW5mbykKCiAgICAgICAgYXJncyA9IGxpc3QoYXJncykKICAgICAgICBpZiBzZWxmLnZlcmJvc2UgPiAyOgogICAgICAgICAgICB2ID0gJ3YnICogKHNlbGYudmVyYm9zZSAtIDEpCiAgICAgICAgICAgIGFyZ3MuaW5zZXJ0KDAsICctJyArIHYpCiAgICAgICAgZWxpZiBzZWxmLnZlcmJvc2UgPCAyOgogICAgICAgICAgICBhcmdzLmluc2VydCgwLCAnLXEnKQogICAgICAgIGlmIHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgYXJncy5pbnNlcnQoMCwgJy1uJykKICAgICAgICBsb2cuaW5mbygKICAgICAgICAgICAgIlJ1bm5pbmcgJXMgJXMiLCBzZXR1cF9zY3JpcHRbbGVuKHNldHVwX2Jhc2UpICsgMTpdLCAnICcuam9pbihhcmdzKQogICAgICAgICkKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJ1bl9zZXR1cChzZXR1cF9zY3JpcHQsIGFyZ3MpCiAgICAgICAgZXhjZXB0IFN5c3RlbUV4aXQgYXMgdjoKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IoIlNldHVwIHNjcmlwdCBleGl0ZWQgd2l0aCAlcyIgJSAodi5hcmdzWzBdLCkpCgogICAgZGVmIGJ1aWxkX2FuZF9pbnN0YWxsKHNlbGYsIHNldHVwX3NjcmlwdCwgc2V0dXBfYmFzZSk6CiAgICAgICAgYXJncyA9IFsnYmRpc3RfZWdnJywgJy0tZGlzdC1kaXInXQoKICAgICAgICBkaXN0X2RpciA9IHRlbXBmaWxlLm1rZHRlbXAoCiAgICAgICAgICAgIHByZWZpeD0nZWdnLWRpc3QtdG1wLScsIGRpcj1vcy5wYXRoLmRpcm5hbWUoc2V0dXBfc2NyaXB0KQogICAgICAgICkKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYuX3NldF9mZXRjaGVyX29wdGlvbnMob3MucGF0aC5kaXJuYW1lKHNldHVwX3NjcmlwdCkpCiAgICAgICAgICAgIGFyZ3MuYXBwZW5kKGRpc3RfZGlyKQoKICAgICAgICAgICAgc2VsZi5ydW5fc2V0dXAoc2V0dXBfc2NyaXB0LCBzZXR1cF9iYXNlLCBhcmdzKQogICAgICAgICAgICBhbGxfZWdncyA9IEVudmlyb25tZW50KFtkaXN0X2Rpcl0pCiAgICAgICAgICAgIGVnZ3MgPSBbXQogICAgICAgICAgICBmb3Iga2V5IGluIGFsbF9lZ2dzOgogICAgICAgICAgICAgICAgZm9yIGRpc3QgaW4gYWxsX2VnZ3Nba2V5XToKICAgICAgICAgICAgICAgICAgICBlZ2dzLmFwcGVuZChzZWxmLmluc3RhbGxfZWdnKGRpc3QubG9jYXRpb24sIHNldHVwX2Jhc2UpKQogICAgICAgICAgICBpZiBub3QgZWdncyBhbmQgbm90IHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgICAgIGxvZy53YXJuKCJObyBlZ2dzIGZvdW5kIGluICVzIChzZXR1cCBzY3JpcHQgcHJvYmxlbT8pIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RfZGlyKQogICAgICAgICAgICByZXR1cm4gZWdncwogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIHJtdHJlZShkaXN0X2RpcikKICAgICAgICAgICAgbG9nLnNldF92ZXJib3NpdHkoc2VsZi52ZXJib3NlKSAgIyByZXN0b3JlIG91ciBsb2cgdmVyYm9zaXR5CgogICAgZGVmIF9zZXRfZmV0Y2hlcl9vcHRpb25zKHNlbGYsIGJhc2UpOgogICAgICAgICIiIgogICAgICAgIFdoZW4gZWFzeV9pbnN0YWxsIGlzIGFib3V0IHRvIHJ1biBiZGlzdF9lZ2cgb24gYSBzb3VyY2UgZGlzdCwgdGhhdAogICAgICAgIHNvdXJjZSBkaXN0IG1pZ2h0IGhhdmUgJ3NldHVwX3JlcXVpcmVzJyBkaXJlY3RpdmVzLCByZXF1aXJpbmcKICAgICAgICBhZGRpdGlvbmFsIGZldGNoaW5nLiBFbnN1cmUgdGhlIGZldGNoZXIgb3B0aW9ucyBnaXZlbiB0byBlYXN5X2luc3RhbGwKICAgICAgICBhcmUgYXZhaWxhYmxlIHRvIHRoYXQgY29tbWFuZCBhcyB3ZWxsLgogICAgICAgICIiIgogICAgICAgICMgZmluZCB0aGUgZmV0Y2ggb3B0aW9ucyBmcm9tIGVhc3lfaW5zdGFsbCBhbmQgd3JpdGUgdGhlbSBvdXQKICAgICAgICAjIHRvIHRoZSBzZXR1cC5jZmcgZmlsZS4KICAgICAgICBlaV9vcHRzID0gc2VsZi5kaXN0cmlidXRpb24uZ2V0X29wdGlvbl9kaWN0KCdlYXN5X2luc3RhbGwnKS5jb3B5KCkKICAgICAgICBmZXRjaF9kaXJlY3RpdmVzID0gKAogICAgICAgICAgICAnZmluZF9saW5rcycsICdzaXRlX2RpcnMnLCAnaW5kZXhfdXJsJywgJ29wdGltaXplJywgJ2FsbG93X2hvc3RzJywKICAgICAgICApCiAgICAgICAgZmV0Y2hfb3B0aW9ucyA9IHt9CiAgICAgICAgZm9yIGtleSwgdmFsIGluIGVpX29wdHMuaXRlbXMoKToKICAgICAgICAgICAgaWYga2V5IG5vdCBpbiBmZXRjaF9kaXJlY3RpdmVzOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgZmV0Y2hfb3B0aW9uc1trZXkucmVwbGFjZSgnXycsICctJyldID0gdmFsWzFdCiAgICAgICAgIyBjcmVhdGUgYSBzZXR0aW5ncyBkaWN0aW9uYXJ5IHN1aXRhYmxlIGZvciBgZWRpdF9jb25maWdgCiAgICAgICAgc2V0dGluZ3MgPSBkaWN0KGVhc3lfaW5zdGFsbD1mZXRjaF9vcHRpb25zKQogICAgICAgIGNmZ19maWxlbmFtZSA9IG9zLnBhdGguam9pbihiYXNlLCAnc2V0dXAuY2ZnJykKICAgICAgICBzZXRvcHQuZWRpdF9jb25maWcoY2ZnX2ZpbGVuYW1lLCBzZXR0aW5ncykKCiAgICBkZWYgdXBkYXRlX3B0aChzZWxmLCBkaXN0KToKICAgICAgICBpZiBzZWxmLnB0aF9maWxlIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBmb3IgZCBpbiBzZWxmLnB0aF9maWxlW2Rpc3Qua2V5XTogICMgZHJvcCBvbGQgZW50cmllcwogICAgICAgICAgICBpZiBzZWxmLm11bHRpX3ZlcnNpb24gb3IgZC5sb2NhdGlvbiAhPSBkaXN0LmxvY2F0aW9uOgogICAgICAgICAgICAgICAgbG9nLmluZm8oIlJlbW92aW5nICVzIGZyb20gZWFzeS1pbnN0YWxsLnB0aCBmaWxlIiwgZCkKICAgICAgICAgICAgICAgIHNlbGYucHRoX2ZpbGUucmVtb3ZlKGQpCiAgICAgICAgICAgICAgICBpZiBkLmxvY2F0aW9uIGluIHNlbGYuc2hhZG93X3BhdGg6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5zaGFkb3dfcGF0aC5yZW1vdmUoZC5sb2NhdGlvbikKCiAgICAgICAgaWYgbm90IHNlbGYubXVsdGlfdmVyc2lvbjoKICAgICAgICAgICAgaWYgZGlzdC5sb2NhdGlvbiBpbiBzZWxmLnB0aF9maWxlLnBhdGhzOgogICAgICAgICAgICAgICAgbG9nLmluZm8oCiAgICAgICAgICAgICAgICAgICAgIiVzIGlzIGFscmVhZHkgdGhlIGFjdGl2ZSB2ZXJzaW9uIGluIGVhc3ktaW5zdGFsbC5wdGgiLAogICAgICAgICAgICAgICAgICAgIGRpc3QsCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBsb2cuaW5mbygiQWRkaW5nICVzIHRvIGVhc3ktaW5zdGFsbC5wdGggZmlsZSIsIGRpc3QpCiAgICAgICAgICAgICAgICBzZWxmLnB0aF9maWxlLmFkZChkaXN0KSAgIyBhZGQgbmV3IGVudHJ5CiAgICAgICAgICAgICAgICBpZiBkaXN0LmxvY2F0aW9uIG5vdCBpbiBzZWxmLnNoYWRvd19wYXRoOgogICAgICAgICAgICAgICAgICAgIHNlbGYuc2hhZG93X3BhdGguYXBwZW5kKGRpc3QubG9jYXRpb24pCgogICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CgogICAgICAgICAgICBzZWxmLnB0aF9maWxlLnNhdmUoKQoKICAgICAgICAgICAgaWYgZGlzdC5rZXkgPT0gJ3NldHVwdG9vbHMnOgogICAgICAgICAgICAgICAgIyBFbnN1cmUgdGhhdCBzZXR1cHRvb2xzIGl0c2VsZiBuZXZlciBiZWNvbWVzIHVuYXZhaWxhYmxlIQogICAgICAgICAgICAgICAgIyBYWFggc2hvdWxkIHRoaXMgY2hlY2sgZm9yIGxhdGVzdCB2ZXJzaW9uPwogICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4oc2VsZi5pbnN0YWxsX2RpciwgJ3NldHVwdG9vbHMucHRoJykKICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNsaW5rKGZpbGVuYW1lKToKICAgICAgICAgICAgICAgICAgICBvcy51bmxpbmsoZmlsZW5hbWUpCiAgICAgICAgICAgICAgICBmID0gb3BlbihmaWxlbmFtZSwgJ3d0JykKICAgICAgICAgICAgICAgIGYud3JpdGUoc2VsZi5wdGhfZmlsZS5tYWtlX3JlbGF0aXZlKGRpc3QubG9jYXRpb24pICsgJ1xuJykKICAgICAgICAgICAgICAgIGYuY2xvc2UoKQoKICAgIGRlZiB1bnBhY2tfcHJvZ3Jlc3Moc2VsZiwgc3JjLCBkc3QpOgogICAgICAgICMgUHJvZ3Jlc3MgZmlsdGVyIGZvciB1bnBhY2tpbmcKICAgICAgICBsb2cuZGVidWcoIlVucGFja2luZyAlcyB0byAlcyIsIHNyYywgZHN0KQogICAgICAgIHJldHVybiBkc3QgICMgb25seSB1bnBhY2stYW5kLWNvbXBpbGUgc2tpcHMgZmlsZXMgZm9yIGRyeSBydW4KCiAgICBkZWYgdW5wYWNrX2FuZF9jb21waWxlKHNlbGYsIGVnZ19wYXRoLCBkZXN0aW5hdGlvbik6CiAgICAgICAgdG9fY29tcGlsZSA9IFtdCiAgICAgICAgdG9fY2htb2QgPSBbXQoKICAgICAgICBkZWYgcGYoc3JjLCBkc3QpOgogICAgICAgICAgICBpZiBkc3QuZW5kc3dpdGgoJy5weScpIGFuZCBub3Qgc3JjLnN0YXJ0c3dpdGgoJ0VHRy1JTkZPLycpOgogICAgICAgICAgICAgICAgdG9fY29tcGlsZS5hcHBlbmQoZHN0KQogICAgICAgICAgICBlbGlmIGRzdC5lbmRzd2l0aCgnLmRsbCcpIG9yIGRzdC5lbmRzd2l0aCgnLnNvJyk6CiAgICAgICAgICAgICAgICB0b19jaG1vZC5hcHBlbmQoZHN0KQogICAgICAgICAgICBzZWxmLnVucGFja19wcm9ncmVzcyhzcmMsIGRzdCkKICAgICAgICAgICAgcmV0dXJuIG5vdCBzZWxmLmRyeV9ydW4gYW5kIGRzdCBvciBOb25lCgogICAgICAgIHVucGFja19hcmNoaXZlKGVnZ19wYXRoLCBkZXN0aW5hdGlvbiwgcGYpCiAgICAgICAgc2VsZi5ieXRlX2NvbXBpbGUodG9fY29tcGlsZSkKICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICBmb3IgZiBpbiB0b19jaG1vZDoKICAgICAgICAgICAgICAgIG1vZGUgPSAoKG9zLnN0YXQoZilbc3RhdC5TVF9NT0RFXSkgfCAwbzU1NSkgJiAwbzc3NTUKICAgICAgICAgICAgICAgIGNobW9kKGYsIG1vZGUpCgogICAgZGVmIGJ5dGVfY29tcGlsZShzZWxmLCB0b19jb21waWxlKToKICAgICAgICBpZiBzeXMuZG9udF93cml0ZV9ieXRlY29kZToKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGZyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGJ5dGVfY29tcGlsZQoKICAgICAgICB0cnk6CiAgICAgICAgICAgICMgdHJ5IHRvIG1ha2UgdGhlIGJ5dGUgY29tcGlsZSBtZXNzYWdlcyBxdWlldGVyCiAgICAgICAgICAgIGxvZy5zZXRfdmVyYm9zaXR5KHNlbGYudmVyYm9zZSAtIDEpCgogICAgICAgICAgICBieXRlX2NvbXBpbGUodG9fY29tcGlsZSwgb3B0aW1pemU9MCwgZm9yY2U9MSwgZHJ5X3J1bj1zZWxmLmRyeV9ydW4pCiAgICAgICAgICAgIGlmIHNlbGYub3B0aW1pemU6CiAgICAgICAgICAgICAgICBieXRlX2NvbXBpbGUoCiAgICAgICAgICAgICAgICAgICAgdG9fY29tcGlsZSwgb3B0aW1pemU9c2VsZi5vcHRpbWl6ZSwgZm9yY2U9MSwKICAgICAgICAgICAgICAgICAgICBkcnlfcnVuPXNlbGYuZHJ5X3J1biwKICAgICAgICAgICAgICAgICkKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBsb2cuc2V0X3ZlcmJvc2l0eShzZWxmLnZlcmJvc2UpICAjIHJlc3RvcmUgb3JpZ2luYWwgdmVyYm9zaXR5CgogICAgX19ub19kZWZhdWx0X21zZyA9IHRleHR3cmFwLmRlZGVudCgiIiIKICAgICAgICBiYWQgaW5zdGFsbCBkaXJlY3Rvcnkgb3IgUFlUSE9OUEFUSAoKICAgICAgICBZb3UgYXJlIGF0dGVtcHRpbmcgdG8gaW5zdGFsbCBhIHBhY2thZ2UgdG8gYSBkaXJlY3RvcnkgdGhhdCBpcyBub3QKICAgICAgICBvbiBQWVRIT05QQVRIIGFuZCB3aGljaCBQeXRob24gZG9lcyBub3QgcmVhZCAiLnB0aCIgZmlsZXMgZnJvbS4gIFRoZQogICAgICAgIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkgeW91IHNwZWNpZmllZCAodmlhIC0taW5zdGFsbC1kaXIsIC0tcHJlZml4LCBvcgogICAgICAgIHRoZSBkaXN0dXRpbHMgZGVmYXVsdCBzZXR0aW5nKSB3YXM6CgogICAgICAgICAgICAlcwoKICAgICAgICBhbmQgeW91ciBQWVRIT05QQVRIIGVudmlyb25tZW50IHZhcmlhYmxlIGN1cnJlbnRseSBjb250YWluczoKCiAgICAgICAgICAgICVyCgogICAgICAgIEhlcmUgYXJlIHNvbWUgb2YgeW91ciBvcHRpb25zIGZvciBjb3JyZWN0aW5nIHRoZSBwcm9ibGVtOgoKICAgICAgICAqIFlvdSBjYW4gY2hvb3NlIGEgZGlmZmVyZW50IGluc3RhbGxhdGlvbiBkaXJlY3RvcnksIGkuZS4sIG9uZSB0aGF0IGlzCiAgICAgICAgICBvbiBQWVRIT05QQVRIIG9yIHN1cHBvcnRzIC5wdGggZmlsZXMKCiAgICAgICAgKiBZb3UgY2FuIGFkZCB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSB0byB0aGUgUFlUSE9OUEFUSCBlbnZpcm9ubWVudAogICAgICAgICAgdmFyaWFibGUuICAoSXQgbXVzdCB0aGVuIGFsc28gYmUgb24gUFlUSE9OUEFUSCB3aGVuZXZlciB5b3UgcnVuCiAgICAgICAgICBQeXRob24gYW5kIHdhbnQgdG8gdXNlIHRoZSBwYWNrYWdlKHMpIHlvdSBhcmUgaW5zdGFsbGluZy4pCgogICAgICAgICogWW91IGNhbiBzZXQgdXAgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkgdG8gc3VwcG9ydCAiLnB0aCIgZmlsZXMgYnkKICAgICAgICAgIHVzaW5nIG9uZSBvZiB0aGUgYXBwcm9hY2hlcyBkZXNjcmliZWQgaGVyZToKCiAgICAgICAgICBodHRwczovL3NldHVwdG9vbHMucmVhZHRoZWRvY3MuaW8vZW4vbGF0ZXN0L2Vhc3lfaW5zdGFsbC5odG1sI2N1c3RvbS1pbnN0YWxsYXRpb24tbG9jYXRpb25zCgoKICAgICAgICBQbGVhc2UgbWFrZSB0aGUgYXBwcm9wcmlhdGUgY2hhbmdlcyBmb3IgeW91ciBzeXN0ZW0gYW5kIHRyeSBhZ2Fpbi4iIiIpLmxzdHJpcCgpCgogICAgZGVmIG5vX2RlZmF1bHRfdmVyc2lvbl9tc2coc2VsZik6CiAgICAgICAgdGVtcGxhdGUgPSBzZWxmLl9fbm9fZGVmYXVsdF9tc2cKICAgICAgICByZXR1cm4gdGVtcGxhdGUgJSAoc2VsZi5pbnN0YWxsX2Rpciwgb3MuZW52aXJvbi5nZXQoJ1BZVEhPTlBBVEgnLCAnJykpCgogICAgZGVmIGluc3RhbGxfc2l0ZV9weShzZWxmKToKICAgICAgICAiIiJNYWtlIHN1cmUgdGhlcmUncyBhIHNpdGUucHkgaW4gdGhlIHRhcmdldCBkaXIsIGlmIG5lZWRlZCIiIgoKICAgICAgICBpZiBzZWxmLnNpdGVweV9pbnN0YWxsZWQ6CiAgICAgICAgICAgIHJldHVybiAgIyBhbHJlYWR5IGRpZCBpdCwgb3IgZG9uJ3QgbmVlZCB0bwoKICAgICAgICBzaXRlcHkgPSBvcy5wYXRoLmpvaW4oc2VsZi5pbnN0YWxsX2RpciwgInNpdGUucHkiKQogICAgICAgIHNvdXJjZSA9IHJlc291cmNlX3N0cmluZygic2V0dXB0b29scyIsICJzaXRlLXBhdGNoLnB5IikKICAgICAgICBzb3VyY2UgPSBzb3VyY2UuZGVjb2RlKCd1dGYtOCcpCiAgICAgICAgY3VycmVudCA9ICIiCgogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHNpdGVweSk6CiAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ2hlY2tpbmcgZXhpc3Rpbmcgc2l0ZS5weSBpbiAlcyIsIHNlbGYuaW5zdGFsbF9kaXIpCiAgICAgICAgICAgIHdpdGggaW8ub3BlbihzaXRlcHkpIGFzIHN0cm06CiAgICAgICAgICAgICAgICBjdXJyZW50ID0gc3RybS5yZWFkKCkKCiAgICAgICAgICAgIGlmIG5vdCBjdXJyZW50LnN0YXJ0c3dpdGgoJ2RlZiBfX2Jvb3QoKTonKToKICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKAogICAgICAgICAgICAgICAgICAgICIlcyBpcyBub3QgYSBzZXR1cHRvb2xzLWdlbmVyYXRlZCBzaXRlLnB5OyBwbGVhc2UiCiAgICAgICAgICAgICAgICAgICAgIiByZW1vdmUgaXQuIiAlIHNpdGVweQogICAgICAgICAgICAgICAgKQoKICAgICAgICBpZiBjdXJyZW50ICE9IHNvdXJjZToKICAgICAgICAgICAgbG9nLmluZm8oIkNyZWF0aW5nICVzIiwgc2l0ZXB5KQogICAgICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICAgICAgZW5zdXJlX2RpcmVjdG9yeShzaXRlcHkpCiAgICAgICAgICAgICAgICB3aXRoIGlvLm9wZW4oc2l0ZXB5LCAndycsIGVuY29kaW5nPSd1dGYtOCcpIGFzIHN0cm06CiAgICAgICAgICAgICAgICAgICAgc3RybS53cml0ZShzb3VyY2UpCiAgICAgICAgICAgIHNlbGYuYnl0ZV9jb21waWxlKFtzaXRlcHldKQoKICAgICAgICBzZWxmLnNpdGVweV9pbnN0YWxsZWQgPSBUcnVlCgogICAgZGVmIGNyZWF0ZV9ob21lX3BhdGgoc2VsZik6CiAgICAgICAgIiIiQ3JlYXRlIGRpcmVjdG9yaWVzIHVuZGVyIH4uIiIiCiAgICAgICAgaWYgbm90IHNlbGYudXNlcjoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgaG9tZSA9IGNvbnZlcnRfcGF0aChvcy5wYXRoLmV4cGFuZHVzZXIoIn4iKSkKICAgICAgICBmb3IgbmFtZSwgcGF0aCBpbiBzaXguaXRlcml0ZW1zKHNlbGYuY29uZmlnX3ZhcnMpOgogICAgICAgICAgICBpZiBwYXRoLnN0YXJ0c3dpdGgoaG9tZSkgYW5kIG5vdCBvcy5wYXRoLmlzZGlyKHBhdGgpOgogICAgICAgICAgICAgICAgc2VsZi5kZWJ1Z19wcmludCgib3MubWFrZWRpcnMoJyVzJywgMG83MDApIiAlIHBhdGgpCiAgICAgICAgICAgICAgICBvcy5tYWtlZGlycyhwYXRoLCAwbzcwMCkKCiAgICBJTlNUQUxMX1NDSEVNRVMgPSBkaWN0KAogICAgICAgIHBvc2l4PWRpY3QoCiAgICAgICAgICAgIGluc3RhbGxfZGlyPSckYmFzZS9saWIvcHl0aG9uJHB5X3ZlcnNpb25fc2hvcnQvc2l0ZS1wYWNrYWdlcycsCiAgICAgICAgICAgIHNjcmlwdF9kaXI9JyRiYXNlL2JpbicsCiAgICAgICAgKSwKICAgICkKCiAgICBERUZBVUxUX1NDSEVNRSA9IGRpY3QoCiAgICAgICAgaW5zdGFsbF9kaXI9JyRiYXNlL0xpYi9zaXRlLXBhY2thZ2VzJywKICAgICAgICBzY3JpcHRfZGlyPSckYmFzZS9TY3JpcHRzJywKICAgICkKCiAgICBkZWYgX2V4cGFuZChzZWxmLCAqYXR0cnMpOgogICAgICAgIGNvbmZpZ192YXJzID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2luc3RhbGwnKS5jb25maWdfdmFycwoKICAgICAgICBpZiBzZWxmLnByZWZpeDoKICAgICAgICAgICAgIyBTZXQgZGVmYXVsdCBpbnN0YWxsX2Rpci9zY3JpcHRzIGZyb20gLS1wcmVmaXgKICAgICAgICAgICAgY29uZmlnX3ZhcnMgPSBjb25maWdfdmFycy5jb3B5KCkKICAgICAgICAgICAgY29uZmlnX3ZhcnNbJ2Jhc2UnXSA9IHNlbGYucHJlZml4CiAgICAgICAgICAgIHNjaGVtZSA9IHNlbGYuSU5TVEFMTF9TQ0hFTUVTLmdldChvcy5uYW1lLCBzZWxmLkRFRkFVTFRfU0NIRU1FKQogICAgICAgICAgICBmb3IgYXR0ciwgdmFsIGluIHNjaGVtZS5pdGVtcygpOgogICAgICAgICAgICAgICAgaWYgZ2V0YXR0cihzZWxmLCBhdHRyLCBOb25lKSBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgYXR0ciwgdmFsKQoKICAgICAgICBmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBzdWJzdF92YXJzCgogICAgICAgIGZvciBhdHRyIGluIGF0dHJzOgogICAgICAgICAgICB2YWwgPSBnZXRhdHRyKHNlbGYsIGF0dHIpCiAgICAgICAgICAgIGlmIHZhbCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIHZhbCA9IHN1YnN0X3ZhcnModmFsLCBjb25maWdfdmFycykKICAgICAgICAgICAgICAgIGlmIG9zLm5hbWUgPT0gJ3Bvc2l4JzoKICAgICAgICAgICAgICAgICAgICB2YWwgPSBvcy5wYXRoLmV4cGFuZHVzZXIodmFsKQogICAgICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBhdHRyLCB2YWwpCgoKZGVmIF9weXRob25wYXRoKCk6CiAgICBpdGVtcyA9IG9zLmVudmlyb24uZ2V0KCdQWVRIT05QQVRIJywgJycpLnNwbGl0KG9zLnBhdGhzZXApCiAgICByZXR1cm4gZmlsdGVyKE5vbmUsIGl0ZW1zKQoKCmRlZiBnZXRfc2l0ZV9kaXJzKCk6CiAgICAiIiIKICAgIFJldHVybiBhIGxpc3Qgb2YgJ3NpdGUnIGRpcnMKICAgICIiIgoKICAgIHNpdGVkaXJzID0gW10KCiAgICAjIHN0YXJ0IHdpdGggUFlUSE9OUEFUSAogICAgc2l0ZWRpcnMuZXh0ZW5kKF9weXRob25wYXRoKCkpCgogICAgcHJlZml4ZXMgPSBbc3lzLnByZWZpeF0KICAgIGlmIHN5cy5leGVjX3ByZWZpeCAhPSBzeXMucHJlZml4OgogICAgICAgIHByZWZpeGVzLmFwcGVuZChzeXMuZXhlY19wcmVmaXgpCiAgICBmb3IgcHJlZml4IGluIHByZWZpeGVzOgogICAgICAgIGlmIHByZWZpeDoKICAgICAgICAgICAgaWYgc3lzLnBsYXRmb3JtIGluICgnb3MyZW14JywgJ3Jpc2NvcycpOgogICAgICAgICAgICAgICAgc2l0ZWRpcnMuYXBwZW5kKG9zLnBhdGguam9pbihwcmVmaXgsICJMaWIiLCAic2l0ZS1wYWNrYWdlcyIpKQogICAgICAgICAgICBlbGlmIG9zLnNlcCA9PSAnLyc6CiAgICAgICAgICAgICAgICBzaXRlZGlycy5leHRlbmQoWwogICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbigKICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4LAogICAgICAgICAgICAgICAgICAgICAgICAibGliIiwKICAgICAgICAgICAgICAgICAgICAgICAgInB5dGhvbnt9Lnt9Ii5mb3JtYXQoKnN5cy52ZXJzaW9uX2luZm8pLAogICAgICAgICAgICAgICAgICAgICAgICAic2l0ZS1wYWNrYWdlcyIsCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4ocHJlZml4LCAibGliIiwgInNpdGUtcHl0aG9uIiksCiAgICAgICAgICAgICAgICBdKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2l0ZWRpcnMuZXh0ZW5kKFsKICAgICAgICAgICAgICAgICAgICBwcmVmaXgsCiAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKHByZWZpeCwgImxpYiIsICJzaXRlLXBhY2thZ2VzIiksCiAgICAgICAgICAgICAgICBdKQogICAgICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ2Rhcndpbic6CiAgICAgICAgICAgICAgICAjIGZvciBmcmFtZXdvcmsgYnVpbGRzICpvbmx5KiB3ZSBhZGQgdGhlIHN0YW5kYXJkIEFwcGxlCiAgICAgICAgICAgICAgICAjIGxvY2F0aW9ucy4gQ3VycmVudGx5IG9ubHkgcGVyLXVzZXIsIGJ1dCAvTGlicmFyeSBhbmQKICAgICAgICAgICAgICAgICMgL05ldHdvcmsvTGlicmFyeSBjb3VsZCBiZSBhZGRlZCB0b28KICAgICAgICAgICAgICAgIGlmICdQeXRob24uZnJhbWV3b3JrJyBpbiBwcmVmaXg6CiAgICAgICAgICAgICAgICAgICAgaG9tZSA9IG9zLmVudmlyb24uZ2V0KCdIT01FJykKICAgICAgICAgICAgICAgICAgICBpZiBob21lOgogICAgICAgICAgICAgICAgICAgICAgICBob21lX3NwID0gb3MucGF0aC5qb2luKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9tZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdMaWJyYXJ5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQeXRob24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3t9Lnt9Jy5mb3JtYXQoKnN5cy52ZXJzaW9uX2luZm8pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NpdGUtcGFja2FnZXMnLAogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgIHNpdGVkaXJzLmFwcGVuZChob21lX3NwKQogICAgbGliX3BhdGhzID0gZ2V0X3BhdGgoJ3B1cmVsaWInKSwgZ2V0X3BhdGgoJ3BsYXRsaWInKQogICAgZm9yIHNpdGVfbGliIGluIGxpYl9wYXRoczoKICAgICAgICBpZiBzaXRlX2xpYiBub3QgaW4gc2l0ZWRpcnM6CiAgICAgICAgICAgIHNpdGVkaXJzLmFwcGVuZChzaXRlX2xpYikKCiAgICBpZiBzaXRlLkVOQUJMRV9VU0VSX1NJVEU6CiAgICAgICAgc2l0ZWRpcnMuYXBwZW5kKHNpdGUuVVNFUl9TSVRFKQoKICAgIHRyeToKICAgICAgICBzaXRlZGlycy5leHRlbmQoc2l0ZS5nZXRzaXRlcGFja2FnZXMoKSkKICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICBwYXNzCgogICAgc2l0ZWRpcnMgPSBsaXN0KG1hcChub3JtYWxpemVfcGF0aCwgc2l0ZWRpcnMpKQoKICAgIHJldHVybiBzaXRlZGlycwoKCmRlZiBleHBhbmRfcGF0aHMoaW5wdXRzKToKICAgICIiIllpZWxkIHN5cy5wYXRoIGRpcmVjdG9yaWVzIHRoYXQgbWlnaHQgY29udGFpbiAib2xkLXN0eWxlIiBwYWNrYWdlcyIiIgoKICAgIHNlZW4gPSB7fQoKICAgIGZvciBkaXJuYW1lIGluIGlucHV0czoKICAgICAgICBkaXJuYW1lID0gbm9ybWFsaXplX3BhdGgoZGlybmFtZSkKICAgICAgICBpZiBkaXJuYW1lIGluIHNlZW46CiAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgIHNlZW5bZGlybmFtZV0gPSAxCiAgICAgICAgaWYgbm90IG9zLnBhdGguaXNkaXIoZGlybmFtZSk6CiAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgIGZpbGVzID0gb3MubGlzdGRpcihkaXJuYW1lKQogICAgICAgIHlpZWxkIGRpcm5hbWUsIGZpbGVzCgogICAgICAgIGZvciBuYW1lIGluIGZpbGVzOgogICAgICAgICAgICBpZiBub3QgbmFtZS5lbmRzd2l0aCgnLnB0aCcpOgogICAgICAgICAgICAgICAgIyBXZSBvbmx5IGNhcmUgYWJvdXQgdGhlIC5wdGggZmlsZXMKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlmIG5hbWUgaW4gKCdlYXN5LWluc3RhbGwucHRoJywgJ3NldHVwdG9vbHMucHRoJyk6CiAgICAgICAgICAgICAgICAjIElnbm9yZSAucHRoIGZpbGVzIHRoYXQgd2UgY29udHJvbAogICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgICMgUmVhZCB0aGUgLnB0aCBmaWxlCiAgICAgICAgICAgIGYgPSBvcGVuKG9zLnBhdGguam9pbihkaXJuYW1lLCBuYW1lKSkKICAgICAgICAgICAgbGluZXMgPSBsaXN0KHlpZWxkX2xpbmVzKGYpKQogICAgICAgICAgICBmLmNsb3NlKCkKCiAgICAgICAgICAgICMgWWllbGQgZXhpc3Rpbmcgbm9uLWR1cGUsIG5vbi1pbXBvcnQgZGlyZWN0b3J5IGxpbmVzIGZyb20gaXQKICAgICAgICAgICAgZm9yIGxpbmUgaW4gbGluZXM6CiAgICAgICAgICAgICAgICBpZiBub3QgbGluZS5zdGFydHN3aXRoKCJpbXBvcnQiKToKICAgICAgICAgICAgICAgICAgICBsaW5lID0gbm9ybWFsaXplX3BhdGgobGluZS5yc3RyaXAoKSkKICAgICAgICAgICAgICAgICAgICBpZiBsaW5lIG5vdCBpbiBzZWVuOgogICAgICAgICAgICAgICAgICAgICAgICBzZWVuW2xpbmVdID0gMQogICAgICAgICAgICAgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2RpcihsaW5lKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIGxpbmUsIG9zLmxpc3RkaXIobGluZSkKCgpkZWYgZXh0cmFjdF93aW5pbnN0X2NmZyhkaXN0X2ZpbGVuYW1lKToKICAgICIiIkV4dHJhY3QgY29uZmlndXJhdGlvbiBkYXRhIGZyb20gYSBiZGlzdF93aW5pbnN0IC5leGUKCiAgICBSZXR1cm5zIGEgY29uZmlncGFyc2VyLlJhd0NvbmZpZ1BhcnNlciwgb3IgTm9uZQogICAgIiIiCiAgICBmID0gb3BlbihkaXN0X2ZpbGVuYW1lLCAncmInKQogICAgdHJ5OgogICAgICAgIGVuZHJlYyA9IHppcGZpbGUuX0VuZFJlY0RhdGEoZikKICAgICAgICBpZiBlbmRyZWMgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgcHJlcGVuZGVkID0gKGVuZHJlY1s5XSAtIGVuZHJlY1s1XSkgLSBlbmRyZWNbNl0KICAgICAgICBpZiBwcmVwZW5kZWQgPCAxMjogICMgbm8gd2luaW5zdCBkYXRhIGhlcmUKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICBmLnNlZWsocHJlcGVuZGVkIC0gMTIpCgogICAgICAgIHRhZywgY2ZnbGVuLCBibWxlbiA9IHN0cnVjdC51bnBhY2soIjxpaWkiLCBmLnJlYWQoMTIpKQogICAgICAgIGlmIHRhZyBub3QgaW4gKDB4MTIzNDU2N0EsIDB4MTIzNDU2N0IpOgogICAgICAgICAgICByZXR1cm4gTm9uZSAgIyBub3QgYSB2YWxpZCB0YWcKCiAgICAgICAgZi5zZWVrKHByZXBlbmRlZCAtICgxMiArIGNmZ2xlbikpCiAgICAgICAgaW5pdCA9IHsndmVyc2lvbic6ICcnLCAndGFyZ2V0X3ZlcnNpb24nOiAnJ30KICAgICAgICBjZmcgPSBjb25maWdwYXJzZXIuUmF3Q29uZmlnUGFyc2VyKGluaXQpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBwYXJ0ID0gZi5yZWFkKGNmZ2xlbikKICAgICAgICAgICAgIyBSZWFkIHVwIHRvIHRoZSBmaXJzdCBudWxsIGJ5dGUuCiAgICAgICAgICAgIGNvbmZpZyA9IHBhcnQuc3BsaXQoYidcMCcsIDEpWzBdCiAgICAgICAgICAgICMgTm93IHRoZSBjb25maWcgaXMgaW4gYnl0ZXMsIGJ1dCBmb3IgUmF3Q29uZmlnUGFyc2VyLCBpdCBzaG91bGQKICAgICAgICAgICAgIyAgYmUgdGV4dCwgc28gZGVjb2RlIGl0LgogICAgICAgICAgICBjb25maWcgPSBjb25maWcuZGVjb2RlKHN5cy5nZXRmaWxlc3lzdGVtZW5jb2RpbmcoKSkKICAgICAgICAgICAgY2ZnLnJlYWRmcChzaXguU3RyaW5nSU8oY29uZmlnKSkKICAgICAgICBleGNlcHQgY29uZmlncGFyc2VyLkVycm9yOgogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIGlmIG5vdCBjZmcuaGFzX3NlY3Rpb24oJ21ldGFkYXRhJykgb3Igbm90IGNmZy5oYXNfc2VjdGlvbignU2V0dXAnKToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICByZXR1cm4gY2ZnCgogICAgZmluYWxseToKICAgICAgICBmLmNsb3NlKCkKCgpkZWYgZ2V0X2V4ZV9wcmVmaXhlcyhleGVfZmlsZW5hbWUpOgogICAgIiIiR2V0IGV4ZS0+ZWdnIHBhdGggdHJhbnNsYXRpb25zIGZvciBhIGdpdmVuIC5leGUgZmlsZSIiIgoKICAgIHByZWZpeGVzID0gWwogICAgICAgICgnUFVSRUxJQi8nLCAnJyksCiAgICAgICAgKCdQTEFUTElCL3B5d2luMzJfc3lzdGVtMzInLCAnJyksCiAgICAgICAgKCdQTEFUTElCLycsICcnKSwKICAgICAgICAoJ1NDUklQVFMvJywgJ0VHRy1JTkZPL3NjcmlwdHMvJyksCiAgICAgICAgKCdEQVRBL2xpYi9zaXRlLXBhY2thZ2VzJywgJycpLAogICAgXQogICAgeiA9IHppcGZpbGUuWmlwRmlsZShleGVfZmlsZW5hbWUpCiAgICB0cnk6CiAgICAgICAgZm9yIGluZm8gaW4gei5pbmZvbGlzdCgpOgogICAgICAgICAgICBuYW1lID0gaW5mby5maWxlbmFtZQogICAgICAgICAgICBwYXJ0cyA9IG5hbWUuc3BsaXQoJy8nKQogICAgICAgICAgICBpZiBsZW4ocGFydHMpID09IDMgYW5kIHBhcnRzWzJdID09ICdQS0ctSU5GTyc6CiAgICAgICAgICAgICAgICBpZiBwYXJ0c1sxXS5lbmRzd2l0aCgnLmVnZy1pbmZvJyk6CiAgICAgICAgICAgICAgICAgICAgcHJlZml4ZXMuaW5zZXJ0KDAsICgnLycuam9pbihwYXJ0c1s6Ml0pLCAnRUdHLUlORk8vJykpCiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgaWYgbGVuKHBhcnRzKSAhPSAyIG9yIG5vdCBuYW1lLmVuZHN3aXRoKCcucHRoJyk6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBpZiBuYW1lLmVuZHN3aXRoKCctbnNwa2cucHRoJyk6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBpZiBwYXJ0c1swXS51cHBlcigpIGluICgnUFVSRUxJQicsICdQTEFUTElCJyk6CiAgICAgICAgICAgICAgICBjb250ZW50cyA9IHoucmVhZChuYW1lKQogICAgICAgICAgICAgICAgaWYgc2l4LlBZMzoKICAgICAgICAgICAgICAgICAgICBjb250ZW50cyA9IGNvbnRlbnRzLmRlY29kZSgpCiAgICAgICAgICAgICAgICBmb3IgcHRoIGluIHlpZWxkX2xpbmVzKGNvbnRlbnRzKToKICAgICAgICAgICAgICAgICAgICBwdGggPSBwdGguc3RyaXAoKS5yZXBsYWNlKCdcXCcsICcvJykKICAgICAgICAgICAgICAgICAgICBpZiBub3QgcHRoLnN0YXJ0c3dpdGgoJ2ltcG9ydCcpOgogICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXhlcy5hcHBlbmQoKCgnJXMvJXMvJyAlIChwYXJ0c1swXSwgcHRoKSksICcnKSkKICAgIGZpbmFsbHk6CiAgICAgICAgei5jbG9zZSgpCiAgICBwcmVmaXhlcyA9IFsoeC5sb3dlcigpLCB5KSBmb3IgeCwgeSBpbiBwcmVmaXhlc10KICAgIHByZWZpeGVzLnNvcnQoKQogICAgcHJlZml4ZXMucmV2ZXJzZSgpCiAgICByZXR1cm4gcHJlZml4ZXMKCgpjbGFzcyBQdGhEaXN0cmlidXRpb25zKEVudmlyb25tZW50KToKICAgICIiIkEgLnB0aCBmaWxlIHdpdGggRGlzdHJpYnV0aW9uIHBhdGhzIGluIGl0IiIiCgogICAgZGlydHkgPSBGYWxzZQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlbmFtZSwgc2l0ZWRpcnM9KCkpOgogICAgICAgIHNlbGYuZmlsZW5hbWUgPSBmaWxlbmFtZQogICAgICAgIHNlbGYuc2l0ZWRpcnMgPSBsaXN0KG1hcChub3JtYWxpemVfcGF0aCwgc2l0ZWRpcnMpKQogICAgICAgIHNlbGYuYmFzZWRpciA9IG5vcm1hbGl6ZV9wYXRoKG9zLnBhdGguZGlybmFtZShzZWxmLmZpbGVuYW1lKSkKICAgICAgICBzZWxmLl9sb2FkKCkKICAgICAgICBFbnZpcm9ubWVudC5fX2luaXRfXyhzZWxmLCBbXSwgTm9uZSwgTm9uZSkKICAgICAgICBmb3IgcGF0aCBpbiB5aWVsZF9saW5lcyhzZWxmLnBhdGhzKToKICAgICAgICAgICAgbGlzdChtYXAoc2VsZi5hZGQsIGZpbmRfZGlzdHJpYnV0aW9ucyhwYXRoLCBUcnVlKSkpCgogICAgZGVmIF9sb2FkKHNlbGYpOgogICAgICAgIHNlbGYucGF0aHMgPSBbXQogICAgICAgIHNhd19pbXBvcnQgPSBGYWxzZQogICAgICAgIHNlZW4gPSBkaWN0LmZyb21rZXlzKHNlbGYuc2l0ZWRpcnMpCiAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoc2VsZi5maWxlbmFtZSk6CiAgICAgICAgICAgIGYgPSBvcGVuKHNlbGYuZmlsZW5hbWUsICdydCcpCiAgICAgICAgICAgIGZvciBsaW5lIGluIGY6CiAgICAgICAgICAgICAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoJ2ltcG9ydCcpOgogICAgICAgICAgICAgICAgICAgIHNhd19pbXBvcnQgPSBUcnVlCiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIHBhdGggPSBsaW5lLnJzdHJpcCgpCiAgICAgICAgICAgICAgICBzZWxmLnBhdGhzLmFwcGVuZChwYXRoKQogICAgICAgICAgICAgICAgaWYgbm90IHBhdGguc3RyaXAoKSBvciBwYXRoLnN0cmlwKCkuc3RhcnRzd2l0aCgnIycpOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAjIHNraXAgbm9uLWV4aXN0ZW50IHBhdGhzLCBpbiBjYXNlIHNvbWVib2R5IGRlbGV0ZWQgYSBwYWNrYWdlCiAgICAgICAgICAgICAgICAjIG1hbnVhbGx5LCBhbmQgZHVwbGljYXRlIHBhdGhzIGFzIHdlbGwKICAgICAgICAgICAgICAgIHBhdGggPSBzZWxmLnBhdGhzWy0xXSA9IG5vcm1hbGl6ZV9wYXRoKAogICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihzZWxmLmJhc2VkaXIsIHBhdGgpCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMocGF0aCkgb3IgcGF0aCBpbiBzZWVuOgogICAgICAgICAgICAgICAgICAgIHNlbGYucGF0aHMucG9wKCkgICMgc2tpcCBpdAogICAgICAgICAgICAgICAgICAgIHNlbGYuZGlydHkgPSBUcnVlICAjIHdlIGNsZWFuZWQgdXAsIHNvIHdlJ3JlIGRpcnR5IG5vdyA6KQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBzZWVuW3BhdGhdID0gMQogICAgICAgICAgICBmLmNsb3NlKCkKCiAgICAgICAgaWYgc2VsZi5wYXRocyBhbmQgbm90IHNhd19pbXBvcnQ6CiAgICAgICAgICAgIHNlbGYuZGlydHkgPSBUcnVlICAjIGVuc3VyZSBhbnl0aGluZyB3ZSB0b3VjaCBoYXMgaW1wb3J0IHdyYXBwZXJzCiAgICAgICAgd2hpbGUgc2VsZi5wYXRocyBhbmQgbm90IHNlbGYucGF0aHNbLTFdLnN0cmlwKCk6CiAgICAgICAgICAgIHNlbGYucGF0aHMucG9wKCkKCiAgICBkZWYgc2F2ZShzZWxmKToKICAgICAgICAiIiJXcml0ZSBjaGFuZ2VkIC5wdGggZmlsZSBiYWNrIHRvIGRpc2siIiIKICAgICAgICBpZiBub3Qgc2VsZi5kaXJ0eToKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIHJlbF9wYXRocyA9IGxpc3QobWFwKHNlbGYubWFrZV9yZWxhdGl2ZSwgc2VsZi5wYXRocykpCiAgICAgICAgaWYgcmVsX3BhdGhzOgogICAgICAgICAgICBsb2cuZGVidWcoIlNhdmluZyAlcyIsIHNlbGYuZmlsZW5hbWUpCiAgICAgICAgICAgIGxpbmVzID0gc2VsZi5fd3JhcF9saW5lcyhyZWxfcGF0aHMpCiAgICAgICAgICAgIGRhdGEgPSAnXG4nLmpvaW4obGluZXMpICsgJ1xuJwoKICAgICAgICAgICAgaWYgb3MucGF0aC5pc2xpbmsoc2VsZi5maWxlbmFtZSk6CiAgICAgICAgICAgICAgICBvcy51bmxpbmsoc2VsZi5maWxlbmFtZSkKICAgICAgICAgICAgd2l0aCBvcGVuKHNlbGYuZmlsZW5hbWUsICd3dCcpIGFzIGY6CiAgICAgICAgICAgICAgICBmLndyaXRlKGRhdGEpCgogICAgICAgIGVsaWYgb3MucGF0aC5leGlzdHMoc2VsZi5maWxlbmFtZSk6CiAgICAgICAgICAgIGxvZy5kZWJ1ZygiRGVsZXRpbmcgZW1wdHkgJXMiLCBzZWxmLmZpbGVuYW1lKQogICAgICAgICAgICBvcy51bmxpbmsoc2VsZi5maWxlbmFtZSkKCiAgICAgICAgc2VsZi5kaXJ0eSA9IEZhbHNlCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF93cmFwX2xpbmVzKGxpbmVzKToKICAgICAgICByZXR1cm4gbGluZXMKCiAgICBkZWYgYWRkKHNlbGYsIGRpc3QpOgogICAgICAgICIiIkFkZCBgZGlzdGAgdG8gdGhlIGRpc3RyaWJ1dGlvbiBtYXAiIiIKICAgICAgICBuZXdfcGF0aCA9ICgKICAgICAgICAgICAgZGlzdC5sb2NhdGlvbiBub3QgaW4gc2VsZi5wYXRocyBhbmQgKAogICAgICAgICAgICAgICAgZGlzdC5sb2NhdGlvbiBub3QgaW4gc2VsZi5zaXRlZGlycyBvcgogICAgICAgICAgICAgICAgIyBhY2NvdW50IGZvciAnLicgYmVpbmcgaW4gUFlUSE9OUEFUSAogICAgICAgICAgICAgICAgZGlzdC5sb2NhdGlvbiA9PSBvcy5nZXRjd2QoKQogICAgICAgICAgICApCiAgICAgICAgKQogICAgICAgIGlmIG5ld19wYXRoOgogICAgICAgICAgICBzZWxmLnBhdGhzLmFwcGVuZChkaXN0LmxvY2F0aW9uKQogICAgICAgICAgICBzZWxmLmRpcnR5ID0gVHJ1ZQogICAgICAgIEVudmlyb25tZW50LmFkZChzZWxmLCBkaXN0KQoKICAgIGRlZiByZW1vdmUoc2VsZiwgZGlzdCk6CiAgICAgICAgIiIiUmVtb3ZlIGBkaXN0YCBmcm9tIHRoZSBkaXN0cmlidXRpb24gbWFwIiIiCiAgICAgICAgd2hpbGUgZGlzdC5sb2NhdGlvbiBpbiBzZWxmLnBhdGhzOgogICAgICAgICAgICBzZWxmLnBhdGhzLnJlbW92ZShkaXN0LmxvY2F0aW9uKQogICAgICAgICAgICBzZWxmLmRpcnR5ID0gVHJ1ZQogICAgICAgIEVudmlyb25tZW50LnJlbW92ZShzZWxmLCBkaXN0KQoKICAgIGRlZiBtYWtlX3JlbGF0aXZlKHNlbGYsIHBhdGgpOgogICAgICAgIG5wYXRoLCBsYXN0ID0gb3MucGF0aC5zcGxpdChub3JtYWxpemVfcGF0aChwYXRoKSkKICAgICAgICBiYXNlbGVuID0gbGVuKHNlbGYuYmFzZWRpcikKICAgICAgICBwYXJ0cyA9IFtsYXN0XQogICAgICAgIHNlcCA9IG9zLmFsdHNlcCA9PSAnLycgYW5kICcvJyBvciBvcy5zZXAKICAgICAgICB3aGlsZSBsZW4obnBhdGgpID49IGJhc2VsZW46CiAgICAgICAgICAgIGlmIG5wYXRoID09IHNlbGYuYmFzZWRpcjoKICAgICAgICAgICAgICAgIHBhcnRzLmFwcGVuZChvcy5jdXJkaXIpCiAgICAgICAgICAgICAgICBwYXJ0cy5yZXZlcnNlKCkKICAgICAgICAgICAgICAgIHJldHVybiBzZXAuam9pbihwYXJ0cykKICAgICAgICAgICAgbnBhdGgsIGxhc3QgPSBvcy5wYXRoLnNwbGl0KG5wYXRoKQogICAgICAgICAgICBwYXJ0cy5hcHBlbmQobGFzdCkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gcGF0aAoKCmNsYXNzIFJld3JpdGVQdGhEaXN0cmlidXRpb25zKFB0aERpc3RyaWJ1dGlvbnMpOgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX3dyYXBfbGluZXMoY2xzLCBsaW5lcyk6CiAgICAgICAgeWllbGQgY2xzLnByZWx1ZGUKICAgICAgICBmb3IgbGluZSBpbiBsaW5lczoKICAgICAgICAgICAgeWllbGQgbGluZQogICAgICAgIHlpZWxkIGNscy5wb3N0bHVkZQoKICAgIHByZWx1ZGUgPSBfb25lX2xpbmVyKCIiIgogICAgICAgIGltcG9ydCBzeXMKICAgICAgICBzeXMuX19wbGVuID0gbGVuKHN5cy5wYXRoKQogICAgICAgICIiIikKICAgIHBvc3RsdWRlID0gX29uZV9saW5lcigiIiIKICAgICAgICBpbXBvcnQgc3lzCiAgICAgICAgbmV3ID0gc3lzLnBhdGhbc3lzLl9fcGxlbjpdCiAgICAgICAgZGVsIHN5cy5wYXRoW3N5cy5fX3BsZW46XQogICAgICAgIHAgPSBnZXRhdHRyKHN5cywgJ19fZWdnaW5zZXJ0JywgMCkKICAgICAgICBzeXMucGF0aFtwOnBdID0gbmV3CiAgICAgICAgc3lzLl9fZWdnaW5zZXJ0ID0gcCArIGxlbihuZXcpCiAgICAgICAgIiIiKQoKCmlmIG9zLmVudmlyb24uZ2V0KCdTRVRVUFRPT0xTX1NZU19QQVRIX1RFQ0hOSVFVRScsICdyYXcnKSA9PSAncmV3cml0ZSc6CiAgICBQdGhEaXN0cmlidXRpb25zID0gUmV3cml0ZVB0aERpc3RyaWJ1dGlvbnMKCgpkZWYgX2ZpcnN0X2xpbmVfcmUoKToKICAgICIiIgogICAgUmV0dXJuIGEgcmVndWxhciBleHByZXNzaW9uIGJhc2VkIG9uIGZpcnN0X2xpbmVfcmUgc3VpdGFibGUgZm9yIG1hdGNoaW5nCiAgICBzdHJpbmdzLgogICAgIiIiCiAgICBpZiBpc2luc3RhbmNlKGZpcnN0X2xpbmVfcmUucGF0dGVybiwgc3RyKToKICAgICAgICByZXR1cm4gZmlyc3RfbGluZV9yZQoKICAgICMgZmlyc3RfbGluZV9yZSBpbiBQeXRob24gPj0zLjEuNCBhbmQgPj0zLjIuMSBpcyBhIGJ5dGVzIHBhdHRlcm4uCiAgICByZXR1cm4gcmUuY29tcGlsZShmaXJzdF9saW5lX3JlLnBhdHRlcm4uZGVjb2RlKCkpCgoKZGVmIGF1dG9fY2htb2QoZnVuYywgYXJnLCBleGMpOgogICAgaWYgZnVuYyBpbiBbb3MudW5saW5rLCBvcy5yZW1vdmVdIGFuZCBvcy5uYW1lID09ICdudCc6CiAgICAgICAgY2htb2QoYXJnLCBzdGF0LlNfSVdSSVRFKQogICAgICAgIHJldHVybiBmdW5jKGFyZykKICAgIGV0LCBldiwgXyA9IHN5cy5leGNfaW5mbygpCiAgICBzaXgucmVyYWlzZShldCwgKGV2WzBdLCBldlsxXSArICgiICVzICVzIiAlIChmdW5jLCBhcmcpKSkpCgoKZGVmIHVwZGF0ZV9kaXN0X2NhY2hlcyhkaXN0X3BhdGgsIGZpeF96aXBpbXBvcnRlcl9jYWNoZXMpOgogICAgIiIiCiAgICBGaXggYW55IGdsb2JhbGx5IGNhY2hlZCBgZGlzdF9wYXRoYCByZWxhdGVkIGRhdGEKCiAgICBgZGlzdF9wYXRoYCBzaG91bGQgYmUgYSBwYXRoIG9mIGEgbmV3bHkgaW5zdGFsbGVkIGVnZyBkaXN0cmlidXRpb24gKHppcHBlZAogICAgb3IgdW56aXBwZWQpLgoKICAgIHN5cy5wYXRoX2ltcG9ydGVyX2NhY2hlIGNvbnRhaW5zIGZpbmRlciBvYmplY3RzIHRoYXQgaGF2ZSBiZWVuIGNhY2hlZCB3aGVuCiAgICBpbXBvcnRpbmcgZGF0YSBmcm9tIHRoZSBvcmlnaW5hbCBkaXN0cmlidXRpb24uIEFueSBzdWNoIGZpbmRlcnMgbmVlZCB0byBiZQogICAgY2xlYXJlZCBzaW5jZSB0aGUgcmVwbGFjZW1lbnQgZGlzdHJpYnV0aW9uIG1pZ2h0IGJlIHBhY2thZ2VkIGRpZmZlcmVudGx5LAogICAgZS5nLiBhIHppcHBlZCBlZ2cgZGlzdHJpYnV0aW9uIG1pZ2h0IGdldCByZXBsYWNlZCB3aXRoIGFuIHVuemlwcGVkIGVnZwogICAgZm9sZGVyIG9yIHZpY2UgdmVyc2EuIEhhdmluZyB0aGUgb2xkIGZpbmRlcnMgY2FjaGVkIG1heSB0aGVuIGNhdXNlIFB5dGhvbgogICAgdG8gYXR0ZW1wdCBsb2FkaW5nIG1vZHVsZXMgZnJvbSB0aGUgcmVwbGFjZW1lbnQgZGlzdHJpYnV0aW9uIHVzaW5nIGFuCiAgICBpbmNvcnJlY3QgbG9hZGVyLgoKICAgIHppcGltcG9ydC56aXBpbXBvcnRlciBvYmplY3RzIGFyZSBQeXRob24gbG9hZGVycyBjaGFyZ2VkIHdpdGggaW1wb3J0aW5nCiAgICBkYXRhIHBhY2thZ2VkIGluc2lkZSB6aXAgYXJjaGl2ZXMuIElmIHN0YWxlIGxvYWRlcnMgcmVmZXJlbmNpbmcgdGhlCiAgICBvcmlnaW5hbCBkaXN0cmlidXRpb24sIGFyZSBsZWZ0IGJlaGluZCwgdGhleSBjYW4gZmFpbCB0byBsb2FkIG1vZHVsZXMgZnJvbQogICAgdGhlIHJlcGxhY2VtZW50IGRpc3RyaWJ1dGlvbi4gRS5nLiBpZiBhbiBvbGQgemlwaW1wb3J0LnppcGltcG9ydGVyIGluc3RhbmNlCiAgICBpcyB1c2VkIHRvIGxvYWQgZGF0YSBmcm9tIGEgbmV3IHppcHBlZCBlZ2cgYXJjaGl2ZSwgaXQgbWF5IGNhdXNlIHRoZQogICAgb3BlcmF0aW9uIHRvIGF0dGVtcHQgdG8gbG9jYXRlIHRoZSByZXF1ZXN0ZWQgZGF0YSBpbiB0aGUgd3JvbmcgbG9jYXRpb24gLQogICAgb25lIGluZGljYXRlZCBieSB0aGUgb3JpZ2luYWwgZGlzdHJpYnV0aW9uJ3MgemlwIGFyY2hpdmUgZGlyZWN0b3J5CiAgICBpbmZvcm1hdGlvbi4gU3VjaCBhbiBvcGVyYXRpb24gbWF5IHRoZW4gZmFpbCBvdXRyaWdodCwgZS5nLiByZXBvcnQgaGF2aW5nCiAgICByZWFkIGEgJ2JhZCBsb2NhbCBmaWxlIGhlYWRlcicsIG9yIGV2ZW4gd29yc2UsIGl0IG1heSBmYWlsIHNpbGVudGx5ICYKICAgIHJldHVybiBpbnZhbGlkIGRhdGEuCgogICAgemlwaW1wb3J0Ll96aXBfZGlyZWN0b3J5X2NhY2hlIGNvbnRhaW5zIGNhY2hlZCB6aXAgYXJjaGl2ZSBkaXJlY3RvcnkKICAgIGluZm9ybWF0aW9uIGZvciBhbGwgZXhpc3RpbmcgemlwaW1wb3J0LnppcGltcG9ydGVyIGluc3RhbmNlcyBhbmQgYWxsIHN1Y2gKICAgIGluc3RhbmNlcyBjb25uZWN0ZWQgdG8gdGhlIHNhbWUgYXJjaGl2ZSBzaGFyZSB0aGUgc2FtZSBjYWNoZWQgZGlyZWN0b3J5CiAgICBpbmZvcm1hdGlvbi4KCiAgICBJZiBhc2tlZCwgYW5kIHRoZSB1bmRlcmx5aW5nIFB5dGhvbiBpbXBsZW1lbnRhdGlvbiBhbGxvd3MgaXQsIHdlIGNhbiBmaXgKICAgIGFsbCBleGlzdGluZyB6aXBpbXBvcnQuemlwaW1wb3J0ZXIgaW5zdGFuY2VzIGluc3RlYWQgb2YgaGF2aW5nIHRvIHRyYWNrCiAgICB0aGVtIGRvd24gYW5kIHJlbW92ZSB0aGVtIG9uZSBieSBvbmUsIGJ5IHVwZGF0aW5nIHRoZWlyIHNoYXJlZCBjYWNoZWQgemlwCiAgICBhcmNoaXZlIGRpcmVjdG9yeSBpbmZvcm1hdGlvbi4gVGhpcywgb2YgY291cnNlLCBhc3N1bWVzIHRoYXQgdGhlCiAgICByZXBsYWNlbWVudCBkaXN0cmlidXRpb24gaXMgcGFja2FnZWQgYXMgYSB6aXBwZWQgZWdnLgoKICAgIElmIG5vdCBhc2tlZCB0byBmaXggZXhpc3RpbmcgemlwaW1wb3J0LnppcGltcG9ydGVyIGluc3RhbmNlcywgd2Ugc3RpbGwgZG8KICAgIG91ciBiZXN0IHRvIGNsZWFyIGFueSByZW1haW5pbmcgemlwaW1wb3J0LnppcGltcG9ydGVyIHJlbGF0ZWQgY2FjaGVkIGRhdGEKICAgIHRoYXQgbWlnaHQgc29tZWhvdyBsYXRlciBnZXQgdXNlZCB3aGVuIGF0dGVtcHRpbmcgdG8gbG9hZCBkYXRhIGZyb20gdGhlIG5ldwogICAgZGlzdHJpYnV0aW9uIGFuZCB0aHVzIGNhdXNlIHN1Y2ggbG9hZCBvcGVyYXRpb25zIHRvIGZhaWwuIE5vdGUgdGhhdCB3aGVuCiAgICB0cmFja2luZyBkb3duIHN1Y2ggcmVtYWluaW5nIHN0YWxlIGRhdGEsIHdlIGNhbiBub3QgY2F0Y2ggZXZlcnkgY29uY2VpdmFibGUKICAgIHVzYWdlIGZyb20gaGVyZSwgYW5kIHdlIGNsZWFyIG9ubHkgdGhvc2UgdGhhdCB3ZSBrbm93IG9mIGFuZCBoYXZlIGZvdW5kIHRvCiAgICBjYXVzZSBwcm9ibGVtcyBpZiBsZWZ0IGFsaXZlLiBBbnkgcmVtYWluaW5nIGNhY2hlcyBzaG91bGQgYmUgdXBkYXRlZCBieQogICAgd2hvbWV2ZXIgaXMgaW4gY2hhcmdlIG9mIG1haW50YWluaW5nIHRoZW0sIGkuZS4gdGhleSBzaG91bGQgYmUgcmVhZHkgdG8KICAgIGhhbmRsZSB1cyByZXBsYWNpbmcgdGhlaXIgemlwIGFyY2hpdmVzIHdpdGggbmV3IGRpc3RyaWJ1dGlvbnMgYXQgcnVudGltZS4KCiAgICAiIiIKICAgICMgVGhlcmUgYXJlIHNldmVyYWwgb3RoZXIga25vd24gc291cmNlcyBvZiBzdGFsZSB6aXBpbXBvcnQuemlwaW1wb3J0ZXIKICAgICMgaW5zdGFuY2VzIHRoYXQgd2UgZG8gbm90IGNsZWFyIGhlcmUsIGJ1dCBtaWdodCBpZiBldmVyIGdpdmVuIGEgcmVhc29uIHRvCiAgICAjIGRvIHNvOgogICAgIyAqIEdsb2JhbCBzZXR1cHRvb2xzIHBrZ19yZXNvdXJjZXMud29ya2luZ19zZXQgKGEuay5hLiAnbWFzdGVyIHdvcmtpbmcKICAgICMgc2V0JykgbWF5IGNvbnRhaW4gZGlzdHJpYnV0aW9ucyB3aGljaCBtYXkgaW4gdHVybiBjb250YWluIHRoZWlyCiAgICAjICAgemlwaW1wb3J0LnppcGltcG9ydGVyIGxvYWRlcnMuCiAgICAjICogU2V2ZXJhbCB6aXBpbXBvcnQuemlwaW1wb3J0ZXIgbG9hZGVycyBoZWxkIGJ5IGxvY2FsIHZhcmlhYmxlcyBmdXJ0aGVyCiAgICAjICAgdXAgdGhlIGZ1bmN0aW9uIGNhbGwgc3RhY2sgd2hlbiBydW5uaW5nIHRoZSBzZXR1cHRvb2xzIGluc3RhbGxhdGlvbi4KICAgICMgKiBBbHJlYWR5IGxvYWRlZCBtb2R1bGVzIG1heSBoYXZlIHRoZWlyIF9fbG9hZGVyX18gYXR0cmlidXRlIHNldCB0byB0aGUKICAgICMgICBleGFjdCBsb2FkZXIgaW5zdGFuY2UgdXNlZCB3aGVuIGltcG9ydGluZyB0aGVtLiBQeXRob24gMy40IGRvY3Mgc3RhdGUKICAgICMgICB0aGF0IHRoaXMgaW5mb3JtYXRpb24gaXMgaW50ZW5kZWQgbW9zdGx5IGZvciBpbnRyb3NwZWN0aW9uIGFuZCBzbyBpcwogICAgIyAgIG5vdCBleHBlY3RlZCB0byBjYXVzZSB1cyBwcm9ibGVtcy4KICAgIG5vcm1hbGl6ZWRfcGF0aCA9IG5vcm1hbGl6ZV9wYXRoKGRpc3RfcGF0aCkKICAgIF91bmNhY2hlKG5vcm1hbGl6ZWRfcGF0aCwgc3lzLnBhdGhfaW1wb3J0ZXJfY2FjaGUpCiAgICBpZiBmaXhfemlwaW1wb3J0ZXJfY2FjaGVzOgogICAgICAgIF9yZXBsYWNlX3ppcF9kaXJlY3RvcnlfY2FjaGVfZGF0YShub3JtYWxpemVkX3BhdGgpCiAgICBlbHNlOgogICAgICAgICMgSGVyZSwgZXZlbiB0aG91Z2ggd2UgZG8gbm90IHdhbnQgdG8gZml4IGV4aXN0aW5nIGFuZCBub3cgc3RhbGUKICAgICAgICAjIHppcGltcG9ydGVyIGNhY2hlIGluZm9ybWF0aW9uLCB3ZSBzdGlsbCB3YW50IHRvIHJlbW92ZSBpdC4gUmVsYXRlZCB0bwogICAgICAgICMgUHl0aG9uJ3MgemlwIGFyY2hpdmUgZGlyZWN0b3J5IGluZm9ybWF0aW9uIGNhY2hlLCB3ZSBjbGVhciBlYWNoIG9mCiAgICAgICAgIyBpdHMgc3RhbGUgZW50cmllcyBpbiB0d28gcGhhc2VzOgogICAgICAgICMgICAxLiBDbGVhciB0aGUgZW50cnkgc28gYXR0ZW1wdGluZyB0byBhY2Nlc3MgemlwIGFyY2hpdmUgaW5mb3JtYXRpb24KICAgICAgICAjICAgICAgdmlhIGFueSBleGlzdGluZyBzdGFsZSB6aXBpbXBvcnQuemlwaW1wb3J0ZXIgaW5zdGFuY2VzIGZhaWxzLgogICAgICAgICMgICAyLiBSZW1vdmUgdGhlIGVudHJ5IGZyb20gdGhlIGNhY2hlIHNvIGFueSBuZXdseSBjb25zdHJ1Y3RlZAogICAgICAgICMgICAgICB6aXBpbXBvcnQuemlwaW1wb3J0ZXIgaW5zdGFuY2VzIGRvIG5vdCBlbmQgdXAgdXNpbmcgb2xkIHN0YWxlCiAgICAgICAgIyAgICAgIHppcCBhcmNoaXZlIGRpcmVjdG9yeSBpbmZvcm1hdGlvbi4KICAgICAgICAjIFRoaXMgd2hvbGUgc3RhbGUgZGF0YSByZW1vdmFsIHN0ZXAgZG9lcyBub3Qgc2VlbSBzdHJpY3RseSBuZWNlc3NhcnksCiAgICAgICAgIyBidXQgaGFzIGJlZW4gbGVmdCBpbiBiZWNhdXNlIGl0IHdhcyBkb25lIGJlZm9yZSB3ZSBzdGFydGVkIHJlcGxhY2luZwogICAgICAgICMgdGhlIHppcCBhcmNoaXZlIGRpcmVjdG9yeSBpbmZvcm1hdGlvbiBjYWNoZSBjb250ZW50IGlmIHBvc3NpYmxlLCBhbmQKICAgICAgICAjIHRoZXJlIGFyZSBubyByZWxldmFudCB1bml0IHRlc3RzIHRoYXQgd2UgY2FuIGRlcGVuZCBvbiB0byB0ZWxsIHVzIGlmCiAgICAgICAgIyB0aGlzIGlzIHJlYWxseSBuZWVkZWQuCiAgICAgICAgX3JlbW92ZV9hbmRfY2xlYXJfemlwX2RpcmVjdG9yeV9jYWNoZV9kYXRhKG5vcm1hbGl6ZWRfcGF0aCkKCgpkZWYgX2NvbGxlY3RfemlwaW1wb3J0ZXJfY2FjaGVfZW50cmllcyhub3JtYWxpemVkX3BhdGgsIGNhY2hlKToKICAgICIiIgogICAgUmV0dXJuIHppcGltcG9ydGVyIGNhY2hlIGVudHJ5IGtleXMgcmVsYXRlZCB0byBhIGdpdmVuIG5vcm1hbGl6ZWQgcGF0aC4KCiAgICBBbHRlcm5hdGl2ZSBwYXRoIHNwZWxsaW5ncyAoZS5nLiB0aG9zZSB1c2luZyBkaWZmZXJlbnQgY2hhcmFjdGVyIGNhc2Ugb3IKICAgIHRob3NlIHVzaW5nIGFsdGVybmF0aXZlIHBhdGggc2VwYXJhdG9ycykgcmVsYXRlZCB0byB0aGUgc2FtZSBwYXRoIGFyZQogICAgaW5jbHVkZWQuIEFueSBzdWItcGF0aCBlbnRyaWVzIGFyZSBpbmNsdWRlZCBhcyB3ZWxsLCBpLmUuIHRob3NlCiAgICBjb3JyZXNwb25kaW5nIHRvIHppcCBhcmNoaXZlcyBlbWJlZGRlZCBpbiBvdGhlciB6aXAgYXJjaGl2ZXMuCgogICAgIiIiCiAgICByZXN1bHQgPSBbXQogICAgcHJlZml4X2xlbiA9IGxlbihub3JtYWxpemVkX3BhdGgpCiAgICBmb3IgcCBpbiBjYWNoZToKICAgICAgICBucCA9IG5vcm1hbGl6ZV9wYXRoKHApCiAgICAgICAgaWYgKG5wLnN0YXJ0c3dpdGgobm9ybWFsaXplZF9wYXRoKSBhbmQKICAgICAgICAgICAgICAgIG5wW3ByZWZpeF9sZW46cHJlZml4X2xlbiArIDFdIGluIChvcy5zZXAsICcnKSk6CiAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQocCkKICAgIHJldHVybiByZXN1bHQKCgpkZWYgX3VwZGF0ZV96aXBpbXBvcnRlcl9jYWNoZShub3JtYWxpemVkX3BhdGgsIGNhY2hlLCB1cGRhdGVyPU5vbmUpOgogICAgIiIiCiAgICBVcGRhdGUgemlwaW1wb3J0ZXIgY2FjaGUgZGF0YSBmb3IgYSBnaXZlbiBub3JtYWxpemVkIHBhdGguCgogICAgQW55IHN1Yi1wYXRoIGVudHJpZXMgYXJlIHByb2Nlc3NlZCBhcyB3ZWxsLCBpLmUuIHRob3NlIGNvcnJlc3BvbmRpbmcgdG8gemlwCiAgICBhcmNoaXZlcyBlbWJlZGRlZCBpbiBvdGhlciB6aXAgYXJjaGl2ZXMuCgogICAgR2l2ZW4gdXBkYXRlciBpcyBhIGNhbGxhYmxlIHRha2luZyBhIGNhY2hlIGVudHJ5IGtleSBhbmQgdGhlIG9yaWdpbmFsIGVudHJ5CiAgICAoYWZ0ZXIgYWxyZWFkeSByZW1vdmluZyB0aGUgZW50cnkgZnJvbSB0aGUgY2FjaGUpLCBhbmQgZXhwZWN0ZWQgdG8gdXBkYXRlCiAgICB0aGUgZW50cnkgYW5kIHBvc3NpYmx5IHJldHVybiBhIG5ldyBvbmUgdG8gYmUgaW5zZXJ0ZWQgaW4gaXRzIHBsYWNlLgogICAgUmV0dXJuaW5nIE5vbmUgaW5kaWNhdGVzIHRoYXQgdGhlIGVudHJ5IHNob3VsZCBub3QgYmUgcmVwbGFjZWQgd2l0aCBhIG5ldwogICAgb25lLiBJZiBubyB1cGRhdGVyIGlzIGdpdmVuLCB0aGUgY2FjaGUgZW50cmllcyBhcmUgc2ltcGx5IHJlbW92ZWQgd2l0aG91dAogICAgYW55IGFkZGl0aW9uYWwgcHJvY2Vzc2luZywgdGhlIHNhbWUgYXMgaWYgdGhlIHVwZGF0ZXIgc2ltcGx5IHJldHVybmVkIE5vbmUuCgogICAgIiIiCiAgICBmb3IgcCBpbiBfY29sbGVjdF96aXBpbXBvcnRlcl9jYWNoZV9lbnRyaWVzKG5vcm1hbGl6ZWRfcGF0aCwgY2FjaGUpOgogICAgICAgICMgTi5CLiBweXB5J3MgY3VzdG9tIHppcGltcG9ydC5femlwX2RpcmVjdG9yeV9jYWNoZSBpbXBsZW1lbnRhdGlvbiBkb2VzCiAgICAgICAgIyBub3Qgc3VwcG9ydCB0aGUgY29tcGxldGUgZGljdCBpbnRlcmZhY2U6CiAgICAgICAgIyAqIERvZXMgbm90IHN1cHBvcnQgaXRlbSBhc3NpZ25tZW50LCB0aHVzIG5vdCBhbGxvd2luZyB0aGlzIGZ1bmN0aW9uCiAgICAgICAgIyAgICB0byBiZSB1c2VkIG9ubHkgZm9yIHJlbW92aW5nIGV4aXN0aW5nIGNhY2hlIGVudHJpZXMuCiAgICAgICAgIyAgKiBEb2VzIG5vdCBzdXBwb3J0IHRoZSBkaWN0LnBvcCgpIG1ldGhvZCwgZm9yY2luZyB1cyB0byB1c2UgdGhlCiAgICAgICAgIyAgICBnZXQvZGVsIHBhdHRlcm5zIGluc3RlYWQuIEZvciBtb3JlIGRldGFpbGVkIGluZm9ybWF0aW9uIHNlZSB0aGUKICAgICAgICAjICAgIGZvbGxvd2luZyBsaW5rczoKICAgICAgICAjICAgICAgaHR0cHM6Ly9naXRodWIuY29tL3B5cGEvc2V0dXB0b29scy9pc3N1ZXMvMjAyI2lzc3VlY29tbWVudC0yMDI5MTM0MjAKICAgICAgICAjICAgICAgaHR0cDovL2JpdC5seS8yaDlpdEpYCiAgICAgICAgb2xkX2VudHJ5ID0gY2FjaGVbcF0KICAgICAgICBkZWwgY2FjaGVbcF0KICAgICAgICBuZXdfZW50cnkgPSB1cGRhdGVyIGFuZCB1cGRhdGVyKHAsIG9sZF9lbnRyeSkKICAgICAgICBpZiBuZXdfZW50cnkgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGNhY2hlW3BdID0gbmV3X2VudHJ5CgoKZGVmIF91bmNhY2hlKG5vcm1hbGl6ZWRfcGF0aCwgY2FjaGUpOgogICAgX3VwZGF0ZV96aXBpbXBvcnRlcl9jYWNoZShub3JtYWxpemVkX3BhdGgsIGNhY2hlKQoKCmRlZiBfcmVtb3ZlX2FuZF9jbGVhcl96aXBfZGlyZWN0b3J5X2NhY2hlX2RhdGEobm9ybWFsaXplZF9wYXRoKToKICAgIGRlZiBjbGVhcl9hbmRfcmVtb3ZlX2NhY2hlZF96aXBfYXJjaGl2ZV9kaXJlY3RvcnlfZGF0YShwYXRoLCBvbGRfZW50cnkpOgogICAgICAgIG9sZF9lbnRyeS5jbGVhcigpCgogICAgX3VwZGF0ZV96aXBpbXBvcnRlcl9jYWNoZSgKICAgICAgICBub3JtYWxpemVkX3BhdGgsIHppcGltcG9ydC5femlwX2RpcmVjdG9yeV9jYWNoZSwKICAgICAgICB1cGRhdGVyPWNsZWFyX2FuZF9yZW1vdmVfY2FjaGVkX3ppcF9hcmNoaXZlX2RpcmVjdG9yeV9kYXRhKQoKCiMgUHlQeSBQeXRob24gaW1wbGVtZW50YXRpb24gZG9lcyBub3QgYWxsb3cgZGlyZWN0bHkgd3JpdGluZyB0byB0aGUKIyB6aXBpbXBvcnQuX3ppcF9kaXJlY3RvcnlfY2FjaGUgYW5kIHNvIHByZXZlbnRzIHVzIGZyb20gYXR0ZW1wdGluZyB0byBjb3JyZWN0CiMgaXRzIGNvbnRlbnQuIFRoZSBiZXN0IHdlIGNhbiBkbyB0aGVyZSBpcyBjbGVhciB0aGUgcHJvYmxlbWF0aWMgY2FjaGUgY29udGVudAojIGFuZCBoYXZlIFB5UHkgcmVwb3B1bGF0ZSBpdCBhcyBuZWVkZWQuIFRoZSBkb3duc2lkZSBpcyB0aGF0IGlmIHRoZXJlIGFyZSBhbnkKIyBzdGFsZSB6aXBpbXBvcnQuemlwaW1wb3J0ZXIgaW5zdGFuY2VzIGxheWluZyBhcm91bmQsIGF0dGVtcHRpbmcgdG8gdXNlIHRoZW0KIyB3aWxsIGZhaWwgZHVlIHRvIG5vdCBoYXZpbmcgaXRzIHppcCBhcmNoaXZlIGRpcmVjdG9yeSBpbmZvcm1hdGlvbiBhdmFpbGFibGUKIyBpbnN0ZWFkIG9mIGJlaW5nIGF1dG9tYXRpY2FsbHkgY29ycmVjdGVkIHRvIHVzZSB0aGUgbmV3IGNvcnJlY3QgemlwIGFyY2hpdmUKIyBkaXJlY3RvcnkgaW5mb3JtYXRpb24uCmlmICdfX3B5cHlfXycgaW4gc3lzLmJ1aWx0aW5fbW9kdWxlX25hbWVzOgogICAgX3JlcGxhY2VfemlwX2RpcmVjdG9yeV9jYWNoZV9kYXRhID0gXAogICAgICAgIF9yZW1vdmVfYW5kX2NsZWFyX3ppcF9kaXJlY3RvcnlfY2FjaGVfZGF0YQplbHNlOgoKICAgIGRlZiBfcmVwbGFjZV96aXBfZGlyZWN0b3J5X2NhY2hlX2RhdGEobm9ybWFsaXplZF9wYXRoKToKICAgICAgICBkZWYgcmVwbGFjZV9jYWNoZWRfemlwX2FyY2hpdmVfZGlyZWN0b3J5X2RhdGEocGF0aCwgb2xkX2VudHJ5KToKICAgICAgICAgICAgIyBOLkIuIEluIHRoZW9yeSwgd2UgY291bGQgbG9hZCB0aGUgemlwIGRpcmVjdG9yeSBpbmZvcm1hdGlvbiBqdXN0CiAgICAgICAgICAgICMgb25jZSBmb3IgYWxsIHVwZGF0ZWQgcGF0aCBzcGVsbGluZ3MsIGFuZCB0aGVuIGNvcHkgaXQgbG9jYWxseSBhbmQKICAgICAgICAgICAgIyB1cGRhdGUgaXRzIGNvbnRhaW5lZCBwYXRoIHN0cmluZ3MgdG8gY29udGFpbiB0aGUgY29ycmVjdAogICAgICAgICAgICAjIHNwZWxsaW5nLCBidXQgdGhhdCBzZWVtcyBsaWtlIGEgd2F5IHRvbyBpbnZhc2l2ZSBtb3ZlICh0aGlzIGNhY2hlCiAgICAgICAgICAgICMgc3RydWN0dXJlIGlzIG5vdCBvZmZpY2lhbGx5IGRvY3VtZW50ZWQgYW55d2hlcmUgYW5kIGNvdWxkIGluCiAgICAgICAgICAgICMgdGhlb3J5IGNoYW5nZSB3aXRoIG5ldyBQeXRob24gcmVsZWFzZXMpIGZvciBubyBzaWduaWZpY2FudAogICAgICAgICAgICAjIGJlbmVmaXQuCiAgICAgICAgICAgIG9sZF9lbnRyeS5jbGVhcigpCiAgICAgICAgICAgIHppcGltcG9ydC56aXBpbXBvcnRlcihwYXRoKQogICAgICAgICAgICBvbGRfZW50cnkudXBkYXRlKHppcGltcG9ydC5femlwX2RpcmVjdG9yeV9jYWNoZVtwYXRoXSkKICAgICAgICAgICAgcmV0dXJuIG9sZF9lbnRyeQoKICAgICAgICBfdXBkYXRlX3ppcGltcG9ydGVyX2NhY2hlKAogICAgICAgICAgICBub3JtYWxpemVkX3BhdGgsIHppcGltcG9ydC5femlwX2RpcmVjdG9yeV9jYWNoZSwKICAgICAgICAgICAgdXBkYXRlcj1yZXBsYWNlX2NhY2hlZF96aXBfYXJjaGl2ZV9kaXJlY3RvcnlfZGF0YSkKCgpkZWYgaXNfcHl0aG9uKHRleHQsIGZpbGVuYW1lPSc8c3RyaW5nPicpOgogICAgIklzIHRoaXMgc3RyaW5nIGEgdmFsaWQgUHl0aG9uIHNjcmlwdD8iCiAgICB0cnk6CiAgICAgICAgY29tcGlsZSh0ZXh0LCBmaWxlbmFtZSwgJ2V4ZWMnKQogICAgZXhjZXB0IChTeW50YXhFcnJvciwgVHlwZUVycm9yKToKICAgICAgICByZXR1cm4gRmFsc2UKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIFRydWUKCgpkZWYgaXNfc2goZXhlY3V0YWJsZSk6CiAgICAiIiJEZXRlcm1pbmUgaWYgdGhlIHNwZWNpZmllZCBleGVjdXRhYmxlIGlzIGEgLnNoIChjb250YWlucyBhICMhIGxpbmUpIiIiCiAgICB0cnk6CiAgICAgICAgd2l0aCBpby5vcGVuKGV4ZWN1dGFibGUsIGVuY29kaW5nPSdsYXRpbi0xJykgYXMgZnA6CiAgICAgICAgICAgIG1hZ2ljID0gZnAucmVhZCgyKQogICAgZXhjZXB0IChPU0Vycm9yLCBJT0Vycm9yKToKICAgICAgICByZXR1cm4gZXhlY3V0YWJsZQogICAgcmV0dXJuIG1hZ2ljID09ICcjIScKCgpkZWYgbnRfcXVvdGVfYXJnKGFyZyk6CiAgICAiIiJRdW90ZSBhIGNvbW1hbmQgbGluZSBhcmd1bWVudCBhY2NvcmRpbmcgdG8gV2luZG93cyBwYXJzaW5nIHJ1bGVzIiIiCiAgICByZXR1cm4gc3VicHJvY2Vzcy5saXN0MmNtZGxpbmUoW2FyZ10pCgoKZGVmIGlzX3B5dGhvbl9zY3JpcHQoc2NyaXB0X3RleHQsIGZpbGVuYW1lKToKICAgICIiIklzIHRoaXMgdGV4dCwgYXMgYSB3aG9sZSwgYSBQeXRob24gc2NyaXB0PyAoYXMgb3Bwb3NlZCB0byBzaGVsbC9iYXQvZXRjLgogICAgIiIiCiAgICBpZiBmaWxlbmFtZS5lbmRzd2l0aCgnLnB5Jykgb3IgZmlsZW5hbWUuZW5kc3dpdGgoJy5weXcnKToKICAgICAgICByZXR1cm4gVHJ1ZSAgIyBleHRlbnNpb24gc2F5cyBpdCdzIFB5dGhvbgogICAgaWYgaXNfcHl0aG9uKHNjcmlwdF90ZXh0LCBmaWxlbmFtZSk6CiAgICAgICAgcmV0dXJuIFRydWUgICMgaXQncyBzeW50YWN0aWNhbGx5IHZhbGlkIFB5dGhvbgogICAgaWYgc2NyaXB0X3RleHQuc3RhcnRzd2l0aCgnIyEnKToKICAgICAgICAjIEl0IGJlZ2lucyB3aXRoIGEgJyMhJyBsaW5lLCBzbyBjaGVjayBpZiAncHl0aG9uJyBpcyBpbiBpdCBzb21ld2hlcmUKICAgICAgICByZXR1cm4gJ3B5dGhvbicgaW4gc2NyaXB0X3RleHQuc3BsaXRsaW5lcygpWzBdLmxvd2VyKCkKCiAgICByZXR1cm4gRmFsc2UgICMgTm90IGFueSBQeXRob24gSSBjYW4gcmVjb2duaXplCgoKdHJ5OgogICAgZnJvbSBvcyBpbXBvcnQgY2htb2QgYXMgX2NobW9kCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICMgSnl0aG9uIGNvbXBhdGliaWxpdHkKICAgIGRlZiBfY2htb2QoKmFyZ3MpOgogICAgICAgIHBhc3MKCgpkZWYgY2htb2QocGF0aCwgbW9kZSk6CiAgICBsb2cuZGVidWcoImNoYW5naW5nIG1vZGUgb2YgJXMgdG8gJW8iLCBwYXRoLCBtb2RlKQogICAgdHJ5OgogICAgICAgIF9jaG1vZChwYXRoLCBtb2RlKQogICAgZXhjZXB0IG9zLmVycm9yIGFzIGU6CiAgICAgICAgbG9nLmRlYnVnKCJjaG1vZCBmYWlsZWQ6ICVzIiwgZSkKCgpjbGFzcyBDb21tYW5kU3BlYyhsaXN0KToKICAgICIiIgogICAgQSBjb21tYW5kIHNwZWMgZm9yIGEgIyEgaGVhZGVyLCBzcGVjaWZpZWQgYXMgYSBsaXN0IG9mIGFyZ3VtZW50cyBha2luIHRvCiAgICB0aG9zZSBwYXNzZWQgdG8gUG9wZW4uCiAgICAiIiIKCiAgICBvcHRpb25zID0gW10KICAgIHNwbGl0X2FyZ3MgPSBkaWN0KCkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBiZXN0KGNscyk6CiAgICAgICAgIiIiCiAgICAgICAgQ2hvb3NlIHRoZSBiZXN0IENvbW1hbmRTcGVjIGNsYXNzIGJhc2VkIG9uIGVudmlyb25tZW50YWwgY29uZGl0aW9ucy4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gY2xzCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX3N5c19leGVjdXRhYmxlKGNscyk6CiAgICAgICAgX2RlZmF1bHQgPSBvcy5wYXRoLm5vcm1wYXRoKHN5cy5leGVjdXRhYmxlKQogICAgICAgIHJldHVybiBvcy5lbnZpcm9uLmdldCgnX19QWVZFTlZfTEFVTkNIRVJfXycsIF9kZWZhdWx0KQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGZyb21fcGFyYW0oY2xzLCBwYXJhbSk6CiAgICAgICAgIiIiCiAgICAgICAgQ29uc3RydWN0IGEgQ29tbWFuZFNwZWMgZnJvbSBhIHBhcmFtZXRlciB0byBidWlsZF9zY3JpcHRzLCB3aGljaCBtYXkKICAgICAgICBiZSBOb25lLgogICAgICAgICIiIgogICAgICAgIGlmIGlzaW5zdGFuY2UocGFyYW0sIGNscyk6CiAgICAgICAgICAgIHJldHVybiBwYXJhbQogICAgICAgIGlmIGlzaW5zdGFuY2UocGFyYW0sIGxpc3QpOgogICAgICAgICAgICByZXR1cm4gY2xzKHBhcmFtKQogICAgICAgIGlmIHBhcmFtIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybiBjbHMuZnJvbV9lbnZpcm9ubWVudCgpCiAgICAgICAgIyBvdGhlcndpc2UsIGFzc3VtZSBpdCdzIGEgc3RyaW5nLgogICAgICAgIHJldHVybiBjbHMuZnJvbV9zdHJpbmcocGFyYW0pCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgZnJvbV9lbnZpcm9ubWVudChjbHMpOgogICAgICAgIHJldHVybiBjbHMoW2Nscy5fc3lzX2V4ZWN1dGFibGUoKV0pCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgZnJvbV9zdHJpbmcoY2xzLCBzdHJpbmcpOgogICAgICAgICIiIgogICAgICAgIENvbnN0cnVjdCBhIGNvbW1hbmQgc3BlYyBmcm9tIGEgc2ltcGxlIHN0cmluZyByZXByZXNlbnRpbmcgYSBjb21tYW5kCiAgICAgICAgbGluZSBwYXJzZWFibGUgYnkgc2hsZXguc3BsaXQuCiAgICAgICAgIiIiCiAgICAgICAgaXRlbXMgPSBzaGxleC5zcGxpdChzdHJpbmcsICoqY2xzLnNwbGl0X2FyZ3MpCiAgICAgICAgcmV0dXJuIGNscyhpdGVtcykKCiAgICBkZWYgaW5zdGFsbF9vcHRpb25zKHNlbGYsIHNjcmlwdF90ZXh0KToKICAgICAgICBzZWxmLm9wdGlvbnMgPSBzaGxleC5zcGxpdChzZWxmLl9leHRyYWN0X29wdGlvbnMoc2NyaXB0X3RleHQpKQogICAgICAgIGNtZGxpbmUgPSBzdWJwcm9jZXNzLmxpc3QyY21kbGluZShzZWxmKQogICAgICAgIGlmIG5vdCBpc2FzY2lpKGNtZGxpbmUpOgogICAgICAgICAgICBzZWxmLm9wdGlvbnNbOjBdID0gWycteCddCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9leHRyYWN0X29wdGlvbnMob3JpZ19zY3JpcHQpOgogICAgICAgICIiIgogICAgICAgIEV4dHJhY3QgYW55IG9wdGlvbnMgZnJvbSB0aGUgZmlyc3QgbGluZSBvZiB0aGUgc2NyaXB0LgogICAgICAgICIiIgogICAgICAgIGZpcnN0ID0gKG9yaWdfc2NyaXB0ICsgJ1xuJykuc3BsaXRsaW5lcygpWzBdCiAgICAgICAgbWF0Y2ggPSBfZmlyc3RfbGluZV9yZSgpLm1hdGNoKGZpcnN0KQogICAgICAgIG9wdGlvbnMgPSBtYXRjaC5ncm91cCgxKSBvciAnJyBpZiBtYXRjaCBlbHNlICcnCiAgICAgICAgcmV0dXJuIG9wdGlvbnMuc3RyaXAoKQoKICAgIGRlZiBhc19oZWFkZXIoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3JlbmRlcihzZWxmICsgbGlzdChzZWxmLm9wdGlvbnMpKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfc3RyaXBfcXVvdGVzKGl0ZW0pOgogICAgICAgIF9RVU9URVMgPSAnIlwnJwogICAgICAgIGZvciBxIGluIF9RVU9URVM6CiAgICAgICAgICAgIGlmIGl0ZW0uc3RhcnRzd2l0aChxKSBhbmQgaXRlbS5lbmRzd2l0aChxKToKICAgICAgICAgICAgICAgIHJldHVybiBpdGVtWzE6LTFdCiAgICAgICAgcmV0dXJuIGl0ZW0KCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX3JlbmRlcihpdGVtcyk6CiAgICAgICAgY21kbGluZSA9IHN1YnByb2Nlc3MubGlzdDJjbWRsaW5lKAogICAgICAgICAgICBDb21tYW5kU3BlYy5fc3RyaXBfcXVvdGVzKGl0ZW0uc3RyaXAoKSkgZm9yIGl0ZW0gaW4gaXRlbXMpCiAgICAgICAgcmV0dXJuICcjIScgKyBjbWRsaW5lICsgJ1xuJwoKCiMgRm9yIHBiciBjb21wYXQ7IHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uLgpzeXNfZXhlY3V0YWJsZSA9IENvbW1hbmRTcGVjLl9zeXNfZXhlY3V0YWJsZSgpCgoKY2xhc3MgV2luZG93c0NvbW1hbmRTcGVjKENvbW1hbmRTcGVjKToKICAgIHNwbGl0X2FyZ3MgPSBkaWN0KHBvc2l4PUZhbHNlKQoKCmNsYXNzIFNjcmlwdFdyaXRlcjoKICAgICIiIgogICAgRW5jYXBzdWxhdGVzIGJlaGF2aW9yIGFyb3VuZCB3cml0aW5nIGVudHJ5IHBvaW50IHNjcmlwdHMgZm9yIGNvbnNvbGUgYW5kCiAgICBndWkgYXBwcy4KICAgICIiIgoKICAgIHRlbXBsYXRlID0gdGV4dHdyYXAuZGVkZW50KHIiIiIKICAgICAgICAjIEVBU1ktSU5TVEFMTC1FTlRSWS1TQ1JJUFQ6ICUoc3BlYylyLCUoZ3JvdXApciwlKG5hbWUpcgogICAgICAgIF9fcmVxdWlyZXNfXyA9ICUoc3BlYylyCiAgICAgICAgaW1wb3J0IHJlCiAgICAgICAgaW1wb3J0IHN5cwogICAgICAgIGZyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgbG9hZF9lbnRyeV9wb2ludAoKICAgICAgICBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgICAgICAgICBzeXMuYXJndlswXSA9IHJlLnN1YihyJygtc2NyaXB0XC5weXc/fFwuZXhlKT8kJywgJycsIHN5cy5hcmd2WzBdKQogICAgICAgICAgICBzeXMuZXhpdCgKICAgICAgICAgICAgICAgIGxvYWRfZW50cnlfcG9pbnQoJShzcGVjKXIsICUoZ3JvdXApciwgJShuYW1lKXIpKCkKICAgICAgICAgICAgKQogICAgIiIiKS5sc3RyaXAoKQoKICAgIGNvbW1hbmRfc3BlY19jbGFzcyA9IENvbW1hbmRTcGVjCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgZ2V0X3NjcmlwdF9hcmdzKGNscywgZGlzdCwgZXhlY3V0YWJsZT1Ob25lLCB3aW5pbnN0PUZhbHNlKToKICAgICAgICAjIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CiAgICAgICAgd2FybmluZ3Mud2FybigiVXNlIGdldF9hcmdzIiwgRWFzeUluc3RhbGxEZXByZWNhdGlvbldhcm5pbmcpCiAgICAgICAgd3JpdGVyID0gKFdpbmRvd3NTY3JpcHRXcml0ZXIgaWYgd2luaW5zdCBlbHNlIFNjcmlwdFdyaXRlcikuYmVzdCgpCiAgICAgICAgaGVhZGVyID0gY2xzLmdldF9zY3JpcHRfaGVhZGVyKCIiLCBleGVjdXRhYmxlLCB3aW5pbnN0KQogICAgICAgIHJldHVybiB3cml0ZXIuZ2V0X2FyZ3MoZGlzdCwgaGVhZGVyKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGdldF9zY3JpcHRfaGVhZGVyKGNscywgc2NyaXB0X3RleHQsIGV4ZWN1dGFibGU9Tm9uZSwgd2luaW5zdD1GYWxzZSk6CiAgICAgICAgIyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eQogICAgICAgIHdhcm5pbmdzLndhcm4oIlVzZSBnZXRfaGVhZGVyIiwgRWFzeUluc3RhbGxEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9MikKICAgICAgICBpZiB3aW5pbnN0OgogICAgICAgICAgICBleGVjdXRhYmxlID0gInB5dGhvbi5leGUiCiAgICAgICAgcmV0dXJuIGNscy5nZXRfaGVhZGVyKHNjcmlwdF90ZXh0LCBleGVjdXRhYmxlKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGdldF9hcmdzKGNscywgZGlzdCwgaGVhZGVyPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIFlpZWxkIHdyaXRlX3NjcmlwdCgpIGFyZ3VtZW50IHR1cGxlcyBmb3IgYSBkaXN0cmlidXRpb24ncwogICAgICAgIGNvbnNvbGVfc2NyaXB0cyBhbmQgZ3VpX3NjcmlwdHMgZW50cnkgcG9pbnRzLgogICAgICAgICIiIgogICAgICAgIGlmIGhlYWRlciBpcyBOb25lOgogICAgICAgICAgICBoZWFkZXIgPSBjbHMuZ2V0X2hlYWRlcigpCiAgICAgICAgc3BlYyA9IHN0cihkaXN0LmFzX3JlcXVpcmVtZW50KCkpCiAgICAgICAgZm9yIHR5cGVfIGluICdjb25zb2xlJywgJ2d1aSc6CiAgICAgICAgICAgIGdyb3VwID0gdHlwZV8gKyAnX3NjcmlwdHMnCiAgICAgICAgICAgIGZvciBuYW1lLCBlcCBpbiBkaXN0LmdldF9lbnRyeV9tYXAoZ3JvdXApLml0ZW1zKCk6CiAgICAgICAgICAgICAgICBjbHMuX2Vuc3VyZV9zYWZlX25hbWUobmFtZSkKICAgICAgICAgICAgICAgIHNjcmlwdF90ZXh0ID0gY2xzLnRlbXBsYXRlICUgbG9jYWxzKCkKICAgICAgICAgICAgICAgIGFyZ3MgPSBjbHMuX2dldF9zY3JpcHRfYXJncyh0eXBlXywgbmFtZSwgaGVhZGVyLCBzY3JpcHRfdGV4dCkKICAgICAgICAgICAgICAgIGZvciByZXMgaW4gYXJnczoKICAgICAgICAgICAgICAgICAgICB5aWVsZCByZXMKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX2Vuc3VyZV9zYWZlX25hbWUobmFtZSk6CiAgICAgICAgIiIiCiAgICAgICAgUHJldmVudCBwYXRocyBpbiAqX3NjcmlwdHMgZW50cnkgcG9pbnQgbmFtZXMuCiAgICAgICAgIiIiCiAgICAgICAgaGFzX3BhdGhfc2VwID0gcmUuc2VhcmNoKHInW1xcL10nLCBuYW1lKQogICAgICAgIGlmIGhhc19wYXRoX3NlcDoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiUGF0aCBzZXBhcmF0b3JzIG5vdCBhbGxvd2VkIGluIHNjcmlwdCBuYW1lcyIpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgZ2V0X3dyaXRlcihjbHMsIGZvcmNlX3dpbmRvd3MpOgogICAgICAgICMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKICAgICAgICB3YXJuaW5ncy53YXJuKCJVc2UgYmVzdCIsIEVhc3lJbnN0YWxsRGVwcmVjYXRpb25XYXJuaW5nKQogICAgICAgIHJldHVybiBXaW5kb3dzU2NyaXB0V3JpdGVyLmJlc3QoKSBpZiBmb3JjZV93aW5kb3dzIGVsc2UgY2xzLmJlc3QoKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGJlc3QoY2xzKToKICAgICAgICAiIiIKICAgICAgICBTZWxlY3QgdGhlIGJlc3QgU2NyaXB0V3JpdGVyIGZvciB0aGlzIGVudmlyb25tZW50LgogICAgICAgICIiIgogICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnd2luMzInIG9yIChvcy5uYW1lID09ICdqYXZhJyBhbmQgb3MuX25hbWUgPT0gJ250Jyk6CiAgICAgICAgICAgIHJldHVybiBXaW5kb3dzU2NyaXB0V3JpdGVyLmJlc3QoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBjbHMKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfZ2V0X3NjcmlwdF9hcmdzKGNscywgdHlwZV8sIG5hbWUsIGhlYWRlciwgc2NyaXB0X3RleHQpOgogICAgICAgICMgU2ltcGx5IHdyaXRlIHRoZSBzdHViIHdpdGggbm8gZXh0ZW5zaW9uLgogICAgICAgIHlpZWxkIChuYW1lLCBoZWFkZXIgKyBzY3JpcHRfdGV4dCkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBnZXRfaGVhZGVyKGNscywgc2NyaXB0X3RleHQ9IiIsIGV4ZWN1dGFibGU9Tm9uZSk6CiAgICAgICAgIiIiQ3JlYXRlIGEgIyEgbGluZSwgZ2V0dGluZyBvcHRpb25zIChpZiBhbnkpIGZyb20gc2NyaXB0X3RleHQiIiIKICAgICAgICBjbWQgPSBjbHMuY29tbWFuZF9zcGVjX2NsYXNzLmJlc3QoKS5mcm9tX3BhcmFtKGV4ZWN1dGFibGUpCiAgICAgICAgY21kLmluc3RhbGxfb3B0aW9ucyhzY3JpcHRfdGV4dCkKICAgICAgICByZXR1cm4gY21kLmFzX2hlYWRlcigpCgoKY2xhc3MgV2luZG93c1NjcmlwdFdyaXRlcihTY3JpcHRXcml0ZXIpOgogICAgY29tbWFuZF9zcGVjX2NsYXNzID0gV2luZG93c0NvbW1hbmRTcGVjCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgZ2V0X3dyaXRlcihjbHMpOgogICAgICAgICMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKICAgICAgICB3YXJuaW5ncy53YXJuKCJVc2UgYmVzdCIsIEVhc3lJbnN0YWxsRGVwcmVjYXRpb25XYXJuaW5nKQogICAgICAgIHJldHVybiBjbHMuYmVzdCgpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgYmVzdChjbHMpOgogICAgICAgICIiIgogICAgICAgIFNlbGVjdCB0aGUgYmVzdCBTY3JpcHRXcml0ZXIgc3VpdGFibGUgZm9yIFdpbmRvd3MKICAgICAgICAiIiIKICAgICAgICB3cml0ZXJfbG9va3VwID0gZGljdCgKICAgICAgICAgICAgZXhlY3V0YWJsZT1XaW5kb3dzRXhlY3V0YWJsZUxhdW5jaGVyV3JpdGVyLAogICAgICAgICAgICBuYXR1cmFsPWNscywKICAgICAgICApCiAgICAgICAgIyBmb3IgY29tcGF0aWJpbGl0eSwgdXNlIHRoZSBleGVjdXRhYmxlIGxhdW5jaGVyIGJ5IGRlZmF1bHQKICAgICAgICBsYXVuY2hlciA9IG9zLmVudmlyb24uZ2V0KCdTRVRVUFRPT0xTX0xBVU5DSEVSJywgJ2V4ZWN1dGFibGUnKQogICAgICAgIHJldHVybiB3cml0ZXJfbG9va3VwW2xhdW5jaGVyXQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9nZXRfc2NyaXB0X2FyZ3MoY2xzLCB0eXBlXywgbmFtZSwgaGVhZGVyLCBzY3JpcHRfdGV4dCk6CiAgICAgICAgIkZvciBXaW5kb3dzLCBhZGQgYSAucHkgZXh0ZW5zaW9uIgogICAgICAgIGV4dCA9IGRpY3QoY29uc29sZT0nLnB5YScsIGd1aT0nLnB5dycpW3R5cGVfXQogICAgICAgIGlmIGV4dCBub3QgaW4gb3MuZW52aXJvblsnUEFUSEVYVCddLmxvd2VyKCkuc3BsaXQoJzsnKToKICAgICAgICAgICAgbXNnID0gKAogICAgICAgICAgICAgICAgIntleHR9IG5vdCBsaXN0ZWQgaW4gUEFUSEVYVDsgc2NyaXB0cyB3aWxsIG5vdCBiZSAiCiAgICAgICAgICAgICAgICAicmVjb2duaXplZCBhcyBleGVjdXRhYmxlcy4iCiAgICAgICAgICAgICkuZm9ybWF0KCoqbG9jYWxzKCkpCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4obXNnLCBVc2VyV2FybmluZykKICAgICAgICBvbGQgPSBbJy5weWEnLCAnLnB5JywgJy1zY3JpcHQucHknLCAnLnB5YycsICcucHlvJywgJy5weXcnLCAnLmV4ZSddCiAgICAgICAgb2xkLnJlbW92ZShleHQpCiAgICAgICAgaGVhZGVyID0gY2xzLl9hZGp1c3RfaGVhZGVyKHR5cGVfLCBoZWFkZXIpCiAgICAgICAgYmxvY2tlcnMgPSBbbmFtZSArIHggZm9yIHggaW4gb2xkXQogICAgICAgIHlpZWxkIG5hbWUgKyBleHQsIGhlYWRlciArIHNjcmlwdF90ZXh0LCAndCcsIGJsb2NrZXJzCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX2FkanVzdF9oZWFkZXIoY2xzLCB0eXBlXywgb3JpZ19oZWFkZXIpOgogICAgICAgICIiIgogICAgICAgIE1ha2Ugc3VyZSAncHl0aG9udycgaXMgdXNlZCBmb3IgZ3VpIGFuZCBhbmQgJ3B5dGhvbicgaXMgdXNlZCBmb3IKICAgICAgICBjb25zb2xlIChyZWdhcmRsZXNzIG9mIHdoYXQgc3lzLmV4ZWN1dGFibGUgaXMpLgogICAgICAgICIiIgogICAgICAgIHBhdHRlcm4gPSAncHl0aG9udy5leGUnCiAgICAgICAgcmVwbCA9ICdweXRob24uZXhlJwogICAgICAgIGlmIHR5cGVfID09ICdndWknOgogICAgICAgICAgICBwYXR0ZXJuLCByZXBsID0gcmVwbCwgcGF0dGVybgogICAgICAgIHBhdHRlcm5fb2IgPSByZS5jb21waWxlKHJlLmVzY2FwZShwYXR0ZXJuKSwgcmUuSUdOT1JFQ0FTRSkKICAgICAgICBuZXdfaGVhZGVyID0gcGF0dGVybl9vYi5zdWIoc3RyaW5nPW9yaWdfaGVhZGVyLCByZXBsPXJlcGwpCiAgICAgICAgcmV0dXJuIG5ld19oZWFkZXIgaWYgY2xzLl91c2VfaGVhZGVyKG5ld19oZWFkZXIpIGVsc2Ugb3JpZ19oZWFkZXIKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX3VzZV9oZWFkZXIobmV3X2hlYWRlcik6CiAgICAgICAgIiIiCiAgICAgICAgU2hvdWxkIF9hZGp1c3RfaGVhZGVyIHVzZSB0aGUgcmVwbGFjZWQgaGVhZGVyPwoKICAgICAgICBPbiBub24td2luZG93cyBzeXN0ZW1zLCBhbHdheXMgdXNlLiBPbgogICAgICAgIFdpbmRvd3Mgc3lzdGVtcywgb25seSB1c2UgdGhlIHJlcGxhY2VkIGhlYWRlciBpZiBpdCByZXNvbHZlcwogICAgICAgIHRvIGFuIGV4ZWN1dGFibGUgb24gdGhlIHN5c3RlbS4KICAgICAgICAiIiIKICAgICAgICBjbGVhbl9oZWFkZXIgPSBuZXdfaGVhZGVyWzI6LTFdLnN0cmlwKCciJykKICAgICAgICByZXR1cm4gc3lzLnBsYXRmb3JtICE9ICd3aW4zMicgb3IgZmluZF9leGVjdXRhYmxlKGNsZWFuX2hlYWRlcikKCgpjbGFzcyBXaW5kb3dzRXhlY3V0YWJsZUxhdW5jaGVyV3JpdGVyKFdpbmRvd3NTY3JpcHRXcml0ZXIpOgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX2dldF9zY3JpcHRfYXJncyhjbHMsIHR5cGVfLCBuYW1lLCBoZWFkZXIsIHNjcmlwdF90ZXh0KToKICAgICAgICAiIiIKICAgICAgICBGb3IgV2luZG93cywgYWRkIGEgLnB5IGV4dGVuc2lvbiBhbmQgYW4gLmV4ZSBsYXVuY2hlcgogICAgICAgICIiIgogICAgICAgIGlmIHR5cGVfID09ICdndWknOgogICAgICAgICAgICBsYXVuY2hlcl90eXBlID0gJ2d1aScKICAgICAgICAgICAgZXh0ID0gJy1zY3JpcHQucHl3JwogICAgICAgICAgICBvbGQgPSBbJy5weXcnXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGxhdW5jaGVyX3R5cGUgPSAnY2xpJwogICAgICAgICAgICBleHQgPSAnLXNjcmlwdC5weScKICAgICAgICAgICAgb2xkID0gWycucHknLCAnLnB5YycsICcucHlvJ10KICAgICAgICBoZHIgPSBjbHMuX2FkanVzdF9oZWFkZXIodHlwZV8sIGhlYWRlcikKICAgICAgICBibG9ja2VycyA9IFtuYW1lICsgeCBmb3IgeCBpbiBvbGRdCiAgICAgICAgeWllbGQgKG5hbWUgKyBleHQsIGhkciArIHNjcmlwdF90ZXh0LCAndCcsIGJsb2NrZXJzKQogICAgICAgIHlpZWxkICgKICAgICAgICAgICAgbmFtZSArICcuZXhlJywgZ2V0X3dpbl9sYXVuY2hlcihsYXVuY2hlcl90eXBlKSwKICAgICAgICAgICAgJ2InICAjIHdyaXRlIGluIGJpbmFyeSBtb2RlCiAgICAgICAgKQogICAgICAgIGlmIG5vdCBpc182NGJpdCgpOgogICAgICAgICAgICAjIGluc3RhbGwgYSBtYW5pZmVzdCBmb3IgdGhlIGxhdW5jaGVyIHRvIHByZXZlbnQgV2luZG93cwogICAgICAgICAgICAjIGZyb20gZGV0ZWN0aW5nIGl0IGFzIGFuIGluc3RhbGxlciAod2hpY2ggaXQgd2lsbCBmb3IKICAgICAgICAgICAgIyAgbGF1bmNoZXJzIGxpa2UgZWFzeV9pbnN0YWxsLmV4ZSkuIENvbnNpZGVyIG9ubHkKICAgICAgICAgICAgIyAgYWRkaW5nIGEgbWFuaWZlc3QgZm9yIGxhdW5jaGVycyBkZXRlY3RlZCBhcyBpbnN0YWxsZXJzLgogICAgICAgICAgICAjICBTZWUgRGlzdHJpYnV0ZSAjMTQzIGZvciBkZXRhaWxzLgogICAgICAgICAgICBtX25hbWUgPSBuYW1lICsgJy5leGUubWFuaWZlc3QnCiAgICAgICAgICAgIHlpZWxkIChtX25hbWUsIGxvYWRfbGF1bmNoZXJfbWFuaWZlc3QobmFtZSksICd0JykKCgojIGZvciBiYWNrd2FyZC1jb21wYXRpYmlsaXR5CmdldF9zY3JpcHRfYXJncyA9IFNjcmlwdFdyaXRlci5nZXRfc2NyaXB0X2FyZ3MKZ2V0X3NjcmlwdF9oZWFkZXIgPSBTY3JpcHRXcml0ZXIuZ2V0X3NjcmlwdF9oZWFkZXIKCgpkZWYgZ2V0X3dpbl9sYXVuY2hlcih0eXBlKToKICAgICIiIgogICAgTG9hZCB0aGUgV2luZG93cyBsYXVuY2hlciAoZXhlY3V0YWJsZSkgc3VpdGFibGUgZm9yIGxhdW5jaGluZyBhIHNjcmlwdC4KCiAgICBgdHlwZWAgc2hvdWxkIGJlIGVpdGhlciAnY2xpJyBvciAnZ3VpJwoKICAgIFJldHVybnMgdGhlIGV4ZWN1dGFibGUgYXMgYSBieXRlIHN0cmluZy4KICAgICIiIgogICAgbGF1bmNoZXJfZm4gPSAnJXMuZXhlJyAlIHR5cGUKICAgIGlmIGlzXzY0Yml0KCk6CiAgICAgICAgbGF1bmNoZXJfZm4gPSBsYXVuY2hlcl9mbi5yZXBsYWNlKCIuIiwgIi02NC4iKQogICAgZWxzZToKICAgICAgICBsYXVuY2hlcl9mbiA9IGxhdW5jaGVyX2ZuLnJlcGxhY2UoIi4iLCAiLTMyLiIpCiAgICByZXR1cm4gcmVzb3VyY2Vfc3RyaW5nKCdzZXR1cHRvb2xzJywgbGF1bmNoZXJfZm4pCgoKZGVmIGxvYWRfbGF1bmNoZXJfbWFuaWZlc3QobmFtZSk6CiAgICBtYW5pZmVzdCA9IHBrZ19yZXNvdXJjZXMucmVzb3VyY2Vfc3RyaW5nKF9fbmFtZV9fLCAnbGF1bmNoZXIgbWFuaWZlc3QueG1sJykKICAgIGlmIHNpeC5QWTI6CiAgICAgICAgcmV0dXJuIG1hbmlmZXN0ICUgdmFycygpCiAgICBlbHNlOgogICAgICAgIHJldHVybiBtYW5pZmVzdC5kZWNvZGUoJ3V0Zi04JykgJSB2YXJzKCkKCgpkZWYgcm10cmVlKHBhdGgsIGlnbm9yZV9lcnJvcnM9RmFsc2UsIG9uZXJyb3I9YXV0b19jaG1vZCk6CiAgICByZXR1cm4gc2h1dGlsLnJtdHJlZShwYXRoLCBpZ25vcmVfZXJyb3JzLCBvbmVycm9yKQoKCmRlZiBjdXJyZW50X3VtYXNrKCk6CiAgICB0bXAgPSBvcy51bWFzaygwbzAyMikKICAgIG9zLnVtYXNrKHRtcCkKICAgIHJldHVybiB0bXAKCgpkZWYgYm9vdHN0cmFwKCk6CiAgICAjIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gc2V0dXB0b29scyouZWdnIGlzIHJ1biB1c2luZyAvYmluL3NoCiAgICBpbXBvcnQgc2V0dXB0b29scwoKICAgIGFyZ3YwID0gb3MucGF0aC5kaXJuYW1lKHNldHVwdG9vbHMuX19wYXRoX19bMF0pCiAgICBzeXMuYXJndlswXSA9IGFyZ3YwCiAgICBzeXMuYXJndi5hcHBlbmQoYXJndjApCiAgICBtYWluKCkKCgpkZWYgbWFpbihhcmd2PU5vbmUsICoqa3cpOgogICAgZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBzZXR1cAogICAgZnJvbSBzZXR1cHRvb2xzLmRpc3QgaW1wb3J0IERpc3RyaWJ1dGlvbgoKICAgIGNsYXNzIERpc3RyaWJ1dGlvbldpdGhvdXRIZWxwQ29tbWFuZHMoRGlzdHJpYnV0aW9uKToKICAgICAgICBjb21tb25fdXNhZ2UgPSAiIgoKICAgICAgICBkZWYgX3Nob3dfaGVscChzZWxmLCAqYXJncywgKiprdyk6CiAgICAgICAgICAgIHdpdGggX3BhdGNoX3VzYWdlKCk6CiAgICAgICAgICAgICAgICBEaXN0cmlidXRpb24uX3Nob3dfaGVscChzZWxmLCAqYXJncywgKiprdykKCiAgICBpZiBhcmd2IGlzIE5vbmU6CiAgICAgICAgYXJndiA9IHN5cy5hcmd2WzE6XQoKICAgIHdpdGggX3BhdGNoX3VzYWdlKCk6CiAgICAgICAgc2V0dXAoCiAgICAgICAgICAgIHNjcmlwdF9hcmdzPVsnLXEnLCAnZWFzeV9pbnN0YWxsJywgJy12J10gKyBhcmd2LAogICAgICAgICAgICBzY3JpcHRfbmFtZT1zeXMuYXJndlswXSBvciAnZWFzeV9pbnN0YWxsJywKICAgICAgICAgICAgZGlzdGNsYXNzPURpc3RyaWJ1dGlvbldpdGhvdXRIZWxwQ29tbWFuZHMsCiAgICAgICAgICAgICoqa3cKICAgICAgICApCgoKQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKZGVmIF9wYXRjaF91c2FnZSgpOgogICAgaW1wb3J0IGRpc3R1dGlscy5jb3JlCiAgICBVU0FHRSA9IHRleHR3cmFwLmRlZGVudCgiIiIKICAgICAgICB1c2FnZTogJShzY3JpcHQpcyBbb3B0aW9uc10gcmVxdWlyZW1lbnRfb3JfdXJsIC4uLgogICAgICAgICAgIG9yOiAlKHNjcmlwdClzIC0taGVscAogICAgICAgICIiIikubHN0cmlwKCkKCiAgICBkZWYgZ2VuX3VzYWdlKHNjcmlwdF9uYW1lKToKICAgICAgICByZXR1cm4gVVNBR0UgJSBkaWN0KAogICAgICAgICAgICBzY3JpcHQ9b3MucGF0aC5iYXNlbmFtZShzY3JpcHRfbmFtZSksCiAgICAgICAgKQoKICAgIHNhdmVkID0gZGlzdHV0aWxzLmNvcmUuZ2VuX3VzYWdlCiAgICBkaXN0dXRpbHMuY29yZS5nZW5fdXNhZ2UgPSBnZW5fdXNhZ2UKICAgIHRyeToKICAgICAgICB5aWVsZAogICAgZmluYWxseToKICAgICAgICBkaXN0dXRpbHMuY29yZS5nZW5fdXNhZ2UgPSBzYXZlZAoKY2xhc3MgRWFzeUluc3RhbGxEZXByZWNhdGlvbldhcm5pbmcoU2V0dXB0b29sc0RlcHJlY2F0aW9uV2FybmluZyk6CiAgICAiIiJDbGFzcyBmb3Igd2FybmluZyBhYm91dCBkZXByZWNhdGlvbnMgaW4gRWFzeUluc3RhbGwgaW4gU2V0dXBUb29scy4gTm90IGlnbm9yZWQgYnkgZGVmYXVsdCwgdW5saWtlIERlcHJlY2F0aW9uV2FybmluZy4iIiIKICAgIApQSwMEFAAAAAAAAAAhADGJ9PbiYwAA4mMAAEMAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9jb21tYW5kL2VnZ19pbmZvLnB5IiIic2V0dXB0b29scy5jb21tYW5kLmVnZ19pbmZvCgpDcmVhdGUgYSBkaXN0cmlidXRpb24ncyAuZWdnLWluZm8gZGlyZWN0b3J5IGFuZCBjb250ZW50cyIiIgoKZnJvbSBkaXN0dXRpbHMuZmlsZWxpc3QgaW1wb3J0IEZpbGVMaXN0IGFzIF9GaWxlTGlzdApmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc0ludGVybmFsRXJyb3IKZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgY29udmVydF9wYXRoCmZyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKaW1wb3J0IGRpc3R1dGlscy5lcnJvcnMKaW1wb3J0IGRpc3R1dGlscy5maWxlbGlzdAppbXBvcnQgb3MKaW1wb3J0IHJlCmltcG9ydCBzeXMKaW1wb3J0IGlvCmltcG9ydCB3YXJuaW5ncwppbXBvcnQgdGltZQppbXBvcnQgY29sbGVjdGlvbnMKCmZyb20gc2V0dXB0b29scy5leHRlcm4gaW1wb3J0IHNpeApmcm9tIHNldHVwdG9vbHMuZXh0ZXJuLnNpeC5tb3ZlcyBpbXBvcnQgbWFwCgpmcm9tIHNldHVwdG9vbHMgaW1wb3J0IENvbW1hbmQKZnJvbSBzZXR1cHRvb2xzLmNvbW1hbmQuc2Rpc3QgaW1wb3J0IHNkaXN0CmZyb20gc2V0dXB0b29scy5jb21tYW5kLnNkaXN0IGltcG9ydCB3YWxrX3JldmN0cmwKZnJvbSBzZXR1cHRvb2xzLmNvbW1hbmQuc2V0b3B0IGltcG9ydCBlZGl0X2NvbmZpZwpmcm9tIHNldHVwdG9vbHMuY29tbWFuZCBpbXBvcnQgYmRpc3RfZWdnCmZyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgKAogICAgcGFyc2VfcmVxdWlyZW1lbnRzLCBzYWZlX25hbWUsIHBhcnNlX3ZlcnNpb24sCiAgICBzYWZlX3ZlcnNpb24sIHlpZWxkX2xpbmVzLCBFbnRyeVBvaW50LCBpdGVyX2VudHJ5X3BvaW50cywgdG9fZmlsZW5hbWUpCmltcG9ydCBzZXR1cHRvb2xzLnVuaWNvZGVfdXRpbHMgYXMgdW5pY29kZV91dGlscwpmcm9tIHNldHVwdG9vbHMuZ2xvYiBpbXBvcnQgZ2xvYgoKZnJvbSBzZXR1cHRvb2xzLmV4dGVybiBpbXBvcnQgcGFja2FnaW5nCmZyb20gc2V0dXB0b29scyBpbXBvcnQgU2V0dXB0b29sc0RlcHJlY2F0aW9uV2FybmluZwoKZGVmIHRyYW5zbGF0ZV9wYXR0ZXJuKGdsb2IpOgogICAgIiIiCiAgICBUcmFuc2xhdGUgYSBmaWxlIHBhdGggZ2xvYiBsaWtlICcqLnR4dCcgaW4gdG8gYSByZWd1bGFyIGV4cHJlc3Npb24uCiAgICBUaGlzIGRpZmZlcnMgZnJvbSBmbm1hdGNoLnRyYW5zbGF0ZSB3aGljaCBhbGxvd3Mgd2lsZGNhcmRzIHRvIG1hdGNoCiAgICBkaXJlY3Rvcnkgc2VwYXJhdG9ycy4gSXQgYWxzbyBrbm93cyBhYm91dCAnKiovJyB3aGljaCBtYXRjaGVzIGFueSBudW1iZXIgb2YKICAgIGRpcmVjdG9yaWVzLgogICAgIiIiCiAgICBwYXQgPSAnJwoKICAgICMgVGhpcyB3aWxsIHNwbGl0IG9uICcvJyB3aXRoaW4gW2NoYXJhY3RlciBjbGFzc2VzXS4gVGhpcyBpcyBkZWxpYmVyYXRlLgogICAgY2h1bmtzID0gZ2xvYi5zcGxpdChvcy5wYXRoLnNlcCkKCiAgICBzZXAgPSByZS5lc2NhcGUob3Muc2VwKQogICAgdmFsaWRfY2hhciA9ICdbXiVzXScgJSAoc2VwLCkKCiAgICBmb3IgYywgY2h1bmsgaW4gZW51bWVyYXRlKGNodW5rcyk6CiAgICAgICAgbGFzdF9jaHVuayA9IGMgPT0gbGVuKGNodW5rcykgLSAxCgogICAgICAgICMgQ2h1bmtzIHRoYXQgYXJlIGEgbGl0ZXJhbCAqKiBhcmUgZ2xvYnN0YXJzLiBUaGV5IG1hdGNoIGFueXRoaW5nLgogICAgICAgIGlmIGNodW5rID09ICcqKic6CiAgICAgICAgICAgIGlmIGxhc3RfY2h1bms6CiAgICAgICAgICAgICAgICAjIE1hdGNoIGFueXRoaW5nIGlmIHRoaXMgaXMgdGhlIGxhc3QgY29tcG9uZW50CiAgICAgICAgICAgICAgICBwYXQgKz0gJy4qJwogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBNYXRjaCAnKG5hbWUvKSonCiAgICAgICAgICAgICAgICBwYXQgKz0gJyg/OiVzKyVzKSonICUgKHZhbGlkX2NoYXIsIHNlcCkKICAgICAgICAgICAgY29udGludWUgICMgQnJlYWsgaGVyZSBhcyB0aGUgd2hvbGUgcGF0aCBjb21wb25lbnQgaGFzIGJlZW4gaGFuZGxlZAoKICAgICAgICAjIEZpbmQgYW55IHNwZWNpYWwgY2hhcmFjdGVycyBpbiB0aGUgcmVtYWluZGVyCiAgICAgICAgaSA9IDAKICAgICAgICBjaHVua19sZW4gPSBsZW4oY2h1bmspCiAgICAgICAgd2hpbGUgaSA8IGNodW5rX2xlbjoKICAgICAgICAgICAgY2hhciA9IGNodW5rW2ldCiAgICAgICAgICAgIGlmIGNoYXIgPT0gJyonOgogICAgICAgICAgICAgICAgIyBNYXRjaCBhbnkgbnVtYmVyIG9mIG5hbWUgY2hhcmFjdGVycwogICAgICAgICAgICAgICAgcGF0ICs9IHZhbGlkX2NoYXIgKyAnKicKICAgICAgICAgICAgZWxpZiBjaGFyID09ICc/JzoKICAgICAgICAgICAgICAgICMgTWF0Y2ggYSBuYW1lIGNoYXJhY3RlcgogICAgICAgICAgICAgICAgcGF0ICs9IHZhbGlkX2NoYXIKICAgICAgICAgICAgZWxpZiBjaGFyID09ICdbJzoKICAgICAgICAgICAgICAgICMgQ2hhcmFjdGVyIGNsYXNzCiAgICAgICAgICAgICAgICBpbm5lcl9pID0gaSArIDEKICAgICAgICAgICAgICAgICMgU2tpcCBpbml0aWFsICEvXSBjaGFycwogICAgICAgICAgICAgICAgaWYgaW5uZXJfaSA8IGNodW5rX2xlbiBhbmQgY2h1bmtbaW5uZXJfaV0gPT0gJyEnOgogICAgICAgICAgICAgICAgICAgIGlubmVyX2kgPSBpbm5lcl9pICsgMQogICAgICAgICAgICAgICAgaWYgaW5uZXJfaSA8IGNodW5rX2xlbiBhbmQgY2h1bmtbaW5uZXJfaV0gPT0gJ10nOgogICAgICAgICAgICAgICAgICAgIGlubmVyX2kgPSBpbm5lcl9pICsgMQoKICAgICAgICAgICAgICAgICMgTG9vcCB0aWxsIHRoZSBjbG9zaW5nIF0gaXMgZm91bmQKICAgICAgICAgICAgICAgIHdoaWxlIGlubmVyX2kgPCBjaHVua19sZW4gYW5kIGNodW5rW2lubmVyX2ldICE9ICddJzoKICAgICAgICAgICAgICAgICAgICBpbm5lcl9pID0gaW5uZXJfaSArIDEKCiAgICAgICAgICAgICAgICBpZiBpbm5lcl9pID49IGNodW5rX2xlbjoKICAgICAgICAgICAgICAgICAgICAjIEdvdCB0byB0aGUgZW5kIG9mIHRoZSBzdHJpbmcgd2l0aG91dCBmaW5kaW5nIGEgY2xvc2luZyBdCiAgICAgICAgICAgICAgICAgICAgIyBEbyBub3QgdHJlYXQgdGhpcyBhcyBhIG1hdGNoaW5nIGdyb3VwLCBidXQgYXMgYSBsaXRlcmFsIFsKICAgICAgICAgICAgICAgICAgICBwYXQgKz0gcmUuZXNjYXBlKGNoYXIpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICMgR3JhYiB0aGUgaW5zaWRlcyBvZiB0aGUgW2JyYWNrZXRzXQogICAgICAgICAgICAgICAgICAgIGlubmVyID0gY2h1bmtbaSArIDE6aW5uZXJfaV0KICAgICAgICAgICAgICAgICAgICBjaGFyX2NsYXNzID0gJycKCiAgICAgICAgICAgICAgICAgICAgIyBDbGFzcyBuZWdhdGlvbgogICAgICAgICAgICAgICAgICAgIGlmIGlubmVyWzBdID09ICchJzoKICAgICAgICAgICAgICAgICAgICAgICAgY2hhcl9jbGFzcyA9ICdeJwogICAgICAgICAgICAgICAgICAgICAgICBpbm5lciA9IGlubmVyWzE6XQoKICAgICAgICAgICAgICAgICAgICBjaGFyX2NsYXNzICs9IHJlLmVzY2FwZShpbm5lcikKICAgICAgICAgICAgICAgICAgICBwYXQgKz0gJ1slc10nICUgKGNoYXJfY2xhc3MsKQoKICAgICAgICAgICAgICAgICAgICAjIFNraXAgdG8gdGhlIGVuZCBdCiAgICAgICAgICAgICAgICAgICAgaSA9IGlubmVyX2kKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHBhdCArPSByZS5lc2NhcGUoY2hhcikKICAgICAgICAgICAgaSArPSAxCgogICAgICAgICMgSm9pbiBlYWNoIGNodW5rIHdpdGggdGhlIGRpciBzZXBhcmF0b3IKICAgICAgICBpZiBub3QgbGFzdF9jaHVuazoKICAgICAgICAgICAgcGF0ICs9IHNlcAoKICAgIHBhdCArPSByJ1xaJwogICAgcmV0dXJuIHJlLmNvbXBpbGUocGF0LCBmbGFncz1yZS5NVUxUSUxJTkV8cmUuRE9UQUxMKQoKCmNsYXNzIEluZm9Db21tb246CiAgICB0YWdfYnVpbGQgPSBOb25lCiAgICB0YWdfZGF0ZSA9IE5vbmUKCiAgICBAcHJvcGVydHkKICAgIGRlZiBuYW1lKHNlbGYpOgogICAgICAgIHJldHVybiBzYWZlX25hbWUoc2VsZi5kaXN0cmlidXRpb24uZ2V0X25hbWUoKSkKCiAgICBkZWYgdGFnZ2VkX3ZlcnNpb24oc2VsZik6CiAgICAgICAgdmVyc2lvbiA9IHNlbGYuZGlzdHJpYnV0aW9uLmdldF92ZXJzaW9uKCkKICAgICAgICAjIGVnZ19pbmZvIG1heSBiZSBjYWxsZWQgbW9yZSB0aGFuIG9uY2UgZm9yIGEgZGlzdHJpYnV0aW9uLAogICAgICAgICMgaW4gd2hpY2ggY2FzZSB0aGUgdmVyc2lvbiBzdHJpbmcgYWxyZWFkeSBjb250YWlucyBhbGwgdGFncy4KICAgICAgICBpZiBzZWxmLnZ0YWdzIGFuZCB2ZXJzaW9uLmVuZHN3aXRoKHNlbGYudnRhZ3MpOgogICAgICAgICAgICByZXR1cm4gc2FmZV92ZXJzaW9uKHZlcnNpb24pCiAgICAgICAgcmV0dXJuIHNhZmVfdmVyc2lvbih2ZXJzaW9uICsgc2VsZi52dGFncykKCiAgICBkZWYgdGFncyhzZWxmKToKICAgICAgICB2ZXJzaW9uID0gJycKICAgICAgICBpZiBzZWxmLnRhZ19idWlsZDoKICAgICAgICAgICAgdmVyc2lvbiArPSBzZWxmLnRhZ19idWlsZAogICAgICAgIGlmIHNlbGYudGFnX2RhdGU6CiAgICAgICAgICAgIHZlcnNpb24gKz0gdGltZS5zdHJmdGltZSgiLSVZJW0lZCIpCiAgICAgICAgcmV0dXJuIHZlcnNpb24KICAgIHZ0YWdzID0gcHJvcGVydHkodGFncykKCgpjbGFzcyBlZ2dfaW5mbyhJbmZvQ29tbW9uLCBDb21tYW5kKToKICAgIGRlc2NyaXB0aW9uID0gImNyZWF0ZSBhIGRpc3RyaWJ1dGlvbidzIC5lZ2ctaW5mbyBkaXJlY3RvcnkiCgogICAgdXNlcl9vcHRpb25zID0gWwogICAgICAgICgnZWdnLWJhc2U9JywgJ2UnLCAiZGlyZWN0b3J5IGNvbnRhaW5pbmcgLmVnZy1pbmZvIGRpcmVjdG9yaWVzIgogICAgICAgICAgICAgICAgICAgICAgICAgICAiIChkZWZhdWx0OiB0b3Agb2YgdGhlIHNvdXJjZSB0cmVlKSIpLAogICAgICAgICgndGFnLWRhdGUnLCAnZCcsICJBZGQgZGF0ZSBzdGFtcCAoZS5nLiAyMDA1MDUyOCkgdG8gdmVyc2lvbiBudW1iZXIiKSwKICAgICAgICAoJ3RhZy1idWlsZD0nLCAnYicsICJTcGVjaWZ5IGV4cGxpY2l0IHRhZyB0byBhZGQgdG8gdmVyc2lvbiBudW1iZXIiKSwKICAgICAgICAoJ25vLWRhdGUnLCAnRCcsICJEb24ndCBpbmNsdWRlIGRhdGUgc3RhbXAgW2RlZmF1bHRdIiksCiAgICBdCgogICAgYm9vbGVhbl9vcHRpb25zID0gWyd0YWctZGF0ZSddCiAgICBuZWdhdGl2ZV9vcHQgPSB7CiAgICAgICAgJ25vLWRhdGUnOiAndGFnLWRhdGUnLAogICAgfQoKICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgc2VsZi5lZ2dfYmFzZSA9IE5vbmUKICAgICAgICBzZWxmLmVnZ19uYW1lID0gTm9uZQogICAgICAgIHNlbGYuZWdnX2luZm8gPSBOb25lCiAgICAgICAgc2VsZi5lZ2dfdmVyc2lvbiA9IE5vbmUKICAgICAgICBzZWxmLmJyb2tlbl9lZ2dfaW5mbyA9IEZhbHNlCgogICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAjIGFsbG93IHRoZSAndGFnX3N2bl9yZXZpc2lvbicgdG8gYmUgZGV0ZWN0ZWQgYW5kCiAgICAjIHNldCwgc3VwcG9ydGluZyBzZGlzdHMgYnVpbHQgb24gb2xkZXIgU2V0dXB0b29scy4KICAgIEBwcm9wZXJ0eQogICAgZGVmIHRhZ19zdm5fcmV2aXNpb24oc2VsZik6CiAgICAgICAgcGFzcwoKICAgIEB0YWdfc3ZuX3JldmlzaW9uLnNldHRlcgogICAgZGVmIHRhZ19zdm5fcmV2aXNpb24oc2VsZiwgdmFsdWUpOgogICAgICAgIHBhc3MKICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgIGRlZiBzYXZlX3ZlcnNpb25faW5mbyhzZWxmLCBmaWxlbmFtZSk6CiAgICAgICAgIiIiCiAgICAgICAgTWF0ZXJpYWxpemUgdGhlIHZhbHVlIG9mIGRhdGUgaW50byB0aGUKICAgICAgICBidWlsZCB0YWcuIEluc3RhbGwgYnVpbGQga2V5cyBpbiBhIGRldGVybWluaXN0aWMgb3JkZXIKICAgICAgICB0byBhdm9pZCBhcmJpdHJhcnkgcmVvcmRlcmluZyBvbiBzdWJzZXF1ZW50IGJ1aWxkcy4KICAgICAgICAiIiIKICAgICAgICBlZ2dfaW5mbyA9IGNvbGxlY3Rpb25zLk9yZGVyZWREaWN0KCkKICAgICAgICAjIGZvbGxvdyB0aGUgb3JkZXIgdGhlc2Uga2V5cyB3b3VsZCBoYXZlIGJlZW4gYWRkZWQKICAgICAgICAjIHdoZW4gUFlUSE9OSEFTSFNFRUQ9MAogICAgICAgIGVnZ19pbmZvWyd0YWdfYnVpbGQnXSA9IHNlbGYudGFncygpCiAgICAgICAgZWdnX2luZm9bJ3RhZ19kYXRlJ10gPSAwCiAgICAgICAgZWRpdF9jb25maWcoZmlsZW5hbWUsIGRpY3QoZWdnX2luZm89ZWdnX2luZm8pKQoKICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgICMgTm90ZTogd2UgbmVlZCB0byBjYXB0dXJlIHRoZSBjdXJyZW50IHZhbHVlIHJldHVybmVkCiAgICAgICAgIyBieSBgc2VsZi50YWdnZWRfdmVyc2lvbigpYCwgc28gd2UgY2FuIGxhdGVyIHVwZGF0ZQogICAgICAgICMgYHNlbGYuZGlzdHJpYnV0aW9uLm1ldGFkYXRhLnZlcnNpb25gIHdpdGhvdXQKICAgICAgICAjIHJlcGVyY3Vzc2lvbnMuCiAgICAgICAgc2VsZi5lZ2dfbmFtZSA9IHNlbGYubmFtZQogICAgICAgIHNlbGYuZWdnX3ZlcnNpb24gPSBzZWxmLnRhZ2dlZF92ZXJzaW9uKCkKICAgICAgICBwYXJzZWRfdmVyc2lvbiA9IHBhcnNlX3ZlcnNpb24oc2VsZi5lZ2dfdmVyc2lvbikKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBpc192ZXJzaW9uID0gaXNpbnN0YW5jZShwYXJzZWRfdmVyc2lvbiwgcGFja2FnaW5nLnZlcnNpb24uVmVyc2lvbikKICAgICAgICAgICAgc3BlYyA9ICgKICAgICAgICAgICAgICAgICIlcz09JXMiIGlmIGlzX3ZlcnNpb24gZWxzZSAiJXM9PT0lcyIKICAgICAgICAgICAgKQogICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICAgcGFyc2VfcmVxdWlyZW1lbnRzKHNwZWMgJSAoc2VsZi5lZ2dfbmFtZSwgc2VsZi5lZ2dfdmVyc2lvbikpCiAgICAgICAgICAgICkKICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgcmFpc2UgZGlzdHV0aWxzLmVycm9ycy5EaXN0dXRpbHNPcHRpb25FcnJvcigKICAgICAgICAgICAgICAgICJJbnZhbGlkIGRpc3RyaWJ1dGlvbiBuYW1lIG9yIHZlcnNpb24gc3ludGF4OiAlcy0lcyIgJQogICAgICAgICAgICAgICAgKHNlbGYuZWdnX25hbWUsIHNlbGYuZWdnX3ZlcnNpb24pCiAgICAgICAgICAgICkKCiAgICAgICAgaWYgc2VsZi5lZ2dfYmFzZSBpcyBOb25lOgogICAgICAgICAgICBkaXJzID0gc2VsZi5kaXN0cmlidXRpb24ucGFja2FnZV9kaXIKICAgICAgICAgICAgc2VsZi5lZ2dfYmFzZSA9IChkaXJzIG9yIHt9KS5nZXQoJycsIG9zLmN1cmRpcikKCiAgICAgICAgc2VsZi5lbnN1cmVfZGlybmFtZSgnZWdnX2Jhc2UnKQogICAgICAgIHNlbGYuZWdnX2luZm8gPSB0b19maWxlbmFtZShzZWxmLmVnZ19uYW1lKSArICcuZWdnLWluZm8nCiAgICAgICAgaWYgc2VsZi5lZ2dfYmFzZSAhPSBvcy5jdXJkaXI6CiAgICAgICAgICAgIHNlbGYuZWdnX2luZm8gPSBvcy5wYXRoLmpvaW4oc2VsZi5lZ2dfYmFzZSwgc2VsZi5lZ2dfaW5mbykKICAgICAgICBpZiAnLScgaW4gc2VsZi5lZ2dfbmFtZToKICAgICAgICAgICAgc2VsZi5jaGVja19icm9rZW5fZWdnX2luZm8oKQoKICAgICAgICAjIFNldCBwYWNrYWdlIHZlcnNpb24gZm9yIHRoZSBiZW5lZml0IG9mIGR1bWJlciBjb21tYW5kcwogICAgICAgICMgKGUuZy4gc2Rpc3QsIGJkaXN0X3dpbmluc3QsIGV0Yy4pCiAgICAgICAgIwogICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uLm1ldGFkYXRhLnZlcnNpb24gPSBzZWxmLmVnZ192ZXJzaW9uCgogICAgICAgICMgSWYgd2UgYm9vdHN0cmFwcGVkIGFyb3VuZCB0aGUgbGFjayBvZiBhIFBLRy1JTkZPLCBhcyBtaWdodCBiZSB0aGUKICAgICAgICAjIGNhc2UgaW4gYSBmcmVzaCBjaGVja291dCwgbWFrZSBzdXJlIHRoYXQgYW55IHNwZWNpYWwgdGFncyBnZXQgYWRkZWQKICAgICAgICAjIHRvIHRoZSB2ZXJzaW9uIGluZm8KICAgICAgICAjCiAgICAgICAgcGQgPSBzZWxmLmRpc3RyaWJ1dGlvbi5fcGF0Y2hlZF9kaXN0CiAgICAgICAgaWYgcGQgaXMgbm90IE5vbmUgYW5kIHBkLmtleSA9PSBzZWxmLmVnZ19uYW1lLmxvd2VyKCk6CiAgICAgICAgICAgIHBkLl92ZXJzaW9uID0gc2VsZi5lZ2dfdmVyc2lvbgogICAgICAgICAgICBwZC5fcGFyc2VkX3ZlcnNpb24gPSBwYXJzZV92ZXJzaW9uKHNlbGYuZWdnX3ZlcnNpb24pCiAgICAgICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uLl9wYXRjaGVkX2Rpc3QgPSBOb25lCgogICAgZGVmIHdyaXRlX29yX2RlbGV0ZV9maWxlKHNlbGYsIHdoYXQsIGZpbGVuYW1lLCBkYXRhLCBmb3JjZT1GYWxzZSk6CiAgICAgICAgIiIiV3JpdGUgYGRhdGFgIHRvIGBmaWxlbmFtZWAgb3IgZGVsZXRlIGlmIGVtcHR5CgogICAgICAgIElmIGBkYXRhYCBpcyBub24tZW1wdHksIHRoaXMgcm91dGluZSBpcyB0aGUgc2FtZSBhcyBgYHdyaXRlX2ZpbGUoKWBgLgogICAgICAgIElmIGBkYXRhYCBpcyBlbXB0eSBidXQgbm90IGBgTm9uZWBgLCB0aGlzIGlzIHRoZSBzYW1lIGFzIGNhbGxpbmcKICAgICAgICBgYGRlbGV0ZV9maWxlKGZpbGVuYW1lKWAuICBJZiBgZGF0YWAgaXMgYGBOb25lYGAsIHRoZW4gdGhpcyBpcyBhIG5vLW9wCiAgICAgICAgdW5sZXNzIGBmaWxlbmFtZWAgZXhpc3RzLCBpbiB3aGljaCBjYXNlIGEgd2FybmluZyBpcyBpc3N1ZWQgYWJvdXQgdGhlCiAgICAgICAgb3JwaGFuZWQgZmlsZSAoaWYgYGZvcmNlYCBpcyBmYWxzZSksIG9yIGRlbGV0ZWQgKGlmIGBmb3JjZWAgaXMgdHJ1ZSkuCiAgICAgICAgIiIiCiAgICAgICAgaWYgZGF0YToKICAgICAgICAgICAgc2VsZi53cml0ZV9maWxlKHdoYXQsIGZpbGVuYW1lLCBkYXRhKQogICAgICAgIGVsaWYgb3MucGF0aC5leGlzdHMoZmlsZW5hbWUpOgogICAgICAgICAgICBpZiBkYXRhIGlzIE5vbmUgYW5kIG5vdCBmb3JjZToKICAgICAgICAgICAgICAgIGxvZy53YXJuKAogICAgICAgICAgICAgICAgICAgICIlcyBub3Qgc2V0IGluIHNldHVwKCksIGJ1dCAlcyBleGlzdHMiLCB3aGF0LCBmaWxlbmFtZQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLmRlbGV0ZV9maWxlKGZpbGVuYW1lKQoKICAgIGRlZiB3cml0ZV9maWxlKHNlbGYsIHdoYXQsIGZpbGVuYW1lLCBkYXRhKToKICAgICAgICAiIiJXcml0ZSBgZGF0YWAgdG8gYGZpbGVuYW1lYCAoaWYgbm90IGEgZHJ5IHJ1bikgYWZ0ZXIgYW5ub3VuY2luZyBpdAoKICAgICAgICBgd2hhdGAgaXMgdXNlZCBpbiBhIGxvZyBtZXNzYWdlIHRvIGlkZW50aWZ5IHdoYXQgaXMgYmVpbmcgd3JpdHRlbgogICAgICAgIHRvIHRoZSBmaWxlLgogICAgICAgICIiIgogICAgICAgIGxvZy5pbmZvKCJ3cml0aW5nICVzIHRvICVzIiwgd2hhdCwgZmlsZW5hbWUpCiAgICAgICAgaWYgc2l4LlBZMzoKICAgICAgICAgICAgZGF0YSA9IGRhdGEuZW5jb2RlKCJ1dGYtOCIpCiAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgZiA9IG9wZW4oZmlsZW5hbWUsICd3YicpCiAgICAgICAgICAgIGYud3JpdGUoZGF0YSkKICAgICAgICAgICAgZi5jbG9zZSgpCgogICAgZGVmIGRlbGV0ZV9maWxlKHNlbGYsIGZpbGVuYW1lKToKICAgICAgICAiIiJEZWxldGUgYGZpbGVuYW1lYCAoaWYgbm90IGEgZHJ5IHJ1bikgYWZ0ZXIgYW5ub3VuY2luZyBpdCIiIgogICAgICAgIGxvZy5pbmZvKCJkZWxldGluZyAlcyIsIGZpbGVuYW1lKQogICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgIG9zLnVubGluayhmaWxlbmFtZSkKCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgIHNlbGYubWtwYXRoKHNlbGYuZWdnX2luZm8pCiAgICAgICAgb3MudXRpbWUoc2VsZi5lZ2dfaW5mbywgTm9uZSkKICAgICAgICBpbnN0YWxsZXIgPSBzZWxmLmRpc3RyaWJ1dGlvbi5mZXRjaF9idWlsZF9lZ2cKICAgICAgICBmb3IgZXAgaW4gaXRlcl9lbnRyeV9wb2ludHMoJ2VnZ19pbmZvLndyaXRlcnMnKToKICAgICAgICAgICAgZXAucmVxdWlyZShpbnN0YWxsZXI9aW5zdGFsbGVyKQogICAgICAgICAgICB3cml0ZXIgPSBlcC5yZXNvbHZlKCkKICAgICAgICAgICAgd3JpdGVyKHNlbGYsIGVwLm5hbWUsIG9zLnBhdGguam9pbihzZWxmLmVnZ19pbmZvLCBlcC5uYW1lKSkKCiAgICAgICAgIyBHZXQgcmlkIG9mIG5hdGl2ZV9saWJzLnR4dCBpZiBpdCB3YXMgcHV0IHRoZXJlIGJ5IG9sZGVyIGJkaXN0X2VnZwogICAgICAgIG5sID0gb3MucGF0aC5qb2luKHNlbGYuZWdnX2luZm8sICJuYXRpdmVfbGlicy50eHQiKQogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKG5sKToKICAgICAgICAgICAgc2VsZi5kZWxldGVfZmlsZShubCkKCiAgICAgICAgc2VsZi5maW5kX3NvdXJjZXMoKQoKICAgIGRlZiBmaW5kX3NvdXJjZXMoc2VsZik6CiAgICAgICAgIiIiR2VuZXJhdGUgU09VUkNFUy50eHQgbWFuaWZlc3QgZmlsZSIiIgogICAgICAgIG1hbmlmZXN0X2ZpbGVuYW1lID0gb3MucGF0aC5qb2luKHNlbGYuZWdnX2luZm8sICJTT1VSQ0VTLnR4dCIpCiAgICAgICAgbW0gPSBtYW5pZmVzdF9tYWtlcihzZWxmLmRpc3RyaWJ1dGlvbikKICAgICAgICBtbS5tYW5pZmVzdCA9IG1hbmlmZXN0X2ZpbGVuYW1lCiAgICAgICAgbW0ucnVuKCkKICAgICAgICBzZWxmLmZpbGVsaXN0ID0gbW0uZmlsZWxpc3QKCiAgICBkZWYgY2hlY2tfYnJva2VuX2VnZ19pbmZvKHNlbGYpOgogICAgICAgIGJlaSA9IHNlbGYuZWdnX25hbWUgKyAnLmVnZy1pbmZvJwogICAgICAgIGlmIHNlbGYuZWdnX2Jhc2UgIT0gb3MuY3VyZGlyOgogICAgICAgICAgICBiZWkgPSBvcy5wYXRoLmpvaW4oc2VsZi5lZ2dfYmFzZSwgYmVpKQogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGJlaSk6CiAgICAgICAgICAgIGxvZy53YXJuKAogICAgICAgICAgICAgICAgIi0iICogNzggKyAnXG4nCiAgICAgICAgICAgICAgICAiTm90ZTogWW91ciBjdXJyZW50IC5lZ2ctaW5mbyBkaXJlY3RvcnkgaGFzIGEgJy0nIGluIGl0cyBuYW1lOyIKICAgICAgICAgICAgICAgICdcbnRoaXMgd2lsbCBub3Qgd29yayBjb3JyZWN0bHkgd2l0aCAic2V0dXAucHkgZGV2ZWxvcCIuXG5cbicKICAgICAgICAgICAgICAgICdQbGVhc2UgcmVuYW1lICVzIHRvICVzIHRvIGNvcnJlY3QgdGhpcyBwcm9ibGVtLlxuJyArICctJyAqIDc4LAogICAgICAgICAgICAgICAgYmVpLCBzZWxmLmVnZ19pbmZvCiAgICAgICAgICAgICkKICAgICAgICAgICAgc2VsZi5icm9rZW5fZWdnX2luZm8gPSBzZWxmLmVnZ19pbmZvCiAgICAgICAgICAgIHNlbGYuZWdnX2luZm8gPSBiZWkgICMgbWFrZSBpdCB3b3JrIGZvciBub3cKCgpjbGFzcyBGaWxlTGlzdChfRmlsZUxpc3QpOgogICAgIyBJbXBsZW1lbnRhdGlvbnMgb2YgdGhlIHZhcmlvdXMgTUFOSUZFU1QuaW4gY29tbWFuZHMKCiAgICBkZWYgcHJvY2Vzc190ZW1wbGF0ZV9saW5lKHNlbGYsIGxpbmUpOgogICAgICAgICMgUGFyc2UgdGhlIGxpbmU6IHNwbGl0IGl0IHVwLCBtYWtlIHN1cmUgdGhlIHJpZ2h0IG51bWJlciBvZiB3b3JkcwogICAgICAgICMgaXMgdGhlcmUsIGFuZCByZXR1cm4gdGhlIHJlbGV2YW50IHdvcmRzLiAgJ2FjdGlvbicgaXMgYWx3YXlzCiAgICAgICAgIyBkZWZpbmVkOiBpdCdzIHRoZSBmaXJzdCB3b3JkIG9mIHRoZSBsaW5lLiAgV2hpY2ggb2YgdGhlIG90aGVyCiAgICAgICAgIyB0aHJlZSBhcmUgZGVmaW5lZCBkZXBlbmRzIG9uIHRoZSBhY3Rpb247IGl0J2xsIGJlIGVpdGhlcgogICAgICAgICMgcGF0dGVybnMsIChkaXIgYW5kIHBhdHRlcm5zKSwgb3IgKGRpcl9wYXR0ZXJuKS4KICAgICAgICAoYWN0aW9uLCBwYXR0ZXJucywgZGlyLCBkaXJfcGF0dGVybikgPSBzZWxmLl9wYXJzZV90ZW1wbGF0ZV9saW5lKGxpbmUpCgogICAgICAgICMgT0ssIG5vdyB3ZSBrbm93IHRoYXQgdGhlIGFjdGlvbiBpcyB2YWxpZCBhbmQgd2UgaGF2ZSB0aGUKICAgICAgICAjIHJpZ2h0IG51bWJlciBvZiB3b3JkcyBvbiB0aGUgbGluZSBmb3IgdGhhdCBhY3Rpb24gLS0gc28gd2UKICAgICAgICAjIGNhbiBwcm9jZWVkIHdpdGggbWluaW1hbCBlcnJvci1jaGVja2luZy4KICAgICAgICBpZiBhY3Rpb24gPT0gJ2luY2x1ZGUnOgogICAgICAgICAgICBzZWxmLmRlYnVnX3ByaW50KCJpbmNsdWRlICIgKyAnICcuam9pbihwYXR0ZXJucykpCiAgICAgICAgICAgIGZvciBwYXR0ZXJuIGluIHBhdHRlcm5zOgogICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuaW5jbHVkZShwYXR0ZXJuKToKICAgICAgICAgICAgICAgICAgICBsb2cud2Fybigid2FybmluZzogbm8gZmlsZXMgZm91bmQgbWF0Y2hpbmcgJyVzJyIsIHBhdHRlcm4pCgogICAgICAgIGVsaWYgYWN0aW9uID09ICdleGNsdWRlJzoKICAgICAgICAgICAgc2VsZi5kZWJ1Z19wcmludCgiZXhjbHVkZSAiICsgJyAnLmpvaW4ocGF0dGVybnMpKQogICAgICAgICAgICBmb3IgcGF0dGVybiBpbiBwYXR0ZXJuczoKICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLmV4Y2x1ZGUocGF0dGVybik6CiAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oKCJ3YXJuaW5nOiBubyBwcmV2aW91c2x5LWluY2x1ZGVkIGZpbGVzICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvdW5kIG1hdGNoaW5nICclcyciKSwgcGF0dGVybikKCiAgICAgICAgZWxpZiBhY3Rpb24gPT0gJ2dsb2JhbC1pbmNsdWRlJzoKICAgICAgICAgICAgc2VsZi5kZWJ1Z19wcmludCgiZ2xvYmFsLWluY2x1ZGUgIiArICcgJy5qb2luKHBhdHRlcm5zKSkKICAgICAgICAgICAgZm9yIHBhdHRlcm4gaW4gcGF0dGVybnM6CiAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5nbG9iYWxfaW5jbHVkZShwYXR0ZXJuKToKICAgICAgICAgICAgICAgICAgICBsb2cud2FybigoIndhcm5pbmc6IG5vIGZpbGVzIGZvdW5kIG1hdGNoaW5nICclcycgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYW55d2hlcmUgaW4gZGlzdHJpYnV0aW9uIiksIHBhdHRlcm4pCgogICAgICAgIGVsaWYgYWN0aW9uID09ICdnbG9iYWwtZXhjbHVkZSc6CiAgICAgICAgICAgIHNlbGYuZGVidWdfcHJpbnQoImdsb2JhbC1leGNsdWRlICIgKyAnICcuam9pbihwYXR0ZXJucykpCiAgICAgICAgICAgIGZvciBwYXR0ZXJuIGluIHBhdHRlcm5zOgogICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuZ2xvYmFsX2V4Y2x1ZGUocGF0dGVybik6CiAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oKCJ3YXJuaW5nOiBubyBwcmV2aW91c2x5LWluY2x1ZGVkIGZpbGVzIG1hdGNoaW5nICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiclcycgZm91bmQgYW55d2hlcmUgaW4gZGlzdHJpYnV0aW9uIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybikKCiAgICAgICAgZWxpZiBhY3Rpb24gPT0gJ3JlY3Vyc2l2ZS1pbmNsdWRlJzoKICAgICAgICAgICAgc2VsZi5kZWJ1Z19wcmludCgicmVjdXJzaXZlLWluY2x1ZGUgJXMgJXMiICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGlyLCAnICcuam9pbihwYXR0ZXJucykpKQogICAgICAgICAgICBmb3IgcGF0dGVybiBpbiBwYXR0ZXJuczoKICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLnJlY3Vyc2l2ZV9pbmNsdWRlKGRpciwgcGF0dGVybik6CiAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oKCJ3YXJuaW5nOiBubyBmaWxlcyBmb3VuZCBtYXRjaGluZyAnJXMnICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuZGVyIGRpcmVjdG9yeSAnJXMnIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiwgZGlyKQoKICAgICAgICBlbGlmIGFjdGlvbiA9PSAncmVjdXJzaXZlLWV4Y2x1ZGUnOgogICAgICAgICAgICBzZWxmLmRlYnVnX3ByaW50KCJyZWN1cnNpdmUtZXhjbHVkZSAlcyAlcyIgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkaXIsICcgJy5qb2luKHBhdHRlcm5zKSkpCiAgICAgICAgICAgIGZvciBwYXR0ZXJuIGluIHBhdHRlcm5zOgogICAgICAgICAgICAgICAgaWYgbm90IHNlbGYucmVjdXJzaXZlX2V4Y2x1ZGUoZGlyLCBwYXR0ZXJuKToKICAgICAgICAgICAgICAgICAgICBsb2cud2FybigoIndhcm5pbmc6IG5vIHByZXZpb3VzbHktaW5jbHVkZWQgZmlsZXMgbWF0Y2hpbmcgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJyVzJyBmb3VuZCB1bmRlciBkaXJlY3RvcnkgJyVzJyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4sIGRpcikKCiAgICAgICAgZWxpZiBhY3Rpb24gPT0gJ2dyYWZ0JzoKICAgICAgICAgICAgc2VsZi5kZWJ1Z19wcmludCgiZ3JhZnQgIiArIGRpcl9wYXR0ZXJuKQogICAgICAgICAgICBpZiBub3Qgc2VsZi5ncmFmdChkaXJfcGF0dGVybik6CiAgICAgICAgICAgICAgICBsb2cud2Fybigid2FybmluZzogbm8gZGlyZWN0b3JpZXMgZm91bmQgbWF0Y2hpbmcgJyVzJyIsCiAgICAgICAgICAgICAgICAgICAgICAgICBkaXJfcGF0dGVybikKCiAgICAgICAgZWxpZiBhY3Rpb24gPT0gJ3BydW5lJzoKICAgICAgICAgICAgc2VsZi5kZWJ1Z19wcmludCgicHJ1bmUgIiArIGRpcl9wYXR0ZXJuKQogICAgICAgICAgICBpZiBub3Qgc2VsZi5wcnVuZShkaXJfcGF0dGVybik6CiAgICAgICAgICAgICAgICBsb2cud2FybigoIm5vIHByZXZpb3VzbHktaW5jbHVkZWQgZGlyZWN0b3JpZXMgZm91bmQgIgogICAgICAgICAgICAgICAgICAgICAgICAgICJtYXRjaGluZyAnJXMnIiksIGRpcl9wYXR0ZXJuKQoKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNJbnRlcm5hbEVycm9yKAogICAgICAgICAgICAgICAgInRoaXMgY2Fubm90IGhhcHBlbjogaW52YWxpZCBhY3Rpb24gJyVzJyIgJSBhY3Rpb24pCgogICAgZGVmIF9yZW1vdmVfZmlsZXMoc2VsZiwgcHJlZGljYXRlKToKICAgICAgICAiIiIKICAgICAgICBSZW1vdmUgYWxsIGZpbGVzIGZyb20gdGhlIGZpbGUgbGlzdCB0aGF0IG1hdGNoIHRoZSBwcmVkaWNhdGUuCiAgICAgICAgUmV0dXJuIFRydWUgaWYgYW55IG1hdGNoaW5nIGZpbGVzIHdlcmUgcmVtb3ZlZAogICAgICAgICIiIgogICAgICAgIGZvdW5kID0gRmFsc2UKICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5maWxlcykgLSAxLCAtMSwgLTEpOgogICAgICAgICAgICBpZiBwcmVkaWNhdGUoc2VsZi5maWxlc1tpXSk6CiAgICAgICAgICAgICAgICBzZWxmLmRlYnVnX3ByaW50KCIgcmVtb3ZpbmcgIiArIHNlbGYuZmlsZXNbaV0pCiAgICAgICAgICAgICAgICBkZWwgc2VsZi5maWxlc1tpXQogICAgICAgICAgICAgICAgZm91bmQgPSBUcnVlCiAgICAgICAgcmV0dXJuIGZvdW5kCgogICAgZGVmIGluY2x1ZGUoc2VsZiwgcGF0dGVybik6CiAgICAgICAgIiIiSW5jbHVkZSBmaWxlcyB0aGF0IG1hdGNoICdwYXR0ZXJuJy4iIiIKICAgICAgICBmb3VuZCA9IFtmIGZvciBmIGluIGdsb2IocGF0dGVybikgaWYgbm90IG9zLnBhdGguaXNkaXIoZildCiAgICAgICAgc2VsZi5leHRlbmQoZm91bmQpCiAgICAgICAgcmV0dXJuIGJvb2woZm91bmQpCgogICAgZGVmIGV4Y2x1ZGUoc2VsZiwgcGF0dGVybik6CiAgICAgICAgIiIiRXhjbHVkZSBmaWxlcyB0aGF0IG1hdGNoICdwYXR0ZXJuJy4iIiIKICAgICAgICBtYXRjaCA9IHRyYW5zbGF0ZV9wYXR0ZXJuKHBhdHRlcm4pCiAgICAgICAgcmV0dXJuIHNlbGYuX3JlbW92ZV9maWxlcyhtYXRjaC5tYXRjaCkKCiAgICBkZWYgcmVjdXJzaXZlX2luY2x1ZGUoc2VsZiwgZGlyLCBwYXR0ZXJuKToKICAgICAgICAiIiIKICAgICAgICBJbmNsdWRlIGFsbCBmaWxlcyBhbnl3aGVyZSBpbiAnZGlyLycgdGhhdCBtYXRjaCB0aGUgcGF0dGVybi4KICAgICAgICAiIiIKICAgICAgICBmdWxsX3BhdHRlcm4gPSBvcy5wYXRoLmpvaW4oZGlyLCAnKionLCBwYXR0ZXJuKQogICAgICAgIGZvdW5kID0gW2YgZm9yIGYgaW4gZ2xvYihmdWxsX3BhdHRlcm4sIHJlY3Vyc2l2ZT1UcnVlKQogICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKGYpXQogICAgICAgIHNlbGYuZXh0ZW5kKGZvdW5kKQogICAgICAgIHJldHVybiBib29sKGZvdW5kKQoKICAgIGRlZiByZWN1cnNpdmVfZXhjbHVkZShzZWxmLCBkaXIsIHBhdHRlcm4pOgogICAgICAgICIiIgogICAgICAgIEV4Y2x1ZGUgYW55IGZpbGUgYW55d2hlcmUgaW4gJ2Rpci8nIHRoYXQgbWF0Y2ggdGhlIHBhdHRlcm4uCiAgICAgICAgIiIiCiAgICAgICAgbWF0Y2ggPSB0cmFuc2xhdGVfcGF0dGVybihvcy5wYXRoLmpvaW4oZGlyLCAnKionLCBwYXR0ZXJuKSkKICAgICAgICByZXR1cm4gc2VsZi5fcmVtb3ZlX2ZpbGVzKG1hdGNoLm1hdGNoKQoKICAgIGRlZiBncmFmdChzZWxmLCBkaXIpOgogICAgICAgICIiIkluY2x1ZGUgYWxsIGZpbGVzIGZyb20gJ2Rpci8nLiIiIgogICAgICAgIGZvdW5kID0gWwogICAgICAgICAgICBpdGVtCiAgICAgICAgICAgIGZvciBtYXRjaF9kaXIgaW4gZ2xvYihkaXIpCiAgICAgICAgICAgIGZvciBpdGVtIGluIGRpc3R1dGlscy5maWxlbGlzdC5maW5kYWxsKG1hdGNoX2RpcikKICAgICAgICBdCiAgICAgICAgc2VsZi5leHRlbmQoZm91bmQpCiAgICAgICAgcmV0dXJuIGJvb2woZm91bmQpCgogICAgZGVmIHBydW5lKHNlbGYsIGRpcik6CiAgICAgICAgIiIiRmlsdGVyIG91dCBmaWxlcyBmcm9tICdkaXIvJy4iIiIKICAgICAgICBtYXRjaCA9IHRyYW5zbGF0ZV9wYXR0ZXJuKG9zLnBhdGguam9pbihkaXIsICcqKicpKQogICAgICAgIHJldHVybiBzZWxmLl9yZW1vdmVfZmlsZXMobWF0Y2gubWF0Y2gpCgogICAgZGVmIGdsb2JhbF9pbmNsdWRlKHNlbGYsIHBhdHRlcm4pOgogICAgICAgICIiIgogICAgICAgIEluY2x1ZGUgYWxsIGZpbGVzIGFueXdoZXJlIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB0aGF0IG1hdGNoIHRoZQogICAgICAgIHBhdHRlcm4uIFRoaXMgaXMgdmVyeSBpbmVmZmljaWVudCBvbiBsYXJnZSBmaWxlIHRyZWVzLgogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYuYWxsZmlsZXMgaXMgTm9uZToKICAgICAgICAgICAgc2VsZi5maW5kYWxsKCkKICAgICAgICBtYXRjaCA9IHRyYW5zbGF0ZV9wYXR0ZXJuKG9zLnBhdGguam9pbignKionLCBwYXR0ZXJuKSkKICAgICAgICBmb3VuZCA9IFtmIGZvciBmIGluIHNlbGYuYWxsZmlsZXMgaWYgbWF0Y2gubWF0Y2goZildCiAgICAgICAgc2VsZi5leHRlbmQoZm91bmQpCiAgICAgICAgcmV0dXJuIGJvb2woZm91bmQpCgogICAgZGVmIGdsb2JhbF9leGNsdWRlKHNlbGYsIHBhdHRlcm4pOgogICAgICAgICIiIgogICAgICAgIEV4Y2x1ZGUgYWxsIGZpbGVzIGFueXdoZXJlIHRoYXQgbWF0Y2ggdGhlIHBhdHRlcm4uCiAgICAgICAgIiIiCiAgICAgICAgbWF0Y2ggPSB0cmFuc2xhdGVfcGF0dGVybihvcy5wYXRoLmpvaW4oJyoqJywgcGF0dGVybikpCiAgICAgICAgcmV0dXJuIHNlbGYuX3JlbW92ZV9maWxlcyhtYXRjaC5tYXRjaCkKCiAgICBkZWYgYXBwZW5kKHNlbGYsIGl0ZW0pOgogICAgICAgIGlmIGl0ZW0uZW5kc3dpdGgoJ1xyJyk6ICAjIEZpeCBvbGRlciBzZGlzdHMgYnVpbHQgb24gV2luZG93cwogICAgICAgICAgICBpdGVtID0gaXRlbVs6LTFdCiAgICAgICAgcGF0aCA9IGNvbnZlcnRfcGF0aChpdGVtKQoKICAgICAgICBpZiBzZWxmLl9zYWZlX3BhdGgocGF0aCk6CiAgICAgICAgICAgIHNlbGYuZmlsZXMuYXBwZW5kKHBhdGgpCgogICAgZGVmIGV4dGVuZChzZWxmLCBwYXRocyk6CiAgICAgICAgc2VsZi5maWxlcy5leHRlbmQoZmlsdGVyKHNlbGYuX3NhZmVfcGF0aCwgcGF0aHMpKQoKICAgIGRlZiBfcmVwYWlyKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJlcGxhY2Ugc2VsZi5maWxlcyB3aXRoIG9ubHkgc2FmZSBwYXRocwoKICAgICAgICBCZWNhdXNlIHNvbWUgb3duZXJzIG9mIEZpbGVMaXN0IG1hbmlwdWxhdGUgdGhlIHVuZGVybHlpbmcKICAgICAgICBgYGZpbGVzYGAgYXR0cmlidXRlIGRpcmVjdGx5LCB0aGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCB0bwogICAgICAgIHJlcGFpciB0aG9zZSBwYXRocy4KICAgICAgICAiIiIKICAgICAgICBzZWxmLmZpbGVzID0gbGlzdChmaWx0ZXIoc2VsZi5fc2FmZV9wYXRoLCBzZWxmLmZpbGVzKSkKCiAgICBkZWYgX3NhZmVfcGF0aChzZWxmLCBwYXRoKToKICAgICAgICBlbmNfd2FybiA9ICInJXMnIG5vdCAlcyBlbmNvZGFibGUgLS0gc2tpcHBpbmciCgogICAgICAgICMgVG8gYXZvaWQgYWNjaWRlbnRhbCB0cmFucy1jb2RpbmdzIGVycm9ycywgZmlyc3QgdG8gdW5pY29kZQogICAgICAgIHVfcGF0aCA9IHVuaWNvZGVfdXRpbHMuZmlsZXN5c19kZWNvZGUocGF0aCkKICAgICAgICBpZiB1X3BhdGggaXMgTm9uZToKICAgICAgICAgICAgbG9nLndhcm4oIiclcycgaW4gdW5leHBlY3RlZCBlbmNvZGluZyAtLSBza2lwcGluZyIgJSBwYXRoKQogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgIyBNdXN0IGVuc3VyZSB1dGYtOCBlbmNvZGFiaWxpdHkKICAgICAgICB1dGY4X3BhdGggPSB1bmljb2RlX3V0aWxzLnRyeV9lbmNvZGUodV9wYXRoLCAidXRmLTgiKQogICAgICAgIGlmIHV0ZjhfcGF0aCBpcyBOb25lOgogICAgICAgICAgICBsb2cud2FybihlbmNfd2FybiwgcGF0aCwgJ3V0Zi04JykKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgIHRyeToKICAgICAgICAgICAgIyBhY2NlcHQgaXMgZWl0aGVyIHdheSBjaGVja3Mgb3V0CiAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHVfcGF0aCkgb3Igb3MucGF0aC5leGlzdHModXRmOF9wYXRoKToKICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgIyB0aGlzIHdpbGwgY2F0Y2ggYW55IGVuY29kZSBlcnJvcnMgZGVjb2RpbmcgdV9wYXRoCiAgICAgICAgZXhjZXB0IFVuaWNvZGVFbmNvZGVFcnJvcjoKICAgICAgICAgICAgbG9nLndhcm4oZW5jX3dhcm4sIHBhdGgsIHN5cy5nZXRmaWxlc3lzdGVtZW5jb2RpbmcoKSkKCgpjbGFzcyBtYW5pZmVzdF9tYWtlcihzZGlzdCk6CiAgICB0ZW1wbGF0ZSA9ICJNQU5JRkVTVC5pbiIKCiAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIHNlbGYudXNlX2RlZmF1bHRzID0gMQogICAgICAgIHNlbGYucHJ1bmUgPSAxCiAgICAgICAgc2VsZi5tYW5pZmVzdF9vbmx5ID0gMQogICAgICAgIHNlbGYuZm9yY2VfbWFuaWZlc3QgPSAxCgogICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgcGFzcwoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgc2VsZi5maWxlbGlzdCA9IEZpbGVMaXN0KCkKICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoc2VsZi5tYW5pZmVzdCk6CiAgICAgICAgICAgIHNlbGYud3JpdGVfbWFuaWZlc3QoKSAgIyBpdCBtdXN0IGV4aXN0IHNvIGl0J2xsIGdldCBpbiB0aGUgbGlzdAogICAgICAgIHNlbGYuYWRkX2RlZmF1bHRzKCkKICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhzZWxmLnRlbXBsYXRlKToKICAgICAgICAgICAgc2VsZi5yZWFkX3RlbXBsYXRlKCkKICAgICAgICBzZWxmLnBydW5lX2ZpbGVfbGlzdCgpCiAgICAgICAgc2VsZi5maWxlbGlzdC5zb3J0KCkKICAgICAgICBzZWxmLmZpbGVsaXN0LnJlbW92ZV9kdXBsaWNhdGVzKCkKICAgICAgICBzZWxmLndyaXRlX21hbmlmZXN0KCkKCiAgICBkZWYgX21hbmlmZXN0X25vcm1hbGl6ZShzZWxmLCBwYXRoKToKICAgICAgICBwYXRoID0gdW5pY29kZV91dGlscy5maWxlc3lzX2RlY29kZShwYXRoKQogICAgICAgIHJldHVybiBwYXRoLnJlcGxhY2Uob3Muc2VwLCAnLycpCgogICAgZGVmIHdyaXRlX21hbmlmZXN0KHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFdyaXRlIHRoZSBmaWxlIGxpc3QgaW4gJ3NlbGYuZmlsZWxpc3QnIHRvIHRoZSBtYW5pZmVzdCBmaWxlCiAgICAgICAgbmFtZWQgYnkgJ3NlbGYubWFuaWZlc3QnLgogICAgICAgICIiIgogICAgICAgIHNlbGYuZmlsZWxpc3QuX3JlcGFpcigpCgogICAgICAgICMgTm93IF9yZXBhaXJzIHNob3VsZCBlbmNvZGFiaWxpdHksIGJ1dCBub3QgdW5pY29kZQogICAgICAgIGZpbGVzID0gW3NlbGYuX21hbmlmZXN0X25vcm1hbGl6ZShmKSBmb3IgZiBpbiBzZWxmLmZpbGVsaXN0LmZpbGVzXQogICAgICAgIG1zZyA9ICJ3cml0aW5nIG1hbmlmZXN0IGZpbGUgJyVzJyIgJSBzZWxmLm1hbmlmZXN0CiAgICAgICAgc2VsZi5leGVjdXRlKHdyaXRlX2ZpbGUsIChzZWxmLm1hbmlmZXN0LCBmaWxlcyksIG1zZykKCiAgICBkZWYgd2FybihzZWxmLCBtc2cpOgogICAgICAgIGlmIG5vdCBzZWxmLl9zaG91bGRfc3VwcHJlc3Nfd2FybmluZyhtc2cpOgogICAgICAgICAgICBzZGlzdC53YXJuKHNlbGYsIG1zZykKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX3Nob3VsZF9zdXBwcmVzc193YXJuaW5nKG1zZyk6CiAgICAgICAgIiIiCiAgICAgICAgc3VwcHJlc3MgbWlzc2luZy1maWxlIHdhcm5pbmdzIGZyb20gc2Rpc3QKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gcmUubWF0Y2gociJzdGFuZGFyZCBmaWxlIC4qbm90IGZvdW5kIiwgbXNnKQoKICAgIGRlZiBhZGRfZGVmYXVsdHMoc2VsZik6CiAgICAgICAgc2Rpc3QuYWRkX2RlZmF1bHRzKHNlbGYpCiAgICAgICAgc2VsZi5jaGVja19saWNlbnNlKCkKICAgICAgICBzZWxmLmZpbGVsaXN0LmFwcGVuZChzZWxmLnRlbXBsYXRlKQogICAgICAgIHNlbGYuZmlsZWxpc3QuYXBwZW5kKHNlbGYubWFuaWZlc3QpCiAgICAgICAgcmNmaWxlcyA9IGxpc3Qod2Fsa19yZXZjdHJsKCkpCiAgICAgICAgaWYgcmNmaWxlczoKICAgICAgICAgICAgc2VsZi5maWxlbGlzdC5leHRlbmQocmNmaWxlcykKICAgICAgICBlbGlmIG9zLnBhdGguZXhpc3RzKHNlbGYubWFuaWZlc3QpOgogICAgICAgICAgICBzZWxmLnJlYWRfbWFuaWZlc3QoKQoKICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cygic2V0dXAucHkiKToKICAgICAgICAgICAgIyBzZXR1cC5weSBzaG91bGQgYmUgaW5jbHVkZWQgYnkgZGVmYXVsdCwgZXZlbiBpZiBpdCdzIG5vdAogICAgICAgICAgICAjIHRoZSBzY3JpcHQgY2FsbGVkIHRvIGNyZWF0ZSB0aGUgc2Rpc3QKICAgICAgICAgICAgc2VsZi5maWxlbGlzdC5hcHBlbmQoInNldHVwLnB5IikKCiAgICAgICAgZWlfY21kID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2VnZ19pbmZvJykKICAgICAgICBzZWxmLmZpbGVsaXN0LmdyYWZ0KGVpX2NtZC5lZ2dfaW5mbykKCiAgICBkZWYgcHJ1bmVfZmlsZV9saXN0KHNlbGYpOgogICAgICAgIGJ1aWxkID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2J1aWxkJykKICAgICAgICBiYXNlX2RpciA9IHNlbGYuZGlzdHJpYnV0aW9uLmdldF9mdWxsbmFtZSgpCiAgICAgICAgc2VsZi5maWxlbGlzdC5wcnVuZShidWlsZC5idWlsZF9iYXNlKQogICAgICAgIHNlbGYuZmlsZWxpc3QucHJ1bmUoYmFzZV9kaXIpCiAgICAgICAgc2VwID0gcmUuZXNjYXBlKG9zLnNlcCkKICAgICAgICBzZWxmLmZpbGVsaXN0LmV4Y2x1ZGVfcGF0dGVybihyJyhefCcgKyBzZXAgKyByJykoUkNTfENWU3xcLnN2biknICsgc2VwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3JlZ2V4PTEpCgoKZGVmIHdyaXRlX2ZpbGUoZmlsZW5hbWUsIGNvbnRlbnRzKToKICAgICIiIkNyZWF0ZSBhIGZpbGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgYW5kIHdyaXRlICdjb250ZW50cycgKGEKICAgIHNlcXVlbmNlIG9mIHN0cmluZ3Mgd2l0aG91dCBsaW5lIHRlcm1pbmF0b3JzKSB0byBpdC4KICAgICIiIgogICAgY29udGVudHMgPSAiXG4iLmpvaW4oY29udGVudHMpCgogICAgIyBhc3N1bWluZyB0aGUgY29udGVudHMgaGFzIGJlZW4gdmV0dGVkIGZvciB1dGYtOCBlbmNvZGluZwogICAgY29udGVudHMgPSBjb250ZW50cy5lbmNvZGUoInV0Zi04IikKCiAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICJ3YiIpIGFzIGY6ICAjIGFsd2F5cyB3cml0ZSBQT1NJWC1zdHlsZSBtYW5pZmVzdAogICAgICAgIGYud3JpdGUoY29udGVudHMpCgoKZGVmIHdyaXRlX3BrZ19pbmZvKGNtZCwgYmFzZW5hbWUsIGZpbGVuYW1lKToKICAgIGxvZy5pbmZvKCJ3cml0aW5nICVzIiwgZmlsZW5hbWUpCiAgICBpZiBub3QgY21kLmRyeV9ydW46CiAgICAgICAgbWV0YWRhdGEgPSBjbWQuZGlzdHJpYnV0aW9uLm1ldGFkYXRhCiAgICAgICAgbWV0YWRhdGEudmVyc2lvbiwgb2xkdmVyID0gY21kLmVnZ192ZXJzaW9uLCBtZXRhZGF0YS52ZXJzaW9uCiAgICAgICAgbWV0YWRhdGEubmFtZSwgb2xkbmFtZSA9IGNtZC5lZ2dfbmFtZSwgbWV0YWRhdGEubmFtZQoKICAgICAgICB0cnk6CiAgICAgICAgICAgICMgd3JpdGUgdW5lc2NhcGVkIGRhdGEgdG8gUEtHLUlORk8sIHNvIG9sZGVyIHBrZ19yZXNvdXJjZXMKICAgICAgICAgICAgIyBjYW4gc3RpbGwgcGFyc2UgaXQKICAgICAgICAgICAgbWV0YWRhdGEud3JpdGVfcGtnX2luZm8oY21kLmVnZ19pbmZvKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIG1ldGFkYXRhLm5hbWUsIG1ldGFkYXRhLnZlcnNpb24gPSBvbGRuYW1lLCBvbGR2ZXIKCiAgICAgICAgc2FmZSA9IGdldGF0dHIoY21kLmRpc3RyaWJ1dGlvbiwgJ3ppcF9zYWZlJywgTm9uZSkKCiAgICAgICAgYmRpc3RfZWdnLndyaXRlX3NhZmV0eV9mbGFnKGNtZC5lZ2dfaW5mbywgc2FmZSkKCgpkZWYgd2Fybl9kZXBlbmRzX29ic29sZXRlKGNtZCwgYmFzZW5hbWUsIGZpbGVuYW1lKToKICAgIGlmIG9zLnBhdGguZXhpc3RzKGZpbGVuYW1lKToKICAgICAgICBsb2cud2FybigKICAgICAgICAgICAgIldBUk5JTkc6ICdkZXBlbmRzLnR4dCcgaXMgbm90IHVzZWQgYnkgc2V0dXB0b29scyAwLjYhXG4iCiAgICAgICAgICAgICJVc2UgdGhlIGluc3RhbGxfcmVxdWlyZXMvZXh0cmFzX3JlcXVpcmUgc2V0dXAoKSBhcmdzIGluc3RlYWQuIgogICAgICAgICkKCgpkZWYgX3dyaXRlX3JlcXVpcmVtZW50cyhzdHJlYW0sIHJlcXMpOgogICAgbGluZXMgPSB5aWVsZF9saW5lcyhyZXFzIG9yICgpKQogICAgYXBwZW5kX2NyID0gbGFtYmRhIGxpbmU6IGxpbmUgKyAnXG4nCiAgICBsaW5lcyA9IG1hcChhcHBlbmRfY3IsIGxpbmVzKQogICAgc3RyZWFtLndyaXRlbGluZXMobGluZXMpCgoKZGVmIHdyaXRlX3JlcXVpcmVtZW50cyhjbWQsIGJhc2VuYW1lLCBmaWxlbmFtZSk6CiAgICBkaXN0ID0gY21kLmRpc3RyaWJ1dGlvbgogICAgZGF0YSA9IHNpeC5TdHJpbmdJTygpCiAgICBfd3JpdGVfcmVxdWlyZW1lbnRzKGRhdGEsIGRpc3QuaW5zdGFsbF9yZXF1aXJlcykKICAgIGV4dHJhc19yZXF1aXJlID0gZGlzdC5leHRyYXNfcmVxdWlyZSBvciB7fQogICAgZm9yIGV4dHJhIGluIHNvcnRlZChleHRyYXNfcmVxdWlyZSk6CiAgICAgICAgZGF0YS53cml0ZSgnXG5be2V4dHJhfV1cbicuZm9ybWF0KCoqdmFycygpKSkKICAgICAgICBfd3JpdGVfcmVxdWlyZW1lbnRzKGRhdGEsIGV4dHJhc19yZXF1aXJlW2V4dHJhXSkKICAgIGNtZC53cml0ZV9vcl9kZWxldGVfZmlsZSgicmVxdWlyZW1lbnRzIiwgZmlsZW5hbWUsIGRhdGEuZ2V0dmFsdWUoKSkKCgpkZWYgd3JpdGVfc2V0dXBfcmVxdWlyZW1lbnRzKGNtZCwgYmFzZW5hbWUsIGZpbGVuYW1lKToKICAgIGRhdGEgPSBpby5TdHJpbmdJTygpCiAgICBfd3JpdGVfcmVxdWlyZW1lbnRzKGRhdGEsIGNtZC5kaXN0cmlidXRpb24uc2V0dXBfcmVxdWlyZXMpCiAgICBjbWQud3JpdGVfb3JfZGVsZXRlX2ZpbGUoInNldHVwLXJlcXVpcmVtZW50cyIsIGZpbGVuYW1lLCBkYXRhLmdldHZhbHVlKCkpCgoKZGVmIHdyaXRlX3RvcGxldmVsX25hbWVzKGNtZCwgYmFzZW5hbWUsIGZpbGVuYW1lKToKICAgIHBrZ3MgPSBkaWN0LmZyb21rZXlzKAogICAgICAgIFsKICAgICAgICAgICAgay5zcGxpdCgnLicsIDEpWzBdCiAgICAgICAgICAgIGZvciBrIGluIGNtZC5kaXN0cmlidXRpb24uaXRlcl9kaXN0cmlidXRpb25fbmFtZXMoKQogICAgICAgIF0KICAgICkKICAgIGNtZC53cml0ZV9maWxlKCJ0b3AtbGV2ZWwgbmFtZXMiLCBmaWxlbmFtZSwgJ1xuJy5qb2luKHNvcnRlZChwa2dzKSkgKyAnXG4nKQoKCmRlZiBvdmVyd3JpdGVfYXJnKGNtZCwgYmFzZW5hbWUsIGZpbGVuYW1lKToKICAgIHdyaXRlX2FyZyhjbWQsIGJhc2VuYW1lLCBmaWxlbmFtZSwgVHJ1ZSkKCgpkZWYgd3JpdGVfYXJnKGNtZCwgYmFzZW5hbWUsIGZpbGVuYW1lLCBmb3JjZT1GYWxzZSk6CiAgICBhcmduYW1lID0gb3MucGF0aC5zcGxpdGV4dChiYXNlbmFtZSlbMF0KICAgIHZhbHVlID0gZ2V0YXR0cihjbWQuZGlzdHJpYnV0aW9uLCBhcmduYW1lLCBOb25lKQogICAgaWYgdmFsdWUgaXMgbm90IE5vbmU6CiAgICAgICAgdmFsdWUgPSAnXG4nLmpvaW4odmFsdWUpICsgJ1xuJwogICAgY21kLndyaXRlX29yX2RlbGV0ZV9maWxlKGFyZ25hbWUsIGZpbGVuYW1lLCB2YWx1ZSwgZm9yY2UpCgoKZGVmIHdyaXRlX2VudHJpZXMoY21kLCBiYXNlbmFtZSwgZmlsZW5hbWUpOgogICAgZXAgPSBjbWQuZGlzdHJpYnV0aW9uLmVudHJ5X3BvaW50cwoKICAgIGlmIGlzaW5zdGFuY2UoZXAsIHNpeC5zdHJpbmdfdHlwZXMpIG9yIGVwIGlzIE5vbmU6CiAgICAgICAgZGF0YSA9IGVwCiAgICBlbGlmIGVwIGlzIG5vdCBOb25lOgogICAgICAgIGRhdGEgPSBbXQogICAgICAgIGZvciBzZWN0aW9uLCBjb250ZW50cyBpbiBzb3J0ZWQoZXAuaXRlbXMoKSk6CiAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGNvbnRlbnRzLCBzaXguc3RyaW5nX3R5cGVzKToKICAgICAgICAgICAgICAgIGNvbnRlbnRzID0gRW50cnlQb2ludC5wYXJzZV9ncm91cChzZWN0aW9uLCBjb250ZW50cykKICAgICAgICAgICAgICAgIGNvbnRlbnRzID0gJ1xuJy5qb2luKHNvcnRlZChtYXAoc3RyLCBjb250ZW50cy52YWx1ZXMoKSkpKQogICAgICAgICAgICBkYXRhLmFwcGVuZCgnWyVzXVxuJXNcblxuJyAlIChzZWN0aW9uLCBjb250ZW50cykpCiAgICAgICAgZGF0YSA9ICcnLmpvaW4oZGF0YSkKCiAgICBjbWQud3JpdGVfb3JfZGVsZXRlX2ZpbGUoJ2VudHJ5IHBvaW50cycsIGZpbGVuYW1lLCBkYXRhLCBUcnVlKQoKCmRlZiBnZXRfcGtnX2luZm9fcmV2aXNpb24oKToKICAgICIiIgogICAgR2V0IGEgLXIjIyMgb2ZmIG9mIFBLRy1JTkZPIFZlcnNpb24gaW4gY2FzZSB0aGlzIGlzIGFuIHNkaXN0IG9mCiAgICBhIHN1YnZlcnNpb24gcmV2aXNpb24uCiAgICAiIiIKICAgIHdhcm5pbmdzLndhcm4oImdldF9wa2dfaW5mb19yZXZpc2lvbiBpcyBkZXByZWNhdGVkLiIsIEVnZ0luZm9EZXByZWNhdGlvbldhcm5pbmcpCiAgICBpZiBvcy5wYXRoLmV4aXN0cygnUEtHLUlORk8nKToKICAgICAgICB3aXRoIGlvLm9wZW4oJ1BLRy1JTkZPJykgYXMgZjoKICAgICAgICAgICAgZm9yIGxpbmUgaW4gZjoKICAgICAgICAgICAgICAgIG1hdGNoID0gcmUubWF0Y2gociJWZXJzaW9uOi4qLXIoXGQrKVxzKiQiLCBsaW5lKQogICAgICAgICAgICAgICAgaWYgbWF0Y2g6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGludChtYXRjaC5ncm91cCgxKSkKICAgIHJldHVybiAwCgoKY2xhc3MgRWdnSW5mb0RlcHJlY2F0aW9uV2FybmluZyhTZXR1cHRvb2xzRGVwcmVjYXRpb25XYXJuaW5nKToKICAgICIiIkNsYXNzIGZvciB3YXJuaW5nIGFib3V0IGRlcHJlY2F0aW9ucyBpbiBlZ2dJbmZvIGluIHNldHVwVG9vbHMuIE5vdCBpZ25vcmVkIGJ5IGRlZmF1bHQsIHVubGlrZSBEZXByZWNhdGlvbldhcm5pbmcuIiIiClBLAwQUAAAAAAAAACEAUGERrGESAABhEgAAQgAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2NvbW1hbmQvaW5zdGFsbC5weWZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzQXJnRXJyb3IKaW1wb3J0IGluc3BlY3QKaW1wb3J0IGdsb2IKaW1wb3J0IHdhcm5pbmdzCmltcG9ydCBwbGF0Zm9ybQppbXBvcnQgZGlzdHV0aWxzLmNvbW1hbmQuaW5zdGFsbCBhcyBvcmlnCgppbXBvcnQgc2V0dXB0b29scwoKIyBQcmlvciB0byBudW1weSAxLjksIE51bVB5IHJlbGllcyBvbiB0aGUgJ19pbnN0YWxsJyBuYW1lLCBzbyBwcm92aWRlIGl0IGZvcgojIG5vdy4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3NldHVwdG9vbHMvaXNzdWVzLzE5OS8KX2luc3RhbGwgPSBvcmlnLmluc3RhbGwKCgpjbGFzcyBpbnN0YWxsKG9yaWcuaW5zdGFsbCk6CiAgICAiIiJVc2UgZWFzeV9pbnN0YWxsIHRvIGluc3RhbGwgdGhlIHBhY2thZ2UsIHcvZGVwZW5kZW5jaWVzIiIiCgogICAgdXNlcl9vcHRpb25zID0gb3JpZy5pbnN0YWxsLnVzZXJfb3B0aW9ucyArIFsKICAgICAgICAoJ29sZC1hbmQtdW5tYW5hZ2VhYmxlJywgTm9uZSwgIlRyeSBub3QgdG8gdXNlIHRoaXMhIiksCiAgICAgICAgKCdzaW5nbGUtdmVyc2lvbi1leHRlcm5hbGx5LW1hbmFnZWQnLCBOb25lLAogICAgICAgICAidXNlZCBieSBzeXN0ZW0gcGFja2FnZSBidWlsZGVycyB0byBjcmVhdGUgJ2ZsYXQnIGVnZ3MiKSwKICAgIF0KICAgIGJvb2xlYW5fb3B0aW9ucyA9IG9yaWcuaW5zdGFsbC5ib29sZWFuX29wdGlvbnMgKyBbCiAgICAgICAgJ29sZC1hbmQtdW5tYW5hZ2VhYmxlJywgJ3NpbmdsZS12ZXJzaW9uLWV4dGVybmFsbHktbWFuYWdlZCcsCiAgICBdCiAgICBuZXdfY29tbWFuZHMgPSBbCiAgICAgICAgKCdpbnN0YWxsX2VnZ19pbmZvJywgbGFtYmRhIHNlbGY6IFRydWUpLAogICAgICAgICgnaW5zdGFsbF9zY3JpcHRzJywgbGFtYmRhIHNlbGY6IFRydWUpLAogICAgXQogICAgX25jID0gZGljdChuZXdfY29tbWFuZHMpCgogICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBvcmlnLmluc3RhbGwuaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpCiAgICAgICAgc2VsZi5vbGRfYW5kX3VubWFuYWdlYWJsZSA9IE5vbmUKICAgICAgICBzZWxmLnNpbmdsZV92ZXJzaW9uX2V4dGVybmFsbHlfbWFuYWdlZCA9IE5vbmUKCiAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBvcmlnLmluc3RhbGwuZmluYWxpemVfb3B0aW9ucyhzZWxmKQogICAgICAgIGlmIHNlbGYucm9vdDoKICAgICAgICAgICAgc2VsZi5zaW5nbGVfdmVyc2lvbl9leHRlcm5hbGx5X21hbmFnZWQgPSBUcnVlCiAgICAgICAgZWxpZiBzZWxmLnNpbmdsZV92ZXJzaW9uX2V4dGVybmFsbHlfbWFuYWdlZDoKICAgICAgICAgICAgaWYgbm90IHNlbGYucm9vdCBhbmQgbm90IHNlbGYucmVjb3JkOgogICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzQXJnRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgIllvdSBtdXN0IHNwZWNpZnkgLS1yZWNvcmQgb3IgLS1yb290IHdoZW4gYnVpbGRpbmcgc3lzdGVtIgogICAgICAgICAgICAgICAgICAgICIgcGFja2FnZXMiCiAgICAgICAgICAgICAgICApCgogICAgZGVmIGhhbmRsZV9leHRyYV9wYXRoKHNlbGYpOgogICAgICAgIGlmIHNlbGYucm9vdCBvciBzZWxmLnNpbmdsZV92ZXJzaW9uX2V4dGVybmFsbHlfbWFuYWdlZDoKICAgICAgICAgICAgIyBleHBsaWNpdCBiYWNrd2FyZC1jb21wYXRpYmlsaXR5IG1vZGUsIGFsbG93IGV4dHJhX3BhdGggdG8gd29yawogICAgICAgICAgICByZXR1cm4gb3JpZy5pbnN0YWxsLmhhbmRsZV9leHRyYV9wYXRoKHNlbGYpCgogICAgICAgICMgSWdub3JlIGV4dHJhX3BhdGggd2hlbiBpbnN0YWxsaW5nIGFuIGVnZyAob3IgYmVpbmcgcnVuIGJ5IGFub3RoZXIKICAgICAgICAjIGNvbW1hbmQgd2l0aG91dCAtLXJvb3Qgb3IgLS1zaW5nbGUtdmVyc2lvbi1leHRlcm5hbGx5LW1hbmFnZWQKICAgICAgICBzZWxmLnBhdGhfZmlsZSA9IE5vbmUKICAgICAgICBzZWxmLmV4dHJhX2RpcnMgPSAnJwoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgIyBFeHBsaWNpdCByZXF1ZXN0IGZvciBvbGQtc3R5bGUgaW5zdGFsbD8gIEp1c3QgZG8gaXQKICAgICAgICBpZiBzZWxmLm9sZF9hbmRfdW5tYW5hZ2VhYmxlIG9yIHNlbGYuc2luZ2xlX3ZlcnNpb25fZXh0ZXJuYWxseV9tYW5hZ2VkOgogICAgICAgICAgICByZXR1cm4gb3JpZy5pbnN0YWxsLnJ1bihzZWxmKQoKICAgICAgICBpZiBub3Qgc2VsZi5fY2FsbGVkX2Zyb21fc2V0dXAoaW5zcGVjdC5jdXJyZW50ZnJhbWUoKSk6CiAgICAgICAgICAgICMgUnVuIGluIGJhY2t3YXJkLWNvbXBhdGliaWxpdHkgbW9kZSB0byBzdXBwb3J0IGJkaXN0XyogY29tbWFuZHMuCiAgICAgICAgICAgIG9yaWcuaW5zdGFsbC5ydW4oc2VsZikKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmRvX2VnZ19pbnN0YWxsKCkKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX2NhbGxlZF9mcm9tX3NldHVwKHJ1bl9mcmFtZSk6CiAgICAgICAgIiIiCiAgICAgICAgQXR0ZW1wdCB0byBkZXRlY3Qgd2hldGhlciBydW4oKSB3YXMgY2FsbGVkIGZyb20gc2V0dXAoKSBvciBieSBhbm90aGVyCiAgICAgICAgY29tbWFuZC4gIElmIGNhbGxlZCBieSBzZXR1cCgpLCB0aGUgcGFyZW50IGNhbGxlciB3aWxsIGJlIHRoZQogICAgICAgICdydW5fY29tbWFuZCcgbWV0aG9kIGluICdkaXN0dXRpbHMuZGlzdCcsIGFuZCAqaXRzKiBjYWxsZXIgd2lsbCBiZQogICAgICAgIHRoZSAncnVuX2NvbW1hbmRzJyBtZXRob2QuICBJZiBjYWxsZWQgYW55IG90aGVyIHdheSwgdGhlCiAgICAgICAgaW1tZWRpYXRlIGNhbGxlciAqbWlnaHQqIGJlICdydW5fY29tbWFuZCcsIGJ1dCBpdCB3b24ndCBoYXZlIGJlZW4KICAgICAgICBjYWxsZWQgYnkgJ3J1bl9jb21tYW5kcycuIFJldHVybiBUcnVlIGluIHRoYXQgY2FzZSBvciBpZiBhIGNhbGwgc3RhY2sKICAgICAgICBpcyB1bmF2YWlsYWJsZS4gUmV0dXJuIEZhbHNlIG90aGVyd2lzZS4KICAgICAgICAiIiIKICAgICAgICBpZiBydW5fZnJhbWUgaXMgTm9uZToKICAgICAgICAgICAgbXNnID0gIkNhbGwgc3RhY2sgbm90IGF2YWlsYWJsZS4gYmRpc3RfKiBjb21tYW5kcyBtYXkgZmFpbC4iCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4obXNnKQogICAgICAgICAgICBpZiBwbGF0Zm9ybS5weXRob25faW1wbGVtZW50YXRpb24oKSA9PSAnSXJvblB5dGhvbic6CiAgICAgICAgICAgICAgICBtc2cgPSAiRm9yIGJlc3QgcmVzdWx0cywgcGFzcyAtWDpGcmFtZXMgdG8gZW5hYmxlIGNhbGwgc3RhY2suIgogICAgICAgICAgICAgICAgd2FybmluZ3Mud2Fybihtc2cpCiAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgcmVzID0gaW5zcGVjdC5nZXRvdXRlcmZyYW1lcyhydW5fZnJhbWUpWzJdCiAgICAgICAgY2FsbGVyLCA9IHJlc1s6MV0KICAgICAgICBpbmZvID0gaW5zcGVjdC5nZXRmcmFtZWluZm8oY2FsbGVyKQogICAgICAgIGNhbGxlcl9tb2R1bGUgPSBjYWxsZXIuZl9nbG9iYWxzLmdldCgnX19uYW1lX18nLCAnJykKICAgICAgICByZXR1cm4gKAogICAgICAgICAgICBjYWxsZXJfbW9kdWxlID09ICdkaXN0dXRpbHMuZGlzdCcKICAgICAgICAgICAgYW5kIGluZm8uZnVuY3Rpb24gPT0gJ3J1bl9jb21tYW5kcycKICAgICAgICApCgogICAgZGVmIGRvX2VnZ19pbnN0YWxsKHNlbGYpOgoKICAgICAgICBlYXN5X2luc3RhbGwgPSBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfY29tbWFuZF9jbGFzcygnZWFzeV9pbnN0YWxsJykKCiAgICAgICAgY21kID0gZWFzeV9pbnN0YWxsKAogICAgICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbiwgYXJncz0ieCIsIHJvb3Q9c2VsZi5yb290LCByZWNvcmQ9c2VsZi5yZWNvcmQsCiAgICAgICAgKQogICAgICAgIGNtZC5lbnN1cmVfZmluYWxpemVkKCkgICMgZmluYWxpemUgYmVmb3JlIGJkaXN0X2VnZyBtdW5nZXMgaW5zdGFsbCBjbWQKICAgICAgICBjbWQuYWx3YXlzX2NvcHlfZnJvbSA9ICcuJyAgIyBtYWtlIHN1cmUgbG9jYWwtZGlyIGVnZ3MgZ2V0IGluc3RhbGxlZAoKICAgICAgICAjIHBpY2sgdXAgc2V0dXAtZGlyIC5lZ2cgZmlsZXMgb25seTogbm8gLmVnZy1pbmZvCiAgICAgICAgY21kLnBhY2thZ2VfaW5kZXguc2NhbihnbG9iLmdsb2IoJyouZWdnJykpCgogICAgICAgIHNlbGYucnVuX2NvbW1hbmQoJ2JkaXN0X2VnZycpCiAgICAgICAgYXJncyA9IFtzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfY29tbWFuZF9vYmooJ2JkaXN0X2VnZycpLmVnZ19vdXRwdXRdCgogICAgICAgIGlmIHNldHVwdG9vbHMuYm9vdHN0cmFwX2luc3RhbGxfZnJvbToKICAgICAgICAgICAgIyBCb290c3RyYXAgc2VsZi1pbnN0YWxsYXRpb24gb2Ygc2V0dXB0b29scwogICAgICAgICAgICBhcmdzLmluc2VydCgwLCBzZXR1cHRvb2xzLmJvb3RzdHJhcF9pbnN0YWxsX2Zyb20pCgogICAgICAgIGNtZC5hcmdzID0gYXJncwogICAgICAgIGNtZC5ydW4oc2hvd19kZXByZWNhdGlvbj1GYWxzZSkKICAgICAgICBzZXR1cHRvb2xzLmJvb3RzdHJhcF9pbnN0YWxsX2Zyb20gPSBOb25lCgoKIyBYWFggUHl0aG9uIDMuMSBkb2Vzbid0IHNlZSBfbmMgaWYgdGhpcyBpcyBpbnNpZGUgdGhlIGNsYXNzCmluc3RhbGwuc3ViX2NvbW1hbmRzID0gKAogICAgW2NtZCBmb3IgY21kIGluIG9yaWcuaW5zdGFsbC5zdWJfY29tbWFuZHMgaWYgY21kWzBdIG5vdCBpbiBpbnN0YWxsLl9uY10gKwogICAgaW5zdGFsbC5uZXdfY29tbWFuZHMKKQpQSwMEFAAAAAAAAAAhAFzSqOWbCAAAmwgAAEsAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9jb21tYW5kL2luc3RhbGxfZWdnX2luZm8ucHlmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nLCBkaXJfdXRpbAppbXBvcnQgb3MKCmZyb20gc2V0dXB0b29scyBpbXBvcnQgQ29tbWFuZApmcm9tIHNldHVwdG9vbHMgaW1wb3J0IG5hbWVzcGFjZXMKZnJvbSBzZXR1cHRvb2xzLmFyY2hpdmVfdXRpbCBpbXBvcnQgdW5wYWNrX2FyY2hpdmUKaW1wb3J0IHBrZ19yZXNvdXJjZXMKCgpjbGFzcyBpbnN0YWxsX2VnZ19pbmZvKG5hbWVzcGFjZXMuSW5zdGFsbGVyLCBDb21tYW5kKToKICAgICIiIkluc3RhbGwgYW4gLmVnZy1pbmZvIGRpcmVjdG9yeSBmb3IgdGhlIHBhY2thZ2UiIiIKCiAgICBkZXNjcmlwdGlvbiA9ICJJbnN0YWxsIGFuIC5lZ2ctaW5mbyBkaXJlY3RvcnkgZm9yIHRoZSBwYWNrYWdlIgoKICAgIHVzZXJfb3B0aW9ucyA9IFsKICAgICAgICAoJ2luc3RhbGwtZGlyPScsICdkJywgImRpcmVjdG9yeSB0byBpbnN0YWxsIHRvIiksCiAgICBdCgogICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBzZWxmLmluc3RhbGxfZGlyID0gTm9uZQoKICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIHNlbGYuc2V0X3VuZGVmaW5lZF9vcHRpb25zKCdpbnN0YWxsX2xpYicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdpbnN0YWxsX2RpcicsICdpbnN0YWxsX2RpcicpKQogICAgICAgIGVpX2NtZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCJlZ2dfaW5mbyIpCiAgICAgICAgYmFzZW5hbWUgPSBwa2dfcmVzb3VyY2VzLkRpc3RyaWJ1dGlvbigKICAgICAgICAgICAgTm9uZSwgTm9uZSwgZWlfY21kLmVnZ19uYW1lLCBlaV9jbWQuZWdnX3ZlcnNpb24KICAgICAgICApLmVnZ19uYW1lKCkgKyAnLmVnZy1pbmZvJwogICAgICAgIHNlbGYuc291cmNlID0gZWlfY21kLmVnZ19pbmZvCiAgICAgICAgc2VsZi50YXJnZXQgPSBvcy5wYXRoLmpvaW4oc2VsZi5pbnN0YWxsX2RpciwgYmFzZW5hbWUpCiAgICAgICAgc2VsZi5vdXRwdXRzID0gW10KCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgIHNlbGYucnVuX2NvbW1hbmQoJ2VnZ19pbmZvJykKICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKHNlbGYudGFyZ2V0KSBhbmQgbm90IG9zLnBhdGguaXNsaW5rKHNlbGYudGFyZ2V0KToKICAgICAgICAgICAgZGlyX3V0aWwucmVtb3ZlX3RyZWUoc2VsZi50YXJnZXQsIGRyeV9ydW49c2VsZi5kcnlfcnVuKQogICAgICAgIGVsaWYgb3MucGF0aC5leGlzdHMoc2VsZi50YXJnZXQpOgogICAgICAgICAgICBzZWxmLmV4ZWN1dGUob3MudW5saW5rLCAoc2VsZi50YXJnZXQsKSwgIlJlbW92aW5nICIgKyBzZWxmLnRhcmdldCkKICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICBwa2dfcmVzb3VyY2VzLmVuc3VyZV9kaXJlY3Rvcnkoc2VsZi50YXJnZXQpCiAgICAgICAgc2VsZi5leGVjdXRlKAogICAgICAgICAgICBzZWxmLmNvcHl0cmVlLCAoKSwgIkNvcHlpbmcgJXMgdG8gJXMiICUgKHNlbGYuc291cmNlLCBzZWxmLnRhcmdldCkKICAgICAgICApCiAgICAgICAgc2VsZi5pbnN0YWxsX25hbWVzcGFjZXMoKQoKICAgIGRlZiBnZXRfb3V0cHV0cyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5vdXRwdXRzCgogICAgZGVmIGNvcHl0cmVlKHNlbGYpOgogICAgICAgICMgQ29weSB0aGUgLmVnZy1pbmZvIHRyZWUgdG8gc2l0ZS1wYWNrYWdlcwogICAgICAgIGRlZiBza2ltbWVyKHNyYywgZHN0KToKICAgICAgICAgICAgIyBmaWx0ZXIgb3V0IHNvdXJjZS1jb250cm9sIGRpcmVjdG9yaWVzOyBub3RlIHRoYXQgJ3NyYycgaXMgYWx3YXlzCiAgICAgICAgICAgICMgYSAnLyctc2VwYXJhdGVkIHBhdGgsIHJlZ2FyZGxlc3Mgb2YgcGxhdGZvcm0uICAnZHN0JyBpcyBhCiAgICAgICAgICAgICMgcGxhdGZvcm0tc3BlY2lmaWMgcGF0aC4KICAgICAgICAgICAgZm9yIHNraXAgaW4gJy5zdm4vJywgJ0NWUy8nOgogICAgICAgICAgICAgICAgaWYgc3JjLnN0YXJ0c3dpdGgoc2tpcCkgb3IgJy8nICsgc2tpcCBpbiBzcmM6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICAgICAgc2VsZi5vdXRwdXRzLmFwcGVuZChkc3QpCiAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ29weWluZyAlcyB0byAlcyIsIHNyYywgZHN0KQogICAgICAgICAgICByZXR1cm4gZHN0CgogICAgICAgIHVucGFja19hcmNoaXZlKHNlbGYuc291cmNlLCBzZWxmLnRhcmdldCwgc2tpbW1lcikKUEsDBBQAAAAAAAAAIQAS04wqFg8AABYPAABGAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvY29tbWFuZC9pbnN0YWxsX2xpYi5weWltcG9ydCBvcwppbXBvcnQgc3lzCmZyb20gaXRlcnRvb2xzIGltcG9ydCBwcm9kdWN0LCBzdGFybWFwCmltcG9ydCBkaXN0dXRpbHMuY29tbWFuZC5pbnN0YWxsX2xpYiBhcyBvcmlnCgoKY2xhc3MgaW5zdGFsbF9saWIob3JpZy5pbnN0YWxsX2xpYik6CiAgICAiIiJEb24ndCBhZGQgY29tcGlsZWQgZmxhZ3MgdG8gZmlsZW5hbWVzIG9mIG5vbi1QeXRob24gZmlsZXMiIiIKCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgIHNlbGYuYnVpbGQoKQogICAgICAgIG91dGZpbGVzID0gc2VsZi5pbnN0YWxsKCkKICAgICAgICBpZiBvdXRmaWxlcyBpcyBub3QgTm9uZToKICAgICAgICAgICAgIyBhbHdheXMgY29tcGlsZSwgaW4gY2FzZSB3ZSBoYXZlIGFueSBleHRlbnNpb24gc3R1YnMgdG8gZGVhbCB3aXRoCiAgICAgICAgICAgIHNlbGYuYnl0ZV9jb21waWxlKG91dGZpbGVzKQoKICAgIGRlZiBnZXRfZXhjbHVzaW9ucyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gYSBjb2xsZWN0aW9ucy5TaXplZCBjb2xsZWN0aW9ucy5Db250YWluZXIgb2YgcGF0aHMgdG8gYmUKICAgICAgICBleGNsdWRlZCBmb3Igc2luZ2xlX3ZlcnNpb25fZXh0ZXJuYWxseV9tYW5hZ2VkIGluc3RhbGxhdGlvbnMuCiAgICAgICAgIiIiCiAgICAgICAgYWxsX3BhY2thZ2VzID0gKAogICAgICAgICAgICBwa2cKICAgICAgICAgICAgZm9yIG5zX3BrZyBpbiBzZWxmLl9nZXRfU1ZFTV9OU1BzKCkKICAgICAgICAgICAgZm9yIHBrZyBpbiBzZWxmLl9hbGxfcGFja2FnZXMobnNfcGtnKQogICAgICAgICkKCiAgICAgICAgZXhjbF9zcGVjcyA9IHByb2R1Y3QoYWxsX3BhY2thZ2VzLCBzZWxmLl9nZW5fZXhjbHVzaW9uX3BhdGhzKCkpCiAgICAgICAgcmV0dXJuIHNldChzdGFybWFwKHNlbGYuX2V4Y2x1ZGVfcGtnX3BhdGgsIGV4Y2xfc3BlY3MpKQoKICAgIGRlZiBfZXhjbHVkZV9wa2dfcGF0aChzZWxmLCBwa2csIGV4Y2x1c2lvbl9wYXRoKToKICAgICAgICAiIiIKICAgICAgICBHaXZlbiBhIHBhY2thZ2UgbmFtZSBhbmQgZXhjbHVzaW9uIHBhdGggd2l0aGluIHRoYXQgcGFja2FnZSwKICAgICAgICBjb21wdXRlIHRoZSBmdWxsIGV4Y2x1c2lvbiBwYXRoLgogICAgICAgICIiIgogICAgICAgIHBhcnRzID0gcGtnLnNwbGl0KCcuJykgKyBbZXhjbHVzaW9uX3BhdGhdCiAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbihzZWxmLmluc3RhbGxfZGlyLCAqcGFydHMpCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9hbGxfcGFja2FnZXMocGtnX25hbWUpOgogICAgICAgICIiIgogICAgICAgID4+PiBsaXN0KGluc3RhbGxfbGliLl9hbGxfcGFja2FnZXMoJ2Zvby5iYXIuYmF6JykpCiAgICAgICAgWydmb28uYmFyLmJheicsICdmb28uYmFyJywgJ2ZvbyddCiAgICAgICAgIiIiCiAgICAgICAgd2hpbGUgcGtnX25hbWU6CiAgICAgICAgICAgIHlpZWxkIHBrZ19uYW1lCiAgICAgICAgICAgIHBrZ19uYW1lLCBzZXAsIGNoaWxkID0gcGtnX25hbWUucnBhcnRpdGlvbignLicpCgogICAgZGVmIF9nZXRfU1ZFTV9OU1BzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIEdldCBuYW1lc3BhY2UgcGFja2FnZXMgKGxpc3QpIGJ1dCBvbmx5IGZvcgogICAgICAgIHNpbmdsZV92ZXJzaW9uX2V4dGVybmFsbHlfbWFuYWdlZCBpbnN0YWxsYXRpb25zIGFuZCBlbXB0eSBvdGhlcndpc2UuCiAgICAgICAgIiIiCiAgICAgICAgIyBUT0RPOiBpcyBpdCBuZWNlc3NhcnkgdG8gc2hvcnQtY2lyY3VpdCBoZXJlPyBpLmUuIHdoYXQncyB0aGUgY29zdAogICAgICAgICMgaWYgZ2V0X2ZpbmFsaXplZF9jb21tYW5kIGlzIGNhbGxlZCBldmVuIHdoZW4gbmFtZXNwYWNlX3BhY2thZ2VzIGlzCiAgICAgICAgIyBGYWxzZT8KICAgICAgICBpZiBub3Qgc2VsZi5kaXN0cmlidXRpb24ubmFtZXNwYWNlX3BhY2thZ2VzOgogICAgICAgICAgICByZXR1cm4gW10KCiAgICAgICAgaW5zdGFsbF9jbWQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnaW5zdGFsbCcpCiAgICAgICAgc3ZlbSA9IGluc3RhbGxfY21kLnNpbmdsZV92ZXJzaW9uX2V4dGVybmFsbHlfbWFuYWdlZAoKICAgICAgICByZXR1cm4gc2VsZi5kaXN0cmlidXRpb24ubmFtZXNwYWNlX3BhY2thZ2VzIGlmIHN2ZW0gZWxzZSBbXQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfZ2VuX2V4Y2x1c2lvbl9wYXRocygpOgogICAgICAgICIiIgogICAgICAgIEdlbmVyYXRlIGZpbGUgcGF0aHMgdG8gYmUgZXhjbHVkZWQgZm9yIG5hbWVzcGFjZSBwYWNrYWdlcyAoYnl0ZWNvZGUKICAgICAgICBjYWNoZSBmaWxlcykuCiAgICAgICAgIiIiCiAgICAgICAgIyBhbHdheXMgZXhjbHVkZSB0aGUgcGFja2FnZSBtb2R1bGUgaXRzZWxmCiAgICAgICAgeWllbGQgJ19faW5pdF9fLnB5JwoKICAgICAgICB5aWVsZCAnX19pbml0X18ucHljJwogICAgICAgIHlpZWxkICdfX2luaXRfXy5weW8nCgogICAgICAgIGlmIG5vdCBoYXNhdHRyKHN5cywgJ2ltcGxlbWVudGF0aW9uJyk6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBiYXNlID0gb3MucGF0aC5qb2luKCdfX3B5Y2FjaGVfXycsICdfX2luaXRfXy4nICsgc3lzLmltcGxlbWVudGF0aW9uLmNhY2hlX3RhZykKICAgICAgICB5aWVsZCBiYXNlICsgJy5weWMnCiAgICAgICAgeWllbGQgYmFzZSArICcucHlvJwogICAgICAgIHlpZWxkIGJhc2UgKyAnLm9wdC0xLnB5YycKICAgICAgICB5aWVsZCBiYXNlICsgJy5vcHQtMi5weWMnCgogICAgZGVmIGNvcHlfdHJlZSgKICAgICAgICAgICAgc2VsZiwgaW5maWxlLCBvdXRmaWxlLAogICAgICAgICAgICBwcmVzZXJ2ZV9tb2RlPTEsIHByZXNlcnZlX3RpbWVzPTEsIHByZXNlcnZlX3N5bWxpbmtzPTAsIGxldmVsPTEKICAgICk6CiAgICAgICAgYXNzZXJ0IHByZXNlcnZlX21vZGUgYW5kIHByZXNlcnZlX3RpbWVzIGFuZCBub3QgcHJlc2VydmVfc3ltbGlua3MKICAgICAgICBleGNsdWRlID0gc2VsZi5nZXRfZXhjbHVzaW9ucygpCgogICAgICAgIGlmIG5vdCBleGNsdWRlOgogICAgICAgICAgICByZXR1cm4gb3JpZy5pbnN0YWxsX2xpYi5jb3B5X3RyZWUoc2VsZiwgaW5maWxlLCBvdXRmaWxlKQoKICAgICAgICAjIEV4Y2x1ZGUgbmFtZXNwYWNlIHBhY2thZ2UgX19pbml0X18ucHkqIGZpbGVzIGZyb20gdGhlIG91dHB1dAoKICAgICAgICBmcm9tIHNldHVwdG9vbHMuYXJjaGl2ZV91dGlsIGltcG9ydCB1bnBhY2tfZGlyZWN0b3J5CiAgICAgICAgZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZwoKICAgICAgICBvdXRmaWxlcyA9IFtdCgogICAgICAgIGRlZiBwZihzcmMsIGRzdCk6CiAgICAgICAgICAgIGlmIGRzdCBpbiBleGNsdWRlOgogICAgICAgICAgICAgICAgbG9nLndhcm4oIlNraXBwaW5nIGluc3RhbGxhdGlvbiBvZiAlcyAobmFtZXNwYWNlIHBhY2thZ2UpIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCkKICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICAgICAgbG9nLmluZm8oImNvcHlpbmcgJXMgLT4gJXMiLCBzcmMsIG9zLnBhdGguZGlybmFtZShkc3QpKQogICAgICAgICAgICBvdXRmaWxlcy5hcHBlbmQoZHN0KQogICAgICAgICAgICByZXR1cm4gZHN0CgogICAgICAgIHVucGFja19kaXJlY3RvcnkoaW5maWxlLCBvdXRmaWxlLCBwZikKICAgICAgICByZXR1cm4gb3V0ZmlsZXMKCiAgICBkZWYgZ2V0X291dHB1dHMoc2VsZik6CiAgICAgICAgb3V0cHV0cyA9IG9yaWcuaW5zdGFsbF9saWIuZ2V0X291dHB1dHMoc2VsZikKICAgICAgICBleGNsdWRlID0gc2VsZi5nZXRfZXhjbHVzaW9ucygpCiAgICAgICAgaWYgZXhjbHVkZToKICAgICAgICAgICAgcmV0dXJuIFtmIGZvciBmIGluIG91dHB1dHMgaWYgZiBub3QgaW4gZXhjbHVkZV0KICAgICAgICByZXR1cm4gb3V0cHV0cwpQSwMEFAAAAAAAAAAhAEY/8R6HCQAAhwkAAEoAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9jb21tYW5kL2luc3RhbGxfc2NyaXB0cy5weWZyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKaW1wb3J0IGRpc3R1dGlscy5jb21tYW5kLmluc3RhbGxfc2NyaXB0cyBhcyBvcmlnCmltcG9ydCBvcwppbXBvcnQgc3lzCgpmcm9tIHBrZ19yZXNvdXJjZXMgaW1wb3J0IERpc3RyaWJ1dGlvbiwgUGF0aE1ldGFkYXRhLCBlbnN1cmVfZGlyZWN0b3J5CgoKY2xhc3MgaW5zdGFsbF9zY3JpcHRzKG9yaWcuaW5zdGFsbF9zY3JpcHRzKToKICAgICIiIkRvIG5vcm1hbCBzY3JpcHQgaW5zdGFsbCwgcGx1cyBhbnkgZWdnX2luZm8gd3JhcHBlciBzY3JpcHRzIiIiCgogICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBvcmlnLmluc3RhbGxfc2NyaXB0cy5pbml0aWFsaXplX29wdGlvbnMoc2VsZikKICAgICAgICBzZWxmLm5vX2VwID0gRmFsc2UKCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgIGltcG9ydCBzZXR1cHRvb2xzLmNvbW1hbmQuZWFzeV9pbnN0YWxsIGFzIGVpCgogICAgICAgIHNlbGYucnVuX2NvbW1hbmQoImVnZ19pbmZvIikKICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi5zY3JpcHRzOgogICAgICAgICAgICBvcmlnLmluc3RhbGxfc2NyaXB0cy5ydW4oc2VsZikgICMgcnVuIGZpcnN0IHRvIHNldCB1cCBzZWxmLm91dGZpbGVzCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5vdXRmaWxlcyA9IFtdCiAgICAgICAgaWYgc2VsZi5ub19lcDoKICAgICAgICAgICAgIyBkb24ndCBpbnN0YWxsIGVudHJ5IHBvaW50IHNjcmlwdHMgaW50byAuZWdnIGZpbGUhCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBlaV9jbWQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgiZWdnX2luZm8iKQogICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24oCiAgICAgICAgICAgIGVpX2NtZC5lZ2dfYmFzZSwgUGF0aE1ldGFkYXRhKGVpX2NtZC5lZ2dfYmFzZSwgZWlfY21kLmVnZ19pbmZvKSwKICAgICAgICAgICAgZWlfY21kLmVnZ19uYW1lLCBlaV9jbWQuZWdnX3ZlcnNpb24sCiAgICAgICAgKQogICAgICAgIGJzX2NtZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdidWlsZF9zY3JpcHRzJykKICAgICAgICBleGVjX3BhcmFtID0gZ2V0YXR0cihic19jbWQsICdleGVjdXRhYmxlJywgTm9uZSkKICAgICAgICBid19jbWQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgiYmRpc3Rfd2luaW5zdCIpCiAgICAgICAgaXNfd2luaW5zdCA9IGdldGF0dHIoYndfY21kLCAnX2lzX3J1bm5pbmcnLCBGYWxzZSkKICAgICAgICB3cml0ZXIgPSBlaS5TY3JpcHRXcml0ZXIKICAgICAgICBpZiBpc193aW5pbnN0OgogICAgICAgICAgICBleGVjX3BhcmFtID0gInB5dGhvbi5leGUiCiAgICAgICAgICAgIHdyaXRlciA9IGVpLldpbmRvd3NTY3JpcHRXcml0ZXIKICAgICAgICBpZiBleGVjX3BhcmFtID09IHN5cy5leGVjdXRhYmxlOgogICAgICAgICAgICAjIEluIGNhc2UgdGhlIHBhdGggdG8gdGhlIFB5dGhvbiBleGVjdXRhYmxlIGNvbnRhaW5zIGEgc3BhY2UsIHdyYXAKICAgICAgICAgICAgIyBpdCBzbyBpdCdzIG5vdCBzcGxpdCB1cC4KICAgICAgICAgICAgZXhlY19wYXJhbSA9IFtleGVjX3BhcmFtXQogICAgICAgICMgcmVzb2x2ZSB0aGUgd3JpdGVyIHRvIHRoZSBlbnZpcm9ubWVudAogICAgICAgIHdyaXRlciA9IHdyaXRlci5iZXN0KCkKICAgICAgICBjbWQgPSB3cml0ZXIuY29tbWFuZF9zcGVjX2NsYXNzLmJlc3QoKS5mcm9tX3BhcmFtKGV4ZWNfcGFyYW0pCiAgICAgICAgZm9yIGFyZ3MgaW4gd3JpdGVyLmdldF9hcmdzKGRpc3QsIGNtZC5hc19oZWFkZXIoKSk6CiAgICAgICAgICAgIHNlbGYud3JpdGVfc2NyaXB0KCphcmdzKQoKICAgIGRlZiB3cml0ZV9zY3JpcHQoc2VsZiwgc2NyaXB0X25hbWUsIGNvbnRlbnRzLCBtb2RlPSJ0IiwgKmlnbm9yZWQpOgogICAgICAgICIiIldyaXRlIGFuIGV4ZWN1dGFibGUgZmlsZSB0byB0aGUgc2NyaXB0cyBkaXJlY3RvcnkiIiIKICAgICAgICBmcm9tIHNldHVwdG9vbHMuY29tbWFuZC5lYXN5X2luc3RhbGwgaW1wb3J0IGNobW9kLCBjdXJyZW50X3VtYXNrCgogICAgICAgIGxvZy5pbmZvKCJJbnN0YWxsaW5nICVzIHNjcmlwdCB0byAlcyIsIHNjcmlwdF9uYW1lLCBzZWxmLmluc3RhbGxfZGlyKQogICAgICAgIHRhcmdldCA9IG9zLnBhdGguam9pbihzZWxmLmluc3RhbGxfZGlyLCBzY3JpcHRfbmFtZSkKICAgICAgICBzZWxmLm91dGZpbGVzLmFwcGVuZCh0YXJnZXQpCgogICAgICAgIG1hc2sgPSBjdXJyZW50X3VtYXNrKCkKICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICBlbnN1cmVfZGlyZWN0b3J5KHRhcmdldCkKICAgICAgICAgICAgZiA9IG9wZW4odGFyZ2V0LCAidyIgKyBtb2RlKQogICAgICAgICAgICBmLndyaXRlKGNvbnRlbnRzKQogICAgICAgICAgICBmLmNsb3NlKCkKICAgICAgICAgICAgY2htb2QodGFyZ2V0LCAwbzc3NyAtIG1hc2spClBLAwQUAAAAAAAAACEAfXNgv3oTAAB6EwAARQAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2NvbW1hbmQvcHkzNmNvbXBhdC5weWltcG9ydCBvcwpmcm9tIGdsb2IgaW1wb3J0IGdsb2IKZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgY29udmVydF9wYXRoCmZyb20gZGlzdHV0aWxzLmNvbW1hbmQgaW1wb3J0IHNkaXN0Cgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuLnNpeC5tb3ZlcyBpbXBvcnQgZmlsdGVyCgoKY2xhc3Mgc2Rpc3RfYWRkX2RlZmF1bHRzOgogICAgIiIiCiAgICBNaXgtaW4gcHJvdmlkaW5nIGZvcndhcmQtY29tcGF0aWJpbGl0eSBmb3IgZnVuY3Rpb25hbGl0eSBhcyBmb3VuZCBpbgogICAgZGlzdHV0aWxzIG9uIFB5dGhvbiAzLjcuCgogICAgRG8gbm90IGVkaXQgdGhlIGNvZGUgaW4gdGhpcyBjbGFzcyBleGNlcHQgdG8gdXBkYXRlIGZ1bmN0aW9uYWxpdHkKICAgIGFzIGltcGxlbWVudGVkIGluIGRpc3R1dGlscy4gSW5zdGVhZCwgb3ZlcnJpZGUgaW4gdGhlIHN1YmNsYXNzLgogICAgIiIiCgogICAgZGVmIGFkZF9kZWZhdWx0cyhzZWxmKToKICAgICAgICAiIiJBZGQgYWxsIHRoZSBkZWZhdWx0IGZpbGVzIHRvIHNlbGYuZmlsZWxpc3Q6CiAgICAgICAgICAtIFJFQURNRSBvciBSRUFETUUudHh0CiAgICAgICAgICAtIHNldHVwLnB5CiAgICAgICAgICAtIHRlc3QvdGVzdCoucHkKICAgICAgICAgIC0gYWxsIHB1cmUgUHl0aG9uIG1vZHVsZXMgbWVudGlvbmVkIGluIHNldHVwIHNjcmlwdAogICAgICAgICAgLSBhbGwgZmlsZXMgcG9pbnRlZCBieSBwYWNrYWdlX2RhdGEgKGJ1aWxkX3B5KQogICAgICAgICAgLSBhbGwgZmlsZXMgZGVmaW5lZCBpbiBkYXRhX2ZpbGVzLgogICAgICAgICAgLSBhbGwgZmlsZXMgZGVmaW5lZCBhcyBzY3JpcHRzLgogICAgICAgICAgLSBhbGwgQyBzb3VyY2VzIGxpc3RlZCBhcyBwYXJ0IG9mIGV4dGVuc2lvbnMgb3IgQyBsaWJyYXJpZXMKICAgICAgICAgICAgaW4gdGhlIHNldHVwIHNjcmlwdCAoZG9lc24ndCBjYXRjaCBDIGhlYWRlcnMhKQogICAgICAgIFdhcm5zIGlmIChSRUFETUUgb3IgUkVBRE1FLnR4dCkgb3Igc2V0dXAucHkgYXJlIG1pc3Npbmc7IGV2ZXJ5dGhpbmcKICAgICAgICBlbHNlIGlzIG9wdGlvbmFsLgogICAgICAgICIiIgogICAgICAgIHNlbGYuX2FkZF9kZWZhdWx0c19zdGFuZGFyZHMoKQogICAgICAgIHNlbGYuX2FkZF9kZWZhdWx0c19vcHRpb25hbCgpCiAgICAgICAgc2VsZi5fYWRkX2RlZmF1bHRzX3B5dGhvbigpCiAgICAgICAgc2VsZi5fYWRkX2RlZmF1bHRzX2RhdGFfZmlsZXMoKQogICAgICAgIHNlbGYuX2FkZF9kZWZhdWx0c19leHQoKQogICAgICAgIHNlbGYuX2FkZF9kZWZhdWx0c19jX2xpYnMoKQogICAgICAgIHNlbGYuX2FkZF9kZWZhdWx0c19zY3JpcHRzKCkKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX2NzX3BhdGhfZXhpc3RzKGZzcGF0aCk6CiAgICAgICAgIiIiCiAgICAgICAgQ2FzZS1zZW5zaXRpdmUgcGF0aCBleGlzdGVuY2UgY2hlY2sKCiAgICAgICAgPj4+IHNkaXN0X2FkZF9kZWZhdWx0cy5fY3NfcGF0aF9leGlzdHMoX19maWxlX18pCiAgICAgICAgVHJ1ZQogICAgICAgID4+PiBzZGlzdF9hZGRfZGVmYXVsdHMuX2NzX3BhdGhfZXhpc3RzKF9fZmlsZV9fLnVwcGVyKCkpCiAgICAgICAgRmFsc2UKICAgICAgICAiIiIKICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoZnNwYXRoKToKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgIyBtYWtlIGFic29sdXRlIHNvIHdlIGFsd2F5cyBoYXZlIGEgZGlyZWN0b3J5CiAgICAgICAgYWJzcGF0aCA9IG9zLnBhdGguYWJzcGF0aChmc3BhdGgpCiAgICAgICAgZGlyZWN0b3J5LCBmaWxlbmFtZSA9IG9zLnBhdGguc3BsaXQoYWJzcGF0aCkKICAgICAgICByZXR1cm4gZmlsZW5hbWUgaW4gb3MubGlzdGRpcihkaXJlY3RvcnkpCgogICAgZGVmIF9hZGRfZGVmYXVsdHNfc3RhbmRhcmRzKHNlbGYpOgogICAgICAgIHN0YW5kYXJkcyA9IFtzZWxmLlJFQURNRVMsIHNlbGYuZGlzdHJpYnV0aW9uLnNjcmlwdF9uYW1lXQogICAgICAgIGZvciBmbiBpbiBzdGFuZGFyZHM6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZm4sIHR1cGxlKToKICAgICAgICAgICAgICAgIGFsdHMgPSBmbgogICAgICAgICAgICAgICAgZ290X2l0ID0gRmFsc2UKICAgICAgICAgICAgICAgIGZvciBmbiBpbiBhbHRzOgogICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuX2NzX3BhdGhfZXhpc3RzKGZuKToKICAgICAgICAgICAgICAgICAgICAgICAgZ290X2l0ID0gVHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpbGVsaXN0LmFwcGVuZChmbikKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKCiAgICAgICAgICAgICAgICBpZiBub3QgZ290X2l0OgogICAgICAgICAgICAgICAgICAgIHNlbGYud2Fybigic3RhbmRhcmQgZmlsZSBub3QgZm91bmQ6IHNob3VsZCBoYXZlIG9uZSBvZiAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJywgJy5qb2luKGFsdHMpKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgaWYgc2VsZi5fY3NfcGF0aF9leGlzdHMoZm4pOgogICAgICAgICAgICAgICAgICAgIHNlbGYuZmlsZWxpc3QuYXBwZW5kKGZuKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBzZWxmLndhcm4oInN0YW5kYXJkIGZpbGUgJyVzJyBub3QgZm91bmQiICUgZm4pCgogICAgZGVmIF9hZGRfZGVmYXVsdHNfb3B0aW9uYWwoc2VsZik6CiAgICAgICAgb3B0aW9uYWwgPSBbJ3Rlc3QvdGVzdCoucHknLCAnc2V0dXAuY2ZnJ10KICAgICAgICBmb3IgcGF0dGVybiBpbiBvcHRpb25hbDoKICAgICAgICAgICAgZmlsZXMgPSBmaWx0ZXIob3MucGF0aC5pc2ZpbGUsIGdsb2IocGF0dGVybikpCiAgICAgICAgICAgIHNlbGYuZmlsZWxpc3QuZXh0ZW5kKGZpbGVzKQoKICAgIGRlZiBfYWRkX2RlZmF1bHRzX3B5dGhvbihzZWxmKToKICAgICAgICAjIGJ1aWxkX3B5IGlzIHVzZWQgdG8gZ2V0OgogICAgICAgICMgIC0gcHl0aG9uIG1vZHVsZXMKICAgICAgICAjICAtIGZpbGVzIGRlZmluZWQgaW4gcGFja2FnZV9kYXRhCiAgICAgICAgYnVpbGRfcHkgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnYnVpbGRfcHknKQoKICAgICAgICAjIGdldHRpbmcgcHl0aG9uIGZpbGVzCiAgICAgICAgaWYgc2VsZi5kaXN0cmlidXRpb24uaGFzX3B1cmVfbW9kdWxlcygpOgogICAgICAgICAgICBzZWxmLmZpbGVsaXN0LmV4dGVuZChidWlsZF9weS5nZXRfc291cmNlX2ZpbGVzKCkpCgogICAgICAgICMgZ2V0dGluZyBwYWNrYWdlX2RhdGEgZmlsZXMKICAgICAgICAjIChjb21wdXRlZCBpbiBidWlsZF9weS5kYXRhX2ZpbGVzIGJ5IGJ1aWxkX3B5LmZpbmFsaXplX29wdGlvbnMpCiAgICAgICAgZm9yIHBrZywgc3JjX2RpciwgYnVpbGRfZGlyLCBmaWxlbmFtZXMgaW4gYnVpbGRfcHkuZGF0YV9maWxlczoKICAgICAgICAgICAgZm9yIGZpbGVuYW1lIGluIGZpbGVuYW1lczoKICAgICAgICAgICAgICAgIHNlbGYuZmlsZWxpc3QuYXBwZW5kKG9zLnBhdGguam9pbihzcmNfZGlyLCBmaWxlbmFtZSkpCgogICAgZGVmIF9hZGRfZGVmYXVsdHNfZGF0YV9maWxlcyhzZWxmKToKICAgICAgICAjIGdldHRpbmcgZGlzdHJpYnV0aW9uLmRhdGFfZmlsZXMKICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi5oYXNfZGF0YV9maWxlcygpOgogICAgICAgICAgICBmb3IgaXRlbSBpbiBzZWxmLmRpc3RyaWJ1dGlvbi5kYXRhX2ZpbGVzOgogICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShpdGVtLCBzdHIpOgogICAgICAgICAgICAgICAgICAgICMgcGxhaW4gZmlsZQogICAgICAgICAgICAgICAgICAgIGl0ZW0gPSBjb252ZXJ0X3BhdGgoaXRlbSkKICAgICAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShpdGVtKToKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maWxlbGlzdC5hcHBlbmQoaXRlbSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgIyBhIChkaXJuYW1lLCBmaWxlbmFtZXMpIHR1cGxlCiAgICAgICAgICAgICAgICAgICAgZGlybmFtZSwgZmlsZW5hbWVzID0gaXRlbQogICAgICAgICAgICAgICAgICAgIGZvciBmIGluIGZpbGVuYW1lczoKICAgICAgICAgICAgICAgICAgICAgICAgZiA9IGNvbnZlcnRfcGF0aChmKQogICAgICAgICAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShmKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlsZWxpc3QuYXBwZW5kKGYpCgogICAgZGVmIF9hZGRfZGVmYXVsdHNfZXh0KHNlbGYpOgogICAgICAgIGlmIHNlbGYuZGlzdHJpYnV0aW9uLmhhc19leHRfbW9kdWxlcygpOgogICAgICAgICAgICBidWlsZF9leHQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnYnVpbGRfZXh0JykKICAgICAgICAgICAgc2VsZi5maWxlbGlzdC5leHRlbmQoYnVpbGRfZXh0LmdldF9zb3VyY2VfZmlsZXMoKSkKCiAgICBkZWYgX2FkZF9kZWZhdWx0c19jX2xpYnMoc2VsZik6CiAgICAgICAgaWYgc2VsZi5kaXN0cmlidXRpb24uaGFzX2NfbGlicmFyaWVzKCk6CiAgICAgICAgICAgIGJ1aWxkX2NsaWIgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnYnVpbGRfY2xpYicpCiAgICAgICAgICAgIHNlbGYuZmlsZWxpc3QuZXh0ZW5kKGJ1aWxkX2NsaWIuZ2V0X3NvdXJjZV9maWxlcygpKQoKICAgIGRlZiBfYWRkX2RlZmF1bHRzX3NjcmlwdHMoc2VsZik6CiAgICAgICAgaWYgc2VsZi5kaXN0cmlidXRpb24uaGFzX3NjcmlwdHMoKToKICAgICAgICAgICAgYnVpbGRfc2NyaXB0cyA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdidWlsZF9zY3JpcHRzJykKICAgICAgICAgICAgc2VsZi5maWxlbGlzdC5leHRlbmQoYnVpbGRfc2NyaXB0cy5nZXRfc291cmNlX2ZpbGVzKCkpCgoKaWYgaGFzYXR0cihzZGlzdC5zZGlzdCwgJ19hZGRfZGVmYXVsdHNfc3RhbmRhcmRzJyk6CiAgICAjIGRpc2FibGUgdGhlIGZ1bmN0aW9uYWxpdHkgYWxyZWFkeSBhdmFpbGFibGUgdXBzdHJlYW0KICAgIGNsYXNzIHNkaXN0X2FkZF9kZWZhdWx0czoKICAgICAgICBwYXNzClBLAwQUAAAAAAAAACEAdtLqtdQBAADUAQAAQwAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2NvbW1hbmQvcmVnaXN0ZXIucHlmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCmltcG9ydCBkaXN0dXRpbHMuY29tbWFuZC5yZWdpc3RlciBhcyBvcmlnCgpmcm9tIHNldHVwdG9vbHMuZXJyb3JzIGltcG9ydCBSZW1vdmVkQ29tbWFuZEVycm9yCgoKY2xhc3MgcmVnaXN0ZXIob3JpZy5yZWdpc3Rlcik6CiAgICAiIiJGb3JtZXJseSB1c2VkIHRvIHJlZ2lzdGVyIHBhY2thZ2VzIG9uIFB5UEkuIiIiCgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICBtc2cgPSAoCiAgICAgICAgICAgICJUaGUgcmVnaXN0ZXIgY29tbWFuZCBoYXMgYmVlbiByZW1vdmVkLCB1c2UgdHdpbmUgdG8gdXBsb2FkICIKICAgICAgICAgICAgKyAiaW5zdGVhZCAoaHR0cHM6Ly9weXBpLm9yZy9wL3R3aW5lKSIKICAgICAgICApCgogICAgICAgIHNlbGYuYW5ub3VuY2UoIkVSUk9SOiAiICsgbXNnLCBsb2cuRVJST1IpCgogICAgICAgIHJhaXNlIFJlbW92ZWRDb21tYW5kRXJyb3IobXNnKQpQSwMEFAAAAAAAAAAhABnK1KR0CAAAdAgAAEEAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9jb21tYW5kL3JvdGF0ZS5weWZyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGNvbnZlcnRfcGF0aApmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCmZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzT3B0aW9uRXJyb3IKaW1wb3J0IG9zCmltcG9ydCBzaHV0aWwKCmZyb20gc2V0dXB0b29scy5leHRlcm4gaW1wb3J0IHNpeAoKZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBDb21tYW5kCgoKY2xhc3Mgcm90YXRlKENvbW1hbmQpOgogICAgIiIiRGVsZXRlIG9sZGVyIGRpc3RyaWJ1dGlvbnMiIiIKCiAgICBkZXNjcmlwdGlvbiA9ICJkZWxldGUgb2xkZXIgZGlzdHJpYnV0aW9ucywga2VlcGluZyBOIG5ld2VzdCBmaWxlcyIKICAgIHVzZXJfb3B0aW9ucyA9IFsKICAgICAgICAoJ21hdGNoPScsICdtJywgInBhdHRlcm5zIHRvIG1hdGNoIChyZXF1aXJlZCkiKSwKICAgICAgICAoJ2Rpc3QtZGlyPScsICdkJywgImRpcmVjdG9yeSB3aGVyZSB0aGUgZGlzdHJpYnV0aW9ucyBhcmUiKSwKICAgICAgICAoJ2tlZXA9JywgJ2snLCAibnVtYmVyIG9mIG1hdGNoaW5nIGRpc3RyaWJ1dGlvbnMgdG8ga2VlcCIpLAogICAgXQoKICAgIGJvb2xlYW5fb3B0aW9ucyA9IFtdCgogICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBzZWxmLm1hdGNoID0gTm9uZQogICAgICAgIHNlbGYuZGlzdF9kaXIgPSBOb25lCiAgICAgICAgc2VsZi5rZWVwID0gTm9uZQoKICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIGlmIHNlbGYubWF0Y2ggaXMgTm9uZToKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAiTXVzdCBzcGVjaWZ5IG9uZSBvciBtb3JlIChjb21tYS1zZXBhcmF0ZWQpIG1hdGNoIHBhdHRlcm5zICIKICAgICAgICAgICAgICAgICIoZS5nLiAnLnppcCcgb3IgJy5lZ2cnKSIKICAgICAgICAgICAgKQogICAgICAgIGlmIHNlbGYua2VlcCBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcigiTXVzdCBzcGVjaWZ5IG51bWJlciBvZiBmaWxlcyB0byBrZWVwIikKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYua2VlcCA9IGludChzZWxmLmtlZXApCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKCItLWtlZXAgbXVzdCBiZSBhbiBpbnRlZ2VyIikKICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYubWF0Y2gsIHNpeC5zdHJpbmdfdHlwZXMpOgogICAgICAgICAgICBzZWxmLm1hdGNoID0gWwogICAgICAgICAgICAgICAgY29udmVydF9wYXRoKHAuc3RyaXAoKSkgZm9yIHAgaW4gc2VsZi5tYXRjaC5zcGxpdCgnLCcpCiAgICAgICAgICAgIF0KICAgICAgICBzZWxmLnNldF91bmRlZmluZWRfb3B0aW9ucygnYmRpc3QnLCAoJ2Rpc3RfZGlyJywgJ2Rpc3RfZGlyJykpCgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCJlZ2dfaW5mbyIpCiAgICAgICAgZnJvbSBnbG9iIGltcG9ydCBnbG9iCgogICAgICAgIGZvciBwYXR0ZXJuIGluIHNlbGYubWF0Y2g6CiAgICAgICAgICAgIHBhdHRlcm4gPSBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfbmFtZSgpICsgJyonICsgcGF0dGVybgogICAgICAgICAgICBmaWxlcyA9IGdsb2Iob3MucGF0aC5qb2luKHNlbGYuZGlzdF9kaXIsIHBhdHRlcm4pKQogICAgICAgICAgICBmaWxlcyA9IFsob3MucGF0aC5nZXRtdGltZShmKSwgZikgZm9yIGYgaW4gZmlsZXNdCiAgICAgICAgICAgIGZpbGVzLnNvcnQoKQogICAgICAgICAgICBmaWxlcy5yZXZlcnNlKCkKCiAgICAgICAgICAgIGxvZy5pbmZvKCIlZCBmaWxlKHMpIG1hdGNoaW5nICVzIiwgbGVuKGZpbGVzKSwgcGF0dGVybikKICAgICAgICAgICAgZmlsZXMgPSBmaWxlc1tzZWxmLmtlZXA6XQogICAgICAgICAgICBmb3IgKHQsIGYpIGluIGZpbGVzOgogICAgICAgICAgICAgICAgbG9nLmluZm8oIkRlbGV0aW5nICVzIiwgZikKICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2RpcihmKToKICAgICAgICAgICAgICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShmKQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIG9zLnVubGluayhmKQpQSwMEFAAAAAAAAAAhAASB1jSSAgAAkgIAAEMAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9jb21tYW5kL3NhdmVvcHRzLnB5ZnJvbSBzZXR1cHRvb2xzLmNvbW1hbmQuc2V0b3B0IGltcG9ydCBlZGl0X2NvbmZpZywgb3B0aW9uX2Jhc2UKCgpjbGFzcyBzYXZlb3B0cyhvcHRpb25fYmFzZSk6CiAgICAiIiJTYXZlIGNvbW1hbmQtbGluZSBvcHRpb25zIHRvIGEgZmlsZSIiIgoKICAgIGRlc2NyaXB0aW9uID0gInNhdmUgc3VwcGxpZWQgb3B0aW9ucyB0byBzZXR1cC5jZmcgb3Igb3RoZXIgY29uZmlnIGZpbGUiCgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICBkaXN0ID0gc2VsZi5kaXN0cmlidXRpb24KICAgICAgICBzZXR0aW5ncyA9IHt9CgogICAgICAgIGZvciBjbWQgaW4gZGlzdC5jb21tYW5kX29wdGlvbnM6CgogICAgICAgICAgICBpZiBjbWQgPT0gJ3NhdmVvcHRzJzoKICAgICAgICAgICAgICAgIGNvbnRpbnVlICAjIGRvbid0IHNhdmUgb3VyIG93biBvcHRpb25zIQoKICAgICAgICAgICAgZm9yIG9wdCwgKHNyYywgdmFsKSBpbiBkaXN0LmdldF9vcHRpb25fZGljdChjbWQpLml0ZW1zKCk6CiAgICAgICAgICAgICAgICBpZiBzcmMgPT0gImNvbW1hbmQgbGluZSI6CiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3Muc2V0ZGVmYXVsdChjbWQsIHt9KVtvcHRdID0gdmFsCgogICAgICAgIGVkaXRfY29uZmlnKHNlbGYuZmlsZW5hbWUsIHNldHRpbmdzLCBzZWxmLmRyeV9ydW4pClBLAwQUAAAAAAAAACEAcIo2B5gfAACYHwAAQAAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2NvbW1hbmQvc2Rpc3QucHlmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCmltcG9ydCBkaXN0dXRpbHMuY29tbWFuZC5zZGlzdCBhcyBvcmlnCmltcG9ydCBvcwppbXBvcnQgc3lzCmltcG9ydCBpbwppbXBvcnQgY29udGV4dGxpYgoKZnJvbSBzZXR1cHRvb2xzLmV4dGVybiBpbXBvcnQgc2l4LCBvcmRlcmVkX3NldAoKZnJvbSAucHkzNmNvbXBhdCBpbXBvcnQgc2Rpc3RfYWRkX2RlZmF1bHRzCgppbXBvcnQgcGtnX3Jlc291cmNlcwoKX2RlZmF1bHRfcmV2Y3RybCA9IGxpc3QKCgpkZWYgd2Fsa19yZXZjdHJsKGRpcm5hbWU9JycpOgogICAgIiIiRmluZCBhbGwgZmlsZXMgdW5kZXIgcmV2aXNpb24gY29udHJvbCIiIgogICAgZm9yIGVwIGluIHBrZ19yZXNvdXJjZXMuaXRlcl9lbnRyeV9wb2ludHMoJ3NldHVwdG9vbHMuZmlsZV9maW5kZXJzJyk6CiAgICAgICAgZm9yIGl0ZW0gaW4gZXAubG9hZCgpKGRpcm5hbWUpOgogICAgICAgICAgICB5aWVsZCBpdGVtCgoKY2xhc3Mgc2Rpc3Qoc2Rpc3RfYWRkX2RlZmF1bHRzLCBvcmlnLnNkaXN0KToKICAgICIiIlNtYXJ0IHNkaXN0IHRoYXQgZmluZHMgYW55dGhpbmcgc3VwcG9ydGVkIGJ5IHJldmlzaW9uIGNvbnRyb2wiIiIKCiAgICB1c2VyX29wdGlvbnMgPSBbCiAgICAgICAgKCdmb3JtYXRzPScsIE5vbmUsCiAgICAgICAgICJmb3JtYXRzIGZvciBzb3VyY2UgZGlzdHJpYnV0aW9uIChjb21tYS1zZXBhcmF0ZWQgbGlzdCkiKSwKICAgICAgICAoJ2tlZXAtdGVtcCcsICdrJywKICAgICAgICAgImtlZXAgdGhlIGRpc3RyaWJ1dGlvbiB0cmVlIGFyb3VuZCBhZnRlciBjcmVhdGluZyAiICsKICAgICAgICAgImFyY2hpdmUgZmlsZShzKSIpLAogICAgICAgICgnZGlzdC1kaXI9JywgJ2QnLAogICAgICAgICAiZGlyZWN0b3J5IHRvIHB1dCB0aGUgc291cmNlIGRpc3RyaWJ1dGlvbiBhcmNoaXZlKHMpIGluICIKICAgICAgICAgIltkZWZhdWx0OiBkaXN0XSIpLAogICAgXQoKICAgIG5lZ2F0aXZlX29wdCA9IHt9CgogICAgUkVBRE1FX0VYVEVOU0lPTlMgPSBbJycsICcucnN0JywgJy50eHQnLCAnLm1kJ10KICAgIFJFQURNRVMgPSB0dXBsZSgnUkVBRE1FezB9Jy5mb3JtYXQoZXh0KSBmb3IgZXh0IGluIFJFQURNRV9FWFRFTlNJT05TKQoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgnZWdnX2luZm8nKQogICAgICAgIGVpX2NtZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdlZ2dfaW5mbycpCiAgICAgICAgc2VsZi5maWxlbGlzdCA9IGVpX2NtZC5maWxlbGlzdAogICAgICAgIHNlbGYuZmlsZWxpc3QuYXBwZW5kKG9zLnBhdGguam9pbihlaV9jbWQuZWdnX2luZm8sICdTT1VSQ0VTLnR4dCcpKQogICAgICAgIHNlbGYuY2hlY2tfcmVhZG1lKCkKCiAgICAgICAgIyBSdW4gc3ViIGNvbW1hbmRzCiAgICAgICAgZm9yIGNtZF9uYW1lIGluIHNlbGYuZ2V0X3N1Yl9jb21tYW5kcygpOgogICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKGNtZF9uYW1lKQoKICAgICAgICBzZWxmLm1ha2VfZGlzdHJpYnV0aW9uKCkKCiAgICAgICAgZGlzdF9maWxlcyA9IGdldGF0dHIoc2VsZi5kaXN0cmlidXRpb24sICdkaXN0X2ZpbGVzJywgW10pCiAgICAgICAgZm9yIGZpbGUgaW4gc2VsZi5hcmNoaXZlX2ZpbGVzOgogICAgICAgICAgICBkYXRhID0gKCdzZGlzdCcsICcnLCBmaWxlKQogICAgICAgICAgICBpZiBkYXRhIG5vdCBpbiBkaXN0X2ZpbGVzOgogICAgICAgICAgICAgICAgZGlzdF9maWxlcy5hcHBlbmQoZGF0YSkKCiAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIG9yaWcuc2Rpc3QuaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpCgogICAgICAgIHNlbGYuX2RlZmF1bHRfdG9fZ3p0YXIoKQoKICAgIGRlZiBfZGVmYXVsdF90b19nenRhcihzZWxmKToKICAgICAgICAjIG9ubHkgbmVlZGVkIG9uIFB5dGhvbiBwcmlvciB0byAzLjYuCiAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mbyA+PSAoMywgNiwgMCwgJ2JldGEnLCAxKToKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgc2VsZi5mb3JtYXRzID0gWydnenRhciddCgogICAgZGVmIG1ha2VfZGlzdHJpYnV0aW9uKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFdvcmthcm91bmQgZm9yICM1MTYKICAgICAgICAiIiIKICAgICAgICB3aXRoIHNlbGYuX3JlbW92ZV9vc19saW5rKCk6CiAgICAgICAgICAgIG9yaWcuc2Rpc3QubWFrZV9kaXN0cmlidXRpb24oc2VsZikKCiAgICBAc3RhdGljbWV0aG9kCiAgICBAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgogICAgZGVmIF9yZW1vdmVfb3NfbGluaygpOgogICAgICAgICIiIgogICAgICAgIEluIGEgY29udGV4dCwgcmVtb3ZlIGFuZCByZXN0b3JlIG9zLmxpbmsgaWYgaXQgZXhpc3RzCiAgICAgICAgIiIiCgogICAgICAgIGNsYXNzIE5vVmFsdWU6CiAgICAgICAgICAgIHBhc3MKCiAgICAgICAgb3JpZ192YWwgPSBnZXRhdHRyKG9zLCAnbGluaycsIE5vVmFsdWUpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBkZWwgb3MubGluawogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIHBhc3MKICAgICAgICB0cnk6CiAgICAgICAgICAgIHlpZWxkCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgaWYgb3JpZ192YWwgaXMgbm90IE5vVmFsdWU6CiAgICAgICAgICAgICAgICBzZXRhdHRyKG9zLCAnbGluaycsIG9yaWdfdmFsKQoKICAgIGRlZiBfX3JlYWRfdGVtcGxhdGVfaGFjayhzZWxmKToKICAgICAgICAjIFRoaXMgZ3JvZHkgaGFjayBjbG9zZXMgdGhlIHRlbXBsYXRlIGZpbGUgKE1BTklGRVNULmluKSBpZiBhbgogICAgICAgICMgIGV4Y2VwdGlvbiBvY2N1cnMgZHVyaW5nIHJlYWRfdGVtcGxhdGUuCiAgICAgICAgIyBEb2luZyBzbyBwcmV2ZW50cyBhbiBlcnJvciB3aGVuIGVhc3lfaW5zdGFsbCBhdHRlbXB0cyB0byBkZWxldGUgdGhlCiAgICAgICAgIyAgZmlsZS4KICAgICAgICB0cnk6CiAgICAgICAgICAgIG9yaWcuc2Rpc3QucmVhZF90ZW1wbGF0ZShzZWxmKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIF8sIF8sIHRiID0gc3lzLmV4Y19pbmZvKCkKICAgICAgICAgICAgdGIudGJfbmV4dC50Yl9mcmFtZS5mX2xvY2Fsc1sndGVtcGxhdGUnXS5jbG9zZSgpCiAgICAgICAgICAgIHJhaXNlCgogICAgIyBCZWdpbm5pbmcgd2l0aCBQeXRob24gMi43LjIsIDMuMS40LCBhbmQgMy4yLjEsIHRoaXMgbGVha3kgZmlsZSBoYW5kbGUKICAgICMgIGhhcyBiZWVuIGZpeGVkLCBzbyBvbmx5IG92ZXJyaWRlIHRoZSBtZXRob2QgaWYgd2UncmUgdXNpbmcgYW4gZWFybGllcgogICAgIyAgUHl0aG9uLgogICAgaGFzX2xlYWt5X2hhbmRsZSA9ICgKICAgICAgICBzeXMudmVyc2lvbl9pbmZvIDwgKDIsIDcsIDIpCiAgICAgICAgb3IgKDMsIDApIDw9IHN5cy52ZXJzaW9uX2luZm8gPCAoMywgMSwgNCkKICAgICAgICBvciAoMywgMikgPD0gc3lzLnZlcnNpb25faW5mbyA8ICgzLCAyLCAxKQogICAgKQogICAgaWYgaGFzX2xlYWt5X2hhbmRsZToKICAgICAgICByZWFkX3RlbXBsYXRlID0gX19yZWFkX3RlbXBsYXRlX2hhY2sKCiAgICBkZWYgX2FkZF9kZWZhdWx0c19vcHRpb25hbChzZWxmKToKICAgICAgICBpZiBzaXguUFkyOgogICAgICAgICAgICBzZGlzdF9hZGRfZGVmYXVsdHMuX2FkZF9kZWZhdWx0c19vcHRpb25hbChzZWxmKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHN1cGVyKCkuX2FkZF9kZWZhdWx0c19vcHRpb25hbCgpCiAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoJ3B5cHJvamVjdC50b21sJyk6CiAgICAgICAgICAgIHNlbGYuZmlsZWxpc3QuYXBwZW5kKCdweXByb2plY3QudG9tbCcpCgogICAgZGVmIF9hZGRfZGVmYXVsdHNfcHl0aG9uKHNlbGYpOgogICAgICAgICIiImdldHRpbmcgcHl0aG9uIGZpbGVzIiIiCiAgICAgICAgaWYgc2VsZi5kaXN0cmlidXRpb24uaGFzX3B1cmVfbW9kdWxlcygpOgogICAgICAgICAgICBidWlsZF9weSA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdidWlsZF9weScpCiAgICAgICAgICAgIHNlbGYuZmlsZWxpc3QuZXh0ZW5kKGJ1aWxkX3B5LmdldF9zb3VyY2VfZmlsZXMoKSkKICAgICAgICAgICAgc2VsZi5fYWRkX2RhdGFfZmlsZXMoc2VsZi5fc2FmZV9kYXRhX2ZpbGVzKGJ1aWxkX3B5KSkKCiAgICBkZWYgX3NhZmVfZGF0YV9maWxlcyhzZWxmLCBidWlsZF9weSk6CiAgICAgICAgIiIiCiAgICAgICAgRXh0cmFjdGluZyBkYXRhX2ZpbGVzIGZyb20gYnVpbGRfcHkgaXMga25vd24gdG8gY2F1c2UKICAgICAgICBpbmZpbml0ZSByZWN1cnNpb24gZXJyb3JzIHdoZW4gYGluY2x1ZGVfcGFja2FnZV9kYXRhYAogICAgICAgIGlzIGVuYWJsZWQsIHNvIHN1cHByZXNzIGl0IGluIHRoYXQgY2FzZS4KICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi5pbmNsdWRlX3BhY2thZ2VfZGF0YToKICAgICAgICAgICAgcmV0dXJuICgpCiAgICAgICAgcmV0dXJuIGJ1aWxkX3B5LmRhdGFfZmlsZXMKCiAgICBkZWYgX2FkZF9kYXRhX2ZpbGVzKHNlbGYsIGRhdGFfZmlsZXMpOgogICAgICAgICIiIgogICAgICAgIEFkZCBkYXRhIGZpbGVzIGFzIGZvdW5kIGluIGJ1aWxkX3B5LmRhdGFfZmlsZXMuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5maWxlbGlzdC5leHRlbmQoCiAgICAgICAgICAgIG9zLnBhdGguam9pbihzcmNfZGlyLCBuYW1lKQogICAgICAgICAgICBmb3IgXywgc3JjX2RpciwgXywgZmlsZW5hbWVzIGluIGRhdGFfZmlsZXMKICAgICAgICAgICAgZm9yIG5hbWUgaW4gZmlsZW5hbWVzCiAgICAgICAgKQoKICAgIGRlZiBfYWRkX2RlZmF1bHRzX2RhdGFfZmlsZXMoc2VsZik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBpZiBzaXguUFkyOgogICAgICAgICAgICAgICAgc2Rpc3RfYWRkX2RlZmF1bHRzLl9hZGRfZGVmYXVsdHNfZGF0YV9maWxlcyhzZWxmKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc3VwZXIoKS5fYWRkX2RlZmF1bHRzX2RhdGFfZmlsZXMoKQogICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CiAgICAgICAgICAgIGxvZy53YXJuKCJkYXRhX2ZpbGVzIGNvbnRhaW5zIHVuZXhwZWN0ZWQgb2JqZWN0cyIpCgogICAgZGVmIGNoZWNrX3JlYWRtZShzZWxmKToKICAgICAgICBmb3IgZiBpbiBzZWxmLlJFQURNRVM6CiAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGYpOgogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi53YXJuKAogICAgICAgICAgICAgICAgInN0YW5kYXJkIGZpbGUgbm90IGZvdW5kOiBzaG91bGQgaGF2ZSBvbmUgb2YgIiArCiAgICAgICAgICAgICAgICAnLCAnLmpvaW4oc2VsZi5SRUFETUVTKQogICAgICAgICAgICApCgogICAgZGVmIG1ha2VfcmVsZWFzZV90cmVlKHNlbGYsIGJhc2VfZGlyLCBmaWxlcyk6CiAgICAgICAgb3JpZy5zZGlzdC5tYWtlX3JlbGVhc2VfdHJlZShzZWxmLCBiYXNlX2RpciwgZmlsZXMpCgogICAgICAgICMgU2F2ZSBhbnkgZWdnX2luZm8gY29tbWFuZCBsaW5lIG9wdGlvbnMgdXNlZCB0byBjcmVhdGUgdGhpcyBzZGlzdAogICAgICAgIGRlc3QgPSBvcy5wYXRoLmpvaW4oYmFzZV9kaXIsICdzZXR1cC5jZmcnKQogICAgICAgIGlmIGhhc2F0dHIob3MsICdsaW5rJykgYW5kIG9zLnBhdGguZXhpc3RzKGRlc3QpOgogICAgICAgICAgICAjIHVubGluayBhbmQgcmUtY29weSwgc2luY2UgaXQgbWlnaHQgYmUgaGFyZC1saW5rZWQsIGFuZAogICAgICAgICAgICAjIHdlIGRvbid0IHdhbnQgdG8gY2hhbmdlIHRoZSBzb3VyY2UgdmVyc2lvbgogICAgICAgICAgICBvcy51bmxpbmsoZGVzdCkKICAgICAgICAgICAgc2VsZi5jb3B5X2ZpbGUoJ3NldHVwLmNmZycsIGRlc3QpCgogICAgICAgIHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdlZ2dfaW5mbycpLnNhdmVfdmVyc2lvbl9pbmZvKGRlc3QpCgogICAgZGVmIF9tYW5pZmVzdF9pc19ub3RfZ2VuZXJhdGVkKHNlbGYpOgogICAgICAgICMgY2hlY2sgZm9yIHNwZWNpYWwgY29tbWVudCB1c2VkIGluIDIuNy4xIGFuZCBoaWdoZXIKICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2ZpbGUoc2VsZi5tYW5pZmVzdCk6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICB3aXRoIGlvLm9wZW4oc2VsZi5tYW5pZmVzdCwgJ3JiJykgYXMgZnA6CiAgICAgICAgICAgIGZpcnN0X2xpbmUgPSBmcC5yZWFkbGluZSgpCiAgICAgICAgcmV0dXJuIChmaXJzdF9saW5lICE9CiAgICAgICAgICAgICAgICAnIyBmaWxlIEdFTkVSQVRFRCBieSBkaXN0dXRpbHMsIGRvIE5PVCBlZGl0XG4nLmVuY29kZSgpKQoKICAgIGRlZiByZWFkX21hbmlmZXN0KHNlbGYpOgogICAgICAgICIiIlJlYWQgdGhlIG1hbmlmZXN0IGZpbGUgKG5hbWVkIGJ5ICdzZWxmLm1hbmlmZXN0JykgYW5kIHVzZSBpdCB0bwogICAgICAgIGZpbGwgaW4gJ3NlbGYuZmlsZWxpc3QnLCB0aGUgbGlzdCBvZiBmaWxlcyB0byBpbmNsdWRlIGluIHRoZSBzb3VyY2UKICAgICAgICBkaXN0cmlidXRpb24uCiAgICAgICAgIiIiCiAgICAgICAgbG9nLmluZm8oInJlYWRpbmcgbWFuaWZlc3QgZmlsZSAnJXMnIiwgc2VsZi5tYW5pZmVzdCkKICAgICAgICBtYW5pZmVzdCA9IG9wZW4oc2VsZi5tYW5pZmVzdCwgJ3JiJykKICAgICAgICBmb3IgbGluZSBpbiBtYW5pZmVzdDoKICAgICAgICAgICAgIyBUaGUgbWFuaWZlc3QgbXVzdCBjb250YWluIFVURi04LiBTZWUgIzMwMy4KICAgICAgICAgICAgaWYgc2l4LlBZMzoKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZS5kZWNvZGUoJ1VURi04JykKICAgICAgICAgICAgICAgIGV4Y2VwdCBVbmljb2RlRGVjb2RlRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oIiVyIG5vdCBVVEYtOCBkZWNvZGFibGUgLS0gc2tpcHBpbmciICUgbGluZSkKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAjIGlnbm9yZSBjb21tZW50cyBhbmQgYmxhbmsgbGluZXMKICAgICAgICAgICAgbGluZSA9IGxpbmUuc3RyaXAoKQogICAgICAgICAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoJyMnKSBvciBub3QgbGluZToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIHNlbGYuZmlsZWxpc3QuYXBwZW5kKGxpbmUpCiAgICAgICAgbWFuaWZlc3QuY2xvc2UoKQoKICAgIGRlZiBjaGVja19saWNlbnNlKHNlbGYpOgogICAgICAgICIiIkNoZWNrcyBpZiBsaWNlbnNlX2ZpbGUnIG9yICdsaWNlbnNlX2ZpbGVzJyBpcyBjb25maWd1cmVkIGFuZCBhZGRzIGFueQogICAgICAgIHZhbGlkIHBhdGhzIHRvICdzZWxmLmZpbGVsaXN0Jy4KICAgICAgICAiIiIKCiAgICAgICAgZmlsZXMgPSBvcmRlcmVkX3NldC5PcmRlcmVkU2V0KCkKCiAgICAgICAgb3B0cyA9IHNlbGYuZGlzdHJpYnV0aW9uLmdldF9vcHRpb25fZGljdCgnbWV0YWRhdGEnKQoKICAgICAgICAjIGlnbm9yZSB0aGUgc291cmNlIG9mIHRoZSB2YWx1ZQogICAgICAgIF8sIGxpY2Vuc2VfZmlsZSA9IG9wdHMuZ2V0KCdsaWNlbnNlX2ZpbGUnLCAoTm9uZSwgTm9uZSkpCgogICAgICAgIGlmIGxpY2Vuc2VfZmlsZSBpcyBOb25lOgogICAgICAgICAgICBsb2cuZGVidWcoIidsaWNlbnNlX2ZpbGUnIG9wdGlvbiB3YXMgbm90IHNwZWNpZmllZCIpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZmlsZXMuYWRkKGxpY2Vuc2VfZmlsZSkKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBmaWxlcy51cGRhdGUoc2VsZi5kaXN0cmlidXRpb24ubWV0YWRhdGEubGljZW5zZV9maWxlcykKICAgICAgICBleGNlcHQgVHlwZUVycm9yOgogICAgICAgICAgICBsb2cud2Fybigid2FybmluZzogJ2xpY2Vuc2VfZmlsZXMnIG9wdGlvbiBpcyBtYWxmb3JtZWQiKQoKICAgICAgICBmb3IgZiBpbiBmaWxlczoKICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGYpOgogICAgICAgICAgICAgICAgbG9nLndhcm4oCiAgICAgICAgICAgICAgICAgICAgIndhcm5pbmc6IEZhaWxlZCB0byBmaW5kIHRoZSBjb25maWd1cmVkIGxpY2Vuc2UgZmlsZSAnJXMnIiwKICAgICAgICAgICAgICAgICAgICBmKQogICAgICAgICAgICAgICAgZmlsZXMucmVtb3ZlKGYpCgogICAgICAgIHNlbGYuZmlsZWxpc3QuZXh0ZW5kKGZpbGVzKQpQSwMEFAAAAAAAAAAhAJtwy8fdEwAA3RMAAEEAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9jb21tYW5kL3NldG9wdC5weWZyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGNvbnZlcnRfcGF0aApmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCmZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzT3B0aW9uRXJyb3IKaW1wb3J0IGRpc3R1dGlscwppbXBvcnQgb3MKCmZyb20gc2V0dXB0b29scy5leHRlcm4uc2l4Lm1vdmVzIGltcG9ydCBjb25maWdwYXJzZXIKCmZyb20gc2V0dXB0b29scyBpbXBvcnQgQ29tbWFuZAoKX19hbGxfXyA9IFsnY29uZmlnX2ZpbGUnLCAnZWRpdF9jb25maWcnLCAnb3B0aW9uX2Jhc2UnLCAnc2V0b3B0J10KCgpkZWYgY29uZmlnX2ZpbGUoa2luZD0ibG9jYWwiKToKICAgICIiIkdldCB0aGUgZmlsZW5hbWUgb2YgdGhlIGRpc3R1dGlscywgbG9jYWwsIGdsb2JhbCwgb3IgcGVyLXVzZXIgY29uZmlnCgogICAgYGtpbmRgIG11c3QgYmUgb25lIG9mICJsb2NhbCIsICJnbG9iYWwiLCBvciAidXNlciIKICAgICIiIgogICAgaWYga2luZCA9PSAnbG9jYWwnOgogICAgICAgIHJldHVybiAnc2V0dXAuY2ZnJwogICAgaWYga2luZCA9PSAnZ2xvYmFsJzoKICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKAogICAgICAgICAgICBvcy5wYXRoLmRpcm5hbWUoZGlzdHV0aWxzLl9fZmlsZV9fKSwgJ2Rpc3R1dGlscy5jZmcnCiAgICAgICAgKQogICAgaWYga2luZCA9PSAndXNlcic6CiAgICAgICAgZG90ID0gb3MubmFtZSA9PSAncG9zaXgnIGFuZCAnLicgb3IgJycKICAgICAgICByZXR1cm4gb3MucGF0aC5leHBhbmR1c2VyKGNvbnZlcnRfcGF0aCgifi8lc3B5ZGlzdHV0aWxzLmNmZyIgJSBkb3QpKQogICAgcmFpc2UgVmFsdWVFcnJvcigKICAgICAgICAiY29uZmlnX2ZpbGUoKSB0eXBlIG11c3QgYmUgJ2xvY2FsJywgJ2dsb2JhbCcsIG9yICd1c2VyJyIsIGtpbmQKICAgICkKCgpkZWYgZWRpdF9jb25maWcoZmlsZW5hbWUsIHNldHRpbmdzLCBkcnlfcnVuPUZhbHNlKToKICAgICIiIkVkaXQgYSBjb25maWd1cmF0aW9uIGZpbGUgdG8gaW5jbHVkZSBgc2V0dGluZ3NgCgogICAgYHNldHRpbmdzYCBpcyBhIGRpY3Rpb25hcnkgb2YgZGljdGlvbmFyaWVzIG9yIGBgTm9uZWBgIHZhbHVlcywga2V5ZWQgYnkKICAgIGNvbW1hbmQvc2VjdGlvbiBuYW1lLiAgQSBgYE5vbmVgYCB2YWx1ZSBtZWFucyB0byBkZWxldGUgdGhlIGVudGlyZSBzZWN0aW9uLAogICAgd2hpbGUgYSBkaWN0aW9uYXJ5IGxpc3RzIHNldHRpbmdzIHRvIGJlIGNoYW5nZWQgb3IgZGVsZXRlZCBpbiB0aGF0IHNlY3Rpb24uCiAgICBBIHNldHRpbmcgb2YgYGBOb25lYGAgbWVhbnMgdG8gZGVsZXRlIHRoYXQgc2V0dGluZy4KICAgICIiIgogICAgbG9nLmRlYnVnKCJSZWFkaW5nIGNvbmZpZ3VyYXRpb24gZnJvbSAlcyIsIGZpbGVuYW1lKQogICAgb3B0cyA9IGNvbmZpZ3BhcnNlci5SYXdDb25maWdQYXJzZXIoKQogICAgb3B0cy5yZWFkKFtmaWxlbmFtZV0pCiAgICBmb3Igc2VjdGlvbiwgb3B0aW9ucyBpbiBzZXR0aW5ncy5pdGVtcygpOgogICAgICAgIGlmIG9wdGlvbnMgaXMgTm9uZToKICAgICAgICAgICAgbG9nLmluZm8oIkRlbGV0aW5nIHNlY3Rpb24gWyVzXSBmcm9tICVzIiwgc2VjdGlvbiwgZmlsZW5hbWUpCiAgICAgICAgICAgIG9wdHMucmVtb3ZlX3NlY3Rpb24oc2VjdGlvbikKICAgICAgICBlbHNlOgogICAgICAgICAgICBpZiBub3Qgb3B0cy5oYXNfc2VjdGlvbihzZWN0aW9uKToKICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQWRkaW5nIG5ldyBzZWN0aW9uIFslc10gdG8gJXMiLCBzZWN0aW9uLCBmaWxlbmFtZSkKICAgICAgICAgICAgICAgIG9wdHMuYWRkX3NlY3Rpb24oc2VjdGlvbikKICAgICAgICAgICAgZm9yIG9wdGlvbiwgdmFsdWUgaW4gb3B0aW9ucy5pdGVtcygpOgogICAgICAgICAgICAgICAgaWYgdmFsdWUgaXMgTm9uZToKICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoCiAgICAgICAgICAgICAgICAgICAgICAgICJEZWxldGluZyAlcy4lcyBmcm9tICVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbiwgb3B0aW9uLCBmaWxlbmFtZQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICBvcHRzLnJlbW92ZV9vcHRpb24oc2VjdGlvbiwgb3B0aW9uKQogICAgICAgICAgICAgICAgICAgIGlmIG5vdCBvcHRzLm9wdGlvbnMoc2VjdGlvbik6CiAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJEZWxldGluZyBlbXB0eSBbJXNdIHNlY3Rpb24gZnJvbSAlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb24sIGZpbGVuYW1lKQogICAgICAgICAgICAgICAgICAgICAgICBvcHRzLnJlbW92ZV9zZWN0aW9uKHNlY3Rpb24pCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygKICAgICAgICAgICAgICAgICAgICAgICAgIlNldHRpbmcgJXMuJXMgdG8gJXIgaW4gJXMiLAogICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uLCBvcHRpb24sIHZhbHVlLCBmaWxlbmFtZQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICBvcHRzLnNldChzZWN0aW9uLCBvcHRpb24sIHZhbHVlKQoKICAgIGxvZy5pbmZvKCJXcml0aW5nICVzIiwgZmlsZW5hbWUpCiAgICBpZiBub3QgZHJ5X3J1bjoKICAgICAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICd3JykgYXMgZjoKICAgICAgICAgICAgb3B0cy53cml0ZShmKQoKCmNsYXNzIG9wdGlvbl9iYXNlKENvbW1hbmQpOgogICAgIiIiQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgY29tbWFuZHMgdGhhdCBtZXNzIHdpdGggY29uZmlnIGZpbGVzIiIiCgogICAgdXNlcl9vcHRpb25zID0gWwogICAgICAgICgnZ2xvYmFsLWNvbmZpZycsICdnJywKICAgICAgICAgInNhdmUgb3B0aW9ucyB0byB0aGUgc2l0ZS13aWRlIGRpc3R1dGlscy5jZmcgZmlsZSIpLAogICAgICAgICgndXNlci1jb25maWcnLCAndScsCiAgICAgICAgICJzYXZlIG9wdGlvbnMgdG8gdGhlIGN1cnJlbnQgdXNlcidzIHB5ZGlzdHV0aWxzLmNmZyBmaWxlIiksCiAgICAgICAgKCdmaWxlbmFtZT0nLCAnZicsCiAgICAgICAgICJjb25maWd1cmF0aW9uIGZpbGUgdG8gdXNlIChkZWZhdWx0PXNldHVwLmNmZykiKSwKICAgIF0KCiAgICBib29sZWFuX29wdGlvbnMgPSBbCiAgICAgICAgJ2dsb2JhbC1jb25maWcnLCAndXNlci1jb25maWcnLAogICAgXQoKICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgc2VsZi5nbG9iYWxfY29uZmlnID0gTm9uZQogICAgICAgIHNlbGYudXNlcl9jb25maWcgPSBOb25lCiAgICAgICAgc2VsZi5maWxlbmFtZSA9IE5vbmUKCiAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBmaWxlbmFtZXMgPSBbXQogICAgICAgIGlmIHNlbGYuZ2xvYmFsX2NvbmZpZzoKICAgICAgICAgICAgZmlsZW5hbWVzLmFwcGVuZChjb25maWdfZmlsZSgnZ2xvYmFsJykpCiAgICAgICAgaWYgc2VsZi51c2VyX2NvbmZpZzoKICAgICAgICAgICAgZmlsZW5hbWVzLmFwcGVuZChjb25maWdfZmlsZSgndXNlcicpKQogICAgICAgIGlmIHNlbGYuZmlsZW5hbWUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGZpbGVuYW1lcy5hcHBlbmQoc2VsZi5maWxlbmFtZSkKICAgICAgICBpZiBub3QgZmlsZW5hbWVzOgogICAgICAgICAgICBmaWxlbmFtZXMuYXBwZW5kKGNvbmZpZ19maWxlKCdsb2NhbCcpKQogICAgICAgIGlmIGxlbihmaWxlbmFtZXMpID4gMToKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAiTXVzdCBzcGVjaWZ5IG9ubHkgb25lIGNvbmZpZ3VyYXRpb24gZmlsZSBvcHRpb24iLAogICAgICAgICAgICAgICAgZmlsZW5hbWVzCiAgICAgICAgICAgICkKICAgICAgICBzZWxmLmZpbGVuYW1lLCA9IGZpbGVuYW1lcwoKCmNsYXNzIHNldG9wdChvcHRpb25fYmFzZSk6CiAgICAiIiJTYXZlIGNvbW1hbmQtbGluZSBvcHRpb25zIHRvIGEgZmlsZSIiIgoKICAgIGRlc2NyaXB0aW9uID0gInNldCBhbiBvcHRpb24gaW4gc2V0dXAuY2ZnIG9yIGFub3RoZXIgY29uZmlnIGZpbGUiCgogICAgdXNlcl9vcHRpb25zID0gWwogICAgICAgICgnY29tbWFuZD0nLCAnYycsICdjb21tYW5kIHRvIHNldCBhbiBvcHRpb24gZm9yJyksCiAgICAgICAgKCdvcHRpb249JywgJ28nLCAnb3B0aW9uIHRvIHNldCcpLAogICAgICAgICgnc2V0LXZhbHVlPScsICdzJywgJ3ZhbHVlIG9mIHRoZSBvcHRpb24nKSwKICAgICAgICAoJ3JlbW92ZScsICdyJywgJ3JlbW92ZSAodW5zZXQpIHRoZSB2YWx1ZScpLAogICAgXSArIG9wdGlvbl9iYXNlLnVzZXJfb3B0aW9ucwoKICAgIGJvb2xlYW5fb3B0aW9ucyA9IG9wdGlvbl9iYXNlLmJvb2xlYW5fb3B0aW9ucyArIFsncmVtb3ZlJ10KCiAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIG9wdGlvbl9iYXNlLmluaXRpYWxpemVfb3B0aW9ucyhzZWxmKQogICAgICAgIHNlbGYuY29tbWFuZCA9IE5vbmUKICAgICAgICBzZWxmLm9wdGlvbiA9IE5vbmUKICAgICAgICBzZWxmLnNldF92YWx1ZSA9IE5vbmUKICAgICAgICBzZWxmLnJlbW92ZSA9IE5vbmUKCiAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBvcHRpb25fYmFzZS5maW5hbGl6ZV9vcHRpb25zKHNlbGYpCiAgICAgICAgaWYgc2VsZi5jb21tYW5kIGlzIE5vbmUgb3Igc2VsZi5vcHRpb24gaXMgTm9uZToKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoIk11c3Qgc3BlY2lmeSAtLWNvbW1hbmQgKmFuZCogLS1vcHRpb24iKQogICAgICAgIGlmIHNlbGYuc2V0X3ZhbHVlIGlzIE5vbmUgYW5kIG5vdCBzZWxmLnJlbW92ZToKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoIk11c3Qgc3BlY2lmeSAtLXNldC12YWx1ZSBvciAtLXJlbW92ZSIpCgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICBlZGl0X2NvbmZpZygKICAgICAgICAgICAgc2VsZi5maWxlbmFtZSwgewogICAgICAgICAgICAgICAgc2VsZi5jb21tYW5kOiB7c2VsZi5vcHRpb24ucmVwbGFjZSgnLScsICdfJyk6IHNlbGYuc2V0X3ZhbHVlfQogICAgICAgICAgICB9LAogICAgICAgICAgICBzZWxmLmRyeV9ydW4KICAgICAgICApClBLAwQUAAAAAAAAACEA3Zacz4IlAACCJQAAPwAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2NvbW1hbmQvdGVzdC5weWltcG9ydCBvcwppbXBvcnQgb3BlcmF0b3IKaW1wb3J0IHN5cwppbXBvcnQgY29udGV4dGxpYgppbXBvcnQgaXRlcnRvb2xzCmltcG9ydCB1bml0dGVzdApmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc0Vycm9yLCBEaXN0dXRpbHNPcHRpb25FcnJvcgpmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCmZyb20gdW5pdHRlc3QgaW1wb3J0IFRlc3RMb2FkZXIKCmZyb20gc2V0dXB0b29scy5leHRlcm4gaW1wb3J0IHNpeApmcm9tIHNldHVwdG9vbHMuZXh0ZXJuLnNpeC5tb3ZlcyBpbXBvcnQgbWFwLCBmaWx0ZXIKCmZyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgKHJlc291cmNlX2xpc3RkaXIsIHJlc291cmNlX2V4aXN0cywgbm9ybWFsaXplX3BhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtpbmdfc2V0LCBfbmFtZXNwYWNlX3BhY2thZ2VzLCBldmFsdWF0ZV9tYXJrZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF9hY3RpdmF0aW9uX2xpc3RlbmVyLCByZXF1aXJlLCBFbnRyeVBvaW50KQpmcm9tIHNldHVwdG9vbHMgaW1wb3J0IENvbW1hbmQKZnJvbSAuYnVpbGRfcHkgaW1wb3J0IF91bmlxdWVfZXZlcnNlZW4KCl9fbWV0YWNsYXNzX18gPSB0eXBlCgoKY2xhc3MgU2Nhbm5pbmdMb2FkZXIoVGVzdExvYWRlcik6CgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIFRlc3RMb2FkZXIuX19pbml0X18oc2VsZikKICAgICAgICBzZWxmLl92aXNpdGVkID0gc2V0KCkKCiAgICBkZWYgbG9hZFRlc3RzRnJvbU1vZHVsZShzZWxmLCBtb2R1bGUsIHBhdHRlcm49Tm9uZSk6CiAgICAgICAgIiIiUmV0dXJuIGEgc3VpdGUgb2YgYWxsIHRlc3RzIGNhc2VzIGNvbnRhaW5lZCBpbiB0aGUgZ2l2ZW4gbW9kdWxlCgogICAgICAgIElmIHRoZSBtb2R1bGUgaXMgYSBwYWNrYWdlLCBsb2FkIHRlc3RzIGZyb20gYWxsIHRoZSBtb2R1bGVzIGluIGl0LgogICAgICAgIElmIHRoZSBtb2R1bGUgaGFzIGFuIGBgYWRkaXRpb25hbF90ZXN0c2BgIGZ1bmN0aW9uLCBjYWxsIGl0IGFuZCBhZGQKICAgICAgICB0aGUgcmV0dXJuIHZhbHVlIHRvIHRoZSB0ZXN0cy4KICAgICAgICAiIiIKICAgICAgICBpZiBtb2R1bGUgaW4gc2VsZi5fdmlzaXRlZDoKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICBzZWxmLl92aXNpdGVkLmFkZChtb2R1bGUpCgogICAgICAgIHRlc3RzID0gW10KICAgICAgICB0ZXN0cy5hcHBlbmQoVGVzdExvYWRlci5sb2FkVGVzdHNGcm9tTW9kdWxlKHNlbGYsIG1vZHVsZSkpCgogICAgICAgIGlmIGhhc2F0dHIobW9kdWxlLCAiYWRkaXRpb25hbF90ZXN0cyIpOgogICAgICAgICAgICB0ZXN0cy5hcHBlbmQobW9kdWxlLmFkZGl0aW9uYWxfdGVzdHMoKSkKCiAgICAgICAgaWYgaGFzYXR0cihtb2R1bGUsICdfX3BhdGhfXycpOgogICAgICAgICAgICBmb3IgZmlsZSBpbiByZXNvdXJjZV9saXN0ZGlyKG1vZHVsZS5fX25hbWVfXywgJycpOgogICAgICAgICAgICAgICAgaWYgZmlsZS5lbmRzd2l0aCgnLnB5JykgYW5kIGZpbGUgIT0gJ19faW5pdF9fLnB5JzoKICAgICAgICAgICAgICAgICAgICBzdWJtb2R1bGUgPSBtb2R1bGUuX19uYW1lX18gKyAnLicgKyBmaWxlWzotM10KICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgaWYgcmVzb3VyY2VfZXhpc3RzKG1vZHVsZS5fX25hbWVfXywgZmlsZSArICcvX19pbml0X18ucHknKToKICAgICAgICAgICAgICAgICAgICAgICAgc3VibW9kdWxlID0gbW9kdWxlLl9fbmFtZV9fICsgJy4nICsgZmlsZQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICB0ZXN0cy5hcHBlbmQoc2VsZi5sb2FkVGVzdHNGcm9tTmFtZShzdWJtb2R1bGUpKQoKICAgICAgICBpZiBsZW4odGVzdHMpICE9IDE6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnN1aXRlQ2xhc3ModGVzdHMpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHRlc3RzWzBdICAjIGRvbid0IGNyZWF0ZSBhIG5lc3RlZCBzdWl0ZSBmb3Igb25seSBvbmUgcmV0dXJuCgoKIyBhZGFwdGVkIGZyb20gamFyYWNvLmNsYXNzZXMucHJvcGVydGllczpOb25EYXRhUHJvcGVydHkKY2xhc3MgTm9uRGF0YVByb3BlcnR5OgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGZnZXQpOgogICAgICAgIHNlbGYuZmdldCA9IGZnZXQKCiAgICBkZWYgX19nZXRfXyhzZWxmLCBvYmosIG9ianR5cGU9Tm9uZSk6CiAgICAgICAgaWYgb2JqIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybiBzZWxmCiAgICAgICAgcmV0dXJuIHNlbGYuZmdldChvYmopCgoKY2xhc3MgdGVzdChDb21tYW5kKToKICAgICIiIkNvbW1hbmQgdG8gcnVuIHVuaXQgdGVzdHMgYWZ0ZXIgaW4tcGxhY2UgYnVpbGQiIiIKCiAgICBkZXNjcmlwdGlvbiA9ICJydW4gdW5pdCB0ZXN0cyBhZnRlciBpbi1wbGFjZSBidWlsZCAoZGVwcmVjYXRlZCkiCgogICAgdXNlcl9vcHRpb25zID0gWwogICAgICAgICgndGVzdC1tb2R1bGU9JywgJ20nLCAiUnVuICd0ZXN0X3N1aXRlJyBpbiBzcGVjaWZpZWQgbW9kdWxlIiksCiAgICAgICAgKCd0ZXN0LXN1aXRlPScsICdzJywKICAgICAgICAgIlJ1biBzaW5nbGUgdGVzdCwgY2FzZSBvciBzdWl0ZSAoZS5nLiAnbW9kdWxlLnRlc3Rfc3VpdGUnKSIpLAogICAgICAgICgndGVzdC1ydW5uZXI9JywgJ3InLCAiVGVzdCBydW5uZXIgdG8gdXNlIiksCiAgICBdCgogICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBzZWxmLnRlc3Rfc3VpdGUgPSBOb25lCiAgICAgICAgc2VsZi50ZXN0X21vZHVsZSA9IE5vbmUKICAgICAgICBzZWxmLnRlc3RfbG9hZGVyID0gTm9uZQogICAgICAgIHNlbGYudGVzdF9ydW5uZXIgPSBOb25lCgogICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CgogICAgICAgIGlmIHNlbGYudGVzdF9zdWl0ZSBhbmQgc2VsZi50ZXN0X21vZHVsZToKICAgICAgICAgICAgbXNnID0gIllvdSBtYXkgc3BlY2lmeSBhIG1vZHVsZSBvciBhIHN1aXRlLCBidXQgbm90IGJvdGgiCiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKG1zZykKCiAgICAgICAgaWYgc2VsZi50ZXN0X3N1aXRlIGlzIE5vbmU6CiAgICAgICAgICAgIGlmIHNlbGYudGVzdF9tb2R1bGUgaXMgTm9uZToKICAgICAgICAgICAgICAgIHNlbGYudGVzdF9zdWl0ZSA9IHNlbGYuZGlzdHJpYnV0aW9uLnRlc3Rfc3VpdGUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYudGVzdF9zdWl0ZSA9IHNlbGYudGVzdF9tb2R1bGUgKyAiLnRlc3Rfc3VpdGUiCgogICAgICAgIGlmIHNlbGYudGVzdF9sb2FkZXIgaXMgTm9uZToKICAgICAgICAgICAgc2VsZi50ZXN0X2xvYWRlciA9IGdldGF0dHIoc2VsZi5kaXN0cmlidXRpb24sICd0ZXN0X2xvYWRlcicsIE5vbmUpCiAgICAgICAgaWYgc2VsZi50ZXN0X2xvYWRlciBpcyBOb25lOgogICAgICAgICAgICBzZWxmLnRlc3RfbG9hZGVyID0gInNldHVwdG9vbHMuY29tbWFuZC50ZXN0OlNjYW5uaW5nTG9hZGVyIgogICAgICAgIGlmIHNlbGYudGVzdF9ydW5uZXIgaXMgTm9uZToKICAgICAgICAgICAgc2VsZi50ZXN0X3J1bm5lciA9IGdldGF0dHIoc2VsZi5kaXN0cmlidXRpb24sICd0ZXN0X3J1bm5lcicsIE5vbmUpCgogICAgQE5vbkRhdGFQcm9wZXJ0eQogICAgZGVmIHRlc3RfYXJncyhzZWxmKToKICAgICAgICByZXR1cm4gbGlzdChzZWxmLl90ZXN0X2FyZ3MoKSkKCiAgICBkZWYgX3Rlc3RfYXJncyhzZWxmKToKICAgICAgICBpZiBub3Qgc2VsZi50ZXN0X3N1aXRlIGFuZCBzeXMudmVyc2lvbl9pbmZvID49ICgyLCA3KToKICAgICAgICAgICAgeWllbGQgJ2Rpc2NvdmVyJwogICAgICAgIGlmIHNlbGYudmVyYm9zZToKICAgICAgICAgICAgeWllbGQgJy0tdmVyYm9zZScKICAgICAgICBpZiBzZWxmLnRlc3Rfc3VpdGU6CiAgICAgICAgICAgIHlpZWxkIHNlbGYudGVzdF9zdWl0ZQoKICAgIGRlZiB3aXRoX3Byb2plY3Rfb25fc3lzX3BhdGgoc2VsZiwgZnVuYyk6CiAgICAgICAgIiIiCiAgICAgICAgQmFja3dhcmQgY29tcGF0aWJpbGl0eSBmb3IgcHJvamVjdF9vbl9zeXNfcGF0aCBjb250ZXh0LgogICAgICAgICIiIgogICAgICAgIHdpdGggc2VsZi5wcm9qZWN0X29uX3N5c19wYXRoKCk6CiAgICAgICAgICAgIGZ1bmMoKQoKICAgIEBjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCiAgICBkZWYgcHJvamVjdF9vbl9zeXNfcGF0aChzZWxmLCBpbmNsdWRlX2Rpc3RzPVtdKToKICAgICAgICB3aXRoXzJ0bzMgPSBzaXguUFkzIGFuZCBnZXRhdHRyKHNlbGYuZGlzdHJpYnV0aW9uLCAndXNlXzJ0bzMnLCBGYWxzZSkKCiAgICAgICAgaWYgd2l0aF8ydG8zOgogICAgICAgICAgICAjIElmIHdlIHJ1biAydG8zIHdlIGNhbiBub3QgZG8gdGhpcyBpbnBsYWNlOgoKICAgICAgICAgICAgIyBFbnN1cmUgbWV0YWRhdGEgaXMgdXAtdG8tZGF0ZQogICAgICAgICAgICBzZWxmLnJlaW5pdGlhbGl6ZV9jb21tYW5kKCdidWlsZF9weScsIGlucGxhY2U9MCkKICAgICAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgnYnVpbGRfcHknKQogICAgICAgICAgICBicHlfY21kID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoImJ1aWxkX3B5IikKICAgICAgICAgICAgYnVpbGRfcGF0aCA9IG5vcm1hbGl6ZV9wYXRoKGJweV9jbWQuYnVpbGRfbGliKQoKICAgICAgICAgICAgIyBCdWlsZCBleHRlbnNpb25zCiAgICAgICAgICAgIHNlbGYucmVpbml0aWFsaXplX2NvbW1hbmQoJ2VnZ19pbmZvJywgZWdnX2Jhc2U9YnVpbGRfcGF0aCkKICAgICAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgnZWdnX2luZm8nKQoKICAgICAgICAgICAgc2VsZi5yZWluaXRpYWxpemVfY29tbWFuZCgnYnVpbGRfZXh0JywgaW5wbGFjZT0wKQogICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdidWlsZF9leHQnKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgV2l0aG91dCAydG8zIGlucGxhY2Ugd29ya3MgZmluZToKICAgICAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgnZWdnX2luZm8nKQoKICAgICAgICAgICAgIyBCdWlsZCBleHRlbnNpb25zIGluLXBsYWNlCiAgICAgICAgICAgIHNlbGYucmVpbml0aWFsaXplX2NvbW1hbmQoJ2J1aWxkX2V4dCcsIGlucGxhY2U9MSkKICAgICAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgnYnVpbGRfZXh0JykKCiAgICAgICAgZWlfY21kID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoImVnZ19pbmZvIikKCiAgICAgICAgb2xkX3BhdGggPSBzeXMucGF0aFs6XQogICAgICAgIG9sZF9tb2R1bGVzID0gc3lzLm1vZHVsZXMuY29weSgpCgogICAgICAgIHRyeToKICAgICAgICAgICAgcHJvamVjdF9wYXRoID0gbm9ybWFsaXplX3BhdGgoZWlfY21kLmVnZ19iYXNlKQogICAgICAgICAgICBzeXMucGF0aC5pbnNlcnQoMCwgcHJvamVjdF9wYXRoKQogICAgICAgICAgICB3b3JraW5nX3NldC5fX2luaXRfXygpCiAgICAgICAgICAgIGFkZF9hY3RpdmF0aW9uX2xpc3RlbmVyKGxhbWJkYSBkaXN0OiBkaXN0LmFjdGl2YXRlKCkpCiAgICAgICAgICAgIHJlcXVpcmUoJyVzPT0lcycgJSAoZWlfY21kLmVnZ19uYW1lLCBlaV9jbWQuZWdnX3ZlcnNpb24pKQogICAgICAgICAgICB3aXRoIHNlbGYucGF0aHNfb25fcHl0aG9ucGF0aChbcHJvamVjdF9wYXRoXSk6CiAgICAgICAgICAgICAgICB5aWVsZAogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIHN5cy5wYXRoWzpdID0gb2xkX3BhdGgKICAgICAgICAgICAgc3lzLm1vZHVsZXMuY2xlYXIoKQogICAgICAgICAgICBzeXMubW9kdWxlcy51cGRhdGUob2xkX21vZHVsZXMpCiAgICAgICAgICAgIHdvcmtpbmdfc2V0Ll9faW5pdF9fKCkKCiAgICBAc3RhdGljbWV0aG9kCiAgICBAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgogICAgZGVmIHBhdGhzX29uX3B5dGhvbnBhdGgocGF0aHMpOgogICAgICAgICIiIgogICAgICAgIEFkZCB0aGUgaW5kaWNhdGVkIHBhdGhzIHRvIHRoZSBoZWFkIG9mIHRoZSBQWVRIT05QQVRIIGVudmlyb25tZW50CiAgICAgICAgdmFyaWFibGUgc28gdGhhdCBzdWJwcm9jZXNzZXMgd2lsbCBhbHNvIHNlZSB0aGUgcGFja2FnZXMgYXQKICAgICAgICB0aGVzZSBwYXRocy4KCiAgICAgICAgRG8gdGhpcyBpbiBhIGNvbnRleHQgdGhhdCByZXN0b3JlcyB0aGUgdmFsdWUgb24gZXhpdC4KICAgICAgICAiIiIKICAgICAgICBub3RoaW5nID0gb2JqZWN0KCkKICAgICAgICBvcmlnX3B5dGhvbnBhdGggPSBvcy5lbnZpcm9uLmdldCgnUFlUSE9OUEFUSCcsIG5vdGhpbmcpCiAgICAgICAgY3VycmVudF9weXRob25wYXRoID0gb3MuZW52aXJvbi5nZXQoJ1BZVEhPTlBBVEgnLCAnJykKICAgICAgICB0cnk6CiAgICAgICAgICAgIHByZWZpeCA9IG9zLnBhdGhzZXAuam9pbihfdW5pcXVlX2V2ZXJzZWVuKHBhdGhzKSkKICAgICAgICAgICAgdG9fam9pbiA9IGZpbHRlcihOb25lLCBbcHJlZml4LCBjdXJyZW50X3B5dGhvbnBhdGhdKQogICAgICAgICAgICBuZXdfcGF0aCA9IG9zLnBhdGhzZXAuam9pbih0b19qb2luKQogICAgICAgICAgICBpZiBuZXdfcGF0aDoKICAgICAgICAgICAgICAgIG9zLmVudmlyb25bJ1BZVEhPTlBBVEgnXSA9IG5ld19wYXRoCiAgICAgICAgICAgIHlpZWxkCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgaWYgb3JpZ19weXRob25wYXRoIGlzIG5vdGhpbmc6CiAgICAgICAgICAgICAgICBvcy5lbnZpcm9uLnBvcCgnUFlUSE9OUEFUSCcsIE5vbmUpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBvcy5lbnZpcm9uWydQWVRIT05QQVRIJ10gPSBvcmlnX3B5dGhvbnBhdGgKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgaW5zdGFsbF9kaXN0cyhkaXN0KToKICAgICAgICAiIiIKICAgICAgICBJbnN0YWxsIHRoZSByZXF1aXJlbWVudHMgaW5kaWNhdGVkIGJ5IHNlbGYuZGlzdHJpYnV0aW9uIGFuZAogICAgICAgIHJldHVybiBhbiBpdGVyYWJsZSBvZiB0aGUgZGlzdHMgdGhhdCB3ZXJlIGJ1aWx0LgogICAgICAgICIiIgogICAgICAgIGlyX2QgPSBkaXN0LmZldGNoX2J1aWxkX2VnZ3MoZGlzdC5pbnN0YWxsX3JlcXVpcmVzKQogICAgICAgIHRyX2QgPSBkaXN0LmZldGNoX2J1aWxkX2VnZ3MoZGlzdC50ZXN0c19yZXF1aXJlIG9yIFtdKQogICAgICAgIGVyX2QgPSBkaXN0LmZldGNoX2J1aWxkX2VnZ3MoCiAgICAgICAgICAgIHYgZm9yIGssIHYgaW4gZGlzdC5leHRyYXNfcmVxdWlyZS5pdGVtcygpCiAgICAgICAgICAgIGlmIGsuc3RhcnRzd2l0aCgnOicpIGFuZCBldmFsdWF0ZV9tYXJrZXIoa1sxOl0pCiAgICAgICAgKQogICAgICAgIHJldHVybiBpdGVydG9vbHMuY2hhaW4oaXJfZCwgdHJfZCwgZXJfZCkKCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgIHNlbGYuYW5ub3VuY2UoCiAgICAgICAgICAgICJXQVJOSU5HOiBUZXN0aW5nIHZpYSB0aGlzIGNvbW1hbmQgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSAiCiAgICAgICAgICAgICJyZW1vdmVkIGluIGEgZnV0dXJlIHZlcnNpb24uIFVzZXJzIGxvb2tpbmcgZm9yIGEgZ2VuZXJpYyB0ZXN0ICIKICAgICAgICAgICAgImVudHJ5IHBvaW50IGluZGVwZW5kZW50IG9mIHRlc3QgcnVubmVyIGFyZSBlbmNvdXJhZ2VkIHRvIHVzZSAiCiAgICAgICAgICAgICJ0b3guIiwKICAgICAgICAgICAgbG9nLldBUk4sCiAgICAgICAgKQoKICAgICAgICBpbnN0YWxsZWRfZGlzdHMgPSBzZWxmLmluc3RhbGxfZGlzdHMoc2VsZi5kaXN0cmlidXRpb24pCgogICAgICAgIGNtZCA9ICcgJy5qb2luKHNlbGYuX2FyZ3YpCiAgICAgICAgaWYgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICBzZWxmLmFubm91bmNlKCdza2lwcGluZyAiJXMiIChkcnkgcnVuKScgJSBjbWQpCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBzZWxmLmFubm91bmNlKCdydW5uaW5nICIlcyInICUgY21kKQoKICAgICAgICBwYXRocyA9IG1hcChvcGVyYXRvci5hdHRyZ2V0dGVyKCdsb2NhdGlvbicpLCBpbnN0YWxsZWRfZGlzdHMpCiAgICAgICAgd2l0aCBzZWxmLnBhdGhzX29uX3B5dGhvbnBhdGgocGF0aHMpOgogICAgICAgICAgICB3aXRoIHNlbGYucHJvamVjdF9vbl9zeXNfcGF0aCgpOgogICAgICAgICAgICAgICAgc2VsZi5ydW5fdGVzdHMoKQoKICAgIGRlZiBydW5fdGVzdHMoc2VsZik6CiAgICAgICAgIyBQdXJnZSBtb2R1bGVzIHVuZGVyIHRlc3QgZnJvbSBzeXMubW9kdWxlcy4gVGhlIHRlc3QgbG9hZGVyIHdpbGwKICAgICAgICAjIHJlLWltcG9ydCB0aGVtIGZyb20gdGhlIGJ1aWxkIGxvY2F0aW9uLiBSZXF1aXJlZCB3aGVuIDJ0bzMgaXMgdXNlZAogICAgICAgICMgd2l0aCBuYW1lc3BhY2UgcGFja2FnZXMuCiAgICAgICAgaWYgc2l4LlBZMyBhbmQgZ2V0YXR0cihzZWxmLmRpc3RyaWJ1dGlvbiwgJ3VzZV8ydG8zJywgRmFsc2UpOgogICAgICAgICAgICBtb2R1bGUgPSBzZWxmLnRlc3Rfc3VpdGUuc3BsaXQoJy4nKVswXQogICAgICAgICAgICBpZiBtb2R1bGUgaW4gX25hbWVzcGFjZV9wYWNrYWdlczoKICAgICAgICAgICAgICAgIGRlbF9tb2R1bGVzID0gW10KICAgICAgICAgICAgICAgIGlmIG1vZHVsZSBpbiBzeXMubW9kdWxlczoKICAgICAgICAgICAgICAgICAgICBkZWxfbW9kdWxlcy5hcHBlbmQobW9kdWxlKQogICAgICAgICAgICAgICAgbW9kdWxlICs9ICcuJwogICAgICAgICAgICAgICAgZm9yIG5hbWUgaW4gc3lzLm1vZHVsZXM6CiAgICAgICAgICAgICAgICAgICAgaWYgbmFtZS5zdGFydHN3aXRoKG1vZHVsZSk6CiAgICAgICAgICAgICAgICAgICAgICAgIGRlbF9tb2R1bGVzLmFwcGVuZChuYW1lKQogICAgICAgICAgICAgICAgbGlzdChtYXAoc3lzLm1vZHVsZXMuX19kZWxpdGVtX18sIGRlbF9tb2R1bGVzKSkKCiAgICAgICAgdGVzdCA9IHVuaXR0ZXN0Lm1haW4oCiAgICAgICAgICAgIE5vbmUsIE5vbmUsIHNlbGYuX2FyZ3YsCiAgICAgICAgICAgIHRlc3RMb2FkZXI9c2VsZi5fcmVzb2x2ZV9hc19lcChzZWxmLnRlc3RfbG9hZGVyKSwKICAgICAgICAgICAgdGVzdFJ1bm5lcj1zZWxmLl9yZXNvbHZlX2FzX2VwKHNlbGYudGVzdF9ydW5uZXIpLAogICAgICAgICAgICBleGl0PUZhbHNlLAogICAgICAgICkKICAgICAgICBpZiBub3QgdGVzdC5yZXN1bHQud2FzU3VjY2Vzc2Z1bCgpOgogICAgICAgICAgICBtc2cgPSAnVGVzdCBmYWlsZWQ6ICVzJyAlIHRlc3QucmVzdWx0CiAgICAgICAgICAgIHNlbGYuYW5ub3VuY2UobXNnLCBsb2cuRVJST1IpCiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKG1zZykKCiAgICBAcHJvcGVydHkKICAgIGRlZiBfYXJndihzZWxmKToKICAgICAgICByZXR1cm4gWyd1bml0dGVzdCddICsgc2VsZi50ZXN0X2FyZ3MKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX3Jlc29sdmVfYXNfZXAodmFsKToKICAgICAgICAiIiIKICAgICAgICBMb2FkIHRoZSBpbmRpY2F0ZWQgYXR0cmlidXRlIHZhbHVlLCBjYWxsZWQsIGFzIGEgYXMgaWYgaXQgd2VyZQogICAgICAgIHNwZWNpZmllZCBhcyBhbiBlbnRyeSBwb2ludC4KICAgICAgICAiIiIKICAgICAgICBpZiB2YWwgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgcGFyc2VkID0gRW50cnlQb2ludC5wYXJzZSgieD0iICsgdmFsKQogICAgICAgIHJldHVybiBwYXJzZWQucmVzb2x2ZSgpKCkKUEsDBBQAAAAAAAAAIQAiAF1LzgEAAM4BAABBAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvY29tbWFuZC91cGxvYWQucHlmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCmZyb20gZGlzdHV0aWxzLmNvbW1hbmQgaW1wb3J0IHVwbG9hZCBhcyBvcmlnCgpmcm9tIHNldHVwdG9vbHMuZXJyb3JzIGltcG9ydCBSZW1vdmVkQ29tbWFuZEVycm9yCgoKY2xhc3MgdXBsb2FkKG9yaWcudXBsb2FkKToKICAgICIiIkZvcm1lcmx5IHVzZWQgdG8gdXBsb2FkIHBhY2thZ2VzIHRvIFB5UEkuIiIiCgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICBtc2cgPSAoCiAgICAgICAgICAgICJUaGUgdXBsb2FkIGNvbW1hbmQgaGFzIGJlZW4gcmVtb3ZlZCwgdXNlIHR3aW5lIHRvIHVwbG9hZCAiCiAgICAgICAgICAgICsgImluc3RlYWQgKGh0dHBzOi8vcHlwaS5vcmcvcC90d2luZSkiCiAgICAgICAgKQoKICAgICAgICBzZWxmLmFubm91bmNlKCJFUlJPUjogIiArIG1zZywgbG9nLkVSUk9SKQogICAgICAgIHJhaXNlIFJlbW92ZWRDb21tYW5kRXJyb3IobXNnKQpQSwMEFAAAAAAAAAAhAPKX88aPHAAAjxwAAEYAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9jb21tYW5kL3VwbG9hZF9kb2NzLnB5IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KIiIidXBsb2FkX2RvY3MKCkltcGxlbWVudHMgYSBEaXN0dXRpbHMgJ3VwbG9hZF9kb2NzJyBzdWJjb21tYW5kICh1cGxvYWQgZG9jdW1lbnRhdGlvbiB0bwpQeVBJJ3MgcHl0aG9uaG9zdGVkLm9yZykuCiIiIgoKZnJvbSBiYXNlNjQgaW1wb3J0IHN0YW5kYXJkX2I2NGVuY29kZQpmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCmZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzT3B0aW9uRXJyb3IKaW1wb3J0IG9zCmltcG9ydCBzb2NrZXQKaW1wb3J0IHppcGZpbGUKaW1wb3J0IHRlbXBmaWxlCmltcG9ydCBzaHV0aWwKaW1wb3J0IGl0ZXJ0b29scwppbXBvcnQgZnVuY3Rvb2xzCgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuIGltcG9ydCBzaXgKZnJvbSBzZXR1cHRvb2xzLmV4dGVybi5zaXgubW92ZXMgaW1wb3J0IGh0dHBfY2xpZW50LCB1cmxsaWIKCmZyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgaXRlcl9lbnRyeV9wb2ludHMKZnJvbSAudXBsb2FkIGltcG9ydCB1cGxvYWQKCgpkZWYgX2VuY29kZShzKToKICAgIGVycm9ycyA9ICdzdXJyb2dhdGVlc2NhcGUnIGlmIHNpeC5QWTMgZWxzZSAnc3RyaWN0JwogICAgcmV0dXJuIHMuZW5jb2RlKCd1dGYtOCcsIGVycm9ycykKCgpjbGFzcyB1cGxvYWRfZG9jcyh1cGxvYWQpOgogICAgIyBvdmVycmlkZSB0aGUgZGVmYXVsdCByZXBvc2l0b3J5IGFzIHVwbG9hZF9kb2NzIGlzbid0CiAgICAjIHN1cHBvcnRlZCBieSBXYXJlaG91c2UgKGFuZCB3b24ndCBiZSkuCiAgICBERUZBVUxUX1JFUE9TSVRPUlkgPSAnaHR0cHM6Ly9weXBpLnB5dGhvbi5vcmcvcHlwaS8nCgogICAgZGVzY3JpcHRpb24gPSAnVXBsb2FkIGRvY3VtZW50YXRpb24gdG8gUHlQSScKCiAgICB1c2VyX29wdGlvbnMgPSBbCiAgICAgICAgKCdyZXBvc2l0b3J5PScsICdyJywKICAgICAgICAgInVybCBvZiByZXBvc2l0b3J5IFtkZWZhdWx0OiAlc10iICUgdXBsb2FkLkRFRkFVTFRfUkVQT1NJVE9SWSksCiAgICAgICAgKCdzaG93LXJlc3BvbnNlJywgTm9uZSwKICAgICAgICAgJ2Rpc3BsYXkgZnVsbCByZXNwb25zZSB0ZXh0IGZyb20gc2VydmVyJyksCiAgICAgICAgKCd1cGxvYWQtZGlyPScsIE5vbmUsICdkaXJlY3RvcnkgdG8gdXBsb2FkJyksCiAgICBdCiAgICBib29sZWFuX29wdGlvbnMgPSB1cGxvYWQuYm9vbGVhbl9vcHRpb25zCgogICAgZGVmIGhhc19zcGhpbngoc2VsZik6CiAgICAgICAgaWYgc2VsZi51cGxvYWRfZGlyIGlzIE5vbmU6CiAgICAgICAgICAgIGZvciBlcCBpbiBpdGVyX2VudHJ5X3BvaW50cygnZGlzdHV0aWxzLmNvbW1hbmRzJywgJ2J1aWxkX3NwaGlueCcpOgogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICBzdWJfY29tbWFuZHMgPSBbKCdidWlsZF9zcGhpbngnLCBoYXNfc3BoaW54KV0KCiAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIHVwbG9hZC5pbml0aWFsaXplX29wdGlvbnMoc2VsZikKICAgICAgICBzZWxmLnVwbG9hZF9kaXIgPSBOb25lCiAgICAgICAgc2VsZi50YXJnZXRfZGlyID0gTm9uZQoKICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIHVwbG9hZC5maW5hbGl6ZV9vcHRpb25zKHNlbGYpCiAgICAgICAgaWYgc2VsZi51cGxvYWRfZGlyIGlzIE5vbmU6CiAgICAgICAgICAgIGlmIHNlbGYuaGFzX3NwaGlueCgpOgogICAgICAgICAgICAgICAgYnVpbGRfc3BoaW54ID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2J1aWxkX3NwaGlueCcpCiAgICAgICAgICAgICAgICBzZWxmLnRhcmdldF9kaXIgPSBidWlsZF9zcGhpbnguYnVpbGRlcl90YXJnZXRfZGlyCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBidWlsZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdidWlsZCcpCiAgICAgICAgICAgICAgICBzZWxmLnRhcmdldF9kaXIgPSBvcy5wYXRoLmpvaW4oYnVpbGQuYnVpbGRfYmFzZSwgJ2RvY3MnKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuZW5zdXJlX2Rpcm5hbWUoJ3VwbG9hZF9kaXInKQogICAgICAgICAgICBzZWxmLnRhcmdldF9kaXIgPSBzZWxmLnVwbG9hZF9kaXIKICAgICAgICBpZiAncHlwaS5weXRob24ub3JnJyBpbiBzZWxmLnJlcG9zaXRvcnk6CiAgICAgICAgICAgIGxvZy53YXJuKCJVcGxvYWRfZG9jcyBjb21tYW5kIGlzIGRlcHJlY2F0ZWQuIFVzZSBSVEQgaW5zdGVhZC4iKQogICAgICAgIHNlbGYuYW5ub3VuY2UoJ1VzaW5nIHVwbG9hZCBkaXJlY3RvcnkgJXMnICUgc2VsZi50YXJnZXRfZGlyKQoKICAgIGRlZiBjcmVhdGVfemlwZmlsZShzZWxmLCBmaWxlbmFtZSk6CiAgICAgICAgemlwX2ZpbGUgPSB6aXBmaWxlLlppcEZpbGUoZmlsZW5hbWUsICJ3IikKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYubWtwYXRoKHNlbGYudGFyZ2V0X2RpcikgICMganVzdCBpbiBjYXNlCiAgICAgICAgICAgIGZvciByb290LCBkaXJzLCBmaWxlcyBpbiBvcy53YWxrKHNlbGYudGFyZ2V0X2Rpcik6CiAgICAgICAgICAgICAgICBpZiByb290ID09IHNlbGYudGFyZ2V0X2RpciBhbmQgbm90IGZpbGVzOgogICAgICAgICAgICAgICAgICAgIHRtcGwgPSAibm8gZmlsZXMgZm91bmQgaW4gdXBsb2FkIGRpcmVjdG9yeSAnJXMnIgogICAgICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKHRtcGwgJSBzZWxmLnRhcmdldF9kaXIpCiAgICAgICAgICAgICAgICBmb3IgbmFtZSBpbiBmaWxlczoKICAgICAgICAgICAgICAgICAgICBmdWxsID0gb3MucGF0aC5qb2luKHJvb3QsIG5hbWUpCiAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmUgPSByb290W2xlbihzZWxmLnRhcmdldF9kaXIpOl0ubHN0cmlwKG9zLnBhdGguc2VwKQogICAgICAgICAgICAgICAgICAgIGRlc3QgPSBvcy5wYXRoLmpvaW4ocmVsYXRpdmUsIG5hbWUpCiAgICAgICAgICAgICAgICAgICAgemlwX2ZpbGUud3JpdGUoZnVsbCwgZGVzdCkKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICB6aXBfZmlsZS5jbG9zZSgpCgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICAjIFJ1biBzdWIgY29tbWFuZHMKICAgICAgICBmb3IgY21kX25hbWUgaW4gc2VsZi5nZXRfc3ViX2NvbW1hbmRzKCk6CiAgICAgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoY21kX25hbWUpCgogICAgICAgIHRtcF9kaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKICAgICAgICBuYW1lID0gc2VsZi5kaXN0cmlidXRpb24ubWV0YWRhdGEuZ2V0X25hbWUoKQogICAgICAgIHppcF9maWxlID0gb3MucGF0aC5qb2luKHRtcF9kaXIsICIlcy56aXAiICUgbmFtZSkKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYuY3JlYXRlX3ppcGZpbGUoemlwX2ZpbGUpCiAgICAgICAgICAgIHNlbGYudXBsb2FkX2ZpbGUoemlwX2ZpbGUpCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgc2h1dGlsLnJtdHJlZSh0bXBfZGlyKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfYnVpbGRfcGFydChpdGVtLCBzZXBfYm91bmRhcnkpOgogICAgICAgIGtleSwgdmFsdWVzID0gaXRlbQogICAgICAgIHRpdGxlID0gJ1xuQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPSIlcyInICUga2V5CiAgICAgICAgIyBoYW5kbGUgbXVsdGlwbGUgZW50cmllcyBmb3IgdGhlIHNhbWUgbmFtZQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHZhbHVlcywgbGlzdCk6CiAgICAgICAgICAgIHZhbHVlcyA9IFt2YWx1ZXNdCiAgICAgICAgZm9yIHZhbHVlIGluIHZhbHVlczoKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgdHVwbGUpOgogICAgICAgICAgICAgICAgdGl0bGUgKz0gJzsgZmlsZW5hbWU9IiVzIicgJSB2YWx1ZVswXQogICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZVsxXQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgdmFsdWUgPSBfZW5jb2RlKHZhbHVlKQogICAgICAgICAgICB5aWVsZCBzZXBfYm91bmRhcnkKICAgICAgICAgICAgeWllbGQgX2VuY29kZSh0aXRsZSkKICAgICAgICAgICAgeWllbGQgYiJcblxuIgogICAgICAgICAgICB5aWVsZCB2YWx1ZQogICAgICAgICAgICBpZiB2YWx1ZSBhbmQgdmFsdWVbLTE6XSA9PSBiJ1xyJzoKICAgICAgICAgICAgICAgIHlpZWxkIGInXG4nICAjIHdyaXRlIGFuIGV4dHJhIG5ld2xpbmUgKGx1cnZlIE1hY3MpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX2J1aWxkX211bHRpcGFydChjbHMsIGRhdGEpOgogICAgICAgICIiIgogICAgICAgIEJ1aWxkIHVwIHRoZSBNSU1FIHBheWxvYWQgZm9yIHRoZSBQT1NUIGRhdGEKICAgICAgICAiIiIKICAgICAgICBib3VuZGFyeSA9IGInLS0tLS0tLS0tLS0tLS1HSFNLRkpETEdEUzc1NDNGSktMRkhSRTc1NjQyNzU2NzQzMjU0JwogICAgICAgIHNlcF9ib3VuZGFyeSA9IGInXG4tLScgKyBib3VuZGFyeQogICAgICAgIGVuZF9ib3VuZGFyeSA9IHNlcF9ib3VuZGFyeSArIGInLS0nCiAgICAgICAgZW5kX2l0ZW1zID0gZW5kX2JvdW5kYXJ5LCBiIlxuIiwKICAgICAgICBidWlsZGVyID0gZnVuY3Rvb2xzLnBhcnRpYWwoCiAgICAgICAgICAgIGNscy5fYnVpbGRfcGFydCwKICAgICAgICAgICAgc2VwX2JvdW5kYXJ5PXNlcF9ib3VuZGFyeSwKICAgICAgICApCiAgICAgICAgcGFydF9ncm91cHMgPSBtYXAoYnVpbGRlciwgZGF0YS5pdGVtcygpKQogICAgICAgIHBhcnRzID0gaXRlcnRvb2xzLmNoYWluLmZyb21faXRlcmFibGUocGFydF9ncm91cHMpCiAgICAgICAgYm9keV9pdGVtcyA9IGl0ZXJ0b29scy5jaGFpbihwYXJ0cywgZW5kX2l0ZW1zKQogICAgICAgIGNvbnRlbnRfdHlwZSA9ICdtdWx0aXBhcnQvZm9ybS1kYXRhOyBib3VuZGFyeT0lcycgJSBib3VuZGFyeS5kZWNvZGUoJ2FzY2lpJykKICAgICAgICByZXR1cm4gYicnLmpvaW4oYm9keV9pdGVtcyksIGNvbnRlbnRfdHlwZQoKICAgIGRlZiB1cGxvYWRfZmlsZShzZWxmLCBmaWxlbmFtZSk6CiAgICAgICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAncmInKSBhcyBmOgogICAgICAgICAgICBjb250ZW50ID0gZi5yZWFkKCkKICAgICAgICBtZXRhID0gc2VsZi5kaXN0cmlidXRpb24ubWV0YWRhdGEKICAgICAgICBkYXRhID0gewogICAgICAgICAgICAnOmFjdGlvbic6ICdkb2NfdXBsb2FkJywKICAgICAgICAgICAgJ25hbWUnOiBtZXRhLmdldF9uYW1lKCksCiAgICAgICAgICAgICdjb250ZW50JzogKG9zLnBhdGguYmFzZW5hbWUoZmlsZW5hbWUpLCBjb250ZW50KSwKICAgICAgICB9CiAgICAgICAgIyBzZXQgdXAgdGhlIGF1dGhlbnRpY2F0aW9uCiAgICAgICAgY3JlZGVudGlhbHMgPSBfZW5jb2RlKHNlbGYudXNlcm5hbWUgKyAnOicgKyBzZWxmLnBhc3N3b3JkKQogICAgICAgIGNyZWRlbnRpYWxzID0gc3RhbmRhcmRfYjY0ZW5jb2RlKGNyZWRlbnRpYWxzKQogICAgICAgIGlmIHNpeC5QWTM6CiAgICAgICAgICAgIGNyZWRlbnRpYWxzID0gY3JlZGVudGlhbHMuZGVjb2RlKCdhc2NpaScpCiAgICAgICAgYXV0aCA9ICJCYXNpYyAiICsgY3JlZGVudGlhbHMKCiAgICAgICAgYm9keSwgY3QgPSBzZWxmLl9idWlsZF9tdWx0aXBhcnQoZGF0YSkKCiAgICAgICAgbXNnID0gIlN1Ym1pdHRpbmcgZG9jdW1lbnRhdGlvbiB0byAlcyIgJSAoc2VsZi5yZXBvc2l0b3J5KQogICAgICAgIHNlbGYuYW5ub3VuY2UobXNnLCBsb2cuSU5GTykKCiAgICAgICAgIyBidWlsZCB0aGUgUmVxdWVzdAogICAgICAgICMgV2UgY2FuJ3QgdXNlIHVybGxpYjIgc2luY2Ugd2UgbmVlZCB0byBzZW5kIHRoZSBCYXNpYwogICAgICAgICMgYXV0aCByaWdodCB3aXRoIHRoZSBmaXJzdCByZXF1ZXN0CiAgICAgICAgc2NoZW1hLCBuZXRsb2MsIHVybCwgcGFyYW1zLCBxdWVyeSwgZnJhZ21lbnRzID0gXAogICAgICAgICAgICB1cmxsaWIucGFyc2UudXJscGFyc2Uoc2VsZi5yZXBvc2l0b3J5KQogICAgICAgIGFzc2VydCBub3QgcGFyYW1zIGFuZCBub3QgcXVlcnkgYW5kIG5vdCBmcmFnbWVudHMKICAgICAgICBpZiBzY2hlbWEgPT0gJ2h0dHAnOgogICAgICAgICAgICBjb25uID0gaHR0cF9jbGllbnQuSFRUUENvbm5lY3Rpb24obmV0bG9jKQogICAgICAgIGVsaWYgc2NoZW1hID09ICdodHRwcyc6CiAgICAgICAgICAgIGNvbm4gPSBodHRwX2NsaWVudC5IVFRQU0Nvbm5lY3Rpb24obmV0bG9jKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCJ1bnN1cHBvcnRlZCBzY2hlbWEgIiArIHNjaGVtYSkKCiAgICAgICAgZGF0YSA9ICcnCiAgICAgICAgdHJ5OgogICAgICAgICAgICBjb25uLmNvbm5lY3QoKQogICAgICAgICAgICBjb25uLnB1dHJlcXVlc3QoIlBPU1QiLCB1cmwpCiAgICAgICAgICAgIGNvbnRlbnRfdHlwZSA9IGN0CiAgICAgICAgICAgIGNvbm4ucHV0aGVhZGVyKCdDb250ZW50LXR5cGUnLCBjb250ZW50X3R5cGUpCiAgICAgICAgICAgIGNvbm4ucHV0aGVhZGVyKCdDb250ZW50LWxlbmd0aCcsIHN0cihsZW4oYm9keSkpKQogICAgICAgICAgICBjb25uLnB1dGhlYWRlcignQXV0aG9yaXphdGlvbicsIGF1dGgpCiAgICAgICAgICAgIGNvbm4uZW5kaGVhZGVycygpCiAgICAgICAgICAgIGNvbm4uc2VuZChib2R5KQogICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3IgYXMgZToKICAgICAgICAgICAgc2VsZi5hbm5vdW5jZShzdHIoZSksIGxvZy5FUlJPUikKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIHIgPSBjb25uLmdldHJlc3BvbnNlKCkKICAgICAgICBpZiByLnN0YXR1cyA9PSAyMDA6CiAgICAgICAgICAgIG1zZyA9ICdTZXJ2ZXIgcmVzcG9uc2UgKCVzKTogJXMnICUgKHIuc3RhdHVzLCByLnJlYXNvbikKICAgICAgICAgICAgc2VsZi5hbm5vdW5jZShtc2csIGxvZy5JTkZPKQogICAgICAgIGVsaWYgci5zdGF0dXMgPT0gMzAxOgogICAgICAgICAgICBsb2NhdGlvbiA9IHIuZ2V0aGVhZGVyKCdMb2NhdGlvbicpCiAgICAgICAgICAgIGlmIGxvY2F0aW9uIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBsb2NhdGlvbiA9ICdodHRwczovL3B5dGhvbmhvc3RlZC5vcmcvJXMvJyAlIG1ldGEuZ2V0X25hbWUoKQogICAgICAgICAgICBtc2cgPSAnVXBsb2FkIHN1Y2Nlc3NmdWwuIFZpc2l0ICVzJyAlIGxvY2F0aW9uCiAgICAgICAgICAgIHNlbGYuYW5ub3VuY2UobXNnLCBsb2cuSU5GTykKICAgICAgICBlbHNlOgogICAgICAgICAgICBtc2cgPSAnVXBsb2FkIGZhaWxlZCAoJXMpOiAlcycgJSAoci5zdGF0dXMsIHIucmVhc29uKQogICAgICAgICAgICBzZWxmLmFubm91bmNlKG1zZywgbG9nLkVSUk9SKQogICAgICAgIGlmIHNlbGYuc2hvd19yZXNwb25zZToKICAgICAgICAgICAgcHJpbnQoJy0nICogNzUsIHIucmVhZCgpLCAnLScgKiA3NSkKUEsDBBQAAAAAAAAAIQBN79JTX1AAAF9QAAA5AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvY29uZmlnLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIHVuaWNvZGVfbGl0ZXJhbHMKaW1wb3J0IGlvCmltcG9ydCBvcwppbXBvcnQgc3lzCgppbXBvcnQgd2FybmluZ3MKaW1wb3J0IGZ1bmN0b29scwpmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBkZWZhdWx0ZGljdApmcm9tIGZ1bmN0b29scyBpbXBvcnQgcGFydGlhbApmcm9tIGZ1bmN0b29scyBpbXBvcnQgd3JhcHMKZnJvbSBpbXBvcnRsaWIgaW1wb3J0IGltcG9ydF9tb2R1bGUKCmZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzT3B0aW9uRXJyb3IsIERpc3R1dGlsc0ZpbGVFcnJvcgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuLnBhY2thZ2luZy52ZXJzaW9uIGltcG9ydCBMZWdhY3lWZXJzaW9uLCBwYXJzZQpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuLnBhY2thZ2luZy5zcGVjaWZpZXJzIGltcG9ydCBTcGVjaWZpZXJTZXQKZnJvbSBzZXR1cHRvb2xzLmV4dGVybi5zaXggaW1wb3J0IHN0cmluZ190eXBlcywgUFkzCgoKX19tZXRhY2xhc3NfXyA9IHR5cGUKCgpkZWYgcmVhZF9jb25maWd1cmF0aW9uKAogICAgICAgIGZpbGVwYXRoLCBmaW5kX290aGVycz1GYWxzZSwgaWdub3JlX29wdGlvbl9lcnJvcnM9RmFsc2UpOgogICAgIiIiUmVhZCBnaXZlbiBjb25maWd1cmF0aW9uIGZpbGUgYW5kIHJldHVybnMgb3B0aW9ucyBmcm9tIGl0IGFzIGEgZGljdC4KCiAgICA6cGFyYW0gc3RyfHVuaWNvZGUgZmlsZXBhdGg6IFBhdGggdG8gY29uZmlndXJhdGlvbiBmaWxlCiAgICAgICAgdG8gZ2V0IG9wdGlvbnMgZnJvbS4KCiAgICA6cGFyYW0gYm9vbCBmaW5kX290aGVyczogV2hldGhlciB0byBzZWFyY2ggZm9yIG90aGVyIGNvbmZpZ3VyYXRpb24gZmlsZXMKICAgICAgICB3aGljaCBjb3VsZCBiZSBvbiBpbiB2YXJpb3VzIHBsYWNlcy4KCiAgICA6cGFyYW0gYm9vbCBpZ25vcmVfb3B0aW9uX2Vycm9yczogV2hldGhlciB0byBzaWxlbnRseSBpZ25vcmUKICAgICAgICBvcHRpb25zLCB2YWx1ZXMgb2Ygd2hpY2ggY291bGQgbm90IGJlIHJlc29sdmVkIChlLmcuIGR1ZSB0byBleGNlcHRpb25zCiAgICAgICAgaW4gZGlyZWN0aXZlcyBzdWNoIGFzIGZpbGU6LCBhdHRyOiwgZXRjLikuCiAgICAgICAgSWYgRmFsc2UgZXhjZXB0aW9ucyBhcmUgcHJvcGFnYXRlZCBhcyBleHBlY3RlZC4KCiAgICA6cnR5cGU6IGRpY3QKICAgICIiIgogICAgZnJvbSBzZXR1cHRvb2xzLmRpc3QgaW1wb3J0IERpc3RyaWJ1dGlvbiwgX0Rpc3RyaWJ1dGlvbgoKICAgIGZpbGVwYXRoID0gb3MucGF0aC5hYnNwYXRoKGZpbGVwYXRoKQoKICAgIGlmIG5vdCBvcy5wYXRoLmlzZmlsZShmaWxlcGF0aCk6CiAgICAgICAgcmFpc2UgRGlzdHV0aWxzRmlsZUVycm9yKAogICAgICAgICAgICAnQ29uZmlndXJhdGlvbiBmaWxlICVzIGRvZXMgbm90IGV4aXN0LicgJSBmaWxlcGF0aCkKCiAgICBjdXJyZW50X2RpcmVjdG9yeSA9IG9zLmdldGN3ZCgpCiAgICBvcy5jaGRpcihvcy5wYXRoLmRpcm5hbWUoZmlsZXBhdGgpKQoKICAgIHRyeToKICAgICAgICBkaXN0ID0gRGlzdHJpYnV0aW9uKCkKCiAgICAgICAgZmlsZW5hbWVzID0gZGlzdC5maW5kX2NvbmZpZ19maWxlcygpIGlmIGZpbmRfb3RoZXJzIGVsc2UgW10KICAgICAgICBpZiBmaWxlcGF0aCBub3QgaW4gZmlsZW5hbWVzOgogICAgICAgICAgICBmaWxlbmFtZXMuYXBwZW5kKGZpbGVwYXRoKQoKICAgICAgICBfRGlzdHJpYnV0aW9uLnBhcnNlX2NvbmZpZ19maWxlcyhkaXN0LCBmaWxlbmFtZXM9ZmlsZW5hbWVzKQoKICAgICAgICBoYW5kbGVycyA9IHBhcnNlX2NvbmZpZ3VyYXRpb24oCiAgICAgICAgICAgIGRpc3QsIGRpc3QuY29tbWFuZF9vcHRpb25zLAogICAgICAgICAgICBpZ25vcmVfb3B0aW9uX2Vycm9ycz1pZ25vcmVfb3B0aW9uX2Vycm9ycykKCiAgICBmaW5hbGx5OgogICAgICAgIG9zLmNoZGlyKGN1cnJlbnRfZGlyZWN0b3J5KQoKICAgIHJldHVybiBjb25maWd1cmF0aW9uX3RvX2RpY3QoaGFuZGxlcnMpCgoKZGVmIF9nZXRfb3B0aW9uKHRhcmdldF9vYmosIGtleSk6CiAgICAiIiIKICAgIEdpdmVuIGEgdGFyZ2V0IG9iamVjdCBhbmQgb3B0aW9uIGtleSwgZ2V0IHRoYXQgb3B0aW9uIGZyb20KICAgIHRoZSB0YXJnZXQgb2JqZWN0LCBlaXRoZXIgdGhyb3VnaCBhIGdldF97a2V5fSBtZXRob2Qgb3IKICAgIGZyb20gYW4gYXR0cmlidXRlIGRpcmVjdGx5LgogICAgIiIiCiAgICBnZXR0ZXJfbmFtZSA9ICdnZXRfe2tleX0nLmZvcm1hdCgqKmxvY2FscygpKQogICAgYnlfYXR0cmlidXRlID0gZnVuY3Rvb2xzLnBhcnRpYWwoZ2V0YXR0ciwgdGFyZ2V0X29iaiwga2V5KQogICAgZ2V0dGVyID0gZ2V0YXR0cih0YXJnZXRfb2JqLCBnZXR0ZXJfbmFtZSwgYnlfYXR0cmlidXRlKQogICAgcmV0dXJuIGdldHRlcigpCgoKZGVmIGNvbmZpZ3VyYXRpb25fdG9fZGljdChoYW5kbGVycyk6CiAgICAiIiJSZXR1cm5zIGNvbmZpZ3VyYXRpb24gZGF0YSBnYXRoZXJlZCBieSBnaXZlbiBoYW5kbGVycyBhcyBhIGRpY3QuCgogICAgOnBhcmFtIGxpc3RbQ29uZmlnSGFuZGxlcl0gaGFuZGxlcnM6IEhhbmRsZXJzIGxpc3QsCiAgICAgICAgdXN1YWxseSBmcm9tIHBhcnNlX2NvbmZpZ3VyYXRpb24oKQoKICAgIDpydHlwZTogZGljdAogICAgIiIiCiAgICBjb25maWdfZGljdCA9IGRlZmF1bHRkaWN0KGRpY3QpCgogICAgZm9yIGhhbmRsZXIgaW4gaGFuZGxlcnM6CiAgICAgICAgZm9yIG9wdGlvbiBpbiBoYW5kbGVyLnNldF9vcHRpb25zOgogICAgICAgICAgICB2YWx1ZSA9IF9nZXRfb3B0aW9uKGhhbmRsZXIudGFyZ2V0X29iaiwgb3B0aW9uKQogICAgICAgICAgICBjb25maWdfZGljdFtoYW5kbGVyLnNlY3Rpb25fcHJlZml4XVtvcHRpb25dID0gdmFsdWUKCiAgICByZXR1cm4gY29uZmlnX2RpY3QKCgpkZWYgcGFyc2VfY29uZmlndXJhdGlvbigKICAgICAgICBkaXN0cmlidXRpb24sIGNvbW1hbmRfb3B0aW9ucywgaWdub3JlX29wdGlvbl9lcnJvcnM9RmFsc2UpOgogICAgIiIiUGVyZm9ybXMgYWRkaXRpb25hbCBwYXJzaW5nIG9mIGNvbmZpZ3VyYXRpb24gb3B0aW9ucwogICAgZm9yIGEgZGlzdHJpYnV0aW9uLgoKICAgIFJldHVybnMgYSBsaXN0IG9mIHVzZWQgb3B0aW9uIGhhbmRsZXJzLgoKICAgIDpwYXJhbSBEaXN0cmlidXRpb24gZGlzdHJpYnV0aW9uOgogICAgOnBhcmFtIGRpY3QgY29tbWFuZF9vcHRpb25zOgogICAgOnBhcmFtIGJvb2wgaWdub3JlX29wdGlvbl9lcnJvcnM6IFdoZXRoZXIgdG8gc2lsZW50bHkgaWdub3JlCiAgICAgICAgb3B0aW9ucywgdmFsdWVzIG9mIHdoaWNoIGNvdWxkIG5vdCBiZSByZXNvbHZlZCAoZS5nLiBkdWUgdG8gZXhjZXB0aW9ucwogICAgICAgIGluIGRpcmVjdGl2ZXMgc3VjaCBhcyBmaWxlOiwgYXR0cjosIGV0Yy4pLgogICAgICAgIElmIEZhbHNlIGV4Y2VwdGlvbnMgYXJlIHByb3BhZ2F0ZWQgYXMgZXhwZWN0ZWQuCiAgICA6cnR5cGU6IGxpc3QKICAgICIiIgogICAgb3B0aW9ucyA9IENvbmZpZ09wdGlvbnNIYW5kbGVyKAogICAgICAgIGRpc3RyaWJ1dGlvbiwgY29tbWFuZF9vcHRpb25zLCBpZ25vcmVfb3B0aW9uX2Vycm9ycykKICAgIG9wdGlvbnMucGFyc2UoKQoKICAgIG1ldGEgPSBDb25maWdNZXRhZGF0YUhhbmRsZXIoCiAgICAgICAgZGlzdHJpYnV0aW9uLm1ldGFkYXRhLCBjb21tYW5kX29wdGlvbnMsIGlnbm9yZV9vcHRpb25fZXJyb3JzLAogICAgICAgIGRpc3RyaWJ1dGlvbi5wYWNrYWdlX2RpcikKICAgIG1ldGEucGFyc2UoKQoKICAgIHJldHVybiBtZXRhLCBvcHRpb25zCgoKY2xhc3MgQ29uZmlnSGFuZGxlcjoKICAgICIiIkhhbmRsZXMgbWV0YWRhdGEgc3VwcGxpZWQgaW4gY29uZmlndXJhdGlvbiBmaWxlcy4iIiIKCiAgICBzZWN0aW9uX3ByZWZpeCA9IE5vbmUKICAgICIiIlByZWZpeCBmb3IgY29uZmlnIHNlY3Rpb25zIGhhbmRsZWQgYnkgdGhpcyBoYW5kbGVyLgogICAgTXVzdCBiZSBwcm92aWRlZCBieSBjbGFzcyBoZWlycy4KCiAgICAiIiIKCiAgICBhbGlhc2VzID0ge30KICAgICIiIk9wdGlvbnMgYWxpYXNlcy4KICAgIEZvciBjb21wYXRpYmlsaXR5IHdpdGggdmFyaW91cyBwYWNrYWdlcy4gRS5nLjogZDJ0bzEgYW5kIHBici4KICAgIE5vdGU6IGAtYCBpbiBrZXlzIGlzIHJlcGxhY2VkIHdpdGggYF9gIGJ5IGNvbmZpZyBwYXJzZXIuCgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHRhcmdldF9vYmosIG9wdGlvbnMsIGlnbm9yZV9vcHRpb25fZXJyb3JzPUZhbHNlKToKICAgICAgICBzZWN0aW9ucyA9IHt9CgogICAgICAgIHNlY3Rpb25fcHJlZml4ID0gc2VsZi5zZWN0aW9uX3ByZWZpeAogICAgICAgIGZvciBzZWN0aW9uX25hbWUsIHNlY3Rpb25fb3B0aW9ucyBpbiBvcHRpb25zLml0ZW1zKCk6CiAgICAgICAgICAgIGlmIG5vdCBzZWN0aW9uX25hbWUuc3RhcnRzd2l0aChzZWN0aW9uX3ByZWZpeCk6CiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgc2VjdGlvbl9uYW1lID0gc2VjdGlvbl9uYW1lLnJlcGxhY2Uoc2VjdGlvbl9wcmVmaXgsICcnKS5zdHJpcCgnLicpCiAgICAgICAgICAgIHNlY3Rpb25zW3NlY3Rpb25fbmFtZV0gPSBzZWN0aW9uX29wdGlvbnMKCiAgICAgICAgc2VsZi5pZ25vcmVfb3B0aW9uX2Vycm9ycyA9IGlnbm9yZV9vcHRpb25fZXJyb3JzCiAgICAgICAgc2VsZi50YXJnZXRfb2JqID0gdGFyZ2V0X29iagogICAgICAgIHNlbGYuc2VjdGlvbnMgPSBzZWN0aW9ucwogICAgICAgIHNlbGYuc2V0X29wdGlvbnMgPSBbXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHBhcnNlcnMoc2VsZik6CiAgICAgICAgIiIiTWV0YWRhdGEgaXRlbSBuYW1lIHRvIHBhcnNlciBmdW5jdGlvbiBtYXBwaW5nLiIiIgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoCiAgICAgICAgICAgICclcyBtdXN0IHByb3ZpZGUgLnBhcnNlcnMgcHJvcGVydHknICUgc2VsZi5fX2NsYXNzX18uX19uYW1lX18pCgogICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIG9wdGlvbl9uYW1lLCB2YWx1ZSk6CiAgICAgICAgdW5rbm93biA9IHR1cGxlKCkKICAgICAgICB0YXJnZXRfb2JqID0gc2VsZi50YXJnZXRfb2JqCgogICAgICAgICMgVHJhbnNsYXRlIGFsaWFzIGludG8gcmVhbCBuYW1lLgogICAgICAgIG9wdGlvbl9uYW1lID0gc2VsZi5hbGlhc2VzLmdldChvcHRpb25fbmFtZSwgb3B0aW9uX25hbWUpCgogICAgICAgIGN1cnJlbnRfdmFsdWUgPSBnZXRhdHRyKHRhcmdldF9vYmosIG9wdGlvbl9uYW1lLCB1bmtub3duKQoKICAgICAgICBpZiBjdXJyZW50X3ZhbHVlIGlzIHVua25vd246CiAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKG9wdGlvbl9uYW1lKQoKICAgICAgICBpZiBjdXJyZW50X3ZhbHVlOgogICAgICAgICAgICAjIEFscmVhZHkgaW5oYWJpdGVkLiBTa2lwcGluZy4KICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIHNraXBfb3B0aW9uID0gRmFsc2UKICAgICAgICBwYXJzZXIgPSBzZWxmLnBhcnNlcnMuZ2V0KG9wdGlvbl9uYW1lKQogICAgICAgIGlmIHBhcnNlcjoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgdmFsdWUgPSBwYXJzZXIodmFsdWUpCgogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgc2tpcF9vcHRpb24gPSBUcnVlCiAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5pZ25vcmVfb3B0aW9uX2Vycm9yczoKICAgICAgICAgICAgICAgICAgICByYWlzZQoKICAgICAgICBpZiBza2lwX29wdGlvbjoKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIHNldHRlciA9IGdldGF0dHIodGFyZ2V0X29iaiwgJ3NldF8lcycgJSBvcHRpb25fbmFtZSwgTm9uZSkKICAgICAgICBpZiBzZXR0ZXIgaXMgTm9uZToKICAgICAgICAgICAgc2V0YXR0cih0YXJnZXRfb2JqLCBvcHRpb25fbmFtZSwgdmFsdWUpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2V0dGVyKHZhbHVlKQoKICAgICAgICBzZWxmLnNldF9vcHRpb25zLmFwcGVuZChvcHRpb25fbmFtZSkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfcGFyc2VfbGlzdChjbHMsIHZhbHVlLCBzZXBhcmF0b3I9JywnKToKICAgICAgICAiIiJSZXByZXNlbnRzIHZhbHVlIGFzIGEgbGlzdC4KCiAgICAgICAgVmFsdWUgaXMgc3BsaXQgZWl0aGVyIGJ5IHNlcGFyYXRvciAoZGVmYXVsdHMgdG8gY29tbWEpIG9yIGJ5IGxpbmVzLgoKICAgICAgICA6cGFyYW0gdmFsdWU6CiAgICAgICAgOnBhcmFtIHNlcGFyYXRvcjogTGlzdCBpdGVtcyBzZXBhcmF0b3IgY2hhcmFjdGVyLgogICAgICAgIDpydHlwZTogbGlzdAogICAgICAgICIiIgogICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIGxpc3QpOiAgIyBfZ2V0X3BhcnNlcl9jb21wb3VuZCBjYXNlCiAgICAgICAgICAgIHJldHVybiB2YWx1ZQoKICAgICAgICBpZiAnXG4nIGluIHZhbHVlOgogICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnNwbGl0bGluZXMoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuc3BsaXQoc2VwYXJhdG9yKQoKICAgICAgICByZXR1cm4gW2NodW5rLnN0cmlwKCkgZm9yIGNodW5rIGluIHZhbHVlIGlmIGNodW5rLnN0cmlwKCldCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX3BhcnNlX2RpY3QoY2xzLCB2YWx1ZSk6CiAgICAgICAgIiIiUmVwcmVzZW50cyB2YWx1ZSBhcyBhIGRpY3QuCgogICAgICAgIDpwYXJhbSB2YWx1ZToKICAgICAgICA6cnR5cGU6IGRpY3QKICAgICAgICAiIiIKICAgICAgICBzZXBhcmF0b3IgPSAnPScKICAgICAgICByZXN1bHQgPSB7fQogICAgICAgIGZvciBsaW5lIGluIGNscy5fcGFyc2VfbGlzdCh2YWx1ZSk6CiAgICAgICAgICAgIGtleSwgc2VwLCB2YWwgPSBsaW5lLnBhcnRpdGlvbihzZXBhcmF0b3IpCiAgICAgICAgICAgIGlmIHNlcCAhPSBzZXBhcmF0b3I6CiAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcigKICAgICAgICAgICAgICAgICAgICAnVW5hYmxlIHRvIHBhcnNlIG9wdGlvbiB2YWx1ZSB0byBkaWN0OiAlcycgJSB2YWx1ZSkKICAgICAgICAgICAgcmVzdWx0W2tleS5zdHJpcCgpXSA9IHZhbC5zdHJpcCgpCgogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfcGFyc2VfYm9vbChjbHMsIHZhbHVlKToKICAgICAgICAiIiJSZXByZXNlbnRzIHZhbHVlIGFzIGJvb2xlYW4uCgogICAgICAgIDpwYXJhbSB2YWx1ZToKICAgICAgICA6cnR5cGU6IGJvb2wKICAgICAgICAiIiIKICAgICAgICB2YWx1ZSA9IHZhbHVlLmxvd2VyKCkKICAgICAgICByZXR1cm4gdmFsdWUgaW4gKCcxJywgJ3RydWUnLCAneWVzJykKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfZXhjbHVkZV9maWxlc19wYXJzZXIoY2xzLCBrZXkpOgogICAgICAgICIiIlJldHVybnMgYSBwYXJzZXIgZnVuY3Rpb24gdG8gbWFrZSBzdXJlIGZpZWxkIGlucHV0cwogICAgICAgIGFyZSBub3QgZmlsZXMuCgogICAgICAgIFBhcnNlcyBhIHZhbHVlIGFmdGVyIGdldHRpbmcgdGhlIGtleSBzbyBlcnJvciBtZXNzYWdlcyBhcmUKICAgICAgICBtb3JlIGluZm9ybWF0aXZlLgoKICAgICAgICA6cGFyYW0ga2V5OgogICAgICAgIDpydHlwZTogY2FsbGFibGUKICAgICAgICAiIiIKICAgICAgICBkZWYgcGFyc2VyKHZhbHVlKToKICAgICAgICAgICAgZXhjbHVkZV9kaXJlY3RpdmUgPSAnZmlsZTonCiAgICAgICAgICAgIGlmIHZhbHVlLnN0YXJ0c3dpdGgoZXhjbHVkZV9kaXJlY3RpdmUpOgogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKICAgICAgICAgICAgICAgICAgICAnT25seSBzdHJpbmdzIGFyZSBhY2NlcHRlZCBmb3IgdGhlIHswfSBmaWVsZCwgJwogICAgICAgICAgICAgICAgICAgICdmaWxlcyBhcmUgbm90IGFjY2VwdGVkJy5mb3JtYXQoa2V5KSkKICAgICAgICAgICAgcmV0dXJuIHZhbHVlCiAgICAgICAgcmV0dXJuIHBhcnNlcgoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9wYXJzZV9maWxlKGNscywgdmFsdWUpOgogICAgICAgICIiIlJlcHJlc2VudHMgdmFsdWUgYXMgYSBzdHJpbmcsIGFsbG93aW5nIGluY2x1ZGluZyB0ZXh0CiAgICAgICAgZnJvbSBuZWFyZXN0IGZpbGVzIHVzaW5nIGBmaWxlOmAgZGlyZWN0aXZlLgoKICAgICAgICBEaXJlY3RpdmUgaXMgc2FuZGJveGVkIGFuZCB3b24ndCByZWFjaCBhbnl0aGluZyBvdXRzaWRlCiAgICAgICAgZGlyZWN0b3J5IHdpdGggc2V0dXAucHkuCgogICAgICAgIEV4YW1wbGVzOgogICAgICAgICAgICBmaWxlOiBSRUFETUUucnN0LCBDSEFOR0VMT0cubWQsIHNyYy9maWxlLnR4dAoKICAgICAgICA6cGFyYW0gc3RyIHZhbHVlOgogICAgICAgIDpydHlwZTogc3RyCiAgICAgICAgIiIiCiAgICAgICAgaW5jbHVkZV9kaXJlY3RpdmUgPSAnZmlsZTonCgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHZhbHVlLCBzdHJpbmdfdHlwZXMpOgogICAgICAgICAgICByZXR1cm4gdmFsdWUKCiAgICAgICAgaWYgbm90IHZhbHVlLnN0YXJ0c3dpdGgoaW5jbHVkZV9kaXJlY3RpdmUpOgogICAgICAgICAgICByZXR1cm4gdmFsdWUKCiAgICAgICAgc3BlYyA9IHZhbHVlW2xlbihpbmNsdWRlX2RpcmVjdGl2ZSk6XQogICAgICAgIGZpbGVwYXRocyA9IChvcy5wYXRoLmFic3BhdGgocGF0aC5zdHJpcCgpKSBmb3IgcGF0aCBpbiBzcGVjLnNwbGl0KCcsJykpCiAgICAgICAgcmV0dXJuICdcbicuam9pbigKICAgICAgICAgICAgY2xzLl9yZWFkX2ZpbGUocGF0aCkKICAgICAgICAgICAgZm9yIHBhdGggaW4gZmlsZXBhdGhzCiAgICAgICAgICAgIGlmIChjbHMuX2Fzc2VydF9sb2NhbChwYXRoKSBvciBUcnVlKQogICAgICAgICAgICBhbmQgb3MucGF0aC5pc2ZpbGUocGF0aCkKICAgICAgICApCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9hc3NlcnRfbG9jYWwoZmlsZXBhdGgpOgogICAgICAgIGlmIG5vdCBmaWxlcGF0aC5zdGFydHN3aXRoKG9zLmdldGN3ZCgpKToKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAnYGZpbGU6YCBkaXJlY3RpdmUgY2FuIG5vdCBhY2Nlc3MgJXMnICUgZmlsZXBhdGgpCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9yZWFkX2ZpbGUoZmlsZXBhdGgpOgogICAgICAgIHdpdGggaW8ub3BlbihmaWxlcGF0aCwgZW5jb2Rpbmc9J3V0Zi04JykgYXMgZjoKICAgICAgICAgICAgcmV0dXJuIGYucmVhZCgpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX3BhcnNlX2F0dHIoY2xzLCB2YWx1ZSwgcGFja2FnZV9kaXI9Tm9uZSk6CiAgICAgICAgIiIiUmVwcmVzZW50cyB2YWx1ZSBhcyBhIG1vZHVsZSBhdHRyaWJ1dGUuCgogICAgICAgIEV4YW1wbGVzOgogICAgICAgICAgICBhdHRyOiBwYWNrYWdlLmF0dHIKICAgICAgICAgICAgYXR0cjogcGFja2FnZS5tb2R1bGUuYXR0cgoKICAgICAgICA6cGFyYW0gc3RyIHZhbHVlOgogICAgICAgIDpydHlwZTogc3RyCiAgICAgICAgIiIiCiAgICAgICAgYXR0cl9kaXJlY3RpdmUgPSAnYXR0cjonCiAgICAgICAgaWYgbm90IHZhbHVlLnN0YXJ0c3dpdGgoYXR0cl9kaXJlY3RpdmUpOgogICAgICAgICAgICByZXR1cm4gdmFsdWUKCiAgICAgICAgYXR0cnNfcGF0aCA9IHZhbHVlLnJlcGxhY2UoYXR0cl9kaXJlY3RpdmUsICcnKS5zdHJpcCgpLnNwbGl0KCcuJykKICAgICAgICBhdHRyX25hbWUgPSBhdHRyc19wYXRoLnBvcCgpCgogICAgICAgIG1vZHVsZV9uYW1lID0gJy4nLmpvaW4oYXR0cnNfcGF0aCkKICAgICAgICBtb2R1bGVfbmFtZSA9IG1vZHVsZV9uYW1lIG9yICdfX2luaXRfXycKCiAgICAgICAgcGFyZW50X3BhdGggPSBvcy5nZXRjd2QoKQogICAgICAgIGlmIHBhY2thZ2VfZGlyOgogICAgICAgICAgICBpZiBhdHRyc19wYXRoWzBdIGluIHBhY2thZ2VfZGlyOgogICAgICAgICAgICAgICAgIyBBIGN1c3RvbSBwYXRoIHdhcyBzcGVjaWZpZWQgZm9yIHRoZSBtb2R1bGUgd2Ugd2FudCB0byBpbXBvcnQKICAgICAgICAgICAgICAgIGN1c3RvbV9wYXRoID0gcGFja2FnZV9kaXJbYXR0cnNfcGF0aFswXV0KICAgICAgICAgICAgICAgIHBhcnRzID0gY3VzdG9tX3BhdGgucnNwbGl0KCcvJywgMSkKICAgICAgICAgICAgICAgIGlmIGxlbihwYXJ0cykgPiAxOgogICAgICAgICAgICAgICAgICAgIHBhcmVudF9wYXRoID0gb3MucGF0aC5qb2luKG9zLmdldGN3ZCgpLCBwYXJ0c1swXSkKICAgICAgICAgICAgICAgICAgICBtb2R1bGVfbmFtZSA9IHBhcnRzWzFdCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIG1vZHVsZV9uYW1lID0gY3VzdG9tX3BhdGgKICAgICAgICAgICAgZWxpZiAnJyBpbiBwYWNrYWdlX2RpcjoKICAgICAgICAgICAgICAgICMgQSBjdXN0b20gcGFyZW50IGRpcmVjdG9yeSB3YXMgc3BlY2lmaWVkIGZvciBhbGwgcm9vdCBtb2R1bGVzCiAgICAgICAgICAgICAgICBwYXJlbnRfcGF0aCA9IG9zLnBhdGguam9pbihvcy5nZXRjd2QoKSwgcGFja2FnZV9kaXJbJyddKQogICAgICAgIHN5cy5wYXRoLmluc2VydCgwLCBwYXJlbnRfcGF0aCkKICAgICAgICB0cnk6CiAgICAgICAgICAgIG1vZHVsZSA9IGltcG9ydF9tb2R1bGUobW9kdWxlX25hbWUpCiAgICAgICAgICAgIHZhbHVlID0gZ2V0YXR0cihtb2R1bGUsIGF0dHJfbmFtZSkKCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgc3lzLnBhdGggPSBzeXMucGF0aFsxOl0KCiAgICAgICAgcmV0dXJuIHZhbHVlCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX2dldF9wYXJzZXJfY29tcG91bmQoY2xzLCAqcGFyc2VfbWV0aG9kcyk6CiAgICAgICAgIiIiUmV0dXJucyBwYXJzZXIgZnVuY3Rpb24gdG8gcmVwcmVzZW50cyB2YWx1ZSBhcyBhIGxpc3QuCgogICAgICAgIFBhcnNlcyBhIHZhbHVlIGFwcGx5aW5nIGdpdmVuIG1ldGhvZHMgb25lIGFmdGVyIGFub3RoZXIuCgogICAgICAgIDpwYXJhbSBwYXJzZV9tZXRob2RzOgogICAgICAgIDpydHlwZTogY2FsbGFibGUKICAgICAgICAiIiIKICAgICAgICBkZWYgcGFyc2UodmFsdWUpOgogICAgICAgICAgICBwYXJzZWQgPSB2YWx1ZQoKICAgICAgICAgICAgZm9yIG1ldGhvZCBpbiBwYXJzZV9tZXRob2RzOgogICAgICAgICAgICAgICAgcGFyc2VkID0gbWV0aG9kKHBhcnNlZCkKCiAgICAgICAgICAgIHJldHVybiBwYXJzZWQKCiAgICAgICAgcmV0dXJuIHBhcnNlCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX3BhcnNlX3NlY3Rpb25fdG9fZGljdChjbHMsIHNlY3Rpb25fb3B0aW9ucywgdmFsdWVzX3BhcnNlcj1Ob25lKToKICAgICAgICAiIiJQYXJzZXMgc2VjdGlvbiBvcHRpb25zIGludG8gYSBkaWN0aW9uYXJ5LgoKICAgICAgICBPcHRpb25hbGx5IGFwcGxpZXMgYSBnaXZlbiBwYXJzZXIgdG8gdmFsdWVzLgoKICAgICAgICA6cGFyYW0gZGljdCBzZWN0aW9uX29wdGlvbnM6CiAgICAgICAgOnBhcmFtIGNhbGxhYmxlIHZhbHVlc19wYXJzZXI6CiAgICAgICAgOnJ0eXBlOiBkaWN0CiAgICAgICAgIiIiCiAgICAgICAgdmFsdWUgPSB7fQogICAgICAgIHZhbHVlc19wYXJzZXIgPSB2YWx1ZXNfcGFyc2VyIG9yIChsYW1iZGEgdmFsOiB2YWwpCiAgICAgICAgZm9yIGtleSwgKF8sIHZhbCkgaW4gc2VjdGlvbl9vcHRpb25zLml0ZW1zKCk6CiAgICAgICAgICAgIHZhbHVlW2tleV0gPSB2YWx1ZXNfcGFyc2VyKHZhbCkKICAgICAgICByZXR1cm4gdmFsdWUKCiAgICBkZWYgcGFyc2Vfc2VjdGlvbihzZWxmLCBzZWN0aW9uX29wdGlvbnMpOgogICAgICAgICIiIlBhcnNlcyBjb25maWd1cmF0aW9uIGZpbGUgc2VjdGlvbi4KCiAgICAgICAgOnBhcmFtIGRpY3Qgc2VjdGlvbl9vcHRpb25zOgogICAgICAgICIiIgogICAgICAgIGZvciAobmFtZSwgKF8sIHZhbHVlKSkgaW4gc2VjdGlvbl9vcHRpb25zLml0ZW1zKCk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHNlbGZbbmFtZV0gPSB2YWx1ZQoKICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICAgICAgcGFzcyAgIyBLZWVwIHNpbGVudCBmb3IgYSBuZXcgb3B0aW9uIG1heSBhcHBlYXIgYW55dGltZS4KCiAgICBkZWYgcGFyc2Uoc2VsZik6CiAgICAgICAgIiIiUGFyc2VzIGNvbmZpZ3VyYXRpb24gZmlsZSBpdGVtcyBmcm9tIG9uZQogICAgICAgIG9yIG1vcmUgcmVsYXRlZCBzZWN0aW9ucy4KCiAgICAgICAgIiIiCiAgICAgICAgZm9yIHNlY3Rpb25fbmFtZSwgc2VjdGlvbl9vcHRpb25zIGluIHNlbGYuc2VjdGlvbnMuaXRlbXMoKToKCiAgICAgICAgICAgIG1ldGhvZF9wb3N0Zml4ID0gJycKICAgICAgICAgICAgaWYgc2VjdGlvbl9uYW1lOiAgIyBbc2VjdGlvbi5vcHRpb25dIHZhcmlhbnQKICAgICAgICAgICAgICAgIG1ldGhvZF9wb3N0Zml4ID0gJ18lcycgJSBzZWN0aW9uX25hbWUKCiAgICAgICAgICAgIHNlY3Rpb25fcGFyc2VyX21ldGhvZCA9IGdldGF0dHIoCiAgICAgICAgICAgICAgICBzZWxmLAogICAgICAgICAgICAgICAgIyBEb3RzIGluIHNlY3Rpb24gbmFtZXMgYXJlIHRyYW5zbGF0ZWQgaW50byBkdW5kZXJzY29yZXMuCiAgICAgICAgICAgICAgICAoJ3BhcnNlX3NlY3Rpb24lcycgJSBtZXRob2RfcG9zdGZpeCkucmVwbGFjZSgnLicsICdfXycpLAogICAgICAgICAgICAgICAgTm9uZSkKCiAgICAgICAgICAgIGlmIHNlY3Rpb25fcGFyc2VyX21ldGhvZCBpcyBOb25lOgogICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgJ1Vuc3VwcG9ydGVkIGRpc3RyaWJ1dGlvbiBvcHRpb24gc2VjdGlvbjogWyVzLiVzXScgJSAoCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2VjdGlvbl9wcmVmaXgsIHNlY3Rpb25fbmFtZSkpCgogICAgICAgICAgICBzZWN0aW9uX3BhcnNlcl9tZXRob2Qoc2VjdGlvbl9vcHRpb25zKQoKICAgIGRlZiBfZGVwcmVjYXRlZF9jb25maWdfaGFuZGxlcihzZWxmLCBmdW5jLCBtc2csIHdhcm5pbmdfY2xhc3MpOgogICAgICAgICIiIiB0aGlzIGZ1bmN0aW9uIHdpbGwgd3JhcCBhcm91bmQgcGFyYW1ldGVycyB0aGF0IGFyZSBkZXByZWNhdGVkCgogICAgICAgIDpwYXJhbSBtc2c6IGRlcHJlY2F0aW9uIG1lc3NhZ2UKICAgICAgICA6cGFyYW0gd2FybmluZ19jbGFzczogY2xhc3Mgb2Ygd2FybmluZyBleGNlcHRpb24gdG8gYmUgcmFpc2VkCiAgICAgICAgOnBhcmFtIGZ1bmM6IGZ1bmN0aW9uIHRvIGJlIHdyYXBwZWQgYXJvdW5kCiAgICAgICAgIiIiCiAgICAgICAgQHdyYXBzKGZ1bmMpCiAgICAgICAgZGVmIGNvbmZpZ19oYW5kbGVyKCphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4obXNnLCB3YXJuaW5nX2NsYXNzKQogICAgICAgICAgICByZXR1cm4gZnVuYygqYXJncywgKiprd2FyZ3MpCgogICAgICAgIHJldHVybiBjb25maWdfaGFuZGxlcgoKCmNsYXNzIENvbmZpZ01ldGFkYXRhSGFuZGxlcihDb25maWdIYW5kbGVyKToKCiAgICBzZWN0aW9uX3ByZWZpeCA9ICdtZXRhZGF0YScKCiAgICBhbGlhc2VzID0gewogICAgICAgICdob21lX3BhZ2UnOiAndXJsJywKICAgICAgICAnc3VtbWFyeSc6ICdkZXNjcmlwdGlvbicsCiAgICAgICAgJ2NsYXNzaWZpZXInOiAnY2xhc3NpZmllcnMnLAogICAgICAgICdwbGF0Zm9ybSc6ICdwbGF0Zm9ybXMnLAogICAgfQoKICAgIHN0cmljdF9tb2RlID0gRmFsc2UKICAgICIiIldlIG5lZWQgdG8ga2VlcCBpdCBsb29zZSwgdG8gYmUgcGFydGlhbGx5IGNvbXBhdGlibGUgd2l0aAogICAgYHBicmAgYW5kIGBkMnRvMWAgcGFja2FnZXMgd2hpY2ggYWxzbyB1c2VzIGBtZXRhZGF0YWAgc2VjdGlvbi4KCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgdGFyZ2V0X29iaiwgb3B0aW9ucywgaWdub3JlX29wdGlvbl9lcnJvcnM9RmFsc2UsCiAgICAgICAgICAgICAgICAgcGFja2FnZV9kaXI9Tm9uZSk6CiAgICAgICAgc3VwZXIoQ29uZmlnTWV0YWRhdGFIYW5kbGVyLCBzZWxmKS5fX2luaXRfXyh0YXJnZXRfb2JqLCBvcHRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlX29wdGlvbl9lcnJvcnMpCiAgICAgICAgc2VsZi5wYWNrYWdlX2RpciA9IHBhY2thZ2VfZGlyCgogICAgQHByb3BlcnR5CiAgICBkZWYgcGFyc2VycyhzZWxmKToKICAgICAgICAiIiJNZXRhZGF0YSBpdGVtIG5hbWUgdG8gcGFyc2VyIGZ1bmN0aW9uIG1hcHBpbmcuIiIiCiAgICAgICAgcGFyc2VfbGlzdCA9IHNlbGYuX3BhcnNlX2xpc3QKICAgICAgICBwYXJzZV9maWxlID0gc2VsZi5fcGFyc2VfZmlsZQogICAgICAgIHBhcnNlX2RpY3QgPSBzZWxmLl9wYXJzZV9kaWN0CiAgICAgICAgZXhjbHVkZV9maWxlc19wYXJzZXIgPSBzZWxmLl9leGNsdWRlX2ZpbGVzX3BhcnNlcgoKICAgICAgICByZXR1cm4gewogICAgICAgICAgICAncGxhdGZvcm1zJzogcGFyc2VfbGlzdCwKICAgICAgICAgICAgJ2tleXdvcmRzJzogcGFyc2VfbGlzdCwKICAgICAgICAgICAgJ3Byb3ZpZGVzJzogcGFyc2VfbGlzdCwKICAgICAgICAgICAgJ3JlcXVpcmVzJzogc2VsZi5fZGVwcmVjYXRlZF9jb25maWdfaGFuZGxlcigKICAgICAgICAgICAgICAgIHBhcnNlX2xpc3QsCiAgICAgICAgICAgICAgICAiVGhlIHJlcXVpcmVzIHBhcmFtZXRlciBpcyBkZXByZWNhdGVkLCBwbGVhc2UgdXNlICIKICAgICAgICAgICAgICAgICJpbnN0YWxsX3JlcXVpcmVzIGZvciBydW50aW1lIGRlcGVuZGVuY2llcy4iLAogICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nKSwKICAgICAgICAgICAgJ29ic29sZXRlcyc6IHBhcnNlX2xpc3QsCiAgICAgICAgICAgICdjbGFzc2lmaWVycyc6IHNlbGYuX2dldF9wYXJzZXJfY29tcG91bmQocGFyc2VfZmlsZSwgcGFyc2VfbGlzdCksCiAgICAgICAgICAgICdsaWNlbnNlJzogZXhjbHVkZV9maWxlc19wYXJzZXIoJ2xpY2Vuc2UnKSwKICAgICAgICAgICAgJ2xpY2Vuc2VfZmlsZXMnOiBwYXJzZV9saXN0LAogICAgICAgICAgICAnZGVzY3JpcHRpb24nOiBwYXJzZV9maWxlLAogICAgICAgICAgICAnbG9uZ19kZXNjcmlwdGlvbic6IHBhcnNlX2ZpbGUsCiAgICAgICAgICAgICd2ZXJzaW9uJzogc2VsZi5fcGFyc2VfdmVyc2lvbiwKICAgICAgICAgICAgJ3Byb2plY3RfdXJscyc6IHBhcnNlX2RpY3QsCiAgICAgICAgfQoKICAgIGRlZiBfcGFyc2VfdmVyc2lvbihzZWxmLCB2YWx1ZSk6CiAgICAgICAgIiIiUGFyc2VzIGB2ZXJzaW9uYCBvcHRpb24gdmFsdWUuCgogICAgICAgIDpwYXJhbSB2YWx1ZToKICAgICAgICA6cnR5cGU6IHN0cgoKICAgICAgICAiIiIKICAgICAgICB2ZXJzaW9uID0gc2VsZi5fcGFyc2VfZmlsZSh2YWx1ZSkKCiAgICAgICAgaWYgdmVyc2lvbiAhPSB2YWx1ZToKICAgICAgICAgICAgdmVyc2lvbiA9IHZlcnNpb24uc3RyaXAoKQogICAgICAgICAgICAjIEJlIHN0cmljdCBhYm91dCB2ZXJzaW9ucyBsb2FkZWQgZnJvbSBmaWxlIGJlY2F1c2UgaXQncyBlYXN5IHRvCiAgICAgICAgICAgICMgYWNjaWRlbnRhbGx5IGluY2x1ZGUgbmV3bGluZXMgYW5kIG90aGVyIHVuaW50ZW5kZWQgY29udGVudAogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHBhcnNlKHZlcnNpb24pLCBMZWdhY3lWZXJzaW9uKToKICAgICAgICAgICAgICAgIHRtcGwgPSAoCiAgICAgICAgICAgICAgICAgICAgJ1ZlcnNpb24gbG9hZGVkIGZyb20ge3ZhbHVlfSBkb2VzIG5vdCAnCiAgICAgICAgICAgICAgICAgICAgJ2NvbXBseSB3aXRoIFBFUCA0NDA6IHt2ZXJzaW9ufScKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKHRtcGwuZm9ybWF0KCoqbG9jYWxzKCkpKQoKICAgICAgICAgICAgcmV0dXJuIHZlcnNpb24KCiAgICAgICAgdmVyc2lvbiA9IHNlbGYuX3BhcnNlX2F0dHIodmFsdWUsIHNlbGYucGFja2FnZV9kaXIpCgogICAgICAgIGlmIGNhbGxhYmxlKHZlcnNpb24pOgogICAgICAgICAgICB2ZXJzaW9uID0gdmVyc2lvbigpCgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHZlcnNpb24sIHN0cmluZ190eXBlcyk6CiAgICAgICAgICAgIGlmIGhhc2F0dHIodmVyc2lvbiwgJ19faXRlcl9fJyk6CiAgICAgICAgICAgICAgICB2ZXJzaW9uID0gJy4nLmpvaW4obWFwKHN0ciwgdmVyc2lvbikpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICB2ZXJzaW9uID0gJyVzJyAlIHZlcnNpb24KCiAgICAgICAgcmV0dXJuIHZlcnNpb24KCgpjbGFzcyBDb25maWdPcHRpb25zSGFuZGxlcihDb25maWdIYW5kbGVyKToKCiAgICBzZWN0aW9uX3ByZWZpeCA9ICdvcHRpb25zJwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHBhcnNlcnMoc2VsZik6CiAgICAgICAgIiIiTWV0YWRhdGEgaXRlbSBuYW1lIHRvIHBhcnNlciBmdW5jdGlvbiBtYXBwaW5nLiIiIgogICAgICAgIHBhcnNlX2xpc3QgPSBzZWxmLl9wYXJzZV9saXN0CiAgICAgICAgcGFyc2VfbGlzdF9zZW1pY29sb24gPSBwYXJ0aWFsKHNlbGYuX3BhcnNlX2xpc3QsIHNlcGFyYXRvcj0nOycpCiAgICAgICAgcGFyc2VfYm9vbCA9IHNlbGYuX3BhcnNlX2Jvb2wKICAgICAgICBwYXJzZV9kaWN0ID0gc2VsZi5fcGFyc2VfZGljdAoKICAgICAgICByZXR1cm4gewogICAgICAgICAgICAnemlwX3NhZmUnOiBwYXJzZV9ib29sLAogICAgICAgICAgICAndXNlXzJ0bzMnOiBwYXJzZV9ib29sLAogICAgICAgICAgICAnaW5jbHVkZV9wYWNrYWdlX2RhdGEnOiBwYXJzZV9ib29sLAogICAgICAgICAgICAncGFja2FnZV9kaXInOiBwYXJzZV9kaWN0LAogICAgICAgICAgICAndXNlXzJ0bzNfZml4ZXJzJzogcGFyc2VfbGlzdCwKICAgICAgICAgICAgJ3VzZV8ydG8zX2V4Y2x1ZGVfZml4ZXJzJzogcGFyc2VfbGlzdCwKICAgICAgICAgICAgJ2NvbnZlcnRfMnRvM19kb2N0ZXN0cyc6IHBhcnNlX2xpc3QsCiAgICAgICAgICAgICdzY3JpcHRzJzogcGFyc2VfbGlzdCwKICAgICAgICAgICAgJ2VhZ2VyX3Jlc291cmNlcyc6IHBhcnNlX2xpc3QsCiAgICAgICAgICAgICdkZXBlbmRlbmN5X2xpbmtzJzogcGFyc2VfbGlzdCwKICAgICAgICAgICAgJ25hbWVzcGFjZV9wYWNrYWdlcyc6IHBhcnNlX2xpc3QsCiAgICAgICAgICAgICdpbnN0YWxsX3JlcXVpcmVzJzogcGFyc2VfbGlzdF9zZW1pY29sb24sCiAgICAgICAgICAgICdzZXR1cF9yZXF1aXJlcyc6IHBhcnNlX2xpc3Rfc2VtaWNvbG9uLAogICAgICAgICAgICAndGVzdHNfcmVxdWlyZSc6IHBhcnNlX2xpc3Rfc2VtaWNvbG9uLAogICAgICAgICAgICAncGFja2FnZXMnOiBzZWxmLl9wYXJzZV9wYWNrYWdlcywKICAgICAgICAgICAgJ2VudHJ5X3BvaW50cyc6IHNlbGYuX3BhcnNlX2ZpbGUsCiAgICAgICAgICAgICdweV9tb2R1bGVzJzogcGFyc2VfbGlzdCwKICAgICAgICAgICAgJ3B5dGhvbl9yZXF1aXJlcyc6IFNwZWNpZmllclNldCwKICAgICAgICB9CgogICAgZGVmIF9wYXJzZV9wYWNrYWdlcyhzZWxmLCB2YWx1ZSk6CiAgICAgICAgIiIiUGFyc2VzIGBwYWNrYWdlc2Agb3B0aW9uIHZhbHVlLgoKICAgICAgICA6cGFyYW0gdmFsdWU6CiAgICAgICAgOnJ0eXBlOiBsaXN0CiAgICAgICAgIiIiCiAgICAgICAgZmluZF9kaXJlY3RpdmVzID0gWydmaW5kOicsICdmaW5kX25hbWVzcGFjZTonXQogICAgICAgIHRyaW1tZWRfdmFsdWUgPSB2YWx1ZS5zdHJpcCgpCgogICAgICAgIGlmIHRyaW1tZWRfdmFsdWUgbm90IGluIGZpbmRfZGlyZWN0aXZlczoKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3BhcnNlX2xpc3QodmFsdWUpCgogICAgICAgIGZpbmRucyA9IHRyaW1tZWRfdmFsdWUgPT0gZmluZF9kaXJlY3RpdmVzWzFdCiAgICAgICAgaWYgZmluZG5zIGFuZCBub3QgUFkzOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcigKICAgICAgICAgICAgICAgICdmaW5kX25hbWVzcGFjZTogZGlyZWN0aXZlIGlzIHVuc3VwcG9ydGVkIG9uIFB5dGhvbiA8IDMuMycpCgogICAgICAgICMgUmVhZCBmdW5jdGlvbiBhcmd1bWVudHMgZnJvbSBhIGRlZGljYXRlZCBzZWN0aW9uLgogICAgICAgIGZpbmRfa3dhcmdzID0gc2VsZi5wYXJzZV9zZWN0aW9uX3BhY2thZ2VzX19maW5kKAogICAgICAgICAgICBzZWxmLnNlY3Rpb25zLmdldCgncGFja2FnZXMuZmluZCcsIHt9KSkKCiAgICAgICAgaWYgZmluZG5zOgogICAgICAgICAgICBmcm9tIHNldHVwdG9vbHMgaW1wb3J0IGZpbmRfbmFtZXNwYWNlX3BhY2thZ2VzIGFzIGZpbmRfcGFja2FnZXMKICAgICAgICBlbHNlOgogICAgICAgICAgICBmcm9tIHNldHVwdG9vbHMgaW1wb3J0IGZpbmRfcGFja2FnZXMKCiAgICAgICAgcmV0dXJuIGZpbmRfcGFja2FnZXMoKipmaW5kX2t3YXJncykKCiAgICBkZWYgcGFyc2Vfc2VjdGlvbl9wYWNrYWdlc19fZmluZChzZWxmLCBzZWN0aW9uX29wdGlvbnMpOgogICAgICAgICIiIlBhcnNlcyBgcGFja2FnZXMuZmluZGAgY29uZmlndXJhdGlvbiBmaWxlIHNlY3Rpb24uCgogICAgICAgIFRvIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBfcGFyc2VfcGFja2FnZXMoKS4KCiAgICAgICAgOnBhcmFtIGRpY3Qgc2VjdGlvbl9vcHRpb25zOgogICAgICAgICIiIgogICAgICAgIHNlY3Rpb25fZGF0YSA9IHNlbGYuX3BhcnNlX3NlY3Rpb25fdG9fZGljdCgKICAgICAgICAgICAgc2VjdGlvbl9vcHRpb25zLCBzZWxmLl9wYXJzZV9saXN0KQoKICAgICAgICB2YWxpZF9rZXlzID0gWyd3aGVyZScsICdpbmNsdWRlJywgJ2V4Y2x1ZGUnXQoKICAgICAgICBmaW5kX2t3YXJncyA9IGRpY3QoCiAgICAgICAgICAgIFsoaywgdikgZm9yIGssIHYgaW4gc2VjdGlvbl9kYXRhLml0ZW1zKCkgaWYgayBpbiB2YWxpZF9rZXlzIGFuZCB2XSkKCiAgICAgICAgd2hlcmUgPSBmaW5kX2t3YXJncy5nZXQoJ3doZXJlJykKICAgICAgICBpZiB3aGVyZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgZmluZF9rd2FyZ3NbJ3doZXJlJ10gPSB3aGVyZVswXSAgIyBjYXN0IGxpc3QgdG8gc2luZ2xlIHZhbAoKICAgICAgICByZXR1cm4gZmluZF9rd2FyZ3MKCiAgICBkZWYgcGFyc2Vfc2VjdGlvbl9lbnRyeV9wb2ludHMoc2VsZiwgc2VjdGlvbl9vcHRpb25zKToKICAgICAgICAiIiJQYXJzZXMgYGVudHJ5X3BvaW50c2AgY29uZmlndXJhdGlvbiBmaWxlIHNlY3Rpb24uCgogICAgICAgIDpwYXJhbSBkaWN0IHNlY3Rpb25fb3B0aW9uczoKICAgICAgICAiIiIKICAgICAgICBwYXJzZWQgPSBzZWxmLl9wYXJzZV9zZWN0aW9uX3RvX2RpY3Qoc2VjdGlvbl9vcHRpb25zLCBzZWxmLl9wYXJzZV9saXN0KQogICAgICAgIHNlbGZbJ2VudHJ5X3BvaW50cyddID0gcGFyc2VkCgogICAgZGVmIF9wYXJzZV9wYWNrYWdlX2RhdGEoc2VsZiwgc2VjdGlvbl9vcHRpb25zKToKICAgICAgICBwYXJzZWQgPSBzZWxmLl9wYXJzZV9zZWN0aW9uX3RvX2RpY3Qoc2VjdGlvbl9vcHRpb25zLCBzZWxmLl9wYXJzZV9saXN0KQoKICAgICAgICByb290ID0gcGFyc2VkLmdldCgnKicpCiAgICAgICAgaWYgcm9vdDoKICAgICAgICAgICAgcGFyc2VkWycnXSA9IHJvb3QKICAgICAgICAgICAgZGVsIHBhcnNlZFsnKiddCgogICAgICAgIHJldHVybiBwYXJzZWQKCiAgICBkZWYgcGFyc2Vfc2VjdGlvbl9wYWNrYWdlX2RhdGEoc2VsZiwgc2VjdGlvbl9vcHRpb25zKToKICAgICAgICAiIiJQYXJzZXMgYHBhY2thZ2VfZGF0YWAgY29uZmlndXJhdGlvbiBmaWxlIHNlY3Rpb24uCgogICAgICAgIDpwYXJhbSBkaWN0IHNlY3Rpb25fb3B0aW9uczoKICAgICAgICAiIiIKICAgICAgICBzZWxmWydwYWNrYWdlX2RhdGEnXSA9IHNlbGYuX3BhcnNlX3BhY2thZ2VfZGF0YShzZWN0aW9uX29wdGlvbnMpCgogICAgZGVmIHBhcnNlX3NlY3Rpb25fZXhjbHVkZV9wYWNrYWdlX2RhdGEoc2VsZiwgc2VjdGlvbl9vcHRpb25zKToKICAgICAgICAiIiJQYXJzZXMgYGV4Y2x1ZGVfcGFja2FnZV9kYXRhYCBjb25maWd1cmF0aW9uIGZpbGUgc2VjdGlvbi4KCiAgICAgICAgOnBhcmFtIGRpY3Qgc2VjdGlvbl9vcHRpb25zOgogICAgICAgICIiIgogICAgICAgIHNlbGZbJ2V4Y2x1ZGVfcGFja2FnZV9kYXRhJ10gPSBzZWxmLl9wYXJzZV9wYWNrYWdlX2RhdGEoCiAgICAgICAgICAgIHNlY3Rpb25fb3B0aW9ucykKCiAgICBkZWYgcGFyc2Vfc2VjdGlvbl9leHRyYXNfcmVxdWlyZShzZWxmLCBzZWN0aW9uX29wdGlvbnMpOgogICAgICAgICIiIlBhcnNlcyBgZXh0cmFzX3JlcXVpcmVgIGNvbmZpZ3VyYXRpb24gZmlsZSBzZWN0aW9uLgoKICAgICAgICA6cGFyYW0gZGljdCBzZWN0aW9uX29wdGlvbnM6CiAgICAgICAgIiIiCiAgICAgICAgcGFyc2VfbGlzdCA9IHBhcnRpYWwoc2VsZi5fcGFyc2VfbGlzdCwgc2VwYXJhdG9yPSc7JykKICAgICAgICBzZWxmWydleHRyYXNfcmVxdWlyZSddID0gc2VsZi5fcGFyc2Vfc2VjdGlvbl90b19kaWN0KAogICAgICAgICAgICBzZWN0aW9uX29wdGlvbnMsIHBhcnNlX2xpc3QpCgogICAgZGVmIHBhcnNlX3NlY3Rpb25fZGF0YV9maWxlcyhzZWxmLCBzZWN0aW9uX29wdGlvbnMpOgogICAgICAgICIiIlBhcnNlcyBgZGF0YV9maWxlc2AgY29uZmlndXJhdGlvbiBmaWxlIHNlY3Rpb24uCgogICAgICAgIDpwYXJhbSBkaWN0IHNlY3Rpb25fb3B0aW9uczoKICAgICAgICAiIiIKICAgICAgICBwYXJzZWQgPSBzZWxmLl9wYXJzZV9zZWN0aW9uX3RvX2RpY3Qoc2VjdGlvbl9vcHRpb25zLCBzZWxmLl9wYXJzZV9saXN0KQogICAgICAgIHNlbGZbJ2RhdGFfZmlsZXMnXSA9IFsoaywgdikgZm9yIGssIHYgaW4gcGFyc2VkLml0ZW1zKCldClBLAwQUAAAAAAAAACEAGiIEMqcDAACnAwAAOwAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2RlcF91dGlsLnB5ZnJvbSBkaXN0dXRpbHMuZGVwX3V0aWwgaW1wb3J0IG5ld2VyX2dyb3VwCgojIHllcywgdGhpcyBpcyB3YXMgYWxtb3N0IGVudGlyZWx5IGNvcHktcGFzdGVkIGZyb20KIyAnbmV3ZXJfcGFpcndpc2UoKScsIHRoaXMgaXMganVzdCBhbm90aGVyIGNvbnZlbmllbmNlCiMgZnVuY3Rpb24uCmRlZiBuZXdlcl9wYWlyd2lzZV9ncm91cChzb3VyY2VzX2dyb3VwcywgdGFyZ2V0cyk6CiAgICAiIiJXYWxrIGJvdGggYXJndW1lbnRzIGluIHBhcmFsbGVsLCB0ZXN0aW5nIGlmIGVhY2ggc291cmNlIGdyb3VwIGlzIG5ld2VyCiAgICB0aGFuIGl0cyBjb3JyZXNwb25kaW5nIHRhcmdldC4gUmV0dXJucyBhIHBhaXIgb2YgbGlzdHMgKHNvdXJjZXNfZ3JvdXBzLAogICAgdGFyZ2V0cykgd2hlcmUgc291cmNlcyBpcyBuZXdlciB0aGFuIHRhcmdldCwgYWNjb3JkaW5nIHRvIHRoZSBzZW1hbnRpY3MKICAgIG9mICduZXdlcl9ncm91cCgpJy4KICAgICIiIgogICAgaWYgbGVuKHNvdXJjZXNfZ3JvdXBzKSAhPSBsZW4odGFyZ2V0cyk6CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiJ3NvdXJjZXNfZ3JvdXAnIGFuZCAndGFyZ2V0cycgbXVzdCBiZSB0aGUgc2FtZSBsZW5ndGgiKQoKICAgICMgYnVpbGQgYSBwYWlyIG9mIGxpc3RzIChzb3VyY2VzX2dyb3VwcywgdGFyZ2V0cykgd2hlcmUgc291cmNlIGlzIG5ld2VyCiAgICBuX3NvdXJjZXMgPSBbXQogICAgbl90YXJnZXRzID0gW10KICAgIGZvciBpIGluIHJhbmdlKGxlbihzb3VyY2VzX2dyb3VwcykpOgogICAgICAgIGlmIG5ld2VyX2dyb3VwKHNvdXJjZXNfZ3JvdXBzW2ldLCB0YXJnZXRzW2ldKToKICAgICAgICAgICAgbl9zb3VyY2VzLmFwcGVuZChzb3VyY2VzX2dyb3Vwc1tpXSkKICAgICAgICAgICAgbl90YXJnZXRzLmFwcGVuZCh0YXJnZXRzW2ldKQoKICAgIHJldHVybiBuX3NvdXJjZXMsIG5fdGFyZ2V0cwpQSwMEFAAAAAAAAAAhAP0ZWwqNFQAAjRUAADoAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9kZXBlbmRzLnB5aW1wb3J0IHN5cwppbXBvcnQgbWFyc2hhbAppbXBvcnQgY29udGV4dGxpYgpmcm9tIGRpc3R1dGlscy52ZXJzaW9uIGltcG9ydCBTdHJpY3RWZXJzaW9uCgpmcm9tIC5weTMzY29tcGF0IGltcG9ydCBCeXRlY29kZQoKZnJvbSAucHkyN2NvbXBhdCBpbXBvcnQgZmluZF9tb2R1bGUsIFBZX0NPTVBJTEVELCBQWV9GUk9aRU4sIFBZX1NPVVJDRQpmcm9tIC4gaW1wb3J0IHB5Mjdjb21wYXQKCgpfX2FsbF9fID0gWwogICAgJ1JlcXVpcmUnLCAnZmluZF9tb2R1bGUnLCAnZ2V0X21vZHVsZV9jb25zdGFudCcsICdleHRyYWN0X2NvbnN0YW50JwpdCgoKY2xhc3MgUmVxdWlyZToKICAgICIiIkEgcHJlcmVxdWlzaXRlIHRvIGJ1aWxkaW5nIG9yIGluc3RhbGxpbmcgYSBkaXN0cmlidXRpb24iIiIKCiAgICBkZWYgX19pbml0X18oCiAgICAgICAgICAgIHNlbGYsIG5hbWUsIHJlcXVlc3RlZF92ZXJzaW9uLCBtb2R1bGUsIGhvbWVwYWdlPScnLAogICAgICAgICAgICBhdHRyaWJ1dGU9Tm9uZSwgZm9ybWF0PU5vbmUpOgoKICAgICAgICBpZiBmb3JtYXQgaXMgTm9uZSBhbmQgcmVxdWVzdGVkX3ZlcnNpb24gaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGZvcm1hdCA9IFN0cmljdFZlcnNpb24KCiAgICAgICAgaWYgZm9ybWF0IGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXF1ZXN0ZWRfdmVyc2lvbiA9IGZvcm1hdChyZXF1ZXN0ZWRfdmVyc2lvbikKICAgICAgICAgICAgaWYgYXR0cmlidXRlIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgPSAnX192ZXJzaW9uX18nCgogICAgICAgIHNlbGYuX19kaWN0X18udXBkYXRlKGxvY2FscygpKQogICAgICAgIGRlbCBzZWxmLnNlbGYKCiAgICBkZWYgZnVsbF9uYW1lKHNlbGYpOgogICAgICAgICIiIlJldHVybiBmdWxsIHBhY2thZ2UvZGlzdHJpYnV0aW9uIG5hbWUsIHcvdmVyc2lvbiIiIgogICAgICAgIGlmIHNlbGYucmVxdWVzdGVkX3ZlcnNpb24gaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJldHVybiAnJXMtJXMnICUgKHNlbGYubmFtZSwgc2VsZi5yZXF1ZXN0ZWRfdmVyc2lvbikKICAgICAgICByZXR1cm4gc2VsZi5uYW1lCgogICAgZGVmIHZlcnNpb25fb2soc2VsZiwgdmVyc2lvbik6CiAgICAgICAgIiIiSXMgJ3ZlcnNpb24nIHN1ZmZpY2llbnRseSB1cC10by1kYXRlPyIiIgogICAgICAgIHJldHVybiBzZWxmLmF0dHJpYnV0ZSBpcyBOb25lIG9yIHNlbGYuZm9ybWF0IGlzIE5vbmUgb3IgXAogICAgICAgICAgICBzdHIodmVyc2lvbikgIT0gInVua25vd24iIGFuZCB2ZXJzaW9uID49IHNlbGYucmVxdWVzdGVkX3ZlcnNpb24KCiAgICBkZWYgZ2V0X3ZlcnNpb24oc2VsZiwgcGF0aHM9Tm9uZSwgZGVmYXVsdD0idW5rbm93biIpOgogICAgICAgICIiIkdldCB2ZXJzaW9uIG51bWJlciBvZiBpbnN0YWxsZWQgbW9kdWxlLCAnTm9uZScsIG9yICdkZWZhdWx0JwoKICAgICAgICBTZWFyY2ggJ3BhdGhzJyBmb3IgbW9kdWxlLiAgSWYgbm90IGZvdW5kLCByZXR1cm4gJ05vbmUnLiAgSWYgZm91bmQsCiAgICAgICAgcmV0dXJuIHRoZSBleHRyYWN0ZWQgdmVyc2lvbiBhdHRyaWJ1dGUsIG9yICdkZWZhdWx0JyBpZiBubyB2ZXJzaW9uCiAgICAgICAgYXR0cmlidXRlIHdhcyBzcGVjaWZpZWQsIG9yIHRoZSB2YWx1ZSBjYW5ub3QgYmUgZGV0ZXJtaW5lZCB3aXRob3V0CiAgICAgICAgaW1wb3J0aW5nIHRoZSBtb2R1bGUuICBUaGUgdmVyc2lvbiBpcyBmb3JtYXR0ZWQgYWNjb3JkaW5nIHRvIHRoZQogICAgICAgIHJlcXVpcmVtZW50J3MgdmVyc2lvbiBmb3JtYXQgKGlmIGFueSksIHVubGVzcyBpdCBpcyAnTm9uZScgb3IgdGhlCiAgICAgICAgc3VwcGxpZWQgJ2RlZmF1bHQnLgogICAgICAgICIiIgoKICAgICAgICBpZiBzZWxmLmF0dHJpYnV0ZSBpcyBOb25lOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBmLCBwLCBpID0gZmluZF9tb2R1bGUoc2VsZi5tb2R1bGUsIHBhdGhzKQogICAgICAgICAgICAgICAgaWYgZjoKICAgICAgICAgICAgICAgICAgICBmLmNsb3NlKCkKICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0CiAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgICAgIHYgPSBnZXRfbW9kdWxlX2NvbnN0YW50KHNlbGYubW9kdWxlLCBzZWxmLmF0dHJpYnV0ZSwgZGVmYXVsdCwgcGF0aHMpCgogICAgICAgIGlmIHYgaXMgbm90IE5vbmUgYW5kIHYgaXMgbm90IGRlZmF1bHQgYW5kIHNlbGYuZm9ybWF0IGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4gc2VsZi5mb3JtYXQodikKCiAgICAgICAgcmV0dXJuIHYKCiAgICBkZWYgaXNfcHJlc2VudChzZWxmLCBwYXRocz1Ob25lKToKICAgICAgICAiIiJSZXR1cm4gdHJ1ZSBpZiBkZXBlbmRlbmN5IGlzIHByZXNlbnQgb24gJ3BhdGhzJyIiIgogICAgICAgIHJldHVybiBzZWxmLmdldF92ZXJzaW9uKHBhdGhzKSBpcyBub3QgTm9uZQoKICAgIGRlZiBpc19jdXJyZW50KHNlbGYsIHBhdGhzPU5vbmUpOgogICAgICAgICIiIlJldHVybiB0cnVlIGlmIGRlcGVuZGVuY3kgaXMgcHJlc2VudCBhbmQgdXAtdG8tZGF0ZSBvbiAncGF0aHMnIiIiCiAgICAgICAgdmVyc2lvbiA9IHNlbGYuZ2V0X3ZlcnNpb24ocGF0aHMpCiAgICAgICAgaWYgdmVyc2lvbiBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICByZXR1cm4gc2VsZi52ZXJzaW9uX29rKHZlcnNpb24pCgoKZGVmIG1heWJlX2Nsb3NlKGYpOgogICAgQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKICAgIGRlZiBlbXB0eSgpOgogICAgICAgIHlpZWxkCiAgICAgICAgcmV0dXJuCiAgICBpZiBub3QgZjoKICAgICAgICByZXR1cm4gZW1wdHkoKQoKICAgIHJldHVybiBjb250ZXh0bGliLmNsb3NpbmcoZikKCgpkZWYgZ2V0X21vZHVsZV9jb25zdGFudChtb2R1bGUsIHN5bWJvbCwgZGVmYXVsdD0tMSwgcGF0aHM9Tm9uZSk6CiAgICAiIiJGaW5kICdtb2R1bGUnIGJ5IHNlYXJjaGluZyAncGF0aHMnLCBhbmQgZXh0cmFjdCAnc3ltYm9sJwoKICAgIFJldHVybiAnTm9uZScgaWYgJ21vZHVsZScgZG9lcyBub3QgZXhpc3Qgb24gJ3BhdGhzJywgb3IgaXQgZG9lcyBub3QgZGVmaW5lCiAgICAnc3ltYm9sJy4gIElmIHRoZSBtb2R1bGUgZGVmaW5lcyAnc3ltYm9sJyBhcyBhIGNvbnN0YW50LCByZXR1cm4gdGhlCiAgICBjb25zdGFudC4gIE90aGVyd2lzZSwgcmV0dXJuICdkZWZhdWx0Jy4iIiIKCiAgICB0cnk6CiAgICAgICAgZiwgcGF0aCwgKHN1ZmZpeCwgbW9kZSwga2luZCkgPSBpbmZvID0gZmluZF9tb2R1bGUobW9kdWxlLCBwYXRocykKICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICAjIE1vZHVsZSBkb2Vzbid0IGV4aXN0CiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICB3aXRoIG1heWJlX2Nsb3NlKGYpOgogICAgICAgIGlmIGtpbmQgPT0gUFlfQ09NUElMRUQ6CiAgICAgICAgICAgIGYucmVhZCg4KSAgIyBza2lwIG1hZ2ljICYgZGF0ZQogICAgICAgICAgICBjb2RlID0gbWFyc2hhbC5sb2FkKGYpCiAgICAgICAgZWxpZiBraW5kID09IFBZX0ZST1pFTjoKICAgICAgICAgICAgY29kZSA9IHB5Mjdjb21wYXQuZ2V0X2Zyb3plbl9vYmplY3QobW9kdWxlLCBwYXRocykKICAgICAgICBlbGlmIGtpbmQgPT0gUFlfU09VUkNFOgogICAgICAgICAgICBjb2RlID0gY29tcGlsZShmLnJlYWQoKSwgcGF0aCwgJ2V4ZWMnKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgTm90IHNvbWV0aGluZyB3ZSBjYW4gcGFyc2U7IHdlJ2xsIGhhdmUgdG8gaW1wb3J0IGl0LiAgOigKICAgICAgICAgICAgaW1wb3J0ZWQgPSBweTI3Y29tcGF0LmdldF9tb2R1bGUobW9kdWxlLCBwYXRocywgaW5mbykKICAgICAgICAgICAgcmV0dXJuIGdldGF0dHIoaW1wb3J0ZWQsIHN5bWJvbCwgTm9uZSkKCiAgICByZXR1cm4gZXh0cmFjdF9jb25zdGFudChjb2RlLCBzeW1ib2wsIGRlZmF1bHQpCgoKZGVmIGV4dHJhY3RfY29uc3RhbnQoY29kZSwgc3ltYm9sLCBkZWZhdWx0PS0xKToKICAgICIiIkV4dHJhY3QgdGhlIGNvbnN0YW50IHZhbHVlIG9mICdzeW1ib2wnIGZyb20gJ2NvZGUnCgogICAgSWYgdGhlIG5hbWUgJ3N5bWJvbCcgaXMgYm91bmQgdG8gYSBjb25zdGFudCB2YWx1ZSBieSB0aGUgUHl0aG9uIGNvZGUKICAgIG9iamVjdCAnY29kZScsIHJldHVybiB0aGF0IHZhbHVlLiAgSWYgJ3N5bWJvbCcgaXMgYm91bmQgdG8gYW4gZXhwcmVzc2lvbiwKICAgIHJldHVybiAnZGVmYXVsdCcuICBPdGhlcndpc2UsIHJldHVybiAnTm9uZScuCgogICAgUmV0dXJuIHZhbHVlIGlzIGJhc2VkIG9uIHRoZSBmaXJzdCBhc3NpZ25tZW50IHRvICdzeW1ib2wnLiAgJ3N5bWJvbCcgbXVzdAogICAgYmUgYSBnbG9iYWwsIG9yIGF0IGxlYXN0IGEgbm9uLSJmYXN0IiBsb2NhbCBpbiB0aGUgY29kZSBibG9jay4gIFRoYXQgaXMsCiAgICBvbmx5ICdTVE9SRV9OQU1FJyBhbmQgJ1NUT1JFX0dMT0JBTCcgb3Bjb2RlcyBhcmUgY2hlY2tlZCwgYW5kICdzeW1ib2wnCiAgICBtdXN0IGJlIHByZXNlbnQgaW4gJ2NvZGUuY29fbmFtZXMnLgogICAgIiIiCiAgICBpZiBzeW1ib2wgbm90IGluIGNvZGUuY29fbmFtZXM6CiAgICAgICAgIyBuYW1lJ3Mgbm90IHRoZXJlLCBjYW4ndCBwb3NzaWJseSBiZSBhbiBhc3NpZ25tZW50CiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBuYW1lX2lkeCA9IGxpc3QoY29kZS5jb19uYW1lcykuaW5kZXgoc3ltYm9sKQoKICAgIFNUT1JFX05BTUUgPSA5MAogICAgU1RPUkVfR0xPQkFMID0gOTcKICAgIExPQURfQ09OU1QgPSAxMDAKCiAgICBjb25zdCA9IGRlZmF1bHQKCiAgICBmb3IgYnl0ZV9jb2RlIGluIEJ5dGVjb2RlKGNvZGUpOgogICAgICAgIG9wID0gYnl0ZV9jb2RlLm9wY29kZQogICAgICAgIGFyZyA9IGJ5dGVfY29kZS5hcmcKCiAgICAgICAgaWYgb3AgPT0gTE9BRF9DT05TVDoKICAgICAgICAgICAgY29uc3QgPSBjb2RlLmNvX2NvbnN0c1thcmddCiAgICAgICAgZWxpZiBhcmcgPT0gbmFtZV9pZHggYW5kIChvcCA9PSBTVE9SRV9OQU1FIG9yIG9wID09IFNUT1JFX0dMT0JBTCk6CiAgICAgICAgICAgIHJldHVybiBjb25zdAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGNvbnN0ID0gZGVmYXVsdAoKCmRlZiBfdXBkYXRlX2dsb2JhbHMoKToKICAgICIiIgogICAgUGF0Y2ggdGhlIGdsb2JhbHMgdG8gcmVtb3ZlIHRoZSBvYmplY3RzIG5vdCBhdmFpbGFibGUgb24gc29tZSBwbGF0Zm9ybXMuCgogICAgWFhYIGl0J2QgYmUgYmV0dGVyIHRvIHRlc3QgYXNzZXJ0aW9ucyBhYm91dCBieXRlY29kZSBpbnN0ZWFkLgogICAgIiIiCgogICAgaWYgbm90IHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdqYXZhJykgYW5kIHN5cy5wbGF0Zm9ybSAhPSAnY2xpJzoKICAgICAgICByZXR1cm4KICAgIGluY29tcGF0aWJsZSA9ICdleHRyYWN0X2NvbnN0YW50JywgJ2dldF9tb2R1bGVfY29uc3RhbnQnCiAgICBmb3IgbmFtZSBpbiBpbmNvbXBhdGlibGU6CiAgICAgICAgZGVsIGdsb2JhbHMoKVtuYW1lXQogICAgICAgIF9fYWxsX18ucmVtb3ZlKG5hbWUpCgoKX3VwZGF0ZV9nbG9iYWxzKCkKUEsDBBQAAAAAAAAAIQAV8l+UwcIAAMHCAAA3AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvZGlzdC5weSMgLSotIGNvZGluZzogdXRmLTggLSotCl9fYWxsX18gPSBbJ0Rpc3RyaWJ1dGlvbiddCgppbXBvcnQgaW8KaW1wb3J0IHN5cwppbXBvcnQgcmUKaW1wb3J0IG9zCmltcG9ydCB3YXJuaW5ncwppbXBvcnQgbnVtYmVycwppbXBvcnQgZGlzdHV0aWxzLmxvZwppbXBvcnQgZGlzdHV0aWxzLmNvcmUKaW1wb3J0IGRpc3R1dGlscy5jbWQKaW1wb3J0IGRpc3R1dGlscy5kaXN0CmZyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IHN0cnRvYm9vbApmcm9tIGRpc3R1dGlscy5kZWJ1ZyBpbXBvcnQgREVCVUcKZnJvbSBkaXN0dXRpbHMuZmFuY3lfZ2V0b3B0IGltcG9ydCB0cmFuc2xhdGVfbG9uZ29wdAppbXBvcnQgaXRlcnRvb2xzCgpmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBkZWZhdWx0ZGljdApmcm9tIGVtYWlsIGltcG9ydCBtZXNzYWdlX2Zyb21fZmlsZQoKZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCAoCiAgICBEaXN0dXRpbHNPcHRpb25FcnJvciwgRGlzdHV0aWxzUGxhdGZvcm1FcnJvciwgRGlzdHV0aWxzU2V0dXBFcnJvciwKKQpmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCByZmM4MjJfZXNjYXBlCmZyb20gZGlzdHV0aWxzLnZlcnNpb24gaW1wb3J0IFN0cmljdFZlcnNpb24KCmZyb20gc2V0dXB0b29scy5leHRlcm4gaW1wb3J0IHNpeApmcm9tIHNldHVwdG9vbHMuZXh0ZXJuIGltcG9ydCBwYWNrYWdpbmcKZnJvbSBzZXR1cHRvb2xzLmV4dGVybiBpbXBvcnQgb3JkZXJlZF9zZXQKZnJvbSBzZXR1cHRvb2xzLmV4dGVybi5zaXgubW92ZXMgaW1wb3J0IG1hcCwgZmlsdGVyLCBmaWx0ZXJmYWxzZQoKZnJvbSAuIGltcG9ydCBTZXR1cHRvb2xzRGVwcmVjYXRpb25XYXJuaW5nCgpmcm9tIHNldHVwdG9vbHMuZGVwZW5kcyBpbXBvcnQgUmVxdWlyZQpmcm9tIHNldHVwdG9vbHMgaW1wb3J0IHdpbmRvd3Nfc3VwcG9ydApmcm9tIHNldHVwdG9vbHMubW9ua2V5IGltcG9ydCBnZXRfdW5wYXRjaGVkCmZyb20gc2V0dXB0b29scy5jb25maWcgaW1wb3J0IHBhcnNlX2NvbmZpZ3VyYXRpb24KaW1wb3J0IHBrZ19yZXNvdXJjZXMKCl9faW1wb3J0X18oJ3NldHVwdG9vbHMuZXh0ZXJuLnBhY2thZ2luZy5zcGVjaWZpZXJzJykKX19pbXBvcnRfXygnc2V0dXB0b29scy5leHRlcm4ucGFja2FnaW5nLnZlcnNpb24nKQoKCmRlZiBfZ2V0X3VucGF0Y2hlZChjbHMpOgogICAgd2FybmluZ3Mud2FybigiRG8gbm90IGNhbGwgdGhpcyBmdW5jdGlvbiIsIERpc3REZXByZWNhdGlvbldhcm5pbmcpCiAgICByZXR1cm4gZ2V0X3VucGF0Y2hlZChjbHMpCgoKZGVmIGdldF9tZXRhZGF0YV92ZXJzaW9uKHNlbGYpOgogICAgbXYgPSBnZXRhdHRyKHNlbGYsICdtZXRhZGF0YV92ZXJzaW9uJywgTm9uZSkKCiAgICBpZiBtdiBpcyBOb25lOgogICAgICAgIGlmIHNlbGYubG9uZ19kZXNjcmlwdGlvbl9jb250ZW50X3R5cGUgb3Igc2VsZi5wcm92aWRlc19leHRyYXM6CiAgICAgICAgICAgIG12ID0gU3RyaWN0VmVyc2lvbignMi4xJykKICAgICAgICBlbGlmIChzZWxmLm1haW50YWluZXIgaXMgbm90IE5vbmUgb3IKICAgICAgICAgICAgICBzZWxmLm1haW50YWluZXJfZW1haWwgaXMgbm90IE5vbmUgb3IKICAgICAgICAgICAgICBnZXRhdHRyKHNlbGYsICdweXRob25fcmVxdWlyZXMnLCBOb25lKSBpcyBub3QgTm9uZSBvcgogICAgICAgICAgICAgIHNlbGYucHJvamVjdF91cmxzKToKICAgICAgICAgICAgbXYgPSBTdHJpY3RWZXJzaW9uKCcxLjInKQogICAgICAgIGVsaWYgKHNlbGYucHJvdmlkZXMgb3Igc2VsZi5yZXF1aXJlcyBvciBzZWxmLm9ic29sZXRlcyBvcgogICAgICAgICAgICAgICAgc2VsZi5jbGFzc2lmaWVycyBvciBzZWxmLmRvd25sb2FkX3VybCk6CiAgICAgICAgICAgIG12ID0gU3RyaWN0VmVyc2lvbignMS4xJykKICAgICAgICBlbHNlOgogICAgICAgICAgICBtdiA9IFN0cmljdFZlcnNpb24oJzEuMCcpCgogICAgICAgIHNlbGYubWV0YWRhdGFfdmVyc2lvbiA9IG12CgogICAgcmV0dXJuIG12CgoKZGVmIHJlYWRfcGtnX2ZpbGUoc2VsZiwgZmlsZSk6CiAgICAiIiJSZWFkcyB0aGUgbWV0YWRhdGEgdmFsdWVzIGZyb20gYSBmaWxlIG9iamVjdC4iIiIKICAgIG1zZyA9IG1lc3NhZ2VfZnJvbV9maWxlKGZpbGUpCgogICAgZGVmIF9yZWFkX2ZpZWxkKG5hbWUpOgogICAgICAgIHZhbHVlID0gbXNnW25hbWVdCiAgICAgICAgaWYgdmFsdWUgPT0gJ1VOS05PV04nOgogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIHJldHVybiB2YWx1ZQoKICAgIGRlZiBfcmVhZF9saXN0KG5hbWUpOgogICAgICAgIHZhbHVlcyA9IG1zZy5nZXRfYWxsKG5hbWUsIE5vbmUpCiAgICAgICAgaWYgdmFsdWVzID09IFtdOgogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIHJldHVybiB2YWx1ZXMKCiAgICBzZWxmLm1ldGFkYXRhX3ZlcnNpb24gPSBTdHJpY3RWZXJzaW9uKG1zZ1snbWV0YWRhdGEtdmVyc2lvbiddKQogICAgc2VsZi5uYW1lID0gX3JlYWRfZmllbGQoJ25hbWUnKQogICAgc2VsZi52ZXJzaW9uID0gX3JlYWRfZmllbGQoJ3ZlcnNpb24nKQogICAgc2VsZi5kZXNjcmlwdGlvbiA9IF9yZWFkX2ZpZWxkKCdzdW1tYXJ5JykKICAgICMgd2UgYXJlIGZpbGxpbmcgYXV0aG9yIG9ubHkuCiAgICBzZWxmLmF1dGhvciA9IF9yZWFkX2ZpZWxkKCdhdXRob3InKQogICAgc2VsZi5tYWludGFpbmVyID0gTm9uZQogICAgc2VsZi5hdXRob3JfZW1haWwgPSBfcmVhZF9maWVsZCgnYXV0aG9yLWVtYWlsJykKICAgIHNlbGYubWFpbnRhaW5lcl9lbWFpbCA9IE5vbmUKICAgIHNlbGYudXJsID0gX3JlYWRfZmllbGQoJ2hvbWUtcGFnZScpCiAgICBzZWxmLmxpY2Vuc2UgPSBfcmVhZF9maWVsZCgnbGljZW5zZScpCgogICAgaWYgJ2Rvd25sb2FkLXVybCcgaW4gbXNnOgogICAgICAgIHNlbGYuZG93bmxvYWRfdXJsID0gX3JlYWRfZmllbGQoJ2Rvd25sb2FkLXVybCcpCiAgICBlbHNlOgogICAgICAgIHNlbGYuZG93bmxvYWRfdXJsID0gTm9uZQoKICAgIHNlbGYubG9uZ19kZXNjcmlwdGlvbiA9IF9yZWFkX2ZpZWxkKCdkZXNjcmlwdGlvbicpCiAgICBzZWxmLmRlc2NyaXB0aW9uID0gX3JlYWRfZmllbGQoJ3N1bW1hcnknKQoKICAgIGlmICdrZXl3b3JkcycgaW4gbXNnOgogICAgICAgIHNlbGYua2V5d29yZHMgPSBfcmVhZF9maWVsZCgna2V5d29yZHMnKS5zcGxpdCgnLCcpCgogICAgc2VsZi5wbGF0Zm9ybXMgPSBfcmVhZF9saXN0KCdwbGF0Zm9ybScpCiAgICBzZWxmLmNsYXNzaWZpZXJzID0gX3JlYWRfbGlzdCgnY2xhc3NpZmllcicpCgogICAgIyBQRVAgMzE0IC0gdGhlc2UgZmllbGRzIG9ubHkgZXhpc3QgaW4gMS4xCiAgICBpZiBzZWxmLm1ldGFkYXRhX3ZlcnNpb24gPT0gU3RyaWN0VmVyc2lvbignMS4xJyk6CiAgICAgICAgc2VsZi5yZXF1aXJlcyA9IF9yZWFkX2xpc3QoJ3JlcXVpcmVzJykKICAgICAgICBzZWxmLnByb3ZpZGVzID0gX3JlYWRfbGlzdCgncHJvdmlkZXMnKQogICAgICAgIHNlbGYub2Jzb2xldGVzID0gX3JlYWRfbGlzdCgnb2Jzb2xldGVzJykKICAgIGVsc2U6CiAgICAgICAgc2VsZi5yZXF1aXJlcyA9IE5vbmUKICAgICAgICBzZWxmLnByb3ZpZGVzID0gTm9uZQogICAgICAgIHNlbGYub2Jzb2xldGVzID0gTm9uZQoKCiMgQmFzZWQgb24gUHl0aG9uIDMuNSB2ZXJzaW9uCmRlZiB3cml0ZV9wa2dfZmlsZShzZWxmLCBmaWxlKToKICAgICIiIldyaXRlIHRoZSBQS0ctSU5GTyBmb3JtYXQgZGF0YSB0byBhIGZpbGUgb2JqZWN0LgogICAgIiIiCiAgICB2ZXJzaW9uID0gc2VsZi5nZXRfbWV0YWRhdGFfdmVyc2lvbigpCgogICAgaWYgc2l4LlBZMjoKICAgICAgICBkZWYgd3JpdGVfZmllbGQoa2V5LCB2YWx1ZSk6CiAgICAgICAgICAgIGZpbGUud3JpdGUoIiVzOiAlc1xuIiAlIChrZXksIHNlbGYuX2VuY29kZV9maWVsZCh2YWx1ZSkpKQogICAgZWxzZToKICAgICAgICBkZWYgd3JpdGVfZmllbGQoa2V5LCB2YWx1ZSk6CiAgICAgICAgICAgIGZpbGUud3JpdGUoIiVzOiAlc1xuIiAlIChrZXksIHZhbHVlKSkKCiAgICB3cml0ZV9maWVsZCgnTWV0YWRhdGEtVmVyc2lvbicsIHN0cih2ZXJzaW9uKSkKICAgIHdyaXRlX2ZpZWxkKCdOYW1lJywgc2VsZi5nZXRfbmFtZSgpKQogICAgd3JpdGVfZmllbGQoJ1ZlcnNpb24nLCBzZWxmLmdldF92ZXJzaW9uKCkpCiAgICB3cml0ZV9maWVsZCgnU3VtbWFyeScsIHNlbGYuZ2V0X2Rlc2NyaXB0aW9uKCkpCiAgICB3cml0ZV9maWVsZCgnSG9tZS1wYWdlJywgc2VsZi5nZXRfdXJsKCkpCgogICAgaWYgdmVyc2lvbiA8IFN0cmljdFZlcnNpb24oJzEuMicpOgogICAgICAgIHdyaXRlX2ZpZWxkKCdBdXRob3InLCBzZWxmLmdldF9jb250YWN0KCkpCiAgICAgICAgd3JpdGVfZmllbGQoJ0F1dGhvci1lbWFpbCcsIHNlbGYuZ2V0X2NvbnRhY3RfZW1haWwoKSkKICAgIGVsc2U6CiAgICAgICAgb3B0aW9uYWxfZmllbGRzID0gKAogICAgICAgICAgICAoJ0F1dGhvcicsICdhdXRob3InKSwKICAgICAgICAgICAgKCdBdXRob3ItZW1haWwnLCAnYXV0aG9yX2VtYWlsJyksCiAgICAgICAgICAgICgnTWFpbnRhaW5lcicsICdtYWludGFpbmVyJyksCiAgICAgICAgICAgICgnTWFpbnRhaW5lci1lbWFpbCcsICdtYWludGFpbmVyX2VtYWlsJyksCiAgICAgICAgKQoKICAgICAgICBmb3IgZmllbGQsIGF0dHIgaW4gb3B0aW9uYWxfZmllbGRzOgogICAgICAgICAgICBhdHRyX3ZhbCA9IGdldGF0dHIoc2VsZiwgYXR0cikKCiAgICAgICAgICAgIGlmIGF0dHJfdmFsIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgd3JpdGVfZmllbGQoZmllbGQsIGF0dHJfdmFsKQoKICAgIHdyaXRlX2ZpZWxkKCdMaWNlbnNlJywgc2VsZi5nZXRfbGljZW5zZSgpKQogICAgaWYgc2VsZi5kb3dubG9hZF91cmw6CiAgICAgICAgd3JpdGVfZmllbGQoJ0Rvd25sb2FkLVVSTCcsIHNlbGYuZG93bmxvYWRfdXJsKQogICAgZm9yIHByb2plY3RfdXJsIGluIHNlbGYucHJvamVjdF91cmxzLml0ZW1zKCk6CiAgICAgICAgd3JpdGVfZmllbGQoJ1Byb2plY3QtVVJMJywgICclcywgJXMnICUgcHJvamVjdF91cmwpCgogICAgbG9uZ19kZXNjID0gcmZjODIyX2VzY2FwZShzZWxmLmdldF9sb25nX2Rlc2NyaXB0aW9uKCkpCiAgICB3cml0ZV9maWVsZCgnRGVzY3JpcHRpb24nLCBsb25nX2Rlc2MpCgogICAga2V5d29yZHMgPSAnLCcuam9pbihzZWxmLmdldF9rZXl3b3JkcygpKQogICAgaWYga2V5d29yZHM6CiAgICAgICAgd3JpdGVfZmllbGQoJ0tleXdvcmRzJywga2V5d29yZHMpCgogICAgaWYgdmVyc2lvbiA+PSBTdHJpY3RWZXJzaW9uKCcxLjInKToKICAgICAgICBmb3IgcGxhdGZvcm0gaW4gc2VsZi5nZXRfcGxhdGZvcm1zKCk6CiAgICAgICAgICAgIHdyaXRlX2ZpZWxkKCdQbGF0Zm9ybScsIHBsYXRmb3JtKQogICAgZWxzZToKICAgICAgICBzZWxmLl93cml0ZV9saXN0KGZpbGUsICdQbGF0Zm9ybScsIHNlbGYuZ2V0X3BsYXRmb3JtcygpKQoKICAgIHNlbGYuX3dyaXRlX2xpc3QoZmlsZSwgJ0NsYXNzaWZpZXInLCBzZWxmLmdldF9jbGFzc2lmaWVycygpKQoKICAgICMgUEVQIDMxNAogICAgc2VsZi5fd3JpdGVfbGlzdChmaWxlLCAnUmVxdWlyZXMnLCBzZWxmLmdldF9yZXF1aXJlcygpKQogICAgc2VsZi5fd3JpdGVfbGlzdChmaWxlLCAnUHJvdmlkZXMnLCBzZWxmLmdldF9wcm92aWRlcygpKQogICAgc2VsZi5fd3JpdGVfbGlzdChmaWxlLCAnT2Jzb2xldGVzJywgc2VsZi5nZXRfb2Jzb2xldGVzKCkpCgogICAgIyBTZXR1cHRvb2xzIHNwZWNpZmljIGZvciBQRVAgMzQ1CiAgICBpZiBoYXNhdHRyKHNlbGYsICdweXRob25fcmVxdWlyZXMnKToKICAgICAgICB3cml0ZV9maWVsZCgnUmVxdWlyZXMtUHl0aG9uJywgc2VsZi5weXRob25fcmVxdWlyZXMpCgogICAgIyBQRVAgNTY2CiAgICBpZiBzZWxmLmxvbmdfZGVzY3JpcHRpb25fY29udGVudF90eXBlOgogICAgICAgIHdyaXRlX2ZpZWxkKAogICAgICAgICAgICAnRGVzY3JpcHRpb24tQ29udGVudC1UeXBlJywKICAgICAgICAgICAgc2VsZi5sb25nX2Rlc2NyaXB0aW9uX2NvbnRlbnRfdHlwZQogICAgICAgICkKICAgIGlmIHNlbGYucHJvdmlkZXNfZXh0cmFzOgogICAgICAgIGZvciBleHRyYSBpbiBzZWxmLnByb3ZpZGVzX2V4dHJhczoKICAgICAgICAgICAgd3JpdGVfZmllbGQoJ1Byb3ZpZGVzLUV4dHJhJywgZXh0cmEpCgoKc2VxdWVuY2UgPSB0dXBsZSwgbGlzdAoKCmRlZiBjaGVja19pbXBvcnRhYmxlKGRpc3QsIGF0dHIsIHZhbHVlKToKICAgIHRyeToKICAgICAgICBlcCA9IHBrZ19yZXNvdXJjZXMuRW50cnlQb2ludC5wYXJzZSgneD0nICsgdmFsdWUpCiAgICAgICAgYXNzZXJ0IG5vdCBlcC5leHRyYXMKICAgIGV4Y2VwdCAoVHlwZUVycm9yLCBWYWx1ZUVycm9yLCBBdHRyaWJ1dGVFcnJvciwgQXNzZXJ0aW9uRXJyb3IpOgogICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCiAgICAgICAgICAgICIlciBtdXN0IGJlIGltcG9ydGFibGUgJ21vZHVsZTphdHRycycgc3RyaW5nIChnb3QgJXIpIgogICAgICAgICAgICAlIChhdHRyLCB2YWx1ZSkKICAgICAgICApCgoKZGVmIGFzc2VydF9zdHJpbmdfbGlzdChkaXN0LCBhdHRyLCB2YWx1ZSk6CiAgICAiIiJWZXJpZnkgdGhhdCB2YWx1ZSBpcyBhIHN0cmluZyBsaXN0IiIiCiAgICB0cnk6CiAgICAgICAgIyB2ZXJpZnkgdGhhdCB2YWx1ZSBpcyBhIGxpc3Qgb3IgdHVwbGUgdG8gZXhjbHVkZSB1bm9yZGVyZWQKICAgICAgICAjIG9yIHNpbmdsZS11c2UgaXRlcmFibGVzCiAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UodmFsdWUsIChsaXN0LCB0dXBsZSkpCiAgICAgICAgIyB2ZXJpZnkgdGhhdCBlbGVtZW50cyBvZiB2YWx1ZSBhcmUgc3RyaW5ncwogICAgICAgIGFzc2VydCAnJy5qb2luKHZhbHVlKSAhPSB2YWx1ZQogICAgZXhjZXB0IChUeXBlRXJyb3IsIFZhbHVlRXJyb3IsIEF0dHJpYnV0ZUVycm9yLCBBc3NlcnRpb25FcnJvcik6CiAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKICAgICAgICAgICAgIiVyIG11c3QgYmUgYSBsaXN0IG9mIHN0cmluZ3MgKGdvdCAlcikiICUgKGF0dHIsIHZhbHVlKQogICAgICAgICkKCgpkZWYgY2hlY2tfbnNwKGRpc3QsIGF0dHIsIHZhbHVlKToKICAgICIiIlZlcmlmeSB0aGF0IG5hbWVzcGFjZSBwYWNrYWdlcyBhcmUgdmFsaWQiIiIKICAgIG5zX3BhY2thZ2VzID0gdmFsdWUKICAgIGFzc2VydF9zdHJpbmdfbGlzdChkaXN0LCBhdHRyLCBuc19wYWNrYWdlcykKICAgIGZvciBuc3AgaW4gbnNfcGFja2FnZXM6CiAgICAgICAgaWYgbm90IGRpc3QuaGFzX2NvbnRlbnRzX2Zvcihuc3ApOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAogICAgICAgICAgICAgICAgIkRpc3RyaWJ1dGlvbiBjb250YWlucyBubyBtb2R1bGVzIG9yIHBhY2thZ2VzIGZvciAiICsKICAgICAgICAgICAgICAgICJuYW1lc3BhY2UgcGFja2FnZSAlciIgJSBuc3AKICAgICAgICAgICAgKQogICAgICAgIHBhcmVudCwgc2VwLCBjaGlsZCA9IG5zcC5ycGFydGl0aW9uKCcuJykKICAgICAgICBpZiBwYXJlbnQgYW5kIHBhcmVudCBub3QgaW4gbnNfcGFja2FnZXM6CiAgICAgICAgICAgIGRpc3R1dGlscy5sb2cud2FybigKICAgICAgICAgICAgICAgICJXQVJOSU5HOiAlciBpcyBkZWNsYXJlZCBhcyBhIHBhY2thZ2UgbmFtZXNwYWNlLCBidXQgJXIiCiAgICAgICAgICAgICAgICAiIGlzIG5vdDogcGxlYXNlIGNvcnJlY3QgdGhpcyBpbiBzZXR1cC5weSIsIG5zcCwgcGFyZW50CiAgICAgICAgICAgICkKCgpkZWYgY2hlY2tfZXh0cmFzKGRpc3QsIGF0dHIsIHZhbHVlKToKICAgICIiIlZlcmlmeSB0aGF0IGV4dHJhc19yZXF1aXJlIG1hcHBpbmcgaXMgdmFsaWQiIiIKICAgIHRyeToKICAgICAgICBsaXN0KGl0ZXJ0b29scy5zdGFybWFwKF9jaGVja19leHRyYSwgdmFsdWUuaXRlbXMoKSkpCiAgICBleGNlcHQgKFR5cGVFcnJvciwgVmFsdWVFcnJvciwgQXR0cmlidXRlRXJyb3IpOgogICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCiAgICAgICAgICAgICInZXh0cmFzX3JlcXVpcmUnIG11c3QgYmUgYSBkaWN0aW9uYXJ5IHdob3NlIHZhbHVlcyBhcmUgIgogICAgICAgICAgICAic3RyaW5ncyBvciBsaXN0cyBvZiBzdHJpbmdzIGNvbnRhaW5pbmcgdmFsaWQgcHJvamVjdC92ZXJzaW9uICIKICAgICAgICAgICAgInJlcXVpcmVtZW50IHNwZWNpZmllcnMuIgogICAgICAgICkKCgpkZWYgX2NoZWNrX2V4dHJhKGV4dHJhLCByZXFzKToKICAgIG5hbWUsIHNlcCwgbWFya2VyID0gZXh0cmEucGFydGl0aW9uKCc6JykKICAgIGlmIG1hcmtlciBhbmQgcGtnX3Jlc291cmNlcy5pbnZhbGlkX21hcmtlcihtYXJrZXIpOgogICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoIkludmFsaWQgZW52aXJvbm1lbnQgbWFya2VyOiAiICsgbWFya2VyKQogICAgbGlzdChwa2dfcmVzb3VyY2VzLnBhcnNlX3JlcXVpcmVtZW50cyhyZXFzKSkKCgpkZWYgYXNzZXJ0X2Jvb2woZGlzdCwgYXR0ciwgdmFsdWUpOgogICAgIiIiVmVyaWZ5IHRoYXQgdmFsdWUgaXMgVHJ1ZSwgRmFsc2UsIDAsIG9yIDEiIiIKICAgIGlmIGJvb2wodmFsdWUpICE9IHZhbHVlOgogICAgICAgIHRtcGwgPSAie2F0dHIhcn0gbXVzdCBiZSBhIGJvb2xlYW4gdmFsdWUgKGdvdCB7dmFsdWUhcn0pIgogICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IodG1wbC5mb3JtYXQoYXR0cj1hdHRyLCB2YWx1ZT12YWx1ZSkpCgoKZGVmIGNoZWNrX3JlcXVpcmVtZW50cyhkaXN0LCBhdHRyLCB2YWx1ZSk6CiAgICAiIiJWZXJpZnkgdGhhdCBpbnN0YWxsX3JlcXVpcmVzIGlzIGEgdmFsaWQgcmVxdWlyZW1lbnRzIGxpc3QiIiIKICAgIHRyeToKICAgICAgICBsaXN0KHBrZ19yZXNvdXJjZXMucGFyc2VfcmVxdWlyZW1lbnRzKHZhbHVlKSkKICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCAoZGljdCwgc2V0KSk6CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiVW5vcmRlcmVkIHR5cGVzIGFyZSBub3QgYWxsb3dlZCIpCiAgICBleGNlcHQgKFR5cGVFcnJvciwgVmFsdWVFcnJvcikgYXMgZXJyb3I6CiAgICAgICAgdG1wbCA9ICgKICAgICAgICAgICAgInthdHRyIXJ9IG11c3QgYmUgYSBzdHJpbmcgb3IgbGlzdCBvZiBzdHJpbmdzICIKICAgICAgICAgICAgImNvbnRhaW5pbmcgdmFsaWQgcHJvamVjdC92ZXJzaW9uIHJlcXVpcmVtZW50IHNwZWNpZmllcnM7IHtlcnJvcn0iCiAgICAgICAgKQogICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IodG1wbC5mb3JtYXQoYXR0cj1hdHRyLCBlcnJvcj1lcnJvcikpCgoKZGVmIGNoZWNrX3NwZWNpZmllcihkaXN0LCBhdHRyLCB2YWx1ZSk6CiAgICAiIiJWZXJpZnkgdGhhdCB2YWx1ZSBpcyBhIHZhbGlkIHZlcnNpb24gc3BlY2lmaWVyIiIiCiAgICB0cnk6CiAgICAgICAgcGFja2FnaW5nLnNwZWNpZmllcnMuU3BlY2lmaWVyU2V0KHZhbHVlKQogICAgZXhjZXB0IHBhY2thZ2luZy5zcGVjaWZpZXJzLkludmFsaWRTcGVjaWZpZXIgYXMgZXJyb3I6CiAgICAgICAgdG1wbCA9ICgKICAgICAgICAgICAgInthdHRyIXJ9IG11c3QgYmUgYSBzdHJpbmcgIgogICAgICAgICAgICAiY29udGFpbmluZyB2YWxpZCB2ZXJzaW9uIHNwZWNpZmllcnM7IHtlcnJvcn0iCiAgICAgICAgKQogICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IodG1wbC5mb3JtYXQoYXR0cj1hdHRyLCBlcnJvcj1lcnJvcikpCgoKZGVmIGNoZWNrX2VudHJ5X3BvaW50cyhkaXN0LCBhdHRyLCB2YWx1ZSk6CiAgICAiIiJWZXJpZnkgdGhhdCBlbnRyeV9wb2ludHMgbWFwIGlzIHBhcnNlYWJsZSIiIgogICAgdHJ5OgogICAgICAgIHBrZ19yZXNvdXJjZXMuRW50cnlQb2ludC5wYXJzZV9tYXAodmFsdWUpCiAgICBleGNlcHQgVmFsdWVFcnJvciBhcyBlOgogICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoZSkKCgpkZWYgY2hlY2tfdGVzdF9zdWl0ZShkaXN0LCBhdHRyLCB2YWx1ZSk6CiAgICBpZiBub3QgaXNpbnN0YW5jZSh2YWx1ZSwgc2l4LnN0cmluZ190eXBlcyk6CiAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigidGVzdF9zdWl0ZSBtdXN0IGJlIGEgc3RyaW5nIikKCgpkZWYgY2hlY2tfcGFja2FnZV9kYXRhKGRpc3QsIGF0dHIsIHZhbHVlKToKICAgICIiIlZlcmlmeSB0aGF0IHZhbHVlIGlzIGEgZGljdGlvbmFyeSBvZiBwYWNrYWdlIG5hbWVzIHRvIGdsb2IgbGlzdHMiIiIKICAgIGlmIG5vdCBpc2luc3RhbmNlKHZhbHVlLCBkaWN0KToKICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAogICAgICAgICAgICAieyFyfSBtdXN0IGJlIGEgZGljdGlvbmFyeSBtYXBwaW5nIHBhY2thZ2UgbmFtZXMgdG8gbGlzdHMgb2YgIgogICAgICAgICAgICAic3RyaW5nIHdpbGRjYXJkIHBhdHRlcm5zIi5mb3JtYXQoYXR0cikpCiAgICBmb3IgaywgdiBpbiB2YWx1ZS5pdGVtcygpOgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGssIHNpeC5zdHJpbmdfdHlwZXMpOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAogICAgICAgICAgICAgICAgImtleXMgb2YgeyFyfSBkaWN0IG11c3QgYmUgc3RyaW5ncyAoZ290IHshcn0pIgogICAgICAgICAgICAgICAgLmZvcm1hdChhdHRyLCBrKQogICAgICAgICAgICApCiAgICAgICAgYXNzZXJ0X3N0cmluZ19saXN0KGRpc3QsICd2YWx1ZXMgb2YgeyFyfSBkaWN0Jy5mb3JtYXQoYXR0ciksIHYpCgoKZGVmIGNoZWNrX3BhY2thZ2VzKGRpc3QsIGF0dHIsIHZhbHVlKToKICAgIGZvciBwa2duYW1lIGluIHZhbHVlOgogICAgICAgIGlmIG5vdCByZS5tYXRjaChyJ1x3KyhcLlx3KykqJywgcGtnbmFtZSk6CiAgICAgICAgICAgIGRpc3R1dGlscy5sb2cud2FybigKICAgICAgICAgICAgICAgICJXQVJOSU5HOiAlciBub3QgYSB2YWxpZCBwYWNrYWdlIG5hbWU7IHBsZWFzZSB1c2Ugb25seSAiCiAgICAgICAgICAgICAgICAiLi1zZXBhcmF0ZWQgcGFja2FnZSBuYW1lcyBpbiBzZXR1cC5weSIsIHBrZ25hbWUKICAgICAgICAgICAgKQoKCl9EaXN0cmlidXRpb24gPSBnZXRfdW5wYXRjaGVkKGRpc3R1dGlscy5jb3JlLkRpc3RyaWJ1dGlvbikKCgpjbGFzcyBEaXN0cmlidXRpb24oX0Rpc3RyaWJ1dGlvbik6CiAgICAiIiJEaXN0cmlidXRpb24gd2l0aCBzdXBwb3J0IGZvciBmZWF0dXJlcywgdGVzdHMsIGFuZCBwYWNrYWdlIGRhdGEKCiAgICBUaGlzIGlzIGFuIGVuaGFuY2VkIHZlcnNpb24gb2YgJ2Rpc3R1dGlscy5kaXN0LkRpc3RyaWJ1dGlvbicgdGhhdAogICAgZWZmZWN0aXZlbHkgYWRkcyB0aGUgZm9sbG93aW5nIG5ldyBvcHRpb25hbCBrZXl3b3JkIGFyZ3VtZW50cyB0byAnc2V0dXAoKSc6CgogICAgICdpbnN0YWxsX3JlcXVpcmVzJyAtLSBhIHN0cmluZyBvciBzZXF1ZW5jZSBvZiBzdHJpbmdzIHNwZWNpZnlpbmcgcHJvamVjdAogICAgICAgIHZlcnNpb25zIHRoYXQgdGhlIGRpc3RyaWJ1dGlvbiByZXF1aXJlcyB3aGVuIGluc3RhbGxlZCwgaW4gdGhlIGZvcm1hdAogICAgICAgIHVzZWQgYnkgJ3BrZ19yZXNvdXJjZXMucmVxdWlyZSgpJy4gIFRoZXkgd2lsbCBiZSBpbnN0YWxsZWQKICAgICAgICBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIHBhY2thZ2UgaXMgaW5zdGFsbGVkLiAgSWYgeW91IHdpc2ggdG8gdXNlCiAgICAgICAgcGFja2FnZXMgdGhhdCBhcmUgbm90IGF2YWlsYWJsZSBpbiBQeVBJLCBvciB3YW50IHRvIGdpdmUgeW91ciB1c2VycyBhbgogICAgICAgIGFsdGVybmF0ZSBkb3dubG9hZCBsb2NhdGlvbiwgeW91IGNhbiBhZGQgYSAnZmluZF9saW5rcycgb3B0aW9uIHRvIHRoZQogICAgICAgICdbZWFzeV9pbnN0YWxsXScgc2VjdGlvbiBvZiB5b3VyIHByb2plY3QncyAnc2V0dXAuY2ZnJyBmaWxlLCBhbmQgdGhlbgogICAgICAgIHNldHVwdG9vbHMgd2lsbCBzY2FuIHRoZSBsaXN0ZWQgd2ViIHBhZ2VzIGZvciBsaW5rcyB0aGF0IHNhdGlzZnkgdGhlCiAgICAgICAgcmVxdWlyZW1lbnRzLgoKICAgICAnZXh0cmFzX3JlcXVpcmUnIC0tIGEgZGljdGlvbmFyeSBtYXBwaW5nIG5hbWVzIG9mIG9wdGlvbmFsICJleHRyYXMiIHRvIHRoZQogICAgICAgIGFkZGl0aW9uYWwgcmVxdWlyZW1lbnQocykgdGhhdCB1c2luZyB0aG9zZSBleHRyYXMgaW5jdXJzLiBGb3IgZXhhbXBsZSwKICAgICAgICB0aGlzOjoKCiAgICAgICAgICAgIGV4dHJhc19yZXF1aXJlID0gZGljdChyZVNUID0gWyJkb2N1dGlscz49MC4zIiwgInJlU1RlZGl0Il0pCgogICAgICAgIGluZGljYXRlcyB0aGF0IHRoZSBkaXN0cmlidXRpb24gY2FuIG9wdGlvbmFsbHkgcHJvdmlkZSBhbiBleHRyYQogICAgICAgIGNhcGFiaWxpdHkgY2FsbGVkICJyZVNUIiwgYnV0IGl0IGNhbiBvbmx5IGJlIHVzZWQgaWYgZG9jdXRpbHMgYW5kCiAgICAgICAgcmVTVGVkaXQgYXJlIGluc3RhbGxlZC4gIElmIHRoZSB1c2VyIGluc3RhbGxzIHlvdXIgcGFja2FnZSB1c2luZwogICAgICAgIEVhc3lJbnN0YWxsIGFuZCByZXF1ZXN0cyBvbmUgb2YgeW91ciBleHRyYXMsIHRoZSBjb3JyZXNwb25kaW5nCiAgICAgICAgYWRkaXRpb25hbCByZXF1aXJlbWVudHMgd2lsbCBiZSBpbnN0YWxsZWQgaWYgbmVlZGVkLgoKICAgICAnZmVhdHVyZXMnICoqZGVwcmVjYXRlZCoqIC0tIGEgZGljdGlvbmFyeSBtYXBwaW5nIG9wdGlvbiBuYW1lcyB0bwogICAgICAgICdzZXR1cHRvb2xzLkZlYXR1cmUnCiAgICAgICAgb2JqZWN0cy4gIEZlYXR1cmVzIGFyZSBhIHBvcnRpb24gb2YgdGhlIGRpc3RyaWJ1dGlvbiB0aGF0IGNhbiBiZQogICAgICAgIGluY2x1ZGVkIG9yIGV4Y2x1ZGVkIGJhc2VkIG9uIHVzZXIgb3B0aW9ucywgaW50ZXItZmVhdHVyZSBkZXBlbmRlbmNpZXMsCiAgICAgICAgYW5kIGF2YWlsYWJpbGl0eSBvbiB0aGUgY3VycmVudCBzeXN0ZW0uICBFeGNsdWRlZCBmZWF0dXJlcyBhcmUgb21pdHRlZAogICAgICAgIGZyb20gYWxsIHNldHVwIGNvbW1hbmRzLCBpbmNsdWRpbmcgc291cmNlIGFuZCBiaW5hcnkgZGlzdHJpYnV0aW9ucywgc28KICAgICAgICB5b3UgY2FuIGNyZWF0ZSBtdWx0aXBsZSBkaXN0cmlidXRpb25zIGZyb20gdGhlIHNhbWUgc291cmNlIHRyZWUuCiAgICAgICAgRmVhdHVyZSBuYW1lcyBzaG91bGQgYmUgdmFsaWQgUHl0aG9uIGlkZW50aWZpZXJzLCBleGNlcHQgdGhhdCB0aGV5IG1heQogICAgICAgIGNvbnRhaW4gdGhlICctJyAobWludXMpIHNpZ24uICBGZWF0dXJlcyBjYW4gYmUgaW5jbHVkZWQgb3IgZXhjbHVkZWQKICAgICAgICB2aWEgdGhlIGNvbW1hbmQgbGluZSBvcHRpb25zICctLXdpdGgtWCcgYW5kICctLXdpdGhvdXQtWCcsIHdoZXJlICdYJyBpcwogICAgICAgIHRoZSBuYW1lIG9mIHRoZSBmZWF0dXJlLiAgV2hldGhlciBhIGZlYXR1cmUgaXMgaW5jbHVkZWQgYnkgZGVmYXVsdCwgYW5kCiAgICAgICAgd2hldGhlciB5b3UgYXJlIGFsbG93ZWQgdG8gY29udHJvbCB0aGlzIGZyb20gdGhlIGNvbW1hbmQgbGluZSwgaXMKICAgICAgICBkZXRlcm1pbmVkIGJ5IHRoZSBGZWF0dXJlIG9iamVjdC4gIFNlZSB0aGUgJ0ZlYXR1cmUnIGNsYXNzIGZvciBtb3JlCiAgICAgICAgaW5mb3JtYXRpb24uCgogICAgICd0ZXN0X3N1aXRlJyAtLSB0aGUgbmFtZSBvZiBhIHRlc3Qgc3VpdGUgdG8gcnVuIGZvciB0aGUgJ3Rlc3QnIGNvbW1hbmQuCiAgICAgICAgSWYgdGhlIHVzZXIgcnVucyAncHl0aG9uIHNldHVwLnB5IHRlc3QnLCB0aGUgcGFja2FnZSB3aWxsIGJlIGluc3RhbGxlZCwKICAgICAgICBhbmQgdGhlIG5hbWVkIHRlc3Qgc3VpdGUgd2lsbCBiZSBydW4uICBUaGUgZm9ybWF0IGlzIHRoZSBzYW1lIGFzCiAgICAgICAgd291bGQgYmUgdXNlZCBvbiBhICd1bml0dGVzdC5weScgY29tbWFuZCBsaW5lLiAgVGhhdCBpcywgaXQgaXMgdGhlCiAgICAgICAgZG90dGVkIG5hbWUgb2YgYW4gb2JqZWN0IHRvIGltcG9ydCBhbmQgY2FsbCB0byBnZW5lcmF0ZSBhIHRlc3Qgc3VpdGUuCgogICAgICdwYWNrYWdlX2RhdGEnIC0tIGEgZGljdGlvbmFyeSBtYXBwaW5nIHBhY2thZ2UgbmFtZXMgdG8gbGlzdHMgb2YgZmlsZW5hbWVzCiAgICAgICAgb3IgZ2xvYnMgdG8gdXNlIHRvIGZpbmQgZGF0YSBmaWxlcyBjb250YWluZWQgaW4gdGhlIG5hbWVkIHBhY2thZ2VzLgogICAgICAgIElmIHRoZSBkaWN0aW9uYXJ5IGhhcyBmaWxlbmFtZXMgb3IgZ2xvYnMgbGlzdGVkIHVuZGVyICciIicgKHRoZSBlbXB0eQogICAgICAgIHN0cmluZyksIHRob3NlIG5hbWVzIHdpbGwgYmUgc2VhcmNoZWQgZm9yIGluIGV2ZXJ5IHBhY2thZ2UsIGluIGFkZGl0aW9uCiAgICAgICAgdG8gYW55IG5hbWVzIGZvciB0aGUgc3BlY2lmaWMgcGFja2FnZS4gIERhdGEgZmlsZXMgZm91bmQgdXNpbmcgdGhlc2UKICAgICAgICBuYW1lcy9nbG9icyB3aWxsIGJlIGluc3RhbGxlZCBhbG9uZyB3aXRoIHRoZSBwYWNrYWdlLCBpbiB0aGUgc2FtZQogICAgICAgIGxvY2F0aW9uIGFzIHRoZSBwYWNrYWdlLiAgTm90ZSB0aGF0IGdsb2JzIGFyZSBhbGxvd2VkIHRvIHJlZmVyZW5jZQogICAgICAgIHRoZSBjb250ZW50cyBvZiBub24tcGFja2FnZSBzdWJkaXJlY3RvcmllcywgYXMgbG9uZyBhcyB5b3UgdXNlICcvJyBhcwogICAgICAgIGEgcGF0aCBzZXBhcmF0b3IuICAoR2xvYnMgYXJlIGF1dG9tYXRpY2FsbHkgY29udmVydGVkIHRvCiAgICAgICAgcGxhdGZvcm0tc3BlY2lmaWMgcGF0aHMgYXQgcnVudGltZS4pCgogICAgSW4gYWRkaXRpb24gdG8gdGhlc2UgbmV3IGtleXdvcmRzLCB0aGlzIGNsYXNzIGFsc28gaGFzIHNldmVyYWwgbmV3IG1ldGhvZHMKICAgIGZvciBtYW5pcHVsYXRpbmcgdGhlIGRpc3RyaWJ1dGlvbidzIGNvbnRlbnRzLiAgRm9yIGV4YW1wbGUsIHRoZSAnaW5jbHVkZSgpJwogICAgYW5kICdleGNsdWRlKCknIG1ldGhvZHMgY2FuIGJlIHRob3VnaHQgb2YgYXMgaW4tcGxhY2UgYWRkIGFuZCBzdWJ0cmFjdAogICAgY29tbWFuZHMgdGhhdCBhZGQgb3IgcmVtb3ZlIHBhY2thZ2VzLCBtb2R1bGVzLCBleHRlbnNpb25zLCBhbmQgc28gb24gZnJvbQogICAgdGhlIGRpc3RyaWJ1dGlvbi4gIFRoZXkgYXJlIHVzZWQgYnkgdGhlIGZlYXR1cmUgc3Vic3lzdGVtIHRvIGNvbmZpZ3VyZSB0aGUKICAgIGRpc3RyaWJ1dGlvbiBmb3IgdGhlIGluY2x1ZGVkIGFuZCBleGNsdWRlZCBmZWF0dXJlcy4KICAgICIiIgoKICAgIF9ESVNUVVRJTFNfVU5TVVBQT1JURURfTUVUQURBVEEgPSB7CiAgICAgICAgJ2xvbmdfZGVzY3JpcHRpb25fY29udGVudF90eXBlJzogTm9uZSwKICAgICAgICAncHJvamVjdF91cmxzJzogZGljdCwKICAgICAgICAncHJvdmlkZXNfZXh0cmFzJzogb3JkZXJlZF9zZXQuT3JkZXJlZFNldCwKICAgICAgICAnbGljZW5zZV9maWxlcyc6IG9yZGVyZWRfc2V0Lk9yZGVyZWRTZXQsCiAgICB9CgogICAgX3BhdGNoZWRfZGlzdCA9IE5vbmUKCiAgICBkZWYgcGF0Y2hfbWlzc2luZ19wa2dfaW5mbyhzZWxmLCBhdHRycyk6CiAgICAgICAgIyBGYWtlIHVwIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBkYXRhIHRoYXQgd291bGQgbm9ybWFsbHkgY29tZSBmcm9tCiAgICAgICAgIyBQS0ctSU5GTywgYnV0IHdoaWNoIG1pZ2h0IG5vdCB5ZXQgYmUgYnVpbHQgaWYgdGhpcyBpcyBhIGZyZXNoCiAgICAgICAgIyBjaGVja291dC4KICAgICAgICAjCiAgICAgICAgaWYgbm90IGF0dHJzIG9yICduYW1lJyBub3QgaW4gYXR0cnMgb3IgJ3ZlcnNpb24nIG5vdCBpbiBhdHRyczoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAga2V5ID0gcGtnX3Jlc291cmNlcy5zYWZlX25hbWUoc3RyKGF0dHJzWyduYW1lJ10pKS5sb3dlcigpCiAgICAgICAgZGlzdCA9IHBrZ19yZXNvdXJjZXMud29ya2luZ19zZXQuYnlfa2V5LmdldChrZXkpCiAgICAgICAgaWYgZGlzdCBpcyBub3QgTm9uZSBhbmQgbm90IGRpc3QuaGFzX21ldGFkYXRhKCdQS0ctSU5GTycpOgogICAgICAgICAgICBkaXN0Ll92ZXJzaW9uID0gcGtnX3Jlc291cmNlcy5zYWZlX3ZlcnNpb24oc3RyKGF0dHJzWyd2ZXJzaW9uJ10pKQogICAgICAgICAgICBzZWxmLl9wYXRjaGVkX2Rpc3QgPSBkaXN0CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGF0dHJzPU5vbmUpOgogICAgICAgIGhhdmVfcGFja2FnZV9kYXRhID0gaGFzYXR0cihzZWxmLCAicGFja2FnZV9kYXRhIikKICAgICAgICBpZiBub3QgaGF2ZV9wYWNrYWdlX2RhdGE6CiAgICAgICAgICAgIHNlbGYucGFja2FnZV9kYXRhID0ge30KICAgICAgICBhdHRycyA9IGF0dHJzIG9yIHt9CiAgICAgICAgaWYgJ2ZlYXR1cmVzJyBpbiBhdHRycyBvciAncmVxdWlyZV9mZWF0dXJlcycgaW4gYXR0cnM6CiAgICAgICAgICAgIEZlYXR1cmUud2Fybl9kZXByZWNhdGVkKCkKICAgICAgICBzZWxmLnJlcXVpcmVfZmVhdHVyZXMgPSBbXQogICAgICAgIHNlbGYuZmVhdHVyZXMgPSB7fQogICAgICAgIHNlbGYuZGlzdF9maWxlcyA9IFtdCiAgICAgICAgIyBGaWx0ZXItb3V0IHNldHVwdG9vbHMnIHNwZWNpZmljIG9wdGlvbnMuCiAgICAgICAgc2VsZi5zcmNfcm9vdCA9IGF0dHJzLnBvcCgic3JjX3Jvb3QiLCBOb25lKQogICAgICAgIHNlbGYucGF0Y2hfbWlzc2luZ19wa2dfaW5mbyhhdHRycykKICAgICAgICBzZWxmLmRlcGVuZGVuY3lfbGlua3MgPSBhdHRycy5wb3AoJ2RlcGVuZGVuY3lfbGlua3MnLCBbXSkKICAgICAgICBzZWxmLnNldHVwX3JlcXVpcmVzID0gYXR0cnMucG9wKCdzZXR1cF9yZXF1aXJlcycsIFtdKQogICAgICAgIGZvciBlcCBpbiBwa2dfcmVzb3VyY2VzLml0ZXJfZW50cnlfcG9pbnRzKCdkaXN0dXRpbHMuc2V0dXBfa2V5d29yZHMnKToKICAgICAgICAgICAgdmFycyhzZWxmKS5zZXRkZWZhdWx0KGVwLm5hbWUsIE5vbmUpCiAgICAgICAgX0Rpc3RyaWJ1dGlvbi5fX2luaXRfXyhzZWxmLCB7CiAgICAgICAgICAgIGs6IHYgZm9yIGssIHYgaW4gYXR0cnMuaXRlbXMoKQogICAgICAgICAgICBpZiBrIG5vdCBpbiBzZWxmLl9ESVNUVVRJTFNfVU5TVVBQT1JURURfTUVUQURBVEEKICAgICAgICB9KQoKICAgICAgICAjIEZpbGwtaW4gbWlzc2luZyBtZXRhZGF0YSBmaWVsZHMgbm90IHN1cHBvcnRlZCBieSBkaXN0dXRpbHMuCiAgICAgICAgIyBOb3RlIHNvbWUgZmllbGRzIG1heSBoYXZlIGJlZW4gc2V0IGJ5IG90aGVyIHRvb2xzIChlLmcuIHBicikKICAgICAgICAjIGFib3ZlOyB0aGV5IGFyZSB0YWtlbiBwcmVmZXJyZW50aWFsbHkgdG8gc2V0dXAoKSBhcmd1bWVudHMKICAgICAgICBmb3Igb3B0aW9uLCBkZWZhdWx0IGluIHNlbGYuX0RJU1RVVElMU19VTlNVUFBPUlRFRF9NRVRBREFUQS5pdGVtcygpOgogICAgICAgICAgICBmb3Igc291cmNlIGluIHNlbGYubWV0YWRhdGEuX19kaWN0X18sIGF0dHJzOgogICAgICAgICAgICAgICAgaWYgb3B0aW9uIGluIHNvdXJjZToKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHNvdXJjZVtvcHRpb25dCiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHZhbHVlID0gZGVmYXVsdCgpIGlmIGRlZmF1bHQgZWxzZSBOb25lCiAgICAgICAgICAgIHNldGF0dHIoc2VsZi5tZXRhZGF0YSwgb3B0aW9uLCB2YWx1ZSkKCiAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLm1ldGFkYXRhLnZlcnNpb24sIG51bWJlcnMuTnVtYmVyKToKICAgICAgICAgICAgIyBTb21lIHBlb3BsZSBhcHBhcmVudGx5IHRha2UgInZlcnNpb24gbnVtYmVyIiB0b28gbGl0ZXJhbGx5IDopCiAgICAgICAgICAgIHNlbGYubWV0YWRhdGEudmVyc2lvbiA9IHN0cihzZWxmLm1ldGFkYXRhLnZlcnNpb24pCgogICAgICAgIGlmIHNlbGYubWV0YWRhdGEudmVyc2lvbiBpcyBub3QgTm9uZToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgdmVyID0gcGFja2FnaW5nLnZlcnNpb24uVmVyc2lvbihzZWxmLm1ldGFkYXRhLnZlcnNpb24pCiAgICAgICAgICAgICAgICBub3JtYWxpemVkX3ZlcnNpb24gPSBzdHIodmVyKQogICAgICAgICAgICAgICAgaWYgc2VsZi5tZXRhZGF0YS52ZXJzaW9uICE9IG5vcm1hbGl6ZWRfdmVyc2lvbjoKICAgICAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKAogICAgICAgICAgICAgICAgICAgICAgICAiTm9ybWFsaXppbmcgJyVzJyB0byAnJXMnIiAlICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubWV0YWRhdGEudmVyc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRfdmVyc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICBzZWxmLm1ldGFkYXRhLnZlcnNpb24gPSBub3JtYWxpemVkX3ZlcnNpb24KICAgICAgICAgICAgZXhjZXB0IChwYWNrYWdpbmcudmVyc2lvbi5JbnZhbGlkVmVyc2lvbiwgVHlwZUVycm9yKToKICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCiAgICAgICAgICAgICAgICAgICAgIlRoZSB2ZXJzaW9uIHNwZWNpZmllZCAoJXIpIGlzIGFuIGludmFsaWQgdmVyc2lvbiwgdGhpcyAiCiAgICAgICAgICAgICAgICAgICAgIm1heSBub3Qgd29yayBhcyBleHBlY3RlZCB3aXRoIG5ld2VyIHZlcnNpb25zIG9mICIKICAgICAgICAgICAgICAgICAgICAic2V0dXB0b29scywgcGlwLCBhbmQgUHlQSS4gUGxlYXNlIHNlZSBQRVAgNDQwIGZvciBtb3JlICIKICAgICAgICAgICAgICAgICAgICAiZGV0YWlscy4iICUgc2VsZi5tZXRhZGF0YS52ZXJzaW9uCiAgICAgICAgICAgICAgICApCiAgICAgICAgc2VsZi5fZmluYWxpemVfcmVxdWlyZXMoKQoKICAgIGRlZiBfZmluYWxpemVfcmVxdWlyZXMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgU2V0IGBtZXRhZGF0YS5weXRob25fcmVxdWlyZXNgIGFuZCBmaXggZW52aXJvbm1lbnQgbWFya2VycwogICAgICAgIGluIGBpbnN0YWxsX3JlcXVpcmVzYCBhbmQgYGV4dHJhc19yZXF1aXJlYC4KICAgICAgICAiIiIKICAgICAgICBpZiBnZXRhdHRyKHNlbGYsICdweXRob25fcmVxdWlyZXMnLCBOb25lKToKICAgICAgICAgICAgc2VsZi5tZXRhZGF0YS5weXRob25fcmVxdWlyZXMgPSBzZWxmLnB5dGhvbl9yZXF1aXJlcwoKICAgICAgICBpZiBnZXRhdHRyKHNlbGYsICdleHRyYXNfcmVxdWlyZScsIE5vbmUpOgogICAgICAgICAgICBmb3IgZXh0cmEgaW4gc2VsZi5leHRyYXNfcmVxdWlyZS5rZXlzKCk6CiAgICAgICAgICAgICAgICAjIFNpbmNlIHRoaXMgZ2V0cyBjYWxsZWQgbXVsdGlwbGUgdGltZXMgYXQgcG9pbnRzIHdoZXJlIHRoZQogICAgICAgICAgICAgICAgIyBrZXlzIGhhdmUgYmVjb21lICdjb252ZXJ0ZWQnIGV4dHJhcywgZW5zdXJlIHRoYXQgd2UgYXJlIG9ubHkKICAgICAgICAgICAgICAgICMgdHJ1bHkgYWRkaW5nIGV4dHJhcyB3ZSBoYXZlbid0IHNlZW4gYmVmb3JlIGhlcmUuCiAgICAgICAgICAgICAgICBleHRyYSA9IGV4dHJhLnNwbGl0KCc6JylbMF0KICAgICAgICAgICAgICAgIGlmIGV4dHJhOgogICAgICAgICAgICAgICAgICAgIHNlbGYubWV0YWRhdGEucHJvdmlkZXNfZXh0cmFzLmFkZChleHRyYSkKCiAgICAgICAgc2VsZi5fY29udmVydF9leHRyYXNfcmVxdWlyZW1lbnRzKCkKICAgICAgICBzZWxmLl9tb3ZlX2luc3RhbGxfcmVxdWlyZW1lbnRzX21hcmtlcnMoKQoKICAgIGRlZiBfY29udmVydF9leHRyYXNfcmVxdWlyZW1lbnRzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIENvbnZlcnQgcmVxdWlyZW1lbnRzIGluIGBleHRyYXNfcmVxdWlyZWAgb2YgdGhlIGZvcm0KICAgICAgICBgImV4dHJhIjogWyJiYXJiYXpxdXV4OyB7bWFya2VyfSJdYCB0bwogICAgICAgIGAiZXh0cmE6e21hcmtlcn0iOiBbImJhcmJhenF1dXgiXWAuCiAgICAgICAgIiIiCiAgICAgICAgc3BlY19leHRfcmVxcyA9IGdldGF0dHIoc2VsZiwgJ2V4dHJhc19yZXF1aXJlJywgTm9uZSkgb3Ige30KICAgICAgICBzZWxmLl90bXBfZXh0cmFzX3JlcXVpcmUgPSBkZWZhdWx0ZGljdChsaXN0KQogICAgICAgIGZvciBzZWN0aW9uLCB2IGluIHNwZWNfZXh0X3JlcXMuaXRlbXMoKToKICAgICAgICAgICAgIyBEbyBub3Qgc3RyaXAgZW1wdHkgc2VjdGlvbnMuCiAgICAgICAgICAgIHNlbGYuX3RtcF9leHRyYXNfcmVxdWlyZVtzZWN0aW9uXQogICAgICAgICAgICBmb3IgciBpbiBwa2dfcmVzb3VyY2VzLnBhcnNlX3JlcXVpcmVtZW50cyh2KToKICAgICAgICAgICAgICAgIHN1ZmZpeCA9IHNlbGYuX3N1ZmZpeF9mb3IocikKICAgICAgICAgICAgICAgIHNlbGYuX3RtcF9leHRyYXNfcmVxdWlyZVtzZWN0aW9uICsgc3VmZml4XS5hcHBlbmQocikKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX3N1ZmZpeF9mb3IocmVxKToKICAgICAgICAiIiIKICAgICAgICBGb3IgYSByZXF1aXJlbWVudCwgcmV0dXJuIHRoZSAnZXh0cmFzX3JlcXVpcmUnIHN1ZmZpeCBmb3IKICAgICAgICB0aGF0IHJlcXVpcmVtZW50LgogICAgICAgICIiIgogICAgICAgIHJldHVybiAnOicgKyBzdHIocmVxLm1hcmtlcikgaWYgcmVxLm1hcmtlciBlbHNlICcnCgogICAgZGVmIF9tb3ZlX2luc3RhbGxfcmVxdWlyZW1lbnRzX21hcmtlcnMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTW92ZSByZXF1aXJlbWVudHMgaW4gYGluc3RhbGxfcmVxdWlyZXNgIHRoYXQgYXJlIHVzaW5nIGVudmlyb25tZW50CiAgICAgICAgbWFya2VycyBgZXh0cmFzX3JlcXVpcmVgLgogICAgICAgICIiIgoKICAgICAgICAjIGRpdmlkZSB0aGUgaW5zdGFsbF9yZXF1aXJlcyBpbnRvIHR3byBzZXRzLCBzaW1wbGUgb25lcyBzdGlsbAogICAgICAgICMgaGFuZGxlZCBieSBpbnN0YWxsX3JlcXVpcmVzIGFuZCBtb3JlIGNvbXBsZXggb25lcyBoYW5kbGVkCiAgICAgICAgIyBieSBleHRyYXNfcmVxdWlyZS4KCiAgICAgICAgZGVmIGlzX3NpbXBsZV9yZXEocmVxKToKICAgICAgICAgICAgcmV0dXJuIG5vdCByZXEubWFya2VyCgogICAgICAgIHNwZWNfaW5zdF9yZXFzID0gZ2V0YXR0cihzZWxmLCAnaW5zdGFsbF9yZXF1aXJlcycsIE5vbmUpIG9yICgpCiAgICAgICAgaW5zdF9yZXFzID0gbGlzdChwa2dfcmVzb3VyY2VzLnBhcnNlX3JlcXVpcmVtZW50cyhzcGVjX2luc3RfcmVxcykpCiAgICAgICAgc2ltcGxlX3JlcXMgPSBmaWx0ZXIoaXNfc2ltcGxlX3JlcSwgaW5zdF9yZXFzKQogICAgICAgIGNvbXBsZXhfcmVxcyA9IGZpbHRlcmZhbHNlKGlzX3NpbXBsZV9yZXEsIGluc3RfcmVxcykKICAgICAgICBzZWxmLmluc3RhbGxfcmVxdWlyZXMgPSBsaXN0KG1hcChzdHIsIHNpbXBsZV9yZXFzKSkKCiAgICAgICAgZm9yIHIgaW4gY29tcGxleF9yZXFzOgogICAgICAgICAgICBzZWxmLl90bXBfZXh0cmFzX3JlcXVpcmVbJzonICsgc3RyKHIubWFya2VyKV0uYXBwZW5kKHIpCiAgICAgICAgc2VsZi5leHRyYXNfcmVxdWlyZSA9IGRpY3QoCiAgICAgICAgICAgIChrLCBbc3RyKHIpIGZvciByIGluIG1hcChzZWxmLl9jbGVhbl9yZXEsIHYpXSkKICAgICAgICAgICAgZm9yIGssIHYgaW4gc2VsZi5fdG1wX2V4dHJhc19yZXF1aXJlLml0ZW1zKCkKICAgICAgICApCgogICAgZGVmIF9jbGVhbl9yZXEoc2VsZiwgcmVxKToKICAgICAgICAiIiIKICAgICAgICBHaXZlbiBhIFJlcXVpcmVtZW50LCByZW1vdmUgZW52aXJvbm1lbnQgbWFya2VycyBhbmQgcmV0dXJuIGl0LgogICAgICAgICIiIgogICAgICAgIHJlcS5tYXJrZXIgPSBOb25lCiAgICAgICAgcmV0dXJuIHJlcQoKICAgIGRlZiBfcGFyc2VfY29uZmlnX2ZpbGVzKHNlbGYsIGZpbGVuYW1lcz1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBBZGFwdGVkIGZyb20gZGlzdHV0aWxzLmRpc3QuRGlzdHJpYnV0aW9uLnBhcnNlX2NvbmZpZ19maWxlcywKICAgICAgICB0aGlzIG1ldGhvZCBwcm92aWRlcyB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IGluIHN1YnRseS1pbXByb3ZlZAogICAgICAgIHdheXMuCiAgICAgICAgIiIiCiAgICAgICAgZnJvbSBzZXR1cHRvb2xzLmV4dGVybi5zaXgubW92ZXMuY29uZmlncGFyc2VyIGltcG9ydCBDb25maWdQYXJzZXIKCiAgICAgICAgIyBJZ25vcmUgaW5zdGFsbCBkaXJlY3Rvcnkgb3B0aW9ucyBpZiB3ZSBoYXZlIGEgdmVudgogICAgICAgIGlmIHNpeC5QWTMgYW5kIHN5cy5wcmVmaXggIT0gc3lzLmJhc2VfcHJlZml4OgogICAgICAgICAgICBpZ25vcmVfb3B0aW9ucyA9IFsKICAgICAgICAgICAgICAgICdpbnN0YWxsLWJhc2UnLCAnaW5zdGFsbC1wbGF0YmFzZScsICdpbnN0YWxsLWxpYicsCiAgICAgICAgICAgICAgICAnaW5zdGFsbC1wbGF0bGliJywgJ2luc3RhbGwtcHVyZWxpYicsICdpbnN0YWxsLWhlYWRlcnMnLAogICAgICAgICAgICAgICAgJ2luc3RhbGwtc2NyaXB0cycsICdpbnN0YWxsLWRhdGEnLCAncHJlZml4JywgJ2V4ZWMtcHJlZml4JywKICAgICAgICAgICAgICAgICdob21lJywgJ3VzZXInLCAncm9vdCddCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaWdub3JlX29wdGlvbnMgPSBbXQoKICAgICAgICBpZ25vcmVfb3B0aW9ucyA9IGZyb3plbnNldChpZ25vcmVfb3B0aW9ucykKCiAgICAgICAgaWYgZmlsZW5hbWVzIGlzIE5vbmU6CiAgICAgICAgICAgIGZpbGVuYW1lcyA9IHNlbGYuZmluZF9jb25maWdfZmlsZXMoKQoKICAgICAgICBpZiBERUJVRzoKICAgICAgICAgICAgc2VsZi5hbm5vdW5jZSgiRGlzdHJpYnV0aW9uLnBhcnNlX2NvbmZpZ19maWxlcygpOiIpCgogICAgICAgIHBhcnNlciA9IENvbmZpZ1BhcnNlcigpCiAgICAgICAgZm9yIGZpbGVuYW1lIGluIGZpbGVuYW1lczoKICAgICAgICAgICAgd2l0aCBpby5vcGVuKGZpbGVuYW1lLCBlbmNvZGluZz0ndXRmLTgnKSBhcyByZWFkZXI6CiAgICAgICAgICAgICAgICBpZiBERUJVRzoKICAgICAgICAgICAgICAgICAgICBzZWxmLmFubm91bmNlKCIgIHJlYWRpbmcge2ZpbGVuYW1lfSIuZm9ybWF0KCoqbG9jYWxzKCkpKQogICAgICAgICAgICAgICAgKHBhcnNlci5yZWFkX2ZpbGUgaWYgc2l4LlBZMyBlbHNlIHBhcnNlci5yZWFkZnApKHJlYWRlcikKICAgICAgICAgICAgZm9yIHNlY3Rpb24gaW4gcGFyc2VyLnNlY3Rpb25zKCk6CiAgICAgICAgICAgICAgICBvcHRpb25zID0gcGFyc2VyLm9wdGlvbnMoc2VjdGlvbikKICAgICAgICAgICAgICAgIG9wdF9kaWN0ID0gc2VsZi5nZXRfb3B0aW9uX2RpY3Qoc2VjdGlvbikKCiAgICAgICAgICAgICAgICBmb3Igb3B0IGluIG9wdGlvbnM6CiAgICAgICAgICAgICAgICAgICAgaWYgb3B0ICE9ICdfX25hbWVfXycgYW5kIG9wdCBub3QgaW4gaWdub3JlX29wdGlvbnM6CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHNlbGYuX3RyeV9zdHIocGFyc2VyLmdldChzZWN0aW9uLCBvcHQpKQogICAgICAgICAgICAgICAgICAgICAgICBvcHQgPSBvcHQucmVwbGFjZSgnLScsICdfJykKICAgICAgICAgICAgICAgICAgICAgICAgb3B0X2RpY3Rbb3B0XSA9IChmaWxlbmFtZSwgdmFsKQoKICAgICAgICAgICAgIyBNYWtlIHRoZSBDb25maWdQYXJzZXIgZm9yZ2V0IGV2ZXJ5dGhpbmcgKHNvIHdlIHJldGFpbgogICAgICAgICAgICAjIHRoZSBvcmlnaW5hbCBmaWxlbmFtZXMgdGhhdCBvcHRpb25zIGNvbWUgZnJvbSkKICAgICAgICAgICAgcGFyc2VyLl9faW5pdF9fKCkKCiAgICAgICAgIyBJZiB0aGVyZSB3YXMgYSAiZ2xvYmFsIiBzZWN0aW9uIGluIHRoZSBjb25maWcgZmlsZSwgdXNlIGl0CiAgICAgICAgIyB0byBzZXQgRGlzdHJpYnV0aW9uIG9wdGlvbnMuCgogICAgICAgIGlmICdnbG9iYWwnIGluIHNlbGYuY29tbWFuZF9vcHRpb25zOgogICAgICAgICAgICBmb3IgKG9wdCwgKHNyYywgdmFsKSkgaW4gc2VsZi5jb21tYW5kX29wdGlvbnNbJ2dsb2JhbCddLml0ZW1zKCk6CiAgICAgICAgICAgICAgICBhbGlhcyA9IHNlbGYubmVnYXRpdmVfb3B0LmdldChvcHQpCiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgaWYgYWxpYXM6CiAgICAgICAgICAgICAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgYWxpYXMsIG5vdCBzdHJ0b2Jvb2wodmFsKSkKICAgICAgICAgICAgICAgICAgICBlbGlmIG9wdCBpbiAoJ3ZlcmJvc2UnLCAnZHJ5X3J1bicpOiAgIyB1Z2ghCiAgICAgICAgICAgICAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgb3B0LCBzdHJ0b2Jvb2wodmFsKSkKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIG9wdCwgdmFsKQogICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3IgYXMgbXNnOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKG1zZykKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX3RyeV9zdHIodmFsKToKICAgICAgICAiIiIKICAgICAgICBPbiBQeXRob24gMiwgbXVjaCBvZiBkaXN0dXRpbHMgcmVsaWVzIG9uIHN0cmluZyB2YWx1ZXMgYmVpbmcgb2YKICAgICAgICB0eXBlICdzdHInIChieXRlcykgYW5kIG5vdCB1bmljb2RlIHRleHQuIElmIHRoZSB2YWx1ZSBjYW4gYmUgc2FmZWx5CiAgICAgICAgZW5jb2RlZCB0byBieXRlcyB1c2luZyB0aGUgZGVmYXVsdCBlbmNvZGluZywgcHJlZmVyIHRoYXQuCgogICAgICAgIFdoeSB0aGUgZGVmYXVsdCBlbmNvZGluZz8gQmVjYXVzZSB0aGF0IHZhbHVlIGNhbiBiZSBpbXBsaWNpdGx5CiAgICAgICAgZGVjb2RlZCBiYWNrIHRvIHRleHQgaWYgbmVlZGVkLgoKICAgICAgICBSZWYgIzE2NTMKICAgICAgICAiIiIKICAgICAgICBpZiBzaXguUFkzOgogICAgICAgICAgICByZXR1cm4gdmFsCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gdmFsLmVuY29kZSgpCiAgICAgICAgZXhjZXB0IFVuaWNvZGVFbmNvZGVFcnJvcjoKICAgICAgICAgICAgcGFzcwogICAgICAgIHJldHVybiB2YWwKCiAgICBkZWYgX3NldF9jb21tYW5kX29wdGlvbnMoc2VsZiwgY29tbWFuZF9vYmosIG9wdGlvbl9kaWN0PU5vbmUpOgogICAgICAgICIiIgogICAgICAgIFNldCB0aGUgb3B0aW9ucyBmb3IgJ2NvbW1hbmRfb2JqJyBmcm9tICdvcHRpb25fZGljdCcuICBCYXNpY2FsbHkKICAgICAgICB0aGlzIG1lYW5zIGNvcHlpbmcgZWxlbWVudHMgb2YgYSBkaWN0aW9uYXJ5ICgnb3B0aW9uX2RpY3QnKSB0bwogICAgICAgIGF0dHJpYnV0ZXMgb2YgYW4gaW5zdGFuY2UgKCdjb21tYW5kJykuCgogICAgICAgICdjb21tYW5kX29iaicgbXVzdCBiZSBhIENvbW1hbmQgaW5zdGFuY2UuICBJZiAnb3B0aW9uX2RpY3QnIGlzIG5vdAogICAgICAgIHN1cHBsaWVkLCB1c2VzIHRoZSBzdGFuZGFyZCBvcHRpb24gZGljdGlvbmFyeSBmb3IgdGhpcyBjb21tYW5kCiAgICAgICAgKGZyb20gJ3NlbGYuY29tbWFuZF9vcHRpb25zJykuCgogICAgICAgIChBZG9wdGVkIGZyb20gZGlzdHV0aWxzLmRpc3QuRGlzdHJpYnV0aW9uLl9zZXRfY29tbWFuZF9vcHRpb25zKQogICAgICAgICIiIgogICAgICAgIGNvbW1hbmRfbmFtZSA9IGNvbW1hbmRfb2JqLmdldF9jb21tYW5kX25hbWUoKQogICAgICAgIGlmIG9wdGlvbl9kaWN0IGlzIE5vbmU6CiAgICAgICAgICAgIG9wdGlvbl9kaWN0ID0gc2VsZi5nZXRfb3B0aW9uX2RpY3QoY29tbWFuZF9uYW1lKQoKICAgICAgICBpZiBERUJVRzoKICAgICAgICAgICAgc2VsZi5hbm5vdW5jZSgiICBzZXR0aW5nIG9wdGlvbnMgZm9yICclcycgY29tbWFuZDoiICUgY29tbWFuZF9uYW1lKQogICAgICAgIGZvciAob3B0aW9uLCAoc291cmNlLCB2YWx1ZSkpIGluIG9wdGlvbl9kaWN0Lml0ZW1zKCk6CiAgICAgICAgICAgIGlmIERFQlVHOgogICAgICAgICAgICAgICAgc2VsZi5hbm5vdW5jZSgiICAgICVzID0gJXMgKGZyb20gJXMpIiAlIChvcHRpb24sIHZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UpKQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBib29sX29wdHMgPSBbdHJhbnNsYXRlX2xvbmdvcHQobykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbyBpbiBjb21tYW5kX29iai5ib29sZWFuX29wdGlvbnNdCiAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgICAgIGJvb2xfb3B0cyA9IFtdCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIG5lZ19vcHQgPSBjb21tYW5kX29iai5uZWdhdGl2ZV9vcHQKICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICAgICAgbmVnX29wdCA9IHt9CgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBpc19zdHJpbmcgPSBpc2luc3RhbmNlKHZhbHVlLCBzaXguc3RyaW5nX3R5cGVzKQogICAgICAgICAgICAgICAgaWYgb3B0aW9uIGluIG5lZ19vcHQgYW5kIGlzX3N0cmluZzoKICAgICAgICAgICAgICAgICAgICBzZXRhdHRyKGNvbW1hbmRfb2JqLCBuZWdfb3B0W29wdGlvbl0sIG5vdCBzdHJ0b2Jvb2wodmFsdWUpKQogICAgICAgICAgICAgICAgZWxpZiBvcHRpb24gaW4gYm9vbF9vcHRzIGFuZCBpc19zdHJpbmc6CiAgICAgICAgICAgICAgICAgICAgc2V0YXR0cihjb21tYW5kX29iaiwgb3B0aW9uLCBzdHJ0b2Jvb2wodmFsdWUpKQogICAgICAgICAgICAgICAgZWxpZiBoYXNhdHRyKGNvbW1hbmRfb2JqLCBvcHRpb24pOgogICAgICAgICAgICAgICAgICAgIHNldGF0dHIoY29tbWFuZF9vYmosIG9wdGlvbiwgdmFsdWUpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3IgaW4gJXM6IGNvbW1hbmQgJyVzJyBoYXMgbm8gc3VjaCBvcHRpb24gJyVzJyIKICAgICAgICAgICAgICAgICAgICAgICAgJSAoc291cmNlLCBjb21tYW5kX25hbWUsIG9wdGlvbikpCiAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yIGFzIG1zZzoKICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKG1zZykKCiAgICBkZWYgcGFyc2VfY29uZmlnX2ZpbGVzKHNlbGYsIGZpbGVuYW1lcz1Ob25lLCBpZ25vcmVfb3B0aW9uX2Vycm9ycz1GYWxzZSk6CiAgICAgICAgIiIiUGFyc2VzIGNvbmZpZ3VyYXRpb24gZmlsZXMgZnJvbSB2YXJpb3VzIGxldmVscwogICAgICAgIGFuZCBsb2FkcyBjb25maWd1cmF0aW9uLgoKICAgICAgICAiIiIKICAgICAgICBzZWxmLl9wYXJzZV9jb25maWdfZmlsZXMoZmlsZW5hbWVzPWZpbGVuYW1lcykKCiAgICAgICAgcGFyc2VfY29uZmlndXJhdGlvbihzZWxmLCBzZWxmLmNvbW1hbmRfb3B0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZV9vcHRpb25fZXJyb3JzPWlnbm9yZV9vcHRpb25fZXJyb3JzKQogICAgICAgIHNlbGYuX2ZpbmFsaXplX3JlcXVpcmVzKCkKCiAgICBkZWYgcGFyc2VfY29tbWFuZF9saW5lKHNlbGYpOgogICAgICAgICIiIlByb2Nlc3MgZmVhdHVyZXMgYWZ0ZXIgcGFyc2luZyBjb21tYW5kIGxpbmUgb3B0aW9ucyIiIgogICAgICAgIHJlc3VsdCA9IF9EaXN0cmlidXRpb24ucGFyc2VfY29tbWFuZF9saW5lKHNlbGYpCiAgICAgICAgaWYgc2VsZi5mZWF0dXJlczoKICAgICAgICAgICAgc2VsZi5fZmluYWxpemVfZmVhdHVyZXMoKQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgX2ZlYXR1cmVfYXR0cm5hbWUoc2VsZiwgbmFtZSk6CiAgICAgICAgIiIiQ29udmVydCBmZWF0dXJlIG5hbWUgdG8gY29ycmVzcG9uZGluZyBvcHRpb24gYXR0cmlidXRlIG5hbWUiIiIKICAgICAgICByZXR1cm4gJ3dpdGhfJyArIG5hbWUucmVwbGFjZSgnLScsICdfJykKCiAgICBkZWYgZmV0Y2hfYnVpbGRfZWdncyhzZWxmLCByZXF1aXJlcyk6CiAgICAgICAgIiIiUmVzb2x2ZSBwcmUtc2V0dXAgcmVxdWlyZW1lbnRzIiIiCiAgICAgICAgcmVzb2x2ZWRfZGlzdHMgPSBwa2dfcmVzb3VyY2VzLndvcmtpbmdfc2V0LnJlc29sdmUoCiAgICAgICAgICAgIHBrZ19yZXNvdXJjZXMucGFyc2VfcmVxdWlyZW1lbnRzKHJlcXVpcmVzKSwKICAgICAgICAgICAgaW5zdGFsbGVyPXNlbGYuZmV0Y2hfYnVpbGRfZWdnLAogICAgICAgICAgICByZXBsYWNlX2NvbmZsaWN0aW5nPVRydWUsCiAgICAgICAgKQogICAgICAgIGZvciBkaXN0IGluIHJlc29sdmVkX2Rpc3RzOgogICAgICAgICAgICBwa2dfcmVzb3VyY2VzLndvcmtpbmdfc2V0LmFkZChkaXN0LCByZXBsYWNlPVRydWUpCiAgICAgICAgcmV0dXJuIHJlc29sdmVkX2Rpc3RzCgogICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgQWxsb3cgcGx1Z2lucyB0byBhcHBseSBhcmJpdHJhcnkgb3BlcmF0aW9ucyB0byB0aGUKICAgICAgICBkaXN0cmlidXRpb24uIEVhY2ggaG9vayBtYXkgb3B0aW9uYWxseSBkZWZpbmUgYSAnb3JkZXInCiAgICAgICAgdG8gaW5mbHVlbmNlIHRoZSBvcmRlciBvZiBleGVjdXRpb24uIFNtYWxsZXIgbnVtYmVycwogICAgICAgIGdvIGZpcnN0IGFuZCB0aGUgZGVmYXVsdCBpcyAwLgogICAgICAgICIiIgogICAgICAgIGhvb2tfa2V5ID0gJ3NldHVwdG9vbHMuZmluYWxpemVfZGlzdHJpYnV0aW9uX29wdGlvbnMnCgogICAgICAgIGRlZiBieV9vcmRlcihob29rKToKICAgICAgICAgICAgcmV0dXJuIGdldGF0dHIoaG9vaywgJ29yZGVyJywgMCkKICAgICAgICBlcHMgPSBwa2dfcmVzb3VyY2VzLml0ZXJfZW50cnlfcG9pbnRzKGhvb2tfa2V5KQogICAgICAgIGZvciBlcCBpbiBzb3J0ZWQoZXBzLCBrZXk9Ynlfb3JkZXIpOgogICAgICAgICAgICBlcC5sb2FkKCkoc2VsZikKCiAgICBkZWYgX2ZpbmFsaXplX3NldHVwX2tleXdvcmRzKHNlbGYpOgogICAgICAgIGZvciBlcCBpbiBwa2dfcmVzb3VyY2VzLml0ZXJfZW50cnlfcG9pbnRzKCdkaXN0dXRpbHMuc2V0dXBfa2V5d29yZHMnKToKICAgICAgICAgICAgdmFsdWUgPSBnZXRhdHRyKHNlbGYsIGVwLm5hbWUsIE5vbmUpCiAgICAgICAgICAgIGlmIHZhbHVlIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgZXAucmVxdWlyZShpbnN0YWxsZXI9c2VsZi5mZXRjaF9idWlsZF9lZ2cpCiAgICAgICAgICAgICAgICBlcC5sb2FkKCkoc2VsZiwgZXAubmFtZSwgdmFsdWUpCgogICAgZGVmIF9maW5hbGl6ZV8ydG8zX2RvY3Rlc3RzKHNlbGYpOgogICAgICAgIGlmIGdldGF0dHIoc2VsZiwgJ2NvbnZlcnRfMnRvM19kb2N0ZXN0cycsIE5vbmUpOgogICAgICAgICAgICAjIFhYWCBtYXkgY29udmVydCB0byBzZXQgaGVyZSB3aGVuIHdlIGNhbiByZWx5IG9uIHNldCBiZWluZyBidWlsdGluCiAgICAgICAgICAgIHNlbGYuY29udmVydF8ydG8zX2RvY3Rlc3RzID0gWwogICAgICAgICAgICAgICAgb3MucGF0aC5hYnNwYXRoKHApCiAgICAgICAgICAgICAgICBmb3IgcCBpbiBzZWxmLmNvbnZlcnRfMnRvM19kb2N0ZXN0cwogICAgICAgICAgICBdCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5jb252ZXJ0XzJ0bzNfZG9jdGVzdHMgPSBbXQoKICAgIGRlZiBnZXRfZWdnX2NhY2hlX2RpcihzZWxmKToKICAgICAgICBlZ2dfY2FjaGVfZGlyID0gb3MucGF0aC5qb2luKG9zLmN1cmRpciwgJy5lZ2dzJykKICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoZWdnX2NhY2hlX2Rpcik6CiAgICAgICAgICAgIG9zLm1rZGlyKGVnZ19jYWNoZV9kaXIpCiAgICAgICAgICAgIHdpbmRvd3Nfc3VwcG9ydC5oaWRlX2ZpbGUoZWdnX2NhY2hlX2RpcikKICAgICAgICAgICAgcmVhZG1lX3R4dF9maWxlbmFtZSA9IG9zLnBhdGguam9pbihlZ2dfY2FjaGVfZGlyLCAnUkVBRE1FLnR4dCcpCiAgICAgICAgICAgIHdpdGggb3BlbihyZWFkbWVfdHh0X2ZpbGVuYW1lLCAndycpIGFzIGY6CiAgICAgICAgICAgICAgICBmLndyaXRlKCdUaGlzIGRpcmVjdG9yeSBjb250YWlucyBlZ2dzIHRoYXQgd2VyZSBkb3dubG9hZGVkICcKICAgICAgICAgICAgICAgICAgICAgICAgJ2J5IHNldHVwdG9vbHMgdG8gYnVpbGQsIHRlc3QsIGFuZCBydW4gcGx1Zy1pbnMuXG5cbicpCiAgICAgICAgICAgICAgICBmLndyaXRlKCdUaGlzIGRpcmVjdG9yeSBjYWNoZXMgdGhvc2UgZWdncyB0byBwcmV2ZW50ICcKICAgICAgICAgICAgICAgICAgICAgICAgJ3JlcGVhdGVkIGRvd25sb2Fkcy5cblxuJykKICAgICAgICAgICAgICAgIGYud3JpdGUoJ0hvd2V2ZXIsIGl0IGlzIHNhZmUgdG8gZGVsZXRlIHRoaXMgZGlyZWN0b3J5LlxuXG4nKQoKICAgICAgICByZXR1cm4gZWdnX2NhY2hlX2RpcgoKICAgIGRlZiBmZXRjaF9idWlsZF9lZ2coc2VsZiwgcmVxKToKICAgICAgICAiIiJGZXRjaCBhbiBlZ2cgbmVlZGVkIGZvciBidWlsZGluZyIiIgogICAgICAgIGZyb20gc2V0dXB0b29scy5pbnN0YWxsZXIgaW1wb3J0IGZldGNoX2J1aWxkX2VnZwogICAgICAgIHJldHVybiBmZXRjaF9idWlsZF9lZ2coc2VsZiwgcmVxKQoKICAgIGRlZiBfZmluYWxpemVfZmVhdHVyZV9vcHRzKHNlbGYpOgogICAgICAgICIiIkFkZCAtLXdpdGgtWC8tLXdpdGhvdXQtWCBvcHRpb25zIGJhc2VkIG9uIG9wdGlvbmFsIGZlYXR1cmVzIiIiCgogICAgICAgIGlmIG5vdCBzZWxmLmZlYXR1cmVzOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgZ28gPSBbXQogICAgICAgIG5vID0gc2VsZi5uZWdhdGl2ZV9vcHQuY29weSgpCgogICAgICAgIGZvciBuYW1lLCBmZWF0dXJlIGluIHNlbGYuZmVhdHVyZXMuaXRlbXMoKToKICAgICAgICAgICAgc2VsZi5fc2V0X2ZlYXR1cmUobmFtZSwgTm9uZSkKICAgICAgICAgICAgZmVhdHVyZS52YWxpZGF0ZShzZWxmKQoKICAgICAgICAgICAgaWYgZmVhdHVyZS5vcHRpb25hbDoKICAgICAgICAgICAgICAgIGRlc2NyID0gZmVhdHVyZS5kZXNjcmlwdGlvbgogICAgICAgICAgICAgICAgaW5jZGVmID0gJyAoZGVmYXVsdCknCiAgICAgICAgICAgICAgICBleGNkZWYgPSAnJwogICAgICAgICAgICAgICAgaWYgbm90IGZlYXR1cmUuaW5jbHVkZV9ieV9kZWZhdWx0KCk6CiAgICAgICAgICAgICAgICAgICAgZXhjZGVmLCBpbmNkZWYgPSBpbmNkZWYsIGV4Y2RlZgoKICAgICAgICAgICAgICAgIG5ldyA9ICgKICAgICAgICAgICAgICAgICAgICAoJ3dpdGgtJyArIG5hbWUsIE5vbmUsICdpbmNsdWRlICcgKyBkZXNjciArIGluY2RlZiksCiAgICAgICAgICAgICAgICAgICAgKCd3aXRob3V0LScgKyBuYW1lLCBOb25lLCAnZXhjbHVkZSAnICsgZGVzY3IgKyBleGNkZWYpLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgZ28uZXh0ZW5kKG5ldykKICAgICAgICAgICAgICAgIG5vWyd3aXRob3V0LScgKyBuYW1lXSA9ICd3aXRoLScgKyBuYW1lCgogICAgICAgIHNlbGYuZ2xvYmFsX29wdGlvbnMgPSBzZWxmLmZlYXR1cmVfb3B0aW9ucyA9IGdvICsgc2VsZi5nbG9iYWxfb3B0aW9ucwogICAgICAgIHNlbGYubmVnYXRpdmVfb3B0ID0gc2VsZi5mZWF0dXJlX25lZ29wdCA9IG5vCgogICAgZGVmIF9maW5hbGl6ZV9mZWF0dXJlcyhzZWxmKToKICAgICAgICAiIiJBZGQvcmVtb3ZlIGZlYXR1cmVzIGFuZCByZXNvbHZlIGRlcGVuZGVuY2llcyBiZXR3ZWVuIHRoZW0iIiIKCiAgICAgICAgIyBGaXJzdCwgZmxhZyBhbGwgdGhlIGVuYWJsZWQgaXRlbXMgKGFuZCB0aHVzIHRoZWlyIGRlcGVuZGVuY2llcykKICAgICAgICBmb3IgbmFtZSwgZmVhdHVyZSBpbiBzZWxmLmZlYXR1cmVzLml0ZW1zKCk6CiAgICAgICAgICAgIGVuYWJsZWQgPSBzZWxmLmZlYXR1cmVfaXNfaW5jbHVkZWQobmFtZSkKICAgICAgICAgICAgaWYgZW5hYmxlZCBvciAoZW5hYmxlZCBpcyBOb25lIGFuZCBmZWF0dXJlLmluY2x1ZGVfYnlfZGVmYXVsdCgpKToKICAgICAgICAgICAgICAgIGZlYXR1cmUuaW5jbHVkZV9pbihzZWxmKQogICAgICAgICAgICAgICAgc2VsZi5fc2V0X2ZlYXR1cmUobmFtZSwgMSkKCiAgICAgICAgIyBUaGVuIGRpc2FibGUgdGhlIHJlc3QsIHNvIHRoYXQgb2ZmLWJ5LWRlZmF1bHQgZmVhdHVyZXMgZG9uJ3QKICAgICAgICAjIGdldCBmbGFnZ2VkIGFzIGVycm9ycyB3aGVuIHRoZXkncmUgcmVxdWlyZWQgYnkgYW4gZW5hYmxlZCBmZWF0dXJlCiAgICAgICAgZm9yIG5hbWUsIGZlYXR1cmUgaW4gc2VsZi5mZWF0dXJlcy5pdGVtcygpOgogICAgICAgICAgICBpZiBub3Qgc2VsZi5mZWF0dXJlX2lzX2luY2x1ZGVkKG5hbWUpOgogICAgICAgICAgICAgICAgZmVhdHVyZS5leGNsdWRlX2Zyb20oc2VsZikKICAgICAgICAgICAgICAgIHNlbGYuX3NldF9mZWF0dXJlKG5hbWUsIDApCgogICAgZGVmIGdldF9jb21tYW5kX2NsYXNzKHNlbGYsIGNvbW1hbmQpOgogICAgICAgICIiIlBsdWdnYWJsZSB2ZXJzaW9uIG9mIGdldF9jb21tYW5kX2NsYXNzKCkiIiIKICAgICAgICBpZiBjb21tYW5kIGluIHNlbGYuY21kY2xhc3M6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmNtZGNsYXNzW2NvbW1hbmRdCgogICAgICAgIGVwcyA9IHBrZ19yZXNvdXJjZXMuaXRlcl9lbnRyeV9wb2ludHMoJ2Rpc3R1dGlscy5jb21tYW5kcycsIGNvbW1hbmQpCiAgICAgICAgZm9yIGVwIGluIGVwczoKICAgICAgICAgICAgZXAucmVxdWlyZShpbnN0YWxsZXI9c2VsZi5mZXRjaF9idWlsZF9lZ2cpCiAgICAgICAgICAgIHNlbGYuY21kY2xhc3NbY29tbWFuZF0gPSBjbWRjbGFzcyA9IGVwLmxvYWQoKQogICAgICAgICAgICByZXR1cm4gY21kY2xhc3MKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gX0Rpc3RyaWJ1dGlvbi5nZXRfY29tbWFuZF9jbGFzcyhzZWxmLCBjb21tYW5kKQoKICAgIGRlZiBwcmludF9jb21tYW5kcyhzZWxmKToKICAgICAgICBmb3IgZXAgaW4gcGtnX3Jlc291cmNlcy5pdGVyX2VudHJ5X3BvaW50cygnZGlzdHV0aWxzLmNvbW1hbmRzJyk6CiAgICAgICAgICAgIGlmIGVwLm5hbWUgbm90IGluIHNlbGYuY21kY2xhc3M6CiAgICAgICAgICAgICAgICAjIGRvbid0IHJlcXVpcmUgZXh0cmFzIGFzIHRoZSBjb21tYW5kcyB3b24ndCBiZSBpbnZva2VkCiAgICAgICAgICAgICAgICBjbWRjbGFzcyA9IGVwLnJlc29sdmUoKQogICAgICAgICAgICAgICAgc2VsZi5jbWRjbGFzc1tlcC5uYW1lXSA9IGNtZGNsYXNzCiAgICAgICAgcmV0dXJuIF9EaXN0cmlidXRpb24ucHJpbnRfY29tbWFuZHMoc2VsZikKCiAgICBkZWYgZ2V0X2NvbW1hbmRfbGlzdChzZWxmKToKICAgICAgICBmb3IgZXAgaW4gcGtnX3Jlc291cmNlcy5pdGVyX2VudHJ5X3BvaW50cygnZGlzdHV0aWxzLmNvbW1hbmRzJyk6CiAgICAgICAgICAgIGlmIGVwLm5hbWUgbm90IGluIHNlbGYuY21kY2xhc3M6CiAgICAgICAgICAgICAgICAjIGRvbid0IHJlcXVpcmUgZXh0cmFzIGFzIHRoZSBjb21tYW5kcyB3b24ndCBiZSBpbnZva2VkCiAgICAgICAgICAgICAgICBjbWRjbGFzcyA9IGVwLnJlc29sdmUoKQogICAgICAgICAgICAgICAgc2VsZi5jbWRjbGFzc1tlcC5uYW1lXSA9IGNtZGNsYXNzCiAgICAgICAgcmV0dXJuIF9EaXN0cmlidXRpb24uZ2V0X2NvbW1hbmRfbGlzdChzZWxmKQoKICAgIGRlZiBfc2V0X2ZlYXR1cmUoc2VsZiwgbmFtZSwgc3RhdHVzKToKICAgICAgICAiIiJTZXQgZmVhdHVyZSdzIGluY2x1c2lvbiBzdGF0dXMiIiIKICAgICAgICBzZXRhdHRyKHNlbGYsIHNlbGYuX2ZlYXR1cmVfYXR0cm5hbWUobmFtZSksIHN0YXR1cykKCiAgICBkZWYgZmVhdHVyZV9pc19pbmNsdWRlZChzZWxmLCBuYW1lKToKICAgICAgICAiIiJSZXR1cm4gMSBpZiBmZWF0dXJlIGlzIGluY2x1ZGVkLCAwIGlmIGV4Y2x1ZGVkLCAnTm9uZScgaWYgdW5rbm93biIiIgogICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYsIHNlbGYuX2ZlYXR1cmVfYXR0cm5hbWUobmFtZSkpCgogICAgZGVmIGluY2x1ZGVfZmVhdHVyZShzZWxmLCBuYW1lKToKICAgICAgICAiIiJSZXF1ZXN0IGluY2x1c2lvbiBvZiBmZWF0dXJlIG5hbWVkICduYW1lJyIiIgoKICAgICAgICBpZiBzZWxmLmZlYXR1cmVfaXNfaW5jbHVkZWQobmFtZSkgPT0gMDoKICAgICAgICAgICAgZGVzY3IgPSBzZWxmLmZlYXR1cmVzW25hbWVdLmRlc2NyaXB0aW9uCiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKAogICAgICAgICAgICAgICAgZGVzY3IgKyAiIGlzIHJlcXVpcmVkLCBidXQgd2FzIGV4Y2x1ZGVkIG9yIGlzIG5vdCBhdmFpbGFibGUiCiAgICAgICAgICAgICkKICAgICAgICBzZWxmLmZlYXR1cmVzW25hbWVdLmluY2x1ZGVfaW4oc2VsZikKICAgICAgICBzZWxmLl9zZXRfZmVhdHVyZShuYW1lLCAxKQoKICAgIGRlZiBpbmNsdWRlKHNlbGYsICoqYXR0cnMpOgogICAgICAgICIiIkFkZCBpdGVtcyB0byBkaXN0cmlidXRpb24gdGhhdCBhcmUgbmFtZWQgaW4ga2V5d29yZCBhcmd1bWVudHMKCiAgICAgICAgRm9yIGV4YW1wbGUsICdkaXN0LmluY2x1ZGUocHlfbW9kdWxlcz1bIngiXSknIHdvdWxkIGFkZCAneCcgdG8KICAgICAgICB0aGUgZGlzdHJpYnV0aW9uJ3MgJ3B5X21vZHVsZXMnIGF0dHJpYnV0ZSwgaWYgaXQgd2FzIG5vdCBhbHJlYWR5CiAgICAgICAgdGhlcmUuCgogICAgICAgIEN1cnJlbnRseSwgdGhpcyBtZXRob2Qgb25seSBzdXBwb3J0cyBpbmNsdXNpb24gZm9yIGF0dHJpYnV0ZXMgdGhhdCBhcmUKICAgICAgICBsaXN0cyBvciB0dXBsZXMuICBJZiB5b3UgbmVlZCB0byBhZGQgc3VwcG9ydCBmb3IgYWRkaW5nIHRvIG90aGVyCiAgICAgICAgYXR0cmlidXRlcyBpbiB0aGlzIG9yIGEgc3ViY2xhc3MsIHlvdSBjYW4gYWRkIGFuICdfaW5jbHVkZV9YJyBtZXRob2QsCiAgICAgICAgd2hlcmUgJ1gnIGlzIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuICBUaGUgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHdpdGgKICAgICAgICB0aGUgdmFsdWUgcGFzc2VkIHRvICdpbmNsdWRlKCknLiAgU28sICdkaXN0LmluY2x1ZGUoZm9vPXsiYmFyIjoiYmF6In0pJwogICAgICAgIHdpbGwgdHJ5IHRvIGNhbGwgJ2Rpc3QuX2luY2x1ZGVfZm9vKHsiYmFyIjoiYmF6In0pJywgd2hpY2ggY2FuIHRoZW4KICAgICAgICBoYW5kbGUgd2hhdGV2ZXIgc3BlY2lhbCBpbmNsdXNpb24gbG9naWMgaXMgbmVlZGVkLgogICAgICAgICIiIgogICAgICAgIGZvciBrLCB2IGluIGF0dHJzLml0ZW1zKCk6CiAgICAgICAgICAgIGluY2x1ZGUgPSBnZXRhdHRyKHNlbGYsICdfaW5jbHVkZV8nICsgaywgTm9uZSkKICAgICAgICAgICAgaWYgaW5jbHVkZToKICAgICAgICAgICAgICAgIGluY2x1ZGUodikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYuX2luY2x1ZGVfbWlzYyhrLCB2KQoKICAgIGRlZiBleGNsdWRlX3BhY2thZ2Uoc2VsZiwgcGFja2FnZSk6CiAgICAgICAgIiIiUmVtb3ZlIHBhY2thZ2VzLCBtb2R1bGVzLCBhbmQgZXh0ZW5zaW9ucyBpbiBuYW1lZCBwYWNrYWdlIiIiCgogICAgICAgIHBmeCA9IHBhY2thZ2UgKyAnLicKICAgICAgICBpZiBzZWxmLnBhY2thZ2VzOgogICAgICAgICAgICBzZWxmLnBhY2thZ2VzID0gWwogICAgICAgICAgICAgICAgcCBmb3IgcCBpbiBzZWxmLnBhY2thZ2VzCiAgICAgICAgICAgICAgICBpZiBwICE9IHBhY2thZ2UgYW5kIG5vdCBwLnN0YXJ0c3dpdGgocGZ4KQogICAgICAgICAgICBdCgogICAgICAgIGlmIHNlbGYucHlfbW9kdWxlczoKICAgICAgICAgICAgc2VsZi5weV9tb2R1bGVzID0gWwogICAgICAgICAgICAgICAgcCBmb3IgcCBpbiBzZWxmLnB5X21vZHVsZXMKICAgICAgICAgICAgICAgIGlmIHAgIT0gcGFja2FnZSBhbmQgbm90IHAuc3RhcnRzd2l0aChwZngpCiAgICAgICAgICAgIF0KCiAgICAgICAgaWYgc2VsZi5leHRfbW9kdWxlczoKICAgICAgICAgICAgc2VsZi5leHRfbW9kdWxlcyA9IFsKICAgICAgICAgICAgICAgIHAgZm9yIHAgaW4gc2VsZi5leHRfbW9kdWxlcwogICAgICAgICAgICAgICAgaWYgcC5uYW1lICE9IHBhY2thZ2UgYW5kIG5vdCBwLm5hbWUuc3RhcnRzd2l0aChwZngpCiAgICAgICAgICAgIF0KCiAgICBkZWYgaGFzX2NvbnRlbnRzX2ZvcihzZWxmLCBwYWNrYWdlKToKICAgICAgICAiIiJSZXR1cm4gdHJ1ZSBpZiAnZXhjbHVkZV9wYWNrYWdlKHBhY2thZ2UpJyB3b3VsZCBkbyBzb21ldGhpbmciIiIKCiAgICAgICAgcGZ4ID0gcGFja2FnZSArICcuJwoKICAgICAgICBmb3IgcCBpbiBzZWxmLml0ZXJfZGlzdHJpYnV0aW9uX25hbWVzKCk6CiAgICAgICAgICAgIGlmIHAgPT0gcGFja2FnZSBvciBwLnN0YXJ0c3dpdGgocGZ4KToKICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIF9leGNsdWRlX21pc2Moc2VsZiwgbmFtZSwgdmFsdWUpOgogICAgICAgICIiIkhhbmRsZSAnZXhjbHVkZSgpJyBmb3IgbGlzdC90dXBsZSBhdHRycyB3aXRob3V0IGEgc3BlY2lhbCBoYW5kbGVyIiIiCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodmFsdWUsIHNlcXVlbmNlKToKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKICAgICAgICAgICAgICAgICIlczogc2V0dGluZyBtdXN0IGJlIGEgbGlzdCBvciB0dXBsZSAoJXIpIiAlIChuYW1lLCB2YWx1ZSkKICAgICAgICAgICAgKQogICAgICAgIHRyeToKICAgICAgICAgICAgb2xkID0gZ2V0YXR0cihzZWxmLCBuYW1lKQogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKICAgICAgICAgICAgICAgICIlczogTm8gc3VjaCBkaXN0cmlidXRpb24gc2V0dGluZyIgJSBuYW1lCiAgICAgICAgICAgICkKICAgICAgICBpZiBvbGQgaXMgbm90IE5vbmUgYW5kIG5vdCBpc2luc3RhbmNlKG9sZCwgc2VxdWVuY2UpOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAogICAgICAgICAgICAgICAgbmFtZSArICI6IHRoaXMgc2V0dGluZyBjYW5ub3QgYmUgY2hhbmdlZCB2aWEgaW5jbHVkZS9leGNsdWRlIgogICAgICAgICAgICApCiAgICAgICAgZWxpZiBvbGQ6CiAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgbmFtZSwgW2l0ZW0gZm9yIGl0ZW0gaW4gb2xkIGlmIGl0ZW0gbm90IGluIHZhbHVlXSkKCiAgICBkZWYgX2luY2x1ZGVfbWlzYyhzZWxmLCBuYW1lLCB2YWx1ZSk6CiAgICAgICAgIiIiSGFuZGxlICdpbmNsdWRlKCknIGZvciBsaXN0L3R1cGxlIGF0dHJzIHdpdGhvdXQgYSBzcGVjaWFsIGhhbmRsZXIiIiIKCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodmFsdWUsIHNlcXVlbmNlKToKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKICAgICAgICAgICAgICAgICIlczogc2V0dGluZyBtdXN0IGJlIGEgbGlzdCAoJXIpIiAlIChuYW1lLCB2YWx1ZSkKICAgICAgICAgICAgKQogICAgICAgIHRyeToKICAgICAgICAgICAgb2xkID0gZ2V0YXR0cihzZWxmLCBuYW1lKQogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKICAgICAgICAgICAgICAgICIlczogTm8gc3VjaCBkaXN0cmlidXRpb24gc2V0dGluZyIgJSBuYW1lCiAgICAgICAgICAgICkKICAgICAgICBpZiBvbGQgaXMgTm9uZToKICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBuYW1lLCB2YWx1ZSkKICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKG9sZCwgc2VxdWVuY2UpOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAogICAgICAgICAgICAgICAgbmFtZSArICI6IHRoaXMgc2V0dGluZyBjYW5ub3QgYmUgY2hhbmdlZCB2aWEgaW5jbHVkZS9leGNsdWRlIgogICAgICAgICAgICApCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbmV3ID0gW2l0ZW0gZm9yIGl0ZW0gaW4gdmFsdWUgaWYgaXRlbSBub3QgaW4gb2xkXQogICAgICAgICAgICBzZXRhdHRyKHNlbGYsIG5hbWUsIG9sZCArIG5ldykKCiAgICBkZWYgZXhjbHVkZShzZWxmLCAqKmF0dHJzKToKICAgICAgICAiIiJSZW1vdmUgaXRlbXMgZnJvbSBkaXN0cmlidXRpb24gdGhhdCBhcmUgbmFtZWQgaW4ga2V5d29yZCBhcmd1bWVudHMKCiAgICAgICAgRm9yIGV4YW1wbGUsICdkaXN0LmV4Y2x1ZGUocHlfbW9kdWxlcz1bIngiXSknIHdvdWxkIHJlbW92ZSAneCcgZnJvbQogICAgICAgIHRoZSBkaXN0cmlidXRpb24ncyAncHlfbW9kdWxlcycgYXR0cmlidXRlLiAgRXhjbHVkaW5nIHBhY2thZ2VzIHVzZXMKICAgICAgICB0aGUgJ2V4Y2x1ZGVfcGFja2FnZSgpJyBtZXRob2QsIHNvIGFsbCBvZiB0aGUgcGFja2FnZSdzIGNvbnRhaW5lZAogICAgICAgIHBhY2thZ2VzLCBtb2R1bGVzLCBhbmQgZXh0ZW5zaW9ucyBhcmUgYWxzbyBleGNsdWRlZC4KCiAgICAgICAgQ3VycmVudGx5LCB0aGlzIG1ldGhvZCBvbmx5IHN1cHBvcnRzIGV4Y2x1c2lvbiBmcm9tIGF0dHJpYnV0ZXMgdGhhdCBhcmUKICAgICAgICBsaXN0cyBvciB0dXBsZXMuICBJZiB5b3UgbmVlZCB0byBhZGQgc3VwcG9ydCBmb3IgZXhjbHVkaW5nIGZyb20gb3RoZXIKICAgICAgICBhdHRyaWJ1dGVzIGluIHRoaXMgb3IgYSBzdWJjbGFzcywgeW91IGNhbiBhZGQgYW4gJ19leGNsdWRlX1gnIG1ldGhvZCwKICAgICAgICB3aGVyZSAnWCcgaXMgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZS4gIFRoZSBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgd2l0aAogICAgICAgIHRoZSB2YWx1ZSBwYXNzZWQgdG8gJ2V4Y2x1ZGUoKScuICBTbywgJ2Rpc3QuZXhjbHVkZShmb289eyJiYXIiOiJiYXoifSknCiAgICAgICAgd2lsbCB0cnkgdG8gY2FsbCAnZGlzdC5fZXhjbHVkZV9mb28oeyJiYXIiOiJiYXoifSknLCB3aGljaCBjYW4gdGhlbgogICAgICAgIGhhbmRsZSB3aGF0ZXZlciBzcGVjaWFsIGV4Y2x1c2lvbiBsb2dpYyBpcyBuZWVkZWQuCiAgICAgICAgIiIiCiAgICAgICAgZm9yIGssIHYgaW4gYXR0cnMuaXRlbXMoKToKICAgICAgICAgICAgZXhjbHVkZSA9IGdldGF0dHIoc2VsZiwgJ19leGNsdWRlXycgKyBrLCBOb25lKQogICAgICAgICAgICBpZiBleGNsdWRlOgogICAgICAgICAgICAgICAgZXhjbHVkZSh2KQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi5fZXhjbHVkZV9taXNjKGssIHYpCgogICAgZGVmIF9leGNsdWRlX3BhY2thZ2VzKHNlbGYsIHBhY2thZ2VzKToKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShwYWNrYWdlcywgc2VxdWVuY2UpOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAogICAgICAgICAgICAgICAgInBhY2thZ2VzOiBzZXR0aW5nIG11c3QgYmUgYSBsaXN0IG9yIHR1cGxlICglcikiICUgKHBhY2thZ2VzLCkKICAgICAgICAgICAgKQogICAgICAgIGxpc3QobWFwKHNlbGYuZXhjbHVkZV9wYWNrYWdlLCBwYWNrYWdlcykpCgogICAgZGVmIF9wYXJzZV9jb21tYW5kX29wdHMoc2VsZiwgcGFyc2VyLCBhcmdzKToKICAgICAgICAjIFJlbW92ZSAtLXdpdGgtWC8tLXdpdGhvdXQtWCBvcHRpb25zIHdoZW4gcHJvY2Vzc2luZyBjb21tYW5kIGFyZ3MKICAgICAgICBzZWxmLmdsb2JhbF9vcHRpb25zID0gc2VsZi5fX2NsYXNzX18uZ2xvYmFsX29wdGlvbnMKICAgICAgICBzZWxmLm5lZ2F0aXZlX29wdCA9IHNlbGYuX19jbGFzc19fLm5lZ2F0aXZlX29wdAoKICAgICAgICAjIEZpcnN0LCBleHBhbmQgYW55IGFsaWFzZXMKICAgICAgICBjb21tYW5kID0gYXJnc1swXQogICAgICAgIGFsaWFzZXMgPSBzZWxmLmdldF9vcHRpb25fZGljdCgnYWxpYXNlcycpCiAgICAgICAgd2hpbGUgY29tbWFuZCBpbiBhbGlhc2VzOgogICAgICAgICAgICBzcmMsIGFsaWFzID0gYWxpYXNlc1tjb21tYW5kXQogICAgICAgICAgICBkZWwgYWxpYXNlc1tjb21tYW5kXSAgIyBlbnN1cmUgZWFjaCBhbGlhcyBjYW4gZXhwYW5kIG9ubHkgb25jZSEKICAgICAgICAgICAgaW1wb3J0IHNobGV4CiAgICAgICAgICAgIGFyZ3NbOjFdID0gc2hsZXguc3BsaXQoYWxpYXMsIFRydWUpCiAgICAgICAgICAgIGNvbW1hbmQgPSBhcmdzWzBdCgogICAgICAgIG5hcmdzID0gX0Rpc3RyaWJ1dGlvbi5fcGFyc2VfY29tbWFuZF9vcHRzKHNlbGYsIHBhcnNlciwgYXJncykKCiAgICAgICAgIyBIYW5kbGUgY29tbWFuZHMgdGhhdCB3YW50IHRvIGNvbnN1bWUgYWxsIHJlbWFpbmluZyBhcmd1bWVudHMKICAgICAgICBjbWRfY2xhc3MgPSBzZWxmLmdldF9jb21tYW5kX2NsYXNzKGNvbW1hbmQpCiAgICAgICAgaWYgZ2V0YXR0cihjbWRfY2xhc3MsICdjb21tYW5kX2NvbnN1bWVzX2FyZ3VtZW50cycsIE5vbmUpOgogICAgICAgICAgICBzZWxmLmdldF9vcHRpb25fZGljdChjb21tYW5kKVsnYXJncyddID0gKCJjb21tYW5kIGxpbmUiLCBuYXJncykKICAgICAgICAgICAgaWYgbmFyZ3MgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICByZXR1cm4gW10KCiAgICAgICAgcmV0dXJuIG5hcmdzCgogICAgZGVmIGdldF9jbWRsaW5lX29wdGlvbnMoc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIGEgJ3tjbWQ6IHtvcHQ6dmFsfX0nIG1hcCBvZiBhbGwgY29tbWFuZC1saW5lIG9wdGlvbnMKCiAgICAgICAgT3B0aW9uIG5hbWVzIGFyZSBhbGwgbG9uZywgYnV0IGRvIG5vdCBpbmNsdWRlIHRoZSBsZWFkaW5nICctLScsIGFuZAogICAgICAgIGNvbnRhaW4gZGFzaGVzIHJhdGhlciB0aGFuIHVuZGVyc2NvcmVzLiAgSWYgdGhlIG9wdGlvbiBkb2Vzbid0IHRha2UKICAgICAgICBhbiBhcmd1bWVudCAoZS5nLiAnLS1xdWlldCcpLCB0aGUgJ3ZhbCcgaXMgJ05vbmUnLgoKICAgICAgICBOb3RlIHRoYXQgb3B0aW9ucyBwcm92aWRlZCBieSBjb25maWcgZmlsZXMgYXJlIGludGVudGlvbmFsbHkgZXhjbHVkZWQuCiAgICAgICAgIiIiCgogICAgICAgIGQgPSB7fQoKICAgICAgICBmb3IgY21kLCBvcHRzIGluIHNlbGYuY29tbWFuZF9vcHRpb25zLml0ZW1zKCk6CgogICAgICAgICAgICBmb3Igb3B0LCAoc3JjLCB2YWwpIGluIG9wdHMuaXRlbXMoKToKCiAgICAgICAgICAgICAgICBpZiBzcmMgIT0gImNvbW1hbmQgbGluZSI6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgICAgICBvcHQgPSBvcHQucmVwbGFjZSgnXycsICctJykKCiAgICAgICAgICAgICAgICBpZiB2YWwgPT0gMDoKICAgICAgICAgICAgICAgICAgICBjbWRvYmogPSBzZWxmLmdldF9jb21tYW5kX29iaihjbWQpCiAgICAgICAgICAgICAgICAgICAgbmVnX29wdCA9IHNlbGYubmVnYXRpdmVfb3B0LmNvcHkoKQogICAgICAgICAgICAgICAgICAgIG5lZ19vcHQudXBkYXRlKGdldGF0dHIoY21kb2JqLCAnbmVnYXRpdmVfb3B0Jywge30pKQogICAgICAgICAgICAgICAgICAgIGZvciBuZWcsIHBvcyBpbiBuZWdfb3B0Lml0ZW1zKCk6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHBvcyA9PSBvcHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHQgPSBuZWcKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IE5vbmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoIlNob3VsZG4ndCBiZSBhYmxlIHRvIGdldCBoZXJlIikKCiAgICAgICAgICAgICAgICBlbGlmIHZhbCA9PSAxOgogICAgICAgICAgICAgICAgICAgIHZhbCA9IE5vbmUKCiAgICAgICAgICAgICAgICBkLnNldGRlZmF1bHQoY21kLCB7fSlbb3B0XSA9IHZhbAoKICAgICAgICByZXR1cm4gZAoKICAgIGRlZiBpdGVyX2Rpc3RyaWJ1dGlvbl9uYW1lcyhzZWxmKToKICAgICAgICAiIiJZaWVsZCBhbGwgcGFja2FnZXMsIG1vZHVsZXMsIGFuZCBleHRlbnNpb24gbmFtZXMgaW4gZGlzdHJpYnV0aW9uIiIiCgogICAgICAgIGZvciBwa2cgaW4gc2VsZi5wYWNrYWdlcyBvciAoKToKICAgICAgICAgICAgeWllbGQgcGtnCgogICAgICAgIGZvciBtb2R1bGUgaW4gc2VsZi5weV9tb2R1bGVzIG9yICgpOgogICAgICAgICAgICB5aWVsZCBtb2R1bGUKCiAgICAgICAgZm9yIGV4dCBpbiBzZWxmLmV4dF9tb2R1bGVzIG9yICgpOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV4dCwgdHVwbGUpOgogICAgICAgICAgICAgICAgbmFtZSwgYnVpbGRpbmZvID0gZXh0CiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBuYW1lID0gZXh0Lm5hbWUKICAgICAgICAgICAgaWYgbmFtZS5lbmRzd2l0aCgnbW9kdWxlJyk6CiAgICAgICAgICAgICAgICBuYW1lID0gbmFtZVs6LTZdCiAgICAgICAgICAgIHlpZWxkIG5hbWUKCiAgICBkZWYgaGFuZGxlX2Rpc3BsYXlfb3B0aW9ucyhzZWxmLCBvcHRpb25fb3JkZXIpOgogICAgICAgICIiIklmIHRoZXJlIHdlcmUgYW55IG5vbi1nbG9iYWwgImRpc3BsYXktb25seSIgb3B0aW9ucwogICAgICAgICgtLWhlbHAtY29tbWFuZHMgb3IgdGhlIG1ldGFkYXRhIGRpc3BsYXkgb3B0aW9ucykgb24gdGhlIGNvbW1hbmQKICAgICAgICBsaW5lLCBkaXNwbGF5IHRoZSByZXF1ZXN0ZWQgaW5mbyBhbmQgcmV0dXJuIHRydWU7IGVsc2UgcmV0dXJuCiAgICAgICAgZmFsc2UuCiAgICAgICAgIiIiCiAgICAgICAgaW1wb3J0IHN5cwoKICAgICAgICBpZiBzaXguUFkyIG9yIHNlbGYuaGVscF9jb21tYW5kczoKICAgICAgICAgICAgcmV0dXJuIF9EaXN0cmlidXRpb24uaGFuZGxlX2Rpc3BsYXlfb3B0aW9ucyhzZWxmLCBvcHRpb25fb3JkZXIpCgogICAgICAgICMgU3Rkb3V0IG1heSBiZSBTdHJpbmdJTyAoZS5nLiBpbiB0ZXN0cykKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShzeXMuc3Rkb3V0LCBpby5UZXh0SU9XcmFwcGVyKToKICAgICAgICAgICAgcmV0dXJuIF9EaXN0cmlidXRpb24uaGFuZGxlX2Rpc3BsYXlfb3B0aW9ucyhzZWxmLCBvcHRpb25fb3JkZXIpCgogICAgICAgICMgRG9uJ3Qgd3JhcCBzdGRvdXQgaWYgdXRmLTggaXMgYWxyZWFkeSB0aGUgZW5jb2RpbmcuIFByb3ZpZGVzCiAgICAgICAgIyAgd29ya2Fyb3VuZCBmb3IgIzMzNC4KICAgICAgICBpZiBzeXMuc3Rkb3V0LmVuY29kaW5nLmxvd2VyKCkgaW4gKCd1dGYtOCcsICd1dGY4Jyk6CiAgICAgICAgICAgIHJldHVybiBfRGlzdHJpYnV0aW9uLmhhbmRsZV9kaXNwbGF5X29wdGlvbnMoc2VsZiwgb3B0aW9uX29yZGVyKQoKICAgICAgICAjIFByaW50IG1ldGFkYXRhIGluIFVURi04IG5vIG1hdHRlciB0aGUgcGxhdGZvcm0KICAgICAgICBlbmNvZGluZyA9IHN5cy5zdGRvdXQuZW5jb2RpbmcKICAgICAgICBlcnJvcnMgPSBzeXMuc3Rkb3V0LmVycm9ycwogICAgICAgIG5ld2xpbmUgPSBzeXMucGxhdGZvcm0gIT0gJ3dpbjMyJyBhbmQgJ1xuJyBvciBOb25lCiAgICAgICAgbGluZV9idWZmZXJpbmcgPSBzeXMuc3Rkb3V0LmxpbmVfYnVmZmVyaW5nCgogICAgICAgIHN5cy5zdGRvdXQgPSBpby5UZXh0SU9XcmFwcGVyKAogICAgICAgICAgICBzeXMuc3Rkb3V0LmRldGFjaCgpLCAndXRmLTgnLCBlcnJvcnMsIG5ld2xpbmUsIGxpbmVfYnVmZmVyaW5nKQogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIF9EaXN0cmlidXRpb24uaGFuZGxlX2Rpc3BsYXlfb3B0aW9ucyhzZWxmLCBvcHRpb25fb3JkZXIpCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgc3lzLnN0ZG91dCA9IGlvLlRleHRJT1dyYXBwZXIoCiAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LmRldGFjaCgpLCBlbmNvZGluZywgZXJyb3JzLCBuZXdsaW5lLCBsaW5lX2J1ZmZlcmluZykKCgpjbGFzcyBGZWF0dXJlOgogICAgIiIiCiAgICAqKmRlcHJlY2F0ZWQqKiAtLSBUaGUgYEZlYXR1cmVgIGZhY2lsaXR5IHdhcyBuZXZlciBjb21wbGV0ZWx5IGltcGxlbWVudGVkCiAgICBvciBzdXBwb3J0ZWQsIGBoYXMgcmVwb3J0ZWQgaXNzdWVzCiAgICA8aHR0cHM6Ly9naXRodWIuY29tL3B5cGEvc2V0dXB0b29scy9pc3N1ZXMvNTg+YF8gYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbgogICAgYSBmdXR1cmUgdmVyc2lvbi4KCiAgICBBIHN1YnNldCBvZiB0aGUgZGlzdHJpYnV0aW9uIHRoYXQgY2FuIGJlIGV4Y2x1ZGVkIGlmIHVubmVlZGVkL3dhbnRlZAoKICAgIEZlYXR1cmVzIGFyZSBjcmVhdGVkIHVzaW5nIHRoZXNlIGtleXdvcmQgYXJndW1lbnRzOgoKICAgICAgJ2Rlc2NyaXB0aW9uJyAtLSBhIHNob3J0LCBodW1hbiByZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZSwgdG8KICAgICAgICAgYmUgdXNlZCBpbiBlcnJvciBtZXNzYWdlcywgYW5kIG9wdGlvbiBoZWxwIG1lc3NhZ2VzLgoKICAgICAgJ3N0YW5kYXJkJyAtLSBpZiB0cnVlLCB0aGUgZmVhdHVyZSBpcyBpbmNsdWRlZCBieSBkZWZhdWx0IGlmIGl0IGlzCiAgICAgICAgIGF2YWlsYWJsZSBvbiB0aGUgY3VycmVudCBzeXN0ZW0uICBPdGhlcndpc2UsIHRoZSBmZWF0dXJlIGlzIG9ubHkKICAgICAgICAgaW5jbHVkZWQgaWYgcmVxdWVzdGVkIHZpYSBhIGNvbW1hbmQgbGluZSAnLS13aXRoLVgnIG9wdGlvbiwgb3IgaWYKICAgICAgICAgYW5vdGhlciBpbmNsdWRlZCBmZWF0dXJlIHJlcXVpcmVzIGl0LiAgVGhlIGRlZmF1bHQgc2V0dGluZyBpcyAnRmFsc2UnLgoKICAgICAgJ2F2YWlsYWJsZScgLS0gaWYgdHJ1ZSwgdGhlIGZlYXR1cmUgaXMgYXZhaWxhYmxlIGZvciBpbnN0YWxsYXRpb24gb24gdGhlCiAgICAgICAgIGN1cnJlbnQgc3lzdGVtLiAgVGhlIGRlZmF1bHQgc2V0dGluZyBpcyAnVHJ1ZScuCgogICAgICAnb3B0aW9uYWwnIC0tIGlmIHRydWUsIHRoZSBmZWF0dXJlJ3MgaW5jbHVzaW9uIGNhbiBiZSBjb250cm9sbGVkIGZyb20gdGhlCiAgICAgICAgIGNvbW1hbmQgbGluZSwgdXNpbmcgdGhlICctLXdpdGgtWCcgb3IgJy0td2l0aG91dC1YJyBvcHRpb25zLiAgSWYKICAgICAgICAgZmFsc2UsIHRoZSBmZWF0dXJlJ3MgaW5jbHVzaW9uIHN0YXR1cyBpcyBkZXRlcm1pbmVkIGF1dG9tYXRpY2FsbHksCiAgICAgICAgIGJhc2VkIG9uICdhdmFpbGFiaWxlJywgJ3N0YW5kYXJkJywgYW5kIHdoZXRoZXIgYW55IG90aGVyIGZlYXR1cmUKICAgICAgICAgcmVxdWlyZXMgaXQuICBUaGUgZGVmYXVsdCBzZXR0aW5nIGlzICdUcnVlJy4KCiAgICAgICdyZXF1aXJlX2ZlYXR1cmVzJyAtLSBhIHN0cmluZyBvciBzZXF1ZW5jZSBvZiBzdHJpbmdzIG5hbWluZyBmZWF0dXJlcwogICAgICAgICB0aGF0IHNob3VsZCBhbHNvIGJlIGluY2x1ZGVkIGlmIHRoaXMgZmVhdHVyZSBpcyBpbmNsdWRlZC4gIERlZmF1bHRzIHRvCiAgICAgICAgIGVtcHR5IGxpc3QuICBNYXkgYWxzbyBjb250YWluICdSZXF1aXJlJyBvYmplY3RzIHRoYXQgc2hvdWxkIGJlCiAgICAgICAgIGFkZGVkL3JlbW92ZWQgZnJvbSB0aGUgZGlzdHJpYnV0aW9uLgoKICAgICAgJ3JlbW92ZScgLS0gYSBzdHJpbmcgb3IgbGlzdCBvZiBzdHJpbmdzIG5hbWluZyBwYWNrYWdlcyB0byBiZSByZW1vdmVkCiAgICAgICAgIGZyb20gdGhlIGRpc3RyaWJ1dGlvbiBpZiB0aGlzIGZlYXR1cmUgaXMgKm5vdCogaW5jbHVkZWQuICBJZiB0aGUKICAgICAgICAgZmVhdHVyZSAqaXMqIGluY2x1ZGVkLCB0aGlzIGFyZ3VtZW50IGlzIGlnbm9yZWQuICBUaGlzIGFyZ3VtZW50IGV4aXN0cwogICAgICAgICB0byBzdXBwb3J0IHJlbW92aW5nIGZlYXR1cmVzIHRoYXQgImNyb3NzY3V0IiBhIGRpc3RyaWJ1dGlvbiwgc3VjaCBhcwogICAgICAgICBkZWZpbmluZyBhICd0ZXN0cycgZmVhdHVyZSB0aGF0IHJlbW92ZXMgYWxsIHRoZSAndGVzdHMnIHN1YnBhY2thZ2VzCiAgICAgICAgIHByb3ZpZGVkIGJ5IG90aGVyIGZlYXR1cmVzLiAgVGhlIGRlZmF1bHQgZm9yIHRoaXMgYXJndW1lbnQgaXMgYW4gZW1wdHkKICAgICAgICAgbGlzdC4gIChOb3RlOiB0aGUgbmFtZWQgcGFja2FnZShzKSBvciBtb2R1bGVzIG11c3QgZXhpc3QgaW4gdGhlIGJhc2UKICAgICAgICAgZGlzdHJpYnV0aW9uIHdoZW4gdGhlICdzZXR1cCgpJyBmdW5jdGlvbiBpcyBpbml0aWFsbHkgY2FsbGVkLikKCiAgICAgIG90aGVyIGtleXdvcmRzIC0tIGFueSBvdGhlciBrZXl3b3JkIGFyZ3VtZW50cyBhcmUgc2F2ZWQsIGFuZCBwYXNzZWQgdG8KICAgICAgICAgdGhlIGRpc3RyaWJ1dGlvbidzICdpbmNsdWRlKCknIGFuZCAnZXhjbHVkZSgpJyBtZXRob2RzIHdoZW4gdGhlCiAgICAgICAgIGZlYXR1cmUgaXMgaW5jbHVkZWQgb3IgZXhjbHVkZWQsIHJlc3BlY3RpdmVseS4gIFNvLCBmb3IgZXhhbXBsZSwgeW91CiAgICAgICAgIGNvdWxkIHBhc3MgJ3BhY2thZ2VzPVsiYSIsImIiXScgdG8gY2F1c2UgcGFja2FnZXMgJ2EnIGFuZCAnYicgdG8gYmUKICAgICAgICAgYWRkZWQgb3IgcmVtb3ZlZCBmcm9tIHRoZSBkaXN0cmlidXRpb24gYXMgYXBwcm9wcmlhdGUuCgogICAgQSBmZWF0dXJlIG11c3QgaW5jbHVkZSBhdCBsZWFzdCBvbmUgJ3JlcXVpcmVzJywgJ3JlbW92ZScsIG9yIG90aGVyCiAgICBrZXl3b3JkIGFyZ3VtZW50LiAgT3RoZXJ3aXNlLCBpdCBjYW4ndCBhZmZlY3QgdGhlIGRpc3RyaWJ1dGlvbiBpbiBhbnkgd2F5LgogICAgTm90ZSBhbHNvIHRoYXQgeW91IGNhbiBzdWJjbGFzcyAnRmVhdHVyZScgdG8gY3JlYXRlIHlvdXIgb3duIHNwZWNpYWxpemVkCiAgICBmZWF0dXJlIHR5cGVzIHRoYXQgbW9kaWZ5IHRoZSBkaXN0cmlidXRpb24gaW4gb3RoZXIgd2F5cyB3aGVuIGluY2x1ZGVkIG9yCiAgICBleGNsdWRlZC4gIFNlZSB0aGUgZG9jc3RyaW5ncyBmb3IgdGhlIHZhcmlvdXMgbWV0aG9kcyBoZXJlIGZvciBtb3JlIGRldGFpbC4KICAgIEFzaWRlIGZyb20gdGhlIG1ldGhvZHMsIHRoZSBvbmx5IGZlYXR1cmUgYXR0cmlidXRlcyB0aGF0IGRpc3RyaWJ1dGlvbnMgbG9vawogICAgYXQgYXJlICdkZXNjcmlwdGlvbicgYW5kICdvcHRpb25hbCcuCiAgICAiIiIKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgd2Fybl9kZXByZWNhdGVkKCk6CiAgICAgICAgbXNnID0gKAogICAgICAgICAgICAiRmVhdHVyZXMgYXJlIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSAiCiAgICAgICAgICAgICJ2ZXJzaW9uLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3B5cGEvc2V0dXB0b29scy9pc3N1ZXMvNjUuIgogICAgICAgICkKICAgICAgICB3YXJuaW5ncy53YXJuKG1zZywgRGlzdERlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD0zKQoKICAgIGRlZiBfX2luaXRfXygKICAgICAgICAgICAgc2VsZiwgZGVzY3JpcHRpb24sIHN0YW5kYXJkPUZhbHNlLCBhdmFpbGFibGU9VHJ1ZSwKICAgICAgICAgICAgb3B0aW9uYWw9VHJ1ZSwgcmVxdWlyZV9mZWF0dXJlcz0oKSwgcmVtb3ZlPSgpLCAqKmV4dHJhcyk6CiAgICAgICAgc2VsZi53YXJuX2RlcHJlY2F0ZWQoKQoKICAgICAgICBzZWxmLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24KICAgICAgICBzZWxmLnN0YW5kYXJkID0gc3RhbmRhcmQKICAgICAgICBzZWxmLmF2YWlsYWJsZSA9IGF2YWlsYWJsZQogICAgICAgIHNlbGYub3B0aW9uYWwgPSBvcHRpb25hbAogICAgICAgIGlmIGlzaW5zdGFuY2UocmVxdWlyZV9mZWF0dXJlcywgKHN0ciwgUmVxdWlyZSkpOgogICAgICAgICAgICByZXF1aXJlX2ZlYXR1cmVzID0gcmVxdWlyZV9mZWF0dXJlcywKCiAgICAgICAgc2VsZi5yZXF1aXJlX2ZlYXR1cmVzID0gWwogICAgICAgICAgICByIGZvciByIGluIHJlcXVpcmVfZmVhdHVyZXMgaWYgaXNpbnN0YW5jZShyLCBzdHIpCiAgICAgICAgXQogICAgICAgIGVyID0gW3IgZm9yIHIgaW4gcmVxdWlyZV9mZWF0dXJlcyBpZiBub3QgaXNpbnN0YW5jZShyLCBzdHIpXQogICAgICAgIGlmIGVyOgogICAgICAgICAgICBleHRyYXNbJ3JlcXVpcmVfZmVhdHVyZXMnXSA9IGVyCgogICAgICAgIGlmIGlzaW5zdGFuY2UocmVtb3ZlLCBzdHIpOgogICAgICAgICAgICByZW1vdmUgPSByZW1vdmUsCiAgICAgICAgc2VsZi5yZW1vdmUgPSByZW1vdmUKICAgICAgICBzZWxmLmV4dHJhcyA9IGV4dHJhcwoKICAgICAgICBpZiBub3QgcmVtb3ZlIGFuZCBub3QgcmVxdWlyZV9mZWF0dXJlcyBhbmQgbm90IGV4dHJhczoKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKICAgICAgICAgICAgICAgICJGZWF0dXJlICVzOiBtdXN0IGRlZmluZSAncmVxdWlyZV9mZWF0dXJlcycsICdyZW1vdmUnLCBvciAiCiAgICAgICAgICAgICAgICAiYXQgbGVhc3Qgb25lIG9mICdwYWNrYWdlcycsICdweV9tb2R1bGVzJywgZXRjLiIKICAgICAgICAgICAgKQoKICAgIGRlZiBpbmNsdWRlX2J5X2RlZmF1bHQoc2VsZik6CiAgICAgICAgIiIiU2hvdWxkIHRoaXMgZmVhdHVyZSBiZSBpbmNsdWRlZCBieSBkZWZhdWx0PyIiIgogICAgICAgIHJldHVybiBzZWxmLmF2YWlsYWJsZSBhbmQgc2VsZi5zdGFuZGFyZAoKICAgIGRlZiBpbmNsdWRlX2luKHNlbGYsIGRpc3QpOgogICAgICAgICIiIkVuc3VyZSBmZWF0dXJlIGFuZCBpdHMgcmVxdWlyZW1lbnRzIGFyZSBpbmNsdWRlZCBpbiBkaXN0cmlidXRpb24KCiAgICAgICAgWW91IG1heSBvdmVycmlkZSB0aGlzIGluIGEgc3ViY2xhc3MgdG8gcGVyZm9ybSBhZGRpdGlvbmFsIG9wZXJhdGlvbnMgb24KICAgICAgICB0aGUgZGlzdHJpYnV0aW9uLiAgTm90ZSB0aGF0IHRoaXMgbWV0aG9kIG1heSBiZSBjYWxsZWQgbW9yZSB0aGFuIG9uY2UKICAgICAgICBwZXIgZmVhdHVyZSwgYW5kIHNvIHNob3VsZCBiZSBpZGVtcG90ZW50LgoKICAgICAgICAiIiIKCiAgICAgICAgaWYgbm90IHNlbGYuYXZhaWxhYmxlOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yKAogICAgICAgICAgICAgICAgc2VsZi5kZXNjcmlwdGlvbiArICIgaXMgcmVxdWlyZWQsICIKICAgICAgICAgICAgICAgICJidXQgaXMgbm90IGF2YWlsYWJsZSBvbiB0aGlzIHBsYXRmb3JtIgogICAgICAgICAgICApCgogICAgICAgIGRpc3QuaW5jbHVkZSgqKnNlbGYuZXh0cmFzKQoKICAgICAgICBmb3IgZiBpbiBzZWxmLnJlcXVpcmVfZmVhdHVyZXM6CiAgICAgICAgICAgIGRpc3QuaW5jbHVkZV9mZWF0dXJlKGYpCgogICAgZGVmIGV4Y2x1ZGVfZnJvbShzZWxmLCBkaXN0KToKICAgICAgICAiIiJFbnN1cmUgZmVhdHVyZSBpcyBleGNsdWRlZCBmcm9tIGRpc3RyaWJ1dGlvbgoKICAgICAgICBZb3UgbWF5IG92ZXJyaWRlIHRoaXMgaW4gYSBzdWJjbGFzcyB0byBwZXJmb3JtIGFkZGl0aW9uYWwgb3BlcmF0aW9ucyBvbgogICAgICAgIHRoZSBkaXN0cmlidXRpb24uICBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBhdCBtb3N0IG9uY2UgcGVyCiAgICAgICAgZmVhdHVyZSwgYW5kIG9ubHkgYWZ0ZXIgYWxsIGluY2x1ZGVkIGZlYXR1cmVzIGhhdmUgYmVlbiBhc2tlZCB0bwogICAgICAgIGluY2x1ZGUgdGhlbXNlbHZlcy4KICAgICAgICAiIiIKCiAgICAgICAgZGlzdC5leGNsdWRlKCoqc2VsZi5leHRyYXMpCgogICAgICAgIGlmIHNlbGYucmVtb3ZlOgogICAgICAgICAgICBmb3IgaXRlbSBpbiBzZWxmLnJlbW92ZToKICAgICAgICAgICAgICAgIGRpc3QuZXhjbHVkZV9wYWNrYWdlKGl0ZW0pCgogICAgZGVmIHZhbGlkYXRlKHNlbGYsIGRpc3QpOgogICAgICAgICIiIlZlcmlmeSB0aGF0IGZlYXR1cmUgbWFrZXMgc2Vuc2UgaW4gY29udGV4dCBvZiBkaXN0cmlidXRpb24KCiAgICAgICAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBkaXN0cmlidXRpb24ganVzdCBiZWZvcmUgaXQgcGFyc2VzIGl0cwogICAgICAgIGNvbW1hbmQgbGluZS4gIEl0IGNoZWNrcyB0byBlbnN1cmUgdGhhdCB0aGUgJ3JlbW92ZScgYXR0cmlidXRlLCBpZiBhbnksCiAgICAgICAgY29udGFpbnMgb25seSB2YWxpZCBwYWNrYWdlL21vZHVsZSBuYW1lcyB0aGF0IGFyZSBwcmVzZW50IGluIHRoZSBiYXNlCiAgICAgICAgZGlzdHJpYnV0aW9uIHdoZW4gJ3NldHVwKCknIGlzIGNhbGxlZC4gIFlvdSBtYXkgb3ZlcnJpZGUgaXQgaW4gYQogICAgICAgIHN1YmNsYXNzIHRvIHBlcmZvcm0gYW55IG90aGVyIHJlcXVpcmVkIHZhbGlkYXRpb24gb2YgdGhlIGZlYXR1cmUKICAgICAgICBhZ2FpbnN0IGEgdGFyZ2V0IGRpc3RyaWJ1dGlvbi4KICAgICAgICAiIiIKCiAgICAgICAgZm9yIGl0ZW0gaW4gc2VsZi5yZW1vdmU6CiAgICAgICAgICAgIGlmIG5vdCBkaXN0Lmhhc19jb250ZW50c19mb3IoaXRlbSk6CiAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAogICAgICAgICAgICAgICAgICAgICIlcyB3YW50cyB0byBiZSBhYmxlIHRvIHJlbW92ZSAlcywgYnV0IHRoZSBkaXN0cmlidXRpb24iCiAgICAgICAgICAgICAgICAgICAgIiBkb2Vzbid0IGNvbnRhaW4gYW55IHBhY2thZ2VzIG9yIG1vZHVsZXMgdW5kZXIgJXMiCiAgICAgICAgICAgICAgICAgICAgJSAoc2VsZi5kZXNjcmlwdGlvbiwgaXRlbSwgaXRlbSkKICAgICAgICAgICAgICAgICkKCgpjbGFzcyBEaXN0RGVwcmVjYXRpb25XYXJuaW5nKFNldHVwdG9vbHNEZXByZWNhdGlvbldhcm5pbmcpOgogICAgIiIiQ2xhc3MgZm9yIHdhcm5pbmcgYWJvdXQgZGVwcmVjYXRpb25zIGluIGRpc3QgaW4KICAgIHNldHVwdG9vbHMuIE5vdCBpZ25vcmVkIGJ5IGRlZmF1bHQsIHVubGlrZSBEZXByZWNhdGlvbldhcm5pbmcuIiIiClBLAwQUAAAAAAAAACEAu/9R5gwCAAAMAgAAOQAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2Vycm9ycy5weSIiInNldHVwdG9vbHMuZXJyb3JzCgpQcm92aWRlcyBleGNlcHRpb25zIHVzZWQgYnkgc2V0dXB0b29scyBtb2R1bGVzLgoiIiIKCmZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzRXJyb3IKCgpjbGFzcyBSZW1vdmVkQ29tbWFuZEVycm9yKERpc3R1dGlsc0Vycm9yLCBSdW50aW1lRXJyb3IpOgogICAgIiIiRXJyb3IgdXNlZCBmb3IgY29tbWFuZHMgdGhhdCBoYXZlIGJlZW4gcmVtb3ZlZCBpbiBzZXR1cHRvb2xzLgoKICAgIFNpbmNlIGBgc2V0dXB0b29sc2BgIGlzIGJ1aWx0IG9uIGBgZGlzdHV0aWxzYGAsIHNpbXBseSByZW1vdmluZyBhIGNvbW1hbmQKICAgIGZyb20gYGBzZXR1cHRvb2xzYGAgd2lsbCBtYWtlIHRoZSBiZWhhdmlvciBmYWxsIGJhY2sgdG8gYGBkaXN0dXRpbHNgYDsgdGhpcwogICAgZXJyb3IgaXMgcmFpc2VkIGlmIGEgY29tbWFuZCBleGlzdHMgaW4gYGBkaXN0dXRpbHNgYCBidXQgaGFzIGJlZW4gYWN0aXZlbHkKICAgIHJlbW92ZWQgaW4gYGBzZXR1cHRvb2xzYGAuCiAgICAiIiIKUEsDBBQAAAAAAAAAIQC5qpHuwQYAAMEGAAA8AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvZXh0ZW5zaW9uLnB5aW1wb3J0IHJlCmltcG9ydCBmdW5jdG9vbHMKaW1wb3J0IGRpc3R1dGlscy5jb3JlCmltcG9ydCBkaXN0dXRpbHMuZXJyb3JzCmltcG9ydCBkaXN0dXRpbHMuZXh0ZW5zaW9uCgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuLnNpeC5tb3ZlcyBpbXBvcnQgbWFwCgpmcm9tIC5tb25rZXkgaW1wb3J0IGdldF91bnBhdGNoZWQKCgpkZWYgX2hhdmVfY3l0aG9uKCk6CiAgICAiIiIKICAgIFJldHVybiBUcnVlIGlmIEN5dGhvbiBjYW4gYmUgaW1wb3J0ZWQuCiAgICAiIiIKICAgIGN5dGhvbl9pbXBsID0gJ0N5dGhvbi5EaXN0dXRpbHMuYnVpbGRfZXh0JwogICAgdHJ5OgogICAgICAgICMgZnJvbSAoY3l0aG9uX2ltcGwpIGltcG9ydCBidWlsZF9leHQKICAgICAgICBfX2ltcG9ydF9fKGN5dGhvbl9pbXBsLCBmcm9tbGlzdD1bJ2J1aWxkX2V4dCddKS5idWlsZF9leHQKICAgICAgICByZXR1cm4gVHJ1ZQogICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICBwYXNzCiAgICByZXR1cm4gRmFsc2UKCgojIGZvciBjb21wYXRpYmlsaXR5CmhhdmVfcHlyZXggPSBfaGF2ZV9jeXRob24KCl9FeHRlbnNpb24gPSBnZXRfdW5wYXRjaGVkKGRpc3R1dGlscy5jb3JlLkV4dGVuc2lvbikKCgpjbGFzcyBFeHRlbnNpb24oX0V4dGVuc2lvbik6CiAgICAiIiJFeHRlbnNpb24gdGhhdCB1c2VzICcuYycgZmlsZXMgaW4gcGxhY2Ugb2YgJy5weXgnIGZpbGVzIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIHNvdXJjZXMsICphcmdzLCAqKmt3KToKICAgICAgICAjIFRoZSAqYXJncyBpcyBuZWVkZWQgZm9yIGNvbXBhdGliaWxpdHkgYXMgY2FsbHMgbWF5IHVzZSBwb3NpdGlvbmFsCiAgICAgICAgIyBhcmd1bWVudHMuIHB5X2xpbWl0ZWRfYXBpIG1heSBiZSBzZXQgb25seSB2aWEga2V5d29yZC4KICAgICAgICBzZWxmLnB5X2xpbWl0ZWRfYXBpID0ga3cucG9wKCJweV9saW1pdGVkX2FwaSIsIEZhbHNlKQogICAgICAgIF9FeHRlbnNpb24uX19pbml0X18oc2VsZiwgbmFtZSwgc291cmNlcywgKmFyZ3MsICoqa3cpCgogICAgZGVmIF9jb252ZXJ0X3B5eF9zb3VyY2VzX3RvX2xhbmcoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmVwbGFjZSBzb3VyY2VzIHdpdGggLnB5eCBleHRlbnNpb25zIHRvIHNvdXJjZXMgd2l0aCB0aGUgdGFyZ2V0CiAgICAgICAgbGFuZ3VhZ2UgZXh0ZW5zaW9uLiBUaGlzIG1lY2hhbmlzbSBhbGxvd3MgbGFuZ3VhZ2UgYXV0aG9ycyB0byBzdXBwbHkKICAgICAgICBwcmUtY29udmVydGVkIHNvdXJjZXMgYnV0IHRvIHByZWZlciB0aGUgLnB5eCBzb3VyY2VzLgogICAgICAgICIiIgogICAgICAgIGlmIF9oYXZlX2N5dGhvbigpOgogICAgICAgICAgICAjIHRoZSBidWlsZCBoYXMgQ3l0aG9uLCBzbyBhbGxvdyBpdCB0byBjb21waWxlIHRoZSAucHl4IGZpbGVzCiAgICAgICAgICAgIHJldHVybgogICAgICAgIGxhbmcgPSBzZWxmLmxhbmd1YWdlIG9yICcnCiAgICAgICAgdGFyZ2V0X2V4dCA9ICcuY3BwJyBpZiBsYW5nLmxvd2VyKCkgPT0gJ2MrKycgZWxzZSAnLmMnCiAgICAgICAgc3ViID0gZnVuY3Rvb2xzLnBhcnRpYWwocmUuc3ViLCAnLnB5eCQnLCB0YXJnZXRfZXh0KQogICAgICAgIHNlbGYuc291cmNlcyA9IGxpc3QobWFwKHN1Yiwgc2VsZi5zb3VyY2VzKSkKCgpjbGFzcyBMaWJyYXJ5KEV4dGVuc2lvbik6CiAgICAiIiJKdXN0IGxpa2UgYSByZWd1bGFyIEV4dGVuc2lvbiwgYnV0IGJ1aWx0IGFzIGEgbGlicmFyeSBpbnN0ZWFkIiIiClBLAwQUAAAAAAAAACEAxyRsk9IJAADSCQAAQgAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2V4dGVybi9fX2luaXRfXy5weWltcG9ydCBzeXMKCgpjbGFzcyBWZW5kb3JJbXBvcnRlcjoKICAgICIiIgogICAgQSBQRVAgMzAyIG1ldGEgcGF0aCBpbXBvcnRlciBmb3IgZmluZGluZyBvcHRpb25hbGx5LXZlbmRvcmVkCiAgICBvciBvdGhlcndpc2UgbmF0dXJhbGx5LWluc3RhbGxlZCBwYWNrYWdlcyBmcm9tIHJvb3RfbmFtZS4KICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCByb290X25hbWUsIHZlbmRvcmVkX25hbWVzPSgpLCB2ZW5kb3JfcGtnPU5vbmUpOgogICAgICAgIHNlbGYucm9vdF9uYW1lID0gcm9vdF9uYW1lCiAgICAgICAgc2VsZi52ZW5kb3JlZF9uYW1lcyA9IHNldCh2ZW5kb3JlZF9uYW1lcykKICAgICAgICBzZWxmLnZlbmRvcl9wa2cgPSB2ZW5kb3JfcGtnIG9yIHJvb3RfbmFtZS5yZXBsYWNlKCdleHRlcm4nLCAnX3ZlbmRvcicpCgogICAgQHByb3BlcnR5CiAgICBkZWYgc2VhcmNoX3BhdGgoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgU2VhcmNoIGZpcnN0IHRoZSB2ZW5kb3IgcGFja2FnZSB0aGVuIGFzIGEgbmF0dXJhbCBwYWNrYWdlLgogICAgICAgICIiIgogICAgICAgIHlpZWxkIHNlbGYudmVuZG9yX3BrZyArICcuJwogICAgICAgIHlpZWxkICcnCgogICAgZGVmIGZpbmRfbW9kdWxlKHNlbGYsIGZ1bGxuYW1lLCBwYXRoPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBzZWxmIHdoZW4gZnVsbG5hbWUgc3RhcnRzIHdpdGggcm9vdF9uYW1lIGFuZCB0aGUKICAgICAgICB0YXJnZXQgbW9kdWxlIGlzIG9uZSB2ZW5kb3JlZCB0aHJvdWdoIHRoaXMgaW1wb3J0ZXIuCiAgICAgICAgIiIiCiAgICAgICAgcm9vdCwgYmFzZSwgdGFyZ2V0ID0gZnVsbG5hbWUucGFydGl0aW9uKHNlbGYucm9vdF9uYW1lICsgJy4nKQogICAgICAgIGlmIHJvb3Q6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIGlmIG5vdCBhbnkobWFwKHRhcmdldC5zdGFydHN3aXRoLCBzZWxmLnZlbmRvcmVkX25hbWVzKSk6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIGxvYWRfbW9kdWxlKHNlbGYsIGZ1bGxuYW1lKToKICAgICAgICAiIiIKICAgICAgICBJdGVyYXRlIG92ZXIgdGhlIHNlYXJjaCBwYXRoIHRvIGxvY2F0ZSBhbmQgbG9hZCBmdWxsbmFtZS4KICAgICAgICAiIiIKICAgICAgICByb290LCBiYXNlLCB0YXJnZXQgPSBmdWxsbmFtZS5wYXJ0aXRpb24oc2VsZi5yb290X25hbWUgKyAnLicpCiAgICAgICAgZm9yIHByZWZpeCBpbiBzZWxmLnNlYXJjaF9wYXRoOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBleHRhbnQgPSBwcmVmaXggKyB0YXJnZXQKICAgICAgICAgICAgICAgIF9faW1wb3J0X18oZXh0YW50KQogICAgICAgICAgICAgICAgbW9kID0gc3lzLm1vZHVsZXNbZXh0YW50XQogICAgICAgICAgICAgICAgc3lzLm1vZHVsZXNbZnVsbG5hbWVdID0gbW9kCiAgICAgICAgICAgICAgICAjIG15c3RlcmlvdXMgaGFjazoKICAgICAgICAgICAgICAgICMgUmVtb3ZlIHRoZSByZWZlcmVuY2UgdG8gdGhlIGV4dGFudCBwYWNrYWdlL21vZHVsZQogICAgICAgICAgICAgICAgIyBvbiBsYXRlciBQeXRob24gdmVyc2lvbnMgdG8gY2F1c2UgcmVsYXRpdmUgaW1wb3J0cwogICAgICAgICAgICAgICAgIyBpbiB0aGUgdmVuZG9yIHBhY2thZ2UgdG8gcmVzb2x2ZSB0aGUgc2FtZSBtb2R1bGVzCiAgICAgICAgICAgICAgICAjIGFzIHRob3NlIGdvaW5nIHRocm91Z2ggdGhpcyBpbXBvcnRlci4KICAgICAgICAgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm8gPj0gKDMsICk6CiAgICAgICAgICAgICAgICAgICAgZGVsIHN5cy5tb2R1bGVzW2V4dGFudF0KICAgICAgICAgICAgICAgIHJldHVybiBtb2QKICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgICAgICAgICAgcGFzcwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yKAogICAgICAgICAgICAgICAgIlRoZSAne3RhcmdldH0nIHBhY2thZ2UgaXMgcmVxdWlyZWQ7ICIKICAgICAgICAgICAgICAgICJub3JtYWxseSB0aGlzIGlzIGJ1bmRsZWQgd2l0aCB0aGlzIHBhY2thZ2Ugc28gaWYgeW91IGdldCAiCiAgICAgICAgICAgICAgICAidGhpcyB3YXJuaW5nLCBjb25zdWx0IHRoZSBwYWNrYWdlciBvZiB5b3VyICIKICAgICAgICAgICAgICAgICJkaXN0cmlidXRpb24uIi5mb3JtYXQoKipsb2NhbHMoKSkKICAgICAgICAgICAgKQoKICAgIGRlZiBpbnN0YWxsKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIEluc3RhbGwgdGhpcyBpbXBvcnRlciBpbnRvIHN5cy5tZXRhX3BhdGggaWYgbm90IGFscmVhZHkgcHJlc2VudC4KICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmIG5vdCBpbiBzeXMubWV0YV9wYXRoOgogICAgICAgICAgICBzeXMubWV0YV9wYXRoLmFwcGVuZChzZWxmKQoKCm5hbWVzID0gJ3NpeCcsICdwYWNrYWdpbmcnLCAncHlwYXJzaW5nJywgJ29yZGVyZWRfc2V0JywKVmVuZG9ySW1wb3J0ZXIoX19uYW1lX18sIG5hbWVzLCAnc2V0dXB0b29scy5fdmVuZG9yJykuaW5zdGFsbCgpClBLAwQUAAAAAAAAACEAjshPa9wTAADcEwAANwAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2dsb2IucHkiIiIKRmlsZW5hbWUgZ2xvYmJpbmcgdXRpbGl0eS4gTW9zdGx5IGEgY29weSBvZiBgZ2xvYmAgZnJvbSBQeXRob24gMy41LgoKQ2hhbmdlcyBpbmNsdWRlOgogKiBgeWllbGQgZnJvbWAgYW5kIFBFUDMxMDIgYCpgIHJlbW92ZWQuCiAqIEhpZGRlbiBmaWxlcyBhcmUgbm90IGlnbm9yZWQuCiIiIgoKaW1wb3J0IG9zCmltcG9ydCByZQppbXBvcnQgZm5tYXRjaAoKX19hbGxfXyA9IFsiZ2xvYiIsICJpZ2xvYiIsICJlc2NhcGUiXQoKCmRlZiBnbG9iKHBhdGhuYW1lLCByZWN1cnNpdmU9RmFsc2UpOgogICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBwYXRocyBtYXRjaGluZyBhIHBhdGhuYW1lIHBhdHRlcm4uCgogICAgVGhlIHBhdHRlcm4gbWF5IGNvbnRhaW4gc2ltcGxlIHNoZWxsLXN0eWxlIHdpbGRjYXJkcyBhIGxhCiAgICBmbm1hdGNoLiBIb3dldmVyLCB1bmxpa2UgZm5tYXRjaCwgZmlsZW5hbWVzIHN0YXJ0aW5nIHdpdGggYQogICAgZG90IGFyZSBzcGVjaWFsIGNhc2VzIHRoYXQgYXJlIG5vdCBtYXRjaGVkIGJ5ICcqJyBhbmQgJz8nCiAgICBwYXR0ZXJucy4KCiAgICBJZiByZWN1cnNpdmUgaXMgdHJ1ZSwgdGhlIHBhdHRlcm4gJyoqJyB3aWxsIG1hdGNoIGFueSBmaWxlcyBhbmQKICAgIHplcm8gb3IgbW9yZSBkaXJlY3RvcmllcyBhbmQgc3ViZGlyZWN0b3JpZXMuCiAgICAiIiIKICAgIHJldHVybiBsaXN0KGlnbG9iKHBhdGhuYW1lLCByZWN1cnNpdmU9cmVjdXJzaXZlKSkKCgpkZWYgaWdsb2IocGF0aG5hbWUsIHJlY3Vyc2l2ZT1GYWxzZSk6CiAgICAiIiJSZXR1cm4gYW4gaXRlcmF0b3Igd2hpY2ggeWllbGRzIHRoZSBwYXRocyBtYXRjaGluZyBhIHBhdGhuYW1lIHBhdHRlcm4uCgogICAgVGhlIHBhdHRlcm4gbWF5IGNvbnRhaW4gc2ltcGxlIHNoZWxsLXN0eWxlIHdpbGRjYXJkcyBhIGxhCiAgICBmbm1hdGNoLiBIb3dldmVyLCB1bmxpa2UgZm5tYXRjaCwgZmlsZW5hbWVzIHN0YXJ0aW5nIHdpdGggYQogICAgZG90IGFyZSBzcGVjaWFsIGNhc2VzIHRoYXQgYXJlIG5vdCBtYXRjaGVkIGJ5ICcqJyBhbmQgJz8nCiAgICBwYXR0ZXJucy4KCiAgICBJZiByZWN1cnNpdmUgaXMgdHJ1ZSwgdGhlIHBhdHRlcm4gJyoqJyB3aWxsIG1hdGNoIGFueSBmaWxlcyBhbmQKICAgIHplcm8gb3IgbW9yZSBkaXJlY3RvcmllcyBhbmQgc3ViZGlyZWN0b3JpZXMuCiAgICAiIiIKICAgIGl0ID0gX2lnbG9iKHBhdGhuYW1lLCByZWN1cnNpdmUpCiAgICBpZiByZWN1cnNpdmUgYW5kIF9pc3JlY3Vyc2l2ZShwYXRobmFtZSk6CiAgICAgICAgcyA9IG5leHQoaXQpICAjIHNraXAgZW1wdHkgc3RyaW5nCiAgICAgICAgYXNzZXJ0IG5vdCBzCiAgICByZXR1cm4gaXQKCgpkZWYgX2lnbG9iKHBhdGhuYW1lLCByZWN1cnNpdmUpOgogICAgZGlybmFtZSwgYmFzZW5hbWUgPSBvcy5wYXRoLnNwbGl0KHBhdGhuYW1lKQogICAgaWYgbm90IGhhc19tYWdpYyhwYXRobmFtZSk6CiAgICAgICAgaWYgYmFzZW5hbWU6CiAgICAgICAgICAgIGlmIG9zLnBhdGgubGV4aXN0cyhwYXRobmFtZSk6CiAgICAgICAgICAgICAgICB5aWVsZCBwYXRobmFtZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgUGF0dGVybnMgZW5kaW5nIHdpdGggYSBzbGFzaCBzaG91bGQgbWF0Y2ggb25seSBkaXJlY3RvcmllcwogICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGRpcm5hbWUpOgogICAgICAgICAgICAgICAgeWllbGQgcGF0aG5hbWUKICAgICAgICByZXR1cm4KICAgIGlmIG5vdCBkaXJuYW1lOgogICAgICAgIGlmIHJlY3Vyc2l2ZSBhbmQgX2lzcmVjdXJzaXZlKGJhc2VuYW1lKToKICAgICAgICAgICAgZm9yIHggaW4gZ2xvYjIoZGlybmFtZSwgYmFzZW5hbWUpOgogICAgICAgICAgICAgICAgeWllbGQgeAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGZvciB4IGluIGdsb2IxKGRpcm5hbWUsIGJhc2VuYW1lKToKICAgICAgICAgICAgICAgIHlpZWxkIHgKICAgICAgICByZXR1cm4KICAgICMgYG9zLnBhdGguc3BsaXQoKWAgcmV0dXJucyB0aGUgYXJndW1lbnQgaXRzZWxmIGFzIGEgZGlybmFtZSBpZiBpdCBpcyBhCiAgICAjIGRyaXZlIG9yIFVOQyBwYXRoLiAgUHJldmVudCBhbiBpbmZpbml0ZSByZWN1cnNpb24gaWYgYSBkcml2ZSBvciBVTkMgcGF0aAogICAgIyBjb250YWlucyBtYWdpYyBjaGFyYWN0ZXJzIChpLmUuIHInXFw/XEM6JykuCiAgICBpZiBkaXJuYW1lICE9IHBhdGhuYW1lIGFuZCBoYXNfbWFnaWMoZGlybmFtZSk6CiAgICAgICAgZGlycyA9IF9pZ2xvYihkaXJuYW1lLCByZWN1cnNpdmUpCiAgICBlbHNlOgogICAgICAgIGRpcnMgPSBbZGlybmFtZV0KICAgIGlmIGhhc19tYWdpYyhiYXNlbmFtZSk6CiAgICAgICAgaWYgcmVjdXJzaXZlIGFuZCBfaXNyZWN1cnNpdmUoYmFzZW5hbWUpOgogICAgICAgICAgICBnbG9iX2luX2RpciA9IGdsb2IyCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZ2xvYl9pbl9kaXIgPSBnbG9iMQogICAgZWxzZToKICAgICAgICBnbG9iX2luX2RpciA9IGdsb2IwCiAgICBmb3IgZGlybmFtZSBpbiBkaXJzOgogICAgICAgIGZvciBuYW1lIGluIGdsb2JfaW5fZGlyKGRpcm5hbWUsIGJhc2VuYW1lKToKICAgICAgICAgICAgeWllbGQgb3MucGF0aC5qb2luKGRpcm5hbWUsIG5hbWUpCgoKIyBUaGVzZSAyIGhlbHBlciBmdW5jdGlvbnMgbm9uLXJlY3Vyc2l2ZWx5IGdsb2IgaW5zaWRlIGEgbGl0ZXJhbCBkaXJlY3RvcnkuCiMgVGhleSByZXR1cm4gYSBsaXN0IG9mIGJhc2VuYW1lcy4gYGdsb2IxYCBhY2NlcHRzIGEgcGF0dGVybiB3aGlsZSBgZ2xvYjBgCiMgdGFrZXMgYSBsaXRlcmFsIGJhc2VuYW1lIChzbyBpdCBvbmx5IGhhcyB0byBjaGVjayBmb3IgaXRzIGV4aXN0ZW5jZSkuCgoKZGVmIGdsb2IxKGRpcm5hbWUsIHBhdHRlcm4pOgogICAgaWYgbm90IGRpcm5hbWU6CiAgICAgICAgaWYgaXNpbnN0YW5jZShwYXR0ZXJuLCBieXRlcyk6CiAgICAgICAgICAgIGRpcm5hbWUgPSBvcy5jdXJkaXIuZW5jb2RlKCdBU0NJSScpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZGlybmFtZSA9IG9zLmN1cmRpcgogICAgdHJ5OgogICAgICAgIG5hbWVzID0gb3MubGlzdGRpcihkaXJuYW1lKQogICAgZXhjZXB0IE9TRXJyb3I6CiAgICAgICAgcmV0dXJuIFtdCiAgICByZXR1cm4gZm5tYXRjaC5maWx0ZXIobmFtZXMsIHBhdHRlcm4pCgoKZGVmIGdsb2IwKGRpcm5hbWUsIGJhc2VuYW1lKToKICAgIGlmIG5vdCBiYXNlbmFtZToKICAgICAgICAjIGBvcy5wYXRoLnNwbGl0KClgIHJldHVybnMgYW4gZW1wdHkgYmFzZW5hbWUgZm9yIHBhdGhzIGVuZGluZyB3aXRoIGEKICAgICAgICAjIGRpcmVjdG9yeSBzZXBhcmF0b3IuICAncSp4Lycgc2hvdWxkIG1hdGNoIG9ubHkgZGlyZWN0b3JpZXMuCiAgICAgICAgaWYgb3MucGF0aC5pc2RpcihkaXJuYW1lKToKICAgICAgICAgICAgcmV0dXJuIFtiYXNlbmFtZV0KICAgIGVsc2U6CiAgICAgICAgaWYgb3MucGF0aC5sZXhpc3RzKG9zLnBhdGguam9pbihkaXJuYW1lLCBiYXNlbmFtZSkpOgogICAgICAgICAgICByZXR1cm4gW2Jhc2VuYW1lXQogICAgcmV0dXJuIFtdCgoKIyBUaGlzIGhlbHBlciBmdW5jdGlvbiByZWN1cnNpdmVseSB5aWVsZHMgcmVsYXRpdmUgcGF0aG5hbWVzIGluc2lkZSBhIGxpdGVyYWwKIyBkaXJlY3RvcnkuCgoKZGVmIGdsb2IyKGRpcm5hbWUsIHBhdHRlcm4pOgogICAgYXNzZXJ0IF9pc3JlY3Vyc2l2ZShwYXR0ZXJuKQogICAgeWllbGQgcGF0dGVybls6MF0KICAgIGZvciB4IGluIF9ybGlzdGRpcihkaXJuYW1lKToKICAgICAgICB5aWVsZCB4CgoKIyBSZWN1cnNpdmVseSB5aWVsZHMgcmVsYXRpdmUgcGF0aG5hbWVzIGluc2lkZSBhIGxpdGVyYWwgZGlyZWN0b3J5LgpkZWYgX3JsaXN0ZGlyKGRpcm5hbWUpOgogICAgaWYgbm90IGRpcm5hbWU6CiAgICAgICAgaWYgaXNpbnN0YW5jZShkaXJuYW1lLCBieXRlcyk6CiAgICAgICAgICAgIGRpcm5hbWUgPSBvcy5jdXJkaXIuZW5jb2RlKCdBU0NJSScpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZGlybmFtZSA9IG9zLmN1cmRpcgogICAgdHJ5OgogICAgICAgIG5hbWVzID0gb3MubGlzdGRpcihkaXJuYW1lKQogICAgZXhjZXB0IG9zLmVycm9yOgogICAgICAgIHJldHVybgogICAgZm9yIHggaW4gbmFtZXM6CiAgICAgICAgeWllbGQgeAogICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oZGlybmFtZSwgeCkgaWYgZGlybmFtZSBlbHNlIHgKICAgICAgICBmb3IgeSBpbiBfcmxpc3RkaXIocGF0aCk6CiAgICAgICAgICAgIHlpZWxkIG9zLnBhdGguam9pbih4LCB5KQoKCm1hZ2ljX2NoZWNrID0gcmUuY29tcGlsZSgnKFsqP1tdKScpCm1hZ2ljX2NoZWNrX2J5dGVzID0gcmUuY29tcGlsZShiJyhbKj9bXSknKQoKCmRlZiBoYXNfbWFnaWMocyk6CiAgICBpZiBpc2luc3RhbmNlKHMsIGJ5dGVzKToKICAgICAgICBtYXRjaCA9IG1hZ2ljX2NoZWNrX2J5dGVzLnNlYXJjaChzKQogICAgZWxzZToKICAgICAgICBtYXRjaCA9IG1hZ2ljX2NoZWNrLnNlYXJjaChzKQogICAgcmV0dXJuIG1hdGNoIGlzIG5vdCBOb25lCgoKZGVmIF9pc3JlY3Vyc2l2ZShwYXR0ZXJuKToKICAgIGlmIGlzaW5zdGFuY2UocGF0dGVybiwgYnl0ZXMpOgogICAgICAgIHJldHVybiBwYXR0ZXJuID09IGInKionCiAgICBlbHNlOgogICAgICAgIHJldHVybiBwYXR0ZXJuID09ICcqKicKCgpkZWYgZXNjYXBlKHBhdGhuYW1lKToKICAgICIiIkVzY2FwZSBhbGwgc3BlY2lhbCBjaGFyYWN0ZXJzLgogICAgIiIiCiAgICAjIEVzY2FwaW5nIGlzIGRvbmUgYnkgd3JhcHBpbmcgYW55IG9mICIqP1siIGJldHdlZW4gc3F1YXJlIGJyYWNrZXRzLgogICAgIyBNZXRhY2hhcmFjdGVycyBkbyBub3Qgd29yayBpbiB0aGUgZHJpdmUgcGFydCBhbmQgc2hvdWxkbid0IGJlIGVzY2FwZWQuCiAgICBkcml2ZSwgcGF0aG5hbWUgPSBvcy5wYXRoLnNwbGl0ZHJpdmUocGF0aG5hbWUpCiAgICBpZiBpc2luc3RhbmNlKHBhdGhuYW1lLCBieXRlcyk6CiAgICAgICAgcGF0aG5hbWUgPSBtYWdpY19jaGVja19ieXRlcy5zdWIoYnInW1wxXScsIHBhdGhuYW1lKQogICAgZWxzZToKICAgICAgICBwYXRobmFtZSA9IG1hZ2ljX2NoZWNrLnN1YihyJ1tcMV0nLCBwYXRobmFtZSkKICAgIHJldHVybiBkcml2ZSArIHBhdGhuYW1lClBLAwQUAAAAAAAAACEAEPn8KQAAAQAAAAEAOgAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2d1aS0zMi5leGVNWpAAAwAAAAQAAAD//wAAuAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADoAAAADh+6DgC0Cc0huAFMzSFUaGlzIHByb2dyYW0gY2Fubm90IGJlIHJ1biBpbiBET1MgbW9kZS4NDQokAAAAAAAA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//+KE4mN2P3//4mN4P3//4mNvP3//4iV7/3//4TSD4QfCgAAQ4O92P3//wCJncT9//8PjAsKAACKwiwgPFh3EQ++wg++gFjiQACD4A8z9usEM/YzwA++hMF44kAAagfB+ARZiYWU/f//O8EPh60JAAD/JIULM0AAg43o/f///4m1kP3//4m1wP3//4m1zP3//4m10P3//4m18P3//4m1yP3//+l2CQAAD77Cg+ggdEqD6AN0NoPoCHQlSEh0FYPoAw+FVwkAAION8P3//wjpSwkAAION8P3//wTpPwkAAION8P3//wHpMwkAAIGN8P3//4AAAADpJAkAAION8P3//wLpGAkAAID6KnUsg8cEib3c/f//i3/8O/6Jvcz9//8PjfkIAACDjfD9//8E953M/f//6ecIAACLhcz9//9rwAoPvsqNRAjQiYXM/f//6cwIAACJtej9///pwQgAAID6KnUmg8cEib3c/f//i3/8O/6Jvej9//8PjaIIAACDjej9////6ZYIAACLhej9//9rwAoPvsqNRAjQiYXo/f//6XsIAACA+kl0VYD6aHREgPpsdBiA+ncPhWMIAACBjfD9//8ACAAA6VQIAACAO2x1FkOBjfD9//8AEAAAiZ3E/f//6TkIAACDjfD9//8Q6S0IAACDjfD9//8g6SEIAACKAzw2dR2AewE0dRdDQ4GN8P3//wCAAACJncT9///p/gcAADwzdR2AewEydRdDQ4Gl8P3///9///+JncT9///p3QcAADxkD4TVBwAAPGkPhM0HAAA8bw+ExQcAADx1D4S9BwAAPHgPhLUHAAA8WA+ErQcAAIm1lP3//42FpP3//1APtsJQibXI/f//6Ag9AABZhcCKhe/9//9ZdCKLjbT9//+Ntdj9///opPv//4oDQ4mdxP3//4TAD4Sk/P//i420/f//jbXY/f//6IL7///pTQcAAA++woP4ZA+P6AEAAA+EeQIAAIP4Uw+P8gAAAA+EgAAAAIPoQXQQSEh0WEhIdAhISA+FkgUAAIDCIMeFkP3//wEAAACIle/9//+DjfD9//9AObXo/f//jZ30/f//uAACAACJneT9//+JhaD9//8PjUgCAADHhej9//8GAAAA6aUCAAD3hfD9//8wCAAAD4WYAAAAgY3w/f//AAgAAOmJAAAA94Xw/f//MAgAAHUKgY3w/f//AAgAAIuN6P3//4P5/3UFuf///3+DxwT3hfD9//8QCAAAib3c/f//i3/8ib3k/f//D4SxBAAAO/51C6GUEkEAiYXk/f//i4Xk/f//x4XI/f//AQAAAOl/BAAAg+hYD4TaAgAASEh0eSvBD4Qn////SEgPhZ4EAACDxwT3hfD9//8QCAAAib3c/f//dDAPt0f8UGgAAgAAjYX0/f//UI2F4P3//1DoSzsAAIPEEIXAdB/HhcD9//8BAAAA6xOKR/yIhfT9///HheD9//8BAAAAjYX0/f//iYXk/f//6TUEAACLB4PHBIm93P3//zvGdDuLSAQ7znQ094Xw/f//AAgAAA+/AImN5P3//3QUmSvC0fjHhcj9//8BAAAA6fADAACJtcj9///p5QMAAKGQEkEAiYXk/f//UOjCOAAAWenOAwAAg/hwD4/7AQAAD4TjAQAAg/hlD4y8AwAAg/hnD440/v//g/hpdHGD+G50KIP4bw+FoAMAAPaF8P3//4DHheD9//8IAAAAdGGBjfD9//8AAgAA61WLN4PHBIm93P3//+g6OAAAhcAPhC/6///2hfD9//8gdAxmi4XY/f//ZokG6wiLhdj9//+JBseFwP3//wEAAADppgQAAION8P3//0DHheD9//8KAAAAi43w/f//98EAgAAAD4SpAQAAiweLVwSDxwjp1QEAAHURgPpndWXHhej9//8BAAAA61k5hej9//9+BomF6P3//4G96P3//6MAAAB+P4u16P3//4HGXQEAAFboIgsAAIqV7/3//1mJhbz9//+FwHQQiYXk/f//ibWg/f//i9jrCseF6P3//6MAAAAz9osHg8cIiYWI/f//i0f8iYWM/f//jYWk/f//UP+1kP3//w++wv+16P3//4m93P3//1D/taD9//+NhYj9//9TUP81WBxBAOhBIAAAWf/Qi73w/f//g8QcgeeAAAAAdCA5tej9//91GI2FpP3//1BT/zVkHEEA6BIgAABZ/9BZWYC97/3//2d1HDv+dRiNhaT9//9QU/81YBxBAOjtHwAAWf/QWVmAOy11EYGN8P3//wABAABDiZ3k/f//U+kD/v//x4Xo/f//CAAAAImNuP3//+skg+hzD4S2/P//SEgPhIn+//+D6AMPhbYBAADHhbj9//8nAAAA9oXw/f//gMeF4P3//xAAAAAPhGn+//+Khbj9//8EUcaF1P3//zCIhdX9///HhdD9//8CAAAA6UX+///3wQAQAAAPhUv+//+DxwT2wSB0GIm93P3///bBQHQGD79H/OsED7dH/JnrE4tH/PbBQHQDmesCM9KJvdz9///2wUB0GzvWfxd8BDvGcxH32IPSAPfagY3w/f//AAEAAPeF8P3//wCQAACL2ov4dQIz24O96P3//wB9DMeF6P3//wEAAADrGoOl8P3///e4AAIAADmF6P3//34GiYXo/f//i8cLw3UGIYXQ/f//jXXzi4Xo/f///43o/f//hcB/BovHC8N0LYuF4P3//5lSUFNX6OQ3AACDwTCD+TmJnaD9//+L+IvafgYDjbj9//+IDk7rvY1F8yvGRveF8P3//wACAACJheD9//+JteT9//90YYXAdAeLzoA5MHRW/43k/f//i43k/f//xgEwQOs+SWY5MHQGQEA7znX0K4Xk/f//0fjrKDv+dQuhkBJBAImF5P3//4uF5P3//+sHSYA4AHQFQDvOdfUrheT9//+JheD9//+DvcD9//8AD4VcAQAAi4Xw/f//qEB0MqkAAQAAdAnGhdT9//8t6xioAXQJxoXU/f//K+sLqAJ0EcaF1P3//yDHhdD9//8BAAAAi53M/f//K53g/f//K53Q/f//9oXw/f//DHUX/7W0/f//jYXY/f//U2og6HD1//+DxAz/tdD9//+LvbT9//+Nhdj9//+NjdT9///odvX///aF8P3//whZdBv2hfD9//8EdRJXU2owjYXY/f//6C71//+DxAyDvcj9//8Ai4Xg/f//dGaFwH5ii7Xk/f//iYWg/f//D7cG/42g/f//UGoGjUX0UI2FmP3//0ZQRujlNQAAg8QQhcB1KDmFmP3//3Qg/7WY/f//jYXY/f//jU306PH0//+DvaD9//8AWXW16xyDjdj9////6xOLjeT9//9QjYXY/f//6Mr0//9Zg73Y/f//AHwb9oXw/f//BHQSV1NqII2F2P3//+iC9P//g8QMg728/f//AHQT/7W8/f//6AgIAACDpbz9//8AWYudxP3//4oDiIXv/f//hMB0E4uNlP3//4u93P3//4rQ6eH1//+AvbD9//8AdAqLhaz9//+DYHD9i4XY/f//i038X14zzVvo2uv//8nDkBYrQAAXKUAARylAAKUpQADxKUAA/ClAAEIqQABwK0AA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5f//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//8A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O/N03Il1DP91FP91EP91DP91CP91HP8V9OBAAIv4O/N0B1bohq///1mLx41l7F9eW4tN/DPN6JiT///Jw4v/VYvsg+wQ/3UIjU3w6JKT////dSSNTfD/dSD/dRz/dRj/dRT/dRD/dQzoFv7//4PEHIB9/AB0B4tN+INhcP3Jw4v/VYvsVot1CIX2D4SBAQAA/3YE6Bav////dgjoDq////92DOgGr////3YQ6P6u////dhTo9q7///92GOjurv///zbo567///92IOjfrv///3Yk6Neu////dijoz67///92LOjHrv///3Yw6L+u////djTot67///92HOivrv///3Y46Keu////djzon67//4PEQP92QOiUrv///3ZE6Iyu////dkjohK7///92TOh8rv///3ZQ6HSu////dlTobK7///92WOhkrv///3Zc6Fyu////dmDoVK7///92ZOhMrv///3Zo6ESu////dmzoPK7///92cOg0rv///3Z06Cyu////dnjoJK7///92fOgcrv//g8RA/7aAAAAA6A6u////toQAAADoA67///+2iAAAAOj4rf///7aMAAAA6O2t////tpAAAADo4q3///+2lAAAAOjXrf///7aYAAAA6Myt////tpwAAADowa3///+2oAAAAOi2rf///7akAAAA6Kut////tqgAAADooK3//4PELF5dw4v/VYvsVot1CIX2dDWLBjsFSB1BAHQHUOh9rf//WYtGBDsFTB1BAHQHUOhrrf//WYt2CDs1UB1BAHQHVuhZrf//WV5dw4v/VYvsVot1CIX2dH6LRgw7BVQdQQB0B1DoN63//1mLRhA7BVgdQQB0B1DoJa3//1mLRhQ7BVwdQQB0B1DoE63//1mLRhg7BWAdQQB0B1DoAa3//1mLRhw7BWQdQQB0B1Do76z//1mLRiA7BWgdQQB0B1Do3az//1mLdiQ7NWwdQQB0B1boy6z//1leXcOL/1WL7ItFCFMz21ZXO8N0B4t9DDv7dxvoPan//2oWXokwU1NTU1Poxqj//4PEFIvG6zyLdRA783UEiBjr2ovQOBp0BEJPdfg7+3Tuig6ICkJGOst0A0918zv7dRCIGOj2qP//aiJZiQiL8eu1M8BfXltdw8zMzMzMzFWL7FYzwFBQUFBQUFBQi1UMjUkAigIKwHQJg8IBD6sEJOvx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IFB5dGhvbiBleGVjdXRhYmxlICVzCgAAACMhcHl0aG9uLmV4ZQAAAAAjIQAAQ2Fubm90IG9wZW4gJXMKAC1zY3JpcHQucHl3AENvckV4aXRQcm9jZXNzAABtAHMAYwBvAHIAZQBlAC4AZABsAGwAAAAoAG4AdQBsAGwAKQAAAAAAKG51bGwpAAAAAAAABgAABgABAAAQAAMGAAYCEARFRUUFBQUFBTUwAFAAAAAAKCA4UFgHCAA3MDBXUAcAACAgCAAAAAAIYGhgYGBgAAB4cHh4eHgIBwgAAAcACAgIAAAIAAgABwgAAACoIUEAACJBAAAAAAABAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/AD0AAABFbmNvZGVQb2ludGVyAAAASwBFAFIATgBFAEwAMwAyAC4ARABMAEwAAAAAAERlY29kZVBvaW50ZXIAAABGbHNGcmVlAEZsc1NldFZhbHVlAEZsc0dldFZhbHVlAEZsc0FsbG9jAAAAAHJ1bnRpbWUgZXJyb3IgAAANCgAAVExPU1MgZXJyb3INCgAAAFNJTkcgZXJyb3INCgAAAABET01BSU4gZXJyb3INCgAAUjYwMzQNCkFuIGFwcGxpY2F0aW9uIGhhcyBtYWRlIGFuIGF0dGVtcHQgdG8gbG9hZCB0aGUgQyBydW50aW1lIGxpYnJhcnkgaW5jb3JyZWN0bHkuClBsZWFzZSBjb250YWN0IHRoZSBhcHBsaWNhdGlvbidzIHN1cHBvcnQgdGVhbSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4NCgAAAAAAAFI2MDMzDQotIEF0dGVtcHQgdG8gdXNlIE1TSUwgY29kZSBmcm9tIHRoaXMgYXNzZW1ibHkgZHVyaW5nIG5hdGl2ZSBjb2RlIGluaXRpYWxpemF0aW9uClRoaXMgaW5kaWNhdGVzIGEgYnVnIGluIHlvdXIgYXBwbGljYXRpb24uIEl0IGlzIG1vc3QgbGlrZWx5IHRoZSByZXN1bHQgb2YgY2FsbGluZyBhbiBNU0lMLWNvbXBpbGVkICgvY2xyKSBmdW5jdGlvbiBmcm9tIGEgbmF0aXZlIGNvbnN0cnVjdG9yIG9yIGZyb20gRGxsTWFpbi4NCgAAUjYwMzINCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgbG9jYWxlIGluZm9ybWF0aW9uDQoAAAAAAABSNjAzMQ0KLSBBdHRlbXB0IHRvIGluaXRpYWxpemUgdGhlIENSVCBtb3JlIHRoYW4gb25jZS4KVGhpcyBpbmRpY2F0ZXMgYSBidWcgaW4geW91ciBhcHBsaWNhdGlvbi4NCgAAUjYwMzANCi0gQ1JUIG5vdCBpbml0aWFsaXplZA0KAABSNjAyOA0KLSB1bmFibGUgdG8gaW5pdGlhbGl6ZSBoZWFwDQoAAAAAUjYwMjcNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgbG93aW8gaW5pdGlhbGl6YXRpb24NCgAAAABSNjAyNg0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBzdGRpbyBpbml0aWFsaXphdGlvbg0KAAAAAFI2MDI1DQotIHB1cmUgdmlydHVhbCBmdW5jdGlvbiBjYWxsDQoAAABSNjAyNA0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBfb25leGl0L2F0ZXhpdCB0YWJsZQ0KAAAAAFI2MDE5DQotIHVuYWJsZSB0byBvcGVuIGNvbnNvbGUgZGV2aWNlDQoAAAAAUjYwMTgNCi0gdW5leHBlY3RlZCBoZWFwIGVycm9yDQoAAAAAUjYwMTcNCi0gdW5leHBlY3RlZCBtdWx0aXRocmVhZCBsb2NrIGVycm9yDQoAAAAAUjYwMTYNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgdGhyZWFkIGRhdGENCgANClRoaXMgYXBwbGljYXRpb24gaGFzIHJlcXVlc3RlZCB0aGUgUnVudGltZSB0byB0ZXJtaW5hdGUgaXQgaW4gYW4gdW51c3VhbCB3YXkuClBsZWFzZSBjb250YWN0IHRoZSBhcHBsaWNhdGlvbidzIHN1cHBvcnQgdGVhbSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4NCgAAAFI2MDA5DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIGVudmlyb25tZW50DQoAUjYwMDgNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgYXJndW1lbnRz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AFNhdABGcmkAVGh1AFdlZABUdWUATW9uAFN1bgBHZXRQcm9jZXNzV2luZG93U3RhdGlvbgBHZXRVc2VyT2JqZWN0SW5mb3JtYXRpb25BAAAAR2V0TGFzdEFjdGl2ZVBvcHVwAABHZXRBY3RpdmVXaW5kb3cATWVzc2FnZUJveEEAVVNFUjMyLkRMTAAAU3VuTW9uVHVlV2VkVGh1RnJpU2F0AAAASmFuRmViTWFyQXByTWF5SnVuSnVsQXVnU2VwT2N0Tm92RGVjAAAAAENPTk9VVCQALmNvbQAAAAAuZXhlAAAAAC5iYXQAAAAALmNtZAAAAAAuXAAAU3lzdGVtUm9vdAAAAAAAAEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIASQQDQ9EAAAwAAAAA4AACwaQAAoJkAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAA3BhAAAAAAAD+////AAAAAMj///8AAAAA/v///wAAAAC8I0AAAAAAAP7///8AAAAAiP///wAAAAD+////+iVAAP4lQAD+////wCVAANQlQAD+////AAAAAIz///8AAAAA/v///2g1QABsNUAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAABM7QAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAA4TtAAAAAAAD+////AAAAAMz///8AAAAA/v///wAAAABrPUAAAAAAAAAAAAA3PUAA/v///wAAAADU////AAAAAP7///8AAAAA8D5AAAAAAAD+////AAAAANT///8AAAAA/v///wAAAAAjQEAAAAAAAP7///8AAAAA1P///wAAAAD+////TUFAAGlBQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAAXUdAAAAAAAD+////AAAAAMz///8AAAAA/v///wAAAAArS0AAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAJtOQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAA3VBAAP7///8AAAAA7FBAAP7///8AAAAA2P///wAAAAD+////AAAAAJ9SQAD+////AAAAAKtSQAD+////AAAAANT///8AAAAA/v///wAAAABlWUAAAAAAAP7///8AAAAA2P///wAAAAD+////C1tAAB9bQAAAAAAA/v///wAAAADY////AAAAAP7///9dW0AAYVtAAAAAAAD+////AAAAAMD///8AAAAA/v///wAAAAC4XkAAAAAAAP7///8AAAAA0P///wAAAAD+////SF9AAF9fQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAAuWpAAAAAAAD+////AAAAAND///8AAAAA/v///wAAAADKbEAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAM55QAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAA3oFAAAAAAAD+////AAAAAND///8AAAAA/v///wAAAAC/gkAAAAAAAP7///8AAAAAzP///wAAAAD+////AAAAALSVQAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAATZhAAAAAAAD+////AAAAAND///8AAAAA/v///wAAAADkoUAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAFumQAAAAAAA/v///wAAAADI////AAAAAP7///8AAAAAIahAAAAAAAAAAAAAXadAAP7///8AAAAA0P///wAAAAD+////AAAAANyuQAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAA+MJAAAAAAAD+////AAAAAMz///8AAAAA/v///wAAAACbykAAXPkAAAAAAAAAAAAAFgABAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJz6AAC4+gAAzvoAAOT6AAD2+gAADvsAACT7AAA8+wAAVPsAAGj7AABw+wAAgvsAAJD7AACi+wAAtPsAAMb7AADW+wAA5PsAAPz7AAAQ/AAAJPwAAED8AABe/AAAcvwAAIL8AACO/AAAmvwAAKb8AAC+/AAA1vwAAOD8AADs/AAA/vwAAAz9AAAY/QAAJv0AADD9AABA/QAAVv0AAGL9AABy/QAAmv0AALT9AADM/QAA5v0AAPz9AAAW/gAAJP4AADL+AABM/gAAXP4AAHL+AACM/gAAmP4AAKb+AAC2/gAAxv4AANj+AADs/gAA/P4AABL/AAAi/wAANP8AAEb/AABY/wAAav8AAHb/AACE/wAAlP8AAKr/AAC6/wAAyv8AANj/AADq/wAA/P8AACQAAQAwAAEAQAABAFIAAQAAAAAAUgFHZW5lcmF0ZUNvbnNvbGVDdHJsRXZlbnQAAMYBR2V0RXhpdENvZGVQcm9jZXNzAABuBFdhaXRGb3JTaW5nbGVPYmplY3QAlQBDcmVhdGVQcm9jZXNzQQAArwNTZXRDb25zb2xlQ3RybEhhbmRsZXIA9QFHZXRNb2R1bGVGaWxlTmFtZUEAANoARW50ZXJDcml0aWNhbFNlY3Rpb24AAPQCTGVhdmVDcml0aWNhbFNlY3Rpb24AAPoBR2V0TW9kdWxlSGFuZGxlVwAAKwRTbGVlcAAiAkdldFByb2NBZGRyZXNzAAAFAUV4aXRQcm9jZXNzAHABR2V0Q29tbWFuZExpbmVBADwCR2V0U3RhcnR1cEluZm9BAPADU2V0SGFuZGxlQ291bnQAAD4CR2V0U3RkSGFuZGxlAADYAUdldEZpbGVUeXBlAL8ARGVsZXRlQ3JpdGljYWxTZWN0aW9uADcEVGVybWluYXRlUHJvY2VzcwAAqgFHZXRDdXJyZW50UHJvY2VzcwBIBFVuaGFuZGxlZEV4Y2VwdGlvbkZpbHRlcgAAHwRTZXRVbmhhbmRsZWRFeGNlcHRpb25GaWx0ZXIA1gJJc0RlYnVnZ2VyUHJlc2VudADnAUdldExhc3RFcnJvcgAApgJIZWFwRnJlZQAAogJIZWFwQWxsb2MAXAFHZXRDUEluZm8AxQJJbnRlcmxvY2tlZEluY3JlbWVudAAAwQJJbnRlcmxvY2tlZERlY3JlbWVudAAAUwFHZXRBQ1AAABQCR2V0T0VNQ1AAAOACSXNWYWxpZENvZGVQYWdlAD4EVGxzR2V0VmFsdWUAPARUbHNBbGxvYwAAPwRUbHNTZXRWYWx1ZQA9BFRsc0ZyZWUA9ANTZXRMYXN0RXJyb3IAAK4BR2V0Q3VycmVudFRocmVhZElkAACXBFdyaXRlRmlsZQD2AkxvYWRMaWJyYXJ5QQAAugJJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uQW5kU3BpbkNvdW50AEsBRnJlZUVudmlyb25tZW50U3RyaW5nc0EAwAFHZXRFbnZpcm9ubWVudFN0cmluZ3MATAFGcmVlRW52aXJvbm1lbnRTdHJpbmdzVwCEBFdpZGVDaGFyVG9NdWx0aUJ5dGUAwgFHZXRFbnZpcm9ubWVudFN0cmluZ3NXAACkAkhlYXBDcmVhdGUAAGEEVmlydHVhbEZyZWUAWQNRdWVyeVBlcmZvcm1hbmNlQ291bnRlcgBqAkdldFRpY2tDb3VudAAAqwFHZXRDdXJyZW50UHJvY2Vzc0lkAFMCR2V0U3lzdGVtVGltZUFzRmlsZVRpbWUAmgNSdGxVbndpbmQAqQJIZWFwUmVBbGxvYwBeBFZpcnR1YWxBbGxvYwAAhAFHZXRDb25zb2xlQ1AAAJYBR2V0Q29uc29sZU1vZGUAAEIBRmx1c2hGaWxlQnVmZmVycwAA5gJMQ01hcFN0cmluZ0EAAB8DTXVsdGlCeXRlVG9XaWRlQ2hhcgDoAkxDTWFwU3RyaW5nVwAAQAJHZXRTdHJpbmdUeXBlQQAAQwJHZXRTdHJpbmdUeXBlVwAA6QFHZXRMb2NhbGVJbmZvQQAA5wNTZXRGaWxlUG9pbnRlcgAAqwJIZWFwU2l6ZQAARABDbG9zZUhhbmRsZQCMBFdyaXRlQ29uc29sZUEAmgFHZXRDb25zb2xlT3V0cHV0Q1AAAJYEV3JpdGVDb25zb2xlVwAGBFNldFN0ZEhhbmRsZQAAeQBDcmVhdGVGaWxlQQBTAENvbXBhcmVTdHJpbmdBAABWAENvbXBhcmVTdHJpbmdXAADYA1NldEVudmlyb25tZW50VmFyaWFibGVBAEtFUk5FTDMyLmRsbAAAbgNSZWFkRmlsZQAA1QNTZXRFbmRPZkZpbGUAACYCR2V0UHJvY2Vzc0hlYXAAAMoBR2V0RmlsZUF0dHJpYnV0ZXNBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAK0EAAAAAAMArQQABAQAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATuZAu7EZv0TqI0AAAgAAAGziQABc4kAA/////4AKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAWAAAAAgAAAAIAAAADAAAAAgAAAAQAAAAYAAAABQAAAA0AAAAGAAAACQAAAAcAAAAMAAAACAAAAAwAAAAJAAAADAAAAAoAAAAHAAAACwAAAAgAAAAMAAAAFgAAAA0AAAAWAAAADwAAAAIAAAAQAAAADQAAABEAAAASAAAAEgAAAAIAAAAhAAAADQAAADUAAAACAAAAQQAAAA0AAABDAAAAAgAAAFAAAAARAAAAUgAAAA0AAABTAAAADQAAAFcAAAAWAAAAWQAAAAsAAABsAAAADQAAAG0AAAAgAAAAcAAAABwAAAByAAAACQAAAAYAAAAWAAAAgAAAAAoAAACBAAAACgAAAIIAAAAJAAAAgwAAABYAAACEAAAADQAAAJEAAAApAAAAngAAAA0AAAChAAAAAgAAAKQAAAALAAAApwAAAA0AAAC3AAAAEQAAAM4AAAACAAAA1wAAAAsAAAAYBwAADAAAAAwAAAAIAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AAhgaGBgYGAAAHhweHh4eAgHCAAABwAICAgAAAgACAAHCAAAAAAAAAAQOAFAAQAAALA4AUABAAAAAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+fwA9AAAAAAAAAHJ1bnRpbWUgZXJyb3IgAAANCgAAAAAAAFRMT1NTIGVycm9yDQoAAABTSU5HIGVycm9yDQoAAAAARE9NQUlOIGVycm9yDQoAAFI2MDM0DQpBbiBhcHBsaWNhdGlvbiBoYXMgbWFkZSBhbiBhdHRlbXB0IHRvIGxvYWQgdGhlIEMgcnVudGltZSBsaWJyYXJ5IGluY29ycmVjdGx5LgpQbGVhc2UgY29udGFjdCB0aGUgYXBwbGljYXRpb24ncyBzdXBwb3J0IHRlYW0gZm9yIG1vcmUgaW5mb3JtYXRpb24uDQoAAAAAAABSNjAzMw0KLSBBdHRlbXB0IHRvIHVzZSBNU0lMIGNvZGUgZnJvbSB0aGlzIGFzc2VtYmx5IGR1cmluZyBuYXRpdmUgY29kZSBpbml0aWFsaXphdGlvbgpUaGlzIGluZGljYXRlcyBhIGJ1ZyBpbiB5b3VyIGFwcGxpY2F0aW9uLiBJdCBpcyBtb3N0IGxpa2VseSB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgYW4gTVNJTC1jb21waWxlZCAoL2NscikgZnVuY3Rpb24gZnJvbSBhIG5hdGl2ZSBjb25zdHJ1Y3RvciBvciBmcm9tIERsbE1haW4uDQoAAFI2MDMyDQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIGxvY2FsZSBpbmZvcm1hdGlvbg0KAAAAAAAAUjYwMzENCi0gQXR0ZW1wdCB0byBpbml0aWFsaXplIHRoZSBDUlQgbW9yZSB0aGFuIG9uY2UuClRoaXMgaW5kaWNhdGVzIGEgYnVnIGluIHlvdXIgYXBwbGljYXRpb24uDQoAAAAAAABSNjAzMA0KLSBDUlQgbm90IGluaXRpYWxpemVkDQoAAFI2MDI4DQotIHVuYWJsZSB0byBpbml0aWFsaXplIGhlYXANCgAAAABSNjAyNw0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBsb3dpbyBpbml0aWFsaXphdGlvbg0KAAAAAFI2MDI2DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIHN0ZGlvIGluaXRpYWxpemF0aW9uDQoAAAAAUjYwMjUNCi0gcHVyZSB2aXJ0dWFsIGZ1bmN0aW9uIGNhbGwNCgAAAFI2MDI0DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIF9vbmV4aXQvYXRleGl0IHRhYmxlDQoAAAAAUjYwMTkNCi0gdW5hYmxlIHRvIG9wZW4gY29uc29sZSBkZXZpY2UNCgAAAAAAAAAAUjYwMTgNCi0gdW5leHBlY3RlZCBoZWFwIGVycm9yDQoAAAAAAAAAAFI2MDE3DQotIHVuZXhwZWN0ZWQgbXVsdGl0aHJlYWQgbG9jayBlcnJvcg0KAAAAAFI2MDE2DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIHRocmVhZCBkYXRhDQoAAAAAAAAAAAAAAAAADQpUaGlzIGFwcGxpY2F0aW9uIGhhcyByZXF1ZXN0ZWQgdGhlIFJ1bnRpbWUgdG8gdGVybWluYXRlIGl0IGluIGFuIHVudXN1YWwgd2F5LgpQbGVhc2UgY29udGFjdCB0aGUgYXBwbGljYXRpb24ncyBzdXBwb3J0IHRlYW0gZm9yIG1vcmUgaW5mb3JtYXRpb24uDQoAAABSNjAwOQ0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBlbnZpcm9ubWVudA0KAAAAAABSNjAwOA0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBhcmd1bWVudHMNCgAAAAAAAABSNjAwMg0KLSBmbG9hdGluZyBwb2ludCBzdXBwb3J0IG5vdCBsb2FkZWQNCgAAAABNaWNyb3NvZnQgVmlzdWFsIEMrKyBSdW50aW1lIExpYnJhcnkAAAAACgoAAC4uLgA8cHJvZ3JhbSBuYW1lIHVua25vd24+AABSdW50aW1lIEVycm9yIQoKUHJvZ3JhbTogAAAAAAAAAAUAAMALAAAAAAAAAAAAAAAdAADABAAAAAAAAAAAAAAAlgAAwAQAAAAAAAAAAAAAAI0AAMAIAAAAAAAAAAAAAACOAADACAAAAAAAAAAAAAAAjwAAwAgAAAAAAAAAAAAAAJAAAMAIAAAAAAAAAAAAAACRAADACAAAAAAAAAAAAAAAkgAAwAgAAAAAAAAAAAAAAJMAAMAIAAAAAAAAAAAAAAAGgICGgIGAAAAQA4aAhoKAFAUFRUVFhYWFBQAAMDCAUICIAAgAKCc4UFeAAAcANzAwUFCIAAAAICiAiICAAAAAYGhgaGhoCAgHeHBwd3BwCAgAAAgACAAHCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAgACAAIAAgACAAIAAgACAAKAAoACgAKAAoACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAEgAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAhACEAIQAhACEAIQAhACEAIQAhAAQABAAEAAQABAAEAAQAIEAgQCBAIEAgQCBAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAQABAAEAAQABAAEACCAIIAggCCAIIAggACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAEAAQABAAEAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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b2Nlc3MAAHIEV2FpdEZvclNpbmdsZU9iamVjdACWAENyZWF0ZVByb2Nlc3NBAAC0A1NldENvbnNvbGVDdHJsSGFuZGxlcgD1AUdldE1vZHVsZUZpbGVOYW1lQQAA2wBFbnRlckNyaXRpY2FsU2VjdGlvbgAA7gJMZWF2ZUNyaXRpY2FsU2VjdGlvbgAA+gFHZXRNb2R1bGVIYW5kbGVXAAAvBFNsZWVwACICR2V0UHJvY0FkZHJlc3MAAAYBRXhpdFByb2Nlc3MAcQFHZXRDb21tYW5kTGluZUEAPAJHZXRTdGFydHVwSW5mb0EAngNSdGxVbndpbmRFeAD0A1NldEhhbmRsZUNvdW50AAA+AkdldFN0ZEhhbmRsZQAA2QFHZXRGaWxlVHlwZQDAAERlbGV0ZUNyaXRpY2FsU2VjdGlvbgA7BFRlcm1pbmF0ZVByb2Nlc3MAAKsBR2V0Q3VycmVudFByb2Nlc3MATARVbmhhbmRsZWRFeGNlcHRpb25GaWx0ZXIAACMEU2V0VW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyANACSXNEZWJ1Z2dlclByZXNlbnQAnwNSdGxWaXJ0dWFsVW53aW5kAACYA1J0bExvb2t1cEZ1bmN0aW9uRW50cnkAAJEDUnRsQ2FwdHVyZUNvbnRleHQA5wFHZXRMYXN0RXJyb3IAAKYCSGVhcEZyZWUAAKICSGVhcEFsbG9jAF0BR2V0Q1BJbmZvAFQBR2V0QUNQAAAUAkdldE9FTUNQAADaAklzVmFsaWRDb2RlUGFnZQDXAEVuY29kZVBvaW50ZXIAuQBEZWNvZGVQb2ludGVyAEABRmxzR2V0VmFsdWUAQQFGbHNTZXRWYWx1ZQA/AUZsc0ZyZWUA+ANTZXRMYXN0RXJyb3IAAK8BR2V0Q3VycmVudFRocmVhZElkAAA+AUZsc0FsbG9jAACbBFdyaXRlRmlsZQDwAkxvYWRMaWJyYXJ5QQAAugJJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uQW5kU3BpbkNvdW50AEwBRnJlZUVudmlyb25tZW50U3RyaW5nc0EAwQFHZXRFbnZpcm9ubWVudFN0cmluZ3MATQFGcmVlRW52aXJvbm1lbnRTdHJpbmdzVwCIBFdpZGVDaGFyVG9NdWx0aUJ5dGUAwwFHZXRFbnZpcm9ubWVudFN0cmluZ3NXAACqAkhlYXBTZXRJbmZvcm1hdGlvbgAApAJIZWFwQ3JlYXRlAABTA1F1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyAGoCR2V0VGlja0NvdW50AACsAUdldEN1cnJlbnRQcm9jZXNzSWQAUwJHZXRTeXN0ZW1UaW1lQXNGaWxlVGltZQCpAkhlYXBSZUFsbG9jAIUBR2V0Q29uc29sZUNQAACXAUdldENvbnNvbGVNb2RlAABDAUZsdXNoRmlsZUJ1ZmZlcnMAAOACTENNYXBTdHJpbmdBAAAZA011bHRpQnl0ZVRvV2lkZUNoYXIA4gJMQ01hcFN0cmluZ1cAAEACR2V0U3RyaW5nVHlwZUEAAEMCR2V0U3RyaW5nVHlwZVcAAOkBR2V0TG9jYWxlSW5mb0EAAOwDU2V0RmlsZVBvaW50ZXIAAKsCSGVhcFNpemUAAEQAQ2xvc2VIYW5kbGUAkARXcml0ZUNvbnNvbGVBAJsBR2V0Q29uc29sZU91dHB1dENQAACaBFdyaXRlQ29uc29sZVcACgRTZXRTdGRIYW5kbGUAAHoAQ3JlYXRlRmlsZUEAUwBDb21wYXJlU3RyaW5nQQAAVgBDb21wYXJlU3RyaW5nVwAA3QNTZXRFbnZpcm9ubWVudFZhcmlhYmxlQQBLRVJORUwzMi5kbGwAAGgDUmVhZEZpbGUAANoDU2V0RW5kT2ZGaWxlAAAmAkdldFByb2Nlc3NIZWFwAADLAUdldEZpbGVBdHRyaWJ1dGVzQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4EUBQAEAAAAAAAAAAAAAAOBFAUABAAAAAQEAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMqLfLZkrAADNXSDSZtT//1wpAEABAAAAAgAAAAAAAAAA9ABAAQAAAPDzAEABAAAA//////////+ACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAABYAAAACAAAAAgAAAAMAAAACAAAABAAAABgAAAAFAAAADQAAAAYAAAAJAAAABwAAAAwAAAAIAAAADAAAAAkAAAAMAAAACgAAAAcAAAALAAAACAAAAAwAAAAWAAAADQAAABYAAAAPAAAAAgAAABAAAAANAAAAEQAAABIAAAASAAAAAgAAACEAAAANAAAANQAAAAIAAABBAAAADQAAAEMAAAACAAAAUAAAABEAAABSAAAADQAAAFMAAAANAAAAVwAAABYAAABZAAAACwAAAGwAAAANAAAAbQAAACAAAABwAAAAHAAAAHIAAAAJAAAABgAAABYAAACAAAAACgAAAIEAAAAKAAAAggAAAAkAAACDAAAAFgAAAIQAAAANAAAAkQAAACkAAACeAAAADQAAAKEAAAACAAAApAAAAAsAAACnAAAADQAAALcAAAARAAAAzgAAAAIAAADXAAAACwAAABgHAAAMAAAADAAAAAgAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AJBTAAC4UwAAZAsBALhTAAAyVQAAoBABAHRWAADLVgAAaA4BAMxWAABBVwAAdAoBAGBXAACFVwAAZAsBAIhXAAA6WAAAlAoBADxYAADAWAAAmAcBAMBYAADkWAAAaA4BAORYAAAZWgAAyAoBABxaAACdWgAAaA4BAKBaAACpWwAA/AoBAKxbAAA5XQAADAsBADxdAABhXwAAIAsBAGRfAACnXwAAZAsBAKhfAADqXwAAaA4BAOxfAADxYAAANAsBAPRgAAALYQAAZAsBAAxhAABEYQAAmAcBAERhAAB8YQAAmAcBAHxhAACyYQAAmAcBAEBiAACBYgAAbAsBAIRiAACnYgAAjAsBAKhiAADEYgAAZAsBAMhiAACWZAAAYAgBAMRkAAA1ZwAArAsBAFBnAACFZwAA3AsBAJBnAADCZwAAaA4BAMRnAAAFaAAAZAsBAAhoAAAgaAAAZAsBACBoAACZaAAAmAcBAJxoAADLaQAAvAkBAMxpAACbawAA/AsBAJxrAACSbAAAGAwBAJRsAABGbgAAKAwBAEhuAACUbgAAQAwBAJRuAABHbwAASAwBAGBvAACEbwAAWAwBAMRvAAAzcAAAPA8BADRwAAB5cAAAfAcBAHxwAADDcAAAfAcBAKBxAACwcwAAYAwBALBzAADEcwAAPA8BAMxzAACCdAAAoBABAIR0AABXdQAAoBABAFh1AADydQAAcAwBAPR1AAB9dgAAgAwBAIB2AAD2dgAAlAwBAPh2AABWfgAAuAwBAFh+AACJfwAA3AwBAIx/AACfgAAADA0BAKCAAABagQAANA0BAGSBAAALhAAAQA0BAAyEAABJiQAAWA0BAEyJAADiiQAAgA0BAOSJAABOjAAAkA0BAFCMAADZjAAAuA0BACSQAAAOkgAAyA0BABCSAABYkgAADAkBAFiSAADtkgAAyA0BAPCSAAB5kwAAfBABAHyTAABRlAAAfBABAFSUAADFlAAAfBABAGiWAAD9lgAAmAcBAACXAAA3mAAA0A0BADiYAACLmAAAaA4BAIyYAACAmgAAAA4BAICaAADQmgAAPA8BANCaAAAWmwAAPA8BACSbAADFmwAAGA4BAMibAABKngAAIA4BAEyeAAB8ngAAPA8BAHyeAAA4nwAAmAcBADifAABQoAAAPA4BAFCgAACHoAAAaA4BAIigAACcoQAAcA4B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iYXM/f//6cwIAACJtej9///pwQgAAID6KnUmg8cEib3c/f//i3/8O/6Jvej9//8PjaIIAACDjej9////6ZYIAACLhej9//9rwAoPvsqNRAjQiYXo/f//6XsIAACA+kl0VYD6aHREgPpsdBiA+ncPhWMIAACBjfD9//8ACAAA6VQIAACAO2x1FkOBjfD9//8AEAAAiZ3E/f//6TkIAACDjfD9//8Q6S0IAACDjfD9//8g6SEIAACKAzw2dR2AewE0dRdDQ4GN8P3//wCAAACJncT9///p/gcAADwzdR2AewEydRdDQ4Gl8P3///9///+JncT9///p3QcAADxkD4TVBwAAPGkPhM0HAAA8bw+ExQcAADx1D4S9BwAAPHgPhLUHAAA8WA+ErQcAAIm1lP3//42FpP3//1APtsJQibXI/f//6Ag9AABZhcCKhe/9//9ZdCKLjbT9//+Ntdj9///opPv//4oDQ4mdxP3//4TAD4Sk/P//i420/f//jbXY/f//6IL7///pTQcAAA++woP4ZA+P6AEAAA+EeQIAAIP4Uw+P8gAAAA+EgAAAAIPoQXQQSEh0WEhIdAhISA+FkgUAAIDCIMeFkP3//wEAAACIle/9//+DjfD9//9AObXo/f//jZ30/f//uAACAACJneT9//+JhaD9//8PjUgCAADHhej9//8GAAAA6aUCAAD3hfD9//8wCAAAD4WYAAAAgY3w/f//AAgAAOmJAAAA94Xw/f//MAgAAHUKgY3w/f//AAgAAIuN6P3//4P5/3UFuf///3+DxwT3hfD9//8QCAAAib3c/f//i3/8ib3k/f//D4SxBAAAO/51C6GUEkEAiYXk/f//i4Xk/f//x4XI/f//AQAAAOl/BAAAg+hYD4TaAgAASEh0eSvBD4Qn////SEgPhZ4EAACDxwT3hfD9//8QCAAAib3c/f//dDAPt0f8UGgAAgAAjYX0/f//UI2F4P3//1DoSzsAAIPEEIXAdB/HhcD9//8BAAAA6xOKR/yIhfT9///HheD9//8BAAAAjYX0/f//iYXk/f//6TUEAACLB4PHBIm93P3//zvGdDuLSAQ7znQ094Xw/f//AAgAAA+/AImN5P3//3QUmSvC0fjHhcj9//8BAAAA6fADAACJtcj9///p5QMAAKGQEkEAiYXk/f//UOjCOAAAWenOAwAAg/hwD4/7AQAAD4TjAQAAg/hlD4y8AwAAg/hnD440/v//g/hpdHGD+G50KIP4bw+FoAMAAPaF8P3//4DHheD9//8IAAAAdGGBjfD9//8AAgAA61WLN4PHBIm93P3//+g6OAAAhcAPhC/6///2hfD9//8gdAxmi4XY/f//ZokG6wiLhdj9//+JBseFwP3//wEAAADppgQAAION8P3//0DHheD9//8KAAAAi43w/f//98EAgAAAD4SpAQAAiweLVwSDxwjp1QEAAHURgPpndWXHhej9//8BAAAA61k5hej9//9+BomF6P3//4G96P3//6MAAAB+P4u16P3//4HGXQEAAFboIgsAAIqV7/3//1mJhbz9//+FwHQQiYXk/f//ibWg/f//i9jrCseF6P3//6MAAAAz9osHg8cIiYWI/f//i0f8iYWM/f//jYWk/f//UP+1kP3//w++wv+16P3//4m93P3//1D/taD9//+NhYj9//9TUP81WBxBAOhBIAAAWf/Qi73w/f//g8QcgeeAAAAAdCA5tej9//91GI2FpP3//1BT/zVkHEEA6BIgAABZ/9BZWYC97/3//2d1HDv+dRiNhaT9//9QU/81YBxBAOjtHwAAWf/QWVmAOy11EYGN8P3//wABAABDiZ3k/f//U+kD/v//x4Xo/f//CAAAAImNuP3//+skg+hzD4S2/P//SEgPhIn+//+D6AMPhbYBAADHhbj9//8nAAAA9oXw/f//gMeF4P3//xAAAAAPhGn+//+Khbj9//8EUcaF1P3//zCIhdX9///HhdD9//8CAAAA6UX+///3wQAQAAAPhUv+//+DxwT2wSB0GIm93P3///bBQHQGD79H/OsED7dH/JnrE4tH/PbBQHQDmesCM9KJvdz9///2wUB0GzvWfxd8BDvGcxH32IPSAPfagY3w/f//AAEAAPeF8P3//wCQAACL2ov4dQIz24O96P3//wB9DMeF6P3//wEAAADrGoOl8P3///e4AAIAADmF6P3//34GiYXo/f//i8cLw3UGIYXQ/f//jXXzi4Xo/f///43o/f//hcB/BovHC8N0LYuF4P3//5lSUFNX6OQ3AACDwTCD+TmJnaD9//+L+IvafgYDjbj9//+IDk7rvY1F8yvGRveF8P3//wACAACJheD9//+JteT9//90YYXAdAeLzoA5MHRW/43k/f//i43k/f//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COjV6v//WYXAD4SdAgAAiwb2RAcEgA+EkAIAAOiL1v//i0BsM8k5SBSNhRzl//8PlMFQiwb/NAeJjSDl////FeDgQACFwA+EYAIAADPJOY0g5f//dAiE2w+EUAIAAP8V3OBAAIudNOX//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//91FOiytv//xwAJAAAA6Lq2//+JMOs//7VA5f//6L62//9Z6zGLtSjl//+LBvZEBwRAdA+LhTTl//+AOBp1BDPA6yTocrb//8cAHAAAAOh6tv//gyAAg8j/6wyLhTjl//8rhTDl//9fW4tN/DPNXujYnf//ycNqEGjw90AA6IS2//+LRQiD+P51G+g+tv//gyAA6CO2///HAAkAAACDyP/pnQAAADP/O8d8CDsFkCpBAHIh6BW2//+JOOj7tf//xwAJAAAAV1dXV1fog7X//4PEFOvJi8jB+QWNHI2gKkEAi/CD5h/B5gaLCw++TDEEg+EBdL9Q6DkkAABZiX38iwP2RDAEAXQW/3UQ/3UM/3UI6C74//+DxAyJReTrFuiYtf//xwAJAAAA6KC1//+JOINN5P/H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HI1F+P91GFBX/3Ug/3Xs6I0fAACL8Il18IPEGPfeG/YjdfhX6I38//9Z6xr/dRz/dRj/dRT/dRD/dQz/dQj/FejgQACL8Dld9HQJ/3X06Jix//9Zi0XwO8N0DDlFGHQHUOiFsf//WYvGjWXgX15bi038M83ol5X//8nDi/9Vi+yD7BD/dQiNTfDokZX///91KI1N8P91JP91IP91HP91GP91FP91EP91DOgo/P//g8QggH38AHQHi034g2Fw/cnDi/9Vi+xRUaGAEkEAM8WJRfyhiClBAFNWM9tXi/k7w3U6jUX4UDP2RlZoZOpAAFb/FfjgQACFwHQIiTWIKUEA6zT/FVzgQACD+Hh1CmoCWKOIKUEA6wWhiClBAIP4Ag+EzwAAADvDD4THAAAAg/gBD4XoAAAAiV34OV0YdQiLB4tABIlFGIs17OBAADPAOV0gU1P/dRAPlcD/dQyNBMUBAAAAUP91GP/Wi/g7+w+EqwAAAH48gf/w//9/dzSNRD8IPQAEAAB3E+jSHwAAi8Q7w3QcxwDMzAAA6xFQ6FDg//9ZO8N0CccA3d0AAIPACIvYhdt0aY0EP1BqAFPoTpD//4PEDFdT/3UQ/3UMagH/dRj/1oXAdBH/dRRQU/91CP8V+OBAAIlF+FPoyfr//4tF+FnrdTP2OV0cdQiLB4tAFIlFHDldGHUIiweLQASJRRj/dRzoQR0AAFmD+P91BDPA60c7RRh0HlNTjU0QUf91DFD/dRjoaR0AAIvwg8QYO/N03Il1DP91FP91EP91DP91CP91HP8V9OBAAIv4O/N0B1bohq///1mLx41l7F9eW4tN/DPN6JiT///Jw4v/VYvsg+wQ/3UIjU3w6JKT////dSSNTfD/dSD/dRz/dRj/dRT/dRD/dQzoFv7//4PEHIB9/AB0B4tN+INhcP3Jw4v/VYvsVot1CIX2D4SBAQAA/3YE6Bav////dgjoDq////92DOgGr////3YQ6P6u////dhTo9q7///92GOjurv///zbo567///92IOjfrv///3Yk6Neu////dijoz67///92LOjHrv///3Yw6L+u////djTot67///92HOivrv///3Y46Keu////djzon67//4PEQP92QOiUrv///3ZE6Iyu////dkjohK7///92TOh8rv///3ZQ6HSu////dlTobK7///92WOhkrv///3Zc6Fyu////dmDoVK7///92ZOhMrv///3Zo6ESu////dmzoPK7///92cOg0rv///3Z06Cyu////dnjoJK7///92fOgcrv//g8RA/7aAAAAA6A6u////toQAAADoA67///+2iAAAAOj4rf///7aMAAAA6O2t////tpAAAADo4q3///+2lAAAAOjXrf///7aYAAAA6Myt////tpwAAADowa3///+2oAAAAOi2rf///7akAAAA6Kut////tqgAAADooK3//4PELF5dw4v/VYvsVot1CIX2dDWLBjsFSB1BAHQHUOh9rf//WYtGBDsFTB1BAHQHUOhrrf//WYt2CDs1UB1BAHQHVuhZrf//WV5dw4v/VYvsVot1CIX2dH6LRgw7BVQdQQB0B1DoN63//1mLRhA7BVgdQQB0B1DoJa3//1mLRhQ7BVwdQQB0B1DoE63//1mLRhg7BWAdQQB0B1DoAa3//1mLRhw7BWQdQQB0B1Do76z//1mLRiA7BWgdQQB0B1Do3az//1mLdiQ7NWwdQQB0B1boy6z//1leXcOL/1WL7ItFCFMz21ZXO8N0B4t9DDv7dxvoPan//2oWXokwU1NTU1Poxqj//4PEFIvG6zyLdRA783UEiBjr2ovQOBp0BEJPdfg7+3Tuig6ICkJGOst0A0918zv7dRCIGOj2qP//aiJZiQiL8eu1M8BfXltdw8zMzMzMzFWL7FYzwFBQUFBQUFBQi1UMjUkAigIKwHQJg8IBD6sEJOvxi3UIg8n/jUkAg8EBigYKwHQJg8YBD6MEJHPui8GDxCBeycOL/1WL7FNWi3UIM9tXOV0UdRA783UQOV0MdRIzwF9eW13DO/N0B4t9DDv7dxvoaKj//2oWXokwU1NTU1Po8af//4PEFIvG69U5XRR1BIge68qLVRA703UEiB7r0YN9FP+LxnUPigqICEBCOst0Hk918+sZigqICEBCOst0CE90Bf9NFHXuOV0UdQKIGDv7dYuDfRT/dQ+LRQxqUIhcBv9Y6Xj///+IHujup///aiJZiQiL8euCi/9Vi+yLTQhTM9tWVzvLdAeLfQw7+3cb6Min//9qFl6JMFNTU1NT6FGn//+DxBSLxuswi3UQO/N1BIgZ69qL0YoGiAJCRjrDdANPdfM7+3UQiBnojaf//2oiWYkIi/HrwTPAX15bXcPMzMzMzMzM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U1RVVldYWVpbXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/AD0AAABFbmNvZGVQb2ludGVyAAAASwBFAFIATgBFAEwAMwAyAC4ARABMAEwAAAAAAERlY29kZVBvaW50ZXIAAABGbHNGcmVlAEZsc1NldFZhbHVlAEZsc0dldFZhbHVlAEZsc0FsbG9jAAAAAHJ1bnRpbWUgZXJyb3IgAAANCgAAVExPU1MgZXJyb3INCgAAAFNJTkcgZXJyb3INCgAAAABET01BSU4gZXJyb3INCgAAUjYwMzQNCkFuIGFwcGxpY2F0aW9uIGhhcyBtYWRlIGFuIGF0dGVtcHQgdG8gbG9hZCB0aGUgQyBydW50aW1lIGxpYnJhcnkgaW5jb3JyZWN0bHkuClBsZWFzZSBjb250YWN0IHRoZSBhcHBsaWNhdGlvbidzIHN1cHBvcnQgdGVhbSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4NCgAAAAAAAFI2MDMzDQotIEF0dGVtcHQgdG8gdXNlIE1TSUwgY29kZSBmcm9tIHRoaXMgYXNzZW1ibHkgZHVyaW5nIG5hdGl2ZSBjb2RlIGluaXRpYWxpemF0aW9uClRoaXMgaW5kaWNhdGVzIGEgYnVnIGluIHlvdXIgYXBwbGljYXRpb24uIEl0IGlzIG1vc3QgbGlrZWx5IHRoZSByZXN1bHQgb2YgY2FsbGluZyBhbiBNU0lMLWNvbXBpbGVkICgvY2xyKSBmdW5jdGlvbiBmcm9tIGEgbmF0aXZlIGNvbnN0cnVjdG9yIG9yIGZyb20gRGxsTWFpbi4NCgAAUjYwMzINCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgbG9jYWxlIGluZm9ybWF0aW9uDQoAAAAAAABSNjAzMQ0KLSBBdHRlbXB0IHRvIGluaXRpYWxpemUgdGhlIENSVCBtb3JlIHRoYW4gb25jZS4KVGhpcyBpbmRpY2F0ZXMgYSBidWcgaW4geW91ciBhcHBsaWNhdGlvbi4NCgAAUjYwMzANCi0gQ1JUIG5vdCBpbml0aWFsaXplZA0KAABSNjAyOA0KLSB1bmFibGUgdG8gaW5pdGlhbGl6ZSBoZWFwDQoAAAAAUjYwMjcNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgbG93aW8gaW5pdGlhbGl6YXRpb24NCgAAAABSNjAyNg0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBzdGRpbyBpbml0aWFsaXphdGlvbg0KAAAAAFI2MDI1DQotIHB1cmUgdmlydHVhbCBmdW5jdGlvbiBjYWxsDQoAAABSNjAyNA0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBfb25leGl0L2F0ZXhpdCB0YWJsZQ0KAAAAAFI2MDE5DQotIHVuYWJsZSB0byBvcGVuIGNvbnNvbGUgZGV2aWNlDQoAAAAAUjYwMTgNCi0gdW5leHBlY3RlZCBoZWFwIGVycm9yDQoAAAAAUjYwMTcNCi0gdW5leHBlY3RlZCBtdWx0aXRocmVhZCBsb2NrIGVycm9yDQoAAAAAUjYwMTYNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgdGhyZWFkIGRhdGENCgANClRoaXMgYXBwbGljYXRpb24gaGFzIHJlcXVlc3RlZCB0aGUgUnVudGltZSB0byB0ZXJtaW5hdGUgaXQgaW4gYW4gdW51c3VhbCB3YXkuClBsZWFzZSBjb250YWN0IHRoZSBhcHBsaWNhdGlvbidzIHN1cHBvcnQgdGVhbSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4NCgAAAFI2MDA5DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIGVudmlyb25tZW50DQoAUjYwMDgNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgYXJndW1lbnRzDQoAAABSNjAwMg0KLSBmbG9hdGluZyBwb2ludCBzdXBwb3J0IG5vdCBsb2FkZWQNCgAAAABNaWNyb3NvZnQgVmlzdWFsIEMrKyBSdW50aW1lIExpYnJhcnkAAAAACgoAAC4uLgA8cHJvZ3JhbSBuYW1lIHVua25vd24+AABSdW50aW1lIEVycm9yIQoKUHJvZ3JhbTogAAAAAAAAAAUAAMALAAAAAAAAAB0AAMAEAAAAAAAAAJYAAMAEAAAAAAAAAI0AAMAIAAAAAAAAAI4AAMAIAAAAAAAAAI8AAMAIAAAAAAAAAJAAAMAIAAAAAAAAAJEAAMAIAAAAAAAAAJIAAMAIAAAAAAAAAJMAAMAIAAAAAAAAAAaAgIaAgYAAABADhoCGgoAUBQVFRUWFhYUFAAAwMIBQgIgACAAoJzhQV4AABwA3MDBQUIgAAAAgKICIgIAAAABgaGBoaGgICAd4cHB3cHAICAAACAAIAAcIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgACAAIAAgACAAIAAgACAAIAAoACgAKAAoACgAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAASAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACEAIQAhACEAIQAhACEAIQAhACEABAAEAAQABAAEAAQABAAgQCBAIEAgQCBAIEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABAAEAAQABAAEAAQAIIAggCCAIIAggCCAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAQABAAEAAQACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAgACAAIAAgACAAIAAgACAAaAAoACgAKAAoACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAEgAEAAQABAAEAAQABAAEAAQABAA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QQDQ9EAAAwAAAAA4AACwaQAAoJkAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAA3BhAAAAAAAD+////AAAAAMj///8AAAAA/v///wAAAAC8I0AAAAAAAP7///8AAAAAiP///wAAAAD+////+iVAAP4lQAD+////wCVAANQlQAD+////AAAAAIz///8AAAAA/v///2g1QABsNUAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAABM7QAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAA4TtAAAAAAAD+////AAAAAMz///8AAAAA/v///wAAAABrPUAAAAAAAAAAAAA3PUAA/v///wAAAADU////AAAAAP7///8AAAAA8D5AAAAAAAD+////AAAAANT///8AAAAA/v///wAAAAAjQEAAAAAAAP7///8AAAAA1P///wAAAAD+////TUFAAGlBQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAAXUdAAAAAAAD+////AAAAAMz///8AAAAA/v///wAAAAArS0AAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAJtOQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAA3VBAAP7///8AAAAA7FBAAP7///8AAAAA2P///wAAAAD+////AAAAAJ9SQAD+////AAAAAKtSQAD+////AAAAANT///8AAAAA/v///wAAAABlWUAAAAAAAP7///8AAAAA2P///wAAAAD+////C1tAAB9bQAAAAAAA/v///wAAAADY////AAAAAP7///9dW0AAYVtAAAAAAAD+////AAAAAMD///8AAAAA/v///wAAAAC4XkAAAAAAAP7///8AAAAA0P///wAAAAD+////SF9AAF9fQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAAuWpAAAAAAAD+////AAAAAND///8AAAAA/v///wAAAADKbEAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAM55QAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAA3oFAAAAAAAD+////AAAAAND///8AAAAA/v///wAAAAC/gkAAAAAAAP7///8AAAAAzP///wAAAAD+////AAAAALSVQAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAATZhAAAAAAAD+////AAAAAND///8AAAAA/v///wAAAADkoUAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAFumQAAAAAAA/v///wAAAADI////AAAAAP7///8AAAAAIahAAAAAAAAAAAAAXadAAP7///8AAAAA0P///wAAAAD+////AAAAANyuQAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAA+MJAAAAAAAD+////AAAAAMz///8AAAAA/v///wAAAACbykAAXPkAAAAAAAAAAAAAFgABAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJz6AAC4+gAAzvoAAOT6AAD2+gAADvsAACT7AAA8+wAAVPsAAGj7AABw+wAAgvsAAJD7AACi+wAAtPsAAMb7AADW+wAA5PsAAPz7AAAQ/AAAJPwAAED8AABe/AAAcvwAAIL8AACO/AAAmvwAAKb8AAC+/AAA1vwAAOD8AADs/AAA/vwAAAz9AAAY/QAAJv0AADD9AABA/QAAVv0AAGL9AABy/QAAmv0AALT9AADM/QAA5v0AAPz9AAAW/gAAJP4AADL+AABM/gAAXP4AAHL+AACM/gAAmP4AAKb+AAC2/gAAxv4AANj+AADs/gAA/P4AABL/AAAi/wAANP8AAEb/AABY/wAAav8AAHb/AACE/wAAlP8AAKr/AAC6/wAAyv8AANj/AADq/wAA/P8AACQAAQAwAAEAQAABAFIAAQAAAAAAUgFHZW5lcmF0ZUNvbnNvbGVDdHJsRXZlbnQAAMYBR2V0RXhpdENvZGVQcm9jZXNzAABuBFdhaXRGb3JTaW5nbGVPYmplY3QAlQBDcmVhdGVQcm9jZXNzQQAArwNTZXRDb25zb2xlQ3RybEhhbmRsZXIA9QFHZXRNb2R1bGVGaWxlTmFtZUEAANoARW50ZXJDcml0aWNhbFNlY3Rpb24AAPQCTGVhdmVDcml0aWNhbFNlY3Rpb24AAPoBR2V0TW9kdWxlSGFuZGxlVwAAKwRTbGVlcAAiAkdldFByb2NBZGRyZXNzAAAFAUV4aXRQcm9jZXNzAHABR2V0Q29tbWFuZExpbmVBADwCR2V0U3RhcnR1cEluZm9BAPADU2V0SGFuZGxlQ291bnQAAD4CR2V0U3RkSGFuZGxlAADYAUdldEZpbGVUeXBlAL8ARGVsZXRlQ3JpdGljYWxTZWN0aW9uADcEVGVybWluYXRlUHJvY2VzcwAAqgFHZXRDdXJyZW50UHJvY2VzcwBIBFVuaGFuZGxlZEV4Y2VwdGlvbkZpbHRlcgAAHwRTZXRVbmhhbmRsZWRFeGNlcHRpb25GaWx0ZXIA1gJJc0RlYnVnZ2VyUHJlc2VudADnAUdldExhc3RFcnJvcgAApgJIZWFwRnJlZQAAogJIZWFwQWxsb2MAXAFHZXRDUEluZm8AxQJJbnRlcmxvY2tlZEluY3JlbWVudAAAwQJJbnRlcmxvY2tlZERlY3JlbWVudAAAUwFHZXRBQ1AAABQCR2V0T0VNQ1AAAOACSXNWYWxpZENvZGVQYWdlAD4EVGxzR2V0VmFsdWUAPARUbHNBbGxvYwAAPwRUbHNTZXRWYWx1ZQA9BFRsc0ZyZWUA9ANTZXRMYXN0RXJyb3IAAK4BR2V0Q3VycmVudFRocmVhZElkAACXBFdyaXRlRmlsZQD2AkxvYWRMaWJyYXJ5QQAAugJJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uQW5kU3BpbkNvdW50AEsBRnJlZUVudmlyb25tZW50U3RyaW5nc0EAwAFHZXRFbnZpcm9ubWVudFN0cmluZ3MATAFGcmVlRW52aXJvbm1lbnRTdHJpbmdzVwCEBFdpZGVDaGFyVG9NdWx0aUJ5dGUAwgFHZXRFbnZpcm9ubWVudFN0cmluZ3NXAACkAkhlYXBDcmVhdGUAAGEEVmlydHVhbEZyZWUAWQNRdWVyeVBlcmZvcm1hbmNlQ291bnRlcgBqAkdldFRpY2tDb3VudAAAqwFHZXRDdXJyZW50UHJvY2Vzc0lkAFMCR2V0U3lzdGVtVGltZUFzRmlsZVRpbWUAmgNSdGxVbndpbmQAqQJIZWFwUmVBbGxvYwBeBFZpcnR1YWxBbGxvYwAAhAFHZXRDb25zb2xlQ1AAAJYBR2V0Q29uc29sZU1vZGUAAEIBRmx1c2hGaWxlQnVmZmVycwAA5gJMQ01hcFN0cmluZ0EAAB8DTXVsdGlCeXRlVG9XaWRlQ2hhcgDoAkxDTWFwU3RyaW5nVwAAQAJHZXRTdHJpbmdUeXBlQQAAQwJHZXRTdHJpbmdUeXBlVwAA6QFHZXRMb2NhbGVJ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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQECAgICAgICAgICAgICAgICAwMDAwMDAwMAAAAAAAAAAGz0QABk9EAAXPRAAFT0QAACAAAAAAAAAAAAAAAAAAAAUEsDBBQAAAAAAAAAIQCA3RAn2RQAANkUAAA8AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvaW5zdGFsbGVyLnB5aW1wb3J0IGdsb2IKaW1wb3J0IG9zCmltcG9ydCBzdWJwcm9jZXNzCmltcG9ydCBzeXMKZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZwpmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc0Vycm9yCgppbXBvcnQgcGtnX3Jlc291cmNlcwpmcm9tIHNldHVwdG9vbHMuY29tbWFuZC5lYXN5X2luc3RhbGwgaW1wb3J0IGVhc3lfaW5zdGFsbApmcm9tIHNldHVwdG9vbHMuZXh0ZXJuIGltcG9ydCBzaXgKZnJvbSBzZXR1cHRvb2xzLndoZWVsIGltcG9ydCBXaGVlbAoKZnJvbSAucHkzMWNvbXBhdCBpbXBvcnQgVGVtcG9yYXJ5RGlyZWN0b3J5CgoKZGVmIF9maXh1cF9maW5kX2xpbmtzKGZpbmRfbGlua3MpOgogICAgIiIiRW5zdXJlIGZpbmQtbGlua3Mgb3B0aW9uIGVuZC11cCBiZWluZyBhIGxpc3Qgb2Ygc3RyaW5ncy4iIiIKICAgIGlmIGlzaW5zdGFuY2UoZmluZF9saW5rcywgc2l4LnN0cmluZ190eXBlcyk6CiAgICAgICAgcmV0dXJuIGZpbmRfbGlua3Muc3BsaXQoKQogICAgYXNzZXJ0IGlzaW5zdGFuY2UoZmluZF9saW5rcywgKHR1cGxlLCBsaXN0KSkKICAgIHJldHVybiBmaW5kX2xpbmtzCgoKZGVmIF9sZWdhY3lfZmV0Y2hfYnVpbGRfZWdnKGRpc3QsIHJlcSk6CiAgICAiIiJGZXRjaCBhbiBlZ2cgbmVlZGVkIGZvciBidWlsZGluZy4KCiAgICBMZWdhY3kgcGF0aCB1c2luZyBFYXN5SW5zdGFsbC4KICAgICIiIgogICAgdG1wX2Rpc3QgPSBkaXN0Ll9fY2xhc3NfXyh7J3NjcmlwdF9hcmdzJzogWydlYXN5X2luc3RhbGwnXX0pCiAgICBvcHRzID0gdG1wX2Rpc3QuZ2V0X29wdGlvbl9kaWN0KCdlYXN5X2luc3RhbGwnKQogICAgb3B0cy5jbGVhcigpCiAgICBvcHRzLnVwZGF0ZSgKICAgICAgICAoaywgdikKICAgICAgICBmb3IgaywgdiBpbiBkaXN0LmdldF9vcHRpb25fZGljdCgnZWFzeV9pbnN0YWxsJykuaXRlbXMoKQogICAgICAgIGlmIGsgaW4gKAogICAgICAgICAgICAjIGRvbid0IHVzZSBhbnkgb3RoZXIgc2V0dGluZ3MKICAgICAgICAgICAgJ2ZpbmRfbGlua3MnLCAnc2l0ZV9kaXJzJywgJ2luZGV4X3VybCcsCiAgICAgICAgICAgICdvcHRpbWl6ZScsICdzaXRlX2RpcnMnLCAnYWxsb3dfaG9zdHMnLAogICAgICAgICkpCiAgICBpZiBkaXN0LmRlcGVuZGVuY3lfbGlua3M6CiAgICAgICAgbGlua3MgPSBkaXN0LmRlcGVuZGVuY3lfbGlua3NbOl0KICAgICAgICBpZiAnZmluZF9saW5rcycgaW4gb3B0czoKICAgICAgICAgICAgbGlua3MgPSBfZml4dXBfZmluZF9saW5rcyhvcHRzWydmaW5kX2xpbmtzJ11bMV0pICsgbGlua3MKICAgICAgICBvcHRzWydmaW5kX2xpbmtzJ10gPSAoJ3NldHVwJywgbGlua3MpCiAgICBpbnN0YWxsX2RpciA9IGRpc3QuZ2V0X2VnZ19jYWNoZV9kaXIoKQogICAgY21kID0gZWFzeV9pbnN0YWxsKAogICAgICAgIHRtcF9kaXN0LCBhcmdzPVsieCJdLCBpbnN0YWxsX2Rpcj1pbnN0YWxsX2RpciwKICAgICAgICBleGNsdWRlX3NjcmlwdHM9VHJ1ZSwKICAgICAgICBhbHdheXNfY29weT1GYWxzZSwgYnVpbGRfZGlyZWN0b3J5PU5vbmUsIGVkaXRhYmxlPUZhbHNlLAogICAgICAgIHVwZ3JhZGU9RmFsc2UsIG11bHRpX3ZlcnNpb249VHJ1ZSwgbm9fcmVwb3J0PVRydWUsIHVzZXI9RmFsc2UKICAgICkKICAgIGNtZC5lbnN1cmVfZmluYWxpemVkKCkKICAgIHJldHVybiBjbWQuZWFzeV9pbnN0YWxsKHJlcSkKCgpkZWYgZmV0Y2hfYnVpbGRfZWdnKGRpc3QsIHJlcSk6CiAgICAiIiJGZXRjaCBhbiBlZ2cgbmVlZGVkIGZvciBidWlsZGluZy4KCiAgICBVc2UgcGlwL3doZWVsIHRvIGZldGNoL2J1aWxkIGEgd2hlZWwuIiIiCiAgICAjIENoZWNrIHBpcCBpcyBhdmFpbGFibGUuCiAgICB0cnk6CiAgICAgICAgcGtnX3Jlc291cmNlcy5nZXRfZGlzdHJpYnV0aW9uKCdwaXAnKQogICAgZXhjZXB0IHBrZ19yZXNvdXJjZXMuRGlzdHJpYnV0aW9uTm90Rm91bmQ6CiAgICAgICAgZGlzdC5hbm5vdW5jZSgKICAgICAgICAgICAgJ1dBUk5JTkc6IFRoZSBwaXAgcGFja2FnZSBpcyBub3QgYXZhaWxhYmxlLCBmYWxsaW5nIGJhY2sgJwogICAgICAgICAgICAndG8gRWFzeUluc3RhbGwgZm9yIGhhbmRsaW5nIHNldHVwX3JlcXVpcmVzL3Rlc3RfcmVxdWlyZXM7ICcKICAgICAgICAgICAgJ3RoaXMgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHZlcnNpb24uJwogICAgICAgICAgICAsIGxvZy5XQVJOCiAgICAgICAgKQogICAgICAgIHJldHVybiBfbGVnYWN5X2ZldGNoX2J1aWxkX2VnZyhkaXN0LCByZXEpCiAgICAjIFdhcm4gaWYgd2hlZWwgaXMgbm90LgogICAgdHJ5OgogICAgICAgIHBrZ19yZXNvdXJjZXMuZ2V0X2Rpc3RyaWJ1dGlvbignd2hlZWwnKQogICAgZXhjZXB0IHBrZ19yZXNvdXJjZXMuRGlzdHJpYnV0aW9uTm90Rm91bmQ6CiAgICAgICAgZGlzdC5hbm5vdW5jZSgnV0FSTklORzogVGhlIHdoZWVsIHBhY2thZ2UgaXMgbm90IGF2YWlsYWJsZS4nLCBsb2cuV0FSTikKICAgICMgSWdub3JlIGVudmlyb25tZW50IG1hcmtlcnM7IGlmIHN1cHBsaWVkLCBpdCBpcyByZXF1aXJlZC4KICAgIHJlcSA9IHN0cmlwX21hcmtlcihyZXEpCiAgICAjIFRha2UgZWFzeV9pbnN0YWxsIG9wdGlvbnMgaW50byBhY2NvdW50LCBidXQgZG8gbm90IG92ZXJyaWRlIHJlbGV2YW50CiAgICAjIHBpcCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgKGxpa2UgUElQX0lOREVYX1VSTCBvciBQSVBfUVVJRVQpOyB0aGV5J2xsCiAgICAjIHRha2UgcHJlY2VkZW5jZS4KICAgIG9wdHMgPSBkaXN0LmdldF9vcHRpb25fZGljdCgnZWFzeV9pbnN0YWxsJykKICAgIGlmICdhbGxvd19ob3N0cycgaW4gb3B0czoKICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcigndGhlIGBhbGxvdy1ob3N0c2Agb3B0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3aGVuIHVzaW5nIHBpcCB0byBpbnN0YWxsIHJlcXVpcmVtZW50cy4nKQogICAgaWYgJ1BJUF9RVUlFVCcgaW4gb3MuZW52aXJvbiBvciAnUElQX1ZFUkJPU0UnIGluIG9zLmVudmlyb246CiAgICAgICAgcXVpZXQgPSBGYWxzZQogICAgZWxzZToKICAgICAgICBxdWlldCA9IFRydWUKICAgIGlmICdQSVBfSU5ERVhfVVJMJyBpbiBvcy5lbnZpcm9uOgogICAgICAgIGluZGV4X3VybCA9IE5vbmUKICAgIGVsaWYgJ2luZGV4X3VybCcgaW4gb3B0czoKICAgICAgICBpbmRleF91cmwgPSBvcHRzWydpbmRleF91cmwnXVsxXQogICAgZWxzZToKICAgICAgICBpbmRleF91cmwgPSBOb25lCiAgICBpZiAnZmluZF9saW5rcycgaW4gb3B0czoKICAgICAgICBmaW5kX2xpbmtzID0gX2ZpeHVwX2ZpbmRfbGlua3Mob3B0c1snZmluZF9saW5rcyddWzFdKVs6XQogICAgZWxzZToKICAgICAgICBmaW5kX2xpbmtzID0gW10KICAgIGlmIGRpc3QuZGVwZW5kZW5jeV9saW5rczoKICAgICAgICBmaW5kX2xpbmtzLmV4dGVuZChkaXN0LmRlcGVuZGVuY3lfbGlua3MpCiAgICBlZ2dzX2RpciA9IG9zLnBhdGgucmVhbHBhdGgoZGlzdC5nZXRfZWdnX2NhY2hlX2RpcigpKQogICAgZW52aXJvbm1lbnQgPSBwa2dfcmVzb3VyY2VzLkVudmlyb25tZW50KCkKICAgIGZvciBlZ2dfZGlzdCBpbiBwa2dfcmVzb3VyY2VzLmZpbmRfZGlzdHJpYnV0aW9ucyhlZ2dzX2Rpcik6CiAgICAgICAgaWYgZWdnX2Rpc3QgaW4gcmVxIGFuZCBlbnZpcm9ubWVudC5jYW5fYWRkKGVnZ19kaXN0KToKICAgICAgICAgICAgcmV0dXJuIGVnZ19kaXN0CiAgICB3aXRoIFRlbXBvcmFyeURpcmVjdG9yeSgpIGFzIHRtcGRpcjoKICAgICAgICBjbWQgPSBbCiAgICAgICAgICAgIHN5cy5leGVjdXRhYmxlLCAnLW0nLCAncGlwJywKICAgICAgICAgICAgJy0tZGlzYWJsZS1waXAtdmVyc2lvbi1jaGVjaycsCiAgICAgICAgICAgICd3aGVlbCcsICctLW5vLWRlcHMnLAogICAgICAgICAgICAnLXcnLCB0bXBkaXIsCiAgICAgICAgXQogICAgICAgIGlmIHF1aWV0OgogICAgICAgICAgICBjbWQuYXBwZW5kKCctLXF1aWV0JykKICAgICAgICBpZiBpbmRleF91cmwgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGNtZC5leHRlbmQoKCctLWluZGV4LXVybCcsIGluZGV4X3VybCkpCiAgICAgICAgaWYgZmluZF9saW5rcyBpcyBub3QgTm9uZToKICAgICAgICAgICAgZm9yIGxpbmsgaW4gZmluZF9saW5rczoKICAgICAgICAgICAgICAgIGNtZC5leHRlbmQoKCctLWZpbmQtbGlua3MnLCBsaW5rKSkKICAgICAgICAjIElmIHJlcXVpcmVtZW50IGlzIGEgUEVQIDUwOCBkaXJlY3QgVVJMLCBkaXJlY3RseSBwYXNzCiAgICAgICAgIyB0aGUgVVJMIHRvIHBpcCwgYXMgYHJlcSBAIHVybGAgZG9lcyBub3Qgd29yayBvbiB0aGUKICAgICAgICAjIGNvbW1hbmQgbGluZS4KICAgICAgICBpZiByZXEudXJsOgogICAgICAgICAgICBjbWQuYXBwZW5kKHJlcS51cmwpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgY21kLmFwcGVuZChzdHIocmVxKSkKICAgICAgICB0cnk6CiAgICAgICAgICAgIHN1YnByb2Nlc3MuY2hlY2tfY2FsbChjbWQpCiAgICAgICAgZXhjZXB0IHN1YnByb2Nlc3MuQ2FsbGVkUHJvY2Vzc0Vycm9yIGFzIGU6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKHN0cihlKSkKICAgICAgICB3aGVlbCA9IFdoZWVsKGdsb2IuZ2xvYihvcy5wYXRoLmpvaW4odG1wZGlyLCAnKi53aGwnKSlbMF0pCiAgICAgICAgZGlzdF9sb2NhdGlvbiA9IG9zLnBhdGguam9pbihlZ2dzX2Rpciwgd2hlZWwuZWdnX25hbWUoKSkKICAgICAgICB3aGVlbC5pbnN0YWxsX2FzX2VnZyhkaXN0X2xvY2F0aW9uKQogICAgICAgIGRpc3RfbWV0YWRhdGEgPSBwa2dfcmVzb3VyY2VzLlBhdGhNZXRhZGF0YSgKICAgICAgICAgICAgZGlzdF9sb2NhdGlvbiwgb3MucGF0aC5qb2luKGRpc3RfbG9jYXRpb24sICdFR0ctSU5GTycpKQogICAgICAgIGRpc3QgPSBwa2dfcmVzb3VyY2VzLkRpc3RyaWJ1dGlvbi5mcm9tX2ZpbGVuYW1lKAogICAgICAgICAgICBkaXN0X2xvY2F0aW9uLCBtZXRhZGF0YT1kaXN0X21ldGFkYXRhKQogICAgICAgIHJldHVybiBkaXN0CgoKZGVmIHN0cmlwX21hcmtlcihyZXEpOgogICAgIiIiCiAgICBSZXR1cm4gYSBuZXcgcmVxdWlyZW1lbnQgd2l0aG91dCB0aGUgZW52aXJvbm1lbnQgbWFya2VyIHRvIGF2b2lkCiAgICBjYWxsaW5nIHBpcCB3aXRoIHNvbWV0aGluZyBsaWtlIGBiYWJlbDsgZXh0cmEgPT0gImkxOG4iYCwgd2hpY2gKICAgIHdvdWxkIGFsd2F5cyBiZSBpZ25vcmVkLgogICAgIiIiCiAgICAjIGNyZWF0ZSBhIGNvcHkgdG8gYXZvaWQgbXV0YXRpbmcgdGhlIGlucHV0CiAgICByZXEgPSBwa2dfcmVzb3VyY2VzLlJlcXVpcmVtZW50LnBhcnNlKHN0cihyZXEpKQogICAgcmVxLm1hcmtlciA9IE5vbmUKICAgIHJldHVybiByZXEKUEsDBBQAAAAAAAAAIQBk+X6bEwMAABMDAAA5AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvbGF1bmNoLnB5IiIiCkxhdW5jaCB0aGUgUHl0aG9uIHNjcmlwdCBvbiB0aGUgY29tbWFuZCBsaW5lIGFmdGVyCnNldHVwdG9vbHMgaXMgYm9vdHN0cmFwcGVkIHZpYSBpbXBvcnQuCiIiIgoKIyBOb3RlIHRoYXQgc2V0dXB0b29scyBnZXRzIGltcG9ydGVkIGltcGxpY2l0bHkgYnkgdGhlCiMgaW52b2NhdGlvbiBvZiB0aGlzIHNjcmlwdCB1c2luZyBweXRob24gLW0gc2V0dXB0b29scy5sYXVuY2gKCmltcG9ydCB0b2tlbml6ZQppbXBvcnQgc3lzCgoKZGVmIHJ1bigpOgogICAgIiIiCiAgICBSdW4gdGhlIHNjcmlwdCBpbiBzeXMuYXJndlsxXSBhcyBpZiBpdCBoYWQKICAgIGJlZW4gaW52b2tlZCBuYXR1cmFsbHkuCiAgICAiIiIKICAgIF9fYnVpbHRpbnNfXwogICAgc2NyaXB0X25hbWUgPSBzeXMuYXJndlsxXQogICAgbmFtZXNwYWNlID0gZGljdCgKICAgICAgICBfX2ZpbGVfXz1zY3JpcHRfbmFtZSwKICAgICAgICBfX25hbWVfXz0nX19tYWluX18nLAogICAgICAgIF9fZG9jX189Tm9uZSwKICAgICkKICAgIHN5cy5hcmd2WzpdID0gc3lzLmFyZ3ZbMTpdCgogICAgb3Blbl8gPSBnZXRhdHRyKHRva2VuaXplLCAnb3BlbicsIG9wZW4pCiAgICBzY3JpcHQgPSBvcGVuXyhzY3JpcHRfbmFtZSkucmVhZCgpCiAgICBub3JtX3NjcmlwdCA9IHNjcmlwdC5yZXBsYWNlKCdcXHJcXG4nLCAnXFxuJykKICAgIGNvZGUgPSBjb21waWxlKG5vcm1fc2NyaXB0LCBzY3JpcHRfbmFtZSwgJ2V4ZWMnKQogICAgZXhlYyhjb2RlLCBuYW1lc3BhY2UpCgoKaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgIHJ1bigpClBLAwQUAAAAAAAAACEAh1Hrot0HAADdBwAAPQAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2xpYjJ0bzNfZXgucHkiIiIKQ3VzdG9taXplZCBNaXhpbjJ0bzMgc3VwcG9ydDoKCiAtIGFkZHMgc3VwcG9ydCBmb3IgY29udmVydGluZyBkb2N0ZXN0cwoKClRoaXMgbW9kdWxlIHJhaXNlcyBhbiBJbXBvcnRFcnJvciBvbiBQeXRob24gMi4KIiIiCgpmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBNaXhpbjJ0bzMgYXMgX01peGluMnRvMwpmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCmZyb20gbGliMnRvMy5yZWZhY3RvciBpbXBvcnQgUmVmYWN0b3JpbmdUb29sLCBnZXRfZml4ZXJzX2Zyb21fcGFja2FnZQoKaW1wb3J0IHNldHVwdG9vbHMKCgpjbGFzcyBEaXN0dXRpbHNSZWZhY3RvcmluZ1Rvb2woUmVmYWN0b3JpbmdUb29sKToKICAgIGRlZiBsb2dfZXJyb3Ioc2VsZiwgbXNnLCAqYXJncywgKiprdyk6CiAgICAgICAgbG9nLmVycm9yKG1zZywgKmFyZ3MpCgogICAgZGVmIGxvZ19tZXNzYWdlKHNlbGYsIG1zZywgKmFyZ3MpOgogICAgICAgIGxvZy5pbmZvKG1zZywgKmFyZ3MpCgogICAgZGVmIGxvZ19kZWJ1ZyhzZWxmLCBtc2csICphcmdzKToKICAgICAgICBsb2cuZGVidWcobXNnLCAqYXJncykKCgpjbGFzcyBNaXhpbjJ0bzMoX01peGluMnRvMyk6CiAgICBkZWYgcnVuXzJ0bzMoc2VsZiwgZmlsZXMsIGRvY3Rlc3RzPUZhbHNlKToKICAgICAgICAjIFNlZSBvZiB0aGUgZGlzdHJpYnV0aW9uIG9wdGlvbiBoYXMgYmVlbiBzZXQsIG90aGVyd2lzZSBjaGVjayB0aGUKICAgICAgICAjIHNldHVwdG9vbHMgZGVmYXVsdC4KICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi51c2VfMnRvMyBpcyBub3QgVHJ1ZToKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgaWYgbm90IGZpbGVzOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBsb2cuaW5mbygiRml4aW5nICIgKyAiICIuam9pbihmaWxlcykpCiAgICAgICAgc2VsZi5fX2J1aWxkX2ZpeGVyX25hbWVzKCkKICAgICAgICBzZWxmLl9fZXhjbHVkZV9maXhlcnMoKQogICAgICAgIGlmIGRvY3Rlc3RzOgogICAgICAgICAgICBpZiBzZXR1cHRvb2xzLnJ1bl8ydG8zX29uX2RvY3Rlc3RzOgogICAgICAgICAgICAgICAgciA9IERpc3R1dGlsc1JlZmFjdG9yaW5nVG9vbChzZWxmLmZpeGVyX25hbWVzKQogICAgICAgICAgICAgICAgci5yZWZhY3RvcihmaWxlcywgd3JpdGU9VHJ1ZSwgZG9jdGVzdHNfb25seT1UcnVlKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIF9NaXhpbjJ0bzMucnVuXzJ0bzMoc2VsZiwgZmlsZXMpCgogICAgZGVmIF9fYnVpbGRfZml4ZXJfbmFtZXMoc2VsZik6CiAgICAgICAgaWYgc2VsZi5maXhlcl9uYW1lczoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgc2VsZi5maXhlcl9uYW1lcyA9IFtdCiAgICAgICAgZm9yIHAgaW4gc2V0dXB0b29scy5saWIydG8zX2ZpeGVyX3BhY2thZ2VzOgogICAgICAgICAgICBzZWxmLmZpeGVyX25hbWVzLmV4dGVuZChnZXRfZml4ZXJzX2Zyb21fcGFja2FnZShwKSkKICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi51c2VfMnRvM19maXhlcnMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGZvciBwIGluIHNlbGYuZGlzdHJpYnV0aW9uLnVzZV8ydG8zX2ZpeGVyczoKICAgICAgICAgICAgICAgIHNlbGYuZml4ZXJfbmFtZXMuZXh0ZW5kKGdldF9maXhlcnNfZnJvbV9wYWNrYWdlKHApKQoKICAgIGRlZiBfX2V4Y2x1ZGVfZml4ZXJzKHNlbGYpOgogICAgICAgIGV4Y2x1ZGVkX2ZpeGVycyA9IGdldGF0dHIoc2VsZiwgJ2V4Y2x1ZGVfZml4ZXJzJywgW10pCiAgICAgICAgaWYgc2VsZi5kaXN0cmlidXRpb24udXNlXzJ0bzNfZXhjbHVkZV9maXhlcnMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGV4Y2x1ZGVkX2ZpeGVycy5leHRlbmQoc2VsZi5kaXN0cmlidXRpb24udXNlXzJ0bzNfZXhjbHVkZV9maXhlcnMpCiAgICAgICAgZm9yIGZpeGVyX25hbWUgaW4gZXhjbHVkZWRfZml4ZXJzOgogICAgICAgICAgICBpZiBmaXhlcl9uYW1lIGluIHNlbGYuZml4ZXJfbmFtZXM6CiAgICAgICAgICAgICAgICBzZWxmLmZpeGVyX25hbWVzLnJlbW92ZShmaXhlcl9uYW1lKQpQSwMEFAAAAAAAAAAhABRjSMuQFAAAkBQAADkAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9tb25rZXkucHkiIiIKTW9ua2V5IHBhdGNoaW5nIG9mIGRpc3R1dGlscy4KIiIiCgppbXBvcnQgc3lzCmltcG9ydCBkaXN0dXRpbHMuZmlsZWxpc3QKaW1wb3J0IHBsYXRmb3JtCmltcG9ydCB0eXBlcwppbXBvcnQgZnVuY3Rvb2xzCmZyb20gaW1wb3J0bGliIGltcG9ydCBpbXBvcnRfbW9kdWxlCmltcG9ydCBpbnNwZWN0Cgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuIGltcG9ydCBzaXgKCmltcG9ydCBzZXR1cHRvb2xzCgpfX2FsbF9fID0gW10KIiIiCkV2ZXJ5dGhpbmcgaXMgcHJpdmF0ZS4gQ29udGFjdCB0aGUgcHJvamVjdCB0ZWFtCmlmIHlvdSB0aGluayB5b3UgbmVlZCB0aGlzIGZ1bmN0aW9uYWxpdHkuCiIiIgoKCmRlZiBfZ2V0X21ybyhjbHMpOgogICAgIiIiCiAgICBSZXR1cm5zIHRoZSBiYXNlcyBjbGFzc2VzIGZvciBjbHMgc29ydGVkIGJ5IHRoZSBNUk8uCgogICAgV29ya3MgYXJvdW5kIGFuIGlzc3VlIG9uIEp5dGhvbiB3aGVyZSBpbnNwZWN0LmdldG1ybyB3aWxsIG5vdCByZXR1cm4gYWxsCiAgICBiYXNlIGNsYXNzZXMgaWYgbXVsdGlwbGUgY2xhc3NlcyBzaGFyZSB0aGUgc2FtZSBuYW1lLiBJbnN0ZWFkLCB0aGlzCiAgICBmdW5jdGlvbiB3aWxsIHJldHVybiBhIHR1cGxlIGNvbnRhaW5pbmcgdGhlIGNsYXNzIGl0c2VsZiwgYW5kIHRoZSBjb250ZW50cwogICAgb2YgY2xzLl9fYmFzZXNfXy4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3NldHVwdG9vbHMvaXNzdWVzLzEwMjQuCiAgICAiIiIKICAgIGlmIHBsYXRmb3JtLnB5dGhvbl9pbXBsZW1lbnRhdGlvbigpID09ICJKeXRob24iOgogICAgICAgIHJldHVybiAoY2xzLCkgKyBjbHMuX19iYXNlc19fCiAgICByZXR1cm4gaW5zcGVjdC5nZXRtcm8oY2xzKQoKCmRlZiBnZXRfdW5wYXRjaGVkKGl0ZW0pOgogICAgbG9va3VwID0gKAogICAgICAgIGdldF91bnBhdGNoZWRfY2xhc3MgaWYgaXNpbnN0YW5jZShpdGVtLCBzaXguY2xhc3NfdHlwZXMpIGVsc2UKICAgICAgICBnZXRfdW5wYXRjaGVkX2Z1bmN0aW9uIGlmIGlzaW5zdGFuY2UoaXRlbSwgdHlwZXMuRnVuY3Rpb25UeXBlKSBlbHNlCiAgICAgICAgbGFtYmRhIGl0ZW06IE5vbmUKICAgICkKICAgIHJldHVybiBsb29rdXAoaXRlbSkKCgpkZWYgZ2V0X3VucGF0Y2hlZF9jbGFzcyhjbHMpOgogICAgIiIiUHJvdGVjdCBhZ2FpbnN0IHJlLXBhdGNoaW5nIHRoZSBkaXN0dXRpbHMgaWYgcmVsb2FkZWQKCiAgICBBbHNvIGVuc3VyZXMgdGhhdCBubyBvdGhlciBkaXN0dXRpbHMgZXh0ZW5zaW9uIG1vbmtleXBhdGNoZWQgdGhlIGRpc3R1dGlscwogICAgZmlyc3QuCiAgICAiIiIKICAgIGV4dGVybmFsX2Jhc2VzID0gKAogICAgICAgIGNscwogICAgICAgIGZvciBjbHMgaW4gX2dldF9tcm8oY2xzKQogICAgICAgIGlmIG5vdCBjbHMuX19tb2R1bGVfXy5zdGFydHN3aXRoKCdzZXR1cHRvb2xzJykKICAgICkKICAgIGJhc2UgPSBuZXh0KGV4dGVybmFsX2Jhc2VzKQogICAgaWYgbm90IGJhc2UuX19tb2R1bGVfXy5zdGFydHN3aXRoKCdkaXN0dXRpbHMnKToKICAgICAgICBtc2cgPSAiZGlzdHV0aWxzIGhhcyBhbHJlYWR5IGJlZW4gcGF0Y2hlZCBieSAlciIgJSBjbHMKICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcihtc2cpCiAgICByZXR1cm4gYmFzZQoKCmRlZiBwYXRjaF9hbGwoKToKICAgICMgd2UgY2FuJ3QgcGF0Y2ggZGlzdHV0aWxzLmNtZCwgYWxhcwogICAgZGlzdHV0aWxzLmNvcmUuQ29tbWFuZCA9IHNldHVwdG9vbHMuQ29tbWFuZAoKICAgIGhhc19pc3N1ZV8xMjg4NSA9IHN5cy52ZXJzaW9uX2luZm8gPD0gKDMsIDUsIDMpCgogICAgaWYgaGFzX2lzc3VlXzEyODg1OgogICAgICAgICMgZml4IGZpbmRhbGwgYnVnIGluIGRpc3R1dGlscyAoaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTEyODg1KQogICAgICAgIGRpc3R1dGlscy5maWxlbGlzdC5maW5kYWxsID0gc2V0dXB0b29scy5maW5kYWxsCgogICAgbmVlZHNfd2FyZWhvdXNlID0gKAogICAgICAgIHN5cy52ZXJzaW9uX2luZm8gPCAoMiwgNywgMTMpCiAgICAgICAgb3IKICAgICAgICAoMywgNCkgPCBzeXMudmVyc2lvbl9pbmZvIDwgKDMsIDQsIDYpCiAgICAgICAgb3IKICAgICAgICAoMywgNSkgPCBzeXMudmVyc2lvbl9pbmZvIDw9ICgzLCA1LCAzKQogICAgKQoKICAgIGlmIG5lZWRzX3dhcmVob3VzZToKICAgICAgICB3YXJlaG91c2UgPSAnaHR0cHM6Ly91cGxvYWQucHlwaS5vcmcvbGVnYWN5LycKICAgICAgICBkaXN0dXRpbHMuY29uZmlnLlB5UElSQ0NvbW1hbmQuREVGQVVMVF9SRVBPU0lUT1JZID0gd2FyZWhvdXNlCgogICAgX3BhdGNoX2Rpc3RyaWJ1dGlvbl9tZXRhZGF0YSgpCgogICAgIyBJbnN0YWxsIERpc3RyaWJ1dGlvbiB0aHJvdWdob3V0IHRoZSBkaXN0dXRpbHMKICAgIGZvciBtb2R1bGUgaW4gZGlzdHV0aWxzLmRpc3QsIGRpc3R1dGlscy5jb3JlLCBkaXN0dXRpbHMuY21kOgogICAgICAgIG1vZHVsZS5EaXN0cmlidXRpb24gPSBzZXR1cHRvb2xzLmRpc3QuRGlzdHJpYnV0aW9uCgogICAgIyBJbnN0YWxsIHRoZSBwYXRjaGVkIEV4dGVuc2lvbgogICAgZGlzdHV0aWxzLmNvcmUuRXh0ZW5zaW9uID0gc2V0dXB0b29scy5leHRlbnNpb24uRXh0ZW5zaW9uCiAgICBkaXN0dXRpbHMuZXh0ZW5zaW9uLkV4dGVuc2lvbiA9IHNldHVwdG9vbHMuZXh0ZW5zaW9uLkV4dGVuc2lvbgogICAgaWYgJ2Rpc3R1dGlscy5jb21tYW5kLmJ1aWxkX2V4dCcgaW4gc3lzLm1vZHVsZXM6CiAgICAgICAgc3lzLm1vZHVsZXNbJ2Rpc3R1dGlscy5jb21tYW5kLmJ1aWxkX2V4dCddLkV4dGVuc2lvbiA9ICgKICAgICAgICAgICAgc2V0dXB0b29scy5leHRlbnNpb24uRXh0ZW5zaW9uCiAgICAgICAgKQoKICAgIHBhdGNoX2Zvcl9tc3ZjX3NwZWNpYWxpemVkX2NvbXBpbGVyKCkKCgpkZWYgX3BhdGNoX2Rpc3RyaWJ1dGlvbl9tZXRhZGF0YSgpOgogICAgIiIiUGF0Y2ggd3JpdGVfcGtnX2ZpbGUgYW5kIHJlYWRfcGtnX2ZpbGUgZm9yIGhpZ2hlciBtZXRhZGF0YSBzdGFuZGFyZHMiIiIKICAgIGZvciBhdHRyIGluICgnd3JpdGVfcGtnX2ZpbGUnLCAncmVhZF9wa2dfZmlsZScsICdnZXRfbWV0YWRhdGFfdmVyc2lvbicpOgogICAgICAgIG5ld192YWwgPSBnZXRhdHRyKHNldHVwdG9vbHMuZGlzdCwgYXR0cikKICAgICAgICBzZXRhdHRyKGRpc3R1dGlscy5kaXN0LkRpc3RyaWJ1dGlvbk1ldGFkYXRhLCBhdHRyLCBuZXdfdmFsKQoKCmRlZiBwYXRjaF9mdW5jKHJlcGxhY2VtZW50LCB0YXJnZXRfbW9kLCBmdW5jX25hbWUpOgogICAgIiIiCiAgICBQYXRjaCBmdW5jX25hbWUgaW4gdGFyZ2V0X21vZCB3aXRoIHJlcGxhY2VtZW50CgogICAgSW1wb3J0YW50IC0gb3JpZ2luYWwgbXVzdCBiZSByZXNvbHZlZCBieSBuYW1lIHRvIGF2b2lkCiAgICBwYXRjaGluZyBhbiBhbHJlYWR5IHBhdGNoZWQgZnVuY3Rpb24uCiAgICAiIiIKICAgIG9yaWdpbmFsID0gZ2V0YXR0cih0YXJnZXRfbW9kLCBmdW5jX25hbWUpCgogICAgIyBzZXQgdGhlICd1bnBhdGNoZWQnIGF0dHJpYnV0ZSBvbiB0aGUgcmVwbGFjZW1lbnQgdG8KICAgICMgcG9pbnQgdG8gdGhlIG9yaWdpbmFsLgogICAgdmFycyhyZXBsYWNlbWVudCkuc2V0ZGVmYXVsdCgndW5wYXRjaGVkJywgb3JpZ2luYWwpCgogICAgIyByZXBsYWNlIHRoZSBmdW5jdGlvbiBpbiB0aGUgb3JpZ2luYWwgbW9kdWxlCiAgICBzZXRhdHRyKHRhcmdldF9tb2QsIGZ1bmNfbmFtZSwgcmVwbGFjZW1lbnQpCgoKZGVmIGdldF91bnBhdGNoZWRfZnVuY3Rpb24oY2FuZGlkYXRlKToKICAgIHJldHVybiBnZXRhdHRyKGNhbmRpZGF0ZSwgJ3VucGF0Y2hlZCcpCgoKZGVmIHBhdGNoX2Zvcl9tc3ZjX3NwZWNpYWxpemVkX2NvbXBpbGVyKCk6CiAgICAiIiIKICAgIFBhdGNoIGZ1bmN0aW9ucyBpbiBkaXN0dXRpbHMgdG8gdXNlIHN0YW5kYWxvbmUgTWljcm9zb2Z0IFZpc3VhbCBDKysKICAgIGNvbXBpbGVycy4KICAgICIiIgogICAgIyBpbXBvcnQgbGF0ZSB0byBhdm9pZCBjaXJjdWxhciBpbXBvcnRzIG9uIFB5dGhvbiA8IDMuNQogICAgbXN2YyA9IGltcG9ydF9tb2R1bGUoJ3NldHVwdG9vbHMubXN2YycpCgogICAgaWYgcGxhdGZvcm0uc3lzdGVtKCkgIT0gJ1dpbmRvd3MnOgogICAgICAgICMgQ29tcGlsZXJzIG9ubHkgYXZhaWxhYmxlcyBvbiBNaWNyb3NvZnQgV2luZG93cwogICAgICAgIHJldHVybgoKICAgIGRlZiBwYXRjaF9wYXJhbXMobW9kX25hbWUsIGZ1bmNfbmFtZSk6CiAgICAgICAgIiIiCiAgICAgICAgUHJlcGFyZSB0aGUgcGFyYW1ldGVycyBmb3IgcGF0Y2hfZnVuYyB0byBwYXRjaCBpbmRpY2F0ZWQgZnVuY3Rpb24uCiAgICAgICAgIiIiCiAgICAgICAgcmVwbF9wcmVmaXggPSAnbXN2YzlfJyBpZiAnbXN2YzknIGluIG1vZF9uYW1lIGVsc2UgJ21zdmMxNF8nCiAgICAgICAgcmVwbF9uYW1lID0gcmVwbF9wcmVmaXggKyBmdW5jX25hbWUubHN0cmlwKCdfJykKICAgICAgICByZXBsID0gZ2V0YXR0cihtc3ZjLCByZXBsX25hbWUpCiAgICAgICAgbW9kID0gaW1wb3J0X21vZHVsZShtb2RfbmFtZSkKICAgICAgICBpZiBub3QgaGFzYXR0cihtb2QsIGZ1bmNfbmFtZSk6CiAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yKGZ1bmNfbmFtZSkKICAgICAgICByZXR1cm4gcmVwbCwgbW9kLCBmdW5jX25hbWUKCiAgICAjIFB5dGhvbiAyLjcgdG8gMy40CiAgICBtc3ZjOSA9IGZ1bmN0b29scy5wYXJ0aWFsKHBhdGNoX3BhcmFtcywgJ2Rpc3R1dGlscy5tc3ZjOWNvbXBpbGVyJykKCiAgICAjIFB5dGhvbiAzLjUrCiAgICBtc3ZjMTQgPSBmdW5jdG9vbHMucGFydGlhbChwYXRjaF9wYXJhbXMsICdkaXN0dXRpbHMuX21zdmNjb21waWxlcicpCgogICAgdHJ5OgogICAgICAgICMgUGF0Y2ggZGlzdHV0aWxzLm1zdmM5Y29tcGlsZXIKICAgICAgICBwYXRjaF9mdW5jKCptc3ZjOSgnZmluZF92Y3ZhcnNhbGwnKSkKICAgICAgICBwYXRjaF9mdW5jKCptc3ZjOSgncXVlcnlfdmN2YXJzYWxsJykpCiAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgcGFzcwoKICAgIHRyeToKICAgICAgICAjIFBhdGNoIGRpc3R1dGlscy5fbXN2Y2NvbXBpbGVyLl9nZXRfdmNfZW52CiAgICAgICAgcGF0Y2hfZnVuYygqbXN2YzE0KCdfZ2V0X3ZjX2VudicpKQogICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgIHBhc3MKCiAgICB0cnk6CiAgICAgICAgIyBQYXRjaCBkaXN0dXRpbHMuX21zdmNjb21waWxlci5nZW5fbGliX29wdGlvbnMgZm9yIE51bXB5CiAgICAgICAgcGF0Y2hfZnVuYygqbXN2YzE0KCdnZW5fbGliX29wdGlvbnMnKSkKICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICBwYXNzClBLAwQUAAAAAAAAACEAMqf8XJ+2AACftgAANwAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL21zdmMucHkiIiIKSW1wcm92ZWQgc3VwcG9ydCBmb3IgTWljcm9zb2Z0IFZpc3VhbCBDKysgY29tcGlsZXJzLgoKS25vd24gc3VwcG9ydGVkIGNvbXBpbGVyczoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KTWljcm9zb2Z0IFZpc3VhbCBDKysgOS4wOgogICAgTWljcm9zb2Z0IFZpc3VhbCBDKysgQ29tcGlsZXIgZm9yIFB5dGhvbiAyLjcgKHg4NiwgYW1kNjQpCiAgICBNaWNyb3NvZnQgV2luZG93cyBTREsgNi4xICh4ODYsIHg2NCwgaWE2NCkKICAgIE1pY3Jvc29mdCBXaW5kb3dzIFNESyA3LjAgKHg4NiwgeDY0LCBpYTY0KQoKTWljcm9zb2Z0IFZpc3VhbCBDKysgMTAuMDoKICAgIE1pY3Jvc29mdCBXaW5kb3dzIFNESyA3LjEgKHg4NiwgeDY0LCBpYTY0KQoKTWljcm9zb2Z0IFZpc3VhbCBDKysgMTQuWDoKICAgIE1pY3Jvc29mdCBWaXN1YWwgQysrIEJ1aWxkIFRvb2xzIDIwMTUgKHg4NiwgeDY0LCBhcm0pCiAgICBNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBCdWlsZCBUb29scyAyMDE3ICh4ODYsIHg2NCwgYXJtLCBhcm02NCkKICAgIE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIEJ1aWxkIFRvb2xzIDIwMTkgKHg4NiwgeDY0LCBhcm0sIGFybTY0KQoKVGhpcyBtYXkgYWxzbyBzdXBwb3J0IGNvbXBpbGVycyBzaGlwcGVkIHdpdGggY29tcGF0aWJsZSBWaXN1YWwgU3R1ZGlvIHZlcnNpb25zLgoiIiIKCmltcG9ydCBqc29uCmZyb20gaW8gaW1wb3J0IG9wZW4KZnJvbSBvcyBpbXBvcnQgbGlzdGRpciwgcGF0aHNlcApmcm9tIG9zLnBhdGggaW1wb3J0IGpvaW4sIGlzZmlsZSwgaXNkaXIsIGRpcm5hbWUKaW1wb3J0IHN5cwppbXBvcnQgcGxhdGZvcm0KaW1wb3J0IGl0ZXJ0b29scwppbXBvcnQgZGlzdHV0aWxzLmVycm9ycwpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuLnBhY2thZ2luZy52ZXJzaW9uIGltcG9ydCBMZWdhY3lWZXJzaW9uCgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuLnNpeC5tb3ZlcyBpbXBvcnQgZmlsdGVyZmFsc2UKCmZyb20gLm1vbmtleSBpbXBvcnQgZ2V0X3VucGF0Y2hlZAoKaWYgcGxhdGZvcm0uc3lzdGVtKCkgPT0gJ1dpbmRvd3MnOgogICAgZnJvbSBzZXR1cHRvb2xzLmV4dGVybi5zaXgubW92ZXMgaW1wb3J0IHdpbnJlZwogICAgZnJvbSBvcyBpbXBvcnQgZW52aXJvbgplbHNlOgogICAgIyBNb2NrIHdpbnJlZyBhbmQgZW52aXJvbiBzbyB0aGUgbW9kdWxlIGNhbiBiZSBpbXBvcnRlZCBvbiB0aGlzIHBsYXRmb3JtLgoKICAgIGNsYXNzIHdpbnJlZzoKICAgICAgICBIS0VZX1VTRVJTID0gTm9uZQogICAgICAgIEhLRVlfQ1VSUkVOVF9VU0VSID0gTm9uZQogICAgICAgIEhLRVlfTE9DQUxfTUFDSElORSA9IE5vbmUKICAgICAgICBIS0VZX0NMQVNTRVNfUk9PVCA9IE5vbmUKCiAgICBlbnZpcm9uID0gZGljdCgpCgpfbXN2Yzlfc3VwcHJlc3NfZXJyb3JzID0gKAogICAgIyBtc3ZjOWNvbXBpbGVyIGlzbid0IGF2YWlsYWJsZSBvbiBzb21lIHBsYXRmb3JtcwogICAgSW1wb3J0RXJyb3IsCgogICAgIyBtc3ZjOWNvbXBpbGVyIHJhaXNlcyBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yIGluIHNvbWUKICAgICMgZW52aXJvbm1lbnRzLiBTZWUgIzExMTguCiAgICBkaXN0dXRpbHMuZXJyb3JzLkRpc3R1dGlsc1BsYXRmb3JtRXJyb3IsCikKCnRyeToKICAgIGZyb20gZGlzdHV0aWxzLm1zdmM5Y29tcGlsZXIgaW1wb3J0IFJlZwpleGNlcHQgX21zdmM5X3N1cHByZXNzX2Vycm9yczoKICAgIHBhc3MKCgpkZWYgbXN2YzlfZmluZF92Y3ZhcnNhbGwodmVyc2lvbik6CiAgICAiIiIKICAgIFBhdGNoZWQgImRpc3R1dGlscy5tc3ZjOWNvbXBpbGVyLmZpbmRfdmN2YXJzYWxsIiB0byB1c2UgdGhlIHN0YW5kYWxvbmUKICAgIGNvbXBpbGVyIGJ1aWxkIGZvciBQeXRob24KICAgIChWQ0ZvclB5dGhvbiAvIE1pY3Jvc29mdCBWaXN1YWwgQysrIENvbXBpbGVyIGZvciBQeXRob24gMi43KS4KCiAgICBGYWxsIGJhY2sgdG8gb3JpZ2luYWwgYmVoYXZpb3Igd2hlbiB0aGUgc3RhbmRhbG9uZSBjb21waWxlciBpcyBub3QKICAgIGF2YWlsYWJsZS4KCiAgICBSZWRpcmVjdCB0aGUgcGF0aCBvZiAidmN2YXJzYWxsLmJhdCIuCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgdmVyc2lvbjogZmxvYXQKICAgICAgICBSZXF1aXJlZCBNaWNyb3NvZnQgVmlzdWFsIEMrKyB2ZXJzaW9uLgoKICAgIFJldHVybgogICAgLS0tLS0tCiAgICBzdHIKICAgICAgICB2Y3ZhcnNhbGwuYmF0IHBhdGgKICAgICIiIgogICAgdmNfYmFzZSA9IHInU29mdHdhcmVcJXNNaWNyb3NvZnRcRGV2RGl2XFZDRm9yUHl0aG9uXCUwLjFmJwogICAga2V5ID0gdmNfYmFzZSAlICgnJywgdmVyc2lvbikKICAgIHRyeToKICAgICAgICAjIFBlci11c2VyIGluc3RhbGxzIHJlZ2lzdGVyIHRoZSBjb21waWxlciBwYXRoIGhlcmUKICAgICAgICBwcm9kdWN0ZGlyID0gUmVnLmdldF92YWx1ZShrZXksICJpbnN0YWxsZGlyIikKICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICB0cnk6CiAgICAgICAgICAgICMgQWxsLXVzZXIgaW5zdGFsbHMgb24gYSA2NC1iaXQgc3lzdGVtIHJlZ2lzdGVyIGhlcmUKICAgICAgICAgICAga2V5ID0gdmNfYmFzZSAlICgnV293NjQzMk5vZGVcXCcsIHZlcnNpb24pCiAgICAgICAgICAgIHByb2R1Y3RkaXIgPSBSZWcuZ2V0X3ZhbHVlKGtleSwgImluc3RhbGxkaXIiKQogICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgcHJvZHVjdGRpciA9IE5vbmUKCiAgICBpZiBwcm9kdWN0ZGlyOgogICAgICAgIHZjdmFyc2FsbCA9IGpvaW4ocHJvZHVjdGRpciwgInZjdmFyc2FsbC5iYXQiKQogICAgICAgIGlmIGlzZmlsZSh2Y3ZhcnNhbGwpOgogICAgICAgICAgICByZXR1cm4gdmN2YXJzYWxsCgogICAgcmV0dXJuIGdldF91bnBhdGNoZWQobXN2YzlfZmluZF92Y3ZhcnNhbGwpKHZlcnNpb24pCgoKZGVmIG1zdmM5X3F1ZXJ5X3ZjdmFyc2FsbCh2ZXIsIGFyY2g9J3g4NicsICphcmdzLCAqKmt3YXJncyk6CiAgICAiIiIKICAgIFBhdGNoZWQgImRpc3R1dGlscy5tc3ZjOWNvbXBpbGVyLnF1ZXJ5X3ZjdmFyc2FsbCIgZm9yIHN1cHBvcnQgZXh0cmEKICAgIE1pY3Jvc29mdCBWaXN1YWwgQysrIDkuMCBhbmQgMTAuMCBjb21waWxlcnMuCgogICAgU2V0IGVudmlyb25tZW50IHdpdGhvdXQgdXNlIG9mICJ2Y3ZhcnNhbGwuYmF0Ii4KCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICB2ZXI6IGZsb2F0CiAgICAgICAgUmVxdWlyZWQgTWljcm9zb2Z0IFZpc3VhbCBDKysgdmVyc2lvbi4KICAgIGFyY2g6IHN0cgogICAgICAgIFRhcmdldCBhcmNoaXRlY3R1cmUuCgogICAgUmV0dXJuCiAgICAtLS0tLS0KICAgIGRpY3QKICAgICAgICBlbnZpcm9ubWVudAogICAgIiIiCiAgICAjIFRyeSB0byBnZXQgZW52aXJvbm1lbnQgZnJvbSB2Y3ZhcnNhbGwuYmF0IChDbGFzc2ljYWwgd2F5KQogICAgdHJ5OgogICAgICAgIG9yaWcgPSBnZXRfdW5wYXRjaGVkKG1zdmM5X3F1ZXJ5X3ZjdmFyc2FsbCkKICAgICAgICByZXR1cm4gb3JpZyh2ZXIsIGFyY2gsICphcmdzLCAqKmt3YXJncykKICAgIGV4Y2VwdCBkaXN0dXRpbHMuZXJyb3JzLkRpc3R1dGlsc1BsYXRmb3JtRXJyb3I6CiAgICAgICAgIyBQYXNzIGVycm9yIGlmIFZjdmFyc2FsbC5iYXQgaXMgbWlzc2luZwogICAgICAgIHBhc3MKICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICMgUGFzcyBlcnJvciBpZiBlbnZpcm9ubWVudCBub3Qgc2V0IGFmdGVyIGV4ZWN1dGluZyB2Y3ZhcnNhbGwuYmF0CiAgICAgICAgcGFzcwoKICAgICMgSWYgZXJyb3IsIHRyeSB0byBzZXQgZW52aXJvbm1lbnQgZGlyZWN0bHkKICAgIHRyeToKICAgICAgICByZXR1cm4gRW52aXJvbm1lbnRJbmZvKGFyY2gsIHZlcikucmV0dXJuX2VudigpCiAgICBleGNlcHQgZGlzdHV0aWxzLmVycm9ycy5EaXN0dXRpbHNQbGF0Zm9ybUVycm9yIGFzIGV4YzoKICAgICAgICBfYXVnbWVudF9leGNlcHRpb24oZXhjLCB2ZXIsIGFyY2gpCiAgICAgICAgcmFpc2UKCgpkZWYgbXN2YzE0X2dldF92Y19lbnYocGxhdF9zcGVjKToKICAgICIiIgogICAgUGF0Y2hlZCAiZGlzdHV0aWxzLl9tc3ZjY29tcGlsZXIuX2dldF92Y19lbnYiIGZvciBzdXBwb3J0IGV4dHJhCiAgICBNaWNyb3NvZnQgVmlzdWFsIEMrKyAxNC5YIGNvbXBpbGVycy4KCiAgICBTZXQgZW52aXJvbm1lbnQgd2l0aG91dCB1c2Ugb2YgInZjdmFyc2FsbC5iYXQiLgoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIHBsYXRfc3BlYzogc3RyCiAgICAgICAgVGFyZ2V0IGFyY2hpdGVjdHVyZS4KCiAgICBSZXR1cm4KICAgIC0tLS0tLQogICAgZGljdAogICAgICAgIGVudmlyb25tZW50CiAgICAiIiIKICAgICMgVHJ5IHRvIGdldCBlbnZpcm9ubWVudCBmcm9tIHZjdmFyc2FsbC5iYXQgKENsYXNzaWNhbCB3YXkpCiAgICB0cnk6CiAgICAgICAgcmV0dXJuIGdldF91bnBhdGNoZWQobXN2YzE0X2dldF92Y19lbnYpKHBsYXRfc3BlYykKICAgIGV4Y2VwdCBkaXN0dXRpbHMuZXJyb3JzLkRpc3R1dGlsc1BsYXRmb3JtRXJyb3I6CiAgICAgICAgIyBQYXNzIGVycm9yIFZjdmFyc2FsbC5iYXQgaXMgbWlzc2luZwogICAgICAgIHBhc3MKCiAgICAjIElmIGVycm9yLCB0cnkgdG8gc2V0IGVudmlyb25tZW50IGRpcmVjdGx5CiAgICB0cnk6CiAgICAgICAgcmV0dXJuIEVudmlyb25tZW50SW5mbyhwbGF0X3NwZWMsIHZjX21pbl92ZXI9MTQuMCkucmV0dXJuX2VudigpCiAgICBleGNlcHQgZGlzdHV0aWxzLmVycm9ycy5EaXN0dXRpbHNQbGF0Zm9ybUVycm9yIGFzIGV4YzoKICAgICAgICBfYXVnbWVudF9leGNlcHRpb24oZXhjLCAxNC4wKQogICAgICAgIHJhaXNlCgoKZGVmIG1zdmMxNF9nZW5fbGliX29wdGlvbnMoKmFyZ3MsICoqa3dhcmdzKToKICAgICIiIgogICAgUGF0Y2hlZCAiZGlzdHV0aWxzLl9tc3ZjY29tcGlsZXIuZ2VuX2xpYl9vcHRpb25zIiBmb3IgZml4CiAgICBjb21wYXRpYmlsaXR5IGJldHdlZW4gIm51bXB5LmRpc3R1dGlscyIgYW5kICJkaXN0dXRpbHMuX21zdmNjb21waWxlciIKICAgIChmb3IgTnVtcHkgPCAxLjExLjIpCiAgICAiIiIKICAgIGlmICJudW1weS5kaXN0dXRpbHMiIGluIHN5cy5tb2R1bGVzOgogICAgICAgIGltcG9ydCBudW1weSBhcyBucAogICAgICAgIGlmIExlZ2FjeVZlcnNpb24obnAuX192ZXJzaW9uX18pIDwgTGVnYWN5VmVyc2lvbignMS4xMS4yJyk6CiAgICAgICAgICAgIHJldHVybiBucC5kaXN0dXRpbHMuY2NvbXBpbGVyLmdlbl9saWJfb3B0aW9ucygqYXJncywgKiprd2FyZ3MpCiAgICByZXR1cm4gZ2V0X3VucGF0Y2hlZChtc3ZjMTRfZ2VuX2xpYl9vcHRpb25zKSgqYXJncywgKiprd2FyZ3MpCgoKZGVmIF9hdWdtZW50X2V4Y2VwdGlvbihleGMsIHZlcnNpb24sIGFyY2g9JycpOgogICAgIiIiCiAgICBBZGQgZGV0YWlscyB0byB0aGUgZXhjZXB0aW9uIG1lc3NhZ2UgdG8gaGVscCBndWlkZSB0aGUgdXNlcgogICAgYXMgdG8gd2hhdCBhY3Rpb24gd2lsbCByZXNvbHZlIGl0LgogICAgIiIiCiAgICAjIEVycm9yIGlmIE1TVkMrKyBkaXJlY3Rvcnkgbm90IGZvdW5kIG9yIGVudmlyb25tZW50IG5vdCBzZXQKICAgIG1lc3NhZ2UgPSBleGMuYXJnc1swXQoKICAgIGlmICJ2Y3ZhcnNhbGwiIGluIG1lc3NhZ2UubG93ZXIoKSBvciAidmlzdWFsIGMiIGluIG1lc3NhZ2UubG93ZXIoKToKICAgICAgICAjIFNwZWNpYWwgZXJyb3IgbWVzc2FnZSBpZiBNU1ZDKysgbm90IGluc3RhbGxlZAogICAgICAgIHRtcGwgPSAnTWljcm9zb2Z0IFZpc3VhbCBDKysge3ZlcnNpb246MC4xZn0gaXMgcmVxdWlyZWQuJwogICAgICAgIG1lc3NhZ2UgPSB0bXBsLmZvcm1hdCgqKmxvY2FscygpKQogICAgICAgIG1zZG93bmxvYWQgPSAnd3d3Lm1pY3Jvc29mdC5jb20vZG93bmxvYWQvZGV0YWlscy5hc3B4P2lkPSVkJwogICAgICAgIGlmIHZlcnNpb24gPT0gOS4wOgogICAgICAgICAgICBpZiBhcmNoLmxvd2VyKCkuZmluZCgnaWE2NCcpID4gLTE6CiAgICAgICAgICAgICAgICAjIEZvciBWQysrIDkuMCwgaWYgSUE2NCBzdXBwb3J0IGlzIG5lZWRlZCwgcmVkaXJlY3QgdXNlcgogICAgICAgICAgICAgICAgIyB0byBXaW5kb3dzIFNESyA3LjAuCiAgICAgICAgICAgICAgICAjIE5vdGU6IE5vIGRvd25sb2FkIGxpbmsgYXZhaWxhYmxlIGZyb20gTWljcm9zb2Z0LgogICAgICAgICAgICAgICAgbWVzc2FnZSArPSAnIEdldCBpdCB3aXRoICJNaWNyb3NvZnQgV2luZG93cyBTREsgNy4wIicKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgRm9yIFZDKysgOS4wIHJlZGlyZWN0IHVzZXIgdG8gVmMrKyBmb3IgUHl0aG9uIDIuNyA6CiAgICAgICAgICAgICAgICAjIFRoaXMgcmVkaXJlY3Rpb24gbGluayBpcyBtYWludGFpbmVkIGJ5IE1pY3Jvc29mdC4KICAgICAgICAgICAgICAgICMgQ29udGFjdCB2c3B5dGhvbkBtaWNyb3NvZnQuY29tIGlmIGl0IG5lZWRzIHVwZGF0aW5nLgogICAgICAgICAgICAgICAgbWVzc2FnZSArPSAnIEdldCBpdCBmcm9tIGh0dHA6Ly9ha2EubXMvdmNweXRob24yNycKICAgICAgICBlbGlmIHZlcnNpb24gPT0gMTAuMDoKICAgICAgICAgICAgIyBGb3IgVkMrKyAxMC4wIFJlZGlyZWN0IHVzZXIgdG8gV2luZG93cyBTREsgNy4xCiAgICAgICAgICAgIG1lc3NhZ2UgKz0gJyBHZXQgaXQgd2l0aCAiTWljcm9zb2Z0IFdpbmRvd3MgU0RLIDcuMSI6ICcKICAgICAgICAgICAgbWVzc2FnZSArPSBtc2Rvd25sb2FkICUgODI3OQogICAgICAgIGVsaWYgdmVyc2lvbiA+PSAxNC4wOgogICAgICAgICAgICAjIEZvciBWQysrIDE0LlggUmVkaXJlY3QgdXNlciB0byBsYXRlc3QgVmlzdWFsIEMrKyBCdWlsZCBUb29scwogICAgICAgICAgICBtZXNzYWdlICs9ICgnIEdldCBpdCB3aXRoICJCdWlsZCBUb29scyBmb3IgVmlzdWFsIFN0dWRpbyI6ICcKICAgICAgICAgICAgICAgICAgICAgICAgcidodHRwczovL3Zpc3VhbHN0dWRpby5taWNyb3NvZnQuY29tL2Rvd25sb2Fkcy8nKQoKICAgIGV4Yy5hcmdzID0gKG1lc3NhZ2UsICkKCgpjbGFzcyBQbGF0Zm9ybUluZm86CiAgICAiIiIKICAgIEN1cnJlbnQgYW5kIFRhcmdldCBBcmNoaXRlY3R1cmVzIGluZm9ybWF0aW9uLgoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIGFyY2g6IHN0cgogICAgICAgIFRhcmdldCBhcmNoaXRlY3R1cmUuCiAgICAiIiIKICAgIGN1cnJlbnRfY3B1ID0gZW52aXJvbi5nZXQoJ3Byb2Nlc3Nvcl9hcmNoaXRlY3R1cmUnLCAnJykubG93ZXIoKQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhcmNoKToKICAgICAgICBzZWxmLmFyY2ggPSBhcmNoLmxvd2VyKCkucmVwbGFjZSgneDY0JywgJ2FtZDY0JykKCiAgICBAcHJvcGVydHkKICAgIGRlZiB0YXJnZXRfY3B1KHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBUYXJnZXQgQ1BVIGFyY2hpdGVjdHVyZS4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgc3RyCiAgICAgICAgICAgIFRhcmdldCBDUFUKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZi5hcmNoW3NlbGYuYXJjaC5maW5kKCdfJykgKyAxOl0KCiAgICBkZWYgdGFyZ2V0X2lzX3g4NihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gVHJ1ZSBpZiB0YXJnZXQgQ1BVIGlzIHg4NiAzMiBiaXRzLi4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgYm9vbAogICAgICAgICAgICBDUFUgaXMgeDg2IDMyIGJpdHMKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZi50YXJnZXRfY3B1ID09ICd4ODYnCgogICAgZGVmIGN1cnJlbnRfaXNfeDg2KHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBUcnVlIGlmIGN1cnJlbnQgQ1BVIGlzIHg4NiAzMiBiaXRzLi4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgYm9vbAogICAgICAgICAgICBDUFUgaXMgeDg2IDMyIGJpdHMKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZi5jdXJyZW50X2NwdSA9PSAneDg2JwoKICAgIGRlZiBjdXJyZW50X2RpcihzZWxmLCBoaWRleDg2PUZhbHNlLCB4NjQ9RmFsc2UpOgogICAgICAgICIiIgogICAgICAgIEN1cnJlbnQgcGxhdGZvcm0gc3BlY2lmaWMgc3ViZm9sZGVyLgoKICAgICAgICBQYXJhbWV0ZXJzCiAgICAgICAgLS0tLS0tLS0tLQogICAgICAgIGhpZGV4ODY6IGJvb2wKICAgICAgICAgICAgcmV0dXJuICcnIGFuZCBub3QgJ1x4ODYnIGlmIGFyY2hpdGVjdHVyZSBpcyB4ODYuCiAgICAgICAgeDY0OiBib29sCiAgICAgICAgICAgIHJldHVybiAnXHg2NCcgYW5kIG5vdCAnXGFtZDY0JyBpZiBhcmNoaXRlY3R1cmUgaXMgYW1kNjQuCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIHN0cgogICAgICAgICAgICBzdWJmb2xkZXI6ICdcdGFyZ2V0Jywgb3IgJycgKHNlZSBoaWRleDg2IHBhcmFtZXRlcikKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gKAogICAgICAgICAgICAnJyBpZiAoc2VsZi5jdXJyZW50X2NwdSA9PSAneDg2JyBhbmQgaGlkZXg4NikgZWxzZQogICAgICAgICAgICByJ1x4NjQnIGlmIChzZWxmLmN1cnJlbnRfY3B1ID09ICdhbWQ2NCcgYW5kIHg2NCkgZWxzZQogICAgICAgICAgICByJ1wlcycgJSBzZWxmLmN1cnJlbnRfY3B1CiAgICAgICAgKQoKICAgIGRlZiB0YXJnZXRfZGlyKHNlbGYsIGhpZGV4ODY9RmFsc2UsIHg2ND1GYWxzZSk6CiAgICAgICAgciIiIgogICAgICAgIFRhcmdldCBwbGF0Zm9ybSBzcGVjaWZpYyBzdWJmb2xkZXIuCgogICAgICAgIFBhcmFtZXRlcnMKICAgICAgICAtLS0tLS0tLS0tCiAgICAgICAgaGlkZXg4NjogYm9vbAogICAgICAgICAgICByZXR1cm4gJycgYW5kIG5vdCAnXHg4NicgaWYgYXJjaGl0ZWN0dXJlIGlzIHg4Ni4KICAgICAgICB4NjQ6IGJvb2wKICAgICAgICAgICAgcmV0dXJuICdceDY0JyBhbmQgbm90ICdcYW1kNjQnIGlmIGFyY2hpdGVjdHVyZSBpcyBhbWQ2NC4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgc3RyCiAgICAgICAgICAgIHN1YmZvbGRlcjogJ1xjdXJyZW50Jywgb3IgJycgKHNlZSBoaWRleDg2IHBhcmFtZXRlcikKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gKAogICAgICAgICAgICAnJyBpZiAoc2VsZi50YXJnZXRfY3B1ID09ICd4ODYnIGFuZCBoaWRleDg2KSBlbHNlCiAgICAgICAgICAgIHInXHg2NCcgaWYgKHNlbGYudGFyZ2V0X2NwdSA9PSAnYW1kNjQnIGFuZCB4NjQpIGVsc2UKICAgICAgICAgICAgcidcJXMnICUgc2VsZi50YXJnZXRfY3B1CiAgICAgICAgKQoKICAgIGRlZiBjcm9zc19kaXIoc2VsZiwgZm9yY2V4ODY9RmFsc2UpOgogICAgICAgIHIiIiIKICAgICAgICBDcm9zcyBwbGF0Zm9ybSBzcGVjaWZpYyBzdWJmb2xkZXIuCgogICAgICAgIFBhcmFtZXRlcnMKICAgICAgICAtLS0tLS0tLS0tCiAgICAgICAgZm9yY2V4ODY6IGJvb2wKICAgICAgICAgICAgVXNlICd4ODYnIGFzIGN1cnJlbnQgYXJjaGl0ZWN0dXJlIGV2ZW4gaWYgY3VycmVudCBhcmNoaXRlY3R1cmUgaXMKICAgICAgICAgICAgbm90IHg4Ni4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgc3RyCiAgICAgICAgICAgIHN1YmZvbGRlcjogJycgaWYgdGFyZ2V0IGFyY2hpdGVjdHVyZSBpcyBjdXJyZW50IGFyY2hpdGVjdHVyZSwKICAgICAgICAgICAgJ1xjdXJyZW50X3RhcmdldCcgaWYgbm90LgogICAgICAgICIiIgogICAgICAgIGN1cnJlbnQgPSAneDg2JyBpZiBmb3JjZXg4NiBlbHNlIHNlbGYuY3VycmVudF9jcHUKICAgICAgICByZXR1cm4gKAogICAgICAgICAgICAnJyBpZiBzZWxmLnRhcmdldF9jcHUgPT0gY3VycmVudCBlbHNlCiAgICAgICAgICAgIHNlbGYudGFyZ2V0X2RpcigpLnJlcGxhY2UoJ1xcJywgJ1xcJXNfJyAlIGN1cnJlbnQpCiAgICAgICAgKQoKCmNsYXNzIFJlZ2lzdHJ5SW5mbzoKICAgICIiIgogICAgTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gcmVsYXRlZCByZWdpc3RyeSBpbmZvcm1hdGlvbi4KCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICBwbGF0Zm9ybV9pbmZvOiBQbGF0Zm9ybUluZm8KICAgICAgICAiUGxhdGZvcm1JbmZvIiBpbnN0YW5jZS4KICAgICIiIgogICAgSEtFWVMgPSAod2lucmVnLkhLRVlfVVNFUlMsCiAgICAgICAgICAgICB3aW5yZWcuSEtFWV9DVVJSRU5UX1VTRVIsCiAgICAgICAgICAgICB3aW5yZWcuSEtFWV9MT0NBTF9NQUNISU5FLAogICAgICAgICAgICAgd2lucmVnLkhLRVlfQ0xBU1NFU19ST09UKQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwbGF0Zm9ybV9pbmZvKToKICAgICAgICBzZWxmLnBpID0gcGxhdGZvcm1faW5mbwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHZpc3VhbHN0dWRpbyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyByb290IHJlZ2lzdHJ5IGtleS4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgc3RyCiAgICAgICAgICAgIFJlZ2lzdHJ5IGtleQogICAgICAgICIiIgogICAgICAgIHJldHVybiAnVmlzdWFsU3R1ZGlvJwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHN4cyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBTeFMgcmVnaXN0cnkga2V5LgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBzdHIKICAgICAgICAgICAgUmVnaXN0cnkga2V5CiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIGpvaW4oc2VsZi52aXN1YWxzdHVkaW8sICdTeFMnKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHZjKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBWaXN1YWwgQysrIFZDNyByZWdpc3RyeSBrZXkuCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIHN0cgogICAgICAgICAgICBSZWdpc3RyeSBrZXkKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gam9pbihzZWxmLnN4cywgJ1ZDNycpCgogICAgQHByb3BlcnR5CiAgICBkZWYgdnMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gVlM3IHJlZ2lzdHJ5IGtleS4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgc3RyCiAgICAgICAgICAgIFJlZ2lzdHJ5IGtleQogICAgICAgICIiIgogICAgICAgIHJldHVybiBqb2luKHNlbGYuc3hzLCAnVlM3JykKCiAgICBAcHJvcGVydHkKICAgIGRlZiB2Y19mb3JfcHl0aG9uKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBWaXN1YWwgQysrIGZvciBQeXRob24gcmVnaXN0cnkga2V5LgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBzdHIKICAgICAgICAgICAgUmVnaXN0cnkga2V5CiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHInRGV2RGl2XFZDRm9yUHl0aG9uJwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIG1pY3Jvc29mdF9zZGsoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFNESyByZWdpc3RyeSBrZXkuCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIHN0cgogICAgICAgICAgICBSZWdpc3RyeSBrZXkKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gJ01pY3Jvc29mdCBTREtzJwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHdpbmRvd3Nfc2RrKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBXaW5kb3dzL1BsYXRmb3JtIFNESyByZWdpc3RyeSBrZXkuCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIHN0cgogICAgICAgICAgICBSZWdpc3RyeSBrZXkKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gam9pbihzZWxmLm1pY3Jvc29mdF9zZGssICdXaW5kb3dzJykKCiAgICBAcHJvcGVydHkKICAgIGRlZiBuZXRmeF9zZGsoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IC5ORVQgRnJhbWV3b3JrIFNESyByZWdpc3RyeSBrZXkuCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIHN0cgogICAgICAgICAgICBSZWdpc3RyeSBrZXkKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gam9pbihzZWxmLm1pY3Jvc29mdF9zZGssICdORVRGWFNESycpCgogICAgQHByb3BlcnR5CiAgICBkZWYgd2luZG93c19raXRzX3Jvb3RzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBXaW5kb3dzIEtpdHMgUm9vdHMgcmVnaXN0cnkga2V5LgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBzdHIKICAgICAgICAgICAgUmVnaXN0cnkga2V5CiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHInV2luZG93cyBLaXRzXEluc3RhbGxlZCBSb290cycKCiAgICBkZWYgbWljcm9zb2Z0KHNlbGYsIGtleSwgeDg2PUZhbHNlKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4ga2V5IGluIE1pY3Jvc29mdCBzb2Z0d2FyZSByZWdpc3RyeS4KCiAgICAgICAgUGFyYW1ldGVycwogICAgICAgIC0tLS0tLS0tLS0KICAgICAgICBrZXk6IHN0cgogICAgICAgICAgICBSZWdpc3RyeSBrZXkgcGF0aCB3aGVyZSBsb29rLgogICAgICAgIHg4Njogc3RyCiAgICAgICAgICAgIEZvcmNlIHg4NiBzb2Z0d2FyZSByZWdpc3RyeS4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgc3RyCiAgICAgICAgICAgIFJlZ2lzdHJ5IGtleQogICAgICAgICIiIgogICAgICAgIG5vZGU2NCA9ICcnIGlmIHNlbGYucGkuY3VycmVudF9pc194ODYoKSBvciB4ODYgZWxzZSAnV293NjQzMk5vZGUnCiAgICAgICAgcmV0dXJuIGpvaW4oJ1NvZnR3YXJlJywgbm9kZTY0LCAnTWljcm9zb2Z0Jywga2V5KQoKICAgIGRlZiBsb29rdXAoc2VsZiwga2V5LCBuYW1lKToKICAgICAgICAiIiIKICAgICAgICBMb29rIGZvciB2YWx1ZXMgaW4gcmVnaXN0cnkgaW4gTWljcm9zb2Z0IHNvZnR3YXJlIHJlZ2lzdHJ5LgoKICAgICAgICBQYXJhbWV0ZXJzCiAgICAgICAgLS0tLS0tLS0tLQogICAgICAgIGtleTogc3RyCiAgICAgICAgICAgIFJlZ2lzdHJ5IGtleSBwYXRoIHdoZXJlIGxvb2suCiAgICAgICAgbmFtZTogc3RyCiAgICAgICAgICAgIFZhbHVlIG5hbWUgdG8gZmluZC4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgc3RyCiAgICAgICAgICAgIHZhbHVlCiAgICAgICAgIiIiCiAgICAgICAga2V5X3JlYWQgPSB3aW5yZWcuS0VZX1JFQUQKICAgICAgICBvcGVua2V5ID0gd2lucmVnLk9wZW5LZXkKICAgICAgICBtcyA9IHNlbGYubWljcm9zb2Z0CiAgICAgICAgZm9yIGhrZXkgaW4gc2VsZi5IS0VZUzoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgYmtleSA9IG9wZW5rZXkoaGtleSwgbXMoa2V5KSwgMCwga2V5X3JlYWQpCiAgICAgICAgICAgIGV4Y2VwdCAoT1NFcnJvciwgSU9FcnJvcik6CiAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5waS5jdXJyZW50X2lzX3g4NigpOgogICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgYmtleSA9IG9wZW5rZXkoaGtleSwgbXMoa2V5LCBUcnVlKSwgMCwga2V5X3JlYWQpCiAgICAgICAgICAgICAgICAgICAgZXhjZXB0IChPU0Vycm9yLCBJT0Vycm9yKToKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcmV0dXJuIHdpbnJlZy5RdWVyeVZhbHVlRXgoYmtleSwgbmFtZSlbMF0KICAgICAgICAgICAgZXhjZXB0IChPU0Vycm9yLCBJT0Vycm9yKToKICAgICAgICAgICAgICAgIHBhc3MKCgpjbGFzcyBTeXN0ZW1JbmZvOgogICAgIiIiCiAgICBNaWNyb3NvZnQgV2luZG93cyBhbmQgVmlzdWFsIFN0dWRpbyByZWxhdGVkIHN5c3RlbSBpbmZvcm1hdGlvbi4KCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICByZWdpc3RyeV9pbmZvOiBSZWdpc3RyeUluZm8KICAgICAgICAiUmVnaXN0cnlJbmZvIiBpbnN0YW5jZS4KICAgIHZjX3ZlcjogZmxvYXQKICAgICAgICBSZXF1aXJlZCBNaWNyb3NvZnQgVmlzdWFsIEMrKyB2ZXJzaW9uLgogICAgIiIiCgogICAgIyBWYXJpYWJsZXMgYW5kIHByb3BlcnRpZXMgaW4gdGhpcyBjbGFzcyB1c2Ugb3JpZ2luYWxzIENhbWVsQ2FzZSB2YXJpYWJsZXMKICAgICMgbmFtZXMgZnJvbSBNaWNyb3NvZnQgc291cmNlIGZpbGVzIGZvciBtb3JlIGVhc3kgY29tcGFyaXNvbi4KICAgIFdpbkRpciA9IGVudmlyb24uZ2V0KCdXaW5EaXInLCAnJykKICAgIFByb2dyYW1GaWxlcyA9IGVudmlyb24uZ2V0KCdQcm9ncmFtRmlsZXMnLCAnJykKICAgIFByb2dyYW1GaWxlc3g4NiA9IGVudmlyb24uZ2V0KCdQcm9ncmFtRmlsZXMoeDg2KScsIFByb2dyYW1GaWxlcykKCiAgICBkZWYgX19pbml0X18oc2VsZiwgcmVnaXN0cnlfaW5mbywgdmNfdmVyPU5vbmUpOgogICAgICAgIHNlbGYucmkgPSByZWdpc3RyeV9pbmZvCiAgICAgICAgc2VsZi5waSA9IHNlbGYucmkucGkKCiAgICAgICAgc2VsZi5rbm93bl92c19wYXRocyA9IHNlbGYuZmluZF9wcm9ncmFtZGF0YV92c192ZXJzKCkKCiAgICAgICAgIyBFeGNlcHQgZm9yIFZTMTUrLCBWQyB2ZXJzaW9uIGlzIGFsaWduZWQgd2l0aCBWUyB2ZXJzaW9uCiAgICAgICAgc2VsZi52c192ZXIgPSBzZWxmLnZjX3ZlciA9ICgKICAgICAgICAgICAgICAgIHZjX3ZlciBvciBzZWxmLl9maW5kX2xhdGVzdF9hdmFpbGFibGVfdnNfdmVyKCkpCgogICAgZGVmIF9maW5kX2xhdGVzdF9hdmFpbGFibGVfdnNfdmVyKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIEZpbmQgdGhlIGxhdGVzdCBWQyB2ZXJzaW9uCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIGZsb2F0CiAgICAgICAgICAgIHZlcnNpb24KICAgICAgICAiIiIKICAgICAgICByZWdfdmNfdmVycyA9IHNlbGYuZmluZF9yZWdfdnNfdmVycygpCgogICAgICAgIGlmIG5vdCAocmVnX3ZjX3ZlcnMgb3Igc2VsZi5rbm93bl92c19wYXRocyk6CiAgICAgICAgICAgIHJhaXNlIGRpc3R1dGlscy5lcnJvcnMuRGlzdHV0aWxzUGxhdGZvcm1FcnJvcigKICAgICAgICAgICAgICAgICdObyBNaWNyb3NvZnQgVmlzdWFsIEMrKyB2ZXJzaW9uIGZvdW5kJykKCiAgICAgICAgdmNfdmVycyA9IHNldChyZWdfdmNfdmVycykKICAgICAgICB2Y192ZXJzLnVwZGF0ZShzZWxmLmtub3duX3ZzX3BhdGhzKQogICAgICAgIHJldHVybiBzb3J0ZWQodmNfdmVycylbLTFdCgogICAgZGVmIGZpbmRfcmVnX3ZzX3ZlcnMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgRmluZCBNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyB2ZXJzaW9ucyBhdmFpbGFibGUgaW4gcmVnaXN0cnkuCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIGxpc3Qgb2YgZmxvYXQKICAgICAgICAgICAgVmVyc2lvbnMKICAgICAgICAiIiIKICAgICAgICBtcyA9IHNlbGYucmkubWljcm9zb2Z0CiAgICAgICAgdmNrZXlzID0gKHNlbGYucmkudmMsIHNlbGYucmkudmNfZm9yX3B5dGhvbiwgc2VsZi5yaS52cykKICAgICAgICB2c192ZXJzID0gW10KICAgICAgICBmb3IgaGtleSBpbiBzZWxmLnJpLkhLRVlTOgogICAgICAgICAgICBmb3Iga2V5IGluIHZja2V5czoKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBia2V5ID0gd2lucmVnLk9wZW5LZXkoaGtleSwgbXMoa2V5KSwgMCwgd2lucmVnLktFWV9SRUFEKQogICAgICAgICAgICAgICAgZXhjZXB0IChPU0Vycm9yLCBJT0Vycm9yKToKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgc3Via2V5cywgdmFsdWVzLCBfID0gd2lucmVnLlF1ZXJ5SW5mb0tleShia2V5KQogICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UodmFsdWVzKToKICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgIHZlciA9IGZsb2F0KHdpbnJlZy5FbnVtVmFsdWUoYmtleSwgaSlbMF0pCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHZlciBub3QgaW4gdnNfdmVyczoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZzX3ZlcnMuYXBwZW5kKHZlcikKICAgICAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2Uoc3Via2V5cyk6CiAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICB2ZXIgPSBmbG9hdCh3aW5yZWcuRW51bUtleShia2V5LCBpKSkKICAgICAgICAgICAgICAgICAgICAgICAgaWYgdmVyIG5vdCBpbiB2c192ZXJzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdnNfdmVycy5hcHBlbmQodmVyKQogICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgcmV0dXJuIHNvcnRlZCh2c192ZXJzKQoKICAgIGRlZiBmaW5kX3Byb2dyYW1kYXRhX3ZzX3ZlcnMoc2VsZik6CiAgICAgICAgciIiIgogICAgICAgIEZpbmQgVmlzdWFsIHN0dWRpbyAyMDE3KyB2ZXJzaW9ucyBmcm9tIGluZm9ybWF0aW9uIGluCiAgICAgICAgIkM6XFByb2dyYW1EYXRhXE1pY3Jvc29mdFxWaXN1YWxTdHVkaW9cUGFja2FnZXNcX0luc3RhbmNlcyIuCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIGRpY3QKICAgICAgICAgICAgZmxvYXQgdmVyc2lvbiBhcyBrZXksIHBhdGggYXMgdmFsdWUuCiAgICAgICAgIiIiCiAgICAgICAgdnNfdmVyc2lvbnMgPSB7fQogICAgICAgIGluc3RhbmNlc19kaXIgPSBcCiAgICAgICAgICAgIHInQzpcUHJvZ3JhbURhdGFcTWljcm9zb2Z0XFZpc3VhbFN0dWRpb1xQYWNrYWdlc1xfSW5zdGFuY2VzJwoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGhhc2hlZF9uYW1lcyA9IGxpc3RkaXIoaW5zdGFuY2VzX2RpcikKCiAgICAgICAgZXhjZXB0IChPU0Vycm9yLCBJT0Vycm9yKToKICAgICAgICAgICAgIyBEaXJlY3Rvcnkgbm90IGV4aXN0cyB3aXRoIGFsbCBWaXN1YWwgU3R1ZGlvIHZlcnNpb25zCiAgICAgICAgICAgIHJldHVybiB2c192ZXJzaW9ucwoKICAgICAgICBmb3IgbmFtZSBpbiBoYXNoZWRfbmFtZXM6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICMgR2V0IFZTIGluc3RhbGxhdGlvbiBwYXRoIGZyb20gInN0YXRlLmpzb24iIGZpbGUKICAgICAgICAgICAgICAgIHN0YXRlX3BhdGggPSBqb2luKGluc3RhbmNlc19kaXIsIG5hbWUsICdzdGF0ZS5qc29uJykKICAgICAgICAgICAgICAgIHdpdGggb3BlbihzdGF0ZV9wYXRoLCAncnQnLCBlbmNvZGluZz0ndXRmLTgnKSBhcyBzdGF0ZV9maWxlOgogICAgICAgICAgICAgICAgICAgIHN0YXRlID0ganNvbi5sb2FkKHN0YXRlX2ZpbGUpCiAgICAgICAgICAgICAgICB2c19wYXRoID0gc3RhdGVbJ2luc3RhbGxhdGlvblBhdGgnXQoKICAgICAgICAgICAgICAgICMgUmFpc2VzIE9TRXJyb3IgaWYgdGhpcyBWUyBpbnN0YWxsYXRpb24gZG9lcyBub3QgY29udGFpbiBWQwogICAgICAgICAgICAgICAgbGlzdGRpcihqb2luKHZzX3BhdGgsIHInVkNcVG9vbHNcTVNWQycpKQoKICAgICAgICAgICAgICAgICMgU3RvcmUgdmVyc2lvbiBhbmQgcGF0aAogICAgICAgICAgICAgICAgdnNfdmVyc2lvbnNbc2VsZi5fYXNfZmxvYXRfdmVyc2lvbigKICAgICAgICAgICAgICAgICAgICBzdGF0ZVsnaW5zdGFsbGF0aW9uVmVyc2lvbiddKV0gPSB2c19wYXRoCgogICAgICAgICAgICBleGNlcHQgKE9TRXJyb3IsIElPRXJyb3IsIEtleUVycm9yKToKICAgICAgICAgICAgICAgICMgU2tpcCBpZiAic3RhdGUuanNvbiIgZmlsZSBpcyBtaXNzaW5nIG9yIGJhZCBmb3JtYXQKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgIHJldHVybiB2c192ZXJzaW9ucwoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfYXNfZmxvYXRfdmVyc2lvbih2ZXJzaW9uKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gYSBzdHJpbmcgdmVyc2lvbiBhcyBhIHNpbXBsaWZpZWQgZmxvYXQgdmVyc2lvbiAobWFqb3IubWlub3IpCgogICAgICAgIFBhcmFtZXRlcnMKICAgICAgICAtLS0tLS0tLS0tCiAgICAgICAgdmVyc2lvbjogc3RyCiAgICAgICAgICAgIFZlcnNpb24uCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIGZsb2F0CiAgICAgICAgICAgIHZlcnNpb24KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gZmxvYXQoJy4nLmpvaW4odmVyc2lvbi5zcGxpdCgnLicpWzoyXSkpCgogICAgQHByb3BlcnR5CiAgICBkZWYgVlNJbnN0YWxsRGlyKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIGRpcmVjdG9yeS4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgc3RyCiAgICAgICAgICAgIHBhdGgKICAgICAgICAiIiIKICAgICAgICAjIERlZmF1bHQgcGF0aAogICAgICAgIGRlZmF1bHQgPSBqb2luKHNlbGYuUHJvZ3JhbUZpbGVzeDg2LAogICAgICAgICAgICAgICAgICAgICAgICdNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyAlMC4xZicgJSBzZWxmLnZzX3ZlcikKCiAgICAgICAgIyBUcnkgdG8gZ2V0IHBhdGggZnJvbSByZWdpc3RyeSwgaWYgZmFpbCB1c2UgZGVmYXVsdCBwYXRoCiAgICAgICAgcmV0dXJuIHNlbGYucmkubG9va3VwKHNlbGYucmkudnMsICclMC4xZicgJSBzZWxmLnZzX3Zlcikgb3IgZGVmYXVsdAoKICAgIEBwcm9wZXJ0eQogICAgZGVmIFZDSW5zdGFsbERpcihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgVmlzdWFsIEMrKyBkaXJlY3RvcnkuCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIHN0cgogICAgICAgICAgICBwYXRoCiAgICAgICAgIiIiCiAgICAgICAgcGF0aCA9IHNlbGYuX2d1ZXNzX3ZjKCkgb3Igc2VsZi5fZ3Vlc3NfdmNfbGVnYWN5KCkKCiAgICAgICAgaWYgbm90IGlzZGlyKHBhdGgpOgogICAgICAgICAgICBtc2cgPSAnTWljcm9zb2Z0IFZpc3VhbCBDKysgZGlyZWN0b3J5IG5vdCBmb3VuZCcKICAgICAgICAgICAgcmFpc2UgZGlzdHV0aWxzLmVycm9ycy5EaXN0dXRpbHNQbGF0Zm9ybUVycm9yKG1zZykKCiAgICAgICAgcmV0dXJuIHBhdGgKCiAgICBkZWYgX2d1ZXNzX3ZjKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIExvY2F0ZSBWaXN1YWwgQysrIGZvciBWUzIwMTcrLgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBzdHIKICAgICAgICAgICAgcGF0aAogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYudnNfdmVyIDw9IDE0LjA6CiAgICAgICAgICAgIHJldHVybiAnJwoKICAgICAgICB0cnk6CiAgICAgICAgICAgICMgRmlyc3Qgc2VhcmNoIGluIGtub3duIFZTIHBhdGhzCiAgICAgICAgICAgIHZzX2RpciA9IHNlbGYua25vd25fdnNfcGF0aHNbc2VsZi52c192ZXJdCiAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICAjIEVsc2UsIHNlYXJjaCB3aXRoIHBhdGggZnJvbSByZWdpc3RyeQogICAgICAgICAgICB2c19kaXIgPSBzZWxmLlZTSW5zdGFsbERpcgoKICAgICAgICBndWVzc192YyA9IGpvaW4odnNfZGlyLCByJ1ZDXFRvb2xzXE1TVkMnKQoKICAgICAgICAjIFN1YmRpciB3aXRoIFZDIGV4YWN0IHZlcnNpb24gYXMgbmFtZQogICAgICAgIHRyeToKICAgICAgICAgICAgIyBVcGRhdGUgdGhlIFZDIHZlcnNpb24gd2l0aCByZWFsIG9uZSBpbnN0ZWFkIG9mIFZTIHZlcnNpb24KICAgICAgICAgICAgdmNfdmVyID0gbGlzdGRpcihndWVzc192YylbLTFdCiAgICAgICAgICAgIHNlbGYudmNfdmVyID0gc2VsZi5fYXNfZmxvYXRfdmVyc2lvbih2Y192ZXIpCiAgICAgICAgICAgIHJldHVybiBqb2luKGd1ZXNzX3ZjLCB2Y192ZXIpCiAgICAgICAgZXhjZXB0IChPU0Vycm9yLCBJT0Vycm9yLCBJbmRleEVycm9yKToKICAgICAgICAgICAgcmV0dXJuICcnCgogICAgZGVmIF9ndWVzc192Y19sZWdhY3koc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTG9jYXRlIFZpc3VhbCBDKysgZm9yIHZlcnNpb25zIHByaW9yIHRvIDIwMTcuCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIHN0cgogICAgICAgICAgICBwYXRoCiAgICAgICAgIiIiCiAgICAgICAgZGVmYXVsdCA9IGpvaW4oc2VsZi5Qcm9ncmFtRmlsZXN4ODYsCiAgICAgICAgICAgICAgICAgICAgICAgcidNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyAlMC4xZlxWQycgJSBzZWxmLnZzX3ZlcikKCiAgICAgICAgIyBUcnkgdG8gZ2V0ICJWQysrIGZvciBQeXRob24iIHBhdGggZnJvbSByZWdpc3RyeSBhcyBkZWZhdWx0IHBhdGgKICAgICAgICByZWdfcGF0aCA9IGpvaW4oc2VsZi5yaS52Y19mb3JfcHl0aG9uLCAnJTAuMWYnICUgc2VsZi52c192ZXIpCiAgICAgICAgcHl0aG9uX3ZjID0gc2VsZi5yaS5sb29rdXAocmVnX3BhdGgsICdpbnN0YWxsZGlyJykKICAgICAgICBkZWZhdWx0X3ZjID0gam9pbihweXRob25fdmMsICdWQycpIGlmIHB5dGhvbl92YyBlbHNlIGRlZmF1bHQKCiAgICAgICAgIyBUcnkgdG8gZ2V0IHBhdGggZnJvbSByZWdpc3RyeSwgaWYgZmFpbCB1c2UgZGVmYXVsdCBwYXRoCiAgICAgICAgcmV0dXJuIHNlbGYucmkubG9va3VwKHNlbGYucmkudmMsICclMC4xZicgJSBzZWxmLnZzX3Zlcikgb3IgZGVmYXVsdF92YwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIFdpbmRvd3NTZGtWZXJzaW9uKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBXaW5kb3dzIFNESyB2ZXJzaW9ucyBmb3Igc3BlY2lmaWVkIE1TVkMrKyB2ZXJzaW9uLgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICB0dXBsZSBvZiBzdHIKICAgICAgICAgICAgdmVyc2lvbnMKICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLnZzX3ZlciA8PSA5LjA6CiAgICAgICAgICAgIHJldHVybiAnNy4wJywgJzYuMScsICc2LjBhJwogICAgICAgIGVsaWYgc2VsZi52c192ZXIgPT0gMTAuMDoKICAgICAgICAgICAgcmV0dXJuICc3LjEnLCAnNy4wYScKICAgICAgICBlbGlmIHNlbGYudnNfdmVyID09IDExLjA6CiAgICAgICAgICAgIHJldHVybiAnOC4wJywgJzguMGEnCiAgICAgICAgZWxpZiBzZWxmLnZzX3ZlciA9PSAxMi4wOgogICAgICAgICAgICByZXR1cm4gJzguMScsICc4LjFhJwogICAgICAgIGVsaWYgc2VsZi52c192ZXIgPj0gMTQuMDoKICAgICAgICAgICAgcmV0dXJuICcxMC4wJywgJzguMScKCiAgICBAcHJvcGVydHkKICAgIGRlZiBXaW5kb3dzU2RrTGFzdFZlcnNpb24oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFdpbmRvd3MgU0RLIGxhc3QgdmVyc2lvbi4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgc3RyCiAgICAgICAgICAgIHZlcnNpb24KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZi5fdXNlX2xhc3RfZGlyX25hbWUoam9pbihzZWxmLldpbmRvd3NTZGtEaXIsICdsaWInKSkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBXaW5kb3dzU2RrRGlyKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBXaW5kb3dzIFNESyBkaXJlY3RvcnkuCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIHN0cgogICAgICAgICAgICBwYXRoCiAgICAgICAgIiIiCiAgICAgICAgc2RrZGlyID0gJycKICAgICAgICBmb3IgdmVyIGluIHNlbGYuV2luZG93c1Nka1ZlcnNpb246CiAgICAgICAgICAgICMgVHJ5IHRvIGdldCBpdCBmcm9tIHJlZ2lzdHJ5CiAgICAgICAgICAgIGxvYyA9IGpvaW4oc2VsZi5yaS53aW5kb3dzX3NkaywgJ3YlcycgJSB2ZXIpCiAgICAgICAgICAgIHNka2RpciA9IHNlbGYucmkubG9va3VwKGxvYywgJ2luc3RhbGxhdGlvbmZvbGRlcicpCiAgICAgICAgICAgIGlmIHNka2RpcjoKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgaWYgbm90IHNka2RpciBvciBub3QgaXNkaXIoc2RrZGlyKToKICAgICAgICAgICAgIyBUcnkgdG8gZ2V0ICJWQysrIGZvciBQeXRob24iIHZlcnNpb24gZnJvbSByZWdpc3RyeQogICAgICAgICAgICBwYXRoID0gam9pbihzZWxmLnJpLnZjX2Zvcl9weXRob24sICclMC4xZicgJSBzZWxmLnZjX3ZlcikKICAgICAgICAgICAgaW5zdGFsbF9iYXNlID0gc2VsZi5yaS5sb29rdXAocGF0aCwgJ2luc3RhbGxkaXInKQogICAgICAgICAgICBpZiBpbnN0YWxsX2Jhc2U6CiAgICAgICAgICAgICAgICBzZGtkaXIgPSBqb2luKGluc3RhbGxfYmFzZSwgJ1dpblNESycpCiAgICAgICAgaWYgbm90IHNka2RpciBvciBub3QgaXNkaXIoc2RrZGlyKToKICAgICAgICAgICAgIyBJZiBmYWlsLCB1c2UgZGVmYXVsdCBuZXcgcGF0aAogICAgICAgICAgICBmb3IgdmVyIGluIHNlbGYuV2luZG93c1Nka1ZlcnNpb246CiAgICAgICAgICAgICAgICBpbnR2ZXIgPSB2ZXJbOnZlci5yZmluZCgnLicpXQogICAgICAgICAgICAgICAgcGF0aCA9IHInTWljcm9zb2Z0IFNES3NcV2luZG93cyBLaXRzXCVzJyAlIGludHZlcgogICAgICAgICAgICAgICAgZCA9IGpvaW4oc2VsZi5Qcm9ncmFtRmlsZXMsIHBhdGgpCiAgICAgICAgICAgICAgICBpZiBpc2RpcihkKToKICAgICAgICAgICAgICAgICAgICBzZGtkaXIgPSBkCiAgICAgICAgaWYgbm90IHNka2RpciBvciBub3QgaXNkaXIoc2RrZGlyKToKICAgICAgICAgICAgIyBJZiBmYWlsLCB1c2UgZGVmYXVsdCBvbGQgcGF0aAogICAgICAgICAgICBmb3IgdmVyIGluIHNlbGYuV2luZG93c1Nka1ZlcnNpb246CiAgICAgICAgICAgICAgICBwYXRoID0gcidNaWNyb3NvZnQgU0RLc1xXaW5kb3dzXHYlcycgJSB2ZXIKICAgICAgICAgICAgICAgIGQgPSBqb2luKHNlbGYuUHJvZ3JhbUZpbGVzLCBwYXRoKQogICAgICAgICAgICAgICAgaWYgaXNkaXIoZCk6CiAgICAgICAgICAgICAgICAgICAgc2RrZGlyID0gZAogICAgICAgIGlmIG5vdCBzZGtkaXI6CiAgICAgICAgICAgICMgSWYgZmFpbCwgdXNlIFBsYXRmb3JtIFNESwogICAgICAgICAgICBzZGtkaXIgPSBqb2luKHNlbGYuVkNJbnN0YWxsRGlyLCAnUGxhdGZvcm1TREsnKQogICAgICAgIHJldHVybiBzZGtkaXIKCiAgICBAcHJvcGVydHkKICAgIGRlZiBXaW5kb3dzU0RLRXhlY3V0YWJsZVBhdGgoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFdpbmRvd3MgU0RLIGV4ZWN1dGFibGUgZGlyZWN0b3J5LgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBzdHIKICAgICAgICAgICAgcGF0aAogICAgICAgICIiIgogICAgICAgICMgRmluZCBXaW5TREsgTmV0RnggVG9vbHMgcmVnaXN0cnkgZGlyIG5hbWUKICAgICAgICBpZiBzZWxmLnZzX3ZlciA8PSAxMS4wOgogICAgICAgICAgICBuZXRmeHZlciA9IDM1CiAgICAgICAgICAgIGFyY2ggPSAnJwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG5ldGZ4dmVyID0gNDAKICAgICAgICAgICAgaGlkZXg4NiA9IFRydWUgaWYgc2VsZi52c192ZXIgPD0gMTIuMCBlbHNlIEZhbHNlCiAgICAgICAgICAgIGFyY2ggPSBzZWxmLnBpLmN1cnJlbnRfZGlyKHg2ND1UcnVlLCBoaWRleDg2PWhpZGV4ODYpCiAgICAgICAgZnggPSAnV2luU0RLLU5ldEZ4JWRUb29scyVzJyAlIChuZXRmeHZlciwgYXJjaC5yZXBsYWNlKCdcXCcsICctJykpCgogICAgICAgICMgbGlzdCBhbGwgcG9zc2libGVzIHJlZ2lzdHJ5IHBhdGhzCiAgICAgICAgcmVncGF0aHMgPSBbXQogICAgICAgIGlmIHNlbGYudnNfdmVyID49IDE0LjA6CiAgICAgICAgICAgIGZvciB2ZXIgaW4gc2VsZi5OZXRGeFNka1ZlcnNpb246CiAgICAgICAgICAgICAgICByZWdwYXRocyArPSBbam9pbihzZWxmLnJpLm5ldGZ4X3NkaywgdmVyLCBmeCldCgogICAgICAgIGZvciB2ZXIgaW4gc2VsZi5XaW5kb3dzU2RrVmVyc2lvbjoKICAgICAgICAgICAgcmVncGF0aHMgKz0gW2pvaW4oc2VsZi5yaS53aW5kb3dzX3NkaywgJ3Ylc0EnICUgdmVyLCBmeCldCgogICAgICAgICMgUmV0dXJuIGluc3RhbGxhdGlvbiBmb2xkZXIgZnJvbSB0aGUgbW9yZSByZWNlbnQgcGF0aAogICAgICAgIGZvciBwYXRoIGluIHJlZ3BhdGhzOgogICAgICAgICAgICBleGVjcGF0aCA9IHNlbGYucmkubG9va3VwKHBhdGgsICdpbnN0YWxsYXRpb25mb2xkZXInKQogICAgICAgICAgICBpZiBleGVjcGF0aDoKICAgICAgICAgICAgICAgIHJldHVybiBleGVjcGF0aAoKICAgIEBwcm9wZXJ0eQogICAgZGVmIEZTaGFycEluc3RhbGxEaXIoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFZpc3VhbCBGIyBkaXJlY3RvcnkuCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIHN0cgogICAgICAgICAgICBwYXRoCiAgICAgICAgIiIiCiAgICAgICAgcGF0aCA9IGpvaW4oc2VsZi5yaS52aXN1YWxzdHVkaW8sIHInJTAuMWZcU2V0dXBcRiMnICUgc2VsZi52c192ZXIpCiAgICAgICAgcmV0dXJuIHNlbGYucmkubG9va3VwKHBhdGgsICdwcm9kdWN0ZGlyJykgb3IgJycKCiAgICBAcHJvcGVydHkKICAgIGRlZiBVbml2ZXJzYWxDUlRTZGtEaXIoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFVuaXZlcnNhbCBDUlQgU0RLIGRpcmVjdG9yeS4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgc3RyCiAgICAgICAgICAgIHBhdGgKICAgICAgICAiIiIKICAgICAgICAjIFNldCBLaXQgUm9vdHMgdmVyc2lvbnMgZm9yIHNwZWNpZmllZCBNU1ZDKysgdmVyc2lvbgogICAgICAgIHZlcnMgPSAoJzEwJywgJzgxJykgaWYgc2VsZi52c192ZXIgPj0gMTQuMCBlbHNlICgpCgogICAgICAgICMgRmluZCBwYXRoIG9mIHRoZSBtb3JlIHJlY2VudCBLaXQKICAgICAgICBmb3IgdmVyIGluIHZlcnM6CiAgICAgICAgICAgIHNka2RpciA9IHNlbGYucmkubG9va3VwKHNlbGYucmkud2luZG93c19raXRzX3Jvb3RzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAna2l0c3Jvb3QlcycgJSB2ZXIpCiAgICAgICAgICAgIGlmIHNka2RpcjoKICAgICAgICAgICAgICAgIHJldHVybiBzZGtkaXIgb3IgJycKCiAgICBAcHJvcGVydHkKICAgIGRlZiBVbml2ZXJzYWxDUlRTZGtMYXN0VmVyc2lvbihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgVW5pdmVyc2FsIEMgUnVudGltZSBTREsgbGFzdCB2ZXJzaW9uLgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBzdHIKICAgICAgICAgICAgdmVyc2lvbgogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmLl91c2VfbGFzdF9kaXJfbmFtZShqb2luKHNlbGYuVW5pdmVyc2FsQ1JUU2RrRGlyLCAnbGliJykpCgogICAgQHByb3BlcnR5CiAgICBkZWYgTmV0RnhTZGtWZXJzaW9uKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCAuTkVUIEZyYW1ld29yayBTREsgdmVyc2lvbnMuCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIHR1cGxlIG9mIHN0cgogICAgICAgICAgICB2ZXJzaW9ucwogICAgICAgICIiIgogICAgICAgICMgU2V0IEZ4U2RrIHZlcnNpb25zIGZvciBzcGVjaWZpZWQgVlMgdmVyc2lvbgogICAgICAgIHJldHVybiAoKCc0LjcuMicsICc0LjcuMScsICc0LjcnLAogICAgICAgICAgICAgICAgICc0LjYuMicsICc0LjYuMScsICc0LjYnLAogICAgICAgICAgICAgICAgICc0LjUuMicsICc0LjUuMScsICc0LjUnKQogICAgICAgICAgICAgICAgaWYgc2VsZi52c192ZXIgPj0gMTQuMCBlbHNlICgpKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIE5ldEZ4U2RrRGlyKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCAuTkVUIEZyYW1ld29yayBTREsgZGlyZWN0b3J5LgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBzdHIKICAgICAgICAgICAgcGF0aAogICAgICAgICIiIgogICAgICAgIHNka2RpciA9ICcnCiAgICAgICAgZm9yIHZlciBpbiBzZWxmLk5ldEZ4U2RrVmVyc2lvbjoKICAgICAgICAgICAgbG9jID0gam9pbihzZWxmLnJpLm5ldGZ4X3NkaywgdmVyKQogICAgICAgICAgICBzZGtkaXIgPSBzZWxmLnJpLmxvb2t1cChsb2MsICdraXRzaW5zdGFsbGF0aW9uZm9sZGVyJykKICAgICAgICAgICAgaWYgc2RrZGlyOgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICByZXR1cm4gc2RrZGlyCgogICAgQHByb3BlcnR5CiAgICBkZWYgRnJhbWV3b3JrRGlyMzIoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IC5ORVQgRnJhbWV3b3JrIDMyYml0IGRpcmVjdG9yeS4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgc3RyCiAgICAgICAgICAgIHBhdGgKICAgICAgICAiIiIKICAgICAgICAjIERlZmF1bHQgcGF0aAogICAgICAgIGd1ZXNzX2Z3ID0gam9pbihzZWxmLldpbkRpciwgcidNaWNyb3NvZnQuTkVUXEZyYW1ld29yaycpCgogICAgICAgICMgVHJ5IHRvIGdldCBwYXRoIGZyb20gcmVnaXN0cnksIGlmIGZhaWwgdXNlIGRlZmF1bHQgcGF0aAogICAgICAgIHJldHVybiBzZWxmLnJpLmxvb2t1cChzZWxmLnJpLnZjLCAnZnJhbWV3b3JrZGlyMzInKSBvciBndWVzc19mdwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIEZyYW1ld29ya0RpcjY0KHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCAuTkVUIEZyYW1ld29yayA2NGJpdCBkaXJlY3RvcnkuCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIHN0cgogICAgICAgICAgICBwYXRoCiAgICAgICAgIiIiCiAgICAgICAgIyBEZWZhdWx0IHBhdGgKICAgICAgICBndWVzc19mdyA9IGpvaW4oc2VsZi5XaW5EaXIsIHInTWljcm9zb2Z0Lk5FVFxGcmFtZXdvcms2NCcpCgogICAgICAgICMgVHJ5IHRvIGdldCBwYXRoIGZyb20gcmVnaXN0cnksIGlmIGZhaWwgdXNlIGRlZmF1bHQgcGF0aAogICAgICAgIHJldHVybiBzZWxmLnJpLmxvb2t1cChzZWxmLnJpLnZjLCAnZnJhbWV3b3JrZGlyNjQnKSBvciBndWVzc19mdwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIEZyYW1ld29ya1ZlcnNpb24zMihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgLk5FVCBGcmFtZXdvcmsgMzJiaXQgdmVyc2lvbnMuCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIHR1cGxlIG9mIHN0cgogICAgICAgICAgICB2ZXJzaW9ucwogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmLl9maW5kX2RvdF9uZXRfdmVyc2lvbnMoMzIpCgogICAgQHByb3BlcnR5CiAgICBkZWYgRnJhbWV3b3JrVmVyc2lvbjY0KHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCAuTkVUIEZyYW1ld29yayA2NGJpdCB2ZXJzaW9ucy4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgdHVwbGUgb2Ygc3RyCiAgICAgICAgICAgIHZlcnNpb25zCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuX2ZpbmRfZG90X25ldF92ZXJzaW9ucyg2NCkKCiAgICBkZWYgX2ZpbmRfZG90X25ldF92ZXJzaW9ucyhzZWxmLCBiaXRzKToKICAgICAgICAiIiIKICAgICAgICBGaW5kIE1pY3Jvc29mdCAuTkVUIEZyYW1ld29yayB2ZXJzaW9ucy4KCiAgICAgICAgUGFyYW1ldGVycwogICAgICAgIC0tLS0tLS0tLS0KICAgICAgICBiaXRzOiBpbnQKICAgICAgICAgICAgUGxhdGZvcm0gbnVtYmVyIG9mIGJpdHM6IDMyIG9yIDY0LgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICB0dXBsZSBvZiBzdHIKICAgICAgICAgICAgdmVyc2lvbnMKICAgICAgICAiIiIKICAgICAgICAjIEZpbmQgYWN0dWFsIC5ORVQgdmVyc2lvbiBpbiByZWdpc3RyeQogICAgICAgIHJlZ192ZXIgPSBzZWxmLnJpLmxvb2t1cChzZWxmLnJpLnZjLCAnZnJhbWV3b3JrdmVyJWQnICUgYml0cykKICAgICAgICBkb3RfbmV0X2RpciA9IGdldGF0dHIoc2VsZiwgJ0ZyYW1ld29ya0RpciVkJyAlIGJpdHMpCiAgICAgICAgdmVyID0gcmVnX3ZlciBvciBzZWxmLl91c2VfbGFzdF9kaXJfbmFtZShkb3RfbmV0X2RpciwgJ3YnKSBvciAnJwoKICAgICAgICAjIFNldCAuTkVUIHZlcnNpb25zIGZvciBzcGVjaWZpZWQgTVNWQysrIHZlcnNpb24KICAgICAgICBpZiBzZWxmLnZzX3ZlciA+PSAxMi4wOgogICAgICAgICAgICByZXR1cm4gdmVyLCAndjQuMCcKICAgICAgICBlbGlmIHNlbGYudnNfdmVyID49IDEwLjA6CiAgICAgICAgICAgIHJldHVybiAndjQuMC4zMDMxOScgaWYgdmVyLmxvd2VyKClbOjJdICE9ICd2NCcgZWxzZSB2ZXIsICd2My41JwogICAgICAgIGVsaWYgc2VsZi52c192ZXIgPT0gOS4wOgogICAgICAgICAgICByZXR1cm4gJ3YzLjUnLCAndjIuMC41MDcyNycKICAgICAgICBlbGlmIHNlbGYudnNfdmVyID09IDguMDoKICAgICAgICAgICAgcmV0dXJuICd2My4wJywgJ3YyLjAuNTA3MjcnCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF91c2VfbGFzdF9kaXJfbmFtZShwYXRoLCBwcmVmaXg9JycpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBuYW1lIG9mIHRoZSBsYXN0IGRpciBpbiBwYXRoIG9yICcnIGlmIG5vIGRpciBmb3VuZC4KCiAgICAgICAgUGFyYW1ldGVycwogICAgICAgIC0tLS0tLS0tLS0KICAgICAgICBwYXRoOiBzdHIKICAgICAgICAgICAgVXNlIGRpcnMgaW4gdGhpcyBwYXRoCiAgICAgICAgcHJlZml4OiBzdHIKICAgICAgICAgICAgVXNlIG9ubHkgZGlycyBzdGFydGluZyBieSB0aGlzIHByZWZpeAoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBzdHIKICAgICAgICAgICAgbmFtZQogICAgICAgICIiIgogICAgICAgIG1hdGNoaW5nX2RpcnMgPSAoCiAgICAgICAgICAgIGRpcl9uYW1lCiAgICAgICAgICAgIGZvciBkaXJfbmFtZSBpbiByZXZlcnNlZChsaXN0ZGlyKHBhdGgpKQogICAgICAgICAgICBpZiBpc2Rpcihqb2luKHBhdGgsIGRpcl9uYW1lKSkgYW5kCiAgICAgICAgICAgIGRpcl9uYW1lLnN0YXJ0c3dpdGgocHJlZml4KQogICAgICAgICkKICAgICAgICByZXR1cm4gbmV4dChtYXRjaGluZ19kaXJzLCBOb25lKSBvciAnJwoKCmNsYXNzIEVudmlyb25tZW50SW5mbzoKICAgICIiIgogICAgUmV0dXJuIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3Igc3BlY2lmaWVkIE1pY3Jvc29mdCBWaXN1YWwgQysrIHZlcnNpb24KICAgIGFuZCBwbGF0Zm9ybSA6IExpYiwgSW5jbHVkZSwgUGF0aCBhbmQgbGlicGF0aC4KCiAgICBUaGlzIGZ1bmN0aW9uIGlzIGNvbXBhdGlibGUgd2l0aCBNaWNyb3NvZnQgVmlzdWFsIEMrKyA5LjAgdG8gMTQuWC4KCiAgICBTY3JpcHQgY3JlYXRlZCBieSBhbmFseXNpbmcgTWljcm9zb2Z0IGVudmlyb25tZW50IGNvbmZpZ3VyYXRpb24gZmlsZXMgbGlrZQogICAgInZjdmFyc1suLi5dLmJhdCIsICJTZXRFbnYuQ21kIiwgInZjYnVpbGR0b29scy5iYXQiLCAuLi4KCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICBhcmNoOiBzdHIKICAgICAgICBUYXJnZXQgYXJjaGl0ZWN0dXJlLgogICAgdmNfdmVyOiBmbG9hdAogICAgICAgIFJlcXVpcmVkIE1pY3Jvc29mdCBWaXN1YWwgQysrIHZlcnNpb24uIElmIG5vdCBzZXQsIGF1dG9kZXRlY3QgdGhlIGxhc3QKICAgICAgICB2ZXJzaW9uLgogICAgdmNfbWluX3ZlcjogZmxvYXQKICAgICAgICBNaW5pbXVtIE1pY3Jvc29mdCBWaXN1YWwgQysrIHZlcnNpb24uCiAgICAiIiIKCiAgICAjIFZhcmlhYmxlcyBhbmQgcHJvcGVydGllcyBpbiB0aGlzIGNsYXNzIHVzZSBvcmlnaW5hbHMgQ2FtZWxDYXNlIHZhcmlhYmxlcwogICAgIyBuYW1lcyBmcm9tIE1pY3Jvc29mdCBzb3VyY2UgZmlsZXMgZm9yIG1vcmUgZWFzeSBjb21wYXJpc29uLgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhcmNoLCB2Y192ZXI9Tm9uZSwgdmNfbWluX3Zlcj0wKToKICAgICAgICBzZWxmLnBpID0gUGxhdGZvcm1JbmZvKGFyY2gpCiAgICAgICAgc2VsZi5yaSA9IFJlZ2lzdHJ5SW5mbyhzZWxmLnBpKQogICAgICAgIHNlbGYuc2kgPSBTeXN0ZW1JbmZvKHNlbGYucmksIHZjX3ZlcikKCiAgICAgICAgaWYgc2VsZi52Y192ZXIgPCB2Y19taW5fdmVyOgogICAgICAgICAgICBlcnIgPSAnTm8gc3VpdGFibGUgTWljcm9zb2Z0IFZpc3VhbCBDKysgdmVyc2lvbiBmb3VuZCcKICAgICAgICAgICAgcmFpc2UgZGlzdHV0aWxzLmVycm9ycy5EaXN0dXRpbHNQbGF0Zm9ybUVycm9yKGVycikKCiAgICBAcHJvcGVydHkKICAgIGRlZiB2c192ZXIoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8uCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIGZsb2F0CiAgICAgICAgICAgIHZlcnNpb24KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZi5zaS52c192ZXIKCiAgICBAcHJvcGVydHkKICAgIGRlZiB2Y192ZXIoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFZpc3VhbCBDKysgdmVyc2lvbi4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgZmxvYXQKICAgICAgICAgICAgdmVyc2lvbgogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmLnNpLnZjX3ZlcgoKICAgIEBwcm9wZXJ0eQogICAgZGVmIFZTVG9vbHMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gVG9vbHMuCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIGxpc3Qgb2Ygc3RyCiAgICAgICAgICAgIHBhdGhzCiAgICAgICAgIiIiCiAgICAgICAgcGF0aHMgPSBbcidDb21tb243XElERScsIHInQ29tbW9uN1xUb29scyddCgogICAgICAgIGlmIHNlbGYudnNfdmVyID49IDE0LjA6CiAgICAgICAgICAgIGFyY2hfc3ViZGlyID0gc2VsZi5waS5jdXJyZW50X2RpcihoaWRleDg2PVRydWUsIHg2ND1UcnVlKQogICAgICAgICAgICBwYXRocyArPSBbcidDb21tb243XElERVxDb21tb25FeHRlbnNpb25zXE1pY3Jvc29mdFxUZXN0V2luZG93J10KICAgICAgICAgICAgcGF0aHMgKz0gW3InVGVhbSBUb29sc1xQZXJmb3JtYW5jZSBUb29scyddCiAgICAgICAgICAgIHBhdGhzICs9IFtyJ1RlYW0gVG9vbHNcUGVyZm9ybWFuY2UgVG9vbHMlcycgJSBhcmNoX3N1YmRpcl0KCiAgICAgICAgcmV0dXJuIFtqb2luKHNlbGYuc2kuVlNJbnN0YWxsRGlyLCBwYXRoKSBmb3IgcGF0aCBpbiBwYXRoc10KCiAgICBAcHJvcGVydHkKICAgIGRlZiBWQ0luY2x1ZGVzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBWaXN1YWwgQysrICYgTWljcm9zb2Z0IEZvdW5kYXRpb24gQ2xhc3MgSW5jbHVkZXMuCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIGxpc3Qgb2Ygc3RyCiAgICAgICAgICAgIHBhdGhzCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIFtqb2luKHNlbGYuc2kuVkNJbnN0YWxsRGlyLCAnSW5jbHVkZScpLAogICAgICAgICAgICAgICAgam9pbihzZWxmLnNpLlZDSW5zdGFsbERpciwgcidBVExNRkNcSW5jbHVkZScpXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIFZDTGlicmFyaWVzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBWaXN1YWwgQysrICYgTWljcm9zb2Z0IEZvdW5kYXRpb24gQ2xhc3MgTGlicmFyaWVzLgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBsaXN0IG9mIHN0cgogICAgICAgICAgICBwYXRocwogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYudnNfdmVyID49IDE1LjA6CiAgICAgICAgICAgIGFyY2hfc3ViZGlyID0gc2VsZi5waS50YXJnZXRfZGlyKHg2ND1UcnVlKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGFyY2hfc3ViZGlyID0gc2VsZi5waS50YXJnZXRfZGlyKGhpZGV4ODY9VHJ1ZSkKICAgICAgICBwYXRocyA9IFsnTGliJXMnICUgYXJjaF9zdWJkaXIsIHInQVRMTUZDXExpYiVzJyAlIGFyY2hfc3ViZGlyXQoKICAgICAgICBpZiBzZWxmLnZzX3ZlciA+PSAxNC4wOgogICAgICAgICAgICBwYXRocyArPSBbcidMaWJcc3RvcmUlcycgJSBhcmNoX3N1YmRpcl0KCiAgICAgICAgcmV0dXJuIFtqb2luKHNlbGYuc2kuVkNJbnN0YWxsRGlyLCBwYXRoKSBmb3IgcGF0aCBpbiBwYXRoc10KCiAgICBAcHJvcGVydHkKICAgIGRlZiBWQ1N0b3JlUmVmcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgVmlzdWFsIEMrKyBzdG9yZSByZWZlcmVuY2VzIExpYnJhcmllcy4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgbGlzdCBvZiBzdHIKICAgICAgICAgICAgcGF0aHMKICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLnZzX3ZlciA8IDE0LjA6CiAgICAgICAgICAgIHJldHVybiBbXQogICAgICAgIHJldHVybiBbam9pbihzZWxmLnNpLlZDSW5zdGFsbERpciwgcidMaWJcc3RvcmVccmVmZXJlbmNlcycpXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIFZDVG9vbHMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFZpc3VhbCBDKysgVG9vbHMuCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIGxpc3Qgb2Ygc3RyCiAgICAgICAgICAgIHBhdGhzCiAgICAgICAgIiIiCiAgICAgICAgc2kgPSBzZWxmLnNpCiAgICAgICAgdG9vbHMgPSBbam9pbihzaS5WQ0luc3RhbGxEaXIsICdWQ1BhY2thZ2VzJyldCgogICAgICAgIGZvcmNleDg2ID0gVHJ1ZSBpZiBzZWxmLnZzX3ZlciA8PSAxMC4wIGVsc2UgRmFsc2UKICAgICAgICBhcmNoX3N1YmRpciA9IHNlbGYucGkuY3Jvc3NfZGlyKGZvcmNleDg2KQogICAgICAgIGlmIGFyY2hfc3ViZGlyOgogICAgICAgICAgICB0b29scyArPSBbam9pbihzaS5WQ0luc3RhbGxEaXIsICdCaW4lcycgJSBhcmNoX3N1YmRpcildCgogICAgICAgIGlmIHNlbGYudnNfdmVyID09IDE0LjA6CiAgICAgICAgICAgIHBhdGggPSAnQmluJXMnICUgc2VsZi5waS5jdXJyZW50X2RpcihoaWRleDg2PVRydWUpCiAgICAgICAgICAgIHRvb2xzICs9IFtqb2luKHNpLlZDSW5zdGFsbERpciwgcGF0aCldCgogICAgICAgIGVsaWYgc2VsZi52c192ZXIgPj0gMTUuMDoKICAgICAgICAgICAgaG9zdF9kaXIgPSAocidiaW5cSG9zdFg4NiVzJyBpZiBzZWxmLnBpLmN1cnJlbnRfaXNfeDg2KCkgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICByJ2JpblxIb3N0WDY0JXMnKQogICAgICAgICAgICB0b29scyArPSBbam9pbigKICAgICAgICAgICAgICAgIHNpLlZDSW5zdGFsbERpciwgaG9zdF9kaXIgJSBzZWxmLnBpLnRhcmdldF9kaXIoeDY0PVRydWUpKV0KCiAgICAgICAgICAgIGlmIHNlbGYucGkuY3VycmVudF9jcHUgIT0gc2VsZi5waS50YXJnZXRfY3B1OgogICAgICAgICAgICAgICAgdG9vbHMgKz0gW2pvaW4oCiAgICAgICAgICAgICAgICAgICAgc2kuVkNJbnN0YWxsRGlyLCBob3N0X2RpciAlIHNlbGYucGkuY3VycmVudF9kaXIoeDY0PVRydWUpKV0KCiAgICAgICAgZWxzZToKICAgICAgICAgICAgdG9vbHMgKz0gW2pvaW4oc2kuVkNJbnN0YWxsRGlyLCAnQmluJyldCgogICAgICAgIHJldHVybiB0b29scwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIE9TTGlicmFyaWVzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBXaW5kb3dzIFNESyBMaWJyYXJpZXMuCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIGxpc3Qgb2Ygc3RyCiAgICAgICAgICAgIHBhdGhzCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi52c192ZXIgPD0gMTAuMDoKICAgICAgICAgICAgYXJjaF9zdWJkaXIgPSBzZWxmLnBpLnRhcmdldF9kaXIoaGlkZXg4Nj1UcnVlLCB4NjQ9VHJ1ZSkKICAgICAgICAgICAgcmV0dXJuIFtqb2luKHNlbGYuc2kuV2luZG93c1Nka0RpciwgJ0xpYiVzJyAlIGFyY2hfc3ViZGlyKV0KCiAgICAgICAgZWxzZToKICAgICAgICAgICAgYXJjaF9zdWJkaXIgPSBzZWxmLnBpLnRhcmdldF9kaXIoeDY0PVRydWUpCiAgICAgICAgICAgIGxpYiA9IGpvaW4oc2VsZi5zaS5XaW5kb3dzU2RrRGlyLCAnbGliJykKICAgICAgICAgICAgbGlidmVyID0gc2VsZi5fc2RrX3N1YmRpcgogICAgICAgICAgICByZXR1cm4gW2pvaW4obGliLCAnJXN1bSVzJyAlIChsaWJ2ZXIgLCBhcmNoX3N1YmRpcikpXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIE9TSW5jbHVkZXMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFdpbmRvd3MgU0RLIEluY2x1ZGUuCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIGxpc3Qgb2Ygc3RyCiAgICAgICAgICAgIHBhdGhzCiAgICAgICAgIiIiCiAgICAgICAgaW5jbHVkZSA9IGpvaW4oc2VsZi5zaS5XaW5kb3dzU2RrRGlyLCAnaW5jbHVkZScpCgogICAgICAgIGlmIHNlbGYudnNfdmVyIDw9IDEwLjA6CiAgICAgICAgICAgIHJldHVybiBbaW5jbHVkZSwgam9pbihpbmNsdWRlLCAnZ2wnKV0KCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaWYgc2VsZi52c192ZXIgPj0gMTQuMDoKICAgICAgICAgICAgICAgIHNka3ZlciA9IHNlbGYuX3Nka19zdWJkaXIKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNka3ZlciA9ICcnCiAgICAgICAgICAgIHJldHVybiBbam9pbihpbmNsdWRlLCAnJXNzaGFyZWQnICUgc2RrdmVyKSwKICAgICAgICAgICAgICAgICAgICBqb2luKGluY2x1ZGUsICclc3VtJyAlIHNka3ZlciksCiAgICAgICAgICAgICAgICAgICAgam9pbihpbmNsdWRlLCAnJXN3aW5ydCcgJSBzZGt2ZXIpXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIE9TTGlicGF0aChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgV2luZG93cyBTREsgTGlicmFyaWVzIFBhdGhzLgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBsaXN0IG9mIHN0cgogICAgICAgICAgICBwYXRocwogICAgICAgICIiIgogICAgICAgIHJlZiA9IGpvaW4oc2VsZi5zaS5XaW5kb3dzU2RrRGlyLCAnUmVmZXJlbmNlcycpCiAgICAgICAgbGlicGF0aCA9IFtdCgogICAgICAgIGlmIHNlbGYudnNfdmVyIDw9IDkuMDoKICAgICAgICAgICAgbGlicGF0aCArPSBzZWxmLk9TTGlicmFyaWVzCgogICAgICAgIGlmIHNlbGYudnNfdmVyID49IDExLjA6CiAgICAgICAgICAgIGxpYnBhdGggKz0gW2pvaW4ocmVmLCByJ0NvbW1vbkNvbmZpZ3VyYXRpb25cTmV1dHJhbCcpXQoKICAgICAgICBpZiBzZWxmLnZzX3ZlciA+PSAxNC4wOgogICAgICAgICAgICBsaWJwYXRoICs9IFsKICAgICAgICAgICAgICAgIHJlZiwKICAgICAgICAgICAgICAgIGpvaW4oc2VsZi5zaS5XaW5kb3dzU2RrRGlyLCAnVW5pb25NZXRhZGF0YScpLAogICAgICAgICAgICAgICAgam9pbihyZWYsICdXaW5kb3dzLkZvdW5kYXRpb24uVW5pdmVyc2FsQXBpQ29udHJhY3QnLCAnMS4wLjAuMCcpLAogICAgICAgICAgICAgICAgam9pbihyZWYsICdXaW5kb3dzLkZvdW5kYXRpb24uRm91bmRhdGlvbkNvbnRyYWN0JywgJzEuMC4wLjAnKSwKICAgICAgICAgICAgICAgIGpvaW4ocmVmLCdXaW5kb3dzLk5ldHdvcmtpbmcuQ29ubmVjdGl2aXR5Lld3YW5Db250cmFjdCcsCiAgICAgICAgICAgICAgICAgICAgICcxLjAuMC4wJyksCiAgICAgICAgICAgICAgICBqb2luKHNlbGYuc2kuV2luZG93c1Nka0RpciwgJ0V4dGVuc2lvblNES3MnLCAnTWljcm9zb2Z0LlZDTGlicycsCiAgICAgICAgICAgICAgICAgICAgICclMC4xZicgJSBzZWxmLnZzX3ZlciwgJ1JlZmVyZW5jZXMnLCAnQ29tbW9uQ29uZmlndXJhdGlvbicsCiAgICAgICAgICAgICAgICAgICAgICduZXV0cmFsJyksCiAgICAgICAgICAgIF0KICAgICAgICByZXR1cm4gbGlicGF0aAoKICAgIEBwcm9wZXJ0eQogICAgZGVmIFNka1Rvb2xzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBXaW5kb3dzIFNESyBUb29scy4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgbGlzdCBvZiBzdHIKICAgICAgICAgICAgcGF0aHMKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gbGlzdChzZWxmLl9zZGtfdG9vbHMoKSkKCiAgICBkZWYgX3Nka190b29scyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgV2luZG93cyBTREsgVG9vbHMgcGF0aHMgZ2VuZXJhdG9yLgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBnZW5lcmF0b3Igb2Ygc3RyCiAgICAgICAgICAgIHBhdGhzCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi52c192ZXIgPCAxNS4wOgogICAgICAgICAgICBiaW5fZGlyID0gJ0JpbicgaWYgc2VsZi52c192ZXIgPD0gMTEuMCBlbHNlIHInQmluXHg4NicKICAgICAgICAgICAgeWllbGQgam9pbihzZWxmLnNpLldpbmRvd3NTZGtEaXIsIGJpbl9kaXIpCgogICAgICAgIGlmIG5vdCBzZWxmLnBpLmN1cnJlbnRfaXNfeDg2KCk6CiAgICAgICAgICAgIGFyY2hfc3ViZGlyID0gc2VsZi5waS5jdXJyZW50X2Rpcih4NjQ9VHJ1ZSkKICAgICAgICAgICAgcGF0aCA9ICdCaW4lcycgJSBhcmNoX3N1YmRpcgogICAgICAgICAgICB5aWVsZCBqb2luKHNlbGYuc2kuV2luZG93c1Nka0RpciwgcGF0aCkKCiAgICAgICAgaWYgc2VsZi52c192ZXIgaW4gKDEwLjAsIDExLjApOgogICAgICAgICAgICBpZiBzZWxmLnBpLnRhcmdldF9pc194ODYoKToKICAgICAgICAgICAgICAgIGFyY2hfc3ViZGlyID0gJycKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGFyY2hfc3ViZGlyID0gc2VsZi5waS5jdXJyZW50X2RpcihoaWRleDg2PVRydWUsIHg2ND1UcnVlKQogICAgICAgICAgICBwYXRoID0gcidCaW5cTkVURlggNC4wIFRvb2xzJXMnICUgYXJjaF9zdWJkaXIKICAgICAgICAgICAgeWllbGQgam9pbihzZWxmLnNpLldpbmRvd3NTZGtEaXIsIHBhdGgpCgogICAgICAgIGVsaWYgc2VsZi52c192ZXIgPj0gMTUuMDoKICAgICAgICAgICAgcGF0aCA9IGpvaW4oc2VsZi5zaS5XaW5kb3dzU2RrRGlyLCAnQmluJykKICAgICAgICAgICAgYXJjaF9zdWJkaXIgPSBzZWxmLnBpLmN1cnJlbnRfZGlyKHg2ND1UcnVlKQogICAgICAgICAgICBzZGt2ZXIgPSBzZWxmLnNpLldpbmRvd3NTZGtMYXN0VmVyc2lvbgogICAgICAgICAgICB5aWVsZCBqb2luKHBhdGgsICclcyVzJyAlIChzZGt2ZXIsIGFyY2hfc3ViZGlyKSkKCiAgICAgICAgaWYgc2VsZi5zaS5XaW5kb3dzU0RLRXhlY3V0YWJsZVBhdGg6CiAgICAgICAgICAgIHlpZWxkIHNlbGYuc2kuV2luZG93c1NES0V4ZWN1dGFibGVQYXRoCgogICAgQHByb3BlcnR5CiAgICBkZWYgX3Nka19zdWJkaXIoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFdpbmRvd3MgU0RLIHZlcnNpb24gc3ViZGlyLgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBzdHIKICAgICAgICAgICAgc3ViZGlyCiAgICAgICAgIiIiCiAgICAgICAgdWNydHZlciA9IHNlbGYuc2kuV2luZG93c1Nka0xhc3RWZXJzaW9uCiAgICAgICAgcmV0dXJuICgnJXNcXCcgJSB1Y3J0dmVyKSBpZiB1Y3J0dmVyIGVsc2UgJycKCiAgICBAcHJvcGVydHkKICAgIGRlZiBTZGtTZXR1cChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgV2luZG93cyBTREsgU2V0dXAuCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIGxpc3Qgb2Ygc3RyCiAgICAgICAgICAgIHBhdGhzCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi52c192ZXIgPiA5LjA6CiAgICAgICAgICAgIHJldHVybiBbXQoKICAgICAgICByZXR1cm4gW2pvaW4oc2VsZi5zaS5XaW5kb3dzU2RrRGlyLCAnU2V0dXAnKV0KCiAgICBAcHJvcGVydHkKICAgIGRlZiBGeFRvb2xzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCAuTkVUIEZyYW1ld29yayBUb29scy4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgbGlzdCBvZiBzdHIKICAgICAgICAgICAgcGF0aHMKICAgICAgICAiIiIKICAgICAgICBwaSA9IHNlbGYucGkKICAgICAgICBzaSA9IHNlbGYuc2kKCiAgICAgICAgaWYgc2VsZi52c192ZXIgPD0gMTAuMDoKICAgICAgICAgICAgaW5jbHVkZTMyID0gVHJ1ZQogICAgICAgICAgICBpbmNsdWRlNjQgPSBub3QgcGkudGFyZ2V0X2lzX3g4NigpIGFuZCBub3QgcGkuY3VycmVudF9pc194ODYoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGluY2x1ZGUzMiA9IHBpLnRhcmdldF9pc194ODYoKSBvciBwaS5jdXJyZW50X2lzX3g4NigpCiAgICAgICAgICAgIGluY2x1ZGU2NCA9IHBpLmN1cnJlbnRfY3B1ID09ICdhbWQ2NCcgb3IgcGkudGFyZ2V0X2NwdSA9PSAnYW1kNjQnCgogICAgICAgIHRvb2xzID0gW10KICAgICAgICBpZiBpbmNsdWRlMzI6CiAgICAgICAgICAgIHRvb2xzICs9IFtqb2luKHNpLkZyYW1ld29ya0RpcjMyLCB2ZXIpCiAgICAgICAgICAgICAgICAgICAgICBmb3IgdmVyIGluIHNpLkZyYW1ld29ya1ZlcnNpb24zMl0KICAgICAgICBpZiBpbmNsdWRlNjQ6CiAgICAgICAgICAgIHRvb2xzICs9IFtqb2luKHNpLkZyYW1ld29ya0RpcjY0LCB2ZXIpCiAgICAgICAgICAgICAgICAgICAgICBmb3IgdmVyIGluIHNpLkZyYW1ld29ya1ZlcnNpb242NF0KICAgICAgICByZXR1cm4gdG9vbHMKCiAgICBAcHJvcGVydHkKICAgIGRlZiBOZXRGeFNES0xpYnJhcmllcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgLk5ldCBGcmFtZXdvcmsgU0RLIExpYnJhcmllcy4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgbGlzdCBvZiBzdHIKICAgICAgICAgICAgcGF0aHMKICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLnZzX3ZlciA8IDE0LjAgb3Igbm90IHNlbGYuc2kuTmV0RnhTZGtEaXI6CiAgICAgICAgICAgIHJldHVybiBbXQoKICAgICAgICBhcmNoX3N1YmRpciA9IHNlbGYucGkudGFyZ2V0X2Rpcih4NjQ9VHJ1ZSkKICAgICAgICByZXR1cm4gW2pvaW4oc2VsZi5zaS5OZXRGeFNka0RpciwgcidsaWJcdW0lcycgJSBhcmNoX3N1YmRpcildCgogICAgQHByb3BlcnR5CiAgICBkZWYgTmV0RnhTREtJbmNsdWRlcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgLk5ldCBGcmFtZXdvcmsgU0RLIEluY2x1ZGVzLgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBsaXN0IG9mIHN0cgogICAgICAgICAgICBwYXRocwogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYudnNfdmVyIDwgMTQuMCBvciBub3Qgc2VsZi5zaS5OZXRGeFNka0RpcjoKICAgICAgICAgICAgcmV0dXJuIFtdCgogICAgICAgIHJldHVybiBbam9pbihzZWxmLnNpLk5ldEZ4U2RrRGlyLCByJ2luY2x1ZGVcdW0nKV0KCiAgICBAcHJvcGVydHkKICAgIGRlZiBWc1REYihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBUZWFtIFN5c3RlbSBEYXRhYmFzZS4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgbGlzdCBvZiBzdHIKICAgICAgICAgICAgcGF0aHMKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gW2pvaW4oc2VsZi5zaS5WU0luc3RhbGxEaXIsIHInVlNUU0RCXERlcGxveScpXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIE1TQnVpbGQoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IEJ1aWxkIEVuZ2luZS4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgbGlzdCBvZiBzdHIKICAgICAgICAgICAgcGF0aHMKICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLnZzX3ZlciA8IDEyLjA6CiAgICAgICAgICAgIHJldHVybiBbXQogICAgICAgIGVsaWYgc2VsZi52c192ZXIgPCAxNS4wOgogICAgICAgICAgICBiYXNlX3BhdGggPSBzZWxmLnNpLlByb2dyYW1GaWxlc3g4NgogICAgICAgICAgICBhcmNoX3N1YmRpciA9IHNlbGYucGkuY3VycmVudF9kaXIoaGlkZXg4Nj1UcnVlKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGJhc2VfcGF0aCA9IHNlbGYuc2kuVlNJbnN0YWxsRGlyCiAgICAgICAgICAgIGFyY2hfc3ViZGlyID0gJycKCiAgICAgICAgcGF0aCA9IHInTVNCdWlsZFwlMC4xZlxiaW4lcycgJSAoc2VsZi52c192ZXIsIGFyY2hfc3ViZGlyKQogICAgICAgIGJ1aWxkID0gW2pvaW4oYmFzZV9wYXRoLCBwYXRoKV0KCiAgICAgICAgaWYgc2VsZi52c192ZXIgPj0gMTUuMDoKICAgICAgICAgICAgIyBBZGQgUm9zbHluIEMjICYgVmlzdWFsIEJhc2ljIENvbXBpbGVyCiAgICAgICAgICAgIGJ1aWxkICs9IFtqb2luKGJhc2VfcGF0aCwgcGF0aCwgJ1Jvc2x5bicpXQoKICAgICAgICByZXR1cm4gYnVpbGQKCiAgICBAcHJvcGVydHkKICAgIGRlZiBIVE1MSGVscFdvcmtzaG9wKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBIVE1MIEhlbHAgV29ya3Nob3AuCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIGxpc3Qgb2Ygc3RyCiAgICAgICAgICAgIHBhdGhzCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi52c192ZXIgPCAxMS4wOgogICAgICAgICAgICByZXR1cm4gW10KCiAgICAgICAgcmV0dXJuIFtqb2luKHNlbGYuc2kuUHJvZ3JhbUZpbGVzeDg2LCAnSFRNTCBIZWxwIFdvcmtzaG9wJyldCgogICAgQHByb3BlcnR5CiAgICBkZWYgVUNSVExpYnJhcmllcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgVW5pdmVyc2FsIEMgUnVudGltZSBTREsgTGlicmFyaWVzLgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBsaXN0IG9mIHN0cgogICAgICAgICAgICBwYXRocwogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYudnNfdmVyIDwgMTQuMDoKICAgICAgICAgICAgcmV0dXJuIFtdCgogICAgICAgIGFyY2hfc3ViZGlyID0gc2VsZi5waS50YXJnZXRfZGlyKHg2ND1UcnVlKQogICAgICAgIGxpYiA9IGpvaW4oc2VsZi5zaS5Vbml2ZXJzYWxDUlRTZGtEaXIsICdsaWInKQogICAgICAgIHVjcnR2ZXIgPSBzZWxmLl91Y3J0X3N1YmRpcgogICAgICAgIHJldHVybiBbam9pbihsaWIsICclc3VjcnQlcycgJSAodWNydHZlciwgYXJjaF9zdWJkaXIpKV0KCiAgICBAcHJvcGVydHkKICAgIGRlZiBVQ1JUSW5jbHVkZXMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFVuaXZlcnNhbCBDIFJ1bnRpbWUgU0RLIEluY2x1ZGUuCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIGxpc3Qgb2Ygc3RyCiAgICAgICAgICAgIHBhdGhzCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi52c192ZXIgPCAxNC4wOgogICAgICAgICAgICByZXR1cm4gW10KCiAgICAgICAgaW5jbHVkZSA9IGpvaW4oc2VsZi5zaS5Vbml2ZXJzYWxDUlRTZGtEaXIsICdpbmNsdWRlJykKICAgICAgICByZXR1cm4gW2pvaW4oaW5jbHVkZSwgJyVzdWNydCcgJSBzZWxmLl91Y3J0X3N1YmRpcildCgogICAgQHByb3BlcnR5CiAgICBkZWYgX3VjcnRfc3ViZGlyKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBVbml2ZXJzYWwgQyBSdW50aW1lIFNESyB2ZXJzaW9uIHN1YmRpci4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgc3RyCiAgICAgICAgICAgIHN1YmRpcgogICAgICAgICIiIgogICAgICAgIHVjcnR2ZXIgPSBzZWxmLnNpLlVuaXZlcnNhbENSVFNka0xhc3RWZXJzaW9uCiAgICAgICAgcmV0dXJuICgnJXNcXCcgJSB1Y3J0dmVyKSBpZiB1Y3J0dmVyIGVsc2UgJycKCiAgICBAcHJvcGVydHkKICAgIGRlZiBGU2hhcnAoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFZpc3VhbCBGIy4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgbGlzdCBvZiBzdHIKICAgICAgICAgICAgcGF0aHMKICAgICAgICAiIiIKICAgICAgICBpZiAxMS4wID4gc2VsZi52c192ZXIgPiAxMi4wOgogICAgICAgICAgICByZXR1cm4gW10KCiAgICAgICAgcmV0dXJuIFtzZWxmLnNpLkZTaGFycEluc3RhbGxEaXJdCgogICAgQHByb3BlcnR5CiAgICBkZWYgVkNSdW50aW1lUmVkaXN0KHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBWaXN1YWwgQysrIHJ1bnRpbWUgcmVkaXN0cmlidXRhYmxlIGRsbC4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgc3RyCiAgICAgICAgICAgIHBhdGgKICAgICAgICAiIiIKICAgICAgICB2Y3J1bnRpbWUgPSAndmNydW50aW1lJWQwLmRsbCcgJSBzZWxmLnZjX3ZlcgogICAgICAgIGFyY2hfc3ViZGlyID0gc2VsZi5waS50YXJnZXRfZGlyKHg2ND1UcnVlKS5zdHJpcCgnXFwnKQoKICAgICAgICAjIEluc3RhbGxhdGlvbiBwcmVmaXhlcyBjYW5kaWRhdGVzCiAgICAgICAgcHJlZml4ZXMgPSBbXQogICAgICAgIHRvb2xzX3BhdGggPSBzZWxmLnNpLlZDSW5zdGFsbERpcgogICAgICAgIHJlZGlzdF9wYXRoID0gZGlybmFtZSh0b29sc19wYXRoLnJlcGxhY2UocidcVG9vbHMnLCByJ1xSZWRpc3QnKSkKICAgICAgICBpZiBpc2RpcihyZWRpc3RfcGF0aCk6CiAgICAgICAgICAgICMgUmVkaXN0IHZlcnNpb24gbWF5IG5vdCBiZSBleGFjdGx5IHRoZSBzYW1lIGFzIHRvb2xzCiAgICAgICAgICAgIHJlZGlzdF9wYXRoID0gam9pbihyZWRpc3RfcGF0aCwgbGlzdGRpcihyZWRpc3RfcGF0aClbLTFdKQogICAgICAgICAgICBwcmVmaXhlcyArPSBbcmVkaXN0X3BhdGgsIGpvaW4ocmVkaXN0X3BhdGgsICdvbmVjb3JlJyldCgogICAgICAgIHByZWZpeGVzICs9IFtqb2luKHRvb2xzX3BhdGgsICdyZWRpc3QnKV0gICMgVlMxNCBsZWdhY3kgcGF0aAoKICAgICAgICAjIENSVCBkaXJlY3RvcnkKICAgICAgICBjcnRfZGlycyA9ICgnTWljcm9zb2Z0LlZDJWQuQ1JUJyAlIChzZWxmLnZjX3ZlciAqIDEwKSwKICAgICAgICAgICAgICAgICAgICAjIFNvbWV0aW1lIHN0b3JlIGluIGRpcmVjdG9yeSB3aXRoIFZTIHZlcnNpb24gaW5zdGVhZCBvZiBWQwogICAgICAgICAgICAgICAgICAgICdNaWNyb3NvZnQuVkMlZC5DUlQnICUgKGludChzZWxmLnZzX3ZlcikgKiAxMCkpCgogICAgICAgICMgdmNydW50aW1lIHBhdGgKICAgICAgICBmb3IgcHJlZml4LCBjcnRfZGlyIGluIGl0ZXJ0b29scy5wcm9kdWN0KHByZWZpeGVzLCBjcnRfZGlycyk6CiAgICAgICAgICAgIHBhdGggPSBqb2luKHByZWZpeCwgYXJjaF9zdWJkaXIsIGNydF9kaXIsIHZjcnVudGltZSkKICAgICAgICAgICAgaWYgaXNmaWxlKHBhdGgpOgogICAgICAgICAgICAgICAgcmV0dXJuIHBhdGgKCiAgICBkZWYgcmV0dXJuX2VudihzZWxmLCBleGlzdHM9VHJ1ZSk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIGVudmlyb25tZW50IGRpY3QuCgogICAgICAgIFBhcmFtZXRlcnMKICAgICAgICAtLS0tLS0tLS0tCiAgICAgICAgZXhpc3RzOiBib29sCiAgICAgICAgICAgIEl0IFRydWUsIG9ubHkgcmV0dXJuIGV4aXN0aW5nIHBhdGhzLgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBkaWN0CiAgICAgICAgICAgIGVudmlyb25tZW50CiAgICAgICAgIiIiCiAgICAgICAgZW52ID0gZGljdCgKICAgICAgICAgICAgaW5jbHVkZT1zZWxmLl9idWlsZF9wYXRocygnaW5jbHVkZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGYuVkNJbmNsdWRlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5PU0luY2x1ZGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLlVDUlRJbmNsdWRlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5OZXRGeFNES0luY2x1ZGVzXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdHMpLAogICAgICAgICAgICBsaWI9c2VsZi5fYnVpbGRfcGF0aHMoJ2xpYicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZi5WQ0xpYnJhcmllcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLk9TTGlicmFyaWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuRnhUb29scywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLlVDUlRMaWJyYXJpZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5OZXRGeFNES0xpYnJhcmllc10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdHMpLAogICAgICAgICAgICBsaWJwYXRoPXNlbGYuX2J1aWxkX3BhdGhzKCdsaWJwYXRoJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZi5WQ0xpYnJhcmllcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5GeFRvb2xzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLlZDU3RvcmVSZWZzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLk9TTGlicGF0aF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RzKSwKICAgICAgICAgICAgcGF0aD1zZWxmLl9idWlsZF9wYXRocygncGF0aCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGYuVkNUb29scywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5WU1Rvb2xzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLlZzVERiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLlNka1Rvb2xzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLlNka1NldHVwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLkZ4VG9vbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuTVNCdWlsZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5IVE1MSGVscFdvcmtzaG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLkZTaGFycF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RzKSwKICAgICAgICApCiAgICAgICAgaWYgc2VsZi52c192ZXIgPj0gMTQgYW5kIGlzZmlsZShzZWxmLlZDUnVudGltZVJlZGlzdCk6CiAgICAgICAgICAgIGVudlsncHlfdmNydW50aW1lX3JlZGlzdCddID0gc2VsZi5WQ1J1bnRpbWVSZWRpc3QKICAgICAgICByZXR1cm4gZW52CgogICAgZGVmIF9idWlsZF9wYXRocyhzZWxmLCBuYW1lLCBzcGVjX3BhdGhfbGlzdHMsIGV4aXN0cyk6CiAgICAgICAgIiIiCiAgICAgICAgR2l2ZW4gYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgbmFtZSBhbmQgc3BlY2lmaWVkIHBhdGhzLAogICAgICAgIHJldHVybiBhIHBhdGhzZXAtc2VwYXJhdGVkIHN0cmluZyBvZiBwYXRocyBjb250YWluaW5nCiAgICAgICAgdW5pcXVlLCBleHRhbnQsIGRpcmVjdG9yaWVzIGZyb20gdGhvc2UgcGF0aHMgYW5kIGZyb20KICAgICAgICB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUuIFJhaXNlIGFuIGVycm9yIGlmIG5vIHBhdGhzCiAgICAgICAgYXJlIHJlc29sdmVkLgoKICAgICAgICBQYXJhbWV0ZXJzCiAgICAgICAgLS0tLS0tLS0tLQogICAgICAgIG5hbWU6IHN0cgogICAgICAgICAgICBFbnZpcm9ubWVudCB2YXJpYWJsZSBuYW1lCiAgICAgICAgc3BlY19wYXRoX2xpc3RzOiBsaXN0IG9mIHN0cgogICAgICAgICAgICBQYXRocwogICAgICAgIGV4aXN0czogYm9vbAogICAgICAgICAgICBJdCBUcnVlLCBvbmx5IHJldHVybiBleGlzdGluZyBwYXRocy4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgc3RyCiAgICAgICAgICAgIFBhdGhzZXAtc2VwYXJhdGVkIHBhdGhzCiAgICAgICAgIiIiCiAgICAgICAgIyBmbGF0dGVuIHNwZWNfcGF0aF9saXN0cwogICAgICAgIHNwZWNfcGF0aHMgPSBpdGVydG9vbHMuY2hhaW4uZnJvbV9pdGVyYWJsZShzcGVjX3BhdGhfbGlzdHMpCiAgICAgICAgZW52X3BhdGhzID0gZW52aXJvbi5nZXQobmFtZSwgJycpLnNwbGl0KHBhdGhzZXApCiAgICAgICAgcGF0aHMgPSBpdGVydG9vbHMuY2hhaW4oc3BlY19wYXRocywgZW52X3BhdGhzKQogICAgICAgIGV4dGFudF9wYXRocyA9IGxpc3QoZmlsdGVyKGlzZGlyLCBwYXRocykpIGlmIGV4aXN0cyBlbHNlIHBhdGhzCiAgICAgICAgaWYgbm90IGV4dGFudF9wYXRoczoKICAgICAgICAgICAgbXNnID0gIiVzIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIGVtcHR5IiAlIG5hbWUudXBwZXIoKQogICAgICAgICAgICByYWlzZSBkaXN0dXRpbHMuZXJyb3JzLkRpc3R1dGlsc1BsYXRmb3JtRXJyb3IobXNnKQogICAgICAgIHVuaXF1ZV9wYXRocyA9IHNlbGYuX3VuaXF1ZV9ldmVyc2VlbihleHRhbnRfcGF0aHMpCiAgICAgICAgcmV0dXJuIHBhdGhzZXAuam9pbih1bmlxdWVfcGF0aHMpCgogICAgIyBmcm9tIFB5dGhvbiBkb2NzCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX3VuaXF1ZV9ldmVyc2VlbihpdGVyYWJsZSwga2V5PU5vbmUpOgogICAgICAgICIiIgogICAgICAgIExpc3QgdW5pcXVlIGVsZW1lbnRzLCBwcmVzZXJ2aW5nIG9yZGVyLgogICAgICAgIFJlbWVtYmVyIGFsbCBlbGVtZW50cyBldmVyIHNlZW4uCgogICAgICAgIF91bmlxdWVfZXZlcnNlZW4oJ0FBQUFCQkJDQ0RBQUJCQicpIC0tPiBBIEIgQyBECgogICAgICAgIF91bmlxdWVfZXZlcnNlZW4oJ0FCQkNjQUQnLCBzdHIubG93ZXIpIC0tPiBBIEIgQyBECiAgICAgICAgIiIiCiAgICAgICAgc2VlbiA9IHNldCgpCiAgICAgICAgc2Vlbl9hZGQgPSBzZWVuLmFkZAogICAgICAgIGlmIGtleSBpcyBOb25lOgogICAgICAgICAgICBmb3IgZWxlbWVudCBpbiBmaWx0ZXJmYWxzZShzZWVuLl9fY29udGFpbnNfXywgaXRlcmFibGUpOgogICAgICAgICAgICAgICAgc2Vlbl9hZGQoZWxlbWVudCkKICAgICAgICAgICAgICAgIHlpZWxkIGVsZW1lbnQKICAgICAgICBlbHNlOgogICAgICAgICAgICBmb3IgZWxlbWVudCBpbiBpdGVyYWJsZToKICAgICAgICAgICAgICAgIGsgPSBrZXkoZWxlbWVudCkKICAgICAgICAgICAgICAgIGlmIGsgbm90IGluIHNlZW46CiAgICAgICAgICAgICAgICAgICAgc2Vlbl9hZGQoaykKICAgICAgICAgICAgICAgICAgICB5aWVsZCBlbGVtZW50ClBLAwQUAAAAAAAAACEAYwvj1n8MAAB/DAAAPQAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL25hbWVzcGFjZXMucHlpbXBvcnQgb3MKZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZwppbXBvcnQgaXRlcnRvb2xzCgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuLnNpeC5tb3ZlcyBpbXBvcnQgbWFwCgoKZmxhdHRlbiA9IGl0ZXJ0b29scy5jaGFpbi5mcm9tX2l0ZXJhYmxlCgoKY2xhc3MgSW5zdGFsbGVyOgoKICAgIG5zcGtnX2V4dCA9ICctbnNwa2cucHRoJwoKICAgIGRlZiBpbnN0YWxsX25hbWVzcGFjZXMoc2VsZik6CiAgICAgICAgbnNwID0gc2VsZi5fZ2V0X2FsbF9uc19wYWNrYWdlcygpCiAgICAgICAgaWYgbm90IG5zcDoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgZmlsZW5hbWUsIGV4dCA9IG9zLnBhdGguc3BsaXRleHQoc2VsZi5fZ2V0X3RhcmdldCgpKQogICAgICAgIGZpbGVuYW1lICs9IHNlbGYubnNwa2dfZXh0CiAgICAgICAgc2VsZi5vdXRwdXRzLmFwcGVuZChmaWxlbmFtZSkKICAgICAgICBsb2cuaW5mbygiSW5zdGFsbGluZyAlcyIsIGZpbGVuYW1lKQogICAgICAgIGxpbmVzID0gbWFwKHNlbGYuX2dlbl9uc3BrZ19saW5lLCBuc3ApCgogICAgICAgIGlmIHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgIyBhbHdheXMgZ2VuZXJhdGUgdGhlIGxpbmVzLCBldmVuIGluIGRyeSBydW4KICAgICAgICAgICAgbGlzdChsaW5lcykKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIHdpdGggb3BlbihmaWxlbmFtZSwgJ3d0JykgYXMgZjoKICAgICAgICAgICAgZi53cml0ZWxpbmVzKGxpbmVzKQoKICAgIGRlZiB1bmluc3RhbGxfbmFtZXNwYWNlcyhzZWxmKToKICAgICAgICBmaWxlbmFtZSwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChzZWxmLl9nZXRfdGFyZ2V0KCkpCiAgICAgICAgZmlsZW5hbWUgKz0gc2VsZi5uc3BrZ19leHQKICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoZmlsZW5hbWUpOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBsb2cuaW5mbygiUmVtb3ZpbmcgJXMiLCBmaWxlbmFtZSkKICAgICAgICBvcy5yZW1vdmUoZmlsZW5hbWUpCgogICAgZGVmIF9nZXRfdGFyZ2V0KHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLnRhcmdldAoKICAgIF9uc3BrZ190bXBsID0gKAogICAgICAgICJpbXBvcnQgc3lzLCB0eXBlcywgb3MiLAogICAgICAgICJoYXNfbWZzID0gc3lzLnZlcnNpb25faW5mbyA+ICgzLCA1KSIsCiAgICAgICAgInAgPSBvcy5wYXRoLmpvaW4oJShyb290KXMsIColKHB0aClyKSIsCiAgICAgICAgImltcG9ydGxpYiA9IGhhc19tZnMgYW5kIF9faW1wb3J0X18oJ2ltcG9ydGxpYi51dGlsJykiLAogICAgICAgICJoYXNfbWZzIGFuZCBfX2ltcG9ydF9fKCdpbXBvcnRsaWIubWFjaGluZXJ5JykiLAogICAgICAgICJtID0gaGFzX21mcyBhbmQgIgogICAgICAgICAgICAic3lzLm1vZHVsZXMuc2V0ZGVmYXVsdCglKHBrZylyLCAiCiAgICAgICAgICAgICAgICAiaW1wb3J0bGliLnV0aWwubW9kdWxlX2Zyb21fc3BlYygiCiAgICAgICAgICAgICAgICAgICAgImltcG9ydGxpYi5tYWNoaW5lcnkuUGF0aEZpbmRlci5maW5kX3NwZWMoJShwa2cpciwgIgogICAgICAgICAgICAgICAgICAgICAgICAiW29zLnBhdGguZGlybmFtZShwKV0pKSkiLAogICAgICAgICJtID0gbSBvciAiCiAgICAgICAgICAgICJzeXMubW9kdWxlcy5zZXRkZWZhdWx0KCUocGtnKXIsIHR5cGVzLk1vZHVsZVR5cGUoJShwa2cpcikpIiwKICAgICAgICAibXAgPSAobSBvciBbXSkgYW5kIG0uX19kaWN0X18uc2V0ZGVmYXVsdCgnX19wYXRoX18nLFtdKSIsCiAgICAgICAgIihwIG5vdCBpbiBtcCkgYW5kIG1wLmFwcGVuZChwKSIsCiAgICApCiAgICAibGluZXMgZm9yIHRoZSBuYW1lc3BhY2UgaW5zdGFsbGVyIgoKICAgIF9uc3BrZ190bXBsX211bHRpID0gKAogICAgICAgICdtIGFuZCBzZXRhdHRyKHN5cy5tb2R1bGVzWyUocGFyZW50KXJdLCAlKGNoaWxkKXIsIG0pJywKICAgICkKICAgICJhZGRpdGlvbmFsIGxpbmUocykgd2hlbiBhIHBhcmVudCBwYWNrYWdlIGlzIGluZGljYXRlZCIKCiAgICBkZWYgX2dldF9yb290KHNlbGYpOgogICAgICAgIHJldHVybiAic3lzLl9nZXRmcmFtZSgxKS5mX2xvY2Fsc1snc2l0ZWRpciddIgoKICAgIGRlZiBfZ2VuX25zcGtnX2xpbmUoc2VsZiwgcGtnKToKICAgICAgICAjIGVuc3VyZSBwa2cgaXMgbm90IGEgdW5pY29kZSBzdHJpbmcgdW5kZXIgUHl0aG9uIDIuNwogICAgICAgIHBrZyA9IHN0cihwa2cpCiAgICAgICAgcHRoID0gdHVwbGUocGtnLnNwbGl0KCcuJykpCiAgICAgICAgcm9vdCA9IHNlbGYuX2dldF9yb290KCkKICAgICAgICB0bXBsX2xpbmVzID0gc2VsZi5fbnNwa2dfdG1wbAogICAgICAgIHBhcmVudCwgc2VwLCBjaGlsZCA9IHBrZy5ycGFydGl0aW9uKCcuJykKICAgICAgICBpZiBwYXJlbnQ6CiAgICAgICAgICAgIHRtcGxfbGluZXMgKz0gc2VsZi5fbnNwa2dfdG1wbF9tdWx0aQogICAgICAgIHJldHVybiAnOycuam9pbih0bXBsX2xpbmVzKSAlIGxvY2FscygpICsgJ1xuJwoKICAgIGRlZiBfZ2V0X2FsbF9uc19wYWNrYWdlcyhzZWxmKToKICAgICAgICAiIiJSZXR1cm4gc29ydGVkIGxpc3Qgb2YgYWxsIHBhY2thZ2UgbmFtZXNwYWNlcyIiIgogICAgICAgIHBrZ3MgPSBzZWxmLmRpc3RyaWJ1dGlvbi5uYW1lc3BhY2VfcGFja2FnZXMgb3IgW10KICAgICAgICByZXR1cm4gc29ydGVkKGZsYXR0ZW4obWFwKHNlbGYuX3BrZ19uYW1lcywgcGtncykpKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfcGtnX25hbWVzKHBrZyk6CiAgICAgICAgIiIiCiAgICAgICAgR2l2ZW4gYSBuYW1lc3BhY2UgcGFja2FnZSwgeWllbGQgdGhlIGNvbXBvbmVudHMgb2YgdGhhdAogICAgICAgIHBhY2thZ2UuCgogICAgICAgID4+PiBuYW1lcyA9IEluc3RhbGxlci5fcGtnX25hbWVzKCdhLmIuYycpCiAgICAgICAgPj4+IHNldChuYW1lcykgPT0gc2V0KFsnYScsICdhLmInLCAnYS5iLmMnXSkKICAgICAgICBUcnVlCiAgICAgICAgIiIiCiAgICAgICAgcGFydHMgPSBwa2cuc3BsaXQoJy4nKQogICAgICAgIHdoaWxlIHBhcnRzOgogICAgICAgICAgICB5aWVsZCAnLicuam9pbihwYXJ0cykKICAgICAgICAgICAgcGFydHMucG9wKCkKCgpjbGFzcyBEZXZlbG9wSW5zdGFsbGVyKEluc3RhbGxlcik6CiAgICBkZWYgX2dldF9yb290KHNlbGYpOgogICAgICAgIHJldHVybiByZXByKHN0cihzZWxmLmVnZ19wYXRoKSkKCiAgICBkZWYgX2dldF90YXJnZXQoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuZWdnX2xpbmsKUEsDBBQAAAAAAAAAIQCeBdiNnZ4AAJ2eAABAAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvcGFja2FnZV9pbmRleC5weSIiIlB5UEkgYW5kIGRpcmVjdCBwYWNrYWdlIGRvd25sb2FkaW5nIiIiCmltcG9ydCBzeXMKaW1wb3J0IG9zCmltcG9ydCByZQppbXBvcnQgc2h1dGlsCmltcG9ydCBzb2NrZXQKaW1wb3J0IGJhc2U2NAppbXBvcnQgaGFzaGxpYgppbXBvcnQgaXRlcnRvb2xzCmltcG9ydCB3YXJuaW5ncwpmcm9tIGZ1bmN0b29scyBpbXBvcnQgd3JhcHMKCmZyb20gc2V0dXB0b29scy5leHRlcm4gaW1wb3J0IHNpeApmcm9tIHNldHVwdG9vbHMuZXh0ZXJuLnNpeC5tb3ZlcyBpbXBvcnQgdXJsbGliLCBodHRwX2NsaWVudCwgY29uZmlncGFyc2VyLCBtYXAKCmltcG9ydCBzZXR1cHRvb2xzCmZyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgKAogICAgQ0hFQ0tPVVRfRElTVCwgRGlzdHJpYnV0aW9uLCBCSU5BUllfRElTVCwgbm9ybWFsaXplX3BhdGgsIFNPVVJDRV9ESVNULAogICAgRW52aXJvbm1lbnQsIGZpbmRfZGlzdHJpYnV0aW9ucywgc2FmZV9uYW1lLCBzYWZlX3ZlcnNpb24sCiAgICB0b19maWxlbmFtZSwgUmVxdWlyZW1lbnQsIERFVkVMT1BfRElTVCwgRUdHX0RJU1QsCikKZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBzc2xfc3VwcG9ydApmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCmZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzRXJyb3IKZnJvbSBmbm1hdGNoIGltcG9ydCB0cmFuc2xhdGUKZnJvbSBzZXR1cHRvb2xzLnB5Mjdjb21wYXQgaW1wb3J0IGdldF9hbGxfaGVhZGVycwpmcm9tIHNldHVwdG9vbHMucHkzM2NvbXBhdCBpbXBvcnQgdW5lc2NhcGUKZnJvbSBzZXR1cHRvb2xzLndoZWVsIGltcG9ydCBXaGVlbAoKX19tZXRhY2xhc3NfXyA9IHR5cGUKCkVHR19GUkFHTUVOVCA9IHJlLmNvbXBpbGUocideZWdnPShbLUEtWmEtejAtOV8uKyFdKykkJykKSFJFRiA9IHJlLmNvbXBpbGUociIiImhyZWZccyo9XHMqWyciXT8oW14nIj4gXSspIiIiLCByZS5JKQpQWVBJX01ENSA9IHJlLmNvbXBpbGUoCiAgICByJzxhIGhyZWY9IihbXiIjXSspIj4oW148XSspPC9hPlxuXHMrXCg8YSAoPzp0aXRsZT0iTUQ1IGhhc2giXG5ccyspJwogICAgcidocmVmPSJbXj9dK1w/OmFjdGlvbj1zaG93X21kNSZhbXA7ZGlnZXN0PShbMC05YS1mXXszMn0pIj5tZDU8L2E+XCknCikKVVJMX1NDSEVNRSA9IHJlLmNvbXBpbGUoJyhbLSsuYS16MC05XXsyLH0pOicsIHJlLkkpLm1hdGNoCkVYVEVOU0lPTlMgPSAiLnRhci5neiAudGFyLmJ6MiAudGFyIC56aXAgLnRneiIuc3BsaXQoKQoKX19hbGxfXyA9IFsKICAgICdQYWNrYWdlSW5kZXgnLCAnZGlzdHJvc19mb3JfdXJsJywgJ3BhcnNlX2JkaXN0X3dpbmluc3QnLAogICAgJ2ludGVycHJldF9kaXN0cm9fbmFtZScsCl0KCl9TT0NLRVRfVElNRU9VVCA9IDE1CgpfdG1wbCA9ICJzZXR1cHRvb2xzL3tzZXR1cHRvb2xzLl9fdmVyc2lvbl9ffSBQeXRob24tdXJsbGliL3tweV9tYWpvcn0iCnVzZXJfYWdlbnQgPSBfdG1wbC5mb3JtYXQocHlfbWFqb3I9J3t9Lnt9Jy5mb3JtYXQoKnN5cy52ZXJzaW9uX2luZm8pLCBzZXR1cHRvb2xzPXNldHVwdG9vbHMpCgoKZGVmIHBhcnNlX3JlcXVpcmVtZW50X2FyZyhzcGVjKToKICAgIHRyeToKICAgICAgICByZXR1cm4gUmVxdWlyZW1lbnQucGFyc2Uoc3BlYykKICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKAogICAgICAgICAgICAiTm90IGEgVVJMLCBleGlzdGluZyBmaWxlLCBvciByZXF1aXJlbWVudCBzcGVjOiAlciIgJSAoc3BlYywpCiAgICAgICAgKQoKCmRlZiBwYXJzZV9iZGlzdF93aW5pbnN0KG5hbWUpOgogICAgIiIiUmV0dXJuIChiYXNlLHB5dmVyc2lvbikgb3IgKE5vbmUsTm9uZSkgZm9yIHBvc3NpYmxlIC5leGUgbmFtZSIiIgoKICAgIGxvd2VyID0gbmFtZS5sb3dlcigpCiAgICBiYXNlLCBweV92ZXIsIHBsYXQgPSBOb25lLCBOb25lLCBOb25lCgogICAgaWYgbG93ZXIuZW5kc3dpdGgoJy5leGUnKToKICAgICAgICBpZiBsb3dlci5lbmRzd2l0aCgnLndpbjMyLmV4ZScpOgogICAgICAgICAgICBiYXNlID0gbmFtZVs6LTEwXQogICAgICAgICAgICBwbGF0ID0gJ3dpbjMyJwogICAgICAgIGVsaWYgbG93ZXIuc3RhcnRzd2l0aCgnLndpbjMyLXB5JywgLTE2KToKICAgICAgICAgICAgcHlfdmVyID0gbmFtZVstNzotNF0KICAgICAgICAgICAgYmFzZSA9IG5hbWVbOi0xNl0KICAgICAgICAgICAgcGxhdCA9ICd3aW4zMicKICAgICAgICBlbGlmIGxvd2VyLmVuZHN3aXRoKCcud2luLWFtZDY0LmV4ZScpOgogICAgICAgICAgICBiYXNlID0gbmFtZVs6LTE0XQogICAgICAgICAgICBwbGF0ID0gJ3dpbi1hbWQ2NCcKICAgICAgICBlbGlmIGxvd2VyLnN0YXJ0c3dpdGgoJy53aW4tYW1kNjQtcHknLCAtMjApOgogICAgICAgICAgICBweV92ZXIgPSBuYW1lWy03Oi00XQogICAgICAgICAgICBiYXNlID0gbmFtZVs6LTIwXQogICAgICAgICAgICBwbGF0ID0gJ3dpbi1hbWQ2NCcKICAgIHJldHVybiBiYXNlLCBweV92ZXIsIHBsYXQKCgpkZWYgZWdnX2luZm9fZm9yX3VybCh1cmwpOgogICAgcGFydHMgPSB1cmxsaWIucGFyc2UudXJscGFyc2UodXJsKQogICAgc2NoZW1lLCBzZXJ2ZXIsIHBhdGgsIHBhcmFtZXRlcnMsIHF1ZXJ5LCBmcmFnbWVudCA9IHBhcnRzCiAgICBiYXNlID0gdXJsbGliLnBhcnNlLnVucXVvdGUocGF0aC5zcGxpdCgnLycpWy0xXSkKICAgIGlmIHNlcnZlciA9PSAnc291cmNlZm9yZ2UubmV0JyBhbmQgYmFzZSA9PSAnZG93bmxvYWQnOiAgIyBYWFggWXVjawogICAgICAgIGJhc2UgPSB1cmxsaWIucGFyc2UudW5xdW90ZShwYXRoLnNwbGl0KCcvJylbLTJdKQogICAgaWYgJyMnIGluIGJhc2U6CiAgICAgICAgYmFzZSwgZnJhZ21lbnQgPSBiYXNlLnNwbGl0KCcjJywgMSkKICAgIHJldHVybiBiYXNlLCBmcmFnbWVudAoKCmRlZiBkaXN0cm9zX2Zvcl91cmwodXJsLCBtZXRhZGF0YT1Ob25lKToKICAgICIiIllpZWxkIGVnZyBvciBzb3VyY2UgZGlzdHJpYnV0aW9uIG9iamVjdHMgdGhhdCBtaWdodCBiZSBmb3VuZCBhdCBhIFVSTCIiIgogICAgYmFzZSwgZnJhZ21lbnQgPSBlZ2dfaW5mb19mb3JfdXJsKHVybCkKICAgIGZvciBkaXN0IGluIGRpc3Ryb3NfZm9yX2xvY2F0aW9uKHVybCwgYmFzZSwgbWV0YWRhdGEpOgogICAgICAgIHlpZWxkIGRpc3QKICAgIGlmIGZyYWdtZW50OgogICAgICAgIG1hdGNoID0gRUdHX0ZSQUdNRU5ULm1hdGNoKGZyYWdtZW50KQogICAgICAgIGlmIG1hdGNoOgogICAgICAgICAgICBmb3IgZGlzdCBpbiBpbnRlcnByZXRfZGlzdHJvX25hbWUoCiAgICAgICAgICAgICAgICB1cmwsIG1hdGNoLmdyb3VwKDEpLCBtZXRhZGF0YSwgcHJlY2VkZW5jZT1DSEVDS09VVF9ESVNUCiAgICAgICAgICAgICk6CiAgICAgICAgICAgICAgICB5aWVsZCBkaXN0CgoKZGVmIGRpc3Ryb3NfZm9yX2xvY2F0aW9uKGxvY2F0aW9uLCBiYXNlbmFtZSwgbWV0YWRhdGE9Tm9uZSk6CiAgICAiIiJZaWVsZCBlZ2cgb3Igc291cmNlIGRpc3RyaWJ1dGlvbiBvYmplY3RzIGJhc2VkIG9uIGJhc2VuYW1lIiIiCiAgICBpZiBiYXNlbmFtZS5lbmRzd2l0aCgnLmVnZy56aXAnKToKICAgICAgICBiYXNlbmFtZSA9IGJhc2VuYW1lWzotNF0gICMgc3RyaXAgdGhlIC56aXAKICAgIGlmIGJhc2VuYW1lLmVuZHN3aXRoKCcuZWdnJykgYW5kICctJyBpbiBiYXNlbmFtZToKICAgICAgICAjIG9ubHkgb25lLCB1bmFtYmlndW91cyBpbnRlcnByZXRhdGlvbgogICAgICAgIHJldHVybiBbRGlzdHJpYnV0aW9uLmZyb21fbG9jYXRpb24obG9jYXRpb24sIGJhc2VuYW1lLCBtZXRhZGF0YSldCiAgICBpZiBiYXNlbmFtZS5lbmRzd2l0aCgnLndobCcpIGFuZCAnLScgaW4gYmFzZW5hbWU6CiAgICAgICAgd2hlZWwgPSBXaGVlbChiYXNlbmFtZSkKICAgICAgICBpZiBub3Qgd2hlZWwuaXNfY29tcGF0aWJsZSgpOgogICAgICAgICAgICByZXR1cm4gW10KICAgICAgICByZXR1cm4gW0Rpc3RyaWJ1dGlvbigKICAgICAgICAgICAgbG9jYXRpb249bG9jYXRpb24sCiAgICAgICAgICAgIHByb2plY3RfbmFtZT13aGVlbC5wcm9qZWN0X25hbWUsCiAgICAgICAgICAgIHZlcnNpb249d2hlZWwudmVyc2lvbiwKICAgICAgICAgICAgIyBJbmNyZWFzZSBwcmlvcml0eSBvdmVyIGVnZ3MuCiAgICAgICAgICAgIHByZWNlZGVuY2U9RUdHX0RJU1QgKyAxLAogICAgICAgICldCiAgICBpZiBiYXNlbmFtZS5lbmRzd2l0aCgnLmV4ZScpOgogICAgICAgIHdpbl9iYXNlLCBweV92ZXIsIHBsYXRmb3JtID0gcGFyc2VfYmRpc3Rfd2luaW5zdChiYXNlbmFtZSkKICAgICAgICBpZiB3aW5fYmFzZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuIGludGVycHJldF9kaXN0cm9fbmFtZSgKICAgICAgICAgICAgICAgIGxvY2F0aW9uLCB3aW5fYmFzZSwgbWV0YWRhdGEsIHB5X3ZlciwgQklOQVJZX0RJU1QsIHBsYXRmb3JtCiAgICAgICAgICAgICkKICAgICMgVHJ5IHNvdXJjZSBkaXN0cm8gZXh0ZW5zaW9ucyAoLnppcCwgLnRneiwgZXRjLikKICAgICMKICAgIGZvciBleHQgaW4gRVhURU5TSU9OUzoKICAgICAgICBpZiBiYXNlbmFtZS5lbmRzd2l0aChleHQpOgogICAgICAgICAgICBiYXNlbmFtZSA9IGJhc2VuYW1lWzotbGVuKGV4dCldCiAgICAgICAgICAgIHJldHVybiBpbnRlcnByZXRfZGlzdHJvX25hbWUobG9jYXRpb24sIGJhc2VuYW1lLCBtZXRhZGF0YSkKICAgIHJldHVybiBbXSAgIyBubyBleHRlbnNpb24gbWF0Y2hlZAoKCmRlZiBkaXN0cm9zX2Zvcl9maWxlbmFtZShmaWxlbmFtZSwgbWV0YWRhdGE9Tm9uZSk6CiAgICAiIiJZaWVsZCBwb3NzaWJsZSBlZ2cgb3Igc291cmNlIGRpc3RyaWJ1dGlvbiBvYmplY3RzIGJhc2VkIG9uIGEgZmlsZW5hbWUiIiIKICAgIHJldHVybiBkaXN0cm9zX2Zvcl9sb2NhdGlvbigKICAgICAgICBub3JtYWxpemVfcGF0aChmaWxlbmFtZSksIG9zLnBhdGguYmFzZW5hbWUoZmlsZW5hbWUpLCBtZXRhZGF0YQogICAgKQoKCmRlZiBpbnRlcnByZXRfZGlzdHJvX25hbWUoCiAgICAgICAgbG9jYXRpb24sIGJhc2VuYW1lLCBtZXRhZGF0YSwgcHlfdmVyc2lvbj1Ob25lLCBwcmVjZWRlbmNlPVNPVVJDRV9ESVNULAogICAgICAgIHBsYXRmb3JtPU5vbmUKKToKICAgICIiIkdlbmVyYXRlIGFsdGVybmF0aXZlIGludGVycHJldGF0aW9ucyBvZiBhIHNvdXJjZSBkaXN0cm8gbmFtZQoKICAgIE5vdGU6IGlmIGBsb2NhdGlvbmAgaXMgYSBmaWxlc3lzdGVtIGZpbGVuYW1lLCB5b3Ugc2hvdWxkIGNhbGwKICAgIGBgcGtnX3Jlc291cmNlcy5ub3JtYWxpemVfcGF0aCgpYGAgb24gaXQgYmVmb3JlIHBhc3NpbmcgaXQgdG8gdGhpcwogICAgcm91dGluZSEKICAgICIiIgogICAgIyBHZW5lcmF0ZSBhbHRlcm5hdGl2ZSBpbnRlcnByZXRhdGlvbnMgb2YgYSBzb3VyY2UgZGlzdHJvIG5hbWUKICAgICMgQmVjYXVzZSBzb21lIHBhY2thZ2VzIGFyZSBhbWJpZ3VvdXMgYXMgdG8gbmFtZS92ZXJzaW9ucyBzcGxpdAogICAgIyBlLmcuICJhZG5zLXB5dGhvbi0xLjEuMCIsICJlZ2VuaXgtbXgtY29tbWVyY2lhbCIsIGV0Yy4KICAgICMgU28sIHdlIGdlbmVyYXRlIGVhY2ggcG9zc2libGUgaW50ZXJlcHJldGF0aW9uIChlLmcuICJhZG5zLCBweXRob24tMS4xLjAiCiAgICAjICJhZG5zLXB5dGhvbiwgMS4xLjAiLCBhbmQgImFkbnMtcHl0aG9uLTEuMS4wLCBubyB2ZXJzaW9uIikuICBJbiBwcmFjdGljZSwKICAgICMgdGhlIHNwdXJpb3VzIGludGVycHJldGF0aW9ucyBzaG91bGQgYmUgaWdub3JlZCwgYmVjYXVzZSBpbiB0aGUgZXZlbnQKICAgICMgdGhlcmUncyBhbHNvIGFuICJhZG5zIiBwYWNrYWdlLCB0aGUgc3B1cmlvdXMgInB5dGhvbi0xLjEuMCIgdmVyc2lvbiB3aWxsCiAgICAjIGNvbXBhcmUgbG93ZXIgdGhhbiBhbnkgbnVtZXJpYyB2ZXJzaW9uIG51bWJlciwgYW5kIGlzIHRoZXJlZm9yZSB1bmxpa2VseQogICAgIyB0byBtYXRjaCBhIHJlcXVlc3QgZm9yIGl0LiAgSXQncyBzdGlsbCBhIHBvdGVudGlhbCBwcm9ibGVtLCB0aG91Z2gsIGFuZAogICAgIyBpbiB0aGUgbG9uZyBydW4gUHlQSSBhbmQgdGhlIGRpc3R1dGlscyBzaG91bGQgZ28gZm9yICJzYWZlIiBuYW1lcyBhbmQKICAgICMgdmVyc2lvbnMgaW4gZGlzdHJpYnV0aW9uIGFyY2hpdmUgbmFtZXMgKHNkaXN0IGFuZCBiZGlzdCkuCgogICAgcGFydHMgPSBiYXNlbmFtZS5zcGxpdCgnLScpCiAgICBpZiBub3QgcHlfdmVyc2lvbiBhbmQgYW55KHJlLm1hdGNoKHIncHlcZFwuXGQkJywgcCkgZm9yIHAgaW4gcGFydHNbMjpdKToKICAgICAgICAjIGl0IGlzIGEgYmRpc3RfZHVtYiwgbm90IGFuIHNkaXN0IC0tIGJhaWwgb3V0CiAgICAgICAgcmV0dXJuCgogICAgZm9yIHAgaW4gcmFuZ2UoMSwgbGVuKHBhcnRzKSArIDEpOgogICAgICAgIHlpZWxkIERpc3RyaWJ1dGlvbigKICAgICAgICAgICAgbG9jYXRpb24sIG1ldGFkYXRhLCAnLScuam9pbihwYXJ0c1s6cF0pLCAnLScuam9pbihwYXJ0c1twOl0pLAogICAgICAgICAgICBweV92ZXJzaW9uPXB5X3ZlcnNpb24sIHByZWNlZGVuY2U9cHJlY2VkZW5jZSwKICAgICAgICAgICAgcGxhdGZvcm09cGxhdGZvcm0KICAgICAgICApCgoKIyBGcm9tIFB5dGhvbiAyLjcgZG9jcwpkZWYgdW5pcXVlX2V2ZXJzZWVuKGl0ZXJhYmxlLCBrZXk9Tm9uZSk6CiAgICAiTGlzdCB1bmlxdWUgZWxlbWVudHMsIHByZXNlcnZpbmcgb3JkZXIuIFJlbWVtYmVyIGFsbCBlbGVtZW50cyBldmVyIHNlZW4uIgogICAgIyB1bmlxdWVfZXZlcnNlZW4oJ0FBQUFCQkJDQ0RBQUJCQicpIC0tPiBBIEIgQyBECiAgICAjIHVuaXF1ZV9ldmVyc2VlbignQUJCQ2NBRCcsIHN0ci5sb3dlcikgLS0+IEEgQiBDIEQKICAgIHNlZW4gPSBzZXQoKQogICAgc2Vlbl9hZGQgPSBzZWVuLmFkZAogICAgaWYga2V5IGlzIE5vbmU6CiAgICAgICAgZm9yIGVsZW1lbnQgaW4gc2l4Lm1vdmVzLmZpbHRlcmZhbHNlKHNlZW4uX19jb250YWluc19fLCBpdGVyYWJsZSk6CiAgICAgICAgICAgIHNlZW5fYWRkKGVsZW1lbnQpCiAgICAgICAgICAgIHlpZWxkIGVsZW1lbnQKICAgIGVsc2U6CiAgICAgICAgZm9yIGVsZW1lbnQgaW4gaXRlcmFibGU6CiAgICAgICAgICAgIGsgPSBrZXkoZWxlbWVudCkKICAgICAgICAgICAgaWYgayBub3QgaW4gc2VlbjoKICAgICAgICAgICAgICAgIHNlZW5fYWRkKGspCiAgICAgICAgICAgICAgICB5aWVsZCBlbGVtZW50CgoKZGVmIHVuaXF1ZV92YWx1ZXMoZnVuYyk6CiAgICAiIiIKICAgIFdyYXAgYSBmdW5jdGlvbiByZXR1cm5pbmcgYW4gaXRlcmFibGUgc3VjaCB0aGF0IHRoZSByZXN1bHRpbmcgaXRlcmFibGUKICAgIG9ubHkgZXZlciB5aWVsZHMgdW5pcXVlIGl0ZW1zLgogICAgIiIiCgogICAgQHdyYXBzKGZ1bmMpCiAgICBkZWYgd3JhcHBlcigqYXJncywgKiprd2FyZ3MpOgogICAgICAgIHJldHVybiB1bmlxdWVfZXZlcnNlZW4oZnVuYygqYXJncywgKiprd2FyZ3MpKQoKICAgIHJldHVybiB3cmFwcGVyCgoKUkVMID0gcmUuY29tcGlsZShyIiIiPChbXj5dKlxzcmVsXHMqPVxzKlsnIl0/KFteJyI+XSspW14+XSopPiIiIiwgcmUuSSkKIyB0aGlzIGxpbmUgaXMgaGVyZSB0byBmaXggZW1hY3MnIGNydWRkeSBicm9rZW4gc3ludGF4IGhpZ2hsaWdodGluZwoKCkB1bmlxdWVfdmFsdWVzCmRlZiBmaW5kX2V4dGVybmFsX2xpbmtzKHVybCwgcGFnZSk6CiAgICAiIiJGaW5kIHJlbD0iaG9tZXBhZ2UiIGFuZCByZWw9ImRvd25sb2FkIiBsaW5rcyBpbiBgcGFnZWAsIHlpZWxkaW5nIFVSTHMiIiIKCiAgICBmb3IgbWF0Y2ggaW4gUkVMLmZpbmRpdGVyKHBhZ2UpOgogICAgICAgIHRhZywgcmVsID0gbWF0Y2guZ3JvdXBzKCkKICAgICAgICByZWxzID0gc2V0KG1hcChzdHIuc3RyaXAsIHJlbC5sb3dlcigpLnNwbGl0KCcsJykpKQogICAgICAgIGlmICdob21lcGFnZScgaW4gcmVscyBvciAnZG93bmxvYWQnIGluIHJlbHM6CiAgICAgICAgICAgIGZvciBtYXRjaCBpbiBIUkVGLmZpbmRpdGVyKHRhZyk6CiAgICAgICAgICAgICAgICB5aWVsZCB1cmxsaWIucGFyc2UudXJsam9pbih1cmwsIGh0bWxkZWNvZGUobWF0Y2guZ3JvdXAoMSkpKQoKICAgIGZvciB0YWcgaW4gKCI8dGg+SG9tZSBQYWdlIiwgIjx0aD5Eb3dubG9hZCBVUkwiKToKICAgICAgICBwb3MgPSBwYWdlLmZpbmQodGFnKQogICAgICAgIGlmIHBvcyAhPSAtMToKICAgICAgICAgICAgbWF0Y2ggPSBIUkVGLnNlYXJjaChwYWdlLCBwb3MpCiAgICAgICAgICAgIGlmIG1hdGNoOgogICAgICAgICAgICAgICAgeWllbGQgdXJsbGliLnBhcnNlLnVybGpvaW4odXJsLCBodG1sZGVjb2RlKG1hdGNoLmdyb3VwKDEpKSkKCgpjbGFzcyBDb250ZW50Q2hlY2tlcjoKICAgICIiIgogICAgQSBudWxsIGNvbnRlbnQgY2hlY2tlciB0aGF0IGRlZmluZXMgdGhlIGludGVyZmFjZSBmb3IgY2hlY2tpbmcgY29udGVudAogICAgIiIiCgogICAgZGVmIGZlZWQoc2VsZiwgYmxvY2spOgogICAgICAgICIiIgogICAgICAgIEZlZWQgYSBibG9jayBvZiBkYXRhIHRvIHRoZSBoYXNoLgogICAgICAgICIiIgogICAgICAgIHJldHVybgoKICAgIGRlZiBpc192YWxpZChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBDaGVjayB0aGUgaGFzaC4gUmV0dXJuIEZhbHNlIGlmIHZhbGlkYXRpb24gZmFpbHMuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgcmVwb3J0KHNlbGYsIHJlcG9ydGVyLCB0ZW1wbGF0ZSk6CiAgICAgICAgIiIiCiAgICAgICAgQ2FsbCByZXBvcnRlciB3aXRoIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjaGVja2VyIChoYXNoIG5hbWUpCiAgICAgICAgc3Vic3RpdHV0ZWQgaW50byB0aGUgdGVtcGxhdGUuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuCgoKY2xhc3MgSGFzaENoZWNrZXIoQ29udGVudENoZWNrZXIpOgogICAgcGF0dGVybiA9IHJlLmNvbXBpbGUoCiAgICAgICAgcicoP1A8aGFzaF9uYW1lPnNoYTF8c2hhMjI0fHNoYTM4NHxzaGEyNTZ8c2hhNTEyfG1kNSk9JwogICAgICAgIHInKD9QPGV4cGVjdGVkPlthLWYwLTldKyknCiAgICApCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGhhc2hfbmFtZSwgZXhwZWN0ZWQpOgogICAgICAgIHNlbGYuaGFzaF9uYW1lID0gaGFzaF9uYW1lCiAgICAgICAgc2VsZi5oYXNoID0gaGFzaGxpYi5uZXcoaGFzaF9uYW1lKQogICAgICAgIHNlbGYuZXhwZWN0ZWQgPSBleHBlY3RlZAoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGZyb21fdXJsKGNscywgdXJsKToKICAgICAgICAiQ29uc3RydWN0IGEgKHBvc3NpYmx5IG51bGwpIENvbnRlbnRDaGVja2VyIGZyb20gYSBVUkwiCiAgICAgICAgZnJhZ21lbnQgPSB1cmxsaWIucGFyc2UudXJscGFyc2UodXJsKVstMV0KICAgICAgICBpZiBub3QgZnJhZ21lbnQ6CiAgICAgICAgICAgIHJldHVybiBDb250ZW50Q2hlY2tlcigpCiAgICAgICAgbWF0Y2ggPSBjbHMucGF0dGVybi5zZWFyY2goZnJhZ21lbnQpCiAgICAgICAgaWYgbm90IG1hdGNoOgogICAgICAgICAgICByZXR1cm4gQ29udGVudENoZWNrZXIoKQogICAgICAgIHJldHVybiBjbHMoKiptYXRjaC5ncm91cGRpY3QoKSkKCiAgICBkZWYgZmVlZChzZWxmLCBibG9jayk6CiAgICAgICAgc2VsZi5oYXNoLnVwZGF0ZShibG9jaykKCiAgICBkZWYgaXNfdmFsaWQoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuaGFzaC5oZXhkaWdlc3QoKSA9PSBzZWxmLmV4cGVjdGVkCgogICAgZGVmIHJlcG9ydChzZWxmLCByZXBvcnRlciwgdGVtcGxhdGUpOgogICAgICAgIG1zZyA9IHRlbXBsYXRlICUgc2VsZi5oYXNoX25hbWUKICAgICAgICByZXR1cm4gcmVwb3J0ZXIobXNnKQoKCmNsYXNzIFBhY2thZ2VJbmRleChFbnZpcm9ubWVudCk6CiAgICAiIiJBIGRpc3RyaWJ1dGlvbiBpbmRleCB0aGF0IHNjYW5zIHdlYiBwYWdlcyBmb3IgZG93bmxvYWQgVVJMcyIiIgoKICAgIGRlZiBfX2luaXRfXygKICAgICAgICAgICAgc2VsZiwgaW5kZXhfdXJsPSJodHRwczovL3B5cGkub3JnL3NpbXBsZS8iLCBob3N0cz0oJyonLCksCiAgICAgICAgICAgIGNhX2J1bmRsZT1Ob25lLCB2ZXJpZnlfc3NsPVRydWUsICphcmdzLCAqKmt3CiAgICApOgogICAgICAgIEVudmlyb25tZW50Ll9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3KQogICAgICAgIHNlbGYuaW5kZXhfdXJsID0gaW5kZXhfdXJsICsgIi8iIFs6bm90IGluZGV4X3VybC5lbmRzd2l0aCgnLycpXQogICAgICAgIHNlbGYuc2Nhbm5lZF91cmxzID0ge30KICAgICAgICBzZWxmLmZldGNoZWRfdXJscyA9IHt9CiAgICAgICAgc2VsZi5wYWNrYWdlX3BhZ2VzID0ge30KICAgICAgICBzZWxmLmFsbG93cyA9IHJlLmNvbXBpbGUoJ3wnLmpvaW4obWFwKHRyYW5zbGF0ZSwgaG9zdHMpKSkubWF0Y2gKICAgICAgICBzZWxmLnRvX3NjYW4gPSBbXQogICAgICAgIHVzZV9zc2wgPSAoCiAgICAgICAgICAgIHZlcmlmeV9zc2wKICAgICAgICAgICAgYW5kIHNzbF9zdXBwb3J0LmlzX2F2YWlsYWJsZQogICAgICAgICAgICBhbmQgKGNhX2J1bmRsZSBvciBzc2xfc3VwcG9ydC5maW5kX2NhX2J1bmRsZSgpKQogICAgICAgICkKICAgICAgICBpZiB1c2Vfc3NsOgogICAgICAgICAgICBzZWxmLm9wZW5lciA9IHNzbF9zdXBwb3J0Lm9wZW5lcl9mb3IoY2FfYnVuZGxlKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYub3BlbmVyID0gdXJsbGliLnJlcXVlc3QudXJsb3BlbgoKICAgIGRlZiBwcm9jZXNzX3VybChzZWxmLCB1cmwsIHJldHJpZXZlPUZhbHNlKToKICAgICAgICAiIiJFdmFsdWF0ZSBhIFVSTCBhcyBhIHBvc3NpYmxlIGRvd25sb2FkLCBhbmQgbWF5YmUgcmV0cmlldmUgaXQiIiIKICAgICAgICBpZiB1cmwgaW4gc2VsZi5zY2FubmVkX3VybHMgYW5kIG5vdCByZXRyaWV2ZToKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgc2VsZi5zY2FubmVkX3VybHNbdXJsXSA9IFRydWUKICAgICAgICBpZiBub3QgVVJMX1NDSEVNRSh1cmwpOgogICAgICAgICAgICBzZWxmLnByb2Nlc3NfZmlsZW5hbWUodXJsKQogICAgICAgICAgICByZXR1cm4KICAgICAgICBlbHNlOgogICAgICAgICAgICBkaXN0cyA9IGxpc3QoZGlzdHJvc19mb3JfdXJsKHVybCkpCiAgICAgICAgICAgIGlmIGRpc3RzOgogICAgICAgICAgICAgICAgaWYgbm90IHNlbGYudXJsX29rKHVybCk6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICAgICBzZWxmLmRlYnVnKCJGb3VuZCBsaW5rOiAlcyIsIHVybCkKCiAgICAgICAgaWYgZGlzdHMgb3Igbm90IHJldHJpZXZlIG9yIHVybCBpbiBzZWxmLmZldGNoZWRfdXJsczoKICAgICAgICAgICAgbGlzdChtYXAoc2VsZi5hZGQsIGRpc3RzKSkKICAgICAgICAgICAgcmV0dXJuICAjIGRvbid0IG5lZWQgdGhlIGFjdHVhbCBwYWdlCgogICAgICAgIGlmIG5vdCBzZWxmLnVybF9vayh1cmwpOgogICAgICAgICAgICBzZWxmLmZldGNoZWRfdXJsc1t1cmxdID0gVHJ1ZQogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgc2VsZi5pbmZvKCJSZWFkaW5nICVzIiwgdXJsKQogICAgICAgIHNlbGYuZmV0Y2hlZF91cmxzW3VybF0gPSBUcnVlICAjIHByZXZlbnQgbXVsdGlwbGUgZmV0Y2ggYXR0ZW1wdHMKICAgICAgICB0bXBsID0gIkRvd25sb2FkIGVycm9yIG9uICVzOiAlJXMgLS0gU29tZSBwYWNrYWdlcyBtYXkgbm90IGJlIGZvdW5kISIKICAgICAgICBmID0gc2VsZi5vcGVuX3VybCh1cmwsIHRtcGwgJSB1cmwpCiAgICAgICAgaWYgZiBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBzZWxmLmZldGNoZWRfdXJsc1tmLnVybF0gPSBUcnVlCiAgICAgICAgaWYgJ2h0bWwnIG5vdCBpbiBmLmhlYWRlcnMuZ2V0KCdjb250ZW50LXR5cGUnLCAnJykubG93ZXIoKToKICAgICAgICAgICAgZi5jbG9zZSgpICAjIG5vdCBodG1sLCB3ZSBjYW4ndCBwcm9jZXNzIGl0CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBiYXNlID0gZi51cmwgICMgaGFuZGxlIHJlZGlyZWN0cwogICAgICAgIHBhZ2UgPSBmLnJlYWQoKQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHBhZ2UsIHN0cik6CiAgICAgICAgICAgICMgSW4gUHl0aG9uIDMgYW5kIGdvdCBieXRlcyBidXQgd2FudCBzdHIuCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZiwgdXJsbGliLmVycm9yLkhUVFBFcnJvcik6CiAgICAgICAgICAgICAgICAjIEVycm9ycyBoYXZlIG5vIGNoYXJzZXQsIGFzc3VtZSBsYXRpbjE6CiAgICAgICAgICAgICAgICBjaGFyc2V0ID0gJ2xhdGluLTEnCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBjaGFyc2V0ID0gZi5oZWFkZXJzLmdldF9wYXJhbSgnY2hhcnNldCcpIG9yICdsYXRpbi0xJwogICAgICAgICAgICBwYWdlID0gcGFnZS5kZWNvZGUoY2hhcnNldCwgImlnbm9yZSIpCiAgICAgICAgZi5jbG9zZSgpCiAgICAgICAgZm9yIG1hdGNoIGluIEhSRUYuZmluZGl0ZXIocGFnZSk6CiAgICAgICAgICAgIGxpbmsgPSB1cmxsaWIucGFyc2UudXJsam9pbihiYXNlLCBodG1sZGVjb2RlKG1hdGNoLmdyb3VwKDEpKSkKICAgICAgICAgICAgc2VsZi5wcm9jZXNzX3VybChsaW5rKQogICAgICAgIGlmIHVybC5zdGFydHN3aXRoKHNlbGYuaW5kZXhfdXJsKSBhbmQgZ2V0YXR0cihmLCAnY29kZScsIE5vbmUpICE9IDQwNDoKICAgICAgICAgICAgcGFnZSA9IHNlbGYucHJvY2Vzc19pbmRleCh1cmwsIHBhZ2UpCgogICAgZGVmIHByb2Nlc3NfZmlsZW5hbWUoc2VsZiwgZm4sIG5lc3RlZD1GYWxzZSk6CiAgICAgICAgIyBwcm9jZXNzIGZpbGVuYW1lcyBvciBkaXJlY3RvcmllcwogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhmbik6CiAgICAgICAgICAgIHNlbGYud2FybigiTm90IGZvdW5kOiAlcyIsIGZuKQogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgaWYgb3MucGF0aC5pc2RpcihmbikgYW5kIG5vdCBuZXN0ZWQ6CiAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLnJlYWxwYXRoKGZuKQogICAgICAgICAgICBmb3IgaXRlbSBpbiBvcy5saXN0ZGlyKHBhdGgpOgogICAgICAgICAgICAgICAgc2VsZi5wcm9jZXNzX2ZpbGVuYW1lKG9zLnBhdGguam9pbihwYXRoLCBpdGVtKSwgVHJ1ZSkKCiAgICAgICAgZGlzdHMgPSBkaXN0cm9zX2Zvcl9maWxlbmFtZShmbikKICAgICAgICBpZiBkaXN0czoKICAgICAgICAgICAgc2VsZi5kZWJ1ZygiRm91bmQ6ICVzIiwgZm4pCiAgICAgICAgICAgIGxpc3QobWFwKHNlbGYuYWRkLCBkaXN0cykpCgogICAgZGVmIHVybF9vayhzZWxmLCB1cmwsIGZhdGFsPUZhbHNlKToKICAgICAgICBzID0gVVJMX1NDSEVNRSh1cmwpCiAgICAgICAgaXNfZmlsZSA9IHMgYW5kIHMuZ3JvdXAoMSkubG93ZXIoKSA9PSAnZmlsZScKICAgICAgICBpZiBpc19maWxlIG9yIHNlbGYuYWxsb3dzKHVybGxpYi5wYXJzZS51cmxwYXJzZSh1cmwpWzFdKToKICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICBtc2cgPSAoCiAgICAgICAgICAgICJcbk5vdGU6IEJ5cGFzc2luZyAlcyAoZGlzYWxsb3dlZCBob3N0OyBzZWUgIgogICAgICAgICAgICAiaHR0cDovL2JpdC5seS8yaHJJbW5ZIGZvciBkZXRhaWxzKS5cbiIpCiAgICAgICAgaWYgZmF0YWw6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKG1zZyAlIHVybCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLndhcm4obXNnLCB1cmwpCgogICAgZGVmIHNjYW5fZWdnX2xpbmtzKHNlbGYsIHNlYXJjaF9wYXRoKToKICAgICAgICBkaXJzID0gZmlsdGVyKG9zLnBhdGguaXNkaXIsIHNlYXJjaF9wYXRoKQogICAgICAgIGVnZ19saW5rcyA9ICgKICAgICAgICAgICAgKHBhdGgsIGVudHJ5KQogICAgICAgICAgICBmb3IgcGF0aCBpbiBkaXJzCiAgICAgICAgICAgIGZvciBlbnRyeSBpbiBvcy5saXN0ZGlyKHBhdGgpCiAgICAgICAgICAgIGlmIGVudHJ5LmVuZHN3aXRoKCcuZWdnLWxpbmsnKQogICAgICAgICkKICAgICAgICBsaXN0KGl0ZXJ0b29scy5zdGFybWFwKHNlbGYuc2Nhbl9lZ2dfbGluaywgZWdnX2xpbmtzKSkKCiAgICBkZWYgc2Nhbl9lZ2dfbGluayhzZWxmLCBwYXRoLCBlbnRyeSk6CiAgICAgICAgd2l0aCBvcGVuKG9zLnBhdGguam9pbihwYXRoLCBlbnRyeSkpIGFzIHJhd19saW5lczoKICAgICAgICAgICAgIyBmaWx0ZXIgbm9uLWVtcHR5IGxpbmVzCiAgICAgICAgICAgIGxpbmVzID0gbGlzdChmaWx0ZXIoTm9uZSwgbWFwKHN0ci5zdHJpcCwgcmF3X2xpbmVzKSkpCgogICAgICAgIGlmIGxlbihsaW5lcykgIT0gMjoKICAgICAgICAgICAgIyBmb3JtYXQgaXMgbm90IHJlY29nbml6ZWQ7IHB1bnQKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGVnZ19wYXRoLCBzZXR1cF9wYXRoID0gbGluZXMKCiAgICAgICAgZm9yIGRpc3QgaW4gZmluZF9kaXN0cmlidXRpb25zKG9zLnBhdGguam9pbihwYXRoLCBlZ2dfcGF0aCkpOgogICAgICAgICAgICBkaXN0LmxvY2F0aW9uID0gb3MucGF0aC5qb2luKHBhdGgsICpsaW5lcykKICAgICAgICAgICAgZGlzdC5wcmVjZWRlbmNlID0gU09VUkNFX0RJU1QKICAgICAgICAgICAgc2VsZi5hZGQoZGlzdCkKCiAgICBkZWYgcHJvY2Vzc19pbmRleChzZWxmLCB1cmwsIHBhZ2UpOgogICAgICAgICIiIlByb2Nlc3MgdGhlIGNvbnRlbnRzIG9mIGEgUHlQSSBwYWdlIiIiCgogICAgICAgIGRlZiBzY2FuKGxpbmspOgogICAgICAgICAgICAjIFByb2Nlc3MgYSBVUkwgdG8gc2VlIGlmIGl0J3MgZm9yIGEgcGFja2FnZSBwYWdlCiAgICAgICAgICAgIGlmIGxpbmsuc3RhcnRzd2l0aChzZWxmLmluZGV4X3VybCk6CiAgICAgICAgICAgICAgICBwYXJ0cyA9IGxpc3QobWFwKAogICAgICAgICAgICAgICAgICAgIHVybGxpYi5wYXJzZS51bnF1b3RlLCBsaW5rW2xlbihzZWxmLmluZGV4X3VybCk6XS5zcGxpdCgnLycpCiAgICAgICAgICAgICAgICApKQogICAgICAgICAgICAgICAgaWYgbGVuKHBhcnRzKSA9PSAyIGFuZCAnIycgbm90IGluIHBhcnRzWzFdOgogICAgICAgICAgICAgICAgICAgICMgaXQncyBhIHBhY2thZ2UgcGFnZSwgc2FuaXRpemUgYW5kIGluZGV4IGl0CiAgICAgICAgICAgICAgICAgICAgcGtnID0gc2FmZV9uYW1lKHBhcnRzWzBdKQogICAgICAgICAgICAgICAgICAgIHZlciA9IHNhZmVfdmVyc2lvbihwYXJ0c1sxXSkKICAgICAgICAgICAgICAgICAgICBzZWxmLnBhY2thZ2VfcGFnZXMuc2V0ZGVmYXVsdChwa2cubG93ZXIoKSwge30pW2xpbmtdID0gVHJ1ZQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0b19maWxlbmFtZShwa2cpLCB0b19maWxlbmFtZSh2ZXIpCiAgICAgICAgICAgIHJldHVybiBOb25lLCBOb25lCgogICAgICAgICMgcHJvY2VzcyBhbiBpbmRleCBwYWdlIGludG8gdGhlIHBhY2thZ2UtcGFnZSBpbmRleAogICAgICAgIGZvciBtYXRjaCBpbiBIUkVGLmZpbmRpdGVyKHBhZ2UpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBzY2FuKHVybGxpYi5wYXJzZS51cmxqb2luKHVybCwgaHRtbGRlY29kZShtYXRjaC5ncm91cCgxKSkpKQogICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgIHBhc3MKCiAgICAgICAgcGtnLCB2ZXIgPSBzY2FuKHVybCkgICMgZW5zdXJlIHRoaXMgcGFnZSBpcyBpbiB0aGUgcGFnZSBpbmRleAogICAgICAgIGlmIHBrZzoKICAgICAgICAgICAgIyBwcm9jZXNzIGluZGl2aWR1YWwgcGFja2FnZSBwYWdlCiAgICAgICAgICAgIGZvciBuZXdfdXJsIGluIGZpbmRfZXh0ZXJuYWxfbGlua3ModXJsLCBwYWdlKToKICAgICAgICAgICAgICAgICMgUHJvY2VzcyB0aGUgZm91bmQgVVJMCiAgICAgICAgICAgICAgICBiYXNlLCBmcmFnID0gZWdnX2luZm9fZm9yX3VybChuZXdfdXJsKQogICAgICAgICAgICAgICAgaWYgYmFzZS5lbmRzd2l0aCgnLnB5JykgYW5kIG5vdCBmcmFnOgogICAgICAgICAgICAgICAgICAgIGlmIHZlcjoKICAgICAgICAgICAgICAgICAgICAgICAgbmV3X3VybCArPSAnI2VnZz0lcy0lcycgJSAocGtnLCB2ZXIpCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5uZWVkX3ZlcnNpb25faW5mbyh1cmwpCiAgICAgICAgICAgICAgICBzZWxmLnNjYW5fdXJsKG5ld191cmwpCgogICAgICAgICAgICByZXR1cm4gUFlQSV9NRDUuc3ViKAogICAgICAgICAgICAgICAgbGFtYmRhIG06ICc8YSBocmVmPSIlcyNtZDU9JXMiPiVzPC9hPicgJSBtLmdyb3VwKDEsIDMsIDIpLCBwYWdlCiAgICAgICAgICAgICkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gIiIgICMgbm8gc2Vuc2UgZG91YmxlLXNjYW5uaW5nIG5vbi1wYWNrYWdlIHBhZ2VzCgogICAgZGVmIG5lZWRfdmVyc2lvbl9pbmZvKHNlbGYsIHVybCk6CiAgICAgICAgc2VsZi5zY2FuX2FsbCgKICAgICAgICAgICAgIlBhZ2UgYXQgJXMgbGlua3MgdG8gLnB5IGZpbGUocykgd2l0aG91dCB2ZXJzaW9uIGluZm87IGFuIGluZGV4ICIKICAgICAgICAgICAgInNjYW4gaXMgcmVxdWlyZWQuIiwgdXJsCiAgICAgICAgKQoKICAgIGRlZiBzY2FuX2FsbChzZWxmLCBtc2c9Tm9uZSwgKmFyZ3MpOgogICAgICAgIGlmIHNlbGYuaW5kZXhfdXJsIG5vdCBpbiBzZWxmLmZldGNoZWRfdXJsczoKICAgICAgICAgICAgaWYgbXNnOgogICAgICAgICAgICAgICAgc2VsZi53YXJuKG1zZywgKmFyZ3MpCiAgICAgICAgICAgIHNlbGYuaW5mbygKICAgICAgICAgICAgICAgICJTY2FubmluZyBpbmRleCBvZiBhbGwgcGFja2FnZXMgKHRoaXMgbWF5IHRha2UgYSB3aGlsZSkiCiAgICAgICAgICAgICkKICAgICAgICBzZWxmLnNjYW5fdXJsKHNlbGYuaW5kZXhfdXJsKQoKICAgIGRlZiBmaW5kX3BhY2thZ2VzKHNlbGYsIHJlcXVpcmVtZW50KToKICAgICAgICBzZWxmLnNjYW5fdXJsKHNlbGYuaW5kZXhfdXJsICsgcmVxdWlyZW1lbnQudW5zYWZlX25hbWUgKyAnLycpCgogICAgICAgIGlmIG5vdCBzZWxmLnBhY2thZ2VfcGFnZXMuZ2V0KHJlcXVpcmVtZW50LmtleSk6CiAgICAgICAgICAgICMgRmFsbCBiYWNrIHRvIHNhZmUgdmVyc2lvbiBvZiB0aGUgbmFtZQogICAgICAgICAgICBzZWxmLnNjYW5fdXJsKHNlbGYuaW5kZXhfdXJsICsgcmVxdWlyZW1lbnQucHJvamVjdF9uYW1lICsgJy8nKQoKICAgICAgICBpZiBub3Qgc2VsZi5wYWNrYWdlX3BhZ2VzLmdldChyZXF1aXJlbWVudC5rZXkpOgogICAgICAgICAgICAjIFdlIGNvdWxkbid0IGZpbmQgdGhlIHRhcmdldCBwYWNrYWdlLCBzbyBzZWFyY2ggdGhlIGluZGV4IHBhZ2UgdG9vCiAgICAgICAgICAgIHNlbGYubm90X2ZvdW5kX2luX2luZGV4KHJlcXVpcmVtZW50KQoKICAgICAgICBmb3IgdXJsIGluIGxpc3Qoc2VsZi5wYWNrYWdlX3BhZ2VzLmdldChyZXF1aXJlbWVudC5rZXksICgpKSk6CiAgICAgICAgICAgICMgc2NhbiBlYWNoIHBhZ2UgdGhhdCBtaWdodCBiZSByZWxhdGVkIHRvIHRoZSBkZXNpcmVkIHBhY2thZ2UKICAgICAgICAgICAgc2VsZi5zY2FuX3VybCh1cmwpCgogICAgZGVmIG9idGFpbihzZWxmLCByZXF1aXJlbWVudCwgaW5zdGFsbGVyPU5vbmUpOgogICAgICAgIHNlbGYucHJlc2NhbigpCiAgICAgICAgc2VsZi5maW5kX3BhY2thZ2VzKHJlcXVpcmVtZW50KQogICAgICAgIGZvciBkaXN0IGluIHNlbGZbcmVxdWlyZW1lbnQua2V5XToKICAgICAgICAgICAgaWYgZGlzdCBpbiByZXF1aXJlbWVudDoKICAgICAgICAgICAgICAgIHJldHVybiBkaXN0CiAgICAgICAgICAgIHNlbGYuZGVidWcoIiVzIGRvZXMgbm90IG1hdGNoICVzIiwgcmVxdWlyZW1lbnQsIGRpc3QpCiAgICAgICAgcmV0dXJuIHN1cGVyKFBhY2thZ2VJbmRleCwgc2VsZikub2J0YWluKHJlcXVpcmVtZW50LCBpbnN0YWxsZXIpCgogICAgZGVmIGNoZWNrX2hhc2goc2VsZiwgY2hlY2tlciwgZmlsZW5hbWUsIHRmcCk6CiAgICAgICAgIiIiCiAgICAgICAgY2hlY2tlciBpcyBhIENvbnRlbnRDaGVja2VyCiAgICAgICAgIiIiCiAgICAgICAgY2hlY2tlci5yZXBvcnQoCiAgICAgICAgICAgIHNlbGYuZGVidWcsCiAgICAgICAgICAgICJWYWxpZGF0aW5nICUlcyBjaGVja3N1bSBmb3IgJXMiICUgZmlsZW5hbWUpCiAgICAgICAgaWYgbm90IGNoZWNrZXIuaXNfdmFsaWQoKToKICAgICAgICAgICAgdGZwLmNsb3NlKCkKICAgICAgICAgICAgb3MudW5saW5rKGZpbGVuYW1lKQogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcigKICAgICAgICAgICAgICAgICIlcyB2YWxpZGF0aW9uIGZhaWxlZCBmb3IgJXM7ICIKICAgICAgICAgICAgICAgICJwb3NzaWJsZSBkb3dubG9hZCBwcm9ibGVtPyIKICAgICAgICAgICAgICAgICUgKGNoZWNrZXIuaGFzaC5uYW1lLCBvcy5wYXRoLmJhc2VuYW1lKGZpbGVuYW1lKSkKICAgICAgICAgICAgKQoKICAgIGRlZiBhZGRfZmluZF9saW5rcyhzZWxmLCB1cmxzKToKICAgICAgICAiIiJBZGQgYHVybHNgIHRvIHRoZSBsaXN0IHRoYXQgd2lsbCBiZSBwcmVzY2FubmVkIGZvciBzZWFyY2hlcyIiIgogICAgICAgIGZvciB1cmwgaW4gdXJsczoKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgc2VsZi50b19zY2FuIGlzIE5vbmUgICMgaWYgd2UgaGF2ZSBhbHJlYWR5ICJnb25lIG9ubGluZSIKICAgICAgICAgICAgICAgIG9yIG5vdCBVUkxfU0NIRU1FKHVybCkgICMgb3IgaXQncyBhIGxvY2FsIGZpbGUvZGlyZWN0b3J5CiAgICAgICAgICAgICAgICBvciB1cmwuc3RhcnRzd2l0aCgnZmlsZTonKQogICAgICAgICAgICAgICAgb3IgbGlzdChkaXN0cm9zX2Zvcl91cmwodXJsKSkgICMgb3IgYSBkaXJlY3QgcGFja2FnZSBsaW5rCiAgICAgICAgICAgICk6CiAgICAgICAgICAgICAgICAjIHRoZW4gZ28gYWhlYWQgYW5kIHByb2Nlc3MgaXQgbm93CiAgICAgICAgICAgICAgICBzZWxmLnNjYW5fdXJsKHVybCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgb3RoZXJ3aXNlLCBkZWZlciByZXRyaWV2YWwgdGlsbCBsYXRlcgogICAgICAgICAgICAgICAgc2VsZi50b19zY2FuLmFwcGVuZCh1cmwpCgogICAgZGVmIHByZXNjYW4oc2VsZik6CiAgICAgICAgIiIiU2NhbiB1cmxzIHNjaGVkdWxlZCBmb3IgcHJlc2Nhbm5pbmcgKGUuZy4gLS1maW5kLWxpbmtzKSIiIgogICAgICAgIGlmIHNlbGYudG9fc2NhbjoKICAgICAgICAgICAgbGlzdChtYXAoc2VsZi5zY2FuX3VybCwgc2VsZi50b19zY2FuKSkKICAgICAgICBzZWxmLnRvX3NjYW4gPSBOb25lICAjIGZyb20gbm93IG9uLCBnbyBhaGVhZCBhbmQgcHJvY2VzcyBpbW1lZGlhdGVseQoKICAgIGRlZiBub3RfZm91bmRfaW5faW5kZXgoc2VsZiwgcmVxdWlyZW1lbnQpOgogICAgICAgIGlmIHNlbGZbcmVxdWlyZW1lbnQua2V5XTogICMgd2UndmUgc2VlbiBhdCBsZWFzdCBvbmUgZGlzdHJvCiAgICAgICAgICAgIG1ldGgsIG1zZyA9IHNlbGYuaW5mbywgIkNvdWxkbid0IHJldHJpZXZlIGluZGV4IHBhZ2UgZm9yICVyIgogICAgICAgIGVsc2U6ICAjIG5vIGRpc3Ryb3Mgc2VlbiBmb3IgdGhpcyBuYW1lLCBtaWdodCBiZSBtaXNzcGVsbGVkCiAgICAgICAgICAgIG1ldGgsIG1zZyA9ICgKICAgICAgICAgICAgICAgIHNlbGYud2FybiwKICAgICAgICAgICAgICAgICJDb3VsZG4ndCBmaW5kIGluZGV4IHBhZ2UgZm9yICVyIChtYXliZSBtaXNzcGVsbGVkPykiKQogICAgICAgIG1ldGgobXNnLCByZXF1aXJlbWVudC51bnNhZmVfbmFtZSkKICAgICAgICBzZWxmLnNjYW5fYWxsKCkKCiAgICBkZWYgZG93bmxvYWQoc2VsZiwgc3BlYywgdG1wZGlyKToKICAgICAgICAiIiJMb2NhdGUgYW5kL29yIGRvd25sb2FkIGBzcGVjYCB0byBgdG1wZGlyYCwgcmV0dXJuaW5nIGEgbG9jYWwgcGF0aAoKICAgICAgICBgc3BlY2AgbWF5IGJlIGEgYGBSZXF1aXJlbWVudGBgIG9iamVjdCwgb3IgYSBzdHJpbmcgY29udGFpbmluZyBhIFVSTCwKICAgICAgICBhbiBleGlzdGluZyBsb2NhbCBmaWxlbmFtZSwgb3IgYSBwcm9qZWN0L3ZlcnNpb24gcmVxdWlyZW1lbnQgc3BlYwogICAgICAgIChpLmUuIHRoZSBzdHJpbmcgZm9ybSBvZiBhIGBgUmVxdWlyZW1lbnRgYCBvYmplY3QpLiAgSWYgaXQgaXMgdGhlIFVSTAogICAgICAgIG9mIGEgLnB5IGZpbGUgd2l0aCBhbiB1bmFtYmlndW91cyBgYCNlZ2c9bmFtZS12ZXJzaW9uYGAgdGFnIChpLmUuLCBvbmUKICAgICAgICB0aGF0IGVzY2FwZXMgYGAtYGAgYXMgYGBfYGAgdGhyb3VnaG91dCksIGEgdHJpdmlhbCBgYHNldHVwLnB5YGAgaXMKICAgICAgICBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgYWxvbmdzaWRlIHRoZSBkb3dubG9hZGVkIGZpbGUuCgogICAgICAgIElmIGBzcGVjYCBpcyBhIGBgUmVxdWlyZW1lbnRgYCBvYmplY3Qgb3IgYSBzdHJpbmcgY29udGFpbmluZyBhCiAgICAgICAgcHJvamVjdC92ZXJzaW9uIHJlcXVpcmVtZW50IHNwZWMsIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGxvY2F0aW9uIG9mCiAgICAgICAgYSBtYXRjaGluZyBkaXN0cmlidXRpb24gKHBvc3NpYmx5IGFmdGVyIGRvd25sb2FkaW5nIGl0IHRvIGB0bXBkaXJgKS4KICAgICAgICBJZiBgc3BlY2AgaXMgYSBsb2NhbGx5IGV4aXN0aW5nIGZpbGUgb3IgZGlyZWN0b3J5IG5hbWUsIGl0IGlzIHNpbXBseQogICAgICAgIHJldHVybmVkIHVuY2hhbmdlZC4gIElmIGBzcGVjYCBpcyBhIFVSTCwgaXQgaXMgZG93bmxvYWRlZCB0byBhIHN1YnBhdGgKICAgICAgICBvZiBgdG1wZGlyYCwgYW5kIHRoZSBsb2NhbCBmaWxlbmFtZSBpcyByZXR1cm5lZC4gIFZhcmlvdXMgZXJyb3JzIG1heSBiZQogICAgICAgIHJhaXNlZCBpZiBhIHByb2JsZW0gb2NjdXJzIGR1cmluZyBkb3dubG9hZGluZy4KICAgICAgICAiIiIKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShzcGVjLCBSZXF1aXJlbWVudCk6CiAgICAgICAgICAgIHNjaGVtZSA9IFVSTF9TQ0hFTUUoc3BlYykKICAgICAgICAgICAgaWYgc2NoZW1lOgogICAgICAgICAgICAgICAgIyBJdCdzIGEgdXJsLCBkb3dubG9hZCBpdCB0byB0bXBkaXIKICAgICAgICAgICAgICAgIGZvdW5kID0gc2VsZi5fZG93bmxvYWRfdXJsKHNjaGVtZS5ncm91cCgxKSwgc3BlYywgdG1wZGlyKQogICAgICAgICAgICAgICAgYmFzZSwgZnJhZ21lbnQgPSBlZ2dfaW5mb19mb3JfdXJsKHNwZWMpCiAgICAgICAgICAgICAgICBpZiBiYXNlLmVuZHN3aXRoKCcucHknKToKICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHNlbGYuZ2VuX3NldHVwKGZvdW5kLCBmcmFnbWVudCwgdG1wZGlyKQogICAgICAgICAgICAgICAgcmV0dXJuIGZvdW5kCiAgICAgICAgICAgIGVsaWYgb3MucGF0aC5leGlzdHMoc3BlYyk6CiAgICAgICAgICAgICAgICAjIEV4aXN0aW5nIGZpbGUgb3IgZGlyZWN0b3J5LCBqdXN0IHJldHVybiBpdAogICAgICAgICAgICAgICAgcmV0dXJuIHNwZWMKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNwZWMgPSBwYXJzZV9yZXF1aXJlbWVudF9hcmcoc3BlYykKICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLmZldGNoX2Rpc3RyaWJ1dGlvbihzcGVjLCB0bXBkaXIpLCAnbG9jYXRpb24nLCBOb25lKQoKICAgIGRlZiBmZXRjaF9kaXN0cmlidXRpb24oCiAgICAgICAgICAgIHNlbGYsIHJlcXVpcmVtZW50LCB0bXBkaXIsIGZvcmNlX3NjYW49RmFsc2UsIHNvdXJjZT1GYWxzZSwKICAgICAgICAgICAgZGV2ZWxvcF9vaz1GYWxzZSwgbG9jYWxfaW5kZXg9Tm9uZSk6CiAgICAgICAgIiIiT2J0YWluIGEgZGlzdHJpYnV0aW9uIHN1aXRhYmxlIGZvciBmdWxmaWxsaW5nIGByZXF1aXJlbWVudGAKCiAgICAgICAgYHJlcXVpcmVtZW50YCBtdXN0IGJlIGEgYGBwa2dfcmVzb3VyY2VzLlJlcXVpcmVtZW50YGAgaW5zdGFuY2UuCiAgICAgICAgSWYgbmVjZXNzYXJ5LCBvciBpZiB0aGUgYGZvcmNlX3NjYW5gIGZsYWcgaXMgc2V0LCB0aGUgcmVxdWlyZW1lbnQgaXMKICAgICAgICBzZWFyY2hlZCBmb3IgaW4gdGhlIChvbmxpbmUpIHBhY2thZ2UgaW5kZXggYXMgd2VsbCBhcyB0aGUgbG9jYWxseQogICAgICAgIGluc3RhbGxlZCBwYWNrYWdlcy4gIElmIGEgZGlzdHJpYnV0aW9uIG1hdGNoaW5nIGByZXF1aXJlbWVudGAgaXMgZm91bmQsCiAgICAgICAgdGhlIHJldHVybmVkIGRpc3RyaWJ1dGlvbidzIGBgbG9jYXRpb25gYCBpcyB0aGUgdmFsdWUgeW91IHdvdWxkIGhhdmUKICAgICAgICBnb3R0ZW4gZnJvbSBjYWxsaW5nIHRoZSBgYGRvd25sb2FkKClgYCBtZXRob2Qgd2l0aCB0aGUgbWF0Y2hpbmcKICAgICAgICBkaXN0cmlidXRpb24ncyBVUkwgb3IgZmlsZW5hbWUuICBJZiBubyBtYXRjaGluZyBkaXN0cmlidXRpb24gaXMgZm91bmQsCiAgICAgICAgYGBOb25lYGAgaXMgcmV0dXJuZWQuCgogICAgICAgIElmIHRoZSBgc291cmNlYCBmbGFnIGlzIHNldCwgb25seSBzb3VyY2UgZGlzdHJpYnV0aW9ucyBhbmQgc291cmNlCiAgICAgICAgY2hlY2tvdXQgbGlua3Mgd2lsbCBiZSBjb25zaWRlcmVkLiAgVW5sZXNzIHRoZSBgZGV2ZWxvcF9va2AgZmxhZyBpcwogICAgICAgIHNldCwgZGV2ZWxvcG1lbnQgYW5kIHN5c3RlbSBlZ2dzIChpLmUuLCB0aG9zZSB1c2luZyB0aGUgYGAuZWdnLWluZm9gYAogICAgICAgIGZvcm1hdCkgd2lsbCBiZSBpZ25vcmVkLgogICAgICAgICIiIgogICAgICAgICMgcHJvY2VzcyBhIFJlcXVpcmVtZW50CiAgICAgICAgc2VsZi5pbmZvKCJTZWFyY2hpbmcgZm9yICVzIiwgcmVxdWlyZW1lbnQpCiAgICAgICAgc2tpcHBlZCA9IHt9CiAgICAgICAgZGlzdCA9IE5vbmUKCiAgICAgICAgZGVmIGZpbmQocmVxLCBlbnY9Tm9uZSk6CiAgICAgICAgICAgIGlmIGVudiBpcyBOb25lOgogICAgICAgICAgICAgICAgZW52ID0gc2VsZgogICAgICAgICAgICAjIEZpbmQgYSBtYXRjaGluZyBkaXN0cmlidXRpb247IG1heSBiZSBjYWxsZWQgbW9yZSB0aGFuIG9uY2UKCiAgICAgICAgICAgIGZvciBkaXN0IGluIGVudltyZXEua2V5XToKCiAgICAgICAgICAgICAgICBpZiBkaXN0LnByZWNlZGVuY2UgPT0gREVWRUxPUF9ESVNUIGFuZCBub3QgZGV2ZWxvcF9vazoKICAgICAgICAgICAgICAgICAgICBpZiBkaXN0IG5vdCBpbiBza2lwcGVkOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLndhcm4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2tpcHBpbmcgZGV2ZWxvcG1lbnQgb3Igc3lzdGVtIGVnZzogJXMiLCBkaXN0LAogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgIHNraXBwZWRbZGlzdF0gPSAxCiAgICAgICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgICAgICB0ZXN0ID0gKAogICAgICAgICAgICAgICAgICAgIGRpc3QgaW4gcmVxCiAgICAgICAgICAgICAgICAgICAgYW5kIChkaXN0LnByZWNlZGVuY2UgPD0gU09VUkNFX0RJU1Qgb3Igbm90IHNvdXJjZSkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGlmIHRlc3Q6CiAgICAgICAgICAgICAgICAgICAgbG9jID0gc2VsZi5kb3dubG9hZChkaXN0LmxvY2F0aW9uLCB0bXBkaXIpCiAgICAgICAgICAgICAgICAgICAgZGlzdC5kb3dubG9hZF9sb2NhdGlvbiA9IGxvYwogICAgICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGRpc3QuZG93bmxvYWRfbG9jYXRpb24pOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGlzdAoKICAgICAgICBpZiBmb3JjZV9zY2FuOgogICAgICAgICAgICBzZWxmLnByZXNjYW4oKQogICAgICAgICAgICBzZWxmLmZpbmRfcGFja2FnZXMocmVxdWlyZW1lbnQpCiAgICAgICAgICAgIGRpc3QgPSBmaW5kKHJlcXVpcmVtZW50KQoKICAgICAgICBpZiBub3QgZGlzdCBhbmQgbG9jYWxfaW5kZXggaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGRpc3QgPSBmaW5kKHJlcXVpcmVtZW50LCBsb2NhbF9pbmRleCkKCiAgICAgICAgaWYgZGlzdCBpcyBOb25lOgogICAgICAgICAgICBpZiBzZWxmLnRvX3NjYW4gaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBzZWxmLnByZXNjYW4oKQogICAgICAgICAgICBkaXN0ID0gZmluZChyZXF1aXJlbWVudCkKCiAgICAgICAgaWYgZGlzdCBpcyBOb25lIGFuZCBub3QgZm9yY2Vfc2NhbjoKICAgICAgICAgICAgc2VsZi5maW5kX3BhY2thZ2VzKHJlcXVpcmVtZW50KQogICAgICAgICAgICBkaXN0ID0gZmluZChyZXF1aXJlbWVudCkKCiAgICAgICAgaWYgZGlzdCBpcyBOb25lOgogICAgICAgICAgICBzZWxmLndhcm4oCiAgICAgICAgICAgICAgICAiTm8gbG9jYWwgcGFja2FnZXMgb3Igd29ya2luZyBkb3dubG9hZCBsaW5rcyBmb3VuZCBmb3IgJXMlcyIsCiAgICAgICAgICAgICAgICAoc291cmNlIGFuZCAiYSBzb3VyY2UgZGlzdHJpYnV0aW9uIG9mICIgb3IgIiIpLAogICAgICAgICAgICAgICAgcmVxdWlyZW1lbnQsCiAgICAgICAgICAgICkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmluZm8oIkJlc3QgbWF0Y2g6ICVzIiwgZGlzdCkKICAgICAgICAgICAgcmV0dXJuIGRpc3QuY2xvbmUobG9jYXRpb249ZGlzdC5kb3dubG9hZF9sb2NhdGlvbikKCiAgICBkZWYgZmV0Y2goc2VsZiwgcmVxdWlyZW1lbnQsIHRtcGRpciwgZm9yY2Vfc2Nhbj1GYWxzZSwgc291cmNlPUZhbHNlKToKICAgICAgICAiIiJPYnRhaW4gYSBmaWxlIHN1aXRhYmxlIGZvciBmdWxmaWxsaW5nIGByZXF1aXJlbWVudGAKCiAgICAgICAgREVQUkVDQVRFRDsgdXNlIHRoZSBgYGZldGNoX2Rpc3RyaWJ1dGlvbigpYGAgbWV0aG9kIG5vdyBpbnN0ZWFkLiAgRm9yCiAgICAgICAgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgdGhpcyByb3V0aW5lIGlzIGlkZW50aWNhbCBidXQgcmV0dXJucyB0aGUKICAgICAgICBgYGxvY2F0aW9uYGAgb2YgdGhlIGRvd25sb2FkZWQgZGlzdHJpYnV0aW9uIGluc3RlYWQgb2YgYSBkaXN0cmlidXRpb24KICAgICAgICBvYmplY3QuCiAgICAgICAgIiIiCiAgICAgICAgZGlzdCA9IHNlbGYuZmV0Y2hfZGlzdHJpYnV0aW9uKHJlcXVpcmVtZW50LCB0bXBkaXIsIGZvcmNlX3NjYW4sIHNvdXJjZSkKICAgICAgICBpZiBkaXN0IGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4gZGlzdC5sb2NhdGlvbgogICAgICAgIHJldHVybiBOb25lCgogICAgZGVmIGdlbl9zZXR1cChzZWxmLCBmaWxlbmFtZSwgZnJhZ21lbnQsIHRtcGRpcik6CiAgICAgICAgbWF0Y2ggPSBFR0dfRlJBR01FTlQubWF0Y2goZnJhZ21lbnQpCiAgICAgICAgZGlzdHMgPSBtYXRjaCBhbmQgWwogICAgICAgICAgICBkIGZvciBkIGluCiAgICAgICAgICAgIGludGVycHJldF9kaXN0cm9fbmFtZShmaWxlbmFtZSwgbWF0Y2guZ3JvdXAoMSksIE5vbmUpIGlmIGQudmVyc2lvbgogICAgICAgIF0gb3IgW10KCiAgICAgICAgaWYgbGVuKGRpc3RzKSA9PSAxOiAgIyB1bmFtYmlndW91cyBgYCNlZ2dgYCBmcmFnbWVudAogICAgICAgICAgICBiYXNlbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUoZmlsZW5hbWUpCgogICAgICAgICAgICAjIE1ha2Ugc3VyZSB0aGUgZmlsZSBoYXMgYmVlbiBkb3dubG9hZGVkIHRvIHRoZSB0ZW1wIGRpci4KICAgICAgICAgICAgaWYgb3MucGF0aC5kaXJuYW1lKGZpbGVuYW1lKSAhPSB0bXBkaXI6CiAgICAgICAgICAgICAgICBkc3QgPSBvcy5wYXRoLmpvaW4odG1wZGlyLCBiYXNlbmFtZSkKICAgICAgICAgICAgICAgIGZyb20gc2V0dXB0b29scy5jb21tYW5kLmVhc3lfaW5zdGFsbCBpbXBvcnQgc2FtZWZpbGUKICAgICAgICAgICAgICAgIGlmIG5vdCBzYW1lZmlsZShmaWxlbmFtZSwgZHN0KToKICAgICAgICAgICAgICAgICAgICBzaHV0aWwuY29weTIoZmlsZW5hbWUsIGRzdCkKICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IGRzdAoKICAgICAgICAgICAgd2l0aCBvcGVuKG9zLnBhdGguam9pbih0bXBkaXIsICdzZXR1cC5weScpLCAndycpIGFzIGZpbGU6CiAgICAgICAgICAgICAgICBmaWxlLndyaXRlKAogICAgICAgICAgICAgICAgICAgICJmcm9tIHNldHVwdG9vbHMgaW1wb3J0IHNldHVwXG4iCiAgICAgICAgICAgICAgICAgICAgInNldHVwKG5hbWU9JXIsIHZlcnNpb249JXIsIHB5X21vZHVsZXM9WyVyXSlcbiIKICAgICAgICAgICAgICAgICAgICAlICgKICAgICAgICAgICAgICAgICAgICAgICAgZGlzdHNbMF0ucHJvamVjdF9uYW1lLCBkaXN0c1swXS52ZXJzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLnNwbGl0ZXh0KGJhc2VuYW1lKVswXQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgcmV0dXJuIGZpbGVuYW1lCgogICAgICAgIGVsaWYgbWF0Y2g6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKAogICAgICAgICAgICAgICAgIkNhbid0IHVuYW1iaWd1b3VzbHkgaW50ZXJwcmV0IHByb2plY3QvdmVyc2lvbiBpZGVudGlmaWVyICVyOyAiCiAgICAgICAgICAgICAgICAiYW55IGRhc2hlcyBpbiB0aGUgbmFtZSBvciB2ZXJzaW9uIHNob3VsZCBiZSBlc2NhcGVkIHVzaW5nICIKICAgICAgICAgICAgICAgICJ1bmRlcnNjb3Jlcy4gJXIiICUgKGZyYWdtZW50LCBkaXN0cykKICAgICAgICAgICAgKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKAogICAgICAgICAgICAgICAgIkNhbid0IHByb2Nlc3MgcGxhaW4gLnB5IGZpbGVzIHdpdGhvdXQgYW4gJyNlZ2c9bmFtZS12ZXJzaW9uJyIKICAgICAgICAgICAgICAgICIgc3VmZml4IHRvIGVuYWJsZSBhdXRvbWF0aWMgc2V0dXAgc2NyaXB0IGdlbmVyYXRpb24uIgogICAgICAgICAgICApCgogICAgZGxfYmxvY2tzaXplID0gODE5MgoKICAgIGRlZiBfZG93bmxvYWRfdG8oc2VsZiwgdXJsLCBmaWxlbmFtZSk6CiAgICAgICAgc2VsZi5pbmZvKCJEb3dubG9hZGluZyAlcyIsIHVybCkKICAgICAgICAjIERvd25sb2FkIHRoZSBmaWxlCiAgICAgICAgZnAgPSBOb25lCiAgICAgICAgdHJ5OgogICAgICAgICAgICBjaGVja2VyID0gSGFzaENoZWNrZXIuZnJvbV91cmwodXJsKQogICAgICAgICAgICBmcCA9IHNlbGYub3Blbl91cmwodXJsKQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGZwLCB1cmxsaWIuZXJyb3IuSFRUUEVycm9yKToKICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKAogICAgICAgICAgICAgICAgICAgICJDYW4ndCBkb3dubG9hZCAlczogJXMgJXMiICUgKHVybCwgZnAuY29kZSwgZnAubXNnKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICBoZWFkZXJzID0gZnAuaW5mbygpCiAgICAgICAgICAgIGJsb2NrbnVtID0gMAogICAgICAgICAgICBicyA9IHNlbGYuZGxfYmxvY2tzaXplCiAgICAgICAgICAgIHNpemUgPSAtMQogICAgICAgICAgICBpZiAiY29udGVudC1sZW5ndGgiIGluIGhlYWRlcnM6CiAgICAgICAgICAgICAgICAjIFNvbWUgc2VydmVycyByZXR1cm4gbXVsdGlwbGUgQ29udGVudC1MZW5ndGggaGVhZGVycyA6KAogICAgICAgICAgICAgICAgc2l6ZXMgPSBnZXRfYWxsX2hlYWRlcnMoaGVhZGVycywgJ0NvbnRlbnQtTGVuZ3RoJykKICAgICAgICAgICAgICAgIHNpemUgPSBtYXgobWFwKGludCwgc2l6ZXMpKQogICAgICAgICAgICAgICAgc2VsZi5yZXBvcnRob29rKHVybCwgZmlsZW5hbWUsIGJsb2NrbnVtLCBicywgc2l6ZSkKICAgICAgICAgICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAnd2InKSBhcyB0ZnA6CiAgICAgICAgICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICAgICAgICAgIGJsb2NrID0gZnAucmVhZChicykKICAgICAgICAgICAgICAgICAgICBpZiBibG9jazoKICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tlci5mZWVkKGJsb2NrKQogICAgICAgICAgICAgICAgICAgICAgICB0ZnAud3JpdGUoYmxvY2spCiAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrbnVtICs9IDEKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXBvcnRob29rKHVybCwgZmlsZW5hbWUsIGJsb2NrbnVtLCBicywgc2l6ZSkKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgc2VsZi5jaGVja19oYXNoKGNoZWNrZXIsIGZpbGVuYW1lLCB0ZnApCiAgICAgICAgICAgIHJldHVybiBoZWFkZXJzCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgaWYgZnA6CiAgICAgICAgICAgICAgICBmcC5jbG9zZSgpCgogICAgZGVmIHJlcG9ydGhvb2soc2VsZiwgdXJsLCBmaWxlbmFtZSwgYmxvY2tudW0sIGJsa3NpemUsIHNpemUpOgogICAgICAgIHBhc3MgICMgbm8tb3AKCiAgICBkZWYgb3Blbl91cmwoc2VsZiwgdXJsLCB3YXJuaW5nPU5vbmUpOgogICAgICAgIGlmIHVybC5zdGFydHN3aXRoKCdmaWxlOicpOgogICAgICAgICAgICByZXR1cm4gbG9jYWxfb3Blbih1cmwpCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gb3Blbl93aXRoX2F1dGgodXJsLCBzZWxmLm9wZW5lcikKICAgICAgICBleGNlcHQgKFZhbHVlRXJyb3IsIGh0dHBfY2xpZW50LkludmFsaWRVUkwpIGFzIHY6CiAgICAgICAgICAgIG1zZyA9ICcgJy5qb2luKFtzdHIoYXJnKSBmb3IgYXJnIGluIHYuYXJnc10pCiAgICAgICAgICAgIGlmIHdhcm5pbmc6CiAgICAgICAgICAgICAgICBzZWxmLndhcm4od2FybmluZywgbXNnKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IoJyVzICVzJyAlICh1cmwsIG1zZykpCiAgICAgICAgZXhjZXB0IHVybGxpYi5lcnJvci5IVFRQRXJyb3IgYXMgdjoKICAgICAgICAgICAgcmV0dXJuIHYKICAgICAgICBleGNlcHQgdXJsbGliLmVycm9yLlVSTEVycm9yIGFzIHY6CiAgICAgICAgICAgIGlmIHdhcm5pbmc6CiAgICAgICAgICAgICAgICBzZWxmLndhcm4od2FybmluZywgdi5yZWFzb24pCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcigiRG93bmxvYWQgZXJyb3IgZm9yICVzOiAlcyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKHVybCwgdi5yZWFzb24pKQogICAgICAgIGV4Y2VwdCBodHRwX2NsaWVudC5CYWRTdGF0dXNMaW5lIGFzIHY6CiAgICAgICAgICAgIGlmIHdhcm5pbmc6CiAgICAgICAgICAgICAgICBzZWxmLndhcm4od2FybmluZywgdi5saW5lKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgJyVzIHJldHVybmVkIGEgYmFkIHN0YXR1cyBsaW5lLiBUaGUgc2VydmVyIG1pZ2h0IGJlICcKICAgICAgICAgICAgICAgICAgICAnZG93biwgJXMnICUKICAgICAgICAgICAgICAgICAgICAodXJsLCB2LmxpbmUpCiAgICAgICAgICAgICAgICApCiAgICAgICAgZXhjZXB0IChodHRwX2NsaWVudC5IVFRQRXhjZXB0aW9uLCBzb2NrZXQuZXJyb3IpIGFzIHY6CiAgICAgICAgICAgIGlmIHdhcm5pbmc6CiAgICAgICAgICAgICAgICBzZWxmLndhcm4od2FybmluZywgdikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKCJEb3dubG9hZCBlcnJvciBmb3IgJXM6ICVzIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAodXJsLCB2KSkKCiAgICBkZWYgX2Rvd25sb2FkX3VybChzZWxmLCBzY2hlbWUsIHVybCwgdG1wZGlyKToKICAgICAgICAjIERldGVybWluZSBkb3dubG9hZCBmaWxlbmFtZQogICAgICAgICMKICAgICAgICBuYW1lLCBmcmFnbWVudCA9IGVnZ19pbmZvX2Zvcl91cmwodXJsKQogICAgICAgIGlmIG5hbWU6CiAgICAgICAgICAgIHdoaWxlICcuLicgaW4gbmFtZToKICAgICAgICAgICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoJy4uJywgJy4nKS5yZXBsYWNlKCdcXCcsICdfJykKICAgICAgICBlbHNlOgogICAgICAgICAgICBuYW1lID0gIl9fZG93bmxvYWRlZF9fIiAgIyBkZWZhdWx0IGlmIFVSTCBoYXMgbm8gcGF0aCBjb250ZW50cwoKICAgICAgICBpZiBuYW1lLmVuZHN3aXRoKCcuZWdnLnppcCcpOgogICAgICAgICAgICBuYW1lID0gbmFtZVs6LTRdICAjIHN0cmlwIHRoZSBleHRyYSAuemlwIGJlZm9yZSBkb3dubG9hZAoKICAgICAgICBmaWxlbmFtZSA9IG9zLnBhdGguam9pbih0bXBkaXIsIG5hbWUpCgogICAgICAgICMgRG93bmxvYWQgdGhlIGZpbGUKICAgICAgICAjCiAgICAgICAgaWYgc2NoZW1lID09ICdzdm4nIG9yIHNjaGVtZS5zdGFydHN3aXRoKCdzdm4rJyk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9kb3dubG9hZF9zdm4odXJsLCBmaWxlbmFtZSkKICAgICAgICBlbGlmIHNjaGVtZSA9PSAnZ2l0JyBvciBzY2hlbWUuc3RhcnRzd2l0aCgnZ2l0KycpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fZG93bmxvYWRfZ2l0KHVybCwgZmlsZW5hbWUpCiAgICAgICAgZWxpZiBzY2hlbWUuc3RhcnRzd2l0aCgnaGcrJyk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9kb3dubG9hZF9oZyh1cmwsIGZpbGVuYW1lKQogICAgICAgIGVsaWYgc2NoZW1lID09ICdmaWxlJzoKICAgICAgICAgICAgcmV0dXJuIHVybGxpYi5yZXF1ZXN0LnVybDJwYXRobmFtZSh1cmxsaWIucGFyc2UudXJscGFyc2UodXJsKVsyXSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnVybF9vayh1cmwsIFRydWUpICAjIHJhaXNlcyBlcnJvciBpZiBub3QgYWxsb3dlZAogICAgICAgICAgICByZXR1cm4gc2VsZi5fYXR0ZW1wdF9kb3dubG9hZCh1cmwsIGZpbGVuYW1lKQoKICAgIGRlZiBzY2FuX3VybChzZWxmLCB1cmwpOgogICAgICAgIHNlbGYucHJvY2Vzc191cmwodXJsLCBUcnVlKQoKICAgIGRlZiBfYXR0ZW1wdF9kb3dubG9hZChzZWxmLCB1cmwsIGZpbGVuYW1lKToKICAgICAgICBoZWFkZXJzID0gc2VsZi5fZG93bmxvYWRfdG8odXJsLCBmaWxlbmFtZSkKICAgICAgICBpZiAnaHRtbCcgaW4gaGVhZGVycy5nZXQoJ2NvbnRlbnQtdHlwZScsICcnKS5sb3dlcigpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fZG93bmxvYWRfaHRtbCh1cmwsIGhlYWRlcnMsIGZpbGVuYW1lKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBmaWxlbmFtZQoKICAgIGRlZiBfZG93bmxvYWRfaHRtbChzZWxmLCB1cmwsIGhlYWRlcnMsIGZpbGVuYW1lKToKICAgICAgICBmaWxlID0gb3BlbihmaWxlbmFtZSkKICAgICAgICBmb3IgbGluZSBpbiBmaWxlOgogICAgICAgICAgICBpZiBsaW5lLnN0cmlwKCk6CiAgICAgICAgICAgICAgICAjIENoZWNrIGZvciBhIHN1YnZlcnNpb24gaW5kZXggcGFnZQogICAgICAgICAgICAgICAgaWYgcmUuc2VhcmNoKHInPHRpdGxlPihbXi0gXSsgLSApP1JldmlzaW9uIFxkKzonLCBsaW5lKToKICAgICAgICAgICAgICAgICAgICAjIGl0J3MgYSBzdWJ2ZXJzaW9uIGluZGV4IHBhZ2U6CiAgICAgICAgICAgICAgICAgICAgZmlsZS5jbG9zZSgpCiAgICAgICAgICAgICAgICAgICAgb3MudW5saW5rKGZpbGVuYW1lKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9kb3dubG9hZF9zdm4odXJsLCBmaWxlbmFtZSkKICAgICAgICAgICAgICAgIGJyZWFrICAjIG5vdCBhbiBpbmRleCBwYWdlCiAgICAgICAgZmlsZS5jbG9zZSgpCiAgICAgICAgb3MudW5saW5rKGZpbGVuYW1lKQogICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKCJVbmV4cGVjdGVkIEhUTUwgcGFnZSBmb3VuZCBhdCAiICsgdXJsKQoKICAgIGRlZiBfZG93bmxvYWRfc3ZuKHNlbGYsIHVybCwgZmlsZW5hbWUpOgogICAgICAgIHdhcm5pbmdzLndhcm4oIlNWTiBkb3dubG9hZCBzdXBwb3J0IGlzIGRlcHJlY2F0ZWQiLCBVc2VyV2FybmluZykKICAgICAgICB1cmwgPSB1cmwuc3BsaXQoJyMnLCAxKVswXSAgIyByZW1vdmUgYW55IGZyYWdtZW50IGZvciBzdm4ncyBzYWtlCiAgICAgICAgY3JlZHMgPSAnJwogICAgICAgIGlmIHVybC5sb3dlcigpLnN0YXJ0c3dpdGgoJ3N2bjonKSBhbmQgJ0AnIGluIHVybDoKICAgICAgICAgICAgc2NoZW1lLCBuZXRsb2MsIHBhdGgsIHAsIHEsIGYgPSB1cmxsaWIucGFyc2UudXJscGFyc2UodXJsKQogICAgICAgICAgICBpZiBub3QgbmV0bG9jIGFuZCBwYXRoLnN0YXJ0c3dpdGgoJy8vJykgYW5kICcvJyBpbiBwYXRoWzI6XToKICAgICAgICAgICAgICAgIG5ldGxvYywgcGF0aCA9IHBhdGhbMjpdLnNwbGl0KCcvJywgMSkKICAgICAgICAgICAgICAgIGF1dGgsIGhvc3QgPSBfc3BsaXR1c2VyKG5ldGxvYykKICAgICAgICAgICAgICAgIGlmIGF1dGg6CiAgICAgICAgICAgICAgICAgICAgaWYgJzonIGluIGF1dGg6CiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIsIHB3ID0gYXV0aC5zcGxpdCgnOicsIDEpCiAgICAgICAgICAgICAgICAgICAgICAgIGNyZWRzID0gIiAtLXVzZXJuYW1lPSVzIC0tcGFzc3dvcmQ9JXMiICUgKHVzZXIsIHB3KQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGNyZWRzID0gIiAtLXVzZXJuYW1lPSIgKyBhdXRoCiAgICAgICAgICAgICAgICAgICAgbmV0bG9jID0gaG9zdAogICAgICAgICAgICAgICAgICAgIHBhcnRzID0gc2NoZW1lLCBuZXRsb2MsIHVybCwgcCwgcSwgZgogICAgICAgICAgICAgICAgICAgIHVybCA9IHVybGxpYi5wYXJzZS51cmx1bnBhcnNlKHBhcnRzKQogICAgICAgIHNlbGYuaW5mbygiRG9pbmcgc3VidmVyc2lvbiBjaGVja291dCBmcm9tICVzIHRvICVzIiwgdXJsLCBmaWxlbmFtZSkKICAgICAgICBvcy5zeXN0ZW0oInN2biBjaGVja291dCVzIC1xICVzICVzIiAlIChjcmVkcywgdXJsLCBmaWxlbmFtZSkpCiAgICAgICAgcmV0dXJuIGZpbGVuYW1lCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF92Y3Nfc3BsaXRfcmV2X2Zyb21fdXJsKHVybCwgcG9wX3ByZWZpeD1GYWxzZSk6CiAgICAgICAgc2NoZW1lLCBuZXRsb2MsIHBhdGgsIHF1ZXJ5LCBmcmFnID0gdXJsbGliLnBhcnNlLnVybHNwbGl0KHVybCkKCiAgICAgICAgc2NoZW1lID0gc2NoZW1lLnNwbGl0KCcrJywgMSlbLTFdCgogICAgICAgICMgU29tZSBmcmFnbWVudCBpZGVudGlmaWNhdGlvbiBmYWlscwogICAgICAgIHBhdGggPSBwYXRoLnNwbGl0KCcjJywgMSlbMF0KCiAgICAgICAgcmV2ID0gTm9uZQogICAgICAgIGlmICdAJyBpbiBwYXRoOgogICAgICAgICAgICBwYXRoLCByZXYgPSBwYXRoLnJzcGxpdCgnQCcsIDEpCgogICAgICAgICMgQWxzbywgZGlzY2FyZCBmcmFnbWVudAogICAgICAgIHVybCA9IHVybGxpYi5wYXJzZS51cmx1bnNwbGl0KChzY2hlbWUsIG5ldGxvYywgcGF0aCwgcXVlcnksICcnKSkKCiAgICAgICAgcmV0dXJuIHVybCwgcmV2CgogICAgZGVmIF9kb3dubG9hZF9naXQoc2VsZiwgdXJsLCBmaWxlbmFtZSk6CiAgICAgICAgZmlsZW5hbWUgPSBmaWxlbmFtZS5zcGxpdCgnIycsIDEpWzBdCiAgICAgICAgdXJsLCByZXYgPSBzZWxmLl92Y3Nfc3BsaXRfcmV2X2Zyb21fdXJsKHVybCwgcG9wX3ByZWZpeD1UcnVlKQoKICAgICAgICBzZWxmLmluZm8oIkRvaW5nIGdpdCBjbG9uZSBmcm9tICVzIHRvICVzIiwgdXJsLCBmaWxlbmFtZSkKICAgICAgICBvcy5zeXN0ZW0oImdpdCBjbG9uZSAtLXF1aWV0ICVzICVzIiAlICh1cmwsIGZpbGVuYW1lKSkKCiAgICAgICAgaWYgcmV2IGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLmluZm8oIkNoZWNraW5nIG91dCAlcyIsIHJldikKICAgICAgICAgICAgb3Muc3lzdGVtKCJnaXQgLUMgJXMgY2hlY2tvdXQgLS1xdWlldCAlcyIgJSAoCiAgICAgICAgICAgICAgICBmaWxlbmFtZSwKICAgICAgICAgICAgICAgIHJldiwKICAgICAgICAgICAgKSkKCiAgICAgICAgcmV0dXJuIGZpbGVuYW1lCgogICAgZGVmIF9kb3dubG9hZF9oZyhzZWxmLCB1cmwsIGZpbGVuYW1lKToKICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lLnNwbGl0KCcjJywgMSlbMF0KICAgICAgICB1cmwsIHJldiA9IHNlbGYuX3Zjc19zcGxpdF9yZXZfZnJvbV91cmwodXJsLCBwb3BfcHJlZml4PVRydWUpCgogICAgICAgIHNlbGYuaW5mbygiRG9pbmcgaGcgY2xvbmUgZnJvbSAlcyB0byAlcyIsIHVybCwgZmlsZW5hbWUpCiAgICAgICAgb3Muc3lzdGVtKCJoZyBjbG9uZSAtLXF1aWV0ICVzICVzIiAlICh1cmwsIGZpbGVuYW1lKSkKCiAgICAgICAgaWYgcmV2IGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLmluZm8oIlVwZGF0aW5nIHRvICVzIiwgcmV2KQogICAgICAgICAgICBvcy5zeXN0ZW0oImhnIC0tY3dkICVzIHVwIC1DIC1yICVzIC1xIiAlICgKICAgICAgICAgICAgICAgIGZpbGVuYW1lLAogICAgICAgICAgICAgICAgcmV2LAogICAgICAgICAgICApKQoKICAgICAgICByZXR1cm4gZmlsZW5hbWUKCiAgICBkZWYgZGVidWcoc2VsZiwgbXNnLCAqYXJncyk6CiAgICAgICAgbG9nLmRlYnVnKG1zZywgKmFyZ3MpCgogICAgZGVmIGluZm8oc2VsZiwgbXNnLCAqYXJncyk6CiAgICAgICAgbG9nLmluZm8obXNnLCAqYXJncykKCiAgICBkZWYgd2FybihzZWxmLCBtc2csICphcmdzKToKICAgICAgICBsb2cud2Fybihtc2csICphcmdzKQoKCiMgVGhpcyBwYXR0ZXJuIG1hdGNoZXMgYSBjaGFyYWN0ZXIgZW50aXR5IHJlZmVyZW5jZSAoYSBkZWNpbWFsIG51bWVyaWMKIyByZWZlcmVuY2VzLCBhIGhleGFkZWNpbWFsIG51bWVyaWMgcmVmZXJlbmNlLCBvciBhIG5hbWVkIHJlZmVyZW5jZSkuCmVudGl0eV9zdWIgPSByZS5jb21waWxlKHInJigjKFxkK3x4W1xkYS1mQS1GXSspfFtcdy46LV0rKTs/Jykuc3ViCgoKZGVmIGRlY29kZV9lbnRpdHkobWF0Y2gpOgogICAgd2hhdCA9IG1hdGNoLmdyb3VwKDApCiAgICByZXR1cm4gdW5lc2NhcGUod2hhdCkKCgpkZWYgaHRtbGRlY29kZSh0ZXh0KToKICAgICIiIgogICAgRGVjb2RlIEhUTUwgZW50aXRpZXMgaW4gdGhlIGdpdmVuIHRleHQuCgogICAgPj4+IGh0bWxkZWNvZGUoCiAgICAuLi4gICAgICdodHRwczovLy4uL3BhY2thZ2VfbmFtZS0wLjEuMi50YXIuZ3onCiAgICAuLi4gICAgICc/dG9rZW5hPUEmYW1wO3Rva2VuYj1CIj5wYWNrYWdlX25hbWUtMC4xLjIudGFyLmd6JykKICAgICdodHRwczovLy4uL3BhY2thZ2VfbmFtZS0wLjEuMi50YXIuZ3o/dG9rZW5hPUEmdG9rZW5iPUIiPnBhY2thZ2VfbmFtZS0wLjEuMi50YXIuZ3onCiAgICAiIiIKICAgIHJldHVybiBlbnRpdHlfc3ViKGRlY29kZV9lbnRpdHksIHRleHQpCgoKZGVmIHNvY2tldF90aW1lb3V0KHRpbWVvdXQ9MTUpOgogICAgZGVmIF9zb2NrZXRfdGltZW91dChmdW5jKToKICAgICAgICBkZWYgX3NvY2tldF90aW1lb3V0KCphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgICAgIG9sZF90aW1lb3V0ID0gc29ja2V0LmdldGRlZmF1bHR0aW1lb3V0KCkKICAgICAgICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KHRpbWVvdXQpCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHJldHVybiBmdW5jKCphcmdzLCAqKmt3YXJncykKICAgICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgICAgIHNvY2tldC5zZXRkZWZhdWx0dGltZW91dChvbGRfdGltZW91dCkKCiAgICAgICAgcmV0dXJuIF9zb2NrZXRfdGltZW91dAoKICAgIHJldHVybiBfc29ja2V0X3RpbWVvdXQKCgpkZWYgX2VuY29kZV9hdXRoKGF1dGgpOgogICAgIiIiCiAgICBBIGZ1bmN0aW9uIGNvbXBhdGlibGUgd2l0aCBQeXRob24gMi4zLTMuMyB0aGF0IHdpbGwgZW5jb2RlCiAgICBhdXRoIGZyb20gYSBVUkwgc3VpdGFibGUgZm9yIGFuIEhUVFAgaGVhZGVyLgogICAgPj4+IHN0cihfZW5jb2RlX2F1dGgoJ3VzZXJuYW1lJTNBcGFzc3dvcmQnKSkKICAgICdkWE5sY201aGJXVTZjR0Z6YzNkdmNtUT0nCgogICAgTG9uZyBhdXRoIHN0cmluZ3Mgc2hvdWxkIG5vdCBjYXVzZSBhIG5ld2xpbmUgdG8gYmUgaW5zZXJ0ZWQuCiAgICA+Pj4gbG9uZ19hdXRoID0gJ3VzZXJuYW1lOicgKyAncGFzc3dvcmQnKjEwCiAgICA+Pj4gY2hyKDEwKSBpbiBzdHIoX2VuY29kZV9hdXRoKGxvbmdfYXV0aCkpCiAgICBGYWxzZQogICAgIiIiCiAgICBhdXRoX3MgPSB1cmxsaWIucGFyc2UudW5xdW90ZShhdXRoKQogICAgIyBjb252ZXJ0IHRvIGJ5dGVzCiAgICBhdXRoX2J5dGVzID0gYXV0aF9zLmVuY29kZSgpCiAgICBlbmNvZGVkX2J5dGVzID0gYmFzZTY0LmI2NGVuY29kZShhdXRoX2J5dGVzKQogICAgIyBjb252ZXJ0IGJhY2sgdG8gYSBzdHJpbmcKICAgIGVuY29kZWQgPSBlbmNvZGVkX2J5dGVzLmRlY29kZSgpCiAgICAjIHN0cmlwIHRoZSB0cmFpbGluZyBjYXJyaWFnZSByZXR1cm4KICAgIHJldHVybiBlbmNvZGVkLnJlcGxhY2UoJ1xuJywgJycpCgoKY2xhc3MgQ3JlZGVudGlhbDoKICAgICIiIgogICAgQSB1c2VybmFtZS9wYXNzd29yZCBwYWlyLiBVc2UgbGlrZSBhIG5hbWVkdHVwbGUuCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgdXNlcm5hbWUsIHBhc3N3b3JkKToKICAgICAgICBzZWxmLnVzZXJuYW1lID0gdXNlcm5hbWUKICAgICAgICBzZWxmLnBhc3N3b3JkID0gcGFzc3dvcmQKCiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgeWllbGQgc2VsZi51c2VybmFtZQogICAgICAgIHlpZWxkIHNlbGYucGFzc3dvcmQKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gJyUodXNlcm5hbWUpczolKHBhc3N3b3JkKXMnICUgdmFycyhzZWxmKQoKCmNsYXNzIFB5UElDb25maWcoY29uZmlncGFyc2VyLlJhd0NvbmZpZ1BhcnNlcik6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTG9hZCBmcm9tIH4vLnB5cGlyYwogICAgICAgICIiIgogICAgICAgIGRlZmF1bHRzID0gZGljdC5mcm9ta2V5cyhbJ3VzZXJuYW1lJywgJ3Bhc3N3b3JkJywgJ3JlcG9zaXRvcnknXSwgJycpCiAgICAgICAgY29uZmlncGFyc2VyLlJhd0NvbmZpZ1BhcnNlci5fX2luaXRfXyhzZWxmLCBkZWZhdWx0cykKCiAgICAgICAgcmMgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5leHBhbmR1c2VyKCd+JyksICcucHlwaXJjJykKICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhyYyk6CiAgICAgICAgICAgIHNlbGYucmVhZChyYykKCiAgICBAcHJvcGVydHkKICAgIGRlZiBjcmVkc19ieV9yZXBvc2l0b3J5KHNlbGYpOgogICAgICAgIHNlY3Rpb25zX3dpdGhfcmVwb3NpdG9yaWVzID0gWwogICAgICAgICAgICBzZWN0aW9uIGZvciBzZWN0aW9uIGluIHNlbGYuc2VjdGlvbnMoKQogICAgICAgICAgICBpZiBzZWxmLmdldChzZWN0aW9uLCAncmVwb3NpdG9yeScpLnN0cmlwKCkKICAgICAgICBdCgogICAgICAgIHJldHVybiBkaWN0KG1hcChzZWxmLl9nZXRfcmVwb19jcmVkLCBzZWN0aW9uc193aXRoX3JlcG9zaXRvcmllcykpCgogICAgZGVmIF9nZXRfcmVwb19jcmVkKHNlbGYsIHNlY3Rpb24pOgogICAgICAgIHJlcG8gPSBzZWxmLmdldChzZWN0aW9uLCAncmVwb3NpdG9yeScpLnN0cmlwKCkKICAgICAgICByZXR1cm4gcmVwbywgQ3JlZGVudGlhbCgKICAgICAgICAgICAgc2VsZi5nZXQoc2VjdGlvbiwgJ3VzZXJuYW1lJykuc3RyaXAoKSwKICAgICAgICAgICAgc2VsZi5nZXQoc2VjdGlvbiwgJ3Bhc3N3b3JkJykuc3RyaXAoKSwKICAgICAgICApCgogICAgZGVmIGZpbmRfY3JlZGVudGlhbChzZWxmLCB1cmwpOgogICAgICAgICIiIgogICAgICAgIElmIHRoZSBVUkwgaW5kaWNhdGVkIGFwcGVhcnMgdG8gYmUgYSByZXBvc2l0b3J5IGRlZmluZWQgaW4gdGhpcwogICAgICAgIGNvbmZpZywgcmV0dXJuIHRoZSBjcmVkZW50aWFsIGZvciB0aGF0IHJlcG9zaXRvcnkuCiAgICAgICAgIiIiCiAgICAgICAgZm9yIHJlcG9zaXRvcnksIGNyZWQgaW4gc2VsZi5jcmVkc19ieV9yZXBvc2l0b3J5Lml0ZW1zKCk6CiAgICAgICAgICAgIGlmIHVybC5zdGFydHN3aXRoKHJlcG9zaXRvcnkpOgogICAgICAgICAgICAgICAgcmV0dXJuIGNyZWQKCgpkZWYgb3Blbl93aXRoX2F1dGgodXJsLCBvcGVuZXI9dXJsbGliLnJlcXVlc3QudXJsb3Blbik6CiAgICAiIiJPcGVuIGEgdXJsbGliMiByZXF1ZXN0LCBoYW5kbGluZyBIVFRQIGF1dGhlbnRpY2F0aW9uIiIiCgogICAgcGFyc2VkID0gdXJsbGliLnBhcnNlLnVybHBhcnNlKHVybCkKICAgIHNjaGVtZSwgbmV0bG9jLCBwYXRoLCBwYXJhbXMsIHF1ZXJ5LCBmcmFnID0gcGFyc2VkCgogICAgIyBEb3VibGUgc2NoZW1lIGRvZXMgbm90IHJhaXNlIG9uIE1hYyBPUyBYIGFzIHJldmVhbGVkIGJ5IGEKICAgICMgZmFpbGluZyB0ZXN0LiBXZSB3b3VsZCBleHBlY3QgIm5vbm51bWVyaWMgcG9ydCIuIFJlZnMgIzIwLgogICAgaWYgbmV0bG9jLmVuZHN3aXRoKCc6Jyk6CiAgICAgICAgcmFpc2UgaHR0cF9jbGllbnQuSW52YWxpZFVSTCgibm9ubnVtZXJpYyBwb3J0OiAnJyIpCgogICAgaWYgc2NoZW1lIGluICgnaHR0cCcsICdodHRwcycpOgogICAgICAgIGF1dGgsIGFkZHJlc3MgPSBfc3BsaXR1c2VyKG5ldGxvYykKICAgIGVsc2U6CiAgICAgICAgYXV0aCA9IE5vbmUKCiAgICBpZiBub3QgYXV0aDoKICAgICAgICBjcmVkID0gUHlQSUNvbmZpZygpLmZpbmRfY3JlZGVudGlhbCh1cmwpCiAgICAgICAgaWYgY3JlZDoKICAgICAgICAgICAgYXV0aCA9IHN0cihjcmVkKQogICAgICAgICAgICBpbmZvID0gY3JlZC51c2VybmFtZSwgdXJsCiAgICAgICAgICAgIGxvZy5pbmZvKCdBdXRoZW50aWNhdGluZyBhcyAlcyBmb3IgJXMgKGZyb20gLnB5cGlyYyknLCAqaW5mbykKCiAgICBpZiBhdXRoOgogICAgICAgIGF1dGggPSAiQmFzaWMgIiArIF9lbmNvZGVfYXV0aChhdXRoKQogICAgICAgIHBhcnRzID0gc2NoZW1lLCBhZGRyZXNzLCBwYXRoLCBwYXJhbXMsIHF1ZXJ5LCBmcmFnCiAgICAgICAgbmV3X3VybCA9IHVybGxpYi5wYXJzZS51cmx1bnBhcnNlKHBhcnRzKQogICAgICAgIHJlcXVlc3QgPSB1cmxsaWIucmVxdWVzdC5SZXF1ZXN0KG5ld191cmwpCiAgICAgICAgcmVxdWVzdC5hZGRfaGVhZGVyKCJBdXRob3JpemF0aW9uIiwgYXV0aCkKICAgIGVsc2U6CiAgICAgICAgcmVxdWVzdCA9IHVybGxpYi5yZXF1ZXN0LlJlcXVlc3QodXJsKQoKICAgIHJlcXVlc3QuYWRkX2hlYWRlcignVXNlci1BZ2VudCcsIHVzZXJfYWdlbnQpCiAgICBmcCA9IG9wZW5lcihyZXF1ZXN0KQoKICAgIGlmIGF1dGg6CiAgICAgICAgIyBQdXQgYXV0aGVudGljYXRpb24gaW5mbyBiYWNrIGludG8gcmVxdWVzdCBVUkwgaWYgc2FtZSBob3N0LAogICAgICAgICMgc28gdGhhdCBsaW5rcyBmb3VuZCBvbiB0aGUgcGFnZSB3aWxsIHdvcmsKICAgICAgICBzMiwgaDIsIHBhdGgyLCBwYXJhbTIsIHF1ZXJ5MiwgZnJhZzIgPSB1cmxsaWIucGFyc2UudXJscGFyc2UoZnAudXJsKQogICAgICAgIGlmIHMyID09IHNjaGVtZSBhbmQgaDIgPT0gYWRkcmVzczoKICAgICAgICAgICAgcGFydHMgPSBzMiwgbmV0bG9jLCBwYXRoMiwgcGFyYW0yLCBxdWVyeTIsIGZyYWcyCiAgICAgICAgICAgIGZwLnVybCA9IHVybGxpYi5wYXJzZS51cmx1bnBhcnNlKHBhcnRzKQoKICAgIHJldHVybiBmcAoKCiMgY29weSBvZiB1cmxsaWIucGFyc2UuX3NwbGl0dXNlciBmcm9tIFB5dGhvbiAzLjgKZGVmIF9zcGxpdHVzZXIoaG9zdCk6CiAgICAiIiJzcGxpdHVzZXIoJ3VzZXJbOnBhc3N3ZF1AaG9zdFs6cG9ydF0nKSAtLT4gJ3VzZXJbOnBhc3N3ZF0nLCAnaG9zdFs6cG9ydF0nLiIiIgogICAgdXNlciwgZGVsaW0sIGhvc3QgPSBob3N0LnJwYXJ0aXRpb24oJ0AnKQogICAgcmV0dXJuICh1c2VyIGlmIGRlbGltIGVsc2UgTm9uZSksIGhvc3QKCgojIGFkZGluZyBhIHRpbWVvdXQgdG8gYXZvaWQgZnJlZXppbmcgcGFja2FnZV9pbmRleApvcGVuX3dpdGhfYXV0aCA9IHNvY2tldF90aW1lb3V0KF9TT0NLRVRfVElNRU9VVCkob3Blbl93aXRoX2F1dGgpCgoKZGVmIGZpeF9zZl91cmwodXJsKToKICAgIHJldHVybiB1cmwgICMgYmFja3dhcmQgY29tcGF0aWJpbGl0eQoKCmRlZiBsb2NhbF9vcGVuKHVybCk6CiAgICAiIiJSZWFkIGEgbG9jYWwgcGF0aCwgd2l0aCBzcGVjaWFsIHN1cHBvcnQgZm9yIGRpcmVjdG9yaWVzIiIiCiAgICBzY2hlbWUsIHNlcnZlciwgcGF0aCwgcGFyYW0sIHF1ZXJ5LCBmcmFnID0gdXJsbGliLnBhcnNlLnVybHBhcnNlKHVybCkKICAgIGZpbGVuYW1lID0gdXJsbGliLnJlcXVlc3QudXJsMnBhdGhuYW1lKHBhdGgpCiAgICBpZiBvcy5wYXRoLmlzZmlsZShmaWxlbmFtZSk6CiAgICAgICAgcmV0dXJuIHVybGxpYi5yZXF1ZXN0LnVybG9wZW4odXJsKQogICAgZWxpZiBwYXRoLmVuZHN3aXRoKCcvJykgYW5kIG9zLnBhdGguaXNkaXIoZmlsZW5hbWUpOgogICAgICAgIGZpbGVzID0gW10KICAgICAgICBmb3IgZiBpbiBvcy5saXN0ZGlyKGZpbGVuYW1lKToKICAgICAgICAgICAgZmlsZXBhdGggPSBvcy5wYXRoLmpvaW4oZmlsZW5hbWUsIGYpCiAgICAgICAgICAgIGlmIGYgPT0gJ2luZGV4Lmh0bWwnOgogICAgICAgICAgICAgICAgd2l0aCBvcGVuKGZpbGVwYXRoLCAncicpIGFzIGZwOgogICAgICAgICAgICAgICAgICAgIGJvZHkgPSBmcC5yZWFkKCkKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGVsaWYgb3MucGF0aC5pc2RpcihmaWxlcGF0aCk6CiAgICAgICAgICAgICAgICBmICs9ICcvJwogICAgICAgICAgICBmaWxlcy5hcHBlbmQoJzxhIGhyZWY9IntuYW1lfSI+e25hbWV9PC9hPicuZm9ybWF0KG5hbWU9ZikpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgdG1wbCA9ICgKICAgICAgICAgICAgICAgICI8aHRtbD48aGVhZD48dGl0bGU+e3VybH08L3RpdGxlPiIKICAgICAgICAgICAgICAgICI8L2hlYWQ+PGJvZHk+e2ZpbGVzfTwvYm9keT48L2h0bWw+IikKICAgICAgICAgICAgYm9keSA9IHRtcGwuZm9ybWF0KHVybD11cmwsIGZpbGVzPSdcbicuam9pbihmaWxlcykpCiAgICAgICAgc3RhdHVzLCBtZXNzYWdlID0gMjAwLCAiT0siCiAgICBlbHNlOgogICAgICAgIHN0YXR1cywgbWVzc2FnZSwgYm9keSA9IDQwNCwgIlBhdGggbm90IGZvdW5kIiwgIk5vdCBmb3VuZCIKCiAgICBoZWFkZXJzID0geydjb250ZW50LXR5cGUnOiAndGV4dC9odG1sJ30KICAgIGJvZHlfc3RyZWFtID0gc2l4LlN0cmluZ0lPKGJvZHkpCiAgICByZXR1cm4gdXJsbGliLmVycm9yLkhUVFBFcnJvcih1cmwsIHN0YXR1cywgbWVzc2FnZSwgaGVhZGVycywgYm9keV9zdHJlYW0pClBLAwQUAAAAAAAAACEA/gVE1NgFAADYBQAAPQAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL3B5Mjdjb21wYXQucHkiIiIKQ29tcGF0aWJpbGl0eSBTdXBwb3J0IGZvciBQeXRob24gMi43IGFuZCBlYXJsaWVyCiIiIgoKaW1wb3J0IHN5cwppbXBvcnQgcGxhdGZvcm0KCmZyb20gc2V0dXB0b29scy5leHRlcm4gaW1wb3J0IHNpeAoKCmRlZiBnZXRfYWxsX2hlYWRlcnMobWVzc2FnZSwga2V5KToKICAgICIiIgogICAgR2l2ZW4gYW4gSFRUUE1lc3NhZ2UsIHJldHVybiBhbGwgaGVhZGVycyBtYXRjaGluZyBhIGdpdmVuIGtleS4KICAgICIiIgogICAgcmV0dXJuIG1lc3NhZ2UuZ2V0X2FsbChrZXkpCgoKaWYgc2l4LlBZMjoKICAgIGRlZiBnZXRfYWxsX2hlYWRlcnMobWVzc2FnZSwga2V5KToKICAgICAgICByZXR1cm4gbWVzc2FnZS5nZXRoZWFkZXJzKGtleSkKCgpsaW51eF9weTJfYXNjaWkgPSAoCiAgICBwbGF0Zm9ybS5zeXN0ZW0oKSA9PSAnTGludXgnIGFuZAogICAgc2l4LlBZMgopCgpybXRyZWVfc2FmZSA9IHN0ciBpZiBsaW51eF9weTJfYXNjaWkgZWxzZSBsYW1iZGEgeDogeAoiIiJXb3JrYXJvdW5kIGZvciBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMjQ2NzIiIiIKCgp0cnk6CiAgICBmcm9tIC5faW1wIGltcG9ydCBmaW5kX21vZHVsZSwgUFlfQ09NUElMRUQsIFBZX0ZST1pFTiwgUFlfU09VUkNFCiAgICBmcm9tIC5faW1wIGltcG9ydCBnZXRfZnJvemVuX29iamVjdCwgZ2V0X21vZHVsZQpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBpbXBvcnQgaW1wCiAgICBmcm9tIGltcCBpbXBvcnQgUFlfQ09NUElMRUQsIFBZX0ZST1pFTiwgUFlfU09VUkNFICAjIG5vcWEKCiAgICBkZWYgZmluZF9tb2R1bGUobW9kdWxlLCBwYXRocz1Ob25lKToKICAgICAgICAiIiJKdXN0IGxpa2UgJ2ltcC5maW5kX21vZHVsZSgpJywgYnV0IHdpdGggcGFja2FnZSBzdXBwb3J0IiIiCiAgICAgICAgcGFydHMgPSBtb2R1bGUuc3BsaXQoJy4nKQogICAgICAgIHdoaWxlIHBhcnRzOgogICAgICAgICAgICBwYXJ0ID0gcGFydHMucG9wKDApCiAgICAgICAgICAgIGYsIHBhdGgsIChzdWZmaXgsIG1vZGUsIGtpbmQpID0gaW5mbyA9IGltcC5maW5kX21vZHVsZShwYXJ0LCBwYXRocykKCiAgICAgICAgICAgIGlmIGtpbmQgPT0gaW1wLlBLR19ESVJFQ1RPUlk6CiAgICAgICAgICAgICAgICBwYXJ0cyA9IHBhcnRzIG9yIFsnX19pbml0X18nXQogICAgICAgICAgICAgICAgcGF0aHMgPSBbcGF0aF0KCiAgICAgICAgICAgIGVsaWYgcGFydHM6CiAgICAgICAgICAgICAgICByYWlzZSBJbXBvcnRFcnJvcigiQ2FuJ3QgZmluZCAlciBpbiAlcyIgJSAocGFydHMsIG1vZHVsZSkpCgogICAgICAgIHJldHVybiBpbmZvCgogICAgZGVmIGdldF9mcm96ZW5fb2JqZWN0KG1vZHVsZSwgcGF0aHMpOgogICAgICAgIHJldHVybiBpbXAuZ2V0X2Zyb3plbl9vYmplY3QobW9kdWxlKQoKICAgIGRlZiBnZXRfbW9kdWxlKG1vZHVsZSwgcGF0aHMsIGluZm8pOgogICAgICAgIGltcC5sb2FkX21vZHVsZShtb2R1bGUsICppbmZvKQogICAgICAgIHJldHVybiBzeXMubW9kdWxlc1ttb2R1bGVdClBLAwQUAAAAAAAAACEA3ssw4kYDAABGAwAAPQAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL3B5MzFjb21wYXQucHlfX2FsbF9fID0gW10KCl9fbWV0YWNsYXNzX18gPSB0eXBlCgoKdHJ5OgogICAgIyBQeXRob24gPj0zLjIKICAgIGZyb20gdGVtcGZpbGUgaW1wb3J0IFRlbXBvcmFyeURpcmVjdG9yeQpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBpbXBvcnQgc2h1dGlsCiAgICBpbXBvcnQgdGVtcGZpbGUKCiAgICBjbGFzcyBUZW1wb3JhcnlEaXJlY3Rvcnk6CiAgICAgICAgIiIiCiAgICAgICAgVmVyeSBzaW1wbGUgdGVtcG9yYXJ5IGRpcmVjdG9yeSBjb250ZXh0IG1hbmFnZXIuCiAgICAgICAgV2lsbCB0cnkgdG8gZGVsZXRlIGFmdGVyd2FyZCwgYnV0IHdpbGwgYWxzbyBpZ25vcmUgT1MgYW5kIHNpbWlsYXIKICAgICAgICBlcnJvcnMgb24gZGVsZXRpb24uCiAgICAgICAgIiIiCgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqKmt3YXJncyk6CiAgICAgICAgICAgIHNlbGYubmFtZSA9IE5vbmUgICMgSGFuZGxlIG1rZHRlbXAgcmFpc2luZyBhbiBleGNlcHRpb24KICAgICAgICAgICAgc2VsZi5uYW1lID0gdGVtcGZpbGUubWtkdGVtcCgqKmt3YXJncykKCiAgICAgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYubmFtZQoKICAgICAgICBkZWYgX19leGl0X18oc2VsZiwgZXhjdHlwZSwgZXhjdmFsdWUsIGV4Y3RyYWNlKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShzZWxmLm5hbWUsIFRydWUpCiAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOiAgIyByZW1vdmFsIGVycm9ycyBhcmUgbm90IHRoZSBvbmx5IHBvc3NpYmxlCiAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgIHNlbGYubmFtZSA9IE5vbmUKUEsDBBQAAAAAAAAAIQAHYdiiMgUAADIFAAA9AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvcHkzM2NvbXBhdC5weWltcG9ydCBkaXMKaW1wb3J0IGFycmF5CmltcG9ydCBjb2xsZWN0aW9ucwoKdHJ5OgogICAgaW1wb3J0IGh0bWwKZXhjZXB0IEltcG9ydEVycm9yOgogICAgaHRtbCA9IE5vbmUKCmZyb20gc2V0dXB0b29scy5leHRlcm4gaW1wb3J0IHNpeApmcm9tIHNldHVwdG9vbHMuZXh0ZXJuLnNpeC5tb3ZlcyBpbXBvcnQgaHRtbF9wYXJzZXIKCl9fbWV0YWNsYXNzX18gPSB0eXBlCgpPcEFyZyA9IGNvbGxlY3Rpb25zLm5hbWVkdHVwbGUoJ09wQXJnJywgJ29wY29kZSBhcmcnKQoKCmNsYXNzIEJ5dGVjb2RlX2NvbXBhdDoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb2RlKToKICAgICAgICBzZWxmLmNvZGUgPSBjb2RlCgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgICIiIllpZWxkICcob3AsYXJnKScgcGFpciBmb3IgZWFjaCBvcGVyYXRpb24gaW4gY29kZSBvYmplY3QgJ2NvZGUnIiIiCgogICAgICAgIGJ5dGVzID0gYXJyYXkuYXJyYXkoJ2InLCBzZWxmLmNvZGUuY29fY29kZSkKICAgICAgICBlb2YgPSBsZW4oc2VsZi5jb2RlLmNvX2NvZGUpCgogICAgICAgIHB0ciA9IDAKICAgICAgICBleHRlbmRlZF9hcmcgPSAwCgogICAgICAgIHdoaWxlIHB0ciA8IGVvZjoKCiAgICAgICAgICAgIG9wID0gYnl0ZXNbcHRyXQoKICAgICAgICAgICAgaWYgb3AgPj0gZGlzLkhBVkVfQVJHVU1FTlQ6CgogICAgICAgICAgICAgICAgYXJnID0gYnl0ZXNbcHRyICsgMV0gKyBieXRlc1twdHIgKyAyXSAqIDI1NiArIGV4dGVuZGVkX2FyZwogICAgICAgICAgICAgICAgcHRyICs9IDMKCiAgICAgICAgICAgICAgICBpZiBvcCA9PSBkaXMuRVhURU5ERURfQVJHOgogICAgICAgICAgICAgICAgICAgIGxvbmdfdHlwZSA9IHNpeC5pbnRlZ2VyX3R5cGVzWy0xXQogICAgICAgICAgICAgICAgICAgIGV4dGVuZGVkX2FyZyA9IGFyZyAqIGxvbmdfdHlwZSg2NTUzNikKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGFyZyA9IE5vbmUKICAgICAgICAgICAgICAgIHB0ciArPSAxCgogICAgICAgICAgICB5aWVsZCBPcEFyZyhvcCwgYXJnKQoKCkJ5dGVjb2RlID0gZ2V0YXR0cihkaXMsICdCeXRlY29kZScsIEJ5dGVjb2RlX2NvbXBhdCkKCgp1bmVzY2FwZSA9IGdldGF0dHIoaHRtbCwgJ3VuZXNjYXBlJywgTm9uZSkKaWYgdW5lc2NhcGUgaXMgTm9uZToKICAgICMgSFRNTFBhcnNlci51bmVzY2FwZSBpcyBkZXByZWNhdGVkIHNpbmNlIFB5dGhvbiAzLjQsIGFuZCB3aWxsIGJlIHJlbW92ZWQKICAgICMgZnJvbSAzLjkuCiAgICB1bmVzY2FwZSA9IGh0bWxfcGFyc2VyLkhUTUxQYXJzZXIoKS51bmVzY2FwZQpQSwMEFAAAAAAAAAAhAI5W0ET1AAAA9QAAAD0AAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9weTM0Y29tcGF0LnB5aW1wb3J0IGltcG9ydGxpYgoKdHJ5OgogICAgaW1wb3J0IGltcG9ydGxpYi51dGlsCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIHBhc3MKCgp0cnk6CiAgICBtb2R1bGVfZnJvbV9zcGVjID0gaW1wb3J0bGliLnV0aWwubW9kdWxlX2Zyb21fc3BlYwpleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICBkZWYgbW9kdWxlX2Zyb21fc3BlYyhzcGVjKToKICAgICAgICByZXR1cm4gc3BlYy5sb2FkZXIubG9hZF9tb2R1bGUoc3BlYy5uYW1lKQpQSwMEFAAAAAAAAAAhAIxTmmPENwAAxDcAADoAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9zYW5kYm94LnB5aW1wb3J0IG9zCmltcG9ydCBzeXMKaW1wb3J0IHRlbXBmaWxlCmltcG9ydCBvcGVyYXRvcgppbXBvcnQgZnVuY3Rvb2xzCmltcG9ydCBpdGVydG9vbHMKaW1wb3J0IHJlCmltcG9ydCBjb250ZXh0bGliCmltcG9ydCBwaWNrbGUKaW1wb3J0IHRleHR3cmFwCgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuIGltcG9ydCBzaXgKZnJvbSBzZXR1cHRvb2xzLmV4dGVybi5zaXgubW92ZXMgaW1wb3J0IGJ1aWx0aW5zLCBtYXAKCmltcG9ydCBwa2dfcmVzb3VyY2VzLnB5MzFjb21wYXQKCmlmIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdqYXZhJyk6CiAgICBpbXBvcnQgb3JnLnB5dGhvbi5tb2R1bGVzLnBvc2l4LlBvc2l4TW9kdWxlIGFzIF9vcwplbHNlOgogICAgX29zID0gc3lzLm1vZHVsZXNbb3MubmFtZV0KdHJ5OgogICAgX2ZpbGUgPSBmaWxlCmV4Y2VwdCBOYW1lRXJyb3I6CiAgICBfZmlsZSA9IE5vbmUKX29wZW4gPSBvcGVuCmZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzRXJyb3IKZnJvbSBwa2dfcmVzb3VyY2VzIGltcG9ydCB3b3JraW5nX3NldAoKCl9fYWxsX18gPSBbCiAgICAiQWJzdHJhY3RTYW5kYm94IiwgIkRpcmVjdG9yeVNhbmRib3giLCAiU2FuZGJveFZpb2xhdGlvbiIsICJydW5fc2V0dXAiLApdCgoKZGVmIF9leGVjZmlsZShmaWxlbmFtZSwgZ2xvYmFscywgbG9jYWxzPU5vbmUpOgogICAgIiIiCiAgICBQeXRob24gMyBpbXBsZW1lbnRhdGlvbiBvZiBleGVjZmlsZS4KICAgICIiIgogICAgbW9kZSA9ICdyYicKICAgIHdpdGggb3BlbihmaWxlbmFtZSwgbW9kZSkgYXMgc3RyZWFtOgogICAgICAgIHNjcmlwdCA9IHN0cmVhbS5yZWFkKCkKICAgIGlmIGxvY2FscyBpcyBOb25lOgogICAgICAgIGxvY2FscyA9IGdsb2JhbHMKICAgIGNvZGUgPSBjb21waWxlKHNjcmlwdCwgZmlsZW5hbWUsICdleGVjJykKICAgIGV4ZWMoY29kZSwgZ2xvYmFscywgbG9jYWxzKQoKCkBjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCmRlZiBzYXZlX2FyZ3YocmVwbD1Ob25lKToKICAgIHNhdmVkID0gc3lzLmFyZ3ZbOl0KICAgIGlmIHJlcGwgaXMgbm90IE5vbmU6CiAgICAgICAgc3lzLmFyZ3ZbOl0gPSByZXBsCiAgICB0cnk6CiAgICAgICAgeWllbGQgc2F2ZWQKICAgIGZpbmFsbHk6CiAgICAgICAgc3lzLmFyZ3ZbOl0gPSBzYXZlZAoKCkBjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCmRlZiBzYXZlX3BhdGgoKToKICAgIHNhdmVkID0gc3lzLnBhdGhbOl0KICAgIHRyeToKICAgICAgICB5aWVsZCBzYXZlZAogICAgZmluYWxseToKICAgICAgICBzeXMucGF0aFs6XSA9IHNhdmVkCgoKQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKZGVmIG92ZXJyaWRlX3RlbXAocmVwbGFjZW1lbnQpOgogICAgIiIiCiAgICBNb25rZXktcGF0Y2ggdGVtcGZpbGUudGVtcGRpciB3aXRoIHJlcGxhY2VtZW50LCBlbnN1cmluZyBpdCBleGlzdHMKICAgICIiIgogICAgcGtnX3Jlc291cmNlcy5weTMxY29tcGF0Lm1ha2VkaXJzKHJlcGxhY2VtZW50LCBleGlzdF9vaz1UcnVlKQoKICAgIHNhdmVkID0gdGVtcGZpbGUudGVtcGRpcgoKICAgIHRlbXBmaWxlLnRlbXBkaXIgPSByZXBsYWNlbWVudAoKICAgIHRyeToKICAgICAgICB5aWVsZAogICAgZmluYWxseToKICAgICAgICB0ZW1wZmlsZS50ZW1wZGlyID0gc2F2ZWQKCgpAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgpkZWYgcHVzaGQodGFyZ2V0KToKICAgIHNhdmVkID0gb3MuZ2V0Y3dkKCkKICAgIG9zLmNoZGlyKHRhcmdldCkKICAgIHRyeToKICAgICAgICB5aWVsZCBzYXZlZAogICAgZmluYWxseToKICAgICAgICBvcy5jaGRpcihzYXZlZCkKCgpjbGFzcyBVbnBpY2tsZWFibGVFeGNlcHRpb24oRXhjZXB0aW9uKToKICAgICIiIgogICAgQW4gZXhjZXB0aW9uIHJlcHJlc2VudGluZyBhbm90aGVyIEV4Y2VwdGlvbiB0aGF0IGNvdWxkIG5vdCBiZSBwaWNrbGVkLgogICAgIiIiCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIGR1bXAodHlwZSwgZXhjKToKICAgICAgICAiIiIKICAgICAgICBBbHdheXMgcmV0dXJuIGEgZHVtcGVkIChwaWNrbGVkKSB0eXBlIGFuZCBleGMuIElmIGV4YyBjYW4ndCBiZSBwaWNrbGVkLAogICAgICAgIHdyYXAgaXQgaW4gVW5waWNrbGVhYmxlRXhjZXB0aW9uIGZpcnN0LgogICAgICAgICIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHBpY2tsZS5kdW1wcyh0eXBlKSwgcGlja2xlLmR1bXBzKGV4YykKICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAjIGdldCBVbnBpY2tsZWFibGVFeGNlcHRpb24gaW5zaWRlIHRoZSBzYW5kYm94CiAgICAgICAgICAgIGZyb20gc2V0dXB0b29scy5zYW5kYm94IGltcG9ydCBVbnBpY2tsZWFibGVFeGNlcHRpb24gYXMgY2xzCiAgICAgICAgICAgIHJldHVybiBjbHMuZHVtcChjbHMsIGNscyhyZXByKGV4YykpKQoKCmNsYXNzIEV4Y2VwdGlvblNhdmVyOgogICAgIiIiCiAgICBBIENvbnRleHQgTWFuYWdlciB0aGF0IHdpbGwgc2F2ZSBhbiBleGNlcHRpb24sIHNlcmlhbGl6ZWQsIGFuZCByZXN0b3JlIGl0CiAgICBsYXRlci4KICAgICIiIgoKICAgIGRlZiBfX2VudGVyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgX19leGl0X18oc2VsZiwgdHlwZSwgZXhjLCB0Yik6CiAgICAgICAgaWYgbm90IGV4YzoKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICMgZHVtcCB0aGUgZXhjZXB0aW9uCiAgICAgICAgc2VsZi5fc2F2ZWQgPSBVbnBpY2tsZWFibGVFeGNlcHRpb24uZHVtcCh0eXBlLCBleGMpCiAgICAgICAgc2VsZi5fdGIgPSB0YgoKICAgICAgICAjIHN1cHByZXNzIHRoZSBleGNlcHRpb24KICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiByZXN1bWUoc2VsZik6CiAgICAgICAgInJlc3RvcmUgYW5kIHJlLXJhaXNlIGFueSBleGNlcHRpb24iCgogICAgICAgIGlmICdfc2F2ZWQnIG5vdCBpbiB2YXJzKHNlbGYpOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgdHlwZSwgZXhjID0gbWFwKHBpY2tsZS5sb2Fkcywgc2VsZi5fc2F2ZWQpCiAgICAgICAgc2l4LnJlcmFpc2UodHlwZSwgZXhjLCBzZWxmLl90YikKCgpAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgpkZWYgc2F2ZV9tb2R1bGVzKCk6CiAgICAiIiIKICAgIENvbnRleHQgaW4gd2hpY2ggaW1wb3J0ZWQgbW9kdWxlcyBhcmUgc2F2ZWQuCgogICAgVHJhbnNsYXRlcyBleGNlcHRpb25zIGludGVybmFsIHRvIHRoZSBjb250ZXh0IGludG8gdGhlIGVxdWl2YWxlbnQgZXhjZXB0aW9uCiAgICBvdXRzaWRlIHRoZSBjb250ZXh0LgogICAgIiIiCiAgICBzYXZlZCA9IHN5cy5tb2R1bGVzLmNvcHkoKQogICAgd2l0aCBFeGNlcHRpb25TYXZlcigpIGFzIHNhdmVkX2V4YzoKICAgICAgICB5aWVsZCBzYXZlZAoKICAgIHN5cy5tb2R1bGVzLnVwZGF0ZShzYXZlZCkKICAgICMgcmVtb3ZlIGFueSBtb2R1bGVzIGltcG9ydGVkIHNpbmNlCiAgICBkZWxfbW9kdWxlcyA9ICgKICAgICAgICBtb2RfbmFtZSBmb3IgbW9kX25hbWUgaW4gc3lzLm1vZHVsZXMKICAgICAgICBpZiBtb2RfbmFtZSBub3QgaW4gc2F2ZWQKICAgICAgICAjIGV4Y2x1ZGUgYW55IGVuY29kaW5ncyBtb2R1bGVzLiBTZWUgIzI4NQogICAgICAgIGFuZCBub3QgbW9kX25hbWUuc3RhcnRzd2l0aCgnZW5jb2RpbmdzLicpCiAgICApCiAgICBfY2xlYXJfbW9kdWxlcyhkZWxfbW9kdWxlcykKCiAgICBzYXZlZF9leGMucmVzdW1lKCkKCgpkZWYgX2NsZWFyX21vZHVsZXMobW9kdWxlX25hbWVzKToKICAgIGZvciBtb2RfbmFtZSBpbiBsaXN0KG1vZHVsZV9uYW1lcyk6CiAgICAgICAgZGVsIHN5cy5tb2R1bGVzW21vZF9uYW1lXQoKCkBjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCmRlZiBzYXZlX3BrZ19yZXNvdXJjZXNfc3RhdGUoKToKICAgIHNhdmVkID0gcGtnX3Jlc291cmNlcy5fX2dldHN0YXRlX18oKQogICAgdHJ5OgogICAgICAgIHlpZWxkIHNhdmVkCiAgICBmaW5hbGx5OgogICAgICAgIHBrZ19yZXNvdXJjZXMuX19zZXRzdGF0ZV9fKHNhdmVkKQoKCkBjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCmRlZiBzZXR1cF9jb250ZXh0KHNldHVwX2Rpcik6CiAgICB0ZW1wX2RpciA9IG9zLnBhdGguam9pbihzZXR1cF9kaXIsICd0ZW1wJykKICAgIHdpdGggc2F2ZV9wa2dfcmVzb3VyY2VzX3N0YXRlKCk6CiAgICAgICAgd2l0aCBzYXZlX21vZHVsZXMoKToKICAgICAgICAgICAgaGlkZV9zZXR1cHRvb2xzKCkKICAgICAgICAgICAgd2l0aCBzYXZlX3BhdGgoKToKICAgICAgICAgICAgICAgIHdpdGggc2F2ZV9hcmd2KCk6CiAgICAgICAgICAgICAgICAgICAgd2l0aCBvdmVycmlkZV90ZW1wKHRlbXBfZGlyKToKICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBwdXNoZChzZXR1cF9kaXIpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBlbnN1cmUgc2V0dXB0b29scyBjb21tYW5kcyBhcmUgYXZhaWxhYmxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ltcG9ydF9fKCdzZXR1cHRvb2xzJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkCgoKZGVmIF9uZWVkc19oaWRpbmcobW9kX25hbWUpOgogICAgIiIiCiAgICA+Pj4gX25lZWRzX2hpZGluZygnc2V0dXB0b29scycpCiAgICBUcnVlCiAgICA+Pj4gX25lZWRzX2hpZGluZygncGtnX3Jlc291cmNlcycpCiAgICBUcnVlCiAgICA+Pj4gX25lZWRzX2hpZGluZygnc2V0dXB0b29sc19wbHVnaW4nKQogICAgRmFsc2UKICAgID4+PiBfbmVlZHNfaGlkaW5nKCdzZXR1cHRvb2xzLl9faW5pdF9fJykKICAgIFRydWUKICAgID4+PiBfbmVlZHNfaGlkaW5nKCdkaXN0dXRpbHMnKQogICAgVHJ1ZQogICAgPj4+IF9uZWVkc19oaWRpbmcoJ29zJykKICAgIEZhbHNlCiAgICA+Pj4gX25lZWRzX2hpZGluZygnQ3l0aG9uJykKICAgIFRydWUKICAgICIiIgogICAgcGF0dGVybiA9IHJlLmNvbXBpbGUocicoc2V0dXB0b29sc3xwa2dfcmVzb3VyY2VzfGRpc3R1dGlsc3xDeXRob24pKFwufCQpJykKICAgIHJldHVybiBib29sKHBhdHRlcm4ubWF0Y2gobW9kX25hbWUpKQoKCmRlZiBoaWRlX3NldHVwdG9vbHMoKToKICAgICIiIgogICAgUmVtb3ZlIHJlZmVyZW5jZXMgdG8gc2V0dXB0b29scycgbW9kdWxlcyBmcm9tIHN5cy5tb2R1bGVzIHRvIGFsbG93IHRoZQogICAgaW52b2NhdGlvbiB0byBpbXBvcnQgdGhlIG1vc3QgYXBwcm9wcmlhdGUgc2V0dXB0b29scy4gVGhpcyB0ZWNobmlxdWUgaXMKICAgIG5lY2Vzc2FyeSB0byBhdm9pZCBpc3N1ZXMgc3VjaCBhcyAjMzE1IHdoZXJlIHNldHVwdG9vbHMgdXBncmFkaW5nIGl0c2VsZgogICAgd291bGQgZmFpbCB0byBmaW5kIGEgZnVuY3Rpb24gZGVjbGFyZWQgaW4gdGhlIG1ldGFkYXRhLgogICAgIiIiCiAgICBtb2R1bGVzID0gZmlsdGVyKF9uZWVkc19oaWRpbmcsIHN5cy5tb2R1bGVzKQogICAgX2NsZWFyX21vZHVsZXMobW9kdWxlcykKCgpkZWYgcnVuX3NldHVwKHNldHVwX3NjcmlwdCwgYXJncyk6CiAgICAiIiJSdW4gYSBkaXN0dXRpbHMgc2V0dXAgc2NyaXB0LCBzYW5kYm94ZWQgaW4gaXRzIGRpcmVjdG9yeSIiIgogICAgc2V0dXBfZGlyID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGguZGlybmFtZShzZXR1cF9zY3JpcHQpKQogICAgd2l0aCBzZXR1cF9jb250ZXh0KHNldHVwX2Rpcik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBzeXMuYXJndls6XSA9IFtzZXR1cF9zY3JpcHRdICsgbGlzdChhcmdzKQogICAgICAgICAgICBzeXMucGF0aC5pbnNlcnQoMCwgc2V0dXBfZGlyKQogICAgICAgICAgICAjIHJlc2V0IHRvIGluY2x1ZGUgc2V0dXAgZGlyLCB3L2NsZWFuIGNhbGxiYWNrIGxpc3QKICAgICAgICAgICAgd29ya2luZ19zZXQuX19pbml0X18oKQogICAgICAgICAgICB3b3JraW5nX3NldC5jYWxsYmFja3MuYXBwZW5kKGxhbWJkYSBkaXN0OiBkaXN0LmFjdGl2YXRlKCkpCgogICAgICAgICAgICAjIF9fZmlsZV9fIHNob3VsZCBiZSBhIGJ5dGUgc3RyaW5nIG9uIFB5dGhvbiAyICgjNzEyKQogICAgICAgICAgICBkdW5kZXJfZmlsZSA9ICgKICAgICAgICAgICAgICAgIHNldHVwX3NjcmlwdAogICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShzZXR1cF9zY3JpcHQsIHN0cikgZWxzZQogICAgICAgICAgICAgICAgc2V0dXBfc2NyaXB0LmVuY29kZShzeXMuZ2V0ZmlsZXN5c3RlbWVuY29kaW5nKCkpCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIHdpdGggRGlyZWN0b3J5U2FuZGJveChzZXR1cF9kaXIpOgogICAgICAgICAgICAgICAgbnMgPSBkaWN0KF9fZmlsZV9fPWR1bmRlcl9maWxlLCBfX25hbWVfXz0nX19tYWluX18nKQogICAgICAgICAgICAgICAgX2V4ZWNmaWxlKHNldHVwX3NjcmlwdCwgbnMpCiAgICAgICAgZXhjZXB0IFN5c3RlbUV4aXQgYXMgdjoKICAgICAgICAgICAgaWYgdi5hcmdzIGFuZCB2LmFyZ3NbMF06CiAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICAgICAjIE5vcm1hbCBleGl0LCBqdXN0IHJldHVybgoKCmNsYXNzIEFic3RyYWN0U2FuZGJveDoKICAgICIiIldyYXAgJ29zJyBtb2R1bGUgYW5kICdvcGVuKCknIGJ1aWx0aW4gZm9yIHZpcnR1YWxpemluZyBzZXR1cCBzY3JpcHRzIiIiCgogICAgX2FjdGl2ZSA9IEZhbHNlCgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHNlbGYuX2F0dHJzID0gWwogICAgICAgICAgICBuYW1lIGZvciBuYW1lIGluIGRpcihfb3MpCiAgICAgICAgICAgIGlmIG5vdCBuYW1lLnN0YXJ0c3dpdGgoJ18nKSBhbmQgaGFzYXR0cihzZWxmLCBuYW1lKQogICAgICAgIF0KCiAgICBkZWYgX2NvcHkoc2VsZiwgc291cmNlKToKICAgICAgICBmb3IgbmFtZSBpbiBzZWxmLl9hdHRyczoKICAgICAgICAgICAgc2V0YXR0cihvcywgbmFtZSwgZ2V0YXR0cihzb3VyY2UsIG5hbWUpKQoKICAgIGRlZiBfX2VudGVyX18oc2VsZik6CiAgICAgICAgc2VsZi5fY29weShzZWxmKQogICAgICAgIGlmIF9maWxlOgogICAgICAgICAgICBidWlsdGlucy5maWxlID0gc2VsZi5fZmlsZQogICAgICAgIGJ1aWx0aW5zLm9wZW4gPSBzZWxmLl9vcGVuCiAgICAgICAgc2VsZi5fYWN0aXZlID0gVHJ1ZQoKICAgIGRlZiBfX2V4aXRfXyhzZWxmLCBleGNfdHlwZSwgZXhjX3ZhbHVlLCB0cmFjZWJhY2spOgogICAgICAgIHNlbGYuX2FjdGl2ZSA9IEZhbHNlCiAgICAgICAgaWYgX2ZpbGU6CiAgICAgICAgICAgIGJ1aWx0aW5zLmZpbGUgPSBfZmlsZQogICAgICAgIGJ1aWx0aW5zLm9wZW4gPSBfb3BlbgogICAgICAgIHNlbGYuX2NvcHkoX29zKQoKICAgIGRlZiBydW4oc2VsZiwgZnVuYyk6CiAgICAgICAgIiIiUnVuICdmdW5jJyB1bmRlciBvcyBzYW5kYm94aW5nIiIiCiAgICAgICAgd2l0aCBzZWxmOgogICAgICAgICAgICByZXR1cm4gZnVuYygpCgogICAgZGVmIF9ta19kdWFsX3BhdGhfd3JhcHBlcihuYW1lKToKICAgICAgICBvcmlnaW5hbCA9IGdldGF0dHIoX29zLCBuYW1lKQoKICAgICAgICBkZWYgd3JhcChzZWxmLCBzcmMsIGRzdCwgKmFyZ3MsICoqa3cpOgogICAgICAgICAgICBpZiBzZWxmLl9hY3RpdmU6CiAgICAgICAgICAgICAgICBzcmMsIGRzdCA9IHNlbGYuX3JlbWFwX3BhaXIobmFtZSwgc3JjLCBkc3QsICphcmdzLCAqKmt3KQogICAgICAgICAgICByZXR1cm4gb3JpZ2luYWwoc3JjLCBkc3QsICphcmdzLCAqKmt3KQoKICAgICAgICByZXR1cm4gd3JhcAoKICAgIGZvciBuYW1lIGluIFsicmVuYW1lIiwgImxpbmsiLCAic3ltbGluayJdOgogICAgICAgIGlmIGhhc2F0dHIoX29zLCBuYW1lKToKICAgICAgICAgICAgbG9jYWxzKClbbmFtZV0gPSBfbWtfZHVhbF9wYXRoX3dyYXBwZXIobmFtZSkKCiAgICBkZWYgX21rX3NpbmdsZV9wYXRoX3dyYXBwZXIobmFtZSwgb3JpZ2luYWw9Tm9uZSk6CiAgICAgICAgb3JpZ2luYWwgPSBvcmlnaW5hbCBvciBnZXRhdHRyKF9vcywgbmFtZSkKCiAgICAgICAgZGVmIHdyYXAoc2VsZiwgcGF0aCwgKmFyZ3MsICoqa3cpOgogICAgICAgICAgICBpZiBzZWxmLl9hY3RpdmU6CiAgICAgICAgICAgICAgICBwYXRoID0gc2VsZi5fcmVtYXBfaW5wdXQobmFtZSwgcGF0aCwgKmFyZ3MsICoqa3cpCiAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbChwYXRoLCAqYXJncywgKiprdykKCiAgICAgICAgcmV0dXJuIHdyYXAKCiAgICBpZiBfZmlsZToKICAgICAgICBfZmlsZSA9IF9ta19zaW5nbGVfcGF0aF93cmFwcGVyKCdmaWxlJywgX2ZpbGUpCiAgICBfb3BlbiA9IF9ta19zaW5nbGVfcGF0aF93cmFwcGVyKCdvcGVuJywgX29wZW4pCiAgICBmb3IgbmFtZSBpbiBbCiAgICAgICAgInN0YXQiLCAibGlzdGRpciIsICJjaGRpciIsICJvcGVuIiwgImNobW9kIiwgImNob3duIiwgIm1rZGlyIiwKICAgICAgICAicmVtb3ZlIiwgInVubGluayIsICJybWRpciIsICJ1dGltZSIsICJsY2hvd24iLCAiY2hyb290IiwgImxzdGF0IiwKICAgICAgICAic3RhcnRmaWxlIiwgIm1rZmlmbyIsICJta25vZCIsICJwYXRoY29uZiIsICJhY2Nlc3MiCiAgICBdOgogICAgICAgIGlmIGhhc2F0dHIoX29zLCBuYW1lKToKICAgICAgICAgICAgbG9jYWxzKClbbmFtZV0gPSBfbWtfc2luZ2xlX3BhdGhfd3JhcHBlcihuYW1lKQoKICAgIGRlZiBfbWtfc2luZ2xlX3dpdGhfcmV0dXJuKG5hbWUpOgogICAgICAgIG9yaWdpbmFsID0gZ2V0YXR0cihfb3MsIG5hbWUpCgogICAgICAgIGRlZiB3cmFwKHNlbGYsIHBhdGgsICphcmdzLCAqKmt3KToKICAgICAgICAgICAgaWYgc2VsZi5fYWN0aXZlOgogICAgICAgICAgICAgICAgcGF0aCA9IHNlbGYuX3JlbWFwX2lucHV0KG5hbWUsIHBhdGgsICphcmdzLCAqKmt3KQogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3JlbWFwX291dHB1dChuYW1lLCBvcmlnaW5hbChwYXRoLCAqYXJncywgKiprdykpCiAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbChwYXRoLCAqYXJncywgKiprdykKCiAgICAgICAgcmV0dXJuIHdyYXAKCiAgICBmb3IgbmFtZSBpbiBbJ3JlYWRsaW5rJywgJ3RlbXBuYW0nXToKICAgICAgICBpZiBoYXNhdHRyKF9vcywgbmFtZSk6CiAgICAgICAgICAgIGxvY2FscygpW25hbWVdID0gX21rX3NpbmdsZV93aXRoX3JldHVybihuYW1lKQoKICAgIGRlZiBfbWtfcXVlcnkobmFtZSk6CiAgICAgICAgb3JpZ2luYWwgPSBnZXRhdHRyKF9vcywgbmFtZSkKCiAgICAgICAgZGVmIHdyYXAoc2VsZiwgKmFyZ3MsICoqa3cpOgogICAgICAgICAgICByZXR2YWwgPSBvcmlnaW5hbCgqYXJncywgKiprdykKICAgICAgICAgICAgaWYgc2VsZi5fYWN0aXZlOgogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3JlbWFwX291dHB1dChuYW1lLCByZXR2YWwpCiAgICAgICAgICAgIHJldHVybiByZXR2YWwKCiAgICAgICAgcmV0dXJuIHdyYXAKCiAgICBmb3IgbmFtZSBpbiBbJ2dldGN3ZCcsICd0bXBuYW0nXToKICAgICAgICBpZiBoYXNhdHRyKF9vcywgbmFtZSk6CiAgICAgICAgICAgIGxvY2FscygpW25hbWVdID0gX21rX3F1ZXJ5KG5hbWUpCgogICAgZGVmIF92YWxpZGF0ZV9wYXRoKHNlbGYsIHBhdGgpOgogICAgICAgICIiIkNhbGxlZCB0byByZW1hcCBvciB2YWxpZGF0ZSBhbnkgcGF0aCwgd2hldGhlciBpbnB1dCBvciBvdXRwdXQiIiIKICAgICAgICByZXR1cm4gcGF0aAoKICAgIGRlZiBfcmVtYXBfaW5wdXQoc2VsZiwgb3BlcmF0aW9uLCBwYXRoLCAqYXJncywgKiprdyk6CiAgICAgICAgIiIiQ2FsbGVkIGZvciBwYXRoIGlucHV0cyIiIgogICAgICAgIHJldHVybiBzZWxmLl92YWxpZGF0ZV9wYXRoKHBhdGgpCgogICAgZGVmIF9yZW1hcF9vdXRwdXQoc2VsZiwgb3BlcmF0aW9uLCBwYXRoKToKICAgICAgICAiIiJDYWxsZWQgZm9yIHBhdGggb3V0cHV0cyIiIgogICAgICAgIHJldHVybiBzZWxmLl92YWxpZGF0ZV9wYXRoKHBhdGgpCgogICAgZGVmIF9yZW1hcF9wYWlyKHNlbGYsIG9wZXJhdGlvbiwgc3JjLCBkc3QsICphcmdzLCAqKmt3KToKICAgICAgICAiIiJDYWxsZWQgZm9yIHBhdGggcGFpcnMgbGlrZSByZW5hbWUsIGxpbmssIGFuZCBzeW1saW5rIG9wZXJhdGlvbnMiIiIKICAgICAgICByZXR1cm4gKAogICAgICAgICAgICBzZWxmLl9yZW1hcF9pbnB1dChvcGVyYXRpb24gKyAnLWZyb20nLCBzcmMsICphcmdzLCAqKmt3KSwKICAgICAgICAgICAgc2VsZi5fcmVtYXBfaW5wdXQob3BlcmF0aW9uICsgJy10bycsIGRzdCwgKmFyZ3MsICoqa3cpCiAgICAgICAgKQoKCmlmIGhhc2F0dHIob3MsICdkZXZudWxsJyk6CiAgICBfRVhDRVBUSU9OUyA9IFtvcy5kZXZudWxsLF0KZWxzZToKICAgIF9FWENFUFRJT05TID0gW10KCgpjbGFzcyBEaXJlY3RvcnlTYW5kYm94KEFic3RyYWN0U2FuZGJveCk6CiAgICAiIiJSZXN0cmljdCBvcGVyYXRpb25zIHRvIGEgc2luZ2xlIHN1YmRpcmVjdG9yeSAtIHBzZXVkby1jaHJvb3QiIiIKCiAgICB3cml0ZV9vcHMgPSBkaWN0LmZyb21rZXlzKFsKICAgICAgICAib3BlbiIsICJjaG1vZCIsICJjaG93biIsICJta2RpciIsICJyZW1vdmUiLCAidW5saW5rIiwgInJtZGlyIiwKICAgICAgICAidXRpbWUiLCAibGNob3duIiwgImNocm9vdCIsICJta2ZpZm8iLCAibWtub2QiLCAidGVtcG5hbSIsCiAgICBdKQoKICAgIF9leGNlcHRpb25fcGF0dGVybnMgPSBbCiAgICAgICAgIyBBbGxvdyBsaWIydG8zIHRvIGF0dGVtcHQgdG8gc2F2ZSBhIHBpY2tsZWQgZ3JhbW1hciBvYmplY3QgKCMxMjEpCiAgICAgICAgcicuKmxpYjJ0bzMuKlwucGlja2xlJCcsCiAgICBdCiAgICAiZXhlbXB0IHdyaXRpbmcgdG8gcGF0aHMgdGhhdCBtYXRjaCB0aGUgcGF0dGVybiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgc2FuZGJveCwgZXhjZXB0aW9ucz1fRVhDRVBUSU9OUyk6CiAgICAgICAgc2VsZi5fc2FuZGJveCA9IG9zLnBhdGgubm9ybWNhc2Uob3MucGF0aC5yZWFscGF0aChzYW5kYm94KSkKICAgICAgICBzZWxmLl9wcmVmaXggPSBvcy5wYXRoLmpvaW4oc2VsZi5fc2FuZGJveCwgJycpCiAgICAgICAgc2VsZi5fZXhjZXB0aW9ucyA9IFsKICAgICAgICAgICAgb3MucGF0aC5ub3JtY2FzZShvcy5wYXRoLnJlYWxwYXRoKHBhdGgpKQogICAgICAgICAgICBmb3IgcGF0aCBpbiBleGNlcHRpb25zCiAgICAgICAgXQogICAgICAgIEFic3RyYWN0U2FuZGJveC5fX2luaXRfXyhzZWxmKQoKICAgIGRlZiBfdmlvbGF0aW9uKHNlbGYsIG9wZXJhdGlvbiwgKmFyZ3MsICoqa3cpOgogICAgICAgIGZyb20gc2V0dXB0b29scy5zYW5kYm94IGltcG9ydCBTYW5kYm94VmlvbGF0aW9uCiAgICAgICAgcmFpc2UgU2FuZGJveFZpb2xhdGlvbihvcGVyYXRpb24sIGFyZ3MsIGt3KQoKICAgIGlmIF9maWxlOgoKICAgICAgICBkZWYgX2ZpbGUoc2VsZiwgcGF0aCwgbW9kZT0ncicsICphcmdzLCAqKmt3KToKICAgICAgICAgICAgaWYgbW9kZSBub3QgaW4gKCdyJywgJ3J0JywgJ3JiJywgJ3JVJywgJ1UnKSBhbmQgbm90IHNlbGYuX29rKHBhdGgpOgogICAgICAgICAgICAgICAgc2VsZi5fdmlvbGF0aW9uKCJmaWxlIiwgcGF0aCwgbW9kZSwgKmFyZ3MsICoqa3cpCiAgICAgICAgICAgIHJldHVybiBfZmlsZShwYXRoLCBtb2RlLCAqYXJncywgKiprdykKCiAgICBkZWYgX29wZW4oc2VsZiwgcGF0aCwgbW9kZT0ncicsICphcmdzLCAqKmt3KToKICAgICAgICBpZiBtb2RlIG5vdCBpbiAoJ3InLCAncnQnLCAncmInLCAnclUnLCAnVScpIGFuZCBub3Qgc2VsZi5fb2socGF0aCk6CiAgICAgICAgICAgIHNlbGYuX3Zpb2xhdGlvbigib3BlbiIsIHBhdGgsIG1vZGUsICphcmdzLCAqKmt3KQogICAgICAgIHJldHVybiBfb3BlbihwYXRoLCBtb2RlLCAqYXJncywgKiprdykKCiAgICBkZWYgdG1wbmFtKHNlbGYpOgogICAgICAgIHNlbGYuX3Zpb2xhdGlvbigidG1wbmFtIikKCiAgICBkZWYgX29rKHNlbGYsIHBhdGgpOgogICAgICAgIGFjdGl2ZSA9IHNlbGYuX2FjdGl2ZQogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5fYWN0aXZlID0gRmFsc2UKICAgICAgICAgICAgcmVhbHBhdGggPSBvcy5wYXRoLm5vcm1jYXNlKG9zLnBhdGgucmVhbHBhdGgocGF0aCkpCiAgICAgICAgICAgIHJldHVybiAoCiAgICAgICAgICAgICAgICBzZWxmLl9leGVtcHRlZChyZWFscGF0aCkKICAgICAgICAgICAgICAgIG9yIHJlYWxwYXRoID09IHNlbGYuX3NhbmRib3gKICAgICAgICAgICAgICAgIG9yIHJlYWxwYXRoLnN0YXJ0c3dpdGgoc2VsZi5fcHJlZml4KQogICAgICAgICAgICApCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgc2VsZi5fYWN0aXZlID0gYWN0aXZlCgogICAgZGVmIF9leGVtcHRlZChzZWxmLCBmaWxlcGF0aCk6CiAgICAgICAgc3RhcnRfbWF0Y2hlcyA9ICgKICAgICAgICAgICAgZmlsZXBhdGguc3RhcnRzd2l0aChleGNlcHRpb24pCiAgICAgICAgICAgIGZvciBleGNlcHRpb24gaW4gc2VsZi5fZXhjZXB0aW9ucwogICAgICAgICkKICAgICAgICBwYXR0ZXJuX21hdGNoZXMgPSAoCiAgICAgICAgICAgIHJlLm1hdGNoKHBhdHRlcm4sIGZpbGVwYXRoKQogICAgICAgICAgICBmb3IgcGF0dGVybiBpbiBzZWxmLl9leGNlcHRpb25fcGF0dGVybnMKICAgICAgICApCiAgICAgICAgY2FuZGlkYXRlcyA9IGl0ZXJ0b29scy5jaGFpbihzdGFydF9tYXRjaGVzLCBwYXR0ZXJuX21hdGNoZXMpCiAgICAgICAgcmV0dXJuIGFueShjYW5kaWRhdGVzKQoKICAgIGRlZiBfcmVtYXBfaW5wdXQoc2VsZiwgb3BlcmF0aW9uLCBwYXRoLCAqYXJncywgKiprdyk6CiAgICAgICAgIiIiQ2FsbGVkIGZvciBwYXRoIGlucHV0cyIiIgogICAgICAgIGlmIG9wZXJhdGlvbiBpbiBzZWxmLndyaXRlX29wcyBhbmQgbm90IHNlbGYuX29rKHBhdGgpOgogICAgICAgICAgICBzZWxmLl92aW9sYXRpb24ob3BlcmF0aW9uLCBvcy5wYXRoLnJlYWxwYXRoKHBhdGgpLCAqYXJncywgKiprdykKICAgICAgICByZXR1cm4gcGF0aAoKICAgIGRlZiBfcmVtYXBfcGFpcihzZWxmLCBvcGVyYXRpb24sIHNyYywgZHN0LCAqYXJncywgKiprdyk6CiAgICAgICAgIiIiQ2FsbGVkIGZvciBwYXRoIHBhaXJzIGxpa2UgcmVuYW1lLCBsaW5rLCBhbmQgc3ltbGluayBvcGVyYXRpb25zIiIiCiAgICAgICAgaWYgbm90IHNlbGYuX29rKHNyYykgb3Igbm90IHNlbGYuX29rKGRzdCk6CiAgICAgICAgICAgIHNlbGYuX3Zpb2xhdGlvbihvcGVyYXRpb24sIHNyYywgZHN0LCAqYXJncywgKiprdykKICAgICAgICByZXR1cm4gKHNyYywgZHN0KQoKICAgIGRlZiBvcGVuKHNlbGYsIGZpbGUsIGZsYWdzLCBtb2RlPTBvNzc3LCAqYXJncywgKiprdyk6CiAgICAgICAgIiIiQ2FsbGVkIGZvciBsb3ctbGV2ZWwgb3Mub3BlbigpIiIiCiAgICAgICAgaWYgZmxhZ3MgJiBXUklURV9GTEFHUyBhbmQgbm90IHNlbGYuX29rKGZpbGUpOgogICAgICAgICAgICBzZWxmLl92aW9sYXRpb24oIm9zLm9wZW4iLCBmaWxlLCBmbGFncywgbW9kZSwgKmFyZ3MsICoqa3cpCiAgICAgICAgcmV0dXJuIF9vcy5vcGVuKGZpbGUsIGZsYWdzLCBtb2RlLCAqYXJncywgKiprdykKCgpXUklURV9GTEFHUyA9IGZ1bmN0b29scy5yZWR1Y2UoCiAgICBvcGVyYXRvci5vcl8sIFtnZXRhdHRyKF9vcywgYSwgMCkgZm9yIGEgaW4KICAgICAgICAiT19XUk9OTFkgT19SRFdSIE9fQVBQRU5EIE9fQ1JFQVQgT19UUlVOQyBPX1RFTVBPUkFSWSIuc3BsaXQoKV0KKQoKCmNsYXNzIFNhbmRib3hWaW9sYXRpb24oRGlzdHV0aWxzRXJyb3IpOgogICAgIiIiQSBzZXR1cCBzY3JpcHQgYXR0ZW1wdGVkIHRvIG1vZGlmeSB0aGUgZmlsZXN5c3RlbSBvdXRzaWRlIHRoZSBzYW5kYm94IiIiCgogICAgdG1wbCA9IHRleHR3cmFwLmRlZGVudCgiIiIKICAgICAgICBTYW5kYm94VmlvbGF0aW9uOiB7Y21kfXthcmdzIXJ9IHtrd2FyZ3N9CgogICAgICAgIFRoZSBwYWNrYWdlIHNldHVwIHNjcmlwdCBoYXMgYXR0ZW1wdGVkIHRvIG1vZGlmeSBmaWxlcyBvbiB5b3VyIHN5c3RlbQogICAgICAgIHRoYXQgYXJlIG5vdCB3aXRoaW4gdGhlIEVhc3lJbnN0YWxsIGJ1aWxkIGFyZWEsIGFuZCBoYXMgYmVlbiBhYm9ydGVkLgoKICAgICAgICBUaGlzIHBhY2thZ2UgY2Fubm90IGJlIHNhZmVseSBpbnN0YWxsZWQgYnkgRWFzeUluc3RhbGwsIGFuZCBtYXkgbm90CiAgICAgICAgc3VwcG9ydCBhbHRlcm5hdGUgaW5zdGFsbGF0aW9uIGxvY2F0aW9ucyBldmVuIGlmIHlvdSBydW4gaXRzIHNldHVwCiAgICAgICAgc2NyaXB0IGJ5IGhhbmQuICBQbGVhc2UgaW5mb3JtIHRoZSBwYWNrYWdlJ3MgYXV0aG9yIGFuZCB0aGUgRWFzeUluc3RhbGwKICAgICAgICBtYWludGFpbmVycyB0byBmaW5kIG91dCBpZiBhIGZpeCBvciB3b3JrYXJvdW5kIGlzIGF2YWlsYWJsZS4KICAgICAgICAiIiIpLmxzdHJpcCgpCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgY21kLCBhcmdzLCBrd2FyZ3MgPSBzZWxmLmFyZ3MKICAgICAgICByZXR1cm4gc2VsZi50bXBsLmZvcm1hdCgqKmxvY2FscygpKQpQSwMEFAAAAAAAAAAhAKgztL6KAAAAigAAADsAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9zY3JpcHQudG1wbCMgRUFTWS1JTlNUQUxMLVNDUklQVDogJShzcGVjKXIsJShzY3JpcHRfbmFtZSlyCl9fcmVxdWlyZXNfXyA9ICUoc3BlYylyCl9faW1wb3J0X18oJ3BrZ19yZXNvdXJjZXMnKS5ydW5fc2NyaXB0KCUoc3BlYylyLCAlKHNjcmlwdF9uYW1lKXIpClBLAwQUAAAAAAAAACEArSqDNv4IAAD+CAAAPQAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL3NpdGUtcGF0Y2gucHlkZWYgX19ib290KCk6CiAgICBpbXBvcnQgc3lzCiAgICBpbXBvcnQgb3MKICAgIFBZVEhPTlBBVEggPSBvcy5lbnZpcm9uLmdldCgnUFlUSE9OUEFUSCcpCiAgICBpZiBQWVRIT05QQVRIIGlzIE5vbmUgb3IgKHN5cy5wbGF0Zm9ybSA9PSAnd2luMzInIGFuZCBub3QgUFlUSE9OUEFUSCk6CiAgICAgICAgUFlUSE9OUEFUSCA9IFtdCiAgICBlbHNlOgogICAgICAgIFBZVEhPTlBBVEggPSBQWVRIT05QQVRILnNwbGl0KG9zLnBhdGhzZXApCgogICAgcGljID0gZ2V0YXR0cihzeXMsICdwYXRoX2ltcG9ydGVyX2NhY2hlJywge30pCiAgICBzdGRwYXRoID0gc3lzLnBhdGhbbGVuKFBZVEhPTlBBVEgpOl0KICAgIG15ZGlyID0gb3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKQoKICAgIGZvciBpdGVtIGluIHN0ZHBhdGg6CiAgICAgICAgaWYgaXRlbSA9PSBteWRpciBvciBub3QgaXRlbToKICAgICAgICAgICAgY29udGludWUgICMgc2tpcCBpZiBjdXJyZW50IGRpci4gb24gV2luZG93cywgb3IgbXkgb3duIGRpcmVjdG9yeQogICAgICAgIGltcG9ydGVyID0gcGljLmdldChpdGVtKQogICAgICAgIGlmIGltcG9ydGVyIGlzIG5vdCBOb25lOgogICAgICAgICAgICBsb2FkZXIgPSBpbXBvcnRlci5maW5kX21vZHVsZSgnc2l0ZScpCiAgICAgICAgICAgIGlmIGxvYWRlciBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICMgVGhpcyBzaG91bGQgYWN0dWFsbHkgcmVsb2FkIHRoZSBjdXJyZW50IG1vZHVsZQogICAgICAgICAgICAgICAgbG9hZGVyLmxvYWRfbW9kdWxlKCdzaXRlJykKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgZWxzZToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgaW1wb3J0IGltcCAgIyBBdm9pZCBpbXBvcnQgbG9vcCBpbiBQeXRob24gMwogICAgICAgICAgICAgICAgc3RyZWFtLCBwYXRoLCBkZXNjciA9IGltcC5maW5kX21vZHVsZSgnc2l0ZScsIFtpdGVtXSkKICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYgc3RyZWFtIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAjIFRoaXMgc2hvdWxkIGFjdHVhbGx5IHJlbG9hZCB0aGUgY3VycmVudCBtb2R1bGUKICAgICAgICAgICAgICAgIGltcC5sb2FkX21vZHVsZSgnc2l0ZScsIHN0cmVhbSwgcGF0aCwgZGVzY3IpCiAgICAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICAgICBzdHJlYW0uY2xvc2UoKQogICAgICAgICAgICBicmVhawogICAgZWxzZToKICAgICAgICByYWlzZSBJbXBvcnRFcnJvcigiQ291bGRuJ3QgZmluZCB0aGUgcmVhbCAnc2l0ZScgbW9kdWxlIikKCiAgICBrbm93bl9wYXRocyA9IGRpY3QoWyhtYWtlcGF0aChpdGVtKVsxXSwgMSkgZm9yIGl0ZW0gaW4gc3lzLnBhdGhdKSAgIyAyLjIgY29tcAoKICAgIG9sZHBvcyA9IGdldGF0dHIoc3lzLCAnX19lZ2dpbnNlcnQnLCAwKSAgIyBzYXZlIG9sZCBpbnNlcnRpb24gcG9zaXRpb24KICAgIHN5cy5fX2VnZ2luc2VydCA9IDAgICMgYW5kIHJlc2V0IHRoZSBjdXJyZW50IG9uZQoKICAgIGZvciBpdGVtIGluIFBZVEhPTlBBVEg6CiAgICAgICAgYWRkc2l0ZWRpcihpdGVtKQoKICAgIHN5cy5fX2VnZ2luc2VydCArPSBvbGRwb3MgICMgcmVzdG9yZSBlZmZlY3RpdmUgb2xkIHBvc2l0aW9uCgogICAgZCwgbmQgPSBtYWtlcGF0aChzdGRwYXRoWzBdKQogICAgaW5zZXJ0X2F0ID0gTm9uZQogICAgbmV3X3BhdGggPSBbXQoKICAgIGZvciBpdGVtIGluIHN5cy5wYXRoOgogICAgICAgIHAsIG5wID0gbWFrZXBhdGgoaXRlbSkKCiAgICAgICAgaWYgbnAgPT0gbmQgYW5kIGluc2VydF9hdCBpcyBOb25lOgogICAgICAgICAgICAjIFdlJ3ZlIGhpdCB0aGUgZmlyc3QgJ3N5c3RlbScgcGF0aCBlbnRyeSwgc28gYWRkZWQgZW50cmllcyBnbyBoZXJlCiAgICAgICAgICAgIGluc2VydF9hdCA9IGxlbihuZXdfcGF0aCkKCiAgICAgICAgaWYgbnAgaW4ga25vd25fcGF0aHMgb3IgaW5zZXJ0X2F0IGlzIE5vbmU6CiAgICAgICAgICAgIG5ld19wYXRoLmFwcGVuZChpdGVtKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgbmV3IHBhdGggYWZ0ZXIgdGhlIGluc2VydCBwb2ludCwgYmFjay1pbnNlcnQgaXQKICAgICAgICAgICAgbmV3X3BhdGguaW5zZXJ0KGluc2VydF9hdCwgaXRlbSkKICAgICAgICAgICAgaW5zZXJ0X2F0ICs9IDEKCiAgICBzeXMucGF0aFs6XSA9IG5ld19wYXRoCgoKaWYgX19uYW1lX18gPT0gJ3NpdGUnOgogICAgX19ib290KCkKICAgIGRlbCBfX2Jvb3QKUEsDBBQAAAAAAAAAIQDOlTSOLSEAAC0hAAA+AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvc3NsX3N1cHBvcnQucHlpbXBvcnQgb3MKaW1wb3J0IHNvY2tldAppbXBvcnQgYXRleGl0CmltcG9ydCByZQppbXBvcnQgZnVuY3Rvb2xzCgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuLnNpeC5tb3ZlcyBpbXBvcnQgdXJsbGliLCBodHRwX2NsaWVudCwgbWFwLCBmaWx0ZXIKCmZyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgUmVzb2x1dGlvbkVycm9yLCBFeHRyYWN0aW9uRXJyb3IKCnRyeToKICAgIGltcG9ydCBzc2wKZXhjZXB0IEltcG9ydEVycm9yOgogICAgc3NsID0gTm9uZQoKX19hbGxfXyA9IFsKICAgICdWZXJpZnlpbmdIVFRQU0hhbmRsZXInLCAnZmluZF9jYV9idW5kbGUnLCAnaXNfYXZhaWxhYmxlJywgJ2NlcnRfcGF0aHMnLAogICAgJ29wZW5lcl9mb3InCl0KCmNlcnRfcGF0aHMgPSAiIiIKL2V0Yy9wa2kvdGxzL2NlcnRzL2NhLWJ1bmRsZS5jcnQKL2V0Yy9zc2wvY2VydHMvY2EtY2VydGlmaWNhdGVzLmNydAovdXNyL3NoYXJlL3NzbC9jZXJ0cy9jYS1idW5kbGUuY3J0Ci91c3IvbG9jYWwvc2hhcmUvY2VydHMvY2Etcm9vdC5jcnQKL2V0Yy9zc2wvY2VydC5wZW0KL1N5c3RlbS9MaWJyYXJ5L09wZW5TU0wvY2VydHMvY2VydC5wZW0KL3Vzci9sb2NhbC9zaGFyZS9jZXJ0cy9jYS1yb290LW5zcy5jcnQKL2V0Yy9zc2wvY2EtYnVuZGxlLnBlbQoiIiIuc3RyaXAoKS5zcGxpdCgpCgp0cnk6CiAgICBIVFRQU0hhbmRsZXIgPSB1cmxsaWIucmVxdWVzdC5IVFRQU0hhbmRsZXIKICAgIEhUVFBTQ29ubmVjdGlvbiA9IGh0dHBfY2xpZW50LkhUVFBTQ29ubmVjdGlvbgpleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICBIVFRQU0hhbmRsZXIgPSBIVFRQU0Nvbm5lY3Rpb24gPSBvYmplY3QKCmlzX2F2YWlsYWJsZSA9IHNzbCBpcyBub3QgTm9uZSBhbmQgb2JqZWN0IG5vdCBpbiAoSFRUUFNIYW5kbGVyLCBIVFRQU0Nvbm5lY3Rpb24pCgoKdHJ5OgogICAgZnJvbSBzc2wgaW1wb3J0IENlcnRpZmljYXRlRXJyb3IsIG1hdGNoX2hvc3RuYW1lCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIHRyeToKICAgICAgICBmcm9tIGJhY2twb3J0cy5zc2xfbWF0Y2hfaG9zdG5hbWUgaW1wb3J0IENlcnRpZmljYXRlRXJyb3IKICAgICAgICBmcm9tIGJhY2twb3J0cy5zc2xfbWF0Y2hfaG9zdG5hbWUgaW1wb3J0IG1hdGNoX2hvc3RuYW1lCiAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgQ2VydGlmaWNhdGVFcnJvciA9IE5vbmUKICAgICAgICBtYXRjaF9ob3N0bmFtZSA9IE5vbmUKCmlmIG5vdCBDZXJ0aWZpY2F0ZUVycm9yOgoKICAgIGNsYXNzIENlcnRpZmljYXRlRXJyb3IoVmFsdWVFcnJvcik6CiAgICAgICAgcGFzcwoKCmlmIG5vdCBtYXRjaF9ob3N0bmFtZToKCiAgICBkZWYgX2Ruc25hbWVfbWF0Y2goZG4sIGhvc3RuYW1lLCBtYXhfd2lsZGNhcmRzPTEpOgogICAgICAgICIiIk1hdGNoaW5nIGFjY29yZGluZyB0byBSRkMgNjEyNSwgc2VjdGlvbiA2LjQuMwoKICAgICAgICBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNjEyNSNzZWN0aW9uLTYuNC4zCiAgICAgICAgIiIiCiAgICAgICAgcGF0cyA9IFtdCiAgICAgICAgaWYgbm90IGRuOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgIyBQb3J0ZWQgZnJvbSBweXRob24zLXN5bnRheDoKICAgICAgICAjIGxlZnRtb3N0LCAqcmVtYWluZGVyID0gZG4uc3BsaXQocicuJykKICAgICAgICBwYXJ0cyA9IGRuLnNwbGl0KHInLicpCiAgICAgICAgbGVmdG1vc3QgPSBwYXJ0c1swXQogICAgICAgIHJlbWFpbmRlciA9IHBhcnRzWzE6XQoKICAgICAgICB3aWxkY2FyZHMgPSBsZWZ0bW9zdC5jb3VudCgnKicpCiAgICAgICAgaWYgd2lsZGNhcmRzID4gbWF4X3dpbGRjYXJkczoKICAgICAgICAgICAgIyBJc3N1ZSAjMTc5ODA6IGF2b2lkIGRlbmlhbHMgb2Ygc2VydmljZSBieSByZWZ1c2luZyBtb3JlCiAgICAgICAgICAgICMgdGhhbiBvbmUgd2lsZGNhcmQgcGVyIGZyYWdtZW50LiAgQSBzdXJ2ZXkgb2YgZXN0YWJsaXNoZWQKICAgICAgICAgICAgIyBwb2xpY3kgYW1vbmcgU1NMIGltcGxlbWVudGF0aW9ucyBzaG93ZWQgaXQgdG8gYmUgYQogICAgICAgICAgICAjIHJlYXNvbmFibGUgY2hvaWNlLgogICAgICAgICAgICByYWlzZSBDZXJ0aWZpY2F0ZUVycm9yKAogICAgICAgICAgICAgICAgInRvbyBtYW55IHdpbGRjYXJkcyBpbiBjZXJ0aWZpY2F0ZSBETlMgbmFtZTogIiArIHJlcHIoZG4pKQoKICAgICAgICAjIHNwZWVkIHVwIGNvbW1vbiBjYXNlIHcvbyB3aWxkY2FyZHMKICAgICAgICBpZiBub3Qgd2lsZGNhcmRzOgogICAgICAgICAgICByZXR1cm4gZG4ubG93ZXIoKSA9PSBob3N0bmFtZS5sb3dlcigpCgogICAgICAgICMgUkZDIDYxMjUsIHNlY3Rpb24gNi40LjMsIHN1Yml0ZW0gMS4KICAgICAgICAjIFRoZSBjbGllbnQgU0hPVUxEIE5PVCBhdHRlbXB0IHRvIG1hdGNoIGEgcHJlc2VudGVkIGlkZW50aWZpZXIgaW4gd2hpY2gKICAgICAgICAjIHRoZSB3aWxkY2FyZCBjaGFyYWN0ZXIgY29tcHJpc2VzIGEgbGFiZWwgb3RoZXIgdGhhbiB0aGUgbGVmdC1tb3N0IGxhYmVsLgogICAgICAgIGlmIGxlZnRtb3N0ID09ICcqJzoKICAgICAgICAgICAgIyBXaGVuICcqJyBpcyBhIGZyYWdtZW50IGJ5IGl0c2VsZiwgaXQgbWF0Y2hlcyBhIG5vbi1lbXB0eSBkb3RsZXNzCiAgICAgICAgICAgICMgZnJhZ21lbnQuCiAgICAgICAgICAgIHBhdHMuYXBwZW5kKCdbXi5dKycpCiAgICAgICAgZWxpZiBsZWZ0bW9zdC5zdGFydHN3aXRoKCd4bi0tJykgb3IgaG9zdG5hbWUuc3RhcnRzd2l0aCgneG4tLScpOgogICAgICAgICAgICAjIFJGQyA2MTI1LCBzZWN0aW9uIDYuNC4zLCBzdWJpdGVtIDMuCiAgICAgICAgICAgICMgVGhlIGNsaWVudCBTSE9VTEQgTk9UIGF0dGVtcHQgdG8gbWF0Y2ggYSBwcmVzZW50ZWQgaWRlbnRpZmllcgogICAgICAgICAgICAjIHdoZXJlIHRoZSB3aWxkY2FyZCBjaGFyYWN0ZXIgaXMgZW1iZWRkZWQgd2l0aGluIGFuIEEtbGFiZWwgb3IKICAgICAgICAgICAgIyBVLWxhYmVsIG9mIGFuIGludGVybmF0aW9uYWxpemVkIGRvbWFpbiBuYW1lLgogICAgICAgICAgICBwYXRzLmFwcGVuZChyZS5lc2NhcGUobGVmdG1vc3QpKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgT3RoZXJ3aXNlLCAnKicgbWF0Y2hlcyBhbnkgZG90bGVzcyBzdHJpbmcsIGUuZy4gd3d3KgogICAgICAgICAgICBwYXRzLmFwcGVuZChyZS5lc2NhcGUobGVmdG1vc3QpLnJlcGxhY2UocidcKicsICdbXi5dKicpKQoKICAgICAgICAjIGFkZCB0aGUgcmVtYWluaW5nIGZyYWdtZW50cywgaWdub3JlIGFueSB3aWxkY2FyZHMKICAgICAgICBmb3IgZnJhZyBpbiByZW1haW5kZXI6CiAgICAgICAgICAgIHBhdHMuYXBwZW5kKHJlLmVzY2FwZShmcmFnKSkKCiAgICAgICAgcGF0ID0gcmUuY29tcGlsZShyJ1xBJyArIHInXC4nLmpvaW4ocGF0cykgKyByJ1xaJywgcmUuSUdOT1JFQ0FTRSkKICAgICAgICByZXR1cm4gcGF0Lm1hdGNoKGhvc3RuYW1lKQoKICAgIGRlZiBtYXRjaF9ob3N0bmFtZShjZXJ0LCBob3N0bmFtZSk6CiAgICAgICAgIiIiVmVyaWZ5IHRoYXQgKmNlcnQqIChpbiBkZWNvZGVkIGZvcm1hdCBhcyByZXR1cm5lZCBieQogICAgICAgIFNTTFNvY2tldC5nZXRwZWVyY2VydCgpKSBtYXRjaGVzIHRoZSAqaG9zdG5hbWUqLiAgUkZDIDI4MTggYW5kIFJGQyA2MTI1CiAgICAgICAgcnVsZXMgYXJlIGZvbGxvd2VkLCBidXQgSVAgYWRkcmVzc2VzIGFyZSBub3QgYWNjZXB0ZWQgZm9yICpob3N0bmFtZSouCgogICAgICAgIENlcnRpZmljYXRlRXJyb3IgaXMgcmFpc2VkIG9uIGZhaWx1cmUuIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbgogICAgICAgIHJldHVybnMgbm90aGluZy4KICAgICAgICAiIiIKICAgICAgICBpZiBub3QgY2VydDoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiZW1wdHkgb3Igbm8gY2VydGlmaWNhdGUiKQogICAgICAgIGRuc25hbWVzID0gW10KICAgICAgICBzYW4gPSBjZXJ0LmdldCgnc3ViamVjdEFsdE5hbWUnLCAoKSkKICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBzYW46CiAgICAgICAgICAgIGlmIGtleSA9PSAnRE5TJzoKICAgICAgICAgICAgICAgIGlmIF9kbnNuYW1lX21hdGNoKHZhbHVlLCBob3N0bmFtZSk6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICAgICBkbnNuYW1lcy5hcHBlbmQodmFsdWUpCiAgICAgICAgaWYgbm90IGRuc25hbWVzOgogICAgICAgICAgICAjIFRoZSBzdWJqZWN0IGlzIG9ubHkgY2hlY2tlZCB3aGVuIHRoZXJlIGlzIG5vIGROU05hbWUgZW50cnkKICAgICAgICAgICAgIyBpbiBzdWJqZWN0QWx0TmFtZQogICAgICAgICAgICBmb3Igc3ViIGluIGNlcnQuZ2V0KCdzdWJqZWN0JywgKCkpOgogICAgICAgICAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gc3ViOgogICAgICAgICAgICAgICAgICAgICMgWFhYIGFjY29yZGluZyB0byBSRkMgMjgxOCwgdGhlIG1vc3Qgc3BlY2lmaWMgQ29tbW9uIE5hbWUKICAgICAgICAgICAgICAgICAgICAjIG11c3QgYmUgdXNlZC4KICAgICAgICAgICAgICAgICAgICBpZiBrZXkgPT0gJ2NvbW1vbk5hbWUnOgogICAgICAgICAgICAgICAgICAgICAgICBpZiBfZG5zbmFtZV9tYXRjaCh2YWx1ZSwgaG9zdG5hbWUpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICAgICAgICAgICAgIGRuc25hbWVzLmFwcGVuZCh2YWx1ZSkKICAgICAgICBpZiBsZW4oZG5zbmFtZXMpID4gMToKICAgICAgICAgICAgcmFpc2UgQ2VydGlmaWNhdGVFcnJvcigiaG9zdG5hbWUgJXIgIgogICAgICAgICAgICAgICAgImRvZXNuJ3QgbWF0Y2ggZWl0aGVyIG9mICVzIgogICAgICAgICAgICAgICAgJSAoaG9zdG5hbWUsICcsICcuam9pbihtYXAocmVwciwgZG5zbmFtZXMpKSkpCiAgICAgICAgZWxpZiBsZW4oZG5zbmFtZXMpID09IDE6CiAgICAgICAgICAgIHJhaXNlIENlcnRpZmljYXRlRXJyb3IoImhvc3RuYW1lICVyICIKICAgICAgICAgICAgICAgICJkb2Vzbid0IG1hdGNoICVyIgogICAgICAgICAgICAgICAgJSAoaG9zdG5hbWUsIGRuc25hbWVzWzBdKSkKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBDZXJ0aWZpY2F0ZUVycm9yKCJubyBhcHByb3ByaWF0ZSBjb21tb25OYW1lIG9yICIKICAgICAgICAgICAgICAgICJzdWJqZWN0QWx0TmFtZSBmaWVsZHMgd2VyZSBmb3VuZCIpCgoKY2xhc3MgVmVyaWZ5aW5nSFRUUFNIYW5kbGVyKEhUVFBTSGFuZGxlcik6CiAgICAiIiJTaW1wbGUgdmVyaWZ5aW5nIGhhbmRsZXI6IG5vIGF1dGgsIHN1YmNsYXNzZXMsIHRpbWVvdXRzLCBldGMuIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGNhX2J1bmRsZSk6CiAgICAgICAgc2VsZi5jYV9idW5kbGUgPSBjYV9idW5kbGUKICAgICAgICBIVFRQU0hhbmRsZXIuX19pbml0X18oc2VsZikKCiAgICBkZWYgaHR0cHNfb3BlbihzZWxmLCByZXEpOgogICAgICAgIHJldHVybiBzZWxmLmRvX29wZW4oCiAgICAgICAgICAgIGxhbWJkYSBob3N0LCAqKmt3OiBWZXJpZnlpbmdIVFRQU0Nvbm4oaG9zdCwgc2VsZi5jYV9idW5kbGUsICoqa3cpLCByZXEKICAgICAgICApCgoKY2xhc3MgVmVyaWZ5aW5nSFRUUFNDb25uKEhUVFBTQ29ubmVjdGlvbik6CiAgICAiIiJTaW1wbGUgdmVyaWZ5aW5nIGNvbm5lY3Rpb246IG5vIGF1dGgsIHN1YmNsYXNzZXMsIHRpbWVvdXRzLCBldGMuIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3QsIGNhX2J1bmRsZSwgKiprdyk6CiAgICAgICAgSFRUUFNDb25uZWN0aW9uLl9faW5pdF9fKHNlbGYsIGhvc3QsICoqa3cpCiAgICAgICAgc2VsZi5jYV9idW5kbGUgPSBjYV9idW5kbGUKCiAgICBkZWYgY29ubmVjdChzZWxmKToKICAgICAgICBzb2NrID0gc29ja2V0LmNyZWF0ZV9jb25uZWN0aW9uKAogICAgICAgICAgICAoc2VsZi5ob3N0LCBzZWxmLnBvcnQpLCBnZXRhdHRyKHNlbGYsICdzb3VyY2VfYWRkcmVzcycsIE5vbmUpCiAgICAgICAgKQoKICAgICAgICAjIEhhbmRsZSB0aGUgc29ja2V0IGlmIGEgKHByb3h5KSB0dW5uZWwgaXMgcHJlc2VudAogICAgICAgIGlmIGhhc2F0dHIoc2VsZiwgJ190dW5uZWwnKSBhbmQgZ2V0YXR0cihzZWxmLCAnX3R1bm5lbF9ob3N0JywgTm9uZSk6CiAgICAgICAgICAgIHNlbGYuc29jayA9IHNvY2sKICAgICAgICAgICAgc2VsZi5fdHVubmVsKCkKICAgICAgICAgICAgIyBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlNzc3NjogUHl0aG9uPj0zLjQuMSBhbmQgPj0yLjcuNwogICAgICAgICAgICAjIGNoYW5nZSBzZWxmLmhvc3QgdG8gbWVhbiB0aGUgcHJveHkgc2VydmVyIGhvc3Qgd2hlbiB0dW5uZWxpbmcgaXMKICAgICAgICAgICAgIyBiZWluZyB1c2VkLiBBZGFwdCwgc2luY2Ugd2UgYXJlIGludGVyZXN0ZWQgaW4gdGhlIGRlc3RpbmF0aW9uCiAgICAgICAgICAgICMgaG9zdCBmb3IgdGhlIG1hdGNoX2hvc3RuYW1lKCkgY29tcGFyaXNvbi4KICAgICAgICAgICAgYWN0dWFsX2hvc3QgPSBzZWxmLl90dW5uZWxfaG9zdAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGFjdHVhbF9ob3N0ID0gc2VsZi5ob3N0CgogICAgICAgIGlmIGhhc2F0dHIoc3NsLCAnY3JlYXRlX2RlZmF1bHRfY29udGV4dCcpOgogICAgICAgICAgICBjdHggPSBzc2wuY3JlYXRlX2RlZmF1bHRfY29udGV4dChjYWZpbGU9c2VsZi5jYV9idW5kbGUpCiAgICAgICAgICAgIHNlbGYuc29jayA9IGN0eC53cmFwX3NvY2tldChzb2NrLCBzZXJ2ZXJfaG9zdG5hbWU9YWN0dWFsX2hvc3QpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBUaGlzIGlzIGZvciBweXRob24gPCAyLjcuOSBhbmQgPCAzLjQ/CiAgICAgICAgICAgIHNlbGYuc29jayA9IHNzbC53cmFwX3NvY2tldCgKICAgICAgICAgICAgICAgIHNvY2ssIGNlcnRfcmVxcz1zc2wuQ0VSVF9SRVFVSVJFRCwgY2FfY2VydHM9c2VsZi5jYV9idW5kbGUKICAgICAgICAgICAgKQogICAgICAgIHRyeToKICAgICAgICAgICAgbWF0Y2hfaG9zdG5hbWUoc2VsZi5zb2NrLmdldHBlZXJjZXJ0KCksIGFjdHVhbF9ob3N0KQogICAgICAgIGV4Y2VwdCBDZXJ0aWZpY2F0ZUVycm9yOgogICAgICAgICAgICBzZWxmLnNvY2suc2h1dGRvd24oc29ja2V0LlNIVVRfUkRXUikKICAgICAgICAgICAgc2VsZi5zb2NrLmNsb3NlKCkKICAgICAgICAgICAgcmFpc2UKCgpkZWYgb3BlbmVyX2ZvcihjYV9idW5kbGU9Tm9uZSk6CiAgICAiIiJHZXQgYSB1cmxvcGVuKCkgcmVwbGFjZW1lbnQgdGhhdCB1c2VzIGNhX2J1bmRsZSBmb3IgdmVyaWZpY2F0aW9uIiIiCiAgICByZXR1cm4gdXJsbGliLnJlcXVlc3QuYnVpbGRfb3BlbmVyKAogICAgICAgIFZlcmlmeWluZ0hUVFBTSGFuZGxlcihjYV9idW5kbGUgb3IgZmluZF9jYV9idW5kbGUoKSkKICAgICkub3BlbgoKCiMgZnJvbSBqYXJhY28uZnVuY3Rvb2xzCmRlZiBvbmNlKGZ1bmMpOgogICAgQGZ1bmN0b29scy53cmFwcyhmdW5jKQogICAgZGVmIHdyYXBwZXIoKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICBpZiBub3QgaGFzYXR0cihmdW5jLCAnYWx3YXlzX3JldHVybnMnKToKICAgICAgICAgICAgZnVuYy5hbHdheXNfcmV0dXJucyA9IGZ1bmMoKmFyZ3MsICoqa3dhcmdzKQogICAgICAgIHJldHVybiBmdW5jLmFsd2F5c19yZXR1cm5zCiAgICByZXR1cm4gd3JhcHBlcgoKCkBvbmNlCmRlZiBnZXRfd2luX2NlcnRmaWxlKCk6CiAgICB0cnk6CiAgICAgICAgaW1wb3J0IHdpbmNlcnRzdG9yZQogICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgIHJldHVybiBOb25lCgogICAgY2xhc3MgQ2VydEZpbGUod2luY2VydHN0b3JlLkNlcnRGaWxlKToKICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgICAgIHN1cGVyKENlcnRGaWxlLCBzZWxmKS5fX2luaXRfXygpCiAgICAgICAgICAgIGF0ZXhpdC5yZWdpc3RlcihzZWxmLmNsb3NlKQoKICAgICAgICBkZWYgY2xvc2Uoc2VsZik6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHN1cGVyKENlcnRGaWxlLCBzZWxmKS5jbG9zZSgpCiAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgogICAgICAgICAgICAgICAgcGFzcwoKICAgIF93aW5jZXJ0cyA9IENlcnRGaWxlKCkKICAgIF93aW5jZXJ0cy5hZGRzdG9yZSgnQ0EnKQogICAgX3dpbmNlcnRzLmFkZHN0b3JlKCdST09UJykKICAgIHJldHVybiBfd2luY2VydHMubmFtZQoKCmRlZiBmaW5kX2NhX2J1bmRsZSgpOgogICAgIiIiUmV0dXJuIGFuIGV4aXN0aW5nIENBIGJ1bmRsZSBwYXRoLCBvciBOb25lIiIiCiAgICBleHRhbnRfY2VydF9wYXRocyA9IGZpbHRlcihvcy5wYXRoLmlzZmlsZSwgY2VydF9wYXRocykKICAgIHJldHVybiAoCiAgICAgICAgZ2V0X3dpbl9jZXJ0ZmlsZSgpCiAgICAgICAgb3IgbmV4dChleHRhbnRfY2VydF9wYXRocywgTm9uZSkKICAgICAgICBvciBfY2VydGlmaV93aGVyZSgpCiAgICApCgoKZGVmIF9jZXJ0aWZpX3doZXJlKCk6CiAgICB0cnk6CiAgICAgICAgcmV0dXJuIF9faW1wb3J0X18oJ2NlcnRpZmknKS53aGVyZSgpCiAgICBleGNlcHQgKEltcG9ydEVycm9yLCBSZXNvbHV0aW9uRXJyb3IsIEV4dHJhY3Rpb25FcnJvcik6CiAgICAgICAgcGFzcwpQSwMEFAAAAAAAAAAhAJpC15rkAwAA5AMAAEAAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy91bmljb2RlX3V0aWxzLnB5aW1wb3J0IHVuaWNvZGVkYXRhCmltcG9ydCBzeXMKCmZyb20gc2V0dXB0b29scy5leHRlcm4gaW1wb3J0IHNpeAoKCiMgSEZTIFBsdXMgdXNlcyBkZWNvbXBvc2VkIFVURi04CmRlZiBkZWNvbXBvc2UocGF0aCk6CiAgICBpZiBpc2luc3RhbmNlKHBhdGgsIHNpeC50ZXh0X3R5cGUpOgogICAgICAgIHJldHVybiB1bmljb2RlZGF0YS5ub3JtYWxpemUoJ05GRCcsIHBhdGgpCiAgICB0cnk6CiAgICAgICAgcGF0aCA9IHBhdGguZGVjb2RlKCd1dGYtOCcpCiAgICAgICAgcGF0aCA9IHVuaWNvZGVkYXRhLm5vcm1hbGl6ZSgnTkZEJywgcGF0aCkKICAgICAgICBwYXRoID0gcGF0aC5lbmNvZGUoJ3V0Zi04JykKICAgIGV4Y2VwdCBVbmljb2RlRXJyb3I6CiAgICAgICAgcGFzcyAgIyBOb3QgVVRGLTgKICAgIHJldHVybiBwYXRoCgoKZGVmIGZpbGVzeXNfZGVjb2RlKHBhdGgpOgogICAgIiIiCiAgICBFbnN1cmUgdGhhdCB0aGUgZ2l2ZW4gcGF0aCBpcyBkZWNvZGVkLAogICAgTk9ORSB3aGVuIG5vIGV4cGVjdGVkIGVuY29kaW5nIHdvcmtzCiAgICAiIiIKCiAgICBpZiBpc2luc3RhbmNlKHBhdGgsIHNpeC50ZXh0X3R5cGUpOgogICAgICAgIHJldHVybiBwYXRoCgogICAgZnNfZW5jID0gc3lzLmdldGZpbGVzeXN0ZW1lbmNvZGluZygpIG9yICd1dGYtOCcKICAgIGNhbmRpZGF0ZXMgPSBmc19lbmMsICd1dGYtOCcKCiAgICBmb3IgZW5jIGluIGNhbmRpZGF0ZXM6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gcGF0aC5kZWNvZGUoZW5jKQogICAgICAgIGV4Y2VwdCBVbmljb2RlRGVjb2RlRXJyb3I6CiAgICAgICAgICAgIGNvbnRpbnVlCgoKZGVmIHRyeV9lbmNvZGUoc3RyaW5nLCBlbmMpOgogICAgInR1cm4gdW5pY29kZSBlbmNvZGluZyBpbnRvIGEgZnVuY3Rpb25hbCByb3V0aW5lIgogICAgdHJ5OgogICAgICAgIHJldHVybiBzdHJpbmcuZW5jb2RlKGVuYykKICAgIGV4Y2VwdCBVbmljb2RlRW5jb2RlRXJyb3I6CiAgICAgICAgcmV0dXJuIE5vbmUKUEsDBBQAAAAAAAAAIQBIsUxikAAAAJAAAAA6AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvdmVyc2lvbi5weWltcG9ydCBwa2dfcmVzb3VyY2VzCgp0cnk6CiAgICBfX3ZlcnNpb25fXyA9IHBrZ19yZXNvdXJjZXMuZ2V0X2Rpc3RyaWJ1dGlvbignc2V0dXB0b29scycpLnZlcnNpb24KZXhjZXB0IEV4Y2VwdGlvbjoKICAgIF9fdmVyc2lvbl9fID0gJ3Vua25vd24nClBLAwQUAAAAAAAAACEAsMVFgAchAAAHIQAAOAAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL3doZWVsLnB5IiIiV2hlZWxzIHN1cHBvcnQuIiIiCgpmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBnZXRfcGxhdGZvcm0KZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZwppbXBvcnQgZW1haWwKaW1wb3J0IGl0ZXJ0b29scwppbXBvcnQgb3MKaW1wb3J0IHBvc2l4cGF0aAppbXBvcnQgcmUKaW1wb3J0IHppcGZpbGUKCmltcG9ydCBwa2dfcmVzb3VyY2VzCmltcG9ydCBzZXR1cHRvb2xzCmZyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgcGFyc2VfdmVyc2lvbgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuLnBhY2thZ2luZy50YWdzIGltcG9ydCBzeXNfdGFncwpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuLnBhY2thZ2luZy51dGlscyBpbXBvcnQgY2Fub25pY2FsaXplX25hbWUKZnJvbSBzZXR1cHRvb2xzLmV4dGVybi5zaXggaW1wb3J0IFBZMwpmcm9tIHNldHVwdG9vbHMuY29tbWFuZC5lZ2dfaW5mbyBpbXBvcnQgd3JpdGVfcmVxdWlyZW1lbnRzCgoKX19tZXRhY2xhc3NfXyA9IHR5cGUKCgpXSEVFTF9OQU1FID0gcmUuY29tcGlsZSgKICAgIHIiIiJeKD9QPHByb2plY3RfbmFtZT4uKz8pLSg/UDx2ZXJzaW9uPlxkLio/KQogICAgKCgtKD9QPGJ1aWxkPlxkLio/KSk/LSg/UDxweV92ZXJzaW9uPi4rPyktKD9QPGFiaT4uKz8pLSg/UDxwbGF0Zm9ybT4uKz8pCiAgICApXC53aGwkIiIiLAogICAgcmUuVkVSQk9TRSkubWF0Y2gKCk5BTUVTUEFDRV9QQUNLQUdFX0lOSVQgPSAnJydcCnRyeToKICAgIF9faW1wb3J0X18oJ3BrZ19yZXNvdXJjZXMnKS5kZWNsYXJlX25hbWVzcGFjZShfX25hbWVfXykKZXhjZXB0IEltcG9ydEVycm9yOgogICAgX19wYXRoX18gPSBfX2ltcG9ydF9fKCdwa2d1dGlsJykuZXh0ZW5kX3BhdGgoX19wYXRoX18sIF9fbmFtZV9fKQonJycKCgpkZWYgdW5wYWNrKHNyY19kaXIsIGRzdF9kaXIpOgogICAgJycnTW92ZSBldmVyeXRoaW5nIHVuZGVyIGBzcmNfZGlyYCB0byBgZHN0X2RpcmAsIGFuZCBkZWxldGUgdGhlIGZvcm1lci4nJycKICAgIGZvciBkaXJwYXRoLCBkaXJuYW1lcywgZmlsZW5hbWVzIGluIG9zLndhbGsoc3JjX2Rpcik6CiAgICAgICAgc3ViZGlyID0gb3MucGF0aC5yZWxwYXRoKGRpcnBhdGgsIHNyY19kaXIpCiAgICAgICAgZm9yIGYgaW4gZmlsZW5hbWVzOgogICAgICAgICAgICBzcmMgPSBvcy5wYXRoLmpvaW4oZGlycGF0aCwgZikKICAgICAgICAgICAgZHN0ID0gb3MucGF0aC5qb2luKGRzdF9kaXIsIHN1YmRpciwgZikKICAgICAgICAgICAgb3MucmVuYW1lcyhzcmMsIGRzdCkKICAgICAgICBmb3IgbiwgZCBpbiByZXZlcnNlZChsaXN0KGVudW1lcmF0ZShkaXJuYW1lcykpKToKICAgICAgICAgICAgc3JjID0gb3MucGF0aC5qb2luKGRpcnBhdGgsIGQpCiAgICAgICAgICAgIGRzdCA9IG9zLnBhdGguam9pbihkc3RfZGlyLCBzdWJkaXIsIGQpCiAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhkc3QpOgogICAgICAgICAgICAgICAgIyBEaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QgaW4gZGVzdGluYXRpb24sCiAgICAgICAgICAgICAgICAjIHJlbmFtZSBpdCBhbmQgcHJ1bmUgaXQgZnJvbSBvcy53YWxrIGxpc3QuCiAgICAgICAgICAgICAgICBvcy5yZW5hbWVzKHNyYywgZHN0KQogICAgICAgICAgICAgICAgZGVsIGRpcm5hbWVzW25dCiAgICAjIENsZWFudXAuCiAgICBmb3IgZGlycGF0aCwgZGlybmFtZXMsIGZpbGVuYW1lcyBpbiBvcy53YWxrKHNyY19kaXIsIHRvcGRvd249VHJ1ZSk6CiAgICAgICAgYXNzZXJ0IG5vdCBmaWxlbmFtZXMKICAgICAgICBvcy5ybWRpcihkaXJwYXRoKQoKCmNsYXNzIFdoZWVsOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlbmFtZSk6CiAgICAgICAgbWF0Y2ggPSBXSEVFTF9OQU1FKG9zLnBhdGguYmFzZW5hbWUoZmlsZW5hbWUpKQogICAgICAgIGlmIG1hdGNoIGlzIE5vbmU6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2ludmFsaWQgd2hlZWwgbmFtZTogJXInICUgZmlsZW5hbWUpCiAgICAgICAgc2VsZi5maWxlbmFtZSA9IGZpbGVuYW1lCiAgICAgICAgZm9yIGssIHYgaW4gbWF0Y2guZ3JvdXBkaWN0KCkuaXRlbXMoKToKICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBrLCB2KQoKICAgIGRlZiB0YWdzKHNlbGYpOgogICAgICAgICcnJ0xpc3QgdGFncyAocHlfdmVyc2lvbiwgYWJpLCBwbGF0Zm9ybSkgc3VwcG9ydGVkIGJ5IHRoaXMgd2hlZWwuJycnCiAgICAgICAgcmV0dXJuIGl0ZXJ0b29scy5wcm9kdWN0KAogICAgICAgICAgICBzZWxmLnB5X3ZlcnNpb24uc3BsaXQoJy4nKSwKICAgICAgICAgICAgc2VsZi5hYmkuc3BsaXQoJy4nKSwKICAgICAgICAgICAgc2VsZi5wbGF0Zm9ybS5zcGxpdCgnLicpLAogICAgICAgICkKCiAgICBkZWYgaXNfY29tcGF0aWJsZShzZWxmKToKICAgICAgICAnJydJcyB0aGUgd2hlZWwgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBjdXJyZW50IHBsYXRmb3JtPycnJwogICAgICAgIHN1cHBvcnRlZF90YWdzID0gc2V0KCh0LmludGVycHJldGVyLCB0LmFiaSwgdC5wbGF0Zm9ybSkgZm9yIHQgaW4gc3lzX3RhZ3MoKSkKICAgICAgICByZXR1cm4gbmV4dCgoVHJ1ZSBmb3IgdCBpbiBzZWxmLnRhZ3MoKSBpZiB0IGluIHN1cHBvcnRlZF90YWdzKSwgRmFsc2UpCgogICAgZGVmIGVnZ19uYW1lKHNlbGYpOgogICAgICAgIHJldHVybiBwa2dfcmVzb3VyY2VzLkRpc3RyaWJ1dGlvbigKICAgICAgICAgICAgcHJvamVjdF9uYW1lPXNlbGYucHJvamVjdF9uYW1lLCB2ZXJzaW9uPXNlbGYudmVyc2lvbiwKICAgICAgICAgICAgcGxhdGZvcm09KE5vbmUgaWYgc2VsZi5wbGF0Zm9ybSA9PSAnYW55JyBlbHNlIGdldF9wbGF0Zm9ybSgpKSwKICAgICAgICApLmVnZ19uYW1lKCkgKyAnLmVnZycKCiAgICBkZWYgZ2V0X2Rpc3RfaW5mbyhzZWxmLCB6Zik6CiAgICAgICAgIyBmaW5kIHRoZSBjb3JyZWN0IG5hbWUgb2YgdGhlIC5kaXN0LWluZm8gZGlyIGluIHRoZSB3aGVlbCBmaWxlCiAgICAgICAgZm9yIG1lbWJlciBpbiB6Zi5uYW1lbGlzdCgpOgogICAgICAgICAgICBkaXJuYW1lID0gcG9zaXhwYXRoLmRpcm5hbWUobWVtYmVyKQogICAgICAgICAgICBpZiAoZGlybmFtZS5lbmRzd2l0aCgnLmRpc3QtaW5mbycpIGFuZAogICAgICAgICAgICAgICAgICAgIGNhbm9uaWNhbGl6ZV9uYW1lKGRpcm5hbWUpLnN0YXJ0c3dpdGgoCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbm9uaWNhbGl6ZV9uYW1lKHNlbGYucHJvamVjdF9uYW1lKSkpOgogICAgICAgICAgICAgICAgcmV0dXJuIGRpcm5hbWUKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJ1bnN1cHBvcnRlZCB3aGVlbCBmb3JtYXQuIC5kaXN0LWluZm8gbm90IGZvdW5kIikKCiAgICBkZWYgaW5zdGFsbF9hc19lZ2coc2VsZiwgZGVzdGluYXRpb25fZWdnZGlyKToKICAgICAgICAnJydJbnN0YWxsIHdoZWVsIGFzIGFuIGVnZyBkaXJlY3RvcnkuJycnCiAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoc2VsZi5maWxlbmFtZSkgYXMgemY6CiAgICAgICAgICAgIHNlbGYuX2luc3RhbGxfYXNfZWdnKGRlc3RpbmF0aW9uX2VnZ2RpciwgemYpCgogICAgZGVmIF9pbnN0YWxsX2FzX2VnZyhzZWxmLCBkZXN0aW5hdGlvbl9lZ2dkaXIsIHpmKToKICAgICAgICBkaXN0X2Jhc2VuYW1lID0gJyVzLSVzJyAlIChzZWxmLnByb2plY3RfbmFtZSwgc2VsZi52ZXJzaW9uKQogICAgICAgIGRpc3RfaW5mbyA9IHNlbGYuZ2V0X2Rpc3RfaW5mbyh6ZikKICAgICAgICBkaXN0X2RhdGEgPSAnJXMuZGF0YScgJSBkaXN0X2Jhc2VuYW1lCiAgICAgICAgZWdnX2luZm8gPSBvcy5wYXRoLmpvaW4oZGVzdGluYXRpb25fZWdnZGlyLCAnRUdHLUlORk8nKQoKICAgICAgICBzZWxmLl9jb252ZXJ0X21ldGFkYXRhKHpmLCBkZXN0aW5hdGlvbl9lZ2dkaXIsIGRpc3RfaW5mbywgZWdnX2luZm8pCiAgICAgICAgc2VsZi5fbW92ZV9kYXRhX2VudHJpZXMoZGVzdGluYXRpb25fZWdnZGlyLCBkaXN0X2RhdGEpCiAgICAgICAgc2VsZi5fZml4X25hbWVzcGFjZV9wYWNrYWdlcyhlZ2dfaW5mbywgZGVzdGluYXRpb25fZWdnZGlyKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfY29udmVydF9tZXRhZGF0YSh6ZiwgZGVzdGluYXRpb25fZWdnZGlyLCBkaXN0X2luZm8sIGVnZ19pbmZvKToKICAgICAgICBkZWYgZ2V0X21ldGFkYXRhKG5hbWUpOgogICAgICAgICAgICB3aXRoIHpmLm9wZW4ocG9zaXhwYXRoLmpvaW4oZGlzdF9pbmZvLCBuYW1lKSkgYXMgZnA6CiAgICAgICAgICAgICAgICB2YWx1ZSA9IGZwLnJlYWQoKS5kZWNvZGUoJ3V0Zi04JykgaWYgUFkzIGVsc2UgZnAucmVhZCgpCiAgICAgICAgICAgICAgICByZXR1cm4gZW1haWwucGFyc2VyLlBhcnNlcigpLnBhcnNlc3RyKHZhbHVlKQoKICAgICAgICB3aGVlbF9tZXRhZGF0YSA9IGdldF9tZXRhZGF0YSgnV0hFRUwnKQogICAgICAgICMgQ2hlY2sgd2hlZWwgZm9ybWF0IHZlcnNpb24gaXMgc3VwcG9ydGVkLgogICAgICAgIHdoZWVsX3ZlcnNpb24gPSBwYXJzZV92ZXJzaW9uKHdoZWVsX21ldGFkYXRhLmdldCgnV2hlZWwtVmVyc2lvbicpKQogICAgICAgIHdoZWVsX3YxID0gKAogICAgICAgICAgICBwYXJzZV92ZXJzaW9uKCcxLjAnKSA8PSB3aGVlbF92ZXJzaW9uIDwgcGFyc2VfdmVyc2lvbignMi4wZGV2MCcpCiAgICAgICAgKQogICAgICAgIGlmIG5vdCB3aGVlbF92MToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKICAgICAgICAgICAgICAgICd1bnN1cHBvcnRlZCB3aGVlbCBmb3JtYXQgdmVyc2lvbjogJXMnICUgd2hlZWxfdmVyc2lvbikKICAgICAgICAjIEV4dHJhY3QgdG8gdGFyZ2V0IGRpcmVjdG9yeS4KICAgICAgICBvcy5ta2RpcihkZXN0aW5hdGlvbl9lZ2dkaXIpCiAgICAgICAgemYuZXh0cmFjdGFsbChkZXN0aW5hdGlvbl9lZ2dkaXIpCiAgICAgICAgIyBDb252ZXJ0IG1ldGFkYXRhLgogICAgICAgIGRpc3RfaW5mbyA9IG9zLnBhdGguam9pbihkZXN0aW5hdGlvbl9lZ2dkaXIsIGRpc3RfaW5mbykKICAgICAgICBkaXN0ID0gcGtnX3Jlc291cmNlcy5EaXN0cmlidXRpb24uZnJvbV9sb2NhdGlvbigKICAgICAgICAgICAgZGVzdGluYXRpb25fZWdnZGlyLCBkaXN0X2luZm8sCiAgICAgICAgICAgIG1ldGFkYXRhPXBrZ19yZXNvdXJjZXMuUGF0aE1ldGFkYXRhKGRlc3RpbmF0aW9uX2VnZ2RpciwgZGlzdF9pbmZvKSwKICAgICAgICApCgogICAgICAgICMgTm90ZTogRXZhbHVhdGUgYW5kIHN0cmlwIG1hcmtlcnMgbm93LAogICAgICAgICMgYXMgaXQncyBkaWZmaWN1bHQgdG8gY29udmVydCBiYWNrIGZyb20gdGhlIHN5bnRheDoKICAgICAgICAjIGZvb2JhcjsgImxpbnV4IiBpbiBzeXNfcGxhdGZvcm0gYW5kIGV4dHJhID09ICd0ZXN0JwogICAgICAgIGRlZiByYXdfcmVxKHJlcSk6CiAgICAgICAgICAgIHJlcS5tYXJrZXIgPSBOb25lCiAgICAgICAgICAgIHJldHVybiBzdHIocmVxKQogICAgICAgIGluc3RhbGxfcmVxdWlyZXMgPSBsaXN0KHNvcnRlZChtYXAocmF3X3JlcSwgZGlzdC5yZXF1aXJlcygpKSkpCiAgICAgICAgZXh0cmFzX3JlcXVpcmUgPSB7CiAgICAgICAgICAgIGV4dHJhOiBzb3J0ZWQoCiAgICAgICAgICAgICAgICByZXEKICAgICAgICAgICAgICAgIGZvciByZXEgaW4gbWFwKHJhd19yZXEsIGRpc3QucmVxdWlyZXMoKGV4dHJhLCkpKQogICAgICAgICAgICAgICAgaWYgcmVxIG5vdCBpbiBpbnN0YWxsX3JlcXVpcmVzCiAgICAgICAgICAgICkKICAgICAgICAgICAgZm9yIGV4dHJhIGluIGRpc3QuZXh0cmFzCiAgICAgICAgfQogICAgICAgIG9zLnJlbmFtZShkaXN0X2luZm8sIGVnZ19pbmZvKQogICAgICAgIG9zLnJlbmFtZSgKICAgICAgICAgICAgb3MucGF0aC5qb2luKGVnZ19pbmZvLCAnTUVUQURBVEEnKSwKICAgICAgICAgICAgb3MucGF0aC5qb2luKGVnZ19pbmZvLCAnUEtHLUlORk8nKSwKICAgICAgICApCiAgICAgICAgc2V0dXBfZGlzdCA9IHNldHVwdG9vbHMuRGlzdHJpYnV0aW9uKAogICAgICAgICAgICBhdHRycz1kaWN0KAogICAgICAgICAgICAgICAgaW5zdGFsbF9yZXF1aXJlcz1pbnN0YWxsX3JlcXVpcmVzLAogICAgICAgICAgICAgICAgZXh0cmFzX3JlcXVpcmU9ZXh0cmFzX3JlcXVpcmUsCiAgICAgICAgICAgICksCiAgICAgICAgKQogICAgICAgICMgVGVtcG9yYXJpbHkgZGlzYWJsZSBpbmZvIHRyYWNlcy4KICAgICAgICBsb2dfdGhyZXNob2xkID0gbG9nLl9nbG9iYWxfbG9nLnRocmVzaG9sZAogICAgICAgIGxvZy5zZXRfdGhyZXNob2xkKGxvZy5XQVJOKQogICAgICAgIHRyeToKICAgICAgICAgICAgd3JpdGVfcmVxdWlyZW1lbnRzKAogICAgICAgICAgICAgICAgc2V0dXBfZGlzdC5nZXRfY29tbWFuZF9vYmooJ2VnZ19pbmZvJyksCiAgICAgICAgICAgICAgICBOb25lLAogICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKGVnZ19pbmZvLCAncmVxdWlyZXMudHh0JyksCiAgICAgICAgICAgICkKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBsb2cuc2V0X3RocmVzaG9sZChsb2dfdGhyZXNob2xkKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfbW92ZV9kYXRhX2VudHJpZXMoZGVzdGluYXRpb25fZWdnZGlyLCBkaXN0X2RhdGEpOgogICAgICAgICIiIk1vdmUgZGF0YSBlbnRyaWVzIHRvIHRoZWlyIGNvcnJlY3QgbG9jYXRpb24uIiIiCiAgICAgICAgZGlzdF9kYXRhID0gb3MucGF0aC5qb2luKGRlc3RpbmF0aW9uX2VnZ2RpciwgZGlzdF9kYXRhKQogICAgICAgIGRpc3RfZGF0YV9zY3JpcHRzID0gb3MucGF0aC5qb2luKGRpc3RfZGF0YSwgJ3NjcmlwdHMnKQogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGRpc3RfZGF0YV9zY3JpcHRzKToKICAgICAgICAgICAgZWdnX2luZm9fc2NyaXB0cyA9IG9zLnBhdGguam9pbigKICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uX2VnZ2RpciwgJ0VHRy1JTkZPJywgJ3NjcmlwdHMnKQogICAgICAgICAgICBvcy5ta2RpcihlZ2dfaW5mb19zY3JpcHRzKQogICAgICAgICAgICBmb3IgZW50cnkgaW4gb3MubGlzdGRpcihkaXN0X2RhdGFfc2NyaXB0cyk6CiAgICAgICAgICAgICAgICAjIFJlbW92ZSBieXRlY29kZSwgYXMgaXQncyBub3QgcHJvcGVybHkgaGFuZGxlZAogICAgICAgICAgICAgICAgIyBkdXJpbmcgZWFzeV9pbnN0YWxsIHNjcmlwdHMgaW5zdGFsbCBwaGFzZS4KICAgICAgICAgICAgICAgIGlmIGVudHJ5LmVuZHN3aXRoKCcucHljJyk6CiAgICAgICAgICAgICAgICAgICAgb3MudW5saW5rKG9zLnBhdGguam9pbihkaXN0X2RhdGFfc2NyaXB0cywgZW50cnkpKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBvcy5yZW5hbWUoCiAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihkaXN0X2RhdGFfc2NyaXB0cywgZW50cnkpLAogICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oZWdnX2luZm9fc2NyaXB0cywgZW50cnkpLAogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgb3Mucm1kaXIoZGlzdF9kYXRhX3NjcmlwdHMpCiAgICAgICAgZm9yIHN1YmRpciBpbiBmaWx0ZXIob3MucGF0aC5leGlzdHMsICgKICAgICAgICAgICAgb3MucGF0aC5qb2luKGRpc3RfZGF0YSwgZCkKICAgICAgICAgICAgZm9yIGQgaW4gKCdkYXRhJywgJ2hlYWRlcnMnLCAncHVyZWxpYicsICdwbGF0bGliJykKICAgICAgICApKToKICAgICAgICAgICAgdW5wYWNrKHN1YmRpciwgZGVzdGluYXRpb25fZWdnZGlyKQogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGRpc3RfZGF0YSk6CiAgICAgICAgICAgIG9zLnJtZGlyKGRpc3RfZGF0YSkKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX2ZpeF9uYW1lc3BhY2VfcGFja2FnZXMoZWdnX2luZm8sIGRlc3RpbmF0aW9uX2VnZ2Rpcik6CiAgICAgICAgbmFtZXNwYWNlX3BhY2thZ2VzID0gb3MucGF0aC5qb2luKAogICAgICAgICAgICBlZ2dfaW5mbywgJ25hbWVzcGFjZV9wYWNrYWdlcy50eHQnKQogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKG5hbWVzcGFjZV9wYWNrYWdlcyk6CiAgICAgICAgICAgIHdpdGggb3BlbihuYW1lc3BhY2VfcGFja2FnZXMpIGFzIGZwOgogICAgICAgICAgICAgICAgbmFtZXNwYWNlX3BhY2thZ2VzID0gZnAucmVhZCgpLnNwbGl0KCkKICAgICAgICAgICAgZm9yIG1vZCBpbiBuYW1lc3BhY2VfcGFja2FnZXM6CiAgICAgICAgICAgICAgICBtb2RfZGlyID0gb3MucGF0aC5qb2luKGRlc3RpbmF0aW9uX2VnZ2RpciwgKm1vZC5zcGxpdCgnLicpKQogICAgICAgICAgICAgICAgbW9kX2luaXQgPSBvcy5wYXRoLmpvaW4obW9kX2RpciwgJ19faW5pdF9fLnB5JykKICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhtb2RfZGlyKToKICAgICAgICAgICAgICAgICAgICBvcy5ta2Rpcihtb2RfZGlyKQogICAgICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKG1vZF9pbml0KToKICAgICAgICAgICAgICAgICAgICB3aXRoIG9wZW4obW9kX2luaXQsICd3JykgYXMgZnA6CiAgICAgICAgICAgICAgICAgICAgICAgIGZwLndyaXRlKE5BTUVTUEFDRV9QQUNLQUdFX0lOSVQpClBLAwQUAAAAAAAAACEA+cvuDcoCAADKAgAAQgAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL3dpbmRvd3Nfc3VwcG9ydC5weWltcG9ydCBwbGF0Zm9ybQppbXBvcnQgY3R5cGVzCgoKZGVmIHdpbmRvd3Nfb25seShmdW5jKToKICAgIGlmIHBsYXRmb3JtLnN5c3RlbSgpICE9ICdXaW5kb3dzJzoKICAgICAgICByZXR1cm4gbGFtYmRhICphcmdzLCAqKmt3YXJnczogTm9uZQogICAgcmV0dXJuIGZ1bmMKCgpAd2luZG93c19vbmx5CmRlZiBoaWRlX2ZpbGUocGF0aCk6CiAgICAiIiIKICAgIFNldCB0aGUgaGlkZGVuIGF0dHJpYnV0ZSBvbiBhIGZpbGUgb3IgZGlyZWN0b3J5LgoKICAgIEZyb20gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xOTYyMjEzMy8KCiAgICBgcGF0aGAgbXVzdCBiZSB0ZXh0LgogICAgIiIiCiAgICBfX2ltcG9ydF9fKCdjdHlwZXMud2ludHlwZXMnKQogICAgU2V0RmlsZUF0dHJpYnV0ZXMgPSBjdHlwZXMud2luZGxsLmtlcm5lbDMyLlNldEZpbGVBdHRyaWJ1dGVzVwogICAgU2V0RmlsZUF0dHJpYnV0ZXMuYXJndHlwZXMgPSBjdHlwZXMud2ludHlwZXMuTFBXU1RSLCBjdHlwZXMud2ludHlwZXMuRFdPUkQKICAgIFNldEZpbGVBdHRyaWJ1dGVzLnJlc3R5cGUgPSBjdHlwZXMud2ludHlwZXMuQk9PTAoKICAgIEZJTEVfQVRUUklCVVRFX0hJRERFTiA9IDB4MDIKCiAgICByZXQgPSBTZXRGaWxlQXR0cmlidXRlcyhwYXRoLCBGSUxFX0FUVFJJQlVURV9ISURERU4pCiAgICBpZiBub3QgcmV0OgogICAgICAgIHJhaXNlIGN0eXBlcy5XaW5FcnJvcigpClBLAwQUAAAAAAAAACEAAAAAAAAAAAAAAAAALQAAAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC9fX2luaXRfXy5weVBLAwQUAAAAAAAAACEAiDql1FUmAABVJgAASgAAAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC0wLjMwLjBhMC5kaXN0LWluZm8vREVTQ1JJUFRJT04ucnN0V2hlZWwKPT09PT0KCkEgYnVpbHQtcGFja2FnZSBmb3JtYXQgZm9yIFB5dGhvbi4KCkEgd2hlZWwgaXMgYSBaSVAtZm9ybWF0IGFyY2hpdmUgd2l0aCBhIHNwZWNpYWxseSBmb3JtYXR0ZWQgZmlsZW5hbWUKYW5kIHRoZSAud2hsIGV4dGVuc2lvbi4gSXQgaXMgZGVzaWduZWQgdG8gY29udGFpbiBhbGwgdGhlIGZpbGVzIGZvciBhClBFUCAzNzYgY29tcGF0aWJsZSBpbnN0YWxsIGluIGEgd2F5IHRoYXQgaXMgdmVyeSBjbG9zZSB0byB0aGUgb24tZGlzawpmb3JtYXQuIE1hbnkgcGFja2FnZXMgd2lsbCBiZSBwcm9wZXJseSBpbnN0YWxsZWQgd2l0aCBvbmx5IHRoZSAiVW5wYWNrIgpzdGVwIChzaW1wbHkgZXh0cmFjdGluZyB0aGUgZmlsZSBvbnRvIHN5cy5wYXRoKSwgYW5kIHRoZSB1bnBhY2tlZCBhcmNoaXZlCnByZXNlcnZlcyBlbm91Z2ggaW5mb3JtYXRpb24gdG8gIlNwcmVhZCIgKGNvcHkgZGF0YSBhbmQgc2NyaXB0cyB0byB0aGVpcgpmaW5hbCBsb2NhdGlvbnMpIGF0IGFueSBsYXRlciB0aW1lLgoKVGhlIHdoZWVsIHByb2plY3QgcHJvdmlkZXMgYSBgYmRpc3Rfd2hlZWxgIGNvbW1hbmQgZm9yIHNldHVwdG9vbHMKKHJlcXVpcmVzIHNldHVwdG9vbHMgPj0gMC44LjApLiBXaGVlbCBmaWxlcyBjYW4gYmUgaW5zdGFsbGVkIHdpdGggYQpuZXdlciBgcGlwYCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3BpcCBvciB3aXRoIHdoZWVsJ3Mgb3duIGNvbW1hbmQKbGluZSB1dGlsaXR5LgoKVGhlIHdoZWVsIGRvY3VtZW50YXRpb24gaXMgYXQgaHR0cDovL3doZWVsLnJ0ZmQub3JnLy4gVGhlIGZpbGUgZm9ybWF0CmlzIGRvY3VtZW50ZWQgaW4gUEVQIDQyNyAoaHR0cDovL3d3dy5weXRob24ub3JnL2Rldi9wZXBzL3BlcC0wNDI3LykuCgpUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGlzIGF0IGh0dHBzOi8vYml0YnVja2V0Lm9yZy9weXBhL3doZWVsCgpXaHkgbm90IGVnZz8KLS0tLS0tLS0tLS0tCgpQeXRob24ncyBlZ2cgZm9ybWF0IHByZWRhdGVzIHRoZSBwYWNrYWdpbmcgcmVsYXRlZCBzdGFuZGFyZHMgd2UgaGF2ZQp0b2RheSwgdGhlIG1vc3QgaW1wb3J0YW50IGJlaW5nIFBFUCAzNzYgIkRhdGFiYXNlIG9mIEluc3RhbGxlZCBQeXRob24KRGlzdHJpYnV0aW9ucyIgd2hpY2ggc3BlY2lmaWVzIHRoZSAuZGlzdC1pbmZvIGRpcmVjdG9yeSAoaW5zdGVhZCBvZgouZWdnLWluZm8pIGFuZCBQRVAgNDI2ICJNZXRhZGF0YSBmb3IgUHl0aG9uIFNvZnR3YXJlIFBhY2thZ2VzIDIuMCIKd2hpY2ggc3BlY2lmaWVzIGhvdyB0byBleHByZXNzIGRlcGVuZGVuY2llcyAoaW5zdGVhZCBvZiByZXF1aXJlcy50eHQKaW4gLmVnZy1pbmZvKS4KCldoZWVsIGltcGxlbWVudHMgdGhlc2UgdGhpbmdzLiBJdCBhbHNvIHByb3ZpZGVzIGEgcmljaGVyIGZpbGUgbmFtaW5nCmNvbnZlbnRpb24gdGhhdCBjb21tdW5pY2F0ZXMgdGhlIFB5dGhvbiBpbXBsZW1lbnRhdGlvbiBhbmQgQUJJIGFzIHdlbGwKYXMgc2ltcGx5IHRoZSBsYW5ndWFnZSB2ZXJzaW9uIHVzZWQgaW4gYSBwYXJ0aWN1bGFyIHBhY2thZ2UuCgpVbmxpa2UgLmVnZywgd2hlZWwgd2lsbCBiZSBhIGZ1bGx5LWRvY3VtZW50ZWQgc3RhbmRhcmQgYXQgdGhlIGJpbmFyeQpsZXZlbCB0aGF0IGlzIHRydWx5IGVhc3kgdG8gaW5zdGFsbCBldmVuIGlmIHlvdSBkbyBub3Qgd2FudCB0byB1c2UgdGhlCnJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbi4KCgpDb2RlIG9mIENvbmR1Y3QKLS0tLS0tLS0tLS0tLS0tCgpFdmVyeW9uZSBpbnRlcmFjdGluZyBpbiB0aGUgd2hlZWwgcHJvamVjdCdzIGNvZGViYXNlcywgaXNzdWUgdHJhY2tlcnMsIGNoYXQKcm9vbXMsIGFuZCBtYWlsaW5nIGxpc3RzIGlzIGV4cGVjdGVkIHRvIGZvbGxvdyB0aGUgYFB5UEEgQ29kZSBvZiBDb25kdWN0YF8uCgouLiBfUHlQQSBDb2RlIG9mIENvbmR1Y3Q6IGh0dHBzOi8vd3d3LnB5cGEuaW8vZW4vbGF0ZXN0L2NvZGUtb2YtY29uZHVjdC8KCgoKMC4yOS4wCj09PT09PQotIEZpeCBjb21wcmVzc2lvbiB0eXBlIG9mIGZpbGVzIGluIGFyY2hpdmUgKElzc3VlICMxNTUsIFB1bGwgUmVxdWVzdCAjNjIsCiAgdGhhbmtzIFhhdmllciBGZXJuYW5kZXopCgowLjI4LjAKPT09PT09Ci0gRml4IGZpbGUgbW9kZXMgaW4gYXJjaGl2ZSAoSXNzdWUgIzE1NCkKCjAuMjcuMAo9PT09PT0KLSBTdXBwb3J0IGZvcmNpbmcgYSBwbGF0Zm9ybSB0YWcgdXNpbmcgYC0tcGxhdC1uYW1lYCBvbiBwdXJlLVB5dGhvbiB3aGVlbHMsIGFzCiAgd2VsbCBhcyBub25zdGFuZGFyZCBwbGF0Zm9ybSB0YWdzIG9uIG5vbi1wdXJlIHdoZWVscyAoUHVsbCBSZXF1ZXN0ICM2MCwgSXNzdWUKICAjMTQ0LCB0aGFua3MgQW5kcsOpcyBEw61heikKLSBBZGQgU09BQkkgdGFncyB0byBwbGF0Zm9ybS1zcGVjaWZpYyB3aGVlbHMgYnVpbHQgZm9yIFB5dGhvbiAyLlggKFB1bGwgUmVxdWVzdAogICM1NSwgSXNzdWUgIzYzLCBJc3N1ZSAjMTAxKQotIFN1cHBvcnQgcmVwcm9kdWNpYmxlIHdoZWVsIGZpbGVzLCB3aGVlbHMgdGhhdCBjYW4gYmUgcmVidWlsdCBhbmQgd2lsbCBoYXNoIHRvCiAgdGhlIHNhbWUgdmFsdWVzIGFzIHByZXZpb3VzIGJ1aWxkcyAoUHVsbCBSZXF1ZXN0ICM1MiwgSXNzdWUgIzE0MywgdGhhbmtzCiAgQmFycnkgV2Fyc2F3KQotIFN1cHBvcnQgZm9yIGNoYW5nZXMgaW4ga2V5cmluZyA+PSA4LjAgKFB1bGwgUmVxdWVzdCAjNjEsIHRoYW5rcyBKYXNvbiBSLgogIENvb21icykKLSBVc2UgdGhlIGZpbGUgY29udGV4dCBtYW5hZ2VyIHdoZW4gY2hlY2tpbmcgaWYgZGVwZW5kZW5jeV9saW5rcy50eHQgaXMgZW1wdHksCiAgZml4ZXMgcHJvYmxlbXMgYnVpbGRpbmcgd2hlZWxzIHVuZGVyIFB5UHkgb24gV2luZG93cyAgKElzc3VlICMxNTAsIHRoYW5rcwogIENvc2ltbyBMdXBvKQotIERvbid0IGF0dGVtcHQgdG8gKHJlY3Vyc2l2ZWx5KSBjcmVhdGUgYSBidWlsZCBkaXJlY3RvcnkgZW5kaW5nIHdpdGggYC4uYAogIChpbnZhbGlkIG9uIGFsbCBwbGF0Zm9ybXMsIGJ1dCBjb2RlIHdhcyBvbmx5IGV4ZWN1dGVkIG9uIFdpbmRvd3MpIChJc3N1ZSAjOTEpCi0gQWRkZWQgdGhlIFB5UEEgQ29kZSBvZiBDb25kdWN0IChQdWxsIFJlcXVlc3QgIzU2KQoKMC4yNi4wCj09PT09PQotIEZpeCBtdWx0aXBsZSBlbnRyeXBvaW50IGNvbXBhcmlzb24gZmFpbHVyZSBvbiBQeXRob24gMyAoSXNzdWUgIzE0OCkKCjAuMjUuMAo9PT09PT0KLSBBZGQgUHl0aG9uIDMuNSB0byB0b3ggY29uZmlndXJhdGlvbgotIERldGVybWluaXN0aWMgKHNvcnRlZCkgbWV0YWRhdGEKLSBGaXggdGFnZ2luZyBmb3IgUHl0aG9uIDMuNSBjb21wYXRpYmlsaXR5Ci0gU3VwcG9ydCBweTItbm9uZS0nYXJjaCcgYW5kIHB5My1ub25lLSdhcmNoJyB0YWdzCi0gVHJlYXQgZGF0YS1vbmx5IHdoZWVscyBhcyBwdXJlCi0gV3JpdGUgdG8gdGVtcG9yYXJ5IGZpbGUgYW5kIHJlbmFtZSB3aGVuIHVzaW5nIHdoZWVsIGluc3RhbGwgLS1mb3JjZQoKMC4yNC4wCj09PT09PQotIFRoZSBweXRob24gdGFnIHVzZWQgZm9yIHB1cmUtcHl0aG9uIHBhY2thZ2VzIGlzIG5vdyAucHlOIChtYWpvciB2ZXJzaW9uCiAgb25seSkuIFRoaXMgY2hhbmdlIGFjdHVhbGx5IG9jY3VycmVkIGluIDAuMjMuMCB3aGVuIHRoZSAtLXB5dGhvbi10YWcKICBvcHRpb24gd2FzIGFkZGVkLCBidXQgd2FzIG5vdCBleHBsaWNpdGx5IG1lbnRpb25lZCBpbiB0aGUgY2hhbmdlbG9nIHRoZW4uCi0gd2luaW5zdDJ3aGVlbCBhbmQgZWdnMndoZWVsIHJlbW92ZWQuIFVzZSAid2hlZWwgY29udmVydCBbYXJjaGl2ZV0iCiAgaW5zdGVhZC4KLSBXaGVlbCBub3cgc3VwcG9ydHMgc2V0dXB0b29scyBzdHlsZSBjb25kaXRpb25hbCByZXF1aXJlbWVudHMgdmlhIHRoZQogIGV4dHJhc19yZXF1aXJlPXt9IHN5bnRheC4gU2VwYXJhdGUgJ2V4dHJhJyBuYW1lcyBmcm9tIGNvbmRpdGlvbnMgdXNpbmcKICB0aGUgOiBjaGFyYWN0ZXIuIFdoZWVsJ3Mgb3duIHNldHVwLnB5IGRvZXMgdGhpcy4gKFRoZSBlbXB0eS1zdHJpbmcKICBleHRyYSBpcyB0aGUgc2FtZSBhcyBpbnN0YWxsX3JlcXVpcmVzLikgVGhlc2UgY29uZGl0aW9uYWwgcmVxdWlyZW1lbnRzCiAgc2hvdWxkIHdvcmsgdGhlIHNhbWUgd2hldGhlciB0aGUgcGFja2FnZSBpcyBpbnN0YWxsZWQgYnkgd2hlZWwgb3IKICBieSBzZXR1cC5weS4KCjAuMjMuMAo9PT09PT0KLSBDb21wYXRpYmlsaXR5IHRhZyBmbGFncyBhZGRlZCB0byB0aGUgYmRpc3Rfd2hlZWwgY29tbWFuZAotIHNkaXN0IHNob3VsZCBpbmNsdWRlIGZpbGVzIG5lY2Vzc2FyeSBmb3IgdGVzdHMKLSAnd2hlZWwgY29udmVydCcgY2FuIG5vdyBhbHNvIGNvbnZlcnQgdW5wYWNrZWQgZWdncyB0byB3aGVlbAotIFJlbmFtZSBweWRpc3QuanNvbiB0byBtZXRhZGF0YS5qc29uIHRvIGF2b2lkIHN0ZXBwaW5nIG9uIHRoZSBQRVAKLSBUaGUgLS1za2lwLXNjcmlwdHMgb3B0aW9uIGhhcyBiZWVuIHJlbW92ZWQsIGFuZCBub3QgZ2VuZXJhdGluZyBzY3JpcHRzIGlzIG5vdwogIHRoZSBkZWZhdWx0LiBUaGUgb3B0aW9uIHdhcyBhIHRlbXBvcmFyeSBhcHByb2FjaCB1bnRpbCBpbnN0YWxsZXJzIGNvdWxkCiAgZ2VuZXJhdGUgc2NyaXB0cyB0aGVtc2VsdmVzLiBUaGF0IGlzIG5vdyB0aGUgY2FzZSB3aXRoIHBpcCAxLjUgYW5kIGxhdGVyLgogIE5vdGUgdGhhdCB1c2luZyBwaXAgMS40IHRvIGluc3RhbGwgYSB3aGVlbCB3aXRob3V0IHNjcmlwdHMgd2lsbCBsZWF2ZSB0aGUKICBpbnN0YWxsYXRpb24gd2l0aG91dCBlbnRyeS1wb2ludCB3cmFwcGVycy4gVGhlICJ3aGVlbCBpbnN0YWxsLXNjcmlwdHMiCiAgY29tbWFuZCBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgc2NyaXB0cyBpbiBzdWNoIGNhc2VzLgotIFRoYW5rIHlvdSBjb250cmlidXRvcnMKCjAuMjIuMAo9PT09PT0KLSBJbmNsdWRlIGVudHJ5X3BvaW50cy50eHQsIHNjcmlwdHMgYS5rLmEuIGNvbW1hbmRzLCBpbiBleHBlcmltZW50YWwKICBweWRpc3QuanNvbgotIEltcHJvdmVkIHRlc3RfcmVxdWlyZXMgcGFyc2luZwotIFB5dGhvbiAyLjYgZml4ZXMsICJ3aGVlbCB2ZXJzaW9uIiBjb21tYW5kIGNvdXJ0ZXN5IHBvbWJyZWRhbm5lCgowLjIxLjAKPT09PT09Ci0gUHJlZ2VuZXJhdGVkIHNjcmlwdHMgYXJlIHRoZSBkZWZhdWx0IGFnYWluLgotICJzZXR1cC5weSBiZGlzdF93aGVlbCAtLXNraXAtc2NyaXB0cyIgdHVybnMgdGhlbSBvZmYuCi0gc2V0dXB0b29scyBpcyBubyBsb25nZXIgYSBsaXN0ZWQgcmVxdWlyZW1lbnQgZm9yIHRoZSAnd2hlZWwnCiAgcGFja2FnZS4gSXQgaXMgb2YgY291cnNlIHN0aWxsIHJlcXVpcmVkIGluIG9yZGVyIGZvciBiZGlzdF93aGVlbAogIHRvIHdvcmsuCi0gInB5dGhvbiAtbSB3aGVlbCIgYXZvaWRzIGltcG9ydGluZyBwa2dfcmVzb3VyY2VzIHVudGlsIGl0J3MgbmVjZXNzYXJ5LgoKMC4yMC4wCj09PT09PQotIE5vIGxvbmdlciBpbmNsdWRlIGNvbnNvbGVfc2NyaXB0cyBpbiB3aGVlbHMuIE9yZGluYXJ5IHNjcmlwdHMgKHNoZWxsIGZpbGVzLAogIHN0YW5kYWxvbmUgUHl0aG9uIGZpbGVzKSBhcmUgaW5jbHVkZWQgYXMgdXN1YWwuCi0gSW5jbHVkZSBuZXcgY29tbWFuZCAicHl0aG9uIC1tIHdoZWVsIGluc3RhbGwtc2NyaXB0cyBbZGlzdHJpYnV0aW9uCiAgW2Rpc3RyaWJ1dGlvbiAuLi5dXSIgdG8gaW5zdGFsbCB0aGUgY29uc29sZV9zY3JpcHRzIChzZXR1cHRvb2xzLXN0eWxlCiAgc2NyaXB0cyB1c2luZyBwa2dfcmVzb3VyY2VzKSBmb3IgYSBkaXN0cmlidXRpb24uCgowLjE5LjAKPT09PT09Ci0gcHltZXRhLmpzb24gYmVjb21lcyBweWRpc3QuanNvbgoKMC4xOC4wCj09PT09PQotIFB5dGhvbiAzIFVuaWNvZGUgaW1wcm92ZW1lbnRzCgowLjE3LjAKPT09PT09Ci0gU3VwcG9ydCBsYXRlc3QgUEVQLTQyNiAicHltZXRhLmpzb24iIChqc29uLWZvcm1hdCBtZXRhZGF0YSkKCjAuMTYuMAo9PT09PT0KLSBQeXRob24gMi42IGNvbXBhdGliaWxpdHkgYnVnZml4ICh0aGFua3MgSm9obiBNY0ZhcmxhbmUpCi0gTm9uLXByZXJlbGVhc2UgdmVyc2lvbiBudW1iZXIKCjEuMC4wYTIKPT09PT09PQotIEJ1Z2ZpeCBmb3IgQy1leHRlbnNpb24gdGFncyBmb3IgQ1B5dGhvbiAzLjMgKHVzaW5nIFNPQUJJKQoKMS4wLjBhMQo9PT09PT09Ci0gQnVnZml4IGZvciBiZGlzdF93aW5pbnN0IGNvbnZlcnRlciAid2hlZWwgY29udmVydCIKLSBCdWdmaXggZm9yIGRpc3RzIHdoZXJlICJpcyBwdXJlIiBpcyBOb25lIGluc3RlYWQgb2YgVHJ1ZSBvciBGYWxzZQoKMS4wLjBhMAo9PT09PT09Ci0gVXBkYXRlIGZvciB2ZXJzaW9uIDEuMCBvZiBXaGVlbCAoUEVQIGFjY2VwdGVkKS4KLSBQeXRob24gMyBmaXggZm9yIG1vdmluZyBVbmljb2RlIERlc2NyaXB0aW9uIHRvIG1ldGFkYXRhIGJvZHkKLSBJbmNsdWRlIHJ1ZGltZW50YXJ5IEFQSSBkb2N1bWVudGF0aW9uIGluIFNwaGlueCAodGhhbmtzIEtldmluIEhvcm4pCgowLjE1LjAKPT09PT09Ci0gVmFyaW91cyBpbXByb3ZlbWVudHMKCjAuMTQuMAo9PT09PT0KLSBDaGFuZ2VkIHRoZSBzaWduYXR1cmUgZm9ybWF0IHRvIGJldHRlciBjb21wbHkgd2l0aCB0aGUgY3VycmVudCBKV1Mgc3BlYy4KICBCcmVha3MgYWxsIGV4aXN0aW5nIHNpZ25hdHVyZXMuCi0gSW5jbHVkZSBgYHdoZWVsIHVuc2lnbmBgIGNvbW1hbmQgdG8gcmVtb3ZlIFJFQ09SRC5qd3MgZnJvbSBhbiBhcmNoaXZlLgotIFB1dCB0aGUgZGVzY3JpcHRpb24gaW4gdGhlIG5ld2x5IGFsbG93ZWQgcGF5bG9hZCBzZWN0aW9uIG9mIFBLRy1JTkZPCiAgKE1FVEFEQVRBKSBmaWxlcy4KCjAuMTMuMAo9PT09PT0KLSBVc2UgZGlzdHV0aWxzIGluc3RlYWQgb2Ygc3lzY29uZmlnIHRvIGdldCBpbnN0YWxsYXRpb24gcGF0aHM7IGNhbiBpbnN0YWxsCiAgaGVhZGVycy4KLSBJbXByb3ZlIFdoZWVsRmlsZSgpIHNvcnQuCi0gQWxsb3cgYm9vdHN0cmFwIGluc3RhbGxzIHdpdGhvdXQgYW55IHBrZ19yZXNvdXJjZXMuCgowLjEyLjAKPT09PT09Ci0gVW5pdCB0ZXN0IGZvciB3aGVlbC50b29sLmluc3RhbGwKCjAuMTEuMAo9PT09PT0KLSBBUEkgY2xlYW51cAoKMC4xMC4zCj09PT09PQotIFNjcmlwdHMgZml4ZXIgZml4CgowLjEwLjIKPT09PT09Ci0gRml4IGtleWdlbgoKMC4xMC4xCj09PT09PQotIFByZXNlcnZlIGF0dHJpYnV0ZXMgb24gaW5zdGFsbC4KCjAuMTAuMAo9PT09PT0KLSBJbmNsdWRlIGEgY29weSBvZiBwa2dfcmVzb3VyY2VzLiBXaGVlbCBjYW4gbm93IGluc3RhbGwgaW50byBhIHZpcnR1YWxlbnYKICB0aGF0IGRvZXMgbm90IGhhdmUgZGlzdHJpYnV0ZSAodGhvdWdoIG1vc3QgcGFja2FnZXMgc3RpbGwgcmVxdWlyZQogIHBrZ19yZXNvdXJjZXMgdG8gYWN0dWFsbHkgd29yazsgd2hlZWwgaW5zdGFsbCBkaXN0cmlidXRlKQotIERlZmluZSBhIG5ldyBzZXR1cC5jZmcgc2VjdGlvbiBbd2hlZWxdLiB1bml2ZXJzYWw9MSB3aWxsCiAgYXBwbHkgdGhlIHB5Mi5weTMtbm9uZS1hbnkgdGFnIGZvciBwdXJlIHB5dGhvbiB3aGVlbHMuCgowLjkuNwo9PT09PQotIE9ubHkgaW1wb3J0IGRpcnNwZWMgd2hlbiBuZWVkZWQuIGRpcnNwZWMgaXMgb25seSBuZWVkZWQgdG8gZmluZCB0aGUKICBjb25maWd1cmF0aW9uIGZvciBrZXlnZW4vc2lnbmluZyBvcGVyYXRpb25zLgoKMC45LjYKPT09PT0KLSByZXF1aXJlcy1kaXN0IGZyb20gc2V0dXAuY2ZnIG92ZXJ3cml0ZXMgYW55IHJlcXVpcmVtZW50cyBmcm9tIHNldHVwLnB5CiAgQ2FyZSBtdXN0IGJlIHRha2VuIHRoYXQgdGhlIHJlcXVpcmVtZW50cyBhcmUgdGhlIHNhbWUgaW4gYm90aCBjYXNlcywKICBvciBqdXN0IGFsd2F5cyBpbnN0YWxsIGZyb20gd2hlZWwuCi0gZHJvcCBkaXJzcGVjIHJlcXVpcmVtZW50IG9uIHdpbjMyCi0gaW1wcm92ZWQgY29tbWFuZCBsaW5lIHV0aWxpdHksIGFkZHMgJ3doZWVsIGNvbnZlcnQgW2VnZyBvciB3aW5pbnN0XScgdG8KICBjb252ZXJ0IGxlZ2FjeSBiaW5hcnkgZm9ybWF0cyB0byB3aGVlbAoKMC45LjUKPT09PT0KLSBXaGVlbCdzIG93biB3aGVlbCBmaWxlIGNhbiBiZSBleGVjdXRlZCBieSBQeXRob24sIGFuZCBjYW4gaW5zdGFsbCBpdHNlbGY6CiAgYGBweXRob24gd2hlZWwtMC45LjUtcHkyNy1ub25lLWFueS93aGVlbCBpbnN0YWxsIC4uLmBgCi0gVXNlIGFyZ3BhcnNlOyBiYXNpYyBgYHdoZWVsIGluc3RhbGxgYCBjb21tYW5kIHNob3VsZCBydW4gd2l0aCBvbmx5IHN0ZGxpYgogIGRlcGVuZGVuY2llcy4KLSBBbGxvdyByZXF1aXJlc19kaXN0IGluIHNldHVwLmNmZydzIFttZXRhZGF0YV0gc2VjdGlvbi4gSW4gYWRkaXRpb24gdG8KICBkZXBlbmRlbmNpZXMgaW4gc2V0dXAucHksIGJ1dCB3aWxsIG9ubHkgYmUgaW50ZXJwcmV0ZWQgd2hlbiBpbnN0YWxsaW5nCiAgZnJvbSB3aGVlbCwgbm90IGZyb20gc2Rpc3QuIENhbiBiZSBxdWFsaWZpZWQgd2l0aCBlbnZpcm9ubWVudCBtYXJrZXJzLgoKMC45LjQKPT09PT0KLSBGaXggd2hlZWwuc2lnbmF0dXJlcyBpbiBzZGlzdAoKMC45LjMKPT09PT0KLSBJbnRlZ3JhdGVkIGRpZ2l0YWwgc2lnbmF0dXJlcyBzdXBwb3J0IHdpdGhvdXQgQyBleHRlbnNpb25zLgotIEludGVncmF0ZWQgIndoZWVsIGluc3RhbGwiIGNvbW1hbmQgKHNpbmdsZSBwYWNrYWdlLCBubyBkZXBlbmRlbmN5CiAgcmVzb2x1dGlvbikgaW5jbHVkaW5nIGNvbXBhdGliaWxpdHkgY2hlY2suCi0gU3VwcG9ydCBQeXRob24gMy4zCi0gVXNlIE1ldGFkYXRhIDEuMyAoUEVQIDQyNikKCjAuOS4yCj09PT09Ci0gQXV0b21hdGljIHNpZ25pbmcgaWYgV0hFRUxfVE9PTCBwb2ludHMgdG8gdGhlIHdoZWVsIGJpbmFyeQotIEV2ZW4gbW9yZSBQeXRob24gMyBmaXhlcwoKMC45LjEKPT09PT0KLSAnd2hlZWwgc2lnbicgdXNlcyB0aGUga2V5cyBnZW5lcmF0ZWQgYnkgJ3doZWVsIGtleWdlbicgKGluc3RlYWQgb2YgZ2VuZXJhdGluZwogIGEgbmV3IGtleSBhdCByYW5kb20gZWFjaCB0aW1lKQotIFB5dGhvbiAyLzMgZW5jb2RpbmcvZGVjb2RpbmcgZml4ZXMKLSBSdW4gdGVzdHMgb24gUHl0aG9uIDIuNiAod2l0aG91dCBzaWduYXR1cmUgdmVyaWZpY2F0aW9uKQoKMC45Cj09PQotIFVwZGF0ZWQgZGlnaXRhbCBzaWduYXR1cmVzIHNjaGVtZQotIFB5dGhvbiAzIHN1cHBvcnQgZm9yIGRpZ2l0YWwgc2lnbmF0dXJlcwotIEFsd2F5cyB2ZXJpZnkgUkVDT1JEIGhhc2hlcyBvbiBleHRyYWN0Ci0gIndoZWVsIiBjb21tYW5kIGxpbmUgdG9vbCB0byBzaWduLCB2ZXJpZnksIHVucGFjayB3aGVlbCBmaWxlcwoKMC44Cj09PQotIG5vbmUvYW55IGRyYWZ0IHBlcCB0YWdzIHVwZGF0ZQotIGltcHJvdmVkIHdpbmluc3Qyd2hlZWwgc2NyaXB0Ci0gZG9jIGNoYW5nZXMgYW5kIG90aGVyIGltcHJvdmVtZW50cwoKMC43Cj09PQotIHNvcnQgLmRpc3QtaW5mbyBhdCBlbmQgb2Ygd2hlZWwgYXJjaGl2ZQotIFdpbmRvd3MgJiBQeXRob24gMyBmaXhlcyBmcm9tIFBhdWwgTW9vcmUKLSBwZXA4Ci0gc2NyaXB0cyB0byBjb252ZXJ0IHdpbmluc3QgJiBlZ2cgdG8gd2hlZWwKCjAuNgo9PT0KLSByZXF1aXJlIGRpc3RyaWJ1dGUgPj0gMC42LjI4Ci0gc3RvcCB1c2luZyB2ZXJsaWIKCjAuNQo9PT0KLSB3b3JraW5nIHByZXR0eSB3ZWxsCgowLjQuMgo9PT09PQotIGh5cGhlbmF0ZWQgbmFtZSBmaXgKCjAuNAo9PT0KLSBpbXByb3ZlIHRlc3QgY292ZXJhZ2UKLSBpbXByb3ZlIFdpbmRvd3MgY29tcGF0aWJpbGl0eQotIGluY2x1ZGUgdG94LmluaSBjb3VydGVzeSBvZiBNYXJjIEFicmFtb3dpdHoKLSBkcmFmdCBobWFjIHNoYS0yNTYgc2lnbmluZyBmdW5jdGlvbgoKMC4zCj09PQotIHByb3RvdHlwZSBlZ2cyd2hlZWwgY29udmVyc2lvbiBzY3JpcHQKCjAuMgo9PT0KLSBQeXRob24gMyBjb21wYXRpYmlsaXR5CgowLjEKPT09Ci0gSW5pdGlhbCB2ZXJzaW9uCgoKUEsDBBQAAAAAAAAAIQBw/66fZQQAAGUEAABGAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsLTAuMzAuMGEwLmRpc3QtaW5mby9MSUNFTlNFLnR4dCJ3aGVlbCIgY29weXJpZ2h0IChjKSAyMDEyLTIwMTQgRGFuaWVsIEhvbHRoIDxkaG9sdGhAZmFzdG1haWwuZm0+IGFuZApjb250cmlidXRvcnMuCgpUaGUgTUlUIExpY2Vuc2UKClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCmNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCnRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCmFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQpTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCkFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgpPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuClBLAwQUAAAAAAAAACEARG2ZgQ0rAAANKwAAQwAAAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC0wLjMwLjBhMC5kaXN0LWluZm8vTUVUQURBVEFNZXRhZGF0YS1WZXJzaW9uOiAyLjAKTmFtZTogd2hlZWwKVmVyc2lvbjogMC4zMC4wYTAKU3VtbWFyeTogQSBidWlsdC1wYWNrYWdlIGZvcm1hdCBmb3IgUHl0aG9uLgpIb21lLXBhZ2U6IGh0dHBzOi8vYml0YnVja2V0Lm9yZy9weXBhL3doZWVsLwpBdXRob3I6IERhbmllbCBIb2x0aApBdXRob3ItZW1haWw6IGRob2x0aEBmYXN0bWFpbC5mbQpMaWNlbnNlOiBNSVQKS2V5d29yZHM6IHdoZWVsLHBhY2thZ2luZwpQbGF0Zm9ybTogVU5LTk9XTgpDbGFzc2lmaWVyOiBEZXZlbG9wbWVudCBTdGF0dXMgOjogNCAtIEJldGEKQ2xhc3NpZmllcjogSW50ZW5kZWQgQXVkaWVuY2UgOjogRGV2ZWxvcGVycwpDbGFzc2lmaWVyOiBQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24KQ2xhc3NpZmllcjogUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDIKQ2xhc3NpZmllcjogUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDIuNgpDbGFzc2lmaWVyOiBQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMi43CkNsYXNzaWZpZXI6IFByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzCkNsYXNzaWZpZXI6IFByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzLjIKQ2xhc3NpZmllcjogUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMuMwpDbGFzc2lmaWVyOiBQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMy40ClJlcXVpcmVzLURpc3Q6IGFyZ3BhcnNlOyBweXRob25fdmVyc2lvbj09IjIuNiIKUHJvdmlkZXMtRXh0cmE6IGZhc3Rlci1zaWduYXR1cmVzClJlcXVpcmVzLURpc3Q6IGVkMjU1MTlsbDsgZXh0cmEgPT0gJ2Zhc3Rlci1zaWduYXR1cmVzJwpQcm92aWRlcy1FeHRyYTogc2lnbmF0dXJlcwpSZXF1aXJlcy1EaXN0OiBrZXlyaW5nOyBleHRyYSA9PSAnc2lnbmF0dXJlcycKUmVxdWlyZXMtRGlzdDoga2V5cmluZ3MuYWx0OyBleHRyYSA9PSAnc2lnbmF0dXJlcycKUHJvdmlkZXMtRXh0cmE6IHNpZ25hdHVyZXMKUmVxdWlyZXMtRGlzdDogaW1wb3J0bGliOyBweXRob25fdmVyc2lvbj09IjIuNiIgYW5kIGV4dHJhID09ICdzaWduYXR1cmVzJwpQcm92aWRlcy1FeHRyYTogc2lnbmF0dXJlcwpSZXF1aXJlcy1EaXN0OiBweXhkZzsgc3lzX3BsYXRmb3JtIT0id2luMzIiIGFuZCBleHRyYSA9PSAnc2lnbmF0dXJlcycKUHJvdmlkZXMtRXh0cmE6IHRvb2wKCldoZWVsCj09PT09CgpBIGJ1aWx0LXBhY2thZ2UgZm9ybWF0IGZvciBQeXRob24uCgpBIHdoZWVsIGlzIGEgWklQLWZvcm1hdCBhcmNoaXZlIHdpdGggYSBzcGVjaWFsbHkgZm9ybWF0dGVkIGZpbGVuYW1lCmFuZCB0aGUgLndobCBleHRlbnNpb24uIEl0IGlzIGRlc2lnbmVkIHRvIGNvbnRhaW4gYWxsIHRoZSBmaWxlcyBmb3IgYQpQRVAgMzc2IGNvbXBhdGlibGUgaW5zdGFsbCBpbiBhIHdheSB0aGF0IGlzIHZlcnkgY2xvc2UgdG8gdGhlIG9uLWRpc2sKZm9ybWF0LiBNYW55IHBhY2thZ2VzIHdpbGwgYmUgcHJvcGVybHkgaW5zdGFsbGVkIHdpdGggb25seSB0aGUgIlVucGFjayIKc3RlcCAoc2ltcGx5IGV4dHJhY3RpbmcgdGhlIGZpbGUgb250byBzeXMucGF0aCksIGFuZCB0aGUgdW5wYWNrZWQgYXJjaGl2ZQpwcmVzZXJ2ZXMgZW5vdWdoIGluZm9ybWF0aW9uIHRvICJTcHJlYWQiIChjb3B5IGRhdGEgYW5kIHNjcmlwdHMgdG8gdGhlaXIKZmluYWwgbG9jYXRpb25zKSBhdCBhbnkgbGF0ZXIgdGltZS4KClRoZSB3aGVlbCBwcm9qZWN0IHByb3ZpZGVzIGEgYGJkaXN0X3doZWVsYCBjb21tYW5kIGZvciBzZXR1cHRvb2xzCihyZXF1aXJlcyBzZXR1cHRvb2xzID49IDAuOC4wKS4gV2hlZWwgZmlsZXMgY2FuIGJlIGluc3RhbGxlZCB3aXRoIGEKbmV3ZXIgYHBpcGAgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vcHlwYS9waXAgb3Igd2l0aCB3aGVlbCdzIG93biBjb21tYW5kCmxpbmUgdXRpbGl0eS4KClRoZSB3aGVlbCBkb2N1bWVudGF0aW9uIGlzIGF0IGh0dHA6Ly93aGVlbC5ydGZkLm9yZy8uIFRoZSBmaWxlIGZvcm1hdAppcyBkb2N1bWVudGVkIGluIFBFUCA0MjcgKGh0dHA6Ly93d3cucHl0aG9uLm9yZy9kZXYvcGVwcy9wZXAtMDQyNy8pLgoKVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBpcyBhdCBodHRwczovL2JpdGJ1Y2tldC5vcmcvcHlwYS93aGVlbAoKV2h5IG5vdCBlZ2c/Ci0tLS0tLS0tLS0tLQoKUHl0aG9uJ3MgZWdnIGZvcm1hdCBwcmVkYXRlcyB0aGUgcGFja2FnaW5nIHJlbGF0ZWQgc3RhbmRhcmRzIHdlIGhhdmUKdG9kYXksIHRoZSBtb3N0IGltcG9ydGFudCBiZWluZyBQRVAgMzc2ICJEYXRhYmFzZSBvZiBJbnN0YWxsZWQgUHl0aG9uCkRpc3RyaWJ1dGlvbnMiIHdoaWNoIHNwZWNpZmllcyB0aGUgLmRpc3QtaW5mbyBkaXJlY3RvcnkgKGluc3RlYWQgb2YKLmVnZy1pbmZvKSBhbmQgUEVQIDQyNiAiTWV0YWRhdGEgZm9yIFB5dGhvbiBTb2Z0d2FyZSBQYWNrYWdlcyAyLjAiCndoaWNoIHNwZWNpZmllcyBob3cgdG8gZXhwcmVzcyBkZXBlbmRlbmNpZXMgKGluc3RlYWQgb2YgcmVxdWlyZXMudHh0CmluIC5lZ2ctaW5mbykuCgpXaGVlbCBpbXBsZW1lbnRzIHRoZXNlIHRoaW5ncy4gSXQgYWxzbyBwcm92aWRlcyBhIHJpY2hlciBmaWxlIG5hbWluZwpjb252ZW50aW9uIHRoYXQgY29tbXVuaWNhdGVzIHRoZSBQeXRob24gaW1wbGVtZW50YXRpb24gYW5kIEFCSSBhcyB3ZWxsCmFzIHNpbXBseSB0aGUgbGFuZ3VhZ2UgdmVyc2lvbiB1c2VkIGluIGEgcGFydGljdWxhciBwYWNrYWdlLgoKVW5saWtlIC5lZ2csIHdoZWVsIHdpbGwgYmUgYSBmdWxseS1kb2N1bWVudGVkIHN0YW5kYXJkIGF0IHRoZSBiaW5hcnkKbGV2ZWwgdGhhdCBpcyB0cnVseSBlYXN5IHRvIGluc3RhbGwgZXZlbiBpZiB5b3UgZG8gbm90IHdhbnQgdG8gdXNlIHRoZQpyZWZlcmVuY2UgaW1wbGVtZW50YXRpb24uCgoKQ29kZSBvZiBDb25kdWN0Ci0tLS0tLS0tLS0tLS0tLQoKRXZlcnlvbmUgaW50ZXJhY3RpbmcgaW4gdGhlIHdoZWVsIHByb2plY3QncyBjb2RlYmFzZXMsIGlzc3VlIHRyYWNrZXJzLCBjaGF0CnJvb21zLCBhbmQgbWFpbGluZyBsaXN0cyBpcyBleHBlY3RlZCB0byBmb2xsb3cgdGhlIGBQeVBBIENvZGUgb2YgQ29uZHVjdGBfLgoKLi4gX1B5UEEgQ29kZSBvZiBDb25kdWN0OiBodHRwczovL3d3dy5weXBhLmlvL2VuL2xhdGVzdC9jb2RlLW9mLWNvbmR1Y3QvCgoKCjAuMjkuMAo9PT09PT0KLSBGaXggY29tcHJlc3Npb24gdHlwZSBvZiBmaWxlcyBpbiBhcmNoaXZlIChJc3N1ZSAjMTU1LCBQdWxsIFJlcXVlc3QgIzYyLAogIHRoYW5rcyBYYXZpZXIgRmVybmFuZGV6KQoKMC4yOC4wCj09PT09PQotIEZpeCBmaWxlIG1vZGVzIGluIGFyY2hpdmUgKElzc3VlICMxNTQpCgowLjI3LjAKPT09PT09Ci0gU3VwcG9ydCBmb3JjaW5nIGEgcGxhdGZvcm0gdGFnIHVzaW5nIGAtLXBsYXQtbmFtZWAgb24gcHVyZS1QeXRob24gd2hlZWxzLCBhcwogIHdlbGwgYXMgbm9uc3RhbmRhcmQgcGxhdGZvcm0gdGFncyBvbiBub24tcHVyZSB3aGVlbHMgKFB1bGwgUmVxdWVzdCAjNjAsIElzc3VlCiAgIzE0NCwgdGhhbmtzIEFuZHLDqXMgRMOtYXopCi0gQWRkIFNPQUJJIHRhZ3MgdG8gcGxhdGZvcm0tc3BlY2lmaWMgd2hlZWxzIGJ1aWx0IGZvciBQeXRob24gMi5YIChQdWxsIFJlcXVlc3QKICAjNTUsIElzc3VlICM2MywgSXNzdWUgIzEwMSkKLSBTdXBwb3J0IHJlcHJvZHVjaWJsZSB3aGVlbCBmaWxlcywgd2hlZWxzIHRoYXQgY2FuIGJlIHJlYnVpbHQgYW5kIHdpbGwgaGFzaCB0bwogIHRoZSBzYW1lIHZhbHVlcyBhcyBwcmV2aW91cyBidWlsZHMgKFB1bGwgUmVxdWVzdCAjNTIsIElzc3VlICMxNDMsIHRoYW5rcwogIEJhcnJ5IFdhcnNhdykKLSBTdXBwb3J0IGZvciBjaGFuZ2VzIGluIGtleXJpbmcgPj0gOC4wIChQdWxsIFJlcXVlc3QgIzYxLCB0aGFua3MgSmFzb24gUi4KICBDb29tYnMpCi0gVXNlIHRoZSBmaWxlIGNvbnRleHQgbWFuYWdlciB3aGVuIGNoZWNraW5nIGlmIGRlcGVuZGVuY3lfbGlua3MudHh0IGlzIGVtcHR5LAogIGZpeGVzIHByb2JsZW1zIGJ1aWxkaW5nIHdoZWVscyB1bmRlciBQeVB5IG9uIFdpbmRvd3MgIChJc3N1ZSAjMTUwLCB0aGFua3MKICBDb3NpbW8gTHVwbykKLSBEb24ndCBhdHRlbXB0IHRvIChyZWN1cnNpdmVseSkgY3JlYXRlIGEgYnVpbGQgZGlyZWN0b3J5IGVuZGluZyB3aXRoIGAuLmAKICAoaW52YWxpZCBvbiBhbGwgcGxhdGZvcm1zLCBidXQgY29kZSB3YXMgb25seSBleGVjdXRlZCBvbiBXaW5kb3dzKSAoSXNzdWUgIzkxKQotIEFkZGVkIHRoZSBQeVBBIENvZGUgb2YgQ29uZHVjdCAoUHVsbCBSZXF1ZXN0ICM1NikKCjAuMjYuMAo9PT09PT0KLSBGaXggbXVsdGlwbGUgZW50cnlwb2ludCBjb21wYXJpc29uIGZhaWx1cmUgb24gUHl0aG9uIDMgKElzc3VlICMxNDgpCgowLjI1LjAKPT09PT09Ci0gQWRkIFB5dGhvbiAzLjUgdG8gdG94IGNvbmZpZ3VyYXRpb24KLSBEZXRlcm1pbmlzdGljIChzb3J0ZWQpIG1ldGFkYXRhCi0gRml4IHRhZ2dpbmcgZm9yIFB5dGhvbiAzLjUgY29tcGF0aWJpbGl0eQotIFN1cHBvcnQgcHkyLW5vbmUtJ2FyY2gnIGFuZCBweTMtbm9uZS0nYXJjaCcgdGFncwotIFRyZWF0IGRhdGEtb25seSB3aGVlbHMgYXMgcHVyZQotIFdyaXRlIHRvIHRlbXBvcmFyeSBmaWxlIGFuZCByZW5hbWUgd2hlbiB1c2luZyB3aGVlbCBpbnN0YWxsIC0tZm9yY2UKCjAuMjQuMAo9PT09PT0KLSBUaGUgcHl0aG9uIHRhZyB1c2VkIGZvciBwdXJlLXB5dGhvbiBwYWNrYWdlcyBpcyBub3cgLnB5TiAobWFqb3IgdmVyc2lvbgogIG9ubHkpLiBUaGlzIGNoYW5nZSBhY3R1YWxseSBvY2N1cnJlZCBpbiAwLjIzLjAgd2hlbiB0aGUgLS1weXRob24tdGFnCiAgb3B0aW9uIHdhcyBhZGRlZCwgYnV0IHdhcyBub3QgZXhwbGljaXRseSBtZW50aW9uZWQgaW4gdGhlIGNoYW5nZWxvZyB0aGVuLgotIHdpbmluc3Qyd2hlZWwgYW5kIGVnZzJ3aGVlbCByZW1vdmVkLiBVc2UgIndoZWVsIGNvbnZlcnQgW2FyY2hpdmVdIgogIGluc3RlYWQuCi0gV2hlZWwgbm93IHN1cHBvcnRzIHNldHVwdG9vbHMgc3R5bGUgY29uZGl0aW9uYWwgcmVxdWlyZW1lbnRzIHZpYSB0aGUKICBleHRyYXNfcmVxdWlyZT17fSBzeW50YXguIFNlcGFyYXRlICdleHRyYScgbmFtZXMgZnJvbSBjb25kaXRpb25zIHVzaW5nCiAgdGhlIDogY2hhcmFjdGVyLiBXaGVlbCdzIG93biBzZXR1cC5weSBkb2VzIHRoaXMuIChUaGUgZW1wdHktc3RyaW5nCiAgZXh0cmEgaXMgdGhlIHNhbWUgYXMgaW5zdGFsbF9yZXF1aXJlcy4pIFRoZXNlIGNvbmRpdGlvbmFsIHJlcXVpcmVtZW50cwogIHNob3VsZCB3b3JrIHRoZSBzYW1lIHdoZXRoZXIgdGhlIHBhY2thZ2UgaXMgaW5zdGFsbGVkIGJ5IHdoZWVsIG9yCiAgYnkgc2V0dXAucHkuCgowLjIzLjAKPT09PT09Ci0gQ29tcGF0aWJpbGl0eSB0YWcgZmxhZ3MgYWRkZWQgdG8gdGhlIGJkaXN0X3doZWVsIGNvbW1hbmQKLSBzZGlzdCBzaG91bGQgaW5jbHVkZSBmaWxlcyBuZWNlc3NhcnkgZm9yIHRlc3RzCi0gJ3doZWVsIGNvbnZlcnQnIGNhbiBub3cgYWxzbyBjb252ZXJ0IHVucGFja2VkIGVnZ3MgdG8gd2hlZWwKLSBSZW5hbWUgcHlkaXN0Lmpzb24gdG8gbWV0YWRhdGEuanNvbiB0byBhdm9pZCBzdGVwcGluZyBvbiB0aGUgUEVQCi0gVGhlIC0tc2tpcC1zY3JpcHRzIG9wdGlvbiBoYXMgYmVlbiByZW1vdmVkLCBhbmQgbm90IGdlbmVyYXRpbmcgc2NyaXB0cyBpcyBub3cKICB0aGUgZGVmYXVsdC4gVGhlIG9wdGlvbiB3YXMgYSB0ZW1wb3JhcnkgYXBwcm9hY2ggdW50aWwgaW5zdGFsbGVycyBjb3VsZAogIGdlbmVyYXRlIHNjcmlwdHMgdGhlbXNlbHZlcy4gVGhhdCBpcyBub3cgdGhlIGNhc2Ugd2l0aCBwaXAgMS41IGFuZCBsYXRlci4KICBOb3RlIHRoYXQgdXNpbmcgcGlwIDEuNCB0byBpbnN0YWxsIGEgd2hlZWwgd2l0aG91dCBzY3JpcHRzIHdpbGwgbGVhdmUgdGhlCiAgaW5zdGFsbGF0aW9uIHdpdGhvdXQgZW50cnktcG9pbnQgd3JhcHBlcnMuIFRoZSAid2hlZWwgaW5zdGFsbC1zY3JpcHRzIgogIGNvbW1hbmQgY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIHNjcmlwdHMgaW4gc3VjaCBjYXNlcy4KLSBUaGFuayB5b3UgY29udHJpYnV0b3JzCgowLjIyLjAKPT09PT09Ci0gSW5jbHVkZSBlbnRyeV9wb2ludHMudHh0LCBzY3JpcHRzIGEuay5hLiBjb21tYW5kcywgaW4gZXhwZXJpbWVudGFsCiAgcHlkaXN0Lmpzb24KLSBJbXByb3ZlZCB0ZXN0X3JlcXVpcmVzIHBhcnNpbmcKLSBQeXRob24gMi42IGZpeGVzLCAid2hlZWwgdmVyc2lvbiIgY29tbWFuZCBjb3VydGVzeSBwb21icmVkYW5uZQoKMC4yMS4wCj09PT09PQotIFByZWdlbmVyYXRlZCBzY3JpcHRzIGFyZSB0aGUgZGVmYXVsdCBhZ2Fpbi4KLSAic2V0dXAucHkgYmRpc3Rfd2hlZWwgLS1za2lwLXNjcmlwdHMiIHR1cm5zIHRoZW0gb2ZmLgotIHNldHVwdG9vbHMgaXMgbm8gbG9uZ2VyIGEgbGlzdGVkIHJlcXVpcmVtZW50IGZvciB0aGUgJ3doZWVsJwogIHBhY2thZ2UuIEl0IGlzIG9mIGNvdXJzZSBzdGlsbCByZXF1aXJlZCBpbiBvcmRlciBmb3IgYmRpc3Rfd2hlZWwKICB0byB3b3JrLgotICJweXRob24gLW0gd2hlZWwiIGF2b2lkcyBpbXBvcnRpbmcgcGtnX3Jlc291cmNlcyB1bnRpbCBpdCdzIG5lY2Vzc2FyeS4KCjAuMjAuMAo9PT09PT0KLSBObyBsb25nZXIgaW5jbHVkZSBjb25zb2xlX3NjcmlwdHMgaW4gd2hlZWxzLiBPcmRpbmFyeSBzY3JpcHRzIChzaGVsbCBmaWxlcywKICBzdGFuZGFsb25lIFB5dGhvbiBmaWxlcykgYXJlIGluY2x1ZGVkIGFzIHVzdWFsLgotIEluY2x1ZGUgbmV3IGNvbW1hbmQgInB5dGhvbiAtbSB3aGVlbCBpbnN0YWxsLXNjcmlwdHMgW2Rpc3RyaWJ1dGlvbgogIFtkaXN0cmlidXRpb24gLi4uXV0iIHRvIGluc3RhbGwgdGhlIGNvbnNvbGVfc2NyaXB0cyAoc2V0dXB0b29scy1zdHlsZQogIHNjcmlwdHMgdXNpbmcgcGtnX3Jlc291cmNlcykgZm9yIGEgZGlzdHJpYnV0aW9uLgoKMC4xOS4wCj09PT09PQotIHB5bWV0YS5qc29uIGJlY29tZXMgcHlkaXN0Lmpzb24KCjAuMTguMAo9PT09PT0KLSBQeXRob24gMyBVbmljb2RlIGltcHJvdmVtZW50cwoKMC4xNy4wCj09PT09PQotIFN1cHBvcnQgbGF0ZXN0IFBFUC00MjYgInB5bWV0YS5qc29uIiAoanNvbi1mb3JtYXQgbWV0YWRhdGEpCgowLjE2LjAKPT09PT09Ci0gUHl0aG9uIDIuNiBjb21wYXRpYmlsaXR5IGJ1Z2ZpeCAodGhhbmtzIEpvaG4gTWNGYXJsYW5lKQotIE5vbi1wcmVyZWxlYXNlIHZlcnNpb24gbnVtYmVyCgoxLjAuMGEyCj09PT09PT0KLSBCdWdmaXggZm9yIEMtZXh0ZW5zaW9uIHRhZ3MgZm9yIENQeXRob24gMy4zICh1c2luZyBTT0FCSSkKCjEuMC4wYTEKPT09PT09PQotIEJ1Z2ZpeCBmb3IgYmRpc3Rfd2luaW5zdCBjb252ZXJ0ZXIgIndoZWVsIGNvbnZlcnQiCi0gQnVnZml4IGZvciBkaXN0cyB3aGVyZSAiaXMgcHVyZSIgaXMgTm9uZSBpbnN0ZWFkIG9mIFRydWUgb3IgRmFsc2UKCjEuMC4wYTAKPT09PT09PQotIFVwZGF0ZSBmb3IgdmVyc2lvbiAxLjAgb2YgV2hlZWwgKFBFUCBhY2NlcHRlZCkuCi0gUHl0aG9uIDMgZml4IGZvciBtb3ZpbmcgVW5pY29kZSBEZXNjcmlwdGlvbiB0byBtZXRhZGF0YSBib2R5Ci0gSW5jbHVkZSBydWRpbWVudGFyeSBBUEkgZG9jdW1lbnRhdGlvbiBpbiBTcGhpbnggKHRoYW5rcyBLZXZpbiBIb3JuKQoKMC4xNS4wCj09PT09PQotIFZhcmlvdXMgaW1wcm92ZW1lbnRzCgowLjE0LjAKPT09PT09Ci0gQ2hhbmdlZCB0aGUgc2lnbmF0dXJlIGZvcm1hdCB0byBiZXR0ZXIgY29tcGx5IHdpdGggdGhlIGN1cnJlbnQgSldTIHNwZWMuCiAgQnJlYWtzIGFsbCBleGlzdGluZyBzaWduYXR1cmVzLgotIEluY2x1ZGUgYGB3aGVlbCB1bnNpZ25gYCBjb21tYW5kIHRvIHJlbW92ZSBSRUNPUkQuandzIGZyb20gYW4gYXJjaGl2ZS4KLSBQdXQgdGhlIGRlc2NyaXB0aW9uIGluIHRoZSBuZXdseSBhbGxvd2VkIHBheWxvYWQgc2VjdGlvbiBvZiBQS0ctSU5GTwogIChNRVRBREFUQSkgZmlsZXMuCgowLjEzLjAKPT09PT09Ci0gVXNlIGRpc3R1dGlscyBpbnN0ZWFkIG9mIHN5c2NvbmZpZyB0byBnZXQgaW5zdGFsbGF0aW9uIHBhdGhzOyBjYW4gaW5zdGFsbAogIGhlYWRlcnMuCi0gSW1wcm92ZSBXaGVlbEZpbGUoKSBzb3J0LgotIEFsbG93IGJvb3RzdHJhcCBpbnN0YWxscyB3aXRob3V0IGFueSBwa2dfcmVzb3VyY2VzLgoKMC4xMi4wCj09PT09PQotIFVuaXQgdGVzdCBmb3Igd2hlZWwudG9vbC5pbnN0YWxsCgowLjExLjAKPT09PT09Ci0gQVBJIGNsZWFudXAKCjAuMTAuMwo9PT09PT0KLSBTY3JpcHRzIGZpeGVyIGZpeAoKMC4xMC4yCj09PT09PQotIEZpeCBrZXlnZW4KCjAuMTAuMQo9PT09PT0KLSBQcmVzZXJ2ZSBhdHRyaWJ1dGVzIG9uIGluc3RhbGwuCgowLjEwLjAKPT09PT09Ci0gSW5jbHVkZSBhIGNvcHkgb2YgcGtnX3Jlc291cmNlcy4gV2hlZWwgY2FuIG5vdyBpbnN0YWxsIGludG8gYSB2aXJ0dWFsZW52CiAgdGhhdCBkb2VzIG5vdCBoYXZlIGRpc3RyaWJ1dGUgKHRob3VnaCBtb3N0IHBhY2thZ2VzIHN0aWxsIHJlcXVpcmUKICBwa2dfcmVzb3VyY2VzIHRvIGFjdHVhbGx5IHdvcms7IHdoZWVsIGluc3RhbGwgZGlzdHJpYnV0ZSkKLSBEZWZpbmUgYSBuZXcgc2V0dXAuY2ZnIHNlY3Rpb24gW3doZWVsXS4gdW5pdmVyc2FsPTEgd2lsbAogIGFwcGx5IHRoZSBweTIucHkzLW5vbmUtYW55IHRhZyBmb3IgcHVyZSBweXRob24gd2hlZWxzLgoKMC45LjcKPT09PT0KLSBPbmx5IGltcG9ydCBkaXJzcGVjIHdoZW4gbmVlZGVkLiBkaXJzcGVjIGlzIG9ubHkgbmVlZGVkIHRvIGZpbmQgdGhlCiAgY29uZmlndXJhdGlvbiBmb3Iga2V5Z2VuL3NpZ25pbmcgb3BlcmF0aW9ucy4KCjAuOS42Cj09PT09Ci0gcmVxdWlyZXMtZGlzdCBmcm9tIHNldHVwLmNmZyBvdmVyd3JpdGVzIGFueSByZXF1aXJlbWVudHMgZnJvbSBzZXR1cC5weQogIENhcmUgbXVzdCBiZSB0YWtlbiB0aGF0IHRoZSByZXF1aXJlbWVudHMgYXJlIHRoZSBzYW1lIGluIGJvdGggY2FzZXMsCiAgb3IganVzdCBhbHdheXMgaW5zdGFsbCBmcm9tIHdoZWVsLgotIGRyb3AgZGlyc3BlYyByZXF1aXJlbWVudCBvbiB3aW4zMgotIGltcHJvdmVkIGNvbW1hbmQgbGluZSB1dGlsaXR5LCBhZGRzICd3aGVlbCBjb252ZXJ0IFtlZ2cgb3Igd2luaW5zdF0nIHRvCiAgY29udmVydCBsZWdhY3kgYmluYXJ5IGZvcm1hdHMgdG8gd2hlZWwKCjAuOS41Cj09PT09Ci0gV2hlZWwncyBvd24gd2hlZWwgZmlsZSBjYW4gYmUgZXhlY3V0ZWQgYnkgUHl0aG9uLCBhbmQgY2FuIGluc3RhbGwgaXRzZWxmOgogIGBgcHl0aG9uIHdoZWVsLTAuOS41LXB5Mjctbm9uZS1hbnkvd2hlZWwgaW5zdGFsbCAuLi5gYAotIFVzZSBhcmdwYXJzZTsgYmFzaWMgYGB3aGVlbCBpbnN0YWxsYGAgY29tbWFuZCBzaG91bGQgcnVuIHdpdGggb25seSBzdGRsaWIKICBkZXBlbmRlbmNpZXMuCi0gQWxsb3cgcmVxdWlyZXNfZGlzdCBpbiBzZXR1cC5jZmcncyBbbWV0YWRhdGFdIHNlY3Rpb24uIEluIGFkZGl0aW9uIHRvCiAgZGVwZW5kZW5jaWVzIGluIHNldHVwLnB5LCBidXQgd2lsbCBvbmx5IGJlIGludGVycHJldGVkIHdoZW4gaW5zdGFsbGluZwogIGZyb20gd2hlZWwsIG5vdCBmcm9tIHNkaXN0LiBDYW4gYmUgcXVhbGlmaWVkIHdpdGggZW52aXJvbm1lbnQgbWFya2Vycy4KCjAuOS40Cj09PT09Ci0gRml4IHdoZWVsLnNpZ25hdHVyZXMgaW4gc2Rpc3QKCjAuOS4zCj09PT09Ci0gSW50ZWdyYXRlZCBkaWdpdGFsIHNpZ25hdHVyZXMgc3VwcG9ydCB3aXRob3V0IEMgZXh0ZW5zaW9ucy4KLSBJbnRlZ3JhdGVkICJ3aGVlbCBpbnN0YWxsIiBjb21tYW5kIChzaW5nbGUgcGFja2FnZSwgbm8gZGVwZW5kZW5jeQogIHJlc29sdXRpb24pIGluY2x1ZGluZyBjb21wYXRpYmlsaXR5IGNoZWNrLgotIFN1cHBvcnQgUHl0aG9uIDMuMwotIFVzZSBNZXRhZGF0YSAxLjMgKFBFUCA0MjYpCgowLjkuMgo9PT09PQotIEF1dG9tYXRpYyBzaWduaW5nIGlmIFdIRUVMX1RPT0wgcG9pbnRzIHRvIHRoZSB3aGVlbCBiaW5hcnkKLSBFdmVuIG1vcmUgUHl0aG9uIDMgZml4ZXMKCjAuOS4xCj09PT09Ci0gJ3doZWVsIHNpZ24nIHVzZXMgdGhlIGtleXMgZ2VuZXJhdGVkIGJ5ICd3aGVlbCBrZXlnZW4nIChpbnN0ZWFkIG9mIGdlbmVyYXRpbmcKICBhIG5ldyBrZXkgYXQgcmFuZG9tIGVhY2ggdGltZSkKLSBQeXRob24gMi8zIGVuY29kaW5nL2RlY29kaW5nIGZpeGVzCi0gUnVuIHRlc3RzIG9uIFB5dGhvbiAyLjYgKHdpdGhvdXQgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbikKCjAuOQo9PT0KLSBVcGRhdGVkIGRpZ2l0YWwgc2lnbmF0dXJlcyBzY2hlbWUKLSBQeXRob24gMyBzdXBwb3J0IGZvciBkaWdpdGFsIHNpZ25hdHVyZXMKLSBBbHdheXMgdmVyaWZ5IFJFQ09SRCBoYXNoZXMgb24gZXh0cmFjdAotICJ3aGVlbCIgY29tbWFuZCBsaW5lIHRvb2wgdG8gc2lnbiwgdmVyaWZ5LCB1bnBhY2sgd2hlZWwgZmlsZXMKCjAuOAo9PT0KLSBub25lL2FueSBkcmFmdCBwZXAgdGFncyB1cGRhdGUKLSBpbXByb3ZlZCB3aW5pbnN0MndoZWVsIHNjcmlwdAotIGRvYyBjaGFuZ2VzIGFuZCBvdGhlciBpbXByb3ZlbWVudHMKCjAuNwo9PT0KLSBzb3J0IC5kaXN0LWluZm8gYXQgZW5kIG9mIHdoZWVsIGFyY2hpdmUKLSBXaW5kb3dzICYgUHl0aG9uIDMgZml4ZXMgZnJvbSBQYXVsIE1vb3JlCi0gcGVwOAotIHNjcmlwdHMgdG8gY29udmVydCB3aW5pbnN0ICYgZWdnIHRvIHdoZWVsCgowLjYKPT09Ci0gcmVxdWlyZSBkaXN0cmlidXRlID49IDAuNi4yOAotIHN0b3AgdXNpbmcgdmVybGliCgowLjUKPT09Ci0gd29ya2luZyBwcmV0dHkgd2VsbAoKMC40LjIKPT09PT0KLSBoeXBoZW5hdGVkIG5hbWUgZml4CgowLjQKPT09Ci0gaW1wcm92ZSB0ZXN0IGNvdmVyYWdlCi0gaW1wcm92ZSBXaW5kb3dzIGNvbXBhdGliaWxpdHkKLSBpbmNsdWRlIHRveC5pbmkgY291cnRlc3kgb2YgTWFyYyBBYnJhbW93aXR6Ci0gZHJhZnQgaG1hYyBzaGEtMjU2IHNpZ25pbmcgZnVuY3Rpb24KCjAuMwo9PT0KLSBwcm90b3R5cGUgZWdnMndoZWVsIGNvbnZlcnNpb24gc2NyaXB0CgowLjIKPT09Ci0gUHl0aG9uIDMgY29tcGF0aWJpbGl0eQoKMC4xCj09PQotIEluaXRpYWwgdmVyc2lvbgoKClBLAwQUAAAAAAAAACEApw+7Fp0PAACdDwAAQQAAAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC0wLjMwLjBhMC5kaXN0LWluZm8vUkVDT1JEd2hlZWwvX19pbml0X18ucHksc2hhMjU2PWRtYm9VRGZwYld4ZXJjVlhiYlFFTHNUMUw0WlF5T0hRdkpLanZjQUtZdGMsOTkNCndoZWVsL19fbWFpbl9fLnB5LHNoYTI1Nj1MYkRER0lkMDhxVHh1aExZcVg1bVhPMU1VczlELUhoeGI1TlZjNTNlajBrLDQxNg0Kd2hlZWwvYXJjaGl2ZS5weSxzaGEyNTY9TzZ1WGsteko4eTRZLTByQ29IUDdDTEtsUHBXUUJINDR6ZVJlZ2FLOEZKbywyMjQ3DQp3aGVlbC9iZGlzdF93aGVlbC5weSxzaGEyNTY9dXNkRmtadlFvcEstU3hfM2wwVEVNMlptMzNCdzFDX29iVElVejdKTTdwSSwxODQwOA0Kd2hlZWwvZGVjb3JhdG9yLnB5LHNoYTI1Nj1VMks3N1paOHgzeDV2U0lHQ2NFZWg4R0F4QjZyQUJCN0FsRHdSdWthb0NrLDU0MQ0Kd2hlZWwvZWdnMndoZWVsLnB5LHNoYTI1Nj0tN00ySkZpMjNrWi1raGJOd2sxaVZMOFAxNE5GZGJBaE1jMVNIaG5aMmZBLDMwMjcNCndoZWVsL2VnZ25hbWVzLnR4dCxzaGEyNTY9WDZMWXNPak1kOGxscnpMbzNTQjNGd0otdU45SXNrSnFZS0pEcTJ6SWNicywyNDkwDQp3aGVlbC9pbnN0YWxsLnB5LHNoYTI1Nj1kQ1I3SUhtZUFyTGpnYjB5RjlZbU1oM19xSWotQzlqMXAzdVBTcnB6Wk84LDE4MDk4DQp3aGVlbC9tZXRhZGF0YS5weSxzaGEyNTY9T3o4eDJWRDB4TGJhV0gwNnlUUkNiM3ZTZFduV3ZwUE93WTJvOUQ4aUZHVSwxMTY3Ng0Kd2hlZWwvcGF0aHMucHksc2hhMjU2PTZBbUctTUt4LU5lSk9DOXpVSm9TU1pqWWhaWUdtWDFVSEdfTjBJYmtwbEksMTEzMA0Kd2hlZWwvcGVwNDI1dGFncy5weSxzaGEyNTY9cEExZXliMUhPQW13U2lYVG1mUWhtQWNrZmtuaHRFZWxMRFpPY1ZLWmFFMCw1ODI5DQp3aGVlbC9wa2dpbmZvLnB5LHNoYTI1Nj0tZ0xPVHVRcmtSZjRnZU9EMDRxbTBJVWtkWUFiamc4MWotNXpOdHZXQTlBLDEyMjUNCndoZWVsL3V0aWwucHksc2hhMjU2PVBlMkpaOWdyTmptQWNSUkpheTIwRmxEVkpVYmVQV2FSNWx0eVNvM2M2elEsNDg5MA0Kd2hlZWwvd2luaW5zdDJ3aGVlbC5weSxzaGEyNTY9eFZmRUVLYlM0aE1wdi13Z09RaWI0bjBwU3BncnBqbnJCREgySkRTTmNyRSw3ODYzDQp3aGVlbC9zaWduYXR1cmVzL19faW5pdF9fLnB5LHNoYTI1Nj1rWnBLTnNteEJEWmh1WGY4NV91eXk1cUJINDBBeFZUXzB1dGJBaVRwX3lnLDM3NzkNCndoZWVsL3NpZ25hdHVyZXMvZGpiZWMucHksc2hhMjU2PTUzSFRubE5sZnFPSEZEZjhPWV82S0w4c3hSNHN3aUxzV2hVanR3M1czbkksNjc1NQ0Kd2hlZWwvc2lnbmF0dXJlcy9lZDI1NTE5cHkucHksc2hhMjU2PVNlVHhpTVo3a21vTWRJdXJCU2FLYjhLdS1hbUduZjZaVFJHRWxMelY4aUksMTY5NQ0Kd2hlZWwvc2lnbmF0dXJlcy9rZXlzLnB5LHNoYTI1Nj1ROEZMVnk1ZGl4RGl5LTVvX1JtbHNEaGdZZEVyVENwNWMzWjh4NzBYMXNnLDMzMTYNCndoZWVsL3Rlc3QvX19pbml0X18ucHksc2hhMjU2PU0wTlp1UTctMTEybDhLMmgxZWF5VnZTbXZRcnVmck9jRDVBWUtnSWZfSXMsMQ0Kd2hlZWwvdGVzdC9jb25mdGVzdC5weSxzaGEyNTY9Uzczbkh0b3RScjZfT0dCWG1lV1BWZGpWbVZLWmF6NHVpNExQWWQwYVA5VSwxNjg5DQp3aGVlbC90ZXN0L3B5ZGlzdC1zY2hlbWEuanNvbixzaGEyNTY9eW5Fdk52VGhDMXpSYTdGaW9Nc1czay05bmw5OHl0RW9vMV8zeGJPUDJlbywxMTQ4Mw0Kd2hlZWwvdGVzdC90ZXN0LTEuMC1weTIucHkzLW5vbmUtd2luMzIud2hsLHNoYTI1Nj1KQ19VWFRONUtsTHJkdTQzdUg0Y2FaU1V5enJ0UGNVc1JlLXZUTXVucGxFLDUyMjYNCndoZWVsL3Rlc3QvdGVzdF9iYXNpYy5weSxzaGEyNTY9YTF1UnU0TVpQYkVFS3lVc0tZdkd0ejRxajRLWDNFNzdWNkptWEpMZFgtayw2NTA5DQp3aGVlbC90ZXN0L3Rlc3RfaW5zdGFsbC5weSxzaGEyNTY9YzBFRUNYUGtWSUdoQ0Q5VjVhZDJxc0JQUlBZYjFlaGhhUzBrNkd2NUpRYywxODY2DQp3aGVlbC90ZXN0L3Rlc3Rfa2V5cy5weSxzaGEyNTY9NW1CYzl0ZjJUd0MzVENweDF5U1RZc0NlNXl2ZDZrTUs2NEFsVVVDY0tFWSwyNTc1DQp3aGVlbC90ZXN0L3Rlc3RfcGF0aHMucHksc2hhMjU2PS1RT1ZVREZKSXBGOU9QTlJ6Q0otWGY0bkJpYktsVWVfZzRhYVo2c20zd0UsMTcyDQp3aGVlbC90ZXN0L3Rlc3RfcmFua2luZy5weSxzaGEyNTY9RlNBUVg0b0haNDc2akxkZHFWTWxHbVFGdGJFZWw5YThTek9uZ0owM1RKdywxNDk2DQp3aGVlbC90ZXN0L3Rlc3Rfc2lnbmF0dXJlcy5weSxzaGEyNTY9WjRSRVhqNjJwMjhnYlNEQjJEX094b3BBLVRUWElDVFo1ZTJ5WjNlakVWYywxMTIwDQp3aGVlbC90ZXN0L3Rlc3RfdGFnb3B0LnB5LHNoYTI1Nj10N0EtaVJiZTNiSDJJejZOS2RTRU9wRkZJRlNGOUk0QVRtbHJSQlhvQ2NRLDU5MjcNCndoZWVsL3Rlc3QvdGVzdF90b29sLnB5LHNoYTI1Nj15dDVkQXI4bXA1MVdvRHp0ME1tbHdQazB4ZjdGdlhBZWR5LVlsTlpYdjFJLDY1Ng0Kd2hlZWwvdGVzdC90ZXN0X3doZWVsZmlsZS5weSxzaGEyNTY9eDRleHpRWXVRQjQ4WUhxaFUyTlp5Tjc2ay1CU0s2Nzg0LTdyeWUwcTZTcyw0NTg1DQp3aGVlbC90ZXN0L2NvbXBsZXgtZGlzdC9zZXR1cC5weSxzaGEyNTY9NGkxX0FKb0p4bzRpNmlrLW12eWRvMjNBRjhCSHpqbUFFUVlhNUo0WVBLNCw4NTUNCndoZWVsL3Rlc3QvY29tcGxleC1kaXN0L2NvbXBsZXhkaXN0L19faW5pdF9fLnB5LHNoYTI1Nj1QR0RKV1FUeGpMWHFuTnJicW1US0tfeWs2RFZRQk5lUnAtWXBQN3cxclZrLDIzDQp3aGVlbC90ZXN0L2V4dGVuc2lvbi5kaXN0L3NldHVwLnB5LHNoYTI1Nj1wZFJsLXd2cTVPVk1HMDQzWHJXWnd6NGZpdkZaV2RXTU53TDhkeUtiVDBjLDQ1Ng0Kd2hlZWwvdGVzdC9oZWFkZXJzLmRpc3QvaGVhZGVyLmgsc2hhMjU2PTQ3REVRcGo4SEJTYS1fVEltVy01SkNldVFlUmttNU5NcEpXWkczaFN1RlUsMA0Kd2hlZWwvdGVzdC9oZWFkZXJzLmRpc3QvaGVhZGVyc2Rpc3QucHksc2hhMjU2PTQ3REVRcGo4SEJTYS1fVEltVy01SkNldVFlUmttNU5NcEpXWkczaFN1RlUsMA0Kd2hlZWwvdGVzdC9oZWFkZXJzLmRpc3Qvc2V0dXAucHksc2hhMjU2PXAzZDlUR3k3TkxYNlRua0JIbk5IemVkcVlvT2tkR1F2d2hleURRamYtSlEsMzI0DQp3aGVlbC90ZXN0L3NpbXBsZS5kaXN0L3NldHVwLnB5LHNoYTI1Nj04eldlbjcxVW0taU5fQTV0aG90NlZGb2dya1dzX1JHVk8tanJfTXhrRm9nLDM4Mw0Kd2hlZWwvdGVzdC9zaW1wbGUuZGlzdC9zaW1wbGVkaXN0L19faW5pdF9fLnB5LHNoYTI1Nj00N0RFUXBqOEhCU2EtX1RJbVctNUpDZXVRZVJrbTVOTXBKV1pHM2hTdUZVLDANCndoZWVsL3Rvb2wvX19pbml0X18ucHksc2hhMjU2PXAwdW5sOU1ncmJrWllWT0RWeEVLTVdSSTlZYTFNX3VYY3FYblhIekk0RGssMTMyMTcNCndoZWVsLTAuMzAuMGEwLmRpc3QtaW5mby9ERVNDUklQVElPTi5yc3Qsc2hhMjU2PUpINm1vZ1VJYXRRVlFld0loNEdCMXl3Q3h1V2JtN0c0VGpJXzYzZFVScDgsOTgxMw0Kd2hlZWwtMC4zMC4wYTAuZGlzdC1pbmZvL0xJQ0VOU0UudHh0LHNoYTI1Nj16S25pREdyeF9QdjJsQWp6ZDNhU2hzdnV2TjdUTmhBTW0wb19OZnZtTmVRLDExMjUNCndoZWVsLTAuMzAuMGEwLmRpc3QtaW5mby9NRVRBREFUQSxzaGEyNTY9aXg5ek41ZmE0amVPRFFybjY0ZlVBUWFfdWxybVJwaGk0U0tIQVlVcXROdywxMTAyMQ0Kd2hlZWwtMC4zMC4wYTAuZGlzdC1pbmZvL1JFQ09SRCwsDQp3aGVlbC0wLjMwLjBhMC5kaXN0LWluZm8vV0hFRUwsc2hhMjU2PTV3dmZCN0d2Z1pBYktCU0U5dVg5WmJpNkxDTC1fS2dlemdIYmxYaENSbk0sMTEzDQp3aGVlbC0wLjMwLjBhMC5kaXN0LWluZm8vZW50cnlfcG9pbnRzLnR4dCxzaGEyNTY9cFR5ZUdWc3VjeWZyX0JYZTVPUUt1QTFCcDVZS2FJQVd5NXBlamtxNFF4MCwxMDkNCndoZWVsLTAuMzAuMGEwLmRpc3QtaW5mby9tZXRhZGF0YS5qc29uLHNoYTI1Nj14X21aakx6T2FZY2V6bW5yU3ZHNjdkMDdTaHBjUkZkcmdXZVVlNnpwTDVZLDE2MjYNCndoZWVsLTAuMzAuMGEwLmRpc3QtaW5mby90b3BfbGV2ZWwudHh0LHNoYTI1Nj1IeFNCSWJnRXN0TVBlNGVGYXdoQTY2TXEtUVlITW9wWFZvQW5jZmpiXzFjLDYNClBLAwQUAAAAAAAAACEAlN+We3EAAABxAAAAQAAAAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC0wLjMwLjBhMC5kaXN0LWluZm8vV0hFRUxXaGVlbC1WZXJzaW9uOiAxLjAKR2VuZXJhdG9yOiBiZGlzdF93aGVlbCAoMC4zMC4wLmEwKQpSb290LUlzLVB1cmVsaWI6IHRydWUKVGFnOiBweTItbm9uZS1hbnkKVGFnOiBweTMtbm9uZS1hbnkKClBLAwQUAAAAAAAAACEA4kXfrG0AAABtAAAASwAAAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC0wLjMwLjBhMC5kaXN0LWluZm8vZW50cnlfcG9pbnRzLnR4dFtjb25zb2xlX3NjcmlwdHNdCndoZWVsID0gd2hlZWwudG9vbDptYWluCgpbZGlzdHV0aWxzLmNvbW1hbmRzXQpiZGlzdF93aGVlbCA9IHdoZWVsLmJkaXN0X3doZWVsOmJkaXN0X3doZWVsCgpQSwMEFAAAAAAAAAAhAFKyTtZaBgAAWgYAAEgAAABwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwtMC4zMC4wYTAuZGlzdC1pbmZvL21ldGFkYXRhLmpzb257ImNsYXNzaWZpZXJzIjogWyJEZXZlbG9wbWVudCBTdGF0dXMgOjogNCAtIEJldGEiLCAiSW50ZW5kZWQgQXVkaWVuY2UgOjogRGV2ZWxvcGVycyIsICJQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24iLCAiUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDIiLCAiUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDIuNiIsICJQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMi43IiwgIlByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzIiwgIlByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzLjIiLCAiUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMuMyIsICJQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMy40Il0sICJleHRlbnNpb25zIjogeyJweXRob24uY29tbWFuZHMiOiB7IndyYXBfY29uc29sZSI6IHsid2hlZWwiOiAid2hlZWwudG9vbDptYWluIn19LCAicHl0aG9uLmRldGFpbHMiOiB7ImNvbnRhY3RzIjogW3siZW1haWwiOiAiZGhvbHRoQGZhc3RtYWlsLmZtIiwgIm5hbWUiOiAiRGFuaWVsIEhvbHRoIiwgInJvbGUiOiAiYXV0aG9yIn1dLCAiZG9jdW1lbnRfbmFtZXMiOiB7ImRlc2NyaXB0aW9uIjogIkRFU0NSSVBUSU9OLnJzdCIsICJsaWNlbnNlIjogIkxJQ0VOU0UudHh0In0sICJwcm9qZWN0X3VybHMiOiB7IkhvbWUiOiAiaHR0cHM6Ly9iaXRidWNrZXQub3JnL3B5cGEvd2hlZWwvIn19LCAicHl0aG9uLmV4cG9ydHMiOiB7ImNvbnNvbGVfc2NyaXB0cyI6IHsid2hlZWwiOiAid2hlZWwudG9vbDptYWluIn0sICJkaXN0dXRpbHMuY29tbWFuZHMiOiB7ImJkaXN0X3doZWVsIjogIndoZWVsLmJkaXN0X3doZWVsOmJkaXN0X3doZWVsIn19fSwgImV4dHJhcyI6IFsiZmFzdGVyLXNpZ25hdHVyZXMiLCAic2lnbmF0dXJlcyIsICJ0b29sIl0sICJnZW5lcmF0b3IiOiAiYmRpc3Rfd2hlZWwgKDAuMzAuMC5hMCkiLCAia2V5d29yZHMiOiBbIndoZWVsIiwgInBhY2thZ2luZyJdLCAibGljZW5zZSI6ICJNSVQiLCAibWV0YWRhdGFfdmVyc2lvbiI6ICIyLjAiLCAibmFtZSI6ICJ3aGVlbCIsICJydW5fcmVxdWlyZXMiOiBbeyJleHRyYSI6ICJmYXN0ZXItc2lnbmF0dXJlcyIsICJyZXF1aXJlcyI6IFsiZWQyNTUxOWxsIl19LCB7ImV4dHJhIjogInNpZ25hdHVyZXMiLCAicmVxdWlyZXMiOiBbImtleXJpbmciLCAia2V5cmluZ3MuYWx0Il19LCB7ImVudmlyb25tZW50IjogInB5dGhvbl92ZXJzaW9uPT1cIjIuNlwiIiwgInJlcXVpcmVzIjogWyJhcmdwYXJzZSJdfSwgeyJlbnZpcm9ubWVudCI6ICJweXRob25fdmVyc2lvbj09XCIyLjZcIiIsICJleHRyYSI6ICJzaWduYXR1cmVzIiwgInJlcXVpcmVzIjogWyJpbXBvcnRsaWIiXX0sIHsiZW52aXJvbm1lbnQiOiAic3lzX3BsYXRmb3JtIT1cIndpbjMyXCIiLCAiZXh0cmEiOiAic2lnbmF0dXJlcyIsICJyZXF1aXJlcyI6IFsicHl4ZGciXX1dLCAic3VtbWFyeSI6ICJBIGJ1aWx0LXBhY2thZ2UgZm9ybWF0IGZvciBQeXRob24uIiwgInRlc3RfcmVxdWlyZXMiOiBbeyJyZXF1aXJlcyI6IFsiY292ZXJhZ2UiLCAianNvbnNjaGVtYSIsICJweXRlc3QiLCAicHl0ZXN0LWNvdiJdfV0sICJ2ZXJzaW9uIjogIjAuMzAuMGEwIn1QSwMEFAAAAAAAAAAhABlj3mUGAAAABgAAAEgAAABwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwtMC4zMC4wYTAuZGlzdC1pbmZvL3RvcF9sZXZlbC50eHR3aGVlbApQSwMEFAAAAAAAAAAhAGE3pUdjAAAAYwAAADMAAABwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvX19pbml0X18ucHkjIF9fdmFyaWFibGVzX18gd2l0aCBkb3VibGUtcXVvdGVkIHZhbHVlcyB3aWxsIGJlIGF2YWlsYWJsZSBpbiBzZXR1cC5weToKX192ZXJzaW9uX18gPSAiMC4zMC4wLmEwIgpQSwMEFAAAAAAAAAAhACRpt1SgAQAAoAEAADMAAABwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvX19tYWluX18ucHkiIiIKV2hlZWwgY29tbWFuZCBsaW5lIHRvb2wgKGVuYWJsZSBweXRob24gLW0gd2hlZWwgc3ludGF4KQoiIiIKCmltcG9ydCBzeXMKCmRlZiBtYWluKCk6ICMgbmVlZGVkIGZvciBjb25zb2xlIHNjcmlwdAogICAgaWYgX19wYWNrYWdlX18gPT0gJyc6CiAgICAgICAgIyBUbyBiZSBhYmxlIHRvIHJ1biAncHl0aG9uIHdoZWVsLTAuOS53aGwvd2hlZWwnOgogICAgICAgIGltcG9ydCBvcy5wYXRoCiAgICAgICAgcGF0aCA9IG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pKQogICAgICAgIHN5cy5wYXRoWzA6MF0gPSBbcGF0aF0KICAgIGltcG9ydCB3aGVlbC50b29sCiAgICBzeXMuZXhpdCh3aGVlbC50b29sLm1haW4oKSkKCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICBzeXMuZXhpdChtYWluKCkpClBLAwQUAAAAAAAAACEAIFOCUscIAADHCAAAMgAAAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC9hcmNoaXZlLnB5IiIiCkFyY2hpdmUgdG9vbHMgZm9yIHdoZWVsLgoiIiIKCmltcG9ydCBvcwppbXBvcnQgdGltZQppbXBvcnQgbG9nZ2luZwppbXBvcnQgb3MucGF0aAppbXBvcnQgemlwZmlsZQoKbG9nID0gbG9nZ2luZy5nZXRMb2dnZXIoIndoZWVsIikKCgpkZWYgYXJjaGl2ZV93aGVlbGZpbGUoYmFzZV9uYW1lLCBiYXNlX2Rpcik6CiAgICAnJydBcmNoaXZlIGFsbCBmaWxlcyB1bmRlciBgYmFzZV9kaXJgIGluIGEgd2hsIGZpbGUgYW5kIG5hbWUgaXQgbGlrZQogICAgYGJhc2VfbmFtZWAuCiAgICAnJycKICAgIG9sZGRpciA9IG9zLnBhdGguYWJzcGF0aChvcy5jdXJkaXIpCiAgICBiYXNlX25hbWUgPSBvcy5wYXRoLmFic3BhdGgoYmFzZV9uYW1lKQogICAgdHJ5OgogICAgICAgIG9zLmNoZGlyKGJhc2VfZGlyKQogICAgICAgIHJldHVybiBtYWtlX3doZWVsZmlsZV9pbm5lcihiYXNlX25hbWUpCiAgICBmaW5hbGx5OgogICAgICAgIG9zLmNoZGlyKG9sZGRpcikKCgpkZWYgbWFrZV93aGVlbGZpbGVfaW5uZXIoYmFzZV9uYW1lLCBiYXNlX2Rpcj0nLicpOgogICAgIiIiQ3JlYXRlIGEgd2hsIGZpbGUgZnJvbSBhbGwgdGhlIGZpbGVzIHVuZGVyICdiYXNlX2RpcicuCgogICAgUGxhY2VzIC5kaXN0LWluZm8gYXQgdGhlIGVuZCBvZiB0aGUgYXJjaGl2ZS4iIiIKCiAgICB6aXBfZmlsZW5hbWUgPSBiYXNlX25hbWUgKyAiLndobCIKCiAgICBsb2cuaW5mbygiY3JlYXRpbmcgJyVzJyBhbmQgYWRkaW5nICclcycgdG8gaXQiLCB6aXBfZmlsZW5hbWUsIGJhc2VfZGlyKQoKICAgICMgU29tZSBhcHBsaWNhdGlvbnMgbmVlZCByZXByb2R1Y2libGUgLndobCBmaWxlcywgYnV0IHRoZXkgY2FuJ3QgZG8gdGhpcwogICAgIyB3aXRob3V0IGZvcmNpbmcgdGhlIHRpbWVzdGFtcCBvZiB0aGUgaW5kaXZpZHVhbCBaaXBJbmZvIG9iamVjdHMuICBTZWUKICAgICMgaXNzdWUgIzE0My4KICAgIHRpbWVzdGFtcCA9IG9zLmVudmlyb24uZ2V0KCdTT1VSQ0VfREFURV9FUE9DSCcpCiAgICBpZiB0aW1lc3RhbXAgaXMgTm9uZToKICAgICAgICBkYXRlX3RpbWUgPSBOb25lCiAgICBlbHNlOgogICAgICAgIGRhdGVfdGltZSA9IHRpbWUuZ210aW1lKGludCh0aW1lc3RhbXApKVswOjZdCgogICAgIyBYWFggc3VwcG9ydCBiejIsIHh6IHdoZW4gYXZhaWxhYmxlCiAgICB6aXAgPSB6aXBmaWxlLlppcEZpbGUoemlwX2ZpbGVuYW1lLCAidyIsIGNvbXByZXNzaW9uPXppcGZpbGUuWklQX0RFRkxBVEVEKQoKICAgIHNjb3JlID0geydXSEVFTCc6IDEsICdNRVRBREFUQSc6IDIsICdSRUNPUkQnOiAzfQogICAgZGVmZXJyZWQgPSBbXQoKICAgIGRlZiB3cml0ZWZpbGUocGF0aCwgZGF0ZV90aW1lKToKICAgICAgICBzdCA9IG9zLnN0YXQocGF0aCkKICAgICAgICBpZiBkYXRlX3RpbWUgaXMgTm9uZToKICAgICAgICAgICAgbXRpbWUgPSB0aW1lLmdtdGltZShzdC5zdF9tdGltZSkKICAgICAgICAgICAgZGF0ZV90aW1lID0gbXRpbWVbMDo2XQogICAgICAgIHppbmZvID0gemlwZmlsZS5aaXBJbmZvKHBhdGgsIGRhdGVfdGltZSkKICAgICAgICB6aW5mby5leHRlcm5hbF9hdHRyID0gc3Quc3RfbW9kZSA8PCAxNgogICAgICAgIHppbmZvLmNvbXByZXNzX3R5cGUgPSB6aXBmaWxlLlpJUF9ERUZMQVRFRAogICAgICAgIHdpdGggb3BlbihwYXRoLCAncmInKSBhcyBmcDoKICAgICAgICAgICAgemlwLndyaXRlc3RyKHppbmZvLCBmcC5yZWFkKCkpCiAgICAgICAgbG9nLmluZm8oImFkZGluZyAnJXMnIiAlIHBhdGgpCgogICAgZm9yIGRpcnBhdGgsIGRpcm5hbWVzLCBmaWxlbmFtZXMgaW4gb3Mud2FsayhiYXNlX2Rpcik6CiAgICAgICAgZm9yIG5hbWUgaW4gZmlsZW5hbWVzOgogICAgICAgICAgICBwYXRoID0gb3MucGF0aC5ub3JtcGF0aChvcy5wYXRoLmpvaW4oZGlycGF0aCwgbmFtZSkpCgogICAgICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShwYXRoKToKICAgICAgICAgICAgICAgIGlmIGRpcnBhdGguZW5kc3dpdGgoJy5kaXN0LWluZm8nKToKICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5hcHBlbmQoKHNjb3JlLmdldChuYW1lLCAwKSwgcGF0aCkpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHdyaXRlZmlsZShwYXRoLCBkYXRlX3RpbWUpCgogICAgZGVmZXJyZWQuc29ydCgpCiAgICBmb3Igc2NvcmUsIHBhdGggaW4gZGVmZXJyZWQ6CiAgICAgICAgd3JpdGVmaWxlKHBhdGgsIGRhdGVfdGltZSkKCiAgICB6aXAuY2xvc2UoKQoKICAgIHJldHVybiB6aXBfZmlsZW5hbWUKUEsDBBQAAAAAAAAAIQBKryTR6EcAAOhHAAA2AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL2JkaXN0X3doZWVsLnB5IiIiCkNyZWF0ZSBhIHdoZWVsICgud2hsKSBkaXN0cmlidXRpb24uCgpBIHdoZWVsIGlzIGEgYnVpbHQgYXJjaGl2ZSBmb3JtYXQuCiIiIgoKaW1wb3J0IGNzdgppbXBvcnQgaGFzaGxpYgppbXBvcnQgb3MKaW1wb3J0IHN1YnByb2Nlc3MKaW1wb3J0IHdhcm5pbmdzCmltcG9ydCBzaHV0aWwKaW1wb3J0IGpzb24KaW1wb3J0IHN5cwppbXBvcnQgcmUKCnRyeToKICAgIGltcG9ydCBzeXNjb25maWcKZXhjZXB0IEltcG9ydEVycm9yOiAgIyBwcmFnbWEgbm9jb3ZlcgogICAgIyBQeXRob24gPCAyLjcKICAgIGltcG9ydCBkaXN0dXRpbHMuc3lzY29uZmlnIGFzIHN5c2NvbmZpZwoKaW1wb3J0IHBrZ19yZXNvdXJjZXMKCnNhZmVfbmFtZSA9IHBrZ19yZXNvdXJjZXMuc2FmZV9uYW1lCnNhZmVfdmVyc2lvbiA9IHBrZ19yZXNvdXJjZXMuc2FmZV92ZXJzaW9uCgpmcm9tIHNodXRpbCBpbXBvcnQgcm10cmVlCmZyb20gZW1haWwuZ2VuZXJhdG9yIGltcG9ydCBHZW5lcmF0b3IKCmZyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IENvbW1hbmQKZnJvbSBkaXN0dXRpbHMuc3lzY29uZmlnIGltcG9ydCBnZXRfcHl0aG9uX3ZlcnNpb24KCmZyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cgYXMgbG9nZ2VyCgpmcm9tIC5wZXA0MjV0YWdzIGltcG9ydCBnZXRfYWJicl9pbXBsLCBnZXRfaW1wbF92ZXIsIGdldF9hYmlfdGFnLCBnZXRfcGxhdGZvcm0KZnJvbSAudXRpbCBpbXBvcnQgbmF0aXZlLCBvcGVuX2Zvcl9jc3YKZnJvbSAuYXJjaGl2ZSBpbXBvcnQgYXJjaGl2ZV93aGVlbGZpbGUKZnJvbSAucGtnaW5mbyBpbXBvcnQgcmVhZF9wa2dfaW5mbywgd3JpdGVfcGtnX2luZm8KZnJvbSAubWV0YWRhdGEgaW1wb3J0IHBrZ2luZm9fdG9fZGljdApmcm9tIC4gaW1wb3J0IHBlcDQyNXRhZ3MsIG1ldGFkYXRhCmZyb20gLiBpbXBvcnQgX192ZXJzaW9uX18gYXMgd2hlZWxfdmVyc2lvbgoKUFlfTElNSVRFRF9BUElfUEFUVEVSTiA9IHInY3AzXGQnCgpkZWYgc2FmZXJfbmFtZShuYW1lKToKICAgIHJldHVybiBzYWZlX25hbWUobmFtZSkucmVwbGFjZSgnLScsICdfJykKCmRlZiBzYWZlcl92ZXJzaW9uKHZlcnNpb24pOgogICAgcmV0dXJuIHNhZmVfdmVyc2lvbih2ZXJzaW9uKS5yZXBsYWNlKCctJywgJ18nKQoKY2xhc3MgYmRpc3Rfd2hlZWwoQ29tbWFuZCk6CgogICAgZGVzY3JpcHRpb24gPSAnY3JlYXRlIGEgd2hlZWwgZGlzdHJpYnV0aW9uJwoKICAgIHVzZXJfb3B0aW9ucyA9IFsoJ2JkaXN0LWRpcj0nLCAnYicsCiAgICAgICAgICAgICAgICAgICAgICJ0ZW1wb3JhcnkgZGlyZWN0b3J5IGZvciBjcmVhdGluZyB0aGUgZGlzdHJpYnV0aW9uIiksCiAgICAgICAgICAgICAgICAgICAgKCdwbGF0LW5hbWU9JywgJ3AnLAogICAgICAgICAgICAgICAgICAgICAicGxhdGZvcm0gbmFtZSB0byBlbWJlZCBpbiBnZW5lcmF0ZWQgZmlsZW5hbWVzICIKICAgICAgICAgICAgICAgICAgICAgIihkZWZhdWx0OiAlcykiICUgZ2V0X3BsYXRmb3JtKCkpLAogICAgICAgICAgICAgICAgICAgICgna2VlcC10ZW1wJywgJ2snLAogICAgICAgICAgICAgICAgICAgICAia2VlcCB0aGUgcHNldWRvLWluc3RhbGxhdGlvbiB0cmVlIGFyb3VuZCBhZnRlciAiICsKICAgICAgICAgICAgICAgICAgICAgImNyZWF0aW5nIHRoZSBkaXN0cmlidXRpb24gYXJjaGl2ZSIpLAogICAgICAgICAgICAgICAgICAgICgnZGlzdC1kaXI9JywgJ2QnLAogICAgICAgICAgICAgICAgICAgICAiZGlyZWN0b3J5IHRvIHB1dCBmaW5hbCBidWlsdCBkaXN0cmlidXRpb25zIGluIiksCiAgICAgICAgICAgICAgICAgICAgKCdza2lwLWJ1aWxkJywgTm9uZSwKICAgICAgICAgICAgICAgICAgICAgInNraXAgcmVidWlsZGluZyBldmVyeXRoaW5nIChmb3IgdGVzdGluZy9kZWJ1Z2dpbmcpIiksCiAgICAgICAgICAgICAgICAgICAgKCdyZWxhdGl2ZScsIE5vbmUsCiAgICAgICAgICAgICAgICAgICAgICJidWlsZCB0aGUgYXJjaGl2ZSB1c2luZyByZWxhdGl2ZSBwYXRocyIKICAgICAgICAgICAgICAgICAgICAgIihkZWZhdWx0OiBmYWxzZSkiKSwKICAgICAgICAgICAgICAgICAgICAoJ293bmVyPScsICd1JywKICAgICAgICAgICAgICAgICAgICAgIk93bmVyIG5hbWUgdXNlZCB3aGVuIGNyZWF0aW5nIGEgdGFyIGZpbGUiCiAgICAgICAgICAgICAgICAgICAgICIgW2RlZmF1bHQ6IGN1cnJlbnQgdXNlcl0iKSwKICAgICAgICAgICAgICAgICAgICAoJ2dyb3VwPScsICdnJywKICAgICAgICAgICAgICAgICAgICAgIkdyb3VwIG5hbWUgdXNlZCB3aGVuIGNyZWF0aW5nIGEgdGFyIGZpbGUiCiAgICAgICAgICAgICAgICAgICAgICIgW2RlZmF1bHQ6IGN1cnJlbnQgZ3JvdXBdIiksCiAgICAgICAgICAgICAgICAgICAgKCd1bml2ZXJzYWwnLCBOb25lLAogICAgICAgICAgICAgICAgICAgICAibWFrZSBhIHVuaXZlcnNhbCB3aGVlbCIKICAgICAgICAgICAgICAgICAgICAgIiAoZGVmYXVsdDogZmFsc2UpIiksCiAgICAgICAgICAgICAgICAgICAgKCdweXRob24tdGFnPScsIE5vbmUsCiAgICAgICAgICAgICAgICAgICAgICJQeXRob24gaW1wbGVtZW50YXRpb24gY29tcGF0aWJpbGl0eSB0YWciCiAgICAgICAgICAgICAgICAgICAgICIgKGRlZmF1bHQ6IHB5JXMpIiAlIGdldF9pbXBsX3ZlcigpWzBdKSwKICAgICAgICAgICAgICAgICAgICAoJ3B5LWxpbWl0ZWQtYXBpPScsIE5vbmUsCiAgICAgICAgICAgICAgICAgICAgICJQeXRob24gdGFnIChjcDMyfGNwMzN8Y3BOTikgZm9yIGFiaTMgd2hlZWwgdGFnIgogICAgICAgICAgICAgICAgICAgICAiIChkZWZhdWx0OiBmYWxzZSkiKSwKICAgICAgICAgICAgICAgICAgICBdCgogICAgYm9vbGVhbl9vcHRpb25zID0gWydrZWVwLXRlbXAnLCAnc2tpcC1idWlsZCcsICdyZWxhdGl2ZScsICd1bml2ZXJzYWwnXQoKICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgc2VsZi5iZGlzdF9kaXIgPSBOb25lCiAgICAgICAgc2VsZi5kYXRhX2RpciA9IE5vbmUKICAgICAgICBzZWxmLnBsYXRfbmFtZSA9IE5vbmUKICAgICAgICBzZWxmLnBsYXRfdGFnID0gTm9uZQogICAgICAgIHNlbGYuZm9ybWF0ID0gJ3ppcCcKICAgICAgICBzZWxmLmtlZXBfdGVtcCA9IEZhbHNlCiAgICAgICAgc2VsZi5kaXN0X2RpciA9IE5vbmUKICAgICAgICBzZWxmLmRpc3RpbmZvX2RpciA9IE5vbmUKICAgICAgICBzZWxmLmVnZ2luZm9fZGlyID0gTm9uZQogICAgICAgIHNlbGYucm9vdF9pc19wdXJlID0gTm9uZQogICAgICAgIHNlbGYuc2tpcF9idWlsZCA9IE5vbmUKICAgICAgICBzZWxmLnJlbGF0aXZlID0gRmFsc2UKICAgICAgICBzZWxmLm93bmVyID0gTm9uZQogICAgICAgIHNlbGYuZ3JvdXAgPSBOb25lCiAgICAgICAgc2VsZi51bml2ZXJzYWwgPSBGYWxzZQogICAgICAgIHNlbGYucHl0aG9uX3RhZyA9ICdweScgKyBnZXRfaW1wbF92ZXIoKVswXQogICAgICAgIHNlbGYucHlfbGltaXRlZF9hcGkgPSBGYWxzZQogICAgICAgIHNlbGYucGxhdF9uYW1lX3N1cHBsaWVkID0gRmFsc2UKCiAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBpZiBzZWxmLmJkaXN0X2RpciBpcyBOb25lOgogICAgICAgICAgICBiZGlzdF9iYXNlID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2JkaXN0JykuYmRpc3RfYmFzZQogICAgICAgICAgICBzZWxmLmJkaXN0X2RpciA9IG9zLnBhdGguam9pbihiZGlzdF9iYXNlLCAnd2hlZWwnKQoKICAgICAgICBzZWxmLmRhdGFfZGlyID0gc2VsZi53aGVlbF9kaXN0X25hbWUgKyAnLmRhdGEnCiAgICAgICAgc2VsZi5wbGF0X25hbWVfc3VwcGxpZWQgPSBzZWxmLnBsYXRfbmFtZSBpcyBub3QgTm9uZQoKICAgICAgICBuZWVkX29wdGlvbnMgPSAoJ2Rpc3RfZGlyJywgJ3BsYXRfbmFtZScsICdza2lwX2J1aWxkJykKCiAgICAgICAgc2VsZi5zZXRfdW5kZWZpbmVkX29wdGlvbnMoJ2JkaXN0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqemlwKG5lZWRfb3B0aW9ucywgbmVlZF9vcHRpb25zKSkKCiAgICAgICAgc2VsZi5yb290X2lzX3B1cmUgPSBub3QgKHNlbGYuZGlzdHJpYnV0aW9uLmhhc19leHRfbW9kdWxlcygpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIHNlbGYuZGlzdHJpYnV0aW9uLmhhc19jX2xpYnJhcmllcygpKQoKICAgICAgICBpZiBzZWxmLnB5X2xpbWl0ZWRfYXBpIGFuZCBub3QgcmUubWF0Y2goUFlfTElNSVRFRF9BUElfUEFUVEVSTiwgc2VsZi5weV9saW1pdGVkX2FwaSk6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInB5LWxpbWl0ZWQtYXBpIG11c3QgbWF0Y2ggJyVzJyIgJSBQWV9MSU1JVEVEX0FQSV9QQVRURVJOKQoKICAgICAgICAjIFN1cHBvcnQgbGVnYWN5IFt3aGVlbF0gc2VjdGlvbiBmb3Igc2V0dGluZyB1bml2ZXJzYWwKICAgICAgICB3aGVlbCA9IHNlbGYuZGlzdHJpYnV0aW9uLmdldF9vcHRpb25fZGljdCgnd2hlZWwnKQogICAgICAgIGlmICd1bml2ZXJzYWwnIGluIHdoZWVsOgogICAgICAgICAgICAjIHBsZWFzZSBkb24ndCBkZWZpbmUgdGhpcyBpbiB5b3VyIGdsb2JhbCBjb25maWdzCiAgICAgICAgICAgIHZhbCA9IHdoZWVsWyd1bml2ZXJzYWwnXVsxXS5zdHJpcCgpCiAgICAgICAgICAgIGlmIHZhbC5sb3dlcigpIGluICgnMScsICd0cnVlJywgJ3llcycpOgogICAgICAgICAgICAgICAgc2VsZi51bml2ZXJzYWwgPSBUcnVlCgogICAgQHByb3BlcnR5CiAgICBkZWYgd2hlZWxfZGlzdF9uYW1lKHNlbGYpOgogICAgICAgICIiIlJldHVybiBkaXN0cmlidXRpb24gZnVsbCBuYW1lIHdpdGggLSByZXBsYWNlZCB3aXRoIF8iIiIKICAgICAgICByZXR1cm4gJy0nLmpvaW4oKHNhZmVyX25hbWUoc2VsZi5kaXN0cmlidXRpb24uZ2V0X25hbWUoKSksCiAgICAgICAgICAgICAgICAgICAgICAgICBzYWZlcl92ZXJzaW9uKHNlbGYuZGlzdHJpYnV0aW9uLmdldF92ZXJzaW9uKCkpKSkKCiAgICBkZWYgZ2V0X3RhZyhzZWxmKToKICAgICAgICAjIGJkaXN0IHNldHMgc2VsZi5wbGF0X25hbWUgaWYgdW5zZXQsIHdlIHNob3VsZCBvbmx5IHVzZSBpdCBmb3IgcHVyZXB5CiAgICAgICAgIyB3aGVlbHMgaWYgdGhlIHVzZXIgc3VwcGxpZWQgaXQuCiAgICAgICAgaWYgc2VsZi5wbGF0X25hbWVfc3VwcGxpZWQ6CiAgICAgICAgICAgIHBsYXRfbmFtZSA9IHNlbGYucGxhdF9uYW1lCiAgICAgICAgZWxpZiBzZWxmLnJvb3RfaXNfcHVyZToKICAgICAgICAgICAgcGxhdF9uYW1lID0gJ2FueScKICAgICAgICBlbHNlOgogICAgICAgICAgICBwbGF0X25hbWUgPSBzZWxmLnBsYXRfbmFtZSBvciBnZXRfcGxhdGZvcm0oKQogICAgICAgICAgICBpZiBwbGF0X25hbWUgaW4gKCdsaW51eC14ODZfNjQnLCAnbGludXhfeDg2XzY0JykgYW5kIHN5cy5tYXhzaXplID09IDIxNDc0ODM2NDc6CiAgICAgICAgICAgICAgICBwbGF0X25hbWUgPSAnbGludXhfaTY4NicKICAgICAgICBwbGF0X25hbWUgPSBwbGF0X25hbWUucmVwbGFjZSgnLScsICdfJykucmVwbGFjZSgnLicsICdfJykKCgogICAgICAgIGlmIHNlbGYucm9vdF9pc19wdXJlOgogICAgICAgICAgICBpZiBzZWxmLnVuaXZlcnNhbDoKICAgICAgICAgICAgICAgIGltcGwgPSAncHkyLnB5MycKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGltcGwgPSBzZWxmLnB5dGhvbl90YWcKICAgICAgICAgICAgdGFnID0gKGltcGwsICdub25lJywgcGxhdF9uYW1lKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGltcGxfbmFtZSA9IGdldF9hYmJyX2ltcGwoKQogICAgICAgICAgICBpbXBsX3ZlciA9IGdldF9pbXBsX3ZlcigpCiAgICAgICAgICAgIGltcGwgPSBpbXBsX25hbWUgKyBpbXBsX3ZlcgogICAgICAgICAgICAjIFdlIGRvbid0IHdvcmsgb24gQ1B5dGhvbiAzLjEsIDMuMC4KICAgICAgICAgICAgaWYgc2VsZi5weV9saW1pdGVkX2FwaSBhbmQgKGltcGxfbmFtZSArIGltcGxfdmVyKS5zdGFydHN3aXRoKCdjcDMnKToKICAgICAgICAgICAgICAgIGltcGwgPSBzZWxmLnB5X2xpbWl0ZWRfYXBpCiAgICAgICAgICAgICAgICBhYmlfdGFnID0gJ2FiaTMnCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBhYmlfdGFnID0gc3RyKGdldF9hYmlfdGFnKCkpLmxvd2VyKCkKICAgICAgICAgICAgdGFnID0gKGltcGwsIGFiaV90YWcsIHBsYXRfbmFtZSkKICAgICAgICAgICAgc3VwcG9ydGVkX3RhZ3MgPSBwZXA0MjV0YWdzLmdldF9zdXBwb3J0ZWQoCiAgICAgICAgICAgICAgICBzdXBwbGllZF9wbGF0Zm9ybT1wbGF0X25hbWUgaWYgc2VsZi5wbGF0X25hbWVfc3VwcGxpZWQgZWxzZSBOb25lKQogICAgICAgICAgICAjIFhYWCBzd2l0Y2ggdG8gdGhpcyBhbHRlcm5hdGUgaW1wbGVtZW50YXRpb24gZm9yIG5vbi1wdXJlOgogICAgICAgICAgICBpZiBub3Qgc2VsZi5weV9saW1pdGVkX2FwaToKICAgICAgICAgICAgICAgIGFzc2VydCB0YWcgPT0gc3VwcG9ydGVkX3RhZ3NbMF0sICIlcyAhPSAlcyIgJSAodGFnLCBzdXBwb3J0ZWRfdGFnc1swXSkKICAgICAgICAgICAgYXNzZXJ0IHRhZyBpbiBzdXBwb3J0ZWRfdGFncywgIndvdWxkIGJ1aWxkIHdoZWVsIHdpdGggdW5zdXBwb3J0ZWQgdGFnICVzIiAlIHRhZwogICAgICAgIHJldHVybiB0YWcKCiAgICBkZWYgZ2V0X2FyY2hpdmVfYmFzZW5hbWUoc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIGFyY2hpdmUgbmFtZSB3aXRob3V0IGV4dGVuc2lvbiIiIgoKICAgICAgICBpbXBsX3RhZywgYWJpX3RhZywgcGxhdF90YWcgPSBzZWxmLmdldF90YWcoKQoKICAgICAgICBhcmNoaXZlX2Jhc2VuYW1lID0gIiVzLSVzLSVzLSVzIiAlICgKICAgICAgICAgICAgc2VsZi53aGVlbF9kaXN0X25hbWUsCiAgICAgICAgICAgIGltcGxfdGFnLAogICAgICAgICAgICBhYmlfdGFnLAogICAgICAgICAgICBwbGF0X3RhZykKICAgICAgICByZXR1cm4gYXJjaGl2ZV9iYXNlbmFtZQoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgYnVpbGRfc2NyaXB0cyA9IHNlbGYucmVpbml0aWFsaXplX2NvbW1hbmQoJ2J1aWxkX3NjcmlwdHMnKQogICAgICAgIGJ1aWxkX3NjcmlwdHMuZXhlY3V0YWJsZSA9ICdweXRob24nCgogICAgICAgIGlmIG5vdCBzZWxmLnNraXBfYnVpbGQ6CiAgICAgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoJ2J1aWxkJykKCiAgICAgICAgaW5zdGFsbCA9IHNlbGYucmVpbml0aWFsaXplX2NvbW1hbmQoJ2luc3RhbGwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW5pdF9zdWJjb21tYW5kcz1UcnVlKQogICAgICAgIGluc3RhbGwucm9vdCA9IHNlbGYuYmRpc3RfZGlyCiAgICAgICAgaW5zdGFsbC5jb21waWxlID0gRmFsc2UKICAgICAgICBpbnN0YWxsLnNraXBfYnVpbGQgPSBzZWxmLnNraXBfYnVpbGQKICAgICAgICBpbnN0YWxsLndhcm5fZGlyID0gRmFsc2UKCiAgICAgICAgIyBBIHdoZWVsIHdpdGhvdXQgc2V0dXB0b29scyBzY3JpcHRzIGlzIG1vcmUgY3Jvc3MtcGxhdGZvcm0uCiAgICAgICAgIyBVc2UgdGhlICh1bmRvY3VtZW50ZWQpIGBub19lcGAgb3B0aW9uIHRvIHNldHVwdG9vbHMnCiAgICAgICAgIyBpbnN0YWxsX3NjcmlwdHMgY29tbWFuZCB0byBhdm9pZCBjcmVhdGluZyBlbnRyeSBwb2ludCBzY3JpcHRzLgogICAgICAgIGluc3RhbGxfc2NyaXB0cyA9IHNlbGYucmVpbml0aWFsaXplX2NvbW1hbmQoJ2luc3RhbGxfc2NyaXB0cycpCiAgICAgICAgaW5zdGFsbF9zY3JpcHRzLm5vX2VwID0gVHJ1ZQoKICAgICAgICAjIFVzZSBhIGN1c3RvbSBzY2hlbWUgZm9yIHRoZSBhcmNoaXZlLCBiZWNhdXNlIHdlIGhhdmUgdG8gZGVjaWRlCiAgICAgICAgIyBhdCBpbnN0YWxsYXRpb24gdGltZSB3aGljaCBzY2hlbWUgdG8gdXNlLgogICAgICAgIGZvciBrZXkgaW4gKCdoZWFkZXJzJywgJ3NjcmlwdHMnLCAnZGF0YScsICdwdXJlbGliJywgJ3BsYXRsaWInKToKICAgICAgICAgICAgc2V0YXR0cihpbnN0YWxsLAogICAgICAgICAgICAgICAgICAgICdpbnN0YWxsXycgKyBrZXksCiAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKHNlbGYuZGF0YV9kaXIsIGtleSkpCgogICAgICAgIGJhc2VkaXJfb2JzZXJ2ZWQgPSAnJwoKICAgICAgICBpZiBvcy5uYW1lID09ICdudCc6CiAgICAgICAgICAgICMgd2luMzIgYmFyZnMgaWYgYW55IG9mIHRoZXNlIGFyZSAnJzsgY291bGQgYmUgJy4nPwogICAgICAgICAgICAjIChkaXN0dXRpbHMuY29tbWFuZC5pbnN0YWxsOmNoYW5nZV9yb290cyBidWcpCiAgICAgICAgICAgIGJhc2VkaXJfb2JzZXJ2ZWQgPSBvcy5wYXRoLm5vcm1wYXRoKG9zLnBhdGguam9pbihzZWxmLmRhdGFfZGlyLCAnLi4nKSkKICAgICAgICAgICAgc2VsZi5pbnN0YWxsX2xpYmJhc2UgPSBzZWxmLmluc3RhbGxfbGliID0gYmFzZWRpcl9vYnNlcnZlZAoKICAgICAgICBzZXRhdHRyKGluc3RhbGwsCiAgICAgICAgICAgICAgICAnaW5zdGFsbF9wdXJlbGliJyBpZiBzZWxmLnJvb3RfaXNfcHVyZSBlbHNlICdpbnN0YWxsX3BsYXRsaWInLAogICAgICAgICAgICAgICAgYmFzZWRpcl9vYnNlcnZlZCkKCiAgICAgICAgbG9nZ2VyLmluZm8oImluc3RhbGxpbmcgdG8gJXMiLCBzZWxmLmJkaXN0X2RpcikKCiAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgnaW5zdGFsbCcpCgogICAgICAgIGFyY2hpdmVfYmFzZW5hbWUgPSBzZWxmLmdldF9hcmNoaXZlX2Jhc2VuYW1lKCkKCiAgICAgICAgcHNldWRvaW5zdGFsbF9yb290ID0gb3MucGF0aC5qb2luKHNlbGYuZGlzdF9kaXIsIGFyY2hpdmVfYmFzZW5hbWUpCiAgICAgICAgaWYgbm90IHNlbGYucmVsYXRpdmU6CiAgICAgICAgICAgIGFyY2hpdmVfcm9vdCA9IHNlbGYuYmRpc3RfZGlyCiAgICAgICAgZWxzZToKICAgICAgICAgICAgYXJjaGl2ZV9yb290ID0gb3MucGF0aC5qb2luKAogICAgICAgICAgICAgICAgc2VsZi5iZGlzdF9kaXIsCiAgICAgICAgICAgICAgICBzZWxmLl9lbnN1cmVfcmVsYXRpdmUoaW5zdGFsbC5pbnN0YWxsX2Jhc2UpKQoKICAgICAgICBzZWxmLnNldF91bmRlZmluZWRfb3B0aW9ucygKICAgICAgICAgICAgJ2luc3RhbGxfZWdnX2luZm8nLCAoJ3RhcmdldCcsICdlZ2dpbmZvX2RpcicpKQogICAgICAgIHNlbGYuZGlzdGluZm9fZGlyID0gb3MucGF0aC5qb2luKHNlbGYuYmRpc3RfZGlyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICclcy5kaXN0LWluZm8nICUgc2VsZi53aGVlbF9kaXN0X25hbWUpCiAgICAgICAgc2VsZi5lZ2cyZGlzdChzZWxmLmVnZ2luZm9fZGlyLAogICAgICAgICAgICAgICAgICAgICAgc2VsZi5kaXN0aW5mb19kaXIpCgogICAgICAgIHNlbGYud3JpdGVfd2hlZWxmaWxlKHNlbGYuZGlzdGluZm9fZGlyKQoKICAgICAgICBzZWxmLndyaXRlX3JlY29yZChzZWxmLmJkaXN0X2Rpciwgc2VsZi5kaXN0aW5mb19kaXIpCgogICAgICAgICMgTWFrZSB0aGUgYXJjaGl2ZQogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzZWxmLmRpc3RfZGlyKToKICAgICAgICAgICAgb3MubWFrZWRpcnMoc2VsZi5kaXN0X2RpcikKICAgICAgICB3aGVlbF9uYW1lID0gYXJjaGl2ZV93aGVlbGZpbGUocHNldWRvaW5zdGFsbF9yb290LCBhcmNoaXZlX3Jvb3QpCgogICAgICAgICMgU2lnbiB0aGUgYXJjaGl2ZQogICAgICAgIGlmICdXSEVFTF9UT09MJyBpbiBvcy5lbnZpcm9uOgogICAgICAgICAgICBzdWJwcm9jZXNzLmNhbGwoW29zLmVudmlyb25bJ1dIRUVMX1RPT0wnXSwgJ3NpZ24nLCB3aGVlbF9uYW1lXSkKCiAgICAgICAgIyBBZGQgdG8gJ0Rpc3RyaWJ1dGlvbi5kaXN0X2ZpbGVzJyBzbyB0aGF0IHRoZSAidXBsb2FkIiBjb21tYW5kIHdvcmtzCiAgICAgICAgZ2V0YXR0cihzZWxmLmRpc3RyaWJ1dGlvbiwgJ2Rpc3RfZmlsZXMnLCBbXSkuYXBwZW5kKAogICAgICAgICAgICAoJ2JkaXN0X3doZWVsJywgZ2V0X3B5dGhvbl92ZXJzaW9uKCksIHdoZWVsX25hbWUpKQoKICAgICAgICBpZiBub3Qgc2VsZi5rZWVwX3RlbXA6CiAgICAgICAgICAgIGlmIHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdyZW1vdmluZyAlcycsIHNlbGYuYmRpc3RfZGlyKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcm10cmVlKHNlbGYuYmRpc3RfZGlyKQoKICAgIGRlZiB3cml0ZV93aGVlbGZpbGUoc2VsZiwgd2hlZWxmaWxlX2Jhc2UsIGdlbmVyYXRvcj0nYmRpc3Rfd2hlZWwgKCcgKyB3aGVlbF92ZXJzaW9uICsgJyknKToKICAgICAgICBmcm9tIGVtYWlsLm1lc3NhZ2UgaW1wb3J0IE1lc3NhZ2UKICAgICAgICBtc2cgPSBNZXNzYWdlKCkKICAgICAgICBtc2dbJ1doZWVsLVZlcnNpb24nXSA9ICcxLjAnICAjIG9mIHRoZSBzcGVjCiAgICAgICAgbXNnWydHZW5lcmF0b3InXSA9IGdlbmVyYXRvcgogICAgICAgIG1zZ1snUm9vdC1Jcy1QdXJlbGliJ10gPSBzdHIoc2VsZi5yb290X2lzX3B1cmUpLmxvd2VyKCkKCiAgICAgICAgIyBEb2Vzbid0IHdvcmsgZm9yIGJkaXN0X3dpbmluc3QKICAgICAgICBpbXBsX3RhZywgYWJpX3RhZywgcGxhdF90YWcgPSBzZWxmLmdldF90YWcoKQogICAgICAgIGZvciBpbXBsIGluIGltcGxfdGFnLnNwbGl0KCcuJyk6CiAgICAgICAgICAgIGZvciBhYmkgaW4gYWJpX3RhZy5zcGxpdCgnLicpOgogICAgICAgICAgICAgICAgZm9yIHBsYXQgaW4gcGxhdF90YWcuc3BsaXQoJy4nKToKICAgICAgICAgICAgICAgICAgICBtc2dbJ1RhZyddID0gJy0nLmpvaW4oKGltcGwsIGFiaSwgcGxhdCkpCgogICAgICAgIHdoZWVsZmlsZV9wYXRoID0gb3MucGF0aC5qb2luKHdoZWVsZmlsZV9iYXNlLCAnV0hFRUwnKQogICAgICAgIGxvZ2dlci5pbmZvKCdjcmVhdGluZyAlcycsIHdoZWVsZmlsZV9wYXRoKQogICAgICAgIHdpdGggb3Blbih3aGVlbGZpbGVfcGF0aCwgJ3cnKSBhcyBmOgogICAgICAgICAgICBHZW5lcmF0b3IoZiwgbWF4aGVhZGVybGVuPTApLmZsYXR0ZW4obXNnKQoKICAgIGRlZiBfZW5zdXJlX3JlbGF0aXZlKHNlbGYsIHBhdGgpOgogICAgICAgICMgY29waWVkIGZyb20gZGlyX3V0aWwsIGRlbGV0ZWQKICAgICAgICBkcml2ZSwgcGF0aCA9IG9zLnBhdGguc3BsaXRkcml2ZShwYXRoKQogICAgICAgIGlmIHBhdGhbMDoxXSA9PSBvcy5zZXA6CiAgICAgICAgICAgIHBhdGggPSBkcml2ZSArIHBhdGhbMTpdCiAgICAgICAgcmV0dXJuIHBhdGgKCiAgICBkZWYgX3BrZ2luZm9fdG9fbWV0YWRhdGEoc2VsZiwgZWdnX2luZm9fcGF0aCwgcGtnaW5mb19wYXRoKToKICAgICAgICByZXR1cm4gbWV0YWRhdGEucGtnaW5mb190b19tZXRhZGF0YShlZ2dfaW5mb19wYXRoLCBwa2dpbmZvX3BhdGgpCgogICAgZGVmIGxpY2Vuc2VfZmlsZShzZWxmKToKICAgICAgICAiIiJSZXR1cm4gbGljZW5zZSBmaWxlbmFtZSBmcm9tIGEgbGljZW5zZS1maWxlIGtleSBpbiBzZXR1cC5jZmcsIG9yIE5vbmUuIiIiCiAgICAgICAgbWV0YWRhdGEgPSBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfb3B0aW9uX2RpY3QoJ21ldGFkYXRhJykKICAgICAgICBpZiBub3QgJ2xpY2Vuc2VfZmlsZScgaW4gbWV0YWRhdGE6CiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgcmV0dXJuIG1ldGFkYXRhWydsaWNlbnNlX2ZpbGUnXVsxXQoKICAgIGRlZiBzZXR1cGNmZ19yZXF1aXJlbWVudHMoc2VsZik6CiAgICAgICAgIiIiR2VuZXJhdGUgcmVxdWlyZW1lbnRzIGZyb20gc2V0dXAuY2ZnIGFzCiAgICAgICAgKCdSZXF1aXJlcy1EaXN0JywgJ3JlcXVpcmVtZW50OyBxdWFsaWZpZXInKSB0dXBsZXMuIEZyb20gYSBtZXRhZGF0YQogICAgICAgIHNlY3Rpb24gaW4gc2V0dXAuY2ZnOgoKICAgICAgICBbbWV0YWRhdGFdCiAgICAgICAgcHJvdmlkZXMtZXh0cmEgPSBleHRyYTEKICAgICAgICAgICAgZXh0cmEyCiAgICAgICAgcmVxdWlyZXMtZGlzdCA9IHJlcXVpcmVtZW50OyBxdWFsaWZpZXIKICAgICAgICAgICAgYW5vdGhlcjsgcXVhbGlmaWVyMgogICAgICAgICAgICB1bnF1YWxpZmllZAoKICAgICAgICBZaWVsZHMKCiAgICAgICAgKCdQcm92aWRlcy1FeHRyYScsICdleHRyYTEnKSwKICAgICAgICAoJ1Byb3ZpZGVzLUV4dHJhJywgJ2V4dHJhMicpLAogICAgICAgICgnUmVxdWlyZXMtRGlzdCcsICdyZXF1aXJlbWVudDsgcXVhbGlmaWVyJyksCiAgICAgICAgKCdSZXF1aXJlcy1EaXN0JywgJ2Fub3RoZXI7IHF1YWxpZmllcjInKSwKICAgICAgICAoJ1JlcXVpcmVzLURpc3QnLCAndW5xdWFsaWZpZWQnKQogICAgICAgICIiIgogICAgICAgIG1ldGFkYXRhID0gc2VsZi5kaXN0cmlidXRpb24uZ2V0X29wdGlvbl9kaWN0KCdtZXRhZGF0YScpCgogICAgICAgICMgb3VyIC5pbmkgcGFyc2VyIGZvbGRzIC0gdG8gXyBpbiBrZXkgbmFtZXM6CiAgICAgICAgZm9yIGtleSwgdGl0bGUgaW4gKCgncHJvdmlkZXNfZXh0cmEnLCAnUHJvdmlkZXMtRXh0cmEnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdyZXF1aXJlc19kaXN0JywgJ1JlcXVpcmVzLURpc3QnKSk6CiAgICAgICAgICAgIGlmIG5vdCBrZXkgaW4gbWV0YWRhdGE6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBmaWVsZCA9IG1ldGFkYXRhW2tleV0KICAgICAgICAgICAgZm9yIGxpbmUgaW4gZmllbGRbMV0uc3BsaXRsaW5lcygpOgogICAgICAgICAgICAgICAgbGluZSA9IGxpbmUuc3RyaXAoKQogICAgICAgICAgICAgICAgaWYgbm90IGxpbmU6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIHlpZWxkICh0aXRsZSwgbGluZSkKCiAgICBkZWYgYWRkX3JlcXVpcmVtZW50cyhzZWxmLCBtZXRhZGF0YV9wYXRoKToKICAgICAgICAiIiJBZGQgYWRkaXRpb25hbCByZXF1aXJlbWVudHMgZnJvbSBzZXR1cC5jZmcgdG8gZmlsZSBtZXRhZGF0YV9wYXRoIiIiCiAgICAgICAgYWRkaXRpb25hbCA9IGxpc3Qoc2VsZi5zZXR1cGNmZ19yZXF1aXJlbWVudHMoKSkKICAgICAgICBpZiBub3QgYWRkaXRpb25hbDogcmV0dXJuCiAgICAgICAgcGtnX2luZm8gPSByZWFkX3BrZ19pbmZvKG1ldGFkYXRhX3BhdGgpCiAgICAgICAgaWYgJ1Byb3ZpZGVzLUV4dHJhJyBpbiBwa2dfaW5mbyBvciAnUmVxdWlyZXMtRGlzdCcgaW4gcGtnX2luZm86CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oJ3NldHVwLmNmZyByZXF1aXJlbWVudHMgb3ZlcndyaXRlIHZhbHVlcyBmcm9tIHNldHVwLnB5JykKICAgICAgICAgICAgZGVsIHBrZ19pbmZvWydQcm92aWRlcy1FeHRyYSddCiAgICAgICAgICAgIGRlbCBwa2dfaW5mb1snUmVxdWlyZXMtRGlzdCddCiAgICAgICAgZm9yIGssIHYgaW4gYWRkaXRpb25hbDoKICAgICAgICAgICAgcGtnX2luZm9ba10gPSB2CiAgICAgICAgd3JpdGVfcGtnX2luZm8obWV0YWRhdGFfcGF0aCwgcGtnX2luZm8pCgogICAgZGVmIGVnZzJkaXN0KHNlbGYsIGVnZ2luZm9fcGF0aCwgZGlzdGluZm9fcGF0aCk6CiAgICAgICAgIiIiQ29udmVydCBhbiAuZWdnLWluZm8gZGlyZWN0b3J5IGludG8gYSAuZGlzdC1pbmZvIGRpcmVjdG9yeSIiIgogICAgICAgIGRlZiBhZGlvcyhwKToKICAgICAgICAgICAgIiIiQXBwcm9wcmlhdGVseSBkZWxldGUgZGlyZWN0b3J5LCBmaWxlIG9yIGxpbmsuIiIiCiAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHApIGFuZCBub3Qgb3MucGF0aC5pc2xpbmsocCkgYW5kIG9zLnBhdGguaXNkaXIocCk6CiAgICAgICAgICAgICAgICBzaHV0aWwucm10cmVlKHApCiAgICAgICAgICAgIGVsaWYgb3MucGF0aC5leGlzdHMocCk6CiAgICAgICAgICAgICAgICBvcy51bmxpbmsocCkKCiAgICAgICAgYWRpb3MoZGlzdGluZm9fcGF0aCkKCiAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGVnZ2luZm9fcGF0aCk6CiAgICAgICAgICAgICMgVGhlcmUgaXMgbm8gZWdnLWluZm8uIFRoaXMgaXMgcHJvYmFibHkgYmVjYXVzZSB0aGUgZWdnLWluZm8KICAgICAgICAgICAgIyBmaWxlL2RpcmVjdG9yeSBpcyBub3QgbmFtZWQgbWF0Y2hpbmcgdGhlIGRpc3RyaWJ1dGlvbiBuYW1lIHVzZWQKICAgICAgICAgICAgIyB0byBuYW1lIHRoZSBhcmNoaXZlIGZpbGUuIENoZWNrIGZvciB0aGlzIGNhc2UgYW5kIHJlcG9ydAogICAgICAgICAgICAjIGFjY29yZGluZ2x5LgogICAgICAgICAgICBpbXBvcnQgZ2xvYgogICAgICAgICAgICBwYXQgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKGVnZ2luZm9fcGF0aCksICcqLmVnZy1pbmZvJykKICAgICAgICAgICAgcG9zc2libGUgPSBnbG9iLmdsb2IocGF0KQogICAgICAgICAgICBlcnIgPSAiRWdnIG1ldGFkYXRhIGV4cGVjdGVkIGF0ICVzIGJ1dCBub3QgZm91bmQiICUgKGVnZ2luZm9fcGF0aCwpCiAgICAgICAgICAgIGlmIHBvc3NpYmxlOgogICAgICAgICAgICAgICAgYWx0ID0gb3MucGF0aC5iYXNlbmFtZShwb3NzaWJsZVswXSkKICAgICAgICAgICAgICAgIGVyciArPSAiICglcyBmb3VuZCAtIHBvc3NpYmxlIG1pc25hbWVkIGFyY2hpdmUgZmlsZT8pIiAlIChhbHQsKQoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihlcnIpCgogICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKGVnZ2luZm9fcGF0aCk6CiAgICAgICAgICAgICMgLmVnZy1pbmZvIGlzIGEgc2luZ2xlIGZpbGUKICAgICAgICAgICAgcGtnaW5mb19wYXRoID0gZWdnaW5mb19wYXRoCiAgICAgICAgICAgIHBrZ19pbmZvID0gc2VsZi5fcGtnaW5mb190b19tZXRhZGF0YShlZ2dpbmZvX3BhdGgsIGVnZ2luZm9fcGF0aCkKICAgICAgICAgICAgb3MubWtkaXIoZGlzdGluZm9fcGF0aCkKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIC5lZ2ctaW5mbyBpcyBhIGRpcmVjdG9yeQogICAgICAgICAgICBwa2dpbmZvX3BhdGggPSBvcy5wYXRoLmpvaW4oZWdnaW5mb19wYXRoLCAnUEtHLUlORk8nKQogICAgICAgICAgICBwa2dfaW5mbyA9IHNlbGYuX3BrZ2luZm9fdG9fbWV0YWRhdGEoZWdnaW5mb19wYXRoLCBwa2dpbmZvX3BhdGgpCgogICAgICAgICAgICAjIGlnbm9yZSBjb21tb24gZWdnIG1ldGFkYXRhIHRoYXQgaXMgdXNlbGVzcyB0byB3aGVlbAogICAgICAgICAgICBzaHV0aWwuY29weXRyZWUoZWdnaW5mb19wYXRoLCBkaXN0aW5mb19wYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlPWxhbWJkYSB4LCB5OiBzZXQoKCdQS0ctSU5GTycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JlcXVpcmVzLnR4dCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1NPVVJDRVMudHh0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbm90LXppcC1zYWZlJywpKSkKCiAgICAgICAgICAgICMgZGVsZXRlIGRlcGVuZGVuY3lfbGlua3MgaWYgaXQgaXMgb25seSB3aGl0ZXNwYWNlCiAgICAgICAgICAgIGRlcGVuZGVuY3lfbGlua3NfcGF0aCA9IG9zLnBhdGguam9pbihkaXN0aW5mb19wYXRoLCAnZGVwZW5kZW5jeV9saW5rcy50eHQnKQogICAgICAgICAgICB3aXRoIG9wZW4oZGVwZW5kZW5jeV9saW5rc19wYXRoLCAncicpIGFzIGRlcGVuZGVuY3lfbGlua3NfZmlsZToKICAgICAgICAgICAgICAgIGRlcGVuZGVuY3lfbGlua3MgPSBkZXBlbmRlbmN5X2xpbmtzX2ZpbGUucmVhZCgpLnN0cmlwKCkKICAgICAgICAgICAgaWYgbm90IGRlcGVuZGVuY3lfbGlua3M6CiAgICAgICAgICAgICAgICBhZGlvcyhkZXBlbmRlbmN5X2xpbmtzX3BhdGgpCgogICAgICAgIHdyaXRlX3BrZ19pbmZvKG9zLnBhdGguam9pbihkaXN0aW5mb19wYXRoLCAnTUVUQURBVEEnKSwgcGtnX2luZm8pCgogICAgICAgICMgWFhYIGRlcHJlY2F0ZWQuIFN0aWxsIHVzZWZ1bCBmb3IgY3VycmVudCBkaXN0cmlidXRlL3NldHVwdG9vbHMuCiAgICAgICAgbWV0YWRhdGFfcGF0aCA9IG9zLnBhdGguam9pbihkaXN0aW5mb19wYXRoLCAnTUVUQURBVEEnKQogICAgICAgIHNlbGYuYWRkX3JlcXVpcmVtZW50cyhtZXRhZGF0YV9wYXRoKQoKICAgICAgICAjIFhYWCBpbnRlbnRpb25hbGx5IGEgZGlmZmVyZW50IHBhdGggdGhhbiB0aGUgUEVQLgogICAgICAgIG1ldGFkYXRhX2pzb25fcGF0aCA9IG9zLnBhdGguam9pbihkaXN0aW5mb19wYXRoLCAnbWV0YWRhdGEuanNvbicpCiAgICAgICAgcHltZXRhID0gcGtnaW5mb190b19kaWN0KG1ldGFkYXRhX3BhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RyaWJ1dGlvbj1zZWxmLmRpc3RyaWJ1dGlvbikKCiAgICAgICAgaWYgJ2Rlc2NyaXB0aW9uJyBpbiBweW1ldGE6CiAgICAgICAgICAgIGRlc2NyaXB0aW9uX2ZpbGVuYW1lID0gJ0RFU0NSSVBUSU9OLnJzdCcKICAgICAgICAgICAgZGVzY3JpcHRpb25fdGV4dCA9IHB5bWV0YS5wb3AoJ2Rlc2NyaXB0aW9uJykKICAgICAgICAgICAgZGVzY3JpcHRpb25fcGF0aCA9IG9zLnBhdGguam9pbihkaXN0aW5mb19wYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uX2ZpbGVuYW1lKQogICAgICAgICAgICB3aXRoIG9wZW4oZGVzY3JpcHRpb25fcGF0aCwgIndiIikgYXMgZGVzY3JpcHRpb25fZmlsZToKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uX2ZpbGUud3JpdGUoZGVzY3JpcHRpb25fdGV4dC5lbmNvZGUoJ3V0Zi04JykpCiAgICAgICAgICAgIHB5bWV0YVsnZXh0ZW5zaW9ucyddWydweXRob24uZGV0YWlscyddWydkb2N1bWVudF9uYW1lcyddWydkZXNjcmlwdGlvbiddID0gZGVzY3JpcHRpb25fZmlsZW5hbWUKCiAgICAgICAgIyBYWFggaGV1cmlzdGljYWxseSBjb3B5IGFueSBMSUNFTlNFL0xJQ0VOU0UudHh0PwogICAgICAgIGxpY2Vuc2UgPSBzZWxmLmxpY2Vuc2VfZmlsZSgpCiAgICAgICAgaWYgbGljZW5zZToKICAgICAgICAgICAgbGljZW5zZV9maWxlbmFtZSA9ICdMSUNFTlNFLnR4dCcKICAgICAgICAgICAgc2h1dGlsLmNvcHkobGljZW5zZSwgb3MucGF0aC5qb2luKHNlbGYuZGlzdGluZm9fZGlyLCBsaWNlbnNlX2ZpbGVuYW1lKSkKICAgICAgICAgICAgcHltZXRhWydleHRlbnNpb25zJ11bJ3B5dGhvbi5kZXRhaWxzJ11bJ2RvY3VtZW50X25hbWVzJ11bJ2xpY2Vuc2UnXSA9IGxpY2Vuc2VfZmlsZW5hbWUKCiAgICAgICAgd2l0aCBvcGVuKG1ldGFkYXRhX2pzb25fcGF0aCwgInciKSBhcyBtZXRhZGF0YV9qc29uOgogICAgICAgICAgICBqc29uLmR1bXAocHltZXRhLCBtZXRhZGF0YV9qc29uLCBzb3J0X2tleXM9VHJ1ZSkKCiAgICAgICAgYWRpb3MoZWdnaW5mb19wYXRoKQoKICAgIGRlZiB3cml0ZV9yZWNvcmQoc2VsZiwgYmRpc3RfZGlyLCBkaXN0aW5mb19kaXIpOgogICAgICAgIGZyb20gLnV0aWwgaW1wb3J0IHVybHNhZmVfYjY0ZW5jb2RlCgogICAgICAgIHJlY29yZF9wYXRoID0gb3MucGF0aC5qb2luKGRpc3RpbmZvX2RpciwgJ1JFQ09SRCcpCiAgICAgICAgcmVjb3JkX3JlbHBhdGggPSBvcy5wYXRoLnJlbHBhdGgocmVjb3JkX3BhdGgsIGJkaXN0X2RpcikKCiAgICAgICAgZGVmIHdhbGsoKToKICAgICAgICAgICAgZm9yIGRpciwgZGlycywgZmlsZXMgaW4gb3Mud2FsayhiZGlzdF9kaXIpOgogICAgICAgICAgICAgICAgZGlycy5zb3J0KCkKICAgICAgICAgICAgICAgIGZvciBmIGluIHNvcnRlZChmaWxlcyk6CiAgICAgICAgICAgICAgICAgICAgeWllbGQgb3MucGF0aC5qb2luKGRpciwgZikKCiAgICAgICAgZGVmIHNraXAocGF0aCk6CiAgICAgICAgICAgICIiIldoZWVsIGhhc2hlcyBldmVyeSBwb3NzaWJsZSBmaWxlLiIiIgogICAgICAgICAgICByZXR1cm4gKHBhdGggPT0gcmVjb3JkX3JlbHBhdGgpCgogICAgICAgIHdpdGggb3Blbl9mb3JfY3N2KHJlY29yZF9wYXRoLCAndysnKSBhcyByZWNvcmRfZmlsZToKICAgICAgICAgICAgd3JpdGVyID0gY3N2LndyaXRlcihyZWNvcmRfZmlsZSkKICAgICAgICAgICAgZm9yIHBhdGggaW4gd2FsaygpOgogICAgICAgICAgICAgICAgcmVscGF0aCA9IG9zLnBhdGgucmVscGF0aChwYXRoLCBiZGlzdF9kaXIpCiAgICAgICAgICAgICAgICBpZiBza2lwKHJlbHBhdGgpOgogICAgICAgICAgICAgICAgICAgIGhhc2ggPSAnJwogICAgICAgICAgICAgICAgICAgIHNpemUgPSAnJwogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICB3aXRoIG9wZW4ocGF0aCwgJ3JiJykgYXMgZjoKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGYucmVhZCgpCiAgICAgICAgICAgICAgICAgICAgZGlnZXN0ID0gaGFzaGxpYi5zaGEyNTYoZGF0YSkuZGlnZXN0KCkKICAgICAgICAgICAgICAgICAgICBoYXNoID0gJ3NoYTI1Nj0nICsgbmF0aXZlKHVybHNhZmVfYjY0ZW5jb2RlKGRpZ2VzdCkpCiAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IGxlbihkYXRhKQogICAgICAgICAgICAgICAgcmVjb3JkX3BhdGggPSBvcy5wYXRoLnJlbHBhdGgoCiAgICAgICAgICAgICAgICAgICAgcGF0aCwgYmRpc3RfZGlyKS5yZXBsYWNlKG9zLnBhdGguc2VwLCAnLycpCiAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVyb3coKHJlY29yZF9wYXRoLCBoYXNoLCBzaXplKSkKUEsDBBQAAAAAAAAAIQCjeVJ3HQIAAB0CAAA0AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL2RlY29yYXRvci5weSMgZnJvbSBQeXJhbWlkCgoKY2xhc3MgcmVpZnkob2JqZWN0KToKICAgICIiIlB1dCB0aGUgcmVzdWx0IG9mIGEgbWV0aG9kIHdoaWNoIHVzZXMgdGhpcyAobm9uLWRhdGEpCiAgICBkZXNjcmlwdG9yIGRlY29yYXRvciBpbiB0aGUgaW5zdGFuY2UgZGljdCBhZnRlciB0aGUgZmlyc3QgY2FsbCwKICAgIGVmZmVjdGl2ZWx5IHJlcGxhY2luZyB0aGUgZGVjb3JhdG9yIHdpdGggYW4gaW5zdGFuY2UgdmFyaWFibGUuCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgd3JhcHBlZCk6CiAgICAgICAgc2VsZi53cmFwcGVkID0gd3JhcHBlZAogICAgICAgIHNlbGYuX19kb2NfXyA9IHdyYXBwZWQuX19kb2NfXwoKICAgIGRlZiBfX2dldF9fKHNlbGYsIGluc3QsIG9ianR5cGU9Tm9uZSk6CiAgICAgICAgaWYgaW5zdCBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4gc2VsZgogICAgICAgIHZhbCA9IHNlbGYud3JhcHBlZChpbnN0KQogICAgICAgIHNldGF0dHIoaW5zdCwgc2VsZi53cmFwcGVkLl9fbmFtZV9fLCB2YWwpCiAgICAgICAgcmV0dXJuIHZhbApQSwMEFAAAAAAAAAAhANNhDyTTCwAA0wsAADQAAABwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvZWdnMndoZWVsLnB5IyEvdXNyL2Jpbi9lbnYgcHl0aG9uCmltcG9ydCBvcy5wYXRoCmltcG9ydCByZQppbXBvcnQgc3lzCmltcG9ydCB0ZW1wZmlsZQppbXBvcnQgemlwZmlsZQppbXBvcnQgd2hlZWwuYmRpc3Rfd2hlZWwKaW1wb3J0IHNodXRpbAppbXBvcnQgZGlzdHV0aWxzLmRpc3QKZnJvbSBkaXN0dXRpbHMuYXJjaGl2ZV91dGlsIGltcG9ydCBtYWtlX2FyY2hpdmUKZnJvbSBhcmdwYXJzZSBpbXBvcnQgQXJndW1lbnRQYXJzZXIKZnJvbSBnbG9iIGltcG9ydCBpZ2xvYgpmcm9tIHdoZWVsLndpbmluc3Qyd2hlZWwgaW1wb3J0IF9iZGlzdF93aGVlbF90YWcKCmVnZ19pbmZvX3JlID0gcmUuY29tcGlsZShyJycnKD9QPG5hbWU+Lis/KS0oP1A8dmVyPi4rPykKICAgICgtKD9QPHB5dmVyPi4rPykpPygtKD9QPGFyY2g+Lis/KSk/LmVnZycnJywgcmUuVkVSQk9TRSkKCmRlZiBlZ2cyd2hlZWwoZWdnX3BhdGgsIGRlc3RfZGlyKToKICAgIGVnZ19pbmZvID0gZWdnX2luZm9fcmUubWF0Y2gob3MucGF0aC5iYXNlbmFtZShlZ2dfcGF0aCkpLmdyb3VwZGljdCgpCiAgICBkaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKHN1ZmZpeD0iX2UydyIpCiAgICBpZiBvcy5wYXRoLmlzZmlsZShlZ2dfcGF0aCk6CiAgICAgICAgIyBhc3N1bWUgd2UgaGF2ZSBhIGJkaXN0X2VnZyBvdGhlcndpc2UKICAgICAgICBlZ2cgPSB6aXBmaWxlLlppcEZpbGUoZWdnX3BhdGgpCiAgICAgICAgZWdnLmV4dHJhY3RhbGwoZGlyKQogICAgZWxzZToKICAgICAgICAjIHN1cHBvcnQgYnVpbGRvdXQtc3R5bGUgaW5zdGFsbGVkIGVnZ3MgZGlyZWN0b3JpZXMKICAgICAgICBmb3IgcHRoIGluIG9zLmxpc3RkaXIoZWdnX3BhdGgpOgogICAgICAgICAgICBzcmMgPSBvcy5wYXRoLmpvaW4oZWdnX3BhdGgsIHB0aCkKICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoc3JjKToKICAgICAgICAgICAgICAgIHNodXRpbC5jb3B5MihzcmMsIGRpcikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNodXRpbC5jb3B5dHJlZShzcmMsIG9zLnBhdGguam9pbihkaXIsIHB0aCkpCgogICAgZGlzdF9pbmZvID0gIiVzLSVzIiAlIChlZ2dfaW5mb1snbmFtZSddLCBlZ2dfaW5mb1sndmVyJ10pCiAgICBhYmkgPSAnbm9uZScKICAgIHB5dmVyID0gZWdnX2luZm9bJ3B5dmVyJ10ucmVwbGFjZSgnLicsICcnKQogICAgYXJjaCA9IChlZ2dfaW5mb1snYXJjaCddIG9yICdhbnknKS5yZXBsYWNlKCcuJywgJ18nKS5yZXBsYWNlKCctJywgJ18nKQogICAgaWYgYXJjaCAhPSAnYW55JzoKICAgICAgICAjIGFzc3VtZSBhbGwgYmluYXJ5IGVnZ3MgYXJlIGZvciBDUHl0aG9uCiAgICAgICAgcHl2ZXIgPSAnY3AnICsgcHl2ZXJbMjpdCiAgICB3aGVlbF9uYW1lID0gJy0nLmpvaW4oKAogICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RfaW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICBweXZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICBhYmksCiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJjaAogICAgICAgICAgICAgICAgICAgICAgICAgICkpCiAgICByb290X2lzX3B1cmVsaWIgPSBlZ2dfaW5mb1snYXJjaCddIGlzIE5vbmUKICAgIGlmIHJvb3RfaXNfcHVyZWxpYjoKICAgICAgICBidyA9IHdoZWVsLmJkaXN0X3doZWVsLmJkaXN0X3doZWVsKGRpc3R1dGlscy5kaXN0LkRpc3RyaWJ1dGlvbigpKQogICAgZWxzZToKICAgICAgICBidyA9IF9iZGlzdF93aGVlbF90YWcoZGlzdHV0aWxzLmRpc3QuRGlzdHJpYnV0aW9uKCkpCgogICAgYncucm9vdF9pc19wdXJlID0gcm9vdF9pc19wdXJlbGliCiAgICBidy5weXRob25fdGFnID0gcHl2ZXIKICAgIGJ3LnBsYXRfbmFtZV9zdXBwbGllZCA9IFRydWUKICAgIGJ3LnBsYXRfbmFtZSA9IGVnZ19pbmZvWydhcmNoJ10gb3IgJ2FueScKICAgIGlmIG5vdCByb290X2lzX3B1cmVsaWI6CiAgICAgICAgYncuZnVsbF90YWdfc3VwcGxpZWQgPSBUcnVlCiAgICAgICAgYncuZnVsbF90YWcgPSAocHl2ZXIsIGFiaSwgYXJjaCkKCiAgICBkaXN0X2luZm9fZGlyID0gb3MucGF0aC5qb2luKGRpciwgJyVzLmRpc3QtaW5mbycgJSBkaXN0X2luZm8pCiAgICBidy5lZ2cyZGlzdChvcy5wYXRoLmpvaW4oZGlyLCAnRUdHLUlORk8nKSwKICAgICAgICAgICAgICAgIGRpc3RfaW5mb19kaXIpCiAgICBidy53cml0ZV93aGVlbGZpbGUoZGlzdF9pbmZvX2RpciwgZ2VuZXJhdG9yPSdlZ2cyd2hlZWwnKQogICAgYncud3JpdGVfcmVjb3JkKGRpciwgZGlzdF9pbmZvX2RpcikKICAgIGZpbGVuYW1lID0gbWFrZV9hcmNoaXZlKG9zLnBhdGguam9pbihkZXN0X2Rpciwgd2hlZWxfbmFtZSksICd6aXAnLCByb290X2Rpcj1kaXIpCiAgICBvcy5yZW5hbWUoZmlsZW5hbWUsIGZpbGVuYW1lWzotM10gKyAnd2hsJykKICAgIHNodXRpbC5ybXRyZWUoZGlyKQoKZGVmIG1haW4oKToKICAgIHBhcnNlciA9IEFyZ3VtZW50UGFyc2VyKCkKICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJ2VnZ3MnLCBuYXJncz0nKicsIGhlbHA9IkVnZ3MgdG8gY29udmVydCIpCiAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWRlc3QtZGlyJywgJy1kJywgZGVmYXVsdD1vcy5wYXRoLmN1cmRpciwKICAgICAgICAgICAgaGVscD0iRGlyZWN0b3J5IHRvIHN0b3JlIHdoZWVscyAoZGVmYXVsdCAlKGRlZmF1bHQpcykiKQogICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS12ZXJib3NlJywgJy12JywgYWN0aW9uPSdzdG9yZV90cnVlJykKICAgIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCiAgICBmb3IgcGF0IGluIGFyZ3MuZWdnczoKICAgICAgICBmb3IgZWdnIGluIGlnbG9iKHBhdCk6CiAgICAgICAgICAgIGlmIGFyZ3MudmVyYm9zZToKICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoInswfS4uLiAiLmZvcm1hdChlZ2cpKQogICAgICAgICAgICBlZ2cyd2hlZWwoZWdnLCBhcmdzLmRlc3RfZGlyKQogICAgICAgICAgICBpZiBhcmdzLnZlcmJvc2U6CiAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCJPS1xuIikKCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICBtYWluKCkKUEsDBBQAAAAAAAAAIQAQJPIzugkAALoJAAA0AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL2VnZ25hbWVzLnR4dHZjYXJkLTAuNy44LXB5Mi43LmVnZwpxdGFsY2hlbXktMC43LjEtcHkyLjcuZWdnCkFNUVBEZWxpdmVyLTAuMS1weTIuNy5lZ2cKaW5maS5yZWdpc3RyeS0wLjEuMS1weTIuNy5lZ2cKaW5maS5pbnN0cnVjdC0wLjUuNS1weTIuNy5lZ2cKaW5maS5kZXZpY2VtYW5hZ2VyLTAuMS4yLXB5Mi43LmVnZwpUcmFjVGl4U3VtbWFyeS0xLjAtcHkyLjcuZWdnClRvc2NhV2lkZ2V0cy0wLjkuMTItcHkyLjcuZWdnCmFyY2hpcGVsX2FnZW50X2lwaG9uZV9ub3RpZmljYXRpb24tMC41LjBiZXRhLXB5Mi43LmVnZwphcmNoaXBlbF9hZ2VudF9hY3Rpb25fc2NoZWR1bGVyLTAuNS4wYmV0YS1weTIuNy5lZ2cKYW8uc29jaWFsLTEuMC4yLXB5Mi43LmVnZwphcGdsLTAuNy1weTIuNy5lZ2cKc2F0Y2htb19wYXltZW50X3BheXdvcmxkLTAuMS4xLXB5Mi43LmVnZwpzbm1wc2ltLTAuMS4zLXB5Mi43LmVnZwpzc2hpbS0wLjItcHkyLjcuZWdnCnNob3ZlLTAuMy40LXB5Mi43LmVnZwpzaW1wbGVhdnJvLTAuMy4wLXB5Mi43LmVnZwp3a2h0bWx0b3BkZi0wLjItcHkyLjcuZWdnCndva2tlbC0wLjcuMC1weTIuNy5lZ2cKam1ib19zb2NpYWwtMC4wLjYtcHkyLjcuZWdnCmptYm9fcG9zdC0wLjAuNi1weTIuNy5lZ2cKamNyYWNrLTAuMC4yLXB5Mi43LmVnZwpyaWFrLTEuNC4wLXB5Mi43LmVnZwpyZXN0Y2xpZW50LTAuMTAuMi1weTIuNy5lZ2cKU3V0ZWtoLTAuOC4xLXB5Mi43LmVnZwp0cmF5aWZ5LTAuMC4xLXB5Mi43LmVnZwp0d2VlcHktMS45LXB5Mi43LmVnZwp0b3B6b290b29scy0wLjIuMS1weTIuNy5lZ2cKaGF5c3RhY2stMC4xNi1weTIuNy5lZ2cKem9wZS5pbnRlcmZhY2UtNC4wLjEtcHkyLjctd2luMzIuZWdnCm5ldXJvc2hhcmUtMC44LjUtcHkyLjctbWFjb3N4LTEwLjctaW50ZWwuZWdnCm5kZ19odHRwc2NsaWVudC0wLjIuMC1weTIuNy5lZ2cKbGlidGVsZS0wLjMtcHkyLjcuZWdnCmxpdGV4LmN4cG9vbC0xLjAuMi1weTIuNy5lZ2cKb2JzcHkuaXJpcy0wLjUuMS1weTIuNy5lZ2cKb2JzcHkubXNlZWQtMC42LjEtcHkyLjctd2luMzIuZWdnCm9ic3B5LmNvcmUtMC42LjItcHkyLjcuZWdnCkNvcmVQb3N0LTAuMC4zLXB5Mi43LmVnZwpmbm9yZHN0YWxrLTAuMC4zLXB5Mi43LmVnZwpQZXJzaXN0ZW5jZS0yLjEzLjItcHkyLjctd2luMzIuZWdnClB5ZGFwLTMuMS5SQzEtcHkyLjcuZWdnClB5RXhlY0pTLTEuMC40LXB5Mi43LmVnZwpXYWxseS0wLjcuMi1weTIuNy5lZ2cKRXh0ZW5zaW9uQ2xhc3MtNC4wYTEtcHkyLjctd2luMzIuZWdnCkZlZWRqYWNrLTAuOS4xNi1weTIuNy5lZ2cKTWFyczI0LTAuMy45LXB5Mi43LmVnZwpIYWxXZWItMC42LjAtcHkyLjcuZWdnCkRBUkUtMC43LjE0MC1weTIuNy5lZ2cKbWFjaG9saWItMS4zLXB5Mi43LmVnZwptYXJyb3cud3NnaS5lZ3Jlc3MuY29tcHJlc3Npb24tMS4xLXB5Mi43LmVnZwptY3MtMC4zLjctcHkyLjcuZWdnCktvb2stMC42LjAtcHkyLjcuZWdnCmVyLTAuMS1weTIuNy5lZ2cKZXZhc2lvbl9kaXJlY3Rvci0xLjEuNC1weTIuNy5lZ2cKZGpxdWVyeS0wLjFhLXB5Mi43LmVnZwpkamFuZ29fZmFjdG9yeS0wLjctcHkyLjcuZWdnCmRqYW5nb19naXptby0wLjAuMy1weTIuNy5lZ2cKZGphbmdvX2NhdGVnb3J5LTAuMS1weTIuNy5lZ2cKZGJ3cmFwLTAuMy4yLXB5Mi43LmVnZwpkamFuZ29fc3VwZXJnZW5lcmljLTEuMC1weTIuNy5lZ2cKZGphbmdvX2R5bmFtby0wLjI1LXB5Mi43LmVnZwpkamFuZ29fYWNvbGxhYmF1dGgtMC4xLXB5Mi43LmVnZwpkamFuZ29fcXJsaW5rLTAuMS4wLXB5Mi43LmVnZwpkamFuZ29fYWRkb25zLTAuNi42LXB5Mi43LmVnZwpjb3Zlcl9ncmFiYmVyLTEuMS4yLXB5Mi43LmVnZwpjaGVtLTEuMS1weTIuNy5lZ2cKY3J1ZC0wLjEtcHkyLjcuZWdnCmJvbmdvLTAuMS1weTIuNy5lZ2cKYnl0ZWNvZGVoYWNrcy1BcHJpbDIwMDAtcHkyLjcuZWdnCmdyZWVubGV0LTAuMy40LXB5Mi43LXdpbjMyLmVnZwpnaW52b2tlLTAuMy4xLXB5Mi43LmVnZwpweW9iamNfZnJhbWV3b3JrX1NjcmlwdGluZ0JyaWRnZS0yLjMtcHkyLjcuZWdnCnBlY2FuLTAuMi4wYS1weTIuNy5lZ2cKcHlyZXNzLTAuMi4wLXB5Mi43LmVnZwpweW9iamNfZnJhbWV3b3JrX1B1YlN1Yi0yLjMtcHkyLjcuZWdnCnB5b2JqY19mcmFtZXdvcmtfRXhjZXB0aW9uSGFuZGxpbmctMi4zLXB5Mi43LmVnZwpweXdwcy10cnVuay1weTIuNy5lZ2cKcHlvYmpjX2ZyYW1ld29ya19DRk5ldHdvcmstMi4zLXB5Mi43LW1hY29zeC0xMC42LWZhdC5lZ2cKcHkuc2F1bnRlci0wLjQwLXB5Mi43LmVnZwpweWZub3JkbWV0cmljLTAuMC4xLXB5Mi43LmVnZwpweXdzLTEuMS4xLXB5Mi43LmVnZwpwcmVzdGFweXQtMC40LjAtcHkyLjcuZWdnCnBhc3NsaWItMS41LjMtcHkyLjcuZWdnCnB5Z2EtMi4xLXB5Mi43LmVnZwpweWdpdGh1YjMtMC4zLXB5Mi43LmVnZwpweW9iamNfZnJhbWV3b3JrX09wZW5EaXJlY3RvcnktMi4zLXB5Mi43LmVnZwp5YXBvc2liLTAuMi43NS1weTIuNy1saW51eC14ODZfNjQuZWdnClBLAwQUAAAAAAAAACEAsby59rJGAACyRgAAMgAAAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC9pbnN0YWxsLnB5IiIiCk9wZXJhdGlvbnMgb24gZXhpc3Rpbmcgd2hlZWwgZmlsZXMsIGluY2x1ZGluZyBiYXNpYyBpbnN0YWxsYXRpb24uIAoiIiIKIyBYWFggc2VlIHBhdGNoZWQgcGlwIHRvIGluc3RhbGwKCmltcG9ydCBzeXMKaW1wb3J0IHdhcm5pbmdzCmltcG9ydCBvcy5wYXRoCmltcG9ydCByZQppbXBvcnQgemlwZmlsZQppbXBvcnQgaGFzaGxpYgppbXBvcnQgY3N2CgppbXBvcnQgc2h1dGlsCgp0cnk6CiAgICBfYmlnX251bWJlciA9IHN5cy5tYXhzaXplCmV4Y2VwdCBOYW1lRXJyb3I6CiAgICBfYmlnX251bWJlciA9IHN5cy5tYXhpbnQKCmZyb20gLmRlY29yYXRvciBpbXBvcnQgcmVpZnkKZnJvbSAudXRpbCBpbXBvcnQgKHVybHNhZmVfYjY0ZW5jb2RlLCBmcm9tX2pzb24sIHVybHNhZmVfYjY0ZGVjb2RlLAogICAgICAgICAgICAgICAgICAgbmF0aXZlLCBiaW5hcnksIEhhc2hpbmdGaWxlKQpmcm9tIC4gaW1wb3J0IHNpZ25hdHVyZXMKZnJvbSAucGtnaW5mbyBpbXBvcnQgcmVhZF9wa2dfaW5mb19ieXRlcwpmcm9tIC51dGlsIGltcG9ydCBvcGVuX2Zvcl9jc3YKCmZyb20gLnBlcDQyNXRhZ3MgaW1wb3J0IGdldF9zdXBwb3J0ZWQKZnJvbSAucGF0aHMgaW1wb3J0IGdldF9pbnN0YWxsX3BhdGhzCgojIFRoZSBuZXh0IG1ham9yIHZlcnNpb24gYWZ0ZXIgdGhpcyB2ZXJzaW9uIG9mIHRoZSAnd2hlZWwnIHRvb2w6ClZFUlNJT05fVE9PX0hJR0ggPSAoMSwgMCkKCiMgTm9uLWdyZWVkeSBtYXRjaGluZyBvZiBhbiBvcHRpb25hbCBidWlsZCBudW1iZXIgbWF5IGJlIHRvbyBjbGV2ZXIgKG1vcmUKIyBpbnZhbGlkIHdoZWVsIGZpbGVuYW1lcyB3aWxsIG1hdGNoKS4gU2VwYXJhdGUgcmVnZXggZm9yIC5kaXN0LWluZm8/CldIRUVMX0lORk9fUkUgPSByZS5jb21waWxlKAogICAgciIiIl4oP1A8bmFtZXZlcj4oP1A8bmFtZT4uKz8pKC0oP1A8dmVyPlxkLis/KSk/KQogICAgKCgtKD9QPGJ1aWxkPlxkLio/KSk/LSg/UDxweXZlcj4uKz8pLSg/UDxhYmk+Lis/KS0oP1A8cGxhdD4uKz8pCiAgICBcLndobHxcLmRpc3QtaW5mbykkIiIiLAogICAgcmUuVkVSQk9TRSkubWF0Y2gKCmRlZiBwYXJzZV92ZXJzaW9uKHZlcnNpb24pOgogICAgIiIiVXNlIHBhcnNlX3ZlcnNpb24gZnJvbSBwa2dfcmVzb3VyY2VzIG9yIGRpc3R1dGlscyBhcyBhdmFpbGFibGUuIiIiCiAgICBnbG9iYWwgcGFyc2VfdmVyc2lvbgogICAgdHJ5OgogICAgICAgIGZyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgcGFyc2VfdmVyc2lvbgogICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgIGZyb20gZGlzdHV0aWxzLnZlcnNpb24gaW1wb3J0IExvb3NlVmVyc2lvbiBhcyBwYXJzZV92ZXJzaW9uCiAgICByZXR1cm4gcGFyc2VfdmVyc2lvbih2ZXJzaW9uKQoKY2xhc3MgQmFkV2hlZWxGaWxlKFZhbHVlRXJyb3IpOgogICAgcGFzcwoKCmNsYXNzIFdoZWVsRmlsZShvYmplY3QpOgogICAgIiIiUGFyc2Ugd2hlZWwtc3BlY2lmaWMgYXR0cmlidXRlcyBmcm9tIGEgd2hlZWwgKC53aGwpIGZpbGUgYW5kIG9mZmVyCiAgICBiYXNpYyBpbnN0YWxsYXRpb24gYW5kIHZlcmlmaWNhdGlvbiBzdXBwb3J0LgogICAgCiAgICBXaGVlbEZpbGUgY2FuIGJlIHVzZWQgdG8gc2ltcGx5IHBhcnNlIGEgd2hlZWwgZmlsZW5hbWUgYnkgYXZvaWRpbmcgdGhlCiAgICBtZXRob2RzIHRoYXQgcmVxdWlyZSB0aGUgYWN0dWFsIGZpbGUgY29udGVudHMuIiIiCgogICAgV0hFRUxfSU5GTyA9ICJXSEVFTCIKICAgIFJFQ09SRCA9ICJSRUNPUkQiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsCiAgICAgICAgICAgICAgICAgZmlsZW5hbWUsCiAgICAgICAgICAgICAgICAgZnA9Tm9uZSwKICAgICAgICAgICAgICAgICBhcHBlbmQ9RmFsc2UsCiAgICAgICAgICAgICAgICAgY29udGV4dD1nZXRfc3VwcG9ydGVkKToKICAgICAgICAiIiIKICAgICAgICA6cGFyYW0gZnA6IEEgc2Vla2FibGUgZmlsZS1saWtlIG9iamVjdCBvciBOb25lIHRvIG9wZW4oZmlsZW5hbWUpLgogICAgICAgIDpwYXJhbSBhcHBlbmQ6IE9wZW4gYXJjaGl2ZSBpbiBhcHBlbmQgbW9kZS4KICAgICAgICA6cGFyYW0gY29udGV4dDogRnVuY3Rpb24gcmV0dXJuaW5nIGxpc3Qgb2Ygc3VwcG9ydGVkIHRhZ3MuIFdoZWVscwogICAgICAgIG11c3QgaGF2ZSB0aGUgc2FtZSBjb250ZXh0IHRvIGJlIHNvcnRhYmxlLgogICAgICAgICIiIgogICAgICAgIHNlbGYuZmlsZW5hbWUgPSBmaWxlbmFtZQogICAgICAgIHNlbGYuZnAgPSBmcAogICAgICAgIHNlbGYuYXBwZW5kID0gYXBwZW5kCiAgICAgICAgc2VsZi5jb250ZXh0ID0gY29udGV4dAogICAgICAgIGJhc2VuYW1lID0gb3MucGF0aC5iYXNlbmFtZShmaWxlbmFtZSkKICAgICAgICBzZWxmLnBhcnNlZF9maWxlbmFtZSA9IFdIRUVMX0lORk9fUkUoYmFzZW5hbWUpCiAgICAgICAgaWYgbm90IGJhc2VuYW1lLmVuZHN3aXRoKCcud2hsJykgb3Igc2VsZi5wYXJzZWRfZmlsZW5hbWUgaXMgTm9uZToKICAgICAgICAgICAgcmFpc2UgQmFkV2hlZWxGaWxlKCJCYWQgZmlsZW5hbWUgJyVzJyIgJSBmaWxlbmFtZSkKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuZmlsZW5hbWUKCiAgICBAcHJvcGVydHkKICAgIGRlZiBkaXN0aW5mb19uYW1lKHNlbGYpOgogICAgICAgIHJldHVybiAiJXMuZGlzdC1pbmZvIiAlIHNlbGYucGFyc2VkX2ZpbGVuYW1lLmdyb3VwKCduYW1ldmVyJykKCiAgICBAcHJvcGVydHkKICAgIGRlZiBkYXRhZGlyX25hbWUoc2VsZik6CiAgICAgICAgcmV0dXJuICIlcy5kYXRhIiAlIHNlbGYucGFyc2VkX2ZpbGVuYW1lLmdyb3VwKCduYW1ldmVyJykKCiAgICBAcHJvcGVydHkKICAgIGRlZiByZWNvcmRfbmFtZShzZWxmKToKICAgICAgICByZXR1cm4gIiVzLyVzIiAlIChzZWxmLmRpc3RpbmZvX25hbWUsIHNlbGYuUkVDT1JEKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHdoZWVsaW5mb19uYW1lKHNlbGYpOgogICAgICAgIHJldHVybiAiJXMvJXMiICUgKHNlbGYuZGlzdGluZm9fbmFtZSwgc2VsZi5XSEVFTF9JTkZPKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHRhZ3Moc2VsZik6CiAgICAgICAgIiIiQSB3aGVlbCBmaWxlIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgQ2FydGVzaWFuIHByb2R1Y3Qgb2YgdGhlCiAgICAgICAgcGVyaW9kLWRlbGltaXRlZCB0YWdzIGluIGl0cyBmaWxlbmFtZS4KICAgICAgICBUbyBjaG9vc2UgYSB3aGVlbCBmaWxlIGFtb25nIHNldmVyYWwgY2FuZGlkYXRlcyBoYXZpbmcgdGhlIHNhbWUKICAgICAgICBkaXN0cmlidXRpb24gdmVyc2lvbiAndmVyJywgYW4gaW5zdGFsbGVyIHJhbmtzIGVhY2ggdHJpcGxlIG9mCiAgICAgICAgKHB5dmVyLCBhYmksIHBsYXQpIHRoYXQgaXRzIFB5dGhvbiBpbnN0YWxsYXRpb24gY2FuIHJ1biwgc29ydGluZwogICAgICAgIHRoZSB3aGVlbHMgYnkgdGhlIGJlc3QtcmFua2VkIHRhZyBpdCBzdXBwb3J0cyBhbmQgdGhlbiBieSB0aGVpcgogICAgICAgIGFyaXR5IHdoaWNoIGlzIGp1c3QgbGVuKGxpc3QoY29tcGF0aWJpbGl0eV90YWdzKSkuCiAgICAgICAgIiIiCiAgICAgICAgdGFncyA9IHNlbGYucGFyc2VkX2ZpbGVuYW1lLmdyb3VwZGljdCgpCiAgICAgICAgZm9yIHB5dmVyIGluIHRhZ3NbJ3B5dmVyJ10uc3BsaXQoJy4nKToKICAgICAgICAgICAgZm9yIGFiaSBpbiB0YWdzWydhYmknXS5zcGxpdCgnLicpOgogICAgICAgICAgICAgICAgZm9yIHBsYXQgaW4gdGFnc1sncGxhdCddLnNwbGl0KCcuJyk6CiAgICAgICAgICAgICAgICAgICAgeWllbGQgKHB5dmVyLCBhYmksIHBsYXQpCgogICAgY29tcGF0aWJpbGl0eV90YWdzID0gdGFncwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGFyaXR5KHNlbGYpOgogICAgICAgICIiIlRoZSBudW1iZXIgb2YgY29tcGF0aWJpbGl0eSB0YWdzIHRoZSB3aGVlbCBkZWNsYXJlcy4iIiIKICAgICAgICByZXR1cm4gbGVuKGxpc3Qoc2VsZi5jb21wYXRpYmlsaXR5X3RhZ3MpKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHJhbmsoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTG93ZXN0IGluZGV4IG9mIGFueSBvZiB0aGlzIHdoZWVsJ3MgdGFncyBpbiBzZWxmLmNvbnRleHQoKSwgYW5kIHRoZQogICAgICAgIGFyaXR5IGUuZy4gKDAsIDEpCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuY29tcGF0aWJpbGl0eV9yYW5rKHNlbGYuY29udGV4dCgpKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGNvbXBhdGlibGUoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYucmFua1swXSAhPSBfYmlnX251bWJlciAgIyBiYWQgQVBJIQoKICAgICMgZGVwcmVjYXRlZDoKICAgIGRlZiBjb21wYXRpYmlsaXR5X3Jhbmsoc2VsZiwgc3VwcG9ydGVkKToKICAgICAgICAiIiJSYW5rIHRoZSB3aGVlbCBhZ2FpbnN0IHRoZSBzdXBwb3J0ZWQgdGFncy4gU21hbGxlciByYW5rcyBhcmUgbW9yZQogICAgICAgIGNvbXBhdGlibGUhCgogICAgICAgIDpwYXJhbSBzdXBwb3J0ZWQ6IEEgbGlzdCBvZiBjb21wYXRpYmlsaXR5IHRhZ3MgdGhhdCB0aGUgY3VycmVudAogICAgICAgICAgICBQeXRob24gaW1wbGVtZW5hdGlvbiBjYW4gcnVuLgogICAgICAgICIiIgogICAgICAgIHByZWZlcmVuY2VzID0gW10KICAgICAgICBmb3IgdGFnIGluIHNlbGYuY29tcGF0aWJpbGl0eV90YWdzOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBwcmVmZXJlbmNlcy5hcHBlbmQoc3VwcG9ydGVkLmluZGV4KHRhZykpCiAgICAgICAgICAgICMgVGFnIG5vdCBwcmVzZW50CiAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgICAgcGFzcwogICAgICAgIGlmIGxlbihwcmVmZXJlbmNlcyk6CiAgICAgICAgICAgIHJldHVybiAobWluKHByZWZlcmVuY2VzKSwgc2VsZi5hcml0eSkKICAgICAgICByZXR1cm4gKF9iaWdfbnVtYmVyLCAwKQoKICAgICMgZGVwcmVjYXRlZAogICAgZGVmIHN1cHBvcnRzX2N1cnJlbnRfcHl0aG9uKHNlbGYsIHgpOgogICAgICAgIGFzc2VydCBzZWxmLmNvbnRleHQgPT0geCwgJ2NvbnRleHQgbWlzbWF0Y2gnCiAgICAgICAgcmV0dXJuIHNlbGYuY29tcGF0aWJsZQoKICAgICMgQ29tcGFyYWJpbGl0eS4KICAgICMgV2hlZWxzIGFyZSBlcXVhbCBpZiB0aGV5IHJlZmVyIHRvIHRoZSBzYW1lIGZpbGUuCiAgICAjIElmIHR3byB3aGVlbHMgYXJlIG5vdCBlcXVhbCwgY29tcGFyZSBiYXNlZCBvbiAoaW4gdGhpcyBvcmRlcik6CiAgICAjICAgMS4gTmFtZQogICAgIyAgIDIuIFZlcnNpb24KICAgICMgICAzLiBDb21wYXRpYmlsaXR5IHJhbmsKICAgICMgICA0LiBGaWxlbmFtZSAoYXMgYSB0aWVicmVha2VyKQogICAgQHByb3BlcnR5CiAgICBkZWYgX3NvcnRfa2V5KHNlbGYpOgogICAgICAgIHJldHVybiAoc2VsZi5wYXJzZWRfZmlsZW5hbWUuZ3JvdXAoJ25hbWUnKSwKICAgICAgICAgICAgICAgIHBhcnNlX3ZlcnNpb24oc2VsZi5wYXJzZWRfZmlsZW5hbWUuZ3JvdXAoJ3ZlcicpKSwKICAgICAgICAgICAgICAgIHR1cGxlKC14IGZvciB4IGluIHNlbGYucmFuayksCiAgICAgICAgICAgICAgICBzZWxmLmZpbGVuYW1lKQoKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmLmZpbGVuYW1lID09IG90aGVyLmZpbGVuYW1lCgogICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYuZmlsZW5hbWUgIT0gb3RoZXIuZmlsZW5hbWUKCiAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBzZWxmLmNvbnRleHQgIT0gb3RoZXIuY29udGV4dDoKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJ7MH0uY29udGV4dCAhPSB7MX0uY29udGV4dCIuZm9ybWF0KHNlbGYsIG90aGVyKSkKCiAgICAgICAgcmV0dXJuIHNlbGYuX3NvcnRfa2V5IDwgb3RoZXIuX3NvcnRfa2V5CgogICAgICAgICMgWFhYIHBydW5lCgogICAgICAgIHNuID0gc2VsZi5wYXJzZWRfZmlsZW5hbWUuZ3JvdXAoJ25hbWUnKQogICAgICAgIG9uID0gb3RoZXIucGFyc2VkX2ZpbGVuYW1lLmdyb3VwKCduYW1lJykKICAgICAgICBpZiBzbiAhPSBvbjoKICAgICAgICAgICAgcmV0dXJuIHNuIDwgb24KICAgICAgICBzdiA9IHBhcnNlX3ZlcnNpb24oc2VsZi5wYXJzZWRfZmlsZW5hbWUuZ3JvdXAoJ3ZlcicpKQogICAgICAgIG92ID0gcGFyc2VfdmVyc2lvbihvdGhlci5wYXJzZWRfZmlsZW5hbWUuZ3JvdXAoJ3ZlcicpKQogICAgICAgIGlmIHN2ICE9IG92OgogICAgICAgICAgICByZXR1cm4gc3YgPCBvdgogICAgICAgICMgQ29tcGF0aWJpbGl0eQogICAgICAgIGlmIHNlbGYuY29udGV4dCAhPSBvdGhlci5jb250ZXh0OgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoInswfS5jb250ZXh0ICE9IHsxfS5jb250ZXh0Ii5mb3JtYXQoc2VsZiwgb3RoZXIpKQogICAgICAgIHNjID0gc2VsZi5yYW5rCiAgICAgICAgb2MgPSBvdGhlci5yYW5rCiAgICAgICAgaWYgc2MgIT0gTm9uZSBhbmQgb2MgIT0gTm9uZSBhbmQgc2MgIT0gb2M6CiAgICAgICAgICAgICMgU21hbGxlciBjb21wYXRpYmlsaXR5IHJhbmtzIGFyZSAiYmV0dGVyIiB0aGFuIGxhcmdlciBvbmVzLAogICAgICAgICAgICAjIHNvIHdlIGhhdmUgdG8gcmV2ZXJzZSB0aGUgc2Vuc2Ugb2YgdGhlIGNvbXBhcmlzb24gaGVyZSEKICAgICAgICAgICAgcmV0dXJuIHNjID4gb2MKICAgICAgICBlbGlmIHNjID09IE5vbmUgYW5kIG9jICE9IE5vbmU6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIHJldHVybiBzZWxmLmZpbGVuYW1lIDwgb3RoZXIuZmlsZW5hbWUKCiAgICBkZWYgX19ndF9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gb3RoZXIgPCBzZWxmCgogICAgZGVmIF9fbGVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYgPT0gb3RoZXIgb3Igc2VsZiA8IG90aGVyCgogICAgZGVmIF9fZ2VfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYgPT0gb3RoZXIgb3Igb3RoZXIgPCBzZWxmCgogICAgIwogICAgIyBNZXRob2RzIHVzaW5nIHRoZSBmaWxlJ3MgY29udGVudHM6CiAgICAjCgogICAgQHJlaWZ5CiAgICBkZWYgemlwZmlsZShzZWxmKToKICAgICAgICBtb2RlID0gInIiCiAgICAgICAgaWYgc2VsZi5hcHBlbmQ6CiAgICAgICAgICAgIG1vZGUgPSAiYSIKICAgICAgICB2emYgPSBWZXJpZnlpbmdaaXBGaWxlKHNlbGYuZnAgaWYgc2VsZi5mcCBlbHNlIHNlbGYuZmlsZW5hbWUsIG1vZGUpCiAgICAgICAgaWYgbm90IHNlbGYuYXBwZW5kOgogICAgICAgICAgICBzZWxmLnZlcmlmeSh2emYpCiAgICAgICAgcmV0dXJuIHZ6ZgoKICAgIEByZWlmeQogICAgZGVmIHBhcnNlZF93aGVlbF9pbmZvKHNlbGYpOgogICAgICAgICIiIlBhcnNlIHdoZWVsIG1ldGFkYXRhICh0aGUgLmRhdGEvV0hFRUwgZmlsZSkiIiIKICAgICAgICByZXR1cm4gcmVhZF9wa2dfaW5mb19ieXRlcyhzZWxmLnppcGZpbGUucmVhZChzZWxmLndoZWVsaW5mb19uYW1lKSkKCiAgICBkZWYgY2hlY2tfdmVyc2lvbihzZWxmKToKICAgICAgICB2ZXJzaW9uID0gc2VsZi5wYXJzZWRfd2hlZWxfaW5mb1snV2hlZWwtVmVyc2lvbiddCiAgICAgICAgaWYgdHVwbGUobWFwKGludCwgdmVyc2lvbi5zcGxpdCgnLicpKSkgPj0gVkVSU0lPTl9UT09fSElHSDoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiV2hlZWwgdmVyc2lvbiBpcyB0b28gaGlnaCIpCgogICAgQHJlaWZ5CiAgICBkZWYgaW5zdGFsbF9wYXRocyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBDb25zdWx0IGRpc3R1dGlscyB0byBnZXQgdGhlIGluc3RhbGwgcGF0aHMgZm9yIG91ciBkaXN0LiAgQSBkaWN0IHdpdGgKICAgICAgICAoJ3B1cmVsaWInLCAncGxhdGxpYicsICdoZWFkZXJzJywgJ3NjcmlwdHMnLCAnZGF0YScpLgogICAgICAgIAogICAgICAgIFdlIHVzZSB0aGUgbmFtZSBmcm9tIG91ciBmaWxlbmFtZSBhcyB0aGUgZGlzdCBuYW1lLCB3aGljaCBtZWFucyBoZWFkZXJzCiAgICAgICAgY291bGQgYmUgaW5zdGFsbGVkIGluIHRoZSB3cm9uZyBwbGFjZSBpZiB0aGUgZmlsZXN5c3RlbS1lc2NhcGVkIG5hbWUKICAgICAgICBpcyBkaWZmZXJlbnQgdGhhbiB0aGUgTmFtZS4gIFdobyBjYXJlcz8gCiAgICAgICAgIiIiCiAgICAgICAgbmFtZSA9IHNlbGYucGFyc2VkX2ZpbGVuYW1lLmdyb3VwKCduYW1lJykKICAgICAgICByZXR1cm4gZ2V0X2luc3RhbGxfcGF0aHMobmFtZSkKCiAgICBkZWYgaW5zdGFsbChzZWxmLCBmb3JjZT1GYWxzZSwgb3ZlcnJpZGVzPXt9KToKICAgICAgICAiIiIKICAgICAgICBJbnN0YWxsIHRoZSB3aGVlbCBpbnRvIHNpdGUtcGFja2FnZXMuCiAgICAgICAgIiIiCgogICAgICAgICMgVXRpbGl0eSB0byBnZXQgdGhlIHRhcmdldCBkaXJlY3RvcnkgZm9yIGEgcGFydGljdWxhciBrZXkKICAgICAgICBkZWYgZ2V0X3BhdGgoa2V5KToKICAgICAgICAgICAgcmV0dXJuIG92ZXJyaWRlcy5nZXQoa2V5KSBvciBzZWxmLmluc3RhbGxfcGF0aHNba2V5XQoKICAgICAgICAjIFRoZSBiYXNlIHRhcmdldCBsb2NhdGlvbiBpcyBlaXRoZXIgcHVyZWxpYiBvciBwbGF0bGliCiAgICAgICAgaWYgc2VsZi5wYXJzZWRfd2hlZWxfaW5mb1snUm9vdC1Jcy1QdXJlbGliJ10gPT0gJ3RydWUnOgogICAgICAgICAgICByb290ID0gZ2V0X3BhdGgoJ3B1cmVsaWInKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJvb3QgPSBnZXRfcGF0aCgncGxhdGxpYicpCgogICAgICAgICMgUGFyc2UgYWxsIHRoZSBuYW1lcyBpbiB0aGUgYXJjaGl2ZQogICAgICAgIG5hbWVfdHJhbnMgPSB7fQogICAgICAgIGZvciBpbmZvIGluIHNlbGYuemlwZmlsZS5pbmZvbGlzdCgpOgogICAgICAgICAgICBuYW1lID0gaW5mby5maWxlbmFtZQogICAgICAgICAgICAjIFppcCBmaWxlcyBjYW4gY29udGFpbiBlbnRyaWVzIHJlcHJlc2VudGluZyBkaXJlY3Rvcmllcy4KICAgICAgICAgICAgIyBUaGVzZSBlbmQgaW4gYSAnLycuCiAgICAgICAgICAgICMgV2UgaWdub3JlIHRoZXNlLCBhcyB3ZSBjcmVhdGUgZGlyZWN0b3JpZXMgb24gZGVtYW5kLgogICAgICAgICAgICBpZiBuYW1lLmVuZHN3aXRoKCcvJyk6CiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgIyBQYXRobmFtZXMgaW4gYSB6aXBmaWxlIG5hbWVsaXN0IGFyZSBhbHdheXMgLy1zZXBhcmF0ZWQuCiAgICAgICAgICAgICMgSW4gdGhlb3J5LCBwYXRocyBjb3VsZCBzdGFydCB3aXRoIC4vIG9yIGhhdmUgb3RoZXIgb2RkaXRpZXMKICAgICAgICAgICAgIyBidXQgdGhpcyB3b24ndCBoYXBwZW4gaW4gcHJhY3RpY2FsIGNhc2VzIG9mIHdlbGwtZm9ybWVkIHdoZWVscy4KICAgICAgICAgICAgIyBXZSdsbCBjb3ZlciB0aGUgc2ltcGxlIGNhc2Ugb2YgYW4gaW5pdGlhbCAnLi8nIGFzIGl0J3MgYm90aCBlYXN5CiAgICAgICAgICAgICMgdG8gZG8gYW5kIG1vcmUgY29tbW9uIHRoYW4gbW9zdCBvdGhlciBvZGRpdGllcy4KICAgICAgICAgICAgaWYgbmFtZS5zdGFydHN3aXRoKCcuLycpOgogICAgICAgICAgICAgICAgbmFtZSA9IG5hbWVbMjpdCgogICAgICAgICAgICAjIFNwbGl0IG9mZiB0aGUgYmFzZSBkaXJlY3RvcnkgdG8gaWRlbnRpZnkgZmlsZXMgdGhhdCBhcmUgdG8gYmUKICAgICAgICAgICAgIyBpbnN0YWxsZWQgaW4gbm9uLXJvb3QgbG9jYXRpb25zCiAgICAgICAgICAgIGJhc2VkaXIsIHNlcCwgZmlsZW5hbWUgPSBuYW1lLnBhcnRpdGlvbignLycpCiAgICAgICAgICAgIGlmIHNlcCBhbmQgYmFzZWRpciA9PSBzZWxmLmRhdGFkaXJfbmFtZToKICAgICAgICAgICAgICAgICMgRGF0YSBmaWxlLiBUYXJnZXQgZGVzdGluYXRpb24gaXMgZWxzZXdoZXJlCiAgICAgICAgICAgICAgICBrZXksIHNlcCwgZmlsZW5hbWUgPSBmaWxlbmFtZS5wYXJ0aXRpb24oJy8nKQogICAgICAgICAgICAgICAgaWYgbm90IHNlcDoKICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJJbnZhbGlkIGZpbGVuYW1lIGluIHdoZWVsOiB7MH0iLmZvcm1hdChuYW1lKSkKICAgICAgICAgICAgICAgIHRhcmdldCA9IGdldF9wYXRoKGtleSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgTm9ybWFsIGZpbGUuIFRhcmdldCBkZXN0aW5hdGlvbiBpcyByb290CiAgICAgICAgICAgICAgICBrZXkgPSAnJwogICAgICAgICAgICAgICAgdGFyZ2V0ID0gcm9vdAogICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBuYW1lCgogICAgICAgICAgICAjIE1hcCB0aGUgYWN0dWFsIGZpbGVuYW1lIGZyb20gdGhlIHppcGZpbGUgdG8gaXRzIGludGVuZGVkIHRhcmdldAogICAgICAgICAgICAjIGRpcmVjdG9yeSBhbmQgdGhlIHBhdGhuYW1lIHJlbGF0aXZlIHRvIHRoYXQgZGlyZWN0b3J5LgogICAgICAgICAgICBkZXN0ID0gb3MucGF0aC5ub3JtcGF0aChvcy5wYXRoLmpvaW4odGFyZ2V0LCBmaWxlbmFtZSkpCiAgICAgICAgICAgIG5hbWVfdHJhbnNbaW5mb10gPSAoa2V5LCB0YXJnZXQsIGZpbGVuYW1lLCBkZXN0KQoKICAgICAgICAjIFdlJ3JlIG5vdyByZWFkeSB0byBzdGFydCBwcm9jZXNzaW5nIHRoZSBhY3R1YWwgaW5zdGFsbC4gVGhlIHByb2Nlc3MKICAgICAgICAjIGlzIGFzIGZvbGxvd3M6CiAgICAgICAgIyAgIDEuIFByZWNoZWNrcyAtIGlzIHRoZSB3aGVlbCB2YWxpZCwgaXMgaXRzIGRlY2xhcmVkIGFyY2hpdGVjdHVyZQogICAgICAgICMgICAgICBPSywgZXRjLiBbW1Jlc3BvbnNpYmlsaXR5IG9mIHRoZSBjYWxsZXJdXQogICAgICAgICMgICAyLiBPdmVyd3JpdGUgY2hlY2sgLSBkbyBhbnkgb2YgdGhlIGZpbGVzIHRvIGJlIGluc3RhbGxlZCBhbHJlYWR5CiAgICAgICAgIyAgICAgIGV4aXN0PwogICAgICAgICMgICAzLiBBY3R1YWwgaW5zdGFsbCAtIHB1dCB0aGUgZmlsZXMgaW4gdGhlaXIgdGFyZ2V0IGxvY2F0aW9ucy4KICAgICAgICAjICAgNC4gVXBkYXRlIFJFQ09SRCAtIHdyaXRlIGEgc3VpdGFibHkgbW9kaWZpZWQgUkVDT1JEIGZpbGUgdG8KICAgICAgICAjICAgICAgcmVmbGVjdCB0aGUgYWN0dWFsIGluc3RhbGxlZCBwYXRocy4KCiAgICAgICAgaWYgbm90IGZvcmNlOgogICAgICAgICAgICBmb3IgaW5mbywgdiBpbiBuYW1lX3RyYW5zLml0ZW1zKCk6CiAgICAgICAgICAgICAgICBrID0gaW5mby5maWxlbmFtZQogICAgICAgICAgICAgICAga2V5LCB0YXJnZXQsIGZpbGVuYW1lLCBkZXN0ID0gdgogICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoZGVzdCk6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiV2hlZWwgZmlsZSB7MH0gd291bGQgb3ZlcndyaXRlIHsxfS4gVXNlIGZvcmNlIGlmIHRoaXMgaXMgaW50ZW5kZWQiLmZvcm1hdChrLCBkZXN0KSkKCiAgICAgICAgIyBHZXQgdGhlIG5hbWUgb2Ygb3VyIGV4ZWN1dGFibGUsIGZvciB1c2Ugd2hlbiByZXBsYWNpbmcgc2NyaXB0CiAgICAgICAgIyB3cmFwcGVyIGhhc2hiYW5nIGxpbmVzLgogICAgICAgICMgV2UgZW5jb2RlIGl0IHVzaW5nIGdldGZpbGVzeXN0ZW1lbmNvZGluZywgYXMgdGhhdCBpcyAidGhlIG5hbWUgb2YKICAgICAgICAjIHRoZSBlbmNvZGluZyB1c2VkIHRvIGNvbnZlcnQgVW5pY29kZSBmaWxlbmFtZXMgaW50byBzeXN0ZW0gZmlsZQogICAgICAgICMgbmFtZXMiLgogICAgICAgIGV4ZW5hbWUgPSBzeXMuZXhlY3V0YWJsZS5lbmNvZGUoc3lzLmdldGZpbGVzeXN0ZW1lbmNvZGluZygpKQogICAgICAgIHJlY29yZF9kYXRhID0gW10KICAgICAgICByZWNvcmRfbmFtZSA9IHNlbGYuZGlzdGluZm9fbmFtZSArICcvUkVDT1JEJwogICAgICAgIGZvciBpbmZvLCAoa2V5LCB0YXJnZXQsIGZpbGVuYW1lLCBkZXN0KSBpbiBuYW1lX3RyYW5zLml0ZW1zKCk6CiAgICAgICAgICAgIG5hbWUgPSBpbmZvLmZpbGVuYW1lCiAgICAgICAgICAgIHNvdXJjZSA9IHNlbGYuemlwZmlsZS5vcGVuKGluZm8pCiAgICAgICAgICAgICMgU2tpcCB0aGUgUkVDT1JEIGZpbGUKICAgICAgICAgICAgaWYgbmFtZSA9PSByZWNvcmRfbmFtZToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGRkaXIgPSBvcy5wYXRoLmRpcm5hbWUoZGVzdCkKICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguaXNkaXIoZGRpcik6CiAgICAgICAgICAgICAgICBvcy5tYWtlZGlycyhkZGlyKQogICAgICAgICAgICBkZXN0aW5hdGlvbiA9IEhhc2hpbmdGaWxlKG9wZW4oZGVzdCwgJ3diJykpCiAgICAgICAgICAgIGlmIGtleSA9PSAnc2NyaXB0cyc6CiAgICAgICAgICAgICAgICBoYXNoYmFuZyA9IHNvdXJjZS5yZWFkbGluZSgpCiAgICAgICAgICAgICAgICBpZiBoYXNoYmFuZy5zdGFydHN3aXRoKGInIyFweXRob24nKToKICAgICAgICAgICAgICAgICAgICBoYXNoYmFuZyA9IGInIyEnICsgZXhlbmFtZSArIGJpbmFyeShvcy5saW5lc2VwKQogICAgICAgICAgICAgICAgZGVzdGluYXRpb24ud3JpdGUoaGFzaGJhbmcpCiAgICAgICAgICAgIHNodXRpbC5jb3B5ZmlsZW9iaihzb3VyY2UsIGRlc3RpbmF0aW9uKQogICAgICAgICAgICByZWxkZXN0ID0gb3MucGF0aC5yZWxwYXRoKGRlc3QsIHJvb3QpCiAgICAgICAgICAgIHJlbGRlc3QucmVwbGFjZShvcy5zZXAsICcvJykKICAgICAgICAgICAgcmVjb3JkX2RhdGEuYXBwZW5kKChyZWxkZXN0LCBkZXN0aW5hdGlvbi5kaWdlc3QoKSwgZGVzdGluYXRpb24ubGVuZ3RoKSkKICAgICAgICAgICAgZGVzdGluYXRpb24uY2xvc2UoKQogICAgICAgICAgICBzb3VyY2UuY2xvc2UoKQogICAgICAgICAgICAjIHByZXNlcnZlIGF0dHJpYnV0ZXMgKGVzcGVjaWFsbHkgK3ggYml0IGZvciBzY3JpcHRzKQogICAgICAgICAgICBhdHRycyA9IGluZm8uZXh0ZXJuYWxfYXR0ciA+PiAxNgogICAgICAgICAgICBpZiBhdHRyczogICMgdGVuZHMgdG8gYmUgMCBpZiBXaW5kb3dzLgogICAgICAgICAgICAgICAgb3MuY2htb2QoZGVzdCwgaW5mby5leHRlcm5hbF9hdHRyID4+IDE2KQoKICAgICAgICByZWNvcmRfbmFtZSA9IG9zLnBhdGguam9pbihyb290LCBzZWxmLnJlY29yZF9uYW1lKQogICAgICAgIHdpdGggb3Blbl9mb3JfY3N2KHJlY29yZF9uYW1lLCAndysnKSBhcyByZWNvcmRfZmlsZToKICAgICAgICAgICAgd3JpdGVyID0gY3N2LndyaXRlcihyZWNvcmRfZmlsZSkKICAgICAgICAgICAgZm9yIHJlbGRlc3QsIGRpZ2VzdCwgbGVuZ3RoIGluIHNvcnRlZChyZWNvcmRfZGF0YSk6CiAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVyb3coKHJlbGRlc3QsIGRpZ2VzdCwgbGVuZ3RoKSkKICAgICAgICAgICAgd3JpdGVyLndyaXRlcm93KChzZWxmLnJlY29yZF9uYW1lLCAnJywgJycpKQoKICAgIGRlZiB2ZXJpZnkoc2VsZiwgemlwZmlsZT1Ob25lKToKICAgICAgICAiIiJDb25maWd1cmUgdGhlIFZlcmlmeWluZ1ppcEZpbGUgYHppcGZpbGVgIGJ5IHZlcmlmeWluZyBpdHMgc2lnbmF0dXJlIAogICAgICAgIGFuZCBzZXR0aW5nIGV4cGVjdGVkIGhhc2hlcyBmb3IgZXZlcnkgaGFzaCBpbiBSRUNPUkQuCiAgICAgICAgQ2FsbGVyIG11c3QgY29tcGxldGUgdGhlIHZlcmlmaWNhdGlvbiBwcm9jZXNzIGJ5IGNvbXBsZXRlbHkgcmVhZGluZyAKICAgICAgICBldmVyeSBmaWxlIGluIHRoZSBhcmNoaXZlIChlLmcuIHdpdGggZXh0cmFjdGFsbCkuIiIiCiAgICAgICAgc2lnID0gTm9uZQogICAgICAgIGlmIHppcGZpbGUgaXMgTm9uZToKICAgICAgICAgICAgemlwZmlsZSA9IHNlbGYuemlwZmlsZQogICAgICAgIHppcGZpbGUuc3RyaWN0ID0gVHJ1ZQoKICAgICAgICByZWNvcmRfbmFtZSA9ICcvJy5qb2luKChzZWxmLmRpc3RpbmZvX25hbWUsICdSRUNPUkQnKSkKICAgICAgICBzaWdfbmFtZSA9ICcvJy5qb2luKChzZWxmLmRpc3RpbmZvX25hbWUsICdSRUNPUkQuandzJykpCiAgICAgICAgIyB0b2xlcmF0ZSBzL21pbWUgc2lnbmF0dXJlczoKICAgICAgICBzbWltZV9zaWdfbmFtZSA9ICcvJy5qb2luKChzZWxmLmRpc3RpbmZvX25hbWUsICdSRUNPUkQucDdzJykpCiAgICAgICAgemlwZmlsZS5zZXRfZXhwZWN0ZWRfaGFzaChyZWNvcmRfbmFtZSwgTm9uZSkKICAgICAgICB6aXBmaWxlLnNldF9leHBlY3RlZF9oYXNoKHNpZ19uYW1lLCBOb25lKQogICAgICAgIHppcGZpbGUuc2V0X2V4cGVjdGVkX2hhc2goc21pbWVfc2lnX25hbWUsIE5vbmUpCiAgICAgICAgcmVjb3JkID0gemlwZmlsZS5yZWFkKHJlY29yZF9uYW1lKQoKICAgICAgICByZWNvcmRfZGlnZXN0ID0gdXJsc2FmZV9iNjRlbmNvZGUoaGFzaGxpYi5zaGEyNTYocmVjb3JkKS5kaWdlc3QoKSkKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNpZyA9IGZyb21fanNvbihuYXRpdmUoemlwZmlsZS5yZWFkKHNpZ19uYW1lKSkpCiAgICAgICAgZXhjZXB0IEtleUVycm9yOiAgIyBubyBzaWduYXR1cmUKICAgICAgICAgICAgcGFzcwogICAgICAgIGlmIHNpZzoKICAgICAgICAgICAgaGVhZGVycywgcGF5bG9hZCA9IHNpZ25hdHVyZXMudmVyaWZ5KHNpZykKICAgICAgICAgICAgaWYgcGF5bG9hZFsnaGFzaCddICE9ICJzaGEyNTY9IiArIG5hdGl2ZShyZWNvcmRfZGlnZXN0KToKICAgICAgICAgICAgICAgIG1zZyA9ICJSRUNPUkQuc2lnIGNsYWltZWQgUkVDT1JEIGhhc2ggezB9ICE9IGNvbXB1dGVkIGhhc2ggezF9LiIKICAgICAgICAgICAgICAgIHJhaXNlIEJhZFdoZWVsRmlsZShtc2cuZm9ybWF0KHBheWxvYWRbJ2hhc2gnXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZShyZWNvcmRfZGlnZXN0KSkpCgogICAgICAgIHJlYWRlciA9IGNzdi5yZWFkZXIoKG5hdGl2ZShyKSBmb3IgciBpbiByZWNvcmQuc3BsaXRsaW5lcygpKSkKCiAgICAgICAgZm9yIHJvdyBpbiByZWFkZXI6CiAgICAgICAgICAgIGZpbGVuYW1lID0gcm93WzBdCiAgICAgICAgICAgIGhhc2ggPSByb3dbMV0KICAgICAgICAgICAgaWYgbm90IGhhc2g6CiAgICAgICAgICAgICAgICBpZiBmaWxlbmFtZSBub3QgaW4gKHJlY29yZF9uYW1lLCBzaWdfbmFtZSk6CiAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiJXMgaGFzIG5vIGhhc2ghXG4iICUgZmlsZW5hbWUpCiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBhbGdvLCBkYXRhID0gcm93WzFdLnNwbGl0KCc9JywgMSkKICAgICAgICAgICAgYXNzZXJ0IGFsZ28gPT0gInNoYTI1NiIsICJVbnN1cHBvcnRlZCBoYXNoIGFsZ29yaXRobSIKICAgICAgICAgICAgemlwZmlsZS5zZXRfZXhwZWN0ZWRfaGFzaChmaWxlbmFtZSwgdXJsc2FmZV9iNjRkZWNvZGUoYmluYXJ5KGRhdGEpKSkKCgpjbGFzcyBWZXJpZnlpbmdaaXBGaWxlKHppcGZpbGUuWmlwRmlsZSk6CiAgICAiIiJaaXBGaWxlIHRoYXQgY2FuIGFzc2VydCB0aGF0IGVhY2ggb2YgaXRzIGV4dHJhY3RlZCBjb250ZW50cyBtYXRjaGVzCiAgICBhbiBleHBlY3RlZCBzaGEyNTYgaGFzaC4gTm90ZSB0aGF0IGVhY2ggZmlsZSBtdXN0IGJlIGNvbXBsZXRseSByZWFkIGluIAogICAgb3JkZXIgZm9yIGl0cyBoYXNoIHRvIGJlIGNoZWNrZWQuIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGUsIG1vZGU9InIiLAogICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uPXppcGZpbGUuWklQX1NUT1JFRCwKICAgICAgICAgICAgICAgICBhbGxvd1ppcDY0PUZhbHNlKToKICAgICAgICB6aXBmaWxlLlppcEZpbGUuX19pbml0X18oc2VsZiwgZmlsZSwgbW9kZSwgY29tcHJlc3Npb24sIGFsbG93WmlwNjQpCgogICAgICAgIHNlbGYuc3RyaWN0ID0gRmFsc2UKICAgICAgICBzZWxmLl9leHBlY3RlZF9oYXNoZXMgPSB7fQogICAgICAgIHNlbGYuX2hhc2hfYWxnb3JpdGhtID0gaGFzaGxpYi5zaGEyNTYKCiAgICBkZWYgc2V0X2V4cGVjdGVkX2hhc2goc2VsZiwgbmFtZSwgaGFzaCk6CiAgICAgICAgIiIiCiAgICAgICAgOnBhcmFtIG5hbWU6IG5hbWUgb2YgemlwIGVudHJ5CiAgICAgICAgOnBhcmFtIGhhc2g6IGJ5dGVzIG9mIGhhc2ggKG9yIE5vbmUgZm9yICJkb24ndCBjYXJlIikKICAgICAgICAiIiIKICAgICAgICBzZWxmLl9leHBlY3RlZF9oYXNoZXNbbmFtZV0gPSBoYXNoCgogICAgZGVmIG9wZW4oc2VsZiwgbmFtZV9vcl9pbmZvLCBtb2RlPSJyIiwgcHdkPU5vbmUpOgogICAgICAgICIiIlJldHVybiBmaWxlLWxpa2Ugb2JqZWN0IGZvciAnbmFtZScuIiIiCiAgICAgICAgIyBBIG5vbi1tb25rZXktcGF0Y2hlZCB2ZXJzaW9uIHdvdWxkIGNvbnRhaW4gbW9zdCBvZiB6aXBmaWxlLnB5CiAgICAgICAgZWYgPSB6aXBmaWxlLlppcEZpbGUub3BlbihzZWxmLCBuYW1lX29yX2luZm8sIG1vZGUsIHB3ZCkKICAgICAgICBpZiBpc2luc3RhbmNlKG5hbWVfb3JfaW5mbywgemlwZmlsZS5aaXBJbmZvKToKICAgICAgICAgICAgbmFtZSA9IG5hbWVfb3JfaW5mby5maWxlbmFtZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG5hbWUgPSBuYW1lX29yX2luZm8KICAgICAgICBpZiAobmFtZSBpbiBzZWxmLl9leHBlY3RlZF9oYXNoZXMKICAgICAgICAgICAgYW5kIHNlbGYuX2V4cGVjdGVkX2hhc2hlc1tuYW1lXSAhPSBOb25lKToKICAgICAgICAgICAgZXhwZWN0ZWRfaGFzaCA9IHNlbGYuX2V4cGVjdGVkX2hhc2hlc1tuYW1lXQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBfdXBkYXRlX2NyY19vcmlnID0gZWYuX3VwZGF0ZV9jcmMKICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybignTmVlZCBaaXBFeHRGaWxlLl91cGRhdGVfY3JjIHRvIGltcGxlbWVudCAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmaWxlIGhhc2ggdmVyaWZpY2F0aW9uIChpbiBQeXRob24gPj0gMi43KScpCiAgICAgICAgICAgICAgICByZXR1cm4gZWYKICAgICAgICAgICAgcnVubmluZ19oYXNoID0gc2VsZi5faGFzaF9hbGdvcml0aG0oKQogICAgICAgICAgICBpZiBoYXNhdHRyKGVmLCAnX2VvZicpOiAgIyBweTMzCiAgICAgICAgICAgICAgICBkZWYgX3VwZGF0ZV9jcmMoZGF0YSk6CiAgICAgICAgICAgICAgICAgICAgX3VwZGF0ZV9jcmNfb3JpZyhkYXRhKQogICAgICAgICAgICAgICAgICAgIHJ1bm5pbmdfaGFzaC51cGRhdGUoZGF0YSkKICAgICAgICAgICAgICAgICAgICBpZiBlZi5fZW9mIGFuZCBydW5uaW5nX2hhc2guZGlnZXN0KCkgIT0gZXhwZWN0ZWRfaGFzaDoKICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgQmFkV2hlZWxGaWxlKCJCYWQgaGFzaCBmb3IgZmlsZSAlciIgJSBlZi5uYW1lKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgZGVmIF91cGRhdGVfY3JjKGRhdGEsIGVvZj1Ob25lKToKICAgICAgICAgICAgICAgICAgICBfdXBkYXRlX2NyY19vcmlnKGRhdGEsIGVvZj1lb2YpCiAgICAgICAgICAgICAgICAgICAgcnVubmluZ19oYXNoLnVwZGF0ZShkYXRhKQogICAgICAgICAgICAgICAgICAgIGlmIGVvZiBhbmQgcnVubmluZ19oYXNoLmRpZ2VzdCgpICE9IGV4cGVjdGVkX2hhc2g6CiAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIEJhZFdoZWVsRmlsZSgiQmFkIGhhc2ggZm9yIGZpbGUgJXIiICUgZWYubmFtZSkKICAgICAgICAgICAgZWYuX3VwZGF0ZV9jcmMgPSBfdXBkYXRlX2NyYwogICAgICAgIGVsaWYgc2VsZi5zdHJpY3QgYW5kIG5hbWUgbm90IGluIHNlbGYuX2V4cGVjdGVkX2hhc2hlczoKICAgICAgICAgICAgcmFpc2UgQmFkV2hlZWxGaWxlKCJObyBleHBlY3RlZCBoYXNoIGZvciBmaWxlICVyIiAlIGVmLm5hbWUpCiAgICAgICAgcmV0dXJuIGVmCgogICAgZGVmIHBvcChzZWxmKToKICAgICAgICAiIiJUcnVuY2F0ZSB0aGUgbGFzdCBmaWxlIG9mZiB0aGlzIHppcGZpbGUuCiAgICAgICAgQXNzdW1lcyBpbmZvbGlzdCgpIGlzIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBmaWxlcyAodHJ1ZSBmb3IKICAgICAgICBvcmRpbmFyeSB6aXAgZmlsZXMgY3JlYXRlZCBieSBQeXRob24pIiIiCiAgICAgICAgaWYgbm90IHNlbGYuZnA6CiAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigKICAgICAgICAgICAgICAgICAgIkF0dGVtcHQgdG8gcG9wIGZyb20gWklQIGFyY2hpdmUgdGhhdCB3YXMgYWxyZWFkeSBjbG9zZWQiKQogICAgICAgIGxhc3QgPSBzZWxmLmluZm9saXN0KCkucG9wKCkKICAgICAgICBkZWwgc2VsZi5OYW1lVG9JbmZvW2xhc3QuZmlsZW5hbWVdCiAgICAgICAgc2VsZi5mcC5zZWVrKGxhc3QuaGVhZGVyX29mZnNldCwgb3MuU0VFS19TRVQpCiAgICAgICAgc2VsZi5mcC50cnVuY2F0ZSgpCiAgICAgICAgc2VsZi5fZGlkTW9kaWZ5ID0gVHJ1ZQpQSwMEFAAAAAAAAAAhADkodwucLQAAnC0AADMAAABwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvbWV0YWRhdGEucHkiIiIKVG9vbHMgZm9yIGNvbnZlcnRpbmcgb2xkLSB0byBuZXctc3R5bGUgbWV0YWRhdGEuCiIiIgoKZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgbmFtZWR0dXBsZQpmcm9tIC5wa2dpbmZvIGltcG9ydCByZWFkX3BrZ19pbmZvCmZyb20gLnV0aWwgaW1wb3J0IE9yZGVyZWREZWZhdWx0RGljdAp0cnk6CiAgICBmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBPcmRlcmVkRGljdApleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBPcmRlcmVkRGljdCA9IGRpY3QKCmltcG9ydCByZQppbXBvcnQgb3MucGF0aAppbXBvcnQgdGV4dHdyYXAKaW1wb3J0IHBrZ19yZXNvdXJjZXMKaW1wb3J0IGVtYWlsLnBhcnNlcgoKZnJvbSAuIGltcG9ydCBfX3ZlcnNpb25fXyBhcyB3aGVlbF92ZXJzaW9uCgpNRVRBREFUQV9WRVJTSU9OID0gIjIuMCIKClBMVVJBTF9GSUVMRFMgPSB7ICJjbGFzc2lmaWVyIiA6ICJjbGFzc2lmaWVycyIsCiAgICAgICAgICAgICAgICAgICJwcm92aWRlc19kaXN0IiA6ICJwcm92aWRlcyIsCiAgICAgICAgICAgICAgICAgICJwcm92aWRlc19leHRyYSIgOiAiZXh0cmFzIiB9CgpTS0lQX0ZJRUxEUyA9IHNldCgpCgpDT05UQUNUX0ZJRUxEUyA9ICgoeyJlbWFpbCI6ImF1dGhvcl9lbWFpbCIsICJuYW1lIjogImF1dGhvciJ9LAogICAgICAgICAgICAgICAgICAgICJhdXRob3IiKSwKICAgICAgICAgICAgICAgICAgKHsiZW1haWwiOiJtYWludGFpbmVyX2VtYWlsIiwgIm5hbWUiOiAibWFpbnRhaW5lciJ9LAogICAgICAgICAgICAgICAgICAgICJtYWludGFpbmVyIikpCgojIGNvbW1vbmx5IGZpbGxlZCBvdXQgYXMgIlVOS05PV04iIGJ5IGRpc3R1dGlsczoKVU5LTk9XTl9GSUVMRFMgPSBzZXQoKCJhdXRob3IiLCAiYXV0aG9yX2VtYWlsIiwgInBsYXRmb3JtIiwgImhvbWVfcGFnZSIsCiAgICAgICAgICAgICAgICAgICAgICAibGljZW5zZSIpKQoKIyBXaGVlbCBpdHNlbGYgaXMgcHJvYmFibHkgdGhlIG9ubHkgcHJvZ3JhbSB0aGF0IHVzZXMgbm9uLWV4dHJhcyBtYXJrZXJzCiMgaW4gTUVUQURBVEEvUEtHLUlORk8uIFN1cHBvcnQgaXRzIHN5bnRheCB3aXRoIHRoZSBleHRyYSBhdCB0aGUgZW5kIG9ubHkuCkVYVFJBX1JFID0gcmUuY29tcGlsZSgiIiJeKD9QPHBhY2thZ2U+Lio/KSg7XHMqKD9QPGNvbmRpdGlvbj4uKj8pKGV4dHJhID09ICcoP1A8ZXh0cmE+Lio/KScpPykkIiIiKQpLRVlXT1JEU19SRSA9IHJlLmNvbXBpbGUoIltcMC0sXSsiKQoKTWF5UmVxdWlyZXNLZXkgPSBuYW1lZHR1cGxlKCdNYXlSZXF1aXJlc0tleScsICgnY29uZGl0aW9uJywgJ2V4dHJhJykpCgpkZWYgdW5pcXVlKGl0ZXJhYmxlKToKICAgICIiIgogICAgWWllbGQgdW5pcXVlIHZhbHVlcyBpbiBpdGVyYWJsZSwgcHJlc2VydmluZyBvcmRlci4KICAgICIiIgogICAgc2VlbiA9IHNldCgpCiAgICBmb3IgdmFsdWUgaW4gaXRlcmFibGU6CiAgICAgICAgaWYgbm90IHZhbHVlIGluIHNlZW46CiAgICAgICAgICAgIHNlZW4uYWRkKHZhbHVlKQogICAgICAgICAgICB5aWVsZCB2YWx1ZQoKCmRlZiBoYW5kbGVfcmVxdWlyZXMobWV0YWRhdGEsIHBrZ19pbmZvLCBrZXkpOgogICAgIiIiCiAgICBQbGFjZSB0aGUgcnVudGltZSByZXF1aXJlbWVudHMgZnJvbSBwa2dfaW5mbyBpbnRvIG1ldGFkYXRhLgogICAgIiIiCiAgICBtYXlfcmVxdWlyZXMgPSBPcmRlcmVkRGVmYXVsdERpY3QobGlzdCkKICAgIGZvciB2YWx1ZSBpbiBzb3J0ZWQocGtnX2luZm8uZ2V0X2FsbChrZXkpKToKICAgICAgICBleHRyYV9tYXRjaCA9IEVYVFJBX1JFLnNlYXJjaCh2YWx1ZSkKICAgICAgICBpZiBleHRyYV9tYXRjaDoKICAgICAgICAgICAgZ3JvdXBkaWN0ID0gZXh0cmFfbWF0Y2guZ3JvdXBkaWN0KCkKICAgICAgICAgICAgY29uZGl0aW9uID0gZ3JvdXBkaWN0Wydjb25kaXRpb24nXQogICAgICAgICAgICBleHRyYSA9IGdyb3VwZGljdFsnZXh0cmEnXQogICAgICAgICAgICBwYWNrYWdlID0gZ3JvdXBkaWN0WydwYWNrYWdlJ10KICAgICAgICAgICAgaWYgY29uZGl0aW9uLmVuZHN3aXRoKCcgYW5kICcpOgogICAgICAgICAgICAgICAgY29uZGl0aW9uID0gY29uZGl0aW9uWzotNV0KICAgICAgICBlbHNlOgogICAgICAgICAgICBjb25kaXRpb24sIGV4dHJhID0gTm9uZSwgTm9uZQogICAgICAgICAgICBwYWNrYWdlID0gdmFsdWUKICAgICAgICBrZXkgPSBNYXlSZXF1aXJlc0tleShjb25kaXRpb24sIGV4dHJhKQogICAgICAgIG1heV9yZXF1aXJlc1trZXldLmFwcGVuZChwYWNrYWdlKQoKICAgIGlmIG1heV9yZXF1aXJlczoKICAgICAgICBtZXRhZGF0YVsncnVuX3JlcXVpcmVzJ10gPSBbXQogICAgICAgIGRlZiBzb3J0X2tleShpdGVtKToKICAgICAgICAgICAgIyBCb3RoIGNvbmRpdGlvbiBhbmQgZXh0cmEgY291bGQgYmUgTm9uZSwgd2hpY2ggY2FuJ3QgYmUgY29tcGFyZWQKICAgICAgICAgICAgIyBhZ2FpbnN0IHN0cmluZ3MgaW4gUHl0aG9uIDMuCiAgICAgICAgICAgIGtleSwgdmFsdWUgPSBpdGVtCiAgICAgICAgICAgIGlmIGtleS5jb25kaXRpb24gaXMgTm9uZToKICAgICAgICAgICAgICAgIHJldHVybiAnJwogICAgICAgICAgICByZXR1cm4ga2V5LmNvbmRpdGlvbgogICAgICAgIGZvciBrZXksIHZhbHVlIGluIHNvcnRlZChtYXlfcmVxdWlyZXMuaXRlbXMoKSwga2V5PXNvcnRfa2V5KToKICAgICAgICAgICAgbWF5X3JlcXVpcmVtZW50ID0gT3JkZXJlZERpY3QoKCgncmVxdWlyZXMnLCB2YWx1ZSksKSkKICAgICAgICAgICAgaWYga2V5LmV4dHJhOgogICAgICAgICAgICAgICAgbWF5X3JlcXVpcmVtZW50WydleHRyYSddID0ga2V5LmV4dHJhCiAgICAgICAgICAgIGlmIGtleS5jb25kaXRpb246CiAgICAgICAgICAgICAgICBtYXlfcmVxdWlyZW1lbnRbJ2Vudmlyb25tZW50J10gPSBrZXkuY29uZGl0aW9uCiAgICAgICAgICAgIG1ldGFkYXRhWydydW5fcmVxdWlyZXMnXS5hcHBlbmQobWF5X3JlcXVpcmVtZW50KQoKICAgICAgICBpZiBub3QgJ2V4dHJhcycgaW4gbWV0YWRhdGE6CiAgICAgICAgICAgIG1ldGFkYXRhWydleHRyYXMnXSA9IFtdCiAgICAgICAgbWV0YWRhdGFbJ2V4dHJhcyddLmV4dGVuZChba2V5LmV4dHJhIGZvciBrZXkgaW4gbWF5X3JlcXVpcmVzLmtleXMoKSBpZiBrZXkuZXh0cmFdKQoKCmRlZiBwa2dpbmZvX3RvX2RpY3QocGF0aCwgZGlzdHJpYnV0aW9uPU5vbmUpOgogICAgIiIiCiAgICBDb252ZXJ0IFBLRy1JTkZPIHRvIGEgcHJvdG90eXBlIE1ldGFkYXRhIDIuMCAoUEVQIDQyNikgZGljdC4KCiAgICBUaGUgZGVzY3JpcHRpb24gaXMgaW5jbHVkZWQgdW5kZXIgdGhlIGtleSBbJ2Rlc2NyaXB0aW9uJ10gcmF0aGVyIHRoYW4KICAgIGJlaW5nIHdyaXR0ZW4gdG8gYSBzZXBhcmF0ZSBmaWxlLgoKICAgIHBhdGg6IHBhdGggdG8gUEtHLUlORk8gZmlsZQogICAgZGlzdHJpYnV0aW9uOiBvcHRpb25hbCBkaXN0dXRpbHMgRGlzdHJpYnV0aW9uKCkKICAgICIiIgoKICAgIG1ldGFkYXRhID0gT3JkZXJlZERlZmF1bHREaWN0KGxhbWJkYTogT3JkZXJlZERlZmF1bHREaWN0KGxhbWJkYTogT3JkZXJlZERlZmF1bHREaWN0KE9yZGVyZWREaWN0KSkpCiAgICBtZXRhZGF0YVsiZ2VuZXJhdG9yIl0gPSAiYmRpc3Rfd2hlZWwgKCIgKyB3aGVlbF92ZXJzaW9uICsgIikiCiAgICB0cnk6CiAgICAgICAgdW5pY29kZQogICAgICAgIHBrZ19pbmZvID0gcmVhZF9wa2dfaW5mbyhwYXRoKQogICAgZXhjZXB0IE5hbWVFcnJvcjoKICAgICAgICB3aXRoIG9wZW4ocGF0aCwgJ3JiJykgYXMgcGtnX2luZm9fZmlsZToKICAgICAgICAgICAgcGtnX2luZm8gPSBlbWFpbC5wYXJzZXIuUGFyc2VyKCkucGFyc2VzdHIocGtnX2luZm9fZmlsZS5yZWFkKCkuZGVjb2RlKCd1dGYtOCcpKQogICAgZGVzY3JpcHRpb24gPSBOb25lCgogICAgaWYgcGtnX2luZm9bJ1N1bW1hcnknXToKICAgICAgICBtZXRhZGF0YVsnc3VtbWFyeSddID0gcGtnaW5mb191bmljb2RlKHBrZ19pbmZvLCAnU3VtbWFyeScpCiAgICAgICAgZGVsIHBrZ19pbmZvWydTdW1tYXJ5J10KCiAgICBpZiBwa2dfaW5mb1snRGVzY3JpcHRpb24nXToKICAgICAgICBkZXNjcmlwdGlvbiA9IGRlZGVudF9kZXNjcmlwdGlvbihwa2dfaW5mbykKICAgICAgICBkZWwgcGtnX2luZm9bJ0Rlc2NyaXB0aW9uJ10KICAgIGVsc2U6CiAgICAgICAgcGF5bG9hZCA9IHBrZ19pbmZvLmdldF9wYXlsb2FkKCkKICAgICAgICBpZiBpc2luc3RhbmNlKHBheWxvYWQsIGJ5dGVzKToKICAgICAgICAgICAgIyBBdm9pZCBhIFB5dGhvbiAyIFVuaWNvZGUgZXJyb3IuCiAgICAgICAgICAgICMgV2Ugc3RpbGwgc3VmZmVyID8gZ2x5cGhzIG9uIFB5dGhvbiAzLgogICAgICAgICAgICBwYXlsb2FkID0gcGF5bG9hZC5kZWNvZGUoJ3V0Zi04JykKICAgICAgICBpZiBwYXlsb2FkOgogICAgICAgICAgICBkZXNjcmlwdGlvbiA9IHBheWxvYWQKCiAgICBpZiBkZXNjcmlwdGlvbjoKICAgICAgICBwa2dfaW5mb1snZGVzY3JpcHRpb24nXSA9IGRlc2NyaXB0aW9uCgogICAgZm9yIGtleSBpbiBzb3J0ZWQodW5pcXVlKGsubG93ZXIoKSBmb3IgayBpbiBwa2dfaW5mby5rZXlzKCkpKToKICAgICAgICBsb3dfa2V5ID0ga2V5LnJlcGxhY2UoJy0nLCAnXycpCgogICAgICAgIGlmIGxvd19rZXkgaW4gU0tJUF9GSUVMRFM6CiAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgIGlmIGxvd19rZXkgaW4gVU5LTk9XTl9GSUVMRFMgYW5kIHBrZ19pbmZvLmdldChrZXkpID09ICdVTktOT1dOJzoKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgaWYgbG93X2tleSBpbiBzb3J0ZWQoUExVUkFMX0ZJRUxEUyk6CiAgICAgICAgICAgIG1ldGFkYXRhW1BMVVJBTF9GSUVMRFNbbG93X2tleV1dID0gcGtnX2luZm8uZ2V0X2FsbChrZXkpCgogICAgICAgIGVsaWYgbG93X2tleSA9PSAicmVxdWlyZXNfZGlzdCI6CiAgICAgICAgICAgIGhhbmRsZV9yZXF1aXJlcyhtZXRhZGF0YSwgcGtnX2luZm8sIGtleSkKCiAgICAgICAgZWxpZiBsb3dfa2V5ID09ICdwcm92aWRlc19leHRyYSc6CiAgICAgICAgICAgIGlmIG5vdCAnZXh0cmFzJyBpbiBtZXRhZGF0YToKICAgICAgICAgICAgICAgIG1ldGFkYXRhWydleHRyYXMnXSA9IFtdCiAgICAgICAgICAgIG1ldGFkYXRhWydleHRyYXMnXS5leHRlbmQocGtnX2luZm8uZ2V0X2FsbChrZXkpKQoKICAgICAgICBlbGlmIGxvd19rZXkgPT0gJ2hvbWVfcGFnZSc6CiAgICAgICAgICAgIG1ldGFkYXRhWydleHRlbnNpb25zJ11bJ3B5dGhvbi5kZXRhaWxzJ11bJ3Byb2plY3RfdXJscyddID0geydIb21lJzpwa2dfaW5mb1trZXldfQoKICAgICAgICBlbGlmIGxvd19rZXkgPT0gJ2tleXdvcmRzJzoKICAgICAgICAgICAgbWV0YWRhdGFbJ2tleXdvcmRzJ10gPSBLRVlXT1JEU19SRS5zcGxpdChwa2dfaW5mb1trZXldKQoKICAgICAgICBlbHNlOgogICAgICAgICAgICBtZXRhZGF0YVtsb3dfa2V5XSA9IHBrZ19pbmZvW2tleV0KCiAgICBtZXRhZGF0YVsnbWV0YWRhdGFfdmVyc2lvbiddID0gTUVUQURBVEFfVkVSU0lPTgoKICAgIGlmICdleHRyYXMnIGluIG1ldGFkYXRhOgogICAgICAgIG1ldGFkYXRhWydleHRyYXMnXSA9IHNvcnRlZChzZXQobWV0YWRhdGFbJ2V4dHJhcyddKSkKCiAgICAjIGluY2x1ZGUgbW9yZSBpbmZvcm1hdGlvbiBpZiBkaXN0cmlidXRpb24gaXMgYXZhaWxhYmxlCiAgICBpZiBkaXN0cmlidXRpb246CiAgICAgICAgZm9yIHJlcXVpcmVzLCBhdHRyIGluICgoJ3Rlc3RfcmVxdWlyZXMnLCAndGVzdHNfcmVxdWlyZScpLCk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50cyA9IGdldGF0dHIoZGlzdHJpYnV0aW9uLCBhdHRyKQogICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShyZXF1aXJlbWVudHMsIGxpc3QpOgogICAgICAgICAgICAgICAgICAgIG5ld19yZXF1aXJlbWVudHMgPSBzb3J0ZWQoY29udmVydF9yZXF1aXJlbWVudHMocmVxdWlyZW1lbnRzKSkKICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YVtyZXF1aXJlc10gPSBbeydyZXF1aXJlcyc6bmV3X3JlcXVpcmVtZW50c31dCiAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgICAgIHBhc3MKCiAgICAjIGhhbmRsZSBjb250YWN0cwogICAgY29udGFjdHMgPSBbXQogICAgZm9yIGNvbnRhY3RfdHlwZSwgcm9sZSBpbiBDT05UQUNUX0ZJRUxEUzoKICAgICAgICBjb250YWN0ID0gT3JkZXJlZERpY3QoKQogICAgICAgIGZvciBrZXkgaW4gc29ydGVkKGNvbnRhY3RfdHlwZSk6CiAgICAgICAgICAgIGlmIGNvbnRhY3RfdHlwZVtrZXldIGluIG1ldGFkYXRhOgogICAgICAgICAgICAgICAgY29udGFjdFtrZXldID0gbWV0YWRhdGEucG9wKGNvbnRhY3RfdHlwZVtrZXldKQogICAgICAgIGlmIGNvbnRhY3Q6CiAgICAgICAgICAgIGNvbnRhY3RbJ3JvbGUnXSA9IHJvbGUKICAgICAgICAgICAgY29udGFjdHMuYXBwZW5kKGNvbnRhY3QpCiAgICBpZiBjb250YWN0czoKICAgICAgICBtZXRhZGF0YVsnZXh0ZW5zaW9ucyddWydweXRob24uZGV0YWlscyddWydjb250YWN0cyddID0gY29udGFjdHMKCiAgICAjIGNvbnZlcnQgZW50cnkgcG9pbnRzIHRvIGV4cG9ydHMKICAgIHRyeToKICAgICAgICB3aXRoIG9wZW4ob3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShwYXRoKSwgImVudHJ5X3BvaW50cy50eHQiKSwgInIiKSBhcyBlcF9maWxlOgogICAgICAgICAgICBlcF9tYXAgPSBwa2dfcmVzb3VyY2VzLkVudHJ5UG9pbnQucGFyc2VfbWFwKGVwX2ZpbGUucmVhZCgpKQogICAgICAgIGV4cG9ydHMgPSBPcmRlcmVkRGljdCgpCiAgICAgICAgZm9yIGdyb3VwLCBpdGVtcyBpbiBzb3J0ZWQoZXBfbWFwLml0ZW1zKCkpOgogICAgICAgICAgICBleHBvcnRzW2dyb3VwXSA9IE9yZGVyZWREaWN0KCkKICAgICAgICAgICAgZm9yIGl0ZW0gaW4gc29ydGVkKG1hcChzdHIsIGl0ZW1zLnZhbHVlcygpKSk6CiAgICAgICAgICAgICAgICBuYW1lLCBleHBvcnQgPSBpdGVtLnNwbGl0KCcgPSAnLCAxKQogICAgICAgICAgICAgICAgZXhwb3J0c1tncm91cF1bbmFtZV0gPSBleHBvcnQKICAgICAgICBpZiBleHBvcnRzOgogICAgICAgICAgICBtZXRhZGF0YVsnZXh0ZW5zaW9ucyddWydweXRob24uZXhwb3J0cyddID0gZXhwb3J0cwogICAgZXhjZXB0IElPRXJyb3I6CiAgICAgICAgcGFzcwoKICAgICMgY29weSBjb25zb2xlX3NjcmlwdHMgZW50cnkgcG9pbnRzIHRvIGNvbW1hbmRzCiAgICBpZiAncHl0aG9uLmV4cG9ydHMnIGluIG1ldGFkYXRhWydleHRlbnNpb25zJ106CiAgICAgICAgZm9yIChlcF9zY3JpcHQsIHdyYXBfc2NyaXB0KSBpbiAoKCdjb25zb2xlX3NjcmlwdHMnLCAnd3JhcF9jb25zb2xlJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdndWlfc2NyaXB0cycsICd3cmFwX2d1aScpKToKICAgICAgICAgICAgaWYgZXBfc2NyaXB0IGluIG1ldGFkYXRhWydleHRlbnNpb25zJ11bJ3B5dGhvbi5leHBvcnRzJ106CiAgICAgICAgICAgICAgICBtZXRhZGF0YVsnZXh0ZW5zaW9ucyddWydweXRob24uY29tbWFuZHMnXVt3cmFwX3NjcmlwdF0gPSBcCiAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFbJ2V4dGVuc2lvbnMnXVsncHl0aG9uLmV4cG9ydHMnXVtlcF9zY3JpcHRdCgogICAgcmV0dXJuIG1ldGFkYXRhCgpkZWYgcmVxdWlyZXNfdG9fcmVxdWlyZXNfZGlzdChyZXF1aXJlbWVudCk6CiAgICAiIiJDb21wb3NlIHRoZSB2ZXJzaW9uIHByZWRpY2F0ZXMgZm9yIHJlcXVpcmVtZW50IGluIFBFUCAzNDUgZmFzaGlvbi4iIiIKICAgIHJlcXVpcmVzX2Rpc3QgPSBbXQogICAgZm9yIG9wLCB2ZXIgaW4gcmVxdWlyZW1lbnQuc3BlY3M6CiAgICAgICAgcmVxdWlyZXNfZGlzdC5hcHBlbmQob3AgKyB2ZXIpCiAgICBpZiBub3QgcmVxdWlyZXNfZGlzdDoKICAgICAgICByZXR1cm4gJycKICAgIHJldHVybiAiICglcykiICUgJywnLmpvaW4ocmVxdWlyZXNfZGlzdCkKCmRlZiBjb252ZXJ0X3JlcXVpcmVtZW50cyhyZXF1aXJlbWVudHMpOgogICAgIiIiWWllbGQgUmVxdWlyZXMtRGlzdDogc3RyaW5ncyBmb3IgcGFyc2VkIHJlcXVpcmVtZW50cyBzdHJpbmdzLiIiIgogICAgZm9yIHJlcSBpbiByZXF1aXJlbWVudHM6CiAgICAgICAgcGFyc2VkX3JlcXVpcmVtZW50ID0gcGtnX3Jlc291cmNlcy5SZXF1aXJlbWVudC5wYXJzZShyZXEpCiAgICAgICAgc3BlYyA9IHJlcXVpcmVzX3RvX3JlcXVpcmVzX2Rpc3QocGFyc2VkX3JlcXVpcmVtZW50KQogICAgICAgIGV4dHJhcyA9ICIsIi5qb2luKHBhcnNlZF9yZXF1aXJlbWVudC5leHRyYXMpCiAgICAgICAgaWYgZXh0cmFzOgogICAgICAgICAgICBleHRyYXMgPSAiWyVzXSIgJSBleHRyYXMKICAgICAgICB5aWVsZCAocGFyc2VkX3JlcXVpcmVtZW50LnByb2plY3RfbmFtZSArIGV4dHJhcyArIHNwZWMpCgpkZWYgZ2VuZXJhdGVfcmVxdWlyZW1lbnRzKGV4dHJhc19yZXF1aXJlKToKICAgICIiIgogICAgQ29udmVydCByZXF1aXJlbWVudHMgZnJvbSBhIHNldHVwKCktc3R5bGUgZGljdGlvbmFyeSB0byAoJ1JlcXVpcmVzLURpc3QnLCAncmVxdWlyZW1lbnQnKQogICAgYW5kICgnUHJvdmlkZXMtRXh0cmEnLCAnZXh0cmEnKSB0dXBsZXMuCgogICAgZXh0cmFzX3JlcXVpcmUgaXMgYSBkaWN0aW9uYXJ5IG9mIHtleHRyYTogW3JlcXVpcmVtZW50c119IGFzIHBhc3NlZCB0byBzZXR1cCgpLAogICAgdXNpbmcgdGhlIGVtcHR5IGV4dHJhIHsnJzogW3JlcXVpcmVtZW50c119IHRvIGhvbGQgaW5zdGFsbF9yZXF1aXJlcy4KICAgICIiIgogICAgZm9yIGV4dHJhLCBkZXBlbmRzIGluIGV4dHJhc19yZXF1aXJlLml0ZW1zKCk6CiAgICAgICAgY29uZGl0aW9uID0gJycKICAgICAgICBpZiBleHRyYSBhbmQgJzonIGluIGV4dHJhOiAgIyBzZXR1cHRvb2xzIGV4dHJhOmNvbmRpdGlvbiBzeW50YXgKICAgICAgICAgICAgZXh0cmEsIGNvbmRpdGlvbiA9IGV4dHJhLnNwbGl0KCc6JywgMSkKICAgICAgICAgICAgZXh0cmEgPSBwa2dfcmVzb3VyY2VzLnNhZmVfZXh0cmEoZXh0cmEpCiAgICAgICAgaWYgZXh0cmE6CiAgICAgICAgICAgIHlpZWxkICgnUHJvdmlkZXMtRXh0cmEnLCBleHRyYSkKICAgICAgICAgICAgaWYgY29uZGl0aW9uOgogICAgICAgICAgICAgICAgY29uZGl0aW9uICs9ICIgYW5kICIKICAgICAgICAgICAgY29uZGl0aW9uICs9ICJleHRyYSA9PSAnJXMnIiAlIGV4dHJhCiAgICAgICAgaWYgY29uZGl0aW9uOgogICAgICAgICAgICBjb25kaXRpb24gPSAnOyAnICsgY29uZGl0aW9uCiAgICAgICAgZm9yIG5ld19yZXEgaW4gY29udmVydF9yZXF1aXJlbWVudHMoZGVwZW5kcyk6CiAgICAgICAgICAgIHlpZWxkICgnUmVxdWlyZXMtRGlzdCcsIG5ld19yZXEgKyBjb25kaXRpb24pCgpkZWYgcGtnaW5mb190b19tZXRhZGF0YShlZ2dfaW5mb19wYXRoLCBwa2dpbmZvX3BhdGgpOgogICAgIiIiCiAgICBDb252ZXJ0IC5lZ2ctaW5mbyBkaXJlY3Rvcnkgd2l0aCBQS0ctSU5GTyB0byB0aGUgTWV0YWRhdGEgMS4zIGFrYQogICAgb2xkLWRyYWZ0IE1ldGFkYXRhIDIuMCBmb3JtYXQuCiAgICAiIiIKICAgIHBrZ19pbmZvID0gcmVhZF9wa2dfaW5mbyhwa2dpbmZvX3BhdGgpCiAgICBwa2dfaW5mby5yZXBsYWNlX2hlYWRlcignTWV0YWRhdGEtVmVyc2lvbicsICcyLjAnKQogICAgcmVxdWlyZXNfcGF0aCA9IG9zLnBhdGguam9pbihlZ2dfaW5mb19wYXRoLCAncmVxdWlyZXMudHh0JykKICAgIGlmIG9zLnBhdGguZXhpc3RzKHJlcXVpcmVzX3BhdGgpOgogICAgICAgIHdpdGggb3BlbihyZXF1aXJlc19wYXRoKSBhcyByZXF1aXJlc19maWxlOgogICAgICAgICAgICByZXF1aXJlcyA9IHJlcXVpcmVzX2ZpbGUucmVhZCgpCiAgICAgICAgZm9yIGV4dHJhLCByZXFzIGluIHNvcnRlZChwa2dfcmVzb3VyY2VzLnNwbGl0X3NlY3Rpb25zKHJlcXVpcmVzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleT1sYW1iZGEgeDogeFswXSBvciAnJyk6CiAgICAgICAgICAgIGZvciBpdGVtIGluIGdlbmVyYXRlX3JlcXVpcmVtZW50cyh7ZXh0cmE6IHJlcXN9KToKICAgICAgICAgICAgICAgIHBrZ19pbmZvW2l0ZW1bMF1dID0gaXRlbVsxXQoKICAgIGRlc2NyaXB0aW9uID0gcGtnX2luZm9bJ0Rlc2NyaXB0aW9uJ10KICAgIGlmIGRlc2NyaXB0aW9uOgogICAgICAgIHBrZ19pbmZvLnNldF9wYXlsb2FkKGRlZGVudF9kZXNjcmlwdGlvbihwa2dfaW5mbykpCiAgICAgICAgZGVsIHBrZ19pbmZvWydEZXNjcmlwdGlvbiddCgogICAgcmV0dXJuIHBrZ19pbmZvCgoKZGVmIHBrZ2luZm9fdW5pY29kZShwa2dfaW5mbywgZmllbGQpOgogICAgIiIiSGFjayB0byBjb2F4IFVuaWNvZGUgb3V0IG9mIGFuIGVtYWlsIE1lc3NhZ2UoKSAtIFB5dGhvbiAzLjMrIiIiCiAgICB0ZXh0ID0gcGtnX2luZm9bZmllbGRdCiAgICBmaWVsZCA9IGZpZWxkLmxvd2VyKCkKICAgIGlmIG5vdCBpc2luc3RhbmNlKHRleHQsIHN0cik6CiAgICAgICAgaWYgbm90IGhhc2F0dHIocGtnX2luZm8sICdyYXdfaXRlbXMnKTogICMgUHl0aG9uIDMuMgogICAgICAgICAgICByZXR1cm4gc3RyKHRleHQpCiAgICAgICAgZm9yIGl0ZW0gaW4gcGtnX2luZm8ucmF3X2l0ZW1zKCk6CiAgICAgICAgICAgIGlmIGl0ZW1bMF0ubG93ZXIoKSA9PSBmaWVsZDoKICAgICAgICAgICAgICAgIHRleHQgPSBpdGVtWzFdLmVuY29kZSgnYXNjaWknLCAnc3Vycm9nYXRlZXNjYXBlJylcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRlY29kZSgndXRmLTgnKQogICAgICAgICAgICAgICAgYnJlYWsKCiAgICByZXR1cm4gdGV4dAoKCmRlZiBkZWRlbnRfZGVzY3JpcHRpb24ocGtnX2luZm8pOgogICAgIiIiCiAgICBEZWRlbnQgYW5kIGNvbnZlcnQgcGtnX2luZm9bJ0Rlc2NyaXB0aW9uJ10gdG8gVW5pY29kZS4KICAgICIiIgogICAgZGVzY3JpcHRpb24gPSBwa2dfaW5mb1snRGVzY3JpcHRpb24nXQoKICAgICMgUHl0aG9uIDMgVW5pY29kZSBoYW5kbGluZywgc29ydGEuCiAgICBzdXJyb2dhdGVzID0gRmFsc2UKICAgIGlmIG5vdCBpc2luc3RhbmNlKGRlc2NyaXB0aW9uLCBzdHIpOgogICAgICAgIHN1cnJvZ2F0ZXMgPSBUcnVlCiAgICAgICAgZGVzY3JpcHRpb24gPSBwa2dpbmZvX3VuaWNvZGUocGtnX2luZm8sICdEZXNjcmlwdGlvbicpCgogICAgZGVzY3JpcHRpb25fbGluZXMgPSBkZXNjcmlwdGlvbi5zcGxpdGxpbmVzKCkKICAgIGRlc2NyaXB0aW9uX2RlZGVudCA9ICdcbicuam9pbigKICAgICAgICAgICAgIyBpZiB0aGUgZmlyc3QgbGluZSBvZiBsb25nX2Rlc2NyaXB0aW9uIGlzIGJsYW5rLAogICAgICAgICAgICAjIHRoZSBmaXJzdCBsaW5lIGhlcmUgd2lsbCBiZSBpbmRlbnRlZC4KICAgICAgICAgICAgKGRlc2NyaXB0aW9uX2xpbmVzWzBdLmxzdHJpcCgpLAogICAgICAgICAgICAgdGV4dHdyYXAuZGVkZW50KCdcbicuam9pbihkZXNjcmlwdGlvbl9saW5lc1sxOl0pKSwKICAgICAgICAgICAgICdcbicpKQoKICAgIGlmIHN1cnJvZ2F0ZXM6CiAgICAgICAgZGVzY3JpcHRpb25fZGVkZW50ID0gZGVzY3JpcHRpb25fZGVkZW50XAogICAgICAgICAgICAgICAgLmVuY29kZSgidXRmOCIpXAogICAgICAgICAgICAgICAgLmRlY29kZSgiYXNjaWkiLCAic3Vycm9nYXRlZXNjYXBlIikKCiAgICByZXR1cm4gZGVzY3JpcHRpb25fZGVkZW50CgoKaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgIGltcG9ydCBzeXMsIHBwcmludAogICAgcHByaW50LnBwcmludChwa2dpbmZvX3RvX2RpY3Qoc3lzLmFyZ3ZbMV0pKQpQSwMEFAAAAAAAAAAhAGH2NdJqBAAAagQAADAAAABwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvcGF0aHMucHkiIiIKSW5zdGFsbGF0aW9uIHBhdGhzLgoKTWFwIHRoZSAuZGF0YS8gc3ViZGlyZWN0b3J5IG5hbWVzIHRvIGluc3RhbGwgcGF0aHMuCiIiIgoKaW1wb3J0IG9zLnBhdGgKaW1wb3J0IHN5cwppbXBvcnQgZGlzdHV0aWxzLmRpc3QgYXMgZGlzdAppbXBvcnQgZGlzdHV0aWxzLmNvbW1hbmQuaW5zdGFsbCBhcyBpbnN0YWxsCgpkZWYgZ2V0X2luc3RhbGxfY29tbWFuZChuYW1lKToKICAgICMgbGF0ZSBiaW5kaW5nIGR1ZSB0byBwb3RlbnRpYWwgbW9ua2V5cGF0Y2hpbmcKICAgIGQgPSBkaXN0LkRpc3RyaWJ1dGlvbih7J25hbWUnOm5hbWV9KQogICAgaSA9IGluc3RhbGwuaW5zdGFsbChkKQogICAgaS5maW5hbGl6ZV9vcHRpb25zKCkKICAgIHJldHVybiBpCgpkZWYgZ2V0X2luc3RhbGxfcGF0aHMobmFtZSk6CiAgICAiIiIKICAgIFJldHVybiB0aGUgKGRpc3R1dGlscykgaW5zdGFsbCBwYXRocyBmb3IgdGhlIG5hbWVkIGRpc3QuCiAgICAKICAgIEEgZGljdCB3aXRoICgncHVyZWxpYicsICdwbGF0bGliJywgJ2hlYWRlcnMnLCAnc2NyaXB0cycsICdkYXRhJykga2V5cy4KICAgICIiIgogICAgcGF0aHMgPSB7fQoKICAgIGkgPSBnZXRfaW5zdGFsbF9jb21tYW5kKG5hbWUpCgogICAgZm9yIGtleSBpbiBpbnN0YWxsLlNDSEVNRV9LRVlTOgogICAgICAgIHBhdGhzW2tleV0gPSBnZXRhdHRyKGksICdpbnN0YWxsXycgKyBrZXkpCgogICAgIyBwaXAgdXNlcyBhIHNpbWlsYXIgcGF0aCBhcyBhbiBhbHRlcm5hdGl2ZSB0byB0aGUgc3lzdGVtJ3MgKHJlYWQtb25seSkKICAgICMgaW5jbHVkZSBkaXJlY3Rvcnk6CiAgICBpZiBoYXNhdHRyKHN5cywgJ3JlYWxfcHJlZml4Jyk6ICAjIHZpcnR1YWxlbnYKICAgICAgICBwYXRoc1snaGVhZGVycyddID0gb3MucGF0aC5qb2luKHN5cy5wcmVmaXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW5jbHVkZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2l0ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHl0aG9uJyArIHN5cy52ZXJzaW9uWzozXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpCgogICAgcmV0dXJuIHBhdGhzClBLAwQUAAAAAAAAACEAa2JWfMUWAADFFgAANQAAAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC9wZXA0MjV0YWdzLnB5IiIiR2VuZXJhdGUgYW5kIHdvcmsgd2l0aCBQRVAgNDI1IENvbXBhdGliaWxpdHkgVGFncy4iIiIKCmltcG9ydCBzeXMKaW1wb3J0IHdhcm5pbmdzCgp0cnk6CiAgICBpbXBvcnQgc3lzY29uZmlnCmV4Y2VwdCBJbXBvcnRFcnJvcjogICMgcHJhZ21hIG5vY292ZXIKICAgICMgUHl0aG9uIDwgMi43CiAgICBpbXBvcnQgZGlzdHV0aWxzLnN5c2NvbmZpZyBhcyBzeXNjb25maWcKaW1wb3J0IGRpc3R1dGlscy51dGlsCgoKZGVmIGdldF9jb25maWdfdmFyKHZhcik6CiAgICB0cnk6CiAgICAgICAgcmV0dXJuIHN5c2NvbmZpZy5nZXRfY29uZmlnX3Zhcih2YXIpCiAgICBleGNlcHQgSU9FcnJvciBhcyBlOiAgIyBwaXAgSXNzdWUgIzEwNzQKICAgICAgICB3YXJuaW5ncy53YXJuKCJ7MH0iLmZvcm1hdChlKSwgUnVudGltZVdhcm5pbmcpCiAgICAgICAgcmV0dXJuIE5vbmUKCgpkZWYgZ2V0X2FiYnJfaW1wbCgpOgogICAgIiIiUmV0dXJuIGFiYnJldmlhdGVkIGltcGxlbWVudGF0aW9uIG5hbWUuIiIiCiAgICBpZiBoYXNhdHRyKHN5cywgJ3B5cHlfdmVyc2lvbl9pbmZvJyk6CiAgICAgICAgcHlpbXBsID0gJ3BwJwogICAgZWxpZiBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnamF2YScpOgogICAgICAgIHB5aW1wbCA9ICdqeScKICAgIGVsaWYgc3lzLnBsYXRmb3JtID09ICdjbGknOgogICAgICAgIHB5aW1wbCA9ICdpcCcKICAgIGVsc2U6CiAgICAgICAgcHlpbXBsID0gJ2NwJwogICAgcmV0dXJuIHB5aW1wbAoKCmRlZiBnZXRfaW1wbF92ZXIoKToKICAgICIiIlJldHVybiBpbXBsZW1lbnRhdGlvbiB2ZXJzaW9uLiIiIgogICAgaW1wbF92ZXIgPSBnZXRfY29uZmlnX3ZhcigicHlfdmVyc2lvbl9ub2RvdCIpCiAgICBpZiBub3QgaW1wbF92ZXIgb3IgZ2V0X2FiYnJfaW1wbCgpID09ICdwcCc6CiAgICAgICAgaW1wbF92ZXIgPSAnJy5qb2luKG1hcChzdHIsIGdldF9pbXBsX3ZlcnNpb25faW5mbygpKSkKICAgIHJldHVybiBpbXBsX3ZlcgoKCmRlZiBnZXRfaW1wbF92ZXJzaW9uX2luZm8oKToKICAgICIiIlJldHVybiBzeXMudmVyc2lvbl9pbmZvLWxpa2UgdHVwbGUgZm9yIHVzZSBpbiBkZWNyZW1lbnRpbmcgdGhlIG1pbm9yCiAgICB2ZXJzaW9uLiIiIgogICAgaWYgZ2V0X2FiYnJfaW1wbCgpID09ICdwcCc6CiAgICAgICAgIyBhcyBwZXIgaHR0cHM6Ly9naXRodWIuY29tL3B5cGEvcGlwL2lzc3Vlcy8yODgyCiAgICAgICAgcmV0dXJuIChzeXMudmVyc2lvbl9pbmZvWzBdLCBzeXMucHlweV92ZXJzaW9uX2luZm8ubWFqb3IsCiAgICAgICAgICAgICAgICBzeXMucHlweV92ZXJzaW9uX2luZm8ubWlub3IpCiAgICBlbHNlOgogICAgICAgIHJldHVybiBzeXMudmVyc2lvbl9pbmZvWzBdLCBzeXMudmVyc2lvbl9pbmZvWzFdCgoKZGVmIGdldF9mbGFnKHZhciwgZmFsbGJhY2ssIGV4cGVjdGVkPVRydWUsIHdhcm49VHJ1ZSk6CiAgICAiIiJVc2UgYSBmYWxsYmFjayBtZXRob2QgZm9yIGRldGVybWluaW5nIFNPQUJJIGZsYWdzIGlmIHRoZSBuZWVkZWQgY29uZmlnCiAgICB2YXIgaXMgdW5zZXQgb3IgdW5hdmFpbGFibGUuIiIiCiAgICB2YWwgPSBnZXRfY29uZmlnX3Zhcih2YXIpCiAgICBpZiB2YWwgaXMgTm9uZToKICAgICAgICBpZiB3YXJuOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJDb25maWcgdmFyaWFibGUgJ3swfScgaXMgdW5zZXQsIFB5dGhvbiBBQkkgdGFnIG1heSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgImJlIGluY29ycmVjdCIuZm9ybWF0KHZhciksIFJ1bnRpbWVXYXJuaW5nLCAyKQogICAgICAgIHJldHVybiBmYWxsYmFjaygpCiAgICByZXR1cm4gdmFsID09IGV4cGVjdGVkCgoKZGVmIGdldF9hYmlfdGFnKCk6CiAgICAiIiJSZXR1cm4gdGhlIEFCSSB0YWcgYmFzZWQgb24gU09BQkkgKGlmIGF2YWlsYWJsZSkgb3IgZW11bGF0ZSBTT0FCSQogICAgKENQeXRob24gMiwgUHlQeSkuIiIiCiAgICBzb2FiaSA9IGdldF9jb25maWdfdmFyKCdTT0FCSScpCiAgICBpbXBsID0gZ2V0X2FiYnJfaW1wbCgpCiAgICBpZiBub3Qgc29hYmkgYW5kIGltcGwgaW4gKCdjcCcsICdwcCcpIGFuZCBoYXNhdHRyKHN5cywgJ21heHVuaWNvZGUnKToKICAgICAgICBkID0gJycKICAgICAgICBtID0gJycKICAgICAgICB1ID0gJycKICAgICAgICBpZiBnZXRfZmxhZygnUHlfREVCVUcnLAogICAgICAgICAgICAgICAgICAgIGxhbWJkYTogaGFzYXR0cihzeXMsICdnZXR0b3RhbHJlZmNvdW50JyksCiAgICAgICAgICAgICAgICAgICAgd2Fybj0oaW1wbCA9PSAnY3AnKSk6CiAgICAgICAgICAgIGQgPSAnZCcKICAgICAgICBpZiBnZXRfZmxhZygnV0lUSF9QWU1BTExPQycsCiAgICAgICAgICAgICAgICAgICAgbGFtYmRhOiBpbXBsID09ICdjcCcsCiAgICAgICAgICAgICAgICAgICAgd2Fybj0oaW1wbCA9PSAnY3AnKSk6CiAgICAgICAgICAgIG0gPSAnbScKICAgICAgICBpZiBnZXRfZmxhZygnUHlfVU5JQ09ERV9TSVpFJywKICAgICAgICAgICAgICAgICAgICBsYW1iZGE6IHN5cy5tYXh1bmljb2RlID09IDB4MTBmZmZmLAogICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkPTQsCiAgICAgICAgICAgICAgICAgICAgd2Fybj0oaW1wbCA9PSAnY3AnIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgIHN5cy52ZXJzaW9uX2luZm8gPCAoMywgMykpKSBcCiAgICAgICAgICAgICAgICBhbmQgc3lzLnZlcnNpb25faW5mbyA8ICgzLCAzKToKICAgICAgICAgICAgdSA9ICd1JwogICAgICAgIGFiaSA9ICclcyVzJXMlcyVzJyAlIChpbXBsLCBnZXRfaW1wbF92ZXIoKSwgZCwgbSwgdSkKICAgIGVsaWYgc29hYmkgYW5kIHNvYWJpLnN0YXJ0c3dpdGgoJ2NweXRob24tJyk6CiAgICAgICAgYWJpID0gJ2NwJyArIHNvYWJpLnNwbGl0KCctJylbMV0KICAgIGVsaWYgc29hYmk6CiAgICAgICAgYWJpID0gc29hYmkucmVwbGFjZSgnLicsICdfJykucmVwbGFjZSgnLScsICdfJykKICAgIGVsc2U6CiAgICAgICAgYWJpID0gTm9uZQogICAgcmV0dXJuIGFiaQoKCmRlZiBnZXRfcGxhdGZvcm0oKToKICAgICIiIlJldHVybiBvdXIgcGxhdGZvcm0gbmFtZSAnd2luMzInLCAnbGludXhfeDg2XzY0JyIiIgogICAgIyBYWFggcmVtb3ZlIGRpc3R1dGlscyBkZXBlbmRlbmN5CiAgICByZXN1bHQgPSBkaXN0dXRpbHMudXRpbC5nZXRfcGxhdGZvcm0oKS5yZXBsYWNlKCcuJywgJ18nKS5yZXBsYWNlKCctJywgJ18nKQogICAgaWYgcmVzdWx0ID09ICJsaW51eF94ODZfNjQiIGFuZCBzeXMubWF4c2l6ZSA9PSAyMTQ3NDgzNjQ3OgogICAgICAgICMgcGlwIHB1bGwgcmVxdWVzdCAjMzQ5NwogICAgICAgIHJlc3VsdCA9ICJsaW51eF9pNjg2IgogICAgcmV0dXJuIHJlc3VsdAoKCmRlZiBnZXRfc3VwcG9ydGVkKHZlcnNpb25zPU5vbmUsIHN1cHBsaWVkX3BsYXRmb3JtPU5vbmUpOgogICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBzdXBwb3J0ZWQgdGFncyBmb3IgZWFjaCB2ZXJzaW9uIHNwZWNpZmllZCBpbgogICAgYHZlcnNpb25zYC4KCiAgICA6cGFyYW0gdmVyc2lvbnM6IGEgbGlzdCBvZiBzdHJpbmcgdmVyc2lvbnMsIG9mIHRoZSBmb3JtIFsiMzMiLCAiMzIiXSwgCiAgICAgICAgb3IgTm9uZS4gVGhlIGZpcnN0IHZlcnNpb24gd2lsbCBiZSBhc3N1bWVkIHRvIHN1cHBvcnQgb3VyIEFCSS4KICAgICIiIgogICAgc3VwcG9ydGVkID0gW10KICAgIAogICAgIyBWZXJzaW9ucyBtdXN0IGJlIGdpdmVuIHdpdGggcmVzcGVjdCB0byB0aGUgcHJlZmVyZW5jZQogICAgaWYgdmVyc2lvbnMgaXMgTm9uZToKICAgICAgICB2ZXJzaW9ucyA9IFtdCiAgICAgICAgdmVyc2lvbl9pbmZvID0gZ2V0X2ltcGxfdmVyc2lvbl9pbmZvKCkKICAgICAgICBtYWpvciA9IHZlcnNpb25faW5mb1s6LTFdCiAgICAgICAgIyBTdXBwb3J0IGFsbCBwcmV2aW91cyBtaW5vciBQeXRob24gdmVyc2lvbnMuCiAgICAgICAgZm9yIG1pbm9yIGluIHJhbmdlKHZlcnNpb25faW5mb1stMV0sIC0xLCAtMSk6CiAgICAgICAgICAgIHZlcnNpb25zLmFwcGVuZCgnJy5qb2luKG1hcChzdHIsIG1ham9yICsgKG1pbm9yLCkpKSkKICAgICAgICAgICAgCiAgICBpbXBsID0gZ2V0X2FiYnJfaW1wbCgpCiAgICAKICAgIGFiaXMgPSBbXQoKICAgIGFiaSA9IGdldF9hYmlfdGFnKCkKICAgIGlmIGFiaToKICAgICAgICBhYmlzWzA6MF0gPSBbYWJpXQogCiAgICBhYmkzcyA9IHNldCgpCiAgICBpbXBvcnQgaW1wCiAgICBmb3Igc3VmZml4IGluIGltcC5nZXRfc3VmZml4ZXMoKToKICAgICAgICBpZiBzdWZmaXhbMF0uc3RhcnRzd2l0aCgnLmFiaScpOgogICAgICAgICAgICBhYmkzcy5hZGQoc3VmZml4WzBdLnNwbGl0KCcuJywgMilbMV0pCgogICAgYWJpcy5leHRlbmQoc29ydGVkKGxpc3QoYWJpM3MpKSkKCiAgICBhYmlzLmFwcGVuZCgnbm9uZScpCgogICAgcGxhdGZvcm1zID0gW10KICAgIGlmIHN1cHBsaWVkX3BsYXRmb3JtOgogICAgICAgIHBsYXRmb3Jtcy5hcHBlbmQoc3VwcGxpZWRfcGxhdGZvcm0pCiAgICBwbGF0Zm9ybXMuYXBwZW5kKGdldF9wbGF0Zm9ybSgpKQogICAgCiAgICAjIEN1cnJlbnQgdmVyc2lvbiwgY3VycmVudCBBUEkgKGJ1aWx0IHNwZWNpZmljYWxseSBmb3Igb3VyIFB5dGhvbik6CiAgICBmb3IgYWJpIGluIGFiaXM6CiAgICAgICAgZm9yIGFyY2ggaW4gcGxhdGZvcm1zOgogICAgICAgICAgICBzdXBwb3J0ZWQuYXBwZW5kKCgnJXMlcycgJSAoaW1wbCwgdmVyc2lvbnNbMF0pLCBhYmksIGFyY2gpKQoKICAgICMgYWJpMyBtb2R1bGVzIGNvbXBhdGlibGUgd2l0aCBvbGRlciB2ZXJzaW9uIG9mIFB5dGhvbgogICAgZm9yIHZlcnNpb24gaW4gdmVyc2lvbnNbMTpdOgogICAgICAgICMgYWJpMyB3YXMgaW50cm9kdWNlZCBpbiBQeXRob24gMy4yCiAgICAgICAgaWYgdmVyc2lvbiBpbiAoJzMxJywgJzMwJyk6CiAgICAgICAgICAgIGJyZWFrCiAgICAgICAgZm9yIGFiaSBpbiBhYmkzczogICAjIGVtcHR5IHNldCBpZiBub3QgUHl0aG9uIDMKICAgICAgICAgICAgZm9yIGFyY2ggaW4gcGxhdGZvcm1zOgogICAgICAgICAgICAgICAgc3VwcG9ydGVkLmFwcGVuZCgoIiVzJXMiICUgKGltcGwsIHZlcnNpb24pLCBhYmksIGFyY2gpKQoKICAgICMgTm8gYWJpIC8gYXJjaCwgYnV0IHJlcXVpcmVzIG91ciBpbXBsZW1lbnRhdGlvbjoKICAgIGZvciBpLCB2ZXJzaW9uIGluIGVudW1lcmF0ZSh2ZXJzaW9ucyk6CiAgICAgICAgc3VwcG9ydGVkLmFwcGVuZCgoJyVzJXMnICUgKGltcGwsIHZlcnNpb24pLCAnbm9uZScsICdhbnknKSkKICAgICAgICBpZiBpID09IDA6CiAgICAgICAgICAgICMgVGFnZ2VkIHNwZWNpZmljYWxseSBhcyBiZWluZyBjcm9zcy12ZXJzaW9uIGNvbXBhdGlibGUgCiAgICAgICAgICAgICMgKHdpdGgganVzdCB0aGUgbWFqb3IgdmVyc2lvbiBzcGVjaWZpZWQpCiAgICAgICAgICAgIHN1cHBvcnRlZC5hcHBlbmQoKCclcyVzJyAlIChpbXBsLCB2ZXJzaW9uc1swXVswXSksICdub25lJywgJ2FueScpKSAKICAgIAogICAgIyBNYWpvciBQeXRob24gdmVyc2lvbiArIHBsYXRmb3JtOyBlLmcuIGJpbmFyaWVzIG5vdCB1c2luZyB0aGUgUHl0aG9uIEFQSQogICAgc3VwcG9ydGVkLmFwcGVuZCgoJ3B5JXMnICUgKHZlcnNpb25zWzBdWzBdKSwgJ25vbmUnLCBhcmNoKSkKCiAgICAjIE5vIGFiaSAvIGFyY2gsIGdlbmVyaWMgUHl0aG9uCiAgICBmb3IgaSwgdmVyc2lvbiBpbiBlbnVtZXJhdGUodmVyc2lvbnMpOgogICAgICAgIHN1cHBvcnRlZC5hcHBlbmQoKCdweSVzJyAlICh2ZXJzaW9uLCksICdub25lJywgJ2FueScpKQogICAgICAgIGlmIGkgPT0gMDoKICAgICAgICAgICAgc3VwcG9ydGVkLmFwcGVuZCgoJ3B5JXMnICUgKHZlcnNpb25bMF0pLCAnbm9uZScsICdhbnknKSkKICAgICAgICAKICAgIHJldHVybiBzdXBwb3J0ZWQKUEsDBBQAAAAAAAAAIQCAQxigyQQAAMkEAAAyAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3BrZ2luZm8ucHkiIiJUb29scyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZyBQS0ctSU5GTyAvIE1FVEFEQVRBIHdpdGhvdXQgY2FyaW5nCmFib3V0IHRoZSBlbmNvZGluZy4iIiIKCmZyb20gZW1haWwucGFyc2VyIGltcG9ydCBQYXJzZXIKCnRyeToKICAgIHVuaWNvZGUKICAgIF9QWTMgPSBGYWxzZQpleGNlcHQgTmFtZUVycm9yOgogICAgX1BZMyA9IFRydWUKCmlmIG5vdCBfUFkzOgogICAgZnJvbSBlbWFpbC5nZW5lcmF0b3IgaW1wb3J0IEdlbmVyYXRvcgogICAgCiAgICBkZWYgcmVhZF9wa2dfaW5mb19ieXRlcyhieXRlc3RyKToKICAgICAgICByZXR1cm4gUGFyc2VyKCkucGFyc2VzdHIoYnl0ZXN0cikKCiAgICBkZWYgcmVhZF9wa2dfaW5mbyhwYXRoKToKICAgICAgICB3aXRoIG9wZW4ocGF0aCwgInIiKSBhcyBoZWFkZXJzOgogICAgICAgICAgICBtZXNzYWdlID0gUGFyc2VyKCkucGFyc2UoaGVhZGVycykKICAgICAgICByZXR1cm4gbWVzc2FnZQoKICAgIGRlZiB3cml0ZV9wa2dfaW5mbyhwYXRoLCBtZXNzYWdlKToKICAgICAgICB3aXRoIG9wZW4ocGF0aCwgJ3cnKSBhcyBtZXRhZGF0YToKICAgICAgICAgICAgR2VuZXJhdG9yKG1ldGFkYXRhLCBtYXhoZWFkZXJsZW49MCkuZmxhdHRlbihtZXNzYWdlKSAKCmVsc2U6CiAgICBmcm9tIGVtYWlsLmdlbmVyYXRvciBpbXBvcnQgQnl0ZXNHZW5lcmF0b3IKICAgIGRlZiByZWFkX3BrZ19pbmZvX2J5dGVzKGJ5dGVzdHIpOgogICAgICAgIGhlYWRlcnMgPSBieXRlc3RyLmRlY29kZShlbmNvZGluZz0iYXNjaWkiLCBlcnJvcnM9InN1cnJvZ2F0ZWVzY2FwZSIpCiAgICAgICAgbWVzc2FnZSA9IFBhcnNlcigpLnBhcnNlc3RyKGhlYWRlcnMpCiAgICAgICAgcmV0dXJuIG1lc3NhZ2UKCiAgICBkZWYgcmVhZF9wa2dfaW5mbyhwYXRoKToKICAgICAgICB3aXRoIG9wZW4ocGF0aCwgInIiLCAKICAgICAgICAgICAgICAgICAgZW5jb2Rpbmc9ImFzY2lpIiwgCiAgICAgICAgICAgICAgICAgIGVycm9ycz0ic3Vycm9nYXRlZXNjYXBlIikgYXMgaGVhZGVyczoKICAgICAgICAgICAgbWVzc2FnZSA9IFBhcnNlcigpLnBhcnNlKGhlYWRlcnMpCiAgICAgICAgcmV0dXJuIG1lc3NhZ2UKCiAgICBkZWYgd3JpdGVfcGtnX2luZm8ocGF0aCwgbWVzc2FnZSk6CiAgICAgICAgd2l0aCBvcGVuKHBhdGgsICJ3YiIpIGFzIG91dDoKICAgICAgICAgICAgQnl0ZXNHZW5lcmF0b3Iob3V0LCBtYXhoZWFkZXJsZW49MCkuZmxhdHRlbihtZXNzYWdlKQoKUEsDBBQAAAAAAAAAIQD8TOZMww4AAMMOAAA+AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3NpZ25hdHVyZXMvX19pbml0X18ucHkiIiIKQ3JlYXRlIGFuZCB2ZXJpZnkgandzLWpzIGZvcm1hdCBFZDI1NTE5IHNpZ25hdHVyZXMuCiIiIgoKX19hbGxfXyA9IFsgJ3NpZ24nLCAndmVyaWZ5JyBdCgppbXBvcnQganNvbgpmcm9tIC4udXRpbCBpbXBvcnQgdXJsc2FmZV9iNjRkZWNvZGUsIHVybHNhZmVfYjY0ZW5jb2RlLCBuYXRpdmUsIGJpbmFyeQoKZWQyNTUxOWxsID0gTm9uZQoKQUxHID0gIkVkMjU1MTkiCgpkZWYgZ2V0X2VkMjU1MTlsbCgpOgogICAgIiIiTGF6eSBpbXBvcnQtYW5kLXRlc3Qgb2YgZWQyNTUxOSBtb2R1bGUiIiIKICAgIGdsb2JhbCBlZDI1NTE5bGwKICAgIAogICAgaWYgbm90IGVkMjU1MTlsbDoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGltcG9ydCBlZDI1NTE5bGwgIyBmYXN0ICh0aG91c2FuZHMgLyBzKQogICAgICAgIGV4Y2VwdCAoSW1wb3J0RXJyb3IsIE9TRXJyb3IpOiAjIHByYWdtYSBub2NvdmVyCiAgICAgICAgICAgIGZyb20gLiBpbXBvcnQgZWQyNTUxOXB5IGFzIGVkMjU1MTlsbCAjIHB1cmUgUHl0aG9uIChodW5kcmVkcyAvIHMpCiAgICAgICAgdGVzdCgpCiAgICAKICAgIHJldHVybiBlZDI1NTE5bGwKCmRlZiBzaWduKHBheWxvYWQsIGtleXBhaXIpOgogICAgIiIiUmV0dXJuIGEgSldTLUpTIGZvcm1hdCBzaWduYXR1cmUgZ2l2ZW4gYSBKU09OLXNlcmlhbGl6YWJsZSBwYXlsb2FkIGFuZCAKICAgIGFuIEVkMjU1MTkga2V5cGFpci4iIiIKICAgIGdldF9lZDI1NTE5bGwoKQogICAgIwogICAgaGVhZGVyID0gewogICAgICAgICAgICAgICAgImFsZyI6IEFMRywKICAgICAgICAgICAgICAgICJqd2siOiB7CiAgICAgICAgICAgICAgICAgICAgImt0eSI6IEFMRywgIyBhbGcgLT4ga3R5IGluIGp3ay0wOC4KICAgICAgICAgICAgICAgICAgICAidmsiOiBuYXRpdmUodXJsc2FmZV9iNjRlbmNvZGUoa2V5cGFpci52aykpCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAKICAgIGVuY29kZWRfaGVhZGVyID0gdXJsc2FmZV9iNjRlbmNvZGUoYmluYXJ5KGpzb24uZHVtcHMoaGVhZGVyLCBzb3J0X2tleXM9VHJ1ZSkpKQogICAgZW5jb2RlZF9wYXlsb2FkID0gdXJsc2FmZV9iNjRlbmNvZGUoYmluYXJ5KGpzb24uZHVtcHMocGF5bG9hZCwgc29ydF9rZXlzPVRydWUpKSkKICAgIHNlY3VyZWRfaW5wdXQgPSBiIi4iLmpvaW4oKGVuY29kZWRfaGVhZGVyLCBlbmNvZGVkX3BheWxvYWQpKQogICAgc2lnX21zZyA9IGVkMjU1MTlsbC5jcnlwdG9fc2lnbihzZWN1cmVkX2lucHV0LCBrZXlwYWlyLnNrKQogICAgc2lnbmF0dXJlID0gc2lnX21zZ1s6ZWQyNTUxOWxsLlNJR05BVFVSRUJZVEVTXQogICAgZW5jb2RlZF9zaWduYXR1cmUgPSB1cmxzYWZlX2I2NGVuY29kZShzaWduYXR1cmUpCiAgICAKICAgIHJldHVybiB7InJlY2lwaWVudHMiOiAKICAgICAgICAgICAgW3siaGVhZGVyIjpuYXRpdmUoZW5jb2RlZF9oZWFkZXIpLAogICAgICAgICAgICAgInNpZ25hdHVyZSI6bmF0aXZlKGVuY29kZWRfc2lnbmF0dXJlKX1dLAogICAgICAgICAgICAicGF5bG9hZCI6IG5hdGl2ZShlbmNvZGVkX3BheWxvYWQpfQoKZGVmIGFzc2VydFRydWUoY29uZGl0aW9uLCBtZXNzYWdlPSIiKToKICAgIGlmIG5vdCBjb25kaXRpb246CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihtZXNzYWdlKQogICAgCmRlZiB2ZXJpZnkoandzanMpOgogICAgIiIiUmV0dXJuIChkZWNvZGVkIGhlYWRlcnMsIHBheWxvYWQpIGlmIGFsbCBzaWduYXR1cmVzIGluIGp3c2pzIGFyZQogICAgY29uc2lzdGVudCwgZWxzZSByYWlzZSBWYWx1ZUVycm9yLgogICAgCiAgICBDYWxsZXIgbXVzdCBkZWNpZGUgd2hldGhlciB0aGUga2V5cyBhcmUgYWN0dWFsbHkgdHJ1c3RlZC4iIiIKICAgIGdldF9lZDI1NTE5bGwoKSAgICAKICAgICMgWFhYIGZvcmJpZCBkdXBsaWNhdGUga2V5cyBpbiBKU09OIGlucHV0IHVzaW5nIG9iamVjdF9wYWlyc19ob29rICgyLjcrKQogICAgcmVjaXBpZW50cyA9IGp3c2pzWyJyZWNpcGllbnRzIl0KICAgIGVuY29kZWRfcGF5bG9hZCA9IGJpbmFyeShqd3Nqc1sicGF5bG9hZCJdKQogICAgaGVhZGVycyA9IFtdCiAgICBmb3IgcmVjaXBpZW50IGluIHJlY2lwaWVudHM6CiAgICAgICAgYXNzZXJ0VHJ1ZShsZW4ocmVjaXBpZW50KSA9PSAyLCAiVW5rbm93biByZWNpcGllbnQga2V5IHswfSIuZm9ybWF0KHJlY2lwaWVudCkpCiAgICAgICAgaCA9IGJpbmFyeShyZWNpcGllbnRbImhlYWRlciJdKQogICAgICAgIHMgPSBiaW5hcnkocmVjaXBpZW50WyJzaWduYXR1cmUiXSkKICAgICAgICBoZWFkZXIgPSBqc29uLmxvYWRzKG5hdGl2ZSh1cmxzYWZlX2I2NGRlY29kZShoKSkpCiAgICAgICAgYXNzZXJ0VHJ1ZShoZWFkZXJbImFsZyJdID09IEFMRywgCiAgICAgICAgICAgICAgICAiVW5leHBlY3RlZCBhbGdvcml0aG0gezB9Ii5mb3JtYXQoaGVhZGVyWyJhbGciXSkpCiAgICAgICAgaWYgImFsZyIgaW4gaGVhZGVyWyJqd2siXSBhbmQgbm90ICJrdHkiIGluIGhlYWRlclsiandrIl06CiAgICAgICAgICAgIGhlYWRlclsiandrIl1bImt0eSJdID0gaGVhZGVyWyJqd2siXVsiYWxnIl0gIyBiL3cgZm9yIEpXSyA8IC0wOAogICAgICAgIGFzc2VydFRydWUoaGVhZGVyWyJqd2siXVsia3R5Il0gPT0gQUxHLCAjIHRydWUgZm9yIEVkMjU1MTkKICAgICAgICAgICAgICAgICJVbmV4cGVjdGVkIGtleSB0eXBlIHswfSIuZm9ybWF0KGhlYWRlclsiandrIl1bImt0eSJdKSkKICAgICAgICB2ayA9IHVybHNhZmVfYjY0ZGVjb2RlKGJpbmFyeShoZWFkZXJbImp3ayJdWyJ2ayJdKSkKICAgICAgICBzZWN1cmVkX2lucHV0ID0gYiIuIi5qb2luKChoLCBlbmNvZGVkX3BheWxvYWQpKQogICAgICAgIHNpZyA9IHVybHNhZmVfYjY0ZGVjb2RlKHMpCiAgICAgICAgc2lnX21zZyA9IHNpZytzZWN1cmVkX2lucHV0CiAgICAgICAgdmVyaWZpZWRfaW5wdXQgPSBuYXRpdmUoZWQyNTUxOWxsLmNyeXB0b19zaWduX29wZW4oc2lnX21zZywgdmspKQogICAgICAgIHZlcmlmaWVkX2hlYWRlciwgdmVyaWZpZWRfcGF5bG9hZCA9IHZlcmlmaWVkX2lucHV0LnNwbGl0KCcuJykKICAgICAgICB2ZXJpZmllZF9oZWFkZXIgPSBiaW5hcnkodmVyaWZpZWRfaGVhZGVyKQogICAgICAgIGRlY29kZWRfaGVhZGVyID0gbmF0aXZlKHVybHNhZmVfYjY0ZGVjb2RlKHZlcmlmaWVkX2hlYWRlcikpCiAgICAgICAgaGVhZGVycy5hcHBlbmQoanNvbi5sb2FkcyhkZWNvZGVkX2hlYWRlcikpCgogICAgdmVyaWZpZWRfcGF5bG9hZCA9IGJpbmFyeSh2ZXJpZmllZF9wYXlsb2FkKQoKICAgICMgb25seSByZXR1cm4gaGVhZGVyLCBwYXlsb2FkIHRoYXQgaGF2ZSBwYXNzZWQgdGhyb3VnaCB0aGUgY3J5cHRvIGxpYnJhcnkuCiAgICBwYXlsb2FkID0ganNvbi5sb2FkcyhuYXRpdmUodXJsc2FmZV9iNjRkZWNvZGUodmVyaWZpZWRfcGF5bG9hZCkpKQoKICAgIHJldHVybiBoZWFkZXJzLCBwYXlsb2FkCgpkZWYgdGVzdCgpOgogICAga3AgPSBlZDI1NTE5bGwuY3J5cHRvX3NpZ25fa2V5cGFpcigpCiAgICBwYXlsb2FkID0geyd0ZXN0JzogJ29uc3RhcnR1cCd9CiAgICBqd3NqcyA9IGpzb24ubG9hZHMoanNvbi5kdW1wcyhzaWduKHBheWxvYWQsIGtwKSkpCiAgICB2ZXJpZnkoandzanMpCiAgICBqd3Nqc1sncGF5bG9hZCddICs9ICd4JwogICAgdHJ5OgogICAgICAgIHZlcmlmeShqd3NqcykKICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgIHBhc3MKICAgIGVsc2U6ICMgcHJhZ21hIG5vIGNvdmVyCiAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJObyBlcnJvciBmcm9tIGJhZCB3aGVlbC5zaWduYXR1cmVzIHBheWxvYWQuIikKClBLAwQUAAAAAAAAACEA/FD/4GMaAABjGgAAOwAAAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC9zaWduYXR1cmVzL2RqYmVjLnB5IyBFZDI1NTE5IGRpZ2l0YWwgc2lnbmF0dXJlcwojIEJhc2VkIG9uIGh0dHA6Ly9lZDI1NTE5LmNyLnlwLnRvL3B5dGhvbi9lZDI1NTE5LnB5CiMgU2VlIGFsc28gaHR0cDovL2VkMjU1MTkuY3IueXAudG8vc29mdHdhcmUuaHRtbAojIEFkYXB0ZWQgYnkgUm9uIEdhcnJldAojIFNwZWQgdXAgY29uc2lkZXJhYmx5IHVzaW5nIGNvb3JkaW5hdGUgdHJhbnNmb3JtcyBmb3VuZCBvbjoKIyBodHRwOi8vd3d3Lmh5cGVyZWxsaXB0aWMub3JnL0VGRC9nMXAvYXV0by10d2lzdGVkLWV4dGVuZGVkLTEuaHRtbAojIFNwZWNpZmljYWxseSBhZGQtMjAwOC1od2NkLTQgYW5kIGRibC0yMDA4LWh3Y2QKCnRyeTogIyBwcmFnbWEgbm9jb3ZlcgogICAgdW5pY29kZQogICAgUFkzID0gRmFsc2UKICAgIGRlZiBhc2J5dGVzKGIpOgogICAgICAgICIiIkNvbnZlcnQgYXJyYXkgb2YgaW50ZWdlcnMgdG8gYnl0ZSBzdHJpbmciIiIKICAgICAgICByZXR1cm4gJycuam9pbihjaHIoeCkgZm9yIHggaW4gYikKICAgIGRlZiBqb2luYnl0ZXMoYik6CiAgICAgICAgIiIiQ29udmVydCBhcnJheSBvZiBieXRlcyB0byBieXRlIHN0cmluZyIiIgogICAgICAgIHJldHVybiAnJy5qb2luKGIpCiAgICBkZWYgYml0KGgsIGkpOgogICAgICAgICIiIlJldHVybiBpJ3RoIGJpdCBvZiBieXRlc3RyaW5nIGgiIiIKICAgICAgICByZXR1cm4gKG9yZChoW2kvLzhdKSA+PiAoaSU4KSkgJiAxCgpleGNlcHQgTmFtZUVycm9yOiAjIHByYWdtYSBub2NvdmVyCiAgICBQWTMgPSBUcnVlCiAgICBhc2J5dGVzID0gYnl0ZXMKICAgIGpvaW5ieXRlcyA9IGJ5dGVzCiAgICBkZWYgYml0KGgsIGkpOgogICAgICAgIHJldHVybiAoaFtpLy84XSA+PiAoaSU4KSkgJiAxCgppbXBvcnQgaGFzaGxpYgoKYiA9IDI1NgpxID0gMioqMjU1IC0gMTkKbCA9IDIqKjI1MiArIDI3NzQyMzE3Nzc3MzcyMzUzNTM1ODUxOTM3NzkwODgzNjQ4NDkzCgpkZWYgSChtKToKICAgIHJldHVybiBoYXNobGliLnNoYTUxMihtKS5kaWdlc3QoKQoKZGVmIGV4cG1vZChiLCBlLCBtKToKICAgIGlmIGUgPT0gMDogcmV0dXJuIDEKICAgIHQgPSBleHBtb2QoYiwgZSAvLyAyLCBtKSAqKiAyICUgbQogICAgaWYgZSAmIDE6IHQgPSAodCAqIGIpICUgbQogICAgcmV0dXJuIHQKCiMgQ2FuIHByb2JhYmx5IGdldCBzb21lIGV4dHJhIHNwZWVkdXAgaGVyZSBieSByZXBsYWNpbmcgdGhpcyB3aXRoCiMgYW4gZXh0ZW5kZWQtZXVjbGlkZWFuLCBidXQgcGVyZm9ybWFuY2Ugc2VlbXMgT0sgd2l0aG91dCB0aGF0CmRlZiBpbnYoeCk6CiAgICByZXR1cm4gZXhwbW9kKHgsIHEtMiwgcSkKCmQgPSAtMTIxNjY1ICogaW52KDEyMTY2NikKSSA9IGV4cG1vZCgyLChxLTEpLy80LHEpCgpkZWYgeHJlY292ZXIoeSk6CiAgICB4eCA9ICh5KnktMSkgKiBpbnYoZCp5KnkrMSkKICAgIHggPSBleHBtb2QoeHgsKHErMykvLzgscSkKICAgIGlmICh4KnggLSB4eCkgJSBxICE9IDA6IHggPSAoeCpJKSAlIHEKICAgIGlmIHggJSAyICE9IDA6IHggPSBxLXgKICAgIHJldHVybiB4CgpCeSA9IDQgKiBpbnYoNSkKQnggPSB4cmVjb3ZlcihCeSkKQiA9IFtCeCAlIHEsQnkgJSBxXQoKI2RlZiBlZHdhcmRzKFAsUSk6CiMgICAgeDEgPSBQWzBdCiMgICAgeTEgPSBQWzFdCiMgICAgeDIgPSBRWzBdCiMgICAgeTIgPSBRWzFdCiMgICAgeDMgPSAoeDEqeTIreDIqeTEpICogaW52KDErZCp4MSp4Mip5MSp5MikKIyAgICB5MyA9ICh5MSp5Mit4MSp4MikgKiBpbnYoMS1kKngxKngyKnkxKnkyKQojICAgIHJldHVybiAoeDMgJSBxLHkzICUgcSkKCiNkZWYgc2NhbGFybXVsdChQLGUpOgojICAgIGlmIGUgPT0gMDogcmV0dXJuIFswLDFdCiMgICAgUSA9IHNjYWxhcm11bHQoUCxlLzIpCiMgICAgUSA9IGVkd2FyZHMoUSxRKQojICAgIGlmIGUgJiAxOiBRID0gZWR3YXJkcyhRLFApCiMgICAgcmV0dXJuIFEKCiMgRmFzdGVyICghKSB2ZXJzaW9uIGJhc2VkIG9uOgojIGh0dHA6Ly93d3cuaHlwZXJlbGxpcHRpYy5vcmcvRUZEL2cxcC9hdXRvLXR3aXN0ZWQtZXh0ZW5kZWQtMS5odG1sCgpkZWYgeHB0X2FkZChwdDEsIHB0Mik6CiAgICAoWDEsIFkxLCBaMSwgVDEpID0gcHQxCiAgICAoWDIsIFkyLCBaMiwgVDIpID0gcHQyCiAgICBBID0gKChZMS1YMSkqKFkyK1gyKSkgJSBxCiAgICBCID0gKChZMStYMSkqKFkyLVgyKSkgJSBxCiAgICBDID0gKFoxKjIqVDIpICUgcQogICAgRCA9IChUMSoyKloyKSAlIHEKICAgIEUgPSAoRCtDKSAlIHEKICAgIEYgPSAoQi1BKSAlIHEKICAgIEcgPSAoQitBKSAlIHEKICAgIEggPSAoRC1DKSAlIHEKICAgIFgzID0gKEUqRikgJSBxCiAgICBZMyA9IChHKkgpICUgcQogICAgWjMgPSAoRipHKSAlIHEKICAgIFQzID0gKEUqSCkgJSBxCiAgICByZXR1cm4gKFgzLCBZMywgWjMsIFQzKQoKZGVmIHhwdF9kb3VibGUgKHB0KToKICAgIChYMSwgWTEsIFoxLCBfKSA9IHB0CiAgICBBID0gKFgxKlgxKQogICAgQiA9IChZMSpZMSkKICAgIEMgPSAoMipaMSpaMSkKICAgIEQgPSAoLUEpICUgcQogICAgSiA9IChYMStZMSkgJSBxCiAgICBFID0gKEoqSi1BLUIpICUgcQogICAgRyA9IChEK0IpICUgcQogICAgRiA9IChHLUMpICUgcQogICAgSCA9IChELUIpICUgcQogICAgWDMgPSAoRSpGKSAlIHEKICAgIFkzID0gKEcqSCkgJSBxCiAgICBaMyA9IChGKkcpICUgcQogICAgVDMgPSAoRSpIKSAlIHEKICAgIHJldHVybiAoWDMsIFkzLCBaMywgVDMpCgpkZWYgcHRfeGZvcm0gKHB0KToKICAgICh4LCB5KSA9IHB0CiAgICByZXR1cm4gKHgsIHksIDEsICh4KnkpJXEpCgpkZWYgcHRfdW54Zm9ybSAocHQpOgogICAgKHgsIHksIHosIF8pID0gcHQKICAgIHJldHVybiAoKHgqaW52KHopKSVxLCAoeSppbnYoeikpJXEpCgpkZWYgeHB0X211bHQgKHB0LCBuKToKICAgIGlmIG49PTA6IHJldHVybiBwdF94Zm9ybSgoMCwxKSkKICAgIF8gPSB4cHRfZG91YmxlKHhwdF9tdWx0KHB0LCBuPj4xKSkKICAgIHJldHVybiB4cHRfYWRkKF8sIHB0KSBpZiBuJjEgZWxzZSBfCgpkZWYgc2NhbGFybXVsdChwdCwgZSk6CiAgICByZXR1cm4gcHRfdW54Zm9ybSh4cHRfbXVsdChwdF94Zm9ybShwdCksIGUpKQoKZGVmIGVuY29kZWludCh5KToKICAgIGJpdHMgPSBbKHkgPj4gaSkgJiAxIGZvciBpIGluIHJhbmdlKGIpXQogICAgZSA9IFsoc3VtKFtiaXRzW2kgKiA4ICsgal0gPDwgaiBmb3IgaiBpbiByYW5nZSg4KV0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShiLy84KV0KICAgIHJldHVybiBhc2J5dGVzKGUpCgpkZWYgZW5jb2RlcG9pbnQoUCk6CiAgICB4ID0gUFswXQogICAgeSA9IFBbMV0KICAgIGJpdHMgPSBbKHkgPj4gaSkgJiAxIGZvciBpIGluIHJhbmdlKGIgLSAxKV0gKyBbeCAmIDFdCiAgICBlID0gWyhzdW0oW2JpdHNbaSAqIDggKyBqXSA8PCBqIGZvciBqIGluIHJhbmdlKDgpXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGIvLzgpXQogICAgcmV0dXJuIGFzYnl0ZXMoZSkKICAgIApkZWYgcHVibGlja2V5KHNrKToKICAgIGggPSBIKHNrKQogICAgYSA9IDIqKihiLTIpICsgc3VtKDIqKmkgKiBiaXQoaCxpKSBmb3IgaSBpbiByYW5nZSgzLGItMikpCiAgICBBID0gc2NhbGFybXVsdChCLGEpCiAgICByZXR1cm4gZW5jb2RlcG9pbnQoQSkKCmRlZiBIaW50KG0pOgogICAgaCA9IEgobSkKICAgIHJldHVybiBzdW0oMioqaSAqIGJpdChoLGkpIGZvciBpIGluIHJhbmdlKDIqYikpCgpkZWYgc2lnbmF0dXJlKG0sc2sscGspOgogICAgaCA9IEgoc2spCiAgICBhID0gMioqKGItMikgKyBzdW0oMioqaSAqIGJpdChoLGkpIGZvciBpIGluIHJhbmdlKDMsYi0yKSkKICAgIGludGVyID0gam9pbmJ5dGVzKFtoW2ldIGZvciBpIGluIHJhbmdlKGIvLzgsYi8vNCldKQogICAgciA9IEhpbnQoaW50ZXIgKyBtKQogICAgUiA9IHNjYWxhcm11bHQoQixyKQogICAgUyA9IChyICsgSGludChlbmNvZGVwb2ludChSKSArIHBrICsgbSkgKiBhKSAlIGwKICAgIHJldHVybiBlbmNvZGVwb2ludChSKSArIGVuY29kZWludChTKQoKZGVmIGlzb25jdXJ2ZShQKToKICAgIHggPSBQWzBdCiAgICB5ID0gUFsxXQogICAgcmV0dXJuICgteCp4ICsgeSp5IC0gMSAtIGQqeCp4KnkqeSkgJSBxID09IDAKCmRlZiBkZWNvZGVpbnQocyk6CiAgICByZXR1cm4gc3VtKDIqKmkgKiBiaXQocyxpKSBmb3IgaSBpbiByYW5nZSgwLGIpKQoKZGVmIGRlY29kZXBvaW50KHMpOgogICAgeSA9IHN1bSgyKippICogYml0KHMsaSkgZm9yIGkgaW4gcmFuZ2UoMCxiLTEpKQogICAgeCA9IHhyZWNvdmVyKHkpCiAgICBpZiB4ICYgMSAhPSBiaXQocyxiLTEpOiB4ID0gcS14CiAgICBQID0gW3gseV0KICAgIGlmIG5vdCBpc29uY3VydmUoUCk6IHJhaXNlIEV4Y2VwdGlvbigiZGVjb2RpbmcgcG9pbnQgdGhhdCBpcyBub3Qgb24gY3VydmUiKQogICAgcmV0dXJuIFAKCmRlZiBjaGVja3ZhbGlkKHMsIG0sIHBrKToKICAgIGlmIGxlbihzKSAhPSBiLy80OiByYWlzZSBFeGNlcHRpb24oInNpZ25hdHVyZSBsZW5ndGggaXMgd3JvbmciKQogICAgaWYgbGVuKHBrKSAhPSBiLy84OiByYWlzZSBFeGNlcHRpb24oInB1YmxpYy1rZXkgbGVuZ3RoIGlzIHdyb25nIikKICAgIFIgPSBkZWNvZGVwb2ludChzWzA6Yi8vOF0pCiAgICBBID0gZGVjb2RlcG9pbnQocGspCiAgICBTID0gZGVjb2RlaW50KHNbYi8vODpiLy80XSkKICAgIGggPSBIaW50KGVuY29kZXBvaW50KFIpICsgcGsgKyBtKQogICAgdjEgPSBzY2FsYXJtdWx0KEIsUykKIyAgdjIgPSBlZHdhcmRzKFIsc2NhbGFybXVsdChBLGgpKQogICAgdjIgPSBwdF91bnhmb3JtKHhwdF9hZGQocHRfeGZvcm0oUiksIHB0X3hmb3JtKHNjYWxhcm11bHQoQSwgaCkpKSkKICAgIHJldHVybiB2MT09djIKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIwojIEN1cnZlMjU1MTkgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGJ5IE1hdHRoZXcgRGVtcHNreSwgZnJvbToKIyBodHRwOi8vY3IueXAudG8vaGlnaHNwZWVkL25hY2xjcnlwdG8tMjAwOTAzMTAucGRmCgojIFAgPSAyICoqIDI1NSAtIDE5ClAgPSBxCkEgPSA0ODY2NjIKCiNkZWYgZXhwbW9kKGIsIGUsIG0pOgojICAgIGlmIGUgPT0gMDogcmV0dXJuIDEKIyAgICB0ID0gZXhwbW9kKGIsIGUgLyAyLCBtKSAqKiAyICUgbQojICAgIGlmIGUgJiAxOiB0ID0gKHQgKiBiKSAlIG0KIyAgICByZXR1cm4gdAoKIyBkZWYgaW52KHgpOiByZXR1cm4gZXhwbW9kKHgsIFAgLSAyLCBQKQoKZGVmIGFkZChuLCBtLCBkKToKICAgICh4biwgem4pID0gbgogICAgKHhtLCB6bSkgPSBtIAogICAgKHhkLCB6ZCkgPSBkCiAgICB4ID0gNCAqICh4bSAqIHhuIC0gem0gKiB6bikgKiogMiAqIHpkCiAgICB6ID0gNCAqICh4bSAqIHpuIC0gem0gKiB4bikgKiogMiAqIHhkCiAgICByZXR1cm4gKHggJSBQLCB6ICUgUCkKCmRlZiBkb3VibGUobik6CiAgICAoeG4sIHpuKSA9IG4KICAgIHggPSAoeG4gKiogMiAtIHpuICoqIDIpICoqIDIKICAgIHogPSA0ICogeG4gKiB6biAqICh4biAqKiAyICsgQSAqIHhuICogem4gKyB6biAqKiAyKQogICAgcmV0dXJuICh4ICUgUCwgeiAlIFApCgpkZWYgY3VydmUyNTUxOShuLCBiYXNlPTkpOgogICAgb25lID0gKGJhc2UsMSkKICAgIHR3byA9IGRvdWJsZShvbmUpCiAgICAjIGYobSkgZXZhbHVhdGVzIHRvIGEgdHVwbGUKICAgICMgY29udGFpbmluZyB0aGUgbXRoIG11bHRpcGxlIGFuZCB0aGUKICAgICMgKG0rMSl0aCBtdWx0aXBsZSBvZiBiYXNlLgogICAgZGVmIGYobSk6CiAgICAgICAgaWYgbSA9PSAxOiByZXR1cm4gKG9uZSwgdHdvKQogICAgICAgIChwbSwgcG0xKSA9IGYobSAvLyAyKQogICAgICAgIGlmIChtICYgMSk6CiAgICAgICAgICAgIHJldHVybiAoYWRkKHBtLCBwbTEsIG9uZSksIGRvdWJsZShwbTEpKQogICAgICAgIHJldHVybiAoZG91YmxlKHBtKSwgYWRkKHBtLCBwbTEsIG9uZSkpCiAgICAoKHgseiksIF8pID0gZihuKQogICAgcmV0dXJuICh4ICogaW52KHopKSAlIFAKCmltcG9ydCByYW5kb20KCmRlZiBnZW5rZXkobj0wKToKICAgIG4gPSBuIG9yIHJhbmRvbS5yYW5kaW50KDAsUCkKICAgIG4gJj0gfjcKICAgIG4gJj0gfigxMjggPDwgOCAqIDMxKQogICAgbiB8PSA2NCA8PCA4ICogMzEKICAgIHJldHVybiBuCgojZGVmIHN0cjJpbnQocyk6CiMgICAgcmV0dXJuIGludChoZXhsaWZ5KHMpLCAxNikKIyAgICAjIHJldHVybiBzdW0ob3JkKHNbaV0pIDw8ICg4ICogaSkgZm9yIGkgaW4gcmFuZ2UoMzIpKQojCiNkZWYgaW50MnN0cihuKToKIyAgICByZXR1cm4gdW5oZXhsaWZ5KCIleCIgJSBuKQojICAgICMgcmV0dXJuICcnLmpvaW4oW2NocigobiA+PiAoOCAqIGkpKSAmIDI1NSkgZm9yIGkgaW4gcmFuZ2UoMzIpXSkKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCmRlZiBkc2FfdGVzdCgpOgogICAgaW1wb3J0IG9zCiAgICBtc2cgPSBzdHIocmFuZG9tLnJhbmRpbnQocSxxK3EpKS5lbmNvZGUoJ3V0Zi04JykKICAgIHNrID0gb3MudXJhbmRvbSgzMikKICAgIHBrID0gcHVibGlja2V5KHNrKQogICAgc2lnID0gc2lnbmF0dXJlKG1zZywgc2ssIHBrKQogICAgcmV0dXJuIGNoZWNrdmFsaWQoc2lnLCBtc2csIHBrKQoKZGVmIGRoX3Rlc3QoKToKICAgIHNrMSA9IGdlbmtleSgpCiAgICBzazIgPSBnZW5rZXkoKQogICAgcmV0dXJuIGN1cnZlMjU1MTkoc2sxLCBjdXJ2ZTI1NTE5KHNrMikpID09IGN1cnZlMjU1MTkoc2syLCBjdXJ2ZTI1NTE5KHNrMSkpCgpQSwMEFAAAAAAAAAAhAEwBJT6fBgAAnwYAAD8AAABwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvc2lnbmF0dXJlcy9lZDI1NTE5cHkucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQoKaW1wb3J0IHdhcm5pbmdzCmltcG9ydCBvcwoKZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgbmFtZWR0dXBsZQpmcm9tIC4gaW1wb3J0IGRqYmVjCgpfX2FsbF9fID0gWydjcnlwdG9fc2lnbicsICdjcnlwdG9fc2lnbl9vcGVuJywgJ2NyeXB0b19zaWduX2tleXBhaXInLCAnS2V5cGFpcicsCiAgICAgICAgICAgJ1BVQkxJQ0tFWUJZVEVTJywgJ1NFQ1JFVEtFWUJZVEVTJywgJ1NJR05BVFVSRUJZVEVTJ10KClBVQkxJQ0tFWUJZVEVTPTMyClNFQ1JFVEtFWUJZVEVTPTY0ClNJR05BVFVSRUJZVEVTPTY0CgpLZXlwYWlyID0gbmFtZWR0dXBsZSgnS2V5cGFpcicsICgndmsnLCAnc2snKSkgIyB2ZXJpZnlpbmcga2V5LCBzZWNyZXQga2V5CgpkZWYgY3J5cHRvX3NpZ25fa2V5cGFpcihzZWVkPU5vbmUpOgogICAgIiIiUmV0dXJuICh2ZXJpZnlpbmcsIHNlY3JldCkga2V5IGZyb20gYSBnaXZlbiBzZWVkLCBvciBvcy51cmFuZG9tKDMyKSIiIiAgICAKICAgIGlmIHNlZWQgaXMgTm9uZToKICAgICAgICBzZWVkID0gb3MudXJhbmRvbShQVUJMSUNLRVlCWVRFUykKICAgIGVsc2U6CiAgICAgICAgd2FybmluZ3Mud2FybigiZWQyNTUxOWxsIHNob3VsZCBjaG9vc2UgcmFuZG9tIHNlZWQuIiwKICAgICAgICAgICAgICAgICAgICAgIFJ1bnRpbWVXYXJuaW5nKQogICAgaWYgbGVuKHNlZWQpICE9IDMyOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInNlZWQgbXVzdCBiZSAzMiByYW5kb20gYnl0ZXMgb3IgTm9uZS4iKQogICAgc2tieXRlcyA9IHNlZWQKICAgIHZrYnl0ZXMgPSBkamJlYy5wdWJsaWNrZXkoc2tieXRlcykKICAgIHJldHVybiBLZXlwYWlyKHZrYnl0ZXMsIHNrYnl0ZXMrdmtieXRlcykKCgpkZWYgY3J5cHRvX3NpZ24obXNnLCBzayk6CiAgICAiIiJSZXR1cm4gc2lnbmF0dXJlK21lc3NhZ2UgZ2l2ZW4gbWVzc2FnZSBhbmQgc2VjcmV0IGtleS4KICAgIFRoZSBzaWduYXR1cmUgaXMgdGhlIGZpcnN0IFNJR05BVFVSRUJZVEVTIGJ5dGVzIG9mIHRoZSByZXR1cm4gdmFsdWUuCiAgICBBIGNvcHkgb2YgbXNnIGlzIGluIHRoZSByZW1haW5kZXIuIiIiCiAgICBpZiBsZW4oc2spICE9IFNFQ1JFVEtFWUJZVEVTOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkJhZCBzaWduaW5nIGtleSBsZW5ndGggJWQiICUgbGVuKHNrKSkKICAgIHZrYnl0ZXMgPSBza1tQVUJMSUNLRVlCWVRFUzpdCiAgICBza2J5dGVzID0gc2tbOlBVQkxJQ0tFWUJZVEVTXQogICAgc2lnID0gZGpiZWMuc2lnbmF0dXJlKG1zZywgc2tieXRlcywgdmtieXRlcykKICAgIHJldHVybiBzaWcgKyBtc2cKCgpkZWYgY3J5cHRvX3NpZ25fb3BlbihzaWduZWQsIHZrKToKICAgICIiIlJldHVybiBtZXNzYWdlIGdpdmVuIHNpZ25hdHVyZSttZXNzYWdlIGFuZCB0aGUgdmVyaWZ5aW5nIGtleS4iIiIKICAgIGlmIGxlbih2aykgIT0gUFVCTElDS0VZQllURVM6CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiQmFkIHZlcmlmeWluZyBrZXkgbGVuZ3RoICVkIiAlIGxlbih2aykpCiAgICByYyA9IGRqYmVjLmNoZWNrdmFsaWQoc2lnbmVkWzpTSUdOQVRVUkVCWVRFU10sIHNpZ25lZFtTSUdOQVRVUkVCWVRFUzpdLCB2aykKICAgIGlmIG5vdCByYzoKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJyYyAhPSBUcnVlIiwgcmMpICAgIAogICAgcmV0dXJuIHNpZ25lZFtTSUdOQVRVUkVCWVRFUzpdCgpQSwMEFAAAAAAAAAAhANvb4i30DAAA9AwAADoAAABwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvc2lnbmF0dXJlcy9rZXlzLnB5IiIiU3RvcmUgYW5kIHJldHJpZXZlIHdoZWVsIHNpZ25pbmcgLyB2ZXJpZnlpbmcga2V5cy4KCkdpdmVuIGEgc2NvcGUgKGEgcGFja2FnZSBuYW1lLCArIG1lYW5pbmcgImFsbCBwYWNrYWdlcyIsIG9yIC0gbWVhbmluZyAKIm5vIHBhY2thZ2VzIiksIHJldHVybiBhIGxpc3Qgb2YgdmVyaWZ5aW5nIGtleXMgdGhhdCBhcmUgdHJ1c3RlZCBmb3IgdGhhdCAKc2NvcGUuCgpHaXZlbiBhIHBhY2thZ2UgbmFtZSwgcmV0dXJuIGEgbGlzdCBvZiAoc2NvcGUsIGtleSkgc3VnZ2VzdGVkIGtleXMgdG8gc2lnbgp0aGF0IHBhY2thZ2UgKG9ubHkgdGhlIHZlcmlmeWluZyBrZXlzOyB0aGUgcHJpdmF0ZSBzaWduaW5nIGtleSBpcyBzdG9yZWQKZWxzZXdoZXJlKS4KCktleXMgaGVyZSBhcmUgcmVwcmVzZW50ZWQgYXMgdXJsc2FmZV9iNjRlbmNvZGVkIHN0cmluZ3Mgd2l0aCBubyBwYWRkaW5nLgoKVGVudGF0aXZlIGNvbW1hbmQgbGluZSBpbnRlcmZhY2U6CgojIGxpc3QgdHJ1c3RzCndoZWVsIHRydXN0CiMgdHJ1c3QgYSBwYXJ0aWN1bGFyIGtleSBmb3IgYWxsCndoZWVsIHRydXN0ICsga2V5CiMgdHJ1c3Qga2V5IGZvciBiZWFnbGV2b3RlCndoZWVsIHRydXN0IGJlYWdsZXZvdGUga2V5CiMgc3RvcCB0cnVzdGluZyBhIGtleSBmb3IgYWxsCndoZWVsIHVudHJ1c3QgKyBrZXkKCiMgZ2VuZXJhdGUgYSBrZXkgcGFpcgp3aGVlbCBrZXlnZW4KCiMgaW1wb3J0IGEgc2lnbmluZyBrZXkgZnJvbSBhIGZpbGUKd2hlZWwgaW1wb3J0IGtleWZpbGUKCiMgZXhwb3J0IGEgc2lnbmluZyBrZXkKd2hlZWwgZXhwb3J0IGtleQoiIiIKCmltcG9ydCBqc29uCmltcG9ydCBvcy5wYXRoCmZyb20gLi51dGlsIGltcG9ydCBuYXRpdmUsIGxvYWRfY29uZmlnX3BhdGhzLCBzYXZlX2NvbmZpZ19wYXRoCgpjbGFzcyBXaGVlbEtleXMob2JqZWN0KToKICAgIFNDSEVNQSA9IDEKICAgIENPTkZJR19OQU1FID0gJ3doZWVsLmpzb24nCiAgICAKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzZWxmLmRhdGEgPSB7J3NpZ25lcnMnOltdLCAndmVyaWZpZXJzJzpbXX0KICAgICAgICAKICAgIGRlZiBsb2FkKHNlbGYpOgogICAgICAgICMgWFhYIEpTT04gaXMgbm90IGEgZ3JlYXQgZGF0YWJhc2UKICAgICAgICBmb3IgcGF0aCBpbiBsb2FkX2NvbmZpZ19wYXRocygnd2hlZWwnKToKICAgICAgICAgICAgY29uZiA9IG9zLnBhdGguam9pbihuYXRpdmUocGF0aCksIHNlbGYuQ09ORklHX05BTUUpCiAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGNvbmYpOgogICAgICAgICAgICAgICAgd2l0aCBvcGVuKGNvbmYsICdyJykgYXMgaW5maWxlOgogICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IGpzb24ubG9hZChpbmZpbGUpCiAgICAgICAgICAgICAgICAgICAgZm9yIHggaW4gKCdzaWduZXJzJywgJ3ZlcmlmaWVycycpOgogICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgeCBpbiBzZWxmLmRhdGE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRhdGFbeF0gPSBbXQogICAgICAgICAgICAgICAgICAgIGlmICdzY2hlbWEnIG5vdCBpbiBzZWxmLmRhdGE6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YVsnc2NoZW1hJ10gPSBzZWxmLlNDSEVNQQogICAgICAgICAgICAgICAgICAgIGVsaWYgc2VsZi5kYXRhWydzY2hlbWEnXSAhPSBzZWxmLlNDSEVNQToKICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCYWQgd2hlZWwuanNvbiB2ZXJzaW9uIHswfSwgZXhwZWN0ZWQgezF9Ii5mb3JtYXQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kYXRhWydzY2hlbWEnXSwgc2VsZi5TQ0hFTUEpKQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBzYXZlKHNlbGYpOgogICAgICAgICMgVHJ5IG5vdCB0byBjYWxsIHRoaXMgYSB2ZXJ5IGxvbmcgdGltZSBhZnRlciBsb2FkKCkgCiAgICAgICAgcGF0aCA9IHNhdmVfY29uZmlnX3BhdGgoJ3doZWVsJykKICAgICAgICBjb25mID0gb3MucGF0aC5qb2luKG5hdGl2ZShwYXRoKSwgc2VsZi5DT05GSUdfTkFNRSkKICAgICAgICB3aXRoIG9wZW4oY29uZiwgJ3crJykgYXMgb3V0OgogICAgICAgICAgICBqc29uLmR1bXAoc2VsZi5kYXRhLCBvdXQsIGluZGVudD0yKQogICAgICAgIHJldHVybiBzZWxmCiAgICAKICAgIGRlZiB0cnVzdChzZWxmLCBzY29wZSwgdmspOgogICAgICAgICIiIlN0YXJ0IHRydXN0aW5nIGEgcGFydGljdWxhciBrZXkgZm9yIGdpdmVuIHNjb3BlLiIiIgogICAgICAgIHNlbGYuZGF0YVsndmVyaWZpZXJzJ10uYXBwZW5kKHsnc2NvcGUnOnNjb3BlLCAndmsnOnZrfSkKICAgICAgICByZXR1cm4gc2VsZgogICAgCiAgICBkZWYgdW50cnVzdChzZWxmLCBzY29wZSwgdmspOgogICAgICAgICIiIlN0b3AgdHJ1c3RpbmcgYSBwYXJ0aWN1bGFyIGtleSBmb3IgZ2l2ZW4gc2NvcGUuIiIiCiAgICAgICAgc2VsZi5kYXRhWyd2ZXJpZmllcnMnXS5yZW1vdmUoeydzY29wZSc6c2NvcGUsICd2ayc6dmt9KQogICAgICAgIHJldHVybiBzZWxmCiAgICAgICAgCiAgICBkZWYgdHJ1c3RlZChzZWxmLCBzY29wZT1Ob25lKToKICAgICAgICAiIiJSZXR1cm4gbGlzdCBvZiBbKHNjb3BlLCB0cnVzdGVkIGtleSksIC4uLl0gZm9yIGdpdmVuIHNjb3BlLiIiIgogICAgICAgIHRydXN0ID0gWyh4WydzY29wZSddLCB4Wyd2ayddKSBmb3IgeCBpbiBzZWxmLmRhdGFbJ3ZlcmlmaWVycyddIGlmIHhbJ3Njb3BlJ10gaW4gKHNjb3BlLCAnKycpXQogICAgICAgIHRydXN0LnNvcnQoa2V5PWxhbWJkYSB4OiB4WzBdKQogICAgICAgIHRydXN0LnJldmVyc2UoKQogICAgICAgIHJldHVybiB0cnVzdAogICAgCiAgICBkZWYgc2lnbmVycyhzZWxmLCBzY29wZSk6CiAgICAgICAgIiIiUmV0dXJuIGxpc3Qgb2Ygc2lnbmluZyBrZXkocykuIiIiCiAgICAgICAgc2lnbiA9IFsoeFsnc2NvcGUnXSwgeFsndmsnXSkgZm9yIHggaW4gc2VsZi5kYXRhWydzaWduZXJzJ10gaWYgeFsnc2NvcGUnXSBpbiAoc2NvcGUsICcrJyldCiAgICAgICAgc2lnbi5zb3J0KGtleT1sYW1iZGEgeDogeFswXSkKICAgICAgICBzaWduLnJldmVyc2UoKQogICAgICAgIHJldHVybiBzaWduCiAgICAKICAgIGRlZiBhZGRfc2lnbmVyKHNlbGYsIHNjb3BlLCB2ayk6CiAgICAgICAgIiIiUmVtZW1iZXIgdmVyaWZ5aW5nIGtleSB2ayBhcyBiZWluZyB2YWxpZCBmb3Igc2lnbmluZyBpbiBzY29wZS4iIiIKICAgICAgICBzZWxmLmRhdGFbJ3NpZ25lcnMnXS5hcHBlbmQoeydzY29wZSc6c2NvcGUsICd2ayc6dmt9KQogICAgClBLAwQUAAAAAAAAACEA/55lcAEAAAABAAAAOAAAAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L19faW5pdF9fLnB5I1BLAwQUAAAAAAAAACEAAAAAAAAAAAAAAAAARQAAAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L2NvbXBsZXgtZGlzdC9fX2luaXRfXy5weVBLAwQUAAAAAAAAACEAShdH0hcAAAAXAAAAUQAAAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L2NvbXBsZXgtZGlzdC9jb21wbGV4ZGlzdC9fX2luaXRfXy5weWRlZiBtYWluKCk6CiAgICByZXR1cm4KUEsDBBQAAAAAAAAAIQAcChc4VwMAAFcDAABCAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3QvY29tcGxleC1kaXN0L3NldHVwLnB5ZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBzZXR1cAoKdHJ5OgogICAgdW5pY29kZQogICAgZGVmIHU4KHMpOgogICAgICAgIHJldHVybiBzLmRlY29kZSgndW5pY29kZS1lc2NhcGUnKQpleGNlcHQgTmFtZUVycm9yOgogICAgZGVmIHU4KHMpOgogICAgICAgIHJldHVybiBzCgpzZXR1cChuYW1lPSdjb21wbGV4LWRpc3QnLAogICAgICB2ZXJzaW9uPScwLjEnLAogICAgICBkZXNjcmlwdGlvbj11OCgnQW5vdGhlciB0ZXN0aW5nIGRpc3RyaWJ1dGlvbiBcTntTTk9XTUFOfScpLAogICAgICBsb25nX2Rlc2NyaXB0aW9uPXU4KCdBbm90aGVyIHRlc3RpbmcgZGlzdHJpYnV0aW9uIFxOe1NOT1dNQU59JyksCiAgICAgIGF1dGhvcj0iSWxsdXN0cmlvdXMgQXV0aG9yIiwKICAgICAgYXV0aG9yX2VtYWlsPSJpbGx1c3RyaW91c0BleGFtcGxlLm9yZyIsCiAgICAgIHVybD0iaHR0cDovL2V4YW1wbGUub3JnL2V4ZW1wbGFyeSIsCiAgICAgIHBhY2thZ2VzPVsnY29tcGxleGRpc3QnXSwKICAgICAgc2V0dXBfcmVxdWlyZXM9WyJ3aGVlbCIsICJzZXR1cHRvb2xzIl0sCiAgICAgIGluc3RhbGxfcmVxdWlyZXM9WyJxdXV4IiwgInNwbG9ydCJdLAogICAgICBleHRyYXNfcmVxdWlyZT17J3NpbXBsZSc6WydzaW1wbGUuZGlzdCddfSwKICAgICAgdGVzdHNfcmVxdWlyZT1bImZvbyIsICJiYXI+PTEwLjAuMCJdLAogICAgICBlbnRyeV9wb2ludHM9ewogICAgICAgICAgJ2NvbnNvbGVfc2NyaXB0cyc6IFsKICAgICAgICAgICAgICAnY29tcGxleC1kaXN0PWNvbXBsZXhkaXN0Om1haW4nLAogICAgICAgICAgICAgICdjb21wbGV4LWRpc3QyPWNvbXBsZXhkaXN0Om1haW4nLAogICAgICAgICAgXSwKICAgICAgfSwKICAgICAgKQoKUEsDBBQAAAAAAAAAIQAoSxhlmQYAAJkGAAA4AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3QvY29uZnRlc3QucHkiIiINCnB5dGVzdCBsb2NhbCBjb25maWd1cmF0aW9uIHBsdWctaW4NCiIiIg0KDQppbXBvcnQgZ2MNCmltcG9ydCB3YXJuaW5ncw0KDQppbXBvcnQgcHl0ZXN0DQoNCkBweXRlc3QueWllbGRfZml4dHVyZShzY29wZT0nZnVuY3Rpb24nLCBhdXRvdXNlPVRydWUpDQpkZWYgZXJyb3Jfb25fUmVzb3VyY2VXYXJuaW5nKCk6DQogICAgIiIiVGhpcyBmaXh0dXJlIGNhcHR1cmVzIFJlc291cmNlV2FybmluZydzIGFuZCByZXBvcnRzIGFuICJlcnJvciINCiAgICBkZXNjcmliaW5nIHRoZSBmaWxlIGhhbmRsZXMgbGVmdCBvcGVuLg0KICAgIA0KICAgIFRoaXMgaXMgc2hvd24gcmVnYXJkbGVzcyBvZiBob3cgc3VjY2Vzc2Z1bCB0aGUgdGVzdCB3YXMsIGlmIGEgdGVzdCBmYWlscw0KICAgIGFuZCBsZWF2ZXMgZmlsZXMgb3BlbiB0aGVuIHRob3NlIGZpbGVzIHdpbGwgYmUgcmVwb3J0ZWQuICBJZGVhbGx5LCBldmVuDQogICAgdGhvc2UgZmlsZXMgc2hvdWxkIGJlIGNsb3NlZCBwcm9wZXJseSBhZnRlciBhIHRlc3QgZmFpbHVyZSBvciBleGNlcHRpb24uDQoNCiAgICBTaW5jZSBvbmx5IFB5dGhvbiAzIGFuZCBQeVB5MyBoYXZlIFJlc291cmNlV2FybmluZydzLCB0aGlzIGNvbnRleHQgd2lsbA0KICAgIGhhdmUgbm8gZWZmZWN0IHdoZW4gcnVubmluZyB0ZXN0cyBvbiBQeXRob24gMiBvciBQeVB5Lg0KDQogICAgQmVjYXVzZSBvZiBhdXRvdXNlPVRydWUsIHRoaXMgZnVuY3Rpb24gd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGVuYWJsZWQgZm9yDQogICAgYWxsIHRlc3RfKiBmdW5jdGlvbnMgaW4gdGhpcyBtb2R1bGUuDQoNCiAgICBUaGlzIGNvZGUgaXMgcHJpbWFyaWx5IGJhc2VkIG9uIHRoZSBleGFtcGxlcyBmb3VuZCBoZXJlOg0KICAgIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzI0NzE3MDI3L2NvbnZlcnQtcHl0aG9uLTMtcmVzb3VyY2V3YXJuaW5ncy1pbnRvLWV4Y2VwdGlvbg0KICAgICIiIg0KICAgIHRyeToNCiAgICAgICAgUmVzb3VyY2VXYXJuaW5nDQogICAgZXhjZXB0IE5hbWVFcnJvcjoNCiAgICAgICAgIyBQeXRob24gMiwgUHlQeQ0KICAgICAgICB5aWVsZA0KICAgICAgICByZXR1cm4NCiAgICAjIFB5dGhvbiAzLCBQeVB5Mw0KICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MocmVjb3JkPVRydWUpIGFzIGNhdWdodDoNCiAgICAgICAgd2FybmluZ3MucmVzZXR3YXJuaW5ncygpICMgY2xlYXIgYWxsIGZpbHRlcnMNCiAgICAgICAgd2FybmluZ3Muc2ltcGxlZmlsdGVyKCdpZ25vcmUnKSAjIGlnbm9yZSBhbGwNCiAgICAgICAgd2FybmluZ3Muc2ltcGxlZmlsdGVyKCdhbHdheXMnLCBSZXNvdXJjZVdhcm5pbmcpICMgYWRkIGZpbHRlcg0KICAgICAgICB5aWVsZCAjIHJ1biB0ZXN0cyBpbiB0aGlzIGNvbnRleHQNCiAgICAgICAgZ2MuY29sbGVjdCgpICMgcnVuIGdhcmJhZ2UgY29sbGVjdGlvbiAoZm9yIHB5cHkzKQ0KICAgICAgICBpZiBub3QgY2F1Z2h0Og0KICAgICAgICAgICAgcmV0dXJuDQogICAgICAgIHB5dGVzdC5mYWlsKCdUaGUgZm9sbG93aW5nIGZpbGUgZGVzY3JpcHRvcnMgd2VyZSBub3QgY2xvc2VkIHByb3Blcmx5OlxuJyArDQogICAgICAgICAgICAgICAgICAgICdcbicuam9pbigoc3RyKHdhcm5pbmcubWVzc2FnZSkgZm9yIHdhcm5pbmcgaW4gY2F1Z2h0KSksDQogICAgICAgICAgICAgICAgICAgIHB5dHJhY2U9RmFsc2UpDQpQSwMEFAAAAAAAAAAhAAAAAAAAAAAAAAAAAEcAAABwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC9leHRlbnNpb24uZGlzdC9fX2luaXRfXy5weVBLAwQUAAAAAAAAACEAX4bMT8gBAADIAQAARAAAAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L2V4dGVuc2lvbi5kaXN0L3NldHVwLnB5ZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBzZXR1cCwgRXh0ZW5zaW9uCgp0cnk6CiAgICB1bmljb2RlCiAgICBkZWYgdTgocyk6CiAgICAgICAgcmV0dXJuIHMuZGVjb2RlKCd1bmljb2RlLWVzY2FwZScpLmVuY29kZSgndXRmLTgnKQpleGNlcHQgTmFtZUVycm9yOgogICAgZGVmIHU4KHMpOgogICAgICAgIHJldHVybiBzLmVuY29kZSgndXRmLTgnKQoKc2V0dXAobmFtZT0nZXh0ZW5zaW9uLmRpc3QnLAogICAgICB2ZXJzaW9uPScwLjEnLAogICAgICBkZXNjcmlwdGlvbj11OCgnQSB0ZXN0aW5nIGRpc3RyaWJ1dGlvbiBcTntTTk9XTUFOfScpLAogICAgICBleHRfbW9kdWxlcz1bCiAgICAgICAgICBFeHRlbnNpb24obmFtZT0nZXh0ZW5zaW9uJywgCiAgICAgICAgICBzb3VyY2VzPVsnZXh0ZW5zaW9uLmMnXSwgCiAgICAgICAgICBweV9saW1pdGVkX2FwaT1UcnVlKQogICAgICAgICAgXSwKICAgICAgKQoKUEsDBBQAAAAAAAAAIQAAAAAAAAAAAAAAAABFAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3QvaGVhZGVycy5kaXN0L19faW5pdF9fLnB5UEsDBBQAAAAAAAAAIQAAAAAAAAAAAAAAAABCAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3QvaGVhZGVycy5kaXN0L2hlYWRlci5oUEsDBBQAAAAAAAAAIQAAAAAAAAAAAAAAAABIAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3QvaGVhZGVycy5kaXN0L2hlYWRlcnNkaXN0LnB5UEsDBBQAAAAAAAAAIQCZxCcsRAEAAEQBAABCAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3QvaGVhZGVycy5kaXN0L3NldHVwLnB5ZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBzZXR1cAoKdHJ5OgogICAgdW5pY29kZQogICAgZGVmIHU4KHMpOgogICAgICAgIHJldHVybiBzLmRlY29kZSgndW5pY29kZS1lc2NhcGUnKS5lbmNvZGUoJ3V0Zi04JykKZXhjZXB0IE5hbWVFcnJvcjoKICAgIGRlZiB1OChzKToKICAgICAgICByZXR1cm4gcy5lbmNvZGUoJ3V0Zi04JykKCnNldHVwKG5hbWU9J2hlYWRlcnMuZGlzdCcsCiAgICAgIHZlcnNpb249JzAuMScsCiAgICAgIGRlc2NyaXB0aW9uPXU4KCdBIGRpc3RyaWJ1dGlvbiB3aXRoIGhlYWRlcnMnKSwKICAgICAgaGVhZGVycz1bJ2hlYWRlci5oJ10KICAgICAgKQoKUEsDBBQAAAAAAAAAIQBqPt3X2ywAANssAAA/AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3QvcHlkaXN0LXNjaGVtYS5qc29uewogICJpZCI6ICJodHRwOi8vd3d3LnB5dGhvbi5vcmcvZGV2L3BlcHMvcGVwLTA0MjYvIiwKICAiJHNjaGVtYSI6ICJodHRwOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LTA0L3NjaGVtYSMiLAogICJ0aXRsZSI6ICJNZXRhZGF0YSBmb3IgUHl0aG9uIFNvZnR3YXJlIFBhY2thZ2VzIDIuMCIsCiAgInR5cGUiOiAib2JqZWN0IiwKICAicHJvcGVydGllcyI6IHsKICAgICJtZXRhZGF0YV92ZXJzaW9uIjogewogICAgICAiZGVzY3JpcHRpb24iOiAiVmVyc2lvbiBvZiB0aGUgZmlsZSBmb3JtYXQiLAogICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAicGF0dGVybiI6ICJeKFxcZCsoXFwuXFxkKykqKSQiCiAgICB9LAogICAgImdlbmVyYXRvciI6IHsKICAgICAgImRlc2NyaXB0aW9uIjogIk5hbWUgYW5kIHZlcnNpb24gb2YgdGhlIHByb2dyYW0gdGhhdCBwcm9kdWNlZCB0aGlzIGZpbGUuIiwKICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgInBhdHRlcm4iOiAiXlswLTlBLVphLXpdKFswLTlBLVphLXpfLi1dKlswLTlBLVphLXpdKSggXFwoLipcXCkpPyQiCiAgICB9LAogICAgIm5hbWUiOiB7CiAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgbmFtZSBvZiB0aGUgZGlzdHJpYnV0aW9uLiIsCiAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvZGlzdHJpYnV0aW9uX25hbWUiCiAgICB9LAogICAgInZlcnNpb24iOiB7CiAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgZGlzdHJpYnV0aW9uJ3MgcHVibGljIHZlcnNpb24gaWRlbnRpZmllciIsCiAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICJwYXR0ZXJuIjogIl4oXFxkKyhcXC5cXGQrKSopKChhfGJ8Y3xyYykoXFxkKykpPyhcXC4ocG9zdCkoXFxkKykpPyhcXC4oZGV2KShcXGQrKSk/JCIKICAgIH0sCiAgICAic291cmNlX2xhYmVsIjogewogICAgICAiZGVzY3JpcHRpb24iOiAiQSBjb25zdHJhaW5lZCBpZGVudGlmeWluZyB0ZXh0IHN0cmluZyIsCiAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICJwYXR0ZXJuIjogIl5bMC05YS16Xy4tK10rJCIKICAgIH0sCiAgICAic291cmNlX3VybCI6IHsKICAgICAgImRlc2NyaXB0aW9uIjogIkEgc3RyaW5nIGNvbnRhaW5pbmcgYSBmdWxsIFVSTCB3aGVyZSB0aGUgc291cmNlIGZvciB0aGlzIHNwZWNpZmljIHZlcnNpb24gb2YgdGhlIGRpc3RyaWJ1dGlvbiBjYW4gYmUgZG93bmxvYWRlZC4iLAogICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAiZm9ybWF0IjogInVyaSIKICAgIH0sCiAgICAic3VtbWFyeSI6IHsKICAgICAgImRlc2NyaXB0aW9uIjogIkEgb25lLWxpbmUgc3VtbWFyeSBvZiB3aGF0IHRoZSBkaXN0cmlidXRpb24gZG9lcy4iLAogICAgICAidHlwZSI6ICJzdHJpbmciCiAgICB9LAogICAgImV4dHJhcyI6IHsKICAgICAgImRlc2NyaXB0aW9uIjogIkEgbGlzdCBvZiBvcHRpb25hbCBzZXRzIG9mIGRlcGVuZGVuY2llcyB0aGF0IG1heSBiZSB1c2VkIHRvIGRlZmluZSBjb25kaXRpb25hbCBkZXBlbmRlbmNpZXMgaW4gXCJtYXlfcmVxdWlyZVwiIGFuZCBzaW1pbGFyIGZpZWxkcy4iLAogICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICJpdGVtcyI6IHsKICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvZXh0cmFfbmFtZSIKICAgICAgfQogICAgfSwKICAgICJtZXRhX3JlcXVpcmVzIjogewogICAgICAiZGVzY3JpcHRpb24iOiAiQSBsaXN0IG9mIHN1YmRpc3RyaWJ1dGlvbnMgbWFkZSBhdmFpbGFibGUgdGhyb3VnaCB0aGlzIG1ldGFkaXN0cmlidXRpb24uIiwKICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2RlcGVuZGVuY2llcyIKICAgIH0sCiAgICAicnVuX3JlcXVpcmVzIjogewogICAgICAiZGVzY3JpcHRpb24iOiAiQSBsaXN0IG9mIG90aGVyIGRpc3RyaWJ1dGlvbnMgbmVlZGVkIHRvIHJ1biB0aGlzIGRpc3RyaWJ1dGlvbi4iLAogICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvZGVwZW5kZW5jaWVzIgogICAgfSwKICAgICJ0ZXN0X3JlcXVpcmVzIjogewogICAgICAiZGVzY3JpcHRpb24iOiAiQSBsaXN0IG9mIG90aGVyIGRpc3RyaWJ1dGlvbnMgbmVlZGVkIHdoZW4gdGhpcyBkaXN0cmlidXRpb24gaXMgdGVzdGVkLiIsCiAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9kZXBlbmRlbmNpZXMiCiAgICB9LAogICAgImJ1aWxkX3JlcXVpcmVzIjogewogICAgICAiZGVzY3JpcHRpb24iOiAiQSBsaXN0IG9mIG90aGVyIGRpc3RyaWJ1dGlvbnMgbmVlZGVkIHdoZW4gdGhpcyBkaXN0cmlidXRpb24gaXMgYnVpbHQuIiwKICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2RlcGVuZGVuY2llcyIKICAgIH0sCiAgICAiZGV2X3JlcXVpcmVzIjogewogICAgICAiZGVzY3JpcHRpb24iOiAiQSBsaXN0IG9mIG90aGVyIGRpc3RyaWJ1dGlvbnMgbmVlZGVkIHdoZW4gdGhpcyBkaXN0cmlidXRpb24gaXMgZGV2ZWxvcGVkLiIsCiAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9kZXBlbmRlbmNpZXMiCiAgICB9LAogICAgInByb3ZpZGVzIjogewogICAgICAiZGVzY3JpcHRpb24iOiAiQSBsaXN0IG9mIHN0cmluZ3MgbmFtaW5nIGFkZGl0aW9uYWwgZGVwZW5kZW5jeSByZXF1aXJlbWVudHMgdGhhdCBhcmUgc2F0aXNmaWVkIGJ5IGluc3RhbGxpbmcgdGhpcyBkaXN0cmlidXRpb24uIFRoZXNlIHN0cmluZ3MgbXVzdCBiZSBvZiB0aGUgZm9ybSBOYW1lIG9yIE5hbWUgKFZlcnNpb24pIiwKICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAiaXRlbXMiOiB7CiAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3Byb3ZpZGVzX2RlY2xhcmF0aW9uIgogICAgICB9CiAgICB9LAogICAgIm1vZHVsZXMiOiB7CiAgICAgICJkZXNjcmlwdGlvbiI6ICJBIGxpc3Qgb2YgbW9kdWxlcyBhbmQvb3IgcGFja2FnZXMgYXZhaWxhYmxlIGZvciBpbXBvcnQgYWZ0ZXIgaW5zdGFsbGluZyB0aGlzIGRpc3RyaWJ1dGlvbi4iLAogICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICJpdGVtcyI6IHsKICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvcXVhbGlmaWVkX25hbWUiCiAgICAgIH0KICAgIH0sCiAgICAibmFtZXNwYWNlcyI6IHsKICAgICAgImRlc2NyaXB0aW9uIjogIkEgbGlzdCBvZiBuYW1lc3BhY2UgcGFja2FnZXMgdGhpcyBkaXN0cmlidXRpb24gY29udHJpYnV0ZXMgdG8iLAogICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICJpdGVtcyI6IHsKICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvcXVhbGlmaWVkX25hbWUiCiAgICAgIH0KICAgIH0sCiAgICAib2Jzb2xldGVkX2J5IjogewogICAgICAiZGVzY3JpcHRpb24iOiAiQSBzdHJpbmcgdGhhdCBpbmRpY2F0ZXMgdGhhdCB0aGlzIHByb2plY3QgaXMgbm8gbG9uZ2VyIGJlaW5nIGRldmVsb3BlZC4gVGhlIG5hbWVkIHByb2plY3QgcHJvdmlkZXMgYSBzdWJzdGl0dXRlIG9yIHJlcGxhY2VtZW50LiIsCiAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvcmVxdWlyZW1lbnQiCiAgICB9LAogICAgInN1cHBvcnRzX2Vudmlyb25tZW50cyI6IHsKICAgICAgImRlc2NyaXB0aW9uIjogIkEgbGlzdCBvZiBzdHJpbmdzIHNwZWNpZnlpbmcgdGhlIGVudmlyb25tZW50cyB0aGF0IHRoZSBkaXN0cmlidXRpb24gZXhwbGljaXRseSBzdXBwb3J0cy4iLAogICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICJpdGVtcyI6IHsKICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvZW52aXJvbm1lbnRfbWFya2VyIgogICAgICB9CiAgICB9LAogICAgImluc3RhbGxfaG9va3MiOiB7CiAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgaW5zdGFsbF9ob29rcyBmaWVsZCBpcyB1c2VkIHRvIGRlZmluZSB2YXJpb3VzIG9wZXJhdGlvbnMgdGhhdCBtYXkgYmUgaW52b2tlZCBvbiBhIGRpc3RyaWJ1dGlvbiBpbiBhIHBsYXRmb3JtIGluZGVwZW5kZW50IG1hbm5lci4iLAogICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAicG9zdGluc3RhbGwiOiB7CiAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9leHBvcnRfc3BlY2lmaWVyIgogICAgICAgIH0sCiAgICAgICAgInByZXVuaW5zdGFsbCI6IHsKICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2V4cG9ydF9zcGVjaWZpZXIiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgImV4dGVuc2lvbnMiOiB7CiAgICAgICJkZXNjcmlwdGlvbiI6ICJFeHRlbnNpb25zIHRvIHRoZSBtZXRhZGF0YSBtYXkgYmUgcHJlc2VudCBpbiBhIG1hcHBpbmcgdW5kZXIgdGhlICdleHRlbnNpb25zJyBrZXkuIiwKICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9leHRlbnNpb25zIgogICAgfQogIH0sCgogICJyZXF1aXJlZCI6IFsibWV0YWRhdGFfdmVyc2lvbiIsICJuYW1lIiwgInZlcnNpb24iLCAic3VtbWFyeSJdLAogICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IGZhbHNlLAoKICAiZGVmaW5pdGlvbnMiOiB7CiAgICAiY29udGFjdCI6IHsKICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgIm5hbWUiOiB7CiAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgfSwKICAgICAgICAiZW1haWwiOiB7CiAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgfSwKICAgICAgICAidXJsIjogewogICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgIH0sCiAgICAgICAgInJvbGUiOiB7CiAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgfQogICAgICB9LAogICAgICAicmVxdWlyZWQiOiBbIm5hbWUiXSwKICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogZmFsc2UKICAgIH0sCiAgICAiZGVwZW5kZW5jaWVzIjogewogICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICJpdGVtcyI6IHsKICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvZGVwZW5kZW5jeSIKICAgICAgfQogICAgfSwKICAgICJkZXBlbmRlbmN5IjogewogICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAiZXh0cmEiOiB7CiAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9leHRyYV9uYW1lIgogICAgICAgIH0sCiAgICAgICAgImVudmlyb25tZW50IjogewogICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvZW52aXJvbm1lbnRfbWFya2VyIgogICAgICAgIH0sCiAgICAgICAgInJlcXVpcmVzIjogewogICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3JlcXVpcmVtZW50IgogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgInJlcXVpcmVkIjogWyJyZXF1aXJlcyJdLAogICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiBmYWxzZQogICAgfSwKICAgICJleHRlbnNpb25zIjogewogICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAicGF0dGVyblByb3BlcnRpZXMiOiB7CiAgICAgICAgIl5bQS1aYS16XVswLTlBLVphLXpfXSooWy5dWzAtOUEtWmEtel9dKikqJCI6IHt9CiAgICAgIH0sCiAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICJweXRob24uZGV0YWlscyIgOiB7CiAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTW9yZSBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhlIGRpc3RyaWJ1dGlvbi4iLAogICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAiZG9jdW1lbnRfbmFtZXMiOiB7CiAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk5hbWVzIG9mIHN1cHBvcnRpbmcgbWV0YWRhdGEgZG9jdW1lbnRzIiwKICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogewogICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2RvY3VtZW50X25hbWUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImNoYW5nZWxvZyI6IHsKICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9kb2N1bWVudF9uYW1lIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJsaWNlbnNlIjogewogICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2RvY3VtZW50X25hbWUiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiBmYWxzZQogICAgICAgICAgICB9LAogICAgICAgICAgICAia2V5d29yZHMiOiB7CiAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkEgbGlzdCBvZiBhZGRpdGlvbmFsIGtleXdvcmRzIHRvIGJlIHVzZWQgdG8gYXNzaXN0IHNlYXJjaGluZyBmb3IgdGhlIGRpc3RyaWJ1dGlvbiBpbiBhIGxhcmdlciBjYXRhbG9nLiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJsaWNlbnNlIjogewogICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIHN0cmluZyBpbmRpY2F0aW5nIHRoZSBsaWNlbnNlIGNvdmVyaW5nIHRoZSBkaXN0cmlidXRpb24uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJjbGFzc2lmaWVycyI6IHsKICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQSBsaXN0IG9mIHN0cmluZ3MsIHdpdGggZWFjaCBnaXZpbmcgYSBzaW5nbGUgY2xhc3NpZmljYXRpb24gdmFsdWUgZm9yIHRoZSBkaXN0cmlidXRpb24uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgInB5dGhvbi5wcm9qZWN0IiA6IHsKICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJNb3JlIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGUgY3JlYXRpb24gYW5kIG1haW50ZW5hbmNlIG9mIHRoZSBkaXN0cmlidXRpb24uIiwKICAgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvcHJvamVjdF9vcl9pbnRlZ3JhdG9yIgogICAgICAgIH0sCiAgICAgICAgInB5dGhvbi5pbnRlZ3JhdG9yIiA6IHsKICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJNb3JlIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGUgZG93bnN0cmVhbSByZWRpc3RyaWJ1dG9yIG9mIHRoZSBkaXN0cmlidXRpb24uIiwKICAgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvcHJvamVjdF9vcl9pbnRlZ3JhdG9yIgogICAgICAgIH0sCiAgICAgICAgInB5dGhvbi5jb21tYW5kcyIgOiB7CiAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQ29tbWFuZCBsaW5lIGludGVyZmFjZXMgcHJvdmlkZWQgYnkgdGhpcyBkaXN0cmlidXRpb24iLAogICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvY29tbWFuZHMiCiAgICAgICAgfSwKICAgICAgICAicHl0aG9uLmV4cG9ydHMiIDogewogICAgICAgICAgImRlc2NyaXB0aW9uIjogIk90aGVyIGV4cG9ydGVkIGludGVyZmFjZXMgcHJvdmlkZWQgYnkgdGhpcyBkaXN0cmlidXRpb24iLAogICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvZXhwb3J0cyIKICAgICAgICB9CiAgICAgIH0sCiAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IGZhbHNlCiAgICB9LAogICAgImNvbW1hbmRzIjogewogICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAid3JhcF9jb25zb2xlIjogewogICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvY29tbWFuZF9tYXAiCiAgICAgICAgfSwKICAgICAgICAid3JhcF9ndWkiOiB7CiAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9jb21tYW5kX21hcCIKICAgICAgICB9LAogICAgICAgICJwcmVidWlsdCI6IHsKICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9yZWxhdGl2ZV9wYXRoIgogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogZmFsc2UKICAgIH0sCiAgICAiZXhwb3J0cyI6IHsKICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgInBhdHRlcm5Qcm9wZXJ0aWVzIjogewogICAgICAgICJeW0EtWmEtel1bMC05QS1aYS16X10qKFsuXVswLTlBLVphLXpfXSopKiQiOiB7CiAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgInBhdHRlcm5Qcm9wZXJ0aWVzIjogewogICAgICAgICAgICAiLiI6IHsKICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvZXhwb3J0X3NwZWNpZmllciIKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IGZhbHNlCiAgICAgICAgfQogICAgICB9LAogICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiBmYWxzZQogICAgfSwKICAgICJjb21tYW5kX21hcCI6IHsKICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgInBhdHRlcm5Qcm9wZXJ0aWVzIjogewogICAgICAgICJeWzAtOUEtWmEtel0oWzAtOUEtWmEtel8uLV0qWzAtOUEtWmEtel0pPyQiOiB7CiAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9leHBvcnRfc3BlY2lmaWVyIgogICAgICAgIH0KICAgICAgfSwKICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogZmFsc2UKICAgIH0sCiAgICAicHJvamVjdF9vcl9pbnRlZ3JhdG9yIiA6IHsKICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgInByb3BlcnRpZXMiIDogewogICAgICAgICJjb250YWN0cyI6IHsKICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIGxpc3Qgb2YgY29udHJpYnV0b3IgZW50cmllcyBnaXZpbmcgdGhlIHJlY29tbWVuZGVkIGNvbnRhY3QgcG9pbnRzIGZvciBnZXR0aW5nIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHByb2plY3QuIiwKICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9jb250YWN0IgogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgImNvbnRyaWJ1dG9ycyI6IHsKICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIGxpc3Qgb2YgY29udHJpYnV0b3IgZW50cmllcyBmb3Igb3RoZXIgY29udHJpYnV0b3JzIG5vdCBhbHJlYWR5IGxpc3RlZCBhcyBjdXJyZW50IHByb2plY3QgcG9pbnRzIG9mIGNvbnRhY3QuIiwKICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9jb250YWN0IgogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgInByb2plY3RfdXJscyI6IHsKICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIG1hcHBpbmcgb2YgYXJiaXRyYXJ5IHRleHQgbGFiZWxzIHRvIGFkZGl0aW9uYWwgVVJMcyByZWxldmFudCB0byB0aGUgcHJvamVjdC4iLAogICAgICAgICAgInR5cGUiOiAib2JqZWN0IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJkaXN0cmlidXRpb25fbmFtZSI6IHsKICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgInBhdHRlcm4iOiAiXlswLTlBLVphLXpdKFswLTlBLVphLXpfLi1dKlswLTlBLVphLXpdKT8kIgogICAgfSwKICAgICJyZXF1aXJlbWVudCI6IHsKICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgfSwKICAgICJwcm92aWRlc19kZWNsYXJhdGlvbiI6IHsKICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgfSwKICAgICJlbnZpcm9ubWVudF9tYXJrZXIiOiB7CiAgICAgICJ0eXBlIjogInN0cmluZyIKICAgIH0sCiAgICAiZG9jdW1lbnRfbmFtZSI6IHsKICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgfSwKICAgICJleHRyYV9uYW1lIiA6IHsKICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgInBhdHRlcm4iOiAiXlswLTlBLVphLXpdKFswLTlBLVphLXpfLi1dKlswLTlBLVphLXpdKT8kIgogICAgfSwKICAgICJyZWxhdGl2ZV9wYXRoIiA6IHsKICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgfSwKICAgICJleHBvcnRfc3BlY2lmaWVyIjogewogICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAicGF0dGVybiI6ICJeKFtBLVphLXpfXVtBLVphLXpfMC05XSooWy5dW0EtWmEtel9dW0EtWmEtel8wLTldKikqKSg6W0EtWmEtel9dW0EtWmEtel8wLTldKihbLl1bQS1aYS16X11bQS1aYS16XzAtOV0qKSopPyhcXFtbMC05QS1aYS16XShbMC05QS1aYS16Xy4tXSpbMC05QS1aYS16XSk/XFxdKT8kIgogICAgfSwKICAgICJxdWFsaWZpZWRfbmFtZSIgOiB7CiAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICJwYXR0ZXJuIjogIl5bQS1aYS16X11bQS1aYS16XzAtOV0qKFsuXVtBLVphLXpfXVtBLVphLXpfMC05XSopKiQiCiAgICB9LAogICAgInByZWZpeGVkX25hbWUiIDogewogICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAicGF0dGVybiI6ICJeW0EtWmEtel9dW0EtWmEtel8wLTldKihbLl1bQS1aYS16XzAtOV0qKSokIgogICAgfQogIH0KfQpQSwMEFAAAAAAAAAAhAAAAAAAAAAAAAAAAAEQAAABwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC9zaW1wbGUuZGlzdC9fX2luaXRfXy5weVBLAwQUAAAAAAAAACEA000Eo38BAAB/AQAAQQAAAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L3NpbXBsZS5kaXN0L3NldHVwLnB5ZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBzZXR1cAoKdHJ5OgogICAgdW5pY29kZQogICAgZGVmIHU4KHMpOgogICAgICAgIHJldHVybiBzLmRlY29kZSgndW5pY29kZS1lc2NhcGUnKS5lbmNvZGUoJ3V0Zi04JykKZXhjZXB0IE5hbWVFcnJvcjoKICAgIGRlZiB1OChzKToKICAgICAgICByZXR1cm4gcy5lbmNvZGUoJ3V0Zi04JykKCnNldHVwKG5hbWU9J3NpbXBsZS5kaXN0JywKICAgICAgdmVyc2lvbj0nMC4xJywKICAgICAgZGVzY3JpcHRpb249dTgoJ0EgdGVzdGluZyBkaXN0cmlidXRpb24gXE57U05PV01BTn0nKSwKICAgICAgcGFja2FnZXM9WydzaW1wbGVkaXN0J10sCiAgICAgIGV4dHJhc19yZXF1aXJlPXsndm90aW5nJzogWydiZWFnbGV2b3RlJ119LAogICAgICApCgpQ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MC5kaXN0LWluZm8vUkVDT1JEUEsFBgAAAAAJAAkAawIAAOkRAAAAAFBLAwQUAAAAAAAAACEAOCvvEW0ZAABtGQAAOgAAAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L3Rlc3RfYmFzaWMucHkiIiIKQmFzaWMgd2hlZWwgdGVzdHMuCiIiIgoKaW1wb3J0IG9zCmltcG9ydCBwa2dfcmVzb3VyY2VzCmltcG9ydCBqc29uCmltcG9ydCBzeXMKCmZyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgcmVzb3VyY2VfZmlsZW5hbWUKCmltcG9ydCB3aGVlbC51dGlsCmltcG9ydCB3aGVlbC50b29sCgpmcm9tIHdoZWVsIGltcG9ydCBlZ2cyd2hlZWwKZnJvbSB3aGVlbC5pbnN0YWxsIGltcG9ydCBXaGVlbEZpbGUKZnJvbSB6aXBmaWxlIGltcG9ydCBaaXBGaWxlCmZyb20gc2h1dGlsIGltcG9ydCBybXRyZWUKCnRlc3RfZGlzdHJpYnV0aW9ucyA9ICgiY29tcGxleC1kaXN0IiwgInNpbXBsZS5kaXN0IiwgImhlYWRlcnMuZGlzdCIpCgpkZWYgdGVhcmRvd25fbW9kdWxlKCk6CiAgICAiIiJEZWxldGUgZWdncy93aGVlbHMgY3JlYXRlZCBieSB0ZXN0cy4iIiIKICAgIGJhc2UgPSBwa2dfcmVzb3VyY2VzLnJlc291cmNlX2ZpbGVuYW1lKCd3aGVlbC50ZXN0JywgJycpCiAgICBmb3IgZGlzdCBpbiB0ZXN0X2Rpc3RyaWJ1dGlvbnM6CiAgICAgICAgZm9yIHN1YmRpciBpbiAoJ2J1aWxkJywgJ2Rpc3QnKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcm10cmVlKG9zLnBhdGguam9pbihiYXNlLCBkaXN0LCBzdWJkaXIpKQogICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKICAgICAgICAgICAgICAgIHBhc3MKCmRlZiBzZXR1cF9tb2R1bGUoKToKICAgIGJ1aWxkX3doZWVsKCkKICAgIGJ1aWxkX2VnZygpCgpkZWYgYnVpbGRfd2hlZWwoKToKICAgICIiIkJ1aWxkIHdoZWVscyBmcm9tIHRlc3QgZGlzdHJpYnV0aW9ucy4iIiIKICAgIGZvciBkaXN0IGluIHRlc3RfZGlzdHJpYnV0aW9uczoKICAgICAgICBwd2QgPSBvcy5wYXRoLmFic3BhdGgob3MuY3VyZGlyKQogICAgICAgIGRpc3RkaXIgPSBwa2dfcmVzb3VyY2VzLnJlc291cmNlX2ZpbGVuYW1lKCd3aGVlbC50ZXN0JywgZGlzdCkKICAgICAgICBvcy5jaGRpcihkaXN0ZGlyKQogICAgICAgIHRyeToKICAgICAgICAgICAgc3lzLmFyZ3YgPSBbJycsICdiZGlzdF93aGVlbCddCiAgICAgICAgICAgIGV4ZWMoY29tcGlsZShvcGVuKCdzZXR1cC5weScpLnJlYWQoKSwgJ3NldHVwLnB5JywgJ2V4ZWMnKSkKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBvcy5jaGRpcihwd2QpCgpkZWYgYnVpbGRfZWdnKCk6CiAgICAiIiJCdWlsZCBlZ2dzIGZyb20gdGVzdCBkaXN0cmlidXRpb25zLiIiIgogICAgZm9yIGRpc3QgaW4gdGVzdF9kaXN0cmlidXRpb25zOgogICAgICAgIHB3ZCA9IG9zLnBhdGguYWJzcGF0aChvcy5jdXJkaXIpCiAgICAgICAgZGlzdGRpciA9IHBrZ19yZXNvdXJjZXMucmVzb3VyY2VfZmlsZW5hbWUoJ3doZWVsLnRlc3QnLCBkaXN0KQogICAgICAgIG9zLmNoZGlyKGRpc3RkaXIpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzeXMuYXJndiA9IFsnJywgJ2JkaXN0X2VnZyddCiAgICAgICAgICAgIGV4ZWMoY29tcGlsZShvcGVuKCdzZXR1cC5weScpLnJlYWQoKSwgJ3NldHVwLnB5JywgJ2V4ZWMnKSkKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBvcy5jaGRpcihwd2QpCgpkZWYgdGVzdF9maW5kYWJsZSgpOgogICAgIiIiTWFrZSBzdXJlIHBrZ19yZXNvdXJjZXMgY2FuIGZpbmQgdXMuIiIiCiAgICBhc3NlcnQgcGtnX3Jlc291cmNlcy53b3JraW5nX3NldC5ieV9rZXlbJ3doZWVsJ10udmVyc2lvbgoKZGVmIHRlc3RfZWdnX3JlKCk6CiAgICAiIiJNYWtlIHN1cmUgZWdnX2luZm9fcmUgbWF0Y2hlcy4iIiIKICAgIGVnZ19uYW1lc19wYXRoID0gcGtnX3Jlc291cmNlcy5yZXNvdXJjZV9maWxlbmFtZSgnd2hlZWwnLCAnZWdnbmFtZXMudHh0JykKICAgIHdpdGggb3BlbihlZ2dfbmFtZXNfcGF0aCkgYXMgZWdnX25hbWVzOgogICAgICAgIGZvciBsaW5lIGluIGVnZ19uYW1lczoKICAgICAgICAgICAgbGluZSA9IGxpbmUuc3RyaXAoKQogICAgICAgICAgICBpZiBub3QgbGluZToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGFzc2VydCBlZ2cyd2hlZWwuZWdnX2luZm9fcmUubWF0Y2gobGluZSksIGxpbmUKCmRlZiB0ZXN0X2NvbXBhdGliaWxpdHlfdGFncygpOgogICAgIiIiVGVzdCBjb21wYXRpYmlsdHkgdGFncyBhcmUgd29ya2luZy4iIiIKICAgIHdmID0gV2hlZWxGaWxlKCJwYWNrYWdlLTEuMC4wLWNwMzIuY3AzMy1ub2FiaS1ub2FyY2gud2hsIikKICAgIGFzc2VydCAobGlzdCh3Zi5jb21wYXRpYmlsaXR5X3RhZ3MpID09CiAgICAgICAgICAgICAgICAgWygnY3AzMicsICdub2FiaScsICdub2FyY2gnKSwgKCdjcDMzJywgJ25vYWJpJywgJ25vYXJjaCcpXSkKICAgIGFzc2VydCAod2YuYXJpdHkgPT0gMikKCiAgICB3ZjIgPSBXaGVlbEZpbGUoInBhY2thZ2UtMS4wLjAtMXN0LWNwMzMtbm9hYmktbm9hcmNoLndobCIpCiAgICB3ZjJfaW5mbyA9IHdmMi5wYXJzZWRfZmlsZW5hbWUuZ3JvdXBkaWN0KCkKICAgIGFzc2VydCB3ZjJfaW5mb1snYnVpbGQnXSA9PSAnMXN0Jywgd2YyX2luZm8KCmRlZiB0ZXN0X2NvbnZlcnRfZWdnKCk6CiAgICBiYXNlID0gcGtnX3Jlc291cmNlcy5yZXNvdXJjZV9maWxlbmFtZSgnd2hlZWwudGVzdCcsICcnKQogICAgZm9yIGRpc3QgaW4gdGVzdF9kaXN0cmlidXRpb25zOgogICAgICAgIGRpc3RkaXIgPSBvcy5wYXRoLmpvaW4oYmFzZSwgZGlzdCwgJ2Rpc3QnKQogICAgICAgIGVnZ3MgPSBbZSBmb3IgZSBpbiBvcy5saXN0ZGlyKGRpc3RkaXIpIGlmIGUuZW5kc3dpdGgoJy5lZ2cnKV0KICAgICAgICB3aGVlbC50b29sLmNvbnZlcnQoZWdncywgZGlzdGRpciwgdmVyYm9zZT1GYWxzZSkKCmRlZiB0ZXN0X3VucGFjaygpOgogICAgIiIiCiAgICBNYWtlIHN1cmUgJ3doZWVsIHVucGFjaycgd29ya3MuCiAgICBUaGlzIGFsc28gdmVyaWZpZXMgdGhlIGludGVncml0eSBvZiBvdXIgdGVzdGluZyB3aGVlbCBmaWxlcy4KICAgICIiIgogICAgZm9yIGRpc3QgaW4gdGVzdF9kaXN0cmlidXRpb25zOgogICAgICAgIGRpc3RkaXIgPSBwa2dfcmVzb3VyY2VzLnJlc291cmNlX2ZpbGVuYW1lKCd3aGVlbC50ZXN0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oZGlzdCwgJ2Rpc3QnKSkKICAgICAgICBmb3Igd2hlZWxmaWxlIGluICh3IGZvciB3IGluIG9zLmxpc3RkaXIoZGlzdGRpcikgaWYgdy5lbmRzd2l0aCgnLndobCcpKToKICAgICAgICAgICAgd2hlZWwudG9vbC51bnBhY2sob3MucGF0aC5qb2luKGRpc3RkaXIsIHdoZWVsZmlsZSksIGRpc3RkaXIpCgpkZWYgdGVzdF9ub19zY3JpcHRzKCk6CiAgICAiIiJNYWtlIHN1cmUgZW50cnkgcG9pbnQgc2NyaXB0cyBhcmUgbm90IGdlbmVyYXRlZC4iIiIKICAgIGRpc3QgPSAiY29tcGxleC1kaXN0IgogICAgYmFzZWRpciA9IHBrZ19yZXNvdXJjZXMucmVzb3VyY2VfZmlsZW5hbWUoJ3doZWVsLnRlc3QnLCBkaXN0KQogICAgZm9yIChkaXJuYW1lLCBzdWJkaXJzLCBmaWxlbmFtZXMpIGluIG9zLndhbGsoYmFzZWRpcik6CiAgICAgICAgZm9yIGZpbGVuYW1lIGluIGZpbGVuYW1lczoKICAgICAgICAgICAgaWYgZmlsZW5hbWUuZW5kc3dpdGgoJy53aGwnKToKICAgICAgICAgICAgICAgIHdobCA9IFppcEZpbGUob3MucGF0aC5qb2luKGRpcm5hbWUsIGZpbGVuYW1lKSkKICAgICAgICAgICAgICAgIGZvciBlbnRyeSBpbiB3aGwuaW5mb2xpc3QoKToKICAgICAgICAgICAgICAgICAgICBhc3NlcnQgbm90ICcuZGF0YS9zY3JpcHRzLycgaW4gZW50cnkuZmlsZW5hbWUKCmRlZiB0ZXN0X3B5ZGlzdCgpOgogICAgIiIiTWFrZSBzdXJlIHB5ZGlzdC5qc29uIGV4aXN0cyBhbmQgdmFsaWRhdGVzIGFnYWluc3Qgb3VyIHNjaGVtYS4iIiIKICAgICMgWFhYIHRoaXMgdGVzdCBtYXkgbmVlZCBtYW51YWwgY2xlYW51cCBvZiBvbGRlciB3aGVlbHMKCiAgICBpbXBvcnQganNvbnNjaGVtYQoKICAgIGRlZiBvcGVuX2pzb24oZmlsZW5hbWUpOgogICAgICAgIHdpdGggb3BlbihmaWxlbmFtZSwgJ3JiJykgYXMganNvbl9maWxlOgogICAgICAgICAgICByZXR1cm4ganNvbi5sb2Fkcyhqc29uX2ZpbGUucmVhZCgpLmRlY29kZSgndXRmLTgnKSkKCiAgICBweW1ldGFfc2NoZW1hID0gb3Blbl9qc29uKHJlc291cmNlX2ZpbGVuYW1lKCd3aGVlbC50ZXN0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3B5ZGlzdC1zY2hlbWEuanNvbicpKQogICAgdmFsaWQgPSAwCiAgICBmb3IgZGlzdCBpbiAoInNpbXBsZS5kaXN0IiwgImNvbXBsZXgtZGlzdCIpOgogICAgICAgIGJhc2VkaXIgPSBwa2dfcmVzb3VyY2VzLnJlc291cmNlX2ZpbGVuYW1lKCd3aGVlbC50ZXN0JywgZGlzdCkKICAgICAgICBmb3IgKGRpcm5hbWUsIHN1YmRpcnMsIGZpbGVuYW1lcykgaW4gb3Mud2FsayhiYXNlZGlyKToKICAgICAgICAgICAgZm9yIGZpbGVuYW1lIGluIGZpbGVuYW1lczoKICAgICAgICAgICAgICAgIGlmIGZpbGVuYW1lLmVuZHN3aXRoKCcud2hsJyk6CiAgICAgICAgICAgICAgICAgICAgd2hsID0gWmlwRmlsZShvcy5wYXRoLmpvaW4oZGlybmFtZSwgZmlsZW5hbWUpKQogICAgICAgICAgICAgICAgICAgIGZvciBlbnRyeSBpbiB3aGwuaW5mb2xpc3QoKToKICAgICAgICAgICAgICAgICAgICAgICAgaWYgZW50cnkuZmlsZW5hbWUuZW5kc3dpdGgoJy9tZXRhZGF0YS5qc29uJyk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBweW1ldGEgPSBqc29uLmxvYWRzKHdobC5yZWFkKGVudHJ5KS5kZWNvZGUoJ3V0Zi04JykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc29uc2NoZW1hLnZhbGlkYXRlKHB5bWV0YSwgcHltZXRhX3NjaGVtYSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkICs9IDEKICAgIGFzc2VydCB2YWxpZCA+IDAsICJObyBtZXRhZGF0YS5qc29uIGZvdW5kIgoKZGVmIHRlc3RfdXRpbCgpOgogICAgIiIiVGVzdCBmdW5jdGlvbnMgaW4gdXRpbC5weS4iIiIKICAgIGZvciBpIGluIHJhbmdlKDEwKToKICAgICAgICBiZWZvcmUgPSBiJyonICogaQogICAgICAgIGVuY29kZWQgPSB3aGVlbC51dGlsLnVybHNhZmVfYjY0ZW5jb2RlKGJlZm9yZSkKICAgICAgICBhc3NlcnQgbm90IGVuY29kZWQuZW5kc3dpdGgoYic9JykKICAgICAgICBhZnRlciA9IHdoZWVsLnV0aWwudXJsc2FmZV9iNjRkZWNvZGUoZW5jb2RlZCkKICAgICAgICBhc3NlcnQgYmVmb3JlID09IGFmdGVyCgoKZGVmIHRlc3RfcGlja19iZXN0KCk6CiAgICAiIiJUZXN0IHRoZSB3aGVlbCByYW5raW5nIGFsZ29yaXRobS4iIiIKICAgIGRlZiBnZXRfdGFncyhyZXMpOgogICAgICAgIGluZm8gPSByZXNbLTFdLnBhcnNlZF9maWxlbmFtZS5ncm91cGRpY3QoKQogICAgICAgIHJldHVybiBpbmZvWydweXZlciddLCBpbmZvWydhYmknXSwgaW5mb1sncGxhdCddCgogICAgY2FuZF90YWdzID0gWygncHkyNycsICdub2FiaScsICdub2FyY2gnKSwgKCdweTI2JywgJ25vYWJpJywgJ25vYXJjaCcpLAogICAgICAgICAgICAgICAgICgnY3AyNycsICdub2FiaScsICdsaW51eF9pNjg2JyksCiAgICAgICAgICAgICAgICAgKCdjcDI2JywgJ25vYWJpJywgJ2xpbnV4X2k2ODYnKSwKICAgICAgICAgICAgICAgICAoJ2NwMjcnLCAnbm9hYmknLCAnbGludXhfeDg2XzY0JyksCiAgICAgICAgICAgICAgICAgKCdjcDI2JywgJ25vYWJpJywgJ2xpbnV4X3g4Nl82NCcpXQogICAgY2FuZF93aGVlbHMgPSBbV2hlZWxGaWxlKCd0ZXN0cGtnLTEuMC0lcy0lcy0lcy53aGwnICUgdCkKICAgICAgICAgICAgICAgICAgIGZvciB0IGluIGNhbmRfdGFnc10KCiAgICBzdXBwb3J0ZWQgPSBbKCdjcDI3JywgJ25vYWJpJywgJ2xpbnV4X2k2ODYnKSwgKCdweTI3JywgJ25vYWJpJywgJ25vYXJjaCcpXQogICAgc3VwcG9ydGVkMiA9IFsoJ2NwMjcnLCAnbm9hYmknLCAnbGludXhfaTY4NicpLCAoJ3B5MjcnLCAnbm9hYmknLCAnbm9hcmNoJyksCiAgICAgICAgICAgICAgICAgICgnY3AyNicsICdub2FiaScsICdsaW51eF9pNjg2JyksICgncHkyNicsICdub2FiaScsICdub2FyY2gnKV0KICAgIHN1cHBvcnRlZDMgPSBbKCdjcDI2JywgJ25vYWJpJywgJ2xpbnV4X2k2ODYnKSwgKCdweTI2JywgJ25vYWJpJywgJ25vYXJjaCcpLAogICAgICAgICAgICAgICAgICAoJ2NwMjcnLCAnbm9hYmknLCAnbGludXhfaTY4NicpLCAoJ3B5MjcnLCAnbm9hYmknLCAnbm9hcmNoJyldCgogICAgZm9yIHN1cHAgaW4gKHN1cHBvcnRlZCwgc3VwcG9ydGVkMiwgc3VwcG9ydGVkMyk6CiAgICAgICAgY29udGV4dCA9IGxhbWJkYTogbGlzdChzdXBwKQogICAgICAgIGZvciB3aGVlbCBpbiBjYW5kX3doZWVsczoKICAgICAgICAgICAgd2hlZWwuY29udGV4dCA9IGNvbnRleHQKICAgICAgICBiZXN0ID0gbWF4KGNhbmRfd2hlZWxzKQogICAgICAgIGFzc2VydCBsaXN0KGJlc3QudGFncylbMF0gPT0gc3VwcFswXQoKICAgICAgICAjIGFzc2VydF9lcXVhbCgKICAgICAgICAjICAgICBsaXN0KG1hcChnZXRfdGFncywgcGlja19iZXN0KGNhbmRfd2hlZWxzLCBzdXBwLCB0b3A9RmFsc2UpKSksIHN1cHApClBLAwQUAAAAAAAAACEAbQSyvkoHAABKBwAAPAAAAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L3Rlc3RfaW5zdGFsbC5weSMgVGVzdCB3aGVlbC4NCiMgVGhlIGZpbGUgaGFzIHRoZSBmb2xsb3dpbmcgY29udGVudHM6DQojICAgaGVsbG8ucHlkDQojICAgaGVsbG8vaGVsbG8ucHkNCiMgICBoZWxsby9fX2luaXRfXy5weQ0KIyAgIHRlc3QtMS4wLmRhdGEvZGF0YS9oZWxsby5kYXQNCiMgICB0ZXN0LTEuMC5kYXRhL2hlYWRlcnMvaGVsbG8uZGF0DQojICAgdGVzdC0xLjAuZGF0YS9zY3JpcHRzL2hlbGxvLnNoDQojICAgdGVzdC0xLjAuZGlzdC1pbmZvL1dIRUVMDQojICAgdGVzdC0xLjAuZGlzdC1pbmZvL01FVEFEQVRBDQojICAgdGVzdC0xLjAuZGlzdC1pbmZvL1JFQ09SRA0KIyBUaGUgcm9vdCBpcyBQTEFUTElCDQojIFNvLCBzb21lIGluIFBMQVRMSUIsIGFuZCBvbmUgaW4gZWFjaCBvZiBEQVRBLCBIRUFERVJTIGFuZCBTQ1JJUFRTLg0KDQppbXBvcnQgd2hlZWwudG9vbA0KaW1wb3J0IHdoZWVsLnBlcDQyNXRhZ3MNCmZyb20gd2hlZWwuaW5zdGFsbCBpbXBvcnQgV2hlZWxGaWxlDQpmcm9tIHRlbXBmaWxlIGltcG9ydCBta2R0ZW1wDQppbXBvcnQgc2h1dGlsDQppbXBvcnQgb3MNCg0KVEhJU0RJUiA9IG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykNClRFU1RXSEVFTCA9IG9zLnBhdGguam9pbihUSElTRElSLCAndGVzdC0xLjAtcHkyLnB5My1ub25lLXdpbjMyLndobCcpDQoNCmRlZiBjaGVjaygqcGF0aCk6DQogICAgcmV0dXJuIG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbigqcGF0aCkpDQoNCmRlZiB0ZXN0X2luc3RhbGwoKToNCiAgICB0ZW1wZGlyID0gbWtkdGVtcCgpDQogICAgZGVmIGdldF9zdXBwb3J0ZWQoKToNCiAgICAgICAgcmV0dXJuIGxpc3Qod2hlZWwucGVwNDI1dGFncy5nZXRfc3VwcG9ydGVkKCkpICsgWygncHkzJywgJ25vbmUnLCAnd2luMzInKV0NCiAgICB3aGwgPSBXaGVlbEZpbGUoVEVTVFdIRUVMLCBjb250ZXh0PWdldF9zdXBwb3J0ZWQpDQogICAgYXNzZXJ0IHdobC5zdXBwb3J0c19jdXJyZW50X3B5dGhvbihnZXRfc3VwcG9ydGVkKQ0KICAgIHRyeToNCiAgICAgICAgbG9jcyA9IHt9DQogICAgICAgIGZvciBrZXkgaW4gKCdwdXJlbGliJywgJ3BsYXRsaWInLCAnc2NyaXB0cycsICdoZWFkZXJzJywgJ2RhdGEnKToNCiAgICAgICAgICAgIGxvY3Nba2V5XSA9IG9zLnBhdGguam9pbih0ZW1wZGlyLCBrZXkpDQogICAgICAgICAgICBvcy5ta2Rpcihsb2NzW2tleV0pDQogICAgICAgIHdobC5pbnN0YWxsKG92ZXJyaWRlcz1sb2NzKQ0KICAgICAgICBhc3NlcnQgbGVuKG9zLmxpc3RkaXIobG9jc1sncHVyZWxpYiddKSkgPT0gMA0KICAgICAgICBhc3NlcnQgY2hlY2sobG9jc1sncGxhdGxpYiddLCAnaGVsbG8ucHlkJykNCiAgICAgICAgYXNzZXJ0IGNoZWNrKGxvY3NbJ3BsYXRsaWInXSwgJ2hlbGxvJywgJ2hlbGxvLnB5JykNCiAgICAgICAgYXNzZXJ0IGNoZWNrKGxvY3NbJ3BsYXRsaWInXSwgJ2hlbGxvJywgJ19faW5pdF9fLnB5JykNCiAgICAgICAgYXNzZXJ0IGNoZWNrKGxvY3NbJ2RhdGEnXSwgJ2hlbGxvLmRhdCcpDQogICAgICAgIGFzc2VydCBjaGVjayhsb2NzWydoZWFkZXJzJ10sICdoZWxsby5kYXQnKQ0KICAgICAgICBhc3NlcnQgY2hlY2sobG9jc1snc2NyaXB0cyddLCAnaGVsbG8uc2gnKQ0KICAgICAgICBhc3NlcnQgY2hlY2sobG9jc1sncGxhdGxpYiddLCAndGVzdC0xLjAuZGlzdC1pbmZvJywgJ1JFQ09SRCcpDQogICAgZmluYWxseToNCiAgICAgICAgc2h1dGlsLnJtdHJlZSh0ZW1wZGlyKQ0KDQpkZWYgdGVzdF9pbnN0YWxsX3Rvb2woKToNCiAgICAiIiJTbGlnaHRseSBpbXByb3ZlIGNvdmVyYWdlIG9mIHdoZWVsLmluc3RhbGwiIiINCiAgICB3aGVlbC50b29sLmluc3RhbGwoW1RFU1RXSEVFTF0sIGZvcmNlPVRydWUsIGRyeV9ydW49VHJ1ZSkNCg0KICAgIFBLAwQUAAAAAAAAACEA92Efkw8KAAAPCgAAOQAAAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L3Rlc3Rfa2V5cy5weWltcG9ydCB0ZW1wZmlsZQppbXBvcnQgb3MucGF0aAppbXBvcnQgdW5pdHRlc3QKaW1wb3J0IGpzb24KCmZyb20gd2hlZWwuc2lnbmF0dXJlcyBpbXBvcnQga2V5cwoKd2hlZWxfanNvbiA9ICIiIgp7CiAgInZlcmlmaWVycyI6IFsKICAgIHsKICAgICAgInNjb3BlIjogIisiLCAKICAgICAgInZrIjogImJwLWJqSzJmRmd0QS04RGhLS0FBUG05LWVBWmNYX3UwM29CdjJSbEtPQmMiCiAgICB9LCAKICAgIHsKICAgICAgInNjb3BlIjogIisiLCAKICAgICAgInZrIjogIktBSFpCZnlxRlczT2NGRGJMU0c0blBDalh4VVB5NzJwaFA5STRSbjlNQW8iCiAgICB9LAogICAgewogICAgICAic2NvcGUiOiAiKyIsIAogICAgICAidmsiOiAidG1BWUNyU2ZqOGd0SjEwdjNWa3ZXN2pPbmRLbVFJWUUxMmhnbkZ1M2N2ayIKICAgIH0gCiAgXSwgCiAgInNpZ25lcnMiOiBbCiAgICB7CiAgICAgICJzY29wZSI6ICIrIiwgCiAgICAgICJ2ayI6ICJ0bUFZQ3JTZmo4Z3RKMTB2M1Zrdlc3ak9uZEttUUlZRTEyaGduRnUzY3ZrIgogICAgfSwgCiAgICB7CiAgICAgICJzY29wZSI6ICIrIiwgCiAgICAgICJ2ayI6ICJLQUhaQmZ5cUZXM09jRkRiTFNHNG5QQ2pYeFVQeTcycGhQOUk0Um45TUFvIgogICAgfQogIF0sIAogICJzY2hlbWEiOiAxCn0KIiIiCgpjbGFzcyBUZXN0V2hlZWxLZXlzKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICBzZWxmLmNvbmZpZyA9IHRlbXBmaWxlLk5hbWVkVGVtcG9yYXJ5RmlsZShzdWZmaXg9Jy5qc29uJykKICAgICAgICBzZWxmLmNvbmZpZy5jbG9zZSgpCiAgICAgICAgCiAgICAgICAgc2VsZi5jb25maWdfcGF0aCwgc2VsZi5jb25maWdfZmlsZW5hbWUgPSBvcy5wYXRoLnNwbGl0KHNlbGYuY29uZmlnLm5hbWUpIAogICAgICAgIGRlZiBsb2FkKCphcmdzKToKICAgICAgICAgICAgcmV0dXJuIFtzZWxmLmNvbmZpZ19wYXRoXQogICAgICAgIGRlZiBzYXZlKCphcmdzKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuY29uZmlnX3BhdGgKICAgICAgICBrZXlzLmxvYWRfY29uZmlnX3BhdGhzID0gbG9hZAogICAgICAgIGtleXMuc2F2ZV9jb25maWdfcGF0aCA9IHNhdmUKICAgICAgICBzZWxmLndrID0ga2V5cy5XaGVlbEtleXMoKQogICAgICAgIHNlbGYud2suQ09ORklHX05BTUUgPSBzZWxmLmNvbmZpZ19maWxlbmFtZQogICAgICAgIAogICAgZGVmIHRlYXJEb3duKHNlbGYpOgogICAgICAgIG9zLnVubGluayhzZWxmLmNvbmZpZy5uYW1lKQogICAgICAgIAogICAgZGVmIHRlc3RfbG9hZF9zYXZlKHNlbGYpOgogICAgICAgIHNlbGYud2suZGF0YSA9IGpzb24ubG9hZHMod2hlZWxfanNvbikKICAgICAgICAKICAgICAgICBzZWxmLndrLmFkZF9zaWduZXIoJysnLCAnNjc4OTAnKQogICAgICAgIHNlbGYud2suYWRkX3NpZ25lcignc2NvcGUnLCAnYWJjZGVmZycpCiAgICAgICAgCiAgICAgICAgc2VsZi53ay50cnVzdCgnZXBvY3MnLCAnZ2ZlZGNiYScpCiAgICAgICAgc2VsZi53ay50cnVzdCgnKycsICcxMjM0NScpCiAgICAgICAgCiAgICAgICAgc2VsZi53ay5zYXZlKCkKICAgICAgICAKICAgICAgICBkZWwgc2VsZi53ay5kYXRhCiAgICAgICAgc2VsZi53ay5sb2FkKCkKICAgICAgICAKICAgICAgICBzaWduZXJzID0gc2VsZi53ay5zaWduZXJzKCdzY29wZScpCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNpZ25lcnNbMF0gPT0gKCdzY29wZScsICdhYmNkZWZnJyksIHNlbGYud2suZGF0YVsnc2lnbmVycyddKQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzaWduZXJzWzFdWzBdID09ICcrJywgc2VsZi53ay5kYXRhWydzaWduZXJzJ10pCiAgICAgICAgCiAgICAgICAgdHJ1c3RlZCA9IHNlbGYud2sudHJ1c3RlZCgnZXBvY3MnKQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0cnVzdGVkWzBdID09ICgnZXBvY3MnLCAnZ2ZlZGNiYScpKQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0cnVzdGVkWzFdWzBdID09ICcrJykKICAgICAgICAKICAgICAgICBzZWxmLndrLnVudHJ1c3QoJ2Vwb2NzJywgJ2dmZWRjYmEnKQogICAgICAgIHRydXN0ZWQgPSBzZWxmLndrLnRydXN0ZWQoJ2Vwb2NzJykKICAgICAgICBzZWxmLmFzc2VydFRydWUoKCdlcG9jcycsICdnZmVkY2JhJykgbm90IGluIHRydXN0ZWQpCiAgICAgICAgCiAgICBkZWYgdGVzdF9sb2FkX3NhdmVfaW5jb21wbGV0ZShzZWxmKToKICAgICAgICBzZWxmLndrLmRhdGEgPSBqc29uLmxvYWRzKHdoZWVsX2pzb24pCiAgICAgICAgZGVsIHNlbGYud2suZGF0YVsnc2lnbmVycyddCiAgICAgICAgc2VsZi53ay5kYXRhWydzY2hlbWEnXSA9IHNlbGYud2suU0NIRU1BKzEKICAgICAgICBzZWxmLndrLnNhdmUoKQogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi53ay5sb2FkKCkKICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgcGFzcwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiRXhwZWN0ZWQgVmFsdWVFcnJvciIpCiAgICAgICAgCiAgICAgICAgZGVsIHNlbGYud2suZGF0YVsnc2NoZW1hJ10KICAgICAgICBzZWxmLndrLnNhdmUoKQogICAgICAgIHNlbGYud2subG9hZCgpCiAgICAKICAgIApQSwMEFAAAAAAAAAAhAGJYdGOsAAAArAAAADoAAABwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC90ZXN0X3BhdGhzLnB5aW1wb3J0IHdoZWVsLnBhdGhzCmZyb20gZGlzdHV0aWxzLmNvbW1hbmQuaW5zdGFsbCBpbXBvcnQgU0NIRU1FX0tFWVMKCmRlZiB0ZXN0X3BhdGgoKToKICAgIGQgPSB3aGVlbC5wYXRocy5nZXRfaW5zdGFsbF9wYXRocygnd2hlZWwnKQogICAgYXNzZXJ0IGxlbihkKSA9PSBsZW4oU0NIRU1FX0tFWVMpClBLAwQUAAAAAAAAACEAbZYx+dgFAADYBQAAPAAAAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L3Rlc3RfcmFua2luZy5weWltcG9ydCB1bml0dGVzdAoKZnJvbSB3aGVlbC5wZXA0MjV0YWdzIGltcG9ydCBnZXRfc3VwcG9ydGVkCmZyb20gd2hlZWwuaW5zdGFsbCBpbXBvcnQgV2hlZWxGaWxlCgpXSEVFTFBBVCA9ICIlKG5hbWUpcy0lKHZlcilzLSUocHl2ZXIpcy0lKGFiaSlzLSUoYXJjaClzLndobCIKZGVmIG1ha2Vfd2hlZWwobmFtZSwgdmVyLCBweXZlciwgYWJpLCBhcmNoKToKICAgIG5hbWUgPSBXSEVFTFBBVCAlIGRpY3QobmFtZT1uYW1lLCB2ZXI9dmVyLCBweXZlcj1weXZlciwgYWJpPWFiaSwKICAgICAgICAgICAgYXJjaD1hcmNoKQogICAgcmV0dXJuIFdoZWVsRmlsZShuYW1lKQoKIyBUaGlzIHJlbGllcyBvbiB0aGUgZmFjdCB0aGF0IGdlbmVyYXRlX3N1cHBvcnRlZCB3aWxsIGFsd2F5cyByZXR1cm4gdGhlCiMgZXhhY3QgcHl2ZXIsIGFiaSwgYW5kIGFyY2hpdGVjdHVyZSBmb3IgaXRzIGZpcnN0IChiZXN0KSBtYXRjaC4Kc3VwID0gZ2V0X3N1cHBvcnRlZCgpCnB5dmVyLCBhYmksIGFyY2ggPSBzdXBbMF0KZ2VudmVyID0gJ3B5JyArIHB5dmVyWzI6XQptYWp2ZXIgPSBnZW52ZXJbOjNdCgpDT01CSU5BVElPTlMgPSAoCiAgICAoJ2JhcicsICcwLjknLCAncHkyLnB5MycsICdub25lJywgJ2FueScpLAogICAgKCdiYXInLCAnMC45JywgbWFqdmVyLCAnbm9uZScsICdhbnknKSwKICAgICgnYmFyJywgJzAuOScsIGdlbnZlciwgJ25vbmUnLCAnYW55JyksCiAgICAoJ2JhcicsICcwLjknLCBweXZlciwgYWJpLCBhcmNoKSwKICAgICgnYmFyJywgJzEuMy4yJywgbWFqdmVyLCAnbm9uZScsICdhbnknKSwKICAgICgnYmFyJywgJzMuMScsIGdlbnZlciwgJ25vbmUnLCAnYW55JyksCiAgICAoJ2JhcicsICczLjEnLCBweXZlciwgYWJpLCBhcmNoKSwKICAgICgnZm9vJywgJzEuMCcsIG1hanZlciwgJ25vbmUnLCAnYW55JyksCiAgICAoJ2ZvbycsICcxLjEnLCBweXZlciwgYWJpLCBhcmNoKSwKICAgICgnZm9vJywgJzIuMScsIG1hanZlciArICcwJywgJ25vbmUnLCAnYW55JyksCiAgICAjIFRoaXMgd2lsbCBub3QgYmUgY29tcGF0aWJsZSBmb3IgUHl0aG9uIHguMC4gQmV3YXJlIHdoZW4gd2UgaGl0IFB5dGhvbgogICAgIyA0LjAsIGFuZCBkb24ndCB0ZXN0IHdpdGggMy4wISEhCiAgICAoJ2ZvbycsICcyLjEnLCBtYWp2ZXIgKyAnMScsICdub25lJywgJ2FueScpLAogICAgKCdmb28nLCAnMi4xJywgcHl2ZXIgLCAnbm9uZScsICdhbnknKSwKICAgICgnZm9vJywgJzIuMScsIHB5dmVyICwgYWJpLCBhcmNoKSwKKQoKV0hFRUxTID0gWyBtYWtlX3doZWVsKCphcmdzKSBmb3IgYXJncyBpbiBDT01CSU5BVElPTlMgXQoKY2xhc3MgVGVzdFJhbmtpbmcodW5pdHRlc3QuVGVzdENhc2UpOgogICAgZGVmIHRlc3RfY29tcGFyaXNvbihzZWxmKToKICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oV0hFRUxTKS0xKToKICAgICAgICAgICAgZm9yIGogaW4gcmFuZ2UoaSk6CiAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoV0hFRUxTW2pdPFdIRUVMU1tpXSkKUEsDBBQAAAAAAAAAIQCkKX8xYAQAAGAEAAA/AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3QvdGVzdF9zaWduYXR1cmVzLnB5ZnJvbSB3aGVlbCBpbXBvcnQgc2lnbmF0dXJlcwpmcm9tIHdoZWVsLnNpZ25hdHVyZXMgaW1wb3J0IGRqYmVjLCBlZDI1NTE5cHkKZnJvbSB3aGVlbC51dGlsIGltcG9ydCBiaW5hcnkKCmRlZiB0ZXN0X2dldGxpYigpOgogICAgc2lnbmF0dXJlcy5nZXRfZWQyNTUxOWxsKCkKCmRlZiB0ZXN0X2RqYmVjKCk6CiAgICBkamJlYy5kc2FfdGVzdCgpICAgIAogICAgZGpiZWMuZGhfdGVzdCgpCiAgICAKZGVmIHRlc3RfZWQyNTUxOXB5KCk6CiAgICBrcDAgPSBlZDI1NTE5cHkuY3J5cHRvX3NpZ25fa2V5cGFpcihiaW5hcnkoJyAnKjMyKSkKICAgIGtwID0gZWQyNTUxOXB5LmNyeXB0b19zaWduX2tleXBhaXIoKQogICAgICAgIAogICAgc2lnbmVkID0gZWQyNTUxOXB5LmNyeXB0b19zaWduKGJpbmFyeSgndGVzdCcpLCBrcC5zaykKICAgIAogICAgZWQyNTUxOXB5LmNyeXB0b19zaWduX29wZW4oc2lnbmVkLCBrcC52aykKICAgIAogICAgdHJ5OgogICAgICAgIGVkMjU1MTlweS5jcnlwdG9fc2lnbl9vcGVuKHNpZ25lZCwga3AwLnZrKQogICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgcGFzcwogICAgZWxzZToKICAgICAgICByYWlzZSBFeGNlcHRpb24oIkV4cGVjdGVkIFZhbHVlRXJyb3IiKQogICAgCiAgICB0cnk6CiAgICAgICAgZWQyNTUxOXB5LmNyeXB0b19zaWduX2tleXBhaXIoYmluYXJ5KCcgJyozMykpCiAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICBwYXNzCiAgICBlbHNlOgogICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiRXhwZWN0ZWQgVmFsdWVFcnJvciIpCiAgICAKICAgIHRyeToKICAgICAgICBlZDI1NTE5cHkuY3J5cHRvX3NpZ24oYmluYXJ5KCcnKSwgYmluYXJ5KCcgJykqMzEpCiAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICBwYXNzCiAgICBlbHNlOgogICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiRXhwZWN0ZWQgVmFsdWVFcnJvciIpCiAgICAKICAgIHRyeToKICAgICAgICBlZDI1NTE5cHkuY3J5cHRvX3NpZ25fb3BlbihiaW5hcnkoJycpLCBiaW5hcnkoJyAnKSozMSkKICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgIHBhc3MKICAgIGVsc2U6CiAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJFeHBlY3RlZCBWYWx1ZUVycm9yIikKICAgIFBLAwQUAAAAAAAAACEAnFdC8CcXAAAnFwAAOwAAAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L3Rlc3RfdGFnb3B0LnB5IiIiClRlc3RzIGZvciB0aGUgYmRpc3Rfd2hlZWwgdGFnIG9wdGlvbnMgKC0tcHl0aG9uLXRhZywgLS11bml2ZXJzYWwsIGFuZAotLXBsYXQtbmFtZSkKIiIiCgppbXBvcnQgc3lzCmltcG9ydCBzaHV0aWwKaW1wb3J0IHB5dGVzdAppbXBvcnQgcHkucGF0aAppbXBvcnQgdGVtcGZpbGUKaW1wb3J0IHN1YnByb2Nlc3MKClNFVFVQX1BZID0gIiIiXApmcm9tIHNldHVwdG9vbHMgaW1wb3J0IHNldHVwLCBFeHRlbnNpb24KCnNldHVwKAogICAgbmFtZT0iVGVzdCIsCiAgICB2ZXJzaW9uPSIxLjAiLAogICAgYXV0aG9yX2VtYWlsPSJhdXRob3JAZXhhbXBsZS5jb20iLAogICAgcHlfbW9kdWxlcz1bInRlc3QiXSwKICAgIHtleHRfbW9kdWxlc30KKQoiIiIKCkVYVF9NT0RVTEVTID0gImV4dF9tb2R1bGVzPVtFeHRlbnNpb24oJ190ZXN0Jywgc291cmNlcz1bJ3Rlc3QuYyddKV0sIgoKQHB5dGVzdC5maXh0dXJlCmRlZiB0ZW1wX3BrZyhyZXF1ZXN0LCBleHQ9RmFsc2UpOgogICAgdGVtcGRpciA9IHRlbXBmaWxlLm1rZHRlbXAoKQogICAgZGVmIGZpbigpOgogICAgICAgIHNodXRpbC5ybXRyZWUodGVtcGRpcikKICAgIHJlcXVlc3QuYWRkZmluYWxpemVyKGZpbikKICAgIHRlbXBwYXRoID0gcHkucGF0aC5sb2NhbCh0ZW1wZGlyKQogICAgdGVtcHBhdGguam9pbigndGVzdC5weScpLndyaXRlKCdwcmludCgiSGVsbG8sIHdvcmxkIiknKQogICAgaWYgZXh0OgogICAgICAgIHRlbXBwYXRoLmpvaW4oJ3Rlc3QuYycpLndyaXRlKCcjaW5jbHVkZSA8c3RkaW8uaD4nKQogICAgICAgIHNldHVwX3B5ID0gU0VUVVBfUFkuZm9ybWF0KGV4dF9tb2R1bGVzPUVYVF9NT0RVTEVTKQogICAgZWxzZToKICAgICAgICBzZXR1cF9weSA9IFNFVFVQX1BZLmZvcm1hdChleHRfbW9kdWxlcz0nJykKICAgIHRlbXBwYXRoLmpvaW4oJ3NldHVwLnB5Jykud3JpdGUoc2V0dXBfcHkpCiAgICByZXR1cm4gdGVtcHBhdGgKCkBweXRlc3QuZml4dHVyZQpkZWYgdGVtcF9leHRfcGtnKHJlcXVlc3QpOgogICAgcmV0dXJuIHRlbXBfcGtnKHJlcXVlc3QsIGV4dD1UcnVlKQoKZGVmIHRlc3RfZGVmYXVsdF90YWcodGVtcF9wa2cpOgogICAgc3VicHJvY2Vzcy5jaGVja19jYWxsKFtzeXMuZXhlY3V0YWJsZSwgJ3NldHVwLnB5JywgJ2JkaXN0X3doZWVsJ10sCiAgICAgICAgICAgIGN3ZD1zdHIodGVtcF9wa2cpKQogICAgZGlzdF9kaXIgPSB0ZW1wX3BrZy5qb2luKCdkaXN0JykKICAgIGFzc2VydCBkaXN0X2Rpci5jaGVjayhkaXI9MSkKICAgIHdoZWVscyA9IGRpc3RfZGlyLmxpc3RkaXIoKQogICAgYXNzZXJ0IGxlbih3aGVlbHMpID09IDEKICAgIGFzc2VydCB3aGVlbHNbMF0uYmFzZW5hbWUgPT0gJ1Rlc3QtMS4wLXB5JXMtbm9uZS1hbnkud2hsJyAlIChzeXMudmVyc2lvblswXSwpCiAgICBhc3NlcnQgd2hlZWxzWzBdLmV4dCA9PSAnLndobCcKCmRlZiB0ZXN0X2V4cGxpY2l0X3RhZyh0ZW1wX3BrZyk6CiAgICBzdWJwcm9jZXNzLmNoZWNrX2NhbGwoCiAgICAgICAgW3N5cy5leGVjdXRhYmxlLCAnc2V0dXAucHknLCAnYmRpc3Rfd2hlZWwnLCAnLS1weXRob24tdGFnPXB5MzInXSwKICAgICAgICBjd2Q9c3RyKHRlbXBfcGtnKSkKICAgIGRpc3RfZGlyID0gdGVtcF9wa2cuam9pbignZGlzdCcpCiAgICBhc3NlcnQgZGlzdF9kaXIuY2hlY2soZGlyPTEpCiAgICB3aGVlbHMgPSBkaXN0X2Rpci5saXN0ZGlyKCkKICAgIGFzc2VydCBsZW4od2hlZWxzKSA9PSAxCiAgICBhc3NlcnQgd2hlZWxzWzBdLmJhc2VuYW1lLnN0YXJ0c3dpdGgoJ1Rlc3QtMS4wLXB5MzItJykKICAgIGFzc2VydCB3aGVlbHNbMF0uZXh0ID09ICcud2hsJwoKZGVmIHRlc3RfdW5pdmVyc2FsX3RhZyh0ZW1wX3BrZyk6CiAgICBzdWJwcm9jZXNzLmNoZWNrX2NhbGwoCiAgICAgICAgW3N5cy5leGVjdXRhYmxlLCAnc2V0dXAucHknLCAnYmRpc3Rfd2hlZWwnLCAnLS11bml2ZXJzYWwnXSwKICAgICAgICBjd2Q9c3RyKHRlbXBfcGtnKSkKICAgIGRpc3RfZGlyID0gdGVtcF9wa2cuam9pbignZGlzdCcpCiAgICBhc3NlcnQgZGlzdF9kaXIuY2hlY2soZGlyPTEpCiAgICB3aGVlbHMgPSBkaXN0X2Rpci5saXN0ZGlyKCkKICAgIGFzc2VydCBsZW4od2hlZWxzKSA9PSAxCiAgICBhc3NlcnQgd2hlZWxzWzBdLmJhc2VuYW1lLnN0YXJ0c3dpdGgoJ1Rlc3QtMS4wLXB5Mi5weTMtJykKICAgIGFzc2VydCB3aGVlbHNbMF0uZXh0ID09ICcud2hsJwoKZGVmIHRlc3RfdW5pdmVyc2FsX2JlYXRzX2V4cGxpY2l0X3RhZyh0ZW1wX3BrZyk6CiAgICBzdWJwcm9jZXNzLmNoZWNrX2NhbGwoCiAgICAgICAgW3N5cy5leGVjdXRhYmxlLCAnc2V0dXAucHknLCAnYmRpc3Rfd2hlZWwnLCAnLS11bml2ZXJzYWwnLCAnLS1weXRob24tdGFnPXB5MzInXSwKICAgICAgICBjd2Q9c3RyKHRlbXBfcGtnKSkKICAgIGRpc3RfZGlyID0gdGVtcF9wa2cuam9pbignZGlzdCcpCiAgICBhc3NlcnQgZGlzdF9kaXIuY2hlY2soZGlyPTEpCiAgICB3aGVlbHMgPSBkaXN0X2Rpci5saXN0ZGlyKCkKICAgIGFzc2VydCBsZW4od2hlZWxzKSA9PSAxCiAgICBhc3NlcnQgd2hlZWxzWzBdLmJhc2VuYW1lLnN0YXJ0c3dpdGgoJ1Rlc3QtMS4wLXB5Mi5weTMtJykKICAgIGFzc2VydCB3aGVlbHNbMF0uZXh0ID09ICcud2hsJwoKZGVmIHRlc3RfdW5pdmVyc2FsX2luX3NldHVwX2NmZyh0ZW1wX3BrZyk6CiAgICB0ZW1wX3BrZy5qb2luKCdzZXR1cC5jZmcnKS53cml0ZSgnW2JkaXN0X3doZWVsXVxudW5pdmVyc2FsPTEnKQogICAgc3VicHJvY2Vzcy5jaGVja19jYWxsKAogICAgICAgIFtzeXMuZXhlY3V0YWJsZSwgJ3NldHVwLnB5JywgJ2JkaXN0X3doZWVsJ10sCiAgICAgICAgY3dkPXN0cih0ZW1wX3BrZykpCiAgICBkaXN0X2RpciA9IHRlbXBfcGtnLmpvaW4oJ2Rpc3QnKQogICAgYXNzZXJ0IGRpc3RfZGlyLmNoZWNrKGRpcj0xKQogICAgd2hlZWxzID0gZGlzdF9kaXIubGlzdGRpcigpCiAgICBhc3NlcnQgbGVuKHdoZWVscykgPT0gMQogICAgYXNzZXJ0IHdoZWVsc1swXS5iYXNlbmFtZS5zdGFydHN3aXRoKCdUZXN0LTEuMC1weTIucHkzLScpCiAgICBhc3NlcnQgd2hlZWxzWzBdLmV4dCA9PSAnLndobCcKCmRlZiB0ZXN0X3B5dGhvbnRhZ19pbl9zZXR1cF9jZmcodGVtcF9wa2cpOgogICAgdGVtcF9wa2cuam9pbignc2V0dXAuY2ZnJykud3JpdGUoJ1tiZGlzdF93aGVlbF1cbnB5dGhvbl90YWc9cHkzMicpCiAgICBzdWJwcm9jZXNzLmNoZWNrX2NhbGwoCiAgICAgICAgW3N5cy5leGVjdXRhYmxlLCAnc2V0dXAucHknLCAnYmRpc3Rfd2hlZWwnXSwKICAgICAgICBjd2Q9c3RyKHRlbXBfcGtnKSkKICAgIGRpc3RfZGlyID0gdGVtcF9wa2cuam9pbignZGlzdCcpCiAgICBhc3NlcnQgZGlzdF9kaXIuY2hlY2soZGlyPTEpCiAgICB3aGVlbHMgPSBkaXN0X2Rpci5saXN0ZGlyKCkKICAgIGFzc2VydCBsZW4od2hlZWxzKSA9PSAxCiAgICBhc3NlcnQgd2hlZWxzWzBdLmJhc2VuYW1lLnN0YXJ0c3dpdGgoJ1Rlc3QtMS4wLXB5MzItJykKICAgIGFzc2VydCB3aGVlbHNbMF0uZXh0ID09ICcud2hsJwoKZGVmIHRlc3RfbGVnYWN5X3doZWVsX3NlY3Rpb25faW5fc2V0dXBfY2ZnKHRlbXBfcGtnKToKICAgIHRlbXBfcGtnLmpvaW4oJ3NldHVwLmNmZycpLndyaXRlKCdbd2hlZWxdXG51bml2ZXJzYWw9MScpCiAgICBzdWJwcm9jZXNzLmNoZWNrX2NhbGwoCiAgICAgICAgW3N5cy5leGVjdXRhYmxlLCAnc2V0dXAucHknLCAnYmRpc3Rfd2hlZWwnXSwKICAgICAgICBjd2Q9c3RyKHRlbXBfcGtnKSkKICAgIGRpc3RfZGlyID0gdGVtcF9wa2cuam9pbignZGlzdCcpCiAgICBhc3NlcnQgZGlzdF9kaXIuY2hlY2soZGlyPTEpCiAgICB3aGVlbHMgPSBkaXN0X2Rpci5saXN0ZGlyKCkKICAgIGFzc2VydCBsZW4od2hlZWxzKSA9PSAxCiAgICBhc3NlcnQgd2hlZWxzWzBdLmJhc2VuYW1lLnN0YXJ0c3dpdGgoJ1Rlc3QtMS4wLXB5Mi5weTMtJykKICAgIGFzc2VydCB3aGVlbHNbMF0uZXh0ID09ICcud2hsJwoKZGVmIHRlc3RfcGxhdF9uYW1lX3B1cmVweSh0ZW1wX3BrZyk6CiAgICBzdWJwcm9jZXNzLmNoZWNrX2NhbGwoCiAgICAgICAgW3N5cy5leGVjdXRhYmxlLCAnc2V0dXAucHknLCAnYmRpc3Rfd2hlZWwnLCAnLS1wbGF0LW5hbWU9dGVzdHBsYXQucHVyZSddLAogICAgICAgIGN3ZD1zdHIodGVtcF9wa2cpKQogICAgZGlzdF9kaXIgPSB0ZW1wX3BrZy5qb2luKCdkaXN0JykKICAgIGFzc2VydCBkaXN0X2Rpci5jaGVjayhkaXI9MSkKICAgIHdoZWVscyA9IGRpc3RfZGlyLmxpc3RkaXIoKQogICAgYXNzZXJ0IGxlbih3aGVlbHMpID09IDEKICAgIGFzc2VydCB3aGVlbHNbMF0uYmFzZW5hbWUuZW5kc3dpdGgoJy10ZXN0cGxhdF9wdXJlLndobCcpCiAgICBhc3NlcnQgd2hlZWxzWzBdLmV4dCA9PSAnLndobCcKCmRlZiB0ZXN0X3BsYXRfbmFtZV9leHQodGVtcF9leHRfcGtnKToKICAgIHRyeToKICAgICAgICBzdWJwcm9jZXNzLmNoZWNrX2NhbGwoCiAgICAgICAgICAgIFtzeXMuZXhlY3V0YWJsZSwgJ3NldHVwLnB5JywgJ2JkaXN0X3doZWVsJywgJy0tcGxhdC1uYW1lPXRlc3RwbGF0LmFyY2gnXSwKICAgICAgICAgICAgY3dkPXN0cih0ZW1wX2V4dF9wa2cpKQogICAgZXhjZXB0IHN1YnByb2Nlc3MuQ2FsbGVkUHJvY2Vzc0Vycm9yOgogICAgICAgIHB5dGVzdC5za2lwKCJDYW5ub3QgY29tcGlsZSBDIEV4dGVuc2lvbnMiKQogICAgZGlzdF9kaXIgPSB0ZW1wX2V4dF9wa2cuam9pbignZGlzdCcpCiAgICBhc3NlcnQgZGlzdF9kaXIuY2hlY2soZGlyPTEpCiAgICB3aGVlbHMgPSBkaXN0X2Rpci5saXN0ZGlyKCkKICAgIGFzc2VydCBsZW4od2hlZWxzKSA9PSAxCiAgICBhc3NlcnQgd2hlZWxzWzBdLmJhc2VuYW1lLmVuZHN3aXRoKCctdGVzdHBsYXRfYXJjaC53aGwnKQogICAgYXNzZXJ0IHdoZWVsc1swXS5leHQgPT0gJy53aGwnCgpkZWYgdGVzdF9wbGF0X25hbWVfcHVyZXB5X2luX3NldHVwY2ZnKHRlbXBfcGtnKToKICAgIHRlbXBfcGtnLmpvaW4oJ3NldHVwLmNmZycpLndyaXRlKCdbYmRpc3Rfd2hlZWxdXG5wbGF0X25hbWU9dGVzdHBsYXQucHVyZScpCiAgICBzdWJwcm9jZXNzLmNoZWNrX2NhbGwoCiAgICAgICAgW3N5cy5leGVjdXRhYmxlLCAnc2V0dXAucHknLCAnYmRpc3Rfd2hlZWwnXSwKICAgICAgICBjd2Q9c3RyKHRlbXBfcGtnKSkKICAgIGRpc3RfZGlyID0gdGVtcF9wa2cuam9pbignZGlzdCcpCiAgICBhc3NlcnQgZGlzdF9kaXIuY2hlY2soZGlyPTEpCiAgICB3aGVlbHMgPSBkaXN0X2Rpci5saXN0ZGlyKCkKICAgIGFzc2VydCBsZW4od2hlZWxzKSA9PSAxCiAgICBhc3NlcnQgd2hlZWxzWzBdLmJhc2VuYW1lLmVuZHN3aXRoKCctdGVzdHBsYXRfcHVyZS53aGwnKQogICAgYXNzZXJ0IHdoZWVsc1swXS5leHQgPT0gJy53aGwnCgpkZWYgdGVzdF9wbGF0X25hbWVfZXh0X2luX3NldHVwY2ZnKHRlbXBfZXh0X3BrZyk6CiAgICB0ZW1wX2V4dF9wa2cuam9pbignc2V0dXAuY2ZnJykud3JpdGUoJ1tiZGlzdF93aGVlbF1cbnBsYXRfbmFtZT10ZXN0cGxhdC5hcmNoJykKICAgIHRyeToKICAgICAgICBzdWJwcm9jZXNzLmNoZWNrX2NhbGwoCiAgICAgICAgICAgIFtzeXMuZXhlY3V0YWJsZSwgJ3NldHVwLnB5JywgJ2JkaXN0X3doZWVsJ10sCiAgICAgICAgICAgIGN3ZD1zdHIodGVtcF9leHRfcGtnKSkKICAgIGV4Y2VwdCBzdWJwcm9jZXNzLkNhbGxlZFByb2Nlc3NFcnJvcjoKICAgICAgICBweXRlc3Quc2tpcCgiQ2Fubm90IGNvbXBpbGUgQyBFeHRlbnNpb25zIikKICAgIGRpc3RfZGlyID0gdGVtcF9leHRfcGtnLmpvaW4oJ2Rpc3QnKQogICAgYXNzZXJ0IGRpc3RfZGlyLmNoZWNrKGRpcj0xKQogICAgd2hlZWxzID0gZGlzdF9kaXIubGlzdGRpcigpCiAgICBhc3NlcnQgbGVuKHdoZWVscykgPT0gMQogICAgYXNzZXJ0IHdoZWVsc1swXS5iYXNlbmFtZS5lbmRzd2l0aCgnLXRlc3RwbGF0X2FyY2gud2hsJykKICAgIGFzc2VydCB3aGVlbHNbMF0uZXh0ID09ICcud2hsJwpQSwMEFAAAAAAAAAAhANQ+H1aQAgAAkAIAADkAAABwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC90ZXN0X3Rvb2wucHlmcm9tIC4uIGltcG9ydCB0b29sCgpkZWYgdGVzdF9rZXlnZW4oKToKICAgIGRlZiBnZXRfa2V5cmluZygpOgogICAgICAgIFdoZWVsS2V5cywga2V5cmluZyA9IHRvb2wuZ2V0X2tleXJpbmcoKQoKICAgICAgICBjbGFzcyBXaGVlbEtleXNUZXN0KFdoZWVsS2V5cyk6CiAgICAgICAgICAgIGRlZiBzYXZlKHNlbGYpOgogICAgICAgICAgICAgICAgcGFzcwoKICAgICAgICBjbGFzcyBrZXlyaW5nVGVzdDoKICAgICAgICAgICAgQGNsYXNzbWV0aG9kCiAgICAgICAgICAgIGRlZiBnZXRfa2V5cmluZyhjbHMpOgogICAgICAgICAgICAgICAgY2xhc3Mga2V5cmluZ1Rlc3QyOgogICAgICAgICAgICAgICAgICAgIHB3ID0gTm9uZQogICAgICAgICAgICAgICAgICAgIGRlZiBzZXRfcGFzc3dvcmQoc2VsZiwgYSwgYiwgYyk6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucHcgPSBjCiAgICAgICAgICAgICAgICAgICAgZGVmIGdldF9wYXNzd29yZChzZWxmLCBhLCBiKToKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYucHcKCiAgICAgICAgICAgICAgICByZXR1cm4ga2V5cmluZ1Rlc3QyKCkKCiAgICAgICAgcmV0dXJuIFdoZWVsS2V5c1Rlc3QsIGtleXJpbmdUZXN0CgogICAgdG9vbC5rZXlnZW4oZ2V0X2tleXJpbmc9Z2V0X2tleXJpbmcpClBLAwQUAAAAAAAAACEARWJETOkRAADpEQAAPgAAAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L3Rlc3Rfd2hlZWxmaWxlLnB5aW1wb3J0IG9zCmltcG9ydCB3aGVlbC5pbnN0YWxsCmltcG9ydCB3aGVlbC5hcmNoaXZlCmltcG9ydCBoYXNobGliCnRyeToKICAgIGZyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGZyb20gaW8gaW1wb3J0IEJ5dGVzSU8gYXMgU3RyaW5nSU8KaW1wb3J0IGNvZGVjcwppbXBvcnQgemlwZmlsZQppbXBvcnQgcHl0ZXN0CmltcG9ydCBzaHV0aWwKaW1wb3J0IHRlbXBmaWxlCmZyb20gY29udGV4dGxpYiBpbXBvcnQgY29udGV4dG1hbmFnZXIKCkBjb250ZXh0bWFuYWdlcgpkZWYgZW52aXJvbihrZXksIHZhbHVlKToKICAgIG9sZF92YWx1ZSA9IG9zLmVudmlyb24uZ2V0KGtleSkKICAgIHRyeToKICAgICAgICBvcy5lbnZpcm9uW2tleV0gPSB2YWx1ZQogICAgICAgIHlpZWxkCiAgICBmaW5hbGx5OgogICAgICAgIGlmIG9sZF92YWx1ZSBpcyBOb25lOgogICAgICAgICAgICBkZWwgb3MuZW52aXJvbltrZXldCiAgICAgICAgZWxzZToKICAgICAgICAgICAgb3MuZW52aXJvbltrZXldID0gb2xkX3ZhbHVlCgpAY29udGV4dG1hbmFnZXIKZGVmIHRlbXBvcmFyeV9kaXJlY3RvcnkoKToKICAgICMgdGVtcGZpbGUuVGVtcG9yYXJ5RGlyZWN0b3J5IGRvZXNuJ3QgZXhpc3QgaW4gUHl0aG9uIDIuCiAgICB0ZW1wZGlyID0gdGVtcGZpbGUubWtkdGVtcCgpCiAgICB0cnk6CiAgICAgICAgeWllbGQgdGVtcGRpcgogICAgZmluYWxseToKICAgICAgICBzaHV0aWwucm10cmVlKHRlbXBkaXIpCgpAY29udGV4dG1hbmFnZXIKZGVmIHJlYWRhYmxlX3ppcGZpbGUocGF0aCk6CiAgICAjIHppcGZpbGUuWmlwRmlsZSgpIGlzbid0IGEgY29udGV4dCBtYW5hZ2VyIHVuZGVyIFB5dGhvbiAyLgogICAgemYgPSB6aXBmaWxlLlppcEZpbGUocGF0aCwgJ3InKQogICAgdHJ5OgogICAgICAgIHlpZWxkIHpmCiAgICBmaW5hbGx5OgogICAgICAgIHpmLmNsb3NlKCkKCgpkZWYgdGVzdF92ZXJpZnlpbmdfemlwZmlsZSgpOgogICAgaWYgbm90IGhhc2F0dHIoemlwZmlsZS5aaXBFeHRGaWxlLCAnX3VwZGF0ZV9jcmMnKToKICAgICAgICBweXRlc3Quc2tpcCgnTm8gWklQIHZlcmlmaWNhdGlvbi4gTWlzc2luZyBaaXBFeHRGaWxlLl91cGRhdGVfY3JjLicpCiAgICAKICAgIHNpbyA9IFN0cmluZ0lPKCkKICAgIHpmID0gemlwZmlsZS5aaXBGaWxlKHNpbywgJ3cnKQogICAgemYud3JpdGVzdHIoIm9uZSIsIGIiZmlyc3QgZmlsZSIpCiAgICB6Zi53cml0ZXN0cigidHdvIiwgYiJzZWNvbmQgZmlsZSIpCiAgICB6Zi53cml0ZXN0cigidGhyZWUiLCBiInRoaXJkIGZpbGUiKQogICAgemYuY2xvc2UoKQogICAgCiAgICAjIEluIGRlZmF1bHQgbW9kZSwgVmVyaWZ5aW5nWmlwRmlsZSBjaGVja3MgdGhlIGhhc2ggb2YgYW55IHJlYWQgZmlsZQogICAgIyBtZW50aW9uZWQgd2l0aCBzZXRfZXhwZWN0ZWRfaGFzaCgpLiBGaWxlcyBub3QgbWVudGlvbmVkIHdpdGgKICAgICMgc2V0X2V4cGVjdGVkX2hhc2goKSBhcmUgbm90IGNoZWNrZWQuCiAgICB2emYgPSB3aGVlbC5pbnN0YWxsLlZlcmlmeWluZ1ppcEZpbGUoc2lvLCAncicpCiAgICB2emYuc2V0X2V4cGVjdGVkX2hhc2goIm9uZSIsIGhhc2hsaWIuc2hhMjU2KGIiZmlyc3QgZmlsZSIpLmRpZ2VzdCgpKQogICAgdnpmLnNldF9leHBlY3RlZF9oYXNoKCJ0aHJlZSIsICJibHVyYmxlIikKICAgIHZ6Zi5vcGVuKCJvbmUiKS5yZWFkKCkKICAgIHZ6Zi5vcGVuKCJ0d28iKS5yZWFkKCkKICAgIHRyeToKICAgICAgICB2emYub3BlbigidGhyZWUiKS5yZWFkKCkKICAgIGV4Y2VwdCB3aGVlbC5pbnN0YWxsLkJhZFdoZWVsRmlsZToKICAgICAgICBwYXNzCiAgICBlbHNlOgogICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiZXhwZWN0ZWQgZXhjZXB0aW9uICdCYWRXaGVlbEZpbGUoKSciKQogICAgCiAgICAjIEluIHN0cmljdCBtb2RlLCBWZXJpZnlpbmdaaXBGaWxlIHJlcXVpcmVzIGV2ZXJ5IHJlYWQgZmlsZSB0byBiZQogICAgIyBtZW50aW9uZWQgd2l0aCBzZXRfZXhwZWN0ZWRfaGFzaCgpLgogICAgdnpmLnN0cmljdCA9IFRydWUKICAgIHRyeToKICAgICAgICB2emYub3BlbigidHdvIikucmVhZCgpCiAgICBleGNlcHQgd2hlZWwuaW5zdGFsbC5CYWRXaGVlbEZpbGU6CiAgICAgICAgcGFzcwogICAgZWxzZToKICAgICAgICByYWlzZSBFeGNlcHRpb24oImV4cGVjdGVkIGV4Y2VwdGlvbiAnQmFkV2hlZWxGaWxlKCknIikKICAgICAgICAKICAgIHZ6Zi5zZXRfZXhwZWN0ZWRfaGFzaCgidHdvIiwgTm9uZSkKICAgIHZ6Zi5vcGVuKCJ0d28iKS5yZWFkKCkKICAgIApkZWYgdGVzdF9wb3BfemlwZmlsZSgpOgogICAgc2lvID0gU3RyaW5nSU8oKQogICAgemYgPSB3aGVlbC5pbnN0YWxsLlZlcmlmeWluZ1ppcEZpbGUoc2lvLCAndycpCiAgICB6Zi53cml0ZXN0cigib25lIiwgYiJmaXJzdCBmaWxlIikKICAgIHpmLndyaXRlc3RyKCJ0d28iLCBiInNlY29uZCBmaWxlIikKICAgIHpmLmNsb3NlKCkKICAgIAogICAgdHJ5OgogICAgICAgIHpmLnBvcCgpCiAgICBleGNlcHQgUnVudGltZUVycm9yOgogICAgICAgIHBhc3MgIyBhbHJlYWR5IGNsb3NlZAogICAgZWxzZToKICAgICAgICByYWlzZSBFeGNlcHRpb24oImV4cGVjdGVkIFJ1bnRpbWVFcnJvciIpCiAgICAKICAgIHpmID0gd2hlZWwuaW5zdGFsbC5WZXJpZnlpbmdaaXBGaWxlKHNpbywgJ2EnKQogICAgemYucG9wKCkKICAgIHpmLmNsb3NlKCkKICAgIAogICAgemYgPSB3aGVlbC5pbnN0YWxsLlZlcmlmeWluZ1ppcEZpbGUoc2lvLCAncicpCiAgICBhc3NlcnQgbGVuKHpmLmluZm9saXN0KCkpID09IDEKCmRlZiB0ZXN0X3ppcGZpbGVfdGltZXN0YW1wKCk6CiAgICAjIEFuIGVudmlyb25tZW50IHZhcmlhYmxlIGNhbiBiZSB1c2VkIHRvIGluZmx1ZW5jZSB0aGUgdGltZXN0YW1wIG9uCiAgICAjIFRhckluZm8gb2JqZWN0cyBpbnNpZGUgdGhlIHppcC4gIFNlZSBpc3N1ZSAjMTQzLiAgVGVtcG9yYXJ5RGlyZWN0b3J5IGlzCiAgICAjIG5vdCBhIGNvbnRleHQgbWFuYWdlciB1bmRlciBQeXRob24gMy4KICAgIHdpdGggdGVtcG9yYXJ5X2RpcmVjdG9yeSgpIGFzIHRlbXBkaXI6CiAgICAgICAgZm9yIGZpbGVuYW1lIGluICgnb25lJywgJ3R3bycsICd0aHJlZScpOgogICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHRlbXBkaXIsIGZpbGVuYW1lKQogICAgICAgICAgICB3aXRoIGNvZGVjcy5vcGVuKHBhdGgsICd3JywgZW5jb2Rpbmc9J3V0Zi04JykgYXMgZnA6CiAgICAgICAgICAgICAgICBmcC53cml0ZShmaWxlbmFtZSArICdcbicpCiAgICAgICAgemlwX2Jhc2VfbmFtZSA9IG9zLnBhdGguam9pbih0ZW1wZGlyLCAnZHVtbXknKQogICAgICAgICMgVGhlIGVhcmxpZXN0IGRhdGUgcmVwcmVzZW50YWJsZSBpbiBUYXJJbmZvcywgMTk4MC0wMS0wMQogICAgICAgIHdpdGggZW52aXJvbignU09VUkNFX0RBVEVfRVBPQ0gnLCAnMzE1NTc2MDYwJyk6CiAgICAgICAgICAgIHppcF9maWxlbmFtZSA9IHdoZWVsLmFyY2hpdmUubWFrZV93aGVlbGZpbGVfaW5uZXIoCiAgICAgICAgICAgICAgICB6aXBfYmFzZV9uYW1lLCB0ZW1wZGlyKQogICAgICAgIHdpdGggcmVhZGFibGVfemlwZmlsZSh6aXBfZmlsZW5hbWUpIGFzIHpmOgogICAgICAgICAgICBmb3IgaW5mbyBpbiB6Zi5pbmZvbGlzdCgpOgogICAgICAgICAgICAgICAgYXNzZXJ0IGluZm8uZGF0ZV90aW1lWzozXSA9PSAoMTk4MCwgMSwgMSkKCmRlZiB0ZXN0X3ppcGZpbGVfYXR0cmlidXRlcygpOgogICAgIyBXaXRoIHRoZSBjaGFuZ2UgZnJvbSBaaXBGaWxlLndyaXRlKCkgdG8gLndyaXRlc3RyKCksIHdlIG5lZWQgdG8gbWFudWFsbHkKICAgICMgc2V0IG1lbWJlciBhdHRyaWJ1dGVzLgogICAgd2l0aCB0ZW1wb3JhcnlfZGlyZWN0b3J5KCkgYXMgdGVtcGRpcjoKICAgICAgICBmaWxlcyA9ICgoJ2ZvbycsIDBvNjQ0KSwgKCdiYXInLCAwbzc1NSkpCiAgICAgICAgZm9yIGZpbGVuYW1lLCBtb2RlIGluIGZpbGVzOgogICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHRlbXBkaXIsIGZpbGVuYW1lKQogICAgICAgICAgICB3aXRoIGNvZGVjcy5vcGVuKHBhdGgsICd3JywgZW5jb2Rpbmc9J3V0Zi04JykgYXMgZnA6CiAgICAgICAgICAgICAgICBmcC53cml0ZShmaWxlbmFtZSArICdcbicpCiAgICAgICAgICAgIG9zLmNobW9kKHBhdGgsIG1vZGUpCiAgICAgICAgemlwX2Jhc2VfbmFtZSA9IG9zLnBhdGguam9pbih0ZW1wZGlyLCAnZHVtbXknKQogICAgICAgIHppcF9maWxlbmFtZSA9IHdoZWVsLmFyY2hpdmUubWFrZV93aGVlbGZpbGVfaW5uZXIoCiAgICAgICAgICAgIHppcF9iYXNlX25hbWUsIHRlbXBkaXIpCiAgICAgICAgd2l0aCByZWFkYWJsZV96aXBmaWxlKHppcF9maWxlbmFtZSkgYXMgemY6CiAgICAgICAgICAgIGZvciBmaWxlbmFtZSwgbW9kZSBpbiBmaWxlczoKICAgICAgICAgICAgICAgIGluZm8gPSB6Zi5nZXRpbmZvKG9zLnBhdGguam9pbih0ZW1wZGlyLCBmaWxlbmFtZSkpCiAgICAgICAgICAgICAgICBhc3NlcnQgaW5mby5leHRlcm5hbF9hdHRyID09IChtb2RlIHwgMG8xMDAwMDApIDw8IDE2CiAgICAgICAgICAgICAgICBhc3NlcnQgaW5mby5jb21wcmVzc190eXBlID09IHppcGZpbGUuWklQX0RFRkxBVEVEClBLAwQUAAAAAAAAACEAoy0DF6EzAAChMwAAOAAAAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90b29sL19faW5pdF9fLnB5IiIiCldoZWVsIGNvbW1hbmQtbGluZSB1dGlsaXR5LgoiIiIKCmltcG9ydCBvcwppbXBvcnQgaGFzaGxpYgppbXBvcnQgc3lzCmltcG9ydCBqc29uCgpmcm9tIGdsb2IgaW1wb3J0IGlnbG9iCmZyb20gLi4gaW1wb3J0IHNpZ25hdHVyZXMKZnJvbSAuLnV0aWwgaW1wb3J0ICh1cmxzYWZlX2I2NGRlY29kZSwgdXJsc2FmZV9iNjRlbmNvZGUsIG5hdGl2ZSwgYmluYXJ5LAogICAgICAgICAgICAgICAgICAgIG1hdGNoZXNfcmVxdWlyZW1lbnQpCmZyb20gLi5pbnN0YWxsIGltcG9ydCBXaGVlbEZpbGUsIFZlcmlmeWluZ1ppcEZpbGUKZnJvbSAuLnBhdGhzIGltcG9ydCBnZXRfaW5zdGFsbF9jb21tYW5kCgpkZWYgcmVxdWlyZV9wa2dyZXNvdXJjZXMobmFtZSk6CiAgICB0cnk6CiAgICAgICAgaW1wb3J0IHBrZ19yZXNvdXJjZXMKICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoIid7MH0nIG5lZWRzIHBrZ19yZXNvdXJjZXMgKHBhcnQgb2Ygc2V0dXB0b29scykuIi5mb3JtYXQobmFtZSkpCgppbXBvcnQgYXJncGFyc2UKCmNsYXNzIFdoZWVsRXJyb3IoRXhjZXB0aW9uKTogcGFzcwoKIyBGb3IgdGVzdGFiaWxpdHkKZGVmIGdldF9rZXlyaW5nKCk6CiAgICB0cnk6CiAgICAgICAgZnJvbSAuLnNpZ25hdHVyZXMgaW1wb3J0IGtleXMKICAgICAgICBpbXBvcnQga2V5cmluZwogICAgICAgIGFzc2VydCBrZXlyaW5nLmdldF9rZXlyaW5nKCkucHJpb3JpdHkKICAgIGV4Y2VwdCAoSW1wb3J0RXJyb3IsIEFzc2VydGlvbkVycm9yKToKICAgICAgICByYWlzZSBXaGVlbEVycm9yKCJJbnN0YWxsIHdoZWVsW3NpZ25hdHVyZXNdIChyZXF1aXJlcyBrZXlyaW5nLCBrZXlyaW5ncy5hbHQsIHB5eGRnKSBmb3Igc2lnbmF0dXJlcy4iKQogICAgcmV0dXJuIGtleXMuV2hlZWxLZXlzLCBrZXlyaW5nCgpkZWYga2V5Z2VuKGdldF9rZXlyaW5nPWdldF9rZXlyaW5nKToKICAgICIiIkdlbmVyYXRlIGEgcHVibGljL3ByaXZhdGUga2V5IHBhaXIuIiIiCiAgICBXaGVlbEtleXMsIGtleXJpbmcgPSBnZXRfa2V5cmluZygpCgogICAgZWQyNTUxOWxsID0gc2lnbmF0dXJlcy5nZXRfZWQyNTUxOWxsKCkKCiAgICB3ayA9IFdoZWVsS2V5cygpLmxvYWQoKQoKICAgIGtleXBhaXIgPSBlZDI1NTE5bGwuY3J5cHRvX3NpZ25fa2V5cGFpcigpCiAgICB2ayA9IG5hdGl2ZSh1cmxzYWZlX2I2NGVuY29kZShrZXlwYWlyLnZrKSkKICAgIHNrID0gbmF0aXZlKHVybHNhZmVfYjY0ZW5jb2RlKGtleXBhaXIuc2spKQogICAga3IgPSBrZXlyaW5nLmdldF9rZXlyaW5nKCkKICAgIGtyLnNldF9wYXNzd29yZCgid2hlZWwiLCB2aywgc2spCiAgICBzeXMuc3Rkb3V0LndyaXRlKCJDcmVhdGVkIEVkMjU1MTkga2V5cGFpciB3aXRoIHZrPXswfVxuIi5mb3JtYXQodmspKQogICAgc3lzLnN0ZG91dC53cml0ZSgiaW4gezAhcn1cbiIuZm9ybWF0KGtyKSkKCiAgICBzazIgPSBrci5nZXRfcGFzc3dvcmQoJ3doZWVsJywgdmspCiAgICBpZiBzazIgIT0gc2s6CiAgICAgICAgcmFpc2UgV2hlZWxFcnJvcigiS2V5cmluZyBpcyBicm9rZW4uIENvdWxkIG5vdCByZXRyaWV2ZSBzZWNyZXQga2V5LiIpCgogICAgc3lzLnN0ZG91dC53cml0ZSgiVHJ1c3RpbmcgezB9IHRvIHNpZ24gYW5kIHZlcmlmeSBhbGwgcGFja2FnZXMuXG4iLmZvcm1hdCh2aykpCiAgICB3ay5hZGRfc2lnbmVyKCcrJywgdmspCiAgICB3ay50cnVzdCgnKycsIHZrKQogICAgd2suc2F2ZSgpCgpkZWYgc2lnbih3aGVlbGZpbGUsIHJlcGxhY2U9RmFsc2UsIGdldF9rZXlyaW5nPWdldF9rZXlyaW5nKToKICAgICIiIlNpZ24gYSB3aGVlbCIiIgogICAgV2hlZWxLZXlzLCBrZXlyaW5nID0gZ2V0X2tleXJpbmcoKQoKICAgIGVkMjU1MTlsbCA9IHNpZ25hdHVyZXMuZ2V0X2VkMjU1MTlsbCgpCgogICAgd2YgPSBXaGVlbEZpbGUod2hlZWxmaWxlLCBhcHBlbmQ9VHJ1ZSkKICAgIHdrID0gV2hlZWxLZXlzKCkubG9hZCgpCgogICAgbmFtZSA9IHdmLnBhcnNlZF9maWxlbmFtZS5ncm91cCgnbmFtZScpCiAgICBzaWduX3dpdGggPSB3ay5zaWduZXJzKG5hbWUpWzBdCiAgICBzeXMuc3Rkb3V0LndyaXRlKCJTaWduaW5nIHswfSB3aXRoIHsxfVxuIi5mb3JtYXQobmFtZSwgc2lnbl93aXRoWzFdKSkKCiAgICB2ayA9IHNpZ25fd2l0aFsxXQogICAga3IgPSBrZXlyaW5nLmdldF9rZXlyaW5nKCkKICAgIHNrID0ga3IuZ2V0X3Bhc3N3b3JkKCd3aGVlbCcsIHZrKQogICAga2V5cGFpciA9IGVkMjU1MTlsbC5LZXlwYWlyKHVybHNhZmVfYjY0ZGVjb2RlKGJpbmFyeSh2aykpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybHNhZmVfYjY0ZGVjb2RlKGJpbmFyeShzaykpKQoKCiAgICByZWNvcmRfbmFtZSA9IHdmLmRpc3RpbmZvX25hbWUgKyAnL1JFQ09SRCcKICAgIHNpZ19uYW1lID0gd2YuZGlzdGluZm9fbmFtZSArICcvUkVDT1JELmp3cycKICAgIGlmIHNpZ19uYW1lIGluIHdmLnppcGZpbGUubmFtZWxpc3QoKToKICAgICAgICByYWlzZSBXaGVlbEVycm9yKCJXaGVlbCBpcyBhbHJlYWR5IHNpZ25lZC4iKQogICAgcmVjb3JkX2RhdGEgPSB3Zi56aXBmaWxlLnJlYWQocmVjb3JkX25hbWUpCiAgICBwYXlsb2FkID0geyJoYXNoIjoic2hhMjU2PSIgKyBuYXRpdmUodXJsc2FmZV9iNjRlbmNvZGUoaGFzaGxpYi5zaGEyNTYocmVjb3JkX2RhdGEpLmRpZ2VzdCgpKSl9CiAgICBzaWcgPSBzaWduYXR1cmVzLnNpZ24ocGF5bG9hZCwga2V5cGFpcikKICAgIHdmLnppcGZpbGUud3JpdGVzdHIoc2lnX25hbWUsIGpzb24uZHVtcHMoc2lnLCBzb3J0X2tleXM9VHJ1ZSkpCiAgICB3Zi56aXBmaWxlLmNsb3NlKCkKCmRlZiB1bnNpZ24od2hlZWxmaWxlKToKICAgICIiIgogICAgUmVtb3ZlIFJFQ09SRC5qd3MgZnJvbSBhIHdoZWVsIGJ5IHRydW5jYXRpbmcgdGhlIHppcCBmaWxlLgoKICAgIFJFQ09SRC5qd3MgbXVzdCBiZSBhdCB0aGUgZW5kIG9mIHRoZSBhcmNoaXZlLiBUaGUgemlwIGZpbGUgbXVzdCBiZSBhbgogICAgb3JkaW5hcnkgYXJjaGl2ZSwgd2l0aCB0aGUgY29tcHJlc3NlZCBmaWxlcyBhbmQgdGhlIGRpcmVjdG9yeSBpbiB0aGUgc2FtZQogICAgb3JkZXIsIGFuZCB3aXRob3V0IGFueSBub24temlwIGNvbnRlbnQgYWZ0ZXIgdGhlIHRydW5jYXRpb24gcG9pbnQuCiAgICAiIiIKICAgIHZ6ZiA9IFZlcmlmeWluZ1ppcEZpbGUod2hlZWxmaWxlLCAiYSIpCiAgICBpbmZvID0gdnpmLmluZm9saXN0KCkKICAgIGlmIG5vdCAobGVuKGluZm8pIGFuZCBpbmZvWy0xXS5maWxlbmFtZS5lbmRzd2l0aCgnL1JFQ09SRC5qd3MnKSk6CiAgICAgICAgcmFpc2UgV2hlZWxFcnJvcigiUkVDT1JELmp3cyBub3QgZm91bmQgYXQgZW5kIG9mIGFyY2hpdmUuIikKICAgIHZ6Zi5wb3AoKQogICAgdnpmLmNsb3NlKCkKCmRlZiB2ZXJpZnkod2hlZWxmaWxlKToKICAgICIiIlZlcmlmeSBhIHdoZWVsLgoKICAgIFRoZSBzaWduYXR1cmUgd2lsbCBiZSB2ZXJpZmllZCBmb3IgaW50ZXJuYWwgY29uc2lzdGVuY3kgT05MWSBhbmQgcHJpbnRlZC4KICAgIFdoZWVsJ3Mgb3duIHVucGFjay9pbnN0YWxsIGNvbW1hbmRzIHZlcmlmeSB0aGUgbWFuaWZlc3QgYWdhaW5zdCB0aGUKICAgIHNpZ25hdHVyZSBhbmQgZmlsZSBjb250ZW50cy4KICAgICIiIgogICAgd2YgPSBXaGVlbEZpbGUod2hlZWxmaWxlKQogICAgc2lnX25hbWUgPSB3Zi5kaXN0aW5mb19uYW1lICsgJy9SRUNPUkQuandzJwogICAgc2lnID0ganNvbi5sb2FkcyhuYXRpdmUod2YuemlwZmlsZS5vcGVuKHNpZ19uYW1lKS5yZWFkKCkpKQogICAgdmVyaWZpZWQgPSBzaWduYXR1cmVzLnZlcmlmeShzaWcpCiAgICBzeXMuc3RkZXJyLndyaXRlKCJTaWduYXR1cmVzIGFyZSBpbnRlcm5hbGx5IGNvbnNpc3RlbnQuXG4iKQogICAgc3lzLnN0ZG91dC53cml0ZShqc29uLmR1bXBzKHZlcmlmaWVkLCBpbmRlbnQ9MikpCiAgICBzeXMuc3Rkb3V0LndyaXRlKCdcbicpCgpkZWYgdW5wYWNrKHdoZWVsZmlsZSwgZGVzdD0nLicpOgogICAgIiIiVW5wYWNrIGEgd2hlZWwuCgogICAgV2hlZWwgY29udGVudCB3aWxsIGJlIHVucGFja2VkIHRvIHtkZXN0fS97bmFtZX0te3Zlcn0sIHdoZXJlIHtuYW1lfQogICAgaXMgdGhlIHBhY2thZ2UgbmFtZSBhbmQge3Zlcn0gaXRzIHZlcnNpb24uCgogICAgOnBhcmFtIHdoZWVsZmlsZTogVGhlIHBhdGggdG8gdGhlIHdoZWVsLgogICAgOnBhcmFtIGRlc3Q6IERlc3RpbmF0aW9uIGRpcmVjdG9yeSAoZGVmYXVsdCB0byBjdXJyZW50IGRpcmVjdG9yeSkuCiAgICAiIiIKICAgIHdmID0gV2hlZWxGaWxlKHdoZWVsZmlsZSkKICAgIG5hbWV2ZXIgPSB3Zi5wYXJzZWRfZmlsZW5hbWUuZ3JvdXAoJ25hbWV2ZXInKQogICAgZGVzdGluYXRpb24gPSBvcy5wYXRoLmpvaW4oZGVzdCwgbmFtZXZlcikKICAgIHN5cy5zdGRlcnIud3JpdGUoIlVucGFja2luZyB0bzogJXNcbiIgJSAoZGVzdGluYXRpb24pKQogICAgd2YuemlwZmlsZS5leHRyYWN0YWxsKGRlc3RpbmF0aW9uKQogICAgd2YuemlwZmlsZS5jbG9zZSgpCgpkZWYgaW5zdGFsbChyZXF1aXJlbWVudHMsIHJlcXVpcmVtZW50c19maWxlPU5vbmUsCiAgICAgICAgICAgIHdoZWVsX2RpcnM9Tm9uZSwgZm9yY2U9RmFsc2UsIGxpc3RfZmlsZXM9RmFsc2UsCiAgICAgICAgICAgIGRyeV9ydW49RmFsc2UpOgogICAgIiIiSW5zdGFsbCB3aGVlbHMuCgogICAgOnBhcmFtIHJlcXVpcmVtZW50czogQSBsaXN0IG9mIHJlcXVpcmVtZW50cyBvciB3aGVlbCBmaWxlcyB0byBpbnN0YWxsLgogICAgOnBhcmFtIHJlcXVpcmVtZW50c19maWxlOiBBIGZpbGUgY29udGFpbmluZyByZXF1aXJlbWVudHMgdG8gaW5zdGFsbC4KICAgIDpwYXJhbSB3aGVlbF9kaXJzOiBBIGxpc3Qgb2YgZGlyZWN0b3JpZXMgdG8gc2VhcmNoIGZvciB3aGVlbHMuCiAgICA6cGFyYW0gZm9yY2U6IEluc3RhbGwgYSB3aGVlbCBmaWxlIGV2ZW4gaWYgaXQgaXMgbm90IGNvbXBhdGlibGUuCiAgICA6cGFyYW0gbGlzdF9maWxlczogT25seSBsaXN0IHRoZSBmaWxlcyB0byBpbnN0YWxsLCBkb24ndCBpbnN0YWxsIHRoZW0uCiAgICA6cGFyYW0gZHJ5X3J1bjogRG8gZXZlcnl0aGluZyBidXQgdGhlIGFjdHVhbCBpbnN0YWxsLgogICAgIiIiCgogICAgIyBJZiBubyB3aGVlbCBkaXJlY3RvcmllcyBzcGVjaWZpZWQsIHVzZSB0aGUgV0hFRUxQQVRIIGVudmlyb25tZW50CiAgICAjIHZhcmlhYmxlLCBvciB0aGUgY3VycmVudCBkaXJlY3RvcnkgaWYgdGhhdCBpcyBub3Qgc2V0LgogICAgaWYgbm90IHdoZWVsX2RpcnM6CiAgICAgICAgd2hlZWxwYXRoID0gb3MuZ2V0ZW52KCJXSEVFTFBBVEgiKQogICAgICAgIGlmIHdoZWVscGF0aDoKICAgICAgICAgICAgd2hlZWxfZGlycyA9IHdoZWVscGF0aC5zcGxpdChvcy5wYXRoc2VwKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHdoZWVsX2RpcnMgPSBbIG9zLnBhdGguY3VyZGlyIF0KCiAgICAjIEdldCBhIGxpc3Qgb2YgYWxsIHZhbGlkIHdoZWVscyBpbiB3aGVlbF9kaXJzCiAgICBhbGxfd2hlZWxzID0gW10KICAgIGZvciBkIGluIHdoZWVsX2RpcnM6CiAgICAgICAgZm9yIHcgaW4gb3MubGlzdGRpcihkKToKICAgICAgICAgICAgaWYgdy5lbmRzd2l0aCgnLndobCcpOgogICAgICAgICAgICAgICAgd2YgPSBXaGVlbEZpbGUob3MucGF0aC5qb2luKGQsIHcpKQogICAgICAgICAgICAgICAgaWYgd2YuY29tcGF0aWJsZToKICAgICAgICAgICAgICAgICAgICBhbGxfd2hlZWxzLmFwcGVuZCh3ZikKCiAgICAjIElmIHRoZXJlIGlzIGEgcmVxdWlyZW1lbnRzIGZpbGUsIGFkZCBpdCB0byB0aGUgbGlzdCBvZiByZXF1aXJlbWVudHMKICAgIGlmIHJlcXVpcmVtZW50c19maWxlOgogICAgICAgICMgSWYgdGhlIGZpbGUgZG9lc24ndCBleGlzdCwgc2VhcmNoIGZvciBpdCBpbiB3aGVlbF9kaXJzCiAgICAgICAgIyBUaGlzIGFsbG93cyBzdGFuZGFyZCByZXF1aXJlbWVudHMgZmlsZXMgdG8gYmUgc3RvcmVkIHdpdGggdGhlCiAgICAgICAgIyB3aGVlbHMuCiAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHJlcXVpcmVtZW50c19maWxlKToKICAgICAgICAgICAgZm9yIGQgaW4gd2hlZWxfZGlyczoKICAgICAgICAgICAgICAgIG5hbWUgPSBvcy5wYXRoLmpvaW4oZCwgcmVxdWlyZW1lbnRzX2ZpbGUpCiAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhuYW1lKToKICAgICAgICAgICAgICAgICAgICByZXF1aXJlbWVudHNfZmlsZSA9IG5hbWUKICAgICAgICAgICAgICAgICAgICBicmVhawoKICAgICAgICB3aXRoIG9wZW4ocmVxdWlyZW1lbnRzX2ZpbGUpIGFzIGZkOgogICAgICAgICAgICByZXF1aXJlbWVudHMuZXh0ZW5kKGZkKQoKICAgIHRvX2luc3RhbGwgPSBbXQogICAgZm9yIHJlcSBpbiByZXF1aXJlbWVudHM6CiAgICAgICAgaWYgcmVxLmVuZHN3aXRoKCcud2hsJyk6CiAgICAgICAgICAgICMgRXhwbGljaXRseSBzcGVjaWZpZWQgd2hlZWwgZmlsZW5hbWUKICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMocmVxKToKICAgICAgICAgICAgICAgIHdmID0gV2hlZWxGaWxlKHJlcSkKICAgICAgICAgICAgICAgIGlmIHdmLmNvbXBhdGlibGUgb3IgZm9yY2U6CiAgICAgICAgICAgICAgICAgICAgdG9faW5zdGFsbC5hcHBlbmQod2YpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIG1zZyA9ICgiezB9IGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhpcyBQeXRob24uICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0tZm9yY2UgdG8gaW5zdGFsbCBhbnl3YXkuIi5mb3JtYXQocmVxKSkKICAgICAgICAgICAgICAgICAgICByYWlzZSBXaGVlbEVycm9yKG1zZykKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgV2UgY291bGQgc2VhcmNoIG9uIHdoZWVsX2RpcnMsIGJ1dCBpdCdzIHByb2JhYmx5IE9LIHRvCiAgICAgICAgICAgICAgICAjIGFzc3VtZSB0aGUgdXNlciBoYXMgbWFkZSBhbiBlcnJvci4KICAgICAgICAgICAgICAgIHJhaXNlIFdoZWVsRXJyb3IoIk5vIHN1Y2ggd2hlZWwgZmlsZToge30iLmZvcm1hdChyZXEpKQogICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAjIFdlIGhhdmUgYSByZXF1aXJlbWVudCBzcGVjCiAgICAgICAgIyBJZiB3ZSBkb24ndCBoYXZlIHBrZ19yZXNvdXJjZXMsIHRoaXMgd2lsbCByYWlzZSBhbiBleGNlcHRpb24KICAgICAgICBtYXRjaGVzID0gbWF0Y2hlc19yZXF1aXJlbWVudChyZXEsIGFsbF93aGVlbHMpCiAgICAgICAgaWYgbm90IG1hdGNoZXM6CiAgICAgICAgICAgIHJhaXNlIFdoZWVsRXJyb3IoIk5vIG1hdGNoIGZvciByZXF1aXJlbWVudCB7fSIuZm9ybWF0KHJlcSkpCiAgICAgICAgdG9faW5zdGFsbC5hcHBlbmQobWF4KG1hdGNoZXMpKQoKICAgICMgV2Ugbm93IGhhdmUgYSBsaXN0IG9mIHdoZWVscyB0byBpbnN0YWxsCiAgICBpZiBsaXN0X2ZpbGVzOgogICAgICAgIHN5cy5zdGRvdXQud3JpdGUoIkluc3RhbGxpbmc6XG4iKQoKICAgIGlmIGRyeV9ydW46CiAgICAgICAgcmV0dXJuCgogICAgZm9yIHdmIGluIHRvX2luc3RhbGw6CiAgICAgICAgaWYgbGlzdF9maWxlczoKICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiICAgIHswfVxuIi5mb3JtYXQod2YuZmlsZW5hbWUpKQogICAgICAgICAgICBjb250aW51ZQogICAgICAgIHdmLmluc3RhbGwoZm9yY2U9Zm9yY2UpCiAgICAgICAgd2YuemlwZmlsZS5jbG9zZSgpCgpkZWYgaW5zdGFsbF9zY3JpcHRzKGRpc3RyaWJ1dGlvbnMpOgogICAgIiIiCiAgICBSZWdlbmVyYXRlIHRoZSBlbnRyeV9wb2ludHMgY29uc29sZV9zY3JpcHRzIGZvciB0aGUgbmFtZWQgZGlzdHJpYnV0aW9uLgogICAgIiIiCiAgICB0cnk6CiAgICAgICAgZnJvbSBzZXR1cHRvb2xzLmNvbW1hbmQgaW1wb3J0IGVhc3lfaW5zdGFsbAogICAgICAgIGltcG9ydCBwa2dfcmVzb3VyY2VzCiAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCInd2hlZWwgaW5zdGFsbF9zY3JpcHRzJyBuZWVkcyBzZXR1cHRvb2xzLiIpCgogICAgZm9yIGRpc3QgaW4gZGlzdHJpYnV0aW9uczoKICAgICAgICBwa2dfcmVzb3VyY2VzX2Rpc3QgPSBwa2dfcmVzb3VyY2VzLmdldF9kaXN0cmlidXRpb24oZGlzdCkKICAgICAgICBpbnN0YWxsID0gZ2V0X2luc3RhbGxfY29tbWFuZChkaXN0KQogICAgICAgIGNvbW1hbmQgPSBlYXN5X2luc3RhbGwuZWFzeV9pbnN0YWxsKGluc3RhbGwuZGlzdHJpYnV0aW9uKQogICAgICAgIGNvbW1hbmQuYXJncyA9IFsnd2hlZWwnXSAjIGR1bW15IGFyZ3VtZW50CiAgICAgICAgY29tbWFuZC5maW5hbGl6ZV9vcHRpb25zKCkKICAgICAgICBjb21tYW5kLmluc3RhbGxfZWdnX3NjcmlwdHMocGtnX3Jlc291cmNlc19kaXN0KQoKZGVmIGNvbnZlcnQoaW5zdGFsbGVycywgZGVzdF9kaXIsIHZlcmJvc2UpOgogICAgcmVxdWlyZV9wa2dyZXNvdXJjZXMoJ3doZWVsIGNvbnZlcnQnKQoKICAgICMgT25seSBzdXBwb3J0IHdoZWVsIGNvbnZlcnQgaWYgcGtnX3Jlc291cmNlcyBpcyBwcmVzZW50CiAgICBmcm9tIC4ud2luaW5zdDJ3aGVlbCBpbXBvcnQgYmRpc3Rfd2luaW5zdDJ3aGVlbAogICAgZnJvbSAuLmVnZzJ3aGVlbCBpbXBvcnQgZWdnMndoZWVsCgogICAgZm9yIHBhdCBpbiBpbnN0YWxsZXJzOgogICAgICAgIGZvciBpbnN0YWxsZXIgaW4gaWdsb2IocGF0KToKICAgICAgICAgICAgaWYgb3MucGF0aC5zcGxpdGV4dChpbnN0YWxsZXIpWzFdID09ICcuZWdnJzoKICAgICAgICAgICAgICAgIGNvbnYgPSBlZ2cyd2hlZWwKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGNvbnYgPSBiZGlzdF93aW5pbnN0MndoZWVsCiAgICAgICAgICAgIGlmIHZlcmJvc2U6CiAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCJ7MH0uLi4gIi5mb3JtYXQoaW5zdGFsbGVyKSkKICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQuZmx1c2goKQogICAgICAgICAgICBjb252KGluc3RhbGxlciwgZGVzdF9kaXIpCiAgICAgICAgICAgIGlmIHZlcmJvc2U6CiAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCJPS1xuIikKCmRlZiBwYXJzZXIoKToKICAgIHAgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigpCiAgICBzID0gcC5hZGRfc3VicGFyc2VycyhoZWxwPSJjb21tYW5kcyIpCgogICAgZGVmIGtleWdlbl9mKGFyZ3MpOgogICAgICAgIGtleWdlbigpCiAgICBrZXlnZW5fcGFyc2VyID0gcy5hZGRfcGFyc2VyKCdrZXlnZW4nLCBoZWxwPSdHZW5lcmF0ZSBzaWduaW5nIGtleScpCiAgICBrZXlnZW5fcGFyc2VyLnNldF9kZWZhdWx0cyhmdW5jPWtleWdlbl9mKQoKICAgIGRlZiBzaWduX2YoYXJncyk6CiAgICAgICAgc2lnbihhcmdzLndoZWVsZmlsZSkKICAgIHNpZ25fcGFyc2VyID0gcy5hZGRfcGFyc2VyKCdzaWduJywgaGVscD0nU2lnbiB3aGVlbCcpCiAgICBzaWduX3BhcnNlci5hZGRfYXJndW1lbnQoJ3doZWVsZmlsZScsIGhlbHA9J1doZWVsIGZpbGUnKQogICAgc2lnbl9wYXJzZXIuc2V0X2RlZmF1bHRzKGZ1bmM9c2lnbl9mKQoKICAgIGRlZiB1bnNpZ25fZihhcmdzKToKICAgICAgICB1bnNpZ24oYXJncy53aGVlbGZpbGUpCiAgICB1bnNpZ25fcGFyc2VyID0gcy5hZGRfcGFyc2VyKCd1bnNpZ24nLCBoZWxwPXVuc2lnbi5fX2RvY19fKQogICAgdW5zaWduX3BhcnNlci5hZGRfYXJndW1lbnQoJ3doZWVsZmlsZScsIGhlbHA9J1doZWVsIGZpbGUnKQogICAgdW5zaWduX3BhcnNlci5zZXRfZGVmYXVsdHMoZnVuYz11bnNpZ25fZikKCiAgICBkZWYgdmVyaWZ5X2YoYXJncyk6CiAgICAgICAgdmVyaWZ5KGFyZ3Mud2hlZWxmaWxlKQogICAgdmVyaWZ5X3BhcnNlciA9IHMuYWRkX3BhcnNlcigndmVyaWZ5JywgaGVscD12ZXJpZnkuX19kb2NfXykKICAgIHZlcmlmeV9wYXJzZXIuYWRkX2FyZ3VtZW50KCd3aGVlbGZpbGUnLCBoZWxwPSdXaGVlbCBmaWxlJykKICAgIHZlcmlmeV9wYXJzZXIuc2V0X2RlZmF1bHRzKGZ1bmM9dmVyaWZ5X2YpCgogICAgZGVmIHVucGFja19mKGFyZ3MpOgogICAgICAgIHVucGFjayhhcmdzLndoZWVsZmlsZSwgYXJncy5kZXN0KQogICAgdW5wYWNrX3BhcnNlciA9IHMuYWRkX3BhcnNlcigndW5wYWNrJywgaGVscD0nVW5wYWNrIHdoZWVsJykKICAgIHVucGFja19wYXJzZXIuYWRkX2FyZ3VtZW50KCctLWRlc3QnLCAnLWQnLCBoZWxwPSdEZXN0aW5hdGlvbiBkaXJlY3RvcnknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0nLicpCiAgICB1bnBhY2tfcGFyc2VyLmFkZF9hcmd1bWVudCgnd2hlZWxmaWxlJywgaGVscD0nV2hlZWwgZmlsZScpCiAgICB1bnBhY2tfcGFyc2VyLnNldF9kZWZhdWx0cyhmdW5jPXVucGFja19mKQoKICAgIGRlZiBpbnN0YWxsX2YoYXJncyk6CiAgICAgICAgaW5zdGFsbChhcmdzLnJlcXVpcmVtZW50cywgYXJncy5yZXF1aXJlbWVudHNfZmlsZSwKICAgICAgICAgICAgICAgIGFyZ3Mud2hlZWxfZGlycywgYXJncy5mb3JjZSwgYXJncy5saXN0X2ZpbGVzKQogICAgaW5zdGFsbF9wYXJzZXIgPSBzLmFkZF9wYXJzZXIoJ2luc3RhbGwnLCBoZWxwPSdJbnN0YWxsIHdoZWVscycpCiAgICBpbnN0YWxsX3BhcnNlci5hZGRfYXJndW1lbnQoJ3JlcXVpcmVtZW50cycsIG5hcmdzPScqJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdSZXF1aXJlbWVudHMgdG8gaW5zdGFsbC4nKQogICAgaW5zdGFsbF9wYXJzZXIuYWRkX2FyZ3VtZW50KCctLWZvcmNlJywgZGVmYXVsdD1GYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb249J3N0b3JlX3RydWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J0luc3RhbGwgaW5jb21wYXRpYmxlIHdoZWVsIGZpbGVzLicpCiAgICBpbnN0YWxsX3BhcnNlci5hZGRfYXJndW1lbnQoJy0td2hlZWwtZGlyJywgJy1kJywgYWN0aW9uPSdhcHBlbmQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9J3doZWVsX2RpcnMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J0RpcmVjdG9yaWVzIGNvbnRhaW5pbmcgd2hlZWxzLicpCiAgICBpbnN0YWxsX3BhcnNlci5hZGRfYXJndW1lbnQoJy0tcmVxdWlyZW1lbnRzLWZpbGUnLCAnLXInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IkEgZmlsZSBjb250YWluaW5nIHJlcXVpcmVtZW50cyB0byAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluc3RhbGwuIikKICAgIGluc3RhbGxfcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1saXN0JywgJy1sJywgZGVmYXVsdD1GYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0PSdsaXN0X2ZpbGVzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb249J3N0b3JlX3RydWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9Ikxpc3Qgd2hlZWxzIHdoaWNoIHdvdWxkIGJlIGluc3RhbGxlZCwgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJidXQgZG9uJ3QgYWN0dWFsbHkgaW5zdGFsbCBhbnl0aGluZy4iKQogICAgaW5zdGFsbF9wYXJzZXIuc2V0X2RlZmF1bHRzKGZ1bmM9aW5zdGFsbF9mKQoKICAgIGRlZiBpbnN0YWxsX3NjcmlwdHNfZihhcmdzKToKICAgICAgICBpbnN0YWxsX3NjcmlwdHMoYXJncy5kaXN0cmlidXRpb25zKQogICAgaW5zdGFsbF9zY3JpcHRzX3BhcnNlciA9IHMuYWRkX3BhcnNlcignaW5zdGFsbC1zY3JpcHRzJywgaGVscD0nSW5zdGFsbCBjb25zb2xlX3NjcmlwdHMnKQogICAgaW5zdGFsbF9zY3JpcHRzX3BhcnNlci5hZGRfYXJndW1lbnQoJ2Rpc3RyaWJ1dGlvbnMnLCBuYXJncz0nKicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdSZWdlbmVyYXRlIGNvbnNvbGVfc2NyaXB0cyBmb3IgdGhlc2UgZGlzdHJpYnV0aW9ucycpCiAgICBpbnN0YWxsX3NjcmlwdHNfcGFyc2VyLnNldF9kZWZhdWx0cyhmdW5jPWluc3RhbGxfc2NyaXB0c19mKQoKICAgIGRlZiBjb252ZXJ0X2YoYXJncyk6CiAgICAgICAgY29udmVydChhcmdzLmluc3RhbGxlcnMsIGFyZ3MuZGVzdF9kaXIsIGFyZ3MudmVyYm9zZSkKICAgIGNvbnZlcnRfcGFyc2VyID0gcy5hZGRfcGFyc2VyKCdjb252ZXJ0JywgaGVscD0nQ29udmVydCBlZ2cgb3Igd2luaW5zdCB0byB3aGVlbCcpCiAgICBjb252ZXJ0X3BhcnNlci5hZGRfYXJndW1lbnQoJ2luc3RhbGxlcnMnLCBuYXJncz0nKicsIGhlbHA9J0luc3RhbGxlcnMgdG8gY29udmVydCcpCiAgICBjb252ZXJ0X3BhcnNlci5hZGRfYXJndW1lbnQoJy0tZGVzdC1kaXInLCAnLWQnLCBkZWZhdWx0PW9zLnBhdGguY3VyZGlyLAogICAgICAgICAgICBoZWxwPSJEaXJlY3RvcnkgdG8gc3RvcmUgd2hlZWxzIChkZWZhdWx0ICUoZGVmYXVsdClzKSIpCiAgICBjb252ZXJ0X3BhcnNlci5hZGRfYXJndW1lbnQoJy0tdmVyYm9zZScsICctdicsIGFjdGlvbj0nc3RvcmVfdHJ1ZScpCiAgICBjb252ZXJ0X3BhcnNlci5zZXRfZGVmYXVsdHMoZnVuYz1jb252ZXJ0X2YpCgogICAgZGVmIHZlcnNpb25fZihhcmdzKToKICAgICAgICBmcm9tIC4uIGltcG9ydCBfX3ZlcnNpb25fXwogICAgICAgIHN5cy5zdGRvdXQud3JpdGUoIndoZWVsICVzXG4iICUgX192ZXJzaW9uX18pCiAgICB2ZXJzaW9uX3BhcnNlciA9IHMuYWRkX3BhcnNlcigndmVyc2lvbicsIGhlbHA9J1ByaW50IHZlcnNpb24gYW5kIGV4aXQnKQogICAgdmVyc2lvbl9wYXJzZXIuc2V0X2RlZmF1bHRzKGZ1bmM9dmVyc2lvbl9mKQoKICAgIGRlZiBoZWxwX2YoYXJncyk6CiAgICAgICAgcC5wcmludF9oZWxwKCkKICAgIGhlbHBfcGFyc2VyID0gcy5hZGRfcGFyc2VyKCdoZWxwJywgaGVscD0nU2hvdyB0aGlzIGhlbHAnKQogICAgaGVscF9wYXJzZXIuc2V0X2RlZmF1bHRzKGZ1bmM9aGVscF9mKQoKICAgIHJldHVybiBwCgpkZWYgbWFpbigpOgogICAgcCA9IHBhcnNlcigpCiAgICBhcmdzID0gcC5wYXJzZV9hcmdzKCkKICAgIGlmIG5vdCBoYXNhdHRyKGFyZ3MsICdmdW5jJyk6CiAgICAgICAgcC5wcmludF9oZWxwKCkKICAgIGVsc2U6CiAgICAgICAgIyBYWFggb24gUHl0aG9uIDMuMyB3ZSBnZXQgJ2FyZ3MgaGFzIG5vIGZ1bmMnIHJhdGhlciB0aGFuIHNob3J0IGhlbHAuCiAgICAgICAgdHJ5OgogICAgICAgICAgICBhcmdzLmZ1bmMoYXJncykKICAgICAgICAgICAgcmV0dXJuIDAKICAgICAgICBleGNlcHQgV2hlZWxFcnJvciBhcyBlOgogICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKGUubWVzc2FnZSArICJcbiIpCiAgICByZXR1cm4gMQpQSwMEFAAAAAAAAAAhAM/YM7IaEwAAGhMAAC8AAABwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdXRpbC5weSIiIlV0aWxpdHkgZnVuY3Rpb25zLiIiIgoKaW1wb3J0IHN5cwppbXBvcnQgb3MKaW1wb3J0IGJhc2U2NAppbXBvcnQganNvbgppbXBvcnQgaGFzaGxpYgp0cnk6CiAgICBmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBPcmRlcmVkRGljdApleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBPcmRlcmVkRGljdCA9IGRpY3QKCl9fYWxsX18gPSBbJ3VybHNhZmVfYjY0ZW5jb2RlJywgJ3VybHNhZmVfYjY0ZGVjb2RlJywgJ3V0ZjgnLAogICAgICAgICAgICd0b19qc29uJywgJ2Zyb21fanNvbicsICdtYXRjaGVzX3JlcXVpcmVtZW50J10KCmRlZiB1cmxzYWZlX2I2NGVuY29kZShkYXRhKToKICAgICIiInVybHNhZmVfYjY0ZW5jb2RlIHdpdGhvdXQgcGFkZGluZyIiIgogICAgcmV0dXJuIGJhc2U2NC51cmxzYWZlX2I2NGVuY29kZShkYXRhKS5yc3RyaXAoYmluYXJ5KCc9JykpCgoKZGVmIHVybHNhZmVfYjY0ZGVjb2RlKGRhdGEpOgogICAgIiIidXJsc2FmZV9iNjRkZWNvZGUgd2l0aG91dCBwYWRkaW5nIiIiCiAgICBwYWQgPSBiJz0nICogKDQgLSAobGVuKGRhdGEpICYgMykpCiAgICByZXR1cm4gYmFzZTY0LnVybHNhZmVfYjY0ZGVjb2RlKGRhdGEgKyBwYWQpCgoKZGVmIHRvX2pzb24obyk6CiAgICAnJydDb252ZXJ0IGdpdmVuIGRhdGEgdG8gSlNPTi4nJycKICAgIHJldHVybiBqc29uLmR1bXBzKG8sIHNvcnRfa2V5cz1UcnVlKQoKCmRlZiBmcm9tX2pzb24oaik6CiAgICAnJydEZWNvZGUgYSBKU09OIHBheWxvYWQuJycnCiAgICByZXR1cm4ganNvbi5sb2FkcyhqKQoKZGVmIG9wZW5fZm9yX2NzdihuYW1lLCBtb2RlKToKICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPCAzOgogICAgICAgIG5sID0ge30KICAgICAgICBiaW4gPSAnYicKICAgIGVsc2U6CiAgICAgICAgbmwgPSB7ICduZXdsaW5lJzogJycgfQogICAgICAgIGJpbiA9ICcnCiAgICByZXR1cm4gb3BlbihuYW1lLCBtb2RlICsgYmluLCAqKm5sKQoKdHJ5OgogICAgdW5pY29kZQoKICAgIGRlZiB1dGY4KGRhdGEpOgogICAgICAgICcnJ1V0Zi04IGVuY29kZSBkYXRhLicnJwogICAgICAgIGlmIGlzaW5zdGFuY2UoZGF0YSwgdW5pY29kZSk6CiAgICAgICAgICAgIHJldHVybiBkYXRhLmVuY29kZSgndXRmLTgnKQogICAgICAgIHJldHVybiBkYXRhCmV4Y2VwdCBOYW1lRXJyb3I6CiAgICBkZWYgdXRmOChkYXRhKToKICAgICAgICAnJydVdGYtOCBlbmNvZGUgZGF0YS4nJycKICAgICAgICBpZiBpc2luc3RhbmNlKGRhdGEsIHN0cik6CiAgICAgICAgICAgIHJldHVybiBkYXRhLmVuY29kZSgndXRmLTgnKQogICAgICAgIHJldHVybiBkYXRhCgoKdHJ5OgogICAgIyBGb3IgZW5jb2RpbmcgYXNjaWkgYmFjayBhbmQgZm9ydGggYmV0d2VlbiBieXRlc3RyaW5ncywgYXMgaXMgcmVwZWF0ZWRseQogICAgIyBuZWNlc3NhcnkgaW4gSlNPTi1iYXNlZCBjcnlwdG8gdW5kZXIgUHl0aG9uIDMKICAgIHVuaWNvZGUKICAgIGRlZiBuYXRpdmUocyk6CiAgICAgICAgcmV0dXJuIHMKICAgIGRlZiBiaW5hcnkocyk6CiAgICAgICAgaWYgaXNpbnN0YW5jZShzLCB1bmljb2RlKToKICAgICAgICAgICAgcmV0dXJuIHMuZW5jb2RlKCdhc2NpaScpCiAgICAgICAgcmV0dXJuIHMKZXhjZXB0IE5hbWVFcnJvcjoKICAgIGRlZiBuYXRpdmUocyk6CiAgICAgICAgaWYgaXNpbnN0YW5jZShzLCBieXRlcyk6CiAgICAgICAgICAgIHJldHVybiBzLmRlY29kZSgnYXNjaWknKQogICAgICAgIHJldHVybiBzCiAgICBkZWYgYmluYXJ5KHMpOgogICAgICAgIGlmIGlzaW5zdGFuY2Uocywgc3RyKToKICAgICAgICAgICAgcmV0dXJuIHMuZW5jb2RlKCdhc2NpaScpCgpjbGFzcyBIYXNoaW5nRmlsZShvYmplY3QpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGZkLCBoYXNodHlwZT0nc2hhMjU2Jyk6CiAgICAgICAgc2VsZi5mZCA9IGZkCiAgICAgICAgc2VsZi5oYXNodHlwZSA9IGhhc2h0eXBlCiAgICAgICAgc2VsZi5oYXNoID0gaGFzaGxpYi5uZXcoaGFzaHR5cGUpCiAgICAgICAgc2VsZi5sZW5ndGggPSAwCiAgICBkZWYgd3JpdGUoc2VsZiwgZGF0YSk6CiAgICAgICAgc2VsZi5oYXNoLnVwZGF0ZShkYXRhKQogICAgICAgIHNlbGYubGVuZ3RoICs9IGxlbihkYXRhKQogICAgICAgIHNlbGYuZmQud3JpdGUoZGF0YSkKICAgIGRlZiBjbG9zZShzZWxmKToKICAgICAgICBzZWxmLmZkLmNsb3NlKCkKICAgIGRlZiBkaWdlc3Qoc2VsZik6CiAgICAgICAgaWYgc2VsZi5oYXNodHlwZSA9PSAnbWQ1JzoKICAgICAgICAgICAgcmV0dXJuIHNlbGYuaGFzaC5oZXhkaWdlc3QoKQogICAgICAgIGRpZ2VzdCA9IHNlbGYuaGFzaC5kaWdlc3QoKQogICAgICAgIHJldHVybiBzZWxmLmhhc2h0eXBlICsgJz0nICsgbmF0aXZlKHVybHNhZmVfYjY0ZW5jb2RlKGRpZ2VzdCkpCgpjbGFzcyBPcmRlcmVkRGVmYXVsdERpY3QoT3JkZXJlZERpY3QpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgaWYgbm90IGFyZ3M6CiAgICAgICAgICAgIHNlbGYuZGVmYXVsdF9mYWN0b3J5ID0gTm9uZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlmIG5vdCAoYXJnc1swXSBpcyBOb25lIG9yIGNhbGxhYmxlKGFyZ3NbMF0pKToKICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBjYWxsYWJsZSBvciBOb25lJykKICAgICAgICAgICAgc2VsZi5kZWZhdWx0X2ZhY3RvcnkgPSBhcmdzWzBdCiAgICAgICAgICAgIGFyZ3MgPSBhcmdzWzE6XQogICAgICAgIHN1cGVyKE9yZGVyZWREZWZhdWx0RGljdCwgc2VsZikuX19pbml0X18oKmFyZ3MsICoqa3dhcmdzKQoKICAgIGRlZiBfX21pc3NpbmdfXyAoc2VsZiwga2V5KToKICAgICAgICBpZiBzZWxmLmRlZmF1bHRfZmFjdG9yeSBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBLZXlFcnJvcihrZXkpCiAgICAgICAgc2VsZltrZXldID0gZGVmYXVsdCA9IHNlbGYuZGVmYXVsdF9mYWN0b3J5KCkKICAgICAgICByZXR1cm4gZGVmYXVsdAoKaWYgc3lzLnBsYXRmb3JtID09ICd3aW4zMic6CiAgICBpbXBvcnQgY3R5cGVzLndpbnR5cGVzCiAgICAjIENTSURMX0FQUERBVEEgZm9yIHJlZmVyZW5jZSAtIG5vdCB1c2VkIGhlcmUgZm9yIGNvbXBhdGliaWxpdHkgd2l0aAogICAgIyBkaXJzcGVjLCB3aGljaCB1c2VzIExPQ0FMX0FQUERBVEEgYW5kIENPTU1PTl9BUFBEQVRBIGluIHRoYXQgb3JkZXIKICAgIGNzaWRsID0gZGljdChDU0lETF9BUFBEQVRBPTI2LCBDU0lETF9MT0NBTF9BUFBEQVRBPTI4LAogICAgICAgICAgICBDU0lETF9DT01NT05fQVBQREFUQT0zNSkKICAgIGRlZiBnZXRfcGF0aChuYW1lKToKICAgICAgICBTSEdGUF9UWVBFX0NVUlJFTlQgPSAwCiAgICAgICAgYnVmID0gY3R5cGVzLmNyZWF0ZV91bmljb2RlX2J1ZmZlcihjdHlwZXMud2ludHlwZXMuTUFYX1BBVEgpCiAgICAgICAgY3R5cGVzLndpbmRsbC5zaGVsbDMyLlNIR2V0Rm9sZGVyUGF0aFcoMCwgY3NpZGxbbmFtZV0sIDAsIFNIR0ZQX1RZUEVfQ1VSUkVOVCwgYnVmKQogICAgICAgIHJldHVybiBidWYudmFsdWUKCiAgICBkZWYgc2F2ZV9jb25maWdfcGF0aCgqcmVzb3VyY2UpOgogICAgICAgIGFwcGRhdGEgPSBnZXRfcGF0aCgiQ1NJRExfTE9DQUxfQVBQREFUQSIpCiAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihhcHBkYXRhLCAqcmVzb3VyY2UpCiAgICAgICAgaWYgbm90IG9zLnBhdGguaXNkaXIocGF0aCk6CiAgICAgICAgICAgIG9zLm1ha2VkaXJzKHBhdGgpCiAgICAgICAgcmV0dXJuIHBhdGgKICAgIGRlZiBsb2FkX2NvbmZpZ19wYXRocygqcmVzb3VyY2UpOgogICAgICAgIGlkcyA9IFsiQ1NJRExfTE9DQUxfQVBQREFUQSIsICJDU0lETF9DT01NT05fQVBQREFUQSJdCiAgICAgICAgZm9yIGlkIGluIGlkczoKICAgICAgICAgICAgYmFzZSA9IGdldF9wYXRoKGlkKQogICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKGJhc2UsICpyZXNvdXJjZSkKICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMocGF0aCk6CiAgICAgICAgICAgICAgICB5aWVsZCBwYXRoCmVsc2U6CiAgICBkZWYgc2F2ZV9jb25maWdfcGF0aCgqcmVzb3VyY2UpOgogICAgICAgIGltcG9ydCB4ZGcuQmFzZURpcmVjdG9yeQogICAgICAgIHJldHVybiB4ZGcuQmFzZURpcmVjdG9yeS5zYXZlX2NvbmZpZ19wYXRoKCpyZXNvdXJjZSkKICAgIGRlZiBsb2FkX2NvbmZpZ19wYXRocygqcmVzb3VyY2UpOgogICAgICAgIGltcG9ydCB4ZGcuQmFzZURpcmVjdG9yeQogICAgICAgIHJldHVybiB4ZGcuQmFzZURpcmVjdG9yeS5sb2FkX2NvbmZpZ19wYXRocygqcmVzb3VyY2UpCgpkZWYgbWF0Y2hlc19yZXF1aXJlbWVudChyZXEsIHdoZWVscyk6CiAgICAiIiJMaXN0IG9mIHdoZWVscyBtYXRjaGluZyBhIHJlcXVpcmVtZW50LgoKICAgIDpwYXJhbSByZXE6IFRoZSByZXF1aXJlbWVudCB0byBzYXRpc2Z5CiAgICA6cGFyYW0gd2hlZWxzOiBMaXN0IG9mIHdoZWVscyB0byBzZWFyY2guCiAgICAiIiIKICAgIHRyeToKICAgICAgICBmcm9tIHBrZ19yZXNvdXJjZXMgaW1wb3J0IERpc3RyaWJ1dGlvbiwgUmVxdWlyZW1lbnQKICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoIkNhbm5vdCB1c2UgcmVxdWlyZW1lbnRzIHdpdGhvdXQgcGtnX3Jlc291cmNlcyIpCgogICAgcmVxID0gUmVxdWlyZW1lbnQucGFyc2UocmVxKQoKICAgIHNlbGVjdGVkID0gW10KICAgIGZvciB3ZiBpbiB3aGVlbHM6CiAgICAgICAgZiA9IHdmLnBhcnNlZF9maWxlbmFtZQogICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24ocHJvamVjdF9uYW1lPWYuZ3JvdXAoIm5hbWUiKSwgdmVyc2lvbj1mLmdyb3VwKCJ2ZXIiKSkKICAgICAgICBpZiBkaXN0IGluIHJlcToKICAgICAgICAgICAgc2VsZWN0ZWQuYXBwZW5kKHdmKQogICAgcmV0dXJuIHNlbGVjdGVkClBLAwQUAAAAAAAAACEA87TkKLceAAC3HgAAOAAAAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC93aW5pbnN0MndoZWVsLnB5IyEvdXNyL2Jpbi9lbnYgcHl0aG9uCmltcG9ydCBvcy5wYXRoCmltcG9ydCByZQppbXBvcnQgc3lzCmltcG9ydCB0ZW1wZmlsZQppbXBvcnQgemlwZmlsZQppbXBvcnQgd2hlZWwuYmRpc3Rfd2hlZWwKaW1wb3J0IGRpc3R1dGlscy5kaXN0CmZyb20gZGlzdHV0aWxzLmFyY2hpdmVfdXRpbCBpbXBvcnQgbWFrZV9hcmNoaXZlCmZyb20gc2h1dGlsIGltcG9ydCBybXRyZWUKZnJvbSB3aGVlbC5hcmNoaXZlIGltcG9ydCBhcmNoaXZlX3doZWVsZmlsZQpmcm9tIGFyZ3BhcnNlIGltcG9ydCBBcmd1bWVudFBhcnNlcgpmcm9tIGdsb2IgaW1wb3J0IGlnbG9iCgplZ2dfaW5mb19yZSA9IHJlLmNvbXBpbGUocicnJyhefC8pKD9QPG5hbWU+W14vXSs/KS0oP1A8dmVyPi4rPykKICAgICgtKD9QPHB5dmVyPi4rPykpPygtKD9QPGFyY2g+Lis/KSk/LmVnZy1pbmZvKC98JCknJycsIHJlLlZFUkJPU0UpCgpkZWYgcGFyc2VfaW5mbyh3aW5pbmZvX25hbWUsIGVnZ2luZm9fbmFtZSk6CiAgICAiIiJFeHRyYWN0IG1ldGFkYXRhIGZyb20gZmlsZW5hbWVzLgogICAgCiAgICBFeHRyYWN0cyB0aGUgNCBtZXRhZGF0YWl0ZW1zIG5lZWRlZCAobmFtZSwgdmVyc2lvbiwgcHl2ZXJzaW9uLCBhcmNoKSBmcm9tCiAgICB0aGUgaW5zdGFsbGVyIGZpbGVuYW1lIGFuZCB0aGUgbmFtZSBvZiB0aGUgZWdnLWluZm8gZGlyZWN0b3J5IGVtYmVkZGVkIGluCiAgICB0aGUgemlwZmlsZSAoaWYgYW55KS4KCiAgICBUaGUgZWdnaW5mbyBmaWxlbmFtZSBoYXMgdGhlIGZvcm1hdDo6CgogICAgICAgIG5hbWUtdmVyKC1weXZlcikoLWFyY2gpLmVnZy1pbmZvCgogICAgVGhlIGluc3RhbGxlciBmaWxlbmFtZSBoYXMgdGhlIGZvcm1hdDo6CgogICAgICAgIG5hbWUtdmVyLmFyY2goLXB5dmVyKS5leGUKCiAgICBTb21lIHRoaW5ncyB0byBub3RlOgoKICAgIDEuIFRoZSBpbnN0YWxsZXIgZmlsZW5hbWUgaXMgbm90IGRlZmluaXRpdmUuIEFuIGluc3RhbGxlciBjYW4gYmUgcmVuYW1lZAogICAgICAgYW5kIHdvcmsgcGVyZmVjdGx5IHdlbGwgYXMgYW4gaW5zdGFsbGVyLiBTbyBtb3JlIHJlbGlhYmxlIGRhdGEgc2hvdWxkCiAgICAgICBiZSB1c2VkIHdoZW5ldmVyIHBvc3NpYmxlLgogICAgMi4gVGhlIGVnZy1pbmZvIGRhdGEgc2hvdWxkIGJlIHByZWZlcnJlZCBmb3IgdGhlIG5hbWUgYW5kIHZlcnNpb24sIGJlY2F1c2UKICAgICAgIHRoZXNlIGNvbWUgc3RyYWlnaHQgZnJvbSB0aGUgZGlzdHV0aWxzIG1ldGFkYXRhLCBhbmQgYXJlIG1hbmRhdG9yeS4KICAgIDMuIFRoZSBweXZlciBmcm9tIHRoZSBlZ2ctaW5mbyBkYXRhIHNob3VsZCBiZSBpZ25vcmVkLCBhcyBpdCBpcwogICAgICAgY29uc3RydWN0ZWQgZnJvbSB0aGUgdmVyc2lvbiBvZiBQeXRob24gdXNlZCB0byBidWlsZCB0aGUgaW5zdGFsbGVyLAogICAgICAgd2hpY2ggaXMgaXJyZWxldmFudCAtIHRoZSBpbnN0YWxsZXIgZmlsZW5hbWUgaXMgY29ycmVjdCBoZXJlIChldmVuIHRvCiAgICAgICB0aGUgcG9pbnQgdGhhdCB3aGVuIGl0J3Mgbm90IHRoZXJlLCBhbnkgdmVyc2lvbiBpcyBpbXBsaWVkKS4KICAgIDQuIFRoZSBhcmNoaXRlY3R1cmUgbXVzdCBiZSB0YWtlbiBmcm9tIHRoZSBpbnN0YWxsZXIgZmlsZW5hbWUsIGFzIGl0IGlzCiAgICAgICBub3QgaW5jbHVkZWQgaW4gdGhlIGVnZy1pbmZvIGRhdGEuCiAgICA1LiBBcmNoaXRlY3R1cmUtbmV1dHJhbCBpbnN0YWxsZXJzIHN0aWxsIGhhdmUgYW4gYXJjaGl0ZWN0dXJlIGJlY2F1c2UgdGhlCiAgICAgICBpbnN0YWxsZXIgZm9ybWF0IGl0c2VsZiAoYmVpbmcgZXhlY3V0YWJsZSkgaXMgYXJjaGl0ZWN0dXJlLXNwZWNpZmljLiBXZQogICAgICAgc2hvdWxkIHRoZXJlZm9yZSBpZ25vcmUgdGhlIGFyY2hpdGVjdHVyZSBpZiB0aGUgY29udGVudCBpcyBwdXJlLXB5dGhvbi4KICAgICIiIgoKICAgIGVnZ2luZm8gPSBOb25lCiAgICBpZiBlZ2dpbmZvX25hbWU6CiAgICAgICAgZWdnaW5mbyA9IGVnZ19pbmZvX3JlLnNlYXJjaChlZ2dpbmZvX25hbWUpCiAgICAgICAgaWYgbm90IGVnZ2luZm86CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkVnZyBpbmZvIGZpbGVuYW1lICVzIGlzIG5vdCB2YWxpZCIgJQogICAgICAgICAgICAgICAgICAgIChlZ2dpbmZvX25hbWUsKSkKCiAgICAjIFBhcnNlIHRoZSB3aW5pbnN0IGZpbGVuYW1lCiAgICAjIDEuIERpc3RyaWJ1dGlvbiBuYW1lICh1cCB0byB0aGUgZmlyc3QgJy0nKQogICAgd19uYW1lLCBzZXAsIHJlc3QgPSB3aW5pbmZvX25hbWUucGFydGl0aW9uKCctJykKICAgIGlmIG5vdCBzZXA6CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiSW5zdGFsbGVyIGZpbGVuYW1lICVzIGlzIG5vdCB2YWxpZCIgJQogICAgICAgICAgICAgICAgKHdpbmluZm9fbmFtZSwpKQogICAgIyBTdHJpcCAnLmV4ZScKICAgIHJlc3QgPSByZXN0WzotNF0KICAgICMgMi4gUHl0aG9uIHZlcnNpb24gKGZyb20gdGhlIGxhc3QgJy0nLCBtdXN0IHN0YXJ0IHdpdGggJ3B5JykKICAgIHJlc3QyLCBzZXAsIHdfcHl2ZXIgPSByZXN0LnJwYXJ0aXRpb24oJy0nKQogICAgaWYgc2VwIGFuZCB3X3B5dmVyLnN0YXJ0c3dpdGgoJ3B5Jyk6CiAgICAgICAgcmVzdCA9IHJlc3QyCiAgICAgICAgd19weXZlciA9IHdfcHl2ZXIucmVwbGFjZSgnLicsICcnKQogICAgZWxzZToKICAgICAgICAjIE5vdCB2ZXJzaW9uIHNwZWNpZmljIC0gdXNlIHB5Mi5weTMuIFdoaWxlIGl0IGlzIHBvc3NpYmxlIHRoYXQKICAgICAgICAjIHB1cmUtUHl0aG9uIGNvZGUgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBib3RoIFB5dGhvbiAyIGFuZCAzLCB0aGVyZQogICAgICAgICMgaXMgbm8gd2F5IG9mIGtub3dpbmcgZnJvbSB0aGUgd2luaW5zdCBmb3JtYXQsIHNvIHdlIGFzc3VtZSB0aGUgYmVzdAogICAgICAgICMgaGVyZSAodGhlIHVzZXIgY2FuIGFsd2F5cyBtYW51YWxseSByZW5hbWUgdGhlIHdoZWVsIHRvIGJlIG1vcmUKICAgICAgICAjIHJlc3RyaWN0aXZlIGlmIG5lZWRlZCkuCiAgICAgICAgd19weXZlciA9ICdweTIucHkzJwogICAgIyAzLiBWZXJzaW9uIGFuZCBhcmNoaXRlY3R1cmUKICAgIHdfdmVyLCBzZXAsIHdfYXJjaCA9IHJlc3QucnBhcnRpdGlvbignLicpCiAgICBpZiBub3Qgc2VwOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkluc3RhbGxlciBmaWxlbmFtZSAlcyBpcyBub3QgdmFsaWQiICUKICAgICAgICAgICAgICAgICh3aW5pbmZvX25hbWUsKSkKCiAgICBpZiBlZ2dpbmZvOgogICAgICAgIHdfbmFtZSA9IGVnZ2luZm8uZ3JvdXAoJ25hbWUnKQogICAgICAgIHdfdmVyID0gZWdnaW5mby5ncm91cCgndmVyJykKCiAgICByZXR1cm4gZGljdChuYW1lPXdfbmFtZSwgdmVyPXdfdmVyLCBhcmNoPXdfYXJjaCwgcHl2ZXI9d19weXZlcikKCmRlZiBiZGlzdF93aW5pbnN0MndoZWVsKHBhdGgsIGRlc3RfZGlyPW9zLnBhdGguY3VyZGlyKToKICAgIGJkdyA9IHppcGZpbGUuWmlwRmlsZShwYXRoKQoKICAgICMgU2VhcmNoIGZvciBlZ2ctaW5mbyBpbiB0aGUgYXJjaGl2ZQogICAgZWdnaW5mb19uYW1lID0gTm9uZQogICAgZm9yIGZpbGVuYW1lIGluIGJkdy5uYW1lbGlzdCgpOgogICAgICAgIGlmICcuZWdnLWluZm8nIGluIGZpbGVuYW1lOgogICAgICAgICAgICBlZ2dpbmZvX25hbWUgPSBmaWxlbmFtZQogICAgICAgICAgICBicmVhawoKICAgIGluZm8gPSBwYXJzZV9pbmZvKG9zLnBhdGguYmFzZW5hbWUocGF0aCksIGVnZ2luZm9fbmFtZSkKCiAgICByb290X2lzX3B1cmVsaWIgPSBUcnVlCiAgICBmb3IgemlwaW5mbyBpbiBiZHcuaW5mb2xpc3QoKToKICAgICAgICBpZiB6aXBpbmZvLmZpbGVuYW1lLnN0YXJ0c3dpdGgoJ1BMQVRMSUInKToKICAgICAgICAgICAgcm9vdF9pc19wdXJlbGliID0gRmFsc2UKICAgICAgICAgICAgYnJlYWsKICAgIGlmIHJvb3RfaXNfcHVyZWxpYjoKICAgICAgICBwYXRocyA9IHsncHVyZWxpYic6ICcnfQogICAgZWxzZToKICAgICAgICBwYXRocyA9IHsncGxhdGxpYic6ICcnfQoKICAgIGRpc3RfaW5mbyA9ICIlKG5hbWUpcy0lKHZlcilzIiAlIGluZm8KICAgIGRhdGFkaXIgPSAiJXMuZGF0YS8iICUgZGlzdF9pbmZvCgogICAgIyByZXdyaXRlIHBhdGhzIHRvIHRyaWNrIFppcEZpbGUgaW50byBleHRyYWN0aW5nIGFuIGVnZwogICAgIyBYWFggZ3JhYiB3aW5pbnN0IC5pbmkgLSBiZXR3ZWVuIC5leGUsIHBhZGRpbmcsIGFuZCBmaXJzdCB6aXAgZmlsZS4KICAgIG1lbWJlcnMgPSBbXQogICAgZWdnaW5mb19uYW1lID0gJycKICAgIGZvciB6aXBpbmZvIGluIGJkdy5pbmZvbGlzdCgpOgogICAgICAgIGtleSwgYmFzZW5hbWUgPSB6aXBpbmZvLmZpbGVuYW1lLnNwbGl0KCcvJywgMSkKICAgICAgICBrZXkgPSBrZXkubG93ZXIoKQogICAgICAgIGJhc2VwYXRoID0gcGF0aHMuZ2V0KGtleSwgTm9uZSkKICAgICAgICBpZiBiYXNlcGF0aCBpcyBOb25lOgogICAgICAgICAgICBiYXNlcGF0aCA9IGRhdGFkaXIgKyBrZXkubG93ZXIoKSArICcvJwogICAgICAgIG9sZG5hbWUgPSB6aXBpbmZvLmZpbGVuYW1lCiAgICAgICAgbmV3bmFtZSA9IGJhc2VwYXRoICsgYmFzZW5hbWUKICAgICAgICB6aXBpbmZvLmZpbGVuYW1lID0gbmV3bmFtZQogICAgICAgIGRlbCBiZHcuTmFtZVRvSW5mb1tvbGRuYW1lXQogICAgICAgIGJkdy5OYW1lVG9JbmZvW25ld25hbWVdID0gemlwaW5mbwogICAgICAgICMgQ29sbGVjdCBtZW1iZXIgbmFtZXMsIGJ1dCBvbWl0ICcnIChmcm9tIGFuIGVudHJ5IGxpa2UgIlBMQVRMSUIvIgogICAgICAgIGlmIG5ld25hbWU6CiAgICAgICAgICAgIG1lbWJlcnMuYXBwZW5kKG5ld25hbWUpCiAgICAgICAgIyBSZW1lbWJlciBlZ2ctaW5mbyBuYW1lIGZvciB0aGUgZWdnMmRpc3QgY2FsbCBiZWxvdwogICAgICAgIGlmIG5vdCBlZ2dpbmZvX25hbWU6CiAgICAgICAgICAgIGlmIG5ld25hbWUuZW5kc3dpdGgoJy5lZ2ctaW5mbycpOgogICAgICAgICAgICAgICAgZWdnaW5mb19uYW1lID0gbmV3bmFtZQogICAgICAgICAgICBlbGlmICcuZWdnLWluZm8vJyBpbiBuZXduYW1lOgogICAgICAgICAgICAgICAgZWdnaW5mb19uYW1lLCBzZXAsIF8gPSBuZXduYW1lLnJwYXJ0aXRpb24oJy8nKQogICAgZGlyID0gdGVtcGZpbGUubWtkdGVtcChzdWZmaXg9Il9iMnciKQogICAgYmR3LmV4dHJhY3RhbGwoZGlyLCBtZW1iZXJzKQoKICAgICMgZWdnMndoZWVsCiAgICBhYmkgPSAnbm9uZScKICAgIHB5dmVyID0gaW5mb1sncHl2ZXInXQogICAgYXJjaCA9IChpbmZvWydhcmNoJ10gb3IgJ2FueScpLnJlcGxhY2UoJy4nLCAnXycpLnJlcGxhY2UoJy0nLCAnXycpCiAgICAjIFdpbmluc3QgaW5zdGFsbGVycyBhbHdheXMgaGF2ZSBhcmNoIGV2ZW4gaWYgdGhleSBhcmUgbm90CiAgICAjIGFyY2hpdGVjdHVyZS1zcGVjaWZpYyAoYmVjYXVzZSB0aGUgZm9ybWF0IGl0c2VsZiBpcykuCiAgICAjIFNvLCBhc3N1bWUgdGhlIGNvbnRlbnQgaXMgYXJjaGl0ZWN0dXJlLW5ldXRyYWwgaWYgcm9vdCBpcyBwdXJlbGliLgogICAgaWYgcm9vdF9pc19wdXJlbGliOgogICAgICAgIGFyY2ggPSAnYW55JwogICAgIyBJZiB0aGUgaW5zdGFsbGVyIGlzIGFyY2hpdGVjdHVyZS1zcGVjaWZpYywgaXQncyBhbG1vc3QgY2VydGFpbmx5IGFsc28KICAgICMgQ1B5dGhvbi1zcGVjaWZpYy4KICAgIGlmIGFyY2ggIT0gJ2FueSc6CiAgICAgICAgcHl2ZXIgPSBweXZlci5yZXBsYWNlKCdweScsICdjcCcpCiAgICB3aGVlbF9uYW1lID0gJy0nLmpvaW4oKAogICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RfaW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICBweXZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICBhYmksCiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJjaAogICAgICAgICAgICAgICAgICAgICAgICAgICkpCiAgICBpZiByb290X2lzX3B1cmVsaWI6CiAgICAgICAgYncgPSB3aGVlbC5iZGlzdF93aGVlbC5iZGlzdF93aGVlbChkaXN0dXRpbHMuZGlzdC5EaXN0cmlidXRpb24oKSkKICAgIGVsc2U6CiAgICAgICAgYncgPSBfYmRpc3Rfd2hlZWxfdGFnKGRpc3R1dGlscy5kaXN0LkRpc3RyaWJ1dGlvbigpKQoKICAgIGJ3LnJvb3RfaXNfcHVyZSA9IHJvb3RfaXNfcHVyZWxpYgogICAgYncucHl0aG9uX3RhZyA9IHB5dmVyCiAgICBidy5wbGF0X25hbWVfc3VwcGxpZWQgPSBUcnVlCiAgICBidy5wbGF0X25hbWUgPSBpbmZvWydhcmNoJ10gb3IgJ2FueScKCiAgICBpZiBub3Qgcm9vdF9pc19wdXJlbGliOgogICAgICAgIGJ3LmZ1bGxfdGFnX3N1cHBsaWVkID0gVHJ1ZQogICAgICAgIGJ3LmZ1bGxfdGFnID0gKHB5dmVyLCBhYmksIGFyY2gpCgogICAgZGlzdF9pbmZvX2RpciA9IG9zLnBhdGguam9pbihkaXIsICclcy5kaXN0LWluZm8nICUgZGlzdF9pbmZvKQogICAgYncuZWdnMmRpc3Qob3MucGF0aC5qb2luKGRpciwgZWdnaW5mb19uYW1lKSwgZGlzdF9pbmZvX2RpcikKICAgIGJ3LndyaXRlX3doZWVsZmlsZShkaXN0X2luZm9fZGlyLCBnZW5lcmF0b3I9J3dpbmluc3Qyd2hlZWwnKQogICAgYncud3JpdGVfcmVjb3JkKGRpciwgZGlzdF9pbmZvX2RpcikKICAgIAogICAgYXJjaGl2ZV93aGVlbGZpbGUob3MucGF0aC5qb2luKGRlc3RfZGlyLCB3aGVlbF9uYW1lKSwgZGlyKQogICAgcm10cmVlKGRpcikKCgpjbGFzcyBfYmRpc3Rfd2hlZWxfdGFnKHdoZWVsLmJkaXN0X3doZWVsLmJkaXN0X3doZWVsKToKICAgICMgYWxsb3cgdGhlIGNsaWVudCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBnZW5lcmF0ZWQgd2hlZWwgdGFnCiAgICAjIFRoZSBkZWZhdWx0IGJkaXN0X3doZWVsIGltcGxlbWVudGF0aW9uIHVzZXMgcHl0aG9uIGFuZCBhYmkgdGFncwogICAgIyBvZiB0aGUgcnVubmluZyBweXRob24gcHJvY2Vzcy4gVGhpcyBpcyBub3Qgc3VpdGFibGUgZm9yCiAgICAjIGdlbmVyYXRpbmcvcmVwYWNrYWdpbmcgcHJlYnVpbGQgYmluYXJpZXMuCgogICAgZnVsbF90YWdfc3VwcGxpZWQgPSBGYWxzZQogICAgZnVsbF90YWcgPSBOb25lICAjIE5vbmUgb3IgYSAocHl0YWcsIHNvYWJpdGFnLCBwbGF0dGFnKSB0cmlwbGUKCiAgICBkZWYgZ2V0X3RhZyhzZWxmKToKICAgICAgICBpZiBzZWxmLmZ1bGxfdGFnX3N1cHBsaWVkIGFuZCBzZWxmLmZ1bGxfdGFnIGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4gc2VsZi5mdWxsX3RhZwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBzdXBlcihfYmRpc3Rfd2hlZWxfdGFnLCBzZWxmKS5nZXRfdGFnKCkKCgpkZWYgbWFpbigpOgogICAgcGFyc2VyID0gQXJndW1lbnRQYXJzZXIoKQogICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnaW5zdGFsbGVycycsIG5hcmdzPScqJywgaGVscD0iSW5zdGFsbGVycyB0byBjb252ZXJ0IikKICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tZGVzdC1kaXInLCAnLWQnLCBkZWZhdWx0PW9zLnBhdGguY3VyZGlyLAogICAgICAgICAgICBoZWxwPSJEaXJlY3RvcnkgdG8gc3RvcmUgd2hlZWxzIChkZWZhdWx0ICUoZGVmYXVsdClzKSIpCiAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXZlcmJvc2UnLCAnLXYnLCBhY3Rpb249J3N0b3JlX3RydWUnKQogICAgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKICAgIGZvciBwYXQgaW4gYXJncy5pbnN0YWxsZXJzOgogICAgICAgIGZvciBpbnN0YWxsZXIgaW4gaWdsb2IocGF0KToKICAgICAgICAgICAgaWYgYXJncy52ZXJib3NlOgogICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiezB9Li4uICIuZm9ybWF0KGluc3RhbGxlcikpCiAgICAgICAgICAgIGJkaXN0X3dpbmluc3Qyd2hlZWwoaW5zdGFsbGVyLCBhcmdzLmRlc3RfZGlyKQogICAgICAgICAgICBpZiBhcmdzLnZlcmJvc2U6CiAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCJPS1xuIikKCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICBtYWluKCkKUEsDBBQAAAAAAAAAIQAAAAAAAAAAAAAAAAAiAAAAcnVsZXNfcHl0aG9uL3BhY2thZ2luZy9fX2luaXRfXy5weVBLAwQUAAAAAAAAACEAWIASsz0yAAA9MgAAHgAAAHJ1bGVzX3B5dGhvbi9wYWNrYWdpbmcvcGlwdG9vbCMhL3Vzci9iaW4vZW52IHB5dGhvbgoKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgoKaW1wb3J0IG9zCmltcG9ydCByZQppbXBvcnQgdGVtcGZpbGUKaW1wb3J0IHNodXRpbAppbXBvcnQgc3lzCmltcG9ydCBzdWJwcm9jZXNzCmltcG9ydCB6aXBmaWxlCgojIFJldHVybiBUcnVlIGlmIHJ1bm5pbmcgb24gV2luZG93cwpkZWYgSXNXaW5kb3dzKCk6CiAgcmV0dXJuIG9zLm5hbWUgPT0gJ250JwoKZGVmIEdldFdpbmRvd3NQYXRoV2l0aFVOQ1ByZWZpeChwYXRoKToKICAiIiIKICBBZGRpbmcgVU5DIHByZWZpeCBhZnRlciBnZXR0aW5nIGEgbm9ybWFsaXplZCBhYnNvbHV0ZSBXaW5kb3dzIHBhdGgsCiAgaXQncyBuby1vcCBmb3Igbm9uLVdpbmRvd3MgcGxhdGZvcm1zIG9yIGlmIHJ1bm5pbmcgdW5kZXIgcHl0aG9uMi4KICAiIiIKICBwYXRoID0gcGF0aC5zdHJpcCgpCgogICMgTm8gbmVlZCB0byBhZGQgcHJlZml4IGZvciBub24tV2luZG93cyBwbGF0Zm9ybXMuCiAgIyBBbmQgXFw/XCBkb2Vzbid0IHdvcmsgaW4gcHl0aG9uIDIKICBpZiBub3QgSXNXaW5kb3dzKCkgb3Igc3lzLnZlcnNpb25faW5mb1swXSA8IDM6CiAgICByZXR1cm4gcGF0aAoKICAjIExldHMgc3RhcnQgdGhlIHVuaWNvZGUgZnVuCiAgdW5pY29kZV9wcmVmaXggPSAiXFxcXD9cXCIKICBpZiBwYXRoLnN0YXJ0c3dpdGgodW5pY29kZV9wcmVmaXgpOgogICAgcmV0dXJuIHBhdGgKCiAgIyBvcy5wYXRoLmFic3BhdGggcmV0dXJucyBhIG5vcm1hbGl6ZWQgYWJzb2x1dGUgcGF0aAogIHJldHVybiB1bmljb2RlX3ByZWZpeCArIG9zLnBhdGguYWJzcGF0aChwYXRoKQoKZGVmIEhhc1dpbmRvd3NFeGVjdXRhYmxlRXh0ZW5zaW9uKHBhdGgpOgogIHJldHVybiBwYXRoLmVuZHN3aXRoKCcuZXhlJykgb3IgcGF0aC5lbmRzd2l0aCgnLmNvbScpIG9yIHBhdGguZW5kc3dpdGgoJy5iYXQnKQoKUFlUSE9OX0JJTkFSWSA9ICdiYXplbF90b29scy90b29scy9weXRob24vcHkzd3JhcHBlci5zaCcKaWYgSXNXaW5kb3dzKCkgYW5kIG5vdCBIYXNXaW5kb3dzRXhlY3V0YWJsZUV4dGVuc2lvbihQWVRIT05fQklOQVJZKToKICBQWVRIT05fQklOQVJZID0gUFlUSE9OX0JJTkFSWSArICcuZXhlJwoKIyBGaW5kIGEgZmlsZSBpbiBhIGdpdmVuIHNlYXJjaCBwYXRoLgpkZWYgU2VhcmNoUGF0aChuYW1lKToKICBzZWFyY2hfcGF0aCA9IG9zLmdldGVudignUEFUSCcsIG9zLmRlZnBhdGgpLnNwbGl0KG9zLnBhdGhzZXApCiAgZm9yIGRpcmVjdG9yeSBpbiBzZWFyY2hfcGF0aDoKICAgIGlmIGRpcmVjdG9yeSA9PSAnJzogY29udGludWUKICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oZGlyZWN0b3J5LCBuYW1lKQogICAgaWYgb3MucGF0aC5pc2ZpbGUocGF0aCkgYW5kIG9zLmFjY2VzcyhwYXRoLCBvcy5YX09LKToKICAgICAgcmV0dXJuIHBhdGgKICByZXR1cm4gTm9uZQoKZGVmIElzUnVubmluZ0Zyb21aaXAoKToKICByZXR1cm4gRmFsc2UKCiMgRmluZCB0aGUgcmVhbCBQeXRob24gYmluYXJ5IGlmIGl0J3Mgbm90IGEgbm9ybWFsIGFic29sdXRlIHBhdGgKZGVmIEZpbmRQeXRob25CaW5hcnkobW9kdWxlX3NwYWNlKToKICBpZiBQWVRIT05fQklOQVJZLnN0YXJ0c3dpdGgoJy8vJyk6CiAgICAjIENhc2UgMTogUGF0aCBpcyBhIGxhYmVsLiBOb3Qgc3VwcG9ydGVkIHlldC4KICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKAogICAgICAnQmF6ZWwgZG9lcyBub3Qgc3VwcG9ydCBleGVjdXRpb24gb2YgUHl0aG9uIGludGVycHJldGVycyB2aWEgbGFiZWxzIHlldCcpCiAgZWxpZiBvcy5wYXRoLmlzYWJzKFBZVEhPTl9CSU5BUlkpOgogICAgIyBDYXNlIDI6IEFic29sdXRlIHBhdGguCiAgICByZXR1cm4gUFlUSE9OX0JJTkFSWQogICMgVXNlIG5vcm1wYXRoKCkgdG8gY29udmVydCBzbGFzaGVzIHRvIG9zLnNlcCBvbiBXaW5kb3dzLgogIGVsaWYgb3Muc2VwIGluIG9zLnBhdGgubm9ybXBhdGgoUFlUSE9OX0JJTkFSWSk6CiAgICAjIENhc2UgMzogUGF0aCBpcyByZWxhdGl2ZSB0byB0aGUgcmVwbyByb290LgogICAgcmV0dXJuIG9zLnBhdGguam9pbihtb2R1bGVfc3BhY2UsIFBZVEhPTl9CSU5BUlkpCiAgZWxzZToKICAgICMgQ2FzZSA0OiBQYXRoIGhhcyB0byBiZSBsb29rZWQgdXAgaW4gdGhlIHNlYXJjaCBwYXRoLgogICAgcmV0dXJuIFNlYXJjaFBhdGgoUFlUSE9OX0JJTkFSWSkKCmRlZiBDcmVhdGVQeXRob25QYXRoRW50cmllcyhweXRob25faW1wb3J0cywgbW9kdWxlX3NwYWNlKToKICBwYXJ0cyA9IHB5dGhvbl9pbXBvcnRzLnNwbGl0KCc6Jyk7CiAgcmV0dXJuIFttb2R1bGVfc3BhY2VdICsgWyIlcy8lcyIgJSAobW9kdWxlX3NwYWNlLCBwYXRoKSBmb3IgcGF0aCBpbiBwYXJ0c10KCiMgRmluZCB0aGUgcnVuZmlsZXMgdHJlZQpkZWYgRmluZE1vZHVsZVNwYWNlKCk6CiAgc3R1Yl9maWxlbmFtZSA9IHN5cy5hcmd2WzBdCiAgaWYgbm90IG9zLnBhdGguaXNhYnMoc3R1Yl9maWxlbmFtZSk6CiAgICBzdHViX2ZpbGVuYW1lID0gb3MucGF0aC5qb2luKG9zLmdldGN3ZCgpLCBzdHViX2ZpbGVuYW1lKQoKICB3aGlsZSBUcnVlOgogICAgbW9kdWxlX3NwYWNlID0gc3R1Yl9maWxlbmFtZSArICgnLmV4ZScgaWYgSXNXaW5kb3dzKCkgZWxzZSAnJykgKyAnLnJ1bmZpbGVzJwogICAgaWYgb3MucGF0aC5pc2Rpcihtb2R1bGVfc3BhY2UpOgogICAgICByZXR1cm4gbW9kdWxlX3NwYWNlCgogICAgcnVuZmlsZXNfcGF0dGVybiA9IHInKC4qXC5ydW5maWxlcyknICsgKHInXFwnIGlmIElzV2luZG93cygpIGVsc2UgJy8nKSArICcuKicKICAgIG1hdGNob2JqID0gcmUubWF0Y2gocnVuZmlsZXNfcGF0dGVybiwgc3R1Yl9maWxlbmFtZSkKICAgIGlmIG1hdGNob2JqOgogICAgICByZXR1cm4gbWF0Y2hvYmouZ3JvdXAoMSkKCiAgICBpZiBub3Qgb3MucGF0aC5pc2xpbmsoc3R1Yl9maWxlbmFtZSk6CiAgICAgIGJyZWFrCiAgICB0YXJnZXQgPSBvcy5yZWFkbGluayhzdHViX2ZpbGVuYW1lKQogICAgaWYgb3MucGF0aC5pc2Ficyh0YXJnZXQpOgogICAgICBzdHViX2ZpbGVuYW1lID0gdGFyZ2V0CiAgICBlbHNlOgogICAgICBzdHViX2ZpbGVuYW1lID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShzdHViX2ZpbGVuYW1lKSwgdGFyZ2V0KQoKICByYWlzZSBBc3NlcnRpb25FcnJvcignQ2Fubm90IGZpbmQgLnJ1bmZpbGVzIGRpcmVjdG9yeSBmb3IgJXMnICUgc3lzLmFyZ3ZbMF0pCgpkZWYgRXh0cmFjdFppcCh6aXBfcGF0aCwgZGVzdF9kaXIpOgogICIiIkV4dHJhY3RzIHRoZSBjb250ZW50cyBvZiBhIHppcCBmaWxlLCBwcmVzZXJ2aW5nIHRoZSB1bml4IGZpbGUgbW9kZSBiaXRzLgoKICBUaGVzZSBpbmNsdWRlIHRoZSBwZXJtaXNzaW9uIGJpdHMsIGFuZCBpbiBwYXJ0aWN1bGFyLCB0aGUgZXhlY3V0YWJsZSBiaXQuCgogIElkZWFsbHkgdGhlIHppcGZpbGUgbW9kdWxlIHNob3VsZCBzZXQgdGhlc2UgYml0cywgYnV0IGl0IGRvZXNuJ3QuIFNlZToKICBodHRwczovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTE1Nzk1LgoKICBBcmdzOgogICAgICB6aXBfcGF0aDogVGhlIHBhdGggdG8gdGhlIHppcCBmaWxlIHRvIGV4dHJhY3QKICAgICAgZGVzdF9kaXI6IFRoZSBwYXRoIHRvIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkKICAiIiIKICB6aXBfcGF0aCA9IEdldFdpbmRvd3NQYXRoV2l0aFVOQ1ByZWZpeCh6aXBfcGF0aCkKICBkZXN0X2RpciA9IEdldFdpbmRvd3NQYXRoV2l0aFVOQ1ByZWZpeChkZXN0X2RpcikKICB3aXRoIHppcGZpbGUuWmlwRmlsZSh6aXBfcGF0aCkgYXMgemY6CiAgICBmb3IgaW5mbyBpbiB6Zi5pbmZvbGlzdCgpOgogICAgICB6Zi5leHRyYWN0KGluZm8sIGRlc3RfZGlyKQogICAgICAjIFVOQy1wcmVmaXhlZCBwYXRocyBtdXN0IGJlIGFic29sdXRlL25vcm1hbGl6ZWQuIFNlZQogICAgICAjIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3dpbmRvd3MvZGVza3RvcC9maWxlaW8vbmFtaW5nLWEtZmlsZSNtYXhpbXVtLXBhdGgtbGVuZ3RoLWxpbWl0YXRpb24KICAgICAgZmlsZV9wYXRoID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGguam9pbihkZXN0X2RpciwgaW5mby5maWxlbmFtZSkpCiAgICAgICMgVGhlIFVuaXggc3RfbW9kZSBiaXRzIChzZWUgIm1hbiA3IGlub2RlIikgYXJlIHN0b3JlZCBpbiB0aGUgdXBwZXIgMTYKICAgICAgIyBiaXRzIG9mIGV4dGVybmFsX2F0dHIuIE9mIHRob3NlLCB3ZSBzZXQgdGhlIGxvd2VyIDEyIGJpdHMsIHdoaWNoIGFyZSB0aGUKICAgICAgIyBmaWxlIG1vZGUgYml0cyAoc2luY2UgdGhlIGZpbGUgdHlwZSBiaXRzIGNhbid0IGJlIHNldCBieSBjaG1vZCBhbnl3YXkpLgogICAgICBhdHRycyA9IGluZm8uZXh0ZXJuYWxfYXR0ciA+PiAxNgogICAgICBpZiBhdHRycyAhPSAwOiAgIyBSdW1vciBoYXMgaXQgdGhlc2UgY2FuIGJlIDAgZm9yIHppcHMgY3JlYXRlZCBvbiBXaW5kb3dzLgogICAgICAgIG9zLmNobW9kKGZpbGVfcGF0aCwgYXR0cnMgJiAwbzc3NzcpCgojIENyZWF0ZSB0aGUgcnVuZmlsZXMgdHJlZSBieSBleHRyYWN0aW5nIHRoZSB6aXAgZmlsZQpkZWYgQ3JlYXRlTW9kdWxlU3BhY2UoKToKICB0ZW1wX2RpciA9IHRlbXBmaWxlLm1rZHRlbXAoIiIsICJCYXplbC5ydW5maWxlc18iKQogIEV4dHJhY3RaaXAob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSwgdGVtcF9kaXIpCiAgcmV0dXJuIG9zLnBhdGguam9pbih0ZW1wX2RpciwgInJ1bmZpbGVzIikKCiMgUmV0dXJucyByZXBvc2l0b3J5IHJvb3RzIHRvIGFkZCB0byB0aGUgaW1wb3J0IHBhdGguCmRlZiBHZXRSZXBvc2l0b3JpZXNJbXBvcnRzKG1vZHVsZV9zcGFjZSwgaW1wb3J0X2FsbCk6CiAgaWYgaW1wb3J0X2FsbDoKICAgIHJlcG9fZGlycyA9IFtvcy5wYXRoLmpvaW4obW9kdWxlX3NwYWNlLCBkKSBmb3IgZCBpbiBvcy5saXN0ZGlyKG1vZHVsZV9zcGFjZSldCiAgICByZXR1cm4gW2QgZm9yIGQgaW4gcmVwb19kaXJzIGlmIG9zLnBhdGguaXNkaXIoZCldCiAgcmV0dXJuIFtvcy5wYXRoLmpvaW4obW9kdWxlX3NwYWNlLCAicnVsZXNfcHl0aG9uIildCgojIEZpbmRzIHRoZSBydW5maWxlcyBtYW5pZmVzdCBvciB0aGUgcnVuZmlsZXMgZGlyZWN0b3J5LgpkZWYgUnVuZmlsZXNFbnZ2YXIobW9kdWxlX3NwYWNlKToKICAjIElmIHRoaXMgYmluYXJ5IGlzIHRoZSBkYXRhLWRlcGVuZGVuY3kgb2YgYW5vdGhlciBvbmUsIHRoZSBvdGhlciBzZXRzCiAgIyBSVU5GSUxFU19NQU5JRkVTVF9GSUxFIG9yIFJVTkZJTEVTX0RJUiBmb3Igb3VyIHNha2UuCiAgcnVuZmlsZXMgPSBvcy5lbnZpcm9uLmdldCgnUlVORklMRVNfTUFOSUZFU1RfRklMRScsIE5vbmUpCiAgaWYgcnVuZmlsZXM6CiAgICByZXR1cm4gKCdSVU5GSUxFU19NQU5JRkVTVF9GSUxFJywgcnVuZmlsZXMpCgogIHJ1bmZpbGVzID0gb3MuZW52aXJvbi5nZXQoJ1JVTkZJTEVTX0RJUicsIE5vbmUpCiAgaWYgcnVuZmlsZXM6CiAgICByZXR1cm4gKCdSVU5GSUxFU19ESVInLCBydW5maWxlcykKCiAgIyBJZiBydW5uaW5nIGZyb20gYSB6aXAsIHRoZXJlJ3Mgbm8gbWFuaWZlc3QgZmlsZS4KICBpZiBJc1J1bm5pbmdGcm9tWmlwKCk6CiAgICByZXR1cm4gKCdSVU5GSUxFU19ESVInLCBtb2R1bGVfc3BhY2UpCgogICMgTG9vayBmb3IgdGhlIHJ1bmZpbGVzICJvdXRwdXQiIG1hbmlmZXN0LCBhcmd2WzBdICsgIi5ydW5maWxlc19tYW5pZmVzdCIKICBydW5maWxlcyA9IG1vZHVsZV9zcGFjZSArICdfbWFuaWZlc3QnCiAgaWYgb3MucGF0aC5leGlzdHMocnVuZmlsZXMpOgogICAgcmV0dXJuICgnUlVORklMRVNfTUFOSUZFU1RfRklMRScsIHJ1bmZpbGVzKQoKICAjIExvb2sgZm9yIHRoZSBydW5maWxlcyAiaW5wdXQiIG1hbmlmZXN0LCBhcmd2WzBdICsgIi5ydW5maWxlcy9NQU5JRkVTVCIKICBydW5maWxlcyA9IG9zLnBhdGguam9pbihtb2R1bGVfc3BhY2UsICdNQU5JRkVTVCcpCiAgaWYgb3MucGF0aC5leGlzdHMocnVuZmlsZXMpOgogICAgcmV0dXJuICgnUlVORklMRVNfRElSJywgcnVuZmlsZXMpCgogICMgSWYgcnVubmluZyBpbiBhIHNhbmRib3ggYW5kIG5vIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgc2V0LCB0aGVuCiAgIyBMb29rIGZvciB0aGUgcnVuZmlsZXMgIG5leHQgdG8gdGhlIGJpbmFyeS4KICBpZiBtb2R1bGVfc3BhY2UuZW5kc3dpdGgoJy5ydW5maWxlcycpIGFuZCBvcy5wYXRoLmlzZGlyKG1vZHVsZV9zcGFjZSk6CiAgICByZXR1cm4gKCdSVU5GSUxFU19ESVInLCBtb2R1bGVfc3BhY2UpCgogIHJldHVybiAoTm9uZSwgTm9uZSkKCiMgVE9ETygjNjQ0Myk6IFJlbW92ZSB0aGlzIG9uY2UgdGhlcmUncyBubyBsb25nZXIgYSBob3N0IGNvbmZpZ3VyYXRpb24gZm9yCiMgUHl0aG9uIHRhcmdldHMgdG8gYXBwZWFyIGluLgpkZWYgTWF5YmVFbWl0SG9zdFZlcnNpb25XYXJuaW5nKHJldF9jb2RlKToKICAiIiJXYXJuIHRoZSB1c2VyIGlmIGEgZmFpbHVyZSBtYXkgYmUgZHVlIHRvIHRoZSBob3N0IGNvbmZpZydzIHZlcnNpb24uCgogIFRoaXMgZW1pdHMgYSBtZXNzYWdlIHRvIHN0ZGVyciBpZgogICAgMSkgcmV0X2NvZGUgaXMgbm9uLXplcm8sCiAgICAyKSB0aGUgdGFyZ2V0IHdhcyBidWlsdCBpbiB0aGUgaG9zdCBjb25maWcgYW5kIHdpdGggdG9vbGNoYWlucyBlbmFibGVkLCBhbmQKICAgIDMpIGF0IGFuYWx5c2lzIHRpbWUgd2UgZGV0ZWN0ZWQgYSBtaXNtYXRjaCBiZXR3ZWVuIHRoZSBob3N0IGNvbmZpZydzIHZlcnNpb24KICAgICAgIGFuZCB0aGlzIHRhcmdldCdzIGV4cGxpY2l0bHkgZGVjbGFyZWQgdmVyc2lvbiwgb3IgZWxzZSB0aGlzIHRhcmdldCBkaWQKICAgICAgIG5vdCBleHBsaWNpdGx5IGRlY2xhcmUgaXRzIHZlcnNpb24uIChUaGUgZm9ybWVyIGRpYWdub3NlcyB0YXJnZXRzCiAgICAgICBhZmZlY3RlZCBieSAjNjQ0MywgYW5kIHRoZSBsYXR0ZXIgZGlhZ25vc2VzIHRhcmdldHMgdGhhdCBhcmUgYnJva2VuIGJ5CiAgICAgICBmaXhpbmcgIzQ4MTUuKQoKICBTZWUgYWxzbyAjNzg5OSwgIzg1NDksIGFuZCBQeUNvbW1vbiNzaG91bGRXYXJuQWJvdXRIb3N0VmVyc2lvblVwb25GYWlsdXJlLgoKICBTaW5jZSB0aGlzIHdhcm5pbmcgaXMgZW1pdHRlZCBoZXJlIGluIHRoZSBzdHViIHNjcmlwdCBhbmQgbm90IGluIEJhemVsIGl0c2VsZiwKICBpdCB3aWxsIGJlIHByZXNlbnQgaW4gYWxsIGZhaWxpbmcgcnVucyBvZiBhZmZlY3RlZCB0YXJnZXRzLCBldmVuIHdoZW4gZXhlY3V0ZWQKICBkaXJlY3RseSBhbmQgbm90IHZpYSBgYmF6ZWwgcnVuYC4gSG93ZXZlciwgbm90ZSB0aGF0IHRoaXMgd2FybmluZyBpcyBuZXZlcgogIGFkZGVkIHRvIG5vbi1ob3N0LWNvbmZpZ3VyZWQgdGFyZ2V0cywgYW5kIHRoYXQgaXQgY2FuIGJlIGRpc2FibGVkIGJ5IGVuc3VyaW5nCiAgdGhlIGNvcnJlY3QgUHl0aG9uIHZlcnNpb24gaXMgcGFzc2VkIHRvIC0taG9zdF9mb3JjZV9weXRob24gYW5kIGRlY2xhcmVkIGluCiAgdG9vbHMnIHB5dGhvbl92ZXJzaW9uIGF0dHJpYnV0ZXMuCgogIEFyZ3M6CiAgICAgIHJldF9jb2RlOiBUaGUgZXhpdCBjb2RlIG9mIHRoZSBwYXlsb2FkIHVzZXIgcHJvZ3JhbQogICIiIgogIGlmIHJldF9jb2RlID09IDA6CiAgICByZXR1cm4KICBpZiBub3QgRmFsc2U6CiAgICByZXR1cm4KCiAgaG9zdF92ZXJzaW9uID0gIjMiCiAgdGFyZ2V0X3ZlcnNpb24gPSAiMyIKICBvcHBvc2l0ZV9vZl9ob3N0X3ZlcnNpb24gPSAiMiIgaWYgaG9zdF92ZXJzaW9uID09ICIzIiBlbHNlICIzIgoKICBpZiBGYWxzZToKICAgICMgTWlzbWF0Y2ggd2l0aCBleHBsaWNpdGx5IGRlY2xhcmVkIHZlcnNpb24uCiAgICBkaWFnbm9zdGljID0gIiIiXApOb3RlOiBUaGUgZmFpbHVyZSBvZiB0YXJnZXQge3RhcmdldH0gKHdpdGggZXhpdCBjb2RlIHtyZXRfY29kZX0pIG1heSBoYXZlIGJlZW4gXApjYXVzZWQgYnkgdGhlIGZhY3QgdGhhdCBpdCBpcyBhIFB5dGhvbiB7dGFyZ2V0X3ZlcnNpb259IHByb2dyYW0gdGhhdCB3YXMgYnVpbHQgXAppbiB0aGUgaG9zdCBjb25maWd1cmF0aW9uLCB3aGljaCB1c2VzIFB5dGhvbiB7aG9zdF92ZXJzaW9ufS4gWW91IGNhbiBjaGFuZ2UgXAp0aGUgaG9zdCBjb25maWd1cmF0aW9uIChmb3IgdGhlIGVudGlyZSBidWlsZCkgdG8gaW5zdGVhZCB1c2UgUHl0aG9uIFwKe3RhcmdldF92ZXJzaW9ufSBieSBzZXR0aW5nIC0taG9zdF9mb3JjZV9weXRob249UFl7dGFyZ2V0X3ZlcnNpb259LlwKIiIiLmZvcm1hdCgKICAgIHRhcmdldD0iLy9wYWNrYWdpbmc6cGlwdG9vbCIsCiAgICByZXRfY29kZT1yZXRfY29kZSwKICAgIHRhcmdldF92ZXJzaW9uPXRhcmdldF92ZXJzaW9uLAogICAgaG9zdF92ZXJzaW9uPWhvc3RfdmVyc2lvbikKICBlbHNlOgogICAgZGlhZ25vc3RpYyA9ICIiIlwKTm90ZTogVGhlIGZhaWx1cmUgb2YgdGFyZ2V0IHt0YXJnZXR9ICh3aXRoIGV4aXQgY29kZSB7cmV0X2NvZGV9KSBtYXkgaGF2ZSBiZWVuIFwKY2F1c2VkIGJ5IHRoZSBmYWN0IHRoYXQgaXQgaXMgcnVubmluZyB1bmRlciBQeXRob24ge2hvc3RfdmVyc2lvbn0gaW5zdGVhZCBvZiBcClB5dGhvbiB7b3Bwb3NpdGVfb2ZfaG9zdF92ZXJzaW9ufS4gRXhhbWluZSB0aGUgZXJyb3IgdG8gZGV0ZXJtaW5lIGlmIHRoYXQgXAphcHBlYXJzIHRvIGJlIHRoZSBwcm9ibGVtLiBTaW5jZSB0aGlzIHRhcmdldCBpcyBidWlsdCBpbiB0aGUgaG9zdCBcCmNvbmZpZ3VyYXRpb24sIHRoZSBvbmx5IHdheSB0byBjaGFuZ2UgaXRzIHZlcnNpb24gaXMgdG8gc2V0IFwKLS1ob3N0X2ZvcmNlX3B5dGhvbj1QWXtvcHBvc2l0ZV9vZl9ob3N0X3ZlcnNpb259LCB3aGljaCBhZmZlY3RzIHRoZSBlbnRpcmUgXApidWlsZC5cCiIiIi5mb3JtYXQoCiAgICB0YXJnZXQ9Ii8vcGFja2FnaW5nOnBpcHRvb2wiLAogICAgcmV0X2NvZGU9cmV0X2NvZGUsCiAgICBob3N0X3ZlcnNpb249aG9zdF92ZXJzaW9uLAogICAgb3Bwb3NpdGVfb2ZfaG9zdF92ZXJzaW9uPW9wcG9zaXRlX29mX2hvc3RfdmVyc2lvbikKCiAgIyBUT0RPKGJyYW5kam9uKTogQ2hhbmdlIHRoZSB3b3JkaW5nICJZb3UgYXJlIGxpa2VseSBzZWVpbmcgdGhpcyBtZXNzYWdlCiAgIyBiZWNhdXNlIiB0byBzb21ldGhpbmcgbGVzcyBzdHJvbmcgYWZ0ZXIgYSBmZXcgcmVsZWFzZXMgZnJvbSAwLjI3LiBCeSB0aGF0CiAgIyBwb2ludCwgbWlncmF0aW9uIGZvciB0b29sY2hhaW5zIHdvbid0IGJlIHRoZSBtYWluIHJlYXNvbiB0aGlzIGVycm9yIGlzIHNlZW4KICAjIGJ5IHVzZXJzLgogIG1lc3NhZ2UgPSAiIiJcCi0tLS0tLS0tLS0tLS0tLS0Ke2RpYWdub3N0aWN9CgpJZiB0aGlzIGVycm9yIHN0YXJ0ZWQgb2NjdXJyaW5nIGluIEJhemVsIDAuMjcgYW5kIGxhdGVyLCBpdCBtYXkgYmUgYmVjYXVzZSB0aGUgXApQeXRob24gdG9vbGNoYWluIG5vdyBlbmZvcmNlcyB0aGF0IHRhcmdldHMgYW5hbHl6ZWQgYXMgUFkyIGFuZCBQWTMgcnVuIHVuZGVyIGEgXApQeXRob24gMiBhbmQgUHl0aG9uIDMgaW50ZXJwcmV0ZXIsIHJlc3BlY3RpdmVseS4gU2VlIFwKaHR0cHM6Ly9naXRodWIuY29tL2JhemVsYnVpbGQvYmF6ZWwvaXNzdWVzLzc4OTkgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0tLS0tLS0tLS0tLS0tLS0iIiIuZm9ybWF0KGRpYWdub3N0aWM9ZGlhZ25vc3RpYykKICBwcmludChtZXNzYWdlLCBmaWxlPXN5cy5zdGRlcnIpCgpkZWYgTWFpbigpOgogIGFyZ3MgPSBzeXMuYXJndlsxOl0KCiAgbmV3X2VudiA9IHt9CgogIGlmIElzUnVubmluZ0Zyb21aaXAoKToKICAgIG1vZHVsZV9zcGFjZSA9IENyZWF0ZU1vZHVsZVNwYWNlKCkKICBlbHNlOgogICAgbW9kdWxlX3NwYWNlID0gRmluZE1vZHVsZVNwYWNlKCkKCiAgcHl0aG9uX2ltcG9ydHMgPSAncGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wOnBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzM6cGlwdG9vbF9kZXBzX3B5cGlfX3doZWVsXzBfMzBfMGEwJwogIHB5dGhvbl9wYXRoX2VudHJpZXMgPSBDcmVhdGVQeXRob25QYXRoRW50cmllcyhweXRob25faW1wb3J0cywgbW9kdWxlX3NwYWNlKQogIHB5dGhvbl9wYXRoX2VudHJpZXMgKz0gR2V0UmVwb3NpdG9yaWVzSW1wb3J0cyhtb2R1bGVfc3BhY2UsIFRydWUpCgogIHB5dGhvbl9wYXRoX2VudHJpZXMgPSBbR2V0V2luZG93c1BhdGhXaXRoVU5DUHJlZml4KGQpIGZvciBkIGluIHB5dGhvbl9wYXRoX2VudHJpZXNdCgogIG9sZF9weXRob25fcGF0aCA9IG9zLmVudmlyb24uZ2V0KCdQWVRIT05QQVRIJykKICBweXRob25fcGF0aCA9IG9zLnBhdGhzZXAuam9pbihweXRob25fcGF0aF9lbnRyaWVzKQogIGlmIG9sZF9weXRob25fcGF0aDoKICAgIHB5dGhvbl9wYXRoICs9IG9zLnBhdGhzZXAgKyBvbGRfcHl0aG9uX3BhdGgKCiAgaWYgSXNXaW5kb3dzKCk6CiAgICBweXRob25fcGF0aCA9IHB5dGhvbl9wYXRoLnJlcGxhY2UoIi8iLCBvcy5zZXApCgogIG5ld19lbnZbJ1BZVEhPTlBBVEgnXSA9IHB5dGhvbl9wYXRoCiAgcnVuZmlsZXNfZW52a2V5LCBydW5maWxlc19lbnZ2YWx1ZSA9IFJ1bmZpbGVzRW52dmFyKG1vZHVsZV9zcGFjZSkKICBpZiBydW5maWxlc19lbnZrZXk6CiAgICBuZXdfZW52W3J1bmZpbGVzX2VudmtleV0gPSBydW5maWxlc19lbnZ2YWx1ZQoKICAjIE5vdyBsb29rIGZvciBteSBtYWluIHB5dGhvbiBzb3VyY2UgZmlsZS4KICAjIFRoZSBtYWdpYyBzdHJpbmcgcGVyY2VudC1tYWluLXBlcmNlbnQgaXMgcmVwbGFjZWQgd2l0aCB0aGUgZmlsZW5hbWUgb2YgdGhlCiAgIyBtYWluIGZpbGUgb2YgdGhlIFB5dGhvbiBiaW5hcnkgaW4gQmF6ZWxQeXRob25TZW1hbnRpY3MuamF2YS4KICByZWxfcGF0aCA9ICdydWxlc19weXRob24vcGFja2FnaW5nL3BpcHRvb2wucHknCiAgaWYgSXNXaW5kb3dzKCk6CiAgICByZWxfcGF0aCA9IHJlbF9wYXRoLnJlcGxhY2UoIi8iLCBvcy5zZXApCgogIG1haW5fZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4obW9kdWxlX3NwYWNlLCByZWxfcGF0aCkKICBtYWluX2ZpbGVuYW1lID0gR2V0V2luZG93c1BhdGhXaXRoVU5DUHJlZml4KG1haW5fZmlsZW5hbWUpCiAgYXNzZXJ0IG9zLnBhdGguZXhpc3RzKG1haW5fZmlsZW5hbWUpLCBcCiAgICAgICAgICdDYW5ub3QgZXhlYygpICVyOiBmaWxlIG5vdCBmb3VuZC4nICUgbWFpbl9maWxlbmFtZQogIGFzc2VydCBvcy5hY2Nlc3MobWFpbl9maWxlbmFtZSwgb3MuUl9PSyksIFwKICAgICAgICAgJ0Nhbm5vdCBleGVjKCkgJXI6IGZpbGUgbm90IHJlYWRhYmxlLicgJSBtYWluX2ZpbGVuYW1lCgogIHByb2dyYW0gPSBweXRob25fcHJvZ3JhbSA9IEZpbmRQeXRob25CaW5hcnkobW9kdWxlX3NwYWNlKQogIGlmIHB5dGhvbl9wcm9ncmFtIGlzIE5vbmU6CiAgICByYWlzZSBBc3NlcnRpb25FcnJvcignQ291bGQgbm90IGZpbmQgcHl0aG9uIGJpbmFyeTogJyArIFBZVEhPTl9CSU5BUlkpCiAgYXJncyA9IFtweXRob25fcHJvZ3JhbSwgbWFpbl9maWxlbmFtZV0gKyBhcmdzCgogIG9zLmVudmlyb24udXBkYXRlKG5ld19lbnYpCgogIHRyeToKICAgIHN5cy5zdGRvdXQuZmx1c2goKQogICAgaWYgSXNSdW5uaW5nRnJvbVppcCgpOgogICAgICAjIElmIFJVTl9VTkRFUl9SVU5GSUxFUyBlcXVhbHMgMSwgaXQgbWVhbnMgd2UgbmVlZCB0bwogICAgICAjIGNoYW5nZSBkaXJlY3RvcnkgdG8gdGhlIHJpZ2h0IHJ1bmZpbGVzIGRpcmVjdG9yeS4KICAgICAgIyAoU28gdGhhdCB0aGUgZGF0YSBmaWxlcyBhcmUgYWNjZXNzaWJsZSkKICAgICAgaWYgb3MuZW52aXJvbi5nZXQoIlJVTl9VTkRFUl9SVU5GSUxFUyIpID09ICIxIjoKICAgICAgICBvcy5jaGRpcihvcy5wYXRoLmpvaW4obW9kdWxlX3NwYWNlLCAicnVsZXNfcHl0aG9uIikpCiAgICAgIHJldF9jb2RlID0gc3VicHJvY2Vzcy5jYWxsKGFyZ3MpCiAgICAgIHNodXRpbC5ybXRyZWUob3MucGF0aC5kaXJuYW1lKG1vZHVsZV9zcGFjZSksIFRydWUpCiAgICAgIE1heWJlRW1pdEhvc3RWZXJzaW9uV2FybmluZyhyZXRfY29kZSkKICAgICAgc3lzLmV4aXQocmV0X2NvZGUpCiAgICBlbHNlOgogICAgICAjIE9uIFdpbmRvd3MsIG9zLmV4ZWN2IGRvZXNuJ3QgaGFuZGxlIGFyZ3VtZW50cyB3aXRoIHNwYWNlcyBjb3JyZWN0bHksCiAgICAgICMgYW5kIGl0IGFjdHVhbGx5IHN0YXJ0cyBhIHN1YnByb2Nlc3MganVzdCBsaWtlIHN1YnByb2Nlc3MuY2FsbC4KICAgICAgIwogICAgICAjIElmIHdlIG1heSBuZWVkIHRvIGVtaXQgYSBob3N0IGNvbmZpZyB3YXJuaW5nIGFmdGVyIGV4ZWN1dGlvbiwgZG9uJ3QKICAgICAgIyBleGVjdiBiZWNhdXNlIHdlIG5lZWQgY29udHJvbCB0byByZXR1cm4gaGVyZS4gVGhpcyBvbmx5IGhhcHBlbnMgZm9yCiAgICAgICMgdGFyZ2V0cyBidWlsdCBpbiB0aGUgaG9zdCBjb25maWcsIHNvIG90aGVyIHRhcmdldHMgc3RpbGwgZ2V0IHRvIHRha2UKICAgICAgIyBhZHZhbnRhZ2Ugb2YgdGhlIHBlcmZvcm1hbmNlIGJlbmVmaXRzIG9mIGV4ZWN2LgogICAgICBpZiBJc1dpbmRvd3MoKSBvciBGYWxzZToKICAgICAgICByZXRfY29kZSA9IHN1YnByb2Nlc3MuY2FsbChhcmdzKQogICAgICAgIE1heWJlRW1pdEhvc3RWZXJzaW9uV2FybmluZyhyZXRfY29kZSkKICAgICAgICBzeXMuZXhpdChyZXRfY29kZSkKICAgICAgZWxzZToKICAgICAgICBvcy5leGVjdihhcmdzWzBdLCBhcmdzKQogIGV4Y2VwdCBFbnZpcm9ubWVudEVycm9yOgogICAgIyBUaGlzIHdvcmtzIGZyb20gUHl0aG9uIDIuNCBhbGwgdGhlIHdheSB0byAzLnguCiAgICBlID0gc3lzLmV4Y19pbmZvKClbMV0KICAgICMgVGhpcyBleGNlcHRpb24gb2NjdXJzIHdoZW4gb3MuZXhlY3YoKSBmYWlscyBmb3Igc29tZSByZWFzb24uCiAgICBpZiBub3QgZ2V0YXR0cihlLCAnZmlsZW5hbWUnLCBOb25lKToKICAgICAgZS5maWxlbmFtZSA9IHByb2dyYW0gICMgQWRkIGluZm8gdG8gZXJyb3IgbWVzc2FnZQogICAgcmFpc2UKCmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgTWFpbigpClBLAwQUAAAAAAAAACEAAAB5lRkgAAAZIAAAIQAAAHJ1bGVzX3B5dGhvbi9wYWNrYWdpbmcvcGlwdG9vbC5weSMgQ29weXJpZ2h0IDIwMTcgVGhlIEJhemVsIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiMKIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiMKIyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIwojIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAojIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgojIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIiIiVGhlIHBpcHRvb2wgbW9kdWxlIGltcG9ydHMgcGlwIHJlcXVpcmVtZW50cyBpbnRvIEJhemVsIHJ1bGVzLiIiIgoKaW1wb3J0IGFyZ3BhcnNlCmltcG9ydCBhdGV4aXQKaW1wb3J0IGpzb24KaW1wb3J0IG9zCmltcG9ydCBwa2d1dGlsCmltcG9ydCBwa2dfcmVzb3VyY2VzCmltcG9ydCByZQppbXBvcnQgc2h1dGlsCmltcG9ydCBzeXMKaW1wb3J0IHRlbXBmaWxlCmltcG9ydCB6aXBmaWxlCgojIE5vdGU6IFdlIGNhcmVmdWxseSBpbXBvcnQgdGhlIGZvbGxvd2luZyBtb2R1bGVzIGluIGEgcGFydGljdWxhcgojIG9yZGVyLCBzaW5jZSB0aGVzZSBtb2R1bGVzIG1vZGlmeSB0aGUgaW1wb3J0IHBhdGggYW5kIG1hY2hpbmVyeS4KaW1wb3J0IHBrZ19yZXNvdXJjZXMKCgpkZWYgZXh0cmFjdF9wYWNrYWdlcyhwYWNrYWdlX25hbWVzKToKICAgICIiIkV4dHJhY3QgemlwZmlsZSBjb250ZW50cyB0byBkaXNrIGFuZCBhZGQgdG8gaW1wb3J0IHBhdGgiIiIKCiAgICAjIFNldCBhIHNhZmUgZXh0cmFjdGlvbiBkaXIKICAgIGV4dHJhY3Rpb25fdG1wZGlyID0gdGVtcGZpbGUubWtkdGVtcCgpCiAgICBhdGV4aXQucmVnaXN0ZXIobGFtYmRhOiBzaHV0aWwucm10cmVlKAogICAgICAgIGV4dHJhY3Rpb25fdG1wZGlyLCBpZ25vcmVfZXJyb3JzPVRydWUpKQogICAgcGtnX3Jlc291cmNlcy5zZXRfZXh0cmFjdGlvbl9wYXRoKGV4dHJhY3Rpb25fdG1wZGlyKQoKICAgICMgRXh0cmFjdCBlYWNoIHBhY2thZ2UgdG8gZGlzawogICAgZGlyc190b19hZGQgPSBbXQogICAgZm9yIHBhY2thZ2VfbmFtZSBpbiBwYWNrYWdlX25hbWVzOgogICAgICAgIHJlcSA9IHBrZ19yZXNvdXJjZXMuUmVxdWlyZW1lbnQucGFyc2UocGFja2FnZV9uYW1lKQogICAgICAgIGV4dHJhY3Rpb25fZGlyID0gcGtnX3Jlc291cmNlcy5yZXNvdXJjZV9maWxlbmFtZShyZXEsICcnKQogICAgICAgIGRpcnNfdG9fYWRkLmFwcGVuZChleHRyYWN0aW9uX2RpcikKCiAgICAjIEFkZCBleHRyYWN0ZWQgZGlyZWN0b3JpZXMgdG8gaW1wb3J0IHBhdGggYWhlYWQgb2YgdGhlaXIgemlwIGZpbGUKICAgICMgY291bnRlcnBhcnRzLgogICAgc3lzLnBhdGhbMDowXSA9IGRpcnNfdG9fYWRkCiAgICBleGlzdGluZ19weXRob25wYXRoID0gb3MuZW52aXJvbi5nZXQoJ1BZVEhPTlBBVEgnKQogICAgaWYgZXhpc3RpbmdfcHl0aG9ucGF0aDoKICAgICAgICBkaXJzX3RvX2FkZC5leHRlbmQoZXhpc3RpbmdfcHl0aG9ucGF0aC5zcGxpdCgnOicpKQogICAgb3MuZW52aXJvblsnUFlUSE9OUEFUSCddID0gJzonLmpvaW4oZGlyc190b19hZGQpCgoKIyBXaGVlbCwgcGlwLCBhbmQgc2V0dXB0b29scyBhcmUgbXVjaCBoYXBwaWVyIHJ1bm5pbmcgZnJvbSBhY3R1YWwKIyBmaWxlcyBvbiBkaXNrLCByYXRoZXIgdGhhbiBlbnRyaWVzIGluIGEgemlwZmlsZS4gIEV4dHJhY3QgemlwZmlsZQojIGNvbnRlbnRzLCBhZGQgdGhvc2UgY29udGVudHMgdG8gdGhlIHBhdGgsIHRoZW4gaW1wb3J0IHRoZW0uCmV4dHJhY3RfcGFja2FnZXMoWydwaXAnLCAnc2V0dXB0b29scycsICd3aGVlbCddKQoKIyBEZWZlYXQgcGlwJ3MgYXR0ZW1wdCB0byBtYW5nbGUgc3lzLnBhdGgKc2F2ZWRfc3lzX3BhdGggPSBzeXMucGF0aApzeXMucGF0aCA9IHN5cy5wYXRoWzpdCmltcG9ydCBwaXAKc3lzLnBhdGggPSBzYXZlZF9zeXNfcGF0aAoKaW1wb3J0IHNldHVwdG9vbHMKaW1wb3J0IHdoZWVsCgoKZGVmIHBpcF9tYWluKGFyZ3YpOgogICAgIyBFeHRyYWN0IHRoZSBjZXJ0aWZpY2F0ZXMgZnJvbSB0aGUgUEFSIGZvbGxvd2luZyB0aGUgZXhhbXBsZSBvZiBnZXQtcGlwLnB5CiAgICAjIGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL2dldC1waXAvYmxvYi80MzBiYTM3Nzc2YWUyYWQ4OS90ZW1wbGF0ZS5weSNMMTY0LUwxNjgKICAgIGNlcnRfdG1wZGlyID0gdGVtcGZpbGUubWtkdGVtcCgpCiAgICBjZXJ0X3BhdGggPSBvcy5wYXRoLmpvaW4oY2VydF90bXBkaXIsICJjYWNlcnQucGVtIikKICAgIGF0ZXhpdC5yZWdpc3RlcihsYW1iZGE6IHNodXRpbC5ybXRyZWUoY2VydF90bXBkaXIsIGlnbm9yZV9lcnJvcnM9VHJ1ZSkpCiAgICB3aXRoIG9wZW4oY2VydF9wYXRoLCAid2IiKSBhcyBjZXJ0OgogICAgICBjZXJ0LndyaXRlKHBrZ3V0aWwuZ2V0X2RhdGEoInBpcC5fdmVuZG9yLnJlcXVlc3RzIiwgImNhY2VydC5wZW0iKSkKICAgIGFyZ3YgPSBbIi0taXNvbGF0ZWQiLCAiLS1kaXNhYmxlLXBpcC12ZXJzaW9uLWNoZWNrIiwgIi0tY2VydCIsIGNlcnRfcGF0aF0gKyBhcmd2CiAgICByZXR1cm4gcGlwLm1haW4oYXJndikKCmZyb20gcGFja2FnaW5nLndobCBpbXBvcnQgV2hlZWwKCnBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKAogICAgZGVzY3JpcHRpb249J0ltcG9ydCBQeXRob24gZGVwZW5kZW5jaWVzIGludG8gQmF6ZWwuJykKCnBhcnNlci5hZGRfYXJndW1lbnQoJy0tcHl0aG9uX2ludGVycHJldGVyJywgYWN0aW9uPSdzdG9yZScsCiAgICAgICAgICAgICAgICAgICAgaGVscD0oJ1RoZSBQeXRob24gaW50ZXJwcmV0ZXIgdG8gdXNlIHdoZW4gZXh0cmFjdGluZyAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgJ3doZWVscy4nKSkKCnBhcnNlci5hZGRfYXJndW1lbnQoJy0tbmFtZScsIGFjdGlvbj0nc3RvcmUnLAogICAgICAgICAgICAgICAgICAgIGhlbHA9KCdUaGUgbmFtZXNwYWNlIG9mIHRoZSBpbXBvcnQuJykpCgpwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWlucHV0JywgYWN0aW9uPSdzdG9yZScsCiAgICAgICAgICAgICAgICAgICAgaGVscD0oJ1RoZSByZXF1aXJlbWVudHMudHh0IGZpbGUgdG8gaW1wb3J0LicpKQoKcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1vdXRwdXQnLCBhY3Rpb249J3N0b3JlJywKICAgICAgICAgICAgICAgICAgICBoZWxwPSgnVGhlIHJlcXVpcmVtZW50cy5iemwgZmlsZSB0byBleHBvcnQuJykpCgpwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWRpcmVjdG9yeScsIGFjdGlvbj0nc3RvcmUnLAogICAgICAgICAgICAgICAgICAgIGhlbHA9KCdUaGUgZGlyZWN0b3J5IGludG8gd2hpY2ggdG8gcHV0IC53aGwgZmlsZXMuJykpCgpwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWV4dHJhX3BpcF9hcmdzJywgYWN0aW9uPSdzdG9yZScsCiAgICAgICAgICAgICAgICAgICAgaGVscD0oJ0V4dHJhIGFyZ3VtZW50cyB0byBwYXNzIGRvd24gdG8gcGlwLicpKQoKZGVmIHNvcnRfd2hlZWxzKHdobHMpOgogICIiIlNvcnRzIGEgbGlzdCBvZiB3aGVlbHMgZGV0ZXJtaW5pc3RpY2FsbHkuIiIiCiAgcmV0dXJuIHNvcnRlZCh3aGxzLCBrZXk9bGFtYmRhIHc6IHcuZGlzdHJpYnV0aW9uKCkgKyAnXycgKyB3LnZlcnNpb24oKSkKCmRlZiBkZXRlcm1pbmVfcG9zc2libGVfZXh0cmFzKHdobHMpOgogICIiIkRldGVybWluZXMgdGhlIGxpc3Qgb2YgcG9zc2libGUgImV4dHJhcyIgZm9yIGVhY2ggLndobAoKICBUaGUgcG9zc2liaWxpdHkgb2YgYW4gZXh0cmEgaXMgZGV0ZXJtaW5lZCBieSBsb29raW5nIGF0IGl0cwogIGFkZGl0aW9uYWwgcmVxdWlyZW1lbnRzLCBhbmQgZGV0ZXJtaW5pbmUgd2hldGhlciB0aGV5IGFyZQogIHNhdGlzZmllZCBieSB0aGUgY29tcGxldGUgbGlzdCBvZiBhdmFpbGFibGUgd2hlZWxzLgoKICBBcmdzOgogICAgd2hsczogYSBsaXN0IG9mIFdoZWVsIG9iamVjdHMKCiAgUmV0dXJuczoKICAgIGEgZGljdCB0aGF0IGlzIGtleWVkIGJ5IHRoZSBXaGVlbCBvYmplY3RzIGluIHdobHMsIGFuZCB3aG9zZQogICAgdmFsdWVzIGFyZSBsaXN0cyBvZiBwb3NzaWJsZSBleHRyYXMuCiAgIiIiCiAgd2hsX21hcCA9IHsKICAgIHdobC5kaXN0cmlidXRpb24oKTogd2hsCiAgICBmb3Igd2hsIGluIHdobHMKICB9CgogICMgVE9ETyhtYXR0bW9vcik6IENvbnNpZGVyIG1lbW9pemluZyBpZiB0aGlzIHJlY3Vyc2lvbiBldmVyIGJlY29tZXMKICAjIGV4cGVuc2l2ZSBlbm91Z2ggdG8gd2FycmFudCBpdC4KICBkZWYgaXNfcG9zc2libGUoZGlzdHJvLCBleHRyYSk6CiAgICBkaXN0cm8gPSBkaXN0cm8ucmVwbGFjZSgiLSIsICJfIikKICAgICMgSWYgd2UgZG9uJ3QgaGF2ZSB0aGUgLndobCBhdCBhbGwsIHRoZW4gdGhpcyBpc24ndCBwb3NzaWJsZS4KICAgIGlmIGRpc3RybyBub3QgaW4gd2hsX21hcDoKICAgICAgcmV0dXJuIEZhbHNlCiAgICB3aGwgPSB3aGxfbWFwW2Rpc3Ryb10KICAgICMgSWYgd2UgaGF2ZSB0aGUgLndobCwgYW5kIHdlIGRvbid0IG5lZWQgYW55dGhpbmcgZXh0cmEgdGhlbgogICAgIyB3ZSBjYW4gc2F0aXNmeSB0aGlzIGRlcGVuZGVuY3kuCiAgICBpZiBub3QgZXh0cmE6CiAgICAgIHJldHVybiBUcnVlCiAgICAjIElmIHdlIGRvIG5lZWQgc29tZXRoaW5nIGV4dHJhLCB0aGVuIGNoZWNrIHRoZSBleHRyYSdzCiAgICAjIGRlcGVuZGVuY2llcyB0byBtYWtlIHN1cmUgdGhleSBhcmUgZnVsbHkgc2F0aXNmaWVkLgogICAgZm9yIGV4dHJhX2RlcCBpbiB3aGwuZGVwZW5kZW5jaWVzKGV4dHJhPWV4dHJhKToKICAgICAgcmVxID0gcGtnX3Jlc291cmNlcy5SZXF1aXJlbWVudC5wYXJzZShleHRyYV9kZXApCiAgICAgICMgQ2hlY2sgdGhhdCB0aGUgZGVwIGFuZCBhbnkgZXh0cmFzIGFyZSBhbGwgcG9zc2libGUuCiAgICAgIGlmIG5vdCBpc19wb3NzaWJsZShyZXEucHJvamVjdF9uYW1lLCBOb25lKToKICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgZm9yIGUgaW4gcmVxLmV4dHJhczoKICAgICAgICBpZiBub3QgaXNfcG9zc2libGUocmVxLnByb2plY3RfbmFtZSwgZSk6CiAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICMgSWYgYWxsIG9mIHRoZSBkZXBlbmRlbmNpZXMgb2YgdGhlIGV4dHJhIGFyZSBzYXRpc2ZpYWJsZSB0aGVuCiAgICAjIGl0IGlzIHBvc3NpYmxlIHRvIGNvbnN0cnVjdCB0aGlzIGRlcGVuZGVuY3kuCiAgICByZXR1cm4gVHJ1ZQoKICByZXR1cm4gewogICAgd2hsOiBbCiAgICAgIGV4dHJhCiAgICAgIGZvciBleHRyYSBpbiBzb3J0ZWQod2hsLmV4dHJhcygpKQogICAgICBpZiBpc19wb3NzaWJsZSh3aGwuZGlzdHJpYnV0aW9uKCksIGV4dHJhKQogICAgXQogICAgZm9yIHdobCBpbiB3aGxzCiAgfQoKZGVmIG1haW4oKToKICBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQoKICAjIGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3BpcC9ibG9iLzkuMC4xL3BpcC9fX2luaXRfXy5weSNMMjA5CiAgcGlwX2FyZ3MgPSBbIndoZWVsIiwgIi13IiwgYXJncy5kaXJlY3RvcnksICItciIsIGFyZ3MuaW5wdXRdCiAgaWYgYXJncy5leHRyYV9waXBfYXJnczoKICAgICAgcGlwX2FyZ3MgKz0gYXJncy5leHRyYV9waXBfYXJncy5zdHJpcCgiXCIiKS5zcGxpdCgpCiAgaWYgcGlwX21haW4ocGlwX2FyZ3MpOgogICAgc3lzLmV4aXQoMSkKCiAgIyBFbnVtZXJhdGUgdGhlIC53aGwgZmlsZXMgd2UgZG93bmxvYWRlZC4KICBkZWYgbGlzdF93aGxzKCk6CiAgICBkaXIgPSBhcmdzLmRpcmVjdG9yeSArICcvJwogICAgZm9yIHJvb3QsIHVudXNlZF9kaXJuYW1lcywgZmlsZW5hbWVzIGluIG9zLndhbGsoZGlyKToKICAgICAgZm9yIGZuYW1lIGluIGZpbGVuYW1lczoKICAgICAgICBpZiBmbmFtZS5lbmRzd2l0aCgnLndobCcpOgogICAgICAgICAgeWllbGQgb3MucGF0aC5qb2luKHJvb3QsIGZuYW1lKQoKICB3aGxzID0gc29ydF93aGVlbHMoV2hlZWwocGF0aCkgZm9yIHBhdGggaW4gbGlzdF93aGxzKCkpCiAgcG9zc2libGVfZXh0cmFzID0gZGV0ZXJtaW5lX3Bvc3NpYmxlX2V4dHJhcyh3aGxzKQoKICBkZWYgcmVwb3NpdG9yeV9uYW1lKHdoZWVsKToKICAgIHJldHVybiBhcmdzLm5hbWUgKyAiXyIgKyB3aGVlbC5yZXBvc2l0b3J5X3N1ZmZpeCgpCgogIGRlZiB3aGxfbGlicmFyeSh3aGVlbCk6CiAgICAjIEluZGVudGF0aW9uIGhlcmUgbWF0dGVycy4gIHdobF9saWJyYXJ5IG11c3QgYmUgd2l0aGluIHRoZSBzY29wZQogICAgIyBvZiB0aGUgZnVuY3Rpb24gYmVsb3cuICBXZSBhbHNvIGF2b2lkIHJlaW1wb3J0aW5nIGFuIGV4aXN0aW5nIFdITC4KICAgIHJldHVybiAiIiIKICBpZiAie3JlcG9fbmFtZX0iIG5vdCBpbiBuYXRpdmUuZXhpc3RpbmdfcnVsZXMoKToKICAgIHdobF9saWJyYXJ5KAogICAgICAgIG5hbWUgPSAie3JlcG9fbmFtZX0iLAogICAgICAgIHB5dGhvbl9pbnRlcnByZXRlciA9ICJ7cHl0aG9uX2ludGVycHJldGVyfSIsCiAgICAgICAgd2hsID0gIkB7bmFtZX0vLzp7cGF0aH0iLAogICAgICAgIHJlcXVpcmVtZW50cyA9ICJAe25hbWV9Ly86cmVxdWlyZW1lbnRzLmJ6bCIsCiAgICAgICAgZXh0cmFzID0gW3tleHRyYXN9XQogICAgKSIiIi5mb3JtYXQobmFtZT1hcmdzLm5hbWUsIHJlcG9fbmFtZT1yZXBvc2l0b3J5X25hbWUod2hlZWwpLAogICAgICAgICAgICAgICAgcHl0aG9uX2ludGVycHJldGVyPWFyZ3MucHl0aG9uX2ludGVycHJldGVyLAogICAgICAgICAgICAgICAgcGF0aD13aGVlbC5iYXNlbmFtZSgpLAogICAgICAgICAgICAgICAgZXh0cmFzPScsJy5qb2luKFsKICAgICAgICAgICAgICAgICAgJyIlcyInICUgZXh0cmEKICAgICAgICAgICAgICAgICAgZm9yIGV4dHJhIGluIHBvc3NpYmxlX2V4dHJhcy5nZXQod2hlZWwsIFtdKQogICAgICAgICAgICAgICAgXSkpCgogIHdobF90YXJnZXRzID0gJywnLmpvaW4oWwogICAgJywnLmpvaW4oWwogICAgICAnIiVzIjogIkAlcy8vOnBrZyInICUgKHdobC5kaXN0cmlidXRpb24oKS5sb3dlcigpLCByZXBvc2l0b3J5X25hbWUod2hsKSkKICAgIF0gKyBbCiAgICAgICMgRm9yIGV2ZXJ5IGV4dHJhIHRoYXQgaXMgcG9zc2libGUgZnJvbSB0aGlzIHJlcXVpcmVtZW50cy50eHQKICAgICAgJyIlc1slc10iOiAiQCVzLy86JXMiJyAlICh3aGwuZGlzdHJpYnV0aW9uKCkubG93ZXIoKSwgZXh0cmEubG93ZXIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvc2l0b3J5X25hbWUod2hsKSwgZXh0cmEpCiAgICAgIGZvciBleHRyYSBpbiBwb3NzaWJsZV9leHRyYXMuZ2V0KHdobCwgW10pCiAgICBdKQogICAgZm9yIHdobCBpbiB3aGxzCiAgXSkKCiAgd2l0aCBvcGVuKGFyZ3Mub3V0cHV0LCAndycpIGFzIGY6CiAgICBmLndyaXRlKCIiIlwKIyBJbnN0YWxsIHBpcCByZXF1aXJlbWVudHMuCiMKIyBHZW5lcmF0ZWQgZnJvbSB7aW5wdXR9Cgpsb2FkKCJAcnVsZXNfcHl0aG9uLy9weXRob246d2hsLmJ6bCIsICJ3aGxfbGlicmFyeSIpCgpkZWYgcGlwX2luc3RhbGwoKToKICB7d2hsX2xpYnJhcmllc30KCl9yZXF1aXJlbWVudHMgPSB7ewogIHttYXBwaW5nc30KfX0KCmFsbF9yZXF1aXJlbWVudHMgPSBfcmVxdWlyZW1lbnRzLnZhbHVlcygpCgpkZWYgcmVxdWlyZW1lbnQobmFtZSk6CiAgbmFtZV9rZXkgPSBuYW1lLnJlcGxhY2UoIi0iLCAiXyIpLmxvd2VyKCkKICBpZiBuYW1lX2tleSBub3QgaW4gX3JlcXVpcmVtZW50czoKICAgIGZhaWwoIkNvdWxkIG5vdCBmaW5kIHBpcC1wcm92aWRlZCBkZXBlbmRlbmN5OiAnJXMnIiAlIG5hbWUpCiAgcmV0dXJuIF9yZXF1aXJlbWVudHNbbmFtZV9rZXldCiIiIi5mb3JtYXQoaW5wdXQ9YXJncy5pbnB1dCwKICAgICAgICAgICB3aGxfbGlicmFyaWVzPSdcbicuam9pbihtYXAod2hsX2xpYnJhcnksIHdobHMpKSBpZiB3aGxzIGVsc2UgInBhc3MiLAogICAgICAgICAgIG1hcHBpbmdzPXdobF90YXJnZXRzKSkKCmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgbWFpbigpClBLAwQUAAAAAAAAACEA5rtpdiccAAAnHAAAHQAAAHJ1bGVzX3B5dGhvbi9wYWNrYWdpbmcvd2hsLnB5IyBDb3B5cmlnaHQgMjAxNyBUaGUgQmF6ZWwgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIwojIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwojIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIwojICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAojCiMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQojIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAojIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoiIiJUaGUgd2hsIG1vZHVsZXMgZGVmaW5lcyBjbGFzc2VzIGZvciBpbnRlcmFjdGluZyB3aXRoIFB5dGhvbiBwYWNrYWdlcy4iIiIKCmltcG9ydCBhcmdwYXJzZQppbXBvcnQganNvbgppbXBvcnQgb3MKaW1wb3J0IHBrZ19yZXNvdXJjZXMKaW1wb3J0IHJlCmltcG9ydCBzdGF0CmltcG9ydCB6aXBmaWxlCgoKZGVmIGN1cnJlbnRfdW1hc2soKToKICAgICIiIkdldCB0aGUgY3VycmVudCB1bWFzayB3aGljaCBpbnZvbHZlcyBoYXZpbmcgdG8gc2V0IGl0IHRlbXBvcmFyaWx5LiIiIgogICAgbWFzayA9IG9zLnVtYXNrKDApCiAgICBvcy51bWFzayhtYXNrKQogICAgcmV0dXJuIG1hc2sKCgpkZWYgc2V0X2V4dHJhY3RlZF9maWxlX3RvX2RlZmF1bHRfbW9kZV9wbHVzX2V4ZWN1dGFibGUocGF0aCk6CiAgICAiIiIKICAgIE1ha2UgZmlsZSBwcmVzZW50IGF0IHBhdGggaGF2ZSBleGVjdXRlIGZvciB1c2VyL2dyb3VwL3dvcmxkCiAgICAoY2htb2QgK3gpIGlzIG5vLW9wIG9uIHdpbmRvd3MgcGVyIHB5dGhvbiBkb2NzCiAgICAiIiIKICAgIG9zLmNobW9kKHBhdGgsICgwbzc3NyAmIH5jdXJyZW50X3VtYXNrKCkgfCAwbzExMSkpCgoKY2xhc3MgV2hlZWwob2JqZWN0KToKCiAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdGgpOgogICAgc2VsZi5fcGF0aCA9IHBhdGgKCiAgZGVmIHBhdGgoc2VsZik6CiAgICByZXR1cm4gc2VsZi5fcGF0aAoKICBkZWYgYmFzZW5hbWUoc2VsZik6CiAgICByZXR1cm4gb3MucGF0aC5iYXNlbmFtZShzZWxmLnBhdGgoKSkKCiAgZGVmIGRpc3RyaWJ1dGlvbihzZWxmKToKICAgICMgU2VlIGh0dHBzOi8vd3d3LnB5dGhvbi5vcmcvZGV2L3BlcHMvcGVwLTA0MjcvI2ZpbGUtbmFtZS1jb252ZW50aW9uCiAgICBwYXJ0cyA9IHNlbGYuYmFzZW5hbWUoKS5zcGxpdCgnLScpCiAgICByZXR1cm4gcGFydHNbMF0KCiAgZGVmIHZlcnNpb24oc2VsZik6CiAgICAjIFNlZSBodHRwczovL3d3dy5weXRob24ub3JnL2Rldi9wZXBzL3BlcC0wNDI3LyNmaWxlLW5hbWUtY29udmVudGlvbgogICAgcGFydHMgPSBzZWxmLmJhc2VuYW1lKCkuc3BsaXQoJy0nKQogICAgcmV0dXJuIHBhcnRzWzFdCgogIGRlZiByZXBvc2l0b3J5X3N1ZmZpeChzZWxmKToKICAgICMgUmV0dXJucyBhIGNhbm9uaWNhbCBzdWZmaXggdGhhdCB3aWxsIGZvcm0gcGFydCBvZiB0aGUgbmFtZSBvZiB0aGUgQmF6ZWwKICAgICMgcmVwb3NpdG9yeSBmb3IgdGhpcyBwYWNrYWdlLgogICAgY2Fub25pY2FsID0gJ3B5cGlfX3t9X3t9Jy5mb3JtYXQoc2VsZi5kaXN0cmlidXRpb24oKSwgc2VsZi52ZXJzaW9uKCkpCiAgICAjIEVzY2FwZSBhbnkgaWxsZWdhbCBjaGFyYWN0ZXJzIHdpdGggdW5kZXJzY29yZS4KICAgIHJldHVybiByZS5zdWIoJ1stLitdJywgJ18nLCBjYW5vbmljYWwpCgogIGRlZiBfZGlzdF9pbmZvKHNlbGYpOgogICAgIyBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGRpc3QtaW5mbyBkaXJlY3Rvcnkgd2l0aGluIHRoZSAud2hsIGZpbGUuCiAgICAjIGUuZy4gZ29vZ2xlX2Nsb3VkLTAuMjcuMC1weTIucHkzLW5vbmUtYW55LndobCAtPgogICAgIyAgICAgIGdvb2dsZV9jbG91ZC0wLjI3LjAuZGlzdC1pbmZvCiAgICByZXR1cm4gJ3t9LXt9LmRpc3QtaW5mbycuZm9ybWF0KHNlbGYuZGlzdHJpYnV0aW9uKCksIHNlbGYudmVyc2lvbigpKQoKICBkZWYgbWV0YWRhdGEoc2VsZik6CiAgICAjIEV4dHJhY3QgdGhlIHN0cnVjdHVyZWQgZGF0YSBmcm9tIG1ldGFkYXRhLmpzb24gaW4gdGhlIFdITCdzIGRpc3QtaW5mbwogICAgIyBkaXJlY3RvcnkuCiAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShzZWxmLnBhdGgoKSwgJ3InKSBhcyB3aGw6CiAgICAgICMgZmlyc3QgY2hlY2sgZm9yIG1ldGFkYXRhLmpzb24KICAgICAgdHJ5OgogICAgICAgIHdpdGggd2hsLm9wZW4oc2VsZi5fZGlzdF9pbmZvKCkgKyAnL21ldGFkYXRhLmpzb24nKSBhcyBmOgogICAgICAgICAgcmV0dXJuIGpzb24ubG9hZHMoZi5yZWFkKCkuZGVjb2RlKCJ1dGYtOCIpKQogICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICBwYXNzCiAgICAgICMgZmFsbCBiYWNrIHRvIE1FVEFEQVRBIGZpbGUgKGh0dHBzOi8vd3d3LnB5dGhvbi5vcmcvZGV2L3BlcHMvcGVwLTA0MjcvKQogICAgICB3aXRoIHdobC5vcGVuKHNlbGYuX2Rpc3RfaW5mbygpICsgJy9NRVRBREFUQScpIGFzIGY6CiAgICAgICAgcmV0dXJuIHNlbGYuX3BhcnNlX21ldGFkYXRhKGYucmVhZCgpLmRlY29kZSgidXRmLTgiKSkKCiAgZGVmIG5hbWUoc2VsZik6CiAgICByZXR1cm4gc2VsZi5tZXRhZGF0YSgpLmdldCgnbmFtZScpCgogIGRlZiBkZXBlbmRlbmNpZXMoc2VsZiwgZXh0cmE9Tm9uZSk6CiAgICAiIiJBY2Nlc3MgdGhlIGRlcGVuZGVuY2llcyBvZiB0aGlzIFdoZWVsLgoKICAgIEFyZ3M6CiAgICAgIGV4dHJhOiBpZiBzcGVjaWZpZWQsIGluY2x1ZGUgdGhlIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzCiAgICAgICAgICAgIG9mIHRoZSBuYW1lZCAiZXh0cmEiLgoKICAgIFlpZWxkczoKICAgICAgdGhlIG5hbWVzIG9mIHJlcXVpcmVtZW50cyBmcm9tIHRoZSBtZXRhZGF0YS5qc29uLCBpbiBsZXhpY2FsIG9yZGVyLgogICAgIiIiCiAgICAjIFRPRE8obWF0dG1vb3IpOiBJcyB0aGVyZSBhIHNjaGVtYSB0byBmb2xsb3cgZm9yIHRoaXM/CiAgICBkZXBlbmRlbmN5X3NldCA9IHNldCgpCgogICAgcnVuX3JlcXVpcmVzID0gc2VsZi5tZXRhZGF0YSgpLmdldCgncnVuX3JlcXVpcmVzJywgW10pCiAgICBmb3IgcmVxdWlyZW1lbnQgaW4gcnVuX3JlcXVpcmVzOgogICAgICBpZiByZXF1aXJlbWVudC5nZXQoJ2V4dHJhJykgIT0gZXh0cmE6CiAgICAgICAgIyBNYXRjaCB0aGUgcmVxdWlyZW1lbnRzIGZvciB0aGUgZXh0cmEgd2UncmUgbG9va2luZyBmb3IuCiAgICAgICAgY29udGludWUKICAgICAgbWFya2VyID0gcmVxdWlyZW1lbnQuZ2V0KCdlbnZpcm9ubWVudCcpCiAgICAgIGlmIG1hcmtlciBhbmQgbm90IHBrZ19yZXNvdXJjZXMuZXZhbHVhdGVfbWFya2VyKG1hcmtlcik6CiAgICAgICAgIyBUaGUgY3VycmVudCBlbnZpcm9ubWVudCBkb2VzIG5vdCBtYXRjaCB0aGUgcHJvdmlkZWQgUEVQIDUwOCBtYXJrZXIsCiAgICAgICAgIyBzbyBpZ25vcmUgdGhpcyByZXF1aXJlbWVudC4KICAgICAgICBjb250aW51ZQogICAgICByZXF1aXJlcyA9IHJlcXVpcmVtZW50LmdldCgncmVxdWlyZXMnLCBbXSkKICAgICAgZm9yIGVudHJ5IGluIHJlcXVpcmVzOgogICAgICAgICMgU3RyaXAgb2ZmIGFueSB0cmFpbGluZyB2ZXJzaW9uaW5nIGRhdGEuCiAgICAgICAgcGFydHMgPSByZS5zcGxpdCgnWyA+PD0oKV0nLCBlbnRyeSkKICAgICAgICBkZXBlbmRlbmN5X3NldC5hZGQocGFydHNbMF0pCgogICAgcmV0dXJuIHNvcnRlZChkZXBlbmRlbmN5X3NldCkKCiAgZGVmIGV4dHJhcyhzZWxmKToKICAgIHJldHVybiBzZWxmLm1ldGFkYXRhKCkuZ2V0KCdleHRyYXMnLCBbXSkKCiAgZGVmIGV4cGFuZChzZWxmLCBkaXJlY3RvcnkpOgogICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoc2VsZi5wYXRoKCksICJyIiwgYWxsb3daaXA2ND1UcnVlKSBhcyB3aGw6CiAgICAgICAgd2hsLmV4dHJhY3RhbGwoZGlyZWN0b3J5KQogICAgICAgICMgVGhlIGZvbGxvd2luZyBsb2dpYyBpcyBib3Jyb3dlZCBmcm9tIFBpcDoKICAgICAgICAjIGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3BpcC9ibG9iL2NjNDhjMDdiNjRmMzM4YWM1ZTM0N2Q5MGY2Y2I0ZWZjMjJlZDBkMGIvc3JjL3BpcC9faW50ZXJuYWwvdXRpbHMvdW5wYWNraW5nLnB5I0wyNDAKICAgICAgICBmb3IgaW5mbyBpbiB3aGwuaW5mb2xpc3QoKToKICAgICAgICAgICAgbmFtZSA9IGluZm8uZmlsZW5hbWUKICAgICAgICAgICAgIyBEbyBub3QgYXR0ZW1wdCB0byBtb2RpZnkgZGlyZWN0b3JpZXMuCiAgICAgICAgICAgIGlmIG5hbWUuZW5kc3dpdGgoIi8iKSBvciBuYW1lLmVuZHN3aXRoKCJcXCIpOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgbW9kZSA9IGluZm8uZXh0ZXJuYWxfYXR0ciA+PiAxNgogICAgICAgICAgICAjIGlmIG1vZGUgYW5kIHJlZ3VsYXIgZmlsZSBhbmQgYW55IGV4ZWN1dGUgcGVybWlzc2lvbnMgZm9yCiAgICAgICAgICAgICMgdXNlci9ncm91cC93b3JsZD8KICAgICAgICAgICAgaWYgbW9kZSBhbmQgc3RhdC5TX0lTUkVHKG1vZGUpIGFuZCBtb2RlICYgMG8xMTE6CiAgICAgICAgICAgICAgICBuYW1lID0gb3MucGF0aC5qb2luKGRpcmVjdG9yeSwgbmFtZSkKICAgICAgICAgICAgICAgIHNldF9leHRyYWN0ZWRfZmlsZV90b19kZWZhdWx0X21vZGVfcGx1c19leGVjdXRhYmxlKG5hbWUpCgogICMgX3BhcnNlX21ldGFkYXRhIHBhcnNlcyBNRVRBREFUQSBmaWxlcyBhY2NvcmRpbmcgdG8gaHR0cHM6Ly93d3cucHl0aG9uLm9yZy9kZXYvcGVwcy9wZXAtMDMxNC8KICBkZWYgX3BhcnNlX21ldGFkYXRhKHNlbGYsIGNvbnRlbnQpOgogICAgIyBUT0RPOiBoYW5kbGUgZmllbGRzIG90aGVyIHRoYW4ganVzdCBuYW1lCiAgICBuYW1lX3BhdHRlcm4gPSByZS5jb21waWxlKCdOYW1lOiAoLiopJykKICAgIHJldHVybiB7ICduYW1lJzogbmFtZV9wYXR0ZXJuLnNlYXJjaChjb250ZW50KS5ncm91cCgxKSB9CgoKcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoCiAgICBkZXNjcmlwdGlvbj0nVW5wYWNrIGEgV0hMIGZpbGUgYXMgYSBweV9saWJyYXJ5LicpCgpwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXdobCcsIGFjdGlvbj0nc3RvcmUnLAogICAgICAgICAgICAgICAgICAgIGhlbHA9KCdUaGUgLndobCBmaWxlIHdlIGFyZSBleHBhbmRpbmcuJykpCgpwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXJlcXVpcmVtZW50cycsIGFjdGlvbj0nc3RvcmUnLAogICAgICAgICAgICAgICAgICAgIGhlbHA9J1RoZSBwaXBfaW1wb3J0IGZyb20gd2hpY2ggdG8gZHJhdyBkZXBlbmRlbmNpZXMuJykKCnBhcnNlci5hZGRfYXJndW1lbnQoJy0tZGlyZWN0b3J5JywgYWN0aW9uPSdzdG9yZScsIGRlZmF1bHQ9Jy4nLAogICAgICAgICAgICAgICAgICAgIGhlbHA9J1RoZSBkaXJlY3RvcnkgaW50byB3aGljaCB0byBleHBhbmQgdGhpbmdzLicpCgpwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWV4dHJhcycsIGFjdGlvbj0nYXBwZW5kJywKICAgICAgICAgICAgICAgICAgICBoZWxwPSdUaGUgc2V0IG9mIGV4dHJhcyBmb3Igd2hpY2ggdG8gZ2VuZXJhdGUgbGlicmFyeSB0YXJnZXRzLicpCgpkZWYgbWFpbigpOgogICIiIgogIEdlbmVyYXRlIGEgQlVJTEQgZmlsZSBmb3IgYW4gdW56aXBwZWQgV2hlZWwKCiAgV2UgYWxsb3cgZm9yIGVtcHR5IFB5dGhvbiBzb3VyY2VzIGFzIGZvciBXaGVlbHMgY29udGFpbmluZyBvbmx5IGNvbXBpbGVkIEMgY29kZQogIHRoZXJlIG1heSBiZSBubyBQeXRob24gc291cmNlcyB3aGF0c29ldmVyIChlLmcuIHBhY2thZ2VzIHdyaXR0ZW4gaW4gQ3l0aG9uOiBsaWtlIGBweW1zc3FsYCkuCiAgIiIiCgogIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCiAgd2hsID0gV2hlZWwoYXJncy53aGwpCgogICMgRXh0cmFjdCB0aGUgZmlsZXMgaW50byB0aGUgY3VycmVudCBkaXJlY3RvcnkKICB3aGwuZXhwYW5kKGFyZ3MuZGlyZWN0b3J5KQoKICB3aXRoIG9wZW4ob3MucGF0aC5qb2luKGFyZ3MuZGlyZWN0b3J5LCAnQlVJTEQnKSwgJ3cnKSBhcyBmOgogICAgZi53cml0ZSgiIiIKcGFja2FnZShkZWZhdWx0X3Zpc2liaWxpdHkgPSBbIi8vdmlzaWJpbGl0eTpwdWJsaWMiXSkKCmxvYWQoIkBydWxlc19weXRob24vL3B5dGhvbjpkZWZzLmJ6bCIsICJweV9saWJyYXJ5IikKbG9hZCgie3JlcXVpcmVtZW50c30iLCAicmVxdWlyZW1lbnQiKQoKcHlfbGlicmFyeSgKICAgIG5hbWUgPSAicGtnIiwKICAgIHNyY3MgPSBnbG9iKFsiKiovKi5weSJdLCBhbGxvd19lbXB0eSA9IFRydWUpLAogICAgZGF0YSA9IGdsb2IoWyIqKi8qIl0sIGV4Y2x1ZGU9WyIqKi8qLnB5IiwgIioqLyogKiIsICJCVUlMRCIsICJXT1JLU1BBQ0UiXSksCiAgICAjIFRoaXMgbWFrZXMgdGhpcyBkaXJlY3RvcnkgYSB0b3AtbGV2ZWwgaW4gdGhlIHB5dGhvbiBpbXBvcnQKICAgICMgc2VhcmNoIHBhdGggZm9yIGFueXRoaW5nIHRoYXQgZGVwZW5kcyBvbiB0aGlzLgogICAgaW1wb3J0cyA9IFsiLiJdLAogICAgZGVwcyA9IFt7ZGVwZW5kZW5jaWVzfV0sCikKe2V4dHJhc30iIiIuZm9ybWF0KAogIHJlcXVpcmVtZW50cz1hcmdzLnJlcXVpcmVtZW50cywKICBkZXBlbmRlbmNpZXM9JywnLmpvaW4oWwogICAgJ3JlcXVpcmVtZW50KCIlcyIpJyAlIGQKICAgIGZvciBkIGluIHdobC5kZXBlbmRlbmNpZXMoKQogIF0pLAogIGV4dHJhcz0nXG5cbicuam9pbihbCiAgICAiIiJweV9saWJyYXJ5KAogICAgbmFtZSA9ICJ7ZXh0cmF9IiwKICAgIGRlcHMgPSBbCiAgICAgICAgIjpwa2ciLHtkZXBzfQogICAgXSwKKSIiIi5mb3JtYXQoZXh0cmE9ZXh0cmEsCiAgICAgICAgICAgIGRlcHM9JywnLmpvaW4oWwogICAgICAgICAgICAgICAgJ3JlcXVpcmVtZW50KCIlcyIpJyAlIGRlcAogICAgICAgICAgICAgICAgZm9yIGRlcCBpbiB3aGwuZGVwZW5kZW5jaWVzKGV4dHJhKQogICAgICAgICAgICBdKSkKICAgIGZvciBleHRyYSBpbiBhcmdzLmV4dHJhcyBvciBbXQogIF0pKSkKCmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgbWFpbigpClBLAwQUAAAAAAAAACEAAAAAAAAAAAAAAAAAEgAAAHN1YnBhci9fX2luaXRfXy5weVBLAwQUAAAAAAAAACEAAAAAAAAAAAAAAAAAGgAAAHN1YnBhci9ydW50aW1lL19faW5pdF9fLnB5UEsDBBQAAAAAAAAAIQCPoHM8ty4AALcuAAAZAAAAc3VicGFyL3J1bnRpbWUvc3VwcG9ydC5weSMgQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIwojIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwojIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIwojICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIwojIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAojIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgojIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCiIiIlJ1bnRpbWUgc3VwcG9ydCBjb2RlIGZvciBleGVjdXRhYmxlcyBjcmVhdGVkIGJ5IFN1YnBhci4KCjEuIFRoaXJkLXBhcnR5IG1vZHVsZXMgcmVxdWlyZSBzb21lIFBZVEhPTlBBVEggbWFuaXB1bGF0aW9uLgoKMi4gUHl0aG9uIGNhbiBuYXRpdmVseSBpbXBvcnQgcHl0aG9uIG1vZHVsZXMgZnJvbSBhIHppcCBhcmNoaXZlLCBidXQKICAgQyBleHRlbnNpb24gbW9kdWxlcyByZXF1aXJlIHNvbWUgaGVscC4KCjMuIFJlc291cmNlcyBzdG9yZWQgaW4gYSAucGFyIGZpbGUgbWF5IG5lZWQgdG8gYmUgZXhwb3NlZCBhcyBPUy1sZXZlbAogICBmaWxlcyBpbnN0ZWFkIG9mIFB5dGhvbiBGaWxlIG9iamVjdHMuCgpXZSBob29rIGludG8gdGhlIHBrZ19yZXNvdXJjZXMgbW9kdWxlLCBpZiBwcmVzZW50LCB0byBhY2hpZXZlIDIgYW5kIDMuCgpMaW1pdGF0aW9uczoKCkEuIFJldHJpZXZpbmcgcmVzb3VyY2VzIGZyb20gcGFja2FnZXMKCkl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byBkbyB0aGlzOgogICAgZm4gPSBwa2dfcmVzb3VyY2VzLnJlc291cmNlX2ZpbGVuYW1lKCdteXBhY2thZ2UnLCAnbXlmaWxlJykKQnV0IGluc3RlYWQgb25lIG11c3QgZG8KICAgIGZuID0gcGtnX3Jlc291cmNlcy5yZXNvdXJjZV9maWxlbmFtZSgKICAgICAgICAgICAgIHBrZ19yZXNvdXJjZXMuUmVxdWlyZW1lbnQucGFyc2Uuc3BlYygnbXlwYWNrYWdlJyksCiAgICAgICAgICAgICAnbXlmaWxlJykKCkIuIEV4dHJhY3Rpb24gZGlyCgpZb3Ugc2hvdWxkIGV4cGxpY2l0bHkgc2V0IHRoZSBkZWZhdWx0IGV4dHJhY3Rpb24gZGlyZWN0b3J5LCB2aWEKYHBrZ19yZXNvdXJjZXMuc2V0X2V4dHJhY3Rpb25fcGF0aChteV9kaXJlY3RvcnkpYCwgc2luY2UgdGhlIGRlZmF1bHQKaXMgbm90IHNhZmUuICBGb3IgZXhhbXBsZToKCiAgICB0bXBkaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKICAgIHBrZ19yZXNvdXJjZXMuc2V0X2V4dHJhY3Rpb24odG1wZGlyKQoKWW91IHNob3VsZCBhcnJhbmdlIGZvciB0aGF0IGRpcmVjdG9yeSB0byBiZSBkZWxldGVkIGF0IHNvbWUgcG9pbnQuCk5vdGUgdGhhdCBwa2dfcmVzb3VyY2VzLmNsZWFudXBfcmVzb3VyY2VzKCkgaXMgYW4gdW5pbXBsZW1lbnRlZCBuby1vcCwKc28gdXNlIHNvbWV0aGluZyBlbHNlLiAgRm9yIGV4YW1wbGU6CgogICAgYXRleGl0LnJlZ2lzdGVyKGxhbWJkYTogc2h1dGlsLnJtdHJlZSh0bXBkaXIsIGlnbm9yZV9lcnJvcnM9VHJ1ZSkpCgoiIiIKCmltcG9ydCBhdGV4aXQKaW1wb3J0IG9zCmltcG9ydCBwa2d1dGlsCmltcG9ydCBzaHV0aWwKaW1wb3J0IHN5cwppbXBvcnQgdGVtcGZpbGUKaW1wb3J0IHdhcm5pbmdzCmltcG9ydCB6aXBmaWxlCmltcG9ydCB6aXBpbXBvcnQKCgpkZWYgX2xvZyhtc2cpOgogICAgIiIiUHJpbnQgYSBkZWJ1Z2dpbmcgbWVzc2FnZSBpbiB0aGUgc2FtZSBmb3JtYXQgYXMgcHl0aG9uIC12diBvdXRwdXQiIiIKICAgIGlmIHN5cy5mbGFncy52ZXJib3NlOgogICAgICAgIHN5cy5zdGRlcnIud3JpdGUobXNnKQogICAgICAgIHN5cy5zdGRlcnIud3JpdGUoJ1xuJykKCgpkZWYgX2ZpbmRfYXJjaGl2ZSgpOgogICAgIiIiRmluZCB0aGUgcGF0aCB0byB0aGUgY3VycmVudGx5IGV4ZWN1dGluZyAucGFyIGZpbGUKCiAgICBXZSBkb24ndCBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgcHJlZml4IGlzIG5vbi1lbXB0eS4KICAgICIiIgogICAgbWFpbiA9IHN5cy5tb2R1bGVzLmdldCgnX19tYWluX18nKQogICAgaWYgbm90IG1haW46CiAgICAgICAgX2xvZygnIyBfX21haW5fXyBtb2R1bGUgbm90IGZvdW5kJykKICAgICAgICByZXR1cm4gTm9uZQogICAgbWFpbl9sb2FkZXIgPSBnZXRhdHRyKG1haW4sICdfX2xvYWRlcl9fJykKICAgIGlmIG5vdCBtYWluX2xvYWRlcjoKICAgICAgICBfbG9nKCcjIF9fbWFpbl9fLl9fbG9hZGVyX18gbm90IHNldCcpCiAgICAgICAgcmV0dXJuIE5vbmUKICAgIHByZWZpeCA9IGdldGF0dHIobWFpbl9sb2FkZXIsICdwcmVmaXgnKQogICAgaWYgcHJlZml4ICE9ICcnOgogICAgICAgIF9sb2coJyMgdW5leHBlY3RlZCBwcmVmaXggZm9yIF9fbWFpbl9fLl9fbG9hZGVyX18gaXMgJXMnICUKICAgICAgICAgICAgIG1haW5fbG9hZGVyLnByZWZpeCkKICAgICAgICByZXR1cm4gTm9uZQogICAgYXJjaGl2ZV9wYXRoID0gZ2V0YXR0cihtYWluX2xvYWRlciwgJ2FyY2hpdmUnKQogICAgaWYgbm90IGFyY2hpdmVfcGF0aDoKICAgICAgICBfbG9nKCcjIG1pc3NpbmcgYXJjaGl2ZSBmb3IgX19tYWluX18uX19sb2FkZXJfXycpCiAgICAgICAgcmV0dXJuIE5vbmUKICAgIHJldHVybiBhcmNoaXZlX3BhdGgKCgpkZWYgX2V4dHJhY3RfZmlsZXMoYXJjaGl2ZV9wYXRoKToKICAgICIiIkV4dHJhY3QgdGhlIGNvbnRlbnRzIG9mIHRoaXMgLnBhciBmaWxlIHRvIGRpc2suCgogICAgVGhpcyBjcmVhdGVzIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSwgYW5kIHJlZ2lzdGVycyBhbiBhdGV4aXQKICAgIGhhbmRsZXIgdG8gY2xlYW4gdGhhdCBkaXJlY3Rvcnkgb24gcHJvZ3JhbSBleGl0LiAgRXh0cmFjdGlvbiBhbmQKICAgIGNsZWFudXAgd2lsbCBwb3RlbnRpYWxseSB1c2Ugc2lnbmlmaWNhbnQgdGltZSBhbmQgZGlzayBzcGFjZS4KCiAgICBSZXR1cm5zOgogICAgICAgIERpcmVjdG9yeSB3aGVyZSBjb250ZW50cyB3ZXJlIGV4dHJhY3RlZCB0by4KICAgICIiIgogICAgZXh0cmFjdF9kaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKCiAgICBkZWYgX2V4dHJhY3RfZmlsZXNfY2xlYW51cCgpOgogICAgICAgIHNodXRpbC5ybXRyZWUoZXh0cmFjdF9kaXIsIGlnbm9yZV9lcnJvcnM9VHJ1ZSkKICAgIGF0ZXhpdC5yZWdpc3RlcihfZXh0cmFjdF9maWxlc19jbGVhbnVwKQogICAgX2xvZygnIyBleHRyYWN0aW5nICVzIHRvICVzJyAlIChhcmNoaXZlX3BhdGgsIGV4dHJhY3RfZGlyKSkKCiAgICB6aXBfZmlsZSA9IHppcGZpbGUuWmlwRmlsZShhcmNoaXZlX3BhdGgsIG1vZGU9J3InKQogICAgemlwX2ZpbGUuZXh0cmFjdGFsbChleHRyYWN0X2RpcikKICAgIHppcF9maWxlLmNsb3NlKCkKCiAgICByZXR1cm4gZXh0cmFjdF9kaXIKCgpkZWYgX3ZlcnNpb25fY2hlY2tfcGtnX3Jlc291cmNlcyhwa2dfcmVzb3VyY2VzKToKICAgICIiIkNoZWNrIHRoYXQgcGtnX3Jlc291cmNlcyBzdXBwb3J0cyB0aGUgQVBJcyB3ZSBuZWVkLiIiIgogICAgIyBDaGVjayB0aGF0IHBrZ19yZXNvdXJjZXMgaXMgbmV3IGVub3VnaC4KICAgICMKICAgICMgRGV0ZXJtaW5pbmcgdGhlIHZlcnNpb24gb2YgYW4gYXJiaXRyYXJpbHkgb2xkIHZlcnNpb24gb2YKICAgICMgcGtnX3Jlc291cmNlcyBpcyB0b3VnaCwgc2luY2UgaXQgZG9lc24ndCBoYXZlIGEgdmVyc2lvbiBsaXRlcmFsLAogICAgIyBhbmQgdGhlIGFjY29tcGFueWluZyBzZXR1cHRvb2xzIHBhY2thZ2UgY29tcHV0ZXMgaXRzIHZlcnNpb24KICAgICMgZHluYW1pY2FsbHkgZnJvbSBtZXRhZGF0YSB0aGF0IG1pZ2h0IG5vdCBleGlzdC4gIEFsc28gc2V0dXB0b29scwogICAgIyBtaWdodCBub3QgZXhpc3QsIGVzcGVjaWFsbHkgaW4gdGhlIGNhc2Ugb2YgdGhlIHBpcC12ZW5kb3JlZCBjb3B5CiAgICAjIG9mIHBrZ19yZXNvdXJjZXMuCiAgICAjCiAgICAjIFdlIGRvIGEgZmVhdHVyZSBkZXRlY3Rpb24gaW5zdGVhZC4gIFdlIGV4YW1pbmUKICAgICMgcGtnX3Jlc291cmNlcy5Xb3JraW5nU2V0LmFkZCwgYW5kIHNlZSBpZiBpdCBoYXMgYXQgbGVhc3QgdGhlCiAgICAjIHRoaXJkIGRlZmF1bHQgYXJndW1lbnQgKCdyZXBsYWNlJykuCiAgICB0cnk6CiAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mb1swXSA8IDM6CiAgICAgICAgICAgIGRlZmF1bHRzID0gcGtnX3Jlc291cmNlcy5Xb3JraW5nU2V0LmFkZC5pbV9mdW5jLmZ1bmNfZGVmYXVsdHMKICAgICAgICBlbHNlOgogICAgICAgICAgICBkZWZhdWx0cyA9IHBrZ19yZXNvdXJjZXMuV29ya2luZ1NldC5hZGQuX19kZWZhdWx0c19fCiAgICAgICAgcmV0dXJuIGxlbihkZWZhdWx0cykgPj0gMwogICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgIHJldHVybiBGYWxzZQoKCmRlZiBfc2V0dXBfcGtnX3Jlc291cmNlcyhwa2dfcmVzb3VyY2VzX25hbWUpOgogICAgIiIiU2V0dXAgaG9va3MgaW50byB0aGUgYHBrZ19yZXNvdXJjZXNgIG1vZHVsZQoKICAgIFRoaXMgZW5hYmxlcyB0aGUgcGtnX3Jlc291cmNlcyBtb2R1bGUgdG8gZmluZCBtZXRhZGF0YSBmcm9tIHdoZWVscwogICAgdGhhdCBoYXZlIGJlZW4gaW5jbHVkZWQgaW4gdGhpcyAucGFyIGZpbGUuCgogICAgVGhlIGZ1bmN0aW9ucyBhbmQgY2xhc3NlcyBoZXJlIGFyZSBzY29wZWQgdG8gdGhpcyBmdW5jdGlvbiwgc2luY2UKICAgIHdlIG1pZ2h0IGhhdmUgbXVsdGl0cGxlIHBrZ19yZXNvdXJjZXMgbW9kdWxlcywgb3Igbm9uZS4KICAgICIiIgoKICAgIHRyeToKICAgICAgICBfX2ltcG9ydF9fKHBrZ19yZXNvdXJjZXNfbmFtZSkKICAgICAgICBwa2dfcmVzb3VyY2VzID0gc3lzLm1vZHVsZXMuZ2V0KHBrZ19yZXNvdXJjZXNfbmFtZSkKICAgICAgICBpZiBwa2dfcmVzb3VyY2VzIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybgogICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgICMgU2tpcCBzZXR1cAogICAgICAgIHJldHVybgoKICAgIGlmIG5vdCBfdmVyc2lvbl9jaGVja19wa2dfcmVzb3VyY2VzKHBrZ19yZXNvdXJjZXMpOgogICAgICAgICMgU2tpcCBzZXR1cAogICAgICAgIHJldHVybgoKICAgIGNsYXNzIERpc3RJbmZvTWV0YWRhdGEocGtnX3Jlc291cmNlcy5FZ2dNZXRhZGF0YSk6CiAgICAgICAgIiIiTWV0YWRhdGEgcHJvdmlkZXIgZm9yIHppcCBmaWxlcyBjb250YWluaW5nIC5kaXN0LWluZm8KCiAgICAgICAgSW4gZmluZF9kaXN0X2luZm9faW5femlwKCksIHdlIGNhbGwKICAgICAgICBtZXRhZGF0YS5yZXNvdXJjZV9saXN0ZGlyKGRpcmVjdG9yeV9uYW1lKS4gIEhvd2V2ZXIsIGl0IGRvZXNuJ3QKICAgICAgICB3b3JrIHdpdGggRWdnTWV0YWRhdGEsIGJlY2F1c2UgX3ppcGluZm9fbmFtZSgpIGV4cGVjdHMgdGhlCiAgICAgICAgZGlyZWN0b3J5IG5hbWUgdG8gZW5kIHdpdGggYSAvLCBidXQgbWV0YWRhdGEuX2xpc3RkaXIoKSB3aGljaAogICAgICAgIGV4cGVjdHMgdGhlIGRpcmVjdG9yeSB0byBfbm90XyBlbmQgd2l0aCBhIC8uCgogICAgICAgIFRoZXJlZm9yZSB0aGlzIGNsYXNzIGV4aXN0cy4KICAgICAgICAiIiIKCiAgICAgICAgZGVmIF96aXBpbmZvX25hbWUoc2VsZiwgZnNwYXRoKToKICAgICAgICAgICAgIiIiT3ZlcnJpZGVzIEVnZ01ldGFkYXRhLl96aXBpbmZvX25hbWUiIiIKICAgICAgICAgICAgIyBDb252ZXJ0IGEgdmlydHVhbCBmaWxlbmFtZSAoZnVsbCBwYXRoIHRvIGZpbGUpIGludG8gYQogICAgICAgICAgICAjIHppcGZpbGUgc3VicGF0aCB1c2FibGUgd2l0aCB0aGUgemlwaW1wb3J0IGRpcmVjdG9yeQogICAgICAgICAgICAjIGNhY2hlIGZvciBvdXIgdGFyZ2V0IGFyY2hpdmUKICAgICAgICAgICAgZnNwYXRoID0gZnNwYXRoLnJzdHJpcChvcy5zZXApCiAgICAgICAgICAgIGlmIGZzcGF0aCA9PSBzZWxmLmxvYWRlci5hcmNoaXZlOgogICAgICAgICAgICAgICAgcmV0dXJuICcnCiAgICAgICAgICAgIGlmIGZzcGF0aC5zdGFydHN3aXRoKHNlbGYuemlwX3ByZSk6CiAgICAgICAgICAgICAgICByZXR1cm4gZnNwYXRoW2xlbihzZWxmLnppcF9wcmUpOl0KICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAiJXMgaXMgbm90IGEgc3VicGF0aCBvZiAlcyIgJSAoZnNwYXRoLCBzZWxmLnppcF9wcmUpCiAgICAgICAgICAgICkKCiAgICAgICAgZGVmIF9wYXJ0cyhzZWxmLCB6aXBfcGF0aCk6CiAgICAgICAgICAgICIiIk92ZXJyaWRlcyBFZ2dNZXRhZGF0YS5fcGFydHMiIiIKICAgICAgICAgICAgIyBDb252ZXJ0IGEgemlwZmlsZSBzdWJwYXRoIGludG8gYW4gZWdnLXJlbGF0aXZlIHBhdGggcGFydAogICAgICAgICAgICAjIGxpc3QuCiAgICAgICAgICAgIGZzcGF0aCA9IHNlbGYuemlwX3ByZSArIHppcF9wYXRoCiAgICAgICAgICAgIGlmIGZzcGF0aCA9PSBzZWxmLmVnZ19yb290OgogICAgICAgICAgICAgICAgcmV0dXJuIFtdCiAgICAgICAgICAgIGlmIGZzcGF0aC5zdGFydHN3aXRoKHNlbGYuZWdnX3Jvb3QgKyBvcy5zZXApOgogICAgICAgICAgICAgICAgcmV0dXJuIGZzcGF0aFtsZW4oc2VsZi5lZ2dfcm9vdCkgKyAxOl0uc3BsaXQob3Muc2VwKQogICAgICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigKICAgICAgICAgICAgICAgICIlcyBpcyBub3QgYSBzdWJwYXRoIG9mICVzIiAlIChmc3BhdGgsIHNlbGYuZWdnX3Jvb3QpCiAgICAgICAgICAgICkKCiAgICBkZWYgZmluZF9kaXN0X2luZm9faW5femlwKGltcG9ydGVyLCBwYXRoX2l0ZW0sIG9ubHk9RmFsc2UpOgogICAgICAgICIiIkZpbmQgZGlzdC1pbmZvIHN0eWxlIG1ldGFkYXRhIGluIHppcCBmaWxlcy4KCiAgICAgICAgaW1wb3J0ZXI6IFBFUCAzMDItc3R5bGUgSW1wb3J0ZXIgb2JqZWN0CiAgICAgICAgcGF0aF9pdGVtIChzdHIpOiBmaWxlbmFtZSBvciBwc2V1ZG8tZmlsZW5hbWUgbGlrZToKICAgICAgICAgICAgL3Vzci9zb21lZGlycy9tYWluLnBhcgogICAgICAgICAgICBvcgogICAgICAgICAgICAvdXNyL3NvbWVkaXJzL21haW4ucGFyL3B5cGlfX3BvcnRwaWNrZXJfMV8yXzAKICAgICAgICBvbmx5IChib29sKTogV2UgaWdub3JlIHRoZSBgb25seWAgZmxhZyBiZWNhdXNlIGl0J3Mgbm90IGNsZWFyCiAgICAgICAgICAgIHdoYXQgaXQgc2hvdWxkIGFjdHVhbGx5IGRvIGluIHRoaXMgY2FzZS4KCiAgICAgICAgWWllbGRzIHBrZ19yZXNvdXJjZXMuRGlzdHJpYnV0aW9uIG9iamVjdHMKICAgICAgICAiIiIKICAgICAgICBtZXRhZGF0YSA9IERpc3RJbmZvTWV0YWRhdGEoaW1wb3J0ZXIpCiAgICAgICAgZm9yIHN1Yml0ZW0gaW4gbWV0YWRhdGEucmVzb3VyY2VfbGlzdGRpcignLycpOgogICAgICAgICAgICBiYXNlbmFtZSwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChzdWJpdGVtKQogICAgICAgICAgICBpZiBleHQubG93ZXIoKSA9PSAnLmRpc3QtaW5mbyc6CiAgICAgICAgICAgICAgICAjIFBhcnNlIGRpc3RyaWJ1dGlvbiBuYW1lCiAgICAgICAgICAgICAgICBtYXRjaCA9IHBrZ19yZXNvdXJjZXMuRUdHX05BTUUoYmFzZW5hbWUpCiAgICAgICAgICAgICAgICBwcm9qZWN0X25hbWUgPSAndW5rbm93bicKICAgICAgICAgICAgICAgIGlmIG1hdGNoOgogICAgICAgICAgICAgICAgICAgIHByb2plY3RfbmFtZSA9IG1hdGNoLmdyb3VwKCduYW1lJykKICAgICAgICAgICAgICAgICMgQ3JlYXRlIG1ldGFkYXRhIG9iamVjdAogICAgICAgICAgICAgICAgc3VicGF0aCA9IG9zLnBhdGguam9pbihwYXRoX2l0ZW0sIHN1Yml0ZW0pCiAgICAgICAgICAgICAgICBzdWJtZXRhID0gRGlzdEluZm9NZXRhZGF0YSgKICAgICAgICAgICAgICAgICAgICB6aXBpbXBvcnQuemlwaW1wb3J0ZXIocGF0aF9pdGVtKSkKICAgICAgICAgICAgICAgICMgT3ZlcnJpZGUgcGtnX3Jlc291cmNlcyBkZWZhdWx0cyB0byBhdm9pZAogICAgICAgICAgICAgICAgIyAicmVzb3VyY2VfZmlsZW5hbWUoKSBvbmx5IHN1cHBvcnRlZCBmb3IgLmVnZywgbm90CiAgICAgICAgICAgICAgICAjIC56aXAiIG1lc3NhZ2UKICAgICAgICAgICAgICAgIHN1Ym1ldGEuZWdnX25hbWUgPSBwcm9qZWN0X25hbWUKICAgICAgICAgICAgICAgIHN1Ym1ldGEuZWdnX2luZm8gPSBzdWJwYXRoCiAgICAgICAgICAgICAgICBzdWJtZXRhLmVnZ19yb290ID0gcGF0aF9pdGVtCiAgICAgICAgICAgICAgICBkaXN0ID0gcGtnX3Jlc291cmNlcy5EaXN0cmlidXRpb24uZnJvbV9sb2NhdGlvbigKICAgICAgICAgICAgICAgICAgICBwYXRoX2l0ZW0sIHN1Yml0ZW0sIHN1Ym1ldGEpCiAgICAgICAgICAgICAgICB5aWVsZCBkaXN0CgogICAgZGVmIGZpbmRfZWdnc19hbmRfZGlzdF9pbmZvX2luX3ppcChpbXBvcnRlciwgcGF0aF9pdGVtLCBvbmx5PUZhbHNlKToKICAgICAgICAiIiJDaGFpbiB0b2dldGhlciBvdXIgZmluZGVyIGFuZCB0aGUgc3RhbmRhcmQgcGtnX3Jlc291cmNlcyBmaW5kZXIKCiAgICAgICAgRm9yIHNpbXBsaWNpdHksIGFuZCBzaW5jZSBwa2dfcmVzb3VyY2VzIGRvZXNuJ3QgcHJvdmlkZSBhIHB1YmxpYwogICAgICAgIGludGVyZmFjZSB0byBkbyBzbywgd2UgaGFyZGNvZGUgdGhlIGNoYWluaW5nIChmaW5kX2VnZ3NfaW5femlwKS4KICAgICAgICAiIiIKICAgICAgICAjIE91ciBmaW5kZXIKICAgICAgICBmb3IgZGlzdCBpbiBmaW5kX2Rpc3RfaW5mb19pbl96aXAoaW1wb3J0ZXIsIHBhdGhfaXRlbSwgb25seSk6CiAgICAgICAgICAgIHlpZWxkIGRpc3QKICAgICAgICAjIFRoZSBzdGFuZGFyZCBwa2dfcmVzb3VyY2VzIGZpbmRlcgogICAgICAgIGZvciBkaXN0IGluIHBrZ19yZXNvdXJjZXMuZmluZF9lZ2dzX2luX3ppcChpbXBvcnRlciwgcGF0aF9pdGVtLCBvbmx5KToKICAgICAgICAgICAgeWllbGQgZGlzdAogICAgICAgIHJldHVybgoKICAgICMgVGhpcyBvdmVyd3JpdGVzIHRoZSBleGlzdGluZyByZWdpc3RlcmVkIGZpbmRlci4KICAgIHBrZ19yZXNvdXJjZXMucmVnaXN0ZXJfZmluZGVyKHppcGltcG9ydC56aXBpbXBvcnRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmRfZWdnc19hbmRfZGlzdF9pbmZvX2luX3ppcCkKCiAgICAjIE5vdGUgdGhhdCB0aGUgZGVmYXVsdCBXb3JraW5nU2V0IGhhcyBhbHJlYWR5IGJlZW4gY3JlYXRlZCwgYW5kCiAgICAjIHRoZXJlIGlzIG5vIHB1YmxpYyBpbnRlcmZhY2UgdG8gZWFzaWx5IHJlZnJlc2gvcmVsb2FkIGl0IHRoYXQKICAgICMgZG9lc24ndCBhbHNvIGhhdmUgYSAiRG9uJ3QgdXNlIHRoaXMiIHdhcm5pbmcuICBTbyB3ZSBtYW51YWxseQogICAgIyBhZGQganVzdCB0aGUgZW50cmllcyB3ZSBrbm93IGFib3V0IHRvIHRoZSBleGlzdGluZyBXb3JraW5nU2V0LgogICAgZm9yIGVudHJ5IGluIHN5cy5wYXRoOgogICAgICAgIGltcG9ydGVyID0gcGtndXRpbC5nZXRfaW1wb3J0ZXIoZW50cnkpCiAgICAgICAgaWYgaXNpbnN0YW5jZShpbXBvcnRlciwgemlwaW1wb3J0LnppcGltcG9ydGVyKToKICAgICAgICAgICAgZm9yIGRpc3QgaW4gZmluZF9kaXN0X2luZm9faW5femlwKGltcG9ydGVyLCBlbnRyeSwgb25seT1UcnVlKToKICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZGlzdC5fcHJvdmlkZXIsIERpc3RJbmZvTWV0YWRhdGEpOgogICAgICAgICAgICAgICAgICAgIHBrZ19yZXNvdXJjZXMud29ya2luZ19zZXQuYWRkKGRpc3QsIGVudHJ5LCBpbnNlcnQ9RmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZT1UcnVlKQoKCmRlZiBfaW5pdGlhbGl6ZV9pbXBvcnRfcGF0aChpbXBvcnRfcm9vdHMsIGltcG9ydF9wcmVmaXgpOgogICAgIiIiQWRkIGV4dHJhIGVudHJpZXMgdG8gUFlUSE9OUEFUSCBzbyB0aGF0IG1vZHVsZXMgY2FuIGJlIGltcG9ydGVkLiIiIgogICAgIyBXZSB0cnkgdG8gbWF0Y2ggdG8gb3JkZXIgb2YgQmF6ZWwncyBzdHViCiAgICBmdWxsX3Jvb3RzID0gWwogICAgICAgIG9zLnBhdGguam9pbihpbXBvcnRfcHJlZml4LCBpbXBvcnRfcm9vdCkKICAgICAgICBmb3IgaW1wb3J0X3Jvb3QgaW4gaW1wb3J0X3Jvb3RzXQogICAgc3lzLnBhdGhbMToxXSA9IGZ1bGxfcm9vdHMKICAgIF9sb2coJyMgYWRkaW5nICVzIHRvIHN5cy5wYXRoJyAlIGZ1bGxfcm9vdHMpCgoKZGVmIHNldHVwKGltcG9ydF9yb290cywgemlwX3NhZmUpOgogICAgIiIiSW5pdGlhbGl6ZSBzdWJwYXIgcnVuLXRpbWUgc3VwcG9ydAoKICAgIEFyZ3M6CiAgICAgIGltcG9ydF9yb290IChsaXN0KTogc3ViZGlycyBpbnNpZGUgLnBhciBmaWxlIHRvIGFkZCB0byB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUgaW1wb3J0IHBhdGggYXQgcnVudGltZS4KICAgICAgemlwX3NhZmUgKGJvb2wpOiBJZiBGYWxzZSwgZXh0cmFjdCB0aGUgLnBhciBmaWxlIGNvbnRlbnRzIHRvIGEKICAgICAgICAgICAgICAgICAgICAgICB0ZW1wb3JhcnkgZGlyZWN0b3J5LCBhbmQgaW1wb3J0IGV2ZXJ5dGhpbmcgZnJvbQogICAgICAgICAgICAgICAgICAgICAgIHRoYXQgZGlyZWN0b3J5LgoKICAgIFJldHVybnM6CiAgICAgIFRydWUgaWYgc2V0dXAgd2FzIHN1Y2Nlc3NmdWwsIGVsc2UgRmFsc2UKICAgICIiIgogICAgYXJjaGl2ZV9wYXRoID0gX2ZpbmRfYXJjaGl2ZSgpCiAgICBpZiBub3QgYXJjaGl2ZV9wYXRoOgogICAgICAgIHdhcm5pbmdzLndhcm4oJ0ZhaWxlZCB0byBpbml0aWFsaXplIC5wYXIgZmlsZSBydW50aW1lIHN1cHBvcnQnLAogICAgICAgICAgICAgICAgICAgICAgVXNlcldhcm5pbmcpCiAgICAgICAgcmV0dXJuIEZhbHNlCiAgICBpZiBvcy5wYXRoLmFic3BhdGgoc3lzLnBhdGhbMF0pICE9IG9zLnBhdGguYWJzcGF0aChhcmNoaXZlX3BhdGgpOgogICAgICAgIHdhcm5pbmdzLndhcm4oJ0ZhaWxlZCB0byBpbml0aWFsaXplIC5wYXIgZmlsZSBydW50aW1lIHN1cHBvcnQuICcgKwogICAgICAgICAgICAgICAgICAgICAgJ2FyY2hpdmVfcGF0aCB3YXMgJXIsIHN5cy5wYXRoIHdhcyAlcicgJSAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJjaGl2ZV9wYXRoLCBzeXMucGF0aCksCiAgICAgICAgICAgICAgICAgICAgICBVc2VyV2FybmluZykKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAjIEV4dHJhY3QgZmlsZXMgdG8gZGlzayBpZiBuZWNlc3NhcnkKICAgIGlmIG5vdCB6aXBfc2FmZToKICAgICAgICBleHRyYWN0X2RpciA9IF9leHRyYWN0X2ZpbGVzKGFyY2hpdmVfcGF0aCkKICAgICAgICAjIHN5cy5wYXRoWzBdIGlzIHRoZSBuYW1lIG9mIHRoZSBleGVjdXRpbmcgLnBhciBmaWxlLiAgUG9pbnQKICAgICAgICAjIGl0IHRvIHRoZSBleHRyYWN0IGRpcmVjdG9yeSBpbnN0ZWFkLCBzbyB0aGF0IFB5dGhvbiBzZWFyY2hlcwogICAgICAgICMgdGhlcmUgZm9yIGltcG9ydHMuCiAgICAgICAgc3lzLnBhdGhbMF0gPSBleHRyYWN0X2RpcgogICAgICAgIGltcG9ydF9wcmVmaXggPSBleHRyYWN0X2RpcgogICAgZWxzZTogICMgSW1wb3J0IGRpcmVjdGx5IGZyb20gLnBhciBmaWxlCiAgICAgICAgZXh0cmFjdF9kaXIgPSBOb25lCiAgICAgICAgaW1wb3J0X3ByZWZpeCA9IGFyY2hpdmVfcGF0aAoKICAgICMgSW5pdGlhbGl6ZSBpbXBvcnQgcGF0aAogICAgX2luaXRpYWxpemVfaW1wb3J0X3BhdGgoaW1wb3J0X3Jvb3RzLCBpbXBvcnRfcHJlZml4KQoKICAgICMgQWRkIGhvb2sgZm9yIHBhY2thZ2UgbWV0YWRhdGEKICAgIF9zZXR1cF9wa2dfcmVzb3VyY2VzKCdwa2dfcmVzb3VyY2VzJykKICAgIF9zZXR1cF9wa2dfcmVzb3VyY2VzKCdwaXAuX3ZlbmRvci5wa2dfcmVzb3VyY2VzJykKCiAgICByZXR1cm4gVHJ1ZQpQSwECFAMUAAAAAAAAACEAAAAAAAAAAAAAAAAACwAAAAAAAAAAAAAAAAAXAAAAX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEA9w/vmLEhAACxIQAACwAAAAAAAAAAAAAAAABAAAAAX19tYWluX18ucHlQSwECFAMUAAAAAAAAACEATzlpVeINAADiDQAAJgAAAAAAAAAAAAAAAAAaIgAAYmF6ZWxfdG9vbHMvdG9vbHMvcHl0aG9uL3B5M3dyYXBwZXIuc2hQSwECFAMUAAAAAAAAACEAAAAAAAAAAAAAAAAAKAAAAAAAAAAAAAAAAABAMAAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQCrcTRXBwUAAAcFAABAAAAAAAAAAAAAAAAAAIYwAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC05LjAuMy5kaXN0LWluZm8vREVTQ1JJUFRJT04ucnN0UEsBAhQDFAAAAAAAAAAhADxQfyX5CQAA+QkAADkAAAAAAAAAAAAAAAAA6zUAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwLTkuMC4zLmRpc3QtaW5mby9NRVRBREFUQVBLAQIUAxQAAAAAAAAAIQBX/iPlmGIAAJhiAAA3AAAAAAAAAAAAAAAAADtAAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC05LjAuMy5kaXN0LWluZm8vUkVDT1JEUEsBAhQDFAAAAAAAAAAhAPbd0r5uAAAAbgAAADYAAAAAAAAAAAAAAAAAKKMAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwLTkuMC4zLmRpc3QtaW5mby9XSEVFTFBLAQIUAxQAAAAAAAAAIQC0F5jERAAAAEQAAABBAAAAAAAAAAAAAAAAAOqjAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC05LjAuMy5kaXN0LWluZm8vZW50cnlfcG9pbnRzLnR4dFBLAQIUAxQAAAAAAAAAIQDI4LebHQYAAB0GAAA+AAAAAAAAAAAAAAAAAI2kAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC05LjAuMy5kaXN0LWluZm8vbWV0YWRhdGEuanNvblBLAQIUAxQAAAAAAAAAIQDHH5fCBAAAAAQAAAA+AAAAAAAAAAAAAAAAAAarAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC05LjAuMy5kaXN0LWluZm8vdG9wX2xldmVsLnR4dFBLAQIUAxQAAAAAAAAAIQANW9B2tC4AALQuAAAsAAAAAAAAAAAAAAAAAGarAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQBLSaRlSAIAAEgCAAAsAAAAAAAAAAAAAAAAAGTaAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fX21haW5fXy5weVBLAQIUAxQAAAAAAAAAIQBPvcxIPhIAAD4SAAA0AAAAAAAAAAAAAAAAAPbcAABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAIWJlopgVwAAYFcAADMAAAAAAAAAAAAAAAAAhu8AAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvYXBwZGlycy5weVBLAQIUAxQAAAAAAAAAIQAAVqw6LgEAAC4BAABBAAAAAAAAAAAAAAAAADdHAQBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NhY2hlY29udHJvbC9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQDaVEalKAUAACgFAAA9AAAAAAAAAAAAAAAAAMRIAQBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NhY2hlY29udHJvbC9fY21kLnB5UEsBAhQDFAAAAAAAAAAhAFDmqSwAEgAAABIAAEAAAAAAAAAAAAAAAAAAR04BAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2FjaGVjb250cm9sL2FkYXB0ZXIucHlQSwECFAMUAAAAAAAAACEAEqrG8BYDAAAWAwAAPgAAAAAAAAAAAAAAAAClYAEAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jYWNoZWNvbnRyb2wvY2FjaGUucHlQSwECFAMUAAAAAAAAACEAnh1W/HEBAABxAQAASAAAAAAAAAAAAAAAAAAXZAEAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jYWNoZWNvbnRyb2wvY2FjaGVzL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAMGnBv/MDQAAzA0AAEoAAAAAAAAAAAAAAAAA7mUBAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2FjaGVjb250cm9sL2NhY2hlcy9maWxlX2NhY2hlLnB5UEsBAhQDFAAAAAAAAAAhANOIxlTNAwAAzQMAAEsAAAAAAAAAAAAAAAAAInQBAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2FjaGVjb250cm9sL2NhY2hlcy9yZWRpc19jYWNoZS5weVBLAQIUAxQAAAAAAAAAIQAtPC0zfAEAAHwBAAA/AAAAAAAAAAAAAAAAAFh4AQBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NhY2hlY29udHJvbC9jb21wYXQucHlQSwECFAMUAAAAAAAAACEAx2C53uAyAADgMgAAQwAAAAAAAAAAAAAAAAAxegEAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jYWNoZWNvbnRyb2wvY29udHJvbGxlci5weVBLAQIUAxQAAAAAAAAAIQBsJjR84wkAAOMJAABEAAAAAAAAAAAAAAAAAHKtAQBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NhY2hlY29udHJvbC9maWxld3JhcHBlci5weVBLAQIUAxQAAAAAAAAAIQAOVB78LRAAAC0QAABDAAAAAAAAAAAAAAAAALe3AQBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NhY2hlY29udHJvbC9oZXVyaXN0aWNzLnB5UEsBAhQDFAAAAAAAAAAhABJhgLiIGQAAiBkAAEIAAAAAAAAAAAAAAAAARcgBAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2FjaGVjb250cm9sL3NlcmlhbGl6ZS5weVBLAQIUAxQAAAAAAAAAIQCLe8VC8gEAAPIBAABAAAAAAAAAAAAAAAAAAC3iAQBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NhY2hlY29udHJvbC93cmFwcGVyLnB5UEsBAhQDFAAAAAAAAAAhABRwBUc/AAAAPwAAADwAAAAAAAAAAAAAAAAAfeQBAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2VydGlmaS9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQCDK9rBKQAAACkAAAA8AAAAAAAAAAAAAAAAABblAQBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NlcnRpZmkvX19tYWluX18ucHlQSwECFAMUAAAAAAAAACEABaHa9fAiBADwIgQAOwAAAAAAAAAAAAAAAACZ5QEAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jZXJ0aWZpL2NhY2VydC5wZW1QSwECFAMUAAAAAAAAACEACRNCR0QDAABEAwAAOAAAAAAAAAAAAAAAAADiCAYAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jZXJ0aWZpL2NvcmUucHlQSwECFAMUAAAAAAAAACEA8M8PUxcGAAAXBgAAPAAAAAAAAAAAAAAAAAB8DAYAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhADm/hBAWegAAFnoAADwAAAAAAAAAAAAAAAAA7RIGAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9iaWc1ZnJlcS5weVBLAQIUAxQAAAAAAAAAIQDL52dm3QYAAN0GAAA+AAAAAAAAAAAAAAAAAF2NBgBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvYmlnNXByb2Jlci5weVBLAQIUAxQAAAAAAAAAIQDgWSg9wyQAAMMkAABEAAAAAAAAAAAAAAAAAJaUBgBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvY2hhcmRpc3RyaWJ1dGlvbi5weVBLAQIUAxQAAAAAAAAAIQCJWSSIyw4AAMsOAABGAAAAAAAAAAAAAAAAALu5BgBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvY2hhcnNldGdyb3VwcHJvYmVyLnB5UEsBAhQDFAAAAAAAAAAhAOCXYVr2EwAA9hMAAEEAAAAAAAAAAAAAAAAA6sgGAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9jaGFyc2V0cHJvYmVyLnB5UEsBAhQDFAAAAAAAAAAhAJMG1zIBAAAAAQAAAEAAAAAAAAAAAAAAAAAAP90GAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9jbGkvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAX92tubIKAACyCgAAQgAAAAAAAAAAAAAAAACe3QYAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2NsaS9jaGFyZGV0ZWN0LnB5UEsBAhQDFAAAAAAAAAAhAFz7N0gGDgAABg4AAEYAAAAAAAAAAAAAAAAAsOgGAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9jb2RpbmdzdGF0ZW1hY2hpbmUucHlQSwECFAMUAAAAAAAAACEAfIblZW4EAABuBAAAOgAAAAAAAAAAAAAAAAAa9wYAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2NvbXBhdC5weVBLAQIUAxQAAAAAAAAAIQC9QpoxPwcAAD8HAAA/AAAAAAAAAAAAAAAAAOD7BgBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvY3A5NDlwcm9iZXIucHlQSwECFAMUAAAAAAAAACEARASsyX0GAAB9BgAAOQAAAAAAAAAAAAAAAAB8AwcAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2VudW1zLnB5UEsBAhQDFAAAAAAAAAAhAASIBT1uDwAAbg8AAD0AAAAAAAAAAAAAAAAAUAoHAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9lc2Nwcm9iZXIucHlQSwECFAMUAAAAAAAAACEAwQpgog4pAAAOKQAAOQAAAAAAAAAAAAAAAAAZGgcAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2VzY3NtLnB5UEsBAhQDFAAAAAAAAAAhACA3xNClDgAApQ4AAD8AAAAAAAAAAAAAAAAAfkMHAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9ldWNqcHByb2Jlci5weVBLAQIUAxQAAAAAAAAAIQD0QQN56jQAAOo0AAA9AAAAAAAAAAAAAAAAAIBSBwBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvZXVja3JmcmVxLnB5UEsBAhQDFAAAAAAAAAAhACYFl/jUBgAA1AYAAD8AAAAAAAAAAAAAAAAAxYcHAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9ldWNrcnByb2Jlci5weVBLAQIUAxQAAAAAAAAAIQDM20nVhXsAAIV7AAA9AAAAAAAAAAAAAAAAAPaOBwBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvZXVjdHdmcmVxLnB5UEsBAhQDFAAAAAAAAAAhAKBBjRjTBgAA0wYAAD8AAAAAAAAAAAAAAAAA1goIAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9ldWN0d3Byb2Jlci5weVBLAQIUAxQAAAAAAAAAIQAZRdLX61AAAOtQAAA+AAAAAAAAAAAAAAAAAAYSCABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvZ2IyMzEyZnJlcS5weVBLAQIUAxQAAAAAAAAAIQB+q/6P2gYAANoGAABAAAAAAAAAAAAAAAAAAE1jCABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvZ2IyMzEycHJvYmVyLnB5UEsBAhQDFAAAAAAAAAAhAA0p07IONgAADjYAAEAAAAAAAAAAAAAAAAAAhWoIAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9oZWJyZXdwcm9iZXIucHlQSwECFAMUAAAAAAAAACEAwho5YbFkAACxZAAAOwAAAAAAAAAAAAAAAADxoAgAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2ppc2ZyZXEucHlQSwECFAMUAAAAAAAAACEABnklartMAAC7TAAAOgAAAAAAAAAAAAAAAAD7BQkAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2pwY250eC5weVBLAQIUAxQAAAAAAAAAIQDwaMnKJzIAACcyAABGAAAAAAAAAAAAAAAAAA5TCQBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvbGFuZ2J1bGdhcmlhbm1vZGVsLnB5UEsBAhQDFAAAAAAAAAAhAMjxVpscRgAAHEYAAEUAAAAAAAAAAAAAAAAAmYUJAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9sYW5nY3lyaWxsaWNtb2RlbC5weVBLAQIUAxQAAAAAAAAAIQD+u68pkDEAAJAxAABCAAAAAAAAAAAAAAAAABjMCQBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvbGFuZ2dyZWVrbW9kZWwucHlQSwECFAMUAAAAAAAAACEAj2atGFEsAABRLAAAQwAAAAAAAAAAAAAAAAAI/gkAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2xhbmdoZWJyZXdtb2RlbC5weVBLAQIUAxQAAAAAAAAAIQDDwVWAMDEAADAxAABGAAAAAAAAAAAAAAAAALoqCgBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvbGFuZ2h1bmdhcmlhbm1vZGVsLnB5UEsBAhQDFAAAAAAAAAAhACIP0j8aLAAAGiwAAEEAAAAAAAAAAAAAAAAATlwKAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9sYW5ndGhhaW1vZGVsLnB5UEsBAhQDFAAAAAAAAAAhALUyw2ReKwAAXisAAEQAAAAAAAAAAAAAAAAAx4gKAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9sYW5ndHVya2lzaG1vZGVsLnB5UEsBAhQDFAAAAAAAAAAhAOTs8KT6FAAA+hQAAEAAAAAAAAAAAAAAAAAAh7QKAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9sYXRpbjFwcm9iZXIucHlQSwECFAMUAAAAAAAAACEANnUYTVUNAABVDQAAQwAAAAAAAAAAAAAAAADfyQoAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L21iY2hhcnNldHByb2Jlci5weVBLAQIUAxQAAAAAAAAAIQCt0xGo3AcAANwHAABDAAAAAAAAAAAAAAAAAJXXCgBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvbWJjc2dyb3VwcHJvYmVyLnB5UEsBAhQDFAAAAAAAAAAhAGn24Q+JYwAAiWMAADoAAAAAAAAAAAAAAAAA0t8KAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9tYmNzc20ucHlQSwECFAMUAAAAAAAAACEAHnXvHhkWAAAZFgAAQwAAAAAAAAAAAAAAAACzQwsAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L3NiY2hhcnNldHByb2Jlci5weVBLAQIUAxQAAAAAAAAAIQCK/k+g2g0AANoNAABDAAAAAAAAAAAAAAAAAC1aCwBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvc2Jjc2dyb3VwcHJvYmVyLnB5UEsBAhQDFAAAAAAAAAAhANaRZzK+DgAAvg4AAD4AAAAAAAAAAAAAAAAAaGgLAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9zamlzcHJvYmVyLnB5UEsBAhQDFAAAAAAAAAAhAHWARz3FMAAAxTAAAEUAAAAAAAAAAAAAAAAAgncLAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC91bml2ZXJzYWxkZXRlY3Rvci5weVBLAQIUAxQAAAAAAAAAIQD1v7w9zgoAAM4KAAA+AAAAAAAAAAAAAAAAAKqoCwBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvdXRmOHByb2Jlci5weVBLAQIUAxQAAAAAAAAAIQBHx5DX8gAAAPIAAAA7AAAAAAAAAAAAAAAAANSzCwBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvdmVyc2lvbi5weVBLAQIUAxQAAAAAAAAAIQBY1Gk58AAAAPAAAAA9AAAAAAAAAAAAAAAAAB+1CwBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NvbG9yYW1hL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAD4Vp1/cCQAA3AkAADkAAAAAAAAAAAAAAAAAarYLAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY29sb3JhbWEvYW5zaS5weVBLAQIUAxQAAAAAAAAAIQDHY8DZxCUAAMQlAABAAAAAAAAAAAAAAAAAAJ3ACwBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NvbG9yYW1hL2Fuc2l0b3dpbjMyLnB5UEsBAhQDFAAAAAAAAAAhAH3W2C99BwAAfQcAAD8AAAAAAAAAAAAAAAAAv+YLAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY29sb3JhbWEvaW5pdGlhbGlzZS5weVBLAQIUAxQAAAAAAAAAIQANbaI99RQAAPUUAAA6AAAAAAAAAAAAAAAAAJnuCwBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NvbG9yYW1hL3dpbjMyLnB5UEsBAhQDFAAAAAAAAAAhAHd7ZyGSGAAAkhgAADwAAAAAAAAAAAAAAAAA5gMMAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY29sb3JhbWEvd2ludGVybS5weVBLAQIUAxQAAAAAAAAAIQAmnFGXRQIAAEUCAAA8AAAAAAAAAAAAAAAAANIcDABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAI+9n/BIBAAASAQAARgAAAAAAAAAAAAAAAABxHwwAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0bGliL19iYWNrcG9ydC9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQCvii9lywMAAMsDAABCAAAAAAAAAAAAAAAAAOcgDABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvX2JhY2twb3J0L21pc2MucHlQSwECFAMUAAAAAAAAACEA4mI90C9kAAAvZAAARAAAAAAAAAAAAAAAAAASJQwAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0bGliL19iYWNrcG9ydC9zaHV0aWwucHlQSwECFAMUAAAAAAAAACEAbxYArTkKAAA5CgAASAAAAAAAAAAAAAAAAACjiQwAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0bGliL19iYWNrcG9ydC9zeXNjb25maWcuY2ZnUEsBAhQDFAAAAAAAAAAhADYPUtZLaQAAS2kAAEcAAAAAAAAAAAAAAAAAQpQMAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvZGlzdGxpYi9fYmFja3BvcnQvc3lzY29uZmlnLnB5UEsBAhQDFAAAAAAAAAAhAERCH0PUaQEA1GkBAEUAAAAAAAAAAAAAAAAA8v0MAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvZGlzdGxpYi9fYmFja3BvcnQvdGFyZmlsZS5weVBLAQIUAxQAAAAAAAAAIQBfCXNgYZ8AAGGfAAA6AAAAAAAAAAAAAAAAACloDgBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvY29tcGF0LnB5UEsBAhQDFAAAAAAAAAAhADoKw7wIwgAACMIAADwAAAAAAAAAAAAAAAAA4gcPAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvZGlzdGxpYi9kYXRhYmFzZS5weVBLAQIUAxQAAAAAAAAAIQCDOOItXVIAAF1SAAA5AAAAAAAAAAAAAAAAAETKDwBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvaW5kZXgucHlQSwECFAMUAAAAAAAAACEA0cV4r0XHAABFxwAAPAAAAAAAAAAAAAAAAAD4HBAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0bGliL2xvY2F0b3JzLnB5UEsBAhQDFAAAAAAAAAAhAIaXtZvaOQAA2jkAADwAAAAAAAAAAAAAAAAAl+QQAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvZGlzdGxpYi9tYW5pZmVzdC5weVBLAQIUAxQAAAAAAAAAIQA9Ea4CihgAAIoYAAA7AAAAAAAAAAAAAAAAAMseEQBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvbWFya2Vycy5weVBLAQIUAxQAAAAAAAAAIQANpmzxsZcAALGXAAA8AAAAAAAAAAAAAAAAAK43EQBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvbWV0YWRhdGEucHlQSwECFAMUAAAAAAAAACEAyLdFmA4qAAAOKgAAPQAAAAAAAAAAAAAAAAC5zxEAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0bGliL3Jlc291cmNlcy5weVBLAQIUAxQAAAAAAAAAIQC6/+vbeDsAAHg7AAA7AAAAAAAAAAAAAAAAACL6EQBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvc2NyaXB0cy5weVBLAQIUAxQAAAAAAAAAIQD1mJAMAFwBAABcAQA4AAAAAAAAAAAAAAAAAPM1EgBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvdDMyLmV4ZVBLAQIUAxQAAAAAAAAAIQCe4sVZAH4BAAB+AQA4AAAAAAAAAAAAAAAAAEmSEwBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvdDY0LmV4ZVBLAQIUAxQAAAAAAAAAIQA32AEl/84AAP/OAAA4AAAAAAAAAAAAAAAAAJ8QFQBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvdXRpbC5weVBLAQIUAxQAAAAAAAAAIQCg/QVWn1wAAJ9cAAA7AAAAAAAAAAAAAAAAAPTfFQBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvdmVyc2lvbi5weVBLAQIUAxQAAAAAAAAAIQDYfQCJAE4BAABOAQA4AAAAAAAAAAAAAAAAAOw8FgBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvdzMyLmV4ZVBLAQIUAxQAAAAAAAAAIQBezEvvAHABAABwAQA4AAAAAAAAAAAAAAAAAEKLFwBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvdzY0LmV4ZVBLAQIUAxQAAAAAAAAAIQBf1KCpy5gAAMuYAAA5AAAAAAAAAAAAAAAAAJj7GABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvd2hlZWwucHlQSwECFAMUAAAAAAAAACEAkcHArs2VAADNlQAAMgAAAAAAAAAAAAAAAAC6lBkAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0cm8ucHlQSwECFAMUAAAAAAAAACEAopuZnAwDAAAMAwAAPQAAAAAAAAAAAAAAAADXKhoAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQDVeA7iQUEAAEFBAAA+AAAAAAAAAAAAAAAAAD4uGgBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL19paGF0ZXhtbC5weVBLAQIUAxQAAAAAAAAAIQAeDG01FH8AABR/AABBAAAAAAAAAAAAAAAAANtvGgBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL19pbnB1dHN0cmVhbS5weVBLAQIUAxQAAAAAAAAAIQDERmoWJCsBACQrAQA/AAAAAAAAAAAAAAAAAE7vGgBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL190b2tlbml6ZXIucHlQSwECFAMUAAAAAAAAACEA79OvDyEBAAAhAQAAQwAAAAAAAAAAAAAAAADPGhwAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi9fdHJpZS9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQDMlT6W0wMAANMDAABAAAAAAAAAAAAAAAAAAFEcHABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL190cmllL19iYXNlLnB5UEsBAhQDFAAAAAAAAAAhACRVnamaBAAAmgQAAEEAAAAAAAAAAAAAAAAAgiAcAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvX3RyaWUvZGF0cmllLnB5UEsBAhQDFAAAAAAAAAAhAEtPbs7vBgAA7wYAAD0AAAAAAAAAAAAAAAAAeyUcAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvX3RyaWUvcHkucHlQSwECFAMUAAAAAAAAACEAJuOuWAAQAAAAEAAAOwAAAAAAAAAAAAAAAADFLBwAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi9fdXRpbHMucHlQSwECFAMUAAAAAAAAACEAyKR9/rtFAQC7RQEAPgAAAAAAAAAAAAAAAAAePRwAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi9jb25zdGFudHMucHlQSwECFAMUAAAAAAAAACEAAAAAAAAAAAAAAAAARQAAAAAAAAAAAAAAAAA1gx0AcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi9maWx0ZXJzL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAG7QfIBtAgAAbQIAAFMAAAAAAAAAAAAAAAAAmIMdAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvZmlsdGVycy9hbHBoYWJldGljYWxhdHRyaWJ1dGVzLnB5UEsBAhQDFAAAAAAAAAAhACKA+8QeAQAAHgEAAEEAAAAAAAAAAAAAAAAAdoYdAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvZmlsdGVycy9iYXNlLnB5UEsBAhQDFAAAAAAAAAAhACHAPIy2CgAAtgoAAFAAAAAAAAAAAAAAAAAA84cdAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvZmlsdGVycy9pbmplY3RfbWV0YV9jaGFyc2V0LnB5UEsBAhQDFAAAAAAAAAAhAH3r0rUlDQAAJQ0AAEEAAAAAAAAAAAAAAAAAF5MdAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvZmlsdGVycy9saW50LnB5UEsBAhQDFAAAAAAAAAAhACHtnSQmKQAAJikAAEkAAAAAAAAAAAAAAAAAm6AdAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvZmlsdGVycy9vcHRpb25hbHRhZ3MucHlQSwECFAMUAAAAAAAAACEAmh5UmBhiAAAYYgAARgAAAAAAAAAAAAAAAAAoyh0AcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi9maWx0ZXJzL3Nhbml0aXplci5weVBLAQIUAxQAAAAAAAAAIQCfjmqtcwQAAHMEAABHAAAAAAAAAAAAAAAAAKQsHgBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL2ZpbHRlcnMvd2hpdGVzcGFjZS5weVBLAQIUAxQAAAAAAAAAIQBj2HfcsskBALLJAQBAAAAAAAAAAAAAAAAAAHwxHgBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL2h0bWw1cGFyc2VyLnB5UEsBAhQDFAAAAAAAAAAhANzHuzRhNwAAYTcAAD8AAAAAAAAAAAAAAAAAjPsfAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvc2VyaWFsaXplci5weVBLAQIUAxQAAAAAAAAAIQCCMmMk0AAAANAAAABKAAAAAAAAAAAAAAAAAEozIABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL3RyZWVhZGFwdGVycy9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQAxJ8e+EwYAABMGAABIAAAAAAAAAAAAAAAAAII0IABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL3RyZWVhZGFwdGVycy9nZW5zaGkucHlQSwECFAMUAAAAAAAAACEA5FxfEH0GAAB9BgAARQAAAAAAAAAAAAAAAAD7OiAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi90cmVlYWRhcHRlcnMvc2F4LnB5UEsBAhQDFAAAAAAAAAAhAEfZN25ODQAATg0AAEoAAAAAAAAAAAAAAAAA20EgAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvdHJlZWJ1aWxkZXJzL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAETKVqp2NgAAdjYAAEYAAAAAAAAAAAAAAAAAkU8gAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvdHJlZWJ1aWxkZXJzL2Jhc2UucHlQSwECFAMUAAAAAAAAACEACOou+IMiAACDIgAARQAAAAAAAAAAAAAAAABrhiAAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi90cmVlYnVpbGRlcnMvZG9tLnB5UEsBAhQDFAAAAAAAAAAhAKF9l/DcMQAA3DEAAEcAAAAAAAAAAAAAAAAAUakgAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvdHJlZWJ1aWxkZXJzL2V0cmVlLnB5UEsBAhQDFAAAAAAAAAAhANr+StBRNwAAUTcAAEwAAAAAAAAAAAAAAAAAktsgAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvdHJlZWJ1aWxkZXJzL2V0cmVlX2x4bWwucHlQSwECFAMUAAAAAAAAACEAc0QhlqgVAACoFQAASQAAAAAAAAAAAAAAAABNEyEAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi90cmVld2Fsa2Vycy9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQBNI5jASxMAAEsTAABFAAAAAAAAAAAAAAAAAFwpIQBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL3RyZWV3YWxrZXJzL2Jhc2UucHlQSwECFAMUAAAAAAAAACEAZYpvqYUFAACFBQAARAAAAAAAAAAAAAAAAAAKPSEAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi90cmVld2Fsa2Vycy9kb20ucHlQSwECFAMUAAAAAAAAACEAIsEQMUwSAABMEgAARgAAAAAAAAAAAAAAAADxQiEAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi90cmVld2Fsa2Vycy9ldHJlZS5weVBLAQIUAxQAAAAAAAAAIQCWDZxHpRgAAKUYAABLAAAAAAAAAAAAAAAAAKFVIQBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL3RyZWV3YWxrZXJzL2V0cmVlX2x4bWwucHlQSwECFAMUAAAAAAAAACEAE19tEAUJAAAFCQAARwAAAAAAAAAAAAAAAACvbiEAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi90cmVld2Fsa2Vycy9nZW5zaGkucHlQSwECFAMUAAAAAAAAACEAAEdcmzoAAAA6AAAAOQAAAAAAAAAAAAAAAAAZeCEAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9pZG5hL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAPNI1OnjDAAA4wwAADYAAAAAAAAAAAAAAAAAqnghAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaWRuYS9jb2RlYy5weVBLAQIUAxQAAAAAAAAAIQB8gZZw6AAAAOgAAAA3AAAAAAAAAAAAAAAAAOGFIQBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2lkbmEvY29tcGF0LnB5UEsBAhQDFAAAAAAAAAAhAAku+nF+LAAAfiwAADUAAAAAAAAAAAAAAAAAHochAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaWRuYS9jb3JlLnB5UEsBAhQDFAAAAAAAAAAhAGO8+hHngAAA54AAADkAAAAAAAAAAAAAAAAA77MhAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaWRuYS9pZG5hZGF0YS5weVBLAQIUAxQAAAAAAAAAIQC3Y/Sy1QYAANUGAAA6AAAAAAAAAAAAAAAAAC01IgBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2lkbmEvaW50cmFuZ2VzLnB5UEsBAhQDFAAAAAAAAAAhABvnfaIVAAAAFQAAAD0AAAAAAAAAAAAAAAAAWjwiAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaWRuYS9wYWNrYWdlX2RhdGEucHlQSwECFAMUAAAAAAAAACEAyYWFhXDSAgBw0gIAOgAAAAAAAAAAAAAAAADKPCIAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9pZG5hL3V0czQ2ZGF0YS5weVBLAQIUAxQAAAAAAAAAIQDdxKYFMDkBADA5AQA1AAAAAAAAAAAAAAAAAJIPJQBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2lwYWRkcmVzcy5weVBLAQIUAxQAAAAAAAAAIQDzmSOAmyQAAJskAAA9AAAAAAAAAAAAAAAAABVJJgBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2xvY2tmaWxlL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhACve8idcCgAAXAoAAEEAAAAAAAAAAAAAAAAAC24mAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvbG9ja2ZpbGUvbGlua2xvY2tmaWxlLnB5UEsBAhQDFAAAAAAAAAAhACEmvH4YDAAAGAwAAEIAAAAAAAAAAAAAAAAAxngmAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvbG9ja2ZpbGUvbWtkaXJsb2NrZmlsZS5weVBLAQIUAxQAAAAAAAAAIQAgPHItyhcAAMoXAABAAAAAAAAAAAAAAAAAAD6FJgBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2xvY2tmaWxlL3BpZGxvY2tmaWxlLnB5UEsBAhQDFAAAAAAAAAAhALuF8L2CFQAAghUAAEMAAAAAAAAAAAAAAAAAZp0mAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvbG9ja2ZpbGUvc3FsaXRlbG9ja2ZpbGUucHlQSwECFAMUAAAAAAAAACEAkSMJ2TgKAAA4CgAARAAAAAAAAAAAAAAAAABJsyYAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9sb2NrZmlsZS9zeW1saW5rbG9ja2ZpbGUucHlQSwECFAMUAAAAAAAAACEA1lIZI/4PAAD+DwAANwAAAAAAAAAAAAAAAADjvSYAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9vcmRlcmVkZGljdC5weVBLAQIUAxQAAAAAAAAAIQA8KVjG0AIAANACAAA/AAAAAAAAAAAAAAAAADbOJgBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3BhY2thZ2luZy9fX2Fib3V0X18ucHlQSwECFAMUAAAAAAAAACEAgXaWygECAAABAgAAPgAAAAAAAAAAAAAAAABj0SYAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9wYWNrYWdpbmcvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEA5mlK41wDAABcAwAAPQAAAAAAAAAAAAAAAADA0yYAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9wYWNrYWdpbmcvX2NvbXBhdC5weVBLAQIUAxQAAAAAAAAAIQD6/aQSiAUAAIgFAABBAAAAAAAAAAAAAAAAAHfXJgBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3BhY2thZ2luZy9fc3RydWN0dXJlcy5weVBLAQIUAxQAAAAAAAAAIQB9LCtXJiAAACYgAAA9AAAAAAAAAAAAAAAAAF7dJgBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3BhY2thZ2luZy9tYXJrZXJzLnB5UEsBAhQDFAAAAAAAAAAhAK4Rn/PnEAAA5xAAAEIAAAAAAAAAAAAAAAAA3/0mAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcGFja2FnaW5nL3JlcXVpcmVtZW50cy5weVBLAQIUAxQAAAAAAAAAIQB8RYOMeW0AAHltAABAAAAAAAAAAAAAAAAAACYPJwBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3BhY2thZ2luZy9zcGVjaWZpZXJzLnB5UEsBAhQDFAAAAAAAAAAhAMXqJw+lAQAApQEAADsAAAAAAAAAAAAAAAAA/XwnAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcGFja2FnaW5nL3V0aWxzLnB5UEsBAhQDFAAAAAAAAAAhAA7vxqEkLQAAJC0AAD0AAAAAAAAAAAAAAAAA+34nAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcGFja2FnaW5nL3ZlcnNpb24ucHlQSwECFAMUAAAAAAAAACEAyS1AJj6TAQA+kwEAQgAAAAAAAAAAAAAAAAB6rCcAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9wa2dfcmVzb3VyY2VzL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAPpacYzPCwAAzwsAAD0AAAAAAAAAAAAAAAAAGEApAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcHJvZ3Jlc3MvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAD8NGA30KAAB9CgAAOAAAAAAAAAAAAAAAAABCTCkAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9wcm9ncmVzcy9iYXIucHlQSwECFAMUAAAAAAAAACEAKn/xMN4FAADeBQAAPAAAAAAAAAAAAAAAAAAVVykAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9wcm9ncmVzcy9jb3VudGVyLnB5UEsBAhQDFAAAAAAAAAAhAM7sD04mCwAAJgsAADwAAAAAAAAAAAAAAAAATV0pAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcHJvZ3Jlc3MvaGVscGVycy5weVBLAQIUAxQAAAAAAAAAIQB3CFJ7IgUAACIFAAA8AAAAAAAAAAAAAAAAAM1oKQBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3Byb2dyZXNzL3NwaW5uZXIucHlQSwECFAMUAAAAAAAAACEAwSB0jqtrAwCrawMANQAAAAAAAAAAAAAAAABJbikAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9weXBhcnNpbmcucHlQSwECFAMUAAAAAAAAACEAYB4HjQUDAAAFAwAANQAAAAAAAAAAAAAAAABH2iwAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9yZS12ZW5kb3IucHlQSwECFAMUAAAAAAAAACEAH8buMPcNAAD3DQAAPQAAAAAAAAAAAAAAAACf3SwAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9yZXF1ZXN0cy9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQDffHkltAEAALQBAABAAAAAAAAAAAAAAAAAAPHrLABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3JlcXVlc3RzL19fdmVyc2lvbl9fLnB5UEsBAhQDFAAAAAAAAAAhAIipObtIBAAASAQAAEQAAAAAAAAAAAAAAAAAA+4sAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvX2ludGVybmFsX3V0aWxzLnB5UEsBAhQDFAAAAAAAAAAhACNQ3lIYUgAAGFIAAD0AAAAAAAAAAAAAAAAArfIsAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvYWRhcHRlcnMucHlQSwECFAMUAAAAAAAAACEAmGPoL10YAABdGAAAOAAAAAAAAAAAAAAAAAAgRS0AcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9yZXF1ZXN0cy9hcGkucHlQSwECFAMUAAAAAAAAACEAA63ykgAmAAAAJgAAOQAAAAAAAAAAAAAAAADTXS0AcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9yZXF1ZXN0cy9hdXRoLnB5UEsBAhQDFAAAAAAAAAAhAAWh2vXwIgQA8CIEADwAAAAAAAAAAAAAAAAAKoQtAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvY2FjZXJ0LnBlbVBLAQIUAxQAAAAAAAAAIQCCsqLP0QEAANEBAAA6AAAAAAAAAAAAAAAAAHSnMQBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3JlcXVlc3RzL2NlcnRzLnB5UEsBAhQDFAAAAAAAAAAhAHfJYU1aBgAAWgYAADsAAAAAAAAAAAAAAAAAnakxAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvY29tcGF0LnB5UEsBAhQDFAAAAAAAAAAhABNDyTMgRwAAIEcAADwAAAAAAAAAAAAAAAAAULAxAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvY29va2llcy5weVBLAQIUAxQAAAAAAAAAIQD5zunQKwwAACsMAAA/AAAAAAAAAAAAAAAAAMr3MQBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3JlcXVlc3RzL2V4Y2VwdGlvbnMucHlQSwECFAMUAAAAAAAAACEAhB1g4lMOAABTDgAAOQAAAAAAAAAAAAAAAABSBDIAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9yZXF1ZXN0cy9oZWxwLnB5UEsBAhQDFAAAAAAAAAAhAHnao8r/AgAA/wIAADoAAAAAAAAAAAAAAAAA/BIyAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvaG9va3MucHlQSwECFAMUAAAAAAAAACEAZX1HdAOFAAADhQAAOwAAAAAAAAAAAAAAAABTFjIAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9yZXF1ZXN0cy9tb2RlbHMucHlQSwECFAMUAAAAAAAAACEAEjzegbcCAAC3AgAAPQAAAAAAAAAAAAAAAACvmzIAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9yZXF1ZXN0cy9wYWNrYWdlcy5weVBLAQIUAxQAAAAAAAAAIQBfn2aZmmsAAJprAAA9AAAAAAAAAAAAAAAAAMGeMgBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3JlcXVlc3RzL3Nlc3Npb25zLnB5UEsBAhQDFAAAAAAAAAAhAEE41+L7DAAA+wwAAEEAAAAAAAAAAAAAAAAAtgozAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvc3RhdHVzX2NvZGVzLnB5UEsBAhQDFAAAAAAAAAAhAOYgyg/ECwAAxAsAAD8AAAAAAAAAAAAAAAAAEBgzAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvc3RydWN0dXJlcy5weVBLAQIUAxQAAAAAAAAAIQBHwdlXBGwAAARsAAA6AAAAAAAAAAAAAAAAADEkMwBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3JlcXVlc3RzL3V0aWxzLnB5UEsBAhQDFAAAAAAAAAAhACF7vAr0JgAA9CYAADQAAAAAAAAAAAAAAAAAjZAzAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmV0cnlpbmcucHlQSwECFAMUAAAAAAAAACEAmVhNWpJ1AACSdQAALwAAAAAAAAAAAAAAAADTtzMAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9zaXgucHlQSwECFAMUAAAAAAAAACEAkj71hyULAAAlCwAAPAAAAAAAAAAAAAAAAACyLTQAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAAAZ05TcJwAA3CcAAEAAAAAAAAAAAAAAAAAAMTk0AHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9fY29sbGVjdGlvbnMucHlQSwECFAMUAAAAAAAAACEAYISup8syAADLMgAAPgAAAAAAAAAAAAAAAABrYTQAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL2Nvbm5lY3Rpb24ucHlQSwECFAMUAAAAAAAAACEAFxocbx6KAAAeigAAQgAAAAAAAAAAAAAAAACSlDQAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL2Nvbm5lY3Rpb25wb29sLnB5UEsBAhQDFAAAAAAAAAAhAAAAAAAAAAAAAAAAAEQAAAAAAAAAAAAAAAAAEB81AHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9jb250cmliL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAAAAAAAAAAAAAAAAAFUAAAAAAAAAAAAAAAAAch81AHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9jb250cmliL19zZWN1cmV0cmFuc3BvcnQvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAt1mLfZhEAACYRAAAVQAAAAAAAAAAAAAAAADlHzUAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL2NvbnRyaWIvX3NlY3VyZXRyYW5zcG9ydC9iaW5kaW5ncy5weVBLAQIUAxQAAAAAAAAAIQAEr9yQHi8AAB4vAABWAAAAAAAAAAAAAAAAAPBkNQBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvY29udHJpYi9fc2VjdXJldHJhbnNwb3J0L2xvd19sZXZlbC5weVBLAQIUAxQAAAAAAAAAIQAYw62TcSoAAHEqAABFAAAAAAAAAAAAAAAAAIKUNQBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvY29udHJpYi9hcHBlbmdpbmUucHlQSwECFAMUAAAAAAAAACEALqVxjX4RAAB+EQAARAAAAAAAAAAAAAAAAABWvzUAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL2NvbnRyaWIvbnRsbXBvb2wucHlQSwECFAMUAAAAAAAAACEA8yq2cfo7AAD6OwAARQAAAAAAAAAAAAAAAAA20TUAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL2NvbnRyaWIvcHlvcGVuc3NsLnB5UEsBAhQDFAAAAAAAAAAhAOdTwPMldwAAJXcAAEsAAAAAAAAAAAAAAAAAkw02AHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9jb250cmliL3NlY3VyZXRyYW5zcG9ydC5weVBLAQIUAxQAAAAAAAAAIQDQUymZMxgAADMYAABBAAAAAAAAAAAAAAAAACGFNgBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvY29udHJpYi9zb2Nrcy5weVBLAQIUAxQAAAAAAAAAIQDymskDyxkAAMsZAAA+AAAAAAAAAAAAAAAAALOdNgBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvZXhjZXB0aW9ucy5weVBLAQIUAxQAAAAAAAAAIQABOYyyNxcAADcXAAA6AAAAAAAAAAAAAAAAANq3NgBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvZmllbGRzLnB5UEsBAhQDFAAAAAAAAAAhANdd0BcRCQAAEQkAADwAAAAAAAAAAAAAAAAAac82AHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9maWxlcG9zdC5weVBLAQIUAxQAAAAAAAAAIQCPXaB8bQAAAG0AAABFAAAAAAAAAAAAAAAAANTYNgBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvcGFja2FnZXMvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAAAAAAAAAAAAAAAAATwAAAAAAAAAAAAAAAACk2TYAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL3BhY2thZ2VzL2JhY2twb3J0cy9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQBSVxy5tQUAALUFAABPAAAAAAAAAAAAAAAAABHaNgBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvcGFja2FnZXMvYmFja3BvcnRzL21ha2VmaWxlLnB5UEsBAhQDFAAAAAAAAAAhAEbBpmfnIgAA5yIAAEkAAAAAAAAAAAAAAAAAM+A2AHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9wYWNrYWdlcy9vcmRlcmVkX2RpY3QucHlQSwECFAMUAAAAAAAAACEAmVhNWpJ1AACSdQAAQAAAAAAAAAAAAAAAAACBAzcAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL3BhY2thZ2VzL3NpeC5weVBLAQIUAxQAAAAAAAAAIQD7bcrlsAIAALACAABYAAAAAAAAAAAAAAAAAHF5NwBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvcGFja2FnZXMvc3NsX21hdGNoX2hvc3RuYW1lL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhALU6jytGFgAARhYAAF8AAAAAAAAAAAAAAAAAl3w3AHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9wYWNrYWdlcy9zc2xfbWF0Y2hfaG9zdG5hbWUvX2ltcGxlbWVudGF0aW9uLnB5UEsBAhQDFAAAAAAAAAAhAPCuGJLZPwAA2T8AAD8AAAAAAAAAAAAAAAAAWpM3AHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9wb29sbWFuYWdlci5weVBLAQIUAxQAAAAAAAAAIQDKMeTEOhcAADoXAAA7AAAAAAAAAAAAAAAAAJDTNwBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvcmVxdWVzdC5weVBLAQIUAxQAAAAAAAAAIQA/SoJhd1kAAHdZAAA8AAAAAAAAAAAAAAAAACPrNwBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvcmVzcG9uc2UucHlQSwECFAMUAAAAAAAAACEAUnXhvxQEAAAUBAAAQQAAAAAAAAAAAAAAAAD0RDgAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL3V0aWwvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAq59fPY0QAACNEAAAQwAAAAAAAAAAAAAAAABnSTgAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL3V0aWwvY29ubmVjdGlvbi5weVBLAQIUAxQAAAAAAAAAIQBBYZDXeQ4AAHkOAABAAAAAAAAAAAAAAAAAAFVaOABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvdXRpbC9yZXF1ZXN0LnB5UEsBAhQDFAAAAAAAAAAhAPQ5HJ8nCQAAJwkAAEEAAAAAAAAAAAAAAAAALGk4AHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy91dGlsL3Jlc3BvbnNlLnB5UEsBAhQDFAAAAAAAAAAhAD1h79sJOQAACTkAAD4AAAAAAAAAAAAAAAAAsnI4AHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy91dGlsL3JldHJ5LnB5UEsBAhQDFAAAAAAAAAAhAH3POz2bUgAAm1IAAEIAAAAAAAAAAAAAAAAAF6w4AHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy91dGlsL3NlbGVjdG9ycy5weVBLAQIUAxQAAAAAAAAAIQDV78iisC8AALAvAAA9AAAAAAAAAAAAAAAAABL/OABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvdXRpbC9zc2xfLnB5UEsBAhQDFAAAAAAAAAAhAFVSziAdJgAAHSYAAEAAAAAAAAAAAAAAAAAAHS85AHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy91dGlsL3RpbWVvdXQucHlQSwECFAMUAAAAAAAAACEAwx5tEVcZAABXGQAAPAAAAAAAAAAAAAAAAACYVTkAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL3V0aWwvdXJsLnB5UEsBAhQDFAAAAAAAAAAhALY8I/yrBQAAqwUAAD0AAAAAAAAAAAAAAAAASW85AHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy91dGlsL3dhaXQucHlQSwECFAMUAAAAAAAAACEAb8GhOFApAABQKQAAQQAAAAAAAAAAAAAAAABPdTkAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci93ZWJlbmNvZGluZ3MvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAx60IixMjAAATIwAAPwAAAAAAAAAAAAAAAAD+njkAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci93ZWJlbmNvZGluZ3MvbGFiZWxzLnB5UEsBAhQDFAAAAAAAAAAhAFB/MR8ZBQAAGQUAAEEAAAAAAAAAAAAAAAAAbsI5AHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3Ivd2ViZW5jb2RpbmdzL21rbGFiZWxzLnB5UEsBAhQDFAAAAAAAAAAhABabPh2iGQAAohkAAD4AAAAAAAAAAAAAAAAA5sc5AHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3Ivd2ViZW5jb2RpbmdzL3Rlc3RzLnB5UEsBAhQDFAAAAAAAAAAhAEhvRb7SEAAA0hAAAEcAAAAAAAAAAAAAAAAA5OE5AHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3Ivd2ViZW5jb2RpbmdzL3hfdXNlcl9kZWZpbmVkLnB5UEsBAhQDFAAAAAAAAAAhAIIYi/WGLgAAhi4AAC8AAAAAAAAAAAAAAAAAG/M5AHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL2Jhc2Vjb21tYW5kLnB5UEsBAhQDFAAAAAAAAAAhAKur/jvhKAAA4SgAAC4AAAAAAAAAAAAAAAAA7iE6AHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL2Jhc2VwYXJzZXIucHlQSwECFAMUAAAAAAAAACEAS5kyIVpAAABaQAAALgAAAAAAAAAAAAAAAAAbSzoAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvY21kb3B0aW9ucy5weVBLAQIUAxQAAAAAAAAAIQCQDYdDxAgAAMQIAAA1AAAAAAAAAAAAAAAAAMGLOgBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9jb21tYW5kcy9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQAdYTtfZgUAAGYFAAAyAAAAAAAAAAAAAAAAANiUOgBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9jb21tYW5kcy9jaGVjay5weVBLAQIUAxQAAAAAAAAAIQAwwcyzlQkAAJUJAAA3AAAAAAAAAAAAAAAAAI6aOgBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9jb21tYW5kcy9jb21wbGV0aW9uLnB5UEsBAhQDFAAAAAAAAAAhANkemaaCHgAAgh4AADUAAAAAAAAAAAAAAAAAeKQ6AHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL2NvbW1hbmRzL2Rvd25sb2FkLnB5UEsBAhQDFAAAAAAAAAAhAMP282ATCwAAEwsAADMAAAAAAAAAAAAAAAAATcM6AHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL2NvbW1hbmRzL2ZyZWV6ZS5weVBLAQIUAxQAAAAAAAAAIQD4ieykPQYAAD0GAAAxAAAAAAAAAAAAAAAAALHOOgBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9jb21tYW5kcy9oYXNoLnB5UEsBAhQDFAAAAAAAAAAhAB4W0J3WAwAA1gMAADEAAAAAAAAAAAAAAAAAPdU6AHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL2NvbW1hbmRzL2hlbHAucHlQSwECFAMUAAAAAAAAACEASyWGFgREAAAERAAANAAAAAAAAAAAAAAAAABi2ToAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvY29tbWFuZHMvaW5zdGFsbC5weVBLAQIUAxQAAAAAAAAAIQAPS8c4aSwAAGksAAAxAAAAAAAAAAAAAAAAALgdOwBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9jb21tYW5kcy9saXN0LnB5UEsBAhQDFAAAAAAAAAAhAK5ChNyWEQAAlhEAADMAAAAAAAAAAAAAAAAAcEo7AHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL2NvbW1hbmRzL3NlYXJjaC5weVBLAQIUAxQAAAAAAAAAIQAMUx8kAxcAAAMXAAAxAAAAAAAAAAAAAAAAAFdcOwBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9jb21tYW5kcy9zaG93LnB5UEsBAhQDFAAAAAAAAAAhAKuJGT9ECwAARAsAADYAAAAAAAAAAAAAAAAAqXM7AHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL2NvbW1hbmRzL3VuaW5zdGFsbC5weVBLAQIUAxQAAAAAAAAAIQCXN3PmMR4AADEeAAAyAAAAAAAAAAAAAAAAAEF/OwBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9jb21tYW5kcy93aGVlbC5weVBLAQIUAxQAAAAAAAAAIQCZJ6lxQBIAAEASAAAzAAAAAAAAAAAAAAAAAMKdOwBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9jb21wYXQvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAgqKllzhaAAA4WgAANQAAAAAAAAAAAAAAAABTsDsAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvY29tcGF0L2RpY3Rjb25maWcucHlQSwECFAMUAAAAAAAAACEA/T8pUZl9AACZfQAALAAAAAAAAAAAAAAAAADeCjwAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvZG93bmxvYWQucHlQSwECFAMUAAAAAAAAACEAvnqWmLkfAAC5HwAALgAAAAAAAAAAAAAAAADBiDwAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvZXhjZXB0aW9ucy5weVBLAQIUAxQAAAAAAAAAIQA2+CX/DpwAAA6cAAApAAAAAAAAAAAAAAAAAMaoPABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9pbmRleC5weVBLAQIUAxQAAAAAAAAAIQC3D3eZ+hUAAPoVAAAtAAAAAAAAAAAAAAAAABtFPQBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9sb2NhdGlvbnMucHlQSwECFAMUAAAAAAAAACEAqhpnvEcAAABHAAAAMwAAAAAAAAAAAAAAAABgWz0AcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvbW9kZWxzL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAGhOMm3nAQAA5wEAADAAAAAAAAAAAAAAAAAA+Fs9AHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL21vZGVscy9pbmRleC5weVBLAQIUAxQAAAAAAAAAIQAAAAAAAAAAAAAAAAA3AAAAAAAAAAAAAAAAAC1ePQBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9vcGVyYXRpb25zL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAM9lYqg2BgAANgYAADQAAAAAAAAAAAAAAAAAgl49AHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL29wZXJhdGlvbnMvY2hlY2sucHlQSwECFAMUAAAAAAAAACEA+SIzM0oUAABKFAAANQAAAAAAAAAAAAAAAAAKZT0AcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvb3BlcmF0aW9ucy9mcmVlemUucHlQSwECFAMUAAAAAAAAACEA+iiEteQqAADkKgAALgAAAAAAAAAAAAAAAACneT0AcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvcGVwNDI1dGFncy5weVBLAQIUAxQAAAAAAAAAIQBcadIZFAEAABQBAAAwAAAAAAAAAAAAAAAAANekPQBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9yZXEvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAHOCMCpYuAACWLgAAMAAAAAAAAAAAAAAAAAA5pj0AcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvcmVxL3JlcV9maWxlLnB5UEsBAhQDFAAAAAAAAAAhAIFtVcOXtQAAl7UAADMAAAAAAAAAAAAAAAAAHdU9AHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL3JlcS9yZXFfaW5zdGFsbC5weVBLAQIUAxQAAAAAAAAAIQAS3ZJ2noYAAJ6GAAAvAAAAAAAAAAAAAAAAAAWLPgBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9yZXEvcmVxX3NldC5weVBLAQIUAxQAAAAAAAAAIQAFRsRw8RoAAPEaAAA1AAAAAAAAAAAAAAAAAPARPwBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9yZXEvcmVxX3VuaW5zdGFsbC5weVBLAQIUAxQAAAAAAAAAIQDbrHf2nAAAAJwAAAAwAAAAAAAAAAAAAAAAADQtPwBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC9zdGF0dXNfY29kZXMucHlQSwECFAMUAAAAAAAAACEA4Fq0vjNqAAAzagAAMgAAAAAAAAAAAAAAAAAeLj8AcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvdXRpbHMvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEANQreO2siAABrIgAAMQAAAAAAAAAAAAAAAAChmD8AcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvdXRpbHMvYXBwZGlycy5weVBLAQIUAxQAAAAAAAAAIQDNDE0uIAUAACAFAAAvAAAAAAAAAAAAAAAAAFu7PwBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC91dGlscy9idWlsZC5weVBLAQIUAxQAAAAAAAAAIQBxHmokuAgAALgIAAA1AAAAAAAAAAAAAAAAAMjAPwBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC91dGlscy9kZXByZWNhdGlvbi5weVBLAQIUAxQAAAAAAAAAIQC9Wj+wywMAAMsDAAAyAAAAAAAAAAAAAAAAANPJPwBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC91dGlscy9lbmNvZGluZy5weVBLAQIUAxQAAAAAAAAAIQDyQ+3AgwMAAIMDAAA0AAAAAAAAAAAAAAAAAO7NPwBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC91dGlscy9maWxlc3lzdGVtLnB5UEsBAhQDFAAAAAAAAAAhACA3BXR7CwAAewsAAC8AAAAAAAAAAAAAAAAAw9E/AHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL3V0aWxzL2dsaWJjLnB5UEsBAhQDFAAAAAAAAAAhAKk06QQyCwAAMgsAADAAAAAAAAAAAAAAAAAAi90/AHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL3V0aWxzL2hhc2hlcy5weVBLAQIUAxQAAAAAAAAAIQBnJtd4/wwAAP8MAAAxAAAAAAAAAAAAAAAAAAvpPwBwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC91dGlscy9sb2dnaW5nLnB5UEsBAhQDFAAAAAAAAAAhAEhU2OpPFQAATxUAADIAAAAAAAAAAAAAAAAAWfY/AHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL3V0aWxzL291dGRhdGVkLnB5UEsBAhQDFAAAAAAAAAAhAA3mkrggCAAAIAgAADMAAAAAAAAAAAAAAAAA+AtAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL3V0aWxzL3BhY2thZ2luZy5weVBLAQIUAxQAAAAAAAAAIQAWovJKFgEAABYBAAA6AAAAAAAAAAAAAAAAAGkUQABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC91dGlscy9zZXR1cHRvb2xzX2J1aWxkLnB5UEsBAhQDFAAAAAAAAAAhAOXikJVNLQAATS0AACwAAAAAAAAAAAAAAAAA1xVAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL3V0aWxzL3VpLnB5UEsBAhQDFAAAAAAAAAAhAMhWxUtWMAAAVjAAADAAAAAAAAAAAAAAAAAAbkNAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL3Zjcy9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQD7wMzF2w4AANsOAAAuAAAAAAAAAAAAAAAAABJ0QABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC92Y3MvYmF6YWFyLnB5UEsBAhQDFAAAAAAAAAAhACi+3jC9KwAAvSsAACsAAAAAAAAAAAAAAAAAOYNAAHBpcHRvb2xfZGVwc19weXBpX19waXBfOV8wXzMvcGlwL3Zjcy9naXQucHlQSwECFAMUAAAAAAAAACEAeWJqHZANAACQDQAAMQAAAAAAAAAAAAAAAAA/r0AAcGlwdG9vbF9kZXBzX3B5cGlfX3BpcF85XzBfMy9waXAvdmNzL21lcmN1cmlhbC5weVBLAQIUAxQAAAAAAAAAIQBuNJVBhiQAAIYkAAAyAAAAAAAAAAAAAAAAAB69QABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC92Y3Mvc3VidmVyc2lvbi5weVBLAQIUAxQAAAAAAAAAIQB9mSA7Cn0AAAp9AAApAAAAAAAAAAAAAAAAAPThQABwaXB0b29sX2RlcHNfcHlwaV9fcGlwXzlfMF8zL3BpcC93aGVlbC5weVBLAQIUAxQAAAAAAAAAIQAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAEVfQQBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAXE+6RX4AAAB+AAAANAAAAAAAAAAAAAAAAACTX0EAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL2Vhc3lfaW5zdGFsbC5weVBLAQIUAxQAAAAAAAAAIQAcbLJPPacBAD2nAQA+AAAAAAAAAAAAAAAAAGNgQQBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvcGtnX3Jlc291cmNlcy9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQAAAAAAAAAAAAAAAABGAAAAAAAAAAAAAAAAAPwHQwBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvcGtnX3Jlc291cmNlcy9fdmVuZG9yL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAIbzYdR9YAAAfWAAAEUAAAAAAAAAAAAAAAAAYAhDAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9wa2dfcmVzb3VyY2VzL192ZW5kb3IvYXBwZGlycy5weVBLAQIUAxQAAAAAAAAAIQA8KVjG0AIAANACAABRAAAAAAAAAAAAAAAAAEBpQwBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy9fX2Fib3V0X18ucHlQSwECFAMUAAAAAAAAACEAgXaWygECAAABAgAAUAAAAAAAAAAAAAAAAAB/bEMAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3BrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEA5mlK41wDAABcAwAATwAAAAAAAAAAAAAAAADubkMAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3BrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvX2NvbXBhdC5weVBLAQIUAxQAAAAAAAAAIQD6/aQSiAUAAIgFAABTAAAAAAAAAAAAAAAAALdyQwBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy9fc3RydWN0dXJlcy5weVBLAQIUAxQAAAAAAAAAIQAw+BPcOCAAADggAABPAAAAAAAAAAAAAAAAALB4QwBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy9tYXJrZXJzLnB5UEsBAhQDFAAAAAAAAAAhAKWGHdsDEQAAAxEAAFQAAAAAAAAAAAAAAAAAVZlDAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9wa2dfcmVzb3VyY2VzL192ZW5kb3IvcGFja2FnaW5nL3JlcXVpcmVtZW50cy5weVBLAQIUAxQAAAAAAAAAIQB8RYOMeW0AAHltAABSAAAAAAAAAAAAAAAAAMqqQwBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy9zcGVjaWZpZXJzLnB5UEsBAhQDFAAAAAAAAAAhAMXqJw+lAQAApQEAAE0AAAAAAAAAAAAAAAAAsxhEAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9wa2dfcmVzb3VyY2VzL192ZW5kb3IvcGFja2FnaW5nL3V0aWxzLnB5UEsBAhQDFAAAAAAAAAAhAA7vxqEkLQAAJC0AAE8AAAAAAAAAAAAAAAAAwxpEAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9wa2dfcmVzb3VyY2VzL192ZW5kb3IvcGFja2FnaW5nL3ZlcnNpb24ucHlQSwECFAMUAAAAAAAAACEAZg+EsXeKAwB3igMARwAAAAAAAAAAAAAAAABUSEQAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3BrZ19yZXNvdXJjZXMvX3ZlbmRvci9weXBhcnNpbmcucHlQSwECFAMUAAAAAAAAACEAmVhNWpJ1AACSdQAAQQAAAAAAAAAAAAAAAAAw00cAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3BrZ19yZXNvdXJjZXMvX3ZlbmRvci9zaXgucHlQSwECFAMUAAAAAAAAACEA853ywcIJAADCCQAARQAAAAAAAAAAAAAAAAAhSUgAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3BrZ19yZXNvdXJjZXMvZXh0ZXJuL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAIvAkkYuAgAALgIAAEAAAAAAAAAAAAAAAAAARlNIAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9wa2dfcmVzb3VyY2VzL3B5MzFjb21wYXQucHlQSwECFAMUAAAAAAAAACEAUNerBzYEAAA2BAAASAAAAAAAAAAAAAAAAADSVUgAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMtNDQuMC4wLmRpc3QtaW5mby9MSUNFTlNFUEsBAhQDFAAAAAAAAAAhADGQ3qB4DgAAeA4AAEkAAAAAAAAAAAAAAAAAblpIAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzLTQ0LjAuMC5kaXN0LWluZm8vTUVUQURBVEFQSwECFAMUAAAAAAAAACEAc8+JhSgjAAAoIwAARwAAAAAAAAAAAAAAAABNaUgAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMtNDQuMC4wLmRpc3QtaW5mby9SRUNPUkRQSwECFAMUAAAAAAAAACEAquBG9m4AAABuAAAARgAAAAAAAAAAAAAAAADajEgAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMtNDQuMC4wLmRpc3QtaW5mby9XSEVFTFBLAQIUAxQAAAAAAAAAIQA32V/d7wAAAO8AAABVAAAAAAAAAAAAAAAAAKyNSABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy00NC4wLjAuZGlzdC1pbmZvL2RlcGVuZGVuY3lfbGlua3MudHh0UEsBAhQDFAAAAAAAAAAhAKx1HwiGDAAAhgwAAFEAAAAAAAAAAAAAAAAADo9IAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzLTQ0LjAuMC5kaXN0LWluZm8vZW50cnlfcG9pbnRzLnR4dFBLAQIUAxQAAAAAAAAAIQAwXAGRJgAAACYAAABOAAAAAAAAAAAAAAAAAAOcSABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy00NC4wLjAuZGlzdC1pbmZvL3RvcF9sZXZlbC50eHRQSwECFAMUAAAAAAAAACEAkwbXMgEAAAABAAAASQAAAAAAAAAAAAAAAACVnEgAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMtNDQuMC4wLmRpc3QtaW5mby96aXAtc2FmZVBLAQIUAxQAAAAAAAAAIQDRwN/qcxwAAHMcAAA7AAAAAAAAAAAAAAAAAP2cSABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQAOrBJK2gAAANoAAABHAAAAAAAAAAAAAAAAAMm5SABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9fZGVwcmVjYXRpb25fd2FybmluZy5weVBLAQIUAxQAAAAAAAAAIQBbFESOrwgAAK8IAAA3AAAAAAAAAAAAAAAAAAi7SABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9faW1wLnB5UEsBAhQDFAAAAAAAAAAhAAAAAAAAAAAAAAAAAEMAAAAAAAAAAAAAAAAADMRIAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL192ZW5kb3IvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEARMMqAxo7AAAaOwAARgAAAAAAAAAAAAAAAABtxEgAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvX3ZlbmRvci9vcmRlcmVkX3NldC5weVBLAQIUAxQAAAAAAAAAIQCK13/Q6AIAAOgCAABOAAAAAAAAAAAAAAAAAOv/SABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9fdmVuZG9yL3BhY2thZ2luZy9fX2Fib3V0X18ucHlQSwECFAMUAAAAAAAAACEAZRsRRDICAAAyAgAATQAAAAAAAAAAAAAAAAA/A0kAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvX3ZlbmRvci9wYWNrYWdpbmcvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAZora42EDAABhAwAATAAAAAAAAAAAAAAAAADcBUkAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvX3ZlbmRvci9wYWNrYWdpbmcvX2NvbXBhdC5weVBLAQIUAxQAAAAAAAAAIQBrjxyViAUAAIgFAABQAAAAAAAAAAAAAAAAAKcJSQBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9fdmVuZG9yL3BhY2thZ2luZy9fc3RydWN0dXJlcy5weVBLAQIUAxQAAAAAAAAAIQAvOeKyTCAAAEwgAABMAAAAAAAAAAAAAAAAAJ0PSQBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9fdmVuZG9yL3BhY2thZ2luZy9tYXJrZXJzLnB5UEsBAhQDFAAAAAAAAAAhADj6V1yGEgAAhhIAAFEAAAAAAAAAAAAAAAAAUzBJAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL192ZW5kb3IvcGFja2FnaW5nL3JlcXVpcmVtZW50cy5weVBLAQIUAxQAAAAAAAAAIQDyiEbTgmwAAIJsAABPAAAAAAAAAAAAAAAAAEhDSQBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9fdmVuZG9yL3BhY2thZ2luZy9zcGVjaWZpZXJzLnB5UEsBAhQDFAAAAAAAAAAhAPP2h/+FMgAAhTIAAEkAAAAAAAAAAAAAAAAAN7BJAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL192ZW5kb3IvcGFja2FnaW5nL3RhZ3MucHlQSwECFAMUAAAAAAAAACEAYT2tnfAFAADwBQAASgAAAAAAAAAAAAAAAAAj40kAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvX3ZlbmRvci9wYWNrYWdpbmcvdXRpbHMucHlQSwECFAMUAAAAAAAAACEA8TNy68ouAADKLgAATAAAAAAAAAAAAAAAAAB76UkAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvX3ZlbmRvci9wYWNrYWdpbmcvdmVyc2lvbi5weVBLAQIUAxQAAAAAAAAAIQBmD4Sxd4oDAHeKAwBEAAAAAAAAAAAAAAAAAK8YSgBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9fdmVuZG9yL3B5cGFyc2luZy5weVBLAQIUAxQAAAAAAAAAIQCZWE1aknUAAJJ1AAA+AAAAAAAAAAAAAAAAAIijTQBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9fdmVuZG9yL3NpeC5weVBLAQIUAxQAAAAAAAAAIQClh2VRwBkAAMAZAAA/AAAAAAAAAAAAAAAAAHYZTgBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9hcmNoaXZlX3V0aWwucHlQSwECFAMUAAAAAAAAACEAxrWyY30lAAB9JQAAPQAAAAAAAAAAAAAAAACTM04AcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvYnVpbGRfbWV0YS5weVBLAQIUAxQAAAAAAAAAIQD1hnppAAABAAAAAQA6AAAAAAAAAAAAAAAAAGtZTgBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9jbGktMzIuZXhlUEsBAhQDFAAAAAAAAAAhAGJwztsAJAEAACQBADoAAAAAAAAAAAAAAAAAw1lPAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2NsaS02NC5leGVQSwECFAMUAAAAAAAAACEA9YZ6aQAAAQAAAAEANwAAAAAAAAAAAAAAAAAbflAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvY2xpLmV4ZVBLAQIUAxQAAAAAAAAAIQAW7xkFOAIAADgCAABDAAAAAAAAAAAAAAAAAHB+UQBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9jb21tYW5kL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAFD4I/J6CQAAegkAAEAAAAAAAAAAAAAAAAAACYFRAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2NvbW1hbmQvYWxpYXMucHlQSwECFAMUAAAAAAAAACEAnGw5MAlHAAAJRwAARAAAAAAAAAAAAAAAAADhilEAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvY29tbWFuZC9iZGlzdF9lZ2cucHlQSwECFAMUAAAAAAAAACEA69J0FuQFAADkBQAARAAAAAAAAAAAAAAAAABM0lEAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvY29tbWFuZC9iZGlzdF9ycG0ucHlQSwECFAMUAAAAAAAAACEAIIx1FH0CAAB9AgAASAAAAAAAAAAAAAAAAACS2FEAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvY29tbWFuZC9iZGlzdF93aW5pbnN0LnB5UEsBAhQDFAAAAAAAAAAhACcajRuEEQAAhBEAAEUAAAAAAAAAAAAAAAAAddtRAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2NvbW1hbmQvYnVpbGRfY2xpYi5weVBLAQIUAxQAAAAAAAAAIQCNKP1w2zIAANsyAABEAAAAAAAAAAAAAAAAAFztUQBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9jb21tYW5kL2J1aWxkX2V4dC5weVBLAQIUAxQAAAAAAAAAIQBARkLcfCUAAHwlAABDAAAAAAAAAAAAAAAAAJkgUgBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9jb21tYW5kL2J1aWxkX3B5LnB5UEsBAhQDFAAAAAAAAAAhANDN8z34HwAA+B8AAEIAAAAAAAAAAAAAAAAAdkZSAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2NvbW1hbmQvZGV2ZWxvcC5weVBLAQIUAxQAAAAAAAAAIQD/6PaRwAMAAMADAABEAAAAAAAAAAAAAAAAAM5mUgBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9jb21tYW5kL2Rpc3RfaW5mby5weVBLAQIUAxQAAAAAAAAAIQBWY5pF+FUBAPhVAQBHAAAAAAAAAAAAAAAAAPBqUgBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9jb21tYW5kL2Vhc3lfaW5zdGFsbC5weVBLAQIUAxQAAAAAAAAAIQAxifT24mMAAOJjAABDAAAAAAAAAAAAAAAAAE3BUwBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9jb21tYW5kL2VnZ19pbmZvLnB5UEsBAhQDFAAAAAAAAAAhAFBhEaxhEgAAYRIAAEIAAAAAAAAAAAAAAAAAkCVUAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2NvbW1hbmQvaW5zdGFsbC5weVBLAQIUAxQAAAAAAAAAIQBc0qjlmwgAAJsIAABLAAAAAAAAAAAAAAAAAFE4VABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9jb21tYW5kL2luc3RhbGxfZWdnX2luZm8ucHlQSwECFAMUAAAAAAAAACEAEtOMKhYPAAAWDwAARgAAAAAAAAAAAAAAAABVQVQAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvY29tbWFuZC9pbnN0YWxsX2xpYi5weVBLAQIUAxQAAAAAAAAAIQBGP/EehwkAAIcJAABKAAAAAAAAAAAAAAAAAM9QVABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9jb21tYW5kL2luc3RhbGxfc2NyaXB0cy5weVBLAQIUAxQAAAAAAAAAIQB9c2C/ehMAAHoTAABFAAAAAAAAAAAAAAAAAL5aVABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9jb21tYW5kL3B5MzZjb21wYXQucHlQSwECFAMUAAAAAAAAACEAdtLqtdQBAADUAQAAQwAAAAAAAAAAAAAAAACbblQAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvY29tbWFuZC9yZWdpc3Rlci5weVBLAQIUAxQAAAAAAAAAIQAZytSkdAgAAHQIAABBAAAAAAAAAAAAAAAAANBwVABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9jb21tYW5kL3JvdGF0ZS5weVBLAQIUAxQAAAAAAAAAIQAEgdY0kgIAAJICAABDAAAAAAAAAAAAAAAAAKN5VABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9jb21tYW5kL3NhdmVvcHRzLnB5UEsBAhQDFAAAAAAAAAAhAHCKNgeYHwAAmB8AAEAAAAAAAAAAAAAAAAAAlnxUAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2NvbW1hbmQvc2Rpc3QucHlQSwECFAMUAAAAAAAAACEAm3DLx90TAADdEwAAQQAAAAAAAAAAAAAAAACMnFQAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvY29tbWFuZC9zZXRvcHQucHlQSwECFAMUAAAAAAAAACEA3Zacz4IlAACCJQAAPwAAAAAAAAAAAAAAAADIsFQAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvY29tbWFuZC90ZXN0LnB5UEsBAhQDFAAAAAAAAAAhACIAXUvOAQAAzgEAAEEAAAAAAAAAAAAAAAAAp9ZUAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2NvbW1hbmQvdXBsb2FkLnB5UEsBAhQDFAAAAAAAAAAhAPKX88aPHAAAjxwAAEYAAAAAAAAAAAAAAAAA1NhUAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2NvbW1hbmQvdXBsb2FkX2RvY3MucHlQSwECFAMUAAAAAAAAACEATe/SU19QAABfUAAAOQAAAAAAAAAAAAAAAADH9VQAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvY29uZmlnLnB5UEsBAhQDFAAAAAAAAAAhABoiBDKnAwAApwMAADsAAAAAAAAAAAAAAAAAfUZVAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2RlcF91dGlsLnB5UEsBAhQDFAAAAAAAAAAhAP0ZWwqNFQAAjRUAADoAAAAAAAAAAAAAAAAAfUpVAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2RlcGVuZHMucHlQSwECFAMUAAAAAAAAACEAFfJflMHCAADBwgAANwAAAAAAAAAAAAAAAABiYFUAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvZGlzdC5weVBLAQIUAxQAAAAAAAAAIQC7/1HmDAIAAAwCAAA5AAAAAAAAAAAAAAAAAHgjVgBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9lcnJvcnMucHlQSwECFAMUAAAAAAAAACEAuaqR7sEGAADBBgAAPAAAAAAAAAAAAAAAAADbJVYAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvZXh0ZW5zaW9uLnB5UEsBAhQDFAAAAAAAAAAhAMckbJPSCQAA0gkAAEIAAAAAAAAAAAAAAAAA9ixWAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2V4dGVybi9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQCOyE9r3BMAANwTAAA3AAAAAAAAAAAAAAAAACg3VgBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9nbG9iLnB5UEsBAhQDFAAAAAAAAAAhABD5/CkAAAEAAAABADoAAAAAAAAAAAAAAAAAWUtWAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2d1aS0zMi5leGVQSwECFAMUAAAAAAAAACEA2A6r9AAmAQAAJgEAOgAAAAAAAAAAAAAAAACxS1cAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvZ3VpLTY0LmV4ZVBLAQIUAxQAAAAAAAAAIQAQ+fwpAAABAAAAAQA3AAAAAAAAAAAAAAAAAAlyWABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9ndWkuZXhlUEsBAhQDFAAAAAAAAAAhAIDdECfZFAAA2RQAADwAAAAAAAAAAAAAAAAAXnJZAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2luc3RhbGxlci5weVBLAQIUAxQAAAAAAAAAIQBk+X6bEwMAABMDAAA5AAAAAAAAAAAAAAAAAJGHWQBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9sYXVuY2gucHlQSwECFAMUAAAAAAAAACEAh1Hrot0HAADdBwAAPQAAAAAAAAAAAAAAAAD7ilkAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvbGliMnRvM19leC5weVBLAQIUAxQAAAAAAAAAIQAUY0jLkBQAAJAUAAA5AAAAAAAAAAAAAAAAADOTWQBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9tb25rZXkucHlQSwECFAMUAAAAAAAAACEAMqf8XJ+2AACftgAANwAAAAAAAAAAAAAAAAAaqFkAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvbXN2Yy5weVBLAQIUAxQAAAAAAAAAIQBjC+PWfwwAAH8MAAA9AAAAAAAAAAAAAAAAAA5fWgBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9uYW1lc3BhY2VzLnB5UEsBAhQDFAAAAAAAAAAhAJ4F2I2dngAAnZ4AAEAAAAAAAAAAAAAAAAAA6GtaAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL3BhY2thZ2VfaW5kZXgucHlQSwECFAMUAAAAAAAAACEA/gVE1NgFAADYBQAAPQAAAAAAAAAAAAAAAADjClsAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvcHkyN2NvbXBhdC5weVBLAQIUAxQAAAAAAAAAIQDeyzDiRgMAAEYDAAA9AAAAAAAAAAAAAAAAABYRWwBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9weTMxY29tcGF0LnB5UEsBAhQDFAAAAAAAAAAhAAdh2KIyBQAAMgUAAD0AAAAAAAAAAAAAAAAAtxRbAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL3B5MzNjb21wYXQucHlQSwECFAMUAAAAAAAAACEAjlbQRPUAAAD1AAAAPQAAAAAAAAAAAAAAAABEGlsAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvcHkzNGNvbXBhdC5weVBLAQIUAxQAAAAAAAAAIQCMU5pjxDcAAMQ3AAA6AAAAAAAAAAAAAAAAAJQbWwBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9zYW5kYm94LnB5UEsBAhQDFAAAAAAAAAAhAKgztL6KAAAAigAAADsAAAAAAAAAAAAAAAAAsFNbAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL3NjcmlwdC50bXBsUEsBAhQDFAAAAAAAAAAhAK0qgzb+CAAA/ggAAD0AAAAAAAAAAAAAAAAAk1RbAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL3NpdGUtcGF0Y2gucHlQSwECFAMUAAAAAAAAACEAzpU0ji0hAAAtIQAAPgAAAAAAAAAAAAAAAADsXVsAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvc3NsX3N1cHBvcnQucHlQSwECFAMUAAAAAAAAACEAmkLXmuQDAADkAwAAQAAAAAAAAAAAAAAAAAB1f1sAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvdW5pY29kZV91dGlscy5weVBLAQIUAxQAAAAAAAAAIQBIsUxikAAAAJAAAAA6AAAAAAAAAAAAAAAAALeDWwBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy92ZXJzaW9uLnB5UEsBAhQDFAAAAAAAAAAhALDFRYAHIQAAByEAADgAAAAAAAAAAAAAAAAAn4RbAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL3doZWVsLnB5UEsBAhQDFAAAAAAAAAAhAPnL7g3KAgAAygIAAEIAAAAAAAAAAAAAAAAA/KVbAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL3dpbmRvd3Nfc3VwcG9ydC5weVBLAQIUAxQAAAAAAAAAIQAAAAAAAAAAAAAAAAAtAAAAAAAAAAAAAAAAACapWwBwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAiDql1FUmAABVJgAASgAAAAAAAAAAAAAAAABxqVsAcGlwdG9vbF9kZXBzX3B5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsLTAuMzAuMGEwLmRpc3QtaW5mby9ERVNDUklQVElPTi5yc3RQSwECFAMUAAAAAAAAACEAcP+un2UEAABlBAAARgAAAAAAAAAAAAAAAAAu0FsAcGlwdG9vbF9kZXBzX3B5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsLTAuMzAuMGEwLmRpc3QtaW5mby9MSUNFTlNFLnR4dFBLAQIUAxQAAAAAAAAAIQBEbZmBDSsAAA0rAABDAAAAAAAAAAAAAAAAAPfUWwBwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwtMC4zMC4wYTAuZGlzdC1pbmZvL01FVEFEQVRBUEsBAhQDFAAAAAAAAAAhAKcPuxadDwAAnQ8AAEEAAAAAAAAAAAAAAAAAZQBcAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC0wLjMwLjBhMC5kaXN0LWluZm8vUkVDT1JEUEsBAhQDFAAAAAAAAAAhAJTflntxAAAAcQAAAEAAAAAAAAAAAAAAAAAAYRBcAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC0wLjMwLjBhMC5kaXN0LWluZm8vV0hFRUxQSwECFAMUAAAAAAAAACEA4kXfrG0AAABtAAAASwAAAAAAAAAAAAAAAAAwEVwAcGlwdG9vbF9kZXBzX3B5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsLTAuMzAuMGEwLmRpc3QtaW5mby9lbnRyeV9wb2ludHMudHh0UEsBAhQDFAAAAAAAAAAhAFKyTtZaBgAAWgYAAEgAAAAAAAAAAAAAAAAABhJcAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC0wLjMwLjBhMC5kaXN0LWluZm8vbWV0YWRhdGEuanNvblBLAQIUAxQAAAAAAAAAIQAZY95lBgAAAAYAAABIAAAAAAAAAAAAAAAAAMYYXABwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwtMC4zMC4wYTAuZGlzdC1pbmZvL3RvcF9sZXZlbC50eHRQSwECFAMUAAAAAAAAACEAYTelR2MAAABjAAAAMwAAAAAAAAAAAAAAAAAyGVwAcGlwdG9vbF9kZXBzX3B5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhACRpt1SgAQAAoAEAADMAAAAAAAAAAAAAAAAA5hlcAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC9fX21haW5fXy5weVBLAQIUAxQAAAAAAAAAIQAgU4JSxwgAAMcIAAAyAAAAAAAAAAAAAAAAANcbXABwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvYXJjaGl2ZS5weVBLAQIUAxQAAAAAAAAAIQBKryTR6EcAAOhHAAA2AAAAAAAAAAAAAAAAAO4kXABwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvYmRpc3Rfd2hlZWwucHlQSwECFAMUAAAAAAAAACEAo3lSdx0CAAAdAgAANAAAAAAAAAAAAAAAAAAqbVwAcGlwdG9vbF9kZXBzX3B5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL2RlY29yYXRvci5weVBLAQIUAxQAAAAAAAAAIQDTYQ8k0wsAANMLAAA0AAAAAAAAAAAAAAAAAJlvXABwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvZWdnMndoZWVsLnB5UEsBAhQDFAAAAAAAAAAhABAk8jO6CQAAugkAADQAAAAAAAAAAAAAAAAAvntcAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC9lZ2duYW1lcy50eHRQSwECFAMUAAAAAAAAACEAsby59rJGAACyRgAAMgAAAAAAAAAAAAAAAADKhVwAcGlwdG9vbF9kZXBzX3B5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL2luc3RhbGwucHlQSwECFAMUAAAAAAAAACEAOSh3C5wtAACcLQAAMwAAAAAAAAAAAAAAAADMzFwAcGlwdG9vbF9kZXBzX3B5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL21ldGFkYXRhLnB5UEsBAhQDFAAAAAAAAAAhAGH2NdJqBAAAagQAADAAAAAAAAAAAAAAAAAAufpcAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC9wYXRocy5weVBLAQIUAxQAAAAAAAAAIQBrYlZ8xRYAAMUWAAA1AAAAAAAAAAAAAAAAAHH/XABwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvcGVwNDI1dGFncy5weVBLAQIUAxQAAAAAAAAAIQCAQxigyQQAAMkEAAAyAAAAAAAAAAAAAAAAAIkWXQBwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvcGtnaW5mby5weVBLAQIUAxQAAAAAAAAAIQD8TOZMww4AAMMOAAA+AAAAAAAAAAAAAAAAAKIbXQBwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvc2lnbmF0dXJlcy9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQD8UP/gYxoAAGMaAAA7AAAAAAAAAAAAAAAAAMEqXQBwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvc2lnbmF0dXJlcy9kamJlYy5weVBLAQIUAxQAAAAAAAAAIQBMASU+nwYAAJ8GAAA/AAAAAAAAAAAAAAAAAH1FXQBwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvc2lnbmF0dXJlcy9lZDI1NTE5cHkucHlQSwECFAMUAAAAAAAAACEA29viLfQMAAD0DAAAOgAAAAAAAAAAAAAAAAB5TF0AcGlwdG9vbF9kZXBzX3B5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3NpZ25hdHVyZXMva2V5cy5weVBLAQIUAxQAAAAAAAAAIQD/nmVwAQAAAAEAAAA4AAAAAAAAAAAAAAAAAMVZXQBwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQAAAAAAAAAAAAAAAABFAAAAAAAAAAAAAAAAABxaXQBwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC9jb21wbGV4LWRpc3QvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAShdH0hcAAAAXAAAAUQAAAAAAAAAAAAAAAAB/Wl0AcGlwdG9vbF9kZXBzX3B5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3QvY29tcGxleC1kaXN0L2NvbXBsZXhkaXN0L19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhABwKFzhXAwAAVwMAAEIAAAAAAAAAAAAAAAAABVtdAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L2NvbXBsZXgtZGlzdC9zZXR1cC5weVBLAQIUAxQAAAAAAAAAIQAoSxhlmQYAAJkGAAA4AAAAAAAAAAAAAAAAALxeXQBwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC9jb25mdGVzdC5weVBLAQIUAxQAAAAAAAAAIQAAAAAAAAAAAAAAAABHAAAAAAAAAAAAAAAAAKtlXQBwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC9leHRlbnNpb24uZGlzdC9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQBfhsxPyAEAAMgBAABEAAAAAAAAAAAAAAAAABBmXQBwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC9leHRlbnNpb24uZGlzdC9zZXR1cC5weVBLAQIUAxQAAAAAAAAAIQAAAAAAAAAAAAAAAABFAAAAAAAAAAAAAAAAADpoXQBwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC9oZWFkZXJzLmRpc3QvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAAAAAAAAAAAAAAAAAQgAAAAAAAAAAAAAAAACdaF0AcGlwdG9vbF9kZXBzX3B5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3QvaGVhZGVycy5kaXN0L2hlYWRlci5oUEsBAhQDFAAAAAAAAAAhAAAAAAAAAAAAAAAAAEgAAAAAAAAAAAAAAAAA/WhdAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L2hlYWRlcnMuZGlzdC9oZWFkZXJzZGlzdC5weVBLAQIUAxQAAAAAAAAAIQCZxCcsRAEAAEQBAABCAAAAAAAAAAAAAAAAAGNpXQBwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC9oZWFkZXJzLmRpc3Qvc2V0dXAucHlQSwECFAMUAAAAAAAAACEAaj7d19ssAADbLAAAPwAAAAAAAAAAAAAAAAAHa10AcGlwdG9vbF9kZXBzX3B5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3QvcHlkaXN0LXNjaGVtYS5qc29uUEsBAhQDFAAAAAAAAAAhAAAAAAAAAAAAAAAAAEQAAAAAAAAAAAAAAAAAP5hdAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L3NpbXBsZS5kaXN0L19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhANNNBKN/AQAAfwEAAEEAAAAAAAAAAAAAAAAAoZhdAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L3NpbXBsZS5kaXN0L3NldHVwLnB5UEsBAhQDFAAAAAAAAAAhAAAAAAAAAAAAAAAAAE8AAAAAAAAAAAAAAAAAf5pdAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L3NpbXBsZS5kaXN0L3NpbXBsZWRpc3QvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAduBM+moUAABqFAAATAAAAAAAAAAAAAAAAADsml0AcGlwdG9vbF9kZXBzX3B5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3QvdGVzdC0xLjAtcHkyLnB5My1ub25lLXdpbjMyLndobFBLAQIUAxQAAAAAAAAAIQA4K+8RbRkAAG0ZAAA6AAAAAAAAAAAAAAAAAMCvXQBwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC90ZXN0X2Jhc2ljLnB5UEsBAhQDFAAAAAAAAAAhAG0Esr5KBwAASgcAADwAAAAAAAAAAAAAAAAAhcldAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L3Rlc3RfaW5zdGFsbC5weVBLAQIUAxQAAAAAAAAAIQD3YR+TDwoAAA8KAAA5AAAAAAAAAAAAAAAAACnRXQBwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC90ZXN0X2tleXMucHlQSwECFAMUAAAAAAAAACEAYlh0Y6wAAACsAAAAOgAAAAAAAAAAAAAAAACP210AcGlwdG9vbF9kZXBzX3B5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3QvdGVzdF9wYXRocy5weVBLAQIUAxQAAAAAAAAAIQBtljH52AUAANgFAAA8AAAAAAAAAAAAAAAAAJPcXQBwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC90ZXN0X3JhbmtpbmcucHlQSwECFAMUAAAAAAAAACEApCl/MWAEAABgBAAAPwAAAAAAAAAAAAAAAADF4l0AcGlwdG9vbF9kZXBzX3B5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3QvdGVzdF9zaWduYXR1cmVzLnB5UEsBAhQDFAAAAAAAAAAhAJxXQvAnFwAAJxcAADsAAAAAAAAAAAAAAAAAguddAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L3Rlc3RfdGFnb3B0LnB5UEsBAhQDFAAAAAAAAAAhANQ+H1aQAgAAkAIAADkAAAAAAAAAAAAAAAAAAv9dAHBpcHRvb2xfZGVwc19weXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L3Rlc3RfdG9vbC5weVBLAQIUAxQAAAAAAAAAIQBFYkRM6REAAOkRAAA+AAAAAAAAAAAAAAAAAOkBXgBwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC90ZXN0X3doZWVsZmlsZS5weVBLAQIUAxQAAAAAAAAAIQCjLQMXoTMAAKEzAAA4AAAAAAAAAAAAAAAAAC4UXgBwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdG9vbC9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQDP2DOyGhMAABoTAAAvAAAAAAAAAAAAAAAAACVIXgBwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdXRpbC5weVBLAQIUAxQAAAAAAAAAIQDztOQotx4AALceAAA4AAAAAAAAAAAAAAAAAIxbXgBwaXB0b29sX2RlcHNfcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvd2luaW5zdDJ3aGVlbC5weVBLAQIUAxQAAAAAAAAAIQAAAAAAAAAAAAAAAAAiAAAAAAAAAAAAAAAAAJl6XgBydWxlc19weXRob24vcGFja2FnaW5nL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAFiAErM9MgAAPTIAAB4AAAAAAAAAAAAAAAAA2XpeAHJ1bGVzX3B5dGhvbi9wYWNrYWdpbmcvcGlwdG9vbFBLAQIUAxQAAAAAAAAAIQAAAHmVGSAAABkgAAAhAAAAAAAAAAAAAAAAAFKtXgBydWxlc19weXRob24vcGFja2FnaW5nL3BpcHRvb2wucHlQSwECFAMUAAAAAAAAACEA5rtpdiccAAAnHAAAHQAAAAAAAAAAAAAAAACqzV4AcnVsZXNfcHl0aG9uL3BhY2thZ2luZy93aGwucHlQSwECFAMUAAAAAAAAACEAAAAAAAAAAAAAAAAAEgAAAAAAAAAAAAAAAAAM6l4Ac3VicGFyL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAAAAAAAAAAAAAAAAABoAAAAAAAAAAAAAAAAAPOpeAHN1YnBhci9ydW50aW1lL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAI+gczy3LgAAty4AABkAAAAAAAAAAAAAAAAAdOpeAHN1YnBhci9ydW50aW1lL3N1cHBvcnQucHlQSwUGAAAAAMABwAEWvAAAYhlfAAAA